/* * CG_AddPrint_Cmd_f */ static void CG_AddPrint_Cmd_f( void ) { cg_subtitle_t *sub; sub = CG_Democam_RegisterSubtitle(); if( !sub ) { CG_Printf( "DemoCam Error: Failed to allocate the subtitle\n" ); return; } if( trap_Cmd_Argc() > 1 ) { char str[MAX_STRING_CHARS]; // one line of the console can't handle more than this int i; str[0] = 0; for( i = 1; i < trap_Cmd_Argc(); i++ ) { Q_strncatz( str, trap_Cmd_Argv( i ), sizeof( str ) ); if( i < trap_Cmd_Argc() - 1 ) { Q_strncatz( str, " ", sizeof( str ) ); } } sub->text = CG_CopyString( str ); } else { sub->text = CG_CopyString( "" ); } sub->highprint = true; }
/* * CG_RegisterMediaSfx */ static cgs_media_handle_t *CG_RegisterMediaSfx( const char *name, bool precache ) { cgs_media_handle_t *mediasfx; for( mediasfx = sfx_headnode; mediasfx; mediasfx = mediasfx->next ) { if( !Q_stricmp( mediasfx->name, name ) ) return mediasfx; } mediasfx = ( cgs_media_handle_t * )CG_Malloc( sizeof( cgs_media_handle_t ) ); mediasfx->name = CG_CopyString( name ); mediasfx->next = sfx_headnode; sfx_headnode = mediasfx; if( precache ) mediasfx->data = ( void * )trap_S_RegisterSound( mediasfx->name ); return mediasfx; }
/* * CG_RegisterMediaShader */ static cgs_media_handle_t *CG_RegisterMediaShader( const char *name, bool precache ) { cgs_media_handle_t *mediashader; for( mediashader = shader_headnode; mediashader; mediashader = mediashader->next ) { if( !Q_stricmp( mediashader->name, name ) ) return mediashader; } mediashader = ( cgs_media_handle_t * )CG_Malloc( sizeof( cgs_media_handle_t ) ); mediashader->name = CG_CopyString( name ); mediashader->next = shader_headnode; shader_headnode = mediashader; if( precache ) mediashader->data = ( void * )trap_R_RegisterPic( mediashader->name ); return mediashader; }
/* * CG_RegisterMediaModel */ static cgs_media_handle_t *CG_RegisterMediaModel( const char *name, bool precache ) { cgs_media_handle_t *mediamodel; for( mediamodel = model_headnode; mediamodel; mediamodel = mediamodel->next ) { if( !Q_stricmp( mediamodel->name, name ) ) return mediamodel; } mediamodel = ( cgs_media_handle_t * )CG_Malloc( sizeof( cgs_media_handle_t ) ); mediamodel->name = CG_CopyString( name ); mediamodel->next = model_headnode; model_headnode = mediamodel; if( precache ) mediamodel->data = ( void * )CG_RegisterModel( mediamodel->name ); return mediamodel; }
/* * CG_SC_MOTD */ static void CG_SC_MOTD( void ) { char *motd; if( cg.motd ) CG_Free( cg.motd ); cg.motd = NULL; motd = trap_Cmd_Argv( 2 ); if( !motd[0] ) return; if( !strcmp( trap_Cmd_Argv( 1 ), "1" ) ) { cg.motd = CG_CopyString( motd ); cg.motd_time = cg.time + 50 *strlen( motd ); if( cg.motd_time < cg.time + 5000 ) cg.motd_time = cg.time + 5000; } CG_Printf( "\nMessage of the Day:\n%s", motd ); }
/* * 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_LoadRecamScriptFile */ bool CG_LoadRecamScriptFile( char *filename ) { int filelen, filehandle; uint8_t *buf = NULL; char *ptr, *token; int linecount; cg_democam_t *cam = NULL; if( !filename ) { CG_Printf( "CG_LoadRecamScriptFile: no filename\n" ); return false; } filelen = trap_FS_FOpenFile( filename, &filehandle, FS_READ ); if( !filehandle || filelen < 1 ) { trap_FS_FCloseFile( filehandle ); } else { buf = ( uint8_t * )CG_Malloc( filelen + 1 ); filelen = trap_FS_Read( buf, filelen, filehandle ); trap_FS_FCloseFile( filehandle ); } if( !buf ) { return false; } // parse the script linecount = 0; ptr = ( char * )buf; while( ptr ) { token = COM_ParseExt( &ptr, true ); if( !token[0] ) { break; } if( !Q_stricmp( token, "subtitle" ) || !Q_stricmp( token, "print" ) ) { cg_subtitle_t *sub; sub = CG_Democam_RegisterSubtitle(); sub->highprint = ( Q_stricmp( token, "print" ) == 0 ); token = COM_ParseExt( &ptr, true ); if( !token[0] ) { break; } sub->timeStamp = (unsigned int)atoi( token ); token = COM_ParseExt( &ptr, true ); if( !token[0] ) { break; } sub->maxDuration = (unsigned int)atoi( token ); sub->text = CG_CopyString( COM_ParseExt( &ptr, true ) ); linecount = 0; } else { switch( linecount ) { case 0: cam = CG_Democam_RegisterCam( atoi( token ) ); break; case 1: cam->timeStamp = (unsigned int)atoi( token ); break; case 2: cam->origin[0] = atof( token ); break; case 3: cam->origin[1] = atof( token ); break; case 4: cam->origin[2] = atof( token ); break; case 5: cam->angles[0] = atof( token ); break; case 6: cam->angles[1] = atof( token ); break; case 7: cam->angles[2] = atof( token ); break; case 8: cam->trackEnt = atoi( token ); break; case 9: cam->fov = atoi( token ); break; default: CG_Error( "CG_LoadRecamScriptFile: bad switch\n" ); } linecount++; if( linecount == 10 ) { linecount = 0; } } } CG_Free( buf ); if( linecount != 0 ) { CG_Printf( "CG_LoadRecamScriptFile: Invalid script. Ignored\n" ); CG_Democam_FreeCams(); CG_Democam_FreeSubtitles(); return false; } CG_Democam_ExecutePathAnalysis(); return true; }