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 5453
297 타이틀/게임오버 까만화면으로 시작하기 27 file 허걱 2009.07.04 4529
296 메뉴 전투결과 상세 표시 스크립트 24 file 카르와푸딩의아틀리에 2009.07.07 4144
295 기타 [요청자료] 유즈미짱 님께서 요청한 그림표시 입니다. 5 file 허걱 2009.07.08 2976
294 스킬 무기성장 랭크 시스템. 20 file 카르와푸딩의아틀리에 2009.07.08 4822
293 기타 로딩중 스크립트 24 file NO.0 2009.07.11 4464
292 메시지 메시지 오른쪽 정렬되어 나오는 스크립트 3 file 아방스 2009.07.12 3240
291 기타 이벤트 뿌리기 + 범위지정 8 file 허걱 2009.07.13 2698
290 이동 및 탈것 스위치 on일때 못 움직이게...(이동고정) 6 허걱 2009.07.14 2328
289 이름입력 글자조합 (이름생성용) - 수정 12 file 허걱 2009.07.17 3638
288 이동 및 탈것 화면의 부드러운 스크롤 스크립트 32 카르와푸딩의아틀리에 2009.07.17 3821
287 변수/스위치 다른 이벤트 셀프스위치 조작 - xp, vx 사용가능 3 허걱 2009.07.18 2393
286 기타 커맨드 시스템 7 file 허걱 2009.07.21 2856
285 기타 KGC파라미터배분 2 (VX전용) 20 file 카르와푸딩의아틀리에 2009.07.21 3272
284 기타 vx 보안 시스템 19 file 허걱 2009.07.29 3967
283 장비 Rei(레이)의 Paperdoll(비쥬얼 장비)스크립트 20 file 루시페르 2009.07.29 4467
282 기타 경험치, HP, MP 백분율계산 (실시간) 8 file 허걱 2009.08.01 3541
281 온라인 net VX[ RPGVX 온라인 스크립트 ] 19 file 제로스S2 2009.08.03 6393
280 기타 글씨표시 스크립트 32 file 허걱 2009.08.10 4422
279 타이틀/게임오버 타이틀 공지 37 file 허걱 2009.08.10 4750
» 메시지 [완성]RPG Maker VX용 한글 조사 자동결정 10 file 시릴캣 2009.08.13 4601
Board Pagination Prev 1 ... 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 ... 32 Next
/ 32