Из симкрафта, функция для вычисления этого action_t::direct_damage
Код:
// action_t::calculate_direct_damage =========================================
double action_t::calculate_direct_damage()
{
direct_dmg = resisted_dmg = blocked_dmg = 0;
double base_direct_dmg = sim -> range( base_dd_min, base_dd_max );
if ( base_direct_dmg == 0 ) return 0;
direct_dmg = base_direct_dmg + base_dd_adder + player_dd_adder + target_dd_adder;
if ( weapon_multiplier > 0 )
{
// x% weapon damage + Y
// e.g. Obliterate, Shred, Backstab
direct_dmg += calculate_weapon_damage();
direct_dmg *= weapon_multiplier;
// OH penalty
if ( weapon && weapon -> slot == SLOT_OFF_HAND )
direct_dmg *= 0.5;
}
direct_dmg += direct_power_mod * total_power();
direct_dmg *= total_dd_multiplier();
double init_direct_dmg = direct_dmg;
if ( result == RESULT_GLANCE )
{
double delta_skill = ( sim -> target -> level - player -> level ) * 5.0;
if ( delta_skill < 0.0 )
delta_skill = 0.0;
double max_glance = 1.3 - 0.03 * delta_skill;
if ( max_glance > 0.99 )
max_glance = 0.99;
else if ( max_glance < 0.2 )
max_glance = 0.20;
double min_glance = 1.4 - 0.05 * delta_skill;
if ( min_glance > 0.91 )
min_glance = 0.91;
else if ( min_glance < 0.01 )
min_glance = 0.01;
if ( min_glance > max_glance )
{
double temp = min_glance;
min_glance = max_glance;
max_glance = temp;
}
direct_dmg *= sim -> range( min_glance, max_glance ); // 0.75 against +3 targets.
}
else if ( result == RESULT_CRIT )
{
direct_dmg *= 1.0 + total_crit_bonus();
}
if ( ! binary )
{
resisted_dmg = resistance() * direct_dmg;
direct_dmg -= resisted_dmg;
}
if ( result == RESULT_BLOCK )
{
blocked_dmg = sim -> target -> block_value;
direct_dmg -= blocked_dmg;
if ( direct_dmg < 0 ) direct_dmg = 0;
}
if ( sim -> debug )
{
log_t::output( sim, "%s dmg for %s: dd=%.0f i_dd=%.0f b_dd=%.0f mod=%.2f power=%.0f b_mult=%.2f p_mult=%.2f t_mult=%.2f",
player -> name(), name(), direct_dmg, init_direct_dmg, base_direct_dmg, direct_power_mod,
total_power(), base_multiplier * base_dd_multiplier, player_multiplier, target_multiplier );
}
return direct_dmg;
}