O TEMA DO FÓRUM ESTÁ EM MANUTENÇÃO. FEEDBACKS AQUI: ACESSAR

Sprites no Pearl ABS

Iniciado por hategum rpg, 08/04/2015 às 09:56

08/04/2015 às 09:56 Última edição: 08/04/2015 às 13:39 por hategum rpg
Estou tentando encontrar o código que faz o character se mover quando usa alguma habilidade, arma, armadura etc... o personagem se move uma frame quero aumentar esse numero para 10 frames... acho que pode estar por aqui.

#===============================================================================
# * Falcao Pearl ABS script shelf # 5
#
# This script handles all sprites of Pearl ABS engine
#===============================================================================

# Anime action enguine
class Anime_Obj < Game_Character
  attr_accessor :draw_it, :destroy_it, :item, :user, :original_speed
  attr_reader   :custom_graphic
  def initialize(user, item)
    super()
    PearlKernel.load_item(item)
    @draw_it = false
    @destroy_it = false
    @item = item
    @user = user
    @custom_graphic = false
    graphic = PearlKernel.user_graphic
    if graphic.split(" ").include?('custom') 
      graphic = graphic.sub("custom ","")
      @custom_graphic = true
      user.transparent = true
      user.using_custom_g = true
    end
    @character_name = graphic
    moveto(@user.x, @user.y)
    set_direction(@user.direction)
    @original_speed = PearlKernel.user_animespeed
    
    #patch
    PearlKernel.check_iconset(@item, "User Iconset = ", self)
    @character_name = "" if @user_iconset != nil
  end
end

# Sprite character added battlers as enemies and the anime sprites fit
class Sprite_Character < Sprite_Base
  alias falcaopearl_update_position update_position
  def update_position
    if !@character.battler.nil? and @character.battler.is_a?(
      Game_Enemy) and @character.battler.breath_enable
      apply_breath_effect(@character)
    end
    self.zoom_x = @character.zoomfx_x
    self.zoom_y = @character.zoomfx_y
    self.angle = @character.angle_fx
    falcaopearl_update_position
    update_anime_object_pos
  end
  
  # anime object position and action
  def update_anime_object_pos
    if @character.is_a?(Anime_Obj)
      if @character.custom_graphic
        add = 0
      else
        @ch == 128 ? add = 48 : add = (@ch / 2) / 2
      end
      self.x = @character.user.screen_x
      self.y = @character.user.screen_y + add
      self.z = @character.user.screen_z + 1
      @character.direction = @character.user.direction
      if @character.user.anime_speed == 0
        if @character.custom_graphic
          @character.user.transparent = false 
          @character.user.using_custom_g = false
        end
        @character.destroy_it = true 
      end
      if @character.user.making_spiral
        @character.direction == 8 ? @character.pattern=1 : @character.pattern=2
        return
      end
      a= @character.user.anime_speed.to_f/@character.original_speed.to_f * 100.0
      case a
      when 80..100 ; @character.pattern = 0 
      when 60..80  ; @character.pattern = 1
      when 25..60  ; @character.pattern = 2
      end
    end
  end
  
  # Enemy battler graphics engine
  alias falcaopearl_battler_bitmap set_character_bitmap
  def set_character_bitmap
    if battler_graphic?
      self.bitmap= Cache.battler(@character_name,@character.battler.battler_hue)
      self.ox = self.bitmap.width / 2
      self.oy = self.bitmap.height
      return
    end
    falcaopearl_battler_bitmap
  end
  
  def battler_graphic?
    if !@character.battler.nil? and @character.battler.is_a?(
      Game_Enemy) and @character.battler.battler_graphic
      return false if @character.page.nil?
      @character_name = @character.battler.battler_name
      return true 
    end
    return false
  end
  
  alias falcaopearl_battler_graphic update_src_rect
  def update_src_rect
    return if battler_graphic?
    falcaopearl_battler_graphic
  end
  
  # breath effect
  def apply_breath_effect(char)
    return if @character.is_a?(Game_Event) and @character.erased
    char.zoomfx_x -= 0.0023 if !char.zfx_bol
    char.zoomfx_y -= 0.0023 if !char.zfx_bol
    char.zoomfx_x += 0.0023 if  char.zfx_bol
    char.zoomfx_y += 0.0023 if  char.zfx_bol
    char.zfx_bol = true if char.zoomfx_x <= 0.93
    char.zfx_bol = false if char.zoomfx_x >= 1.0
  end
end

#sprite characters part 2 (icon graphics feature
class Sprite_Character < Sprite_Base
 
  def iconset_graphic?
    !@character.user_iconset.nil? || !@character.pro_iconset.nil?
  end
 
  alias falcao_fantastic_bit update_bitmap
  def update_bitmap
    if iconset_graphic?
      if @apply_iconset.nil?
        icon = @character.user_iconset[0] if !@character.user_iconset.nil? and
        @character.is_a?(Anime_Obj)
        icon = @character.pro_iconset[0] if !@character.pro_iconset.nil? and
        @character.is_a?(Projectile)
        set_iconsetbitmap(icon)
        @apply_iconset = true
      end
      apply_breath_effect2(@character) if !@character.pro_iconset.nil? and
      @character.is_a?(Projectile) and @character.pro_iconset[1] == :animated
      @enable_angle = @character.user_iconset[1] if
      !@character.user_iconset.nil? and @character.is_a?(Anime_Obj)
      return
    end
    falcao_fantastic_bit
  end
 
  alias falcao_fantastic_update_position update_position
  def update_position
    falcao_fantastic_update_position
    set_angle_changes(@enable_angle) if @enable_angle != nil
  end
 
  def apply_angle_pattern(x_plus, y_plus, angle)
    self.x = @character.user.screen_x + x_plus
    self.y = @character.user.screen_y + y_plus
    self.angle = angle
  end
 
  def set_angle_changes(type)
    ani= @character.user.anime_speed.to_f/@character.original_speed.to_f * 100.0
    case ani
    when 80..100
      perform_animated(0) if type == :animated
    when 60..80
      perform_animated(1) if type == :animated
    when 0..60
      perform_animated(2) if type == :animated
    end
    if type != :animated
      perform_static       if type == :static
      perform_shielding    if type == :shielding
    end
  end
 
  # animated
  def perform_animated(pattern)
    case pattern
    when 0
      apply_angle_pattern(10, -12, -166) if @character.user.direction == 2
      if @character.user.direction == 4 || @character.user.direction == 6
        apply_angle_pattern(-8, -26, -46)
        self.z = @character.user.screen_z - 1
      end
      apply_angle_pattern(-22, -10, 0)   if @character.user.direction == 8
    when 1
      apply_angle_pattern(0, 0, -266)   if @character.user.direction == 2
      apply_angle_pattern(-20, -10, 12) if @character.user.direction == 4
      apply_angle_pattern(7, -20, -78)  if @character.user.direction == 6
      if @character.user.direction == 8
        apply_angle_pattern(-8, -26, -46)
        self.z = @character.user.screen_z - 1
      end
    when 2
      apply_angle_pattern(8, -5, -210)    if @character.user.direction == 2
      apply_angle_pattern(-10, 2, 52)     if @character.user.direction == 4
      apply_angle_pattern(8, -15, -126)  if @character.user.direction == 6
      apply_angle_pattern(10, -16, - 100) if @character.user.direction == 8
    end
  end
 
  # static
  def perform_static
    apply_angle_pattern(8, -5, -210)    if @character.user.direction == 2
    apply_angle_pattern(-10, 2, 52)     if @character.user.direction == 4
    apply_angle_pattern(8, -15, -126)  if @character.user.direction == 6
    if @character.user.direction == 8
      apply_angle_pattern(-8, -26, -46)
      self.z = @character.user.screen_z - 1
    end
  end
 
  # shielding
  def perform_shielding
    apply_angle_pattern(2, 4, 0)    if @character.user.direction == 2
    apply_angle_pattern(-10, 0, 0)     if @character.user.direction == 4
    if @character.user.direction == 6
      apply_angle_pattern(10, 0, 0)  
      self.z = @character.user.screen_z - 1
    elsif @character.user.direction == 8
      apply_angle_pattern(11, -9, 0)  
      self.z = @character.user.screen_z - 1
    end
  end
 
  def apply_breath_effect2(char)
    char.zoomfx_x -= 0.03 if !char.zfx_bol
    char.zoomfx_y -= 0.03 if !char.zfx_bol
    char.zoomfx_x += 0.03 if char.zfx_bol
    char.zoomfx_y += 0.03 if char.zfx_bol
    char.zfx_bol = true if char.zoomfx_x <= 0.84
    char.zfx_bol = false if char.zoomfx_x >= 1.0
  end
 
  alias falcao_fantastic_src update_src_rect
  def update_src_rect
    return if iconset_graphic?
    falcao_fantastic_src
  end
 
  def set_iconsetbitmap(icon_index, enabled = true)
    self.bitmap = Bitmap.new(24, 24)
    bit = Cache.system("Iconset")
    rect = Rect.new(icon_index % 16 * 24, icon_index / 16 * 24, 24, 24)
    self.bitmap.blt(0, 0, bit, rect, enabled ? 255 : 150)
    @cw = self.ox = 12
    @ch = self.oy = 24
  end
end

#===============================================================================
# Drop sprites
class Sprite_EnemyDrop < Sprite
  attr_reader   :event
  def initialize(viewport, event, item)
    super(viewport)
    @event = event
    @item = item
    @drop_quantity = @item.tool_data("Drop Quantity = ")
    @drop_quantity = 1 if @drop_quantity.nil?
    self.z = $game_player.screen_z - 1
    @object_zooming = 0
    set_bitmap
    update
  end
  
  def update
    super
    self.bush_depth = @event.bush_depth
    @object_zooming += 1
    case @object_zooming
    when 1..8  ; self.zoom_x -= 0.01 ;  self.zoom_y -= 0.01
    when 9..16 ; self.zoom_x += 0.01 ;  self.zoom_y += 0.01
    when 17..24 ; self.zoom_x = 1.0   ;  self.zoom_y = 1.0; @object_zooming = 0 
    end
    self.x = @event.screen_x - 12
    self.y = @event.screen_y - 24
    if @event.x == $game_player.x and @event.y == $game_player.y and
      !$game_player.moving?
      complete_action
      return
    end
    
    complete_action(false) if @event.respawn_count == 1
  end
  
  def complete_action(gaining=true)
    $game_party.gain_item(@item, @drop_quantity) if gaining
    dispose
    @event.dropped_items.delete(@item)
    $game_map.events_withtags.delete(@event)
  end
  
  def dispose
    self.bitmap.dispose
    super
  end
  
  def set_bitmap
    self.bitmap = Bitmap.new(26, 38)
    bitmap = Cache.system("Iconset")
    icon = @item.icon_index
    rect = Rect.new(icon % 16 * 24, icon / 16 * 24, 24, 24)
    self.bitmap.blt(0, 0, bitmap, rect)
    
    ##num adds
    return if @drop_quantity == 0
    self.bitmap.font.size = 14
    self.bitmap.font.bold = true
    self.bitmap.draw_text(0, 8, 26, 32, @drop_quantity.to_s, 1)
  end
end

#===============================================================================
# Dead icon sprites for player and followers

class Sprite_DeadIcon < Sprite
  attr_reader   :character
  def initialize(viewport, character)
    super(viewport)
    @character = character
    self.bitmap = Bitmap.new(24, 24)
    bitmap = Cache.system("Iconset")
    icon = 1
    rect = Rect.new(icon % 16 * 24, icon / 16 * 24, 24, 24)
    self.bitmap.blt(0, 0, bitmap, rect)
    @knok = @character.actor.actor.tool_data("Knockdown Graphic = ",false)!= nil
    update
  end
  
  def update
    super
    self.x = @character.screen_x - 10
    self.y = @character.screen_y - 54
    self.z = @character.screen_z + 1
    self.opacity = @character.opacity
    self.visible = !@character.transparent
    if @knok
      @character.knockdown_data[0] = 10 if !@character.battler.deadposing.nil?
    else
      @character.playdead
      @character.direction = 8
      self.x = @character.screen_x - 26
    end
  end
  
  def dispose
    self.bitmap.dispose
    @character.angle_fx = 0.0 unless @knok
    super
  end
end

#===============================================================================
# State and buff icons sprites
class StateBuffIcons < Sprite
  def initialize(viewport, mode)
    super(viewport)
    @mode = mode
    self.bitmap = Bitmap.new(36, 134)
    @picture = Cache.system("Iconset")
    if @mode == "States"
      self.x = 544 - 36
      self.y = 90
    else
      self.x = 544 - 36
      self.y = 230
    end
    @actor = $game_player.actor
    @old_status = []
    refresh_icons
    update
  end
  
  def icons
    return @actor.state_icons if @mode == 'States'
    return @actor.buff_icons  if @mode == 'Buffs'
  end
  
  def update
    5.times.each {|i| 
    if @old_status[i] != icons[i]
      refresh_icons
      $game_player.actor.apply_usability
    end}
    if @actor != $game_player.actor
      @actor = $game_player.actor
      refresh_icons
    end
  end
  
  def dispose
    self.bitmap.dispose
    super
  end
  
  def refresh_icons
    self.bitmap.clear
    self.bitmap.font.size = 15
    self.bitmap.draw_text(-2, -8, self.bitmap.width + 6, 32, @mode, 1) 
    y = 12; count = 0
    for i in icons
      draw_icon(6, y, i)
      y += 24; count += 1
      break if count == 5
    end
    5.times.each {|i| @old_status[i] = icons[i]}
  end
  
  def draw_icon(x, y, index)
    icon = index
    rect = Rect.new(icon % 16 * 24, icon / 16 * 24, 24, 24)
    self.bitmap.blt(x, y, @picture, rect)
  end
end

#===============================================================================
#  * Damage pop engine

class DamagePop_Obj < Game_Character
  attr_accessor :draw_it, :destroy_it, :target, :dmgcustom, :timingg, :plus_time
  attr_accessor :plus_time
  def initialize(target, custom=nil)
    super()
    @draw_it = false
    @destroy_it = false
    @target = target
    @timingg = 70
    @plus_time = 0.0
    @dmgcustom = custom
    moveto(@target.x, @target.y)
  end
end

