гугл на симкрафт ругается 404...
Но вот еще 1на вырезка с direct_dmg

Скрытый текст

Код:
// 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;
  }
};
[свернуть]