=begin
#==============================================================================
* 闲谈对话框 (Yami 气泡对话框 的插件) - v1.3c
作者: Quack
翻译:nil2018(○┰○)
#==============================================================================
效果:
1-允许你使用"闲谈对话框。和默认对话框区别为,闲谈对话框不会暂停游戏,也不会因为
玩家按下任何按键而关闭,取而代之的是为对话框设定一个计时器,时间到了会自动将
其关闭。还有一个特点是:可以同时显示多个闲谈对话框(有最大显示数量限制,默认
为7,你可以在下面的"MAX_MSGS"中调整最大数)
将普通对话框“变成”闲谈对话框的方法为:在对话框中填入标志:'<cm:X>'
其中X为显示的时间,单位为秒(注意:这个标志必须放在对话框的第一行!!)
将X设定为负值时,对话框就不会消失了。你可以使用脚本来关闭所有闲谈对话框:
clear_chatter
2-说话的气泡标志(bubble message)和原来一样,都是: \bm[x]
新添加了思考(bubble message thought)的气泡标志: \bmt[x]
3-气泡对话框可以在战斗中使用了。可以使用 \bm[x] 或 \bmt[x] 来显示气泡对话框。
如果你要在敌人头上显示气泡对话框,请将x替换为负值.
在战斗中: \bm[1] 显示在1号敌人头上
\bm[-1] 显示在1号角色头上
对于1号敌人,使用 \bm[1] ,4号敌人则使用 \bm[4]
同时,对于角色: 1号角色 = \bm[-1]
然而,要想在战斗中在角色头上显示气泡对话框,需要你使用“显示角色战斗图”的
脚本。我不能保证我的脚本适用于所有该功能的脚本。但我可以保证和Jet's sideview
battlers 相兼容。
有一个问题是,当战斗图的大小过大或过小时,对话框窗口会有些移位。
使用以下标志来调整对话框的位置:
\ox[X] - 调整气泡对话框的x坐标
\oy[X] - 调整气泡对话框的y坐标
有一点需要注意的是,如果你还使用了Yanfly的核心脚本&Yanfly的文本系统,你需要将
核心脚本中的 FONT_NAME 和文本系统的i MESSAGE_WINDOW_FONT_NAME 设定相匹配(两
个地方都要设定相同的字体)否则两个脚本的设定结合起来,有时会使文本的宽度计算
错误。这个问题不大,可是在气泡对话框中,会改变气泡对话框的窗口宽度,这就是个
大问题了(yanfly两个脚本中,关于字体的其他设定例如是否加粗是否斜体等,也最好
设定得一模一样)
版本 1.1 更新功能:
1-添加文本打字音效,你可以在 TEXT_SOUNDS 的哈希表中设定(在下面查看更多地介绍)
使用标志:
<ts:x> 文章打字音x,x为存在于 TEXT_SOUNDS 哈希表中的打字音效名字.
2-添加对话框背景色调的功能。你可以在 WINDOW_TONES 哈希表中预设色调种类
使用标志: <bc:x> ,其中x为存在于 WINDOW_TONES 哈希表中的色调名字.
3-有时,你需要在同一个对话框中显示不同的字体,可能会使对话框变得过大或过小。Sometimes you might want to change font size in your message, multiple times,
使用标志: <pms:x,y> 可以调整气泡对话框的大小.x为宽度变化,y为高度变化
例如,你使用了标志<pms:20,-10> ,则对话框的宽度会增加20,高度会减少10.
4-如果你和我一样,被记忆事件id、书写一大堆标志而困扰,以下功能会帮到你。
仅使用一个标志<bt:x> (对于谈话气泡) 或 <btt:x> (对于思考气泡)
就可以让该事件使用你设定的背景颜色和文本打字音效。
那原理是什么?
举个例子,我有一个作为队伍角色的事件,她叫Emil.在事件名中填入了标志: <emil>.
然后,当我使用了标志: <bt:emil> 或 <btt:emil> 气泡对话框会自动显示到该事件的
头上(如果有多个事件名为<emil>的事件,也会只显示一个对话框),且使用
WINDOW_TONES 中的'emil'作为窗口色调,使用TEXT_SOUNDS中的'emil'作为文本打字音效
但不能用于btt,因为思考中还会有打字音效不是太奇怪了吗?
这也会在你检查事件时,更清楚地明白哪个事件是'emil',而不是去找哪个事件是某某id
如果你想指定用于角色(player) 的话,使用标志'pl',例如:
<bt:pl>
这样就可以使设定窗口色调和打字音效的"打包"设定同时应用于角色了。
或许在队员变化大的情况下不怎么实用,但是我仍然添加了此功能。
如果你很好奇为什么我新添加的标志和以前的不一样...因为!Consistence is overrated
anyway, who needs it? (0.0)
使用标志(<bt:x> & <btt:x>) 需要你安装脚本 Qonvenience (你也许会叫它做
我的'核心' 脚本,类似其他人的 (Yanfly,
Victor, Yami, etc).
你可以在下面的'使用条件'部分找到下载地址.
版本 1.2 更新功能:
- 显示选项时,会根据你使用的是气泡对话框还是普通的对话框而显示不同的样子。
使用默认对话框时,选项的外貌不变。使用气泡对话框时选项会变得更大,且显示在对
话框窗口中.
版本 1.3更新功能:
- 修复了一些肖像图和名称窗口的问题。问题并没有完全解决,因为我自己的工程里并
没有使用名称窗口或肖像图,所以本人并不是很感兴趣去花时间到这些地方。
-和窗口色调、打字音效一样,你现在可以使用标志来显示名称窗口了。
==============================================================================
安装注释:
需要脚本 Yami气泡对话框.
将本脚本放在其之下.
==============================================================================
使用条件:
需要Yami气泡对话框脚本,你可以在这里下载:
[url]https://github.com/suppayami/rmvxa-collection/blob/master/yami-script-ace/10%20-%20Pop%20Message.txt[/url]
同时还需要我的 Qonvenience脚本 ,如果你想使用:<bt:x> 和 <btt:x>的话
在这里下载:
[url]http://pastebin.com/J6haUy5T[/url]
==============================================================================
Credits:
Yami 为 气泡对话框的作者.
==============================================================================
使用条款:
随意使用(没错,包括商业游戏),只要你不声明这个脚本是你自己写的。
同时我也希望你能在使用此脚本时,属名我为脚本的作者。
请记住本脚本必须和Yami的气泡对话框同时使用,其也有自己的使用条款.
==============================================================================
Bugs:
不懂
==============================================================================
History:
11/10/2016 - Fixed some problems added some minor feature.
19/01/2016 - Fixed some bugs, changes to choices when a pop message is used.
14/01/2016 - Chatter messages now last forever if you set the duration to a
negative number. Also added method for clearing all chatter
to use in script calls. Also squashed some bugs.
13/01/2016 - Pretty big update. Added more functionality.
10/01/2016 - Proper release since Absurdiness found the original script so I
could separate the addon from the original.
08/01/2016 - Initial release
=end
$imported = {} if $imported.nil?
$imported["Chatter_Messages"] = true
#==============================================================================
# * 设定
#==============================================================================
module YSE
module POP_MESSAGE
#=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
# - 视觉设定 -
#=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
EFFECT2 = { # 开始.
:bubble_tag_name => "BubbleTag_Speech",
:thought_bubble_tag_name => "BubbleTag_Thought",
} # 结束.
end
end
module QUACK
module MSG
# 闲谈窗口同时显示的最大数量。
# 太少会限制了你的选择,太多会使画面杂乱。
MAX_MSGS = 7
# 在这里设定窗口颜色。
# 格式:
# '名称' => Tone.new(红,绿,蓝,灰度)
# 名称为字符,红绿蓝为数字,范围是 -255~255
# 灰度的范围是 0 到 255. 灰度为可选值,不一定非要写。
WINDOW_TONES = {
#在下面手动添加设定
'土黄' => Tone.new(154,137,108),
'偏红' => Tone.new(85,44,51),
'杰克' => Tone.new(-34,85,102),
'狂人' => Tone.new(68,68,68,10),
'普尔' => Tone.new(102,34,-34),
'爱丽丝' => Tone.new(102,34,51),
# 自己设定更多的
}
# 在这里设定文本打字音效
# 格式:
# '名称' => ["文件名",音量, 最低音调, 最高音调],
# 名称为字符,文件名为音效文件名
# 音量音调为数字,范围是 0-100.
TEXT_SOUNDS = {
#在下面手动添加设定
'0' => nil, # 无任何打字音效的默认值!
'1' => ["Cursor1", 80, 70, 100],
'2' => ["Cursor1", 80, 90, 120],
'3' => ["Knock", 80, 50, 75],
'杰克' => ["Cursor1", 80, 90, 120],
'狂人' => ["Cursor1", 80, 45, 70],
'普尔' => ["Cursor1", 80, 70, 100],
'爱丽丝' => ["Cursor1", 70, 110, 140],
# And above this line
}
NAMES = {
# 设定名称
'1' => "冒险家杰克",
'2' => "疯狂实验员"
}
# 每X个字符播放一次打字音效.
SOUND_PLAY_FREQUENCY = 3
# 气泡对话框是否在使用选项时随着文本显示而逐渐增大,还是立刻显示为最大尺寸
POP_CHOICE_GROW = true
end
end
#==============================================================================
# * SCRIPT START
#==============================================================================
#==============================================================================
# ?! DataManager
#==============================================================================
module DataManager
class << self
alias quack_msg_create_game_objects create_game_objects
def create_game_objects
quack_msg_create_game_objects
if !$imported["YSE-PopMessage"]
msgbox(sprintf("This script(Chatter Messages) requires Yami's Pop Messages to function", "ChatterMessages", 1))
exit
end
$game_message.quack_msg_make
end
end
end
#==============================================================================
# ?! Game_Message
#==============================================================================
class Game_Message
attr_accessor :quack_msgs
attr_accessor :ev_id
# new
def quack_msg_make
@quack_msgs = []
QUACK::MSG::MAX_MSGS.times {@quack_msgs.push(Game_Message.new)}
@quack_msg_ttl = 0
@c_msg = 0
end
# new
def set_ttl(ttl)
@quack_msg_ttl = ttl
end
# new
def ttl_sub
@quack_msg_ttl -= 1 if @quack_msg_ttl > 0
end
# new
def expire?
return false if @quack_msg_ttl < 0
@quack_msg_ttl == 0
end
# new
def prepare_msg(duration)
@quack_msg_ttl = (duration * 60).to_i
end
# new
def fin_msg
@quack_msg_ttl = 0
@c_msg = (@c_msg + 1) % QUACK::MSG::MAX_MSGS
end
# new
def add_chatter(text)
m = @quack_msgs[@c_msg]
m.add(text)
m.face_name = face_name
m.face_index = face_index
m.set_ttl(@quack_msg_ttl)
end
# new
def clear_chatter
@quack_msgs.each {|m| m.set_ttl(0) }
end
# new
def clear_chatter_event(e)
# Find any chatter attached to certain event id and close the chatter
@quack_msgs.each {|m| m.set_ttl(0) if m.ev_id == e }
end
end
#==============================================================================
# ?! Window_Message
#==============================================================================
class Window_Message < Window_Base
# new
def chatter?
false
end
# new
def source
$game_message
end
# overwrite
def standard_padding
return 8
end
# alias
alias quack_chatter_init initialize
def initialize
@msg_tone = $game_system.window_tone
@snd_f = 0
#@name_text = ""
quack_chatter_init
end
# new
def speech_bubble_tag=(sprite)
@speech_bubble_tag = sprite
end
# new
def thought_bubble_tag=(sprite)
@thought_bubble_tag = sprite
end
# new
def set_offset_x(x)
@ox = x
return ""
end
# new
def set_offset_y(y)
@oy = y
return ""
end
# overwrite
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
alias quack_chatter_process_character process_character
def process_character(c, text, pos)
if @snd_f == 0 && !@show_fast && !@text_sound.nil?
Audio.se_play("Audio/SE/"+@text_sound[0],@text_sound[1],@text_sound[2]+rand(@text_sound[3]-@text_sound[2]))
end
@snd_f += 1
@snd_f = 0 if @snd_f == QUACK::MSG::SOUND_PLAY_FREQUENCY
quack_chatter_process_character(c,text,pos)
end
# overwrite
def update_tone
self.tone.set(@msg_tone)
end
# overwrite
def message_escape_characters_pop_message(result)
@msg_tone = $game_system.window_tone
@event_pop_id = nil
set_offset_x(0)
set_offset_y(0)
@text_sound = QUACK::MSG::TEXT_SOUNDS['0']
@msg_size_x = 0
@msg_size_y = 0
reset_font_settings
result.gsub!(/<BT:([^<>]*)>/i) { event_pop_message_setup2($1, false) }
result.gsub!(/<BTT:([^<>]*)>/i) { event_pop_message_setup2($1, true) }
result.gsub!(/\eOX\[([-+]?\d+)\]/i) { set_offset_x($1.to_i) }
result.gsub!(/\eOY\[([-+]?\d+)\]/i) { set_offset_y($1.to_i) }
result.gsub!(/\eBM\[([-+]?\d+)\]/i) { event_pop_message_setup($1.to_i, false) }
result.gsub!(/\eBMT\[([-+]?\d+)\]/i) { event_pop_message_setup($1.to_i, true) }
result.gsub!(/\eBMF\[(\d+)\]/i) { event_pop_message_setup($1.to_i, false, true) }
result.gsub!(/\eCBM/i) { event_pop_message_setup(nil, false) }
result.gsub!(/<BC:([^<>]*)>/i) { @msg_tone = QUACK::MSG::WINDOW_TONES[$1] ;""}
result.gsub!(/<TS:([^<>]*)>/i) { @text_sound = QUACK::MSG::TEXT_SOUNDS[$1]; ""}
result.gsub!(/<PMS:([-+]?\d+),([-+]?\d+)>/i) { @msg_size_x = $1.to_i ;@msg_size_y = $2.to_i; ""}
result
end
# new
def event_pop_message_setup2(tag, thought = false)
if SceneManager.scene_is?(Scene_Battle)
if tag.include?('act')
ev_id = tag[3].to_i
ev_id = (1+$game_party.members.index($game_actors[ev_id])) * -1
@msg_tone = QUACK::MSG::WINDOW_TONES[tag] if QUACK::MSG::WINDOW_TONES.has_key?(tag)
@text_sound = QUACK::MSG::TEXT_SOUNDS[tag] if !thought && QUACK::MSG::TEXT_SOUNDS.has_key?(tag)
else
msgbox(sprintf("无任何事件使用标志: '" + tag + "'.","Chatter Messages",1))
end
return event_pop_message_setup(ev_id, thought)
end
msgbox(sprintf("使用此标志需要你安装Qonvenience.","Chatter Messages",1)) if !$imported["Qonvenience"]
if tag == 'pl'
ev_id = 0
else
ev_id = $game_map.first_event_tag(tag).id
msgbox(sprintf("无任何事件使用标志: '" + tag + "'.","Chatter Messages",1)) if ev_id.nil?
end
@msg_tone = QUACK::MSG::WINDOW_TONES[tag] if QUACK::MSG::WINDOW_TONES.has_key?(tag)
@text_sound = QUACK::MSG::TEXT_SOUNDS[tag] if !thought && QUACK::MSG::TEXT_SOUNDS.has_key?(tag)
namewindow(QUACK::MSG::NAMES[tag], 1) if $imported["YEA-MessageSystem"] && QUACK::MSG::NAMES.has_key?(tag) && @name_text == ""
return event_pop_message_setup(ev_id, thought)
end
# overwrite
def event_pop_message_setup(event_id, thought = false, follower = false)
start_name_window if $imported["YEA-MessageSystem"]
if follower && $game_player.followers[event_id].nil?
@event_pop_id = nil
@event_pop_follower = false
return ""
end
if thought # THOUGHT
@speech_bubble_tag.visible = false
@bubble_tag = @thought_bubble_tag
else # SPEECH
@thought_bubble_tag.visible = false
@bubble_tag = @speech_bubble_tag
end
@event_pop_follower = follower
@event_pop_id = event_id
# close any chatter message currently attached to this event
$game_message.clear_chatter_event(event_id)
source.ev_id = event_id
return ""
end
# overwrite
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
# overwrite
def close
pop_message_close
#return unless SceneManager.scene_is?(Scene_Map)
return unless @event_pop_id
@event_pop_follower = false
@face_window.hide_face
return unless YSE::POP_MESSAGE::EFFECT[:use_bubble_tag]
@speech_bubble_tag.visible = false if @speech_bubble_tag
@thought_bubble_tag.visible = false if @thought_bubble_tag
source.ev_id = nil
end
# overwrite
def process_all_text
@event_pop_id = nil
@name_text = ""
txt = convert_escape_characters($game_message.all_text)
update_placement
adjust_pop_message(txt)#$game_message.all_text)
pop_message_process_all_text
end
# overwrite
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 + @oy - self.height + YSE::POP_MESSAGE::POSITION[:y_buffer]
self.x = character.screen_x + @ox - self.width / 2 + YSE::POP_MESSAGE::POSITION[:x_buffer]
fix_position_bubble(character)
set_bubble_tag(character)
@name_window.update_pos if $imported["YEA-MessageSystem"] && @name_window.open?
@face_window.set_position if !chatter? && @face_window.open?
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 + @oy - self.height + YSE::POP_MESSAGE::POSITION[:y_buffer]
self.x = character.screen_x + @ox - self.width / 2 + YSE::POP_MESSAGE::POSITION[:x_buffer]
fix_position_bubble(character)
set_bubble_tag(character)
@name_window.update_pos if $imported["YEA-MessageSystem"] && @name_window.open?
@face_window.set_position if !chatter? && @face_window.open?
end
else
# IF IN BATTLE
#event_pop_message_update_placement
if @event_pop_id.nil?
fix_default_message
event_pop_message_update_placement
elsif @event_pop_id < 0
battler = $game_party.members[(@event_pop_id * -1)-1]
self.y = battler.screen_y + @oy - self.height + YSE::POP_MESSAGE::POSITION[:y_buffer]
self.x = battler.screen_x + @ox - self.width / 2 + YSE::POP_MESSAGE::POSITION[:x_buffer]
fix_position_bubble(battler)
set_bubble_tag(battler)
@name_window.update_pos if $imported["YEA-MessageSystem"] && @name_window.open?
@face_window.set_position if !chatter? && @face_window.open?
elsif @event_pop_id > 0
battler = $game_troop.members[@event_pop_id-1]
self.y = battler.screen_y + @oy - self.height + YSE::POP_MESSAGE::POSITION[:y_buffer]
self.x = battler.screen_x + @ox - self.width / 2 + YSE::POP_MESSAGE::POSITION[:x_buffer]
fix_position_bubble(battler)
set_bubble_tag(battler)
@name_window.update_pos if $imported["YEA-MessageSystem"] && @name_window.open?
@face_window.set_position if !chatter? && @face_window.open?
end
end
end
# overwrite
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]
@speech_bubble_tag.visible = false if @speech_bubble_tag
@thought_bubble_tag.visible = false if @thought_bubble_tag
end
# overwrite
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 + @oy if self.y < 0
self.y = -99 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
# overwrite
def set_bubble_tag(character)
return unless YSE::POP_MESSAGE::EFFECT[:use_bubble_tag]
return unless @bubble_tag
up = self.y == character.screen_y + @oy
if self.y == -99
self.y = 0
up = true
end
self.y += up ? @bubble_tag.height / 2 : -@bubble_tag.height / 2
@bubble_tag.x = character.screen_x + @ox - @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
@bubble_tag.z = self.z + 1000
end
# overwrite
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.height += @msg_size_y
self.width = cal_width_line(text) + 10
self.width += @msg_size_x
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
if $game_message.choice? && !QUACK::MSG::POP_CHOICE_GROW
dy = fitting_height($game_message.choices.size) - 16
self.y -= dy - 16
self.height += dy - 16
@face_window.y -= dy - 16
@name_window.y -= dy - 16 if $imported["YEA-MessageSystem"]
end
# If a chatter message with face graphic, force height to be at least big enough to show the face.
if chatter? && !source.face_name.empty?
self.height = [self.height, 86].max
end
create_contents
update_placement
end
# alias
alias yse_pop_dispose dispose
def dispose
@speech_bubble_tag.visible = false if @speech_bubble_tag
@thought_bubble_tag.visible = false if @thought_bubble_tag
yse_pop_dispose
end
# alias
alias chatter_msg_input_choice input_choice
def input_choice
if !close? && pop_message? && QUACK::MSG::POP_CHOICE_GROW
f = Fiber.new { add_room_for_choices }
@choice_window.visible = false
@choice_window.set_fiber(f)
f.resume
end
chatter_msg_input_choice
end
# new
def add_room_for_choices
q = fitting_height($game_message.choices.size) - 16
i = 0
while true
i += 4
self.y -= 4
self.height += 4
@face_window.y -= 4
@name_window.y -= 4 if $imported["YEA-MessageSystem"]
break if i >= q
Fiber.yield
end
@choice_window.visible = true
@choice_window.set_fiber(nil)
end
# new
def pop_message?
@event_pop_id
end
end
#==============================================================================
# ?! Window_ChoiceList
#==============================================================================
class Window_ChoiceList < Window_Command
# alias
alias chatter_msg_init initialize
def initialize(message_window)
chatter_msg_init(message_window)
self.opacity = 0
self.z = 20070
end
# new
def set_fiber(fiber)
@fiber = fiber
end
# alias
alias chatter_msg_update update
def update
chatter_msg_update
@fiber.resume if @fiber
end
# alias
alias chatter_msg_update_placement update_placement
def update_placement
if @message_window.pop_message?
self.opacity = 0
self.width = @message_window.width-26 + padding * 2
self.width = [width, Graphics.width].min
self.height = fitting_height($game_message.choices.size)
self.x = @message_window.x
self.y = @message_window.y+@message_window.height-self.height+6
else
self.opacity = 255
chatter_msg_update_placement
end
end
end
class Window_NameMessage < Window_Base
#def hide_me
# self.x = 99999
# self.y = 99999
#end
end
#==============================================================================
# ■ Window_NameMessage
#==============================================================================
class Window_NameMessage < Window_Base
# alias
alias quack_msg_name_init initialize
def initialize(message_window)
quack_msg_name_init(message_window)
self.z += 2
end
# new
def update_pos
set_x_position(1)
#set_y_position
self.y = @message_window.y - self.height / 1.25
self.y = 0 if self.y < 0
end
# overwrite
# self.y = @message_window.height
# self.y -= YEA::MESSAGE::NAME_WINDOW_Y_BUFFER
#else
# self.y = @message_window.y - self.height / 1.25
# self.y += YEA::MESSAGE::NAME_WINDOW_Y_BUFFER
#end
end
#==============================================================================
# ¡ Window_Message_Face
#==============================================================================
class Window_Message_Face < Window_Base
alias quack_msg_face_pos set_position
def set_position
quack_msg_face_pos
self.y -= 4
end
end
#==============================================================================
# ?! Window_Quack_Message
#==============================================================================
class Window_Quack_Message < Window_Message
attr_accessor :active
# overwrite
def initialize(msg_source, zz)
super()
self.z = zz
@quack_msg_source = msg_source
@active = false
@background = 0
self.opacity = 255
self.visible = false
clear_name_window if $imported["YEA-MessageSystem"]
end
# overwrite
def chatter?
true
end
# overwrite
def source
@quack_msg_source
end
# overwrite
def update
if @quack_msg_source.busy?
if @quack_msg_source.expire?
close
else
self.visible = true if !self.visible
@quack_msg_source.ttl_sub
end
end
self.visible = false if self.visible && close?
super
end
# overwrite
def update_placement
return if @closing
super
end
# overwrite
def update_show_fast
return false
end
# overwrite
def process_all_text
@event_pop_id = nil
text = convert_escape_characters(@quack_msg_source.all_text)
update_placement
adjust_pop_message(text)
open_and_wait
#text = convert_escape_characters(@quack_msg_source.all_text)
pos = {}
new_page(text, pos)
process_character(text.slice!(0, 1), text, pos) until text.empty? || close?
end
# overwrite
def close
pop_message_close #super
return unless @event_pop_id
return unless YSE::POP_MESSAGE::EFFECT[:use_bubble_tag]
@speech_bubble_tag.visible = false if @speech_bubble_tag
@thought_bubble_tag.visible = false if @thought_bubble_tag
source.ev_id = nil
@name_text = ""
end
# overwrite
def input_pause
self.pause = true
wait(10)
Fiber.yield until close?
self.pause = false
end
# overwrite
def update_fiber
if @fiber
@fiber.resume
elsif @quack_msg_source.busy?
@fiber = Fiber.new { fiber_main }
@fiber.resume
else
@quack_msg_source.visible = false
end
end
def fiber_main
@quack_msg_source.visible = true
#update_background
update_placement
loop do
process_all_text if @quack_msg_source.has_text?
process_input
@quack_msg_source.clear
@name_window.start_close if $imported["YEA-MessageSystem"]
Fiber.yield
break unless text_continue?
end
close_and_wait
@quack_msg_source.visible = false
@fiber = nil
end
#def update_background
# @background = @quack_msg_source.background
# self.opacity = @background == 0 ? 255 : 0
#end
def process_input
input_pause unless @pause_skip
end
def text_continue?
@quack_msg_source.has_text?# && !settings_changed?
end
def settings_changed?
#@background != $game_message.background ||
#@position != @quack_msg_source.position
false
end
def new_page(text, pos)
contents.clear
draw_face(@quack_msg_source.face_name, @quack_msg_source.face_index, 0, 0)
reset_font_settings
pos[:x] = new_line_x
pos[:y] = 0
pos[:new_x] = new_line_x
pos[:height] = calc_line_height(text)
clear_flags
end
def new_line_x
@quack_msg_source.face_name.empty? ? 0 : 112
end
# overwrite
def input_pause
#self.pause = true
wait(10)
Fiber.yield until @quack_msg_source.expire? #Input.trigger?(:B) || Input.trigger?(:C)
#Input.update
#self.pause = false
end
# overwrite
def create_all_windows
@name_window = Window_NameMessage.new(self) if $imported["YEA-MessageSystem"]
end
# overwrite
def dispose_all_windows
@name_window.dispose if $imported["YEA-MessageSystem"]
end
# overwrite
def update_all_windows
if $imported["YEA-MessageSystem"]
@name_window.update
@name_window.back_opacity = self.back_opacity
@name_window.opacity = self.opacity
end
end
# overwrite
def event_pop_message_update_placement
end
# overwrite
def all_close?
close? && (!$imported["YEA-MessageSystem"] || @name_window.close?)
end
if $imported["YEA-MessageSystem"]
def close_and_wait
@name_window.force_close
window_message_close_and_wait_ams
end
end
end
#==============================================================================
# ?! Scene_Map
#==============================================================================
class Scene_Map < Scene_Base
# alias
alias quack_msg_update update
def update
@quack_msgs.each {|m|
m.update
if m.open?
m.update_placement
end
}
@message_window.update_placement if @message_window.open?
quack_msg_update
end
# overwrite
def create_message_window
yse_pm_create_message_window
@face_window = Window_Message_Face.new
@face_window.message_window = @message_window
if @bubble_tag_sprite || @thought_bubble_tag_sprite
@bubble_tag_sprite.dispose
@thought_bubble_tag_sprite.dispose
end
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::EFFECT2[:bubble_tag_name])
@bubble_tag_sprite.src_rect.set(0, 0, @bubble_tag_sprite.width, @bubble_tag_sprite.height / 2)
@message_window.speech_bubble_tag = @bubble_tag_sprite
@thought_bubble_tag_sprite = Sprite.new
@thought_bubble_tag_sprite.visible = false
@thought_bubble_tag_sprite.bitmap = Cache.system(YSE::POP_MESSAGE::EFFECT2[:thought_bubble_tag_name])
@thought_bubble_tag_sprite.src_rect.set(0, 0, @thought_bubble_tag_sprite.width, @thought_bubble_tag_sprite.height / 2)
@message_window.thought_bubble_tag = @thought_bubble_tag_sprite
end
@message_window.face_window = @face_window
quack_msg_create_msg
end
# new
def quack_msg_create_msg
unless @quack_msgs.nil?
@quack_msgs.each {|m| m.dispose}
@quack_msg_speech_bubble_sprites.each {|s| s.dispose}
@quack_msg_thought_bubble_sprites.each {|s| s.dispose}
end
@quack_msgs = []
@quack_faces = []
@quack_msg_speech_bubble_sprites = []
@quack_msg_thought_bubble_sprites = []
QUACK::MSG::MAX_MSGS.times do |i|
qm = Window_Quack_Message.new($game_message.quack_msgs[i], 200-QUACK::MSG::MAX_MSGS+i)
@quack_msgs.push(qm)
ss = Sprite.new
ss.visible = false
ss.bitmap = Cache.system(YSE::POP_MESSAGE::EFFECT2[:bubble_tag_name])
ss.src_rect.set(0, 0, ss.width, ss.height / 2)
qm.speech_bubble_tag = ss
ts = Sprite.new
ts.visible = false
ts.bitmap = Cache.system(YSE::POP_MESSAGE::EFFECT2[:thought_bubble_tag_name])
ts.src_rect.set(0, 0, ts.width, ts.height / 2)
qm.thought_bubble_tag = ts
end
end
# overwrite
def dispose_spriteset
pop_message_dispose_spriteset
#@quack_msg_speech_bubble_sprites.each {|s| s.dispose}
#@quack_msg_thought_bubble_sprites.each {|s| s.dispose}
#return unless @bubble_tag_sprite || @thought_bubble_tag_sprite
#@bubble_tag_sprite.dispose
#@thought_bubble_tag_sprite.dispose
end
# alias
#alias quack_msg_dispose_all_windows dispose_all_windows
#def dispose_all_windows
# @quack_msgs.each {|m| m.dispose}
# quack_msg_dispose_all_windows
#end
end
#==============================================================================
# ?! Scene_Battle
#==============================================================================
class Scene_Battle
alias quack_update_basic update_basic
def update_basic
quack_update_basic
@quack_msgs.each {|m|
m.update
if m.open?
m.update_placement
end
}
end
alias yse_pop_create_message_window create_message_window
def create_message_window
yse_pop_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::EFFECT2[:bubble_tag_name])
@bubble_tag_sprite.src_rect.set(0, 0, @bubble_tag_sprite.width, @bubble_tag_sprite.height / 2)
@message_window.speech_bubble_tag = @bubble_tag_sprite
@thought_bubble_tag_sprite = Sprite.new
@thought_bubble_tag_sprite.visible = false
@thought_bubble_tag_sprite.bitmap = Cache.system(YSE::POP_MESSAGE::EFFECT2[:thought_bubble_tag_name])
@thought_bubble_tag_sprite.src_rect.set(0, 0, @thought_bubble_tag_sprite.width, @thought_bubble_tag_sprite.height / 2)
@message_window.thought_bubble_tag = @thought_bubble_tag_sprite
end
@message_window.face_window = @face_window
quack_create_message_window
end
def quack_create_message_window
@quack_msgs = []
@quack_msg_speech_bubble_sprites = []
@quack_msg_thought_bubble_sprites = []
QUACK::MSG::MAX_MSGS.times do |i|
qm = Window_Quack_Message.new($game_message.quack_msgs[i], 200-QUACK::MSG::MAX_MSGS+i)
@quack_msgs.push(qm)
ss = Sprite.new
ss.visible = false
ss.bitmap = Cache.system(YSE::POP_MESSAGE::EFFECT2[:bubble_tag_name])
ss.src_rect.set(0, 0, ss.width, ss.height / 2)
qm.speech_bubble_tag = ss
ts = Sprite.new
ts.visible = false
ts.bitmap = Cache.system(YSE::POP_MESSAGE::EFFECT2[:thought_bubble_tag_name])
ts.src_rect.set(0, 0, ts.width, ts.height / 2)
qm.thought_bubble_tag = ts
end
end
alias yse_pop_dispose_spriteset dispose_spriteset
def dispose_spriteset
yse_pop_dispose_spriteset
@quack_msg_speech_bubble_sprites.each {|s| s.dispose}
@quack_msg_thought_bubble_sprites.each {|s| s.dispose}
return unless @bubble_tag_sprite || @thought_bubble_tag_sprite
@bubble_tag_sprite.dispose
@thought_bubble_tag_sprite.dispose
end
alias quack_msg_dispose_all_windows dispose_all_windows
def dispose_all_windows
@quack_msgs.each {|m| m.dispose}
quack_msg_dispose_all_windows
end
end
#==============================================================================
# ?! Game_Interpreter
#==============================================================================
class Game_Interpreter
def command_101
item = $data_items[20]
if $imported["YEA-MessageSystem"]
wait_for_message
$game_message.face_name = @params[0]
$game_message.face_index = @params[1]
$game_message.background = @params[2]
$game_message.position = @params[3]
startindex = @index+1
textline = @list[startindex].parameters[0].dup
chatdur = 0
textline.gsub!(/<cm:([^<>]*)>/i) { chatdur = $1.to_i;"" }
$game_message.prepare_msg(chatdur) if chatdur != 0
while continue_message_string?
@index += 1
if @list[@index].code == 401
textline = @list[@index].parameters[0] unless @index == startindex
if chatdur != 0; $game_message.add_chatter(textline)
else; $game_message.add(textline)
end
end
break if $game_message.texts.size >= Variable.message_rows
end
case next_event_code
when 102
@index += 1
setup_choices(@list[@index].parameters)
when 103
@index += 1
setup_num_input(@list[@index].parameters)
when 104
@index += 1
setup_item_choice(@list[@index].parameters)
end
$game_message.fin_msg if chatdur != 0
wait_for_message
else
wait_for_message
$game_message.face_name = @params[0]
$game_message.face_index = @params[1]
$game_message.background = @params[2]
$game_message.position = @params[3]
startindex = @index+1
textline = @list[startindex].parameters[0].dup
chatdur = 0
textline.gsub!(/<cm:([^<>]*)>/i) { chatdur = $1.to_i;"" }
$game_message.prepare_msg(chatdur) if chatdur != 0
while next_event_code == 401 # Text data
@index += 1
textline = @list[@index].parameters[0] unless @index == startindex
if chatdur != 0; $game_message.add_chatter(textline)
else; $game_message.add(textline)
end
end
case next_event_code
when 102 # Show Choices
@index += 1
setup_choices(@list[@index].parameters)
when 103 # Input Number
@index += 1
setup_num_input(@list[@index].parameters)
when 104 # Select Item
@index += 1
setup_item_choice(@list[@index].parameters)
end
$game_message.fin_msg if chatdur != 0
wait_for_message
end
end
# new
def clear_chatter
$game_message.clear_chatter
end
end
#==============================================================================
#
# ?\ End of File
#
#==============================================================================