jak-project/game/overlord/jak3/ssound.cpp
water111 e81431bd21
Some checks are pending
Build / 🖥️ Windows (push) Waiting to run
Build / 🐧 Linux (push) Waiting to run
Build / 🍎 MacOS (push) Waiting to run
Inform Pages Repo / Generate Documentation (push) Waiting to run
Lint / 📝 Required Checks (push) Waiting to run
Lint / 📝 Optional Checks (push) Waiting to run
Lint / 📝 Formatting (push) Waiting to run
[wip] Jak 3 Overlord (#3567)
2024-07-26 09:42:28 -04:00

995 lines
36 KiB
C++

#include "ssound.h"
#include <array>
#include "common/util/Assert.h"
#include "game/overlord/jak3/iso.h"
#include "game/overlord/jak3/overlord.h"
#include "game/overlord/jak3/spustreams.h"
#include "game/overlord/jak3/streamlist.h"
#include "game/overlord/jak3/vag.h"
#include "game/sce/iop.h"
#include "game/sound/sdshim.h"
#include "game/sound/sndshim.h"
namespace jak3 {
struct Curve {
s32 a, b, c, d;
};
constexpr int kNumSounds = 0x40;
using namespace iop;
s32 g_n989Semaphore = -1;
s32 g_EarTransSema = -1;
bool g_bSoundEnable = true;
u32 g_anStreamVoice[6];
VolumePair g_aPanTable[361];
SoundInfo gSounds[kNumSounds];
s32 gEarTrans[6];
s32 gCamTrans[3];
s32 gCamForward[3];
s32 gCamLeft[3];
s32 gCamScale;
Curve gCurves[0x29];
std::array<u8, 1024> unktable;
bool g_CameraInvert = false;
u32 gLastTick = 0;
static s32 sqrt_table[256] = {
0, 4096, 5793, 7094, 8192, 9159, 10033, 10837, 11585, 12288, 12953, 13585, 14189,
14768, 15326, 15864, 16384, 16888, 17378, 17854, 18318, 18770, 19212, 19644, 20066, 20480,
20886, 21283, 21674, 22058, 22435, 22806, 23170, 23530, 23884, 24232, 24576, 24915, 25249,
25580, 25905, 26227, 26545, 26859, 27170, 27477, 27780, 28081, 28378, 28672, 28963, 29251,
29537, 29819, 30099, 30377, 30652, 30924, 31194, 31462, 31727, 31991, 32252, 32511, 32768,
33023, 33276, 33527, 33776, 34024, 34270, 34514, 34756, 34996, 35235, 35472, 35708, 35942,
36175, 36406, 36636, 36864, 37091, 37316, 37540, 37763, 37985, 38205, 38424, 38642, 38858,
39073, 39287, 39500, 39712, 39923, 40132, 40341, 40548, 40755, 40960, 41164, 41368, 41570,
41771, 41972, 42171, 42369, 42567, 42763, 42959, 43154, 43348, 43541, 43733, 43925, 44115,
44305, 44494, 44682, 44869, 45056, 45242, 45427, 45611, 45795, 45977, 46160, 46341, 46522,
46702, 46881, 47059, 47237, 47415, 47591, 47767, 47942, 48117, 48291, 48465, 48637, 48809,
48981, 49152, 49322, 49492, 49661, 49830, 49998, 50166, 50332, 50499, 50665, 50830, 50995,
51159, 51323, 51486, 51649, 51811, 51972, 52134, 52294, 52454, 52614, 52773, 52932, 53090,
53248, 53405, 53562, 53719, 53874, 54030, 54185, 54340, 54494, 54647, 54801, 54954, 55106,
55258, 55410, 55561, 55712, 55862, 56012, 56162, 56311, 56459, 56608, 56756, 56903, 57051,
57198, 57344, 57490, 57636, 57781, 57926, 58071, 58215, 58359, 58503, 58646, 58789, 58931,
59073, 59215, 59357, 59498, 59639, 59779, 59919, 60059, 60199, 60338, 60477, 60615, 60753,
60891, 61029, 61166, 61303, 61440, 61576, 61712, 61848, 61984, 62119, 62254, 62388, 62523,
62657, 62790, 62924, 63057, 63190, 63323, 63455, 63587, 63719, 63850, 63982, 64113, 64243,
64374, 64504, 64634, 64763, 64893, 65022, 65151, 65279, 65408,
};
void jak3_overlord_init_globals_ssound() {
g_bSoundEnable = true;
g_n989Semaphore = -1;
g_EarTransSema = -1;
for (auto& x : g_anStreamVoice) {
x = 0;
}
for (auto& x : gSounds) {
x = {};
}
unktable.fill(0);
g_CameraInvert = false;
gLastTick = 0;
}
void InitSound() {
for (auto& sound : gSounds) {
sound.id = 0;
}
int j = 0;
do {
unktable[j] = 0;
unktable[j + 0x2c] = 0;
unktable[j + 0x58] = 0;
unktable[j + 0x84] = 0;
unktable[j + 0xb0] = 0;
j = j + 1;
} while (j < 0x29);
SetCurve(0, 0, 0, 1, 0, 0, 0, 0);
SetCurve(1, 0, 0, 0, 0, 0, 1, 0);
SetCurve(2, 0, 0, 1, 0, 0, 0, 0);
SetCurve(3, 0x1000, 0, 1, 0, 0, 0, 0);
SetCurve(4, 0, 0x1000, 1, 0, 0, 0, 0);
SetCurve(5, 0x800, 0, 1, 0, 0, 0, 0);
SetCurve(6, 0x800, 0x800, 1, 0, 0, 0, 0);
SetCurve(7, 0xfffff000, 0, 1, 0, 0, 0, 0);
SetCurve(8, 0xfffff800, 0, 1, 0, 0, 0, 0);
SetCurve(9, 0, 0, 1, 0, 0, 0, 0);
SetCurve(10, 0, 0, 0, 0, 0, 0, 0);
SetCurve(0xb, 0, 0, 1, 0, 0, 0, 0);
SetCurve(0xc, 0, 0, 1, 0, 1, 0, 0);
SetCurve(0xd, 0x1000, 0, 1, 0, 1, 0, 0);
SetCurve(0xe, 0, 0x1000, 1, 0, 1, 0, 0);
SetCurve(0xf, 0x800, 0, 1, 0, 1, 0, 0);
SetCurve(0x10, 0x800, 0x800, 1, 0, 1, 0, 0);
SetCurve(0x11, 0xfffff000, 0, 1, 0, 1, 0, 0);
SetCurve(0x12, 0xfffff800, 0, 1, 0, 1, 0, 0);
SetCurve(0x13, 0, 0, 0, 0, 1, 0, 0);
SetCurve(0x14, 0, 0, 0, 0, 0, 1, 1);
SetCurve(0x15, 0, 0, 1, 0, 0, 0, 1);
SetCurve(0x16, 0x1000, 0, 1, 0, 0, 0, 1);
SetCurve(0x17, 0, 0x1000, 1, 0, 0, 0, 1);
SetCurve(0x18, 0x800, 0, 1, 0, 0, 0, 1);
SetCurve(0x19, 0x800, 0x800, 1, 0, 0, 0, 1);
SetCurve(0x1a, 0xfffff000, 0, 1, 0, 0, 0, 1);
SetCurve(0x1b, 0xfffff800, 0, 1, 0, 0, 0, 1);
SetCurve(0x1c, 0, 0, 1, 0, 0, 0, 1);
SetCurve(0x1d, 0, 0, 0, 0, 0, 0, 1);
SetCurve(0x1e, 0, 0, 1, 0, 0, 0, 1);
SetCurve(0x1f, 0, 0, 1, 0, 1, 0, 1);
SetCurve(0x20, 0x1000, 0, 1, 0, 1, 0, 1);
SetCurve(0x21, 0, 0x1000, 1, 0, 1, 0, 1);
SetCurve(0x22, 0x800, 0, 1, 0, 1, 0, 1);
SetCurve(0x23, 0x800, 0x800, 1, 0, 1, 0, 1);
SetCurve(0x24, 0xfffff000, 0, 1, 0, 1, 0, 1);
SetCurve(0x25, 0xfffff800, 0, 1, 0, 1, 0, 1);
SetCurve(0x26, 0, 0, 0, 0, 1, 0, 1);
SetCurve(0x27, 0, 0, 1, 1, 0, 1, 0);
SetCurve(0x28, 0, 0, 1, 1, 0, 1, 1);
// changed
// snd_StartSoundSystemEx(2);
snd_StartSoundSystem();
// iVar4 = 5;
// snd_RegisterIOPMemAllocator(FUN_0000dc7c,FUN_0000de84);
// snd_LockVoiceAllocatorEx(1,0x12345678);
// piVar1 = g_anStreamVoice;
// do {
// iVar2 = snd_ExternVoiceAlloc(2,0x7f);
// iVar4 = iVar4 + -1;
// *piVar1 = iVar2 * 2 + ((iVar2 / 6 + (iVar2 >> 0x1f) >> 2) - (iVar2 >> 0x1f)) * -0x2f;
// piVar1 = piVar1 + 1;
// } while (-1 < iVar4);
g_anStreamVoice[0] = SD_VOICE(0, 0);
g_anStreamVoice[1] = SD_VOICE(0, 1);
g_anStreamVoice[2] = SD_VOICE(0, 2);
g_anStreamVoice[3] = SD_VOICE(0, 3);
g_anStreamVoice[4] = SD_VOICE(0, 4);
g_anStreamVoice[5] = SD_VOICE(0, 5);
// snd_UnlockVoiceAllocator();
// snd_SetMixerMode(0,0);
// iVar4 = 0;
// do {
// iVar2 = iVar4 + 1;
// snd_SetGroupVoiceRange(iVar4,6,0x2f);
// iVar4 = iVar2;
// } while (iVar2 < 0xe);
// snd_SetGroupVoiceRange(2,0,5);
// what is this even doing.
// sceSdGetAddr(0x1c00);
// sceSdGetAddr(0x1d00);
// sceSdGetAddr(0x1c01);
// sceSdGetAddr(0x1d01);
// CpuSuspendIntr(local_18);
// sceSdSetAddr(0,0);
// sceSdSetAddr(1,0);
// sceSdSetAddr(0,0xff);
// sceSdSetAddr(1,0xff);
// CpuResumeIntr(local_18[0]);
// uVar3 = sceSdGetAddr(0x1c01);
// snd_SRAMMarkUsed(uVar3,0x7000);
// uVar3 = sceSdGetAddr(0x1c00);
// snd_SRAMMarkUsed(uVar3,0x7000);
// local_3c = 0x104;
// local_36 = 0xa7b;
// local_38 = 0xa7b;
// g_nCore1ReverbMode = 4;
// g_nCore0ReverbMode = 4;
// local_34 = 0;
// local_30 = 0;
// local_40 = 0;
// sceSdSetEffectAttr(0, &local_40);
// local_40 = 1;
// sceSdSetEffectAttr(1, &local_40);
// maybe_sceSdSetCoreAttr(2, 1);
// maybe_sceSdSetCoreAttr(3, 1);
// TODO: this is possibly very wrong:
// g_aPanTable = snd_GetPanTable();
for (int i = 0; i < 91; i++) {
s16 opposing_front = static_cast<s16>(((i * 0x33ff) / 90) + 0xc00);
s16 rear_right = static_cast<s16>(((i * -0x2800) / 90) + 0x3400);
s16 rear_left = static_cast<s16>(((i * -0xbff) / 90) + 0x3fff);
g_aPanTable[90 - i].left = 0x3FFF;
g_aPanTable[180 - i].left = opposing_front;
g_aPanTable[270 - i].left = rear_right;
g_aPanTable[360 - i].left = rear_left;
g_aPanTable[i].right = opposing_front;
g_aPanTable[90 + i].right = 0x3FFF;
g_aPanTable[180 + i].right = rear_left;
g_aPanTable[270 + i].right = rear_right;
}
SetPlaybackMode(2);
SemaParam param;
param.attr = 1;
param.init_count = 1;
param.max_count = 1;
param.option = 0;
g_nMusicSemaphore = CreateSema(&param);
ASSERT(g_nMusicSemaphore >= 0);
param.attr = 1;
param.init_count = 1;
param.max_count = 1;
param.option = 0;
g_n989Semaphore = CreateSema(&param);
ASSERT(g_n989Semaphore >= 0);
param.max_count = 1;
param.attr = 1;
param.init_count = 1;
param.option = 0;
g_EarTransSema = CreateSema(&param);
ASSERT(g_EarTransSema >= 0);
// Init989Plugins();
// InitStreamLfoHandler();
// InitVagStreamList((List*)&g_PluginStreamsList, 4, s_plugin_00015918);
InitVagStreamList(&g_EEStreamsList, 4, "ee");
InitVagStreamList(&g_EEPlayList, 8, "play");
InitVagStreamList(&g_RequestedStreamsList, 8, "streams");
InitVagStreamList(&g_NewStreamsList, 4, "new");
}
SoundInfo* LookupSound(int id) {
if (id == 0) {
return nullptr;
}
for (auto& sound : gSounds) {
if (sound.id == id) {
s32 handle = snd_SoundIsStillPlaying(sound.sound_handle);
sound.sound_handle = handle;
if (handle) {
return &sound;
} else {
sound.id = 0;
return nullptr;
}
}
}
return nullptr;
}
void CleanSounds() {
for (auto& sound : gSounds) {
if (sound.id) {
s32 handle = snd_SoundIsStillPlaying(sound.sound_handle);
sound.sound_handle = handle;
if (handle == 0) {
sound.id = 0;
}
}
}
}
void KillSoundsInGroup(u32 group) {
for (auto& sound : gSounds) {
if (sound.id) {
s32 handle = snd_SoundIsStillPlaying(sound.sound_handle);
sound.sound_handle = handle;
if (handle) {
if (sound.params.group & group) {
snd_StopSound(handle);
sound.id = 0;
}
} else {
sound.id = 0;
}
}
}
}
void KillLeastUsefulSound() {
int unique_sounds = 0;
struct Entry {
u32 id;
u32 count;
SoundInfo* info;
};
Entry entries[kNumSounds];
Entry* best_entry = nullptr;
for (auto& sound : gSounds) {
if (sound.id) {
Entry* existing_entry = nullptr;
u32 uid = snd_GetSoundID(sound.sound_handle);
// look for entry:
for (int i = 0; i < unique_sounds; i++) {
if (entries[i].id == uid) {
existing_entry = &entries[i];
break;
}
}
// if none found, create
if (!existing_entry) {
existing_entry = &entries[unique_sounds];
unique_sounds++;
existing_entry->id = uid;
existing_entry->count = 0;
existing_entry->info = &sound;
}
// update
existing_entry->count++;
// se if we're best
if (!best_entry) {
best_entry = existing_entry;
} else {
if (best_entry->count < existing_entry->count) {
best_entry = existing_entry;
}
}
// update entry:
// update best:
}
}
if (best_entry) {
snd_StopSound(best_entry->info->sound_handle);
best_entry->info->id = 0;
}
}
SoundInfo* AllocateSound() {
for (auto& sound : gSounds) {
if (!sound.id) {
return &sound;
}
}
CleanSounds();
for (auto& sound : gSounds) {
if (!sound.id) {
return &sound;
}
}
KillLeastUsefulSound();
for (auto& sound : gSounds) {
if (!sound.id) {
return &sound;
}
}
ASSERT_NOT_REACHED();
return nullptr;
}
u32 CalculateFalloffVolume(s32* trans,
u32 vol,
u32 fo_curve,
u32 fo_min,
u32 fo_max,
u32* outa,
u32* outb) {
ASSERT(fo_curve < 0x29);
// undefined4 uVar1;
u32 uVar2;
int iVar3;
int iVar4;
u32 uVar5;
int iVar6;
int iVar7;
int iVar8;
u32 uVar9;
u32 uVar10;
uVar10 = 0;
WaitSema(g_EarTransSema);
if (outa) {
*outa = 0;
}
if (outb) {
*outb = 0;
}
if (unktable[fo_curve + 0x84] != 0) {
SignalSema(g_EarTransSema);
return vol;
}
if (unktable[fo_curve + 0x58] != 0) {
trans = gEarTrans + 3;
}
switch (fo_curve) {
case 9:
case 0xb:
case 0x1c:
case 0x1e:
iVar8 = gEarTrans[3] - *trans;
iVar3 = gEarTrans[4] - trans[1];
iVar7 = gEarTrans[5] - trans[2];
uVar2 = 3;
if (outa) {
LAB_0000d094:
*outa = uVar2;
}
break;
case 10:
case 0x13:
case 0x1d:
case 0x26:
iVar8 = 0;
iVar3 = gEarTrans[1] - trans[1];
iVar7 = 0;
if (outa) {
*outa = 2;
}
goto LAB_0000d0a4;
default:
iVar8 = gEarTrans[0] - *trans;
iVar7 = gEarTrans[2] - trans[2];
iVar3 = gEarTrans[1] - trans[1];
if (outa) {
uVar2 = 1;
goto LAB_0000d094;
}
}
if (iVar8 < 0) {
iVar8 = -iVar8;
}
LAB_0000d0a4:
if (iVar3 < 0) {
iVar3 = -iVar3;
}
if (iVar7 < 0) {
iVar7 = -iVar7;
}
fo_min = fo_min << 8;
fo_max = fo_max << 8;
uVar9 = 0;
iVar6 = iVar3;
if (iVar3 < iVar7) {
iVar6 = iVar7;
}
iVar4 = fo_max;
if (fo_max < iVar8) {
iVar4 = iVar8;
}
if (iVar4 < iVar6) {
iVar4 = iVar6;
}
while (0x7fff < iVar4) {
fo_max = fo_max >> 1;
fo_min = fo_min >> 1;
iVar8 = iVar8 >> 1;
iVar3 = iVar3 >> 1;
iVar7 = iVar7 >> 1;
uVar9 = uVar9 + 1;
iVar4 = iVar4 >> 1;
}
if (gCamScale != 0x10000) {
iVar8 = iVar8 * gCamScale >> 0x10;
iVar3 = iVar3 * gCamScale >> 0x10;
iVar7 = iVar7 * gCamScale >> 0x10;
if (0x10000 < gCamScale) {
iVar6 = iVar3;
if (iVar3 < iVar7) {
iVar6 = iVar7;
}
iVar4 = fo_max;
if (fo_max < iVar8) {
iVar4 = iVar8;
}
if (iVar4 < iVar6) {
iVar4 = iVar6;
}
while (0x7fff < iVar4) {
fo_max = fo_max >> 1;
fo_min = fo_min >> 1;
iVar8 = iVar8 >> 1;
iVar3 = iVar3 >> 1;
iVar7 = iVar7 >> 1;
uVar9 = uVar9 + 1;
iVar4 = iVar4 >> 1;
}
}
}
if ((outb) || (((iVar8 <= fo_max && (iVar3 <= fo_max)) && (iVar7 <= fo_max)))) {
uVar10 = iVar8 * iVar8 + iVar3 * iVar3 + iVar7 * iVar7;
iVar8 = 0;
if (uVar10 != 0) {
uVar5 = 0;
while ((uVar10 & 0xc0000000) == 0) {
uVar10 = uVar10 << 2;
uVar5 = uVar5 + 1;
}
iVar8 = (int)(u32)sqrt_table[uVar10 >> 0x18] >> (uVar5 & 0x1f);
}
if (outb) {
*outb = iVar8 << (uVar9 & 0x1f);
}
uVar10 = vol;
if ((fo_min < iVar8) && (uVar10 = 0, iVar8 < fo_max)) {
uVar10 = iVar8 - fo_min;
uVar9 = fo_max - fo_min;
while (0xffff < uVar10) {
uVar10 = uVar10 >> 1;
uVar9 = (int)uVar9 >> 1;
}
uVar5 = (uVar10 << 0x10) / uVar9;
if (uVar9 == 0) {
ASSERT_NOT_REACHED();
}
uVar10 = vol;
if (uVar5 != 0x10000) {
uVar10 = uVar5 * uVar5 >> 0x10;
uVar10 = gCurves[fo_curve].c * uVar5 + gCurves[fo_curve].b * uVar10 +
gCurves[fo_curve].d * 0x10000 +
gCurves[fo_curve].a * (uVar10 * uVar5 >> 0x10) >>
0xc;
if ((int)uVar10 < 0) {
uVar10 = 0;
} else {
if (0x10000 < uVar10) {
uVar10 = 0x10000;
}
}
uVar10 = (int)(uVar10 * vol) >> 0x10;
}
}
}
if ((fo_curve == 0xb) && (uVar10 < 0x180)) {
uVar10 = 0x180;
}
SignalSema(g_EarTransSema);
return uVar10;
}
constexpr s16 unk_table_2[2056] = {
0xB4, 0x0, 0xB4, 0x0, 0x5A, 0x5A, 0x10E, 0x10E, 0xB4, 0x0, 0xB4, 0x0, 0x5A,
0x5A, 0x10E, 0x10E, 0xB4, 0x0, 0xB4, 0x0, 0x5A, 0x5A, 0x10E, 0x10E, 0xB4, 0x0,
0xB4, 0x0, 0x5A, 0x5A, 0x10E, 0x10E, 0xB4, 0x0, 0xB4, 0x0, 0x5A, 0x5A, 0x10E,
0x10E, 0xB3, 0x1, 0xB5, 0x167, 0x5B, 0x59, 0x10D, 0x10F, 0xB3, 0x1, 0xB5, 0x167,
0x5B, 0x59, 0x10D, 0x10F, 0xB3, 0x1, 0xB5, 0x167, 0x5B, 0x59, 0x10D, 0x10F, 0xB3,
0x1, 0xB5, 0x167, 0x5B, 0x59, 0x10D, 0x10F, 0xB2, 0x2, 0xB6, 0x166, 0x5C, 0x58,
0x10C, 0x110, 0xB2, 0x2, 0xB6, 0x166, 0x5C, 0x58, 0x10C, 0x110, 0xB2, 0x2, 0xB6,
0x166, 0x5C, 0x58, 0x10C, 0x110, 0xB2, 0x2, 0xB6, 0x166, 0x5C, 0x58, 0x10C, 0x110,
0xB2, 0x2, 0xB6, 0x166, 0x5C, 0x58, 0x10C, 0x110, 0xB1, 0x3, 0xB7, 0x165, 0x5D,
0x57, 0x10B, 0x111, 0xB1, 0x3, 0xB7, 0x165, 0x5D, 0x57, 0x10B, 0x111, 0xB1, 0x3,
0xB7, 0x165, 0x5D, 0x57, 0x10B, 0x111, 0xB1, 0x3, 0xB7, 0x165, 0x5D, 0x57, 0x10B,
0x111, 0xB0, 0x4, 0xB8, 0x164, 0x5E, 0x56, 0x10A, 0x112, 0xB0, 0x4, 0xB8, 0x164,
0x5E, 0x56, 0x10A, 0x112, 0xB0, 0x4, 0xB8, 0x164, 0x5E, 0x56, 0x10A, 0x112, 0xB0,
0x4, 0xB8, 0x164, 0x5E, 0x56, 0x10A, 0x112, 0xB0, 0x4, 0xB8, 0x164, 0x5E, 0x56,
0x10A, 0x112, 0xAF, 0x5, 0xB9, 0x163, 0x5F, 0x55, 0x109, 0x113, 0xAF, 0x5, 0xB9,
0x163, 0x5F, 0x55, 0x109, 0x113, 0xAF, 0x5, 0xB9, 0x163, 0x5F, 0x55, 0x109, 0x113,
0xAF, 0x5, 0xB9, 0x163, 0x5F, 0x55, 0x109, 0x113, 0xAE, 0x6, 0xBA, 0x162, 0x60,
0x54, 0x108, 0x114, 0xAE, 0x6, 0xBA, 0x162, 0x60, 0x54, 0x108, 0x114, 0xAE, 0x6,
0xBA, 0x162, 0x60, 0x54, 0x108, 0x114, 0xAE, 0x6, 0xBA, 0x162, 0x60, 0x54, 0x108,
0x114, 0xAE, 0x6, 0xBA, 0x162, 0x60, 0x54, 0x108, 0x114, 0xAD, 0x7, 0xBB, 0x161,
0x61, 0x53, 0x107, 0x115, 0xAD, 0x7, 0xBB, 0x161, 0x61, 0x53, 0x107, 0x115, 0xAD,
0x7, 0xBB, 0x161, 0x61, 0x53, 0x107, 0x115, 0xAD, 0x7, 0xBB, 0x161, 0x61, 0x53,
0x107, 0x115, 0xAC, 0x8, 0xBC, 0x160, 0x62, 0x52, 0x106, 0x116, 0xAC, 0x8, 0xBC,
0x160, 0x62, 0x52, 0x106, 0x116, 0xAC, 0x8, 0xBC, 0x160, 0x62, 0x52, 0x106, 0x116,
0xAC, 0x8, 0xBC, 0x160, 0x62, 0x52, 0x106, 0x116, 0xAC, 0x8, 0xBC, 0x160, 0x62,
0x52, 0x106, 0x116, 0xAB, 0x9, 0xBD, 0x15F, 0x63, 0x51, 0x105, 0x117, 0xAB, 0x9,
0xBD, 0x15F, 0x63, 0x51, 0x105, 0x117, 0xAB, 0x9, 0xBD, 0x15F, 0x63, 0x51, 0x105,
0x117, 0xAB, 0x9, 0xBD, 0x15F, 0x63, 0x51, 0x105, 0x117, 0xAB, 0x9, 0xBD, 0x15F,
0x63, 0x51, 0x105, 0x117, 0xAA, 0xA, 0xBE, 0x15E, 0x64, 0x50, 0x104, 0x118, 0xAA,
0xA, 0xBE, 0x15E, 0x64, 0x50, 0x104, 0x118, 0xAA, 0xA, 0xBE, 0x15E, 0x64, 0x50,
0x104, 0x118, 0xAA, 0xA, 0xBE, 0x15E, 0x64, 0x50, 0x104, 0x118, 0xA9, 0xB, 0xBF,
0x15D, 0x65, 0x4F, 0x103, 0x119, 0xA9, 0xB, 0xBF, 0x15D, 0x65, 0x4F, 0x103, 0x119,
0xA9, 0xB, 0xBF, 0x15D, 0x65, 0x4F, 0x103, 0x119, 0xA9, 0xB, 0xBF, 0x15D, 0x65,
0x4F, 0x103, 0x119, 0xA9, 0xB, 0xBF, 0x15D, 0x65, 0x4F, 0x103, 0x119, 0xA8, 0xC,
0xC0, 0x15C, 0x66, 0x4E, 0x102, 0x11A, 0xA8, 0xC, 0xC0, 0x15C, 0x66, 0x4E, 0x102,
0x11A, 0xA8, 0xC, 0xC0, 0x15C, 0x66, 0x4E, 0x102, 0x11A, 0xA8, 0xC, 0xC0, 0x15C,
0x66, 0x4E, 0x102, 0x11A, 0xA8, 0xC, 0xC0, 0x15C, 0x66, 0x4E, 0x102, 0x11A, 0xA7,
0xD, 0xC1, 0x15B, 0x67, 0x4D, 0x101, 0x11B, 0xA7, 0xD, 0xC1, 0x15B, 0x67, 0x4D,
0x101, 0x11B, 0xA7, 0xD, 0xC1, 0x15B, 0x67, 0x4D, 0x101, 0x11B, 0xA7, 0xD, 0xC1,
0x15B, 0x67, 0x4D, 0x101, 0x11B, 0xA6, 0xE, 0xC2, 0x15A, 0x68, 0x4C, 0x100, 0x11C,
0xA6, 0xE, 0xC2, 0x15A, 0x68, 0x4C, 0x100, 0x11C, 0xA6, 0xE, 0xC2, 0x15A, 0x68,
0x4C, 0x100, 0x11C, 0xA6, 0xE, 0xC2, 0x15A, 0x68, 0x4C, 0x100, 0x11C, 0xA6, 0xE,
0xC2, 0x15A, 0x68, 0x4C, 0x100, 0x11C, 0xA5, 0xF, 0xC3, 0x159, 0x69, 0x4B, 0xFF,
0x11D, 0xA5, 0xF, 0xC3, 0x159, 0x69, 0x4B, 0xFF, 0x11D, 0xA5, 0xF, 0xC3, 0x159,
0x69, 0x4B, 0xFF, 0x11D, 0xA5, 0xF, 0xC3, 0x159, 0x69, 0x4B, 0xFF, 0x11D, 0xA5,
0xF, 0xC3, 0x159, 0x69, 0x4B, 0xFF, 0x11D, 0xA4, 0x10, 0xC4, 0x158, 0x6A, 0x4A,
0xFE, 0x11E, 0xA4, 0x10, 0xC4, 0x158, 0x6A, 0x4A, 0xFE, 0x11E, 0xA4, 0x10, 0xC4,
0x158, 0x6A, 0x4A, 0xFE, 0x11E, 0xA4, 0x10, 0xC4, 0x158, 0x6A, 0x4A, 0xFE, 0x11E,
0xA4, 0x10, 0xC4, 0x158, 0x6A, 0x4A, 0xFE, 0x11E, 0xA3, 0x11, 0xC5, 0x157, 0x6B,
0x49, 0xFD, 0x11F, 0xA3, 0x11, 0xC5, 0x157, 0x6B, 0x49, 0xFD, 0x11F, 0xA3, 0x11,
0xC5, 0x157, 0x6B, 0x49, 0xFD, 0x11F, 0xA3, 0x11, 0xC5, 0x157, 0x6B, 0x49, 0xFD,
0x11F, 0xA3, 0x11, 0xC5, 0x157, 0x6B, 0x49, 0xFD, 0x11F, 0xA2, 0x12, 0xC6, 0x156,
0x6C, 0x48, 0xFC, 0x120, 0xA2, 0x12, 0xC6, 0x156, 0x6C, 0x48, 0xFC, 0x120, 0xA2,
0x12, 0xC6, 0x156, 0x6C, 0x48, 0xFC, 0x120, 0xA2, 0x12, 0xC6, 0x156, 0x6C, 0x48,
0xFC, 0x120, 0xA2, 0x12, 0xC6, 0x156, 0x6C, 0x48, 0xFC, 0x120, 0xA1, 0x13, 0xC7,
0x155, 0x6D, 0x47, 0xFB, 0x121, 0xA1, 0x13, 0xC7, 0x155, 0x6D, 0x47, 0xFB, 0x121,
0xA1, 0x13, 0xC7, 0x155, 0x6D, 0x47, 0xFB, 0x121, 0xA1, 0x13, 0xC7, 0x155, 0x6D,
0x47, 0xFB, 0x121, 0xA1, 0x13, 0xC7, 0x155, 0x6D, 0x47, 0xFB, 0x121, 0xA0, 0x14,
0xC8, 0x154, 0x6E, 0x46, 0xFA, 0x122, 0xA0, 0x14, 0xC8, 0x154, 0x6E, 0x46, 0xFA,
0x122, 0xA0, 0x14, 0xC8, 0x154, 0x6E, 0x46, 0xFA, 0x122, 0xA0, 0x14, 0xC8, 0x154,
0x6E, 0x46, 0xFA, 0x122, 0xA0, 0x14, 0xC8, 0x154, 0x6E, 0x46, 0xFA, 0x122, 0x9F,
0x15, 0xC9, 0x153, 0x6F, 0x45, 0xF9, 0x123, 0x9F, 0x15, 0xC9, 0x153, 0x6F, 0x45,
0xF9, 0x123, 0x9F, 0x15, 0xC9, 0x153, 0x6F, 0x45, 0xF9, 0x123, 0x9F, 0x15, 0xC9,
0x153, 0x6F, 0x45, 0xF9, 0x123, 0x9F, 0x15, 0xC9, 0x153, 0x6F, 0x45, 0xF9, 0x123,
0x9E, 0x16, 0xCA, 0x152, 0x70, 0x44, 0xF8, 0x124, 0x9E, 0x16, 0xCA, 0x152, 0x70,
0x44, 0xF8, 0x124, 0x9E, 0x16, 0xCA, 0x152, 0x70, 0x44, 0xF8, 0x124, 0x9E, 0x16,
0xCA, 0x152, 0x70, 0x44, 0xF8, 0x124, 0x9E, 0x16, 0xCA, 0x152, 0x70, 0x44, 0xF8,
0x124, 0x9D, 0x17, 0xCB, 0x151, 0x71, 0x43, 0xF7, 0x125, 0x9D, 0x17, 0xCB, 0x151,
0x71, 0x43, 0xF7, 0x125, 0x9D, 0x17, 0xCB, 0x151, 0x71, 0x43, 0xF7, 0x125, 0x9D,
0x17, 0xCB, 0x151, 0x71, 0x43, 0xF7, 0x125, 0x9D, 0x17, 0xCB, 0x151, 0x71, 0x43,
0xF7, 0x125, 0x9D, 0x17, 0xCB, 0x151, 0x71, 0x43, 0xF7, 0x125, 0x9C, 0x18, 0xCC,
0x150, 0x72, 0x42, 0xF6, 0x126, 0x9C, 0x18, 0xCC, 0x150, 0x72, 0x42, 0xF6, 0x126,
0x9C, 0x18, 0xCC, 0x150, 0x72, 0x42, 0xF6, 0x126, 0x9C, 0x18, 0xCC, 0x150, 0x72,
0x42, 0xF6, 0x126, 0x9C, 0x18, 0xCC, 0x150, 0x72, 0x42, 0xF6, 0x126, 0x9B, 0x19,
0xCD, 0x14F, 0x73, 0x41, 0xF5, 0x127, 0x9B, 0x19, 0xCD, 0x14F, 0x73, 0x41, 0xF5,
0x127, 0x9B, 0x19, 0xCD, 0x14F, 0x73, 0x41, 0xF5, 0x127, 0x9B, 0x19, 0xCD, 0x14F,
0x73, 0x41, 0xF5, 0x127, 0x9B, 0x19, 0xCD, 0x14F, 0x73, 0x41, 0xF5, 0x127, 0x9A,
0x1A, 0xCE, 0x14E, 0x74, 0x40, 0xF4, 0x128, 0x9A, 0x1A, 0xCE, 0x14E, 0x74, 0x40,
0xF4, 0x128, 0x9A, 0x1A, 0xCE, 0x14E, 0x74, 0x40, 0xF4, 0x128, 0x9A, 0x1A, 0xCE,
0x14E, 0x74, 0x40, 0xF4, 0x128, 0x9A, 0x1A, 0xCE, 0x14E, 0x74, 0x40, 0xF4, 0x128,
0x9A, 0x1A, 0xCE, 0x14E, 0x74, 0x40, 0xF4, 0x128, 0x99, 0x1B, 0xCF, 0x14D, 0x75,
0x3F, 0xF3, 0x129, 0x99, 0x1B, 0xCF, 0x14D, 0x75, 0x3F, 0xF3, 0x129, 0x99, 0x1B,
0xCF, 0x14D, 0x75, 0x3F, 0xF3, 0x129, 0x99, 0x1B, 0xCF, 0x14D, 0x75, 0x3F, 0xF3,
0x129, 0x99, 0x1B, 0xCF, 0x14D, 0x75, 0x3F, 0xF3, 0x129, 0x99, 0x1B, 0xCF, 0x14D,
0x75, 0x3F, 0xF3, 0x129, 0x98, 0x1C, 0xD0, 0x14C, 0x76, 0x3E, 0xF2, 0x12A, 0x98,
0x1C, 0xD0, 0x14C, 0x76, 0x3E, 0xF2, 0x12A, 0x98, 0x1C, 0xD0, 0x14C, 0x76, 0x3E,
0xF2, 0x12A, 0x98, 0x1C, 0xD0, 0x14C, 0x76, 0x3E, 0xF2, 0x12A, 0x98, 0x1C, 0xD0,
0x14C, 0x76, 0x3E, 0xF2, 0x12A, 0x97, 0x1D, 0xD1, 0x14B, 0x77, 0x3D, 0xF1, 0x12B,
0x97, 0x1D, 0xD1, 0x14B, 0x77, 0x3D, 0xF1, 0x12B, 0x97, 0x1D, 0xD1, 0x14B, 0x77,
0x3D, 0xF1, 0x12B, 0x97, 0x1D, 0xD1, 0x14B, 0x77, 0x3D, 0xF1, 0x12B, 0x97, 0x1D,
0xD1, 0x14B, 0x77, 0x3D, 0xF1, 0x12B, 0x97, 0x1D, 0xD1, 0x14B, 0x77, 0x3D, 0xF1,
0x12B, 0x96, 0x1E, 0xD2, 0x14A, 0x78, 0x3C, 0xF0, 0x12C, 0x96, 0x1E, 0xD2, 0x14A,
0x78, 0x3C, 0xF0, 0x12C, 0x96, 0x1E, 0xD2, 0x14A, 0x78, 0x3C, 0xF0, 0x12C, 0x96,
0x1E, 0xD2, 0x14A, 0x78, 0x3C, 0xF0, 0x12C, 0x96, 0x1E, 0xD2, 0x14A, 0x78, 0x3C,
0xF0, 0x12C, 0x96, 0x1E, 0xD2, 0x14A, 0x78, 0x3C, 0xF0, 0x12C, 0x95, 0x1F, 0xD3,
0x149, 0x79, 0x3B, 0xEF, 0x12D, 0x95, 0x1F, 0xD3, 0x149, 0x79, 0x3B, 0xEF, 0x12D,
0x95, 0x1F, 0xD3, 0x149, 0x79, 0x3B, 0xEF, 0x12D, 0x95, 0x1F, 0xD3, 0x149, 0x79,
0x3B, 0xEF, 0x12D, 0x95, 0x1F, 0xD3, 0x149, 0x79, 0x3B, 0xEF, 0x12D, 0x95, 0x1F,
0xD3, 0x149, 0x79, 0x3B, 0xEF, 0x12D, 0x94, 0x20, 0xD4, 0x148, 0x7A, 0x3A, 0xEE,
0x12E, 0x94, 0x20, 0xD4, 0x148, 0x7A, 0x3A, 0xEE, 0x12E, 0x94, 0x20, 0xD4, 0x148,
0x7A, 0x3A, 0xEE, 0x12E, 0x94, 0x20, 0xD4, 0x148, 0x7A, 0x3A, 0xEE, 0x12E, 0x94,
0x20, 0xD4, 0x148, 0x7A, 0x3A, 0xEE, 0x12E, 0x94, 0x20, 0xD4, 0x148, 0x7A, 0x3A,
0xEE, 0x12E, 0x94, 0x20, 0xD4, 0x148, 0x7A, 0x3A, 0xEE, 0x12E, 0x93, 0x21, 0xD5,
0x147, 0x7B, 0x39, 0xED, 0x12F, 0x93, 0x21, 0xD5, 0x147, 0x7B, 0x39, 0xED, 0x12F,
0x93, 0x21, 0xD5, 0x147, 0x7B, 0x39, 0xED, 0x12F, 0x93, 0x21, 0xD5, 0x147, 0x7B,
0x39, 0xED, 0x12F, 0x93, 0x21, 0xD5, 0x147, 0x7B, 0x39, 0xED, 0x12F, 0x93, 0x21,
0xD5, 0x147, 0x7B, 0x39, 0xED, 0x12F, 0x92, 0x22, 0xD6, 0x146, 0x7C, 0x38, 0xEC,
0x130, 0x92, 0x22, 0xD6, 0x146, 0x7C, 0x38, 0xEC, 0x130, 0x92, 0x22, 0xD6, 0x146,
0x7C, 0x38, 0xEC, 0x130, 0x92, 0x22, 0xD6, 0x146, 0x7C, 0x38, 0xEC, 0x130, 0x92,
0x22, 0xD6, 0x146, 0x7C, 0x38, 0xEC, 0x130, 0x92, 0x22, 0xD6, 0x146, 0x7C, 0x38,
0xEC, 0x130, 0x92, 0x22, 0xD6, 0x146, 0x7C, 0x38, 0xEC, 0x130, 0x91, 0x23, 0xD7,
0x145, 0x7D, 0x37, 0xEB, 0x131, 0x91, 0x23, 0xD7, 0x145, 0x7D, 0x37, 0xEB, 0x131,
0x91, 0x23, 0xD7, 0x145, 0x7D, 0x37, 0xEB, 0x131, 0x91, 0x23, 0xD7, 0x145, 0x7D,
0x37, 0xEB, 0x131, 0x91, 0x23, 0xD7, 0x145, 0x7D, 0x37, 0xEB, 0x131, 0x91, 0x23,
0xD7, 0x145, 0x7D, 0x37, 0xEB, 0x131, 0x91, 0x23, 0xD7, 0x145, 0x7D, 0x37, 0xEB,
0x131, 0x90, 0x24, 0xD8, 0x144, 0x7E, 0x36, 0xEA, 0x132, 0x90, 0x24, 0xD8, 0x144,
0x7E, 0x36, 0xEA, 0x132, 0x90, 0x24, 0xD8, 0x144, 0x7E, 0x36, 0xEA, 0x132, 0x90,
0x24, 0xD8, 0x144, 0x7E, 0x36, 0xEA, 0x132, 0x90, 0x24, 0xD8, 0x144, 0x7E, 0x36,
0xEA, 0x132, 0x90, 0x24, 0xD8, 0x144, 0x7E, 0x36, 0xEA, 0x132, 0x8F, 0x25, 0xD9,
0x143, 0x7F, 0x35, 0xE9, 0x133, 0x8F, 0x25, 0xD9, 0x143, 0x7F, 0x35, 0xE9, 0x133,
0x8F, 0x25, 0xD9, 0x143, 0x7F, 0x35, 0xE9, 0x133, 0x8F, 0x25, 0xD9, 0x143, 0x7F,
0x35, 0xE9, 0x133, 0x8F, 0x25, 0xD9, 0x143, 0x7F, 0x35, 0xE9, 0x133, 0x8F, 0x25,
0xD9, 0x143, 0x7F, 0x35, 0xE9, 0x133, 0x8F, 0x25, 0xD9, 0x143, 0x7F, 0x35, 0xE9,
0x133, 0x8F, 0x25, 0xD9, 0x143, 0x7F, 0x35, 0xE9, 0x133, 0x8E, 0x26, 0xDA, 0x142,
0x80, 0x34, 0xE8, 0x134, 0x8E, 0x26, 0xDA, 0x142, 0x80, 0x34, 0xE8, 0x134, 0x8E,
0x26, 0xDA, 0x142, 0x80, 0x34, 0xE8, 0x134, 0x8E, 0x26, 0xDA, 0x142, 0x80, 0x34,
0xE8, 0x134, 0x8E, 0x26, 0xDA, 0x142, 0x80, 0x34, 0xE8, 0x134, 0x8E, 0x26, 0xDA,
0x142, 0x80, 0x34, 0xE8, 0x134, 0x8E, 0x26, 0xDA, 0x142, 0x80, 0x34, 0xE8, 0x134,
0x8D, 0x27, 0xDB, 0x141, 0x81, 0x33, 0xE7, 0x135, 0x8D, 0x27, 0xDB, 0x141, 0x81,
0x33, 0xE7, 0x135, 0x8D, 0x27, 0xDB, 0x141, 0x81, 0x33, 0xE7, 0x135, 0x8D, 0x27,
0xDB, 0x141, 0x81, 0x33, 0xE7, 0x135, 0x8D, 0x27, 0xDB, 0x141, 0x81, 0x33, 0xE7,
0x135, 0x8D, 0x27, 0xDB, 0x141, 0x81, 0x33, 0xE7, 0x135, 0x8D, 0x27, 0xDB, 0x141,
0x81, 0x33, 0xE7, 0x135, 0x8C, 0x28, 0xDC, 0x140, 0x82, 0x32, 0xE6, 0x136, 0x8C,
0x28, 0xDC, 0x140, 0x82, 0x32, 0xE6, 0x136, 0x8C, 0x28, 0xDC, 0x140, 0x82, 0x32,
0xE6, 0x136, 0x8C, 0x28, 0xDC, 0x140, 0x82, 0x32, 0xE6, 0x136, 0x8C, 0x28, 0xDC,
0x140, 0x82, 0x32, 0xE6, 0x136, 0x8C, 0x28, 0xDC, 0x140, 0x82, 0x32, 0xE6, 0x136,
0x8C, 0x28, 0xDC, 0x140, 0x82, 0x32, 0xE6, 0x136, 0x8C, 0x28, 0xDC, 0x140, 0x82,
0x32, 0xE6, 0x136, 0x8B, 0x29, 0xDD, 0x13F, 0x83, 0x31, 0xE5, 0x137, 0x8B, 0x29,
0xDD, 0x13F, 0x83, 0x31, 0xE5, 0x137, 0x8B, 0x29, 0xDD, 0x13F, 0x83, 0x31, 0xE5,
0x137, 0x8B, 0x29, 0xDD, 0x13F, 0x83, 0x31, 0xE5, 0x137, 0x8B, 0x29, 0xDD, 0x13F,
0x83, 0x31, 0xE5, 0x137, 0x8B, 0x29, 0xDD, 0x13F, 0x83, 0x31, 0xE5, 0x137, 0x8B,
0x29, 0xDD, 0x13F, 0x83, 0x31, 0xE5, 0x137, 0x8B, 0x29, 0xDD, 0x13F, 0x83, 0x31,
0xE5, 0x137, 0x8A, 0x2A, 0xDE, 0x13E, 0x84, 0x30, 0xE4, 0x138, 0x8A, 0x2A, 0xDE,
0x13E, 0x84, 0x30, 0xE4, 0x138, 0x8A, 0x2A, 0xDE, 0x13E, 0x84, 0x30, 0xE4, 0x138,
0x8A, 0x2A, 0xDE, 0x13E, 0x84, 0x30, 0xE4, 0x138, 0x8A, 0x2A, 0xDE, 0x13E, 0x84,
0x30, 0xE4, 0x138, 0x8A, 0x2A, 0xDE, 0x13E, 0x84, 0x30, 0xE4, 0x138, 0x8A, 0x2A,
0xDE, 0x13E, 0x84, 0x30, 0xE4, 0x138, 0x8A, 0x2A, 0xDE, 0x13E, 0x84, 0x30, 0xE4,
0x138, 0x89, 0x2B, 0xDF, 0x13D, 0x85, 0x2F, 0xE3, 0x139, 0x89, 0x2B, 0xDF, 0x13D,
0x85, 0x2F, 0xE3, 0x139, 0x89, 0x2B, 0xDF, 0x13D, 0x85, 0x2F, 0xE3, 0x139, 0x89,
0x2B, 0xDF, 0x13D, 0x85, 0x2F, 0xE3, 0x139, 0x89, 0x2B, 0xDF, 0x13D, 0x85, 0x2F,
0xE3, 0x139, 0x89, 0x2B, 0xDF, 0x13D, 0x85, 0x2F, 0xE3, 0x139, 0x89, 0x2B, 0xDF,
0x13D, 0x85, 0x2F, 0xE3, 0x139, 0x89, 0x2B, 0xDF, 0x13D, 0x85, 0x2F, 0xE3, 0x139,
0x89, 0x2B, 0xDF, 0x13D, 0x85, 0x2F, 0xE3, 0x139, 0x88, 0x2C, 0xE0, 0x13C, 0x86,
0x2E, 0xE2, 0x13A, 0x88, 0x2C, 0xE0, 0x13C, 0x86, 0x2E, 0xE2, 0x13A, 0x88, 0x2C,
0xE0, 0x13C, 0x86, 0x2E, 0xE2, 0x13A, 0x88, 0x2C, 0xE0, 0x13C, 0x86, 0x2E, 0xE2,
0x13A, 0x88, 0x2C, 0xE0, 0x13C, 0x86, 0x2E, 0xE2, 0x13A, 0x88, 0x2C, 0xE0, 0x13C,
0x86, 0x2E, 0xE2, 0x13A, 0x88, 0x2C, 0xE0, 0x13C, 0x86, 0x2E, 0xE2, 0x13A, 0x88,
0x2C, 0xE0, 0x13C, 0x86, 0x2E, 0xE2, 0x13A, 0x87, 0x2D, 0xE1, 0x13B, 0x87, 0x2D,
0xE1, 0x13B,
};
s32 CalculateAngle(s32* trans, u32 fo_curve, u32 param_3) {
u32 uVar2;
int iVar3;
u32 uVar4;
u32 uVar5;
int iVar6;
int iVar7;
u32 uVar8;
ASSERT(fo_curve < 0x29);
WaitSema(g_EarTransSema);
if (unktable[fo_curve] != 0) {
if (unktable[fo_curve + 0x2c] == 0) {
if (unktable[fo_curve + 0x58] != 0) {
trans = gEarTrans + 3;
}
iVar6 = trans[1];
iVar3 = gCamTrans[0] - *trans;
iVar7 = gCamTrans[2] - trans[2];
} else {
iVar7 = gCamForward[0] - gCamTrans[0];
iVar3 = gCamTrans[2] - gCamForward[2];
iVar6 = gCamForward[1];
}
iVar6 = gCamTrans[1] - iVar6;
if (((iVar3 + 0x200168U | iVar6 + 0x200168U | iVar7 + 0x200168U) & 0xffc00000) != 0) {
if (iVar3 < 0) {
iVar3 = iVar3 + 0x3ff;
}
iVar3 = iVar3 >> 10;
if (iVar6 < 0) {
iVar6 = iVar6 + 0x3ff;
}
iVar6 = iVar6 >> 10;
if (iVar7 < 0) {
iVar7 = iVar7 + 0x3ff;
}
iVar7 = iVar7 >> 10;
}
uVar8 = iVar3 * gCamLeft[0] + iVar6 * gCamLeft[1] + iVar7 * gCamLeft[2];
uVar5 = uVar8;
if ((int)uVar8 < 0) {
uVar5 = -uVar8;
}
uVar2 = iVar3 * gCamForward[0] + iVar6 * gCamForward[1] + iVar7 * gCamForward[2];
uVar4 = uVar2;
if ((int)uVar2 < 0) {
uVar4 = -uVar2;
}
if ((0x1ffff < (int)uVar5) || (0x1ffff < (int)uVar4)) {
uVar4 = (int)uVar4 >> 8;
uVar5 = (int)uVar5 >> 8;
}
if ((uVar4 != 0) || (uVar5 != 0)) {
uVar8 = (uVar8 & 0x80000000) >> 0x1e | uVar2 >> 0x1f;
if ((int)uVar4 < (int)uVar5) {
if (uVar5 == 0) {
ASSERT_NOT_REACHED();
}
uVar8 = uVar8 | (int)(uVar4 << 8) / (int)uVar5 << 3 | 4;
} else {
if (uVar4 == 0) {
ASSERT_NOT_REACHED();
}
uVar8 = uVar8 | (int)(uVar5 << 8) / (int)uVar4 << 3;
}
ASSERT(uVar8 < 2056);
iVar3 = (int)(short)unk_table_2[uVar8];
iVar6 = iVar3;
if (((param_3 != 0) && (iVar6 = iVar3, g_CameraInvert != 0)) && (iVar6 = 0, iVar3 != 0)) {
iVar6 = 0x168 - iVar3;
}
SignalSema(g_EarTransSema);
return iVar6;
}
}
SignalSema(g_EarTransSema);
return 0;
}
s32 GetVolume(SoundInfo* sound) {
return CalculateFalloffVolume(sound->params.trans, sound->params.volume, sound->params.fo_curve,
sound->params.fo_min, sound->params.fo_max, nullptr, nullptr);
}
s32 GetPan(SoundInfo* sound) {
return CalculateAngle(sound->params.trans, sound->params.fo_curve, 1);
}
void UpdateLocation(SoundInfo* sound) {
auto handle = snd_SoundIsStillPlaying(sound->sound_handle);
sound->sound_handle = handle;
if (handle == 0) {
sound->id = 0;
} else {
auto vol = GetVolume(sound);
if (vol == 0 && unktable[(int)(sound->params).fo_curve + 0xb0] == 0) {
snd_StopSound(sound->sound_handle);
} else {
auto pan = GetPan(sound);
// ovrld_log(LogCategory::WARN, "HACK: falling back to old version of setting vol/pan");
snd_SetSoundVolPan(handle, vol, pan);
// FUN_00013e0c(handle,4,0,pan,0,0);
// if ((short)(sound->params).mask < 0) {
// FUN_00013d6c(handle,vol,0x40);
// }
// else {
// snd_SetSoundVolPan(handle,vol,0xfffffffe,4);
// }
}
}
}
void UpdateAutoVol(SoundInfo* snd, int time) {
bool bVar1;
auto iVar6 = snd->auto_time;
auto iVar4 = snd->new_volume;
if (time < iVar6) {
auto iVar5 = iVar4;
if (iVar4 == -4) {
iVar5 = 0;
}
auto vol = (snd->params).volume;
int new_vol;
if (iVar6 == 0) {
ASSERT_NOT_REACHED();
}
iVar5 = ((iVar5 - vol) * time) / iVar6;
if (iVar5 < 0) {
new_vol = vol + iVar5;
bVar1 = new_vol < iVar4;
} else {
new_vol = vol + iVar5;
if (iVar5 < 1) {
new_vol = vol + 1;
}
bVar1 = iVar4 < new_vol;
}
(snd->params).volume = new_vol;
if (bVar1) {
(snd->params).volume = iVar4;
}
snd->auto_time = iVar6 - time;
} else {
if (iVar4 == -4) {
snd_StopSound(snd->sound_handle);
snd->id = 0;
} else {
(snd->params).volume = iVar4;
}
snd->auto_time = 0;
}
}
void UpdateVolume(SoundInfo* sound) {
auto handle = snd_SoundIsStillPlaying(sound->sound_handle);
sound->sound_handle = handle;
if (handle == 0) {
sound->id = 0;
} else {
if ((s16)(sound->params).mask < 0) {
// idk
snd_SetSoundVolPan(handle, GetVolume(sound), -2);
// FUN_00013d6c(handle, GetVolume(sound), 0x40, 4);
} else {
snd_SetSoundVolPan(handle, GetVolume(sound), -2);
}
}
}
void SetEarTrans(const s32* ear_trans0,
const s32* ear_trans1,
const s32* cam_trans,
const s32* cam_fwd,
const s32* cam_left,
s32 cam_scale,
bool cam_inverted) {
auto tick = snd_GetTick();
auto time = tick - gLastTick;
gLastTick = tick;
WaitSema(g_EarTransSema);
gEarTrans[0] = *ear_trans0;
g_CameraInvert = cam_inverted;
gEarTrans[1] = ear_trans0[1];
gEarTrans[2] = ear_trans0[2];
gEarTrans[3] = *ear_trans1;
gEarTrans[4] = ear_trans1[1];
gEarTrans[5] = ear_trans1[2];
gCamTrans[0] = *cam_trans;
gCamTrans[1] = cam_trans[1];
gCamTrans[2] = cam_trans[2];
gCamForward[0] = *cam_fwd;
gCamForward[1] = cam_fwd[1];
gCamForward[2] = cam_fwd[2];
gCamLeft[0] = *cam_left;
gCamLeft[1] = cam_left[1];
gCamLeft[2] = cam_left[2];
gCamScale = cam_scale;
SignalSema(g_EarTransSema);
for (auto& sound : gSounds) {
if (sound.id) {
if (sound.auto_time) {
UpdateAutoVol(&sound, time);
}
UpdateLocation(&sound);
}
}
auto* cmd = g_aVagCmds;
s32 iVar2 = 5;
do {
if ((cmd->music_flag == 0) && (cmd->maybe_sound_handler != 0)) {
if ((cmd->flags.scanned == 0) || (cmd->flags.bit8 != 0)) {
if (cmd->flags.bit20 == 0) {
if ((u32)cmd->play_volume < 0x11) {
cmd->play_volume = 0;
} else {
cmd->play_volume = cmd->play_volume - 0x10;
}
SetVAGVol(cmd);
if (cmd->play_volume != 0)
goto LAB_0000db94;
}
LAB_0000db78:
StopVagStream(cmd);
} else {
time = snd_SoundIsStillPlaying(cmd->id);
if (time != 0)
goto LAB_0000db88;
if (cmd->flags.bit20 != 0)
goto LAB_0000db78;
// CpuSuspendIntr(local_28);
cmd->flags.bit8 = 1;
// CpuResumeIntr(local_28[0]);
}
} else {
LAB_0000db88:
SetVAGVol(cmd);
}
LAB_0000db94:
iVar2 = iVar2 + -1;
cmd = cmd + 1;
if (iVar2 < 0) {
return;
}
} while (true);
}
void SetCurve(int param_1,
u32 param_2,
u32 param_3,
uint8_t param_4,
uint8_t param_5,
uint8_t param_6,
uint8_t param_7,
uint8_t param_8) {
gCurves[param_1].c = (param_3 - param_2) + -0x1000;
gCurves[param_1].d = 0x1000;
unktable[param_1 + 0xb0] = param_8;
gCurves[param_1].b = param_2 + param_3 * -3;
unktable[param_1] = param_4;
unktable[param_1 + 0x2c] = param_5;
unktable[param_1 + 0x58] = param_6;
unktable[param_1 + 0x84] = param_7;
gCurves[param_1].a = param_3 * 2;
}
void SetPlaybackMode(s32 mode) {
g_nPlaybackMode = mode;
snd_SetPlayBackMode(mode);
}
} // namespace jak3