class Sprite_DamagePop < Sprite
  attr_reader   :target
  def initialize(viewport, target)
    super(viewport)
    @target = target
    self.bitmap = Bitmap.new(200, 50)
    self.bitmap.font.size = 20
    case rand(4)
    when 0 then @resto_plus = 0.5
    when 1 then @resto_plus = 0.6
    when 2 then @resto_plus = 0.7
    when 3 then @resto_plus = 0.8
    end
    create_text_for_display
    set_text
    update
  end
  
  def create_text_for_display
    battler = @target.target.battler
    value   = battler.result.hp_damage
    value2  = battler.result.mp_damage
    value3  = battler.result.tp_damage
    
    # hp damage texts
    if value > 0
      battler.result.critical ? @text = 'Critico! ' + value.to_s :
      @text = value.to_s
    elsif value < 0
      self.bitmap.font.color = Color.new(10,220,45)
      @text = value.to_s.sub("-","")
    elsif    battler.result.missed
      @text = 'Errou'
    elsif battler.result.evaded
      @text = 'Esquivou'
      
    elsif battler.result.success # tanget take no damage but result succes
      @text = value.to_s
    end
    
    # mp damage text 
    if value2 < 0
      self.bitmap.font.color = Color.new(20,160,225)
      @text = value2.to_s.sub("-","")
    elsif value2 > 0
      @text = '- EN' + value2.to_s
    end
    
    # TP damage text 
    if value3 < 0
      self.bitmap.font.color = Color.new(20,160,225)
      @text = value3.to_s.sub("-","")
    elsif value3 > 0
      @text = '- PP' + value3.to_s
    end
    
    # states and buff display
    if battler.result.status_affected?
      display_changed_states(battler)
      display_changed_buffs(battler)
    end
    
    # Custom text (it has hightest priority
    if !@target.dmgcustom.nil?
      if @target.dmgcustom == 1
        @text = 'Bloqueio ' + value.to_s
      elsif @target.dmgcustom == 2
        @text = 'Defesa'
      elsif @target.dmgcustom.is_a?(String)   
        @text = @target.dmgcustom
      elsif @target.dmgcustom.is_a?(Array)
        self.bitmap.font.color = @target.dmgcustom[1]
        @text = @target.dmgcustom[0]
      end
    end
    battler.result.clear
  end
  
  # text set and position
  def set_text
    self.x = @target.screen_x - 98
    self.y = @target.screen_y - 54
    self.z = 3 * 100
    self.opacity = @target.opacity
    #self.bitmap.font.bold = true
    self.bitmap.font.shadow = true
    item = @target.target.battler.used_item
    if item != nil and !item.scope.between?(1, 6) and 
      item.tool_data("User Graphic = ", false).nil?
      @text = item.name if @text.nil?
    end
    @target.target.battler.used_item = nil
    self.bitmap.draw_text(0, 0, 200, 32, @text, 1)
  end
  
  # Buffs display
  def display_changed_buffs(target)
    display_buffs(target, target.result.added_buffs, Vocab::BuffAdd)
    display_buffs(target, target.result.added_debuffs, Vocab::DebuffAdd)
    display_buffs(target, target.result.removed_buffs, Vocab::BuffRemove)
  end
  
  def display_buffs(target, buffs, fmt)
    buffs.each do |param_id|
      @text = sprintf(fmt,'', Vocab::param(param_id)).sub("'s","")
    end
  end
  
  # States display
  def display_changed_states(target)
    display_added_states(target)
    display_removed_states(target)
  end
  
  # Display added states
  def display_added_states(target)
    target.result.added_state_objects.each do |state|
      state_msg = target.actor? ? state.message1 : state.message2
      #target.perform_collapse_effect if state.id == target.death_state_id
      next if state_msg.empty?
      @text = state_msg
    end
  end
  
  # Display removed states
  def display_removed_states(target)
    target.result.removed_state_objects.each do |state|
      next if state.message4.empty?
      @text = state.message4
    end
  end
  
  def update
    @target.timingg -= 1 if @target.timingg > 0
    @target.plus_time += @resto_plus
    self.opacity -= 5 if @target.timingg <= 25
    @target.destroy_it = true if @target.timingg == 0
    self.x = @target.target.screen_x - 98
    self.y = @target.target.screen_y - 54 - @target.plus_time
  end
  
  def dispose
    self.bitmap.dispose
    super
  end
end

#===============================================================================
# Sprite set map

class Spriteset_Map
  
  alias falcaopearl_create_characters create_characters
  def create_characters
    create_pearl_abs_sprites
    falcaopearl_create_characters
  end
  
  def create_pearl_abs_sprites
    if $game_player.send_dispose_signal
      dispose_pearlabs_sprites
      $game_player.send_dispose_signal = false
    end
    @projectile_sprites = []
    $game_player.projectiles.each do |projectile|
      @projectile_sprites.push(Sprite_Character.new(@viewport1, projectile))
    end
    @damagepop_sprites = []
    $game_player.damage_pop.each do |target|
      @damagepop_sprites.push(Sprite_DamagePop.new(@viewport1, target))
    end
    @animeabs_sprites = []
    $game_player.anime_action.each do |anime|
      @animeabs_sprites.push(Sprite_Character.new(@viewport1, anime))
    end
    @enemy_drop_sprites = []
    $game_player.enemy_drops.each do |enemy|
      for i in enemy.dropped_items
        @enemy_drop_sprites.push(Sprite_EnemyDrop.new(@viewport1, enemy, i))
      end
    end
    @dead_iconsprites = []
    @dead_characters = []
  end
  
  # Drop sprites update
  def update_drop_sprites
    @enemy_drop_sprites.each {|sprite| sprite.update if !sprite.disposed?
    if sprite.disposed?
      @enemy_drop_sprites.delete(sprite)
      $game_player.enemy_drops.delete(sprite.event)
    end
    }
    $game_player.enemy_drops.each do |enemy|
      unless enemy.draw_drop
        for i in enemy.dropped_items
          @enemy_drop_sprites.push(Sprite_EnemyDrop.new(@viewport1, enemy, i))
        end
        enemy.draw_drop = true
      end
    end
  end
  
  alias falcaopearl_upsp_update update
  def update
    update_pearl_abs_main_sprites
    falcaopearl_upsp_update
  end
  
  # pearl abs main sprites update
  def update_pearl_abs_main_sprites
    if $game_player.pearl_menu_call[1] == 1
      dispose_tool_sprite
      dispose_state_icons
      dispose_buff_icons
      dispose_actorlifebars if $imported["Falcao Pearl ABS Life"]
      $game_player.pearl_menu_call[1] = 0
      case $game_player.pearl_menu_call[0]
      when :tools     then SceneManager.call(Scene_QuickTool) 
      when :character then SceneManager.call(Scene_CharacterSet)
      when :battler   then SceneManager.call(Scene_BattlerSelection)
      end
      return
    end
    update_projectile_sprites
    update_damagepop_sprites
    update_absanime_sprites
    update_dead_characters
    update_drop_sprites
    $game_system.skillbar_enable.nil? ? create_tool_sprite : dispose_tool_sprite
    @pearl_tool_sprite.update unless @pearl_tool_sprite.nil?
    $game_player.actor.state_icons.empty? ? dispose_state_icons :
    create_state_icons
    $game_player.actor.buff_icons.empty? ? dispose_buff_icons :
    create_buff_icons
    @states_sprites.update unless @states_sprites.nil?
    @buff_sprites.update unless @buff_sprites.nil?
  end
  
  # create tool sprite
  def create_tool_sprite
    return if !@pearl_tool_sprite.nil?
    @pearl_tool_sprite = Sprite_PearlTool.new(@viewport2)
  end
  
  # dispose tool sprite
  def dispose_tool_sprite
    return if @pearl_tool_sprite.nil?
    @pearl_tool_sprite.dispose
    @pearl_tool_sprite = nil
  end
  
  # Create State icons
  def create_state_icons
    return if !@states_sprites.nil?
    @states_sprites = StateBuffIcons.new(@viewport2, 'States')
  end
  
  # dispose state icons
  def dispose_state_icons
    return if @states_sprites.nil?
    @states_sprites.dispose
    @states_sprites = nil
  end
  
  # Create Buff icons
  def create_buff_icons
    return if !@buff_sprites.nil?
    @buff_sprites = StateBuffIcons.new(@viewport2, 'Buffs')
  end
  
  # dispose buff icons
  def dispose_buff_icons
    return if @buff_sprites.nil?
    @buff_sprites.dispose
    @buff_sprites = nil
  end
  
  # Projectiles
  def update_projectile_sprites
    @projectile_sprites.each {|sprite| sprite.update if !sprite.disposed?}
    $game_player.projectiles.each do |projectile|
      unless projectile.draw_it
        @projectile_sprites.push(Sprite_Character.new(@viewport1, projectile))
        projectile.draw_it = true
      end
      if projectile.destroy_it
        @projectile_sprites.each {|i|
        if i.character.is_a?(Projectile) and i.character.destroy_it
          i.dispose
          @projectile_sprites.delete(i)
        end
        }
        if projectile.user.making_spiral
          projectile.user.making_spiral = false
        end
        if projectile.user.battler_guarding[0]
          projectile.user.battler_guarding = [false, nil]
          projectile.user.battler.remove_state(9)
        end
        $game_player.projectiles.delete(projectile)
      end
    end
  end
  
  # Damage pop 
  def update_damagepop_sprites
    @damagepop_sprites.each {|sprite| sprite.update if !sprite.disposed?}
    $game_player.damage_pop.each do |target|
      unless target.draw_it
        @damagepop_sprites.push(Sprite_DamagePop.new(@viewport1, target))
        target.draw_it = true
      end
      if target.destroy_it
        @damagepop_sprites.each {|i|
        if i.target.destroy_it
          i.dispose
          @damagepop_sprites.delete(i)
        end
        }
        $game_player.damage_pop.delete(target)
      end
    end
  end
  
  #=================================
  # ANIME SPRITES
  def update_absanime_sprites
    @animeabs_sprites.each {|s| s.update if !s.disposed?
    unless $game_player.anime_action.include?(s.character)
      s.dispose
      @animeabs_sprites.delete(s)
      $game_player.anime_action.delete(s.character)
    end
    }
    $game_player.anime_action.each do |anime|
      unless anime.draw_it
        @animeabs_sprites.push(Sprite_Character.new(@viewport1, anime))
        anime.draw_it = true
      end
      if anime.destroy_it
        @animeabs_sprites.each {|i|
        if i.character.is_a?(Anime_Obj) and i.character.destroy_it
          i.dispose
          @animeabs_sprites.delete(i)
        end
        }
        $game_player.anime_action.delete(anime)
      end
    end
  end
  
  def update_dead_characters
    for follower in $game_player.followers
      next if follower.visible? == nil
      next unless follower.battler.dead?
      unless @dead_characters.include?(follower)
        sprite = Sprite_DeadIcon.new(@viewport1, follower)
        @dead_iconsprites.push(sprite)
        @dead_characters.push(follower)
      end
    end
    
    for sprite in @dead_iconsprites
      sprite.update if !sprite.disposed?
      if !sprite.character.battler.dead?
        @dead_iconsprites.delete(sprite)
        @dead_characters.delete(sprite.character)
        sprite.dispose
      end
    end
  end
  
  alias falcaopearl_spdispose dispose
  def dispose
    dispose_pearl_main_sprites
    falcaopearl_spdispose
  end
  
  # pearl abs disposing
  def dispose_pearl_main_sprites
    @dead_iconsprites.each {|icon| icon.dispose}
    dispose_tool_sprite
    dispose_state_icons
    dispose_buff_icons
    dispose_pearlabs_sprites
  end
  
  def dispose_pearlabs_sprites
    @projectile_sprites.each {|pro| pro.dispose}
    @projectile_sprites.clear
    @damagepop_sprites.each {|target| target.dispose}
    @damagepop_sprites.clear
    @animeabs_sprites.each {|anime| anime.dispose}
    @animeabs_sprites.clear
    @enemy_drop_sprites.each {|sprite| sprite.dispose}
    @enemy_drop_sprites.clear
  end
end


O importante é fazer com que o personagem execute a animação completa de 10 frames.


Eu não achei nesse trecho que me mandou :/

sera que esta aqui? tem uma parte que fala sobre game character
Spoiler
[code]# * Falcao Pearl ABS script shelf # 1
#
# This script is the Heart of Pearl ABS Liquid, it handles all the character
# management, the tools variables and the input module, enemy registration etc.
#===============================================================================

