Beispiel #1
0
void absorb_t::assess_damage( dmg_e  /*heal_type*/ , // commented to remove compiler warning, uncomment if needed
                              action_state_t* s )
{
  //s -> result_amount = s -> target -> resource_gain( RESOURCE_HEALTH, s -> result_amount, 0, this );


  if ( target_specific[ s -> target ] == nullptr )
    target_specific[ s -> target ] = create_buff( s );

  if ( result_is_hit( s -> result ) )
  {
    target_specific[ s -> target ] -> trigger( 1, s -> result_amount );
    if ( sim -> log )
      sim -> out_log.printf( "%s %s applies absorb on %s for %.0f (%.0f) (%s)",
                     player -> name(), name(),
                     s -> target -> name(), s -> result_amount, s -> result_total,
                     util::result_type_string( s -> result ) );
  }
  else if ( result_is_multistrike( s -> result ) )
  {
    target_specific[ s -> target ] -> current_value += s -> result_amount;
    if ( sim -> log )
      sim -> out_log.printf( "%s %s multistrike adds to absorb on %s for %.0f (%.0f) (%s)",
                     player -> name(), name(),
                     s -> target -> name(), s -> result_amount, s -> result_total,
                     util::result_type_string( s -> result ) );
  }

  stats -> add_result( 0.0, s -> result_total, ABSORB, s -> result, s -> block_result, s -> target );
}
void action_t::execute()
{
  if ( sim -> log && ! dual ) 
  {
    log_t::output( sim, "%s performs %s (%.0f)", player -> name(), name(), 
                   player -> resource_current[ player -> primary_resource() ] );
  }

  if ( observer ) *observer = 0;

  player_buff();

  target_debuff( DMG_DIRECT );

  calculate_result();

  consume_resource();

  if ( result_is_hit() )
  {
    calculate_direct_damage();

    if ( direct_dmg > 0 )
    {
      assess_damage( direct_dmg, DMG_DIRECT );
    }
    if ( num_ticks > 0 )
    {
      if ( dot_behavior == DOT_REFRESH )
      {
        current_tick = 0;
        if ( ! ticking ) schedule_tick();
      }
      else
      {
        if ( ticking ) cancel();
        snapshot_haste = haste();
        schedule_tick();
      }
    }
  }
  else
  {
    if ( sim -> log )
    {
      log_t::output( sim, "%s avoids %s (%s)", sim -> target -> name(), name(), util_t::result_type_string( result ) );
      log_t::miss_event( this );
    }
  }

  update_ready();

  if ( ! dual ) update_stats( DMG_DIRECT );

  schedule_travel();

  if ( repeating && ! proc ) schedule_execute();

  if ( harmful ) player -> in_combat = true;
}