Код:
// Bladestorm ==============================================================
struct bladestorm_tick_t : public warrior_attack_t
{
bladestorm_tick_t( player_t* player ) :
warrior_attack_t( "bladestorm", player, SCHOOL_PHYSICAL, TREE_ARMS, false )
{
base_dd_min = base_dd_max = 1;
dual = true;
background = true;
may_crit = true;
aoe = true;
direct_tick = true;
}
virtual void execute()
{
warrior_attack_t::execute();
tick_dmg = direct_dmg;
update_stats( DMG_OVER_TIME );
}
};
struct bladestorm_t : public warrior_attack_t
{
attack_t* bladestorm_tick;
bladestorm_t( player_t* player, const std::string& options_str ) :
warrior_attack_t( "bladestorm", player, SCHOOL_PHYSICAL, TREE_ARMS )
{
warrior_t* p = player -> cast_warrior();
check_talent( p -> talents.bladestorm );
option_t options[] =
{
{ NULL, OPT_UNKNOWN, NULL }
};
parse_options( options, options_str );
aoe = true;
harmful = false;
base_cost = 25;
num_ticks = 6;
base_tick_time = 1.0;
channeled = true;
tick_zero = true;
cooldown -> duration = 90;
if ( p -> glyphs.bladestorm ) cooldown -> duration -= 15;
bladestorm_tick = new bladestorm_tick_t( p );
id = 46924;
}
virtual void tick()
{
if ( sim -> debug ) log_t::output( sim, "%s ticks (%d of %d)", name(), current_tick, num_ticks );
bladestorm_tick -> weapon = &( player -> main_hand_weapon );
bladestorm_tick -> execute();
if ( bladestorm_tick -> result_is_hit() )
{
if ( player -> off_hand_weapon.type != WEAPON_NONE )
{
bladestorm_tick -> weapon = &( player -> off_hand_weapon );
bladestorm_tick -> execute();
}
}
update_time( DMG_OVER_TIME );
}
// Bladestorm not modified by haste effects
virtual double haste() SC_CONST { return 1.0; }
};
// Heroic Strike ===========================================================
struct heroic_strike_t : public warrior_attack_t
{
heroic_strike_t( player_t* player, const std::string& options_str ) :
warrior_attack_t( "heroic_strike", player, SCHOOL_PHYSICAL, TREE_ARMS )
{
warrior_t* p = player -> cast_warrior();
option_t options[] =
{
{ NULL, OPT_UNKNOWN, NULL }
};
parse_options( options, options_str );
static rank_t ranks[] =
{
{ 76, 13, 495, 495, 0, 15 },
{ 72, 12, 432, 432, 0, 15 },
{ 70, 11, 317, 317, 0, 15 },
{ 66, 10, 234, 234, 0, 15 },
{ 60, 9, 201, 201, 0, 15 },
{ 56, 8, 178, 178, 0, 15 },
{ 0, 0, 0, 0, 0, 0 }
};
init_rank( ranks, 47450 );
background = true;
may_crit = true;
base_cost -= p -> talents.improved_heroic_strike;
base_crit += p -> talents.incite * 0.05;
trigger_gcd = 0;
weapon = &( p -> main_hand_weapon );
normalize_weapon_speed = false;
if ( p -> set_bonus.tier9_4pc_melee() ) base_crit += 0.05;
p -> active_heroic_strikes.push_back( this );
}
virtual double cost() SC_CONST
{
warrior_t* p = player -> cast_warrior();
if ( p -> buffs_glyph_of_revenge -> up() ) return 0;
return warrior_attack_t::cost();
}
virtual void execute()
{
warrior_t* p = player -> cast_warrior();
warrior_attack_t::execute();
p -> buffs_glyph_of_revenge -> expire();
if( result_is_hit() )
{
trigger_unbridled_wrath( this );
trigger_bloodsurge( this );
if ( result == RESULT_CRIT )
{
p -> buffs_tier8_2pc_melee -> trigger();
if ( p -> glyphs.heroic_strike )
{
p -> resource_gain( RESOURCE_RAGE, 10.0, p -> gains_glyph_of_heroic_strike );
}
}
}
}
};
// Bloodthirst ===============================================================
struct bloodthirst_t : public warrior_attack_t
{
bloodthirst_t( player_t* player, const std::string& options_str ) :
warrior_attack_t( "bloodthirst", player, SCHOOL_PHYSICAL, TREE_FURY )
{
warrior_t* p = player -> cast_warrior();
check_talent( p -> talents.bloodthirst );
option_t options[] =
{
{ NULL, OPT_UNKNOWN, NULL }
};
parse_options( options, options_str );
weapon = &( p -> main_hand_weapon );
weapon_multiplier = 0;
base_dd_min = base_dd_max = 1;
may_crit = true;
base_cost = 20;
base_multiplier *= 1 + p -> talents.unending_fury * 0.02;
direct_power_mod = 0.50;
cooldown -> duration = 4.0;
if ( p -> set_bonus.tier8_4pc_melee() ) base_crit += 0.10;
id = 23881;
}
virtual void execute()
{
warrior_attack_t::execute();
if( result_is_hit() ) trigger_bloodsurge( this );
}
};
// Concussion Blow ===============================================================
struct concussion_blow_t : public warrior_attack_t
{
concussion_blow_t( player_t* player, const std::string& options_str ) :
warrior_attack_t( "concussion_blow", player, SCHOOL_PHYSICAL, TREE_PROTECTION )
{
warrior_t* p = player -> cast_warrior();
check_talent( p -> talents.concussion_blow );
option_t options[] =
{
{ NULL, OPT_UNKNOWN, NULL }
};
parse_options( options, options_str );
weapon = &( p -> main_hand_weapon );
weapon_multiplier = 0;
base_dd_min = base_dd_max = 1;
may_crit = true;
base_cost = 15;
direct_power_mod = 0.375;
cooldown -> duration = 30.0;
id = 12809;
}
};