module PearlKernel
 
  # Default enemy sensor self switch
  Enemy_Sensor = "B"
 
  # Default enemy sensor (distance in tiles the enemy is able to see the Player
  Sensor = 7
 
  # Default enemy knockdown self switch (used to display knockdowned graphic)
  KnockdownSelfW = "C"
 
  # Deafault Enemy collapse
  DefaultCollapse = 'zoom_vertical'
 
  # While in party battle on map, the game player is the manager of the group
  # Which distance the player can see the enemies?, this is used, to determine
  # wheter the follower can start fighting. enemy away from this tiles
  # whil be ignored untill the player is near them
  # distamce measured in tiles
  PlayerRange = 7
 
  # When a follower fail an action this balloon is played, runs out of mana etc.
  FailBalloon = 1
 
  # Start the game with the ABS huds turned on?
  StartWithHud = true
 
  # Do you want to activate the followers dead poses?
  FollowerDeadPose = true
 
  # Do you want to activate the single player mode?
  # this only avoid you accesing the player slection menu and the K key is used
  # to open the quick tool selection menu
  SinglePlayer = false
 
  #-----------------------------------------------------------------------------
  @gaugeback = Color.new(0, 0, 0, 100)
  def self.draw_hp(obj, battler, x, y, w, h, color, name=nil)
    tag = 'VD' ; c = color
    name = battler.name if !name.nil?
    draw_gauge(obj, battler.hp, battler.mhp, x, y, w, h, c, tag, name)
  end
 
  def self.draw_mp(obj, battler, x, y, w, h, color, name=nil)
    tag = 'EN' ; c = color
    name = battler.name if !name.nil?
    draw_gauge(obj, battler.mp, battler.mmp, x, y, w, h, c, tag, name)
  end
 
  def self.draw_exp(obj, battler, x, y, w, h, color, name=nil)
    tag = 'Exp' ; c = color
    name = battler.name if !name.nil?
    draw_gauge(obj,battler.exp, battler.next_level_exp, x, y, w, h, c, tag,name)
  end
 
  def self.draw_tp(obj, x, y, actor)
    string = 'PP ' + (actor.tp).to_i.to_s
    obj.fill_rect(x, y + 10 , string.length * 9, 12, @gaugeback)
    obj.draw_text(x, y, obj.width, 32, string)
  end
 
  def self.draw_gauge(obj, nm, max, x, y, w, h, col, tag, name)
    obj.font.shadow = true
    w2 = w - 2 ; max = 1 if max == 0
    obj.fill_rect(x, y - 1, w, h + 2, @gaugeback)
    obj.fill_rect(x+1, y+1, w2*nm/max, h/2 - 1, col[0])
    obj.fill_rect(x+1, y + h/2, w2*nm/max, h/2 - 1, col[1])
    obj.draw_text(x, y + h - 22, w, 32, nm.to_s, 2)
    obj.draw_text(x + 4, y + h - 22, w, 32, tag)
    obj.draw_text(x, y - 25, w, 32, name, 1) if !name.nil?
  end
 
  # image based bars definition
  def self.image_hp(bitmap, x, y, back, image, battler, name=nil)
    tag = 'VD'
    name = battler.name if !name.nil?
    draw_i_gauge(bitmap, x, y, back, image, battler.hp, battler.mhp, tag, name)
  end
 
  def self.image_mp(bitmap, x, y, back, image, battler, name=nil)
    tag = 'EN'
    name = battler.name if !name.nil?
    draw_i_gauge(bitmap, x, y, back, image, battler.mp, battler.mmp, tag, name)
  end
 
  def self.image_exp(bitmap, x, y, back, image, battler, name=nil)
    tag = 'Exp'
    name = battler.name if !name.nil?
    exp, nexte = battler.exp, battler.next_level_exp
    draw_i_gauge(bitmap, x, y, back, image, exp, nexte, tag, name)
  end
 
  def self.draw_i_gauge(bitmap, x, y, back, image, nm, max, tag, name)
    cw = back.width 
    ch = back.height
    max = 1 if max == 0
    src_rect = Rect.new(0, 0, cw, ch)   
    bitmap.blt(x - 10, y - ch + 30,  back, src_rect)
    cw = image.width  * nm / max
    ch = image.height
    src_rect = Rect.new(0, 0, cw, ch)
    bitmap.blt(x - 10, y - ch + 30, image, src_rect)
    bitmap.draw_text(x - 4, y + back.height - 14, back.width, 32, tag)
    bitmap.draw_text(x - 12, y + back.height - 14, back.width, 32, nm.to_s, 2)
    bitmap.draw_text(x - 6, y - 10, back.width, 32, name, 1) if !name.nil?
  end
 
  def self.has_data?
    !user_graphic.nil?
  end
 
  def self.load_item(item)
    @item = item
  end
 
  def self.user_graphic()      @item.tool_data("User Graphic = ", false)    end
  def self.user_animespeed()   @item.tool_data("User Anime Speed = ")       end
  def self.tool_cooldown()     @item.tool_data("Tool Cooldown = ")          end
  def self.tool_graphic()      @item.tool_data("Tool Graphic = ", false)    end
  def self.tool_index()        @item.tool_data("Tool Index = ")             end
  def self.tool_size()         @item.tool_data("Tool Size = ")              end
  def self.tool_distance()     @item.tool_data("Tool Distance = ")          end
  def self.tool_effectdelay()  @item.tool_data("Tool Effect Delay = ")      end
  def self.tool_destroydelay() @item.tool_data("Tool Destroy Delay = ")     end
  def self.tool_speed()         @item.tool_float("Tool Speed = ")            end
  def self.tool_castime()       @item.tool_data("Tool Cast Time = ")         end
  def self.tool_castanimation() @item.tool_data("Tool Cast Animation = ")    end
  def self.tool_blowpower()     @item.tool_data("Tool Blow Power = ")        end
  def self.tool_piercing()      @item.tool_data("Tool Piercing = ", false)   end
  def self.tool_animation() @item.tool_data("Tool Animation When = ", false) end
  def self.tool_anirepeat() @item.tool_data("Tool Animation Repeat = ",false)end
  def self.tool_special() @item.tool_data("Tool Special = ", false)          end
  def self.tool_target() @item.tool_data("Tool Target = ", false)            end
  def self.tool_invoke() @item.tool_data("Tool Invoke Skill = ")             end
  def self.tool_guardrate() @item.tool_data("Tool Guard Rate = ")            end
  def self.tool_knockdown() @item.tool_data("Tool Knockdown Rate = ")        end
  def self.tool_soundse() @item.tool_data("Tool Sound Se = ", false)         end
  def self.tool_itemcost() @item.tool_data("Tool Item Cost = ")              end
  def self.tool_shortjump() @item.tool_data("Tool Short Jump = ", false)     end
  def self.tool_through() @item.tool_data("Tool Through = ", false)          end
  def self.tool_priority() @item.tool_data("Tool Priority = ")               end
  def self.tool_selfdamage() @item.tool_data("Tool Self Damage = ", false)   end
  def self.tool_hitshake() @item.tool_data("Tool Hit Shake = ", false)       end
  def self.tool_combo() @item.tool_data("Tool Combo Tool = ", false)         end
 
  def self.knock_actor(actor)
    a = actor.actor.tool_data("Knockdown Graphic = ", false)
    b = actor.actor.tool_data("Knockdown Index = ")
    c = actor.actor.tool_data("Knockdown pattern = ")
    d = actor.actor.tool_data("Knockdown Direction = ")
    return nil if a.nil?
    return [a, b, c, d]
  end
 
  def self.jump_hit?(target)
    t = target.enemy.tool_data("Hit Jump = ", false) if target.is_a?(Game_Enemy)
    t = target.actor.tool_data("Hit Jump = ", false) if target.is_a?(Game_Actor)
    return true if !t.nil? and t == "true"
    return true if t.nil?
    return false
  end
 
  def self.voices(b)
    voices = b.actor.tool_data("Battler Voices = ",false) if b.is_a?(Game_Actor)
    voices = b.enemy.tool_data("Battler Voices = ",false) if b.is_a?(Game_Enemy)
    voices = voices.split(", ") unless voices.nil?
    voices
  end
 
  def self.hitvoices(b)
    voices = b.actor.tool_data("Hit Voices = ",false) if b.is_a?(Game_Actor)
    voices = b.enemy.tool_data("Hit Voices = ",false) if b.is_a?(Game_Enemy)
    voices = voices.split(", ") unless voices.nil?
    voices
  end
 
  # check for iconset
  def self.check_iconset(item, tag, object)
    data = item.tool_data(tag, false)
    return if data.nil?
    v = [item.icon_index, data.to_sym] if data == "animated" ||
    data == "static" || data == "shielding"
    object.is_a?(Projectile) ? object.pro_iconset = v : object.user_iconset = v
  end
 
  def self.clean_back?
    @clean_back == true
  end
end

($imported ||= {})["Falcao Pearl ABS Liquid"] = true

class RPG::BaseItem
  attr_reader :has_data
  def tool_data(comment, sw=true)
    if @note =~ /#{comment}(.*)/i
      @has_data = true
      return sw ? $1.to_i : $1.to_s.sub("\r","")
    end
  end
 
  def tool_float(comment)
    return  $1.to_f if @note =~ /#{comment}(.*)/i
  end
 
  def cool_enabled?
    @cd_dis = @note.include?("Tool Cooldown Display = true") if @cd_dis.nil?
    @cd_dis
  end
 
  def itemcost
    if @i_cost.nil?
      @note =~ /Tool Item Cost = (.*)/i ? @i_cost = $1.to_i : @i_cost = 0
    end
    @i_cost
  end
end

# Pearl ABS Input module
module PearlKey

  # numbers
  N0 = 0x30; N1 = 0x31; N2 = 0x32; N3 = 0x33; N4 = 0x34
  N5 = 0x35; N6 = 0x36; N7 = 0x37; N8 = 0x38; N9 = 0x39
 
  # keys
  A = 0x41; B = 0x42; C = 0x43; D = 0x44; E = 0x45
  F = 0x46; G = 0x47; H = 0x48; I = 0x49; J = 0x4A
  K = 0x4B; L = 0x4C; M = 0x4D; N = 0x4E; O = 0x4F
  P = 0x50; Q = 0x51; R = 0x52; S = 0x53; T = 0x54
  U = 0x55; V = 0x56; W = 0x57; X = 0x58; Y = 0x59; Z = 0x5A

  @unpack_string = 'b'*256
  @last_array = '0'*256
  @press = Array.new(256, false)
  @trigger = Array.new(256, false)
  @release = Array.new(256, false)
  @getKeyboardState = Win32API.new('user32', 'GetKeyboardState', ['P'], 'V')
  @getAsyncKeyState = Win32API.new('user32', 'GetAsyncKeyState', 'i', 'i')
  @getKeyboardState.call(@last_array)
 
  @last_array = @last_array.unpack(@unpack_string)
  for i in 0...@last_array.size
    @press = @getAsyncKeyState.call(i) == 0 ? false : true
  end

  def self.update
    @trigger = Array.new(256, false)
    @release = Array.new(256, false)
    array = '0'*256
    @getKeyboardState.call(array)
    array = array.unpack(@unpack_string)
    for i in 0...array.size
      if array != @last_array
        @press = @getAsyncKeyState.call(i) == 0 ? false : true
        if !@press
          @release = true
        else
          @trigger = true
        end
      else
        if @press == true
          @press = @getAsyncKeyState.call(i) == 0 ? false : true
          @release = true if !@press
        end
      end
    end
    @last_array = array
  end
 
  def self.press?(key)
    return @press[key]
  end

  def self.trigger?(key)
    return @trigger[key]
  end
end

# Input module update engine
class << Input
  alias falcaopearl_abs_cooldown_update update
  def Input.update
    update_pearl_abs_cooldown
    update_popwindow if !$game_temp.nil? and !$game_temp.pop_windowdata.nil?
    update_pearl_abs_respawn
    falcaopearl_abs_cooldown_update
  end
 
 
  def update_pearl_abs_respawn
    $game_map.event_enemies.each do |event|
      if event.respawn_count > 0
        event.respawn_count -= 1
        if event.respawn_count == 0
          event.battler.remove_state(event.battler.death_state_id)
          event.battler.hp = event.battler.mhp
          event.battler.mp = event.battler.mmp
          event.apply_respawn
          event.animation_id = event.respawn_anim
        end
      end
    end
  end
 
  alias falcaopearl_trigger trigger?
  def trigger?(constant)
    return true if constant == :B and PearlKey.trigger?(PearlKey::B)
    falcaopearl_trigger(constant)
  end
 
  # pop window global
  def update_popwindow
    $game_temp.pop_windowdata[0] -= 1 if $game_temp.pop_windowdata[0] > 0
    if @temp_window.nil?
      tag = $game_temp.pop_windowdata[2]
      string = $game_temp.pop_windowdata[1] + tag
      width = (string.length * 9) - 10
      x, y = Graphics.width / 2 - width / 2,  Graphics.height / 2 - 64 / 2
      @temp_window = Window_Base.new(x, y, width, 64)
      @temp_window.contents.font.size = 20
      @temp_window.draw_text(-10, -6, width, 32, tag, 1)
      @temp_window.draw_text(-10, 14, width, 32, $game_temp.pop_windowdata[1],1)
      @current_scene = SceneManager.scene.class
    end
   
    if $game_temp.pop_windowdata[0] == 0 ||
      @current_scene != SceneManager.scene.class
      @temp_window.dispose
      @temp_window = nil
      $game_temp.pop_windowdata = nil
    end
  end
 
  def update_pearl_abs_cooldown
    PearlKey.update
    eval_cooldown($game_party.all_members) if !$game_party.nil?
    eval_cooldown($game_map.enemies) if !$game_map.nil?
  end
 
  # cooldown update
  def eval_cooldown(operand)
    for sub in operand
      sub.skill_cooldown.each {|sid, sv| # skill
      if sub.skill_cooldown[sid] > 0
        sub.skill_cooldown[sid] -= 1
        sub.skill_cooldown.delete(sid) if sub.skill_cooldown[sid] == 0
      end}
      sub.item_cooldown.each {|iid, iv| # item
      if sub.item_cooldown[iid] > 0
        sub.item_cooldown[iid] -= 1
        sub.item_cooldown.delete(iid) if sub.item_cooldown[iid] == 0
      end}
      sub.weapon_cooldown.each {|wid, wv| # weapon
      if sub.weapon_cooldown[wid] > 0
        sub.weapon_cooldown[wid] -= 1
        sub.weapon_cooldown.delete(wid) if sub.weapon_cooldown[wid] == 0
      end}
      sub.armor_cooldown.each {|aid, av| #armor
      if sub.armor_cooldown[aid] > 0
        sub.armor_cooldown[aid] -= 1
        sub.armor_cooldown.delete(aid) if sub.armor_cooldown[aid] == 0
      end}
    end
  end
end

#===============================================================================
#===============================================================================
# Game character

