kone
sub_icon

소미소프트

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

2026-04-20 12:17:22
유틸
조회 8486 · 좋아요 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
[복구] 란스03 노모패치
유틸
imakotou
04.28 15618 28
REC 리듬게임 추가 MOD
유틸
kunarin
04.28 7364 12
MZ MV data 복호화 실행기
유틸
미요포
04.27 13457 38
90일, RJ01540816 한정 복호화 도구) RMMZ JSON 통합 복호화 도구.pyw + RJ01540816 복호화.7z
유틸
ㅇㅇ
04.27 6340 6
제품 코드 추출기, 제품 코드 중복 찾기
유틸
ㅇㅇ
04.27 6438 18
MMD 모션,음악 통팩 공유
유틸
pst0025
04.26 8771 56
(코이카츠) 솔O티엘 작가 프리셋 통팩 공유
유틸
pst0025
04.25 11937 73
(코이카츠) 에러난 파일 복구 및 빠진거 보완
유틸
pst0025
04.25 10488 31
RPG MV/MZ 치트 플러그인 웹 딸깍 설치 오픈
유틸
mrpls
04.25 11165 28
자동소미 해적판의 해적판 업데이트
유틸
스눕제이크
04.23 8165 12
RPG MV/MZ 안실시간 미리번역 업데이트
유틸
mrpls
04.23 7618 27
파일 구글 번역기) kr_tr_7.pyw
유틸
ㅇㅇ
04.22 12037 9
(코이카츠) - "큰거"
유틸
pst0025
04.22 15854 66
(코이카츠) 큰거 올리기 전에 작은거
유틸
pst0025
04.22 18733 62
(코이카츠) - 최신 프리셋 일부 공유 [v2]
유틸
pst0025
04.22 10716 45
마나카 모드들
유틸
kkkktrrr
04.22 16955 33
(코이카츠) - 최신 프리셋 일부 공유
유틸
pst0025
04.21 10554 48
유틸) RJ코드 이미지 검색 용 기능추가
유틸
ATTAA
04.20 11786 9
VXA 스크립트) ▼ 素材(Materials) ## 한영이름 입력 스크립트.rb
유틸
ㅇㅇ
04.20 8486 7
RPG MV/MZ 실시간 번역기 딸깍 설치 웹사이트 오픈 (2.3 번역 주위 짤림)
유틸
mrpls
04.19 33096 106
(코이카츠) - グラフ 통팩 공유
유틸
pst0025
04.19 22955 56
유틸)유저스크립트-썸네일&본문 이미지 허용/비허용
유틸
cloud67p
04.19 7548 4
RPG MV/MZ 실시간 번역기 1.10 (루나와 음욕의 함정 던전, 젬마4)
유틸
mrpls
04.18 24513 35
VX or VXA 풀스크린 스크립트) ## VX Fullscreen++ Multi-Monitor.rb + ## VXA Fullscreen++ Multi-Monitor v2.32.rb
유틸
ㅇㅇ
04.18 8919 5
[노모패치, AI] 한 번만이라도 좋으니까, 나랑 해줘!
유틸
soxocel777
04.17 15041 29
자동 소미 해적판의 해적판
유틸
스눕제이크
04.17 9317 9
[복구]SecretFlasher.VoicePack-Plus 마나카 음성모드 개인수정(로우튠 등)
유틸
leedi
04.16 13134 7
( 코이카츠 ) - Anna anon 씬카드 공유
유틸
pst0025
04.16 24103 63
자동소미 해적판 업데이트
유틸
buttercookie
04.16 9440 12
[요청복구]스타바운드 통팩 모드만[구버전, 2024.06.17)
유틸
liberty
04.15 9490 1