Exemple #1
0
bool Creature::is_immune( const std::string &type ) const
{
    damage_type dt = dt_by_name( type );
    if( dt != DT_NULL ) {
        return is_immune_damage( dt );
    }

    return is_immune_effect( type );
}
Exemple #2
0
void Creature::deal_damage_handle_type(const damage_unit &du, body_part, int &damage, int &pain)
{
    // Handles ACIDPROOF, electric immunity etc.
    if( is_immune_damage( du.type ) ) {
        return;
    }

    // Apply damage multiplier from skill, critical hits or grazes after all other modifications.
    const int adjusted_damage = du.amount * du.damage_multiplier;
    switch (du.type) {
    case DT_BASH:
        damage += adjusted_damage;
        // add up pain before using mod_pain since certain traits modify that
        pain += adjusted_damage / 4;
        mod_moves(-rng(0, damage * 2)); // bashing damage reduces moves
        break;
    case DT_CUT:
        damage += adjusted_damage;
        pain += (adjusted_damage + sqrt(double(adjusted_damage))) / 4;
        break;
    case DT_STAB: // stab differs from cut in that it ignores some armor
        damage += adjusted_damage;
        pain += (adjusted_damage + sqrt(double(adjusted_damage))) / 4;
        break;
    case DT_HEAT: // heat damage sets us on fire sometimes
        damage += adjusted_damage;
        pain += adjusted_damage / 4;
        if( rng(0, 100) < adjusted_damage ) {
            add_effect( effect_onfire, rng(1, 3));
        }
        break;
    case DT_ELECTRIC: // Electrical damage adds a major speed/dex debuff
        damage += adjusted_damage;
        pain += adjusted_damage / 4;
        add_effect( effect_zapped, std::max( adjusted_damage, 2 ) );
        break;
    case DT_COLD: // cold damage slows us a bit and hurts less
        damage += adjusted_damage;
        pain += adjusted_damage / 6;
        mod_moves(-adjusted_damage * 80);
        break;
    case DT_ACID: // Acid damage and acid burns are super painful
        damage += adjusted_damage;
        pain += adjusted_damage / 3;
        break;
    default:
        damage += adjusted_damage;
        pain += adjusted_damage / 4;
    }
}
Exemple #3
0
void Creature::deal_damage_handle_type( const damage_unit &du, body_part bp, int &damage,
                                        int &pain )
{
    // Handles ACIDPROOF, electric immunity etc.
    if( is_immune_damage( du.type ) ) {
        return;
    }

    // Apply damage multiplier from skill, critical hits or grazes after all other modifications.
    const int adjusted_damage = du.amount * du.damage_multiplier;
    if( adjusted_damage <= 0 ) {
        return;
    }

    float div = 4.0f;

    switch( du.type ) {
        case DT_BASH:
            // Bashing damage is less painful
            div = 5.0f;
            break;

        case DT_HEAT:
            // heat damage sets us on fire sometimes
            if( rng( 0, 100 ) < adjusted_damage ) {
                add_effect( effect_onfire, rng( 1_turns, 3_turns ), bp );
            }
            break;

        case DT_ELECTRIC:
            // Electrical damage adds a major speed/dex debuff
            add_effect( effect_zapped, 1_turns * std::max( adjusted_damage, 2 ) );
            break;

        case DT_ACID:
            // Acid damage and acid burns are more painful
            div = 3.0f;
            break;

        default:
            break;
    }

    damage += adjusted_damage;
    pain += roll_remainder( adjusted_damage / div );
}