class Game_CharacterBase
  attr_accessor :just_hitted, :anime_speed, :blowpower, :targeting, :x, :y
  attr_accessor :battler_guarding, :knockdown_data, :colapse_time, :opacity
  attr_accessor :zoomfx_x, :zoomfx_y, :targeted_character, :stuck_timer
  attr_accessor :send_dispose_signal, :follower_attacktimer, :stopped_movement
  attr_accessor :hookshoting, :battler_chain, :pattern, :user_move_distance
  attr_accessor :move_speed, :through, :being_grabbed, :making_spiral
  attr_accessor :direction, :direction_fix, :zfx_bol, :buff_pop_stack
  attr_accessor :die_through, :target_index, :using_custom_g, :combodata
  attr_accessor :originalasp, :doingcombo, :angle_fx
  attr_accessor :user_iconset, :pro_iconset, :respawn_count
  alias falcaopearl_abmain_ini initialize
  def initialize
    @zfx_bol = false
    @just_hitted = 0
    @anime_speed = 0
    @respawn_count = 0
    @blowpower = [0, dir=2, dirfix=false, s=4, wait_reset=0]
    @user_casting = [0, nil]
    @send_dispose_signal = false
    @targeting = [false, item=nil, char=nil]
    @colapse_time = 0
    @stopped_movement = 0
    @follower_attacktimer = 0
    set_hook_variables
    @target_index = 0
    @using_custom_g = false
    @combodata = []
    @angle_fx = 0.0
    #--------------
    @zoomfx_x = 1.0
    @zoomfx_y = 1.0
    @stuck_timer = 0
    @battler_guarding = [false, nil]
    @knockdown_data = [0, nil, nil, nil, nil]
    @state_poptimer = [0, 0]
    @making_spiral = false
    @buff_pop_stack = []
    @doingcombo = 0
    @range_view = 2
    @originalasp = 0
    falcaopearl_abmain_ini
  end
 
  def set_hook_variables
    @hookshoting = [on=false, hooking=false, grabing=false, delay=0]
    @battler_chain = []
    @user_move_distance = [steps=0, speed=nil, trought=nil, cor=nil, evmove=nil]
    @being_grabbed = false
  end

  # projectiles at nt
  def projectiles_xy_nt(x, y)
    $game_player.projectiles.select {|pro| pro.pos_nt?(x, y) }
  end
 
  # collide with projectiles
  def collide_with_projectiles?(x, y)
    projectiles_xy_nt(x, y).any? do |pro|
      pro.normal_priority? || self.is_a?(Projectile)
    end
  end
 
  def zoom(x, y)
    @zoomfx_x = x
    @zoomfx_y = y
  end
 
  alias falcaopearl_collide_with collide_with_characters?
  def collide_with_characters?(x, y)
    return true if collide_with_projectiles?(x, y)
    falcaopearl_collide_with(x, y)
  end
 
  # follow character straigh and diagonal
  def follow_char(character)
    sx = distance_x_from(character.x)
    sy = distance_y_from(character.y)
    if sx != 0 && sy != 0
      move_diagonal(sx > 0 ? 4 : 6, sy > 0 ? 8 : 2)
    elsif sx != 0
      move_straight(sx > 0 ? 4 : 6)
    elsif sy != 0
      move_straight(sy > 0 ? 8 : 2)
    end
  end
 
  def on_battle_screen?(out = 0)
    max_w = (Graphics.width / 32).to_i - 1
    max_h = (Graphics.height / 32).to_i - 1
    sx = (screen_x / 32).to_i
    sy = (screen_y / 32).to_i
    if sx.between?(0 - out, max_w + out) and sy.between?(0 - out, max_h + out)
      return true
    end
    return false
  end
 
   # jump to specific tiles
  def jumpto_tile(x, y)
    jumpto(0, [x, y])
  end
 
  # jumpto character ( 0 = Game Player, 1 and up event id)
  def jumpto(char_id, tilexy=nil)
    char_id > 0 ? char = $game_map.events[char_id] : char = $game_player
    tilexy.nil? ? condxy = [char.x, char.y] : condxy = [tilexy[0], tilexy[1]]
    jx = + eval_distance(tilexy.nil? ? char : tilexy)[0] if condxy[0] >= @x
    jy = - eval_distance(tilexy.nil? ? char : tilexy)[1] if condxy[1] <= @y
    jx = - eval_distance(tilexy.nil? ? char : tilexy)[0] if condxy[0] <= @x
    jy = - eval_distance(tilexy.nil? ? char : tilexy)[1] if condxy[1] <= @y
    jx = - eval_distance(tilexy.nil? ? char : tilexy)[0] if condxy[0] <= @x
    jy = + eval_distance(tilexy.nil? ? char : tilexy)[1] if condxy[1] >= @y
    jx = + eval_distance(tilexy.nil? ? char : tilexy)[0] if condxy[0] >= @x
    jy = + eval_distance(tilexy.nil? ? char : tilexy)[1] if condxy[1] >= @y
    jump(jx, jy)
  end
 
  # distance
  def eval_distance(target)
    if target.is_a?(Array)
      distance_x = (@x - target[0]).abs
      distance_y = (@y - target[1]).abs
    else
      distance_x = (@x - target.x).abs
      distance_y = (@y - target.y).abs
    end
    return [distance_x, distance_y]
  end
 
  # check if the game player and follower are executing an action
  def battler_acting?
    return true if @user_casting[0] > 0 || @targeting[0]
    return true if @knockdown_data[0] > 0 and battler.deadposing.nil?
    return true if @anime_speed > 0
    return true if @hookshoting[0] || @making_spiral
    if self.is_a?(Game_Player)
      $game_player.followers.each {|f| return true if f.battler_acting?}
    end
    return false
  end

  def battler
  end
 
  #use single tools
  def use_weapon(id)
    return unless tool_can_use?
    process_tool_action($data_weapons[id])
  end
 
  def use_item(id)
    return unless tool_can_use?
    process_tool_action($data_items[id])
  end
 
  def use_skill(id)
    return unless tool_can_use?
    process_tool_action($data_skills[id])
  end
 
  def use_armor(id)
    return unless tool_can_use?
    process_tool_action($data_armors[id])
  end
 
  # use multiple tools
  def rand_weapon(*args)
    return unless tool_can_use?
    process_tool_action($data_weapons[args[rand(args.size)]])
  end
 
  def rand_item(*args)
    return unless tool_can_use?
    process_tool_action($data_items[args[rand(args.size)]])
  end
 
  def rand_skill(*args)
    return unless tool_can_use?
    process_tool_action($data_skills[args[rand(args.size)]])
  end
 
  def rand_armor(*args)
    return unless tool_can_use?
    process_tool_action($data_armors[args[rand(args.size)]])
  end
 
  def tool_can_use?
    return false if @hookshoting[0] || @making_spiral
    return false if @user_casting[0] > 0 || @targeting[0]
    return false if battler.nil?
    return false if battler.dead?
    return false if @doingcombo > 0 || @battler_guarding[0]
    return false if $game_message.busy?
    return true
  end
 
  def load_target_selection(item)
    @targeting[0] = true; @targeting[1] = item
    if self.is_a?(Game_Player)
      $game_player.pearl_menu_call = [:battler, 2]
    elsif self.is_a?(Game_Follower)
      @targeting[2] = @targeted_character
      @targeting = [false, item=nil, char=nil] if @targeting[2].nil?
    elsif self.is_a?(Projectile)
      if user.is_a?(Game_Player)
        user.targeting[0] = true; user.targeting[1] = item
        $game_player.pearl_menu_call = [:battler, 2]
      end
      if user.is_a?(Game_Follower)
        @targeting[2] = user.targeted_character
        @targeting = [false, item=nil, char=nil] if @targeting[2].nil?
      end
    end
  end
 
  def playdead
    @angle_fx = 90
  end
 
  def resetplaydead
    @angle_fx = 0.0
  end

  #action canceling
  def force_cancel_actions
    @user_casting[0] = 0
    @anime_speed = 0
  end
 
  def speed(x)
    @move_speed = x
  end
 
  def anima(x)
    @animation_id = x
  end
 
  # aply melee params
  def apply_weapon_param(weapon, add)
    id = 0
    for param in weapon.params
      add ? battler.add_param(id, param) : battler.add_param(id, -param)
      id += 1
    end
  end
 
  # Short script call for poping damage text
  def pop_damage(custom=nil)
    $game_player.damage_pop.push(DamagePop_Obj.new(self, custom))
  end
 
  #check if target is unable to move
  def force_stopped?
    return true if @anime_speed > 0 || @knockdown_data[0] > 0 ||
    @stopped_movement > 0 || @hookshoting[0] || @angle_fx != 0.0
    return true if @making_spiral
    return false
  end
 
  # sensor
  def obj_size?(target, size)
    return false if size.nil?
    distance = (@x - target.x).abs + (@y - target.y).abs
    enable   = (distance <= size-1)
    return true if enable
    return false
  end
 
  # sensor body
  def body_size?(target, size)
    distance = (@x - target[0]).abs + (@y - target[1]).abs
    enable   = (distance <= size-1)
    return true if enable
    return false
  end
 
  def faceto_face?(target)
    return true if @direction == 2 and target.direction == 8
    return true if @direction == 4 and target.direction == 6
    return true if @direction == 6 and target.direction == 4
    return true if @direction == 8 and target.direction == 2
    return false
  end
 
  def adjustcxy
    push_x, push_y =   0,   1 if @direction == 2
    push_x, push_y = - 1,   0 if @direction == 4
    push_x, push_y =   1,   0 if @direction == 6
    push_x, push_y =   0, - 1 if @direction == 8
    return [push_x, push_y]
  end
 
  def in_frontof?(target)
    return true if @direction == 2 and @x == target.x and (@y+1) == target.y
    return true if @direction == 4 and (@x-1) == target.x and @y == target.y
    return true if @direction == 6 and (@x+1) == target.x and @y == target.y
    return true if @direction == 8 and @x == target.x and (@y-1) == target.y
    return false
  end
 
  # detect map edges ignoring loop maps
  def facing_corners?
    case $game_map.map.scroll_type
    when 1 then return false if @direction == 2 || @direction == 8
    when 2 then return false if @direction == 4 || @direction == 6
    when 3 then return false
    end
    m = $game_map
    unless @x.between?(1, m.width - 2) && @y.between?(1, m.height - 2)
      return true if @x == 0 and @direction == 4
      return true if @y == 0 and @direction == 8
      return true if @x == m.width  - 1  and @direction == 6
      return true if @y == m.height - 1  and @direction == 2
    end
    return false
  end
 
  # item usable test
  def usable_test_passed?(item)
    return true if battler.is_a?(Game_Enemy) && item.is_a?(RPG::Item)
    itemcost = item.tool_data("Tool Item Cost = ")
    invoke = item.tool_data("Tool Invoke Skill = ")
    if battler.is_a?(Game_Actor) and itemcost != nil and itemcost != 0
      return false if !battler.usable?($data_items[itemcost])
    end
    if item.is_a?(RPG::Skill) || item.is_a?(RPG::Item)
      return false if !battler.usable?(item)
    else
      if invoke != nil and invoke != 0
        return false if !battler.usable?($data_skills[invoke])
      else
        return false if !battler.attack_usable?
      end
    end
    return true
  end
 
  # process the tool and verify wheter can be used
  def process_tool_action(item)
    PearlKernel.load_item(item)
    return if !battler.tool_ready?(item)
 
    unless PearlKernel.has_data?
      if item.is_a?(RPG::Weapon) || item.is_a?(RPG::Armor)
        msgbox('Tool data missing') if $DEBUG
        return
      end
      if item.scope.between?(1, 6)
        msgbox('Tool data missing') if $DEBUG
        return
      elsif item.scope == 0
        return
       
      elsif !battler.usable?(item)
        RPG::SE.new("Cursor1", 80).play if self.is_a?(Game_Player)
        return
      end
    end
   
    if PearlKernel.has_data? and not usable_test_passed?(item)
      RPG::SE.new("Cursor1", 80).play if self.is_a?(Game_Player)
      return
    end
   
    @user_casting = [PearlKernel.tool_castime,item] if PearlKernel.has_data?
    if @user_casting[0] > 0
      @animation_id = 0
      @animation_id = PearlKernel.tool_castanimation
    else
      load_abs_tool(item)
    end
  end
 
  # load the abs tool
  def load_abs_tool(item)
    return if @knockdown_data[0] > 0
    PearlKernel.load_item(item)
 
    return if self.is_a?(Game_Follower) and @targeted_character.nil?
   
    if !@targeting[0] and  self.battler.is_a?(Game_Actor)
      if item.is_a?(RPG::Skill) || item.is_a?(RPG::Item)
        # apply target to skills items
        if PearlKernel.tool_target == "true" || item.scope == 7 ||
          item.scope == 9
          load_target_selection(item)
          return
        end
      else
        # apply target parsing the invoked skill to weapons and armors
        invoke = PearlKernel.tool_invoke
        if invoke != nil && invoke > 0 && invoke != 1 && invoke != 2
          invokeskill = $data_skills[invoke]
          if PearlKernel.tool_target == "true" || invokeskill.scope == 7 ||
            invokeskill.scope == 9
            load_target_selection(item)
            return
          end
          # apply target to normal weapon and armor without invoking
        else
          if PearlKernel.tool_target == "true"
            load_target_selection(item)
            return
          end
        end
      end
    end
    if item.is_a?(RPG::Skill) || item.is_a?(RPG::Item)
      battler.use_item(item)
    else
      if PearlKernel.tool_invoke != 0
        battler.use_item($data_skills[PearlKernel.tool_invoke])
      end
    end
   
    # if the tool has data continue
    if PearlKernel.has_data?
      consume_ammo_item(item) if battler.is_a?(Game_Actor) and
      PearlKernel.tool_itemcost != 0
      @anime_speed = PearlKernel.user_animespeed
      battler.apply_cooldown(item, PearlKernel.tool_cooldown)
    end
    create_projectile_object(item)
    create_anime_sprite_object(item)
  end
 
  # projectile creator
  def create_projectile_object(item)
    if PearlKernel.tool_special == "hook"
      PearlKernel.tool_distance.times {|i|
      $game_player.projectiles.push(Projectile.new(self, item, i))}
      @hookshoting[0] = true
    elsif PearlKernel.tool_special == "triple"       # loads 3 projectiles
      for i in [:uno, :dos, :tres]
        $game_player.projectiles.push(Projectile.new(self, item, i))
      end
    elsif PearlKernel.tool_special == "quintuple"     #loads 5 projectiles
      for i in [:uno, :dos, :tres, :cuatro, :cinco]
        $game_player.projectiles.push(Projectile.new(self, item, i))
      end
    elsif PearlKernel.tool_special == "octuple"       # loads 8 projectiles
      for i in [:uno, :dos, :tres, :cuatro, :cinco, :seis, :siete, :ocho]
        $game_player.projectiles.push(Projectile.new(self, item, i))
      end
    else # load default projectile
      $game_player.projectiles.push(Projectile.new(self, item))
    end
  end
 
  # User anime sprite creation
  def create_anime_sprite_object(item)
    $game_player.anime_action.each {|i|
    if i.user == self
      if i.custom_graphic
        @transparent = false
        i.user.using_custom_g = false
      end
      $game_player.anime_action.delete(i)
    end}
   
    if PearlKernel.user_graphic != "nil"
      return if PearlKernel.user_graphic.nil?
      $game_player.anime_action.push(Anime_Obj.new(self, item))
    end
   
    # using iconset graphic
    if PearlKernel.user_graphic == "nil" and
      !item.tool_data("User Iconset = ", false).nil?
      return if PearlKernel.user_graphic.nil?
      $game_player.anime_action.push(Anime_Obj.new(self, item))
    end
  end
 
  # consume ammo item
  def consume_ammo_item(item)
    itemcost = $data_items[PearlKernel.tool_itemcost]
    return if item.is_a?(RPG::Item) and item.consumable and item == itemcost
    battler.use_item(itemcost)
  end
 
  alias falcaopearl_chaupdate update
  def update
    update_falcao_pearl_abs
    falcaopearl_chaupdate
  end
 
  # Falcao pearl abs main update
  def update_falcao_pearl_abs
    if @user_move_distance[0] > 0 and not moving?
      move_forward ; @user_move_distance[0] -= 1
    end
    return if battler.nil?
    update_pearlabs_timing
    update_followers_attack if self.is_a?(Game_Follower) && self.visible?
    if @targeting[2] != nil
      load_abs_tool(@targeting[1]) if battler.is_a?(Game_Actor)
      @targeting = [false, item=nil, char=nil]
    end
    update_battler_collapse
    update_state_effects
   
    @combodata.each {|combo|
    if combo[3] > 0
      combo[3] -= 1
      if combo[3] == 0
        perform_combo(combo[0], combo[1], combo[2])
        @combodata.delete(combo)
      end
      break
    end}
  end

  def perform_combo(kind, id, jumpp)
    if jumpp == 'jump'
      jump(0, 0)
      move_forward
    end
    case kind
    when :weapon then use_weapon(id)
    when :armor  then use_armor(id)
    when :item   then use_item(id)
    when :skill  then use_skill(id)
    end
    @doingcombo = 12
  end
 
  #========================================================================
  #     * followers attacks engine
 
  def fo_tool
    return actor.equips[0]       if actor.primary_use == 1
    return actor.equips[1]       if actor.primary_use == 2
    return actor.assigned_item   if actor.primary_use == 3
    return actor.assigned_item2  if actor.primary_use == 4
    return actor.assigned_skill  if actor.primary_use == 5
    return actor.assigned_skill2 if actor.primary_use == 6
    return actor.assigned_skill3 if actor.primary_use == 7
    return actor.assigned_skill4 if actor.primary_use == 8
  end
 
  # followers attack engine
  def update_followers_attack
    if fo_tool.nil? || battler.dead?
      @targeted_character = nil if @targeted_character != nil
      return
    end
    return if @stopped_movement > 0
    if @follower_attacktimer > 0
      @follower_attacktimer -= 1
      if @follower_attacktimer == 40 and !moving?
        r = rand(3)
        move_random if r == 0 || r == 1
        move_away_from_character(@targeted_character) if
        !@targeted_character.nil? and r == 2
      end
    end
   
     # si la skill es para el player
    if @targeted_character != nil and @targeted_character.is_a?(Game_Player)
      if all_enemies_dead?
        delete_targetf
        return
      end
      use_predefined_tool
      return
    end
   
    # si la skill es para un enemigo continuar
    if @targeted_character != nil
      use_predefined_tool
      return if @targeted_character.nil?
      # reset if the target is dead
      if @targeted_character.collapsing?
        force_cancel_actions
        delete_targetf
      end
    else
      # select a follower slected target
      $game_player.followers.each do |follower|
        if !follower.targeted_character.nil?
          next if follower.targeted_character.is_a?(Game_Player)
          if follower.stuck_timer >= 10
            follower.targeted_character = nil
            return
          end
          @targeted_character = follower.targeted_character
          break
        end
      end
    end
  end
 
  # prepare the tool usage
  def setup_followertool_usage
    @range_view = 2
    @range_view = 6 if fo_tool.tool_data("Tool Target = ", false) == "true" ||
    fo_tool.tool_data("Tool Special = ", false) == "autotarget"
   
    if fo_tool.is_a?(RPG::Skill) || fo_tool.is_a?(RPG::Item)
      if fo_tool.scope.between?(1, 6)
        setup_target
      else ; @targeted_character = $game_player
        @range_view = 6
      end
      # prepare tool for invoke follower
    elsif fo_tool.is_a?(RPG::Weapon) || fo_tool.is_a?(RPG::Armor)
      invoke = fo_tool.tool_data("Tool Invoke Skill = ")
      if invoke > 0
        if $data_skills[invoke].scope.between?(1, 6)
          setup_target
        else ; @targeted_character = $game_player
          @range_view = 6
        end
      else
        # no invoke skill just set up an enemy target
        setup_target
      end
    end
  end
 
  # use the predifined tool
  def use_predefined_tool
    update_follower_movement
    return if @targeted_character.nil?
    if obj_size?(@targeted_character, @range_view) && @follower_attacktimer == 0
      turn_toward_character(@targeted_character)
      use_weapon(fo_tool.id) if actor.primary_use == 1
      use_armor(fo_tool.id)  if actor.primary_use == 2
      use_item(fo_tool.id)   if actor.primary_use == 3 || actor.primary_use == 4
      use_skill(fo_tool.id)  if actor.primary_use==5 || actor.primary_use==6 ||
      actor.primary_use == 7 || actor.primary_use == 8
      if fo_tool.tool_data("User Graphic = ", false).nil?
        @targeted_character = nil
        turn_toward_player
      end
      @follower_attacktimer = 60
    end
    delete_targetf if self.actor.dead?
  end
 
  def all_enemies_dead?
    for event in $game_map.event_enemies
      if event.on_battle_screen? && event.enemy_ready?
        return false if $game_player.obj_size?(event,PearlKernel::PlayerRange+1)
      end
    end
    return true
  end
 
  def delete_targetf
    @targeted_character = nil
  end
 
  #------------------------
  # follower movement attack
  def reset_targeting_settings(target)
    target.being_targeted = false if target.is_a?(Game_Event)
    delete_targetf
    turn_toward_player
    @stuck_timer = 0
  end
 
  def update_follower_movement
    target = @targeted_character
    if @stuck_timer >= 30
      reset_targeting_settings(target)
      return
    end
   
    # if the follower is unabble to use the tool
    unless usable_test_passed?(fo_tool)
      if SceneManager.scene_is?(Scene_Map)
        reset_targeting_settings(target)
        @balloon_id = PearlKernel::FailBalloon
        return
      end
    end
   
    return if target.nil?
    @stuck_timer += 1 if !obj_size?(target, @range_view) and !moving?
 
    if moving? || @anime_speed > 0 || @making_spiral || @hookshoting[0] ||
      @knockdown_data[0] > 0
      @stuck_timer = 0
    end
    return if moving?
    if fo_tool.tool_data("Tool Target = ", false) == "true" ||
      fo_tool.tool_data("Tool Special = ", false) == "autotarget" ||
      target.is_a?(Game_Player)
      # using skill con target true magical
      cpu_reactiontype(1, target)
      return
      # target not exist
    else
   
      if fo_tool.is_a?(RPG::Skill) || fo_tool.is_a?(RPG::Item)
        fo_tool.scope.between?(1, 6) ? cpu_reactiontype(2, target) : # to enemy
        cpu_reactiontype(1, target) # benefical
      else
        # for weapon armor without target
        cpu_reactiontype(2, target)
      end
    end
    return if !obj_size?(target, @range_view)
    return if target.is_a?(Game_Player)
    case rand(40)
    when 4  then move_backward
    when 10 then move_random
    end
  end
 
  # cpu reaction
  def cpu_reactiontype(type, target)
    unless on_battle_screen?
      3.times.each {|i|  move_toward_player}
      return
    end
    move_toward_character(target) if !obj_size?(target, @range_view) if type==1
    if @follower_attacktimer == 0 || !obj_size?(target, @range_view)
      move_toward_character(target) if type == 2
    end
  end
  #-------------------------------------------------
 
  # buff timer
  def update_buff_timing
    battler.buff_turns.each do |id, value|
      if battler.buff_turns[id] > 0
        battler.buff_turns[id] -= 1
        if battler.buff_turns[id] <= 0
          battler.remove_buff(id)
          pop_damage
        end
      end
    end
  end
 
  #blow power effect
  def update_blow_power_effect
    if @blowpower[4] > 0
      @blowpower[4] -= 1
      if @blowpower[4] == 0
        @direction_fix = @blowpower[2]
        @move_speed = @blowpower[3]
      end
    end
    if @blowpower[0] > 0 and !moving?
      @move_speed = 5.5
      @direction_fix = true
      move_straight(@blowpower[1]); @blowpower[0] -= 1
      if @blowpower[0] == 0
        @blowpower[4] = 10
      end
    end
  end
 
  # Pearl timing
  def update_pearlabs_timing
    @just_hitted -= 1 if @just_hitted > 0
    @stopped_movement -= 1 if @stopped_movement > 0
    @doingcombo -= 1 if @doingcombo > 0
   
    # hookshooting
    if @hookshoting[3] > 0
      @hookshoting[3] -= 1
      if @hookshoting[3] == 0
        @hookshoting = [false, false, false, 0]
        @user_move_distance[3].being_grabbed = false if
        @user_move_distance[3].is_a?(Game_Event)
        @user_move_distance[3] = nil
      end
    end
    update_buff_timing
    update_blow_power_effect
    # anime
    if @anime_speed > 0
      @pattern = 0
      @anime_speed -= 1
    end
    # casting
    if @user_casting[0] > 0
      @user_casting[0] -= 1
      load_abs_tool(@user_casting[1]) if @user_casting[0] == 0
    end
    update_knockdown
  end
 
  # Update battler collapse
 
  def check_for_dead_four
    return if $game_party.members.size <= 4
    SceneManager.goto(Scene_Gameover) if all_fourdead?
  end

  def all_fourdead?
    m = $game_party.battle_members
    return true if m[0].dead? && m[1].dead? && m[2].dead? && m[3].dead?
    return false
  end
 
  def update_battler_collapse
    if @colapse_time > 0
      @colapse_time -= 1
      force_cancel_actions
      if battler.is_a?(Game_Actor)
        Sound.play_actor_collapse if @secollapse.nil?
        @secollapse = true
       
        if @colapse_time == 0
          @secollapse = nil
          for event in $game_map.event_enemies
            if event.agroto_f == self
              event.agroto_f = nil
            end
          end
         
          check_for_dead_four
          member = $game_party.battle_members
          # swap and reset player
          if self.is_a?(Game_Player)
            reset_knockdown_actors
            battler.deadposing=$game_map.map_id if PearlKernel::FollowerDeadPose
            $game_party.swap_order(0,3) if !member[3].nil? and !member[3].dead?
            $game_party.swap_order(0,2) if !member[2].nil? and !member[2].dead?
            $game_party.swap_order(0,1) if !member[1].nil? and !member[1].dead?
          else
            if PearlKernel::FollowerDeadPose
              battler.deadposing = $game_map.map_id
              if !$game_player.follower_fighting? and member.size > 2
                swap_dead_follower
              else
                $game_player.reserved_swap << battler.id if member.size > 2
              end
            end
          end
        end
       
      elsif battler.is_a?(Game_Enemy)
        @die_through = @through if @die_through.nil?
        @through = true
        apply_collapse_anime(battler.collapse_type)
        @secollapse = true
        battler.object ? @transparent = true : @opacity -= 2 if !@deadposee
        if @colapse_time == 0
          self.kill_enemy
        end
      end
    end
  end
 
  def swap_dead_follower
    reset_knockdown_actors
    member = $game_party.battle_members
    member.each_with_index.each do |actorr, i|
      next unless actorr.id == self.actor.id
      case member.size
      when 3
        break if i == 2
        $game_party.swap_order(i, 2)
      when 4
        break if i == 3
        if !member[3].dead?
          $game_party.swap_order(i, 3)
          break
        end
        if !member[2].dead? 
          $game_party.swap_order(i, 2)
          break
        end
      end
    end
  end

  def apply_collapse_anime(type)
    # sound and animation
    if battler.die_animation != nil
      @animation_id = battler.die_animation if @secollapse.nil?
    else
      Sound.play_enemy_collapse if @secollapse.nil? and !battler.object
    end
    return if battler.object
    if @deadposee
      @knockdown_data[0] = 8
      return
    end
    type = PearlKernel::DefaultCollapse if type.nil?
    case type.to_sym
    when :zoom_vertical
      @zoomfx_x -= 0.03
      @zoomfx_y += 0.02
    when :zoom_horizontal
      @zoomfx_x += 0.03
      @zoomfx_y -= 0.02
    when :zoom_maximize
      @zoomfx_x += 0.02
      @zoomfx_y += 0.02
    when :zoom_minimize
      @zoomfx_x -= 0.02
      @zoomfx_y -= 0.02
    end
  end
 
  # konck down engine update
  def update_knockdown
    if @knockdown_data[0] > 0
      @knockdown_data[0] -= 1
      @knockdown_data[0] == 0 ? knowdown_effect(2) : knowdown_effect(1)
      if @knockdown_data[1] != nil
        @pattern = @knockdown_data[2]
        @direction = @knockdown_data[3]
      end
    end
  end
 
  def knowdown_effect(type)
    return if self.is_a?(Projectile)
    if type[0] == 1
      if @knockdown_data[1] == nil
        if battler.is_a?(Game_Enemy)
          if self.knockdown_enable
            force_cancel_actions
            self_sw = PearlKernel::KnockdownSelfW
            $game_self_switches[[$game_map.map_id, self.id, self_sw]] = true
            @knockdown_data[1] = self_sw
            self.refresh
            @knockdown_data[2] = self.page.graphic.pattern
            @knockdown_data[3] = self.page.graphic.direction
            $game_map.screen.start_shake(7, 4, 20)
          end
         
          @knockdown_data[0] = 0 if @knockdown_data[1] == nil
       elsif battler.is_a?(Game_Actor)
         if PearlKernel.knock_actor(self.actor) != nil and
           if @knockdown_data[1] == nil
             force_cancel_actions
             @knockdown_data[1] = @character_name
             @knockdown_data[4] = @character_index
             @character_name = PearlKernel.knock_actor(self.actor)[0]
             @character_index = PearlKernel.knock_actor(self.actor)[1]
             @knockdown_data[2] = PearlKernel.knock_actor(self.actor)[2]
             @knockdown_data[3] = PearlKernel.knock_actor(self.actor)[3]
             $game_map.screen.start_shake(7, 4, 20) if battler.deadposing.nil?
           end
         end
         @knockdown_data[0] = 0 if @knockdown_data[1] == nil
        end
  &nbs
