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"
2021-02-05 15:51:57 +01:00
# if defined DETECT_JOYSTICK_MENU && defined XINPUT
# include <xinput.h>
# if !defined(PSAPI_VERSION) || (PSAPI_VERSION > 1)
# pragma comment( lib, "Xinput9_1_0.lib" )
# else
# pragma comment( lib, "Xinput.lib" )
# endif
# endif
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-11-16 00:41:03 +01:00
# include "Script.h"
2020-08-13 18:14:24 +02:00
# include "postfx.h"
2020-08-18 10:58:15 +02:00
# include "custompipes.h"
2020-11-30 23:44:58 +01:00
# include "MemoryHeap.h"
2020-12-27 21:55:13 +01:00
# include "FileMgr.h"
2021-01-15 02:40:34 +01:00
# include "Camera.h"
# include "MBlur.h"
2020-10-25 00:05:07 +02:00
# include "ControllerConfig.h"
2021-07-11 23:11:11 +02:00
# include "CarCtrl.h"
# include "Population.h"
# include "IniFile.h"
2019-05-30 21:24:47 +02:00
2021-02-05 15:51:57 +01:00
# ifdef DETECT_JOYSTICK_MENU
2021-01-16 14:44:59 +01:00
# include "crossplatform.h"
# endif
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"
2021-02-07 18:35:43 +01:00
# ifdef MORE_LANGUAGES
void LangPolSelect ( int8 action )
{
if ( action = = FEOPTION_ACTION_SELECT ) {
FrontEndMenuManager . m_PrefsLanguage = CMenuManager : : LANGUAGE_POLISH ;
FrontEndMenuManager . m_bFrontEnd_ReloadObrTxtGxt = true ;
FrontEndMenuManager . InitialiseChangedLanguageSettings ( ) ;
FrontEndMenuManager . SaveSettings ( ) ;
}
}
void LangRusSelect ( int8 action )
{
if ( action = = FEOPTION_ACTION_SELECT ) {
FrontEndMenuManager . m_PrefsLanguage = CMenuManager : : LANGUAGE_RUSSIAN ;
FrontEndMenuManager . m_bFrontEnd_ReloadObrTxtGxt = true ;
FrontEndMenuManager . InitialiseChangedLanguageSettings ( ) ;
FrontEndMenuManager . SaveSettings ( ) ;
}
}
void LangJapSelect ( int8 action )
{
if ( action = = FEOPTION_ACTION_SELECT ) {
FrontEndMenuManager . m_PrefsLanguage = CMenuManager : : LANGUAGE_JAPANESE ;
FrontEndMenuManager . m_bFrontEnd_ReloadObrTxtGxt = true ;
FrontEndMenuManager . InitialiseChangedLanguageSettings ( ) ;
FrontEndMenuManager . SaveSettings ( ) ;
}
}
# endif
2020-10-28 03:11:34 +01:00
void
CustomFrontendOptionsPopulate ( void )
2020-08-19 19:30:57 +02:00
{
2021-02-08 16:21:00 +01:00
// Most of custom options are done statically in MenuScreensCustom.cpp, we add them here only if they're dependent to extra files
2020-12-27 21:55:13 +01:00
2021-02-08 16:21:00 +01:00
// These work only if we have neo folder
2021-02-07 18:35:43 +01:00
int fd ;
2020-12-27 21:55:13 +01:00
# ifdef EXTENDED_PIPELINES
const char * vehPipelineNames [ ] = { " FED_MFX " , " FED_NEO " } ;
const char * off_on [ ] = { " FEM_OFF " , " FEM_ON " } ;
2021-02-07 18:35:43 +01:00
fd = CFileMgr : : OpenFile ( " neo/neo.txd " , " r " ) ;
2020-12-27 21:55:13 +01:00
if ( fd ) {
# ifdef GRAPHICS_MENU_OPTIONS
FrontendOptionSetCursor ( MENUPAGE_GRAPHICS_SETTINGS , - 3 , false ) ;
2021-01-15 02:40:34 +01:00
FrontendOptionAddSelect ( " FED_VPL " , vehPipelineNames , ARRAY_SIZE ( vehPipelineNames ) , ( int8 * ) & CustomPipes : : VehiclePipeSwitch , false , nil , " Graphics " , " VehiclePipeline " ) ;
FrontendOptionAddSelect ( " FED_PRM " , off_on , 2 , ( int8 * ) & CustomPipes : : RimlightEnable , false , nil , " Graphics " , " NeoRimLight " ) ;
FrontendOptionAddSelect ( " FED_WLM " , off_on , 2 , ( int8 * ) & CustomPipes : : LightmapEnable , false , nil , " Graphics " , " NeoLightMaps " ) ;
FrontendOptionAddSelect ( " FED_RGL " , off_on , 2 , ( int8 * ) & CustomPipes : : GlossEnable , false , nil , " Graphics " , " NeoRoadGloss " ) ;
2020-12-27 21:55:13 +01:00
# else
FrontendOptionSetCursor ( MENUPAGE_DISPLAY_SETTINGS , - 3 , false ) ;
2021-01-15 02:40:34 +01:00
FrontendOptionAddSelect ( " FED_VPL " , vehPipelineNames , ARRAY_SIZE ( vehPipelineNames ) , ( int8 * ) & CustomPipes : : VehiclePipeSwitch , false , nil , " Graphics " , " VehiclePipeline " ) ;
FrontendOptionAddSelect ( " FED_PRM " , off_on , 2 , ( int8 * ) & CustomPipes : : RimlightEnable , false , nil , " Graphics " , " NeoRimLight " ) ;
FrontendOptionAddSelect ( " FED_WLM " , off_on , 2 , ( int8 * ) & CustomPipes : : LightmapEnable , false , nil , " Graphics " , " NeoLightMaps " ) ;
FrontendOptionAddSelect ( " FED_RGL " , off_on , 2 , ( int8 * ) & CustomPipes : : GlossEnable , false , nil , " Graphics " , " NeoRoadGloss " ) ;
2020-12-27 21:55:13 +01:00
# endif
CFileMgr : : CloseFile ( fd ) ;
}
# endif
2021-02-07 18:35:43 +01:00
// Add outsourced language translations, if files are found
# ifdef MORE_LANGUAGES
2021-02-08 16:21:00 +01:00
int fd2 ;
2021-02-07 18:35:43 +01:00
FrontendOptionSetCursor ( MENUPAGE_LANGUAGE_SETTINGS , 5 , false ) ;
2021-02-08 16:21:00 +01:00
if ( fd = CFileMgr : : OpenFile ( " text/polish.gxt " , " r " ) ) {
if ( fd2 = CFileMgr : : OpenFile ( " models/fonts_p.txd " , " r " ) ) {
FrontendOptionAddDynamic ( " FEL_POL " , nil , nil , LangPolSelect , nil , nil ) ;
CFileMgr : : CloseFile ( fd2 ) ;
}
2021-02-07 18:35:43 +01:00
CFileMgr : : CloseFile ( fd ) ;
}
2021-02-08 16:21:00 +01:00
if ( fd = CFileMgr : : OpenFile ( " text/russian.gxt " , " r " ) ) {
if ( fd2 = CFileMgr : : OpenFile ( " models/fonts_r.txd " , " r " ) ) {
FrontendOptionAddDynamic ( " FEL_RUS " , nil , nil , LangRusSelect , nil , nil ) ;
CFileMgr : : CloseFile ( fd2 ) ;
}
2021-02-07 18:35:43 +01:00
CFileMgr : : CloseFile ( fd ) ;
}
2021-02-08 16:21:00 +01:00
if ( fd = CFileMgr : : OpenFile ( " text/japanese.gxt " , " r " ) ) {
if ( fd2 = CFileMgr : : OpenFile ( " models/fonts_j.txd " , " r " ) ) {
FrontendOptionAddDynamic ( " FEL_JAP " , nil , nil , LangJapSelect , nil , nil ) ;
CFileMgr : : CloseFile ( fd2 ) ;
}
2021-02-07 18:35:43 +01:00
CFileMgr : : CloseFile ( fd ) ;
}
# endif
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 ;
2021-01-15 02:40:34 +01:00
bool ReadIniIfExists ( const char * cat , const char * key , uint32 * out )
2020-08-24 21:42:26 +02:00
{
2021-01-15 02:40:34 +01:00
std : : string strval = cfg . get ( cat , key , " \xBA " ) ;
2020-11-11 19:57:44 +01:00
const char * value = strval . c_str ( ) ;
2021-01-15 02:40:34 +01:00
char * endPtr ;
if ( value & & value [ 0 ] ! = ' \xBA ' ) {
* out = strtoul ( value , & endPtr , 0 ) ;
return true ;
}
return false ;
}
2020-09-30 19:02:47 +02:00
2021-01-15 02:40:34 +01:00
bool ReadIniIfExists ( const char * cat , const char * key , bool * out )
{
std : : string strval = cfg . get ( cat , key , " \xBA " ) ;
const char * value = strval . c_str ( ) ;
char * endPtr ;
if ( value & & value [ 0 ] ! = ' \xBA ' ) {
* out = strtoul ( value , & endPtr , 0 ) ;
return true ;
}
return false ;
2020-09-30 19:02:47 +02:00
}
2020-08-19 19:30:57 +02:00
2021-01-15 02:40:34 +01:00
bool ReadIniIfExists ( const char * cat , const char * key , int32 * out )
2020-08-19 19:30:57 +02:00
{
2021-01-15 02:40:34 +01:00
std : : string strval = cfg . get ( cat , key , " \xBA " ) ;
2020-11-11 19:57:44 +01:00
const char * value = strval . c_str ( ) ;
2021-01-15 02:40:34 +01:00
char * endPtr ;
if ( value & & value [ 0 ] ! = ' \xBA ' ) {
* out = strtol ( value , & endPtr , 0 ) ;
return true ;
}
return false ;
}
2020-08-24 21:42:26 +02:00
2021-01-15 02:40:34 +01:00
bool ReadIniIfExists ( const char * cat , const char * key , int8 * out )
{
std : : string strval = cfg . get ( cat , key , " \xBA " ) ;
const char * value = strval . c_str ( ) ;
char * endPtr ;
if ( value & & value [ 0 ] ! = ' \xBA ' ) {
* out = strtol ( value , & endPtr , 0 ) ;
return true ;
}
return false ;
2020-08-19 19:30:57 +02:00
}
2021-01-15 02:40:34 +01:00
bool ReadIniIfExists ( const char * cat , const char * key , float * out )
2020-11-07 16:04:01 +01:00
{
2021-01-15 02:40:34 +01:00
std : : string strval = cfg . get ( cat , key , " \xBA " ) ;
const char * value = strval . c_str ( ) ;
if ( value & & value [ 0 ] ! = ' \xBA ' ) {
* out = atof ( value ) ;
return true ;
}
return false ;
}
bool ReadIniIfExists ( const char * cat , const char * key , char * out , int size )
{
std : : string strval = cfg . get ( cat , key , " \xBA " ) ;
const char * value = strval . c_str ( ) ;
if ( value & & value [ 0 ] ! = ' \xBA ' ) {
strncpy ( out , value , size ) ;
return true ;
2020-11-07 16:04:01 +01:00
}
2021-01-15 02:40:34 +01:00
return false ;
2020-11-07 16:04:01 +01:00
}
2021-01-15 02:40:34 +01:00
void StoreIni ( const char * cat , const char * key , uint32 val )
2020-11-07 16:04:01 +01:00
{
char temp [ 10 ] ;
2021-01-15 02:40:34 +01:00
sprintf ( temp , " %u " , val ) ;
cfg . set ( cat , key , temp ) ;
}
void StoreIni ( const char * cat , const char * key , uint8 val )
{
char temp [ 10 ] ;
sprintf ( temp , " %u " , ( uint32 ) val ) ;
cfg . set ( cat , key , temp ) ;
}
void StoreIni ( const char * cat , const char * key , int32 val )
{
char temp [ 10 ] ;
sprintf ( temp , " %d " , val ) ;
cfg . set ( cat , key , temp ) ;
}
void StoreIni ( const char * cat , const char * key , int8 val )
{
char temp [ 10 ] ;
sprintf ( temp , " %d " , ( int32 ) val ) ;
cfg . set ( cat , key , temp ) ;
}
void StoreIni ( const char * cat , const char * key , float val )
{
char temp [ 10 ] ;
sprintf ( temp , " %f " , val ) ;
cfg . set ( cat , key , temp ) ;
}
void StoreIni ( const char * cat , const char * key , char * val , int size )
{
cfg . set ( cat , key , val ) ;
}
const char * iniControllerActions [ ] = { " PED_FIREWEAPON " , " PED_CYCLE_WEAPON_RIGHT " , " PED_CYCLE_WEAPON_LEFT " , " GO_FORWARD " , " GO_BACK " , " GO_LEFT " , " GO_RIGHT " , " PED_SNIPER_ZOOM_IN " ,
" PED_SNIPER_ZOOM_OUT " , " VEHICLE_ENTER_EXIT " , " CAMERA_CHANGE_VIEW_ALL_SITUATIONS " , " PED_JUMPING " , " PED_SPRINT " , " PED_LOOKBEHIND " ,
# ifdef BIND_VEHICLE_FIREWEAPON
" VEHICLE_FIREWEAPON " ,
# endif
" VEHICLE_ACCELERATE " , " VEHICLE_BRAKE " , " VEHICLE_CHANGE_RADIO_STATION " , " VEHICLE_HORN " , " TOGGLE_SUBMISSIONS " , " VEHICLE_HANDBRAKE " , " PED_1RST_PERSON_LOOK_LEFT " ,
" PED_1RST_PERSON_LOOK_RIGHT " , " VEHICLE_LOOKLEFT " , " VEHICLE_LOOKRIGHT " , " VEHICLE_LOOKBEHIND " , " VEHICLE_TURRETLEFT " , " VEHICLE_TURRETRIGHT " , " VEHICLE_TURRETUP " , " VEHICLE_TURRETDOWN " ,
" PED_CYCLE_TARGET_LEFT " , " PED_CYCLE_TARGET_RIGHT " , " PED_CENTER_CAMERA_BEHIND_PLAYER " , " PED_LOCK_TARGET " , " NETWORK_TALK " , " PED_1RST_PERSON_LOOK_UP " , " PED_1RST_PERSON_LOOK_DOWN " ,
" _CONTROLLERACTION_36 " , " TOGGLE_DPAD " , " SWITCH_DEBUG_CAM_ON " , " TAKE_SCREEN_SHOT " , " SHOW_MOUSE_POINTER_TOGGLE " } ;
const char * iniControllerTypes [ ] = { " kbd: " , " 2ndKbd: " , " mouse: " , " joy: " } ;
const char * iniMouseButtons [ ] = { " LEFT " , " MIDDLE " , " RIGHT " , " WHLUP " , " WHLDOWN " , " X1 " , " X2 " } ;
const char * iniKeyboardButtons [ ] = { " ESC " , " F1 " , " F2 " , " F3 " , " F4 " , " F5 " , " F6 " , " F7 " , " F8 " , " F9 " , " F10 " , " F11 " , " F12 " ,
" INS " , " DEL " , " HOME " , " END " , " PGUP " , " PGDN " , " UP " , " DOWN " , " LEFT " , " RIGHT " , " DIVIDE " , " TIMES " , " PLUS " , " MINUS " , " PADDEL " ,
" PADEND " , " PADDOWN " , " PADPGDN " , " PADLEFT " , " PAD5 " , " NUMLOCK " , " PADRIGHT " , " PADHOME " , " PADUP " , " PADPGUP " , " PADINS " ,
" PADENTER " , " SCROLL " , " PAUSE " , " BACKSP " , " TAB " , " CAPSLK " , " ENTER " , " LSHIFT " , " RSHIFT " , " SHIFT " , " LCTRL " , " RCTRL " , " LALT " ,
" RALT " , " LWIN " , " RWIN " , " APPS " , " NULL " } ;
void LoadINIControllerSettings ( )
{
2021-02-05 15:51:57 +01:00
# ifdef DETECT_JOYSTICK_MENU
# ifdef XINPUT
int storedJoy1 = - 1 ;
if ( ReadIniIfExists ( " Controller " , " JoystickName " , & storedJoy1 ) ) {
CPad : : XInputJoy1 = - 1 ;
CPad : : XInputJoy2 = - 1 ;
XINPUT_STATE xstate ;
memset ( & xstate , 0 , sizeof ( XINPUT_STATE ) ) ;
// Firstly confirm & set joy 1
if ( XInputGetState ( storedJoy1 , & xstate ) = = ERROR_SUCCESS ) {
CPad : : XInputJoy1 = storedJoy1 ;
}
for ( int i = 0 ; i < = 3 ; i + + ) {
if ( XInputGetState ( i , & xstate ) = = ERROR_SUCCESS ) {
if ( CPad : : XInputJoy1 = = - 1 )
CPad : : XInputJoy1 = i ;
else if ( CPad : : XInputJoy2 = = - 1 & & i ! = CPad : : XInputJoy1 )
CPad : : XInputJoy2 = i ;
}
}
2021-02-12 17:50:26 +01:00
// There is no plug event on XInput, so let's leave XInputJoy1/2 as 0/1 respectively, and hotplug will be possible.
if ( CPad : : XInputJoy1 = = - 1 ) {
CPad : : XInputJoy1 = 0 ;
CPad : : XInputJoy2 = 1 ;
} else if ( CPad : : XInputJoy2 = = - 1 ) {
CPad : : XInputJoy2 = ( CPad : : XInputJoy1 + 1 ) % 4 ;
}
2021-02-05 15:51:57 +01:00
}
# else
2021-01-22 21:40:28 +01:00
ReadIniIfExists ( " Controller " , " JoystickName " , gSelectedJoystickName , 128 ) ;
2021-02-05 15:51:57 +01:00
# endif
2021-01-22 21:40:28 +01:00
# endif
// force to default GTA behaviour (never overwrite bindings on joy change/initialization) if user init'ed/set bindings before we introduced that
if ( ! ReadIniIfExists ( " Controller " , " PadButtonsInited " , & ControlsManager . ms_padButtonsInited ) ) {
ControlsManager . ms_padButtonsInited = cfg . category_size ( " Bindings " ) ! = 0 ? 16 : 0 ;
}
2021-01-15 02:40:34 +01:00
for ( int32 i = 0 ; i < MAX_CONTROLLERACTIONS ; i + + ) {
char value [ 128 ] ;
if ( ReadIniIfExists ( " Bindings " , iniControllerActions [ i ] , value , 128 ) ) {
for ( int32 j = 0 ; j < MAX_CONTROLLERTYPES ; j + + ) {
ControlsManager . ClearSettingsAssociatedWithAction ( ( e_ControllerAction ) i , ( eControllerType ) j ) ;
}
for ( char * binding = strtok ( value , " , " ) ; binding ! = nil ; binding = strtok ( nil , " , " ) ) {
int contType = - 1 ;
for ( int32 k = 0 ; k < ARRAY_SIZE ( iniControllerTypes ) ; k + + ) {
int len = strlen ( iniControllerTypes [ k ] ) ;
if ( strncmp ( binding , iniControllerTypes [ k ] , len ) = = 0 ) {
contType = k ;
binding + = len ;
break ;
}
}
if ( contType = = - 1 )
continue ;
int contKey ;
if ( contType = = JOYSTICK ) {
char * temp ;
contKey = strtol ( binding , & temp , 0 ) ;
} else if ( contType = = KEYBOARD | | contType = = OPTIONAL_EXTRA ) {
if ( strlen ( binding ) = = 1 ) {
contKey = binding [ 0 ] ;
} else if ( strcmp ( binding , " SPC " ) = = 0 ) {
contKey = ' ' ;
} else {
for ( int32 k = 0 ; k < ARRAY_SIZE ( iniKeyboardButtons ) ; k + + ) {
if ( strcmp ( binding , iniKeyboardButtons [ k ] ) = = 0 ) {
contKey = 1000 + k ;
break ;
}
}
}
} else if ( contType = = MOUSE ) {
for ( int32 k = 0 ; k < ARRAY_SIZE ( iniMouseButtons ) ; k + + ) {
if ( strcmp ( binding , iniMouseButtons [ k ] ) = = 0 ) {
contKey = 1 + k ;
break ;
}
}
}
ControlsManager . SetControllerKeyAssociatedWithAction ( ( e_ControllerAction ) i , contKey , ( eControllerType ) contType ) ;
}
}
2020-11-07 16:04:01 +01:00
}
}
2021-01-15 02:40:34 +01:00
void SaveINIControllerSettings ( )
{
for ( int32 i = 0 ; i < MAX_CONTROLLERACTIONS ; i + + ) {
char value [ 128 ] = { ' \0 ' } ;
// upper limit should've been GetNumOfSettingsForAction(i), but sadly even R* doesn't use it's own system correctly, and there are gaps between orders.
for ( int32 j = SETORDER_1 ; j < MAX_SETORDERS ; j + + ) {
// We respect the m_ContSetOrder, and join/implode/order the bindings according to that; using comma as seperator.
for ( int32 k = 0 ; k < MAX_CONTROLLERTYPES ; k + + ) {
if ( ControlsManager . m_aSettings [ i ] [ k ] . m_ContSetOrder = = j ) {
char next [ 32 ] ;
if ( k = = JOYSTICK ) {
snprintf ( next , 32 , " %s%d, " , iniControllerTypes [ k ] , ControlsManager . m_aSettings [ i ] [ k ] . m_Key ) ;
} else if ( k = = KEYBOARD | | k = = OPTIONAL_EXTRA ) {
if ( ControlsManager . m_aSettings [ i ] [ k ] . m_Key = = ' ' )
snprintf ( next , 32 , " %sSPC, " , iniControllerTypes [ k ] ) ;
else if ( ControlsManager . m_aSettings [ i ] [ k ] . m_Key < 256 )
snprintf ( next , 32 , " %s%c, " , iniControllerTypes [ k ] , ControlsManager . m_aSettings [ i ] [ k ] . m_Key ) ;
else
snprintf ( next , 32 , " %s%s, " , iniControllerTypes [ k ] , iniKeyboardButtons [ ControlsManager . m_aSettings [ i ] [ k ] . m_Key - 1000 ] ) ;
} else if ( k = = MOUSE ) {
snprintf ( next , 32 , " %s%s, " , iniControllerTypes [ k ] , iniMouseButtons [ ControlsManager . m_aSettings [ i ] [ k ] . m_Key - 1 ] ) ;
}
strcat ( value , next ) ;
break ;
}
}
}
int len = strlen ( value ) ;
if ( len > 0 )
value [ len - 1 ] = ' \0 ' ; // to remove comma
StoreIni ( " Bindings " , iniControllerActions [ i ] , value , 128 ) ;
}
2021-02-05 15:51:57 +01:00
# ifdef DETECT_JOYSTICK_MENU
# ifdef XINPUT
StoreIni ( " Controller " , " JoystickName " , CPad : : XInputJoy1 ) ;
# else
2021-01-22 21:40:28 +01:00
StoreIni ( " Controller " , " JoystickName " , gSelectedJoystickName , 128 ) ;
2021-02-05 15:51:57 +01:00
# endif
2021-01-22 21:40:28 +01:00
# endif
StoreIni ( " Controller " , " PadButtonsInited " , ControlsManager . ms_padButtonsInited ) ;
2021-01-15 02:40:34 +01:00
cfg . write_file ( " re3.ini " ) ;
}
2021-01-22 21:40:28 +01:00
bool LoadINISettings ( )
2020-10-02 16:36:56 +02:00
{
2021-01-22 21:40:28 +01:00
if ( ! cfg . load_file ( " re3.ini " ) )
return false ;
2020-10-02 16:36:56 +02:00
2021-01-15 02:40:34 +01:00
# ifdef IMPROVED_VIDEOMODE
ReadIniIfExists ( " VideoMode " , " Width " , & FrontEndMenuManager . m_nPrefsWidth ) ;
ReadIniIfExists ( " VideoMode " , " Height " , & FrontEndMenuManager . m_nPrefsHeight ) ;
ReadIniIfExists ( " VideoMode " , " Depth " , & FrontEndMenuManager . m_nPrefsDepth ) ;
ReadIniIfExists ( " VideoMode " , " Subsystem " , & FrontEndMenuManager . m_nPrefsSubsystem ) ;
// Windowed mode is loaded below in CUSTOM_FRONTEND_OPTIONS section
# else
ReadIniIfExists ( " Graphics " , " VideoMode " , & FrontEndMenuManager . m_nDisplayVideoMode ) ;
# endif
ReadIniIfExists ( " Controller " , " HeadBob1stPerson " , & TheCamera . m_bHeadBob ) ;
ReadIniIfExists ( " Controller " , " VerticalMouseSens " , & TheCamera . m_fMouseAccelVertical ) ;
ReadIniIfExists ( " Controller " , " HorizantalMouseSens " , & TheCamera . m_fMouseAccelHorzntl ) ;
ReadIniIfExists ( " Controller " , " InvertMouseVertically " , & MousePointerStateHelper . bInvertVertically ) ;
ReadIniIfExists ( " Controller " , " DisableMouseSteering " , & CVehicle : : m_bDisableMouseSteering ) ;
2021-02-03 01:41:12 +01:00
ReadIniIfExists ( " Controller " , " Vibration " , & FrontEndMenuManager . m_PrefsUseVibration ) ;
2021-01-15 02:40:34 +01:00
ReadIniIfExists ( " Audio " , " SfxVolume " , & FrontEndMenuManager . m_PrefsSfxVolume ) ;
ReadIniIfExists ( " Audio " , " MusicVolume " , & FrontEndMenuManager . m_PrefsMusicVolume ) ;
ReadIniIfExists ( " Audio " , " Radio " , & FrontEndMenuManager . m_PrefsRadioStation ) ;
ReadIniIfExists ( " Audio " , " SpeakerType " , & FrontEndMenuManager . m_PrefsSpeakers ) ;
ReadIniIfExists ( " Audio " , " Provider " , & FrontEndMenuManager . m_nPrefsAudio3DProviderIndex ) ;
ReadIniIfExists ( " Audio " , " DynamicAcoustics " , & FrontEndMenuManager . m_PrefsDMA ) ;
ReadIniIfExists ( " Display " , " Brightness " , & FrontEndMenuManager . m_PrefsBrightness ) ;
ReadIniIfExists ( " Display " , " DrawDistance " , & FrontEndMenuManager . m_PrefsLOD ) ;
ReadIniIfExists ( " Display " , " Subtitles " , & FrontEndMenuManager . m_PrefsShowSubtitles ) ;
ReadIniIfExists ( " Graphics " , " AspectRatio " , & FrontEndMenuManager . m_PrefsUseWideScreen ) ;
ReadIniIfExists ( " Graphics " , " VSync " , & FrontEndMenuManager . m_PrefsVsyncDisp ) ;
ReadIniIfExists ( " Graphics " , " FrameLimiter " , & FrontEndMenuManager . m_PrefsFrameLimiter ) ;
ReadIniIfExists ( " Graphics " , " Trails " , & CMBlur : : BlurOn ) ;
ReadIniIfExists ( " General " , " SkinFile " , FrontEndMenuManager . m_PrefsSkinFile , 256 ) ;
ReadIniIfExists ( " Controller " , " Method " , & FrontEndMenuManager . m_ControlMethod ) ;
ReadIniIfExists ( " General " , " Language " , & FrontEndMenuManager . m_PrefsLanguage ) ;
# ifdef EXTENDED_COLOURFILTER
ReadIniIfExists ( " CustomPipesValues " , " PostFXIntensity " , & CPostFX : : Intensity ) ;
# endif
# ifdef EXTENDED_PIPELINES
ReadIniIfExists ( " CustomPipesValues " , " NeoVehicleShininess " , & CustomPipes : : VehicleShininess ) ;
ReadIniIfExists ( " CustomPipesValues " , " NeoVehicleSpecularity " , & CustomPipes : : VehicleSpecularity ) ;
ReadIniIfExists ( " CustomPipesValues " , " RimlightMult " , & CustomPipes : : RimlightMult ) ;
ReadIniIfExists ( " CustomPipesValues " , " LightmapMult " , & CustomPipes : : LightmapMult ) ;
ReadIniIfExists ( " CustomPipesValues " , " GlossMult " , & CustomPipes : : GlossMult ) ;
# endif
2021-01-29 16:46:03 +01:00
# ifdef NEW_RENDERER
ReadIniIfExists ( " Rendering " , " NewRenderer " , & gbNewRenderer ) ;
# endif
2021-01-15 02:40:34 +01:00
# ifdef PROPER_SCALING
ReadIniIfExists ( " Draw " , " ProperScaling " , & CDraw : : ms_bProperScaling ) ;
# endif
# ifdef FIX_RADAR
ReadIniIfExists ( " Draw " , " FixRadar " , & CDraw : : ms_bFixRadar ) ;
# endif
# ifdef FIX_SPRITES
ReadIniIfExists ( " Draw " , " FixSprites " , & CDraw : : ms_bFixSprites ) ;
# endif
2021-02-12 02:04:31 +01:00
# ifdef DRAW_GAME_VERSION_TEXT
2021-02-18 22:40:32 +01:00
ReadIniIfExists ( " General " , " DrawVersionText " , & gbDrawVersionText ) ;
# endif
# ifdef NO_MOVIES
ReadIniIfExists ( " General " , " NoMovies " , & gbNoMovies ) ;
2021-02-11 23:49:09 +01:00
# endif
2021-01-15 02:40:34 +01:00
2020-10-02 16:36:56 +02:00
# ifdef CUSTOM_FRONTEND_OPTIONS
2021-01-15 10:36:58 +01:00
bool migrate = cfg . category_size ( " FrontendOptions " ) ! = 0 ;
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 ) {
2021-01-15 10:36:58 +01:00
// Migrate from old .ini to new .ini
2021-07-11 23:11:11 +02:00
// Old values can only be int8, new ones can contain float if it is slider
if ( migrate & & ReadIniIfExists ( " FrontendOptions " , option . m_CFO - > save , ( int8 * ) option . m_CFO - > value ) )
2021-01-15 10:36:58 +01:00
cfg . remove ( " FrontendOptions " , option . m_CFO - > save ) ;
2021-07-11 23:11:11 +02:00
else if ( option . m_Action = = MENUACTION_CFO_SLIDER )
ReadIniIfExists ( option . m_CFO - > saveCat , option . m_CFO - > save , ( float * ) option . m_CFO - > value ) ;
2021-01-15 10:36:58 +01:00
else
2021-07-11 23:11:11 +02:00
ReadIniIfExists ( option . m_CFO - > saveCat , option . m_CFO - > save , ( int8 * ) option . m_CFO - > value ) ;
2021-01-15 10:36:58 +01:00
2020-10-28 03:11:34 +01:00
if ( option . m_Action = = MENUACTION_CFO_SELECT ) {
2021-07-11 23:11:11 +02:00
option . m_CFOSelect - > lastSavedValue = option . m_CFOSelect - > displayedValue = * ( int8 * ) option . m_CFO - > value ;
2020-10-28 03:11:34 +01:00
}
}
2020-10-02 16:36:56 +02:00
}
}
# endif
2021-01-22 21:40:28 +01:00
2021-07-11 23:11:11 +02:00
// Fetched in above block, but needs evaluation
# ifdef PED_CAR_DENSITY_SLIDERS
CPopulation : : MaxNumberOfPedsInUse = DEFAULT_MAX_NUMBER_OF_PEDS * CIniFile : : PedNumberMultiplier ;
CCarCtrl : : MaxNumberOfCarsInUse = DEFAULT_MAX_NUMBER_OF_CARS * CIniFile : : CarNumberMultiplier ;
# endif
2021-01-22 21:40:28 +01:00
return true ;
2021-01-15 02:40:34 +01:00
}
void SaveINISettings ( )
{
# ifdef IMPROVED_VIDEOMODE
StoreIni ( " VideoMode " , " Width " , FrontEndMenuManager . m_nPrefsWidth ) ;
StoreIni ( " VideoMode " , " Height " , FrontEndMenuManager . m_nPrefsHeight ) ;
StoreIni ( " VideoMode " , " Depth " , FrontEndMenuManager . m_nPrefsDepth ) ;
StoreIni ( " VideoMode " , " Subsystem " , FrontEndMenuManager . m_nPrefsSubsystem ) ;
// Windowed mode is loaded below in CUSTOM_FRONTEND_OPTIONS section
# else
StoreIni ( " Graphics " , " VideoMode " , FrontEndMenuManager . m_nDisplayVideoMode ) ;
# endif
StoreIni ( " Controller " , " HeadBob1stPerson " , TheCamera . m_bHeadBob ) ;
StoreIni ( " Controller " , " VerticalMouseSens " , TheCamera . m_fMouseAccelVertical ) ;
StoreIni ( " Controller " , " HorizantalMouseSens " , TheCamera . m_fMouseAccelHorzntl ) ;
StoreIni ( " Controller " , " InvertMouseVertically " , MousePointerStateHelper . bInvertVertically ) ;
StoreIni ( " Controller " , " DisableMouseSteering " , CVehicle : : m_bDisableMouseSteering ) ;
2021-02-03 01:41:12 +01:00
StoreIni ( " Controller " , " Vibration " , FrontEndMenuManager . m_PrefsUseVibration ) ;
2021-01-15 02:40:34 +01:00
StoreIni ( " Audio " , " SfxVolume " , FrontEndMenuManager . m_PrefsSfxVolume ) ;
StoreIni ( " Audio " , " MusicVolume " , FrontEndMenuManager . m_PrefsMusicVolume ) ;
StoreIni ( " Audio " , " Radio " , FrontEndMenuManager . m_PrefsRadioStation ) ;
StoreIni ( " Audio " , " SpeakerType " , FrontEndMenuManager . m_PrefsSpeakers ) ;
StoreIni ( " Audio " , " Provider " , FrontEndMenuManager . m_nPrefsAudio3DProviderIndex ) ;
StoreIni ( " Audio " , " DynamicAcoustics " , FrontEndMenuManager . m_PrefsDMA ) ;
StoreIni ( " Display " , " Brightness " , FrontEndMenuManager . m_PrefsBrightness ) ;
StoreIni ( " Display " , " DrawDistance " , FrontEndMenuManager . m_PrefsLOD ) ;
StoreIni ( " Display " , " Subtitles " , FrontEndMenuManager . m_PrefsShowSubtitles ) ;
StoreIni ( " Graphics " , " AspectRatio " , FrontEndMenuManager . m_PrefsUseWideScreen ) ;
StoreIni ( " Graphics " , " VSync " , FrontEndMenuManager . m_PrefsVsyncDisp ) ;
StoreIni ( " Graphics " , " FrameLimiter " , FrontEndMenuManager . m_PrefsFrameLimiter ) ;
StoreIni ( " Graphics " , " Trails " , CMBlur : : BlurOn ) ;
StoreIni ( " General " , " SkinFile " , FrontEndMenuManager . m_PrefsSkinFile , 256 ) ;
StoreIni ( " Controller " , " Method " , FrontEndMenuManager . m_ControlMethod ) ;
StoreIni ( " General " , " Language " , FrontEndMenuManager . m_PrefsLanguage ) ;
2020-10-02 16:36:56 +02:00
2020-10-28 03:11:34 +01:00
# ifdef EXTENDED_COLOURFILTER
2021-01-15 02:40:34 +01:00
StoreIni ( " CustomPipesValues " , " PostFXIntensity " , CPostFX : : Intensity ) ;
2020-10-28 03:11:34 +01:00
# endif
# ifdef EXTENDED_PIPELINES
2021-01-15 02:40:34 +01:00
StoreIni ( " CustomPipesValues " , " NeoVehicleShininess " , CustomPipes : : VehicleShininess ) ;
StoreIni ( " CustomPipesValues " , " NeoVehicleSpecularity " , CustomPipes : : VehicleSpecularity ) ;
StoreIni ( " CustomPipesValues " , " RimlightMult " , CustomPipes : : RimlightMult ) ;
StoreIni ( " CustomPipesValues " , " LightmapMult " , CustomPipes : : LightmapMult ) ;
StoreIni ( " CustomPipesValues " , " GlossMult " , CustomPipes : : GlossMult ) ;
2020-10-28 03:11:34 +01:00
# endif
2021-01-29 16:46:03 +01:00
# ifdef NEW_RENDERER
StoreIni ( " Rendering " , " NewRenderer " , gbNewRenderer ) ;
# endif
2021-01-08 21:30:30 +01:00
2021-01-15 02:40:34 +01:00
# ifdef PROPER_SCALING
StoreIni ( " Draw " , " ProperScaling " , CDraw : : ms_bProperScaling ) ;
2021-01-08 21:30:30 +01:00
# endif
2021-01-08 21:55:13 +01:00
# ifdef FIX_RADAR
2021-01-15 02:40:34 +01:00
StoreIni ( " Draw " , " FixRadar " , CDraw : : ms_bFixRadar ) ;
2021-01-08 21:30:30 +01:00
# endif
2021-01-08 21:55:13 +01:00
# ifdef FIX_SPRITES
2021-01-15 02:40:34 +01:00
StoreIni ( " Draw " , " FixSprites " , CDraw : : ms_bFixSprites ) ;
2021-01-08 21:30:30 +01:00
# endif
2021-02-12 02:04:31 +01:00
# ifdef DRAW_GAME_VERSION_TEXT
2021-02-18 22:40:32 +01:00
StoreIni ( " General " , " DrawVersionText " , gbDrawVersionText ) ;
# endif
# ifdef NO_MOVIES
StoreIni ( " General " , " NoMovies " , gbNoMovies ) ;
2021-02-11 23:49:09 +01:00
# endif
2020-10-02 16:36:56 +02:00
# 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 ) {
2021-07-11 23:11:11 +02:00
if ( option . m_Action = = MENUACTION_CFO_SLIDER )
StoreIni ( option . m_CFO - > saveCat , option . m_CFO - > save , * ( float * ) option . m_CFO - > value ) ;
else
StoreIni ( option . m_CFO - > saveCat , option . m_CFO - > save , * ( int8 * ) option . m_CFO - > value ) ;
2020-10-02 16:36:56 +02:00
}
}
}
# endif
2020-11-07 16:04:01 +01:00
2021-01-15 02:40:34 +01:00
cfg . write_file ( " re3.ini " ) ;
2020-10-02 16:36:56 +02:00
}
# 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-11 12:48:49 +02:00
static void
ToggleComedy ( void )
{
CVehicle * veh = FindPlayerVehicle ( ) ;
if ( veh = = nil )
return ;
veh - > bComedyControls = ! veh - > bComedyControls ;
}
2021-02-13 00:08:35 +01:00
static void
PlaceOnRoad ( void )
{
CVehicle * veh = FindPlayerVehicle ( ) ;
if ( veh = = nil )
return ;
if ( veh - > IsCar ( ) )
( ( CAutomobile * ) veh ) - > PlaceOnRoadProperly ( ) ;
}
2021-02-13 14:22:00 +01:00
static void
ResetCamStatics ( void )
{
TheCamera . Cams [ TheCamera . ActiveCam ] . ResetStatics = true ;
}
2021-02-13 00:08:35 +01:00
2020-11-16 00:41:03 +01:00
# ifdef MISSION_SWITCHER
int8 nextMissionToSwitch = 0 ;
static void
SwitchToMission ( void )
{
CTheScripts : : SwitchToMission ( nextMissionToSwitch ) ;
}
# endif
2020-11-30 23:44:58 +01:00
# ifdef USE_CUSTOM_ALLOCATOR
static void ParseHeap ( void ) { gMainHeap . ParseHeap ( ) ; }
# endif
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 )
2021-01-31 15:00:36 +01:00
TweakVarsList = ( CTweakVar * * ) realloc ( TweakVarsList , ( TweakVarsListSize + 1 ) * sizeof ( CTweakVar * ) ) ;
2020-05-11 04:55:57 +02:00
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 ) ;
2021-02-13 00:08:35 +01:00
# ifdef PROPER_SCALING
DebugMenuAddVarBool8 ( " Render " , " Proper Scaling " , & CDraw : : ms_bProperScaling , nil ) ;
# endif
# ifdef FIX_RADAR
DebugMenuAddVarBool8 ( " Render " , " Fix Radar " , & CDraw : : ms_bFixRadar , nil ) ;
# endif
# ifdef FIX_SPRITES
DebugMenuAddVarBool8 ( " Render " , " Fix Sprites " , & CDraw : : ms_bFixSprites , nil ) ;
# endif
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 ) ;
2021-01-05 11:12:48 +01:00
# ifdef NEW_RENDERER
2021-02-13 00:08:35 +01:00
DebugMenuAddVarBool8 ( " Render " , " New Renderer " , & gbNewRenderer , nil ) ;
2021-01-05 11:12:48 +01:00
extern bool gbRenderRoads ;
extern bool gbRenderEverythingBarRoads ;
//extern bool gbRenderFadingInUnderwaterEntities;
extern bool gbRenderFadingInEntities ;
extern bool gbRenderWater ;
extern bool gbRenderBoats ;
extern bool gbRenderVehicles ;
extern bool gbRenderWorld0 ;
extern bool gbRenderWorld1 ;
extern bool gbRenderWorld2 ;
2021-02-13 00:08:35 +01:00
DebugMenuAddVarBool8 ( " Debug Render " , " gbRenderRoads " , & gbRenderRoads , nil ) ;
DebugMenuAddVarBool8 ( " Debug Render " , " gbRenderEverythingBarRoads " , & gbRenderEverythingBarRoads , nil ) ;
// DebugMenuAddVarBool8("Debug Render", "gbRenderFadingInUnderwaterEntities", &gbRenderFadingInUnderwaterEntities, nil);
DebugMenuAddVarBool8 ( " Debug Render " , " gbRenderFadingInEntities " , & gbRenderFadingInEntities , nil ) ;
DebugMenuAddVarBool8 ( " Debug Render " , " gbRenderWater " , & gbRenderWater , nil ) ;
DebugMenuAddVarBool8 ( " Debug Render " , " gbRenderBoats " , & gbRenderBoats , nil ) ;
DebugMenuAddVarBool8 ( " Debug Render " , " gbRenderVehicles " , & gbRenderVehicles , nil ) ;
DebugMenuAddVarBool8 ( " Debug Render " , " gbRenderWorld0 " , & gbRenderWorld0 , nil ) ;
DebugMenuAddVarBool8 ( " Debug Render " , " gbRenderWorld1 " , & gbRenderWorld1 , nil ) ;
DebugMenuAddVarBool8 ( " Debug Render " , " gbRenderWorld2 " , & gbRenderWorld2 , nil ) ;
2021-01-05 11:12:48 +01:00
# endif
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
2021-02-28 14:15:22 +01:00
# ifdef LIBRW
DebugMenuAddVarBool32 ( " Render " , " MatFX env map apply light " , & rw : : MatFX : : envMapApplyLight , nil ) ;
DebugMenuAddVarBool32 ( " Render " , " MatFX env map flip U " , & rw : : MatFX : : envMapFlipU , nil ) ;
DebugMenuAddVarBool32 ( " Render " , " MatFX env map use matcolor " , & rw : : MatFX : : envMapUseMatColor , nil ) ;
# endif
2020-08-18 10:58:15 +02:00
# 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
2021-02-13 00:08:35 +01:00
DebugMenuAddVarBool8 ( " Debug Render " , " Show Ped Paths " , & gbShowPedPaths , nil ) ;
DebugMenuAddVarBool8 ( " Debug Render " , " Show Car Paths " , & gbShowCarPaths , nil ) ;
DebugMenuAddVarBool8 ( " Debug Render " , " Show Car Path Links " , & gbShowCarPathsLinks , nil ) ;
DebugMenuAddVarBool8 ( " Debug Render " , " Show Ped Road Groups " , & gbShowPedRoadGroups , nil ) ;
DebugMenuAddVarBool8 ( " Debug Render " , " Show Car Road Groups " , & gbShowCarRoadGroups , nil ) ;
DebugMenuAddVarBool8 ( " Debug Render " , " Show Collision Lines " , & gbShowCollisionLines , nil ) ;
DebugMenuAddVarBool8 ( " Debug Render " , " Show Collision Polys " , & gbShowCollisionPolys , nil ) ;
DebugMenuAddVarBool8 ( " Debug Render " , " Don't render Buildings " , & gbDontRenderBuildings , nil ) ;
DebugMenuAddVarBool8 ( " Debug Render " , " Don't render Big Buildings " , & gbDontRenderBigBuildings , nil ) ;
DebugMenuAddVarBool8 ( " Debug Render " , " Don't render Peds " , & gbDontRenderPeds , nil ) ;
DebugMenuAddVarBool8 ( " Debug Render " , " Don't render Vehicles " , & gbDontRenderVehicles , nil ) ;
DebugMenuAddVarBool8 ( " Debug Render " , " Don't render Objects " , & gbDontRenderObjects , nil ) ;
DebugMenuAddVarBool8 ( " Debug Render " , " Don't Render Water " , & gbDontRenderWater , nil ) ;
2021-01-08 21:55:13 +01:00
2021-02-12 02:04:31 +01:00
# ifdef DRAW_GAME_VERSION_TEXT
2021-02-18 22:40:32 +01:00
DebugMenuAddVarBool8 ( " Debug " , " Version Text " , & gbDrawVersionText , nil ) ;
2021-02-13 00:00:02 +01:00
# endif
DebugMenuAddVarBool8 ( " Debug " , " Show DebugStuffInRelease " , & gbDebugStuffInRelease , nil ) ;
# ifdef TIMEBARS
DebugMenuAddVarBool8 ( " Debug " , " Show Timebars " , & gbShowTimebars , nil ) ;
2021-02-11 23:49:09 +01:00
# endif
2020-11-30 23:44:58 +01:00
# ifndef FINAL
2021-02-19 18:41:31 +01:00
DebugMenuAddVarBool8 ( " Debug " , " Use debug render groups " , & bDebugRenderGroups , nil ) ;
2020-11-30 23:44:58 +01:00
DebugMenuAddVarBool8 ( " Debug " , " Print Memory Usage " , & gbPrintMemoryUsage , nil ) ;
# ifdef USE_CUSTOM_ALLOCATOR
DebugMenuAddCmd ( " Debug " , " Parse Heap " , ParseHeap ) ;
# endif
# endif
2020-11-22 00:13:07 +01:00
DebugMenuAddVarBool8 ( " Debug " , " Show cullzone debug stuff " , & gbShowCullZoneDebugStuff , nil ) ;
DebugMenuAddVarBool8 ( " Debug " , " Disable zone cull " , & gbDisableZoneCull , nil ) ;
2020-06-08 13:01:07 +02:00
DebugMenuAddVarBool8 ( " Debug " , " pad 1 -> pad 2 " , & CPad : : m_bMapPadOneToPadTwo , nil ) ;
2020-12-02 00:34:51 +01:00
# ifdef GTA_SCENE_EDIT
2020-04-25 12:16:50 +02:00
DebugMenuAddVarBool8 ( " Debug " , " Edit on " , & CSceneEdit : : m_bEditOn , nil ) ;
2020-12-02 00:34:51 +01:00
# endif
2021-02-13 00:08:35 +01:00
//DebugMenuAddCmd("Debug", "Start Credits", CCredits::Start);
//DebugMenuAddCmd("Debug", "Stop Credits", CCredits::Stop);
2020-04-17 06:01:54 +02:00
# ifdef MENU_MAP
2021-02-13 00:08:35 +01:00
DebugMenuAddCmd ( " Game " , " Teleport to map waypoint " , TeleportToWaypoint ) ;
2020-04-17 06:01:54 +02:00
# endif
2021-02-13 00:08:35 +01:00
DebugMenuAddCmd ( " Game " , " Fix Car " , FixCar ) ;
DebugMenuAddCmd ( " Game " , " Place Car on Road " , PlaceOnRoad ) ;
DebugMenuAddCmd ( " Game " , " Switch car collision " , SwitchCarCollision ) ;
DebugMenuAddCmd ( " Game " , " Toggle Comedy Controls " , ToggleComedy ) ;
2020-04-25 12:16:50 +02:00
2021-02-13 00:08:35 +01:00
DebugMenuAddVarBool8 ( " Game " , " Toggle popping heads on headshot " , & CPed : : bPopHeadsOnHeadshot , nil ) ;
2020-03-26 14:16:06 +01:00
2020-11-16 00:41:03 +01:00
# ifdef MISSION_SWITCHER
DebugMenuEntry * missionEntry ;
static const char * missions [ ] = {
" Intro Movie " , " Hospital Info Scene " , " Police Station Info Scene " ,
" RC Diablo Destruction " , " RC Mafia Massacre " , " RC Rumpo Rampage " , " RC Casino Calamity " ,
" Patriot Playground " , " A Ride In The Park " , " Gripped! " , " Multistorey Mayhem " ,
" Paramedic " , " Firefighter " , " Vigilante " , " Taxi Driver " ,
" The Crook " , " The Thieves " , " The Wife " , " Her Lover " ,
" Give Me Liberty and Luigi's Girls " , " Don't Spank My Bitch Up " , " Drive Misty For Me " , " Pump-Action Pimp " , " The Fuzz Ball " ,
" Mike Lips Last Lunch " , " Farewell 'Chunky' Lee Chong " , " Van Heist " , " Cipriani's Chauffeur " , " Dead Skunk In The Trunk " , " The Getaway " ,
" Taking Out The Laundry " , " The Pick-Up " , " Salvatore's Called A Meeting " , " Triads And Tribulations " , " Blow Fish " , " Chaperone " , " Cutting The Grass " ,
" Bomb Da Base: Act I " , " Bomb Da Base: Act II " , " Last Requests " , " Turismo " , " I Scream, You Scream " , " Trial By Fire " , " Big'N'Veiny " , " Sayonara Salvatore " ,
" Under Surveillance " , " Paparazzi Purge " , " Payday For Ray " , " Two-Faced Tanner " , " Kanbu Bust-Out " , " Grand Theft Auto " , " Deal Steal " , " Shima " , " Smack Down " ,
" Silence The Sneak " , " Arms Shortage " , " Evidence Dash " , " Gone Fishing " , " Plaster Blaster " , " Marked Man " ,
" Liberator " , " Waka-Gashira Wipeout! " , " A Drop In The Ocean " , " Bling-Bling Scramble " , " Uzi Rider " , " Gangcar Round-Up " , " Kingdom Come " ,
" Grand Theft Aero " , " Escort Service " , " Decoy " , " Love's Disappearance " , " Bait " , " Espresso-2-Go! " , " S.A.M. " ,
" Uzi Money " , " Toyminator " , " Rigged To Blow " , " Bullion Run " , " Rumble " , " The Exchange "
} ;
2021-02-13 00:08:35 +01:00
missionEntry = DebugMenuAddVar ( " Game " , " Select mission " , & nextMissionToSwitch , nil , 1 , 0 , ARRAY_SIZE ( missions ) - 1 , missions ) ;
2020-11-16 00:41:03 +01:00
DebugMenuEntrySetWrap ( missionEntry , true ) ;
2021-02-13 00:08:35 +01:00
DebugMenuAddCmd ( " Game " , " Start selected mission " , SwitchToMission ) ;
2020-11-16 00:41:03 +01: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 ) ;
2021-02-13 14:22:00 +01:00
DebugMenuAddCmd ( " Cam " , " Normal " , [ ] ( ) { DebugCamMode = 0 ; } ) ;
2021-02-13 00:00:02 +01:00
// 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; });
2021-02-13 14:22:00 +01:00
DebugMenuAddCmd ( " Cam " , " Reset Statics " , ResetCamStatics ) ;
2020-03-26 14:16:06 +01:00
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
2021-01-19 13:35:48 +01:00
# ifndef __MWERKS__
# ifndef MASTER
2019-06-02 23:42:51 +02:00
const int re3_buffsize = 1024 ;
static char re3_buff [ re3_buffsize ] ;
2021-01-19 13:35:48 +01:00
# endif
2019-06-02 23:42:51 +02:00
2021-01-19 13:35:48 +01:00
# ifndef MASTER
2019-06-02 23:42:51 +02:00
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
}
2021-01-19 13:35:48 +01:00
# 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
{
2021-01-19 13:35:48 +01:00
# ifndef MASTER
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 ) ;
2021-01-19 13:35:48 +01:00
# endif
2019-06-02 23:42:51 +02:00
}
2021-01-19 13:35:48 +01:00
# ifndef MASTER
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
}
2021-01-19 13:35:48 +01:00
# endif
2019-06-01 01:58:19 +02:00
2021-01-19 13:35:48 +01:00
# ifndef MASTER
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
}
2021-01-19 13:35:48 +01:00
# endif
# 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