Skip to content

Commit a8f7dae

Browse files
committed
reduce file list to AICState methods and status file
1 parent 4e79ec5 commit a8f7dae

137 files changed

Lines changed: 7780 additions & 198 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
#include "../AICState.func.hpp"
2+
3+
namespace OpenSHC {
4+
namespace AI {
5+
6+
// FUNCTION: STRONGHOLDCRUSADER 0x004D3940
7+
AICState* AICState::Constructor_AICState()
8+
{
9+
MACRO_CALL_MEMBER(AICState_Func::setInitialAIC, this)();
10+
this->aiTauntResponseTimeWindow = 0;
11+
return this;
12+
}
13+
}
14+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
#include "../AICState.func.hpp"
2+
3+
#include "OpenSHC/Map/Buildings/BuildingsState.func.hpp"
4+
5+
#include "OpenSHC/Globals/DAT_BuildingsState.hpp"
6+
#include "OpenSHC/Globals/DAT_GameState.hpp"
7+
8+
namespace OpenSHC {
9+
namespace AI {
10+
11+
// FUNCTION: STRONGHOLDCRUSADER 0x004D45E0
12+
void AICState::abortAttackAndGoIdle(int playerID)
13+
{
14+
MACRO_CALL_MEMBER(Map::Buildings::BuildingsState_Func::removeSiegeBuildings, DAT_BuildingsState::ptr)(
15+
DAT_GameState::instance.playerDataArray[playerID].currentAttackWave, playerID);
16+
MACRO_CALL_MEMBER(AICState_Func::disbandAIPlayerSiegeUnits, this)(playerID);
17+
MACRO_CALL_MEMBER(AICState_Func::addEngineersToTribe, this)(playerID);
18+
MACRO_CALL_MEMBER(AICState_Func::aiReassignTunnelersToTribe, this)(playerID);
19+
DAT_GameState::instance.playerDataArray[playerID].aiPlayerState = 0;
20+
}
21+
22+
}
23+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
#include "../AICState.func.hpp"
2+
3+
#include "OpenSHC/Game/GameMode.hpp"
4+
5+
#include "OpenSHC/Globals/DAT_BuildingsState.hpp"
6+
#include "OpenSHC/Globals/DAT_GameState.hpp"
7+
#include "OpenSHC/Globals/DAT_GameSynchronyState.hpp"
8+
9+
namespace OpenSHC {
10+
namespace AI {
11+
12+
// FUNCTION: STRONGHOLDCRUSADER 0x004CDA50
13+
void AICState::addBuildingToTargetableBuildings(int buildingID)
14+
{
15+
int owner = DAT_BuildingsState::instance.buildings[buildingID].owner;
16+
if (DAT_GameSynchronyState::instance.currentGameMode == Game::GM_SOLITARY)
17+
return;
18+
if (DAT_GameState::instance.playerDataArray[owner].top100TargetableBuildingsTracker >= 100)
19+
return;
20+
if (DAT_BuildingsState::instance.buildings[buildingID].fireDuration != 0)
21+
return;
22+
23+
DAT_GameState::instance.playerDataArray[owner]
24+
.top100TargetableBuildings[DAT_GameState::instance.playerDataArray[owner].top100TargetableBuildingsTracker]
25+
= buildingID;
26+
DAT_GameState::instance.playerDataArray[owner].top100TargetableBuildingsTracker++;
27+
}
28+
29+
}
30+
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
#include "../AICState.func.hpp"
2+
3+
#include "OpenSHC/Map/Units/TribesState.func.hpp"
4+
#include "OpenSHC/Map/Units/States/UnitState.hpp"
5+
#include "OpenSHC/Map/Units/UnitLogicState.hpp"
6+
#include "OpenSHC/Map/Units/UnitType.hpp"
7+
8+
#include "OpenSHC/Globals/DAT_TribesState.hpp"
9+
#include "OpenSHC/Globals/DAT_UnitsState.hpp"
10+
11+
namespace OpenSHC {
12+
namespace AI {
13+
14+
// FUNCTION: STRONGHOLDCRUSADER 0x004CC680
15+
int AICState::addEngineersToSelection(int playerID, int unitCount)
16+
{
17+
int tribeID
18+
= MACRO_CALL_MEMBER(Map::Units::TribesState_Func::createTribeForPlayer, DAT_TribesState::ptr)(playerID);
19+
for (int unitID = 1; unitID < (int)DAT_UnitsState::instance.maxUnitCount; unitID++) {
20+
if (unitCount <= 0)
21+
break;
22+
if (DAT_UnitsState::instance.units[unitID].logicalState != Map::Units::ULS_NORMAL)
23+
continue;
24+
if (DAT_UnitsState::instance.units[unitID].owner != playerID)
25+
continue;
26+
if (DAT_UnitsState::instance.units[unitID].dying != 0)
27+
continue;
28+
if (DAT_UnitsState::instance.units[unitID].unitType != Map::Units::UT_E_ENGINEER)
29+
continue;
30+
if (DAT_UnitsState::instance.units[unitID].aiUnitBehaviourType != 10)
31+
continue;
32+
if (DAT_UnitsState::instance.units[unitID].tribeID != 0)
33+
continue;
34+
if (DAT_UnitsState::instance.units[unitID].state.generic == Map::Units::States::US_STAND_UPUnk)
35+
continue;
36+
37+
MACRO_CALL_MEMBER(Map::Units::TribesState_Func::addUnitToTribe, DAT_TribesState::ptr)(unitID, tribeID);
38+
unitCount--;
39+
}
40+
return tribeID;
41+
}
42+
43+
}
44+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
#include "../AICState.func.hpp"
2+
3+
#include "OpenSHC/Map/Units/TribesState.func.hpp"
4+
#include "OpenSHC/AI/AITypeA.hpp"
5+
6+
#include "OpenSHC/Globals/DAT_GameState.hpp"
7+
#include "OpenSHC/Globals/DAT_TribesState.hpp"
8+
#include "OpenSHC/Globals/DAT_UnitsState.hpp"
9+
10+
namespace OpenSHC {
11+
namespace AI {
12+
13+
// FUNCTION: STRONGHOLDCRUSADER 0x004D2730
14+
void AICState::addUnitToSmallestPatrolTribe(int unitID)
15+
{
16+
int owner = DAT_UnitsState::instance.units[unitID].owner;
17+
if (DAT_GameState::instance.playerDataArray[owner].aiType == AITA_NULL)
18+
return;
19+
int aicIndex = DAT_GameState::instance.playerDataArray[owner].aiType - 1;
20+
21+
DAT_UnitsState::instance.units[unitID].aiUnitBehaviourType = 4;
22+
int tribeID = MACRO_CALL_MEMBER(AICState_Func::getSmallestPatrolTribe, this)(
23+
owner, this->aics[aicIndex].OuterPatrolGroupsCount);
24+
MACRO_CALL_MEMBER(Map::Units::TribesState_Func::addUnitToTribe, DAT_TribesState::ptr)(unitID, tribeID);
25+
}
26+
}
27+
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
#include "../AICState.func.hpp"
2+
3+
#include "OpenSHC/AI/AIType.hpp"
4+
5+
#include "OpenSHC/Globals/DAT_GameState.hpp"
6+
#include "OpenSHC/Globals/DAT_SkirmishDefinedData.hpp"
7+
#include "OpenSHC/Globals/DAT_TribesState.hpp"
8+
9+
namespace OpenSHC {
10+
namespace AI {
11+
12+
// FUNCTION: STRONGHOLDCRUSADER 0x004CEC80
13+
BOOLEnum AICState::aiChoiceAttForceRallyPercentage(int playerID)
14+
{
15+
int aiType = DAT_GameState::instance.playerDataArray[playerID].aiType;
16+
if (aiType == OpenSHC::AI::AIT_NULL)
17+
return FALSE;
18+
int aicIndex = aiType - 1;
19+
20+
int activeTribes = 0;
21+
int rallyingTribes = 0;
22+
for (int i = 0; i < 11; i++) {
23+
int tribeType = DAT_SkirmishDefinedData::instance.MaxAttackTribes1[i].tribeType;
24+
int tribeCount = DAT_SkirmishDefinedData::instance.MaxAttackTribes1[i].tribeCount;
25+
for (int j = 0; j < tribeCount; j++) {
26+
int tribeID = DAT_GameState::instance.playerDataArray[playerID].aiTribeIDs[tribeType + j];
27+
if (tribeID == 0)
28+
continue;
29+
if (DAT_TribesState::instance.tribes[tribeID].uid
30+
!= DAT_GameState::instance.playerDataArray[playerID].aiTribeUIDs[j + tribeType])
31+
continue;
32+
33+
activeTribes++;
34+
if (DAT_TribesState::instance.tribes[tribeID].percentageMovingUnk < 20)
35+
rallyingTribes++;
36+
}
37+
}
38+
39+
if (activeTribes <= 0)
40+
return FALSE;
41+
return rallyingTribes * 100 / activeTribes >= this->aics[aicIndex].AttForceRallyPercentage;
42+
}
43+
44+
}
45+
}
Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
#include "../AICState.func.hpp"
2+
3+
#include "OpenSHC/Map/Navigation/DirectionAlgorithmState.func.hpp"
4+
#include "OpenSHC/Map/Units/TribesState.func.hpp"
5+
#include "OpenSHC/Map/Units/Instructions/UnitMatchSpeedEnum.hpp"
6+
#include "OpenSHC/Map/Units/SomeTribeBehaviorType.hpp"
7+
#include "OpenSHC/Map/Units/UnitLogicState.hpp"
8+
#include "OpenSHC/Map/Units/UnitType.hpp"
9+
10+
#include "OpenSHC/Globals/DAT_DirectionAlgorithmState.hpp"
11+
#include "OpenSHC/Globals/DAT_GameState.hpp"
12+
#include "OpenSHC/Globals/DAT_TribesState.hpp"
13+
#include "OpenSHC/Globals/DAT_TroopValueState.hpp"
14+
#include "OpenSHC/Globals/DAT_UnitsState.hpp"
15+
#include "OpenSHC/Globals/DAT_ViewportRenderState.hpp"
16+
17+
namespace OpenSHC {
18+
namespace AI {
19+
20+
using namespace OpenSHC::Map::Units;
21+
22+
// FUNCTION: STRONGHOLDCRUSADER 0x004CFCD0
23+
void AICState::aiCommandSiegeEngineTribes(int playerID)
24+
{
25+
int shieldTargetTribeIDs[3];
26+
shieldTargetTribeIDs[0] = 0;
27+
shieldTargetTribeIDs[1] = 0;
28+
shieldTargetTribeIDs[2] = 0;
29+
int targetCount = 0;
30+
for (int i = 186; i < 189; i++) {
31+
int tribeID = DAT_GameState::instance.playerDataArray[playerID].aiTribeIDs[i];
32+
if (tribeID == 0)
33+
continue;
34+
if (DAT_TribesState::instance.tribes[tribeID].uid
35+
!= DAT_GameState::instance.playerDataArray[playerID].aiTribeUIDs[i])
36+
continue;
37+
shieldTargetTribeIDs[targetCount] = tribeID;
38+
targetCount++;
39+
}
40+
41+
int shieldCount = 0;
42+
for (int unitID = 1; unitID < 2500; unitID++) {
43+
if (DAT_UnitsState::instance.units[unitID].logicalState == ULS_INVISIBLE)
44+
continue;
45+
if (DAT_UnitsState::instance.units[unitID].unitType != UT_S_TOWER
46+
&& DAT_UnitsState::instance.units[unitID].unitType != UT_S_BATTERINGRAM
47+
&& DAT_UnitsState::instance.units[unitID].unitType != UT_S_SHIELD)
48+
continue;
49+
if (DAT_UnitsState::instance.units[unitID].unknownSiegeTentRelated02 != 3)
50+
continue;
51+
if (DAT_UnitsState::instance.units[unitID].aiUnitBehaviourType == 21)
52+
continue;
53+
54+
if (DAT_UnitsState::instance.units[unitID].unitType == UT_S_TOWER) {
55+
int tribeID = DAT_UnitsState::instance.units[unitID].tribeID;
56+
if (tribeID == 0)
57+
continue;
58+
if (*(int*)((int)DAT_TroopValueState::instance.attackInfo.wideValuesArray + playerID * 0x177bc - 4)
59+
!= 0)
60+
MACRO_CALL_MEMBER(TribesState_Func::assignAttackTargetsForTribe, DAT_TribesState::ptr)(
61+
tribeID, STBT_0x414);
62+
} else if (DAT_UnitsState::instance.units[unitID].unitType == UT_S_BATTERINGRAM) {
63+
int tribeID = DAT_UnitsState::instance.units[unitID].tribeID;
64+
if (tribeID == 0)
65+
continue;
66+
if (*(int*)((int)DAT_TroopValueState::instance.attackInfo.gateValuesArray + playerID * 0x177bc - 4)
67+
!= 0)
68+
MACRO_CALL_MEMBER(TribesState_Func::assignAttackTargetsForTribe, DAT_TribesState::ptr)(
69+
tribeID, STBT_0x3f6);
70+
else if (*(int*)((int)DAT_TroopValueState::instance.attackInfo.wideValuesArray + playerID * 0x177bc - 4)
71+
!= 0)
72+
MACRO_CALL_MEMBER(TribesState_Func::assignAttackTargetsForTribe, DAT_TribesState::ptr)(
73+
tribeID, STBT_0x413);
74+
} else if (DAT_UnitsState::instance.units[unitID].unitType == UT_S_SHIELD) {
75+
int tribeID = DAT_UnitsState::instance.units[unitID].tribeID;
76+
if (tribeID == 0)
77+
continue;
78+
if (shieldCount >= 3)
79+
continue;
80+
81+
int targetTribeID = shieldTargetTribeIDs[shieldCount];
82+
DAT_TribesState::instance.tribes[tribeID].field56_0x1f2 = targetTribeID;
83+
DAT_TribesState::instance.tribes[tribeID].uid2 = DAT_TribesState::instance.tribes[targetTribeID].uid;
84+
DAT_TribesState::instance.tribes[targetTribeID].tribeID = tribeID;
85+
int targetUnitID = DAT_TribesState::instance.tribes[targetTribeID].selectionTargetUnitID;
86+
int tile = DAT_UnitsState::instance.units[targetUnitID].tile;
87+
shieldCount++;
88+
if (tile <= 0)
89+
continue;
90+
91+
int y = DAT_ViewportRenderState::instance.tileTranslationMatrix_YComponent[tile];
92+
int x = tile - DAT_ViewportRenderState::instance.translationMatrix[y].addXgetTile;
93+
MACRO_CALL_MEMBER(TribesState_Func::giveTribeMoveInstruction, DAT_TribesState::ptr)(
94+
tribeID, x, y, 0, 0, Instructions::UMSE_0);
95+
MACRO_CALL_MEMBER(
96+
OpenSHC::Map::Navigation::DirectionAlgorithmState_Func::calculatePreferredRelativeOrientation,
97+
DAT_DirectionAlgorithmState::ptr)(DAT_UnitsState::instance.units[targetUnitID].x,
98+
DAT_UnitsState::instance.units[targetUnitID].y, x, y);
99+
DAT_TribesState::instance.tribes[tribeID].orientation
100+
= DAT_DirectionAlgorithmState::instance.orientation;
101+
}
102+
}
103+
}
104+
}
105+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
#include "OpenSHC/Map/Units/TroopValueState.func.hpp"
2+
#include "OpenSHC/AI/AICState.hpp"
3+
#include "OpenSHC/AI/AITypeA.hpp"
4+
#include "OpenSHC/Map/Units/Behavior/UnitStanceEnum.hpp"
5+
6+
#include "OpenSHC/Globals/DAT_GameState.hpp"
7+
#include "OpenSHC/Globals/DAT_TribesState.hpp"
8+
#include "OpenSHC/Globals/DAT_TroopValueState.hpp"
9+
10+
namespace OpenSHC {
11+
namespace AI {
12+
13+
// FUNCTION: STRONGHOLDCRUSADER 0x004CF470
14+
void AICState::aiCommandTribe11StandGroundToGate(int playerID)
15+
{
16+
int tribeIndex = 11;
17+
if (DAT_GameState::instance.playerDataArray[playerID].aiType == AITA_NULL)
18+
return;
19+
int tribeID = DAT_GameState::instance.playerDataArray[playerID].aiTribeIDs[tribeIndex];
20+
if (tribeID == 0)
21+
return;
22+
if (DAT_TribesState::instance.tribes[tribeID].uid
23+
!= DAT_GameState::instance.playerDataArray[playerID].aiTribeUIDs[tribeIndex])
24+
return;
25+
if (DAT_TribesState::instance.tribes[tribeID].selectionTargetUnitID == 0)
26+
return;
27+
28+
DAT_TribesState::instance.tribes[tribeID].unitStance = Map::Units::Behavior::USE_STAND_GROUND;
29+
if (MACRO_CALL_MEMBER(Map::Units::TroopValueState_Func::moveTribeToNearbyGatehouse, DAT_TroopValueState::ptr)(
30+
tribeID)
31+
== 0)
32+
MACRO_CALL_MEMBER(Map::Units::TroopValueState_Func::moveTowardsParticularUnits, DAT_TroopValueState::ptr)(
33+
tribeID);
34+
}
35+
}
36+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
#include "OpenSHC/Map/Units/TribesState.func.hpp"
2+
#include "OpenSHC/AI/AICState.hpp"
3+
#include "OpenSHC/AI/AITypeA.hpp"
4+
#include "OpenSHC/Map/Units/Behavior/UnitStanceEnum.hpp"
5+
#include "OpenSHC/Map/Units/SomeTribeBehaviorType.hpp"
6+
7+
#include "OpenSHC/Globals/DAT_GameState.hpp"
8+
#include "OpenSHC/Globals/DAT_TribesState.hpp"
9+
10+
namespace OpenSHC {
11+
namespace AI {
12+
13+
// FUNCTION: STRONGHOLDCRUSADER 0x004CF270
14+
void AICState::aiCommandTribe13DefensiveWave(int playerID)
15+
{
16+
int tribeIndex = 13;
17+
if (DAT_GameState::instance.playerDataArray[playerID].aiType == AITA_NULL)
18+
return;
19+
int tribeID = DAT_GameState::instance.playerDataArray[playerID].aiTribeIDs[tribeIndex];
20+
if (tribeID == 0)
21+
return;
22+
if (DAT_TribesState::instance.tribes[tribeID].uid
23+
!= DAT_GameState::instance.playerDataArray[playerID].aiTribeUIDs[tribeIndex])
24+
return;
25+
if (DAT_TribesState::instance.tribes[tribeID].selectionTargetUnitID == 0)
26+
return;
27+
28+
DAT_TribesState::instance.tribes[tribeID].unitStance = Map::Units::Behavior::USE_DEFENSIVE;
29+
MACRO_CALL_MEMBER(Map::Units::TribesState_Func::assignAttackTargetsForTribe, DAT_TribesState::ptr)(
30+
tribeID, Map::Units::STBT_0x3f4);
31+
}
32+
}
33+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
#include "OpenSHC/AI/AICState.hpp"
2+
#include "OpenSHC/AI/AITypeA.hpp"
3+
4+
#include "OpenSHC/Globals/DAT_GameState.hpp"
5+
6+
namespace OpenSHC {
7+
namespace AI {
8+
9+
// FUNCTION: STRONGHOLDCRUSADER 0x004CB180
10+
int AICState::aiFarmChoice(PlayerID playerID)
11+
{
12+
int aiType = DAT_GameState::instance.playerDataArray[playerID].aiType;
13+
if (aiType == AITA_NULL)
14+
return 0;
15+
return (&this->aics[aiType - 1].farm1)[DAT_GameState::instance.playerDataArray[playerID].aiFarmIndex];
16+
}
17+
}
18+
}

0 commit comments

Comments
 (0)