Всем привет!

Я использую боёвку Falcao в своей игре, в ней кодом уже указаны дополнительные кнопки на клавиатуре:
[SPOILER]
PHP код:
module PearlKey
 
  
# numbers
  
N0 0x30N1 0x31N2 0x32N3 0x33N4 0x34
  N5 
0x35N6 0x36N7 0x37N8 0x38N9 0x39
 
  
# keys
  
0x410x420x430x440x45
  F 
0x460x470x480x490x4A
  K 
0x4B0x4C0x4D0x4E0x4F
  P 
0x500x510x520x530x54
  U 
0x550x560x570x580x590x5A 
[/SPOILER]

Хочу узнать, как мне самостоятельно написать свой скрипт, ссылающийся на клавиши оттуда?
Мне нужно написать скрипт, который бы отслеживал нажатие кнопки "Z", чтобы я мог привязать к нему срабатывание общего события, при этом запретив кнопке работать как аналог "Enter". =\

Если я узнаю как писать такое, то смогу реализовать не одну задумку с использованием клавиатуры, т.к. у меня не только одна функция, они должны помочь расширить потенциал активной боёвки Falcao.

Если нужно, вот весь скрипт Falcao, в котором указаны клавиши:

[SPOILER]
PHP код:
#===============================================================================
# * 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(000100)
  
def self.draw_hp(objbattlerxywhcolorname=nil)
    
tag 'Hp' color
    name 
battler.name if !name.nil?
    
draw_gauge(objbattler.hpbattler.mhpxywhctagname)
  
end
  
  def self
.draw_mp(objbattlerxywhcolorname=nil)
    
tag 'Pw' color
    name 
battler.name if !name.nil?
    
draw_gauge(objbattler.mpbattler.mmpxywhctagname)
  
end
  
  def self
.draw_exp(objbattlerxywhcolorname=nil)
    
tag 'Exp' color
    name 
battler.name if !name.nil?
    
draw_gauge(obj,battler.expbattler.next_level_expxywhctag,name)
  
end
  
  def self
.draw_tp(objxyactor)
    
string 'Rtm ' + (actor.tp).to_i.to_s
    obj
.fill_rect(x10 string.length 912, @gaugeback)
    
obj.draw_text(xyobj.width32string)
  
end
  
  def self
.draw_gauge(objnmmaxxywhcoltagname)
    
obj.font.shadow true
    w2 
max if max == 0
    obj
.fill_rect(x1w2, @gaugeback)
    
obj.fill_rect(x+1y+1w2*nm/maxh/1col[0])
    
obj.fill_rect(x+1h/2w2*nm/maxh/1col[1])
    
obj.draw_text(x22w32nm.to_s2)
    
obj.draw_text(422w32tag)
    
obj.draw_text(x25w32name1) if !name.nil?
  
end
  
  
# image based bars definition 
  
def self.image_hp(bitmapxybackimagebattlername=nil)
    
tag 'Hp'
    
name battler.name if !name.nil?
    
draw_i_gauge(bitmapxybackimagebattler.hpbattler.mhptagname)
  
end
  
  def self
.image_mp(bitmapxybackimagebattlername=nil)
    
tag 'Mp'
    
name battler.name if !name.nil?
    
draw_i_gauge(bitmapxybackimagebattler.mpbattler.mmptagname)
  
end
  
  def self
.image_exp(bitmapxybackimagebattlername=nil)
    
tag 'Exp'
    
name battler.name if !name.nil?
    
expnexte battler.expbattler.next_level_exp
    draw_i_gauge
(bitmapxybackimageexpnextetagname)
  
end
  
  def self
.draw_i_gauge(bitmapxybackimagenmmaxtagname)
    
cw back.width  
    ch 
back.height 
    max 
if max == 0
    src_rect 
Rect.new(00cwch)    
    
bitmap.blt(10ch 30,  backsrc_rect)
    
cw image.width  nm max
    ch 
image.height 
    src_rect 
Rect.new(00cwch)
    
bitmap.blt(10ch 30imagesrc_rect)
    
bitmap.draw_text(4back.height 14back.width32tag)
    
bitmap.draw_text(12back.height 14back.width32nm.to_s2)
    
bitmap.draw_text(610back.width32name1) 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 = "falseend
  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)
    
actor.actor.tool_data("Knockdown Graphic = "false)
    
actor.actor.tool_data("Knockdown Index = ")
    
actor.actor.tool_data("Knockdown pattern = ")
    
actor.actor.tool_data("Knockdown Direction = ")
    return 
nil if a.nil?
    return [
abcd]
  
end
  
  def self
.jump_hit?(target)
    
