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

Coletar almas de inimigos e usar em batalha - Estilo Castlevania

Iniciado por Mr.Necklaces, 04/01/2017 às 11:32

Olá pessoal! Tudo bem? :ok:
Eu gostaria de que tivesse um item, com uma pequena chance de cair, que equipado, te dava direito á uma "habilidade" de invocação especial de um monstro como aliado, igual o do Castlevania mesmo.
Se alguém puder me ajudar, eu agradeceria muito, posso colocar os créditos no meu jogo. :clap:
Obrigado.

Olá, em qual engine seria? MV, XP ou VX?

Se for no XP ou VX, eu consigo fazer para você, só vou precisar de algum vídeo ou imagem de exemplo, pois nunca joguei Castlevania.

 Como o Resque disse, qual engine você precisa? Me disponho a fazer para o VX Ace.  :XD:

Obrigado pessoal! Por me ajudarem aqui. Eu gostaria pro VX Ace mesmo, a engine que eu uso atualmente.
Em questão dos créditos, como seria?

@Mr.Necklaces
   Para min, quero apenas o meu nick no script.

@Speed
  Eu faço ou você faz?

Citação de: Resque online 05/01/2017 às 11:00
@Mr.Necklaces
   Para min, quero apenas o meu nick no script.

@Speed
  Eu faço ou você faz?
Você que sabe. Se tiver afim de fazer por mim não tem problema algum, logo que você foi o primeiro a responder o tópico.
Abraços


05/01/2017 às 12:00 #7 Última edição: 05/01/2017 às 12:02 por Mr.Necklaces
 Tudo bem, então...
Quando o Reques mandar o script, eu faço um novo tópico pro Speed, estou precisando de uma modificação num sistema de batalha.  :XD:
Obrigado pela ajuda pessoal! :clap:

Sistema de Summon 75% pronto, segue preview abaixo.

Previsão de entrega do script no final de semana.

Obs:
     Batalha lateral por: Jet
     Menu Bars por: Syvkal
     ATB Stamina por: Fomar0153



19/01/2017 às 14:40 #9 Última edição: 19/01/2017 às 14:45 por Mr.Necklaces
Tá ficando legal ein! :ok: Só falta agora o sistema de no máximo três em batalha, e o de comer MP. Adorei tá ficando bem legal, Resque! Quado você puder mandar uma preview do script também, agradeço, estou ansioso por isso. :wow:
Boa sorte! Novamente agradeço pela ajuda!

Quando vc se referiu ao sistema de "comer MP", foi aquele que você me falou? se for isso, você pode ver no vídeo que quando o summon ataca, o MP do invocador é consumido.

Sobre o sistema ter o máximo de três em batalha, eu posso alterar o meu script fazendo que a "barra" do summon fique em um lugar diferente e assim não ocuparia slots da sua party e você poderia ter até quatro membros em batalha no grupo, cada um invocando 1 (um) summon no máximo.

Caso deseje essas modificações, eu posso fazer, porém o prazo irá aumentar.

:ok:

19/01/2017 às 15:01 #11 Última edição: 19/01/2017 às 15:08 por Mr.Necklaces
Ah, desculpa não vi ele comendo MP. Esquece isso então. O negocio de máximo três é só pra poder invocar no máximo três em uma batalha, não precisa de outra barra, aliás no meu jogo apenas um personagem joga, então não preciso de nenhuma aplicação pra party, as invocações foram uma mirabolância pra substituir isso.  :cool:
O que que quero dizer é tipo, só pode usar esse item uma vez na batalha, então precisa de mais, precisa fazer outras invocações, e no máximo três invocações em uma batalha.
Ah, e uma dúvida:
O monstro é controlado por uma I.A. básica ou só repete o que o jogador faz?

19/01/2017 às 15:34 #12 Última edição: 19/01/2017 às 15:36 por Resque
Ele tem uma AI, no caso usa o auto-battle (A mesma de um monstro inimigo), mas está assim porque eu defini, caso queira consigo deixar ele controlável igual um outro integrante na party, e assim, você que controlaria as opções de ATK, guard, skill etc...

 :lol: Não valeu, era assim mesmo que eu queria no auto-battle. Obrigado

