じ☆ve冰风 发表于 2026-4-17 00:01:14

配合バトルリトライ战败重来脚本的失败信息扩展脚本

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]
查看完整版本: 配合バトルリトライ战败重来脚本的失败信息扩展脚本