查看: 7925|回复: 8

[已经解决] RMVA横版战斗脚本 最新版

[复制链接]
梦石
0
星屑
50
在线时间
49 小时
注册时间
2012-8-20
回帖
46
发表于 2012-8-25 21:20:46 | 显示全部楼层 |阅读模式

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

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

×
RT
我是新手,并告诉我放在哪里?谢了
梦石
0
星屑
803
在线时间
2068 小时
注册时间
2011-10-3
回帖
1620
发表于 2012-8-25 21:24:54 | 显示全部楼层
1.jpg

“插件脚本”前,“MAIN”后

评分

参与人数 1星屑 +40 收起 理由
风雪优游 + 40 我很赞同

查看全部评分

回复

使用道具 举报

梦石
0
星屑
23
在线时间
585 小时
注册时间
2012-7-3
回帖
2097
发表于 2012-8-26 08:29:52 | 显示全部楼层
首先找到 1.png 打开或则看F11也可打开。再次.. 2.png 移动到最下面..把脚本插入红色圈圈内复制..即可..(原红色圈圈内没有我加的脚本)
最后设置脚本规定的人物..即可。
回复

使用道具 举报

梦石
0
星屑
50
在线时间
49 小时
注册时间
2012-8-20
回帖
46
 楼主| 发表于 2012-8-26 09:31:18 | 显示全部楼层
