Project1

标题: 求半即时战斗系统 1.03b版 a1=83 a2=84 的显示动画脚本 [打印本页]

作者: davis2000    时间: 2011-7-28 19:57
标题: 求半即时战斗系统 1.03b版 a1=83 a2=84 的显示动画脚本
本帖最后由 davis2000 于 2011-8-8 18:12 编辑

那个半即时战斗系统 1.03b版有疾风斩跟史莱姆的显示动画脚本
寫95跟a1=83. a2=84.就会有两个战斗动画
我只要那段就好了

[tr]
=============================================================================
#★Zhong RMVX 半即时战斗系统 1.03b版★
#-----------------------------------------------------------------------------
#★Scene_CP核心部分参考自 : 神思  《战斗真位移》战斗系统
#★作者: Zhong_zw
#★联系方式: 66rpg.com论坛短信 或 [email protected]
#★游戏中如若引用本脚本,请保留以上信息,并作相关说明.
#☆如若转载本脚本请联系本人☆
#=============================================================================
#=============================================================================
#☆1.01版修正问题:
#1、物品、特技窗口选择我方人物时,头像重叠
#2、连续伤害及自动回复效果无效。
#☆1.02版修正问题:
#1、减少刷新次数,提高速度
#2、修正被打击时有可能退到cp槽外
#☆1.02a版修正问题:
#1、复活问题.
#2、头像刷新问题.
#☆1.03版更新内容:
#1、地图名称与战斗背景的对应关系可在哈希表中设置
#2、如无相应战斗背景直接采用默认战斗背景
#3、角色CP图缺失时,用角色相应行走图代替
#☆1.03a版更新内容:
#1、物品经验得失窗口有时图标显示错误的问题
#★注:旧版本的只要把脚本中“class Window_egi<Window_Base”这个类完整的覆盖原来就行了。
#☆1.03b版更新内容:
#1、图标战斗指令窗口刷新的问题
#2、修正战斗事件响应的部分功能
#=============================================================================
#☆使用方法说明☆
#☆使用方法基本与我之前发的朴素横版战斗相同
#☆动画设置:
#1、武器、特技、物品的施展动画直接在其备注填入动画id即可。如果为空即不显示施展动画。
#2、敌人普通攻击动画,在其备注里填写格式如下:
#  a1=XX #施展动画id
#  a2=XX #对方动画id
#如果为空即使用默认普通动画(画面震动).
#☆战斗图设置:
#3、角色战斗图的的命名方式是角色id后面加上_z,如1_z.存放在Battlers文件夹。
#4、默认待机图为两帧,只要在Battlers文件夹里放一个“战斗图名+待“的文件,就会自动循环播放
#这两个战斗图,如1_b待,没有则没待机动作。
#☆战斗背景设置:
#5、在Graphics目录下新建Battlebacks文件夹。
#6、战斗时先搜索文件夹内是否有与角色所在区域同名的战斗图,如果没有则搜索文件夹里是否
#存在与地图同名的图片。
#7、简而言之,你须储存与你地图同名的战斗背景在Battlebacks,如果想在同一幅地图实现不同地域
#战斗背景不同,就在Battlebacks文件夹里储存与这个地域同名的战斗背景.至少保证战斗的地图
#都有一幅该地图同名的战斗背景,不然战斗时会提示找不到地图.(可参考《拉尔夫战记》或朴素横版的范例)
#☆CP条设置:
#8、CP条:在system文件夹里储存一个命名为"cp条"的图片,默认长度为327,如果需要可在Scene_CP类里调整相
#关参数.
#9、角色cp图命名方式是"角色id+_cp",如:1_cp,角色活跃cp图命名方式是"角色id+_a_cp",如1_a_cp,
#敌人cp图命名方式是"敌人名 + _敌人cp",如史莱姆_敌人cp,敌人活跃cp图是"敌人名+_a_cp".
#亦可在system文件夹里储存名为"敌人cp"的图片,作为敌人的统一cp图,活跃图名为"a_敌人cp",默认如果找不到敌人相关cp图就直接
#用这张图片.
#☆选择光标设置
#10、在system文件夹里储存名为"光标"的图片作为选择光标.
#11、B_B_CONFIG = true 时地图与战斗背景的命名关系写在BATTLE_BACK 这个数组里,
#B_B_CONFIG = false时,和战斗背景和以前的命名方式相同。
#12、战斗背景文件缺失时,用回默认战斗背景。
#★队伍战斗事件的设置说明★:
#13、除“回合”和“回合结束”条件外,其他事件条件设置与默认系统相同。
#14、关于角色回合的定义:角色回合是指每个角色各自独有一个回合属性,角色CP值每满一次就增加一个回合,角色间的回合相互独立。
#15、关于角色回合条件设置,参照工程目录下的“说明图片”文件夹的图片1、2,3对各个框进行设置,实现两种回合条件的设置
#    步骤如下:
#     一、一般回合条件设置,即当角色回合等于或大于小于某个数值时就在回合开始前或后执行
#         事件。
#       1. 参看“说明图片”文件夹中的图1对各个框的定义。
#       2. 在事件条件设置窗口中勾上“回合结束”,即打开回合条件设置开关。
#       3. 勾上“回合数”,在“回合关系参数”框里输入“回合关系参数”。★注:旁边的那个框值为0
#       回合关系参数取值:
#            0 为当 "角色回合"等于"回合参数"值时,回合开始前执行。
#            1 为当 "角色回合"大于"回合参数"值时,回合开始前执行。
#            2 为当 "角色回合"小于"回合参数"值时,回合开始前执行。
#            3 为当 "角色回合"等于"回合参数"值时,回合进行后执行。
#            4 为当 "角色回合"大于"回合参数"值时,回合进行后执行。
#            5 为当 "角色回合"小于"回合参数"值时,回合进行后执行。
#        
#       4.选择“回合对象”,勾上相应的"敌角色"或"角色",选择相应对象。
#       5.在“回合参数”框上填入相关数值。

#     二、循环回合条件设置,即当角色回合等于某个回合后执行事件,以后每隔N个回合在执行一次。
#         1. 参看“说明图片”文件夹中的图2对各个框的定义。
#         2.设置事件执行时机,即回合执行前或后。
#           对“事件执行时机参数”进行设置,取值如下:
#             0 为回合执行前。
#             1 为回合执行后。
#         3.设置"间隔参数",即当达到一定回合数后,每隔N个回合再执行事件的间隔。
#         4.设置相应“回合对象”
#         5.设置“回合参数”
#         6.如图3设置,把“间隔”设为回合。
#16、附赠角色显示动画函数:
#     $game_troop.interpreter.add_aa(动画对象,动画id)
#     "动画对象"取值:角色id或-1,-1时即全体动画
#      在事件的"脚本"中调用就可以了!
#
#           
#=============================================================================
#=============================================================================
#★战斗背景设置及其他功能开关
#=============================================================================
BATTLE_BACK = {"地"=>"0","地1"=>"0"} #地图名称与战斗背景对应关系,命名方式:地图名或区域=>战斗背景名
B_B_CONFIG = true #是否启用地图名称与战斗背景对应关系功能
#"汪洋"=>"草地1",


#================================================
#★战斗者类
#================================================
class Game_Battler
   attr_accessor :cp
   attr_accessor :cp_total
   #================================================
   attr_accessor :Battler_turn #角色单独的回合数
   attr_accessor :turn_start  #角色回合状态 0:回合结束或非角色回合 1:角色回合 3:角色回合准备
   #================================================
   attr_accessor :cp_turn #角色能不行动时,计算角色实际cp爆满次数,用以代替回合,计算状态解除时机
   #=======================================
  attr_accessor :animation2_id   
  attr_accessor :act_status
  attr_accessor :damage
  attr_accessor :damage_pop
  attr_accessor :slip_damage
  attr_accessor :auto_damage
  #=========================================
   
   alias oldinitialize  initialize
   def initialize
     @cp = 0
     @cp_total = false
     @cp_turn = 0
     @damage = nil
     @damage_pop = false
     @act_status = 0
     @slip_damage = 0
     @auto_damage = 0
     @Battler_turn = 0
     @turn_start = 0
     oldinitialize
   end
  def maxcp
    return 100
  end  
  #--------------------------------------------------------------------------
  # ● 应用连续伤害效果
  #--------------------------------------------------------------------------
  def slip_damage_effect
    if slip_damage? and @hp > 0
      @hp_damage = apply_variance(maxhp / 10, 10)
      @hp_damage = @hp - 1 if @hp_damage >= @hp
      @slip_damage = @hp_damage
      self.hp -= @hp_damage
    end
  end

