Код:
// ==========================================================================
// Pet Shadow Fiend
// ==========================================================================
struct shadow_fiend_pet_t : public pet_t
{
struct melee_t : public attack_t
{
melee_t( player_t* player ) :
attack_t( "melee", player, RESOURCE_NONE, SCHOOL_SHADOW )
{
weapon = &( player -> main_hand_weapon );
base_execute_time = weapon -> swing_time;
weapon_multiplier = 0;
direct_power_mod = 0.379;
base_spell_power_multiplier = 1.0;
base_attack_power_multiplier = 0.0;
base_dd_multiplier = 1.15; // Shadowcrawl
base_dd_min = 177;
base_dd_max = 209;
background = true;
repeating = true;
may_dodge = false;
may_miss = false;
may_parry = false;
may_crit = true;
may_block = true;
}
void assess_damage( double amount, int dmg_type )
{
attack_t::assess_damage( amount, dmg_type );
priest_t* p = player -> cast_pet() -> owner -> cast_priest();
p -> resource_gain( RESOURCE_MANA, p -> resource_max[ RESOURCE_MANA ] * 0.05, p -> gains_shadow_fiend );
}
};
melee_t* melee;
shadow_fiend_pet_t( sim_t* sim, player_t* owner ) :
pet_t( sim, owner, "shadow_fiend" ), melee( 0 )
{
main_hand_weapon.type = WEAPON_BEAST;
main_hand_weapon.min_dmg = 100;
main_hand_weapon.max_dmg = 100;
main_hand_weapon.damage = ( main_hand_weapon.min_dmg + main_hand_weapon.max_dmg ) / 2;
main_hand_weapon.swing_time = 1.5;
main_hand_weapon.school = SCHOOL_SHADOW;
stamina_per_owner = 0.51;
intellect_per_owner = 0.30;
}
virtual void init_base()
{
pet_t::init_base();
attribute_base[ ATTR_STRENGTH ] = 153;
attribute_base[ ATTR_AGILITY ] = 108;
attribute_base[ ATTR_STAMINA ] = 280;
attribute_base[ ATTR_INTELLECT ] = 133;
base_attack_power = -20;
initial_attack_power_per_strength = 2.0;
melee = new melee_t( this );
}
virtual double composite_spell_power( int school ) SC_CONST
{
priest_t* p = owner -> cast_priest();
double sp = p -> composite_spell_power( school );
sp -= owner -> spirit() * p -> spell_power_per_spirit;
sp -= owner -> spirit() * ( p -> buffs_glyph_of_shadow -> check() ? 0.3 : 0.0 );
return sp;
}
virtual double composite_attack_hit() SC_CONST
{
return owner -> composite_spell_hit();
}
virtual double composite_attack_expertise() SC_CONST
{
return owner -> composite_spell_hit() * 26.0 / 17.0;
}
virtual void schedule_ready( double delta_time=0,
bool waiting=false )
{
pet_t::schedule_ready( delta_time, waiting );
if ( ! melee -> execute_event ) melee -> execute();
}
virtual void interrupt()
{
pet_t::interrupt();
melee -> cancel();
}
};