Envision, Create, Share

Welcome to HBGames, a leading amateur game development forum and Discord server. All are welcome, and amongst our ranks you will find experts in their field from all aspects of video game design and development.

RainBow_Swords+defaut battle system fix

i wanted to fuse these tow scripts, one by VI_VI and the other........i don`t know----':|
i did the first half you can use it but the problem appers when you recive damage cause the batter moves to the defaut possition
try and you wll see what i mean..so if somebody can fix it do it please

PHP:
# 核心的说明:
# damage_pop 不再附带damage()的功能,这个放到animation里面去了

module RPG
  class Sprite < ::Sprite
    @@_animations = []
    @@_reference_count = {}
    #==========================================
    # 修改说明:
    # @flash_shake用来制作挨打时候跳跃
    # @_damage    用来记录每次打击之后弹出数字
    #==========================================
    def initialize(viewport = nil)
      super(viewport)
      @flash_shake = 0
      @_whiten_duration = 0
      @_appear_duration = 0
      @_escape_duration = 0
      @_collapse_duration = 0
      @_damage_duration = 0
      @_animation_duration = 0
      @_blink = false
      @_damage = [] #~66RPG~#
      @py_y = 0
    end
    def damage(value, critical)
      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 = "Arial Black"
      bitmap.font.size = 32
      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
        bitmap.font.color.set(176, 255, 144)
      else
        bitmap.font.color.set(255, 255, 255)#(255, 55, 55)
      end
      bitmap.draw_text(0, 12, 160, 36, damage_string, 1)
      if critical
        bitmap.font.size = 20
        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
      #=======================================
      # 修改:推入新的伤害
      #=======================================
      @_damage.push([@_damage_sprite,@_damage_duration-10,0, rand(30) - 15, rand(3)])
    end
    def animation(animation, hit, battler_damage="", battler_critical=false)
      dispose_animation      
      #=======================================
      # 修改:记录伤害和critical
      #=======================================
      @battler_damage = battler_damage
      @battler_critical = battler_critical
      @_animation = animation
      return if @_animation == nil
      @_animation_hit = hit
      @_animation_duration = @_animation.frame_max
      animation_name = @_animation.animation_name
      animation_hue = @_animation.animation_hue
      bitmap = RPG::Cache.animation(animation_name, animation_hue)
      #=======================================
      # 修改:计算总闪光权限值
      #=======================================
      for timing in @_animation.timings
        @all_quanzhong += animation_process_timing(timing, @_animation_hit)        
      end      
      if @@_reference_count.include?(bitmap)
        @@_reference_count[bitmap] += 1
      else
        @@_reference_count[bitmap] = 1
      end
      @_animation_sprites = []
      if @_animation.position != 3 or not @@_animations.include?(animation)
        for i in 0..15
          sprite = ::Sprite.new(self.viewport)
          sprite.bitmap = bitmap
          sprite.visible = false
          @_animation_sprites.push(sprite)
        end
        unless @@_animations.include?(animation)
          @@_animations.push(animation)
        end
      end
      update_animation
    end
    #=======================================
    # 修改:更换清除伤害的算法,以防万一
    #       本内容在脚本中没有使用过
    #=======================================
    def dispose_damage
      for damage in @_damage.reverse
        damage[0].bitmap.dispose
        damage[0].dispose
        @_damage.delete(damage)
      end
    end
    
 
   def animation_set_sprites(sprites, cell_data, position)
     for i in 0..15
       sprite = sprites[i]
       pattern = cell_data[i, 0]
       if sprite == nil or pattern == nil or pattern == -1
         sprite.visible = false if sprite != nil
         next
       end
       sprite.visible = true
       sprite.src_rect.set(pattern % 5 * 192, pattern / 5 * 192, 192, 192)
       if position == 3
         if self.viewport != nil
           if $scene.is_a?(Scene_Battle)
             sprite.x = self.viewport.rect.width / 2
             sprite.y = 304
           else
             sprite.x = self.viewport.rect.width / 2
             sprite.y = self.viewport.rect.height - 160
           end
         else
           sprite.x = 320
           sprite.y = 240
         end
       else
         sprite.x = self.x - self.ox + self.src_rect.width / 2
         sprite.y = self.y - self.oy + self.src_rect.height / 2
         sprite.y -= self.src_rect.height / 4 if position == 0
         sprite.y += self.src_rect.height / 4 if position == 2
       end
       sprite.x += cell_data[i, 1]
       sprite.y += cell_data[i, 2]
       sprite.z = 2000
       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.angle = cell_data[i, 4]
       sprite.mirror = (cell_data[i, 5] == 1)
       sprite.opacity = cell_data[i, 6] * self.opacity / 255.0
       sprite.blend_type = cell_data[i, 7]
     end
   end
    
    
    
    
    
    def dispose_animation
      #=======================================
      # 修改:清除记录的伤害,清除权重记录
      #=======================================
      @battler_damage = nil
      @battler_critical = nil
      @all_quanzhong = 1
      if @_animation_sprites != nil
        sprite = @_animation_sprites[0]
        if sprite != nil
          @@_reference_count[sprite.bitmap] -= 1
          if @@_reference_count[sprite.bitmap] == 0
            sprite.bitmap.dispose
          end
        end
        for sprite in @_animation_sprites
          sprite.dispose
        end
        @_animation_sprites = nil
        @_animation = nil
      end
    end
    def update
      super
      if @_whiten_duration > 0
        @_whiten_duration -= 1
        self.color.alpha = 128 - (16 - @_whiten_duration) * 10
      end
      if @_appear_duration > 0
        @_appear_duration -= 1
        self.opacity = (16 - @_appear_duration) * 16
      end
      if @_escape_duration > 0
        @_escape_duration -= 1
        self.opacity = 256 - (32 - @_escape_duration) * 10
      end
      if @_collapse_duration > 0
        @_collapse_duration -= 1
        self.opacity = 256 - (48 - @_collapse_duration) * 6
      end
      #=======================================
      # 修改:更新算法,更新弹出
      #=======================================
      if @_damage_duration > 0
        @_damage_duration -= 1
        for damage in @_damage
          damage[0].x = self.x + self.viewport.rect.x -
                        self.ox + self.src_rect.width / 2 +
                        (40 - damage[1]) * damage[3] / 10
          damage[0].y -= damage[4]+damage[1]/10
          damage[0].opacity = damage[1]*20
          damage[1] -= 1
          if damage[1]==0
            damage[0].bitmap.dispose
            damage[0].dispose
            @_damage.delete(damage)
            next
          end
        end
      end
      if @_animation != nil and (Graphics.frame_count % 2 == 0)
        @_animation_duration -= 1
        update_animation
      end
      if @_loop_animation != nil and (Graphics.frame_count % 2 == 0)
        update_loop_animation
        @_loop_animation_index += 1
        @_loop_animation_index %= @_loop_animation.frame_max
      end
      if @_blink
        @_blink_count = (@_blink_count + 1) % 32
        if @_blink_count < 16
          alpha = (16 - @_blink_count) * 6
        else
          alpha = (@_blink_count - 16) * 6
        end
        self.color.set(255, 255, 255, alpha)
      end
      @@_animations.clear
    end
    def update_animation
      if @_animation_duration > 0
        frame_index = @_animation.frame_max - @_animation_duration
        cell_data = @_animation.frames[frame_index].cell_data
        position = @_animation.position
        animation_set_sprites(@_animation_sprites, cell_data, position)
        #=======================================
        # 修改:弹出伤害,权重计算
        #=======================================
        for timing in @_animation.timings
          if timing.frame == frame_index
            t = 1.0 * animation_process_timing(timing, @_animation_hit)            
            #p t,"当前权重", @all_quanzhong,"总权重"
            if @battler_damage.is_a?(Numeric) and t != 0
              t *= @battler_damage
              t /= @all_quanzhong
              #p t,"当前伤害",@battler_damage,"总伤害"
              t = t.to_i
              #p t,@battler_damage,@all_quanzhong
              damage(t,@battler_critical)
            elsif !@battler_damage.is_a?(Numeric)
              damage(@battler_damage,@battler_critical)
            end
          end
        end
      else
        dispose_animation
      end
    end
    #=======================================
    # 修改:敌人跳跃的功能 + 添加返回数值
    #=======================================
     def animation_process_timing(timing, hit)
       if (timing.condition == 0) or
          (timing.condition == 1 and hit == true) or
          (timing.condition == 2 and hit == false)
         if timing.se.name != ""
           se = timing.se
           Audio.se_play("Audio/SE/" + se.name, se.volume, se.pitch)
         end
         case timing.flash_scope
         when 1
           self.flash(timing.flash_color, timing.flash_duration * 2)
           @flash_shake_switch = true
           @flash_shake = 10
           return timing.flash_color.alpha * timing.flash_duration
         when 2
           if self.viewport != nil
             self.viewport.flash(timing.flash_color, timing.flash_duration * 2)
             return timing.flash_color.alpha * timing.flash_duration
           end
         when 3
           self.flash(nil, timing.flash_duration * 2)
           return timing.flash_color.alpha * timing.flash_duration
         end
       end       
       return 0
     end    
  end
end
#==============================================================================
# â–  Sprite_Battler
#==============================================================================
class Sprite_Battler < RPG::Sprite 
   attr_accessor :battler   
 #--------------------------------------------------------------------------
 # ● 初始化对像
 #    添加跳跃记录
 #--------------------------------------------------------------------------
 def initialize(viewport, battler = nil)
   super(viewport)
   @battler = battler
   @battler_visible = false
   @flash_shake_switch = true
 end
 #--------------------------------------------------------------------------
 # ● 刷新画面
 #    增添跳跃功能
 #--------------------------------------------------------------------------
 def update
   super
   # 战斗者为 nil 的情况下
   if @battler == nil
     self.bitmap = nil
     loop_animation(nil)
     return
   end
   # 文件名和色相与当前情况有差异的情况下





if @battler.battler_name != @battler_name or
      @battler.battler_hue != @battler_hue
     # 获取、设置位图
    @battler_name = @battler.battler_name
    @battler_hue = @battler.battler_hue





     self.bitmap = RPG::Cache.battler(@battler_name, @battler_hue)
     @width = bitmap.width
     @height = bitmap.height
     self.ox = @width / 2
     self.oy = @height
     # 如果是战斗不能或者是隐藏状态就把透明度设置成 0
     if @battler.dead? or @battler.hidden
       self.opacity = 0
     end
   end
   # 动画 ID 与当前的情况有差异的情况下
   if @battler.damage == nil and
      @battler.state_animation_id != @state_animation_id
     @state_animation_id = @battler.state_animation_id
     loop_animation($data_animations[@state_animation_id])
   end
   # 应该被显示的角色的情况下
   if @battler.is_a?(Game_Actor) and @battler_visible
     # 不是主状态的时候稍稍降低点透明度
     if $game_temp.battle_main_phase
       self.opacity += 3 if self.opacity < 255
     else
       self.opacity -= 3 if self.opacity > 207
     end
    if $game_party.actors.size == 1
       self.x = @battler.screen_x + 240
     elsif $game_party.actors.size == 2
       self.x = @battler.screen_x + 160
     elsif $game_party.actors.size == 3
       self.x = @battler.screen_x + 80
     elsif $game_party.actors.size == 4
       self.x = @battler.screen_x
     end
   elsif @battler.is_a?(Game_Enemy)
     self.x = @battler.screen_x
   end
   # 明灭
   if @battler.blink
     blink_on
   else
     blink_off
   end
   # 不可见的情况下
   unless @battler_visible
     # 出现
     if not @battler.hidden and not @battler.dead? and
        (@battler.damage == nil or @battler.damage_pop)
       appear
       @battler_visible = true
     end
   end
   # 可见的情况下
   if @battler_visible
     # 逃跑
     if @battler.hidden
       $game_system.se_play($data_system.escape_se)
       escape
       @battler_visible = false
     end
     # 白色闪烁
     if @battler.white_flash
       whiten
       @battler.white_flash = false
     end
     # 动画
     if @battler.animation_id != 0
       animation = $data_animations[@battler.animation_id]
       animation(animation, @battler.animation_hit,@battler.damage, @battler.critical)
       @battler.animation_id = 0
     end
     # 伤害
     if @battler.damage_pop
       damage(@battler.damage, @battler.critical)
       @battler.damage = nil
       @battler.critical = false
       @battler.damage_pop = false
     end
     # korapusu
     if @battler.damage == nil and @battler.dead?
       if @battler.is_a?(Game_Enemy)
         $game_system.se_play($data_system.enemy_collapse_se)
       else
         $game_system.se_play($data_system.actor_collapse_se)
       end
       collapse
       @battler_visible = false
     end
   end
   # 设置活动块的坐标
   if @flash_shake_switch == true
     self.x = @battler.screen_x
     self.y = @battler.screen_y
     self.z = @battler.screen_z
     @flash_shake_switch = false
   end
   if @flash_shake != 0 and @battler.damage != nil
     case @flash_shake
     when 9..10
       self.x = @battler.screen_x
       self.y -=4
       self.z = @battler.screen_z
     when 6..8
       self.x = @battler.screen_x
       self.y -=2
       self.z = @battler.screen_z
     when 3..5
       self.x = @battler.screen_x
       self.y +=2
       self.z = @battler.screen_z
     when 2
       self.x = @battler.screen_x
       self.y += 4
       self.z = @battler.screen_z
     when 1
       self.x = @battler.screen_x
       self.y = @battler.screen_y
       self.z = @battler.screen_z
     end
     @flash_shake -= 1
   end
 end
end


class Arrow_Actor < Arrow_Base
 #--------------------------------------------------------------------------
 # ? ???
 #--------------------------------------------------------------------------
 def update
   super
   # ??
   if Input.repeat?(Input::RIGHT)
     $game_system.se_play($data_system.cursor_se)
     @index += 1
     @index %= $game_party.actors.size
   end
   # ??
   if Input.repeat?(Input::LEFT)
     $game_system.se_play($data_system.cursor_se)
     @index += $game_party.actors.size - 1
     @index %= $game_party.actors.size
   end
   # ??
   if self.actor != nil
     if $game_party.actors.size == 1
       self.x = self.actor.screen_x + 240
     elsif $game_party.actors.size == 2
       self.x = self.actor.screen_x + 160
     elsif $game_party.actors.size == 3
       self.x = self.actor.screen_x + 80
     elsif $game_party.actors.size == 4
       self.x = self.actor.screen_x
     end
     self.y = self.actor.screen_y
   end
 end
end



#==============================================================================
# ¦ Window_BattleStatus
#------------------------------------------------------------------------------
#  ???
#==============================================================================

class Window_BattleStatus < Window_Base
 #--------------------------------------------------------------------------
 # ? ???
 #--------------------------------------------------------------------------
 def initialize
   super(0, 320, 160 * $game_party.actors.size, 160)
   self.contents = Bitmap.new(width - 32, height - 32)
   self.contents.font.name = $fontface  # "Battle Status" window font
   self.contents.font.size = $fontsize = 20
   @level_up_flags = [false, false, false, false]
   if $game_party.actors.size == 3
     self.width = 480
     self.x = 80
   elsif $game_party.actors.size == 2
     self.width = 320
     self.x = 160
   elsif $game_party.actors.size == 1
     self.width = 160
     self.x = 240
   else
     self.width = 640
   end
   refresh
 end
end



#==============================================================================
# ¦ Scene_Battle (? 3)
#------------------------------------------------------------------------------
#  ??
#==============================================================================

class Scene_Battle
   def phase3_setup_command_window
   # ??
   @party_command_window.active = false
   @party_command_window.visible = false
   # ??
   @actor_command_window.active = true
   @actor_command_window.visible = true
   # ????
     if $game_party.actors.size == 1
       @actor_command_window.x = (@actor_index * 160) + 240
     elsif $game_party.actors.size == 2
       @actor_command_window.x = (@actor_index * 160) + 160
     elsif $game_party.actors.size == 3
       @actor_command_window.x = (@actor_index * 160) + 80
     elsif $game_party.actors.size == 4
       @actor_command_window.x = @actor_index * 160
     end
   # ? 0 ???
   @actor_command_window.index = 0
 end
end
 
i need the animations in the same place of the battlers, something like this
if $game_party.actors.size == 1
self.x = @battler.screen_x + 240
elsif $game_party.actors.size == 2
self.x = @battler.screen_x + 160
elsif $game_party.actors.size == 3
self.x = @battler.screen_x + 80
elsif $game_party.actors.size == 4
self.x = @battler.screen_x
end
elsif @battler.is_a?(Game_Enemy)
self.x = @battler.screen_x
end
but with the animations, please somebody do,
:S it i tried but i cant:S
 

Thank you for viewing

HBGames is a leading amateur video game development forum and Discord server open to all ability levels. Feel free to have a nosey around!

Discord

Join our growing and active Discord server to discuss all aspects of game making in a relaxed environment. Join Us

Content

  • Our Games
  • Games in Development
  • Emoji by Twemoji.
    Top