PHP код:
if ( additive_factors )
{
std::vector<double> sum_factors;
sum_factors.push_back( p -> buffs_blood_presence -> value() );
sum_factors.push_back( p -> buffs_bone_shield -> value() );
sum_factors.push_back( p -> buffs_desolation -> value() );
if ( school == SCHOOL_FROST || school == SCHOOL_SHADOW )
sum_factors.push_back( p -> talents.black_ice * 0.02 );
double sum = 0;
double divisor = 1.0;
for ( size_t i = 0; i < sum_factors.size(); ++i )
{
sum += sum_factors[i];
divisor *= 1.0 + sum_factors[i];
}
player_multiplier = player_multiplier * ( 1.0 + sum ) / divisor;
}
if ( school == SCHOOL_PHYSICAL )
{
player_multiplier *= 1.0 + p -> buffs_bloody_vengeance -> value();
}
player_multiplier *= 1.0 + p -> buffs_tier10_4pc_melee -> value();
}
bool death_knight_attack_t::ready()
{
death_knight_t* p = player -> cast_death_knight();
if ( ! attack_t::ready() )
return false;
if ( requires_weapon )
if ( ! weapon || weapon->group() == WEAPON_RANGED )
return false;
return group_runes( p, cost_blood, cost_frost, cost_unholy, use );
}
void death_knight_attack_t::target_debuff( int dmg_type )
{
attack_t::target_debuff( dmg_type );
death_knight_t* p = player -> cast_death_knight();
if ( dmg_type == SCHOOL_FROST )
{
target_multiplier *= 1.0 + p -> buffs_rune_of_razorice -> value();
}
}
struct scourge_strike_t : public death_knight_attack_t
{
attack_t* scourge_strike_shadow;
struct scourge_strike_shadow_t : public death_knight_attack_t
{
scourge_strike_shadow_t( player_t* player ) : death_knight_attack_t( "scourge_strike_shadow", player, SCHOOL_SHADOW, TREE_UNHOLY )
{
weapon = &( player -> main_hand_weapon );
may_miss = may_parry = may_dodge = false;
may_crit = false;
proc = true;
background = true;
trigger_gcd = 0;
additive_factors = true;
weapon_multiplier = 0;
base_attack_power_multiplier = 0;
base_dd_min = base_dd_max = 0.1;
}
virtual void target_debuff( int dmg_type )
{
death_knight_t* p = player -> cast_death_knight();
death_knight_attack_t::target_debuff( dmg_type );
target_multiplier *= p -> diseases() * 0.12 * ( 1.0 + p -> set_bonus.tier8_4pc_melee() * .2 );
}
};
scourge_strike_t( player_t* player, const std::string& options_str ) :
death_knight_attack_t( "scourge_strike", player, SCHOOL_PHYSICAL, TREE_UNHOLY )
{
death_knight_t* p = player -> cast_death_knight();
check_talent( p -> talents.scourge_strike );
option_t options[] =
{
{ NULL, OPT_UNKNOWN, NULL }
};
parse_options( options, options_str );
weapon = &( p -> main_hand_weapon );
normalize_weapon_speed = true;
static rank_t ranks[] =
{
{ 79, 4, 800, 800, 0, -15 },
{ 73, 3, 653, 653, 0, -15 },
{ 67, 2, 418, 418, 0, -15 },
{ 55, 1, 340, 340, 0, -15 },
{ 0, 0, 0, 0, 0, 0 }
};
init_rank( ranks, 55271 );
scourge_strike_shadow = new scourge_strike_shadow_t( player );
weapon_multiplier = 0.70;
cost_frost = 1;
cost_unholy = 1;
base_crit += p -> talents.subversion * 0.03;
base_crit += p -> talents.vicious_strikes * 0.03;
base_crit_bonus_multiplier *= 1.0 + ( p -> talents.vicious_strikes * 0.15 );
base_multiplier *= 1.0 + ( 0.2 * p -> talents.outbreak / 3.0 );
base_multiplier *= 1.0 + p -> set_bonus.tier10_2pc_melee() * 0.1;
if ( p -> sigils.awareness )
base_dd_adder = 420;
}
void execute()
{
death_knight_attack_t::execute();
if ( result_is_hit() )
{
death_knight_t* p = player -> cast_death_knight();
scourge_strike_shadow -> base_dd_adder = direct_dmg;
scourge_strike_shadow -> execute();
p -> buffs_sigil_virulence -> trigger();
p -> buffs_sigil_hanged_man -> trigger();
if ( p -> talents.dirge )
{
p -> resource_gain( RESOURCE_RUNIC, 2.5 * p -> talents.dirge, p -> gains_dirge );
}
if ( p -> glyphs.scourge_strike )
{
if ( p -> dots_blood_plague -> ticking() )
if ( p -> dots_blood_plague -> action -> added_ticks < 3 )
p -> dots_blood_plague -> action -> extend_duration( 1 );
if ( p -> dots_frost_fever -> ticking() )
if ( p -> dots_frost_fever -> action -> added_ticks < 3 )
p -> dots_frost_fever -> action -> extend_duration( 1 );
}
}
}
};