제가 한글화 했어여 ㅎㅎㅎ- 어머 ;
중복이면 댓글로
--------------- 이밑 부터 드래그
#_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
#_/ ◆메세지 윈도우 개조 -KGC_MessageAlter◆
#_/----------------------------------------------------------------------------
#_/ 메세지 윈도우를 개조해, 미묘한 기능을 추가합니다.
#_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
#==============================================================================
# ★ 커스터마이즈 항목 ★
#==============================================================================
module KGC
# ◆윈도우 사이즈 자동조정 초기설정
MSGA_AUTO_ADJUST_DEFAULT = true
# ◆스크롤 기능 초기설정
MSGA_SCROLL_DEFAULT = false
# ◆스크롤 속도【단위:px】
MSGA_SCROLL_SPEED = 4
# ◆최하부 도달 필수
# true 로 하면, 최하부까지 스크롤 하지 않는다고 메세지를 지울 수 없다
MSGA_MUST_LOWEST = false
# ◆얼굴 그래픽 전용 윈도우를 사용
MSGA_FACE_WINDOW = true
# ◆이름 윈도우의 세로폭
# 문자 사이즈도 자동조정(48?64 당을 추천)
MSGA_NAME_WINDOW_HEIGHT = 48
end
#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★
$imported = {} if $imported == nil
$imported["MessageAlter"] = true
#==============================================================================
# ■ Game_System
#==============================================================================
class Game_System
#--------------------------------------------------------------------------
# ● 공개 인스턴스 변수
#--------------------------------------------------------------------------
attr_accessor :message_auto_adjust # 메세지 윈도우 자동 사이즈 조정
attr_accessor :message_align # 메세지 윈도우 아라인
attr_accessor :message_scroll # 메세지 윈도우 스크롤
attr_accessor :name_window_skin # 이름 윈도우 스킨
attr_accessor :face_window_skin # 얼굴 그래픽 전용 윈도우 스킨
#--------------------------------------------------------------------------
# ● 오브젝트 초기화
#--------------------------------------------------------------------------
alias initialize_KGC_MessageAlter initialize
def initialize
# 원래의 처리를 실행
initialize_KGC_MessageAlter
@message_auto_adjust = KGC::MSGA_AUTO_ADJUST_DEFAULT
@message_align = 0
@message_scroll = KGC::MSGA_SCROLL_DEFAULT
@name_window_skin = nil
@face_window_skin = nil
end
end
#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★
#==============================================================================
# ■ Window_Message
#==============================================================================
class Window_Message < Window_Selectable
#--------------------------------------------------------------------------
# ● 오브젝트 초기화
#--------------------------------------------------------------------------
alias initialize_KGC_MessageAlter initialize
def initialize
# 원래의 처리를 실행
initialize_KGC_MessageAlter
# 이름용 소형 윈도우 작성
@name_window = Window_Base.new(80, 240, 160, KGC::MSGA_NAME_WINDOW_HEIGHT)
@name_window.visible = false
@name_window.back_opacity = 160
@name_window.z = 9999
# 얼굴 그래픽 전용 윈도우 작성
@face_window = Window_Base.new(0, 0, 32, 32)
@face_window.visible = false
@face_window.back_opacity = 160
@face_window.z = 9998
end
#--------------------------------------------------------------------------
# ● 해방
#--------------------------------------------------------------------------
alias dispose_KGC_MessageAlter dispose
def dispose
# 윈도우 해방
@name_window.dispose
@face_window.dispose
# 원래의 처리를 실행
dispose_KGC_MessageAlter
end
#--------------------------------------------------------------------------
# ● 리프레쉬
#--------------------------------------------------------------------------
def refresh
self.contents.clear
# 윈도우 초기화
initialize_window
# 문자열 버퍼 작성
text_buf, trans_x = [Bitmap.new(608, 32)], [0]
# 메세지 윈도우 자동 사이즈 조정이 오프의 경우
unless $game_system.message_auto_adjust
self.contents = Bitmap.new(width - 32, height - 32)
end
text_buf[0].font.color = self.normal_color
x = y = max_x = 0
@cursor_width = 0
# 선택사항이라면 인덴트를 실시한다
x = 8 if $game_temp.choice_start == 0
# 표시 기다리는 메세지가 있는 경우
if $game_temp.message_text != nil
text = $game_temp.message_text
# 제어 문자 처리
begin
last_text = text.clone
text.gsub!(/\[V][(d+)]/i) { $game_variables[$1.to_i] }
text.gsub!(/\IN[(d+)]/i) { $data_items[$1.to_i] == nil ?
"" : $data_items[$1.to_i].name }
text.gsub!(/\WN[(d+)]/i) { $data_weapons[$1.to_i] == nil ?
"" : $data_weapons[$1.to_i].name }
text.gsub!(/\AN[(d+)]/i) { $data_armors[$1.to_i] == nil ?
"" : $data_armors[$1.to_i].name }
end until text == last_text
text.gsub!(/\[N][(d+)]/i) do
$game_actors[$1.to_i] != nil ? $game_actors[$1.to_i].name : ""
end
# 편의상,"\\" 을 " 00" 에 변환
text.gsub!(/\\/) { " 00" }
# "\C" 를 " 01" 에,"\G" 를 " 02" 에 변환
text.gsub!(/\[C][(d+)]/i) { " 01[#{$1}]" }
text.gsub!(/\[G]/i) { " 02" }
text.gsub!(/\AL[(d+)]/i) { "x10[#{$1}]" }
text.gsub!(/\IT[(d+)]/i) { "x11[#{$1}]" }
text.gsub!(/\WP[(d+)]/i) { "x12[#{$1}]" }
text.gsub!(/\AR[(d+)]/i) { "x13[#{$1}]" }
# c 에 1 문자를 취득 (문자를 취득할 수 없게 될 때까지 루프)
while ((c = text.slice!(/./m)) != nil)
# \ 의 경우
if c == " 00"
# 본래의 문자에 되돌린다
c = "\"
end
# C[n] 의 경우
if c == " 01"
# 문자색을 변경
text.sub!(/[(d+)]/, "")
color = $1.to_i
if color >= 0 && color <= 7
text_buf[y].font.color = self.text_color(color)
end
# 다음의 문자에
next
end
# G 의 경우
if c == " 02"
# 골드 윈도우를 작성
if @gold_window == nil
@gold_window = Window_Gold.new
@gold_window.x = 560 - @gold_window.width
if $game_temp.in_battle
@gold_window.y = 192
else
@gold_window.y = self.y >= 128 ? 32 : 384
end
@gold_window.opacity = self.opacity
@gold_window.back_opacity = self.back_opacity
end
# 다음의 문자에
next
end
# AL[n] 의 경우
if c == "x10"
# 아라인 타입을 변경
text.sub!(/[(d+)]/, "")
align = $1.to_i
# 다음의 문자에
next
end
# 개행 문자의 경우
if c == "n"
# 선택사항이라면 커서의 폭을 갱신
if y >= $game_temp.choice_start
@cursor_width = [@cursor_width, x].max
end
# y 에 1 을 가산
y += 1
# 새로운 문자열 버퍼를 작성
text_buf[y] = Bitmap.new(608, 32)
text_buf[y].font.color = self.normal_color
# x 의 최대치 갱신 판정
max_x = [x, max_x].max
# x 를 초기화
x = 0
# 선택사항이라면 인덴트를 실시한다
x = 8 if y >= $game_temp.choice_start
# 다음의 문자에
next
end
# IT[n] 의 경우
if c == "x11"
text.sub!(/[(d+)]/, "")
item = $data_items[$1.to_i]
if item != nil
# 아이템명을 아이콘 첨부로 묘화
icon = RPG::Cache.icon(item.icon_name)
text_buf[y].blt(x + 4, [(32 - icon.height) / 2, 0].max, icon, icon.rect)
x += icon.width + 8
cx = text_buf[y].text_size(item.name).width + 8
text_buf[y].draw_text(x, 0, cx, 32, item.name)
x += cx - 8
end
next
end
# WP[n] 의 경우
if c == "x12"
text.sub!(/[(d+)]/, "")
item = $data_weapons[$1.to_i]
if item != nil
# 무기명을 아이콘 첨부로 묘화
icon = RPG::Cache.icon(item.icon_name)
text_buf[y].blt(x + 4, [(32 - icon.height) / 2, 0].max, icon, icon.rect)
x += icon.width + 8
cx = text_buf[y].text_size(item.name).width + 8
text_buf[y].draw_text(x, 0, cx, 32, item.name)
x += cx - 8
end
next
end
# AR[n] 의 경우
if c == "x13"
text.sub!(/[(d+)]/, "")
item = $data_armors[$1.to_i]
if item != nil
# 무기명을 아이콘 첨부로 묘화
icon = RPG::Cache.icon(item.icon_name)
text_buf[y].blt(x + 4, [(32 - icon.height) / 2, 0].max, icon, icon.rect)
x += icon.width + 8
cx = text_buf[y].text_size(item.name).width + 8
text_buf[y].draw_text(x, 0, cx, 32, item.name)
x += cx - 8
end
next
end
# 문자를 묘화
text_buf[y].draw_text(4 + x, 0, 40, 32, c)
# x 에 묘화 한 문자의 폭을 가산
x += text_buf[y].text_size(c).width
# 전송용 X좌표 보존
trans_x[y] = x
# 선택사항의 경우는 인덴트분 되돌린다
trans_x[y] += 12 if $game_temp.choice_max > 0
end
end
# 메세지 윈도우 자동 사이즈 조정이 온의 경우
if $game_system.message_auto_adjust
# 수치 입력의 경우는 1행 여분으로 추가
y += 1 if $game_temp.num_input_variable_id > 0
# 윈도우 사이즈를 조정
self.width = max_x + 48
self.height = [y, 4].min * 32 + 32
# 얼굴 그래픽이 존재하는 경우
if @face_bitmap != nil && !KGC::MSGA_FACE_WINDOW
# 윈도우의 폭을 가산
self.width += @face_bitmap.width + 16
# 윈도우의 높이가 얼굴 그래픽보다 작은 경우
if @face_bitmap.height + 32 > self.height
# 얼굴 그래픽보다 큰 사이즈로 설정
self.height = @face_bitmap.height + 32
end
self.contents = Bitmap.new(width - 32, [y * 32, @face_bitmap.height].max)
face_y = (self.contents.height - @face_bitmap.height) / 2
# 얼굴 그래픽이 좌측 표시의 경우
if $msg_face[1] == 0
@text_x = @face_bitmap.width + 16
self.contents.blt(8, face_y, @face_bitmap,
Rect.new(0, 0, @face_bitmap.width, @face_bitmap.height))
else
@text_x = 0
self.contents.blt(self.contents.width - @face_bitmap.width - 8,
face_y, @face_bitmap,
Rect.new(0, 0, @face_bitmap.width, @face_bitmap.height))
end
else
@text_x = 0
self.contents = Bitmap.new(width - 32, y * 32)
end
# 메세지 윈도우 자동 사이즈 조정이 오프의 경우
else
# 얼굴 그래픽이 존재하는 경우
if @face_bitmap != nil && !KGC::MSGA_FACE_WINDOW
# 윈도우의 높이가 얼굴 그래픽보다 작은 경우
if @face_bitmap.height + 32 > self.height
# 얼굴 그래픽보다 큰 사이즈로 설정
self.height = @face_bitmap.height + 32
end
face_y = (self.contents.height - @face_bitmap.height) / 2
# 얼굴 그래픽이 좌측 표시의 경우
if $msg_face[1] == 0
@text_x = @face_bitmap.width + 16
self.contents.blt(8, face_y, @face_bitmap,
Rect.new(0, 0, @face_bitmap.width, @face_bitmap.height))
else
@text_x = 0
self.contents.blt(self.contents.width - @face_bitmap.width - 8,
face_y, @face_bitmap,
Rect.new(0, 0, @face_bitmap.width, @face_bitmap.height))
end
else
@text_x = 0
end
end
# 윈도우 내용을 묘화
for i in 0...text_buf.size
next if text_buf[i] == nil
trans_x[i] = 0 if trans_x[i] == nil
# 전송용 X좌표 설정
align = $game_system.message_align if align == nil
case align
when 0, nil # 좌측
tx = @text_x
when 1 # 중앙
if $msg_face != nil && $msg_face[1] == 1
tx = (self.contents.width - trans_x[i] - @face_bitmap.width - 16) / 2
else
tx = (self.contents.width - trans_x[i] + @text_x) / 2
end
when 2 # 우측
if $msg_face != nil && $msg_face[1] == 0
tx = self.contents.width - trans_x[i] - 8
elsif $msg_face != nil && $msg_face[1] == 1
tx = self.contents.width - trans_x[i] - @face_bitmap.width - 24
else
tx = self.contents.width - trans_x[i] + @text_x - 8
end
end
self.contents.blt(tx, i * 32, text_buf[i], text_buf[i].rect)
text_buf[i].dispose
end
# 선택사항의 경우
if $game_temp.choice_max > 0
@item_max = $game_temp.choice_max
self.active = true
self.index = 0
end
# 수치 입력의 경우
if $game_temp.num_input_variable_id > 0
digits_max = $game_temp.num_input_digits_max
number = $game_variables[$game_temp.num_input_variable_id]
@input_number_window = Window_InputNumber.new(digits_max)
@input_number_window.number = number
@input_number_window.x = self.x + 8 + @text_x
@input_number_window.y = self.y + $game_temp.num_input_start * 32
# 메세지 윈도우 자동 사이즈 조정이 온의 경우
if $game_system.message_auto_adjust
# 윈도우의 폭을 조정
self.width = [self.width, @input_number_window.width + 16].max
# 윈도우를 중앙에 이동
centering_window
# 수치 입력 윈도우 위치를 조정
@input_number_window.x = self.x + 8 + @text_x
end
end
# 이름이 설정되어 있는 경우, 이름 표시
if $msg_name != nil
fs = [[22 - (64 - KGC::MSGA_NAME_WINDOW_HEIGHT) / 4, 12].max, 80].min
bitmap = Bitmap.new(32, 32)
bitmap.font.size = fs
cx = bitmap.text_size($msg_name).width
@name_window.width = cx + 32
@name_window.contents.dispose if @name_window.contents != nil
@name_window.contents = Bitmap.new(cx, KGC::MSGA_NAME_WINDOW_HEIGHT - 32)
@name_window.contents.font.size = fs
@name_window.contents.draw_text(0, 0, cx + 8, KGC::MSGA_NAME_WINDOW_HEIGHT - 32, $msg_name)
@name_window.visible = true
if $game_system.name_window_skin != nil
@name_window.windowskin = RPG::Cache.windowskin($game_system.name_window_skin)
else
@name_window.windowskin = self.windowskin
end
# 이름이 설정되어 있지 않은 경우, 윈도우 소거
else
@name_window.visible = false
end
# 얼굴 그래픽 전용 윈도우 표시
if $msg_face != nil && KGC::MSGA_FACE_WINDOW
@face_window.width = @face_bitmap.width + 32
@face_window.height = [@face_bitmap.height + 32, self.height].max
self.height = [@face_window.height, self.height].max
face_y = (@face_window.height - @face_bitmap.height - 32) / 2
@face_window.contents.dispose if @face_window.contents != nil
@face_window.contents = Bitmap.new(@face_window.width - 32, @face_window.height - 32)
@face_window.contents.blt(0, face_y, @face_bitmap, @face_bitmap.rect)
if $game_system.face_window_skin != nil
@face_window.windowskin = RPG::Cache.windowskin($game_system.face_window_skin)
else
@face_window.windowskin = self.windowskin
end
@face_window.visible = true
else
@face_window.visible = false
end
# 중앙에 이동
centering_window
end
#--------------------------------------------------------------------------
# ● 윈도우 설정 초기화
#--------------------------------------------------------------------------
def initialize_window
if $msg_face == nil || $msg_face[0] == nil || $msg_face[1] == nil
@face_bitmap.dispose if @face_bitmap != nil
@face_bitmap = nil
self.width = 480
else
@face_bitmap = RPG::Cache.picture($msg_face[0])
self.width = KGC::MSGA_FACE_WINDOW ? 480 : 496 + @face_bitmap.width
end
centering_window
self.y = 304
self.oy = 0
self.height = 160
reset_window
#--------------------------------------------------------------------------
# ● 윈도우를 중앙에 이동
#--------------------------------------------------------------------------
def centering_window
if @face_window.visible && $msg_face != nil
cx = 640 - self.width - @face_window.width
case $msg_face[1]
when 1 # 오른쪽
@face_window.x = cx / 2 + self.width
self.x = cx / 2
@name_window.x = self.x
else # 왼쪽
@face_window.x = cx / 2
self.x = cx / 2 + @face_window.width
@name_window.x = @face_window.x
end
else
cx = 640 - self.width
self.x = cx / 2
@name_window.x = self.x
end
end
#--------------------------------------------------------------------------
# ● 윈도우의 위치와 불투명도의 설정
#--------------------------------------------------------------------------
def reset_window
if $game_temp.in_battle
self.y = 32
else
case $game_system.message_position
when 0 # 상
self.y = 32
when 1 # 중
self.y = 160
when 2 # 하
self.y = 304
end
end
if $game_system.message_frame == 0
self.opacity = 255
else
self.opacity = 0
end
@name_window.y = self.y - KGC::MSGA_NAME_WINDOW_HEIGHT + 16
@name_window.opacity = self.opacity
@face_window.y = self.y
@face_window.opacity = self.opacity
self.back_opacity = 160
self.pause = false
end
#--------------------------------------------------------------------------
# ● 프레임 갱신
#--------------------------------------------------------------------------
def update
super
# 윈도우를 갱신
@name_window.update
@face_window.update
# 용명의 경우
if @fade_in
self.contents_opacity += 24
@name_window.contents_opacity += 24 if $msg_name != nil
@face_window.contents_opacity += 24 if $msg_face != nil
if @input_number_window != nil
@input_number_window.contents_opacity += 24
end
if self.contents_opacity == 255
@fade_in = false
end
return
end
# 수치 입력중의 경우
if @input_number_window != nil
@input_number_window.update
# 결정
if Input.trigger?(Input::C)
$game_system.se_play($data_system.decision_se)
$game_variables[$game_temp.num_input_variable_id] =
@input_number_window.number
$game_map.need_refresh = true
# 수치 입력 윈도우를 해방
@input_number_window.dispose
@input_number_window = nil
terminate_message
end
return
end
# 메세지 표시중의 경우
if @contents_showing
# 스크롤 최대 위치를 계산
scroll_max = self.contents.height - (self.height - 32)
# 선택사항의 표시중이 아니면 포즈 싸인을 표시
if $game_temp.choice_max == 0
self.pause = true
end
# 캔슬
if Input.trigger?(Input::B) && $game_temp.choice_max > 0 &&
$game_temp.choice_cancel_type > 0
$game_system.se_play($data_system.cancel_se)
$game_temp.choice_proc.call($game_temp.choice_cancel_type - 1)
terminate_message
end
# 결정
if Input.trigger?(Input::C)
if $game_temp.choice_max > 0
$game_system.se_play($data_system.decision_se)
$game_temp.choice_proc.call(self.index)
end
# 스크롤 기능이 온, 한편 선택사항이 아닌 경우
if $game_system.message_scroll && $game_temp.choice_max == 0
# 최하부 도달 판정
if KGC::MSGA_MUST_LOWEST
terminate_message if self.oy == scroll_max
else
terminate_message
end
else
terminate_message
end
end
# 스크롤 기능이 온, 한편 선택사항이 아닌 경우
if $game_system.message_scroll && $game_temp.choice_max == 0
# 방향 버튼 위가 밀리고 있는 경우
if Input.press?(Input::UP)
self.oy = [self.oy - KGC::MSGA_SCROLL_SPEED, 0].max
# 방향 버튼아래가 밀리고 있는 경우
elsif Input.press?(Input::DOWN)
self.oy = [self.oy + KGC::MSGA_SCROLL_SPEED, scroll_max].min
# R 버튼이 밀렸을 경우
elsif Input.repeat?(Input::R)
self.oy = [self.oy + (self.height - 32), scroll_max].min
# L 버튼이 밀렸을 경우
elsif Input.repeat?(Input::L)
self.oy = [self.oy - (self.height - 32), 0].max
end
# 윈도우 최하부에 이르렀을 경우
if $game_temp.choice_max == 0 && self.oy == scroll_max
# 포즈 싸인을 표시
self.pause = true
else
# 포즈 싸인을 소거
self.pause = false
end
end
return
end
# 페이드아웃중 이외로 표시 기다리는 메세지나 선택사항이 있는 경우
if !@fade_out && $game_temp.message_text != nil
@contents_showing = true
$game_temp.message_window_showing = true
reset_window
refresh
Graphics.frame_reset
self.visible = true
self.contents_opacity = 0
if @input_number_window != nil
@input_number_window.contents_opacity = 0
end
@fade_in = true
return
end
# 표시해야 할 메세지가 없지만, 윈도우가 가시 상태의 경우
if self.visible
@fade_out = true
self.opacity -= 48
@name_window.opacity -= 48
@face_window.opacity -= 48
if self.opacity == 0
self.visible = false
@name_window.visible = false
@face_window.visible = false
@fade_out = false
$game_temp.message_window_showing = false
end
return
end
end
#--------------------------------------------------------------------------
# ● 커서의 구형 갱신
#--------------------------------------------------------------------------
def update_cursor_rect
if @index >= 0
n = $game_temp.choice_start + @index
self.cursor_rect.set(8 + @text_x, n * 32, @cursor_width, 32)
else
self.cursor_rect.empty
end
end
end
#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★
#==============================================================================
# ■ Interpreter (분할 정의 3)
#==============================================================================
class Interpreter
#--------------------------------------------------------------------------
# ● 문장의 표시
#--------------------------------------------------------------------------
def command_101
# 다른 문장이 message_text 로 설정 끝나, 한편 스크롤 기능이 오프의 경우
if $game_temp.message_text != nil && !$game_system.message_scroll
# 종료
return false
end
# 메세지 종료 대기중 플래그 및 콜백을 설정
@message_waiting = true
$game_temp.message_proc = Proc.new { @message_waiting = false }
# message_text 에 1 행 째를 설정
$game_temp.message_text = @list[@index].parameters[0] + "n"
line_count = 1
# 루프
loop {
# 다음의 이벤트 커멘드가 문장 2 행 째 이후의 경우
if @list[@index+1].code == 401
# message_text 에 2 행 째 이후를 추가
$game_temp.message_text += @list[@index+1].parameters[0] + "n"
line_count += 1 # 이벤트 커멘드가 문장 2 행 째 이후가 아닌 경우
else
# 다음의 이벤트 커멘드가 문장 표시, 한편 스크롤 기능이 온의 경우
if @list[@index+1].code == 101 && $game_system.message_scroll
# message_text 에 다음의 문장을 추가
$game_temp.message_text += @list[@index+1].parameters[0] + "n"
line_count += 1
# 인덱스를 진행시킨다
@index += 1
next
# 다음의 이벤트 커멘드가 선택사항의 표시의 경우
elsif @list[@index+1].code == 102
# 선택사항이 화면에 들어가는 경우
if @list[@index+1].parameters[0].size <= 4 - line_count
# 인덱스를 진행시킨다
@index += 1
# 선택사항의 셋업
$game_temp.choice_start = line_count
setup_choices(@list[@index].parameters)
end
# 다음의 이벤트 커멘드가 수치 입력의 처리의 경우
elsif @list[@index+1].code == 103
# 수치 입력 윈도우가 화면에 들어가는 경우
if line_count < 4
# 인덱스를 진행시킨다
@index += 1
# 수치 입력의 셋업
$game_temp.num_input_start = line_count
$game_temp.num_input_variable_id = @list[@index].parameters[0]
$game_temp.num_input_digits_max = @list[@index].parameters[1]
end
end
# 계속
return true
end
# 인덱스를 진행시킨다
@index += 1
}
end
end
중복이면 댓글로
--------------- 이밑 부터 드래그
#_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
#_/ ◆메세지 윈도우 개조 -KGC_MessageAlter◆
#_/----------------------------------------------------------------------------
#_/ 메세지 윈도우를 개조해, 미묘한 기능을 추가합니다.
#_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
#==============================================================================
# ★ 커스터마이즈 항목 ★
#==============================================================================
module KGC
# ◆윈도우 사이즈 자동조정 초기설정
MSGA_AUTO_ADJUST_DEFAULT = true
# ◆스크롤 기능 초기설정
MSGA_SCROLL_DEFAULT = false
# ◆스크롤 속도【단위:px】
MSGA_SCROLL_SPEED = 4
# ◆최하부 도달 필수
# true 로 하면, 최하부까지 스크롤 하지 않는다고 메세지를 지울 수 없다
MSGA_MUST_LOWEST = false
# ◆얼굴 그래픽 전용 윈도우를 사용
MSGA_FACE_WINDOW = true
# ◆이름 윈도우의 세로폭
# 문자 사이즈도 자동조정(48?64 당을 추천)
MSGA_NAME_WINDOW_HEIGHT = 48
end
#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★
$imported = {} if $imported == nil
$imported["MessageAlter"] = true
#==============================================================================
# ■ Game_System
#==============================================================================
class Game_System
#--------------------------------------------------------------------------
# ● 공개 인스턴스 변수
#--------------------------------------------------------------------------
attr_accessor :message_auto_adjust # 메세지 윈도우 자동 사이즈 조정
attr_accessor :message_align # 메세지 윈도우 아라인
attr_accessor :message_scroll # 메세지 윈도우 스크롤
attr_accessor :name_window_skin # 이름 윈도우 스킨
attr_accessor :face_window_skin # 얼굴 그래픽 전용 윈도우 스킨
#--------------------------------------------------------------------------
# ● 오브젝트 초기화
#--------------------------------------------------------------------------
alias initialize_KGC_MessageAlter initialize
def initialize
# 원래의 처리를 실행
initialize_KGC_MessageAlter
@message_auto_adjust = KGC::MSGA_AUTO_ADJUST_DEFAULT
@message_align = 0
@message_scroll = KGC::MSGA_SCROLL_DEFAULT
@name_window_skin = nil
@face_window_skin = nil
end
end
#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★
#==============================================================================
# ■ Window_Message
#==============================================================================
class Window_Message < Window_Selectable
#--------------------------------------------------------------------------
# ● 오브젝트 초기화
#--------------------------------------------------------------------------
alias initialize_KGC_MessageAlter initialize
def initialize
# 원래의 처리를 실행
initialize_KGC_MessageAlter
# 이름용 소형 윈도우 작성
@name_window = Window_Base.new(80, 240, 160, KGC::MSGA_NAME_WINDOW_HEIGHT)
@name_window.visible = false
@name_window.back_opacity = 160
@name_window.z = 9999
# 얼굴 그래픽 전용 윈도우 작성
@face_window = Window_Base.new(0, 0, 32, 32)
@face_window.visible = false
@face_window.back_opacity = 160
@face_window.z = 9998
end
#--------------------------------------------------------------------------
# ● 해방
#--------------------------------------------------------------------------
alias dispose_KGC_MessageAlter dispose
def dispose
# 윈도우 해방
@name_window.dispose
@face_window.dispose
# 원래의 처리를 실행
dispose_KGC_MessageAlter
end
#--------------------------------------------------------------------------
# ● 리프레쉬
#--------------------------------------------------------------------------
def refresh
self.contents.clear
# 윈도우 초기화
initialize_window
# 문자열 버퍼 작성
text_buf, trans_x = [Bitmap.new(608, 32)], [0]
# 메세지 윈도우 자동 사이즈 조정이 오프의 경우
unless $game_system.message_auto_adjust
self.contents = Bitmap.new(width - 32, height - 32)
end
text_buf[0].font.color = self.normal_color
x = y = max_x = 0
@cursor_width = 0
# 선택사항이라면 인덴트를 실시한다
x = 8 if $game_temp.choice_start == 0
# 표시 기다리는 메세지가 있는 경우
if $game_temp.message_text != nil
text = $game_temp.message_text
# 제어 문자 처리
begin
last_text = text.clone
text.gsub!(/\[V][(d+)]/i) { $game_variables[$1.to_i] }
text.gsub!(/\IN[(d+)]/i) { $data_items[$1.to_i] == nil ?
"" : $data_items[$1.to_i].name }
text.gsub!(/\WN[(d+)]/i) { $data_weapons[$1.to_i] == nil ?
"" : $data_weapons[$1.to_i].name }
text.gsub!(/\AN[(d+)]/i) { $data_armors[$1.to_i] == nil ?
"" : $data_armors[$1.to_i].name }
end until text == last_text
text.gsub!(/\[N][(d+)]/i) do
$game_actors[$1.to_i] != nil ? $game_actors[$1.to_i].name : ""
end
# 편의상,"\\" 을 " 00" 에 변환
text.gsub!(/\\/) { " 00" }
# "\C" 를 " 01" 에,"\G" 를 " 02" 에 변환
text.gsub!(/\[C][(d+)]/i) { " 01[#{$1}]" }
text.gsub!(/\[G]/i) { " 02" }
text.gsub!(/\AL[(d+)]/i) { "x10[#{$1}]" }
text.gsub!(/\IT[(d+)]/i) { "x11[#{$1}]" }
text.gsub!(/\WP[(d+)]/i) { "x12[#{$1}]" }
text.gsub!(/\AR[(d+)]/i) { "x13[#{$1}]" }
# c 에 1 문자를 취득 (문자를 취득할 수 없게 될 때까지 루프)
while ((c = text.slice!(/./m)) != nil)
# \ 의 경우
if c == " 00"
# 본래의 문자에 되돌린다
c = "\"
end
# C[n] 의 경우
if c == " 01"
# 문자색을 변경
text.sub!(/[(d+)]/, "")
color = $1.to_i
if color >= 0 && color <= 7
text_buf[y].font.color = self.text_color(color)
end
# 다음의 문자에
next
end
# G 의 경우
if c == " 02"
# 골드 윈도우를 작성
if @gold_window == nil
@gold_window = Window_Gold.new
@gold_window.x = 560 - @gold_window.width
if $game_temp.in_battle
@gold_window.y = 192
else
@gold_window.y = self.y >= 128 ? 32 : 384
end
@gold_window.opacity = self.opacity
@gold_window.back_opacity = self.back_opacity
end
# 다음의 문자에
next
end
# AL[n] 의 경우
if c == "x10"
# 아라인 타입을 변경
text.sub!(/[(d+)]/, "")
align = $1.to_i
# 다음의 문자에
next
end
# 개행 문자의 경우
if c == "n"
# 선택사항이라면 커서의 폭을 갱신
if y >= $game_temp.choice_start
@cursor_width = [@cursor_width, x].max
end
# y 에 1 을 가산
y += 1
# 새로운 문자열 버퍼를 작성
text_buf[y] = Bitmap.new(608, 32)
text_buf[y].font.color = self.normal_color
# x 의 최대치 갱신 판정
max_x = [x, max_x].max
# x 를 초기화
x = 0
# 선택사항이라면 인덴트를 실시한다
x = 8 if y >= $game_temp.choice_start
# 다음의 문자에
next
end
# IT[n] 의 경우
if c == "x11"
text.sub!(/[(d+)]/, "")
item = $data_items[$1.to_i]
if item != nil
# 아이템명을 아이콘 첨부로 묘화
icon = RPG::Cache.icon(item.icon_name)
text_buf[y].blt(x + 4, [(32 - icon.height) / 2, 0].max, icon, icon.rect)
x += icon.width + 8
cx = text_buf[y].text_size(item.name).width + 8
text_buf[y].draw_text(x, 0, cx, 32, item.name)
x += cx - 8
end
next
end
# WP[n] 의 경우
if c == "x12"
text.sub!(/[(d+)]/, "")
item = $data_weapons[$1.to_i]
if item != nil
# 무기명을 아이콘 첨부로 묘화
icon = RPG::Cache.icon(item.icon_name)
text_buf[y].blt(x + 4, [(32 - icon.height) / 2, 0].max, icon, icon.rect)
x += icon.width + 8
cx = text_buf[y].text_size(item.name).width + 8
text_buf[y].draw_text(x, 0, cx, 32, item.name)
x += cx - 8
end
next
end
# AR[n] 의 경우
if c == "x13"
text.sub!(/[(d+)]/, "")
item = $data_armors[$1.to_i]
if item != nil
# 무기명을 아이콘 첨부로 묘화
icon = RPG::Cache.icon(item.icon_name)
text_buf[y].blt(x + 4, [(32 - icon.height) / 2, 0].max, icon, icon.rect)
x += icon.width + 8
cx = text_buf[y].text_size(item.name).width + 8
text_buf[y].draw_text(x, 0, cx, 32, item.name)
x += cx - 8
end
next
end
# 문자를 묘화
text_buf[y].draw_text(4 + x, 0, 40, 32, c)
# x 에 묘화 한 문자의 폭을 가산
x += text_buf[y].text_size(c).width
# 전송용 X좌표 보존
trans_x[y] = x
# 선택사항의 경우는 인덴트분 되돌린다
trans_x[y] += 12 if $game_temp.choice_max > 0
end
end
# 메세지 윈도우 자동 사이즈 조정이 온의 경우
if $game_system.message_auto_adjust
# 수치 입력의 경우는 1행 여분으로 추가
y += 1 if $game_temp.num_input_variable_id > 0
# 윈도우 사이즈를 조정
self.width = max_x + 48
self.height = [y, 4].min * 32 + 32
# 얼굴 그래픽이 존재하는 경우
if @face_bitmap != nil && !KGC::MSGA_FACE_WINDOW
# 윈도우의 폭을 가산
self.width += @face_bitmap.width + 16
# 윈도우의 높이가 얼굴 그래픽보다 작은 경우
if @face_bitmap.height + 32 > self.height
# 얼굴 그래픽보다 큰 사이즈로 설정
self.height = @face_bitmap.height + 32
end
self.contents = Bitmap.new(width - 32, [y * 32, @face_bitmap.height].max)
face_y = (self.contents.height - @face_bitmap.height) / 2
# 얼굴 그래픽이 좌측 표시의 경우
if $msg_face[1] == 0
@text_x = @face_bitmap.width + 16
self.contents.blt(8, face_y, @face_bitmap,
Rect.new(0, 0, @face_bitmap.width, @face_bitmap.height))
else
@text_x = 0
self.contents.blt(self.contents.width - @face_bitmap.width - 8,
face_y, @face_bitmap,
Rect.new(0, 0, @face_bitmap.width, @face_bitmap.height))
end
else
@text_x = 0
self.contents = Bitmap.new(width - 32, y * 32)
end
# 메세지 윈도우 자동 사이즈 조정이 오프의 경우
else
# 얼굴 그래픽이 존재하는 경우
if @face_bitmap != nil && !KGC::MSGA_FACE_WINDOW
# 윈도우의 높이가 얼굴 그래픽보다 작은 경우
if @face_bitmap.height + 32 > self.height
# 얼굴 그래픽보다 큰 사이즈로 설정
self.height = @face_bitmap.height + 32
end
face_y = (self.contents.height - @face_bitmap.height) / 2
# 얼굴 그래픽이 좌측 표시의 경우
if $msg_face[1] == 0
@text_x = @face_bitmap.width + 16
self.contents.blt(8, face_y, @face_bitmap,
Rect.new(0, 0, @face_bitmap.width, @face_bitmap.height))
else
@text_x = 0
self.contents.blt(self.contents.width - @face_bitmap.width - 8,
face_y, @face_bitmap,
Rect.new(0, 0, @face_bitmap.width, @face_bitmap.height))
end
else
@text_x = 0
end
end
# 윈도우 내용을 묘화
for i in 0...text_buf.size
next if text_buf[i] == nil
trans_x[i] = 0 if trans_x[i] == nil
# 전송용 X좌표 설정
align = $game_system.message_align if align == nil
case align
when 0, nil # 좌측
tx = @text_x
when 1 # 중앙
if $msg_face != nil && $msg_face[1] == 1
tx = (self.contents.width - trans_x[i] - @face_bitmap.width - 16) / 2
else
tx = (self.contents.width - trans_x[i] + @text_x) / 2
end
when 2 # 우측
if $msg_face != nil && $msg_face[1] == 0
tx = self.contents.width - trans_x[i] - 8
elsif $msg_face != nil && $msg_face[1] == 1
tx = self.contents.width - trans_x[i] - @face_bitmap.width - 24
else
tx = self.contents.width - trans_x[i] + @text_x - 8
end
end
self.contents.blt(tx, i * 32, text_buf[i], text_buf[i].rect)
text_buf[i].dispose
end
# 선택사항의 경우
if $game_temp.choice_max > 0
@item_max = $game_temp.choice_max
self.active = true
self.index = 0
end
# 수치 입력의 경우
if $game_temp.num_input_variable_id > 0
digits_max = $game_temp.num_input_digits_max
number = $game_variables[$game_temp.num_input_variable_id]
@input_number_window = Window_InputNumber.new(digits_max)
@input_number_window.number = number
@input_number_window.x = self.x + 8 + @text_x
@input_number_window.y = self.y + $game_temp.num_input_start * 32
# 메세지 윈도우 자동 사이즈 조정이 온의 경우
if $game_system.message_auto_adjust
# 윈도우의 폭을 조정
self.width = [self.width, @input_number_window.width + 16].max
# 윈도우를 중앙에 이동
centering_window
# 수치 입력 윈도우 위치를 조정
@input_number_window.x = self.x + 8 + @text_x
end
end
# 이름이 설정되어 있는 경우, 이름 표시
if $msg_name != nil
fs = [[22 - (64 - KGC::MSGA_NAME_WINDOW_HEIGHT) / 4, 12].max, 80].min
bitmap = Bitmap.new(32, 32)
bitmap.font.size = fs
cx = bitmap.text_size($msg_name).width
@name_window.width = cx + 32
@name_window.contents.dispose if @name_window.contents != nil
@name_window.contents = Bitmap.new(cx, KGC::MSGA_NAME_WINDOW_HEIGHT - 32)
@name_window.contents.font.size = fs
@name_window.contents.draw_text(0, 0, cx + 8, KGC::MSGA_NAME_WINDOW_HEIGHT - 32, $msg_name)
@name_window.visible = true
if $game_system.name_window_skin != nil
@name_window.windowskin = RPG::Cache.windowskin($game_system.name_window_skin)
else
@name_window.windowskin = self.windowskin
end
# 이름이 설정되어 있지 않은 경우, 윈도우 소거
else
@name_window.visible = false
end
# 얼굴 그래픽 전용 윈도우 표시
if $msg_face != nil && KGC::MSGA_FACE_WINDOW
@face_window.width = @face_bitmap.width + 32
@face_window.height = [@face_bitmap.height + 32, self.height].max
self.height = [@face_window.height, self.height].max
face_y = (@face_window.height - @face_bitmap.height - 32) / 2
@face_window.contents.dispose if @face_window.contents != nil
@face_window.contents = Bitmap.new(@face_window.width - 32, @face_window.height - 32)
@face_window.contents.blt(0, face_y, @face_bitmap, @face_bitmap.rect)
if $game_system.face_window_skin != nil
@face_window.windowskin = RPG::Cache.windowskin($game_system.face_window_skin)
else
@face_window.windowskin = self.windowskin
end
@face_window.visible = true
else
@face_window.visible = false
end
# 중앙에 이동
centering_window
end
#--------------------------------------------------------------------------
# ● 윈도우 설정 초기화
#--------------------------------------------------------------------------
def initialize_window
if $msg_face == nil || $msg_face[0] == nil || $msg_face[1] == nil
@face_bitmap.dispose if @face_bitmap != nil
@face_bitmap = nil
self.width = 480
else
@face_bitmap = RPG::Cache.picture($msg_face[0])
self.width = KGC::MSGA_FACE_WINDOW ? 480 : 496 + @face_bitmap.width
end
centering_window
self.y = 304
self.oy = 0
self.height = 160
reset_window
#--------------------------------------------------------------------------
# ● 윈도우를 중앙에 이동
#--------------------------------------------------------------------------
def centering_window
if @face_window.visible && $msg_face != nil
cx = 640 - self.width - @face_window.width
case $msg_face[1]
when 1 # 오른쪽
@face_window.x = cx / 2 + self.width
self.x = cx / 2
@name_window.x = self.x
else # 왼쪽
@face_window.x = cx / 2
self.x = cx / 2 + @face_window.width
@name_window.x = @face_window.x
end
else
cx = 640 - self.width
self.x = cx / 2
@name_window.x = self.x
end
end
#--------------------------------------------------------------------------
# ● 윈도우의 위치와 불투명도의 설정
#--------------------------------------------------------------------------
def reset_window
if $game_temp.in_battle
self.y = 32
else
case $game_system.message_position
when 0 # 상
self.y = 32
when 1 # 중
self.y = 160
when 2 # 하
self.y = 304
end
end
if $game_system.message_frame == 0
self.opacity = 255
else
self.opacity = 0
end
@name_window.y = self.y - KGC::MSGA_NAME_WINDOW_HEIGHT + 16
@name_window.opacity = self.opacity
@face_window.y = self.y
@face_window.opacity = self.opacity
self.back_opacity = 160
self.pause = false
end
#--------------------------------------------------------------------------
# ● 프레임 갱신
#--------------------------------------------------------------------------
def update
super
# 윈도우를 갱신
@name_window.update
@face_window.update
# 용명의 경우
if @fade_in
self.contents_opacity += 24
@name_window.contents_opacity += 24 if $msg_name != nil
@face_window.contents_opacity += 24 if $msg_face != nil
if @input_number_window != nil
@input_number_window.contents_opacity += 24
end
if self.contents_opacity == 255
@fade_in = false
end
return
end
# 수치 입력중의 경우
if @input_number_window != nil
@input_number_window.update
# 결정
if Input.trigger?(Input::C)
$game_system.se_play($data_system.decision_se)
$game_variables[$game_temp.num_input_variable_id] =
@input_number_window.number
$game_map.need_refresh = true
# 수치 입력 윈도우를 해방
@input_number_window.dispose
@input_number_window = nil
terminate_message
end
return
end
# 메세지 표시중의 경우
if @contents_showing
# 스크롤 최대 위치를 계산
scroll_max = self.contents.height - (self.height - 32)
# 선택사항의 표시중이 아니면 포즈 싸인을 표시
if $game_temp.choice_max == 0
self.pause = true
end
# 캔슬
if Input.trigger?(Input::B) && $game_temp.choice_max > 0 &&
$game_temp.choice_cancel_type > 0
$game_system.se_play($data_system.cancel_se)
$game_temp.choice_proc.call($game_temp.choice_cancel_type - 1)
terminate_message
end
# 결정
if Input.trigger?(Input::C)
if $game_temp.choice_max > 0
$game_system.se_play($data_system.decision_se)
$game_temp.choice_proc.call(self.index)
end
# 스크롤 기능이 온, 한편 선택사항이 아닌 경우
if $game_system.message_scroll && $game_temp.choice_max == 0
# 최하부 도달 판정
if KGC::MSGA_MUST_LOWEST
terminate_message if self.oy == scroll_max
else
terminate_message
end
else
terminate_message
end
end
# 스크롤 기능이 온, 한편 선택사항이 아닌 경우
if $game_system.message_scroll && $game_temp.choice_max == 0
# 방향 버튼 위가 밀리고 있는 경우
if Input.press?(Input::UP)
self.oy = [self.oy - KGC::MSGA_SCROLL_SPEED, 0].max
# 방향 버튼아래가 밀리고 있는 경우
elsif Input.press?(Input::DOWN)
self.oy = [self.oy + KGC::MSGA_SCROLL_SPEED, scroll_max].min
# R 버튼이 밀렸을 경우
elsif Input.repeat?(Input::R)
self.oy = [self.oy + (self.height - 32), scroll_max].min
# L 버튼이 밀렸을 경우
elsif Input.repeat?(Input::L)
self.oy = [self.oy - (self.height - 32), 0].max
end
# 윈도우 최하부에 이르렀을 경우
if $game_temp.choice_max == 0 && self.oy == scroll_max
# 포즈 싸인을 표시
self.pause = true
else
# 포즈 싸인을 소거
self.pause = false
end
end
return
end
# 페이드아웃중 이외로 표시 기다리는 메세지나 선택사항이 있는 경우
if !@fade_out && $game_temp.message_text != nil
@contents_showing = true
$game_temp.message_window_showing = true
reset_window
refresh
Graphics.frame_reset
self.visible = true
self.contents_opacity = 0
if @input_number_window != nil
@input_number_window.contents_opacity = 0
end
@fade_in = true
return
end
# 표시해야 할 메세지가 없지만, 윈도우가 가시 상태의 경우
if self.visible
@fade_out = true
self.opacity -= 48
@name_window.opacity -= 48
@face_window.opacity -= 48
if self.opacity == 0
self.visible = false
@name_window.visible = false
@face_window.visible = false
@fade_out = false
$game_temp.message_window_showing = false
end
return
end
end
#--------------------------------------------------------------------------
# ● 커서의 구형 갱신
#--------------------------------------------------------------------------
def update_cursor_rect
if @index >= 0
n = $game_temp.choice_start + @index
self.cursor_rect.set(8 + @text_x, n * 32, @cursor_width, 32)
else
self.cursor_rect.empty
end
end
end
#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★
#==============================================================================
# ■ Interpreter (분할 정의 3)
#==============================================================================
class Interpreter
#--------------------------------------------------------------------------
# ● 문장의 표시
#--------------------------------------------------------------------------
def command_101
# 다른 문장이 message_text 로 설정 끝나, 한편 스크롤 기능이 오프의 경우
if $game_temp.message_text != nil && !$game_system.message_scroll
# 종료
return false
end
# 메세지 종료 대기중 플래그 및 콜백을 설정
@message_waiting = true
$game_temp.message_proc = Proc.new { @message_waiting = false }
# message_text 에 1 행 째를 설정
$game_temp.message_text = @list[@index].parameters[0] + "n"
line_count = 1
# 루프
loop {
# 다음의 이벤트 커멘드가 문장 2 행 째 이후의 경우
if @list[@index+1].code == 401
# message_text 에 2 행 째 이후를 추가
$game_temp.message_text += @list[@index+1].parameters[0] + "n"
line_count += 1 # 이벤트 커멘드가 문장 2 행 째 이후가 아닌 경우
else
# 다음의 이벤트 커멘드가 문장 표시, 한편 스크롤 기능이 온의 경우
if @list[@index+1].code == 101 && $game_system.message_scroll
# message_text 에 다음의 문장을 추가
$game_temp.message_text += @list[@index+1].parameters[0] + "n"
line_count += 1
# 인덱스를 진행시킨다
@index += 1
next
# 다음의 이벤트 커멘드가 선택사항의 표시의 경우
elsif @list[@index+1].code == 102
# 선택사항이 화면에 들어가는 경우
if @list[@index+1].parameters[0].size <= 4 - line_count
# 인덱스를 진행시킨다
@index += 1
# 선택사항의 셋업
$game_temp.choice_start = line_count
setup_choices(@list[@index].parameters)
end
# 다음의 이벤트 커멘드가 수치 입력의 처리의 경우
elsif @list[@index+1].code == 103
# 수치 입력 윈도우가 화면에 들어가는 경우
if line_count < 4
# 인덱스를 진행시킨다
@index += 1
# 수치 입력의 셋업
$game_temp.num_input_start = line_count
$game_temp.num_input_variable_id = @list[@index].parameters[0]
$game_temp.num_input_digits_max = @list[@index].parameters[1]
end
end
# 계속
return true
end
# 인덱스를 진행시킨다
@index += 1
}
end
end