summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTim Angus <tim@ngus.net>2005-07-21 01:42:41 +0000
committerTim Angus <tim@ngus.net>2005-07-21 01:42:41 +0000
commit48d452bba1e9845d7935e03c520623f0b65a136d (patch)
treea14ca612d27d7f254920771b1f0a0d0ceb55afe9
parente98dcba13a94fb5c826d5d2e50d2a7bcc67040d1 (diff)
* Change death by dragoon obituary from "clawed" to "chomped"
* Fixed the bug where spectators saw team chat * Added ping display to the lagometer * Renormalised some balance variables * Fixed the bug where bodies would sometimes disappear immediately after death * Fixed the "dancing buildables" bug * Fixed the bug where buildable animation sounds were inappropriately played upon entering PVS * Fixed a subtle stage bug * Added code to indicate which stage a team is on via the scoreboard
-rw-r--r--src/cgame/cg_buildable.c8
-rw-r--r--src/cgame/cg_draw.c96
-rw-r--r--src/cgame/cg_ents.c7
-rw-r--r--src/cgame/cg_event.c2
-rw-r--r--src/cgame/cg_local.h4
-rw-r--r--src/cgame/cg_main.c1
-rw-r--r--src/cgame/cg_servercmds.c8
-rw-r--r--src/game/bg_misc.c4
-rw-r--r--src/game/bg_public.h1
-rw-r--r--src/game/g_client.c2
-rw-r--r--src/game/g_combat.c28
-rw-r--r--src/game/g_main.c38
-rw-r--r--src/game/g_team.c2
-rw-r--r--src/game/tremulous.h72
-rw-r--r--ui/menudef.h1
15 files changed, 189 insertions, 85 deletions
diff --git a/src/cgame/cg_buildable.c b/src/cgame/cg_buildable.c
index 9f4e6661..3b462dec 100644
--- a/src/cgame/cg_buildable.c
+++ b/src/cgame/cg_buildable.c
@@ -559,14 +559,20 @@ static void CG_RunBuildableLerpFrame( centity_t *cent )
{
if( cg_debugRandom.integer )
CG_Printf( "newAnimation: %d lf->animationNumber: %d lf->animation: %d\n",
- newAnimation, lf->animationNumber, !!lf->animation );
+ newAnimation, lf->animationNumber, lf->animation );
CG_SetBuildableLerpFrameAnimation( buildable, lf, newAnimation );
if( !cg_buildables[ buildable ].sounds[ newAnimation ].looped &&
cg_buildables[ buildable ].sounds[ newAnimation ].enabled )
+ {
+ if( cg_debugRandom.integer )
+ CG_Printf( "Sound for animation %d for a %s\n",
+ newAnimation, BG_FindHumanNameForBuildable( buildable ) );
+
trap_S_StartSound( cent->lerpOrigin, cent->currentState.number, CHAN_AUTO,
cg_buildables[ buildable ].sounds[ newAnimation ].sound );
+ }
}
if( cg_buildables[ buildable ].sounds[ lf->animationNumber ].looped &&
diff --git a/src/cgame/cg_draw.c b/src/cgame/cg_draw.c
index 7d2fbedd..5df933af 100644
--- a/src/cgame/cg_draw.c
+++ b/src/cgame/cg_draw.c
@@ -1654,6 +1654,70 @@ static void CG_DrawTeamSpectators( rectDef_t *rect, float scale, vec4_t color, q
/*
==================
+CG_DrawStageReport
+==================
+*/
+static void CG_DrawStageReport( rectDef_t *rect, float text_x, float text_y,
+ vec4_t color, float scale, int align, int textStyle )
+{
+ char s[ MAX_TOKEN_CHARS ];
+ int tx, w, kills;
+
+ if( cg.snap->ps.persistant[ PERS_TEAM ] == TEAM_SPECTATOR )
+ return;
+
+ if( cg.snap->ps.stats[ STAT_PTEAM ] == PTE_ALIENS )
+ {
+ kills = cgs.alienNextStageThreshold - cgs.alienKills;
+
+ if( cgs.alienNextStageThreshold < 0 )
+ Com_sprintf( s, MAX_TOKEN_CHARS, "Stage %d", cgs.alienStage + 1 );
+ else if( kills == 1 )
+ Com_sprintf( s, MAX_TOKEN_CHARS, "Stage %d, %d kill for next stage",
+ cgs.alienStage + 1, kills );
+ else
+ Com_sprintf( s, MAX_TOKEN_CHARS, "Stage %d, %d kills for next stage",
+ cgs.alienStage + 1, kills );
+ }
+ else if( cg.snap->ps.stats[ STAT_PTEAM ] == PTE_HUMANS )
+ {
+ kills = cgs.humanNextStageThreshold - cgs.humanKills;
+
+ if( cgs.humanNextStageThreshold < 0 )
+ Com_sprintf( s, MAX_TOKEN_CHARS, "Stage %d", cgs.humanStage + 1 );
+ else if( kills == 1 )
+ Com_sprintf( s, MAX_TOKEN_CHARS, "Stage %d, %d kill for next stage",
+ cgs.humanStage + 1, kills );
+ else
+ Com_sprintf( s, MAX_TOKEN_CHARS, "Stage %d, %d kills for next stage",
+ cgs.humanStage + 1, kills );
+ }
+
+ w = CG_Text_Width( s, scale, 0 );
+
+ switch( align )
+ {
+ case ITEM_ALIGN_LEFT:
+ tx = rect->x;
+ break;
+
+ case ITEM_ALIGN_RIGHT:
+ tx = rect->x + rect->w - w;
+ break;
+
+ case ITEM_ALIGN_CENTER:
+ tx = rect->x + ( rect->w / 2.0f ) - ( w / 2.0f );
+ break;
+
+ default:
+ tx = 0.0f;
+ }
+
+ CG_Text_Paint( text_x + tx, rect->y + text_y, scale, color, s, 0, 0, textStyle );
+}
+
+/*
+==================
CG_DrawFPS
==================
*/
@@ -1998,12 +2062,15 @@ static void CG_DrawDisconnect( void )
#define MAX_LAGOMETER_PING 900
#define MAX_LAGOMETER_RANGE 300
+#define PING_FRAMES 40
+
/*
==============
CG_DrawLagometer
==============
*/
-static void CG_DrawLagometer( rectDef_t *rect, qhandle_t shader )
+static void CG_DrawLagometer( rectDef_t *rect, float text_x, float text_y,
+ float scale, vec4_t textColor )
{
int a, x, y, i;
float v;
@@ -2027,7 +2094,6 @@ static void CG_DrawLagometer( rectDef_t *rect, qhandle_t shader )
ah = rect->h;
trap_R_SetColor( NULL );
- CG_DrawPic( x, y, rect->w, rect->h, shader );
CG_AdjustFrom640( &ax, &ay, &aw, &ah );
@@ -2125,6 +2191,27 @@ static void CG_DrawLagometer( rectDef_t *rect, qhandle_t shader )
if( cg_nopredict.integer || cg_synchronousClients.integer )
CG_Text_Paint( ax, ay, 0.5, white, "snc", 0, 0, ITEM_TEXTSTYLE_NORMAL );
+ else
+ {
+ static int previousPings[ PING_FRAMES ];
+ static int index;
+ int i, ping = 0;
+ char *s;
+
+ previousPings[ index++ ] = cg.snap->ping;
+ index = index % PING_FRAMES;
+
+ for( i = 0; i < PING_FRAMES; i++ )
+ ping += previousPings[ i ];
+
+ ping /= PING_FRAMES;
+
+ s = va( "%d", ping );
+ ax = rect->x + ( rect->w / 2.0f ) - ( CG_Text_Width( s, scale, 0 ) / 2.0f ) + text_x;
+ ay = rect->y + ( rect->h / 2.0f ) + ( CG_Text_Height( s, scale, 0 ) / 2.0f ) + text_y;
+
+ CG_Text_Paint( ax, ay, scale, textColor, s, 0, 0, ITEM_TEXTSTYLE_NORMAL );
+ }
CG_DrawDisconnect( );
}
@@ -2505,6 +2592,9 @@ void CG_OwnerDraw( float x, float y, float w, float h, float text_x,
case CG_PLAYER_CROSSHAIRNAMES:
CG_DrawCrosshairNames( &rect, scale, textStyle );
break;
+ case CG_STAGE_REPORT_TEXT:
+ CG_DrawStageReport( &rect, text_x, text_y, color, scale, align, textStyle );
+ break;
//loading screen
case CG_LOAD_LEVELSHOT:
@@ -2560,7 +2650,7 @@ void CG_OwnerDraw( float x, float y, float w, float h, float text_x,
CG_DrawSnapshot( &rect, text_x, text_y, scale, color, align, textStyle );
break;
case CG_LAGOMETER:
- CG_DrawLagometer( &rect, shader );
+ CG_DrawLagometer( &rect, text_x, text_y, scale, color );
break;
case CG_CONSOLE:
diff --git a/src/cgame/cg_ents.c b/src/cgame/cg_ents.c
index 44779bf6..1ed6cb2e 100644
--- a/src/cgame/cg_ents.c
+++ b/src/cgame/cg_ents.c
@@ -889,10 +889,12 @@ CG_CEntityPVSEnter
*/
static void CG_CEntityPVSEnter( centity_t *cent )
{
+ entityState_t *es = &cent->currentState;
+
if( cg_debugPVS.integer )
CG_Printf( "Entity %d entered PVS\n", cent->currentState.number );
- switch( cent->currentState.eType )
+ switch( es->eType )
{
case ET_MISSILE:
CG_LaunchMissile( cent );
@@ -910,7 +912,8 @@ static void CG_CEntityPVSEnter( centity_t *cent )
//make sure that the buildable animations are in a consistent state
//when a buildable enters the PVS
- cent->buildableAnim = BANIM_NONE;
+ cent->buildableAnim = cent->lerpFrame.animationNumber = BANIM_NONE;
+ cent->oldBuildableAnim = es->legsAnim;
}
diff --git a/src/cgame/cg_event.c b/src/cgame/cg_event.c
index 891e1371..80a82016 100644
--- a/src/cgame/cg_event.c
+++ b/src/cgame/cg_event.c
@@ -250,7 +250,7 @@ static void CG_Obituary( entityState_t *ent )
message2 = className;
break;
case MOD_LEVEL3_CLAW:
- message = "was clawed by";
+ message = "was chomped by";
Com_sprintf( className, 64, "'s %s",
BG_FindHumanNameForClassNum( PCL_ALIEN_LEVEL3 ) );
message2 = className;
diff --git a/src/cgame/cg_local.h b/src/cgame/cg_local.h
index 69c6946b..8db55818 100644
--- a/src/cgame/cg_local.h
+++ b/src/cgame/cg_local.h
@@ -1301,6 +1301,10 @@ typedef struct
int alienStage;
int humanStage;
+ int alienKills;
+ int humanKills;
+ int alienNextStageThreshold;
+ int humanNextStageThreshold;
int numAlienSpawns;
int numHumanSpawns;
diff --git a/src/cgame/cg_main.c b/src/cgame/cg_main.c
index 17772d30..0239c95d 100644
--- a/src/cgame/cg_main.c
+++ b/src/cgame/cg_main.c
@@ -1045,7 +1045,6 @@ void CG_StartMusic( void )
trap_S_StartBackgroundTrack( parm1, parm2 );
}
-//TA: FIXME: preliminary integration of CG TA UI stuff
//
// ==============================
// new hud stuff ( mission pack )
diff --git a/src/cgame/cg_servercmds.c b/src/cgame/cg_servercmds.c
index bec94eee..a045a6ec 100644
--- a/src/cgame/cg_servercmds.c
+++ b/src/cgame/cg_servercmds.c
@@ -151,7 +151,8 @@ void CG_SetConfigValues( void )
&cgs.humanBuildPointsTotal,
&cgs.humanBuildPointsPowered );
- sscanf( CG_ConfigString( CS_STAGES ), "%d %d", &cgs.alienStage, &cgs.humanStage );
+ sscanf( CG_ConfigString( CS_STAGES ), "%d %d %d %d %d %d", &cgs.alienStage, &cgs.humanStage,
+ &cgs.alienKills, &cgs.humanKills, &cgs.alienNextStageThreshold, &cgs.humanNextStageThreshold );
sscanf( CG_ConfigString( CS_SPAWNS ), "%d %d", &cgs.numAlienSpawns, &cgs.numHumanSpawns );
cgs.levelStartTime = atoi( CG_ConfigString( CS_LEVEL_START_TIME ) );
@@ -279,7 +280,10 @@ static void CG_ConfigStringModified( void )
stage_t oldAlienStage = cgs.alienStage;
stage_t oldHumanStage = cgs.humanStage;
- sscanf( str, "%d %d", &cgs.alienStage, &cgs.humanStage );
+ sscanf( str, "%d %d %d %d %d %d",
+ &cgs.alienStage, &cgs.humanStage,
+ &cgs.alienKills, &cgs.humanKills,
+ &cgs.alienNextStageThreshold, &cgs.humanNextStageThreshold );
if( cgs.alienStage != oldAlienStage )
CG_AnnounceAlienStageTransistion( oldAlienStage, cgs.alienStage );
diff --git a/src/game/bg_misc.c b/src/game/bg_misc.c
index 08484549..bd3db376 100644
--- a/src/game/bg_misc.c
+++ b/src/game/bg_misc.c
@@ -4550,8 +4550,6 @@ void BG_PlayerStateToEntityState( playerState_t *ps, entityState_t *s, qboolean
if( ps->pm_type == PM_INTERMISSION || ps->pm_type == PM_SPECTATOR || ps->pm_type == PM_FREEZE )
s->eType = ET_INVISIBLE;
- else if( ps->stats[STAT_HEALTH] <= GIB_HEALTH )
- s->eType = ET_INVISIBLE;
else if( ps->persistant[ PERS_TEAM ] == TEAM_SPECTATOR )
s->eType = ET_INVISIBLE;
else
@@ -4654,8 +4652,6 @@ void BG_PlayerStateToEntityStateExtraPolate( playerState_t *ps, entityState_t *s
if( ps->pm_type == PM_INTERMISSION || ps->pm_type == PM_SPECTATOR || ps->pm_type == PM_FREEZE )
s->eType = ET_INVISIBLE;
- else if( ps->stats[STAT_HEALTH] <= GIB_HEALTH )
- s->eType = ET_INVISIBLE;
else if( ps->persistant[ PERS_TEAM ] == TEAM_SPECTATOR )
s->eType = ET_INVISIBLE;
else
diff --git a/src/game/bg_public.h b/src/game/bg_public.h
index 0ac09d26..ee2cb067 100644
--- a/src/game/bg_public.h
+++ b/src/game/bg_public.h
@@ -23,7 +23,6 @@
#define GAME_VERSION "baseq3-1"
#define DEFAULT_GRAVITY 800
-#define GIB_HEALTH -40
#define SCORE_NOT_PRESENT -9999 // for the CS_SCORES[12] when only one player is present
diff --git a/src/game/g_client.c b/src/game/g_client.c
index 4ece1b5f..23fca525 100644
--- a/src/game/g_client.c
+++ b/src/game/g_client.c
@@ -701,7 +701,7 @@ void SpawnCorpse( gentity_t *ent )
body->takedamage = qfalse;
body->health = ent->health = ent->client->ps.stats[ STAT_HEALTH ];
- ent->health = ent->client->ps.stats[ STAT_HEALTH ] = GIB_HEALTH - 1;
+ ent->health = 0;
//change body dimensions
BG_FindBBoxForClass( ent->client->ps.stats[ STAT_PCLASS ], NULL, NULL, NULL, body->r.mins, body->r.maxs );
diff --git a/src/game/g_combat.c b/src/game/g_combat.c
index 515ecfe7..7b84ccc2 100644
--- a/src/game/g_combat.c
+++ b/src/game/g_combat.c
@@ -70,24 +70,6 @@ void LookAtKiller( gentity_t *self, gentity_t *inflictor, gentity_t *attacker )
angles[ ROLL ] = 0;
}
-/*
-==================
-body_die
-==================
-*/
-void body_die( gentity_t *self, gentity_t *inflictor, gentity_t *attacker, int damage, int meansOfDeath )
-{
- if( self->health > GIB_HEALTH )
- return;
-
- if( !g_blood.integer )
- {
- self->health = GIB_HEALTH + 1;
- return;
- }
-}
-
-
// these are just for logging, the client prints its own messages
char *modNames[ ] =
{
@@ -387,7 +369,7 @@ void player_die( gentity_t *self, gentity_t *inflictor, gentity_t *attacker, int
self->client->pers.classSelection = PCL_NONE; //TA: reset the classtype
- self->takedamage = qtrue; // can still be gibbed
+ self->takedamage = qfalse; // can still be gibbed
self->s.weapon = WP_NONE;
self->r.contents = CONTENTS_CORPSE;
@@ -447,11 +429,6 @@ void player_die( gentity_t *self, gentity_t *inflictor, gentity_t *attacker, int
}
}
- // for the no-blood option, we need to prevent the health
- // from going to gib level
- if( self->health <= GIB_HEALTH )
- self->health = GIB_HEALTH+1;
-
self->client->ps.legsAnim =
( ( self->client->ps.legsAnim & ANIM_TOGGLEBIT ) ^ ANIM_TOGGLEBIT ) | anim;
@@ -463,9 +440,6 @@ void player_die( gentity_t *self, gentity_t *inflictor, gentity_t *attacker, int
G_AddEvent( self, EV_DEATH1 + i, killer );
- // the body can still be gibbed
- self->die = body_die;
-
// globally cycle through the different death animations
i = ( i + 1 ) % 3;
}
diff --git a/src/game/g_main.c b/src/game/g_main.c
index 94175c4d..badacdb4 100644
--- a/src/game/g_main.c
+++ b/src/game/g_main.c
@@ -891,6 +891,8 @@ void G_CountSpawns( void )
}
+#define PLAYER_COUNT_MOD 5.0f
+
/*
============
G_CalculateBuildPoints
@@ -965,11 +967,37 @@ void G_CalculateBuildPoints( void )
level.humanBuildPointsPowered ) );
//may as well pump the stages here too
- trap_SetConfigstring( CS_STAGES, va( "%d %d",
- g_alienStage.integer, g_humanStage.integer ) );
-}
+ {
+ float alienPlayerCountMod = (float)level.numAlienClients / PLAYER_COUNT_MOD;
+ float humanPlayerCountMod = (float)level.numHumanClients / PLAYER_COUNT_MOD;
+ int alienNextStageThreshold, humanNextStageThreshold;
-#define PLAYER_COUNT_MOD 5.0f
+ if( alienPlayerCountMod < 0.1f )
+ alienPlayerCountMod = 0.1f;
+
+ if( humanPlayerCountMod < 0.1f )
+ humanPlayerCountMod = 0.1f;
+
+ if( g_alienStage.integer == S1 && g_alienMaxStage.integer > S1 )
+ alienNextStageThreshold = (int)( (float)g_alienStage2Threshold.integer * alienPlayerCountMod );
+ else if( g_alienStage.integer == S2 && g_alienMaxStage.integer > S2 )
+ alienNextStageThreshold = (int)( (float)g_alienStage3Threshold.integer * alienPlayerCountMod );
+ else
+ alienNextStageThreshold = -1;
+
+ if( g_humanStage.integer == S1 && g_humanMaxStage.integer > S1 )
+ humanNextStageThreshold = (int)( (float)g_humanStage2Threshold.integer * humanPlayerCountMod );
+ else if( g_humanStage.integer == S2 && g_humanMaxStage.integer > S2 )
+ humanNextStageThreshold = (int)( (float)g_humanStage3Threshold.integer * humanPlayerCountMod );
+ else
+ humanNextStageThreshold = -1;
+
+ trap_SetConfigstring( CS_STAGES, va( "%d %d %d %d %d %d",
+ g_alienStage.integer, g_humanStage.integer,
+ g_alienKills.integer, g_humanKills.integer,
+ alienNextStageThreshold, humanNextStageThreshold ) );
+ }
+}
/*
============
@@ -979,7 +1007,7 @@ G_CalculateStages
void G_CalculateStages( void )
{
float alienPlayerCountMod = (float)level.numAlienClients / PLAYER_COUNT_MOD;
- float humanPlayerCountMod = (float)level.numAlienClients / PLAYER_COUNT_MOD;
+ float humanPlayerCountMod = (float)level.numHumanClients / PLAYER_COUNT_MOD;
if( alienPlayerCountMod < 0.1f )
alienPlayerCountMod = 0.1f;
diff --git a/src/game/g_team.c b/src/game/g_team.c
index 538a29e2..9e0eb078 100644
--- a/src/game/g_team.c
+++ b/src/game/g_team.c
@@ -48,7 +48,7 @@ qboolean OnSameTeam( gentity_t *ent1, gentity_t *ent2 )
if( !ent1->client || !ent2->client )
return qfalse;
- if( ent1->client->ps.stats[ STAT_PTEAM ] == ent2->client->ps.stats[ STAT_PTEAM ] )
+ if( ent1->client->pers.teamSelection == ent2->client->pers.teamSelection )
return qtrue;
return qfalse;
diff --git a/src/game/tremulous.h b/src/game/tremulous.h
index 2416dff9..d82b64aa 100644
--- a/src/game/tremulous.h
+++ b/src/game/tremulous.h
@@ -22,66 +22,66 @@
*
*/
-#define ALIEN_WDMG_MODIFIER 0.80f
+#define ALIEN_WDMG_MODIFIER 1.0f
#define ADM(d) ((int)((float)d*ALIEN_WDMG_MODIFIER))
#define ABUILDER_BUILD_REPEAT 500
-#define ABUILDER_CLAW_DMG ADM(25)
+#define ABUILDER_CLAW_DMG ADM(20)
#define ABUILDER_CLAW_RANGE 64.0f
#define ABUILDER_CLAW_WIDTH 4.0f
#define ABUILDER_CLAW_REPEAT 1000
#define ABUILDER_BASE_DELAY 17000
#define ABUILDER_ADV_DELAY 12000
-#define ABUILDER_BLOB_DMG ADM(5)
+#define ABUILDER_BLOB_DMG ADM(4)
#define ABUILDER_BLOB_REPEAT 1000
#define ABUILDER_BLOB_SPEED 800.0f
#define ABUILDER_BLOB_SPEED_MOD 0.5f
#define ABUILDER_BLOB_TIME 5000
-#define LEVEL0_BITE_DMG ADM(60)
+#define LEVEL0_BITE_DMG ADM(48)
#define LEVEL0_BITE_RANGE 64.0f
#define LEVEL0_BITE_WIDTH 6.0f
#define LEVEL0_BITE_REPEAT 500
-#define LEVEL1_CLAW_DMG ADM(40)
+#define LEVEL1_CLAW_DMG ADM(32)
#define LEVEL1_CLAW_RANGE 96.0f
#define LEVEL1_CLAW_WIDTH 10.0f
#define LEVEL1_CLAW_REPEAT 600
#define LEVEL1_CLAW_U_REPEAT 500
#define LEVEL1_GRAB_RANGE 64.0f
#define LEVEL1_GRAB_TIME 1000
-#define LEVEL1_PCLOUD_DMG ADM(5)
+#define LEVEL1_PCLOUD_DMG ADM(4)
#define LEVEL1_PCLOUD_RANGE 200.0f
#define LEVEL1_PCLOUD_REPEAT 2000
#define LEVEL1_PCLOUD_TIME 10000
-#define LEVEL2_CLAW_DMG ADM(50)
+#define LEVEL2_CLAW_DMG ADM(40)
#define LEVEL2_CLAW_RANGE 96.0f
#define LEVEL2_CLAW_WIDTH 12.0f
#define LEVEL2_CLAW_REPEAT 500
#define LEVEL2_CLAW_U_REPEAT 400
-#define LEVEL2_AREAZAP_DMG ADM(100)
+#define LEVEL2_AREAZAP_DMG ADM(80)
#define LEVEL2_AREAZAP_RANGE 200.0f
#define LEVEL2_AREAZAP_REPEAT 3000
#define LEVEL2_WALLJUMP_MAXSPEED 1000.0f
-#define LEVEL3_CLAW_DMG ADM(100)
+#define LEVEL3_CLAW_DMG ADM(80)
#define LEVEL3_CLAW_RANGE 96.0f
#define LEVEL3_CLAW_WIDTH 16.0f
#define LEVEL3_CLAW_REPEAT 700
#define LEVEL3_CLAW_U_REPEAT 600
-#define LEVEL3_POUNCE_DMG ADM(200)
+#define LEVEL3_POUNCE_DMG ADM(160)
#define LEVEL3_POUNCE_RANGE 96.0f
#define LEVEL3_POUNCE_WIDTH 16.0f
#define LEVEL3_POUNCE_SPEED 700
#define LEVEL3_POUNCE_UPG_SPEED 800
#define LEVEL3_POUNCE_SPEED_MOD 0.75f
#define LEVEL3_POUNCE_TIME 700
-#define LEVEL3_BOUNCEBALL_DMG ADM(150)
+#define LEVEL3_BOUNCEBALL_DMG ADM(120)
#define LEVEL3_BOUNCEBALL_REPEAT 1000
#define LEVEL3_BOUNCEBALL_SPEED 1000.0f
-#define LEVEL4_CLAW_DMG ADM(150)
+#define LEVEL4_CLAW_DMG ADM(120)
#define LEVEL4_CLAW_RANGE 128.0f
#define LEVEL4_CLAW_WIDTH 20.0f
#define LEVEL4_CLAW_REPEAT 750
@@ -92,7 +92,7 @@
#define LEVEL4_CHARGE_CHARGE_TIME 1000
#define LEVEL4_CHARGE_CHARGE_RATIO (LEVEL4_CHARGE_TIME/LEVEL4_CHARGE_CHARGE_TIME)
#define LEVEL4_CHARGE_REPEAT 500
-#define LEVEL4_CHARGE_DMG ADM(200)
+#define LEVEL4_CHARGE_DMG ADM(160)
@@ -308,13 +308,13 @@
*
*/
-#define HUMAN_WDMG_MODIFIER 1.13f
+#define HUMAN_WDMG_MODIFIER 1.0f
#define HDM(d) ((int)((float)d*HUMAN_WDMG_MODIFIER))
#define BLASTER_REPEAT 600
#define BLASTER_SPREAD 200
#define BLASTER_SPEED 700
-#define BLASTER_DMG HDM(10)
+#define BLASTER_DMG HDM(9)
#define RIFLE_CLIPSIZE 30
#define RIFLE_SPAWNCLIPS 4
@@ -323,16 +323,16 @@
#define RIFLE_RELOAD 2000
#define RIFLE_PRICE 0
#define RIFLE_SPREAD 200
-#define RIFLE_DMG HDM(6)
+#define RIFLE_DMG HDM(5)
#define PAINSAW_PRICE 100
#define PAINSAW_REPEAT 75
-#define PAINSAW_DAMAGE HDM(20)
+#define PAINSAW_DAMAGE HDM(18)
#define PAINSAW_RANGE 48.0f
#define GRENADE_PRICE 300
#define GRENADE_REPEAT 0
-#define GRENADE_DAMAGE HDM(350)
+#define GRENADE_DAMAGE HDM(310)
#define GRENADE_RANGE 192.0f
#define GRENADE_SPEED 400.0f
@@ -344,19 +344,19 @@
#define SHOTGUN_REPEAT 1200
#define SHOTGUN_RELOAD 2000
#define SHOTGUN_SPREAD 900
-#define SHOTGUN_DMG HDM(7)
+#define SHOTGUN_DMG HDM(6)
#define LASGUN_PRICE 250
#define LASGUN_AMMO 150
#define LASGUN_REPEAT 200
#define LASGUN_RELOAD 2000
-#define LASGUN_DAMAGE HDM(10)
+#define LASGUN_DAMAGE HDM(9)
#define MDRIVER_PRICE 350
#define MDRIVER_CLIPSIZE 5
#define MDRIVER_SPAWNCLIPS 3
#define MDRIVER_MAXCLIPS 3
-#define MDRIVER_DMG HDM(35)
+#define MDRIVER_DMG HDM(31)
#define MDRIVER_REPEAT 1000
#define MDRIVER_RELOAD 2000
@@ -364,7 +364,7 @@
#define CHAINGUN_BULLETS 200
#define CHAINGUN_REPEAT 80
#define CHAINGUN_SPREAD 1000
-#define CHAINGUN_DMG HDM(6)
+#define CHAINGUN_DMG HDM(5)
#define PRIFLE_PRICE 400
#define PRIFLE_CLIPS 50
@@ -372,13 +372,13 @@
#define PRIFLE_MAXCLIPS 2
#define PRIFLE_REPEAT 100
#define PRIFLE_RELOAD 2000
-#define PRIFLE_DMG HDM(10)
+#define PRIFLE_DMG HDM(9)
#define PRIFLE_SPEED 1000
#define FLAMER_PRICE 450
#define FLAMER_GAS 80
#define FLAMER_REPEAT 300
-#define FLAMER_DMG HDM(35)
+#define FLAMER_DMG HDM(31)
#define FLAMER_RADIUS 50
#define FLAMER_LIFETIME 500.0f
#define FLAMER_SPEED 200.0f
@@ -389,9 +389,9 @@
#define LCANNON_REPEAT 500
#define LCANNON_CHARGEREPEAT 1000
#define LCANNON_RELOAD 2000
-#define LCANNON_DAMAGE HDM(300)
+#define LCANNON_DAMAGE HDM(265)
#define LCANNON_RADIUS 150
-#define LCANNON_SECONDARY_DAMAGE HDM(30)
+#define LCANNON_SECONDARY_DAMAGE HDM(27)
#define LCANNON_SECONDARY_RADIUS 75
#define LCANNON_SPEED 350
#define LCANNON_CHARGE_TIME 2000
@@ -452,7 +452,7 @@
*
*/
-#define HUMAN_BHLTH_MODIFIER 0.62f
+#define HUMAN_BHLTH_MODIFIER 1.0f
#define HBHM(h) ((int)((float)h*HUMAN_BHLTH_MODIFIER))
#define REACTOR_BASESIZE 1000
@@ -461,20 +461,20 @@
#define HSPAWN_BP 10
#define HSPAWN_BT 10000
-#define HSPAWN_HEALTH HBHM(500)
+#define HSPAWN_HEALTH HBHM(310)
#define HSPAWN_SPLASHDAMAGE 50
#define HSPAWN_SPLASHRADIUS 100
#define HSPAWN_VALUE 1
#define MEDISTAT_BP 8
#define MEDISTAT_BT 10000
-#define MEDISTAT_HEALTH HBHM(300)
+#define MEDISTAT_HEALTH HBHM(190)
#define MEDISTAT_SPLASHDAMAGE 50
#define MEDISTAT_SPLASHRADIUS 100
#define MGTURRET_BP 8
#define MGTURRET_BT 10000
-#define MGTURRET_HEALTH HBHM(300)
+#define MGTURRET_HEALTH HBHM(190)
#define MGTURRET_SPLASHDAMAGE 200
#define MGTURRET_SPLASHRADIUS 150
#define MGTURRET_ANGULARSPEED 8 //degrees/think ~= 200deg/sec
@@ -491,28 +491,28 @@
#define TESLAGEN_BP 10
#define TESLAGEN_BT 15000
-#define TESLAGEN_HEALTH HBHM(350)
+#define TESLAGEN_HEALTH HBHM(220)
#define TESLAGEN_SPLASHDAMAGE 50
#define TESLAGEN_SPLASHRADIUS 100
#define TESLAGEN_REPEAT 500
#define TESLAGEN_RANGE 250
-#define TESLAGEN_DMG HDM(15)
+#define TESLAGEN_DMG HDM(13)
#define DC_BP 8
#define DC_BT 10000
-#define DC_HEALTH HBHM(300)
+#define DC_HEALTH HBHM(190)
#define DC_SPLASHDAMAGE 50
#define DC_SPLASHRADIUS 100
#define ARMOURY_BP 10
#define ARMOURY_BT 10000
-#define ARMOURY_HEALTH HBHM(450)
+#define ARMOURY_HEALTH HBHM(280)
#define ARMOURY_SPLASHDAMAGE 50
#define ARMOURY_SPLASHRADIUS 100
#define REACTOR_BP 0
#define REACTOR_BT 20000
-#define REACTOR_HEALTH HBHM(1500)
+#define REACTOR_HEALTH HBHM(930)
#define REACTOR_SPLASHDAMAGE 200
#define REACTOR_SPLASHRADIUS 300
#define REACTOR_ATTACK_RANGE 100.0f
@@ -522,7 +522,7 @@
#define REPEATER_BP 0
#define REPEATER_BT 10000
-#define REPEATER_HEALTH HBHM(400)
+#define REPEATER_HEALTH HBHM(250)
#define REPEATER_SPLASHDAMAGE 50
#define REPEATER_SPLASHRADIUS 100
#define REPEATER_INACTIVE_TIME 90000
diff --git a/ui/menudef.h b/ui/menudef.h
index ac81b6c8..57514a53 100644
--- a/ui/menudef.h
+++ b/ui/menudef.h
@@ -252,6 +252,7 @@
#define CG_SNAPSHOT 89
#define CG_LAGOMETER 90
#define CG_PLAYER_CROSSHAIRNAMES 114
+#define CG_STAGE_REPORT_TEXT 116
#define CG_CONSOLE 91