// ================================================== ========================
// 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 );
}
};
[свернуть]