27/01/2017 às 15:20 #14 Última edição: 30/01/2017 às 22:35 por Resque
Script finalizado.

Para que o script funcione, você precisa definir algumas notes no database.

Na aba Items, você precisa criar um item novo, da mesma forma que eu fiz com o pergaminho, e adicionar a nota <summon><id: 1>, onde o id é o ID no monstro na aba Enemies.

Ainda dentro de Items, você deve escolher em Scope, a seguinte opção: One Ally, e na opção Animation, você deverá escolher o efeito que você quer que apareça quando o summon for encovado.

Ex:


Na aba Skills, você criará uma nova Habilidade para remover o seu Summon.
Para isso, basta adicionar a note: <unsummon> e deixa a opção Scope: none.

Ex:

As opções de configuração estão dentro do script.

Caso tenha dúvidas ou encontre algum problema, me avise.

Divirta-se


Resque Summoner System

# Sistema:    Resque Summoner System
# Autor:      Resque
# Email:      rogessonb@gmail.com
# Data:       27/01/2017
# Engine:     RPG MAKER Ace VX
# Linguagem:  RGSS3
# Utilização: Livre, desde que devidamente creditado.


# Descrição
# Invoca um monstro para lutar ao seu lado do grupo.

######################### Configuração #########################

module ResqueSummon
  # Level máximo que o summon pode ter.
  # Valor mínimo = 1
  SUMMON_MAX_LEVEL = 99

  # Opção de batalha do summon.
  # Caso o valor for (true), o summon atacará e
  # usará habilidades sozinho.
  # Caso o valor for (false), você controlará as ações.
  AUTO_BATTLE = true

  # Opção de consumir MP do invocador do summon quando o summon
  # executar alguma ação (ataque, skill, etc).
  # Para não consumir MP, o valor deverá ser (false).
  USE_MP_TO_KEEP_ALIVE = true

  # Valor de drenagem de mp caso a opção acima seja (true)
  # O invocador perderá uma porcentagem de MP quando o summon
  # executar uma ação.
  # Ex de valores:
  # 0.6 = 0,6% de drenagem
  # 1.0 = 1% de drenagem
  # 5.6 = 5,6% de drenagem
  # 70.2 = 70.2% de drenagem
  DRAIN_MP_PERCENTAGE = 0.6

  # Quantidade máxima de membros em batalha.
  # O summon será invocado apenas a quantidade de
  # de membros no grupo for menor do que o valor definido.
  MAX_ACTOR_SIZE = 4
end


######################### Script #########################


class Game_Party < Game_Unit
  attr_accessor :actors

  alias resque_initialize initialize
  def initialize
    resque_initialize
    @summons = []
  end

  def add_actor(actor_id)
    @actors.push(actor_id) unless @actors.include?(actor_id)
    $game_player.refresh
    $game_map.need_refresh = true
  end

  def add_summon(monster_id, actor)
    summon = Game_Summon.new(monster_id, actor)
    @actors << summon
    @summons << summon
    $game_player.refresh
    $game_map.need_refresh = true
  end

  def remove_summon
    return if @summons.empty?

    @actors.pop
    $game_player.refresh
    $game_map.need_refresh = true
  end

  def clear_all_summons
    @actors.collect {|actor| @summons << actor if actor.is_a?(Game_Summon) }
    @summons.each { |summon| @actors.delete(summon) }

    $game_player.refresh
    $game_map.need_refresh = true
  end
end

