VX 스크립트

# ==============================================================================
# RPG Maker VX용 한글 조사(은/는, 이/가, 을/를, 과/와, 으로/로) 자동결정
# ==============================================================================
# 원출처: http://74.125.153.132/search?q=cache:N67N1rmUXYAJ:forum.rubykr.org/viewtopic.php%3Ft%3D5172+utf-8+%EC%A1%B0%EC
#        %82%AC&cd=2&hl=ko&ct=clnk&gl=kr (현재는 이 페이지는 삭제되었습니다.)
#
#        2006년 10월 27일자 superkdk(http://blog.superkdk.com/)님의 답글에
#        나오는 코드를 이용해 만들었습니다.
# ==============================================================================
# 스크립트내 사용일례     : "랄프".with_josa("과") => "랄프와"
#
# [ 이벤트 메시지내에서 세부사용방법 ]
#
#  ※ 아래에서 n은 1~999 사이의 번호입니다.
#
#  Actors[배우]:
#
#  /NS[n] => 은/는
#  /NT[n] => 이/가
#  /NO[n] => 을/를
#  /NA[n] => 와/과
#  /NU[n] => 으로/로
#
#  Classes[직업]:
#
#  /CS[n] => 은/는
#  /CT[n] => 이/가
#  /CO[n] => 을/를
#  /CA[n] => 와/과
#  /CU[n] => 으로/로
#
#  Actor's Classes[배우의 직업](n은 직업의 번호가 아닌 배우의 번호):
#
#  /DS[n] => 은/는
#  /DT[n] => 이/가
#  /DO[n] => 을/를
#  /DA[n] => 와/과
#  /DU[n] => 으로/로
#
#  Enemies[적]:
#
#  /ES[n] => 은/는
#  /ET[n] => 이/가
#  /EO[n] => 을/를
#  /EA[n] => 와/과
#  /EU[n] => 으로/로
#
#  Troops[적부대]:
#
#  /TS[n] => 은/는
#  /TT[n] => 이/가
#  /TO[n] => 을/를
#  /TA[n] => 와/과
#  /TU[n] => 으로/로
#
#  Skills[기술]:
#
#  /SS[n] => 은/는
#  /ST[n] => 이/가
#  /SO[n] => 을/를
#  /SA[n] => 와/과
#  /SU[n] => 으로/로
#
#  States[상태]:
#
#  /XS[n] => 은/는
#  /XT[n] => 이/가
#  /XO[n] => 을/를
#  /XA[n] => 와/과
#  /XU[n] => 으로/로
#
#  Weapons[무기]:
#
#  /WS[n] => 은/는
#  /WT[n] => 이/가
#  /WO[n] => 을/를
#  /WA[n] => 와/과
#  /WU[n] => 으로/로
#
#  Armors[갑옷]:
#
#  /AS[n] => 은/는
#  /AT[n] => 이/가
#  /AO[n] => 을/를
#  /AA[n] => 와/과
#  /AU[n] => 으로/로
#
#  Items[아이템]:
#
#  /IS[n] => 은/는
#  /IT[n] => 이/가
#  /IO[n] => 을/를
#  /IA[n] => 와/과
#  /IU[n] => 으로/로
#
# ==============================================================================
# 사용시 주의점:
#   아직 RPG Maker VX나 Ruby 언어에 익숙하지 않아 실수가 있을 수 있습니다.
#   개선하거나 버그수정을 하실 분은 주저하지 말고 원하는대로 고치도록 하세요.
#   마음대로 이용하시고, 출처를 밝히지 않으셔도 됩니다.
# ==============================================================================
class String
  # 한글 초성, 중성, 종성. (UTF-8 이어야 함)
  @@chosung = ['ㄱ', 'ㄲ', 'ㄴ', 'ㄷ', 'ㄸ', 'ㄹ', 'ㅁ', 'ㅂ', 'ㅃ', 'ㅅ', 'ㅆ', 'ㅇ', 'ㅈ', 'ㅉ', 'ㅊ', 'ㅋ', 'ㅌ', 'ㅍ', 'ㅎ']
  @@jungsung = ['ㅏ', 'ㅐ', 'ㅑ', 'ㅒ', 'ㅓ', 'ㅔ', 'ㅕ', 'ㅖ', 'ㅗ', 'ㅘ', 'ㅙ', 'ㅚ', 'ㅛ', 'ㅜ', 'ㅝ', 'ㅞ', 'ㅟ', 'ㅠ', 'ㅡ', 'ㅢ', 'ㅣ']
  @@jongsung = ['', 'ㄱ', 'ㄲ', 'ㄳ', 'ㄴ', 'ㄵ', 'ㄶ', 'ㄷ', 'ㄹ', 'ㄺ', 'ㄻ', 'ㄼ', 'ㄽ', 'ㄾ', 'ㄿ', 'ㅀ', 'ㅁ', 'ㅂ', 'ㅄ', 'ㅅ', 'ㅆ', 'ㅇ', 'ㅈ', 'ㅊ', 'ㅋ', 'ㅌ', 'ㅍ', 'ㅎ']
  @@josas = {'이' => '가', '은' => '는', '을' => '를', '과' => '와', '으로' => '로'}
 
  # UTF-8 형식의 문자열을 분해한다.
  def separate
    separated = []
   
    self.unpack('U*').each do |c|
      n = (c & 0xFFFF).to_i
     
      # 유니코드 2.0 한글의 범위 : AC00(가) ~ D7A3(힣)
      if n >= 0xAC00 && n <= 0xD7A3
        n = n - 0xAC00
        n1 = n / (21 * 28)  # 초성 : '가' ~ '깋' -> 'ㄱ'
        n = n % (21 * 28)  # '가' ~ '깋'에서의 순서
        n2 = n / 28;    # 중성
        n3 = n % 28;    # 종성
       
        separated << @@chosung[n1] << @@jungsung[n2] << @@jongsung[n3]
      else
        separated << c.to_a.pack('U')
      end
    end
   
    separated
  end

  # 조사를 추가한다.
  # @param josa 종성이 있을 경우의 조사
  def with_josa(josa)
    if separate.last =~ /[aeiou]/i || separate.last == ''
      self + @@josas[josa]
    else
      self + josa
    end
  end
