mirror of
https://github.com/open-goal/jak-project
synced 2026-08-06 18:03:30 -04:00
321a113dd7
Fix compiler warnings, and a bug where the `snd_handle` of `SoundBankInfo` was never set, leading to sound banks never unloading. The game relies on unloading soundbanks to make sure certain sounds don't play, like the blue gun 1 fire noise when using blue gun 2. --------- Co-authored-by: water111 <awaterford1111445@gmail.com>
176 lines
4.2 KiB
C++
176 lines
4.2 KiB
C++
#include "sbank.h"
|
|
|
|
#include "common/util/Assert.h"
|
|
|
|
#include "game/overlord/jak3/overlord.h"
|
|
|
|
namespace jak3 {
|
|
|
|
constexpr int kNumBanks = 8;
|
|
SoundBankInfo* gBanks[kNumBanks];
|
|
|
|
SoundBankInfo gCommonBank;
|
|
SoundBankInfo gModeBank;
|
|
SoundBankInfo gLevel0Bank, gLevel0hBank;
|
|
SoundBankInfo gLevel1Bank, gLevel1hBank;
|
|
SoundBankInfo gLevel2Bank, gLevel2hBank;
|
|
|
|
void jak3_overlord_init_globals_sbank() {
|
|
gBanks[0] = &gCommonBank;
|
|
gBanks[1] = &gModeBank;
|
|
gBanks[2] = &gLevel0Bank;
|
|
gBanks[3] = &gLevel0hBank;
|
|
gBanks[4] = &gLevel1Bank;
|
|
gBanks[5] = &gLevel1hBank;
|
|
gBanks[6] = &gLevel2Bank;
|
|
gBanks[7] = &gLevel2hBank;
|
|
}
|
|
|
|
// added
|
|
void PrintBanks() {
|
|
printf("Loaded Banks\n");
|
|
for (int i = 0; i < kNumBanks; i++) {
|
|
printf(" [%d] %s %s (%d/%d)\n", i, gBanks[i]->m_name1, gBanks[i]->m_name2, gBanks[i]->in_use,
|
|
gBanks[i]->loaded);
|
|
}
|
|
}
|
|
|
|
void InitBanks() {
|
|
for (int i = 0; i < kNumBanks; i++) {
|
|
auto* bank = gBanks[i];
|
|
bank->in_use = 0;
|
|
bank->snd_handle = nullptr;
|
|
bank->loaded = false;
|
|
bank->idx = i;
|
|
bank->unk0 = 0;
|
|
}
|
|
|
|
strncpyz(gBanks[0]->m_name2, "common", 0x10);
|
|
gBanks[0]->m_nSpuMemSize = 0xbbe40;
|
|
gBanks[0]->m_nSpuMemLoc = 0x1d1c0;
|
|
|
|
strncpyz(gBanks[1]->m_name2, "mode", 0x10);
|
|
gBanks[1]->m_nSpuMemSize = 0x25400;
|
|
gBanks[1]->m_nSpuMemLoc = 0xe0000;
|
|
|
|
strncpyz(gBanks[2]->m_name2, "level0", 0x10);
|
|
gBanks[2]->m_nSpuMemLoc = 0x105400;
|
|
gBanks[2]->m_nSpuMemSize = 0x51400;
|
|
|
|
strncpyz(gBanks[3]->m_name2, "level0h", 0x10);
|
|
gBanks[3]->m_nSpuMemLoc = 0x12de00;
|
|
gBanks[3]->m_nSpuMemSize = 0x28a00;
|
|
|
|
strncpyz(gBanks[4]->m_name2, "level1", 0x10);
|
|
gBanks[4]->m_nSpuMemSize = 0x51400;
|
|
gBanks[4]->m_nSpuMemLoc = 0x156800;
|
|
|
|
strncpyz(gBanks[5]->m_name2, "level1h", 0x10);
|
|
gBanks[5]->m_nSpuMemSize = 0x28a00;
|
|
gBanks[5]->m_nSpuMemLoc = 0x17f200;
|
|
|
|
strncpyz(gBanks[6]->m_name2, "level2", 0x10);
|
|
gBanks[6]->m_nSpuMemSize = 0x51400;
|
|
gBanks[6]->m_nSpuMemLoc = 0x1a7c00;
|
|
|
|
strncpyz(gBanks[7]->m_name2, "level2h", 0x10);
|
|
gBanks[7]->m_nSpuMemSize = 0x28a00;
|
|
gBanks[7]->m_nSpuMemLoc = 0x1d0600;
|
|
}
|
|
|
|
SoundBankInfo* AllocateBankName(const char* name, u32 mode) {
|
|
int iVar1;
|
|
int mem_sz;
|
|
SoundBankInfo** ppSVar2;
|
|
int iVar3;
|
|
int iVar4;
|
|
SoundBankInfo* pSVar5;
|
|
int iVar6;
|
|
int iVar6_d4 = 2;
|
|
SoundBankInfo* bank = nullptr;
|
|
|
|
// handle common case
|
|
if (memcmp(name, "common", 7) == 0 || memcmp(name, "commonj", 8) == 0) {
|
|
if (!gBanks[0]->in_use) {
|
|
bank = gBanks[0];
|
|
}
|
|
} else if (memcmp(name, "mode", 4) == 0) {
|
|
if (!gBanks[1]->in_use) {
|
|
bank = gBanks[1];
|
|
}
|
|
}
|
|
|
|
if (mode == 4) {
|
|
for (int bank_idx = 2; bank_idx < kNumBanks; bank_idx += 2) {
|
|
if (!gBanks[bank_idx]->in_use && !gBanks[bank_idx + 1]->in_use) {
|
|
bank = gBanks[bank_idx];
|
|
bank->m_nSpuMemSize = 0x51400;
|
|
break;
|
|
}
|
|
}
|
|
} else if (mode > 3 && (mode - 6u < 3)) { // wtf
|
|
iVar1 = 2;
|
|
// iVar6 = 8;
|
|
iVar6_d4 = 2;
|
|
while (gBanks[iVar6_d4]->in_use == 0 || gBanks[iVar6_d4]->mode != mode) {
|
|
auto* sbi = gBanks[iVar6_d4 + 1];
|
|
iVar6 = iVar6 + 8;
|
|
if (((sbi->in_use != 0) && (iVar4 = iVar1, sbi->mode == mode)) ||
|
|
(iVar1 = iVar1 + 2, iVar4 = -1, 7 < iVar1))
|
|
goto LAB_0000c2fc;
|
|
}
|
|
iVar4 = iVar1 + 1;
|
|
LAB_0000c2fc:
|
|
if (iVar4 < 0) {
|
|
iVar1 = 2;
|
|
ppSVar2 = gBanks;
|
|
LAB_0000c36c:
|
|
ppSVar2 = ppSVar2 + 2;
|
|
pSVar5 = *ppSVar2;
|
|
iVar1 = iVar1 + 2;
|
|
if ((pSVar5->in_use != 0) || (ppSVar2[1]->in_use != 0))
|
|
goto LAB_0000c39c;
|
|
mem_sz = 0x28a00;
|
|
pSVar5->m_nSpuMemSize = mem_sz;
|
|
bank = pSVar5;
|
|
goto LAB_0000c3a4;
|
|
}
|
|
pSVar5 = gBanks[iVar4];
|
|
if (pSVar5->in_use == 0) {
|
|
gBanks[iVar1]->m_nSpuMemSize = 0x28a00;
|
|
bank = pSVar5;
|
|
}
|
|
}
|
|
LAB_0000c3a4:
|
|
if (bank) {
|
|
bank->mode = mode;
|
|
bank->snd_handle = nullptr;
|
|
bank->unk0 = 0;
|
|
}
|
|
return bank;
|
|
|
|
LAB_0000c39c:
|
|
if (7 < iVar1)
|
|
goto LAB_0000c3a4;
|
|
goto LAB_0000c36c;
|
|
}
|
|
|
|
SoundBankInfo* LookupBank(const char* name) {
|
|
for (int i = kNumBanks; i-- > 0;) {
|
|
if (memcmp(name, gBanks[i]->m_name1, 16) == 0) {
|
|
return gBanks[i];
|
|
}
|
|
}
|
|
return nullptr;
|
|
}
|
|
|
|
int GetFalloffCurve(int x) {
|
|
if (x < 0) {
|
|
return 1;
|
|
}
|
|
if (x == 0 || 0x28 < x) {
|
|
x = 2;
|
|
}
|
|
return x;
|
|
}
|
|
} // namespace jak3
|