# ==============================================================================
# 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
# =======================================================================================================================
# 일단 테스트를 위해 다음과 같이 값을 설정했습니다.
# 1번은 모두 마지막 글자가 받침이 있는 것, 2번은 모두 마지막 글자가 받침이 없는 것, 3번은 숫자나 영문자로 끝나는 것으로
# 일례를 만든 뒤 다음 이벤트를 만들어 테스트했습니다.
# 문구가 참 유치하다는 생각을 저도 하긴 했지만(....), 아무튼 이 이벤트를 돌린 결과는 다음과 같습니다.
# ▲ 받침이 있는 것들
# ▲ 받침이 없는 것들
# ▲ 영문자/숫자 기타
# 영문자및 숫자의 경우에는 발음을 알수가 없어 조사가 제멋대로....이네요. 이건 방법이 없을지 모르겠지만,
# 아무튼 이정도면 한글을 쓰시는데 무리는 없을 거라고 믿고싶네요.
# 그럼 유용하게 쓰시길....