end

class Window_Message < Window_Selectable
  #--------------------------------------------------------------------------
  # * Convert Special Characters
  #--------------------------------------------------------------------------
  alias prev_convert_special_characters convert_special_characters
  def convert_special_characters
    prev_convert_special_characters
    # Actors
    @text.gsub!(/NS[([0-9]+)]/i) { $game_actors[$1.to_i].name.with_josa("은") }
    @text.gsub!(/NT[([0-9]+)]/i) { $game_actors[$1.to_i].name.with_josa("이") }
    @text.gsub!(/NO[([0-9]+)]/i) { $game_actors[$1.to_i].name.with_josa("을") }
    @text.gsub!(/NA[([0-9]+)]/i) { $game_actors[$1.to_i].name.with_josa("과") }
    @text.gsub!(/NU[([0-9]+)]/i) { $game_actors[$1.to_i].name.with_josa("으로") }
    # Classes
    @text.gsub!(/CS[([0-9]+)]/i) { $data_classes[$1.to_i].name.with_josa("은") }
    @text.gsub!(/CT[([0-9]+)]/i) { $data_classes[$1.to_i].name.with_josa("이") }
    @text.gsub!(/CO[([0-9]+)]/i) { $data_classes[$1.to_i].name.with_josa("을") }
    @text.gsub!(/CA[([0-9]+)]/i) { $data_classes[$1.to_i].name.with_josa("과") }
    @text.gsub!(/CU[([0-9]+)]/i) { $data_classes[$1.to_i].name.with_josa("으로") }
    # Actor's Classes
    @text.gsub!(/DS[([0-9]+)]/i) { $data_classes[$game_actors[$1.to_i].class_id].name.with_josa("은") }
    @text.gsub!(/DT[([0-9]+)]/i) { $data_classes[$game_actors[$1.to_i].class_id].name.with_josa("이") }
    @text.gsub!(/DO[([0-9]+)]/i) { $data_classes[$game_actors[$1.to_i].class_id].name.with_josa("을") }
    @text.gsub!(/DA[([0-9]+)]/i) { $data_classes[$game_actors[$1.to_i].class_id].name.with_josa("과") }
    @text.gsub!(/DU[([0-9]+)]/i) { $data_classes[$game_actors[$1.to_i].class_id].name.with_josa("으로") }
    # Enemy
    @text.gsub!(/ES[([0-9]+)]/i) { $data_enemies[$1.to_i].name.with_josa("은") }
    @text.gsub!(/ET[([0-9]+)]/i) { $data_enemies[$1.to_i].name.with_josa("이") }
    @text.gsub!(/EO[([0-9]+)]/i) { $data_enemies[$1.to_i].name.with_josa("을") }
    @text.gsub!(/EA[([0-9]+)]/i) { $data_enemies[$1.to_i].name.with_josa("과") }
    @text.gsub!(/EU[([0-9]+)]/i) { $data_enemies[$1.to_i].name.with_josa("으로") }
    # Skills
    @text.gsub!(/SS[([0-9]+)]/i) { $data_skills[$1.to_i].name.with_josa("은") }
    @text.gsub!(/ST[([0-9]+)]/i) { $data_skills[$1.to_i].name.with_josa("이") }
    @text.gsub!(/SO[([0-9]+)]/i) { $data_skills[$1.to_i].name.with_josa("을") }
    @text.gsub!(/SA[([0-9]+)]/i) { $data_skills[$1.to_i].name.with_josa("과") }
    @text.gsub!(/SU[([0-9]+)]/i) { $data_skills[$1.to_i].name.with_josa("으로") }
    # Items
    @text.gsub!(/IS[([0-9]+)]/i) { $data_items[$1.to_i].name.with_josa("은") }
    @text.gsub!(/IT[([0-9]+)]/i) { $data_items[$1.to_i].name.with_josa("이") }
    @text.gsub!(/IO[([0-9]+)]/i) { $data_items[$1.to_i].name.with_josa("을") }
    @text.gsub!(/IA[([0-9]+)]/i) { $data_items[$1.to_i].name.with_josa("과") }
    @text.gsub!(/IU[([0-9]+)]/i) { $data_items[$1.to_i].name.with_josa("으로") }
    # Weapons
    @text.gsub!(/WS[([0-9]+)]/i) { $data_weapons[$1.to_i].name.with_josa("은") }
    @text.gsub!(/WT[([0-9]+)]/i) { $data_weapons[$1.to_i].name.with_josa("이") }
    @text.gsub!(/WO[([0-9]+)]/i) { $data_weapons[$1.to_i].name.with_josa("을") }
    @text.gsub!(/WA[([0-9]+)]/i) { $data_weapons[$1.to_i].name.with_josa("과") }
    @text.gsub!(/WU[([0-9]+)]/i) { $data_weapons[$1.to_i].name.with_josa("으로") }
    # Armors
    @text.gsub!(/AS[([0-9]+)]/i) { $data_armors[$1.to_i].name.with_josa("은") }
    @text.gsub!(/AT[([0-9]+)]/i) { $data_armors[$1.to_i].name.with_josa("이") }
    @text.gsub!(/AO[([0-9]+)]/i) { $data_armors[$1.to_i].name.with_josa("을") }
    @text.gsub!(/AA[([0-9]+)]/i) { $data_armors[$1.to_i].name.with_josa("과") }
    @text.gsub!(/AU[([0-9]+)]/i) { $data_armors[$1.to_i].name.with_josa("으로") }
    # Troops
    @text.gsub!(/TS[([0-9]+)]/i) { $data_troops[$1.to_i].name.with_josa("은") }
    @text.gsub!(/TT[([0-9]+)]/i) { $data_troops[$1.to_i].name.with_josa("이") }
    @text.gsub!(/TO[([0-9]+)]/i) { $data_troops[$1.to_i].name.with_josa("을") }
    @text.gsub!(/TA[([0-9]+)]/i) { $data_troops[$1.to_i].name.with_josa("과") }
    @text.gsub!(/TU[([0-9]+)]/i) { $data_troops[$1.to_i].name.with_josa("으로") }
    # States
    @text.gsub!(/XS[([0-9]+)]/i) { $data_states[$1.to_i].name.with_josa("은") }
    @text.gsub!(/XT[([0-9]+)]/i) { $data_states[$1.to_i].name.with_josa("이") }
    @text.gsub!(/XO[([0-9]+)]/i) { $data_states[$1.to_i].name.with_josa("을") }
    @text.gsub!(/XA[([0-9]+)]/i) { $data_states[$1.to_i].name.with_josa("과") }
    @text.gsub!(/XU[([0-9]+)]/i) { $data_states[$1.to_i].name.with_josa("으로") }
  end
