kone
sub_icon

소미소프트

VXA 스크립트) ▼ 素材(Materials) ## 한영이름 입력 스크립트.rb

2026-04-20 12:17:22
유틸
조회 8520 · 좋아요 7
양식
<div>
    <table><tbody><tr><th colspan="2"><p style="margin: 0.5rem 0px; display: flex; justify-content: center; align-items: center;">=</p></th></tr><tr><td colspan="2"><p style="margin: 0.5rem 0px; display: flex; justify-content: center; align-items: center;">=</p></td></tr><tr><td><p style="margin: 0.5rem 0px; display: flex; justify-content: center; align-items: center;">=</p></td><td><p style="margin: 0.5rem 0px;">=</p></td></tr><tr><td><p style="margin: 0.5rem 0px; display: flex; justify-content: center; align-items: center;">=</p></td><td><p style="margin: 0.5rem 0px;">=</p></td></tr><tr><td><p style="margin: 0.5rem 0px; display: flex; justify-content: center; align-items: center;">=</p></td><td><p style="margin: 0.5rem 0px;">=</p></td></tr><tr><th colspan="2"><p style="margin: 0.5rem 0px; display: flex; justify-content: center; align-items: center;">=</p></th></tr><tr><td colspan="2"><p style="margin: 0.5rem 0px; display: flex; justify-content: center; align-items: center;">=</p></td></tr><tr><th colspan="2"><p style="margin: 0.5rem 0px; display: flex; justify-content: center; align-items: center;">=</p></th></tr><tr><td colspan="2"><p style="margin: 0.5rem 0px; display: flex; justify-content: center; align-items: center;">=</p></td></tr></tbody></table>
</div>

▼ 素材(Materials) ## 한영이름 입력 스크립트.rb

순정

기존 스크립트는 한글만 가능해서 그록이랑 만듬

스크립트
#==============================================================================
# ■ VX Ace 한영 이름 입력 스크립트 (결과창 가로 중앙 정렬 버전)
#------------------------------------------------------------------------------
# 원본: TeamHusH / Heircoss
# 수정: 결과창도 가로 중앙 정렬 + OK 89번 + 두 창 붙임
#==============================================================================