class Scene_Battle < Scene_Base
  def on_skill_ok
    @skill = @skill_window.item

    if @skill.note.match(/<unsummon>/)
      BattleManager.actor.input.set_skill(@skill.id)
      BattleManager.actor.last_skill.object = @skill
      @skill_window.hide
      $game_party.remove_summon
      next_command
    end

    BattleManager.actor.input.set_skill(@skill.id)
    BattleManager.actor.last_skill.object = @skill
    if !@skill.need_selection?
      @skill_window.hide
      next_command
    elsif @skill.for_opponent?
      select_enemy_selection
    else
      select_actor_selection
    end
  end

  def on_item_ok
    @item = @item_window.item
    BattleManager.actor.input.set_item(@item.id)

    if @item.note.match(/<summon>/)
      monster_id = @item.note.scan(/[0-9]+/).first.to_i
      $game_party.add_summon(monster_id, BattleManager.actor)
      @item_window.hide
      next_command

      return $game_party.last_item.object = @item
    end

    if !@item.need_selection?
      @item_window.hide
      next_command
    elsif @item.for_opponent?
      select_enemy_selection
    else
      select_actor_selection
    end
    $game_party.last_item.object = @item
  end
end

class Game_Actors
  def [](actor_id)
    if actor_id.is_a? Game_Summon
      return actor_id
    end

    return nil unless $data_actors[actor_id]
    @data[actor_id] ||= Game_Actor.new(actor_id)
  end
end

class Game_Summon < Game_Actor
  def initialize(monster_id, master)
    @master         = master
    @last_skill     = Game_BaseItem.new

    super(monster_id)
    setup(monster_id)
  end

  def setup(monster_id)
    @actor_id = monster_id
    @name = actor.name
    @enemy = $data_enemies[monster_id]
    @battler_name = @enemy.battler_name
    @nickname = @battler_name
    init_graphics
    @class_id = 1
    @level = @master.level
    @exp = {}
    @equips = []
    init_exp
    init_skills
    clear_param_plus
    recover_all
  end

  def use_sprite?
    return true
  end

  def actor
    $data_enemies[@actor_id]
  end

  def max_level
    ResqueSummon::SUMMON_MAX_LEVEL
  end

  def auto_battle?
    ResqueSummon::AUTO_BATTLE
  end

  def init_skills
    @skills = []
    @enemy.actions.each do |action|
      learn_skill(action.skill_id)
    end
  end

  def init_graphics
    @character_name = @name
    @character_index = 3
    @face_name = 0
    @face_index = 0
  end

  def make_damage_value(user, item)
    value = item.damage.eval(user, self, $game_variables)
    value *= item_element_rate(user, item)
    value *= pdr if item.physical?
    value *= mdr if item.magical?
    value *= rec if item.damage.recover?
    value = apply_critical(value) if @result.critical
    value = apply_variance(value, item.damage.variance)
    value = apply_guard(value)

    if  user.is_a?(Game_Summon)
      drain_master_hp
      check_master_mp
    end

    @result.make_damage(value.to_i, item)
  end

  private

  def check_master_mp
    $game_party.clear_all_summons if @master.mp <= 0 && ResqueSummon::USE_MP_TO_KEEP_ALIVE
  end

  def drain_master_hp
    @master.mp = drain_rate
  end

  def drain_rate
    (@master.mp - (@master.mp * ResqueSummon::DRAIN_MP_PERCENTAGE / 100)).to_i
  end
end

module BattleManager
  def self.process_victory
    play_battle_end_me
    replay_bgm_and_bgs
    $game_message.add(sprintf(Vocab::Victory, $game_party.name))
    $game_party.clear_all_summons
    display_exp
    gain_gold
    gain_drop_items
    gain_exp
    SceneManager.return
    battle_end(0)
    return true
  end
end

class Window_ItemList < Window_Selectable
  def enable?(item)
    return false if item.note.match(/<summon>/) && $game_party.actors.size >= ResqueSummon::MAX_ACTOR_SIZE
    $game_party.usable?(item)
  end
end


