Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
86 commits
Select commit Hold shift + click to select a range
070867d
Check for closest known opponent in status black
Asdow Aug 16, 2023
d99b12c
Allow status black cover advance with full AP
Asdow Aug 16, 2023
e502727
Disable canceling AI actions for escorted mercs
Asdow Aug 17, 2023
bacad9b
Prevent AI deadlock when they try to shoot and player gets an interrupt
Asdow Aug 17, 2023
0e52907
Allow AI to shoot with lower aim if out of AP for current aim level
Asdow Aug 17, 2023
1c8d008
Move DebugAI() calls inside if blocks
Asdow Aug 17, 2023
664142c
Don't log AI info if pSoldier is null
Asdow Aug 17, 2023
1c4929c
Improve AI item handling log entry
Asdow Aug 17, 2023
613de1b
Remove useless code
Asdow Aug 18, 2023
0647826
Moved armed vehicle/robot in gas check into function
Asdow Aug 18, 2023
a0cbe42
Create function for decision to wear a gasmask
Asdow Aug 18, 2023
138ad06
Prevent AI deadlocks
Asdow Aug 19, 2023
c5d1615
Move decision if stuck in water or gas into its own function
Asdow Aug 19, 2023
96a7fa0
Add section comments to DecideActionBlack
Asdow Aug 19, 2023
d28ed97
Add section comments do DecideActionRed
Asdow Aug 19, 2023
1170f82
Move variable declarations to point of initialization
Asdow Aug 19, 2023
318e4a4
Improve AI logging
Asdow Aug 19, 2023
a45f3ae
Add more AI logging
Asdow Aug 20, 2023
ae709f2
Merge branch 'master' into decideaction
Asdow Oct 2, 2023
6131ebc
Comment out temp. fixes to flush out AI deadlocks
Asdow Oct 2, 2023
88af94e
Use Flugente's AI deadlock break & fix wstring for screenMsg
Asdow Oct 2, 2023
1586e8f
Allow possibly taking cover without full APs
Asdow Oct 2, 2023
d6c9cb2
Report soldier ID in DebugMsg when interrupt ends
Asdow Oct 2, 2023
a90e116
Merge branch 'master' into decideaction
Asdow Oct 10, 2023
22f2c9f
Correct AP check
Asdow Feb 1, 2024
ffb95a2
Remove unused variable from if checks
Asdow Feb 3, 2024
caf5828
Remove deadlock breaking from TurnBasedHandleNPCAI
Asdow Feb 4, 2024
7ee8165
Prevent AI deadlocking if NEW_SITUATION is encountered
Asdow Feb 4, 2024
f249406
Allow specific alert status AI logging
Asdow Feb 4, 2024
cd193c7
Call TurnBasedHandleNPCAI() if no action is in progress
Asdow Feb 4, 2024
0132726
Check if action should stay inprogress state
Asdow Feb 4, 2024
f646bc2
Set correct next action if npc has no AP
Asdow Feb 4, 2024
0ed68b6
Set functions to static
Asdow Feb 4, 2024
4faccb2
Fix indentation
Asdow Feb 4, 2024
79372d5
Try to find a cover spot when advancing to attack
Asdow Feb 4, 2024
5c86cf0
Attempt to continue moving towards enemy
Asdow Feb 10, 2024
0240729
Use correct string array
Asdow Feb 10, 2024
1aec54f
add another AI logging entry
Asdow Feb 10, 2024
3c2b048
Attempt to continue moving towards enemy
Asdow Feb 10, 2024
eaf7695
Use correct string array
Asdow Feb 10, 2024
f6052f0
add another AI logging entry
Asdow Feb 10, 2024
93acd19
Try to find a cover spot when advancing to attack
Asdow Feb 4, 2024
adf8638
Merge branch 'decideaction' of https://github.com/1dot13/source into …
Asdow Feb 10, 2024
b480a67
Reduce code duplication
Asdow Feb 10, 2024
877ec38
Whitespace changes
Asdow Feb 10, 2024
1a98420
Remove extraneous check
Asdow Feb 10, 2024
67a26e0
Add more AI logging
Asdow Feb 11, 2024
dfc17c6
Cancel action if new situation arises
Asdow Feb 11, 2024
57716e1
Revert back to original AI deadlock breaking
Asdow Feb 11, 2024
5fe730b
Merge branch 'master' into decideaction
Asdow Feb 11, 2024
ab2c5fc
Add BOXER() & ISVIP() macros
Asdow Feb 18, 2024
de91c7a
Render debug info in tactical
Asdow Feb 18, 2024
f075963
Merge branch 'master' into decideaction
Asdow Dec 25, 2025
2e3e4b3
Fix compilation
Asdow Dec 25, 2025
20dadec
Merge branch 'master' into decideaction
Asdow Jan 12, 2026
4e19816
Fix typo
Asdow Jan 18, 2026
f5b705c
Add ingame option to use old AI instead of new
Asdow Jan 19, 2026
e634edd
Rename debug draw modes
Asdow Jan 19, 2026
16fc2d8
Cleanup FindBestNearbyCover
Asdow Jan 19, 2026
a46d2db
Add global to selectively log AI status BLACK decisions
Asdow Jan 19, 2026
c3f4ee7
Only log during turn based AI
Asdow Jan 19, 2026
cd054b5
Split DecideAction into several specialized DecideAction functions
Asdow Jan 19, 2026
e806fd3
Add screen messages that display AI decisions
Asdow Jan 19, 2026
52a4959
Add optional InOut parameter to ClosestKnownOpponent
Asdow Jan 19, 2026
df8d4bd
Only show message if temperature has changed
Asdow Jan 19, 2026
1b9cb1f
Add functions to check if soldier is in specific gas
Asdow Jan 19, 2026
4678cab
Use correct type
Asdow Jan 19, 2026
58ea3be
Remove MercPtrs[]
Asdow Jan 19, 2026
ff96d65
Add skeleton for utilityAI framework
Asdow Jan 19, 2026
4ad34f8
Fix includes
Asdow Jan 19, 2026
2b1838d
Remove unused local variable
Asdow Jan 19, 2026
76af6b7
Remove duplicate include
Asdow Jan 21, 2026
1419cc6
Avoid overcrowding when looking for spot to move to
Asdow Jan 21, 2026
42215e7
Remove magic numbers
Asdow Jan 21, 2026
2448ccb
Tweak AI screen messages
Asdow Jan 21, 2026
75355f6
Set DangerousSpot to const
Asdow Jan 21, 2026
b50ed93
Remove armed vehicle check from soldier AI
Asdow Jan 21, 2026
1bead3a
Improve readability
Asdow Jan 21, 2026
737cd84
Make water and gas checks const
Asdow Jan 21, 2026
3d7d7cc
Reorganize stuff to improve readability
Asdow Jan 21, 2026
9c0fb0b
Add tactical range defines
Asdow Jan 21, 2026
91a1059
Migrate features from +AI
Asdow Jan 23, 2026
4194584
Migrate features from +AI
Asdow Jan 23, 2026
bd9cbd9
Migrate +AI features
Asdow Jan 23, 2026
caf925b
Fix Fatima not moving after map traversal
Asdow Jan 23, 2026
7b8c2d1
Remove old function call
Asdow Jan 23, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions Ja2/GameSettings.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -332,6 +332,7 @@ BOOLEAN LoadGameSettings()