class Window_NameEdit < Window_Base
  # 한글 조합 로직 (원본 그대로)
  CONSO = ["ㄱ","ㄲ","ㄳ","ㄴ","ㄵ","ㄶ","ㄷ","ㄸ","ㄹ","ㄺ","ㄻ","ㄼ","ㄽ","ㄾ","ㄿ","ㅀ","ㅁ","ㅂ","ㅃ","ㅄ","ㅅ","ㅆ","ㅇ","ㅈ","ㅉ","ㅊ","ㅋ","ㅌ","ㅍ","ㅎ"]
  HEAD = ["ㄱ","ㄲ","ㄴ","ㄷ","ㄸ","ㄹ","ㅁ","ㅂ","ㅃ","ㅅ","ㅆ","ㅇ","ㅈ","ㅉ","ㅊ","ㅋ","ㅌ","ㅍ","ㅎ"]
  TABLE = ["ㄱ","ㄲ","ㄳ","ㄴ","ㄵ","ㄶ","ㄷ","ㄹ","ㄺ","ㄻ","ㄼ","ㄽ","ㄾ","ㄿ","ㅀ","ㅁ","ㅂ","ㅄ","ㅅ","ㅆ","ㅇ","ㅈ","ㅊ","ㅋ","ㅌ","ㅍ","ㅎ"]
  TABLE_SIDE = ["ㄱ","ㄴ","ㄹ","ㅂ"]
  ANOTHER_TABLE_SIDE = [[nil,"ㅅ"],["ㅈ","ㅎ"],["ㄱ","ㅁ","ㅂ","ㅅ","ㅌ","ㅍ","ㅎ"],[nil,"ㅅ"]]
  VOWEL = ["ㅏ","ㅐ","ㅑ","ㅒ","ㅓ","ㅔ","ㅕ","ㅖ","ㅗ","ㅘ","ㅙ","ㅚ","ㅛ","ㅜ","ㅝ","ㅞ","ㅟ","ㅠ","ㅡ","ㅢ","ㅣ"]
  COM_VOWEL = ["ㅗ","ㅜ","ㅡ"]
  ANOTHER_COM_VOWEL = [["ㅏ","ㅐ","ㅣ"],["ㅓ","ㅔ","ㅣ"],["ㅣ"]]  

  attr_reader   :name, :index, :max_char

  def initialize(actor, max_char)
    # 가로 중앙 정렬 적용
    window_width = 368
    window_height = 128
    x = (Graphics.width - window_width) / 2
    y = 30   # ← 원하는 대로 Y값 조정 가능 (30이 현재 값)

    super(x, y, window_width, window_height)

    @actor = actor
    @prompt = []
    @max_char = max_char
    name_array = actor.name.split(//)[0...@max_char]
    @name = name_array.dup
    @default_name = name_array.dup
    @index = @name.size
    deactivate
    refresh
  end

  def restore_default
    @name = @default_name.dup
    @index = @name.size
    refresh
    return !@name.empty?
  end

  def add(ch)
    @prompt << ch
    refresh
  end 

  def back
    @prompt.empty? ? @name.pop : @prompt.pop
    refresh
  end 

  def face_width; 96; end
  def char_width
    text_size($game_system.japanese? ? "가가" : "AA").width 
  end

  def left
    name_center = (contents_width + face_width) / 2
    name_width = (@max_char + 1) * char_width
    [name_center - name_width / 2, contents_width - name_width].min
  end

  def item_rect(index)
    Rect.new(left + index * char_width, 36, char_width, line_height)
  end

  def underline_rect(index)
    rect = item_rect(index)
    rect.x += 1; rect.y += rect.height - 4; rect.width -= 2; rect.height = 2
    rect
  end

  def underline_color
    color = normal_color; color.alpha = 48; color
  end

  def draw_underline(index)
    contents.fill_rect(underline_rect(index), underline_color)
  end

  def draw_char(index)
    rect = item_rect(index); rect.x -= 1; rect.width += 4
    change_color(normal_color)
    draw_text(rect, @name[index] || "")
  end

  def refresh
    contents.clear
    draw_actor_face(@actor, 0, 0)

    count_text = "#{@name.size} / #{@max_char}"
    change_color(system_color)
    draw_text(4, 4, contents.width - 8, line_height, count_text, 2)
    change_color(normal_color)

    name = prompt_to_letter
    if @name.size == @max_char
      @prompt = []; name = ""; @index = @name.size - 1
    else
      @index = @name.size
    end

    for i in 0...@name.size
      self.contents.draw_text(item_rect(i), @name[i], 1)
    end
    self.contents.draw_text(item_rect(@name.size), name, 1)
    cursor_rect.set(item_rect(@index))
  end

  #==================== 한글 조합 로직 (원본 그대로) ====================
  def prompt_to_letter
    case @prompt.size
    when 0; return ""
    when 1; return @prompt[0]
    when 2; return first_phase
    when 3; return second_phase
    when 4; return third_phase
    when 5; return fourth_phase
    when 6; return fifth_phase
    end
  end

  def first_phase
    if CONSO.include?(@prompt[0])
      CONSO.include?(@prompt[1]) ? (c0, c1 = conso_plus_conso) : (return conso_plus_vowel)
    else
      c0, c1 = vowel_plus_vowel
    end
    c1.nil? ? c0 : (@name << @prompt.shift; @prompt[0])
  end

  def second_phase
    if CONSO.include?(@prompt[0])
      if CONSO.include?(@prompt[1])
        if CONSO.include?(@prompt[2])
          @name << conso_plus_conso(@prompt.shift, @prompt.shift)
        else
          @name << @prompt.shift
          return conso_plus_vowel
        end
      else
        TABLE.include?(@prompt[2]) ? (return conso_plus_vowel_plus_table) : begin
          c0, c1 = vowel_plus_vowel(@prompt[1], @prompt[2])
          c1.nil? ? conso_plus_vowel(@prompt[0],c0) : (@name << conso_plus_vowel(@prompt.shift, @prompt.shift))
        end
      end
    else
      @name << vowel_plus_vowel(@prompt.shift, @prompt.shift)
    end
    @prompt[0]
  end

  def third_phase
    if CONSO.include?(@prompt[2])
      if CONSO.include?(@prompt[3])
        c0, c1 = conso_plus_conso(@prompt[2], @prompt[3])
        c1.nil? ? conso_plus_vowel_plus_table(@prompt[0], @prompt[1], c0) : (@name << conso_plus_vowel_plus_table(@prompt.shift, @prompt.shift, @prompt.shift))
      else
        conso, vowel = @prompt.shift, @prompt.shift
        @name << conso_plus_vowel(conso, vowel)
        return conso_plus_vowel
      end
    else
      TABLE.include?(@prompt[3]) ? conso_plus_vowel_plus_table(@prompt[0], vowel_plus_vowel(@prompt[1], @prompt[2]), @prompt[3]) : begin
        conso = @prompt.shift
        vowel = vowel_plus_vowel(@prompt.shift, @prompt.shift)
        @name << conso_plus_vowel(conso, vowel)
      end
    end
    @prompt[0]
  end

  def fourth_phase
    if CONSO.include?(@prompt[4])
      if CONSO.include?(@prompt[2])
        conso = @prompt.shift; vowel = @prompt.shift
        table = conso_plus_conso(@prompt.shift,@prompt.shift)
        @name << conso_plus_vowel_plus_table(conso, vowel, table)
      else
        c0, c1 = conso_plus_conso(@prompt[3], @prompt[4])
        c1.nil? ? conso_plus_vowel_plus_table(@prompt[0], vowel_plus_vowel(@prompt[1], @prompt[2]), c0) : begin
          conso = @prompt.shift; vowel = vowel_plus_vowel(@prompt.shift, @prompt.shift); table = @prompt.shift
          @name << conso_plus_vowel_plus_table(conso, vowel, table)
        end
      end
    else
      @name << second_phase
      @prompt = @prompt[3..4]
      return first_phase
    end
    @prompt[0]
  end

  def fifth_phase
    if CONSO.include?(@prompt[5])
      conso = @prompt.shift
      vowel = vowel_plus_vowel(@prompt.shift, @prompt.shift)
      table = conso_plus_conso(@prompt.shift, @prompt.shift)
      @name << conso_plus_vowel_plus_table(conso, vowel, table)
    else
      @name << third_phase
      @prompt = @prompt[4..5]
      return first_phase
    end
    @prompt[0]
  end

  def conso_plus_conso(c0 = @prompt[0], c1 = @prompt[1])
    index0 = where?(TABLE_SIDE, c0)
    if index0 && (index1 = where?(ANOTHER_TABLE_SIDE[index0], c1))
      index0 = where?(CONSO, c0)
      CONSO[index0 + index1 + 1]
    else
      [c0, c1]
    end
  end

  def vowel_plus_vowel(c0 = @prompt[0], c1 = @prompt[1])
    index0 = where?(COM_VOWEL, c0)
    if index0 && (index1 = where?(ANOTHER_COM_VOWEL[index0], c1))
      index0 = where?(VOWEL, c0)
      VOWEL[index0 + index1 + 1]
    else
      [c0, c1]
    end
  end

  def conso_plus_vowel(c0 = @prompt[0], c1 = @prompt[1])
    index0 = where?(HEAD, c0)
    index1 = where?(VOWEL, c1)
    [44032 + (588 * index0) + (28 * index1)].pack('U*')
  end

  def conso_plus_vowel_plus_table(c0 = @prompt[0], c1 = @prompt[1], c2 = @prompt[2])
    index0 = where?(HEAD, c0)
    index1 = where?(VOWEL, c1)
    index2 = where?(TABLE, c2)
    [44032 + (588 * index0) + (28 * index1) + index2 + 1].pack('U*')
  end

  def where?(array, c)
    array.each_with_index { |item, i| return i if item == c }
    nil
  end
end

#==============================================================================
# ■ Window_NameInput (기존 그대로 유지)
#==============================================================================
class Window_NameInput < Window_Selectable
  KOREAN_TABLE = [
    'ㄱ','ㄴ','ㄷ','ㄹ','ㅁ', 'ㅛ','ㅕ','ㅑ','ㅐ','ㅔ',
    'ㅂ','ㅅ','ㅇ','ㅈ','ㅊ', 'ㅗ','ㅓ','ㅏ','ㅣ',' ',
    'ㅋ','ㅌ','ㅍ','ㅎ',' ', 'ㅠ','ㅜ','ㅡ',' ',' ',
    ' ',' ',' ',' ',' ', ' ',' ',' ',' ',' ',
    'ㄲ',' ','ㄸ',' ',' ', ' ',' ',' ','ㅒ','ㅖ',
    'ㅃ','ㅆ',' ','ㅉ', ' ', ' ',' ',' ',' ',' ',
    '0','1','2','3','4', '!','#','$','%','&',
    '5','6','7','8','9', '(',')','*','+','-',
    '/','=','@','<','>', ':',';',' ',' ','OK',
    ' ',' ',' ',' ',' ', ' ',' ',' ',' ',' '
  ]

  ENGLISH_TABLE = [
    'A','B','C','D','E', 'a','b','c','d','e',
    'F','G','H','I','J', 'f','g','h','i','j',
    'K','L','M','N','O', 'k','l','m','n','o',
    'P','Q','R','S','T', 'p','q','r','s','t',
    'U','V','W','X','Y', 'u','v','w','x','y',
    'Z','[',']','^','_', 'z','{','}','|','~',
    '0','1','2','3','4', '!','#','$','%','&',
    '5','6','7','8','9', '(',')','*','+','-',
    '/','=','@','<','>', ':',';',' ',' ','OK',
    ' ',' ',' ',' ',' ', ' ',' ',' ',' ',' '
  ]

  VER_LINE = 10
  HOR_LINE = 10
  CONFIRM = 89

  def initialize(edit_window)
    window_width = edit_window.width
    window_height = fitting_height(VER_LINE + 1)

    x = (Graphics.width - window_width) / 2
    y = edit_window.y + edit_window.height - 0   # 결과창 바로 아래 붙임

    super(x, y, window_width, window_height)

    @edit_window = edit_window
    @mode = :korean
    @index = 0
    refresh
    update_cursor
    activate
  end

  def current_table
    @mode == :korean ? KOREAN_TABLE : ENGLISH_TABLE
  end

  def character
    current_table[@index] || ""
  end

  def is_ok?
    @index == CONFIRM
  end 

  def item_rect(index)
    rect = Rect.new
    rect.x = index % HOR_LINE * 32 + (index % HOR_LINE / 5) * 16
    rect.y = index / HOR_LINE * line_height
    rect.width = 32
    rect.height = line_height
    rect
  end

  def refresh
    contents.clear
    for i in 0...current_table.size
      rect = item_rect(i)
      rect.x += 2
      rect.width -= 4
      contents.draw_text(rect, current_table[i], 1)
    end

    mode_text = @mode == :korean ? "Shift: 영문 모드" : "Shift: 한글 모드"
    contents.font.size = 18
    draw_text(12, contents.height - line_height - 12, contents.width - 24, line_height, mode_text, 2)
    contents.font.size = Font.default_size
  end 

  def update_cursor
    cursor_rect.set(item_rect(@index))
  end

  def process_handling
    return unless open? && active
    process_jump if Input.trigger?(:A)
    process_back if Input.repeat?(:B)
    process_ok   if Input.trigger?(:C)

    if Input.trigger?(:SHIFT)
      @mode = (@mode == :korean ? :english : :korean)
      Sound.play_cursor
      refresh
      update_cursor
    end
  end

  def cursor_down(wrap)
    if @index < VER_LINE * HOR_LINE - HOR_LINE
      @index += HOR_LINE
    elsif wrap
      @index -= VER_LINE * HOR_LINE - HOR_LINE
    end 
  end

  def cursor_up(wrap)
    if @index >= HOR_LINE
      @index -= HOR_LINE
    elsif wrap
      @index += VER_LINE * HOR_LINE - HOR_LINE
    end
  end 

  def cursor_right(wrap)
    if @index % HOR_LINE < (HOR_LINE - 1)
      @index += 1
    elsif wrap
      @index -= (HOR_LINE - 1)
    end
  end 

  def cursor_left(wrap)
    if @index % HOR_LINE > 0
      @index -= 1
    elsif wrap
      @index += (HOR_LINE - 1)
    end
  end 

  def process_jump
    if @index != CONFIRM
      @index = CONFIRM
      Sound.play_cursor
    end
  end

  def process_back
    Sound.play_cancel if @edit_window.back
  end

  def process_ok
    if is_ok?
      on_name_ok
    elsif !character.empty?
      on_name_add
    end
  end

  def on_name_add
    @edit_window.add(character) ? Sound.play_ok : Sound.play_buzzer
  end

  def on_name_ok
    if @edit_window.name.empty?
      @edit_window.restore_default ? Sound.play_ok : Sound.play_buzzer
    else
      Sound.play_ok
      call_ok_handler
    end
  end
end

#==============================================================================
# ■ Scene_Name
#==============================================================================
class Scene_Name < Scene_MenuBase
  def prepare(actor_id, max_char)
    @actor_id = actor_id
    @max_char = max_char
  end

  def start
    super
    @actor = $game_actors[@actor_id]
    @edit_window = Window_NameEdit.new(@actor, @max_char)
    @input_window = Window_NameInput.new(@edit_window)
    @input_window.set_handler(:ok, method(:on_input_ok))
  end

  def on_input_ok
    prompt = @edit_window.prompt_to_letter
    @actor.name = @edit_window.name.join + prompt
    return_scene
  end
end
7
댓글 1개
댓글 쓰기
0 / 500
던브 안 한 뇌가 던브를 해보려 하는데
질문
단또
05.26 1749 1
키오스크 애드블락 예외 설정해도 광고 뜨는거 원래 그런건가?
질문
teQe42
05.26 1432 0
ㅗㅜㅑ시니시스타 또 신박한 모드 발견
야짤
roomonfire
05.26 12908 39
혼욕탕씬 나오는 게임 있나?
질문
satam1212
05.26 2178 0
마나카 이거 해금한 스킬 어케 씀?
질문
으악아니야
05.26 954 0
추남&NTR 좋아하는 인간의 후기 겸 게임 추천 받기 (스포)
후기 및 공략
ptiosdgo
05.26 4332 12
태양의 오르골 언제나옴
일반
fjeif2
05.26 1034 0
unholy maiden seed of profanity모드 1.4
유틸
leessss25
05.26 1970 13
게임 심사가 왤케 오래걸리냐
일반
ksw112
05.26 1705 1
존재감 여동생 한달 버티기 퀘 보상 뭔가요?
질문
rice-eating
05.26 1820 0
[복구]섹타듀벨리 모드팩
유틸
continuereset
05.26 4997 20
의술사하면서 스토리보며 느낀점
일반
소하
05.26 1063 0
[그냥복구/본체없음] 배덕의 달콤함에 물든 마나카. 여기서 받은 모드팩
유틸
루파조아
05.26 2908 9
조이 플레이 쓰는데 어떡합?
질문
abc456
05.26 1920 -2
최근에 아오이짱 겜 재밌게했는데
질문
qwqqqq
05.26 1783 1
드래곤 콩키스타 < 이 겜 사람간의 임신은 없음?
질문
everywhere
05.26 1835 0
이런게임 있을까요?
질문
mkmkil
05.26 1539 1
[요청복구] [한국어자막판] 퇴마관 미야비의 음옥생환보고
소리
9ya
05.26 7433 54
[미번/번역요청]우리들! 성교육 위원회 만화판
동인
아돌
05.26 12230 30
마나카 질문 있음
질문
으악아니야
05.26 1909 0
[복구 요청] RJ01326857 음흉하고 한결같은 깡촌 오라버니와, 예스럽고 병약한 여동생 + Append 1~5
요청
napulnapul
05.26 1513 0
게임 제목 좀 찾아주세요
질문
kotori97
05.26 1047 0
포레스티아 공식 한글 설마 2.0인가
일반
tleni
05.26 2533 0
[단편](약깜놀) 자각몽 섹스로 귀신 제령시도 하는 이야기
창작
깡통기사
05.26 4999 44
시니시스타2 1.3 리볼의 육벽은 어떻게 부숴요?
질문
powwa
05.26 1144 0
여주가 점점 걸레 되는 게임 있나
질문
carahil
05.26 1646 1
(구매보급,번역요청) 챔버게임 1.1 업데이트
미번
12532748912
05.26 5752 23
[천재 퇴마사는 촉수요마 따위에 굴하지 않아]개조 진행 중..
작업현황
dmol2279
05.26 1721 5
[이미지번역]RJ01354109 에이전트 엘레나 이미지 번역
번역
ommkamb
05.26 33517 139
어떤 분의 댓글을 위한 작성 글(노모 관련인데 머리 아퍼지니 보시는 거 비추드림)
정보
지나가던허접a
05.26 2490 11