#==============================================================================
# ★ RGSS3 ★
# 战斗重试失败信息扩展
# 作者:ruigi
# 功能:显示最后对你造成伤害的敌人的自定义备注信息。
# 备注格式:Over:"信息" 或 Over:“信息”(中英文引号均可)
#
# 放置位置:请在脚本列表最底部(Main之前)插入本脚本。
#==============================================================================
module Rokan
module DefeatMessage
DEBUG_MODE = true # 改为 true 可在控制台查看详细信息
end
end
#==============================================================================
# ■ 数据记录模块(直接嵌入 Game_Battler,保证记录)
#==============================================================================
class Game_Battler < Game_BattlerBase
alias :defeat_msg_execute_damage :execute_damage
def execute_damage(user)
defeat_msg_record_last_attacker(user)
defeat_msg_execute_damage(user)
end
def defeat_msg_record_last_attacker(user)
return unless SceneManager.scene_is?(Scene_Battle)
return unless user.is_a?(Game_Enemy) # 仅当攻击者是敌人
return if $game_party.all_dead? # 已全灭不再记录(可选)
scene = SceneManager.scene
scene.instance_variable_set(:@_last_attacker_enemy, user)
if Rokan::DefeatMessage::DEBUG_MODE
p "[记录] 敌人 #{user.name} 造成了伤害,已被记录为最后攻击者"
end
end
end
#==============================================================================
# ■ Scene_Battle(管理记录重置与信息显示)
#==============================================================================
class Scene_Battle < Scene_Base
#--------------------------------------------------------------------------
# ● 开始处理(初始化记录)
#--------------------------------------------------------------------------
alias defeat_msg_start start
def start
defeat_msg_start
@_last_attacker_enemy = nil
end
#--------------------------------------------------------------------------
# ● 回合开始(每回合重置记录)
#--------------------------------------------------------------------------
alias defeat_msg_turn_start turn_start
def turn_start
@_last_attacker_enemy = nil
defeat_msg_turn_start
end
#--------------------------------------------------------------------------
# ● 开始重试选择(显示信息窗口)
#--------------------------------------------------------------------------
alias defeat_msg_start_retry_selection start_retry_selection
def start_retry_selection
create_defeat_message_window if defeat_message_text != ""
defeat_msg_start_retry_selection
end
#--------------------------------------------------------------------------
# ● 放弃战斗(释放窗口)
#--------------------------------------------------------------------------
alias defeat_msg_giveup_battle giveup_battle
def giveup_battle
dispose_defeat_message_window
defeat_msg_giveup_battle
end
#--------------------------------------------------------------------------
# ● 重置战斗(释放窗口)
#--------------------------------------------------------------------------
alias defeat_msg_reset_battle reset_battle
def reset_battle
dispose_defeat_message_window
defeat_msg_reset_battle
end
#--------------------------------------------------------------------------
# ● 结束处理(保险释放)
#--------------------------------------------------------------------------
alias defeat_msg_terminate terminate
def terminate
dispose_defeat_message_window
defeat_msg_terminate
end
#--------------------------------------------------------------------------
# ● 提取失败信息文本
#--------------------------------------------------------------------------
def defeat_message_text
return @defeat_message_text if @defeat_message_text
# 1. 优先最后攻击者
last_enemy = @_last_attacker_enemy
if last_enemy && last_enemy.is_a?(Game_Enemy)
text = extract_over_text(last_enemy.enemy.note)
if text
@defeat_message_text = text
p "[成功] 从最后攻击者 #{last_enemy.name} 提取到信息:#{text}" if Rokan::DefeatMessage::DEBUG_MODE
return text
end
end
# 2. 兜底:遍历当前敌群
$game_troop.members.each do |enemy|
text = extract_over_text(enemy.enemy.note)
if text
@defeat_message_text = text
p "[兜底] 从敌群敌人 #{enemy.name} 提取到信息:#{text}" if Rokan::DefeatMessage::DEBUG_MODE
return text
end
end
@defeat_message_text = ""
end
#--------------------------------------------------------------------------
# ● 从备注中提取 Over 信息(支持中英文引号)
#--------------------------------------------------------------------------
def extract_over_text(note)
# 匹配格式:Over:"内容" 或 Over:“内容”
if note =~ /Over[::]\s*["“](.*?)["”]/
return $1.to_s
end
nil
end
#--------------------------------------------------------------------------
# ● 创建信息窗口
#--------------------------------------------------------------------------
def create_defeat_message_window
@defeat_message_window = Window_DefeatMessage.new(@viewport)
end
#--------------------------------------------------------------------------
# ● 释放信息窗口
#--------------------------------------------------------------------------
def dispose_defeat_message_window
return unless @defeat_message_window
@defeat_message_window.close
update_basic while @defeat_message_window.openness > 0
@defeat_message_window.dispose
@defeat_message_window = nil
end
end
#==============================================================================
# ■ Window_DefeatMessage(信息窗口)
#==============================================================================
class Window_DefeatMessage < Window_Base
def initialize(viewport = nil)
super(0, 0, Graphics.width, fitting_height(1))
self.viewport = viewport
self.z = 200
self.openness = 0
refresh
update_placement
open
end
def update_placement
self.x = 0
self.y = 0
end
def refresh
contents.clear
message = SceneManager.scene.defeat_message_text rescue ""
return if message.empty?
draw_text(contents.rect, message, 1)
end
end