gGameSettings.fOptions[TOPTION_ALT_START_AIM] = iniReader.ReadBoolean("JA2 Game Settings", "TOPTION_ALT_START_AIM" , TRUE); // Start at max aiming level instead of default no aiming
gGameSettings.fOptions[TOPTION_ALT_PATHFINDING] = iniReader.ReadBoolean("JA2 Game Settings", "TOPTION_ALT_PATHFINDING" , FALSE); // A* pathfinding
gGameSettings.fOptions[TOPTION_USE_LEGACY_TACTICALAI] = iniReader.ReadBoolean("JA2 Game Settings", "TOPTION_USE_LEGACY_TACTICALAI", FALSE); // A* pathfinding
gGameSettings.fOptions[TOPTION_MERCENARY_FORMATIONS] = iniReader.ReadBoolean("JA2 Game Settings","TOPTION_MERCENARY_FORMATIONS" , FALSE ); // Flugente: mercenary formations
gGameSettings.fOptions[TOPTION_SHOW_ENEMY_LOCATION] = iniReader.ReadBoolean("JA2 Game Settings","TOPTION_SHOW_ENEMY_LOCATION" , FALSE); // sevenfm: show locations of known enemies
gGameSettings.fOptions[TOPTION_REPORT_MISS_MARGIN] = iniReader.ReadBoolean("JA2 Game Settings","TOPTION_REPORT_MISS_MARGIN" , FALSE ); // HEADROCK HAM 4: Shot offset report
Expand Down Expand Up @@ -616,6 +617,7 @@ BOOLEAN SaveGameSettings()
settings << "TOPTION_SHOW_ENEMY_LOCATION = " << (gGameSettings.fOptions[TOPTION_SHOW_ENEMY_LOCATION] ? "TRUE" : "FALSE" ) << endl;
settings << "TOPTION_ALT_START_AIM = " << (gGameSettings.fOptions[TOPTION_ALT_START_AIM] ? "TRUE" : "FALSE") << endl;
settings << "TOPTION_ALT_PATHFINDING = " << (gGameSettings.fOptions[TOPTION_ALT_PATHFINDING] ? "TRUE" : "FALSE") << endl;
settings << "TOPTION_USE_LEGACY_TACTICALAI = " << (gGameSettings.fOptions[TOPTION_USE_LEGACY_TACTICALAI] ? "TRUE" : "FALSE") << endl;