end #class   
#===============================================
#★角色队伍类
#===============================================
class Game_Party < Game_Unit
attr_accessor :actor_battler
alias oldinitialize initialize
def initialize
  oldinitialize
  @actor_battler = []
end
end #class  
#================================================
#★敌人队伍类
#================================================
class Game_Troop < Game_Unit
  attr_accessor :enemy_battler
alias  oldinitialize initialize
def initialize
   oldinitialize
   @enemy_battler = []
end  
  #--------------------------------------------------------------------------
  # ● 判断是否符合战斗事件 (页) 条件
  #     page : 战斗事件页
  #--------------------------------------------------------------------------
  def conditions_met?(page)
    c = page.condition
    if not c.turn_ending and not c.turn_valid and not c.enemy_valid and
       not c.actor_valid and not c.switch_valid
      return false      # 未设置条件…不执行
    end
    if @event_flags
      return false      # 已执行
    end

    if c.enemy_valid    # 敌方角色
      enemy = $game_troop.members[c.enemy_index]
      return false if enemy == nil
      if c.turn_ending == false  #
        return false if enemy.hp * 100.0 / enemy.maxhp > c.enemy_hp
      elsif c.turn_ending and not c.turn_valid  
        return false if enemy.Battler_turn != c.enemy_hp  or enemy.cp != 100
      elsif c.turn_ending and  c.turn_valid
        a = c.turn_a
        b = c.turn_b
       if b>0
        return false if (a==0 and ( c.enemy_hp < 1 or enemy.Battler_turn < c.enemy_hp or enemy.Battler_turn % b != c.enemy_hp % b or enemy.cp != 100 or enemy.turn_start != 1))
        return false if (a==1 and ( c.enemy_hp < 1 or enemy.Battler_turn < c.enemy_hp or enemy.Battler_turn % b != c.enemy_hp % b or enemy.cp != 100 or enemy.turn_start != 0))
       else
         if a == 0 #回合开始时 等于
          return false if ( enemy.Battler_turn != c.enemy_hp or enemy.cp != 100 or enemy.turn_start != 1)
         
          elsif a == 1 # #回合开始时 回合数大于
           return false if (enemy.Battler_turn <= c.enemy_hp or enemy.cp != 100 or enemy.turn_start != 1)
          elsif a == 2 #回合开始时 回合数小于
           return false if (enemy.Battler_turn >= c.enemy_hp or enemy.cp != 100 or enemy.turn_start != 1)
          elsif a == 3 #回合结束时 回合数等于
           return false if (enemy.Battler_turn != c.enemy_hp or enemy.cp != 100 or enemy.turn_start != 0)
          elsif a == 4 #回合结束时 回合数大于
           return false if (enemy.Battler_turn <= c.enemy_hp or enemy.cp != 100 or enemy.turn_start != 0)
          elsif a == 5 # 回合结束时 回合数小于
           return false if (enemy.Battler_turn >= c.enemy_hp or enemy.cp != 100 or enemy.turn_start != 0)
         end
       end
      end
    end
    if c.actor_valid    # 角色
      actor = $game_actors[c.actor_id]
      return false if actor == nil
      if c.turn_ending == false  #
        return false if actor.hp * 100.0 / actor.maxhp > c.actor_hp
      elsif c.turn_ending and not c.turn_valid  
        return false if actor.Battler_turn != c.actor_hp  or actor.cp != 100
      elsif c.turn_ending and  c.turn_valid
        a = c.turn_a
        b = c.turn_b
       if b > 0
        return false if (a== 0  and ( c.actor_hp < 1 or actor.Battler_turn < c.actor_hp or actor.Battler_turn % b != c.actor_hp % b or actor.cp != 100 or actor.turn_start != 1))
        return false if (a== 1  and ( c.actor_hp < 1 or actor.Battler_turn < c.actor_hp or actor.Battler_turn % b != c.actor_hp % b or actor.cp != 100 or actor.turn_start != 0))
       else
        if a == 0 # 等于
          return false if (actor.Battler_turn != c.actor_hp or actor.cp != 100 or actor.turn_start != 1)
         
        elsif a == 1 #回合开始时 回合数大于
          return false if (actor.Battler_turn <= c.actor_hp or actor.cp != 100 or actor.turn_start != 1)
        elsif a == 2 #回合开始时 回合数小于
          return false if (actor.Battler_turn >= c.actor_hp or actor.cp != 100 or actor.turn_start != 1)
        elsif a == 3 #回合结束时 回合数等于
          return false if (actor.Battler_turn != c.actor_hp or actor.cp != 100   or actor.turn_start != 0)
        elsif a == 4 #回合结束时 回合数大于
          return false if (actor.Battler_turn <= c.actor_hp or actor.cp != 100   or actor.turn_start != 0)
        elsif a == 5 #回合结束时 回合数小于
           return false if (actor.Battler_turn >= c.actor_hp or actor.cp != 100   or actor.turn_start != 0)
        end  
       end
      end  
        
    end
    if c.switch_valid   # 开关
      return false if $game_switches[c.switch_id] == false
    end
    return true         # 符合条件
  end
  #--------------------------------------------------------------------------
  # ● 增加回合
  #--------------------------------------------------------------------------
  def increase_turn
    for page in troop.pages
      if page.span == 1
        @event_flags= false
      end
    end
    #@turn_count += 1
  end

end#class
#================================================
#★cp条处理类
#================================================

