Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
203 changes: 203 additions & 0 deletions src/OpenSHC/Audio/SFX/UpdateUnitLossSpeechFeedback.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,203 @@
#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()
{
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) {
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;
for (int _offset = 8; _offset >= 0; --_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];
}
}
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 (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 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_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;
}

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);
}
}
}
}
}
DAT_GL_Counter::instance = 0;
}
}
}
DAT_CurrentPlayerUnitLosses::instance = 0;
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) {
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;
}
}
}
}
2 changes: 1 addition & 1 deletion src/OpenSHC/Globals/DAT_CurrentPlayerUnitLosses.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
6 changes: 3 additions & 3 deletions src/symbols/data.asm
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down Expand Up @@ -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

Expand Down Expand Up @@ -3195,4 +3195,4 @@ _TEXT SEGMENT

_TEXT ENDS

END
END