settings << "TOPTION_CHEAT_MODE_OPTIONS_HEADER = " << (gGameSettings.fOptions[TOPTION_CHEAT_MODE_OPTIONS_HEADER] ? "TRUE" : "FALSE" ) << endl;
settings << "TOPTION_FORCE_BOBBY_RAY_SHIPMENTS = " << (gGameSettings.fOptions[TOPTION_FORCE_BOBBY_RAY_SHIPMENTS] ? "TRUE" : "FALSE" ) << endl;
Expand Down Expand Up @@ -846,6 +848,7 @@ void InitGameSettings()
gGameSettings.fOptions[TOPTION_SHOW_ENEMY_LOCATION] = FALSE; // sevenfm: show locations of known enemies
gGameSettings.fOptions[TOPTION_ALT_START_AIM] = TRUE;
gGameSettings.fOptions[TOPTION_ALT_PATHFINDING] = FALSE;
gGameSettings.fOptions[TOPTION_USE_LEGACY_TACTICALAI] = FALSE;

// arynn: Cheat/Debug Menu
gGameSettings.fOptions[ TOPTION_CHEAT_MODE_OPTIONS_HEADER ] = FALSE;
Expand Down
1 change: 1 addition & 0 deletions Ja2/GameSettings.h
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,7 @@ enum
TOPTION_SHOW_ENEMY_LOCATION,
TOPTION_ALT_START_AIM,
TOPTION_ALT_PATHFINDING,
TOPTION_USE_LEGACY_TACTICALAI,

