2014-05-25 19:40:11 +02:00
/*****************************************************************************
* Copyright ( c ) 2014 Ted John
* OpenRCT2 , an open source clone of Roller Coaster Tycoon 2.
*
* This file is part of OpenRCT2 .
*
* OpenRCT2 is free software : you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation , either version 3 of the License , or
* ( at your option ) any later version .
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
* You should have received a copy of the GNU General Public License
* along with this program . If not , see < http : //www.gnu.org/licenses/>.
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2014-10-06 18:36:58 +02:00
# include "../addresses.h"
# include "../audio/audio.h"
2014-10-07 20:10:16 +02:00
# include "../audio/mixer.h"
2014-10-06 18:36:58 +02:00
# include "../interface/viewport.h"
# include "../world/sprite.h"
2014-09-13 19:51:58 +02:00
# include "ride.h"
2014-05-25 19:40:11 +02:00
# include "vehicle.h"
static void vehicle_update ( rct_vehicle * vehicle ) ;
2014-09-13 19:51:58 +02:00
/**
*
* rct2 : 0x006BB9FF
*/
2014-10-07 04:21:55 +02:00
void vehicle_update_sound_params ( rct_vehicle * vehicle )
2014-09-13 19:51:58 +02:00
{
if ( ! ( RCT2_GLOBAL ( RCT2_ADDRESS_SCREEN_FLAGS , uint8 ) & 2 ) & & ( ! ( RCT2_GLOBAL ( RCT2_ADDRESS_SCREEN_FLAGS , uint8 ) & 4 ) | | RCT2_GLOBAL ( 0x0141F570 , uint8 ) = = 6 ) ) {
2014-10-07 04:21:55 +02:00
if ( vehicle - > sound1_id ! = ( uint8 ) - 1 | | vehicle - > sound2_id ! = ( uint8 ) - 1 ) {
2014-09-13 19:51:58 +02:00
if ( vehicle - > var_16 . width ! = 0x8000 ) {
RCT2_GLOBAL ( 0x009AF5A0 , rct_widthheight ) = vehicle - > var_16 ;
RCT2_GLOBAL ( 0x009AF5A4 , rct_widthheight ) = vehicle - > view ;
sint16 v4 = RCT2_GLOBAL ( 0x00F438A4 , rct_viewport * ) - > view_x ;
sint16 v5 = RCT2_GLOBAL ( 0x00F438A4 , rct_viewport * ) - > view_y ;
sint16 v6 = RCT2_GLOBAL ( 0x00F438A4 , rct_viewport * ) - > view_width / 4 ;
sint16 v7 = RCT2_GLOBAL ( 0x00F438A4 , rct_viewport * ) - > view_height / 4 ;
if ( ! RCT2_GLOBAL ( 0x00F438A8 , rct_window * ) - > classification ) {
v4 - = v6 ;
v5 - = v7 ;
}
if ( v4 < RCT2_GLOBAL ( 0x009AF5A4 , rct_widthheight ) . width & & v5 < RCT2_GLOBAL ( 0x009AF5A4 , rct_widthheight ) . height ) {
sint16 t8 = RCT2_GLOBAL ( 0x00F438A4 , rct_viewport * ) - > view_width + v4 ;
sint16 t9 = RCT2_GLOBAL ( 0x00F438A4 , rct_viewport * ) - > view_height + v5 ;
if ( ! RCT2_GLOBAL ( 0x00F438A8 , rct_window * ) - > classification ) {
t8 + = v6 + v6 ;
t9 + = v7 + v7 ;
}
if ( t8 > = RCT2_GLOBAL ( 0x009AF5A0 , rct_widthheight ) . width & & t9 > = RCT2_GLOBAL ( 0x009AF5A0 , rct_widthheight ) . height ) {
uint16 v9 = sub_6BC2F3 ( vehicle ) ;
2014-10-07 04:21:55 +02:00
rct_vehicle_sound_params * i ;
//for (i = RCT2_ADDRESS(0x00F438B4, rct_vehicle_sound_params); i < RCT2_GLOBAL(0x00F438B0, rct_vehicle_sound_params*) && v9 <= i->var_A; i++);
for ( i = & gVehicleSoundParamsList [ 0 ] ; i < gVehicleSoundParamsListEnd & & v9 < = i - > var_A ; i + + ) ;
//if (i < RCT2_ADDRESS(0x00F43908, rct_vehicle_sound_params)) { // 0x00F43908 is end of rct_vehicle_sound_params list, which has 7 elements, not to be confused with variable at 0x00F43908
if ( i < & gVehicleSoundParamsList [ countof ( gVehicleSoundParamsList ) ] ) {
//if (RCT2_GLOBAL(0x00F438B0, rct_vehicle_sound_params*) < RCT2_ADDRESS(0x00F43908, rct_vehicle_sound_params)) {
// RCT2_GLOBAL(0x00F438B0, rct_vehicle_sound_params*)++;
//}
if ( gVehicleSoundParamsListEnd < & gVehicleSoundParamsList [ countof ( gVehicleSoundParamsList ) ] ) {
gVehicleSoundParamsListEnd + + ;
2014-09-13 19:51:58 +02:00
}
2014-10-07 04:21:55 +02:00
//rct_vehicle_sound_params* j = RCT2_GLOBAL(0x00F438B0, rct_vehicle_sound_params*) - 1;
rct_vehicle_sound_params * j = gVehicleSoundParamsListEnd - 1 ;
2014-09-13 19:51:58 +02:00
while ( j > = i ) {
j - - ;
2014-09-15 23:12:25 +02:00
* ( j + 1 ) = * j ;
2014-09-13 19:51:58 +02:00
}
2014-09-22 20:35:47 +02:00
i - > var_A = v9 ;
2014-09-13 19:51:58 +02:00
rct_widthheight v12 ;
v12 . height = vehicle - > var_16 . height ;
v12 . width = ( ( uint16 ) RCT2_GLOBAL ( 0x009AF5A0 , rct_widthheight ) . width / 2 ) + ( ( uint16 ) RCT2_GLOBAL ( 0x009AF5A4 , rct_widthheight ) . width / 2 ) - RCT2_GLOBAL ( 0x00F438A4 , rct_viewport * ) - > view_x ;
v12 . width > > = RCT2_GLOBAL ( 0x00F438A4 , rct_viewport * ) - > zoom ;
v12 . width + = RCT2_GLOBAL ( 0x00F438A4 , rct_viewport * ) - > x ;
uint16 v14 = RCT2_GLOBAL ( RCT2_ADDRESS_SCREEN_WIDTH , uint16 ) ;
if ( v14 < 64 ) {
v14 = 64 ;
}
rct_widthheight v15 ;
2014-09-15 23:12:25 +02:00
i - > pan = ( ( ( ( ( uint32 ) v12 . width < < 16 ) / v14 ) - 0x8000 ) > > 4 ) ;
2014-09-13 19:51:58 +02:00
v15 . width = 0 ;
v15 . height = ( RCT2_GLOBAL ( 0x009AF5A0 , rct_widthheight ) . height / 2 ) + ( RCT2_GLOBAL ( 0x009AF5A4 , rct_widthheight ) . height / 2 ) - RCT2_GLOBAL ( 0x00F438A4 , rct_viewport * ) - > view_y ;
v15 . height > > = RCT2_GLOBAL ( 0x00F438A4 , rct_viewport * ) - > zoom ;
v15 . height + = RCT2_GLOBAL ( 0x00F438A4 , rct_viewport * ) - > y ;
uint16 v18 = RCT2_GLOBAL ( RCT2_ADDRESS_SCREEN_HEIGHT , uint16 ) ;
if ( v18 < 64 ) {
v18 = 64 ;
}
2014-09-15 23:12:25 +02:00
i - > var_4 = ( sint16 ) ( ( ( v15 . both / v18 ) - 0x8000 ) > > 4 ) ;
2014-09-19 23:17:14 +02:00
sint32 v19 = vehicle - > velocity ;
2014-09-13 19:51:58 +02:00
int testaddr = ( vehicle - > var_31 * 0x65 ) ;
testaddr + = ( int ) RCT2_ADDRESS ( 0x009ACFA4 , rct_ride_type * ) [ vehicle - > var_D6 ] ;
uint8 test = ( ( uint8 * ) testaddr ) [ 0x74 ] ;
if ( test & 1 ) {
v19 * = 2 ;
}
if ( v19 < 0 ) {
v19 = - v19 ;
}
v19 > > = 5 ;
2014-10-07 04:21:55 +02:00
v19 * = 5512 ;
2014-09-13 19:51:58 +02:00
v19 > > = 14 ;
2014-10-07 04:21:55 +02:00
v19 + = 11025 ;
2014-09-13 19:51:58 +02:00
v19 + = 16 * vehicle - > var_BF ;
i - > frequency = ( uint16 ) v19 ;
i - > id = vehicle - > sprite_index ;
i - > var_8 = 0 ;
if ( vehicle - > x ! = 0x8000 ) {
uint16 v22 = ( vehicle - > y & 0xFFE0 ) < < 8 ;
v22 | = ( vehicle - > x & 0xFFE0 | v22 ) & 0xFFFF ;
rct_map_element * map_element ;
for ( map_element = RCT2_ADDRESS ( RCT2_ADDRESS_TILE_MAP_ELEMENT_POINTERS , rct_map_element * ) [ v22 > > 3 ] ; map_element - > type & MAP_ELEMENT_TYPE_MASK ; map_element + + ) ;
if ( map_element - > base_height * 8 > vehicle - > z ) {
i - > var_8 = 0x30 ;
}
}
}
}
}
}
}
}
}
/**
*
* rct2 : 0x006BC2F3
*/
int sub_6BC2F3 ( rct_vehicle * vehicle )
{
int result = 0 ;
rct_vehicle * vehicle_temp = vehicle ;
do {
result + = vehicle_temp - > var_46 ;
} while ( vehicle_temp - > next_vehicle_on_train ! = ( uint16 ) - 1 & & ( vehicle_temp = GET_VEHICLE ( vehicle_temp - > next_vehicle_on_train ) ) ) ;
2014-09-19 23:17:14 +02:00
sint32 v4 = vehicle - > velocity ;
2014-09-13 19:51:58 +02:00
if ( v4 < 0 ) {
v4 = - v4 ;
}
result + = ( ( uint16 ) v4 ) > > 13 ;
2014-10-07 04:21:55 +02:00
rct_vehicle_sound * vehicle_sound = & gVehicleSoundList [ 0 ] ; //RCT2_ADDRESS(RCT2_ADDRESS_VEHICLE_SOUND_LIST, rct_vehicle_sound);
2014-09-13 19:51:58 +02:00
while ( vehicle_sound - > id ! = vehicle - > sprite_index ) {
vehicle_sound + + ;
2014-10-07 04:21:55 +02:00
//if (vehicle_sound >= RCT2_GLOBAL(0x009AF42C, rct_vehicle_sound*)) {
if ( vehicle_sound > = & gVehicleSoundList [ countof ( gVehicleSoundList ) ] ) {
2014-09-13 19:51:58 +02:00
return result ;
}
}
return result + 300 ;
}
2014-09-15 23:12:25 +02:00
/**
*
* rct2 : 0x006BBC6B
*/
void vehicle_sounds_update ( )
{
if ( RCT2_GLOBAL ( RCT2_ADDRESS_CURRENT_SOUND_DEVICE , uint32 ) ! = - 1 & & ! RCT2_GLOBAL ( 0x009AF59C , uint8 ) & & RCT2_GLOBAL ( 0x009AF59D , uint8 ) & 1 ) {
RCT2_GLOBAL ( 0x00F438A4 , rct_viewport * ) = ( rct_viewport * ) - 1 ;
rct_window * window = RCT2_GLOBAL ( RCT2_ADDRESS_NEW_WINDOW_PTR , rct_window * ) ;
rct_viewport * viewport = ( rct_viewport * ) - 1 ;
for ( window = RCT2_GLOBAL ( RCT2_ADDRESS_NEW_WINDOW_PTR , rct_window * ) ; window > = RCT2_ADDRESS ( RCT2_ADDRESS_WINDOW_LIST , rct_window ) ; window - - ) {
viewport = window - > viewport ;
if ( viewport & & viewport - > flags & VIEWPORT_FLAG_SOUND_ON ) {
break ;
}
}
RCT2_GLOBAL ( 0x00F438A4 , rct_viewport * ) = viewport ;
if ( viewport ! = ( rct_viewport * ) - 1 ) {
if ( window ) {
RCT2_GLOBAL ( 0x00F438A8 , rct_window * ) = window ;
2014-10-04 00:28:39 +02:00
RCT2_GLOBAL ( RCT2_ADDRESS_VOLUME_ADJUST_ZOOM , uint8 ) = 0 ;
2014-09-15 23:12:25 +02:00
if ( viewport - > zoom ) {
2014-10-04 00:28:39 +02:00
RCT2_GLOBAL ( RCT2_ADDRESS_VOLUME_ADJUST_ZOOM , uint8 ) = 35 ;
2014-09-15 23:12:25 +02:00
if ( viewport - > zoom ! = 1 ) {
2014-10-04 00:28:39 +02:00
RCT2_GLOBAL ( RCT2_ADDRESS_VOLUME_ADJUST_ZOOM , uint8 ) = 70 ;
2014-09-15 23:12:25 +02:00
}
}
}
//label12:
2014-10-07 04:21:55 +02:00
//RCT2_GLOBAL(0x00F438B0, rct_vehicle_sound_params**) = &RCT2_GLOBAL(0x00F438B4, rct_vehicle_sound_params*);
gVehicleSoundParamsListEnd = & gVehicleSoundParamsList [ 0 ] ;
2014-09-15 23:12:25 +02:00
for ( uint16 i = RCT2_GLOBAL ( RCT2_ADDRESS_SPRITES_START_VEHICLE , uint16 ) ; i ! = SPRITE_INDEX_NULL ; i = g_sprite_list [ i ] . vehicle . next ) {
2014-10-07 04:21:55 +02:00
vehicle_update_sound_params ( & g_sprite_list [ i ] . vehicle ) ;
2014-09-15 23:12:25 +02:00
}
2014-10-07 04:21:55 +02:00
//printf("vehicle sounds: %d\n", (gVehicleSoundParamsListEnd - &gVehicleSoundParamsList[0]));
//RCT2_ADDRESS_VEHICLE_SOUND_LIST;
//for (rct_vehicle_sound* vehicle_sound = &RCT2_GLOBAL(RCT2_ADDRESS_VEHICLE_SOUND_LIST, rct_vehicle_sound); vehicle_sound != &RCT2_GLOBAL(0x009AF42C, rct_vehicle_sound); vehicle_sound++) {
for ( int i = 0 ; i < countof ( gVehicleSoundList ) ; i + + ) {
rct_vehicle_sound * vehicle_sound = & gVehicleSoundList [ i ] ;
2014-09-15 23:12:25 +02:00
if ( vehicle_sound - > id ! = ( uint16 ) - 1 ) {
2014-10-07 04:21:55 +02:00
//for (rct_vehicle_sound_params* vehicle_sound_params = &RCT2_GLOBAL(0x00F438B4, rct_vehicle_sound_params); vehicle_sound_params != RCT2_GLOBAL(0x00F438B0, rct_vehicle_sound_params*); vehicle_sound_params++) {
for ( rct_vehicle_sound_params * vehicle_sound_params = & gVehicleSoundParamsList [ 0 ] ; vehicle_sound_params ! = gVehicleSoundParamsListEnd ; vehicle_sound_params + + ) {
if ( vehicle_sound - > id = = vehicle_sound_params - > id ) {
2014-09-15 23:12:25 +02:00
goto label26 ;
}
}
if ( vehicle_sound - > sound1_id ! = ( uint16 ) - 1 ) {
2014-10-07 04:21:55 +02:00
# ifdef USE_MIXER
Mixer_Stop_Channel ( vehicle_sound - > sound1_channel ) ;
# else
2014-09-15 23:12:25 +02:00
RCT2_GLOBAL ( 0x014241BC , uint32 ) = 1 ;
sound_stop ( & vehicle_sound - > sound1 ) ;
RCT2_GLOBAL ( 0x014241BC , uint32 ) = 0 ;
2014-10-07 04:21:55 +02:00
# endif
2014-09-15 23:12:25 +02:00
}
if ( vehicle_sound - > sound2_id ! = ( uint16 ) - 1 ) {
2014-10-07 04:21:55 +02:00
# ifdef USE_MIXER
Mixer_Stop_Channel ( vehicle_sound - > sound2_channel ) ;
# else
2014-09-15 23:12:25 +02:00
RCT2_GLOBAL ( 0x014241BC , uint32 ) = 1 ;
sound_stop ( & vehicle_sound - > sound2 ) ;
RCT2_GLOBAL ( 0x014241BC , uint32 ) = 0 ;
2014-10-07 04:21:55 +02:00
# endif
2014-09-15 23:12:25 +02:00
}
vehicle_sound - > id = ( uint16 ) - 1 ;
}
label26 :
1 ;
}
2014-10-07 04:21:55 +02:00
//for (rct_vehicle_sound_params* vehicle_sound_params = &RCT2_GLOBAL(0x00F438B4, rct_vehicle_sound_params); ; vehicle_sound_params++) {
for ( rct_vehicle_sound_params * vehicle_sound_params = & gVehicleSoundParamsList [ 0 ] ; ; vehicle_sound_params + + ) {
2014-09-22 20:35:47 +02:00
label28 :
2014-10-07 04:21:55 +02:00
//if (vehicle_sound_params >= RCT2_GLOBAL(0x00F438B0, rct_vehicle_sound_params*)) {
if ( vehicle_sound_params > = gVehicleSoundParamsListEnd ) {
2014-09-22 20:35:47 +02:00
return ;
}
2014-10-04 00:28:39 +02:00
uint8 vol1 = 0xFF ;
uint8 vol2 = 0xFF ;
2014-10-07 04:21:55 +02:00
sint16 v = vehicle_sound_params - > var_4 ;
2014-09-15 23:12:25 +02:00
if ( v < 0 ) {
v = - v ;
}
if ( v > 0xFFF ) {
v = 0xFFF ;
}
v - = 0x800 ;
if ( v > 0 ) {
v - = 0x400 ;
v = - v ;
2014-09-15 23:19:12 +02:00
v = ( uint16 ) v / 4 ;
2014-10-04 00:28:39 +02:00
vol1 = LOBYTE ( v ) ;
2014-09-15 23:12:25 +02:00
if ( HIBYTE ( v ) ! = 0 ) {
2014-10-04 00:28:39 +02:00
vol1 = 0xFF ;
2014-09-15 23:12:25 +02:00
if ( HIBYTE ( v ) < 0 ) {
2014-10-04 00:28:39 +02:00
vol1 = 0 ;
2014-09-15 23:12:25 +02:00
}
}
}
2014-10-07 04:21:55 +02:00
sint16 w = vehicle_sound_params - > pan ;
2014-09-15 23:12:25 +02:00
if ( w < 0 ) {
w = - w ;
}
if ( w > 0xFFF ) {
w = 0xFFF ;
}
w - = 0x800 ;
if ( w > 0 ) {
w - = 0x400 ;
w = - w ;
2014-09-15 23:19:12 +02:00
w = ( uint16 ) w / 4 ;
2014-10-04 00:28:39 +02:00
vol2 = LOBYTE ( w ) ;
2014-09-15 23:12:25 +02:00
if ( HIBYTE ( w ) ! = 0 ) {
2014-10-04 00:28:39 +02:00
vol2 = 0xFF ;
2014-09-15 23:12:25 +02:00
if ( HIBYTE ( w ) < 0 ) {
2014-10-04 00:28:39 +02:00
vol2 = 0 ;
2014-09-15 23:12:25 +02:00
}
}
}
2014-10-04 00:28:39 +02:00
if ( vol1 > = vol2 ) {
vol1 = vol2 ;
2014-09-15 23:12:25 +02:00
}
2014-10-04 00:28:39 +02:00
if ( vol1 < RCT2_GLOBAL ( RCT2_ADDRESS_VOLUME_ADJUST_ZOOM , uint8 ) ) {
vol1 = 0 ;
2014-09-19 04:48:04 +02:00
} else {
2014-10-04 00:28:39 +02:00
vol1 = vol1 - RCT2_GLOBAL ( RCT2_ADDRESS_VOLUME_ADJUST_ZOOM , uint8 ) ;
2014-09-15 23:12:25 +02:00
}
2014-10-07 04:21:55 +02:00
rct_vehicle_sound * vehicle_sound = & gVehicleSoundList [ 0 ] ; //&RCT2_GLOBAL(RCT2_ADDRESS_VEHICLE_SOUND_LIST, rct_vehicle_sound);
while ( vehicle_sound_params - > id ! = vehicle_sound - > id ) {
2014-09-15 23:12:25 +02:00
vehicle_sound + + ;
2014-10-07 04:21:55 +02:00
//if (vehicle_sound >= &RCT2_GLOBAL(0x009AF42C, rct_vehicle_sound)) {
if ( vehicle_sound > = & gVehicleSoundList [ countof ( gVehicleSoundList ) ] ) {
vehicle_sound = & gVehicleSoundList [ 0 ] ; //&RCT2_GLOBAL(RCT2_ADDRESS_VEHICLE_SOUND_LIST, rct_vehicle_sound);
2014-09-15 23:12:25 +02:00
int i = 0 ;
while ( vehicle_sound - > id ! = ( uint16 ) - 1 ) {
vehicle_sound + + ;
i + + ;
2014-10-07 04:21:55 +02:00
if ( i > = countof ( gVehicleSoundList ) /*RCT2_GLOBAL(0x009AAC75, uint8)*/ ) {
vehicle_sound_params = ( rct_vehicle_sound_params * ) ( ( int ) vehicle_sound_params + 10 ) ;
2014-09-15 23:12:25 +02:00
goto label28 ;
}
}
2014-10-07 04:21:55 +02:00
vehicle_sound - > id = vehicle_sound_params - > id ;
2014-09-15 23:12:25 +02:00
vehicle_sound - > sound1_id = ( uint16 ) - 1 ;
vehicle_sound - > sound2_id = ( uint16 ) - 1 ;
vehicle_sound - > var_2 = 0x30 ;
break ;
}
}
2014-10-07 04:21:55 +02:00
uint8 v21 = vehicle_sound_params - > var_8 & 0xFF ;
uint8 v22 = vehicle_sound - > var_2 & 0xFF ;
2014-09-15 23:12:25 +02:00
if ( v22 ! = v21 ) {
if ( v22 < v21 ) {
v22 + = 4 ;
} else {
v22 - = 4 ;
}
}
vehicle_sound - > var_2 = v22 ;
2014-10-04 00:28:39 +02:00
if ( vol1 < v22 ) {
vol1 = 0 ;
2014-09-19 04:48:04 +02:00
} else {
2014-10-04 00:28:39 +02:00
vol1 = vol1 - v22 ;
2014-09-15 23:12:25 +02:00
}
// do sound1 stuff, track noise
2014-10-07 04:21:55 +02:00
rct_sprite * sprite = & g_sprite_list [ vehicle_sound_params - > id ] ;
sint16 volume = sprite - > vehicle . sound1_volume ;
2014-10-04 00:28:39 +02:00
volume * = vol1 ;
2014-09-15 23:19:12 +02:00
volume = ( uint16 ) volume / 8 ;
2014-09-15 23:12:25 +02:00
volume - = 0x1FFF ;
if ( volume < - 10000 ) {
volume = - 10000 ;
}
2014-10-07 04:21:55 +02:00
if ( sprite - > vehicle . sound1_id = = ( uint8 ) - 1 ) {
2014-09-15 23:12:25 +02:00
if ( vehicle_sound - > sound1_id ! = ( uint16 ) - 1 ) {
vehicle_sound - > sound1_id = - 1 ;
2014-10-07 04:21:55 +02:00
# ifdef USE_MIXER
Mixer_Stop_Channel ( vehicle_sound - > sound1_channel ) ;
# else
2014-09-15 23:12:25 +02:00
RCT2_GLOBAL ( 0x014241BC , uint32 ) = 1 ;
sound_stop ( & vehicle_sound - > sound1 ) ;
RCT2_GLOBAL ( 0x014241BC , uint32 ) = 0 ;
2014-10-07 04:21:55 +02:00
# endif
2014-09-15 23:12:25 +02:00
}
} else {
if ( vehicle_sound - > sound1_id = = ( uint16 ) - 1 ) {
goto label69 ;
}
2014-10-07 04:21:55 +02:00
if ( sprite - > vehicle . sound1_id ! = vehicle_sound - > sound1_id ) {
# ifdef USE_MIXER
Mixer_Stop_Channel ( vehicle_sound - > sound1_channel ) ;
# else
2014-09-15 23:12:25 +02:00
RCT2_GLOBAL ( 0x014241BC , uint32 ) = 1 ;
sound_stop ( & vehicle_sound - > sound1 ) ;
RCT2_GLOBAL ( 0x014241BC , uint32 ) = 0 ;
2014-10-07 04:21:55 +02:00
# endif
2014-09-15 23:12:25 +02:00
label69 :
2014-10-07 04:21:55 +02:00
vehicle_sound - > sound1_id = sprite - > vehicle . sound1_id ;
# ifndef USE_MIXER
2014-09-15 23:12:25 +02:00
RCT2_GLOBAL ( 0x014241BC , uint32 ) = 1 ;
2014-10-07 20:16:17 +02:00
sound_prepare ( sprite - > vehicle . sound1_id , & vehicle_sound - > sound1 , 1 , RCT2_GLOBAL ( RCT2_ADDRESS_CONFIG_SOUND_SW_BUFFER , uint32 ) ) ;
2014-09-15 23:12:25 +02:00
RCT2_GLOBAL ( 0x014241BC , uint32 ) = 0 ;
2014-10-07 04:21:55 +02:00
# endif
vehicle_sound - > sound1_pan = vehicle_sound_params - > pan ;
2014-09-15 23:12:25 +02:00
vehicle_sound - > sound1_volume = volume ;
2014-10-07 04:21:55 +02:00
vehicle_sound - > sound1_freq = vehicle_sound_params - > frequency ;
uint16 frequency = vehicle_sound_params - > frequency ;
if ( RCT2_ADDRESS ( 0x009AF51F , uint8 ) [ 2 * sprite - > vehicle . sound1_id ] & 2 ) {
2014-09-15 23:12:25 +02:00
frequency = ( frequency / 2 ) + 4000 ;
}
2014-10-07 04:21:55 +02:00
uint8 looping = RCT2_ADDRESS ( 0x009AF51E , uint8 ) [ 2 * sprite - > vehicle . sound1_id ] ;
int pan = vehicle_sound_params - > pan ;
2014-09-15 23:12:25 +02:00
if ( ! RCT2_GLOBAL ( 0x009AAC6D , uint8 ) ) {
pan = 0 ;
}
2014-10-07 04:21:55 +02:00
# ifdef USE_MIXER
vehicle_sound - > sound1_channel = Mixer_Play_Effect ( sprite - > vehicle . sound1_id , looping ? MIXER_LOOP_INFINITE : MIXER_LOOP_NONE , DStoMixerVolume ( volume ) , DStoMixerPan ( pan ) , DStoMixerRate ( frequency ) ) ;
# else
2014-09-15 23:12:25 +02:00
RCT2_GLOBAL ( 0x014241BC , uint32 ) = 1 ;
sound_play ( & vehicle_sound - > sound1 , looping , volume , pan , frequency ) ;
RCT2_GLOBAL ( 0x014241BC , uint32 ) = 0 ;
2014-10-07 04:21:55 +02:00
# endif
2014-09-15 23:12:25 +02:00
goto label87 ;
}
if ( volume ! = vehicle_sound - > sound1_volume ) {
vehicle_sound - > sound1_volume = volume ;
2014-10-07 04:21:55 +02:00
# ifdef USE_MIXER
Mixer_Channel_Volume ( vehicle_sound - > sound1_channel , DStoMixerVolume ( volume ) ) ;
# else
2014-09-15 23:12:25 +02:00
RCT2_GLOBAL ( 0x014241BC , uint32 ) = 1 ;
sound_set_volume ( & vehicle_sound - > sound1 , volume ) ;
RCT2_GLOBAL ( 0x014241BC , uint32 ) = 0 ;
2014-10-07 04:21:55 +02:00
# endif
2014-09-15 23:12:25 +02:00
}
2014-10-07 04:21:55 +02:00
if ( vehicle_sound_params - > pan ! = vehicle_sound - > sound1_pan ) {
vehicle_sound - > sound1_pan = vehicle_sound_params - > pan ;
2014-09-17 21:44:29 +02:00
if ( RCT2_GLOBAL ( 0x009AAC6D , uint8 ) ) {
2014-10-07 04:21:55 +02:00
# ifdef USE_MIXER
Mixer_Channel_Pan ( vehicle_sound - > sound1_channel , DStoMixerPan ( vehicle_sound_params - > pan ) ) ;
# else
2014-09-17 21:44:29 +02:00
RCT2_GLOBAL ( 0x014241BC , uint32 ) = 1 ;
2014-10-07 04:21:55 +02:00
sound_set_pan ( & vehicle_sound - > sound1 , vehicle_sound_params - > pan ) ;
2014-09-17 21:44:29 +02:00
RCT2_GLOBAL ( 0x014241BC , uint32 ) = 0 ;
2014-10-07 04:21:55 +02:00
# endif
2014-09-17 21:44:29 +02:00
}
2014-09-15 23:12:25 +02:00
}
2014-10-07 04:21:55 +02:00
if ( ! ( RCT2_GLOBAL ( RCT2_ADDRESS_CURRENT_TICKS , uint32 ) & 3 ) & & vehicle_sound_params - > frequency ! = vehicle_sound - > sound1_freq ) {
vehicle_sound - > sound1_freq = vehicle_sound_params - > frequency ;
uint16 frequency = vehicle_sound_params - > frequency ;
if ( RCT2_GLOBAL ( 0x009AF51F , uint8 * ) [ 2 * sprite - > vehicle . sound1_id ] & 2 ) {
2014-09-15 23:12:25 +02:00
frequency = ( frequency / 2 ) + 4000 ;
}
2014-10-07 04:21:55 +02:00
# ifdef USE_MIXER
Mixer_Channel_Rate ( vehicle_sound - > sound1_channel , DStoMixerRate ( frequency ) ) ;
# else
2014-09-15 23:12:25 +02:00
RCT2_GLOBAL ( 0x014241BC , uint32 ) = 1 ;
sound_set_frequency ( & vehicle_sound - > sound1 , frequency ) ;
RCT2_GLOBAL ( 0x014241BC , uint32 ) = 0 ;
2014-10-07 04:21:55 +02:00
# endif
2014-09-15 23:12:25 +02:00
}
2014-09-17 21:44:29 +02:00
}
label87 : // do sound2 stuff, screams
2014-10-07 04:21:55 +02:00
sprite = & g_sprite_list [ vehicle_sound_params - > id ] ;
volume = sprite - > vehicle . sound2_volume ;
2014-10-04 00:28:39 +02:00
volume * = vol1 ;
2014-09-17 21:44:29 +02:00
volume = ( uint16 ) volume / 8 ;
volume - = 0x1FFF ;
if ( volume < - 10000 ) {
volume = - 10000 ;
}
2014-10-07 04:21:55 +02:00
if ( sprite - > vehicle . sound2_id = = ( uint8 ) - 1 ) {
2014-09-17 21:44:29 +02:00
if ( vehicle_sound - > sound2_id ! = ( uint16 ) - 1 ) {
vehicle_sound - > sound2_id = - 1 ;
2014-10-07 04:21:55 +02:00
# ifdef USE_MIXER
Mixer_Stop_Channel ( vehicle_sound - > sound2_channel ) ;
# else
2014-09-17 21:44:29 +02:00
RCT2_GLOBAL ( 0x014241BC , uint32 ) = 1 ;
sound_stop ( & vehicle_sound - > sound2 ) ;
RCT2_GLOBAL ( 0x014241BC , uint32 ) = 0 ;
2014-10-07 04:21:55 +02:00
# endif
2014-09-17 21:44:29 +02:00
}
} else {
if ( vehicle_sound - > sound2_id = = ( uint16 ) - 1 ) {
goto label93 ;
2014-09-15 23:12:25 +02:00
}
2014-10-07 04:21:55 +02:00
if ( sprite - > vehicle . sound2_id ! = vehicle_sound - > sound2_id ) {
# ifdef USE_MIXER
Mixer_Stop_Channel ( vehicle_sound - > sound2_channel ) ;
# else
2014-09-17 21:44:29 +02:00
RCT2_GLOBAL ( 0x014241BC , uint32 ) = 1 ;
sound_stop ( & vehicle_sound - > sound2 ) ;
RCT2_GLOBAL ( 0x014241BC , uint32 ) = 0 ;
2014-10-07 04:21:55 +02:00
# endif
2014-09-17 21:44:29 +02:00
label93 :
2014-10-07 04:21:55 +02:00
vehicle_sound - > sound2_id = sprite - > vehicle . sound2_id ;
# ifndef USE_MIXER
2014-09-17 21:44:29 +02:00
RCT2_GLOBAL ( 0x014241BC , uint32 ) = 1 ;
2014-10-07 20:16:17 +02:00
sound_prepare ( sprite - > vehicle . sound2_id , & vehicle_sound - > sound2 , 1 , RCT2_GLOBAL ( RCT2_ADDRESS_CONFIG_SOUND_SW_BUFFER , uint32 ) ) ;
2014-09-17 21:44:29 +02:00
RCT2_GLOBAL ( 0x014241BC , uint32 ) = 0 ;
2014-10-07 04:21:55 +02:00
# endif
vehicle_sound - > sound2_pan = vehicle_sound_params - > pan ;
2014-09-17 21:44:29 +02:00
vehicle_sound - > sound2_volume = volume ;
2014-10-07 04:21:55 +02:00
vehicle_sound - > sound2_freq = vehicle_sound_params - > frequency ;
uint16 frequency = vehicle_sound_params - > frequency ;
if ( RCT2_ADDRESS ( 0x009AF51F , uint8 ) [ 2 * sprite - > vehicle . sound2_id ] & 1 ) {
2014-09-17 21:44:29 +02:00
frequency = 12649 ;
2014-09-15 23:12:25 +02:00
}
2014-09-17 21:44:29 +02:00
frequency = ( frequency * 2 ) - 3248 ;
if ( frequency > 25700 ) {
frequency = 25700 ;
2014-09-15 23:12:25 +02:00
}
2014-10-07 04:21:55 +02:00
uint8 looping = RCT2_ADDRESS ( 0x009AF51E , uint8 ) [ 2 * sprite - > vehicle . sound2_id ] ;
int pan = vehicle_sound_params - > pan ;
2014-09-17 21:44:29 +02:00
if ( ! RCT2_GLOBAL ( 0x009AAC6D , uint8 ) ) {
pan = 0 ;
}
2014-10-07 04:21:55 +02:00
# ifdef USE_MIXER
vehicle_sound - > sound2_channel = Mixer_Play_Effect ( sprite - > vehicle . sound2_id , looping ? MIXER_LOOP_INFINITE : MIXER_LOOP_NONE , DStoMixerVolume ( volume ) , DStoMixerPan ( pan ) , DStoMixerRate ( frequency ) ) ;
# else
2014-09-17 21:44:29 +02:00
RCT2_GLOBAL ( 0x014241BC , uint32 ) = 1 ;
sound_play ( & vehicle_sound - > sound2 , looping , volume , pan , frequency ) ;
RCT2_GLOBAL ( 0x014241BC , uint32 ) = 0 ;
2014-10-07 04:21:55 +02:00
# endif
2014-09-17 21:44:29 +02:00
goto label114 ;
}
if ( volume ! = vehicle_sound - > sound2_volume ) {
2014-10-07 04:21:55 +02:00
# ifdef USE_MIXER
Mixer_Channel_Volume ( vehicle_sound - > sound2_channel , DStoMixerVolume ( volume ) ) ;
# else
2014-09-17 21:44:29 +02:00
RCT2_GLOBAL ( 0x014241BC , uint32 ) = 1 ;
sound_set_volume ( & vehicle_sound - > sound2 , volume ) ;
RCT2_GLOBAL ( 0x014241BC , uint32 ) = 0 ;
2014-10-07 04:21:55 +02:00
# endif
vehicle_sound - > sound2_volume = volume ;
2014-09-17 21:44:29 +02:00
}
2014-10-07 04:21:55 +02:00
if ( vehicle_sound_params - > pan ! = vehicle_sound - > sound2_pan ) {
vehicle_sound - > sound2_pan = vehicle_sound_params - > pan ;
2014-09-17 21:44:29 +02:00
if ( RCT2_GLOBAL ( 0x009AAC6D , uint8 ) ) {
2014-10-07 04:21:55 +02:00
# ifdef USE_MIXER
Mixer_Channel_Pan ( vehicle_sound - > sound2_channel , DStoMixerPan ( vehicle_sound_params - > pan ) ) ;
# else
2014-09-15 23:12:25 +02:00
RCT2_GLOBAL ( 0x014241BC , uint32 ) = 1 ;
2014-10-07 04:21:55 +02:00
sound_set_pan ( & vehicle_sound - > sound2 , vehicle_sound_params - > pan ) ;
2014-09-15 23:12:25 +02:00
RCT2_GLOBAL ( 0x014241BC , uint32 ) = 0 ;
2014-10-07 04:21:55 +02:00
# endif
2014-09-17 21:44:29 +02:00
}
}
2014-10-07 04:21:55 +02:00
if ( ! ( RCT2_GLOBAL ( RCT2_ADDRESS_CURRENT_TICKS , uint32 ) & 3 ) & & vehicle_sound_params - > frequency ! = vehicle_sound - > sound2_freq ) {
vehicle_sound - > sound2_freq = vehicle_sound_params - > frequency ;
if ( ! ( RCT2_ADDRESS ( 0x009AF51F , uint8 ) [ 2 * sprite - > vehicle . sound2_id ] & 1 ) ) {
uint16 frequency = ( vehicle_sound_params - > frequency * 2 ) - 3248 ;
2014-09-15 23:12:25 +02:00
if ( frequency > 25700 ) {
frequency = 25700 ;
}
2014-10-07 04:21:55 +02:00
# ifdef USE_MIXER
Mixer_Channel_Rate ( vehicle_sound - > sound2_channel , DStoMixerRate ( frequency ) ) ;
# else
2014-09-15 23:12:25 +02:00
RCT2_GLOBAL ( 0x014241BC , uint32 ) = 1 ;
2014-09-17 21:44:29 +02:00
sound_set_frequency ( & vehicle_sound - > sound2 , frequency ) ;
2014-09-15 23:12:25 +02:00
RCT2_GLOBAL ( 0x014241BC , uint32 ) = 0 ;
2014-10-07 04:21:55 +02:00
# endif
2014-09-15 23:12:25 +02:00
}
}
}
2014-09-17 21:44:29 +02:00
label114 :
1 ;
2014-09-15 23:12:25 +02:00
}
}
}
}
2014-05-25 19:40:11 +02:00
/**
*
* rct2 : 0x006D4204
*/
void vehicle_update_all ( )
{
uint16 sprite_index ;
rct_vehicle * vehicle ;
if ( RCT2_GLOBAL ( RCT2_ADDRESS_SCREEN_FLAGS , uint8 ) & 2 )
return ;
if ( ( RCT2_GLOBAL ( RCT2_ADDRESS_SCREEN_FLAGS , uint8 ) & 4 ) & & RCT2_GLOBAL ( 0x0141F570 , uint8 ) ! = 6 )
return ;
sprite_index = RCT2_GLOBAL ( RCT2_ADDRESS_SPRITES_START_VEHICLE , uint16 ) ;
while ( sprite_index ! = SPRITE_INDEX_NULL ) {
2014-06-29 15:51:18 +02:00
vehicle = & ( g_sprite_list [ sprite_index ] . vehicle ) ;
2014-05-25 19:40:11 +02:00
sprite_index = vehicle - > next ;
vehicle_update ( vehicle ) ;
}
}
/**
*
* rct2 : 0x006D77F2
*/
static void vehicle_update ( rct_vehicle * vehicle )
{
RCT2_CALLPROC_X ( 0x006D77F2 , 0 , 0 , 0 , 0 , ( int ) vehicle , 0 , 0 ) ;
2014-09-21 14:50:35 +02:00
}
/**
*
* rct2 : 0x006D73D0
* ax : verticalG
* dx : lateralG
* esi : vehicle
*/
void vehicle_get_g_forces ( rct_vehicle * vehicle , int * verticalG , int * lateralG )
{
int eax , ebx , ecx , edx , esi , edi , ebp ;
esi = ( int ) vehicle ;
RCT2_CALLFUNC_X ( 0x006D73D0 , & eax , & ebx , & ecx , & edx , & esi , & edi , & ebp ) ;
if ( verticalG ! = NULL ) * verticalG = ( sint16 ) ( eax & 0xFFFF ) ;
if ( lateralG ! = NULL ) * lateralG = ( sint16 ) ( edx & 0xFFFF ) ;
2014-05-25 19:40:11 +02:00
}