查看: 759|回复: 0

[原创发布] 配合バトルリトライ战败重来脚本的失败信息扩展脚本

[复制链接]
梦石
1
星屑
1184
在线时间
59 小时
注册时间
2023-9-8
回帖
19
发表于 2026-4-17 00:10:49 | 显示全部楼层 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有账号?注册会员

×
本帖最后由 Ruigi 于 2026-4-17 00:37 编辑

[pre lang="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)
    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[/pre]
]2S)_TH)CZ}($9_ZOI6PML7.png
9E0NR})Z2W(WH~LIU)@BTEL.png
HWQ8Z%FNPA)N@~[~M%YUPOU.png
%FM210H8CPI`%2UY@1)Y15S.png
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部