// arynn: Debug/Cheat
TOPTION_CHEAT_MODE_OPTIONS_HEADER,
Expand Down
4 changes: 4 additions & 0 deletions ModularizedTacticalAI/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,10 @@ set(ModularizedTacticalAISrc
"${CMAKE_CURRENT_SOURCE_DIR}/src/LegacyAIPlanFactory.cpp"
"${CMAKE_CURRENT_SOURCE_DIR}/src/LegacyCreaturePlan.cpp"
"${CMAKE_CURRENT_SOURCE_DIR}/src/LegacyZombiePlan.cpp"
"${CMAKE_CURRENT_SOURCE_DIR}/src/BoxerPlan.cpp"
"${CMAKE_CURRENT_SOURCE_DIR}/src/CivilianPlan.cpp"
"${CMAKE_CURRENT_SOURCE_DIR}/src/RobotPlan.cpp"
"${CMAKE_CURRENT_SOURCE_DIR}/src/SoldierPlan.cpp"
"${CMAKE_CURRENT_SOURCE_DIR}/src/NullPlan.cpp"
"${CMAKE_CURRENT_SOURCE_DIR}/src/NullPlanFactory.cpp"
"${CMAKE_CURRENT_SOURCE_DIR}/src/Plan.cpp"
Expand Down
23 changes: 23 additions & 0 deletions ModularizedTacticalAI/include/BoxerPlan.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
#pragma once

#include "Plan.h"

namespace AI
{
namespace tactical
{
/**@class LegacyAIPlan
* @brief Component/Concrete Product. Wrapper/Re-Write of DecideAction()
*
* Wrapper around boxer related AI uplifted from original DecideAction() routines
*/
class LegacyAIBoxerPlan: public Plan
{
private:
public:
LegacyAIBoxerPlan(SOLDIERTYPE* npc);
virtual void execute(PlanInputData& environment);
virtual bool done() const {return false;}
};
}
}
23 changes: 23 additions & 0 deletions ModularizedTacticalAI/include/CivilianPlan.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
#pragma once

#include "Plan.h"

namespace AI
{
namespace tactical
{
/**@class LegacyAIPlan
* @brief Component/Concrete Product. Wrapper/Re-Write of DecideAction()
*
* Wrapper around civilian/noncombatant related AI uplifted from original DecideAction() routines
*/
class CivilianPlan : public Plan
{
private:
public:
CivilianPlan(SOLDIERTYPE* npc);
virtual void execute(PlanInputData& environment);
virtual bool done() const { return false; }
};
}
}
23 changes: 23 additions & 0 deletions ModularizedTacticalAI/include/RobotPlan.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
#pragma once

#include "Plan.h"

namespace AI
{
namespace tactical
{
/**@class LegacyAIPlan
* @brief Component/Concrete Product. Wrapper/Re-Write of DecideAction()
*
* Wrapper around robot related AI uplifted from original DecideAction() routines
*/
class RobotPlan : public Plan
{
private:
public:
RobotPlan(SOLDIERTYPE* npc);
virtual void execute(PlanInputData& environment);
virtual bool done() const { return false; }
};
}
}
23 changes: 23 additions & 0 deletions ModularizedTacticalAI/include/SoldierPlan.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
#pragma once

#include "Plan.h"

namespace AI
{
namespace tactical
{
/**@class LegacyAIPlan
* @brief Component/Concrete Product. Wrapper/Re-Write of DecideAction()
*
* Wrapper around soldier related AI uplifted from original DecideAction() routines
*/
class SoldierPlan : public Plan
{
private:
public:
SoldierPlan(SOLDIERTYPE* npc);
virtual void execute(PlanInputData& environment);
virtual bool done() const { return false; }
};
}
}
35 changes: 35 additions & 0 deletions ModularizedTacticalAI/src/BoxerPlan.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
#include "../include/BoxerPlan.h"
#include "../../TacticalAI/ai.h"

namespace AI
{
namespace tactical
{
LegacyAIBoxerPlan::LegacyAIBoxerPlan(SOLDIERTYPE* npc)
: Plan(npc)
{
}


void LegacyAIBoxerPlan::execute(PlanInputData& environment)
{
switch (get_npc()->aiData.bAlertStatus)
{
case STATUS_GREEN:
get_npc()->aiData.bAction = DecideActionGreenBoxer(get_npc());
break;
case STATUS_YELLOW:
get_npc()->aiData.bAction = DecideActionGreenBoxer(get_npc());
break;
case STATUS_RED:
get_npc()->aiData.bAction = DecideActionBlackBoxer(get_npc());
break;
case STATUS_BLACK:
get_npc()->aiData.bAction = DecideActionBlackBoxer(get_npc());
break;
}
}

} // namespace tactical
} // namespace AI

51 changes: 51 additions & 0 deletions ModularizedTacticalAI/src/CivilianPlan.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
#include "../include/CivilianPlan.h"
#include "../../TacticalAI/ai.h"
#include "NPC.h"
#include "Soldier Profile.h"

namespace AI
{
namespace tactical
{
CivilianPlan::CivilianPlan(SOLDIERTYPE* npc)
: Plan(npc)
{
}


void CivilianPlan::execute(PlanInputData& environment)
{
if ( !environment.turn_based() )
{
if ( (get_npc()->ubProfile != NO_PROFILE) && (gMercProfiles[get_npc()->ubProfile].ubMiscFlags3 & PROFILE_MISC_FLAG3_HANDLE_DONE_TRAVERSAL) )
{
TriggerNPCWithGivenApproach(get_npc()->ubProfile, APPROACH_DONE_TRAVERSAL, FALSE);
gMercProfiles[get_npc()->ubProfile].ubMiscFlags3 &= (~PROFILE_MISC_FLAG3_HANDLE_DONE_TRAVERSAL);
get_npc()->ubQuoteActionID = 0;
// wait a tiny bit
get_npc()->aiData.usActionData = 100;
get_npc()->aiData.bAction = AI_ACTION_WAIT;
return;
}
}

switch (get_npc()->aiData.bAlertStatus)
{
case STATUS_GREEN:
get_npc()->aiData.bAction = DecideActionGreenCivilian(get_npc());
break;
case STATUS_YELLOW:
get_npc()->aiData.bAction = DecideActionYellowCivilian(get_npc());
break;
case STATUS_RED:
get_npc()->aiData.bAction = DecideActionRedCivilian(get_npc());
break;
case STATUS_BLACK:
get_npc()->aiData.bAction = DecideActionBlackCivilian(get_npc());
break;
}
}

} // namespace tactical
} // namespace AI

12 changes: 10 additions & 2 deletions ModularizedTacticalAI/src/LegacyAIPlanFactory.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,18 @@
#include "../include/LegacyCreaturePlan.h"
#include "../include/LegacyZombiePlan.h"
#include "../include/LegacyArmedVehiclePlan.h"
#include "../include/BoxerPlan.h"
#include "../include/CivilianPlan.h"
#include "../include/RobotPlan.h"
#include "../include/SoldierPlan.h"
#include "../include/CrowPlan.h"
#include "../include/PlanList.h"

#include "../../TacticalAI/AIInternals.h" // DEBUGAIMSG
#include "../../Tactical/Soldier Control.h" // For SOLDIERTYPE definition
#include "../../Tactical/Animation Data.h" // For the definition of, wait for it... BLOODCAT!
#include "Soldier macros.h"

#include <stdio.h>
#include "ai.h"


namespace AI
Expand Down Expand Up @@ -43,6 +46,11 @@ namespace AI
if(npc->IsZombie())
return new LegacyZombiePlan(npc);

if (BOXER(npc)) { return new LegacyAIBoxerPlan(npc); }
if (IS_CIV_BODY_TYPE(npc)) { return new CivilianPlan(npc); }
if (ENEMYROBOT(npc)) { return new RobotPlan(npc); }
if (SoldierAI(npc)) { return new SoldierPlan(npc); }

return new LegacyAIPlan(npc); // no special plan for other cases yet, return default legacy AI wrapper
}