[close]

O script é tão grande que não cabe em um único post... o final dessa parte do script

Spoiler
     @knockdown_data[0] = 0 if @knockdown_data[1] == nil
       elsif battler.is_a?(Game_Actor)
         if PearlKernel.knock_actor(self.actor) != nil and
           if @knockdown_data[1] == nil
             force_cancel_actions
             @knockdown_data[1] = @character_name
             @knockdown_data[4] = @character_index
             @character_name = PearlKernel.knock_actor(self.actor)[0]
             @character_index = PearlKernel.knock_actor(self.actor)[1]
             @knockdown_data[2] = PearlKernel.knock_actor(self.actor)[2]
             @knockdown_data[3] = PearlKernel.knock_actor(self.actor)[3]
             $game_map.screen.start_shake(7, 4, 20) if battler.deadposing.nil?
           end
         end
         @knockdown_data[0] = 0 if @knockdown_data[1] == nil
        end
      end
    elsif type == 2
      if battler.is_a?(Game_Enemy)
        if @deadposee and battler.dead?
          @knockdown_data[1] = nil
          return 
        end
        $game_self_switches[[$game_map.map_id, self.id, 
        @knockdown_data[1]]] = false if @knockdown_data[1] != nil
        @knockdown_data[1] = nil
      else
        @character_name = @knockdown_data[1]
        @character_index = @knockdown_data[4]
        @knockdown_data[1] = nil
      end
    end
  end
  
  #================================
  # states
  def primary_state_ani
    return nil if battler.states[0].nil?
    return battler.states[0].tool_data("State Animation = ")
  end
  
  # higer priority state animation displayed
  def update_state_effects
    return if battler.nil?
    @state_poptimer[0] += 1 unless primary_state_ani.nil?
    if @state_poptimer[0] == 30
      @animation_id = primary_state_ani
      @animation_id = 0 if @animation_id.nil?
    elsif @state_poptimer[0] == 180
      @state_poptimer[0] = 0
    end
    update_state_action_steps 
  end
  
  # update state actions
  def update_state_action_steps
    for state in battler.states
      if state.remove_by_walking
        if !battler.state_steps[state.id].nil? &&
          battler.state_steps[state.id] > 0
          battler.state_steps[state.id] -= 1 
        end
        if battler.state_steps[state.id] == 0
          battler.remove_state(state.id)
          pop_damage
        end
      end
      if state.restriction == 4
        @stopped_movement = 10
        @pattern = 2 if @knockdown_data[0] == 0
      end
      state.features.each do |feature|
        if feature.code == 22 
          @knockdown_data[0] =10 if state.restriction == 4 && feature.data_id==1
          next unless feature.data_id.between?(7, 9)
          apply_regen_state(state, feature.data_id)
        end
      end
    end
  end
  
  # apply regen for hp, mp and tp
  def apply_regen_state(state, type)
    random = state.tool_data("State Effect Rand Rate = ") 
    random = 120 if random.nil?
    if rand(random) == 1
      battler.regenerate_hp if type == 7
      battler.regenerate_mp if type == 8
      battler.regenerate_tp if type == 9
      if type == 7 and battler.result.hp_damage == 0
        @colapse_time = 80
        battler.add_state(1)
        return
      end
      type == 9 ? pop_damage("PP+ !") : pop_damage
    end
  end
  
  alias falcaopearl_update_anime_pattern update_anime_pattern
  def update_anime_pattern
    return if @anime_speed > 0 || @knockdown_data[0] > 0
    falcaopearl_update_anime_pattern
  end
  
  #=============================================================================
  # Reset Pearl ABS System
  
  # reset from game player call
  def reset_knockdown_actors
    # reset knock down
    if @knockdown_data[1] != nil
      @knockdown_data[0] = 0
      knowdown_effect(2)
    end
    # force clear knock down
    $game_player.followers.each do |follower|
      if follower.knockdown_data[1] != nil
        follower.knockdown_data[0] = 0
        follower.knowdown_effect(2)
      end
    end
  end
  
  # reset knockdown enemies game player call
  def reset_knockdown_enemies
    $game_map.events.values.each do |event|
      if event.knockdown_data[1] != nil
        event.knockdown_data[0] = 0
        event.knowdown_effect(2)
      end
      if event.deadposee and event.killed
        $game_self_switches[[$game_map.map_id, event.id,
        PearlKernel::KnockdownSelfW]] = false
      end
    end
  end
  
  # glabal reseting
  def pearl_abs_global_reset
    force_cancel_actions
    battler.remove_state(9) if @battler_guarding[0]
    @battler_guarding = [false, nil]
    @making_spiral = false
    set_hook_variables
    @using_custom_g = false
    $game_player.followers.each do |f|
      f.targeted_character = nil if !f.targeted_character.nil?
      f.stuck_timer = 0 if f.stuck_timer > 0
      f.follower_attacktimer = 0 if f.follower_attacktimer > 0
      f.force_cancel_actions unless f.visible?
      f.battler.remove_state(9) if f.battler_guarding[0]
      f.battler_guarding = [false, nil]
      f.set_hook_variables
      f.making_spiral = false
    end
    reset_knockdown_actors
    reset_knockdown_enemies
    $game_player.projectiles.clear
    $game_player.damage_pop.clear
    $game_player.anime_action.clear
    $game_player.enemy_drops.clear
    @send_dispose_signal = true
  end
