#==============================================================================
# ■ 仿《德尔塔符文》战斗物品动态字幕评价
#==============================================================================
# 作者:瑞吉
# 标签说明:
# 单人:<C:角色ID, I:台词>
# 双人:<C:使用者ID P:队友ID CI:使用者台词 PI:队友台词>
# 多人:<M:使用者ID | US:使用者台词 | 队友ID1:台词1 | 队友ID2:台词2 | ...>
# 适用范围:物品、技能
#==============================================================================
module DataManager
class << self
alias load_database_subtitle_final load_database
end
def self.load_database
load_database_subtitle_final
load_notetags_subtitle_final
end
def self.load_notetags_subtitle_final
[$data_skills, $data_items, $data_weapons, $data_armors].each do |group|
group.each do |obj|
next if obj.nil?
obj.load_notetag_subtitle_final if obj.respond_to?(:load_notetag_subtitle_final)
end
end
end
end
#==============================================================================
# ■ RPG::BaseItem
#==============================================================================
class RPG::BaseItem
attr_accessor :subtitle_map # 单人
attr_accessor :subtitle_pair_map # 双人
attr_accessor :multi_subtitle_map # 多人 { user_id => { user_speech: 台词, targets: { target_id => 台词 } } }
def load_notetag_subtitle_final
@subtitle_map = {}
@subtitle_pair_map = {}
@multi_subtitle_map = {}
# 单人 <C:数字, I:台词>
self.note.scan(/<C:\s*(\d+)\s*[,,]\s*I:\s*(.+?)\s*>/i) do |match|
@subtitle_map[match[0].to_i] = match[1].to_s
end
# 双人 <C:使用者ID P:队友ID CI:台词 PI:台词>
self.note.scan(/<C:\s*(\d+)\s*P:\s*(\d+)\s*CI:\s*(.+?)\s*PI:\s*(.+?)\s*>/i) do |match|
@subtitle_pair_map[[match[0].to_i, match[1].to_i]] = {
ci: match[2].to_s,
pi: match[3].to_s
}
end
# 多人 <M:使用者ID | US:使用者台词 | 队友ID:台词 | ...>
self.note.scan(/<M:\s*(\d+)\s*\|\s*(.+?)\s*>/i) do |match|
user_id = match[0].to_i
content = match[1].to_s
target_map = {}
user_speech = nil
content.split('|').each do |part|
part = part.strip
if part =~ /^US\s*:\s*(.+)/i
user_speech = $1.to_s.strip
elsif part =~ /^(\d+)\s*:\s*(.+)/i
target_map[$1.to_i] = $2.to_s.strip
end
end
@multi_subtitle_map[user_id] = {
user_speech: user_speech,
targets: target_map
}
end
end
def subtitle_for(actor_id)
return @subtitle_map[actor_id] if @subtitle_map.key?(actor_id)
return @subtitle_map[0] if @subtitle_map.key?(0)
nil
end
def pair_subtitle_for(user_id, target_id)
@subtitle_pair_map[[user_id, target_id]]
end
def multi_subtitle_for(user_id)
@multi_subtitle_map[user_id]
end
end
#==============================================================================
# ■ Scene_Battle
#==============================================================================
class Scene_Battle < Scene_Base
alias use_item_subtitle_final use_item
def use_item
@last_used_item = @subject.current_action.item
@last_user = @subject
@last_targets = @subject.current_action.make_targets.compact
use_item_subtitle_final
show_subtitle_final if should_show_subtitle_final?
end
def should_show_subtitle_final?
return false unless @last_used_item.is_a?(RPG::UsableItem)
return false unless @last_used_item.respond_to?(:subtitle_for)
item = @last_used_item
user = @last_user
multi = item.multi_subtitle_for(user.id)
if multi
targets = multi[:targets]
return true if @last_targets.any? { |t| t.is_a?(Game_Actor) && targets.key?(t.id) }
return true if multi[:user_speech] && !multi[:user_speech].empty?
end
@last_targets.each do |t|
return true if t.is_a?(Game_Actor) && item.pair_subtitle_for(user.id, t.id)
end
return true if item.subtitle_for(user.id)
false
end
def show_subtitle_final
item = @last_used_item
user = @last_user
return unless @log_window
# 1. 多人评价
multi_data = item.multi_subtitle_for(user.id)
if multi_data
targets_map = multi_data[:targets]
user_speech = multi_data[:user_speech]
# 使用者台词
if user_speech && !user_speech.empty?
user_name = $game_actors[user.id].name
@log_window.add_text("#{user_name}:#{user_speech}")
wait(30)
end
# 队友台词
shown = false
@last_targets.each do |target|
next unless target.is_a?(Game_Actor)
text = targets_map[target.id]
next unless text
name = $game_actors[target.id].name
@log_window.add_text("#{name}:#{text}")
wait(20)
shown = true
end
if shown || user_speech
wait(30)
return
end
end
# 2. 双人评价
@last_targets.each do |target|
next unless target.is_a?(Game_Actor)
pair = item.pair_subtitle_for(user.id, target.id)
if pair
user_name = $game_actors[user.id].name
target_name = $game_actors[target.id].name
@log_window.add_text("#{user_name}:#{pair[:ci]}\n#{target_name}:#{pair[:pi]}")
wait(60)
return
end
end
# 3. 单人评价
single = item.subtitle_for(user.id)
if single
user_name = $game_actors[user.id].name
@log_window.add_text("#{user_name}:#{single}")
wait(60)
end
end
end