配合バトルリトライ战败重来脚本的失败信息扩展脚本
RUBY 代码#==============================================================================
#★ 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)
returnunless SceneManager.scene_is?(Scene_Battle)
returnunless user.is_a?(Game_Enemy) # 仅当攻击者是敌人
returnif$game_party.all_dead? # 已全灭不再记录(可选)
scene = SceneManager.scene
scene.instance_variable_set(:@_last_attacker_enemy, user)
ifRokan::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_textif@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}"ifRokan::DefeatMessage::DEBUG_MODE
return text
end
end
# 2. 兜底:遍历当前敌群
$game_troop.members.eachdo |enemy|
text = extract_over_text(enemy.enemy.note)
if text
@defeat_message_text = text
p"[兜底] 从敌群敌人 #{enemy.name} 提取到信息:#{text}"ifRokan::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
returnunless@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_textrescue""
returnif message.empty?
draw_text(contents.rect, message, 1)
end
end
本帖来自P1论坛作者Ruigi,因Project1站服务器在国外有时候访问缓慢不方便作者交流学习,经联系P1站长fux2同意署名转载一起分享游戏制作经验,共同为国内独立游戏作者共同创造良好交流环境,原文地址:https://rpg.blue/forum.php?mod=viewthread&tid=498830若有侵权,发帖作者可联系底部站长QQ在线咨询功能删除,谢谢。
页:
[1]