end

#===============================================================================
# Evets as enemies registration

class Game_Event < Game_Character
  attr_accessor :enemy, :move_type, :page, :deadposee
  attr_accessor :being_targeted, :agroto_f, :draw_drop, :dropped_items
  attr_accessor :start_delay, :epassive, :erased, :killed, :boom_grabdata
  attr_reader   :token_weapon, :token_armor,:token_item,:token_skill,:boom_start
  attr_reader   :hook_pull, :hook_grab, :event, :knockdown_enable, :boom_grab
  attr_reader   :respawn_anim
  alias falcaopearlabs_iniev initialize
  def initialize(map_id, event)
    @inrangeev = nil
    @being_targeted = false
    @agroto_f = nil
    @draw_drop = false
    @dropped_items = []
    @epassive = false
    @touch_damage = 0
    @start_delay = 0
    @touch_atkdelay = 0
    @killed = false
    @knockdown_enable = false
    @deadposee = false
    @respawn_anim = 0
    create_token_arrays
    falcaopearlabs_iniev(map_id, event)
    register_enemy(event)
  end
  
  def create_token_arrays
    @token_weapon = []
    @token_armor  = []
    @token_item   = []
    @token_skill  = []
  end
  
  alias falcaopearl_setup_page_settings setup_page_settings
  def setup_page_settings
    create_token_arrays
    falcaopearl_setup_page_settings
    wtag = string_data("<start_with_weapon: ")
    @token_weapon = wtag.split(",").map { |s| s.to_i } if wtag != nil
    atag = string_data("<start_with_armor: ")
    @token_armor = atag.split(",").map { |s| s.to_i } if atag != nil
    itag = string_data("<start_with_item: ")
    @token_item = itag.split(",").map { |s| s.to_i } if itag != nil
    stag = string_data("<start_with_skill: ")
    @token_skill = stag.split(",").map { |s| s.to_i } if stag != nil
    @hook_pull = string_data("<hook_pull: ") == "true"
    @hook_grab = string_data("<hook_grab: ") == "true"
    @boom_grab = string_data("<boom_grab: ") == "true"
    @boom_start = string_data("<boomed_start: ") == "true"
    @direction_fix = false if @hook_grab
    if has_token? || @hook_pull || @hook_grab || @boom_grab || @boom_start
      $game_map.events_withtags.push(self) unless
      $game_map.events_withtags.include?(self)
    end
  end
  
  def has_token?
    !@token_weapon.empty? || !@token_armor.empty? || !@token_item.empty? ||
    !@token_skill.empty?
  end
  
  def register_enemy(event)
    
    if !$game_system.remain_killed[$game_map.map_id].nil? and
      $game_system.remain_killed[$game_map.map_id].include?(self.id)
      return
    end
    
    @enemy  = Game_Enemy.new(0, $1.to_i) if event.name =~ /<enemy: (.*)>/i
    if @enemy != nil
      passive = @enemy.enemy.tool_data("Enemy Passive = ", false)
      @epassive = true if passive == "true"
      touch = @enemy.enemy.tool_data("Enemy Touch Damage Range = ")
      @sensor = @enemy.esensor
      @touch_damage = touch if touch != nil
      $game_map.event_enemies.push(self) # new separate enemy list
      $game_map.enemies.push(@enemy)     # just enemies used in the cooldown
      @event.pages.each do |page|
        if page.condition.self_switch_valid and
          page.condition.self_switch_ch == PearlKernel::KnockdownSelfW
          @knockdown_enable = true
          break
        end
      end
      pose = @enemy.enemy.tool_data("Enemy Dead Pose = ", false) == "true"
      @deadposee = true if pose and @knockdown_enable
    end
  end
  
  def update_state_effects
    @killed ? return : super
  end
  
  def collapsing?
    return true if @killed || @colapse_time > 0
    return false
  end
  
  def enemy_ready?
    return false if @enemy.nil? || @page.nil? || collapsing? || @enemy.object
    return true
  end
  
  def battler
    return @enemy
  end
  
  def apply_respawn
    return if @colapse_time > 0
    @draw_drop = false
    @dropped_items.clear
    @through = @die_through
    @through = false if @through.nil?
    @die_through = nil
    @secollapse = nil
    @colapse_time = 0
    @erased = false ; @opacity = 255
    @zoomfx_x = 1.0 ; @zoomfx_y = 1.0
    @killed = false
    @priority_type = 1 if @deadposee
    resetdeadpose
    refresh
  end
  
  def resetdeadpose
    if @deadposee
      $game_self_switches[[$game_map.map_id, @id,
      PearlKernel::KnockdownSelfW]] = false
    end
  end
  
  def kill_enemy
    @secollapse = nil
    @killed = true
    @priority_type = 0 if @deadposee
    gain_exp
    gain_gold
    etext = 'Exp '  + @enemy.exp.to_s if @enemy.exp > 0
    gtext = 'Aura ' + @enemy.gold.to_s if @enemy.gold > 0
    $game_player.pop_damage("#{etext} #{gtext}") if etext || gtext
    make_drop_items
    run_assigned_commands
  end
  
  def run_assigned_commands
    transform = @enemy.enemy.tool_data("Enemy Die Transform = ")
    switch = @enemy.enemy.tool_data("Enemy Die Switch = ")
    $game_switches[switch] = true if switch != nil
    variable = @enemy.enemy.tool_data("Enemy Die Variable = ")
    $game_variables[variable] += 1 if variable != nil
    self_sw = @enemy.enemy.tool_data("Enemy Die Self Switch = ", false)
    #$game_map.event_enemies.delete(self) if @enemy.object
    #$game_map.enemies.delete(@enemy) if @enemy.object
    if self_sw.is_a?(String)
      $game_self_switches[[$game_map.map_id, self.id, self_sw]] = true
      apply_respawn
      $game_map.event_enemies.delete(self)
      $game_map.enemies.delete(@enemy)
      unless $game_system.remain_killed.has_key?($game_map.map_id)
        $game_system.remain_killed[$game_map.map_id] = []
      end
      $game_system.remain_killed[$game_map.map_id].push(self.id) unless
      $game_system.remain_killed[$game_map.map_id].include?(self.id)
      @enemy = nil
    else
      erase unless @deadposee
      respawn = @enemy.enemy.tool_data("Enemy Respawn Seconds = ")
      animation = @enemy.enemy.tool_data("Enemy Respawn Animation = ")
      @respawn_count = respawn * 60 unless respawn.nil?
      
      @respawn_anim = animation unless animation.nil?
      
    end
    if transform != nil
      @enemy = Game_Enemy.new(0, transform)
      apply_respawn
    end
  end
  
  def make_drop_items
    @dropped_items = @enemy.make_drop_items
    unless @dropped_items.empty?
      $game_player.enemy_drops.push(self)
      $game_map.events_withtags.push(self) unless 
      $game_map.events_withtags.include?(self)
    end
  end
  
  def gain_exp
    return if @enemy.exp == 0
    $game_party.all_members.each do |actor|
      actor.gain_exp(@enemy.exp)
    end
  end
  
  def gain_gold
    return if @enemy.gold == 0
    $game_party.gain_gold(@enemy.gold)
  end
  
  alias falcaopearlabs_updatev update
  def update
    @start_delay -= 1 if @start_delay > 0
    @touch_atkdelay -= 1 if @touch_atkdelay > 0
    update_enemy_sensor unless @enemy.nil?
    update_enemy_touch_damage unless @enemy.nil?
    falcaopearlabs_updatev
  end
  
  def update_enemy_touch_damage
    return unless @touch_damage > 0
    return unless @character_name != ""
    return if @epassive || @killed
    return if @touch_atkdelay > 0
    unless @enemy.object
      @agroto_f.nil? ? target = $game_player : target = @agroto_f
    else
      target = $game_player
      $game_player.followers.each do |follower|
        next unless follower.visible?
        if obj_size?(follower, @touch_damage) and !follower.battler.dead?
          execute_touch_damage(follower)
        end
      end
    end
    execute_touch_damage(target) if obj_size?(target, @touch_damage)
  end
  
  def execute_touch_damage(target)
    target.battler.attack_apply(@enemy)
    target.pop_damage
    @touch_atkdelay = 50
    target.colapse_time = 60 if target.battler.dead?
    return if target.battler.result.hp_damage == 0
    target.jump(0, 0)
  end
  
  # enemy sensor
  def update_enemy_sensor
    return if @hookshoting[0]
    return if @epassive
    if @sensor != nil
      @agroto_f.nil? ? target = $game_player : target = @agroto_f
      if obj_size?(target, @sensor)
        data = [$game_map.map_id, @id, PearlKernel::Enemy_Sensor]
        if @inrangeev.nil? and !$game_self_switches[[data[0], data[1],
          data[2]]]
          $game_self_switches[[data[0], data[1], data[2]]] = true
          @inrangeev = true
        end
      elsif @inrangeev != nil
        data = [$game_map.map_id, @id, PearlKernel::Enemy_Sensor]
        if $game_self_switches[[data[0], data[1], data[2]]]
          $game_self_switches[[data[0], data[1], data[2]]] = false
          @inrangeev = nil
        end
      end
    end
  end
  
  # on battle pixel, take a lot of time procesing, but it is very exact
  def on_battle_pixel?(out=0)
    w = Graphics.width + out; h = Graphics.height + out
    return true if screen_x.between?(0 - out,w) and screen_y.between?(0 - out,h)
    return false
  end

  def cmt_data(comment)
    return 0 if @list.nil? or @list.size <= 0
    for item in @list
      if item.code == 108 or item.code == 408
        return $1.to_i if item.parameters[0] =~ /#{comment}(.*)>/i
      end
    end
    return 0
  end
  
  def string_data(comment)
    return nil if @list.nil? or @list.size <= 0
    for item in @list
      if item.code == 108 or item.code == 408
        return $1.to_s if item.parameters[0] =~ /#{comment}(.*)>/i
      end
    end
    return nil
  end
  
  # stop event movement
  alias falcaopearl_update_self_movement update_self_movement
  def update_self_movement
    return if !@boom_grabdata.nil?
    return if force_stopped? || @colapse_time > 0 || @blowpower[0] > 0
    falcaopearl_update_self_movement
  end
