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
377 메뉴 GuiRPG menu시스템 13 file 할렘 2009.02.07 4849
376 기타 데이터베이스 자체 제한 해체 스크립트 [Database Limit Breaker] 13 file 할렘 2009.02.07 3562
375 메뉴 (모그메뉴 풀세트팩 SEL Style.) 유니크급 자료 147 file 할렘 2009.02.07 9558
374 기타 심플 마우스 시스템 1.5 애드온 11 file RMdude 2009.02.11 4325
373 이동 및 탈것 Wachunga님의 XP용 MapLink VX용으로 개조 6 file 허걱 2009.02.13 3039
372 기타 게임시간&밤낮 54 file 허걱 2009.02.14 6111
371 메시지 여러항목 선택지 ... Scene처리.. 23 file 허걱 2009.02.14 5277
370 HUD 변수 표시 HUD 8 Tofuman 2009.02.15 2469
369 기타 Kylock 밤낮 스크립트 부분 한글화 + 달력 모드 (모드는 자작) 31 file RMdude 2009.02.15 4100
368 메뉴 모그메뉴 스킨입니다. 1 file 아부리 2009.02.16 6866
367 메뉴 CogWheelBars 시스템. 13 file 할렘 2009.02.20 4362
366 기타 태양 스크립트. 15 file 할렘 2009.02.20 4463
365 영상 동영상 재생 스크립트.-Game_Film II-(테스트) 7 할렘 2009.02.22 3741
364 기타 아키루냥님 요청 스크립트(자작) 4 file Last H 2009.02.22 2754
363 기타 [kcg] 슬립 데미지 상세화 19 BoneheadedAlien 2009.02.22 3242
362 스킬 미완성 구버전. 2칸 위에 있는 글을 이용해주세요. 7 Last H 2009.02.23 1925
361 타이틀/게임오버 륀느님 요청] 전투 전멸후 Game over없이 특정위치로 이동 10 Last H 2009.02.24 2834
360 이름입력 아이템 이름을 내마음대로 정하자! name_changer 1.0v 26 file Last H 2009.02.25 4067
359 기타 액터선택지제작 간편화 스크립트 7 Evangelista 2009.02.26 4082
358 전투 ORBS [새로운 전투 방식] 48 file 아방스 2009.03.04 10210
Board Pagination Prev 1 ... 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 ... 32 Next
/ 32