class Scene_CP
    attr_accessor :stop
    attr_accessor :in_battler
    attr_accessor :cp_battler
    BATTLE_SPEED = 0.8
    def initialize
      @stop = false
      @all_agi = 0
      @v =  Viewport.new(0, 0, 544, 90)
      @count = 0
      @cpline = Sprite.new(@v)
      @cpline.bitmap = Bitmap.new(544,416)
      bitmap = Bitmap.new("Graphics/system/cp条")
      @cpline.bitmap.blt(105,8,bitmap,bitmap.rect)
      @cp_battler = {}
      @walk_count = 0
      for battler in $game_party.members + $game_troop.members
        @all_agi += battler.agi
        @cp_battler[battler] = Sprite_cpbattler.new
        if battler.is_a?(Game_Actor)
          name = battler.id.to_s + "_cp"
          if FileTest.exist?("Graphics/system/#{name}.jpg") or FileTest.exist?("Graphics/system/#{name}.png") or FileTest.exist?("Graphics/system/#{name}.bmp")
              bitmap = Bitmap.new("Graphics/system/#{name}")
              rect = bitmap.rect
              @cp_battler[battler].bitmap = bitmap
          else
              
               
               bitmap = Bitmap.new("Graphics/Characters/#{battler.character_name}")
                sign = battler.character_name[/^[\!\$]./]
                if sign != nil and sign.include?('$')
                  cw = bitmap.width / 3
                  ch = bitmap.height / 4
                  
                else
                  cw = bitmap.width / 12
                  ch = bitmap.height / 8
                  
                end
                 n = battler.character_index
                 rect = Rect.new((n%4*3+1)*cw, (n/4*4+2)*ch, cw, ch)
               
                 @cp_battler[battler].bitmap = Bitmap.new(cw,ch)
          end
         
         
          @cp_battler[battler].bitmap.blt(0, 0,bitmap,rect)
        else
          name = battler.original_name + "_敌人cp"
          if FileTest.exist?("Graphics/system/#{name}.jpg") or FileTest.exist?("Graphics/system/#{name}.png") or FileTest.exist?("Graphics/system/#{name}.bmp")
             @cp_battler[battler].bitmap = Bitmap.new("Graphics/system/#{name}")
          else
             @cp_battler[battler].bitmap = Bitmap.new("Graphics/system/敌人cp")
          end
             @cp_battler[battler].bitmap.blt(80,60, @cp_battler[battler].bitmap,  @cp_battler[battler].bitmap.rect)
        end  
        @cp_battler[battler].z = 101
        @cp_battler[battler].visible = false
        
      end
    end   
   
    #===========================================
   
   
   
   
    #===========================================
   
   
    def update
      
      return if @stop
      
      
      for battler in $game_party.members + $game_troop.members
        if (@cp_battler[battler].disposed? or @cp_battler[battler].opacity == 0) and battler.dead?
          @cp_battler.delete(@cp_battler[battler])
          next
        end  
        if battler.dead?
         if  @cp_battler.include?(battler)
              @cp_battler[battler].collapse = true
          end   
          battler.cp = 0
          next
        end  
       next if @cp_battler[battler].disposed?   
       battler.cp = [[battler.cp + BATTLE_SPEED*10*battler.agi / @all_agi,0].max,battler.maxcp].min if battler.movable?
       battler.cp_turn = [[battler.cp_turn+BATTLE_SPEED*10*battler.agi / @all_agi, 0].max,battler.maxcp].min
       if battler.cp == battler.maxcp
         #============================
         #☆设置战斗者处于回合准备状态
         #============================
           battler.turn_start = 3
         #============================  
         if battler.is_a?(Game_Actor)
              name = battler.id.to_s + "_a_cp"
              if FileTest.exist?("Graphics/system/#{name}.jpg") or FileTest.exist?("Graphics/system/#{name}.png") or FileTest.exist?("Graphics/system/#{name}.bmp")
               bitmap = Bitmap.new("Graphics/system/#{name}")
               rect = bitmap.rect
               @cp_battler[battler].bitmap = bitmap
              else
               
                bitmap = Bitmap.new("Graphics/Characters/#{battler.character_name}")
                sign = battler.character_name[/^[\!\$]./]
                if sign != nil and sign.include?('$')
                  cw = bitmap.width / 3
                  ch = bitmap.height / 4
                else
                  cw = bitmap.width / 12
                  ch = bitmap.height / 8
                end
                 n = battler.character_index
                 
                 rect = Rect.new((n%4*3+1)*cw, (n/4*4)*ch, cw, ch)
               
                 @cp_battler[battler].bitmap = Bitmap.new(cw,ch)
                 
              end
              
              @cp_battler[battler].bitmap.blt(0,0,bitmap,rect)
            
          else
            name = battler.original_name + "_a_cp"
            if FileTest.exist?("Graphics/system/#{name}.jpg") or FileTest.exist?("Graphics/system/#{name}.png") or FileTest.exist?("Graphics/system/#{name}.bmp")
            @cp_battler[battler].bitmap = Bitmap.new("Graphics/system/#{name}")
            else
            @cp_battler[battler].bitmap = Bitmap.new("Graphics/system/a_敌人cp")
            end
            @cp_battler[battler].bitmap.blt(80,60,  @cp_battler[battler].bitmap,  @cp_battler[battler].bitmap.rect)
          end  
            @cp_battler[battler].z = 101
            battler.cp_total = true
     
      elsif battler.cp_total == true
          if battler.is_a?(Game_Actor)
             name = battler.id.to_s + "_cp"
             if FileTest.exist?("Graphics/system/#{name}.jpg") or FileTest.exist?("Graphics/system/#{name}.png") or FileTest.exist?("Graphics/system/#{name}.bmp")
              bitmap = Bitmap.new("Graphics/system/#{name}")
              rect = bitmap.rect
              @cp_battler[battler].bitmap = bitmap
             else
              
                bitmap =  Bitmap.new("Graphics/Characters/#{battler.character_name}")
                sign = battler.character_name[/^[\!\$]./]
                if sign != nil and sign.include?('$')
                  cw = bitmap.width / 3
                  ch = bitmap.height / 4
                else
                  cw = bitmap.width / 12
                  ch = bitmap.height / 8
                end
                 n = battler.character_index
                 rect = Rect.new((n%4*3+1)*cw, (n/4*4+2)*ch, cw, ch)
                 
                 @cp_battler[battler].bitmap = Bitmap.new(cw,ch)
                 
                 
              end
            
              @cp_battler[battler].bitmap.blt(0,0,bitmap,rect)
            
            
          elsif  
             name = battler.original_name + "_敌人cp"
             if FileTest.exist?("Graphics/system/#{name}.jpg") or FileTest.exist?("Graphics/system/#{name}.png") or FileTest.exist?("Graphics/system/#{name}.bmp")
                 @cp_battler[battler].bitmap = Bitmap.new("Graphics/system/#{name}")
               
             else
                 @cp_battler[battler].bitmap = Bitmap.new("Graphics/system/敌人cp")
               
             end
               
               @cp_battler[battler].bitmap.blt(80,60, @cp_battler[battler].bitmap, @cp_battler[battler].bitmap.rect)
            end
            battler.cp_total = false
            @cp_battler[battler].z = 105
            
      end
      
      @cp_battler[battler].visible = true if @cp_battler[battler].visible == false
      @cp_battler[battler].opacity = 255
      @cp_battler[battler].y = 30
      @cp_battler[battler].x = 95+300*battler.cp/battler.maxcp
      if battler.cp_turn == battler.maxcp
        battler.remove_states_auto unless battler.movable?
        battler.slip_damage_effect
        battler.do_auto_recovery if battler.is_a?(Game_Actor)
        battler.damage_pop = true if battler.slip_damage != 0 or battler.auto_damage != 0
        battler.cp_turn = 0
      end  
      if battler.cp == battler.maxcp
         if battler.is_a?(Game_Actor)
           $game_party.actor_battler.push(battler)
         else
           battler.make_action
           $game_troop.enemy_battler.push(battler)
           battler.make_action
          end   
      else
        next
      end  
      
      
      
   end     
end

  def dispose
    for j in 0..25
    @cpline.opacity -= 10
    for i in @cp_battler.values
      unless i.disposed?
      i.opacity -= 10
      end
    end  
     Graphics.update
    end  
    @v.dispose
    @cpline.dispose
    for i in @cp_battler.values
      i.dispose unless i.disposed?
    end
  end  
end
  
  
  
  
  
  
  
  
  class Sprite_cpbattler < Sprite
    attr_accessor :collapse
   
    def initialize (viewport = nil)
      super (viewport)
     
      @effect_duration = 0        
      @collapse = false
    end
    def update
       super
  
     if self.collapse == true and self.opacity != 0
      @effect_type = 5
      @effect_duration = 48
      self.color.set(255, 128, 128, 128)
      for i in 0..48
      self.opacity = 256 - (48 - @effect_duration) * 6
      if self.opacity == 0
   
      break
      end  
      Graphics.update
      @effect_duration -= 1
      end
     
      self.collapse = false
      self.color.set(255,255,255,5)
     end
     
    end
   
  def dispose
     if self.bitmap != nil
      self.bitmap.dispose
     end
   
    super
  end
      
end  