end


class Game_System
  attr_accessor :remain_killed
  alias falcao_fantastic_store_ini initialize
  def initialize
    falcao_fantastic_store_ini
    @remain_killed = {}
  end
end

#===============================================================================

# mist
class Game_Map
  attr_reader   :map
  attr_accessor :event_enemies, :enemies, :events_withtags
  alias falcaopearl_enemycontrol_ini initialize
  def initialize
    @event_enemies = []
    @enemies = []
    @events_withtags = []
    falcaopearl_enemycontrol_ini
  end
  
  alias falcaopearl_enemycontrol_setup setup
  def setup(map_id)
    @event_enemies.clear
    @enemies.clear
    @events_withtags.clear
    falcaopearl_enemycontrol_setup(map_id)
    if $game_temp.loadingg != nil
      @event_enemies.each do |event|
        event.resetdeadpose
      end
      $game_temp.loadingg = nil
    end
  end
  
  alias falcaopearl_damage_floor damage_floor?
  def damage_floor?(x, y)
    return if $game_player.hookshoting[1]
    falcaopearl_damage_floor(x, y)
  end
end

class Game_Temp
  attr_accessor :pop_windowdata, :loadingg
  def pop_w(time, name, text)
    return unless @pop_windowdata.nil?
    @pop_windowdata = [time, text, name]
  end
end

class Game_Party < Game_Unit
  alias falcaopearl_swap_order swap_order
  def swap_order(index1, index2)
    unless SceneManager.scene_is?(Scene_Map)
      if $game_player.in_combat_mode?
        $game_temp.pop_w(180, 'Pearl ABS', 
        'You cannot switch player while in combat!')
        return
      elsif $game_player.any_collapsing?
        $game_temp.pop_w(180, 'Pearl ABS', 
        'You cannot switch player while collapsing!')
        return
      elsif $game_party.battle_members[index2].deadposing != nil
         $game_temp.pop_w(180, 'Pearl ABS', 
        'You cannot move a dead ally!')
        return
      end
    end
    falcaopearl_swap_order(index1, index2)
  end
end

class << DataManager
  alias falcaopearl_extract extract_save_contents
  def DataManager.extract_save_contents(contents)
    falcaopearl_extract(contents)
    $game_temp.loadingg = true
  end
end
[close]

Ah esquece, eu achei no primeiro, k é que o jeito que foi feito não dá muita margem para aumentar os frames, veja se isso funciona.
No lugar do primeiro que me mandou.

#===============================================================================
# * Falcao Pearl ABS script shelf # 5
#
# This script handles all sprites of Pearl ABS engine
#===============================================================================

# Anime action enguine
class Anime_Obj < Game_Character
  attr_accessor :draw_it, :destroy_it, :item, :user, :original_speed
  attr_reader   :custom_graphic
  def initialize(user, item)
    super()
    PearlKernel.load_item(item)
    @draw_it = false
    @destroy_it = false
    @item = item
    @user = user
    @custom_graphic = false
    graphic = PearlKernel.user_graphic
    if graphic.split(" ").include?('custom') 
      graphic = graphic.sub("custom ","")
      @custom_graphic = true
      user.transparent = true
      user.using_custom_g = true
    end
    @character_name = graphic
    moveto(@user.x, @user.y)
    set_direction(@user.direction)
    @original_speed = PearlKernel.user_animespeed
    
    #patch
    PearlKernel.check_iconset(@item, "User Iconset = ", self)
    @character_name = "" if @user_iconset != nil
  end
end

# Sprite character added battlers as enemies and the anime sprites fit
class Sprite_Character < Sprite_Base
  alias falcaopearl_update_position update_position
  def update_position
    if !@character.battler.nil? and @character.battler.is_a?(
      Game_Enemy) and @character.battler.breath_enable
      apply_breath_effect(@character)
    end
    self.zoom_x = @character.zoomfx_x
    self.zoom_y = @character.zoomfx_y
    self.angle = @character.angle_fx
    falcaopearl_update_position
    update_anime_object_pos
  end
  
  # anime object position and action
  def update_anime_object_pos
    if @character.is_a?(Anime_Obj)
      if @character.custom_graphic
        add = 0
      else
        @ch == 128 ? add = 48 : add = (@ch / 2) / 2
      end
      self.x = @character.user.screen_x
      self.y = @character.user.screen_y + add
      self.z = @character.user.screen_z + 1
      @character.direction = @character.user.direction
      if @character.user.anime_speed == 0
        if @character.custom_graphic
          @character.user.transparent = false 
          @character.user.using_custom_g = false
        end
        @character.destroy_it = true 
      end
      if @character.user.making_spiral
        @character.direction == 8 ? @character.pattern=1 : @character.pattern=2
        return
      end
      a= @character.user.anime_speed.to_f/@character.original_speed.to_f * 100.0
      case a
      when 91..100 ; @character.pattern = 0 
      when 81..91  ; @character.pattern = 1
      when 72..81  ; @character.pattern = 2
	  when 63..72 ; @character.pattern = 3
      when 54..63  ; @character.pattern = 4
      when 45..54  ; @character.pattern = 5
	  when 36..45 ; @character.pattern = 6 
      when 27..36  ; @character.pattern = 7
      when 18..27  ; @character.pattern = 8
      end
    end
  end
  
  # Enemy battler graphics engine
  alias falcaopearl_battler_bitmap set_character_bitmap
  def set_character_bitmap
    if battler_graphic?
      self.bitmap= Cache.battler(@character_name,@character.battler.battler_hue)
      self.ox = self.bitmap.width / 2
      self.oy = self.bitmap.height
      return
    end
    falcaopearl_battler_bitmap
  end
  
  def battler_graphic?
    if !@character.battler.nil? and @character.battler.is_a?(
      Game_Enemy) and @character.battler.battler_graphic
      return false if @character.page.nil?
      @character_name = @character.battler.battler_name
      return true 
    end
    return false
  end
  
  alias falcaopearl_battler_graphic update_src_rect
  def update_src_rect
    return if battler_graphic?
    falcaopearl_battler_graphic
  end
  
  # breath effect
  def apply_breath_effect(char)
    return if @character.is_a?(Game_Event) and @character.erased
    char.zoomfx_x -= 0.0023 if !char.zfx_bol
    char.zoomfx_y -= 0.0023 if !char.zfx_bol
    char.zoomfx_x += 0.0023 if  char.zfx_bol
    char.zoomfx_y += 0.0023 if  char.zfx_bol
    char.zfx_bol = true if char.zoomfx_x <= 0.93
    char.zfx_bol = false if char.zoomfx_x >= 1.0
  end
end

#sprite characters part 2 (icon graphics feature
class Sprite_Character < Sprite_Base
 
  def iconset_graphic?
    !@character.user_iconset.nil? || !@character.pro_iconset.nil?
  end
 
  alias falcao_fantastic_bit update_bitmap
  def update_bitmap
    if iconset_graphic?
      if @apply_iconset.nil?
        icon = @character.user_iconset[0] if !@character.user_iconset.nil? and
        @character.is_a?(Anime_Obj)
        icon = @character.pro_iconset[0] if !@character.pro_iconset.nil? and
        @character.is_a?(Projectile)
        set_iconsetbitmap(icon)
        @apply_iconset = true
      end
      apply_breath_effect2(@character) if !@character.pro_iconset.nil? and
      @character.is_a?(Projectile) and @character.pro_iconset[1] == :animated
      @enable_angle = @character.user_iconset[1] if
      !@character.user_iconset.nil? and @character.is_a?(Anime_Obj)
      return
    end
    falcao_fantastic_bit
  end
 
  alias falcao_fantastic_update_position update_position
  def update_position
    falcao_fantastic_update_position
    set_angle_changes(@enable_angle) if @enable_angle != nil
  end
 
  def apply_angle_pattern(x_plus, y_plus, angle)
    self.x = @character.user.screen_x + x_plus
    self.y = @character.user.screen_y + y_plus
    self.angle = angle
  end
 
  def set_angle_changes(type)
    ani= @character.user.anime_speed.to_f/@character.original_speed.to_f * 100.0
    case ani
    when 80..100
      perform_animated(0) if type == :animated
    when 60..80
      perform_animated(1) if type == :animated
    when 0..60
      perform_animated(2) if type == :animated
    end
    if type != :animated
      perform_static       if type == :static
      perform_shielding    if type == :shielding
    end
  end
 
  # animated
  def perform_animated(pattern)
    case pattern
    when 0
      apply_angle_pattern(10, -12, -166) if @character.user.direction == 2
      if @character.user.direction == 4 || @character.user.direction == 6
        apply_angle_pattern(-8, -26, -46)
        self.z = @character.user.screen_z - 1
      end
      apply_angle_pattern(-22, -10, 0)   if @character.user.direction == 8
    when 1
      apply_angle_pattern(0, 0, -266)   if @character.user.direction == 2
      apply_angle_pattern(-20, -10, 12) if @character.user.direction == 4
      apply_angle_pattern(7, -20, -78)  if @character.user.direction == 6
      if @character.user.direction == 8
        apply_angle_pattern(-8, -26, -46)
        self.z = @character.user.screen_z - 1
      end
    when 2
      apply_angle_pattern(8, -5, -210)    if @character.user.direction == 2
      apply_angle_pattern(-10, 2, 52)     if @character.user.direction == 4
      apply_angle_pattern(8, -15, -126)  if @character.user.direction == 6
      apply_angle_pattern(10, -16, - 100) if @character.user.direction == 8
    end
  end
 
  # static
  def perform_static
    apply_angle_pattern(8, -5, -210)    if @character.user.direction == 2
    apply_angle_pattern(-10, 2, 52)     if @character.user.direction == 4
    apply_angle_pattern(8, -15, -126)  if @character.user.direction == 6
    if @character.user.direction == 8
      apply_angle_pattern(-8, -26, -46)
      self.z = @character.user.screen_z - 1
    end
  end
 
  # shielding
  def perform_shielding
    apply_angle_pattern(2, 4, 0)    if @character.user.direction == 2
    apply_angle_pattern(-10, 0, 0)     if @character.user.direction == 4
    if @character.user.direction == 6
      apply_angle_pattern(10, 0, 0)  
      self.z = @character.user.screen_z - 1
    elsif @character.user.direction == 8
      apply_angle_pattern(11, -9, 0)  
      self.z = @character.user.screen_z - 1
    end
  end
 
  def apply_breath_effect2(char)
    char.zoomfx_x -= 0.03 if !char.zfx_bol
    char.zoomfx_y -= 0.03 if !char.zfx_bol
    char.zoomfx_x += 0.03 if char.zfx_bol
    char.zoomfx_y += 0.03 if char.zfx_bol
    char.zfx_bol = true if char.zoomfx_x <= 0.84
    char.zfx_bol = false if char.zoomfx_x >= 1.0
  end
 
  alias falcao_fantastic_src update_src_rect
  def update_src_rect
    return if iconset_graphic?
    falcao_fantastic_src
  end
 
  def set_iconsetbitmap(icon_index, enabled = true)
    self.bitmap = Bitmap.new(24, 24)
    bit = Cache.system("Iconset")
    rect = Rect.new(icon_index % 16 * 24, icon_index / 16 * 24, 24, 24)
    self.bitmap.blt(0, 0, bit, rect, enabled ? 255 : 150)
    @cw = self.ox = 12
    @ch = self.oy = 24
  end
end

#===============================================================================
# Drop sprites
class Sprite_EnemyDrop < Sprite
  attr_reader   :event
  def initialize(viewport, event, item)
    super(viewport)
    @event = event
    @item = item
    @drop_quantity = @item.tool_data("Drop Quantity = ")
    @drop_quantity = 1 if @drop_quantity.nil?
    self.z = $game_player.screen_z - 1
    @object_zooming = 0
    set_bitmap
    update
  end
  
  def update
    super
    self.bush_depth = @event.bush_depth
    @object_zooming += 1
    case @object_zooming
    when 1..8  ; self.zoom_x -= 0.01 ;  self.zoom_y -= 0.01
    when 9..16 ; self.zoom_x += 0.01 ;  self.zoom_y += 0.01
    when 17..24 ; self.zoom_x = 1.0   ;  self.zoom_y = 1.0; @object_zooming = 0 
    end
    self.x = @event.screen_x - 12
    self.y = @event.screen_y - 24
    if @event.x == $game_player.x and @event.y == $game_player.y and
      !$game_player.moving?
      complete_action
      return
    end
    
    complete_action(false) if @event.respawn_count == 1
  end
  
  def complete_action(gaining=true)
    $game_party.gain_item(@item, @drop_quantity) if gaining
    dispose
    @event.dropped_items.delete(@item)
    $game_map.events_withtags.delete(@event)
  end
  
  def dispose
    self.bitmap.dispose
    super
  end
  
  def set_bitmap
    self.bitmap = Bitmap.new(26, 38)
    bitmap = Cache.system("Iconset")
    icon = @item.icon_index
    rect = Rect.new(icon % 16 * 24, icon / 16 * 24, 24, 24)
    self.bitmap.blt(0, 0, bitmap, rect)
    
    ##num adds
    return if @drop_quantity == 0
    self.bitmap.font.size = 14
    self.bitmap.font.bold = true
    self.bitmap.draw_text(0, 8, 26, 32, @drop_quantity.to_s, 1)
  end
end

#===============================================================================
# Dead icon sprites for player and followers

class Sprite_DeadIcon < Sprite
  attr_reader   :character
  def initialize(viewport, character)
    super(viewport)
    @character = character
    self.bitmap = Bitmap.new(24, 24)
    bitmap = Cache.system("Iconset")
    icon = 1
    rect = Rect.new(icon % 16 * 24, icon / 16 * 24, 24, 24)
    self.bitmap.blt(0, 0, bitmap, rect)
    @knok = @character.actor.actor.tool_data("Knockdown Graphic = ",false)!= nil
    update
  end
  
  def update
    super
    self.x = @character.screen_x - 10
    self.y = @character.screen_y - 54
    self.z = @character.screen_z + 1
    self.opacity = @character.opacity
    self.visible = !@character.transparent
    if @knok
      @character.knockdown_data[0] = 10 if !@character.battler.deadposing.nil?
    else
      @character.playdead
      @character.direction = 8
      self.x = @character.screen_x - 26
    end
  end
  
  def dispose
    self.bitmap.dispose
    @character.angle_fx = 0.0 unless @knok
    super
  end
