| 1238 | } |
| 1239 | |
| 1240 | StateRef<AEquipmentType> Agent::getDominantItemInHands(GameState &state, |
| 1241 | StateRef<AEquipmentType> itemLastFired) const |
| 1242 | { |
| 1243 | sp<AEquipment> e1 = getFirstItemInSlot(EquipmentSlotType::RightHand); |
| 1244 | sp<AEquipment> e2 = getFirstItemInSlot(EquipmentSlotType::LeftHand); |
| 1245 | // If there is only one item - return it, if none - return nothing |
| 1246 | if (!e1 && !e2) |
| 1247 | return nullptr; |
| 1248 | else if (e1 && !e2) |
| 1249 | return e1->type; |
| 1250 | else if (e2 && !e1) |
| 1251 | return e2->type; |
| 1252 | // If item was last fired and still in hands - return it |
| 1253 | if (itemLastFired) |
| 1254 | { |
| 1255 | if (e1 && e1->type == itemLastFired) |
| 1256 | return e1->type; |
| 1257 | if (e2 && e2->type == itemLastFired) |
| 1258 | return e2->type; |
| 1259 | } |
| 1260 | // Calculate item priorities: |
| 1261 | // - Firing (whichever fires sooner) |
| 1262 | // - CanFire >> Two-Handed >> Weapon >> Usable Item >> Others |
| 1263 | int e1Priority = |
| 1264 | e1->isFiring() |
| 1265 | ? 1440 - e1->weapon_fire_ticks_remaining |
| 1266 | : (e1->canFire(state) |
| 1267 | ? 4 |
| 1268 | : (e1->type->two_handed ? 3 |
| 1269 | : (e1->type->type == AEquipmentType::Type::Weapon ? 2 |
| 1270 | : (e1->type->type != AEquipmentType::Type::Ammo && |
| 1271 | e1->type->type != AEquipmentType::Type::Armor && |
| 1272 | e1->type->type != AEquipmentType::Type::Loot) |
| 1273 | ? 1 |
| 1274 | : 0))); |
| 1275 | int e2Priority = |
| 1276 | e2->isFiring() |
| 1277 | ? 1440 - e2->weapon_fire_ticks_remaining |
| 1278 | : (e2->canFire(state) |
| 1279 | ? 4 |
| 1280 | : (e2->type->two_handed ? 3 |
| 1281 | : (e2->type->type == AEquipmentType::Type::Weapon ? 2 |
| 1282 | : (e2->type->type != AEquipmentType::Type::Ammo && |
| 1283 | e2->type->type != AEquipmentType::Type::Armor && |
| 1284 | e2->type->type != AEquipmentType::Type::Loot) |
| 1285 | ? 1 |
| 1286 | : 0))); |
| 1287 | // Right hand has priority in case of a tie |
| 1288 | if (e1Priority >= e2Priority) |
| 1289 | return e1->type; |
| 1290 | return e2->type; |
| 1291 | } |
| 1292 | |
| 1293 | sp<AEquipment> Agent::getFirstItemInSlot(EquipmentSlotType equipmentSlotType, bool lazy) const |
| 1294 | { |
no test coverage detected