REDRIVER2/src_rebuild/GAME/C/GAMESND.C
Ilya Shurumov c40d40bd22 - added sources rebuilt with TDR and partially decompiled intro sequence
- moved necessary data to new sources
- running intro with TOMB5 HLE emulator
2020-03-28 03:25:35 +06:00

4091 lines
92 KiB
C

#include "THISDUST.H"
#include "GAMESND.H"
#include "LIBSPU.H"
#include "SOUND.H"
typedef void(*envsoundfunc)(struct __envsound *ep /*$s1*/, struct __envsoundinfo *E /*$a1*/, int pl /*$a2*/);
void IdentifyZone(struct __envsound *ep, struct __envsoundinfo *E, int pl);
void CalcEffPos(struct __envsound *ep, struct __envsoundinfo *E, int pl);
void CalcEffPos2(struct __envsound *ep, struct __envsoundinfo *E, int pl);
void UpdateEnvSnd(struct __envsound *ep, struct __envsoundinfo *E, int pl);
static envsoundfunc UpdateEnvSounds[] = {
IdentifyZone,
CalcEffPos,
CalcEffPos2,
UpdateEnvSnd
};
GEAR_DESC geard[2][4] =
{
{
{ 0, 0, 163, 144, 135 },
{ 86, 133, 260, 90, 85 },
{ 186, 233, 360, 60, 57 },
{ 286, 326, 9999, 48, 45 }
},
{
{ 0, 0, 50, 144, 135 },
{ 43, 66, 100, 90, 85 },
{ 93, 116, 150, 60, 57 },
{ 143, 163, 9999, 48, 45 }
}
};
// XM song position
int coptrackpos[8] = {
0x10, 0xB, 7, 0x12, 0xC, 9, 8, 0xA,
};
// decompiled code
// original method signature:
// void /*$ra*/ LoadBankFromLump(int bank /*$s3*/, int lump /*$s2*/)
// line 98, offset 0x00052460
/* begin block 1 */
// Start line: 99
// Start offset: 0x00052460
// Variables:
// static unsigned int blockLimit[73]; // offset 0x10
// int size; // $s0
// char *name; // $s1
/* end block 1 */
// End offset: 0x00052510
// End Line: 119
/* begin block 2 */
// Start line: 4241
/* end block 2 */
// End Line: 4242
/* begin block 3 */
// Start line: 196
/* end block 3 */
// End Line: 197
void LoadBankFromLump(int bank, int lump)
{
UNIMPLEMENTED();
/*
int loadsize;
if (DAT_0009ee0c == 0) {
LoadfileSeg(s_SOUND_VOICES2_BLK_00010ab8, &DAT_0009ee08, 0, 0x124);
}
loadsize = *(int *)(&DAT_0009ee08 + (lump + 1) * 4) - *(int *)(&DAT_0009ee08 + lump * 4);
LoadfileSeg(s_SOUND_VOICES2_BLK_00010ab8, &DAT_80180000, *(int *)(&DAT_0009ee08 + lump * 4), loadsize
);
LoadSoundBankDynamic(&DAT_80180000, loadsize, bank);
return;
*/
}
// decompiled code
// original method signature:
// int /*$ra*/ CarHasSiren(int index /*$a0*/)
// line 127, offset 0x000522ec
/* begin block 1 */
// Start line: 254
/* end block 1 */
// End Line: 255
/* begin block 2 */
// Start line: 2853
/* end block 2 */
// End Line: 2854
int CarHasSiren(int index)
{
UNIMPLEMENTED();
return 0;
/*
int iVar1;
int iVar2;
int *piVar3;
if (index == 4) {
if (GameLevel == 2) {
iVar2 = MissionHeader->residentModels[4];
iVar1 = 9;
}
else {
if (GameLevel < 3) {
if (GameLevel != 0) {
piVar3 = &MissionHeader->weather;
goto LAB_00052374;
}
iVar2 = MissionHeader->residentModels[4];
iVar1 = 8;
}
else {
if (GameLevel != 3) {
piVar3 = &MissionHeader->weather;
goto LAB_00052374;
}
iVar2 = MissionHeader->residentModels[4];
iVar1 = 10;
}
}
if (iVar2 == iVar1) {
return 0x110;
}
}
piVar3 = &MissionHeader->id + index;
LAB_00052374:
return (uint)(piVar3[0x18] == 0) << 9;*/
}
// decompiled code
// original method signature:
// int /*$ra*/ SpecialVehicleKludge(char vehicle2 /*$a0*/)
// line 161, offset 0x00052510
/* begin block 1 */
// Start line: 162
// Start offset: 0x00052510
// Variables:
// static char kludge_bank[4][3]; // offset 0x134
/* end block 1 */
// End offset: 0x00052540
// End Line: 169
/* begin block 2 */
// Start line: 4346
/* end block 2 */
// End Line: 4347
/* begin block 3 */
// Start line: 4389
/* end block 3 */
// End Line: 4390
int SpecialVehicleKludge(char vehicle2)
{
static char kludge_bank[4][3] = {
{ 2, 18, 10 },
{ 2, 17, 4 },
{ 9, 11, 13 },
{ 17, 11, 15 }
};
return (int)kludge_bank[vehicle2 + GameLevel * 3];
}
// decompiled code
// original method signature:
// int /*$ra*/ ResidentModelsBodge()
// line 171, offset 0x0004d690
/* begin block 1 */
// Start line: 172
// Start offset: 0x0004D690
// Variables:
// int i; // $a1
// int j; // $a2
/* end block 1 */
// End offset: 0x0004D784
// End Line: 183
/* begin block 2 */
// Start line: 342
/* end block 2 */
// End Line: 343
/* begin block 3 */
// Start line: 344
/* end block 3 */
// End Line: 345
/* WARNING: Unknown calling convention yet parameter storage is locked */
int ResidentModelsBodge(void)
{
UNIMPLEMENTED();
return 0;
/*
int iVar1;
int iVar2;
iVar2 = MissionHeader->residentModels[4];
if ((((gCurrentMissionNumber == 0x18) || (gCurrentMissionNumber == 0x1b)) ||
(gCurrentMissionNumber == 0x1d)) ||
((gCurrentMissionNumber == 0x1e || (gCurrentMissionNumber == 0x23)))) {
return 3;
}
if ((gCurrentMissionNumber - 0x32U < 0x10) && (iVar2 == 0xc)) {
return 5;
}
if (GameLevel == 1) {
if (1 < iVar2 - 8U) {
return 3;
}
}
else {
if (GameLevel < 2) {
if (GameLevel != 0) {
return 3;
}
iVar1 = 0xb;
if (iVar2 == 9) {
return 4;
}
}
else {
if (GameLevel == 2) {
iVar1 = 8;
}
else {
if (GameLevel != 3) {
return 3;
}
iVar1 = 0xb;
}
}
if (iVar2 != iVar1) {
return 3;
}
}
return 4;*/
}
// decompiled code
// original method signature:
// int /*$ra*/ MapCarIndexToBank(int index /*$a1*/)
// line 197, offset 0x00052540
/* begin block 1 */
// Start line: 198
// Start offset: 0x00052540
// Variables:
// int *RM; // $a2
// static char car_banks[4][9]; // offset 0x140
/* end block 1 */
// End offset: 0x000525F8
// End Line: 219
/* begin block 2 */
// Start line: 4432
/* end block 2 */
// End Line: 4433
/* begin block 3 */
// Start line: 4461
/* end block 3 */
// End Line: 4462
/* begin block 4 */
// Start line: 4472
/* end block 4 */
// End Line: 4473
int MapCarIndexToBank(int index)
{
UNIMPLEMENTED();
return 0;
/*
int iVar1;
int iVar2;
iVar1 = MissionHeader->residentModels[index];
if ((gCurrentMissionNumber - 0x27U < 2) && (iVar1 == 0xd)) {
iVar2 = 10 - (MissionHeader->residentModels[0] + MissionHeader->residentModels[1] +
MissionHeader->residentModels[2]);
iVar1 = iVar2;
if (iVar2 < 1) {
iVar1 = 1;
}
if (4 < iVar2) {
iVar1 = 4;
}
}
iVar2 = iVar1 + -1;
if (iVar1 == 0) {
iVar2 = 1;
}
if (6 < iVar2) {
iVar2 = iVar2 + -3;
}
return (uint)*(byte *)(iVar2 + GameLevel * 9 + 0x9ef38);
*/
}
// decompiled code
// original method signature:
// void /*$ra*/ LoadLevelSFX(int missionNum /*$s1*/)
// line 228, offset 0x0004d784
/* begin block 1 */
// Start line: 229
// Start offset: 0x0004D784
// Variables:
// char city_night_fx; // $s2
// int i; // $s0
/* begin block 1.1 */
// Start line: 266
// Start offset: 0x0004DAD8
// Variables:
// int mission; // $a1
/* end block 1.1 */
// End offset: 0x0004DC70
// End Line: 269
/* end block 1 */
// End offset: 0x0004DE30
// End Line: 295
/* begin block 2 */
// Start line: 414
/* end block 2 */
// End Line: 415
/* begin block 3 */
// Start line: 460
/* end block 3 */
// End Line: 461
void LoadLevelSFX(int missionNum)
{
UNIMPLEMENTED();
/*
int lump;
uint uVar1;
int index;
int *piVar2;
uint uVar3;
uVar3 = (uint)(gTimeOfDay == 3);
index = missionNum;
if (missionNum < 0) {
index = missionNum + 3;
}
cop_bank = (char)missionNum + (char)(index >> 2) * -4 + '\x01';
cop_model = '\x03';
LoadSoundBankDynamic((char *)0x0, 0, 0);
index = 0;
do {
lump = MapCarIndexToBank(index);
LoadBankFromLump(3, lump);
index = index + 1;
} while (index < 3);
ShowLoading();
LoadBankFromLump(1, 0);
LoadBankFromLump(1, 1);
LoadBankFromLump(6, 0x42);
if ((GameLevel & 2U) == 0) {
uVar1 = GameLevel & 3;
}
else {
uVar1 = (GameLevel & 1U) << 1;
}
LoadBankFromLump(2, uVar1 + 0x45);
if (((((3 < missionNum - 1U) && (missionNum != 6)) && (missionNum != 7)) &&
(((missionNum != 9 && (missionNum != 10)) &&
((missionNum != 0xb && ((missionNum != 0xd && (missionNum != 0xe)))))))) &&
(((missionNum != 0x12 &&
((((missionNum != 0x13 && (missionNum != 0x14)) && (missionNum != 0x16)) &&
((missionNum != 0x1a && (missionNum != 0x1c)))))) &&
((((missionNum != 0x1f && ((missionNum != 0x21 && (missionNum != 0x22)))) &&
(missionNum != 0x26)) && (missionNum != 0x28)))))) {
if ((GameLevel & 2U) == 0) {
uVar1 = GameLevel & 3;
index = uVar1 << 2;
}
else {
uVar1 = (GameLevel & 1U) << 1;
index = (GameLevel & 1U) << 3;
}
LoadBankFromLump(2, index + uVar1 + 0x1d);
if ((GameLevel & 2U) == 0) {
index = (GameLevel & 3U) * 5 + (uint)(byte)cop_bank + 0x1d;
}
else {
index = (GameLevel & 1U) * 10 + (uint)(byte)cop_bank + 0x1d;
}
LoadBankFromLump(2, index);
}
ShowLoading();
if ((NumPlayers < 2) || (NoPlayerControl != 0)) {
if (GameLevel == 1) {
LoadBankFromLump(4, uVar3 + 0x17);
}
else {
if (GameLevel < 2) {
if (GameLevel == 0) {
LoadBankFromLump(4, uVar3 + 0x15);
}
}
else {
if (GameLevel == 2) {
LoadBankFromLump(4, uVar3 + 0x19);
}
else {
if (GameLevel == 3) {
LoadBankFromLump(4, uVar3 + 0x1b);
}
}
}
}
}
phrase_top = '\0';
if ((((missionNum - 2U < 3) || (missionNum == 9)) || (missionNum == 10)) || (missionNum == 0x1b))
{
LoadBankFromLump(5, 0x14);
phrase_top = '\a';
}
if (((missionNum - 0x14U < 2) || (missionNum == 0x19)) || (missionNum == 0x27)) {
LoadBankFromLump(5, 0x13);
phrase_top = '\x03';
}
if (missionNum == 2) {
index = 0x2d;
goto LAB_0004dc60;
}
if (missionNum == 3) {
index = 0x2e;
goto LAB_0004dc60;
}
if (missionNum == 4) {
index = 0x2f;
goto LAB_0004dc60;
}
if (missionNum == 10) {
index = 0x30;
goto LAB_0004dc60;
}
if (missionNum != 0xb) {
if (missionNum == 0xd) {
index = 0x32;
goto LAB_0004dc60;
}
if ((missionNum == 0xf) || (missionNum == 0x10)) {
index = 0x33;
goto LAB_0004dc60;
}
if (missionNum == 0x12) {
index = 0x34;
goto LAB_0004dc60;
}
if ((missionNum != 0x14) && (missionNum != 0x15)) {
if (missionNum == 0x16) {
index = 0x35;
goto LAB_0004dc60;
}
if (missionNum == 0x17) {
index = 0x36;
goto LAB_0004dc60;
}
if (missionNum == 0x18) {
index = 0x37;
goto LAB_0004dc60;
}
if (missionNum != 0x19) {
if (missionNum == 0x1b) {
index = 0x38;
goto LAB_0004dc60;
}
if (missionNum == 0x1d) {
index = 0x39;
goto LAB_0004dc60;
}
if (missionNum == 0x1e) {
index = 0x3a;
goto LAB_0004dc60;
}
if (missionNum != 0x20) {
if (missionNum == 0x21) {
index = 0x3c;
goto LAB_0004dc60;
}
if (missionNum == 0x23) {
index = 0x3d;
goto LAB_0004dc60;
}
if (missionNum == 0x27) {
index = 0x3e;
goto LAB_0004dc60;
}
if (missionNum == 0x28) {
index = 0x3f;
goto LAB_0004dc60;
}
if ((missionNum != 0x34) && (missionNum != 0x35)) {
if ((missionNum == 0x36) || (missionNum == 0x37)) {
index = 0x41;
goto LAB_0004dc60;
}
if ((missionNum != 0x38) && (index = 0, missionNum != 0x39)) goto LAB_0004dc60;
}
goto LAB_0004dbc4;
}
}
index = 0x3b;
goto LAB_0004dc60;
}
}
LAB_0004dbc4:
index = 0x31;
LAB_0004dc60:
if (index != 0) {
LoadBankFromLump(5, index);
}
if ((GameLevel == 0) || (GameLevel == 3)) {
LoadBankFromLump(1, 0x43);
}
if (GameLevel == 2) {
LoadBankFromLump(1, 0x44);
}
LoadSoundBankDynamic((char *)0x0, 1, 0);
LoadSoundBankDynamic((char *)0x0, 3, 3);
if (gCurrentMissionNumber - 0x27U < 2) {
index = MapCarIndexToBank(4);
LoadBankFromLump(3, index);
}
else {
index = SpecialVehicleKludge('\0');
LoadBankFromLump(3, index);
}
if ((((missionNum != 0x18) && (missionNum != 0x1b)) && (missionNum != 0x1d)) &&
((missionNum != 0x1e && (missionNum != 0x23)))) {
index = SpecialVehicleKludge('\x01');
LoadBankFromLump(3, index);
}
if (missionNum - 0x32U < 0x10) {
index = SpecialVehicleKludge('\x02');
LoadBankFromLump(3, index);
}
if (((gCurrentMissionNumber == 7) || (gCurrentMissionNumber == 9)) ||
((gCurrentMissionNumber == 0xb ||
((((gCurrentMissionNumber == 0x14 || (gCurrentMissionNumber == 0x1a)) ||
(gCurrentMissionNumber == 0x1f)) ||
((gCurrentMissionNumber == 0x21 || (gCurrentMissionNumber == 0x28)))))))) {
index = 0;
piVar2 = MissionHeader->residentModels;
do {
if (*piVar2 == MissionHeader->residentModels[3]) {
cop_model = (char)index;
}
index = index + 1;
piVar2 = piVar2 + 1;
} while (index < 3);
}
return;*/
}
// decompiled code
// original method signature:
// void /*$ra*/ StartGameSounds()
// line 305, offset 0x0004de30
/* begin block 1 */
// Start line: 307
// Start offset: 0x0004DE30
// Variables:
// struct VECTOR *cp; // $s2
// int i; // $s1
/* begin block 1.1 */
// Start line: 315
// Start offset: 0x0004DE94
// Variables:
// int siren; // $a2
// int car_model; // $s0
/* end block 1.1 */
// End offset: 0x0004E07C
// End Line: 333
/* end block 1 */
// End offset: 0x0004E188
// End Line: 364
/* begin block 2 */
// Start line: 614
/* end block 2 */
// End Line: 615
/* begin block 3 */
// Start line: 625
/* end block 3 */
// End Line: 626
/* begin block 4 */
// Start line: 626
/* end block 4 */
// End Line: 627
/* begin block 5 */
// Start line: 633
/* end block 5 */
// End Line: 634
/* WARNING: Unknown calling convention yet parameter storage is locked */
void StartGameSounds(void)
{
UNIMPLEMENTED();
/*
byte bVar1;
char player;
uint uVar2;
int channel;
uint index;
int iVar3;
int iVar4;
_PLAYER *p_Var5;
int local_2c;
int pitch;
iVar3 = 0;
TimeSinceLastSpeech = 0;
if (NumPlayers != 0) {
p_Var5 = &player;
iVar4 = 0;
do {
bVar1 = car_data[p_Var5->playerCarId].ap.model;
index = (uint)bVar1;
if (bVar1 == 4) {
uVar2 = ResidentModelsBodge();
}
else {
uVar2 = index;
if (2 < bVar1) {
uVar2 = index - 1;
}
}
channel = 1;
if (iVar3 == 0) {
local_2c = 0x3fff;
}
else {
channel = 4;
local_2c = 0x81;
}
Start3DSoundVolPitch
(channel, 3, uVar2 * 3 + 1, car_data[0].hd.where.t[0], car_data[0].hd.where.t[1],
car_data[0].hd.where.t[2], -10000, local_2c);
if (bVar1 == 4) {
channel = ResidentModelsBodge();
channel = channel * 3;
}
else {
if (bVar1 < 3) {
channel = index * 3;
}
else {
channel = (index - 1) * 3;
}
}
local_2c = 0;
if (iVar3 == 0) {
pitch = 0x3fff;
}
else {
local_2c = 3;
pitch = 0x81;
}
Start3DSoundVolPitch
(local_2c, 3, channel, car_data[0].hd.where.t[0], car_data[0].hd.where.t[1],
car_data[0].hd.where.t[2], -10000, pitch);
index = CarHasSiren(index);
if (index != 0) {
channel = 2;
if (iVar3 != 0) {
channel = 5;
}
Start3DSoundVolPitch
(channel, (index & 0xff00) >> 8, index & 0xff, car_data[0].hd.where.t[0],
car_data[0].hd.where.t[1], car_data[0].hd.where.t[2], -10000, 0x81);
}
if ((1 < NumPlayers) && (NoPlayerControl == 0)) {
channel = 0;
if (iVar3 != 0) {
channel = 3;
}
player = (char)iVar3;
SetPlayerOwnsChannel(channel, player);
channel = 1;
if (iVar3 != 0) {
channel = 4;
}
SetPlayerOwnsChannel(channel, player);
channel = 2;
if (iVar3 != 0) {
channel = 5;
}
SetPlayerOwnsChannel(channel, player);
}
*(undefined4 *)((int)&player.crash_timer + iVar4) = 0;
p_Var5->revsvol = -10000;
p_Var5->idlevol = -8000;
p_Var5 = p_Var5 + 1;
iVar3 = iVar3 + 1;
iVar4 = iVar4 + 0x74;
} while (iVar3 < (int)(uint)NumPlayers);
}
if (NumPlayers != 0) {
if (NumPlayers != 1) goto LAB_0004e0dc;
SpuSetVoiceAR(5, 0x1b);
}
SpuSetVoiceAR(2, 0x1b);
LAB_0004e0dc:
if ((NumPlayers < 2) || (NoPlayerControl != 0)) {
InitEnvSnd(0x20);
AddEnvSounds(GameLevel, gTimeOfDay);
}
InitDopplerSFX();
InitSkidding();
AddTunnels(GameLevel);
first_offence = '\x01';
InitializeMissionSound();
return;*/
}
// decompiled code
// original method signature:
// unsigned short /*$ra*/ GetEngineRevs(struct _CAR_DATA *cp /*$t2*/)
// line 404, offset 0x0004e188
/* begin block 1 */
// Start line: 405
// Start offset: 0x0004E188
// Variables:
// int gear; // $a1
// int lastgear; // $a0
// int ws; // $a2
// int acc; // $t1
// int type; // $t0
/* end block 1 */
// End offset: 0x0004E2E8
// End Line: 439
/* begin block 2 */
// Start line: 820
/* end block 2 */
// End Line: 821
/* begin block 3 */
// Start line: 861
/* end block 3 */
// End Line: 862
/* WARNING: Removing unreachable block (ram,0x0004e1b0) */
ushort GetEngineRevs(_CAR_DATA *cp)
{
UNIMPLEMENTED();
return 0;
/*
bool bVar1;
byte bVar2;
short sVar3;
int iVar4;
GEAR_DESC *pGVar5;
uint uVar6;
uint uVar7;
short sVar8;
int iVar9;
int iVar10;
uint uVar11;
bVar2 = (cp->hd).gear;
uVar6 = (uint)bVar2;
iVar9 = (cp->hd).wheel_speed;
sVar3 = cp->thrust;
uVar11 = (uint)(cp->controlType == '\x02');
if (iVar9 < 1) {
iVar10 = -iVar9;
if (0 < iVar9) {
iVar10 = iVar10 + 0x7ff;
}
sVar8 = (short)(iVar10 >> 0xb);
uVar7 = 0;
iVar10 = uVar11 << 2;
(cp->hd).gear = '\0';
}
else {
iVar9 = iVar9 >> 0xb;
sVar8 = (short)iVar9;
if (3 < bVar2) {
uVar6 = 3;
}
iVar10 = uVar11 * 4;
pGVar5 = geard + uVar11 * 4 + uVar6;
do {
if (sVar3 < 1) {
iVar4 = pGVar5->lowidl_ws;
}
else {
iVar4 = pGVar5->low_ws;
}
uVar7 = uVar6;
if (iVar9 < iVar4) {
pGVar5 = pGVar5 + -1;
uVar7 = uVar6 - 1;
}
if (pGVar5->hi_ws < iVar9) {
pGVar5 = pGVar5 + 1;
uVar7 = uVar7 + 1;
}
bVar1 = uVar6 != uVar7;
uVar6 = uVar7;
} while (bVar1);
(cp->hd).gear = (char)uVar7;
}
if (sVar3 == 0) {
return (ushort)(sVar8 * (short)(&geard[uVar7].ratio_id)[(iVar10 + uVar11) * 4]);
}
return (ushort)(sVar8 * (short)(&geard[uVar7].ratio_ac)[(iVar10 + uVar11) * 4]);
*/
}
// decompiled code
// original method signature:
// void /*$ra*/ ControlCarRevs(struct _CAR_DATA *cp /*$s0*/)
// line 458, offset 0x0004e2e8
/* begin block 1 */
// Start line: 459
// Start offset: 0x0004E2E8
// Variables:
// unsigned short oldRevs; // $s2
// unsigned short desiredRevs; // $v1
// unsigned short newRevs; // $a0
// int acc; // $s3
// char spin; // $s4
// char player_id; // $s1
/* begin block 1.1 */
// Start line: 498
// Start offset: 0x0004E414
// Variables:
// int revsmax; // $a3
/* end block 1.1 */
// End offset: 0x0004E4D4
// End Line: 504
/* end block 1 */
// End offset: 0x0004E560
// End Line: 513
/* begin block 2 */
// Start line: 954
/* end block 2 */
// End Line: 955
/* begin block 3 */
// Start line: 974
/* end block 3 */
// End Line: 975
void ControlCarRevs(_CAR_DATA *cp)
{
UNIMPLEMENTED();
/*
ushort uVar1;
int iVar2;
undefined2 extraout_var;
uint uVar3;
short sVar4;
undefined *puVar5;
short sVar6;
char cVar7;
sVar6 = cp->thrust;
cVar7 = cp->wheelspin;
iVar2 = GetPlayerId(cp);
uVar1 = (cp->hd).revs;
puVar5 = (undefined *)(uint)uVar1;
iVar2 = (int)(char)iVar2;
(cp->hd).changingGear = '\0';
if (((cVar7 == '\0') &&
(((cp->hd).wheel[1].susCompression != '\0' || ((cp->hd).wheel[3].susCompression != '\0')))) ||
(sVar6 == 0)) {
uVar1 = GetEngineRevs(cp);
uVar3 = CONCAT22(extraout_var, uVar1);
}
else {
uVar3 = 0x4ec0;
if (((cp->hd).wheel[1].susCompression == '\0') && ((cp->hd).wheel[3].susCompression == '\0')) {
uVar3 = 0x77ff;
cVar7 = '\x01';
}
if (uVar1 < 8000) {
puVar5 = &DAT_00001f40;
}
(cp->hd).gear = '\0';
}
if (maxrevdrop < (int)(puVar5 + -uVar3)) {
sVar6 = 0;
uVar3 = maxrevdrop & 0xffff;
(cp->hd).changingGear = '\x01';
uVar3 = (uint)(puVar5 + -uVar3) & 0xffff;
}
maxrevrise._0_2_ = (short)uVar3;
if (maxrevrise < (int)(uVar3 - (int)puVar5)) {
maxrevrise._0_2_ = (short)puVar5 + (short)maxrevrise;
}
(cp->hd).revs = (short)maxrevrise;
if (-1 < iVar2) {
if ((sVar6 == 0) && ((short)maxrevrise < 0x1b59)) {
sVar6 = (&player)[iVar2].revsvol;
sVar4 = (&player)[iVar2].idlevol + 200;
(&player)[iVar2].idlevol = sVar4;
(&player)[iVar2].revsvol = sVar6 + -200;
if (-6000 < sVar4) {
(&player)[iVar2].idlevol = -6000;
}
if ((&player)[iVar2].revsvol < -10000) {
(&player)[iVar2].revsvol = -10000;
}
}
else {
sVar4 = -0x1a5e;
if (sVar6 != 0) {
sVar4 = -0x157c;
}
if (cVar7 == '\0') {
sVar6 = -0x40;
}
else {
sVar6 = -0x100;
}
(&player)[iVar2].idlevol = (&player)[iVar2].idlevol + sVar6;
if (cVar7 == '\0') {
sVar6 = 0xaf;
}
else {
sVar6 = 700;
}
(&player)[iVar2].revsvol = (&player)[iVar2].revsvol + sVar6;
if ((&player)[iVar2].idlevol < -10000) {
(&player)[iVar2].idlevol = -10000;
}
if (sVar4 < (&player)[iVar2].revsvol) {
(&player)[iVar2].revsvol = sVar4;
}
}
}
return;*/
}
// decompiled code
// original method signature:
// void /*$ra*/ DoSpeech(int chan /*$a0*/, int sound /*$a2*/)
// line 515, offset 0x000525f8
/* begin block 1 */
// Start line: 4824
/* end block 1 */
// End Line: 4825
/* begin block 2 */
// Start line: 5121
/* end block 2 */
// End Line: 5122
void DoSpeech(int chan, int sound)
{
UNIMPLEMENTED();
if (sound < 100) {
if (sound != 0) {
StartSound(chan, 2, sound, -0x5dc, 0x1000);
}
}
else {
StartSound(chan, 5, sound + -100, 0, 0x1000);
}
return;
}
// decompiled code
// original method signature:
// char /*$ra*/ PlaySpeech(struct SPEECH_QUEUE *pSpeechQueue /*$a0*/, int sound /*$a1*/)
// line 562, offset 0x0005228c
/* begin block 1 */
// Start line: 563
// Start offset: 0x0005228C
// Variables:
// char result; // $v0
// int i; // $a2
/* end block 1 */
// End offset: 0x000522EC
// End Line: 583
/* begin block 2 */
// Start line: 1124
/* end block 2 */
// End Line: 1125
/* begin block 3 */
// Start line: 3271
/* end block 3 */
// End Line: 3272
char PlaySpeech(SPEECH_QUEUE *pSpeechQueue, int sound)
{
UNIMPLEMENTED();
int iVar1;
int *piVar2;
int iVar3;
iVar1 = pSpeechQueue->count;
if (iVar1 < 7) {
pSpeechQueue->count = iVar1 + 1;
iVar3 = iVar1 + -1;
if (iVar3 != -1) {
piVar2 = pSpeechQueue->slot + iVar1;
do {
iVar3 = iVar3 + -1;
*piVar2 = piVar2[-1];
piVar2 = piVar2 + -1;
} while (iVar3 != -1);
}
pSpeechQueue->slot[0] = sound;
return '\x01';
}
return '\0';
}
// decompiled code
// original method signature:
// void /*$ra*/ InitSpeechQueue(struct SPEECH_QUEUE *pSpeechQueue /*$s0*/)
// line 587, offset 0x00052654
/* begin block 1 */
// Start line: 5265
/* end block 1 */
// End Line: 5266
void InitSpeechQueue(SPEECH_QUEUE *pSpeechQueue)
{
UNIMPLEMENTED();
/*
ClearMem((char *)pSpeechQueue, 0x28);
if (GameType != GAME_MISSION) {
pSpeechQueue->allowed = '\x02';
}
return;*/
}
// decompiled code
// original method signature:
// void /*$ra*/ ControlSpeech(struct SPEECH_QUEUE *pSpeechQueue /*$s0*/)
// line 595, offset 0x0004e560
/* begin block 1 */
// Start line: 596
// Start offset: 0x0004E560
/* end block 1 */
// End offset: 0x0004E700
// End Line: 635
/* begin block 2 */
// Start line: 1169
/* end block 2 */
// End Line: 1170
/* begin block 3 */
// Start line: 1252
/* end block 3 */
// End Line: 1253
/* begin block 4 */
// Start line: 1257
/* end block 4 */
// End Line: 1258
void ControlSpeech(SPEECH_QUEUE *pSpeechQueue)
{
UNIMPLEMENTED();
/*
char cVar1;
int iVar2;
uint uVar3;
if (GameType != GAME_MISSION) goto LAB_0004e5d0;
if ((bMissionTitleFade == 0) || (pSpeechQueue->allowed = '\x01', bMissionTitleFade == 0)) {
cVar1 = pSpeechQueue->allowed;
if (cVar1 == '\x01') {
pSpeechQueue->allowed = '\x02';
goto LAB_0004e5c0;
}
}
else {
LAB_0004e5c0:
cVar1 = pSpeechQueue->allowed;
}
if (cVar1 != '\x02') {
return;
}
LAB_0004e5d0:
if (pSpeechQueue->count < 1) {
TimeSinceLastSpeech = TimeSinceLastSpeech + 1;
if ((pSpeechQueue->is_playing != '\0') &&
(iVar2 = SpuGetKeyStatus(1 << ((uint)(byte)pSpeechQueue->chan & 0x1f)), iVar2 == 0)) {
SetReverbChannelState((uint)(byte)pSpeechQueue->chan, (uint)(byte)pSpeechQueue->reverb);
UnlockChannel((uint)(byte)pSpeechQueue->chan);
pSpeechQueue->is_playing = '\0';
}
}
else {
if (pSpeechQueue->is_playing == '\0') {
uVar3 = GetFreeChannel();
pSpeechQueue->chan = (char)uVar3;
LockChannel(uVar3 & 0xff);
iVar2 = SetReverbChannelState((uint)(byte)pSpeechQueue->chan, 0);
pSpeechQueue->reverb = (char)iVar2;
pSpeechQueue->is_playing = '\x01';
(&channels)[(byte)pSpeechQueue->chan].time = 0;
iVar2 = pSpeechQueue->count + -1;
pSpeechQueue->count = iVar2;
DoSpeech((uint)(byte)pSpeechQueue->chan, pSpeechQueue->slot[iVar2]);
}
else {
iVar2 = SpuGetKeyStatus(1 << ((uint)(byte)pSpeechQueue->chan & 0x1f));
if (iVar2 == 0) {
iVar2 = pSpeechQueue->count + -1;
pSpeechQueue->count = iVar2;
DoSpeech((uint)(byte)pSpeechQueue->chan, pSpeechQueue->slot[iVar2]);
}
}
TimeSinceLastSpeech = 0;
}
return;
*/
}
// decompiled code
// original method signature:
// void /*$ra*/ CopSay(int phrase /*$s1*/, int direction /*$s2*/)
// line 665, offset 0x00052190
/* begin block 1 */
// Start line: 3366
/* end block 1 */
// End Line: 3367
/* begin block 2 */
// Start line: 1330
/* end block 2 */
// End Line: 1331
void CopSay(int phrase, int direction)
{
UNIMPLEMENTED();
/*
if (((((gCurrentMissionNumber != 7) && (gCurrentMissionNumber != 9)) &&
(gCurrentMissionNumber != 0xb)) &&
((gCurrentMissionNumber != 0x14 && (gCurrentMissionNumber != 0x1a)))) &&
((gCurrentMissionNumber != 0x1f &&
((gCurrentMissionNumber != 0x21 && (gCurrentMissionNumber != 0x28)))))) {
PlaySpeech(&gSpeechQueue, phrase);
if (phrase == 10) {
if (cop_bank == '\x01') {
return;
}
if ((cop_bank != '\x02') && (cop_bank != '\x03')) {
return;
}
}
else {
if (phrase != 0xf) {
return;
}
if (cop_bank != '\x01') {
if (cop_bank == '\x02') {
return;
}
if (cop_bank == '\x03') {
return;
}
if (cop_bank != '\x04') {
return;
}
}
}
PlaySpeech(&gSpeechQueue, direction + 1);
}
return;
*/
}
// decompiled code
// original method signature:
// void /*$ra*/ BodSay(int phrase /*$a1*/)
// line 677, offset 0x00052694
/* begin block 1 */
// Start line: 5445
/* end block 1 */
// End Line: 5446
void BodSay(int phrase)
{
UNIMPLEMENTED();
/*
if ((phrase_top != '\0') && (phrase < (int)(uint)(byte)phrase_top)) {
PlaySpeech(&gSpeechQueue, phrase + 100);
}
return;
*/
}
// decompiled code
// original method signature:
// void /*$ra*/ MissionSay(int phrase /*$a0*/)
// line 686, offset 0x000526d0
/* begin block 1 */
// Start line: 687
// Start offset: 0x000526D0
/* end block 1 */
// End offset: 0x000526FC
// End Line: 691
/* begin block 2 */
// Start line: 5463
/* end block 2 */
// End Line: 5464
void MissionSay(int phrase)
{
UNIMPLEMENTED();
/*
char cVar1;
undefined3 extraout_var;
cVar1 = GetMissionSound((char)phrase);
if (CONCAT31(extraout_var, cVar1) != 0xff) {
PlaySpeech(&gSpeechQueue, CONCAT31(extraout_var, cVar1) + 100);
}
return;*/
}
// decompiled code
// original method signature:
// long /*$ra*/ jsqrt(unsigned long a /*$a0*/)
// line 700, offset 0x0005270c
/* begin block 1 */
// Start line: 701
// Start offset: 0x0005270C
// Variables:
// long b1; // $a1
// long b0; // $v1
/* end block 1 */
// End offset: 0x000527C0
// End Line: 713
/* begin block 2 */
// Start line: 5491
/* end block 2 */
// End Line: 5492
/* begin block 3 */
// Start line: 5494
/* end block 3 */
// End Line: 5495
long jsqrt(ulong a)
{
UNIMPLEMENTED();
return 0;
/*
int iVar1;
uint uVar2;
uint uVar3;
if (a < 2) {
return a;
}
uVar2 = a >> 1;
if (a < 0x40000000) {
if (uVar2 < 0x8000) goto LAB_0005277c;
}
else {
if (uVar2 < 0x10000) goto LAB_0005277c;
}
uVar2 = 0xffff;
if (a < 0x40000000) {
uVar2 = 0x7fff;
}
LAB_0005277c:
do {
if (uVar2 == 0) {
trap(7);
}
uVar3 = uVar2 + a / uVar2 >> 1;
iVar1 = uVar2 - uVar3;
if (iVar1 < 0) {
iVar1 = uVar3 - uVar2;
}
uVar2 = uVar3;
} while (100 < iVar1);
return uVar3;
*/
}
// decompiled code
// original method signature:
// void /*$ra*/ InitDopplerSFX()
// line 721, offset 0x0004e710
/* begin block 1 */
// Start line: 722
// Start offset: 0x0004E710
// Variables:
// int i; // $v1
/* end block 1 */
// End offset: 0x0004E790
// End Line: 726
/* begin block 2 */
// Start line: 1510
/* end block 2 */
// End Line: 1511
/* begin block 3 */
// Start line: 1511
/* end block 3 */
// End Line: 1512
/* WARNING: Unknown calling convention yet parameter storage is locked */
void InitDopplerSFX(void)
{
UNIMPLEMENTED();
/*
__othercarsound *p_Var1;
int iVar2;
p_Var1 = &siren_noise;
iVar2 = 1;
do {
p_Var1->chan = -1;
p_Var1->car = 0x14;
p_Var1->in_use = '\0';
iVar2 = iVar2 + -1;
p_Var1 = p_Var1 + 1;
} while (-1 < iVar2);
p_Var1 = &car_noise;
iVar2 = 3;
do {
p_Var1->chan = -1;
p_Var1->car = 0x14;
p_Var1->in_use = '\0';
iVar2 = iVar2 + -1;
p_Var1 = p_Var1 + 1;
} while (-1 < iVar2);
loudhail_time = 0x4b;
if (GameType == GAME_GETAWAY) {
loudhail_time = 0xf5;
}
return;*/
}
// decompiled code
// original method signature:
// void /*$ra*/ DoDopplerSFX()
// line 734, offset 0x0004e790
/* begin block 1 */
// Start line: 735
// Start offset: 0x0004E790
// Variables:
// int i; // $s1
// int j; // $s0
// int num_noisy_cars; // $s5
// unsigned long car_dist[20]; // stack offset -176
// unsigned short indexlist[20]; // stack offset -96
// struct _CAR_DATA *car_ptr; // $s2
// struct VECTOR *pp; // $a1
// unsigned long car_flags; // $s4
// char sirens; // stack offset -56
/* begin block 1.1 */
// Start line: 825
// Start offset: 0x0004ECB8
// Variables:
// int siren; // $v0
/* end block 1.1 */
// End offset: 0x0004EDC8
// End Line: 842
/* begin block 1.2 */
// Start line: 890
// Start offset: 0x0004F09C
// Variables:
// int model; // $v1
/* end block 1.2 */
// End offset: 0x0004F134
// End Line: 892
/* begin block 1.3 */
// Start line: 909
// Start offset: 0x0004F1BC
// Variables:
// char old_idle; // $a1
/* begin block 1.3.1 */
// Start line: 914
// Start offset: 0x0004F240
// Variables:
// int model; // $v1
/* end block 1.3.1 */
// End offset: 0x0004F314
// End Line: 924
/* end block 1.3 */
// End offset: 0x0004F368
// End Line: 929
/* end block 1 */
// End offset: 0x0004F4A0
// End Line: 944
/* begin block 2 */
// Start line: 1527
/* end block 2 */
// End Line: 1528
/* begin block 3 */
// Start line: 1536
/* end block 3 */
// End Line: 1537
/* WARNING: Unknown calling convention yet parameter storage is locked */
void DoDopplerSFX(void)
{
UNIMPLEMENTED();
/*
byte bVar1;
ushort uVar2;
bool bVar3;
uint *puVar4;
char cVar5;
int pitch;
long lVar6;
undefined3 extraout_var;
short *psVar7;
undefined *puVar8;
uint uVar9;
uint uVar10;
__othercarsound *p_Var11;
int *piVar12;
ushort *puVar13;
int iVar14;
VECTOR *position;
ushort *puVar15;
long *plVar16;
CHANNEL_DATA *pCVar17;
int car;
int channel;
int sample;
uint uVar18;
int cars;
uint local_b0[20];
ushort local_60[20];
uint local_38;
uint local_34;
uint local_30;
puVar8 = &stack0xffffff38;
cars = 0;
car = 0;
plVar16 = car_data[0].hd.where.t + 2;
channel = 0;
sample = 0;
local_38 = 0;
do {
pitch = plVar16[-2] - camera_position.vx;
if (pitch < 0) {
pitch = camera_position.vx - plVar16[-2];
}
if (pitch < 0x4000) {
pitch = *plVar16 - camera_position.vz;
if (pitch < 0) {
pitch = camera_position.vz - *plVar16;
}
if (pitch < 0x4000) {
bVar1 = (&car_data[0].controlType)[channel];
if (bVar1 < 5) {
if (2 < bVar1) goto LAB_0004e930;
if (((bVar1 != 2) || (car_data[0].ai[channel + 0xc] == 5)) ||
(car_data[0].ai[channel + 0xc] == 7)) goto LAB_0004e984;
iVar14 = *(int *)((int)car_data[0].hd.where.t + channel) - camera_position.vx;
pitch = *(int *)((int)car_data[0].hd.where.t + channel + 8) - camera_position.vz;
local_60[cars] = (ushort)car;
lVar6 = jsqrt(iVar14 * iVar14 + pitch * pitch);
pitch = lVar6 + 0x6000;
}
else {
if ((bVar1 != 7) || (cVar5 = SilenceThisCar(car), CONCAT31(extraout_var, cVar5) != 0))
goto LAB_0004e984;
LAB_0004e930:
iVar14 = plVar16[-2];
pitch = *plVar16;
local_60[cars] = (ushort)car;
pitch = jsqrt((iVar14 - camera_position.vx) * (iVar14 - camera_position.vx) +
(pitch - camera_position.vz) * (pitch - camera_position.vz));
}
cars = cars + 1;
*(int *)((int)local_b0 + sample) = pitch;
}
}
LAB_0004e984:
plVar16 = plVar16 + 0xa7;
channel = channel + 0x29c;
car = car + 1;
sample = sample + 4;
} while (car < 0x14);
local_34 = (uint)(cars < 3);
local_30 = (uint)(cars < 5);
if (0 < cars) {
car = 0;
do {
channel = car + 1;
if (channel < cars) {
puVar15 = local_60 + car;
puVar13 = local_60 + channel;
car = cars - channel;
do {
uVar2 = *puVar15;
if (local_b0[*puVar13] < local_b0[uVar2]) {
*puVar15 = *puVar13;
*puVar13 = uVar2;
}
car = car + -1;
puVar13 = puVar13 + 1;
} while (car != 0);
}
car = channel;
} while (channel < cars);
}
uVar18 = 0;
car = 0;
if ((0 < cars) && (local_38 < 2)) {
puVar13 = local_60;
channel = 0;
do {
uVar10 = (uint)*(ushort *)(puVar8 + 0x68);
if ((((handlingType[car_data[uVar10].hndType].fourWheelDrive == '\x01') &&
(car_data[uVar10].controlType == '\x03')) && (car_data[uVar10].ai[0x13] < 0x4b)) &&
(sample = CarHasSiren((uint)(byte)car_data[uVar10].ap.model), sample != 0))
goto LAB_0004eba8;
if (gCurrentMissionNumber == 0x1a) {
if ((car_data[uVar10].ap.model == '\x04') && (car_data[uVar10].controlType == '\a')) {
LAB_0004eba8:
uVar2 = *puVar13;
goto LAB_0004ebac;
}
LAB_0004eb68:
if ((gInGameCutsceneActive != 0) &&
((car_data[uVar10].controlType == '\a' && ((&force_siren)[*puVar13] != '\0'))))
goto LAB_0004eba8;
}
else {
if (((gCurrentMissionNumber == 7) || (car_data[uVar10].controlType != '\x02')) ||
((2 < (byte)car_data[uVar10].ap.model || (uVar2 = *puVar13, uVar2 != 1))))
goto LAB_0004eb68;
LAB_0004ebac:
uVar18 = uVar18 | 1 << ((uint)uVar2 & 0x1f);
if (gInGameCutsceneActive == 0) {
local_38 = local_38 + 1 & 0xff;
}
}
puVar13 = puVar13 + 1;
car = car + 1;
} while ((car < cars) &&
(puVar8 = &stack0xffffff3a + channel, channel = channel + 2, local_38 < 2));
}
p_Var11 = &siren_noise;
car = 1;
do {
puVar4 = (uint *)&p_Var11->car;
car = car + -1;
bVar3 = (uVar18 & 1 << (*puVar4 & 0x1f)) != 0;
*(bool *)&p_Var11->in_use = bVar3;
p_Var11 = p_Var11 + 1;
uVar18 = uVar18 & ~((uint)bVar3 << (*puVar4 & 0x1f));
} while (-1 < car);
p_Var11 = &siren_noise;
car = 1;
do {
if ((p_Var11->in_use == '\0') && (p_Var11->stopped == '\0')) {
StopChannel(p_Var11->chan);
UnlockChannel(p_Var11->chan);
p_Var11->chan = -1;
p_Var11->car = 0x14;
p_Var11->stopped = '\x01';
}
car = car + -1;
p_Var11 = p_Var11 + 1;
} while (-1 < car);
car = 0;
do {
do {
channel = cars;
if (local_34 == 0) {
channel = 2;
}
if (channel <= car) {
car = 0;
p_Var11 = &siren_noise;
do {
if (p_Var11->in_use != '\0') {
channel = p_Var11->car;
uVar18 = 0;
if (car_data[channel].controlType == '\x03') {
uVar18 = (uint)car_data[channel].ai[0x13];
}
SetChannelPosition3(p_Var11->chan, (VECTOR *)car_data[channel].hd.where.t,
(long *)(car_data[channel].st + 0x1c), uVar18 * -0x1e + -3000,
car * 4 - (uVar18 * 0x30 + -0x1000), 0);
}
car = car + 1;
p_Var11 = p_Var11 + 1;
} while (car < 2);
uVar18 = 0;
car = 0;
puVar13 = local_60;
while (true) {
channel = cars;
if ((int)(4 - local_38) < cars) {
channel = 4 - local_38;
}
if (channel <= car) break;
uVar10 = (uint)*puVar13;
if ((car_data[uVar10].controlType != '\x03') || (car_data[uVar10].ai[0x13] == 0)) {
uVar18 = uVar18 | 1 << (uVar10 & 0x1f);
}
puVar13 = puVar13 + 1;
car = car + 1;
}
p_Var11 = &car_noise;
car = 3;
do {
puVar4 = (uint *)&p_Var11->car;
car = car + -1;
bVar3 = (uVar18 & 1 << (*puVar4 & 0x1f)) != 0;
*(bool *)&p_Var11->in_use = bVar3;
p_Var11 = p_Var11 + 1;
uVar18 = uVar18 & ~((uint)bVar3 << (*puVar4 & 0x1f));
} while (-1 < car);
p_Var11 = &car_noise;
car = 3;
do {
if ((p_Var11->in_use == '\0') && (p_Var11->stopped == '\0')) {
StopChannel(p_Var11->chan);
UnlockChannel(p_Var11->chan);
p_Var11->chan = -1;
p_Var11->car = 0x14;
p_Var11->stopped = '\x01';
}
car = car + -1;
p_Var11 = p_Var11 + 1;
} while (-1 < car);
car = 0;
do {
do {
channel = cars;
if (local_30 == 0) {
channel = 4;
}
if (channel <= car) {
car = 0;
p_Var11 = &car_noise;
piVar12 = &car_noise.chan;
do {
if (p_Var11->in_use != '\0') {
channel = p_Var11->car;
cVar5 = p_Var11->idle;
bVar3 = gInGameCutsceneActive != 0;
*(bool *)&p_Var11->idle = car_data[channel].hd.speed < 0x11;
if ((bVar3) && (-1 < (&force_idle)[channel])) {
p_Var11->idle = (&force_idle)[channel];
}
if (cVar5 != (&car_noise.idle)[car]) {
StopChannel(*piVar12);
UnlockChannel(*piVar12);
bVar1 = car_data[channel].ap.model;
if (bVar1 == 3) {
bVar1 = cop_model;
}
uVar18 = (uint)bVar1;
if ((&car_noise.idle)[car] == '\0') {
if (bVar1 == 4) {
sample = ResidentModelsBodge();
sample = sample * 3;
}
else {
sample = uVar18 << 1;
if (2 < bVar1) {
uVar18 = uVar18 - 1;
sample = uVar18 * 2;
}
sample = sample + uVar18;
}
}
else {
if (bVar1 == 4) {
sample = ResidentModelsBodge();
sample = sample * 3 + 1;
}
else {
sample = uVar18 << 1;
if (2 < bVar1) {
uVar18 = uVar18 - 1;
sample = uVar18 * 2;
}
sample = sample + uVar18 + 1;
}
}
sample = Start3DTrackingSound
(-1, 3, sample, (VECTOR *)car_data[channel].hd.where.t,
(long *)(car_data[channel].st + 0x1c));
*piVar12 = sample;
LockChannel(sample);
}
sample = -0x186a;
if (car_data[channel].controlType == '\x02') {
sample = -7000;
}
iVar14 = (int)((uint)(ushort)car_data[channel].hd.revs << 0x10) >> 0x12;
pitch = iVar14 + 0x5dc;
if ((&car_noise.idle)[car] != '\0') {
pitch = iVar14 + 0x1000;
}
SetChannelPosition3(*piVar12, (VECTOR *)car_data[channel].hd.where.t,
(long *)(car_data[channel].st + 0x1c), sample, pitch, 0);
}
car = car + 0xc;
piVar12 = piVar12 + 3;
p_Var11 = p_Var11 + 1;
} while ((int)piVar12 < 0xce694);
if (CopsCanSeePlayer != 0) {
if ((int)player.playerCarId < 0) {
psVar7 = &pedestrianFelony;
}
else {
psVar7 = &car_data[(int)player.playerCarId].felonyRating;
}
if (0x292 < *psVar7) {
DoPoliceLoudhailer(cars, local_60, local_b0);
}
}
car = 0;
pCVar17 = &channels;
channel = 0;
do {
if (((pCVar17->loop == '\0') && (pCVar17->time != 0)) &&
(position = *(VECTOR **)((int)&channels.srcposition + channel),
position != (VECTOR *)0x0)) {
SetChannelPosition3(car, position, *(long **)((int)&channels.srcvelocity + channel),
pCVar17->srcvolume, (uint)pCVar17->srcpitch, 0);
}
pCVar17 = pCVar17 + 1;
car = car + 1;
channel = channel + 0x78;
} while (car < 0x10);
return;
}
puVar13 = local_60 + car;
car = car + 1;
} while ((uVar18 & 1 << ((uint)*puVar13 & 0x1f)) == 0);
channel = 0;
p_Var11 = &car_noise;
do {
if (p_Var11->in_use == '\0') {
uVar10 = (uint)*puVar13;
p_Var11->in_use = '\x01';
p_Var11->stopped = '\0';
uVar2 = *puVar13;
p_Var11->car = (uint)uVar2;
bVar3 = gInGameCutsceneActive != 0;
*(bool *)&p_Var11->idle = car_data[uVar10].hd.speed < 0x11;
if ((bVar3) && (-1 < (&force_idle)[(uint)uVar2])) {
p_Var11->idle = (&force_idle)[(uint)uVar2];
}
bVar1 = car_data[uVar10].ap.model;
if (bVar1 == 3) {
bVar1 = cop_model;
}
uVar9 = (uint)bVar1;
if (p_Var11->idle == '\0') {
if (bVar1 == 4) {
sample = ResidentModelsBodge();
channel = sample << 1;
}
else {
if (bVar1 < 3) {
channel = uVar9 * 3;
goto LAB_0004f134;
}
sample = uVar9 - 1;
channel = sample * 2;
}
channel = channel + sample;
}
else {
if (bVar1 == 4) {
channel = ResidentModelsBodge();
channel = channel * 3 + 1;
}
else {
channel = uVar9 << 1;
if (2 < bVar1) {
uVar9 = uVar9 - 1;
channel = uVar9 * 2;
}
channel = channel + uVar9 + 1;
}
}
LAB_0004f134:
channel = Start3DTrackingSound
(-1, 3, channel, (VECTOR *)car_data[uVar10].hd.where.t,
(long *)(car_data[uVar10].st + 0x1c));
p_Var11->chan = channel;
LockChannel(channel);
break;
}
channel = channel + 1;
p_Var11 = p_Var11 + 1;
} while (channel < 4);
} while (true);
}
puVar13 = local_60 + car;
car = car + 1;
} while ((uVar18 & 1 << ((uint)*puVar13 & 0x1f)) == 0);
channel = 0;
piVar12 = &siren_noise.chan;
p_Var11 = &siren_noise;
do {
channel = channel + 1;
if (p_Var11->in_use == '\0') {
uVar10 = (uint)*puVar13;
p_Var11->in_use = '\x01';
p_Var11->stopped = '\0';
bVar3 = gCurrentMissionNumber == 0x1a;
p_Var11->car = (uint)*puVar13;
if ((bVar3) || (car_data[uVar10].controlType != '\x02')) {
uVar9 = CarHasSiren((uint)(byte)car_data[uVar10].ap.model);
channel = Start3DTrackingSound
(-1, (uVar9 & 0xff00) >> 8, uVar9 & 0xff,
(VECTOR *)car_data[uVar10].hd.where.t,
(long *)(car_data[uVar10].st + 0x1c));
*piVar12 = channel;
}
else {
channel = Start3DTrackingSound
(-1, 4, 5, (VECTOR *)car_data[uVar10].hd.where.t,
(long *)(car_data[uVar10].st + 0x1c));
*piVar12 = channel;
}
LockChannel(channel);
break;
}
piVar12 = piVar12 + 3;
p_Var11 = p_Var11 + 1;
} while (channel < 2);
} while (true);
*/
}
// decompiled code
// original method signature:
// void /*$ra*/ DoPoliceLoudhailer(int cars /*$s1*/, unsigned short *indexlist /*$s2*/, unsigned long *dist /*$s3*/)
// line 946, offset 0x0004f4a0
/* begin block 1 */
// Start line: 947
// Start offset: 0x0004F4A0
// Variables:
// int i; // $t1
// int rnd; // $t0
// int time; // $s0
/* begin block 1.1 */
// Start line: 951
// Start offset: 0x0004F560
// Variables:
// struct _CAR_DATA *car_ptr; // $a3
/* end block 1.1 */
// End offset: 0x0004F624
// End Line: 959
/* end block 1 */
// End offset: 0x0004F64C
// End Line: 962
/* begin block 2 */
// Start line: 2215
/* end block 2 */
// End Line: 2216
/* begin block 3 */
// Start line: 2218
/* end block 3 */
// End Line: 2219
void DoPoliceLoudhailer(int cars, ushort *indexlist, ulong *dist)
{
UNIMPLEMENTED();
/*
long lVar1;
uint uVar2;
uint uVar3;
int iVar4;
int iVar5;
lVar1 = Random2(0x4e);
iVar5 = 0x113;
if (GameType == GAME_GETAWAY) {
iVar5 = 0x1db;
}
if ((((gCurrentMissionNumber != 7) && (gCurrentMissionNumber != 9)) &&
(gCurrentMissionNumber != 0xb)) &&
(((gCurrentMissionNumber != 0x14 && (gCurrentMissionNumber != 0x1a)) &&
((gCurrentMissionNumber != 0x1f &&
((gCurrentMissionNumber != 0x21 && (gCurrentMissionNumber != 0x28)))))))) {
iVar4 = 0;
if (0 < cars) {
do {
uVar2 = (uint)*indexlist;
uVar3 = dist[uVar2];
if (0x6000 < uVar3) {
dist[uVar2] = uVar3 - 0x6000;
}
if ((((car_data[uVar2].controlType == '\x03') && (car_data[uVar2].ai[0x13] == 0)) &&
(iVar5 < loudhail_time)) && (lVar1 == (lVar1 / 0x1f) * 0x1f)) {
Start3DTrackingSound
(-1, 2, lVar1 % 2 + 0xd, (VECTOR *)car_data[uVar2].hd.where.t,
(long *)(car_data[uVar2].st + 0x1c));
loudhail_time = 0;
break;
}
iVar4 = iVar4 + 1;
indexlist = indexlist + 1;
} while (iVar4 < cars);
}
if (loudhail_time <= iVar5) {
loudhail_time = loudhail_time + 1;
}
}
return;*/
}
// decompiled code
// original method signature:
// void /*$ra*/ CollisionSound(char player_id /*$s0*/, struct _CAR_DATA *cp /*$s5*/, int impact /*$s2*/, int car_car /*$s7*/)
// line 975, offset 0x0004f668
/* begin block 1 */
// Start line: 976
// Start offset: 0x0004F668
// Variables:
// long *here; // $s3
// char chan; // $s1
// char crash; // $s6
// char size; // $s4
/* begin block 1.1 */
// Start line: 983
// Start offset: 0x0004F6F0
// Variables:
// unsigned long p0dst; // $a1
// unsigned long p1dst; // $a0
/* end block 1.1 */
// End offset: 0x0004F6F0
// End Line: 984
/* begin block 1.2 */
// Start line: 993
// Start offset: 0x0004F784
/* begin block 1.2.1 */
// Start line: 1000
// Start offset: 0x0004F898
/* end block 1.2.1 */
// End offset: 0x0004F930
// End Line: 1007
/* end block 1.2 */
// End offset: 0x0004F954
// End Line: 1011
/* end block 1 */
// End offset: 0x0004F954
// End Line: 1012
/* begin block 2 */
// Start line: 2285
/* end block 2 */
// End Line: 2286
void CollisionSound(char player_id, _CAR_DATA *cp, int impact, int car_car)
{
UNIMPLEMENTED();
/*
int iVar1;
uint uVar2;
long lVar3;
int iVar4;
int iVar5;
int iVar6;
uint uVar7;
uint phrase;
int sample;
uVar7 = SEXT14(player_id);
sample = 8;
phrase = 0;
if (impact < 0x19) {
return;
}
if ((((int)uVar7 < 0) && (uVar7 = 0, 1 < NumPlayers)) && (NoPlayerControl == 0)) {
iVar4 = (cp->hd).where.t[0];
iVar5 = iVar4 - player.pos[0];
iVar1 = (cp->hd).where.t[2];
iVar6 = iVar1 - player.pos[2];
iVar4 = iVar4 - _PLAYER_ARRAY_000d979c[0].pos[0];
iVar1 = iVar1 - _PLAYER_ARRAY_000d979c[0].pos[2];
uVar7 = (uint)((uint)(iVar4 * iVar4 + iVar1 * iVar1) < (uint)(iVar5 * iVar5 + iVar6 * iVar6));
}
if ((&player)[uVar7].crash_timer != 0) {
return;
}
if (car_car == 0) {
if (0x30c < impact) goto LAB_0004f7a8;
LAB_0004f7b4:
if (car_car == 0) {
if (0x15e < impact) goto LAB_0004f7d8;
}
else {
if (0x17c < impact) {
LAB_0004f7d8:
sample = 9;
phrase = 2;
}
}
}
else {
if (impact < 0x385) goto LAB_0004f7b4;
LAB_0004f7a8:
sample = 10;
phrase = 1;
}
uVar2 = GetFreeChannel();
SetPlayerOwnsChannel(uVar2 & 0xff, (char)uVar7);
iVar1 = impact;
if (impact < 0) {
iVar1 = impact + 0x3ff;
}
Start3DSoundVolPitch
(uVar2 & 0xff, 1, sample, (cp->hd).where.t[0], (cp->hd).where.t[1], (cp->hd).where.t[2],
-0xabe, impact + (iVar1 >> 10) * -0x400 + 0xe00);
sample = GetPlayerId(cp);
if ((sample != 0) ||
((((2 < gCurrentMissionNumber - 2U && (gCurrentMissionNumber != 9)) &&
((gCurrentMissionNumber != 10 && (gCurrentMissionNumber != 0x1b)))) || ((impact & 5U) == 0)))
) goto LAB_0004f930;
lVar3 = Random2(1);
if (lVar3 == (lVar3 / 3) * 3) {
phrase = phrase | 4;
}
else {
if (car_car != 2) {
if (phrase != 0) {
phrase = Random2(1);
sample = 0;
if ((phrase & 1) == 0) {
sample = 3;
}
BodSay(sample);
}
goto LAB_0004f930;
}
if (phrase == 0) goto LAB_0004f930;
uVar2 = Random2(1);
phrase = 2;
if ((uVar2 & 1) != 0) {
phrase = 1;
}
}
BodSay(phrase);
LAB_0004f930:
(&player)[uVar7].crash_timer = 2;
return;
*/
}
// decompiled code
// original method signature:
// void /*$ra*/ ExplosionSound(struct VECTOR *pos /*$s4*/, int type /*$s0*/)
// line 1019, offset 0x0004f984
/* begin block 1 */
// Start line: 1020
// Start offset: 0x0004F984
// Variables:
// int bang; // $s5
// int pitch; // $t0
// int rnd; // $s3
// struct VECTOR P; // stack offset -48
// int sc1; // $s2
// int sc2; // $s1
/* end block 1 */
// End offset: 0x0004FB70
// End Line: 1048
/* begin block 2 */
// Start line: 2380
/* end block 2 */
// End Line: 2381
void ExplosionSound(VECTOR *pos, int type)
{
UNIMPLEMENTED();
/*
char id;
long lVar1;
undefined3 extraout_var;
int iVar2;
int iVar3;
int iVar4;
int unaff_s1;
int unaff_s2;
int sample;
int iVar5;
sample = 0xff;
lVar1 = Random2(4);
if (gCurrentMissionNumber == 0x17) {
LAB_0004fa04:
id = '\f';
LAB_0004fa10:
id = GetMissionSound(id);
sample = CONCAT31(extraout_var, id);
}
else {
if (gCurrentMissionNumber < 0x18) {
if (gCurrentMissionNumber == 0xd) goto LAB_0004fa04;
}
else {
if ((gCurrentMissionNumber == 0x1e) || (gCurrentMissionNumber == 0x23)) {
id = '\x1d';
goto LAB_0004fa10;
}
}
}
if (sample == 0xff) {
return;
}
iVar3 = pos->vx;
if (type == 1) {
unaff_s2 = 3;
unaff_s1 = 1;
}
else {
if (type < 2) {
iVar5 = iVar3 * unaff_s2;
if (type != 0) goto LAB_0004fab8;
unaff_s2 = 2;
unaff_s1 = 2;
}
else {
iVar5 = iVar3 * unaff_s2;
if (type != 0x29a) goto LAB_0004fab8;
unaff_s2 = 1;
unaff_s1 = 3;
}
}
iVar5 = iVar3 * unaff_s2;
LAB_0004fab8:
iVar5 = iVar5 + player.cameraPos.vx * unaff_s1;
if (iVar5 < 0) {
iVar5 = iVar5 + 3;
}
iVar4 = pos->vy * unaff_s2 + player.cameraPos.vy * unaff_s1;
if (iVar4 < 0) {
iVar4 = iVar4 + 3;
}
iVar2 = pos->vz * unaff_s2 + player.cameraPos.vz * unaff_s1;
if (iVar2 < 0) {
iVar2 = iVar2 + 3;
}
Start3DSoundVolPitch
(-1, 5, sample, iVar5 >> 2, iVar4 >> 2, iVar2 >> 2, 0,
((FrameCnt * iVar3 ^ lVar1 * pos->vz) & 0x3ffU) + 0xe00);
return;
*/
}
// decompiled code
// original method signature:
// void /*$ra*/ JerichoSpeak()
// line 1052, offset 0x0004fb94
/* begin block 1 */
// Start line: 1053
// Start offset: 0x0004FB94
// Variables:
// static unsigned int j_said; // offset 0x0
// int rnd; // $a1
/* end block 1 */
// End offset: 0x0004FC90
// End Line: 1060
/* begin block 2 */
// Start line: 2452
/* end block 2 */
// End Line: 2453
/* begin block 3 */
// Start line: 2453
/* end block 3 */
// End Line: 2454
/* WARNING: Unknown calling convention yet parameter storage is locked */
void JerichoSpeak(void)
{
UNIMPLEMENTED();
/*
uint uVar1;
long lVar2;
short *psVar3;
lVar2 = Random2(3);
uVar1 = j_said_78;
if (CopsCanSeePlayer != 0) {
if ((int)player.playerCarId < 0) {
psVar3 = &pedestrianFelony;
}
else {
psVar3 = &car_data[(int)player.playerCarId].felonyRating;
}
if (((0x292 < *psVar3) && (lVar2 == (lVar2 / 5) * 5)) &&
(uVar1 = j_said_78 + 1, 0x3c < j_said_78)) {
BodSay(lVar2 % 3);
j_said_78 = 0;
uVar1 = j_said_78;
}
}
j_said_78 = uVar1;
return;
*/
}
// decompiled code
// original method signature:
// void /*$ra*/ FunkUpDaBGMTunez(int funk /*$a0*/)
// line 1085, offset 0x000527c0
/* begin block 1 */
// Start line: 5888
/* end block 1 */
// End Line: 5889
/* begin block 2 */
// Start line: 6261
/* end block 2 */
// End Line: 6262
/* begin block 3 */
// Start line: 6263
/* end block 3 */
// End Line: 6264
void FunkUpDaBGMTunez(int funk)
{
UNIMPLEMENTED();
/*
if (funk == 0) {
if (copmusic != 0) {
copmusic = 0;
XM_SetSongPos(Song_ID, 0);
}
}
else {
if (copmusic == 0) {
copmusic = 1;
XM_SetSongPos(Song_ID, *(ushort *)(coptrackpos + current_music_id));
}
}
return;
*/
}
// decompiled code
// original method signature:
// void /*$ra*/ SoundTasks()
// line 1103, offset 0x0004fc90
/* begin block 1 */
// Start line: 1104
// Start offset: 0x0004FC90
// Variables:
// int i; // $s2
// struct _CAR_DATA *cp; // $s1
/* end block 1 */
// End offset: 0x000500E4
// End Line: 1183
/* begin block 2 */
// Start line: 2510
/* end block 2 */
// End Line: 2511
/* begin block 3 */
// Start line: 2554
/* end block 3 */
// End Line: 2555
/* begin block 4 */
// Start line: 2558
/* end block 4 */
// End Line: 2559
/* WARNING: Unknown calling convention yet parameter storage is locked */
void SoundTasks(void)
{
UNIMPLEMENTED();
/*
int channel;
int channel_00;
undefined4 uVar1;
VECTOR *position;
long *velocity;
int volume;
int *piVar2;
int iVar3;
int iVar4;
_PLAYER *p_Var5;
iVar3 = 0;
if (NumPlayers != 0) {
p_Var5 = &player;
iVar4 = 0;
do {
channel_00 = (int)p_Var5->playerCarId;
if ((p_Var5->cameraView == '\x02') || (p_Var5->cameraView == '\0')) {
*(undefined4 *)((int)player.camera_vel + iVar4) =
*(undefined4 *)(car_data[channel_00].st + 0x1c);
*(undefined4 *)((int)player.camera_vel + iVar4 + 4) =
*(undefined4 *)(car_data[channel_00].st + 0x20);
*(undefined4 *)((int)player.camera_vel + iVar4 + 8) =
*(undefined4 *)(car_data[channel_00].st + 0x24);
}
else {
*(undefined4 *)((int)player.camera_vel + iVar4 + 8) = 0;
*(undefined4 *)((int)player.camera_vel + iVar4 + 4) = 0;
*(undefined4 *)((int)player.camera_vel + iVar4) = 0;
}
piVar2 = (int *)((int)&player.car_sound_timer + iVar4);
if (-1 < *piVar2) {
*piVar2 = *piVar2 + -1;
}
if (*piVar2 == 4) {
Start3DSoundVolPitch
(-1, 6, 4, car_data[channel_00].hd.where.t[0], -car_data[channel_00].hd.where.t[1],
car_data[channel_00].hd.where.t[2], -0x9c4, 0xc00);
}
if (*piVar2 == 0) {
(&player.car_is_sounding)[iVar4] = '\0';
}
piVar2 = (int *)((int)&player.crash_timer + iVar4);
channel = *piVar2;
if (0 < channel) {
*piVar2 = channel + -1;
}
if ((&player.playerCarId)[iVar4] < '\0') {
channel_00 = 1;
if (iVar3 != 0) {
channel_00 = 4;
}
SetChannelVolume(channel_00, -10000, 0);
channel_00 = 0;
if (iVar3 != 0) {
channel_00 = 3;
}
SetChannelVolume(channel_00, -10000, 0);
channel_00 = 2;
if (iVar3 != 0) {
channel_00 = 5;
}
SetChannelVolume(channel_00, -10000, 0);
}
else {
channel = 1;
if (iVar3 != 0) {
channel = 4;
}
position = (VECTOR *)car_data[channel_00].hd.where.t;
velocity = (long *)(car_data[channel_00].st + 0x1c);
if ((&player.car_is_sounding)[iVar4] == '\0') {
volume = (int)*(short *)((int)&player.idlevol + iVar4);
}
else {
volume = -10000;
}
SetChannelPosition3(channel, position, velocity, volume,
((int)((uint)(ushort)car_data[channel_00].hd.revs << 0x10) >> 0x12) +
0x1000, 0);
channel = 0;
if (iVar3 != 0) {
channel = 3;
}
volume = -10000;
if ((byte)p_Var5->car_is_sounding < 2) {
volume = (int)p_Var5->revsvol;
}
SetChannelPosition3(channel, position, velocity, volume,
((int)((uint)(ushort)car_data[channel_00].hd.revs << 0x10) >> 0x12) +
((int)((uint)(ushort)p_Var5->revsvol << 0x10) >> 0x16) + 0x5dc, 0);
channel_00 = CarHasSiren((uint)(byte)car_data[channel_00].ap.model);
if (channel_00 != 0) {
if ((p_Var5->horn).on == '\0') {
uVar1 = 2;
if (iVar3 != 0) {
uVar1 = 5;
}
SpuSetVoicePitch(uVar1, 0);
}
else {
channel_00 = 2;
if (iVar3 != 0) {
channel_00 = 5;
}
SetChannelPosition3(channel_00, position, velocity, 0, 0x1000, 0);
}
}
}
p_Var5 = p_Var5 + 1;
iVar3 = iVar3 + 1;
iVar4 = iVar4 + 0x74;
} while (iVar3 < (int)(uint)NumPlayers);
}
if ((NumPlayers < 2) || (NoPlayerControl != 0)) {
(*(code *)UpdateEnvSounds[EStags.func_cnt])(&envsnd, ESdata, 0);
iVar4 = EStags.func_cnt + 1;
iVar3 = iVar4;
if (iVar4 < 0) {
iVar3 = EStags.func_cnt + 4;
}
EStags.func_cnt = iVar4 + (iVar3 >> 2) * -4;
DoDopplerSFX();
Tunnels(&tunnels);
}
ControlSpeech(&gSpeechQueue);
if (gInGameCutsceneActive == 0) {
DoMissionSound();
}
else {
HandleRequestedXA();
DoCutsceneSound();
}
if (gInGameChaseActive != 0) {
LeadHorn(car_data + 1);
}
if ((jericho_in_back != 0) &&
(((gCurrentMissionNumber - 0x14U < 2 || (gCurrentMissionNumber == 0x19)) ||
(gCurrentMissionNumber == 0x27)))) {
JerichoSpeak();
}
return;
*/
}
// decompiled code
// original method signature:
// void /*$ra*/ InitMusic(int musicnum /*$s0*/)
// line 1195, offset 0x000500e4
/* begin block 1 */
// Start line: 1196
// Start offset: 0x000500E4
// Variables:
// static char *music_pt; // offset 0xc
// static char *sample_pt; // offset 0x10
// static char xm_samples; // offset 0x4
// int musicpos[3]; // stack offset -32
// char *name; // $s1
// int sample_len; // $s0
// int music_len; // $t0
/* begin block 1.1 */
// Start line: 1240
// Start offset: 0x000501A4
/* end block 1.1 */
// End offset: 0x00050208
// End Line: 1247
/* end block 1 */
// End offset: 0x0005027C
// End Line: 1256
/* begin block 2 */
// Start line: 2760
/* end block 2 */
// End Line: 2761
/* begin block 3 */
// Start line: 2773
/* end block 3 */
// End Line: 2774
void InitMusic(int musicnum)
{
UNIMPLEMENTED();
/*
char *addr;
int iVar1;
int local_20;
int local_1c;
int local_18;
copmusic = 0;
puts(s_NewLevel_in_InitMusic___00010b04);
AllocateReverb(3, 0x4000);
current_music_id = musicnum;
LoadfileSeg(s_SOUND_MUSIC_BIN_00010af4, (char *)&local_20, musicnum << 3, 0xc);
addr = mallocptr;
if (NewLevel != 0) {
DAT_000aa524 = (uchar *)mallocptr;
DAT_000aa528 = mallocptr + ((local_1c - local_20) + 3U & 0xfffffffc);
mallocptr = DAT_000aa528;
LoadfileSeg(s_SOUND_MUSIC_BIN_00010af4, addr, local_20,
(local_1c - local_20) + (local_18 - local_1c));
}
if (Song_ID == -1) {
VABID = XM_GetFreeVAB();
if (NewLevel != 0) {
iVar1 = LoadSoundBank(DAT_000aa528, local_18 - local_1c, 0);
xm_samples_90 = (byte)iVar1;
}
UpdateXMSamples((uint)xm_samples_90);
XM_GetFileHeaderSize();
XM_SetFileHeaderAddress((uchar *)header_pt);
XM_GetSongSize();
XM_SetSongAddress((uchar *)song_pt);
}
InitXMData(DAT_000aa524, 0, 0);
Song_ID = XM_Init(VABID, 0, 0, 0x10, 1, -1, 0, 0);
if (music_paused != 0) {
XM_Pause(Song_ID);
}
return;
*/
}
// decompiled code
// original method signature:
// void /*$ra*/ InitTunnels(char n /*$a0*/)
// line 1317, offset 0x0005243c
/* begin block 1 */
// Start line: 1318
// Start offset: 0x0005243C
// Variables:
// struct __tunnelinfo *T; // $a1
/* end block 1 */
// End offset: 0x00052460
// End Line: 1325
/* begin block 2 */
// Start line: 5453
/* end block 2 */
// End Line: 5454
/* begin block 3 */
// Start line: 2634
/* end block 3 */
// End Line: 2635
void InitTunnels(char n)
{
UNIMPLEMENTED();
/*
if (0x1d < (byte)n) {
n = '\x1d';
}
tunnels.num_tunnels = n;
tunnels.tunnel_cnt = '\0';
return;*/
}
// decompiled code
// original method signature:
// int /*$ra*/ AddTunnel(long x1 /*$t1*/, long y1 /*$a1*/, long z1 /*$a2*/, long x2 /*$a3*/, long y2 /*stack 16*/, long z2 /*stack 20*/)
// line 1331, offset 0x00052848
/* begin block 1 */
// Start line: 1332
// Start offset: 0x00052848
// Variables:
// struct __tunnelinfo *T; // $t0
/* end block 1 */
// End offset: 0x000528FC
// End Line: 1344
/* begin block 2 */
// Start line: 6755
/* end block 2 */
// End Line: 6756
int AddTunnel(long x1, long y1, long z1, long x2, long y2, long z2)
{
UNIMPLEMENTED();
return 0;
/*
uint uVar1;
if ((byte)tunnels.tunnel_cnt < (byte)tunnels.num_tunnels) {
tunnels.coords[(byte)tunnels.tunnel_cnt].p1.vx = x1;
tunnels.coords[(byte)tunnels.tunnel_cnt].p1.vy = y1;
tunnels.coords[(byte)tunnels.tunnel_cnt].p1.vz = z1;
tunnels.coords[(byte)tunnels.tunnel_cnt].p2.vx = x2;
tunnels.coords[(byte)tunnels.tunnel_cnt].p2.vy = y2;
tunnels.coords[(byte)tunnels.tunnel_cnt].p2.vz = z2;
uVar1 = (uint)(byte)tunnels.tunnel_cnt;
tunnels.tunnel_cnt = tunnels.tunnel_cnt + '\x01';
return uVar1;
}
return -1;
*/
}
// decompiled code
// original method signature:
// void /*$ra*/ Tunnels(struct __tunnelinfo *T /*$a0*/)
// line 1350, offset 0x0005027c
/* begin block 1 */
// Start line: 1351
// Start offset: 0x0005027C
// Variables:
// int i; // $t2
// int verb; // $t4
/* end block 1 */
// End offset: 0x00050400
// End Line: 1364
/* begin block 2 */
// Start line: 3075
/* end block 2 */
// End Line: 3076
/* begin block 3 */
// Start line: 3115
/* end block 3 */
// End Line: 3116
/* begin block 4 */
// Start line: 3119
/* end block 4 */
// End Line: 3120
void Tunnels(__tunnelinfo *T)
{
UNIMPLEMENTED();
/*
int iVar1;
int iVar2;
int *piVar3;
int iVar4;
int iVar5;
int on;
iVar5 = 0;
gTunnelNum = -1;
on = 0;
if (T->tunnel_cnt != '\0') {
iVar4 = 0;
do {
piVar3 = (int *)((int)&T->coords[0].p2.vx + iVar4);
iVar1 = *piVar3;
iVar2 = *(int *)((int)&T->coords[0].p1.vx + iVar4);
if (iVar2 < iVar1) {
iVar1 = iVar2;
}
if (iVar1 < camera_position.vx) {
iVar1 = *piVar3;
if (iVar1 < iVar2) {
iVar1 = iVar2;
}
if (camera_position.vx < iVar1) {
piVar3 = (int *)((int)&T->coords[0].p2.vy + iVar4);
iVar1 = *piVar3;
iVar2 = *(int *)((int)&T->coords[0].p1.vy + iVar4);
if (iVar2 < iVar1) {
iVar1 = iVar2;
}
if (iVar1 < camera_position.vy) {
iVar1 = *piVar3;
if (iVar1 < iVar2) {
iVar1 = iVar2;
}
if (camera_position.vy < iVar1) {
piVar3 = (int *)((int)&T->coords[0].p2.vz + iVar4);
iVar1 = *piVar3;
iVar4 = *(int *)((int)&T->coords[0].p1.vz + iVar4);
if (iVar4 < iVar1) {
iVar1 = iVar4;
}
if (iVar1 < camera_position.vz) {
iVar1 = *piVar3;
if (iVar1 < iVar4) {
iVar1 = iVar4;
}
if (camera_position.vz < iVar1) {
on = 1;
gTunnelNum = iVar5;
break;
}
}
}
}
}
}
iVar5 = iVar5 + 1;
iVar4 = iVar5 * 0x20;
} while (iVar5 < (int)(uint)(byte)T->tunnel_cnt);
}
SetReverbInGameState(on);
return;
*/
}
// decompiled code
// original method signature:
// void /*$ra*/ AddTunnels(int level /*$a0*/)
// line 1366, offset 0x00050400
/* begin block 1 */
// Start line: 3152
/* end block 1 */
// End Line: 3153
/* begin block 2 */
// Start line: 3155
/* end block 2 */
// End Line: 3156
void AddTunnels(int level)
{
UNIMPLEMENTED();
/*
long z2;
long x1;
long z1;
long x2;
long local_18;
if (level == 1) {
InitTunnels('\x04');
AddTunnel(-0x6153a, 0, -0x274e8, -0x5314c, 2000, -0x19258);
AddTunnel(0x429a0, 0, (long)&DAT_0000a0f0, 0x3e418, 2000, 0x29298);
AddTunnel(-0x749a0, 0, -0x1b83c, -0x60ec8, (long)&DAT_00001f40, -0x206c0);
z2 = -0xae38;
x1 = -0x2d613;
z1 = -0xa1ea;
x2 = -0x2bdc2;
local_18 = -1000;
}
else {
if (level < 2) {
if (level != 0) {
return;
}
InitTunnels('\x1d');
AddTunnel(-0x13178, 0, -0x1e848, -0xab18, -500, -0x26f0c);
AddTunnel(-65000, 0, -0x1df4c, -68000, -500, -0x1e848);
AddTunnel(-0xbdd8, 0, -0x39dc8, -0xc4ae, -500, -0x3997c);
AddTunnel(-0x35af7, 0, 0xa4cfb, -0x32f07, -2000, (long)&DAT_000a3507);
AddTunnel(-0x47ef4, 0, 0x4e1e5, -0x466fc, -500, 0x4d5f5);
AddTunnel(-0x44df9, 0, 0x4e8ee, -0x43611, -500, 0x4d0f6);
AddTunnel(-0x418f6, 0, 0x4e2f4, -0x4010a, -500, 0x4cb40);
AddTunnel(-0x47bfe, 0, 0x4b5f8, -0x46c0e, -500, 0x4a9f8);
AddTunnel(-0x43f02, 0, 0x4b5f8, -0x43afe, -500, 0x4aa00);
AddTunnel(-0x48cfe, 0, 0x49a00, -0x468fa, -500, 0x48e00);
AddTunnel(-0x47506, 0, 0x48e00, -0x468fa, -500, 0x481f8);
AddTunnel(-0x452fa, 0, 0x489f4, -0x446fa, -500, 0x47dfc);
AddTunnel(-0x452fe, 0, 0x47dfc, -0x42f06, -500, 0x47200);
AddTunnel(-0x46e8b, 0, 0x43eec, -0x44e7f, -500, 0x432f8);
AddTunnel(-0x44afa, 0, 0x439f0, -0x43ede, -500, 0x42e00);
AddTunnel(-0x466f6, 0, (long)&LAB_00041af8, -0x45afa, -500, 0x40f00);
AddTunnel(-0x46a83, 0, 0x3f6e6, -0x4668b, -500, 0x3eafa);
AddTunnel(-0x488fa, 0, 0x3dafa, -0x47112, -500, 0x3cef6);
AddTunnel(-0x456fe, 0, 0x3dafa, -0x43f0e, -500, 0x3cef6);
AddTunnel(-0x418fa, 0, 0x3dafa, -0x400fe, -500, 0x3cef6);
AddTunnel(-0x48e02, 0, 0x3acf9, -0x46e06, -500, 0x3a101);
AddTunnel(-0x410fa, 0, 0x3b5f5, -0x3f906, -500, 0x3aa05);
AddTunnel(-0x44cf6, 0, 0x390f7, -0x448fe, -500, 0x384ff);
AddTunnel(-0x448fe, 0, 0x384ff, -0x43102, -500, 0x37903);
AddTunnel(-0x45afe, 0, 0x329f9, -0x45706, -500, 0x31dfd);
AddTunnel(-0x47701, 0, 0x30df8, -0x42f05, -500, 0x2f604);
AddTunnel(-0x41501, 0, 0x305f8, -0x40905, -500, 0x2ee00);
AddTunnel(-0x418fe, 0, 0x2ee00, -0x40d05, -500, 0x2d608);
z2 = -0x57702;
x1 = -0x351f1;
z1 = -0x55f12;
x2 = -0x30a1d;
local_18 = -500;
}
else {
if (level != 2) {
if (level != 3) {
return;
}
InitTunnels('\x05');
AddTunnel(0x24f68, 0, -0x3d374, 0x25cb0, -400, -0x398e6);
AddTunnel(-0x1c19c, 0, -0x2f2b0, -0x1ba94, -400, -0x20594);
AddTunnel(-0x118dc, 0, -0x3f7a, -0x11fb2, -400, -0x6f54);
AddTunnel(0x131dc, 0, -0x28fdc, 0x14212, -500, -0x297de);
AddTunnel(0x2a5ee, 0, 0x3c668, 0x2b624, -500, 0x3be34);
return;
}
InitTunnels('\x02');
AddTunnel(0x2678a, 0, 0xb4b9a, 0x2918a, -2000, 0xb139b);
z2 = 0xb06da;
x1 = 0x28550;
z1 = 0xb139b;
x2 = 0x2918a;
local_18 = -2000;
}
}
AddTunnel(x1, 0, z1, x2, local_18, z2);
return;
*/
}
// decompiled code
// original method signature:
// void /*$ra*/ InitEnvSnd(int num_envsnds /*$a0*/)
// line 1510, offset 0x00052388
/* begin block 1 */
// Start line: 1511
// Start offset: 0x00052388
// Variables:
// int i; // $v1
// int p; // $a1
// struct __envsoundtags *T; // $t1
/* end block 1 */
// End offset: 0x0005243C
// End Line: 1538
/* begin block 2 */
// Start line: 5618
/* end block 2 */
// End Line: 5619
/* begin block 3 */
// Start line: 5622
/* end block 3 */
// End Line: 5623
void InitEnvSnd(int num_envsnds)
{
UNIMPLEMENTED();
/*
bool bVar1;
__envsound *p_Var2;
uint uVar3;
int *piVar4;
int iVar5;
int iVar6;
int iVar7;
if (0x20 < num_envsnds) {
num_envsnds = 0x20;
}
if (0 < num_envsnds) {
p_Var2 = &envsnd;
iVar5 = num_envsnds;
do {
p_Var2->type = '\0';
iVar5 = iVar5 + -1;
p_Var2 = p_Var2 + 1;
} while (iVar5 != 0);
}
uVar3 = (uint)NumPlayers;
if (NumPlayers != 0) {
iVar5 = 0;
iVar7 = 1;
do {
iVar6 = 3;
piVar4 = ESdata[iVar5].playing_sound + 3;
do {
*piVar4 = -1;
iVar6 = iVar6 + -1;
piVar4 = piVar4 + -1;
} while (-1 < iVar6);
bVar1 = iVar7 < (int)uVar3;
iVar5 = iVar7;
iVar7 = iVar7 + 1;
} while (bVar1);
}
EStags.frame_cnt = 0;
EStags.func_cnt = 0;
EStags.num_envsnds = num_envsnds;
EStags.envsnd_cnt = 0;
return;
*/
}
// decompiled code
// original method signature:
// int /*$ra*/ SetEnvSndVol(int snd /*$a0*/, int vol /*$a1*/)
// line 1545, offset 0x00052168
/* begin block 1 */
// Start line: 1546
// Start offset: 0x00052168
// Variables:
// int was; // $v0
/* end block 1 */
// End offset: 0x00052190
// End Line: 1550
/* begin block 2 */
// Start line: 4242
/* end block 2 */
// End Line: 4243
/* begin block 3 */
// Start line: 3090
/* end block 3 */
// End Line: 3091
/* begin block 4 */
// Start line: 4244
/* end block 4 */
// End Line: 4245
int SetEnvSndVol(int snd, int vol)
{
UNIMPLEMENTED();
return 0;
/*
int iVar1;
iVar1 = (&envsnd)[snd].vol;
(&envsnd)[snd].vol = vol;
return iVar1;
*/
}
// decompiled code
// original method signature:
// void /*$ra*/ SetEnvSndPos(int snd /*$a0*/, long px /*$a1*/, long pz /*$a2*/)
// line 1555, offset 0x00052904
/* begin block 1 */
// Start line: 7203
/* end block 1 */
// End Line: 7204
/* begin block 2 */
// Start line: 7205
/* end block 2 */
// End Line: 7206
void SetEnvSndPos(int snd, long px, long pz)
{
UNIMPLEMENTED();
/*
if ((&envsnd)[snd].type == '\x03') {
(&envsnd)[snd].pos2.vx = px;
(&envsnd)[snd].pos.vx = px;
(&envsnd)[snd].pos2.vz = pz;
(&envsnd)[snd].pos.vz = pz;
}
return;
*/
}
// decompiled code
// original method signature:
// int /*$ra*/ AddEnvSnd(int type /*$t4*/, char flags /*$a1*/, int bank /*$a2*/, int sample /*$a3*/, int vol /*stack 16*/, long px /*stack 20*/, long pz /*stack 24*/)
// line 1577, offset 0x00050c08
/* begin block 1 */
// Start line: 1578
// Start offset: 0x00050C08
// Variables:
// void *data; // $a1
// struct __envsound *ep; // $t1
// struct __envsoundtags *T; // $t0
// long s; // $a1
/* end block 1 */
// End offset: 0x00050E08
// End Line: 1635
/* begin block 2 */
// Start line: 3577
/* end block 2 */
// End Line: 3578
int AddEnvSnd(int type, char flags, int bank, int sample, int vol, long px, long pz)
{
UNIMPLEMENTED();
return 0;
/*
int iVar1;
int in_stack_0000001c;
long in_stack_00000020;
iVar1 = EStags.envsnd_cnt;
if (EStags.num_envsnds <= EStags.envsnd_cnt) {
return -1;
}
(&envsnd)[EStags.envsnd_cnt].type = (uchar)type;
(&envsnd)[iVar1].bank = bank;
(&envsnd)[iVar1].sample = sample;
(&envsnd)[iVar1].flags = flags;
(&envsnd)[iVar1].vol = vol;
iVar1 = EStags.envsnd_cnt;
switch (type) {
case 1:
case 2:
case 4:
(&envsnd)[EStags.envsnd_cnt].pos.vx = px;
(&envsnd)[iVar1].pos2.vx = in_stack_0000001c;
(&envsnd)[iVar1].pos2.vz = in_stack_00000020;
(&envsnd)[iVar1].pos.vz = pz;
break;
case 3:
(&envsnd)[EStags.envsnd_cnt].pos2.vx = px;
(&envsnd)[iVar1].pos.vx = px;
(&envsnd)[iVar1].pos2.vz = pz;
(&envsnd)[iVar1].pos.vz = pz;
break;
case 5:
(&envsnd)[EStags.envsnd_cnt].type = '\x01';
(&envsnd)[iVar1].pos.vx = px - in_stack_0000001c;
(&envsnd)[iVar1].pos.vz = pz - in_stack_0000001c;
(&envsnd)[iVar1].pos2.vx = px + in_stack_0000001c;
(&envsnd)[iVar1].pos2.vz = pz + in_stack_0000001c;
}
if ((&envsnd)[EStags.envsnd_cnt].pos.vx == (&envsnd)[EStags.envsnd_cnt].pos2.vx) {
(&envsnd)[EStags.envsnd_cnt].flags = (&envsnd)[EStags.envsnd_cnt].flags | 1;
}
if ((&envsnd)[EStags.envsnd_cnt].pos.vz == (&envsnd)[EStags.envsnd_cnt].pos2.vz) {
(&envsnd)[EStags.envsnd_cnt].flags = (&envsnd)[EStags.envsnd_cnt].flags | 2;
}
if (type != 3) {
(&envsnd)[EStags.envsnd_cnt].flags = (&envsnd)[EStags.envsnd_cnt].flags | 0x20;
}
iVar1 = EStags.envsnd_cnt;
EStags.envsnd_cnt = EStags.envsnd_cnt + 1;
return iVar1;
*/
}
// decompiled code
// original method signature:
// void /*$ra*/ IdentifyZone(struct __envsound *ep /*$a3*/, struct __envsoundinfo *E /*stack 4*/, int pl /*$a2*/)
// line 1646, offset 0x00050e08
/* begin block 1 */
// Start line: 1647
// Start offset: 0x00050E08
// Variables:
// int i; // $s7
// int j; // $fp
// int tmp[4]; // stack offset -96
// float d; // $s0
// float _g[4]; // stack offset -80
// struct __bitfield64 zones; // stack offset -64
/* end block 1 */
// End offset: 0x000514BC
// End Line: 1704
/* begin block 2 */
// Start line: 3727
/* end block 2 */
// End Line: 3728
/* begin block 3 */
// Start line: 3739
/* end block 3 */
// End Line: 3740
void IdentifyZone(__envsound *ep, __envsoundinfo *E, int pl)
{
UNIMPLEMENTED();
/*
bool bVar1;
float *pfVar2;
undefined4 uVar3;
undefined4 uVar4;
float fVar5;
undefined *puVar6;
int iVar7;
int iVar8;
int iVar9;
long lVar10;
uint *puVar11;
int iVar12;
int iVar13;
undefined *puVar14;
int iVar15;
int iVar16;
uint uVar17;
double in_f12_13;
undefined8 uVar18;
undefined8 uVar19;
uint auStack96[3];
float local_54[5];
uint local_40;
uint local_3c;
uint *local_38;
uint *local_34;
uint *local_30;
iVar16 = 3;
local_34 = auStack96;
pfVar2 = local_54;
local_3c = 0;
local_40 = 0;
do {
*pfVar2 = -NAN;
iVar16 = iVar16 + -1;
pfVar2 = pfVar2 + -1;
} while (-1 < iVar16);
(E->cam_pos).vx = (&player)[pl].cameraPos.vx;
(E->cam_pos).vy = (&player)[pl].cameraPos.vy;
iVar16 = 0;
(E->cam_pos).vz = (&player)[pl].cameraPos.vz;
uVar17 = 0;
local_38 = (uint *)E->this;
if ((0 < EStags.envsnd_cnt) && ((int)local_54[0] < 0)) {
local_30 = auStack96;
do {
if ((ep->type != '\0') && (-0x1d4c < ep->vol)) {
iVar9 = (ep->pos2).vx;
iVar12 = (ep->pos).vx;
iVar13 = iVar9;
if (iVar12 < iVar9) {
iVar13 = iVar12;
}
puVar14 = (undefined *)((ep->vol + 0x1d4c) * 4);
puVar6 = puVar14;
if ((int)puVar14 < 0) {
puVar6 = (undefined *)0x0;
}
if (22000 < (int)puVar6) {
puVar6 = &DAT_000055f0;
}
iVar15 = (E->cam_pos).vx;
if (iVar13 - (int)puVar6 < iVar15) {
if (iVar9 < iVar12) {
iVar9 = iVar12;
}
puVar6 = puVar14;
if ((int)puVar14 < 0) {
puVar6 = (undefined *)0x0;
}
if (22000 < (int)puVar6) {
puVar6 = &DAT_000055f0;
}
if (iVar15 < (int)(puVar6 + iVar9)) {
iVar13 = (ep->pos2).vz;
iVar12 = (ep->pos).vz;
iVar9 = iVar13;
if (iVar12 < iVar13) {
iVar9 = iVar12;
}
puVar6 = puVar14;
if ((int)puVar14 < 0) {
puVar6 = (undefined *)0x0;
}
if (22000 < (int)puVar14) {
puVar6 = &DAT_000055f0;
}
iVar15 = (E->cam_pos).vz;
if (iVar9 - (int)puVar6 < iVar15) {
iVar9 = iVar13;
if (iVar13 < iVar12) {
iVar9 = iVar12;
}
iVar7 = (ep->vol + 0x1d4c) * 4;
iVar8 = iVar7;
if (iVar7 < 0) {
iVar8 = 0;
}
puVar6 = (undefined *)(iVar9 + iVar8);
if (22000 < iVar7) {
puVar6 = &DAT_000055f0 + iVar9;
}
if (iVar15 < (int)puVar6) {
if (((ep->type == '\x02') || (ep->type == '\x04')) && ((ep->flags & 3) == 0)) {
pfVar2 = local_54 + iVar16 + 1;
uVar3 = __floatsisf(iVar13 - iVar12);
iVar9 = (ep->pos).vx;
uVar4 = __floatsisf((ep->pos2).vx - iVar9);
fVar5 = (float)__divsf3(uVar3, uVar4);
lVar10 = (E->cam_pos).vx;
*pfVar2 = fVar5;
uVar3 = __floatsisf(lVar10);
uVar3 = __mulsf3(fVar5, uVar3);
uVar4 = __floatsisf(iVar9);
uVar4 = __mulsf3(fVar5, uVar4);
uVar3 = __subsf3(uVar3, uVar4);
uVar4 = __floatsisf(iVar15);
uVar3 = __subsf3(uVar3, uVar4);
uVar4 = __floatsisf(iVar12);
uVar3 = __addsf3(uVar3, uVar4);
uVar18 = __extendsfdf2(uVar3);
iVar9 = __fixunssfsi(*pfVar2);
iVar13 = __fixunssfsi(*pfVar2);
iVar9 = iVar9 * iVar13 + 1;
uVar19 = __floatsidf(iVar9);
if (iVar9 < 0) {
uVar19 = __adddf3((int)((ulonglong)uVar19 >> 0x20), (int)uVar19, 0, 0x41f00000);
}
sqrt(in_f12_13);
uVar19 = __divdf3((int)((ulonglong)uVar18 >> 0x20), (int)uVar18,
(int)((ulonglong)uVar19 >> 0x20), (int)uVar19);
uVar3 = __truncdfsf2((int)((ulonglong)uVar19 >> 0x20), (int)uVar19);
if (ep->type == '\x02') {
iVar9 = __gesf2(uVar3, 0);
if (iVar9 < 0) {
LAB_000511e8:
uVar3 = __negsf2(uVar3);
}
}
else {
if ((ep->flags & 8) != 0) goto LAB_000511e8;
}
puVar14 = (undefined *)((ep->vol + 0x1d4c) * 4);
puVar6 = puVar14;
if ((int)puVar14 < 0) {
puVar6 = (undefined *)0x0;
}
if (22000 < (int)puVar14) {
puVar6 = &DAT_000055f0;
}
uVar4 = __floatsisf(puVar6);
iVar9 = __ltsf2(uVar3, uVar4);
if (iVar9 < 0) {
iVar16 = iVar16 + 1;
*local_30 = uVar17;
local_30 = local_30 + 1;
}
}
else {
iVar16 = iVar16 + 1;
*local_30 = uVar17;
local_30 = local_30 + 1;
}
}
}
}
}
}
uVar17 = uVar17 + 1;
ep = ep + 1;
} while (((int)uVar17 < EStags.envsnd_cnt) && ((int)local_54[0] < 0));
}
iVar16 = 0;
puVar11 = local_34;
while (true) {
bVar1 = iVar16 < EStags.envsnd_cnt;
if (4 < EStags.envsnd_cnt) {
bVar1 = iVar16 < 4;
}
if (!bVar1) break;
uVar17 = *puVar11;
if (-1 < (int)uVar17) {
if ((int)uVar17 < 0x20) {
local_3c = local_3c | 1 << (uVar17 & 0x1f);
}
else {
local_40 = local_40 | 1 << (uVar17 - 0x20 & 0x1f);
}
}
puVar11 = puVar11 + 1;
iVar16 = iVar16 + 1;
}
iVar16 = 3;
puVar11 = local_38;
do {
uVar17 = *puVar11;
if (-1 < (int)uVar17) {
if ((int)uVar17 < 0x20) {
if ((local_3c & 1 << (uVar17 & 0x1f)) != 0) goto LAB_00051370;
*puVar11 = 0xffffffff;
}
else {
if ((local_40 & 1 << (uVar17 - 0x20 & 0x1f)) == 0) {
*puVar11 = 0xffffffff;
}
else {
LAB_00051370:
uVar17 = *puVar11;
if ((int)uVar17 < 0x20) {
local_3c = local_3c & ~(1 << (uVar17 & 0x1f));
}
else {
local_40 = local_40 & ~(1 << (uVar17 - 0x20 & 0x1f));
}
}
}
}
iVar16 = iVar16 + -1;
puVar11 = puVar11 + 1;
if (iVar16 < 0) {
iVar9 = 1;
iVar16 = 0;
do {
uVar17 = local_34[iVar16];
iVar13 = iVar9;
if (-1 < (int)uVar17) {
if ((int)uVar17 < 0x20) {
uVar17 = local_3c & 1 << (uVar17 & 0x1f);
}
else {
uVar17 = local_40 & 1 << (uVar17 - 0x20 & 0x1f);
}
if (uVar17 != 0) {
iVar9 = 0;
while (iVar13 = iVar16 + 1, iVar9 < 4) {
if ((int)local_38[iVar9] < 0) {
local_38[iVar9] = local_34[iVar16];
E->g[iVar9] = local_54[iVar16 + 1];
break;
}
iVar9 = iVar9 + 1;
}
}
}
iVar9 = iVar13 + 1;
iVar16 = iVar13;
if (3 < iVar13) {
return;
}
} while (true);
}
} while (true);
*/
}
// decompiled code
// original method signature:
// void /*$ra*/ CalcEffPos(struct __envsound *ep /*$s1*/, struct __envsoundinfo *E /*$a1*/, int pl /*$a2*/)
// line 1706, offset 0x000514bc
/* begin block 1 */
// Start line: 1707
// Start offset: 0x000514BC
// Variables:
// int j; // $t5
// int me; // $t2
/* end block 1 */
// End offset: 0x000517D0
// End Line: 1742
/* begin block 2 */
// Start line: 3903
/* end block 2 */
// End Line: 3904
/* begin block 3 */
// Start line: 3906
/* end block 3 */
// End Line: 3907
void CalcEffPos(__envsound *ep, __envsoundinfo *E, int pl)
{
UNIMPLEMENTED();
/*
bool bVar1;
VECTOR *pVVar2;
__envsoundinfo *p_Var3;
int iVar4;
__envsound *p_Var5;
int iVar6;
int *piVar7;
int iVar8;
int iVar9;
int iVar10;
__envsoundinfo *p_Var11;
int iVar12;
uint uVar13;
VECTOR *pVVar14;
VECTOR *pVVar15;
VECTOR *pVVar16;
__envsoundinfo *p_Var17;
uVar13 = 0;
iVar12 = 0;
pVVar15 = (VECTOR *)&E->eff_pos[0].vz;
p_Var3 = E;
p_Var11 = E;
pVVar14 = pVVar15;
pVVar16 = pVVar15;
p_Var17 = E;
do {
E->flags = E->flags & ~(1 << (uVar13 & 0x1f));
iVar10 = E->this[uVar13];
if (-1 < iVar10) {
p_Var5 = ep + iVar10;
if (p_Var5->type == '\x01') {
iVar4 = (p_Var5->pos2).vx;
iVar6 = (p_Var5->pos).vx;
iVar9 = iVar4;
if (iVar6 < iVar4) {
iVar9 = iVar6;
}
iVar8 = (E->cam_pos).vx;
if (iVar8 < iVar9) {
if (iVar6 < iVar4) {
iVar4 = iVar6;
}
p_Var17->eff_pos[0].vx = iVar4;
}
else {
iVar9 = iVar4;
if (iVar4 < iVar6) {
iVar9 = iVar6;
}
if (iVar9 < iVar8) {
if (iVar4 < iVar6) {
iVar4 = iVar6;
}
p_Var3->eff_pos[0].vx = iVar4;
}
else {
p_Var11->eff_pos[0].vx = iVar8;
}
}
p_Var5 = ep + iVar10;
iVar10 = (p_Var5->pos2).vz;
iVar4 = (p_Var5->pos).vz;
if (iVar4 < iVar10) {
iVar10 = iVar4;
}
iVar9 = (E->cam_pos).vz;
if (iVar9 < iVar10) {
iVar10 = (p_Var5->pos2).vz;
if (iVar4 < iVar10) {
iVar10 = iVar4;
}
pVVar14->vx = iVar10;
}
else {
iVar10 = (p_Var5->pos2).vz;
iVar6 = iVar10;
if (iVar10 < iVar4) {
iVar6 = iVar4;
}
if (iVar6 < iVar9) {
if (iVar10 < iVar4) {
iVar10 = iVar4;
}
pVVar16->vx = iVar10;
}
else {
p_Var11->eff_pos[0].vz = iVar9;
}
}
}
else {
if (p_Var5->type != '\x02') goto LAB_0005179c;
if ((p_Var5->flags & 1) == 0) {
if ((p_Var5->flags & 2) == 0) goto LAB_0005179c;
p_Var11->eff_pos[0].vz = (p_Var5->pos).vz;
iVar10 = (p_Var5->pos2).vx;
iVar4 = (p_Var5->pos).vx;
if (iVar4 < iVar10) {
iVar10 = iVar4;
}
iVar9 = (E->cam_pos).vx;
if (iVar10 <= iVar9) {
iVar6 = (p_Var5->pos2).vx;
iVar10 = iVar6;
if (iVar6 < iVar4) {
iVar10 = iVar4;
}
if (iVar9 <= iVar10) {
pVVar2 = E->eff_pos;
goto LAB_00051788;
}
pVVar2 = E->eff_pos;
goto LAB_0005176c;
}
iVar6 = (p_Var5->pos2).vx;
piVar7 = (int *)((int)&E->eff_pos[0].vx + iVar12);
bVar1 = iVar4 < iVar6;
}
else {
p_Var11->eff_pos[0].vx = (p_Var5->pos).vx;
iVar10 = (p_Var5->pos2).vz;
iVar4 = (p_Var5->pos).vz;
if (iVar4 < iVar10) {
iVar10 = iVar4;
}
iVar9 = (E->cam_pos).vz;
if (iVar9 < iVar10) {
iVar6 = (p_Var5->pos2).vz;
piVar7 = (int *)((int)&pVVar15->vx + iVar12);
bVar1 = iVar4 < iVar6;
}
else {
iVar6 = (p_Var5->pos2).vz;
iVar10 = iVar6;
if (iVar6 < iVar4) {
iVar10 = iVar4;
}
pVVar2 = pVVar15;
if (iVar9 <= iVar10) {
LAB_00051788:
*(int *)((int)&pVVar2->vx + iVar12) = iVar9;
goto LAB_0005178c;
}
LAB_0005176c:
piVar7 = (int *)((int)&pVVar2->vx + iVar12);
bVar1 = iVar6 < iVar4;
}
}
if (bVar1) {
iVar6 = iVar4;
}
*piVar7 = iVar6;
}
LAB_0005178c:
E->flags = E->flags | 1 << (uVar13 & 0x1f);
}
LAB_0005179c:
iVar12 = iVar12 + 0x10;
p_Var11 = (__envsoundinfo *)(p_Var11->eff_pos + 1);
pVVar16 = pVVar16 + 1;
pVVar14 = pVVar14 + 1;
p_Var3 = (__envsoundinfo *)(p_Var3->eff_pos + 1);
uVar13 = uVar13 + 1;
p_Var17 = (__envsoundinfo *)(p_Var17->eff_pos + 1);
if (3 < (int)uVar13) {
return;
}
} while (true);
*/
}
// decompiled code
// original method signature:
// void /*$ra*/ CalcEffPos2(struct __envsound *ep /*stack 0*/, struct __envsoundinfo *E /*$s7*/, int pl /*$a2*/)
// line 1744, offset 0x000517d0
/* begin block 1 */
// Start line: 1745
// Start offset: 0x000517D0
// Variables:
// int j; // stack offset -56
// int me; // $s5
/* begin block 1.1 */
// Start line: 1756
// Start offset: 0x000518D8
/* end block 1.1 */
// End offset: 0x000518D8
// End Line: 1756
/* end block 1 */
// End offset: 0x00051F0C
// End Line: 1810
/* begin block 2 */
// Start line: 4010
/* end block 2 */
// End Line: 4011
/* begin block 3 */
// Start line: 4013
/* end block 3 */
// End Line: 4014
void CalcEffPos2(__envsound *ep, __envsoundinfo *E, int pl)
{
UNIMPLEMENTED();
/*
bool bVar1;
int iVar2;
undefined4 uVar3;
undefined4 uVar4;
__envsound *p_Var5;
int iVar6;
int iVar7;
long lVar8;
uint uVar9;
int iVar10;
float *pfVar11;
undefined4 *puVar12;
undefined4 uVar13;
long *plVar14;
int *piVar15;
long lVar16;
__envsoundinfo *p_Var17;
int iVar18;
uint local_38;
int local_34;
int local_30;
local_38 = 0;
local_34 = 0;
local_30 = 0;
p_Var17 = E;
do {
iVar18 = *(int *)((int)E->this + local_30);
if ((-1 < iVar18) && (uVar9 = 1 << (local_38 & 0x1f), (E->flags & uVar9) == 0)) {
p_Var5 = ep + iVar18;
if ((p_Var5->type == '\x02') || (p_Var5->type == '\x04')) {
pfVar11 = E->g;
puVar12 = (undefined4 *)((int)pfVar11 + local_30);
iVar2 = __gesf2(*puVar12, 0);
if (iVar2 < 0) {
uVar3 = __negsf2(*puVar12);
iVar2 = __ltsf2(uVar3, 0x3f800000);
if (-1 < iVar2) goto LAB_000519c0;
LAB_000518d8:
uVar3 = __divsf3(0x3f800000, *(undefined4 *)((int)pfVar11 + local_30));
uVar4 = __floatsisf((E->cam_pos).vx);
uVar4 = __mulsf3(uVar4, uVar3);
p_Var5 = ep + iVar18;
uVar13 = __floatsisf((p_Var5->pos).vx);
uVar13 = __divsf3(uVar13, uVar3);
uVar4 = __addsf3(uVar4, uVar13);
uVar13 = __floatsisf((E->cam_pos).vz);
uVar4 = __addsf3(uVar4, uVar13);
uVar13 = __floatsisf((p_Var5->pos).vz);
uVar4 = __subsf3(uVar4, uVar13);
uVar13 = __divsf3(0x3f800000, uVar3);
uVar13 = __addsf3(uVar13, uVar3);
uVar4 = __divsf3(uVar4, uVar13);
iVar2 = __fixsfsi(uVar4);
p_Var17->eff_pos[0].vx = iVar2;
uVar4 = __floatsisf(iVar2 - (p_Var5->pos).vx);
uVar3 = __divsf3(uVar4, uVar3);
}
else {
iVar2 = __ltsf2(*puVar12, 0x3f800000);
if (iVar2 < 0) goto LAB_000518d8;
LAB_000519c0:
uVar3 = __floatsisf((E->cam_pos).vx);
uVar13 = *(undefined4 *)((int)pfVar11 + local_30);
uVar3 = __divsf3(uVar3, uVar13);
p_Var5 = ep + iVar18;
uVar4 = __floatsisf((p_Var5->pos).vx);
uVar4 = __mulsf3(uVar4, uVar13);
uVar3 = __addsf3(uVar3, uVar4);
uVar4 = __floatsisf((E->cam_pos).vz);
uVar3 = __addsf3(uVar3, uVar4);
uVar4 = __floatsisf((p_Var5->pos).vz);
uVar3 = __subsf3(uVar3, uVar4);
uVar4 = __divsf3(0x3f800000, uVar13);
uVar4 = __addsf3(uVar13, uVar4);
uVar3 = __divsf3(uVar3, uVar4);
iVar2 = __fixsfsi(uVar3);
p_Var17->eff_pos[0].vx = iVar2;
uVar3 = __floatsisf(iVar2 - (p_Var5->pos).vx);
uVar3 = __mulsf3(uVar3, *(undefined4 *)((int)pfVar11 + local_30));
}
plVar14 = &E->eff_pos[0].vz;
uVar4 = __floatsisf(ep[iVar18].pos.vz);
uVar3 = __addsf3(uVar3, uVar4);
uVar3 = __fixsfsi(uVar3);
*(undefined4 *)((int)plVar14 + local_34) = uVar3;
p_Var5 = ep + iVar18;
if (p_Var5->type == '\x02') {
iVar2 = (p_Var5->pos2).vx;
iVar7 = (p_Var5->pos).vx;
iVar6 = iVar2;
if (iVar2 < iVar7) {
iVar6 = iVar7;
}
iVar10 = p_Var17->eff_pos[0].vx;
if (iVar6 < iVar10) {
if (iVar2 < iVar7) {
iVar2 = iVar7;
}
p_Var17->eff_pos[0].vx = iVar2;
}
else {
iVar6 = iVar2;
if (iVar7 < iVar2) {
iVar6 = iVar7;
}
if (iVar10 < iVar6) {
if (iVar7 < iVar2) {
iVar2 = iVar7;
}
p_Var17->eff_pos[0].vx = iVar2;
}
}
p_Var5 = ep + iVar18;
iVar18 = (p_Var5->pos2).vz;
iVar2 = (p_Var5->pos).vz;
piVar15 = (int *)((int)plVar14 + local_34);
if (iVar18 < iVar2) {
iVar18 = iVar2;
}
if (iVar18 < *piVar15) {
iVar18 = (p_Var5->pos2).vz;
if (iVar18 < iVar2) {
iVar18 = iVar2;
}
*piVar15 = iVar18;
}
else {
iVar18 = (p_Var5->pos2).vz;
iVar6 = iVar18;
if (iVar2 < iVar18) {
iVar6 = iVar2;
}
if (*piVar15 < iVar6) {
if (iVar2 < iVar18) {
iVar18 = iVar2;
}
*piVar15 = iVar18;
}
}
E->flags = E->flags | 1 << (local_38 & 0x1f);
}
else {
if (p_Var5->type == '\x04') {
if ((p_Var5->flags & 8) == 0) {
iVar6 = (p_Var5->pos2).vz;
iVar7 = (p_Var5->pos).vz;
iVar2 = iVar6;
if (iVar6 < iVar7) {
iVar2 = iVar7;
}
iVar10 = (E->cam_pos).vz;
if (iVar2 < iVar10) {
iVar10 = iVar6;
if (iVar6 < iVar7) {
iVar10 = iVar7;
}
LAB_00051d80:
*(int *)((int)plVar14 + local_34) = iVar10;
}
else {
if (*(int *)((int)plVar14 + local_34) < iVar10) goto LAB_00051d80;
}
iVar2 = __ltsf2(*(undefined4 *)((int)pfVar11 + local_30), 0);
if (-1 < iVar2) goto LAB_00051df8;
p_Var5 = ep + iVar18;
iVar18 = (p_Var5->pos2).vx;
lVar8 = (p_Var5->pos).vx;
if (iVar18 < lVar8) {
iVar18 = lVar8;
}
iVar2 = (E->cam_pos).vx;
if (iVar18 < iVar2) {
lVar16 = (p_Var5->pos2).vx;
bVar1 = lVar16 < lVar8;
goto LAB_00051e40;
}
bVar1 = p_Var17->eff_pos[0].vx < iVar2;
LAB_00051e60:
if (bVar1) {
p_Var17->eff_pos[0].vx = iVar2;
}
}
else {
iVar6 = (p_Var5->pos2).vz;
iVar7 = (p_Var5->pos).vz;
iVar2 = iVar6;
if (iVar7 < iVar6) {
iVar2 = iVar7;
}
iVar10 = (E->cam_pos).vz;
if (iVar10 < iVar2) {
iVar10 = iVar6;
if (iVar7 < iVar6) {
iVar10 = iVar7;
}
LAB_00051c98:
*(int *)((int)plVar14 + local_34) = iVar10;
}
else {
if (iVar10 < *(int *)((int)plVar14 + local_34)) goto LAB_00051c98;
}
iVar2 = __gtsf2(*(undefined4 *)((int)pfVar11 + local_30), 0);
if (iVar2 < 1) {
LAB_00051df8:
p_Var5 = ep + iVar18;
iVar18 = (p_Var5->pos2).vx;
lVar8 = (p_Var5->pos).vx;
if (lVar8 < iVar18) {
iVar18 = lVar8;
}
iVar2 = (E->cam_pos).vx;
if (iVar18 <= iVar2) {
bVar1 = iVar2 < p_Var17->eff_pos[0].vx;
goto LAB_00051e60;
}
lVar16 = (p_Var5->pos2).vx;
bVar1 = lVar8 < lVar16;
}
else {
p_Var5 = ep + iVar18;
iVar18 = (p_Var5->pos2).vx;
lVar8 = (p_Var5->pos).vx;
if (iVar18 < lVar8) {
iVar18 = lVar8;
}
iVar2 = (E->cam_pos).vx;
if (iVar2 <= iVar18) {
bVar1 = p_Var17->eff_pos[0].vx < iVar2;
goto LAB_00051e60;
}
lVar16 = (p_Var5->pos2).vx;
bVar1 = lVar16 < lVar8;
}
LAB_00051e40:
if (bVar1) {
lVar16 = lVar8;
}
p_Var17->eff_pos[0].vx = lVar16;
}
}
}
}
else {
p_Var17->eff_pos[0].vx = (p_Var5->pos).vx;
*(long *)((int)&E->eff_pos[0].vz + local_34) = (p_Var5->pos).vz;
E->flags = E->flags | uVar9;
}
}
p_Var17 = (__envsoundinfo *)(p_Var17->eff_pos + 1);
local_30 = local_30 + 4;
local_38 = local_38 + 1;
*(int *)((int)&E->eff_pos[0].vy + local_34) = -(E->cam_pos).vy;
local_34 = local_34 + 0x10;
if (3 < (int)local_38) {
return;
}
} while (true);
*/
}
// decompiled code
// original method signature:
// void /*$ra*/ UpdateEnvSnd(struct __envsound *ep /*stack 0*/, struct __envsoundinfo *E /*$s4*/, int pl /*stack 8*/)
// line 1812, offset 0x00051f0c
/* begin block 1 */
// Start line: 1813
// Start offset: 0x00051F0C
// Variables:
// int i; // stack offset -48
/* end block 1 */
// End offset: 0x00052168
// End Line: 1841
/* begin block 2 */
// Start line: 4442
/* end block 2 */
// End Line: 4443
/* begin block 3 */
// Start line: 4445
/* end block 3 */
// End Line: 4446
void UpdateEnvSnd(__envsound *ep, __envsoundinfo *E, int pl)
{
UNIMPLEMENTED();
/*
int iVar1;
int channel;
long *velocity;
int *piVar2;
int *piVar3;
int *piVar4;
int iVar5;
__envsoundinfo *p_Var6;
__envsoundinfo *position;
int local_30;
int local_2c;
piVar3 = E->this;
iVar5 = 0;
piVar4 = E->playing_sound;
local_2c = 0;
local_30 = 3;
p_Var6 = E;
position = E;
do {
channel = *piVar3;
if (channel < 0) {
if (-1 < *piVar4) {
piVar2 = (int *)((int)E->chan + iVar5);
StopChannel(*piVar2);
UnlockChannel(*piVar2);
*piVar4 = -1;
}
}
else {
if (*piVar4 != channel) {
iVar1 = (int)&E->eff_pos[0].vx + local_2c;
channel = Start3DSoundVolPitch
(-1, ep[channel].bank, ep[channel].sample, p_Var6->eff_pos[0].vx,
*(int *)(iVar1 + 4), *(int *)(iVar1 + 8), 0, 0x1000);
piVar2 = (int *)((int)E->chan + iVar5);
*piVar2 = channel;
LockChannel(channel);
if ((1 < NumPlayers) && (NoPlayerControl == 0)) {
SetPlayerOwnsChannel(*piVar2, (char)pl);
}
*(int *)((int)E->playing_sound + iVar5) = *piVar3;
}
if ((ep[*piVar3].flags & 0x10) == 0) {
velocity = (long *)0x0;
}
else {
velocity = (&player)[pl].camera_vel;
}
SetChannelPosition3(*(int *)((int)E->chan + iVar5), (VECTOR *)position, velocity,
ep[*piVar3].vol + -0x9c4, 0x1000, (uint)ep[*piVar3].flags & 0x20);
}
piVar3 = piVar3 + 1;
position = (__envsoundinfo *)(position->eff_pos + 1);
piVar4 = piVar4 + 1;
iVar5 = iVar5 + 4;
p_Var6 = (__envsoundinfo *)(p_Var6->eff_pos + 1);
local_2c = local_2c + 0x10;
local_30 = local_30 + -1;
} while (-1 < local_30);
return;
*/
}
// decompiled code
// original method signature:
// void /*$ra*/ InitLeadHorn()
// line 1852, offset 0x00052948
/* begin block 1 */
// Start line: 7797
/* end block 1 */
// End Line: 7798
/* WARNING: Unknown calling convention yet parameter storage is locked */
unsigned int horn_time;
void InitLeadHorn(void)
{
horn_time = 0;
return;
}
// decompiled code
// original method signature:
// void /*$ra*/ LeadHorn(struct _CAR_DATA *cp /*$s0*/)
// line 1855, offset 0x00052954
/* begin block 1 */
// Start line: 1856
// Start offset: 0x00052954
// Variables:
// static unsigned int rnd; // offset 0x8
/* end block 1 */
// End offset: 0x00052A28
// End Line: 1867
/* begin block 2 */
// Start line: 7803
/* end block 2 */
// End Line: 7804
/* begin block 3 */
// Start line: 7805
/* end block 3 */
// End Line: 7806
void LeadHorn(_CAR_DATA *cp)
{
UNIMPLEMENTED();
/*
byte bVar1;
uint uVar2;
if (horn_time == 0) {
rnd_139 = ((cp->hd).where.t[0] ^ (cp->hd).where.t[2]) * (FrameCnt ^ (cp->hd).where.t[1]) & 0x7f;
}
horn_time = horn_time + 1;
if (horn_time == rnd_139) {
bVar1 = (cp->ap).model;
if (bVar1 == 4) {
uVar2 = ResidentModelsBodge();
}
else {
if (bVar1 < 3) {
uVar2 = (uint)(byte)(cp->ap).model;
}
else {
uVar2 = (uint)(byte)(cp->ap).model - 1;
}
}
Start3DTrackingSound(-1, 3, uVar2 * 3 + 2, (VECTOR *)(cp->hd).where.t, (long *)(cp->st + 0x1c));
horn_time = 0;
}
return;
*/
}