#==============================================================================
#
# ▼ Yami Engine Ace - 气泡对话框
# -- 最后更新: 2012.06.07
# -- 使用难度: Normal
# -- 需要脚本: 无
#
#==============================================================================
$imported = {} if $imported.nil?
$imported["YSE-PopMessage"] = true
#==============================================================================
# ▼ Updates
# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
# 2012.06.07 - Fixed Compatible: YEA - Ace Message System.
# 2012.05.11 - Fixed Message Position.
# - Remove Requirement: YSE - Fix Events Order.
# 2012.05.07 - Fixed Face position.
# - Added Requirement: YSE - Fix Events Order.
# 2012.04.06 - You can change Bubble Tag filename.
# 2012.03.28 - Fixed Default Message Position and Sizes.
# 2012.03.27 - Fixed Default Message.
# 2012.03.27 - Added Bubble Tag.
# 2012.03.25 - Fixed Escape Message.
# 2012.03.24 - Fixed Battle Message.
# 2012.03.24 - Rewrote script.
#
#==============================================================================
# ▼ 介绍
# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
# 本脚本可以将对话框改变为气泡对话框,使用"BubbleTag"作为气泡标志图片,放在:
# \Graphics\System 文件夹中.
# 需要配合脚本:Yami Engine Ace - Bug修复: 事件ID顺序 一起使用.
#==============================================================================
# ▼ 安装方式
# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
# 打开脚本编辑器,将本脚本拷贝/复制到一个在▼ 插件脚本之下▼ Main之上的新
# 脚本页/槽中.记得保存你的工程以使脚本生效.
#
# -----------------------------------------------------------------------------
# 文本代码 - 可以在文字窗口中使用的代码.
# -----------------------------------------------------------------------------
# 代码: 效果:
# \bm[x] - 在x号事件处显示气泡对话框. *注释
# \cbm - 关闭气泡对话框效果.
#
# *注释: 设定为 0 则会在角色处显示.
#
#==============================================================================
# ▼ 兼容性
# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
# 本脚本仅为RPG Maker VX Ace编写.极不可能在无任何修改的情况下运行于RPG Maker VX.
#
#==============================================================================
module YSE
module POP_MESSAGE
#=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
# - 视觉效果设置 -
#=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
LIMIT = { # 开始.
:limit_width => 0, # 宽度限制,设定为0则无限制.
:limit_line => 6, # 行数限制,设定为0则无限制.
} # 结束.
POSITION = { # 开始.
:x_buffer => 0, #调整气泡对话框的x坐标
:y_buffer => -36, #调整气泡对话框的y坐标
:face_x_buffer => 8, #调整角色肖像图的x坐标
:face_y_buffer => 24, #调整角色肖像图的y坐标
:tag_y_buffer => -6, #调整角色肖像图的y坐标
:name_x_buffer => 112, #调整名称窗口的x坐标,需要脚本 YEA - 文本系统.
} # 结束.
EFFECT = { # 开始.
:fade_face => true, #是否显示角色肖像图淡入效果
:move_face => true, #是否显示角色肖像图移动效果
:use_bubble_tag => true, #是否显示气泡标志图片
:bubble_tag_name => "BubbleTag",#气泡标志图片的文件名
} # 结束.
end
end
#==============================================================================
# ▼ 编辑以下内容可能会出现电脑损坏、死机,电脑主人脑袋爆炸、昏迷、死亡或口臭
# 所以编辑了后果自负。
#==============================================================================
#==============================================================================
# ■ Spriteset_Map
#==============================================================================
class Spriteset_Map
#--------------------------------------------------------------------------
# public instance variables
#--------------------------------------------------------------------------
attr_accessor :character_sprites
end # Spriteset_Map
#==============================================================================
# ■ Window_Message_Face
#==============================================================================
class Window_Message_Face < Window_Base
#--------------------------------------------------------------------------
# initialize
#--------------------------------------------------------------------------
def initialize
super(0, 0, 120, 120)
self.opacity = 0
@face_name = ""
@face_index = 0
@move_x = 0
close
end
#--------------------------------------------------------------------------
# message_window=
#--------------------------------------------------------------------------
def message_window=(window)
@message_window = window
end
#--------------------------------------------------------------------------
# set_face
#--------------------------------------------------------------------------
def set_face
contents.clear
return unless @message_window
if !$game_message.face_name.empty?
draw_face($game_message.face_name, $game_message.face_index, 0, 0)
set_position
show_face
else
hide_face
end
end
#--------------------------------------------------------------------------
# set_position
#--------------------------------------------------------------------------
def set_position
return unless @message_window
self.x = @message_window.x
self.y = @message_window.y - 96
self.x += YSE::POP_MESSAGE::POSITION[:face_x_buffer]
self.y += YSE::POP_MESSAGE::POSITION[:face_y_buffer]
self.y += (@message_window.real_lines - 1) * 24
self.z = @message_window.z + 1
if (@face_name != $game_message.face_name || @face_index != $game_message.face_index)
if YSE::POP_MESSAGE::EFFECT[:move_face]
@move_x = 30
self.x -= 30
end
@face_name = $game_message.face_name
@face_index = $game_message.face_index
self.contents_opacity = 0 if YSE::POP_MESSAGE::EFFECT[:fade_face]
end
end
#--------------------------------------------------------------------------
# show_face
#--------------------------------------------------------------------------
def show_face
open
end
#--------------------------------------------------------------------------
# hide_face
#--------------------------------------------------------------------------
def hide_face
contents.clear
close
end
#--------------------------------------------------------------------------
# update
#--------------------------------------------------------------------------
def update
super
self.contents_opacity += 15 if self.contents_opacity < 255
unless @move_x <= 0
self.x += 2
@move_x -= 2
end
end
end # Sprite_Message_Face
#==============================================================================
# ■ Window_Message
#==============================================================================
class Window_Message < Window_Base
#--------------------------------------------------------------------------
# new method: face_window=
#--------------------------------------------------------------------------
def face_window=(window)
@face_window = window
end
#--------------------------------------------------------------------------
# new method: bubble_tag=
#--------------------------------------------------------------------------
def bubble_tag=(sprite)
@bubble_tag = sprite
end
#--------------------------------------------------------------------------
# new method: message_escape_characters_pop_message
#--------------------------------------------------------------------------
def message_escape_characters_pop_message(result)
result.gsub!(/\ebm\[(\d+)\]/i) { event_pop_message_setup($1.to_i, false) }
result.gsub!(/\ebmf\[(\d+)\]/i) { event_pop_message_setup($1.to_i, true) }
result.gsub!(/\ecbm/i) { event_pop_message_setup(nil, false) }
result
end
#--------------------------------------------------------------------------
# alias method: convert_escape_characters
#--------------------------------------------------------------------------
alias yse_convert_escape_characters_pm convert_escape_characters
def convert_escape_characters(text)
result = yse_convert_escape_characters_pm(text)
result = message_escape_characters_pop_message(result)
result
end
#--------------------------------------------------------------------------
# new method: event_pop_message_setup
#--------------------------------------------------------------------------
def event_pop_message_setup(event_id, follower = false)
if follower && $game_player.followers[event_id].nil?
@event_pop_id = nil
@event_pop_follower = false
return ""
end
@event_pop_follower = follower
@event_pop_id = event_id
return ""
end
#--------------------------------------------------------------------------
# new method: set_face_position
#--------------------------------------------------------------------------
def set_face_position
return unless SceneManager.scene_is?(Scene_Map)
return unless @event_pop_id
return unless @face_window
contents.clear
@face_window.set_face
return unless $imported["YEA-MessageSystem"]
return if @face_window.close?
#@name_window.x = self.x + YSE::POP_MESSAGE::POSITION[:face_x_buffer] + YSE::POP_MESSAGE::POSITION[:name_x_buffer] if (@name_position == 1 || @name_position == 2)
end
#--------------------------------------------------------------------------
# alias method: new_page
#--------------------------------------------------------------------------
alias window_message_new_page_pm_yse new_page
def new_page(text, pos)
window_message_new_page_pm_yse(text, pos)
set_face_position
end
#--------------------------------------------------------------------------
# alias method: close
#--------------------------------------------------------------------------
alias pop_message_close close
def close
pop_message_close
return unless SceneManager.scene_is?(Scene_Map)
return unless @event_pop_id
@event_pop_id = nil
@event_pop_follower = false
@face_window.hide_face
return unless YSE::POP_MESSAGE::EFFECT[:use_bubble_tag]
@bubble_tag.visible = false if @bubble_tag
end
#--------------------------------------------------------------------------
# alias method: open_and_wait
#--------------------------------------------------------------------------
alias pop_message_open_and_wait open_and_wait
def open_and_wait
pop_message_open_and_wait
return unless YSE::POP_MESSAGE::EFFECT[:use_bubble_tag]
@bubble_tag.visible = true if @event_pop_id && @bubble_tag
end
#--------------------------------------------------------------------------
# alias method: process_all_text
#--------------------------------------------------------------------------
alias pop_message_process_all_text process_all_text
def process_all_text
@event_pop_id = nil
convert_escape_characters($game_message.all_text)
update_placement
adjust_pop_message($game_message.all_text)
pop_message_process_all_text
end
#--------------------------------------------------------------------------
# alias method: update_placement
#--------------------------------------------------------------------------
alias event_pop_message_update_placement update_placement
def update_placement
if SceneManager.scene_is?(Scene_Map)
if @event_pop_id.nil?
fix_default_message
event_pop_message_update_placement
elsif @event_pop_id == 0
character = $game_player
self.y = character.screen_y - self.height + YSE::POP_MESSAGE::POSITION[:y_buffer]
self.x = character.screen_x - self.width / 2 + YSE::POP_MESSAGE::POSITION[:x_buffer]
fix_position_bubble(character)
set_bubble_tag(character)
elsif @event_pop_id > 0
hash = @event_pop_follower ? $game_player.followers : $game_map.events
character = hash[@event_pop_id]
self.y = character.screen_y - self.height + YSE::POP_MESSAGE::POSITION[:y_buffer]
self.x = character.screen_x - self.width / 2 + YSE::POP_MESSAGE::POSITION[:x_buffer]
fix_position_bubble(character)
set_bubble_tag(character)
end
else
event_pop_message_update_placement
end
end
#--------------------------------------------------------------------------
# new method: fix_default_message
#--------------------------------------------------------------------------
def fix_default_message
self.width = window_width
self.height = window_height
self.x = 0
@face_window.hide_face if @face_window
create_contents
return unless YSE::POP_MESSAGE::EFFECT[:use_bubble_tag]
@bubble_tag.visible = false if @bubble_tag
end
#--------------------------------------------------------------------------
# new method: fix_position_bubble
#--------------------------------------------------------------------------
def fix_position_bubble(character)
end_x = self.x + self.width
end_y = self.y + self.height
self.x = 0 if self.x < 0
self.y = character.screen_y if self.y < 0
self.x = Graphics.width - self.width if end_x > Graphics.width
self.y = Graphics.height - self.height if end_y > Graphics.height
end
#--------------------------------------------------------------------------
# new method: set_bubble_tag
#--------------------------------------------------------------------------
def set_bubble_tag(character)
return unless YSE::POP_MESSAGE::EFFECT[:use_bubble_tag]
return unless @bubble_tag
up = self.y == character.screen_y
self.y += up ? @bubble_tag.height / 2 : -@bubble_tag.height / 2
@bubble_tag.x = character.screen_x - @bubble_tag.width / 2
if up
@bubble_tag.src_rect.set(0, @bubble_tag.height, @bubble_tag.width, @bubble_tag.height)
@bubble_tag.y = self.y - @bubble_tag.height - YSE::POP_MESSAGE::POSITION[:tag_y_buffer]
else
@bubble_tag.src_rect.set(0, 0, @bubble_tag.width, @bubble_tag.height)
@bubble_tag.y = self.y + self.height + YSE::POP_MESSAGE::POSITION[:tag_y_buffer]
end
end
#--------------------------------------------------------------------------
# new method: cal_number_line
#--------------------------------------------------------------------------
def cal_number_line(text)
result = 0
text.each_line { result += 1 }
return result
end
#--------------------------------------------------------------------------
# new method: cal_width_line
#--------------------------------------------------------------------------
def cal_width_line(text)
result = 0
text.each_line { |line|
result = text_size(line).width if result < text_size(line).width
}
return result
end
#--------------------------------------------------------------------------
# alias method: adjust_message_window_size
#--------------------------------------------------------------------------
if $imported["YEA-MessageSystem"]
alias yse_pop_message_adjust_message_window_size adjust_message_window_size
def adjust_message_window_size
start_name_window if @event_pop_id
return if @event_pop_id
yse_pop_message_adjust_message_window_size
end
end
#--------------------------------------------------------------------------
# new method: adjust_pop_message
#--------------------------------------------------------------------------
def adjust_pop_message(text = " ")
return unless SceneManager.scene_is?(Scene_Map)
unless @event_pop_id
if $imported["YEA-MessageSystem"]
#adjust_message_window_size
end
return
end
n_line = cal_number_line(text)
n_line = YSE::POP_MESSAGE::LIMIT[:limit_line] if YSE::POP_MESSAGE::LIMIT[:limit_line] > 0 && cal_number_line(text) > YSE::POP_MESSAGE::LIMIT[:limit_line]
@real_lines = n_line
self.height = fitting_height(n_line)
self.width = cal_width_line(text) + 24
self.width += new_line_x
if self.width > YSE::POP_MESSAGE::LIMIT[:limit_width] && YSE::POP_MESSAGE::LIMIT[:limit_width] > 0
self.width = YSE::POP_MESSAGE::LIMIT[:limit_width]
end
create_contents
update_placement
end
#--------------------------------------------------------------------------
# overwrite method: new_line_x
#--------------------------------------------------------------------------
def new_line_x
if $game_message.face_name.empty?
return 0
else
result = YSE::POP_MESSAGE::POSITION[:face_x_buffer]
p_x = $imported["YEA-MessageSystem"] ? YEA::MESSAGE::FACE_INDENT_X : 112
result += p_x
return result
end
end
#--------------------------------------------------------------------------
# new method: real_lines
#--------------------------------------------------------------------------
def real_lines
@real_lines
end
end # Window_Message
#==============================================================================
# ■ Scene_Map
#==============================================================================
class Scene_Map < Scene_Base
#--------------------------------------------------------------------------
# alias method: create_message_window
#--------------------------------------------------------------------------
alias yse_pm_create_message_window create_message_window
def create_message_window
yse_pm_create_message_window
@face_window = Window_Message_Face.new
@face_window.message_window = @message_window
if YSE::POP_MESSAGE::EFFECT[:use_bubble_tag]
@bubble_tag_sprite = Sprite.new
@bubble_tag_sprite.visible = false
@bubble_tag_sprite.bitmap = Cache.system(YSE::POP_MESSAGE::EFFECT[:bubble_tag_name])
@bubble_tag_sprite.src_rect.set(0, 0, @bubble_tag_sprite.width, @bubble_tag_sprite.height / 2)
@message_window.bubble_tag = @bubble_tag_sprite
end
@message_window.face_window = @face_window
end
#--------------------------------------------------------------------------
# alias method: dispose_spriteset
#--------------------------------------------------------------------------
alias pop_message_dispose_spriteset dispose_spriteset
def dispose_spriteset
pop_message_dispose_spriteset
return unless @bubble_tag_sprite
@bubble_tag_sprite.dispose
end
end # Scene_Map
#==============================================================================
#
# ▼ End of File
#
#==============================================================================