From 30f61425221eaab45654c46d181ed74a2f97c78f Mon Sep 17 00:00:00 2001 From: sourcehold Date: Tue, 12 May 2026 23:51:19 +0200 Subject: [PATCH 1/3] reimplement: SHC_3BB0A8C1_0x004ECEF0 100% --- src/OpenSHC/AI/AIVState.func.hpp | 2 +- src/OpenSHC/AI/AIVState/setupAIVMetadata.cpp | 39 ++++++++++++++++++++ status/addresses-SHC-3BB0A8C1.txt | 2 +- 3 files changed, 41 insertions(+), 2 deletions(-) create mode 100644 src/OpenSHC/AI/AIVState/setupAIVMetadata.cpp diff --git a/src/OpenSHC/AI/AIVState.func.hpp b/src/OpenSHC/AI/AIVState.func.hpp index a5bad73e..d6d17b92 100644 --- a/src/OpenSHC/AI/AIVState.func.hpp +++ b/src/OpenSHC/AI/AIVState.func.hpp @@ -35,7 +35,7 @@ namespace AI { syncAIPlayerNamesAndBuildIntervals; MACRO_FUNCTION_RESOLVER( - int (AIVState::*)(int), false, Address::SHC_3BB0A8C1_0x004ECEF0, &AIVState::setupAIVMetadata) + int (AIVState::*)(int), true, Address::SHC_3BB0A8C1_0x004ECEF0, &AIVState::setupAIVMetadata) setupAIVMetadata; MACRO_FUNCTION_RESOLVER(void (AIVState::*)(int, int, int), false, Address::SHC_3BB0A8C1_0x004ECF70, diff --git a/src/OpenSHC/AI/AIVState/setupAIVMetadata.cpp b/src/OpenSHC/AI/AIVState/setupAIVMetadata.cpp new file mode 100644 index 00000000..072b11ff --- /dev/null +++ b/src/OpenSHC/AI/AIVState/setupAIVMetadata.cpp @@ -0,0 +1,39 @@ +#include "OpenSHC/AI/AICState.func.hpp" +#include "OpenSHC/AI/AIVState.hpp" +#include "OpenSHC/Globals/DAT_AICState.hpp" +#include "OpenSHC/Globals/DAT_GameState.hpp" + +namespace OpenSHC { +namespace AI { + + // FUNCTION: STRONGHOLDCRUSADER 0x004ECEF0 + int AIVState::setupAIVMetadata(int playerID) + { + int aivID = 1; + AIVSpec* pSlot = &this->SEC_AIVS[1]; + do { + if (pSlot->playerID == 0) { + this->SEC_AIVS[aivID].playerID = playerID; + + int aiType = DAT_GameState::ptr->playerDataArray[playerID].aiType; + this->SEC_AIVS[aivID].aiType = aiType; + + this->SEC_AIVS[aivID].currentStepGoal = 0; + this->SEC_AIVS[aivID].aivPoorCounter = 0; + this->SEC_AIVS[aivID].aivSubType = 0; + + this->SEC_AIVS[aivID].aivPoorLimit_OR_AIC_buildInterval + = MACRO_CALL_MEMBER(AICState_Func::getAIBuildInterval, DAT_AICState::ptr)(playerID); + + this->aivCount = this->aivCount + 1; + + return aivID; + } + aivID = aivID + 1; + pSlot = pSlot + 1; + } while (aivID < 9); + return 0; + } + +} +} diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 36120333..d05f2c9f 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -18496,7 +18496,7 @@ SHC_3BB0A8C1_0x004ECDB0 | 0.0% | Pending SHC_3BB0A8C1_0x004ECDE0 | 0.0% | Pending SHC_3BB0A8C1_0x004ECDF0 | 0.0% | Pending SHC_3BB0A8C1_0x004ECE60 | 0.0% | Pending -SHC_3BB0A8C1_0x004ECEF0 | 0.0% | Pending +SHC_3BB0A8C1_0x004ECEF0 | 100.0% | Reimplemented SHC_3BB0A8C1_0x004ECF70 | 0.0% | Pending SHC_3BB0A8C1_0x004ECFE0 | 0.0% | Pending SHC_3BB0A8C1_0x004ED070 | 0.0% | Pending From 8e54bea50239220e45f295bd7ccfcf74950f72d5 Mon Sep 17 00:00:00 2001 From: sourcehold Date: Fri, 22 May 2026 13:52:03 +0200 Subject: [PATCH 2/3] improve loop --- src/OpenSHC/AI/AIVState/setupAIVMetadata.cpp | 32 +++++++++----------- 1 file changed, 14 insertions(+), 18 deletions(-) diff --git a/src/OpenSHC/AI/AIVState/setupAIVMetadata.cpp b/src/OpenSHC/AI/AIVState/setupAIVMetadata.cpp index 072b11ff..02d5f321 100644 --- a/src/OpenSHC/AI/AIVState/setupAIVMetadata.cpp +++ b/src/OpenSHC/AI/AIVState/setupAIVMetadata.cpp @@ -9,29 +9,25 @@ namespace AI { // FUNCTION: STRONGHOLDCRUSADER 0x004ECEF0 int AIVState::setupAIVMetadata(int playerID) { - int aivID = 1; - AIVSpec* pSlot = &this->SEC_AIVS[1]; - do { - if (pSlot->playerID == 0) { - this->SEC_AIVS[aivID].playerID = playerID; + for (int aivID = 1; aivID < 9; ++aivID) { + if (this->SEC_AIVS[aivID].playerID != 0) { + continue; + } - int aiType = DAT_GameState::ptr->playerDataArray[playerID].aiType; - this->SEC_AIVS[aivID].aiType = aiType; + this->SEC_AIVS[aivID].playerID = playerID; - this->SEC_AIVS[aivID].currentStepGoal = 0; - this->SEC_AIVS[aivID].aivPoorCounter = 0; - this->SEC_AIVS[aivID].aivSubType = 0; + this->SEC_AIVS[aivID].aiType = DAT_GameState::ptr->playerDataArray[playerID].aiType; - this->SEC_AIVS[aivID].aivPoorLimit_OR_AIC_buildInterval - = MACRO_CALL_MEMBER(AICState_Func::getAIBuildInterval, DAT_AICState::ptr)(playerID); + this->SEC_AIVS[aivID].currentStepGoal = 0; + this->SEC_AIVS[aivID].aivPoorCounter = 0; + this->SEC_AIVS[aivID].aivSubType = 0; - this->aivCount = this->aivCount + 1; + this->SEC_AIVS[aivID].aivPoorLimit_OR_AIC_buildInterval + = MACRO_CALL_MEMBER(AICState_Func::getAIBuildInterval, DAT_AICState::ptr)(playerID); - return aivID; - } - aivID = aivID + 1; - pSlot = pSlot + 1; - } while (aivID < 9); + ++this->aivCount; + return aivID; + } return 0; } From 22c623e294f510aef573cb01b9c83b5347a3fc56 Mon Sep 17 00:00:00 2001 From: sourcehold Date: Fri, 22 May 2026 14:29:40 +0200 Subject: [PATCH 3/3] remove .func. --- src/OpenSHC/AI/AIVState.func.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/OpenSHC/AI/AIVState.func.hpp b/src/OpenSHC/AI/AIVState.func.hpp index d6d17b92..a5bad73e 100644 --- a/src/OpenSHC/AI/AIVState.func.hpp +++ b/src/OpenSHC/AI/AIVState.func.hpp @@ -35,7 +35,7 @@ namespace AI { syncAIPlayerNamesAndBuildIntervals; MACRO_FUNCTION_RESOLVER( - int (AIVState::*)(int), true, Address::SHC_3BB0A8C1_0x004ECEF0, &AIVState::setupAIVMetadata) + int (AIVState::*)(int), false, Address::SHC_3BB0A8C1_0x004ECEF0, &AIVState::setupAIVMetadata) setupAIVMetadata; MACRO_FUNCTION_RESOLVER(void (AIVState::*)(int, int, int), false, Address::SHC_3BB0A8C1_0x004ECF70,