메시지

[완성]RPG Maker VX용 한글 조사 자동결정

by 시릴캣 posted Aug 13, 2009
?

단축키

Prev이전 문서

Next다음 문서

ESC닫기

크게 작게 위로 아래로 댓글로 가기 인쇄

# ==============================================================================
# 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

# ▲ 영문자/숫자 기타

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

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