#==========================================================================
#
#==========================================================================
class Scene_Battle < Scene_Base
  
  #--------------------------------------------------------------------------
  # ● 開始処理
  #--------------------------------------------------------------------------
  def start
    super
    #======================
    @select_input = true
    #======================
    $game_temp.in_battle = true
    #=============================================
    unless  $BTEST
      @battleback = nil
      for area in  $data_areas.values
        
        if $game_player.in_area?(area)
           
            name = area.name
            unless B_B_CONFIG
             @battleback = Cache.battleback("#{name}")if FileTest.exist?("Graphics/Battlebacks/#{name}.jpg") or FileTest.exist?("Graphics/Battlebacks/#{name}.jpg") or FileTest.exist?("Graphics/Battlebacks/#{name}.bmp")
               break
            else
              if BATTLE_BACK[name] != nil
                @battleback = Cache.battleback("#{BATTLE_BACK[name]}")if FileTest.exist?("Graphics/Battlebacks/#{BATTLE_BACK[name]}.jpg") or FileTest.exist?("Graphics/Battlebacks/#{BATTLE_BACK[name]}.jpg") or FileTest.exist?("Graphics/Battlebacks/#{BATTLE_BACK[name]}.bmp")
              end
              break  
               
               
           end
         end
      end     
        if @battleback == nil
            name = $game_map.name
            unless B_B_CONFIG
              
              @battleback = Cache.battleback("#{name}")if FileTest.exist?("Graphics/Battlebacks/#{name}.jpg") or FileTest.exist?("Graphics/Battlebacks/#{name}.jpg") or FileTest.exist?("Graphics/Battlebacks/#{name}.bmp")
            else
              if BATTLE_BACK[name] != nil
                 @battleback = Cache.battleback("#{BATTLE_BACK[name]}")
              else
                 @battleback = nil
              end
            end   
        end      
      $game_temp.background_bitmap  = @battleback if @battleback != nil
    end
   #==================================================
    @spriteset = Spriteset_Battle.new
    @message_window = Window_BattleMessage.new
    @message_window.visible = false
    @action_battlers = []
    @cp_battle = Scene_CP.new
    @cp_battle.stop = false
    create_info_viewport
   
   
    @select_icon = Sprite.new
    @select_icon.z = 148
    @select_icon.bitmap = Bitmap.new("Graphics/system/光标")
    @select_icon.opacity = 240
    @select_icon.visible = false
    @c_c = 0
   
   
  end
  
  #==============================================================
  #★ 定义光标刷新
  #==============================================================
   
  def select_icon_update(s_sw = false)
    if s_sw == false
      @select_icon.visible = false
    else
      @select_icon.visible = true
      @select_icon.x = $game_troop.members[@target_enemy_window.enemy.index].screen_x
      @select_icon.y = $game_troop.members[@target_enemy_window.enemy.index].screen_y - 30
      
      if @c_c%2 == 0
      @select_icon.opacity += 30
      else
      @select_icon.opacity -= 30  
      end
    end  
   
  end   
  
  
  #=================================================
  #★主刷新部分
  #=================================================
  
  
  def update
    super
   
    @c_c += 1
  
    update_basic(true)
    update_info_viewport               
      return if judge_win_loss            
      update_scene_change
      if @target_enemy_window != nil
        update_target_enemy_selection     
      elsif @target_actor_window != nil
        update_target_actor_selection     
      elsif @skill_window != nil
        update_skill_selection            
      elsif @item_window != nil
        update_item_selection            
      
      elsif @actor_command_window.active
        update_actor_command_selection   
      #=================================
      elsif @cp_battle.stop ==  false
        active_battler_update
      #=================================  
         
      end
      
    #end
  
      
  end
  #--------------------------------------------------------------------------
  # ● 战斗事件处理
  #--------------------------------------------------------------------------
  def process_battle_event
    #============================
    if $game_message.texts != nil
     @message_window.visible = true
    end
    #=============================
    loop do
      return if judge_win_loss
      return if $game_temp.next_scene != nil
      $game_troop.interpreter.update
      $game_troop.setup_battle_event
     # wait_for_message
      process_action if $game_troop.forcing_battler != nil
      #======================================
      unless $game_troop.interpreter.running?
         if $game_message.texts != nil
          @message_window.clear
          @message_window.visible = false
        end
         return
      end  
      #=======================================
      update_basic
    end
   
  end
  
  
  #================================================
  #★战斗初始化
  #===============================================
  
  def start_party_command_selection
    if $game_temp.in_battle
      @status_window.refresh
      @status_window.index = @actor_index = -1
      @active_battler = nil
     
     @actor_command_window.active = false
      $game_party.clear_actions
   
    for i in 0..$game_party.members.size-1
      if $game_party.members.act_status != -1
        $game_party.members.act_status = -1
      end  
    end
   
      if $game_troop.surprise or not $game_party.inputable?
        start_main
      end
    end
  end
  
  #=============================================
  #★角色回合的处理函数
  #=============================================
  
  
  def next_actor
   
    for i in 0..$game_party.members.size-1
      if $game_party.members.act_status != -1
        $game_party.members.act_status = -1
      end  
    end
  
    @info_viewport.visible = true
    @status_window.refresh
    @now_face = -1
    @actor_command_window.index = 0
    @actor_command_window.update
    @status_window.update
  
    loop do
   
      if @actor_index == @actor_battler.size - 1
      
        start_main
        return
        
      end   
      @actor_index += 1
      index = 0
      for battler in $game_party.members
        if battler == @actor_battler[@actor_index]
          break
        else
          index += 1
        end
      end  
      @status_window.index = index
     
       if @active_battler != nil and @active_battler != @actor_battler[@actor_index] and @active_battler.is_a?(Game_Actor)
        @active_battler.act_status = -1
      end
      
      @active_battler = @actor_battler[@actor_index]
     
     
      @active_battler.act_status = 1
      #=================================
      #★角色回合事件处理
      #================================
      @active_battler.Battler_turn += 1
      @active_battler.turn_start = 1
      $game_troop.increase_turn
      process_battle_event
      if @active_battler.auto_battle
        @active_battler.make_action
        next
      end
      break if @active_battler.inputable?
    end
    start_actor_command_selection
  end
  
  #===================================================
  #★激活角色指令窗口
  #===================================================
  
  def start_actor_command_selection
    @actor_command_window.setup(@active_battler)
    @actor_command_window.active = true
    @actor_command_window.index = 0
  end
  
  #==============================================
  #★指令窗口刷新
  #==============================================
   def update_actor_command_selection
   
    if Input.trigger?(Input::C)
      case @actor_command_window.index
      when 0  # 攻击
        Sound.play_decision
        @active_battler.action.set_attack
        start_target_enemy_selection
      when 1  # 特技
        Sound.play_decision
        start_skill_selection
      when 2  # 防御
        Sound.play_decision
        @active_battler.action.set_guard
        next_actor
        #@active_battler.cp = 0
      when 3  # 物品
        Sound.play_decision
        start_item_selection
      
      when 4 #逃跑
        if $game_troop.can_escape == false
          Sound.play_buzzer
          return
        end
        Sound.play_decision
        process_escape
    end
    end
  end
  
  #====================================
  #★选择敌人
  #====================================
  def start_target_enemy_selection
     if @skill_window != nil
      @skill_window.visible = false
    end
    if @item_window != nil
      @item_window.visible = false
    end  
    @target_enemy_window = Window_TargetEnemy.new
    @target_enemy_window.opacity = 0
    @target_enemy_window.contents_opacity = 0
    #@target_enemy_window.y = @info_viewport.rect.y
    #@info_viewport.rect.x += @target_enemy_window.width
    #@info_viewport.ox += @target_enemy_window.width
    @actor_command_window.active = false
  
    select_icon_update(true)
  end
  #===========================================================
  #★结束敌人选择
  #===========================================================
   def end_target_enemy_selection
    #@info_viewport.rect.x -= @target_enemy_window.width
    #@info_viewport.ox -= @target_enemy_window.width
    @target_enemy_window.dispose
    @target_enemy_window = nil
   
    select_icon_update
   
    if @actor_command_window.index == 0
      @actor_command_window.active = true
    end
  end  
  #=======================================================
  #★敌人选择刷新
  #=======================================================
  def update_target_enemy_selection
   @target_enemy_window.update
   
    select_icon_update(true)

    if Input.trigger?(Input::B)
      Sound.play_cancel
      if @skill_window != nil
        @skill_window.visible = true
      end
      if @item_window != nil
        @item_window.visible = true
      end  
      end_target_enemy_selection
    elsif Input.trigger?(Input::C)
      Sound.play_decision
      @active_battler.action.target_index = @target_enemy_window.enemy.index
      end_target_enemy_selection
      end_skill_selection
      end_item_selection
      next_actor
     # @active_battler.cp = 0
    end
  end
  
  #======================================================
  #★己方选择
  #======================================================
  def start_target_actor_selection
    @target_actor_window = Window_BattleStatus.new
    @target_actor_window.index = 0
    @target_actor_window.active = true
    @target_actor_window.y = @info_viewport.rect.y
    @target_actor_window.draw_actorface($game_party.members[@target_actor_window.index])
    @info_viewport.rect.x += @target_actor_window.width
    @info_viewport.ox += @target_actor_window.width
    @actor_command_window.active = false
    #=====================
    #☆减少刷新次数
    #=====================
    @last_index = -1
  end
  #==================================================
  #★己方选择结束处理
  #==================================================
  def end_target_actor_selection
    @info_viewport.rect.x -= @target_actor_window.width
    @info_viewport.ox -= @target_actor_window.width
    @target_actor_window.dispose
    @target_actor_window = nil
    #=====================
    #☆减少刷新次数
    #=====================
    @last_index = -1
  end
  #===================================================
  #★己方选择刷新
  #===================================================
  def update_target_actor_selection
    if @last_index != @target_actor_window.index
     @target_actor_window.refresh
     @target_actor_window.draw_actorface($game_party.members[@target_actor_window.index])
     @last_index = @target_actor_window.index
    end
    @target_actor_window.update
    if Input.trigger?(Input::B)
      Sound.play_cancel
      end_target_actor_selection
    elsif Input.trigger?(Input::C)
      Sound.play_decision
      @active_battler.action.target_index = @target_actor_window.index
     
      end_target_actor_selection
      end_skill_selection
      end_item_selection
      next_actor
     # @active_battler.cp = 0
    end
  end
  #============================================
  #★特技使用决定  处理
  #===========================================
  
  
  def determine_skill
    @active_battler.action.set_skill(@skill.id)
    @skill_window.active = false
    if @skill.need_selection?
      if @skill.for_opponent?
        start_target_enemy_selection
      else
        start_target_actor_selection
      end
    else
      end_skill_selection
      next_actor
     # @active_battler.cp = 0
    end
  end
  #=========================================
  #★物品使用决定  处理
  #=========================================
  
  
  def determine_item
    @active_battler.action.set_item(@item.id)
    @item_window.active = false
    if @item.need_selection?
      if @item.for_opponent?
        start_target_enemy_selection
      else
        start_target_actor_selection
      end
    else
      end_item_selection
      next_actor
     #  @active_battler.cp = 0
    end
  end
  
  #===============================================
  #★各窗口视口生成
  #===============================================
   def create_info_viewport
    @info_viewport = Viewport.new(0, 288, 544, 256)
    @info_viewport.z = 100
    @status_window = Window_BattleStatus.new
    @actor_command_window = Window_ActorCommand.new
    @status_window.viewport = @info_viewport
    @actor_command_window.viewport = @info_viewport
    @status_window.x = 0
    @actor_command_window.x = 416
    @status_window.y = 128
    @actor_command_window.y = 128
    @info_viewport.visible = false
    #========================
    #☆减少头像刷新用
    #========================
    @now_face = -1
   
  end
  #================================================
  #★视口释放
  #================================================
  def dispose_info_viewport
    @status_window.dispose
    @actor_command_window.dispose
    @info_viewport.dispose
    #========================
    #☆减少头像刷新用
    #========================
    @now_face = -1
    if @window_egi != nil
     @window_egi.dispose
    end
  end
  #======================================================
  #★视口刷新
  #======================================================
  
  
  def update_info_viewport
   
    @actor_command_window.update
   
  
    if @active_battler != nil and @active_battler.is_a?(Game_Actor) and @active_battler.id != @now_face
      @status_window.draw_actorface(@active_battler)
      @now_face = @active_battler.id
    end  
   
   
    @status_window.update
   
   
   
    if @actor_command_window.active and   @actor_command_window.y > 0
     @actor_command_window.y -= 8
     @status_window.y -= 8
   
   
    end

  end
  
  #================================================
  #★战斗开始 处理
  #================================================
  
  def process_battle_start
   
   
    if $game_troop.preemptive
     
      for battler in $game_party.members
         battler.cp = battler.maxcp
       end  
       $game_troop.preemptive = false
    elsif $game_troop.surprise
      
      for battler in $game_troop.members
        battler.cp = battler.maxcp
      end
      $game_troop.surprise = false
    end
   
    make_escape_ratio
    process_battle_event
   
    #===========================================
    @status_window.refresh
    @status_window.index = @actor_index = -1
   
    #=====================
    @cp_battle.stop = false
    #=====================
  
  end
  #=========================================
  #★战斗结束cp条释放处理
  #=========================================
  def dispose_cp_battle
      #=============================
      @cp_battle.dispose
      #=============================
      for battler in $game_party.members + $game_troop.members
        battler.cp = 0
        #=========================
        battler.Battler_turn = 0
        battler.turn_start = 0
        #=========================
      end  
  
  end
  
  #==========================================
  #★逃走处理
  #==========================================
  def process_escape
    @message_window.visible = false
    @info_viewport.visible = false
   
    if $game_troop.preemptive
      success = true
    else
      success = (rand(100) < @escape_ratio)
    end
    Sound.play_escape
    if success
      #=============================
      @cp_battle.dispose
      #=============================
      for battler in $game_party.members
        battler.cp = 0
        #=========================
        battler.Battler_turn = 0
        battler.turn_start = 0
        #=========================
      end  
     
      battle_end(1)
    else
      @escape_ratio += 10
     
      #@active_battler.cp = 0
      @active_battler.action.clear
      next_actor   
    end
  end
  #========================================
  #★胜利处理
  #========================================
  def process_victory
    @message_window.visible = false
    @info_viewport.visible = false
  
    RPG::BGM.stop
    $game_system.battle_end_me.play
    for battler in $game_troop.members
      if battler.dead?
         if  @cp_battle.cp_battler.include?(battler)
              @cp_battle.cp_battler[battler].collapse = true
              
              next
          end  
       end     
    end
     @cp_battle.cp_battler.each{key,value
      if value.disposed?
        @cp_battler.delete(key)
        next
      end
      value.update}
    #=============================
    @cp_battle.dispose
    #=============================
   for battler in $game_party.members
      #=========================
      battler.Battler_turn = 0
      battler.turn_start = 0
      #=========================
     battler.cp = 0
   end
    unless $BTEST
      $game_temp.map_bgm.play
      $game_temp.map_bgs.play
    end
    display_exp_and_gold
    display_drop_items
    display_level_up
    battle_end(0)
  end
   
  #=================================
  #★失败处理
  #=================================
  def process_defeat
    @message_window.visible = false
    @cp_battle.dispose
    for battler in $game_party.members + $game_troop.members
      #=========================
      battler.Battler_turn = 0
      battler.turn_start = 0
      #=========================
      battler.cp = 0
    end
    @info_viewport.visible = false
   
    battle_end(2)
   
  end
  #=====================================
  # ★ 执行画面转换
  #=====================================
  def update_scene_change
    case $game_temp.next_scene
    when "map"
      dispose_cp_battle
      call_map
    when "gameover"
      dispose_cp_battle
      call_gameover
    when "title"
      dispose_cp_battle
      call_title
    else
      $game_temp.next_scene = nil
    end
  end
  #=============================================================================
  #★CP战斗的主要刷新★
  #=============================================================================
  
   def active_battler_update
   
    #===================================
    @actor_battler = []
    @enemy_battler = []
    $game_party.actor_battler = []
    $game_troop.enemy_battler = []
    #===================================
    @cp_battle.update
    @actor_battler = $game_party.actor_battler
    @enemy_battler = $game_troop.enemy_battler
    #for battler in $game_party.members + $game_troop.members
      
    #end
    if @actor_battler.size != 0
      @cp_battle.stop = true
