From 59ef0f9ea9263c6b42b55d429a58f5c5d7834d83 Mon Sep 17 00:00:00 2001 From: TheRedDaemon <66257843+TheRedDaemon@users.noreply.github.com> Date: Wed, 8 Jul 2026 21:33:49 +0200 Subject: [PATCH 1/6] reimplement: SHC_3BB0A8C1_0x0044B840 setup --- .../SFX/UpdateUnitLossSpeechFeedback.cpp | 241 ++++++++++++++++++ 1 file changed, 241 insertions(+) create mode 100644 src/OpenSHC/Audio/SFX/UpdateUnitLossSpeechFeedback.cpp diff --git a/src/OpenSHC/Audio/SFX/UpdateUnitLossSpeechFeedback.cpp b/src/OpenSHC/Audio/SFX/UpdateUnitLossSpeechFeedback.cpp new file mode 100644 index 00000000..3b0730fb --- /dev/null +++ b/src/OpenSHC/Audio/SFX/UpdateUnitLossSpeechFeedback.cpp @@ -0,0 +1,241 @@ +#include "../SFX.func.hpp" + +#include "OpenSHC/AI/AICState.func.hpp" +#include "OpenSHC/Audio/SFX/SFXState.func.hpp" +#include "OpenSHC/Game.func.hpp" +#include "OpenSHC/string-literals.hpp" + +#include "OpenSHC/Globals/DAT_AICState.hpp" +#include "OpenSHC/Globals/DAT_CurrentPlayerUnitLosses.hpp" +#include "OpenSHC/Globals/DAT_CurrentPlayerUnitLossesHistory.hpp" +#include "OpenSHC/Globals/DAT_DestroyedBuildingsCount.hpp" +#include "OpenSHC/Globals/DAT_DestroyedBuildingsCountHistory.hpp" +#include "OpenSHC/Globals/DAT_GL_Counter.hpp" +#include "OpenSHC/Globals/DAT_GameCore.hpp" +#include "OpenSHC/Globals/DAT_GameState.hpp" +#include "OpenSHC/Globals/DAT_GameSynchronyState.hpp" +#include "OpenSHC/Globals/DAT_SFXState.hpp" +#include "OpenSHC/Globals/DAT_TotalUnitValueLossesEnemyHistory.hpp" +#include "OpenSHC/Globals/DAT_UnitValueLossesPerEnemyPlayer.hpp" +#include "OpenSHC/Globals/Dat_UnitValueLossesHistoryPerEnemyPlayer.hpp" + +namespace OpenSHC { +namespace Audio { + namespace SFX { + + // FUNCTION: STRONGHOLDCRUSADER 0x0044B840 + void __stdcall UpdateUnitLossSpeechFeedback() + { + undefined4 uVar1; + undefined4 uVar2; + int _offset; + int _relative1; + int _relative2; + int iVar3; + int iVar4; + int* piVar5; + int iVar6; + int iVar7; + char const* wav_filename; + + if (DAT_GameCore::instance.currentMenuViewType != UI::Enums::MVT_BUILD_MENU) { + return; + } + if (DAT_GameState::instance.playerDataArray[DAT_GameSynchronyState::instance.currentPlayerSlotID] + .playerDeathRelated + != 0) { + return; + } + if (DAT_GameState::instance.playerDataArray[DAT_GameSynchronyState::instance.currentPlayerSlotID] + .lordKilledByPlayerID + != 0) { + return; + } + if (DAT_GameCore::instance.gameMode_2 == Game::GM_CAMPAIGN_MISSION) { + return; + } + ++DAT_GL_Counter::instance; + _offset = 0; + do { + uVar1 = *(undefined4*)((int)DAT_TotalUnitValueLossesEnemyHistory::instance + _offset + 0x20); + *(undefined4*)((int)DAT_CurrentPlayerUnitLossesHistory::instance + _offset + 0x24) + = *(undefined4*)((int)DAT_CurrentPlayerUnitLossesHistory::instance + _offset + 0x20); + uVar2 = *(undefined4*)((int)Dat_UnitValueLossesHistoryPerEnemyPlayer::instance[0] + _offset + 0x20); + *(undefined4*)((int)DAT_TotalUnitValueLossesEnemyHistory::instance + _offset + 0x24) = uVar1; + uVar1 = *(undefined4*)((int)Dat_UnitValueLossesHistoryPerEnemyPlayer::instance[1] + _offset + 0x20); + *(undefined4*)((int)Dat_UnitValueLossesHistoryPerEnemyPlayer::instance[0] + _offset + 0x24) = uVar2; + uVar2 = *(undefined4*)((int)Dat_UnitValueLossesHistoryPerEnemyPlayer::instance[2] + _offset + 0x20); + *(undefined4*)((int)Dat_UnitValueLossesHistoryPerEnemyPlayer::instance[1] + _offset + 0x24) = uVar1; + uVar1 = *(undefined4*)((int)Dat_UnitValueLossesHistoryPerEnemyPlayer::instance[3] + _offset + 0x20); + *(undefined4*)((int)Dat_UnitValueLossesHistoryPerEnemyPlayer::instance[2] + _offset + 0x24) = uVar2; + uVar2 = *(undefined4*)((int)Dat_UnitValueLossesHistoryPerEnemyPlayer::instance[4] + _offset + 0x20); + *(undefined4*)((int)Dat_UnitValueLossesHistoryPerEnemyPlayer::instance[3] + _offset + 0x24) = uVar1; + uVar1 = *(undefined4*)((int)Dat_UnitValueLossesHistoryPerEnemyPlayer::instance[5] + _offset + 0x20); + *(undefined4*)((int)Dat_UnitValueLossesHistoryPerEnemyPlayer::instance[4] + _offset + 0x24) = uVar2; + uVar2 = *(undefined4*)((int)Dat_UnitValueLossesHistoryPerEnemyPlayer::instance[6] + _offset + 0x20); + *(undefined4*)((int)Dat_UnitValueLossesHistoryPerEnemyPlayer::instance[5] + _offset + 0x24) = uVar1; + uVar1 = *(undefined4*)((int)Dat_UnitValueLossesHistoryPerEnemyPlayer::instance[7] + _offset + 0x20); + *(undefined4*)((int)Dat_UnitValueLossesHistoryPerEnemyPlayer::instance[6] + _offset + 0x24) = uVar2; + uVar2 = *(undefined4*)((int)Dat_UnitValueLossesHistoryPerEnemyPlayer::instance[8] + _offset + 0x20); + *(undefined4*)((int)Dat_UnitValueLossesHistoryPerEnemyPlayer::instance[7] + _offset + 0x24) = uVar1; + *(undefined4*)((int)Dat_UnitValueLossesHistoryPerEnemyPlayer::instance[8] + _offset + 0x24) = uVar2; + iVar7 = DAT_TotalUnitValueLossesEnemyHistory::instance[2]; + iVar6 = DAT_TotalUnitValueLossesEnemyHistory::instance[1]; + iVar3 = DAT_CurrentPlayerUnitLossesHistory::instance[2]; + _offset = _offset + -4; + } while (-33 < _offset); + Dat_UnitValueLossesHistoryPerEnemyPlayer::instance[6][0] = DAT_UnitValueLossesPerEnemyPlayer::instance[6]; + Dat_UnitValueLossesHistoryPerEnemyPlayer::instance[7][0] = DAT_UnitValueLossesPerEnemyPlayer::instance[7]; + DAT_CurrentPlayerUnitLossesHistory::instance[0] = DAT_CurrentPlayerUnitLosses::instance; + DAT_TotalUnitValueLossesEnemyHistory::instance[0] = DAT_UnitValueLossesPerEnemyPlayer::instance[7] + + DAT_UnitValueLossesPerEnemyPlayer::instance[8] + DAT_UnitValueLossesPerEnemyPlayer::instance[6] + + DAT_UnitValueLossesPerEnemyPlayer::instance[5] + DAT_UnitValueLossesPerEnemyPlayer::instance[4] + + DAT_UnitValueLossesPerEnemyPlayer::instance[3] + DAT_UnitValueLossesPerEnemyPlayer::instance[2] + + DAT_UnitValueLossesPerEnemyPlayer::instance[1]; + Dat_UnitValueLossesHistoryPerEnemyPlayer::instance[1][0] = DAT_UnitValueLossesPerEnemyPlayer::instance[1]; + Dat_UnitValueLossesHistoryPerEnemyPlayer::instance[2][0] = DAT_UnitValueLossesPerEnemyPlayer::instance[2]; + Dat_UnitValueLossesHistoryPerEnemyPlayer::instance[3][0] = DAT_UnitValueLossesPerEnemyPlayer::instance[3]; + Dat_UnitValueLossesHistoryPerEnemyPlayer::instance[4][0] = DAT_UnitValueLossesPerEnemyPlayer::instance[4]; + Dat_UnitValueLossesHistoryPerEnemyPlayer::instance[5][0] = DAT_UnitValueLossesPerEnemyPlayer::instance[5]; + Dat_UnitValueLossesHistoryPerEnemyPlayer::instance[8][0] = DAT_UnitValueLossesPerEnemyPlayer::instance[8]; + if (((DAT_GL_Counter::instance < 2) + || (49 < DAT_TotalUnitValueLossesEnemyHistory::instance[0] + DAT_CurrentPlayerUnitLosses::instance)) + || (DAT_TotalUnitValueLossesEnemyHistory::instance[2] + DAT_CurrentPlayerUnitLossesHistory::instance[2] + + DAT_TotalUnitValueLossesEnemyHistory::instance[1] + + DAT_CurrentPlayerUnitLossesHistory::instance[1] + < 151)) + goto LAB_0044bbf0; + _relative1 = MACRO_CALL(Game_Func::RelativeValueForGenie)( + DAT_CurrentPlayerUnitLossesHistory::instance[1] + DAT_CurrentPlayerUnitLossesHistory::instance[2], + DAT_TotalUnitValueLossesEnemyHistory::instance[2] + DAT_TotalUnitValueLossesEnemyHistory::instance[1]); + _relative2 = MACRO_CALL(Game_Func::RelativeValueForGenie)(DAT_CurrentPlayerUnitLossesHistory::instance[3] + + DAT_CurrentPlayerUnitLossesHistory::instance[4] + DAT_CurrentPlayerUnitLossesHistory::instance[5] + + DAT_CurrentPlayerUnitLossesHistory::instance[6] + DAT_CurrentPlayerUnitLossesHistory::instance[7] + + DAT_CurrentPlayerUnitLossesHistory::instance[8] + DAT_CurrentPlayerUnitLossesHistory::instance[9] + + iVar3 + DAT_CurrentPlayerUnitLossesHistory::instance[1], + DAT_TotalUnitValueLossesEnemyHistory::instance[5] + DAT_TotalUnitValueLossesEnemyHistory::instance[4] + + DAT_TotalUnitValueLossesEnemyHistory::instance[6] + + DAT_TotalUnitValueLossesEnemyHistory::instance[7] + + DAT_TotalUnitValueLossesEnemyHistory::instance[8] + + DAT_TotalUnitValueLossesEnemyHistory::instance[9] + + DAT_TotalUnitValueLossesEnemyHistory::instance[3] + iVar7 + iVar6); + if (_relative1 == 0) { + if (_relative2 != 0) + goto LAB_0044bbf0; + if (DAT_GameCore::instance.genieVoiceActive != FALSE) { + /* "A Valliant Effort" */ + MACRO_CALL_MEMBER(SFXState_Func::playWAVSFX, DAT_SFXState::ptr)(s_Genie_29_wav_005a4ecc); + } + goto LAB_0044bbe6; + } + if ((0 < _relative1) && (0 < _relative2)) { + _relative1 = (_relative2 + _relative1) / 2; + if (DAT_GameCore::instance.genieVoiceActive != FALSE) { + if (_relative1 == 1) { + /* "Majestic" */ + wav_filename = s_Genie_30_wav_005a4ebc; + } else if (_relative1 == 2) { + /* "Excellent" */ + wav_filename = s_Genie_31_wav_005a4eac; + } else if (_relative1 == 3) { + /* "Impressive" */ + wav_filename = s_Genie_32_wav_005a4e9c; + } else if (_relative1 == 4) { + /* "Glorious" */ + wav_filename = s_Genie_34_wav_005a4e8c; + } else if (_relative1 == 5) { + /* "For the crown" */ + wav_filename = s_Genie_37_wav_005a4e7c; + } else if (_relative1 == 6) { + /* "Heroic" */ + wav_filename = s_Genie_38_wav_005a4e6c; + } else { + if (_relative1 < 7) + goto LAB_0044bb0d; + /* "It's a Rout" */ + wav_filename = s_Genie_39_wav_005a4e5c; + } + MACRO_CALL_MEMBER(SFXState_Func::playWAVSFX, DAT_SFXState::ptr)(wav_filename); + } + LAB_0044bb0d: + DAT_GL_Counter::instance = 0; + } + if ((-1 < _relative1) || (-1 < _relative2)) + goto LAB_0044bbf0; + iVar3 = (_relative2 + _relative1) / 2; + if (DAT_GameCore::instance.genieVoiceActive == FALSE) { + LAB_0044bb68: + if (iVar3 < -2) { + if (DAT_GameCore::instance.genieVoiceActive != FALSE) { + /* "Humiliated" */ + MACRO_CALL_MEMBER(SFXState_Func::playWAVSFX, DAT_SFXState::ptr)(s_Genie_44_wav_005a4e2c); + } + iVar7 = -1; + iVar6 = 0; + iVar3 = 1; + piVar5 = Dat_UnitValueLossesHistoryPerEnemyPlayer::instance[1] + 8; + do { + iVar4 = piVar5[-7] + piVar5[-6] + piVar5[-5] + piVar5[-4] + piVar5[-3] + piVar5[-2] + piVar5[-1] + + piVar5[1] + *piVar5; + if (iVar6 < iVar4) { + iVar6 = iVar4; + iVar7 = iVar3; + } + piVar5 = piVar5 + 10; + iVar3 = iVar3 + 1; + } while ((int)piVar5 < 0xb98610); + if ((iVar7 != -1) + && (DAT_GameState::instance.mapAndTime.playerTeams[iVar7] + != DAT_GameState::instance.mapAndTime + .playerTeams[DAT_GameSynchronyState::instance.currentPlayerSlotID])) { + MACRO_CALL_MEMBER(AI::AICState_Func::playFriendlyVictoryBikFromPlayer, DAT_AICState::ptr)( + iVar7); + } + } + } else if (iVar3 == -1) { + /* "Vanquished" */ + MACRO_CALL_MEMBER(SFXState_Func::playWAVSFX, DAT_SFXState::ptr)(s_Genie_42_wav_005a4e4c); + } else { + if (iVar3 != -2) + goto LAB_0044bb68; + /* "Crest falling" */ + MACRO_CALL_MEMBER(SFXState_Func::playWAVSFX, DAT_SFXState::ptr)(s_Genie_43_wav_005a4e3c); + } + LAB_0044bbe6: + DAT_GL_Counter::instance = 0; + LAB_0044bbf0: + DAT_CurrentPlayerUnitLosses::instance = 0; + DAT_UnitValueLossesPerEnemyPlayer::instance[0] = 0; + DAT_UnitValueLossesPerEnemyPlayer::instance[1] = 0; + DAT_UnitValueLossesPerEnemyPlayer::instance[2] = 0; + DAT_UnitValueLossesPerEnemyPlayer::instance[3] = 0; + DAT_UnitValueLossesPerEnemyPlayer::instance[4] = 0; + DAT_UnitValueLossesPerEnemyPlayer::instance[5] = 0; + DAT_UnitValueLossesPerEnemyPlayer::instance[6] = 0; + DAT_UnitValueLossesPerEnemyPlayer::instance[7] = 0; + DAT_UnitValueLossesPerEnemyPlayer::instance[8] = 0; + if ((1 < DAT_DestroyedBuildingsCount::instance) + && (5 < DAT_DestroyedBuildingsCountHistory::instance[0] + + DAT_DestroyedBuildingsCountHistory::instance[1] + + DAT_DestroyedBuildingsCountHistory::instance[2] + + DAT_DestroyedBuildingsCountHistory::instance[3] + DAT_DestroyedBuildingsCount::instance)) { + if (DAT_GameCore::instance.genieVoiceActive != FALSE) { + /* "Where is your Castle" */ + MACRO_CALL_MEMBER(SFXState_Func::playWAVSFX, DAT_SFXState::ptr)(s_Genie_41_wav_005a4e1c); + } + DAT_DestroyedBuildingsCount::instance = 0; + DAT_DestroyedBuildingsCountHistory::instance[0] = 0; + DAT_DestroyedBuildingsCountHistory::instance[1] = 0; + DAT_DestroyedBuildingsCountHistory::instance[2] = 0; + } + DAT_DestroyedBuildingsCountHistory::instance[3] = DAT_DestroyedBuildingsCountHistory::instance[2]; + DAT_DestroyedBuildingsCountHistory::instance[2] = DAT_DestroyedBuildingsCountHistory::instance[1]; + DAT_DestroyedBuildingsCountHistory::instance[1] = DAT_DestroyedBuildingsCountHistory::instance[0]; + DAT_DestroyedBuildingsCountHistory::instance[0] = DAT_DestroyedBuildingsCount::instance; + DAT_DestroyedBuildingsCount::instance = 0; + return; + } + + } +} +} From dcfd5f08bb3419cecfa87ce10f5ead487486d763 Mon Sep 17 00:00:00 2001 From: TheRedDaemon <66257843+TheRedDaemon@users.noreply.github.com> Date: Thu, 9 Jul 2026 00:02:59 +0200 Subject: [PATCH 2/6] reimplement: SHC_3BB0A8C1_0x0044B840 remove goto --- .../SFX/UpdateUnitLossSpeechFeedback.cpp | 270 ++++++++---------- 1 file changed, 124 insertions(+), 146 deletions(-) diff --git a/src/OpenSHC/Audio/SFX/UpdateUnitLossSpeechFeedback.cpp b/src/OpenSHC/Audio/SFX/UpdateUnitLossSpeechFeedback.cpp index 3b0730fb..40b2007d 100644 --- a/src/OpenSHC/Audio/SFX/UpdateUnitLossSpeechFeedback.cpp +++ b/src/OpenSHC/Audio/SFX/UpdateUnitLossSpeechFeedback.cpp @@ -26,17 +26,12 @@ namespace Audio { // FUNCTION: STRONGHOLDCRUSADER 0x0044B840 void __stdcall UpdateUnitLossSpeechFeedback() { - undefined4 uVar1; - undefined4 uVar2; - int _offset; int _relative1; int _relative2; int iVar3; int iVar4; - int* piVar5; int iVar6; int iVar7; - char const* wav_filename; if (DAT_GameCore::instance.currentMenuViewType != UI::Enums::MVT_BUILD_MENU) { return; @@ -55,155 +50,138 @@ namespace Audio { return; } ++DAT_GL_Counter::instance; - _offset = 0; - do { - uVar1 = *(undefined4*)((int)DAT_TotalUnitValueLossesEnemyHistory::instance + _offset + 0x20); - *(undefined4*)((int)DAT_CurrentPlayerUnitLossesHistory::instance + _offset + 0x24) - = *(undefined4*)((int)DAT_CurrentPlayerUnitLossesHistory::instance + _offset + 0x20); - uVar2 = *(undefined4*)((int)Dat_UnitValueLossesHistoryPerEnemyPlayer::instance[0] + _offset + 0x20); - *(undefined4*)((int)DAT_TotalUnitValueLossesEnemyHistory::instance + _offset + 0x24) = uVar1; - uVar1 = *(undefined4*)((int)Dat_UnitValueLossesHistoryPerEnemyPlayer::instance[1] + _offset + 0x20); - *(undefined4*)((int)Dat_UnitValueLossesHistoryPerEnemyPlayer::instance[0] + _offset + 0x24) = uVar2; - uVar2 = *(undefined4*)((int)Dat_UnitValueLossesHistoryPerEnemyPlayer::instance[2] + _offset + 0x20); - *(undefined4*)((int)Dat_UnitValueLossesHistoryPerEnemyPlayer::instance[1] + _offset + 0x24) = uVar1; - uVar1 = *(undefined4*)((int)Dat_UnitValueLossesHistoryPerEnemyPlayer::instance[3] + _offset + 0x20); - *(undefined4*)((int)Dat_UnitValueLossesHistoryPerEnemyPlayer::instance[2] + _offset + 0x24) = uVar2; - uVar2 = *(undefined4*)((int)Dat_UnitValueLossesHistoryPerEnemyPlayer::instance[4] + _offset + 0x20); - *(undefined4*)((int)Dat_UnitValueLossesHistoryPerEnemyPlayer::instance[3] + _offset + 0x24) = uVar1; - uVar1 = *(undefined4*)((int)Dat_UnitValueLossesHistoryPerEnemyPlayer::instance[5] + _offset + 0x20); - *(undefined4*)((int)Dat_UnitValueLossesHistoryPerEnemyPlayer::instance[4] + _offset + 0x24) = uVar2; - uVar2 = *(undefined4*)((int)Dat_UnitValueLossesHistoryPerEnemyPlayer::instance[6] + _offset + 0x20); - *(undefined4*)((int)Dat_UnitValueLossesHistoryPerEnemyPlayer::instance[5] + _offset + 0x24) = uVar1; - uVar1 = *(undefined4*)((int)Dat_UnitValueLossesHistoryPerEnemyPlayer::instance[7] + _offset + 0x20); - *(undefined4*)((int)Dat_UnitValueLossesHistoryPerEnemyPlayer::instance[6] + _offset + 0x24) = uVar2; - uVar2 = *(undefined4*)((int)Dat_UnitValueLossesHistoryPerEnemyPlayer::instance[8] + _offset + 0x20); - *(undefined4*)((int)Dat_UnitValueLossesHistoryPerEnemyPlayer::instance[7] + _offset + 0x24) = uVar1; - *(undefined4*)((int)Dat_UnitValueLossesHistoryPerEnemyPlayer::instance[8] + _offset + 0x24) = uVar2; - iVar7 = DAT_TotalUnitValueLossesEnemyHistory::instance[2]; - iVar6 = DAT_TotalUnitValueLossesEnemyHistory::instance[1]; - iVar3 = DAT_CurrentPlayerUnitLossesHistory::instance[2]; - _offset = _offset + -4; - } while (-33 < _offset); - Dat_UnitValueLossesHistoryPerEnemyPlayer::instance[6][0] = DAT_UnitValueLossesPerEnemyPlayer::instance[6]; - Dat_UnitValueLossesHistoryPerEnemyPlayer::instance[7][0] = DAT_UnitValueLossesPerEnemyPlayer::instance[7]; - DAT_CurrentPlayerUnitLossesHistory::instance[0] = DAT_CurrentPlayerUnitLosses::instance; - DAT_TotalUnitValueLossesEnemyHistory::instance[0] = DAT_UnitValueLossesPerEnemyPlayer::instance[7] - + DAT_UnitValueLossesPerEnemyPlayer::instance[8] + DAT_UnitValueLossesPerEnemyPlayer::instance[6] - + DAT_UnitValueLossesPerEnemyPlayer::instance[5] + DAT_UnitValueLossesPerEnemyPlayer::instance[4] - + DAT_UnitValueLossesPerEnemyPlayer::instance[3] + DAT_UnitValueLossesPerEnemyPlayer::instance[2] - + DAT_UnitValueLossesPerEnemyPlayer::instance[1]; - Dat_UnitValueLossesHistoryPerEnemyPlayer::instance[1][0] = DAT_UnitValueLossesPerEnemyPlayer::instance[1]; - Dat_UnitValueLossesHistoryPerEnemyPlayer::instance[2][0] = DAT_UnitValueLossesPerEnemyPlayer::instance[2]; - Dat_UnitValueLossesHistoryPerEnemyPlayer::instance[3][0] = DAT_UnitValueLossesPerEnemyPlayer::instance[3]; - Dat_UnitValueLossesHistoryPerEnemyPlayer::instance[4][0] = DAT_UnitValueLossesPerEnemyPlayer::instance[4]; - Dat_UnitValueLossesHistoryPerEnemyPlayer::instance[5][0] = DAT_UnitValueLossesPerEnemyPlayer::instance[5]; - Dat_UnitValueLossesHistoryPerEnemyPlayer::instance[8][0] = DAT_UnitValueLossesPerEnemyPlayer::instance[8]; - if (((DAT_GL_Counter::instance < 2) - || (49 < DAT_TotalUnitValueLossesEnemyHistory::instance[0] + DAT_CurrentPlayerUnitLosses::instance)) - || (DAT_TotalUnitValueLossesEnemyHistory::instance[2] + DAT_CurrentPlayerUnitLossesHistory::instance[2] - + DAT_TotalUnitValueLossesEnemyHistory::instance[1] - + DAT_CurrentPlayerUnitLossesHistory::instance[1] - < 151)) - goto LAB_0044bbf0; - _relative1 = MACRO_CALL(Game_Func::RelativeValueForGenie)( - DAT_CurrentPlayerUnitLossesHistory::instance[1] + DAT_CurrentPlayerUnitLossesHistory::instance[2], - DAT_TotalUnitValueLossesEnemyHistory::instance[2] + DAT_TotalUnitValueLossesEnemyHistory::instance[1]); - _relative2 = MACRO_CALL(Game_Func::RelativeValueForGenie)(DAT_CurrentPlayerUnitLossesHistory::instance[3] - + DAT_CurrentPlayerUnitLossesHistory::instance[4] + DAT_CurrentPlayerUnitLossesHistory::instance[5] - + DAT_CurrentPlayerUnitLossesHistory::instance[6] + DAT_CurrentPlayerUnitLossesHistory::instance[7] - + DAT_CurrentPlayerUnitLossesHistory::instance[8] + DAT_CurrentPlayerUnitLossesHistory::instance[9] - + iVar3 + DAT_CurrentPlayerUnitLossesHistory::instance[1], - DAT_TotalUnitValueLossesEnemyHistory::instance[5] + DAT_TotalUnitValueLossesEnemyHistory::instance[4] - + DAT_TotalUnitValueLossesEnemyHistory::instance[6] - + DAT_TotalUnitValueLossesEnemyHistory::instance[7] - + DAT_TotalUnitValueLossesEnemyHistory::instance[8] - + DAT_TotalUnitValueLossesEnemyHistory::instance[9] - + DAT_TotalUnitValueLossesEnemyHistory::instance[3] + iVar7 + iVar6); - if (_relative1 == 0) { - if (_relative2 != 0) - goto LAB_0044bbf0; - if (DAT_GameCore::instance.genieVoiceActive != FALSE) { - /* "A Valliant Effort" */ - MACRO_CALL_MEMBER(SFXState_Func::playWAVSFX, DAT_SFXState::ptr)(s_Genie_29_wav_005a4ecc); + for (int _offset = 8; _offset >= 0; --_offset) { + DAT_TotalUnitValueLossesEnemyHistory::instance[_offset + 1] + = DAT_TotalUnitValueLossesEnemyHistory::instance[_offset]; + DAT_CurrentPlayerUnitLossesHistory::instance[_offset + 1] + = DAT_CurrentPlayerUnitLossesHistory::instance[_offset]; + for (int i = 0; i < 9; ++i) { + Dat_UnitValueLossesHistoryPerEnemyPlayer::instance[i][_offset + 1] + = Dat_UnitValueLossesHistoryPerEnemyPlayer::instance[i][_offset]; } - goto LAB_0044bbe6; } - if ((0 < _relative1) && (0 < _relative2)) { - _relative1 = (_relative2 + _relative1) / 2; - if (DAT_GameCore::instance.genieVoiceActive != FALSE) { - if (_relative1 == 1) { - /* "Majestic" */ - wav_filename = s_Genie_30_wav_005a4ebc; - } else if (_relative1 == 2) { - /* "Excellent" */ - wav_filename = s_Genie_31_wav_005a4eac; - } else if (_relative1 == 3) { - /* "Impressive" */ - wav_filename = s_Genie_32_wav_005a4e9c; - } else if (_relative1 == 4) { - /* "Glorious" */ - wav_filename = s_Genie_34_wav_005a4e8c; - } else if (_relative1 == 5) { - /* "For the crown" */ - wav_filename = s_Genie_37_wav_005a4e7c; - } else if (_relative1 == 6) { - /* "Heroic" */ - wav_filename = s_Genie_38_wav_005a4e6c; - } else { - if (_relative1 < 7) - goto LAB_0044bb0d; - /* "It's a Rout" */ - wav_filename = s_Genie_39_wav_005a4e5c; - } - MACRO_CALL_MEMBER(SFXState_Func::playWAVSFX, DAT_SFXState::ptr)(wav_filename); - } - LAB_0044bb0d: - DAT_GL_Counter::instance = 0; + DAT_CurrentPlayerUnitLossesHistory::instance[0] = DAT_CurrentPlayerUnitLosses::instance; + DAT_TotalUnitValueLossesEnemyHistory::instance[0] = 0; + for (int i = 1; i < 9; ++i) { + Dat_UnitValueLossesHistoryPerEnemyPlayer::instance[i][0] + = DAT_UnitValueLossesPerEnemyPlayer::instance[i]; + DAT_TotalUnitValueLossesEnemyHistory::instance[0] += DAT_UnitValueLossesPerEnemyPlayer::instance[i]; } - if ((-1 < _relative1) || (-1 < _relative2)) - goto LAB_0044bbf0; - iVar3 = (_relative2 + _relative1) / 2; - if (DAT_GameCore::instance.genieVoiceActive == FALSE) { - LAB_0044bb68: - if (iVar3 < -2) { - if (DAT_GameCore::instance.genieVoiceActive != FALSE) { - /* "Humiliated" */ - MACRO_CALL_MEMBER(SFXState_Func::playWAVSFX, DAT_SFXState::ptr)(s_Genie_44_wav_005a4e2c); + if (!(((DAT_GL_Counter::instance < 2) + || (49 + < DAT_TotalUnitValueLossesEnemyHistory::instance[0] + DAT_CurrentPlayerUnitLosses::instance)) + || (DAT_TotalUnitValueLossesEnemyHistory::instance[2] + + DAT_CurrentPlayerUnitLossesHistory::instance[2] + + DAT_TotalUnitValueLossesEnemyHistory::instance[1] + + DAT_CurrentPlayerUnitLossesHistory::instance[1] + < 151))) { + _relative1 = MACRO_CALL(Game_Func::RelativeValueForGenie)( + DAT_CurrentPlayerUnitLossesHistory::instance[1] + DAT_CurrentPlayerUnitLossesHistory::instance[2], + DAT_TotalUnitValueLossesEnemyHistory::instance[2] + + DAT_TotalUnitValueLossesEnemyHistory::instance[1]); + _relative2 = MACRO_CALL(Game_Func::RelativeValueForGenie)( + DAT_CurrentPlayerUnitLossesHistory::instance[3] + DAT_CurrentPlayerUnitLossesHistory::instance[4] + + DAT_CurrentPlayerUnitLossesHistory::instance[5] + + DAT_CurrentPlayerUnitLossesHistory::instance[6] + + DAT_CurrentPlayerUnitLossesHistory::instance[7] + + DAT_CurrentPlayerUnitLossesHistory::instance[8] + + DAT_CurrentPlayerUnitLossesHistory::instance[9] + + DAT_CurrentPlayerUnitLossesHistory::instance[2] + + DAT_CurrentPlayerUnitLossesHistory::instance[1], + DAT_TotalUnitValueLossesEnemyHistory::instance[5] + + DAT_TotalUnitValueLossesEnemyHistory::instance[4] + + DAT_TotalUnitValueLossesEnemyHistory::instance[6] + + DAT_TotalUnitValueLossesEnemyHistory::instance[7] + + DAT_TotalUnitValueLossesEnemyHistory::instance[8] + + DAT_TotalUnitValueLossesEnemyHistory::instance[9] + + DAT_TotalUnitValueLossesEnemyHistory::instance[3] + + DAT_TotalUnitValueLossesEnemyHistory::instance[2] + + DAT_TotalUnitValueLossesEnemyHistory::instance[1]); + if (_relative1 == 0) { + if (_relative2 == 0) { + if (DAT_GameCore::instance.genieVoiceActive != FALSE) { + /* "A Valliant Effort" */ + MACRO_CALL_MEMBER(SFXState_Func::playWAVSFX, DAT_SFXState::ptr)(s_Genie_29_wav_005a4ecc); + } + DAT_GL_Counter::instance = 0; } - iVar7 = -1; - iVar6 = 0; - iVar3 = 1; - piVar5 = Dat_UnitValueLossesHistoryPerEnemyPlayer::instance[1] + 8; - do { - iVar4 = piVar5[-7] + piVar5[-6] + piVar5[-5] + piVar5[-4] + piVar5[-3] + piVar5[-2] + piVar5[-1] - + piVar5[1] + *piVar5; - if (iVar6 < iVar4) { - iVar6 = iVar4; - iVar7 = iVar3; + } else { + if ((0 < _relative1) && (0 < _relative2)) { + _relative1 = (_relative2 + _relative1) / 2; + if (DAT_GameCore::instance.genieVoiceActive) { + if (_relative1 == 1) { + /* "Majestic" */ + MACRO_CALL_MEMBER(SFXState_Func::playWAVSFX, DAT_SFXState::ptr)( + s_Genie_30_wav_005a4ebc); + } else if (_relative1 == 2) { + /* "Excellent" */ + MACRO_CALL_MEMBER(SFXState_Func::playWAVSFX, DAT_SFXState::ptr)( + s_Genie_31_wav_005a4eac); + } else if (_relative1 == 3) { + /* "Impressive" */ + MACRO_CALL_MEMBER(SFXState_Func::playWAVSFX, DAT_SFXState::ptr)( + s_Genie_32_wav_005a4e9c); + } else if (_relative1 == 4) { + /* "Glorious" */ + MACRO_CALL_MEMBER(SFXState_Func::playWAVSFX, DAT_SFXState::ptr)( + s_Genie_34_wav_005a4e8c); + } else if (_relative1 == 5) { + /* "For the crown" */ + MACRO_CALL_MEMBER(SFXState_Func::playWAVSFX, DAT_SFXState::ptr)( + s_Genie_37_wav_005a4e7c); + } else if (_relative1 == 6) { + /* "Heroic" */ + MACRO_CALL_MEMBER(SFXState_Func::playWAVSFX, DAT_SFXState::ptr)( + s_Genie_38_wav_005a4e6c); + } else if (_relative1 >= 7) { + /* "It's a Rout" */ + MACRO_CALL_MEMBER(SFXState_Func::playWAVSFX, DAT_SFXState::ptr)( + s_Genie_39_wav_005a4e5c); + } + } + DAT_GL_Counter::instance = 0; + } + + if (!((-1 < _relative1) || (-1 < _relative2))) { + iVar3 = (_relative2 + _relative1) / 2; + if (DAT_GameCore::instance.genieVoiceActive && iVar3 == -1) { + /* "Vanquished" */ + MACRO_CALL_MEMBER(SFXState_Func::playWAVSFX, DAT_SFXState::ptr)(s_Genie_42_wav_005a4e4c); + } else if (DAT_GameCore::instance.genieVoiceActive && iVar3 == -2) { + /* "Crest falling" */ + MACRO_CALL_MEMBER(SFXState_Func::playWAVSFX, DAT_SFXState::ptr)(s_Genie_43_wav_005a4e3c); + } else if (!DAT_GameCore::instance.genieVoiceActive || iVar3 != -2) { + if (iVar3 <= -3) { + if (DAT_GameCore::instance.genieVoiceActive != FALSE) { + /* "Humiliated" */ + MACRO_CALL_MEMBER(SFXState_Func::playWAVSFX, DAT_SFXState::ptr)( + s_Genie_44_wav_005a4e2c); + } + iVar7 = -1; + iVar6 = 0; + for (int i = 1; i < 10; ++i) { + iVar4 = 0; + for (int j = 1; j < 10; ++j) { + iVar4 += Dat_UnitValueLossesHistoryPerEnemyPlayer::instance[i][j]; + } + if (iVar4 > iVar6) { + iVar6 = iVar4; + iVar7 = i; + } + } + if ((iVar7 != -1) + && (DAT_GameState::instance.mapAndTime.playerTeams[iVar7] + != DAT_GameState::instance.mapAndTime + .playerTeams[DAT_GameSynchronyState::instance.currentPlayerSlotID])) { + MACRO_CALL_MEMBER( + AI::AICState_Func::playFriendlyVictoryBikFromPlayer, DAT_AICState::ptr)(iVar7); + } + } } - piVar5 = piVar5 + 10; - iVar3 = iVar3 + 1; - } while ((int)piVar5 < 0xb98610); - if ((iVar7 != -1) - && (DAT_GameState::instance.mapAndTime.playerTeams[iVar7] - != DAT_GameState::instance.mapAndTime - .playerTeams[DAT_GameSynchronyState::instance.currentPlayerSlotID])) { - MACRO_CALL_MEMBER(AI::AICState_Func::playFriendlyVictoryBikFromPlayer, DAT_AICState::ptr)( - iVar7); + DAT_GL_Counter::instance = 0; } } - } else if (iVar3 == -1) { - /* "Vanquished" */ - MACRO_CALL_MEMBER(SFXState_Func::playWAVSFX, DAT_SFXState::ptr)(s_Genie_42_wav_005a4e4c); - } else { - if (iVar3 != -2) - goto LAB_0044bb68; - /* "Crest falling" */ - MACRO_CALL_MEMBER(SFXState_Func::playWAVSFX, DAT_SFXState::ptr)(s_Genie_43_wav_005a4e3c); } - LAB_0044bbe6: - DAT_GL_Counter::instance = 0; - LAB_0044bbf0: DAT_CurrentPlayerUnitLosses::instance = 0; DAT_UnitValueLossesPerEnemyPlayer::instance[0] = 0; DAT_UnitValueLossesPerEnemyPlayer::instance[1] = 0; From 574eaa24403b55466e8780496324ffc54e685101 Mon Sep 17 00:00:00 2001 From: TheRedDaemon <66257843+TheRedDaemon@users.noreply.github.com> Date: Thu, 9 Jul 2026 21:34:26 +0200 Subject: [PATCH 3/6] reimplement: SHC_3BB0A8C1_0x0044B840 tried to reduce code --- .../SFX/UpdateUnitLossSpeechFeedback.cpp | 220 ++++++++---------- src/symbols/data.asm | 2 +- 2 files changed, 103 insertions(+), 119 deletions(-) diff --git a/src/OpenSHC/Audio/SFX/UpdateUnitLossSpeechFeedback.cpp b/src/OpenSHC/Audio/SFX/UpdateUnitLossSpeechFeedback.cpp index 40b2007d..83adafd0 100644 --- a/src/OpenSHC/Audio/SFX/UpdateUnitLossSpeechFeedback.cpp +++ b/src/OpenSHC/Audio/SFX/UpdateUnitLossSpeechFeedback.cpp @@ -51,10 +51,10 @@ namespace Audio { } ++DAT_GL_Counter::instance; for (int _offset = 8; _offset >= 0; --_offset) { - DAT_TotalUnitValueLossesEnemyHistory::instance[_offset + 1] - = DAT_TotalUnitValueLossesEnemyHistory::instance[_offset]; DAT_CurrentPlayerUnitLossesHistory::instance[_offset + 1] = DAT_CurrentPlayerUnitLossesHistory::instance[_offset]; + DAT_TotalUnitValueLossesEnemyHistory::instance[_offset + 1] + = DAT_TotalUnitValueLossesEnemyHistory::instance[_offset]; for (int i = 0; i < 9; ++i) { Dat_UnitValueLossesHistoryPerEnemyPlayer::instance[i][_offset + 1] = Dat_UnitValueLossesHistoryPerEnemyPlayer::instance[i][_offset]; @@ -67,115 +67,107 @@ namespace Audio { = DAT_UnitValueLossesPerEnemyPlayer::instance[i]; DAT_TotalUnitValueLossesEnemyHistory::instance[0] += DAT_UnitValueLossesPerEnemyPlayer::instance[i]; } - if (!(((DAT_GL_Counter::instance < 2) - || (49 - < DAT_TotalUnitValueLossesEnemyHistory::instance[0] + DAT_CurrentPlayerUnitLosses::instance)) - || (DAT_TotalUnitValueLossesEnemyHistory::instance[2] - + DAT_CurrentPlayerUnitLossesHistory::instance[2] - + DAT_TotalUnitValueLossesEnemyHistory::instance[1] - + DAT_CurrentPlayerUnitLossesHistory::instance[1] - < 151))) { - _relative1 = MACRO_CALL(Game_Func::RelativeValueForGenie)( - DAT_CurrentPlayerUnitLossesHistory::instance[1] + DAT_CurrentPlayerUnitLossesHistory::instance[2], - DAT_TotalUnitValueLossesEnemyHistory::instance[2] - + DAT_TotalUnitValueLossesEnemyHistory::instance[1]); - _relative2 = MACRO_CALL(Game_Func::RelativeValueForGenie)( - DAT_CurrentPlayerUnitLossesHistory::instance[3] + DAT_CurrentPlayerUnitLossesHistory::instance[4] - + DAT_CurrentPlayerUnitLossesHistory::instance[5] - + DAT_CurrentPlayerUnitLossesHistory::instance[6] - + DAT_CurrentPlayerUnitLossesHistory::instance[7] - + DAT_CurrentPlayerUnitLossesHistory::instance[8] - + DAT_CurrentPlayerUnitLossesHistory::instance[9] - + DAT_CurrentPlayerUnitLossesHistory::instance[2] - + DAT_CurrentPlayerUnitLossesHistory::instance[1], - DAT_TotalUnitValueLossesEnemyHistory::instance[5] - + DAT_TotalUnitValueLossesEnemyHistory::instance[4] - + DAT_TotalUnitValueLossesEnemyHistory::instance[6] - + DAT_TotalUnitValueLossesEnemyHistory::instance[7] - + DAT_TotalUnitValueLossesEnemyHistory::instance[8] - + DAT_TotalUnitValueLossesEnemyHistory::instance[9] - + DAT_TotalUnitValueLossesEnemyHistory::instance[3] - + DAT_TotalUnitValueLossesEnemyHistory::instance[2] - + DAT_TotalUnitValueLossesEnemyHistory::instance[1]); - if (_relative1 == 0) { - if (_relative2 == 0) { - if (DAT_GameCore::instance.genieVoiceActive != FALSE) { - /* "A Valliant Effort" */ - MACRO_CALL_MEMBER(SFXState_Func::playWAVSFX, DAT_SFXState::ptr)(s_Genie_29_wav_005a4ecc); - } - DAT_GL_Counter::instance = 0; + if (DAT_GL_Counter::instance >= 2 + && 50 > DAT_TotalUnitValueLossesEnemyHistory::instance[0] + DAT_CurrentPlayerUnitLosses::instance) { + int playerUnitLosses1to2 + = DAT_CurrentPlayerUnitLossesHistory::instance[1] + DAT_CurrentPlayerUnitLossesHistory::instance[2]; + int totalEnemyUnitLosses1to2 = DAT_TotalUnitValueLossesEnemyHistory::instance[1] + + DAT_TotalUnitValueLossesEnemyHistory::instance[2]; + if (playerUnitLosses1to2 + totalEnemyUnitLosses1to2 > 150) { + _relative1 + = MACRO_CALL(Game_Func::RelativeValueForGenie)(playerUnitLosses1to2, totalEnemyUnitLosses1to2); + int playerUnitLosses1to9 = 0; + for (int i = 1; i < 10; ++i) { + playerUnitLosses1to9 += DAT_CurrentPlayerUnitLossesHistory::instance[i]; } - } else { - if ((0 < _relative1) && (0 < _relative2)) { - _relative1 = (_relative2 + _relative1) / 2; - if (DAT_GameCore::instance.genieVoiceActive) { - if (_relative1 == 1) { - /* "Majestic" */ - MACRO_CALL_MEMBER(SFXState_Func::playWAVSFX, DAT_SFXState::ptr)( - s_Genie_30_wav_005a4ebc); - } else if (_relative1 == 2) { - /* "Excellent" */ - MACRO_CALL_MEMBER(SFXState_Func::playWAVSFX, DAT_SFXState::ptr)( - s_Genie_31_wav_005a4eac); - } else if (_relative1 == 3) { - /* "Impressive" */ - MACRO_CALL_MEMBER(SFXState_Func::playWAVSFX, DAT_SFXState::ptr)( - s_Genie_32_wav_005a4e9c); - } else if (_relative1 == 4) { - /* "Glorious" */ - MACRO_CALL_MEMBER(SFXState_Func::playWAVSFX, DAT_SFXState::ptr)( - s_Genie_34_wav_005a4e8c); - } else if (_relative1 == 5) { - /* "For the crown" */ - MACRO_CALL_MEMBER(SFXState_Func::playWAVSFX, DAT_SFXState::ptr)( - s_Genie_37_wav_005a4e7c); - } else if (_relative1 == 6) { - /* "Heroic" */ - MACRO_CALL_MEMBER(SFXState_Func::playWAVSFX, DAT_SFXState::ptr)( - s_Genie_38_wav_005a4e6c); - } else if (_relative1 >= 7) { - /* "It's a Rout" */ + int totalEnemyUnitLosses1to9 = 0; + for (int i = 1; i < 10; ++i) { + totalEnemyUnitLosses1to9 += DAT_TotalUnitValueLossesEnemyHistory::instance[i]; + } + _relative2 + = MACRO_CALL(Game_Func::RelativeValueForGenie)(playerUnitLosses1to9, totalEnemyUnitLosses1to9); + if (_relative1 != 0 || _relative2 == 0) { + if (_relative1 == 0 && _relative2 == 0) { + if (DAT_GameCore::instance.genieVoiceActive != FALSE) { + /* "A Valliant Effort" */ MACRO_CALL_MEMBER(SFXState_Func::playWAVSFX, DAT_SFXState::ptr)( - s_Genie_39_wav_005a4e5c); + s_Genie_29_wav_005a4ecc); + } + } else { + if (0 < _relative1 && 0 < _relative2) { + _relative1 = (_relative2 + _relative1) / 2; + if (DAT_GameCore::instance.genieVoiceActive) { + if (_relative1 == 1) { + /* "Majestic" */ + MACRO_CALL_MEMBER(SFXState_Func::playWAVSFX, DAT_SFXState::ptr)( + s_Genie_30_wav_005a4ebc); + } else if (_relative1 == 2) { + /* "Excellent" */ + MACRO_CALL_MEMBER(SFXState_Func::playWAVSFX, DAT_SFXState::ptr)( + s_Genie_31_wav_005a4eac); + } else if (_relative1 == 3) { + /* "Impressive" */ + MACRO_CALL_MEMBER(SFXState_Func::playWAVSFX, DAT_SFXState::ptr)( + s_Genie_32_wav_005a4e9c); + } else if (_relative1 == 4) { + /* "Glorious" */ + MACRO_CALL_MEMBER(SFXState_Func::playWAVSFX, DAT_SFXState::ptr)( + s_Genie_34_wav_005a4e8c); + } else if (_relative1 == 5) { + /* "For the crown" */ + MACRO_CALL_MEMBER(SFXState_Func::playWAVSFX, DAT_SFXState::ptr)( + s_Genie_37_wav_005a4e7c); + } else if (_relative1 == 6) { + /* "Heroic" */ + MACRO_CALL_MEMBER(SFXState_Func::playWAVSFX, DAT_SFXState::ptr)( + s_Genie_38_wav_005a4e6c); + } else if (_relative1 >= 7) { + /* "It's a Rout" */ + MACRO_CALL_MEMBER(SFXState_Func::playWAVSFX, DAT_SFXState::ptr)( + s_Genie_39_wav_005a4e5c); + } + } + DAT_GL_Counter::instance = 0; } - } - DAT_GL_Counter::instance = 0; - } - if (!((-1 < _relative1) || (-1 < _relative2))) { - iVar3 = (_relative2 + _relative1) / 2; - if (DAT_GameCore::instance.genieVoiceActive && iVar3 == -1) { - /* "Vanquished" */ - MACRO_CALL_MEMBER(SFXState_Func::playWAVSFX, DAT_SFXState::ptr)(s_Genie_42_wav_005a4e4c); - } else if (DAT_GameCore::instance.genieVoiceActive && iVar3 == -2) { - /* "Crest falling" */ - MACRO_CALL_MEMBER(SFXState_Func::playWAVSFX, DAT_SFXState::ptr)(s_Genie_43_wav_005a4e3c); - } else if (!DAT_GameCore::instance.genieVoiceActive || iVar3 != -2) { - if (iVar3 <= -3) { - if (DAT_GameCore::instance.genieVoiceActive != FALSE) { - /* "Humiliated" */ + if (-1 >= _relative1 && -1 >= _relative2) { + iVar3 = (_relative2 + _relative1) / 2; + if (DAT_GameCore::instance.genieVoiceActive && iVar3 == -1) { + /* "Vanquished" */ MACRO_CALL_MEMBER(SFXState_Func::playWAVSFX, DAT_SFXState::ptr)( - s_Genie_44_wav_005a4e2c); - } - iVar7 = -1; - iVar6 = 0; - for (int i = 1; i < 10; ++i) { - iVar4 = 0; - for (int j = 1; j < 10; ++j) { - iVar4 += Dat_UnitValueLossesHistoryPerEnemyPlayer::instance[i][j]; - } - if (iVar4 > iVar6) { - iVar6 = iVar4; - iVar7 = i; + s_Genie_42_wav_005a4e4c); + } else if (DAT_GameCore::instance.genieVoiceActive && iVar3 == -2) { + /* "Crest falling" */ + MACRO_CALL_MEMBER(SFXState_Func::playWAVSFX, DAT_SFXState::ptr)( + s_Genie_43_wav_005a4e3c); + } else if (!DAT_GameCore::instance.genieVoiceActive || iVar3 != -2) { + if (iVar3 <= -3) { + if (DAT_GameCore::instance.genieVoiceActive != FALSE) { + /* "Humiliated" */ + MACRO_CALL_MEMBER(SFXState_Func::playWAVSFX, DAT_SFXState::ptr)( + s_Genie_44_wav_005a4e2c); + } + iVar7 = -1; + iVar6 = 0; + for (int i = 1; i < 9; ++i) { + iVar4 = 0; + for (int j = 1; j < 10; ++j) { + iVar4 += Dat_UnitValueLossesHistoryPerEnemyPlayer::instance[i][j]; + } + if (iVar4 > iVar6) { + iVar6 = iVar4; + iVar7 = i; + } + } + if ((iVar7 != -1) + && (DAT_GameState::instance.mapAndTime.playerTeams[iVar7] + != DAT_GameState::instance.mapAndTime.playerTeams + [DAT_GameSynchronyState::instance.currentPlayerSlotID])) { + MACRO_CALL_MEMBER(AI::AICState_Func::playFriendlyVictoryBikFromPlayer, + DAT_AICState::ptr)(iVar7); + } } } - if ((iVar7 != -1) - && (DAT_GameState::instance.mapAndTime.playerTeams[iVar7] - != DAT_GameState::instance.mapAndTime - .playerTeams[DAT_GameSynchronyState::instance.currentPlayerSlotID])) { - MACRO_CALL_MEMBER( - AI::AICState_Func::playFriendlyVictoryBikFromPlayer, DAT_AICState::ptr)(iVar7); - } } } DAT_GL_Counter::instance = 0; @@ -183,20 +175,13 @@ namespace Audio { } } DAT_CurrentPlayerUnitLosses::instance = 0; - DAT_UnitValueLossesPerEnemyPlayer::instance[0] = 0; - DAT_UnitValueLossesPerEnemyPlayer::instance[1] = 0; - DAT_UnitValueLossesPerEnemyPlayer::instance[2] = 0; - DAT_UnitValueLossesPerEnemyPlayer::instance[3] = 0; - DAT_UnitValueLossesPerEnemyPlayer::instance[4] = 0; - DAT_UnitValueLossesPerEnemyPlayer::instance[5] = 0; - DAT_UnitValueLossesPerEnemyPlayer::instance[6] = 0; - DAT_UnitValueLossesPerEnemyPlayer::instance[7] = 0; - DAT_UnitValueLossesPerEnemyPlayer::instance[8] = 0; - if ((1 < DAT_DestroyedBuildingsCount::instance) - && (5 < DAT_DestroyedBuildingsCountHistory::instance[0] - + DAT_DestroyedBuildingsCountHistory::instance[1] + for (int i = 0; i < 9; ++i) { + DAT_UnitValueLossesPerEnemyPlayer::instance[i] = 0; + } + if (1 < DAT_DestroyedBuildingsCount::instance + && 5 < DAT_DestroyedBuildingsCountHistory::instance[0] + DAT_DestroyedBuildingsCountHistory::instance[1] + DAT_DestroyedBuildingsCountHistory::instance[2] - + DAT_DestroyedBuildingsCountHistory::instance[3] + DAT_DestroyedBuildingsCount::instance)) { + + DAT_DestroyedBuildingsCountHistory::instance[3] + DAT_DestroyedBuildingsCount::instance) { if (DAT_GameCore::instance.genieVoiceActive != FALSE) { /* "Where is your Castle" */ MACRO_CALL_MEMBER(SFXState_Func::playWAVSFX, DAT_SFXState::ptr)(s_Genie_41_wav_005a4e1c); @@ -213,7 +198,6 @@ namespace Audio { DAT_DestroyedBuildingsCount::instance = 0; return; } - } } } diff --git a/src/symbols/data.asm b/src/symbols/data.asm index 10fe881c..abe91fb3 100644 --- a/src/symbols/data.asm +++ b/src/symbols/data.asm @@ -3199,4 +3199,4 @@ _TEXT SEGMENT _TEXT ENDS -END \ No newline at end of file +END From ab0ff214cead367f2ea8d28347c196c7a5061c05 Mon Sep 17 00:00:00 2001 From: TheRedDaemon <66257843+TheRedDaemon@users.noreply.github.com> Date: Sun, 19 Jul 2026 22:24:27 +0200 Subject: [PATCH 4/6] reimplement: SHC_3BB0A8C1_0x0044AAB0 100% --- src/OpenSHC/Game/RelativeValueForGenie.cpp | 55 ++++++++++++++++++++++ status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 56 insertions(+), 1 deletion(-) create mode 100644 src/OpenSHC/Game/RelativeValueForGenie.cpp diff --git a/src/OpenSHC/Game/RelativeValueForGenie.cpp b/src/OpenSHC/Game/RelativeValueForGenie.cpp new file mode 100644 index 00000000..ef26b60e --- /dev/null +++ b/src/OpenSHC/Game/RelativeValueForGenie.cpp @@ -0,0 +1,55 @@ +#include "../Game.func.hpp" + +namespace OpenSHC { +namespace Game { + + // FUNCTION: STRONGHOLDCRUSADER 0x0044AAB0 + int __cdecl RelativeValueForGenie(int larger, int smaller) + { + if (larger < 1) { + larger = 1; + } + if (smaller < 1) { + smaller = 1; + } + if (larger > smaller) { + int iVar1 = (larger * 100) / smaller; + if (iVar1 < 150) { + return 0; + } + if (iVar1 < 170) { + return 1; + } + if (iVar1 < 190) { + return 2; + } + if (iVar1 < 210) { + return 3; + } + if (iVar1 < 230) { + return 4; + } + if (iVar1 < 250) { + return 5; + } + if (iVar1 < 270) { + return 6; + } + return 7; + } else { + int iVar1 = (smaller * 100) / larger; + if (iVar1 < 150) { + return 0; + } + if (iVar1 < 190) { + return -1; + } + if (iVar1 < 240) { + return -2; + } + return -3; + } + } + +} +} diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index d709237c..ed5c0936 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -16301,7 +16301,7 @@ SHC_3BB0A8C1_0x0044AA80 | 0.0% | Pending SHC_3BB0A8C1_0x0044AAA0 | 0.0% | Pending -SHC_3BB0A8C1_0x0044AAB0 | 0.0% | Pending +SHC_3BB0A8C1_0x0044AAB0 | 100.0% | Reimplemented SHC_3BB0A8C1_0x0044AB70 | 0.0% | Pending From 87f1c64cf15d9a0910b5f705b057c06ed7ccdacc Mon Sep 17 00:00:00 2001 From: TheRedDaemon <66257843+TheRedDaemon@users.noreply.github.com> Date: Sun, 19 Jul 2026 22:41:28 +0200 Subject: [PATCH 5/6] reimplement: SHC_3BB0A8C1_0x0044B840 small structure updates --- .../SFX/UpdateUnitLossSpeechFeedback.cpp | 212 ++++++++---------- 1 file changed, 96 insertions(+), 116 deletions(-) diff --git a/src/OpenSHC/Audio/SFX/UpdateUnitLossSpeechFeedback.cpp b/src/OpenSHC/Audio/SFX/UpdateUnitLossSpeechFeedback.cpp index 83adafd0..e1869be1 100644 --- a/src/OpenSHC/Audio/SFX/UpdateUnitLossSpeechFeedback.cpp +++ b/src/OpenSHC/Audio/SFX/UpdateUnitLossSpeechFeedback.cpp @@ -23,27 +23,20 @@ namespace OpenSHC { namespace Audio { namespace SFX { + // TODO: "RelativeValueForGenie" content needs to be known by this function + // FUNCTION: STRONGHOLDCRUSADER 0x0044B840 void __stdcall UpdateUnitLossSpeechFeedback() { - int _relative1; - int _relative2; - int iVar3; - int iVar4; - int iVar6; - int iVar7; - if (DAT_GameCore::instance.currentMenuViewType != UI::Enums::MVT_BUILD_MENU) { return; } if (DAT_GameState::instance.playerDataArray[DAT_GameSynchronyState::instance.currentPlayerSlotID] - .playerDeathRelated - != 0) { + .playerDeathRelated) { return; } if (DAT_GameState::instance.playerDataArray[DAT_GameSynchronyState::instance.currentPlayerSlotID] - .lordKilledByPlayerID - != 0) { + .lordKilledByPlayerID) { return; } if (DAT_GameCore::instance.gameMode_2 == Game::GM_CAMPAIGN_MISSION) { @@ -61,117 +54,104 @@ namespace Audio { } } DAT_CurrentPlayerUnitLossesHistory::instance[0] = DAT_CurrentPlayerUnitLosses::instance; - DAT_TotalUnitValueLossesEnemyHistory::instance[0] = 0; for (int i = 1; i < 9; ++i) { Dat_UnitValueLossesHistoryPerEnemyPlayer::instance[i][0] = DAT_UnitValueLossesPerEnemyPlayer::instance[i]; + } + DAT_TotalUnitValueLossesEnemyHistory::instance[0] = 0; + for (int i = 1; i < 9; ++i) { DAT_TotalUnitValueLossesEnemyHistory::instance[0] += DAT_UnitValueLossesPerEnemyPlayer::instance[i]; } - if (DAT_GL_Counter::instance >= 2 - && 50 > DAT_TotalUnitValueLossesEnemyHistory::instance[0] + DAT_CurrentPlayerUnitLosses::instance) { - int playerUnitLosses1to2 - = DAT_CurrentPlayerUnitLossesHistory::instance[1] + DAT_CurrentPlayerUnitLossesHistory::instance[2]; - int totalEnemyUnitLosses1to2 = DAT_TotalUnitValueLossesEnemyHistory::instance[1] - + DAT_TotalUnitValueLossesEnemyHistory::instance[2]; - if (playerUnitLosses1to2 + totalEnemyUnitLosses1to2 > 150) { - _relative1 - = MACRO_CALL(Game_Func::RelativeValueForGenie)(playerUnitLosses1to2, totalEnemyUnitLosses1to2); - int playerUnitLosses1to9 = 0; - for (int i = 1; i < 10; ++i) { - playerUnitLosses1to9 += DAT_CurrentPlayerUnitLossesHistory::instance[i]; + int iVar1 = DAT_CurrentPlayerUnitLosses::instance + DAT_TotalUnitValueLossesEnemyHistory::instance[0]; + int iVar2 = DAT_CurrentPlayerUnitLossesHistory::instance[1] + + DAT_TotalUnitValueLossesEnemyHistory::instance[1] + DAT_CurrentPlayerUnitLossesHistory::instance[2] + + DAT_TotalUnitValueLossesEnemyHistory::instance[2]; + if (DAT_GL_Counter::instance >= 2 && 50 > iVar1 && iVar2 > 150) { + int _relative1 = MACRO_CALL(Game_Func::RelativeValueForGenie)( + DAT_CurrentPlayerUnitLossesHistory::instance[1] + DAT_CurrentPlayerUnitLossesHistory::instance[2], + DAT_TotalUnitValueLossesEnemyHistory::instance[1] + + DAT_TotalUnitValueLossesEnemyHistory::instance[2]); + int playerUnitLossesSum = 0; + int totalEnemyUnitLossesSum = 0; + for (int i = 1; i < 10; ++i) { + playerUnitLossesSum += DAT_CurrentPlayerUnitLossesHistory::instance[i]; + totalEnemyUnitLossesSum += DAT_TotalUnitValueLossesEnemyHistory::instance[i]; + } + int _relative2 + = MACRO_CALL(Game_Func::RelativeValueForGenie)(playerUnitLossesSum, totalEnemyUnitLossesSum); + + if (_relative1 == 0 && _relative2 == 0) { + if (DAT_GameCore::instance.genieVoiceActive) { + /* "A Valliant Effort" */ + MACRO_CALL_MEMBER(SFXState_Func::playWAVSFX, DAT_SFXState::ptr)(s_Genie_29_wav_005a4ecc); } - int totalEnemyUnitLosses1to9 = 0; - for (int i = 1; i < 10; ++i) { - totalEnemyUnitLosses1to9 += DAT_TotalUnitValueLossesEnemyHistory::instance[i]; + DAT_GL_Counter::instance = 0; + } + if (_relative1 > 0 && _relative2 > 0) { + _relative1 = (_relative2 + _relative1) / 2; + if (DAT_GameCore::instance.genieVoiceActive) { + if (_relative1 == 1) { + /* "Majestic" */ + MACRO_CALL_MEMBER(SFXState_Func::playWAVSFX, DAT_SFXState::ptr)(s_Genie_30_wav_005a4ebc); + } else if (_relative1 == 2) { + /* "Excellent" */ + MACRO_CALL_MEMBER(SFXState_Func::playWAVSFX, DAT_SFXState::ptr)(s_Genie_31_wav_005a4eac); + } else if (_relative1 == 3) { + /* "Impressive" */ + MACRO_CALL_MEMBER(SFXState_Func::playWAVSFX, DAT_SFXState::ptr)(s_Genie_32_wav_005a4e9c); + } else if (_relative1 == 4) { + /* "Glorious" */ + MACRO_CALL_MEMBER(SFXState_Func::playWAVSFX, DAT_SFXState::ptr)(s_Genie_34_wav_005a4e8c); + } else if (_relative1 == 5) { + /* "For the crown" */ + MACRO_CALL_MEMBER(SFXState_Func::playWAVSFX, DAT_SFXState::ptr)(s_Genie_37_wav_005a4e7c); + } else if (_relative1 == 6) { + /* "Heroic" */ + MACRO_CALL_MEMBER(SFXState_Func::playWAVSFX, DAT_SFXState::ptr)(s_Genie_38_wav_005a4e6c); + } else if (_relative1 >= 7) { + /* "It's a Rout" */ + MACRO_CALL_MEMBER(SFXState_Func::playWAVSFX, DAT_SFXState::ptr)(s_Genie_39_wav_005a4e5c); + } } - _relative2 - = MACRO_CALL(Game_Func::RelativeValueForGenie)(playerUnitLosses1to9, totalEnemyUnitLosses1to9); - if (_relative1 != 0 || _relative2 == 0) { - if (_relative1 == 0 && _relative2 == 0) { - if (DAT_GameCore::instance.genieVoiceActive != FALSE) { - /* "A Valliant Effort" */ - MACRO_CALL_MEMBER(SFXState_Func::playWAVSFX, DAT_SFXState::ptr)( - s_Genie_29_wav_005a4ecc); - } - } else { - if (0 < _relative1 && 0 < _relative2) { - _relative1 = (_relative2 + _relative1) / 2; - if (DAT_GameCore::instance.genieVoiceActive) { - if (_relative1 == 1) { - /* "Majestic" */ - MACRO_CALL_MEMBER(SFXState_Func::playWAVSFX, DAT_SFXState::ptr)( - s_Genie_30_wav_005a4ebc); - } else if (_relative1 == 2) { - /* "Excellent" */ - MACRO_CALL_MEMBER(SFXState_Func::playWAVSFX, DAT_SFXState::ptr)( - s_Genie_31_wav_005a4eac); - } else if (_relative1 == 3) { - /* "Impressive" */ - MACRO_CALL_MEMBER(SFXState_Func::playWAVSFX, DAT_SFXState::ptr)( - s_Genie_32_wav_005a4e9c); - } else if (_relative1 == 4) { - /* "Glorious" */ - MACRO_CALL_MEMBER(SFXState_Func::playWAVSFX, DAT_SFXState::ptr)( - s_Genie_34_wav_005a4e8c); - } else if (_relative1 == 5) { - /* "For the crown" */ - MACRO_CALL_MEMBER(SFXState_Func::playWAVSFX, DAT_SFXState::ptr)( - s_Genie_37_wav_005a4e7c); - } else if (_relative1 == 6) { - /* "Heroic" */ - MACRO_CALL_MEMBER(SFXState_Func::playWAVSFX, DAT_SFXState::ptr)( - s_Genie_38_wav_005a4e6c); - } else if (_relative1 >= 7) { - /* "It's a Rout" */ - MACRO_CALL_MEMBER(SFXState_Func::playWAVSFX, DAT_SFXState::ptr)( - s_Genie_39_wav_005a4e5c); - } - } - DAT_GL_Counter::instance = 0; + DAT_GL_Counter::instance = 0; + } + if (_relative1 < 0 && _relative2 < 0) { + int iVar3 = (_relative2 + _relative1) / 2; + if (DAT_GameCore::instance.genieVoiceActive) { + if (iVar3 == -1) { + /* "Vanquished" */ + MACRO_CALL_MEMBER(SFXState_Func::playWAVSFX, DAT_SFXState::ptr)(s_Genie_42_wav_005a4e4c); + } else if (iVar3 == -2) { + /* "Crest falling" */ + MACRO_CALL_MEMBER(SFXState_Func::playWAVSFX, DAT_SFXState::ptr)(s_Genie_43_wav_005a4e3c); + } + } + if (iVar3 <= -3) { + if (DAT_GameCore::instance.genieVoiceActive) { + /* "Humiliated" */ + MACRO_CALL_MEMBER(SFXState_Func::playWAVSFX, DAT_SFXState::ptr)(s_Genie_44_wav_005a4e2c); + } + int playerId = -1; + int maxLossesOfEnemy = 0; + for (int i = 1; i < 9; ++i) { + int summaryEnemyUnitLosses = 0; + for (int j = 1; j < 10; ++j) { + summaryEnemyUnitLosses += Dat_UnitValueLossesHistoryPerEnemyPlayer::instance[i][j]; } - - if (-1 >= _relative1 && -1 >= _relative2) { - iVar3 = (_relative2 + _relative1) / 2; - if (DAT_GameCore::instance.genieVoiceActive && iVar3 == -1) { - /* "Vanquished" */ - MACRO_CALL_MEMBER(SFXState_Func::playWAVSFX, DAT_SFXState::ptr)( - s_Genie_42_wav_005a4e4c); - } else if (DAT_GameCore::instance.genieVoiceActive && iVar3 == -2) { - /* "Crest falling" */ - MACRO_CALL_MEMBER(SFXState_Func::playWAVSFX, DAT_SFXState::ptr)( - s_Genie_43_wav_005a4e3c); - } else if (!DAT_GameCore::instance.genieVoiceActive || iVar3 != -2) { - if (iVar3 <= -3) { - if (DAT_GameCore::instance.genieVoiceActive != FALSE) { - /* "Humiliated" */ - MACRO_CALL_MEMBER(SFXState_Func::playWAVSFX, DAT_SFXState::ptr)( - s_Genie_44_wav_005a4e2c); - } - iVar7 = -1; - iVar6 = 0; - for (int i = 1; i < 9; ++i) { - iVar4 = 0; - for (int j = 1; j < 10; ++j) { - iVar4 += Dat_UnitValueLossesHistoryPerEnemyPlayer::instance[i][j]; - } - if (iVar4 > iVar6) { - iVar6 = iVar4; - iVar7 = i; - } - } - if ((iVar7 != -1) - && (DAT_GameState::instance.mapAndTime.playerTeams[iVar7] - != DAT_GameState::instance.mapAndTime.playerTeams - [DAT_GameSynchronyState::instance.currentPlayerSlotID])) { - MACRO_CALL_MEMBER(AI::AICState_Func::playFriendlyVictoryBikFromPlayer, - DAT_AICState::ptr)(iVar7); - } - } - } + if (summaryEnemyUnitLosses > maxLossesOfEnemy) { + maxLossesOfEnemy = summaryEnemyUnitLosses; + playerId = i; } } - DAT_GL_Counter::instance = 0; + if (playerId != -1 + && DAT_GameState::instance.mapAndTime.playerTeams[playerId] + != DAT_GameState::instance.mapAndTime + .playerTeams[DAT_GameSynchronyState::instance.currentPlayerSlotID]) { + MACRO_CALL_MEMBER(AI::AICState_Func::playFriendlyVictoryBikFromPlayer, DAT_AICState::ptr)( + playerId); + } } + DAT_GL_Counter::instance = 0; } } DAT_CurrentPlayerUnitLosses::instance = 0; @@ -179,10 +159,10 @@ namespace Audio { DAT_UnitValueLossesPerEnemyPlayer::instance[i] = 0; } if (1 < DAT_DestroyedBuildingsCount::instance - && 5 < DAT_DestroyedBuildingsCountHistory::instance[0] + DAT_DestroyedBuildingsCountHistory::instance[1] - + DAT_DestroyedBuildingsCountHistory::instance[2] - + DAT_DestroyedBuildingsCountHistory::instance[3] + DAT_DestroyedBuildingsCount::instance) { - if (DAT_GameCore::instance.genieVoiceActive != FALSE) { + && 5 < DAT_DestroyedBuildingsCountHistory::instance[3] + DAT_DestroyedBuildingsCountHistory::instance[2] + + DAT_DestroyedBuildingsCountHistory::instance[1] + + DAT_DestroyedBuildingsCountHistory::instance[0] + DAT_DestroyedBuildingsCount::instance) { + if (DAT_GameCore::instance.genieVoiceActive) { /* "Where is your Castle" */ MACRO_CALL_MEMBER(SFXState_Func::playWAVSFX, DAT_SFXState::ptr)(s_Genie_41_wav_005a4e1c); } @@ -190,13 +170,13 @@ namespace Audio { DAT_DestroyedBuildingsCountHistory::instance[0] = 0; DAT_DestroyedBuildingsCountHistory::instance[1] = 0; DAT_DestroyedBuildingsCountHistory::instance[2] = 0; + DAT_DestroyedBuildingsCountHistory::instance[3] = 0; } DAT_DestroyedBuildingsCountHistory::instance[3] = DAT_DestroyedBuildingsCountHistory::instance[2]; DAT_DestroyedBuildingsCountHistory::instance[2] = DAT_DestroyedBuildingsCountHistory::instance[1]; DAT_DestroyedBuildingsCountHistory::instance[1] = DAT_DestroyedBuildingsCountHistory::instance[0]; DAT_DestroyedBuildingsCountHistory::instance[0] = DAT_DestroyedBuildingsCount::instance; DAT_DestroyedBuildingsCount::instance = 0; - return; } } } From ecd90f6ec430df88261c4d0384ec0372d1e241a8 Mon Sep 17 00:00:00 2001 From: TheRedDaemon <66257843+TheRedDaemon@users.noreply.github.com> Date: Mon, 20 Jul 2026 23:07:12 +0200 Subject: [PATCH 6/6] reimplement: SHC_3BB0A8C1_0x0044B840 84% --- src/OpenSHC/Audio/SFX.func.hpp | 4 + src/OpenSHC/Audio/SFX.hpp | 2 + .../SFX/UpdateUnitLossSpeechFeedback.cpp | 85 +++++++++++++++---- src/OpenSHC/Game.func.hpp | 4 - src/OpenSHC/Game.hpp | 2 - src/OpenSHC/Game/RelativeValueForGenie.cpp | 55 ------------ status/addresses-SHC-3BB0A8C1.txt | 2 +- 7 files changed, 74 insertions(+), 80 deletions(-) delete mode 100644 src/OpenSHC/Game/RelativeValueForGenie.cpp diff --git a/src/OpenSHC/Audio/SFX.func.hpp b/src/OpenSHC/Audio/SFX.func.hpp index 522f214c..07ab3957 100644 --- a/src/OpenSHC/Audio/SFX.func.hpp +++ b/src/OpenSHC/Audio/SFX.func.hpp @@ -17,6 +17,10 @@ namespace Audio { &OpenSHC::Audio::SFX::UpdateUnitLossSpeechFeedback) UpdateUnitLossSpeechFeedback; + MACRO_FUNCTION_RESOLVER(int(__cdecl*)(int larger, int smaller), true, Address::SHC_3BB0A8C1_0x0044AAB0, + &OpenSHC::Audio::SFX::UpdateUnitLossSpeechFeedback_RelativeValueForGenie) + UpdateUnitLossSpeechFeedback_RelativeValueForGenie; + } // namespace SFX_Func } // namespace Audio } // namespace OpenSHC diff --git a/src/OpenSHC/Audio/SFX.hpp b/src/OpenSHC/Audio/SFX.hpp index 3b35b516..b87fa1fb 100644 --- a/src/OpenSHC/Audio/SFX.hpp +++ b/src/OpenSHC/Audio/SFX.hpp @@ -14,6 +14,8 @@ namespace Audio { void __stdcall UpdateUnitLossSpeechFeedback(); + int __cdecl UpdateUnitLossSpeechFeedback_RelativeValueForGenie(int larger, int smaller); + } // namespace SFX } // namespace Audio } // namespace OpenSHC diff --git a/src/OpenSHC/Audio/SFX/UpdateUnitLossSpeechFeedback.cpp b/src/OpenSHC/Audio/SFX/UpdateUnitLossSpeechFeedback.cpp index e1869be1..09c6c9c6 100644 --- a/src/OpenSHC/Audio/SFX/UpdateUnitLossSpeechFeedback.cpp +++ b/src/OpenSHC/Audio/SFX/UpdateUnitLossSpeechFeedback.cpp @@ -2,7 +2,6 @@ #include "OpenSHC/AI/AICState.func.hpp" #include "OpenSHC/Audio/SFX/SFXState.func.hpp" -#include "OpenSHC/Game.func.hpp" #include "OpenSHC/string-literals.hpp" #include "OpenSHC/Globals/DAT_AICState.hpp" @@ -23,8 +22,6 @@ namespace OpenSHC { namespace Audio { namespace SFX { - // TODO: "RelativeValueForGenie" content needs to be known by this function - // FUNCTION: STRONGHOLDCRUSADER 0x0044B840 void __stdcall UpdateUnitLossSpeechFeedback() { @@ -54,31 +51,34 @@ namespace Audio { } } DAT_CurrentPlayerUnitLossesHistory::instance[0] = DAT_CurrentPlayerUnitLosses::instance; - for (int i = 1; i < 9; ++i) { - Dat_UnitValueLossesHistoryPerEnemyPlayer::instance[i][0] - = DAT_UnitValueLossesPerEnemyPlayer::instance[i]; - } DAT_TotalUnitValueLossesEnemyHistory::instance[0] = 0; for (int i = 1; i < 9; ++i) { DAT_TotalUnitValueLossesEnemyHistory::instance[0] += DAT_UnitValueLossesPerEnemyPlayer::instance[i]; + Dat_UnitValueLossesHistoryPerEnemyPlayer::instance[i][0] + = DAT_UnitValueLossesPerEnemyPlayer::instance[i]; } - int iVar1 = DAT_CurrentPlayerUnitLosses::instance + DAT_TotalUnitValueLossesEnemyHistory::instance[0]; + int iVar1 + = DAT_CurrentPlayerUnitLossesHistory::instance[0] + DAT_TotalUnitValueLossesEnemyHistory::instance[0]; int iVar2 = DAT_CurrentPlayerUnitLossesHistory::instance[1] + DAT_TotalUnitValueLossesEnemyHistory::instance[1] + DAT_CurrentPlayerUnitLossesHistory::instance[2] + DAT_TotalUnitValueLossesEnemyHistory::instance[2]; if (DAT_GL_Counter::instance >= 2 && 50 > iVar1 && iVar2 > 150) { - int _relative1 = MACRO_CALL(Game_Func::RelativeValueForGenie)( - DAT_CurrentPlayerUnitLossesHistory::instance[1] + DAT_CurrentPlayerUnitLossesHistory::instance[2], - DAT_TotalUnitValueLossesEnemyHistory::instance[1] - + DAT_TotalUnitValueLossesEnemyHistory::instance[2]); + + int smallPlayerUnitLossesSum + = DAT_CurrentPlayerUnitLossesHistory::instance[1] + DAT_CurrentPlayerUnitLossesHistory::instance[2]; + int smallTotalEnemyUnitLossesSum = DAT_TotalUnitValueLossesEnemyHistory::instance[1] + + DAT_TotalUnitValueLossesEnemyHistory::instance[2]; + int _relative1 = MACRO_CALL(SFX_Func::UpdateUnitLossSpeechFeedback_RelativeValueForGenie)( + smallPlayerUnitLossesSum, smallTotalEnemyUnitLossesSum); + int playerUnitLossesSum = 0; int totalEnemyUnitLossesSum = 0; for (int i = 1; i < 10; ++i) { playerUnitLossesSum += DAT_CurrentPlayerUnitLossesHistory::instance[i]; totalEnemyUnitLossesSum += DAT_TotalUnitValueLossesEnemyHistory::instance[i]; } - int _relative2 - = MACRO_CALL(Game_Func::RelativeValueForGenie)(playerUnitLossesSum, totalEnemyUnitLossesSum); + int _relative2 = MACRO_CALL(SFX_Func::UpdateUnitLossSpeechFeedback_RelativeValueForGenie)( + playerUnitLossesSum, totalEnemyUnitLossesSum); if (_relative1 == 0 && _relative2 == 0) { if (DAT_GameCore::instance.genieVoiceActive) { @@ -158,10 +158,11 @@ namespace Audio { for (int i = 0; i < 9; ++i) { DAT_UnitValueLossesPerEnemyPlayer::instance[i] = 0; } - if (1 < DAT_DestroyedBuildingsCount::instance - && 5 < DAT_DestroyedBuildingsCountHistory::instance[3] + DAT_DestroyedBuildingsCountHistory::instance[2] + if (DAT_DestroyedBuildingsCount::instance > 1 + && DAT_DestroyedBuildingsCountHistory::instance[3] + DAT_DestroyedBuildingsCountHistory::instance[2] + DAT_DestroyedBuildingsCountHistory::instance[1] - + DAT_DestroyedBuildingsCountHistory::instance[0] + DAT_DestroyedBuildingsCount::instance) { + + DAT_DestroyedBuildingsCountHistory::instance[0] + DAT_DestroyedBuildingsCount::instance + > 5) { if (DAT_GameCore::instance.genieVoiceActive) { /* "Where is your Castle" */ MACRO_CALL_MEMBER(SFXState_Func::playWAVSFX, DAT_SFXState::ptr)(s_Genie_41_wav_005a4e1c); @@ -170,7 +171,6 @@ namespace Audio { DAT_DestroyedBuildingsCountHistory::instance[0] = 0; DAT_DestroyedBuildingsCountHistory::instance[1] = 0; DAT_DestroyedBuildingsCountHistory::instance[2] = 0; - DAT_DestroyedBuildingsCountHistory::instance[3] = 0; } DAT_DestroyedBuildingsCountHistory::instance[3] = DAT_DestroyedBuildingsCountHistory::instance[2]; DAT_DestroyedBuildingsCountHistory::instance[2] = DAT_DestroyedBuildingsCountHistory::instance[1]; @@ -178,6 +178,55 @@ namespace Audio { DAT_DestroyedBuildingsCountHistory::instance[0] = DAT_DestroyedBuildingsCount::instance; DAT_DestroyedBuildingsCount::instance = 0; } + + // FUNCTION: STRONGHOLDCRUSADER 0x0044AAB0 + int __cdecl UpdateUnitLossSpeechFeedback_RelativeValueForGenie(int larger, int smaller) + { + if (larger < 1) { + larger = 1; + } + if (smaller < 1) { + smaller = 1; + } + if (larger > smaller) { + int iVar1 = (larger * 100) / smaller; + if (iVar1 < 150) { + return 0; + } + if (iVar1 < 170) { + return 1; + } + if (iVar1 < 190) { + return 2; + } + if (iVar1 < 210) { + return 3; + } + if (iVar1 < 230) { + return 4; + } + if (iVar1 < 250) { + return 5; + } + if (iVar1 < 270) { + return 6; + } + return 7; + } else { + int iVar1 = (smaller * 100) / larger; + if (iVar1 < 150) { + return 0; + } + if (iVar1 < 190) { + return -1; + } + if (iVar1 < 240) { + return -2; + } + return -3; + } + } + } } } diff --git a/src/OpenSHC/Game.func.hpp b/src/OpenSHC/Game.func.hpp index 8d9b8b9a..8c4c8488 100644 --- a/src/OpenSHC/Game.func.hpp +++ b/src/OpenSHC/Game.func.hpp @@ -19,10 +19,6 @@ namespace Game_Func { void(__cdecl*)(int value), false, Address::SHC_3BB0A8C1_0x0044AA70, &OpenSHC::Game::UpdateUnitValueLoss) UpdateUnitValueLoss; - MACRO_FUNCTION_RESOLVER(int(__cdecl*)(int larger, int smaller), false, Address::SHC_3BB0A8C1_0x0044AAB0, - &OpenSHC::Game::RelativeValueForGenie) - RelativeValueForGenie; - MACRO_FUNCTION_RESOLVER(BOOLEnum(__cdecl*)(undefined4 actionType, int actionParam), false, Address::SHC_3BB0A8C1_0x004BD800, &OpenSHC::Game::Tutorial_IsActionAllowed) Tutorial_IsActionAllowed; diff --git a/src/OpenSHC/Game.hpp b/src/OpenSHC/Game.hpp index 6fa08c5c..07a0d99a 100644 --- a/src/OpenSHC/Game.hpp +++ b/src/OpenSHC/Game.hpp @@ -16,8 +16,6 @@ namespace Game { void __cdecl UpdateUnitValueLoss(int value); - int __cdecl RelativeValueForGenie(int larger, int smaller); - BOOLEnum __cdecl Tutorial_IsActionAllowed(undefined4 actionType, int actionParam); } // namespace Game diff --git a/src/OpenSHC/Game/RelativeValueForGenie.cpp b/src/OpenSHC/Game/RelativeValueForGenie.cpp deleted file mode 100644 index ef26b60e..00000000 --- a/src/OpenSHC/Game/RelativeValueForGenie.cpp +++ /dev/null @@ -1,55 +0,0 @@ -#include "../Game.func.hpp" - -namespace OpenSHC { -namespace Game { - - // FUNCTION: STRONGHOLDCRUSADER 0x0044AAB0 - int __cdecl RelativeValueForGenie(int larger, int smaller) - { - if (larger < 1) { - larger = 1; - } - if (smaller < 1) { - smaller = 1; - } - if (larger > smaller) { - int iVar1 = (larger * 100) / smaller; - if (iVar1 < 150) { - return 0; - } - if (iVar1 < 170) { - return 1; - } - if (iVar1 < 190) { - return 2; - } - if (iVar1 < 210) { - return 3; - } - if (iVar1 < 230) { - return 4; - } - if (iVar1 < 250) { - return 5; - } - if (iVar1 < 270) { - return 6; - } - return 7; - } else { - int iVar1 = (smaller * 100) / larger; - if (iVar1 < 150) { - return 0; - } - if (iVar1 < 190) { - return -1; - } - if (iVar1 < 240) { - return -2; - } - return -3; - } - } - -} -} diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index ed5c0936..2a0e386e 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -16517,7 +16517,7 @@ SHC_3BB0A8C1_0x0044B7D0 | 0.0% | Pending SHC_3BB0A8C1_0x0044B800 | 0.0% | Pending -SHC_3BB0A8C1_0x0044B840 | 0.0% | Pending +SHC_3BB0A8C1_0x0044B840 | 84.0% | Reimplemented, but heavy register mismatch. Logic seems sound, though. SHC_3BB0A8C1_0x0044B890 | 0.0% | Pending