#============================================================================== # ■ 仿《德尔塔符文》战斗物品动态字幕评价 #============================================================================== # 作者:瑞吉 # 标签说明: # 单人:<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
_DYL(]WOCDO(~H51_E0AKHV.png (47.75 KB, 下载次数: 11)
M$$_EZXXO637X@(C4A@~Y2I.png (29.83 KB, 下载次数: 16)
]2})}I%FFADH3[U7XDYI9HO.png (28.44 KB, 下载次数: 16)
52Q7[Z`MBL`BPNHRCAR6HE7.png (30.07 KB, 下载次数: 12)
7`34}R1JHFQ`39)L5@7{K5J.png (34.1 KB, 下载次数: 16)
(G0Y9B%%W7[Z]8(MH2]J9YQ.png (31.46 KB, 下载次数: 15)
9FCOKU69)_F%O})][A)`~H3.png (44.72 KB, 下载次数: 17)
| 欢迎光临 Project1 (https://rpg.blue/) | Powered by Discuz! X3.1 |