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.

a minor script fix

Im using a script that makes it so in battle, damage is divided via the number of of timings added(as in, for every flash/SE timing you add, it does damage and this damage is divided by the number of timings total). There's a small problem with it outside of battle, however. For some reason it makes it so every timing effect occurs at the beginning, as well as where its originally supposed to happen. So for example, if I have an animation with a flash and gun shot on the 17th frame, I get the flash/shot at the 17th frame AND the 1st.
Here is the script, hopefully someone can find the problem without screwing up what its supposed to do:
Code:
#==============================================================================
# 本脚本来自www.66RPG.com,使用和转载请保留此信息
#============================================================================== 
# 核心的说明:
# 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 = "Georgia"
      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, 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 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 
 #--------------------------------------------------------------------------
 # ● 初始化对像
 #    添加跳跃记录
 #--------------------------------------------------------------------------
 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
   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
       @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
Thanks in advance.

bump

Please wait 72 hours before bumping
~Trickster
 

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