#~       @active_battler.Battler_turn += 1
#~       @active_battler.turn_start = 1
#~       $game_troop.increase_turn
#~       process_battle_event
      next_actor
      Audio.se_play("Audio/SE/Windows Ding",100,100)
    elsif @enemy_battler.size != 0  
   
    #================
    @cp_battle.stop = true
    start_main
    #================
   
   
     
   end
  
end

#=============================================================
#=============================================================
  #====================================================
  #★战斗主处理
  #====================================================
   def start_main
   
    for i in 0..$game_party.members.size-1
      if $game_party.members.act_status != 0
        $game_party.members.act_status = 0
      end  
    end
   
   
   
    if @info_viewport.visible
    @info_viewport.visible = false
    @status_window.y = 128
    @actor_command_window.y = 128
    end
    @actor_command_window.index = 0
    @actor_command_window.update
    @actor_command_window.active = false
   
    @status_window.index = @actor_index = -1
    @active_battler = nil
  
    make_action_orders
    wait(20)
   #=============================
  
   while @action_battlers.size != 0 and judge_win_loss == false
        process_action
        #process_battle_event
   end
   @cp_battle.stop = false
   #=============================
   
end
#=====================================
#★行动顺序生成
#=====================================


def make_action_orders
    @action_battlers = []
   
    unless $game_troop.surprise
      @action_battlers += @actor_battler if @actor_battler.size != 0
    end
   
   
    unless $game_troop.preemptive
      @action_battlers += @enemy_battler if @enemy_battler.size != 0
    end
    for battler in @action_battlers
      
      battler.action.make_speed
    end
    @action_battlers.sort! do a,b
      b.action.speed - a.action.speed
    end
  end
