MCPcopy Create free account
hub / github.com/OpenApoc/OpenApoc / routine

Method routine

game/state/battle/ai/unitaivanilla.cpp:850–924  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

848}
849
850void 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)

Callers 1

beginTurnRoutineMethod · 0.80

Calls 11

needsReloadMethod · 0.80
loadAmmoMethod · 0.80
getFirstItemByTypeMethod · 0.80
getFirstItemInSlotMethod · 0.80
getPayloadTypeMethod · 0.80
setWeaponAimingModeMethod · 0.80
setFirePermissionModeMethod · 0.80
setReserveKneelModeMethod · 0.80
setReserveShotModeMethod · 0.80
canFireMethod · 0.45

Tested by

no test coverage detected