long _stdcall Sys_Crash( PEXCEPTION_POINTERS pInfo ) { // save config if( host.state != HOST_CRASHED ) { // check to avoid recursive call error_on_exit = true; host.crashed = true; #ifdef DBGHELP stack_trace( pInfo ); #else Sys_Warn( "Sys_Crash: call %p at address %p", pInfo->ExceptionRecord->ExceptionAddress, pInfo->ExceptionRecord->ExceptionCode ); #endif if( host.type == HOST_NORMAL ) CL_Crashed(); // tell client about crash else host.state = HOST_CRASHED; if( host.developer <= 0 ) { // no reason to call debugger in release build - just exit Sys_Quit(); return EXCEPTION_CONTINUE_EXECUTION; } // all other states keep unchanged to let debugger find bug Con_DestroyConsole(); } if( oldFilter ) return oldFilter( pInfo ); return EXCEPTION_CONTINUE_EXECUTION; }
/* ================== Sys_DefaultHomePath ================== */ char *Sys_DefaultHomePath(void) { char *p; if( !*homePath ) { if( ( p = getenv( "HOME" ) ) != NULL ) { Q_strncpyz( homePath, p, sizeof( homePath ) ); #ifdef MACOS_X Q_strcat( homePath, sizeof( homePath ), "/Library/Application Support/Quake3" ); #else Q_strcat( homePath, sizeof( homePath ), "/." HOME_PATH ); #endif if( mkdir( homePath, 0777 ) ) { if( errno != EEXIST ) { Sys_Warn( "Unable to create directory \"%s\", error is %s(%d)\n", homePath, strerror( errno ), errno ); } } } } return homePath; }
/* ==================== CL_Init ==================== */ void CL_Init( void ) { qboolean loaded; Q_memset( &cls, 0, sizeof( cls ) ); if( Host_IsDedicated() ) return; // nothing running on the client Con_Init(); CL_InitLocal(); R_Init(); // init renderer S_Init(); // init sound // unreliable buffer. unsed for unreliable commands and voice stream BF_Init( &cls.datagram, "cls.datagram", cls.datagram_buf, sizeof( cls.datagram_buf )); IN_TouchInit(); #if defined (__ANDROID__) { char clientlib[256]; Q_snprintf( clientlib, sizeof(clientlib), "%s/" CLIENTDLL, getenv("XASH3D_GAMELIBDIR")); loaded = CL_LoadProgs( clientlib ); if( !loaded ) { Q_snprintf( clientlib, sizeof(clientlib), "%s/" CLIENTDLL, getenv("XASH3D_ENGLIBDIR")); loaded = CL_LoadProgs( clientlib ); } } #else { char clientlib[256]; Com_ResetLibraryError(); if( Sys_GetParmFromCmdLine( "-clientlib", clientlib ) ) loaded = CL_LoadProgs( clientlib ); else loaded = CL_LoadProgs( va( "%s/%s" , GI->dll_path, SI.clientlib )); if( !loaded ) { loaded = CL_LoadProgs( CLIENTDLL ); } } #endif if( loaded ) { cls.initialized = true; cls.keybind_changed = false; cl.maxclients = 1; // allow to drawing player in menu cls.olddemonum = -1; cls.demonum = -1; } else Sys_Warn("Could not load client library:\n%s", Com_GetLibraryError()); }
/* ================== SCR_Init ================== */ void SCR_Init( void ) { if( scr_init ) return; MsgDev( D_NOTE, "SCR_Init()\n" ); scr_centertime = Cvar_Get( "scr_centertime", "2.5", 0, "centerprint hold time" ); cl_levelshot_name = Cvar_Get( "cl_levelshot_name", "*black", 0, "contains path to current levelshot" ); cl_allow_levelshots = Cvar_Get( "allow_levelshots", "0", CVAR_ARCHIVE, "allow engine to use indivdual levelshots instead of 'loading' image" ); scr_loading = Cvar_Get( "scr_loading", "0", 0, "loading bar progress" ); scr_download = Cvar_Get( "scr_download", "0", 0, "downloading bar progress" ); cl_testlights = Cvar_Get( "cl_testlights", "0", 0, "test dynamic lights" ); cl_envshot_size = Cvar_Get( "cl_envshot_size", "256", CVAR_ARCHIVE, "envshot size of cube side" ); scr_dark = Cvar_Get( "v_dark", "0", 0, "starts level from dark screen" ); scr_viewsize = Cvar_Get( "viewsize", "120", CVAR_ARCHIVE, "screen size" ); // register our commands Cmd_AddCommand( "timerefresh", SCR_TimeRefresh_f, "turn quickly and print rendering statistcs" ); Cmd_AddCommand( "skyname", CL_SetSky_f, "set new skybox by basename" ); Cmd_AddCommand( "viewpos", SCR_Viewpos_f, "prints current player origin" ); Cmd_AddCommand( "sizeup", SCR_SizeUp_f, "screen size up to 10 points" ); Cmd_AddCommand( "sizedown", SCR_SizeDown_f, "screen size down to 10 points" ); Com_ResetLibraryError(); if( host.state != HOST_RESTART && !UI_LoadProgs( )) { Sys_Warn( "can't initialize menu library:\n%s", Com_GetLibraryError() ); // this is not fatal for us // console still can't be toggled in-game without extra cmd-line switch if( !host.developer ) host.developer = 1; // we need console, because menu is missing } SCR_LoadCreditsFont (); SCR_InstallParticlePalette (); SCR_RegisterTextures (); SCR_InitCinematic(); CL_InitNetgraph(); SCR_VidInit(); if( host.state != HOST_RESTART ) { if( host.developer && Sys_CheckParm( "-toconsole" )) Cbuf_AddText( "toggleconsole\n" ); else UI_SetActiveMenu( true ); } scr_init = true; }
/* =============== CL_ChangeGame This is experiment. Use with precaution =============== */ qboolean CL_ChangeGame( const char *gamefolder, qboolean bReset ) { if( Host_IsDedicated() ) return false; if( Q_stricmp( host.gamefolder, gamefolder )) { kbutton_t *mlook, *jlook; qboolean mlook_active = false, jlook_active = false; string mapname, maptitle; int maxEntities; mlook = (kbutton_t *)clgame.dllFuncs.KB_Find( "in_mlook" ); jlook = (kbutton_t *)clgame.dllFuncs.KB_Find( "in_jlook" ); if( mlook && ( mlook->state & 1 )) mlook_active = true; if( jlook && ( jlook->state & 1 )) jlook_active = true; // so reload all images (remote connect) Mod_ClearAll( true ); R_ShutdownImages(); FS_LoadGameInfo( (bReset) ? host.gamefolder : gamefolder ); R_InitImages(); // save parms maxEntities = clgame.maxEntities; Q_strncpy( mapname, clgame.mapname, MAX_STRING ); Q_strncpy( maptitle, clgame.maptitle, MAX_STRING ); Com_ResetLibraryError(); if( !CL_LoadProgs( va( "%s/%s", GI->dll_path, GI->client_lib))) Sys_Warn( "Can't initialize client library\n%s", Com_GetLibraryError() ); // restore parms clgame.maxEntities = maxEntities; Q_strncpy( clgame.mapname, mapname, MAX_STRING ); Q_strncpy( clgame.maptitle, maptitle, MAX_STRING ); // invalidate fonts so we can reloading them again Q_memset( &cls.creditsFont, 0, sizeof( cls.creditsFont )); SCR_InstallParticlePalette(); SCR_LoadCreditsFont(); Con_InvalidateFonts(); SCR_RegisterTextures (); CL_FreeEdicts (); SCR_VidInit (); if( cls.key_dest == key_game ) // restore mouse state clgame.dllFuncs.IN_ActivateMouse(); // restore mlook state if( mlook_active ) Cmd_ExecuteString( "+mlook\n", src_command ); if( jlook_active ) Cmd_ExecuteString( "+jlook\n", src_command ); return true; } return false; }