/* * CG_Init */ void CG_Init( const char *serverName, unsigned int playerNum, int vidWidth, int vidHeight, qboolean demoplaying, const char *demoName, qboolean pure, unsigned int snapFrameTime, int protocol, int sharedSeed ) { CG_InitGameShared(); memset( &cg, 0, sizeof( cg_state_t ) ); memset( &cgs, 0, sizeof( cg_static_t ) ); memset( cg_entities, 0, sizeof( cg_entities ) ); #ifdef PURE_CHEAT CG_Printf( S_COLOR_MAGENTA"Hi, I'm an unpure bitch 7\n" ); #endif // save server name cgs.serverName = CG_CopyString( serverName ); // save local player number cgs.playerNum = playerNum; // save current width and height cgs.vidWidth = vidWidth; cgs.vidHeight = vidHeight; // demo cgs.demoPlaying = demoplaying == qtrue; cgs.demoName = demoName; // whether to only allow pure files cgs.pure = pure == qtrue; // whether we are connected to a tv-server cgs.tv = false; cgs.tvRequested = false; // game protocol number cgs.gameProtocol = protocol; cgs.snapFrameTime = snapFrameTime; cgs.initialSharedSeed = sharedSeed; cg.sharedSeed = cgs.initialSharedSeed; cgs.hasGametypeMenu = false; // this will update as soon as we receive configstrings CG_RegisterVariables(); CG_InitTemporaryBoneposesCache(); CG_PModelsInit(); CG_ScreenInit(); // get configstrings CG_RegisterConfigStrings(); // register fonts here so loading screen works CG_RegisterFonts(); cgs.shaderWhite = trap_R_RegisterPic( "$whiteimage" ); // l10n CG_InitL10n(); CG_RegisterLevelMinimap(); CG_RegisterModels(); CG_RegisterSounds(); CG_RegisterShaders(); CG_RegisterSkinFiles(); CG_RegisterClients(); CG_RegisterCGameCommands(); CG_ValidateItemList(); CG_LoadStatusBar(); CG_LoadingString( "" ); CG_ClearDecals(); CG_ClearPolys(); CG_ClearEffects(); CG_ClearLocalEntities(); CG_InitChat( &cg.chat ); CG_RegisterLightStyles(); // start up announcer events queue from clean CG_ClearAnnouncerEvents(); cgs.precacheDone = true; cgs.demoTutorial = cgs.demoPlaying && (strstr( cgs.demoName, "tutorials/" ) != NULL); cg.firstFrame = true; // think of the next frame in CG_NewFrameSnap as of the first one // now that we're done with precaching, let the autorecord actions do something CG_ConfigString( CS_AUTORECORDSTATE, cgs.configStrings[CS_AUTORECORDSTATE] ); CG_DemocamInit(); }
/* * CG_ConfigString */ void CG_ConfigString( int i, const char *s ) { size_t len; // wsw : jal : warn if configstring overflow len = strlen( s ); if( len >= MAX_CONFIGSTRING_CHARS ) CG_Printf( "%sWARNING:%s Configstring %i overflowed\n", S_COLOR_YELLOW, S_COLOR_WHITE, i ); if( i < 0 || i >= MAX_CONFIGSTRINGS ) CG_Error( "configstring > MAX_CONFIGSTRINGS" ); Q_strncpyz( cgs.configStrings[i], s, sizeof( cgs.configStrings[i] ) ); // do something apropriate if( i == CS_MAPNAME ) { CG_RegisterLevelMinimap(); } else if( i == CS_TVSERVER ) { CG_UpdateTVServerString(); } else if( i == CS_GAMETYPETITLE ) { } else if( i == CS_GAMETYPENAME ) { GS_SetGametypeName( cgs.configStrings[CS_GAMETYPENAME] ); } else if( i == CS_AUTORECORDSTATE ) { CG_SC_AutoRecordAction( cgs.configStrings[i] ); } else if( i >= CS_MODELS && i < CS_MODELS+MAX_MODELS ) { if( cgs.configStrings[i][0] == '$' ) // indexed pmodel cgs.pModelsIndex[i-CS_MODELS] = CG_RegisterPlayerModel( cgs.configStrings[i]+1 ); else cgs.modelDraw[i-CS_MODELS] = CG_RegisterModel( cgs.configStrings[i] ); } else if( i >= CS_SOUNDS && i < CS_SOUNDS+MAX_SOUNDS ) { if( cgs.configStrings[i][0] != '*' ) cgs.soundPrecache[i-CS_SOUNDS] = trap_S_RegisterSound( cgs.configStrings[i] ); } else if( i >= CS_IMAGES && i < CS_IMAGES+MAX_IMAGES ) { cgs.imagePrecache[i-CS_IMAGES] = trap_R_RegisterPic( cgs.configStrings[i] ); } else if( i >= CS_SKINFILES && i < CS_SKINFILES+MAX_SKINFILES ) { cgs.skinPrecache[i-CS_SKINFILES] = trap_R_RegisterSkinFile( cgs.configStrings[i] ); } else if( i >= CS_LIGHTS && i < CS_LIGHTS+MAX_LIGHTSTYLES ) { CG_SetLightStyle( i - CS_LIGHTS ); } else if( i >= CS_ITEMS && i < CS_ITEMS+MAX_ITEMS ) { CG_ValidateItemDef( i - CS_ITEMS, cgs.configStrings[i] ); } else if( i >= CS_PLAYERINFOS && i < CS_PLAYERINFOS+MAX_CLIENTS ) { CG_LoadClientInfo( &cgs.clientInfo[i-CS_PLAYERINFOS], cgs.configStrings[i], i-CS_PLAYERINFOS ); } else if( i >= CS_GAMECOMMANDS && i < CS_GAMECOMMANDS+MAX_GAMECOMMANDS ) { if( !cgs.demoPlaying ) { trap_Cmd_AddCommand( cgs.configStrings[i], NULL ); if( !Q_stricmp( cgs.configStrings[i], "gametypemenu" ) ) { cgs.hasGametypeMenu = qtrue; } } } else if( i >= CS_WEAPONDEFS && i < CS_WEAPONDEFS + MAX_WEAPONDEFS ) { CG_OverrideWeapondef( i - CS_WEAPONDEFS, cgs.configStrings[i] ); } }