2020-03-27 21:47:29 +01:00
# include "THISDUST.H"
# include "GAMESND.H"
# include "LIBSPU.H"
# include "SOUND.H"
2020-04-04 15:42:29 +02:00
# include "SYSTEM.H"
2020-03-27 21:47:29 +01:00
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
2020-04-04 15:42:29 +02:00
char _sbank_buffer [ 0x50000 ] ; // 0x180000
// [D]
2020-03-27 21:47:29 +01:00
void LoadBankFromLump ( int bank , int lump )
{
2020-04-04 15:42:29 +02:00
static unsigned int blockLimit [ 73 ] = { 0 } ;
int size ;
char * name ;
name = " SOUND \\ VOICES2.BLK " ;
2020-03-27 21:47:29 +01:00
2020-04-04 15:42:29 +02:00
if ( blockLimit [ 1 ] = = 0 )
{
LoadfileSeg ( name , ( char * ) blockLimit , 0 , sizeof ( blockLimit ) ) ;
2020-03-27 21:47:29 +01:00
}
2020-04-04 15:42:29 +02:00
size = blockLimit [ lump + 1 ] - blockLimit [ lump ] ;
LoadfileSeg ( name , _sbank_buffer , blockLimit [ lump ] , size ) ;
LoadSoundBankDynamic ( _sbank_buffer , size , bank ) ;
2020-03-27 21:47:29 +01:00
}
// 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 ;
*/
}