target.enemy.tool_data("Hit Jump = "false) if target.is_a?(Game_Enemy)
    
target.actor.tool_data("Hit Jump = "false) if target.is_a?(Game_Actor)
    return 
true if !t.nil? and == "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(itemtagobject)
    
data item.tool_data(tagfalse)
    return if 
data.nil?
    
= [item.icon_indexdata.to_sym] if data == "animated" ||
    
data == "static" || data == "shielding"
    
object.is_a?(Projectile) ? object.pro_iconset 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
(commentsw=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_cost = $1.to_i : @i_cost 0
    end
    
@i_cost
  end
end

# Pearl ABS Input module
module PearlKey
 
  
# numbers
  
N0 0x30N1 0x31N2 0x32N3 0x33N4 0x34
  N5 
0x35N6 0x36N7 0x37N8 0x38N9 0x39
  
  
# keys
  
0x410x420x430x440x45
  F 
0x460x470x480x490x4A
  K 
0x4B0x4C0x4D0x4E0x4F
  P 
0x500x510x520x530x54
  U 
0x550x560x570x580x590x5A

  
@unpack_string 'b'*256
  
@last_array '0'*256
  
@press = Array.new(256false)
  @
trigger = Array.new(256false)
  @
release = Array.new(256false)
  @
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[i] = @getAsyncKeyState.call(i) == false true
  end
 
  def self
.update
    
@trigger = Array.new(256false)
    @
release = Array.new(256false)
    array = 
'0'*256
    
@getKeyboardState.call(array)
    array = array.
unpack(@unpack_string)
    for 
i in 0...array.size
      
if array[i] != @last_array[i]
        @
press[i] = @getAsyncKeyState.call(i) == false true
        
if !@press[i]
          @
release[i] = true
        
else
          @
trigger[i] = true
        end
      
else
        if @
press[i] == true
          
@press[i] = @getAsyncKeyState.call(i) == false true
          
@release[i] = true if !@press[i]
        
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 == :and PearlKey.trigger?(PearlKey::B)
    
falcaopearl_trigger(constant)
  
end
  
  
# pop window global
  
def update_popwindow
    $game_temp
.pop_windowdata[0] -= 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
Graphics.width width 2,  Graphics.height 64 2
      
@temp_window Window_Base.new(xywidth64)
      @
temp_window.contents.font.size 20
      
@temp_window.draw_text(-10, -6width32tag1)
      @
temp_window.draw_text(-1014width32$game_temp.pop_windowdata[1],1)
      @
current_scene SceneManager.scene.class 
    
end
    
    
if $game_temp.pop_windowdata[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 {|sidsv# 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 {|iidiv# 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 {|widwv# 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 {|aidav#armor
      
if sub.armor_cooldown[aid] > 0
        sub
.armor_cooldown[aid] -= 
        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 = [0dir=2dirfix=falses=4wait_reset=0]
    @
user_casting = [0nil]
    @
send_dispose_signal false
    
@targeting = [falseitem=nilchar=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 = [falsenil]
    @
knockdown_data = [0nilnilnilnil]
    @
state_poptimer = [00]
    @
making_spiral false
    
@buff_pop_stack = []
    @
doingcombo 0
    
@range_view 2
    
@originalasp 0
    falcaopearl_abmain_ini
  end
  
  def set_hook_variables
    
@hookshoting = [on=falsehooking=falsegrabing=falsedelay=0]
    @
battler_chain = []
    @
user_move_distance = [steps=0speed=niltrought=nilcor=nilevmove=nil]
    @
being_grabbed false
  end
 
  
# projectiles at nt
  
def projectiles_xy_nt(xy)
    
$game_player.projectiles.select {|propro.pos_nt?(xy) }
  
end
  
  
# collide with projectiles
  
def collide_with_projectiles?(xy)
    
projectiles_xy_nt(xy).any? do |pro|
      
pro.normal_priority? || self.is_a?(Projectile)
    
end
  end
  
  def zoom
(xy)
    @
zoomfx_x x
    
@zoomfx_y y
  end
  
  alias falcaopearl_collide_with collide_with_characters
?
  
def collide_with_characters?(xy)
    return 
true if collide_with_projectiles?(xy)
    
falcaopearl_collide_with(xy)
  
end
  
  
# follow character straigh and diagonal
  
def follow_char(character)
    
sx distance_x_from(character.x)
    
sy distance_y_from(character.y)
    if 
sx != && sy != 0
      move_diagonal
(sx 6sy 2)
    
elsif sx != 0
      move_straight
(sx 6)
    
elsif sy != 0
      move_straight
(sy 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?(outmax_w out) and sy.between?(outmax_h out)
      return 
true
    end
    
return false
  end
  
   
# jump to specific tiles
  
def jumpto_tile(xy)
    
jumpto(0, [xy])
  
end
  
  
# jumpto character ( 0 = Game Player, 1 and up event id)
  
def jumpto(char_idtilexy=nil)
    
char_id char $game_map.events[char_id] : char $game_player
    tilexy
.nil? ? condxy = [char.xchar.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
(jxjy)
  
end
  
  
# distance
  
def eval_distance(target)
    if 
target.is_a?(Array)
      
distance_x = (@target[0]).abs
      distance_y 
= (@target[1]).abs
    
else
      
distance_x = (@target.x).abs
      distance_y 
= (@target.y).abs
    end
    
return [distance_xdistance_y
  
end
  
  
# check if the game player and follower are executing an action
  
def battler_acting?
    return 
true if @user_casting[0] > || @targeting[0]
    return 
true if @knockdown_data[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] > || @targeting[0]
    return 
false if battler.nil?
    return 
false if battler.dead?
    return 
false if @doingcombo || @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 = [:battler2]
    
elsif self.is_a?(Game_Follower)
      @
targeting[2] = @targeted_character
      
@targeting = [falseitem=nilchar=nil] if @targeting[2].nil?
    
elsif self.is_a?(Projectile)
      if 
user.is_a?(Game_Player)
        
user.targeting[0] = trueuser.targeting[1] = item
        $game_player
.pearl_menu_call = [:battler2]
      
end
      
if user.is_a?(Game_Follower)
        @
targeting[2] = user.targeted_character
        
@targeting = [falseitem=nilchar=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(weaponadd)
    
id 0
    
for param in weapon.params
      add 
battler.add_param(idparam) : 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(selfcustom))
  
end
  
  
#check if target is unable to move
  
def force_stopped?
    return 
true if @anime_speed || @knockdown_data[0] > ||
    @
stopped_movement || @hookshoting[0] || @angle_fx != 0.0
    
return true if @making_spiral
    
return false
  end
  
  
# sensor 
  
def obj_size?(targetsize)
    return 
false if size.nil?
    
distance = (@target.x).abs + (@target.y).abs
    enable   
= (distance <= size-1)
    return 
true if enable
    
return false
  end
  
  
# sensor body
  
def body_size?(targetsize)
    
distance = (@target[0]).abs + (@target[1]).abs
    enable   
= (distance <= size-1)
    return 
true if enable
    
return false
  end
  
  def faceto_face
?(target)
    return 
true if @direction == and target.direction == 8
    
return true if @direction == and target.direction == 6
    
return true if @direction == and target.direction == 4
    
return true if @direction == and target.direction == 2
    
return false
  end
  
  def adjustcxy
    push_x
push_y =   0,   if @direction == 2
    push_x
push_y = - 1,   if @direction == 4
    push_x
push_y =   1,   if @direction == 6
    push_x
push_y =   0, - if @direction == 8
    
return [push_xpush_y]
  
end
  
  def in_frontof
?(target)
    return 
true if @direction == and @== target.and (@y+1) == target.y
    
return true if @direction == and (@x-1) == target.and @== target.y
    
return true if @direction == and (@x+1) == target.and @== target.y
    
return true if @direction == and @== target.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 == || @direction == 8
    when 2 then 
return false if @direction == || @direction == 6
    when 3 then 
return false
    end
    m 
$game_map
    unless 
@x.between?(1m.width 2) && @y.between?(1m.height 2)
      return 
true if @== and @direction == 4
      
return true if @== and @direction == 8
      
return true if @== m.width  1  and @direction == 6
      
return true if @== 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?(16)
        
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 == ||
          
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 && invoke != && invoke != 2
          invokeskill 
$data_skills[invoke]
          if 
PearlKernel.tool_target == "true" || invokeskill.scope == ||
            
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(itemPearlKernel.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(selfitemi))}
      @
hookshoting[0] = true
    elsif PearlKernel
.tool_special == "triple"       # loads 3 projectiles
      
for i in [:uno, :dos, :tres]
        
$game_player.projectiles.push(Projectile.new(selfitemi))
      
end
    elsif PearlKernel
.tool_special == "quintuple"     #loads 5 projectiles
      
for i in [:uno, :dos, :tres, :cuatro, :cinco]
        
$game_player.projectiles.push(Projectile.new(selfitemi))
      
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(selfitemi))
      
end
    
else # load default projectile
      
$game_player.projectiles.push(Projectile.new(selfitem))
    
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(selfitem))
    
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(selfitem))
    
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] > 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 = [falseitem=nilchar=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(kindidjumpp)
    if 
jumpp == 'jump'
      
jump(00)
      
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?
        
rand(3)
        
move_random if == || == 1
        move_away_from_character
(@targeted_character) if 
        !@
targeted_character.nil? and == 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 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?(16)
        
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?(16)
          
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 == 
      use_armor
(fo_tool.id)  if actor.primary_use == 2
      use_item
(fo_tool.id)   if actor.primary_use == || actor.primary_use == 4
      use_skill
(fo_tool.id)  if actor.primary_use==|| actor.primary_use==||
      
actor.primary_use == || 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 += if !obj_size?(target, @range_view) and !moving?
  
    if 
moving? || @anime_speed || @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(1target)
      return 
      
# target not exist
    
else
    
      if 
fo_tool.is_a?(RPG::Skill) || fo_tool.is_a?(RPG::Item)
        
fo_tool.scope.between?(16) ? cpu_reactiontype(2target) : # to enemy
        
cpu_reactiontype(1target# benefical
      
else
        
# for weapon armor without target
        
cpu_reactiontype(2target)
      
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(typetarget)
    
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 == || !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 |idvalue|
      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] > 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 -= if @just_hitted 0
    
@stopped_movement -= if @stopped_movement 0
    
@doingcombo -= if @doingcombo 0
    
    
# hookshooting
    
if @hookshoting[3] > 0
      
@hookshoting[3] -= 1
      
if @hookshoting[3] == 0
        
@hookshoting = [falsefalsefalse0
        @
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 
      
@anime_speed -= 1
    end
    
# casting
    
if @user_casting[0] > 0
      
@user_casting[0] -= 1
      load_abs_tool
(@user_casting[1]) if @user_casting[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
?
    
$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 -= 
      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 -= 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 |actorri|
      
next unless actorr.id == self.actor.id
      
case member.size
      when 3
        
break if == 2
        $game_party
.swap_order(i2)
      
when 4
        
break if == 3
        
if !member[3].dead?
          
$game_party.swap_order(i3
          break
        
end
        
if !member[2].dead?  
          
$game_party.swap_order(i2
          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] == 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_idself.idself_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(7420)
          
end
          
          
@knockdown_data[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(7420) if battler.deadposing.nil?
           
end
         end
         
@knockdown_data[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_idself.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 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] -= 
        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 if @knockdown_data[0] == 0
      end
      state
.features.each do |feature|
        if 
feature.code == 22 
          
@knockdown_data[0] =10 if state.restriction == && feature.data_id==1
          next unless feature
.data_id.between?(79)
          
apply_regen_state(statefeature.data_id)
        
end
      end
    end
  end
  
  
# apply regen for hp, mp and tp
  
def apply_regen_state(statetype)
    
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 == and battler.result.hp_damage == 0
        
@colapse_time 80
        battler
.add_state(1)
        return
      
end
      type 
== pop_damage("Tp Up!") : pop_damage
    end
  end
  
  alias falcaopearl_update_anime_pattern update_anime_pattern
  def update_anime_pattern
    
return if @anime_speed || @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_idevent.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 = [falsenil]
    @
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 if f.stuck_timer 0
      f
.follower_attacktimer 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 = [falsenil]
      
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_idevent)
    @
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_idevent)
    
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 { |ss.to_i } if wtag != nil
    atag 
string_data("<start_with_armor: ")
    @
token_armor atag.split(",").map { |ss.to_i } if atag != nil
    itag 
string_data("<start_with_item: ")
    @
token_item itag.split(",").map { |ss.to_i } if itag != nil
    stag 
string_data("<start_with_skill: ")
    @
token_skill stag.split(",").map { |ss.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(selfunless
      $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 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 if @deadposee
    gain_exp
    gain_gold
    etext 
'exp: '  + @enemy.exp.to_s if @enemy.exp 0
    gtext 
' руб: ' + @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] += 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_idself.idself_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.idunless
      $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(0transform)
      
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(selfunless 
      $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 -= if @start_delay 0
    
@touch_atkdelay -= 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(00)
  
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, @idPearlKernel::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, @idPearlKernel::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)
    
Graphics.width outGraphics.height out
    
return true if screen_x.between?(out,w) and screen_y.between?(out,h)
    return 
false
  end

  def cmt_data
(comment)
    return 
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 || @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?(xy)
    return if 
$game_player.hookshoting[1]
    
falcaopearl_damage_floor(xy)
  
end
end

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

class Game_Party Game_Unit
  alias falcaopearl_swap_order swap_order
  def swap_order
(index1index2)
    
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'
        
'Вы не можете управлять компаньонами, что без сознания!')
        return
      
end
    end
    falcaopearl_swap_order
(index1index2)
  
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 
[/SPOILER]