end

# =======================================================================================================================
# 일단 테스트를 위해 다음과 같이 값을 설정했습니다.
Example_01.jpg

# 1번은 모두 마지막 글자가 받침이 있는 것, 2번은 모두 마지막 글자가 받침이 없는 것, 3번은 숫자나 영문자로 끝나는 것으로
# 일례를 만든 뒤 다음 이벤트를 만들어 테스트했습니다.
Example_02.jpg 

# 문구가 참 유치하다는 생각을 저도 하긴 했지만(....), 아무튼 이 이벤트를 돌린 결과는 다음과 같습니다.

Example_03.jpg 

# ▲ 받침이 있는 것들

Example_04.jpg

# ▲ 받침이 없는 것들

Example_05.jpg

# ▲ 영문자/숫자 기타

# 영문자및 숫자의 경우에는 발음을 알수가 없어 조사가 제멋대로....이네요. 이건 방법이 없을지 모르겠지만,
# 아무튼 이정도면 한글을 쓰시는데 무리는 없을 거라고 믿고싶네요.

# 그럼 유용하게 쓰시길....

Comment '10'
  • ?
    Outlaw 2009.08.13 21:06

     심각하게 감사합니다!

  • ?
    시릴캣 2009.08.13 22:29

     참고로 말씀드리면, 스크립트 개발시에는 RPG Maker VX상에서 직접 코딩하셔도 되지만,
    좀 더 체계적으로 개발하고 싶으시다면 Ruby 언어 패키지와 EasyEclipse for Ruby and Rails 를 받아서 쓰셔도 좋을거에요.

    저는 루비 언어도 RPG Maker 시리즈도 불과 2주쯤 전에 처음 접한 초보이지만, 이클립스에 어느정도 친숙한 덕분에
    이 개발환경을 이용해서 프로젝트 단위로 살펴보니까 공부하는데 시간도 적게 들고 좋더군요.
    오토 컴플리션 기능이 잘 안되어서 그점은 좀 알아봐야 할 것 같지만, 프로젝트 단위로 검색이 쉽기 때문에
    특정한 메서드나 변수등을 찾는것도 쉽네요.

    EasyEclipse for Ruby and Rails는 다음 홈페이지에서 무료 다운로드 가능하고요.

    http://www.easyeclipse.org/site/distributions/ruby-rails.html

    아직도 여러가지로 공부하면서 어떤식으로 할수있을지 궁리중인데,
    많이 배워서 빨리 괜찮은 스크립트들을 만들수 있으면 좋겠네요.

  • ?
    Jessica 2009.08.13 22:57

    오 대박이네요 ㅎ 잘쓰겠습니다! ㅎ

  • ?
    Alastor 2009.08.15 15:35
    이라/라 가 없어서 제 게임에서 살짝 수정해서 쓰고있는데 괜찮죠?
  • ?
    시릴캣 2009.08.15 22:11

     네, 마음대로 수정하시고, 나중에 다른분도 사용할 수 있도록 수정본 올려주셔도 되니까
    전혀 부담 가지실 필요 없어요. 'ㅅ'/

  • ?
    현돌 2010.02.25 07:58

    감사합니다

  • profile
    [A]새장속새 2010.03.19 17:24

     오...

    저같은 경우 게임 내에서 플레이어가 주인공 이름을 수정할 수 있게 해놨기 때문에...

    꼭 필요할 것 같네요.

    감사합니다.

  • ?
    밥밥밥 2011.08.02 18:02

    감사합니다 ㅋㅋ

     

  • ?
    Maxim_Cool 2012.01.28 18:24

    좋네요 ㅋㅋ

  • ?
    overmind 2013.12.05 18:44
    그래... 이런게 꼭 필요한 스크립트징ㅋㅋ 감사합니다.