爱尔伯塔 发表于 2012-8-26 08:29
首先找到打开或则看F11也可打开。再次..移动到最下面..把脚本插入红色圈圈内复制..即可..(原红色圈圈内没 ...

那请问脚本是什么啊?

点评

噗  发表于 2012-8-26 19:39
回复

使用道具 举报

梦石
0
星屑
23
在线时间
585 小时
注册时间
2012-7-3
回帖
2097
发表于 2012-8-26 09:33:50 | 显示全部楼层
许家航 发表于 2012-8-26 09:31
那请问脚本是什么啊?

你不是有RMVA横版战斗脚本嘛..你有着这个就是脚本..
回复

使用道具 举报

梦石
0
星屑
50
在线时间
49 小时
注册时间
2012-8-20
回帖
46
 楼主| 发表于 2012-8-26 09:44:34 | 显示全部楼层
爱尔伯塔 发表于 2012-8-26 09:33
你不是有RMVA横版战斗脚本嘛..你有着这个就是脚本..

我没有脚本


‘‘──许家航于2012-8-26 09:44补充以下内容:

我没有脚本
’’
回复

使用道具 举报

梦石
0
星屑
23
在线时间
585 小时
注册时间
2012-7-3
回帖
2097
发表于 2012-8-26 09:57:06 | 显示全部楼层
许家航 发表于 2012-8-26 09:44
我没有脚本

[pre lang="ruby" line="1"]#==============================================================================
# ■ 此脚本来自 www.66rpg.com
#------------------------------------------------------------------------------
#   名称:横版战斗模板
#   作者:后知后觉(hzhj.tnt@163.com)
#   版本:v1.7  2012-02-09
#   使用协议:在保留此脚本相关信息的情况下
#             可任意使用、修改及修改后发布.
#             如是修改后发布.请在作者标注那里加上 某某某改 等信息
#             感谢你来这里谈谈你对这个工程的看法或报告BUG.
#               http://rpg.blue/thread-216673-1-1.html
#   使用说明:
#       请来发布帖查看:
#           http://rpg.blue/thread-216673-1-1.html
#==============================================================================

module Hzhj
  module HorizontalBattleSystem
    # 取得参战角色的最大数.如果要改大.需要在下面的坐标设置里增加对应的条目
    MaxBattleMembers = 4
   
    ActorsBattlePosition = {}
    # 设置角色战斗图形的坐标
    # 等号左边的[]号里面的1 2 3 4 表示角色在队伍里的位置
    # 等号右边的[]号里面的两个数字分别表示 X坐标 Y坐标
    # 每次进入战斗的时候都会以这里设置的信息作为初始化位置.
    # 如果你把上面的 MaxBattleMembers 改大了.比如改成了 5.
    # 那么你需要在下面新增一行代码设置队伍中第5位置的坐标.
    # 就像这样 ActorsBattlePosition[5] = [X坐标, Y坐标]
    ActorsBattlePosition[1] = [378, 228]
    ActorsBattlePosition[2] = [422, 272]
    ActorsBattlePosition[3] = [466, 228]
    ActorsBattlePosition[4] = [510, 272]
   
    # 设置伤害值图形的色相 取值范围 0~360
    DamageBitmapHue = 0
    # 伤害值分段显示的标志SE文件名
    DamageSectionDisplaySEName = "DamageSection"
   
    # 动画 Z 坐标值默认变化量
    DefaultAniAddZ = 768
   
    # 状态动画 Z 坐标值默认变化量
    DefaultLoopAniAddZ = 20
   
    # 战斗中角色的面向
    ActorDirection = 4
   
    # 真位移的帧数
    RealMoveDuration = 20
    # 真位移移动前会计算目标点.会获取攻防双方战斗图大小来进行计算.
    # 下面2个是对战斗图 width height 进行修正.
    # 为正则扩大 为负则缩小.单位 像素.
    # 一般来说不必修改.只有像梦幻群侠传那种战斗图四边有很多透明区域时才修正.
    RealMoveBmpAddW = 0
    RealMoveBmpAddH = 0
   
    # 使用技能、物品的过程默认使用RMVA模式
    # 在该模式下.本脚本提供的很多功能受限无法使用.
    DefaultUseRmvaMode = false
   
    # 默认显示敌人的HP条、MP条、TP条
    DefaultDisplayEnemyBar = true
   
    # 一张战斗图中有几个样式(帧、格)
    DynamicPatternMax = 4
    # 一张战斗图中的一个样式持续多少帧
    OnePatternDuration = 15
   
    # 角色使用战斗死亡图形
    UseActorDeadGraphic = true
    # 敌人使用战斗死亡图形
    UseEnemyDeadGraphic = false
   
    # 使用挨打图形
    UseBeatenGraphic = true
    # 挨打图形维持帧数
    BeatenGraphicDuration = 30
   
    # 是否使用角色防御图 只有同时使用了挨打图.此项才有效.
    UseActorGuardGraphic = true
    # 是否使用敌人防御图 只有同时使用了挨打图.此项才有效.
    UseEnemyGuardGraphic = false
   
    # 角色是否使用挨打SE
    UseActorWBSE = true
    # 敌人是否使用挨打SE
    UseEnemyWBSE = true
    # 角色是否使用防御SE
    UseActorGDSE = true
    # 敌人是否使用防御SE
    UseEnemyGDSE = false
  end
end

class RPG::Actor < RPG::BaseItem
  def battler_name
    return @battler_name unless @battler_name.nil?
    if /@btname\[(.+?)\]/ =~ @note
      return (@battler_name = $1.clone)
    else
      return (@battler_name = "#{@name}_#{@nickname}")
    end
  end
  def battler_hue
    return @battler_hue unless @battler_hue.nil?
    if /@bthue\[([0-9]+?)\]/ =~ @note
      return (@battler_hue = $1.to_i.abs)
    else
      return (@battler_hue = 0)
    end
  end
  attr_writer :battler_name
  attr_writer :battler_hue
end
#==============================================================================
# ■ Game_Actor
#==============================================================================
class Game_Actor < Game_Battler
  #--------------------------------------------------------------------------
  # ● 属性(新增定义)
  #--------------------------------------------------------------------------
  attr_writer   :battler_name             # 战斗图形文件名
  attr_writer   :battler_hue              # 战斗图形色相
  #--------------------------------------------------------------------------
  # ● 设置(追加定义)
  #--------------------------------------------------------------------------
  alias hzhj_old_setup_for_add_actor_battle_graphic setup
  def setup(actor_id)
    hzhj_old_setup_for_add_actor_battle_graphic(actor_id)
    @battler_name = actor.battler_name
    @battler_hue = actor.battler_hue
  end
  #--------------------------------------------------------------------------
  # ● 是否使用活动块(重定义)
  #--------------------------------------------------------------------------
  def use_sprite?
    return true
  end
  #--------------------------------------------------------------------------
  # ● 取得战斗画面 X 坐标(新增定义)
  #--------------------------------------------------------------------------
  def screen_x
    return ActorsBattlePosition[index + 1][0]
  end
  #--------------------------------------------------------------------------
  # ● 取得战斗画面 Y 坐标(新增定义)
  #--------------------------------------------------------------------------
  def screen_y
    return ActorsBattlePosition[index + 1][1]
  end
  #--------------------------------------------------------------------------
  # ● 取得战斗画面 Z 坐标(新增定义)
  #--------------------------------------------------------------------------
  def screen_z
    return real_screen_y + 100
  end
end
#==============================================================================
# ■ Game_Enemy
#==============================================================================
class Game_Enemy < Game_Battler
  #--------------------------------------------------------------------------
  # ● 属性(新增定义)
  #--------------------------------------------------------------------------
  attr_writer   :battler_name             # 战斗图形文件名
  attr_writer   :battler_hue              # 战斗图形色相
  #--------------------------------------------------------------------------
  # ● 取得战斗画面 Z 坐标(重定义)
  #--------------------------------------------------------------------------
  def screen_z
    return real_screen_y + 100
  end
end
#==============================================================================
# ■ Game_Party
#==============================================================================
class Game_Party < Game_Unit
  include Hzhj::HorizontalBattleSystem
  #--------------------------------------------------------------------------
  # ● 取得参战角色的最大数(重定义)
  #--------------------------------------------------------------------------
  def max_battle_members
    return MaxBattleMembers
  end
end

class RPG::Animation
  def wait_subject_duration
    return @wait_subject_duration unless @wait_subject_duration.nil?
    if /@w\[(\-??\d+?)\]/ =~ @name
      @wait_subject_duration = $1.to_i
    else
      @wait_subject_duration = 0
    end
    return @wait_subject_duration
  end
  attr_writer :wait_subject_duration
end
class RPG::UsableItem < RPG::BaseItem
  include Hzhj::HorizontalBattleSystem
  def animation1_id
    return @animation1_id unless @animation1_id.nil?
    if /@a1id\[(\d+?)\]/i =~ @note
      return (@animation1_id = $1.to_i)
    else
      return (@animation1_id = 0)
    end
  end
  def wljn
    return @wljn unless @wljn.nil?
    if /@wljn/i =~ @note
      return (@wljn = true)
    else
      return (@wljn = false)
    end
  end
  def rmva_mode
    return @rmva_mode unless @rmva_mode.nil?
    if /@rmva/i =~ @note
      return (@rmva_mode = !DefaultUseRmvaMode)
    else
      return (@rmva_mode = DefaultUseRmvaMode)
    end
  end
  attr_writer :animation1_id
  attr_writer :wljn
  attr_writer :rmva_mode
end
class RPG::Weapon < RPG::EquipItem
  def animation1_id
    return @animation1_id unless @animation1_id.nil?
    if /@a1id\[(\d+?)\]/ =~ @note
      return (@animation1_id = $1.to_i)
    else
      return (@animation1_id = 0)
    end
  end
  attr_writer :animation1_id
end
class RPG::Enemy < RPG::BaseItem
  def animation1_id
    return @animation1_id unless @animation1_id.nil?
    if /@a1id\[(\d+?)\]/ =~ @note
      return (@animation1_id = $1.to_i)
    else
      return (@animation1_id = 0)
    end
  end
  def animation2_id
    return @animation2_id unless @animation2_id.nil?
    if /@a2id\[(\d+?)\]/ =~ @note
      return (@animation2_id = $1.to_i)
    else
      return (@animation2_id = 0)
    end
  end
  def animation3_id
    return @animation3_id unless @animation3_id.nil?
    if /@a3id\[(\d+?)\]/ =~ @note
      return (@animation3_id = $1.to_i)
    else
      return (@animation3_id = 0)
    end
  end
  attr_writer :animation1_id
  attr_writer :animation2_id
  attr_writer :animation3_id
end
#==============================================================================
# ■ Game_Actor
#==============================================================================
class Game_Actor < Game_Battler
  #--------------------------------------------------------------------------
  # ● 取得普通攻击的行动方动画 ID (新增定义)
  #--------------------------------------------------------------------------
  def animation1_id
    if dual_wield?
      return weapons[0].animation1_id if weapons[0]
      return weapons[1] ? weapons[1].animation1_id : 0
    else
      return weapons[0] ? weapons[0].animation1_id : 0
    end
  end
end
#==============================================================================
# ■ Game_Enemy
#==============================================================================
class Game_Enemy < Game_Battler
  #--------------------------------------------------------------------------
  # ● 取得普通攻击的行动方动画 ID (新增定义)
  #--------------------------------------------------------------------------
  def animation1_id
    return enemy.animation1_id
  end
  #--------------------------------------------------------------------------
  # ● 取得普通攻击的动画 ID (新增定义)
  #--------------------------------------------------------------------------
  def atk_animation_id1
    return enemy.animation2_id
  end
  #--------------------------------------------------------------------------
  # ● 取得普通攻击的动画 ID (二刀流:武器2)(新增定义)
  #--------------------------------------------------------------------------
  def atk_animation_id2
    return enemy.animation3_id
  end
end
#==============================================================================
# ■ Scene_Battle
#==============================================================================
class Scene_Battle < Scene_Base
  include Hzhj::HorizontalBattleSystem
  #--------------------------------------------------------------------------
  # ● 使用技能/物品(重定义)
  #--------------------------------------------------------------------------
  def use_item
    item = @subject.current_action.item
    @log_window.display_use_item(@subject, item)
    @subject.use_item(item)
    refresh_status
    targets = @subject.current_action.make_targets.compact
    show_animation(targets, item.animation_id)
  end
  #--------------------------------------------------------------------------
  # ● 显示动画(重定义)
  #--------------------------------------------------------------------------
  def show_animation(targets, animation_id)
    item = @subject.current_action.item
    if item.rmva_mode
      show_rmva_animation(targets, animation_id, item)
    else
      show_hzhj_animation(targets, animation_id, item)
    end
  end
  #--------------------------------------------------------------------------
  # ● RMVA模式显示动画(新增定义)
  #--------------------------------------------------------------------------
  def show_rmva_animation(targets, animation_id, item)
    @subject.damage_section_displayed = false
    @subject.not_damage_section = true
    targets.each do |target|
      target.damage_section_displayed = false
      target.not_damage_section = true
    end
    if animation_id < 0
      show_attack_animation(targets)
    else
      show_rmva_usable_animation(targets, animation_id, item)
    end
  end
  #--------------------------------------------------------------------------
  # ● HZHJ模式显示动画(新增定义)
  #--------------------------------------------------------------------------
  def show_hzhj_animation(targets, animation_id, item)
    if animation_id < 0
      show_hzhj_attack_animation(targets, item)
    else
      if item.wljn
        show_wljn_skill_animation(targets, animation_id, item)
      else
        show_magic_skill_animation(targets, animation_id, item)
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● HZHJ模式显示攻击动画(重定义)
  #--------------------------------------------------------------------------
  def show_hzhj_attack_animation(targets, item)
    ary = []
    need_move = false
    animation1 = $data_animations[@subject.animation1_id]
    need_move = animation1.need_move if animation1
    come_back = true
    targets.each_with_index do |target, i|
      ary[0] = target
      item.repeats.times do
        next if target.dead? && item.damage.type == 1
        next if @subject.dead?
        next if !@subject.current_action
        if need_move && come_back
          come_back = false
          @subject.setup_move_info(target, RealMoveDuration, animation1.move_se)
          wait_for_move
        end
        damage_target = hzhj_apply_item_effects(target, item)
        show_subject_animation(@subject.animation1_id)
        show_normal_animation(ary, @subject.atk_animation_id1, false)
        show_normal_animation(ary, @subject.atk_animation_id2, true)
        @log_window.wait
        wait_for_animation
        hzhj_invoke_item(target, item, damage_target)
      end
      if need_move
        if target != targets[i+1] or target.dead?
          come_back = true
          @subject.come_back_self_position(RealMoveDuration)
          wait_for_move
        else
          come_back = false
        end
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● HZHJ模式显示物理技能类动画(新增定义)
  #--------------------------------------------------------------------------
  def show_wljn_skill_animation(targets, animation_id, item)
    ary = []
    need_move = false
    animation1 = $data_animations[item.animation1_id]
    need_move = animation1.need_move if animation1
    come_back = true
    targets.each_with_index do |target, i|
      ary[0] = target
      item.repeats.times do
        next if target.dead? && item.damage.type == 1
        next if @subject.dead?
        next if !@subject.current_action
        if need_move && come_back
          come_back = false
          @subject.setup_move_info(target, RealMoveDuration, animation1.move_se)
          wait_for_move
        end
        damage_target = hzhj_apply_item_effects(target, item)
        show_subject_animation(item.animation1_id)
        show_normal_animation(ary, animation_id, false)
        @log_window.wait
        wait_for_animation
        hzhj_invoke_item(target, item, damage_target)
      end
      if need_move
        if target != targets[i+1] or target.dead?
          come_back = true
          @subject.come_back_self_position(RealMoveDuration)
          wait_for_move
        else
          come_back = false
        end
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● HZHJ模式显示魔法技能类动画(新增定义)
  #--------------------------------------------------------------------------
  def show_magic_skill_animation(targets, animation_id, item)
    ary = []
    damage_targets = {}
    item.repeats.times do
      next if @subject.dead?
      next if !@subject.current_action
      ary.clear
      damage_targets.clear
      targets.each do |target|
        next if target.dead? && item.damage.type == 1
        ary << target
        damage_targets[target] = hzhj_apply_item_effects(target, item)
      end
      next if ary.empty?
      show_subject_animation(item.animation1_id)
      show_normal_animation(ary, animation_id)
      @log_window.wait
      wait_for_animation
      ary.each do |target|
        hzhj_invoke_item(target, item, damage_targets[target])
      end
      if [9, 10].include?(item.scope)
        ary.each do |target|
          if target.alive?
            target.come_back_self_position(RealMoveDuration)
          end
        end
        wait_for_move
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● RMVA模式显示攻击动画(重定义)
  #--------------------------------------------------------------------------
  def show_attack_animation(targets)
    item = @subject.current_action.item
    show_subject_animation(@subject.animation1_id)
    show_normal_animation(targets, @subject.atk_animation_id1, false)
    show_normal_animation(targets, @subject.atk_animation_id2, true)
    @log_window.wait
    wait_for_animation
    targets.each {|target| item.repeats.times { invoke_item(target, item) } }
  end
  #--------------------------------------------------------------------------
  # ● RMVA模式显示技能、物品动画 (新增定义)
  #--------------------------------------------------------------------------
  def show_rmva_usable_animation(targets, animation_id, item)
    show_subject_animation(item.animation1_id)
    show_normal_animation(targets, animation_id)
    @log_window.wait
    wait_for_animation
    targets.each {|target| item.repeats.times { invoke_item(target, item) } }
    if [9, 10].include?(item.scope)
      targets.each do |target|
        if target.alive?
          target.come_back_self_position(RealMoveDuration)
        end
      end
      wait_for_move
    end
  end
  #--------------------------------------------------------------------------
  # ● 显示行动方动画(新增定义)
  #--------------------------------------------------------------------------
  def show_subject_animation(animation_id, subject = @subject, mirror = false)
    animation = $data_animations[animation_id]
    if animation
      subject.animation_id = animation_id
      subject.animation_mirror = mirror
      if animation.wait_subject_duration < 0
        wait_for_animation
      elsif animation.wait_subject_duration > 0
        animation.wait_subject_duration.times{update_for_wait}
      end
    end
  end
end

class RPG::Animation
  include Hzhj::HorizontalBattleSystem
  def ani_z_correction
    return @ani_z_correction unless @ani_z_correction.nil?
    if /@az\[(\-??\d+?)\]/ =~ @name
      return (@ani_z_correction = $1.to_i)
    else
      return (@ani_z_correction = DefaultAniAddZ)
    end
  end
  def loop_z_correction
    return @loop_z_correction unless @loop_z_correction.nil?
    if /@lz\[(\-??\d+?)\]/ =~ @name
      return (@loop_z_correction = $1.to_i)
    else
      return (@loop_z_correction = DefaultLoopAniAddZ)
    end
  end
  attr_writer :ani_z_correction
  attr_writer :loop_z_correction
end
class RPG::State < RPG::BaseItem
  def animation_id
    return @animation_id unless @animation_id.nil?
    if /@aid\[(\d+?)\]/ =~ @note
      return (@animation_id = $1.to_i)
    else
      return (@animation_id = 0)
    end
  end
  attr_writer :animation_id
end
#==============================================================================
# ■ Game_BattlerBase
#==============================================================================
class Game_BattlerBase
  #--------------------------------------------------------------------------
  # ● 实例变量(新增定义)
  #--------------------------------------------------------------------------
  attr_reader   :hzhj_add_state_id
  attr_reader   :hzhj_remove_state_id
  attr_accessor :need_update_state_animation
  #--------------------------------------------------------------------------
  # ● 初始化(追加定义)
  #--------------------------------------------------------------------------
  alias hzhj_old_init_for_state_ani_game_battler_base initialize
  def initialize
    @hzhj_add_state_id = []
    @hzhj_remove_state_id = []
    @need_update_state_animation = false
    @states = []
    @state_turns = {}
    @state_steps = {}
    hzhj_old_init_for_state_ani_game_battler_base
  end
  #--------------------------------------------------------------------------
  # ● 清除状态信息(追加定义)
  #--------------------------------------------------------------------------
  alias hzhj_old_clear_states_for_state_ani_game_battler_base clear_states
  def clear_states
    old_states = @states.clone
    hzhj_old_clear_states_for_state_ani_game_battler_base
    bingji = old_states | @states
    return if bingji.empty?
    set_add_state_id(bingji & @states)
    set_remove_state_id(bingji & old_states)
  end
  #--------------------------------------------------------------------------
  # ● 消除状态(追加定义)
  #--------------------------------------------------------------------------
  alias hzhj_old_erase_state_for_state_ani_game_battler_base erase_state
  def erase_state(state_id)
    old_states = @states.clone
    hzhj_old_erase_state_for_state_ani_game_battler_base(state_id)
    bingji = old_states | @states
    return if bingji.empty?
    set_add_state_id(bingji & @states)
    set_remove_state_id(bingji & old_states)
  end
  #--------------------------------------------------------------------------
  # ● 设置增加的状态(新增定义)
  #--------------------------------------------------------------------------
  def set_add_state_id(zjdzt)
    for i in zjdzt
      if $data_states.animation_id > 0
        if not @hzhj_add_state_id.include?(i)
          @hzhj_add_state_id.push(i)
        end
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● 设置解除的状态(新增定义)
  #--------------------------------------------------------------------------
  def set_remove_state_id(jsdzt)
    for i in jsdzt
      if $data_states.animation_id > 0
        if not @hzhj_remove_state_id.include?(i)
          ani_id = $data_states.animation_id
          not_end_loop_animation = false
          for state in self.states
            if state.animation_id == ani_id
              not_end_loop_animation = true
              break
            end
          end
          unless not_end_loop_animation
            @hzhj_remove_state_id.push(i)
          end
        end
      end
    end
  end
end
#==============================================================================
# ■ Game_Battler
#==============================================================================
class Game_Battler < Game_BattlerBase
  #--------------------------------------------------------------------------
  # ● 附加新的状态(追加定义)
  #--------------------------------------------------------------------------
  alias hzhj_old_add_new_state_for_state_ani_game_battler add_new_state
  def add_new_state(state_id)
    old_states = @states.clone
    hzhj_old_add_new_state_for_state_ani_game_battler(state_id)
    bingji = old_states | @states
    return if bingji.empty?
    set_add_state_id(bingji & @states)
    set_remove_state_id(bingji & old_states)
  end
end
#==============================================================================
# ■ Sprite_Base
#==============================================================================
class Sprite_Base < Sprite
  #--------------------------------------------------------------------------
  # ● 初始化(追加定义)
  #--------------------------------------------------------------------------
  alias hzhj_old_init_for_state_ani_spr_base initialize
  def initialize(*args)
    hzhj_old_init_for_state_ani_spr_base(*args)
    @hzhj_loop_animations = []
    @hzhj_loop_durations = {}
    @hzhj_loop_sprites = {}
    @hzhj_loop_bitmap1s = {}
    @hzhj_loop_bitmap2s = {}
    @hzhj_loop_ani_oxs = {}
    @hzhj_loop_ani_oys = {}
    @flash_nil_duration = 0
  end
  #--------------------------------------------------------------------------
  # ● 释放(追加定义)
  #--------------------------------------------------------------------------
  alias hzhj_old_dispose_for_state_ani_spr_base dispose
  def dispose
    dispose_loop_animation
    hzhj_old_dispose_for_state_ani_spr_base
  end
  #--------------------------------------------------------------------------
  # ● 设定动画的活动块(追加定义)
  #--------------------------------------------------------------------------
  alias hzhj_old_ani_set_spr_for_state_ani_spr_base animation_set_sprites
  def animation_set_sprites(*args)
    hzhj_old_ani_set_spr_for_state_ani_spr_base(*args)
    @ani_sprites.each{|sprite|sprite.z += @animation.ani_z_correction}
  end
  #--------------------------------------------------------------------------
  # ● 判断是否有循环动画(新增定义)
  #--------------------------------------------------------------------------
  def loop_animation?
    return (not @hzhj_loop_animations.empty?)
  end
  #--------------------------------------------------------------------------
  # ● 开始播放循环动画(新增定义)
  #--------------------------------------------------------------------------
  def start_loop_animation(animation)
    return if @hzhj_loop_animations.include?(animation)
    if animation.nil?
      dispose_loop_animation
      return
    end
    set_animation_rate
    @hzhj_loop_animations.push(animation)
    init_loop_animation_duration(animation)
    load_loop_animation_bitmap(animation)
    make_loop_animation_sprites(animation)
    set_loop_animation_origin(animation)
  end
  #--------------------------------------------------------------------------
  # ● 初始化循环动画播放位置(新增定义)
  #--------------------------------------------------------------------------
  def init_loop_animation_duration(animation)
    @hzhj_loop_durations[animation] = animation.frame_max * @ani_rate + 1
  end
  #--------------------------------------------------------------------------
  # ● 读取循环动画图像(新增定义)
  #--------------------------------------------------------------------------
  def load_loop_animation_bitmap(animation)
    animation1_name = animation.animation1_name
    animation1_hue = animation.animation1_hue
    animation2_name = animation.animation2_name
    animation2_hue = animation.animation2_hue
    bitmap1 = Cache.animation(animation1_name, animation1_hue)
    bitmap2 = Cache.animation(animation2_name, animation2_hue)
    if @@_reference_count.include?(bitmap1)
      @@_reference_count[bitmap1] += 1
    else
      @@_reference_count[bitmap1] = 1
    end
    if @@_reference_count.include?(bitmap2)
      @@_reference_count[bitmap2] += 1
    else
      @@_reference_count[bitmap2] = 1
    end
    @hzhj_loop_bitmap1s[animation] = bitmap1
    @hzhj_loop_bitmap2s[animation] = bitmap2
    Graphics.frame_reset
  end
  #--------------------------------------------------------------------------
  # ● 生成循环动画活动块(新增定义)
  #--------------------------------------------------------------------------
  def make_loop_animation_sprites(animation)
    sprites = []
    if @use_sprite
      16.times do
        sprite = ::Sprite.new(viewport)
        sprite.visible = false
        sprites.push(sprite)
      end
    end
    @hzhj_loop_sprites[animation] = sprites
  end
  #--------------------------------------------------------------------------
  # ● 设定循环动画的原点(新增定义)
  #--------------------------------------------------------------------------
  def set_loop_animation_origin(animation)
    if animation.position == 3
      if viewport == nil
        ani_ox = Graphics.width / 2
        ani_oy = Graphics.height / 2
      else
        ani_ox = viewport.rect.width / 2
        ani_oy = viewport.rect.height / 2
      end
    else
      ani_ox = x - ox + width / 2
      ani_oy = y - oy + height / 2
      if animation.position == 0
        ani_oy -= height / 2
      elsif animation.position == 2
        ani_oy += height / 2
      end
    end
    @hzhj_loop_ani_oxs[animation] = ani_ox
    @hzhj_loop_ani_oys[animation] = ani_oy
  end
  #--------------------------------------------------------------------------
  # ● 释放所有循环动画(新增定义)
  #--------------------------------------------------------------------------
  def dispose_loop_animation
    return unless loop_animation?
    for animation in @hzhj_loop_animations.clone
      end_loop_animation(animation)
    end
    @hzhj_loop_durations.clear
    @hzhj_loop_sprites.clear
    @hzhj_loop_bitmap1s.clear
    @hzhj_loop_bitmap2s.clear
    @hzhj_loop_ani_oxs.clear
    @hzhj_loop_ani_oys.clear
    @hzhj_loop_animations.clear
  end
  #--------------------------------------------------------------------------
  # ● 结束某个循环动画(新增定义)
  #--------------------------------------------------------------------------
  def end_loop_animation(animation)
    return if not @hzhj_loop_animations.include?(animation)
    bitmap1 = @hzhj_loop_bitmap1s[animation]
    @@_reference_count[bitmap1] -= 1
    if @@_reference_count[bitmap1] == 0
      @@_reference_count.delete(bitmap1)
      bitmap1.dispose
    end
    bitmap2 = @hzhj_loop_bitmap2s[animation]
    @@_reference_count[bitmap2] -= 1
    if @@_reference_count[bitmap2] == 0
      @@_reference_count.delete(bitmap2)
      bitmap2.dispose
    end
    sprites = @hzhj_loop_sprites[animation]
    for sprite in sprites
      sprite.dispose
    end
    @hzhj_loop_durations.delete(animation)
    @hzhj_loop_sprites.delete(animation)
    @hzhj_loop_bitmap1s.delete(animation)
    @hzhj_loop_bitmap2s.delete(animation)
    @hzhj_loop_ani_oxs.delete(animation)
    @hzhj_loop_ani_oys.delete(animation)
    @hzhj_loop_animations.delete(animation)
  end
  #--------------------------------------------------------------------------
  # ● 刷新(追加定义)
  #--------------------------------------------------------------------------
  alias hzhj_old_update_for_state_ani_spr_base update
  def update
    hzhj_old_update_for_state_ani_spr_base
    update_loop_animation
  end
  #--------------------------------------------------------------------------
  # ● 刷新循环动画(新增定义)
  #--------------------------------------------------------------------------
  def update_loop_animation
    @flash_nil_duration -= 1 if @flash_nil_duration > 0
    return unless loop_animation?
    for animation in @hzhj_loop_animations
      @hzhj_loop_durations[animation] -= 1
      duration = @hzhj_loop_durations[animation]
      if duration % @ani_rate == 0
        if duration > 0
          set_loop_animation_origin(animation)
          frame_index = animation.frame_max
          frame_index -= (duration + @ani_rate - 1) / @ani_rate
          args = []
          args[0] = @hzhj_loop_sprites[animation]
          args[1] = @hzhj_loop_bitmap1s[animation]
          args[2] = @hzhj_loop_bitmap2s[animation]
          args[3] = @hzhj_loop_ani_oxs[animation]
          args[4] = @hzhj_loop_ani_oys[animation]
          args[5] = animation.loop_z_correction
          args[6] = ((not flash_nil? or animation.to_screen?) and visible)
          loop_animation_set_sprites(animation.frames[frame_index], args)
          animation.timings.each do |timing|
            loop_animation_process_timing(timing) if timing.frame == frame_index
          end
        else
          init_loop_animation_duration(animation)
          redo
        end
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● 设定循环动画的活动块(新增定义)
  #--------------------------------------------------------------------------
  def loop_animation_set_sprites(frame, args)
    sprites = args[0]
    bitmap1 = args[1]
    bitmap2 = args[2]
    ani_ox = args[3]
    ani_oy = args[4]
    loop_z_correction = args[5]
    state_visible = args[6]
    cell_data = frame.cell_data
    sprites.each_with_index do |sprite, i|
      next unless sprite
      pattern = cell_data[i, 0]
      if !pattern || pattern < 0
        sprite.visible = false
        next
      end
      sprite.bitmap = pattern < 100 ? bitmap1 : bitmap2
      sprite.visible = state_visible
      sprite.src_rect.set(pattern % 5 * 192,
        pattern % 100 / 5 * 192, 192, 192)
      sprite.x = ani_ox + cell_data[i, 1]
      sprite.y = ani_oy + cell_data[i, 2]
      sprite.angle = cell_data[i, 4]
      sprite.mirror = (cell_data[i, 5] == 1)
      if loop_z_correction > 9999
        sprite.z = loop_z_correction % 10000 + i
      elsif loop_z_correction < -9999
        sprite.z = loop_z_correction % -10000 + i
      else
        sprite.z = self.z + loop_z_correction + i
      end
      sprite.ox = 96
      sprite.oy = 96
      sprite.zoom_x = cell_data[i, 3] / 100.0
      sprite.zoom_y = cell_data[i, 3] / 100.0
      sprite.opacity = cell_data[i, 6] * self.opacity / 255.0
      sprite.blend_type = cell_data[i, 7]
    end
  end
  #--------------------------------------------------------------------------
  # ● 循环动画SE 和闪烁时机的处理(新增定义)
  #--------------------------------------------------------------------------
  def loop_animation_process_timing(timing)
    timing.se.play
    case timing.flash_scope
    when 1
      self.flash(timing.flash_color, timing.flash_duration * @ani_rate)
    when 2
      if viewport
        viewport.flash(timing.flash_color, timing.flash_duration * @ani_rate)
      end
    when 3
      self.flash(nil, timing.flash_duration * @ani_rate)
    end
  end
  #--------------------------------------------------------------------------
  # ● 设置闪烁(追加定义)
  #--------------------------------------------------------------------------
  alias hzhj_old_flash_for_state_ani_spr_base flash
  def flash(*args)
    if args[0].nil?
      @flash_nil_duration = args[1]
    else
      @flash_nil_duration = 0
    end
    hzhj_old_flash_for_state_ani_spr_base(*args)
  end
  #--------------------------------------------------------------------------
  # ● 判断是否正处于【隐藏目标】(新增定义)
  #--------------------------------------------------------------------------
  def flash_nil?
    return (@flash_nil_duration > 0)
  end
end
#==============================================================================
# ■ Sprite_Battler
#==============================================================================
class Sprite_Battler < Sprite_Base
  #--------------------------------------------------------------------------
  # ● 初始化(追加定义)
  #--------------------------------------------------------------------------
  alias hzhj_old_init_for_state_ani_spr_battler initialize
  def initialize(*args)
    hzhj_old_init_for_state_ani_spr_battler(*args)
    init_battler_add_state_id
  end
  #--------------------------------------------------------------------------
  # ● 初始化战斗者要播放状态动画的状态(新增定义)
  #--------------------------------------------------------------------------
  def init_battler_add_state_id
    if @battler.nil?
      dispose_loop_animation
    else
      @battler.hzhj_add_state_id.clear
      @battler.hzhj_remove_state_id.clear
      @battler.need_update_state_animation = true
      for state in @battler.states
        next if state.nil?
        next if $data_animations[state.animation_id].nil?
        @battler.hzhj_add_state_id.push(state.id)
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● 设置战斗者(追加定义)
  #--------------------------------------------------------------------------
  alias hzhj_old_battlerdy_for_state_ani_spr_battler battler=
  def battler=(value)
    old_battler = @battler
    hzhj_old_battlerdy_for_state_ani_spr_battler(value)
    if old_battler != @battler
      init_battler_add_state_id
    end
  end
  #--------------------------------------------------------------------------
  # ● 刷新(追加定义)
  #--------------------------------------------------------------------------
  alias hzhj_old_update_for_state_ani_spr_battler update
  def update
    hzhj_old_update_for_state_ani_spr_battler
    if @battler
      if @battler.need_update_state_animation
        @battler.need_update_state_animation = false
        if not @battler.hzhj_add_state_id.empty?
          for i in @battler.hzhj_add_state_id
            if @battler.state?(i)
              ani_id = $data_states.animation_id
              animation = $data_animations[ani_id]
              start_loop_animation(animation) if not animation.nil?
            end
          end
          @battler.hzhj_add_state_id.clear
        end
        if not @battler.hzhj_remove_state_id.empty?
          for i in @battler.hzhj_remove_state_id
            if not @battler.state?(i)
              ani_id = $data_states.animation_id
              animation = $data_animations[ani_id]
              end_loop_animation(animation) if not animation.nil?
            end
          end
          @battler.hzhj_remove_state_id.clear
        end
      end
    end
  end
end
#==============================================================================
# ■ Window_BattleLog
#==============================================================================
class Window_BattleLog < Window_Selectable
  #--------------------------------------------------------------------------
  # ● 显示状态附加/解除(追加定义)
  #--------------------------------------------------------------------------
  alias hzhj_old_display_status_for_state_ani_wnd_btlog display_changed_states
  def display_changed_states(target)
    target.need_update_state_animation = true
    hzhj_old_display_status_for_state_ani_wnd_btlog(target)
  end
end

#==============================================================================
# ■ Sprite_Damage (新增类)
#==============================================================================
class Sprite_Damage < Sprite
  include Hzhj::HorizontalBattleSystem
  #--------------------------------------------------------------------------
  # ● 获取/生成伤害值源图
  #--------------------------------------------------------------------------
  @@obmp = nil
  def self.obmp
    if @@obmp.nil? or @@obmp.disposed?
      @@obmp = Bitmap.new(180, 256)
      @@obmp.font.bold = true
      @@obmp.font.shadow = false
      @@obmp.font.outline = true
      @@obmp.font.out_color = Color.new(255, 255, 255, 255)
      @@obmp.font.size = 32
      colors = []
      colors.push(Color.new(255,   0,   0, 255))
      colors.push(Color.new(255, 128, 128, 255))
      colors.push(Color.new(  0,   0, 255, 255))
      colors.push(Color.new(128, 128, 255, 255))
      colors.push(Color.new(  0, 255,   0, 255))
      colors.push(Color.new(128, 255, 128, 255))
      colors.each_with_index do |color, hi|
        @@obmp.font.color = color
        for wi in 0..9
          @@obmp.draw_text(wi * 18, hi * 32, 18, 32, "#{wi}", 1)
        end
      end
      @@obmp.font.size = 20
      @@obmp.font.italic = true
      @@obmp.font.out_color = Color.new(0, 0, 0, 255)
      @@obmp.font.color = Color.new(255, 255, 255, 255)
      @@obmp.draw_text( 0, 192, 90, 32, "Critical", 1)
      @@obmp.draw_text(90, 192, 90, 32, "Miss", 1)
      @@obmp.draw_text( 0, 224, 90, 32, "Evasion", 1)
      @@obmp.hue_change(DamageBitmapHue)
    end
    return @@obmp
  end
  #--------------------------------------------------------------------------
  # ● 初始化
  #--------------------------------------------------------------------------
  def initialize(viewport, args)
    super(viewport)
    @type = args[0]
    @value = args[1]
    @critical = args[2]
    self.x = args[4]
    self.y = args[5]
    self.z = args[6] + Graphics.height * 5
    make_move(args[3])
    refresh
  end
  #--------------------------------------------------------------------------
  # ● 生成移动数据
  #--------------------------------------------------------------------------
  def make_move(battler_obj_class)
    @move = []
    case battler_obj_class
    when :actor
      make_move_actor
    when :enemy
      make_move_enemy
    else
      make_move_default
    end
  end
  #--------------------------------------------------------------------------
  # ● 生成移动数据 默认
  #--------------------------------------------------------------------------
  def make_move_default
    45.times do |n|
      if n % 3 == 0
        ady = n < 21 ? -6 : -1
        opa = n < 21 ? 255 : 255-(n-21)*6
        @move.push([0, ady, opa])
      else
        @move.push([0, 0, -1])
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● 生成移动数据 角色
  #--------------------------------------------------------------------------
  def make_move_actor
    make_move_default
  end
  #--------------------------------------------------------------------------
  # ● 生成移动数据 敌人
  #--------------------------------------------------------------------------
  def make_move_enemy
    make_move_default
  end
  #--------------------------------------------------------------------------
  # ● 描绘
  #--------------------------------------------------------------------------
  def refresh
    if not self.bitmap.nil?
      self.bitmap.dispose
      self.bitmap = nil
    end
    begin
      @obmp = Cache.animation("damage", DamageBitmapHue)
    rescue Errno::ENOENT
      @obmp = Sprite_Damage.obmp
    end
    @numw = @obmp.width / 10
    @numh = @obmp.height / 8
    @strw = @obmp.width / 2
    case @value
    when Numeric
      blt_obmp_numeric
    when Symbol
      blt_obmp_text
    end
  end
  #--------------------------------------------------------------------------
  # ● 通过源图描绘数字
  #--------------------------------------------------------------------------
  def blt_obmp_numeric
    nums = @value.to_i.abs.to_s.split("")
    nbmpw = nums.size * @numw
    bmph = @numh
    cbmpw = 0
    crect = nil
    dy = 0
    if @critical
      cbmpw = @strw
      bmph *= 2
      crect = Rect.new(0, @numh * 6, @strw, @numh)
      dy = @numh
    end
    self.bitmap = Bitmap.new([nbmpw, cbmpw, 32].max, [bmph, 32].max)
    self.ox = bitmap.width / 2
    self.oy = bmph /2
    bitmap.blt((bitmap.width - cbmpw) / 2, 0, @obmp, crect) if crect
    dx = (bitmap.width - nbmpw) / 2
    ry = 0
    case @type
    when :hp
      ry = @value >= 0 ? 0 : @numh
    when :mp
      ry = @value >= 0 ? @numh * 2 : @numh * 3
    when :tp
      ry = @value >= 0 ? @numh * 4 : @numh * 5
    else
      return
    end
    rect = Rect.new(0, ry, @numw, @numh)
    nums.each_with_index do |str, i|
      rect.x = str.to_i * @numw
      bitmap.blt(dx, dy, @obmp, rect)
      dx += @numw
    end
  end
  #--------------------------------------------------------------------------
  # ● 通过源图描绘文字
  #--------------------------------------------------------------------------
  def blt_obmp_text
    self.bitmap = Bitmap.new([@strw, 32].max, [@numh, 32].max)
    self.ox = @strw / 2
    self.oy = @numh / 2
    rx = ry = 0
    case @type
    when :miss
      rx = @strw
      ry = @numh * 6
    when :eva
      ry = @numh * 7
    else
      return
    end
    rect = Rect.new(rx, ry, @strw, @numh)
    bitmap.blt(0, 0, @obmp, rect)
  end
  #--------------------------------------------------------------------------
  # ● 释放
  #--------------------------------------------------------------------------
  def dispose
    bitmap.dispose if bitmap
    super
  end
  #--------------------------------------------------------------------------
  # ● 移动中判定
  #--------------------------------------------------------------------------
  def moving?
    return (not @move.empty?)
  end
  #--------------------------------------------------------------------------
  # ● 刷新
  #--------------------------------------------------------------------------
  def update
    super
    if moving?
      ary = @move.shift
      self.x += ary[0]
      self.y += ary[1]
      self.opacity = ary[2] if ary[2] >= 0
    end
  end
end
#==============================================================================
# ■ Game_BattlerBase
#==============================================================================
class Game_BattlerBase
  #--------------------------------------------------------------------------
  # ● 实例变量(新增定义)
  #--------------------------------------------------------------------------
  attr_accessor :hzhj_damage
  #--------------------------------------------------------------------------
  # ● 初始化(追加定义)
  #--------------------------------------------------------------------------
  alias hzhj_old_init_for_display_damage_game_battler_base initialize
  def initialize
    @hzhj_damage = []
    hzhj_old_init_for_display_damage_game_battler_base
  end
end
#==============================================================================
# ■ Sprite_Base
#==============================================================================
class Sprite_Base < Sprite
  #--------------------------------------------------------------------------
  # ● 初始化(追加定义)
  #--------------------------------------------------------------------------
  alias hzhj_old_init_for_display_damage_spr_base initialize
  def initialize(*args)
    hzhj_old_init_for_display_damage_spr_base(*args)
    @hzhj_damage_sprites = []
  end
  #--------------------------------------------------------------------------
  # ● 释放(追加定义)
  #--------------------------------------------------------------------------
  alias hzhj_old_dispose_for_display_damage_spr_base dispose
  def dispose
    hzhj_old_dispose_for_display_damage_spr_base
    dispose_damage
  end
  #--------------------------------------------------------------------------
  # ● 判断是否有伤害在显示(新增定义)
  #--------------------------------------------------------------------------
  def damage?
    return (not @hzhj_damage_sprites.empty?)
  end
  #--------------------------------------------------------------------------
  # ● 开始显示伤害(新增定义)
  #--------------------------------------------------------------------------
  def start_damage(args)
    args[4] = x - ox + width / 2
    args[5] = y - oy + height / 2
    args[6] = z
    @hzhj_damage_sprites.push(Sprite_Damage.new(viewport, args))
  end
  #--------------------------------------------------------------------------
  # ● 释放所有伤害显示(新增定义)
  #--------------------------------------------------------------------------
  def dispose_damage
    return unless damage?
    @hzhj_damage_sprites.each{|sprite|sprite.dispose}
    @hzhj_damage_sprites.clear
  end
  #--------------------------------------------------------------------------
  # ● 刷新(追加定义)
  #--------------------------------------------------------------------------
  alias hzhj_old_update_for_display_damage_spr_base update
  def update
    hzhj_old_update_for_display_damage_spr_base
    update_damage
  end
  #--------------------------------------------------------------------------
  # ● 刷新显示伤害(新增定义)
  #--------------------------------------------------------------------------
  def update_damage
    return unless damage?
    @hzhj_damage_sprites.each_with_index do |sprite, i|
      if sprite.moving?
        sprite.update
      else
        sprite.dispose
        @hzhj_damage_sprites = nil
      end
    end
    @hzhj_damage_sprites.delete(nil)
  end
end
#==============================================================================
# ■ Sprite_Battler
#==============================================================================
class Sprite_Battler < Sprite_Base
  #--------------------------------------------------------------------------
  # ● 刷新(追加定义)
  #--------------------------------------------------------------------------
  alias hzhj_old_update_for_display_damage_spr_battler update
  def update
    hzhj_old_update_for_display_damage_spr_battler
    if @battler
      if not @battler.hzhj_damage.empty?
        unless @battler.damage_section_displayed
          args = @battler.hzhj_damage.clone
          args[3] = @battler.actor? ? :actor : (@battler.enemy? ? :enemy : nil)
          start_damage(args)
        end
        @battler.hzhj_damage.clear
      end
    end
  end
end
#==============================================================================
# ■ Window_BattleLog
#==============================================================================
class Window_BattleLog < Window_Selectable
  #--------------------------------------------------------------------------
  # ● 显示 MISS (追加定义)
  #--------------------------------------------------------------------------
  alias hzhj_old_display_miss_for_display_damage_wnd_btlog display_miss
  def display_miss(target, item)
    target.hzhj_damage = [:miss, :miss, false]
    hzhj_old_display_miss_for_display_damage_wnd_btlog(target, item)
  end
  #--------------------------------------------------------------------------
  # ● 显示回避 (追加定义)
  #--------------------------------------------------------------------------
  alias hzhj_old_display_evasion_for_display_damage_wnd_btlog display_evasion
  def display_evasion(target, item)
    target.hzhj_damage = [:eva, :evasion, false]
    hzhj_old_display_evasion_for_display_damage_wnd_btlog(target, item)
  end
  #--------------------------------------------------------------------------
  # ● 显示 HP 伤害 (追加定义)
  #--------------------------------------------------------------------------
  alias hzhj_old_display_hp_damage_for_display_damage_wnd_btlog display_hp_damage
  def display_hp_damage(target, item)
    return if target.result.hp_damage == 0 && item && !item.damage.to_hp?
    value = target.result.hp_damage
    critical = target.result.critical
    target.hzhj_damage = [:hp, value, critical]
    hzhj_old_display_hp_damage_for_display_damage_wnd_btlog(target, item)
  end
  #--------------------------------------------------------------------------
  # ● 显示 MP 伤害 (追加定义)
  #--------------------------------------------------------------------------
  alias hzhj_old_display_mp_damage_for_display_damage_wnd_btlog display_mp_damage
  def display_mp_damage(target, item)
    return if target.dead? || target.result.mp_damage == 0
    value = target.result.mp_damage
    critical = target.result.critical
    target.hzhj_damage = [:mp, value, critical]
    hzhj_old_display_mp_damage_for_display_damage_wnd_btlog(target, item)
  end
  #--------------------------------------------------------------------------
  # ● 显示 TP 伤害 (追加定义)
  #--------------------------------------------------------------------------
  alias hzhj_old_display_tp_damage_for_display_damage_wnd_btlog display_tp_damage
  def display_tp_damage(target, item)
    return if target.dead? || target.result.tp_damage == 0
    value = target.result.tp_damage
    critical = target.result.critical
    target.hzhj_damage = [:tp, value, critical]
    hzhj_old_display_tp_damage_for_display_damage_wnd_btlog(target, item)
  end
end

class RPG::Animation
  def need_move
    return @need_move unless @need_move.nil?
    if /@[Rr][Mm]/ =~ @name
      return (@need_move = true)
    else
      return (@need_move = false)
    end
  end
  def move_se
    return @move_se unless @move_se.nil?
    @move_se = RPG::SE.new
    if /@[Ss][Ee]\[(.+?)\]/ =~ @name
      @move_se.name = $1.clone
    end
    return @move_se
  end
  attr_writer :need_move
  attr_writer :move_se
end
#==============================================================================
# ■ Game_Battler
#==============================================================================
class Game_Battler < Game_BattlerBase
  include Hzhj::HorizontalBattleSystem
  #--------------------------------------------------------------------------
  # ● 属性
  #--------------------------------------------------------------------------
  attr_accessor :add_x                    # X 坐标变化量
  attr_accessor :add_y                    # Y 坐标变化量
  attr_accessor :move_speed_x             # 战斗图 X 移动速度
  attr_accessor :move_speed_y             # 战斗图 Y 移动速度
  #--------------------------------------------------------------------------
  # ● 初始化(追加定义)
  #--------------------------------------------------------------------------
  alias hzhj_old_init_for_real_move_game_battler initialize
  def initialize
    @add_x = 0
    @add_y = 0
    @move_speed_x = 0
    @move_speed_y = 0
    hzhj_old_init_for_real_move_game_battler
  end
  #--------------------------------------------------------------------------
  # ● 真实 X 坐标(新增定义)
  #--------------------------------------------------------------------------
  def real_screen_x
    return screen_x + add_x
  end
  #--------------------------------------------------------------------------
  # ● 真实 Y 坐标(新增定义)
  #--------------------------------------------------------------------------
  def real_screen_y
    return screen_y + add_y
  end
  #--------------------------------------------------------------------------
  # ● 返回自己的战斗位置(新增定义)
  #--------------------------------------------------------------------------
  def come_back_self_position(duration)
    return if dead?
    tx = screen_x
    ty = screen_y
    addx = tx - real_screen_x
    addy = ty - real_screen_y
    return if addx == 0 && addy == 0
    @add_x = 0
    @add_y = 0
    @move_speed_x = [(addx.abs / duration.to_f).ceil, 1].max
    @move_speed_y = [(addy.abs / duration.to_f).ceil, 1].max
  end
  #--------------------------------------------------------------------------
  # ● 设置移动信息(新增定义)
  #--------------------------------------------------------------------------
  def setup_move_info(target_battler, duration, move_se)
    return if dead?
    tbmp = Cache.battler(target_battler.battler_name, target_battler.battler_hue)
    sbmp = Cache.battler(@battler_name, @battler_hue)
    tbw = tbmp.width / DynamicPatternMax + RealMoveBmpAddW
    sbw = sbmp.width / DynamicPatternMax + RealMoveBmpAddW
    tbh = tbmp.height + RealMoveBmpAddH
    sbh = sbmp.height + RealMoveBmpAddH
    d = actor? ? ActorDirection : 10 - ActorDirection
    tx = target_battler.real_screen_x
    ty = target_battler.real_screen_y
    case d
    when 1
      tx = tx + tbw / 2 + sbw / 2
      ty = ty - sbh / 2
    when 2
      ty = ty - sbh / 2
    when 3
      tx = tx - tbw / 2 - sbw / 2
      ty = ty - sbh / 2
    when 4
      tx = tx + tbw / 2 + sbw / 2
    when 6
      tx = tx - tbw / 2 - sbw / 2
    when 7
      tx = tx + tbw / 2 + sbw / 2
      ty = ty + sbh / 2
    when 8
      ty = ty + sbh / 2
    when 9
      tx = tx - tbw / 2 - sbw / 2
      ty = ty + sbh / 2
    end
    addx = tx - real_screen_x
    addy = ty - real_screen_y
    return if addx == 0 && addy == 0
    @add_x = tx - screen_x if addx != 0
    @add_y = ty - screen_y if addy != 0
    @move_speed_x = [(addx.abs / duration.to_f).ceil, 1].max
    @move_speed_y = [(addy.abs / duration.to_f).ceil, 1].max
    move_se.play
  end
end
#==============================================================================
# ■ Sprite_Battler
#==============================================================================
class Sprite_Battler < Sprite_Base
  #--------------------------------------------------------------------------
  # ● 初始化(追加定义)
  #--------------------------------------------------------------------------
  alias hzhj_old_init_for_real_move_spr_battler initialize
  def initialize(viewport, battler = nil)
    hzhj_old_init_for_real_move_spr_battler(viewport, battler)
    init_position(@battler) if @battler
  end
  #--------------------------------------------------------------------------
  # ● 设置战斗者(追加定义)
  #--------------------------------------------------------------------------
  alias hzhj_old_set_battler_for_real_move_spr_battler battler=
  def battler=(value)
    if @battler != value && value
      init_position(value)
    end
    hzhj_old_set_battler_for_real_move_spr_battler(value)
  end
  #--------------------------------------------------------------------------
  # ● 初始化位置(新增定义)
  #--------------------------------------------------------------------------
  def init_position(battler)
    battler.add_x = 0
    battler.add_y = 0
    self.x = battler.real_screen_x
    self.y = battler.real_screen_y
    self.z = battler.screen_z
  end
  #--------------------------------------------------------------------------
  # ● 移动中判定(新增定义)
  #--------------------------------------------------------------------------
  def moving?
    return false unless @battler
    (x != @battler.real_screen_x or y != @battler.real_screen_y) && @battler
  end
  #--------------------------------------------------------------------------
  # ● 位置的更新(重定义)
  #--------------------------------------------------------------------------
  def update_position
    if !@battler.dead?
      if x < @battler.real_screen_x
        self.x = [x + @battler.move_speed_x, @battler.real_screen_x].min
      elsif x > @battler.real_screen_x
        self.x = [x - @battler.move_speed_x, @battler.real_screen_x].max
      end
      if y < @battler.real_screen_y
        self.y = [y + @battler.move_speed_y, @battler.real_screen_y].min
      elsif y > @battler.real_screen_y
        self.y = [y - @battler.move_speed_y, @battler.real_screen_y].max
      end
      self.z = y + 100
    end
  end
end
#==============================================================================
# ■ Spriteset_Battle
#==============================================================================
class Spriteset_Battle
  #--------------------------------------------------------------------------
  # ● 判定是否移动中(新增定义)
  #--------------------------------------------------------------------------
  def moving?
    battler_sprites.any? {|sprite| sprite.moving? }
  end
end
#==============================================================================
# ■ Scene_Battle
#==============================================================================
class Scene_Battle < Scene_Base
  #--------------------------------------------------------------------------
  # ● 等待战斗图移动的结束(新增定义)
  #--------------------------------------------------------------------------
  def wait_for_move
    update_for_wait
    update_for_wait while @spriteset.moving?
  end
end

class RPG::Troop
  include Hzhj::HorizontalBattleSystem
  def display_enemy_bar
    return @display_enemy_bar unless @display_enemy_bar.nil?
    if /@ebar/i =~ @name
      return (@display_enemy_bar = !DefaultDisplayEnemyBar)
    else
      return (@display_enemy_bar = DefaultDisplayEnemyBar)
    end
  end
  attr_writer :display_enemy_bar
end
#==============================================================================
# ■ Game_Troop
#==============================================================================
class Game_Troop < Game_Unit
  attr_accessor :display_enemy_bar      # 是否显示敌人HP条、MP条、TP条
  #--------------------------------------------------------------------------
  # ● 设置
  #--------------------------------------------------------------------------
  alias hzhj_old_setup_for_display_enemy_bar_game_troop setup
  def setup(troop_id)
    hzhj_old_setup_for_display_enemy_bar_game_troop(troop_id)
    @display_enemy_bar = troop.display_enemy_bar
  end
end
#==============================================================================
# ■ Window_BattleEnemy
#==============================================================================
class Window_BattleEnemy < Window_Selectable
  #--------------------------------------------------------------------------
  # ● 取得列数
  #--------------------------------------------------------------------------
  def col_max
    if $game_troop.display_enemy_bar
      return 1
    else
      return 2
    end
  end
  #--------------------------------------------------------------------------
  # ● 刷新
  #--------------------------------------------------------------------------
  def refresh
    create_contents
    super
  end
  #--------------------------------------------------------------------------
  # ● 描画项目
  #--------------------------------------------------------------------------
  def draw_item(index)
    if $game_troop.display_enemy_bar
      enemy = $game_troop.alive_members[index]
      draw_basic_area(basic_area_rect(index), enemy)
      draw_gauge_area(gauge_area_rect(index), enemy)
    else
      change_color(normal_color)
      name = $game_troop.alive_members[index].name
      draw_text(item_rect_for_text(index), name)
    end
  end
  #--------------------------------------------------------------------------
  # ● 取得基本区域的矩形
  #--------------------------------------------------------------------------
  def basic_area_rect(index)
    rect = item_rect_for_text(index)
    rect.width -= gauge_area_width + 10
    rect
  end
  #--------------------------------------------------------------------------
  # ● 取得值槽区域的矩形
  #--------------------------------------------------------------------------
  def gauge_area_rect(index)
    rect = item_rect_for_text(index)
    rect.x += rect.width - gauge_area_width
    rect.width = gauge_area_width
    rect
  end
  #--------------------------------------------------------------------------
  # ● 取得值槽区域的宽度
  #--------------------------------------------------------------------------
  def gauge_area_width
    return 220
  end
  #--------------------------------------------------------------------------
  # ● 描画基本区域
  #--------------------------------------------------------------------------
  def draw_basic_area(rect, actor)
    draw_actor_name(actor, rect.x + 0, rect.y, 100)
    draw_actor_icons(actor, rect.x + 104, rect.y, rect.width - 104)
  end
  #--------------------------------------------------------------------------
  # ● 描画值槽区域
  #--------------------------------------------------------------------------
  def draw_gauge_area(rect, actor)
    if $data_system.opt_display_tp
      draw_gauge_area_with_tp(rect, actor)
    else
      draw_gauge_area_without_tp(rect, actor)
    end
  end
  #--------------------------------------------------------------------------
  # ● 描画值槽区域(包括 TP 值)
  #--------------------------------------------------------------------------
  def draw_gauge_area_with_tp(rect, actor)
    draw_actor_hp(actor, rect.x + 0, rect.y, 72)
    draw_actor_mp(actor, rect.x + 82, rect.y, 64)
    draw_actor_tp(actor, rect.x + 156, rect.y, 64)
  end
  #--------------------------------------------------------------------------
  # ● 描画值槽区域(不包括 TP 值)
  #--------------------------------------------------------------------------
  def draw_gauge_area_without_tp(rect, actor)
    draw_actor_hp(actor, rect.x + 0, rect.y, 134)
    draw_actor_mp(actor, rect.x + 144,  rect.y, 76)
  end
end

#==============================================================================
# ■ Sprite_Battler
#==============================================================================
class Sprite_Battler < Sprite_Base
  include Hzhj::HorizontalBattleSystem
  #--------------------------------------------------------------------------
  # ● 初始化(追加定义)
  #--------------------------------------------------------------------------
  alias hzhj_old_init_for_dynamic_spr_battler initialize
  def initialize(viewport, battler = nil)
    hzhj_old_init_for_dynamic_spr_battler(viewport, battler)
    @dynamic_duration = 0
    @dynamic_duration_max = DynamicPatternMax * OnePatternDuration
  end
  #--------------------------------------------------------------------------
  # ● 源位图(Source Bitmap)的更新(重定义)
  #--------------------------------------------------------------------------
  def update_bitmap
    new_bitmap = Cache.battler(@battler.battler_name, @battler.battler_hue)
    if bitmap != new_bitmap
      self.bitmap = new_bitmap
      init_visibility
      @dynamic_duration = 0
      @sx = 0
      @sw = bitmap.width / DynamicPatternMax
      @sh = bitmap.height
      self.ox = @sw / 2
      self.oy = @sh
      src_rect.set(@sx, 0, @sw, @sh)
    end
  end
  #--------------------------------------------------------------------------
  # ● 原点的更新(重定义)
  #--------------------------------------------------------------------------
  def update_origin
    if bitmap
      @dynamic_duration += 1
      @dynamic_duration %= @dynamic_duration_max
      @sx = @dynamic_duration / OnePatternDuration * @sw
      src_rect.set(@sx, 0, @sw, @sh)
    end
  end
  #--------------------------------------------------------------------------
  # ● 返回普通设定(追加定义)
  #--------------------------------------------------------------------------
  alias hzhj_old_revert_to_normal_for_dynamic_spr_battler revert_to_normal
  def revert_to_normal
    hzhj_old_revert_to_normal_for_dynamic_spr_battler
    self.ox = @sw / 2 if bitmap
  end
  #--------------------------------------------------------------------------
  # ● BOSS 战败(崩坏)效果的更新(追加定义)
  #--------------------------------------------------------------------------
  alias hzhj_old_update_boss_col_for_dynamic_spr_battler update_boss_collapse
  def update_boss_collapse
    hzhj_old_update_boss_col_for_dynamic_spr_battler
    self.ox = @sw / 2 + @effect_duration % 2 * 4 - 2
  end
end

#==============================================================================
# ■ Game_Battler
#==============================================================================
class Game_Battler < Game_BattlerBase
  def set_normal_battler_name
    @battler_name = @battler_name.split(/★/)[0]
  end
  def set_beaten_battler_name
    if guard?
      if (UseActorGuardGraphic && actor?) or
         (UseEnemyGuardGraphic && enemy?)
        set_guard_battler_name
        return
      end
    end
    @battler_name = @battler_name.split(/★/)[0] + "★1"
    if UseActorWBSE && actor?
      Audio.se_play("Audio/SE/AWBSE_#{id}", 100, 100)
    elsif UseEnemyWBSE && enemy?
      Audio.se_play("Audio/SE/EWBSE_#{enemy_id}", 100, 100)
    end
  end
  def set_dead_battler_name
    @battler_name = @battler_name.split(/★/)[0] + "★2"
  end
  def set_guard_battler_name
    @battler_name = @battler_name.split(/★/)[0] + "★3"
    if UseActorGDSE && actor?
      Audio.se_play("Audio/SE/AGDSE_#{id}", 100, 100)
    elsif UseEnemyGDSE && enemy?
      Audio.se_play("Audio/SE/EGDSE_#{enemy_id}", 100, 100)
    end
  end
end
#==============================================================================
# ■ Sprite_Battler
#==============================================================================
class Sprite_Battler < Sprite_Base
  #--------------------------------------------------------------------------
  # ● 初始化(追加定义)
  #--------------------------------------------------------------------------
  alias hzhj_old_init_for_dead_spr_battler initialize
  def initialize(viewport, battler = nil)
    hzhj_old_init_for_dead_spr_battler(viewport, battler)
    @dead_graphic_used = false
    if @battler
      @battler.set_normal_battler_name
      if @battler.dead?
        if (UseActorDeadGraphic && @battler.actor?) or
           (UseEnemyDeadGraphic && @battler.enemy?)
          @battler.set_dead_battler_name
          @dead_graphic_used = true
        end
      end
    end
    @beaten_duration = -1
  end
  #--------------------------------------------------------------------------
  # ● 设置战斗者(追加定义)
  #--------------------------------------------------------------------------
  alias hzhj_old_set_battler_for_dead_spr_battler battler=
  def battler=(value)
    if @battler != value
      @dead_graphic_used = false
      if value
        value.set_normal_battler_name
        if value.dead?
          if (UseActorDeadGraphic && value.actor?) or
             (UseEnemyDeadGraphic && value.enemy?)
            value.set_dead_battler_name
            @dead_graphic_used = true
          end
        end
      end
      @beaten_duration = -1
    end
    hzhj_old_set_battler_for_dead_spr_battler(value)
  end
  #--------------------------------------------------------------------------
  # ● 源位图(Source Bitmap)的更新(重定义)
  #--------------------------------------------------------------------------
  alias hzhj_old_update_bitmap_for_was_beaten_spr_battler update_bitmap
  def update_bitmap
    if @beaten_duration > 0
      @beaten_duration -= 1
    elsif @beaten_duration == 0
      @beaten_duration = -1
      set_bitmap(:normal)
    end
    hzhj_old_update_bitmap_for_was_beaten_spr_battler
  end
  #--------------------------------------------------------------------------
  # ● 初始化可视状态(追加定义)
  #--------------------------------------------------------------------------
  alias hzhj_old_visibility_for_dead_spr_battler init_visibility
  def init_visibility
    hzhj_old_visibility_for_dead_spr_battler
    if @battler.dead?
      if (UseActorDeadGraphic && @battler.actor?) or
         (UseEnemyDeadGraphic && @battler.enemy?)
        self.opacity = 255
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● 效果开始(追加定义)
  #--------------------------------------------------------------------------
  alias hzhj_old_start_effect_for_dead_spr_battler start_effect
  def start_effect(effect_type)
    if effect_type == :appear
      if @dead_graphic_used
        set_bitmap(:normal)
        @effect_type = nil
        @effect_duration = 0
        @dead_graphic_used = false
        @battler_visible = true
        return
      end
    elsif effect_type == :collapse or
          effect_type == :boss_collapse or
          effect_type == :instant_collapse
      if @beaten_duration >= 0
        @beaten_duration = -1
        set_bitmap(:normal)
      end
      if (UseActorDeadGraphic && @battler.actor?) or
         (UseEnemyDeadGraphic && @battler.enemy?)
        set_bitmap(:dead)
        @effect_type = nil
        @effect_duration = 0
        @dead_graphic_used = true
        @battler_visible = false
        return
      end
    end
    hzhj_old_start_effect_for_dead_spr_battler(effect_type)
  end
  #--------------------------------------------------------------------------
  # ● 设置新的位图(新增定义)
  #--------------------------------------------------------------------------
  def set_bitmap(sym)
    case sym
    when :normal
      @battler.set_normal_battler_name
    when :was_beaten
      @battler.set_beaten_battler_name
    when :dead
      @battler.set_dead_battler_name
    else
      return
    end
    new_bitmap = Cache.battler(@battler.battler_name, @battler.battler_hue)
    if bitmap != new_bitmap
      self.bitmap = new_bitmap
      @dynamic_duration = 0
      @sx = 0
      @sw = bitmap.width / DynamicPatternMax
      @sh = bitmap.height
      self.ox = @sw / 2
      self.oy = @sh
      src_rect.set(@sx, 0, @sw, @sh)
    end
    update_origin
    update_position
  end
end

#==============================================================================
# ■ Scene_Battle
#==============================================================================
class Scene_Battle < Scene_Base
  #--------------------------------------------------------------------------
  # ● 发动技能/物品(新增定义)
  #--------------------------------------------------------------------------
  def hzhj_invoke_item(target, item, damage_target)
    refresh_status
    @log_window.display_action_results(damage_target, item)
    @subject.damage_section_displayed = false
    @subject.last_target_index = target.index
    return if target.dead?
    if rand < target.item_cnt(@subject, item)
      hzhj_invoke_counter_attack(target, item)
    elsif rand < target.item_mrf(@subject, item)
      hzhj_invoke_magic_reflection(target, item)
    end
  end
  #--------------------------------------------------------------------------
  # ● 发动物理反击(新增定义)
  #--------------------------------------------------------------------------
  def hzhj_invoke_counter_attack(target, item)
    @log_window.display_counter(target, item)
    attack_skill = $data_skills[target.attack_skill_id]
    @subject.item_apply(target, attack_skill)
    need_move = false
    animation1 = $data_animations[target.animation1_id]
    need_move = animation1.need_move if animation1
    ary = [@subject]
    if need_move
      target.setup_move_info(@subject, RealMoveDuration, animation1.move_se)
      wait_for_move
    end
    @subject.damage_section_displayed = false
    @subject.not_damage_section = false
    show_subject_animation(target.animation1_id, target)
    show_normal_animation(ary, target.atk_animation_id1, false)
    show_normal_animation(ary, target.atk_animation_id2, true)
    @log_window.wait
    wait_for_animation
    if need_move && target.alive?
      target.come_back_self_position(RealMoveDuration)
      wait_for_move
    end
    refresh_status
    @log_window.display_action_results(@subject, attack_skill)
  end
  #--------------------------------------------------------------------------
  # ● 发动魔法反射(新增定义)
  #--------------------------------------------------------------------------
  def hzhj_invoke_magic_reflection(target, item)
    @subject.damage_section_displayed = false
    @subject.not_damage_section = false
    @log_window.display_reflection(target, item)
    @subject.item_apply(@subject, item)
    refresh_status
    @log_window.display_action_results(@subject, item)
  end
end

#==============================================================================
# ■ Game_Battler
#==============================================================================
class Game_Battler < Game_BattlerBase
  attr_accessor :damage_section_displayed
  attr_accessor :not_damage_section
end
#==============================================================================
# ■ Game_Actor
#==============================================================================
class Game_Actor < Game_Battler
  #--------------------------------------------------------------------------
  # ● 执行伤害效果
  #--------------------------------------------------------------------------
  alias hzhj_old_per_damage_for_damage_section_game_actor perform_damage_effect
  def perform_damage_effect
    unless damage_section_displayed
      hzhj_old_per_damage_for_damage_section_game_actor
    end
  end
end
#==============================================================================
# ■ Game_Enemy
#==============================================================================
class Game_Enemy < Game_Battler
  #--------------------------------------------------------------------------
  # ● 执行伤害效果
  #--------------------------------------------------------------------------
  alias hzhj_old_per_damage_for_damage_section_game_enemy perform_damage_effect
  def perform_damage_effect
    unless damage_section_displayed
      hzhj_old_per_damage_for_damage_section_game_enemy
    end
  end
end
#==============================================================================
# ■ Sprite_Battler
#==============================================================================
class Sprite_Battler < Sprite_Base
  #--------------------------------------------------------------------------
  # ● SE 和闪烁时机的处理
  #--------------------------------------------------------------------------
  def animation_process_timing(timing)
    if timing.se.name == DamageSectionDisplaySEName
      hp_value = @battler.result.hp_damage
      mp_value = @battler.result.mp_damage
      tp_value = @battler.result.tp_damage
      value = args = nil
      was_beaten = false
      if hp_value != 0 && !@battler.not_damage_section
        was_beaten = true if hp_value > 0
        value = hp_value * timing.flash_color.red.to_i / 100
        critical = @battler.result.critical
        args = [:hp, value, critical]
      elsif mp_value != 0 && !@battler.not_damage_section
        was_beaten = true if mp_value > 0
        value = mp_value * timing.flash_color.red.to_i / 100
        critical = @battler.result.critical
        args = [:mp, value, critical]
      elsif tp_value != 0 && !@battler.not_damage_section
        was_beaten = true if tp_value > 0
        value = tp_value * timing.flash_color.red.to_i / 100
        critical = @battler.result.critical
        args = [:tp, value, critical]
      end
      if value && args
        args[3] = @battler.actor? ? :actor : (@battler.enemy? ? :enemy : nil)
        @battler.damage_section_displayed = true
        start_damage(args)
        if UseBeatenGraphic && was_beaten
          set_bitmap(:was_beaten)
          @beaten_duration = BeatenGraphicDuration
        end
      end
      return
    end
    super(timing)
  end
end
#==============================================================================
# ■ Scene_Battle
#==============================================================================
class Scene_Battle < Scene_Base
  #--------------------------------------------------------------------------
  # ● 应用技能/物品效果(新增定义)
  #--------------------------------------------------------------------------
  def hzhj_apply_item_effects(target, item)
    target.damage_section_displayed = false
    target.not_damage_section = false
    target = apply_substitute(target, item)
    target.damage_section_displayed = false
    target.not_damage_section = false
    target.item_apply(@subject, item)
    return target
  end
end
#==============================================================================
# ■ 此脚本来自 www.66rpg.com
#==============================================================================
[/pre]
本脚本由超级横版提取出..感谢作者后知后觉.
另:我只能提供脚本..要说什么做的话..我也不会.
回复

使用道具 举报

梦石
0
星屑
50
在线时间
9 小时
注册时间
2012-8-17
回帖
8
发表于 2013-2-10 17:47:00 | 显示全部楼层
爱尔伯塔 发表于 2012-8-26 09:57
#==============================================================================
# ■ 此脚本来自 ww ...

麻烦你发个范例包吧,因为复制后,它没有分行

点评

你别全选复制,点代码框的复制就好了~还有超过发帖时间15天的帖子就别回复了,不然就是挖坟了~  发表于 2013-2-10 17:53
回复

使用道具 举报

梦石
0
星屑
85
在线时间
1 小时
注册时间
2013-2-16
回帖
1
发表于 2013-2-17 22:20:24 | 显示全部楼层
  1. #==============================================================================# ■ 此脚本来自 [url]www.66rpg.com[/url]#------------------------------------------------------------------------------#   名称:横版战斗模板#   作者:后知后觉([email]hzhj.tnt@163.com[/email])#   版本:v1.7  2012-02-09#   使用协议:在保留此脚本相关信息的情况下#             可任意使用、修改及修改后发布.#             如是修改后发布.请在作者标注那里加上 某某某改 等信息#             感谢你来这里谈谈你对这个工程的看法或报告BUG.#               [url]http://rpg.blue/thread-216673-1-1.html[/url]#   使用说明:#       请来发布帖查看:#           [url]http://rpg.blue/thread-216673-1-1.html[/url]#============================================================================== module Hzhj  module HorizontalBattleSystem    # 取得参战角色的最大数.如果要改大.需要在下面的坐标设置里增加对应的条目    MaxBattleMembers = 4     ActorsBattlePosition = {}    # 设置角色战斗图形的坐标    # 等号左边的[]号里面的1 2 3 4 表示角色在队伍里的位置    # 等号右边的[]号里面的两个数字分别表示 X坐标 Y坐标    # 每次进入战斗的时候都会以这里设置的信息作为初始化位置.    # 如果你把上面的 MaxBattleMembers 改大了.比如改成了 5.    # 那么你需要在下面新增一行代码设置队伍中第5位置的坐标.    # 就像这样 ActorsBattlePosition[5] = [X坐标, Y坐标]    ActorsBattlePosition[1] = [378, 228]    ActorsBattlePosition[2] = [422, 272]    ActorsBattlePosition[3] = [466, 228]    ActorsBattlePosition[4] = [510, 272]     # 设置伤害值图形的色相 取值范围 0~360    DamageBitmapHue = 0    # 伤害值分段显示的标志SE文件名    DamageSectionDisplaySEName = "DamageSection"     # 动画 Z 坐标值默认变化量    DefaultAniAddZ = 768     # 状态动画 Z 坐标值默认变化量    DefaultLoopAniAddZ = 20     # 战斗中角色的面向    ActorDirection = 4     # 真位移的帧数    RealMoveDuration = 20    # 真位移移动前会计算目标点.会获取攻防双方战斗图大小来进行计算.    # 下面2个是对战斗图 width height 进行修正.    # 为正则扩大 为负则缩小.单位 像素.    # 一般来说不必修改.只有像梦幻群侠传那种战斗图四边有很多透明区域时才修正.    RealMoveBmpAddW = 0    RealMoveBmpAddH = 0     # 使用技能、物品的过程默认使用RMVA模式    # 在该模式下.本脚本提供的很多功能受限无法使用.    DefaultUseRmvaMode = false     # 默认显示敌人的HP条、MP条、TP条    DefaultDisplayEnemyBar = true     # 一张战斗图中有几个样式(帧、格)    DynamicPatternMax = 4    # 一张战斗图中的一个样式持续多少帧    OnePatternDuration = 15     # 角色使用战斗死亡图形    UseActorDeadGraphic = true    # 敌人使用战斗死亡图形    UseEnemyDeadGraphic = false     # 使用挨打图形    UseBeatenGraphic = true    # 挨打图形维持帧数    BeatenGraphicDuration = 30     # 是否使用角色防御图 只有同时使用了挨打图.此项才有效.    UseActorGuardGraphic = true    # 是否使用敌人防御图 只有同时使用了挨打图.此项才有效.    UseEnemyGuardGraphic = false     # 角色是否使用挨打SE    UseActorWBSE = true    # 敌人是否使用挨打SE    UseEnemyWBSE = true    # 角色是否使用防御SE    UseActorGDSE = true    # 敌人是否使用防御SE    UseEnemyGDSE = false  endend class RPG::Actor < RPG::BaseItem  def battler_name    return @battler_name unless @battler_name.nil?    if /@btname\[(.+?)\]/ =~ @note      return (@battler_name = $1.clone)    else      return (@battler_name = "#{@name}_#{@nickname}")    end  end  def battler_hue    return @battler_hue unless @battler_hue.nil?    if /@bthue\[([0-9]+?)\]/ =~ @note      return (@battler_hue = $1.to_i.abs)    else      return (@battler_hue = 0)    end  end  attr_writer :battler_name  attr_writer :battler_hueend#==============================================================================# ■ Game_Actor#==============================================================================class Game_Actor < Game_Battler  #--------------------------------------------------------------------------  # ● 属性(新增定义)  #--------------------------------------------------------------------------  attr_writer   :battler_name             # 战斗图形文件名  attr_writer   :battler_hue              # 战斗图形色相  #--------------------------------------------------------------------------  # ● 设置(追加定义)  #--------------------------------------------------------------------------  alias hzhj_old_setup_for_add_actor_battle_graphic setup  def setup(actor_id)    hzhj_old_setup_for_add_actor_battle_graphic(actor_id)    @battler_name = actor.battler_name    @battler_hue = actor.battler_hue  end  #--------------------------------------------------------------------------  # ● 是否使用活动块(重定义)  #--------------------------------------------------------------------------  def use_sprite?    return true  end  #--------------------------------------------------------------------------  # ● 取得战斗画面 X 坐标(新增定义)  #--------------------------------------------------------------------------  def screen_x    return ActorsBattlePosition[index + 1][0]  end  #--------------------------------------------------------------------------  # ● 取得战斗画面 Y 坐标(新增定义)  #--------------------------------------------------------------------------  def screen_y    return ActorsBattlePosition[index + 1][1]  end  #--------------------------------------------------------------------------  # ● 取得战斗画面 Z 坐标(新增定义)  #--------------------------------------------------------------------------  def screen_z    return real_screen_y + 100  endend#==============================================================================# ■ Game_Enemy#==============================================================================class Game_Enemy < Game_Battler  #--------------------------------------------------------------------------  # ● 属性(新增定义)  #--------------------------------------------------------------------------  attr_writer   :battler_name             # 战斗图形文件名  attr_writer   :battler_hue              # 战斗图形色相  #--------------------------------------------------------------------------  # ● 取得战斗画面 Z 坐标(重定义)  #--------------------------------------------------------------------------  def screen_z    return real_screen_y + 100  endend#==============================================================================# ■ Game_Party#==============================================================================class Game_Party < Game_Unit  include Hzhj::HorizontalBattleSystem  #--------------------------------------------------------------------------  # ● 取得参战角色的最大数(重定义)  #--------------------------------------------------------------------------  def max_battle_members    return MaxBattleMembers  endend class RPG::Animation  def wait_subject_duration    return @wait_subject_duration unless @wait_subject_duration.nil?    if /@w\[(\-??\d+?)\]/ =~ @name      @wait_subject_duration = $1.to_i    else      @wait_subject_duration = 0    end    return @wait_subject_duration  end  attr_writer :wait_subject_durationendclass RPG::UsableItem < RPG::BaseItem  include Hzhj::HorizontalBattleSystem  def animation1_id    return @animation1_id unless @animation1_id.nil?    if /@a1id\[(\d+?)\]/i =~ @note      return (@animation1_id = $1.to_i)    else      return (@animation1_id = 0)    end  end  def wljn    return @wljn unless @wljn.nil?    if /@wljn/i =~ @note      return (@wljn = true)    else      return (@wljn = false)    end  end  def rmva_mode    return @rmva_mode unless @rmva_mode.nil?    if /@rmva/i =~ @note      return (@rmva_mode = !DefaultUseRmvaMode)    else      return (@rmva_mode = DefaultUseRmvaMode)    end  end  attr_writer :animation1_id  attr_writer :wljn  attr_writer :rmva_modeendclass RPG::Weapon < RPG::EquipItem  def animation1_id    return @animation1_id unless @animation1_id.nil?    if /@a1id\[(\d+?)\]/ =~ @note      return (@animation1_id = $1.to_i)    else      return (@animation1_id = 0)    end  end  attr_writer :animation1_idendclass RPG::Enemy < RPG::BaseItem  def animation1_id    return @animation1_id unless @animation1_id.nil?    if /@a1id\[(\d+?)\]/ =~ @note      return (@animation1_id = $1.to_i)    else      return (@animation1_id = 0)    end  end  def animation2_id    return @animation2_id unless @animation2_id.nil?    if /@a2id\[(\d+?)\]/ =~ @note      return (@animation2_id = $1.to_i)    else      return (@animation2_id = 0)    end  end  def animation3_id    return @animation3_id unless @animation3_id.nil?    if /@a3id\[(\d+?)\]/ =~ @note      return (@animation3_id = $1.to_i)    else      return (@animation3_id = 0)    end  end  attr_writer :animation1_id  attr_writer :animation2_id  attr_writer :animation3_idend#==============================================================================# ■ Game_Actor#==============================================================================class Game_Actor < Game_Battler  #--------------------------------------------------------------------------  # ● 取得普通攻击的行动方动画 ID (新增定义)  #--------------------------------------------------------------------------  def animation1_id    if dual_wield?      return weapons[0].animation1_id if weapons[0]      return weapons[1] ? weapons[1].animation1_id : 0    else      return weapons[0] ? weapons[0].animation1_id : 0    end  endend#==============================================================================# ■ Game_Enemy#==============================================================================class Game_Enemy < Game_Battler  #--------------------------------------------------------------------------  # ● 取得普通攻击的行动方动画 ID (新增定义)  #--------------------------------------------------------------------------  def animation1_id    return enemy.animation1_id  end  #--------------------------------------------------------------------------  # ● 取得普通攻击的动画 ID (新增定义)  #--------------------------------------------------------------------------  def atk_animation_id1    return enemy.animation2_id  end  #--------------------------------------------------------------------------  # ● 取得普通攻击的动画 ID (二刀流:武器2)(新增定义)  #--------------------------------------------------------------------------  def atk_animation_id2    return enemy.animation3_id  endend#==============================================================================# ■ Scene_Battle#==============================================================================class Scene_Battle < Scene_Base  include Hzhj::HorizontalBattleSystem  #--------------------------------------------------------------------------  # ● 使用技能/物品(重定义)  #--------------------------------------------------------------------------  def use_item    item = @subject.current_action.item    @log_window.display_use_item(@subject, item)    @subject.use_item(item)    refresh_status    targets = @subject.current_action.make_targets.compact    show_animation(targets, item.animation_id)  end  #--------------------------------------------------------------------------  # ● 显示动画(重定义)  #--------------------------------------------------------------------------  def show_animation(targets, animation_id)    item = @subject.current_action.item    if item.rmva_mode      show_rmva_animation(targets, animation_id, item)    else      show_hzhj_animation(targets, animation_id, item)    end  end  #--------------------------------------------------------------------------  # ● RMVA模式显示动画(新增定义)  #--------------------------------------------------------------------------  def show_rmva_animation(targets, animation_id, item)    @subject.damage_section_displayed = false    @subject.not_damage_section = true    targets.each do |target|      target.damage_section_displayed = false      target.not_damage_section = true    end    if animation_id < 0      show_attack_animation(targets)    else      show_rmva_usable_animation(targets, animation_id, item)    end  end  #--------------------------------------------------------------------------  # ● HZHJ模式显示动画(新增定义)  #--------------------------------------------------------------------------  def show_hzhj_animation(targets, animation_id, item)    if animation_id < 0      show_hzhj_attack_animation(targets, item)    else      if item.wljn        show_wljn_skill_animation(targets, animation_id, item)      else        show_magic_skill_animation(targets, animation_id, item)      end    end  end  #--------------------------------------------------------------------------  # ● HZHJ模式显示攻击动画(重定义)  #--------------------------------------------------------------------------  def show_hzhj_attack_animation(targets, item)    ary = []    need_move = false    animation1 = $data_animations[@subject.animation1_id]    need_move = animation1.need_move if animation1    come_back = true    targets.each_with_index do |target, i|      ary[0] = target      item.repeats.times do        next if target.dead? && item.damage.type == 1        next if @subject.dead?        next if !@subject.current_action        if need_move && come_back          come_back = false          @subject.setup_move_info(target, RealMoveDuration, animation1.move_se)          wait_for_move        end        damage_target = hzhj_apply_item_effects(target, item)        show_subject_animation(@subject.animation1_id)        show_normal_animation(ary, @subject.atk_animation_id1, false)        show_normal_animation(ary, @subject.atk_animation_id2, true)        @log_window.wait        wait_for_animation        hzhj_invoke_item(target, item, damage_target)      end      if need_move        if target != targets[i+1] or target.dead?          come_back = true          @subject.come_back_self_position(RealMoveDuration)          wait_for_move        else          come_back = false        end      end    end  end  #--------------------------------------------------------------------------  # ● HZHJ模式显示物理技能类动画(新增定义)  #--------------------------------------------------------------------------  def show_wljn_skill_animation(targets, animation_id, item)    ary = []    need_move = false    animation1 = $data_animations[item.animation1_id]    need_move = animation1.need_move if animation1    come_back = true    targets.each_with_index do |target, i|      ary[0] = target      item.repeats.times do        next if target.dead? && item.damage.type == 1        next if @subject.dead?        next if !@subject.current_action        if need_move && come_back          come_back = false          @subject.setup_move_info(target, RealMoveDuration, animation1.move_se)          wait_for_move        end        damage_target = hzhj_apply_item_effects(target, item)        show_subject_animation(item.animation1_id)        show_normal_animation(ary, animation_id, false)        @log_window.wait        wait_for_animation        hzhj_invoke_item(target, item, damage_target)      end      if need_move        if target != targets[i+1] or target.dead?          come_back = true          @subject.come_back_self_position(RealMoveDuration)          wait_for_move        else          come_back = false        end      end    end  end  #--------------------------------------------------------------------------  # ● HZHJ模式显示魔法技能类动画(新增定义)  #--------------------------------------------------------------------------  def show_magic_skill_animation(targets, animation_id, item)    ary = []    damage_targets = {}    item.repeats.times do      next if @subject.dead?      next if !@subject.current_action      ary.clear      damage_targets.clear      targets.each do |target|        next if target.dead? && item.damage.type == 1        ary << target        damage_targets[target] = hzhj_apply_item_effects(target, item)      end      next if ary.empty?      show_subject_animation(item.animation1_id)      show_normal_animation(ary, animation_id)      @log_window.wait      wait_for_animation      ary.each do |target|        hzhj_invoke_item(target, item, damage_targets[target])      end      if [9, 10].include?(item.scope)        ary.each do |target|          if target.alive?            target.come_back_self_position(RealMoveDuration)          end        end        wait_for_move      end    end  end  #--------------------------------------------------------------------------  # ● RMVA模式显示攻击动画(重定义)  #--------------------------------------------------------------------------  def show_attack_animation(targets)    item = @subject.current_action.item    show_subject_animation(@subject.animation1_id)    show_normal_animation(targets, @subject.atk_animation_id1, false)    show_normal_animation(targets, @subject.atk_animation_id2, true)    @log_window.wait    wait_for_animation    targets.each {|target| item.repeats.times { invoke_item(target, item) } }  end  #--------------------------------------------------------------------------  # ● RMVA模式显示技能、物品动画 (新增定义)  #--------------------------------------------------------------------------  def show_rmva_usable_animation(targets, animation_id, item)    show_subject_animation(item.animation1_id)    show_normal_animation(targets, animation_id)    @log_window.wait    wait_for_animation    targets.each {|target| item.repeats.times { invoke_item(target, item) } }    if [9, 10].include?(item.scope)      targets.each do |target|        if target.alive?          target.come_back_self_position(RealMoveDuration)        end      end      wait_for_move    end  end  #--------------------------------------------------------------------------  # ● 显示行动方动画(新增定义)  #--------------------------------------------------------------------------  def show_subject_animation(animation_id, subject = @subject, mirror = false)    animation = $data_animations[animation_id]    if animation      subject.animation_id = animation_id      subject.animation_mirror = mirror      if animation.wait_subject_duration < 0        wait_for_animation      elsif animation.wait_subject_duration > 0        animation.wait_subject_duration.times{update_for_wait}      end    end  endend class RPG::Animation  include Hzhj::HorizontalBattleSystem  def ani_z_correction    return @ani_z_correction unless @ani_z_correction.nil?    if /@az\[(\-??\d+?)\]/ =~ @name      return (@ani_z_correction = $1.to_i)    else      return (@ani_z_correction = DefaultAniAddZ)    end  end  def loop_z_correction    return @loop_z_correction unless @loop_z_correction.nil?    if /@lz\[(\-??\d+?)\]/ =~ @name      return (@loop_z_correction = $1.to_i)    else      return (@loop_z_correction = DefaultLoopAniAddZ)    end  end  attr_writer :ani_z_correction  attr_writer :loop_z_correctionendclass RPG::State < RPG::BaseItem  def animation_id    return @animation_id unless @animation_id.nil?    if /@aid\[(\d+?)\]/ =~ @note      return (@animation_id = $1.to_i)    else      return (@animation_id = 0)    end  end  attr_writer :animation_idend#==============================================================================# ■ Game_BattlerBase#==============================================================================class Game_BattlerBase  #--------------------------------------------------------------------------  # ● 实例变量(新增定义)  #--------------------------------------------------------------------------  attr_reader   :hzhj_add_state_id  attr_reader   :hzhj_remove_state_id  attr_accessor :need_update_state_animation  #--------------------------------------------------------------------------  # ● 初始化(追加定义)  #--------------------------------------------------------------------------  alias hzhj_old_init_for_state_ani_game_battler_base initialize  def initialize    @hzhj_add_state_id = []    @hzhj_remove_state_id = []    @need_update_state_animation = false    @states = []    @state_turns = {}    @state_steps = {}    hzhj_old_init_for_state_ani_game_battler_base  end  #--------------------------------------------------------------------------  # ● 清除状态信息(追加定义)  #--------------------------------------------------------------------------  alias hzhj_old_clear_states_for_state_ani_game_battler_base clear_states  def clear_states    old_states = @states.clone    hzhj_old_clear_states_for_state_ani_game_battler_base    bingji = old_states | @states    return if bingji.empty?    set_add_state_id(bingji & @states)    set_remove_state_id(bingji & old_states)  end  #--------------------------------------------------------------------------  # ● 消除状态(追加定义)  #--------------------------------------------------------------------------  alias hzhj_old_erase_state_for_state_ani_game_battler_base erase_state  def erase_state(state_id)    old_states = @states.clone    hzhj_old_erase_state_for_state_ani_game_battler_base(state_id)    bingji = old_states | @states    return if bingji.empty?    set_add_state_id(bingji & @states)    set_remove_state_id(bingji & old_states)  end  #--------------------------------------------------------------------------  # ● 设置增加的状态(新增定义)  #--------------------------------------------------------------------------  def set_add_state_id(zjdzt)    for i in zjdzt      if $data_states[i].animation_id > 0        if not @hzhj_add_state_id.include?(i)          @hzhj_add_state_id.push(i)        end      end    end  end  #--------------------------------------------------------------------------  # ● 设置解除的状态(新增定义)  #--------------------------------------------------------------------------  def set_remove_state_id(jsdzt)    for i in jsdzt      if $data_states[i].animation_id > 0        if not @hzhj_remove_state_id.include?(i)          ani_id = $data_states[i].animation_id          not_end_loop_animation = false          for state in self.states            if state.animation_id == ani_id              not_end_loop_animation = true              break            end          end          unless not_end_loop_animation            @hzhj_remove_state_id.push(i)          end        end      end    end  endend#==============================================================================# ■ Game_Battler#==============================================================================class Game_Battler < Game_BattlerBase  #--------------------------------------------------------------------------  # ● 附加新的状态(追加定义)  #--------------------------------------------------------------------------  alias hzhj_old_add_new_state_for_state_ani_game_battler add_new_state  def add_new_state(state_id)    old_states = @states.clone    hzhj_old_add_new_state_for_state_ani_game_battler(state_id)    bingji = old_states | @states    return if bingji.empty?    set_add_state_id(bingji & @states)    set_remove_state_id(bingji & old_states)  endend#==============================================================================# ■ Sprite_Base#==============================================================================class Sprite_Base < Sprite  #--------------------------------------------------------------------------  # ● 初始化(追加定义)  #--------------------------------------------------------------------------  alias hzhj_old_init_for_state_ani_spr_base initialize  def initialize(*args)    hzhj_old_init_for_state_ani_spr_base(*args)    @hzhj_loop_animations = []    @hzhj_loop_durations = {}    @hzhj_loop_sprites = {}    @hzhj_loop_bitmap1s = {}    @hzhj_loop_bitmap2s = {}    @hzhj_loop_ani_oxs = {}    @hzhj_loop_ani_oys = {}    @flash_nil_duration = 0  end  #--------------------------------------------------------------------------  # ● 释放(追加定义)  #--------------------------------------------------------------------------  alias hzhj_old_dispose_for_state_ani_spr_base dispose  def dispose    dispose_loop_animation    hzhj_old_dispose_for_state_ani_spr_base  end  #--------------------------------------------------------------------------  # ● 设定动画的活动块(追加定义)  #--------------------------------------------------------------------------  alias hzhj_old_ani_set_spr_for_state_ani_spr_base animation_set_sprites  def animation_set_sprites(*args)    hzhj_old_ani_set_spr_for_state_ani_spr_base(*args)    @ani_sprites.each{|sprite|sprite.z += @animation.ani_z_correction}  end  #--------------------------------------------------------------------------  # ● 判断是否有循环动画(新增定义)  #--------------------------------------------------------------------------  def loop_animation?    return (not @hzhj_loop_animations.empty?)  end  #--------------------------------------------------------------------------  # ● 开始播放循环动画(新增定义)  #--------------------------------------------------------------------------  def start_loop_animation(animation)    return if @hzhj_loop_animations.include?(animation)    if animation.nil?      dispose_loop_animation      return    end    set_animation_rate    @hzhj_loop_animations.push(animation)    init_loop_animation_duration(animation)    load_loop_animation_bitmap(animation)    make_loop_animation_sprites(animation)    set_loop_animation_origin(animation)  end  #--------------------------------------------------------------------------  # ● 初始化循环动画播放位置(新增定义)  #--------------------------------------------------------------------------  def init_loop_animation_duration(animation)    @hzhj_loop_durations[animation] = animation.frame_max * @ani_rate + 1  end  #--------------------------------------------------------------------------  # ● 读取循环动画图像(新增定义)  #--------------------------------------------------------------------------  def load_loop_animation_bitmap(animation)    animation1_name = animation.animation1_name    animation1_hue = animation.animation1_hue    animation2_name = animation.animation2_name    animation2_hue = animation.animation2_hue    bitmap1 = Cache.animation(animation1_name, animation1_hue)    bitmap2 = Cache.animation(animation2_name, animation2_hue)    if @@_reference_count.include?(bitmap1)      @@_reference_count[bitmap1] += 1    else      @@_reference_count[bitmap1] = 1    end    if @@_reference_count.include?(bitmap2)      @@_reference_count[bitmap2] += 1    else      @@_reference_count[bitmap2] = 1    end    @hzhj_loop_bitmap1s[animation] = bitmap1    @hzhj_loop_bitmap2s[animation] = bitmap2    Graphics.frame_reset  end  #--------------------------------------------------------------------------  # ● 生成循环动画活动块(新增定义)  #--------------------------------------------------------------------------  def make_loop_animation_sprites(animation)    sprites = []    if @use_sprite      16.times do        sprite = ::Sprite.new(viewport)        sprite.visible = false        sprites.push(sprite)      end    end    @hzhj_loop_sprites[animation] = sprites  end  #--------------------------------------------------------------------------  # ● 设定循环动画的原点(新增定义)  #--------------------------------------------------------------------------  def set_loop_animation_origin(animation)    if animation.position == 3      if viewport == nil        ani_ox = Graphics.width / 2        ani_oy = Graphics.height / 2      else        ani_ox = viewport.rect.width / 2        ani_oy = viewport.rect.height / 2      end    else      ani_ox = x - ox + width / 2      ani_oy = y - oy + height / 2      if animation.position == 0        ani_oy -= height / 2      elsif animation.position == 2        ani_oy += height / 2      end    end    @hzhj_loop_ani_oxs[animation] = ani_ox    @hzhj_loop_ani_oys[animation] = ani_oy  end  #--------------------------------------------------------------------------  # ● 释放所有循环动画(新增定义)  #--------------------------------------------------------------------------  def dispose_loop_animation    return unless loop_animation?    for animation in @hzhj_loop_animations.clone      end_loop_animation(animation)    end    @hzhj_loop_durations.clear    @hzhj_loop_sprites.clear    @hzhj_loop_bitmap1s.clear    @hzhj_loop_bitmap2s.clear    @hzhj_loop_ani_oxs.clear    @hzhj_loop_ani_oys.clear    @hzhj_loop_animations.clear  end  #--------------------------------------------------------------------------  # ● 结束某个循环动画(新增定义)  #--------------------------------------------------------------------------  def end_loop_animation(animation)    return if not @hzhj_loop_animations.include?(animation)    bitmap1 = @hzhj_loop_bitmap1s[animation]    @@_reference_count[bitmap1] -= 1    if @@_reference_count[bitmap1] == 0      @@_reference_count.delete(bitmap1)      bitmap1.dispose    end    bitmap2 = @hzhj_loop_bitmap2s[animation]    @@_reference_count[bitmap2] -= 1    if @@_reference_count[bitmap2] == 0      @@_reference_count.delete(bitmap2)      bitmap2.dispose    end    sprites = @hzhj_loop_sprites[animation]    for sprite in sprites      sprite.dispose    end    @hzhj_loop_durations.delete(animation)    @hzhj_loop_sprites.delete(animation)    @hzhj_loop_bitmap1s.delete(animation)    @hzhj_loop_bitmap2s.delete(animation)    @hzhj_loop_ani_oxs.delete(animation)    @hzhj_loop_ani_oys.delete(animation)    @hzhj_loop_animations.delete(animation)  end  #--------------------------------------------------------------------------  # ● 刷新(追加定义)  #--------------------------------------------------------------------------  alias hzhj_old_update_for_state_ani_spr_base update  def update    hzhj_old_update_for_state_ani_spr_base    update_loop_animation  end  #--------------------------------------------------------------------------  # ● 刷新循环动画(新增定义)  #--------------------------------------------------------------------------  def update_loop_animation    @flash_nil_duration -= 1 if @flash_nil_duration > 0    return unless loop_animation?    for animation in @hzhj_loop_animations      @hzhj_loop_durations[animation] -= 1      duration = @hzhj_loop_durations[animation]      if duration % @ani_rate == 0        if duration > 0          set_loop_animation_origin(animation)          frame_index = animation.frame_max          frame_index -= (duration + @ani_rate - 1) / @ani_rate          args = []          args[0] = @hzhj_loop_sprites[animation]          args[1] = @hzhj_loop_bitmap1s[animation]          args[2] = @hzhj_loop_bitmap2s[animation]          args[3] = @hzhj_loop_ani_oxs[animation]          args[4] = @hzhj_loop_ani_oys[animation]          args[5] = animation.loop_z_correction          args[6] = ((not flash_nil? or animation.to_screen?) and visible)          loop_animation_set_sprites(animation.frames[frame_index], args)          animation.timings.each do |timing|            loop_animation_process_timing(timing) if timing.frame == frame_index          end        else          init_loop_animation_duration(animation)          redo        end      end    end  end  #--------------------------------------------------------------------------  # ● 设定循环动画的活动块(新增定义)  #--------------------------------------------------------------------------  def loop_animation_set_sprites(frame, args)    sprites = args[0]    bitmap1 = args[1]    bitmap2 = args[2]    ani_ox = args[3]    ani_oy = args[4]    loop_z_correction = args[5]    state_visible = args[6]    cell_data = frame.cell_data    sprites.each_with_index do |sprite, i|      next unless sprite      pattern = cell_data[i, 0]      if !pattern || pattern < 0        sprite.visible = false        next      end      sprite.bitmap = pattern < 100 ? bitmap1 : bitmap2      sprite.visible = state_visible      sprite.src_rect.set(pattern % 5 * 192,        pattern % 100 / 5 * 192, 192, 192)      sprite.x = ani_ox + cell_data[i, 1]      sprite.y = ani_oy + cell_data[i, 2]      sprite.angle = cell_data[i, 4]      sprite.mirror = (cell_data[i, 5] == 1)      if loop_z_correction > 9999        sprite.z = loop_z_correction % 10000 + i      elsif loop_z_correction < -9999        sprite.z = loop_z_correction % -10000 + i      else        sprite.z = self.z + loop_z_correction + i      end      sprite.ox = 96      sprite.oy = 96      sprite.zoom_x = cell_data[i, 3] / 100.0      sprite.zoom_y = cell_data[i, 3] / 100.0      sprite.opacity = cell_data[i, 6] * self.opacity / 255.0      sprite.blend_type = cell_data[i, 7]    end  end  #--------------------------------------------------------------------------  # ● 循环动画SE 和闪烁时机的处理(新增定义)  #--------------------------------------------------------------------------  def loop_animation_process_timing(timing)    timing.se.play    case timing.flash_scope    when 1      self.flash(timing.flash_color, timing.flash_duration * @ani_rate)    when 2      if viewport        viewport.flash(timing.flash_color, timing.flash_duration * @ani_rate)      end    when 3      self.flash(nil, timing.flash_duration * @ani_rate)    end  end  #--------------------------------------------------------------------------  # ● 设置闪烁(追加定义)  #--------------------------------------------------------------------------  alias hzhj_old_flash_for_state_ani_spr_base flash  def flash(*args)    if args[0].nil?      @flash_nil_duration = args[1]    else      @flash_nil_duration = 0    end    hzhj_old_flash_for_state_ani_spr_base(*args)  end  #--------------------------------------------------------------------------  # ● 判断是否正处于【隐藏目标】(新增定义)  #--------------------------------------------------------------------------  def flash_nil?    return (@flash_nil_duration > 0)  endend#==============================================================================# ■ Sprite_Battler#==============================================================================class Sprite_Battler < Sprite_Base  #--------------------------------------------------------------------------  # ● 初始化(追加定义)  #--------------------------------------------------------------------------  alias hzhj_old_init_for_state_ani_spr_battler initialize  def initialize(*args)    hzhj_old_init_for_state_ani_spr_battler(*args)    init_battler_add_state_id  end  #--------------------------------------------------------------------------  # ● 初始化战斗者要播放状态动画的状态(新增定义)  #--------------------------------------------------------------------------  def init_battler_add_state_id    if @battler.nil?      dispose_loop_animation    else      @battler.hzhj_add_state_id.clear      @battler.hzhj_remove_state_id.clear      @battler.need_update_state_animation = true      for state in @battler.states        next if state.nil?        next if $data_animations[state.animation_id].nil?        @battler.hzhj_add_state_id.push(state.id)      end    end  end  #--------------------------------------------------------------------------  # ● 设置战斗者(追加定义)  #--------------------------------------------------------------------------  alias hzhj_old_battlerdy_for_state_ani_spr_battler battler=  def battler=(value)    old_battler = @battler    hzhj_old_battlerdy_for_state_ani_spr_battler(value)    if old_battler != @battler      init_battler_add_state_id    end  end  #--------------------------------------------------------------------------  # ● 刷新(追加定义)  #--------------------------------------------------------------------------  alias hzhj_old_update_for_state_ani_spr_battler update  def update    hzhj_old_update_for_state_ani_spr_battler    if @battler      if @battler.need_update_state_animation        @battler.need_update_state_animation = false        if not @battler.hzhj_add_state_id.empty?          for i in @battler.hzhj_add_state_id            if @battler.state?(i)              ani_id = $data_states[i].animation_id              animation = $data_animations[ani_id]              start_loop_animation(animation) if not animation.nil?            end          end          @battler.hzhj_add_state_id.clear        end        if not @battler.hzhj_remove_state_id.empty?          for i in @battler.hzhj_remove_state_id            if not @battler.state?(i)              ani_id = $data_states[i].animation_id              animation = $data_animations[ani_id]              end_loop_animation(animation) if not animation.nil?            end          end          @battler.hzhj_remove_state_id.clear        end      end    end  endend#==============================================================================# ■ Window_BattleLog#==============================================================================class Window_BattleLog < Window_Selectable  #--------------------------------------------------------------------------  # ● 显示状态附加/解除(追加定义)  #--------------------------------------------------------------------------  alias hzhj_old_display_status_for_state_ani_wnd_btlog display_changed_states  def display_changed_states(target)    target.need_update_state_animation = true    hzhj_old_display_status_for_state_ani_wnd_btlog(target)  endend #==============================================================================# ■ Sprite_Damage (新增类)#==============================================================================class Sprite_Damage < Sprite  include Hzhj::HorizontalBattleSystem  #--------------------------------------------------------------------------  # ● 获取/生成伤害值源图  #--------------------------------------------------------------------------  @@obmp = nil  def self.obmp    if @@obmp.nil? or @@obmp.disposed?      @@obmp = Bitmap.new(180, 256)      @@obmp.font.bold = true      @@obmp.font.shadow = false      @@obmp.font.outline = true      @@obmp.font.out_color = Color.new(255, 255, 255, 255)      @@obmp.font.size = 32      colors = []      colors.push(Color.new(255,   0,   0, 255))      colors.push(Color.new(255, 128, 128, 255))      colors.push(Color.new(  0,   0, 255, 255))      colors.push(Color.new(128, 128, 255, 255))      colors.push(Color.new(  0, 255,   0, 255))      colors.push(Color.new(128, 255, 128, 255))      colors.each_with_index do |color, hi|        @@obmp.font.color = color        for wi in 0..9          @@obmp.draw_text(wi * 18, hi * 32, 18, 32, "#{wi}", 1)        end      end      @@obmp.font.size = 20      @@obmp.font.italic = true      @@obmp.font.out_color = Color.new(0, 0, 0, 255)      @@obmp.font.color = Color.new(255, 255, 255, 255)      @@obmp.draw_text( 0, 192, 90, 32, "Critical", 1)      @@obmp.draw_text(90, 192, 90, 32, "Miss", 1)      @@obmp.draw_text( 0, 224, 90, 32, "Evasion", 1)      @@obmp.hue_change(DamageBitmapHue)    end    return @@obmp  end  #--------------------------------------------------------------------------  # ● 初始化  #--------------------------------------------------------------------------  def initialize(viewport, args)    super(viewport)    @type = args[0]    @value = args[1]    @critical = args[2]    self.x = args[4]    self.y = args[5]    self.z = args[6] + Graphics.height * 5    make_move(args[3])    refresh  end  #--------------------------------------------------------------------------  # ● 生成移动数据  #--------------------------------------------------------------------------  def make_move(battler_obj_class)    @move = []    case battler_obj_class    when :actor      make_move_actor    when :enemy      make_move_enemy    else      make_move_default    end  end  #--------------------------------------------------------------------------  # ● 生成移动数据 默认  #--------------------------------------------------------------------------  def make_move_default    45.times do |n|      if n % 3 == 0        ady = n < 21 ? -6 : -1        opa = n < 21 ? 255 : 255-(n-21)*6        @move.push([0, ady, opa])      else        @move.push([0, 0, -1])      end    end  end  #--------------------------------------------------------------------------  # ● 生成移动数据 角色  #--------------------------------------------------------------------------  def make_move_actor    make_move_default  end  #--------------------------------------------------------------------------  # ● 生成移动数据 敌人  #--------------------------------------------------------------------------  def make_move_enemy    make_move_default  end  #--------------------------------------------------------------------------  # ● 描绘  #--------------------------------------------------------------------------  def refresh    if not self.bitmap.nil?      self.bitmap.dispose      self.bitmap = nil    end    begin      @obmp = Cache.animation("damage", DamageBitmapHue)    rescue Errno::ENOENT      @obmp = Sprite_Damage.obmp    end    @numw = @obmp.width / 10    @numh = @obmp.height / 8    @strw = @obmp.width / 2    case @value    when Numeric      blt_obmp_numeric    when Symbol      blt_obmp_text    end  end  #--------------------------------------------------------------------------  # ● 通过源图描绘数字  #--------------------------------------------------------------------------  def blt_obmp_numeric    nums = @value.to_i.abs.to_s.split("")    nbmpw = nums.size * @numw    bmph = @numh    cbmpw = 0    crect = nil    dy = 0    if @critical      cbmpw = @strw      bmph *= 2      crect = Rect.new(0, @numh * 6, @strw, @numh)      dy = @numh    end    self.bitmap = Bitmap.new([nbmpw, cbmpw, 32].max, [bmph, 32].max)    self.ox = bitmap.width / 2    self.oy = bmph /2    bitmap.blt((bitmap.width - cbmpw) / 2, 0, @obmp, crect) if crect    dx = (bitmap.width - nbmpw) / 2    ry = 0    case @type    when :hp      ry = @value >= 0 ? 0 : @numh    when :mp      ry = @value >= 0 ? @numh * 2 : @numh * 3    when :tp      ry = @value >= 0 ? @numh * 4 : @numh * 5    else      return    end    rect = Rect.new(0, ry, @numw, @numh)    nums.each_with_index do |str, i|      rect.x = str.to_i * @numw      bitmap.blt(dx, dy, @obmp, rect)      dx += @numw    end  end  #--------------------------------------------------------------------------  # ● 通过源图描绘文字  #--------------------------------------------------------------------------  def blt_obmp_text    self.bitmap = Bitmap.new([@strw, 32].max, [@numh, 32].max)    self.ox = @strw / 2    self.oy = @numh / 2    rx = ry = 0    case @type    when :miss      rx = @strw      ry = @numh * 6    when :eva      ry = @numh * 7    else      return    end    rect = Rect.new(rx, ry, @strw, @numh)    bitmap.blt(0, 0, @obmp, rect)  end  #--------------------------------------------------------------------------  # ● 释放  #--------------------------------------------------------------------------  def dispose    bitmap.dispose if bitmap    super  end  #--------------------------------------------------------------------------  # ● 移动中判定  #--------------------------------------------------------------------------  def moving?    return (not @move.empty?)  end  #--------------------------------------------------------------------------  # ● 刷新  #--------------------------------------------------------------------------  def update    super    if moving?      ary = @move.shift      self.x += ary[0]      self.y += ary[1]      self.opacity = ary[2] if ary[2] >= 0    end  endend#==============================================================================# ■ Game_BattlerBase#==============================================================================class Game_BattlerBase  #--------------------------------------------------------------------------  # ● 实例变量(新增定义)  #--------------------------------------------------------------------------  attr_accessor :hzhj_damage  #--------------------------------------------------------------------------  # ● 初始化(追加定义)  #--------------------------------------------------------------------------  alias hzhj_old_init_for_display_damage_game_battler_base initialize  def initialize    @hzhj_damage = []    hzhj_old_init_for_display_damage_game_battler_base  endend#==============================================================================# ■ Sprite_Base#==============================================================================class Sprite_Base < Sprite  #--------------------------------------------------------------------------  # ● 初始化(追加定义)  #--------------------------------------------------------------------------  alias hzhj_old_init_for_display_damage_spr_base initialize  def initialize(*args)    hzhj_old_init_for_display_damage_spr_base(*args)    @hzhj_damage_sprites = []  end  #--------------------------------------------------------------------------  # ● 释放(追加定义)  #--------------------------------------------------------------------------  alias hzhj_old_dispose_for_display_damage_spr_base dispose  def dispose    hzhj_old_dispose_for_display_damage_spr_base    dispose_damage  end  #--------------------------------------------------------------------------  # ● 判断是否有伤害在显示(新增定义)  #--------------------------------------------------------------------------  def damage?    return (not @hzhj_damage_sprites.empty?)  end  #--------------------------------------------------------------------------  # ● 开始显示伤害(新增定义)  #--------------------------------------------------------------------------  def start_damage(args)    args[4] = x - ox + width / 2    args[5] = y - oy + height / 2    args[6] = z    @hzhj_damage_sprites.push(Sprite_Damage.new(viewport, args))  end  #--------------------------------------------------------------------------  # ● 释放所有伤害显示(新增定义)  #--------------------------------------------------------------------------  def dispose_damage    return unless damage?    @hzhj_damage_sprites.each{|sprite|sprite.dispose}    @hzhj_damage_sprites.clear  end  #--------------------------------------------------------------------------  # ● 刷新(追加定义)  #--------------------------------------------------------------------------  alias hzhj_old_update_for_display_damage_spr_base update  def update    hzhj_old_update_for_display_damage_spr_base    update_damage  end  #--------------------------------------------------------------------------  # ● 刷新显示伤害(新增定义)  #--------------------------------------------------------------------------  def update_damage    return unless damage?    @hzhj_damage_sprites.each_with_index do |sprite, i|      if sprite.moving?        sprite.update      else        sprite.dispose        @hzhj_damage_sprites[i] = nil      end    end    @hzhj_damage_sprites.delete(nil)  endend#==============================================================================# ■ Sprite_Battler#==============================================================================class Sprite_Battler < Sprite_Base  #--------------------------------------------------------------------------  # ● 刷新(追加定义)  #--------------------------------------------------------------------------  alias hzhj_old_update_for_display_damage_spr_battler update  def update    hzhj_old_update_for_display_damage_spr_battler    if @battler      if not @battler.hzhj_damage.empty?        unless @battler.damage_section_displayed          args = @battler.hzhj_damage.clone          args[3] = @battler.actor? ? :actor : (@battler.enemy? ? :enemy : nil)          start_damage(args)        end        @battler.hzhj_damage.clear      end    end  endend#==============================================================================# ■ Window_BattleLog#==============================================================================class Window_BattleLog < Window_Selectable  #--------------------------------------------------------------------------  # ● 显示 MISS (追加定义)  #--------------------------------------------------------------------------  alias hzhj_old_display_miss_for_display_damage_wnd_btlog display_miss  def display_miss(target, item)    target.hzhj_damage = [:miss, :miss, false]    hzhj_old_display_miss_for_display_damage_wnd_btlog(target, item)  end  #--------------------------------------------------------------------------  # ● 显示回避 (追加定义)  #--------------------------------------------------------------------------  alias hzhj_old_display_evasion_for_display_damage_wnd_btlog display_evasion  def display_evasion(target, item)    target.hzhj_damage = [:eva, :evasion, false]    hzhj_old_display_evasion_for_display_damage_wnd_btlog(target, item)  end  #--------------------------------------------------------------------------  # ● 显示 HP 伤害 (追加定义)  #--------------------------------------------------------------------------  alias hzhj_old_display_hp_damage_for_display_damage_wnd_btlog display_hp_damage  def display_hp_damage(target, item)    return if target.result.hp_damage == 0 && item && !item.damage.to_hp?    value = target.result.hp_damage    critical = target.result.critical    target.hzhj_damage = [:hp, value, critical]    hzhj_old_display_hp_damage_for_display_damage_wnd_btlog(target, item)  end  #--------------------------------------------------------------------------  # ● 显示 MP 伤害 (追加定义)  #--------------------------------------------------------------------------  alias hzhj_old_display_mp_damage_for_display_damage_wnd_btlog display_mp_damage  def display_mp_damage(target, item)    return if target.dead? || target.result.mp_damage == 0    value = target.result.mp_damage    critical = target.result.critical    target.hzhj_damage = [:mp, value, critical]    hzhj_old_display_mp_damage_for_display_damage_wnd_btlog(target, item)  end  #--------------------------------------------------------------------------  # ● 显示 TP 伤害 (追加定义)  #--------------------------------------------------------------------------  alias hzhj_old_display_tp_damage_for_display_damage_wnd_btlog display_tp_damage  def display_tp_damage(target, item)    return if target.dead? || target.result.tp_damage == 0    value = target.result.tp_damage    critical = target.result.critical    target.hzhj_damage = [:tp, value, critical]    hzhj_old_display_tp_damage_for_display_damage_wnd_btlog(target, item)  endend class RPG::Animation  def need_move    return @need_move unless @need_move.nil?    if /@[Rr][Mm]/ =~ @name      return (@need_move = true)    else      return (@need_move = false)    end  end  def move_se    return @move_se unless @move_se.nil?    @move_se = RPG::SE.new    if /@[Ss][Ee]\[(.+?)\]/ =~ @name      @move_se.name = $1.clone    end    return @move_se  end  attr_writer :need_move  attr_writer :move_seend#==============================================================================# ■ Game_Battler#==============================================================================class Game_Battler < Game_BattlerBase  include Hzhj::HorizontalBattleSystem  #--------------------------------------------------------------------------  # ● 属性  #--------------------------------------------------------------------------  attr_accessor :add_x                    # X 坐标变化量  attr_accessor :add_y                    # Y 坐标变化量  attr_accessor :move_speed_x             # 战斗图 X 移动速度  attr_accessor :move_speed_y             # 战斗图 Y 移动速度  #--------------------------------------------------------------------------  # ● 初始化(追加定义)  #--------------------------------------------------------------------------  alias hzhj_old_init_for_real_move_game_battler initialize  def initialize    @add_x = 0    @add_y = 0    @move_speed_x = 0    @move_speed_y = 0    hzhj_old_init_for_real_move_game_battler  end  #--------------------------------------------------------------------------  # ● 真实 X 坐标(新增定义)  #--------------------------------------------------------------------------  def real_screen_x    return screen_x + add_x  end  #--------------------------------------------------------------------------  # ● 真实 Y 坐标(新增定义)  #--------------------------------------------------------------------------  def real_screen_y    return screen_y + add_y  end  #--------------------------------------------------------------------------  # ● 返回自己的战斗位置(新增定义)  #--------------------------------------------------------------------------  def come_back_self_position(duration)    return if dead?    tx = screen_x    ty = screen_y    addx = tx - real_screen_x    addy = ty - real_screen_y    return if addx == 0 && addy == 0    @add_x = 0    @add_y = 0    @move_speed_x = [(addx.abs / duration.to_f).ceil, 1].max    @move_speed_y = [(addy.abs / duration.to_f).ceil, 1].max  end  #--------------------------------------------------------------------------  # ● 设置移动信息(新增定义)  #--------------------------------------------------------------------------  def setup_move_info(target_battler, duration, move_se)    return if dead?    tbmp = Cache.battler(target_battler.battler_name, target_battler.battler_hue)    sbmp = Cache.battler(@battler_name, @battler_hue)    tbw = tbmp.width / DynamicPatternMax + RealMoveBmpAddW    sbw = sbmp.width / DynamicPatternMax + RealMoveBmpAddW    tbh = tbmp.height + RealMoveBmpAddH    sbh = sbmp.height + RealMoveBmpAddH    d = actor? ? ActorDirection : 10 - ActorDirection    tx = target_battler.real_screen_x    ty = target_battler.real_screen_y    case d    when 1      tx = tx + tbw / 2 + sbw / 2      ty = ty - sbh / 2    when 2      ty = ty - sbh / 2    when 3      tx = tx - tbw / 2 - sbw / 2      ty = ty - sbh / 2    when 4      tx = tx + tbw / 2 + sbw / 2    when 6      tx = tx - tbw / 2 - sbw / 2    when 7      tx = tx + tbw / 2 + sbw / 2      ty = ty + sbh / 2    when 8      ty = ty + sbh / 2    when 9      tx = tx - tbw / 2 - sbw / 2      ty = ty + sbh / 2    end    addx = tx - real_screen_x    addy = ty - real_screen_y    return if addx == 0 && addy == 0    @add_x = tx - screen_x if addx != 0    @add_y = ty - screen_y if addy != 0    @move_speed_x = [(addx.abs / duration.to_f).ceil, 1].max    @move_speed_y = [(addy.abs / duration.to_f).ceil, 1].max    move_se.play  endend#==============================================================================# ■ Sprite_Battler#==============================================================================class Sprite_Battler < Sprite_Base  #--------------------------------------------------------------------------  # ● 初始化(追加定义)  #--------------------------------------------------------------------------  alias hzhj_old_init_for_real_move_spr_battler initialize  def initialize(viewport, battler = nil)    hzhj_old_init_for_real_move_spr_battler(viewport, battler)    init_position(@battler) if @battler  end  #--------------------------------------------------------------------------  # ● 设置战斗者(追加定义)  #--------------------------------------------------------------------------  alias hzhj_old_set_battler_for_real_move_spr_battler battler=  def battler=(value)    if @battler != value && value      init_position(value)    end    hzhj_old_set_battler_for_real_move_spr_battler(value)  end  #--------------------------------------------------------------------------  # ● 初始化位置(新增定义)  #--------------------------------------------------------------------------  def init_position(battler)    battler.add_x = 0    battler.add_y = 0    self.x = battler.real_screen_x    self.y = battler.real_screen_y    self.z = battler.screen_z  end  #--------------------------------------------------------------------------  # ● 移动中判定(新增定义)  #--------------------------------------------------------------------------  def moving?    return false unless @battler    (x != @battler.real_screen_x or y != @battler.real_screen_y) && @battler  end  #--------------------------------------------------------------------------  # ● 位置的更新(重定义)  #--------------------------------------------------------------------------  def update_position    if !@battler.dead?      if x < @battler.real_screen_x        self.x = [x + @battler.move_speed_x, @battler.real_screen_x].min      elsif x > @battler.real_screen_x        self.x = [x - @battler.move_speed_x, @battler.real_screen_x].max      end      if y < @battler.real_screen_y        self.y = [y + @battler.move_speed_y, @battler.real_screen_y].min      elsif y > @battler.real_screen_y        self.y = [y - @battler.move_speed_y, @battler.real_screen_y].max      end      self.z = y + 100    end  endend#==============================================================================# ■ Spriteset_Battle#==============================================================================class Spriteset_Battle  #--------------------------------------------------------------------------  # ● 判定是否移动中(新增定义)  #--------------------------------------------------------------------------  def moving?    battler_sprites.any? {|sprite| sprite.moving? }  endend#==============================================================================# ■ Scene_Battle#==============================================================================class Scene_Battle < Scene_Base  #--------------------------------------------------------------------------  # ● 等待战斗图移动的结束(新增定义)  #--------------------------------------------------------------------------  def wait_for_move    update_for_wait    update_for_wait while @spriteset.moving?  endend class RPG::Troop  include Hzhj::HorizontalBattleSystem  def display_enemy_bar    return @display_enemy_bar unless @display_enemy_bar.nil?    if /@ebar/i =~ @name      return (@display_enemy_bar = !DefaultDisplayEnemyBar)    else      return (@display_enemy_bar = DefaultDisplayEnemyBar)    end  end  attr_writer :display_enemy_barend#==============================================================================# ■ Game_Troop#==============================================================================class Game_Troop < Game_Unit  attr_accessor :display_enemy_bar      # 是否显示敌人HP条、MP条、TP条  #--------------------------------------------------------------------------  # ● 设置  #--------------------------------------------------------------------------  alias hzhj_old_setup_for_display_enemy_bar_game_troop setup  def setup(troop_id)    hzhj_old_setup_for_display_enemy_bar_game_troop(troop_id)    @display_enemy_bar = troop.display_enemy_bar  endend#==============================================================================# ■ Window_BattleEnemy#==============================================================================class Window_BattleEnemy < Window_Selectable  #--------------------------------------------------------------------------  # ● 取得列数  #--------------------------------------------------------------------------  def col_max    if $game_troop.display_enemy_bar      return 1    else      return 2    end  end  #--------------------------------------------------------------------------  # ● 刷新  #--------------------------------------------------------------------------  def refresh    create_contents    super  end  #--------------------------------------------------------------------------  # ● 描画项目  #--------------------------------------------------------------------------  def draw_item(index)    if $game_troop.display_enemy_bar      enemy = $game_troop.alive_members[index]      draw_basic_area(basic_area_rect(index), enemy)      draw_gauge_area(gauge_area_rect(index), enemy)    else      change_color(normal_color)      name = $game_troop.alive_members[index].name      draw_text(item_rect_for_text(index), name)    end  end  #--------------------------------------------------------------------------  # ● 取得基本区域的矩形  #--------------------------------------------------------------------------  def basic_area_rect(index)    rect = item_rect_for_text(index)    rect.width -= gauge_area_width + 10    rect  end  #--------------------------------------------------------------------------  # ● 取得值槽区域的矩形  #--------------------------------------------------------------------------  def gauge_area_rect(index)    rect = item_rect_for_text(index)    rect.x += rect.width - gauge_area_width    rect.width = gauge_area_width    rect  end  #--------------------------------------------------------------------------  # ● 取得值槽区域的宽度  #--------------------------------------------------------------------------  def gauge_area_width    return 220  end  #--------------------------------------------------------------------------  # ● 描画基本区域  #--------------------------------------------------------------------------  def draw_basic_area(rect, actor)    draw_actor_name(actor, rect.x + 0, rect.y, 100)    draw_actor_icons(actor, rect.x + 104, rect.y, rect.width - 104)  end  #--------------------------------------------------------------------------  # ● 描画值槽区域  #--------------------------------------------------------------------------  def draw_gauge_area(rect, actor)    if $data_system.opt_display_tp      draw_gauge_area_with_tp(rect, actor)    else      draw_gauge_area_without_tp(rect, actor)    end  end  #--------------------------------------------------------------------------  # ● 描画值槽区域(包括 TP 值)  #--------------------------------------------------------------------------  def draw_gauge_area_with_tp(rect, actor)    draw_actor_hp(actor, rect.x + 0, rect.y, 72)    draw_actor_mp(actor, rect.x + 82, rect.y, 64)    draw_actor_tp(actor, rect.x + 156, rect.y, 64)  end  #--------------------------------------------------------------------------  # ● 描画值槽区域(不包括 TP 值)  #--------------------------------------------------------------------------  def draw_gauge_area_without_tp(rect, actor)    draw_actor_hp(actor, rect.x + 0, rect.y, 134)    draw_actor_mp(actor, rect.x + 144,  rect.y, 76)  endend #==============================================================================# ■ Sprite_Battler#==============================================================================class Sprite_Battler < Sprite_Base  include Hzhj::HorizontalBattleSystem  #--------------------------------------------------------------------------  # ● 初始化(追加定义)  #--------------------------------------------------------------------------  alias hzhj_old_init_for_dynamic_spr_battler initialize  def initialize(viewport, battler = nil)    hzhj_old_init_for_dynamic_spr_battler(viewport, battler)    @dynamic_duration = 0    @dynamic_duration_max = DynamicPatternMax * OnePatternDuration  end  #--------------------------------------------------------------------------  # ● 源位图(Source Bitmap)的更新(重定义)  #--------------------------------------------------------------------------  def update_bitmap    new_bitmap = Cache.battler(@battler.battler_name, @battler.battler_hue)    if bitmap != new_bitmap      self.bitmap = new_bitmap      init_visibility      @dynamic_duration = 0      @sx = 0      @sw = bitmap.width / DynamicPatternMax      @sh = bitmap.height      self.ox = @sw / 2      self.oy = @sh      src_rect.set(@sx, 0, @sw, @sh)    end  end  #--------------------------------------------------------------------------  # ● 原点的更新(重定义)  #--------------------------------------------------------------------------  def update_origin    if bitmap      @dynamic_duration += 1      @dynamic_duration %= @dynamic_duration_max      @sx = @dynamic_duration / OnePatternDuration * @sw      src_rect.set(@sx, 0, @sw, @sh)    end  end  #--------------------------------------------------------------------------  # ● 返回普通设定(追加定义)  #--------------------------------------------------------------------------  alias hzhj_old_revert_to_normal_for_dynamic_spr_battler revert_to_normal  def revert_to_normal    hzhj_old_revert_to_normal_for_dynamic_spr_battler    self.ox = @sw / 2 if bitmap  end  #--------------------------------------------------------------------------  # ● BOSS 战败(崩坏)效果的更新(追加定义)  #--------------------------------------------------------------------------  alias hzhj_old_update_boss_col_for_dynamic_spr_battler update_boss_collapse  def update_boss_collapse    hzhj_old_update_boss_col_for_dynamic_spr_battler    self.ox = @sw / 2 + @effect_duration % 2 * 4 - 2  endend #==============================================================================# ■ Game_Battler#==============================================================================class Game_Battler < Game_BattlerBase  def set_normal_battler_name    @battler_name = @battler_name.split(/★/)[0]  end  def set_beaten_battler_name    if guard?      if (UseActorGuardGraphic && actor?) or         (UseEnemyGuardGraphic && enemy?)        set_guard_battler_name        return      end    end    @battler_name = @battler_name.split(/★/)[0] + "★1"    if UseActorWBSE && actor?      Audio.se_play("Audio/SE/AWBSE_#{id}", 100, 100)    elsif UseEnemyWBSE && enemy?      Audio.se_play("Audio/SE/EWBSE_#{enemy_id}", 100, 100)    end  end  def set_dead_battler_name    @battler_name = @battler_name.split(/★/)[0] + "★2"  end  def set_guard_battler_name    @battler_name = @battler_name.split(/★/)[0] + "★3"    if UseActorGDSE && actor?      Audio.se_play("Audio/SE/AGDSE_#{id}", 100, 100)    elsif UseEnemyGDSE && enemy?      Audio.se_play("Audio/SE/EGDSE_#{enemy_id}", 100, 100)    end  endend#==============================================================================# ■ Sprite_Battler#==============================================================================class Sprite_Battler < Sprite_Base  #--------------------------------------------------------------------------  # ● 初始化(追加定义)  #--------------------------------------------------------------------------  alias hzhj_old_init_for_dead_spr_battler initialize  def initialize(viewport, battler = nil)    hzhj_old_init_for_dead_spr_battler(viewport, battler)    @dead_graphic_used = false    if @battler      @battler.set_normal_battler_name      if @battler.dead?        if (UseActorDeadGraphic && @battler.actor?) or           (UseEnemyDeadGraphic && @battler.enemy?)          @battler.set_dead_battler_name          @dead_graphic_used = true        end      end    end    @beaten_duration = -1  end  #--------------------------------------------------------------------------  # ● 设置战斗者(追加定义)  #--------------------------------------------------------------------------  alias hzhj_old_set_battler_for_dead_spr_battler battler=  def battler=(value)    if @battler != value      @dead_graphic_used = false      if value        value.set_normal_battler_name        if value.dead?          if (UseActorDeadGraphic && value.actor?) or             (UseEnemyDeadGraphic && value.enemy?)            value.set_dead_battler_name            @dead_graphic_used = true          end        end      end      @beaten_duration = -1    end    hzhj_old_set_battler_for_dead_spr_battler(value)  end  #--------------------------------------------------------------------------  # ● 源位图(Source Bitmap)的更新(重定义)  #--------------------------------------------------------------------------  alias hzhj_old_update_bitmap_for_was_beaten_spr_battler update_bitmap  def update_bitmap    if @beaten_duration > 0      @beaten_duration -= 1    elsif @beaten_duration == 0      @beaten_duration = -1      set_bitmap(:normal)    end    hzhj_old_update_bitmap_for_was_beaten_spr_battler  end  #--------------------------------------------------------------------------  # ● 初始化可视状态(追加定义)  #--------------------------------------------------------------------------  alias hzhj_old_visibility_for_dead_spr_battler init_visibility  def init_visibility    hzhj_old_visibility_for_dead_spr_battler    if @battler.dead?      if (UseActorDeadGraphic && @battler.actor?) or         (UseEnemyDeadGraphic && @battler.enemy?)        self.opacity = 255      end    end  end  #--------------------------------------------------------------------------  # ● 效果开始(追加定义)  #--------------------------------------------------------------------------  alias hzhj_old_start_effect_for_dead_spr_battler start_effect  def start_effect(effect_type)    if effect_type == :appear      if @dead_graphic_used        set_bitmap(:normal)        @effect_type = nil        @effect_duration = 0        @dead_graphic_used = false        @battler_visible = true        return      end    elsif effect_type == :collapse or          effect_type == :boss_collapse or          effect_type == :instant_collapse      if @beaten_duration >= 0        @beaten_duration = -1        set_bitmap(:normal)      end      if (UseActorDeadGraphic && @battler.actor?) or         (UseEnemyDeadGraphic && @battler.enemy?)        set_bitmap(:dead)        @effect_type = nil        @effect_duration = 0        @dead_graphic_used = true        @battler_visible = false        return      end    end    hzhj_old_start_effect_for_dead_spr_battler(effect_type)  end  #--------------------------------------------------------------------------  # ● 设置新的位图(新增定义)  #--------------------------------------------------------------------------  def set_bitmap(sym)    case sym    when :normal      @battler.set_normal_battler_name    when :was_beaten      @battler.set_beaten_battler_name    when :dead      @battler.set_dead_battler_name    else      return    end    new_bitmap = Cache.battler(@battler.battler_name, @battler.battler_hue)    if bitmap != new_bitmap      self.bitmap = new_bitmap      @dynamic_duration = 0      @sx = 0      @sw = bitmap.width / DynamicPatternMax      @sh = bitmap.height      self.ox = @sw / 2      self.oy = @sh      src_rect.set(@sx, 0, @sw, @sh)    end    update_origin    update_position  endend #==============================================================================# ■ Scene_Battle#==============================================================================class Scene_Battle < Scene_Base  #--------------------------------------------------------------------------  # ● 发动技能/物品(新增定义)  #--------------------------------------------------------------------------  def hzhj_invoke_item(target, item, damage_target)    refresh_status    @log_window.display_action_results(damage_target, item)    @subject.damage_section_displayed = false    @subject.last_target_index = target.index    return if target.dead?    if rand < target.item_cnt(@subject, item)      hzhj_invoke_counter_attack(target, item)    elsif rand < target.item_mrf(@subject, item)      hzhj_invoke_magic_reflection(target, item)    end  end  #--------------------------------------------------------------------------  # ● 发动物理反击(新增定义)  #--------------------------------------------------------------------------  def hzhj_invoke_counter_attack(target, item)    @log_window.display_counter(target, item)    attack_skill = $data_skills[target.attack_skill_id]    @subject.item_apply(target, attack_skill)    need_move = false    animation1 = $data_animations[target.animation1_id]    need_move = animation1.need_move if animation1    ary = [@subject]    if need_move      target.setup_move_info(@subject, RealMoveDuration, animation1.move_se)      wait_for_move    end    @subject.damage_section_displayed = false    @subject.not_damage_section = false    show_subject_animation(target.animation1_id, target)    show_normal_animation(ary, target.atk_animation_id1, false)    show_normal_animation(ary, target.atk_animation_id2, true)    @log_window.wait    wait_for_animation    if need_move && target.alive?      target.come_back_self_position(RealMoveDuration)      wait_for_move    end    refresh_status    @log_window.display_action_results(@subject, attack_skill)  end  #--------------------------------------------------------------------------  # ● 发动魔法反射(新增定义)  #--------------------------------------------------------------------------  def hzhj_invoke_magic_reflection(target, item)    @subject.damage_section_displayed = false    @subject.not_damage_section = false    @log_window.display_reflection(target, item)    @subject.item_apply(@subject, item)    refresh_status    @log_window.display_action_results(@subject, item)  endend #==============================================================================# ■ Game_Battler#==============================================================================class Game_Battler < Game_BattlerBase  attr_accessor :damage_section_displayed  attr_accessor :not_damage_sectionend#==============================================================================# ■ Game_Actor#==============================================================================class Game_Actor < Game_Battler  #--------------------------------------------------------------------------  # ● 执行伤害效果  #--------------------------------------------------------------------------  alias hzhj_old_per_damage_for_damage_section_game_actor perform_damage_effect  def perform_damage_effect    unless damage_section_displayed      hzhj_old_per_damage_for_damage_section_game_actor    end  endend#==============================================================================# ■ Game_Enemy#==============================================================================class Game_Enemy < Game_Battler  #--------------------------------------------------------------------------  # ● 执行伤害效果  #--------------------------------------------------------------------------  alias hzhj_old_per_damage_for_damage_section_game_enemy perform_damage_effect  def perform_damage_effect    unless damage_section_displayed      hzhj_old_per_damage_for_damage_section_game_enemy    end  endend#==============================================================================# ■ Sprite_Battler#==============================================================================class Sprite_Battler < Sprite_Base  #--------------------------------------------------------------------------  # ● SE 和闪烁时机的处理  #--------------------------------------------------------------------------  def animation_process_timing(timing)    if timing.se.name == DamageSectionDisplaySEName      hp_value = @battler.result.hp_damage      mp_value = @battler.result.mp_damage      tp_value = @battler.result.tp_damage      value = args = nil      was_beaten = false      if hp_value != 0 && !@battler.not_damage_section        was_beaten = true if hp_value > 0        value = hp_value * timing.flash_color.red.to_i / 100        critical = @battler.result.critical        args = [:hp, value, critical]      elsif mp_value != 0 && !@battler.not_damage_section        was_beaten = true if mp_value > 0        value = mp_value * timing.flash_color.red.to_i / 100        critical = @battler.result.critical        args = [:mp, value, critical]      elsif tp_value != 0 && !@battler.not_damage_section        was_beaten = true if tp_value > 0        value = tp_value * timing.flash_color.red.to_i / 100        critical = @battler.result.critical        args = [:tp, value, critical]      end      if value && args        args[3] = @battler.actor? ? :actor : (@battler.enemy? ? :enemy : nil)        @battler.damage_section_displayed = true        start_damage(args)        if UseBeatenGraphic && was_beaten          set_bitmap(:was_beaten)          @beaten_duration = BeatenGraphicDuration        end      end      return    end    super(timing)  endend#==============================================================================# ■ Scene_Battle#==============================================================================class Scene_Battle < Scene_Base  #--------------------------------------------------------------------------  # ● 应用技能/物品效果(新增定义)  #--------------------------------------------------------------------------  def hzhj_apply_item_effects(target, item)    target.damage_section_displayed = false    target.not_damage_section = false    target = apply_substitute(target, item)    target.damage_section_displayed = false    target.not_damage_section = false    target.item_apply(@subject, item)    return target  endend#==============================================================================# ■ 此脚本来自 [url]www.66rpg.com[/url]#==============================================================================
复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

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

在本版发帖返回顶部