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/>.
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
# include "addresses.h"
2014-09-13 19:51:58 +02:00
# include "audio.h"
# include "ride.h"
2014-05-25 19:40:11 +02:00
# include "sprite.h"
# include "vehicle.h"
2014-09-13 19:51:58 +02:00
# include "viewport.h"
2014-05-25 19:40:11 +02:00
static void vehicle_update ( rct_vehicle * vehicle ) ;
2014-09-13 19:51:58 +02:00
/**
*
* rct2 : 0x006BB9FF
*/
void sub_6BB9FF ( rct_vehicle * vehicle )
{
if ( ! ( RCT2_GLOBAL ( RCT2_ADDRESS_SCREEN_FLAGS , uint8 ) & 2 ) & & ( ! ( RCT2_GLOBAL ( RCT2_ADDRESS_SCREEN_FLAGS , uint8 ) & 4 ) | | RCT2_GLOBAL ( 0x0141F570 , uint8 ) = = 6 ) ) {
if ( vehicle - > var_BB ! = ( uint8 ) - 1 | | vehicle - > var_BD ! = ( uint8 ) - 1 ) {
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 ) ;
rct_sound_unknown * i ;
2014-09-22 20:35:47 +02:00
for ( i = RCT2_ADDRESS ( 0x00F438B4 , rct_sound_unknown ) ; i < RCT2_GLOBAL ( 0x00F438B0 , rct_sound_unknown * ) & & v9 < = i - > var_A ; i + + ) ;
2014-09-13 19:51:58 +02:00
if ( i < RCT2_ADDRESS ( 0x00F43908 , rct_sound_unknown ) ) { // 0x00F43908 is end of rct_sound_unknown list, which has 7 elements, not to be confused with variable at 0x00F43908
if ( RCT2_GLOBAL ( 0x00F438B0 , rct_sound_unknown * ) < RCT2_ADDRESS ( 0x00F43908 , rct_sound_unknown ) ) {
RCT2_GLOBAL ( 0x00F438B0 , rct_sound_unknown * ) + + ;
}
rct_sound_unknown * j = RCT2_GLOBAL ( 0x00F438B0 , rct_sound_unknown * ) - 1 ;
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 ;
v19 * = 0x1588 ;
v19 > > = 14 ;
v19 + = 0x2B11 ;
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 ;
rct_vehicle_sound * vehicle_sound = RCT2_ADDRESS ( RCT2_ADDRESS_VEHICLE_SOUND_LIST , rct_vehicle_sound ) ;
while ( vehicle_sound - > id ! = vehicle - > sprite_index ) {
vehicle_sound + + ;
if ( vehicle_sound > = RCT2_GLOBAL ( 0x009AF42C , rct_vehicle_sound * ) ) {
return result ;
}
}
return result + 300 ;
}
2014-09-15 23:12:25 +02:00
/**
*
* rct2 : 0x006BBC6B
*/
void vehicle_sounds_update ( )
{
uint16 result ;
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 ;
RCT2_GLOBAL ( 0x00F438AC , uint8 ) = 0 ;
if ( viewport - > zoom ) {
RCT2_GLOBAL ( 0x00F438AC , uint8 ) = 35 ;
if ( viewport - > zoom ! = 1 ) {
RCT2_GLOBAL ( 0x00F438AC , uint8 ) = 70 ;
}
}
}
//label12:
RCT2_GLOBAL ( 0x00F438B0 , rct_sound_unknown * * ) = & RCT2_GLOBAL ( 0x00F438B4 , rct_sound_unknown * ) ;
for ( uint16 i = RCT2_GLOBAL ( RCT2_ADDRESS_SPRITES_START_VEHICLE , uint16 ) ; i ! = SPRITE_INDEX_NULL ; i = g_sprite_list [ i ] . vehicle . next ) {
sub_6BB9FF ( & g_sprite_list [ i ] . vehicle ) ;
}
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 + + ) {
if ( vehicle_sound - > id ! = ( uint16 ) - 1 ) {
for ( rct_sound_unknown * sound_unknown = & RCT2_GLOBAL ( 0x00F438B4 , rct_sound_unknown ) ; sound_unknown ! = RCT2_GLOBAL ( 0x00F438B0 , rct_sound_unknown * ) ; sound_unknown + + ) {
if ( vehicle_sound - > id = = sound_unknown - > id ) {
goto label26 ;
}
}
if ( vehicle_sound - > sound1_id ! = ( uint16 ) - 1 ) {
RCT2_GLOBAL ( 0x014241BC , uint32 ) = 1 ;
sound_stop ( & vehicle_sound - > sound1 ) ;
RCT2_GLOBAL ( 0x014241BC , uint32 ) = 0 ;
}
if ( vehicle_sound - > sound2_id ! = ( uint16 ) - 1 ) {
RCT2_GLOBAL ( 0x014241BC , uint32 ) = 1 ;
sound_stop ( & vehicle_sound - > sound2 ) ;
RCT2_GLOBAL ( 0x014241BC , uint32 ) = 0 ;
}
vehicle_sound - > id = ( uint16 ) - 1 ;
}
label26 :
1 ;
}
2014-09-22 20:35:47 +02:00
for ( rct_sound_unknown * sound_unknown = & RCT2_GLOBAL ( 0x00F438B4 , rct_sound_unknown ) ; ; sound_unknown + + ) {
label28 :
if ( sound_unknown > = RCT2_GLOBAL ( 0x00F438B0 , rct_sound_unknown * ) ) {
return ;
}
2014-09-15 23:12:25 +02:00
result = ( uint16 ) - 1 ;
sint16 v = sound_unknown - > var_4 ;
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-09-15 23:12:25 +02:00
result = MAKEWORD ( LOBYTE ( v ) , HIBYTE ( result ) ) ;
if ( HIBYTE ( v ) ! = 0 ) {
result = MAKEWORD ( 0xFF , HIBYTE ( result ) ) ;
if ( HIBYTE ( v ) < 0 ) {
result = MAKEWORD ( 0 , HIBYTE ( result ) ) ;
}
}
}
sint16 w = sound_unknown - > pan ;
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-09-15 23:12:25 +02:00
result = MAKEWORD ( LOBYTE ( result ) , LOBYTE ( w ) ) ;
if ( HIBYTE ( w ) ! = 0 ) {
result = MAKEWORD ( LOBYTE ( result ) , 0xFF ) ;
if ( HIBYTE ( w ) < 0 ) {
result = MAKEWORD ( LOBYTE ( result ) , 0 ) ;
}
}
}
if ( LOBYTE ( result ) > = HIBYTE ( result ) ) {
result = MAKEWORD ( HIBYTE ( result ) , HIBYTE ( result ) ) ;
}
2014-09-19 04:48:04 +02:00
if ( LOBYTE ( result ) < RCT2_GLOBAL ( 0x00F438AC , uint8 ) ) {
2014-09-15 23:12:25 +02:00
result = MAKEWORD ( 0 , HIBYTE ( result ) ) ;
2014-09-19 04:48:04 +02:00
} else {
result = MAKEWORD ( LOBYTE ( result ) - RCT2_GLOBAL ( 0x00F438AC , uint8 ) , HIBYTE ( result ) ) ;
2014-09-15 23:12:25 +02:00
}
rct_vehicle_sound * vehicle_sound = & RCT2_GLOBAL ( RCT2_ADDRESS_VEHICLE_SOUND_LIST , rct_vehicle_sound ) ;
while ( sound_unknown - > id ! = vehicle_sound - > id ) {
vehicle_sound + + ;
if ( vehicle_sound > = & RCT2_GLOBAL ( 0x009AF42C , rct_vehicle_sound ) ) {
2014-09-22 20:35:47 +02:00
vehicle_sound = & 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-09-22 20:35:47 +02:00
if ( i > = RCT2_GLOBAL ( 0x009AAC75 , uint8 ) ) {
sound_unknown = ( rct_sound_unknown * ) ( ( int ) sound_unknown + 10 ) ;
2014-09-15 23:12:25 +02:00
goto label28 ;
}
}
vehicle_sound - > id = sound_unknown - > id ;
vehicle_sound - > sound1_id = ( uint16 ) - 1 ;
vehicle_sound - > sound2_id = ( uint16 ) - 1 ;
vehicle_sound - > var_2 = 0x30 ;
break ;
}
}
uint8 v21 = LOBYTE ( sound_unknown - > var_8 ) ;
uint8 v22 = LOBYTE ( vehicle_sound - > var_2 ) ;
if ( v22 ! = v21 ) {
if ( v22 < v21 ) {
v22 + = 4 ;
} else {
v22 - = 4 ;
}
}
vehicle_sound - > var_2 = v22 ;
2014-09-19 04:48:04 +02:00
if ( LOBYTE ( result ) < v22 ) {
2014-09-15 23:12:25 +02:00
result = MAKEWORD ( 0 , HIBYTE ( result ) ) ;
2014-09-19 04:48:04 +02:00
} else {
result = MAKEWORD ( LOBYTE ( result ) - v22 , HIBYTE ( result ) ) ;
2014-09-15 23:12:25 +02:00
}
// do sound1 stuff, track noise
RCT2_ADDRESS_SPRITE_LIST ;
rct_sprite * sprite = & g_sprite_list [ sound_unknown - > id ] ;
sint16 volume = sprite - > vehicle . var_BC ;
volume * = LOBYTE ( result ) ;
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 ;
}
if ( sprite - > vehicle . var_BB = = ( uint8 ) - 1 ) {
if ( vehicle_sound - > sound1_id ! = ( uint16 ) - 1 ) {
vehicle_sound - > sound1_id = - 1 ;
RCT2_GLOBAL ( 0x014241BC , uint32 ) = 1 ;
sound_stop ( & vehicle_sound - > sound1 ) ;
RCT2_GLOBAL ( 0x014241BC , uint32 ) = 0 ;
}
} else {
if ( vehicle_sound - > sound1_id = = ( uint16 ) - 1 ) {
goto label69 ;
}
if ( sprite - > vehicle . var_BB ! = vehicle_sound - > sound1_id ) {
RCT2_GLOBAL ( 0x014241BC , uint32 ) = 1 ;
sound_stop ( & vehicle_sound - > sound1 ) ;
RCT2_GLOBAL ( 0x014241BC , uint32 ) = 0 ;
label69 :
vehicle_sound - > sound1_id = sprite - > vehicle . var_BB ;
RCT2_GLOBAL ( 0x014241BC , uint32 ) = 1 ;
sound_prepare ( sprite - > vehicle . var_BB , & vehicle_sound - > sound1 , 1 , RCT2_GLOBAL ( RCT2_ADDRESS_CONFIG_SOUND_SW_BUFFER , uint32 ) ) ;
RCT2_GLOBAL ( 0x014241BC , uint32 ) = 0 ;
vehicle_sound - > sound1_pan = sound_unknown - > pan ;
vehicle_sound - > sound1_volume = volume ;
vehicle_sound - > sound1_freq = sound_unknown - > frequency ;
uint16 frequency = sound_unknown - > frequency ;
if ( RCT2_ADDRESS ( 0x009AF51F , uint8 ) [ 2 * sprite - > vehicle . var_BB ] & 2 ) {
frequency = ( frequency / 2 ) + 4000 ;
}
uint8 looping = RCT2_ADDRESS ( 0x009AF51E , uint8 ) [ 2 * sprite - > vehicle . var_BB ] ;
int pan = sound_unknown - > pan ;
if ( ! RCT2_GLOBAL ( 0x009AAC6D , uint8 ) ) {
pan = 0 ;
}
RCT2_GLOBAL ( 0x014241BC , uint32 ) = 1 ;
sound_play ( & vehicle_sound - > sound1 , looping , volume , pan , frequency ) ;
RCT2_GLOBAL ( 0x014241BC , uint32 ) = 0 ;
goto label87 ;
}
if ( volume ! = vehicle_sound - > sound1_volume ) {
vehicle_sound - > sound1_volume = volume ;
RCT2_GLOBAL ( 0x014241BC , uint32 ) = 1 ;
sound_set_volume ( & vehicle_sound - > sound1 , volume ) ;
RCT2_GLOBAL ( 0x014241BC , uint32 ) = 0 ;
}
if ( sound_unknown - > pan ! = vehicle_sound - > sound1_pan ) {
vehicle_sound - > sound1_pan = sound_unknown - > pan ;
2014-09-17 21:44:29 +02:00
if ( RCT2_GLOBAL ( 0x009AAC6D , uint8 ) ) {
RCT2_GLOBAL ( 0x014241BC , uint32 ) = 1 ;
sound_set_pan ( & vehicle_sound - > sound1 , sound_unknown - > pan ) ;
RCT2_GLOBAL ( 0x014241BC , uint32 ) = 0 ;
}
2014-09-15 23:12:25 +02:00
}
if ( ! ( RCT2_GLOBAL ( RCT2_ADDRESS_CURRENT_TICKS , uint32 ) & 3 ) & & sound_unknown - > frequency ! = vehicle_sound - > sound1_freq ) {
vehicle_sound - > sound1_freq = sound_unknown - > frequency ;
uint16 frequency = sound_unknown - > frequency ;
if ( RCT2_GLOBAL ( 0x009AF51F , uint8 * ) [ 2 * sprite - > vehicle . var_BB ] & 2 ) {
frequency = ( frequency / 2 ) + 4000 ;
}
RCT2_GLOBAL ( 0x014241BC , uint32 ) = 1 ;
sound_set_frequency ( & vehicle_sound - > sound1 , frequency ) ;
RCT2_GLOBAL ( 0x014241BC , uint32 ) = 0 ;
}
2014-09-17 21:44:29 +02:00
}
label87 : // do sound2 stuff, screams
sprite = & g_sprite_list [ sound_unknown - > id ] ;
volume = sprite - > vehicle . var_BE ;
volume * = LOBYTE ( result ) ;
volume = ( uint16 ) volume / 8 ;
volume - = 0x1FFF ;
if ( volume < - 10000 ) {
volume = - 10000 ;
}
if ( sprite - > vehicle . var_BD = = ( uint8 ) - 1 ) {
if ( vehicle_sound - > sound2_id ! = ( uint16 ) - 1 ) {
vehicle_sound - > sound2_id = - 1 ;
RCT2_GLOBAL ( 0x014241BC , uint32 ) = 1 ;
sound_stop ( & vehicle_sound - > sound2 ) ;
RCT2_GLOBAL ( 0x014241BC , uint32 ) = 0 ;
}
} else {
if ( vehicle_sound - > sound2_id = = ( uint16 ) - 1 ) {
goto label93 ;
2014-09-15 23:12:25 +02:00
}
2014-09-17 21:44:29 +02:00
if ( sprite - > vehicle . var_BD ! = vehicle_sound - > sound2_id ) {
RCT2_GLOBAL ( 0x014241BC , uint32 ) = 1 ;
sound_stop ( & vehicle_sound - > sound2 ) ;
RCT2_GLOBAL ( 0x014241BC , uint32 ) = 0 ;
label93 :
vehicle_sound - > sound2_id = sprite - > vehicle . var_BD ;
RCT2_GLOBAL ( 0x014241BC , uint32 ) = 1 ;
sound_prepare ( sprite - > vehicle . var_BD , & vehicle_sound - > sound2 , 1 , RCT2_GLOBAL ( RCT2_ADDRESS_CONFIG_SOUND_SW_BUFFER , uint32 ) ) ;
RCT2_GLOBAL ( 0x014241BC , uint32 ) = 0 ;
vehicle_sound - > sound2_pan = sound_unknown - > pan ;
vehicle_sound - > sound2_volume = volume ;
vehicle_sound - > sound2_freq = sound_unknown - > frequency ;
uint16 frequency = sound_unknown - > frequency ;
if ( RCT2_ADDRESS ( 0x009AF51F , uint8 ) [ 2 * sprite - > vehicle . var_BD ] & 1 ) {
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-09-17 21:44:29 +02:00
uint8 looping = RCT2_ADDRESS ( 0x009AF51E , uint8 ) [ 2 * sprite - > vehicle . var_BD ] ;
int pan = sound_unknown - > pan ;
if ( ! RCT2_GLOBAL ( 0x009AAC6D , uint8 ) ) {
pan = 0 ;
}
RCT2_GLOBAL ( 0x014241BC , uint32 ) = 1 ;
sound_play ( & vehicle_sound - > sound2 , looping , volume , pan , frequency ) ;
RCT2_GLOBAL ( 0x014241BC , uint32 ) = 0 ;
goto label114 ;
}
if ( volume ! = vehicle_sound - > sound2_volume ) {
vehicle_sound - > sound2_volume = volume ;
RCT2_GLOBAL ( 0x014241BC , uint32 ) = 1 ;
sound_set_volume ( & vehicle_sound - > sound2 , volume ) ;
RCT2_GLOBAL ( 0x014241BC , uint32 ) = 0 ;
}
if ( sound_unknown - > pan ! = vehicle_sound - > sound2_pan ) {
vehicle_sound - > sound2_pan = sound_unknown - > pan ;
if ( RCT2_GLOBAL ( 0x009AAC6D , uint8 ) ) {
2014-09-15 23:12:25 +02:00
RCT2_GLOBAL ( 0x014241BC , uint32 ) = 1 ;
2014-09-17 21:44:29 +02:00
sound_set_pan ( & vehicle_sound - > sound2 , sound_unknown - > pan ) ;
2014-09-15 23:12:25 +02:00
RCT2_GLOBAL ( 0x014241BC , uint32 ) = 0 ;
2014-09-17 21:44:29 +02:00
}
}
if ( ! ( RCT2_GLOBAL ( RCT2_ADDRESS_CURRENT_TICKS , uint32 ) & 3 ) & & sound_unknown - > frequency ! = vehicle_sound - > sound2_freq ) {
vehicle_sound - > sound2_freq = sound_unknown - > frequency ;
if ( ! ( RCT2_ADDRESS ( 0x009AF51F , uint8 ) [ 2 * sprite - > vehicle . var_BD ] & 1 ) ) {
uint16 frequency = ( sound_unknown - > frequency * 2 ) - 3248 ;
2014-09-15 23:12:25 +02:00
if ( frequency > 25700 ) {
frequency = 25700 ;
}
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-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
}