| 848 | } |
| 849 | |
| 850 | void UnitAIVanilla::routine(GameState &state, BattleUnit &u) |
| 851 | { |
| 852 | // Reload all guns |
| 853 | for (auto &e : u.agent->equipment) |
| 854 | { |
| 855 | if (e->needsReload()) |
| 856 | { |
| 857 | e->loadAmmo(state); |
| 858 | } |
| 859 | } |
| 860 | |
| 861 | // Equip a cloaking field if we don't already have one in left hand |
| 862 | auto cloaking = u.agent->getFirstItemByType(AEquipmentType::Type::CloakingField); |
| 863 | if (cloaking) |
| 864 | { |
| 865 | UnitAIHelper::ensureItemInSlot(state, cloaking, EquipmentSlotType::LeftHand); |
| 866 | } |
| 867 | |
| 868 | // Equip best weapon in right hand if we don't have something we otherwise need in that slot |
| 869 | auto rhItem = u.agent->getFirstItemInSlot(EquipmentSlotType::RightHand); |
| 870 | if (!lastDecision.action || rhItem != lastDecision.action->item) |
| 871 | { |
| 872 | // Right now just equip most long ranged weapon, if tied most damaging |
| 873 | auto newItem = rhItem; |
| 874 | int maxRange = 0; |
| 875 | int maxDamage = 0; |
| 876 | for (auto &e : u.agent->equipment) |
| 877 | { |
| 878 | if (!e->canFire(state)) |
| 879 | { |
| 880 | continue; |
| 881 | } |
| 882 | if ((e->getPayloadType()->range > maxRange) || |
| 883 | (e->getPayloadType()->range == maxRange && e->getPayloadType()->damage > maxDamage)) |
| 884 | { |
| 885 | maxRange = e->getPayloadType()->range; |
| 886 | maxDamage = e->getPayloadType()->damage; |
| 887 | } |
| 888 | } |
| 889 | // Equip new item into slot |
| 890 | if (newItem != rhItem) |
| 891 | { |
| 892 | UnitAIHelper::ensureItemInSlot(state, newItem, EquipmentSlotType::RightHand); |
| 893 | } |
| 894 | } |
| 895 | |
| 896 | // AI preferences |
| 897 | u.setWeaponAimingMode(WeaponAimingMode::Snap); |
| 898 | u.setFirePermissionMode(BattleUnit::FirePermissionMode::AtWill); |
| 899 | if (state.current_battle->mode == Battle::Mode::TurnBased) |
| 900 | { |
| 901 | // Ensure at least half of move is available for moving |
| 902 | u.setReserveKneelMode(KneelingMode::Kneeling); |
| 903 | u.setReserveShotMode(state, ReserveShotMode::Aimed); |
| 904 | int kneelCost = u.reserve_kneel_mode == KneelingMode::None |
| 905 | ? 0 |
| 906 | : u.getBodyStateChangeCost(BodyState::Standing, BodyState::Kneeling); |
| 907 | if (u.reserveShotCost + kneelCost > u.initialTU / 2) |
no test coverage detected