#====================================
#★战斗行动处理
#====================================
def process_action
   
    return if judge_win_loss
    return if $game_temp.next_scene != nil
    set_next_active_battler
   
    return if @active_battler == nil
    return if @active_battler.dead?
   
    @active_battler.white_flash = true
   
    unless @active_battler.is_a?(Game_Actor)
      @active_battler.Battler_turn += 1
      @active_battler.turn_start = 1
      $game_troop.increase_turn
      process_battle_event
    end  
   
    unless @active_battler.action.forcing
      @active_battler.action.prepare
    end
    if @active_battler.action.valid?
      execute_action
    end
   
    unless @active_battler.action.forcing
     
      remove_states_auto
      display_current_state
    end
    @active_battler.white_flash = false
    @active_battler.turn_start = 0
    process_battle_event
    @active_battler.cp = 0
  end

  #=================================
  #★攻击行动 执行
  #=================================
  def execute_action_attack
   
    targets = @active_battler.action.make_targets
    display_attack_animation(targets)
    wait(20)
    for target in targets
      target.attack_effect(@active_battler)
      display_action_effects(target)
    end
    #=====================
    #@active_battler.cp = 0
    #=====================
   end
  #===============================
  #★防御行动   执行
  #===============================
   
   
   def execute_action_guard
   
    wait(45)
    #=====================
    #@active_battler.cp = 0
    #=====================
  end
   #===============================
   #★逃走  执行
   #===============================
  
  def execute_action_escape
   
    @active_battler.escape
    Sound.play_escape
    wait(45)
    #=====================
    #@active_battler.cp = 0
    #=====================
  end
  #====================================
  #★待机  执行
  #====================================
  def execute_action_wait
   
    wait(45)
    #=====================
    #@active_battler.cp = 0
    #=====================
  end
  
  #============================
  #★特技   执行
  #============================
  def execute_action_skill
    skill = @active_battler.action.skill
   
    targets = @active_battler.action.make_targets
   
   
    user = @active_battler.action.skill_user
    if skill.animation2_id != 0
      display_animation(user,skill.animation2_id)
    end  
    display_animation(targets, skill.animation_id)
   
    wait_for_animation
   
    @active_battler.mp -= @active_battler.calc_mp_cost(skill)
    $game_temp.common_event_id = skill.common_event_id
    for target in targets
      target.skill_effect(@active_battler, skill)
      display_action_effects(target, skill)
    end
    #=====================
    #@active_battler.cp = 0
    #=====================
  end
  
  #==============================
  #★物品行动 执行
  #==============================
  
  def execute_action_item
    item = @active_battler.action.item
   
   
    user = @active_battler.action.skill_user
    if item.animation2_id != 0
      display_animation(user,item.animation2_id)
    end  
   
   
    targets = @active_battler.action.make_targets
    display_animation(targets, item.animation_id)
   
    wait_for_animation
   
    $game_party.consume_item(item)
    $game_temp.common_event_id = item.common_event_id
    for target in targets
      target.item_effect(@active_battler, item)
      display_action_effects(target, item)
    end
    #=====================
   # @active_battler.cp = 0
    #=====================
  end
  #===========================
  #★行动动画显示
  #animation_id :-1 为普通攻击
  #===========================
  def display_animation(targets, animation_id)
    if animation_id < 0
      display_attack_animation(targets)
    else
      display_normal_animation(targets, animation_id)
    end
    wait(20)
   
  end
  #====================================
  #★普通攻击的动画显示
  #====================================
  def display_attack_animation(targets)

    if @active_battler.is_a?(Game_Enemy)
        user = @active_battler.action.skill_user
      if @select_input == true
        a1 = 0
        a2 = 0
        eval(@active_battler.note)
        display_normal_animation(user,a1)if   a1 != 0
        display_normal_animation(targets,a2)if  a2 !=0
        Sound.play_enemy_attack if   a1 == 0 and a2 == 0
        wait(15, true) if  a1 == 0 and  a2 == 0
      elsif @active_battler.animation1_id != 0 or @active_battler.animation2_id != 0
            display_normal_animation(user,@active_battler.animation1_id)if @active_battler.animation1_id != 0
            display_normal_animation(targets,@active_battler.animation2_id)if @active_battler.animation2_id != 0
            Sound.play_enemy_attack if  @active_battler.animation1_id == 0 and @active_battler.animation2_id == 0
            wait(15, true) if  @active_battler.animation1_id == 0 and @active_battler.animation2_id == 0
       end     
   
   
   else
      aid1 = @active_battler.atk_animation_id
      aid2 = @active_battler.atk_animation_id2
     
      user = @active_battler.action.skill_user
      if @active_battler.act_animation_id != 0
        display_normal_animation(user,@active_battler.act_animation_id)
      end  
     
   
      
      display_normal_animation(targets, aid1, false)
      display_normal_animation(targets, aid2, true)
    end
    wait_for_animation
  end
  
  #========================================
  #★显示行动结果
  #========================================
   def display_action_effects(target, obj = nil)
    unless target.skipped
     
      wait(5)
      #=======================
      target.damage_pop = true
      #=======================
      display_critical(target, obj)
      display_damage(target, obj)
      display_state_changes(target, obj)
   
    end
  end
  
  #======================================
  #★显示HP伤害
  #======================================
  
  
  def display_hp_damage(target, obj = nil)
     
    if target.hp_damage == 0               
      return if obj != nil and obj.damage_to_mp
      return if obj != nil and obj.base_damage == 0
      
    elsif target.absorbed                   # 吸収
     
       #=====================================
      @active_battler.damage_pop = true
      @active_battler.damage = target.hp_damage
     
      target.cp -= target.hp_damage/100
      target.cp = [target.cp,0].max
      @cp_battle.cp_battler[target].x = [95+300*target.cp/target.maxcp,95].max
     if target.dead?
         @cp_battle.cp_battler[target].collapse = true
         target.cp = 0
         @cp_battle.cp_battler[target].update
      end
      
      
   
      #=====================================
    elsif target.hp_damage > 0            
     
      if target.actor?
      
        Sound.play_actor_damage
        $game_troop.screen.start_shake(5, 5, 10)
      else
      
        Sound.play_enemy_damage
        target.blink = true
      end
      #=====================================
      
      target.cp -= target.hp_damage/100
      target.cp = [target.cp,0].max
      @cp_battle.cp_battler[target].x = [95 + 300*target.cp/target.maxcp,95].max
      
      if target.dead?
         @cp_battle.cp_battler[target].collapse = true
         target.cp = 0
         @cp_battle.cp_battler[target].update
      end
      
     
      #wait(10)
      #=====================================
    else                                    
     
      Sound.play_recovery
    end
   
  end
  #--------------------------------------------------------------------------
  # ● MP 伤害表示
  #--------------------------------------------------------------------------
  def display_mp_damage(target, obj = nil)
    return if target.dead?
    return if target.mp_damage == 0
   
    if target.absorbed                      # 吸收
      
      #=====================================
      @active_battler.damage_pop = true
      @active_battler.damage = - target.mp_damage
     
      
      target.cp -= target.mp_damage/100
      target.cp = [target.cp,0].max
      @cp_battle.cp_battler[target].x = [95+300*target.cp/target.maxcp,95].max
      
      #=====================================
    elsif target.mp_damage > 0              
   
     #=====================================
      target.cp -= target.mp_damage/100
      target.cp = [target.cp,0].max
      @cp_battle.cp_battler[target].x = [95+300*target.cp/target.maxcp,95].max
      
      #=====================================
    else                                    
   
      Sound.play_recovery
    end
   
  end
  #=======================================
  #★重定义对话窗口刷新
  #=======================================
  def wait_for_message
   #wait(45)
  end
  
  #================================================
  #★经验金钱获得物品提示窗口(原方法重定义)
  #================================================
  def display_exp_and_gold
    exp=$game_troop.exp_total
    gold=$game_troop.gold_total
    $game_party.gain_gold(gold)
    drop_items = $game_troop.make_drop_items
    @window_egi = Window_egi.new(exp,gold,drop_items)
    @window_egi.openness=0
    wait(15)
    loop do
      if @window_egi.openness <= 255
       @window_egi.openness+=48
      end
      if Input.trigger?(Input::C) or Input.trigger?(Input::B)
        break
      end
      Graphics.update
      Input.update
      
      
    end
   
    loop do
      @window_egi.openness -= 48 if @window_egi.openness >= 0
      Graphics.update
      if @window_egi.openness <= 0
        break
      end  
    end #loop
   
  end

  alias oldstart_skill_selection  start_skill_selection
  def start_skill_selection
    oldstart_skill_selection
    @skill_window.z = 3000
    @skill_window.help_window.z = 3000
   
  end  
  alias oldstart_item_selection  start_item_selection
  def start_item_selection
    oldstart_item_selection
    @item_window.z=3000
    @item_window.help_window.z = 3000
  end  
  

  
end #class


#=====================================================
#★战斗状态窗口类
#=====================================================


