2019-06-02 21:42:51 +00:00
# include <csignal>
2020-04-21 10:28:06 +00:00
# define WITHWINDOWS
2019-05-30 19:24:47 +00:00
# include "common.h"
2020-05-11 02:55:57 +00:00
# include "crossplatform.h"
2019-05-30 19:24:47 +00:00
# include "Renderer.h"
2019-05-30 22:32:50 +00:00
# include "Credits.h"
2019-05-31 09:44:43 +00:00
# include "Camera.h"
2019-06-27 08:58:51 +00:00
# include "Weather.h"
# include "Clock.h"
# include "World.h"
# include "Vehicle.h"
2019-07-19 09:57:12 +00:00
# include "ModelIndices.h"
2019-06-27 08:58:51 +00:00
# include "Streaming.h"
# include "PathFind.h"
# include "Boat.h"
2019-08-03 22:31:00 +00:00
# include "Heli.h"
2019-06-27 08:58:51 +00:00
# include "Automobile.h"
2019-08-05 13:07:10 +00:00
# include "Ped.h"
2019-10-24 23:25:11 +00:00
# include "Particle.h"
2020-03-22 11:26:35 +00:00
# include "Console.h"
2020-03-26 13:16:06 +00:00
# include "Debug.h"
2020-04-10 15:06:49 +00:00
# include "Hud.h"
2020-04-13 18:50:56 +00:00
# include "SceneEdit.h"
# include "Pad.h"
2020-04-16 19:19:56 +00:00
# include "PlayerPed.h"
# include "Radar.h"
2020-04-24 11:27:02 +00:00
# include "debugmenu.h"
2020-05-02 08:08:58 +00:00
# include "Frontend.h"
2020-05-28 00:07:26 +00:00
# include "Text.h"
2020-05-29 10:03:32 +00:00
# include "WaterLevel.h"
# include "main.h"
2020-08-13 16:14:24 +00:00
# include "MBlur.h"
# include "postfx.h"
2020-08-18 08:58:15 +00:00
# include "custompipes.h"
2020-09-30 17:02:47 +00:00
# include "ControllerConfig.h"
2019-05-30 19:24:47 +00:00
2020-05-11 02:55:57 +00:00
# ifndef _WIN32
# include "assert.h"
# include <stdarg.h>
# endif
2019-07-24 16:55:43 +00:00
# include <list>
2019-07-02 18:28:20 +00:00
2020-04-17 13:31:11 +00:00
# ifdef RWLIBS
2020-04-11 15:37:20 +00:00
extern " C " int vsprintf ( char * const _Buffer , char const * const _Format , va_list _ArgList ) ;
# endif
2019-05-30 19:24:47 +00:00
2019-06-02 22:25:46 +00:00
# ifdef USE_PS2_RAND
2020-05-11 02:55:57 +00:00
unsigned long long myrand_seed = 1 ;
2019-05-30 21:49:06 +00:00
# else
unsigned long int myrand_seed = 1 ;
# endif
2019-05-30 19:24:47 +00:00
int
myrand ( void )
{
2019-06-02 22:25:46 +00:00
# ifdef USE_PS2_RAND
2019-05-30 21:49:06 +00:00
// Use our own implementation of rand, stolen from PS2
2019-05-30 19:24:47 +00:00
myrand_seed = 0x5851F42D4C957F2D * myrand_seed + 1 ;
return ( ( myrand_seed > > 32 ) & 0x7FFFFFFF ) ;
2019-05-30 21:49:06 +00:00
# else
// or original codewarrior rand
myrand_seed = myrand_seed * 1103515245 + 12345 ;
return ( ( myrand_seed > > 16 ) & 0x7FFF ) ;
# endif
2019-05-30 19:24:47 +00:00
}
void
mysrand ( unsigned int seed )
{
myrand_seed = seed ;
}
2020-08-19 17:30:57 +00:00
# ifdef CUSTOM_FRONTEND_OPTIONS
# include "frontendoption.h"
# include "platform.h"
2020-08-24 19:42:26 +00:00
# include "Font.h"
2020-08-19 17:30:57 +00:00
void ReloadFrontendOptions ( void )
{
CustomFrontendOptionsPopulate ( ) ;
}
2020-08-24 19:42:26 +00:00
void RestoreDefGraphics ( int8 action ) {
if ( action ! = FEOPTION_ACTION_SELECT )
return ;
# ifdef PS2_ALPHA_TEST
gPS2alphaTest = false ;
# endif
# ifdef MULTISAMPLING
FrontEndMenuManager . m_nPrefsMSAALevel = FrontEndMenuManager . m_nDisplayMSAALevel = 0 ;
# endif
# ifdef GRAPHICS_MENU_OPTIONS // otherwise Frontend will handle those
CMenuManager : : m_PrefsFrameLimiter = true ;
CMenuManager : : m_PrefsVsyncDisp = true ;
CMenuManager : : m_PrefsVsync = true ;
CMenuManager : : m_PrefsUseWideScreen = false ;
FrontEndMenuManager . m_nDisplayVideoMode = FrontEndMenuManager . m_nPrefsVideoMode ;
# ifdef GTA3_1_1_PATCH
if ( _dwOperatingSystemVersion = = OS_WIN98 ) {
CMBlur : : BlurOn = false ;
CMBlur : : MotionBlurClose ( ) ;
} else {
CMBlur : : BlurOn = true ;
CMBlur : : MotionBlurOpen ( Scene . camera ) ;
}
# else
CMBlur : : BlurOn = true ;
# endif
FrontEndMenuManager . SaveSettings ( ) ;
# endif
}
void RestoreDefDisplay ( int8 action ) {
if ( action ! = FEOPTION_ACTION_SELECT )
return ;
# ifdef CUTSCENE_BORDERS_SWITCH
CMenuManager : : m_PrefsCutsceneBorders = true ;
# endif
# ifdef FREE_CAM
TheCamera . bFreeCam = false ;
# endif
# ifdef GRAPHICS_MENU_OPTIONS // otherwise Frontend will handle those
CMenuManager : : m_PrefsBrightness = 256 ;
CMenuManager : : m_PrefsLOD = 1.2f ;
CRenderer : : ms_lodDistScale = 1.2f ;
CMenuManager : : m_PrefsShowSubtitles = true ;
FrontEndMenuManager . SaveSettings ( ) ;
# endif
}
# ifdef MULTISAMPLING
void MultiSamplingGoBack ( ) {
FrontEndMenuManager . m_nDisplayMSAALevel = FrontEndMenuManager . m_nPrefsMSAALevel ;
}
void MultiSamplingButtonPress ( int8 action ) {
if ( action = = FEOPTION_ACTION_SELECT ) {
if ( FrontEndMenuManager . m_nDisplayMSAALevel ! = FrontEndMenuManager . m_nPrefsMSAALevel ) {
FrontEndMenuManager . m_nPrefsMSAALevel = FrontEndMenuManager . m_nDisplayMSAALevel ;
_psSelectScreenVM ( FrontEndMenuManager . m_nPrefsVideoMode ) ;
FrontEndMenuManager . SetHelperText ( 0 ) ;
FrontEndMenuManager . SaveSettings ( ) ;
}
} else if ( action = = FEOPTION_ACTION_LEFT | | action = = FEOPTION_ACTION_RIGHT ) {
if ( FrontEndMenuManager . m_bGameNotLoaded ) {
FrontEndMenuManager . m_nDisplayMSAALevel + = ( action = = FEOPTION_ACTION_RIGHT ? 1 : - 1 ) ;
int i = 0 ;
int maxAA = RwD3D8EngineGetMaxMultiSamplingLevels ( ) ;
while ( maxAA ! = 1 ) {
i + + ;
maxAA > > = 1 ;
}
if ( FrontEndMenuManager . m_nDisplayMSAALevel < 0 )
FrontEndMenuManager . m_nDisplayMSAALevel = i ;
else if ( FrontEndMenuManager . m_nDisplayMSAALevel > i )
FrontEndMenuManager . m_nDisplayMSAALevel = 0 ;
}
} else if ( action = = FEOPTION_ACTION_FOCUSLOSS ) {
if ( FrontEndMenuManager . m_nDisplayMSAALevel ! = FrontEndMenuManager . m_nPrefsMSAALevel ) {
FrontEndMenuManager . m_nDisplayMSAALevel = FrontEndMenuManager . m_nPrefsMSAALevel ;
FrontEndMenuManager . SetHelperText ( 3 ) ;
}
}
}
wchar * MultiSamplingDraw ( bool * disabled , bool userHovering ) {
static wchar unicodeTemp [ 64 ] ;
if ( userHovering ) {
if ( FrontEndMenuManager . m_nDisplayMSAALevel = = FrontEndMenuManager . m_nPrefsMSAALevel ) {
if ( FrontEndMenuManager . m_nHelperTextMsgId = = 1 ) // Press enter to apply
FrontEndMenuManager . ResetHelperText ( ) ;
} else {
FrontEndMenuManager . SetHelperText ( 1 ) ;
}
2020-08-25 00:27:38 +00:00
} else {
if ( FrontEndMenuManager . m_nDisplayMSAALevel ! = FrontEndMenuManager . m_nPrefsMSAALevel ) {
FrontEndMenuManager . m_nDisplayMSAALevel = FrontEndMenuManager . m_nPrefsMSAALevel ;
}
2020-08-24 19:42:26 +00:00
}
2020-08-25 00:27:38 +00:00
2020-08-24 19:42:26 +00:00
if ( ! FrontEndMenuManager . m_bGameNotLoaded )
* disabled = true ;
switch ( FrontEndMenuManager . m_nDisplayMSAALevel ) {
case 0 :
return TheText . Get ( " FEM_OFF " ) ;
default :
sprintf ( gString , " %iX " , 1 < < ( FrontEndMenuManager . m_nDisplayMSAALevel ) ) ;
AsciiToUnicode ( gString , unicodeTemp ) ;
return unicodeTemp ;
}
}
2020-09-30 17:02:47 +00:00
char * multisamplingKey = " MultiSampling " ;
2020-08-24 19:42:26 +00:00
# endif
2020-08-19 17:30:57 +00: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-08-24 19:42:26 +00:00
# ifdef IMPROVED_VIDEOMODE
2020-08-19 17:30:57 +00:00
void ScreenModeChange ( int8 displayedValue )
{
if ( displayedValue ! = FrontEndMenuManager . m_nPrefsWindowed ) {
FrontEndMenuManager . m_nPrefsWindowed = displayedValue ;
_psSelectScreenVM ( FrontEndMenuManager . m_nPrefsVideoMode ) ; // apply same resolution
FrontEndMenuManager . SetHelperText ( 0 ) ;
FrontEndMenuManager . SaveSettings ( ) ;
}
}
2020-08-24 19:42:26 +00:00
# endif
2020-08-19 17:30:57 +00:00
# ifdef FREE_CAM
2020-08-24 19:42:26 +00:00
void FreeCamChange ( int8 displayedValue )
2020-08-19 17:30:57 +00:00
{
2020-08-24 19:42:26 +00:00
TheCamera . bFreeCam = ! ! displayedValue ;
FrontEndMenuManager . SaveSettings ( ) ;
}
2020-09-30 17:02:47 +00:00
const wchar * freeCamText = ( wchar * ) L " FREE CAM " ;
char * freeCamKey = " FreeCam " ;
2020-08-24 19:42:26 +00:00
# endif
# ifdef CUTSCENE_BORDERS_SWITCH
void BorderModeChange ( int8 displayedValue )
{
CMenuManager : : m_PrefsCutsceneBorders = ! ! displayedValue ;
FrontEndMenuManager . SaveSettings ( ) ;
}
2020-09-30 17:02:47 +00:00
char * cutsceneBordersKey = " CutsceneBorders " ;
2020-08-24 19:42:26 +00:00
# endif
# ifdef PS2_ALPHA_TEST
void PS2AlphaTestChange ( int8 displayedValue )
{
gPS2alphaTest = ! ! displayedValue ;
FrontEndMenuManager . SaveSettings ( ) ;
2020-08-19 17:30:57 +00:00
}
2020-09-30 17:02:47 +00:00
char * ps2alphaKey = " PS2AlphaTest " ;
2020-08-19 17:30:57 +00:00
# endif
2020-09-30 17:02:47 +00:00
# ifdef DONT_TRUST_RECOGNIZED_JOYSTICKS
const wchar * detectJoystickText = ( wchar * ) L " Detect Joystick " ;
const wchar * detectJoystickExplanation = ( wchar * ) L " Press any key on your preferred joystick that you would like to use on the game. " ;
const wchar * detectedJoystickText = ( wchar * ) L " Detected Joystick " ;
wchar selectedJoystickUnicode [ 128 ] ;
wchar * DetectJoystickDraw ( bool * disabled , bool userHovering ) {
int numButtons ;
int found = - 1 ;
const char * joyname ;
if ( userHovering ) {
for ( int i = 0 ; i < = GLFW_JOYSTICK_LAST ; i + + ) {
if ( joyname = glfwGetJoystickName ( i ) ) {
const uint8 * buttons = glfwGetJoystickButtons ( i , & numButtons ) ;
for ( int j = 0 ; j < numButtons ; j + + ) {
if ( buttons [ j ] ) {
strcpy ( gSelectedJoystickName , joyname ) ;
found = i ;
break ;
}
}
if ( found ! = - 1 )
break ;
}
}
if ( found ! = - 1 & & PSGLOBAL ( joy1id ) ! = found ) {
if ( PSGLOBAL ( joy1id ) ! = - 1 & & PSGLOBAL ( joy1id ) ! = found )
PSGLOBAL ( joy2id ) = PSGLOBAL ( joy1id ) ;
else
PSGLOBAL ( joy2id ) = - 1 ;
PSGLOBAL ( joy1id ) = found ;
}
}
AsciiToUnicode ( gSelectedJoystickName , selectedJoystickUnicode ) ;
return selectedJoystickUnicode ;
}
# endif
2020-08-19 17:30:57 +00:00
2020-08-24 19:42:26 +00:00
// Important: Make sure to read the warnings/informations in frontendoption.h!!
2020-09-30 17:02:47 +00:00
// If you won't use GXT entry as text, you may want to declare them globally, to not alloc them on each reload. (static declared texts has some problems on Linux etc.)
2020-08-19 17:30:57 +00:00
void
CustomFrontendOptionsPopulate ( void )
{
RemoveCustomFrontendOptions ( ) ; // if exist
2020-08-24 19:42:26 +00:00
// -- Graphics/display seperation preperation starts - don't add options in here!
# ifdef GRAPHICS_MENU_OPTIONS
int graphicsMenu = FrontendScreenAdd ( " FET_GRA " , MENUSPRITE_MAINMENU , MENUPAGE_OPTIONS , 50 , 0 , 20 ,
FONT_HEADING , MEDIUMTEXT_X_SCALE , MEDIUMTEXT_Y_SCALE , FESCREEN_LEFT_ALIGN , true ) ;
int newDisplayMenu = FrontendScreenAdd ( " FET_DIS " , MENUSPRITE_MAINMENU , MENUPAGE_OPTIONS , 50 , 0 , 20 ,
FONT_HEADING , MEDIUMTEXT_X_SCALE , MEDIUMTEXT_Y_SCALE , FESCREEN_LEFT_ALIGN , true ) ;
FrontendOptionSetCursor ( MENUPAGE_OPTIONS , 2 , true ) ;
FrontendOptionAddRedirect ( TheText . Get ( " FET_DIS " ) , newDisplayMenu , 0 ) ;
FrontendOptionSetCursor ( MENUPAGE_OPTIONS , 3 ) ;
FrontendOptionAddRedirect ( TheText . Get ( " FET_GRA " ) , graphicsMenu , 0 ) ;
# define SWITCH_TO_GRAPHICS_MENU FrontendOptionSetCursor(graphicsMenu, -1);
# define SWITCH_TO_DISPLAY_MENU FrontendOptionSetCursor(newDisplayMenu, -1);
# define CLONE_OPTION(a, b, c, d) FrontendOptionAddBuiltinAction(a, b, c, d);
# define ADD_BACK FrontendOptionAddBackButton(TheText.Get("FEDS_TB"));
# define ADD_RESTORE_DEFAULTS(a) FrontendOptionAddDynamic(TheText.Get("FET_DEF"), nil, nil, a, nil);
# else
int advancedDisplayMenu = FrontendScreenAdd ( " FET_ADV " , MENUSPRITE_MAINMENU , MENUPAGE_DISPLAY_SETTINGS , 50 , 0 , 20 ,
FONT_HEADING , MEDIUMTEXT_X_SCALE , MEDIUMTEXT_Y_SCALE , FESCREEN_LEFT_ALIGN , true ) ;
bool movedToAdvMenu = false ;
# define SWITCH_TO_GRAPHICS_MENU \
if ( GetNumberOfMenuOptions ( MENUPAGE_DISPLAY_SETTINGS ) > = 12 ) { \
FrontendOptionSetCursor ( advancedDisplayMenu , - 1 ) ; \
movedToAdvMenu = true ; \
} else { \
FrontendOptionSetCursor ( MENUPAGE_DISPLAY_SETTINGS , - 3 ) ; \
}
# define SWITCH_TO_DISPLAY_MENU SWITCH_TO_GRAPHICS_MENU
# define CLONE_OPTION(a, b, c, d)
# define ADD_BACK
# define ADD_RESTORE_DEFAULTS(a)
2020-08-19 17:30:57 +00:00
# endif
2020-08-24 19:42:26 +00:00
// -- Graphics/display seperation preperation end
2020-08-19 17:30:57 +00:00
2020-08-25 00:27:38 +00:00
const wchar * off_on [ ] = { TheText . Get ( " FEM_OFF " ) , TheText . Get ( " FEM_ON " ) } ;
2020-08-24 19:42:26 +00:00
# ifdef MORE_LANGUAGES
FrontendOptionSetCursor ( MENUPAGE_LANGUAGE_SETTINGS , - 2 ) ;
FrontendOptionAddDynamic ( TheText . Get ( " FEL_POL " ) , nil , nil , LangPolSelect , nil ) ;
FrontendOptionAddDynamic ( TheText . Get ( " FEL_RUS " ) , nil , nil , LangRusSelect , nil ) ;
FrontendOptionAddDynamic ( TheText . Get ( " FEL_JAP " ) , nil , nil , LangJapSelect , nil ) ;
# endif
2020-08-19 17:30:57 +00:00
# ifdef MENU_MAP
2020-08-24 19:42:26 +00:00
FrontendOptionSetCursor ( MENUPAGE_PAUSE_MENU , 2 ) ;
2020-08-19 17:30:57 +00:00
FrontendOptionAddRedirect ( TheText . Get ( " FEG_MAP " ) , MENUPAGE_MAP ) ;
# endif
2020-08-24 19:42:26 +00:00
// -- Start of graphics menu - add options in display order!
SWITCH_TO_GRAPHICS_MENU
CLONE_OPTION ( TheText . Get ( " FED_RES " ) , MENUACTION_SCREENRES , nil , nil ) ;
CLONE_OPTION ( TheText . Get ( " FED_WIS " ) , MENUACTION_WIDESCREEN , nil , nil )
# ifdef IMPROVED_VIDEOMODE
2020-08-25 00:27:38 +00:00
const wchar * screenModes [ ] = { TheText . Get ( " FED_FLS " ) , TheText . Get ( " FED_WND " ) } ;
2020-08-24 19:42:26 +00:00
// Storing isn't enabled because it's handled in Frontend
FrontendOptionAddSelect ( TheText . Get ( " FEM_SCF " ) , screenModes , 2 , ( int8 * ) & FrontEndMenuManager . m_nPrefsWindowed , true , ScreenModeChange , nil ) ;
# endif
CLONE_OPTION ( TheText . Get ( " FEM_VSC " ) , MENUACTION_FRAMESYNC , nil , nil ) ;
CLONE_OPTION ( TheText . Get ( " FEM_FRM " ) , MENUACTION_FRAMELIMIT , nil , nil ) ;
# ifdef MULTISAMPLING
SWITCH_TO_GRAPHICS_MENU
2020-09-30 17:02:47 +00:00
FrontendOptionAddDynamic ( TheText . Get ( " FED_AAS " ) , MultiSamplingDraw , ( int8 * ) & FrontEndMenuManager . m_nPrefsMSAALevel , MultiSamplingButtonPress , MultiSamplingGoBack , multisamplingKey ) ;
2020-08-24 19:42:26 +00:00
# endif
CLONE_OPTION ( TheText . Get ( " FED_TRA " ) , MENUACTION_TRAILS , nil , nil ) ;
# ifdef PS2_ALPHA_TEST
SWITCH_TO_GRAPHICS_MENU
2020-09-30 17:02:47 +00:00
FrontendOptionAddSelect ( TheText . Get ( " FEM_2PR " ) , off_on , 2 , ( int8 * ) & gPS2alphaTest , false , PS2AlphaTestChange , nil , ps2alphaKey ) ;
2020-08-24 19:42:26 +00:00
# endif
ADD_RESTORE_DEFAULTS ( RestoreDefGraphics )
ADD_BACK
// ---- End of Graphics Menu ----
// -- Start of Display menu - add options in display order!
SWITCH_TO_DISPLAY_MENU
CLONE_OPTION ( TheText . Get ( " FED_BRI " ) , MENUACTION_BRIGHTNESS , nil , nil ) ;
CLONE_OPTION ( TheText . Get ( " FEM_LOD " ) , MENUACTION_DRAWDIST , nil , nil ) ;
# ifdef CUTSCENE_BORDERS_SWITCH
SWITCH_TO_DISPLAY_MENU
2020-09-30 17:02:47 +00:00
FrontendOptionAddSelect ( TheText . Get ( " FEM_CSB " ) , off_on , 2 , ( int8 * ) & CMenuManager : : m_PrefsCutsceneBorders , false , BorderModeChange , nil , cutsceneBordersKey ) ;
2020-08-24 19:42:26 +00:00
# endif
2020-08-19 17:30:57 +00:00
# ifdef FREE_CAM
2020-08-24 19:42:26 +00:00
SWITCH_TO_DISPLAY_MENU
2020-09-30 17:02:47 +00:00
FrontendOptionAddSelect ( freeCamText , off_on , 2 , ( int8 * ) & TheCamera . bFreeCam , false , FreeCamChange , nil , freeCamKey ) ;
2020-08-24 19:42:26 +00:00
# endif
CLONE_OPTION ( TheText . Get ( " FED_SUB " ) , MENUACTION_SUBTITLES , nil , nil ) ;
// Add link to advanced graphics menu if it's filled.
# ifndef GRAPHICS_MENU_OPTIONS
if ( movedToAdvMenu ) {
FrontendOptionSetCursor ( MENUPAGE_DISPLAY_SETTINGS , - 3 ) ;
FrontendOptionAddRedirect ( TheText . Get ( " FET_ADV " ) , advancedDisplayMenu , 0 ) ;
FrontendOptionSetCursor ( advancedDisplayMenu , - 1 ) ;
FrontendOptionAddBackButton ( TheText . Get ( " FEDS_TB " ) ) ;
}
2020-08-19 17:30:57 +00:00
# endif
2020-08-24 19:42:26 +00:00
ADD_RESTORE_DEFAULTS ( RestoreDefDisplay )
2020-09-30 17:02:47 +00:00
ADD_BACK
# ifdef DONT_TRUST_RECOGNIZED_JOYSTICKS
int detectJoystickMenu = FrontendScreenAdd ( " FET_CON " , MENUSPRITE_MAINMENU , MENUPAGE_CONTROLLER_PC , 50 , 60 , 20 ,
FONT_BANK , MEDIUMTEXT_X_SCALE , MEDIUMTEXT_Y_SCALE , FESCREEN_LEFT_ALIGN , false ) ;
FrontendOptionSetCursor ( detectJoystickMenu , 0 ) ;
FrontendOptionAddBuiltinAction ( detectJoystickExplanation , MENUACTION_LABEL , nil , nil ) ;
FrontendOptionAddDynamic ( detectedJoystickText , DetectJoystickDraw , nil , nil , nil ) ;
FrontendOptionAddBackButton ( TheText . Get ( " FEDS_TB " ) ) ;
FrontendOptionSetCursor ( MENUPAGE_CONTROLLER_PC , 2 ) ;
FrontendOptionAddRedirect ( detectJoystickText , detectJoystickMenu , 1 ) ;
# endif
2020-08-19 17:30:57 +00:00
}
# endif
2020-05-09 13:06:13 +00:00
# ifdef DEBUGMENU
2019-06-27 08:58:51 +00: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 09:57:12 +00:00
DebugMenuEntry * carCol1 ;
DebugMenuEntry * carCol2 ;
2019-06-27 08:58:51 +00:00
void
2019-07-19 09:57:12 +00:00
SpawnCar ( int id )
2019-06-27 08:58:51 +00:00
{
CVector playerpos ;
CStreaming : : RequestModel ( id , 0 ) ;
CStreaming : : LoadAllRequestedModels ( false ) ;
2019-06-28 10:34:02 +00:00
if ( CStreaming : : HasModelLoaded ( id ) ) {
2019-07-19 09:57:12 +00:00
playerpos = FindPlayerCoors ( ) ;
2020-03-26 13:16:06 +00:00
int node ;
if ( ! CModelInfo : : IsBoatModel ( id ) ) {
node = ThePaths . FindNodeClosestToCoors ( playerpos , 0 , 100.0f , false , false ) ;
if ( node < 0 )
return ;
}
2019-06-27 08:58:51 +00:00
CVehicle * v ;
2019-07-19 09:57:12 +00:00
if ( CModelInfo : : IsBoatModel ( id ) )
2020-03-26 13:16:06 +00:00
v = new CBoat ( id , RANDOM_VEHICLE ) ;
2019-07-19 09:57:12 +00: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 13:16:06 +00:00
if ( CModelInfo : : IsBoatModel ( id ) )
2020-05-02 12:28:19 +00:00
v - > SetPosition ( TheCamera . GetPosition ( ) + TheCamera . GetForward ( ) * 15.0f ) ;
2020-03-26 13:16:06 +00:00
else
2020-05-03 13:57:57 +00:00
v - > SetPosition ( ThePaths . m_pathNodes [ node ] . GetPosition ( ) ) ;
2020-03-26 13:16:06 +00:00
2020-05-02 12:28:19 +00:00
v - > GetMatrix ( ) . GetPosition ( ) . z + = 4.0f ;
2019-07-19 09:57:12 +00:00
v - > SetOrientation ( 0.0f , 0.0f , 3.49f ) ;
2020-04-30 13:45:45 +00:00
v - > SetStatus ( STATUS_ABANDONED ) ;
2019-07-19 09:57:12 +00:00
v - > m_nDoorLock = CARLOCK_UNLOCKED ;
2019-06-27 08:58:51 +00:00
CWorld : : Add ( v ) ;
}
}
2019-07-11 10:48:49 +00:00
static void
2019-07-08 19:37:47 +00:00
FixCar ( void )
{
CVehicle * veh = FindPlayerVehicle ( ) ;
2019-07-09 21:49:44 +00:00
if ( veh = = nil )
2019-07-08 19:37:47 +00:00
return ;
2019-07-09 21:49:44 +00:00
veh - > m_fHealth = 1000.0f ;
if ( ! veh - > IsCar ( ) )
return ;
( ( CAutomobile * ) veh ) - > Damage . SetEngineStatus ( 0 ) ;
2019-07-08 19:37:47 +00:00
( ( CAutomobile * ) veh ) - > Fix ( ) ;
}
2020-04-16 19:19:56 +00: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 20:59:55 +00:00
static void
SwitchCarCollision ( void )
{
if ( FindPlayerVehicle ( ) & & FindPlayerVehicle ( ) - > IsCar ( ) )
FindPlayerVehicle ( ) - > bUsesCollision = ! FindPlayerVehicle ( ) - > bUsesCollision ;
}
2019-07-26 16:48:14 +00: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 10:48:49 +00:00
static void
ToggleComedy ( void )
{
CVehicle * veh = FindPlayerVehicle ( ) ;
if ( veh = = nil )
return ;
veh - > bComedyControls = ! veh - > bComedyControls ;
}
2019-07-23 14:39:30 +00:00
static void
PlaceOnRoad ( void )
{
CVehicle * veh = FindPlayerVehicle ( ) ;
if ( veh = = nil )
return ;
if ( veh - > IsCar ( ) )
( ( CAutomobile * ) veh ) - > PlaceOnRoadProperly ( ) ;
}
2020-03-26 13:16:06 +00:00
static void
ResetCamStatics ( void )
{
TheCamera . Cams [ TheCamera . ActiveCam ] . ResetStatics = true ;
}
2019-07-19 09:57:12 +00: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-05-11 02:55:57 +00:00
static CTweakVar * * TweakVarsList ;
static int TweakVarsListSize = - 1 ;
2019-07-24 16:55:43 +00:00
static bool bAddTweakVarsNow = false ;
static const char * pTweakVarsDefaultPath = NULL ;
void CTweakVars : : Add ( CTweakVar * var )
{
2020-05-11 02:55:57 +00: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 16:55:43 +00:00
if ( bAddTweakVarsNow )
var - > AddDBG ( pTweakVarsDefaultPath ) ;
}
void CTweakVars : : AddDBG ( const char * path )
{
pTweakVarsDefaultPath = path ;
2020-05-11 02:55:57 +00:00
for ( int i = 0 ; i < TweakVarsListSize ; + + i )
TweakVarsList [ i ] - > AddDBG ( pTweakVarsDefaultPath ) ;
2019-07-24 16:55:43 +00: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 10:34:22 +00:00
void
DebugMenuPopulate ( void )
2019-05-30 19:24:47 +00:00
{
2020-04-24 11:27:02 +00:00
if ( 1 ) {
2019-06-27 08:58:51 +00: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 19:06:55 +00:00
DebugMenuAddVar ( " Time & Weather " , " Wind " , ( float * ) & CWeather : : Wind , nil , 0.1f , 0.0f , 1.0f ) ;
2020-04-24 11:27:02 +00:00
DebugMenuAddVar ( " Time & Weather " , " Time scale " , ( float * ) & CTimer : : GetTimeScale ( ) , nil , 0.1f , 0.0f , 10.0f ) ;
2019-06-27 08:58:51 +00: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 09:57:12 +00: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 12:27:13 +00:00
DebugMenuAddCmd ( " Spawn " , " Spawn Yardie " , [ ] ( ) { SpawnCar ( MI_YARDIE ) ; } ) ;
2019-07-19 09:57:12 +00:00
DebugMenuAddCmd ( " Spawn " , " Spawn Dodo " , [ ] ( ) { SpawnCar ( MI_DODO ) ; } ) ;
2019-07-25 14:33:37 +00:00
DebugMenuAddCmd ( " Spawn " , " Spawn Rhino " , [ ] ( ) { SpawnCar ( MI_RHINO ) ; } ) ;
DebugMenuAddCmd ( " Spawn " , " Spawn Firetruck " , [ ] ( ) { SpawnCar ( MI_FIRETRUCK ) ; } ) ;
2020-04-12 22:02:11 +00:00
DebugMenuAddCmd ( " Spawn " , " Spawn Predator " , [ ] ( ) { SpawnCar ( MI_PREDATOR ) ; } ) ;
2019-07-19 09:57:12 +00:00
2020-05-05 11:02:42 +00:00
DebugMenuAddVarBool8 ( " Render " , " Draw hud " , & CHud : : m_Wants_To_Draw_Hud , nil ) ;
2020-04-25 10:16:50 +00:00
DebugMenuAddVarBool8 ( " Render " , " PS2 Alpha test Emu " , & gPS2alphaTest , nil ) ;
2020-05-02 08:08:58 +00: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 16:14:24 +00: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 08:58:15 +00: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 ) ;
DebugMenuAddVar ( " Render " , " Neo Ped Rim light " , & CustomPipes : : RimlightMult , nil , 0.1f , 0 , 1.0f ) ;
DebugMenuAddVar ( " Render " , " Neo World Lightmaps " , & CustomPipes : : LightmapMult , nil , 0.1f , 0 , 1.0f ) ;
DebugMenuAddVar ( " Render " , " Neo Road Gloss " , & CustomPipes : : GlossMult , nil , 0.1f , 0 , 1.0f ) ;
2020-08-13 16:14:24 +00:00
# endif
2020-05-05 11:02:42 +00: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 11:21:19 +00:00
DebugMenuAddVarBool8 ( " Render " , " Don't Render Water " , & gbDontRenderWater , nil ) ;
2020-04-25 10:16:50 +00:00
2020-06-08 11:01:07 +00:00
DebugMenuAddVarBool8 ( " Debug " , " pad 1 -> pad 2 " , & CPad : : m_bMapPadOneToPadTwo , nil ) ;
2020-04-25 10:16:50 +00:00
DebugMenuAddVarBool8 ( " Debug " , " Edit on " , & CSceneEdit : : m_bEditOn , nil ) ;
2020-04-17 04:01:54 +00:00
# ifdef MENU_MAP
DebugMenuAddCmd ( " Debug " , " Teleport to map waypoint " , TeleportToWaypoint ) ;
# endif
2020-05-25 20:59:55 +00:00
DebugMenuAddCmd ( " Debug " , " Switch car collision " , SwitchCarCollision ) ;
2019-07-26 16:48:14 +00:00
DebugMenuAddVar ( " Debug " , " Engine Status " , & engineStatus , nil , 1 , 0 , 226 , nil ) ;
DebugMenuAddCmd ( " Debug " , " Set Engine Status " , SetEngineStatus ) ;
2019-07-08 19:37:47 +00:00
DebugMenuAddCmd ( " Debug " , " Fix Car " , FixCar ) ;
2019-07-11 10:48:49 +00:00
DebugMenuAddCmd ( " Debug " , " Toggle Comedy Controls " , ToggleComedy ) ;
2019-07-23 14:39:30 +00:00
DebugMenuAddCmd ( " Debug " , " Place Car on Road " , PlaceOnRoad ) ;
2019-07-11 10:48:49 +00:00
2020-04-25 10:16:50 +00:00
DebugMenuAddVarBool8 ( " Debug " , " Catalina Heli On " , & CHeli : : CatalinaHeliOn , nil ) ;
2019-08-03 22:31:00 +00: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 10:16:50 +00:00
DebugMenuAddVarBool8 ( " Debug " , " Script Heli On " , & CHeli : : ScriptHeliOn , nil ) ;
2020-08-19 17:30:57 +00:00
# ifdef CUSTOM_FRONTEND_OPTIONS
DebugMenuAddCmd ( " Debug " , " Reload custom frontend options " , ReloadFrontendOptions ) ;
# endif
2020-04-25 10:16:50 +00:00
DebugMenuAddVarBool8 ( " Debug " , " Toggle popping heads on headshot " , & CPed : : bPopHeadsOnHeadshot , nil ) ;
2019-05-30 22:32:50 +00:00
DebugMenuAddCmd ( " Debug " , " Start Credits " , CCredits : : Start ) ;
DebugMenuAddCmd ( " Debug " , " Stop Credits " , CCredits : : Stop ) ;
2020-03-26 13:16:06 +00:00
2020-05-29 10:03:32 +00:00
DebugMenuAddVarBool8 ( " Debug " , " Show DebugStuffInRelease " , & gbDebugStuffInRelease , nil ) ;
2020-06-01 11:21:19 +00:00
# ifdef TIMEBARS
2020-05-29 10:03:32 +00:00
DebugMenuAddVarBool8 ( " Debug " , " Show Timebars " , & gbShowTimebars , nil ) ;
2020-06-01 11:21:19 +00:00
# endif
2020-05-29 10:03:32 +00:00
2020-03-26 13:16:06 +00:00
extern bool PrintDebugCode ;
2020-04-17 13:31:11 +00:00
extern int16 DebugCamMode ;
2020-04-25 10:16:50 +00:00
DebugMenuAddVarBool8 ( " Cam " , " Use mouse Cam " , & CCamera : : m_bUseMouse3rdPerson , nil ) ;
2020-03-29 12:05:21 +00:00
# ifdef FREE_CAM
2020-04-25 10:16:50 +00:00
DebugMenuAddVarBool8 ( " Cam " , " Free Cam " , & CCamera : : bFreeCam , nil ) ;
2020-03-29 12:05:21 +00:00
# endif
2020-04-25 10:16:50 +00:00
DebugMenuAddVarBool8 ( " Cam " , " Print Debug Code " , & PrintDebugCode , nil ) ;
2020-03-26 13:16:06 +00:00
DebugMenuAddVar ( " Cam " , " Cam Mode " , & DebugCamMode , nil , 1 , 0 , CCam : : MODE_EDITOR , nil ) ;
2020-03-27 17:19:08 +00: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 13:16:06 +00:00
DebugMenuAddCmd ( " Cam " , " Reset Statics " , ResetCamStatics ) ;
2019-07-24 16:55:43 +00:00
CTweakVars : : AddDBG ( " Debug " ) ;
2019-05-30 19:24:47 +00:00
}
2019-06-12 10:34:22 +00:00
}
2020-05-09 13:06:13 +00:00
# endif
2019-06-12 10:34:22 +00:00
2019-06-02 21:42:51 +00: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 02:55:57 +00:00
# ifdef _WIN32
2019-06-02 21:42:51 +00: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 10:53:39 +00:00
nCode = : : MessageBoxA ( nil , re3_buff , " RE3 Assertion Failed! " ,
2019-06-02 21:42:51 +00: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 02:55:57 +00: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 21:42:51 +00:00
}
2019-08-16 18:17:15 +00:00
void re3_debug ( const char * format , . . . )
2019-06-02 21:42:51 +00:00
{
va_list va ;
va_start ( va , format ) ;
2020-05-11 02:55:57 +00:00
# ifdef _WIN32
2019-06-02 21:42:51 +00:00
vsprintf_s ( re3_buff , re3_buffsize , format , va ) ;
2020-05-11 02:55:57 +00:00
# else
vsprintf ( re3_buff , format , va ) ;
# endif
2019-06-02 21:42:51 +00:00
va_end ( va ) ;
2020-04-07 22:52:08 +00:00
printf ( " %s " , re3_buff ) ;
2020-03-26 13:16:06 +00:00
CDebug : : DebugAddText ( re3_buff ) ;
2019-06-02 21:42:51 +00:00
}
2019-08-16 18:17:15 +00:00
void re3_trace ( const char * filename , unsigned int lineno , const char * func , const char * format , . . . )
2019-06-02 21:42:51 +00:00
{
char buff [ re3_buffsize * 2 ] ;
va_list va ;
va_start ( va , format ) ;
2020-05-11 02:55:57 +00:00
# ifdef _WIN32
2019-06-02 21:42:51 +00: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 02:55:57 +00:00
# else
vsprintf ( re3_buff , format , va ) ;
va_end ( va ) ;
2019-06-02 21:42:51 +00:00
2020-05-11 02:55:57 +00:00
sprintf ( buff , " [%s.%s:%d]: %s " , filename , func , lineno , re3_buff ) ;
# endif
OutputDebugString ( buff ) ;
2019-06-02 21:42:51 +00:00
}
2019-05-31 23:58:19 +00:00
2020-05-07 06:26:16 +00:00
void re3_usererror ( const char * format , . . . )
{
va_list va ;
va_start ( va , format ) ;
2020-05-11 02:55:57 +00:00
# ifdef _WIN32
2020-05-07 06:26:16 +00: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 02:55:57 +00:00
# else
vsprintf ( re3_buff , format , va ) ;
printf ( " \n RE3 Error! \n \t %s \n " , re3_buff ) ;
assert ( false ) ;
# endif
2020-05-07 06:26:16 +00:00
}
2019-10-11 21:06:30 +00:00
# ifdef VALIDATE_SAVE_SIZE
2020-03-11 07:12:40 +00:00
int32 _saveBufCount ;
2019-10-11 21:06:30 +00:00
# endif