2019-06-02 23:42:51 +02:00
# include <csignal>
2020-04-21 12:28:06 +02:00
# define WITHWINDOWS
2019-05-30 21:24:47 +02:00
# include "common.h"
2020-05-11 04:55:57 +02:00
# include "crossplatform.h"
2019-05-30 21:24:47 +02:00
# include "Renderer.h"
2019-05-31 00:32:50 +02:00
# include "Credits.h"
2019-05-31 11:44:43 +02:00
# include "Camera.h"
2019-06-27 10:58:51 +02:00
# include "Weather.h"
# include "Clock.h"
# include "World.h"
# include "Vehicle.h"
2019-07-19 11:57:12 +02:00
# include "ModelIndices.h"
2019-06-27 10:58:51 +02:00
# include "Streaming.h"
# include "PathFind.h"
# include "Boat.h"
2019-08-04 00:31:00 +02:00
# include "Heli.h"
2019-06-27 10:58:51 +02:00
# include "Automobile.h"
2020-03-22 12:26:35 +01:00
# include "Console.h"
2020-03-26 14:16:06 +01:00
# include "Debug.h"
2020-04-10 17:06:49 +02:00
# include "Hud.h"
2020-04-13 20:50:56 +02:00
# include "SceneEdit.h"
# include "Pad.h"
2020-04-16 21:19:56 +02:00
# include "PlayerPed.h"
# include "Radar.h"
2020-04-24 13:27:02 +02:00
# include "debugmenu.h"
2020-05-02 10:08:58 +02:00
# include "Frontend.h"
2020-05-29 12:03:32 +02:00
# include "WaterLevel.h"
# include "main.h"
2020-08-13 18:14:24 +02:00
# include "postfx.h"
2020-08-18 10:58:15 +02:00
# include "custompipes.h"
2020-10-25 08:50:17 +01:00
# ifdef DONT_TRUST_RECOGNIZED_JOYSTICKS
2020-10-25 00:05:07 +02:00
# include "FileMgr.h"
# include "ControllerConfig.h"
2020-10-25 08:50:17 +01:00
# endif
2019-05-30 21:24:47 +02:00
2020-05-11 04:55:57 +02:00
# ifndef _WIN32
# include "assert.h"
# include <stdarg.h>
# endif
2020-04-17 15:31:11 +02:00
# ifdef RWLIBS
2020-04-11 17:37:20 +02:00
extern " C " int vsprintf ( char * const _Buffer , char const * const _Format , va_list _ArgList ) ;
# endif
2019-05-30 21:24:47 +02:00
2019-06-03 00:25:46 +02:00
# ifdef USE_PS2_RAND
2020-05-11 04:55:57 +02:00
unsigned long long myrand_seed = 1 ;
2019-05-30 23:49:06 +02:00
# else
unsigned long int myrand_seed = 1 ;
# endif
2019-05-30 21:24:47 +02:00
int
myrand ( void )
{
2019-06-03 00:25:46 +02:00
# ifdef USE_PS2_RAND
2019-05-30 23:49:06 +02:00
// Use our own implementation of rand, stolen from PS2
2019-05-30 21:24:47 +02:00
myrand_seed = 0x5851F42D4C957F2D * myrand_seed + 1 ;
return ( ( myrand_seed > > 32 ) & 0x7FFFFFFF ) ;
2019-05-30 23:49:06 +02:00
# else
// or original codewarrior rand
myrand_seed = myrand_seed * 1103515245 + 12345 ;
return ( ( myrand_seed > > 16 ) & 0x7FFF ) ;
# endif
2019-05-30 21:24:47 +02:00
}
void
mysrand ( unsigned int seed )
{
myrand_seed = seed ;
}
2020-08-19 19:30:57 +02:00
# ifdef CUSTOM_FRONTEND_OPTIONS
# include "frontendoption.h"
2020-10-28 03:11:34 +01:00
void
CustomFrontendOptionsPopulate ( void )
2020-08-19 19:30:57 +02:00
{
2020-10-28 03:11:34 +01:00
// Moved to an array in MenuScreensCustom.cpp, but APIs are still available. see frontendoption.h
2020-08-24 21:42:26 +02:00
}
# endif
2020-10-28 03:11:34 +01:00
# ifdef LOAD_INI_SETTINGS
# include "ini_parser.hpp"
2020-08-24 21:42:26 +02:00
2020-10-28 03:11:34 +01:00
linb : : ini cfg ;
int CheckAndReadIniInt ( const char * cat , const char * key , int original )
2020-08-24 21:42:26 +02:00
{
2020-10-28 03:11:34 +01:00
const char * value = ( cfg . get ( cat , key , " " ) . c_str ( ) ) ;
if ( value & & value [ 0 ] ! = ' \0 ' )
return atoi ( value ) ;
2020-09-30 19:02:47 +02:00
2020-10-28 03:11:34 +01:00
return original ;
2020-09-30 19:02:47 +02:00
}
2020-08-19 19:30:57 +02:00
2020-10-28 03:11:34 +01:00
float CheckAndReadIniFloat ( const char * cat , const char * key , float original )
2020-08-19 19:30:57 +02:00
{
2020-10-28 03:11:34 +01:00
const char * value = ( cfg . get ( cat , key , " " ) . c_str ( ) ) ;
if ( value & & value [ 0 ] ! = ' \0 ' )
return atof ( value ) ;
2020-08-24 21:42:26 +02:00
2020-10-28 03:11:34 +01:00
return original ;
2020-08-19 19:30:57 +02:00
}
2020-10-02 16:36:56 +02:00
void LoadINISettings ( )
{
cfg . load_file ( " re3.ini " ) ;
# ifdef DONT_TRUST_RECOGNIZED_JOYSTICKS
2020-10-25 00:05:07 +02:00
// Written by assuming the codes below will run after _InputInitialiseJoys().
2020-10-02 16:36:56 +02:00
strcpy ( gSelectedJoystickName , cfg . get ( " DetectJoystick " , " JoystickName " , " " ) . c_str ( ) ) ;
2020-10-25 00:05:07 +02:00
if ( gSelectedJoystickName [ 0 ] ! = ' \0 ' ) {
for ( int i = 0 ; i < = GLFW_JOYSTICK_LAST ; i + + ) {
if ( glfwJoystickPresent ( i ) & & strncmp ( gSelectedJoystickName , glfwGetJoystickName ( i ) , strlen ( gSelectedJoystickName ) ) = = 0 ) {
if ( PSGLOBAL ( joy1id ) ! = - 1 ) {
PSGLOBAL ( joy2id ) = PSGLOBAL ( joy1id ) ;
}
PSGLOBAL ( joy1id ) = i ;
int count ;
glfwGetJoystickButtons ( PSGLOBAL ( joy1id ) , & count ) ;
// We need to init and reload bindings, because;
// 1-joypad button number may differ with saved/prvly connected one
// 2-bindings are not init'ed if there is no joypad at the start
ControlsManager . InitDefaultControlConfigJoyPad ( count ) ;
CFileMgr : : SetDirMyDocuments ( ) ;
int32 gta3set = CFileMgr : : OpenFile ( " gta3.set " , " r " ) ;
if ( gta3set ) {
ControlsManager . LoadSettings ( gta3set ) ;
CFileMgr : : CloseFile ( gta3set ) ;
}
CFileMgr : : SetDir ( " " ) ;
break ;
}
}
}
2020-10-02 16:36:56 +02:00
# endif
# ifdef CUSTOM_FRONTEND_OPTIONS
2020-10-28 03:11:34 +01:00
for ( int i = 0 ; i < MENUPAGES ; i + + ) {
for ( int j = 0 ; j < NUM_MENUROWS ; j + + ) {
CMenuScreenCustom : : CMenuEntry & option = aScreens [ i ] . m_aEntries [ j ] ;
if ( option . m_Action = = MENUACTION_NOTHING )
break ;
// CFO check
if ( option . m_Action < MENUACTION_NOTHING & & option . m_CFO - > save ) {
// CFO only supports saving uint8 right now
* option . m_CFO - > value = CheckAndReadIniInt ( " FrontendOptions " , option . m_CFO - > save , * option . m_CFO - > value ) ;
if ( option . m_Action = = MENUACTION_CFO_SELECT ) {
option . m_CFOSelect - > lastSavedValue = option . m_CFOSelect - > displayedValue = * option . m_CFO - > value ;
}
}
2020-10-02 16:36:56 +02:00
}
}
# endif
# ifdef NO_ISLAND_LOADING
2020-10-28 03:11:34 +01:00
CMenuManager : : m_PrefsIslandLoading = CheckAndReadIniInt ( " FrontendOptions " , " NoIslandLoading " , CMenuManager : : m_PrefsIslandLoading ) ;
2020-10-02 16:36:56 +02:00
CMenuManager : : m_DisplayIslandLoading = CMenuManager : : m_PrefsIslandLoading ;
# endif
2020-10-28 03:11:34 +01:00
# ifdef EXTENDED_COLOURFILTER
CPostFX : : Intensity = CheckAndReadIniFloat ( " CustomPipesValues " , " PostFXIntensity " , CPostFX : : Intensity ) ;
# endif
# ifdef EXTENDED_PIPELINES
CustomPipes : : VehicleShininess = CheckAndReadIniFloat ( " CustomPipesValues " , " NeoVehicleShininess " , CustomPipes : : VehicleShininess ) ;
CustomPipes : : VehicleSpecularity = CheckAndReadIniFloat ( " CustomPipesValues " , " NeoVehicleSpecularity " , CustomPipes : : VehicleSpecularity ) ;
CustomPipes : : RimlightMult = CheckAndReadIniFloat ( " CustomPipesValues " , " RimlightMult " , CustomPipes : : RimlightMult ) ;
CustomPipes : : LightmapMult = CheckAndReadIniFloat ( " CustomPipesValues " , " LightmapMult " , CustomPipes : : LightmapMult ) ;
CustomPipes : : GlossMult = CheckAndReadIniFloat ( " CustomPipesValues " , " GlossMult " , CustomPipes : : GlossMult ) ;
# endif
2020-10-02 16:36:56 +02:00
}
void SaveINISettings ( )
{
bool changed = false ;
char temp [ 4 ] ;
# ifdef DONT_TRUST_RECOGNIZED_JOYSTICKS
if ( strncmp ( cfg . get ( " DetectJoystick " , " JoystickName " , " " ) . c_str ( ) , gSelectedJoystickName , strlen ( gSelectedJoystickName ) ) ! = 0 ) {
changed = true ;
cfg . set ( " DetectJoystick " , " JoystickName " , gSelectedJoystickName ) ;
}
# endif
# ifdef CUSTOM_FRONTEND_OPTIONS
2020-10-28 03:11:34 +01:00
for ( int i = 0 ; i < MENUPAGES ; i + + ) {
for ( int j = 0 ; j < NUM_MENUROWS ; j + + ) {
CMenuScreenCustom : : CMenuEntry & option = aScreens [ i ] . m_aEntries [ j ] ;
if ( option . m_Action = = MENUACTION_NOTHING )
break ;
if ( option . m_Action < MENUACTION_NOTHING & & option . m_CFO - > save ) {
if ( atoi ( cfg . get ( " FrontendOptions " , option . m_CFO - > save , " xxx " ) . c_str ( ) ) ! = * option . m_CFO - > value ) { // if .ini doesn't have that key compare with xxx, so we can add it
changed = true ;
sprintf ( temp , " %u " , * option . m_CFO - > value ) ;
cfg . set ( " FrontendOptions " , option . m_CFO - > save , temp ) ;
}
2020-10-02 16:36:56 +02:00
}
}
}
# endif
# ifdef NO_ISLAND_LOADING
if ( atoi ( cfg . get ( " FrontendOptions " , " NoIslandLoading " , " xxx " ) . c_str ( ) ) ! = CMenuManager : : m_PrefsIslandLoading ) {
changed = true ;
sprintf ( temp , " %u " , CMenuManager : : m_PrefsIslandLoading ) ;
cfg . set ( " FrontendOptions " , " NoIslandLoading " , temp ) ;
}
# endif
if ( changed )
cfg . write_file ( " re3.ini " ) ;
}
# endif
2020-05-09 15:06:13 +02:00
# ifdef DEBUGMENU
2019-06-27 10:58:51 +02:00
void WeaponCheat ( ) ;
void HealthCheat ( ) ;
void TankCheat ( ) ;
void BlowUpCarsCheat ( ) ;
void ChangePlayerCheat ( ) ;
void MayhemCheat ( ) ;
void EverybodyAttacksPlayerCheat ( ) ;
void WeaponsForAllCheat ( ) ;
void FastTimeCheat ( ) ;
void SlowTimeCheat ( ) ;
void MoneyCheat ( ) ;
void ArmourCheat ( ) ;
void WantedLevelUpCheat ( ) ;
void WantedLevelDownCheat ( ) ;
void SunnyWeatherCheat ( ) ;
void CloudyWeatherCheat ( ) ;
void RainyWeatherCheat ( ) ;
void FoggyWeatherCheat ( ) ;
void FastWeatherCheat ( ) ;
void OnlyRenderWheelsCheat ( ) ;
void ChittyChittyBangBangCheat ( ) ;
void StrongGripCheat ( ) ;
void NastyLimbsCheat ( ) ;
2019-07-19 11:57:12 +02:00
DebugMenuEntry * carCol1 ;
DebugMenuEntry * carCol2 ;
2019-06-27 10:58:51 +02:00
void
2019-07-19 11:57:12 +02:00
SpawnCar ( int id )
2019-06-27 10:58:51 +02:00
{
CVector playerpos ;
CStreaming : : RequestModel ( id , 0 ) ;
CStreaming : : LoadAllRequestedModels ( false ) ;
2019-06-28 12:34:02 +02:00
if ( CStreaming : : HasModelLoaded ( id ) ) {
2019-07-19 11:57:12 +02:00
playerpos = FindPlayerCoors ( ) ;
2020-03-26 14:16:06 +01:00
int node ;
if ( ! CModelInfo : : IsBoatModel ( id ) ) {
node = ThePaths . FindNodeClosestToCoors ( playerpos , 0 , 100.0f , false , false ) ;
if ( node < 0 )
return ;
}
2019-06-27 10:58:51 +02:00
CVehicle * v ;
2019-07-19 11:57:12 +02:00
if ( CModelInfo : : IsBoatModel ( id ) )
2020-03-26 14:16:06 +01:00
v = new CBoat ( id , RANDOM_VEHICLE ) ;
2019-07-19 11:57:12 +02:00
else
v = new CAutomobile ( id , RANDOM_VEHICLE ) ;
v - > bHasBeenOwnedByPlayer = true ;
if ( carCol1 )
DebugMenuEntrySetAddress ( carCol1 , & v - > m_currentColour1 ) ;
if ( carCol2 )
DebugMenuEntrySetAddress ( carCol2 , & v - > m_currentColour2 ) ;
2020-03-26 14:16:06 +01:00
if ( CModelInfo : : IsBoatModel ( id ) )
2020-05-02 14:28:19 +02:00
v - > SetPosition ( TheCamera . GetPosition ( ) + TheCamera . GetForward ( ) * 15.0f ) ;
2020-03-26 14:16:06 +01:00
else
2020-05-03 15:57:57 +02:00
v - > SetPosition ( ThePaths . m_pathNodes [ node ] . GetPosition ( ) ) ;
2020-03-26 14:16:06 +01:00
2020-05-02 14:28:19 +02:00
v - > GetMatrix ( ) . GetPosition ( ) . z + = 4.0f ;
2019-07-19 11:57:12 +02:00
v - > SetOrientation ( 0.0f , 0.0f , 3.49f ) ;
2020-04-30 15:45:45 +02:00
v - > SetStatus ( STATUS_ABANDONED ) ;
2019-07-19 11:57:12 +02:00
v - > m_nDoorLock = CARLOCK_UNLOCKED ;
2019-06-27 10:58:51 +02:00
CWorld : : Add ( v ) ;
}
}
2019-07-11 12:48:49 +02:00
static void
2019-07-08 21:37:47 +02:00
FixCar ( void )
{
CVehicle * veh = FindPlayerVehicle ( ) ;
2019-07-09 23:49:44 +02:00
if ( veh = = nil )
2019-07-08 21:37:47 +02:00
return ;
2019-07-09 23:49:44 +02:00
veh - > m_fHealth = 1000.0f ;
if ( ! veh - > IsCar ( ) )
return ;
( ( CAutomobile * ) veh ) - > Damage . SetEngineStatus ( 0 ) ;
2019-07-08 21:37:47 +02:00
( ( CAutomobile * ) veh ) - > Fix ( ) ;
}
2020-04-16 21:19:56 +02:00
# ifdef MENU_MAP
static void
TeleportToWaypoint ( void )
{
if ( FindPlayerVehicle ( ) ) {
if ( CRadar : : TargetMarkerId ! = - 1 )
FindPlayerVehicle ( ) - > Teleport ( CRadar : : TargetMarkerPos + CVector ( 0.0f , 0.0f , FindPlayerVehicle ( ) - > GetColModel ( ) - > boundingSphere . center . z ) ) ;
} else
if ( CRadar : : TargetMarkerId ! = - 1 )
FindPlayerPed ( ) - > Teleport ( CRadar : : TargetMarkerPos + CVector ( 0.0f , 0.0f , FEET_OFFSET ) ) ;
}
# endif
2020-05-25 22:59:55 +02:00
static void
SwitchCarCollision ( void )
{
if ( FindPlayerVehicle ( ) & & FindPlayerVehicle ( ) - > IsCar ( ) )
FindPlayerVehicle ( ) - > bUsesCollision = ! FindPlayerVehicle ( ) - > bUsesCollision ;
}
2019-07-26 18:48:14 +02:00
static int engineStatus ;
static void
SetEngineStatus ( void )
{
CVehicle * veh = FindPlayerVehicle ( ) ;
if ( veh = = nil )
return ;
if ( ! veh - > IsCar ( ) )
return ;
( ( CAutomobile * ) veh ) - > Damage . SetEngineStatus ( engineStatus ) ;
}
2019-07-11 12:48:49 +02:00
static void
ToggleComedy ( void )
{
CVehicle * veh = FindPlayerVehicle ( ) ;
if ( veh = = nil )
return ;
veh - > bComedyControls = ! veh - > bComedyControls ;
}
2019-07-23 16:39:30 +02:00
static void
PlaceOnRoad ( void )
{
CVehicle * veh = FindPlayerVehicle ( ) ;
if ( veh = = nil )
return ;
if ( veh - > IsCar ( ) )
( ( CAutomobile * ) veh ) - > PlaceOnRoadProperly ( ) ;
}
2020-03-26 14:16:06 +01:00
static void
ResetCamStatics ( void )
{
TheCamera . Cams [ TheCamera . ActiveCam ] . ResetStatics = true ;
}
2019-07-19 11:57:12 +02:00
static const char * carnames [ ] = {
" landstal " , " idaho " , " stinger " , " linerun " , " peren " , " sentinel " , " patriot " , " firetruk " , " trash " , " stretch " , " manana " , " infernus " , " blista " , " pony " ,
" mule " , " cheetah " , " ambulan " , " fbicar " , " moonbeam " , " esperant " , " taxi " , " kuruma " , " bobcat " , " mrwhoop " , " bfinject " , " corpse " , " police " , " enforcer " ,
" securica " , " banshee " , " predator " , " bus " , " rhino " , " barracks " , " train " , " chopper " , " dodo " , " coach " , " cabbie " , " stallion " , " rumpo " , " rcbandit " ,
" bellyup " , " mrwongs " , " mafia " , " yardie " , " yakuza " , " diablos " , " columb " , " hoods " , " airtrain " , " deaddodo " , " speeder " , " reefer " , " panlant " , " flatbed " ,
" yankee " , " escape " , " borgnine " , " toyz " , " ghost " ,
} ;
2020-10-02 16:36:56 +02:00
//#include <list>
2020-05-11 04:55:57 +02:00
static CTweakVar * * TweakVarsList ;
static int TweakVarsListSize = - 1 ;
2019-07-24 18:55:43 +02:00
static bool bAddTweakVarsNow = false ;
static const char * pTweakVarsDefaultPath = NULL ;
void CTweakVars : : Add ( CTweakVar * var )
{
2020-05-11 04:55:57 +02:00
if ( TweakVarsListSize = = - 1 ) {
TweakVarsList = ( CTweakVar * * ) malloc ( 64 * sizeof ( CTweakVar * ) ) ;
TweakVarsListSize = 0 ;
}
if ( TweakVarsListSize > 63 )
TweakVarsList = ( CTweakVar * * ) realloc ( TweakVarsList , ( TweakVarsListSize + 1 ) * sizeof ( var ) ) ;
TweakVarsList [ TweakVarsListSize + + ] = var ;
// TweakVarsList.push_back(var);
2019-07-24 18:55:43 +02:00
if ( bAddTweakVarsNow )
var - > AddDBG ( pTweakVarsDefaultPath ) ;
}
void CTweakVars : : AddDBG ( const char * path )
{
pTweakVarsDefaultPath = path ;
2020-05-11 04:55:57 +02:00
for ( int i = 0 ; i < TweakVarsListSize ; + + i )
TweakVarsList [ i ] - > AddDBG ( pTweakVarsDefaultPath ) ;
2019-07-24 18:55:43 +02:00
bAddTweakVarsNow = true ;
}
void CTweakSwitch : : AddDBG ( const char * path )
{
DebugMenuEntry * e = DebugMenuAddVar ( m_pPath = = NULL ? path : m_pPath , m_pVarName , ( int32_t * ) m_pIntVar , m_pFunc , 1 , m_nMin , m_nMax , m_aStr ) ;
DebugMenuEntrySetWrap ( e , true ) ;
}
void CTweakFunc : : AddDBG ( const char * path ) { DebugMenuAddCmd ( m_pPath = = NULL ? path : m_pPath , m_pVarName , m_pFunc ) ; }
void CTweakBool : : AddDBG ( const char * path ) { DebugMenuAddVarBool8 ( m_pPath = = NULL ? path : m_pPath , m_pVarName , ( int8_t * ) m_pBoolVar , NULL ) ; }
void CTweakInt8 : : AddDBG ( const char * path ) { DebugMenuAddVar ( m_pPath = = NULL ? path : m_pPath , m_pVarName , ( int8_t * ) m_pIntVar , NULL , m_nStep , m_nLoawerBound , m_nUpperBound , NULL ) ; }
void CTweakUInt8 : : AddDBG ( const char * path ) { DebugMenuAddVar ( m_pPath = = NULL ? path : m_pPath , m_pVarName , ( uint8_t * ) m_pIntVar , NULL , m_nStep , m_nLoawerBound , m_nUpperBound , NULL ) ; }
void CTweakInt16 : : AddDBG ( const char * path ) { DebugMenuAddVar ( m_pPath = = NULL ? path : m_pPath , m_pVarName , ( int16_t * ) m_pIntVar , NULL , m_nStep , m_nLoawerBound , m_nUpperBound , NULL ) ; }
void CTweakUInt16 : : AddDBG ( const char * path ) { DebugMenuAddVar ( m_pPath = = NULL ? path : m_pPath , m_pVarName , ( uint16_t * ) m_pIntVar , NULL , m_nStep , m_nLoawerBound , m_nUpperBound , NULL ) ; }
void CTweakInt32 : : AddDBG ( const char * path ) { DebugMenuAddVar ( m_pPath = = NULL ? path : m_pPath , m_pVarName , ( int32_t * ) m_pIntVar , NULL , m_nStep , m_nLoawerBound , m_nUpperBound , NULL ) ; }
void CTweakUInt32 : : AddDBG ( const char * path ) { DebugMenuAddVar ( m_pPath = = NULL ? path : m_pPath , m_pVarName , ( uint32_t * ) m_pIntVar , NULL , m_nStep , m_nLoawerBound , m_nUpperBound , NULL ) ; }
void CTweakFloat : : AddDBG ( const char * path ) { DebugMenuAddVar ( m_pPath = = NULL ? path : m_pPath , m_pVarName , ( float * ) m_pIntVar , NULL , m_nStep , m_nLoawerBound , m_nUpperBound ) ; }
/*
static const char * wt [ ] = {
" Sunny " , " Cloudy " , " Rainy " , " Foggy "
} ;
SETTWEAKPATH ( " TEST " ) ;
TWEAKSWITCH ( CWeather : : NewWeatherType , 0 , 3 , wt , NULL ) ;
*/
2019-06-12 12:34:22 +02:00
void
DebugMenuPopulate ( void )
2019-05-30 21:24:47 +02:00
{
2020-04-24 13:27:02 +02:00
if ( 1 ) {
2019-06-27 10:58:51 +02:00
static const char * weathers [ ] = {
" Sunny " , " Cloudy " , " Rainy " , " Foggy "
} ;
DebugMenuEntry * e ;
e = DebugMenuAddVar ( " Time & Weather " , " Current Hour " , & CClock : : GetHoursRef ( ) , nil , 1 , 0 , 23 , nil ) ;
DebugMenuEntrySetWrap ( e , true ) ;
e = DebugMenuAddVar ( " Time & Weather " , " Current Minute " , & CClock : : GetMinutesRef ( ) ,
[ ] ( ) { CWeather : : InterpolationValue = CClock : : GetMinutes ( ) / 60.0f ; } , 1 , 0 , 59 , nil ) ;
DebugMenuEntrySetWrap ( e , true ) ;
e = DebugMenuAddVar ( " Time & Weather " , " Old Weather " , ( int16 * ) & CWeather : : OldWeatherType , nil , 1 , 0 , 3 , weathers ) ;
DebugMenuEntrySetWrap ( e , true ) ;
e = DebugMenuAddVar ( " Time & Weather " , " New Weather " , ( int16 * ) & CWeather : : NewWeatherType , nil , 1 , 0 , 3 , weathers ) ;
DebugMenuEntrySetWrap ( e , true ) ;
2019-06-30 21:06:55 +02:00
DebugMenuAddVar ( " Time & Weather " , " Wind " , ( float * ) & CWeather : : Wind , nil , 0.1f , 0.0f , 1.0f ) ;
2020-04-24 13:27:02 +02:00
DebugMenuAddVar ( " Time & Weather " , " Time scale " , ( float * ) & CTimer : : GetTimeScale ( ) , nil , 0.1f , 0.0f , 10.0f ) ;
2019-06-27 10:58:51 +02:00
DebugMenuAddCmd ( " Cheats " , " Weapons " , WeaponCheat ) ;
DebugMenuAddCmd ( " Cheats " , " Money " , MoneyCheat ) ;
DebugMenuAddCmd ( " Cheats " , " Health " , HealthCheat ) ;
DebugMenuAddCmd ( " Cheats " , " Wanted level up " , WantedLevelUpCheat ) ;
DebugMenuAddCmd ( " Cheats " , " Wanted level down " , WantedLevelDownCheat ) ;
DebugMenuAddCmd ( " Cheats " , " Tank " , TankCheat ) ;
DebugMenuAddCmd ( " Cheats " , " Blow up cars " , BlowUpCarsCheat ) ;
DebugMenuAddCmd ( " Cheats " , " Change player " , ChangePlayerCheat ) ;
DebugMenuAddCmd ( " Cheats " , " Mayhem " , MayhemCheat ) ;
DebugMenuAddCmd ( " Cheats " , " Everybody attacks player " , EverybodyAttacksPlayerCheat ) ;
DebugMenuAddCmd ( " Cheats " , " Weapons for all " , WeaponsForAllCheat ) ;
DebugMenuAddCmd ( " Cheats " , " Fast time " , FastTimeCheat ) ;
DebugMenuAddCmd ( " Cheats " , " Slow time " , SlowTimeCheat ) ;
DebugMenuAddCmd ( " Cheats " , " Armour " , ArmourCheat ) ;
DebugMenuAddCmd ( " Cheats " , " Sunny weather " , SunnyWeatherCheat ) ;
DebugMenuAddCmd ( " Cheats " , " Cloudy weather " , CloudyWeatherCheat ) ;
DebugMenuAddCmd ( " Cheats " , " Rainy weather " , RainyWeatherCheat ) ;
DebugMenuAddCmd ( " Cheats " , " Foggy weather " , FoggyWeatherCheat ) ;
DebugMenuAddCmd ( " Cheats " , " Fast weather " , FastWeatherCheat ) ;
DebugMenuAddCmd ( " Cheats " , " Only render wheels " , OnlyRenderWheelsCheat ) ;
DebugMenuAddCmd ( " Cheats " , " Chitty chitty bang bang " , ChittyChittyBangBangCheat ) ;
DebugMenuAddCmd ( " Cheats " , " Strong grip " , StrongGripCheat ) ;
DebugMenuAddCmd ( " Cheats " , " Nasty limbs " , NastyLimbsCheat ) ;
2019-07-19 11:57:12 +02:00
static int spawnCarId = MI_LANDSTAL ;
e = DebugMenuAddVar ( " Spawn " , " Spawn Car ID " , & spawnCarId , nil , 1 , MI_LANDSTAL , MI_GHOST , carnames ) ;
DebugMenuEntrySetWrap ( e , true ) ;
DebugMenuAddCmd ( " Spawn " , " Spawn Car " , [ ] ( ) {
if ( spawnCarId = = MI_TRAIN | |
spawnCarId = = MI_CHOPPER | |
spawnCarId = = MI_AIRTRAIN | |
spawnCarId = = MI_DEADDODO | |
spawnCarId = = MI_ESCAPE )
return ;
SpawnCar ( spawnCarId ) ;
} ) ;
static uint8 dummy ;
carCol1 = DebugMenuAddVar ( " Spawn " , " First colour " , & dummy , nil , 1 , 0 , 255 , nil ) ;
carCol2 = DebugMenuAddVar ( " Spawn " , " Second colour " , & dummy , nil , 1 , 0 , 255 , nil ) ;
DebugMenuAddCmd ( " Spawn " , " Spawn Stinger " , [ ] ( ) { SpawnCar ( MI_STINGER ) ; } ) ;
DebugMenuAddCmd ( " Spawn " , " Spawn Infernus " , [ ] ( ) { SpawnCar ( MI_INFERNUS ) ; } ) ;
DebugMenuAddCmd ( " Spawn " , " Spawn Cheetah " , [ ] ( ) { SpawnCar ( MI_CHEETAH ) ; } ) ;
DebugMenuAddCmd ( " Spawn " , " Spawn Esperanto " , [ ] ( ) { SpawnCar ( MI_ESPERANT ) ; } ) ;
DebugMenuAddCmd ( " Spawn " , " Spawn Stallion " , [ ] ( ) { SpawnCar ( MI_STALLION ) ; } ) ;
DebugMenuAddCmd ( " Spawn " , " Spawn Kuruma " , [ ] ( ) { SpawnCar ( MI_KURUMA ) ; } ) ;
DebugMenuAddCmd ( " Spawn " , " Spawn Taxi " , [ ] ( ) { SpawnCar ( MI_TAXI ) ; } ) ;
DebugMenuAddCmd ( " Spawn " , " Spawn Police " , [ ] ( ) { SpawnCar ( MI_POLICE ) ; } ) ;
DebugMenuAddCmd ( " Spawn " , " Spawn Enforcer " , [ ] ( ) { SpawnCar ( MI_ENFORCER ) ; } ) ;
DebugMenuAddCmd ( " Spawn " , " Spawn Banshee " , [ ] ( ) { SpawnCar ( MI_BANSHEE ) ; } ) ;
DebugMenuAddCmd ( " Spawn " , " Spawn Yakuza " , [ ] ( ) { SpawnCar ( MI_YAKUZA ) ; } ) ;
2019-07-26 14:27:13 +02:00
DebugMenuAddCmd ( " Spawn " , " Spawn Yardie " , [ ] ( ) { SpawnCar ( MI_YARDIE ) ; } ) ;
2019-07-19 11:57:12 +02:00
DebugMenuAddCmd ( " Spawn " , " Spawn Dodo " , [ ] ( ) { SpawnCar ( MI_DODO ) ; } ) ;
2019-07-25 16:33:37 +02:00
DebugMenuAddCmd ( " Spawn " , " Spawn Rhino " , [ ] ( ) { SpawnCar ( MI_RHINO ) ; } ) ;
DebugMenuAddCmd ( " Spawn " , " Spawn Firetruck " , [ ] ( ) { SpawnCar ( MI_FIRETRUCK ) ; } ) ;
2020-04-13 00:02:11 +02:00
DebugMenuAddCmd ( " Spawn " , " Spawn Predator " , [ ] ( ) { SpawnCar ( MI_PREDATOR ) ; } ) ;
2019-07-19 11:57:12 +02:00
2020-05-05 13:02:42 +02:00
DebugMenuAddVarBool8 ( " Render " , " Draw hud " , & CHud : : m_Wants_To_Draw_Hud , nil ) ;
2020-04-25 12:16:50 +02:00
DebugMenuAddVarBool8 ( " Render " , " PS2 Alpha test Emu " , & gPS2alphaTest , nil ) ;
2020-05-02 10:08:58 +02:00
DebugMenuAddVarBool8 ( " Render " , " Frame limiter " , & FrontEndMenuManager . m_PrefsFrameLimiter , nil ) ;
DebugMenuAddVarBool8 ( " Render " , " VSynch " , & FrontEndMenuManager . m_PrefsVsync , nil ) ;
DebugMenuAddVar ( " Render " , " Max FPS " , & RsGlobal . maxFPS , nil , 1 , 1 , 1000 , nil ) ;
2020-08-13 18:14:24 +02:00
# ifdef EXTENDED_COLOURFILTER
static const char * filternames [ ] = { " None " , " Simple " , " Normal " , " Mobile " } ;
e = DebugMenuAddVar ( " Render " , " Colourfilter " , & CPostFX : : EffectSwitch , nil , 1 , CPostFX : : POSTFX_OFF , CPostFX : : POSTFX_MOBILE , filternames ) ;
DebugMenuEntrySetWrap ( e , true ) ;
DebugMenuAddVar ( " Render " , " Intensity " , & CPostFX : : Intensity , nil , 0.05f , 0 , 10.0f ) ;
DebugMenuAddVarBool8 ( " Render " , " Motion Blur " , & CPostFX : : MotionBlurOn , nil ) ;
2020-08-18 10:58:15 +02:00
# endif
# ifdef EXTENDED_PIPELINES
static const char * vehpipenames [ ] = { " MatFX " , " Neo " } ;
e = DebugMenuAddVar ( " Render " , " Vehicle Pipeline " , & CustomPipes : : VehiclePipeSwitch , nil ,
1 , CustomPipes : : VEHICLEPIPE_MATFX , CustomPipes : : VEHICLEPIPE_NEO , vehpipenames ) ;
DebugMenuEntrySetWrap ( e , true ) ;
DebugMenuAddVar ( " Render " , " Neo Vehicle Shininess " , & CustomPipes : : VehicleShininess , nil , 0.1f , 0 , 1.0f ) ;
DebugMenuAddVar ( " Render " , " Neo Vehicle Specularity " , & CustomPipes : : VehicleSpecularity , nil , 0.1f , 0 , 1.0f ) ;
2020-10-27 15:55:07 +01:00
DebugMenuAddVarBool8 ( " Render " , " Neo Ped Rim light enable " , & CustomPipes : : RimlightEnable , nil ) ;
DebugMenuAddVar ( " Render " , " Mult " , & CustomPipes : : RimlightMult , nil , 0.1f , 0 , 1.0f ) ;
DebugMenuAddVarBool8 ( " Render " , " Neo World Lightmaps enable " , & CustomPipes : : LightmapEnable , nil ) ;
DebugMenuAddVar ( " Render " , " Mult " , & CustomPipes : : LightmapMult , nil , 0.1f , 0 , 1.0f ) ;
DebugMenuAddVarBool8 ( " Render " , " Neo Road Gloss enable " , & CustomPipes : : GlossEnable , nil ) ;
DebugMenuAddVar ( " Render " , " Mult " , & CustomPipes : : GlossMult , nil , 0.1f , 0 , 1.0f ) ;
2020-08-13 18:14:24 +02:00
# endif
2020-05-05 13:02:42 +02:00
DebugMenuAddVarBool8 ( " Render " , " Show Ped Paths " , & gbShowPedPaths , nil ) ;
DebugMenuAddVarBool8 ( " Render " , " Show Car Paths " , & gbShowCarPaths , nil ) ;
DebugMenuAddVarBool8 ( " Render " , " Show Car Path Links " , & gbShowCarPathsLinks , nil ) ;
DebugMenuAddVarBool8 ( " Render " , " Show Ped Road Groups " , & gbShowPedRoadGroups , nil ) ;
DebugMenuAddVarBool8 ( " Render " , " Show Car Road Groups " , & gbShowCarRoadGroups , nil ) ;
DebugMenuAddVarBool8 ( " Render " , " Show Collision Lines " , & gbShowCollisionLines , nil ) ;
DebugMenuAddVarBool8 ( " Render " , " Show Collision Polys " , & gbShowCollisionPolys , nil ) ;
DebugMenuAddVarBool8 ( " Render " , " Don't render Buildings " , & gbDontRenderBuildings , nil ) ;
DebugMenuAddVarBool8 ( " Render " , " Don't render Big Buildings " , & gbDontRenderBigBuildings , nil ) ;
DebugMenuAddVarBool8 ( " Render " , " Don't render Peds " , & gbDontRenderPeds , nil ) ;
DebugMenuAddVarBool8 ( " Render " , " Don't render Vehicles " , & gbDontRenderVehicles , nil ) ;
DebugMenuAddVarBool8 ( " Render " , " Don't render Objects " , & gbDontRenderObjects , nil ) ;
2020-06-01 13:21:19 +02:00
DebugMenuAddVarBool8 ( " Render " , " Don't Render Water " , & gbDontRenderWater , nil ) ;
2020-04-25 12:16:50 +02:00
2020-06-08 13:01:07 +02:00
DebugMenuAddVarBool8 ( " Debug " , " pad 1 -> pad 2 " , & CPad : : m_bMapPadOneToPadTwo , nil ) ;
2020-04-25 12:16:50 +02:00
DebugMenuAddVarBool8 ( " Debug " , " Edit on " , & CSceneEdit : : m_bEditOn , nil ) ;
2020-04-17 06:01:54 +02:00
# ifdef MENU_MAP
DebugMenuAddCmd ( " Debug " , " Teleport to map waypoint " , TeleportToWaypoint ) ;
# endif
2020-05-25 22:59:55 +02:00
DebugMenuAddCmd ( " Debug " , " Switch car collision " , SwitchCarCollision ) ;
2019-07-26 18:48:14 +02:00
DebugMenuAddVar ( " Debug " , " Engine Status " , & engineStatus , nil , 1 , 0 , 226 , nil ) ;
DebugMenuAddCmd ( " Debug " , " Set Engine Status " , SetEngineStatus ) ;
2019-07-08 21:37:47 +02:00
DebugMenuAddCmd ( " Debug " , " Fix Car " , FixCar ) ;
2019-07-11 12:48:49 +02:00
DebugMenuAddCmd ( " Debug " , " Toggle Comedy Controls " , ToggleComedy ) ;
2019-07-23 16:39:30 +02:00
DebugMenuAddCmd ( " Debug " , " Place Car on Road " , PlaceOnRoad ) ;
2019-07-11 12:48:49 +02:00
2020-04-25 12:16:50 +02:00
DebugMenuAddVarBool8 ( " Debug " , " Catalina Heli On " , & CHeli : : CatalinaHeliOn , nil ) ;
2019-08-04 00:31:00 +02:00
DebugMenuAddCmd ( " Debug " , " Catalina Fly By " , CHeli : : StartCatalinaFlyBy ) ;
DebugMenuAddCmd ( " Debug " , " Catalina Take Off " , CHeli : : CatalinaTakeOff ) ;
DebugMenuAddCmd ( " Debug " , " Catalina Fly Away " , CHeli : : MakeCatalinaHeliFlyAway ) ;
2020-04-25 12:16:50 +02:00
DebugMenuAddVarBool8 ( " Debug " , " Script Heli On " , & CHeli : : ScriptHeliOn , nil ) ;
DebugMenuAddVarBool8 ( " Debug " , " Toggle popping heads on headshot " , & CPed : : bPopHeadsOnHeadshot , nil ) ;
2019-05-31 00:32:50 +02:00
DebugMenuAddCmd ( " Debug " , " Start Credits " , CCredits : : Start ) ;
DebugMenuAddCmd ( " Debug " , " Stop Credits " , CCredits : : Stop ) ;
2020-03-26 14:16:06 +01:00
2020-05-29 12:03:32 +02:00
DebugMenuAddVarBool8 ( " Debug " , " Show DebugStuffInRelease " , & gbDebugStuffInRelease , nil ) ;
2020-06-01 13:21:19 +02:00
# ifdef TIMEBARS
2020-05-29 12:03:32 +02:00
DebugMenuAddVarBool8 ( " Debug " , " Show Timebars " , & gbShowTimebars , nil ) ;
2020-06-01 13:21:19 +02:00
# endif
2020-05-29 12:03:32 +02:00
2020-03-26 14:16:06 +01:00
extern bool PrintDebugCode ;
2020-04-17 15:31:11 +02:00
extern int16 DebugCamMode ;
2020-04-25 12:16:50 +02:00
DebugMenuAddVarBool8 ( " Cam " , " Use mouse Cam " , & CCamera : : m_bUseMouse3rdPerson , nil ) ;
2020-03-29 14:05:21 +02:00
# ifdef FREE_CAM
2020-04-25 12:16:50 +02:00
DebugMenuAddVarBool8 ( " Cam " , " Free Cam " , & CCamera : : bFreeCam , nil ) ;
2020-03-29 14:05:21 +02:00
# endif
2020-04-25 12:16:50 +02:00
DebugMenuAddVarBool8 ( " Cam " , " Print Debug Code " , & PrintDebugCode , nil ) ;
2020-03-26 14:16:06 +01:00
DebugMenuAddVar ( " Cam " , " Cam Mode " , & DebugCamMode , nil , 1 , 0 , CCam : : MODE_EDITOR , nil ) ;
2020-03-27 18:19:08 +01:00
DebugMenuAddCmd ( " Cam " , " Normal " , [ ] ( ) { DebugCamMode = 0 ; } ) ;
DebugMenuAddCmd ( " Cam " , " Follow Ped With Bind " , [ ] ( ) { DebugCamMode = CCam : : MODE_FOLLOW_PED_WITH_BIND ; } ) ;
DebugMenuAddCmd ( " Cam " , " Reaction " , [ ] ( ) { DebugCamMode = CCam : : MODE_REACTION ; } ) ;
DebugMenuAddCmd ( " Cam " , " Chris " , [ ] ( ) { DebugCamMode = CCam : : MODE_CHRIS ; } ) ;
2020-03-26 14:16:06 +01:00
DebugMenuAddCmd ( " Cam " , " Reset Statics " , ResetCamStatics ) ;
2019-07-24 18:55:43 +02:00
CTweakVars : : AddDBG ( " Debug " ) ;
2019-05-30 21:24:47 +02:00
}
2019-06-12 12:34:22 +02:00
}
2020-05-09 15:06:13 +02:00
# endif
2019-06-12 12:34:22 +02:00
2019-06-02 23:42:51 +02:00
const int re3_buffsize = 1024 ;
static char re3_buff [ re3_buffsize ] ;
void re3_assert ( const char * expr , const char * filename , unsigned int lineno , const char * func )
{
2020-05-11 04:55:57 +02:00
# ifdef _WIN32
2019-06-02 23:42:51 +02:00
int nCode ;
strcpy_s ( re3_buff , re3_buffsize , " Assertion failed! " ) ;
strcat_s ( re3_buff , re3_buffsize , " \n " ) ;
strcat_s ( re3_buff , re3_buffsize , " File: " ) ;
strcat_s ( re3_buff , re3_buffsize , filename ) ;
strcat_s ( re3_buff , re3_buffsize , " \n " ) ;
strcat_s ( re3_buff , re3_buffsize , " Line: " ) ;
_itoa_s ( lineno , re3_buff + strlen ( re3_buff ) , re3_buffsize - strlen ( re3_buff ) , 10 ) ;
strcat_s ( re3_buff , re3_buffsize , " \n " ) ;
strcat_s ( re3_buff , re3_buffsize , " Function: " ) ;
strcat_s ( re3_buff , re3_buffsize , func ) ;
strcat_s ( re3_buff , re3_buffsize , " \n " ) ;
strcat_s ( re3_buff , re3_buffsize , " Expression: " ) ;
strcat_s ( re3_buff , re3_buffsize , expr ) ;
strcat_s ( re3_buff , re3_buffsize , " \n " ) ;
strcat_s ( re3_buff , re3_buffsize , " \n " ) ;
strcat_s ( re3_buff , re3_buffsize , " (Press Retry to debug the application) " ) ;
2019-06-30 12:53:39 +02:00
nCode = : : MessageBoxA ( nil , re3_buff , " RE3 Assertion Failed! " ,
2019-06-02 23:42:51 +02:00
MB_ABORTRETRYIGNORE | MB_ICONHAND | MB_SETFOREGROUND | MB_TASKMODAL ) ;
if ( nCode = = IDABORT )
{
raise ( SIGABRT ) ;
_exit ( 3 ) ;
}
if ( nCode = = IDRETRY )
{
__debugbreak ( ) ;
return ;
}
if ( nCode = = IDIGNORE )
return ;
abort ( ) ;
2020-05-11 04:55:57 +02:00
# else
// TODO
printf ( " \n RE3 ASSERT FAILED \n \t File: %s \n \t Line: %d \n \t Function: %s \n \t Expression: %s \n " , filename , lineno , func , expr ) ;
assert ( false ) ;
# endif
2019-06-02 23:42:51 +02:00
}
2019-08-16 20:17:15 +02:00
void re3_debug ( const char * format , . . . )
2019-06-02 23:42:51 +02:00
{
va_list va ;
va_start ( va , format ) ;
2020-05-11 04:55:57 +02:00
# ifdef _WIN32
2019-06-02 23:42:51 +02:00
vsprintf_s ( re3_buff , re3_buffsize , format , va ) ;
2020-05-11 04:55:57 +02:00
# else
vsprintf ( re3_buff , format , va ) ;
# endif
2019-06-02 23:42:51 +02:00
va_end ( va ) ;
2020-04-08 00:52:08 +02:00
printf ( " %s " , re3_buff ) ;
2020-03-26 14:16:06 +01:00
CDebug : : DebugAddText ( re3_buff ) ;
2019-06-02 23:42:51 +02:00
}
2019-08-16 20:17:15 +02:00
void re3_trace ( const char * filename , unsigned int lineno , const char * func , const char * format , . . . )
2019-06-02 23:42:51 +02:00
{
char buff [ re3_buffsize * 2 ] ;
va_list va ;
va_start ( va , format ) ;
2020-05-11 04:55:57 +02:00
# ifdef _WIN32
2019-06-02 23:42:51 +02:00
vsprintf_s ( re3_buff , re3_buffsize , format , va ) ;
va_end ( va ) ;
sprintf_s ( buff , re3_buffsize * 2 , " [%s.%s:%d]: %s " , filename , func , lineno , re3_buff ) ;
2020-05-11 04:55:57 +02:00
# else
vsprintf ( re3_buff , format , va ) ;
va_end ( va ) ;
2019-06-02 23:42:51 +02:00
2020-05-11 04:55:57 +02:00
sprintf ( buff , " [%s.%s:%d]: %s " , filename , func , lineno , re3_buff ) ;
# endif
OutputDebugString ( buff ) ;
2019-06-02 23:42:51 +02:00
}
2019-06-01 01:58:19 +02:00
2020-05-07 08:26:16 +02:00
void re3_usererror ( const char * format , . . . )
{
va_list va ;
va_start ( va , format ) ;
2020-05-11 04:55:57 +02:00
# ifdef _WIN32
2020-05-07 08:26:16 +02:00
vsprintf_s ( re3_buff , re3_buffsize , format , va ) ;
va_end ( va ) ;
: : MessageBoxA ( nil , re3_buff , " RE3 Error! " ,
MB_OK | MB_ICONHAND | MB_SETFOREGROUND | MB_TASKMODAL ) ;
raise ( SIGABRT ) ;
_exit ( 3 ) ;
2020-05-11 04:55:57 +02:00
# else
vsprintf ( re3_buff , format , va ) ;
printf ( " \n RE3 Error! \n \t %s \n " , re3_buff ) ;
assert ( false ) ;
# endif
2020-05-07 08:26:16 +02:00
}
2019-10-11 23:06:30 +02:00
# ifdef VALIDATE_SAVE_SIZE
2020-03-11 08:12:40 +01:00
int32 _saveBufCount ;
2019-10-11 23:06:30 +02:00
# endif