Jet's Viewed Battle System
#===============================================================================
# Jet's Viewed Battle System
# By Jet10985(Jet)
#===============================================================================
# This script will add actor sprites into the battle scene.
# This script has: 10 customization options.
#===============================================================================
# Overwritten Methods:
# Game_Actor: use_sprite?, screen_x, screen_y
# Sprite_Battler: revert_to_normal
# Scene_Battle: show_attack_animation
#-------------------------------------------------------------------------------
# Aliased methods:
# Game_Enemy: screen_x, screen_y
# Sprite_Battler: update_origin, update_bitmap
# Window_BattleEnemy: update
# Window_BattleActor: update
# Window_ActorCommand: update
#===============================================================================
=begin
Set an enemy's attack animation by using this in their notebox:

<anim: 50>

Replace 50 with the animation id.
--------------------------------------------------------------------------------
You may use a sprite for a monster instead of a regular battler by using this
notetag in the monster's notebox:

<sprite: ImageName, 0>

Replace ImageName with the name of the spritesheet, and 0 with the index on the
spritesheet you want the monster to use.
=end

module Jet
  module VBS

    # Which direction do actors face on the field? There are 4 options:
    # :up, :down, :left, or :right. Actor's will direction chosen.
    ACTOR_ORIENTATION = :left

    # This will make it so actor's are centered on the screen instead of being
    # placed in pre-determined lines using START_POINT and SPACE_DIFFERENCE.
    CENTER_ACTORS = false

    # This is the x and y starting point for actors. This option may take one of
    # 2 functions. If CENTER_ACTORS is true, and ACTOR_ORIENTATION is either
    # :left, or :right, then only the x value will be used as where to center
    # the actors. If it is :down or :up, only the y value will be used.
    # If CENTER_ACTORS is false, then this is where actor's will begin to be
    # placed on screen.
    START_POINT = [345, 200]

    # This is how much space is between each actor on the field.
    SPACE_DIFFERENCE = 27

    # If you're using the :left or :right view, this will push each
    # subsequent actor back by a certain number of pixels, to avoid having
    # a straight line.
    SIDEVIEW_PUSH_BACK = 18

    # Do you want to reverse the direction and field during an ambush?
    # (This is when enemies surprise the player and get the first turn)
    REVERSE_FIELD_FOR_AMBUSH = true

    # this is how far the actor will move forward when they are selection an
    # action, as well as executing it.
    SLIDE_AMOUNT = 127

    # This is how far the actor will slide each frame until they reach their
    # goal of SLIDE_FORWARD. Best used when this is a factor of SLIDE_FORWARD.
    FRAME_SLIDE = 20

    # During selecting an actor command, and during selecting an enemy target,
    # would you like the selected character to flash?
    DO_FLASH = true

    # These are state-based sprite changes. If the actor has one of these states
    # then the game will search for a sprite of the character's regular sprite
    # name with the special state tag appended to it. So if Jimmy's sprite
    # name was $Jimmy, and he had poison inflcted on him, and poison's id was
    # listed here as ["_poison", 0], it would change Jimmy's in-battle sprite
    # to $Jimmy_poison at the first sprite index.
    STATE_SPRITES = {

      1 => ["", 0],
      2 => ["", 0]

    }

    # Do not touch this option.
    DIR_ORIENT = {right: 6, left: 4, down: 2, up: 8}[ACTOR_ORIENTATION]

  end
end

#===============================================================================
# DON'T EDIT FURTHER UNLESS YOU KNOW WHAT TO DO.
#===============================================================================
class Integer

  def even?
    self % 2 == 0
  end

  def odd?
    !even?
  end
end

class RPG::Enemy

  def animation
    (f = note.match(/<anim:[ ]*(\d+)>/i)) ? f[1].to_i : 1
  end

  def battle_sprite
    (f = note.match(/<sprite:[ ]*(.+),[ ]*(\d+)>/i)) ? f[1..2] : false
  end
end

