// ==================================================  ========================
// Pet Fire Elemental
// ==================================================  ========================
struct fire_elemental_pet_t : public pet_t
{
  struct travel_t : public action_t
  {
    travel_t( player_t* player ) : action_t( ACTION_OTHER, "travel", player ) {}
    virtual void execute() { player -> distance = 1; }
    virtual double execute_time() SC_CONST { return ( player -> distance / 10.0 ); }
    virtual bool ready() { return ( player -> distance > 1 ); }
  };
  struct fire_shield_t : public spell_t
  {
    fire_shield_t( player_t* player ) :
      spell_t( "fire_shield", player, RESOURCE_MANA, SCHOOL_FIRE )
    {
      aoe = true;
      background = true;
      repeating = true;
      may_crit = true;
      base_execute_time = 3.0;
      base_dd_min = base_dd_max = 96;
      direct_power_mod = 0.015;
      id = 12470;
    };
    virtual double total_multiplier() SC_CONST { return ( player -> distance > 1 ) ? 0.0 : spell_t::total_multiplier(); }
  };
  struct fire_nova_t : public spell_t
  {
    fire_nova_t( player_t* player ) :
      spell_t( "fire_nova", player, RESOURCE_MANA, SCHOOL_FIRE )
    {
      aoe = true;
      may_crit = true;
      base_cost = 207;
      base_execute_time = 2.5; // Really 2.0sec, but there appears to be a 0.5sec lag following.
      base_dd_min = 960;
      base_dd_max = 1000;
      direct_power_mod = 0.50;
    };
  };
  struct fire_blast_t : public spell_t
  {
    fire_blast_t( player_t* player ) :
      spell_t( "fire_blast", player, RESOURCE_MANA, SCHOOL_FIRE )
    {
      may_crit = true;
      base_cost = 276;
      base_execute_time = 0;
      base_dd_min = 750;
      base_dd_max = 800;
      direct_power_mod = 0.20;
      cooldown -> duration = 4.0;
      id = 57984;
    };
  };
  struct fire_melee_t : public attack_t
  {
    fire_melee_t( player_t* player ) :
      attack_t( "fire_melee", player, RESOURCE_NONE, SCHOOL_FIRE )
    {
      may_crit = true;
      base_dd_min = base_dd_max = 180;
      base_execute_time = 2.0;
      direct_power_mod = 1.0;
      base_spell_power_multiplier = 0.60;
      base_attack_power_multiplier = base_execute_time / 14;
    }
  };
  spell_t* fire_shield;
  fire_elemental_pet_t( sim_t* sim, player_t* owner ) : pet_t( sim, owner, "fire_elemental", true /*GUARDIAN*/ ) {}
  virtual void init_base()
  {
    pet_t::init_base();
    resource_base[ RESOURCE_HEALTH ] = 0; // FIXME!!
    resource_base[ RESOURCE_MANA   ] = 4000;
    health_per_stamina = 10;
    mana_per_intellect = 15;
    // Modeling melee as a foreground action since a loose model is Nova-Blast-Melee-repeat.
    // The actual actions are not really so deterministic, but if you look at the entire spawn time,
    // you will see that there is a 1-to-1-to-1 distribution (provided there is sufficient mana).
    action_list_str = "travel/sequence,name=attack:fire_nova:fire_blast:fire_mel  ee/restart_sequence,name=attack,moving=0";
    fire_shield = new fire_shield_t( this );
  }
  virtual int primary_resource() SC_CONST { return RESOURCE_MANA; }
  virtual void regen( double periodicity )
  {
    if ( ! recent_cast() )
    {
      resource_gain( RESOURCE_MANA, 10.66 * periodicity ); // FIXME! Does regen scale with gear???
    }
  }
  virtual void summon( double duration=0 )
  {
    pet_t::summon();
    fire_shield -> execute();
  }
  virtual double composite_attack_power() SC_CONST
  {
    return owner -> composite_attack_power_multiplier() * owner -> composite_attack_power();
  }
  virtual double composite_spell_power( int school ) SC_CONST
  {
    return owner -> composite_spell_power_multiplier() * owner -> composite_spell_power( school );
  }
  virtual action_t* create_action( const std::string& name,
                                   const std::string& options_str )
  {
    if ( name == "travel"      ) return new travel_t     ( this );
    if ( name == "fire_nova"   ) return new fire_nova_t  ( this );
    if ( name == "fire_blast"  ) return new fire_blast_t ( this );
    if ( name == "fire_melee"  ) return new fire_melee_t ( this );
    return pet_t::create_action( name, options_str );
  }
};
[свернуть]