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

    좋네요 ㅋㅋ

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

List of Articles
번호 분류 제목 글쓴이 날짜 조회 수
공지 스크립트 자료 게시물 작성시 주의사항 3 습작 2012.12.24 4686
29 메시지 Etude87 Dialogue History Scene file 습작 2014.07.07 853
28 메시지 Etude87_Item_Choice ver.1.00 file 습작 2013.02.16 1698
27 메시지 문장 및 페이스 정렬 바꾸기 (Neonblack's Text Alignment and Face Flip script) MinaAubert 2012.09.19 2118
26 메시지 메시지를 빠르게 넘겨주는 스크립트 3 타카나시 소라 2012.07.23 3636
25 메시지 HG_POP_TEXT (맵 화면에 문자 표시) 4 file 허걱 2011.09.16 3530
24 메시지 소설풍(노벨풍) 문자 스크립트 31 file 맛난호빵 2011.01.03 5430
23 메시지 캐릭터 대화상자 - Character's Textbox ver 1.0 6 아방스 2010.12.17 6310
22 메시지 Advanced Text System 3.0c by Modern Algebra 3 file Alkaid 2010.09.08 2247
21 메시지 Universal Message System 0.3.0(beta) by ccoa 3 file Alkaid 2010.09.08 2258
20 메시지 Advanced Text System 3.0b by Modern Algebra 3 file Alkaid 2010.09.05 2155
19 메시지 직접 생각해서 만든 "문장 속 특정 단어 색 바꾸기" 10 file X.66 2010.04.28 4321
18 메시지 문장에서1글자마다소리내기 19 작은샛별 2010.03.07 3555
17 메시지 MultiMessage 멀티 메시지 스크립트 9 file 허걱 2010.02.23 4207
16 메시지 넘버님의로딩수정101번눌르긴그레서..... 7 file 알피지vx초짜 2010.01.22 2364
15 메시지 NMS 3.0 Beta 주석 번역본(한글) 4 인천항 2010.01.13 3304
14 메시지 Display Flipped Picture 스크립트 11 Love♡ 2009.11.09 3551
13 메시지 대화창효과 8 078656577er 2009.10.20 5865
12 메시지 얼굴표시 9 허걱 2009.09.23 4924
» 메시지 [완성]RPG Maker VX용 한글 조사 자동결정 10 file 시릴캣 2009.08.13 4502
10 메시지 메시지 오른쪽 정렬되어 나오는 스크립트 3 file AVANGS 2009.07.12 3196
Board Pagination Prev 1 2 Next
/ 2