diff options
Diffstat (limited to 'src/cgame')
-rw-r--r-- | src/cgame/cg_animmapobj.c | 69 | ||||
-rw-r--r-- | src/cgame/cg_buildable.c | 38 | ||||
-rw-r--r-- | src/cgame/cg_consolecmds.c | 245 | ||||
-rw-r--r-- | src/cgame/cg_draw.c | 149 | ||||
-rw-r--r-- | src/cgame/cg_drawtools.c | 661 | ||||
-rw-r--r-- | src/cgame/cg_ents.c | 426 | ||||
-rw-r--r-- | src/cgame/cg_event.c | 1524 | ||||
-rw-r--r-- | src/cgame/cg_local.h | 1 | ||||
-rw-r--r-- | src/cgame/cg_main.c | 1240 | ||||
-rw-r--r-- | src/cgame/cg_marks.c | 417 | ||||
-rw-r--r-- | src/cgame/cg_players.c | 1225 | ||||
-rw-r--r-- | src/cgame/cg_playerstate.c | 457 | ||||
-rw-r--r-- | src/cgame/cg_predict.c | 384 | ||||
-rw-r--r-- | src/cgame/cg_scanner.c | 4 | ||||
-rw-r--r-- | src/cgame/cg_servercmds.c | 886 | ||||
-rw-r--r-- | src/cgame/cg_snapshot.c | 522 | ||||
-rw-r--r-- | src/cgame/cg_syscalls.asm | 196 | ||||
-rw-r--r-- | src/cgame/cg_syscalls.c | 412 | ||||
-rw-r--r-- | src/cgame/cg_trails.c | 1308 | ||||
-rw-r--r-- | src/cgame/cg_view.c | 539 | ||||
-rw-r--r-- | src/cgame/cg_weapons.c | 1493 | ||||
-rw-r--r-- | src/cgame/tr_types.h | 273 |
22 files changed, 5323 insertions, 7146 deletions
diff --git a/src/cgame/cg_animmapobj.c b/src/cgame/cg_animmapobj.c index d911604a..c7218b00 100644 --- a/src/cgame/cg_animmapobj.c +++ b/src/cgame/cg_animmapobj.c @@ -27,74 +27,77 @@ static void CG_RunAMOLerpFrame( lerpFrame_t *lf ) animation_t *anim; // debugging tool to get no animations - if ( cg_animSpeed.integer == 0 ) { + if( cg_animSpeed.integer == 0 ) + { lf->oldFrame = lf->frame = lf->backlerp = 0; return; } // if we have passed the current frame, move it to // oldFrame and calculate a new frame - if ( cg.time >= lf->frameTime ) { + if( cg.time >= lf->frameTime ) + { lf->oldFrame = lf->frame; lf->oldFrameTime = lf->frameTime; // get the next frame based on the animation anim = lf->animation; - if ( !anim->frameLerp ) { + if( !anim->frameLerp ) return; // shouldn't happen - } - if ( cg.time < lf->animationTime ) { + + if( cg.time < lf->animationTime ) lf->frameTime = lf->animationTime; // initial lerp - } else { + else lf->frameTime = lf->oldFrameTime + anim->frameLerp; - } + f = ( lf->frameTime - lf->animationTime ) / anim->frameLerp; numFrames = anim->numFrames; - if (anim->flipflop) { + if( anim->flipflop ) numFrames *= 2; - } - if ( f >= numFrames ) { + + if( f >= numFrames ) + { f -= numFrames; - if ( anim->loopFrames ) { + if( anim->loopFrames ) + { f %= anim->loopFrames; f += anim->numFrames - anim->loopFrames; - } else { + } + else + { f = numFrames - 1; // the animation is stuck at the end, so it // can immediately transition to another sequence lf->frameTime = cg.time; } } - if ( anim->reversed ) { + + if( anim->reversed ) lf->frame = anim->firstFrame + anim->numFrames - 1 - f; - } - else if (anim->flipflop && f>=anim->numFrames) { - lf->frame = anim->firstFrame + anim->numFrames - 1 - (f%anim->numFrames); - } - else { + else if( anim->flipflop && f>=anim->numFrames ) + lf->frame = anim->firstFrame + anim->numFrames - 1 - ( f % anim->numFrames ); + else lf->frame = anim->firstFrame + f; - } - if ( cg.time > lf->frameTime ) { + + if( cg.time > lf->frameTime ) + { lf->frameTime = cg.time; - if ( cg_debugAnim.integer ) { - CG_Printf( "Clamp lf->frameTime\n"); - } + if( cg_debugAnim.integer ) + CG_Printf( "Clamp lf->frameTime\n" ); } } - if ( lf->frameTime > cg.time + 200 ) { + if( lf->frameTime > cg.time + 200 ) lf->frameTime = cg.time; - } - if ( lf->oldFrameTime > cg.time ) { + if( lf->oldFrameTime > cg.time ) lf->oldFrameTime = cg.time; - } + // calculate current lerp value - if ( lf->frameTime == lf->oldFrameTime ) { + if( lf->frameTime == lf->oldFrameTime ) lf->backlerp = 0; - } else { + else lf->backlerp = 1.0 - (float)( cg.time - lf->oldFrameTime ) / ( lf->frameTime - lf->oldFrameTime ); - } } @@ -160,9 +163,9 @@ void CG_animMapObj( centity_t *cent ) if( es->angles2[ 0 ] ) { scale = es->angles2[ 0 ]; - VectorScale( ent.axis[0], scale, ent.axis[0] ); - VectorScale( ent.axis[1], scale, ent.axis[1] ); - VectorScale( ent.axis[2], scale, ent.axis[2] ); + VectorScale( ent.axis[ 0 ], scale, ent.axis[ 0 ] ); + VectorScale( ent.axis[ 1 ], scale, ent.axis[ 1 ] ); + VectorScale( ent.axis[ 2 ], scale, ent.axis[ 2 ] ); ent.nonNormalizedAxes = qtrue; } diff --git a/src/cgame/cg_buildable.c b/src/cgame/cg_buildable.c index 4c5e13ec..90cb2e76 100644 --- a/src/cgame/cg_buildable.c +++ b/src/cgame/cg_buildable.c @@ -44,14 +44,14 @@ models/buildables/hivemind/animation.cfg, etc */ static qboolean CG_ParseBuildableAnimationFile( const char *filename, buildable_t buildable ) { - char *text_p, *prev; - int len; - int i; - char *token; - float fps; - char text[ 20000 ]; + char *text_p, *prev; + int len; + int i; + char *token; + float fps; + char text[ 20000 ]; fileHandle_t f; - animation_t *animations; + animation_t *animations; animations = cg_buildables[ buildable ].animations; @@ -135,13 +135,13 @@ sound/buildables/hivemind/sound.cfg, etc */ static qboolean CG_ParseBuildableSoundFile( const char *filename, buildable_t buildable ) { - char *text_p, *prev; - int len; - int i; - char *token; - char text[ 20000 ]; + char *text_p, *prev; + int len; + int i; + char *token; + char text[ 20000 ]; fileHandle_t f; - sound_t *sounds; + sound_t *sounds; sounds = cg_buildables[ buildable ].sounds; @@ -198,12 +198,12 @@ Initialises the animation db */ void CG_InitBuildables( ) { - char filename[ MAX_QPATH ]; - char soundfile[ MAX_QPATH ]; - char *buildableName; - char *modelFile; - int i; - int j; + char filename[ MAX_QPATH ]; + char soundfile[ MAX_QPATH ]; + char *buildableName; + char *modelFile; + int i; + int j; fileHandle_t f; memset( cg_buildables, 0, sizeof( cg_buildables ) ); diff --git a/src/cgame/cg_consolecmds.c b/src/cgame/cg_consolecmds.c index c53ee166..43c78675 100644 --- a/src/cgame/cg_consolecmds.c +++ b/src/cgame/cg_consolecmds.c @@ -20,14 +20,14 @@ -void CG_TargetCommand_f( void ) { +void CG_TargetCommand_f( void ) +{ int targetNum; - char test[4]; + char test[ 4 ]; - targetNum = CG_CrosshairPlayer(); - if (!targetNum ) { + targetNum = CG_CrosshairPlayer( ); + if( !targetNum ) return; - } trap_Argv( 1, test, 4 ); trap_SendConsoleCommand( va( "gc %i %i", targetNum, atoi( test ) ) ); @@ -42,8 +42,9 @@ CG_SizeUp_f Keybinding command ================= */ -static void CG_SizeUp_f (void) { - trap_Cvar_Set("cg_viewsize", va("%i",(int)(cg_viewsize.integer+10))); +static void CG_SizeUp_f( void ) +{ + trap_Cvar_Set( "cg_viewsize", va( "%i", (int)( cg_viewsize.integer + 10 ) ) ); } @@ -54,8 +55,9 @@ CG_SizeDown_f Keybinding command ================= */ -static void CG_SizeDown_f (void) { - trap_Cvar_Set("cg_viewsize", va("%i",(int)(cg_viewsize.integer-10))); +static void CG_SizeDown_f( void ) +{ + trap_Cvar_Set( "cg_viewsize", va( "%i", (int)( cg_viewsize.integer - 10 ) ) ); } @@ -66,15 +68,18 @@ CG_Viewpos_f Debugging command to print the current position ============= */ -static void CG_Viewpos_f (void) { - CG_Printf ("(%i %i %i) : %i\n", (int)cg.refdef.vieworg[0], - (int)cg.refdef.vieworg[1], (int)cg.refdef.vieworg[2], - (int)cg.refdefViewAngles[YAW]); +static void CG_Viewpos_f( void ) +{ + CG_Printf( "(%i %i %i) : %i\n", (int)cg.refdef.vieworg[ 0 ], + (int)cg.refdef.vieworg[ 1 ], (int)cg.refdef.vieworg[ 2 ], + (int)cg.refdefViewAngles[ YAW ] ); } -static void CG_ScoresDown_f( void ) { - if ( cg.scoresRequestTime + 2000 < cg.time ) { +static void CG_ScoresDown_f( void ) +{ + if( cg.scoresRequestTime + 2000 < cg.time ) + { // the scores are more than two seconds out of data, // so request new ones cg.scoresRequestTime = cg.time; @@ -82,108 +87,59 @@ static void CG_ScoresDown_f( void ) { // leave the current scores up if they were already // displayed, but if this is the first hit, clear them out - if ( !cg.showScores ) { + if( !cg.showScores ) + { cg.showScores = qtrue; cg.numScores = 0; } - } else { + } + else + { // show the cached contents even if they just pressed if it // is within two seconds cg.showScores = qtrue; } } -static void CG_ScoresUp_f( void ) { - if ( cg.showScores ) { +static void CG_ScoresUp_f( void ) +{ + if( cg.showScores ) + { cg.showScores = qfalse; cg.scoreFadeTime = cg.time; } } -static void CG_TellTarget_f( void ) { +static void CG_TellTarget_f( void ) +{ int clientNum; - char command[128]; - char message[128]; + char command[ 128 ]; + char message[ 128 ]; - clientNum = CG_CrosshairPlayer(); - if ( clientNum == -1 ) { + clientNum = CG_CrosshairPlayer( ); + if( clientNum == -1 ) return; - } trap_Args( message, 128 ); Com_sprintf( command, 128, "tell %i %s", clientNum, message ); trap_SendClientCommand( command ); } -static void CG_TellAttacker_f( void ) { +static void CG_TellAttacker_f( void ) +{ int clientNum; - char command[128]; - char message[128]; + char command[ 128 ]; + char message[ 128 ]; - clientNum = CG_LastAttacker(); - if ( clientNum == -1 ) { + clientNum = CG_LastAttacker( ); + if( clientNum == -1 ) return; - } trap_Args( message, 128 ); Com_sprintf( command, 128, "tell %i %s", clientNum, message ); trap_SendClientCommand( command ); } -static void CG_VoiceTellTarget_f( void ) { - int clientNum; - char command[128]; - char message[128]; - - clientNum = CG_CrosshairPlayer(); - if ( clientNum == -1 ) { - return; - } - - trap_Args( message, 128 ); - Com_sprintf( command, 128, "vtell %i %s", clientNum, message ); - trap_SendClientCommand( command ); -} - -static void CG_VoiceTellAttacker_f( void ) { - int clientNum; - char command[128]; - char message[128]; - - clientNum = CG_LastAttacker(); - if ( clientNum == -1 ) { - return; - } - - trap_Args( message, 128 ); - Com_sprintf( command, 128, "vtell %i %s", clientNum, message ); - trap_SendClientCommand( command ); -} - -/* -================== -CG_StartOrbit_f -================== -*/ - -static void CG_StartOrbit_f( void ) { - char var[MAX_TOKEN_CHARS]; - - trap_Cvar_VariableStringBuffer( "developer", var, sizeof( var ) ); - if ( !atoi(var) ) { - return; - } - if (cg_cameraOrbit.value != 0) { - trap_Cvar_Set("cg_cameraOrbit", "0"); - trap_Cvar_Set("cg_thirdPerson", "0"); - } else { - trap_Cvar_Set("cg_cameraOrbit", "5"); - trap_Cvar_Set("cg_thirdPerson", "1"); - trap_Cvar_Set("cg_thirdPersonAngle", "0"); - trap_Cvar_Set("cg_thirdPersonRange", "100"); - } -} - /* ================== CG_DecodeMP3_f @@ -194,7 +150,7 @@ void CG_DecodeMP3_f( void ) char mp3file[ MAX_QPATH ]; char wavfile[ MAX_QPATH ]; - if( trap_Argc() < 2 ) + if( trap_Argc( ) < 2 ) { CG_Printf( "usage: decodeMP3 <mp3file> <wavfile>\n" ); return; @@ -206,12 +162,14 @@ void CG_DecodeMP3_f( void ) S_decodeMP3( mp3file, wavfile ); } -typedef struct { +typedef struct +{ char *cmd; - void (*function)(void); + void (*function)( void ); } consoleCommand_t; -static consoleCommand_t commands[] = { +static consoleCommand_t commands[ ] = +{ { "testgun", CG_TestGun_f }, { "testmodel", CG_TestModel_f }, { "nextframe", CG_TestModelNextFrame_f }, @@ -230,10 +188,7 @@ static consoleCommand_t commands[] = { { "weapon", CG_Weapon_f }, { "tell_target", CG_TellTarget_f }, { "tell_attacker", CG_TellAttacker_f }, - { "vtell_target", CG_VoiceTellTarget_f }, - { "vtell_attacker", CG_VoiceTellAttacker_f }, { "tcmd", CG_TargetCommand_f }, - { "startOrbit", CG_StartOrbit_f }, { "decodeMP3", CG_DecodeMP3_f }, { "loaddeferred", CG_LoadDeferredPlayers } }; @@ -247,12 +202,13 @@ The string has been tokenized and can be retrieved with Cmd_Argc() / Cmd_Argv() ================= */ -qboolean CG_ConsoleCommand( void ) { +qboolean CG_ConsoleCommand( void ) +{ const char *cmd; const char *arg1; - int i; + int i; - cmd = CG_Argv(0); + cmd = CG_Argv( 0 ); //TA: ugly hacky special case if( !Q_stricmp( cmd, "ui_menu" ) ) @@ -262,9 +218,11 @@ qboolean CG_ConsoleCommand( void ) { return qtrue; } - for ( i = 0 ; i < sizeof( commands ) / sizeof( commands[0] ) ; i++ ) { - if ( !Q_stricmp( cmd, commands[i].cmd ) ) { - commands[i].function(); + for( i = 0; i < sizeof( commands ) / sizeof( commands[ 0 ] ); i++ ) + { + if( !Q_stricmp( cmd, commands[ i ].cmd ) ) + { + commands[ i ].function( ); return qtrue; } } @@ -281,57 +239,56 @@ Let the client system know about all of our commands so it can perform tab completion ================= */ -void CG_InitConsoleCommands( void ) { +void CG_InitConsoleCommands( void ) +{ int i; - for ( i = 0 ; i < sizeof( commands ) / sizeof( commands[0] ) ; i++ ) { - trap_AddCommand( commands[i].cmd ); - } + for( i = 0 ; i < sizeof( commands ) / sizeof( commands[ 0 ] ) ; i++ ) + trap_AddCommand( commands[ i ].cmd ); // // the game server will interpret these commands, which will be automatically // forwarded to the server after they are not recognized locally // - trap_AddCommand ("kill"); - trap_AddCommand ("say"); - trap_AddCommand ("say_team"); - trap_AddCommand ("tell"); - trap_AddCommand ("vsay"); - trap_AddCommand ("vsay_team"); - trap_AddCommand ("vtell"); - trap_AddCommand ("vtaunt"); - trap_AddCommand ("vosay"); - trap_AddCommand ("vosay_team"); - trap_AddCommand ("votell"); - trap_AddCommand ("give"); - trap_AddCommand ("god"); - trap_AddCommand ("notarget"); - trap_AddCommand ("noclip"); - trap_AddCommand ("team"); - trap_AddCommand ("follow"); - trap_AddCommand ("levelshot"); - trap_AddCommand ("addbot"); - trap_AddCommand ("setviewpos"); - trap_AddCommand ("callvote"); - trap_AddCommand ("vote"); - trap_AddCommand ("callteamvote"); - trap_AddCommand ("teamvote"); - trap_AddCommand ("stats"); - trap_AddCommand ("teamtask"); - trap_AddCommand ("class"); - trap_AddCommand ("build"); - trap_AddCommand ("buy"); - trap_AddCommand ("sell"); - trap_AddCommand ("deposit"); - trap_AddCommand ("withdraw"); - trap_AddCommand ("spawnbody"); - trap_AddCommand ("itemact"); - trap_AddCommand ("itemdeact"); - trap_AddCommand ("itemtoggle"); - trap_AddCommand ("destroy"); - trap_AddCommand ("deconstruct"); - trap_AddCommand ("torch"); - trap_AddCommand ("menu"); - trap_AddCommand ("ui_menu"); - trap_AddCommand ("loaddefered"); // spelled wrong, but not changing for demo + trap_AddCommand( "kill" ); + trap_AddCommand( "say" ); + trap_AddCommand( "say_team" ); + trap_AddCommand( "tell" ); + trap_AddCommand( "vsay" ); + trap_AddCommand( "vsay_team" ); + trap_AddCommand( "vtell" ); + trap_AddCommand( "vtaunt" ); + trap_AddCommand( "vosay" ); + trap_AddCommand( "vosay_team" ); + trap_AddCommand( "votell" ); + trap_AddCommand( "give" ); + trap_AddCommand( "god" ); + trap_AddCommand( "notarget" ); + trap_AddCommand( "noclip" ); + trap_AddCommand( "team" ); + trap_AddCommand( "follow" ); + trap_AddCommand( "levelshot" ); + trap_AddCommand( "addbot" ); + trap_AddCommand( "setviewpos" ); + trap_AddCommand( "callvote" ); + trap_AddCommand( "vote" ); + trap_AddCommand( "callteamvote" ); + trap_AddCommand( "teamvote" ); + trap_AddCommand( "stats" ); + trap_AddCommand( "teamtask" ); + trap_AddCommand( "class" ); + trap_AddCommand( "build" ); + trap_AddCommand( "buy" ); + trap_AddCommand( "sell" ); + trap_AddCommand( "deposit" ); + trap_AddCommand( "withdraw" ); + trap_AddCommand( "spawnbody" ); + trap_AddCommand( "itemact" ); + trap_AddCommand( "itemdeact" ); + trap_AddCommand( "itemtoggle" ); + trap_AddCommand( "destroy" ); + trap_AddCommand( "deconstruct" ); + trap_AddCommand( "menu" ); + trap_AddCommand( "ui_menu" ); + trap_AddCommand( "loaddefered" ); // spelled wrong, but not changing for demo } diff --git a/src/cgame/cg_draw.c b/src/cgame/cg_draw.c index 7b77489a..3938aa4a 100644 --- a/src/cgame/cg_draw.c +++ b/src/cgame/cg_draw.c @@ -27,9 +27,9 @@ int drawTeamOverlayModificationCount = -1; int sortedTeamPlayers[TEAM_MAXOVERLAY]; int numSortedTeamPlayers; -char systemChat[256]; -char teamChat1[256]; -char teamChat2[256]; +char systemChat[ 256 ]; +char teamChat1[ 256 ]; +char teamChat2[ 256 ]; //TA UI int CG_Text_Width( const char *text, float scale, int limit ) @@ -881,8 +881,8 @@ static void CG_DrawKiller( rectDef_t *rect, float scale, vec4_t color, static void CG_Text_Paint_Limit( float *maxX, float x, float y, float scale, vec4_t color, const char* text, float adjust, int limit ) { - int len, count; - vec4_t newColor; + int len, count; + vec4_t newColor; glyphInfo_t *glyph; if( text ) @@ -1219,11 +1219,11 @@ LAGOMETER typedef struct { - int frameSamples[ LAG_SAMPLES ]; - int frameCount; - int snapshotFlags[ LAG_SAMPLES ]; - int snapshotSamples[ LAG_SAMPLES ]; - int snapshotCount; + int frameSamples[ LAG_SAMPLES ]; + int frameCount; + int snapshotFlags[ LAG_SAMPLES ]; + int snapshotSamples[ LAG_SAMPLES ]; + int snapshotCount; } lagometer_t; lagometer_t lagometer; @@ -1319,11 +1319,12 @@ CG_DrawLagometer */ static void CG_DrawLagometer( rectDef_t *rect, qhandle_t shader ) { - int a, x, y, i; - float v; - float ax, ay, aw, ah, mid, range; - int color; - float vscale; + int a, x, y, i; + float v; + float ax, ay, aw, ah, mid, range; + int color; + float vscale; + vec4_t white = { 1.0f, 1.0f, 1.0f, 1.0f }; if( !cg_lagometer.integer ) { @@ -1437,9 +1438,9 @@ static void CG_DrawLagometer( rectDef_t *rect, qhandle_t shader ) trap_R_SetColor( NULL ); if( cg_nopredict.integer || cg_synchronousClients.integer ) - CG_DrawBigString( ax, ay, "snc", 1.0 ); + CG_Text_Paint( ax, ay, 0.5, white, "snc", 0, 0, ITEM_TEXTSTYLE_NORMAL ); - CG_DrawDisconnect(); + CG_DrawDisconnect( ); } /* @@ -1678,7 +1679,7 @@ CG_ShowTeamMenus */ void CG_ShowTeamMenu( ) { - Menus_OpenByName("teamMenu"); + Menus_OpenByName( "teamMenu" ); } /* @@ -1695,24 +1696,14 @@ void CG_EventHandling( int type ) cgs.eventHandling = type; if( type == CGAME_EVENT_NONE ) - { CG_HideTeamMenu( ); - } - else if( type == CGAME_EVENT_TEAMMENU ) - { - //CG_ShowTeamMenu(); - } - else if( type == CGAME_EVENT_SCOREBOARD ) - { - - } } void CG_KeyEvent( int key, qboolean down ) { - if( !down) + if( !down ) return; if( cg.predictedPlayerState.pm_type == PM_NORMAL || @@ -1727,9 +1718,7 @@ void CG_KeyEvent( int key, qboolean down ) Display_HandleKey( key, down, cgs.cursorX, cgs.cursorY ); if( cgs.capturedItem ) - { cgs.capturedItem = NULL; - } else { if( key == K_MOUSE2 && down ) @@ -1763,11 +1752,11 @@ void CG_RunMenuScript( char **args ) } -void CG_GetTeamColor(vec4_t *color) +void CG_GetTeamColor( vec4_t *color ) { - (*color)[0] = (*color)[2] = 0.0f; - (*color)[1] = 0.17f; - (*color)[3] = 0.25f; + (*color)[ 0 ] = (*color)[ 2 ] = 0.0f; + (*color)[ 1 ] = 0.17f; + (*color)[ 3 ] = 0.25f; } //END TA UI @@ -1782,7 +1771,7 @@ static void CG_DrawLighting( void ) { centity_t *cent; - cent = &cg_entities[cg.snap->ps.clientNum]; + cent = &cg_entities[ cg.snap->ps.clientNum ]; //fade to black if stamina is low if( ( cg.snap->ps.stats[ STAT_STAMINA ] < -800 ) && @@ -1797,16 +1786,6 @@ static void CG_DrawLighting( void ) } /* -=========================================================================================== - - LOWER RIGHT CORNER - -=========================================================================================== -*/ - - - -/* =============================================================================== CENTER PRINTING @@ -2059,8 +2038,9 @@ CG_DrawVote */ static void CG_DrawVote( void ) { - char *s; - int sec; + char *s; + int sec; + vec4_t white = { 1.0f, 1.0f, 1.0f, 1.0f }; if( !cgs.voteTime ) return; @@ -2078,9 +2058,9 @@ static void CG_DrawVote( void ) sec = 0; s = va( "VOTE(%i):%s yes:%i no:%i", sec, cgs.voteString, cgs.voteYes, cgs.voteNo ); - CG_DrawSmallString( 0, 58, s, 1.0F ); + CG_Text_Paint( 0, 58, 0.3f, white, s, 0, 0, ITEM_TEXTSTYLE_NORMAL ); s = "or press ESC then click Vote"; - CG_DrawSmallString( 0, 58 + SMALLCHAR_HEIGHT + 2, s, 1.0F ); + CG_Text_Paint( 0, 78, 0.3f, white, s, 0, 0, ITEM_TEXTSTYLE_NORMAL ); } /* @@ -2090,8 +2070,9 @@ CG_DrawTeamVote */ static void CG_DrawTeamVote( void ) { - char *s; - int sec, cs_offset; + char *s; + int sec, cs_offset; + vec4_t white = { 1.0f, 1.0f, 1.0f, 1.0f }; if( cg.predictedPlayerState.stats[ STAT_PTEAM ] == PTE_HUMANS ) cs_offset = 0; @@ -2118,7 +2099,7 @@ static void CG_DrawTeamVote( void ) s = va( "TEAMVOTE(%i):%s yes:%i no:%i", sec, cgs.teamVoteString[ cs_offset ], cgs.teamVoteYes[cs_offset], cgs.teamVoteNo[ cs_offset ] ); - CG_DrawSmallString( 0, 90, s, 1.0F ); + CG_Text_Paint( 0, 90, 0.3f, white, s, 0, 0, ITEM_TEXTSTYLE_NORMAL ); } @@ -2180,67 +2161,6 @@ static void CG_DrawIntermission( void ) cg.scoreBoardShowing = CG_DrawScoreboard( ); } -/* -================= -CG_DrawFollow -================= -*/ -static qboolean CG_DrawFollow( void ) -{ - float x; - vec4_t color; - const char *name; - - if( !( cg.snap->ps.pm_flags & PMF_FOLLOW ) ) - return qfalse; - - color[ 0 ] = 1; - color[ 1 ] = 1; - color[ 2 ] = 1; - color[ 3 ] = 1; - - - CG_DrawBigString( 320 - 9 * 8, 24, "following", 1.0F ); - - name = cgs.clientinfo[ cg.snap->ps.clientNum ].name; - - x = 0.5 * ( 640 - GIANT_WIDTH * CG_DrawStrlen( name ) ); - - CG_DrawStringExt( x, 40, name, color, qtrue, qtrue, GIANT_WIDTH, GIANT_HEIGHT, 0 ); - - return qtrue; -} - - - -/* -================= -CG_DrawAmmoWarning -================= -*/ -static void CG_DrawAmmoWarning( void ) -{ - const char *s; - int w; - - if( cg.snap->ps.weapon == WP_NONE ) - return; - - if ( cg_drawAmmoWarning.integer == 0 ) - return; - - if ( !cg.lowAmmoWarning ) - return; - - if ( cg.lowAmmoWarning == 2 ) - s = "OUT OF AMMO"; - else - s = "LOW AMMO WARNING"; - - w = CG_DrawStrlen( s ) * BIGCHAR_WIDTH; - CG_DrawBigString( 320 - w / 2, 64, s, 1.0F ); -} - //================================================================================== #define SPECTATOR_STRING "SPECTATOR" @@ -2291,7 +2211,6 @@ static void CG_Draw2D( void ) if( cg_drawStatus.integer ) Menu_Paint( menu, qtrue ); - CG_DrawAmmoWarning( ); CG_DrawCrosshair( ); if( BG_gotItem( UP_HELMET, cg.snap->ps.stats ) ) diff --git a/src/cgame/cg_drawtools.c b/src/cgame/cg_drawtools.c index 6cc0b74f..31f7f2e3 100644 --- a/src/cgame/cg_drawtools.c +++ b/src/cgame/cg_drawtools.c @@ -75,7 +75,8 @@ CG_AdjustFrom640 Adjusted for resolution and screen aspect ratio ================ */ -void CG_AdjustFrom640( float *x, float *y, float *w, float *h ) { +void CG_AdjustFrom640( float *x, float *y, float *w, float *h ) +{ #if 0 // adjust for wide screens if ( cgs.glconfig.vidWidth * 480 > cgs.glconfig.vidHeight * 640 ) { @@ -96,7 +97,8 @@ CG_FillRect Coordinates are 640*480 virtual values ================= */ -void CG_FillRect( float x, float y, float width, float height, const float *color ) { +void CG_FillRect( float x, float y, float width, float height, const float *color ) +{ trap_R_SetColor( color ); CG_AdjustFrom640( &x, &y, &width, &height ); @@ -113,14 +115,16 @@ CG_DrawSides Coords are virtual 640x480 ================ */ -void CG_DrawSides(float x, float y, float w, float h, float size) { +void CG_DrawSides( float x, float y, float w, float h, float size ) +{ CG_AdjustFrom640( &x, &y, &w, &h ); size *= cgs.screenXScale; trap_R_DrawStretchPic( x, y, size, h, 0, 0, 0, 0, cgs.media.whiteShader ); trap_R_DrawStretchPic( x + w - size, y, size, h, 0, 0, 0, 0, cgs.media.whiteShader ); } -void CG_DrawTopBottom(float x, float y, float w, float h, float size) { +void CG_DrawTopBottom( float x, float y, float w, float h, float size ) +{ CG_AdjustFrom640( &x, &y, &w, &h ); size *= cgs.screenYScale; trap_R_DrawStretchPic( x, y, w, size, 0, 0, 0, 0, cgs.media.whiteShader ); @@ -135,11 +139,12 @@ CG_DrawRect Coordinates are 640*480 virtual values ================= */ -void CG_DrawRect( float x, float y, float width, float height, float size, const float *color ) { +void CG_DrawRect( float x, float y, float width, float height, float size, const float *color ) +{ trap_R_SetColor( color ); - CG_DrawTopBottom(x, y, width, height, size); - CG_DrawSides(x, y, width, height, size); + CG_DrawTopBottom( x, y, width, height, size ); + CG_DrawSides( x, y, width, height, size ); trap_R_SetColor( NULL ); } @@ -152,7 +157,8 @@ CG_DrawPic Coordinates are 640*480 virtual values ================= */ -void CG_DrawPic( float x, float y, float width, float height, qhandle_t hShader ) { +void CG_DrawPic( float x, float y, float width, float height, qhandle_t hShader ) +{ CG_AdjustFrom640( &x, &y, &width, &height ); trap_R_DrawStretchPic( x, y, width, height, 0, 0, 1, 1, hShader ); } @@ -166,7 +172,8 @@ CG_DrawFadePic Coordinates are 640*480 virtual values ================= */ -void CG_DrawFadePic( float x, float y, float width, float height, vec4_t fcolor, vec4_t tcolor, float amount, qhandle_t hShader ) +void CG_DrawFadePic( float x, float y, float width, float height, vec4_t fcolor, + vec4_t tcolor, float amount, qhandle_t hShader ) { vec4_t finalcolor; float inverse; @@ -175,143 +182,16 @@ void CG_DrawFadePic( float x, float y, float width, float height, vec4_t fcolor, CG_AdjustFrom640( &x, &y, &width, &height ); - finalcolor[0] = ( ( inverse * fcolor[0] ) + ( amount * tcolor[0] ) ) / 100; - finalcolor[1] = ( ( inverse * fcolor[1] ) + ( amount * tcolor[1] ) ) / 100; - finalcolor[2] = ( ( inverse * fcolor[2] ) + ( amount * tcolor[2] ) ) / 100; - finalcolor[3] = ( ( inverse * fcolor[3] ) + ( amount * tcolor[3] ) ) / 100; + finalcolor[ 0 ] = ( ( inverse * fcolor[ 0 ] ) + ( amount * tcolor[ 0 ] ) ) / 100; + finalcolor[ 1 ] = ( ( inverse * fcolor[ 1 ] ) + ( amount * tcolor[ 1 ] ) ) / 100; + finalcolor[ 2 ] = ( ( inverse * fcolor[ 2 ] ) + ( amount * tcolor[ 2 ] ) ) / 100; + finalcolor[ 3 ] = ( ( inverse * fcolor[ 3 ] ) + ( amount * tcolor[ 3 ] ) ) / 100; trap_R_SetColor( finalcolor ); trap_R_DrawStretchPic( x, y, width, height, 0, 0, 1, 1, hShader ); trap_R_SetColor( NULL ); } - -/* -=============== -CG_DrawChar - -Coordinates and size in 640*480 virtual screen size -=============== -*/ -void CG_DrawChar( int x, int y, int width, int height, int ch ) { - int row, col; - float frow, fcol; - float size; - float ax, ay, aw, ah; - - ch &= 255; - - if ( ch == ' ' ) { - return; - } - - ax = x; - ay = y; - aw = width; - ah = height; - CG_AdjustFrom640( &ax, &ay, &aw, &ah ); - - row = ch>>4; - col = ch&15; - - frow = row*0.0625; - fcol = col*0.0625; - size = 0.0625; - - trap_R_DrawStretchPic( ax, ay, aw, ah, - fcol, frow, - fcol + size, frow + size, - cgs.media.charsetShader ); -} - - -/* -================== -CG_DrawStringExt - -Draws a multi-colored string with a drop shadow, optionally forcing -to a fixed color. - -Coordinates are at 640 by 480 virtual resolution -================== -*/ -void CG_DrawStringExt( int x, int y, const char *string, const float *setColor, - qboolean forceColor, qboolean shadow, int charWidth, int charHeight, int maxChars ) { - vec4_t color; - const char *s; - int xx; - int cnt; - - if (maxChars <= 0) - maxChars = 32767; // do them all! - - // draw the drop shadow - if (shadow) { - color[0] = color[1] = color[2] = 0; - color[3] = setColor[3]; - trap_R_SetColor( color ); - s = string; - xx = x; - cnt = 0; - while ( *s && cnt < maxChars) { - if ( Q_IsColorString( s ) ) { - s += 2; - continue; - } - CG_DrawChar( xx + 2, y + 2, charWidth, charHeight, *s ); - cnt++; - xx += charWidth; - s++; - } - } - - // draw the colored text - s = string; - xx = x; - cnt = 0; - trap_R_SetColor( setColor ); - while ( *s && cnt < maxChars) { - if ( Q_IsColorString( s ) ) { - if ( !forceColor ) { - memcpy( color, g_color_table[ColorIndex(*(s+1))], sizeof( color ) ); - color[3] = setColor[3]; - trap_R_SetColor( color ); - } - s += 2; - continue; - } - CG_DrawChar( xx, y, charWidth, charHeight, *s ); - xx += charWidth; - cnt++; - s++; - } - trap_R_SetColor( NULL ); -} - -void CG_DrawBigString( int x, int y, const char *s, float alpha ) { - float color[4]; - - color[0] = color[1] = color[2] = 1.0; - color[3] = alpha; - CG_DrawStringExt( x, y, s, color, qfalse, qtrue, BIGCHAR_WIDTH, BIGCHAR_HEIGHT, 0 ); -} - -void CG_DrawBigStringColor( int x, int y, const char *s, vec4_t color ) { - CG_DrawStringExt( x, y, s, color, qtrue, qtrue, BIGCHAR_WIDTH, BIGCHAR_HEIGHT, 0 ); -} - -void CG_DrawSmallString( int x, int y, const char *s, float alpha ) { - float color[4]; - - color[0] = color[1] = color[2] = 1.0; - color[3] = alpha; - CG_DrawStringExt( x, y, s, color, qfalse, qfalse, SMALLCHAR_WIDTH, SMALLCHAR_HEIGHT, 0 ); -} - -void CG_DrawSmallStringColor( int x, int y, const char *s, vec4_t color ) { - CG_DrawStringExt( x, y, s, color, qtrue, qfalse, SMALLCHAR_WIDTH, SMALLCHAR_HEIGHT, 0 ); -} - /* ================= CG_DrawStrlen @@ -319,14 +199,17 @@ CG_DrawStrlen Returns character count, skiping color escape codes ================= */ -int CG_DrawStrlen( const char *str ) { - const char *s = str; - int count = 0; +int CG_DrawStrlen( const char *str ) +{ + const char *s = str; + int count = 0; - while ( *s ) { - if ( Q_IsColorString( s ) ) { + while( *s ) + { + if( Q_IsColorString( s ) ) s += 2; - } else { + else + { count++; s++; } @@ -343,13 +226,14 @@ This repeats a 64*64 tile graphic to fill the screen around a sized down refresh window. ============= */ -static void CG_TileClearBox( int x, int y, int w, int h, qhandle_t hShader ) { +static void CG_TileClearBox( int x, int y, int w, int h, qhandle_t hShader ) +{ float s1, t1, s2, t2; - s1 = x/64.0; - t1 = y/64.0; - s2 = (x+w)/64.0; - t2 = (y+h)/64.0; + s1 = x / 64.0; + t1 = y / 64.0; + s2 = ( x + w ) / 64.0; + t2 = ( y + h ) / 64.0; trap_R_DrawStretchPic( x, y, w, h, s1, t1, s2, t2, hShader ); } @@ -362,22 +246,22 @@ CG_TileClear Clear around a sized down screen ============== */ -void CG_TileClear( void ) { +void CG_TileClear( void ) +{ int top, bottom, left, right; int w, h; w = cgs.glconfig.vidWidth; h = cgs.glconfig.vidHeight; - if ( cg.refdef.x == 0 && cg.refdef.y == 0 && - cg.refdef.width == w && cg.refdef.height == h ) { + if( cg.refdef.x == 0 && cg.refdef.y == 0 && + cg.refdef.width == w && cg.refdef.height == h ) return; // full screen rendering - } top = cg.refdef.y; - bottom = top + cg.refdef.height-1; + bottom = top + cg.refdef.height - 1; left = cg.refdef.x; - right = left + cg.refdef.width-1; + right = left + cg.refdef.width - 1; // clear above view screen CG_TileClearBox( 0, 0, w, top, cgs.media.backTileShader ); @@ -399,27 +283,26 @@ void CG_TileClear( void ) { CG_FadeColor ================ */ -float *CG_FadeColor( int startMsec, int totalMsec ) { +float *CG_FadeColor( int startMsec, int totalMsec ) +{ static vec4_t color; int t; - if ( startMsec == 0 ) { + if( startMsec == 0 ) return NULL; - } t = cg.time - startMsec; - if ( t >= totalMsec ) { + if( t >= totalMsec ) return NULL; - } // fade out - if ( totalMsec - t < FADE_TIME ) { - color[3] = ( totalMsec - t ) * 1.0/FADE_TIME; - } else { - color[3] = 1.0; - } - color[0] = color[1] = color[2] = 1; + if( totalMsec - t < FADE_TIME ) + color[ 3 ] = ( totalMsec - t ) * 1.0 / FADE_TIME; + else + color[ 3 ] = 1.0; + + color[ 0 ] = color[ 1 ] = color[ 2 ] = 1; return color; } @@ -430,42 +313,45 @@ float *CG_FadeColor( int startMsec, int totalMsec ) { CG_GetColorForHealth ================= */ -void CG_GetColorForHealth( int health, int armor, vec4_t hcolor ) { +void CG_GetColorForHealth( int health, int armor, vec4_t hcolor ) +{ int count; int max; // calculate the total points of damage that can // be sustained at the current health / armor level - if ( health <= 0 ) { + if( health <= 0 ) + { VectorClear( hcolor ); // black - hcolor[3] = 1; + hcolor[ 3 ] = 1; return; } + count = armor; max = health * ARMOR_PROTECTION / ( 1.0 - ARMOR_PROTECTION ); - if ( max < count ) { + + if( max < count ) count = max; - } + health += count; // set the color based on health - hcolor[0] = 1.0; - hcolor[3] = 1.0; - if ( health >= 100 ) { - hcolor[2] = 1.0; - } else if ( health < 66 ) { - hcolor[2] = 0; - } else { - hcolor[2] = ( health - 66 ) / 33.0; - } - - if ( health > 60 ) { - hcolor[1] = 1.0; - } else if ( health < 30 ) { - hcolor[1] = 0; - } else { - hcolor[1] = ( health - 30 ) / 30.0; - } + hcolor[ 0 ] = 1.0; + hcolor[ 3 ] = 1.0; + + if( health >= 100 ) + hcolor[ 2 ] = 1.0; + else if( health < 66 ) + hcolor[ 2 ] = 0; + else + hcolor[ 2 ] = ( health - 66 ) / 33.0; + + if( health > 60 ) + hcolor[ 1 ] = 1.0; + else if( health < 30 ) + hcolor[ 1 ] = 0; + else + hcolor[ 1 ] = ( health - 30 ) / 30.0; } /* @@ -473,398 +359,7 @@ void CG_GetColorForHealth( int health, int armor, vec4_t hcolor ) { CG_ColorForHealth ================= */ -void CG_ColorForHealth( vec4_t hcolor ) { - - CG_GetColorForHealth( cg.snap->ps.stats[STAT_HEALTH], - 0, hcolor ); -} - -// bk001205 - code below duplicated in q3_ui/ui-atoms.c -// bk001205 - FIXME: does this belong in ui_shared.c? -// bk001205 - FIXME: HARD_LINKED flags not visible here -#ifndef Q3_STATIC // bk001205 - q_shared defines not visible here -/* -================= -UI_DrawProportionalString2 -================= -*/ -static int propMap[128][3] = { -{0, 0, -1}, {0, 0, -1}, {0, 0, -1}, {0, 0, -1}, {0, 0, -1}, {0, 0, -1}, {0, 0, -1}, {0, 0, -1}, -{0, 0, -1}, {0, 0, -1}, {0, 0, -1}, {0, 0, -1}, {0, 0, -1}, {0, 0, -1}, {0, 0, -1}, {0, 0, -1}, - -{0, 0, -1}, {0, 0, -1}, {0, 0, -1}, {0, 0, -1}, {0, 0, -1}, {0, 0, -1}, {0, 0, -1}, {0, 0, -1}, -{0, 0, -1}, {0, 0, -1}, {0, 0, -1}, {0, 0, -1}, {0, 0, -1}, {0, 0, -1}, {0, 0, -1}, {0, 0, -1}, - -{0, 0, PROP_SPACE_WIDTH}, // SPACE -{11, 122, 7}, // ! -{154, 181, 14}, // " -{55, 122, 17}, // # -{79, 122, 18}, // $ -{101, 122, 23}, // % -{153, 122, 18}, // & -{9, 93, 7}, // ' -{207, 122, 8}, // ( -{230, 122, 9}, // ) -{177, 122, 18}, // * -{30, 152, 18}, // + -{85, 181, 7}, // , -{34, 93, 11}, // - -{110, 181, 6}, // . -{130, 152, 14}, // / - -{22, 64, 17}, // 0 -{41, 64, 12}, // 1 -{58, 64, 17}, // 2 -{78, 64, 18}, // 3 -{98, 64, 19}, // 4 -{120, 64, 18}, // 5 -{141, 64, 18}, // 6 -{204, 64, 16}, // 7 -{162, 64, 17}, // 8 -{182, 64, 18}, // 9 -{59, 181, 7}, // : -{35,181, 7}, // ; -{203, 152, 14}, // < -{56, 93, 14}, // = -{228, 152, 14}, // > -{177, 181, 18}, // ? - -{28, 122, 22}, // @ -{5, 4, 18}, // A -{27, 4, 18}, // B -{48, 4, 18}, // C -{69, 4, 17}, // D -{90, 4, 13}, // E -{106, 4, 13}, // F -{121, 4, 18}, // G -{143, 4, 17}, // H -{164, 4, 8}, // I -{175, 4, 16}, // J -{195, 4, 18}, // K -{216, 4, 12}, // L -{230, 4, 23}, // M -{6, 34, 18}, // N -{27, 34, 18}, // O - -{48, 34, 18}, // P -{68, 34, 18}, // Q -{90, 34, 17}, // R -{110, 34, 18}, // S -{130, 34, 14}, // T -{146, 34, 18}, // U -{166, 34, 19}, // V -{185, 34, 29}, // W -{215, 34, 18}, // X -{234, 34, 18}, // Y -{5, 64, 14}, // Z -{60, 152, 7}, // [ -{106, 151, 13}, // '\' -{83, 152, 7}, // ] -{128, 122, 17}, // ^ -{4, 152, 21}, // _ - -{134, 181, 5}, // ' -{5, 4, 18}, // A -{27, 4, 18}, // B -{48, 4, 18}, // C -{69, 4, 17}, // D -{90, 4, 13}, // E -{106, 4, 13}, // F -{121, 4, 18}, // G -{143, 4, 17}, // H -{164, 4, 8}, // I -{175, 4, 16}, // J -{195, 4, 18}, // K -{216, 4, 12}, // L -{230, 4, 23}, // M -{6, 34, 18}, // N -{27, 34, 18}, // O - -{48, 34, 18}, // P -{68, 34, 18}, // Q -{90, 34, 17}, // R -{110, 34, 18}, // S -{130, 34, 14}, // T -{146, 34, 18}, // U -{166, 34, 19}, // V -{185, 34, 29}, // W -{215, 34, 18}, // X -{234, 34, 18}, // Y -{5, 64, 14}, // Z -{153, 152, 13}, // { -{11, 181, 5}, // | -{180, 152, 13}, // } -{79, 93, 17}, // ~ -{0, 0, -1} // DEL -}; - -static int propMapB[26][3] = { -{11, 12, 33}, -{49, 12, 31}, -{85, 12, 31}, -{120, 12, 30}, -{156, 12, 21}, -{183, 12, 21}, -{207, 12, 32}, - -{13, 55, 30}, -{49, 55, 13}, -{66, 55, 29}, -{101, 55, 31}, -{135, 55, 21}, -{158, 55, 40}, -{204, 55, 32}, - -{12, 97, 31}, -{48, 97, 31}, -{82, 97, 30}, -{118, 97, 30}, -{153, 97, 30}, -{185, 97, 25}, -{213, 97, 30}, - -{11, 139, 32}, -{42, 139, 51}, -{93, 139, 32}, -{126, 139, 31}, -{158, 139, 25}, -}; - -#define PROPB_GAP_WIDTH 4 -#define PROPB_SPACE_WIDTH 12 -#define PROPB_HEIGHT 36 - -/* -================= -UI_DrawBannerString -================= -*/ -static void UI_DrawBannerString2( int x, int y, const char* str, vec4_t color ) +void CG_ColorForHealth( vec4_t hcolor ) { - const char* s; - unsigned char ch; - float ax; - float ay; - float aw; - float ah; - float frow; - float fcol; - float fwidth; - float fheight; - - // draw the colored text - trap_R_SetColor( color ); - - ax = x * cgs.screenXScale + cgs.screenXBias; - ay = y * cgs.screenXScale; - - s = str; - while ( *s ) - { - ch = *s & 127; - if ( ch == ' ' ) { - ax += ((float)PROPB_SPACE_WIDTH + (float)PROPB_GAP_WIDTH)* cgs.screenXScale; - } - else if ( ch >= 'A' && ch <= 'Z' ) { - ch -= 'A'; - fcol = (float)propMapB[ch][0] / 256.0f; - frow = (float)propMapB[ch][1] / 256.0f; - fwidth = (float)propMapB[ch][2] / 256.0f; - fheight = (float)PROPB_HEIGHT / 256.0f; - aw = (float)propMapB[ch][2] * cgs.screenXScale; - ah = (float)PROPB_HEIGHT * cgs.screenXScale; - trap_R_DrawStretchPic( ax, ay, aw, ah, fcol, frow, fcol+fwidth, frow+fheight, cgs.media.charsetPropB ); - ax += (aw + (float)PROPB_GAP_WIDTH * cgs.screenXScale); - } - s++; - } - - trap_R_SetColor( NULL ); -} - -void UI_DrawBannerString( int x, int y, const char* str, int style, vec4_t color ) { - const char * s; - int ch; - int width; - vec4_t drawcolor; - - // find the width of the drawn text - s = str; - width = 0; - while ( *s ) { - ch = *s; - if ( ch == ' ' ) { - width += PROPB_SPACE_WIDTH; - } - else if ( ch >= 'A' && ch <= 'Z' ) { - width += propMapB[ch - 'A'][2] + PROPB_GAP_WIDTH; - } - s++; - } - width -= PROPB_GAP_WIDTH; - - switch( style & UI_FORMATMASK ) { - case UI_CENTER: - x -= width / 2; - break; - - case UI_RIGHT: - x -= width; - break; - - case UI_LEFT: - default: - break; - } - - if ( style & UI_DROPSHADOW ) { - drawcolor[0] = drawcolor[1] = drawcolor[2] = 0; - drawcolor[3] = color[3]; - UI_DrawBannerString2( x+2, y+2, str, drawcolor ); - } - - UI_DrawBannerString2( x, y, str, color ); -} - - -int UI_ProportionalStringWidth( const char* str ) { - const char * s; - int ch; - int charWidth; - int width; - - s = str; - width = 0; - while ( *s ) { - ch = *s & 127; - charWidth = propMap[ch][2]; - if ( charWidth != -1 ) { - width += charWidth; - width += PROP_GAP_WIDTH; - } - s++; - } - - width -= PROP_GAP_WIDTH; - return width; -} - -static void UI_DrawProportionalString2( int x, int y, const char* str, vec4_t color, float sizeScale, qhandle_t charset ) -{ - const char* s; - unsigned char ch; - float ax; - float ay; - float aw; - float ah; - float frow; - float fcol; - float fwidth; - float fheight; - - // draw the colored text - trap_R_SetColor( color ); - - ax = x * cgs.screenXScale + cgs.screenXBias; - ay = y * cgs.screenXScale; - - s = str; - while ( *s ) - { - ch = *s & 127; - if ( ch == ' ' ) { - aw = (float)PROP_SPACE_WIDTH * cgs.screenXScale * sizeScale; - } else if ( propMap[ch][2] != -1 ) { - fcol = (float)propMap[ch][0] / 256.0f; - frow = (float)propMap[ch][1] / 256.0f; - fwidth = (float)propMap[ch][2] / 256.0f; - fheight = (float)PROP_HEIGHT / 256.0f; - aw = (float)propMap[ch][2] * cgs.screenXScale * sizeScale; - ah = (float)PROP_HEIGHT * cgs.screenXScale * sizeScale; - trap_R_DrawStretchPic( ax, ay, aw, ah, fcol, frow, fcol+fwidth, frow+fheight, charset ); - } else { - aw = 0; - } - - ax += (aw + (float)PROP_GAP_WIDTH * cgs.screenXScale * sizeScale); - s++; - } - - trap_R_SetColor( NULL ); -} - -/* -================= -UI_ProportionalSizeScale -================= -*/ -float UI_ProportionalSizeScale( int style ) { - if( style & UI_SMALLFONT ) { - return 0.75; - } - - return 1.00; -} - - -/* -================= -UI_DrawProportionalString -================= -*/ -void UI_DrawProportionalString( int x, int y, const char* str, int style, vec4_t color ) { - vec4_t drawcolor; - int width; - float sizeScale; - - sizeScale = UI_ProportionalSizeScale( style ); - - switch( style & UI_FORMATMASK ) { - case UI_CENTER: - width = UI_ProportionalStringWidth( str ) * sizeScale; - x -= width / 2; - break; - - case UI_RIGHT: - width = UI_ProportionalStringWidth( str ) * sizeScale; - x -= width; - break; - - case UI_LEFT: - default: - break; - } - - if ( style & UI_DROPSHADOW ) { - drawcolor[0] = drawcolor[1] = drawcolor[2] = 0; - drawcolor[3] = color[3]; - UI_DrawProportionalString2( x+2, y+2, str, drawcolor, sizeScale, cgs.media.charsetProp ); - } - - if ( style & UI_INVERSE ) { - drawcolor[0] = color[0] * 0.8; - drawcolor[1] = color[1] * 0.8; - drawcolor[2] = color[2] * 0.8; - drawcolor[3] = color[3]; - UI_DrawProportionalString2( x, y, str, drawcolor, sizeScale, cgs.media.charsetProp ); - return; - } - - if ( style & UI_PULSE ) { - drawcolor[0] = color[0] * 0.8; - drawcolor[1] = color[1] * 0.8; - drawcolor[2] = color[2] * 0.8; - drawcolor[3] = color[3]; - UI_DrawProportionalString2( x, y, str, color, sizeScale, cgs.media.charsetProp ); - - drawcolor[0] = color[0]; - drawcolor[1] = color[1]; - drawcolor[2] = color[2]; - drawcolor[3] = 0.5 + 0.5 * sin( cg.time / PULSE_DIVISOR ); - UI_DrawProportionalString2( x, y, str, drawcolor, sizeScale, cgs.media.charsetPropGlow ); - return; - } - - UI_DrawProportionalString2( x, y, str, color, sizeScale, cgs.media.charsetProp ); + CG_GetColorForHealth( cg.snap->ps.stats[ STAT_HEALTH ], 0, hcolor ); } -#endif // Q3STATIC diff --git a/src/cgame/cg_ents.c b/src/cgame/cg_ents.c index f0e10574..c4b287aa 100644 --- a/src/cgame/cg_ents.c +++ b/src/cgame/cg_ents.c @@ -27,22 +27,22 @@ tag location ====================== */ void CG_PositionEntityOnTag( refEntity_t *entity, const refEntity_t *parent, - qhandle_t parentModel, char *tagName ) { - int i; + qhandle_t parentModel, char *tagName ) +{ + int i; orientation_t lerped; // lerp the tag trap_R_LerpTag( &lerped, parentModel, parent->oldframe, parent->frame, - 1.0 - parent->backlerp, tagName ); + 1.0 - parent->backlerp, tagName ); // FIXME: allow origin offsets along tag? VectorCopy( parent->origin, entity->origin ); - for ( i = 0 ; i < 3 ; i++ ) { - VectorMA( entity->origin, lerped.origin[i], parent->axis[i], entity->origin ); - } + for( i = 0; i < 3; i++ ) + VectorMA( entity->origin, lerped.origin[ i ], parent->axis[ i ], entity->origin ); // had to cast away the const to avoid compiler problems... - MatrixMultiply( lerped.axis, ((refEntity_t *)parent)->axis, entity->axis ); + MatrixMultiply( lerped.axis, ( (refEntity_t *)parent )->axis, entity->axis ); entity->backlerp = parent->backlerp; } @@ -56,25 +56,25 @@ tag location ====================== */ void CG_PositionRotatedEntityOnTag( refEntity_t *entity, const refEntity_t *parent, - qhandle_t parentModel, char *tagName ) { - int i; + qhandle_t parentModel, char *tagName ) +{ + int i; orientation_t lerped; - vec3_t tempAxis[3]; + vec3_t tempAxis[ 3 ]; //AxisClear( entity->axis ); // lerp the tag trap_R_LerpTag( &lerped, parentModel, parent->oldframe, parent->frame, - 1.0 - parent->backlerp, tagName ); + 1.0 - parent->backlerp, tagName ); // FIXME: allow origin offsets along tag? VectorCopy( parent->origin, entity->origin ); - for ( i = 0 ; i < 3 ; i++ ) { - VectorMA( entity->origin, lerped.origin[i], parent->axis[i], entity->origin ); - } + for( i = 0; i < 3; i++ ) + VectorMA( entity->origin, lerped.origin[ i ], parent->axis[ i ], entity->origin ); // had to cast away the const to avoid compiler problems... MatrixMultiply( entity->axis, lerped.axis, tempAxis ); - MatrixMultiply( tempAxis, ((refEntity_t *)parent)->axis, entity->axis ); + MatrixMultiply( tempAxis, ( (refEntity_t *)parent )->axis, entity->axis ); } @@ -94,17 +94,19 @@ CG_SetEntitySoundPosition Also called by event processing code ====================== */ -void CG_SetEntitySoundPosition( centity_t *cent ) { - if ( cent->currentState.solid == SOLID_BMODEL ) { +void CG_SetEntitySoundPosition( centity_t *cent ) +{ + if( cent->currentState.solid == SOLID_BMODEL ) + { vec3_t origin; - float *v; + float *v; v = cgs.inlineModelMidpoints[ cent->currentState.modelindex ]; VectorAdd( cent->lerpOrigin, v, origin ); trap_S_UpdateEntityPosition( cent->currentState.number, origin ); - } else { - trap_S_UpdateEntityPosition( cent->currentState.number, cent->lerpOrigin ); } + else + trap_S_UpdateEntityPosition( cent->currentState.number, cent->lerpOrigin ); } /* @@ -114,19 +116,23 @@ CG_EntityEffects Add continuous entity effects, like local entity emission and lighting ================== */ -static void CG_EntityEffects( centity_t *cent ) { - +static void CG_EntityEffects( centity_t *cent ) +{ // update sound origins CG_SetEntitySoundPosition( cent ); // add loop sound - if ( cent->currentState.loopSound ) { - if (cent->currentState.eType != ET_SPEAKER) { + if( cent->currentState.loopSound ) + { + if( cent->currentState.eType != ET_SPEAKER ) + { trap_S_AddLoopingSound( cent->currentState.number, cent->lerpOrigin, vec3_origin, - cgs.gameSounds[ cent->currentState.loopSound ] ); - } else { + cgs.gameSounds[ cent->currentState.loopSound ] ); + } + else + { trap_S_AddRealLoopingSound( cent->currentState.number, cent->lerpOrigin, vec3_origin, - cgs.gameSounds[ cent->currentState.loopSound ] ); + cgs.gameSounds[ cent->currentState.loopSound ] ); } } @@ -153,18 +159,18 @@ static void CG_EntityEffects( centity_t *cent ) { CG_General ================== */ -static void CG_General( centity_t *cent ) { +static void CG_General( centity_t *cent ) +{ refEntity_t ent; entityState_t *s1; s1 = ¢->currentState; // if set to invisible, skip - if (!s1->modelindex) { + if( !s1->modelindex ) return; - } - memset (&ent, 0, sizeof(ent)); + memset( &ent, 0, sizeof( ent ) ); // set frame @@ -175,18 +181,17 @@ static void CG_General( centity_t *cent ) { VectorCopy( cent->lerpOrigin, ent.origin); VectorCopy( cent->lerpOrigin, ent.oldorigin); - ent.hModel = cgs.gameModels[s1->modelindex]; + ent.hModel = cgs.gameModels[ s1->modelindex ]; // player model - if (s1->number == cg.snap->ps.clientNum) { + if( s1->number == cg.snap->ps.clientNum ) ent.renderfx |= RF_THIRD_PERSON; // only draw from mirrors - } // convert angles to axis AnglesToAxis( cent->lerpAngles, ent.axis ); // add to refresh list - trap_R_AddRefEntityToScene (&ent); + trap_R_AddRefEntityToScene( &ent ); } /* @@ -196,20 +201,21 @@ CG_Speaker Speaker entities can automatically play sounds ================== */ -static void CG_Speaker( centity_t *cent ) { - if ( ! cent->currentState.clientNum ) { // FIXME: use something other than clientNum... +static void CG_Speaker( centity_t *cent ) +{ + if( ! cent->currentState.clientNum ) + { // FIXME: use something other than clientNum... return; // not auto triggering } - if ( cg.time < cent->miscTime ) { + if( cg.time < cent->miscTime ) return; - } - trap_S_StartSound (NULL, cent->currentState.number, CHAN_ITEM, cgs.gameSounds[cent->currentState.eventParm] ); + trap_S_StartSound( NULL, cent->currentState.number, CHAN_ITEM, cgs.gameSounds[ cent->currentState.eventParm ] ); // ent->s.frame = ent->wait * 10; // ent->s.clientNum = ent->random * 10; - cent->miscTime = cg.time + cent->currentState.frame * 100 + cent->currentState.clientNum * 100 * crandom(); + cent->miscTime = cg.time + cent->currentState.frame * 100 + cent->currentState.clientNum * 100 * crandom( ); } @@ -230,55 +236,42 @@ static void CG_Missile( centity_t *cent ) int index; s1 = ¢->currentState; - if ( s1->weapon > WP_NUM_WEAPONS ) { + if( s1->weapon > WP_NUM_WEAPONS ) s1->weapon = 0; - } - weapon = &cg_weapons[s1->weapon]; + + weapon = &cg_weapons[ s1->weapon ]; // calculate the axis - VectorCopy( s1->angles, cent->lerpAngles); + VectorCopy( s1->angles, cent->lerpAngles ); // add trails - if ( weapon->missileTrailFunc ) - { + if( weapon->missileTrailFunc ) weapon->missileTrailFunc( cent, weapon ); - } // add dynamic light - if ( weapon->missileDlight ) { - trap_R_AddLightToScene(cent->lerpOrigin, weapon->missileDlight, - weapon->missileDlightColor[0], weapon->missileDlightColor[1], weapon->missileDlightColor[2] ); + if( weapon->missileDlight ) + { + trap_R_AddLightToScene( cent->lerpOrigin, weapon->missileDlight, + weapon->missileDlightColor[ 0 ], weapon->missileDlightColor[ 1 ], weapon->missileDlightColor[ 2 ] ); } // add missile sound - if ( weapon->missileSound ) { + if( weapon->missileSound ) + { vec3_t velocity; BG_EvaluateTrajectoryDelta( ¢->currentState.pos, cg.time, velocity ); - //TA: FIXME: hack until i figure out why trap_S_ALS has a problem with velocity` - if( s1->weapon == WP_PLASMAGUN ) - VectorClear( velocity ); - trap_S_AddLoopingSound( cent->currentState.number, cent->lerpOrigin, velocity, weapon->missileSound ); } // create the render entity - memset (&ent, 0, sizeof(ent)); - VectorCopy( cent->lerpOrigin, ent.origin); - VectorCopy( cent->lerpOrigin, ent.oldorigin); + memset( &ent, 0, sizeof( ent ) ); + VectorCopy( cent->lerpOrigin, ent.origin ); + VectorCopy( cent->lerpOrigin, ent.oldorigin ); switch( cent->currentState.weapon ) { - case WP_PLASMAGUN: - ent.reType = RT_SPRITE; - ent.radius = 16; - ent.rotation = 0; - ent.customShader = cgs.media.plasmaBallShader; - trap_R_AddRefEntityToScene( &ent ); - return; - break; - case WP_PULSE_RIFLE: ent.reType = RT_SPRITE; ent.radius = 4; @@ -335,66 +328,18 @@ static void CG_Missile( centity_t *cent ) /* =============== -CG_Grapple - -This is called when the grapple is sitting up against the wall -=============== -*/ -static void CG_Grapple( centity_t *cent ) { - refEntity_t ent; - entityState_t *s1; - const weaponInfo_t *weapon; - - s1 = ¢->currentState; - if ( s1->weapon > WP_NUM_WEAPONS ) { - s1->weapon = 0; - } - weapon = &cg_weapons[s1->weapon]; - - // calculate the axis - VectorCopy( s1->angles, cent->lerpAngles); - -#if 0 // FIXME add grapple pull sound here..? - // add missile sound - if ( weapon->missileSound ) { - trap_S_AddLoopingSound( cent->currentState.number, cent->lerpOrigin, vec3_origin, weapon->missileSound ); - } -#endif - - // Will draw cable if needed - CG_GrappleTrail ( cent, weapon ); - - // create the render entity - memset (&ent, 0, sizeof(ent)); - VectorCopy( cent->lerpOrigin, ent.origin); - VectorCopy( cent->lerpOrigin, ent.oldorigin); - - // flicker between two skins - ent.skinNum = cg.clientFrame & 1; - ent.hModel = weapon->missileModel; - ent.renderfx = weapon->missileRenderfx | RF_NOSHADOW; - - // convert direction of travel into axis - if ( VectorNormalize2( s1->pos.trDelta, ent.axis[0] ) == 0 ) { - ent.axis[0][2] = 1; - } - - trap_R_AddRefEntityToScene( &ent ); -} - -/* -=============== CG_Mover =============== */ -static void CG_Mover( centity_t *cent ) { +static void CG_Mover( centity_t *cent ) +{ refEntity_t ent; entityState_t *s1; s1 = ¢->currentState; // create the render entity - memset (&ent, 0, sizeof(ent)); + memset( &ent, 0, sizeof( ent ) ); VectorCopy( cent->lerpOrigin, ent.origin); VectorCopy( cent->lerpOrigin, ent.oldorigin); AnglesToAxis( cent->lerpAngles, ent.axis ); @@ -405,20 +350,20 @@ static void CG_Mover( centity_t *cent ) { ent.skinNum = ( cg.time >> 6 ) & 1; // get the model, either as a bmodel or a modelindex - if ( s1->solid == SOLID_BMODEL ) { - ent.hModel = cgs.inlineDrawModel[s1->modelindex]; - } else { - ent.hModel = cgs.gameModels[s1->modelindex]; - } + if( s1->solid == SOLID_BMODEL ) + ent.hModel = cgs.inlineDrawModel[ s1->modelindex ]; + else + ent.hModel = cgs.gameModels[ s1->modelindex ]; // add to refresh list - trap_R_AddRefEntityToScene(&ent); + trap_R_AddRefEntityToScene( &ent ); // add the secondary model - if ( s1->modelindex2 ) { + if( s1->modelindex2 ) + { ent.skinNum = 0; - ent.hModel = cgs.gameModels[s1->modelindex2]; - trap_R_AddRefEntityToScene(&ent); + ent.hModel = cgs.gameModels[ s1->modelindex2 ]; + trap_R_AddRefEntityToScene( &ent ); } } @@ -430,14 +375,15 @@ CG_Beam Also called as an event =============== */ -void CG_Beam( centity_t *cent ) { +void CG_Beam( centity_t *cent ) +{ refEntity_t ent; entityState_t *s1; s1 = ¢->currentState; // create the render entity - memset (&ent, 0, sizeof(ent)); + memset( &ent, 0, sizeof( ent ) ); VectorCopy( s1->pos.trBase, ent.origin ); VectorCopy( s1->origin2, ent.oldorigin ); AxisClear( ent.axis ); @@ -446,7 +392,7 @@ void CG_Beam( centity_t *cent ) { ent.renderfx = RF_NOSHADOW; // add to refresh list - trap_R_AddRefEntityToScene(&ent); + trap_R_AddRefEntityToScene( &ent ); } @@ -455,31 +401,32 @@ void CG_Beam( centity_t *cent ) { CG_Portal =============== */ -static void CG_Portal( centity_t *cent ) { +static void CG_Portal( centity_t *cent ) +{ refEntity_t ent; entityState_t *s1; s1 = ¢->currentState; // create the render entity - memset (&ent, 0, sizeof(ent)); + memset( &ent, 0, sizeof( ent ) ); VectorCopy( cent->lerpOrigin, ent.origin ); VectorCopy( s1->origin2, ent.oldorigin ); - ByteToDir( s1->eventParm, ent.axis[0] ); - PerpendicularVector( ent.axis[1], ent.axis[0] ); + ByteToDir( s1->eventParm, ent.axis[ 0 ] ); + PerpendicularVector( ent.axis[ 1 ], ent.axis[ 0 ] ); // negating this tends to get the directions like they want // we really should have a camera roll value - VectorSubtract( vec3_origin, ent.axis[1], ent.axis[1] ); + VectorSubtract( vec3_origin, ent.axis[ 1 ], ent.axis[ 1 ] ); - CrossProduct( ent.axis[0], ent.axis[1], ent.axis[2] ); + CrossProduct( ent.axis[ 0 ], ent.axis[ 1 ], ent.axis[ 2 ] ); ent.reType = RT_PORTALSURFACE; ent.oldframe = s1->powerups; ent.frame = s1->frame; // rotation speed - ent.skinNum = s1->clientNum/256.0 * 360; // roll offset + ent.skinNum = s1->clientNum / 256.0 * 360; // roll offset // add to refresh list - trap_R_AddRefEntityToScene(&ent); + trap_R_AddRefEntityToScene( &ent ); } //============================================================================ @@ -548,18 +495,22 @@ CG_AdjustPositionForMover Also called by client movement prediction code ========================= */ -void CG_AdjustPositionForMover( const vec3_t in, int moverNum, int fromTime, int toTime, vec3_t out ) { +void CG_AdjustPositionForMover( const vec3_t in, int moverNum, int fromTime, int toTime, vec3_t out ) +{ centity_t *cent; - vec3_t oldOrigin, origin, deltaOrigin; - vec3_t oldAngles, angles, deltaAngles; + vec3_t oldOrigin, origin, deltaOrigin; + vec3_t oldAngles, angles, deltaAngles; - if ( moverNum <= 0 || moverNum >= ENTITYNUM_MAX_NORMAL ) { + if( moverNum <= 0 || moverNum >= ENTITYNUM_MAX_NORMAL ) + { VectorCopy( in, out ); return; } cent = &cg_entities[ moverNum ]; - if ( cent->currentState.eType != ET_MOVER ) { + + if( cent->currentState.eType != ET_MOVER ) + { VectorCopy( in, out ); return; } @@ -584,15 +535,15 @@ void CG_AdjustPositionForMover( const vec3_t in, int moverNum, int fromTime, int CG_InterpolateEntityPosition ============================= */ -static void CG_InterpolateEntityPosition( centity_t *cent ) { +static void CG_InterpolateEntityPosition( centity_t *cent ) +{ vec3_t current, next; - float f; + float f; // it would be an internal error to find an entity that interpolates without // a snapshot ahead of the current one - if ( cg.nextSnap == NULL ) { + if( cg.nextSnap == NULL ) CG_Error( "CG_InterpoateEntityPosition: cg.nextSnap == NULL" ); - } f = cg.frameInterpolation; @@ -601,16 +552,16 @@ static void CG_InterpolateEntityPosition( centity_t *cent ) { BG_EvaluateTrajectory( ¢->currentState.pos, cg.snap->serverTime, current ); BG_EvaluateTrajectory( ¢->nextState.pos, cg.nextSnap->serverTime, next ); - cent->lerpOrigin[0] = current[0] + f * ( next[0] - current[0] ); - cent->lerpOrigin[1] = current[1] + f * ( next[1] - current[1] ); - cent->lerpOrigin[2] = current[2] + f * ( next[2] - current[2] ); + cent->lerpOrigin[ 0 ] = current[ 0 ] + f * ( next[ 0 ] - current[ 0 ] ); + cent->lerpOrigin[ 1 ] = current[ 1 ] + f * ( next[ 1 ] - current[ 1 ] ); + cent->lerpOrigin[ 2 ] = current[ 2 ] + f * ( next[ 2 ] - current[ 2 ] ); BG_EvaluateTrajectory( ¢->currentState.apos, cg.snap->serverTime, current ); BG_EvaluateTrajectory( ¢->nextState.apos, cg.nextSnap->serverTime, next ); - cent->lerpAngles[0] = LerpAngle( current[0], next[0], f ); - cent->lerpAngles[1] = LerpAngle( current[1], next[1], f ); - cent->lerpAngles[2] = LerpAngle( current[2], next[2], f ); + cent->lerpAngles[ 0 ] = LerpAngle( current[ 0 ], next[ 0 ], f ); + cent->lerpAngles[ 1 ] = LerpAngle( current[ 1 ], next[ 1 ], f ); + cent->lerpAngles[ 2 ] = LerpAngle( current[ 2 ], next[ 2 ], f ); } @@ -620,25 +571,30 @@ CG_CalcEntityLerpPositions =============== */ -static void CG_CalcEntityLerpPositions( centity_t *cent ) { +static void CG_CalcEntityLerpPositions( centity_t *cent ) +{ // if this player does not want to see extrapolated players - if ( !cg_smoothClients.integer ) { + if( !cg_smoothClients.integer ) + { // make sure the clients use TR_INTERPOLATE - if ( cent->currentState.number < MAX_CLIENTS ) { + if( cent->currentState.number < MAX_CLIENTS ) + { cent->currentState.pos.trType = TR_INTERPOLATE; cent->nextState.pos.trType = TR_INTERPOLATE; } } - if ( cent->interpolate && cent->currentState.pos.trType == TR_INTERPOLATE ) { + if( cent->interpolate && cent->currentState.pos.trType == TR_INTERPOLATE ) + { CG_InterpolateEntityPosition( cent ); return; } // first see if we can interpolate between two snaps for // linear extrapolated clients - if ( cent->interpolate && cent->currentState.pos.trType == TR_LINEAR_STOP && - cent->currentState.number < MAX_CLIENTS) { + if( cent->interpolate && cent->currentState.pos.trType == TR_LINEAR_STOP && + cent->currentState.number < MAX_CLIENTS ) + { CG_InterpolateEntityPosition( cent ); return; } @@ -649,9 +605,10 @@ static void CG_CalcEntityLerpPositions( centity_t *cent ) { // adjust for riding a mover if it wasn't rolled into the predicted // player state - if ( cent != &cg.predictedPlayerEntity ) { + if( cent != &cg.predictedPlayerEntity ) + { CG_AdjustPositionForMover( cent->lerpOrigin, cent->currentState.groundEntityNum, - cg.snap->serverTime, cg.time, cent->lerpOrigin ); + cg.snap->serverTime, cg.time, cent->lerpOrigin ); } } @@ -663,11 +620,11 @@ CG_AddCEntity =============== */ -static void CG_AddCEntity( centity_t *cent ) { +static void CG_AddCEntity( centity_t *cent ) +{ // event-only entities will have been dealt with already - if ( cent->currentState.eType >= ET_EVENTS ) { + if( cent->currentState.eType >= ET_EVENTS ) return; - } // calculate the current origin CG_CalcEntityLerpPositions( cent ); @@ -675,53 +632,64 @@ static void CG_AddCEntity( centity_t *cent ) { // add automatic effects CG_EntityEffects( cent ); - switch ( cent->currentState.eType ) { - default: - CG_Error( "Bad entity type: %i\n", cent->currentState.eType ); - break; - case ET_INVISIBLE: - case ET_PUSH_TRIGGER: - case ET_TELEPORT_TRIGGER: - break; - case ET_GENERAL: - CG_General( cent ); - break; - case ET_CORPSE: - CG_Corpse( cent ); - break; - case ET_PLAYER: - CG_Player( cent ); - break; - case ET_BUILDABLE: - CG_Buildable( cent ); - break; - case ET_MISSILE: - CG_Missile( cent ); - break; - case ET_MOVER: - CG_Mover( cent ); - break; - case ET_BEAM: - CG_Beam( cent ); - break; - case ET_PORTAL: - CG_Portal( cent ); - break; - case ET_SPEAKER: - CG_Speaker( cent ); - break; - case ET_GRAPPLE: - CG_Grapple( cent ); - break; - case ET_SPRITER: - CG_Spriter( cent ); - break; - case ET_ANIMMAPOBJ: - CG_animMapObj( cent ); - break; - case ET_LIGHTFLARE: - CG_LightFlare( cent ); - break; + switch( cent->currentState.eType ) + { + default: + CG_Error( "Bad entity type: %i\n", cent->currentState.eType ); + break; + + case ET_INVISIBLE: + case ET_PUSH_TRIGGER: + case ET_TELEPORT_TRIGGER: + break; + + case ET_GENERAL: + CG_General( cent ); + break; + + case ET_CORPSE: + CG_Corpse( cent ); + break; + + case ET_PLAYER: + CG_Player( cent ); + break; + + case ET_BUILDABLE: + CG_Buildable( cent ); + break; + + case ET_MISSILE: + CG_Missile( cent ); + break; + + case ET_MOVER: + CG_Mover( cent ); + break; + + case ET_BEAM: + CG_Beam( cent ); + break; + + case ET_PORTAL: + CG_Portal( cent ); + break; + + case ET_SPEAKER: + CG_Speaker( cent ); + break; + + case ET_SPRITER: + CG_Spriter( cent ); + break; + + case ET_ANIMMAPOBJ: + CG_animMapObj( cent ); + break; + + case ET_LIGHTFLARE: + CG_LightFlare( cent ); + break; } } @@ -731,34 +699,38 @@ CG_AddPacketEntities =============== */ -void CG_AddPacketEntities( void ) { - int num; - centity_t *cent; +void CG_AddPacketEntities( void ) +{ + int num; + centity_t *cent; playerState_t *ps; // set cg.frameInterpolation - if ( cg.nextSnap ) { + if( cg.nextSnap ) + { int delta; - delta = (cg.nextSnap->serverTime - cg.snap->serverTime); - if ( delta == 0 ) { + delta = ( cg.nextSnap->serverTime - cg.snap->serverTime ); + + if( delta == 0 ) cg.frameInterpolation = 0; - } else { + else cg.frameInterpolation = (float)( cg.time - cg.snap->serverTime ) / delta; - } - } else { + } + else + { cg.frameInterpolation = 0; // actually, it should never be used, because // no entities should be marked as interpolating } // the auto-rotating items will all have the same axis - cg.autoAngles[0] = 0; - cg.autoAngles[1] = ( cg.time & 2047 ) * 360 / 2048.0; - cg.autoAngles[2] = 0; + cg.autoAngles[ 0 ] = 0; + cg.autoAngles[ 1 ] = ( cg.time & 2047 ) * 360 / 2048.0; + cg.autoAngles[ 2 ] = 0; - cg.autoAnglesFast[0] = 0; - cg.autoAnglesFast[1] = ( cg.time & 1023 ) * 360 / 1024.0f; - cg.autoAnglesFast[2] = 0; + cg.autoAnglesFast[ 0 ] = 0; + cg.autoAnglesFast[ 1 ] = ( cg.time & 1023 ) * 360 / 1024.0f; + cg.autoAnglesFast[ 2 ] = 0; AnglesToAxis( cg.autoAngles, cg.autoAxis ); AnglesToAxis( cg.autoAnglesFast, cg.autoAxisFast ); diff --git a/src/cgame/cg_event.c b/src/cgame/cg_event.c index b8c5e44c..98337c45 100644 --- a/src/cgame/cg_event.c +++ b/src/cgame/cg_event.c @@ -17,271 +17,239 @@ #include "cg_local.h" -// for the voice chats -#include "../../ui/menudef.h" - -//========================================================================== - -/* -=================== -CG_PlaceString - -Also called by scoreboard drawing -=================== -*/ -const char *CG_PlaceString( int rank ) { - static char str[64]; - char *s, *t; - - if ( rank & RANK_TIED_FLAG ) { - rank &= ~RANK_TIED_FLAG; - t = "Tied for "; - } else { - t = ""; - } - - if ( rank == 1 ) { - s = S_COLOR_BLUE "1st" S_COLOR_WHITE; // draw in blue - } else if ( rank == 2 ) { - s = S_COLOR_RED "2nd" S_COLOR_WHITE; // draw in red - } else if ( rank == 3 ) { - s = S_COLOR_YELLOW "3rd" S_COLOR_WHITE; // draw in yellow - } else if ( rank == 11 ) { - s = "11th"; - } else if ( rank == 12 ) { - s = "12th"; - } else if ( rank == 13 ) { - s = "13th"; - } else if ( rank % 10 == 1 ) { - s = va("%ist", rank); - } else if ( rank % 10 == 2 ) { - s = va("%ind", rank); - } else if ( rank % 10 == 3 ) { - s = va("%ird", rank); - } else { - s = va("%ith", rank); - } - - Com_sprintf( str, sizeof( str ), "%s%s", t, s ); - return str; -} - /* ============= CG_Obituary ============= */ -static void CG_Obituary( entityState_t *ent ) { - int mod; - int target, attacker; - char *message; - char *message2; - const char *targetInfo; - const char *attackerInfo; - char targetName[32]; - char attackerName[32]; - gender_t gender; +static void CG_Obituary( entityState_t *ent ) +{ + int mod; + int target, attacker; + char *message; + char *message2; + const char *targetInfo; + const char *attackerInfo; + char targetName[ 32 ]; + char attackerName[ 32 ]; + gender_t gender; clientInfo_t *ci; target = ent->otherEntityNum; attacker = ent->otherEntityNum2; mod = ent->eventParm; - if ( target < 0 || target >= MAX_CLIENTS ) { + if( target < 0 || target >= MAX_CLIENTS ) CG_Error( "CG_Obituary: target out of range" ); - } - ci = &cgs.clientinfo[target]; + + ci = &cgs.clientinfo[ target ]; - if ( attacker < 0 || attacker >= MAX_CLIENTS ) { + if( attacker < 0 || attacker >= MAX_CLIENTS ) + { attacker = ENTITYNUM_WORLD; attackerInfo = NULL; - } else { - attackerInfo = CG_ConfigString( CS_PLAYERS + attacker ); } + else + attackerInfo = CG_ConfigString( CS_PLAYERS + attacker ); targetInfo = CG_ConfigString( CS_PLAYERS + target ); - if ( !targetInfo ) { + + if( !targetInfo ) return; - } - Q_strncpyz( targetName, Info_ValueForKey( targetInfo, "n" ), sizeof(targetName) - 2); + + Q_strncpyz( targetName, Info_ValueForKey( targetInfo, "n" ), sizeof( targetName ) - 2); strcat( targetName, S_COLOR_WHITE ); message2 = ""; // check for single client messages - switch( mod ) { - case MOD_SUICIDE: - message = "suicides"; - break; - case MOD_FALLING: - message = "cratered"; - break; - case MOD_CRUSH: - message = "was squished"; - break; - case MOD_WATER: - message = "sank like a rock"; - break; - case MOD_SLIME: - message = "melted"; - break; - case MOD_LAVA: - message = "does a back flip into the lava"; - break; - case MOD_TARGET_LASER: - message = "saw the light"; - break; - case MOD_TRIGGER_HURT: - message = "was in the wrong place"; - break; - case MOD_HSPAWN: - message = "should have run further"; - break; - case MOD_ASPAWN: - message = "was melted by the acid blood"; - break; - default: - message = NULL; - break; - } - - if (attacker == target) { - gender = ci->gender; - switch (mod) { - case MOD_GRENADE_SPLASH: - if ( gender == GENDER_FEMALE ) - message = "tripped on her own grenade"; - else if ( gender == GENDER_NEUTER ) - message = "tripped on its own grenade"; - else - message = "tripped on his own grenade"; + switch( mod ) + { + case MOD_SUICIDE: + message = "suicides"; break; - case MOD_ROCKET_SPLASH: - if ( gender == GENDER_FEMALE ) - message = "blew herself up"; - else if ( gender == GENDER_NEUTER ) - message = "blew itself up"; - else - message = "blew himself up"; + case MOD_FALLING: + message = "cratered"; break; - case MOD_FLAMER_SPLASH: - if ( gender == GENDER_FEMALE ) - message = "toasted herself"; - else if ( gender == GENDER_NEUTER ) - message = "toasted itself"; - else - message = "toasted himself"; + case MOD_CRUSH: + message = "was squished"; + break; + case MOD_WATER: + message = "sank like a rock"; + break; + case MOD_SLIME: + message = "melted"; + break; + case MOD_LAVA: + message = "does a back flip into the lava"; + break; + case MOD_TARGET_LASER: + message = "saw the light"; + break; + case MOD_TRIGGER_HURT: + message = "was in the wrong place"; break; - case MOD_BFG_SPLASH: - message = "should have used a smaller gun"; + case MOD_HSPAWN: + message = "should have run further"; + break; + case MOD_ASPAWN: + message = "was melted by the acid blood"; break; default: - if ( gender == GENDER_FEMALE ) - message = "killed herself"; - else if ( gender == GENDER_NEUTER ) - message = "killed itself"; - else - message = "killed himself"; + message = NULL; break; + } + + if( attacker == target ) + { + gender = ci->gender; + switch( mod ) + { + case MOD_GRENADE_SPLASH: + if( gender == GENDER_FEMALE ) + message = "tripped on her own grenade"; + else if( gender == GENDER_NEUTER ) + message = "tripped on its own grenade"; + else + message = "tripped on his own grenade"; + break; + + case MOD_ROCKET_SPLASH: + if( gender == GENDER_FEMALE ) + message = "blew herself up"; + else if( gender == GENDER_NEUTER ) + message = "blew itself up"; + else + message = "blew himself up"; + break; + + case MOD_FLAMER_SPLASH: + if( gender == GENDER_FEMALE ) + message = "toasted herself"; + else if( gender == GENDER_NEUTER ) + message = "toasted itself"; + else + message = "toasted himself"; + break; + + case MOD_BFG_SPLASH: + message = "should have used a smaller gun"; + break; + + default: + if( gender == GENDER_FEMALE ) + message = "killed herself"; + else if( gender == GENDER_NEUTER ) + message = "killed itself"; + else + message = "killed himself"; + break; } } - if (message) { - CG_Printf( "%s %s.\n", targetName, message); + if( message ) + { + CG_Printf( "%s %s.\n", targetName, message ); return; } // check for kill messages from the current clientNum - if ( attacker == cg.snap->ps.clientNum ) { + if( attacker == cg.snap->ps.clientNum ) + { char *s; - s = va("You fragged %s", targetName ); + s = va( "You fragged %s", targetName ); CG_CenterPrint( s, SCREEN_HEIGHT * 0.30, BIGCHAR_WIDTH ); // print the text message as well } // check for double client messages - if ( !attackerInfo ) { + if( !attackerInfo ) + { attacker = ENTITYNUM_WORLD; strcpy( attackerName, "noname" ); - } else { - Q_strncpyz( attackerName, Info_ValueForKey( attackerInfo, "n" ), sizeof(attackerName) - 2); + } + else + { + Q_strncpyz( attackerName, Info_ValueForKey( attackerInfo, "n" ), sizeof( attackerName ) - 2); strcat( attackerName, S_COLOR_WHITE ); // check for kill messages about the current clientNum - if ( target == cg.snap->ps.clientNum ) { + if( target == cg.snap->ps.clientNum ) Q_strncpyz( cg.killerName, attackerName, sizeof( cg.killerName ) ); - } } - if ( attacker != ENTITYNUM_WORLD ) { - switch (mod) { - case MOD_GRAPPLE: - message = "was caught by"; - break; - case MOD_GAUNTLET: - message = "was pummeled by"; - break; - case MOD_MACHINEGUN: - message = "was machinegunned by"; - break; - case MOD_CHAINGUN: - message = "was chaingunned by"; - break; - case MOD_SHOTGUN: - message = "was gunned down by"; - break; - case MOD_GRENADE: - message = "ate"; - message2 = "'s grenade"; - break; - case MOD_GRENADE_SPLASH: - message = "was shredded by"; - message2 = "'s shrapnel"; - break; - case MOD_ROCKET: - message = "ate"; - message2 = "'s rocket"; - break; - case MOD_ROCKET_SPLASH: - message = "almost dodged"; - message2 = "'s rocket"; - break; - case MOD_FLAMER: - message = "was toasted by"; - message2 = "'s flamer"; - break; - case MOD_FLAMER_SPLASH: - message = "was toasted by"; - message2 = "'s flamer"; - break; - case MOD_RAILGUN: - message = "was railed by"; - break; - case MOD_LIGHTNING: - message = "was electrocuted by"; - break; - case MOD_VENOM: - message = "was biten by"; - break; - case MOD_BFG: - case MOD_BFG_SPLASH: - message = "was blasted by"; - message2 = "'s BFG"; - break; - case MOD_TELEFRAG: - message = "tried to invade"; - message2 = "'s personal space"; - break; - default: - message = "was killed by"; - break; + if( attacker != ENTITYNUM_WORLD ) + { + switch( mod ) + { + case MOD_GRAPPLE: + message = "was caught by"; + break; + case MOD_GAUNTLET: + message = "was pummeled by"; + break; + case MOD_MACHINEGUN: + message = "was machinegunned by"; + break; + case MOD_CHAINGUN: + message = "was chaingunned by"; + break; + case MOD_SHOTGUN: + message = "was gunned down by"; + break; + case MOD_GRENADE: + message = "ate"; + message2 = "'s grenade"; + break; + case MOD_GRENADE_SPLASH: + message = "was shredded by"; + message2 = "'s shrapnel"; + break; + case MOD_ROCKET: + message = "ate"; + message2 = "'s rocket"; + break; + case MOD_ROCKET_SPLASH: + message = "almost dodged"; + message2 = "'s rocket"; + break; + case MOD_FLAMER: + message = "was toasted by"; + message2 = "'s flamer"; + break; + case MOD_FLAMER_SPLASH: + message = "was toasted by"; + message2 = "'s flamer"; + break; + case MOD_RAILGUN: + message = "was railed by"; + break; + case MOD_LIGHTNING: + message = "was electrocuted by"; + break; + case MOD_VENOM: + message = "was biten by"; + break; + case MOD_BFG: + case MOD_BFG_SPLASH: + message = "was blasted by"; + message2 = "'s BFG"; + break; + case MOD_TELEFRAG: + message = "tried to invade"; + message2 = "'s personal space"; + break; + default: + message = "was killed by"; + break; } - if (message) { + if( message ) + { CG_Printf( "%s %s %s%s\n", - targetName, message, attackerName, message2); + targetName, message, attackerName, message2 ); return; } } @@ -293,94 +261,29 @@ static void CG_Obituary( entityState_t *ent ) { //========================================================================== /* -=============== -CG_UseItem -=============== -*/ -static void CG_UseItem( centity_t *cent ) { - clientInfo_t *ci; - int itemNum, clientNum; - gitem_t *item; - entityState_t *es; - - es = ¢->currentState; - - itemNum = (es->event & ~EV_EVENT_BITS) - EV_USE_ITEM0; - if ( itemNum < 0 || itemNum > HI_NUM_HOLDABLE ) { - itemNum = 0; - } - - // print a message if the local player - if ( es->number == cg.snap->ps.clientNum ) { - if ( !itemNum ) { - CG_CenterPrint( "No item to use", SCREEN_HEIGHT * 0.30, BIGCHAR_WIDTH ); - } else { - /*item = BG_FindItemForHoldable( itemNum );*/ - CG_CenterPrint( va("Use %s", item->pickup_name), SCREEN_HEIGHT * 0.30, BIGCHAR_WIDTH ); - } - } - - switch ( itemNum ) { - default: - case HI_NONE: - trap_S_StartSound (NULL, es->number, CHAN_BODY, cgs.media.useNothingSound ); - break; - - case HI_TELEPORTER: - break; - - case HI_MEDKIT: - clientNum = cent->currentState.clientNum; - if ( clientNum >= 0 && clientNum < MAX_CLIENTS ) { - ci = &cgs.clientinfo[ clientNum ]; - ci->medkitUsageTime = cg.time; - } - trap_S_StartSound (NULL, es->number, CHAN_BODY, cgs.media.medkitSound ); - break; - } - -} - -/* -================ -CG_ItemPickup - -A new item was picked up this frame -================ -*/ -static void CG_ItemPickup( int itemNum ) { - cg.itemPickup = itemNum; - cg.itemPickupTime = cg.time; - cg.itemPickupBlendTime = cg.time; - // see if it should be the grabbed weapon - -} - - -/* ================ CG_PainEvent Also called by playerstate transition ================ */ -void CG_PainEvent( centity_t *cent, int health ) { +void CG_PainEvent( centity_t *cent, int health ) +{ char *snd; // don't do more than two pain sounds a second - if ( cg.time - cent->pe.painTime < 500 ) { + if( cg.time - cent->pe.painTime < 500 ) return; - } - if ( health < 25 ) { + if( health < 25 ) snd = "*pain25_1.wav"; - } else if ( health < 50 ) { + else if( health < 50 ) snd = "*pain50_1.wav"; - } else if ( health < 75 ) { + else if( health < 75 ) snd = "*pain75_1.wav"; - } else { + else snd = "*pain100_1.wav"; - } + trap_S_StartSound( NULL, cent->currentState.number, CHAN_VOICE, CG_CustomSound( cent->currentState.number, snd ) ); @@ -584,597 +487,509 @@ void CG_EntityEvent( centity_t *cent, vec3_t position ) es = ¢->currentState; event = es->event & ~EV_EVENT_BITS; - if ( cg_debugEvents.integer ) { + if( cg_debugEvents.integer ) CG_Printf( "ent:%3i event:%3i ", es->number, event ); - } - if ( !event ) { + if( !event ) + { DEBUGNAME("ZEROEVENT"); return; } clientNum = es->clientNum; - if ( clientNum < 0 || clientNum >= MAX_CLIENTS ) { + if( clientNum < 0 || clientNum >= MAX_CLIENTS ) clientNum = 0; - } + ci = &cgs.clientinfo[ clientNum ]; - switch ( event ) { - // - // movement generated events - // - case EV_FOOTSTEP: - DEBUGNAME("EV_FOOTSTEP"); - if (cg_footsteps.integer) { - trap_S_StartSound (NULL, es->number, CHAN_BODY, - cgs.media.footsteps[ ci->footsteps ][rand()&3] ); - } - break; - case EV_FOOTSTEP_METAL: - DEBUGNAME("EV_FOOTSTEP_METAL"); - if (cg_footsteps.integer) { - trap_S_StartSound (NULL, es->number, CHAN_BODY, - cgs.media.footsteps[ FOOTSTEP_METAL ][rand()&3] ); - } - break; - case EV_FOOTSTEP_SQUELCH: - DEBUGNAME("EV_FOOTSTEP_SQUELCH"); - if (cg_footsteps.integer) { - trap_S_StartSound (NULL, es->number, CHAN_BODY, - cgs.media.footsteps[ FOOTSTEP_FLESH ][rand()&3] ); - } - break; - case EV_FOOTSPLASH: - DEBUGNAME("EV_FOOTSPLASH"); - if (cg_footsteps.integer) { - trap_S_StartSound (NULL, es->number, CHAN_BODY, - cgs.media.footsteps[ FOOTSTEP_SPLASH ][rand()&3] ); - } - break; - case EV_FOOTWADE: - DEBUGNAME("EV_FOOTWADE"); - if (cg_footsteps.integer) { - trap_S_StartSound (NULL, es->number, CHAN_BODY, - cgs.media.footsteps[ FOOTSTEP_SPLASH ][rand()&3] ); - } - break; - case EV_SWIM: - DEBUGNAME("EV_SWIM"); - if (cg_footsteps.integer) { - trap_S_StartSound (NULL, es->number, CHAN_BODY, - cgs.media.footsteps[ FOOTSTEP_SPLASH ][rand()&3] ); - } - break; + switch( event ) + { + // + // movement generated events + // + case EV_FOOTSTEP: + DEBUGNAME( "EV_FOOTSTEP" ); + if( cg_footsteps.integer ) + { + trap_S_StartSound( NULL, es->number, CHAN_BODY, + cgs.media.footsteps[ ci->footsteps ][ rand( ) & 3 ] ); + } + break; + + case EV_FOOTSTEP_METAL: + DEBUGNAME( "EV_FOOTSTEP_METAL" ); + if( cg_footsteps.integer ) + { + trap_S_StartSound( NULL, es->number, CHAN_BODY, + cgs.media.footsteps[ FOOTSTEP_METAL ][ rand( ) & 3 ] ); + } + break; + + case EV_FOOTSTEP_SQUELCH: + DEBUGNAME( "EV_FOOTSTEP_SQUELCH" ); + if( cg_footsteps.integer ) + { + trap_S_StartSound( NULL, es->number, CHAN_BODY, + cgs.media.footsteps[ FOOTSTEP_FLESH ][ rand( ) & 3 ] ); + } + break; + + case EV_FOOTSPLASH: + DEBUGNAME( "EV_FOOTSPLASH" ); + if( cg_footsteps.integer ) + { + trap_S_StartSound( NULL, es->number, CHAN_BODY, + cgs.media.footsteps[ FOOTSTEP_SPLASH ][ rand( ) & 3 ] ); + } + break; + + case EV_FOOTWADE: + DEBUGNAME( "EV_FOOTWADE" ); + if( cg_footsteps.integer ) + { + trap_S_StartSound( NULL, es->number, CHAN_BODY, + cgs.media.footsteps[ FOOTSTEP_SPLASH ][ rand( ) & 3 ] ); + } + break; + + case EV_SWIM: + DEBUGNAME( "EV_SWIM" ); + if( cg_footsteps.integer ) + { + trap_S_StartSound( NULL, es->number, CHAN_BODY, + cgs.media.footsteps[ FOOTSTEP_SPLASH ][ rand( ) & 3 ] ); + } + break; - case EV_FALL_SHORT: - DEBUGNAME("EV_FALL_SHORT"); - trap_S_StartSound (NULL, es->number, CHAN_AUTO, cgs.media.landSound ); - if ( clientNum == cg.predictedPlayerState.clientNum ) { - // smooth landing z changes - cg.landChange = -8; - cg.landTime = cg.time; - } - break; - case EV_FALL_MEDIUM: - DEBUGNAME("EV_FALL_MEDIUM"); - // use normal pain sound - trap_S_StartSound( NULL, es->number, CHAN_VOICE, CG_CustomSound( es->number, "*pain100_1.wav" ) ); - if ( clientNum == cg.predictedPlayerState.clientNum ) { - // smooth landing z changes - cg.landChange = -16; - cg.landTime = cg.time; - } - break; - case EV_FALL_FAR: - DEBUGNAME("EV_FALL_FAR"); - trap_S_StartSound (NULL, es->number, CHAN_AUTO, CG_CustomSound( es->number, "*fall1.wav" ) ); - cent->pe.painTime = cg.time; // don't play a pain sound right after this - if ( clientNum == cg.predictedPlayerState.clientNum ) { - // smooth landing z changes - cg.landChange = -24; - cg.landTime = cg.time; - } - break; - - case EV_STEP_4: - case EV_STEP_8: - case EV_STEP_12: - case EV_STEP_16: // smooth out step up transitions - case EV_STEPDN_4: - case EV_STEPDN_8: - case EV_STEPDN_12: - case EV_STEPDN_16: // smooth out step down transitions - DEBUGNAME("EV_STEP"); - { - float oldStep; - int delta; - int step; - - if( clientNum != cg.predictedPlayerState.clientNum ) - break; - - // if we are interpolating, we don't need to smooth steps - if( cg.demoPlayback || ( cg.snap->ps.pm_flags & PMF_FOLLOW ) || - cg_nopredict.integer || cg_synchronousClients.integer ) - break; - - // check for stepping up before a previous step is completed - delta = cg.time - cg.stepTime; - - if( delta < STEP_TIME ) - oldStep = cg.stepChange * ( STEP_TIME - delta ) / STEP_TIME; - else - oldStep = 0; + case EV_FALL_SHORT: + DEBUGNAME( "EV_FALL_SHORT" ); + trap_S_StartSound( NULL, es->number, CHAN_AUTO, cgs.media.landSound ); + + if( clientNum == cg.predictedPlayerState.clientNum ) + { + // smooth landing z changes + cg.landChange = -8; + cg.landTime = cg.time; + } + break; + + case EV_FALL_MEDIUM: + DEBUGNAME( "EV_FALL_MEDIUM" ); + // use normal pain sound + trap_S_StartSound( NULL, es->number, CHAN_VOICE, CG_CustomSound( es->number, "*pain100_1.wav" ) ); + + if( clientNum == cg.predictedPlayerState.clientNum ) + { + // smooth landing z changes + cg.landChange = -16; + cg.landTime = cg.time; + } + break; + + case EV_FALL_FAR: + DEBUGNAME( "EV_FALL_FAR" ); + trap_S_StartSound (NULL, es->number, CHAN_AUTO, CG_CustomSound( es->number, "*fall1.wav" ) ); + cent->pe.painTime = cg.time; // don't play a pain sound right after this + + if( clientNum == cg.predictedPlayerState.clientNum ) + { + // smooth landing z changes + cg.landChange = -24; + cg.landTime = cg.time; + } + break; - // add this amount - if( event >= EV_STEPDN_4 ) - { - step = 4 * ( event - EV_STEPDN_4 + 1 ); - cg.stepChange = oldStep - step; - } - else - { - step = 4 * ( event - EV_STEP_4 + 1 ); - cg.stepChange = oldStep + step; - } + case EV_STEP_4: + case EV_STEP_8: + case EV_STEP_12: + case EV_STEP_16: // smooth out step up transitions + case EV_STEPDN_4: + case EV_STEPDN_8: + case EV_STEPDN_12: + case EV_STEPDN_16: // smooth out step down transitions + DEBUGNAME( "EV_STEP" ); + { + float oldStep; + int delta; + int step; + + if( clientNum != cg.predictedPlayerState.clientNum ) + break; + + // if we are interpolating, we don't need to smooth steps + if( cg.demoPlayback || ( cg.snap->ps.pm_flags & PMF_FOLLOW ) || + cg_nopredict.integer || cg_synchronousClients.integer ) + break; + + // check for stepping up before a previous step is completed + delta = cg.time - cg.stepTime; + + if( delta < STEP_TIME ) + oldStep = cg.stepChange * ( STEP_TIME - delta ) / STEP_TIME; + else + oldStep = 0; + + // add this amount + if( event >= EV_STEPDN_4 ) + { + step = 4 * ( event - EV_STEPDN_4 + 1 ); + cg.stepChange = oldStep - step; + } + else + { + step = 4 * ( event - EV_STEP_4 + 1 ); + cg.stepChange = oldStep + step; + } + + if( cg.stepChange > MAX_STEP_CHANGE ) + cg.stepChange = MAX_STEP_CHANGE; + else if( cg.stepChange < -MAX_STEP_CHANGE ) + cg.stepChange = -MAX_STEP_CHANGE; + + cg.stepTime = cg.time; + break; + } + + case EV_JUMP_PAD: + DEBUGNAME( "EV_JUMP_PAD" ); + // CG_Printf( "EV_JUMP_PAD w/effect #%i\n", es->eventParm ); + { + localEntity_t *smoke; + vec3_t up = { 0, 0, 1 }; + + + smoke = CG_SmokePuff( cent->lerpOrigin, up, + 32, + 1, 1, 1, 0.33f, + 1000, + cg.time, 0, + LEF_PUFF_DONT_SCALE, + cgs.media.smokePuffShader ); + } - if( cg.stepChange > MAX_STEP_CHANGE ) - cg.stepChange = MAX_STEP_CHANGE; - else if( cg.stepChange < -MAX_STEP_CHANGE ) - cg.stepChange = -MAX_STEP_CHANGE; - - cg.stepTime = cg.time; - break; - } - - case EV_JUMP_PAD: - DEBUGNAME("EV_JUMP_PAD"); -// CG_Printf( "EV_JUMP_PAD w/effect #%i\n", es->eventParm ); - { - localEntity_t *smoke; - vec3_t up = {0, 0, 1}; + // boing sound at origin, jump sound on player + trap_S_StartSound( cent->lerpOrigin, -1, CHAN_VOICE, cgs.media.jumpPadSound ); + trap_S_StartSound( NULL, es->number, CHAN_VOICE, CG_CustomSound( es->number, "*jump1.wav" ) ); + break; + case EV_JUMP: + DEBUGNAME( "EV_JUMP" ); + trap_S_StartSound( NULL, es->number, CHAN_VOICE, CG_CustomSound( es->number, "*jump1.wav" ) ); + break; + + case EV_TAUNT: + DEBUGNAME( "EV_TAUNT" ); + trap_S_StartSound( NULL, es->number, CHAN_VOICE, CG_CustomSound( es->number, "*taunt.wav" ) ); + break; + + case EV_WATER_TOUCH: + DEBUGNAME( "EV_WATER_TOUCH" ); + trap_S_StartSound( NULL, es->number, CHAN_AUTO, cgs.media.watrInSound ); + break; + + case EV_WATER_LEAVE: + DEBUGNAME( "EV_WATER_LEAVE" ); + trap_S_StartSound( NULL, es->number, CHAN_AUTO, cgs.media.watrOutSound ); + break; + + case EV_WATER_UNDER: + DEBUGNAME( "EV_WATER_UNDER" ); + trap_S_StartSound( NULL, es->number, CHAN_AUTO, cgs.media.watrUnSound ); + break; + + case EV_WATER_CLEAR: + DEBUGNAME( "EV_WATER_CLEAR" ); + trap_S_StartSound( NULL, es->number, CHAN_AUTO, CG_CustomSound( es->number, "*gasp.wav" ) ); + break; - smoke = CG_SmokePuff( cent->lerpOrigin, up, - 32, - 1, 1, 1, 0.33f, - 1000, - cg.time, 0, - LEF_PUFF_DONT_SCALE, - cgs.media.smokePuffShader ); - } - // boing sound at origin, jump sound on player - trap_S_StartSound ( cent->lerpOrigin, -1, CHAN_VOICE, cgs.media.jumpPadSound ); - trap_S_StartSound (NULL, es->number, CHAN_VOICE, CG_CustomSound( es->number, "*jump1.wav" ) ); - break; - - case EV_JUMP: - DEBUGNAME("EV_JUMP"); - trap_S_StartSound (NULL, es->number, CHAN_VOICE, CG_CustomSound( es->number, "*jump1.wav" ) ); - break; - case EV_TAUNT: - DEBUGNAME("EV_TAUNT"); - trap_S_StartSound (NULL, es->number, CHAN_VOICE, CG_CustomSound( es->number, "*taunt.wav" ) ); - break; - case EV_WATER_TOUCH: - DEBUGNAME("EV_WATER_TOUCH"); - trap_S_StartSound (NULL, es->number, CHAN_AUTO, cgs.media.watrInSound ); - break; - case EV_WATER_LEAVE: - DEBUGNAME("EV_WATER_LEAVE"); - trap_S_StartSound (NULL, es->number, CHAN_AUTO, cgs.media.watrOutSound ); - break; - case EV_WATER_UNDER: - DEBUGNAME("EV_WATER_UNDER"); - trap_S_StartSound (NULL, es->number, CHAN_AUTO, cgs.media.watrUnSound ); - break; - case EV_WATER_CLEAR: - DEBUGNAME("EV_WATER_CLEAR"); - trap_S_StartSound (NULL, es->number, CHAN_AUTO, CG_CustomSound( es->number, "*gasp.wav" ) ); - break; - - case EV_ITEM_PICKUP: - DEBUGNAME("EV_ITEM_PICKUP"); - { - } - break; + case EV_ITEM_PICKUP: + DEBUGNAME( "EV_ITEM_PICKUP" ); + { + } + break; - case EV_GLOBAL_ITEM_PICKUP: - DEBUGNAME("EV_GLOBAL_ITEM_PICKUP"); - { - } - break; - - // - // weapon events - // - case EV_NOAMMO: - DEBUGNAME("EV_NOAMMO"); -// trap_S_StartSound (NULL, es->number, CHAN_AUTO, cgs.media.noAmmoSound ); - if ( es->number == cg.snap->ps.clientNum ) { - CG_OutOfAmmoChange(); - } - break; - case EV_CHANGE_WEAPON: - DEBUGNAME("EV_CHANGE_WEAPON"); - trap_S_StartSound (NULL, es->number, CHAN_AUTO, cgs.media.selectSound ); - break; - case EV_NEXT_WEAPON: - DEBUGNAME("EV_NEXT_WEAPON"); - CG_NextWeapon_f( ); - break; - case EV_FIRE_WEAPON: - DEBUGNAME("EV_FIRE_WEAPON"); - CG_FireWeapon( cent, 0 ); - break; - case EV_FIRE_WEAPON2: - DEBUGNAME("EV_FIRE_WEAPON2"); - CG_FireWeapon( cent, 1 ); //FIXME:?? - break; - case EV_FIRE_WEAPON3: - DEBUGNAME("EV_FIRE_WEAPON3"); - CG_FireWeapon( cent, 2 ); //FIXME:?? - break; - case EV_USE_ITEM0: - DEBUGNAME("EV_USE_ITEM0"); - CG_UseItem( cent ); - break; - case EV_USE_ITEM1: - DEBUGNAME("EV_USE_ITEM1"); - CG_UseItem( cent ); - break; - case EV_USE_ITEM2: - DEBUGNAME("EV_USE_ITEM2"); - CG_UseItem( cent ); - break; - case EV_USE_ITEM3: - DEBUGNAME("EV_USE_ITEM3"); - CG_UseItem( cent ); - break; - case EV_USE_ITEM4: - DEBUGNAME("EV_USE_ITEM4"); - CG_UseItem( cent ); - break; - case EV_USE_ITEM5: - DEBUGNAME("EV_USE_ITEM5"); - CG_UseItem( cent ); - break; - case EV_USE_ITEM6: - DEBUGNAME("EV_USE_ITEM6"); - CG_UseItem( cent ); - break; - case EV_USE_ITEM7: - DEBUGNAME("EV_USE_ITEM7"); - CG_UseItem( cent ); - break; - case EV_USE_ITEM8: - DEBUGNAME("EV_USE_ITEM8"); - CG_UseItem( cent ); - break; - case EV_USE_ITEM9: - DEBUGNAME("EV_USE_ITEM9"); - CG_UseItem( cent ); - break; - case EV_USE_ITEM10: - DEBUGNAME("EV_USE_ITEM10"); - CG_UseItem( cent ); - break; - case EV_USE_ITEM11: - DEBUGNAME("EV_USE_ITEM11"); - CG_UseItem( cent ); - break; - case EV_USE_ITEM12: - DEBUGNAME("EV_USE_ITEM12"); - CG_UseItem( cent ); - break; - case EV_USE_ITEM13: - DEBUGNAME("EV_USE_ITEM13"); - CG_UseItem( cent ); - break; - case EV_USE_ITEM14: - DEBUGNAME("EV_USE_ITEM14"); - CG_UseItem( cent ); - break; - - //================================================================= - - // - // other events - // - case EV_PLAYER_TELEPORT_IN: - DEBUGNAME("EV_PLAYER_TELEPORT_IN"); - trap_S_StartSound (NULL, es->number, CHAN_AUTO, cgs.media.teleInSound ); - CG_SpawnEffect( position); - break; - - case EV_PLAYER_TELEPORT_OUT: - DEBUGNAME("EV_PLAYER_TELEPORT_OUT"); - trap_S_StartSound (NULL, es->number, CHAN_AUTO, cgs.media.teleOutSound ); - CG_SpawnEffect( position); - break; - - case EV_ITEM_POP: - DEBUGNAME("EV_ITEM_POP"); - trap_S_StartSound (NULL, es->number, CHAN_AUTO, cgs.media.respawnSound ); - break; - case EV_ITEM_RESPAWN: - DEBUGNAME("EV_ITEM_RESPAWN"); - cent->miscTime = cg.time; // scale up from this - trap_S_StartSound (NULL, es->number, CHAN_AUTO, cgs.media.respawnSound ); - break; - - //TA: make alien items "grow" - case EV_BUILD_CONSTRUCT: - DEBUGNAME("EV_BUILD_CONSTRUCT"); - cent->miscTime = cg.time; // scale up from this - //probably a better place for this, but for the time being it lives here - memset( ¢->lerpFrame, 0, sizeof( lerpFrame_t ) ); - cent->buildableAnim = es->eventParm; - break; - - //TA: make alien creep "recede" - case EV_BUILD_DESTROY: - DEBUGNAME("EV_BUILD_DESTROY"); - cent->miscTime = -cg.time; // scale down from this - break; - - //TA: trigger an anim on a buildable item - case EV_BUILD_ANIM: - DEBUGNAME("EV_BUILD_ANIM"); - if( cent->buildableAnim == es->torsoAnim || es->eventParm & ANIM_TOGGLEBIT ) + case EV_GLOBAL_ITEM_PICKUP: + DEBUGNAME( "EV_GLOBAL_ITEM_PICKUP" ); + { + } + break; + + // + // weapon events + // + case EV_NOAMMO: + DEBUGNAME( "EV_NOAMMO" ); + // trap_S_StartSound (NULL, es->number, CHAN_AUTO, cgs.media.noAmmoSound ); + { + } + break; + + case EV_CHANGE_WEAPON: + DEBUGNAME( "EV_CHANGE_WEAPON" ); + trap_S_StartSound( NULL, es->number, CHAN_AUTO, cgs.media.selectSound ); + break; + + case EV_NEXT_WEAPON: + DEBUGNAME( "EV_NEXT_WEAPON" ); + CG_NextWeapon_f( ); + break; + + case EV_FIRE_WEAPON: + DEBUGNAME( "EV_FIRE_WEAPON" ); + CG_FireWeapon( cent, 0 ); + break; + + case EV_FIRE_WEAPON2: + DEBUGNAME( "EV_FIRE_WEAPON2" ); + CG_FireWeapon( cent, 1 ); //FIXME:?? + break; + + case EV_FIRE_WEAPON3: + DEBUGNAME( "EV_FIRE_WEAPON3" ); + CG_FireWeapon( cent, 2 ); //FIXME:?? + break; + + //================================================================= + + // + // other events + // + case EV_PLAYER_TELEPORT_IN: + DEBUGNAME( "EV_PLAYER_TELEPORT_IN" ); + trap_S_StartSound( NULL, es->number, CHAN_AUTO, cgs.media.teleInSound ); + CG_SpawnEffect( position ); + break; + + case EV_PLAYER_TELEPORT_OUT: + DEBUGNAME( "EV_PLAYER_TELEPORT_OUT" ); + trap_S_StartSound( NULL, es->number, CHAN_AUTO, cgs.media.teleOutSound ); + CG_SpawnEffect( position ); + break; + + case EV_BUILD_CONSTRUCT: + DEBUGNAME( "EV_BUILD_CONSTRUCT" ); + cent->miscTime = cg.time; // scale up from this + //probably a better place for this, but for the time being it lives here + memset( ¢->lerpFrame, 0, sizeof( lerpFrame_t ) ); cent->buildableAnim = es->eventParm; - break; - - case EV_GRENADE_BOUNCE: - DEBUGNAME("EV_GRENADE_BOUNCE"); - if ( rand() & 1 ) { - trap_S_StartSound (NULL, es->number, CHAN_AUTO, cgs.media.hgrenb1aSound ); - } else { - trap_S_StartSound (NULL, es->number, CHAN_AUTO, cgs.media.hgrenb2aSound ); - } - break; - - // - // missile impacts - // - case EV_MISSILE_HIT: - DEBUGNAME("EV_MISSILE_HIT"); - ByteToDir( es->eventParm, dir ); - CG_MissileHitPlayer( es->weapon, position, dir, es->otherEntityNum, es->generic1 ); - break; - - case EV_MISSILE_MISS: - DEBUGNAME("EV_MISSILE_MISS"); - ByteToDir( es->eventParm, dir ); - CG_MissileHitWall( es->weapon, 0, position, dir, IMPACTSOUND_DEFAULT, es->generic1 ); - break; - - case EV_MISSILE_MISS_METAL: - DEBUGNAME("EV_MISSILE_MISS_METAL"); - ByteToDir( es->eventParm, dir ); - CG_MissileHitWall( es->weapon, 0, position, dir, IMPACTSOUND_METAL, es->generic1 ); - break; - - case EV_ITEM_EXPLOSION: - DEBUGNAME("EV_ITEM_EXPLOSION"); - ByteToDir( es->eventParm, dir ); - CG_Explosion( 0, position, dir ); - break; - - case EV_RAILTRAIL: -/* DEBUGNAME("EV_RAILTRAIL"); - cent->currentState.weapon = WP_RAILGUN; - // if the end was on a nomark surface, don't make an explosion - CG_RailTrail( es->origin2, es->pos.trBase ); - if ( es->eventParm != 255 ) { + break; + + case EV_BUILD_DESTROY: + DEBUGNAME( "EV_BUILD_DESTROY" ); + cent->miscTime = -cg.time; // scale down from this + break; + + //TA: trigger an anim on a buildable item + case EV_BUILD_ANIM: + DEBUGNAME( "EV_BUILD_ANIM" ); + if( cent->buildableAnim == es->torsoAnim || es->eventParm & ANIM_TOGGLEBIT ) + cent->buildableAnim = es->eventParm; + break; + + case EV_GRENADE_BOUNCE: + DEBUGNAME( "EV_GRENADE_BOUNCE" ); + if( rand( ) & 1 ) + trap_S_StartSound( NULL, es->number, CHAN_AUTO, cgs.media.hgrenb1aSound ); + else + trap_S_StartSound( NULL, es->number, CHAN_AUTO, cgs.media.hgrenb2aSound ); + break; + + // + // missile impacts + // + case EV_MISSILE_HIT: + DEBUGNAME( "EV_MISSILE_HIT" ); ByteToDir( es->eventParm, dir ); - CG_MissileHitWall( es->weapon, es->clientNum, position, dir, IMPACTSOUND_DEFAULT ); - }*/ - break; - - case EV_TESLATRAIL: - DEBUGNAME("EV_TESLATRAIL"); - cent->currentState.weapon = WP_TESLAGEN; - CG_TeslaTrail( es->origin2, es->pos.trBase, es->generic1, es->clientNum ); - break; - - case EV_ALIENZAP: - DEBUGNAME("EV_ALIENZAP"); - CG_AlienZap( es->origin2, es->pos.trBase, es->generic1, es->clientNum ); - break; - - case EV_BULLET_HIT_WALL: - DEBUGNAME("EV_BULLET_HIT_WALL"); - ByteToDir( es->eventParm, dir ); - CG_Bullet( es->pos.trBase, es->otherEntityNum, dir, qfalse, ENTITYNUM_WORLD ); - break; - - case EV_BULLET_HIT_FLESH: - DEBUGNAME("EV_BULLET_HIT_FLESH"); - CG_Bullet( es->pos.trBase, es->otherEntityNum, dir, qtrue, es->eventParm ); - break; - - case EV_LAS_HIT_WALL: - DEBUGNAME("EV_LAS_HIT_WALL"); - ByteToDir( es->eventParm, dir ); - CG_LasGunHit( es->pos.trBase, es->otherEntityNum, dir, qfalse, ENTITYNUM_WORLD ); - break; - - case EV_LAS_HIT_FLESH: - DEBUGNAME("EV_LAS_HIT_FLESH"); - CG_LasGunHit( es->pos.trBase, es->otherEntityNum, dir, qtrue, es->eventParm ); - break; - + CG_MissileHitPlayer( es->weapon, position, dir, es->otherEntityNum, es->generic1 ); + break; + + case EV_MISSILE_MISS: + DEBUGNAME( "EV_MISSILE_MISS" ); + ByteToDir( es->eventParm, dir ); + CG_MissileHitWall( es->weapon, 0, position, dir, IMPACTSOUND_DEFAULT, es->generic1 ); + break; + + case EV_MISSILE_MISS_METAL: + DEBUGNAME( "EV_MISSILE_MISS_METAL" ); + ByteToDir( es->eventParm, dir ); + CG_MissileHitWall( es->weapon, 0, position, dir, IMPACTSOUND_METAL, es->generic1 ); + break; + + case EV_BUILDABLE_EXPLOSION: + DEBUGNAME( "EV_BUILDABLE_EXPLOSION" ); + ByteToDir( es->eventParm, dir ); + CG_Explosion( 0, position, dir ); + break; + + case EV_TESLATRAIL: + DEBUGNAME( "EV_TESLATRAIL" ); + cent->currentState.weapon = WP_TESLAGEN; + CG_TeslaTrail( es->origin2, es->pos.trBase, es->generic1, es->clientNum ); + break; + + case EV_ALIENZAP: + DEBUGNAME( "EV_ALIENZAP" ); + CG_AlienZap( es->origin2, es->pos.trBase, es->generic1, es->clientNum ); + break; + + case EV_BULLET_HIT_WALL: + DEBUGNAME( "EV_BULLET_HIT_WALL" ); + ByteToDir( es->eventParm, dir ); + CG_Bullet( es->pos.trBase, es->otherEntityNum, dir, qfalse, ENTITYNUM_WORLD ); + break; + + case EV_BULLET_HIT_FLESH: + DEBUGNAME( "EV_BULLET_HIT_FLESH" ); + CG_Bullet( es->pos.trBase, es->otherEntityNum, dir, qtrue, es->eventParm ); + break; + + case EV_LAS_HIT_WALL: + DEBUGNAME( "EV_LAS_HIT_WALL" ); + ByteToDir( es->eventParm, dir ); + CG_LasGunHit( es->pos.trBase, es->otherEntityNum, dir, qfalse, ENTITYNUM_WORLD ); + break; + + case EV_LAS_HIT_FLESH: + DEBUGNAME( "EV_LAS_HIT_FLESH" ); + CG_LasGunHit( es->pos.trBase, es->otherEntityNum, dir, qtrue, es->eventParm ); + break; + #define MASS_EJECTION_VEL 300 - case EV_MASS_DRIVER_HIT: - DEBUGNAME("EV_MASS_DRIVER_HIT"); - for( i = 0; i <= 10; i++ ) - { - qhandle_t spark; - vec3_t velocity; - vec3_t accel = { 0.0f, 0.0f, -DEFAULT_GRAVITY }; - vec3_t origin, normal; + case EV_MASS_DRIVER_HIT: + DEBUGNAME( "EV_MASS_DRIVER_HIT" ); + for( i = 0; i <= 10; i++ ) + { + qhandle_t spark; + vec3_t velocity; + vec3_t accel = { 0.0f, 0.0f, -DEFAULT_GRAVITY }; + vec3_t origin, normal; + + ByteToDir( es->eventParm, normal ); + + VectorMA( es->pos.trBase, 10.0f, normal, origin ); + + if( crandom( ) > 0.5f ) + spark = cgs.media.gibSpark1; + else + spark = cgs.media.gibSpark2; + + velocity[ 0 ] = ( 2 * random( ) - 1.0f ) * MASS_EJECTION_VEL; + velocity[ 1 ] = ( 2 * random( ) - 1.0f ) * MASS_EJECTION_VEL; + velocity[ 2 ] = ( 2 * random( ) - 1.0f ) * MASS_EJECTION_VEL; + + CG_LaunchSprite( origin, velocity, accel, 0.0f, 0.5f, 4.0f, 2.0f, 255, 0, rand( ) % 360, + cg.time, cg.time, 5000 + ( crandom( ) * 3000 ), + spark, qfalse, qfalse ); + } - ByteToDir( es->eventParm, normal ); + break; - VectorMA( es->pos.trBase, 10.0f, normal, origin ); + case EV_GENERAL_SOUND: + DEBUGNAME( "EV_GENERAL_SOUND" ); + if( cgs.gameSounds[ es->eventParm ] ) + trap_S_StartSound( NULL, es->number, CHAN_VOICE, cgs.gameSounds[ es->eventParm ] ); + else + { + s = CG_ConfigString( CS_SOUNDS + es->eventParm ); + trap_S_StartSound( NULL, es->number, CHAN_VOICE, CG_CustomSound( es->number, s ) ); + } + break; - if( crandom( ) > 0.5f ) - spark = cgs.media.gibSpark1; + case EV_GLOBAL_SOUND: // play from the player's head so it never diminishes + DEBUGNAME( "EV_GLOBAL_SOUND" ); + if( cgs.gameSounds[ es->eventParm ] ) + trap_S_StartSound( NULL, cg.snap->ps.clientNum, CHAN_AUTO, cgs.gameSounds[ es->eventParm ] ); else - spark = cgs.media.gibSpark2; + { + s = CG_ConfigString( CS_SOUNDS + es->eventParm ); + trap_S_StartSound( NULL, cg.snap->ps.clientNum, CHAN_AUTO, CG_CustomSound( es->number, s ) ); + } + break; - velocity[ 0 ] = ( 2 * random( ) - 1.0f ) * MASS_EJECTION_VEL; - velocity[ 1 ] = ( 2 * random( ) - 1.0f ) * MASS_EJECTION_VEL; - velocity[ 2 ] = ( 2 * random( ) - 1.0f ) * MASS_EJECTION_VEL; - - CG_LaunchSprite( origin, velocity, accel, 0.0f, 0.5f, 4.0f, 2.0f, 255, 0, rand( ) % 360, - cg.time, cg.time, 5000 + ( crandom( ) * 3000 ), - spark, qfalse, qfalse ); - } + case EV_PAIN: + // local player sounds are triggered in CG_CheckLocalSounds, + // so ignore events on the player + DEBUGNAME( "EV_PAIN" ); + if( cent->currentState.number != cg.snap->ps.clientNum ) + CG_PainEvent( cent, es->eventParm ); + break; - break; + case EV_DEATH1: + case EV_DEATH2: + case EV_DEATH3: + DEBUGNAME( "EV_DEATHx" ); + trap_S_StartSound( NULL, es->number, CHAN_VOICE, + CG_CustomSound( es->number, va( "*death%i.wav", event - EV_DEATH1 + 1 ) ) ); + break; - case EV_SHOTGUN: - DEBUGNAME("EV_SHOTGUN"); - CG_ShotgunFire( es ); - break; + case EV_OBITUARY: + DEBUGNAME( "EV_OBITUARY" ); + CG_Obituary( es ); + break; - case EV_GENERAL_SOUND: - DEBUGNAME("EV_GENERAL_SOUND"); - if ( cgs.gameSounds[ es->eventParm ] ) { - trap_S_StartSound (NULL, es->number, CHAN_VOICE, cgs.gameSounds[ es->eventParm ] ); - } else { - s = CG_ConfigString( CS_SOUNDS + es->eventParm ); - trap_S_StartSound (NULL, es->number, CHAN_VOICE, CG_CustomSound( es->number, s ) ); - } - break; - - case EV_GLOBAL_SOUND: // play from the player's head so it never diminishes - DEBUGNAME("EV_GLOBAL_SOUND"); - if ( cgs.gameSounds[ es->eventParm ] ) { - trap_S_StartSound (NULL, cg.snap->ps.clientNum, CHAN_AUTO, cgs.gameSounds[ es->eventParm ] ); - } else { - s = CG_ConfigString( CS_SOUNDS + es->eventParm ); - trap_S_StartSound (NULL, cg.snap->ps.clientNum, CHAN_AUTO, CG_CustomSound( es->number, s ) ); - } - break; - - case EV_PAIN: - // local player sounds are triggered in CG_CheckLocalSounds, - // so ignore events on the player - DEBUGNAME("EV_PAIN"); - if ( cent->currentState.number != cg.snap->ps.clientNum ) { - CG_PainEvent( cent, es->eventParm ); - } - break; - - case EV_DEATH1: - case EV_DEATH2: - case EV_DEATH3: - DEBUGNAME("EV_DEATHx"); - trap_S_StartSound( NULL, es->number, CHAN_VOICE, - CG_CustomSound( es->number, va("*death%i.wav", event - EV_DEATH1 + 1) ) ); - break; - - - case EV_OBITUARY: - DEBUGNAME("EV_OBITUARY"); - CG_Obituary( es ); - break; - - // - // powerup events - // - case EV_POWERUP_QUAD: - DEBUGNAME("EV_POWERUP_QUAD"); - if ( es->number == cg.snap->ps.clientNum ) { - cg.powerupActive = PW_QUAD; - cg.powerupTime = cg.time; - } - trap_S_StartSound (NULL, es->number, CHAN_ITEM, cgs.media.quadSound ); - break; - case EV_POWERUP_BATTLESUIT: - DEBUGNAME("EV_POWERUP_BATTLESUIT"); - if ( es->number == cg.snap->ps.clientNum ) { - cg.powerupActive = PW_BATTLESUIT; - cg.powerupTime = cg.time; - } - trap_S_StartSound (NULL, es->number, CHAN_ITEM, cgs.media.protectSound ); - break; - case EV_POWERUP_REGEN: - DEBUGNAME("EV_POWERUP_REGEN"); - if ( es->number == cg.snap->ps.clientNum ) { - cg.powerupActive = PW_REGEN; - cg.powerupTime = cg.time; - } - trap_S_StartSound (NULL, es->number, CHAN_ITEM, cgs.media.regenSound ); - break; - - case EV_GIB_PLAYER: - DEBUGNAME("EV_GIB_PLAYER"); - trap_S_StartSound( NULL, es->number, CHAN_BODY, cgs.media.gibSound ); - CG_GibPlayer( cent->lerpOrigin ); - break; - - case EV_GIB_ALIEN: - DEBUGNAME("EV_GIB_ALIEN"); - trap_S_StartSound( NULL, es->number, CHAN_BODY, cgs.media.gibSound ); - CG_GenericGib( cent->lerpOrigin ); - break; - - case EV_STOPLOOPINGSOUND: - DEBUGNAME("EV_STOPLOOPINGSOUND"); - trap_S_StopLoopingSound( es->number ); - es->loopSound = 0; - break; - - case EV_DEBUG_LINE: - DEBUGNAME("EV_DEBUG_LINE"); - CG_Beam( cent ); - break; - - case EV_MENU: - DEBUGNAME("EV_MENU"); - if( es->number == cg.clientNum ) - CG_Menu( es->eventParm ); - break; - - case EV_BUILD_DELAY: - DEBUGNAME("EV_BUILD_DELAY"); - //FIXME: change to "negative" sound - trap_S_StartLocalSound( cgs.media.hitSound, CHAN_LOCAL_SOUND ); - cg.lastBuildAttempt = cg.time; - break; - - case EV_POISONCLOUD: - DEBUGNAME("EV_POISONCLOUD"); - cg.firstPoisonedTime = cg.time; - break; - - case EV_KNOCKOVER: - DEBUGNAME("EV_KNOCKOVER"); - cg.firstKnockedTime = cg.time; - break; - - case EV_GETUP: - DEBUGNAME("EV_GETUP"); - cg.firstGetUpTime = cg.time; - break; - - case EV_PLAYER_RESPAWN: - DEBUGNAME("EV_PLAYER_RESPAWN"); - if( es->number == cg.clientNum ) - cg.spawnTime = cg.time; - break; - - default: - DEBUGNAME("UNKNOWN"); - CG_Error( "Unknown event: %i", event ); - break; - } + case EV_GIB_PLAYER: + DEBUGNAME( "EV_GIB_PLAYER" ); + trap_S_StartSound( NULL, es->number, CHAN_BODY, cgs.media.gibSound ); + CG_GibPlayer( cent->lerpOrigin ); + break; + + case EV_GIB_ALIEN: + DEBUGNAME( "EV_GIB_ALIEN" ); + trap_S_StartSound( NULL, es->number, CHAN_BODY, cgs.media.gibSound ); + CG_GenericGib( cent->lerpOrigin ); + break; + + case EV_STOPLOOPINGSOUND: + DEBUGNAME( "EV_STOPLOOPINGSOUND" ); + trap_S_StopLoopingSound( es->number ); + es->loopSound = 0; + break; + + case EV_DEBUG_LINE: + DEBUGNAME( "EV_DEBUG_LINE" ); + CG_Beam( cent ); + break; + + case EV_MENU: + DEBUGNAME( "EV_MENU" ); + if( es->number == cg.clientNum ) + CG_Menu( es->eventParm ); + break; + + case EV_BUILD_DELAY: + DEBUGNAME( "EV_BUILD_DELAY" ); + //FIXME: change to "negative" sound + trap_S_StartLocalSound( cgs.media.hitSound, CHAN_LOCAL_SOUND ); + cg.lastBuildAttempt = cg.time; + break; + + case EV_POISONCLOUD: + DEBUGNAME( "EV_POISONCLOUD" ); + cg.firstPoisonedTime = cg.time; + break; + + case EV_KNOCKOVER: + DEBUGNAME( "EV_KNOCKOVER" ); + cg.firstKnockedTime = cg.time; + break; + case EV_GETUP: + DEBUGNAME( "EV_GETUP" ); + cg.firstGetUpTime = cg.time; + break; + + case EV_PLAYER_RESPAWN: + DEBUGNAME( "EV_PLAYER_RESPAWN" ); + if( es->number == cg.clientNum ) + cg.spawnTime = cg.time; + break; + + default: + DEBUGNAME( "UNKNOWN" ); + CG_Error( "Unknown event: %i", event ); + break; + } } @@ -1184,24 +999,27 @@ CG_CheckEvents ============== */ -void CG_CheckEvents( centity_t *cent ) { +void CG_CheckEvents( centity_t *cent ) +{ // check for event-only entities - if ( cent->currentState.eType > ET_EVENTS ) { - if ( cent->previousEvent ) { + if( cent->currentState.eType > ET_EVENTS ) + { + if( cent->previousEvent ) return; // already fired - } + cent->previousEvent = 1; cent->currentState.event = cent->currentState.eType - ET_EVENTS; - } else { + } + else + { // check for events riding with another entity - if ( cent->currentState.event == cent->previousEvent ) { + if( cent->currentState.event == cent->previousEvent ) return; - } + cent->previousEvent = cent->currentState.event; - if ( ( cent->currentState.event & ~EV_EVENT_BITS ) == 0 ) { + if( ( cent->currentState.event & ~EV_EVENT_BITS ) == 0 ) return; - } } // calculate the position at exactly the frame time diff --git a/src/cgame/cg_local.h b/src/cgame/cg_local.h index e6855a35..15be6a51 100644 --- a/src/cgame/cg_local.h +++ b/src/cgame/cg_local.h @@ -1295,6 +1295,7 @@ extern vmCvar_t ui_currentClass; extern vmCvar_t ui_carriage; extern vmCvar_t ui_stages; extern vmCvar_t ui_dialog; +extern vmCvar_t ui_loading; // // cg_main.c diff --git a/src/cgame/cg_main.c b/src/cgame/cg_main.c index 8d233476..cf99e93e 100644 --- a/src/cgame/cg_main.c +++ b/src/cgame/cg_main.c @@ -34,52 +34,65 @@ This is the only way control passes into the module. This must be the very first function compiled into the .q3vm file ================ */ -int vmMain( int command, int arg0, int arg1, int arg2, int arg3, int arg4, int arg5, int arg6, int arg7, int arg8, int arg9, int arg10, int arg11 ) { - switch ( command ) { - case CG_INIT: - CG_Init( arg0, arg1, arg2 ); - return 0; - case CG_SHUTDOWN: - CG_Shutdown(); - return 0; - case CG_CONSOLE_COMMAND: - return CG_ConsoleCommand(); - case CG_DRAW_ACTIVE_FRAME: - CG_DrawActiveFrame( arg0, arg1, arg2 ); - return 0; - case CG_CROSSHAIR_PLAYER: - return CG_CrosshairPlayer(); - case CG_LAST_ATTACKER: - return CG_LastAttacker(); - case CG_KEY_EVENT: - CG_KeyEvent(arg0, arg1); - return 0; - case CG_MOUSE_EVENT: - cgDC.cursorx = cgs.cursorX; - cgDC.cursory = cgs.cursorY; - CG_MouseEvent(arg0, arg1); - return 0; - case CG_EVENT_HANDLING: - CG_EventHandling(arg0); - return 0; - default: - CG_Error( "vmMain: unknown command %i", command ); - break; +int vmMain( int command, int arg0, int arg1, int arg2, int arg3, + int arg4, int arg5, int arg6, int arg7, + int arg8, int arg9, int arg10, int arg11 ) +{ + switch( command ) + { + case CG_INIT: + CG_Init( arg0, arg1, arg2 ); + return 0; + + case CG_SHUTDOWN: + CG_Shutdown( ); + return 0; + + case CG_CONSOLE_COMMAND: + return CG_ConsoleCommand( ); + + case CG_DRAW_ACTIVE_FRAME: + CG_DrawActiveFrame( arg0, arg1, arg2 ); + return 0; + + case CG_CROSSHAIR_PLAYER: + return CG_CrosshairPlayer( ); + + case CG_LAST_ATTACKER: + return CG_LastAttacker( ); + + case CG_KEY_EVENT: + CG_KeyEvent( arg0, arg1 ); + return 0; + + case CG_MOUSE_EVENT: + cgDC.cursorx = cgs.cursorX; + cgDC.cursory = cgs.cursorY; + CG_MouseEvent( arg0, arg1 ); + return 0; + + case CG_EVENT_HANDLING: + CG_EventHandling( arg0 ); + return 0; + + default: + CG_Error( "vmMain: unknown command %i", command ); + break; } + return -1; } cg_t cg; cgs_t cgs; -centity_t cg_entities[MAX_GENTITIES]; +centity_t cg_entities[ MAX_GENTITIES ]; //TA: weapons limit expanded: //weaponInfo_t cg_weapons[MAX_WEAPONS]; -weaponInfo_t cg_weapons[32]; -upgradeInfo_t cg_upgrades[32]; +weaponInfo_t cg_weapons[ 32 ]; +upgradeInfo_t cg_upgrades[ 32 ]; -itemInfo_t cg_items[MAX_ITEMS]; buildableInfo_t cg_buildables[ BA_NUM_BUILDABLES ]; vmCvar_t cg_teslaTrailTime; @@ -190,16 +203,19 @@ vmCvar_t ui_currentClass; vmCvar_t ui_carriage; vmCvar_t ui_stages; vmCvar_t ui_dialog; +vmCvar_t ui_loading; -typedef struct { +typedef struct +{ vmCvar_t *vmCvar; - char *cvarName; - char *defaultString; - int cvarFlags; + char *cvarName; + char *defaultString; + int cvarFlags; } cvarTable_t; -static cvarTable_t cvarTable[] = { +static cvarTable_t cvarTable[ ] = +{ { &cg_ignore, "cg_ignore", "0", 0 }, // used for debugging { &cg_autoswitch, "cg_autoswitch", "1", CVAR_ARCHIVE }, { &cg_drawGun, "cg_drawGun", "1", CVAR_ARCHIVE }, @@ -281,6 +297,7 @@ static cvarTable_t cvarTable[] = { { &ui_carriage, "ui_carriage", "", 0 }, { &ui_stages, "ui_stages", "0 0", 0 }, { &ui_dialog, "ui_dialog", "Text not set", 0 }, + { &ui_loading, "ui_loading", "0", 0 }, // the following variables are created in other parts of the system, // but we also reference them here @@ -318,25 +335,30 @@ static int cvarTableSize = sizeof( cvarTable ) / sizeof( cvarTable[0] ); CG_RegisterCvars ================= */ -void CG_RegisterCvars( void ) { - int i; +void CG_RegisterCvars( void ) +{ + int i; cvarTable_t *cv; - char var[MAX_TOKEN_CHARS]; + char var[ MAX_TOKEN_CHARS ]; - for ( i = 0, cv = cvarTable ; i < cvarTableSize ; i++, cv++ ) { + for( i = 0, cv = cvarTable; i < cvarTableSize; i++, cv++ ) + { trap_Cvar_Register( cv->vmCvar, cv->cvarName, cv->defaultString, cv->cvarFlags ); } + //repress standard Q3 console + trap_Cvar_Set( "con_notifytime", "-2" ); + // see if we are also running the server on this machine trap_Cvar_VariableStringBuffer( "sv_running", var, sizeof( var ) ); cgs.localServer = atoi( var ); forceModelModificationCount = cg_forceModel.modificationCount; - trap_Cvar_Register(NULL, "model", DEFAULT_MODEL, CVAR_USERINFO | CVAR_ARCHIVE ); - trap_Cvar_Register(NULL, "headmodel", DEFAULT_MODEL, CVAR_USERINFO | CVAR_ARCHIVE ); - trap_Cvar_Register(NULL, "team_model", DEFAULT_TEAM_MODEL, CVAR_USERINFO | CVAR_ARCHIVE ); - trap_Cvar_Register(NULL, "team_headmodel", DEFAULT_TEAM_HEAD, CVAR_USERINFO | CVAR_ARCHIVE ); + trap_Cvar_Register( NULL, "model", DEFAULT_MODEL, CVAR_USERINFO | CVAR_ARCHIVE ); + trap_Cvar_Register( NULL, "headmodel", DEFAULT_MODEL, CVAR_USERINFO | CVAR_ARCHIVE ); + trap_Cvar_Register( NULL, "team_model", DEFAULT_TEAM_MODEL, CVAR_USERINFO | CVAR_ARCHIVE ); + trap_Cvar_Register( NULL, "team_headmodel", DEFAULT_TEAM_HEAD, CVAR_USERINFO | CVAR_ARCHIVE ); } @@ -345,16 +367,19 @@ void CG_RegisterCvars( void ) { CG_ForceModelChange =================== */ -static void CG_ForceModelChange( void ) { +static void CG_ForceModelChange( void ) +{ int i; - for (i=0 ; i<MAX_CLIENTS ; i++) { + for( i = 0; i < MAX_CLIENTS; i++ ) + { const char *clientInfo; - clientInfo = CG_ConfigString( CS_PLAYERS+i ); - if ( !clientInfo[0] ) { + clientInfo = CG_ConfigString( CS_PLAYERS + i ); + + if( !clientInfo[ 0 ] ) continue; - } + CG_NewClientInfo( i ); } } @@ -365,51 +390,52 @@ static void CG_ForceModelChange( void ) { CG_UpdateCvars ================= */ -void CG_UpdateCvars( void ) { - int i; +void CG_UpdateCvars( void ) +{ + int i; cvarTable_t *cv; - for ( i = 0, cv = cvarTable ; i < cvarTableSize ; i++, cv++ ) { + for( i = 0, cv = cvarTable; i < cvarTableSize; i++, cv++ ) trap_Cvar_Update( cv->vmCvar ); - } // check for modications here // If team overlay is on, ask for updates from the server. If its off, // let the server know so we don't receive it - if ( drawTeamOverlayModificationCount != cg_drawTeamOverlay.modificationCount ) { + if( drawTeamOverlayModificationCount != cg_drawTeamOverlay.modificationCount ) + { drawTeamOverlayModificationCount = cg_drawTeamOverlay.modificationCount; - if ( cg_drawTeamOverlay.integer > 0 ) { + if( cg_drawTeamOverlay.integer > 0 ) trap_Cvar_Set( "teamoverlay", "1" ); - } else { + else trap_Cvar_Set( "teamoverlay", "0" ); - } - // FIXME E3 HACK - trap_Cvar_Set( "teamoverlay", "1" ); } // if force model changed - if ( forceModelModificationCount != cg_forceModel.modificationCount ) { + if( forceModelModificationCount != cg_forceModel.modificationCount ) + { forceModelModificationCount = cg_forceModel.modificationCount; - CG_ForceModelChange(); + CG_ForceModelChange( ); } } -int CG_CrosshairPlayer( void ) { - if ( cg.time > ( cg.crosshairClientTime + 1000 ) ) { +int CG_CrosshairPlayer( void ) +{ + if( cg.time > ( cg.crosshairClientTime + 1000 ) ) return -1; - } + return cg.crosshairClientNum; } -int CG_LastAttacker( void ) { - if ( !cg.attackerTime ) { +int CG_LastAttacker( void ) +{ + if( !cg.attackerTime ) return -1; - } - return cg.snap->ps.persistant[PERS_ATTACKER]; + + return cg.snap->ps.persistant[ PERS_ATTACKER ]; } void CG_RemoveConsoleLine( void ) @@ -433,13 +459,14 @@ void CG_RemoveConsoleLine( void ) cg.numConsoleLines--; } -void QDECL CG_Printf( const char *msg, ... ) { - va_list argptr; - char text[1024]; +void QDECL CG_Printf( const char *msg, ... ) +{ + va_list argptr; + char text[ 1024 ]; - va_start (argptr, msg); - vsprintf (text, msg, argptr); - va_end (argptr); + va_start( argptr, msg ); + vsprintf( text, msg, argptr ); + va_end( argptr ); //TA: team arena UI based console if( cg.numConsoleLines == MAX_CONSOLE_LINES ) @@ -456,13 +483,14 @@ void QDECL CG_Printf( const char *msg, ... ) { trap_Print( text ); } -void QDECL CG_Error( const char *msg, ... ) { - va_list argptr; - char text[1024]; +void QDECL CG_Error( const char *msg, ... ) +{ + va_list argptr; + char text[ 1024 ]; - va_start (argptr, msg); - vsprintf (text, msg, argptr); - va_end (argptr); + va_start( argptr, msg ); + vsprintf( text, msg, argptr ); + va_end( argptr ); trap_Error( text ); } @@ -470,15 +498,16 @@ void QDECL CG_Error( const char *msg, ... ) { #ifndef CGAME_HARD_LINKED // this is only here so the functions in q_shared.c and bg_*.c can link (FIXME) -void QDECL Com_Error( int level, const char *error, ... ) { - va_list argptr; +void QDECL Com_Error( int level, const char *error, ... ) +{ + va_list argptr; char text[1024]; - va_start (argptr, error); - vsprintf (text, error, argptr); - va_end (argptr); + va_start( argptr, error ); + vsprintf( text, error, argptr ); + va_end( argptr ); - CG_Error( "%s", text); + CG_Error( "%s", text ); } void QDECL Com_Printf( const char *msg, ... ) { @@ -513,8 +542,9 @@ void QDECL Com_Printf( const char *msg, ... ) { CG_Argv ================ */ -const char *CG_Argv( int arg ) { - static char buffer[MAX_STRING_CHARS]; +const char *CG_Argv( int arg ) +{ + static char buffer[ MAX_STRING_CHARS ]; trap_Argv( arg, buffer, sizeof( buffer ) ); @@ -531,7 +561,8 @@ CG_RegisterItemSounds The server says this item is used on this level ================= */ -static void CG_RegisterItemSounds( int itemNum ) { +static void CG_RegisterItemSounds( int itemNum ) +{ } @@ -542,125 +573,98 @@ CG_RegisterSounds called during a precache command ================= */ -static void CG_RegisterSounds( void ) { - int i; - char items[MAX_ITEMS+1]; - char name[MAX_QPATH]; +static void CG_RegisterSounds( void ) +{ + int i; + char items[ MAX_ITEMS + 1 ]; + char name[ MAX_QPATH ]; const char *soundName; // voice commands - cgs.media.oneMinuteSound = trap_S_RegisterSound( "sound/feedback/1_minute.wav", qtrue ); - cgs.media.fiveMinuteSound = trap_S_RegisterSound( "sound/feedback/5_minute.wav", qtrue ); - cgs.media.suddenDeathSound = trap_S_RegisterSound( "sound/feedback/sudden_death.wav", qtrue ); - cgs.media.oneFragSound = trap_S_RegisterSound( "sound/feedback/1_frag.wav", qtrue ); - cgs.media.twoFragSound = trap_S_RegisterSound( "sound/feedback/2_frags.wav", qtrue ); - cgs.media.threeFragSound = trap_S_RegisterSound( "sound/feedback/3_frags.wav", qtrue ); - cgs.media.count3Sound = trap_S_RegisterSound( "sound/feedback/three.wav", qtrue ); - cgs.media.count2Sound = trap_S_RegisterSound( "sound/feedback/two.wav", qtrue ); - cgs.media.count1Sound = trap_S_RegisterSound( "sound/feedback/one.wav", qtrue ); - cgs.media.countFightSound = trap_S_RegisterSound( "sound/feedback/fight.wav", qtrue ); - cgs.media.countPrepareSound = trap_S_RegisterSound( "sound/feedback/prepare.wav", qtrue ); - - cgs.media.alienStageTransition = trap_S_RegisterSound( "sound/announcements/overmindevolved.wav", qtrue ); - cgs.media.humanStageTransition = trap_S_RegisterSound( "sound/announcements/reinforcement.wav", qtrue ); + cgs.media.alienStageTransition = trap_S_RegisterSound( "sound/announcements/overmindevolved.wav", qtrue ); + cgs.media.humanStageTransition = trap_S_RegisterSound( "sound/announcements/reinforcement.wav", qtrue ); - cgs.media.tracerSound = trap_S_RegisterSound( "sound/weapons/machinegun/buletby1.wav", qfalse ); - cgs.media.selectSound = trap_S_RegisterSound( "sound/weapons/change.wav", qfalse ); - cgs.media.wearOffSound = trap_S_RegisterSound( "sound/items/wearoff.wav", qfalse ); - cgs.media.useNothingSound = trap_S_RegisterSound( "sound/items/use_nothing.wav", qfalse ); - cgs.media.gibSound = trap_S_RegisterSound( "sound/player/gibsplt1.wav", qfalse ); - cgs.media.gibBounce1Sound = trap_S_RegisterSound( "sound/player/gibimp1.wav", qfalse ); - cgs.media.gibBounce2Sound = trap_S_RegisterSound( "sound/player/gibimp2.wav", qfalse ); - cgs.media.gibBounce3Sound = trap_S_RegisterSound( "sound/player/gibimp3.wav", qfalse ); + cgs.media.tracerSound = trap_S_RegisterSound( "sound/weapons/machinegun/buletby1.wav", qfalse ); + cgs.media.selectSound = trap_S_RegisterSound( "sound/weapons/change.wav", qfalse ); + cgs.media.wearOffSound = trap_S_RegisterSound( "sound/items/wearoff.wav", qfalse ); + cgs.media.useNothingSound = trap_S_RegisterSound( "sound/items/use_nothing.wav", qfalse ); + cgs.media.gibSound = trap_S_RegisterSound( "sound/player/gibsplt1.wav", qfalse ); + cgs.media.gibBounce1Sound = trap_S_RegisterSound( "sound/player/gibimp1.wav", qfalse ); + cgs.media.gibBounce2Sound = trap_S_RegisterSound( "sound/player/gibimp2.wav", qfalse ); + cgs.media.gibBounce3Sound = trap_S_RegisterSound( "sound/player/gibimp3.wav", qfalse ); - cgs.media.teleInSound = trap_S_RegisterSound( "sound/world/telein.wav", qfalse ); - cgs.media.teleOutSound = trap_S_RegisterSound( "sound/world/teleout.wav", qfalse ); - cgs.media.respawnSound = trap_S_RegisterSound( "sound/items/respawn1.wav", qfalse ); + cgs.media.teleInSound = trap_S_RegisterSound( "sound/world/telein.wav", qfalse ); + cgs.media.teleOutSound = trap_S_RegisterSound( "sound/world/teleout.wav", qfalse ); + cgs.media.respawnSound = trap_S_RegisterSound( "sound/items/respawn1.wav", qfalse ); - cgs.media.noAmmoSound = trap_S_RegisterSound( "sound/weapons/noammo.wav", qfalse ); + cgs.media.noAmmoSound = trap_S_RegisterSound( "sound/weapons/noammo.wav", qfalse ); - cgs.media.talkSound = trap_S_RegisterSound( "sound/player/talk.wav", qfalse ); - cgs.media.landSound = trap_S_RegisterSound( "sound/player/land1.wav", qfalse); + cgs.media.talkSound = trap_S_RegisterSound( "sound/player/talk.wav", qfalse ); + cgs.media.landSound = trap_S_RegisterSound( "sound/player/land1.wav", qfalse ); - cgs.media.hitSound = trap_S_RegisterSound( "sound/feedback/hit.wav", qfalse ); + cgs.media.hitSound = trap_S_RegisterSound( "sound/feedback/hit.wav", qfalse ); - cgs.media.impressiveSound = trap_S_RegisterSound( "sound/feedback/impressive.wav", qtrue ); - cgs.media.excellentSound = trap_S_RegisterSound( "sound/feedback/excellent.wav", qtrue ); - cgs.media.deniedSound = trap_S_RegisterSound( "sound/feedback/denied.wav", qtrue ); - cgs.media.humiliationSound = trap_S_RegisterSound( "sound/feedback/humiliation.wav", qtrue ); - cgs.media.assistSound = trap_S_RegisterSound( "sound/feedback/assist.wav", qtrue ); - cgs.media.defendSound = trap_S_RegisterSound( "sound/feedback/defense.wav", qtrue ); + cgs.media.watrInSound = trap_S_RegisterSound( "sound/player/watr_in.wav", qfalse ); + cgs.media.watrOutSound = trap_S_RegisterSound( "sound/player/watr_out.wav", qfalse ); + cgs.media.watrUnSound = trap_S_RegisterSound( "sound/player/watr_un.wav", qfalse ); - cgs.media.takenLeadSound = trap_S_RegisterSound( "sound/feedback/takenlead.wav", qtrue); - cgs.media.tiedLeadSound = trap_S_RegisterSound( "sound/feedback/tiedlead.wav", qtrue); - cgs.media.lostLeadSound = trap_S_RegisterSound( "sound/feedback/lostlead.wav", qtrue); + cgs.media.jumpPadSound = trap_S_RegisterSound( "sound/world/jumppad.wav", qfalse ); - cgs.media.watrInSound = trap_S_RegisterSound( "sound/player/watr_in.wav", qfalse); - cgs.media.watrOutSound = trap_S_RegisterSound( "sound/player/watr_out.wav", qfalse); - cgs.media.watrUnSound = trap_S_RegisterSound( "sound/player/watr_un.wav", qfalse); - - cgs.media.jumpPadSound = trap_S_RegisterSound ("sound/world/jumppad.wav", qfalse ); - - for (i=0 ; i<4 ; i++) { - Com_sprintf (name, sizeof(name), "sound/player/footsteps/step%i.wav", i+1); - cgs.media.footsteps[FOOTSTEP_NORMAL][i] = trap_S_RegisterSound (name, qfalse); + for( i = 0; i < 4; i++ ) + { + Com_sprintf( name, sizeof( name ), "sound/player/footsteps/step%i.wav", i + 1 ); + cgs.media.footsteps[ FOOTSTEP_NORMAL ][ i ] = trap_S_RegisterSound( name, qfalse ); - Com_sprintf (name, sizeof(name), "sound/player/footsteps/boot%i.wav", i+1); - cgs.media.footsteps[FOOTSTEP_BOOT][i] = trap_S_RegisterSound (name, qfalse); + Com_sprintf( name, sizeof( name ), "sound/player/footsteps/boot%i.wav", i + 1 ); + cgs.media.footsteps[ FOOTSTEP_BOOT ][ i ] = trap_S_RegisterSound( name, qfalse ); - Com_sprintf (name, sizeof(name), "sound/player/footsteps/flesh%i.wav", i+1); - cgs.media.footsteps[FOOTSTEP_FLESH][i] = trap_S_RegisterSound (name, qfalse); + Com_sprintf( name, sizeof( name ), "sound/player/footsteps/flesh%i.wav", i + 1 ); + cgs.media.footsteps[ FOOTSTEP_FLESH ][ i ] = trap_S_RegisterSound( name, qfalse ); - Com_sprintf (name, sizeof(name), "sound/player/footsteps/mech%i.wav", i+1); - cgs.media.footsteps[FOOTSTEP_MECH][i] = trap_S_RegisterSound (name, qfalse); + Com_sprintf( name, sizeof( name ), "sound/player/footsteps/mech%i.wav", i + 1 ); + cgs.media.footsteps[ FOOTSTEP_MECH ][ i ] = trap_S_RegisterSound( name, qfalse ); - Com_sprintf (name, sizeof(name), "sound/player/footsteps/energy%i.wav", i+1); - cgs.media.footsteps[FOOTSTEP_ENERGY][i] = trap_S_RegisterSound (name, qfalse); + Com_sprintf( name, sizeof( name ), "sound/player/footsteps/energy%i.wav", i + 1 ); + cgs.media.footsteps[ FOOTSTEP_ENERGY ][ i ] = trap_S_RegisterSound( name, qfalse ); - Com_sprintf (name, sizeof(name), "sound/player/footsteps/splash%i.wav", i+1); - cgs.media.footsteps[FOOTSTEP_SPLASH][i] = trap_S_RegisterSound (name, qfalse); + Com_sprintf( name, sizeof( name ), "sound/player/footsteps/splash%i.wav", i + 1 ); + cgs.media.footsteps[ FOOTSTEP_SPLASH ][ i ] = trap_S_RegisterSound( name, qfalse ); - Com_sprintf (name, sizeof(name), "sound/player/footsteps/clank%i.wav", i+1); - cgs.media.footsteps[FOOTSTEP_METAL][i] = trap_S_RegisterSound (name, qfalse); + Com_sprintf( name, sizeof( name ), "sound/player/footsteps/clank%i.wav", i + 1 ); + cgs.media.footsteps[ FOOTSTEP_METAL ][ i ] = trap_S_RegisterSound( name, qfalse ); } // only register the items that the server says we need strcpy( items, CG_ConfigString( CS_ITEMS ) ); - for ( i = 1 ; i < MAX_SOUNDS ; i++ ) { - soundName = CG_ConfigString( CS_SOUNDS+i ); - if ( !soundName[0] ) { + for( i = 1 ; i < MAX_SOUNDS ; i++ ) + { + soundName = CG_ConfigString( CS_SOUNDS + i ); + + if( !soundName[ 0 ] ) break; - } - if ( soundName[0] == '*' ) { + + if( soundName[ 0 ] == '*' ) continue; // custom sound - } - cgs.gameSounds[i] = trap_S_RegisterSound( soundName, qfalse ); + + cgs.gameSounds[ i ] = trap_S_RegisterSound( soundName, qfalse ); } //TA: cgs.media.jetpackDescendSound = trap_S_RegisterSound( "sound/upgrades/jetpack/low.wav", qfalse ); - cgs.media.jetpackIdleSound = trap_S_RegisterSound( "sound/upgrades/jetpack/idle.wav", qfalse ); - cgs.media.jetpackAscendSound = trap_S_RegisterSound( "sound/upgrades/jetpack/hi.wav", qfalse ); + cgs.media.jetpackIdleSound = trap_S_RegisterSound( "sound/upgrades/jetpack/idle.wav", qfalse ); + cgs.media.jetpackAscendSound = trap_S_RegisterSound( "sound/upgrades/jetpack/hi.wav", qfalse ); // FIXME: only needed with item - cgs.media.flightSound = trap_S_RegisterSound( "sound/items/flight.wav", qfalse ); - cgs.media.medkitSound = trap_S_RegisterSound ("sound/items/use_medkit.wav", qfalse); - cgs.media.quadSound = trap_S_RegisterSound("sound/items/damage3.wav", qfalse); - cgs.media.sfx_ric1 = trap_S_RegisterSound ("sound/weapons/machinegun/ric1.wav", qfalse); - cgs.media.sfx_ric2 = trap_S_RegisterSound ("sound/weapons/machinegun/ric2.wav", qfalse); - cgs.media.sfx_ric3 = trap_S_RegisterSound ("sound/weapons/machinegun/ric3.wav", qfalse); - cgs.media.sfx_railg = trap_S_RegisterSound ("sound/weapons/railgun/railgf1a.wav", qfalse); - cgs.media.sfx_rockexp = trap_S_RegisterSound ("sound/weapons/rocket/rocklx1a.wav", qfalse); - cgs.media.sfx_plasmaexp = trap_S_RegisterSound ("sound/weapons/plasma/plasmx1a.wav", qfalse); - cgs.media.sfx_flamerexp = trap_S_RegisterSound ("sound/weapons/flamer/fireimpc.wav", qfalse); - - cgs.media.regenSound = trap_S_RegisterSound("sound/items/regen.wav", qfalse); - cgs.media.protectSound = trap_S_RegisterSound("sound/items/protect3.wav", qfalse); - cgs.media.n_healthSound = trap_S_RegisterSound("sound/items/n_health.wav", qfalse ); - cgs.media.hgrenb1aSound = trap_S_RegisterSound("sound/weapons/grenade/hgrenb1a.wav", qfalse); - cgs.media.hgrenb2aSound = trap_S_RegisterSound("sound/weapons/grenade/hgrenb2a.wav", qfalse); + cgs.media.sfx_ric1 = trap_S_RegisterSound( "sound/weapons/machinegun/ric1.wav", qfalse ); + cgs.media.sfx_ric2 = trap_S_RegisterSound( "sound/weapons/machinegun/ric2.wav", qfalse ); + cgs.media.sfx_ric3 = trap_S_RegisterSound( "sound/weapons/machinegun/ric3.wav", qfalse ); + cgs.media.sfx_plasmaexp = trap_S_RegisterSound( "sound/weapons/plasma/plasmx1a.wav", qfalse ); + cgs.media.sfx_flamerexp = trap_S_RegisterSound( "sound/weapons/flamer/fireimpc.wav", qfalse ); + + cgs.media.hgrenb1aSound = trap_S_RegisterSound( "sound/weapons/grenade/hgrenb1a.wav", qfalse ); + cgs.media.hgrenb2aSound = trap_S_RegisterSound( "sound/weapons/grenade/hgrenb2a.wav", qfalse ); } @@ -674,10 +678,12 @@ CG_RegisterGraphics This function may execute for a couple of minutes with a slow disk. ================= */ -static void CG_RegisterGraphics( void ) { - int i; - char items[MAX_ITEMS+1]; - static char *sb_nums[11] = { +static void CG_RegisterGraphics( void ) +{ + int i; + char items[ MAX_ITEMS + 1 ]; + static char *sb_nums[ 11 ] = + { "gfx/2d/numbers/zero_32b", "gfx/2d/numbers/one_32b", "gfx/2d/numbers/two_32b", @@ -693,144 +699,98 @@ static void CG_RegisterGraphics( void ) { // clear any references to old media memset( &cg.refdef, 0, sizeof( cg.refdef ) ); - trap_R_ClearScene(); + trap_R_ClearScene( ); trap_R_LoadWorldMap( cgs.mapname ); CG_UpdateMediaFraction( 0.66f ); - for ( i=0 ; i<11 ; i++) { - cgs.media.numberShaders[i] = trap_R_RegisterShader( sb_nums[i] ); - } - - cgs.media.botSkillShaders[0] = trap_R_RegisterShader( "menu/art/skill1.tga" ); - cgs.media.botSkillShaders[1] = trap_R_RegisterShader( "menu/art/skill2.tga" ); - cgs.media.botSkillShaders[2] = trap_R_RegisterShader( "menu/art/skill3.tga" ); - cgs.media.botSkillShaders[3] = trap_R_RegisterShader( "menu/art/skill4.tga" ); - cgs.media.botSkillShaders[4] = trap_R_RegisterShader( "menu/art/skill5.tga" ); + for( i = 0; i < 11; i++ ) + cgs.media.numberShaders[ i ] = trap_R_RegisterShader( sb_nums[ i ] ); - cgs.media.viewBloodShader = trap_R_RegisterShader( "viewBloodBlend" ); + cgs.media.viewBloodShader = trap_R_RegisterShader( "viewBloodBlend" ); - cgs.media.deferShader = trap_R_RegisterShaderNoMip( "gfx/2d/defer.tga" ); + cgs.media.deferShader = trap_R_RegisterShaderNoMip( "gfx/2d/defer.tga" ); - cgs.media.scoreboardName = trap_R_RegisterShaderNoMip( "menu/tab/name.tga" ); - cgs.media.scoreboardPing = trap_R_RegisterShaderNoMip( "menu/tab/ping.tga" ); - cgs.media.scoreboardScore = trap_R_RegisterShaderNoMip( "menu/tab/score.tga" ); - cgs.media.scoreboardTime = trap_R_RegisterShaderNoMip( "menu/tab/time.tga" ); - - cgs.media.smokePuffShader = trap_R_RegisterShader( "smokePuff" ); - cgs.media.smokePuffRageProShader = trap_R_RegisterShader( "smokePuffRagePro" ); - cgs.media.shotgunSmokePuffShader = trap_R_RegisterShader( "shotgunSmokePuff" ); - cgs.media.plasmaBallShader = trap_R_RegisterShader( "sprites/plasma1" ); - cgs.media.bloodTrailShader = trap_R_RegisterShader( "bloodTrail" ); - cgs.media.lagometerShader = trap_R_RegisterShader("lagometer" ); - cgs.media.connectionShader = trap_R_RegisterShader( "disconnected" ); + cgs.media.smokePuffShader = trap_R_RegisterShader( "smokePuff" ); + cgs.media.smokePuffRageProShader = trap_R_RegisterShader( "smokePuffRagePro" ); + cgs.media.shotgunSmokePuffShader = trap_R_RegisterShader( "shotgunSmokePuff" ); + cgs.media.plasmaBallShader = trap_R_RegisterShader( "sprites/plasma1" ); + cgs.media.bloodTrailShader = trap_R_RegisterShader( "bloodTrail" ); + cgs.media.connectionShader = trap_R_RegisterShader( "disconnected" ); //TA: extra stuff - cgs.media.explosionShader = trap_R_RegisterShader( "grenadeExplosion" ); - cgs.media.greenBloodTrailShader = trap_R_RegisterShader( "greenBloodTrail" ); + cgs.media.explosionShader = trap_R_RegisterShader( "grenadeExplosion" ); + cgs.media.greenBloodTrailShader = trap_R_RegisterShader( "greenBloodTrail" ); cgs.media.greenBloodExplosionShader = trap_R_RegisterShader( "greenBloodExplosion" ); - cgs.media.greenBloodMarkShader = trap_R_RegisterShader( "greenBloodMark" ); - cgs.media.explosionTrailShader = trap_R_RegisterShader( "explosionTrail" ); - cgs.media.poisonCloudShader = trap_R_RegisterShader( "poisonCloud" ); + cgs.media.greenBloodMarkShader = trap_R_RegisterShader( "greenBloodMark" ); + cgs.media.explosionTrailShader = trap_R_RegisterShader( "explosionTrail" ); + cgs.media.poisonCloudShader = trap_R_RegisterShader( "poisonCloud" ); for( i = 0; i < 32; i++ ) cgs.media.flameShader[ i ] = trap_R_RegisterShader( va( "fireball%d", i + 1 ) ); - /*cgs.media.creepShader = trap_R_RegisterShader( "creep" );*/ - - cgs.media.scannerBlipShader = trap_R_RegisterShader( "gfx/2d/droidhealth" ); - cgs.media.scannerLineShader = trap_R_RegisterShader( "white" ); + cgs.media.scannerBlipShader = trap_R_RegisterShader( "gfx/2d/blip" ); + cgs.media.scannerLineShader = trap_R_RegisterShader( "white" ); /*cgs.media.scannerShader = trap_R_RegisterShader( "gfx/2d/scanner" );*/ - cgs.media.waterBubbleShader = trap_R_RegisterShader( "waterBubble" ); + cgs.media.waterBubbleShader = trap_R_RegisterShader( "waterBubble" ); - cgs.media.tracerShader = trap_R_RegisterShader( "gfx/misc/tracer" ); - cgs.media.selectShader = trap_R_RegisterShader( "gfx/2d/select" ); + cgs.media.tracerShader = trap_R_RegisterShader( "gfx/misc/tracer" ); + cgs.media.selectShader = trap_R_RegisterShader( "gfx/2d/select" ); - for ( i = 0 ; i < NUM_CROSSHAIRS ; i++ ) { - cgs.media.crosshairShader[i] = trap_R_RegisterShader( va("gfx/2d/crosshair%c", 'a'+i) ); - } + for( i = 0 ; i < NUM_CROSSHAIRS ; i++ ) + cgs.media.crosshairShader[ i ] = trap_R_RegisterShader( va( "gfx/2d/crosshair%c", 'a' + i ) ); - cgs.media.backTileShader = trap_R_RegisterShader( "gfx/2d/backtile" ); - cgs.media.noammoShader = trap_R_RegisterShader( "icons/noammo" ); + cgs.media.backTileShader = trap_R_RegisterShader( "gfx/2d/backtile" ); + cgs.media.noammoShader = trap_R_RegisterShader( "icons/noammo" ); + cgs.media.friendShader = trap_R_RegisterShader( "sprites/foe" ); + //TA: building shaders - cgs.media.greenBuildShader = trap_R_RegisterShader("gfx/2d/greenbuild" ); - cgs.media.redBuildShader = trap_R_RegisterShader("gfx/2d/redbuild" ); - cgs.media.noPowerShader = trap_R_RegisterShader("gfx/2d/nopower" ); - - // powerup shaders - cgs.media.quadShader = trap_R_RegisterShader("powerups/quad" ); - cgs.media.quadWeaponShader = trap_R_RegisterShader("powerups/quadWeapon" ); - cgs.media.battleSuitShader = trap_R_RegisterShader("powerups/battleSuit" ); - cgs.media.battleWeaponShader = trap_R_RegisterShader("powerups/battleWeapon" ); - cgs.media.invisShader = trap_R_RegisterShader("powerups/invisibility" ); - cgs.media.regenShader = trap_R_RegisterShader("powerups/regen" ); - cgs.media.hastePuffShader = trap_R_RegisterShader("hasteSmokePuff" ); - - //TA: screenfades - cgs.media.humanNV = trap_R_RegisterShader( "humanNV" ); - cgs.media.humanTorch8 = trap_R_RegisterShader( "humanTorch8" ); - cgs.media.humanTorch7 = trap_R_RegisterShader( "humanTorch7" ); - cgs.media.humanTorch6 = trap_R_RegisterShader( "humanTorch6" ); - cgs.media.humanTorch5 = trap_R_RegisterShader( "humanTorch5" ); - cgs.media.humanTorch4 = trap_R_RegisterShader( "humanTorch4" ); - cgs.media.humanTorch3 = trap_R_RegisterShader( "humanTorch3" ); - cgs.media.humanTorch2 = trap_R_RegisterShader( "humanTorch2" ); - cgs.media.humanTorch1 = trap_R_RegisterShader( "humanTorch1" ); - cgs.media.alienHealth = trap_R_RegisterShader( "gfx/2d/droidhealth.tga" ); - - cgs.media.armorModel = trap_R_RegisterModel( "models/powerups/armor/armor_yel.md3" ); - cgs.media.armorIcon = trap_R_RegisterShaderNoMip( "icons/iconr_yellow" ); - - cgs.media.machinegunBrassModel = trap_R_RegisterModel( "models/weapons2/shells/m_shell.md3" ); - cgs.media.shotgunBrassModel = trap_R_RegisterModel( "models/weapons2/shells/s_shell.md3" ); - - cgs.media.gibAbdomen = trap_R_RegisterModel( "models/gibs/abdomen.md3" ); - cgs.media.gibArm = trap_R_RegisterModel( "models/gibs/arm.md3" ); - cgs.media.gibChest = trap_R_RegisterModel( "models/gibs/chest.md3" ); - cgs.media.gibFist = trap_R_RegisterModel( "models/gibs/fist.md3" ); - cgs.media.gibFoot = trap_R_RegisterModel( "models/gibs/foot.md3" ); - cgs.media.gibForearm = trap_R_RegisterModel( "models/gibs/forearm.md3" ); - cgs.media.gibIntestine = trap_R_RegisterModel( "models/gibs/intestine.md3" ); - cgs.media.gibLeg = trap_R_RegisterModel( "models/gibs/leg.md3" ); - cgs.media.gibSkull = trap_R_RegisterModel( "models/gibs/skull.md3" ); - cgs.media.gibBrain = trap_R_RegisterModel( "models/gibs/brain.md3" ); - - cgs.media.metalGib1 = trap_R_RegisterModel( "models/fx/metal_gibs/m_gib1.md3" ); - cgs.media.metalGib2 = trap_R_RegisterModel( "models/fx/metal_gibs/m_gib2.md3" ); - cgs.media.metalGib3 = trap_R_RegisterModel( "models/fx/metal_gibs/m_gib3.md3" ); - cgs.media.metalGib4 = trap_R_RegisterModel( "models/fx/metal_gibs/m_gib4.md3" ); - cgs.media.metalGib5 = trap_R_RegisterModel( "models/fx/metal_gibs/m_gib5.md3" ); - cgs.media.metalGib6 = trap_R_RegisterModel( "models/fx/metal_gibs/m_gib6.md3" ); - cgs.media.metalGib7 = trap_R_RegisterModel( "models/fx/metal_gibs/m_gib7.md3" ); - cgs.media.metalGib8 = trap_R_RegisterModel( "models/fx/metal_gibs/m_gib8.md3" ); + cgs.media.greenBuildShader = trap_R_RegisterShader("gfx/2d/greenbuild" ); + cgs.media.redBuildShader = trap_R_RegisterShader("gfx/2d/redbuild" ); + cgs.media.noPowerShader = trap_R_RegisterShader("gfx/2d/nopower" ); + + cgs.media.machinegunBrassModel = trap_R_RegisterModel( "models/weapons2/shells/m_shell.md3" ); + cgs.media.shotgunBrassModel = trap_R_RegisterModel( "models/weapons2/shells/s_shell.md3" ); + + cgs.media.gibAbdomen = trap_R_RegisterModel( "models/gibs/abdomen.md3" ); + cgs.media.gibArm = trap_R_RegisterModel( "models/gibs/arm.md3" ); + cgs.media.gibChest = trap_R_RegisterModel( "models/gibs/chest.md3" ); + cgs.media.gibFist = trap_R_RegisterModel( "models/gibs/fist.md3" ); + cgs.media.gibFoot = trap_R_RegisterModel( "models/gibs/foot.md3" ); + cgs.media.gibForearm = trap_R_RegisterModel( "models/gibs/forearm.md3" ); + cgs.media.gibIntestine = trap_R_RegisterModel( "models/gibs/intestine.md3" ); + cgs.media.gibLeg = trap_R_RegisterModel( "models/gibs/leg.md3" ); + cgs.media.gibSkull = trap_R_RegisterModel( "models/gibs/skull.md3" ); + cgs.media.gibBrain = trap_R_RegisterModel( "models/gibs/brain.md3" ); + + cgs.media.metalGib1 = trap_R_RegisterModel( "models/fx/metal_gibs/m_gib1.md3" ); + cgs.media.metalGib2 = trap_R_RegisterModel( "models/fx/metal_gibs/m_gib2.md3" ); + cgs.media.metalGib3 = trap_R_RegisterModel( "models/fx/metal_gibs/m_gib3.md3" ); + cgs.media.metalGib4 = trap_R_RegisterModel( "models/fx/metal_gibs/m_gib4.md3" ); + cgs.media.metalGib5 = trap_R_RegisterModel( "models/fx/metal_gibs/m_gib5.md3" ); + cgs.media.metalGib6 = trap_R_RegisterModel( "models/fx/metal_gibs/m_gib6.md3" ); + cgs.media.metalGib7 = trap_R_RegisterModel( "models/fx/metal_gibs/m_gib7.md3" ); + cgs.media.metalGib8 = trap_R_RegisterModel( "models/fx/metal_gibs/m_gib8.md3" ); - cgs.media.gibSpark1 = trap_R_RegisterShader( "models/fx/metal_gibs/spark.jpg" ); - cgs.media.gibSpark2 = trap_R_RegisterShader( "models/fx/metal_gibs/spark2.jpg" ); + cgs.media.gibSpark1 = trap_R_RegisterShader( "models/fx/metal_gibs/spark.jpg" ); + cgs.media.gibSpark2 = trap_R_RegisterShader( "models/fx/metal_gibs/spark2.jpg" ); - cgs.media.smoke2 = trap_R_RegisterModel( "models/weapons2/shells/s_shell.md3" ); - - cgs.media.balloonShader = trap_R_RegisterShader( "sprites/balloon3" ); + cgs.media.smoke2 = trap_R_RegisterModel( "models/weapons2/shells/s_shell.md3" ); - cgs.media.bloodExplosionShader = trap_R_RegisterShader( "bloodExplosion" ); + cgs.media.balloonShader = trap_R_RegisterShader( "sprites/balloon3" ); - cgs.media.bulletFlashModel = trap_R_RegisterModel("models/weaphits/bullet.md3"); - cgs.media.ringFlashModel = trap_R_RegisterModel("models/weaphits/ring02.md3"); - cgs.media.dishFlashModel = trap_R_RegisterModel("models/weaphits/boom01.md3"); - cgs.media.teleportEffectModel = trap_R_RegisterModel( "models/misc/telep.md3" ); - cgs.media.teleportEffectShader = trap_R_RegisterShader( "teleportEffect" ); + cgs.media.bloodExplosionShader = trap_R_RegisterShader( "bloodExplosion" ); - cgs.media.medalImpressive = trap_R_RegisterShaderNoMip( "medal_impressive" ); - cgs.media.medalExcellent = trap_R_RegisterShaderNoMip( "medal_excellent" ); - cgs.media.medalGauntlet = trap_R_RegisterShaderNoMip( "medal_gauntlet" ); - cgs.media.medalDefend = trap_R_RegisterShaderNoMip( "medal_defend" ); - cgs.media.medalAssist = trap_R_RegisterShaderNoMip( "medal_assist" ); - cgs.media.medalCapture = trap_R_RegisterShaderNoMip( "medal_capture" ); + cgs.media.bulletFlashModel = trap_R_RegisterModel( "models/weaphits/bullet.md3" ); + cgs.media.ringFlashModel = trap_R_RegisterModel( "models/weaphits/ring02.md3" ); + cgs.media.dishFlashModel = trap_R_RegisterModel( "models/weaphits/boom01.md3" ); + cgs.media.teleportEffectModel = trap_R_RegisterModel( "models/misc/telep.md3" ); + cgs.media.teleportEffectShader = trap_R_RegisterShader( "teleportEffect" ); CG_UpdateMediaFraction( 0.7f ); - memset( cg_items, 0, sizeof( cg_items ) ); memset( cg_weapons, 0, sizeof( cg_weapons ) ); memset( cg_upgrades, 0, sizeof( cg_upgrades ) ); @@ -838,51 +798,58 @@ static void CG_RegisterGraphics( void ) { strcpy( items, CG_ConfigString( CS_ITEMS) ); // wall marks - cgs.media.bulletMarkShader = trap_R_RegisterShader( "gfx/damage/bullet_mrk" ); - cgs.media.burnMarkShader = trap_R_RegisterShader( "gfx/damage/burn_med_mrk" ); - cgs.media.holeMarkShader = trap_R_RegisterShader( "gfx/damage/hole_lg_mrk" ); - cgs.media.energyMarkShader = trap_R_RegisterShader( "gfx/damage/plasma_mrk" ); - cgs.media.shadowMarkShader = trap_R_RegisterShader( "markShadow" ); - cgs.media.wakeMarkShader = trap_R_RegisterShader( "wake" ); - cgs.media.bloodMarkShader = trap_R_RegisterShader( "bloodMark" ); + cgs.media.bulletMarkShader = trap_R_RegisterShader( "gfx/damage/bullet_mrk" ); + cgs.media.burnMarkShader = trap_R_RegisterShader( "gfx/damage/burn_med_mrk" ); + cgs.media.holeMarkShader = trap_R_RegisterShader( "gfx/damage/hole_lg_mrk" ); + cgs.media.energyMarkShader = trap_R_RegisterShader( "gfx/damage/plasma_mrk" ); + cgs.media.shadowMarkShader = trap_R_RegisterShader( "markShadow" ); + cgs.media.wakeMarkShader = trap_R_RegisterShader( "wake" ); + cgs.media.bloodMarkShader = trap_R_RegisterShader( "bloodMark" ); // register the inline models - cgs.numInlineModels = trap_CM_NumInlineModels(); - for ( i = 1 ; i < cgs.numInlineModels ; i++ ) { - char name[10]; - vec3_t mins, maxs; - int j; - - Com_sprintf( name, sizeof(name), "*%i", i ); - cgs.inlineDrawModel[i] = trap_R_RegisterModel( name ); - trap_R_ModelBounds( cgs.inlineDrawModel[i], mins, maxs ); - for ( j = 0 ; j < 3 ; j++ ) { - cgs.inlineModelMidpoints[i][j] = mins[j] + 0.5 * ( maxs[j] - mins[j] ); - } + cgs.numInlineModels = trap_CM_NumInlineModels( ); + + for( i = 1; i < cgs.numInlineModels; i++ ) + { + char name[ 10 ]; + vec3_t mins, maxs; + int j; + + Com_sprintf( name, sizeof( name ), "*%i", i ); + + cgs.inlineDrawModel[ i ] = trap_R_RegisterModel( name ); + trap_R_ModelBounds( cgs.inlineDrawModel[ i ], mins, maxs ); + + for( j = 0 ; j < 3 ; j++ ) + cgs.inlineModelMidpoints[ i ][ j ] = mins[ j ] + 0.5 * ( maxs[ j ] - mins[ j ] ); } // register all the server specified models - for (i=1 ; i<MAX_MODELS ; i++) { - const char *modelName; + for( i = 1; i < MAX_MODELS; i++ ) + { + const char *modelName; modelName = CG_ConfigString( CS_MODELS+i ); - if ( !modelName[0] ) { + + if( !modelName[ 0 ] ) break; - } - cgs.gameModels[i] = trap_R_RegisterModel( modelName ); + + cgs.gameModels[ i ] = trap_R_RegisterModel( modelName ); } CG_UpdateMediaFraction( 0.8f ); // register all the server specified shaders - for (i=1 ; i<MAX_SHADERS ; i++) { - const char *shaderName; + for( i = 1; i < MAX_SHADERS; i++ ) + { + const char *shaderName; shaderName = CG_ConfigString( CS_SHADERS+i ); - if ( !shaderName[0] ) { + + if( !shaderName[ 0 ] ) break; - } - cgs.gameShaders[i] = trap_R_RegisterShader( shaderName ); + + cgs.gameShaders[ i ] = trap_R_RegisterShader( shaderName ); } } @@ -893,16 +860,22 @@ CG_BuildSpectatorString ======================= */ -void CG_BuildSpectatorString() { +void CG_BuildSpectatorString( void ) +{ int i; - cg.spectatorList[0] = 0; - for (i = 0; i < MAX_CLIENTS; i++) { - if (cgs.clientinfo[i].infoValid && cgs.clientinfo[i].team == PTE_NONE ) { - Q_strcat(cg.spectatorList, sizeof(cg.spectatorList), va("%s ", cgs.clientinfo[i].name)); - } + + cg.spectatorList[ 0 ] = 0; + + for( i = 0; i < MAX_CLIENTS; i++ ) + { + if( cgs.clientinfo[ i ].infoValid && cgs.clientinfo[ i ].team == PTE_NONE ) + Q_strcat( cg.spectatorList, sizeof( cg.spectatorList ), va( "%s ", cgs.clientinfo[ i ].name ) ); } - i = strlen(cg.spectatorList); - if (i != cg.spectatorLen) { + + i = strlen( cg.spectatorList ); + + if( i != cg.spectatorLen ) + { cg.spectatorLen = i; cg.spectatorWidth = -1; } @@ -928,7 +901,7 @@ static void CG_RegisterClients( void ) const char *clientInfo; clientInfo = CG_ConfigString( CS_PRECACHES + i ); - if ( !clientInfo[0] ) + if( !clientInfo[0] ) continue; CG_PrecacheClientInfo( i ); @@ -949,7 +922,7 @@ static void CG_RegisterClients( void ) CG_NewClientInfo( i ); } - CG_BuildSpectatorString(); + CG_BuildSpectatorString( ); } //=========================================================================== @@ -959,10 +932,11 @@ static void CG_RegisterClients( void ) CG_ConfigString ================= */ -const char *CG_ConfigString( int index ) { - if ( index < 0 || index >= MAX_CONFIGSTRINGS ) { +const char *CG_ConfigString( int index ) +{ + if( index < 0 || index >= MAX_CONFIGSTRINGS ) CG_Error( "CG_ConfigString: bad index: %i", index ); - } + return cgs.gameState.stringData + cgs.gameState.stringOffsets[ index ]; } @@ -974,9 +948,10 @@ CG_StartMusic ====================== */ -void CG_StartMusic( void ) { +void CG_StartMusic( void ) +{ char *s; - char parm1[MAX_QPATH], parm2[MAX_QPATH]; + char parm1[ MAX_QPATH ], parm2[ MAX_QPATH ]; // start the background music s = (char *)CG_ConfigString( CS_MUSIC ); @@ -992,18 +967,24 @@ void CG_StartMusic( void ) { // new hud stuff ( mission pack ) // ============================== // -char *CG_GetMenuBuffer(const char *filename) { - int len; +char *CG_GetMenuBuffer( const char *filename ) +{ + int len; fileHandle_t f; - static char buf[MAX_MENUFILE]; + static char buf[ MAX_MENUFILE ]; len = trap_FS_FOpenFile( filename, &f, FS_READ ); - if ( !f ) { + + if( !f ) + { trap_Print( va( S_COLOR_RED "menu file not found: %s, using default\n", filename ) ); return NULL; } - if ( len >= MAX_MENUFILE ) { - trap_Print( va( S_COLOR_RED "menu file too large: %s is %i, max allowed is %i", filename, len, MAX_MENUFILE ) ); + + if( len >= MAX_MENUFILE ) + { + trap_Print( va( S_COLOR_RED "menu file too large: %s is %i, max allowed is %i", + filename, len, MAX_MENUFILE ) ); trap_FS_FCloseFile( f ); return NULL; } @@ -1015,167 +996,190 @@ char *CG_GetMenuBuffer(const char *filename) { return buf; } -qboolean CG_Asset_Parse(int handle) { +qboolean CG_Asset_Parse( int handle ) +{ pc_token_t token; const char *tempStr; - if (!trap_PC_ReadToken(handle, &token)) + if( !trap_PC_ReadToken( handle, &token ) ) return qfalse; - if (Q_stricmp(token.string, "{") != 0) { + + if( Q_stricmp( token.string, "{" ) != 0 ) return qfalse; - } - while ( 1 ) { - if (!trap_PC_ReadToken(handle, &token)) + while( 1 ) + { + if( !trap_PC_ReadToken( handle, &token ) ) return qfalse; - if (Q_stricmp(token.string, "}") == 0) { + if( Q_stricmp( token.string, "}" ) == 0 ) return qtrue; - } // font - if (Q_stricmp(token.string, "font") == 0) { + if( Q_stricmp( token.string, "font" ) == 0 ) + { int pointSize; - if (!PC_String_Parse(handle, &tempStr) || !PC_Int_Parse(handle, &pointSize)) { + + if( !PC_String_Parse( handle, &tempStr ) || !PC_Int_Parse( handle, &pointSize ) ) return qfalse; - } - cgDC.registerFont(tempStr, pointSize, &cgDC.Assets.textFont); + + cgDC.registerFont( tempStr, pointSize, &cgDC.Assets.textFont ); continue; } // smallFont - if (Q_stricmp(token.string, "smallFont") == 0) { + if( Q_stricmp( token.string, "smallFont" ) == 0 ) + { int pointSize; - if (!PC_String_Parse(handle, &tempStr) || !PC_Int_Parse(handle, &pointSize)) { + + if( !PC_String_Parse( handle, &tempStr ) || !PC_Int_Parse( handle, &pointSize ) ) return qfalse; - } - cgDC.registerFont(tempStr, pointSize, &cgDC.Assets.smallFont); + + cgDC.registerFont( tempStr, pointSize, &cgDC.Assets.smallFont ); continue; } // font - if (Q_stricmp(token.string, "bigfont") == 0) { + if( Q_stricmp( token.string, "bigfont" ) == 0 ) + { int pointSize; - if (!PC_String_Parse(handle, &tempStr) || !PC_Int_Parse(handle, &pointSize)) { + + if( !PC_String_Parse( handle, &tempStr ) || !PC_Int_Parse( handle, &pointSize ) ) return qfalse; - } - cgDC.registerFont(tempStr, pointSize, &cgDC.Assets.bigFont); + + cgDC.registerFont( tempStr, pointSize, &cgDC.Assets.bigFont ); continue; } // gradientbar - if (Q_stricmp(token.string, "gradientbar") == 0) { - if (!PC_String_Parse(handle, &tempStr)) { + if( Q_stricmp( token.string, "gradientbar" ) == 0 ) + { + if( !PC_String_Parse( handle, &tempStr ) ) return qfalse; - } - cgDC.Assets.gradientBar = trap_R_RegisterShaderNoMip(tempStr); + + cgDC.Assets.gradientBar = trap_R_RegisterShaderNoMip( tempStr ); continue; } // enterMenuSound - if (Q_stricmp(token.string, "menuEnterSound") == 0) { - if (!PC_String_Parse(handle, &tempStr)) { + if( Q_stricmp( token.string, "menuEnterSound" ) == 0 ) + { + if( !PC_String_Parse( handle, &tempStr ) ) return qfalse; - } + cgDC.Assets.menuEnterSound = trap_S_RegisterSound( tempStr, qfalse ); continue; } // exitMenuSound - if (Q_stricmp(token.string, "menuExitSound") == 0) { - if (!PC_String_Parse(handle, &tempStr)) { + if( Q_stricmp( token.string, "menuExitSound" ) == 0 ) + { + if( !PC_String_Parse( handle, &tempStr ) ) return qfalse; - } + cgDC.Assets.menuExitSound = trap_S_RegisterSound( tempStr, qfalse ); continue; } // itemFocusSound - if (Q_stricmp(token.string, "itemFocusSound") == 0) { - if (!PC_String_Parse(handle, &tempStr)) { + if( Q_stricmp( token.string, "itemFocusSound" ) == 0 ) + { + if( !PC_String_Parse( handle, &tempStr ) ) return qfalse; - } + cgDC.Assets.itemFocusSound = trap_S_RegisterSound( tempStr, qfalse ); continue; } // menuBuzzSound - if (Q_stricmp(token.string, "menuBuzzSound") == 0) { - if (!PC_String_Parse(handle, &tempStr)) { + if( Q_stricmp( token.string, "menuBuzzSound" ) == 0 ) + { + if( !PC_String_Parse( handle, &tempStr ) ) return qfalse; - } + cgDC.Assets.menuBuzzSound = trap_S_RegisterSound( tempStr, qfalse ); continue; } - if (Q_stricmp(token.string, "cursor") == 0) { - if (!PC_String_Parse(handle, &cgDC.Assets.cursorStr)) { + if( Q_stricmp( token.string, "cursor" ) == 0 ) + { + if( !PC_String_Parse( handle, &cgDC.Assets.cursorStr ) ) return qfalse; - } - cgDC.Assets.cursor = trap_R_RegisterShaderNoMip( cgDC.Assets.cursorStr); + + cgDC.Assets.cursor = trap_R_RegisterShaderNoMip( cgDC.Assets.cursorStr ); continue; } - if (Q_stricmp(token.string, "fadeClamp") == 0) { - if (!PC_Float_Parse(handle, &cgDC.Assets.fadeClamp)) { + if( Q_stricmp( token.string, "fadeClamp" ) == 0 ) + { + if( !PC_Float_Parse( handle, &cgDC.Assets.fadeClamp ) ) return qfalse; - } + continue; } - if (Q_stricmp(token.string, "fadeCycle") == 0) { - if (!PC_Int_Parse(handle, &cgDC.Assets.fadeCycle)) { + if( Q_stricmp( token.string, "fadeCycle" ) == 0 ) + { + if( !PC_Int_Parse( handle, &cgDC.Assets.fadeCycle ) ) return qfalse; - } + continue; } - if (Q_stricmp(token.string, "fadeAmount") == 0) { - if (!PC_Float_Parse(handle, &cgDC.Assets.fadeAmount)) { + if( Q_stricmp( token.string, "fadeAmount" ) == 0 ) + { + if( !PC_Float_Parse( handle, &cgDC.Assets.fadeAmount ) ) return qfalse; - } + continue; } - if (Q_stricmp(token.string, "shadowX") == 0) { - if (!PC_Float_Parse(handle, &cgDC.Assets.shadowX)) { + if( Q_stricmp( token.string, "shadowX" ) == 0 ) + { + if( !PC_Float_Parse( handle, &cgDC.Assets.shadowX ) ) return qfalse; - } + continue; } - if (Q_stricmp(token.string, "shadowY") == 0) { - if (!PC_Float_Parse(handle, &cgDC.Assets.shadowY)) { + if( Q_stricmp( token.string, "shadowY" ) == 0 ) + { + if( !PC_Float_Parse( handle, &cgDC.Assets.shadowY ) ) return qfalse; - } + continue; } - if (Q_stricmp(token.string, "shadowColor") == 0) { - if (!PC_Color_Parse(handle, &cgDC.Assets.shadowColor)) { + if( Q_stricmp( token.string, "shadowColor" ) == 0 ) + { + if( !PC_Color_Parse( handle, &cgDC.Assets.shadowColor ) ) return qfalse; - } - cgDC.Assets.shadowFadeClamp = cgDC.Assets.shadowColor[3]; + + cgDC.Assets.shadowFadeClamp = cgDC.Assets.shadowColor[ 3 ]; continue; } } + return qfalse; // bk001204 - why not? } -void CG_ParseMenu(const char *menuFile) { - pc_token_t token; - int handle; +void CG_ParseMenu( const char *menuFile ) +{ + pc_token_t token; + int handle; - handle = trap_PC_LoadSource(menuFile); - if (!handle) - handle = trap_PC_LoadSource("ui/testhud.menu"); - if (!handle) + handle = trap_PC_LoadSource( menuFile ); + + if( !handle ) + handle = trap_PC_LoadSource( "ui/testhud.menu" ); + + if( !handle ) return; - while ( 1 ) { - if (!trap_PC_ReadToken( handle, &token )) { + while( 1 ) + { + if( !trap_PC_ReadToken( handle, &token ) ) break; - } //if ( Q_stricmp( token, "{" ) ) { // Com_Printf( "Missing { in menu file\n" ); @@ -1187,125 +1191,119 @@ void CG_ParseMenu(const char *menuFile) { // break; //} - if ( token.string[0] == '}' ) { + if( token.string[ 0 ] == '}' ) break; - } - if (Q_stricmp(token.string, "assetGlobalDef") == 0) { - if (CG_Asset_Parse(handle)) { + if( Q_stricmp( token.string, "assetGlobalDef" ) == 0 ) + { + if( CG_Asset_Parse( handle ) ) continue; - } else { - break; - } + else + break; } - if (Q_stricmp(token.string, "menudef") == 0) { + if( Q_stricmp( token.string, "menudef" ) == 0 ) + { // start a new menu - Menu_New(handle); + Menu_New( handle ); } } - trap_PC_FreeSource(handle); + + trap_PC_FreeSource( handle ); } -qboolean CG_Load_Menu(char **p) { +qboolean CG_Load_Menu( char **p ) +{ char *token; - token = COM_ParseExt(p, qtrue); + token = COM_ParseExt( p, qtrue ); - if (token[0] != '{') { + if( token[ 0 ] != '{' ) return qfalse; - } - - while ( 1 ) { - token = COM_ParseExt(p, qtrue); + while( 1 ) + { + token = COM_ParseExt( p, qtrue ); - if (Q_stricmp(token, "}") == 0) { + if( Q_stricmp( token, "}" ) == 0 ) return qtrue; - } - if ( !token || token[0] == 0 ) { + if( !token || token[ 0 ] == 0 ) return qfalse; - } - CG_ParseMenu(token); + CG_ParseMenu( token ); } return qfalse; } -void CG_LoadMenus(const char *menuFile) { - char *token; - char *p; - int len, start; +void CG_LoadMenus( const char *menuFile ) +{ + char *token; + char *p; + int len, start; fileHandle_t f; - static char buf[MAX_MENUDEFFILE]; + static char buf[ MAX_MENUDEFFILE ]; - start = trap_Milliseconds(); + start = trap_Milliseconds( ); len = trap_FS_FOpenFile( menuFile, &f, FS_READ ); - if ( !f ) { + + if( !f ) + { trap_Error( va( S_COLOR_YELLOW "menu file not found: %s, using default\n", menuFile ) ); len = trap_FS_FOpenFile( "ui/hud.txt", &f, FS_READ ); - if (!f) { + + if( !f ) trap_Error( va( S_COLOR_RED "default menu file not found: ui/hud.txt, unable to continue!\n", menuFile ) ); - } } - if ( len >= MAX_MENUDEFFILE ) { - trap_Error( va( S_COLOR_RED "menu file too large: %s is %i, max allowed is %i", menuFile, len, MAX_MENUDEFFILE ) ); + if( len >= MAX_MENUDEFFILE ) + { + trap_Error( va( S_COLOR_RED "menu file too large: %s is %i, max allowed is %i", + menuFile, len, MAX_MENUDEFFILE ) ); trap_FS_FCloseFile( f ); return; } trap_FS_Read( buf, len, f ); - buf[len] = 0; + buf[ len ] = 0; trap_FS_FCloseFile( f ); - COM_Compress(buf); + COM_Compress( buf ); - Menu_Reset(); + Menu_Reset( ); p = buf; - while ( 1 ) { + while( 1 ) + { token = COM_ParseExt( &p, qtrue ); - if( !token || token[0] == 0 || token[0] == '}') { + + if( !token || token[ 0 ] == 0 || token[ 0 ] == '}' ) break; - } - - //if ( Q_stricmp( token, "{" ) ) { - // Com_Printf( "Missing { in menu file\n" ); - // break; - //} - - //if ( menuCount == MAX_MENUS ) { - // Com_Printf( "Too many menus!\n" ); - // break; - //} - if ( Q_stricmp( token, "}" ) == 0 ) { + if( Q_stricmp( token, "}" ) == 0 ) break; - } - if (Q_stricmp(token, "loadmenu") == 0) { - if (CG_Load_Menu(&p)) { + if( Q_stricmp( token, "loadmenu" ) == 0 ) + { + if( CG_Load_Menu( &p ) ) continue; - } else { + else break; - } } } - Com_Printf("UI menu load time = %d milli seconds\n", trap_Milliseconds() - start); - + Com_Printf( "UI menu load time = %d milli seconds\n", trap_Milliseconds( ) - start ); } -static qboolean CG_OwnerDrawHandleKey(int ownerDraw, int flags, float *special, int key) { +static qboolean CG_OwnerDrawHandleKey( int ownerDraw, int flags, float *special, int key ) +{ return qfalse; } @@ -1445,7 +1443,8 @@ static const char *CG_FeederItemText( float feederID, int index, int column, qha return ""; } -static qhandle_t CG_FeederItemImage(float feederID, int index) { +static qhandle_t CG_FeederItemImage( float feederID, int index ) +{ return 0; } @@ -1467,152 +1466,146 @@ static void CG_FeederSelection( float feederID, int index ) } } -static float CG_Cvar_Get(const char *cvar) { - char buff[128]; - memset(buff, 0, sizeof(buff)); - trap_Cvar_VariableStringBuffer(cvar, buff, sizeof(buff)); - return atof(buff); +static float CG_Cvar_Get( const char *cvar ) +{ + char buff[ 128 ]; + + memset( buff, 0, sizeof( buff ) ); + trap_Cvar_VariableStringBuffer( cvar, buff, sizeof( buff ) ); + return atof( buff ); } -void CG_Text_PaintWithCursor(float x, float y, float scale, vec4_t color, const char *text, int cursorPos, char cursor, int limit, int style) { - CG_Text_Paint(x, y, scale, color, text, 0, limit, style); +void CG_Text_PaintWithCursor( float x, float y, float scale, vec4_t color, const char *text, + int cursorPos, char cursor, int limit, int style ) +{ + CG_Text_Paint( x, y, scale, color, text, 0, limit, style ); } -static int CG_OwnerDrawWidth(int ownerDraw, float scale) { - switch (ownerDraw) { -/* case CG_GAME_TYPE: - return CG_Text_Width(CG_GameTypeString(), scale, 0);*/ -/* case CG_GAME_STATUS: - return CG_Text_Width(CG_GetGameStatusText(), scale, 0); - break;*/ +static int CG_OwnerDrawWidth( int ownerDraw, float scale ) +{ + switch( ownerDraw ) + { case CG_KILLER: - return CG_Text_Width(CG_GetKillerText(), scale, 0); - break; -/* case CG_RED_NAME: - return CG_Text_Width(cg_redTeamName.string, scale, 0); + return CG_Text_Width( CG_GetKillerText( ), scale, 0 ); break; - case CG_BLUE_NAME: - return CG_Text_Width(cg_blueTeamName.string, scale, 0); - break;*/ - - } + return 0; } -static int CG_PlayCinematic(const char *name, float x, float y, float w, float h) { - return trap_CIN_PlayCinematic(name, x, y, w, h, CIN_loop); +static int CG_PlayCinematic( const char *name, float x, float y, float w, float h ) +{ + return trap_CIN_PlayCinematic( name, x, y, w, h, CIN_loop ); } -static void CG_StopCinematic(int handle) { - trap_CIN_StopCinematic(handle); +static void CG_StopCinematic( int handle ) +{ + trap_CIN_StopCinematic( handle ); } -static void CG_DrawCinematic(int handle, float x, float y, float w, float h) { - trap_CIN_SetExtents(handle, x, y, w, h); - trap_CIN_DrawCinematic(handle); +static void CG_DrawCinematic( int handle, float x, float y, float w, float h ) +{ + trap_CIN_SetExtents( handle, x, y, w, h ); + trap_CIN_DrawCinematic( handle ); } -static void CG_RunCinematicFrame(int handle) { - trap_CIN_RunCinematic(handle); +static void CG_RunCinematicFrame( int handle ) +{ + trap_CIN_RunCinematic( handle ); } /* ================= -CG_LoadHudMenu(); - +CG_LoadHudMenu ================= */ -void CG_LoadHudMenu() { - char buff[1024]; - const char *hudSet; - - cgDC.registerShaderNoMip = &trap_R_RegisterShaderNoMip; - cgDC.setColor = &trap_R_SetColor; - cgDC.drawHandlePic = &CG_DrawPic; - cgDC.drawStretchPic = &trap_R_DrawStretchPic; - cgDC.drawText = &CG_Text_Paint; - cgDC.textWidth = &CG_Text_Width; - cgDC.textHeight = &CG_Text_Height; - cgDC.registerModel = &trap_R_RegisterModel; - cgDC.modelBounds = &trap_R_ModelBounds; - cgDC.fillRect = &CG_FillRect; - cgDC.drawRect = &CG_DrawRect; - cgDC.drawSides = &CG_DrawSides; - cgDC.drawTopBottom = &CG_DrawTopBottom; - cgDC.clearScene = &trap_R_ClearScene; - cgDC.addRefEntityToScene = &trap_R_AddRefEntityToScene; - cgDC.renderScene = &trap_R_RenderScene; - cgDC.registerFont = &trap_R_RegisterFont; - cgDC.ownerDrawItem = &CG_OwnerDraw; - cgDC.getValue = &CG_GetValue; - cgDC.ownerDrawVisible = NULL; //&CG_OwnerDrawVisible; - cgDC.runScript = &CG_RunMenuScript; - cgDC.getTeamColor = &CG_GetTeamColor; - cgDC.setCVar = trap_Cvar_Set; - cgDC.getCVarString = trap_Cvar_VariableStringBuffer; - cgDC.getCVarValue = CG_Cvar_Get; - cgDC.drawTextWithCursor = &CG_Text_PaintWithCursor; - //cgDC.setOverstrikeMode = &trap_Key_SetOverstrikeMode; - //cgDC.getOverstrikeMode = &trap_Key_GetOverstrikeMode; - cgDC.startLocalSound = &trap_S_StartLocalSound; - cgDC.ownerDrawHandleKey = &CG_OwnerDrawHandleKey; - cgDC.feederCount = &CG_FeederCount; - cgDC.feederItemImage = &CG_FeederItemImage; - cgDC.feederItemText = &CG_FeederItemText; - cgDC.feederSelection = &CG_FeederSelection; - //cgDC.setBinding = &trap_Key_SetBinding; - //cgDC.getBindingBuf = &trap_Key_GetBindingBuf; - //cgDC.keynumToStringBuf = &trap_Key_KeynumToStringBuf; - //cgDC.executeText = &trap_Cmd_ExecuteText; - cgDC.Error = &Com_Error; - cgDC.Print = &Com_Printf; - cgDC.ownerDrawWidth = &CG_OwnerDrawWidth; - //cgDC.Pause = &CG_Pause; - cgDC.registerSound = &trap_S_RegisterSound; +void CG_LoadHudMenu( ) +{ + char buff[ 1024 ]; + const char *hudSet; + + cgDC.registerShaderNoMip = &trap_R_RegisterShaderNoMip; + cgDC.setColor = &trap_R_SetColor; + cgDC.drawHandlePic = &CG_DrawPic; + cgDC.drawStretchPic = &trap_R_DrawStretchPic; + cgDC.drawText = &CG_Text_Paint; + cgDC.textWidth = &CG_Text_Width; + cgDC.textHeight = &CG_Text_Height; + cgDC.registerModel = &trap_R_RegisterModel; + cgDC.modelBounds = &trap_R_ModelBounds; + cgDC.fillRect = &CG_FillRect; + cgDC.drawRect = &CG_DrawRect; + cgDC.drawSides = &CG_DrawSides; + cgDC.drawTopBottom = &CG_DrawTopBottom; + cgDC.clearScene = &trap_R_ClearScene; + cgDC.addRefEntityToScene = &trap_R_AddRefEntityToScene; + cgDC.renderScene = &trap_R_RenderScene; + cgDC.registerFont = &trap_R_RegisterFont; + cgDC.ownerDrawItem = &CG_OwnerDraw; + cgDC.getValue = &CG_GetValue; + cgDC.ownerDrawVisible = NULL; //&CG_OwnerDrawVisible; + cgDC.runScript = &CG_RunMenuScript; + cgDC.getTeamColor = &CG_GetTeamColor; + cgDC.setCVar = trap_Cvar_Set; + cgDC.getCVarString = trap_Cvar_VariableStringBuffer; + cgDC.getCVarValue = CG_Cvar_Get; + cgDC.drawTextWithCursor = &CG_Text_PaintWithCursor; + //cgDC.setOverstrikeMode = &trap_Key_SetOverstrikeMode; + //cgDC.getOverstrikeMode = &trap_Key_GetOverstrikeMode; + cgDC.startLocalSound = &trap_S_StartLocalSound; + cgDC.ownerDrawHandleKey = &CG_OwnerDrawHandleKey; + cgDC.feederCount = &CG_FeederCount; + cgDC.feederItemImage = &CG_FeederItemImage; + cgDC.feederItemText = &CG_FeederItemText; + cgDC.feederSelection = &CG_FeederSelection; + //cgDC.setBinding = &trap_Key_SetBinding; + //cgDC.getBindingBuf = &trap_Key_GetBindingBuf; + //cgDC.keynumToStringBuf = &trap_Key_KeynumToStringBuf; + //cgDC.executeText = &trap_Cmd_ExecuteText; + cgDC.Error = &Com_Error; + cgDC.Print = &Com_Printf; + cgDC.ownerDrawWidth = &CG_OwnerDrawWidth; + //cgDC.Pause = &CG_Pause; + cgDC.registerSound = &trap_S_RegisterSound; cgDC.startBackgroundTrack = &trap_S_StartBackgroundTrack; - cgDC.stopBackgroundTrack = &trap_S_StopBackgroundTrack; - cgDC.playCinematic = &CG_PlayCinematic; - cgDC.stopCinematic = &CG_StopCinematic; - cgDC.drawCinematic = &CG_DrawCinematic; - cgDC.runCinematicFrame = &CG_RunCinematicFrame; + cgDC.stopBackgroundTrack = &trap_S_StopBackgroundTrack; + cgDC.playCinematic = &CG_PlayCinematic; + cgDC.stopCinematic = &CG_StopCinematic; + cgDC.drawCinematic = &CG_DrawCinematic; + cgDC.runCinematicFrame = &CG_RunCinematicFrame; - Init_Display(&cgDC); + Init_Display( &cgDC ); - Menu_Reset(); + Menu_Reset( ); - trap_Cvar_VariableStringBuffer("cg_hudFiles", buff, sizeof(buff)); + trap_Cvar_VariableStringBuffer( "cg_hudFiles", buff, sizeof( buff ) ); hudSet = buff; - if (hudSet[0] == '\0') { + + if( hudSet[ 0 ] == '\0' ) hudSet = "ui/hud.txt"; - } - CG_LoadMenus(hudSet); + CG_LoadMenus( hudSet ); } -void CG_AssetCache() { - //if (Assets.textFont == NULL) { - // trap_R_RegisterFont("fonts/arial.ttf", 72, &Assets.textFont); - //} - //Assets.background = trap_R_RegisterShaderNoMip( ASSET_BACKGROUND ); - //Com_Printf("Menu Size: %i bytes\n", sizeof(Menus)); - cgDC.Assets.gradientBar = trap_R_RegisterShaderNoMip( ASSET_GRADIENTBAR ); - cgDC.Assets.fxBasePic = trap_R_RegisterShaderNoMip( ART_FX_BASE ); - cgDC.Assets.fxPic[0] = trap_R_RegisterShaderNoMip( ART_FX_RED ); - cgDC.Assets.fxPic[1] = trap_R_RegisterShaderNoMip( ART_FX_YELLOW ); - cgDC.Assets.fxPic[2] = trap_R_RegisterShaderNoMip( ART_FX_GREEN ); - cgDC.Assets.fxPic[3] = trap_R_RegisterShaderNoMip( ART_FX_TEAL ); - cgDC.Assets.fxPic[4] = trap_R_RegisterShaderNoMip( ART_FX_BLUE ); - cgDC.Assets.fxPic[5] = trap_R_RegisterShaderNoMip( ART_FX_CYAN ); - cgDC.Assets.fxPic[6] = trap_R_RegisterShaderNoMip( ART_FX_WHITE ); - cgDC.Assets.scrollBar = trap_R_RegisterShaderNoMip( ASSET_SCROLLBAR ); - cgDC.Assets.scrollBarArrowDown = trap_R_RegisterShaderNoMip( ASSET_SCROLLBAR_ARROWDOWN ); - cgDC.Assets.scrollBarArrowUp = trap_R_RegisterShaderNoMip( ASSET_SCROLLBAR_ARROWUP ); - cgDC.Assets.scrollBarArrowLeft = trap_R_RegisterShaderNoMip( ASSET_SCROLLBAR_ARROWLEFT ); +void CG_AssetCache( void ) +{ + cgDC.Assets.gradientBar = trap_R_RegisterShaderNoMip( ASSET_GRADIENTBAR ); + cgDC.Assets.fxBasePic = trap_R_RegisterShaderNoMip( ART_FX_BASE ); + cgDC.Assets.fxPic[ 0 ] = trap_R_RegisterShaderNoMip( ART_FX_RED ); + cgDC.Assets.fxPic[ 1 ] = trap_R_RegisterShaderNoMip( ART_FX_YELLOW ); + cgDC.Assets.fxPic[ 2 ] = trap_R_RegisterShaderNoMip( ART_FX_GREEN ); + cgDC.Assets.fxPic[ 3 ] = trap_R_RegisterShaderNoMip( ART_FX_TEAL ); + cgDC.Assets.fxPic[ 4 ] = trap_R_RegisterShaderNoMip( ART_FX_BLUE ); + cgDC.Assets.fxPic[ 5 ] = trap_R_RegisterShaderNoMip( ART_FX_CYAN ); + cgDC.Assets.fxPic[ 6 ] = trap_R_RegisterShaderNoMip( ART_FX_WHITE ); + cgDC.Assets.scrollBar = trap_R_RegisterShaderNoMip( ASSET_SCROLLBAR ); + cgDC.Assets.scrollBarArrowDown = trap_R_RegisterShaderNoMip( ASSET_SCROLLBAR_ARROWDOWN ); + cgDC.Assets.scrollBarArrowUp = trap_R_RegisterShaderNoMip( ASSET_SCROLLBAR_ARROWUP ); + cgDC.Assets.scrollBarArrowLeft = trap_R_RegisterShaderNoMip( ASSET_SCROLLBAR_ARROWLEFT ); cgDC.Assets.scrollBarArrowRight = trap_R_RegisterShaderNoMip( ASSET_SCROLLBAR_ARROWRIGHT ); - cgDC.Assets.scrollBarThumb = trap_R_RegisterShaderNoMip( ASSET_SCROLL_THUMB ); - cgDC.Assets.sliderBar = trap_R_RegisterShaderNoMip( ASSET_SLIDER_BAR ); - cgDC.Assets.sliderThumb = trap_R_RegisterShaderNoMip( ASSET_SLIDER_THUMB ); + cgDC.Assets.scrollBarThumb = trap_R_RegisterShaderNoMip( ASSET_SCROLL_THUMB ); + cgDC.Assets.sliderBar = trap_R_RegisterShaderNoMip( ASSET_SLIDER_BAR ); + cgDC.Assets.sliderThumb = trap_R_RegisterShaderNoMip( ASSET_SLIDER_THUMB ); } //TA: FIXME: preliminary integration of CG TA UI stuff @@ -1624,14 +1617,14 @@ Called after every level change or subsystem restart Will perform callbacks to make the loading info screen update. ================= */ -void CG_Init( int serverMessageNum, int serverCommandSequence, int clientNum ) { +void CG_Init( int serverMessageNum, int serverCommandSequence, int clientNum ) +{ const char *s; // clear everything memset( &cgs, 0, sizeof( cgs ) ); memset( &cg, 0, sizeof( cg ) ); - memset( cg_entities, 0, sizeof(cg_entities) ); - memset( cg_items, 0, sizeof(cg_items) ); + memset( cg_entities, 0, sizeof( cg_entities ) ); cg.clientNum = clientNum; @@ -1639,31 +1632,26 @@ void CG_Init( int serverMessageNum, int serverCommandSequence, int clientNum ) { cgs.serverCommandSequence = serverCommandSequence; // load a few needed things before we do any screen updates + cgs.media.whiteShader = trap_R_RegisterShader( "white" ); cgs.media.charsetShader = trap_R_RegisterShader( "gfx/2d/bigchars" ); - cgs.media.whiteShader = trap_R_RegisterShader( "white" ); - cgs.media.charsetProp = trap_R_RegisterShaderNoMip( "menu/art/font1_prop.tga" ); - cgs.media.charsetPropGlow = trap_R_RegisterShaderNoMip( "menu/art/font1_prop_glo.tga" ); - cgs.media.charsetPropB = trap_R_RegisterShaderNoMip( "menu/art/font2_prop.tga" ); + //inform UI to repress cursor whilst loading + trap_Cvar_Set( "ui_loading", "1" ); + //TA: dyn memory CG_InitMemory( ); - CG_RegisterCvars(); + CG_RegisterCvars( ); - CG_InitConsoleCommands(); + CG_InitConsoleCommands( ); - //repress standard Q3 console - trap_Cvar_Set( "con_notifytime", "-2" ); - //TA: moved up for LoadHudMenu - String_Init(); + String_Init( ); //TA: FIXME: TA UI - CG_AssetCache(); - CG_LoadHudMenu(); // load new hud stuff + CG_AssetCache( ); + CG_LoadHudMenu( ); // load new hud stuff - //cg.weaponSelect = WP_MACHINEGUN; - //TA: if it does weird things, this is why: cg.weaponSelect = WP_NONE; cgs.redflag = cgs.blueflag = -1; // For compatibily, default to unset for @@ -1680,14 +1668,14 @@ void CG_Init( int serverMessageNum, int serverCommandSequence, int clientNum ) { // check version s = CG_ConfigString( CS_GAME_VERSION ); - if ( strcmp( s, GAME_VERSION ) ) { + + if( strcmp( s, GAME_VERSION ) ) CG_Error( "Client/Server game mismatch: %s/%s", GAME_VERSION, s ); - } s = CG_ConfigString( CS_LEVEL_START_TIME ); cgs.levelStartTime = atoi( s ); - CG_ParseServerinfo(); + CG_ParseServerinfo( ); // load the new map trap_CM_LoadMap( cgs.mapname ); @@ -1707,27 +1695,29 @@ void CG_Init( int serverMessageNum, int serverCommandSequence, int clientNum ) { //TA: CG_InitBuildables( ); - CG_RegisterClients(); // if low on memory, some clients will be deferred + CG_RegisterClients( ); // if low on memory, some clients will be deferred cg.loading = qfalse; // future players will be deferred - CG_InitLocalEntities(); + CG_InitLocalEntities( ); - CG_InitMarkPolys(); + CG_InitMarkPolys( ); // remove the last loading update - cg.infoScreenText[0] = 0; + cg.infoScreenText[ 0 ] = 0; // Make sure we have update values (scores) - CG_SetConfigValues(); + CG_SetConfigValues( ); - CG_StartMusic(); + CG_StartMusic( ); - CG_ShaderStateChanged(); + CG_ShaderStateChanged( ); trap_S_ClearLoopingSounds( qtrue ); cg.consoleValid = qtrue; + + trap_Cvar_Set( "ui_loading", "0" ); } /* @@ -1737,28 +1727,8 @@ CG_Shutdown Called before every level change or subsystem restart ================= */ -void CG_Shutdown( void ) { +void CG_Shutdown( void ) +{ // some mods may need to do cleanup work here, // like closing files or archiving session data } - -/* -================== -CG_EventHandling -================== - type 0 - no event handling - 1 - team menu - 2 - hud editor - -*/ -/*void CG_EventHandling(int type) { -} - - - -void CG_KeyEvent(int key, qboolean down) { -} - -void CG_MouseEvent(int x, int y) { -} -*/ diff --git a/src/cgame/cg_marks.c b/src/cgame/cg_marks.c index 7dbb7c1f..deb31c4d 100644 --- a/src/cgame/cg_marks.c +++ b/src/cgame/cg_marks.c @@ -26,10 +26,10 @@ MARK POLYS */ -markPoly_t cg_activeMarkPolys; // double linked list -markPoly_t *cg_freeMarkPolys; // single linked list -markPoly_t cg_markPolys[MAX_MARK_POLYS]; -static int markTotal; +markPoly_t cg_activeMarkPolys; // double linked list +markPoly_t *cg_freeMarkPolys; // single linked list +markPoly_t cg_markPolys[ MAX_MARK_POLYS ]; +static int markTotal; /* =================== @@ -38,17 +38,18 @@ CG_InitMarkPolys This is called at startup and for tournement restarts =================== */ -void CG_InitMarkPolys( void ) { - int i; - - memset( cg_markPolys, 0, sizeof(cg_markPolys) ); - - cg_activeMarkPolys.nextMark = &cg_activeMarkPolys; - cg_activeMarkPolys.prevMark = &cg_activeMarkPolys; - cg_freeMarkPolys = cg_markPolys; - for ( i = 0 ; i < MAX_MARK_POLYS - 1 ; i++ ) { - cg_markPolys[i].nextMark = &cg_markPolys[i+1]; - } +void CG_InitMarkPolys( void ) +{ + int i; + + memset( cg_markPolys, 0, sizeof( cg_markPolys ) ); + + cg_activeMarkPolys.nextMark = &cg_activeMarkPolys; + cg_activeMarkPolys.prevMark = &cg_activeMarkPolys; + cg_freeMarkPolys = cg_markPolys; + + for( i = 0; i < MAX_MARK_POLYS - 1; i++ ) + cg_markPolys[ i ].nextMark = &cg_markPolys[ i + 1 ]; } @@ -57,18 +58,18 @@ void CG_InitMarkPolys( void ) { CG_FreeMarkPoly ================== */ -void CG_FreeMarkPoly( markPoly_t *le ) { - if ( !le->prevMark ) { - CG_Error( "CG_FreeLocalEntity: not active" ); - } - - // remove from the doubly linked active list - le->prevMark->nextMark = le->nextMark; - le->nextMark->prevMark = le->prevMark; - - // the free list is only singly linked - le->nextMark = cg_freeMarkPolys; - cg_freeMarkPolys = le; +void CG_FreeMarkPoly( markPoly_t *le ) +{ + if( !le->prevMark ) + CG_Error( "CG_FreeLocalEntity: not active" ); + + // remove from the doubly linked active list + le->prevMark->nextMark = le->nextMark; + le->nextMark->prevMark = le->prevMark; + + // the free list is only singly linked + le->nextMark = cg_freeMarkPolys; + cg_freeMarkPolys = le; } /* @@ -78,30 +79,32 @@ CG_AllocMark Will allways succeed, even if it requires freeing an old active mark =================== */ -markPoly_t *CG_AllocMark( void ) { - markPoly_t *le; - int time; - - if ( !cg_freeMarkPolys ) { - // no free entities, so free the one at the end of the chain - // remove the oldest active entity - time = cg_activeMarkPolys.prevMark->time; - while (cg_activeMarkPolys.prevMark && time == cg_activeMarkPolys.prevMark->time) { - CG_FreeMarkPoly( cg_activeMarkPolys.prevMark ); - } - } - - le = cg_freeMarkPolys; - cg_freeMarkPolys = cg_freeMarkPolys->nextMark; - - memset( le, 0, sizeof( *le ) ); - - // link into the active list - le->nextMark = cg_activeMarkPolys.nextMark; - le->prevMark = &cg_activeMarkPolys; - cg_activeMarkPolys.nextMark->prevMark = le; - cg_activeMarkPolys.nextMark = le; - return le; +markPoly_t *CG_AllocMark( void ) +{ + markPoly_t *le; + int time; + + if( !cg_freeMarkPolys ) + { + // no free entities, so free the one at the end of the chain + // remove the oldest active entity + time = cg_activeMarkPolys.prevMark->time; + + while( cg_activeMarkPolys.prevMark && time == cg_activeMarkPolys.prevMark->time ) + CG_FreeMarkPoly( cg_activeMarkPolys.prevMark ); + } + + le = cg_freeMarkPolys; + cg_freeMarkPolys = cg_freeMarkPolys->nextMark; + + memset( le, 0, sizeof( *le ) ); + + // link into the active list + le->nextMark = cg_activeMarkPolys.nextMark; + le->prevMark = &cg_activeMarkPolys; + cg_activeMarkPolys.nextMark->prevMark = le; + cg_activeMarkPolys.nextMark = le; + return le; } @@ -117,101 +120,104 @@ temporary marks will not be stored or randomly oriented, but immediately passed to the renderer. ================= */ -#define MAX_MARK_FRAGMENTS 128 -#define MAX_MARK_POINTS 384 +#define MAX_MARK_FRAGMENTS 128 +#define MAX_MARK_POINTS 384 void CG_ImpactMark( qhandle_t markShader, const vec3_t origin, const vec3_t dir, - float orientation, float red, float green, float blue, float alpha, - qboolean alphaFade, float radius, qboolean temporary ) { - vec3_t axis[3]; - float texCoordScale; - vec3_t originalPoints[4]; - byte colors[4]; - int i, j; - int numFragments; - markFragment_t markFragments[MAX_MARK_FRAGMENTS], *mf; - vec3_t markPoints[MAX_MARK_POINTS]; - vec3_t projection; - - if ( !cg_addMarks.integer ) { - return; - } - - if ( radius <= 0 ) { - CG_Error( "CG_ImpactMark called with <= 0 radius" ); - } + float orientation, float red, float green, float blue, float alpha, + qboolean alphaFade, float radius, qboolean temporary ) +{ + vec3_t axis[ 3 ]; + float texCoordScale; + vec3_t originalPoints[ 4 ]; + byte colors[ 4 ]; + int i, j; + int numFragments; + markFragment_t markFragments[ MAX_MARK_FRAGMENTS ], *mf; + vec3_t markPoints[ MAX_MARK_POINTS ]; + vec3_t projection; + + if( !cg_addMarks.integer ) + return; + + if( radius <= 0 ) + CG_Error( "CG_ImpactMark called with <= 0 radius" ); //if ( markTotal >= MAX_MARK_POLYS ) { // return; //} - // create the texture axis - VectorNormalize2( dir, axis[0] ); - PerpendicularVector( axis[1], axis[0] ); - RotatePointAroundVector( axis[2], axis[0], axis[1], orientation ); - CrossProduct( axis[0], axis[2], axis[1] ); - - texCoordScale = 0.5 * 1.0 / radius; - - // create the full polygon - for ( i = 0 ; i < 3 ; i++ ) { - originalPoints[0][i] = origin[i] - radius * axis[1][i] - radius * axis[2][i]; - originalPoints[1][i] = origin[i] + radius * axis[1][i] - radius * axis[2][i]; - originalPoints[2][i] = origin[i] + radius * axis[1][i] + radius * axis[2][i]; - originalPoints[3][i] = origin[i] - radius * axis[1][i] + radius * axis[2][i]; - } - - // get the fragments - VectorScale( dir, -20, projection ); - numFragments = trap_CM_MarkFragments( 4, (void *)originalPoints, - projection, MAX_MARK_POINTS, markPoints[0], - MAX_MARK_FRAGMENTS, markFragments ); - - colors[0] = red * 255; - colors[1] = green * 255; - colors[2] = blue * 255; - colors[3] = alpha * 255; - - for ( i = 0, mf = markFragments ; i < numFragments ; i++, mf++ ) { - polyVert_t *v; - polyVert_t verts[MAX_VERTS_ON_POLY]; - markPoly_t *mark; - - // we have an upper limit on the complexity of polygons - // that we store persistantly - if ( mf->numPoints > MAX_VERTS_ON_POLY ) { - mf->numPoints = MAX_VERTS_ON_POLY; - } - for ( j = 0, v = verts ; j < mf->numPoints ; j++, v++ ) { - vec3_t delta; - - VectorCopy( markPoints[mf->firstPoint + j], v->xyz ); - - VectorSubtract( v->xyz, origin, delta ); - v->st[0] = 0.5 + DotProduct( delta, axis[1] ) * texCoordScale; - v->st[1] = 0.5 + DotProduct( delta, axis[2] ) * texCoordScale; - *(int *)v->modulate = *(int *)colors; - } - - // if it is a temporary (shadow) mark, add it immediately and forget about it - if ( temporary ) { - trap_R_AddPolyToScene( markShader, mf->numPoints, verts ); - continue; - } - - // otherwise save it persistantly - mark = CG_AllocMark(); - mark->time = cg.time; - mark->alphaFade = alphaFade; - mark->markShader = markShader; - mark->poly.numVerts = mf->numPoints; - mark->color[0] = red; - mark->color[1] = green; - mark->color[2] = blue; - mark->color[3] = alpha; - memcpy( mark->verts, verts, mf->numPoints * sizeof( verts[0] ) ); + // create the texture axis + VectorNormalize2( dir, axis[ 0 ] ); + PerpendicularVector( axis[ 1 ], axis[ 0 ] ); + RotatePointAroundVector( axis[ 2 ], axis[ 0 ], axis[ 1 ], orientation ); + CrossProduct( axis[ 0 ], axis[ 2 ], axis[ 1 ] ); + + texCoordScale = 0.5 * 1.0 / radius; + + // create the full polygon + for( i = 0; i < 3; i++ ) + { + originalPoints[ 0 ][ i ] = origin[ i ] - radius * axis[ 1 ][ i ] - radius * axis[ 2 ][ i ]; + originalPoints[ 1 ][ i ] = origin[ i ] + radius * axis[ 1 ][ i ] - radius * axis[ 2 ][ i ]; + originalPoints[ 2 ][ i ] = origin[ i ] + radius * axis[ 1 ][ i ] + radius * axis[ 2 ][ i ]; + originalPoints[ 3 ][ i ] = origin[ i ] - radius * axis[ 1 ][ i ] + radius * axis[ 2 ][ i ]; + } + + // get the fragments + VectorScale( dir, -20, projection ); + numFragments = trap_CM_MarkFragments( 4, (void *)originalPoints, + projection, MAX_MARK_POINTS, markPoints[ 0 ], + MAX_MARK_FRAGMENTS, markFragments ); + + colors[ 0 ] = red * 255; + colors[ 1 ] = green * 255; + colors[ 2 ] = blue * 255; + colors[ 3 ] = alpha * 255; + + for( i = 0, mf = markFragments; i < numFragments; i++, mf++ ) + { + polyVert_t *v; + polyVert_t verts[ MAX_VERTS_ON_POLY ]; + markPoly_t *mark; + + // we have an upper limit on the complexity of polygons + // that we store persistantly + if( mf->numPoints > MAX_VERTS_ON_POLY ) + mf->numPoints = MAX_VERTS_ON_POLY; + + for( j = 0, v = verts; j < mf->numPoints; j++, v++ ) + { + vec3_t delta; + + VectorCopy( markPoints[ mf->firstPoint + j ], v->xyz ); + + VectorSubtract( v->xyz, origin, delta ); + v->st[ 0 ] = 0.5 + DotProduct( delta, axis[ 1 ] ) * texCoordScale; + v->st[ 1 ] = 0.5 + DotProduct( delta, axis[ 2 ] ) * texCoordScale; + *(int *)v->modulate = *(int *)colors; + } + + // if it is a temporary (shadow) mark, add it immediately and forget about it + if( temporary ) + { + trap_R_AddPolyToScene( markShader, mf->numPoints, verts ); + continue; + } + + // otherwise save it persistantly + mark = CG_AllocMark( ); + mark->time = cg.time; + mark->alphaFade = alphaFade; + mark->markShader = markShader; + mark->poly.numVerts = mf->numPoints; + mark->color[ 0 ] = red; + mark->color[ 1 ] = green; + mark->color[ 2 ] = blue; + mark->color[ 3 ] = alpha; + memcpy( mark->verts, verts, mf->numPoints * sizeof( verts[ 0 ] ) ); markTotal++; - } + } } @@ -220,68 +226,77 @@ void CG_ImpactMark( qhandle_t markShader, const vec3_t origin, const vec3_t dir, CG_AddMarks =============== */ -#define MARK_TOTAL_TIME 10000 -#define MARK_FADE_TIME 1000 - -void CG_AddMarks( void ) { - int j; - markPoly_t *mp, *next; - int t; - int fade; - - if ( !cg_addMarks.integer ) { - return; - } - - mp = cg_activeMarkPolys.nextMark; - for ( ; mp != &cg_activeMarkPolys ; mp = next ) { - // grab next now, so if the local entity is freed we - // still have it - next = mp->nextMark; - - // see if it is time to completely remove it - if ( cg.time > mp->time + MARK_TOTAL_TIME ) { - CG_FreeMarkPoly( mp ); - continue; - } - - // fade out the energy bursts - if ( mp->markShader == cgs.media.energyMarkShader ) { - - fade = 450 - 450 * ( (cg.time - mp->time ) / 3000.0 ); - if ( fade < 255 ) { - if ( fade < 0 ) { - fade = 0; - } - if ( mp->verts[0].modulate[0] != 0 ) { - for ( j = 0 ; j < mp->poly.numVerts ; j++ ) { - mp->verts[j].modulate[0] = mp->color[0] * fade; - mp->verts[j].modulate[1] = mp->color[1] * fade; - mp->verts[j].modulate[2] = mp->color[2] * fade; - } - } - } - } - - // fade all marks out with time - t = mp->time + MARK_TOTAL_TIME - cg.time; - if ( t < MARK_FADE_TIME ) { - fade = 255 * t / MARK_FADE_TIME; - if ( mp->alphaFade ) { - for ( j = 0 ; j < mp->poly.numVerts ; j++ ) { - mp->verts[j].modulate[3] = fade; - } - } else { - for ( j = 0 ; j < mp->poly.numVerts ; j++ ) { - mp->verts[j].modulate[0] = mp->color[0] * fade; - mp->verts[j].modulate[1] = mp->color[1] * fade; - mp->verts[j].modulate[2] = mp->color[2] * fade; - } - } - } - - - trap_R_AddPolyToScene( mp->markShader, mp->poly.numVerts, mp->verts ); - } +#define MARK_TOTAL_TIME 10000 +#define MARK_FADE_TIME 1000 + +void CG_AddMarks( void ) +{ + int j; + markPoly_t *mp, *next; + int t; + int fade; + + if( !cg_addMarks.integer ) + return; + + mp = cg_activeMarkPolys.nextMark; + for ( ; mp != &cg_activeMarkPolys; mp = next ) + { + // grab next now, so if the local entity is freed we + // still have it + next = mp->nextMark; + + // see if it is time to completely remove it + if( cg.time > mp->time + MARK_TOTAL_TIME ) + { + CG_FreeMarkPoly( mp ); + continue; + } + + // fade out the energy bursts + if( mp->markShader == cgs.media.energyMarkShader ) + { + + fade = 450 - 450 * ( (cg.time - mp->time ) / 3000.0 ); + if( fade < 255 ) + { + if( fade < 0 ) + fade = 0; + + if( mp->verts[ 0 ].modulate[ 0 ] != 0 ) + { + for( j = 0; j < mp->poly.numVerts; j++ ) + { + mp->verts[ j ].modulate[ 0 ] = mp->color[ 0 ] * fade; + mp->verts[ j ].modulate[ 1 ] = mp->color[ 1 ] * fade; + mp->verts[ j ].modulate[ 2 ] = mp->color[ 2 ] * fade; + } + } + } + } + + // fade all marks out with time + t = mp->time + MARK_TOTAL_TIME - cg.time; + if( t < MARK_FADE_TIME ) + { + fade = 255 * t / MARK_FADE_TIME; + if( mp->alphaFade ) + { + for( j = 0; j < mp->poly.numVerts; j++ ) + mp->verts[ j ].modulate[ 3 ] = fade; + } + else + { + for( j = 0; j < mp->poly.numVerts; j++ ) + { + mp->verts[ j ].modulate[ 0 ] = mp->color[ 0 ] * fade; + mp->verts[ j ].modulate[ 1 ] = mp->color[ 1 ] * fade; + mp->verts[ j ].modulate[ 2 ] = mp->color[ 2 ] * fade; + } + } + } + + trap_R_AddPolyToScene( mp->markShader, mp->poly.numVerts, mp->verts ); + } } diff --git a/src/cgame/cg_players.c b/src/cgame/cg_players.c index 09098e31..b553fbc2 100644 --- a/src/cgame/cg_players.c +++ b/src/cgame/cg_players.c @@ -17,7 +17,8 @@ #include "cg_local.h" -char *cg_customSoundNames[MAX_CUSTOM_SOUNDS] = { +char *cg_customSoundNames[ MAX_CUSTOM_SOUNDS ] = +{ "*death1.wav", "*death2.wav", "*death3.wav", @@ -40,23 +41,23 @@ CG_CustomSound ================ */ -sfxHandle_t CG_CustomSound( int clientNum, const char *soundName ) { - clientInfo_t *ci; - int i; +sfxHandle_t CG_CustomSound( int clientNum, const char *soundName ) +{ + clientInfo_t *ci; + int i; - if ( soundName[0] != '*' ) { + if( soundName[ 0 ] != '*' ) return trap_S_RegisterSound( soundName, qfalse ); - } - if ( clientNum < 0 || clientNum >= MAX_CLIENTS ) { + if( clientNum < 0 || clientNum >= MAX_CLIENTS ) clientNum = 0; - } + ci = &cgs.clientinfo[ clientNum ]; - for ( i = 0 ; i < MAX_CUSTOM_SOUNDS && cg_customSoundNames[i] ; i++ ) { - if ( !strcmp( soundName, cg_customSoundNames[i] ) ) { - return ci->sounds[i]; - } + for( i = 0; i < MAX_CUSTOM_SOUNDS && cg_customSoundNames[ i ]; i++ ) + { + if( !strcmp( soundName, cg_customSoundNames[ i ] ) ) + return ci->sounds[ i ]; } CG_Error( "Unknown custom sound: %s", soundName ); @@ -81,30 +82,33 @@ Read a configuration file containing animation coutns and rates models/players/visor/animation.cfg, etc ====================== */ -static qboolean CG_ParseAnimationFile( const char *filename, clientInfo_t *ci ) { - char *text_p, *prev; - int len; - int i; - char *token; - float fps; - int skip; - char text[20000]; +static qboolean CG_ParseAnimationFile( const char *filename, clientInfo_t *ci ) +{ + char *text_p, *prev; + int len; + int i; + char *token; + float fps; + int skip; + char text[ 20000 ]; fileHandle_t f; - animation_t *animations; + animation_t *animations; animations = ci->animations; // load the file len = trap_FS_FOpenFile( filename, &f, FS_READ ); - if ( len <= 0 ) { + if( len <= 0 ) return qfalse; - } - if ( len >= sizeof( text ) - 1 ) { + + if( len >= sizeof( text ) - 1 ) + { CG_Printf( "File %s too long\n", filename ); return qfalse; } + trap_FS_Read( text, len, f ); - text[len] = 0; + text[ len ] = 0; trap_FS_FCloseFile( f ); // parse the text @@ -118,166 +122,184 @@ static qboolean CG_ParseAnimationFile( const char *filename, clientInfo_t *ci ) ci->fixedtorso = qfalse; // read optional parameters - while ( 1 ) { + while( 1 ) + { prev = text_p; // so we can unget token = COM_Parse( &text_p ); - if ( !token ) { + + if( !token ) break; - } - if ( !Q_stricmp( token, "footsteps" ) ) { + + if( !Q_stricmp( token, "footsteps" ) ) + { token = COM_Parse( &text_p ); - if ( !token ) { + if( !token ) break; - } - if ( !Q_stricmp( token, "default" ) || !Q_stricmp( token, "normal" ) ) { + + if( !Q_stricmp( token, "default" ) || !Q_stricmp( token, "normal" ) ) ci->footsteps = FOOTSTEP_NORMAL; - } else if ( !Q_stricmp( token, "boot" ) ) { + else if( !Q_stricmp( token, "boot" ) ) ci->footsteps = FOOTSTEP_BOOT; - } else if ( !Q_stricmp( token, "flesh" ) ) { + else if( !Q_stricmp( token, "flesh" ) ) ci->footsteps = FOOTSTEP_FLESH; - } else if ( !Q_stricmp( token, "mech" ) ) { + else if( !Q_stricmp( token, "mech" ) ) ci->footsteps = FOOTSTEP_MECH; - } else if ( !Q_stricmp( token, "energy" ) ) { + else if( !Q_stricmp( token, "energy" ) ) ci->footsteps = FOOTSTEP_ENERGY; - } else { + else CG_Printf( "Bad footsteps parm in %s: %s\n", filename, token ); - } + continue; - } else if ( !Q_stricmp( token, "headoffset" ) ) { - for ( i = 0 ; i < 3 ; i++ ) { + } + else if( !Q_stricmp( token, "headoffset" ) ) + { + for( i = 0 ; i < 3 ; i++ ) + { token = COM_Parse( &text_p ); - if ( !token ) { + if( !token ) break; - } - ci->headOffset[i] = atof( token ); + + ci->headOffset[ i ] = atof( token ); } + continue; - } else if ( !Q_stricmp( token, "sex" ) ) { + } + else if( !Q_stricmp( token, "sex" ) ) + { token = COM_Parse( &text_p ); - if ( !token ) { + + if( !token ) break; - } - if ( token[0] == 'f' || token[0] == 'F' ) { + + if( token[ 0 ] == 'f' || token[ 0 ] == 'F' ) ci->gender = GENDER_FEMALE; - } else if ( token[0] == 'n' || token[0] == 'N' ) { + else if( token[ 0 ] == 'n' || token[ 0 ] == 'N' ) ci->gender = GENDER_NEUTER; - } else { + else ci->gender = GENDER_MALE; - } + continue; - } else if ( !Q_stricmp( token, "fixedlegs" ) ) { + } + else if( !Q_stricmp( token, "fixedlegs" ) ) + { ci->fixedlegs = qtrue; continue; - } else if ( !Q_stricmp( token, "fixedtorso" ) ) { + } + else if( !Q_stricmp( token, "fixedtorso" ) ) + { ci->fixedtorso = qtrue; continue; } // if it is a number, start parsing animations - if ( token[0] >= '0' && token[0] <= '9' ) { + if( token[ 0 ] >= '0' && token[ 0 ] <= '9' ) + { text_p = prev; // unget the token break; } + Com_Printf( "unknown token '%s' is %s\n", token, filename ); } // read information for each frame - for ( i = 0 ; i < MAX_PLAYER_ANIMATIONS ; i++ ) { - + for( i = 0; i < MAX_PLAYER_ANIMATIONS; i++ ) + { token = COM_Parse( &text_p ); - if ( !*token ) { - if( i >= TORSO_GETFLAG && i <= TORSO_NEGATIVE ) { - animations[i].firstFrame = animations[TORSO_GESTURE].firstFrame; - animations[i].frameLerp = animations[TORSO_GESTURE].frameLerp; - animations[i].initialLerp = animations[TORSO_GESTURE].initialLerp; - animations[i].loopFrames = animations[TORSO_GESTURE].loopFrames; - animations[i].numFrames = animations[TORSO_GESTURE].numFrames; - animations[i].reversed = qfalse; - animations[i].flipflop = qfalse; + + if( !*token ) + { + if( i >= TORSO_GETFLAG && i <= TORSO_NEGATIVE ) + { + animations[ i ].firstFrame = animations[ TORSO_GESTURE ].firstFrame; + animations[ i ].frameLerp = animations[ TORSO_GESTURE ].frameLerp; + animations[ i ].initialLerp = animations[ TORSO_GESTURE ].initialLerp; + animations[ i ].loopFrames = animations[ TORSO_GESTURE ].loopFrames; + animations[ i ].numFrames = animations[ TORSO_GESTURE ].numFrames; + animations[ i ].reversed = qfalse; + animations[ i ].flipflop = qfalse; continue; } + break; } - animations[i].firstFrame = atoi( token ); + + animations[ i ].firstFrame = atoi( token ); + // leg only frames are adjusted to not count the upper body only frames - if ( i == LEGS_WALKCR ) { - skip = animations[LEGS_WALKCR].firstFrame - animations[TORSO_GESTURE].firstFrame; - } - if ( i >= LEGS_WALKCR && i<TORSO_GETFLAG ) { - animations[i].firstFrame -= skip; - } + if( i == LEGS_WALKCR ) + skip = animations[ LEGS_WALKCR ].firstFrame - animations[ TORSO_GESTURE ].firstFrame; + + if( i >= LEGS_WALKCR && i<TORSO_GETFLAG ) + animations[ i ].firstFrame -= skip; token = COM_Parse( &text_p ); - if ( !*token ) { + if( !*token ) break; - } - animations[i].numFrames = atoi( token ); - animations[i].reversed = qfalse; - animations[i].flipflop = qfalse; + + animations[ i ].numFrames = atoi( token ); + animations[ i ].reversed = qfalse; + animations[ i ].flipflop = qfalse; + // if numFrames is negative the animation is reversed - if (animations[i].numFrames < 0) { - animations[i].numFrames = -animations[i].numFrames; - animations[i].reversed = qtrue; + if( animations[ i ].numFrames < 0 ) + { + animations[ i ].numFrames = -animations[ i ].numFrames; + animations[ i ].reversed = qtrue; } token = COM_Parse( &text_p ); - if ( !*token ) { + + if( !*token ) break; - } - animations[i].loopFrames = atoi( token ); + + animations[ i ].loopFrames = atoi( token ); token = COM_Parse( &text_p ); - if ( !*token ) { + + if( !*token ) break; - } + fps = atof( token ); - if ( fps == 0 ) { + if( fps == 0 ) fps = 1; - } - animations[i].frameLerp = 1000 / fps; - animations[i].initialLerp = 1000 / fps; + + animations[ i ].frameLerp = 1000 / fps; + animations[ i ].initialLerp = 1000 / fps; } - if ( i != MAX_PLAYER_ANIMATIONS ) { + if( i != MAX_PLAYER_ANIMATIONS ) + { CG_Printf( "Error parsing animation file: %s", filename ); return qfalse; } // crouch backward animation - memcpy(&animations[LEGS_BACKCR], &animations[LEGS_WALKCR], sizeof(animation_t)); - animations[LEGS_BACKCR].reversed = qtrue; + memcpy( &animations[ LEGS_BACKCR ], &animations[ LEGS_WALKCR ], sizeof( animation_t ) ); + animations[ LEGS_BACKCR ].reversed = qtrue; // walk backward animation - memcpy(&animations[LEGS_BACKWALK], &animations[LEGS_WALK], sizeof(animation_t)); - animations[LEGS_BACKWALK].reversed = qtrue; + memcpy( &animations[ LEGS_BACKWALK ], &animations[ LEGS_WALK ], sizeof( animation_t ) ); + animations[ LEGS_BACKWALK ].reversed = qtrue; // flag moving fast - animations[FLAG_RUN].firstFrame = 0; - animations[FLAG_RUN].numFrames = 16; - animations[FLAG_RUN].loopFrames = 16; - animations[FLAG_RUN].frameLerp = 1000 / 15; - animations[FLAG_RUN].initialLerp = 1000 / 15; - animations[FLAG_RUN].reversed = qfalse; + animations[ FLAG_RUN ].firstFrame = 0; + animations[ FLAG_RUN ].numFrames = 16; + animations[ FLAG_RUN ].loopFrames = 16; + animations[ FLAG_RUN ].frameLerp = 1000 / 15; + animations[ FLAG_RUN ].initialLerp = 1000 / 15; + animations[ FLAG_RUN ].reversed = qfalse; // flag not moving or moving slowly - animations[FLAG_STAND].firstFrame = 16; - animations[FLAG_STAND].numFrames = 5; - animations[FLAG_STAND].loopFrames = 0; - animations[FLAG_STAND].frameLerp = 1000 / 20; - animations[FLAG_STAND].initialLerp = 1000 / 20; - animations[FLAG_STAND].reversed = qfalse; + animations[ FLAG_STAND ].firstFrame = 16; + animations[ FLAG_STAND ].numFrames = 5; + animations[ FLAG_STAND ].loopFrames = 0; + animations[ FLAG_STAND ].frameLerp = 1000 / 20; + animations[ FLAG_STAND ].initialLerp = 1000 / 20; + animations[ FLAG_STAND ].reversed = qfalse; // flag speeding up - animations[FLAG_STAND2RUN].firstFrame = 16; - animations[FLAG_STAND2RUN].numFrames = 5; - animations[FLAG_STAND2RUN].loopFrames = 1; - animations[FLAG_STAND2RUN].frameLerp = 1000 / 15; - animations[FLAG_STAND2RUN].initialLerp = 1000 / 15; - animations[FLAG_STAND2RUN].reversed = qtrue; - // - // new anims changes - // -// animations[TORSO_GETFLAG].flipflop = qtrue; -// animations[TORSO_GUARDBASE].flipflop = qtrue; -// animations[TORSO_PATROL].flipflop = qtrue; -// animations[TORSO_AFFIRMATIVE].flipflop = qtrue; -// animations[TORSO_NEGATIVE].flipflop = qtrue; - // + animations[ FLAG_STAND2RUN ].firstFrame = 16; + animations[ FLAG_STAND2RUN ].numFrames = 5; + animations[ FLAG_STAND2RUN ].loopFrames = 1; + animations[ FLAG_STAND2RUN ].frameLerp = 1000 / 15; + animations[ FLAG_STAND2RUN ].initialLerp = 1000 / 15; + animations[ FLAG_STAND2RUN ].reversed = qtrue; + return qtrue; } @@ -286,30 +308,27 @@ static qboolean CG_ParseAnimationFile( const char *filename, clientInfo_t *ci ) CG_RegisterClientSkin ========================== */ -static qboolean CG_RegisterClientSkin( clientInfo_t *ci, const char *modelName, const char *skinName ) { - char filename[MAX_QPATH]; +static qboolean CG_RegisterClientSkin( clientInfo_t *ci, const char *modelName, const char *skinName ) +{ + char filename[ MAX_QPATH ]; Com_sprintf( filename, sizeof( filename ), "models/players/%s/lower_%s.skin", modelName, skinName ); ci->legsSkin = trap_R_RegisterSkin( filename ); - if (!ci->legsSkin) { + if( !ci->legsSkin ) Com_Printf( "Leg skin load failure: %s\n", filename ); - } Com_sprintf( filename, sizeof( filename ), "models/players/%s/upper_%s.skin", modelName, skinName ); ci->torsoSkin = trap_R_RegisterSkin( filename ); - if (!ci->torsoSkin) { + if( !ci->torsoSkin ) Com_Printf( "Torso skin load failure: %s\n", filename ); - } Com_sprintf( filename, sizeof( filename ), "models/players/%s/head_%s.skin", modelName, skinName ); ci->headSkin = trap_R_RegisterSkin( filename ); - if (!ci->headSkin) { + if( !ci->headSkin ) Com_Printf( "Head skin load failure: %s\n", filename ); - } - if ( !ci->legsSkin || !ci->torsoSkin || !ci->headSkin ) { + if( !ci->legsSkin || !ci->torsoSkin || !ci->headSkin ) return qfalse; - } return qtrue; } @@ -319,48 +338,55 @@ static qboolean CG_RegisterClientSkin( clientInfo_t *ci, const char *modelName, CG_RegisterClientModelname ========================== */ -static qboolean CG_RegisterClientModelname( clientInfo_t *ci, const char *modelName, const char *skinName ) { - char filename[MAX_QPATH*2]; +static qboolean CG_RegisterClientModelname( clientInfo_t *ci, const char *modelName, const char *skinName ) +{ + char filename[ MAX_QPATH * 2 ]; // load cmodels before models so filecache works Com_sprintf( filename, sizeof( filename ), "models/players/%s/lower.md3", modelName ); ci->legsModel = trap_R_RegisterModel( filename ); - if ( !ci->legsModel ) { + if( !ci->legsModel ) + { Com_Printf( "Failed to load model file %s\n", filename ); return qfalse; } Com_sprintf( filename, sizeof( filename ), "models/players/%s/upper.md3", modelName ); ci->torsoModel = trap_R_RegisterModel( filename ); - if ( !ci->torsoModel ) { + if( !ci->torsoModel ) + { Com_Printf( "Failed to load model file %s\n", filename ); return qfalse; } Com_sprintf( filename, sizeof( filename ), "models/players/%s/head.md3", modelName ); ci->headModel = trap_R_RegisterModel( filename ); - if ( !ci->headModel ) { + if( !ci->headModel ) + { Com_Printf( "Failed to load model file %s\n", filename ); return qfalse; } // if any skins failed to load, return failure - if ( !CG_RegisterClientSkin( ci, modelName, skinName ) ) { + if( !CG_RegisterClientSkin( ci, modelName, skinName ) ) + { Com_Printf( "Failed to load skin file: %s : %s\n", modelName, skinName ); return qfalse; } // load the animations Com_sprintf( filename, sizeof( filename ), "models/players/%s/animation.cfg", modelName ); - if ( !CG_ParseAnimationFile( filename, ci ) ) { + if( !CG_ParseAnimationFile( filename, ci ) ) + { Com_Printf( "Failed to load animation file %s\n", filename ); return qfalse; } Com_sprintf( filename, sizeof( filename ), "models/players/%s/icon_%s.tga", modelName, skinName ); ci->modelIcon = trap_R_RegisterShaderNoMip( filename ); - if ( !ci->modelIcon ) { + if( !ci->modelIcon ) + { Com_Printf( "Failed to load icon file: %s\n", filename ); return qfalse; } @@ -373,27 +399,28 @@ static qboolean CG_RegisterClientModelname( clientInfo_t *ci, const char *modelN CG_ColorFromString ==================== */ -static void CG_ColorFromString( const char *v, vec3_t color ) { +static void CG_ColorFromString( const char *v, vec3_t color ) +{ int val; VectorClear( color ); val = atoi( v ); - if ( val < 1 || val > 7 ) { + if( val < 1 || val > 7 ) + { VectorSet( color, 1, 1, 1 ); return; } - if ( val & 1 ) { - color[2] = 1.0f; - } - if ( val & 2 ) { - color[1] = 1.0f; - } - if ( val & 4 ) { - color[0] = 1.0f; - } + if( val & 1 ) + color[ 2 ] = 1.0f; + + if( val & 2 ) + color[ 1 ] = 1.0f; + + if( val & 4 ) + color[ 0 ] = 1.0f; } @@ -405,16 +432,17 @@ Load it now, taking the disk hits. This will usually be deferred to a safe time =================== */ -static void CG_LoadClientInfo( clientInfo_t *ci ) { +static void CG_LoadClientInfo( clientInfo_t *ci ) +{ const char *dir, *fallback; - int i; + int i; const char *s; - int clientNum; + int clientNum; - if ( !CG_RegisterClientModelname( ci, ci->modelName, ci->skinName ) ) { - if ( cg_buildScript.integer ) { + if( !CG_RegisterClientModelname( ci, ci->modelName, ci->skinName ) ) + { + if( cg_buildScript.integer ) CG_Error( "CG_RegisterClientModelname( %s, %s ) failed", ci->modelName, ci->skinName ); - } // fall back if( !CG_RegisterClientModelname( ci, DEFAULT_MODEL, "default" ) ) @@ -425,15 +453,16 @@ static void CG_LoadClientInfo( clientInfo_t *ci ) { dir = ci->modelName; fallback = DEFAULT_MODEL; - for ( i = 0 ; i < MAX_CUSTOM_SOUNDS ; i++ ) { - s = cg_customSoundNames[i]; - if ( !s ) { + for( i = 0 ; i < MAX_CUSTOM_SOUNDS ; i++ ) + { + s = cg_customSoundNames[ i ]; + + if( !s ) break; - } - ci->sounds[i] = trap_S_RegisterSound( va("sound/player/%s/%s", dir, s + 1), qfalse ); - if ( !ci->sounds[i] ) { - ci->sounds[i] = trap_S_RegisterSound( va("sound/player/%s/%s", fallback, s + 1), qfalse ); - } + + ci->sounds[ i ] = trap_S_RegisterSound( va( "sound/player/%s/%s", dir, s + 1 ), qfalse ); + if( !ci->sounds[ i ] ) + ci->sounds[ i ] = trap_S_RegisterSound( va( "sound/player/%s/%s", fallback, s + 1 ), qfalse ); } ci->deferred = qfalse; @@ -443,11 +472,11 @@ static void CG_LoadClientInfo( clientInfo_t *ci ) { if( clientNum <= MAX_CLIENTS ) { clientNum = ci - cgs.clientinfo; - for ( i = 0 ; i < MAX_GENTITIES ; i++ ) { - if ( cg_entities[i].currentState.clientNum == clientNum - && cg_entities[i].currentState.eType == ET_PLAYER ) { - CG_ResetPlayerEntity( &cg_entities[i] ); - } + for( i = 0; i < MAX_GENTITIES; i++ ) + { + if( cg_entities[ i ].currentState.clientNum == clientNum && + cg_entities[ i ].currentState.eType == ET_PLAYER ) + CG_ResetPlayerEntity( &cg_entities[ i ] ); } } } @@ -457,7 +486,8 @@ static void CG_LoadClientInfo( clientInfo_t *ci ) { CG_CopyClientInfoModel ====================== */ -static void CG_CopyClientInfoModel( clientInfo_t *from, clientInfo_t *to ) { +static void CG_CopyClientInfoModel( clientInfo_t *from, clientInfo_t *to ) +{ VectorCopy( from->headOffset, to->headOffset ); to->footsteps = from->footsteps; to->gender = from->gender; @@ -480,24 +510,27 @@ static void CG_CopyClientInfoModel( clientInfo_t *from, clientInfo_t *to ) { CG_GetCorpseNum ====================== */ -static int CG_GetCorpseNum( int pclass ) { +static int CG_GetCorpseNum( int pclass ) +{ int i; clientInfo_t *match; char *modelName; modelName = BG_FindModelNameForClass( pclass ); - for ( i = PCL_NONE + 1 ; i < PCL_NUM_CLASSES; i++ ) + for( i = PCL_NONE + 1; i < PCL_NUM_CLASSES; i++ ) { match = &cgs.corpseinfo[ i ]; - if ( !match->infoValid ) + + if( !match->infoValid ) continue; - if ( match->deferred ) + if( match->deferred ) continue; - if ( !Q_stricmp( modelName, match->modelName ) - /*&& !Q_stricmp( modelName, match->skinName )*/ ) { + if( !Q_stricmp( modelName, match->modelName ) + /*&& !Q_stricmp( modelName, match->skinName )*/ ) + { // this clientinfo is identical, so use it's handles return i; } @@ -513,22 +546,24 @@ static int CG_GetCorpseNum( int pclass ) { CG_ScanForExistingClientInfo ====================== */ -static qboolean CG_ScanForExistingClientInfo( clientInfo_t *ci ) { +static qboolean CG_ScanForExistingClientInfo( clientInfo_t *ci ) +{ int i; clientInfo_t *match; - for ( i = 0 ; i < cgs.maxclients ; i++ ) { + for( i = 0 ; i < cgs.maxclients ; i++ ) + { match = &cgs.clientinfo[ i ]; - if ( !match->infoValid ) { + if( !match->infoValid ) continue; - } - if ( match->deferred ) { + + if( match->deferred ) continue; - } - if ( !Q_stricmp( ci->modelName, match->modelName ) - && !Q_stricmp( ci->skinName, match->skinName ) ) { - // this clientinfo is identical, so use it's handles + if( !Q_stricmp( ci->modelName, match->modelName ) && + !Q_stricmp( ci->skinName, match->skinName ) ) + { + // this clientinfo is identical, so use it's handles ci->deferred = qfalse; CG_CopyClientInfoModel( match, ci ); @@ -549,16 +584,17 @@ We aren't going to load it now, so grab some other client's info to use until we have some spare time. ====================== */ -static void CG_SetDeferredClientInfo( clientInfo_t *ci ) { - int i; +static void CG_SetDeferredClientInfo( clientInfo_t *ci ) +{ + int i; clientInfo_t *match; // find the first valid clientinfo and grab its stuff - for ( i = 0 ; i < cgs.maxclients ; i++ ) { + for( i = 0; i < cgs.maxclients; i++ ) + { match = &cgs.clientinfo[ i ]; - if ( !match->infoValid ) { + if( !match->infoValid ) continue; - } ci->deferred = qtrue; CG_CopyClientInfoModel( match, ci ); @@ -577,28 +613,28 @@ static void CG_SetDeferredClientInfo( clientInfo_t *ci ) { CG_PrecacheClientInfo ====================== */ -void CG_PrecacheClientInfo( int clientNum ) { - clientInfo_t *ci; - clientInfo_t newInfo; - const char *configstring; - const char *v; - char *slash; +void CG_PrecacheClientInfo( int clientNum ) +{ + clientInfo_t *ci; + clientInfo_t newInfo; + const char *configstring; + const char *v; + char *slash; ci = &cgs.corpseinfo[ clientNum ]; //CG_Printf( "%d %d\n", clientNum, (clientNum - MAX_CLIENTS ) ); configstring = CG_ConfigString( clientNum + CS_PRECACHES ); - if ( !configstring[0] ) { + if( !configstring[ 0 ] ) return; // player just left - } // build into a temp buffer so the defer checks can use // the old value memset( &newInfo, 0, sizeof( newInfo ) ); // isolate the player's name - v = Info_ValueForKey(configstring, "n"); + v = Info_ValueForKey( configstring, "n" ); Q_strncpyz( newInfo.name, v, sizeof( newInfo.name ) ); // colors @@ -630,27 +666,30 @@ void CG_PrecacheClientInfo( int clientNum ) { // team task v = Info_ValueForKey( configstring, "tt" ); - newInfo.teamTask = atoi(v); + newInfo.teamTask = atoi( v ); // team leader v = Info_ValueForKey( configstring, "tl" ); - newInfo.teamLeader = atoi(v); + newInfo.teamLeader = atoi( v ); v = Info_ValueForKey( configstring, "g_redteam" ); - Q_strncpyz(newInfo.redTeam, v, MAX_TEAMNAME); + Q_strncpyz( newInfo.redTeam, v, MAX_TEAMNAME ); v = Info_ValueForKey( configstring, "g_blueteam" ); - Q_strncpyz(newInfo.blueTeam, v, MAX_TEAMNAME); + Q_strncpyz( newInfo.blueTeam, v, MAX_TEAMNAME ); // model v = Info_ValueForKey( configstring, "model" ); Q_strncpyz( newInfo.modelName, v, sizeof( newInfo.modelName ) ); slash = strchr( newInfo.modelName, '/' ); - if ( !slash ) { + if( !slash ) + { // modelName didn not include a skin name Q_strncpyz( newInfo.skinName, "default", sizeof( newInfo.skinName ) ); - } else { + } + else + { Q_strncpyz( newInfo.skinName, slash + 1, sizeof( newInfo.skinName ) ); // truncate modelName *slash = 0; @@ -663,10 +702,14 @@ void CG_PrecacheClientInfo( int clientNum ) { Q_strncpyz( newInfo.headModelName, v, sizeof( newInfo.headModelName ) ); slash = strchr( newInfo.headModelName, '/' ); - if ( !slash ) { + + if( !slash ) + { // modelName didn not include a skin name Q_strncpyz( newInfo.headSkinName, "default", sizeof( newInfo.headSkinName ) ); - } else { + } + else + { Q_strncpyz( newInfo.headSkinName, slash + 1, sizeof( newInfo.headSkinName ) ); // truncate modelName *slash = 0; @@ -684,17 +727,19 @@ void CG_PrecacheClientInfo( int clientNum ) { CG_NewClientInfo ====================== */ -void CG_NewClientInfo( int clientNum ) { - clientInfo_t *ci; - clientInfo_t newInfo; - const char *configstring; - const char *v; - char *slash; +void CG_NewClientInfo( int clientNum ) +{ + clientInfo_t *ci; + clientInfo_t newInfo; + const char *configstring; + const char *v; + char *slash; - ci = &cgs.clientinfo[clientNum]; + ci = &cgs.clientinfo[ clientNum ]; configstring = CG_ConfigString( clientNum + CS_PLAYERS ); - if ( !configstring[0] ) { + if( !configstring[0] ) + { memset( ci, 0, sizeof( *ci ) ); return; // player just left } @@ -704,7 +749,7 @@ void CG_NewClientInfo( int clientNum ) { memset( &newInfo, 0, sizeof( newInfo ) ); // isolate the player's name - v = Info_ValueForKey(configstring, "n"); + v = Info_ValueForKey( configstring, "n" ); Q_strncpyz( newInfo.name, v, sizeof( newInfo.name ) ); // colors @@ -736,27 +781,31 @@ void CG_NewClientInfo( int clientNum ) { // team task v = Info_ValueForKey( configstring, "tt" ); - newInfo.teamTask = atoi(v); + newInfo.teamTask = atoi( v ); // team leader v = Info_ValueForKey( configstring, "tl" ); - newInfo.teamLeader = atoi(v); + newInfo.teamLeader = atoi( v ); v = Info_ValueForKey( configstring, "g_redteam" ); - Q_strncpyz(newInfo.redTeam, v, MAX_TEAMNAME); + Q_strncpyz( newInfo.redTeam, v, MAX_TEAMNAME ); v = Info_ValueForKey( configstring, "g_blueteam" ); - Q_strncpyz(newInfo.blueTeam, v, MAX_TEAMNAME); + Q_strncpyz( newInfo.blueTeam, v, MAX_TEAMNAME ); // model v = Info_ValueForKey( configstring, "model" ); Q_strncpyz( newInfo.modelName, v, sizeof( newInfo.modelName ) ); slash = strchr( newInfo.modelName, '/' ); - if ( !slash ) { + + if( !slash ) + { // modelName didn not include a skin name Q_strncpyz( newInfo.skinName, "default", sizeof( newInfo.skinName ) ); - } else { + } + else + { Q_strncpyz( newInfo.skinName, slash + 1, sizeof( newInfo.skinName ) ); // truncate modelName *slash = 0; @@ -769,10 +818,14 @@ void CG_NewClientInfo( int clientNum ) { Q_strncpyz( newInfo.headModelName, v, sizeof( newInfo.headModelName ) ); slash = strchr( newInfo.headModelName, '/' ); - if ( !slash ) { + + if( !slash ) + { // modelName didn not include a skin name Q_strncpyz( newInfo.headSkinName, "default", sizeof( newInfo.headSkinName ) ); - } else { + } + else + { Q_strncpyz( newInfo.headSkinName, slash + 1, sizeof( newInfo.headSkinName ) ); // truncate modelName *slash = 0; @@ -780,18 +833,18 @@ void CG_NewClientInfo( int clientNum ) { // scan for an existing clientinfo that matches this modelname // so we can avoid loading checks if possible - if ( !CG_ScanForExistingClientInfo( &newInfo ) ) { + if( !CG_ScanForExistingClientInfo( &newInfo ) ) + { qboolean forceDefer; - forceDefer = trap_MemoryRemaining() < 4000000; + forceDefer = trap_MemoryRemaining( ) < 4000000; // if we are defering loads, just have it pick the first valid //TA: we should only defer models when ABSOLUTELY TOTALLY necessary since models are precached - if ( forceDefer ) //|| ( cg_deferPlayers.integer && !cg_buildScript.integer && !cg.loading ) ) + if( forceDefer ) { // keep whatever they had if it won't violate team skins - if ( ci->infoValid && - ( !Q_stricmp( newInfo.skinName, ci->skinName ) ) ) + if ( ci->infoValid && ( !Q_stricmp( newInfo.skinName, ci->skinName ) ) ) { CG_CopyClientInfoModel( ci, &newInfo ); newInfo.deferred = qtrue; @@ -803,16 +856,14 @@ void CG_NewClientInfo( int clientNum ) { } // if we are low on memory, leave them with this model - if ( forceDefer ) + if( forceDefer ) { CG_Printf( "Memory is low. Using deferred model.\n" ); newInfo.deferred = qfalse; } } else - { CG_LoadClientInfo( &newInfo ); - } } // replace whatever was there with the new one @@ -831,21 +882,25 @@ and the scoreboard is up so deferred players can be loaded ====================== */ -void CG_LoadDeferredPlayers( void ) { - int i; +void CG_LoadDeferredPlayers( void ) +{ + int i; clientInfo_t *ci; // scan for a deferred player to load - for ( i = 0, ci = cgs.clientinfo ; i < cgs.maxclients ; i++, ci++ ) { - if ( ci->infoValid && ci->deferred ) { + for( i = 0, ci = cgs.clientinfo; i < cgs.maxclients; i++, ci++ ) + { + if( ci->infoValid && ci->deferred ) + { // if we are low on memory, leave it deferred - if ( trap_MemoryRemaining() < 4000000 ) { + if( trap_MemoryRemaining( ) < 4000000 ) + { CG_Printf( "Memory is low. Using deferred model.\n" ); ci->deferred = qfalse; continue; } + CG_LoadClientInfo( ci ); -// break; } } } @@ -866,24 +921,23 @@ CG_SetLerpFrameAnimation may include ANIM_TOGGLEBIT =============== */ -static void CG_SetLerpFrameAnimation( clientInfo_t *ci, lerpFrame_t *lf, int newAnimation ) { +static void CG_SetLerpFrameAnimation( clientInfo_t *ci, lerpFrame_t *lf, int newAnimation ) +{ animation_t *anim; lf->animationNumber = newAnimation; newAnimation &= ~ANIM_TOGGLEBIT; - if ( newAnimation < 0 || newAnimation >= MAX_PLAYER_TOTALANIMATIONS ) { + if( newAnimation < 0 || newAnimation >= MAX_PLAYER_TOTALANIMATIONS ) CG_Error( "Bad animation number: %i", newAnimation ); - } anim = &ci->animations[ newAnimation ]; lf->animation = anim; lf->animationTime = lf->frameTime + anim->initialLerp; - if ( cg_debugAnim.integer ) { + if( cg_debugAnim.integer ) CG_Printf( "Anim: %i\n", newAnimation ); - } } /* @@ -894,85 +948,92 @@ Sets cg.snap, cg.oldFrame, and cg.backlerp cg.time should be between oldFrameTime and frameTime after exit =============== */ -static void CG_RunLerpFrame( clientInfo_t *ci, lerpFrame_t *lf, int newAnimation, float speedScale ) { - int f, numFrames; +static void CG_RunLerpFrame( clientInfo_t *ci, lerpFrame_t *lf, int newAnimation, float speedScale ) +{ + int f, numFrames; animation_t *anim; // debugging tool to get no animations - if ( cg_animSpeed.integer == 0 ) { + if( cg_animSpeed.integer == 0 ) + { lf->oldFrame = lf->frame = lf->backlerp = 0; return; } // see if the animation sequence is switching - if ( newAnimation != lf->animationNumber || !lf->animation ) { + if( newAnimation != lf->animationNumber || !lf->animation ) + { CG_SetLerpFrameAnimation( ci, lf, newAnimation ); } // if we have passed the current frame, move it to // oldFrame and calculate a new frame - if ( cg.time >= lf->frameTime ) { + if( cg.time >= lf->frameTime ) + { lf->oldFrame = lf->frame; lf->oldFrameTime = lf->frameTime; // get the next frame based on the animation anim = lf->animation; - if ( !anim->frameLerp ) { + if( !anim->frameLerp ) return; // shouldn't happen - } - if ( cg.time < lf->animationTime ) { + + if( cg.time < lf->animationTime ) lf->frameTime = lf->animationTime; // initial lerp - } else { + else lf->frameTime = lf->oldFrameTime + anim->frameLerp; - } + f = ( lf->frameTime - lf->animationTime ) / anim->frameLerp; f *= speedScale; // adjust for haste, etc numFrames = anim->numFrames; - if (anim->flipflop) { + + if( anim->flipflop ) numFrames *= 2; - } - if ( f >= numFrames ) { + + if( f >= numFrames ) + { f -= numFrames; - if ( anim->loopFrames ) { + if( anim->loopFrames ) + { f %= anim->loopFrames; f += anim->numFrames - anim->loopFrames; - } else { + } + else + { f = numFrames - 1; // the animation is stuck at the end, so it // can immediately transition to another sequence lf->frameTime = cg.time; } } - if ( anim->reversed ) { + + if( anim->reversed ) lf->frame = anim->firstFrame + anim->numFrames - 1 - f; - } - else if (anim->flipflop && f>=anim->numFrames) { - lf->frame = anim->firstFrame + anim->numFrames - 1 - (f%anim->numFrames); - } - else { + else if( anim->flipflop && f>=anim->numFrames ) + lf->frame = anim->firstFrame + anim->numFrames - 1 - ( f % anim->numFrames ); + else lf->frame = anim->firstFrame + f; - } - if ( cg.time > lf->frameTime ) { + + if( cg.time > lf->frameTime ) + { lf->frameTime = cg.time; - if ( cg_debugAnim.integer ) { - CG_Printf( "Clamp lf->frameTime\n"); - } + + if( cg_debugAnim.integer ) + CG_Printf( "Clamp lf->frameTime\n" ); } } - if ( lf->frameTime > cg.time + 200 ) { + if( lf->frameTime > cg.time + 200 ) lf->frameTime = cg.time; - } - if ( lf->oldFrameTime > cg.time ) { + if( lf->oldFrameTime > cg.time ) lf->oldFrameTime = cg.time; - } + // calculate current lerp value - if ( lf->frameTime == lf->oldFrameTime ) { + if( lf->frameTime == lf->oldFrameTime ) lf->backlerp = 0; - } else { + else lf->backlerp = 1.0 - (float)( cg.time - lf->oldFrameTime ) / ( lf->frameTime - lf->oldFrameTime ); - } } @@ -981,7 +1042,8 @@ static void CG_RunLerpFrame( clientInfo_t *ci, lerpFrame_t *lf, int newAnimation CG_ClearLerpFrame =============== */ -static void CG_ClearLerpFrame( clientInfo_t *ci, lerpFrame_t *lf, int animationNumber ) { +static void CG_ClearLerpFrame( clientInfo_t *ci, lerpFrame_t *lf, int animationNumber ) +{ lf->frameTime = lf->oldFrameTime = cg.time; CG_SetLerpFrameAnimation( ci, lf, animationNumber ); lf->oldFrame = lf->frame = lf->animation->firstFrame; @@ -994,32 +1056,27 @@ CG_PlayerAnimation =============== */ static void CG_PlayerAnimation( centity_t *cent, int *legsOld, int *legs, float *legsBackLerp, - int *torsoOld, int *torso, float *torsoBackLerp ) { + int *torsoOld, int *torso, float *torsoBackLerp ) +{ clientInfo_t *ci; - int clientNum; - float speedScale; + int clientNum; + float speedScale = 1.0f; clientNum = cent->currentState.clientNum; - if ( cg_noPlayerAnims.integer ) { + if( cg_noPlayerAnims.integer ) + { *legsOld = *legs = *torsoOld = *torso = 0; return; } - /*if ( cent->currentState.powerups & ( 1 << PW_HASTE ) ) { - speedScale = 1.5; - } else*/ { - speedScale = 1; - } - ci = &cgs.clientinfo[ clientNum ]; // do the shuffle turn frames locally - if ( cent->pe.legs.yawing && ( cent->currentState.legsAnim & ~ANIM_TOGGLEBIT ) == LEGS_IDLE ) { + if( cent->pe.legs.yawing && ( cent->currentState.legsAnim & ~ANIM_TOGGLEBIT ) == LEGS_IDLE ) CG_RunLerpFrame( ci, ¢->pe.legs, LEGS_TURN, speedScale ); - } else { + else CG_RunLerpFrame( ci, ¢->pe.legs, cent->currentState.legsAnim, speedScale ); - } *legsOld = cent->pe.legs.oldFrame; *legs = cent->pe.legs.frame; @@ -1046,46 +1103,54 @@ CG_SwingAngles ================== */ static void CG_SwingAngles( float destination, float swingTolerance, float clampTolerance, - float speed, float *angle, qboolean *swinging ) { + float speed, float *angle, qboolean *swinging ) +{ float swing; float move; float scale; - if ( !*swinging ) { + if( !*swinging ) + { // see if a swing should be started swing = AngleSubtract( *angle, destination ); - if ( swing > swingTolerance || swing < -swingTolerance ) { + + if( swing > swingTolerance || swing < -swingTolerance ) *swinging = qtrue; - } } - if ( !*swinging ) { + if( !*swinging ) return; - } // modify the speed depending on the delta // so it doesn't seem so linear swing = AngleSubtract( destination, *angle ); scale = fabs( swing ); - if ( scale < swingTolerance * 0.5 ) { + + if( scale < swingTolerance * 0.5 ) scale = 0.5; - } else if ( scale < swingTolerance ) { + else if( scale < swingTolerance ) scale = 1.0; - } else { + else scale = 2.0; - } // swing towards the destination angle - if ( swing >= 0 ) { + if( swing >= 0 ) + { move = cg.frametime * scale * speed; - if ( move >= swing ) { + + if( move >= swing ) + { move = swing; *swinging = qfalse; } *angle = AngleMod( *angle + move ); - } else if ( swing < 0 ) { + } + else if( swing < 0 ) + { move = cg.frametime * scale * -speed; - if ( move <= swing ) { + + if( move <= swing ) + { move = swing; *swinging = qfalse; } @@ -1094,11 +1159,10 @@ static void CG_SwingAngles( float destination, float swingTolerance, float clamp // clamp to no more than tolerance swing = AngleSubtract( destination, *angle ); - if ( swing > clampTolerance ) { - *angle = AngleMod( destination - (clampTolerance - 1) ); - } else if ( swing < -clampTolerance ) { - *angle = AngleMod( destination + (clampTolerance - 1) ); - } + if( swing > clampTolerance ) + *angle = AngleMod( destination - ( clampTolerance - 1 ) ); + else if( swing < -clampTolerance ) + *angle = AngleMod( destination + ( clampTolerance - 1 ) ); } /* @@ -1106,22 +1170,22 @@ static void CG_SwingAngles( float destination, float swingTolerance, float clamp CG_AddPainTwitch ================= */ -static void CG_AddPainTwitch( centity_t *cent, vec3_t torsoAngles ) { +static void CG_AddPainTwitch( centity_t *cent, vec3_t torsoAngles ) +{ int t; float f; t = cg.time - cent->pe.painTime; - if ( t >= PAIN_TWITCH_TIME ) { + + if( t >= PAIN_TWITCH_TIME ) return; - } f = 1.0 - (float)t / PAIN_TWITCH_TIME; - if ( cent->pe.painDirection ) { - torsoAngles[ROLL] += 20 * f; - } else { - torsoAngles[ROLL] -= 20 * f; - } + if( cent->pe.painDirection ) + torsoAngles[ ROLL ] += 20 * f; + else + torsoAngles[ ROLL ] -= 20 * f; } @@ -1139,26 +1203,28 @@ Handles seperate torso motion if < 45 degrees, also show in torso =============== */ -static void CG_PlayerAngles( centity_t *cent, vec3_t srcAngles, vec3_t legs[3], vec3_t torso[3], vec3_t head[3] ) +static void CG_PlayerAngles( centity_t *cent, vec3_t srcAngles, + vec3_t legs[ 3 ], vec3_t torso[ 3 ], vec3_t head[ 3 ] ) { - vec3_t legsAngles, torsoAngles, headAngles; - float dest; - static int movementOffsets[8] = { 0, 22, 45, -22, 0, 22, -45, -22 }; - vec3_t velocity; - float speed; - int dir, clientNum; + vec3_t legsAngles, torsoAngles, headAngles; + float dest; + static int movementOffsets[ 8 ] = { 0, 22, 45, -22, 0, 22, -45, -22 }; + vec3_t velocity; + float speed; + int dir, clientNum; clientInfo_t *ci; VectorCopy( srcAngles, headAngles ); - headAngles[YAW] = AngleMod( headAngles[YAW] ); + headAngles[ YAW ] = AngleMod( headAngles[ YAW ] ); VectorClear( legsAngles ); VectorClear( torsoAngles ); // --------- yaw ------------- // allow yaw to drift a bit - if ( ( cent->currentState.legsAnim & ~ANIM_TOGGLEBIT ) != LEGS_IDLE - || ( cent->currentState.torsoAnim & ~ANIM_TOGGLEBIT ) != TORSO_STAND ) { + if( ( cent->currentState.legsAnim & ~ANIM_TOGGLEBIT ) != LEGS_IDLE || + ( cent->currentState.torsoAnim & ~ANIM_TOGGLEBIT ) != TORSO_STAND ) + { // if not standing still, always point all in the same direction cent->pe.torso.yawing = qtrue; // always center cent->pe.torso.pitching = qtrue; // always center @@ -1166,56 +1232,60 @@ static void CG_PlayerAngles( centity_t *cent, vec3_t srcAngles, vec3_t legs[3], } // adjust legs for movement dir - if ( cent->currentState.eFlags & EF_DEAD ) { + if( cent->currentState.eFlags & EF_DEAD ) + { // don't let dead bodies twitch dir = 0; - } else { + } + else + { //TA: did use angles2.. now uses time2.. looks a bit funny but time2 isn't used othwise dir = cent->currentState.time2; - if ( dir < 0 || dir > 7 ) { + if( dir < 0 || dir > 7 ) CG_Error( "Bad player movement angle" ); - } } - legsAngles[YAW] = headAngles[YAW] + movementOffsets[ dir ]; - torsoAngles[YAW] = headAngles[YAW] + 0.25 * movementOffsets[ dir ]; + + legsAngles[ YAW ] = headAngles[ YAW ] + movementOffsets[ dir ]; + torsoAngles[ YAW ] = headAngles[ YAW ] + 0.25 * movementOffsets[ dir ]; // torso if( cent->currentState.eFlags & EF_DEAD ) { - CG_SwingAngles( torsoAngles[YAW], 0, 0, cg_swingSpeed.value, + CG_SwingAngles( torsoAngles[ YAW ], 0, 0, cg_swingSpeed.value, ¢->pe.torso.yawAngle, ¢->pe.torso.yawing ); - CG_SwingAngles( legsAngles[YAW], 0, 0, cg_swingSpeed.value, + CG_SwingAngles( legsAngles[ YAW ], 0, 0, cg_swingSpeed.value, ¢->pe.legs.yawAngle, ¢->pe.legs.yawing ); } else { - CG_SwingAngles( torsoAngles[YAW], 25, 90, cg_swingSpeed.value, + CG_SwingAngles( torsoAngles[ YAW ], 25, 90, cg_swingSpeed.value, ¢->pe.torso.yawAngle, ¢->pe.torso.yawing ); - CG_SwingAngles( legsAngles[YAW], 40, 90, cg_swingSpeed.value, + CG_SwingAngles( legsAngles[ YAW ], 40, 90, cg_swingSpeed.value, ¢->pe.legs.yawAngle, ¢->pe.legs.yawing ); } - torsoAngles[YAW] = cent->pe.torso.yawAngle; - legsAngles[YAW] = cent->pe.legs.yawAngle; + torsoAngles[ YAW ] = cent->pe.torso.yawAngle; + legsAngles[ YAW ] = cent->pe.legs.yawAngle; // --------- pitch ------------- // only show a fraction of the pitch angle in the torso - if ( headAngles[PITCH] > 180 ) { - dest = (-360 + headAngles[PITCH]) * 0.75f; - } else { - dest = headAngles[PITCH] * 0.75f; - } + if( headAngles[ PITCH ] > 180 ) + dest = ( -360 + headAngles[ PITCH ] ) * 0.75f; + else + dest = headAngles[ PITCH ] * 0.75f; + CG_SwingAngles( dest, 15, 30, 0.1f, ¢->pe.torso.pitchAngle, ¢->pe.torso.pitching ); - torsoAngles[PITCH] = cent->pe.torso.pitchAngle; + torsoAngles[ PITCH ] = cent->pe.torso.pitchAngle; // clientNum = cent->currentState.clientNum; - if ( clientNum >= 0 && clientNum < MAX_CLIENTS ) { + + if( clientNum >= 0 && clientNum < MAX_CLIENTS ) + { ci = &cgs.clientinfo[ clientNum ]; - if ( ci->fixedtorso ) { - torsoAngles[PITCH] = 0.0f; - } + if( ci->fixedtorso ) + torsoAngles[ PITCH ] = 0.0f; } // --------- roll ------------- @@ -1224,28 +1294,34 @@ static void CG_PlayerAngles( centity_t *cent, vec3_t srcAngles, vec3_t legs[3], // lean towards the direction of travel VectorCopy( cent->currentState.pos.trDelta, velocity ); speed = VectorNormalize( velocity ); - if ( speed ) { - vec3_t axis[3]; - float side; + + if( speed ) + { + vec3_t axis[ 3 ]; + float side; speed *= 0.05f; AnglesToAxis( legsAngles, axis ); - side = speed * DotProduct( velocity, axis[1] ); - legsAngles[ROLL] -= side; + side = speed * DotProduct( velocity, axis[ 1 ] ); + legsAngles[ ROLL ] -= side; - side = speed * DotProduct( velocity, axis[0] ); - legsAngles[PITCH] += side; + side = speed * DotProduct( velocity, axis[ 0 ] ); + legsAngles[ PITCH ] += side; } // clientNum = cent->currentState.clientNum; - if ( clientNum >= 0 && clientNum < MAX_CLIENTS ) { + + if( clientNum >= 0 && clientNum < MAX_CLIENTS ) + { ci = &cgs.clientinfo[ clientNum ]; - if ( ci->fixedlegs ) { - legsAngles[YAW] = torsoAngles[YAW]; - legsAngles[PITCH] = 0.0f; - legsAngles[ROLL] = 0.0f; + + if( ci->fixedlegs ) + { + legsAngles[ YAW ] = torsoAngles[ YAW ]; + legsAngles[ PITCH ] = 0.0f; + legsAngles[ ROLL ] = 0.0f; } } @@ -1263,70 +1339,6 @@ static void CG_PlayerAngles( centity_t *cent, vec3_t srcAngles, vec3_t legs[3], //========================================================================== -/* -=============== -CG_HasteTrail -=============== -*/ -static void CG_HasteTrail( centity_t *cent ) { - localEntity_t *smoke; - vec3_t origin; - int anim; - - if ( cent->trailTime > cg.time ) { - return; - } - anim = cent->pe.legs.animationNumber & ~ANIM_TOGGLEBIT; - if ( anim != LEGS_RUN && anim != LEGS_BACK ) { - return; - } - - cent->trailTime += 100; - if ( cent->trailTime < cg.time ) { - cent->trailTime = cg.time; - } - - VectorCopy( cent->lerpOrigin, origin ); - origin[2] -= 16; - - smoke = CG_SmokePuff( origin, vec3_origin, - 8, - 1, 1, 1, 1, - 500, - cg.time, - 0, - 0, - cgs.media.hastePuffShader ); - - // use the optimized local entity add - smoke->leType = LE_SCALE_FADE; -} - -/* -=============== -CG_TrailItem -=============== -*/ -static void CG_TrailItem( centity_t *cent, qhandle_t hModel ) { - refEntity_t ent; - vec3_t angles; - vec3_t axis[3]; - - VectorCopy( cent->lerpAngles, angles ); - angles[PITCH] = 0; - angles[ROLL] = 0; - AnglesToAxis( angles, axis ); - - memset( &ent, 0, sizeof( ent ) ); - VectorMA( cent->lerpOrigin, -16, axis[0], ent.origin ); - ent.origin[2] += 16; - angles[YAW] += 90; - AnglesToAxis( angles, ent.axis ); - - ent.hModel = hModel; - trap_R_AddRefEntityToScene( &ent ); -} - #define JET_SPREAD 30.0f #define JET_LIFETIME 1500 @@ -1404,37 +1416,6 @@ static void CG_PlayerUpgrades( centity_t *cent, refEntity_t *torso ) } } } - /*powerups = cent->currentState.powerups; - if ( !powerups ) { - return; - } - - // quad gives a dlight - if ( powerups & ( 1 << PW_QUAD ) ) { - trap_R_AddLightToScene( cent->lerpOrigin, 200 + (rand()&31), 0.2, 0.2, 1 ); - } - - // flight plays a looped sound - if ( powerups & ( 1 << PW_FLIGHT ) ) { - trap_S_AddLoopingSound( cent->currentState.number, cent->lerpOrigin, vec3_origin, cgs.media.flightSound ); - } - - // redflag - if ( powerups & ( 1 << PW_REDFLAG ) ) { - CG_TrailItem( cent, cgs.media.redFlagModel ); - trap_R_AddLightToScene( cent->lerpOrigin, 200 + (rand()&31), 1, 0.2, 0.2 ); - } - - // blueflag - if ( powerups & ( 1 << PW_BLUEFLAG ) ) { - CG_TrailItem( cent, cgs.media.blueFlagModel ); - trap_R_AddLightToScene( cent->lerpOrigin, 200 + (rand()&31), 0.2, 0.2, 1 ); - } - - // haste leaves smoke trails - if ( powerups & ( 1 << PW_HASTE ) ) { - CG_HasteTrail( cent ); - }*/ } @@ -1445,27 +1426,27 @@ CG_PlayerFloatSprite Float a sprite over the player's head =============== */ -static void CG_PlayerFloatSprite( centity_t *cent, qhandle_t shader ) { - int rf; +static void CG_PlayerFloatSprite( centity_t *cent, qhandle_t shader ) +{ + int rf; refEntity_t ent; - if ( cent->currentState.number == cg.snap->ps.clientNum && !cg.renderingThirdPerson ) { + if( cent->currentState.number == cg.snap->ps.clientNum && !cg.renderingThirdPerson ) rf = RF_THIRD_PERSON; // only show in mirrors - } else { + else rf = 0; - } memset( &ent, 0, sizeof( ent ) ); VectorCopy( cent->lerpOrigin, ent.origin ); - ent.origin[2] += 48; + ent.origin[ 2 ] += 48; ent.reType = RT_SPRITE; ent.customShader = shader; ent.radius = 10; ent.renderfx = rf; - ent.shaderRGBA[0] = 255; - ent.shaderRGBA[1] = 255; - ent.shaderRGBA[2] = 255; - ent.shaderRGBA[3] = 255; + ent.shaderRGBA[ 0 ] = 255; + ent.shaderRGBA[ 1 ] = 255; + ent.shaderRGBA[ 2 ] = 255; + ent.shaderRGBA[ 3 ] = 255; trap_R_AddRefEntityToScene( &ent ); } @@ -1503,38 +1484,31 @@ Returns the Z component of the surface being shadowed =============== */ #define SHADOW_DISTANCE 128 -static qboolean CG_PlayerShadow( centity_t *cent, float *shadowPlane ) { - vec3_t end, mins = {-15, -15, 0}, maxs = {15, 15, 2}; +static qboolean CG_PlayerShadow( centity_t *cent, float *shadowPlane ) +{ + vec3_t end, mins = { -15, -15, 0 }, maxs = { 15, 15, 2 }; trace_t trace; - float alpha; + float alpha; *shadowPlane = 0; - if ( cg_shadows.integer == 0 ) { - return qfalse; - } - - // no shadows when invisible - /*if ( cent->currentState.powerups & ( 1 << PW_INVIS ) ) { + if( cg_shadows.integer == 0 ) return qfalse; - }*/ // send a trace down from the player to the ground VectorCopy( cent->lerpOrigin, end ); - end[2] -= SHADOW_DISTANCE; + end[ 2 ] -= SHADOW_DISTANCE; trap_CM_BoxTrace( &trace, cent->lerpOrigin, end, mins, maxs, 0, MASK_PLAYERSOLID ); // no shadow if too high - if ( trace.fraction == 1.0 || trace.startsolid || trace.allsolid ) { + if( trace.fraction == 1.0 || trace.startsolid || trace.allsolid ) return qfalse; - } - *shadowPlane = trace.endpos[2] + 1; + *shadowPlane = trace.endpos[ 2 ] + 1; - if ( cg_shadows.integer != 1 ) { // no mark for stencil or projection shadows + if( cg_shadows.integer != 1 ) // no mark for stencil or projection shadows return qtrue; - } // fade the shadow out with height alpha = 1.0 - trace.fraction; @@ -1542,7 +1516,7 @@ static qboolean CG_PlayerShadow( centity_t *cent, float *shadowPlane ) { // add the mark as a temporary, so it goes directly to the renderer // without taking a spot in the cg_marks array CG_ImpactMark( cgs.media.shadowMarkShader, trace.endpos, trace.plane.normal, - cent->pe.legs.yawAngle, alpha,alpha,alpha,1, qfalse, 24, qtrue ); + cent->pe.legs.yawAngle, alpha,alpha,alpha,1, qfalse, 24, qtrue ); return qtrue; } @@ -1555,82 +1529,81 @@ CG_PlayerSplash Draw a mark at the water surface =============== */ -static void CG_PlayerSplash( centity_t *cent ) { - vec3_t start, end; - trace_t trace; - int contents; - polyVert_t verts[4]; +static void CG_PlayerSplash( centity_t *cent ) +{ + vec3_t start, end; + trace_t trace; + int contents; + polyVert_t verts[ 4 ]; - if ( !cg_shadows.integer ) { + if( !cg_shadows.integer ) return; - } VectorCopy( cent->lerpOrigin, end ); - end[2] -= 24; + end[ 2 ] -= 24; // if the feet aren't in liquid, don't make a mark // this won't handle moving water brushes, but they wouldn't draw right anyway... contents = trap_CM_PointContents( end, 0 ); - if ( !( contents & ( CONTENTS_WATER | CONTENTS_SLIME | CONTENTS_LAVA ) ) ) { + + if( !( contents & ( CONTENTS_WATER | CONTENTS_SLIME | CONTENTS_LAVA ) ) ) return; - } VectorCopy( cent->lerpOrigin, start ); - start[2] += 32; + start[ 2 ] += 32; // if the head isn't out of liquid, don't make a mark contents = trap_CM_PointContents( start, 0 ); - if ( contents & ( CONTENTS_SOLID | CONTENTS_WATER | CONTENTS_SLIME | CONTENTS_LAVA ) ) { + + if( contents & ( CONTENTS_SOLID | CONTENTS_WATER | CONTENTS_SLIME | CONTENTS_LAVA ) ) return; - } // trace down to find the surface trap_CM_BoxTrace( &trace, start, end, NULL, NULL, 0, ( CONTENTS_WATER | CONTENTS_SLIME | CONTENTS_LAVA ) ); - if ( trace.fraction == 1.0 ) { + if( trace.fraction == 1.0 ) return; - } // create a mark polygon - VectorCopy( trace.endpos, verts[0].xyz ); - verts[0].xyz[0] -= 32; - verts[0].xyz[1] -= 32; - verts[0].st[0] = 0; - verts[0].st[1] = 0; - verts[0].modulate[0] = 255; - verts[0].modulate[1] = 255; - verts[0].modulate[2] = 255; - verts[0].modulate[3] = 255; - - VectorCopy( trace.endpos, verts[1].xyz ); - verts[1].xyz[0] -= 32; - verts[1].xyz[1] += 32; - verts[1].st[0] = 0; - verts[1].st[1] = 1; - verts[1].modulate[0] = 255; - verts[1].modulate[1] = 255; - verts[1].modulate[2] = 255; - verts[1].modulate[3] = 255; - - VectorCopy( trace.endpos, verts[2].xyz ); - verts[2].xyz[0] += 32; - verts[2].xyz[1] += 32; - verts[2].st[0] = 1; - verts[2].st[1] = 1; - verts[2].modulate[0] = 255; - verts[2].modulate[1] = 255; - verts[2].modulate[2] = 255; - verts[2].modulate[3] = 255; - - VectorCopy( trace.endpos, verts[3].xyz ); - verts[3].xyz[0] += 32; - verts[3].xyz[1] -= 32; - verts[3].st[0] = 1; - verts[3].st[1] = 0; - verts[3].modulate[0] = 255; - verts[3].modulate[1] = 255; - verts[3].modulate[2] = 255; - verts[3].modulate[3] = 255; + VectorCopy( trace.endpos, verts[ 0 ].xyz ); + verts[ 0 ].xyz[ 0 ] -= 32; + verts[ 0 ].xyz[ 1 ] -= 32; + verts[ 0 ].st[ 0 ] = 0; + verts[ 0 ].st[ 1 ] = 0; + verts[ 0 ].modulate[ 0 ] = 255; + verts[ 0 ].modulate[ 1 ] = 255; + verts[ 0 ].modulate[ 2 ] = 255; + verts[ 0 ].modulate[ 3 ] = 255; + + VectorCopy( trace.endpos, verts[ 1 ].xyz ); + verts[ 1 ].xyz[ 0 ] -= 32; + verts[ 1 ].xyz[ 1 ] += 32; + verts[ 1 ].st[ 0 ] = 0; + verts[ 1 ].st[ 1 ] = 1; + verts[ 1 ].modulate[ 0 ] = 255; + verts[ 1 ].modulate[ 1 ] = 255; + verts[ 1 ].modulate[ 2 ] = 255; + verts[ 1 ].modulate[ 3 ] = 255; + + VectorCopy( trace.endpos, verts[ 2 ].xyz ); + verts[ 2 ].xyz[ 0 ] += 32; + verts[ 2 ].xyz[ 1 ] += 32; + verts[ 2 ].st[ 0 ] = 1; + verts[ 2 ].st[ 1 ] = 1; + verts[ 2 ].modulate[ 0 ] = 255; + verts[ 2 ].modulate[ 1 ] = 255; + verts[ 2 ].modulate[ 2 ] = 255; + verts[ 2 ].modulate[ 3 ] = 255; + + VectorCopy( trace.endpos, verts[ 3 ].xyz ); + verts[ 3 ].xyz[ 0 ] += 32; + verts[ 3 ].xyz[ 1 ] -= 32; + verts[ 3 ].st[ 0 ] = 1; + verts[ 3 ].st[ 1 ] = 0; + verts[ 3 ].modulate[ 0 ] = 255; + verts[ 3 ].modulate[ 1 ] = 255; + verts[ 3 ].modulate[ 2 ] = 255; + verts[ 3 ].modulate[ 3 ] = 255; trap_R_AddPolyToScene( cgs.media.wakeMarkShader, 4, verts ); } @@ -1645,33 +1618,9 @@ Adds a piece with modifications or duplications for powerups Also called by CG_Missile for quad rockets, but nobody can tell... =============== */ -void CG_AddRefEntityWithPowerups( refEntity_t *ent, int powerups, int team ) { - - /*if ( powerups & ( 1 << PW_INVIS ) ) { - ent->customShader = cgs.media.invisShader; - trap_R_AddRefEntityToScene( ent ); - } else {*/ - trap_R_AddRefEntityToScene( ent ); - - /*if ( powerups & ( 1 << PW_QUAD ) ) - { - if (team == TEAM_HUMANS) - ent->customShader = cgs.media.redQuadShader; - else - ent->customShader = cgs.media.quadShader; - trap_R_AddRefEntityToScene( ent ); - } - if ( powerups & ( 1 << PW_REGEN ) ) { - if ( ( ( cg.time / 100 ) % 10 ) == 1 ) { - ent->customShader = cgs.media.regenShader; - trap_R_AddRefEntityToScene( ent ); - } - } - if ( powerups & ( 1 << PW_BATTLESUIT ) ) { - ent->customShader = cgs.media.battleSuitShader; - trap_R_AddRefEntityToScene( ent ); - } - }*/ +void CG_AddRefEntityWithPowerups( refEntity_t *ent, int powerups, int team ) +{ + trap_R_AddRefEntityToScene( ent ); } @@ -1688,36 +1637,43 @@ int CG_LightVerts( vec3_t normal, int numVerts, polyVert_t *verts ) vec3_t lightDir; vec3_t directedLight; - trap_R_LightForPoint( verts[0].xyz, ambientLight, directedLight, lightDir ); + trap_R_LightForPoint( verts[ 0 ].xyz, ambientLight, directedLight, lightDir ); - for (i = 0; i < numVerts; i++) { - incoming = DotProduct (normal, lightDir); - if ( incoming <= 0 ) { - verts[i].modulate[0] = ambientLight[0]; - verts[i].modulate[1] = ambientLight[1]; - verts[i].modulate[2] = ambientLight[2]; - verts[i].modulate[3] = 255; + for( i = 0; i < numVerts; i++ ) + { + incoming = DotProduct( normal, lightDir ); + + if( incoming <= 0 ) + { + verts[ i ].modulate[ 0 ] = ambientLight[ 0 ]; + verts[ i ].modulate[ 1 ] = ambientLight[ 1 ]; + verts[ i ].modulate[ 2 ] = ambientLight[ 2 ]; + verts[ i ].modulate[ 3 ] = 255; continue; } - j = ( ambientLight[0] + incoming * directedLight[0] ); - if ( j > 255 ) { + + j = ( ambientLight[ 0 ] + incoming * directedLight[ 0 ] ); + + if( j > 255 ) j = 255; - } - verts[i].modulate[0] = j; + + verts[ i ].modulate[ 0 ] = j; - j = ( ambientLight[1] + incoming * directedLight[1] ); - if ( j > 255 ) { + j = ( ambientLight[ 1 ] + incoming * directedLight[ 1 ] ); + + if( j > 255 ) j = 255; - } - verts[i].modulate[1] = j; - j = ( ambientLight[2] + incoming * directedLight[2] ); - if ( j > 255 ) { + verts[ i ].modulate[ 1 ] = j; + + j = ( ambientLight[ 2 ] + incoming * directedLight[ 2 ] ); + + if( j > 255 ) j = 255; - } - verts[i].modulate[2] = j; - verts[i].modulate[3] = 255; + verts[ i ].modulate[ 2 ] = j; + + verts[ i ].modulate[ 3 ] = 255; } return qtrue; } @@ -1739,33 +1695,38 @@ int CG_LightFromDirection( vec3_t point, vec3_t direction ) trap_R_LightForPoint( point, ambientLight, directedLight, lightDir ); - incoming = DotProduct (direction, lightDir); - if ( incoming <= 0 ) { - result[0] = ambientLight[0]; - result[1] = ambientLight[1]; - result[2] = ambientLight[2]; - return (int)((float)( result[0] + result[1] + result[2] ) / 3.0f ); + incoming = DotProduct( direction, lightDir ); + + if( incoming <= 0 ) + { + result[ 0 ] = ambientLight[ 0 ]; + result[ 1 ] = ambientLight[ 1 ]; + result[ 2 ] = ambientLight[ 2 ]; + return (int)( (float)( result[ 0 ] + result[ 1 ] + result[ 2 ] ) / 3.0f ); } - j = ( ambientLight[0] + incoming * directedLight[0] ); - if ( j > 255 ) { + j = ( ambientLight[ 0 ] + incoming * directedLight[ 0 ] ); + + if( j > 255 ) j = 255; - } - result[0] = j; - j = ( ambientLight[1] + incoming * directedLight[1] ); - if ( j > 255 ) { + result[ 0 ] = j; + + j = ( ambientLight[ 1 ] + incoming * directedLight[ 1 ] ); + + if( j > 255 ) j = 255; - } - result[1] = j; - j = ( ambientLight[2] + incoming * directedLight[2] ); - if ( j > 255 ) { + result[ 1 ] = j; + + j = ( ambientLight[ 2 ] + incoming * directedLight[ 2 ] ); + + if( j > 255 ) j = 255; - } - result[2] = j; - return (int)((float)( result[0] + result[1] + result[2] ) / 3.0f ); + result[ 2 ] = j; + + return (int)((float)( result[ 0 ] + result[ 1 ] + result[ 2 ] ) / 3.0f ); } @@ -1783,10 +1744,10 @@ int CG_AmbientLight( vec3_t point ) trap_R_LightForPoint( point, ambientLight, directedLight, lightDir ); - result[0] = ambientLight[0]; - result[1] = ambientLight[1]; - result[2] = ambientLight[2]; - return (int)((float)( result[0] + result[1] + result[2] ) / 3.0f ); + result[ 0 ] = ambientLight[ 0 ]; + result[ 1 ] = ambientLight[ 1 ]; + result[ 2 ] = ambientLight[ 2 ]; + return (int)((float)( result[ 0 ] + result[ 1 ] + result[ 2 ] ) / 3.0f ); } #define TRACE_DEPTH 128.0f @@ -1864,7 +1825,7 @@ void CG_Player( centity_t *cent ) // get the animation state (after rotation, to allow feet shuffle) CG_PlayerAnimation( cent, &legs.oldframe, &legs.frame, &legs.backlerp, - &torso.oldframe, &torso.frame, &torso.backlerp ); + &torso.oldframe, &torso.frame, &torso.backlerp ); // add the talk baloon or disconnect icon CG_PlayerSprites( cent ); @@ -1990,14 +1951,15 @@ void CG_Corpse( centity_t *cent ) refEntity_t legs; refEntity_t torso; refEntity_t head; - int corpseNum; - int renderfx; - qboolean shadow; - float shadowPlane; - vec3_t origin, liveZ, deadZ; + int corpseNum; + int renderfx; + qboolean shadow; + float shadowPlane; + vec3_t origin, liveZ, deadZ; corpseNum = CG_GetCorpseNum( cent->currentState.clientNum ); - if ( corpseNum < 0 || corpseNum >= MAX_CLIENTS ) + + if( corpseNum < 0 || corpseNum >= MAX_CLIENTS ) CG_Error( "Bad corpseNum on corpse entity: %d", corpseNum ); ci = &cgs.corpseinfo[ corpseNum ]; @@ -2007,9 +1969,9 @@ void CG_Corpse( centity_t *cent ) if( !ci->infoValid ) return; - memset( &legs, 0, sizeof(legs) ); - memset( &torso, 0, sizeof(torso) ); - memset( &head, 0, sizeof(head) ); + memset( &legs, 0, sizeof( legs ) ); + memset( &torso, 0, sizeof( torso ) ); + memset( &head, 0, sizeof( head ) ); VectorCopy( cent->lerpOrigin, origin ); BG_FindBBoxForClass( cent->currentState.clientNum, liveZ, NULL, NULL, deadZ, NULL ); @@ -2020,7 +1982,7 @@ void CG_Corpse( centity_t *cent ) CG_PlayerAngles( cent, cent->lerpAngles, legs.axis, torso.axis, head.axis ); //set the correct frame (should always be dead) - if ( cg_noPlayerAnims.integer ) + if( cg_noPlayerAnims.integer ) legs.oldframe = legs.frame = torso.oldframe = torso.frame = 0; else { @@ -2041,6 +2003,7 @@ void CG_Corpse( centity_t *cent ) // get the player model information renderfx = 0; + if( cg_shadows.integer == 3 && shadow ) renderfx |= RF_SHADOW_PLANE; @@ -2057,7 +2020,7 @@ void CG_Corpse( centity_t *cent ) VectorCopy( origin, legs.lightingOrigin ); legs.shadowPlane = shadowPlane; legs.renderfx = renderfx; - VectorCopy (legs.origin, legs.oldorigin); // don't positionally lerp at all + VectorCopy( legs.origin, legs.oldorigin ); // don't positionally lerp at all //CG_AddRefEntityWithPowerups( &legs, cent->currentState.powerups, ci->team ); trap_R_AddRefEntityToScene( &legs ); @@ -2077,7 +2040,7 @@ void CG_Corpse( centity_t *cent ) VectorCopy( origin, torso.lightingOrigin ); - CG_PositionRotatedEntityOnTag( &torso, &legs, ci->legsModel, "tag_torso"); + CG_PositionRotatedEntityOnTag( &torso, &legs, ci->legsModel, "tag_torso" ); torso.shadowPlane = shadowPlane; torso.renderfx = renderfx; @@ -2110,7 +2073,7 @@ void CG_Corpse( centity_t *cent ) cent->currentState.powerups == 65535 ) //65535 = 16bit signed -1 { //draw indicator - CG_PlayerFloatSprite( cent, cgs.media.medalImpressive ); + CG_PlayerFloatSprite( cent, cgs.media.friendShader ); } } } @@ -2125,12 +2088,15 @@ CG_ResetPlayerEntity A player just came into view or teleported, so reset all animation info =============== */ -void CG_ResetPlayerEntity( centity_t *cent ) { +void CG_ResetPlayerEntity( centity_t *cent ) +{ cent->errorTime = -99999; // guarantee no error decay added cent->extrapolated = qfalse; - CG_ClearLerpFrame( &cgs.clientinfo[ cent->currentState.clientNum ], ¢->pe.legs, cent->currentState.legsAnim ); - CG_ClearLerpFrame( &cgs.clientinfo[ cent->currentState.clientNum ], ¢->pe.torso, cent->currentState.torsoAnim ); + CG_ClearLerpFrame( &cgs.clientinfo[ cent->currentState.clientNum ], + ¢->pe.legs, cent->currentState.legsAnim ); + CG_ClearLerpFrame( &cgs.clientinfo[ cent->currentState.clientNum ], + ¢->pe.torso, cent->currentState.torsoAnim ); BG_EvaluateTrajectory( ¢->currentState.pos, cg.time, cent->lerpOrigin ); BG_EvaluateTrajectory( ¢->currentState.apos, cg.time, cent->lerpAngles ); @@ -2139,19 +2105,18 @@ void CG_ResetPlayerEntity( centity_t *cent ) { VectorCopy( cent->lerpAngles, cent->rawAngles ); memset( ¢->pe.legs, 0, sizeof( cent->pe.legs ) ); - cent->pe.legs.yawAngle = cent->rawAngles[YAW]; + cent->pe.legs.yawAngle = cent->rawAngles[ YAW ]; cent->pe.legs.yawing = qfalse; cent->pe.legs.pitchAngle = 0; cent->pe.legs.pitching = qfalse; memset( ¢->pe.torso, 0, sizeof( cent->pe.legs ) ); - cent->pe.torso.yawAngle = cent->rawAngles[YAW]; + cent->pe.torso.yawAngle = cent->rawAngles[ YAW ]; cent->pe.torso.yawing = qfalse; - cent->pe.torso.pitchAngle = cent->rawAngles[PITCH]; + cent->pe.torso.pitchAngle = cent->rawAngles[ PITCH ]; cent->pe.torso.pitching = qfalse; - if ( cg_debugPosition.integer ) { - CG_Printf("%i ResetPlayerEntity yaw=%i\n", cent->currentState.number, cent->pe.torso.yawAngle ); - } + if( cg_debugPosition.integer ) + CG_Printf( "%i ResetPlayerEntity yaw=%i\n", cent->currentState.number, cent->pe.torso.yawAngle ); } diff --git a/src/cgame/cg_playerstate.c b/src/cgame/cg_playerstate.c index 4a307481..1e39ad70 100644 --- a/src/cgame/cg_playerstate.c +++ b/src/cgame/cg_playerstate.c @@ -22,156 +22,103 @@ /* ============== -CG_CheckAmmo - -If the ammo has gone low enough to generate the warning, play a sound +CG_DamageFeedback ============== */ -void CG_CheckAmmo( void ) { - int i; - int total; - int previous; - int ammo, clips, maxclips; - - // see about how many seconds of ammo we have remaining - total = 0; - for ( i = WP_MACHINEGUN ; i < WP_NUM_WEAPONS ; i++ ) { - if ( !BG_gotWeapon( i, cg.snap->ps.stats ) ) { - continue; - } - - BG_unpackAmmoArray( i, cg.snap->ps.ammo, cg.snap->ps.powerups, &ammo, &clips, &maxclips ); +void CG_DamageFeedback( int yawByte, int pitchByte, int damage ) +{ + float left, front, up; + float kick; + int health; + float scale; + vec3_t dir; + vec3_t angles; + float dist; + float yaw, pitch; + + // show the attacking player's head and name in corner + cg.attackerTime = cg.time; + + // the lower on health you are, the greater the view kick will be + health = cg.snap->ps.stats[STAT_HEALTH]; + + if( health < 40 ) + scale = 1; + else + scale = 40.0 / health; + + kick = damage * scale; + + if( kick < 5 ) + kick = 5; + + if( kick > 10 ) + kick = 10; + + // if yaw and pitch are both 255, make the damage always centered (falling, etc) + if( yawByte == 255 && pitchByte == 255 ) + { + cg.damageX = 0; + cg.damageY = 0; + cg.v_dmg_roll = 0; + cg.v_dmg_pitch = -kick; + } + else + { + // positional + pitch = pitchByte / 255.0 * 360; + yaw = yawByte / 255.0 * 360; + + angles[ PITCH ] = pitch; + angles[ YAW ] = yaw; + angles[ ROLL ] = 0; + + AngleVectors( angles, dir, NULL, NULL ); + VectorSubtract( vec3_origin, dir, dir ); + + front = DotProduct( dir, cg.refdef.viewaxis[ 0 ] ); + left = DotProduct( dir, cg.refdef.viewaxis[ 1 ] ); + up = DotProduct( dir, cg.refdef.viewaxis[ 2 ] ); + + dir[ 0 ] = front; + dir[ 1 ] = left; + dir[ 2 ] = 0; + dist = VectorLength( dir ); - switch ( i ) { - /*case WP_ROCKET_LAUNCHER:*/ - case WP_LOCKBLOB_LAUNCHER: - /*case WP_GRENADE_LAUNCHER:*/ - /*case WP_RAILGUN:*/ - /*case WP_SHOTGUN:*/ - total += ammo * 1000; - break; - default: - if( clips ) - total += 5000; - total += ammo * 200; - break; - } - if ( total >= 5000 || BG_FindInfinteAmmoForWeapon( i ) ) - { - cg.lowAmmoWarning = 0; - return; - } - } - - previous = cg.lowAmmoWarning; - - if ( total == 0 ) { - cg.lowAmmoWarning = 2; - } else { - cg.lowAmmoWarning = 1; - } - - // play a sound on transitions - if ( cg.lowAmmoWarning != previous ) { - trap_S_StartLocalSound( cgs.media.noAmmoSound, CHAN_LOCAL_SOUND ); - } -} + if( dist < 0.1f ) + dist = 0.1f; -/* -============== -CG_DamageFeedback -============== -*/ -void CG_DamageFeedback( int yawByte, int pitchByte, int damage ) { - float left, front, up; - float kick; - int health; - float scale; - vec3_t dir; - vec3_t angles; - float dist; - float yaw, pitch; - - // show the attacking player's head and name in corner - cg.attackerTime = cg.time; - - // the lower on health you are, the greater the view kick will be - health = cg.snap->ps.stats[STAT_HEALTH]; - if ( health < 40 ) { - scale = 1; - } else { - scale = 40.0 / health; - } - kick = damage * scale; - - if (kick < 5) - kick = 5; - if (kick > 10) - kick = 10; - - // if yaw and pitch are both 255, make the damage always centered (falling, etc) - if ( yawByte == 255 && pitchByte == 255 ) { - cg.damageX = 0; - cg.damageY = 0; - cg.v_dmg_roll = 0; - cg.v_dmg_pitch = -kick; - } else { - // positional - pitch = pitchByte / 255.0 * 360; - yaw = yawByte / 255.0 * 360; - - angles[PITCH] = pitch; - angles[YAW] = yaw; - angles[ROLL] = 0; - - AngleVectors( angles, dir, NULL, NULL ); - VectorSubtract( vec3_origin, dir, dir ); - - front = DotProduct (dir, cg.refdef.viewaxis[0] ); - left = DotProduct (dir, cg.refdef.viewaxis[1] ); - up = DotProduct (dir, cg.refdef.viewaxis[2] ); - - dir[0] = front; - dir[1] = left; - dir[2] = 0; - dist = VectorLength( dir ); - if ( dist < 0.1 ) { - dist = 0.1f; - } - - cg.v_dmg_roll = kick * left; - - cg.v_dmg_pitch = -kick * front; - - if ( front <= 0.1 ) { - front = 0.1f; - } - cg.damageX = -left / front; - cg.damageY = up / dist; - } - - // clamp the position - if ( cg.damageX > 1.0 ) { - cg.damageX = 1.0; - } - if ( cg.damageX < - 1.0 ) { - cg.damageX = -1.0; - } - - if ( cg.damageY > 1.0 ) { - cg.damageY = 1.0; - } - if ( cg.damageY < - 1.0 ) { - cg.damageY = -1.0; - } - - // don't let the screen flashes vary as much - if ( kick > 10 ) { - kick = 10; - } - cg.damageValue = kick; - cg.v_dmg_time = cg.time + DAMAGE_TIME; - cg.damageTime = cg.snap->serverTime; + cg.v_dmg_roll = kick * left; + + cg.v_dmg_pitch = -kick * front; + + if( front <= 0.1 ) + front = 0.1f; + + cg.damageX = -left / front; + cg.damageY = up / dist; + } + + // clamp the position + if( cg.damageX > 1.0 ) + cg.damageX = 1.0; + + if( cg.damageX < - 1.0 ) + cg.damageX = -1.0; + + if( cg.damageY > 1.0 ) + cg.damageY = 1.0; + + if( cg.damageY < - 1.0 ) + cg.damageY = -1.0; + + // don't let the screen flashes vary as much + if( kick > 10 ) + kick = 10; + + cg.damageValue = kick; + cg.v_dmg_time = cg.time + DAMAGE_TIME; + cg.damageTime = cg.snap->serverTime; } @@ -184,57 +131,60 @@ CG_Respawn A respawn happened this snapshot ================ */ -void CG_Respawn( void ) { - // no error decay on player movement - cg.thisFrameTeleport = qtrue; +void CG_Respawn( void ) +{ + // no error decay on player movement + cg.thisFrameTeleport = qtrue; - // display weapons available - cg.weaponSelectTime = cg.time; + // display weapons available + cg.weaponSelectTime = cg.time; - // select the weapon the server says we are using - cg.weaponSelect = cg.snap->ps.weapon; + // select the weapon the server says we are using + cg.weaponSelect = cg.snap->ps.weapon; } -extern char *eventnames[]; - /* ============== CG_CheckPlayerstateEvents ============== */ -void CG_CheckPlayerstateEvents( playerState_t *ps, playerState_t *ops ) { - int i; - int event; - centity_t *cent; +void CG_CheckPlayerstateEvents( playerState_t *ps, playerState_t *ops ) +{ + int i; + int event; + centity_t *cent; - if ( ps->externalEvent && ps->externalEvent != ops->externalEvent ) { - cent = &cg_entities[ ps->clientNum ]; - cent->currentState.event = ps->externalEvent; - cent->currentState.eventParm = ps->externalEventParm; - CG_EntityEvent( cent, cent->lerpOrigin ); - } + if( ps->externalEvent && ps->externalEvent != ops->externalEvent ) + { + cent = &cg_entities[ ps->clientNum ]; + cent->currentState.event = ps->externalEvent; + cent->currentState.eventParm = ps->externalEventParm; + CG_EntityEvent( cent, cent->lerpOrigin ); + } - cent = &cg.predictedPlayerEntity; // cg_entities[ ps->clientNum ]; + cent = &cg.predictedPlayerEntity; // cg_entities[ ps->clientNum ]; // go through the predictable events buffer - for ( i = ps->eventSequence - MAX_PS_EVENTS ; i < ps->eventSequence ; i++ ) { + for( i = ps->eventSequence - MAX_PS_EVENTS; i < ps->eventSequence; i++ ) + { // if we have a new predictable event - if ( i >= ops->eventSequence + if( i >= ops->eventSequence || // or the server told us to play another event instead of a predicted event we already issued // or something the server told us changed our prediction causing a different event - || (i > ops->eventSequence - MAX_PS_EVENTS && ps->events[i & (MAX_PS_EVENTS-1)] != ops->events[i & (MAX_PS_EVENTS-1)]) ) { - - event = ps->events[ i & (MAX_PS_EVENTS-1) ]; + ( i > ops->eventSequence - MAX_PS_EVENTS && ps->events[ i & ( MAX_PS_EVENTS - 1 ) ] != + ops->events[ i & ( MAX_PS_EVENTS - 1 ) ] ) ) + { + event = ps->events[ i & ( MAX_PS_EVENTS - 1 ) ]; - cent->currentState.event = event; - cent->currentState.eventParm = ps->eventParms[ i & (MAX_PS_EVENTS-1) ]; - CG_EntityEvent( cent, cent->lerpOrigin ); - cg.predictableEvents[ i & (MAX_PREDICTED_EVENTS-1) ] = event; + cent->currentState.event = event; + cent->currentState.eventParm = ps->eventParms[ i & ( MAX_PS_EVENTS - 1 ) ]; + CG_EntityEvent( cent, cent->lerpOrigin ); + cg.predictableEvents[ i & ( MAX_PREDICTED_EVENTS - 1 ) ] = event; cg.eventSequence++; - } - } + } + } } @@ -243,32 +193,35 @@ void CG_CheckPlayerstateEvents( playerState_t *ps, playerState_t *ops ) { CG_CheckChangedPredictableEvents ================== */ -void CG_CheckChangedPredictableEvents( playerState_t *ps ) { - int i; - int event; +void CG_CheckChangedPredictableEvents( playerState_t *ps ) +{ + int i; + int event; centity_t *cent; cent = &cg.predictedPlayerEntity; - for ( i = ps->eventSequence - MAX_PS_EVENTS ; i < ps->eventSequence ; i++ ) { + + for( i = ps->eventSequence - MAX_PS_EVENTS; i < ps->eventSequence; i++ ) + { // - if (i >= cg.eventSequence) { + if( i >= cg.eventSequence ) continue; - } + // if this event is not further back in than the maximum predictable events we remember - if (i > cg.eventSequence - MAX_PREDICTED_EVENTS) { + if( i > cg.eventSequence - MAX_PREDICTED_EVENTS ) + { // if the new playerstate event is different from a previously predicted one - if ( ps->events[i & (MAX_PS_EVENTS-1)] != cg.predictableEvents[i & (MAX_PREDICTED_EVENTS-1) ] ) { - - event = ps->events[ i & (MAX_PS_EVENTS-1) ]; + if( ps->events[ i & ( MAX_PS_EVENTS - 1 ) ] != cg.predictableEvents[ i & ( MAX_PREDICTED_EVENTS - 1 ) ] ) + { + event = ps->events[ i & ( MAX_PS_EVENTS - 1 ) ]; cent->currentState.event = event; - cent->currentState.eventParm = ps->eventParms[ i & (MAX_PS_EVENTS-1) ]; + cent->currentState.eventParm = ps->eventParms[ i & ( MAX_PS_EVENTS - 1 ) ]; CG_EntityEvent( cent, cent->lerpOrigin ); - cg.predictableEvents[ i & (MAX_PREDICTED_EVENTS-1) ] = event; + cg.predictableEvents[ i & ( MAX_PREDICTED_EVENTS - 1 ) ] = event; - if ( cg_showmiss.integer ) { - CG_Printf("WARNING: changed predicted event\n"); - } + if( cg_showmiss.integer ) + CG_Printf( "WARNING: changed predicted event\n" ); } } } @@ -276,72 +229,62 @@ void CG_CheckChangedPredictableEvents( playerState_t *ps ) { /* ================== -pushReward -================== -*/ -static void pushReward(sfxHandle_t sfx, qhandle_t shader, int rewardCount) { - if (cg.rewardStack < (MAX_REWARDSTACK-1)) { - cg.rewardStack++; - cg.rewardSound[cg.rewardStack] = sfx; - cg.rewardShader[cg.rewardStack] = shader; - cg.rewardCount[cg.rewardStack] = rewardCount; - } -} - - -/* -================== CG_CheckLocalSounds ================== */ -void CG_CheckLocalSounds( playerState_t *ps, playerState_t *ops ) { - int highScore, health, armor, reward; +void CG_CheckLocalSounds( playerState_t *ps, playerState_t *ops ) +{ + int highScore, health, armor, reward; sfxHandle_t sfx; // don't play the sounds if the player just changed teams - if ( ps->persistant[PERS_TEAM] != ops->persistant[PERS_TEAM] ) { + if( ps->persistant[ PERS_TEAM ] != ops->persistant[ PERS_TEAM ] ) return; - } // hit changes - if ( ps->persistant[PERS_HITS] > ops->persistant[PERS_HITS] ) { + if( ps->persistant[ PERS_HITS ] > ops->persistant[ PERS_HITS ] ) + { /*armor = ps->persistant[PERS_ATTACKEE_ARMOR] & 0xff; health = ps->persistant[PERS_ATTACKEE_ARMOR] >> 8;*/ trap_S_StartLocalSound( cgs.media.hitSound, CHAN_LOCAL_SOUND ); - } else if ( ps->persistant[PERS_HITS] < ops->persistant[PERS_HITS] ) { - trap_S_StartLocalSound( cgs.media.hitTeamSound, CHAN_LOCAL_SOUND ); } + else if( ps->persistant[ PERS_HITS ] < ops->persistant[ PERS_HITS ] ) + trap_S_StartLocalSound( cgs.media.hitTeamSound, CHAN_LOCAL_SOUND ); // health changes of more than -1 should make pain sounds - if ( ps->stats[STAT_HEALTH] < ops->stats[STAT_HEALTH] - 1 ) { - if ( ps->stats[STAT_HEALTH] > 0 ) { - CG_PainEvent( &cg.predictedPlayerEntity, ps->stats[STAT_HEALTH] ); - } + if( ps->stats[ STAT_HEALTH ] < ops->stats[ STAT_HEALTH ] - 1 ) + { + if( ps->stats[ STAT_HEALTH ] > 0 ) + CG_PainEvent( &cg.predictedPlayerEntity, ps->stats[ STAT_HEALTH ] ); } // if we are going into the intermission, don't start any voices - if ( cg.intermissionStarted ) { + if( cg.intermissionStarted ) return; - } // reward sounds reward = qfalse; // timelimit warnings - if ( cgs.timelimit > 0 ) { + if( cgs.timelimit > 0 ) + { int msec; msec = cg.time - cgs.levelStartTime; - if ( !( cg.timelimitWarnings & 4 ) && msec > ( cgs.timelimit * 60 + 2 ) * 1000 ) { + + if( !( cg.timelimitWarnings & 4 ) && msec > ( cgs.timelimit * 60 + 2 ) * 1000 ) + { cg.timelimitWarnings |= 1 | 2 | 4; trap_S_StartLocalSound( cgs.media.suddenDeathSound, CHAN_ANNOUNCER ); } - else if ( !( cg.timelimitWarnings & 2 ) && msec > (cgs.timelimit - 1) * 60 * 1000 ) { + else if( !( cg.timelimitWarnings & 2 ) && msec > ( cgs.timelimit - 1 ) * 60 * 1000 ) + { cg.timelimitWarnings |= 1 | 2; trap_S_StartLocalSound( cgs.media.oneMinuteSound, CHAN_ANNOUNCER ); } - else if ( cgs.timelimit > 5 && !( cg.timelimitWarnings & 1 ) && msec > (cgs.timelimit - 5) * 60 * 1000 ) { + else if( cgs.timelimit > 5 && !( cg.timelimitWarnings & 1 ) && msec > ( cgs.timelimit - 5 ) * 60 * 1000 ) + { cg.timelimitWarnings |= 1; trap_S_StartLocalSound( cgs.media.fiveMinuteSound, CHAN_ANNOUNCER ); } @@ -355,44 +298,42 @@ CG_TransitionPlayerState =============== */ -void CG_TransitionPlayerState( playerState_t *ps, playerState_t *ops ) { - // check for changing follow mode - if ( ps->clientNum != ops->clientNum ) { - cg.thisFrameTeleport = qtrue; - // make sure we don't get any unwanted transition effects - *ops = *ps; - } - - // damage events (player is getting wounded) - if ( ps->damageEvent != ops->damageEvent && ps->damageCount ) { - CG_DamageFeedback( ps->damageYaw, ps->damagePitch, ps->damageCount ); - } - - // respawning - if ( ps->persistant[PERS_SPAWN_COUNT] != ops->persistant[PERS_SPAWN_COUNT] ) { - CG_Respawn(); - } - - if ( cg.mapRestart ) { - CG_Respawn(); - cg.mapRestart = qfalse; +void CG_TransitionPlayerState( playerState_t *ps, playerState_t *ops ) +{ + // check for changing follow mode + if( ps->clientNum != ops->clientNum ) + { + cg.thisFrameTeleport = qtrue; + // make sure we don't get any unwanted transition effects + *ops = *ps; } - if ( cg.snap->ps.pm_type != PM_INTERMISSION - && ps->persistant[PERS_TEAM] != TEAM_SPECTATOR ) { - CG_CheckLocalSounds( ps, ops ); - } + // damage events (player is getting wounded) + if( ps->damageEvent != ops->damageEvent && ps->damageCount ) + CG_DamageFeedback( ps->damageYaw, ps->damagePitch, ps->damageCount ); + + // respawning + if( ps->persistant[ PERS_SPAWN_COUNT ] != ops->persistant[ PERS_SPAWN_COUNT ] ) + CG_Respawn( ); + + if( cg.mapRestart ) + { + CG_Respawn( ); + cg.mapRestart = qfalse; + } - // check for going low on ammo - //CG_CheckAmmo(); //TA: don't display ammo warnings + if( cg.snap->ps.pm_type != PM_INTERMISSION && + ps->persistant[ PERS_TEAM ] != TEAM_SPECTATOR ) + CG_CheckLocalSounds( ps, ops ); - // run events - CG_CheckPlayerstateEvents( ps, ops ); + // run events + CG_CheckPlayerstateEvents( ps, ops ); - // smooth the ducking viewheight change - if ( ps->viewheight != ops->viewheight ) { - cg.duckChange = ps->viewheight - ops->viewheight; - cg.duckTime = cg.time; - } + // smooth the ducking viewheight change + if( ps->viewheight != ops->viewheight ) + { + cg.duckChange = ps->viewheight - ops->viewheight; + cg.duckTime = cg.time; + } } diff --git a/src/cgame/cg_predict.c b/src/cgame/cg_predict.c index d28c9ba6..fabe1065 100644 --- a/src/cgame/cg_predict.c +++ b/src/cgame/cg_predict.c @@ -36,33 +36,36 @@ of the entities that are actually solid, to make for more efficient collision detection ==================== */ -void CG_BuildSolidList( void ) { - int i; - centity_t *cent; - snapshot_t *snap; +void CG_BuildSolidList( void ) +{ + int i; + centity_t *cent; + snapshot_t *snap; entityState_t *ent; cg_numSolidEntities = 0; cg_numTriggerEntities = 0; - if ( cg.nextSnap && !cg.nextFrameTeleport && !cg.thisFrameTeleport ) { + if( cg.nextSnap && !cg.nextFrameTeleport && !cg.thisFrameTeleport ) snap = cg.nextSnap; - } else { + else snap = cg.snap; - } - for ( i = 0 ; i < snap->numEntities ; i++ ) { + for( i = 0; i < snap->numEntities; i++ ) + { cent = &cg_entities[ snap->entities[ i ].number ]; ent = ¢->currentState; - if ( ent->eType == ET_ITEM || ent->eType == ET_PUSH_TRIGGER || ent->eType == ET_TELEPORT_TRIGGER ) { - cg_triggerEntities[cg_numTriggerEntities] = cent; + if( ent->eType == ET_ITEM || ent->eType == ET_PUSH_TRIGGER || ent->eType == ET_TELEPORT_TRIGGER ) + { + cg_triggerEntities[ cg_numTriggerEntities ] = cent; cg_numTriggerEntities++; continue; } - if ( cent->nextState.solid ) { - cg_solidEntities[cg_numSolidEntities] = cent; + if( cent->nextState.solid ) + { + cg_solidEntities[ cg_numSolidEntities ] = cent; cg_numSolidEntities++; continue; } @@ -76,38 +79,42 @@ CG_ClipMoveToEntities ==================== */ static void CG_ClipMoveToEntities ( const vec3_t start, const vec3_t mins, const vec3_t maxs, const vec3_t end, - int skipNumber, int mask, trace_t *tr, qboolean capsule ) { - int i, x, zd, zu; - trace_t trace; + int skipNumber, int mask, trace_t *tr, qboolean capsule ) +{ + int i, x, zd, zu; + trace_t trace; entityState_t *ent; clipHandle_t cmodel; - vec3_t bmins, bmaxs; - vec3_t origin, angles; - centity_t *cent; + vec3_t bmins, bmaxs; + vec3_t origin, angles; + centity_t *cent; - for ( i = 0 ; i < cg_numSolidEntities ; i++ ) { + for( i = 0; i < cg_numSolidEntities; i++ ) + { cent = cg_solidEntities[ i ]; ent = ¢->currentState; - if ( ent->number == skipNumber ) { + if( ent->number == skipNumber ) continue; - } - if ( ent->solid == SOLID_BMODEL ) { + if( ent->solid == SOLID_BMODEL ) + { // special value for bmodel cmodel = trap_CM_InlineModel( ent->modelindex ); VectorCopy( cent->lerpAngles, angles ); BG_EvaluateTrajectory( ¢->currentState.pos, cg.physicsTime, origin ); - } else { + } + else + { // encoded bbox - x = (ent->solid & 255); - zd = ((ent->solid>>8) & 255); - zu = ((ent->solid>>16) & 255) - 32; + x = ( ent->solid & 255 ); + zd = ( ( ent->solid >> 8 ) & 255 ); + zu = ( ( ent->solid >> 16 ) & 255 ) - 32; - bmins[0] = bmins[1] = -x; - bmaxs[0] = bmaxs[1] = x; - bmins[2] = -zd; - bmaxs[2] = zu; + bmins[ 0 ] = bmins[ 1 ] = -x; + bmaxs[ 0 ] = bmaxs[ 1 ] = x; + bmins[ 2 ] = -zd; + bmaxs[ 2 ] = zu; cmodel = trap_CM_TempBoxModel( bmins, bmaxs ); VectorCopy( vec3_origin, angles ); @@ -118,23 +125,24 @@ static void CG_ClipMoveToEntities ( const vec3_t start, const vec3_t mins, const if( capsule ) { trap_CM_TransformedCapsuleTrace ( &trace, start, end, - mins, maxs, cmodel, mask, origin, angles); - } + mins, maxs, cmodel, mask, origin, angles ); + } else { trap_CM_TransformedBoxTrace ( &trace, start, end, - mins, maxs, cmodel, mask, origin, angles); + mins, maxs, cmodel, mask, origin, angles ); } - if (trace.allsolid || trace.fraction < tr->fraction) { + if( trace.allsolid || trace.fraction < tr->fraction ) + { trace.entityNum = ent->number; *tr = trace; - } else if (trace.startsolid) { - tr->startsolid = qtrue; } - if ( tr->allsolid ) { + else if( trace.startsolid ) + tr->startsolid = qtrue; + + if( tr->allsolid ) return; - } } } @@ -144,13 +152,14 @@ CG_Trace ================ */ void CG_Trace( trace_t *result, const vec3_t start, const vec3_t mins, const vec3_t maxs, const vec3_t end, - int skipNumber, int mask ) { + int skipNumber, int mask ) +{ trace_t t; - trap_CM_BoxTrace ( &t, start, end, mins, maxs, 0, mask); + trap_CM_BoxTrace( &t, start, end, mins, maxs, 0, mask ); t.entityNum = t.fraction != 1.0 ? ENTITYNUM_WORLD : ENTITYNUM_NONE; // check all other solid models - CG_ClipMoveToEntities (start, mins, maxs, end, skipNumber, mask, &t, qfalse); + CG_ClipMoveToEntities( start, mins, maxs, end, skipNumber, mask, &t, qfalse ); *result = t; } @@ -161,13 +170,14 @@ CG_CapTrace ================ */ void CG_CapTrace( trace_t *result, const vec3_t start, const vec3_t mins, const vec3_t maxs, const vec3_t end, - int skipNumber, int mask ) { + int skipNumber, int mask ) +{ trace_t t; - trap_CM_CapsuleTrace ( &t, start, end, mins, maxs, 0, mask); + trap_CM_CapsuleTrace( &t, start, end, mins, maxs, 0, mask ); t.entityNum = t.fraction != 1.0 ? ENTITYNUM_WORLD : ENTITYNUM_NONE; // check all other solid models - CG_ClipMoveToEntities (start, mins, maxs, end, skipNumber, mask, &t, qtrue); + CG_ClipMoveToEntities( start, mins, maxs, end, skipNumber, mask, &t, qtrue ); *result = t; } @@ -219,9 +229,10 @@ Generates cg.predictedPlayerState by interpolating between cg.snap->player_state and cg.nextFrame->player_state ======================== */ -static void CG_InterpolatePlayerState( qboolean grabAngles ) { - float f; - int i; +static void CG_InterpolatePlayerState( qboolean grabAngles ) +{ + float f; + int i; playerState_t *out; snapshot_t *prev, *next; @@ -232,84 +243,42 @@ static void CG_InterpolatePlayerState( qboolean grabAngles ) { *out = cg.snap->ps; // if we are still allowing local input, short circuit the view angles - if ( grabAngles ) { + if( grabAngles ) + { usercmd_t cmd; int cmdNum; - cmdNum = trap_GetCurrentCmdNumber(); + cmdNum = trap_GetCurrentCmdNumber( ); trap_GetUserCmd( cmdNum, &cmd ); PM_UpdateViewAngles( out, &cmd ); } // if the next frame is a teleport, we can't lerp to it - if ( cg.nextFrameTeleport ) { + if( cg.nextFrameTeleport ) return; - } - if ( !next || next->serverTime <= prev->serverTime ) { + if( !next || next->serverTime <= prev->serverTime ) return; - } f = (float)( cg.time - prev->serverTime ) / ( next->serverTime - prev->serverTime ); i = next->ps.bobCycle; - if ( i < prev->ps.bobCycle ) { + if( i < prev->ps.bobCycle ) i += 256; // handle wraparound - } + out->bobCycle = prev->ps.bobCycle + f * ( i - prev->ps.bobCycle ); - for ( i = 0 ; i < 3 ; i++ ) { - out->origin[i] = prev->ps.origin[i] + f * (next->ps.origin[i] - prev->ps.origin[i] ); - if ( !grabAngles ) { - out->viewangles[i] = LerpAngle( - prev->ps.viewangles[i], next->ps.viewangles[i], f ); - } - out->velocity[i] = prev->ps.velocity[i] + - f * (next->ps.velocity[i] - prev->ps.velocity[i] ); - } - -} - -/* -=================== -CG_TouchItem -=================== -*/ -static void CG_TouchItem( centity_t *cent ) { - gitem_t *item; - int ammo, clips, maxclips; - - BG_unpackAmmoArray( item->giTag, cg.predictedPlayerState.ammo, cg.predictedPlayerState.powerups, &ammo, &clips, &maxclips ); - - if ( !cg_predictItems.integer ) { - return; + for( i = 0; i < 3; i++ ) + { + out->origin[ i ] = prev->ps.origin[ i ] + f * ( next->ps.origin[ i ] - prev->ps.origin[ i ] ); + + if( !grabAngles ) + out->viewangles[ i ] = LerpAngle( prev->ps.viewangles[ i ], next->ps.viewangles[ i ], f ); + + out->velocity[ i ] = prev->ps.velocity[ i ] + + f * (next->ps.velocity[ i ] - prev->ps.velocity[ i ] ); } -/* if ( !BG_PlayerTouchesItem( &cg.predictedPlayerState, ¢->currentState, cg.time ) ) { - return; - }*/ - - // never pick an item up twice in a prediction - if ( cent->miscTime == cg.time ) { - return; - } - - // grab it - BG_AddPredictableEventToPlayerstate( EV_ITEM_PICKUP, cent->currentState.modelindex , &cg.predictedPlayerState); - - // remove it from the frame so it won't be drawn - cent->currentState.eFlags |= EF_NODRAW; - - // don't touch it again this prediction - cent->miscTime = cg.time; - - // if its a weapon, give them some predicted ammo so the autoswitch will work -/* if ( item->giType == IT_WEAPON ) { - BG_packWeapon( item->giTag, cg.predictedPlayerState.stats ); - if ( ammo == 0 && clips == 0 ) { - BG_packAmmoArray( item->giTag, cg.predictedPlayerState.ammo, cg.predictedPlayerState.powerups, 1, 0, 0 ); - } - }*/ } @@ -320,59 +289,51 @@ CG_TouchTriggerPrediction Predict push triggers and items ========================= */ -static void CG_TouchTriggerPrediction( void ) { - int i; - trace_t trace; +static void CG_TouchTriggerPrediction( void ) +{ + int i; + trace_t trace; entityState_t *ent; - clipHandle_t cmodel; - centity_t *cent; - qboolean spectator; + clipHandle_t cmodel; + centity_t *cent; + qboolean spectator; // dead clients don't activate triggers - if ( cg.predictedPlayerState.stats[STAT_HEALTH] <= 0 ) { + if( cg.predictedPlayerState.stats[ STAT_HEALTH ] <= 0 ) return; - } spectator = ( cg.predictedPlayerState.pm_type == PM_SPECTATOR ); - if ( cg.predictedPlayerState.pm_type != PM_NORMAL && !spectator ) { + if( cg.predictedPlayerState.pm_type != PM_NORMAL && !spectator ) return; - } - for ( i = 0 ; i < cg_numTriggerEntities ; i++ ) { + for( i = 0; i < cg_numTriggerEntities; i++ ) + { cent = cg_triggerEntities[ i ]; ent = ¢->currentState; - if ( ent->eType == ET_ITEM && !spectator ) { - CG_TouchItem( cent ); + if( ent->solid != SOLID_BMODEL ) continue; - } - - if ( ent->solid != SOLID_BMODEL ) { - continue; - } cmodel = trap_CM_InlineModel( ent->modelindex ); - if ( !cmodel ) { + if( !cmodel ) continue; - } trap_CM_BoxTrace( &trace, cg.predictedPlayerState.origin, cg.predictedPlayerState.origin, - cg_pmove.mins, cg_pmove.maxs, cmodel, -1 ); + cg_pmove.mins, cg_pmove.maxs, cmodel, -1 ); - if ( !trace.startsolid ) { + if( !trace.startsolid ) continue; - } - if ( ent->eType == ET_TELEPORT_TRIGGER ) { + if( ent->eType == ET_TELEPORT_TRIGGER ) cg.hyperspace = qtrue; - } else if ( ent->eType == ET_PUSH_TRIGGER ) { + else if( ent->eType == ET_PUSH_TRIGGER ) BG_TouchJumpPad( &cg.predictedPlayerState, ent ); - } } // if we didn't touch a jump pad this pmove frame - if ( cg.predictedPlayerState.jumppad_frame != cg.predictedPlayerState.pmove_framecount ) { + if( cg.predictedPlayerState.jumppad_frame != cg.predictedPlayerState.pmove_framecount ) + { cg.predictedPlayerState.jumppad_frame = 0; cg.predictedPlayerState.jumppad_ent = 0; } @@ -406,7 +367,8 @@ We detect prediction errors and allow them to be decayed off over several frames to ease the jerk. ================= */ -void CG_PredictPlayerState( void ) { +void CG_PredictPlayerState( void ) +{ int cmdNum, current, i; playerState_t oldPlayerState; qboolean moved; @@ -418,20 +380,23 @@ void CG_PredictPlayerState( void ) { // if this is the first frame we must guarantee // predictedPlayerState is valid even if there is some // other error condition - if ( !cg.validPPS ) { + if( !cg.validPPS ) + { cg.validPPS = qtrue; cg.predictedPlayerState = cg.snap->ps; } // demo playback just copies the moves - if ( cg.demoPlayback || (cg.snap->ps.pm_flags & PMF_FOLLOW) ) { + if( cg.demoPlayback || (cg.snap->ps.pm_flags & PMF_FOLLOW) ) + { CG_InterpolatePlayerState( qfalse ); return; } // non-predicting local movement will grab the latest angles - if ( cg_nopredict.integer || cg_synchronousClients.integer ) { + if( cg_nopredict.integer || cg_synchronousClients.integer ) + { CG_InterpolatePlayerState( qtrue ); return; } @@ -441,33 +406,33 @@ void CG_PredictPlayerState( void ) { cg_pmove.trace = CG_Trace; cg_pmove.pointcontents = CG_PointContents; - //TA: FIXME BIG NEON SIGN..... COULD MAYBE BE A FIX FOR THAT HACK IN bg_pmove.c.. MAYBE \/ - if ( cg_pmove.ps->pm_type == PM_DEAD ) { + if( cg_pmove.ps->pm_type == PM_DEAD ) cg_pmove.tracemask = MASK_PLAYERSOLID & ~CONTENTS_BODY; - } - else { + else cg_pmove.tracemask = MASK_PLAYERSOLID; - } - if ( cg.snap->ps.persistant[PERS_TEAM] == TEAM_SPECTATOR ) { + + if( cg.snap->ps.persistant[ PERS_TEAM ] == TEAM_SPECTATOR ) cg_pmove.tracemask &= ~CONTENTS_BODY; // spectators can fly through bodies - } + cg_pmove.noFootsteps = ( cgs.dmflags & DF_NO_FOOTSTEPS ) > 0; // save the state before the pmove so we can detect transitions oldPlayerState = cg.predictedPlayerState; - current = trap_GetCurrentCmdNumber(); + current = trap_GetCurrentCmdNumber( ); // if we don't have the commands right after the snapshot, we // can't accurately predict a current position, so just freeze at // the last good position we had cmdNum = current - CMD_BACKUP + 1; trap_GetUserCmd( cmdNum, &oldestCmd ); - if ( oldestCmd.serverTime > cg.snap->ps.commandTime - && oldestCmd.serverTime < cg.time ) { // special check for map_restart - if ( cg_showmiss.integer ) { - CG_Printf ("exceeded PACKET_BACKUP on commands\n"); - } + + if( oldestCmd.serverTime > cg.snap->ps.commandTime && + oldestCmd.serverTime < cg.time ) + { // special check for map_restart + if( cg_showmiss.integer ) + CG_Printf( "exceeded PACKET_BACKUP on commands\n" ); + return; } @@ -478,92 +443,103 @@ void CG_PredictPlayerState( void ) { // the server time is beyond our current cg.time, // because predicted player positions are going to // be ahead of everything else anyway - if ( cg.nextSnap && !cg.nextFrameTeleport && !cg.thisFrameTeleport ) { + if( cg.nextSnap && !cg.nextFrameTeleport && !cg.thisFrameTeleport ) + { cg.predictedPlayerState = cg.nextSnap->ps; cg.physicsTime = cg.nextSnap->serverTime; - } else { + } + else + { cg.predictedPlayerState = cg.snap->ps; cg.physicsTime = cg.snap->serverTime; } - if ( pmove_msec.integer < 8 ) { - trap_Cvar_Set("pmove_msec", "8"); - } - else if (pmove_msec.integer > 33) { - trap_Cvar_Set("pmove_msec", "33"); - } + if( pmove_msec.integer < 8 ) + trap_Cvar_Set( "pmove_msec", "8" ); + else if( pmove_msec.integer > 33 ) + trap_Cvar_Set( "pmove_msec", "33" ); cg_pmove.pmove_fixed = pmove_fixed.integer;// | cg_pmove_fixed.integer; cg_pmove.pmove_msec = pmove_msec.integer; // run cmds moved = qfalse; - for ( cmdNum = current - CMD_BACKUP + 1 ; cmdNum <= current ; cmdNum++ ) { + + for( cmdNum = current - CMD_BACKUP + 1; cmdNum <= current; cmdNum++ ) + { // get the command trap_GetUserCmd( cmdNum, &cg_pmove.cmd ); - if ( cg_pmove.pmove_fixed ) { + if( cg_pmove.pmove_fixed ) PM_UpdateViewAngles( cg_pmove.ps, &cg_pmove.cmd ); - } // don't do anything if the time is before the snapshot player time - if ( cg_pmove.cmd.serverTime <= cg.predictedPlayerState.commandTime ) { + if( cg_pmove.cmd.serverTime <= cg.predictedPlayerState.commandTime ) continue; - } // don't do anything if the command was from a previous map_restart - if ( cg_pmove.cmd.serverTime > latestCmd.serverTime ) { + if( cg_pmove.cmd.serverTime > latestCmd.serverTime ) continue; - } // check for a prediction error from last frame // on a lan, this will often be the exact value // from the snapshot, but on a wan we will have // to predict several commands to get to the point // we want to compare - if ( cg.predictedPlayerState.commandTime == oldPlayerState.commandTime ) { + if( cg.predictedPlayerState.commandTime == oldPlayerState.commandTime ) + { vec3_t delta; - float len; + float len; - if ( cg.thisFrameTeleport ) { + if( cg.thisFrameTeleport ) + { // a teleport will not cause an error decay VectorClear( cg.predictedError ); - if ( cg_showmiss.integer ) { + + if( cg_showmiss.integer ) CG_Printf( "PredictionTeleport\n" ); - } + cg.thisFrameTeleport = qfalse; - } else { + } + else + { vec3_t adjusted; CG_AdjustPositionForMover( cg.predictedPlayerState.origin, cg.predictedPlayerState.groundEntityNum, cg.physicsTime, cg.oldTime, adjusted ); - if ( cg_showmiss.integer ) { - if (!VectorCompare( oldPlayerState.origin, adjusted )) { + if( cg_showmiss.integer ) + { + if( !VectorCompare( oldPlayerState.origin, adjusted ) ) CG_Printf("prediction error\n"); - } } + VectorSubtract( oldPlayerState.origin, adjusted, delta ); len = VectorLength( delta ); - if ( len > 0.1 ) { - if ( cg_showmiss.integer ) { - CG_Printf("Prediction miss: %f\n", len); - } - if ( cg_errorDecay.integer ) { + + if( len > 0.1 ) + { + if( cg_showmiss.integer ) + CG_Printf( "Prediction miss: %f\n", len ); + + if( cg_errorDecay.integer ) + { int t; float f; t = cg.time - cg.predictedErrorTime; f = ( cg_errorDecay.value - t ) / cg_errorDecay.value; - if ( f < 0 ) { + + if( f < 0 ) f = 0; - } - if ( f > 0 && cg_showmiss.integer ) { - CG_Printf("Double prediction decay: %f\n", f); - } + + if( f > 0 && cg_showmiss.integer ) + CG_Printf( "Double prediction decay: %f\n", f ); + VectorScale( cg.predictedError, f, cg.predictedError ); - } else { - VectorClear( cg.predictedError ); } + else + VectorClear( cg.predictedError ); + VectorAdd( delta, cg.predictedError, cg.predictedError ); cg.predictedErrorTime = cg.oldTime; } @@ -575,29 +551,29 @@ void CG_PredictPlayerState( void ) { for( i = WP_NONE + 1; i < WP_NUM_WEAPONS; i++ ) cg_pmove.autoWeaponHit[ i ] = qfalse; - if ( cg_pmove.pmove_fixed ) { - cg_pmove.cmd.serverTime = ((cg_pmove.cmd.serverTime + pmove_msec.integer-1) / pmove_msec.integer) * pmove_msec.integer; - } + if( cg_pmove.pmove_fixed ) + cg_pmove.cmd.serverTime = ( ( cg_pmove.cmd.serverTime + pmove_msec.integer - 1 ) / + pmove_msec.integer ) * pmove_msec.integer; - Pmove (&cg_pmove); + Pmove( &cg_pmove ); moved = qtrue; // add push trigger movement effects - CG_TouchTriggerPrediction(); + CG_TouchTriggerPrediction( ); // check for predictable events that changed from previous predictions //CG_CheckChangedPredictableEvents(&cg.predictedPlayerState); } - if ( cg_showmiss.integer > 1 ) { + if( cg_showmiss.integer > 1 ) CG_Printf( "[%i : %i] ", cg_pmove.cmd.serverTime, cg.time ); - } - if ( !moved ) { - if ( cg_showmiss.integer ) { + if( !moved ) + { + if( cg_showmiss.integer ) CG_Printf( "not moved\n" ); - } + return; } @@ -606,21 +582,21 @@ void CG_PredictPlayerState( void ) { cg.predictedPlayerState.groundEntityNum, cg.physicsTime, cg.time, cg.predictedPlayerState.origin ); - if ( cg_showmiss.integer ) { - if (cg.predictedPlayerState.eventSequence > oldPlayerState.eventSequence + MAX_PS_EVENTS) { - CG_Printf("WARNING: dropped event\n"); - } + if( cg_showmiss.integer ) + { + if( cg.predictedPlayerState.eventSequence > oldPlayerState.eventSequence + MAX_PS_EVENTS ) + CG_Printf( "WARNING: dropped event\n" ); } // fire events and other transition triggered things CG_TransitionPlayerState( &cg.predictedPlayerState, &oldPlayerState ); - if ( cg_showmiss.integer ) { - if (cg.eventSequence > cg.predictedPlayerState.eventSequence) { - CG_Printf("WARNING: double event\n"); + if( cg_showmiss.integer ) + { + if( cg.eventSequence > cg.predictedPlayerState.eventSequence ) + { + CG_Printf( "WARNING: double event\n" ); cg.eventSequence = cg.predictedPlayerState.eventSequence; } } } - - diff --git a/src/cgame/cg_scanner.c b/src/cgame/cg_scanner.c index bec5f195..4135eec9 100644 --- a/src/cgame/cg_scanner.c +++ b/src/cgame/cg_scanner.c @@ -113,7 +113,7 @@ static void CG_DrawDir( vec3_t origin, vec4_t colour ) CG_AlienSense ============= */ -void CG_AlienSense( ) +void CG_AlienSense( void ) { int i; vec3_t origin; @@ -149,7 +149,7 @@ void CG_AlienSense( ) CG_Scanner ============= */ -void CG_Scanner( ) +void CG_Scanner( void ) { int i; vec3_t origin; diff --git a/src/cgame/cg_servercmds.c b/src/cgame/cg_servercmds.c index 4107cc49..88df68f2 100644 --- a/src/cgame/cg_servercmds.c +++ b/src/cgame/cg_servercmds.c @@ -19,60 +19,41 @@ #include "cg_local.h" -#include "../../ui/menudef.h" - -typedef struct { - const char *order; - int taskNum; -} orderTask_t; - -static const orderTask_t validOrders[] = { - /*{ VOICECHAT_GETFLAG, TEAMTASK_OFFENSE }, - { VOICECHAT_OFFENSE, TEAMTASK_OFFENSE }, - { VOICECHAT_DEFEND, TEAMTASK_DEFENSE }, - { VOICECHAT_DEFENDFLAG, TEAMTASK_DEFENSE }, - { VOICECHAT_PATROL, TEAMTASK_PATROL }, - { VOICECHAT_CAMP, TEAMTASK_CAMP }, - { VOICECHAT_FOLLOWME, TEAMTASK_FOLLOW }, - { VOICECHAT_RETURNFLAG, TEAMTASK_RETRIEVE }, - { VOICECHAT_FOLLOWFLAGCARRIER, TEAMTASK_ESCORT }*/ - { NULL, 0 } -}; - -static const int numValidOrders = sizeof(validOrders) / sizeof(orderTask_t); - /* ================= CG_ParseScores ================= */ -static void CG_ParseScores( void ) { +static void CG_ParseScores( void ) +{ int i, powerups; cg.numScores = atoi( CG_Argv( 1 ) ); - if ( cg.numScores > MAX_CLIENTS ) { + + if( cg.numScores > MAX_CLIENTS ) cg.numScores = MAX_CLIENTS; - } - cg.teamScores[0] = atoi( CG_Argv( 2 ) ); - cg.teamScores[1] = atoi( CG_Argv( 3 ) ); + cg.teamScores[ 0 ] = atoi( CG_Argv( 2 ) ); + cg.teamScores[ 1 ] = atoi( CG_Argv( 3 ) ); memset( cg.scores, 0, sizeof( cg.scores ) ); - for ( i = 0 ; i < cg.numScores ; i++ ) { + + for( i = 0; i < cg.numScores; i++ ) + { // - cg.scores[i].client = atoi( CG_Argv( i * 4 + 4 ) ); - cg.scores[i].score = atoi( CG_Argv( i * 4 + 5 ) ); - cg.scores[i].ping = atoi( CG_Argv( i * 4 + 6 ) ); - cg.scores[i].time = atoi( CG_Argv( i * 4 + 7 ) ); + cg.scores[ i ].client = atoi( CG_Argv( i * 4 + 4 ) ); + cg.scores[ i ].score = atoi( CG_Argv( i * 4 + 5 ) ); + cg.scores[ i ].ping = atoi( CG_Argv( i * 4 + 6 ) ); + cg.scores[ i ].time = atoi( CG_Argv( i * 4 + 7 ) ); - if ( cg.scores[i].client < 0 || cg.scores[i].client >= MAX_CLIENTS ) { - cg.scores[i].client = 0; - } - cgs.clientinfo[ cg.scores[i].client ].score = cg.scores[i].score; - cgs.clientinfo[ cg.scores[i].client ].powerups = powerups; + if( cg.scores[ i ].client < 0 || cg.scores[ i ].client >= MAX_CLIENTS ) + cg.scores[ i ].client = 0; + + cgs.clientinfo[ cg.scores[ i ].client ].score = cg.scores[ i ].score; + cgs.clientinfo[ cg.scores[ i ].client ].powerups = powerups; - cg.scores[i].team = cgs.clientinfo[cg.scores[i].client].team; + cg.scores[ i ].team = cgs.clientinfo[ cg.scores[ i ].client ].team; } } @@ -82,16 +63,18 @@ CG_ParseTeamInfo ================= */ -static void CG_ParseTeamInfo( void ) { +static void CG_ParseTeamInfo( void ) +{ int i; int client; numSortedTeamPlayers = atoi( CG_Argv( 1 ) ); - for ( i = 0 ; i < numSortedTeamPlayers ; i++ ) { + for( i = 0; i < numSortedTeamPlayers; i++ ) + { client = atoi( CG_Argv( i * 6 + 2 ) ); - sortedTeamPlayers[i] = client; + sortedTeamPlayers[ i ] = client; cgs.clientinfo[ client ].location = atoi( CG_Argv( i * 6 + 3 ) ); cgs.clientinfo[ client ].health = atoi( CG_Argv( i * 6 + 4 ) ); @@ -110,23 +93,18 @@ This is called explicitly when the gamestate is first received, and whenever the server updates any serverinfo flagged cvars ================ */ -void CG_ParseServerinfo( void ) { +void CG_ParseServerinfo( void ) +{ const char *info; char *mapname; info = CG_ConfigString( CS_SERVERINFO ); cgs.dmflags = atoi( Info_ValueForKey( info, "dmflags" ) ); cgs.teamflags = atoi( Info_ValueForKey( info, "teamflags" ) ); - cgs.fraglimit = atoi( Info_ValueForKey( info, "fraglimit" ) ); - cgs.capturelimit = atoi( Info_ValueForKey( info, "capturelimit" ) ); cgs.timelimit = atoi( Info_ValueForKey( info, "timelimit" ) ); cgs.maxclients = atoi( Info_ValueForKey( info, "sv_maxclients" ) ); mapname = Info_ValueForKey( info, "mapname" ); Com_sprintf( cgs.mapname, sizeof( cgs.mapname ), "maps/%s.bsp", mapname ); - Q_strncpyz( cgs.redTeam, Info_ValueForKey( info, "g_redTeam" ), sizeof(cgs.redTeam) ); - trap_Cvar_Set("g_redTeam", cgs.redTeam); - Q_strncpyz( cgs.blueTeam, Info_ValueForKey( info, "g_blueTeam" ), sizeof(cgs.blueTeam) ); - trap_Cvar_Set("g_blueTeam", cgs.blueTeam); } /* @@ -134,20 +112,21 @@ void CG_ParseServerinfo( void ) { CG_ParseWarmup ================== */ -static void CG_ParseWarmup( void ) { +static void CG_ParseWarmup( void ) +{ const char *info; - int warmup; + int warmup; info = CG_ConfigString( CS_WARMUP ); warmup = atoi( info ); cg.warmupCount = -1; - if ( warmup == 0 && cg.warmup ) { - - } else if ( warmup > 0 && cg.warmup <= 0 ) { - trap_S_StartLocalSound( cgs.media.countPrepareSound, CHAN_ANNOUNCER ); + if( warmup == 0 && cg.warmup ) + { } + else if( warmup > 0 && cg.warmup <= 0 ) + trap_S_StartLocalSound( cgs.media.countPrepareSound, CHAN_ANNOUNCER ); cg.warmup = warmup; } @@ -185,38 +164,48 @@ void CG_SetConfigValues( void ) CG_ShaderStateChanged ===================== */ -void CG_ShaderStateChanged(void) { - char originalShader[MAX_QPATH]; - char newShader[MAX_QPATH]; - char timeOffset[16]; - const char *o; - char *n,*t; +void CG_ShaderStateChanged( void ) +{ + char originalShader[ MAX_QPATH ]; + char newShader[ MAX_QPATH ]; + char timeOffset[ 16 ]; + const char *o; + char *n, *t; o = CG_ConfigString( CS_SHADERSTATE ); - while (o && *o) { - n = strstr(o, "="); - if (n && *n) { - strncpy(originalShader, o, n-o); - originalShader[n-o] = 0; + + while( o && *o ) + { + n = strstr( o, "=" ); + + if( n && *n ) + { + strncpy( originalShader, o, n - o ); + originalShader[ n - o ] = 0; n++; - t = strstr(n, ":"); - if (t && *t) { - strncpy(newShader, n, t-n); - newShader[t-n] = 0; - } else { - break; + t = strstr( n, ":" ); + + if( t && *t ) + { + strncpy( newShader, n, t - n ); + newShader[ t - n ] = 0; } + else + break; + t++; - o = strstr(t, "@"); - if (o) { - strncpy(timeOffset, t, o-t); - timeOffset[o-t] = 0; + o = strstr( t, "@" ); + + if( o ) + { + strncpy( timeOffset, t, o - t ); + timeOffset[ o - t ] = 0; o++; trap_R_RemapShader( originalShader, newShader, timeOffset ); } - } else { - break; } + else + break; } } @@ -254,9 +243,10 @@ CG_ConfigStringModified ================ */ -static void CG_ConfigStringModified( void ) { +static void CG_ConfigStringModified( void ) +{ const char *str; - int num; + int num; num = atoi( CG_Argv( 1 ) ); @@ -268,23 +258,23 @@ static void CG_ConfigStringModified( void ) { str = CG_ConfigString( num ); // do something with it if necessary - if ( num == CS_MUSIC ) { - CG_StartMusic(); - } else if ( num == CS_SERVERINFO ) { - CG_ParseServerinfo(); - } else if ( num == CS_WARMUP ) { - CG_ParseWarmup(); - } else if ( num == CS_SCORES1 ) { + if( num == CS_MUSIC ) + CG_StartMusic( ); + else if( num == CS_SERVERINFO ) + CG_ParseServerinfo( ); + else if( num == CS_WARMUP ) + CG_ParseWarmup( ); + else if( num == CS_SCORES1 ) cgs.scores1 = atoi( str ); - } else if ( num == CS_SCORES2 ) { + else if( num == CS_SCORES2 ) cgs.scores2 = atoi( str ); - } else if( num == CS_BUILDPOINTS ) { + else if( num == CS_BUILDPOINTS ) sscanf( str, "%d %d %d %d %d", &cgs.alienBuildPoints, &cgs.alienBuildPointsTotal, &cgs.humanBuildPoints, &cgs.humanBuildPointsTotal, &cgs.humanBuildPointsPowered ); - } else if( num == CS_STAGES ) + else if( num == CS_STAGES ) { stage_t oldAlienStage = cgs.alienStage; stage_t oldHumanStage = cgs.humanStage; @@ -297,49 +287,67 @@ static void CG_ConfigStringModified( void ) { if( cgs.humanStage != oldHumanStage ) CG_AnnounceHumanStageTransistion( oldHumanStage, cgs.humanStage ); } - else if ( num == CS_LEVEL_START_TIME ) { + else if( num == CS_LEVEL_START_TIME ) cgs.levelStartTime = atoi( str ); - } else if ( num == CS_VOTE_TIME ) { + else if( num == CS_VOTE_TIME ) + { cgs.voteTime = atoi( str ); cgs.voteModified = qtrue; - } else if ( num == CS_VOTE_YES ) { + } + else if( num == CS_VOTE_YES ) + { cgs.voteYes = atoi( str ); cgs.voteModified = qtrue; - } else if ( num == CS_VOTE_NO ) { + } + else if( num == CS_VOTE_NO ) + { cgs.voteNo = atoi( str ); cgs.voteModified = qtrue; - } else if ( num == CS_VOTE_STRING ) { + } + else if( num == CS_VOTE_STRING ) Q_strncpyz( cgs.voteString, str, sizeof( cgs.voteString ) ); - } else if ( num >= CS_TEAMVOTE_TIME && num <= CS_TEAMVOTE_TIME + 1) { - cgs.teamVoteTime[num-CS_TEAMVOTE_TIME] = atoi( str ); - cgs.teamVoteModified[num-CS_TEAMVOTE_TIME] = qtrue; - } else if ( num >= CS_TEAMVOTE_YES && num <= CS_TEAMVOTE_YES + 1) { - cgs.teamVoteYes[num-CS_TEAMVOTE_YES] = atoi( str ); - cgs.teamVoteModified[num-CS_TEAMVOTE_YES] = qtrue; - } else if ( num >= CS_TEAMVOTE_NO && num <= CS_TEAMVOTE_NO + 1) { - cgs.teamVoteNo[num-CS_TEAMVOTE_NO] = atoi( str ); - cgs.teamVoteModified[num-CS_TEAMVOTE_NO] = qtrue; - } else if ( num >= CS_TEAMVOTE_STRING && num <= CS_TEAMVOTE_STRING + 1) { - Q_strncpyz( cgs.teamVoteString[num-CS_TEAMVOTE_STRING], str, sizeof( cgs.teamVoteString ) ); - } else if ( num == CS_INTERMISSION ) { + else if( num >= CS_TEAMVOTE_TIME && num <= CS_TEAMVOTE_TIME + 1 ) + { + cgs.teamVoteTime[ num - CS_TEAMVOTE_TIME ] = atoi( str ); + cgs.teamVoteModified[ num - CS_TEAMVOTE_TIME ] = qtrue; + } + else if( num >= CS_TEAMVOTE_YES && num <= CS_TEAMVOTE_YES + 1 ) + { + cgs.teamVoteYes[ num - CS_TEAMVOTE_YES ] = atoi( str ); + cgs.teamVoteModified[ num - CS_TEAMVOTE_YES ] = qtrue; + } + else if( num >= CS_TEAMVOTE_NO && num <= CS_TEAMVOTE_NO + 1 ) + { + cgs.teamVoteNo[ num - CS_TEAMVOTE_NO ] = atoi( str ); + cgs.teamVoteModified[ num - CS_TEAMVOTE_NO ] = qtrue; + } + else if( num >= CS_TEAMVOTE_STRING && num <= CS_TEAMVOTE_STRING + 1 ) + Q_strncpyz( cgs.teamVoteString[ num - CS_TEAMVOTE_STRING ], str, sizeof( cgs.teamVoteString ) ); + else if( num == CS_INTERMISSION ) cg.intermissionStarted = atoi( str ); - } else if ( num >= CS_MODELS && num < CS_MODELS+MAX_MODELS ) { - cgs.gameModels[ num-CS_MODELS ] = trap_R_RegisterModel( str ); - } else if ( num >= CS_SHADERS && num < CS_SHADERS+MAX_SHADERS ) { - cgs.gameShaders[ num-CS_SHADERS ] = trap_R_RegisterShader( str ); - } else if ( num >= CS_SOUNDS && num < CS_SOUNDS+MAX_SOUNDS ) { - if ( str[0] != '*' ) { // player specific sounds don't register here - cgs.gameSounds[ num-CS_SOUNDS] = trap_S_RegisterSound( str, qfalse ); + else if( num >= CS_MODELS && num < CS_MODELS+MAX_MODELS ) + cgs.gameModels[ num - CS_MODELS ] = trap_R_RegisterModel( str ); + else if( num >= CS_SHADERS && num < CS_SHADERS+MAX_SHADERS ) + cgs.gameShaders[ num - CS_SHADERS ] = trap_R_RegisterShader( str ); + else if( num >= CS_SOUNDS && num < CS_SOUNDS+MAX_SOUNDS ) + { + if( str[ 0 ] != '*' ) + { // player specific sounds don't register here + cgs.gameSounds[ num - CS_SOUNDS ] = trap_S_RegisterSound( str, qfalse ); } - } else if ( num >= CS_PLAYERS && num < CS_PLAYERS+MAX_CLIENTS ) { + } + else if( num >= CS_PLAYERS && num < CS_PLAYERS+MAX_CLIENTS ) + { CG_NewClientInfo( num - CS_PLAYERS ); - CG_BuildSpectatorString(); - } else if ( num == CS_FLAGSTATUS ) { + CG_BuildSpectatorString( ); } - else if ( num == CS_SHADERSTATE ) { - CG_ShaderStateChanged(); + else if( num == CS_FLAGSTATUS ) + { + } + else if( num == CS_SHADERSTATE ) + { + CG_ShaderStateChanged( ); } - } @@ -349,19 +357,20 @@ CG_AddToTeamChat ======================= */ -static void CG_AddToTeamChat( const char *str ) { - int len; - char *p, *ls; - int lastcolor; - int chatHeight; +static void CG_AddToTeamChat( const char *str ) +{ + int len; + char *p, *ls; + int lastcolor; + int chatHeight; - if (cg_teamChatHeight.integer < TEAMCHAT_HEIGHT) { + if( cg_teamChatHeight.integer < TEAMCHAT_HEIGHT ) chatHeight = cg_teamChatHeight.integer; - } else { + else chatHeight = TEAMCHAT_HEIGHT; - } - if (chatHeight <= 0 || cg_teamChatTime.integer <= 0) { + if( chatHeight <= 0 || cg_teamChatTime.integer <= 0 ) + { // team chat disabled, dump into normal chat cgs.teamChatPos = cgs.teamLastChatPos = 0; return; @@ -375,19 +384,23 @@ static void CG_AddToTeamChat( const char *str ) { lastcolor = '7'; ls = NULL; - while (*str) { - if (len > TEAMCHAT_WIDTH - 1) { - if (ls) { - str -= (p - ls); + while( *str ) + { + if( len > TEAMCHAT_WIDTH - 1 ) + { + if( ls ) + { + str -= ( p - ls ); str++; - p -= (p - ls); + p -= ( p - ls ); } + *p = 0; - cgs.teamChatMsgTimes[cgs.teamChatPos % chatHeight] = cg.time; + cgs.teamChatMsgTimes[ cgs.teamChatPos % chatHeight ] = cg.time; cgs.teamChatPos++; - p = cgs.teamChatMsgs[cgs.teamChatPos % chatHeight]; + p = cgs.teamChatMsgs[ cgs.teamChatPos % chatHeight ]; *p = 0; *p++ = Q_COLOR_ESCAPE; *p++ = lastcolor; @@ -395,24 +408,26 @@ static void CG_AddToTeamChat( const char *str ) { ls = NULL; } - if ( Q_IsColorString( str ) ) { + if( Q_IsColorString( str ) ) + { *p++ = *str++; lastcolor = *str; *p++ = *str++; continue; } - if (*str == ' ') { + + if( *str == ' ' ) ls = p; - } + *p++ = *str++; len++; } *p = 0; - cgs.teamChatMsgTimes[cgs.teamChatPos % chatHeight] = cg.time; + cgs.teamChatMsgTimes[ cgs.teamChatPos % chatHeight ] = cg.time; cgs.teamChatPos++; - if (cgs.teamChatPos - cgs.teamLastChatPos > chatHeight) + if( cgs.teamChatPos - cgs.teamLastChatPos > chatHeight ) cgs.teamLastChatPos = cgs.teamChatPos - chatHeight; } @@ -429,16 +444,16 @@ A tournement restart will clear everything, but doesn't require a reload of all the media =============== */ -static void CG_MapRestart( void ) { - if ( cg_showmiss.integer ) { +static void CG_MapRestart( void ) +{ + if( cg_showmiss.integer ) CG_Printf( "CG_MapRestart\n" ); - } - CG_InitLocalEntities(); - CG_InitMarkPolys(); + CG_InitLocalEntities( ); + CG_InitMarkPolys( ); // Ridah, trails - CG_ClearTrails (); + CG_ClearTrails( ); // done. // make sure the "3 frags left" warnings play again @@ -452,9 +467,9 @@ static void CG_MapRestart( void ) { cg.mapRestart = qtrue; - CG_StartMusic(); + CG_StartMusic( ); - trap_S_ClearLoopingSounds(qtrue); + trap_S_ClearLoopingSounds( qtrue ); // we really should clear more parts of cg here and stop sounds @@ -462,470 +477,10 @@ static void CG_MapRestart( void ) { if( cg.warmup == 0 ) { trap_S_StartLocalSound( cgs.media.countFightSound, CHAN_ANNOUNCER ); - CG_CenterPrint( "FIGHT!", 120, GIANTCHAR_WIDTH*2 ); - } - trap_Cvar_Set("cg_thirdPerson", "0"); -} - -#define MAX_VOICEFILESIZE 16384 -#define MAX_VOICEFILES 8 -#define MAX_VOICECHATS 64 -#define MAX_VOICESOUNDS 64 -#define MAX_CHATSIZE 64 -#define MAX_HEADMODELS 64 - -typedef struct voiceChat_s -{ - char id[64]; - int numSounds; - sfxHandle_t sounds[MAX_VOICESOUNDS]; - char chats[MAX_VOICESOUNDS][MAX_CHATSIZE]; -} voiceChat_t; - -typedef struct voiceChatList_s -{ - char name[64]; - int gender; - int numVoiceChats; - voiceChat_t voiceChats[MAX_VOICECHATS]; -} voiceChatList_t; - -typedef struct headModelVoiceChat_s -{ - char headmodel[64]; - int voiceChatNum; -} headModelVoiceChat_t; - -voiceChatList_t voiceChatLists[MAX_VOICEFILES]; -headModelVoiceChat_t headModelVoiceChat[MAX_HEADMODELS]; - -/* -================= -CG_ParseVoiceChats -================= -*/ -int CG_ParseVoiceChats( const char *filename, voiceChatList_t *voiceChatList, int maxVoiceChats ) { - int len, i; - fileHandle_t f; - char buf[MAX_VOICEFILESIZE]; - char **p, *ptr; - char *token; - voiceChat_t *voiceChats; - qboolean compress; - - compress = qtrue; - if (cg_buildScript.integer) { - compress = qfalse; - } - - len = trap_FS_FOpenFile( filename, &f, FS_READ ); - if ( !f ) { - //trap_Print( va( S_COLOR_RED "voice chat file not found: %s\n", filename ) ); - return qfalse; - } - if ( len >= MAX_VOICEFILESIZE ) { - trap_Print( va( S_COLOR_RED "voice chat file too large: %s is %i, max allowed is %i", filename, len, MAX_VOICEFILESIZE ) ); - trap_FS_FCloseFile( f ); - return qfalse; - } - - trap_FS_Read( buf, len, f ); - buf[len] = 0; - trap_FS_FCloseFile( f ); - - ptr = buf; - p = &ptr; - - Com_sprintf(voiceChatList->name, sizeof(voiceChatList->name), "%s", filename); - voiceChats = voiceChatList->voiceChats; - for ( i = 0; i < maxVoiceChats; i++ ) { - voiceChats[i].id[0] = 0; - } - token = COM_ParseExt(p, qtrue); - if (!token || token[0] == 0) { - return qtrue; - } - if (!Q_stricmp(token, "female")) { - voiceChatList->gender = GENDER_FEMALE; - } - else if (!Q_stricmp(token, "male")) { - voiceChatList->gender = GENDER_MALE; - } - else if (!Q_stricmp(token, "neuter")) { - voiceChatList->gender = GENDER_NEUTER; - } - else { - trap_Print( va( S_COLOR_RED "expected gender not found in voice chat file: %s\n", filename ) ); - return qfalse; - } - - voiceChatList->numVoiceChats = 0; - while ( 1 ) { - token = COM_ParseExt(p, qtrue); - if (!token || token[0] == 0) { - return qtrue; - } - Com_sprintf(voiceChats[voiceChatList->numVoiceChats].id, sizeof( voiceChats[voiceChatList->numVoiceChats].id ), "%s", token); - token = COM_ParseExt(p, qtrue); - if (Q_stricmp(token, "{")) { - trap_Print( va( S_COLOR_RED "expected { found %s in voice chat file: %s\n", token, filename ) ); - return qfalse; - } - voiceChats[voiceChatList->numVoiceChats].numSounds = 0; - while(1) { - token = COM_ParseExt(p, qtrue); - if (!token || token[0] == 0) { - return qtrue; - } - if (!Q_stricmp(token, "}")) - break; - voiceChats[voiceChatList->numVoiceChats].sounds[voiceChats[voiceChatList->numVoiceChats].numSounds] = - trap_S_RegisterSound( token , compress ); - token = COM_ParseExt(p, qtrue); - if (!token || token[0] == 0) { - return qtrue; - } - Com_sprintf(voiceChats[voiceChatList->numVoiceChats].chats[ - voiceChats[voiceChatList->numVoiceChats].numSounds], MAX_CHATSIZE, "%s", token); - voiceChats[voiceChatList->numVoiceChats].numSounds++; - if (voiceChats[voiceChatList->numVoiceChats].numSounds >= MAX_VOICESOUNDS) - break; - } - voiceChatList->numVoiceChats++; - if (voiceChatList->numVoiceChats >= maxVoiceChats) - return qtrue; - } - return qtrue; -} - -/* -================= -CG_LoadVoiceChats -================= -*/ -void CG_LoadVoiceChats( void ) { - int size; - - size = trap_MemoryRemaining(); - CG_ParseVoiceChats( "scripts/female1.voice", &voiceChatLists[0], MAX_VOICECHATS ); - CG_ParseVoiceChats( "scripts/female2.voice", &voiceChatLists[1], MAX_VOICECHATS ); - CG_ParseVoiceChats( "scripts/female3.voice", &voiceChatLists[2], MAX_VOICECHATS ); - CG_ParseVoiceChats( "scripts/male1.voice", &voiceChatLists[3], MAX_VOICECHATS ); - CG_ParseVoiceChats( "scripts/male2.voice", &voiceChatLists[4], MAX_VOICECHATS ); - CG_ParseVoiceChats( "scripts/male3.voice", &voiceChatLists[5], MAX_VOICECHATS ); - CG_ParseVoiceChats( "scripts/male4.voice", &voiceChatLists[6], MAX_VOICECHATS ); - CG_ParseVoiceChats( "scripts/male5.voice", &voiceChatLists[7], MAX_VOICECHATS ); - CG_Printf("voice chat memory size = %d\n", size - trap_MemoryRemaining()); -} - -/* -================= -CG_HeadModelVoiceChats -================= -*/ -int CG_HeadModelVoiceChats( char *filename ) { - int len, i; - fileHandle_t f; - char buf[MAX_VOICEFILESIZE]; - char **p, *ptr; - char *token; - - len = trap_FS_FOpenFile( filename, &f, FS_READ ); - if ( !f ) { - trap_Print( va( "voice chat file not found: %s\n", filename ) ); - return -1; - } - if ( len >= MAX_VOICEFILESIZE ) { - trap_Print( va( S_COLOR_RED "voice chat file too large: %s is %i, max allowed is %i", filename, len, MAX_VOICEFILESIZE ) ); - trap_FS_FCloseFile( f ); - return -1; - } - - trap_FS_Read( buf, len, f ); - buf[len] = 0; - trap_FS_FCloseFile( f ); - - ptr = buf; - p = &ptr; - - token = COM_ParseExt(p, qtrue); - if (!token || token[0] == 0) { - return -1; - } - - for ( i = 0; i < MAX_VOICEFILES; i++ ) { - if ( !Q_stricmp(token, voiceChatLists[i].name) ) { - return i; - } - } - - //FIXME: maybe try to load the .voice file which name is stored in token? - - return -1; -} - -/* -================= -CG_GetVoiceChat -================= -*/ -int CG_GetVoiceChat( voiceChatList_t *voiceChatList, const char *id, sfxHandle_t *snd, char **chat) { - int i, rnd; - - for ( i = 0; i < voiceChatList->numVoiceChats; i++ ) { - if ( !Q_stricmp( id, voiceChatList->voiceChats[i].id ) ) { - rnd = random() * voiceChatList->voiceChats[i].numSounds; - *snd = voiceChatList->voiceChats[i].sounds[rnd]; - *chat = voiceChatList->voiceChats[i].chats[rnd]; - return qtrue; - } + CG_CenterPrint( "FIGHT!", 120, GIANTCHAR_WIDTH * 2 ); } - return qfalse; -} - -/* -================= -CG_VoiceChatListForClient -================= -*/ -voiceChatList_t *CG_VoiceChatListForClient( int clientNum ) { - clientInfo_t *ci; - int voiceChatNum, i, j, k, gender; - char filename[MAX_QPATH], headModelName[MAX_QPATH]; - if ( clientNum < 0 || clientNum >= MAX_CLIENTS ) { - clientNum = 0; - } - ci = &cgs.clientinfo[ clientNum ]; - - for ( k = 0; k < 2; k++ ) { - if ( k == 0 ) { - if (ci->headModelName[0] == '*') { - Com_sprintf( headModelName, sizeof(headModelName), "%s/%s", ci->headModelName+1, ci->headSkinName ); - } - else { - Com_sprintf( headModelName, sizeof(headModelName), "%s/%s", ci->headModelName, ci->headSkinName ); - } - } - else { - if (ci->headModelName[0] == '*') { - Com_sprintf( headModelName, sizeof(headModelName), "%s", ci->headModelName+1 ); - } - else { - Com_sprintf( headModelName, sizeof(headModelName), "%s", ci->headModelName ); - } - } - // find the voice file for the head model the client uses - for ( i = 0; i < MAX_HEADMODELS; i++ ) { - if (!Q_stricmp(headModelVoiceChat[i].headmodel, headModelName)) { - break; - } - } - if (i < MAX_HEADMODELS) { - return &voiceChatLists[headModelVoiceChat[i].voiceChatNum]; - } - // find a <headmodelname>.vc file - for ( i = 0; i < MAX_HEADMODELS; i++ ) { - if (!strlen(headModelVoiceChat[i].headmodel)) { - Com_sprintf(filename, sizeof(filename), "scripts/%s.vc", headModelName); - voiceChatNum = CG_HeadModelVoiceChats(filename); - if (voiceChatNum == -1) - break; - Com_sprintf(headModelVoiceChat[i].headmodel, sizeof ( headModelVoiceChat[i].headmodel ), - "%s", headModelName); - headModelVoiceChat[i].voiceChatNum = voiceChatNum; - return &voiceChatLists[headModelVoiceChat[i].voiceChatNum]; - } - } - } - gender = ci->gender; - for (k = 0; k < 2; k++) { - // just pick the first with the right gender - for ( i = 0; i < MAX_VOICEFILES; i++ ) { - if (strlen(voiceChatLists[i].name)) { - if (voiceChatLists[i].gender == gender) { - // store this head model with voice chat for future reference - for ( j = 0; j < MAX_HEADMODELS; j++ ) { - if (!strlen(headModelVoiceChat[j].headmodel)) { - Com_sprintf(headModelVoiceChat[j].headmodel, sizeof ( headModelVoiceChat[j].headmodel ), - "%s", headModelName); - headModelVoiceChat[j].voiceChatNum = i; - break; - } - } - return &voiceChatLists[i]; - } - } - } - // fall back to male gender because we don't have neuter in the mission pack - if (gender == GENDER_MALE) - break; - gender = GENDER_MALE; - } - // store this head model with voice chat for future reference - for ( j = 0; j < MAX_HEADMODELS; j++ ) { - if (!strlen(headModelVoiceChat[j].headmodel)) { - Com_sprintf(headModelVoiceChat[j].headmodel, sizeof ( headModelVoiceChat[j].headmodel ), - "%s", headModelName); - headModelVoiceChat[j].voiceChatNum = 0; - break; - } - } - // just return the first voice chat list - return &voiceChatLists[0]; -} - -#define MAX_VOICECHATBUFFER 32 - -typedef struct bufferedVoiceChat_s -{ - int clientNum; - sfxHandle_t snd; - int voiceOnly; - char cmd[MAX_SAY_TEXT]; - char message[MAX_SAY_TEXT]; -} bufferedVoiceChat_t; - -bufferedVoiceChat_t voiceChatBuffer[MAX_VOICECHATBUFFER]; - -/* -================= -CG_PlayVoiceChat -================= -*/ -void CG_PlayVoiceChat( bufferedVoiceChat_t *vchat ) { -#ifdef MISSIONPACK - // if we are going into the intermission, don't start any voices - if ( cg.intermissionStarted ) { - return; - } - - if ( !cg_noVoiceChats.integer ) { - trap_S_StartLocalSound( vchat->snd, CHAN_VOICE); - } - if (!vchat->voiceOnly && !cg_noVoiceText.integer) { - CG_AddToTeamChat( vchat->message ); - CG_Printf( "%s\n", vchat->message ); - } - voiceChatBuffer[cg.voiceChatBufferOut].snd = 0; -#endif -} - -/* -===================== -CG_PlayBufferedVoiceChats -===================== -*/ -void CG_PlayBufferedVoiceChats( void ) { -#ifdef MISSIONPACK - if ( voiceChatTime < cg.time ) { - if (voiceChatBufferOut != voiceChatBufferIn && voiceChatBuffer[voiceChatBufferOut].snd) { - // - CG_PlayVoiceChat(&voiceChatBuffer[voiceChatBufferOut]); - // - voiceChatBufferOut = (voiceChatBufferOut + 1) % MAX_VOICECHATBUFFER; - voiceChatTime = cg.time + 1000; - } - } -#endif -} - -/* -===================== -CG_AddBufferedVoiceChat -===================== -*/ -void CG_AddBufferedVoiceChat( bufferedVoiceChat_t *vchat ) { -#ifdef MISSIONPACK - // if we are going into the intermission, don't start any voices - if ( cg.intermissionStarted ) { - return; - } - - memcpy(&voiceChatBuffer[cg.voiceChatBufferIn], vchat, sizeof(bufferedVoiceChat_t)); - cg.voiceChatBufferIn = (cg.voiceChatBufferIn + 1) % MAX_VOICECHATBUFFER; - if (cg.voiceChatBufferIn == cg.voiceChatBufferOut) { - CG_PlayVoiceChat( &voiceChatBuffer[cg.voiceChatBufferOut] ); - cg.voiceChatBufferOut++; - } -#endif -} - -/* -================= -CG_VoiceChatLocal -================= -*/ -void CG_VoiceChatLocal( int mode, qboolean voiceOnly, int clientNum, int color, const char *cmd ) { -#ifdef MISSIONPACK - char *chat; - voiceChatList_t *voiceChatList; - clientInfo_t *ci; - sfxHandle_t snd; - bufferedVoiceChat_t vchat; - - // if we are going into the intermission, don't start any voices - if ( cg.intermissionStarted ) { - return; - } - - if ( clientNum < 0 || clientNum >= MAX_CLIENTS ) { - clientNum = 0; - } - ci = &cgs.clientinfo[ clientNum ]; - - cgs.currentVoiceClient = clientNum; - - voiceChatList = CG_VoiceChatListForClient( clientNum ); - - if ( CG_GetVoiceChat( voiceChatList, cmd, &snd, &chat ) ) { - // - if ( mode == SAY_TEAM || !cg_teamChatsOnly.integer ) { - vchat.clientNum = clientNum; - vchat.snd = snd; - vchat.voiceOnly = voiceOnly; - Q_strncpyz(vchat.cmd, cmd, sizeof(vchat.cmd)); - if ( mode == SAY_TELL ) { - Com_sprintf(vchat.message, sizeof(vchat.message), "[%s]: %c%c%s", ci->name, Q_COLOR_ESCAPE, color, chat); - } - else if ( mode == SAY_TEAM ) { - Com_sprintf(vchat.message, sizeof(vchat.message), "(%s): %c%c%s", ci->name, Q_COLOR_ESCAPE, color, chat); - } - else { - Com_sprintf(vchat.message, sizeof(vchat.message), "%s: %c%c%s", ci->name, Q_COLOR_ESCAPE, color, chat); - } - CG_AddBufferedVoiceChat(&vchat); - } - } -#endif -} - -/* -================= -CG_VoiceChat -================= -*/ -void CG_VoiceChat( int mode ) { -#ifdef MISSIONPACK - const char *cmd; - int clientNum, color; - qboolean voiceOnly; - - voiceOnly = atoi(CG_Argv(1)); - clientNum = atoi(CG_Argv(2)); - color = atoi(CG_Argv(3)); - cmd = CG_Argv(4); - - if (cg_noTaunt.integer != 0) { - /*if (!strcmp(cmd, VOICECHAT_KILLINSULT) || !strcmp(cmd, VOICECHAT_TAUNT) || \ - !strcmp(cmd, VOICECHAT_DEATHINSULT) || !strcmp(cmd, VOICECHAT_KILLGAUNTLET) || \ - !strcmp(cmd, VOICECHAT_PRAISE)) { - return; - }*/ - } - - CG_VoiceChatLocal( mode, voiceOnly, clientNum, color, cmd ); -#endif + trap_Cvar_Set( "cg_thirdPerson", "0" ); } /* @@ -933,16 +488,20 @@ void CG_VoiceChat( int mode ) { CG_RemoveChatEscapeChar ================= */ -static void CG_RemoveChatEscapeChar( char *text ) { +static void CG_RemoveChatEscapeChar( char *text ) +{ int i, l; l = 0; - for ( i = 0; text[i]; i++ ) { - if (text[i] == '\x19') + for( i = 0; text[ i ]; i++ ) + { + if( text[ i ] == '\x19' ) continue; - text[l++] = text[i]; + + text[ l++ ] = text[ i ]; } - text[l] = '\0'; + + text[ l ] = '\0'; } /* @@ -953,95 +512,95 @@ The string has been tokenized and can be retrieved with Cmd_Argc() / Cmd_Argv() ================= */ -static void CG_ServerCommand( void ) { +static void CG_ServerCommand( void ) +{ const char *cmd; - char text[MAX_SAY_TEXT]; + char text[ MAX_SAY_TEXT ]; - cmd = CG_Argv(0); + cmd = CG_Argv( 0 ); - if ( !cmd[0] ) { + if( !cmd[ 0 ] ) + { // server claimed the command return; } - if ( !strcmp( cmd, "cp" ) ) { - CG_CenterPrint( CG_Argv(1), SCREEN_HEIGHT * 0.30, BIGCHAR_WIDTH ); + if( !strcmp( cmd, "cp" ) ) + { + CG_CenterPrint( CG_Argv( 1 ), SCREEN_HEIGHT * 0.30, BIGCHAR_WIDTH ); return; } - if ( !strcmp( cmd, "cs" ) ) { - CG_ConfigStringModified(); + if( !strcmp( cmd, "cs" ) ) + { + CG_ConfigStringModified( ); return; } - if ( !strcmp( cmd, "print" ) ) { - CG_Printf( "%s", CG_Argv(1) ); + if( !strcmp( cmd, "print" ) ) + { + CG_Printf( "%s", CG_Argv( 1 ) ); return; } - if ( !strcmp( cmd, "chat" ) ) { - if ( !cg_teamChatsOnly.integer ) { + if( !strcmp( cmd, "chat" ) ) + { + if( !cg_teamChatsOnly.integer ) + { trap_S_StartLocalSound( cgs.media.talkSound, CHAN_LOCAL_SOUND ); - Q_strncpyz( text, CG_Argv(1), MAX_SAY_TEXT ); + Q_strncpyz( text, CG_Argv( 1 ), MAX_SAY_TEXT ); CG_RemoveChatEscapeChar( text ); CG_Printf( "%s\n", text ); } + return; } - if ( !strcmp( cmd, "tchat" ) ) { + if( !strcmp( cmd, "tchat" ) ) + { trap_S_StartLocalSound( cgs.media.talkSound, CHAN_LOCAL_SOUND ); - Q_strncpyz( text, CG_Argv(1), MAX_SAY_TEXT ); + Q_strncpyz( text, CG_Argv( 1 ), MAX_SAY_TEXT ); CG_RemoveChatEscapeChar( text ); CG_AddToTeamChat( text ); CG_Printf( "%s\n", text ); return; } - if ( !strcmp( cmd, "vchat" ) ) { - CG_VoiceChat( SAY_ALL ); - return; - } - - if ( !strcmp( cmd, "vtchat" ) ) { - CG_VoiceChat( SAY_TEAM ); - return; - } - - if ( !strcmp( cmd, "vtell" ) ) { - CG_VoiceChat( SAY_TELL ); + + if( !strcmp( cmd, "scores" ) ) + { + CG_ParseScores( ); return; } - if ( !strcmp( cmd, "scores" ) ) { - CG_ParseScores(); + if( !strcmp( cmd, "tinfo" ) ) + { + CG_ParseTeamInfo( ); return; } - if ( !strcmp( cmd, "tinfo" ) ) { - CG_ParseTeamInfo(); + if( !strcmp( cmd, "map_restart" ) ) + { + CG_MapRestart( ); return; } - if ( !strcmp( cmd, "map_restart" ) ) { - CG_MapRestart(); - return; + if( Q_stricmp( cmd, "remapShader" ) == 0 ) + { + if( trap_Argc( ) == 4 ) + trap_R_RemapShader( CG_Argv( 1 ), CG_Argv( 2 ), CG_Argv( 3 ) ); } -/* if ( Q_stricmp (cmd, "remapShader") == 0 ) { - if (trap_Argc() == 4) { - trap_R_RemapShader(CG_Argv(1), CG_Argv(2), CG_Argv(3)); - } - }*/ - // loaddeferred can be both a servercmd and a consolecmd - if ( !strcmp( cmd, "loaddefered" ) ) { // FIXME: spelled wrong, but not changing for demo - CG_LoadDeferredPlayers(); + if( !strcmp( cmd, "loaddefered" ) ) + { // FIXME: spelled wrong, but not changing for demo + CG_LoadDeferredPlayers( ); return; } // clientLevelShot is sent before taking a special screenshot for // the menu system during development - if ( !strcmp( cmd, "clientLevelShot" ) ) { + if( !strcmp( cmd, "clientLevelShot" ) ) + { cg.levelShot = qtrue; return; } @@ -1058,10 +617,11 @@ Execute all of the server commands that were received along with this this snapshot. ==================== */ -void CG_ExecuteNewServerCommands( int latestSequence ) { - while ( cgs.serverCommandSequence < latestSequence ) { - if ( trap_GetServerCommand( ++cgs.serverCommandSequence ) ) { - CG_ServerCommand(); - } +void CG_ExecuteNewServerCommands( int latestSequence ) +{ + while( cgs.serverCommandSequence < latestSequence ) + { + if( trap_GetServerCommand( ++cgs.serverCommandSequence ) ) + CG_ServerCommand( ); } } diff --git a/src/cgame/cg_snapshot.c b/src/cgame/cg_snapshot.c index 60520dc1..0e8103fb 100644 --- a/src/cgame/cg_snapshot.c +++ b/src/cgame/cg_snapshot.c @@ -18,27 +18,25 @@ #include "cg_local.h" - - /* ================== CG_ResetEntity ================== */ -static void CG_ResetEntity( centity_t *cent ) { +static void CG_ResetEntity( centity_t *cent ) +{ // if the previous snapshot this entity was updated in is at least // an event window back in time then we can reset the previous event - if ( cent->snapShotTime < cg.time - EVENT_VALID_MSEC ) { - cent->previousEvent = 0; - } + if( cent->snapShotTime < cg.time - EVENT_VALID_MSEC ) + cent->previousEvent = 0; - cent->trailTime = cg.snap->serverTime; + cent->trailTime = cg.snap->serverTime; - VectorCopy (cent->currentState.origin, cent->lerpOrigin); - VectorCopy (cent->currentState.angles, cent->lerpAngles); - if ( cent->currentState.eType == ET_PLAYER ) { - CG_ResetPlayerEntity( cent ); - } + VectorCopy( cent->currentState.origin, cent->lerpOrigin ); + VectorCopy( cent->currentState.angles, cent->lerpAngles ); + + if( cent->currentState.eType == ET_PLAYER ) + CG_ResetPlayerEntity( cent ); } /* @@ -48,20 +46,20 @@ CG_TransitionEntity cent->nextState is moved to cent->currentState and events are fired =============== */ -static void CG_TransitionEntity( centity_t *cent ) { - cent->currentState = cent->nextState; - cent->currentValid = qtrue; +static void CG_TransitionEntity( centity_t *cent ) +{ + cent->currentState = cent->nextState; + cent->currentValid = qtrue; - // reset if the entity wasn't in the last frame or was teleported - if ( !cent->interpolate ) { - CG_ResetEntity( cent ); - } + // reset if the entity wasn't in the last frame or was teleported + if( !cent->interpolate ) + CG_ResetEntity( cent ); - // clear the next state. if will be set by the next CG_SetNextSnap - cent->interpolate = qfalse; + // clear the next state. if will be set by the next CG_SetNextSnap + cent->interpolate = qfalse; - // check for events - CG_CheckEvents( cent ); + // check for events + CG_CheckEvents( cent ); } @@ -76,38 +74,40 @@ CG_TransitionSnapshot instead. FIXME: Also called by map_restart? ================== */ -void CG_SetInitialSnapshot( snapshot_t *snap ) { - int i; - centity_t *cent; - entityState_t *state; +void CG_SetInitialSnapshot( snapshot_t *snap ) +{ + int i; + centity_t *cent; + entityState_t *state; - cg.snap = snap; + cg.snap = snap; - BG_PlayerStateToEntityState( &snap->ps, &cg_entities[ snap->ps.clientNum ].currentState, qfalse ); + BG_PlayerStateToEntityState( &snap->ps, &cg_entities[ snap->ps.clientNum ].currentState, qfalse ); - // sort out solid entities - CG_BuildSolidList(); + // sort out solid entities + CG_BuildSolidList( ); - CG_ExecuteNewServerCommands( snap->serverCommandSequence ); + CG_ExecuteNewServerCommands( snap->serverCommandSequence ); - // set our local weapon selection pointer to - // what the server has indicated the current weapon is - CG_Respawn(); + // set our local weapon selection pointer to + // what the server has indicated the current weapon is + CG_Respawn( ); - for ( i = 0 ; i < cg.snap->numEntities ; i++ ) { - state = &cg.snap->entities[ i ]; - cent = &cg_entities[ state->number ]; + for( i = 0; i < cg.snap->numEntities; i++ ) + { + state = &cg.snap->entities[ i ]; + cent = &cg_entities[ state->number ]; - memcpy(¢->currentState, state, sizeof(entityState_t)); - //cent->currentState = *state; - cent->interpolate = qfalse; - cent->currentValid = qtrue; + memcpy( ¢->currentState, state, sizeof( entityState_t ) ); + //cent->currentState = *state; + cent->interpolate = qfalse; + cent->currentValid = qtrue; - CG_ResetEntity( cent ); + CG_ResetEntity( cent ); - // check for events - CG_CheckEvents( cent ); - } + // check for events + CG_CheckEvents( cent ); + } } @@ -118,68 +118,66 @@ CG_TransitionSnapshot The transition point from snap to nextSnap has passed =================== */ -static void CG_TransitionSnapshot( void ) { - centity_t *cent; - snapshot_t *oldFrame; - int i; - - if ( !cg.snap ) { - CG_Error( "CG_TransitionSnapshot: NULL cg.snap" ); - } - if ( !cg.nextSnap ) { - CG_Error( "CG_TransitionSnapshot: NULL cg.nextSnap" ); - } - - // execute any server string commands before transitioning entities - CG_ExecuteNewServerCommands( cg.nextSnap->serverCommandSequence ); - - // if we had a map_restart, set everthing with initial - if ( !cg.snap ) { - } - - // clear the currentValid flag for all entities in the existing snapshot - for ( i = 0 ; i < cg.snap->numEntities ; i++ ) { - cent = &cg_entities[ cg.snap->entities[ i ].number ]; - cent->currentValid = qfalse; - } - - // move nextSnap to snap and do the transitions - oldFrame = cg.snap; - cg.snap = cg.nextSnap; - - BG_PlayerStateToEntityState( &cg.snap->ps, &cg_entities[ cg.snap->ps.clientNum ].currentState, qfalse ); - cg_entities[ cg.snap->ps.clientNum ].interpolate = qfalse; - - for ( i = 0 ; i < cg.snap->numEntities ; i++ ) { - cent = &cg_entities[ cg.snap->entities[ i ].number ]; - CG_TransitionEntity( cent ); +static void CG_TransitionSnapshot( void ) +{ + centity_t *cent; + snapshot_t *oldFrame; + int i; + + if( !cg.snap ) + CG_Error( "CG_TransitionSnapshot: NULL cg.snap" ); + + if( !cg.nextSnap ) + CG_Error( "CG_TransitionSnapshot: NULL cg.nextSnap" ); + + // execute any server string commands before transitioning entities + CG_ExecuteNewServerCommands( cg.nextSnap->serverCommandSequence ); + + // if we had a map_restart, set everthing with initial + if( !cg.snap ) { } //TA: ? + + // clear the currentValid flag for all entities in the existing snapshot + for( i = 0; i < cg.snap->numEntities; i++ ) + { + cent = &cg_entities[ cg.snap->entities[ i ].number ]; + cent->currentValid = qfalse; + } + + // move nextSnap to snap and do the transitions + oldFrame = cg.snap; + cg.snap = cg.nextSnap; + + BG_PlayerStateToEntityState( &cg.snap->ps, &cg_entities[ cg.snap->ps.clientNum ].currentState, qfalse ); + cg_entities[ cg.snap->ps.clientNum ].interpolate = qfalse; + + for( i = 0; i < cg.snap->numEntities; i++ ) + { + cent = &cg_entities[ cg.snap->entities[ i ].number ]; + CG_TransitionEntity( cent ); // remember time of snapshot this entity was last updated in cent->snapShotTime = cg.snap->serverTime; - } - - cg.nextSnap = NULL; - - // check for playerstate transition events - if ( oldFrame ) { - playerState_t *ops, *ps; + } - ops = &oldFrame->ps; - ps = &cg.snap->ps; - // teleporting checks are irrespective of prediction - if ( ( ps->eFlags ^ ops->eFlags ) & EF_TELEPORT_BIT ) { - cg.thisFrameTeleport = qtrue; // will be cleared by prediction code - } + cg.nextSnap = NULL; - // if we are not doing client side movement prediction for any - // reason, then the client events and view changes will be issued now - if ( cg.demoPlayback || (cg.snap->ps.pm_flags & PMF_FOLLOW) - || cg_nopredict.integer || cg_synchronousClients.integer ) { - CG_TransitionPlayerState( ps, ops ); - } + // check for playerstate transition events + if( oldFrame ) + { + playerState_t *ops, *ps; - } + ops = &oldFrame->ps; + ps = &cg.snap->ps; + // teleporting checks are irrespective of prediction + if( ( ps->eFlags ^ ops->eFlags ) & EF_TELEPORT_BIT ) + cg.thisFrameTeleport = qtrue; // will be cleared by prediction code + // if we are not doing client side movement prediction for any + // reason, then the client events and view changes will be issued now + if( cg.demoPlayback || ( cg.snap->ps.pm_flags & PMF_FOLLOW ) || + cg_nopredict.integer || cg_synchronousClients.integer ) + CG_TransitionPlayerState( ps, ops ); + } } @@ -190,53 +188,51 @@ CG_SetNextSnap A new snapshot has just been read in from the client system. =================== */ -static void CG_SetNextSnap( snapshot_t *snap ) { - int num; - entityState_t *es; - centity_t *cent; - - cg.nextSnap = snap; - - BG_PlayerStateToEntityState( &snap->ps, &cg_entities[ snap->ps.clientNum ].nextState, qfalse ); - cg_entities[ cg.snap->ps.clientNum ].interpolate = qtrue; - - // check for extrapolation errors - for ( num = 0 ; num < snap->numEntities ; num++ ) { - es = &snap->entities[num]; - cent = &cg_entities[ es->number ]; - - memcpy(¢->nextState, es, sizeof(entityState_t)); - //cent->nextState = *es; - - // if this frame is a teleport, or the entity wasn't in the - // previous frame, don't interpolate - if ( !cent->currentValid || ( ( cent->currentState.eFlags ^ es->eFlags ) & EF_TELEPORT_BIT ) ) { - cent->interpolate = qfalse; - } else { - cent->interpolate = qtrue; - } - } - - // if the next frame is a teleport for the playerstate, we - // can't interpolate during demos - if ( cg.snap && ( ( snap->ps.eFlags ^ cg.snap->ps.eFlags ) & EF_TELEPORT_BIT ) ) { - cg.nextFrameTeleport = qtrue; - } else { - cg.nextFrameTeleport = qfalse; - } - - // if changing follow mode, don't interpolate - if ( cg.nextSnap->ps.clientNum != cg.snap->ps.clientNum ) { - cg.nextFrameTeleport = qtrue; - } - - // if changing server restarts, don't interpolate - if ( ( cg.nextSnap->snapFlags ^ cg.snap->snapFlags ) & SNAPFLAG_SERVERCOUNT ) { - cg.nextFrameTeleport = qtrue; - } - - // sort out solid entities - CG_BuildSolidList(); +static void CG_SetNextSnap( snapshot_t *snap ) +{ + int num; + entityState_t *es; + centity_t *cent; + + cg.nextSnap = snap; + + BG_PlayerStateToEntityState( &snap->ps, &cg_entities[ snap->ps.clientNum ].nextState, qfalse ); + cg_entities[ cg.snap->ps.clientNum ].interpolate = qtrue; + + // check for extrapolation errors + for( num = 0 ; num < snap->numEntities ; num++ ) + { + es = &snap->entities[ num ]; + cent = &cg_entities[ es->number ]; + + memcpy( ¢->nextState, es, sizeof( entityState_t ) ); + //cent->nextState = *es; + + // if this frame is a teleport, or the entity wasn't in the + // previous frame, don't interpolate + if( !cent->currentValid || ( ( cent->currentState.eFlags ^ es->eFlags ) & EF_TELEPORT_BIT ) ) + cent->interpolate = qfalse; + else + cent->interpolate = qtrue; + } + + // if the next frame is a teleport for the playerstate, we + // can't interpolate during demos + if( cg.snap && ( ( snap->ps.eFlags ^ cg.snap->ps.eFlags ) & EF_TELEPORT_BIT ) ) + cg.nextFrameTeleport = qtrue; + else + cg.nextFrameTeleport = qfalse; + + // if changing follow mode, don't interpolate + if( cg.nextSnap->ps.clientNum != cg.snap->ps.clientNum ) + cg.nextFrameTeleport = qtrue; + + // if changing server restarts, don't interpolate + if( ( cg.nextSnap->snapFlags ^ cg.snap->snapFlags ) & SNAPFLAG_SERVERCOUNT ) + cg.nextFrameTeleport = qtrue; + + // sort out solid entities + CG_BuildSolidList( ); } @@ -250,52 +246,56 @@ times if the client system fails to return a valid snapshot. ======================== */ -static snapshot_t *CG_ReadNextSnapshot( void ) { - qboolean r; - snapshot_t *dest; +static snapshot_t *CG_ReadNextSnapshot( void ) +{ + qboolean r; + snapshot_t *dest; - if ( cg.latestSnapshotNum > cgs.processedSnapshotNum + 1000 ) { + if( cg.latestSnapshotNum > cgs.processedSnapshotNum + 1000 ) + { CG_Printf( "WARNING: CG_ReadNextSnapshot: way out of range, %i > %i", - cg.latestSnapshotNum, cgs.processedSnapshotNum ); - } + cg.latestSnapshotNum, cgs.processedSnapshotNum ); + } - while ( cgs.processedSnapshotNum < cg.latestSnapshotNum ) { - // decide which of the two slots to load it into - if ( cg.snap == &cg.activeSnapshots[0] ) { - dest = &cg.activeSnapshots[1]; - } else { - dest = &cg.activeSnapshots[0]; - } + while( cgs.processedSnapshotNum < cg.latestSnapshotNum ) + { + // decide which of the two slots to load it into + if( cg.snap == &cg.activeSnapshots[ 0 ] ) + dest = &cg.activeSnapshots[ 1 ]; + else + dest = &cg.activeSnapshots[ 0 ]; - // try to read the snapshot from the client system - cgs.processedSnapshotNum++; - r = trap_GetSnapshot( cgs.processedSnapshotNum, dest ); + // try to read the snapshot from the client system + cgs.processedSnapshotNum++; + r = trap_GetSnapshot( cgs.processedSnapshotNum, dest ); // FIXME: why would trap_GetSnapshot return a snapshot with the same server time - if ( cg.snap && r && dest->serverTime == cg.snap->serverTime ) { + if( cg.snap && r && dest->serverTime == cg.snap->serverTime ) + { //continue; } - // if it succeeded, return - if ( r ) { - CG_AddLagometerSnapshotInfo( dest ); - return dest; - } - - // a GetSnapshot will return failure if the snapshot - // never arrived, or is so old that its entities - // have been shoved off the end of the circular - // buffer in the client system. - - // record as a dropped packet - CG_AddLagometerSnapshotInfo( NULL ); - - // If there are additional snapshots, continue trying to - // read them. - } - - // nothing left to read - return NULL; + // if it succeeded, return + if( r ) + { + CG_AddLagometerSnapshotInfo( dest ); + return dest; + } + + // a GetSnapshot will return failure if the snapshot + // never arrived, or is so old that its entities + // have been shoved off the end of the circular + // buffer in the client system. + + // record as a dropped packet + CG_AddLagometerSnapshotInfo( NULL ); + + // If there are additional snapshots, continue trying to + // read them. + } + + // nothing left to read + return NULL; } @@ -318,79 +318,85 @@ of an interpolating one) ============ */ -void CG_ProcessSnapshots( void ) { - snapshot_t *snap; - int n; - - // see what the latest snapshot the client system has is - trap_GetCurrentSnapshotNumber( &n, &cg.latestSnapshotTime ); - if ( n != cg.latestSnapshotNum ) { - if ( n < cg.latestSnapshotNum ) { - // this should never happen - CG_Error( "CG_ProcessSnapshots: n < cg.latestSnapshotNum" ); - } - cg.latestSnapshotNum = n; - } - - // If we have yet to receive a snapshot, check for it. - // Once we have gotten the first snapshot, cg.snap will - // always have valid data for the rest of the game - while ( !cg.snap ) { - snap = CG_ReadNextSnapshot(); - if ( !snap ) { - // we can't continue until we get a snapshot - return; - } - - // set our weapon selection to what - // the playerstate is currently using - if ( !( snap->snapFlags & SNAPFLAG_NOT_ACTIVE ) ) { - CG_SetInitialSnapshot( snap ); - } - } - - // loop until we either have a valid nextSnap with a serverTime - // greater than cg.time to interpolate towards, or we run - // out of available snapshots - do { - // if we don't have a nextframe, try and read a new one in - if ( !cg.nextSnap ) { - snap = CG_ReadNextSnapshot(); - - // if we still don't have a nextframe, we will just have to - // extrapolate - if ( !snap ) { - break; - } - - CG_SetNextSnap( snap ); - - // if time went backwards, we have a level restart - if ( cg.nextSnap->serverTime < cg.snap->serverTime ) { - CG_Error( "CG_ProcessSnapshots: Server time went backwards" ); - } - } - - // if our time is < nextFrame's, we have a nice interpolating state - if ( cg.time >= cg.snap->serverTime && cg.time < cg.nextSnap->serverTime ) { - break; - } - - // we have passed the transition from nextFrame to frame - CG_TransitionSnapshot(); - } while ( 1 ); - - // assert our valid conditions upon exiting - if ( cg.snap == NULL ) { - CG_Error( "CG_ProcessSnapshots: cg.snap == NULL" ); - } - if ( cg.time < cg.snap->serverTime ) { - // this can happen right after a vid_restart - cg.time = cg.snap->serverTime; - } - if ( cg.nextSnap != NULL && cg.nextSnap->serverTime <= cg.time ) { - CG_Error( "CG_ProcessSnapshots: cg.nextSnap->serverTime <= cg.time" ); - } +void CG_ProcessSnapshots( void ) +{ + snapshot_t *snap; + int n; + + // see what the latest snapshot the client system has is + trap_GetCurrentSnapshotNumber( &n, &cg.latestSnapshotTime ); + + if( n != cg.latestSnapshotNum ) + { + if( n < cg.latestSnapshotNum ) + { + // this should never happen + CG_Error( "CG_ProcessSnapshots: n < cg.latestSnapshotNum" ); + } + + cg.latestSnapshotNum = n; + } + // If we have yet to receive a snapshot, check for it. + // Once we have gotten the first snapshot, cg.snap will + // always have valid data for the rest of the game + while( !cg.snap ) + { + snap = CG_ReadNextSnapshot( ); + + if( !snap ) + { + // we can't continue until we get a snapshot + return; + } + + // set our weapon selection to what + // the playerstate is currently using + if( !( snap->snapFlags & SNAPFLAG_NOT_ACTIVE ) ) + CG_SetInitialSnapshot( snap ); + } + + // loop until we either have a valid nextSnap with a serverTime + // greater than cg.time to interpolate towards, or we run + // out of available snapshots + do + { + // if we don't have a nextframe, try and read a new one in + if( !cg.nextSnap ) + { + snap = CG_ReadNextSnapshot( ); + + // if we still don't have a nextframe, we will just have to + // extrapolate + if( !snap ) + break; + + CG_SetNextSnap( snap ); + + // if time went backwards, we have a level restart + if( cg.nextSnap->serverTime < cg.snap->serverTime ) + CG_Error( "CG_ProcessSnapshots: Server time went backwards" ); + } + + // if our time is < nextFrame's, we have a nice interpolating state + if( cg.time >= cg.snap->serverTime && cg.time < cg.nextSnap->serverTime ) + break; + + // we have passed the transition from nextFrame to frame + CG_TransitionSnapshot( ); + } while( 1 ); + + // assert our valid conditions upon exiting + if( cg.snap == NULL ) + CG_Error( "CG_ProcessSnapshots: cg.snap == NULL" ); + + if( cg.time < cg.snap->serverTime ) + { + // this can happen right after a vid_restart + cg.time = cg.snap->serverTime; + } + + if( cg.nextSnap != NULL && cg.nextSnap->serverTime <= cg.time ) + CG_Error( "CG_ProcessSnapshots: cg.nextSnap->serverTime <= cg.time" ); } diff --git a/src/cgame/cg_syscalls.asm b/src/cgame/cg_syscalls.asm index 3f26c6dd..6cc032f8 100644 --- a/src/cgame/cg_syscalls.asm +++ b/src/cgame/cg_syscalls.asm @@ -1,104 +1,104 @@ code -equ trap_Print -1 -equ trap_Error -2 -equ trap_Milliseconds -3 -equ trap_Cvar_Register -4 -equ trap_Cvar_Update -5 -equ trap_Cvar_Set -6 -equ trap_Cvar_VariableStringBuffer -7 -equ trap_Argc -8 -equ trap_Argv -9 -equ trap_Args -10 -equ trap_FS_FOpenFile -11 -equ trap_FS_Read -12 -equ trap_FS_Write -13 -equ trap_FS_FCloseFile -14 -equ trap_SendConsoleCommand -15 -equ trap_AddCommand -16 -equ trap_SendClientCommand -17 -equ trap_UpdateScreen -18 -equ trap_CM_LoadMap -19 -equ trap_CM_NumInlineModels -20 -equ trap_CM_InlineModel -21 -equ trap_CM_LoadModel -22 -equ trap_CM_TempBoxModel -23 -equ trap_CM_PointContents -24 -equ trap_CM_TransformedPointContents -25 -equ trap_CM_BoxTrace -26 -equ trap_CM_TransformedBoxTrace -27 -equ trap_CM_MarkFragments -28 -equ trap_S_StartSound -29 -equ trap_S_StartLocalSound -30 -equ trap_S_ClearLoopingSounds -31 -equ trap_S_AddLoopingSound -32 -equ trap_S_UpdateEntityPosition -33 -equ trap_S_Respatialize -34 -equ trap_S_RegisterSound -35 -equ trap_S_StartBackgroundTrack -36 -equ trap_R_LoadWorldMap -37 -equ trap_R_RegisterModel -38 -equ trap_R_RegisterSkin -39 -equ trap_R_RegisterShader -40 -equ trap_R_ClearScene -41 -equ trap_R_AddRefEntityToScene -42 -equ trap_R_AddPolyToScene -43 -equ trap_R_AddLightToScene -44 -equ trap_R_RenderScene -45 -equ trap_R_SetColor -46 -equ trap_R_DrawStretchPic -47 -equ trap_R_ModelBounds -48 -equ trap_R_LerpTag -49 -equ trap_GetGlconfig -50 -equ trap_GetGameState -51 -equ trap_GetCurrentSnapshotNumber -52 -equ trap_GetSnapshot -53 -equ trap_GetServerCommand -54 -equ trap_GetCurrentCmdNumber -55 -equ trap_GetUserCmd -56 -equ trap_SetUserCmdValue -57 -equ trap_R_RegisterShaderNoMip -58 -equ trap_MemoryRemaining -59 -equ trap_R_RegisterFont -60 -equ trap_Key_IsDown -61 -equ trap_Key_GetCatcher -62 -equ trap_Key_SetCatcher -63 -equ trap_Key_GetKey -64 -equ trap_PC_AddGlobalDefine -65 -equ trap_PC_LoadSource -66 -equ trap_PC_FreeSource -67 -equ trap_PC_ReadToken -68 -equ trap_PC_SourceFileAndLine -69 -equ trap_S_StopBackgroundTrack -70 -equ trap_RealTime -71 -equ trap_SnapVector -72 -equ trap_RemoveCommand -73 -equ trap_R_LightForPoint -74 -equ trap_CIN_PlayCinematic -75 -equ trap_CIN_StopCinematic -76 -equ trap_CIN_RunCinematic -77 -equ trap_CIN_DrawCinematic -78 -equ trap_CIN_SetExtents -79 -equ trap_R_RemapShader -80 -equ trap_S_AddRealLoopingSound -81 -equ trap_S_StopLoopingSound -82 -equ trap_CM_TempCapsuleModel -83 -equ trap_CM_CapsuleTrace -84 +equ trap_Print -1 +equ trap_Error -2 +equ trap_Milliseconds -3 +equ trap_Cvar_Register -4 +equ trap_Cvar_Update -5 +equ trap_Cvar_Set -6 +equ trap_Cvar_VariableStringBuffer -7 +equ trap_Argc -8 +equ trap_Argv -9 +equ trap_Args -10 +equ trap_FS_FOpenFile -11 +equ trap_FS_Read -12 +equ trap_FS_Write -13 +equ trap_FS_FCloseFile -14 +equ trap_SendConsoleCommand -15 +equ trap_AddCommand -16 +equ trap_SendClientCommand -17 +equ trap_UpdateScreen -18 +equ trap_CM_LoadMap -19 +equ trap_CM_NumInlineModels -20 +equ trap_CM_InlineModel -21 +equ trap_CM_LoadModel -22 +equ trap_CM_TempBoxModel -23 +equ trap_CM_PointContents -24 +equ trap_CM_TransformedPointContents -25 +equ trap_CM_BoxTrace -26 +equ trap_CM_TransformedBoxTrace -27 +equ trap_CM_MarkFragments -28 +equ trap_S_StartSound -29 +equ trap_S_StartLocalSound -30 +equ trap_S_ClearLoopingSounds -31 +equ trap_S_AddLoopingSound -32 +equ trap_S_UpdateEntityPosition -33 +equ trap_S_Respatialize -34 +equ trap_S_RegisterSound -35 +equ trap_S_StartBackgroundTrack -36 +equ trap_R_LoadWorldMap -37 +equ trap_R_RegisterModel -38 +equ trap_R_RegisterSkin -39 +equ trap_R_RegisterShader -40 +equ trap_R_ClearScene -41 +equ trap_R_AddRefEntityToScene -42 +equ trap_R_AddPolyToScene -43 +equ trap_R_AddLightToScene -44 +equ trap_R_RenderScene -45 +equ trap_R_SetColor -46 +equ trap_R_DrawStretchPic -47 +equ trap_R_ModelBounds -48 +equ trap_R_LerpTag -49 +equ trap_GetGlconfig -50 +equ trap_GetGameState -51 +equ trap_GetCurrentSnapshotNumber -52 +equ trap_GetSnapshot -53 +equ trap_GetServerCommand -54 +equ trap_GetCurrentCmdNumber -55 +equ trap_GetUserCmd -56 +equ trap_SetUserCmdValue -57 +equ trap_R_RegisterShaderNoMip -58 +equ trap_MemoryRemaining -59 +equ trap_R_RegisterFont -60 +equ trap_Key_IsDown -61 +equ trap_Key_GetCatcher -62 +equ trap_Key_SetCatcher -63 +equ trap_Key_GetKey -64 +equ trap_PC_AddGlobalDefine -65 +equ trap_PC_LoadSource -66 +equ trap_PC_FreeSource -67 +equ trap_PC_ReadToken -68 +equ trap_PC_SourceFileAndLine -69 +equ trap_S_StopBackgroundTrack -70 +equ trap_RealTime -71 +equ trap_SnapVector -72 +equ trap_RemoveCommand -73 +equ trap_R_LightForPoint -74 +equ trap_CIN_PlayCinematic -75 +equ trap_CIN_StopCinematic -76 +equ trap_CIN_RunCinematic -77 +equ trap_CIN_DrawCinematic -78 +equ trap_CIN_SetExtents -79 +equ trap_R_RemapShader -80 +equ trap_S_AddRealLoopingSound -81 +equ trap_S_StopLoopingSound -82 +equ trap_CM_TempCapsuleModel -83 +equ trap_CM_CapsuleTrace -84 equ trap_CM_TransformedCapsuleTrace -85 equ trap_R_AddAdditiveLightToScene -86 -equ trap_GetEntityToken -87 -equ trap_R_AddPolysToScene -88 -equ trap_R_inPVS -89 +equ trap_GetEntityToken -87 +equ trap_R_AddPolysToScene -88 +equ trap_R_inPVS -89 -equ memset -101 -equ memcpy -102 -equ strncpy -103 -equ sin -104 -equ cos -105 -equ atan2 -106 -equ sqrt -107 -equ floor -108 -equ ceil -109 -equ testPrintInt -110 -equ testPrintFloat -111 +equ memset -101 +equ memcpy -102 +equ strncpy -103 +equ sin -104 +equ cos -105 +equ atan2 -106 +equ sqrt -107 +equ floor -108 +equ ceil -109 +equ testPrintInt -110 +equ testPrintFloat -111 diff --git a/src/cgame/cg_syscalls.c b/src/cgame/cg_syscalls.c index 517314d0..f5383a9d 100644 --- a/src/cgame/cg_syscalls.c +++ b/src/cgame/cg_syscalls.c @@ -21,390 +21,482 @@ static int (QDECL *syscall)( int arg, ... ) = (int (QDECL *)( int, ...))-1; -void dllEntry( int (QDECL *syscallptr)( int arg,... ) ) { - syscall = syscallptr; +void dllEntry( int (QDECL *syscallptr)( int arg,... ) ) +{ + syscall = syscallptr; } -int PASSFLOAT( float x ) { - float floatTemp; - floatTemp = x; - return *(int *)&floatTemp; +int PASSFLOAT( float x ) +{ + float floatTemp; + floatTemp = x; + return *(int *)&floatTemp; } -void trap_Print( const char *fmt ) { - syscall( CG_PRINT, fmt ); +void trap_Print( const char *fmt ) +{ + syscall( CG_PRINT, fmt ); } -void trap_Error( const char *fmt ) { - syscall( CG_ERROR, fmt ); +void trap_Error( const char *fmt ) +{ + syscall( CG_ERROR, fmt ); } -int trap_Milliseconds( void ) { - return syscall( CG_MILLISECONDS ); +int trap_Milliseconds( void ) +{ + return syscall( CG_MILLISECONDS ); } -void trap_Cvar_Register( vmCvar_t *vmCvar, const char *varName, const char *defaultValue, int flags ) { - syscall( CG_CVAR_REGISTER, vmCvar, varName, defaultValue, flags ); +void trap_Cvar_Register( vmCvar_t *vmCvar, const char *varName, const char *defaultValue, int flags ) +{ + syscall( CG_CVAR_REGISTER, vmCvar, varName, defaultValue, flags ); } -void trap_Cvar_Update( vmCvar_t *vmCvar ) { - syscall( CG_CVAR_UPDATE, vmCvar ); +void trap_Cvar_Update( vmCvar_t *vmCvar ) +{ + syscall( CG_CVAR_UPDATE, vmCvar ); } -void trap_Cvar_Set( const char *var_name, const char *value ) { - syscall( CG_CVAR_SET, var_name, value ); +void trap_Cvar_Set( const char *var_name, const char *value ) +{ + syscall( CG_CVAR_SET, var_name, value ); } -void trap_Cvar_VariableStringBuffer( const char *var_name, char *buffer, int bufsize ) { - syscall( CG_CVAR_VARIABLESTRINGBUFFER, var_name, buffer, bufsize ); +void trap_Cvar_VariableStringBuffer( const char *var_name, char *buffer, int bufsize ) +{ + syscall( CG_CVAR_VARIABLESTRINGBUFFER, var_name, buffer, bufsize ); } -int trap_Argc( void ) { - return syscall( CG_ARGC ); +int trap_Argc( void ) +{ + return syscall( CG_ARGC ); } -void trap_Argv( int n, char *buffer, int bufferLength ) { - syscall( CG_ARGV, n, buffer, bufferLength ); +void trap_Argv( int n, char *buffer, int bufferLength ) +{ + syscall( CG_ARGV, n, buffer, bufferLength ); } -void trap_Args( char *buffer, int bufferLength ) { - syscall( CG_ARGS, buffer, bufferLength ); +void trap_Args( char *buffer, int bufferLength ) +{ + syscall( CG_ARGS, buffer, bufferLength ); } -int trap_FS_FOpenFile( const char *qpath, fileHandle_t *f, fsMode_t mode ) { - return syscall( CG_FS_FOPENFILE, qpath, f, mode ); +int trap_FS_FOpenFile( const char *qpath, fileHandle_t *f, fsMode_t mode ) +{ + return syscall( CG_FS_FOPENFILE, qpath, f, mode ); } -void trap_FS_Read( void *buffer, int len, fileHandle_t f ) { - syscall( CG_FS_READ, buffer, len, f ); +void trap_FS_Read( void *buffer, int len, fileHandle_t f ) +{ + syscall( CG_FS_READ, buffer, len, f ); } -void trap_FS_Write( const void *buffer, int len, fileHandle_t f ) { - syscall( CG_FS_WRITE, buffer, len, f ); +void trap_FS_Write( const void *buffer, int len, fileHandle_t f ) +{ + syscall( CG_FS_WRITE, buffer, len, f ); } -void trap_FS_FCloseFile( fileHandle_t f ) { - syscall( CG_FS_FCLOSEFILE, f ); +void trap_FS_FCloseFile( fileHandle_t f ) +{ + syscall( CG_FS_FCLOSEFILE, f ); } -void trap_SendConsoleCommand( const char *text ) { - syscall( CG_SENDCONSOLECOMMAND, text ); +void trap_SendConsoleCommand( const char *text ) +{ + syscall( CG_SENDCONSOLECOMMAND, text ); } -void trap_AddCommand( const char *cmdName ) { - syscall( CG_ADDCOMMAND, cmdName ); +void trap_AddCommand( const char *cmdName ) +{ + syscall( CG_ADDCOMMAND, cmdName ); } -void trap_RemoveCommand( const char *cmdName ) { +void trap_RemoveCommand( const char *cmdName ) +{ syscall( CG_REMOVECOMMAND, cmdName ); } -void trap_SendClientCommand( const char *s ) { - syscall( CG_SENDCLIENTCOMMAND, s ); +void trap_SendClientCommand( const char *s ) +{ + syscall( CG_SENDCLIENTCOMMAND, s ); } -void trap_UpdateScreen( void ) { - syscall( CG_UPDATESCREEN ); +void trap_UpdateScreen( void ) +{ + syscall( CG_UPDATESCREEN ); } -void trap_CM_LoadMap( const char *mapname ) { - syscall( CG_CM_LOADMAP, mapname ); +void trap_CM_LoadMap( const char *mapname ) +{ + syscall( CG_CM_LOADMAP, mapname ); } -int trap_CM_NumInlineModels( void ) { - return syscall( CG_CM_NUMINLINEMODELS ); +int trap_CM_NumInlineModels( void ) +{ + return syscall( CG_CM_NUMINLINEMODELS ); } -clipHandle_t trap_CM_InlineModel( int index ) { - return syscall( CG_CM_INLINEMODEL, index ); +clipHandle_t trap_CM_InlineModel( int index ) +{ + return syscall( CG_CM_INLINEMODEL, index ); } -clipHandle_t trap_CM_TempBoxModel( const vec3_t mins, const vec3_t maxs ) { - return syscall( CG_CM_TEMPBOXMODEL, mins, maxs ); +clipHandle_t trap_CM_TempBoxModel( const vec3_t mins, const vec3_t maxs ) +{ + return syscall( CG_CM_TEMPBOXMODEL, mins, maxs ); } -clipHandle_t trap_CM_TempCapsuleModel( const vec3_t mins, const vec3_t maxs ) { +clipHandle_t trap_CM_TempCapsuleModel( const vec3_t mins, const vec3_t maxs ) +{ return syscall( CG_CM_TEMPCAPSULEMODEL, mins, maxs ); } -int trap_CM_PointContents( const vec3_t p, clipHandle_t model ) { - return syscall( CG_CM_POINTCONTENTS, p, model ); +int trap_CM_PointContents( const vec3_t p, clipHandle_t model ) +{ + return syscall( CG_CM_POINTCONTENTS, p, model ); } -int trap_CM_TransformedPointContents( const vec3_t p, clipHandle_t model, const vec3_t origin, const vec3_t angles ) { - return syscall( CG_CM_TRANSFORMEDPOINTCONTENTS, p, model, origin, angles ); +int trap_CM_TransformedPointContents( const vec3_t p, clipHandle_t model, const vec3_t origin, + const vec3_t angles ) +{ + return syscall( CG_CM_TRANSFORMEDPOINTCONTENTS, p, model, origin, angles ); } -void trap_CM_BoxTrace( trace_t *results, const vec3_t start, const vec3_t end, - const vec3_t mins, const vec3_t maxs, - clipHandle_t model, int brushmask ) { - syscall( CG_CM_BOXTRACE, results, start, end, mins, maxs, model, brushmask ); +void trap_CM_BoxTrace( trace_t *results, const vec3_t start, const vec3_t end, + const vec3_t mins, const vec3_t maxs, + clipHandle_t model, int brushmask ) +{ + syscall( CG_CM_BOXTRACE, results, start, end, mins, maxs, model, brushmask ); } void trap_CM_CapsuleTrace( trace_t *results, const vec3_t start, const vec3_t end, const vec3_t mins, const vec3_t maxs, - clipHandle_t model, int brushmask ) { + clipHandle_t model, int brushmask ) +{ syscall( CG_CM_CAPSULETRACE, results, start, end, mins, maxs, model, brushmask ); } -void trap_CM_TransformedBoxTrace( trace_t *results, const vec3_t start, const vec3_t end, - const vec3_t mins, const vec3_t maxs, - clipHandle_t model, int brushmask, - const vec3_t origin, const vec3_t angles ) { - syscall( CG_CM_TRANSFORMEDBOXTRACE, results, start, end, mins, maxs, model, brushmask, origin, angles ); +void trap_CM_TransformedBoxTrace( trace_t *results, const vec3_t start, const vec3_t end, + const vec3_t mins, const vec3_t maxs, + clipHandle_t model, int brushmask, + const vec3_t origin, const vec3_t angles ) +{ + syscall( CG_CM_TRANSFORMEDBOXTRACE, results, start, end, mins, maxs, model, brushmask, origin, angles ); } void trap_CM_TransformedCapsuleTrace( trace_t *results, const vec3_t start, const vec3_t end, const vec3_t mins, const vec3_t maxs, clipHandle_t model, int brushmask, - const vec3_t origin, const vec3_t angles ) { + const vec3_t origin, const vec3_t angles ) +{ syscall( CG_CM_TRANSFORMEDCAPSULETRACE, results, start, end, mins, maxs, model, brushmask, origin, angles ); } -int trap_CM_MarkFragments( int numPoints, const vec3_t *points, - const vec3_t projection, - int maxPoints, vec3_t pointBuffer, - int maxFragments, markFragment_t *fragmentBuffer ) { - return syscall( CG_CM_MARKFRAGMENTS, numPoints, points, projection, maxPoints, pointBuffer, maxFragments, fragmentBuffer ); +int trap_CM_MarkFragments( int numPoints, const vec3_t *points, + const vec3_t projection, + int maxPoints, vec3_t pointBuffer, + int maxFragments, markFragment_t *fragmentBuffer ) +{ + return syscall( CG_CM_MARKFRAGMENTS, numPoints, points, projection, maxPoints, + pointBuffer, maxFragments, fragmentBuffer ); } -void trap_S_StartSound( vec3_t origin, int entityNum, int entchannel, sfxHandle_t sfx ) { - syscall( CG_S_STARTSOUND, origin, entityNum, entchannel, sfx ); +void trap_S_StartSound( vec3_t origin, int entityNum, int entchannel, sfxHandle_t sfx ) +{ + syscall( CG_S_STARTSOUND, origin, entityNum, entchannel, sfx ); } -void trap_S_StartLocalSound( sfxHandle_t sfx, int channelNum ) { +void trap_S_StartLocalSound( sfxHandle_t sfx, int channelNum ) +{ syscall( CG_S_STARTLOCALSOUND, sfx, channelNum ); } -void trap_S_ClearLoopingSounds( qboolean killall ) { +void trap_S_ClearLoopingSounds( qboolean killall ) +{ syscall( CG_S_CLEARLOOPINGSOUNDS, killall ); } -void trap_S_AddLoopingSound( int entityNum, const vec3_t origin, const vec3_t velocity, sfxHandle_t sfx ) { - syscall( CG_S_ADDLOOPINGSOUND, entityNum, origin, velocity, sfx ); +void trap_S_AddLoopingSound( int entityNum, const vec3_t origin, const vec3_t velocity, sfxHandle_t sfx ) +{ + syscall( CG_S_ADDLOOPINGSOUND, entityNum, origin, velocity, sfx ); } -void trap_S_AddRealLoopingSound( int entityNum, const vec3_t origin, const vec3_t velocity, sfxHandle_t sfx ) { +void trap_S_AddRealLoopingSound( int entityNum, const vec3_t origin, const vec3_t velocity, sfxHandle_t sfx ) +{ syscall( CG_S_ADDREALLOOPINGSOUND, entityNum, origin, velocity, sfx ); } -void trap_S_StopLoopingSound( int entityNum ) { +void trap_S_StopLoopingSound( int entityNum ) +{ syscall( CG_S_STOPLOOPINGSOUND, entityNum ); } -void trap_S_UpdateEntityPosition( int entityNum, const vec3_t origin ) { - syscall( CG_S_UPDATEENTITYPOSITION, entityNum, origin ); +void trap_S_UpdateEntityPosition( int entityNum, const vec3_t origin ) +{ + syscall( CG_S_UPDATEENTITYPOSITION, entityNum, origin ); } -void trap_S_Respatialize( int entityNum, const vec3_t origin, vec3_t axis[3], int inwater ) { - syscall( CG_S_RESPATIALIZE, entityNum, origin, axis, inwater ); +void trap_S_Respatialize( int entityNum, const vec3_t origin, vec3_t axis[3], int inwater ) +{ + syscall( CG_S_RESPATIALIZE, entityNum, origin, axis, inwater ); } -sfxHandle_t trap_S_RegisterSound( const char *sample, qboolean compressed ) { +sfxHandle_t trap_S_RegisterSound( const char *sample, qboolean compressed ) +{ return syscall( CG_S_REGISTERSOUND, sample, compressed ); } -void trap_S_StartBackgroundTrack( const char *intro, const char *loop ) { - syscall( CG_S_STARTBACKGROUNDTRACK, intro, loop ); +void trap_S_StartBackgroundTrack( const char *intro, const char *loop ) +{ + syscall( CG_S_STARTBACKGROUNDTRACK, intro, loop ); } -void trap_R_LoadWorldMap( const char *mapname ) { - syscall( CG_R_LOADWORLDMAP, mapname ); +void trap_R_LoadWorldMap( const char *mapname ) +{ + syscall( CG_R_LOADWORLDMAP, mapname ); } -qhandle_t trap_R_RegisterModel( const char *name ) { - return syscall( CG_R_REGISTERMODEL, name ); +qhandle_t trap_R_RegisterModel( const char *name ) +{ + return syscall( CG_R_REGISTERMODEL, name ); } -qhandle_t trap_R_RegisterSkin( const char *name ) { - return syscall( CG_R_REGISTERSKIN, name ); +qhandle_t trap_R_RegisterSkin( const char *name ) +{ + return syscall( CG_R_REGISTERSKIN, name ); } -qhandle_t trap_R_RegisterShader( const char *name ) { - return syscall( CG_R_REGISTERSHADER, name ); +qhandle_t trap_R_RegisterShader( const char *name ) +{ + return syscall( CG_R_REGISTERSHADER, name ); } -qhandle_t trap_R_RegisterShaderNoMip( const char *name ) { - return syscall( CG_R_REGISTERSHADERNOMIP, name ); +qhandle_t trap_R_RegisterShaderNoMip( const char *name ) +{ + return syscall( CG_R_REGISTERSHADERNOMIP, name ); } -void trap_R_RegisterFont(const char *fontName, int pointSize, fontInfo_t *font) { +void trap_R_RegisterFont( const char *fontName, int pointSize, fontInfo_t *font ) +{ syscall(CG_R_REGISTERFONT, fontName, pointSize, font ); } -void trap_R_ClearScene( void ) { - syscall( CG_R_CLEARSCENE ); +void trap_R_ClearScene( void ) +{ + syscall( CG_R_CLEARSCENE ); } -void trap_R_AddRefEntityToScene( const refEntity_t *re ) { - syscall( CG_R_ADDREFENTITYTOSCENE, re ); +void trap_R_AddRefEntityToScene( const refEntity_t *re ) +{ + syscall( CG_R_ADDREFENTITYTOSCENE, re ); } -void trap_R_AddPolyToScene( qhandle_t hShader , int numVerts, const polyVert_t *verts ) { - syscall( CG_R_ADDPOLYTOSCENE, hShader, numVerts, verts ); +void trap_R_AddPolyToScene( qhandle_t hShader , int numVerts, const polyVert_t *verts ) +{ + syscall( CG_R_ADDPOLYTOSCENE, hShader, numVerts, verts ); } -void trap_R_AddPolysToScene( qhandle_t hShader , int numVerts, const polyVert_t *verts, int num ) { +void trap_R_AddPolysToScene( qhandle_t hShader , int numVerts, const polyVert_t *verts, int num ) +{ syscall( CG_R_ADDPOLYSTOSCENE, hShader, numVerts, verts, num ); } -int trap_R_LightForPoint( vec3_t point, vec3_t ambientLight, vec3_t directedLight, vec3_t lightDir ) { +int trap_R_LightForPoint( vec3_t point, vec3_t ambientLight, vec3_t directedLight, vec3_t lightDir ) +{ return syscall( CG_R_LIGHTFORPOINT, point, ambientLight, directedLight, lightDir ); } -void trap_R_AddLightToScene( const vec3_t org, float intensity, float r, float g, float b ) { - syscall( CG_R_ADDLIGHTTOSCENE, org, PASSFLOAT(intensity), PASSFLOAT(r), PASSFLOAT(g), PASSFLOAT(b) ); +void trap_R_AddLightToScene( const vec3_t org, float intensity, float r, float g, float b ) +{ + syscall( CG_R_ADDLIGHTTOSCENE, org, PASSFLOAT(intensity), PASSFLOAT(r), PASSFLOAT(g), PASSFLOAT(b) ); } -void trap_R_AddAdditiveLightToScene( const vec3_t org, float intensity, float r, float g, float b ) { - syscall( CG_R_ADDADDITIVELIGHTTOSCENE, org, PASSFLOAT(intensity), PASSFLOAT(r), PASSFLOAT(g), PASSFLOAT(b) ); +void trap_R_AddAdditiveLightToScene( const vec3_t org, float intensity, float r, float g, float b ) +{ + syscall( CG_R_ADDADDITIVELIGHTTOSCENE, org, PASSFLOAT(intensity), PASSFLOAT(r), PASSFLOAT(g), PASSFLOAT(b) ); } -void trap_R_RenderScene( const refdef_t *fd ) { - syscall( CG_R_RENDERSCENE, fd ); +void trap_R_RenderScene( const refdef_t *fd ) +{ + syscall( CG_R_RENDERSCENE, fd ); } -void trap_R_SetColor( const float *rgba ) { - syscall( CG_R_SETCOLOR, rgba ); +void trap_R_SetColor( const float *rgba ) +{ + syscall( CG_R_SETCOLOR, rgba ); } -void trap_R_DrawStretchPic( float x, float y, float w, float h, - float s1, float t1, float s2, float t2, qhandle_t hShader ) { - syscall( CG_R_DRAWSTRETCHPIC, PASSFLOAT(x), PASSFLOAT(y), PASSFLOAT(w), PASSFLOAT(h), PASSFLOAT(s1), PASSFLOAT(t1), PASSFLOAT(s2), PASSFLOAT(t2), hShader ); +void trap_R_DrawStretchPic( float x, float y, float w, float h, + float s1, float t1, float s2, float t2, qhandle_t hShader ) +{ + syscall( CG_R_DRAWSTRETCHPIC, PASSFLOAT(x), PASSFLOAT(y), PASSFLOAT(w), PASSFLOAT(h), + PASSFLOAT(s1), PASSFLOAT(t1), PASSFLOAT(s2), PASSFLOAT(t2), hShader ); } -void trap_R_ModelBounds( clipHandle_t model, vec3_t mins, vec3_t maxs ) { - syscall( CG_R_MODELBOUNDS, model, mins, maxs ); +void trap_R_ModelBounds( clipHandle_t model, vec3_t mins, vec3_t maxs ) { + syscall( CG_R_MODELBOUNDS, model, mins, maxs ); } int trap_R_LerpTag( orientation_t *tag, clipHandle_t mod, int startFrame, int endFrame, - float frac, const char *tagName ) { + float frac, const char *tagName ) +{ return syscall( CG_R_LERPTAG, tag, mod, startFrame, endFrame, PASSFLOAT(frac), tagName ); } -void trap_R_RemapShader( const char *oldShader, const char *newShader, const char *timeOffset ) { +void trap_R_RemapShader( const char *oldShader, const char *newShader, const char *timeOffset ) +{ syscall( CG_R_REMAP_SHADER, oldShader, newShader, timeOffset ); } -void trap_GetGlconfig( glconfig_t *glconfig ) { - syscall( CG_GETGLCONFIG, glconfig ); +void trap_GetGlconfig( glconfig_t *glconfig ) +{ + syscall( CG_GETGLCONFIG, glconfig ); } -void trap_GetGameState( gameState_t *gamestate ) { - syscall( CG_GETGAMESTATE, gamestate ); +void trap_GetGameState( gameState_t *gamestate ) +{ + syscall( CG_GETGAMESTATE, gamestate ); } -void trap_GetCurrentSnapshotNumber( int *snapshotNumber, int *serverTime ) { - syscall( CG_GETCURRENTSNAPSHOTNUMBER, snapshotNumber, serverTime ); +void trap_GetCurrentSnapshotNumber( int *snapshotNumber, int *serverTime ) +{ + syscall( CG_GETCURRENTSNAPSHOTNUMBER, snapshotNumber, serverTime ); } -qboolean trap_GetSnapshot( int snapshotNumber, snapshot_t *snapshot ) { - return syscall( CG_GETSNAPSHOT, snapshotNumber, snapshot ); +qboolean trap_GetSnapshot( int snapshotNumber, snapshot_t *snapshot ) +{ + return syscall( CG_GETSNAPSHOT, snapshotNumber, snapshot ); } -qboolean trap_GetServerCommand( int serverCommandNumber ) { - return syscall( CG_GETSERVERCOMMAND, serverCommandNumber ); +qboolean trap_GetServerCommand( int serverCommandNumber ) +{ + return syscall( CG_GETSERVERCOMMAND, serverCommandNumber ); } -int trap_GetCurrentCmdNumber( void ) { - return syscall( CG_GETCURRENTCMDNUMBER ); +int trap_GetCurrentCmdNumber( void ) +{ + return syscall( CG_GETCURRENTCMDNUMBER ); } -qboolean trap_GetUserCmd( int cmdNumber, usercmd_t *ucmd ) { - return syscall( CG_GETUSERCMD, cmdNumber, ucmd ); +qboolean trap_GetUserCmd( int cmdNumber, usercmd_t *ucmd ) +{ + return syscall( CG_GETUSERCMD, cmdNumber, ucmd ); } -void trap_SetUserCmdValue( int stateValue, float sensitivityScale ) { - syscall( CG_SETUSERCMDVALUE, stateValue, PASSFLOAT(sensitivityScale) ); +void trap_SetUserCmdValue( int stateValue, float sensitivityScale ) +{ + syscall( CG_SETUSERCMDVALUE, stateValue, PASSFLOAT( sensitivityScale ) ); } -void testPrintInt( char *string, int i ) { - syscall( CG_TESTPRINTINT, string, i ); +void testPrintInt( char *string, int i ) +{ + syscall( CG_TESTPRINTINT, string, i ); } -void testPrintFloat( char *string, float f ) { - syscall( CG_TESTPRINTFLOAT, string, PASSFLOAT(f) ); +void testPrintFloat( char *string, float f ) +{ + syscall( CG_TESTPRINTFLOAT, string, PASSFLOAT(f) ); } -int trap_MemoryRemaining( void ) { - return syscall( CG_MEMORY_REMAINING ); +int trap_MemoryRemaining( void ) +{ + return syscall( CG_MEMORY_REMAINING ); } -qboolean trap_Key_IsDown( int keynum ) { +qboolean trap_Key_IsDown( int keynum ) +{ return syscall( CG_KEY_ISDOWN, keynum ); } -int trap_Key_GetCatcher( void ) { +int trap_Key_GetCatcher( void ) +{ return syscall( CG_KEY_GETCATCHER ); } -void trap_Key_SetCatcher( int catcher ) { +void trap_Key_SetCatcher( int catcher ) +{ syscall( CG_KEY_SETCATCHER, catcher ); } -int trap_Key_GetKey( const char *binding ) { +int trap_Key_GetKey( const char *binding ) +{ return syscall( CG_KEY_GETKEY, binding ); } -int trap_PC_AddGlobalDefine( char *define ) { +int trap_PC_AddGlobalDefine( char *define ) +{ return syscall( CG_PC_ADD_GLOBAL_DEFINE, define ); } -int trap_PC_LoadSource( const char *filename ) { +int trap_PC_LoadSource( const char *filename ) +{ return syscall( CG_PC_LOAD_SOURCE, filename ); } -int trap_PC_FreeSource( int handle ) { +int trap_PC_FreeSource( int handle ) +{ return syscall( CG_PC_FREE_SOURCE, handle ); } -int trap_PC_ReadToken( int handle, pc_token_t *pc_token ) { +int trap_PC_ReadToken( int handle, pc_token_t *pc_token ) +{ return syscall( CG_PC_READ_TOKEN, handle, pc_token ); } -int trap_PC_SourceFileAndLine( int handle, char *filename, int *line ) { +int trap_PC_SourceFileAndLine( int handle, char *filename, int *line ) +{ return syscall( CG_PC_SOURCE_FILE_AND_LINE, handle, filename, line ); } -void trap_S_StopBackgroundTrack( void ) { +void trap_S_StopBackgroundTrack( void ) +{ syscall( CG_S_STOPBACKGROUNDTRACK ); } -int trap_RealTime(qtime_t *qtime) { +int trap_RealTime(qtime_t *qtime) +{ return syscall( CG_REAL_TIME, qtime ); } -void trap_SnapVector( float *v ) { +void trap_SnapVector( float *v ) +{ syscall( CG_SNAPVECTOR, v ); } // this returns a handle. arg0 is the name in the format "idlogo.roq", set arg1 to NULL, alteredstates to qfalse (do not alter gamestate) -int trap_CIN_PlayCinematic( const char *arg0, int xpos, int ypos, int width, int height, int bits) { +int trap_CIN_PlayCinematic( const char *arg0, int xpos, int ypos, int width, int height, int bits ) +{ return syscall(CG_CIN_PLAYCINEMATIC, arg0, xpos, ypos, width, height, bits); } // stops playing the cinematic and ends it. should always return FMV_EOF // cinematics must be stopped in reverse order of when they are started -e_status trap_CIN_StopCinematic(int handle) { +e_status trap_CIN_StopCinematic( int handle ) +{ return syscall(CG_CIN_STOPCINEMATIC, handle); } // will run a frame of the cinematic but will not draw it. Will return FMV_EOF if the end of the cinematic has been reached. -e_status trap_CIN_RunCinematic (int handle) { +e_status trap_CIN_RunCinematic( int handle ) +{ return syscall(CG_CIN_RUNCINEMATIC, handle); } // draws the current frame -void trap_CIN_DrawCinematic (int handle) { +void trap_CIN_DrawCinematic( int handle ) +{ syscall(CG_CIN_DRAWCINEMATIC, handle); } // allows you to resize the animation dynamically -void trap_CIN_SetExtents (int handle, int x, int y, int w, int h) { +void trap_CIN_SetExtents( int handle, int x, int y, int w, int h ) +{ syscall(CG_CIN_SETEXTENTS, handle, x, y, w, h); } diff --git a/src/cgame/cg_trails.c b/src/cgame/cg_trails.c index 9a2bc8a1..8839a757 100644 --- a/src/cgame/cg_trails.c +++ b/src/cgame/cg_trails.c @@ -4,35 +4,35 @@ typedef struct trailJunc_s { - struct trailJunc_s *nextGlobal, *prevGlobal; // next junction in the global list it is in (free or used) - struct trailJunc_s *nextJunc; // next junction in the trail - struct trailJunc_s *nextHead, *prevHead; // next head junc in the world - - qboolean inuse, freed; - int ownerIndex; - qhandle_t shader; - - int sType; - int flags; - float sTex; - vec3_t pos; - int spawnTime, endTime; - float alphaStart, alphaEnd; - vec3_t colorStart, colorEnd; - float widthStart, widthEnd; - - // current settings - float alpha; - float width; - vec3_t color; + struct trailJunc_s *nextGlobal, *prevGlobal; // next junction in the global list it is in (free or used) + struct trailJunc_s *nextJunc; // next junction in the trail + struct trailJunc_s *nextHead, *prevHead; // next head junc in the world + + qboolean inuse, freed; + int ownerIndex; + qhandle_t shader; + + int sType; + int flags; + float sTex; + vec3_t pos; + int spawnTime, endTime; + float alphaStart, alphaEnd; + vec3_t colorStart, colorEnd; + float widthStart, widthEnd; + + // current settings + float alpha; + float width; + vec3_t color; } trailJunc_t; -#define MAX_TRAILJUNCS 4096 +#define MAX_TRAILJUNCS 4096 -trailJunc_t trailJuncs[MAX_TRAILJUNCS]; +trailJunc_t trailJuncs[ MAX_TRAILJUNCS ]; trailJunc_t *freeTrails, *activeTrails; -trailJunc_t *headTrails; +trailJunc_t *headTrails; qboolean initTrails = qfalse; @@ -43,31 +43,32 @@ int numTrailsInuse; CG_ClearTrails =============== */ -void CG_ClearTrails (void) +void CG_ClearTrails( void ) { - int i; + int i; - memset( trailJuncs, 0, sizeof(trailJunc_t) * MAX_TRAILJUNCS ); + memset( trailJuncs, 0, sizeof( trailJunc_t ) * MAX_TRAILJUNCS ); - freeTrails = trailJuncs; - activeTrails = NULL; - headTrails = NULL; + freeTrails = trailJuncs; + activeTrails = NULL; + headTrails = NULL; - for (i=0 ;i<MAX_TRAILJUNCS ; i++) - { - trailJuncs[i].nextGlobal = &trailJuncs[i+1]; + for( i = 0; i < MAX_TRAILJUNCS; i++ ) + { + trailJuncs[ i ].nextGlobal = &trailJuncs[ i + 1 ]; - if (i>0) - trailJuncs[i].prevGlobal = &trailJuncs[i-1]; - else - trailJuncs[i].prevGlobal = NULL; + if( i > 0 ) + trailJuncs[ i ].prevGlobal = &trailJuncs[ i - 1 ]; + else + trailJuncs[ i ].prevGlobal = NULL; - trailJuncs[i].inuse = qfalse; - } - trailJuncs[MAX_TRAILJUNCS-1].nextGlobal = NULL; + trailJuncs[ i ].inuse = qfalse; + } + + trailJuncs[ MAX_TRAILJUNCS - 1 ].nextGlobal = NULL; - initTrails = qtrue; - numTrailsInuse = 0; + initTrails = qtrue; + numTrailsInuse = 0; } /* @@ -77,59 +78,70 @@ CG_SpawnTrailJunc */ trailJunc_t *CG_SpawnTrailJunc( trailJunc_t *headJunc ) { - trailJunc_t *j; - - if (!freeTrails) - return NULL; - - if ( cg_paused.integer ) - return NULL; - - // select the first free trail, and remove it from the list - j = freeTrails; - freeTrails = j->nextGlobal; - if (freeTrails) - freeTrails->prevGlobal = NULL; - - j->nextGlobal = activeTrails; - if (activeTrails) - activeTrails->prevGlobal = j; - activeTrails = j; - j->prevGlobal = NULL; - j->inuse = qtrue; - j->freed = qfalse; - - // if this owner has a headJunc, add us to the start - if (headJunc) { - // remove the headJunc from the list of heads - if (headJunc == headTrails) { - headTrails = headJunc->nextHead; - if (headTrails) - headTrails->prevHead = NULL; - } else { - if (headJunc->nextHead) - headJunc->nextHead->prevHead = headJunc->prevHead; - if (headJunc->prevHead) - headJunc->prevHead->nextHead = headJunc->nextHead; - } - headJunc->prevHead = NULL; - headJunc->nextHead = NULL; - } - // make us the headTrail - if (headTrails) - headTrails->prevHead = j; - j->nextHead = headTrails; - j->prevHead = NULL; - headTrails = j; - - j->nextJunc = headJunc; // if headJunc is NULL, then we'll just be the end of the list - - numTrailsInuse++; - - // debugging -// CG_Printf( "NumTrails: %i\n", numTrailsInuse ); - - return j; + trailJunc_t *j; + + if( !freeTrails ) + return NULL; + + if( cg_paused.integer ) + return NULL; + + // select the first free trail, and remove it from the list + j = freeTrails; + freeTrails = j->nextGlobal; + + if( freeTrails ) + freeTrails->prevGlobal = NULL; + + j->nextGlobal = activeTrails; + + if( activeTrails ) + activeTrails->prevGlobal = j; + + activeTrails = j; + j->prevGlobal = NULL; + j->inuse = qtrue; + j->freed = qfalse; + + // if this owner has a headJunc, add us to the start + if( headJunc ) + { + // remove the headJunc from the list of heads + if( headJunc == headTrails ) + { + headTrails = headJunc->nextHead; + + if( headTrails ) + headTrails->prevHead = NULL; + } + else + { + if( headJunc->nextHead ) + headJunc->nextHead->prevHead = headJunc->prevHead; + + if( headJunc->prevHead ) + headJunc->prevHead->nextHead = headJunc->nextHead; + } + headJunc->prevHead = NULL; + headJunc->nextHead = NULL; + } + + // make us the headTrail + if( headTrails ) + headTrails->prevHead = j; + + j->nextHead = headTrails; + j->prevHead = NULL; + headTrails = j; + + j->nextJunc = headJunc; // if headJunc is NULL, then we'll just be the end of the list + + numTrailsInuse++; + + // debugging +// CG_Printf( "NumTrails: %i\n", numTrailsInuse ); + + return j; } @@ -142,59 +154,74 @@ CG_AddTrailJunc Used for generic trails =============== */ -int CG_AddTrailJunc(int headJuncIndex, qhandle_t shader, int spawnTime, int sType, vec3_t pos, int trailLife, float alphaStart, float alphaEnd, float startWidth, float endWidth, int flags, vec3_t colorStart, vec3_t colorEnd, float sRatio, float animSpeed) +int CG_AddTrailJunc( int headJuncIndex, qhandle_t shader, int spawnTime, int sType, vec3_t pos, + int trailLife, float alphaStart, float alphaEnd, float startWidth, + float endWidth, int flags, vec3_t colorStart, vec3_t colorEnd, + float sRatio, float animSpeed ) { - trailJunc_t *j, *headJunc; - - if (headJuncIndex > 0) { - headJunc = &trailJuncs[headJuncIndex-1]; - - if (!headJunc->inuse) - headJunc = NULL; - } - else - headJunc = NULL; - - j = CG_SpawnTrailJunc(headJunc); - if (!j) { -// CG_Printf("couldnt spawn trail junc\n"); - return 0; - } - - if (alphaStart > 1.0) alphaStart = 1.0; - if (alphaStart < 0.0) alphaStart = 0.0; - if (alphaEnd > 1.0) alphaEnd = 1.0; - if (alphaEnd < 0.0) alphaEnd = 0.0; - - // setup the trail junction - j->shader = shader; - j->sType = sType; - VectorCopy( pos, j->pos ); - j->flags = flags; - - j->spawnTime = spawnTime; - j->endTime = spawnTime + trailLife; - - VectorCopy( colorStart, j->colorStart ); - VectorCopy( colorEnd, j->colorEnd ); - - j->alphaStart = alphaStart; - j->alphaEnd = alphaEnd; - - j->widthStart = startWidth; - j->widthEnd = endWidth; - - if (sType == STYPE_REPEAT) { - if (headJunc) { - j->sTex = headJunc->sTex + ((Distance( headJunc->pos, pos ) / sRatio) / j->widthEnd); - } else { - // FIXME: need a way to specify offset timing - j->sTex = (animSpeed * (1.0 - ((float)(cg.time%1000) / 1000.0))) / (sRatio); -// j->sTex = 0; - } - } - - return ((int)(j - trailJuncs) + 1); + trailJunc_t *j, *headJunc; + + if( headJuncIndex > 0 ) + { + headJunc = &trailJuncs[ headJuncIndex - 1 ]; + + if( !headJunc->inuse ) + headJunc = NULL; + } + else + headJunc = NULL; + + j = CG_SpawnTrailJunc( headJunc ); + + if( !j ) + { +// CG_Printf("couldnt spawn trail junc\n"); + return 0; + } + + if( alphaStart > 1.0 ) + alphaStart = 1.0; + + if( alphaStart < 0.0 ) + alphaStart = 0.0; + + if( alphaEnd > 1.0 ) + alphaEnd = 1.0; + + if( alphaEnd < 0.0 ) + alphaEnd = 0.0; + + // setup the trail junction + j->shader = shader; + j->sType = sType; + VectorCopy( pos, j->pos ); + j->flags = flags; + + j->spawnTime = spawnTime; + j->endTime = spawnTime + trailLife; + + VectorCopy( colorStart, j->colorStart ); + VectorCopy( colorEnd, j->colorEnd ); + + j->alphaStart = alphaStart; + j->alphaEnd = alphaEnd; + + j->widthStart = startWidth; + j->widthEnd = endWidth; + + if( sType == STYPE_REPEAT ) + { + if( headJunc ) + j->sTex = headJunc->sTex + ( ( Distance( headJunc->pos, pos ) / sRatio) / j->widthEnd ); + else + { + // FIXME: need a way to specify offset timing + j->sTex = ( animSpeed * ( 1.0 - ( (float)( cg.time % 1000 ) / 1000.0 ) ) ) / ( sRatio ); +// j->sTex = 0; + } + } + + return ( (int)( j - trailJuncs ) + 1 ); } /* @@ -204,46 +231,49 @@ CG_AddSparkJunc returns the index of the trail junction created =============== */ -int CG_AddSparkJunc(int headJuncIndex, qhandle_t shader, vec3_t pos, int trailLife, float alphaStart, float alphaEnd, float startWidth, float endWidth) +int CG_AddSparkJunc( int headJuncIndex, qhandle_t shader, vec3_t pos, int trailLife, + float alphaStart, float alphaEnd, float startWidth, float endWidth ) { - trailJunc_t *j, *headJunc; - - if (headJuncIndex > 0) { - headJunc = &trailJuncs[headJuncIndex-1]; - - if (!headJunc->inuse) - headJunc = NULL; - } - else - headJunc = NULL; - - j = CG_SpawnTrailJunc(headJunc); - if (!j) - return 0; - - // setup the trail junction - j->shader = shader; - j->sType = STYPE_STRETCH; - VectorCopy( pos, j->pos ); - j->flags = TJFL_NOCULL; // don't worry about fading up close - - j->spawnTime = cg.time; - j->endTime = cg.time + trailLife; - - VectorSet(j->colorStart, 1.0, 0.8 + 0.2 * alphaStart, 0.4 + 0.4 * alphaStart); - VectorSet(j->colorEnd, 1.0, 0.8 + 0.2 * alphaEnd, 0.4 + 0.4 * alphaEnd); -// VectorScale( j->colorStart, alphaStart, j->colorStart ); -// VectorScale( j->colorEnd, alphaEnd, j->colorEnd ); - - j->alphaStart = alphaStart*2; - j->alphaEnd = alphaEnd*2; -// j->alphaStart = 1.0; -// j->alphaEnd = 1.0; - - j->widthStart = startWidth; - j->widthEnd = endWidth; - - return ((int)(j - trailJuncs) + 1); + trailJunc_t *j, *headJunc; + + if( headJuncIndex > 0 ) + { + headJunc = &trailJuncs[ headJuncIndex - 1 ]; + + if( !headJunc->inuse ) + headJunc = NULL; + } + else + headJunc = NULL; + + j = CG_SpawnTrailJunc( headJunc ); + + if( !j ) + return 0; + + // setup the trail junction + j->shader = shader; + j->sType = STYPE_STRETCH; + VectorCopy( pos, j->pos ); + j->flags = TJFL_NOCULL; // don't worry about fading up close + + j->spawnTime = cg.time; + j->endTime = cg.time + trailLife; + + VectorSet( j->colorStart, 1.0, 0.8 + 0.2 * alphaStart, 0.4 + 0.4 * alphaStart ); + VectorSet( j->colorEnd, 1.0, 0.8 + 0.2 * alphaEnd, 0.4 + 0.4 * alphaEnd ); +// VectorScale( j->colorStart, alphaStart, j->colorStart ); +// VectorScale( j->colorEnd, alphaEnd, j->colorEnd ); + + j->alphaStart = alphaStart*2; + j->alphaEnd = alphaEnd*2; +// j->alphaStart = 1.0; +// j->alphaEnd = 1.0; + + j->widthStart = startWidth; + j->widthEnd = endWidth; + + return ( (int)( j - trailJuncs ) + 1 ); } /* @@ -253,54 +283,58 @@ CG_AddSmokeJunc returns the index of the trail junction created =============== */ -int CG_AddSmokeJunc(int headJuncIndex, qhandle_t shader, vec3_t pos, int trailLife, float alpha, float startWidth, float endWidth) +int CG_AddSmokeJunc( int headJuncIndex, qhandle_t shader, vec3_t pos, int trailLife, + float alpha, float startWidth, float endWidth ) { -#define ST_RATIO 4.0 // sprite image: width / height - trailJunc_t *j, *headJunc; - - if (headJuncIndex > 0) { - headJunc = &trailJuncs[headJuncIndex-1]; - - if (!headJunc->inuse) - headJunc = NULL; - } - else - headJunc = NULL; - - j = CG_SpawnTrailJunc(headJunc); - if (!j) - return 0; - - // setup the trail junction - j->shader = shader; - j->sType = STYPE_REPEAT; - VectorCopy( pos, j->pos ); - j->flags = TJFL_FADEIN; - - j->spawnTime = cg.time; - j->endTime = cg.time + trailLife; - - // VectorSet(j->colorStart, 0.2, 0.2, 0.2); - VectorSet(j->colorStart, 0.0, 0.0, 0.0); - // VectorSet(j->colorEnd, 0.1, 0.1, 0.1); - VectorSet(j->colorEnd, 0.0, 0.0, 0.0); - - j->alphaStart = alpha; - j->alphaEnd = 0.0; - - j->widthStart = startWidth; - j->widthEnd = endWidth; - - if (headJunc) { - j->sTex = headJunc->sTex + ((Distance( headJunc->pos, pos ) / ST_RATIO) / j->widthEnd); - } else { - // first junction, so this will become the "tail" very soon, make it fade out - j->sTex = 0; - j->alphaStart = 0.0; - j->alphaEnd = 0.0; - } - - return ((int)(j - trailJuncs) + 1); +#define ST_RATIO 4.0 // sprite image: width / height + trailJunc_t *j, *headJunc; + + if( headJuncIndex > 0 ) + { + headJunc = &trailJuncs[ headJuncIndex - 1 ]; + + if( !headJunc->inuse ) + headJunc = NULL; + } + else + headJunc = NULL; + + j = CG_SpawnTrailJunc( headJunc ); + + if( !j ) + return 0; + + // setup the trail junction + j->shader = shader; + j->sType = STYPE_REPEAT; + VectorCopy( pos, j->pos ); + j->flags = TJFL_FADEIN; + + j->spawnTime = cg.time; + j->endTime = cg.time + trailLife; + + // VectorSet(j->colorStart, 0.2, 0.2, 0.2); + VectorSet(j->colorStart, 0.0, 0.0, 0.0); + // VectorSet(j->colorEnd, 0.1, 0.1, 0.1); + VectorSet(j->colorEnd, 0.0, 0.0, 0.0); + + j->alphaStart = alpha; + j->alphaEnd = 0.0; + + j->widthStart = startWidth; + j->widthEnd = endWidth; + + if( headJunc ) + j->sTex = headJunc->sTex + ( ( Distance( headJunc->pos, pos ) / ST_RATIO ) / j->widthEnd ); + else + { + // first junction, so this will become the "tail" very soon, make it fade out + j->sTex = 0; + j->alphaStart = 0.0; + j->alphaEnd = 0.0; + } + + return ( (int)( j - trailJuncs ) + 1 ); } void CG_KillTrail( trailJunc_t *t ); @@ -312,38 +346,46 @@ CG_FreeTrailJunc */ void CG_FreeTrailJunc( trailJunc_t *junc ) { - // kill any juncs after us, so they aren't left hanging - if (junc->nextJunc) - CG_KillTrail( junc ); - - // make it non-active - junc->inuse = qfalse; - junc->freed = qtrue; - if (junc->nextGlobal) - junc->nextGlobal->prevGlobal = junc->prevGlobal; - if (junc->prevGlobal) - junc->prevGlobal->nextGlobal = junc->nextGlobal; - if (junc == activeTrails) - activeTrails = junc->nextGlobal; - - // if it's a head, remove it - if (junc == headTrails) - headTrails = junc->nextHead; - if (junc->nextHead) - junc->nextHead->prevHead = junc->prevHead; - if (junc->prevHead) - junc->prevHead->nextHead = junc->nextHead; - junc->nextHead = NULL; - junc->prevHead = NULL; - - // stick it in the free list - junc->prevGlobal = NULL; - junc->nextGlobal = freeTrails; - if (freeTrails) - freeTrails->prevGlobal = junc; - freeTrails = junc; - - numTrailsInuse--; + // kill any juncs after us, so they aren't left hanging + if( junc->nextJunc ) + CG_KillTrail( junc ); + + // make it non-active + junc->inuse = qfalse; + junc->freed = qtrue; + + if( junc->nextGlobal ) + junc->nextGlobal->prevGlobal = junc->prevGlobal; + + if( junc->prevGlobal ) + junc->prevGlobal->nextGlobal = junc->nextGlobal; + + if( junc == activeTrails ) + activeTrails = junc->nextGlobal; + + // if it's a head, remove it + if( junc == headTrails ) + headTrails = junc->nextHead; + + if( junc->nextHead ) + junc->nextHead->prevHead = junc->prevHead; + + if( junc->prevHead ) + junc->prevHead->nextHead = junc->nextHead; + + junc->nextHead = NULL; + junc->prevHead = NULL; + + // stick it in the free list + junc->prevGlobal = NULL; + junc->nextGlobal = freeTrails; + + if( freeTrails ) + freeTrails->prevGlobal = junc; + + freeTrails = junc; + + numTrailsInuse--; } /* @@ -353,15 +395,15 @@ CG_KillTrail */ void CG_KillTrail( trailJunc_t *t ) { - trailJunc_t *next; + trailJunc_t *next; - next = t->nextJunc; + next = t->nextJunc; - // kill the trail here - t->nextJunc = NULL; + // kill the trail here + t->nextJunc = NULL; - if (next) - CG_FreeTrailJunc( next ); + if( next ) + CG_FreeTrailJunc( next ); } /* @@ -374,301 +416,331 @@ CG_AddTrailToScene static vec3_t vforward, vright, vup; //TA: staticised to please QVM - #define MAX_TRAIL_VERTS 2048 -static polyVert_t verts[MAX_TRAIL_VERTS]; -static polyVert_t outVerts[MAX_TRAIL_VERTS*3]; + #define MAX_TRAIL_VERTS 2048 +static polyVert_t verts[ MAX_TRAIL_VERTS ]; +static polyVert_t outVerts[ MAX_TRAIL_VERTS * 3 ]; void CG_AddTrailToScene( trailJunc_t *trail, int iteration, int numJuncs ) { - int k, i, n, l, numOutVerts; - polyVert_t mid; - float mod[4]; - float sInc = 0.0f, s = 0.0f; // TTimo: init - trailJunc_t *j, *jNext; - vec3_t fwd, up, p, v; - // clipping vars - #define TRAIL_FADE_CLOSE_DIST 64.0 - #define TRAIL_FADE_FAR_SCALE 4.0 - vec3_t viewProj; - float viewDist, fadeAlpha; - - // add spark shader at head position - if (trail->flags & TJFL_SPARKHEADFLARE) { - j = trail; - VectorCopy( j->pos, p ); - VectorMA (p, -j->width*2, vup, p); - VectorMA (p, -j->width*2, vright, p); - VectorCopy (p, verts[0].xyz); - verts[0].st[0] = 0; - verts[0].st[1] = 0; - verts[0].modulate[0] = 255; - verts[0].modulate[1] = 255; - verts[0].modulate[2] = 255; - verts[0].modulate[3] = (unsigned char)(j->alpha*255.0); - - VectorCopy( j->pos, p ); - VectorMA (p, -j->width*2, vup, p); - VectorMA (p, j->width*2, vright, p); - VectorCopy (p, verts[1].xyz); - verts[1].st[0] = 0; - verts[1].st[1] = 1; - verts[1].modulate[0] = 255; - verts[1].modulate[1] = 255; - verts[1].modulate[2] = 255; - verts[1].modulate[3] = (unsigned char)(j->alpha*255.0); - - VectorCopy( j->pos, p ); - VectorMA (p, j->width*2, vup, p); - VectorMA (p, j->width*2, vright, p); - VectorCopy (p, verts[2].xyz); - verts[2].st[0] = 1; - verts[2].st[1] = 1; - verts[2].modulate[0] = 255; - verts[2].modulate[1] = 255; - verts[2].modulate[2] = 255; - verts[2].modulate[3] = (unsigned char)(j->alpha*255.0); - - VectorCopy( j->pos, p ); - VectorMA (p, j->width*2, vup, p); - VectorMA (p, -j->width*2, vright, p); - VectorCopy (p, verts[3].xyz); - verts[3].st[0] = 1; - verts[3].st[1] = 0; - verts[3].modulate[0] = 255; - verts[3].modulate[1] = 255; - verts[3].modulate[2] = 255; - verts[3].modulate[3] = (unsigned char)(j->alpha*255.0); - - trap_R_AddPolyToScene( cgs.media.sparkFlareShader, 4, verts ); - } - -// if (trail->flags & TJFL_CROSSOVER && iteration < 1) { -// iteration = 1; -// } - - if (!numJuncs) { - // first count the number of juncs in the trail - j = trail; - numJuncs = 0; - sInc = 0; - while (j) { - numJuncs++; - - // check for a dead next junc - if (!j->inuse && j->nextJunc && !j->nextJunc->inuse) { - CG_KillTrail( j ); - } else if (j->nextJunc && j->nextJunc->freed) { - // not sure how this can happen, but it does, and causes infinite loops - j->nextJunc = NULL; - } - - if (j->nextJunc) - sInc += VectorDistance( j->nextJunc->pos, j->pos ); - - j = j->nextJunc; - } - } - - if (numJuncs < 2) { - return; - } - - if (trail->sType == STYPE_STRETCH) { - //sInc = ((1.0 - 0.1) / (float)(numJuncs)); // hack, the end of funnel shows a bit of the start (looping) - s = 0.05; - //s = 0.05; - } else if (trail->sType == STYPE_REPEAT) { - s = trail->sTex; - } - - // now traverse the list - j = trail; - jNext = j->nextJunc; - i = 0; - while (jNext) { - - // first get the directional vectors to the next junc - VectorSubtract( jNext->pos, j->pos, fwd ); - GetPerpendicularViewVector( cg.refdef.vieworg, j->pos, jNext->pos, up ); - - // if it's a crossover, draw it twice - if (j->flags & TJFL_CROSSOVER) { - if (iteration > 0) { - ProjectPointOntoVector( cg.refdef.vieworg, j->pos, jNext->pos, viewProj ); - VectorSubtract( cg.refdef.vieworg, viewProj, v ); - VectorNormalize( v ); - - if (iteration == 1) { - VectorMA( up, 0.3, v, up ); - } else { - VectorMA( up, -0.3, v, up ); - } - VectorNormalize( up ); - } - } - // do fading when moving towards the projection point onto the trail segment vector - else if (!(j->flags & TJFL_NOCULL) && (j->widthEnd > 4 || jNext->widthEnd > 4)) { - ProjectPointOntoVector( cg.refdef.vieworg, j->pos, jNext->pos, viewProj ); - viewDist = Distance( viewProj, cg.refdef.vieworg ); - if (viewDist < (TRAIL_FADE_CLOSE_DIST * TRAIL_FADE_FAR_SCALE)) { - if (viewDist < TRAIL_FADE_CLOSE_DIST) { - fadeAlpha = 0.0; - } else { - fadeAlpha = (viewDist - TRAIL_FADE_CLOSE_DIST) / (TRAIL_FADE_CLOSE_DIST * TRAIL_FADE_FAR_SCALE); - } - if (fadeAlpha < j->alpha) { - j->alpha = fadeAlpha; - } - if (fadeAlpha < jNext->alpha) { - jNext->alpha = fadeAlpha; - } - } - } - - // now output the QUAD for this segment - - // 1 ---- - VectorMA( j->pos, 0.5*j->width, up, p ); - VectorCopy( p, verts[i].xyz ); - verts[i].st[0] = s; - verts[i].st[1] = 1.0; - for (k=0; k<3; k++) - verts[i].modulate[k] = (unsigned char)(j->color[k]*255.0); - verts[i].modulate[3] = (unsigned char)(j->alpha*255.0); - - // blend this with the previous junc - if (j != trail) { - VectorAdd( verts[i].xyz, verts[i-1].xyz, verts[i].xyz ); - VectorScale( verts[i].xyz, 0.5, verts[i].xyz ); - VectorCopy( verts[i].xyz, verts[i-1].xyz ); - } else if (j->flags & TJFL_FADEIN) { - verts[i].modulate[3] = 0; // fade in - } - - i++; - - // 2 ---- - VectorMA( p, -1*j->width, up, p ); - VectorCopy( p, verts[i].xyz ); - verts[i].st[0] = s; - verts[i].st[1] = 0.0; - for (k=0; k<3; k++) - verts[i].modulate[k] = (unsigned char)(j->color[k]*255.0); - verts[i].modulate[3] = (unsigned char)(j->alpha*255.0); - - // blend this with the previous junc - if (j != trail) { - VectorAdd( verts[i].xyz, verts[i-3].xyz, verts[i].xyz ); - VectorScale( verts[i].xyz, 0.5, verts[i].xyz ); - VectorCopy( verts[i].xyz, verts[i-3].xyz ); - } else if (j->flags & TJFL_FADEIN) { - verts[i].modulate[3] = 0; // fade in - } - - i++; - - if (trail->sType == STYPE_REPEAT) - s = jNext->sTex; - else { - //s += sInc; - s += VectorDistance( j->pos, jNext->pos ) / sInc; - if (s > 1.0) s = 1.0; - } - - // 3 ---- - VectorMA( jNext->pos, -0.5*jNext->width, up, p ); - VectorCopy( p, verts[i].xyz ); - verts[i].st[0] = s; - verts[i].st[1] = 0.0; - for (k=0; k<3; k++) - verts[i].modulate[k] = (unsigned char)(jNext->color[k]*255.0); - verts[i].modulate[3] = (unsigned char)(jNext->alpha*255.0); - i++; - - // 4 ---- - VectorMA( p, jNext->width, up, p ); - VectorCopy( p, verts[i].xyz ); - verts[i].st[0] = s; - verts[i].st[1] = 1.0; - for (k=0; k<3; k++) - verts[i].modulate[k] = (unsigned char)(jNext->color[k]*255.0); - verts[i].modulate[3] = (unsigned char)(jNext->alpha*255.0); - i++; - - if (i+4 > MAX_TRAIL_VERTS) - break; - - j = jNext; - jNext = j->nextJunc; - } - - if (trail->flags & TJFL_FIXDISTORT) { - // build the list of outVerts, by dividing up the QUAD's into 4 Tri's each, so as to allow - // any shaped (convex) Quad without bilinear distortion - for (k=0, numOutVerts=0; k<i; k+=4) { - VectorCopy(verts[k].xyz, mid.xyz); - mid.st[0] = verts[k].st[0]; - mid.st[1] = verts[k].st[1]; - for (l=0; l<4; l++) { - mod[l] = (float)verts[k].modulate[l]; - } - for (n=1; n<4; n++) { - VectorAdd( verts[k+n].xyz, mid.xyz, mid.xyz ); - mid.st[0] += verts[k+n].st[0]; - mid.st[1] += verts[k+n].st[1]; - for (l=0; l<4; l++) { - mod[l] += (float)verts[k+n].modulate[l]; - } - } - VectorScale( mid.xyz, 0.25, mid.xyz ); - mid.st[0] *= 0.25; - mid.st[1] *= 0.25; - for (l=0; l<4; l++) { - mid.modulate[l] = (unsigned char)(mod[l]/4.0); - } - - // now output the tri's - for (n=0; n<4; n++) { - outVerts[numOutVerts++] = verts[k+n]; - outVerts[numOutVerts++] = mid; - if (n<3) { - outVerts[numOutVerts++] = verts[k+n+1]; - } else { - outVerts[numOutVerts++] = verts[k]; - } - } - - } - - if (!(trail->flags & TJFL_NOPOLYMERGE)) { - trap_R_AddPolysToScene( trail->shader, 3, &outVerts[0], numOutVerts/3 ); - } else { - int k; - for (k=0; k<numOutVerts/3; k++) { - trap_R_AddPolyToScene( trail->shader, 3, &outVerts[k*3] ); - } - } - } - else - { - // send the polygons - // FIXME: is it possible to send a GL_STRIP here? We are actually sending 2x the verts we really need to - if (!(trail->flags & TJFL_NOPOLYMERGE)) { - trap_R_AddPolysToScene( trail->shader, 4, &verts[0], i/4 ); - } else { - int k; - for (k=0; k<i/4; k++) { - trap_R_AddPolyToScene( trail->shader, 4, &verts[k*4] ); - } - } - } - - // do we need to make another pass? - if (trail->flags & TJFL_CROSSOVER) { - if (iteration < 2) { - CG_AddTrailToScene( trail, iteration + 1, numJuncs ); - } - } + int k, i, n, l, numOutVerts; + polyVert_t mid; + float mod[ 4 ]; + float sInc = 0.0f, s = 0.0f; // TTimo: init + trailJunc_t *j, *jNext; + vec3_t fwd, up, p, v; + + // clipping vars + #define TRAIL_FADE_CLOSE_DIST 64.0 + #define TRAIL_FADE_FAR_SCALE 4.0 + vec3_t viewProj; + float viewDist, fadeAlpha; + + // add spark shader at head position + if( trail->flags & TJFL_SPARKHEADFLARE ) + { + j = trail; + VectorCopy( j->pos, p ); + VectorMA( p, -j->width * 2, vup, p ); + VectorMA( p, -j->width * 2, vright, p ); + VectorCopy( p, verts[ 0 ].xyz ); + verts[ 0 ].st[ 0 ] = 0; + verts[ 0 ].st[ 1 ] = 0; + verts[ 0 ].modulate[ 0 ] = 255; + verts[ 0 ].modulate[ 1 ] = 255; + verts[ 0 ].modulate[ 2 ] = 255; + verts[ 0 ].modulate[ 3 ] = (unsigned char)( j->alpha * 255.0 ); + + VectorCopy( j->pos, p ); + VectorMA( p, -j->width * 2, vup, p ); + VectorMA( p, j->width * 2, vright, p ); + VectorCopy( p, verts[ 1 ].xyz ); + verts[ 1 ].st[ 0 ] = 0; + verts[ 1 ].st[ 1 ] = 1; + verts[ 1 ].modulate[ 0 ] = 255; + verts[ 1 ].modulate[ 1 ] = 255; + verts[ 1 ].modulate[ 2 ] = 255; + verts[ 1 ].modulate[ 3 ] = (unsigned char)( j->alpha * 255.0 ); + + VectorCopy( j->pos, p ); + VectorMA( p, j->width * 2, vup, p ); + VectorMA( p, j->width * 2, vright, p ); + VectorCopy( p, verts[ 2 ].xyz ); + verts[ 2 ].st[ 0 ] = 1; + verts[ 2 ].st[ 1 ] = 1; + verts[ 2 ].modulate[ 0 ] = 255; + verts[ 2 ].modulate[ 1 ] = 255; + verts[ 2 ].modulate[ 2 ] = 255; + verts[ 2 ].modulate[ 3 ] = (unsigned char)( j->alpha * 255.0 ); + + VectorCopy( j->pos, p ); + VectorMA( p, j->width * 2, vup, p ); + VectorMA( p, -j->width * 2, vright, p ); + VectorCopy( p, verts[ 3 ].xyz ); + verts[ 3 ].st[ 0 ] = 1; + verts[ 3 ].st[ 1 ] = 0; + verts[ 3 ].modulate[ 0 ] = 255; + verts[ 3 ].modulate[ 1 ] = 255; + verts[ 3 ].modulate[ 2 ] = 255; + verts[ 3 ].modulate[ 3 ] = (unsigned char)( j->alpha * 255.0 ); + + trap_R_AddPolyToScene( cgs.media.sparkFlareShader, 4, verts ); + } + +// if (trail->flags & TJFL_CROSSOVER && iteration < 1) { +// iteration = 1; +// } + + if( !numJuncs ) + { + // first count the number of juncs in the trail + j = trail; + numJuncs = 0; + sInc = 0; + + while( j ) + { + numJuncs++; + + // check for a dead next junc + if( !j->inuse && j->nextJunc && !j->nextJunc->inuse ) + CG_KillTrail( j ); + else if( j->nextJunc && j->nextJunc->freed ) + { + // not sure how this can happen, but it does, and causes infinite loops + j->nextJunc = NULL; + } + + if( j->nextJunc ) + sInc += VectorDistance( j->nextJunc->pos, j->pos ); + + j = j->nextJunc; + } + } + + if( numJuncs < 2 ) + return; + + if( trail->sType == STYPE_STRETCH ) + { + //sInc = ((1.0 - 0.1) / (float)(numJuncs)); // hack, the end of funnel shows a bit of the start (looping) + s = 0.05; + //s = 0.05; + } + else if( trail->sType == STYPE_REPEAT ) + s = trail->sTex; + + // now traverse the list + j = trail; + jNext = j->nextJunc; + i = 0; + while( jNext ) + { + // first get the directional vectors to the next junc + VectorSubtract( jNext->pos, j->pos, fwd ); + GetPerpendicularViewVector( cg.refdef.vieworg, j->pos, jNext->pos, up ); + + // if it's a crossover, draw it twice + if( j->flags & TJFL_CROSSOVER ) + { + if( iteration > 0 ) + { + ProjectPointOntoVector( cg.refdef.vieworg, j->pos, jNext->pos, viewProj ); + VectorSubtract( cg.refdef.vieworg, viewProj, v ); + VectorNormalize( v ); + + if( iteration == 1 ) + VectorMA( up, 0.3, v, up ); + else + VectorMA( up, -0.3, v, up ); + + VectorNormalize( up ); + } + } + // do fading when moving towards the projection point onto the trail segment vector + else if( !( j->flags & TJFL_NOCULL ) && ( j->widthEnd > 4 || jNext->widthEnd > 4 ) ) + { + ProjectPointOntoVector( cg.refdef.vieworg, j->pos, jNext->pos, viewProj ); + viewDist = Distance( viewProj, cg.refdef.vieworg ); + + if( viewDist < ( TRAIL_FADE_CLOSE_DIST * TRAIL_FADE_FAR_SCALE ) ) + { + if( viewDist < TRAIL_FADE_CLOSE_DIST ) + fadeAlpha = 0.0; + else + fadeAlpha = ( viewDist - TRAIL_FADE_CLOSE_DIST ) / ( TRAIL_FADE_CLOSE_DIST * TRAIL_FADE_FAR_SCALE ); + + if( fadeAlpha < j->alpha ) + j->alpha = fadeAlpha; + + if( fadeAlpha < jNext->alpha ) + jNext->alpha = fadeAlpha; + } + } + + // now output the QUAD for this segment + + // 1 ---- + VectorMA( j->pos, 0.5 * j->width, up, p ); + VectorCopy( p, verts[ i ].xyz ); + verts[ i ].st[ 0 ] = s; + verts[ i ].st[ 1 ] = 1.0; + + for( k = 0; k < 3; k++ ) + verts[ i ].modulate[ k ] = (unsigned char)( j->color[ k ] * 255.0 ); + + verts[ i ].modulate[ 3 ] = (unsigned char)( j->alpha * 255.0 ); + + // blend this with the previous junc + if( j != trail ) + { + VectorAdd( verts[ i ].xyz, verts[ i - 1 ].xyz, verts[ i ].xyz ); + VectorScale( verts[ i ].xyz, 0.5, verts[ i ].xyz ); + VectorCopy( verts[ i ].xyz, verts[ i - 1 ].xyz ); + } + else if( j->flags & TJFL_FADEIN ) + verts[ i ].modulate[ 3 ] = 0; // fade in + + i++; + + // 2 ---- + VectorMA( p, -1 * j->width, up, p ); + VectorCopy( p, verts[ i ].xyz ); + verts[ i ].st[ 0 ] = s; + verts[ i ].st[ 1 ] = 0.0; + + for( k = 0; k < 3; k++ ) + verts[ i ].modulate[ k ] = (unsigned char)( j->color[ k ] * 255.0 ); + + verts[ i ].modulate[ 3 ] = (unsigned char)( j->alpha * 255.0 ); + + // blend this with the previous junc + if( j != trail ) + { + VectorAdd( verts[ i ].xyz, verts[ i - 3 ].xyz, verts[ i ].xyz ); + VectorScale( verts[ i ].xyz, 0.5, verts[ i ].xyz ); + VectorCopy( verts[ i ].xyz, verts[ i - 3 ].xyz ); + } + else if( j->flags & TJFL_FADEIN ) + verts[ i ].modulate[ 3 ] = 0; // fade in + + i++; + + if( trail->sType == STYPE_REPEAT ) + s = jNext->sTex; + else + { + //s += sInc; + s += VectorDistance( j->pos, jNext->pos ) / sInc; + if( s > 1.0 ) + s = 1.0; + } + + // 3 ---- + VectorMA( jNext->pos, -0.5 * jNext->width, up, p ); + VectorCopy( p, verts[ i ].xyz ); + verts[ i ].st[ 0 ] = s; + verts[ i ].st[ 1 ] = 0.0; + + for( k = 0; k < 3; k++ ) + verts[ i ].modulate[ k ] = (unsigned char)( jNext->color[ k ] * 255.0 ); + + verts[ i ].modulate[ 3 ] = (unsigned char)( jNext->alpha * 255.0 ); + i++; + + // 4 ---- + VectorMA( p, jNext->width, up, p ); + VectorCopy( p, verts[ i ].xyz ); + verts[ i ].st[ 0 ] = s; + verts[ i ].st[ 1 ] = 1.0; + + for( k = 0; k < 3; k++ ) + verts[ i ].modulate[ k ] = (unsigned char)( jNext->color[ k ] * 255.0 ); + + verts[ i ].modulate[ 3 ] = (unsigned char)( jNext->alpha * 255.0 ); + i++; + + if( i + 4 > MAX_TRAIL_VERTS ) + break; + + j = jNext; + jNext = j->nextJunc; + } + + if( trail->flags & TJFL_FIXDISTORT ) + { + // build the list of outVerts, by dividing up the QUAD's into 4 Tri's each, so as to allow + // any shaped (convex) Quad without bilinear distortion + for( k = 0, numOutVerts = 0; k < i; k += 4 ) + { + VectorCopy( verts[ k ].xyz, mid.xyz ); + mid.st[ 0 ] = verts[ k ].st[ 0 ]; + mid.st[ 1 ] = verts[ k ].st[ 1 ]; + + for( l = 0; l < 4; l++ ) + mod[ l ] = (float)verts[ k ].modulate[ l ]; + + for( n = 1; n < 4; n++ ) + { + VectorAdd( verts[ k + n ].xyz, mid.xyz, mid.xyz ); + mid.st[ 0 ] += verts[ k + n ].st[ 0 ]; + mid.st[ 1 ] += verts[ k + n ].st[ 1 ]; + + for( l = 0; l < 4; l++ ) + mod[ l ] += (float)verts[ k + n ].modulate[ l ]; + } + + VectorScale( mid.xyz, 0.25, mid.xyz ); + mid.st[ 0 ] *= 0.25; + mid.st[ 1 ] *= 0.25; + + for( l = 0; l < 4; l++ ) + mid.modulate[ l ] = (unsigned char)( mod[ l ] / 4.0 ); + + // now output the tri's + for( n = 0; n < 4; n++ ) + { + outVerts[ numOutVerts++ ] = verts[ k + n ]; + outVerts[ numOutVerts++ ] = mid; + + if( n < 3 ) + outVerts[ numOutVerts++ ] = verts[ k + n + 1 ]; + else + outVerts[ numOutVerts++ ] = verts[ k ]; + } + + } + + if( !( trail->flags & TJFL_NOPOLYMERGE ) ) + trap_R_AddPolysToScene( trail->shader, 3, &outVerts[ 0 ], numOutVerts / 3 ); + else + { + int k; + + for( k = 0; k < numOutVerts / 3; k++ ) + trap_R_AddPolyToScene( trail->shader, 3, &outVerts[ k * 3 ] ); + } + } + else + { + // send the polygons + // FIXME: is it possible to send a GL_STRIP here? We are actually sending 2x the verts we really need to + if( !( trail->flags & TJFL_NOPOLYMERGE ) ) + trap_R_AddPolysToScene( trail->shader, 4, &verts[ 0 ], i / 4 ); + else + { + int k; + + for( k = 0; k < i / 4; k++ ) + trap_R_AddPolyToScene( trail->shader, 4, &verts[ k * 4 ] ); + } + } + + // do we need to make another pass? + if( trail->flags & TJFL_CROSSOVER ) + { + if( iteration < 2 ) + CG_AddTrailToScene( trail, iteration + 1, numJuncs ); + } } @@ -677,52 +749,68 @@ void CG_AddTrailToScene( trailJunc_t *trail, int iteration, int numJuncs ) CG_AddTrails =============== */ -void CG_AddTrails(void) +void CG_AddTrails( void ) { - float lifeFrac; - trailJunc_t *j, *jNext; - - if (!initTrails) { - CG_ClearTrails(); - } - - //AngleVectors( cg.snap->ps.viewangles, vforward, vright, vup ); - VectorCopy( cg.refdef.viewaxis[0], vforward ); - VectorCopy( cg.refdef.viewaxis[1], vright ); - VectorCopy( cg.refdef.viewaxis[2], vup ); - - // update the settings for each junc - j = activeTrails; - while (j) { - lifeFrac = (float)(cg.time - j->spawnTime) / (float)(j->endTime - j->spawnTime); - if (lifeFrac >= 1.0) { - j->inuse = qfalse; // flag it as dead - j->width = j->widthEnd; - j->alpha = j->alphaEnd; - if (j->alpha > 1.0) j->alpha = 1.0; - else if (j->alpha < 0.0) j->alpha = 0.0; - VectorCopy( j->colorEnd, j->color ); - } else { - j->width = j->widthStart + (j->widthEnd - j->widthStart) * lifeFrac; - j->alpha = j->alphaStart + (j->alphaEnd - j->alphaStart) * lifeFrac; - if (j->alpha > 1.0) j->alpha = 1.0; - else if (j->alpha < 0.0) j->alpha = 0.0; - VectorSubtract( j->colorEnd, j->colorStart, j->color ); - VectorMA( j->colorStart, lifeFrac, j->color, j->color ); - } - - j = j->nextGlobal; - } - - // draw the trailHeads - j = headTrails; - while (j) { - jNext = j->nextHead; // in case it gets removed - if (!j->inuse) { - CG_FreeTrailJunc(j); - } else { - CG_AddTrailToScene( j, 0, 0 ); - } - j = jNext; - } + float lifeFrac; + trailJunc_t *j, *jNext; + + if( !initTrails ) + CG_ClearTrails( ); + + //AngleVectors( cg.snap->ps.viewangles, vforward, vright, vup ); + VectorCopy( cg.refdef.viewaxis[ 0 ], vforward ); + VectorCopy( cg.refdef.viewaxis[ 1 ], vright ); + VectorCopy( cg.refdef.viewaxis[ 2 ], vup ); + + // update the settings for each junc + j = activeTrails; + + while( j ) + { + lifeFrac = (float)( cg.time - j->spawnTime ) / (float)( j->endTime - j->spawnTime ); + + if( lifeFrac >= 1.0 ) + { + j->inuse = qfalse; // flag it as dead + j->width = j->widthEnd; + j->alpha = j->alphaEnd; + + if( j->alpha > 1.0 ) + j->alpha = 1.0; + else if( j->alpha < 0.0 ) + j->alpha = 0.0; + + VectorCopy( j->colorEnd, j->color ); + } + else + { + j->width = j->widthStart + ( j->widthEnd - j->widthStart ) * lifeFrac; + j->alpha = j->alphaStart + ( j->alphaEnd - j->alphaStart ) * lifeFrac; + + if( j->alpha > 1.0 ) + j->alpha = 1.0; + else if( j->alpha < 0.0 ) + j->alpha = 0.0; + + VectorSubtract( j->colorEnd, j->colorStart, j->color ); + VectorMA( j->colorStart, lifeFrac, j->color, j->color ); + } + + j = j->nextGlobal; + } + + // draw the trailHeads + j = headTrails; + + while( j ) + { + jNext = j->nextHead; // in case it gets removed + + if( !j->inuse ) + CG_FreeTrailJunc( j ); + else + CG_AddTrailToScene( j, 0, 0 ); + + j = jNext; + } } diff --git a/src/cgame/cg_view.c b/src/cgame/cg_view.c index 6c5d2ad3..afe9c979 100644 --- a/src/cgame/cg_view.c +++ b/src/cgame/cg_view.c @@ -62,32 +62,36 @@ Creates an entity in front of the current position, which can then be moved around ================= */ -void CG_TestModel_f (void) { +void CG_TestModel_f( void ) +{ vec3_t angles; - memset( &cg.testModelEntity, 0, sizeof(cg.testModelEntity) ); - if ( trap_Argc() < 2 ) { + memset( &cg.testModelEntity, 0, sizeof( cg.testModelEntity ) ); + + if( trap_Argc( ) < 2 ) return; - } - Q_strncpyz (cg.testModelName, CG_Argv( 1 ), MAX_QPATH ); + Q_strncpyz( cg.testModelName, CG_Argv( 1 ), MAX_QPATH ); cg.testModelEntity.hModel = trap_R_RegisterModel( cg.testModelName ); - if ( trap_Argc() == 3 ) { + if( trap_Argc( ) == 3 ) + { cg.testModelEntity.backlerp = atof( CG_Argv( 2 ) ); cg.testModelEntity.frame = 1; cg.testModelEntity.oldframe = 0; } - if (! cg.testModelEntity.hModel ) { + + if( !cg.testModelEntity.hModel ) + { CG_Printf( "Can't register model\n" ); return; } - VectorMA( cg.refdef.vieworg, 100, cg.refdef.viewaxis[0], cg.testModelEntity.origin ); + VectorMA( cg.refdef.vieworg, 100, cg.refdef.viewaxis[ 0 ], cg.testModelEntity.origin ); - angles[PITCH] = 0; - angles[YAW] = 180 + cg.refdefViewAngles[1]; - angles[ROLL] = 0; + angles[ PITCH ] = 0; + angles[ YAW ] = 180 + cg.refdefViewAngles[ 1 ]; + angles[ ROLL ] = 0; AnglesToAxis( angles, cg.testModelEntity.axis ); cg.testGun = qfalse; @@ -100,61 +104,73 @@ CG_TestGun_f Replaces the current view weapon with the given model ================= */ -void CG_TestGun_f (void) { - CG_TestModel_f(); +void CG_TestGun_f( void ) +{ + CG_TestModel_f( ); cg.testGun = qtrue; cg.testModelEntity.renderfx = RF_MINLIGHT | RF_DEPTHHACK | RF_FIRST_PERSON; } -void CG_TestModelNextFrame_f (void) { +void CG_TestModelNextFrame_f( void ) +{ cg.testModelEntity.frame++; CG_Printf( "frame %i\n", cg.testModelEntity.frame ); } -void CG_TestModelPrevFrame_f (void) { +void CG_TestModelPrevFrame_f( void ) +{ cg.testModelEntity.frame--; - if ( cg.testModelEntity.frame < 0 ) { + + if( cg.testModelEntity.frame < 0 ) cg.testModelEntity.frame = 0; - } + CG_Printf( "frame %i\n", cg.testModelEntity.frame ); } -void CG_TestModelNextSkin_f (void) { +void CG_TestModelNextSkin_f( void ) +{ cg.testModelEntity.skinNum++; CG_Printf( "skin %i\n", cg.testModelEntity.skinNum ); } -void CG_TestModelPrevSkin_f (void) { +void CG_TestModelPrevSkin_f( void ) +{ cg.testModelEntity.skinNum--; - if ( cg.testModelEntity.skinNum < 0 ) { + + if( cg.testModelEntity.skinNum < 0 ) cg.testModelEntity.skinNum = 0; - } + CG_Printf( "skin %i\n", cg.testModelEntity.skinNum ); } -static void CG_AddTestModel (void) { +static void CG_AddTestModel( void ) +{ int i; // re-register the model, because the level may have changed cg.testModelEntity.hModel = trap_R_RegisterModel( cg.testModelName ); - if (! cg.testModelEntity.hModel ) { + + if( ! cg.testModelEntity.hModel ) + { CG_Printf ("Can't register model\n"); return; } // if testing a gun, set the origin reletive to the view origin - if ( cg.testGun ) { + if( cg.testGun ) + { VectorCopy( cg.refdef.vieworg, cg.testModelEntity.origin ); - VectorCopy( cg.refdef.viewaxis[0], cg.testModelEntity.axis[0] ); - VectorCopy( cg.refdef.viewaxis[1], cg.testModelEntity.axis[1] ); - VectorCopy( cg.refdef.viewaxis[2], cg.testModelEntity.axis[2] ); + VectorCopy( cg.refdef.viewaxis[ 0 ], cg.testModelEntity.axis[ 0 ] ); + VectorCopy( cg.refdef.viewaxis[ 1 ], cg.testModelEntity.axis[ 1 ] ); + VectorCopy( cg.refdef.viewaxis[ 2 ], cg.testModelEntity.axis[ 2 ] ); // allow the position to be adjusted - for (i=0 ; i<3 ; i++) { - cg.testModelEntity.origin[i] += cg.refdef.viewaxis[0][i] * cg_gun_x.value; - cg.testModelEntity.origin[i] += cg.refdef.viewaxis[1][i] * cg_gun_y.value; - cg.testModelEntity.origin[i] += cg.refdef.viewaxis[2][i] * cg_gun_z.value; + for( i = 0; i < 3; i++ ) + { + cg.testModelEntity.origin[ i ] += cg.refdef.viewaxis[ 0 ][ i ] * cg_gun_x.value; + cg.testModelEntity.origin[ i ] += cg.refdef.viewaxis[ 1 ][ i ] * cg_gun_y.value; + cg.testModelEntity.origin[ i ] += cg.refdef.viewaxis[ 2 ][ i ] * cg_gun_z.value; } } @@ -173,33 +189,38 @@ CG_CalcVrect Sets the coordinates of the rendered window ================= */ -static void CG_CalcVrect (void) { +static void CG_CalcVrect( void ) +{ int size; // the intermission should allways be full screen - if ( cg.snap->ps.pm_type == PM_INTERMISSION ) { + if( cg.snap->ps.pm_type == PM_INTERMISSION ) size = 100; - } else { + else + { // bound normal viewsize - if (cg_viewsize.integer < 30) { - trap_Cvar_Set ("cg_viewsize","30"); + if( cg_viewsize.integer < 30 ) + { + trap_Cvar_Set( "cg_viewsize", "30" ); size = 30; - } else if (cg_viewsize.integer > 100) { - trap_Cvar_Set ("cg_viewsize","100"); + } + else if( cg_viewsize.integer > 100 ) + { + trap_Cvar_Set( "cg_viewsize","100" ); size = 100; - } else { - size = cg_viewsize.integer; } - + else + size = cg_viewsize.integer; } - cg.refdef.width = cgs.glconfig.vidWidth*size/100; + + cg.refdef.width = cgs.glconfig.vidWidth * size / 100; cg.refdef.width &= ~1; - cg.refdef.height = cgs.glconfig.vidHeight*size/100; + cg.refdef.height = cgs.glconfig.vidHeight * size / 100; cg.refdef.height &= ~1; - cg.refdef.x = (cgs.glconfig.vidWidth - cg.refdef.width)/2; - cg.refdef.y = (cgs.glconfig.vidHeight - cg.refdef.height)/2; + cg.refdef.x = ( cgs.glconfig.vidWidth - cg.refdef.width ) / 2; + cg.refdef.y = ( cgs.glconfig.vidHeight - cg.refdef.height ) / 2; } //============================================================================== @@ -328,7 +349,7 @@ static void CG_StepOffset( void ) if( ps->stats[ STAT_STATE ] & SS_WALLCLIMBING ) VectorMA( cg.refdef.vieworg, -stepChange, normal, cg.refdef.vieworg ); else - cg.refdef.vieworg[2] -= stepChange; + cg.refdef.vieworg[ 2 ] -= stepChange; } } @@ -345,17 +366,18 @@ CG_OffsetFirstPersonView =============== */ -static void CG_OffsetFirstPersonView( void ) { - float *origin; - float *angles; - float bob; - float ratio; - float delta; - float speed; - float f; - vec3_t predictedVelocity; - int timeDelta; - float bob2; +static void CG_OffsetFirstPersonView( void ) +{ + float *origin; + float *angles; + float bob; + float ratio; + float delta; + float speed; + float f; + vec3_t predictedVelocity; + int timeDelta; + float bob2; vec3_t normal, baseOrigin; playerState_t *ps = &cg.predictedPlayerState; @@ -370,9 +392,8 @@ static void CG_OffsetFirstPersonView( void ) { VectorSet( normal, 0.0f, 0.0f, 1.0f ); - if ( cg.snap->ps.pm_type == PM_INTERMISSION ) { + if( cg.snap->ps.pm_type == PM_INTERMISSION ) return; - } origin = cg.refdef.vieworg; angles = cg.refdefViewAngles; @@ -380,29 +401,35 @@ static void CG_OffsetFirstPersonView( void ) { VectorCopy( origin, baseOrigin ); // if dead, fix the angle and don't add any kick - if ( cg.snap->ps.stats[STAT_HEALTH] <= 0 ) { - angles[ROLL] = 40; - angles[PITCH] = -15; - angles[YAW] = cg.snap->ps.generic1; - origin[2] += cg.predictedPlayerState.viewheight; + if( cg.snap->ps.stats[ STAT_HEALTH ] <= 0 ) + { + angles[ ROLL ] = 40; + angles[ PITCH ] = -15; + angles[ YAW ] = cg.snap->ps.generic1; + origin[ 2 ] += cg.predictedPlayerState.viewheight; return; } // add angles based on weapon kick - VectorAdd (angles, cg.kick_angles, angles); + VectorAdd( angles, cg.kick_angles, angles ); // add angles based on damage kick - if ( cg.damageTime ) { + if( cg.damageTime ) + { ratio = cg.time - cg.damageTime; - if ( ratio < DAMAGE_DEFLECT_TIME ) { + if( ratio < DAMAGE_DEFLECT_TIME ) + { ratio /= DAMAGE_DEFLECT_TIME; - angles[PITCH] += ratio * cg.v_dmg_pitch; - angles[ROLL] += ratio * cg.v_dmg_roll; - } else { + angles[ PITCH ] += ratio * cg.v_dmg_pitch; + angles[ ROLL ] += ratio * cg.v_dmg_roll; + } + else + { ratio = 1.0 - ( ratio - DAMAGE_DEFLECT_TIME ) / DAMAGE_RETURN_TIME; - if ( ratio > 0 ) { - angles[PITCH] += ratio * cg.v_dmg_pitch; - angles[ROLL] += ratio * cg.v_dmg_roll; + if( ratio > 0 ) + { + angles[ PITCH ] += ratio * cg.v_dmg_pitch; + angles[ ROLL ] += ratio * cg.v_dmg_roll; } } } @@ -418,11 +445,11 @@ static void CG_OffsetFirstPersonView( void ) { // add angles based on velocity VectorCopy( cg.predictedPlayerState.velocity, predictedVelocity ); - delta = DotProduct ( predictedVelocity, cg.refdef.viewaxis[0]); - angles[PITCH] += delta * cg_runpitch.value; + delta = DotProduct( predictedVelocity, cg.refdef.viewaxis[ 0 ] ); + angles[ PITCH ] += delta * cg_runpitch.value; - delta = DotProduct ( predictedVelocity, cg.refdef.viewaxis[1]); - angles[ROLL] -= delta * cg_runroll.value; + delta = DotProduct( predictedVelocity, cg.refdef.viewaxis[ 1 ] ); + angles[ ROLL ] -= delta * cg_runroll.value; // add angles based on bob //TA: bob amount is class dependant @@ -433,15 +460,18 @@ static void CG_OffsetFirstPersonView( void ) { speed = cg.xyspeed > 200 ? cg.xyspeed : 200; delta = cg.bobfracsin * ( bob2 ) * speed; - if (cg.predictedPlayerState.pm_flags & PMF_DUCKED) + if( cg.predictedPlayerState.pm_flags & PMF_DUCKED ) delta *= 3; // crouching - angles[PITCH] += delta; + + angles[ PITCH ] += delta; delta = cg.bobfracsin * ( bob2 ) * speed; - if (cg.predictedPlayerState.pm_flags & PMF_DUCKED) + if( cg.predictedPlayerState.pm_flags & PMF_DUCKED ) delta *= 3; // crouching accentuates roll - if (cg.bobcycle & 1) + + if( cg.bobcycle & 1 ) delta = -delta; - angles[ROLL] += delta; + + angles[ ROLL ] += delta; } //provide some feedback for pouncing @@ -665,77 +695,68 @@ static void CG_OffsetFirstPersonView( void ) { if( cg.predictedPlayerState.stats[ STAT_STATE ] & SS_WALLCLIMBING ) VectorMA( origin, ps->viewheight, normal, origin ); else - origin[2] += cg.predictedPlayerState.viewheight; + origin[ 2 ] += cg.predictedPlayerState.viewheight; // smooth out duck height changes timeDelta = cg.time - cg.duckTime; - if ( timeDelta < DUCK_TIME) { - cg.refdef.vieworg[2] -= cg.duckChange - * (DUCK_TIME - timeDelta) / DUCK_TIME; + if( timeDelta < DUCK_TIME) + { + cg.refdef.vieworg[ 2 ] -= cg.duckChange + * ( DUCK_TIME - timeDelta ) / DUCK_TIME; } // add bob height bob = cg.bobfracsin * cg.xyspeed * cg_bobup.value; - if (bob > 6) { + + if( bob > 6 ) bob = 6; - } //TA: likewise for bob if( cg.predictedPlayerState.stats[ STAT_STATE ] & SS_WALLCLIMBING ) VectorMA( origin, bob, normal, origin ); else - origin[2] += bob; + origin[ 2 ] += bob; // add fall height delta = cg.time - cg.landTime; + if( delta < LAND_DEFLECT_TIME ) { f = delta / LAND_DEFLECT_TIME; - cg.refdef.vieworg[2] += cg.landChange * f; + cg.refdef.vieworg[ 2 ] += cg.landChange * f; } else if( delta < LAND_DEFLECT_TIME + LAND_RETURN_TIME ) { delta -= LAND_DEFLECT_TIME; f = 1.0 - ( delta / LAND_RETURN_TIME ); - cg.refdef.vieworg[2] += cg.landChange * f; + cg.refdef.vieworg[ 2 ] += cg.landChange * f; } // add step offset - CG_StepOffset(); + CG_StepOffset( ); // add kick offset VectorAdd (origin, cg.kick_origin, origin); - - // pivot the eye based on a neck length -#if 0 - { -#define NECK_LENGTH 8 - vec3_t forward, up; - - cg.refdef.vieworg[2] -= NECK_LENGTH; - AngleVectors( cg.refdefViewAngles, forward, NULL, up ); - VectorMA( cg.refdef.vieworg, 3, forward, cg.refdef.vieworg ); - VectorMA( cg.refdef.vieworg, NECK_LENGTH, up, cg.refdef.vieworg ); - } -#endif } //====================================================================== -void CG_ZoomDown_f( void ) { - if ( cg.zoomed ) { +void CG_ZoomDown_f( void ) +{ + if( cg.zoomed ) return; - } + cg.zoomed = qtrue; cg.zoomTime = cg.time; } -void CG_ZoomUp_f( void ) { - if ( !cg.zoomed ) { +void CG_ZoomUp_f( void ) +{ + if( !cg.zoomed ) return; - } + cg.zoomed = qfalse; cg.zoomTime = cg.time; } @@ -753,7 +774,8 @@ Fixed fov at intermissions, otherwise account for fov variable and zooms. #define FOVWARPTIME 400.0 -static int CG_CalcFov( void ) { +static int CG_CalcFov( void ) +{ float x; float phase; float v; @@ -768,7 +790,8 @@ static int CG_CalcFov( void ) { attribFov = BG_FindFovForClass( cg.predictedPlayerState.stats[ STAT_PCLASS ] ); - if ( cg.predictedPlayerState.pm_type == PM_INTERMISSION ) { + if( cg.predictedPlayerState.pm_type == PM_INTERMISSION ) + { // if in intermission, use a fixed value fov_x = 90; } @@ -832,16 +855,17 @@ static int CG_CalcFov( void ) { // warp if underwater contents = CG_PointContents( cg.refdef.vieworg, -1 ); - if ( contents & ( CONTENTS_WATER | CONTENTS_SLIME | CONTENTS_LAVA ) ){ + + if( contents & ( CONTENTS_WATER | CONTENTS_SLIME | CONTENTS_LAVA ) ) + { phase = cg.time / 1000.0 * WAVE_FREQUENCY * M_PI * 2; v = WAVE_AMPLITUDE * sin( phase ); fov_x += v; fov_y -= v; inwater = qtrue; } - else { + else inwater = qfalse; - } if( cg.predictedPlayerState.stats[ STAT_STATE ] & SS_POISONCLOUDED && cg.predictedPlayerState.stats[ STAT_HEALTH ] > 0 ) @@ -858,11 +882,10 @@ static int CG_CalcFov( void ) { cg.refdef.fov_x = fov_x; cg.refdef.fov_y = fov_y; - if ( !cg.zoomed ) { + if( !cg.zoomed ) cg.zoomSensitivity = 1; - } else { + else cg.zoomSensitivity = cg.refdef.fov_y / 75.0; - } return inwater; } @@ -875,41 +898,40 @@ CG_DamageBlendBlob =============== */ -static void CG_DamageBlendBlob( void ) { - int t; - int maxTime; - refEntity_t ent; +static void CG_DamageBlendBlob( void ) +{ + int t; + int maxTime; + refEntity_t ent; - if ( !cg.damageValue ) { + if( !cg.damageValue ) return; - } // ragePro systems can't fade blends, so don't obscure the screen - if ( cgs.glconfig.hardwareType == GLHW_RAGEPRO ) { + if( cgs.glconfig.hardwareType == GLHW_RAGEPRO ) return; - } maxTime = DAMAGE_TIME; t = cg.time - cg.damageTime; - if ( t <= 0 || t >= maxTime ) { + + if( t <= 0 || t >= maxTime ) return; - } memset( &ent, 0, sizeof( ent ) ); ent.reType = RT_SPRITE; ent.renderfx = RF_FIRST_PERSON; - VectorMA( cg.refdef.vieworg, 8, cg.refdef.viewaxis[0], ent.origin ); - VectorMA( ent.origin, cg.damageX * -8, cg.refdef.viewaxis[1], ent.origin ); - VectorMA( ent.origin, cg.damageY * 8, cg.refdef.viewaxis[2], ent.origin ); + VectorMA( cg.refdef.vieworg, 8, cg.refdef.viewaxis[ 0 ], ent.origin ); + VectorMA( ent.origin, cg.damageX * -8, cg.refdef.viewaxis[ 1 ], ent.origin ); + VectorMA( ent.origin, cg.damageY * 8, cg.refdef.viewaxis[ 2 ], ent.origin ); ent.radius = cg.damageValue * 3; ent.customShader = cgs.media.viewBloodShader; - ent.shaderRGBA[0] = 255; - ent.shaderRGBA[1] = 255; - ent.shaderRGBA[2] = 255; - ent.shaderRGBA[3] = 200 * ( 1.0 - ((float)t / maxTime) ); + ent.shaderRGBA[ 0 ] = 255; + ent.shaderRGBA[ 1 ] = 255; + ent.shaderRGBA[ 2 ] = 255; + ent.shaderRGBA[ 3 ] = 200 * ( 1.0 - ( (float)t / maxTime) ); trap_R_AddRefEntityToScene( &ent ); } @@ -934,41 +956,41 @@ static void CG_DrawSurfNormal( void ) CG_Trace( &tr, cg.refdef.vieworg, NULL, NULL, end, cg.predictedPlayerState.clientNum, MASK_SOLID ); //CG_Printf( "%f %f %f\n", tr.plane.normal[ 0 ], tr.plane.normal[ 1 ], tr.plane.normal[ 2 ] ); - VectorCopy( tr.endpos, normal[0].xyz ); - normal[0].st[0] = 0; - normal[0].st[1] = 0; - normal[0].modulate[0] = 255; - normal[0].modulate[1] = 255; - normal[0].modulate[2] = 255; - normal[0].modulate[3] = 255; + VectorCopy( tr.endpos, normal[ 0 ].xyz ); + normal[ 0 ].st[ 0 ] = 0; + normal[ 0 ].st[ 1 ] = 0; + normal[ 0 ].modulate[ 0 ] = 255; + normal[ 0 ].modulate[ 1 ] = 255; + normal[ 0 ].modulate[ 2 ] = 255; + normal[ 0 ].modulate[ 3 ] = 255; VectorAdd( up, tr.endpos, temp ); - VectorCopy( temp, normal[1].xyz); - normal[1].st[0] = 0; - normal[1].st[1] = 1; - normal[1].modulate[0] = 255; - normal[1].modulate[1] = 255; - normal[1].modulate[2] = 255; - normal[1].modulate[3] = 255; + VectorCopy( temp, normal[ 1 ].xyz); + normal[ 1 ].st[ 0 ] = 0; + normal[ 1 ].st[ 1 ] = 1; + normal[ 1 ].modulate[ 0 ] = 255; + normal[ 1 ].modulate[ 1 ] = 255; + normal[ 1 ].modulate[ 2 ] = 255; + normal[ 1 ].modulate[ 3 ] = 255; VectorMA( tr.endpos, 64, tr.plane.normal, temp ); VectorAdd( temp, up, temp ); - VectorCopy( temp, normal[2].xyz ); - normal[2].st[0] = 1; - normal[2].st[1] = 1; - normal[2].modulate[0] = 255; - normal[2].modulate[1] = 255; - normal[2].modulate[2] = 255; - normal[2].modulate[3] = 255; + VectorCopy( temp, normal[ 2 ].xyz ); + normal[ 2 ].st[ 0 ] = 1; + normal[ 2 ].st[ 1 ] = 1; + normal[ 2 ].modulate[ 0 ] = 255; + normal[ 2 ].modulate[ 1 ] = 255; + normal[ 2 ].modulate[ 2 ] = 255; + normal[ 2 ].modulate[ 3 ] = 255; VectorMA( tr.endpos, 64, tr.plane.normal, temp ); - VectorCopy( temp, normal[3].xyz ); - normal[3].st[0] = 1; - normal[3].st[1] = 0; - normal[3].modulate[0] = 255; - normal[3].modulate[1] = 255; - normal[3].modulate[2] = 255; - normal[3].modulate[3] = 255; + VectorCopy( temp, normal[ 3 ].xyz ); + normal[ 3 ].st[ 0 ] = 1; + normal[ 3 ].st[ 1 ] = 0; + normal[ 3 ].modulate[ 0 ] = 255; + normal[ 3 ].modulate[ 1 ] = 255; + normal[ 3 ].modulate[ 2 ] = 255; + normal[ 3 ].modulate[ 3 ] = 255; trap_R_AddPolyToScene( cgs.media.whiteShader, 4, normal ); } @@ -1096,7 +1118,8 @@ CG_CalcViewValues Sets cg.refdef view values =============== */ -static int CG_CalcViewValues( void ) { +static int CG_CalcViewValues( void ) +{ playerState_t *ps; memset( &cg.refdef, 0, sizeof( cg.refdef ) ); @@ -1106,22 +1129,24 @@ static int CG_CalcViewValues( void ) { // Q_strncpyz( cg.refdef.text[1], "19", sizeof(cg.refdef.text[1]) ); // calculate size of 3D view - CG_CalcVrect(); + CG_CalcVrect( ); ps = &cg.predictedPlayerState; // intermission view - if ( ps->pm_type == PM_INTERMISSION ) { + if( ps->pm_type == PM_INTERMISSION ) + { VectorCopy( ps->origin, cg.refdef.vieworg ); VectorCopy( ps->viewangles, cg.refdefViewAngles ); AnglesToAxis( cg.refdefViewAngles, cg.refdef.viewaxis ); - return CG_CalcFov(); + + return CG_CalcFov( ); } cg.bobcycle = ( ps->bobCycle & 128 ) >> 7; cg.bobfracsin = fabs( sin( ( ps->bobCycle & 127 ) / 127.0 * M_PI ) ); - cg.xyspeed = sqrt( ps->velocity[0] * ps->velocity[0] + - ps->velocity[1] * ps->velocity[1] ); + cg.xyspeed = sqrt( ps->velocity[ 0 ] * ps->velocity[ 0 ] + + ps->velocity[ 1 ] * ps->velocity[ 1 ] ); VectorCopy( ps->origin, cg.refdef.vieworg ); @@ -1133,72 +1158,44 @@ static int CG_CalcViewValues( void ) { if( !( ps->stats[ STAT_STATE ] & SS_WALLCLIMBING ) ) VectorSet( cg.lastNormal, 0.0f, 0.0f, 1.0f ); - if (cg_cameraOrbit.integer) { - if (cg.time > cg.nextOrbitTime) { - cg.nextOrbitTime = cg.time + cg_cameraOrbitDelay.integer; - cg_thirdPersonAngle.value += cg_cameraOrbit.value; - } - } // add error decay - if ( cg_errorDecay.value > 0 ) { + if( cg_errorDecay.value > 0 ) + { int t; float f; t = cg.time - cg.predictedErrorTime; f = ( cg_errorDecay.value - t ) / cg_errorDecay.value; - if ( f > 0 && f < 1 ) { + + if( f > 0 && f < 1 ) VectorMA( cg.refdef.vieworg, f, cg.predictedError, cg.refdef.vieworg ); - } else { + else cg.predictedErrorTime = 0; - } } - if ( cg.renderingThirdPerson ) { + if( cg.renderingThirdPerson ) + { // back away from character - CG_OffsetThirdPersonView(); - } else { + CG_OffsetThirdPersonView( ); + } + else + { // offset for local bobbing and kicks - CG_OffsetFirstPersonView(); + CG_OffsetFirstPersonView( ); } // position eye reletive to origin AnglesToAxis( cg.refdefViewAngles, cg.refdef.viewaxis ); - if ( cg.hyperspace ) { + if( cg.hyperspace ) cg.refdef.rdflags |= RDF_NOWORLDMODEL | RDF_HYPERSPACE; - } //draw the surface normal looking at if( cg_drawSurfNormal.integer ) CG_DrawSurfNormal( ); // field of view - return CG_CalcFov(); -} - - -/* -===================== -CG_PowerupTimerSounds -===================== -*/ -static void CG_PowerupTimerSounds( void ) { - int i; - int t; - - // powerup timers going away - for ( i = 0 ; i < MAX_POWERUPS ; i++ ) { - t = cg.snap->ps.powerups[i]; - if ( t <= cg.time ) { - continue; - } - if ( t - cg.time >= POWERUP_BLINKS * POWERUP_BLINK_TIME ) { - continue; - } - if ( ( t - cg.time ) / POWERUP_BLINK_TIME != ( t - cg.oldTime ) / POWERUP_BLINK_TIME ) { - trap_S_StartSound( NULL, cg.snap->ps.clientNum, CHAN_ITEM, cgs.media.wearOffSound ); - } - } + return CG_CalcFov( ); } /* @@ -1206,14 +1203,16 @@ static void CG_PowerupTimerSounds( void ) { CG_AddBufferedSound ===================== */ -void CG_AddBufferedSound( sfxHandle_t sfx ) { - if ( !sfx ) +void CG_AddBufferedSound( sfxHandle_t sfx ) +{ + if( !sfx ) return; - cg.soundBuffer[cg.soundBufferIn] = sfx; - cg.soundBufferIn = (cg.soundBufferIn + 1) % MAX_SOUNDBUFFER; - if (cg.soundBufferIn == cg.soundBufferOut) { + + cg.soundBuffer[ cg.soundBufferIn ] = sfx; + cg.soundBufferIn = ( cg.soundBufferIn + 1 ) % MAX_SOUNDBUFFER; + + if( cg.soundBufferIn == cg.soundBufferOut ) cg.soundBufferOut++; - } } /* @@ -1221,12 +1220,15 @@ void CG_AddBufferedSound( sfxHandle_t sfx ) { CG_PlayBufferedSounds ===================== */ -static void CG_PlayBufferedSounds( void ) { - if ( cg.soundTime < cg.time ) { - if (cg.soundBufferOut != cg.soundBufferIn && cg.soundBuffer[cg.soundBufferOut]) { - trap_S_StartLocalSound(cg.soundBuffer[cg.soundBufferOut], CHAN_ANNOUNCER); - cg.soundBuffer[cg.soundBufferOut] = 0; - cg.soundBufferOut = (cg.soundBufferOut + 1) % MAX_SOUNDBUFFER; +static void CG_PlayBufferedSounds( void ) +{ + if( cg.soundTime < cg.time ) + { + if( cg.soundBufferOut != cg.soundBufferIn && cg.soundBuffer[ cg.soundBufferOut ] ) + { + trap_S_StartLocalSound( cg.soundBuffer[ cg.soundBufferOut ], CHAN_ANNOUNCER ); + cg.soundBuffer[ cg.soundBufferOut ] = 0; + cg.soundBufferOut = ( cg.soundBufferOut + 1 ) % MAX_SOUNDBUFFER; cg.soundTime = cg.time + 750; } } @@ -1241,35 +1243,38 @@ CG_DrawActiveFrame Generates and draws a game scene and status information at the given time. ================= */ -void CG_DrawActiveFrame( int serverTime, stereoFrame_t stereoView, qboolean demoPlayback ) { +void CG_DrawActiveFrame( int serverTime, stereoFrame_t stereoView, qboolean demoPlayback ) +{ int inwater; cg.time = serverTime; cg.demoPlayback = demoPlayback; // update cvars - CG_UpdateCvars(); + CG_UpdateCvars( ); // if we are only updating the screen as a loading // pacifier, don't even try to read snapshots - if ( cg.infoScreenText[0] != 0 ) { + if( cg.infoScreenText[ 0 ] != 0 ) + { CG_DrawLoadingScreen( ); return; } // any looped sounds will be respecified as entities // are added to the render list - trap_S_ClearLoopingSounds(qfalse); + trap_S_ClearLoopingSounds( qfalse ); // clear all the render lists - trap_R_ClearScene(); + trap_R_ClearScene( ); // set up cg.snap and possibly cg.nextSnap - CG_ProcessSnapshots(); + CG_ProcessSnapshots( ); // if we haven't received any snapshots yet, all // we can draw is the information screen - if ( !cg.snap || ( cg.snap->snapFlags & SNAPFLAG_NOT_ACTIVE ) ) { + if( !cg.snap || ( cg.snap->snapFlags & SNAPFLAG_NOT_ACTIVE ) ) + { CG_DrawLoadingScreen( ); return; } @@ -1281,46 +1286,41 @@ void CG_DrawActiveFrame( int serverTime, stereoFrame_t stereoView, qboolean demo cg.clientFrame++; // update cg.predictedPlayerState - CG_PredictPlayerState(); + CG_PredictPlayerState( ); // decide on third person view - cg.renderingThirdPerson = cg_thirdPerson.integer || (cg.snap->ps.stats[STAT_HEALTH] <= 0); + cg.renderingThirdPerson = cg_thirdPerson.integer || ( cg.snap->ps.stats[ STAT_HEALTH ] <= 0 ); // build cg.refdef - inwater = CG_CalcViewValues(); + inwater = CG_CalcViewValues( ); // first person blend blobs, done after AnglesToAxis - if ( !cg.renderingThirdPerson ) { - CG_DamageBlendBlob(); - } + if( !cg.renderingThirdPerson ) + CG_DamageBlendBlob( ); // build the render lists - if ( !cg.hyperspace ) { - CG_AddPacketEntities(); // adter calcViewValues, so predicted player state is correct - CG_AddMarks(); - CG_AddLocalEntities(); + if( !cg.hyperspace ) + { + CG_AddPacketEntities( ); // adter calcViewValues, so predicted player state is correct + CG_AddMarks( ); + CG_AddLocalEntities( ); //TA: wolf trails stuff CG_AddTrails( ); // this must come last, so the trails dropped this frame get drawn } + CG_AddViewWeapon( &cg.predictedPlayerState ); // add buffered sounds - CG_PlayBufferedSounds(); - - // play buffered voice chats - CG_PlayBufferedVoiceChats(); + CG_PlayBufferedSounds( ); // finish up the rest of the refdef - if ( cg.testModelEntity.hModel ) { - CG_AddTestModel(); - } + if( cg.testModelEntity.hModel ) + CG_AddTestModel( ); + cg.refdef.time = cg.time; memcpy( cg.refdef.areamask, cg.snap->areamask, sizeof( cg.refdef.areamask ) ); - // warning sounds when powerup is wearing off - /*CG_PowerupTimerSounds();*/ - //remove expired console lines if( cg.consoleLines[ 0 ].time + cg_consoleLatency.integer < cg.time && cg_consoleLatency.integer > 0 ) CG_RemoveConsoleLine( ); @@ -1329,35 +1329,40 @@ void CG_DrawActiveFrame( int serverTime, stereoFrame_t stereoView, qboolean demo trap_S_Respatialize( cg.snap->ps.clientNum, cg.refdef.vieworg, cg.refdef.viewaxis, inwater ); // make sure the lagometerSample and frame timing isn't done twice when in stereo - if ( stereoView != STEREO_RIGHT ) { + if( stereoView != STEREO_RIGHT ) + { cg.frametime = cg.time - cg.oldTime; - if ( cg.frametime < 0 ) { + + if( cg.frametime < 0 ) cg.frametime = 0; - } + cg.oldTime = cg.time; - CG_AddLagometerFrameInfo(); + CG_AddLagometerFrameInfo( ); } - if (cg_timescale.value != cg_timescaleFadeEnd.value) { - if (cg_timescale.value < cg_timescaleFadeEnd.value) { - cg_timescale.value += cg_timescaleFadeSpeed.value * ((float)cg.frametime) / 1000; - if (cg_timescale.value > cg_timescaleFadeEnd.value) + + if( cg_timescale.value != cg_timescaleFadeEnd.value ) + { + if( cg_timescale.value < cg_timescaleFadeEnd.value ) + { + cg_timescale.value += cg_timescaleFadeSpeed.value * ( (float)cg.frametime ) / 1000; + if( cg_timescale.value > cg_timescaleFadeEnd.value ) cg_timescale.value = cg_timescaleFadeEnd.value; } - else { - cg_timescale.value -= cg_timescaleFadeSpeed.value * ((float)cg.frametime) / 1000; - if (cg_timescale.value < cg_timescaleFadeEnd.value) + else + { + cg_timescale.value -= cg_timescaleFadeSpeed.value * ( (float)cg.frametime ) / 1000; + if( cg_timescale.value < cg_timescaleFadeEnd.value ) cg_timescale.value = cg_timescaleFadeEnd.value; } - if (cg_timescaleFadeSpeed.value) { - trap_Cvar_Set("timescale", va("%f", cg_timescale.value)); - } + + if( cg_timescaleFadeSpeed.value ) + trap_Cvar_Set( "timescale", va( "%f", cg_timescale.value ) ); } // actually issue the rendering calls CG_DrawActive( stereoView ); - if ( cg_stats.integer ) { + if( cg_stats.integer ) CG_Printf( "cg.clientFrame:%i\n", cg.clientFrame ); - } } diff --git a/src/cgame/cg_weapons.c b/src/cgame/cg_weapons.c index 8f83e288..91b048e4 100644 --- a/src/cgame/cg_weapons.c +++ b/src/cgame/cg_weapons.c @@ -22,52 +22,51 @@ CG_MachineGunEjectBrass ========================== */ -static void CG_MachineGunEjectBrass( centity_t *cent ) { +static void CG_MachineGunEjectBrass( centity_t *cent ) +{ localEntity_t *le; refEntity_t *re; - vec3_t velocity, xvelocity; - vec3_t offset, xoffset; - float waterScale = 1.0f; - vec3_t v[3]; + vec3_t velocity, xvelocity; + vec3_t offset, xoffset; + float waterScale = 1.0f; + vec3_t v[ 3 ]; - if ( cg_brassTime.integer <= 0 ) { + if( cg_brassTime.integer <= 0 ) return; - } - le = CG_AllocLocalEntity(); + le = CG_AllocLocalEntity( ); re = &le->refEntity; - velocity[0] = 0; - velocity[1] = -50 + 40 * crandom(); - velocity[2] = 100 + 50 * crandom(); + velocity[ 0 ] = 0; + velocity[ 1 ] = -50 + 40 * crandom( ); + velocity[ 2 ] = 100 + 50 * crandom( ); le->leType = LE_FRAGMENT; le->startTime = cg.time; - le->endTime = le->startTime + cg_brassTime.integer + ( cg_brassTime.integer / 4 ) * random(); + le->endTime = le->startTime + cg_brassTime.integer + ( cg_brassTime.integer / 4 ) * random( ); le->pos.trType = TR_GRAVITY; - le->pos.trTime = cg.time - (rand()&15); + le->pos.trTime = cg.time - ( rand( ) & 15 ); AnglesToAxis( cent->lerpAngles, v ); - offset[0] = 8; - offset[1] = -4; - offset[2] = 24; + offset[ 0 ] = 8; + offset[ 1 ] = -4; + offset[ 2 ] = 24; - xoffset[0] = offset[0] * v[0][0] + offset[1] * v[1][0] + offset[2] * v[2][0]; - xoffset[1] = offset[0] * v[0][1] + offset[1] * v[1][1] + offset[2] * v[2][1]; - xoffset[2] = offset[0] * v[0][2] + offset[1] * v[1][2] + offset[2] * v[2][2]; + xoffset[ 0 ] = offset[ 0 ] * v[ 0 ][ 0 ] + offset[ 1 ] * v[ 1 ][ 0 ] + offset[ 2 ] * v[ 2 ][ 0 ]; + xoffset[ 1 ] = offset[ 0 ] * v[ 0 ][ 1 ] + offset[ 1 ] * v[ 1 ][ 1 ] + offset[ 2 ] * v[ 2 ][ 1 ]; + xoffset[ 2 ] = offset[ 0 ] * v[ 0 ][ 2 ] + offset[ 1 ] * v[ 1 ][ 2 ] + offset[ 2 ] * v[ 2 ][ 2 ]; VectorAdd( cent->lerpOrigin, xoffset, re->origin ); VectorCopy( re->origin, le->pos.trBase ); - if ( CG_PointContents( re->origin, -1 ) & CONTENTS_WATER ) { + if( CG_PointContents( re->origin, -1 ) & CONTENTS_WATER ) waterScale = 0.10f; - } - xvelocity[0] = velocity[0] * v[0][0] + velocity[1] * v[1][0] + velocity[2] * v[2][0]; - xvelocity[1] = velocity[0] * v[0][1] + velocity[1] * v[1][1] + velocity[2] * v[2][1]; - xvelocity[2] = velocity[0] * v[0][2] + velocity[1] * v[1][2] + velocity[2] * v[2][2]; + xvelocity[ 0 ] = velocity[ 0 ] * v[ 0 ][ 0 ] + velocity[ 1 ] * v[ 1 ][ 0 ] + velocity[ 2 ] * v[ 2 ][ 0 ]; + xvelocity[ 1 ] = velocity[ 0 ] * v[ 0 ][ 1 ] + velocity[ 1 ] * v[ 1 ][ 1 ] + velocity[ 2 ] * v[ 2 ][ 1 ]; + xvelocity[ 2 ] = velocity[ 0 ] * v[ 0 ][ 2 ] + velocity[ 1 ] * v[ 1 ][ 2 ] + velocity[ 2 ] * v[ 2 ][ 2 ]; VectorScale( xvelocity, waterScale, le->pos.trDelta ); AxisCopy( axisDefault, re->axis ); @@ -77,12 +76,12 @@ static void CG_MachineGunEjectBrass( centity_t *cent ) { le->angles.trType = TR_LINEAR; le->angles.trTime = cg.time; - le->angles.trBase[0] = rand()&31; - le->angles.trBase[1] = rand()&31; - le->angles.trBase[2] = rand()&31; - le->angles.trDelta[0] = 2; - le->angles.trDelta[1] = 1; - le->angles.trDelta[2] = 0; + le->angles.trBase[ 0 ] = rand( ) & 31; + le->angles.trBase[ 1 ] = rand( ) & 31; + le->angles.trBase[ 2 ] = rand( ) & 31; + le->angles.trDelta[ 0 ] = 2; + le->angles.trDelta[ 1 ] = 1; + le->angles.trDelta[ 2 ] = 0; le->leFlags = LEF_TUMBLE; le->leBounceSoundType = LEBS_BRASS; @@ -91,195 +90,6 @@ static void CG_MachineGunEjectBrass( centity_t *cent ) { /* ========================== -CG_ShotgunEjectBrass -========================== -*/ -static void CG_ShotgunEjectBrass( centity_t *cent ) { - localEntity_t *le; - refEntity_t *re; - vec3_t velocity, xvelocity; - vec3_t offset, xoffset; - vec3_t v[3]; - int i; - - if ( cg_brassTime.integer <= 0 ) { - return; - } - - for ( i = 0; i < 2; i++ ) { - float waterScale = 1.0f; - - le = CG_AllocLocalEntity(); - re = &le->refEntity; - - velocity[0] = 60 + 60 * crandom(); - if ( i == 0 ) { - velocity[1] = 40 + 10 * crandom(); - } else { - velocity[1] = -40 + 10 * crandom(); - } - velocity[2] = 100 + 50 * crandom(); - - le->leType = LE_FRAGMENT; - le->startTime = cg.time; - le->endTime = le->startTime + cg_brassTime.integer*3 + cg_brassTime.integer * random(); - - le->pos.trType = TR_GRAVITY; - le->pos.trTime = cg.time; - - AnglesToAxis( cent->lerpAngles, v ); - - offset[0] = 8; - offset[1] = 0; - offset[2] = 24; - - xoffset[0] = offset[0] * v[0][0] + offset[1] * v[1][0] + offset[2] * v[2][0]; - xoffset[1] = offset[0] * v[0][1] + offset[1] * v[1][1] + offset[2] * v[2][1]; - xoffset[2] = offset[0] * v[0][2] + offset[1] * v[1][2] + offset[2] * v[2][2]; - VectorAdd( cent->lerpOrigin, xoffset, re->origin ); - VectorCopy( re->origin, le->pos.trBase ); - if ( CG_PointContents( re->origin, -1 ) & CONTENTS_WATER ) { - waterScale = 0.10f; - } - - xvelocity[0] = velocity[0] * v[0][0] + velocity[1] * v[1][0] + velocity[2] * v[2][0]; - xvelocity[1] = velocity[0] * v[0][1] + velocity[1] * v[1][1] + velocity[2] * v[2][1]; - xvelocity[2] = velocity[0] * v[0][2] + velocity[1] * v[1][2] + velocity[2] * v[2][2]; - VectorScale( xvelocity, waterScale, le->pos.trDelta ); - - AxisCopy( axisDefault, re->axis ); - re->hModel = cgs.media.shotgunBrassModel; - le->bounceFactor = 0.3f; - - le->angles.trType = TR_LINEAR; - le->angles.trTime = cg.time; - le->angles.trBase[0] = rand()&31; - le->angles.trBase[1] = rand()&31; - le->angles.trBase[2] = rand()&31; - le->angles.trDelta[0] = 1; - le->angles.trDelta[1] = 0.5; - le->angles.trDelta[2] = 0; - - le->leFlags = LEF_TUMBLE; - le->leBounceSoundType = LEBS_BRASS; - le->leMarkType = LEMT_NONE; - } -} - - -/* -========================== -CG_RailTrail -========================== -*/ -void CG_RailTrail( vec3_t start, vec3_t end ) -{ - vec3_t axis[36], move, move2, next_move, vec, temp; - float len; - int i, j, skip; - - localEntity_t *le; - refEntity_t *re; - -#define RADIUS 4 -#define ROTATION 1 -#define SPACING 5 - - start[2] -= 4; - VectorCopy (start, move); - VectorSubtract (end, start, vec); - len = VectorNormalize (vec); - PerpendicularVector(temp, vec); - for (i = 0 ; i < 36; i++) { - RotatePointAroundVector(axis[i], vec, temp, i * 10);//banshee 2.4 was 10 - } - - le = CG_AllocLocalEntity(); - re = &le->refEntity; - - le->leType = LE_FADE_RGB; - le->startTime = cg.time; - le->endTime = cg.time + cg_railTrailTime.value; - le->lifeRate = 1.0 / ( le->endTime - le->startTime ); - - re->shaderTime = cg.time / 1000.0f; - re->reType = RT_RAIL_CORE; - re->customShader = cgs.media.railCoreShader; - - VectorCopy( start, re->origin ); - VectorCopy( end, re->oldorigin ); - - re->shaderRGBA[0] = 255; - re->shaderRGBA[1] = 255; - re->shaderRGBA[2] = 255; - re->shaderRGBA[3] = 255; - - le->color[0] = 0.75f; - le->color[1] = 0.75f; - le->color[2] = 0.75f; - le->color[3] = 1.0f; - - AxisClear( re->axis ); - - VectorMA(move, 20, vec, move); - VectorCopy(move, next_move); - VectorScale (vec, SPACING, vec); - - if (cg_oldRail.integer != 0) { - // nudge down a bit so it isn't exactly in center - re->origin[2] -= 8; - re->oldorigin[2] -= 8; - return; - } - skip = -1; - - j = 18; - for (i = 0; i < len; i += SPACING) { - if (i != skip) { - skip = i + SPACING; - le = CG_AllocLocalEntity(); - re = &le->refEntity; - le->leFlags = LEF_PUFF_DONT_SCALE; - le->leType = LE_MOVE_SCALE_FADE; - le->startTime = cg.time; - le->endTime = cg.time + (i>>1) + 600; - le->lifeRate = 1.0 / (le->endTime - le->startTime); - - re->shaderTime = cg.time / 1000.0f; - re->reType = RT_SPRITE; - re->radius = 1.1f; - re->customShader = cgs.media.railRingsShader; - - re->shaderRGBA[0] = 255; - re->shaderRGBA[1] = 255; - re->shaderRGBA[2] = 255; - re->shaderRGBA[3] = 255; - - le->color[0] = 0.75f; - le->color[1] = 0.75f; - le->color[2] = 0.75f; - le->color[3] = 1.0f; - - le->pos.trType = TR_LINEAR; - le->pos.trTime = cg.time; - - VectorCopy( move, move2); - VectorMA(move2, RADIUS , axis[j], move2); - VectorCopy(move2, le->pos.trBase); - - le->pos.trDelta[0] = axis[j][0]*6; - le->pos.trDelta[1] = axis[j][1]*6; - le->pos.trDelta[2] = axis[j][2]*6; - } - - VectorAdd (move, vec, move); - - j = j + ROTATION < 36 ? j + ROTATION : (j + ROTATION) % 36; - } -} - -/* -========================== CG_TeslaTrail ========================== */ @@ -301,7 +111,7 @@ void CG_TeslaTrail( vec3_t start, vec3_t end, int srcENum, int destENum ) le->srcENum = srcENum; le->destENum = destENum; le->vOffset = 28; - le->maxRange = BG_FindRangeForBuildable( BA_H_DEF3 ); + le->maxRange = BG_FindRangeForBuildable( BA_H_TESLAGEN ); VectorCopy( start, re->origin ); VectorCopy( end, re->oldorigin ); @@ -330,223 +140,15 @@ void CG_AlienZap( vec3_t start, vec3_t end, int srcENum, int destENum ) le->srcENum = srcENum; le->destENum = destENum; le->vOffset = -4; - le->maxRange = BG_FindRangeForBuildable( BA_H_DEF3 ); + + //FIXME: share with server + le->maxRange = 200; VectorCopy( start, re->origin ); VectorCopy( end, re->oldorigin ); } /* -========================== -CG_RocketTrail -========================== -*/ -static void CG_RocketTrail( centity_t *ent, const weaponInfo_t *wi ) { - int step; - vec3_t origin, lastPos; - int t; - int startTime, contents; - int lastContents; - entityState_t *es; - vec3_t up; - localEntity_t *smoke; - - if ( cg_noProjectileTrail.integer ) { - return; - } - - up[0] = 0; - up[1] = 0; - up[2] = 0; - - step = 50; - - es = &ent->currentState; - startTime = ent->trailTime; - t = step * ( (startTime + step) / step ); - - BG_EvaluateTrajectory( &es->pos, cg.time, origin ); - contents = CG_PointContents( origin, -1 ); - - // if object (e.g. grenade) is stationary, don't toss up smoke - if ( es->pos.trType == TR_STATIONARY ) { - ent->trailTime = cg.time; - return; - } - - BG_EvaluateTrajectory( &es->pos, ent->trailTime, lastPos ); - lastContents = CG_PointContents( lastPos, -1 ); - - ent->trailTime = cg.time; - - if ( contents & ( CONTENTS_WATER | CONTENTS_SLIME | CONTENTS_LAVA ) ) { - if ( contents & lastContents & CONTENTS_WATER ) { - CG_BubbleTrail( lastPos, origin, 8 ); - } - return; - } - - for ( ; t <= ent->trailTime ; t += step ) { - BG_EvaluateTrajectory( &es->pos, t, lastPos ); - - smoke = CG_SmokePuff( lastPos, up, - wi->trailRadius, - 1, 1, 1, 0.33f, - wi->wiTrailTime, - t, - 0, - 0, - cgs.media.smokePuffShader ); - // use the optimized local entity add - smoke->leType = LE_SCALE_FADE; - } - -} - -/* -========================== -CG_PlasmaTrail -========================== -*/ -static void CG_PlasmaTrail( centity_t *cent, const weaponInfo_t *wi ) { - localEntity_t *le; - refEntity_t *re; - entityState_t *es; - vec3_t velocity, xvelocity, origin; - vec3_t offset, xoffset; - vec3_t v[3]; - int t, startTime, step; - - float waterScale = 1.0f; - - if ( cg_noProjectileTrail.integer || cg_oldPlasma.integer ) { - return; - } - - step = 50; - - es = ¢->currentState; - startTime = cent->trailTime; - t = step * ( (startTime + step) / step ); - - BG_EvaluateTrajectory( &es->pos, cg.time, origin ); - - le = CG_AllocLocalEntity(); - re = &le->refEntity; - - velocity[0] = 60 - 120 * crandom(); - velocity[1] = 40 - 80 * crandom(); - velocity[2] = 100 - 200 * crandom(); - - le->leType = LE_MOVE_SCALE_FADE; - le->leFlags = LEF_TUMBLE; - le->leBounceSoundType = LEBS_NONE; - le->leMarkType = LEMT_NONE; - - le->startTime = cg.time; - le->endTime = le->startTime + 600; - - le->pos.trType = TR_GRAVITY; - le->pos.trTime = cg.time; - - AnglesToAxis( cent->lerpAngles, v ); - - offset[0] = 2; - offset[1] = 2; - offset[2] = 2; - - xoffset[0] = offset[0] * v[0][0] + offset[1] * v[1][0] + offset[2] * v[2][0]; - xoffset[1] = offset[0] * v[0][1] + offset[1] * v[1][1] + offset[2] * v[2][1]; - xoffset[2] = offset[0] * v[0][2] + offset[1] * v[1][2] + offset[2] * v[2][2]; - - VectorAdd( origin, xoffset, re->origin ); - VectorCopy( re->origin, le->pos.trBase ); - - if ( CG_PointContents( re->origin, -1 ) & CONTENTS_WATER ) { - waterScale = 0.10f; - } - - xvelocity[0] = velocity[0] * v[0][0] + velocity[1] * v[1][0] + velocity[2] * v[2][0]; - xvelocity[1] = velocity[0] * v[0][1] + velocity[1] * v[1][1] + velocity[2] * v[2][1]; - xvelocity[2] = velocity[0] * v[0][2] + velocity[1] * v[1][2] + velocity[2] * v[2][2]; - VectorScale( xvelocity, waterScale, le->pos.trDelta ); - - AxisCopy( axisDefault, re->axis ); - re->shaderTime = cg.time / 1000.0f; - re->reType = RT_SPRITE; - re->radius = 0.25f; - re->customShader = cgs.media.railRingsShader; - le->bounceFactor = 0.3f; - - re->shaderRGBA[0] = wi->flashDlightColor[0] * 63; - re->shaderRGBA[1] = wi->flashDlightColor[1] * 63; - re->shaderRGBA[2] = wi->flashDlightColor[2] * 63; - re->shaderRGBA[3] = 63; - - le->color[0] = wi->flashDlightColor[0] * 0.2; - le->color[1] = wi->flashDlightColor[1] * 0.2; - le->color[2] = wi->flashDlightColor[2] * 0.2; - le->color[3] = 0.25f; - - le->angles.trType = TR_LINEAR; - le->angles.trTime = cg.time; - le->angles.trBase[0] = rand()&31; - le->angles.trBase[1] = rand()&31; - le->angles.trBase[2] = rand()&31; - le->angles.trDelta[0] = 1; - le->angles.trDelta[1] = 0.5; - le->angles.trDelta[2] = 0; - -} - -/* -========================== -CG_GrappleTrail -========================== -*/ -void CG_GrappleTrail( centity_t *ent, const weaponInfo_t *wi ) { - vec3_t origin; - entityState_t *es; - vec3_t forward, up; - refEntity_t beam; - - es = &ent->currentState; - - BG_EvaluateTrajectory( &es->pos, cg.time, origin ); - ent->trailTime = cg.time; - - memset( &beam, 0, sizeof( beam ) ); - //FIXME adjust for muzzle position - VectorCopy ( cg_entities[ ent->currentState.otherEntityNum ].lerpOrigin, beam.origin ); - beam.origin[2] += 26; - AngleVectors( cg_entities[ ent->currentState.otherEntityNum ].lerpAngles, forward, NULL, up ); - VectorMA( beam.origin, -6, up, beam.origin ); - VectorCopy( origin, beam.oldorigin ); - - if (Distance( beam.origin, beam.oldorigin ) < 64 ) - return; // Don't draw if close - - beam.reType = RT_LIGHTNING; - beam.customShader = cgs.media.lightningShader; - - AxisClear( beam.axis ); - beam.shaderRGBA[0] = 0xff; - beam.shaderRGBA[1] = 0xff; - beam.shaderRGBA[2] = 0xff; - beam.shaderRGBA[3] = 0xff; - trap_R_AddRefEntityToScene( &beam ); -} - -/* -========================== -CG_GrenadeTrail -========================== -*/ -static void CG_GrenadeTrail( centity_t *ent, const weaponInfo_t *wi ) { - CG_RocketTrail( ent, wi ); -} - -/* ================= CG_RegisterUpgrade @@ -587,7 +189,7 @@ CG_InitUpgrades Precaches upgrades =============== */ -void CG_InitUpgrades( ) +void CG_InitUpgrades( void ) { int i; @@ -635,7 +237,7 @@ void CG_RegisterWeapon( int weaponNum ) // calc midpoint for rotation trap_R_ModelBounds( weaponInfo->weaponModel, mins, maxs ); for( i = 0 ; i < 3 ; i++ ) - weaponInfo->weaponMidpoint[i] = mins[i] + 0.5 * ( maxs[i] - mins[i] ); + weaponInfo->weaponMidpoint[ i ] = mins[ i ] + 0.5 * ( maxs[ i ] - mins[ i ] ); if( icon = BG_FindIconForWeapon( weaponNum ) ) { @@ -658,9 +260,8 @@ void CG_RegisterWeapon( int weaponNum ) strcat( path, "_hand.md3" ); weaponInfo->handsModel = trap_R_RegisterModel( path ); - if ( !weaponInfo->handsModel ) { + if( !weaponInfo->handsModel ) weaponInfo->handsModel = trap_R_RegisterModel( "models/weapons2/shotgun/shotgun_hand.md3" ); - } weaponInfo->loopFireSound = qfalse; @@ -673,7 +274,7 @@ void CG_RegisterWeapon( int weaponNum ) weaponInfo->readySound = trap_S_RegisterSound( "sound/weapons/melee/fsthum.wav", qfalse ); weaponInfo->firingSound = trap_S_RegisterSound( "sound/weapons/lightning/lg_hum.wav", qfalse ); - weaponInfo->flashSound[0] = trap_S_RegisterSound( "sound/weapons/lightning/lg_fire.wav", qfalse ); + weaponInfo->flashSound[ 0 ] = trap_S_RegisterSound( "sound/weapons/lightning/lg_fire.wav", qfalse ); cgs.media.lightningShader = trap_R_RegisterShader( "models/ammo/tesla/tesla_bolt"); cgs.media.lightningExplosionModel = trap_R_RegisterModel( "models/weaphits/crackle.md3" ); cgs.media.sfx_lghit = trap_S_RegisterSound( "sound/weapons/lightning/lg_fire.wav", qfalse ); @@ -681,28 +282,28 @@ void CG_RegisterWeapon( int weaponNum ) case WP_MACHINEGUN: MAKERGB( weaponInfo->flashDlightColor, 1, 1, 0 ); - weaponInfo->flashSound[0] = trap_S_RegisterSound( "sound/weapons/machinegun/machgf1b.wav", qfalse ); - weaponInfo->flashSound[1] = trap_S_RegisterSound( "sound/weapons/machinegun/machgf2b.wav", qfalse ); - weaponInfo->flashSound[2] = trap_S_RegisterSound( "sound/weapons/machinegun/machgf3b.wav", qfalse ); - weaponInfo->flashSound[3] = trap_S_RegisterSound( "sound/weapons/machinegun/machgf4b.wav", qfalse ); + weaponInfo->flashSound[ 0 ] = trap_S_RegisterSound( "sound/weapons/machinegun/machgf1b.wav", qfalse ); + weaponInfo->flashSound[ 1 ] = trap_S_RegisterSound( "sound/weapons/machinegun/machgf2b.wav", qfalse ); + weaponInfo->flashSound[ 2 ] = trap_S_RegisterSound( "sound/weapons/machinegun/machgf3b.wav", qfalse ); + weaponInfo->flashSound[ 3 ] = trap_S_RegisterSound( "sound/weapons/machinegun/machgf4b.wav", qfalse ); weaponInfo->ejectBrassFunc = CG_MachineGunEjectBrass; cgs.media.bulletExplosionShader = trap_R_RegisterShader( "bulletExplosion" ); break; case WP_MASS_DRIVER: MAKERGB( weaponInfo->flashDlightColor, 0, 0, 1 ); - weaponInfo->flashSound[0] = trap_S_RegisterSound( "sound/weapons/machinegun/machgf1b.wav", qfalse ); - weaponInfo->flashSound[1] = trap_S_RegisterSound( "sound/weapons/machinegun/machgf2b.wav", qfalse ); - weaponInfo->flashSound[2] = trap_S_RegisterSound( "sound/weapons/machinegun/machgf3b.wav", qfalse ); - weaponInfo->flashSound[3] = trap_S_RegisterSound( "sound/weapons/machinegun/machgf4b.wav", qfalse ); + weaponInfo->flashSound[ 0 ] = trap_S_RegisterSound( "sound/weapons/machinegun/machgf1b.wav", qfalse ); + weaponInfo->flashSound[ 1 ] = trap_S_RegisterSound( "sound/weapons/machinegun/machgf2b.wav", qfalse ); + weaponInfo->flashSound[ 2 ] = trap_S_RegisterSound( "sound/weapons/machinegun/machgf3b.wav", qfalse ); + weaponInfo->flashSound[ 3 ] = trap_S_RegisterSound( "sound/weapons/machinegun/machgf4b.wav", qfalse ); break; case WP_CHAINGUN: MAKERGB( weaponInfo->flashDlightColor, 1, 1, 0 ); - weaponInfo->flashSound[0] = trap_S_RegisterSound( "sound/weapons/machinegun/machgf1b.wav", qfalse ); - weaponInfo->flashSound[1] = trap_S_RegisterSound( "sound/weapons/machinegun/machgf2b.wav", qfalse ); - weaponInfo->flashSound[2] = trap_S_RegisterSound( "sound/weapons/machinegun/machgf3b.wav", qfalse ); - weaponInfo->flashSound[3] = trap_S_RegisterSound( "sound/weapons/machinegun/machgf4b.wav", qfalse ); + weaponInfo->flashSound[ 0 ] = trap_S_RegisterSound( "sound/weapons/machinegun/machgf1b.wav", qfalse ); + weaponInfo->flashSound[ 1 ] = trap_S_RegisterSound( "sound/weapons/machinegun/machgf2b.wav", qfalse ); + weaponInfo->flashSound[ 2 ] = trap_S_RegisterSound( "sound/weapons/machinegun/machgf3b.wav", qfalse ); + weaponInfo->flashSound[ 3 ] = trap_S_RegisterSound( "sound/weapons/machinegun/machgf4b.wav", qfalse ); weaponInfo->ejectBrassFunc = CG_MachineGunEjectBrass; cgs.media.bulletExplosionShader = trap_R_RegisterShader( "bulletExplosion" ); break; @@ -716,44 +317,35 @@ void CG_RegisterWeapon( int weaponNum ) MAKERGB( weaponInfo->missileDlightColor, 1, 0.75f, 0 ); MAKERGB( weaponInfo->flashDlightColor, 1, 0.75f, 0 );*/ weaponInfo->missileModel = trap_R_RegisterModel( "models/ammo/grenade1.md3" ); - weaponInfo->flashSound[0] = trap_S_RegisterSound( "sound/weapons/rocket/rocklf1a.wav", qfalse ); + weaponInfo->flashSound[ 0 ] = trap_S_RegisterSound( "sound/weapons/rocket/rocklf1a.wav", qfalse ); /*cgs.media.rocketExplosionShader = trap_R_RegisterShader( "rocketExplosion" );*/ break; case WP_FLAMER: weaponInfo->missileSound = trap_S_RegisterSound( "sound/weapons/flamer/fireloop.wav", qfalse ); MAKERGB( weaponInfo->flashDlightColor, 0.25, 0.1, 0 ); - //weaponInfo->flashSound[0] = trap_S_RegisterSound( "sound/weapons/railgun/railgf1a.wav", qfalse ); + //weaponInfo->flashSound[ 0 ] = trap_S_RegisterSound( "sound/weapons/railgun/railgf1a.wav", qfalse ); /*cgs.media.flameExplShader = trap_R_RegisterShader( "rocketExplosion" );*/ break; - - case WP_PLASMAGUN: - weaponInfo->missileTrailFunc = CG_PlasmaTrail; - weaponInfo->missileSound = trap_S_RegisterSound( "sound/weapons/plasma/lasfly.wav", qfalse ); - MAKERGB( weaponInfo->flashDlightColor, 0.6f, 0.6f, 1.0f ); - weaponInfo->flashSound[0] = trap_S_RegisterSound( "sound/weapons/plasma/hyprbf1a.wav", qfalse ); - cgs.media.plasmaExplosionShader = trap_R_RegisterShader( "plasmaExplosion" ); - cgs.media.railRingsShader = trap_R_RegisterShader( "railDisc" ); - break; case WP_PULSE_RIFLE: weaponInfo->missileSound = trap_S_RegisterSound( "sound/weapons/plasma/lasfly.wav", qfalse ); MAKERGB( weaponInfo->flashDlightColor, 0.6f, 0.6f, 1.0f ); - weaponInfo->flashSound[0] = trap_S_RegisterSound( "sound/weapons/plasma/hyprbf1a.wav", qfalse ); + weaponInfo->flashSound[ 0 ] = trap_S_RegisterSound( "sound/weapons/plasma/hyprbf1a.wav", qfalse ); cgs.media.plasmaExplosionShader = trap_R_RegisterShader( "plasmaExplosion" ); cgs.media.railRingsShader = trap_R_RegisterShader( "railDisc" ); break; case WP_LAS_GUN: MAKERGB( weaponInfo->flashDlightColor, 1, 1, 0 ); - weaponInfo->flashSound[0] = trap_S_RegisterSound( "sound/weapons/plasma/hyprbf1a.wav", qfalse ); + weaponInfo->flashSound[ 0 ] = trap_S_RegisterSound( "sound/weapons/plasma/hyprbf1a.wav", qfalse ); cgs.media.bulletExplosionShader = trap_R_RegisterShader( "bulletExplosion" ); break; case WP_LUCIFER_CANON: weaponInfo->readySound = trap_S_RegisterSound( "sound/weapons/bfg/bfg_hum.wav", qfalse ); MAKERGB( weaponInfo->flashDlightColor, 1, 0.7f, 1 ); - weaponInfo->flashSound[0] = trap_S_RegisterSound( "sound/weapons/bfg/bfg_fire.wav", qfalse ); + weaponInfo->flashSound[ 0 ] = trap_S_RegisterSound( "sound/weapons/bfg/bfg_fire.wav", qfalse ); cgs.media.bfgExplosionShader = trap_R_RegisterShader( "bfgExplosion" ); weaponInfo->missileModel = trap_R_RegisterModel( "models/weaphits/bfg.md3" ); weaponInfo->missileSound = trap_S_RegisterSound( "sound/weapons/rocket/rockfly.wav", qfalse ); @@ -761,30 +353,30 @@ void CG_RegisterWeapon( int weaponNum ) case WP_VENOM: MAKERGB( weaponInfo->flashDlightColor, 0, 0, 0 ); - weaponInfo->flashSound[0] = trap_S_RegisterSound( "sound/weapons/melee/fstatck.wav", qfalse ); + weaponInfo->flashSound[ 0 ] = trap_S_RegisterSound( "sound/weapons/melee/fstatck.wav", qfalse ); break; case WP_PAIN_SAW: MAKERGB( weaponInfo->flashDlightColor, 0, 0, 0 ); - weaponInfo->flashSound[0] = trap_S_RegisterSound( "sound/weapons/melee/fstatck.wav", qfalse ); + weaponInfo->flashSound[ 0 ] = trap_S_RegisterSound( "sound/weapons/melee/fstatck.wav", qfalse ); break; case WP_GRAB_CLAW: case WP_GRAB_CLAW_UPG: MAKERGB( weaponInfo->flashDlightColor, 0, 0, 0 ); - weaponInfo->flashSound[0] = trap_S_RegisterSound( "sound/weapons/melee/fstatck.wav", qfalse ); + weaponInfo->flashSound[ 0 ] = trap_S_RegisterSound( "sound/weapons/melee/fstatck.wav", qfalse ); break; case WP_POUNCE: case WP_POUNCE_UPG: MAKERGB( weaponInfo->flashDlightColor, 0, 0, 0 ); - weaponInfo->flashSound[0] = trap_S_RegisterSound( "sound/weapons/melee/fstatck.wav", qfalse ); + weaponInfo->flashSound[ 0 ] = trap_S_RegisterSound( "sound/weapons/melee/fstatck.wav", qfalse ); weaponInfo->missileModel = trap_R_RegisterModel( "models/ammo/grenade1.md3" ); break; case WP_GROUND_POUND: MAKERGB( weaponInfo->flashDlightColor, 0, 0, 0 ); - weaponInfo->flashSound[0] = trap_S_RegisterSound( "sound/weapons/melee/fstatck.wav", qfalse ); + weaponInfo->flashSound[ 0 ] = trap_S_RegisterSound( "sound/weapons/melee/fstatck.wav", qfalse ); break; case WP_ABUILD: @@ -796,7 +388,7 @@ void CG_RegisterWeapon( int weaponNum ) default: MAKERGB( weaponInfo->flashDlightColor, 1, 1, 1 ); - weaponInfo->flashSound[0] = trap_S_RegisterSound( "sound/weapons/rocket/rocklf1a.wav", qfalse ); + weaponInfo->flashSound[ 0 ] = trap_S_RegisterSound( "sound/weapons/rocket/rocklf1a.wav", qfalse ); break; } } @@ -808,7 +400,7 @@ CG_InitWeapons Precaches weapons =============== */ -void CG_InitWeapons( ) +void CG_InitWeapons( void ) { int i; @@ -833,25 +425,23 @@ CG_MapTorsoToWeaponFrame ================= */ -static int CG_MapTorsoToWeaponFrame( clientInfo_t *ci, int frame ) { +static int CG_MapTorsoToWeaponFrame( clientInfo_t *ci, int frame ) +{ // change weapon - if ( frame >= ci->animations[TORSO_DROP].firstFrame - && frame < ci->animations[TORSO_DROP].firstFrame + 9 ) { - return frame - ci->animations[TORSO_DROP].firstFrame + 6; - } + if( frame >= ci->animations[ TORSO_DROP ].firstFrame && + frame < ci->animations[ TORSO_DROP ].firstFrame + 9 ) + return frame - ci->animations[ TORSO_DROP ].firstFrame + 6; // stand attack - if ( frame >= ci->animations[TORSO_ATTACK].firstFrame - && frame < ci->animations[TORSO_ATTACK].firstFrame + 6 ) { - return 1 + frame - ci->animations[TORSO_ATTACK].firstFrame; - } + if( frame >= ci->animations[ TORSO_ATTACK ].firstFrame && + frame < ci->animations[ TORSO_ATTACK ].firstFrame + 6 ) + return 1 + frame - ci->animations[ TORSO_ATTACK ].firstFrame; // stand attack 2 - if ( frame >= ci->animations[TORSO_ATTACK2].firstFrame - && frame < ci->animations[TORSO_ATTACK2].firstFrame + 6 ) { - return 1 + frame - ci->animations[TORSO_ATTACK].firstFrame; - } + if( frame >= ci->animations[ TORSO_ATTACK2 ].firstFrame && + frame < ci->animations[ TORSO_ATTACK2 ].firstFrame + 6 ) + return 1 + frame - ci->animations[ TORSO_ATTACK ].firstFrame; return 0; } @@ -862,7 +452,8 @@ static int CG_MapTorsoToWeaponFrame( clientInfo_t *ci, int frame ) { CG_CalculateWeaponPosition ============== */ -static void CG_CalculateWeaponPosition( vec3_t origin, vec3_t angles ) { +static void CG_CalculateWeaponPosition( vec3_t origin, vec3_t angles ) +{ float scale; int delta; float fracsin; @@ -872,53 +463,38 @@ static void CG_CalculateWeaponPosition( vec3_t origin, vec3_t angles ) { VectorCopy( cg.refdefViewAngles, angles ); // on odd legs, invert some angles - if ( cg.bobcycle & 1 ) { + if( cg.bobcycle & 1 ) scale = -cg.xyspeed; - } else { + else scale = cg.xyspeed; - } // gun angles from bobbing //TA: bob amount is class dependant bob = BG_FindBobForClass( cg.predictedPlayerState.stats[ STAT_PCLASS ] ); + if( bob != 0 ) { - angles[ROLL] += scale * cg.bobfracsin * 0.005; - angles[YAW] += scale * cg.bobfracsin * 0.01; - angles[PITCH] += cg.xyspeed * cg.bobfracsin * 0.005; + angles[ ROLL ] += scale * cg.bobfracsin * 0.005; + angles[ YAW ] += scale * cg.bobfracsin * 0.01; + angles[ PITCH ] += cg.xyspeed * cg.bobfracsin * 0.005; } // drop the weapon when landing if( !BG_ClassHasAbility( cg.predictedPlayerState.stats[ STAT_PCLASS ], SCA_NOWEAPONDRIFT ) ) { delta = cg.time - cg.landTime; - if ( delta < LAND_DEFLECT_TIME ) - { - origin[2] += cg.landChange*0.25 * delta / LAND_DEFLECT_TIME; - } - else if ( delta < LAND_DEFLECT_TIME + LAND_RETURN_TIME ) - { - origin[2] += cg.landChange*0.25 * - (LAND_DEFLECT_TIME + LAND_RETURN_TIME - delta) / LAND_RETURN_TIME; - } - - //TA: huh? why drop the weapon when stair climbing... just as well this isn't actually used :) -#if 0 - // drop the weapon when stair climbing - delta = cg.time - cg.stepTime; - if ( delta < STEP_TIME/2 ) { - origin[2] -= cg.stepChange*0.25 * delta / (STEP_TIME/2); - } else if ( delta < STEP_TIME ) { - origin[2] -= cg.stepChange*0.25 * (STEP_TIME - delta) / (STEP_TIME/2); - } -#endif + if( delta < LAND_DEFLECT_TIME ) + origin[ 2 ] += cg.landChange*0.25 * delta / LAND_DEFLECT_TIME; + else if( delta < LAND_DEFLECT_TIME + LAND_RETURN_TIME ) + origin[ 2 ] += cg.landChange*0.25 * + ( LAND_DEFLECT_TIME + LAND_RETURN_TIME - delta ) / LAND_RETURN_TIME; - // idle drift + // idle drift scale = cg.xyspeed + 40; fracsin = sin( cg.time * 0.001 ); - angles[ROLL] += scale * fracsin * 0.01; - angles[YAW] += scale * fracsin * 0.01; - angles[PITCH] += scale * fracsin * 0.01; + angles[ ROLL ] += scale * fracsin * 0.01; + angles[ YAW ] += scale * fracsin * 0.01; + angles[ PITCH ] += scale * fracsin * 0.01; } } @@ -934,52 +510,56 @@ so the endpoint will reflect the simulated strike (lagging the predicted angle) =============== */ -static void CG_LightningBolt( centity_t *cent, vec3_t origin ) { - trace_t trace; +static void CG_LightningBolt( centity_t *cent, vec3_t origin ) +{ + trace_t trace; refEntity_t beam; - vec3_t forward; - vec3_t muzzlePoint, endPoint; + vec3_t forward; + vec3_t muzzlePoint, endPoint; - if ( cent->currentState.weapon != WP_TESLAGEN ) { + if( cent->currentState.weapon != WP_TESLAGEN ) return; - } memset( &beam, 0, sizeof( beam ) ); - // CPMA "true" lightning - if ((cent->currentState.number == cg.predictedPlayerState.clientNum) && (cg_trueLightning.value != 0)) { - vec3_t angle; - int i; - - for (i = 0; i < 3; i++) { - float a = cent->lerpAngles[i] - cg.refdefViewAngles[i]; - if (a > 180) { - a -= 360; - } - if (a < -180) { - a += 360; - } - - angle[i] = cg.refdefViewAngles[i] + a * (1.0 - cg_trueLightning.value); - if (angle[i] < 0) { - angle[i] += 360; - } - if (angle[i] > 360) { - angle[i] -= 360; - } - } - - AngleVectors(angle, forward, NULL, NULL ); - VectorCopy(cent->lerpOrigin, muzzlePoint ); -// VectorCopy(cg.refdef.vieworg, muzzlePoint ); - } else { - // !CPMA - AngleVectors( cent->lerpAngles, forward, NULL, NULL ); - VectorCopy(cent->lerpOrigin, muzzlePoint ); - } + // CPMA "true" lightning + if( ( cent->currentState.number == cg.predictedPlayerState.clientNum ) && + ( cg_trueLightning.value != 0 ) ) + { + vec3_t angle; + int i; + + for( i = 0; i < 3; i++ ) + { + float a = cent->lerpAngles[ i ] - cg.refdefViewAngles[ i ]; + if( a > 180 ) + a -= 360; + + if( a < -180 ) + a += 360; + + angle[ i ] = cg.refdefViewAngles[ i ] + a * ( 1.0 - cg_trueLightning.value ); + + if( angle[ i ] < 0 ) + angle[ i ] += 360; + + if( angle[ i ] > 360 ) + angle[ i ] -= 360; + } + + AngleVectors( angle, forward, NULL, NULL ); + VectorCopy( cent->lerpOrigin, muzzlePoint ); +// VectorCopy(cg.refdef.vieworg, muzzlePoint ); + } + else + { + // !CPMA + AngleVectors( cent->lerpAngles, forward, NULL, NULL ); + VectorCopy( cent->lerpOrigin, muzzlePoint ); + } // FIXME: crouch - muzzlePoint[2] += DEFAULT_VIEWHEIGHT; + muzzlePoint[ 2 ] += DEFAULT_VIEWHEIGHT; VectorMA( muzzlePoint, 14, forward, muzzlePoint ); @@ -1002,7 +582,8 @@ static void CG_LightningBolt( centity_t *cent, vec3_t origin ) { trap_R_AddRefEntityToScene( &beam ); // add the impact flare if it hit something - if ( trace.fraction < 1.0 ) { + if( trace.fraction < 1.0 ) + { vec3_t angles; vec3_t dir; @@ -1015,9 +596,9 @@ static void CG_LightningBolt( centity_t *cent, vec3_t origin ) { VectorMA( trace.endpos, -16, dir, beam.origin ); // make a random orientation - angles[0] = rand() % 360; - angles[1] = rand() % 360; - angles[2] = rand() % 360; + angles[ 0 ] = rand( ) % 360; + angles[ 1 ] = rand( ) % 360; + angles[ 2 ] = rand( ) % 360; AnglesToAxis( angles, beam.axis ); trap_R_AddRefEntityToScene( &beam ); } @@ -1153,27 +734,30 @@ CG_MachinegunSpinAngle */ #define SPIN_SPEED 0.9 #define COAST_TIME 1000 -static float CG_MachinegunSpinAngle( centity_t *cent ) { +static float CG_MachinegunSpinAngle( centity_t *cent ) +{ int delta; float angle; float speed; delta = cg.time - cent->pe.barrelTime; - if ( cent->pe.barrelSpinning ) { + if( cent->pe.barrelSpinning ) angle = cent->pe.barrelAngle + delta * SPIN_SPEED; - } else { - if ( delta > COAST_TIME ) { + else + { + if( delta > COAST_TIME ) delta = COAST_TIME; - } speed = 0.5 * ( SPIN_SPEED + (float)( COAST_TIME - delta ) / COAST_TIME ); angle = cent->pe.barrelAngle + delta * speed; } - if ( cent->pe.barrelSpinning == !(cent->currentState.eFlags & EF_FIRING) ) { + if( cent->pe.barrelSpinning == !( cent->currentState.eFlags & EF_FIRING ) ) + { cent->pe.barrelTime = cg.time; cent->pe.barrelAngle = AngleMod( angle ); - cent->pe.barrelSpinning = !!(cent->currentState.eFlags & EF_FIRING); + cent->pe.barrelSpinning = !!( cent->currentState.eFlags & EF_FIRING ); + //TA: um? } return angle; @@ -1185,23 +769,9 @@ static float CG_MachinegunSpinAngle( centity_t *cent ) { CG_AddWeaponWithPowerups ======================== */ -static void CG_AddWeaponWithPowerups( refEntity_t *gun, int powerups ) { - // add powerup effects - /*if ( powerups & ( 1 << PW_INVIS ) ) { - gun->customShader = cgs.media.invisShader; - trap_R_AddRefEntityToScene( gun ); - } else*/ { - trap_R_AddRefEntityToScene( gun ); - - /*if ( powerups & ( 1 << PW_BATTLESUIT ) ) { - gun->customShader = cgs.media.battleWeaponShader; - trap_R_AddRefEntityToScene( gun ); - } - if ( powerups & ( 1 << PW_QUAD ) ) { - gun->customShader = cgs.media.quadWeaponShader; - trap_R_AddRefEntityToScene( gun ); - }*/ - } +static void CG_AddWeaponWithPowerups( refEntity_t *gun, int powerups ) +{ + trap_R_AddRefEntityToScene( gun ); } @@ -1216,13 +786,13 @@ sound should only be done on the world model case. */ void CG_AddPlayerWeapon( refEntity_t *parent, playerState_t *ps, centity_t *cent ) { - refEntity_t gun; - refEntity_t barrel; - refEntity_t flash; - vec3_t angles; - weapon_t weaponNum; + refEntity_t gun; + refEntity_t barrel; + refEntity_t flash; + vec3_t angles; + weapon_t weaponNum; weaponInfo_t *weapon; - centity_t *nonPredictedCent; + centity_t *nonPredictedCent; weaponNum = cent->currentState.weapon; @@ -1288,9 +858,9 @@ void CG_AddPlayerWeapon( refEntity_t *parent, playerState_t *ps, centity_t *cent barrel.renderfx = parent->renderfx; barrel.hModel = weapon->barrelModel; - angles[YAW] = 0; - angles[PITCH] = 0; - angles[ROLL] = CG_MachinegunSpinAngle( cent ); + angles[ YAW ] = 0; + angles[ PITCH ] = 0; + angles[ ROLL ] = CG_MachinegunSpinAngle( cent ); AnglesToAxis( angles, barrel.axis ); CG_PositionRotatedEntityOnTag( &barrel, &gun, weapon->weaponModel, "tag_barrel" ); @@ -1363,12 +933,13 @@ CG_AddViewWeapon Add the weapon, and flash for the player's view ============== */ -void CG_AddViewWeapon( playerState_t *ps ) { - refEntity_t hand; - centity_t *cent; +void CG_AddViewWeapon( playerState_t *ps ) +{ + refEntity_t hand; + centity_t *cent; clientInfo_t *ci; - float fovOffset; - vec3_t angles; + float fovOffset; + vec3_t angles; weaponInfo_t *weapon; if( ( ps->persistant[PERS_TEAM] == TEAM_SPECTATOR ) || @@ -1380,38 +951,38 @@ void CG_AddViewWeapon( playerState_t *ps ) { if( ps->weapon == WP_NONE ) return; - if ( ps->pm_type == PM_INTERMISSION ) { + if( ps->pm_type == PM_INTERMISSION ) return; - } //TA: draw a prospective buildable infront of the player if( ( ps->stats[ STAT_BUILDABLE ] & ~SB_VALID_TOGGLEBIT ) > BA_NONE ) CG_GhostBuildable( ps->stats[ STAT_BUILDABLE ] & ~SB_VALID_TOGGLEBIT ); // no gun if in third person view - if ( cg.renderingThirdPerson ) { + if( cg.renderingThirdPerson ) return; - } // allow the gun to be completely removed - if ( !cg_drawGun.integer ) { - vec3_t origin; + if( !cg_drawGun.integer ) + { + vec3_t origin; - if ( cg.predictedPlayerState.eFlags & EF_FIRING ) { + if( cg.predictedPlayerState.eFlags & EF_FIRING ) + { // special hack for lightning gun... // TA: and flamer VectorCopy( cg.refdef.vieworg, origin ); - VectorMA( origin, -8, cg.refdef.viewaxis[2], origin ); - CG_LightningBolt( &cg_entities[ps->clientNum], origin ); + VectorMA( origin, -8, cg.refdef.viewaxis[ 2 ], origin ); + CG_LightningBolt( &cg_entities[ ps->clientNum ], origin ); CG_FlameTrail( &cg_entities[ ps->clientNum ] ); } + return; } // don't draw if testing a gun model - if ( cg.testGun ) { + if( cg.testGun ) return; - } // drop gun lower at higher fov //if ( cg_fov.integer > 90 ) { @@ -1425,21 +996,21 @@ void CG_AddViewWeapon( playerState_t *ps ) { CG_RegisterWeapon( ps->weapon ); weapon = &cg_weapons[ ps->weapon ]; - memset (&hand, 0, sizeof(hand)); + memset( &hand, 0, sizeof( hand ) ); // set up gun position CG_CalculateWeaponPosition( hand.origin, angles ); - VectorMA( hand.origin, cg_gun_x.value, cg.refdef.viewaxis[0], hand.origin ); - VectorMA( hand.origin, cg_gun_y.value, cg.refdef.viewaxis[1], hand.origin ); - VectorMA( hand.origin, (cg_gun_z.value+fovOffset), cg.refdef.viewaxis[2], hand.origin ); + VectorMA( hand.origin, cg_gun_x.value, cg.refdef.viewaxis[ 0 ], hand.origin ); + VectorMA( hand.origin, cg_gun_y.value, cg.refdef.viewaxis[ 1 ], hand.origin ); + VectorMA( hand.origin, ( cg_gun_z.value + fovOffset ), cg.refdef.viewaxis[ 2 ], hand.origin ); if( ps->weapon == WP_LUCIFER_CANON && ps->stats[ STAT_MISC ] > 0 ) { float fraction = (float)ps->stats[ STAT_MISC ] / (float)LC_TOTAL_CHARGE; - VectorMA( hand.origin, random( ) * fraction, cg.refdef.viewaxis[0], hand.origin ); - VectorMA( hand.origin, random( ) * fraction, cg.refdef.viewaxis[1], hand.origin ); + VectorMA( hand.origin, random( ) * fraction, cg.refdef.viewaxis[ 0 ], hand.origin ); + VectorMA( hand.origin, random( ) * fraction, cg.refdef.viewaxis[ 1 ], hand.origin ); } if( cg.predictedPlayerState.stats[ STAT_STATE ] & SS_KNOCKEDOVER ) @@ -1456,11 +1027,14 @@ void CG_AddViewWeapon( playerState_t *ps ) { AnglesToAxis( angles, hand.axis ); // map torso animations to weapon animations - if ( cg_gun_frame.integer ) { + if( cg_gun_frame.integer ) + { // development tool hand.frame = hand.oldframe = cg_gun_frame.integer; hand.backlerp = 0; - } else { + } + else + { // get clientinfo for animation map ci = &cgs.clientinfo[ cent->currentState.clientNum ]; hand.frame = CG_MapTorsoToWeaponFrame( ci, cent->pe.torso.frame ); @@ -1472,7 +1046,8 @@ void CG_AddViewWeapon( playerState_t *ps ) { hand.renderfx = RF_DEPTHHACK | RF_FIRST_PERSON | RF_MINLIGHT; // add everything onto the hand - CG_AddPlayerWeapon( &hand, ps, &cg.predictedPlayerEntity );} + CG_AddPlayerWeapon( &hand, ps, &cg.predictedPlayerEntity ); +} /* ============================================================================== @@ -1482,32 +1057,6 @@ WEAPON SELECTION ============================================================================== */ -qboolean haveWeapon( int *weapons, int num, int weapon ) -{ - int i; - - for( i = 0; i < num; i++ ) - { - if( weapons[ i ] == weapon ) - return qtrue; - } - - return qfalse; -} - -qboolean haveUpgrade( int *upgrades, int num, int upgrade ) -{ - int i; - - for( i = 0; i < num; i++ ) - { - if( upgrades[ i ] == upgrade ) - return qtrue; - } - - return qfalse; -} - #define ICON_BORDER 4 /* @@ -1681,9 +1230,8 @@ CG_ItemSelectable */ static qboolean CG_ItemSelectable( int i ) { - if( !BG_gotItem( i, cg.snap->ps.stats ) ) { + if( !BG_gotItem( i, cg.snap->ps.stats ) ) return qfalse; - } return qtrue; } @@ -1694,45 +1242,40 @@ static qboolean CG_ItemSelectable( int i ) CG_NextWeapon_f =============== */ -void CG_NextWeapon_f( void ) { +void CG_NextWeapon_f( void ) +{ int i; int original; - if ( !cg.snap ) { + if( !cg.snap ) return; - } - if ( cg.snap->ps.pm_flags & PMF_FOLLOW ) { + + if( cg.snap->ps.pm_flags & PMF_FOLLOW ) return; - } cg.weaponSelectTime = cg.time; original = cg.weaponSelect; - for ( i = 0 ; i < 64 ; i++ ) { + for( i = 0; i < 64; i++ ) + { cg.weaponSelect++; - if ( cg.weaponSelect == 64 ) { + if( cg.weaponSelect == 64 ) cg.weaponSelect = 0; - } - /*if ( cg.weaponSelect == WP_GAUNTLET ) { - continue; // never cycle to gauntlet - }*/ if( cg.weaponSelect <= 32 ) { - if ( CG_WeaponSelectable( cg.weaponSelect ) ) { + if( CG_WeaponSelectable( cg.weaponSelect ) ) break; - } } else if( cg.weaponSelect > 32 ) { - if ( CG_ItemSelectable( cg.weaponSelect - 32 ) ) { + if( CG_ItemSelectable( cg.weaponSelect - 32 ) ) break; - } } } - if ( i == 64 ) { + + if( i == 64 ) cg.weaponSelect = original; - } } /* @@ -1740,44 +1283,40 @@ void CG_NextWeapon_f( void ) { CG_PrevWeapon_f =============== */ -void CG_PrevWeapon_f( void ) { +void CG_PrevWeapon_f( void ) +{ int i; int original; - if ( !cg.snap ) { + if( !cg.snap ) return; - } - if ( cg.snap->ps.pm_flags & PMF_FOLLOW ) { + + if( cg.snap->ps.pm_flags & PMF_FOLLOW ) return; - } cg.weaponSelectTime = cg.time; original = cg.weaponSelect; - for ( i = 0 ; i < 64 ; i++ ) { + for( i = 0; i < 64; i++ ) + { cg.weaponSelect--; - if ( cg.weaponSelect == -1 ) { + if( cg.weaponSelect == -1 ) cg.weaponSelect = 63; - } - /*if ( cg.weaponSelect == WP_GAUNTLET ) { - continue; // never cycle to gauntlet - }*/ + if( cg.weaponSelect <= 32 ) { - if ( CG_WeaponSelectable( cg.weaponSelect ) ) { + if( CG_WeaponSelectable( cg.weaponSelect ) ) break; - } } else if( cg.weaponSelect > 32 ) { - if ( CG_ItemSelectable( cg.weaponSelect - 32 ) ) { + if( CG_ItemSelectable( cg.weaponSelect - 32 ) ) break; - } } } - if ( i == 64 ) { + + if( i == 64 ) cg.weaponSelect = original; - } } /* @@ -1785,53 +1324,29 @@ void CG_PrevWeapon_f( void ) { CG_Weapon_f =============== */ -void CG_Weapon_f( void ) { +void CG_Weapon_f( void ) +{ int num; - if ( !cg.snap ) { + if( !cg.snap ) return; - } - if ( cg.snap->ps.pm_flags & PMF_FOLLOW ) { + + if( cg.snap->ps.pm_flags & PMF_FOLLOW ) return; - } num = atoi( CG_Argv( 1 ) ); - if ( num < 1 || num > 31 ) { + if( num < 1 || num > 31 ) return; - } cg.weaponSelectTime = cg.time; - if ( !BG_gotWeapon( num, cg.snap->ps.stats ) ) { + if( !BG_gotWeapon( num, cg.snap->ps.stats ) ) return; // don't have the weapon - } cg.weaponSelect = num; } -/* -=================== -CG_OutOfAmmoChange - -The current weapon has just run out of ammo -=================== -*/ -void CG_OutOfAmmoChange( void ) { - int i; - - //TA: mwhaha, must manually change weapons - /*cg.weaponSelectTime = cg.time; - - for ( i = 31 ; i > 0 ; i-- ) { - if ( CG_WeaponSelectable( i ) ) { - cg.weaponSelect = i; - break; - } - }*/ -} - - /* =================================================================================================== @@ -1855,13 +1370,15 @@ void CG_FireWeapon( centity_t *cent, int mode ) weaponInfo_t *weap; ent = ¢->currentState; - if ( ent->weapon == WP_NONE ) { + if( ent->weapon == WP_NONE ) return; - } - if ( ent->weapon >= WP_NUM_WEAPONS ) { + + if( ent->weapon >= WP_NUM_WEAPONS ) + { CG_Error( "CG_FireWeapon: ent->weapon >= WP_NUM_WEAPONS" ); return; } + weap = &cg_weapons[ ent->weapon ]; // mark the entity as muzzle flashing, so when it is added it will @@ -1872,35 +1389,29 @@ void CG_FireWeapon( centity_t *cent, int mode ) cent->firstPoisonTime = cg.time; // lightning gun only does this this on initial press - if ( ent->weapon == WP_TESLAGEN ) { - if ( cent->pe.lightningFiring ) { + if( ent->weapon == WP_TESLAGEN ) + { + if( cent->pe.lightningFiring ) return; - } } - // play quad sound if needed - /*if ( cent->currentState.powerups & ( 1 << PW_QUAD ) ) { - trap_S_StartSound (NULL, cent->currentState.number, CHAN_ITEM, cgs.media.quadSound ); - }*/ - // play a sound - for ( c = 0 ; c < 4 ; c++ ) { - if ( !weap->flashSound[c] ) { + for( c = 0; c < 4; c++ ) + { + if( !weap->flashSound[ c ] ) break; - } } - if ( c > 0 ) { - c = rand() % c; - if ( weap->flashSound[c] ) - { - trap_S_StartSound( NULL, ent->number, CHAN_WEAPON, weap->flashSound[c] ); - } + + if( c > 0 ) + { + c = rand( ) % c; + if( weap->flashSound[ c ] ) + trap_S_StartSound( NULL, ent->number, CHAN_WEAPON, weap->flashSound[ c ] ); } // do brass ejection - if ( weap->ejectBrassFunc && cg_brassTime.integer > 0 ) { + if( weap->ejectBrassFunc && cg_brassTime.integer > 0 ) weap->ejectBrassFunc( cent ); - } } @@ -1912,20 +1423,20 @@ Caused by an EV_MISSILE_MISS event, or directly by local bullet tracing ================= */ void CG_MissileHitWall( int weapon, int clientNum, vec3_t origin, vec3_t dir, impactSound_t soundType, int damage ) { - qhandle_t mod; - qhandle_t mark; - qhandle_t shader; + qhandle_t mod; + qhandle_t mark; + qhandle_t shader; sfxHandle_t sfx; - float radius; - float light; - vec3_t lightColor; + float radius; + float light; + vec3_t lightColor; localEntity_t *le; - int r, i; - qboolean alphaFade; - qboolean isSprite; - int duration; - vec3_t sprOrg; - vec3_t sprVel; + int r, i; + qboolean alphaFade; + qboolean isSprite; + int duration; + vec3_t sprOrg; + vec3_t sprVel; mark = 0; radius = 32; @@ -1933,9 +1444,9 @@ void CG_MissileHitWall( int weapon, int clientNum, vec3_t origin, vec3_t dir, im mod = 0; shader = 0; light = 0; - lightColor[0] = 1; - lightColor[1] = 1; - lightColor[2] = 0; + lightColor[ 0 ] = 1; + lightColor[ 1 ] = 1; + lightColor[ 2 ] = 0; // set defaults isSprite = qfalse; @@ -1943,118 +1454,111 @@ void CG_MissileHitWall( int weapon, int clientNum, vec3_t origin, vec3_t dir, im switch( weapon ) { - default: - case WP_TESLAGEN: - case WP_AREA_ZAP: - case WP_DIRECT_ZAP: - mod = cgs.media.lightningExplosionModel; - shader = cgs.media.lightningShader; - sfx = cgs.media.sfx_lghit; - mark = cgs.media.energyMarkShader; - radius = 24; - break; - case WP_LOCKBLOB_LAUNCHER: - case WP_POUNCE_UPG: - sfx = cgs.media.gibBounce1Sound; - mark = cgs.media.greenBloodMarkShader; - radius = 64; - isSprite = qtrue; - break; - case WP_FLAMER: - sfx = cgs.media.sfx_flamerexp; - mark = cgs.media.burnMarkShader; - radius = 32; - break; - case WP_PLASMAGUN: - mod = cgs.media.ringFlashModel; - shader = cgs.media.plasmaExplosionShader; - sfx = cgs.media.sfx_plasmaexp; - mark = cgs.media.energyMarkShader; - radius = 16; - break; - case WP_PULSE_RIFLE: - mod = cgs.media.ringFlashModel; - shader = cgs.media.plasmaExplosionShader; - sfx = cgs.media.sfx_plasmaexp; - mark = cgs.media.energyMarkShader; - radius = 16; - break; - case WP_MASS_DRIVER: - shader = cgs.media.bulletExplosionShader; - mark = cgs.media.bulletMarkShader; - radius = 8; - break; - case WP_MACHINEGUN: - case WP_CHAINGUN: - case WP_LAS_GUN: - mod = cgs.media.bulletFlashModel; - shader = cgs.media.bulletExplosionShader; - mark = cgs.media.bulletMarkShader; - - r = rand() & 3; - if ( r == 0 ) { - sfx = cgs.media.sfx_ric1; - } else if ( r == 1 ) { - sfx = cgs.media.sfx_ric2; - } else { - sfx = cgs.media.sfx_ric3; - } - - radius = 8; - break; - - #define LCANON_EJECTION_VEL 300 - - case WP_LUCIFER_CANON: - mod = cgs.media.dishFlashModel; - shader = cgs.media.bfgExplosionShader; - mark = cgs.media.bulletMarkShader; - radius = 8; - sfx = cgs.media.sfx_plasmaexp; - isSprite = qtrue; - - for( i = 0; i <= damage / 20; i++ ) - { - qhandle_t spark; - vec3_t velocity; - vec3_t accel = { 0.0f, 0.0f, -DEFAULT_GRAVITY }; - - VectorMA( origin, 1.0f, dir, origin ); - - if( random( ) > 0.5f ) - spark = cgs.media.gibSpark1; + default: + case WP_TESLAGEN: + case WP_AREA_ZAP: + case WP_DIRECT_ZAP: + mod = cgs.media.lightningExplosionModel; + shader = cgs.media.lightningShader; + sfx = cgs.media.sfx_lghit; + mark = cgs.media.energyMarkShader; + radius = 24; + break; + + case WP_LOCKBLOB_LAUNCHER: + case WP_POUNCE_UPG: + sfx = cgs.media.gibBounce1Sound; + mark = cgs.media.greenBloodMarkShader; + radius = 64; + isSprite = qtrue; + break; + + case WP_FLAMER: + sfx = cgs.media.sfx_flamerexp; + mark = cgs.media.burnMarkShader; + radius = 32; + break; + + case WP_PULSE_RIFLE: + mod = cgs.media.ringFlashModel; + shader = cgs.media.plasmaExplosionShader; + sfx = cgs.media.sfx_plasmaexp; + mark = cgs.media.energyMarkShader; + radius = 16; + break; + + case WP_MASS_DRIVER: + shader = cgs.media.bulletExplosionShader; + mark = cgs.media.bulletMarkShader; + radius = 8; + break; + + case WP_MACHINEGUN: + case WP_CHAINGUN: + case WP_LAS_GUN: + mod = cgs.media.bulletFlashModel; + shader = cgs.media.bulletExplosionShader; + mark = cgs.media.bulletMarkShader; + + r = rand( ) & 3; + if( r == 0 ) + sfx = cgs.media.sfx_ric1; + else if( r == 1 ) + sfx = cgs.media.sfx_ric2; else - spark = cgs.media.scannerBlipShader; + sfx = cgs.media.sfx_ric3; - velocity[ 0 ] = ( 2 * random( ) - 1.0f ) * LCANON_EJECTION_VEL; - velocity[ 1 ] = ( 2 * random( ) - 1.0f ) * LCANON_EJECTION_VEL; - velocity[ 2 ] = ( 2 * random( ) - 1.0f ) * LCANON_EJECTION_VEL; + radius = 8; + break; - CG_LaunchSprite( origin, velocity, accel, 0.0f, - 0.9f, 1.0f, 40.0f, 255, 0, rand( ) % 360, - cg.time, cg.time, 2000 + ( crandom( ) * 1000 ), - spark, qfalse, qfalse ); - } - break; + #define LCANON_EJECTION_VEL 300 + + case WP_LUCIFER_CANON: + mod = cgs.media.dishFlashModel; + shader = cgs.media.bfgExplosionShader; + mark = cgs.media.bulletMarkShader; + radius = 8; + sfx = cgs.media.sfx_plasmaexp; + isSprite = qtrue; + + for( i = 0; i <= damage / 20; i++ ) + { + qhandle_t spark; + vec3_t velocity; + vec3_t accel = { 0.0f, 0.0f, -DEFAULT_GRAVITY }; + + VectorMA( origin, 1.0f, dir, origin ); + + if( random( ) > 0.5f ) + spark = cgs.media.gibSpark1; + else + spark = cgs.media.scannerBlipShader; + + velocity[ 0 ] = ( 2 * random( ) - 1.0f ) * LCANON_EJECTION_VEL; + velocity[ 1 ] = ( 2 * random( ) - 1.0f ) * LCANON_EJECTION_VEL; + velocity[ 2 ] = ( 2 * random( ) - 1.0f ) * LCANON_EJECTION_VEL; + + CG_LaunchSprite( origin, velocity, accel, 0.0f, + 0.9f, 1.0f, 40.0f, 255, 0, rand( ) % 360, + cg.time, cg.time, 2000 + ( crandom( ) * 1000 ), + spark, qfalse, qfalse ); + } + break; } - if ( sfx ) { + if( sfx ) trap_S_StartSound( origin, ENTITYNUM_WORLD, CHAN_AUTO, sfx ); - } // // create the explosion // - if ( mod ) { + if( mod ) + { le = CG_MakeExplosion( origin, dir, - mod, shader, - duration, isSprite ); + mod, shader, + duration, isSprite ); le->light = light; VectorCopy( lightColor, le->lightColor ); -/* if ( weapon == WP_RAILGUN ) { - // colorize with client color - VectorCopy( cgs.clientinfo[clientNum].color1, le->color ); - }*/ } // @@ -2064,18 +1568,7 @@ void CG_MissileHitWall( int weapon, int clientNum, vec3_t origin, vec3_t dir, im alphaFade = ( mark == cgs.media.energyMarkShader || mark == cgs.media.greenBloodMarkShader ); -/* if( weapon == WP_RAILGUN ) - { - float *color; - - // colorize with client color - color = cgs.clientinfo[clientNum].color2; - CG_ImpactMark( mark, origin, dir, random()*360, color[0],color[1], color[2],1, alphaFade, radius, qfalse ); - } - else*/ - { - CG_ImpactMark( mark, origin, dir, random()*360, 1,1,1,1, alphaFade, radius, qfalse ); - } + CG_ImpactMark( mark, origin, dir, random( ) * 360, 1, 1, 1, 1, alphaFade, radius, qfalse ); } @@ -2084,138 +1577,23 @@ void CG_MissileHitWall( int weapon, int clientNum, vec3_t origin, vec3_t dir, im CG_MissileHitPlayer ================= */ -void CG_MissileHitPlayer( int weapon, vec3_t origin, vec3_t dir, int entityNum, int damage ) { +void CG_MissileHitPlayer( int weapon, vec3_t origin, vec3_t dir, int entityNum, int damage ) +{ CG_Bleed( origin, entityNum ); // some weapons will make an explosion with the blood, while // others will just make the blood - switch ( weapon ) { -/* case WP_GRENADE_LAUNCHER: - case WP_ROCKET_LAUNCHER: - CG_MissileHitWall( weapon, 0, origin, dir, IMPACTSOUND_FLESH ); - break;*/ - default: - break; - } -} - - - -/* -============================================================================ - -SHOTGUN TRACING - -============================================================================ -*/ - -/* -================ -CG_ShotgunPellet -================ -*/ -static void CG_ShotgunPellet( vec3_t start, vec3_t end, int skipNum ) { - trace_t tr; - int sourceContentType, destContentType; - - CG_Trace( &tr, start, NULL, NULL, end, skipNum, MASK_SHOT ); - - sourceContentType = trap_CM_PointContents( start, 0 ); - destContentType = trap_CM_PointContents( tr.endpos, 0 ); - - // FIXME: should probably move this cruft into CG_BubbleTrail - if ( sourceContentType == destContentType ) { - if ( sourceContentType & CONTENTS_WATER ) { - CG_BubbleTrail( start, tr.endpos, 32 ); - } - } else if ( sourceContentType & CONTENTS_WATER ) { - trace_t trace; - - trap_CM_BoxTrace( &trace, end, start, NULL, NULL, 0, CONTENTS_WATER ); - CG_BubbleTrail( start, trace.endpos, 32 ); - } else if ( destContentType & CONTENTS_WATER ) { - trace_t trace; - - trap_CM_BoxTrace( &trace, start, end, NULL, NULL, 0, CONTENTS_WATER ); - CG_BubbleTrail( tr.endpos, trace.endpos, 32 ); - } - - if ( tr.surfaceFlags & SURF_NOIMPACT ) { - return; - } - - if ( cg_entities[tr.entityNum].currentState.eType == ET_PLAYER ) { - /*CG_MissileHitPlayer( WP_SHOTGUN, tr.endpos, tr.plane.normal, tr.entityNum );*/ - } else { - if ( tr.surfaceFlags & SURF_NOIMPACT ) { - // SURF_NOIMPACT will not make a flame puff or a mark - return; - } - if ( tr.surfaceFlags & SURF_METALSTEPS ) { - /*CG_MissileHitWall( WP_SHOTGUN, 0, tr.endpos, tr.plane.normal, IMPACTSOUND_METAL );*/ - } else { - /*CG_MissileHitWall( WP_SHOTGUN, 0, tr.endpos, tr.plane.normal, IMPACTSOUND_DEFAULT );*/ - } - } -} - -/* -================ -CG_ShotgunPattern - -Perform the same traces the server did to locate the -hit splashes -================ -*/ -static void CG_ShotgunPattern( vec3_t origin, vec3_t origin2, int seed, int otherEntNum ) { - int i; - float r, u; - vec3_t end; - vec3_t forward, right, up; - - // derive the right and up vectors from the forward vector, because - // the client won't have any other information - VectorNormalize2( origin2, forward ); - PerpendicularVector( right, forward ); - CrossProduct( forward, right, up ); - - // generate the "random" spread pattern - for ( i = 0 ; i < DEFAULT_SHOTGUN_COUNT ; i++ ) { - r = Q_crandom( &seed ) * DEFAULT_SHOTGUN_SPREAD * 16; - u = Q_crandom( &seed ) * DEFAULT_SHOTGUN_SPREAD * 16; - VectorMA( origin, 8192 * 16, forward, end); - VectorMA (end, r, right, end); - VectorMA (end, u, up, end); - - CG_ShotgunPellet( origin, end, otherEntNum ); + switch( weapon ) + { + /* case WP_GRENADE_LAUNCHER: + case WP_ROCKET_LAUNCHER: + CG_MissileHitWall( weapon, 0, origin, dir, IMPACTSOUND_FLESH ); + break;*/ + default: + break; } } -/* -============== -CG_ShotgunFire -============== -*/ -void CG_ShotgunFire( entityState_t *es ) { - vec3_t v; - int contents; - - VectorSubtract( es->origin2, es->pos.trBase, v ); - VectorNormalize( v ); - VectorScale( v, 32, v ); - VectorAdd( es->pos.trBase, v, v ); - if ( cgs.glconfig.hardwareType != GLHW_RAGEPRO ) { - // ragepro can't alpha fade, so don't even bother with smoke - vec3_t up; - - contents = trap_CM_PointContents( es->pos.trBase, 0 ); - if ( !( contents & CONTENTS_WATER ) ) { - VectorSet( up, 0, 0, 8 ); - CG_SmokePuff( v, up, 32, 1, 1, 1, 0.33f, 900, cg.time, 0, LEF_PUFF_DONT_SCALE, cgs.media.shotgunSmokePuffShader ); - } - } - CG_ShotgunPattern( es->pos.trBase, es->origin2, es->eventParm, es->otherEntityNum ); -} /* ============================================================================ @@ -2231,78 +1609,78 @@ BULLETS CG_Tracer =============== */ -void CG_Tracer( vec3_t source, vec3_t dest ) { - vec3_t forward, right; - polyVert_t verts[4]; - vec3_t line; - float len, begin, end; - vec3_t start, finish; - vec3_t midpoint; +void CG_Tracer( vec3_t source, vec3_t dest ) +{ + vec3_t forward, right; + polyVert_t verts[ 4 ]; + vec3_t line; + float len, begin, end; + vec3_t start, finish; + vec3_t midpoint; // tracer VectorSubtract( dest, source, forward ); len = VectorNormalize( forward ); // start at least a little ways from the muzzle - if ( len < 100 ) { + if( len < 100 ) return; - } - begin = 50 + random() * (len - 60); + + begin = 50 + random( ) * ( len - 60 ); end = begin + cg_tracerLength.value; - if ( end > len ) { + if( end > len ) end = len; - } + VectorMA( source, begin, forward, start ); VectorMA( source, end, forward, finish ); - line[0] = DotProduct( forward, cg.refdef.viewaxis[1] ); - line[1] = DotProduct( forward, cg.refdef.viewaxis[2] ); + line[ 0 ] = DotProduct( forward, cg.refdef.viewaxis[ 1 ] ); + line[ 1 ] = DotProduct( forward, cg.refdef.viewaxis[ 2 ] ); - VectorScale( cg.refdef.viewaxis[1], line[1], right ); - VectorMA( right, -line[0], cg.refdef.viewaxis[2], right ); + VectorScale( cg.refdef.viewaxis[ 1 ], line[ 1 ], right ); + VectorMA( right, -line[ 0 ], cg.refdef.viewaxis[ 2 ], right ); VectorNormalize( right ); - VectorMA( finish, cg_tracerWidth.value, right, verts[0].xyz ); - verts[0].st[0] = 0; - verts[0].st[1] = 1; - verts[0].modulate[0] = 255; - verts[0].modulate[1] = 255; - verts[0].modulate[2] = 255; - verts[0].modulate[3] = 255; - - VectorMA( finish, -cg_tracerWidth.value, right, verts[1].xyz ); - verts[1].st[0] = 1; - verts[1].st[1] = 0; - verts[1].modulate[0] = 255; - verts[1].modulate[1] = 255; - verts[1].modulate[2] = 255; - verts[1].modulate[3] = 255; - - VectorMA( start, -cg_tracerWidth.value, right, verts[2].xyz ); - verts[2].st[0] = 1; - verts[2].st[1] = 1; - verts[2].modulate[0] = 255; - verts[2].modulate[1] = 255; - verts[2].modulate[2] = 255; - verts[2].modulate[3] = 255; - - VectorMA( start, cg_tracerWidth.value, right, verts[3].xyz ); - verts[3].st[0] = 0; - verts[3].st[1] = 0; - verts[3].modulate[0] = 255; - verts[3].modulate[1] = 255; - verts[3].modulate[2] = 255; - verts[3].modulate[3] = 255; + VectorMA( finish, cg_tracerWidth.value, right, verts[ 0 ].xyz ); + verts[ 0 ].st[ 0 ] = 0; + verts[ 0 ].st[ 1 ] = 1; + verts[ 0 ].modulate[ 0 ] = 255; + verts[ 0 ].modulate[ 1 ] = 255; + verts[ 0 ].modulate[ 2 ] = 255; + verts[ 0 ].modulate[ 3 ] = 255; + + VectorMA( finish, -cg_tracerWidth.value, right, verts[ 1 ].xyz ); + verts[ 1 ].st[ 0 ] = 1; + verts[ 1 ].st[ 1 ] = 0; + verts[ 1 ].modulate[ 0 ] = 255; + verts[ 1 ].modulate[ 1 ] = 255; + verts[ 1 ].modulate[ 2 ] = 255; + verts[ 1 ].modulate[ 3 ] = 255; + + VectorMA( start, -cg_tracerWidth.value, right, verts[ 2 ].xyz ); + verts[ 2 ].st[ 0 ] = 1; + verts[ 2 ].st[ 1 ] = 1; + verts[ 2 ].modulate[ 0 ] = 255; + verts[ 2 ].modulate[ 1 ] = 255; + verts[ 2 ].modulate[ 2 ] = 255; + verts[ 2 ].modulate[ 3 ] = 255; + + VectorMA( start, cg_tracerWidth.value, right, verts[ 3 ].xyz ); + verts[ 3 ].st[ 0 ] = 0; + verts[ 3 ].st[ 1 ] = 0; + verts[ 3 ].modulate[ 0 ] = 255; + verts[ 3 ].modulate[ 1 ] = 255; + verts[ 3 ].modulate[ 2 ] = 255; + verts[ 3 ].modulate[ 3 ] = 255; trap_R_AddPolyToScene( cgs.media.tracerShader, 4, verts ); - midpoint[0] = ( start[0] + finish[0] ) * 0.5; - midpoint[1] = ( start[1] + finish[1] ) * 0.5; - midpoint[2] = ( start[2] + finish[2] ) * 0.5; + midpoint[ 0 ] = ( start[ 0 ] + finish[ 0 ] ) * 0.5; + midpoint[ 1 ] = ( start[ 1 ] + finish[ 1 ] ) * 0.5; + midpoint[ 2 ] = ( start[ 2 ] + finish[ 2 ] ) * 0.5; // add the tracer sound trap_S_StartSound( midpoint, ENTITYNUM_WORLD, CHAN_AUTO, cgs.media.tracerSound ); - } @@ -2311,33 +1689,35 @@ void CG_Tracer( vec3_t source, vec3_t dest ) { CG_CalcMuzzlePoint ====================== */ -static qboolean CG_CalcMuzzlePoint( int entityNum, vec3_t muzzle ) { +static qboolean CG_CalcMuzzlePoint( int entityNum, vec3_t muzzle ) +{ vec3_t forward; centity_t *cent; - int anim; + int anim; - if ( entityNum == cg.snap->ps.clientNum ) { + if( entityNum == cg.snap->ps.clientNum ) + { VectorCopy( cg.snap->ps.origin, muzzle ); - muzzle[2] += cg.snap->ps.viewheight; + muzzle[ 2 ] += cg.snap->ps.viewheight; AngleVectors( cg.snap->ps.viewangles, forward, NULL, NULL ); VectorMA( muzzle, 14, forward, muzzle ); return qtrue; } cent = &cg_entities[entityNum]; - if ( !cent->currentValid ) { + + if( !cent->currentValid ) return qfalse; - } VectorCopy( cent->currentState.pos.trBase, muzzle ); AngleVectors( cent->currentState.apos.trBase, forward, NULL, NULL ); anim = cent->currentState.legsAnim & ~ANIM_TOGGLEBIT; - if ( anim == LEGS_WALKCR || anim == LEGS_IDLECR ) { - muzzle[2] += CROUCH_VIEWHEIGHT; - } else { - muzzle[2] += DEFAULT_VIEWHEIGHT; - } + + if( anim == LEGS_WALKCR || anim == LEGS_IDLECR ) + muzzle[ 2 ] += CROUCH_VIEWHEIGHT; + else + muzzle[ 2 ] += DEFAULT_VIEWHEIGHT; VectorMA( muzzle, 14, forward, muzzle ); @@ -2383,44 +1763,47 @@ CG_Bullet Renders bullet effects. ====================== */ -void CG_Bullet( vec3_t end, int sourceEntityNum, vec3_t normal, qboolean flesh, int fleshEntityNum ) { +void CG_Bullet( vec3_t end, int sourceEntityNum, vec3_t normal, qboolean flesh, int fleshEntityNum ) +{ trace_t trace; - int sourceContentType, destContentType; - vec3_t start; + int sourceContentType, destContentType; + vec3_t start; // if the shooter is currently valid, calc a source point and possibly // do trail effects - if ( sourceEntityNum >= 0 && cg_tracerChance.value > 0 ) { - if ( CG_CalcMuzzlePoint( sourceEntityNum, start ) ) { + if( sourceEntityNum >= 0 && cg_tracerChance.value > 0 ) + { + if( CG_CalcMuzzlePoint( sourceEntityNum, start ) ) + { sourceContentType = trap_CM_PointContents( start, 0 ); destContentType = trap_CM_PointContents( end, 0 ); // do a complete bubble trail if necessary - if ( ( sourceContentType == destContentType ) && ( sourceContentType & CONTENTS_WATER ) ) { + if( ( sourceContentType == destContentType ) && ( sourceContentType & CONTENTS_WATER ) ) CG_BubbleTrail( start, end, 32 ); - } + // bubble trail from water into air - else if ( ( sourceContentType & CONTENTS_WATER ) ) { + else if( ( sourceContentType & CONTENTS_WATER ) ) + { trap_CM_BoxTrace( &trace, end, start, NULL, NULL, 0, CONTENTS_WATER ); CG_BubbleTrail( start, trace.endpos, 32 ); } // bubble trail from air into water - else if ( ( destContentType & CONTENTS_WATER ) ) { + else if( ( destContentType & CONTENTS_WATER ) ) + { trap_CM_BoxTrace( &trace, start, end, NULL, NULL, 0, CONTENTS_WATER ); CG_BubbleTrail( trace.endpos, end, 32 ); } // draw a tracer - if ( random() < cg_tracerChance.value ) { + if( random( ) < cg_tracerChance.value ) CG_Tracer( start, end ); - } } } // impact splash and mark - if ( flesh ) { + if( flesh ) CG_Bleed( end, fleshEntityNum ); - } else { + else CG_MissileHitWall( WP_MACHINEGUN, 0, end, normal, IMPACTSOUND_DEFAULT, 0 ); - } } diff --git a/src/cgame/tr_types.h b/src/cgame/tr_types.h index fa5ae08f..e424cacc 100644 --- a/src/cgame/tr_types.h +++ b/src/cgame/tr_types.h @@ -18,115 +18,121 @@ #define __TR_TYPES_H -#define MAX_DLIGHTS 32 // can't be increased, because bit flags are used on surfaces -#define MAX_ENTITIES 1023 // can't be increased without changing drawsurf bit packing +#define MAX_DLIGHTS 32 // can't be increased, because bit flags are used on surfaces +#define MAX_ENTITIES 1023 // can't be increased without changing drawsurf bit packing // renderfx flags -#define RF_MINLIGHT 1 // allways have some light (viewmodel, some items) -#define RF_THIRD_PERSON 2 // don't draw through eyes, only mirrors (player bodies, chat sprites) -#define RF_FIRST_PERSON 4 // only draw through eyes (view weapon, damage blood blob) -#define RF_DEPTHHACK 8 // for view weapon Z crunching -#define RF_NOSHADOW 64 // don't add stencil shadows - -#define RF_LIGHTING_ORIGIN 128 // use refEntity->lightingOrigin instead of refEntity->origin - // for lighting. This allows entities to sink into the floor - // with their origin going solid, and allows all parts of a - // player to get the same lighting -#define RF_SHADOW_PLANE 256 // use refEntity->shadowPlane -#define RF_WRAP_FRAMES 512 // mod the model frames by the maxframes to allow continuous - // animation without needing to know the frame count +#define RF_MINLIGHT 1 // allways have some light (viewmodel, some items) +#define RF_THIRD_PERSON 2 // don't draw through eyes, only mirrors (player bodies, chat sprites) +#define RF_FIRST_PERSON 4 // only draw through eyes (view weapon, damage blood blob) +#define RF_DEPTHHACK 8 // for view weapon Z crunching +#define RF_NOSHADOW 64 // don't add stencil shadows + +#define RF_LIGHTING_ORIGIN 128 // use refEntity->lightingOrigin instead of refEntity->origin + // for lighting. This allows entities to sink into the floor + // with their origin going solid, and allows all parts of a + // player to get the same lighting +#define RF_SHADOW_PLANE 256 // use refEntity->shadowPlane +#define RF_WRAP_FRAMES 512 // mod the model frames by the maxframes to allow continuous + // animation without needing to know the frame count // refdef flags -#define RDF_NOWORLDMODEL 1 // used for player configuration screen -#define RDF_HYPERSPACE 4 // teleportation effect - -typedef struct { - vec3_t xyz; - float st[2]; - byte modulate[4]; +#define RDF_NOWORLDMODEL 1 // used for player configuration screen +#define RDF_HYPERSPACE 4 // teleportation effect + +typedef struct +{ + vec3_t xyz; + float st[ 2 ]; + byte modulate[ 4 ]; } polyVert_t; -typedef struct poly_s { - qhandle_t hShader; - int numVerts; - polyVert_t *verts; +typedef struct poly_s +{ + qhandle_t hShader; + int numVerts; + polyVert_t *verts; } poly_t; -typedef enum { - RT_MODEL, - RT_POLY, - RT_SPRITE, - RT_BEAM, - RT_RAIL_CORE, - RT_RAIL_RINGS, - RT_LIGHTNING, - RT_PORTALSURFACE, // doesn't draw anything, just info for portals - - RT_MAX_REF_ENTITY_TYPE +typedef enum +{ + RT_MODEL, + RT_POLY, + RT_SPRITE, + RT_BEAM, + RT_RAIL_CORE, + RT_RAIL_RINGS, + RT_LIGHTNING, + RT_PORTALSURFACE, // doesn't draw anything, just info for portals + + RT_MAX_REF_ENTITY_TYPE } refEntityType_t; -typedef struct { - refEntityType_t reType; - int renderfx; +typedef struct +{ + refEntityType_t reType; + int renderfx; - qhandle_t hModel; // opaque type outside refresh + qhandle_t hModel; // opaque type outside refresh - // most recent data - vec3_t lightingOrigin; // so multi-part models can be lit identically (RF_LIGHTING_ORIGIN) - float shadowPlane; // projection shadows go here, stencils go slightly lower + // most recent data + vec3_t lightingOrigin; // so multi-part models can be lit identically (RF_LIGHTING_ORIGIN) + float shadowPlane; // projection shadows go here, stencils go slightly lower - vec3_t axis[3]; // rotation vectors - qboolean nonNormalizedAxes; // axis are not normalized, i.e. they have scale - float origin[3]; // also used as MODEL_BEAM's "from" - int frame; // also used as MODEL_BEAM's diameter + vec3_t axis[ 3 ]; // rotation vectors + qboolean nonNormalizedAxes; // axis are not normalized, i.e. they have scale + float origin[ 3 ]; // also used as MODEL_BEAM's "from" + int frame; // also used as MODEL_BEAM's diameter - // previous data for frame interpolation - float oldorigin[3]; // also used as MODEL_BEAM's "to" - int oldframe; - float backlerp; // 0.0 = current, 1.0 = old + // previous data for frame interpolation + float oldorigin[ 3 ]; // also used as MODEL_BEAM's "to" + int oldframe; + float backlerp; // 0.0 = current, 1.0 = old - // texturing - int skinNum; // inline skin index - qhandle_t customSkin; // NULL for default skin - qhandle_t customShader; // use one image for the entire thing + // texturing + int skinNum; // inline skin index + qhandle_t customSkin; // NULL for default skin + qhandle_t customShader; // use one image for the entire thing - // misc - byte shaderRGBA[4]; // colors used by rgbgen entity shaders - float shaderTexCoord[2]; // texture coordinates used by tcMod entity modifiers - float shaderTime; // subtracted from refdef time to control effect start times + // misc + byte shaderRGBA[ 4 ]; // colors used by rgbgen entity shaders + float shaderTexCoord[ 2 ];// texture coordinates used by tcMod entity modifiers + float shaderTime; // subtracted from refdef time to control effect start times - // extra sprite information - float radius; - float rotation; + // extra sprite information + float radius; + float rotation; } refEntity_t; -#define MAX_RENDER_STRINGS 8 -#define MAX_RENDER_STRING_LENGTH 32 +#define MAX_RENDER_STRINGS 8 +#define MAX_RENDER_STRING_LENGTH 32 -typedef struct { - int x, y, width, height; - float fov_x, fov_y; - vec3_t vieworg; - vec3_t viewaxis[3]; // transformation matrix +typedef struct +{ + int x, y, width, height; + float fov_x, fov_y; + vec3_t vieworg; + vec3_t viewaxis[ 3 ]; // transformation matrix - // time in milliseconds for shader effects and other time dependent rendering issues - int time; + // time in milliseconds for shader effects and other time dependent rendering issues + int time; - int rdflags; // RDF_NOWORLDMODEL, etc + int rdflags; // RDF_NOWORLDMODEL, etc - // 1 bits will prevent the associated area from rendering at all - byte areamask[MAX_MAP_AREA_BYTES]; + // 1 bits will prevent the associated area from rendering at all + byte areamask[ MAX_MAP_AREA_BYTES ]; - // text messages for deform text shaders - char text[MAX_RENDER_STRINGS][MAX_RENDER_STRING_LENGTH]; + // text messages for deform text shaders + char text[ MAX_RENDER_STRINGS ][ MAX_RENDER_STRING_LENGTH ]; } refdef_t; -typedef enum { - STEREO_CENTER, - STEREO_LEFT, - STEREO_RIGHT +typedef enum +{ + STEREO_CENTER, + STEREO_LEFT, + STEREO_RIGHT } stereoFrame_t; @@ -137,77 +143,82 @@ typedef enum { ** being run right now. These are constant once the OpenGL ** subsystem is initialized. */ -typedef enum { - TC_NONE, - TC_S3TC +typedef enum +{ + TC_NONE, + TC_S3TC } textureCompression_t; -typedef enum { - GLDRV_ICD, // driver is integrated with window system - // WARNING: there are tests that check for - // > GLDRV_ICD for minidriverness, so this - // should always be the lowest value in this - // enum set - GLDRV_STANDALONE, // driver is a non-3Dfx standalone driver - GLDRV_VOODOO // driver is a 3Dfx standalone driver +typedef enum +{ + GLDRV_ICD, // driver is integrated with window system + // WARNING: there are tests that check for + // > GLDRV_ICD for minidriverness, so this + // should always be the lowest value in this + // enum set + GLDRV_STANDALONE, // driver is a non-3Dfx standalone driver + GLDRV_VOODOO // driver is a 3Dfx standalone driver } glDriverType_t; -typedef enum { - GLHW_GENERIC, // where everthing works the way it should - GLHW_3DFX_2D3D, // Voodoo Banshee or Voodoo3, relevant since if this is - // the hardware type then there can NOT exist a secondary - // display adapter - GLHW_RIVA128, // where you can't interpolate alpha - GLHW_RAGEPRO, // where you can't modulate alpha on alpha textures - GLHW_PERMEDIA2 // where you don't have src*dst +typedef enum +{ + GLHW_GENERIC, // where everthing works the way it should + GLHW_3DFX_2D3D, // Voodoo Banshee or Voodoo3, relevant since if this is + // the hardware type then there can NOT exist a secondary + // display adapter + GLHW_RIVA128, // where you can't interpolate alpha + GLHW_RAGEPRO, // where you can't modulate alpha on alpha textures + GLHW_PERMEDIA2 // where you don't have src*dst } glHardwareType_t; -typedef struct { - char renderer_string[MAX_STRING_CHARS]; - char vendor_string[MAX_STRING_CHARS]; - char version_string[MAX_STRING_CHARS]; - char extensions_string[BIG_INFO_STRING]; +typedef struct +{ + char renderer_string[ MAX_STRING_CHARS ]; + char vendor_string[ MAX_STRING_CHARS ]; + char version_string[ MAX_STRING_CHARS ]; + char extensions_string[ BIG_INFO_STRING ]; - int maxTextureSize; // queried from GL - int maxActiveTextures; // multitexture ability + int maxTextureSize; // queried from GL + int maxActiveTextures; // multitexture ability - int colorBits, depthBits, stencilBits; + int colorBits, depthBits, stencilBits; - glDriverType_t driverType; - glHardwareType_t hardwareType; + glDriverType_t driverType; + glHardwareType_t hardwareType; - qboolean deviceSupportsGamma; - textureCompression_t textureCompression; - qboolean textureEnvAddAvailable; + qboolean deviceSupportsGamma; + textureCompression_t textureCompression; + qboolean textureEnvAddAvailable; - int vidWidth, vidHeight; - // aspect is the screen's physical width / height, which may be different - // than scrWidth / scrHeight if the pixels are non-square - // normal screens should be 4/3, but wide aspect monitors may be 16/9 - float windowAspect; + int vidWidth, vidHeight; + + // aspect is the screen's physical width / height, which may be different + // than scrWidth / scrHeight if the pixels are non-square + // normal screens should be 4/3, but wide aspect monitors may be 16/9 + float windowAspect; - int displayFrequency; + int displayFrequency; - // synonymous with "does rendering consume the entire screen?", therefore - // a Voodoo or Voodoo2 will have this set to TRUE, as will a Win32 ICD that - // used CDS. - qboolean isFullscreen; - qboolean stereoEnabled; - qboolean smpActive; // dual processor + // synonymous with "does rendering consume the entire screen?", therefore + // a Voodoo or Voodoo2 will have this set to TRUE, as will a Win32 ICD that + // used CDS. + qboolean isFullscreen; + qboolean stereoEnabled; + qboolean smpActive; // dual processor } glconfig_t; #if !defined _WIN32 -#define _3DFX_DRIVER_NAME "libMesaVoodooGL.so" -#define OPENGL_DRIVER_NAME "libGL.so" +#define _3DFX_DRIVER_NAME "libMesaVoodooGL.so" +#define OPENGL_DRIVER_NAME "libGL.so" #else -#define _3DFX_DRIVER_NAME "3dfxvgl" -#define OPENGL_DRIVER_NAME "opengl32" +#define _3DFX_DRIVER_NAME "3dfxvgl" +#define OPENGL_DRIVER_NAME "opengl32" -#endif // !defined _WIN32 +#endif // !defined _WIN32 -#endif // __TR_TYPES_H +#endif // __TR_TYPES_H |