end

#===============================================================================
# State and buff icons sprites
class StateBuffIcons < Sprite
  def initialize(viewport, mode)
    super(viewport)
    @mode = mode
    self.bitmap = Bitmap.new(36, 134)
    @picture = Cache.system("Iconset")
    if @mode == "States"
      self.x = 544 - 36
      self.y = 90
    else
      self.x = 544 - 36
      self.y = 230
    end
    @actor = $game_player.actor
    @old_status = []
    refresh_icons
    update
  end
  
  def icons
    return @actor.state_icons if @mode == 'States'
    return @actor.buff_icons  if @mode == 'Buffs'
  end
  
  def update
    5.times.each {|i| 
    if @old_status[i] != icons[i]
      refresh_icons
      $game_player.actor.apply_usability
    end}
    if @actor != $game_player.actor
      @actor = $game_player.actor
      refresh_icons
    end
  end
  
  def dispose
    self.bitmap.dispose
    super
  end
  
  def refresh_icons
    self.bitmap.clear
    self.bitmap.font.size = 15
    self.bitmap.draw_text(-2, -8, self.bitmap.width + 6, 32, @mode, 1) 
    y = 12; count = 0
    for i in icons
      draw_icon(6, y, i)
      y += 24; count += 1
      break if count == 5
    end
    5.times.each {|i| @old_status[i] = icons[i]}
  end
  
  def draw_icon(x, y, index)
    icon = index
    rect = Rect.new(icon % 16 * 24, icon / 16 * 24, 24, 24)
    self.bitmap.blt(x, y, @picture, rect)
  end
end

#===============================================================================
#  * Damage pop engine

class DamagePop_Obj < Game_Character
  attr_accessor :draw_it, :destroy_it, :target, :dmgcustom, :timingg, :plus_time
  attr_accessor :plus_time
  def initialize(target, custom=nil)
    super()
    @draw_it = false
    @destroy_it = false
    @target = target
    @timingg = 70
    @plus_time = 0.0
    @dmgcustom = custom
    moveto(@target.x, @target.y)
  end
end

class Sprite_DamagePop < Sprite
  attr_reader   :target
  def initialize(viewport, target)
    super(viewport)
    @target = target
    self.bitmap = Bitmap.new(200, 50)
    self.bitmap.font.size = 20
    case rand(4)
    when 0 then @resto_plus = 0.5
    when 1 then @resto_plus = 0.6
    when 2 then @resto_plus = 0.7
    when 3 then @resto_plus = 0.8
    end
    create_text_for_display
    set_text
    update
  end
  
  def create_text_for_display
    battler = @target.target.battler
    value   = battler.result.hp_damage
    value2  = battler.result.mp_damage
    value3  = battler.result.tp_damage
    
    # hp damage texts
    if value > 0
      battler.result.critical ? @text = 'Critico! ' + value.to_s :
      @text = value.to_s
    elsif value < 0
      self.bitmap.font.color = Color.new(10,220,45)
      @text = value.to_s.sub("-","")
    elsif    battler.result.missed
      @text = 'Errou'
    elsif battler.result.evaded
      @text = 'Esquivou'
      
    elsif battler.result.success # tanget take no damage but result succes
      @text = value.to_s
    end
    
    # mp damage text 
    if value2 < 0
      self.bitmap.font.color = Color.new(20,160,225)
      @text = value2.to_s.sub("-","")
    elsif value2 > 0
      @text = '- EN' + value2.to_s
    end
    
    # TP damage text 
    if value3 < 0
      self.bitmap.font.color = Color.new(20,160,225)
      @text = value3.to_s.sub("-","")
    elsif value3 > 0
      @text = '- PP' + value3.to_s
    end
    
    # states and buff display
    if battler.result.status_affected?
      display_changed_states(battler)
      display_changed_buffs(battler)
    end
    
    # Custom text (it has hightest priority
    if !@target.dmgcustom.nil?
      if @target.dmgcustom == 1
        @text = 'Bloqueio ' + value.to_s
      elsif @target.dmgcustom == 2
        @text = 'Defesa'
      elsif @target.dmgcustom.is_a?(String)   
        @text = @target.dmgcustom
      elsif @target.dmgcustom.is_a?(Array)
        self.bitmap.font.color = @target.dmgcustom[1]
        @text = @target.dmgcustom[0]
      end
    end
    battler.result.clear
  end
  
  # text set and position
  def set_text
    self.x = @target.screen_x - 98
    self.y = @target.screen_y - 54
    self.z = 3 * 100
    self.opacity = @target.opacity
    #self.bitmap.font.bold = true
    self.bitmap.font.shadow = true
    item = @target.target.battler.used_item
    if item != nil and !item.scope.between?(1, 6) and 
      item.tool_data("User Graphic = ", false).nil?
      @text = item.name if @text.nil?
    end
    @target.target.battler.used_item = nil
    self.bitmap.draw_text(0, 0, 200, 32, @text, 1)
  end
  
  # Buffs display
  def display_changed_buffs(target)
    display_buffs(target, target.result.added_buffs, Vocab::BuffAdd)
    display_buffs(target, target.result.added_debuffs, Vocab::DebuffAdd)
    display_buffs(target, target.result.removed_buffs, Vocab::BuffRemove)
  end
  
  def display_buffs(target, buffs, fmt)
    buffs.each do |param_id|
      @text = sprintf(fmt,'', Vocab::param(param_id)).sub("'s","")
    end
  end
  
  # States display
  def display_changed_states(target)
    display_added_states(target)
    display_removed_states(target)
  end
  
  # Display added states
  def display_added_states(target)
    target.result.added_state_objects.each do |state|
      state_msg = target.actor? ? state.message1 : state.message2
      #target.perform_collapse_effect if state.id == target.death_state_id
      next if state_msg.empty?
      @text = state_msg
    end
  end
  
  # Display removed states
  def display_removed_states(target)
    target.result.removed_state_objects.each do |state|
      next if state.message4.empty?
      @text = state.message4
    end
  end
  
  def update
    @target.timingg -= 1 if @target.timingg > 0
    @target.plus_time += @resto_plus
    self.opacity -= 5 if @target.timingg <= 25
    @target.destroy_it = true if @target.timingg == 0
    self.x = @target.target.screen_x - 98
    self.y = @target.target.screen_y - 54 - @target.plus_time
  end
  
  def dispose
    self.bitmap.dispose
    super
  end
end

#===============================================================================
# Sprite set map

class Spriteset_Map
  
  alias falcaopearl_create_characters create_characters
  def create_characters
    create_pearl_abs_sprites
    falcaopearl_create_characters
  end
  
  def create_pearl_abs_sprites
    if $game_player.send_dispose_signal
      dispose_pearlabs_sprites
      $game_player.send_dispose_signal = false
    end
    @projectile_sprites = []
    $game_player.projectiles.each do |projectile|
      @projectile_sprites.push(Sprite_Character.new(@viewport1, projectile))
    end
    @damagepop_sprites = []
    $game_player.damage_pop.each do |target|
      @damagepop_sprites.push(Sprite_DamagePop.new(@viewport1, target))
    end
    @animeabs_sprites = []
    $game_player.anime_action.each do |anime|
      @animeabs_sprites.push(Sprite_Character.new(@viewport1, anime))
    end
    @enemy_drop_sprites = []
    $game_player.enemy_drops.each do |enemy|
      for i in enemy.dropped_items
        @enemy_drop_sprites.push(Sprite_EnemyDrop.new(@viewport1, enemy, i))
      end
    end
    @dead_iconsprites = []
    @dead_characters = []
  end
  
  # Drop sprites update
  def update_drop_sprites
    @enemy_drop_sprites.each {|sprite| sprite.update if !sprite.disposed?
    if sprite.disposed?
      @enemy_drop_sprites.delete(sprite)
      $game_player.enemy_drops.delete(sprite.event)
    end
    }
    $game_player.enemy_drops.each do |enemy|
      unless enemy.draw_drop
        for i in enemy.dropped_items
          @enemy_drop_sprites.push(Sprite_EnemyDrop.new(@viewport1, enemy, i))
        end
        enemy.draw_drop = true
      end
    end
  end
  
  alias falcaopearl_upsp_update update
  def update
    update_pearl_abs_main_sprites
    falcaopearl_upsp_update
  end
  
  # pearl abs main sprites update
  def update_pearl_abs_main_sprites
    if $game_player.pearl_menu_call[1] == 1
      dispose_tool_sprite
      dispose_state_icons
      dispose_buff_icons
      dispose_actorlifebars if $imported["Falcao Pearl ABS Life"]
      $game_player.pearl_menu_call[1] = 0
      case $game_player.pearl_menu_call[0]
      when :tools     then SceneManager.call(Scene_QuickTool) 
      when :character then SceneManager.call(Scene_CharacterSet)
      when :battler   then SceneManager.call(Scene_BattlerSelection)
      end
      return
    end
    update_projectile_sprites
    update_damagepop_sprites
    update_absanime_sprites
    update_dead_characters
    update_drop_sprites
    $game_system.skillbar_enable.nil? ? create_tool_sprite : dispose_tool_sprite
    @pearl_tool_sprite.update unless @pearl_tool_sprite.nil?
    $game_player.actor.state_icons.empty? ? dispose_state_icons :
    create_state_icons
    $game_player.actor.buff_icons.empty? ? dispose_buff_icons :
    create_buff_icons
    @states_sprites.update unless @states_sprites.nil?
    @buff_sprites.update unless @buff_sprites.nil?
  end
  
  # create tool sprite
  def create_tool_sprite
    return if !@pearl_tool_sprite.nil?
    @pearl_tool_sprite = Sprite_PearlTool.new(@viewport2)
  end
  
  # dispose tool sprite
  def dispose_tool_sprite
    return if @pearl_tool_sprite.nil?
    @pearl_tool_sprite.dispose
    @pearl_tool_sprite = nil
  end
  
  # Create State icons
  def create_state_icons
    return if !@states_sprites.nil?
    @states_sprites = StateBuffIcons.new(@viewport2, 'States')
  end
  
  # dispose state icons
  def dispose_state_icons
    return if @states_sprites.nil?
    @states_sprites.dispose
    @states_sprites = nil
  end
  
  # Create Buff icons
  def create_buff_icons
    return if !@buff_sprites.nil?
    @buff_sprites = StateBuffIcons.new(@viewport2, 'Buffs')
  end
  
  # dispose buff icons
  def dispose_buff_icons
    return if @buff_sprites.nil?
    @buff_sprites.dispose
    @buff_sprites = nil
  end
  
  # Projectiles
  def update_projectile_sprites
    @projectile_sprites.each {|sprite| sprite.update if !sprite.disposed?}
    $game_player.projectiles.each do |projectile|
      unless projectile.draw_it
        @projectile_sprites.push(Sprite_Character.new(@viewport1, projectile))
        projectile.draw_it = true
      end
      if projectile.destroy_it
        @projectile_sprites.each {|i|
        if i.character.is_a?(Projectile) and i.character.destroy_it
          i.dispose
          @projectile_sprites.delete(i)
        end
        }
        if projectile.user.making_spiral
          projectile.user.making_spiral = false
        end
        if projectile.user.battler_guarding[0]
          projectile.user.battler_guarding = [false, nil]
          projectile.user.battler.remove_state(9)
        end
        $game_player.projectiles.delete(projectile)
      end
    end
  end
  
  # Damage pop 
  def update_damagepop_sprites
    @damagepop_sprites.each {|sprite| sprite.update if !sprite.disposed?}
    $game_player.damage_pop.each do |target|
      unless target.draw_it
        @damagepop_sprites.push(Sprite_DamagePop.new(@viewport1, target))
        target.draw_it = true
      end
      if target.destroy_it
        @damagepop_sprites.each {|i|
        if i.target.destroy_it
          i.dispose
          @damagepop_sprites.delete(i)
        end
        }
        $game_player.damage_pop.delete(target)
      end
    end
  end
  
  #=================================
  # ANIME SPRITES
  def update_absanime_sprites
    @animeabs_sprites.each {|s| s.update if !s.disposed?
    unless $game_player.anime_action.include?(s.character)
      s.dispose
      @animeabs_sprites.delete(s)
      $game_player.anime_action.delete(s.character)
    end
    }
    $game_player.anime_action.each do |anime|
      unless anime.draw_it
        @animeabs_sprites.push(Sprite_Character.new(@viewport1, anime))
        anime.draw_it = true
      end
      if anime.destroy_it
        @animeabs_sprites.each {|i|
        if i.character.is_a?(Anime_Obj) and i.character.destroy_it
          i.dispose
          @animeabs_sprites.delete(i)
        end
        }
        $game_player.anime_action.delete(anime)
      end
    end
  end
  
  def update_dead_characters
    for follower in $game_player.followers
      next if follower.visible? == nil
      next unless follower.battler.dead?
      unless @dead_characters.include?(follower)
        sprite = Sprite_DeadIcon.new(@viewport1, follower)
        @dead_iconsprites.push(sprite)
        @dead_characters.push(follower)
      end
    end
    
    for sprite in @dead_iconsprites
      sprite.update if !sprite.disposed?
      if !sprite.character.battler.dead?
        @dead_iconsprites.delete(sprite)
        @dead_characters.delete(sprite.character)
        sprite.dispose
      end
    end
  end
  
  alias falcaopearl_spdispose dispose
  def dispose
    dispose_pearl_main_sprites
    falcaopearl_spdispose
  end
  
  # pearl abs disposing
  def dispose_pearl_main_sprites
    @dead_iconsprites.each {|icon| icon.dispose}
    dispose_tool_sprite
    dispose_state_icons
    dispose_buff_icons
    dispose_pearlabs_sprites
  end
  
  def dispose_pearlabs_sprites
    @projectile_sprites.each {|pro| pro.dispose}
    @projectile_sprites.clear
    @damagepop_sprites.each {|target| target.dispose}
    @damagepop_sprites.clear
    @animeabs_sprites.each {|anime| anime.dispose}
    @animeabs_sprites.clear
    @enemy_drop_sprites.each {|sprite| sprite.dispose}
    @enemy_drop_sprites.clear
  end
end

 :*-*: perfeito! muito obrigado  :lol: