/* * CG_DemocamInit */ void CG_DemocamInit( void ) { int name_size; bool hassoundstream = false; democam_editing_mode = false; demo_initial_timestamp = 0; if( !cgs.demoPlaying ) return; if( !*cgs.demoName ) CG_Error( "CG_LoadRecamScriptFile: no demo name string\n" ); // see if there is any script for this demo, and load it name_size = sizeof( char ) * ( strlen( cgs.demoName ) + strlen( ".cam" ) + 1 ); demoscriptname = ( char * )CG_Malloc( name_size ); Q_snprintfz( demoscriptname, name_size, "%s", cgs.demoName ); COM_ReplaceExtension( demoscriptname, ".cam", name_size ); CG_Printf( "cam: %s\n", demoscriptname ); // add console commands trap_Cmd_AddCommand( "demoEditMode", CG_DemoEditMode_Cmd_f ); trap_Cmd_AddCommand( "demoFreeFly", CG_DemoFreeFly_Cmd_f ); trap_Cmd_AddCommand( "camswitch", CG_CamSwitch_Cmd_f ); if( CG_LoadRecamScriptFile( demoscriptname ) ) { CG_Printf( "Loaded demo cam script\n" ); } // check for a sound stream file cgs.demoAudioStream = ( char * )CG_Malloc( name_size ); Q_snprintfz( cgs.demoAudioStream, name_size, "%s", cgs.demoName ); COM_ReplaceExtension( cgs.demoAudioStream, ".wav", name_size ); if( trap_FS_FOpenFile( cgs.demoAudioStream, NULL, FS_READ ) != -1 ) { hassoundstream = true; } else { COM_ReplaceExtension( cgs.demoAudioStream, ".ogg", name_size ); if( trap_FS_FOpenFile( cgs.demoAudioStream, NULL, FS_READ ) != -1 ) { hassoundstream = true; } } if( !hassoundstream ) { CG_Free( cgs.demoAudioStream ); cgs.demoAudioStream = NULL; } }
/* * CG_Democam_ImportCams_f */ void CG_Democam_ImportCams_f( void ) { int name_size; char *customName; if( trap_Cmd_Argc() < 2 ) { CG_Printf( "Usage: importcams <filename> (relative to demos directory)\n" ); return; } // see if there is any script for this demo, and load it name_size = sizeof( char ) * ( strlen( "demos/" ) + strlen( trap_Cmd_Argv( 1 ) ) + strlen( ".cam" ) + 1 ); customName = ( char * )CG_Malloc( name_size ); Q_snprintfz( customName, name_size, "demos/%s", trap_Cmd_Argv( 1 ) ); COM_ReplaceExtension( customName, ".cam", name_size ); if( CG_LoadRecamScriptFile( customName ) ) { CG_Printf( "cam script imported\n" ); } else { CG_Printf( "CG_Democam_ImportCams_f: no valid file found\n" ); } }
/* * SV_AddPureShader * * FIXME: For now we don't parse shaders, but simply assume that it uses the same name .tga or .jpg */ static void SV_AddPureShader( const char *name ) { const char *extension; char tempname[MAX_CONFIGSTRING_CHARS]; if( !name || !name[0] ) return; assert( name && name[0] && strlen( name ) < MAX_CONFIGSTRING_CHARS ); if( !Q_strnicmp( name, "textures/common/", strlen( "textures/common/" ) ) ) return; Q_strncpyz( tempname, name, sizeof( tempname ) ); if( !COM_FileExtension( tempname ) ) { extension = FS_FirstExtension( tempname, IMAGE_EXTENSIONS, NUM_IMAGE_EXTENSIONS ); if( !extension ) return; COM_ReplaceExtension( tempname, extension, sizeof( tempname ) ); } SV_AddPureFile( tempname ); }
/* * CG_SaveCam_Cmd_f */ void CG_SaveCam_Cmd_f( void ) { if( !cgs.demoPlaying ) { return; } if( trap_Cmd_Argc() > 1 ) { char *customName; int custom_name_size; custom_name_size = sizeof( char ) * ( strlen( "demos/" ) + strlen( trap_Cmd_Argv( 1 ) ) + strlen( ".cam" ) + 1 ); customName = ( char * )CG_Malloc( custom_name_size ); Q_snprintfz( customName, custom_name_size, "demos/%s", trap_Cmd_Argv( 1 ) ); COM_ReplaceExtension( customName, ".cam", custom_name_size ); CG_SaveRecamScriptFile( customName ); CG_Free( customName ); return; } CG_SaveRecamScriptFile( demoscriptname ); }
/* * PF_PureSound */ static void PF_PureSound( const char *name ) { const char *extension; char tempname[MAX_CONFIGSTRING_CHARS]; if( sv.state != ss_loading ) return; if( !name || !name[0] || strlen( name ) >= MAX_CONFIGSTRING_CHARS ) return; Q_strncpyz( tempname, name, sizeof( tempname ) ); if( !COM_FileExtension( tempname ) ) { extension = FS_FirstExtension( tempname, SOUND_EXTENSIONS, NUM_SOUND_EXTENSIONS ); if( !extension ) return; COM_ReplaceExtension( tempname, extension, sizeof( tempname ) ); } SV_AddPureFile( tempname ); }
static mufont_t *SCR_LoadMUFont( const char *name, size_t len ) { size_t filename_size; char *filename; qbyte *buf; char *ptr, *token, *start; int filenum; int length; mufont_t *font; struct shader_s *shader; int numchar; int x, y, w, h; filename_size = strlen( "fonts/" ) + len + strlen( ".tga" ) + 1; filename = Mem_TempMalloc( filename_size ); Q_snprintfz( filename, filename_size, "fonts/%s", name ); // load the shader COM_ReplaceExtension( filename, ".tga", filename_size ); shader = R_RegisterPic( filename ); if( !shader ) { Mem_TempFree( filename ); return NULL; } // load the font description COM_ReplaceExtension( filename, ".wfd", filename_size ); // load the file length = FS_FOpenFile( filename, &filenum, FS_READ ); if( length == -1 ) { Mem_TempFree( filename ); return NULL; } Mem_TempFree( filename ); buf = Mem_TempMalloc( length + 1 ); length = FS_Read( buf, length, filenum ); FS_FCloseFile( filenum ); if( !length ) { Mem_TempFree( buf ); return NULL; } // seems to be valid. Allocate it font = (mufont_t *)Font_Alloc( sizeof( mufont_t ) ); font->shader = shader; font->name = Font_Alloc( len + 1 ); Q_strncpyz( font->name, name, len + 1 ); // proceed ptr = ( char * )buf; // get texture width and height token = COM_Parse( &ptr ); if( !token[0] ) goto error; font->imagewidth = atoi( token ); token = COM_Parse( &ptr ); if( !token[0] ) goto error; font->imageheight = atoi( token ); font->numchars = MIN_FONT_CHARS; // get the number of chars start = ptr; while( ptr ) { // "<char>" "<x>" "<y>" "<width>" "<height>" token = COM_Parse( &ptr ); if( !token[0] ) break; numchar = atoi( token ); if( numchar <= 0 ) break; x = atoi( COM_Parse( &ptr ) ), y = atoi( COM_Parse( &ptr ) ); w = atoi( COM_Parse( &ptr ) ), h = atoi( COM_Parse( &ptr ) ); if( numchar < 32 || numchar >= MAX_FONT_CHARS ) continue; if( ( unsigned int )( numchar + 1 ) > font->numchars ) font->numchars = ( unsigned int )numchar + 1; } if( !font->numchars ) goto error; font->chars = Font_Alloc( font->numchars * sizeof( muchar_t ) ); // get the chars ptr = start; while( ptr ) { token = COM_Parse( &ptr ); if( !token[0] ) break; numchar = atoi( token ); if( numchar <= 0 ) break; x = atoi( COM_Parse( &ptr ) ), y = atoi( COM_Parse( &ptr ) ); w = atoi( COM_Parse( &ptr ) ), h = atoi( COM_Parse( &ptr ) ); if( numchar < 32 || ( unsigned int )numchar >= font->numchars ) continue; font->chars[numchar].x = x; font->chars[numchar].y = y; font->chars[numchar].width = w; font->chars[numchar].height = h; // create the texture coordinates font->chars[numchar].s1 = ( (float)x )/(float)font->imagewidth; font->chars[numchar].s2 = ( (float)( x + w ) )/(float)font->imagewidth; font->chars[numchar].t1 = ( (float)y )/(float)font->imageheight; font->chars[numchar].t2 = ( (float)( y + h ) )/(float)font->imageheight; } // mudFont is not always giving a proper size to the space character font->chars[' '].width = font->chars['-'].width; // height is the same for every character font->fontheight = font->chars['a'].height; // if REPLACEMENT_CHAR is not present in this font, copy '?' to that position if( !( font->chars[REPLACEMENT_CHAR].height ) ) font->chars[REPLACEMENT_CHAR] = font->chars['?']; Mem_TempFree( buf ); return font; error: if( font->chars ) Font_Free( font->chars ); if( font->name ) Font_Free( font->name ); Font_Free( font ); Mem_TempFree( buf ); return NULL; }
/* * TV_Upstream_ParseConfigstringCommand_f */ static void TV_Upstream_HandleConfigstring( upstream_t *upstream, int index, const char *val ) { char hostname[MAX_CONFIGSTRING_CHARS]; msg_t msg; qbyte msgbuf[MAX_MSGLEN]; if( !val || !val[0] ) return; if( index < 0 || index >= MAX_CONFIGSTRINGS ) TV_Upstream_Error( upstream, "configstring > MAX_CONFIGSTRINGS" ); Q_strncpyz( upstream->configstrings[index], val, sizeof( upstream->configstrings[index] ) ); if( index == CS_AUTORECORDSTATE ) { // don't do a thing until we receive a "precache" command if( upstream->precacheDone ) TV_Upstream_AutoRecordAction( upstream, upstream->configstrings[CS_AUTORECORDSTATE] ); return; } if( index != CS_HOSTNAME ) return; if( !upstream->demo.playing ) { TV_Upstream_SetName( upstream, val ); return; } // demos often come with generic hostnames, attempt to workaround that if( !Q_stricmp( val, APPLICATION " server" ) ) { char *temp; size_t temp_size; const char *filebase; filebase = COM_FileBase( upstream->demo.filename ); temp_size = strlen( filebase ) + strlen( APP_DEMO_EXTENSION_STR ) + 1; temp = Mem_TempMalloc( temp_size ); Q_strncpyz( temp, filebase, temp_size ); COM_ReplaceExtension( temp, APP_DEMO_EXTENSION_STR, temp_size ); if( Com_GlobMatch( "*_auto[0-9][0-9][0-9][0-9]" APP_DEMO_EXTENSION_STR, temp, qfalse ) || Com_GlobMatch( "*_mvd" APP_DEMO_EXTENSION_STR, temp, qfalse ) ) temp[strrchr( temp, '_' ) - temp] = '\0'; else COM_StripExtension( temp ); Q_strncpyz( hostname, va( S_COLOR_ORANGE "R: " S_COLOR_WHITE "%s", temp ), sizeof( hostname ) ); Mem_TempFree( temp ); } else { Q_strncpyz( hostname, va( S_COLOR_ORANGE "R: " S_COLOR_WHITE "%s", val ), sizeof( hostname ) ); } TV_Upstream_SetName( upstream, hostname ); // override CS_HOSTNAME in next packet MSG_Init( &msg, msgbuf, sizeof( msgbuf ) ); MSG_WriteByte( &msg, svc_servercs ); MSG_WriteString( &msg, va( "cs %i \"%s\"", CS_HOSTNAME, hostname ) ); TV_Upstream_SavePacket( upstream, &msg, 0 ); }