Expand Down
34 changes: 34 additions & 0 deletions ModularizedTacticalAI/src/RobotPlan.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
#include "../include/RobotPlan.h"
#include "../../TacticalAI/ai.h"

namespace AI
{
namespace tactical
{
RobotPlan::RobotPlan(SOLDIERTYPE* npc)
: Plan(npc)
{
}


void RobotPlan::execute(PlanInputData& environment)
{
switch (get_npc()->aiData.bAlertStatus)
{
case STATUS_GREEN:
get_npc()->aiData.bAction = DecideActionGreenRobot(get_npc());
break;
case STATUS_YELLOW:
get_npc()->aiData.bAction = DecideActionYellowRobot(get_npc());
break;
case STATUS_RED:
get_npc()->aiData.bAction = DecideActionRedRobot(get_npc());
break;
case STATUS_BLACK:
get_npc()->aiData.bAction = DecideActionBlackRobot(get_npc());
break;
}
}

} // namespace tactical
} // namespace AI
104 changes: 104 additions & 0 deletions ModularizedTacticalAI/src/SoldierPlan.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
#include "../include/SoldierPlan.h"
#include "../../TacticalAI/ai.h"
#include "../../TacticalAI/AIInternals.h" // ACTING_ON_SCHEDULE
#include "../../TacticalAI/NPC.h" // NPCReachedDestination
#include "../../Tactical/Dialogue Control.h" // DialogueQueueIsEmpty
#include "../../Utils/Font Control.h" // ScreenMsg about deadlock
#include "../../i18n/include/Text.h" // Sniper warning
#include "../../Utils/message.h" // ditto