class Window_BattleStatus < Window_Selectable
  
  
  def draw_item(index)
    rect = item_rect(index)
    rect.x += 4
    rect.width -= 8
    self.contents.clear_rect(rect)
    self.contents.font.color = normal_color
    actor = $game_party.members[index]
    draw_actor_name(actor, 96, rect.y)
    draw_actor_state(actor, 114+48, rect.y, 48)
    draw_actor_hp(actor, 174, rect.y, 120)
    draw_actor_mp(actor, 310, rect.y, 70)
  end
  #=======================================================================
  #★定义角色头像的描绘
  #=======================================================================
   def draw_actorface(actor)
      
    draw_face(actor.face_name, actor.face_index, 5, 5, size = 80)
  end
  #=========================================================================
  
  def update_cursor
     super
     self.cursor_rect.width = self.width - 120
     self.cursor_rect.x = 90
     
  end  
  #========================================================================
end #class

#=================================================
#★战斗图处理的类
#=================================================

class Sprite_Battler < Sprite_Base
  
#=================================
#★刷新
#=================================
def update
    super
    if @battler == nil
      self.bitmap = nil
    else
      @use_sprite = @battler.use_sprite?
      if @use_sprite
        self.x = @battler.screen_x
        self.y = @battler.screen_y
        self.z = @battler.screen_z
        update_battler_bitmap
        if @battler.act_status == 1
         if self.opacity <280
           self.opacity += 20
        end
      elsif @battler.act_status == -1
         if self.opacity > 125
           self.opacity -= 20
         end  
      elsif  (@battler.dead? or   @battler.hidden) and @battler.collapse == false
      
      else
        self.opacity = 255
      end  
      end
      
      setup_new_effect
      update_effect
     
    end
  end  
#===============================
#
#===============================
  def update_battler_bitmap
    if @battler.battler_name != @battler_name or
       @battler.battler_hue != @battler_hue
      @battler_name = @battler.battler_name
      @battler_hue = @battler.battler_hue
      self.bitmap = Cache.battler(@battler_name, @battler_hue)
      @width = bitmap.width
      @height = bitmap.height
      self.ox = @width / 2
      self.oy = @height
      if (@battler.dead? or @battler.hidden) and @battler.collapse == false
        
      end
    end
    if @battler.is_a?(Game_Actor)
      count = 40
    else
      count = 44
    end  
   
   
    if Graphics.frame_count%count <= 19
      self.bitmap = Cache.battler(@battler_name,@battler_hue)
      @width = bitmap.width
      @height = bitmap.height
      self.ox = @width / 2
      self.oy = @height
    else
      b_name = @battler_name + "待"
       if FileTest.exist?("Graphics/Battlers/#{b_name}.png") or FileTest.exist?("Graphics/Battlers/#{b_name}.jpg")  or  FileTest.exist?("Graphics/Battlers/#{b_name}.bmp")
         self.bitmap = Cache.battler(b_name,@battler_hue)
         @width = bitmap.width
         @height = bitmap.height
         self.ox = @width/2
         self.oy = @height
       end
    end      
      
   
  end
  
#==================================
#
#==================================
def setup_new_effect
    if @battler.white_flash
      @effect_type = WHITEN
      @effect_duration = 16
      @battler.white_flash = false
    end
   
    if @battler.blink
      @effect_type = BLINK
      @effect_duration = 20
      @battler.blink = false
    end
    if not @battler_visible and @battler.exist?
      @effect_type = APPEAR
      @effect_duration = 16
      @battler_visible = true
    end
    if @battler.damage_pop and not (@battler.collapse or @battler.hidden)
      if @battler.damage != nil
        s_1 = @battler.damage > 0 ? 0 : 1
        @battler.damage = @battler.damage > 0 ? [email protected] : @battler.damage
      end  
      
      damage(@battler.damage,@battler.critical,s_1) if @battler.damage != 0 and @battler.damage != nil
      damage(@battler.hp_damage,@battler.critical,0) if @battler.hp_damage != 0
      damage(@battler.mp_damage,@battler.critical,1) if @battler.mp_damage != 0
      damage("失误",@battler.critical) if @battler.missed
      damage("MISS",@battler.critical) if @battler.evaded
      damage(@battler.slip_damage - @battler.auto_damage,@battler.critical) if @battler.slip_damage != 0 or @battler.auto_damage != 0
      @battler.slip_damage = 0
      @battler.auto_damage = 0
      @battler.damage = nil
      @battler.damage_pop = false
    end
    if @battler_visible and @battler.hidden
      @effect_type = DISAPPEAR
      @effect_duration = 32
      @battler_visible = false
    end
    if @battler.collapse and self.opacity != 0
      @effect_type = COLLAPSE
      @effect_duration = 48
      @battler.collapse = false
      @battler_visible = false
    end
    if @battler.animation_id != 0 and @battler.collapse == false
      self.opacity = 255
      animation = $data_animations[@battler.animation_id]
      mirror = @battler.animation_mirror
      start_animation(animation, mirror)
      @battler.animation_id = 0
    end
   
      
  end
#=========================================
#
#=========================================
  
  

  
  
end #class  








#=================================================
#★处理战斗行动的类
#=================================================
class Game_BattleAction

  def skill_user
    targets = []
    targets.push(battler)
     
     return targets.compact
   end
  

  
   
end#class  
#=======================================================
#★处理敌人的类
#
#=======================================================

class Game_Enemy < Game_Battler
def note
    return $data_enemies[@enemy_id].note
end  

  
end#class
#======================================================
#★角色处理类
#======================================================
class Game_Actor < Game_Battler

  def setup(actor_id)
    actor = $data_actors[actor_id]
    @actor_id = actor_id
    @name = actor.name
    #--------------------------------------------
    #★添加战斗图名称,以便战斗中获取战斗图
    #--------------------------------------------
    @battler_name = actor_id.to_s + "_z"
    @battler_hue = 0
    @flash = false
    @character_name = actor.character_name
    @character_index = actor.character_index
    @face_name = actor.face_name
    @face_index = actor.face_index
    @class_id = actor.class_id
    @weapon_id = actor.weapon_id
    @armor1_id = actor.armor1_id
    @armor2_id = actor.armor2_id
    @armor3_id = actor.armor3_id
    @armor4_id = actor.armor4_id
    @level = actor.initial_level
    @exp_list = Array.new(101)
    make_exp_list
    @exp = @exp_list[@level]
    @skills = []
    for i in self.class.learnings
      learn_skill(i.skill_id) if i.level <= @level
    end
    clear_extra_values
    recover_all
  end
  #--------------------------------------------------------------------------
  # ● 执行自动回复 (回合结束时调用)
  #--------------------------------------------------------------------------
  def do_auto_recovery
    if auto_hp_recover and not dead?
      self.hp += maxhp / 20
      @auto_damage = maxhp / 20
    end
  end
  #==========================================================================
  #★ 定义武器的行动方动画id,默认为第一武器的id
  #==========================================================================
  
  def act_animation_id
    return weapons[0] == nil ? 0 : weapons[0].animation2_id
  end  
  
  #==========================================================================
  #==========================================================================
  #==========================================================================
  #★定义角色战斗图 X 坐标
  #==========================================================================
  def screen_x
   if self.index != nil
    case index
     when 0
      return 460
     when 1
      return 440
     when 2
      return 420
     when 3
      return 400
    end  
  else
   return 0
  end
end
  #========================================================================
  #★定义角色战斗图 Y 坐标
  #========================================================================
  def screen_y
    if self.index != nil
      case index
       when 0
         return 245
       when 1
         return 215
       when 2
         return 185
       when 3
         return 155
       end
    else   
   
    return 230
   end
  end  
  
  #========================================================================
  #★定义角色战斗图 Z 坐标
  #========================================================================   
  def screen_z
     if self.index != nil
      return 4 - self.index
    else
      return 0
    end
  end
  
  

  
  def use_sprite?
    return true
  end
  
end#class




#==========================================================
#★模块定义
#==========================================================
  module RPG
  class BaseItem
    def animation2_id
      return @note != nil ? @note.to_i : 0
    end
  end  
   class Enemy
     def animation1_id
       animation1_id = @note.split(/,/)[0]
       return animation1_id != nil ? animation1_id.to_i : 0
     end
     def animation2_id
       animation2_id = @note.split(/,/)[1]
       return animation2_id != nil ? animation2_id.to_i : 0
     end
    end
   
  end
  
  
