XP 스크립트

  테스트용으로 예전에 해 본 것입니다.  손댄 것이라고는 해도 문자셋 추가 정도입니다.  한글 문자셋은 조합입력 루틴이 없는 더미로, 그냥 이런 식으로 문자셋 추가가 가능함을 보여주는 예시입니다.(물론 마음같아서는 모 씨의 한글이름 입력기의 조합입력 부분을 도입하고 싶지만 실력이 안 되어서...)  원본이 어떻게 작동하는 지 궁금하다면 http://avangs.info/255902에 첨부되어 있는 데모를 받아서 실행시켜 보기 바랍니다.


# Advanced Enter Hero Name Window
# by RPG Advocate


#==============================================================================
# ** Window_NameEdit
#------------------------------------------------------------------------------
#  This window is used to edit your name on the input name screen.
#==============================================================================

class Window_NameEdit < Window_Base
  #--------------------------------------------------------------------------
  # * Public Instance Variables
  #--------------------------------------------------------------------------
  attr_accessor :char_type                # character type
  #--------------------------------------------------------------------------
  # * Object Initialization
  #     actor    : actor
  #     max_char : maximum number of characters
  #--------------------------------------------------------------------------
  def initialize(actor, max_char)
    super(0, 0, 640, 128)
    self.contents = Bitmap.new(width - 32, height - 32)
    @actor = actor
    @name = actor.name
    @max_char = max_char
    @char_type = []
    # Fit name within maximum number of characters
    name_array = @name.split(//)[0...@max_char]
    @name = ""
    for i in 0...name_array.size
      @name += name_array[i]
      @char_type[i] = 1
    end
    @default_name = @name
    @index = name_array.size
    refresh
    update_cursor_rect
  end
  #--------------------------------------------------------------------------
  # * Return to Default Name
  #--------------------------------------------------------------------------
  def restore_default
    @name = @default_name
    for i in 0..@default_name.size
       @char_type[i] = 1
    end
    @index = @name.split(//).size
    refresh
    update_cursor_rect
  end
  #--------------------------------------------------------------------------
  # * Refresh
  #--------------------------------------------------------------------------
  def refresh
    self.contents.clear
    # Draw name
    name_array = @name.split(//)
    for i in 0...@max_char
      c = name_array[i]
      if c == nil
        c = "_"
      end
      x = 320 - @max_char * 14 + i * 28
      if @char_type[i] == 1 or @char_type[i] == 5
        self.contents.font.name = "Arial"
        self.contents.font.size = 24
      elsif @char_type[i] == 2 or @char_type[i] == 3
        self.contents.font.name = ["MS Pゴシック",'MS PGothic']
        self.contents.font.size = 22
      else
        self.contents.font.name = ["굴림",'Gulim']
        self.contents.font.size = 22
      end
      self.contents.draw_text(x, 32, 28, 32, c, 1)
    end
    # Draw graphic
    draw_actor_graphic(@actor, 320 - @max_char * 14 - 40, 80)
  end
end



#==============================================================================
# ** Window_NameInput
#------------------------------------------------------------------------------
#  This window is used to select text characters on the input name screen.
#==============================================================================

class Window_NameInput < Window_Base
  #--------------------------------------------------------------------------
  # * Public Instance Variables
  #--------------------------------------------------------------------------
  attr_accessor :mode
  #--------------------------------------------------------------------------
  # * CONSTANTS
  #--------------------------------------------------------------------------
  ENGLISH_TABLE =
  [
    "A","B","C","D","E",
    "F","G","H","I","J",
    "K","L","M","N","O",
    "P","Q","R","S","T",
    "U","V","W","X","Y",
    "Z","","IJ","Ç","Ñ",
    "0","1","2","3","4",
    "5", "6" ,"7", "8" ,"9",
    "","","","","",
    "a", "b" ,"c", "d" ,"e",
    "f","g","h","i","j",
    "k","l","m","n","o",
    "p","q","r","s","t",
    "u","v","w","x","y",
    "z","","ij","ç","ñ",
    ".",",","?","!","/",
    "\\","<",">",";",":",
    "","", "" , "" , "" ,
    "@","#","$","%","^",
    "&","*","(",")","",
    "[","]","'","\"","~",
    "","","","","",
    "","","","","",
    "","","","","",
    "","","","","",
    "", "" ,"", "" ,"",
    "","","","","",
  ]
  HIRAGANA_TABLE =
  [
    "あ","い","う","え","お",
    "か","き","く","け","こ",
    "さ","し","す","せ","そ",
    "た","ち","つ","て","と",
    "な","に","ぬ","ね","の",
    "は","ひ","ふ","へ","ほ",
    "ま","み","む","め","も",
    "や", "" ,"ゆ", "" ,"よ",
    "ら","り","る","れ","ろ",
    "わ", "" ,"を", "" ,"ん",
    "が","ぎ","ぐ","げ","ご",
    "ざ","じ","ず","ぜ","ぞ",
    "だ","ぢ","づ","で","ど",
    "ば","び","ぶ","べ","ぼ",
    "ぱ","ぴ","ぷ","ぺ","ぽ",
    "ゃ","ゅ","ょ","っ","ゎ",
    "ぁ","ぃ","ぅ","ぇ","ぉ",
    "ー","・", "" , "" , "" ,
    "","","","","",
    "","","","","",
    "","","","","",
    "","","","","",
    "","","","","",
    "","","","","",
    "","","","","",
    "","","","","",
    "","","","","",
    "","","","","",
  ]
  KATAKANA_TABLE =
  [
    "ア","イ","ウ","エ","オ",
    "カ","キ","ク","ケ","コ",
    "サ","シ","ス","セ","ソ",
    "タ","チ","ツ","テ","ト",
    "ナ","ニ","ヌ","ネ","ノ",
    "ハ","ヒ","フ","ヘ","ホ",
    "マ","ミ","ム","メ","モ",
    "ヤ", "" ,"ユ", "" ,"ヨ",
    "ラ","リ","ル","レ","ロ",
    "ワ", "" ,"ヲ", "" ,"ン",
    "ガ","ギ","グ","ゲ","ゴ",
    "ザ","ジ","ズ","ゼ","ゾ",
    "ダ","ヂ","ヅ","デ","ド",
    "バ","ビ","ブ","ベ","ボ",
    "パ","ピ","プ","ペ","ポ",
    "ャ","ュ","ョ","ッ","ヮ",
    "ァ","ィ","ゥ","ェ","ォ",
    "ー","・","ヴ", "" , "" ,
    "","","","","",
    "","","","","",
    "","","","","",
    "","","","","",
    "","","","","",
    "","","","","",
    "","","","","",
    "","","","","",
    "","","","","",
    "","","","","",
  ]
  HANGUL_TABLE =
  [
    "ㄱ","ㄴ","ㄷ","ㄹ","ㅁ",
    "ㅂ","ㅅ","ㅇ","ㅈ","ㅊ",
    "ㅋ","ㅌ","ㅍ","ㅎ","",
    "ㄲ","ㄸ","ㅃ","ㅆ","ㅉ",
    "","","","","",
    "","","","","",
    "","","","","",
    "","","","","",
    "","","","","",
    "ㅏ","ㅑ","ㅓ","ㅕ","ㅗ",
    "ㅛ", "ㅜ" ,"ㅠ", "ㅡ" ,"ㅣ",
    "ㅐ","ㅔ","ㅒ","ㅖ","",
    "","","","","",
    "","","","","",
    "","","","","",
    "","","","","",
    "","","","","",
    "","","","","",
    "","","","","",
    "","","","","",
    "","","","","",
    "","","","","",
    "","","","","",
    "","","","","",
    "","","","","",
    "","","","","",
    "","","","","",
  ]
  ETC_LATIN_LETTER_TABLE= #May require Unicode typeset
  [
    'À','È','Ì','Ò','Ù',
    'Á','É','Í','Ó','Ú',
    'Â','Ê','Î','Ô','Û',
    'Ä','Ë','Ï','Ö','Ü',
    'Ā','Ē','Ī','Ō','Ū',
    'Ă','Ĕ','Ĭ','Ŏ','Ŭ',
    'Ǎ','Ě','Ǐ','Ǒ','Ǔ',
    'Ã','Ẽ','Ĩ','Õ','Ũ',
    "","","","","",
    'à','è','ì','ò','ù',
    'á','é','í','ó','ú',
    'â','ê','î','ô','û',
    'ä','ë','ï','ö','ü',
    'ā','ē','ī','ō','ū',
    'ă','ĕ','ĭ','ŏ','ŭ',
    'ǎ','ě','ǐ','ǒ','ǔ',
    'ã','ẽ','ĩ','õ','ũ',
    "","","","","",
    'Å','Æ','Œ','Ø','Ÿ',
    'å','æ','œ','ø','ÿ',
    'Ő','Ű','Č','Ð','Đ',
    'ő','ű','č','ð','đ',
    "Ş","Ł","Ř","Š","Ž",
    "ş","ł","ř","š","ž",
    "","","","","",
    "","","","","",
    "","","","","¿",
  ]
  #--------------------------------------------------------------------------
  # * Object Initialization
  #--------------------------------------------------------------------------
  def initialize
    super(160, 128, 480, 352)
    self.contents = Bitmap.new(width - 32, height - 32)
    self.active = false
    @index = -1
    @mode = 1
    refresh
    update_cursor_rect
  end
  #--------------------------------------------------------------------------
  # * Set Cursor Position
  #     index : new cursor position
  #--------------------------------------------------------------------------
  def index=(value)
    @index = value
    update_cursor_rect
  end
  #--------------------------------------------------------------------------
  # * Set Character Type
  #--------------------------------------------------------------------------
  def character
    if @mode == 1
      return ENGLISH_TABLE[@index]
    elsif @mode == 2
      return HIRAGANA_TABLE[@index]
    elsif @mode == 3
      return KATAKANA_TABLE[@index]
    elsif @mode == 4
      return HANGUL_TABLE[@index]
    else
      return ETC_LATIN_LETTER_TABLE[@index]
    end
  end
  #--------------------------------------------------------------------------
  # * Refresh
  #--------------------------------------------------------------------------
  def refresh
    self.contents.clear
    for i in 0..134
      x = 4 + i / 5 / 9 * 152 + i % 5 * 28
      y = i / 5 % 9 * 32
      if @mode == 1
        self.contents.font.name = "Arial"
        self.contents.font.size = 24
        self.contents.draw_text(x, y, 28, 32, ENGLISH_TABLE[i], 1)
      elsif @mode == 2
        self.contents.font.name = ["MS Pゴシック",'MS PGothic']
        self.contents.font.size = 22
        self.contents.draw_text(x, y, 28, 32, HIRAGANA_TABLE[i], 1)
      elsif @mode == 3
        self.contents.font.name = ["MS Pゴシック",'MS PGothic']
        self.contents.font.size = 22
        self.contents.draw_text(x, y, 28, 32, KATAKANA_TABLE[i], 1)
      elsif @mode == 4
        self.contents.font.name = ["굴림",'Gulim']
        self.contents.font.size = 22
        self.contents.draw_text(x, y, 28, 32, HANGUL_TABLE[i], 1)
      else
        self.contents.font.name = "Arial"
        self.contents.font.size = 24
        self.contents.draw_text(x, y, 28, 32, ETC_LATIN_LETTER_TABLE[i], 1)
      end
    end
  end
  #--------------------------------------------------------------------------
  # * Update Cursor Rectangle
  #--------------------------------------------------------------------------
  def update_cursor_rect
    if self.active == false
      self.cursor_rect.empty
    else
      x = 4 + @index / 5 / 9 * 152 + @index % 5 * 28
      y = @index / 5 % 9 * 32
      self.cursor_rect.set(x, y, 28, 32)
    end
  end
  #--------------------------------------------------------------------------
  # * Frame Update
  #--------------------------------------------------------------------------
  def update
    super
    if @index >= 0 && @index <= 134
      if Input.repeat?(Input::RIGHT)
        $game_system.se_play($data_system.cursor_se)
          if @index % 5 == 4
            if @index < 94
              @index += 41
            end
          else
            @index += 1
          end
        end
      if Input.repeat?(Input::LEFT)
        $game_system.se_play($data_system.cursor_se)
          if @index % 5 == 0
            if @index < 45
              self.active = false
              @index = -999
              return
            else
              @index -= 41
            end
          else
            @index -= 1
          end
      end
      if Input.repeat?(Input::DOWN)
        $game_system.se_play($data_system.cursor_se)
        if @index % 45 < 40
          @index += 5
        end
      end
      if Input.repeat?(Input::UP)
        if Input.trigger?(Input::UP) or @index % 45 >= 5
          $game_system.se_play($data_system.cursor_se)
          if @index % 45 >= 5
            @index -= 5
          end
        end
      end
    end
    update_cursor_rect
  end
end



#==============================================================================
# ** Window_NameCommand
#------------------------------------------------------------------------------
#  This window is used to choose the font on the input name screen.
#==============================================================================

class Window_NameCommand < Window_Command
  #--------------------------------------------------------------------------
  # * Refresh
  #--------------------------------------------------------------------------
  def refresh
    self.contents.clear
    for i in 0...@item_max
      if i == 1 or i == 2
        font = 1
        self.contents.font.name = ["MS Pゴシック",'MS PGothic']
        self.contents.font.size = 22
      elsif i == 3
        font = 2
        self.contents.font.name = ["굴림",'Gulim']
        self.contents.font.size = 22
      else
        font = 0
        self.contents.font.name = "Arial"
        self.contents.font.size = 24      
      end
      draw_item(i, normal_color, font)
    end
  end
  #--------------------------------------------------------------------------
  # * Draw Item
  #     index : item number
  #     color : text color
  #     f     : character fontname
  #--------------------------------------------------------------------------
  def draw_item(index, color, f)
    if f == 0
      self.contents.font.color = color
      self.contents.font.name = "Arial"
      self.contents.font.size = 24
    elsif f == 1
      self.contents.font.name = ["MS Pゴシック",'MS PGothic']
      self.contents.font.size = 22
    else
      self.contents.font.name = ["굴림",'Gulim']
      self.contents.font.size = 22
    end
    rect = Rect.new(4, 32 * index, self.contents.width - 8, 32)
    self.contents.fill_rect(rect, Color.new(0, 0, 0, 0))
    self.contents.draw_text(rect, @commands[index])
  end
end



#==============================================================================
# ** Scene_Name
#------------------------------------------------------------------------------
#  This class performs name input screen processing.
#==============================================================================

class Scene_Name
  #--------------------------------------------------------------------------
  # * Main Processing
  #--------------------------------------------------------------------------
  def main
    # Get actor
    @actor = $game_actors[$game_temp.name_actor_id]
    # Make windows
    @edit_window = Window_NameEdit.new(@actor, $game_temp.name_max_char)
    @input_window = Window_NameInput.new
    @alert_window = Window_Base.new(188, 208, 264, 64)
    @alert_window.contents = Bitmap.new(228, 32)
    @alert_window.contents.font.name = "Arial"
    @alert_window.contents.font.size = 24
    @alert_window.contents.draw_text(0, 0, 228, 32, "You must enter a name.")
    @alert_window.z = 1001
    @alert_window.visible = false
    c1 = "English"
    c2 = "ひらがな"
    c3 = "カタカナ"
    c4 = "한글"
    c5 = "Etc"
    c6 = "Space"
    c7 = "Backspace"
    c8 = "Default"
    c9 = "Done"
    commands = [c1, c2, c3, c4, c5, c6, c7, c8, c9]
    @command_window = Window_NameCommand.new(160, commands)
    @input_window.active = false
    @input_window.visible = true
    @command_window.index = 0
    @command_window.visible = true
    @command_window.active = true
    @command_window.x = 0
    @command_window.y = 128
    @command_window.z = 1000
    @alert_count = 0
    # Execute transition
    Graphics.transition
    # Main loop
    loop do
      # Update game screen
      Graphics.update
      # Update input information
      Input.update
      # Frame update
      update
      # Abort loop if screen is changed
      if $scene != self
        break
      end
    end    
    # Prepare for transition
    Graphics.freeze
    # Dispose of windows
    @edit_window.dispose
    @input_window.dispose
    @command_window.dispose
    @alert_window.dispose
  end
  #--------------------------------------------------------------------------
  # * Frame Update
  #--------------------------------------------------------------------------
  def update
    # Update windows
    @edit_window.update
    @input_window.update
    @command_window.update
    @alert_window.update
    if @alert_window.visible == true && @alert_count > 0
      @alert_count -= 1
      if @alert_count <= 0
        @command_window.active = true
        @alert_window.visible = false
      end
      return
    end
    if @input_window.active == false
      @command_window.active = true
    end
    if @command_window.active == false
      @input_window.active = true
    end
    if Input.repeat?(Input::B) && @input_window.active == true
      if @edit_window.index == 0
        return
      else
        $game_system.se_play($data_system.cancel_se)
        @edit_window.back
      end
    end
    if Input.repeat?(Input::B) && @command_window.active == true
      $game_system.se_play($data_system.buzzer_se)
      return
    end
    if Input.trigger?(Input::C)
      if @command_window.active == true
        case @command_window.index
        when 0 #Latin Alphabet and Numbers
          $game_system.se_play($data_system.decision_se)
          @input_window.mode = 1
          @input_window.refresh
          @command_window.active = false
          @input_window.active = true
          @input_window.index = 0
          return
        when 1 #Japanese Hiragana
          $game_system.se_play($data_system.decision_se)
          @input_window.mode = 2
          @input_window.refresh
          @command_window.active = false
          @input_window.active = true
          @input_window.index = 0
          return
        when 2 #Japanese Katakana
          $game_system.se_play($data_system.decision_se)
          @input_window.mode = 3
          @input_window.refresh
          @command_window.active = false
          @input_window.active = true
          @input_window.index = 0
          return
        when 3 #Korean
          $game_system.se_play($data_system.decision_se)
          @input_window.mode = 4
          @input_window.refresh
          @command_window.active = false
          @input_window.active = true
          @input_window.index = 0
          return
        when 4 #Latin Alphabet with Diacritics and other
          $game_system.se_play($data_system.decision_se)
          @input_window.mode = 5
          @input_window.refresh
          @command_window.active = false
          @input_window.active = true
          @input_window.index = 0
          return
        when 5
          if @edit_window.index < $game_temp.name_max_char
            $game_system.se_play($data_system.decision_se)
            @edit_window.add(" ")
          else
            $game_system.se_play($data_system.buzzer_se)
          end
          return
        when 6
          $game_system.se_play($data_system.decision_se)
          @edit_window.back
          return
        when 7
          $game_system.se_play($data_system.decision_se)
          @edit_window.restore_default
          return
        when 8
          if @edit_window.name == ""
            $game_system.se_play($data_system.buzzer_se)
            @alert_window.visible = true
            @command_window.active = false
            @alert_count = 60
            return
          end
          $game_system.se_play($data_system.decision_se)
          @actor.name = @edit_window.name
          $game_system.se_play($data_system.decision_se)
          $scene = Scene_Map.new
          return
        end
      end
      if @edit_window.index == $game_temp.name_max_char && 
         @input_window.active == true
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      if @input_window.character == "" && @input_window.active == true
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      if @input_window.character != nil && @input_window.active == true &&
         @edit_window.index <= $game_temp.name_max_char
        $game_system.se_play($data_system.decision_se)
        if @input_window.mode == 1
          @edit_window.char_type[@edit_window.index] = 1
        else
          @edit_window.char_type[@edit_window.index] = 2
        end
        @edit_window.add(@input_window.character)
      end
      return
    end
  end
end







List of Articles
번호 분류 제목 글쓴이 날짜 조회 수
공지 스크립트 자료 게시물 작성시 주의사항 습작 2012.12.24 6153
10 이름입력 한글조합입력기(영어가능) file 조규진1 2019.11.10 491
» 이름입력 RPG Advocate의 이름 입력 스크립트를 약간 손댄 것 Alkaid 2012.01.28 2784
8 이름입력 한글 이름 입력 15 ok하승헌 2010.02.18 4487
7 이름입력 Keyboard-Controlled Name Input Script by BlueScope@rmxp.org 1 file 백호 2009.02.22 1769
6 이름입력 한글이름 입력기 스크립트 14 백호 2009.02.22 4205
5 이름입력 영어 이름 입력기 2 백호 2009.02.22 1335
4 이름입력 Advanced Enter Hero Name Window by RPG Advocate 백호 2009.02.22 1168
3 이름입력 이름입력스크립트 ps인간 2009.01.23 3632
2 이름입력 대화창에 얼굴, 이름 띄우기 37 킬라롯 2008.11.09 7496
1 이름입력 케릭터 위에 또는 NPC 위에 이름 뛰우기 [헬악이님 제공] 49 file 아방스 2007.11.09 6405
Board Pagination Prev 1 Next
/ 1