namespace AI
{
namespace tactical
{
SoldierPlan::SoldierPlan(SOLDIERTYPE* npc)
: Plan(npc)
{
}


void SoldierPlan::execute(PlanInputData& environment)
{
if (!environment.turn_based())
{
if ((get_npc()->ubProfile != NO_PROFILE) && (gMercProfiles[get_npc()->ubProfile].ubMiscFlags3 & PROFILE_MISC_FLAG3_HANDLE_DONE_TRAVERSAL))
{
TriggerNPCWithGivenApproach(get_npc()->ubProfile, APPROACH_DONE_TRAVERSAL, FALSE);
gMercProfiles[get_npc()->ubProfile].ubMiscFlags3 &= (~PROFILE_MISC_FLAG3_HANDLE_DONE_TRAVERSAL);
get_npc()->ubQuoteActionID = 0;
// wait a tiny bit
get_npc()->aiData.usActionData = 100;
get_npc()->aiData.bAction = AI_ACTION_WAIT;
return;
}
if (get_npc()->bTeam == gbPlayerNum)
{
if (environment.get_tactical_status().fAutoBandageMode)
{
get_npc()->aiData.bAction = DecideAutoBandage(get_npc());
return;
}
}
}

if (get_npc()->bTeam != MILITIA_TEAM)
{
if (!sniperwarning && get_npc()->aiData.bOrders == SNIPER)
{
ScreenMsg(FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, New113Message[MSG113_WATHCHOUTFORSNIPERS]);
sniperwarning = TRUE;

// Flugente: additional dialogue
AdditionalTacticalCharacterDialogue_AllInCurrentSector(NO_PROFILE, ADE_SNIPERWARNING);
}

if (!biggunwarning && FindRocketLauncherOrCannon(get_npc()) != NO_SLOT)
{
biggunwarning = TRUE;
//TODO: don't say this again after reloading a savegame
SayQuoteFromAnyBodyInSector(QUOTE_WEARY_SLASH_SUSPUCIOUS);
}
}
get_npc()->aiData.fAIFlags &= (~AI_CAUTIOUS); // turn off cautious flag
// if status override is set, bypass RED/YELLOW and go directly to GREEN!
if ((get_npc()->aiData.bBypassToGreen) && (get_npc()->aiData.bAlertStatus < STATUS_BLACK))
{
get_npc()->aiData.bAction = DecideActionGreenSoldier(get_npc());
if (!gfTurnBasedAI)
{
// reset bypass now
get_npc()->aiData.bBypassToGreen = 0;
}
}
else
{
switch (get_npc()->aiData.bAlertStatus)
{
case STATUS_GREEN:
get_npc()->aiData.bAction = DecideActionGreenSoldier(get_npc());
break;
case STATUS_YELLOW:
get_npc()->aiData.bAction = DecideActionYellowSoldier(get_npc());
break;
case STATUS_RED:
get_npc()->aiData.bAction = DecideActionRedSoldier(get_npc());
break;
case STATUS_BLACK:
//if ( gGameSettings.fOptions[TOPTION_USE_LEGACY_TACTICALAI] ) // Commented out for now since new AI is WIP
{
get_npc()->aiData.bAction = DecideActionBlackSoldier(get_npc());
}
//else
//{
// get_npc()->aiData.bAction = DecideActionBlackSoldierUtilityAI(get_npc());
//}
break;
}
}
DEBUGAIMSG("Deciding for guynum " << (int)get_npc()->ubID << " at gridno " << get_npc()->sGridNo << ", APs " << get_npc()->bActionPoints <<
", decided action: " << (int)get_npc()->aiData.bAction << ", data " << (int)get_npc()->aiData.usActionData);
}

} // namespace tactical
} // namespace AI

Loading