#======================================================
#★精灵类主模块_伤害部分的添加
#======================================================
class Sprite_Base < Sprite
  def initialize(viewport = nil)
    super(viewport)
    @use_sprite = true         
    @animation_duration = 0     
    #=============
    @_damage_duration = 0
    #=============
  end
alias oldupdate update
  def update
    oldupdate
    #================
    damge_update
    #================

  end

alias olddispose dispose
   def dispose
     olddispose
     
    #===============
    dispose_damage
    #===============
   end
  
#==========================================================================
#★定义伤害处理
#==========================================================================

   def damage(value, critical,type = 0)
      dispose_damage
      if value.is_a?(Numeric)
        damage_string = value.abs.to_s
      else
        damage_string = value.to_s
      end
      bitmap = Bitmap.new(160, 48)
      bitmap.font.name = "黑体"
      bitmap.font.size = 25
      bitmap.font.color.set(0, 0, 0)
      bitmap.draw_text(-1, 12-1, 160, 36, damage_string, 1)
      bitmap.draw_text(+1, 12-1, 160, 36, damage_string, 1)
      bitmap.draw_text(-1, 12+1, 160, 36, damage_string, 1)
      bitmap.draw_text(+1, 12+1, 160, 36, damage_string, 1)
      if value.is_a?(Numeric) and value < 0
        case type
         when 0
           bitmap.font.color.set(176, 255, 144)
         when 1
           bitmap.font.color.set(0,100,255)
         end  
      else
        case type
        when 0
        bitmap.font.color.set(255, 255, 255)
        when 1
          bitmap.font.color.set(200,0,185)
        end  
      end
      
      bitmap.draw_text(0, 12, 160, 36, damage_string, 1)
      if critical and type == 0
        bitmap.font.size = 18
        bitmap.font.color.set(0, 0, 0)
        bitmap.draw_text(-1, -1, 160, 20, "CRITICAL", 1)
        bitmap.draw_text(+1, -1, 160, 20, "CRITICAL", 1)
        bitmap.draw_text(-1, +1, 160, 20, "CRITICAL", 1)
        bitmap.draw_text(+1, +1, 160, 20, "CRITICAL", 1)
        bitmap.font.color.set(255, 255, 255)
        bitmap.draw_text(0, 0, 160, 20, "CRITICAL", 1)
      end
      @_damage_sprite = ::Sprite.new(self.viewport)
      @_damage_sprite.bitmap = bitmap
      @_damage_sprite.ox = 80
      @_damage_sprite.oy = 20
      @_damage_sprite.x = self.x
      @_damage_sprite.y = self.y - self.oy / 2
      @_damage_sprite.z = 3000
      @_damage_duration = 40
    end
   
    #===================================================
    #
    #===================================================
    def dispose_damage
      if @_damage_sprite != nil
        @_damage_sprite.bitmap.dispose
        @_damage_sprite.dispose
        @_damage_sprite = nil
        @_damage_duration = 0
      end
    end
    #=============================================
    #
    #=============================================
    def damge_update
       if @_damage_duration > 0
        @_damage_duration -= 1
        case @_damage_duration
        when 38..39
          @_damage_sprite.y -= 4
        when 36..37
          @_damage_sprite.y -= 2
        when 34..35
          @_damage_sprite.y += 2
        when 28..33
          @_damage_sprite.y += 4
        end
        @_damage_sprite.opacity = 256 - (12 - @_damage_duration) * 32
        if @_damage_duration == 0
          dispose_damage
        end
      end
   end
  
  

end#class
#=======================================================
#★战斗经验、金钱、物品提示窗口
#=======================================================
class Window_egi<Window_Base
#====================================
#●初始化
#====================================
def initialize(exp, gold,item)
   
   
    @exp=exp
    @gold=gold
    @item=item
    @item_name = {}
    n=0
    m=0
   
    if @item != nil
     for itn in @item
      
      if @item_name[itn.name]==nil
         @item_name[itn.name]=[0,""]
         @item_name[itn.name][1]=itn.icon_index
         m+=1
      end
      @item_name[itn.name][0] += 1
    end
    end
    if @gold>0
      m+=1
    end  
    super(200,100, 160,32*m+112 )
    self.opacity = 150
   
    refresh
  end
  #--------------------------------------------------------------------------
  # ● 刷新
  #--------------------------------------------------------------------------
def refresh
    self.contents.clear
    self.contents.font.size=19
    if @exp > 0
     self.contents.font.color = Color.new(255,255,0,255)
     self.contents.draw_text(6,8,64,32,"获得经验:")
     self.contents.font.color = Color.new(255,255,255,255)
     self.contents.draw_text(80,8,32,32,sprintf("%4s",@exp))
   
   elsif @exp == 0
     self.contents.font.color = Color.new(255,0,0,0)
     self.contents.draw_text(6,8,32,32,"没有获得经验!")
     
   end
   if @gold>0
     self.contents.font.color = Color.new(255,255,0,255)
     self.contents.draw_text(6,40,64,32,"获得金钱:")
     self.contents.font.color = Color.new(255,255,255,255)
     self.contents.draw_text(80,40,32,32,sprintf("%4s",@gold)+Vocab::gold)
   end  
   if @item_name.size != 0
   self.contents.font.size = 20
   self.contents.font.color = Color.new(255,255,0)
   self.contents.draw_text(25,72,64,32,"获得物品")
   i=0

    i=0
    self.contents.font.size = 18
    self.contents.font.color = Color.new(255,255,255,255)
    for itn in @item_name
     draw_icon(itn[1][1] ,6 ,106+i*32 , true)
     self.contents.draw_text(30,106+i*32,64,32,itn[0] + " × "+ itn[1][0].to_s)
   
     i+=1
    end
      
     
  end
  
   
   
end
   
   
end#class  

module Cache
  def self.battleback(filename)
     load_bitmap("Graphics/Battlebacks/", filename)
   end   
end   
  
#=====================================================
#添加战斗背景的相关定义
#=====================================================
class Game_Map
  attr_accessor :name   
    def setup(map_id)
    @map_id = map_id
    @map = load_data(sprintf("Data/Map%03d.rvdata", @map_id))
    @mapinfo = load_data("Data/MapInfos.rvdata")
    #============================
    @name = @mapinfo[@map_id].name
    #============================
    @display_x = 0
    @display_y = 0
    @passages = $data_system.passages
    referesh_vehicles
    setup_events
    setup_scroll
    setup_parallax
    @need_refresh = false
   end #class
  
  
   def area(old_name,new_name)
  
    for area in  $data_areas.values
      if area.name == old_name and area.map_id == @map_id
        area.name == new_name
      end
    end
  end  
end #class

class Spriteset_Battle

  def create_battleback
    name = $game_map.name
    source = $game_temp.background_bitmap
    bitmap = Bitmap.new(640, 480)
    if BATTLE_BACK[name] != nil
     
     bitmap.blt(0,0,source,source.rect)
     @battleback_sprite = Sprite.new(@viewport1)
     @battleback_sprite.bitmap = bitmap
     @battleback_sprite.ox = 272
     @battleback_sprite.oy = 208
     @battleback_sprite.x = 260
     @battleback_sprite.y = 208
    else
   
     bitmap.stretch_blt(bitmap.rect, source, source.rect)
     bitmap.radial_blur(90, 12)
     @battleback_sprite = Sprite.new(@viewport1)
     @battleback_sprite.bitmap = bitmap
     @battleback_sprite.ox = 320
     @battleback_sprite.oy = 240
     @battleback_sprite.x = 272
     @battleback_sprite.y = 176
     @battleback_sprite.wave_amp = 8
     @battleback_sprite.wave_length = 240
     @battleback_sprite.wave_speed = 120
    end
     
  end
  alias oldcreate_battlefloor create_battlefloor
  def create_battlefloor
   oldcreate_battlefloor
   @battlefloor_sprite.opacity = 0
  end
end#class

#==============================================================================
# ■ Game_Interpreter
#------------------------------------------------------------------------------
#  执行事件命令的解释器。本类在 Game_Map 类、Game_Troop 类、
# Game_Event 类的内部使用。
#==============================================================================

class Game_Interpreter
   #===========================================================================
   #☆角色显示动画方法
   #○range:动画影响范围,-1全体或相应角色id
   #●anim_id:动画id
   #===========================================================================
   def add_aa(range,anim_id)
     iterate_battler(1,range) do battler
      next unless battler.exist?
      battler.animation_id = anim_id
    end
     
   end #def
   
  
end #class


[tr]

dsu_plus_rewardpost_czw




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1