diff options
author | Tim Angus <tim@ngus.net> | 2002-07-29 18:43:15 +0000 |
---|---|---|
committer | Tim Angus <tim@ngus.net> | 2002-07-29 18:43:15 +0000 |
commit | c92d5d545127ef86c85607b6edb361c42bb9db68 (patch) | |
tree | b27284244a8a5d3f0b6f51b008a51ea141d58948 | |
parent | e633284d8b8f2fd4cbc246d45f217913bdd19dd8 (diff) |
* Scoreboard
* Level 1 class blob fire
* Loading screen
* "SPECTATOR" display uses TA UI
* Buildable weapon delays
* Display of build points on huds
-rw-r--r-- | Makefile | 1 | ||||
-rw-r--r-- | src/cgame/cg_buildable.c | 5 | ||||
-rw-r--r-- | src/cgame/cg_draw.c | 785 | ||||
-rw-r--r-- | src/cgame/cg_event.c | 9 | ||||
-rw-r--r-- | src/cgame/cg_local.h | 26 | ||||
-rw-r--r-- | src/cgame/cg_main.c | 1195 | ||||
-rw-r--r-- | src/cgame/cg_servercmds.c | 21 | ||||
-rw-r--r-- | src/cgame/cg_view.c | 4 | ||||
-rw-r--r-- | src/game/bg_lib.c | 16 | ||||
-rw-r--r-- | src/game/bg_lib.h | 1 | ||||
-rw-r--r-- | src/game/bg_pmove.c | 15 | ||||
-rw-r--r-- | src/game/bg_public.h | 4 | ||||
-rw-r--r-- | src/game/g_active.c | 13 | ||||
-rw-r--r-- | src/game/g_client.c | 4 | ||||
-rw-r--r-- | src/game/g_cmds.c | 10 | ||||
-rw-r--r-- | src/game/g_local.h | 1 | ||||
-rw-r--r-- | src/game/g_missile.c | 38 | ||||
-rw-r--r-- | src/game/g_weapon.c | 57 | ||||
-rw-r--r-- | src/ui/ui_main.c | 139 | ||||
-rw-r--r-- | src/ui/ui_shared.c | 36 | ||||
-rw-r--r-- | src/ui/ui_shared.h | 1 | ||||
-rw-r--r-- | ui/menudef.h | 64 |
22 files changed, 1414 insertions, 1031 deletions
@@ -54,7 +54,6 @@ CGOBJ = \ $(CGDIRNAME)/cg_effects.o \ $(CGDIRNAME)/cg_ents.o \ $(CGDIRNAME)/cg_event.o \ - $(CGDIRNAME)/cg_info.o \ $(CGDIRNAME)/cg_localents.o \ $(CGDIRNAME)/cg_marks.o \ $(CGDIRNAME)/cg_players.o \ diff --git a/src/cgame/cg_buildable.c b/src/cgame/cg_buildable.c index 2414ca12..bd337dcc 100644 --- a/src/cgame/cg_buildable.c +++ b/src/cgame/cg_buildable.c @@ -220,6 +220,8 @@ void CG_InitBuildables( ) defaultHumanSounds[ j ] = trap_S_RegisterSound( filename, qfalse ); } + cg.buildablesFraction = 0.0f; + for( i = BA_NONE + 1; i < BA_NUM_BUILDABLES; i++ ) { buildableName = BG_FindNameForBuildable( i ); @@ -266,6 +268,9 @@ void CG_InitBuildables( ) } } } + + cg.buildablesFraction = (float)i / (float)( BA_NUM_BUILDABLES - 1 ); + trap_UpdateScreen( ); } } diff --git a/src/cgame/cg_draw.c b/src/cgame/cg_draw.c index 5b512a0e..1aca9df4 100644 --- a/src/cgame/cg_draw.c +++ b/src/cgame/cg_draw.c @@ -205,6 +205,63 @@ void CG_Text_Paint( float x, float y, float scale, vec4_t color, const char *tex colorBlack[ 3 ] = 1.0; trap_R_SetColor( newColor ); } + else if( style == ITEM_TEXTSTYLE_NEON ) + { + vec4_t glow, outer, inner, white; + + glow[ 0 ] = newColor[ 0 ] * 0.5; + glow[ 1 ] = newColor[ 1 ] * 0.5; + glow[ 2 ] = newColor[ 2 ] * 0.5; + glow[ 3 ] = newColor[ 3 ] * 0.2; + + outer[ 0 ] = newColor[ 0 ]; + outer[ 1 ] = newColor[ 1 ]; + outer[ 2 ] = newColor[ 2 ]; + outer[ 3 ] = newColor[ 3 ]; + + inner[ 0 ] = newColor[ 0 ] * 1.5 > 1.0f ? 1.0f : newColor[ 0 ] * 1.5; + inner[ 1 ] = newColor[ 1 ] * 1.5 > 1.0f ? 1.0f : newColor[ 1 ] * 1.5; + inner[ 2 ] = newColor[ 2 ] * 1.5 > 1.0f ? 1.0f : newColor[ 2 ] * 1.5; + inner[ 3 ] = newColor[ 3 ]; + + white[ 0 ] = white[ 1 ] = white[ 2 ] = white[ 3 ] = 1.0f; + + trap_R_SetColor( glow ); + CG_Text_PaintChar( x - 3, y - yadj - 3, + glyph->imageWidth + 6, + glyph->imageHeight + 6, + useScale, + glyph->s, + glyph->t, + glyph->s2, + glyph->t2, + glyph->glyph ); + + trap_R_SetColor( outer ); + CG_Text_PaintChar( x - 1, y - yadj - 1, + glyph->imageWidth + 2, + glyph->imageHeight + 2, + useScale, + glyph->s, + glyph->t, + glyph->s2, + glyph->t2, + glyph->glyph ); + + trap_R_SetColor( inner ); + CG_Text_PaintChar( x - 0.5, y - yadj - 0.5, + glyph->imageWidth + 1, + glyph->imageHeight + 1, + useScale, + glyph->s, + glyph->t, + glyph->s2, + glyph->t2, + glyph->glyph ); + + trap_R_SetColor( white ); + } + CG_Text_PaintChar( x, y - yadj, glyph->imageWidth, @@ -389,7 +446,21 @@ static void CG_DrawPlayerAmmoValue( rectDef_t *rect, vec4_t color ) if( cent->currentState.weapon ) { - BG_unpackAmmoArray( cent->currentState.weapon, ps->ammo, ps->powerups, &value, NULL, NULL ); + switch( cent->currentState.weapon ) + { + case WP_ABUILD: + case WP_ABUILD2: + case WP_HBUILD: + case WP_HBUILD2: + //percentage of power remaining + value = (int)( ( (float)cgs.humanBuildPoints / (float)cgs.humanBuildPointsTotal ) * 100.0f ); + break; + + default: + BG_unpackAmmoArray( cent->currentState.weapon, ps->ammo, ps->powerups, &value, NULL, NULL ); + break; + } + if( value > -1 ) { trap_R_SetColor( color ); @@ -399,6 +470,8 @@ static void CG_DrawPlayerAmmoValue( rectDef_t *rect, vec4_t color ) } } +#define BUILD_DELAY_TIME 2000 + static void CG_DrawPlayerClipsValue( rectDef_t *rect, vec4_t color ) { int value; @@ -410,7 +483,31 @@ static void CG_DrawPlayerClipsValue( rectDef_t *rect, vec4_t color ) if( cent->currentState.weapon ) { - BG_unpackAmmoArray( cent->currentState.weapon, ps->ammo, ps->powerups, NULL, &value, NULL ); + switch( cent->currentState.weapon ) + { + case WP_ABUILD: + case WP_ABUILD2: + case WP_HBUILD: + case WP_HBUILD2: + //remaining build delay + value = (int)( ceil( (float)ps->stats[ STAT_MISC ] / 1000.0f ) ); + + if( cg.time - cg.lastBuildAttempt <= BUILD_DELAY_TIME ) + { + if( ( cg.time / 300 ) % 2 ) + { + color[ 0 ] = 1.0f; + color[ 1 ] = color[ 2 ] = 0.0f; + color[ 3 ] = 1.0f; + } + } + break; + + default: + BG_unpackAmmoArray( cent->currentState.weapon, ps->ammo, ps->powerups, NULL, &value, NULL ); + break; + } + if( value > -1 ) { trap_R_SetColor( color ); @@ -434,6 +531,274 @@ static void CG_DrawPlayerHealth( rectDef_t *rect, vec4_t color ) trap_R_SetColor( NULL ); } +static void CG_DrawProgressBar( rectDef_t *rect, vec4_t color, + float scale, int align, int textStyle, float progress ) +{ + int rimWidth = (int)( rect->h / 20.0f ); + float doneWidth = ( rect->w - 2 * rimWidth ) * progress; + float leftWidth = ( rect->w - 2 * rimWidth ) - doneWidth; + float tx, ty, tw, th; + char textBuffer[ 8 ]; + + if( progress < 0.0f ) + progress = 0.0f; + else if( progress > 1.0f ) + progress = 1.0f; + + trap_R_SetColor( color ); + + //draw rim and bar + CG_DrawPic( rect->x, rect->y, rimWidth + doneWidth, rect->h, cgs.media.whiteShader ); + CG_DrawPic( rimWidth + rect->x + doneWidth, rect->y, + leftWidth, rimWidth, cgs.media.whiteShader ); + CG_DrawPic( rimWidth + rect->x + doneWidth, rect->y + rect->h - rimWidth, + leftWidth, rimWidth, cgs.media.whiteShader ); + CG_DrawPic( rect->x + rect->w - rimWidth, rect->y, rimWidth, rect->h, cgs.media.whiteShader ); + + trap_R_SetColor( NULL ); + + //draw text + Com_sprintf( textBuffer, sizeof( textBuffer ), "%d%%", (int)( progress * 100 ) ); + tw = CG_Text_Width( textBuffer, scale, 0 ); + th = scale * 40.0f; + + switch( align ) + { + case ITEM_ALIGN_LEFT: + tx = rect->x + ( rect->w / 10.0f ); + ty = rect->y + ( rect->h / 2.0f ) + ( th / 2.0f ); + break; + + case ITEM_ALIGN_RIGHT: + tx = rect->x + rect->w - ( rect->w / 10.0f ) - tw; + ty = rect->y + ( rect->h / 2.0f ) + ( th / 2.0f ); + break; + + case ITEM_ALIGN_CENTER: + tx = rect->x + ( rect->w / 2.0f ) - ( tw / 2.0f ); + ty = rect->y + ( rect->h / 2.0f ) + ( th / 2.0f ); + break; + + default: + tx = ty = 0.0f; + } + + CG_Text_Paint( tx, ty, scale, color, textBuffer, 0, 0, textStyle ); +} + +static void CG_DrawProgressLabel( rectDef_t *rect, float text_x, float text_y, vec4_t color, + float scale, int align, const char *s, float fraction ) +{ + vec4_t white = { 1.0f, 1.0f, 1.0f, 1.0f }; + float tx, tw = CG_Text_Width( s, scale, 0 ); + + switch( align ) + { + case ITEM_ALIGN_LEFT: + tx = 0.0f; + break; + + case ITEM_ALIGN_RIGHT: + tx = rect->w - tw; + break; + + case ITEM_ALIGN_CENTER: + tx = ( rect->w / 2.0f ) - ( tw / 2.0f ); + break; + + default: + tx = 0.0f; + } + + if( fraction < 1.0f ) + CG_Text_Paint( rect->x + text_x + tx, rect->y + text_y, scale, white, + s, 0, 0, ITEM_TEXTSTYLE_NORMAL ); + else + CG_Text_Paint( rect->x + text_x + tx, rect->y + text_y, scale, color, + s, 0, 0, ITEM_TEXTSTYLE_NEON ); +} + +static void CG_DrawMediaProgress( rectDef_t *rect, vec4_t color, float scale, int align, int textStyle ) +{ + CG_DrawProgressBar( rect, color, scale, align, textStyle, cg.mediaFraction ); +} + +static void CG_DrawMediaProgressLabel( rectDef_t *rect, float text_x, float text_y, + vec4_t color, float scale, int align ) +{ + CG_DrawProgressLabel( rect, text_x, text_y, color, scale, align, "Map and Textures", cg.mediaFraction ); +} + +static void CG_DrawBuildablesProgress( rectDef_t *rect, vec4_t color, float scale, int align, int textStyle ) +{ + CG_DrawProgressBar( rect, color, scale, align, textStyle, cg.buildablesFraction ); +} + +static void CG_DrawBuildablesProgressLabel( rectDef_t *rect, float text_x, float text_y, + vec4_t color, float scale, int align ) +{ + CG_DrawProgressLabel( rect, text_x, text_y, color, scale, align, "Buildable Models", cg.buildablesFraction ); +} + +static void CG_DrawCharModelProgress( rectDef_t *rect, vec4_t color, float scale, int align, int textStyle ) +{ + CG_DrawProgressBar( rect, color, scale, align, textStyle, cg.charModelFraction ); +} + +static void CG_DrawCharModelProgressLabel( rectDef_t *rect, float text_x, float text_y, + vec4_t color, float scale, int align ) +{ + CG_DrawProgressLabel( rect, text_x, text_y, color, scale, align, "Character Models", cg.charModelFraction ); +} + +static void CG_DrawOverallProgress( rectDef_t *rect, vec4_t color, float scale, int align, int textStyle ) +{ + float total; + + total = ( cg.charModelFraction + cg.buildablesFraction + cg.mediaFraction ) / 3.0f; + CG_DrawProgressBar( rect, color, scale, align, textStyle, total ); +} + +static void CG_DrawLevelShot( rectDef_t *rect ) +{ + const char *s; + const char *info; + qhandle_t levelshot; + qhandle_t detail; + + info = CG_ConfigString( CS_SERVERINFO ); + s = Info_ValueForKey( info, "mapname" ); + levelshot = trap_R_RegisterShaderNoMip( va( "levelshots/%s.tga", s ) ); + + if( !levelshot ) + levelshot = trap_R_RegisterShaderNoMip( "gfx/2d/load_screen" ); + + trap_R_SetColor( NULL ); + CG_DrawPic( rect->x, rect->y, rect->w, rect->h, levelshot ); + + // blend a detail texture over it + detail = trap_R_RegisterShader( "levelShotDetail" ); + CG_DrawPic( rect->x, rect->y, rect->w, rect->h, detail ); +} + +static void CG_DrawLoadingString( rectDef_t *rect, float text_x, float text_y, vec4_t color, + float scale, int align, int textStyle, const char *s ) +{ + float tw, th, tx; + int pos, i; + char buffer[ 1024 ]; + char *end; + + if( !s[ 0 ] ) + return; + + strcpy( buffer, s ); + tw = CG_Text_Width( s, scale, 0 ); + th = scale * 40.0f; + + pos = i = 0; + + while( pos < strlen( s ) ) + { + strcpy( buffer, &s[ pos ] ); + tw = CG_Text_Width( buffer, scale, 0 ); + + while( tw > rect->w ) + { + end = strrchr( buffer, ' ' ); + + if( end == NULL ) + break; + + *end = '\0'; + tw = CG_Text_Width( buffer, scale, 0 ); + } + + switch( align ) + { + case ITEM_ALIGN_LEFT: + tx = rect->x; + break; + + case ITEM_ALIGN_RIGHT: + tx = rect->x + rect->w - tw; + break; + + case ITEM_ALIGN_CENTER: + tx = rect->x + ( rect->w / 2.0f ) - ( tw / 2.0f ); + break; + + default: + tx = 0.0f; + } + + CG_Text_Paint( tx + text_x, rect->y + text_y + i * ( th + 3 ), scale, color, + buffer, 0, 0, textStyle ); + + pos += strlen( buffer ) + 1; + i++; + } +} + +static void CG_DrawLevelName( rectDef_t *rect, float text_x, float text_y, + vec4_t color, float scale, int align, int textStyle ) +{ + const char *s; + + s = CG_ConfigString( CS_MESSAGE ); + + CG_DrawLoadingString( rect, text_x, text_y, color, scale, align, textStyle, s ); +} + +static void CG_DrawMOTD( rectDef_t *rect, float text_x, float text_y, + vec4_t color, float scale, int align, int textStyle ) +{ + const char *s; + + s = CG_ConfigString( CS_MOTD ); + + CG_DrawLoadingString( rect, text_x, text_y, color, scale, align, textStyle, s ); +} + +static void CG_DrawHostname( rectDef_t *rect, float text_x, float text_y, + vec4_t color, float scale, int align, int textStyle ) +{ + char buffer[ 1024 ]; + const char *info; + + info = CG_ConfigString( CS_SERVERINFO ); + + Q_strncpyz( buffer, Info_ValueForKey( info, "sv_hostname" ), 1024 ); + Q_CleanStr( buffer ); + + CG_DrawLoadingString( rect, text_x, text_y, color, scale, align, textStyle, buffer ); +} + +/* +====================== +CG_UpdateMediaFraction + +====================== +*/ +void CG_UpdateMediaFraction( float newFract ) +{ + cg.mediaFraction = newFract; + + trap_UpdateScreen( ); +} + +/* +==================== +CG_DrawLoadingScreen + +Draw all the status / pacifier stuff during level loading +==================== +*/ +void CG_DrawLoadingScreen( void ) +{ + Menu_Paint( Menus_FindByName( "Loading" ), qtrue ); +} + float CG_GetValue( int ownerDraw ) { centity_t *cent; @@ -589,6 +954,80 @@ static void CG_Text_Paint_Limit( float *maxX, float x, float y, float scale, } } +static void CG_DrawTeamSpectators( rectDef_t *rect, float scale, vec4_t color, qhandle_t shader ) +{ + if( cg.spectatorLen ) + { + float maxX; + + if( cg.spectatorWidth == -1 ) + { + cg.spectatorWidth = 0; + cg.spectatorPaintX = rect->x + 1; + cg.spectatorPaintX2 = -1; + } + + if( cg.spectatorOffset > cg.spectatorLen ) + { + cg.spectatorOffset = 0; + cg.spectatorPaintX = rect->x + 1; + cg.spectatorPaintX2 = -1; + } + + if( cg.time > cg.spectatorTime ) + { + cg.spectatorTime = cg.time + 10; + + if( cg.spectatorPaintX <= rect->x + 2 ) + { + if( cg.spectatorOffset < cg.spectatorLen ) + { + cg.spectatorPaintX += CG_Text_Width( &cg.spectatorList[ cg.spectatorOffset ], scale, 1 ) - 1; + cg.spectatorOffset++; + } + else + { + cg.spectatorOffset = 0; + + if( cg.spectatorPaintX2 >= 0 ) + cg.spectatorPaintX = cg.spectatorPaintX2; + else + cg.spectatorPaintX = rect->x + rect->w - 2; + + cg.spectatorPaintX2 = -1; + } + } + else + { + cg.spectatorPaintX--; + + if( cg.spectatorPaintX2 >= 0 ) + cg.spectatorPaintX2--; + } + } + + maxX = rect->x + rect->w - 2; + + CG_Text_Paint_Limit( &maxX, cg.spectatorPaintX, rect->y + rect->h - 3, scale, color, + &cg.spectatorList[ cg.spectatorOffset ], 0, 0 ); + + if( cg.spectatorPaintX2 >= 0 ) + { + float maxX2 = rect->x + rect->w - 2; + CG_Text_Paint_Limit( &maxX2, cg.spectatorPaintX2, rect->y + rect->h - 3, scale, + color, cg.spectatorList, 0, cg.spectatorOffset ); + } + + if( cg.spectatorOffset && maxX > 0 ) + { + // if we have an offset ( we are skipping the first part of the string ) and we fit the string + if( cg.spectatorPaintX2 == -1 ) + cg.spectatorPaintX2 = rect->x + rect->w - 2; + } + else + cg.spectatorPaintX2 = -1; + } +} void CG_OwnerDraw( float x, float y, float w, float h, float text_x, float text_y, int ownerDraw, int ownerDrawFlags, int align, float special, float scale, vec4_t color, @@ -642,6 +1081,44 @@ void CG_OwnerDraw( float x, float y, float w, float h, float text_x, case CG_PLAYER_SELECTTEXT: CG_DrawWeaponSelectText( &rect, scale, textStyle ); break; + case CG_SPECTATORS: + CG_DrawTeamSpectators( &rect, scale, color, shader ); + break; + + //loading screen + case CG_LOAD_LEVELSHOT: + CG_DrawLevelShot( &rect ); + break; + case CG_LOAD_MEDIA: + CG_DrawMediaProgress( &rect, color, scale, align, textStyle ); + break; + case CG_LOAD_MEDIA_LABEL: + CG_DrawMediaProgressLabel( &rect, text_x, text_y, color, scale, align ); + break; + case CG_LOAD_BUILDABLES: + CG_DrawBuildablesProgress( &rect, color, scale, align, textStyle ); + break; + case CG_LOAD_BUILDABLES_LABEL: + CG_DrawBuildablesProgressLabel( &rect, text_x, text_y, color, scale, align ); + break; + case CG_LOAD_CHARMODEL: + CG_DrawCharModelProgress( &rect, color, scale, align, textStyle ); + break; + case CG_LOAD_CHARMODEL_LABEL: + CG_DrawCharModelProgressLabel( &rect, text_x, text_y, color, scale, align ); + break; + case CG_LOAD_OVERALL: + CG_DrawOverallProgress( &rect, color, scale, align, textStyle ); + break; + case CG_LOAD_LEVELNAME: + CG_DrawLevelName( &rect, text_x, text_y, color, scale, align, textStyle ); + break; + case CG_LOAD_MOTD: + CG_DrawMOTD( &rect, text_x, text_y, color, scale, align, textStyle ); + break; + case CG_LOAD_HOSTNAME: + CG_DrawHostname( &rect, text_x, text_y, color, scale, align, textStyle ); + break; default: break; } @@ -829,253 +1306,6 @@ static void CG_DrawLighting( void ) } /* -================ -CG_DrawStatusBar - -================ -*/ -/*static void CG_DrawStatusBar( void ) { - int color; - centity_t *cent; - playerState_t *ps; - int value; - int ammo, clips, maxclips; - vec4_t hcolor; - vec3_t angles; - vec3_t origin; - static float colors[4][4] = { -// { 0.2, 1.0, 0.2, 1.0 } , { 1.0, 0.2, 0.2, 1.0 }, {0.5, 0.5, 0.5, 1} }; - { 0.3f, 0.4f, 0.3f, 1.0f } , // normal - { 1.0f, 0.2f, 0.2f, 1.0f }, // low health - {0.2f, 0.3f, 0.2f, 1.0f}, // weapon firing - { 1.0f, 1.0f, 1.0f, 1.0f } }; // health > 100 - - - if ( cg_drawStatus.integer == 0 ) { - return; - } - - // draw the team background - CG_DrawTeamBackground( 0, 420, 640, 60, 0.33f, cg.snap->ps.persistant[PERS_TEAM] ); - - cent = &cg_entities[cg.snap->ps.clientNum]; - ps = &cg.snap->ps; - - VectorClear( angles );*/ - - //TA: stop drawing all these silly 3d models on the hud. Saves space and is more realistic. - - // draw any 3D icons first, so the changes back to 2D are minimized - /*if ( cent->currentState.weapon && cg_weapons[ cent->currentState.weapon ].ammoModel ) { - origin[0] = 70; - origin[1] = 0; - origin[2] = 0; - angles[YAW] = 90 + 20 * sin( cg.time / 1000.0 ); - CG_Draw3DModel( CHAR_WIDTH*3 + TEXT_ICON_SPACE, 432, ICON_SIZE, ICON_SIZE, - cg_weapons[ cent->currentState.weapon ].ammoModel, 0, origin, angles ); - }*/ - - //CG_DrawStatusBarHead( 185 + CHAR_WIDTH*3 + TEXT_ICON_SPACE ); - - /*if (cg.predictedPlayerState.powerups[PW_REDFLAG]) - CG_DrawStatusBarFlag( 185 + CHAR_WIDTH*3 + TEXT_ICON_SPACE + ICON_SIZE, TEAM_HUMANS); - else if (cg.predictedPlayerState.powerups[PW_BLUEFLAG]) - CG_DrawStatusBarFlag( 185 + CHAR_WIDTH*3 + TEXT_ICON_SPACE + ICON_SIZE, TEAM_ALIENS);*/ - - /*if ( ps->stats[ STAT_ARMOR ] ) { - origin[0] = 90; - origin[1] = 0; - origin[2] = -10; - angles[YAW] = ( cg.time & 2047 ) * 360 / 2048.0; - CG_Draw3DModel( 370 + CHAR_WIDTH*3 + TEXT_ICON_SPACE, 432, ICON_SIZE, ICON_SIZE, - cgs.media.armorModel, 0, origin, angles ); - }*/ - - // - // ammo - // -/* if ( cent->currentState.weapon ) { - //TA: must mask off clips and maxClips - if( !BG_FindInfinteAmmoForWeapon( cent->currentState.weapon ) ) - BG_unpackAmmoArray( cent->currentState.weapon, ps->ammo, ps->powerups, &ammo, &clips, &maxclips ); - else - ammo = -1; - - if ( ammo > -1 ) { - if ( cg.predictedPlayerState.weaponstate == WEAPON_FIRING - && cg.predictedPlayerState.weaponTime > 100 ) { - // draw as dark grey when reloading - color = 2; // dark grey - } else { - if ( ammo >= 0 ) { - color = 0; // green - } else { - color = 1; // red - } - } - trap_R_SetColor( colors[color] ); - - CG_DrawField( 85, 432, 3, ammo); - - if( maxclips ) - CG_DrawField( 20, 432, 1, clips ); - - trap_R_SetColor( NULL );*/ - - // if we didn't draw a 3D icon, draw a 2D icon for ammo - /*if ( !cg_draw3dIcons.integer && cg_drawIcons.integer ) { - qhandle_t icon; - - icon = cg_weapons[ cg.predictedPlayerState.weapon ].ammoIcon; - if ( icon ) { - CG_DrawPic( CHAR_WIDTH*3 + TEXT_ICON_SPACE, 432, ICON_SIZE, ICON_SIZE, icon ); - } - }*/ -/* } - } - - // - // stamina - // - #define STAM_HEIGHT 20 - #define STAM_WIDTH 10 - #define STAM_X 5 - #define STAM_Y 435 - if( ps->stats[ STAT_PTEAM ] == PTE_HUMANS ) - { - int stamina = ps->stats[ STAT_STAMINA ]; - int height = (int)( (float)stamina / ( 1000 / STAM_HEIGHT ) ); - vec4_t bcolor = { 0.5, 0.5, 0.5, 0.5 }; - - trap_R_SetColor( bcolor ); // white - CG_DrawPic( STAM_X, STAM_Y, STAM_WIDTH, STAM_HEIGHT * 2, cgs.media.whiteShader ); - - if( stamina > 0 ) - { - trap_R_SetColor( colors[0] ); // green - CG_DrawPic( STAM_X, STAM_Y + ( STAM_HEIGHT - height ), - STAM_WIDTH, height, cgs.media.whiteShader ); - } - - if( stamina < 0 ) - { - trap_R_SetColor( colors[1] ); // red - CG_DrawPic( STAM_X, STAM_Y + STAM_HEIGHT , STAM_WIDTH, -height, cgs.media.whiteShader ); - } - } - - // - // power - // - #define PWR_HEIGHT 10 - #define PWR_WIDTH 80 - #define PWR_X 555 - #define PWR_Y 20 - if( ps->stats[ STAT_PTEAM ] == PTE_HUMANS ) - { - float total = cgs.humanBuildPointsTotal; - float allocated = total - cgs.humanBuildPoints; - float powered = total - cgs.humanBuildPointsPowered; - - int awidth = (int)( ( allocated / total ) * PWR_WIDTH ); - int pwidth = (int)( ( powered / total ) * PWR_WIDTH ); - vec4_t bcolor = { 0.5, 0.5, 0.5, 0.5 }; - - char *s; - int w; - - trap_R_SetColor( bcolor ); // white - CG_DrawPic( PWR_X, PWR_Y, PWR_WIDTH, PWR_HEIGHT, cgs.media.whiteShader ); - - trap_R_SetColor( colors[0] ); // green - CG_DrawPic( PWR_X, PWR_Y, awidth, PWR_HEIGHT, cgs.media.whiteShader ); - - if( allocated > powered ) - { - trap_R_SetColor( colors[1] ); // red - CG_DrawPic( PWR_X + pwidth, PWR_Y, awidth - pwidth, PWR_HEIGHT, cgs.media.whiteShader ); - } - - //display amount of credit - s = va( "%dg", ps->stats[ PERS_CREDIT ] ); - w = CG_DrawStrlen( s ) * BIGCHAR_WIDTH; - CG_DrawBigString( 635 - w, 35, s, 1.0F); - } - - // - // hive - // - #define HV_HEIGHT 10 - #define HV_WIDTH 80 - #define HV_X 555 - #define HV_Y 20 - if( ps->stats[ STAT_PTEAM ] == PTE_ALIENS ) - { - float total = cgs.alienBuildPointsTotal; - float allocated = total - cgs.alienBuildPoints; - - int awidth = (int)( ( allocated / total ) * HV_WIDTH ); - vec4_t bcolor = { 0.5, 0.5, 0.5, 0.5 }; - - trap_R_SetColor( bcolor ); // white - CG_DrawPic( HV_X, HV_Y, HV_WIDTH, HV_HEIGHT, cgs.media.whiteShader ); - - trap_R_SetColor( colors[0] ); // green - CG_DrawPic( HV_X, HV_Y, awidth, HV_HEIGHT, cgs.media.whiteShader ); - } - - // - // health+armor - // - if( ps->stats[ STAT_PTEAM ] == PTE_ALIENS ) - { - vec4_t fcolor = { 1, 0, 0, 0.5 }; //red half alpha - vec4_t tcolor = { 0.3, 0.8, 1, 1 }; //cyan no alpha - - value = (int)( (float)( (float)ps->stats[STAT_HEALTH] / ps->stats[STAT_MAX_HEALTH] ) * 100 ); - - CG_DrawFadePic( 20, 0, 30, 440, fcolor, tcolor, value, cgs.media.alienHealth );*/ - -/* value = (int)( (float)( (float)ps->stats[STAT_ARMOR] / ps->stats[STAT_MAX_HEALTH] ) * 100 ); - - if( value > 0 ) - CG_DrawFadePic( 580, 0, 30, 440, fcolor, tcolor, value, cgs.media.alienHealth );*/ -/* } - else - { - value = ps->stats[STAT_HEALTH]; - if ( value > 100 ) { - trap_R_SetColor( colors[0] ); // white - } else if (value > 25) { - trap_R_SetColor( colors[0] ); // green - } else if (value > 0) { - color = (cg.time >> 8) & 1; // flash - trap_R_SetColor( colors[color] ); - } else { - trap_R_SetColor( colors[1] ); // red - } - - // stretch the health up when taking damage - CG_DrawField ( 300, 432, 3, value); - CG_ColorForHealth( hcolor ); - trap_R_SetColor( hcolor ); -*/ -/* value = ps->stats[STAT_ARMOR]; - if (value > 0 ) - { - trap_R_SetColor( colors[0] ); - CG_DrawField (541, 432, 3, value); - trap_R_SetColor( NULL ); - // if we didn't draw a 3D icon, draw a 2D icon for armor - if ( !cg_draw3dIcons.integer && cg_drawIcons.integer ) { - CG_DrawPic( 370 + CHAR_WIDTH*3 + TEXT_ICON_SPACE, 432, ICON_SIZE, ICON_SIZE, cgs.media.armorIcon ); - } - }*/ -/* } - -}*/ - -/* =========================================================================================== UPPER RIGHT CORNER @@ -1828,7 +2058,49 @@ static void CG_DrawTeamVote( void ) static qboolean CG_DrawScoreboard( ) { - return CG_DrawOldScoreboard( ); + static qboolean firstTime = qtrue; + float fade, *fadeColor; + + if( menuScoreboard ) + menuScoreboard->window.flags &= ~WINDOW_FORCED; + + if( cg_paused.integer ) + { + cg.deferredPlayerLoading = 0; + firstTime = qtrue; + return qfalse; + } + + if( cg.showScores || cg.predictedPlayerState.pm_type == PM_DEAD || + cg.predictedPlayerState.pm_type == PM_INTERMISSION ) + { + fade = 1.0; + fadeColor = colorWhite; + } + else + { + cg.deferredPlayerLoading = 0; + cg.killerName[ 0 ] = 0; + firstTime = qtrue; + return qfalse; + } + + + if( menuScoreboard == NULL ) + menuScoreboard = Menus_FindByName( "teamscore_menu" ); + + if( menuScoreboard ) + { + if( firstTime ) + { + CG_SetScoreSelection( menuScoreboard ); + firstTime = qfalse; + } + + Menu_Paint( menuScoreboard, qtrue ); + } + + return qtrue; } /* @@ -2045,6 +2317,7 @@ static void CG_DrawWarmup( void ) //================================================================================== +#define SPECTATOR_STRING "SPECTATOR" /* ================= CG_Draw2D @@ -2052,7 +2325,11 @@ CG_Draw2D */ static void CG_Draw2D( void ) { + vec4_t color; + float w; + color[ 0 ] = color[ 1 ] = color[ 2 ] = color[ 3 ] = 1.0f; + // if we are taking a levelshot for the menu, don't draw anything if( cg.levelShot ) return; @@ -2070,7 +2347,10 @@ static void CG_Draw2D( void ) CG_DrawLighting( ); if( cg.snap->ps.persistant[ PERS_TEAM ] == TEAM_SPECTATOR ) - CG_DrawBigString(320 - 9 * 8, 440, "SPECTATOR", 1.0F); + { + w = CG_Text_Width( SPECTATOR_STRING, 0.7f, 0 ); + CG_Text_Paint( 320 - w / 2, 440, 0.7f, color, SPECTATOR_STRING, 0, 0, ITEM_TEXTSTYLE_SHADOWED ); + } else if( !( cg.snap->ps.stats[ STAT_STATE ] & SS_INFESTING ) && !( cg.snap->ps.stats[ STAT_STATE ] & SS_HOVELING ) ) { @@ -2133,10 +2413,7 @@ void CG_DrawActive( stereoFrame_t stereoView ) // optionally draw the info screen instead if( !cg.snap ) - { - CG_DrawInformation( ); return; - } // optionally draw the tournement scoreboard instead if( cg.snap->ps.persistant[ PERS_TEAM ] == TEAM_SPECTATOR && diff --git a/src/cgame/cg_event.c b/src/cgame/cg_event.c index 8ae10e0c..c6e0417a 100644 --- a/src/cgame/cg_event.c +++ b/src/cgame/cg_event.c @@ -671,7 +671,7 @@ void CG_EntityEvent( centity_t *cent, vec3_t position ) case EV_STEPDN_4: case EV_STEPDN_8: case EV_STEPDN_12: - case EV_STEPDN_16: // smooth out step up transitions + case EV_STEPDN_16: // smooth out step down transitions DEBUGNAME("EV_STEP"); { float oldStep; @@ -1124,6 +1124,13 @@ void CG_EntityEvent( centity_t *cent, vec3_t position ) 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_PLAYER_RESPAWN: DEBUGNAME("EV_PLAYER_RESPAWN"); if( es->number == cg.clientNum ) diff --git a/src/cgame/cg_local.h b/src/cgame/cg_local.h index 77606128..371ea341 100644 --- a/src/cgame/cg_local.h +++ b/src/cgame/cg_local.h @@ -306,16 +306,6 @@ typedef struct { int score; int ping; int time; - int scoreFlags; - int powerUps; - int accuracy; - int impressiveCount; - int excellentCount; - int guantletCount; - int defendCount; - int assistCount; - int captures; - qboolean perfect; int team; } score_t; @@ -722,7 +712,13 @@ typedef struct { int rightMoveTime; int upMoveTime; + float charModelFraction; //TA: loading percentages + float mediaFraction; + float buildablesFraction; + entityPos_t ep; + + int lastBuildAttempt; } cg_t; @@ -1384,6 +1380,8 @@ const char *CG_GameTypeString(); qboolean CG_YourTeamHasFlag(); qboolean CG_OtherTeamHasFlag(); qhandle_t CG_StatusHandle(int task); +void CG_DrawLoadingScreen( void ); +void CG_UpdateMediaFraction( float newFract ); // // cg_player.c @@ -1572,14 +1570,6 @@ void CG_ClearTrails( void ); void CG_ProcessSnapshots( void ); // -// cg_info.c -// -void CG_LoadingString( const char *s ); -void CG_LoadingItem( int itemNum ); -void CG_LoadingClient( int clientNum ); -void CG_DrawInformation( void ); - -// // cg_scoreboard.c // qboolean CG_DrawOldScoreboard( void ); diff --git a/src/cgame/cg_main.c b/src/cgame/cg_main.c index 4e771b77..8f0d1b04 100644 --- a/src/cgame/cg_main.c +++ b/src/cgame/cg_main.c @@ -55,8 +55,8 @@ int vmMain( int command, int arg0, int arg1, int arg2, int arg3, int arg4, int a CG_KeyEvent(arg0, arg1); return 0; case CG_MOUSE_EVENT: - cgDC.cursorx = cgs.cursorX; - cgDC.cursory = cgs.cursorY; + cgDC.cursorx = cgs.cursorX; + cgDC.cursory = cgs.cursorY; CG_MouseEvent(arg0, arg1); return 0; case CG_EVENT_HANDLING: @@ -184,7 +184,7 @@ vmCvar_t cg_wwSmoothTime; vmCvar_t cg_wwFollow; vmCvar_t cg_zsortLEs; -//TA: hack to get class an carriage through to UI module +//TA: hack to get class and carriage through to UI module vmCvar_t ui_currentClass; vmCvar_t ui_carriage; vmCvar_t ui_stages; @@ -682,13 +682,9 @@ static void CG_RegisterGraphics( void ) { memset( &cg.refdef, 0, sizeof( cg.refdef ) ); trap_R_ClearScene(); - CG_LoadingString( cgs.mapname ); - trap_R_LoadWorldMap( cgs.mapname ); - - // precache status bar pics - CG_LoadingString( "game media" ); - + CG_UpdateMediaFraction( 0.66f ); + for ( i=0 ; i<11 ; i++) { cgs.media.numberShaders[i] = trap_R_RegisterShader( sb_nums[i] ); } @@ -716,7 +712,6 @@ static void CG_RegisterGraphics( void ) { cgs.media.lagometerShader = trap_R_RegisterShader("lagometer" ); cgs.media.connectionShader = trap_R_RegisterShader( "disconnected" ); - //TA: extra stuff cgs.media.explosionShader = trap_R_RegisterShader( "grenadeExplosion" ); cgs.media.greenBloodTrailShader = trap_R_RegisterShader( "greenBloodTrail" ); @@ -726,7 +721,7 @@ static void CG_RegisterGraphics( void ) { 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" ); @@ -758,30 +753,6 @@ static void CG_RegisterGraphics( void ) { cgs.media.regenShader = trap_R_RegisterShader("powerups/regen" ); cgs.media.hastePuffShader = trap_R_RegisterShader("hasteSmokePuff" ); - if ( cgs.gametype == GT_CTF || cg_buildScript.integer ) { - cgs.media.redCubeModel = trap_R_RegisterModel( "models/powerups/orb/r_orb.md3" ); - cgs.media.blueCubeModel = trap_R_RegisterModel( "models/powerups/orb/b_orb.md3" ); - cgs.media.redCubeIcon = trap_R_RegisterShader( "icons/skull_red" ); - cgs.media.blueCubeIcon = trap_R_RegisterShader( "icons/skull_blue" ); - } - - if ( cgs.gametype == GT_CTF || cg_buildScript.integer ) { - cgs.media.redFlagModel = trap_R_RegisterModel( "models/flags/r_flag.md3" ); - cgs.media.blueFlagModel = trap_R_RegisterModel( "models/flags/b_flag.md3" ); - cgs.media.redFlagShader[0] = trap_R_RegisterShaderNoMip( "icons/iconf_red1" ); - cgs.media.redFlagShader[1] = trap_R_RegisterShaderNoMip( "icons/iconf_red2" ); - cgs.media.redFlagShader[2] = trap_R_RegisterShaderNoMip( "icons/iconf_red3" ); - cgs.media.blueFlagShader[0] = trap_R_RegisterShaderNoMip( "icons/iconf_blu1" ); - cgs.media.blueFlagShader[1] = trap_R_RegisterShaderNoMip( "icons/iconf_blu2" ); - cgs.media.blueFlagShader[2] = trap_R_RegisterShaderNoMip( "icons/iconf_blu3" ); - } - - if ( cgs.gametype >= GT_TEAM || cg_buildScript.integer ) { - cgs.media.friendShader = trap_R_RegisterShader( "sprites/foe" ); - cgs.media.redQuadShader = trap_R_RegisterShader("powerups/blueflag" ); - cgs.media.teamStatusBar = trap_R_RegisterShader( "gfx/2d/colorbar.tga" ); - } - //TA: screenfades cgs.media.humanNV = trap_R_RegisterShader( "humanNV" ); cgs.media.humanTorch8 = trap_R_RegisterShader( "humanTorch8" ); @@ -842,6 +813,7 @@ static void CG_RegisterGraphics( void ) { cgs.media.medalAssist = trap_R_RegisterShaderNoMip( "medal_assist" ); cgs.media.medalCapture = trap_R_RegisterShaderNoMip( "medal_capture" ); + CG_UpdateMediaFraction( 0.7f ); memset( cg_items, 0, sizeof( cg_items ) ); memset( cg_weapons, 0, sizeof( cg_weapons ) ); @@ -885,6 +857,8 @@ static void CG_RegisterGraphics( void ) { 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; @@ -908,7 +882,7 @@ void CG_BuildSpectatorString() { int i; cg.spectatorList[0] = 0; for (i = 0; i < MAX_CLIENTS; i++) { - if (cgs.clientinfo[i].infoValid && cgs.clientinfo[i].team == TEAM_SPECTATOR ) { + if (cgs.clientinfo[i].infoValid && cgs.clientinfo[i].team == PTE_NONE ) { Q_strcat(cg.spectatorList, sizeof(cg.spectatorList), va("%s ", cgs.clientinfo[i].name)); } } @@ -927,19 +901,25 @@ CG_RegisterClients =================== */ -static void CG_RegisterClients( void ) { +static void CG_RegisterClients( void ) +{ int i; + cg.charModelFraction = 0.0f; + //precache all the models/sounds/etc - for ( i = PCL_NONE + 1; i < PCL_NUM_CLASSES; i++ ) { + for( i = PCL_NONE + 1; i < PCL_NUM_CLASSES; i++ ) + { const char *clientInfo; clientInfo = CG_ConfigString( CS_PRECACHES + i ); if ( !clientInfo[0] ) continue; - CG_LoadingClient( i ); CG_PrecacheClientInfo( i ); + + cg.charModelFraction = (float)i / (float)( PCL_NUM_CLASSES - 1 ); + trap_UpdateScreen( ); } //load all the clientinfos of clients already connected to the server @@ -998,535 +978,511 @@ void CG_StartMusic( void ) { // ============================== // char *CG_GetMenuBuffer(const char *filename) { - int len; - fileHandle_t f; - static char buf[MAX_MENUFILE]; - - len = trap_FS_FOpenFile( filename, &f, FS_READ ); - 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 ) ); - trap_FS_FCloseFile( f ); - return NULL; - } - - trap_FS_Read( buf, len, f ); - buf[len] = 0; - trap_FS_FCloseFile( f ); - - return buf; + int len; + fileHandle_t f; + static char buf[MAX_MENUFILE]; + + len = trap_FS_FOpenFile( filename, &f, FS_READ ); + 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 ) ); + trap_FS_FCloseFile( f ); + return NULL; + } + + trap_FS_Read( buf, len, f ); + buf[len] = 0; + trap_FS_FCloseFile( f ); + + return buf; } qboolean CG_Asset_Parse(int handle) { - pc_token_t token; - const char *tempStr; - - if (!trap_PC_ReadToken(handle, &token)) - return qfalse; - if (Q_stricmp(token.string, "{") != 0) { - return qfalse; - } + pc_token_t token; + const char *tempStr; + + if (!trap_PC_ReadToken(handle, &token)) + return qfalse; + if (Q_stricmp(token.string, "{") != 0) { + return qfalse; + } - while ( 1 ) { - if (!trap_PC_ReadToken(handle, &token)) - return qfalse; - - if (Q_stricmp(token.string, "}") == 0) { - return qtrue; - } - - // font - if (Q_stricmp(token.string, "font") == 0) { - int pointSize; - if (!PC_String_Parse(handle, &tempStr) || !PC_Int_Parse(handle, &pointSize)) { - return qfalse; - } - cgDC.registerFont(tempStr, pointSize, &cgDC.Assets.textFont); - continue; - } - - // smallFont - if (Q_stricmp(token.string, "smallFont") == 0) { - int pointSize; - if (!PC_String_Parse(handle, &tempStr) || !PC_Int_Parse(handle, &pointSize)) { - return qfalse; - } - cgDC.registerFont(tempStr, pointSize, &cgDC.Assets.smallFont); - continue; - } - - // font - if (Q_stricmp(token.string, "bigfont") == 0) { - int pointSize; - if (!PC_String_Parse(handle, &tempStr) || !PC_Int_Parse(handle, &pointSize)) { - return qfalse; - } - cgDC.registerFont(tempStr, pointSize, &cgDC.Assets.bigFont); - continue; - } - - // gradientbar - if (Q_stricmp(token.string, "gradientbar") == 0) { - if (!PC_String_Parse(handle, &tempStr)) { - return qfalse; - } - cgDC.Assets.gradientBar = trap_R_RegisterShaderNoMip(tempStr); - continue; - } - - // enterMenuSound - 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)) { - 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)) { - 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)) { - 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)) { - return qfalse; - } - 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)) { - return qfalse; - } - continue; - } - - 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)) { - return qfalse; - } - continue; - } - - 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)) { - return qfalse; - } - continue; - } - - if (Q_stricmp(token.string, "shadowColor") == 0) { - if (!PC_Color_Parse(handle, &cgDC.Assets.shadowColor)) { - return qfalse; - } - cgDC.Assets.shadowFadeClamp = cgDC.Assets.shadowColor[3]; - continue; - } - } - return qfalse; // bk001204 - why not? + while ( 1 ) { + if (!trap_PC_ReadToken(handle, &token)) + return qfalse; + + if (Q_stricmp(token.string, "}") == 0) { + return qtrue; + } + + // font + if (Q_stricmp(token.string, "font") == 0) { + int pointSize; + if (!PC_String_Parse(handle, &tempStr) || !PC_Int_Parse(handle, &pointSize)) { + return qfalse; + } + cgDC.registerFont(tempStr, pointSize, &cgDC.Assets.textFont); + continue; + } + + // smallFont + if (Q_stricmp(token.string, "smallFont") == 0) { + int pointSize; + if (!PC_String_Parse(handle, &tempStr) || !PC_Int_Parse(handle, &pointSize)) { + return qfalse; + } + cgDC.registerFont(tempStr, pointSize, &cgDC.Assets.smallFont); + continue; + } + + // font + if (Q_stricmp(token.string, "bigfont") == 0) { + int pointSize; + if (!PC_String_Parse(handle, &tempStr) || !PC_Int_Parse(handle, &pointSize)) { + return qfalse; + } + cgDC.registerFont(tempStr, pointSize, &cgDC.Assets.bigFont); + continue; + } + + // gradientbar + if (Q_stricmp(token.string, "gradientbar") == 0) { + if (!PC_String_Parse(handle, &tempStr)) { + return qfalse; + } + cgDC.Assets.gradientBar = trap_R_RegisterShaderNoMip(tempStr); + continue; + } + + // enterMenuSound + 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)) { + 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)) { + 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)) { + 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)) { + return qfalse; + } + 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)) { + return qfalse; + } + continue; + } + + 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)) { + return qfalse; + } + continue; + } + + 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)) { + return qfalse; + } + continue; + } + + if (Q_stricmp(token.string, "shadowColor") == 0) { + if (!PC_Color_Parse(handle, &cgDC.Assets.shadowColor)) { + return qfalse; + } + 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; - - 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 )) { - 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 ( token.string[0] == '}' ) { - break; - } - - if (Q_stricmp(token.string, "assetGlobalDef") == 0) { - if (CG_Asset_Parse(handle)) { - continue; - } else { - break; - } - } - - - if (Q_stricmp(token.string, "menudef") == 0) { - // start a new menu - Menu_New(handle); - } - } - trap_PC_FreeSource(handle); + pc_token_t token; + int 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 )) { + 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 ( token.string[0] == '}' ) { + break; + } + + if (Q_stricmp(token.string, "assetGlobalDef") == 0) { + if (CG_Asset_Parse(handle)) { + continue; + } else { + break; + } + } + + + if (Q_stricmp(token.string, "menudef") == 0) { + // start a new menu + Menu_New(handle); + } + } + trap_PC_FreeSource(handle); } qboolean CG_Load_Menu(char **p) { - char *token; + char *token; - token = COM_ParseExt(p, qtrue); + token = COM_ParseExt(p, qtrue); - if (token[0] != '{') { - return qfalse; - } + if (token[0] != '{') { + return qfalse; + } - while ( 1 ) { + while ( 1 ) { - token = COM_ParseExt(p, qtrue); + token = COM_ParseExt(p, qtrue); - if (Q_stricmp(token, "}") == 0) { - return qtrue; - } + if (Q_stricmp(token, "}") == 0) { + return qtrue; + } - if ( !token || token[0] == 0 ) { - return qfalse; - } + if ( !token || token[0] == 0 ) { + return qfalse; + } - CG_ParseMenu(token); - } - return qfalse; + CG_ParseMenu(token); + } + return qfalse; } void CG_LoadMenus(const char *menuFile) { - char *token; - char *p; - int len, start; - fileHandle_t f; - static char buf[MAX_MENUDEFFILE]; - - start = trap_Milliseconds(); - - len = trap_FS_FOpenFile( menuFile, &f, FS_READ ); - 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) { - 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 ) ); - trap_FS_FCloseFile( f ); - return; - } - - trap_FS_Read( buf, len, f ); - buf[len] = 0; - trap_FS_FCloseFile( f ); - - COM_Compress(buf); - - Menu_Reset(); - - p = buf; - - while ( 1 ) { - token = COM_ParseExt( &p, qtrue ); - 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 ) { - break; - } - - if (Q_stricmp(token, "loadmenu") == 0) { - if (CG_Load_Menu(&p)) { - continue; - } else { - break; - } - } - } - - Com_Printf("UI menu load time = %d milli seconds\n", trap_Milliseconds() - start); + char *token; + char *p; + int len, start; + fileHandle_t f; + static char buf[MAX_MENUDEFFILE]; + + start = trap_Milliseconds(); + + len = trap_FS_FOpenFile( menuFile, &f, FS_READ ); + 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) { + 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 ) ); + trap_FS_FCloseFile( f ); + return; + } + + trap_FS_Read( buf, len, f ); + buf[len] = 0; + trap_FS_FCloseFile( f ); + + COM_Compress(buf); + + Menu_Reset(); + + p = buf; + + while ( 1 ) { + token = COM_ParseExt( &p, qtrue ); + 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 ) { + break; + } + + if (Q_stricmp(token, "loadmenu") == 0) { + if (CG_Load_Menu(&p)) { + continue; + } else { + break; + } + } + } + + 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) { - return qfalse; + return qfalse; } -static int CG_FeederCount(float feederID) { - int i, count; - count = 0; -/* if (feederID == FEEDER_REDTEAM_LIST) { - for (i = 0; i < cg.numScores; i++) { - if (cg.scores[i].team == TEAM_RED) { - count++; - } - } - } else if (feederID == FEEDER_BLUETEAM_LIST) { - for (i = 0; i < cg.numScores; i++) { - if (cg.scores[i].team == TEAM_BLUE) { - count++; - } - } - } else if (feederID == FEEDER_SCOREBOARD) { - return cg.numScores; - }*/ - return count; +static int CG_FeederCount( float feederID ) +{ + int i, count = 0; + + if( feederID == FEEDER_ALIENTEAM_LIST ) + { + for( i = 0; i < cg.numScores; i++ ) + { + if( cg.scores[ i ].team == PTE_ALIENS ) + count++; + } + } + else if( feederID == FEEDER_HUMANTEAM_LIST ) + { + for( i = 0; i < cg.numScores; i++ ) + { + if( cg.scores[ i ].team == PTE_HUMANS ) + count++; + } + } + + return count; } -void CG_SetScoreSelection(void *p) { - menuDef_t *menu = (menuDef_t*)p; - playerState_t *ps = &cg.snap->ps; - int i, red, blue; - red = blue = 0; -/* for (i = 0; i < cg.numScores; i++) { - if (cg.scores[i].team == TEAM_RED) { - red++; - } else if (cg.scores[i].team == TEAM_BLUE) { - blue++; - } - if (ps->clientNum == cg.scores[i].client) { - cg.selectedScore = i; - } - }*/ - - if (menu == NULL) { - // just interested in setting the selected score - return; - } - - if ( cgs.gametype >= GT_TEAM ) { - int feeder = FEEDER_REDTEAM_LIST; - i = red; -/* if (cg.scores[cg.selectedScore].team == TEAM_BLUE) { - feeder = FEEDER_BLUETEAM_LIST; - i = blue; - }*/ - Menu_SetFeederSelection(menu, feeder, i, NULL); - } else { - Menu_SetFeederSelection(menu, FEEDER_SCOREBOARD, cg.selectedScore, NULL); - } +void CG_SetScoreSelection( void *p ) +{ + menuDef_t *menu = (menuDef_t*)p; + playerState_t *ps = &cg.snap->ps; + int i, alien, human; + int feeder; + + alien = human = 0; + + for( i = 0; i < cg.numScores; i++ ) + { + if( cg.scores[ i ].team == PTE_ALIENS ) + alien++; + else if( cg.scores[ i ].team == PTE_HUMANS ) + human++; + + if( ps->clientNum == cg.scores[ i ].client ) + cg.selectedScore = i; + } + + if( menu == NULL ) + // just interested in setting the selected score + return; + + feeder = FEEDER_ALIENTEAM_LIST; + i = alien; + + if( cg.scores[ cg.selectedScore ].team == PTE_HUMANS ) + { + feeder = FEEDER_HUMANTEAM_LIST; + i = human; + } + + Menu_SetFeederSelection(menu, feeder, i, NULL); } // FIXME: might need to cache this info -static clientInfo_t * CG_InfoFromScoreIndex(int index, int team, int *scoreIndex) { - int i, count; - if ( cgs.gametype >= GT_TEAM ) { - count = 0; - for (i = 0; i < cg.numScores; i++) { - if (cg.scores[i].team == team) { - if (count == index) { - *scoreIndex = i; - return &cgs.clientinfo[cg.scores[i].client]; - } - count++; - } - } - } - *scoreIndex = index; - return &cgs.clientinfo[ cg.scores[index].client ]; +static clientInfo_t * CG_InfoFromScoreIndex( int index, int team, int *scoreIndex ) +{ + int i, count; + count = 0; + + for( i = 0; i < cg.numScores; i++ ) + { + if( cg.scores[ i ].team == team ) + { + if( count == index ) + { + *scoreIndex = i; + return &cgs.clientinfo[ cg.scores[ i ].client ]; + } + count++; + } + } + + *scoreIndex = index; + return &cgs.clientinfo[ cg.scores[ index ].client ]; } -static const char *CG_FeederItemText(float feederID, int index, int column, qhandle_t *handle) { - gitem_t *item; - int scoreIndex = 0; - clientInfo_t *info = NULL; - int team = -1; - score_t *sp = NULL; - - *handle = -1; - - if (feederID == FEEDER_REDTEAM_LIST) { - /*team = TEAM_RED;*/ - } else if (feederID == FEEDER_BLUETEAM_LIST) { - /*team = TEAM_BLUE;*/ - } - - info = CG_InfoFromScoreIndex(index, team, &scoreIndex); - sp = &cg.scores[scoreIndex]; - - if (info && info->infoValid) { - switch (column) { - case 0: -/* if ( info->powerups & ( 1 << PW_NEUTRALFLAG ) ) { - item = BG_FindItemForPowerup( PW_NEUTRALFLAG ); - *handle = cg_items[ ITEM_INDEX(item) ].icon; - } else if ( info->powerups & ( 1 << PW_REDFLAG ) ) { - item = BG_FindItemForPowerup( PW_REDFLAG ); - *handle = cg_items[ ITEM_INDEX(item) ].icon; - } else if ( info->powerups & ( 1 << PW_BLUEFLAG ) ) { - item = BG_FindItemForPowerup( PW_BLUEFLAG ); - *handle = cg_items[ ITEM_INDEX(item) ].icon; - } else { - if ( info->botSkill > 0 && info->botSkill <= 5 ) { - *handle = cgs.media.botSkillShaders[ info->botSkill - 1 ]; - } else if ( info->handicap < 100 ) { - return va("%i", info->handicap ); - } - }*/ - break; - case 1: - if (team == -1) { - return ""; - } else { - /**handle = CG_StatusHandle(info->teamTask);*/ - } - break; - case 2: -/* if ( cg.snap->ps.stats[ STAT_CLIENTS_READY ] & ( 1 << sp->client ) ) { - return "Ready"; - } - if (team == -1) { - if (cgs.gametype == GT_TOURNAMENT) { - return va("%i/%i", info->wins, info->losses); - } else if (info->infoValid && info->team == TEAM_SPECTATOR ) { - return "Spectator"; - } else { - return ""; - } - } else { - if (info->teamLeader) { - return "Leader"; - } - }*/ - break; - case 3: - return info->name; - break; - case 4: - return va("%i", info->score); - break; - case 5: - return va("%4i", sp->time); - break; - case 6: - if ( sp->ping == -1 ) { - return "connecting"; - } - return va("%4i", sp->ping); - break; - } - } - - return ""; +static const char *CG_FeederItemText( float feederID, int index, int column, qhandle_t *handle ) +{ + gitem_t *item; + int scoreIndex = 0; + clientInfo_t *info = NULL; + int team = -1; + score_t *sp = NULL; + + *handle = -1; + + if( feederID == FEEDER_ALIENTEAM_LIST ) + team = PTE_ALIENS; + else if( feederID == FEEDER_HUMANTEAM_LIST ) + team = PTE_HUMANS; + + info = CG_InfoFromScoreIndex( index, team, &scoreIndex ); + sp = &cg.scores[ scoreIndex ]; + + if( info && info->infoValid ) + { + switch( column ) + { + case 0: + if( atoi( CG_ConfigString( CS_CLIENTS_READY ) ) & ( 1 << sp->client ) ) + return "Ready"; + break; + + case 1: + return info->name; + break; + + case 2: + return va( "%d", info->score ); + break; + + case 3: + return va( "%4d", sp->time ); + break; + + case 4: + if( sp->ping == -1 ) + return "connecting"; + + return va( "%4d", sp->ping ); + break; + } + } + + return ""; } static qhandle_t CG_FeederItemImage(float feederID, int index) { - return 0; + return 0; } -static void CG_FeederSelection(float feederID, int index) { -/* if ( cgs.gametype >= GT_TEAM ) { - int i, count; - int team = (feederID == FEEDER_REDTEAM_LIST) ? TEAM_RED : TEAM_BLUE; - count = 0; - for (i = 0; i < cg.numScores; i++) { - if (cg.scores[i].team == team) { - if (index == count) { - cg.selectedScore = i; - } - count++; - } - } - } else { - cg.selectedScore = index; - }*/ +static void CG_FeederSelection( float feederID, int index ) +{ + int i, count; + int team = ( feederID == FEEDER_ALIENTEAM_LIST ) ? PTE_ALIENS : PTE_HUMANS; + count = 0; + + for( i = 0; i < cg.numScores; i++ ) + { + if( cg.scores[ i ].team == team ) + { + if( index == count ) + cg.selectedScore = i; + + count++; + } + } } 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); + 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); + 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;*/ - 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); - break; - case CG_BLUE_NAME: - return CG_Text_Width(cg_blueTeamName.string, scale, 0); - break;*/ - - - } - return 0; + 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;*/ + 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); + 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) { @@ -1553,95 +1509,95 @@ 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; - 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; - - Init_Display(&cgDC); - - Menu_Reset(); - - trap_Cvar_VariableStringBuffer("cg_hudFiles", buff, sizeof(buff)); - hudSet = buff; - if (hudSet[0] == '\0') { - hudSet = "ui/hud.txt"; - } - - CG_LoadMenus(hudSet); + 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; + + Init_Display(&cgDC); + + Menu_Reset(); + + trap_Cvar_VariableStringBuffer("cg_hudFiles", buff, sizeof(buff)); + hudSet = buff; + if (hudSet[0] == '\0') { + hudSet = "ui/hud.txt"; + } + + 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 ); - 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 ); + //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 ); + 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 ); } //TA: FIXME: preliminary integration of CG TA UI stuff @@ -1680,6 +1636,13 @@ void CG_Init( int serverMessageNum, int serverCommandSequence, int clientNum ) { CG_RegisterCvars(); CG_InitConsoleCommands(); + + //TA: moved up for LoadHudMenu + String_Init(); + + //TA: FIXME: TA UI + CG_AssetCache(); + CG_LoadHudMenu(); // load new hud stuff //cg.weaponSelect = WP_MACHINEGUN; //TA: if it does weird things, this is why: @@ -1709,35 +1672,25 @@ void CG_Init( int serverMessageNum, int serverCommandSequence, int clientNum ) { CG_ParseServerinfo(); // load the new map - CG_LoadingString( "collision map" ); - trap_CM_LoadMap( cgs.mapname ); - String_Init(); - cg.loading = qtrue; // force players to load instead of defer - CG_LoadingString( "sounds" ); - - CG_RegisterSounds(); - - CG_LoadingString( "graphics" ); + CG_RegisterSounds( ); + CG_UpdateMediaFraction( 0.33f ); - CG_RegisterGraphics(); - - //TA: - CG_InitBuildables( ); + CG_RegisterGraphics( ); + CG_UpdateMediaFraction( 0.90f ); CG_InitWeapons( ); + CG_UpdateMediaFraction( 0.95f ); CG_InitUpgrades( ); - - CG_LoadingString( "clients" ); + CG_UpdateMediaFraction( 1.0f ); + + //TA: + CG_InitBuildables( ); CG_RegisterClients(); // if low on memory, some clients will be deferred - //TA: FIXME: TA UI - CG_AssetCache(); - CG_LoadHudMenu(); // load new hud stuff - cg.loading = qfalse; // future players will be deferred CG_InitLocalEntities(); @@ -1752,8 +1705,6 @@ void CG_Init( int serverMessageNum, int serverCommandSequence, int clientNum ) { CG_StartMusic(); - CG_LoadingString( "" ); - CG_ShaderStateChanged(); trap_S_ClearLoopingSounds( qtrue ); diff --git a/src/cgame/cg_servercmds.c b/src/cgame/cg_servercmds.c index 6843c217..b676c536 100644 --- a/src/cgame/cg_servercmds.c +++ b/src/cgame/cg_servercmds.c @@ -61,20 +61,10 @@ static void CG_ParseScores( void ) { memset( cg.scores, 0, sizeof( cg.scores ) ); for ( i = 0 ; i < cg.numScores ; i++ ) { // - cg.scores[i].client = atoi( CG_Argv( i * 14 + 4 ) ); - cg.scores[i].score = atoi( CG_Argv( i * 14 + 5 ) ); - cg.scores[i].ping = atoi( CG_Argv( i * 14 + 6 ) ); - cg.scores[i].time = atoi( CG_Argv( i * 14 + 7 ) ); - cg.scores[i].scoreFlags = atoi( CG_Argv( i * 14 + 8 ) ); - powerups = atoi( CG_Argv( i * 14 + 9 ) ); - cg.scores[i].accuracy = atoi(CG_Argv(i * 14 + 10)); - cg.scores[i].impressiveCount = atoi(CG_Argv(i * 14 + 11)); - cg.scores[i].excellentCount = atoi(CG_Argv(i * 14 + 12)); - cg.scores[i].guantletCount = atoi(CG_Argv(i * 14 + 13)); - cg.scores[i].defendCount = atoi(CG_Argv(i * 14 + 14)); - cg.scores[i].assistCount = atoi(CG_Argv(i * 14 + 15)); - cg.scores[i].perfect = atoi(CG_Argv(i * 14 + 16)); - cg.scores[i].captures = atoi(CG_Argv(i * 14 + 17)); + 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; @@ -83,8 +73,7 @@ static void CG_ParseScores( void ) { cgs.clientinfo[ cg.scores[i].client ].powerups = powerups; cg.scores[i].team = cgs.clientinfo[cg.scores[i].client].team; - } - + } } /* diff --git a/src/cgame/cg_view.c b/src/cgame/cg_view.c index 4d63074f..6d434eab 100644 --- a/src/cgame/cg_view.c +++ b/src/cgame/cg_view.c @@ -1107,7 +1107,7 @@ void CG_DrawActiveFrame( int serverTime, stereoFrame_t stereoView, qboolean demo // if we are only updating the screen as a loading // pacifier, don't even try to read snapshots if ( cg.infoScreenText[0] != 0 ) { - CG_DrawInformation(); + CG_DrawLoadingScreen( ); return; } @@ -1124,7 +1124,7 @@ void CG_DrawActiveFrame( int serverTime, stereoFrame_t stereoView, qboolean demo // 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 ) ) { - CG_DrawInformation(); + CG_DrawLoadingScreen( ); return; } diff --git a/src/game/bg_lib.c b/src/game/bg_lib.c index 7041aa39..cd241f77 100644 --- a/src/game/bg_lib.c +++ b/src/game/bg_lib.c @@ -256,6 +256,22 @@ int strcmp( const char *string1, const char *string2 ) { return *string1 - *string2; } +//TA: +char *strrchr( const char *string, int c ) +{ + int i, length = strlen( string ); + char *p; + + for( i = length - 1; i >= 0; i-- ) + { + p = (char *)&string[ i ]; + + if( *p == c ) + return (char *)p; + } + + return (char *)0; +} char *strchr( const char *string, int c ) { while ( *string ) { diff --git a/src/game/bg_lib.h b/src/game/bg_lib.h index 55fc25a0..b651c9a6 100644 --- a/src/game/bg_lib.h +++ b/src/game/bg_lib.h @@ -51,6 +51,7 @@ char *strcat( char *strDestination, const char *strSource ); char *strcpy( char *strDestination, const char *strSource ); int strcmp( const char *string1, const char *string2 ); char *strchr( const char *string, int c ); +char *strrchr( const char *string, int c ); char *strstr( const char *string, const char *strCharSet ); char *strncpy( char *strDest, const char *strSource, size_t count ); int tolower( int c ); diff --git a/src/game/bg_pmove.c b/src/game/bg_pmove.c index 18fa084c..40399dd7 100644 --- a/src/game/bg_pmove.c +++ b/src/game/bg_pmove.c @@ -2286,21 +2286,6 @@ static void PM_Weapon( void ) } break; - case WP_GRAB_CLAW: - attack1 = pm->cmd.buttons & BUTTON_ATTACK; - - //secondary attack is only permitted if target is in range - if( pm->autoWeaponHit[ pm->ps->weapon ] ) - attack2 = pm->cmd.buttons & BUTTON_ATTACK2; - - if( !attack1 && !attack2 ) - { - pm->ps->weaponTime = 0; - pm->ps->weaponstate = WEAPON_READY; - return; - } - break; - case WP_LUCIFER_CANON: attack1 = pm->cmd.buttons & BUTTON_ATTACK; attack2 = pm->cmd.buttons & BUTTON_ATTACK2; diff --git a/src/game/bg_public.h b/src/game/bg_public.h index c474357e..3d9be4b9 100644 --- a/src/game/bg_public.h +++ b/src/game/bg_public.h @@ -576,8 +576,8 @@ typedef enum { EV_TAUNT_GUARDBASE, EV_TAUNT_PATROL, - EV_MENU //TA: menu event - + EV_MENU, //TA: menu event + EV_BUILD_DELAY //TA: can't build yet } entity_event_t; typedef enum diff --git a/src/game/g_active.c b/src/game/g_active.c index 89c45cf7..d423ca74 100644 --- a/src/game/g_active.c +++ b/src/game/g_active.c @@ -509,8 +509,6 @@ void ClientTimerActions( gentity_t *ent, int msec ) client->ps.stats[ STAT_MISC ] = ammo * LC_TOTAL_CHARGE / 10; } -#define LAUNCH_TIME 2000 - switch( client->ps.weapon ) { case WP_ABUILD: @@ -529,6 +527,13 @@ void ClientTimerActions( gentity_t *ent, int msec ) else client->ps.stats[ STAT_BUILDABLE ] &= ~SB_VALID_TOGGLEBIT; } + + //update build timer + if( client->ps.stats[ STAT_MISC ] > 0 ) + client->ps.stats[ STAT_MISC ] -= 100; + + if( client->ps.stats[ STAT_MISC ] < 0 ) + client->ps.stats[ STAT_MISC ] = 0; break; default: @@ -971,10 +976,6 @@ void ClientThink_real( gentity_t *ent ) { pm.autoWeaponHit[ WP_VENOM ] = CheckVenomAttack( ent ); break; - case WP_GRAB_CLAW: - pm.autoWeaponHit[ WP_GRAB_CLAW ] = CheckGrabAttack( ent ); - break; - case WP_POUNCE: if( client->ps.weaponTime <= 0 ) pm.autoWeaponHit[ WP_POUNCE ] = CheckPounceAttack( ent ); diff --git a/src/game/g_client.c b/src/game/g_client.c index 46850044..942aba66 100644 --- a/src/game/g_client.c +++ b/src/game/g_client.c @@ -1100,12 +1100,12 @@ void ClientUserinfoChanged( int clientNum ) { // print scoreboards, display models, and play custom sounds if ( ent->r.svFlags & SVF_BOT ) { s = va("n\\%s\\t\\%i\\model\\%s\\hmodel\\%s\\c1\\%s\\c2\\%s\\hc\\%i\\w\\%i\\l\\%i\\skill\\%s\\tt\\%d\\tl\\%d", - client->pers.netname, client->sess.sessionTeam, model, model, c1, c2, + client->pers.netname, client->ps.stats[ STAT_PTEAM ], model, model, c1, c2, client->pers.maxHealth, client->sess.wins, client->sess.losses, Info_ValueForKey( userinfo, "skill" ), teamTask, teamLeader ); } else { s = va("n\\%s\\t\\%i\\model\\%s\\hmodel\\%s\\g_redteam\\%s\\g_blueteam\\%s\\c1\\%s\\c2\\%s\\hc\\%i\\w\\%i\\l\\%i\\tt\\%d\\tl\\%d", - client->pers.netname, client->sess.sessionTeam, model, model, redTeam, blueTeam, c1, c2, + client->pers.netname, client->ps.stats[ STAT_PTEAM ], model, model, redTeam, blueTeam, c1, c2, client->pers.maxHealth, client->sess.wins, client->sess.losses, teamTask, teamLeader); } diff --git a/src/game/g_cmds.c b/src/game/g_cmds.c index 9cadf288..c4c63f2d 100644 --- a/src/game/g_cmds.c +++ b/src/game/g_cmds.c @@ -31,12 +31,10 @@ void DeathmatchScoreboardMessage( gentity_t *ent ) { int i, j; gclient_t *cl; int numSorted; - int scoreFlags; // send the latest information on all clients string[0] = 0; stringlength = 0; - scoreFlags = 0; numSorted = level.numConnectedClients; @@ -51,9 +49,8 @@ void DeathmatchScoreboardMessage( gentity_t *ent ) { ping = cl->ps.ping < 999 ? cl->ps.ping : 999; } Com_sprintf (entry, sizeof(entry), - " %i %i %i %i %i %i", level.sortedClients[i], - cl->ps.persistant[PERS_SCORE], ping, (level.time - cl->pers.enterTime)/60000, - scoreFlags, g_entities[level.sortedClients[i]].s.powerups); + " %i %i %i %i", level.sortedClients[i], + cl->ps.persistant[PERS_SCORE], ping, (level.time - cl->pers.enterTime)/60000 ); j = strlen(entry); if (stringlength + j > 1024) break; @@ -634,6 +631,9 @@ void Cmd_Team_f( gentity_t *ent ) ClientSpawn( ent, NULL ); } + //update ClientInfo + ClientUserinfoChanged( ent->client->ps.clientNum ); + //FIXME: put some team change broadcast code here. } diff --git a/src/game/g_local.h b/src/game/g_local.h index 2125291c..c163b20f 100644 --- a/src/game/g_local.h +++ b/src/game/g_local.h @@ -629,6 +629,7 @@ gentity_t *fire_luciferCanon( gentity_t *self, vec3_t start, vec3_t dir, int dam gentity_t *fire_grenade( gentity_t *self, vec3_t start, vec3_t aimdir ); gentity_t *fire_rocket( gentity_t *self, vec3_t start, vec3_t dir ); gentity_t *fire_lockblob( gentity_t *self, vec3_t start, vec3_t dir ); +gentity_t *fire_paraLockBlob( gentity_t *self, vec3_t start, vec3_t dir ); gentity_t *fire_bfg( gentity_t *self, vec3_t start, vec3_t dir ); gentity_t *fire_grapple( gentity_t *self, vec3_t start, vec3_t dir ); diff --git a/src/game/g_missile.c b/src/game/g_missile.c index bbbf07cd..b885a628 100644 --- a/src/game/g_missile.c +++ b/src/game/g_missile.c @@ -404,6 +404,7 @@ gentity_t *fire_luciferCanon( gentity_t *self, vec3_t start, vec3_t dir, int dam } //============================================================================= + /* ================= fire_lockblob @@ -442,3 +443,40 @@ gentity_t *fire_lockblob( gentity_t *self, vec3_t start, vec3_t dir ) return bolt; } +/* +================= +fire_paraLockBlob +================= +*/ +gentity_t *fire_paraLockBlob( gentity_t *self, vec3_t start, vec3_t dir ) +{ + gentity_t *bolt; + + VectorNormalize ( dir ); + + bolt = G_Spawn( ); + bolt->classname = "lockblob"; + bolt->nextthink = level.time + 15000; + bolt->think = G_ExplodeMissile; + bolt->s.eType = ET_MISSILE; + bolt->r.svFlags = SVF_USE_CURRENT_ORIGIN; + bolt->s.weapon = WP_LOCKBLOB_LAUNCHER; + bolt->r.ownerNum = self->s.number; + bolt->parent = self; + bolt->damage = 0; + bolt->splashDamage = 0; + bolt->splashRadius = 0; + bolt->methodOfDeath = MOD_ROCKET; + bolt->splashMethodOfDeath = MOD_ROCKET_SPLASH; + bolt->clipmask = MASK_SHOT; + bolt->target_ent = NULL; + + bolt->s.pos.trType = TR_GRAVITY; + bolt->s.pos.trTime = level.time - MISSILE_PRESTEP_TIME; // move a bit on the very first frame + VectorCopy( start, bolt->s.pos.trBase ); + VectorScale( dir, 800, bolt->s.pos.trDelta ); + SnapVector( bolt->s.pos.trDelta ); // save net bandwidth + VectorCopy (start, bolt->r.currentOrigin); + + return bolt; +} diff --git a/src/game/g_weapon.c b/src/game/g_weapon.c index f75a33d6..3b65ddb6 100644 --- a/src/game/g_weapon.c +++ b/src/game/g_weapon.c @@ -411,12 +411,19 @@ void cancelBuildFire( gentity_t *ent ) ent->client->ps.stats[ STAT_BUILDABLE ] = BA_NONE; } -void buildFire( gentity_t *ent, dynMenu_t menu ) +void buildFire( gentity_t *ent, dynMenu_t menu, int delay ) { if( ( ent->client->ps.stats[ STAT_BUILDABLE ] & ~SB_VALID_TOGGLEBIT ) > BA_NONE ) { + if( ent->client->ps.stats[ STAT_MISC ] > 0 ) + { + G_AddPredictableEvent( ent, EV_BUILD_DELAY, 0 ); + return; + } + G_ValidateBuild( ent, ent->client->ps.stats[ STAT_BUILDABLE ] & ~SB_VALID_TOGGLEBIT ); ent->client->ps.stats[ STAT_BUILDABLE ] = BA_NONE; + ent->client->ps.stats[ STAT_MISC ] += delay; return; } @@ -528,43 +535,13 @@ void gClawFire( gentity_t *ent ) G_Damage( traceEnt, ent, ent, forward, tr.endpos, 5, DAMAGE_NO_KNOCKBACK, MOD_VENOM ); } -void grabFire( gentity_t *ent ) +void lockBlobFire( gentity_t *ent ) { - trace_t tr; - vec3_t end; - gentity_t *tent; - gentity_t *traceEnt; - int damage; - - // set aiming directions - AngleVectors (ent->client->ps.viewangles, forward, right, up); - - CalcMuzzlePoint( ent, forward, right, up, muzzle ); - - VectorMA( muzzle, 32, forward, end ); - - trap_Trace( &tr, muzzle, NULL, NULL, end, ent->s.number, MASK_SHOT ); - if ( tr.surfaceFlags & SURF_NOIMPACT ) - return; + gentity_t *m; - traceEnt = &g_entities[ tr.entityNum ]; + m = fire_paraLockBlob( ent, muzzle, forward ); - if( !traceEnt->takedamage ) - return; - if( !traceEnt->client ) - return; - if( traceEnt->client->ps.stats[ STAT_PTEAM ] == PTE_ALIENS ) - return; - - if( traceEnt->client ) - { - //lock client - traceEnt->client->ps.stats[ STAT_STATE ] |= SS_GRABBED; - traceEnt->client->lastGrabTime = level.time; - - if( !( traceEnt->client->ps.stats[ STAT_STATE ] & SS_GRABBED ) ) - VectorCopy( traceEnt->client->ps.viewangles, traceEnt->client->ps.grapplePoint ); - } +// VectorAdd( m->s.pos.trDelta, ent->client->ps.velocity, m->s.pos.trDelta ); // "real" physics } /* @@ -918,7 +895,7 @@ void FireWeapon2( gentity_t *ent ) case WP_LOCKBLOB_LAUNCHER: break; case WP_GRAB_CLAW: - grabFire( ent ); + lockBlobFire( ent ); break; case WP_AREA_ZAP: case WP_DIRECT_ZAP: @@ -1016,16 +993,16 @@ void FireWeapon( gentity_t *ent ) painSawFire( ent ); break; case WP_ABUILD: - buildFire( ent, MN_A_BUILD ); + buildFire( ent, MN_A_BUILD, 10000 ); break; case WP_ABUILD2: - buildFire( ent, MN_A_BUILD ); + buildFire( ent, MN_A_BUILD, 5000 ); break; case WP_HBUILD: - buildFire( ent, MN_H_BUILD ); + buildFire( ent, MN_H_BUILD, 10000 ); break; case WP_HBUILD2: - buildFire( ent, MN_H_BUILD ); + buildFire( ent, MN_H_BUILD, 5000 ); break; default: // FIXME G_Error( "Bad ent->s.weapon" ); diff --git a/src/ui/ui_main.c b/src/ui/ui_main.c index 20e3a25d..d26835d8 100644 --- a/src/ui/ui_main.c +++ b/src/ui/ui_main.c @@ -406,6 +406,63 @@ void Text_Paint(float x, float y, float scale, vec4_t color, const char *text, f trap_R_SetColor( newColor ); colorBlack[3] = 1.0; } + else if( style == ITEM_TEXTSTYLE_NEON ) + { + vec4_t glow, outer, inner, white; + + glow[ 0 ] = newColor[ 0 ] * 0.5; + glow[ 1 ] = newColor[ 1 ] * 0.5; + glow[ 2 ] = newColor[ 2 ] * 0.5; + glow[ 3 ] = newColor[ 3 ] * 0.2; + + outer[ 0 ] = newColor[ 0 ]; + outer[ 1 ] = newColor[ 1 ]; + outer[ 2 ] = newColor[ 2 ]; + outer[ 3 ] = newColor[ 3 ]; + + inner[ 0 ] = newColor[ 0 ] * 1.5 > 1.0f ? 1.0f : newColor[ 0 ] * 1.5; + inner[ 1 ] = newColor[ 1 ] * 1.5 > 1.0f ? 1.0f : newColor[ 1 ] * 1.5; + inner[ 2 ] = newColor[ 2 ] * 1.5 > 1.0f ? 1.0f : newColor[ 2 ] * 1.5; + inner[ 3 ] = newColor[ 3 ]; + + white[ 0 ] = white[ 1 ] = white[ 2 ] = white[ 3 ] = 1.0f; + + trap_R_SetColor( glow ); + Text_PaintChar( x - 1.5, y - yadj - 1.5, + glyph->imageWidth + 3, + glyph->imageHeight + 3, + useScale, + glyph->s, + glyph->t, + glyph->s2, + glyph->t2, + glyph->glyph ); + + trap_R_SetColor( outer ); + Text_PaintChar( x - 1, y - yadj - 1, + glyph->imageWidth + 2, + glyph->imageHeight + 2, + useScale, + glyph->s, + glyph->t, + glyph->s2, + glyph->t2, + glyph->glyph ); + + trap_R_SetColor( inner ); + Text_PaintChar( x - 0.5, y - yadj - 0.5, + glyph->imageWidth + 1, + glyph->imageHeight + 1, + useScale, + glyph->s, + glyph->t, + glyph->s2, + glyph->t2, + glyph->glyph ); + + trap_R_SetColor( white ); + } + Text_PaintChar(x, y - yadj, glyph->imageWidth, glyph->imageHeight, @@ -478,6 +535,63 @@ void Text_PaintWithCursor(float x, float y, float scale, vec4_t color, const cha colorBlack[3] = 1.0; trap_R_SetColor( newColor ); } + else if( style == ITEM_TEXTSTYLE_NEON ) + { + vec4_t glow, outer, inner, white; + + glow[ 0 ] = newColor[ 0 ] * 0.5; + glow[ 1 ] = newColor[ 1 ] * 0.5; + glow[ 2 ] = newColor[ 2 ] * 0.5; + glow[ 3 ] = newColor[ 3 ] * 0.2; + + outer[ 0 ] = newColor[ 0 ]; + outer[ 1 ] = newColor[ 1 ]; + outer[ 2 ] = newColor[ 2 ]; + outer[ 3 ] = newColor[ 3 ]; + + inner[ 0 ] = newColor[ 0 ] * 1.5 > 1.0f ? 1.0f : newColor[ 0 ] * 1.5; + inner[ 1 ] = newColor[ 1 ] * 1.5 > 1.0f ? 1.0f : newColor[ 1 ] * 1.5; + inner[ 2 ] = newColor[ 2 ] * 1.5 > 1.0f ? 1.0f : newColor[ 2 ] * 1.5; + inner[ 3 ] = newColor[ 3 ]; + + white[ 0 ] = white[ 1 ] = white[ 2 ] = white[ 3 ] = 1.0f; + + trap_R_SetColor( glow ); + Text_PaintChar( x - 1.5, y - yadj - 1.5, + glyph->imageWidth + 3, + glyph->imageHeight + 3, + useScale, + glyph->s, + glyph->t, + glyph->s2, + glyph->t2, + glyph->glyph ); + + trap_R_SetColor( outer ); + Text_PaintChar( x - 1, y - yadj - 1, + glyph->imageWidth + 2, + glyph->imageHeight + 2, + useScale, + glyph->s, + glyph->t, + glyph->s2, + glyph->t2, + glyph->glyph ); + + trap_R_SetColor( inner ); + Text_PaintChar( x - 0.5, y - yadj - 0.5, + glyph->imageWidth + 1, + glyph->imageHeight + 1, + useScale, + glyph->s, + glyph->t, + glyph->s2, + glyph->t2, + glyph->glyph ); + + trap_R_SetColor( white ); + } + Text_PaintChar(x, y - yadj, glyph->imageWidth, glyph->imageHeight, @@ -1200,12 +1314,8 @@ void UI_Load() { String_Init(); -#ifdef PRE_RELEASE_TADEMO - UI_ParseGameInfo("demogameinfo.txt"); -#else - UI_ParseGameInfo("gameinfo.txt"); - UI_LoadArenas(); -#endif +/* UI_ParseGameInfo("gameinfo.txt"); + UI_LoadArenas();*/ UI_LoadMenus(menuSet, qtrue); Menus_CloseAll(); @@ -3974,12 +4084,8 @@ static void UI_RunMenuScript(char **args) { } else if (Q_stricmp(name, "clearError") == 0) { trap_Cvar_Set("com_errorMessage", ""); } else if (Q_stricmp(name, "loadGameInfo") == 0) { -#ifdef PRE_RELEASE_TADEMO - UI_ParseGameInfo("demogameinfo.txt"); -#else - UI_ParseGameInfo("gameinfo.txt"); -#endif - UI_LoadBestScores(uiInfo.mapList[ui_currentMap.integer].mapLoadName, uiInfo.gameTypes[ui_gameType.integer].gtEnum); +/* UI_ParseGameInfo("gameinfo.txt"); + UI_LoadBestScores(uiInfo.mapList[ui_currentMap.integer].mapLoadName, uiInfo.gameTypes[ui_gameType.integer].gtEnum);*/ } else if (Q_stricmp(name, "resetScores") == 0) { UI_ClearScores(); } else if (Q_stricmp(name, "RefreshServers") == 0) { @@ -5958,14 +6064,9 @@ void _UI_Init( qboolean inGameLoad ) { uiInfo.characterCount = 0; uiInfo.aliasCount = 0; -#ifdef PRE_RELEASE_TADEMO - UI_ParseTeamInfo("demoteaminfo.txt"); - UI_ParseGameInfo("demogameinfo.txt"); -#else - UI_ParseTeamInfo("teaminfo.txt"); +/* UI_ParseTeamInfo("teaminfo.txt"); UI_LoadTeams(); - UI_ParseGameInfo("gameinfo.txt"); -#endif + UI_ParseGameInfo("gameinfo.txt");*/ menuSet = UI_Cvar_VariableString("ui_menuFiles"); if (menuSet == NULL || menuSet[0] == '\0') { diff --git a/src/ui/ui_shared.c b/src/ui/ui_shared.c index 8f0a60f0..c6a8253a 100644 --- a/src/ui/ui_shared.c +++ b/src/ui/ui_shared.c @@ -3754,7 +3754,32 @@ void Item_ListBox_Paint(itemDef_t *item) { if (optionalImage >= 0) { DC->drawHandlePic(x + 4 + listPtr->columnInfo[j].pos, y - 1 + listPtr->elementHeight / 2, listPtr->columnInfo[j].width, listPtr->columnInfo[j].width, optionalImage); } else if (text) { - DC->drawText(x + 4 + listPtr->columnInfo[j].pos, y + listPtr->elementHeight, item->textscale, item->window.foreColor, text, 0, listPtr->columnInfo[j].maxChars, item->textStyle); + //TA: + int alignOffset, tw; + + tw = DC->textWidth( text, item->textscale, 0 ); + + switch( listPtr->columnInfo[ j ].align ) + { + case ITEM_ALIGN_LEFT: + alignOffset = 0.0f; + break; + + case ITEM_ALIGN_RIGHT: + alignOffset = listPtr->columnInfo[ j ].width - tw; + break; + + case ITEM_ALIGN_CENTER: + alignOffset = ( listPtr->columnInfo[ j ].width / 2.0f ) - ( tw / 2.0f ); + break; + + default: + alignOffset = 0.0f; + } + + DC->drawText( x + 4 + listPtr->columnInfo[j].pos + alignOffset, y + listPtr->elementHeight, + item->textscale, item->window.foreColor, text, 0, + listPtr->columnInfo[j].maxChars, item->textStyle ); } } } else { @@ -4600,12 +4625,17 @@ qboolean ItemParse_columns( itemDef_t *item, int handle ) { } listPtr->numColumns = num; for (i = 0; i < num; i++) { - int pos, width, maxChars; + int pos, width, maxChars, align; - if (PC_Int_Parse(handle, &pos) && PC_Int_Parse(handle, &width) && PC_Int_Parse(handle, &maxChars)) { + if( PC_Int_Parse( handle, &pos ) && + PC_Int_Parse( handle, &width ) && + PC_Int_Parse( handle, &maxChars ) && + PC_Int_Parse( handle, &align ) ) + { listPtr->columnInfo[i].pos = pos; listPtr->columnInfo[i].width = width; listPtr->columnInfo[i].maxChars = maxChars; + listPtr->columnInfo[i].align = align; } else { return qfalse; } diff --git a/src/ui/ui_shared.h b/src/ui/ui_shared.h index 8d67fce1..f20af2b4 100644 --- a/src/ui/ui_shared.h +++ b/src/ui/ui_shared.h @@ -161,6 +161,7 @@ typedef struct columnInfo_s { int pos; int width; int maxChars; + int align; } columnInfo_t; typedef struct listBoxDef_s { diff --git a/ui/menudef.h b/ui/menudef.h index b4c77b8f..da47634e 100644 --- a/ui/menudef.h +++ b/ui/menudef.h @@ -25,6 +25,7 @@ #define ITEM_TEXTSTYLE_OUTLINED 4 // drop shadow ( need a color for this ) #define ITEM_TEXTSTYLE_OUTLINESHADOWED 5 // drop shadow ( need a color for this ) #define ITEM_TEXTSTYLE_SHADOWEDMORE 6 // drop shadow ( need a color for this ) +#define ITEM_TEXTSTYLE_NEON 7 // drop shadow ( need a color for this ) #define WINDOW_BORDER_NONE 0 // no border #define WINDOW_BORDER_FULL 1 // full border based on border color ( single pixel ) @@ -55,8 +56,8 @@ #define FEEDER_SERVERS 0x02 // servers #define FEEDER_CLANS 0x03 // clan names #define FEEDER_ALLMAPS 0x04 // all maps available, in graphic format -#define FEEDER_REDTEAM_LIST 0x05 // red team members -#define FEEDER_BLUETEAM_LIST 0x06 // blue team members +#define FEEDER_ALIENTEAM_LIST 0x05 // red team members +#define FEEDER_HUMANTEAM_LIST 0x06 // blue team members #define FEEDER_PLAYER_LIST 0x07 // players #define FEEDER_TEAM_LIST 0x08 // team members for team voting #define FEEDER_MODS 0x09 // team members for team voting @@ -150,33 +151,33 @@ #define CG_FLAGCARRIER_WEAPON 17 #define CG_FLAGCARRIER_POWERUP 18 -#define CG_PLAYER_ITEM 19 -#define CG_PLAYER_SCORE 20 +#define CG_PLAYER_ITEM 19 +#define CG_PLAYER_SCORE 20 -#define CG_BLUE_FLAGHEAD 21 -#define CG_BLUE_FLAGSTATUS 22 -#define CG_BLUE_FLAGNAME 23 -#define CG_RED_FLAGHEAD 24 -#define CG_RED_FLAGSTATUS 25 -#define CG_RED_FLAGNAME 26 +#define CG_BLUE_FLAGHEAD 21 +#define CG_BLUE_FLAGSTATUS 22 +#define CG_BLUE_FLAGNAME 23 +#define CG_RED_FLAGHEAD 24 +#define CG_RED_FLAGSTATUS 25 +#define CG_RED_FLAGNAME 26 -#define CG_BLUE_SCORE 27 -#define CG_RED_SCORE 28 -#define CG_RED_NAME 29 -#define CG_BLUE_NAME 30 -#define CG_HARVESTER_SKULLS 31 // only shows in harvester -#define CG_ONEFLAG_STATUS 32 // only shows in one flag -#define CG_PLAYER_LOCATION 33 -#define CG_TEAM_COLOR 34 -#define CG_CTF_POWERUP 35 +#define CG_BLUE_SCORE 27 +#define CG_RED_SCORE 28 +#define CG_RED_NAME 29 +#define CG_BLUE_NAME 30 +#define CG_HARVESTER_SKULLS 31 // only shows in harvester +#define CG_ONEFLAG_STATUS 32 // only shows in one flag +#define CG_PLAYER_LOCATION 33 +#define CG_TEAM_COLOR 34 +#define CG_CTF_POWERUP 35 -#define CG_AREA_POWERUP 36 -#define CG_AREA_LAGOMETER 37 // painted with old system -#define CG_PLAYER_HASFLAG 38 -#define CG_GAME_TYPE 39 // not done +#define CG_AREA_POWERUP 36 +#define CG_AREA_LAGOMETER 37 // painted with old system +#define CG_PLAYER_HASFLAG 38 +#define CG_GAME_TYPE 39 // not done -#define CG_SELECTEDPLAYER_ARMOR 40 -#define CG_SELECTEDPLAYER_HEALTH 41 +#define CG_SELECTEDPLAYER_ARMOR 40 +#define CG_SELECTEDPLAYER_HEALTH 41 #define CG_PLAYER_STATUS 42 #define CG_FRAGGED_MSG 43 // painted with old system #define CG_PROXMINED_MSG 44 // painted with old system @@ -206,6 +207,19 @@ #define CG_2NDPLACE 68 #define CG_CAPTURES 69 +//TA: loading screen +#define CG_LOAD_LEVELSHOT 76 +#define CG_LOAD_MEDIA 77 +#define CG_LOAD_MEDIA_LABEL 78 +#define CG_LOAD_BUILDABLES 79 +#define CG_LOAD_BUILDABLES_LABEL 80 +#define CG_LOAD_CHARMODEL 81 +#define CG_LOAD_CHARMODEL_LABEL 82 +#define CG_LOAD_OVERALL 83 +#define CG_LOAD_LEVELNAME 84 +#define CG_LOAD_MOTD 85 +#define CG_LOAD_HOSTNAME 86 + #define UI_OWNERDRAW_BASE 200 #define UI_HANDICAP 200 |