List of Articles
번호 분류 제목 글쓴이 날짜 조회 수
공지 스크립트 자료 게시물 작성시 주의사항 3 습작 2012.12.24 5398
29 메시지 문장 넘길대 소리나게 하는스크립트 19 아방스 2008.01.24 4180
28 메시지 Quick Face Border 12 아방스 2008.03.05 4161
27 메시지 네오 메시지 시스템 최신 17 file RPGbooster 2008.10.08 4251
26 메시지 메시지 표시 시스템 [NMS3] 31 아방스 2009.01.24 6248
25 메시지 MessageSound v2.0 글자에 소리 다다닥 스크립트 21 할렘 2009.02.02 3510
24 메시지 여러항목 선택지 ... Scene처리.. 23 file 허걱 2009.02.14 5277
23 메시지 문자픽쳐 표시 스크립트 7 file 좀비사냥꾼 2009.03.19 4144
22 메시지 조합한글 21 file 허걱 2009.06.27 4409
21 메시지 어드밴스 텍스트 시스템 13 file 카르와푸딩의아틀리에 2009.06.30 4918
20 메시지 메시지 오른쪽 정렬되어 나오는 스크립트 3 file 아방스 2009.07.12 3237
» 메시지 [완성]RPG Maker VX용 한글 조사 자동결정 10 file 시릴캣 2009.08.13 4598
18 메시지 얼굴표시 9 허걱 2009.09.23 5001
17 메시지 대화창효과 8 078656577er 2009.10.20 5972
16 메시지 Display Flipped Picture 스크립트 11 Love♡ 2009.11.09 3585
15 메시지 NMS 3.0 Beta 주석 번역본(한글) 4 인천항 2010.01.13 3369
14 메시지 넘버님의로딩수정101번눌르긴그레서..... 7 file 알피지vx초짜 2010.01.22 2394
13 메시지 MultiMessage 멀티 메시지 스크립트 9 file 허걱 2010.02.23 4296
12 메시지 문장에서1글자마다소리내기 19 작은샛별 2010.03.07 3951
11 메시지 직접 생각해서 만든 "문장 속 특정 단어 색 바꾸기" 10 file X.66 2010.04.28 4363
10 메시지 Advanced Text System 3.0b by Modern Algebra 3 file Alkaid 2010.09.05 2206
Board Pagination Prev 1 2 Next
/ 2