void Entity::attack(Entity* target) { if (!target) { debugmsg("'%s' attempted attack() on a null target."); return; } Attack att = std_attack(); action_points -= att.speed; bool you_see = GAME.player->can_sense(GAME.map, posx, posy); bool attacker_is_you = is_you(); std::string miss_verb = (attacker_is_you ? "miss" : "misses"); if (hit_roll(att.to_hit) < target->dodge_roll()) { if (you_see) { std::stringstream msg; msg << get_name_to_player() << " " << miss_verb << " " << target->get_name_to_player() << "!"; GAME.add_msg( msg.str().c_str() ); } // TODO: action_point penalty for missing? return; } Body_part bp_hit = (target->is_player() ? random_body_part_to_hit() : BODYPART_NULL); // TODO: Should total_damage be reduced by damage absorbed by armor? Damage_set damage = att.roll_damage(); for (int i = 0; i < DAMAGE_MAX; i++) { int dam = damage.get_damage(i); target->take_damage(Damage_type(i), dam, get_name_to_player(), bp_hit); } if (you_see) { std::stringstream damage_ss; damage_ss << get_name_to_player() << " "; if (attacker_is_you) { damage_ss << att.verb_first; } else { damage_ss << att.verb_third; } damage_ss << " "; if (bp_hit == BODYPART_NULL) { damage_ss << target->get_name_to_player(); } else { damage_ss << target->get_possessive() << " " << body_part_name(bp_hit); } if (target->is_you()) { damage_ss << " for " << damage.total_damage() << " damage"; } damage_ss << "!"; GAME.add_msg( damage_ss.str().c_str() ); } }
Damage_type lookup_damage_type(std::string name) { name = no_caps(name); for (int i = 0; i < DAMAGE_MAX; i++) { Damage_type ret = Damage_type(i); if (name == no_caps( damage_type_name(ret) ) ) { return ret; } } return DAMAGE_NULL; }