module BattleManager

  class << self

    alias jet3845_on_encounter on_encounter
    def on_encounter(*args, &block)
      jet3845_on_encounter(*args, &block)
      @true_surprise = @surprise
    end
  end

  def self.true_surprise
    @true_surprise ||= false
  end

  def self.player_dir
    if @true_surprise && Jet::VBS::REVERSE_FIELD_FOR_AMBUSH
      return 10 - Jet::VBS::DIR_ORIENT
    else
      return Jet::VBS::DIR_ORIENT
    end
  end
end

class Game_Actor

  def use_sprite?
    true
  end

  def screen_x
    if [8, 2].include?(BattleManager.player_dir)
      if Jet::VBS::CENTER_ACTORS
        x = Graphics.width / 2
        x -= 16
        x += Jet::VBS::SPACE_DIFFERENCE / 2 if $game_party.members.size.even?
        x -= ($game_party.members.size / 2 - index) * Jet::VBS::SPACE_DIFFERENCE
        return x
      else
        return Jet::VBS::START_POINT[0] + Jet::VBS::SPACE_DIFFERENCE * index
      end
    end
    return Jet::VBS::START_POINT[0]
  end

  alias jet3745_screen_x screen_x
  def screen_x(*args, &block)
    x = jet3745_screen_x(*args, &block)
    case BattleManager.player_dir
    when 4
      x += Jet::VBS::SIDEVIEW_PUSH_BACK * index
    when 6
      x -= Jet::VBS::SIDEVIEW_PUSH_BACK * index
    end
    return x if !Jet::VBS::REVERSE_FIELD_FOR_AMBUSH
    x = Graphics.width - x if BattleManager.true_surprise && [6, 4].include?(BattleManager.player_dir)
    x
  end

  def screen_y
    if [6, 4].include?(BattleManager.player_dir)
      if Jet::VBS::CENTER_ACTORS
        y = Graphics.height / 2
        y -= 16
        y += Jet::VBS::SPACE_DIFFERENCE / 2 if $game_party.members.size.even?
        y -= ($game_party.members.size / 2 - index) * Jet::VBS::SPACE_DIFFERENCE
        return y
      else
        return Jet::VBS::START_POINT[1] + Jet::VBS::SPACE_DIFFERENCE * index
      end
    end
    return Jet::VBS::START_POINT[1]
  end

  alias jet3745_screen_y screen_y
  def screen_y(*args, &block)
    y = jet3745_screen_y(*args, &block)
    return y if !Jet::VBS::REVERSE_FIELD_FOR_AMBUSH
    y = Graphics.height - y if BattleManager.true_surprise && [8, 2].include?(BattleManager.player_dir)
    y
  end

  def screen_z
    101 + index
  end

  alias jet3745_character_name character_name
  def character_name(*args, &block)
    name = jet3745_character_name(*args, &block)
    return name unless SceneManager.scene_is?(Scene_Battle)
    states.sort {|a, b| b.priority <=> a.priority }.each {|a|
      if (add = Jet::VBS::STATE_SPRITES[a.id])
        return name + add[0]
      end
    }
    return name
  end

  alias jet3745_character_index character_index
  def character_index(*args, &block)
    index = jet3745_character_index(*args, &block)
    return index unless SceneManager.scene_is?(Scene_Battle)
    states.sort {|a, b| b.priority <=> a.priority }.each {|a|
      if (add = Jet::VBS::STATE_SPRITES[a.id])
        return index + add[1]
      end
    }
    return index
  end
end

