summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/cgame/cg_event.c6
-rw-r--r--src/cgame/cg_view.c109
-rw-r--r--src/cgame/cg_weapons.c11
-rw-r--r--src/game/bg_misc.c82
-rw-r--r--src/game/bg_pmove.c76
-rw-r--r--src/game/bg_public.h16
-rw-r--r--src/game/g_active.c71
-rw-r--r--src/game/g_combat.c6
-rw-r--r--src/game/g_local.h8
-rw-r--r--src/game/g_weapon.c76
-rw-r--r--src/game/tremulous.h11
11 files changed, 173 insertions, 299 deletions
diff --git a/src/cgame/cg_event.c b/src/cgame/cg_event.c
index 8f6f6b55..ea4781cd 100644
--- a/src/cgame/cg_event.c
+++ b/src/cgame/cg_event.c
@@ -220,7 +220,7 @@ static void CG_Obituary( entityState_t *ent )
message = "should leave";
message2 = "'s buildings alone";
break;
- case MOD_VENOM:
+ case MOD_SOLDIER_BITE:
message = "was biten by";
break;
case MOD_HYDRA_CLAW:
@@ -247,6 +247,10 @@ static void CG_Obituary( entityState_t *ent )
message = "was mauled by";
message2 = "'s big mofo";
break;
+ case MOD_BMOFO_CHARGE:
+ message = "should have gotten out of the way of";
+ message2 = "'s big mofo";
+ break;
case MOD_TELEFRAG:
message = "tried to invade";
diff --git a/src/cgame/cg_view.c b/src/cgame/cg_view.c
index 80b1101c..b01c273f 100644
--- a/src/cgame/cg_view.c
+++ b/src/cgame/cg_view.c
@@ -462,6 +462,20 @@ static void CG_OffsetFirstPersonView( void )
else
bob2 = BG_FindBobForClass( cg.predictedPlayerState.stats[ STAT_PCLASS ] );
+ //give a charging player some feedback
+ if( cg.predictedPlayerState.weapon == WP_CHARGE )
+ {
+ if( cg.predictedPlayerState.stats[ STAT_MISC ] > 0 )
+ {
+ float fraction = (float)( cg.time - cg.weapon2Time ) / (float)BMOFO_CHARGE_TIME;
+
+ if( fraction > 1.0f )
+ fraction = 1.0f;
+
+ bob2 *= ( 1.0f + fraction * 6.0f );
+ }
+ }
+
if( bob2 != 0.0f )
{
// make sure the bob is visible even at low speeds
@@ -484,8 +498,7 @@ static void CG_OffsetFirstPersonView( void )
//provide some feedback for pouncing
if( cg.predictedPlayerState.weapon == WP_POUNCE ||
- cg.predictedPlayerState.weapon == WP_POUNCE_UPG ||
- cg.predictedPlayerState.weapon == WP_GROUND_POUND )
+ cg.predictedPlayerState.weapon == WP_POUNCE_UPG )
{
if( cg.predictedPlayerState.stats[ STAT_MISC ] > 0 )
{
@@ -495,17 +508,14 @@ static void CG_OffsetFirstPersonView( void )
AngleVectors( angles, forward, NULL, NULL );
VectorNormalize( forward );
- if( cg.predictedPlayerState.weapon == WP_GROUND_POUND )
- fraction1 = (float)( cg.time - cg.weapon2Time ) / (float)BMOFO_CHARGE_TIME;
- else
- fraction1 = (float)( cg.time - cg.weapon2Time ) / (float)DRAGOON_POUNCE_TIME;
+ fraction1 = (float)( cg.time - cg.weapon2Time ) / (float)DRAGOON_POUNCE_TIME;
if( fraction1 > 1.0f )
fraction1 = 1.0f;
fraction2 = -sin( fraction1 * M_PI / 2 );
- VectorMA( origin, 15*fraction2, forward, origin );
+ VectorMA( origin, 15 * fraction2, forward, origin );
}
}
@@ -597,95 +607,12 @@ static void CG_OffsetFirstPersonView( void )
}
}
-#define KNOCK_ROLL 70.0f
-#define KNOCK_SHAKE_HEIGHT 10
-#define KNOCK_RUMBLE_TIME 60
-
- if( cg.predictedPlayerState.stats[ STAT_STATE ] & SS_KNOCKEDOVER )
- {
- int deltaTime;
- float deltaSecs;
- trace_t tr;
- vec3_t mins, maxs;
- float rollFraction;
-
- BG_FindBBoxForClass( cg.predictedPlayerState.stats[ STAT_PCLASS ], NULL, NULL, NULL, mins, maxs );
-
- //bit closer to the ground
- mins[ 2 ] = -1.0f;
-
- deltaTime = cg.time - ( cg.firstKnockedTime + (int)( (float)BMOFO_KOVER_TIME / 5.0f ) );
-
- if( deltaTime < 0 )
- {
- if( cg.time > cg.lastRumbleTime )
- {
- cg.rumbleVector[ 0 ] = rand( ) % KNOCK_SHAKE_HEIGHT;
- cg.rumbleVector[ 1 ] = rand( ) % KNOCK_SHAKE_HEIGHT;
- cg.rumbleVector[ 2 ] = rand( ) % KNOCK_SHAKE_HEIGHT;
-
- cg.lastRumbleTime = cg.time + KNOCK_RUMBLE_TIME;
- }
-
- VectorAdd( origin, cg.rumbleVector, origin );
- }
- else
- {
- deltaSecs = deltaTime * 0.001; // milliseconds to seconds
- origin[ 2 ] -= 0.5 * DEFAULT_GRAVITY * deltaSecs * deltaSecs; // FIXME: local gravity...
-
- CG_Trace( &tr, baseOrigin, mins, maxs, origin, cg.predictedPlayerState.clientNum, MASK_SOLID );
- VectorCopy( tr.endpos, origin );
-
- rollFraction = (float)deltaTime / ( (float)BMOFO_KOVER_TIME / 6.0f );
-
- if( rollFraction > 1.0f )
- rollFraction = 1.0f;
-
- angles[ ROLL ] -= rollFraction * KNOCK_ROLL;
- VectorSet( cg.rumbleVector, 0.0f, 0.0f, 0.0f );
- }
- }
-
- if( cg.predictedPlayerState.stats[ STAT_STATE ] & SS_GETTINGUP )
- {
- int deltaTime;
- trace_t tr;
- vec3_t mins, maxs, ground, pushUp;
- float rollFraction;
-
- BG_FindBBoxForClass( cg.predictedPlayerState.stats[ STAT_PCLASS ], NULL, NULL, NULL, mins, maxs );
-
- //bit closer to the ground
- mins[ 2 ] = -1.0f;
-
- VectorCopy( baseOrigin, ground );
- ground[ 2 ] -= 64.0f;
-
- CG_Trace( &tr, baseOrigin, mins, maxs, ground, cg.predictedPlayerState.clientNum, MASK_SOLID );
- VectorSubtract( baseOrigin, tr.endpos, pushUp );
-
- deltaTime = cg.time - cg.firstGetUpTime;
-
- rollFraction = (float)deltaTime / (float)BMOFO_GETUP_TIME;
-
- if( rollFraction > 1.0f )
- rollFraction = 1.0f;
-
- rollFraction = 1.0f - rollFraction;
-
- VectorScale( pushUp, rollFraction, pushUp );
- VectorSubtract( origin, pushUp, origin );
-
- angles[ ROLL ] -= rollFraction * KNOCK_ROLL;
- }
-
//TA: this *feels* more realisitic for humans
if( cg.predictedPlayerState.stats[ STAT_PTEAM ] == PTE_HUMANS )
{
angles[PITCH] += cg.bobfracsin * bob2 * 0.5;
- //TA: heavy breathing effects
+ //TA: heavy breathing effects //FIXME: sound
if( cg.predictedPlayerState.stats[ STAT_STAMINA ] < 0 )
{
float deltaBreath = (float)(
diff --git a/src/cgame/cg_weapons.c b/src/cgame/cg_weapons.c
index 1b9f7599..aeab2db3 100644
--- a/src/cgame/cg_weapons.c
+++ b/src/cgame/cg_weapons.c
@@ -1120,17 +1120,6 @@ void CG_AddViewWeapon( playerState_t *ps )
VectorMA( hand.origin, random( ) * fraction, cg.refdef.viewaxis[ 1 ], hand.origin );
}
- if( cg.predictedPlayerState.stats[ STAT_STATE ] & SS_KNOCKEDOVER )
- {
- vec3_t weaponRumble;
-
- VectorCopy( cg.rumbleVector, weaponRumble );
- VectorInverse( weaponRumble );
- VectorScale( weaponRumble, 0.1f, weaponRumble );
-
- VectorAdd( hand.origin, weaponRumble, hand.origin );
- }
-
AnglesToAxis( angles, hand.axis );
// map torso animations to weapon animations
diff --git a/src/game/bg_misc.c b/src/game/bg_misc.c
index 7e41c7fa..bcb90316 100644
--- a/src/game/bg_misc.c
+++ b/src/game/bg_misc.c
@@ -1244,7 +1244,8 @@ classAttributes_t bg_classList[ ] =
0.001f, //float bob;
350, //int steptime;
ABUILDER_SPEED, //float speed;
- 1.0f, //float sticky;
+ 10.0f, //float acceleration;
+ 6.0f, //float friction;
{ PCL_A_B_LEV1, PCL_NONE, PCL_NONE }, //int children[ 3 ];
ABUILDER_TTE, //int timetoevolve;
ABUILDER_VALUE //int value;
@@ -1274,7 +1275,8 @@ classAttributes_t bg_classList[ ] =
0.001f, //float bob;
200, //int steptime;
ABUILDER_UPG_SPEED, //float speed;
- 1.0f, //float sticky;
+ 10.0f, //float acceleration;
+ 6.0f, //float friction;
{ PCL_NONE, PCL_NONE, PCL_NONE }, //int children[ 3 ];
0, //int timetoevolve;
ABUILDER_UPG_VALUE //int value;
@@ -1304,7 +1306,8 @@ classAttributes_t bg_classList[ ] =
0.0f, //float bob;
25, //int steptime;
SOLDIER_SPEED, //float speed;
- 5.0f, //float sticky;
+ 10.0f, //float acceleration;
+ 20.0f, //float friction;
{ PCL_A_O_LEV1, PCL_NONE, PCL_NONE }, //int children[ 3 ];
SOLDIER_TTE, //int timetoevolve;
SOLDIER_VALUE //int value;
@@ -1335,7 +1338,8 @@ classAttributes_t bg_classList[ ] =
0.001f, //float bob;
25, //int steptime;
HYDRA_SPEED, //float speed;
- 4.0f, //float sticky;
+ 10.0f, //float acceleration;
+ 10.0f, //float friction;
{ PCL_A_O_LEV2, PCL_A_O_LEV1_UPG, PCL_NONE }, //int children[ 3 ];
HYDRA_TTE, //int timetoevolve;
HYDRA_VALUE //int value;
@@ -1366,7 +1370,8 @@ classAttributes_t bg_classList[ ] =
0.001f, //float bob;
25, //int steptime;
HYDRA_UPG_SPEED, //float speed;
- 4.0f, //float sticky;
+ 10.0f, //float acceleration;
+ 6.0f, //float friction;
{ PCL_A_O_LEV2, PCL_NONE, PCL_NONE }, //int children[ 3 ];
HYDRA_UPG_TTE, //int timetoevolve;
HYDRA_UPG_VALUE //int value;
@@ -1396,7 +1401,8 @@ classAttributes_t bg_classList[ ] =
0.0005f, //float bob;
25, //int steptime;
DRAGOON_SPEED, //float speed;
- 3.0f, //float sticky;
+ 10.0f, //float acceleration;
+ 6.0f, //float friction;
{ PCL_A_O_LEV3, PCL_A_O_LEV2_UPG, PCL_NONE }, //int children[ 3 ];
DRAGOON_TTE, //int timetoevolve;
DRAGOON_VALUE //int value;
@@ -1426,7 +1432,8 @@ classAttributes_t bg_classList[ ] =
0.0005f, //float bob;
25, //int steptime;
DRAGOON_UPG_SPEED, //float speed;
- 3.0f, //float sticky;
+ 10.0f, //float acceleration;
+ 6.0f, //float friction;
{ PCL_A_O_LEV3, PCL_NONE, PCL_NONE }, //int children[ 3 ];
DRAGOON_UPG_TTE, //int timetoevolve;
DRAGOON_UPG_VALUE //int value;
@@ -1456,7 +1463,8 @@ classAttributes_t bg_classList[ ] =
0.0f, //float bob;
60, //int steptime;
CHIMERA_SPEED, //float speed;
- 5.0f, //float sticky;
+ 10.0f, //float acceleration;
+ 6.0f, //float friction;
{ PCL_A_O_LEV4, PCL_A_O_LEV3_UPG, PCL_NONE }, //int children[ 3 ];
CHIMERA_TTE, //int timetoevolve;
CHIMERA_VALUE //int value;
@@ -1486,7 +1494,8 @@ classAttributes_t bg_classList[ ] =
0.0f, //float bob;
60, //int steptime;
CHIMERA_UPG_SPEED, //float speed;
- 5.0f, //float sticky;
+ 10.0f, //float acceleration;
+ 6.0f, //float friction;
{ PCL_A_O_LEV4, PCL_NONE, PCL_NONE }, //int children[ 3 ];
CHIMERA_UPG_TTE, //int timetoevolve;
CHIMERA_UPG_VALUE //int value;
@@ -1495,7 +1504,7 @@ classAttributes_t bg_classList[ ] =
PCL_A_O_LEV4, //int classnum;
"bigmofo", //char *classname;
"Big Mofo", //char *humanname;
- "bigmofo", //char *modelname;
+ "bug", //char *modelname;
1.2f, //float modelScale;
"default", //char *skinname;
"alien_general_hud", //char *hudname;
@@ -1510,13 +1519,14 @@ classAttributes_t bg_classList[ ] =
BMOFO_REGEN, //int regenRate;
SCA_CANJUMP|SCA_NOWEAPONDRIFT|
SCA_FOVWARPS|SCA_ALIENSENSE|SCA_NOFOOTSTEPS, //int abilities;
- WP_GROUND_POUND, //weapon_t startWeapon
+ WP_CHARGE, //weapon_t startWeapon
0.0f, //float buildDist;
90, //int fov;
- 0.0f, //float bob;
+ 0.001f, //float bob;
60, //int steptime;
BMOFO_SPEED, //float speed;
- 5.0f, //float sticky;
+ 5.0f, //float acceleration;
+ 6.0f, //float friction;
{ PCL_NONE, PCL_NONE, PCL_NONE }, //int children[ 3 ];
0, //int timetoevolve;
BMOFO_VALUE //int value;
@@ -1545,7 +1555,8 @@ classAttributes_t bg_classList[ ] =
0.002f, //float bob;
200, //int steptime;
1.0f, //float speed;
- 1.0f, //float sticky;
+ 10.0f, //float acceleration;
+ 6.0f, //float friction;
{ PCL_NONE, PCL_NONE, PCL_NONE }, //int children[ 3 ];
0, //int timetoevolve;
0 //int value;
@@ -1561,7 +1572,7 @@ classAttributes_t bg_classList[ ] =
"bsuit", ( 1 << S1 )|( 1 << S2 )|( 1 << S3 ), { 0, 0, 0 }, { 0, 0, 0, },
{ 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, 0, }, 0, 0, 0, 0, 0, WP_NONE, 0.0f, 0,
- 0.0f, 0, 1.0f, 1.0f, { PCL_NONE, PCL_NONE, PCL_NONE }, 0, 0
+ 0.0f, 0, 1.0f, 1.0f, 1.0f, { PCL_NONE, PCL_NONE, PCL_NONE }, 0, 0
}
};
@@ -1663,7 +1674,7 @@ float BG_FindModelScaleForClass( int pclass )
}
}
- Com_Printf( S_COLOR_YELLOW "WARNING: fallthrough in BG_FindModelScaleForClass\n" );
+ Com_Printf( S_COLOR_YELLOW "WARNING: fallthrough in BG_FindModelScaleForClass( %d )\n", pclass );
return 1.0f;
}
@@ -1916,10 +1927,10 @@ float BG_FindSpeedForClass( int pclass )
/*
==============
-BG_FindStickyForClass
+BG_FindAccelerationForClass
==============
*/
-float BG_FindStickyForClass( int pclass )
+float BG_FindAccelerationForClass( int pclass )
{
int i;
@@ -1927,12 +1938,33 @@ float BG_FindStickyForClass( int pclass )
{
if( bg_classList[ i ].classNum == pclass )
{
- return bg_classList[ i ].sticky;
+ return bg_classList[ i ].acceleration;
}
}
- Com_Printf( S_COLOR_YELLOW "WARNING: fallthrough in BG_FindStickyForClass\n" );
- return 1.0f;
+ Com_Printf( S_COLOR_YELLOW "WARNING: fallthrough in BG_FindAccelerationForClass\n" );
+ return 10.0f;
+}
+
+/*
+==============
+BG_FindFrictionForClass
+==============
+*/
+float BG_FindFrictionForClass( int pclass )
+{
+ int i;
+
+ for( i = 0; i < bg_numPclasses; i++ )
+ {
+ if( bg_classList[ i ].classNum == pclass )
+ {
+ return bg_classList[ i ].friction;
+ }
+ }
+
+ Com_Printf( S_COLOR_YELLOW "WARNING: fallthrough in BG_FindFrictionForClass\n" );
+ return 6.0f;
}
/*
@@ -2548,7 +2580,7 @@ weaponAttributes_t bg_weapons[ ] =
WUT_ALIENS //WUTeam_t team;
},
{
- WP_GROUND_POUND, //int weaponNum;
+ WP_CHARGE, //int weaponNum;
0, //int price;
( 1 << S1 )|( 1 << S2 )|( 1 << S3 ), //int stages
SLOT_WEAPON, //int slots;
@@ -2560,11 +2592,11 @@ weaponAttributes_t bg_weapons[ ] =
qtrue, //int infiniteAmmo;
qfalse, //int usesEnergy;
BMOFO_CLAW_REPEAT, //int repeatRate1;
- BMOFO_KNOCK_REPEAT, //int repeatRate2;
- BMOFO_CLAW_REPEAT, //int repeatRate3;
+ 0, //int repeatRate2;
+ 0, //int repeatRate3;
0, //int reloadTime;
qfalse, //qboolean hasAltMode;
- qtrue, //qboolean hasThirdMode;
+ qfalse, //qboolean hasThirdMode;
qfalse, //qboolean purchasable;
0, //int buildDelay;
WUT_ALIENS //WUTeam_t team;
diff --git a/src/game/bg_pmove.c b/src/game/bg_pmove.c
index 67194f97..d6b3a542 100644
--- a/src/game/bg_pmove.c
+++ b/src/game/bg_pmove.c
@@ -251,10 +251,8 @@ static void PM_Friction( void )
// if getting knocked back, no friction
if( !( pm->ps->pm_flags & PMF_TIME_KNOCKBACK ) )
{
- float sticky = BG_FindStickyForClass( pm->ps->stats[ STAT_PCLASS ] );
-
- control = speed < pm_stopspeed * sticky ? pm_stopspeed * sticky : speed;
- drop += control*pm_friction*pml.frametime;
+ control = speed < pm_stopspeed ? pm_stopspeed : speed;
+ drop += control * BG_FindFrictionForClass( pm->ps->stats[ STAT_PCLASS ] ) * pml.frametime;
}
}
}
@@ -307,7 +305,7 @@ static void PM_Accelerate( vec3_t wishdir, float wishspeed, float accel )
accelspeed = addspeed;
for( i = 0; i < 3; i++ )
- pm->ps->velocity[ i ] += accelspeed*wishdir[ i ];
+ pm->ps->velocity[ i ] += accelspeed * wishdir[ i ];
#else
// proper way (avoids strafe jump maxspeed bug), but feels bad
vec3_t wishVelocity;
@@ -344,13 +342,8 @@ static float PM_CmdScale( usercmd_t *cmd )
float total;
float scale;
float modifier = 1.0f;
- static int time;
- int dTime;
int aForward, aRight;
- dTime = pm->cmd.serverTime - time;
- time = pm->cmd.serverTime;
-
if( pm->ps->stats[ STAT_PTEAM ] == PTE_HUMANS && pm->ps->pm_type == PM_NORMAL &&
!( BG_gotItem( UP_JETPACK, pm->ps->stats ) && BG_activated( UP_JETPACK, pm->ps->stats ) ) )
{
@@ -389,7 +382,10 @@ static float PM_CmdScale( usercmd_t *cmd )
}
}
- if( pm->ps->pm_type == PM_GRABBED || pm->ps->pm_type == PM_KNOCKED )
+ if( pm->ps->weapon == WP_CHARGE && pm->ps->pm_flags & PMF_CHARGE )
+ modifier *= ( 1.0f + ( pm->ps->stats[ STAT_MISC ] / (float)BMOFO_CHARGE_TIME ) * ( BMOFO_CHARGE_SPEED - 1.0f ) );
+
+ if( pm->ps->pm_type == PM_GRABBED )
modifier = 0.0f;
if( !BG_ClassHasAbility( pm->ps->stats[ STAT_PCLASS ], SCA_CANJUMP ) )
@@ -463,27 +459,19 @@ PM_CheckCharge
*/
static void PM_CheckCharge( void )
{
- vec3_t forward;
-
- if( pm->ps->weapon != WP_GROUND_POUND )
+ if( pm->ps->weapon != WP_CHARGE )
return;
if( pm->cmd.buttons & BUTTON_ATTACK2 )
{
- pm->ps->pm_flags &= ~PMF_CHARGE_POUNCE;
+ pm->ps->pm_flags &= ~PMF_CHARGE;
return;
}
-
- if( pm->ps->pm_flags & PMF_CHARGE_POUNCE )
- return;
-
- if( pm->ps->stats[ STAT_MISC ] == 0 )
- return;
-
- pm->ps->pm_flags |= PMF_CHARGE_POUNCE;
- AngleVectors( pm->ps->viewangles, forward, NULL, NULL );
- VectorMA( pm->ps->velocity, pm->ps->stats[ STAT_MISC ], forward, pm->ps->velocity );
+ if( pm->ps->stats[ STAT_MISC ] > 0 )
+ pm->ps->pm_flags |= PMF_CHARGE;
+ else
+ pm->ps->pm_flags &= ~PMF_CHARGE;
}
/*
@@ -500,11 +488,11 @@ static qboolean PM_CheckPounce( void )
if( pm->cmd.buttons & BUTTON_ATTACK2 )
{
- pm->ps->pm_flags &= ~PMF_CHARGE_POUNCE;
+ pm->ps->pm_flags &= ~PMF_CHARGE;
return qfalse;
}
- if( pm->ps->pm_flags & PMF_CHARGE_POUNCE )
+ if( pm->ps->pm_flags & PMF_CHARGE )
return qfalse;
if( pm->ps->stats[ STAT_MISC ] == 0 )
@@ -513,7 +501,7 @@ static qboolean PM_CheckPounce( void )
pml.groundPlane = qfalse; // jumping away
pml.walking = qfalse;
- pm->ps->pm_flags |= PMF_CHARGE_POUNCE;
+ pm->ps->pm_flags |= PMF_CHARGE;
pm->ps->groundEntityNum = ENTITYNUM_NONE;
@@ -560,7 +548,7 @@ static qboolean PM_CheckJump( void )
return qfalse;
//can't jump and charge at the same time
- if( ( pm->ps->weapon == WP_GROUND_POUND ) && pm->ps->stats[ STAT_MISC ] > 0 )
+ if( ( pm->ps->weapon == WP_CHARGE ) && pm->ps->stats[ STAT_MISC ] > 0 )
return qfalse;
if( ( pm->ps->stats[ STAT_PTEAM ] == PTE_HUMANS ) &&
@@ -575,7 +563,7 @@ static qboolean PM_CheckJump( void )
return qfalse;
//can't jump whilst grabbed
- if( pm->ps->pm_type == PM_GRABBED && pm->ps->pm_type == PM_KNOCKED )
+ if( pm->ps->pm_type == PM_GRABBED )
{
pm->cmd.upmove = 0;
return qfalse;
@@ -1055,7 +1043,7 @@ static void PM_ClimbMove( void )
if( ( pml.groundTrace.surfaceFlags & SURF_SLICK ) || pm->ps->pm_flags & PMF_TIME_KNOCKBACK )
accelerate = pm_airaccelerate;
else
- accelerate = pm_accelerate;
+ accelerate = BG_FindAccelerationForClass( pm->ps->stats[ STAT_PCLASS ] );
PM_Accelerate( wishdir, wishspeed, accelerate );
@@ -1175,7 +1163,7 @@ static void PM_WalkMove( void )
if( ( pml.groundTrace.surfaceFlags & SURF_SLICK ) || pm->ps->pm_flags & PMF_TIME_KNOCKBACK )
accelerate = pm_airaccelerate;
else
- accelerate = pm_accelerate;
+ accelerate = BG_FindAccelerationForClass( pm->ps->stats[ STAT_PCLASS ] );
PM_Accelerate( wishdir, wishspeed, accelerate );
@@ -2438,9 +2426,6 @@ static void PM_Weapon( void )
if( pm->ps->stats[ STAT_STATE ] & SS_HOVELING )
return;
- if( pm->ps->stats[ STAT_STATE ] & SS_KNOCKEDOVER )
- return;
-
// check for dead player
if( pm->ps->stats[ STAT_HEALTH ] <= 0 )
{
@@ -2896,25 +2881,6 @@ void PM_UpdateViewAngles( playerState_t *ps, const usercmd_t *cmd )
ps->delta_angles[ i ] -= ANGLE2SHORT( fabs( diff ) * 0.05f );
}
}
-
- //fix the view to the lock point
- if( ps->pm_type == PM_KNOCKED )
- {
- for( i = 0; i < 3; i++ )
- {
- float diff = AngleSubtract( ps->viewangles[ i ], ps->grapplePoint[ i ] );
-
- while( diff > 180.0f )
- diff -= 360.0f;
- while( diff < -180.0f )
- diff += 360.0f;
-
- if( diff < 0 )
- ps->delta_angles[ i ] += ANGLE2SHORT( fabs( diff ) );
- else if( diff > 0 )
- ps->delta_angles[ i ] -= ANGLE2SHORT( fabs( diff ) );
- }
- }
}
@@ -3075,7 +3041,7 @@ void PmoveSingle (pmove_t *pmove)
// update the viewangles
PM_UpdateViewAngles( pm->ps, &pm->cmd );
- if ( pm->ps->pm_type == PM_DEAD || pm->ps->pm_type == PM_GRABBED || pm->ps->pm_type == PM_KNOCKED )
+ if ( pm->ps->pm_type == PM_DEAD || pm->ps->pm_type == PM_GRABBED )
PM_DeadMove( );
PM_DropTimers( );
diff --git a/src/game/bg_public.h b/src/game/bg_public.h
index 1e9ffff9..b923f88d 100644
--- a/src/game/bg_public.h
+++ b/src/game/bg_public.h
@@ -110,7 +110,6 @@ typedef enum
PM_GRABBED, // like dead, but for when the player is still live
PM_DEAD, // no acceleration or turning, but free falling
PM_FREEZE, // stuck in place with no control
- PM_KNOCKED, // knocked over
PM_INTERMISSION, // no movement or status bar
PM_SPINTERMISSION // no movement or status bar
} pmtype_t;
@@ -139,7 +138,7 @@ typedef enum
#define PMF_FOLLOW 4096 // spectate following another player
#define PMF_SCOREBOARD 8192 // spectate as a scoreboard
#define PMF_INVULEXPAND 16384 // invulnerability sphere set to full size
-#define PMF_CHARGE_POUNCE 32768 //TA: keep track of pouncing
+#define PMF_CHARGE 32768 //TA: keep track of pouncing
#define PMF_ALL_TIMES (PMF_TIME_WATERJUMP|PMF_TIME_LAND|PMF_TIME_KNOCKBACK)
@@ -231,8 +230,6 @@ typedef enum
#define SS_BOOSTED 0x00000200
#define SS_SLOWLOCKED 0x00000400
#define SS_POISONCLOUDED 0x00000800
-#define SS_KNOCKEDOVER 0x00001000
-#define SS_GETTINGUP 0x00002000
#define SB_VALID_TOGGLEBIT 0x00004000
@@ -321,7 +318,7 @@ typedef enum
WP_POUNCE_UPG,
WP_AREA_ZAP,
WP_DIRECT_ZAP,
- WP_GROUND_POUND,
+ WP_CHARGE,
WP_BLASTER,
WP_MACHINEGUN,
@@ -801,7 +798,7 @@ typedef enum
MOD_TRIGGER_HURT,
MOD_ABUILDER_CLAW,
- MOD_VENOM,
+ MOD_SOLDIER_BITE,
MOD_HYDRA_CLAW,
MOD_HYDRA_PCLOUD,
MOD_DRAGOON_CLAW,
@@ -809,6 +806,7 @@ typedef enum
MOD_CHIMERA_CLAW,
MOD_CHIMERA_ZAP,
MOD_BMOFO_CLAW,
+ MOD_BMOFO_CHARGE,
MOD_SLOWBLOB,
MOD_POISON,
@@ -898,7 +896,8 @@ typedef struct
float bob;
int steptime;
float speed;
- float sticky;
+ float acceleration;
+ float friction;
int children[ 3 ];
int timeToEvolve;
@@ -1083,7 +1082,8 @@ int BG_FindRegenRateForClass( int pclass );
int BG_FindFovForClass( int pclass );
float BG_FindBobForClass( int pclass );
float BG_FindSpeedForClass( int pclass );
-float BG_FindStickyForClass( int pclass );
+float BG_FindAcclerationForClass( int pclass );
+float BG_FindFrictionForClass( int pclass );
int BG_FindSteptimeForClass( int pclass );
qboolean BG_ClassHasAbility( int pclass, int ability );
weapon_t BG_FindStartWeaponForClass( int pclass );
diff --git a/src/game/g_active.c b/src/game/g_active.c
index 35fa4c1f..6d296b5a 100644
--- a/src/game/g_active.c
+++ b/src/game/g_active.c
@@ -213,6 +213,12 @@ void ClientImpacts( gentity_t *ent, pmove_t *pm )
if( ( ent->r.svFlags & SVF_BOT ) && ( ent->touch ) )
ent->touch( ent, other, &trace );
+ //charge attack
+ if( ent->client->ps.weapon == WP_CHARGE &&
+ ent->client->ps.stats[ STAT_MISC ] > 0 &&
+ ent->client->charging )
+ ChargeAttack( ent, other );
+
if( !other->touch )
continue;
@@ -484,25 +490,37 @@ void ClientTimerActions( gentity_t *ent, int msec )
client->ps.stats[ STAT_MISC ] = DRAGOON_POUNCE_SPEED;
}
- //client is charging up for a charge
- if( client->ps.weapon == WP_GROUND_POUND )
+ //client is charging up for a... charge
+ if( client->ps.weapon == WP_CHARGE )
{
- if( client->ps.stats[ STAT_MISC ] < BMOFO_CHARGE_SPEED && ucmd->buttons & BUTTON_ATTACK2 )
+ if( client->ps.stats[ STAT_MISC ] < BMOFO_CHARGE_TIME && ucmd->buttons & BUTTON_ATTACK2 )
{
- client->ps.stats[ STAT_MISC ] += ( 100.0f / (float)BMOFO_CHARGE_TIME ) * BMOFO_CHARGE_SPEED;
- client->allowedToCharge = qtrue;
+ client->charging = qfalse; //should already be off, just making sure
+
+ client->ps.stats[ STAT_MISC ] += 100;
+
+ if( client->ps.stats[ STAT_MISC ] > BMOFO_CHARGE_TIME )
+ client->ps.stats[ STAT_MISC ] = BMOFO_CHARGE_TIME;
}
if( !( ucmd->buttons & BUTTON_ATTACK2 ) )
{
if( client->ps.stats[ STAT_MISC ] > 0 )
- client->chargePayload = client->ps.stats[ STAT_MISC ];
+ {
+ client->ps.stats[ STAT_MISC ] -= 100;
+ client->charging = qtrue;
- client->ps.stats[ STAT_MISC ] = 0;
+ //if the charger has stopped moving take a chunk of charge away
+ if( VectorLength( client->ps.velocity ) < 64.0f )
+ client->ps.stats[ STAT_MISC ] = client->ps.stats[ STAT_MISC ] >> 1;
+ }
+
+ if( client->ps.stats[ STAT_MISC ] <= 0 )
+ {
+ client->ps.stats[ STAT_MISC ] = 0;
+ client->charging = qfalse;
+ }
}
-
- if( client->ps.stats[ STAT_MISC ] > BMOFO_CHARGE_SPEED )
- client->ps.stats[ STAT_MISC ] = BMOFO_CHARGE_SPEED;
}
//client is charging up an lcannon
@@ -866,9 +884,6 @@ void ClientThink_real( gentity_t *ent )
else if( client->ps.stats[ STAT_STATE ] & SS_BLOBLOCKED ||
client->ps.stats[ STAT_STATE ] & SS_GRABBED )
client->ps.pm_type = PM_GRABBED;
- else if( client->ps.stats[ STAT_STATE ] & SS_GETTINGUP ||
- client->ps.stats[ STAT_STATE ] & SS_KNOCKEDOVER )
- client->ps.pm_type = PM_KNOCKED;
else
client->ps.pm_type = PM_NORMAL;
@@ -893,29 +908,6 @@ void ClientThink_real( gentity_t *ent )
if( client->ps.stats[ STAT_STATE ] & SS_POISONCLOUDED &&
client->lastPoisonCloudedTime + HYDRA_PCLOUD_TIME < level.time )
client->ps.stats[ STAT_STATE ] &= ~SS_POISONCLOUDED;
-
- if( client->ps.stats[ STAT_STATE ] & SS_KNOCKEDOVER &&
- client->lastKnockedOverTime + BMOFO_KOVER_TIME < level.time &&
- ucmd->upmove > 0 )
- {
- client->lastGetUpTime = level.time;
- G_AddPredictableEvent( ent, EV_GETUP, 0 );
- client->ps.stats[ STAT_STATE ] &= ~SS_KNOCKEDOVER;
- client->ps.stats[ STAT_STATE ] |= SS_GETTINGUP;
-
- //FIXME: getup animation
- client->ps.legsAnim =
- ( ( client->ps.legsAnim & ANIM_TOGGLEBIT ) ^ ANIM_TOGGLEBIT ) | BOTH_DEATH2;
- client->ps.torsoAnim =
- ( ( client->ps.torsoAnim & ANIM_TOGGLEBIT ) ^ ANIM_TOGGLEBIT ) | BOTH_DEATH2;
- }
-
- if( client->ps.stats[ STAT_STATE ] & SS_GETTINGUP &&
- client->lastGetUpTime + BMOFO_GETUP_TIME < level.time )
- {
- client->ps.stats[ STAT_STATE ] &= ~SS_GETTINGUP;
- VectorCopy( ent->client->ps.grapplePoint, ent->client->ps.viewangles );
- }
client->ps.gravity = g_gravity.value;
@@ -949,7 +941,7 @@ void ClientThink_real( gentity_t *ent )
// set up for pmove
oldEventSequence = client->ps.eventSequence;
- memset (&pm, 0, sizeof(pm));
+ memset( &pm, 0, sizeof( pm ) );
if( !( ucmd->buttons & BUTTON_TALK ) ) //&& client->ps.weaponTime <= 0 ) //TA: erk more server load
{
@@ -971,11 +963,6 @@ void ClientThink_real( gentity_t *ent )
pm.autoWeaponHit[ client->ps.weapon ] = CheckPounceAttack( ent );
break;
- case WP_GROUND_POUND:
- if( client->ps.weaponTime <= 0 )
- pm.autoWeaponHit[ client->ps.weapon ] = CheckChargeAttack( ent );
- break;
-
default:
break;
}
diff --git a/src/game/g_combat.c b/src/game/g_combat.c
index d60bb4b7..579cec2f 100644
--- a/src/game/g_combat.c
+++ b/src/game/g_combat.c
@@ -291,7 +291,7 @@ void player_die( gentity_t *self, gentity_t *inflictor, gentity_t *attacker, int
self->takedamage = qtrue; // can still be gibbed
self->s.weapon = WP_NONE;
- self->s.powerups = 0;
+ /*self->s.powerups = 0;*/ //TA: class is encoded into powers in trem
self->r.contents = CONTENTS_BODY;
//self->r.contents = CONTENTS_CORPSE;
@@ -304,7 +304,7 @@ void player_die( gentity_t *self, gentity_t *inflictor, gentity_t *attacker, int
self->s.loopSound = 0;
- self->r.maxs[2] = -8;
+ self->r.maxs[ 2 ] = -8;
// don't allow respawn until the death anim is done
// g_forcerespawn may force spawning at some later time
@@ -847,7 +847,7 @@ void G_Damage( gentity_t *targ, gentity_t *inflictor, gentity_t *attacker,
if( !dir )
dflags |= DAMAGE_NO_KNOCKBACK;
else
- VectorNormalize(dir);
+ VectorNormalize( dir );
knockback = damage;
if( knockback > 200 )
diff --git a/src/game/g_local.h b/src/game/g_local.h
index dcfbf4be..165b9c90 100644
--- a/src/game/g_local.h
+++ b/src/game/g_local.h
@@ -151,6 +151,7 @@ struct gentity_s
int splashRadius;
int methodOfDeath;
int splashMethodOfDeath;
+ int chargeRepeat;
int count;
@@ -353,15 +354,12 @@ struct gclient_s
int lastLockTime;
int lastSlowTime;
int lastBoostedTime;
- int lastKnockedOverTime;
- int lastGetUpTime;
int lastCreepSlowTime; //TA: time until creep can be removed
int pouncePayload; //TA: amount of damage pounce attack will do
qboolean allowedToPounce;
- int chargePayload; //TA: amount of damage charge attack will do
- qboolean allowedToCharge;
+ qboolean charging;
vec3_t hovelOrigin; //TA: player origin before entering hovel
@@ -662,7 +660,7 @@ void SnapVectorTowards( vec3_t v, vec3_t to );
qboolean CheckVenomAttack( gentity_t *ent );
void CheckGrabAttack( gentity_t *ent );
qboolean CheckPounceAttack( gentity_t *ent );
-qboolean CheckChargeAttack( gentity_t *ent );
+void ChargeAttack( gentity_t *ent, gentity_t *victim );
//
diff --git a/src/game/g_weapon.c b/src/game/g_weapon.c
index 71d1b4c5..a7809263 100644
--- a/src/game/g_weapon.c
+++ b/src/game/g_weapon.c
@@ -541,7 +541,8 @@ qboolean CheckVenomAttack( gentity_t *ent )
VectorMA( muzzle, SOLDIER_BITE_RANGE, forward, end );
- trap_Trace (&tr, muzzle, NULL, NULL, end, ent->s.number, MASK_SHOT);
+ trap_Trace( &tr, muzzle, NULL, NULL, end, ent->s.number, MASK_SHOT );
+
if ( tr.surfaceFlags & SURF_NOIMPACT )
return qfalse;
@@ -565,7 +566,7 @@ qboolean CheckVenomAttack( gentity_t *ent )
tent->s.weapon = ent->s.weapon;
}
- G_Damage( traceEnt, ent, ent, forward, tr.endpos, SOLDIER_BITE_DMG, DAMAGE_NO_KNOCKBACK, MOD_VENOM );
+ G_Damage( traceEnt, ent, ent, forward, tr.endpos, SOLDIER_BITE_DMG, DAMAGE_NO_KNOCKBACK, MOD_SOLDIER_BITE );
return qtrue;
}
@@ -875,67 +876,45 @@ void directZapFire( gentity_t *ent )
/*
======================================================================
-GROUND POUND
+CHARGE
======================================================================
*/
/*
===============
-CheckChargeAttack
+ChargeAttack
===============
*/
-qboolean CheckChargeAttack( gentity_t *ent )
+void ChargeAttack( gentity_t *ent, gentity_t *victim )
{
- //FIXME
- trace_t tr;
- vec3_t end;
gentity_t *tent;
- gentity_t *traceEnt;
- int damage;
-
- if( !ent->client->allowedToCharge )
- return qfalse;
-
- // set aiming directions
- AngleVectors( ent->client->ps.viewangles, forward, right, up );
-
- CalcMuzzlePoint( ent, forward, right, up, muzzle );
-
- VectorMA( muzzle, BMOFO_CHARGE_RANGE, forward, end );
-
- trap_Trace( &tr, muzzle, NULL, NULL, end, ent->s.number, MASK_SHOT );
-
- //miss
- if( tr.fraction >= 1.0 )
- return qfalse;
-
- if( tr.surfaceFlags & SURF_NOIMPACT )
- return qfalse;
-
- traceEnt = &g_entities[ tr.entityNum ];
+ int damage;
+ vec3_t forward, normal;
+
+ if( level.time < victim->chargeRepeat )
+ return;
- // send blood impact
- if( traceEnt->takedamage && traceEnt->client )
+ victim->chargeRepeat = level.time + BMOFO_CHARGE_REPEAT;
+
+ VectorSubtract( victim->s.origin, ent->s.origin, forward );
+ VectorNormalize( forward );
+ VectorNegate( forward, normal );
+
+ if( victim->client )
{
- tent = G_TempEntity( tr.endpos, EV_MISSILE_HIT );
- tent->s.otherEntityNum = traceEnt->s.number;
- tent->s.eventParm = DirToByte( tr.plane.normal );
+ tent = G_TempEntity( victim->s.origin, EV_MISSILE_HIT );
+ tent->s.otherEntityNum = victim->s.number;
+ tent->s.eventParm = DirToByte( normal );
tent->s.weapon = ent->s.weapon;
}
- if( !traceEnt->takedamage )
- return qfalse;
-
- damage = (int)( ( (float)ent->client->chargePayload / (float)BMOFO_CHARGE_SPEED ) * BMOFO_CHARGE_DMG );
-
- G_Damage( traceEnt, ent, ent, forward, tr.endpos, damage, DAMAGE_NO_KNOCKBACK, MOD_VENOM );
-
- ent->client->allowedToCharge = qfalse;
+ if( !victim->takedamage )
+ return;
- G_Printf( "charge!\n" );
+ damage = (int)( ( (float)ent->client->ps.stats[ STAT_MISC ] / (float)BMOFO_CHARGE_TIME ) * BMOFO_CHARGE_DMG );
- return qtrue;
+ G_Damage( victim, ent, ent, forward, victim->s.origin, damage, 0, MOD_BMOFO_CHARGE );
}
//======================================================================
@@ -985,9 +964,6 @@ void FireWeapon3( gentity_t *ent )
case WP_DIRECT_ZAP:
areaZapFire( ent );
break;
- case WP_GROUND_POUND:
- slowBlobFire( ent );
- break;
default:
break;
@@ -1077,7 +1053,7 @@ void FireWeapon( gentity_t *ent )
case WP_DIRECT_ZAP:
meleeAttack( ent, CHIMERA_CLAW_RANGE, CHIMERA_CLAW_DMG, MOD_CHIMERA_CLAW );
break;
- case WP_GROUND_POUND:
+ case WP_CHARGE:
meleeAttack( ent, BMOFO_CLAW_RANGE, BMOFO_CLAW_DMG, MOD_BMOFO_CLAW );
break;
diff --git a/src/game/tremulous.h b/src/game/tremulous.h
index 47857a97..4bac0e4e 100644
--- a/src/game/tremulous.h
+++ b/src/game/tremulous.h
@@ -76,17 +76,12 @@
#define BMOFO_CLAW_DMG ADM(150)
#define BMOFO_CLAW_RANGE 128.0f
#define BMOFO_CLAW_REPEAT 750
-#define BMOFO_KNOCK_RANGE 200.0f
-#define BMOFO_KNOCK_REPEAT 15000
-#define BMOFO_KOVER_TIME 2000
-#define BMOFO_GETUP_TIME 1000
#define BMOFO_REGEN_RANGE 200.0f
#define BMOFO_REGEN_MOD 2.0f
-
-#define BMOFO_CHARGE_SPEED 5000
+#define BMOFO_CHARGE_SPEED 2.0f
#define BMOFO_CHARGE_TIME 2000
-#define BMOFO_CHARGE_RANGE 48.0f
-#define BMOFO_CHARGE_DMG ADM(300)
+#define BMOFO_CHARGE_REPEAT 500
+#define BMOFO_CHARGE_DMG ADM(200)