void npc::decide_needs() { int needrank[num_needs]; for (int i = 0; i < num_needs; i++) needrank[i] = 20; if (weapon.is_gun()) { it_gun* gun = dynamic_cast<it_gun*>(weapon.type); needrank[need_ammo] = 5 * has_ammo(gun->ammo).size(); } if (weapon.type->id == 0 && sklevel[sk_unarmed] < 4) needrank[need_weapon] = 1; else needrank[need_weapon] = weapon.type->melee_dam + weapon.type->melee_cut + weapon.type->m_to_hit; if (!weapon.is_gun()) needrank[need_gun] = sklevel[sk_unarmed] + sklevel[sk_melee] + sklevel[sk_bashing] + sklevel[sk_cutting] - sklevel[sk_gun] * 2 + 5; needrank[need_food] = 15 - hunger; needrank[need_drink] = 15 - thirst; for (int i = 0; i < inv.size(); i++) { it_comest* food = NULL; if (inv[i].is_food()) food = dynamic_cast<it_comest*>(inv[i].type); else if (inv[i].is_food_container()) food = dynamic_cast<it_comest*>(inv[i].contents[0].type); if (food != NULL) { needrank[need_food] += food->nutr / 4; needrank[need_drink] += food->quench / 4; } } needs.clear(); int j; bool serious = false; for (int i = 1; i < num_needs; i++) { if (needrank[i] < 10) serious = true; } if (!serious) { needs.push_back(need_none); needrank[0] = 10; } for (int i = 1; i < num_needs; i++) { if (needrank[i] < 20) { for (j = 0; j < needs.size(); j++) { if (needrank[i] < needrank[needs[j]]) { needs.insert(needs.begin() + j, npc_need(i)); j = needs.size() + 1; } } if (j == needs.size()) needs.push_back(npc_need(i)); } } }
bool RangedWeapon::attack(Position pos) { if (!has_ammo()) { MessageLog::add_message("CLICK! Out of ammo!"); return false; } if (!in_range(pos)) { MessageLog::add_message("Out of range!"); return false; } player_inv->remove(ammo_type, ammo_per_turn); int dmg = dmg_strategy->attack(pos); MessageLog::add_message(get_dmg_desc(dmg)); return true; }