class Game_Enemy

  alias jet3745_screen_x screen_x
  def screen_x(*args, &block)
    x = jet3745_screen_x(*args, &block)
    return x if !Jet::VBS::REVERSE_FIELD_FOR_AMBUSH
    x = Graphics.width - x if BattleManager.true_surprise && [6, 4].include?(BattleManager.player_dir)
    x
  end

  alias jet3745_screen_y screen_y
  def screen_y(*args, &block)
    y = jet3745_screen_y(*args, &block)
    return y if !Jet::VBS::REVERSE_FIELD_FOR_AMBUSH
    y = Graphics.height - y if BattleManager.true_surprise && [8, 2].include?(BattleManager.player_dir)
    y
  end

  def atk_animation_id1
    enemy.animation
  end

  def atk_animation_id2
    0
  end

  def bat_sprite?
    !!enemy.battle_sprite
  end

  def character_name
    enemy.battle_sprite[0]
  end

  def character_index
    enemy.battle_sprite[1].to_i
  end

  alias jet3745_character_name character_name
  def character_name(*args, &block)
    name = jet3745_character_name(*args, &block)
    return name unless SceneManager.scene_is?(Scene_Battle)
    states.sort {|a, b| b.priority <=> a.priority }.each {|a|
      if (add = Jet::VBS::STATE_SPRITES[a.id])
        return name + add[0]
      end
    }
    return name
  end

  alias jet3745_character_index character_index
  def character_index(*args, &block)
    index = jet3745_character_index(*args, &block)
    return index unless SceneManager.scene_is?(Scene_Battle)
    states.sort {|a, b| b.priority <=> a.priority }.each {|a|
      if (add = Jet::VBS::STATE_SPRITES[a.id])
        return index + add[1]
      end
    }
    return index
  end
end

class Sprite_Battler

  alias jet3835_update_bitmap update_bitmap
  def update_bitmap(*args, &block)

    jet3835_update_bitmap(*args, &block) if @battler.enemy?
    if @battler.actor? || @battler.bat_sprite?
      actor_update_bitmap
    end
    #elsif @battler.enemy?
    #  jet3835_update_bitmap(*args, &block)
    #end
  end

  def actor_update_bitmap
    @timer ||= 0
    @index ||= 1
    @char_index ||= @battler.character_index
    @back_time ||= false
    index = @index
    char_index = @char_index
    @timer += 1
    (@index += (@back_time ? -1 : 1); @timer = 0) if @timer == 19
    if @index == 3
      @back_time = true
      @index = 1
    elsif @index == -1
      @back_time = false
      @index = 1
    end
    @char_index = @battler.character_index
  
    if @battler.is_a?(Game_Summon)
      self.bitmap = Cache.battler(@battler.battler_name, 0)
      self.mirror = true
      return
    else
      bitmap = Cache.character(@battler.character_name)
    end

    return if bitmap == @bitmap && index == @index && @char_index == char_index
    self.bitmap = bitmap
    sign = @battler.character_name[/^[\!\$]./]
    if sign && sign.include?('$')
      cw = bitmap.width / 3
      ch = bitmap.height / 4
    else
      cw = bitmap.width / 12
      ch = bitmap.height / 8
    end
    dir = BattleManager.player_dir
    dir = 10 - dir if @battler.is_a?(Game_Enemy)
    sx = (@battler.character_index % 4 * 3) * cw + (cw * @index)
    sy = (@battler.character_index / 4 * 4 + (dir - 2) / 2) * ch
    self.src_rect.set(sx, sy, cw, ch)
  end

  alias jet3745_update_origin update_origin
  def update_origin(*args, &block)

    jet3745_update_origin(*args, &block) if @battler.enemy?
    if @battler.actor? || @battler.bat_sprite?
      actor_update_origin
    end
  end

  def actor_update_origin
    self.ox = (@actor_ox ||= 0)
    self.oy = (@actor_oy ||= 0)
  end

  def revert_to_normal
    self.blend_type = 0
    self.color.set(0, 0, 0, 0)
    self.opacity = 255
    if bitmap && @battler && !@battler.actor? && !@battler.bat_sprite?
      self.ox = bitmap.width / 2 if bitmap
      self.src_rect.y = 0
    end
  end

  def slide_forward(amount = Jet::VBS::SLIDE_AMOUNT, frame = Jet::VBS::FRAME_SLIDE)
    dir = BattleManager.player_dir
    dir = 10 - dir if @battler.is_a?(Game_Enemy)
    case dir
    when 2
      affect = :@actor_oy
      frame *= -1
    when 4
      affect = :@actor_ox
      amount *= -1
    when 6
      affect = :@actor_ox
      frame *= -1
    when 8
      affect = :@actor_oy
      amount *= -1
    end
    orig_amount = amount
    until (orig_amount < 0 ? amount >= 0 : amount <= 0)
      instance_variable_set(affect, instance_variable_get(affect) + frame)
      amount += frame
      SceneManager.scene.spriteset.update
      Graphics.update
    end
  end

  def slide_backward(amount = Jet::VBS::SLIDE_AMOUNT, frame = Jet::VBS::FRAME_SLIDE)
    dir = BattleManager.player_dir
    dir = 10 - dir if @battler.is_a?(Game_Enemy)
    case dir
    when 2
      affect = :@actor_oy
      amount *= -1
    when 4
      affect = :@actor_ox
      frame *= -1
    when 6
      affect = :@actor_ox
      amount *= -1
    when 8
      affect = :@actor_oy
      frame *= -1
    end
    orig_amount = amount
    until (orig_amount < 0 ? amount >= 0 : amount <= 0)
      instance_variable_set(affect, instance_variable_get(affect) + frame)
      amount += frame
      SceneManager.scene.spriteset.update
      Graphics.update
    end
  end
