void Creature::deal_melee_hit(Creature *source, int hit_spread, bool critical_hit, const damage_instance &dam, dealt_damage_instance &dealt_dam) { damage_instance d = dam; // copy, since we will mutate in block_hit body_part bp_hit = select_body_part(source, hit_spread); block_hit(source, bp_hit, d); // Bashing crit if (critical_hit) { int turns_stunned = (d.type_damage(DT_BASH) + hit_spread) / 20; if (turns_stunned > 6) { turns_stunned = 6; } if (turns_stunned > 0) { add_effect("stunned", turns_stunned); } } // Stabbing effects int stab_moves = rng(d.type_damage(DT_STAB) / 2, d.type_damage(DT_STAB) * 1.5); if (critical_hit) { stab_moves *= 1.5; } if (stab_moves >= 150) { if (is_player() && (!g->u.has_trait("LEG_TENT_BRACE") || g->u.footwear_factor() == 1 || (g->u.footwear_factor() == .5 && one_in(2))) ) { // can the player force their self to the ground? probably not. source->add_msg_if_npc( m_bad, _("<npcname> forces you to the ground!")); } else { source->add_msg_player_or_npc( m_good, _("You force %s to the ground!"), _("<npcname> forces %s to the ground!"), disp_name().c_str() ); } if (!g->u.has_trait("LEG_TENT_BRACE") || g->u.footwear_factor() == 1 || (g->u.footwear_factor() == .5 && one_in(2))) { add_effect("downed", 1); mod_moves(-stab_moves / 2); } } else { mod_moves(-stab_moves); } on_gethit(source, bp_hit, d); // trigger on-gethit events dealt_dam = deal_damage(source, bp_hit, d); dealt_dam.bp_hit = bp_hit; }
int Creature::deal_melee_attack(Creature *source, int hitroll, bool critical_hit, const damage_instance &dam, dealt_damage_instance &dealt_dam) { int dodgeroll = dodge_roll(); int hit_spread = hitroll - dodgeroll; bool missed = hit_spread <= 0; damage_instance d = dam; // copy, since we will mutate in block_hit if (missed) { return hit_spread; } //bool critical_hit = hit_spread > 30; //scored_crit(dodgeroll); body_part bp_hit; int side = rng(0, 1); int hit_value = hit_spread + dice(10, 6) - 35; if (hit_value >= 40) { bp_hit = bp_eyes; } else if (hit_value >= 30) { bp_hit = bp_head; } else if (hit_value >= 5) { bp_hit = bp_torso; } else if (one_in(4)) { bp_hit = bp_legs; } else { bp_hit = bp_arms; } // Bashing crit if (critical_hit) { int turns_stunned = (d.type_damage(DT_BASH) + hit_spread) / 20; if (turns_stunned > 6) { turns_stunned = 6; } if (turns_stunned > 0) { add_effect("stunned", turns_stunned); } } // Stabbing effects int stab_moves = rng(d.type_damage(DT_STAB) / 2, d.type_damage(DT_STAB) * 1.5); if (critical_hit) { stab_moves *= 1.5; } if (stab_moves >= 150) { if (is_player()) { // can the player force their self to the ground? probably not. g->add_msg_if_npc(source, _("<npcname> forces you to the ground!")); } else { g->add_msg_player_or_npc(source, _("You force %s to the ground!"), _("<npcname> forces %s to the ground!"), disp_name().c_str() ); } add_effect("downed", 1); mod_moves(-stab_moves / 2); } else { mod_moves(-stab_moves); } block_hit(bp_hit, side, d); on_gethit(source, bp_hit, d); // trigger on-gethit events dealt_dam = deal_damage(source, bp_hit, side, d); dealt_dam.bp_hit = bp_hit; /* TODO: add grabs n shit back in if (allow_special && technique.grabs) { // TODO: make this depend on skill (through grab_resist stat) again if (t.get_grab_resist() > 0 && dice(t.get_dex() , 12) > dice(get_dex(), 10)) { g->add_msg_player_or_npc(&t, _("You break the grab!"), _("<npcname> breaks the grab!")); } else if (!unarmed_attack()) { // Move our weapon to a temp slot, if it's not unarmed item tmpweap = remove_weapon(); melee_attack(t, false); // False means a second grab isn't allowed weapon = tmpweap; } else melee_attack(t, false); // False means a second grab isn't allowed } */ return hit_spread; }