Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
85 commits
Select commit Hold shift + click to select a range
d47a286
reimplement: SHC_3BB0A8C1_0x004F15C0 63.13% Register allocation
gynt Sep 22, 2026
2973454
reimplement: SHC_3BB0A8C1_0x004EFC30 96.00% Reimplemented
gynt Sep 22, 2026
e6c3472
reimplement: SHC_3BB0A8C1_0x004ED410 85.29% Stack slot assignment
gynt Sep 22, 2026
2e806f9
reimplement: SHC_3BB0A8C1_0x004ED300 96.23% Reimplemented
gynt Sep 22, 2026
31d0aac
reimplement: SHC_3BB0A8C1_0x004ED240 94.74% Reimplemented
gynt Sep 22, 2026
59e3218
reimplement: SHC_3BB0A8C1_0x004EFA60 91.89% Reimplemented
gynt Sep 22, 2026
cec75f7
reimplement: SHC_3BB0A8C1_0x004EFE30 91.11% Reimplemented
gynt Sep 22, 2026
093c0c1
reimplement: SHC_3BB0A8C1_0x004EFD90 91.11% Reimplemented
gynt Sep 22, 2026
7f4a7f5
reimplement: SHC_3BB0A8C1_0x004EFED0 93.81% Reimplemented
gynt Sep 22, 2026
257b2ab
reimplement: SHC_3BB0A8C1_0x004EFAB0 82.76% Register reuse after search
gynt Sep 22, 2026
2651b75
reimplement: SHC_3BB0A8C1_0x004EF0D0 30.96% Register alloc; 74% norma…
gynt Sep 23, 2026
d48a918
reimplement: SHC_3BB0A8C1_0x004EDC90 85.71% Reimplemented
gynt Sep 23, 2026
82b3055
reimplement: SHC_3BB0A8C1_0x004F13E0 83.33% Reimplemented
gynt Sep 23, 2026
091cef2
reimplement: SHC_3BB0A8C1_0x004ECFE0 100.00% Reimplemented
gynt Sep 23, 2026
dcea123
reimplement: SHC_3BB0A8C1_0x004EF8C0 60.19% Register alloc; 93% norma…
gynt Sep 23, 2026
bb97bdd
reimplement: SHC_3BB0A8C1_0x004EDD00 97.56% Reimplemented
gynt Sep 23, 2026
83267fd
reimplement: SHC_3BB0A8C1_0x004EF0D0 36.88% Stack slots; 77% normalized
gynt Sep 23, 2026
0d893c3
reimplement: SHC_3BB0A8C1_0x004F0060 36.43% Store scheduling; 77% nor…
gynt Sep 23, 2026
2e8ce2b
reimplement: SHC_3BB0A8C1_0x004EEE10 86.69% Register allocation
gynt Sep 23, 2026
03eef14
reimplement: SHC_3BB0A8C1_0x004EEBD0 94.57% Register allocation
gynt Sep 23, 2026
3a0a11a
reimplement: SHC_3BB0A8C1_0x004EE140 59.30% Register alloc; 79% norma…
gynt Sep 23, 2026
8b5b0d9
reimplement: SHC_3BB0A8C1_0x004EE430 49.90% Register alloc; 84% norma…
gynt Sep 23, 2026
b0cd6da
reimplement: SHC_3BB0A8C1_0x004EFB90 97.73% Reimplemented
gynt Sep 23, 2026
04e9a97
reimplement: SHC_3BB0A8C1_0x004EDDF0 83.01% Loop pointer anchor, regi…
gynt Sep 23, 2026
71621a6
reimplement: SHC_3BB0A8C1_0x004ED3B0 100.00% Reimplemented
gynt Sep 23, 2026
673f7e8
reimplement: SHC_3BB0A8C1_0x004ECBC0 64.71% Register allocation
gynt Sep 23, 2026
63812f5
reimplement: SHC_3BB0A8C1_0x004ECDB0 93.20% Header has extra int param
gynt Sep 23, 2026
5814d6e
reimplement: SHC_3BB0A8C1_0x004ECAD0 98.59% Reimplemented
gynt Sep 23, 2026
f30c105
reimplement: SHC_3BB0A8C1_0x004EDCB0 100.00% Reimplemented
gynt Sep 23, 2026
4548b8b
reimplement: SHC_3BB0A8C1_0x004ECF70 87.10% Reimplemented
gynt Sep 23, 2026
2a1b10b
reimplement: SHC_3BB0A8C1_0x004F14F0 91.55% Reimplemented
gynt Sep 23, 2026
b80525c
reimplement: SHC_3BB0A8C1_0x004EF090 90.00% Reimplemented
gynt Sep 23, 2026
61270dd
reimplement: SHC_3BB0A8C1_0x004ED0B0 95.33% Reimplemented
gynt Sep 23, 2026
9ac9079
reimplement: SHC_3BB0A8C1_0x004F13F0 90.00% Reimplemented
gynt Sep 23, 2026
80df82d
reimplement: SHC_3BB0A8C1_0x004ECE60 97.78% Reimplemented
gynt Sep 23, 2026
0025638
reimplement: SHC_3BB0A8C1_0x004EE830 72.82% Register alloc; 86% norma…
gynt Sep 23, 2026
b987dc9
reimplement: SHC_3BB0A8C1_0x004F1860 78.84% Register alloc; 92% norma…
gynt Sep 23, 2026
6a8eaae
reimplement: SHC_3BB0A8C1_0x004F0E80 84.55% Register allocation
gynt Sep 23, 2026
125f743
reimplement: SHC_3BB0A8C1_0x004ECDB0 100.00% Reimplemented
gynt Sep 23, 2026
cd2ea20
repair formatting issues
gynt Sep 23, 2026
f3aecba
reimplement: SHC_3BB0A8C1_0x004EE830 73.79% orig literal
gynt Sep 25, 2026
0389dd2
reimplement: SHC_3BB0A8C1_0x004F13F0 88.75% orig literal
gynt Sep 25, 2026
b8ff888
improve by ordering stack variable declarations
gynt Sep 26, 2026
2dba13e
reimplement: SHC_3BB0A8C1_0x004EE430 57.61% regalloc: orig caches pla…
gynt Sep 26, 2026
bfcb5fd
reimplement: SHC_3BB0A8C1_0x004EE140 62.57% regalloc: orig anchors di…
gynt Sep 26, 2026
4d65f90
reimplement: SHC_3BB0A8C1_0x004EDDF0 89.22% direction ptr anchored 4 low
gynt Sep 26, 2026
b8c8884
reimplement: SHC_3BB0A8C1_0x004EEBD0 96.12% orig CSEs heatmap addr
gynt Sep 26, 2026
02c51ea
reimplement: SHC_3BB0A8C1_0x004EE830 74.27% loop structure differs
gynt Sep 26, 2026
a251b22
reimplement: SHC_3BB0A8C1_0x004EEE10 87.45% orig spills fewer locals
gynt Sep 26, 2026
33c80d1
reimplement: SHC_3BB0A8C1_0x004EEBD0 97.67% scheduling only
gynt Sep 26, 2026
98d0d01
reimplement: SHC_3BB0A8C1_0x004F0E80 85.11% loop structure differs
gynt Sep 26, 2026
6a8ab2b
reimplement: SHC_3BB0A8C1_0x004F1860 79.67% orig compares member dire…
gynt Sep 26, 2026
11bbb6a
reimplement: SHC_3BB0A8C1_0x004EE830 76.70% orig spills direction ptr
gynt Sep 26, 2026
bcf4888
reimplement: SHC_3BB0A8C1_0x004F0060 36.43% Style pass, asm differs
gynt Sep 26, 2026
43b547e
reimplement: SHC_3BB0A8C1_0x004EDDF0 90.69% direction ptr anchored 4 low
gynt Sep 26, 2026
ddad806
reimplement: SHC_3BB0A8C1_0x004EEBD0 100.00% Reimplemented
gynt Sep 26, 2026
01f0f74
reimplement: SHC_3BB0A8C1_0x004EF0D0 37.06% register allocation diffe…
gynt Sep 26, 2026
eeabafb
reimplement: SHC_3BB0A8C1_0x004EE430 100.00% Reimplemented
gynt Sep 26, 2026
ebc8f1f
reimplement: SHC_3BB0A8C1_0x004EE140 92.35% orig keeps -1 in ebp
gynt Sep 26, 2026
2a76198
reimplement: SHC_3BB0A8C1_0x004EF8C0 94.39% only index/y init store o…
gynt Sep 26, 2026
ea05334
reimplement: SHC_3BB0A8C1_0x004EE830 100.00% Reimplemented
gynt Sep 26, 2026
3a55d09
reimplement: SHC_3BB0A8C1_0x004F0E80 85.96% fixed init fields (lowest…
gynt Sep 26, 2026
4cbeba5
reimplement: SHC_3BB0A8C1_0x004EDDF0 100.00% Reimplemented
gynt Sep 26, 2026
77c76ba
reimplement: SHC_3BB0A8C1_0x004EF0D0 65.73% orig spills y in loop 1, …
gynt Sep 26, 2026
bc7aad1
reimplement: SHC_3BB0A8C1_0x004F0060 36.43% chain register naming; or…
gynt Sep 26, 2026
ce0adc7
reimplement: SHC_3BB0A8C1_0x004ECBC0 64.71% BOOLEnum flags; gap is MS…
gynt Sep 26, 2026
1956f6b
reimplement: SHC_3BB0A8C1_0x004ED410 90.92% orig branches to a shared…
gynt Sep 26, 2026
ce38795
reimplement: SHC_3BB0A8C1_0x004F0E80 87.76% rest is scheduling + a ho…
gynt Sep 26, 2026
aa42e07
reimplement: SHC_3BB0A8C1_0x004EEE10 88.21% loop rotation; orig remat…
gynt Sep 26, 2026
ccf333d
reimplement: SHC_3BB0A8C1_0x004EF8C0 100.00% Reimplemented
gynt Oct 5, 2026
bbc1a1f
reimplement: SHC_3BB0A8C1_0x004F13F0 100.00% Reimplemented
gynt Oct 5, 2026
8f8a3c2
reimplement: SHC_3BB0A8C1_0x004ECF70 100.00% Reimplemented
gynt Oct 5, 2026
5eebadf
reimplement: SHC_3BB0A8C1_0x004F14F0 100.00% Reimplemented
gynt Oct 5, 2026
4c607db
reimplement: SHC_3BB0A8C1_0x004EE140 100.00% Reimplemented
gynt Oct 5, 2026
44981b5
reimplement: SHC_3BB0A8C1_0x004F15C0 98.51% init stores sit after the…
gynt Oct 5, 2026
1ea712e
reimplement: SHC_3BB0A8C1_0x004F1860 90.83% orig has a redundant cmp …
gynt Oct 5, 2026
2e4b6af
reimplement: SHC_3BB0A8C1_0x004ECBC0 68.63% orig branch shape; regist…
gynt Oct 5, 2026
2f2382f
reimplement: SHC_3BB0A8C1_0x004F0060 36.68% aiType - 1 chain; registe…
gynt Oct 5, 2026
477c374
reimplement: SHC_3BB0A8C1_0x004ED410 95.31% orig branches to a shared…
gynt Oct 5, 2026
c63e0f5
enable clearTheHeatmaps resolver so wipeAIVsAndHeatMaps tail call mat…
gynt Oct 5, 2026
1e65179
status: update AIVState percentages from reccmp with --resolve-wrappe…
gynt Oct 5, 2026
536189d
reimplement: SHC_3BB0A8C1_0x004ED410 100.00% Reimplemented
gynt Oct 5, 2026
22bb8d7
reimplement: SHC_3BB0A8C1_0x004F0060 53.56% step < 50 fix; registers …
gynt Oct 5, 2026
c98df00
reimplement: SHC_3BB0A8C1_0x004EF0D0 67.19% orig spills y in loop 1
gynt Oct 5, 2026
16e56af
build executeDefaultCastleAIV and findAppropriateGridLocationForBuild…
gynt Oct 5, 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 cmake/compiler-flags-gl.txt
Original file line number Diff line number Diff line change
Expand Up @@ -7,3 +7,6 @@ src/OpenSHC/IO/ResourceManager/swapMapDataWithNextMap.cpp
src/OpenSHC/UI/Rendering/WindowAndDirectDraw/takeScreenshot.cpp
src/OpenSHC/IO/ResourceManager/readFirstPartOfCurrentResourceIntoMemory.cpp
src/OpenSHC/IO/ResourceManager/readNextPartOfCurrentResourceIntoMemory.cpp

src/OpenSHC/AI/AIVState/executeDefaultCastleAIV.cpp
src/OpenSHC/AI/AIVState/findAppropriateGridLocationForBuilding.cpp
4 changes: 2 additions & 2 deletions src/OpenSHC/AI/AIVState.func.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ namespace AI {
aiPlaceAIVBuilding;

MACRO_FUNCTION_RESOLVER(
void (AIVState::*)(), false, Address::SHC_3BB0A8C1_0x004EDC90, &AIVState::clearTheHeatmaps)
void (AIVState::*)(), true, Address::SHC_3BB0A8C1_0x004EDC90, &AIVState::clearTheHeatmaps)
clearTheHeatmaps;

MACRO_FUNCTION_RESOLVER(
Expand Down Expand Up @@ -103,7 +103,7 @@ namespace AI {
&AIVState::findSuitableGridLocationFittingCriteria)
findSuitableGridLocationFittingCriteria;

MACRO_FUNCTION_RESOLVER(void (AIVState::*)(uint, uint), false, Address::SHC_3BB0A8C1_0x004EEE10,
MACRO_FUNCTION_RESOLVER(void (AIVState::*)(uint, uint), true, Address::SHC_3BB0A8C1_0x004EEE10,
&AIVState::findAppropriateGridLocationForBuilding)
findAppropriateGridLocationForBuilding;

Expand Down
14 changes: 14 additions & 0 deletions src/OpenSHC/AI/AIVState/Constructor_AIVState.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
#include "../AIVState.func.hpp"

namespace OpenSHC {
namespace AI {

// FUNCTION: STRONGHOLDCRUSADER 0x004F13E0
AIVState* AIVState::Constructor_AIVState()
{
MACRO_CALL_MEMBER(AIVState_Func::wipeAIVsAndHeatMaps, this)();
return this;
}

}
}
115 changes: 115 additions & 0 deletions src/OpenSHC/AI/AIVState/aiDecideOnNewBuildings.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,115 @@
#include "../AIVState.func.hpp"

#include "OpenSHC/AI/AICState.func.hpp"

#include "OpenSHC/Globals/DAT_AICState.hpp"
#include "OpenSHC/Globals/DAT_GameState.hpp"

namespace OpenSHC {
namespace AI {

// FUNCTION: STRONGHOLDCRUSADER 0x004F15C0
void AIVState::aiDecideOnNewBuildings(PlayerID playerID)
{
int const aivID = DAT_GameState::instance.playerDataArray[playerID].aivID;

if (aivID <= 0) {
return;
}

int isPausing = 0;
int stepIncrement = 1;

if (DAT_GameState::instance.playerDataArray[playerID].resourceRebuildDelay != 0) {
++DAT_GameState::instance.playerDataArray[playerID].resourceRebuildDelay;
if (DAT_GameState::instance.playerDataArray[playerID].resourceRebuildDelay
< MACRO_CALL_MEMBER(AICState_Func::getResourceRebuildDelay, DAT_AICState::ptr)(playerID)) {
return;
}
DAT_GameState::instance.playerDataArray[playerID].resourceRebuildDelay = 0;
}

if (DAT_GameState::instance.playerDataArray[playerID].currentResources[Game::Resources::RT_GOLD] > 16000) {
// rich
stepIncrement = 2;
} else if (DAT_GameState::instance.playerDataArray[playerID].currentResources[Game::Resources::RT_GOLD]
> 5000) {
stepIncrement = 1;
} else {
// poor
++this->aivs[aivID].aivPoorCounter;
if (this->aivs[aivID].aivPoorCounter < this->aivs[aivID].aivPoorLimit_OR_AIC_buildInterval) {
return;
}
}
this->aivs[aivID].aivPoorCounter = 0;

++DAT_GameState::instance.playerDataArray[playerID].aiResourceBuildingFocusIndicator;
if (DAT_GameState::instance.playerDataArray[playerID].aiResourceBuildingFocusIndicator >= 5) {
DAT_GameState::instance.playerDataArray[playerID].aiResourceBuildingFocusIndicator = 0;
}
if (DAT_GameState::instance.playerDataArray[playerID].aiResourceBuildingFocusIndicator == 0) {
if (!MACRO_CALL_MEMBER(AICState_Func::shouldDestroyWoodCutterUnk, DAT_AICState::ptr)(playerID)
&& MACRO_CALL_MEMBER(AICState_Func::aiShouldBuildWoodcutter, DAT_AICState::ptr)(playerID)) {
MACRO_CALL_MEMBER(AIVState_Func::aiPlaceWoodcuttershut, this)(playerID);
}
} else if (DAT_GameState::instance.playerDataArray[playerID].aiResourceBuildingFocusIndicator == 1) {
if (MACRO_CALL_MEMBER(AICState_Func::aiShouldBuildFarm, DAT_AICState::ptr)(playerID)
&& MACRO_CALL_MEMBER(AIVState_Func::aiPlaceFarm, this)(playerID,
(MappersEnum)MACRO_CALL_MEMBER(AICState_Func::aiFarmChoice, DAT_AICState::ptr)(playerID))) {
MACRO_CALL_MEMBER(AICState_Func::setNextFarmTypeToBuild, DAT_AICState::ptr)(playerID);
}
} else if (DAT_GameState::instance.playerDataArray[playerID].aiResourceBuildingFocusIndicator == 2) {
if (MACRO_CALL_MEMBER(AICState_Func::aiShouldBuildQuarry, DAT_AICState::ptr)(playerID)) {
MACRO_CALL_MEMBER(AIVState_Func::aiPlaceQuarryAndOxtether, this)(playerID);
}
if (MACRO_CALL_MEMBER(AICState_Func::aiRequiresExtraOxtethers, DAT_AICState::ptr)(playerID)) {
MACRO_CALL_MEMBER(AIVState_Func::aiPlaceAdditionalOxtether, this)(playerID);
}
} else if (DAT_GameState::instance.playerDataArray[playerID].aiResourceBuildingFocusIndicator == 3) {
if (MACRO_CALL_MEMBER(AICState_Func::aiShouldBuildIronMine, DAT_AICState::ptr)(playerID)) {
MACRO_CALL_MEMBER(AIVState_Func::aiPlaceIronMine, this)(playerID);
}
} else if (DAT_GameState::instance.playerDataArray[playerID].aiResourceBuildingFocusIndicator == 4) {
if (MACRO_CALL_MEMBER(AICState_Func::aiShouldBuildPitchrig, DAT_AICState::ptr)(playerID)) {
MACRO_CALL_MEMBER(AIVState_Func::aiPlacePitchrig, this)(playerID);
}
}

if (DAT_GameState::instance.playerDataArray[playerID].aivCurrentPause != 0) {
if (stepIncrement > 1) {
DAT_GameState::instance.playerDataArray[playerID].aivCurrentPause = 0;
} else {
--DAT_GameState::instance.playerDataArray[playerID].aivCurrentPause;
}
isPausing = 1;
} else {
int const pauseStep
= DAT_GameState::instance.playerDataArray[playerID]
.aivPauses[DAT_GameState::instance.playerDataArray[playerID].aivCurrentPauseIndex];
if (pauseStep > 0 && this->aivs[aivID].currentStepGoal >= pauseStep) {
DAT_GameState::instance.playerDataArray[playerID].aivCurrentPause
= DAT_GameState::instance.playerDataArray[playerID].aivPauseDelay;
++DAT_GameState::instance.playerDataArray[playerID].aivCurrentPauseIndex;
return;
}
// the step goal can advance by 2 when the player is rich
this->aivs[aivID].currentStepGoal += stepIncrement;
}

if (this->aivs[aivID].aivSubType == 0) {
MACRO_CALL_MEMBER(AIVState_Func::executeDefaultCastleAIV, this)(playerID, isPausing);
} else if (!MACRO_CALL_MEMBER(AICState_Func::destroyHouse, DAT_AICState::ptr)(playerID)) {
for (int step = 1; step <= this->aivs[aivID].totalSteps && step <= this->aivs[aivID].currentStepGoal;
++step) {
if (MACRO_CALL_MEMBER(AIVState_Func::aiPlaceAIVBuilding, this)(playerID, step, isPausing)) {
break;
}
}
}
MACRO_CALL_MEMBER(AIVState_Func::aiPlaceFlag, this)(playerID);
MACRO_CALL_MEMBER(AIVState_Func::aiPlaceBrazier, this)(playerID);
}

}
}
Loading