end

class Scene_Battle

  attr_reader :spriteset

  def show_attack_animation(targets)
    show_normal_animation(targets, @subject.atk_animation_id1, false)
    show_normal_animation(targets, @subject.atk_animation_id2, true)
  end

  alias jet3746_use_item use_item
  def use_item(*args, &block)
    sprite = @spriteset.battler_to_sprite(@subject)
    if (@subject.actor? || @subject.bat_sprite?) && !@subject.current_action.guard?
      sprite.slide_forward
    end
    jet3746_use_item(*args, &block)
    if (@subject.actor? || @subject.bat_sprite?) && !@subject.current_action.guard?
      sprite.slide_backward
    end
  end
end

class Spriteset_Battle

  def battler_to_sprite(actor)
    battler_sprites.each {|a|
      return a if a.battler == actor
    }
    return false
  end
end

class Window_BattleEnemy

  alias jet3745_update update
  def update(*args, &block)
    jet3745_update(*args, &block)
    if self.active && Jet::VBS::DO_FLASH
      if Object.const_defined?(:Mouse)
        $game_troop.alive_members.each {|a|
          img = SceneManager.scene.spriteset.battler_to_sprite(a)
          x = img.x - img.ox
          y = img.y - img.oy
          if Mouse.area?(x, y, img.src_rect.width, img.src_rect.height)
            self.index = a.index
          end
        }
      end
      active_troop = $game_troop.alive_members[@index]
      sprite = SceneManager.scene.spriteset.battler_to_sprite(active_troop)
      sprite.start_effect(:whiten) if !sprite.effect?
    end
  end
end

class Window_BattleActor

  alias jet3745_update update
  def update(*args, &block)
    jet3745_update(*args, &block)
    if self.active && Jet::VBS::DO_FLASH
      if Object.const_defined?(:Mouse)
        $game_party.alive_members.each {|a|
          img = SceneManager.scene.spriteset.battler_to_sprite(a)
          x = img.x - img.ox
          y = img.y - img.oy
          if Mouse.area?(x, y, img.src_rect.width, img.src_rect.height)
            self.index = a.index
          end
        }
      end
      active_troop = $game_party.members[@index]
      sprite = SceneManager.scene.spriteset.battler_to_sprite(active_troop)
      sprite.start_effect(:whiten) if !sprite.effect?
    end
  end
end

class Window_ActorCommand

  alias jet3745_update update
  def update(*args, &block)
    jet3745_update(*args, &block)
    if self.active && Jet::VBS::DO_FLASH
      active_troop = @actor
      sprite = SceneManager.scene.spriteset.battler_to_sprite(active_troop)
      sprite.start_effect(:whiten) if !sprite.effect?
    end
  end
end

class Game_Action
  def guard?
    item == $data_skills[subject.guard_skill_id] || item.note.match(/<summon>/)
  end
end