From 645d7f38d185d3613a2913609c62e708ddd5e1d9 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/3] 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 da88a3613950f9680218fcc17c2a17330425836f 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/3] 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 f60d04e311b387e213ef2b14e53dbd868bfd8517 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/3] reimplement: SHC_3BB0A8C1_0x0044B840 tried to reduce code --- .../SFX/UpdateUnitLossSpeechFeedback.cpp | 220 ++++++++---------- .../Globals/DAT_CurrentPlayerUnitLosses.hpp | 2 +- src/symbols/data.asm | 6 +- 3 files changed, 106 insertions(+), 122 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/OpenSHC/Globals/DAT_CurrentPlayerUnitLosses.hpp b/src/OpenSHC/Globals/DAT_CurrentPlayerUnitLosses.hpp index eb891506..83b3225e 100644 --- a/src/OpenSHC/Globals/DAT_CurrentPlayerUnitLosses.hpp +++ b/src/OpenSHC/Globals/DAT_CurrentPlayerUnitLosses.hpp @@ -13,7 +13,7 @@ namespace OpenSHC { -MACRO_STRUCT_RESOLVER(undefined4, false, Address::SHC_3BB0A8C1_0x00B98658) DAT_CurrentPlayerUnitLosses; +MACRO_STRUCT_RESOLVER(int, false, Address::SHC_3BB0A8C1_0x00B98658) DAT_CurrentPlayerUnitLosses; } // namespace OpenSHC MACRO_STRUCT_INSTANCE(Address::SHC_3BB0A8C1_0x00B98658); diff --git a/src/symbols/data.asm b/src/symbols/data.asm index 63082280..0fdcdad2 100644 --- a/src/symbols/data.asm +++ b/src/symbols/data.asm @@ -469,7 +469,7 @@ PUBLIC ?instance@?$Extern@$$BY03H$0LJIGCA@@StructResolver@@2PAHA PUBLIC ?instance@?$Extern@$$BY09H$0LJIGDA@@StructResolver@@2PAHA -PUBLIC ?instance@?$Extern@I$0LJIGFI@@StructResolver@@2IA +PUBLIC ?instance@?$Extern@H$0LJIGFI@@StructResolver@@2HA PUBLIC ?instance@?$Extern@I$0LJIGFM@@StructResolver@@2IA @@ -2066,7 +2066,7 @@ _TEXT SEGMENT ?instance@?$Extern@$$BY09H$0LJIGDA@@StructResolver@@2PAHA EQU 00B98630h -?instance@?$Extern@I$0LJIGFI@@StructResolver@@2IA EQU 00B98658h +?instance@?$Extern@H$0LJIGFI@@StructResolver@@2HA EQU 00B98658h ?instance@?$Extern@I$0LJIGFM@@StructResolver@@2IA EQU 00B9865Ch @@ -3195,4 +3195,4 @@ _TEXT SEGMENT _TEXT ENDS -END \ No newline at end of file +END