diff options
-rw-r--r-- | src/game/bg_pmove.c | 75 | ||||
-rw-r--r-- | src/game/tremulous.h | 13 |
2 files changed, 55 insertions, 33 deletions
diff --git a/src/game/bg_pmove.c b/src/game/bg_pmove.c index 402959d0..81563829 100644 --- a/src/game/bg_pmove.c +++ b/src/game/bg_pmove.c @@ -596,10 +596,14 @@ PM_CheckWallJump static qboolean PM_CheckWallJump( void ) { trace_t trace; - vec3_t point, dir, forward, right; - float magnitude; + vec3_t mins, point, dir; + float magnitude, towardSurf; int i; qboolean minijump; + + // Has to be able to walljump + if( !BG_ClassHasAbility( pm->ps->stats[ STAT_PCLASS ], SCA_WALLJUMPER ) ) + return qfalse; // Don't allow jump until all buttons are up if( pm->ps->pm_flags & PMF_RESPAWNED ) @@ -623,39 +627,35 @@ static qboolean PM_CheckWallJump( void ) return qfalse; } - ProjectPointOnPlane( forward, pml.forward, pm->ps->grapplePoint ); - ProjectPointOnPlane( right, pml.right, pm->ps->grapplePoint ); + // We don't want to hit the floor so adjust the mins + VectorCopy( pm->mins, mins ); + mins[ 2 ] += STEPSIZE; // Trace to find a suitable wall for( i = 0; ; i++) { + VectorCopy( pm->ps->origin, point ); + switch( i ) { - // Forward case 0: - VectorMA( pm->ps->origin, 0.25f, forward, point ); + point[ 0 ] += LEVEL2_WALLJUMP_RANGE; // +x break; - - // Right case 1: - VectorMA( pm->ps->origin, 0.25f, right, point ); + point[ 0 ] -= LEVEL2_WALLJUMP_RANGE; // -x break; - - // Left case 2: - VectorMA( pm->ps->origin, -0.25f, right, point ); + point[ 1 ] += LEVEL2_WALLJUMP_RANGE; // +y break; - - // Back case 3: - VectorMA( pm->ps->origin, -0.25f, forward, point ); + point[ 1 ] -= LEVEL2_WALLJUMP_RANGE; // -y break; // Give up default: return qfalse; } - pm->trace( &trace, pm->ps->origin, pm->mins, pm->maxs, point, + pm->trace( &trace, pm->ps->origin, mins, pm->maxs, point, pm->ps->clientNum, pm->tracemask ); if( trace.fraction < 1.0f && !( trace.surfaceFlags & ( SURF_SKY | SURF_SLICK ) ) ) @@ -671,19 +671,37 @@ static qboolean PM_CheckWallJump( void ) pm->ps->pm_time = LEVEL2_WALLJUMP_REPEAT; pm->ps->groundEntityNum = ENTITYNUM_NONE; - ProjectPointOnPlane( forward, pml.forward, pm->ps->grapplePoint ); - - // Add all the jump components - VectorScale( pm->ps->grapplePoint, LEVEL2_WALLJUMP_NORMAL, dir ); - VectorMA( dir, LEVEL2_WALLJUMP_FORWARD, forward, dir ); - dir[ 2 ] += LEVEL2_WALLJUMP_UP; - - // Give the player some velocity + // Jump magnitude is modulated for minijumps magnitude = BG_FindJumpMagnitudeForClass( pm->ps->stats[ STAT_PCLASS ] ); if( minijump ) magnitude *= ALIEN_MINI_JUMP_SCALE; - VectorMA( pm->ps->velocity, magnitude, dir, pm->ps->velocity ); + // Remove the velocity component toward the surface + towardSurf = -DotProduct( pm->ps->velocity, pm->ps->grapplePoint ); + if( towardSurf <= 0 ) + towardSurf = 0; + VectorMA( pm->ps->velocity, towardSurf, pm->ps->grapplePoint, + pm->ps->velocity ); + + // Compute horizontal view component, subtracting normal + VectorScale( pml.forward, LEVEL2_WALLJUMP_FORWARD, dir ); + dir[ 2 ] += LEVEL2_WALLJUMP_UP; + towardSurf = -DotProduct( dir, pm->ps->grapplePoint ); + if( towardSurf > 0 ) + VectorMA( dir, towardSurf, pm->ps->grapplePoint, dir ); + + // Add normal component and normalize + VectorMA( dir, LEVEL2_WALLJUMP_NORMAL, pm->ps->grapplePoint, dir ); + VectorNormalize( dir ); + + // Apply jump impulse to velocity + VectorMA( pm->ps->velocity, magnitude, dir, pm->ps->velocity ); + + if( pm->debugLevel ) + Com_Printf( "%i: walljump velocity { %f, %f, %f }\n", c_pmove, + pm->ps->velocity[ 0 ], pm->ps->velocity[ 1 ], + pm->ps->velocity[ 2 ] ); + // Cap velocity if( VectorLength( pm->ps->velocity ) > LEVEL2_WALLJUMP_MAXSPEED ) { @@ -726,6 +744,10 @@ static qboolean PM_CheckJump( void ) vec3_t normal; float magnitude; qboolean minijump; + + // Can't jump in the air + if( pm->ps->groundEntityNum == ENTITYNUM_NONE ) + return qfalse; // Don't rejump after a dodge or jump if( pm->ps->pm_flags & PMF_TIME_LAND ) @@ -1173,6 +1195,7 @@ static void PM_AirMove( void ) float scale; usercmd_t cmd; + PM_CheckWallJump( ); PM_Friction( ); fmove = pm->cmd.forwardmove; @@ -2256,8 +2279,6 @@ static void PM_GroundTrace( void ) PM_GroundTraceMissed( ); pml.groundPlane = qfalse; pml.walking = qfalse; - - PM_CheckWallJump( ); return; } } diff --git a/src/game/tremulous.h b/src/game/tremulous.h index 40e2c933..250922d5 100644 --- a/src/game/tremulous.h +++ b/src/game/tremulous.h @@ -83,10 +83,11 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #define LEVEL2_AREAZAP_REPEAT 500 #define LEVEL2_AREAZAP_MAX_TARGETS 3 #define LEVEL2_WALLJUMP_MAXSPEED 1000.0f -#define LEVEL2_WALLJUMP_NORMAL 0.3f // magnitude scale from surface -#define LEVEL2_WALLJUMP_FORWARD 0.4f // magnitude scale in view direction -#define LEVEL2_WALLJUMP_UP 0.3f // magnitude scale up -#define LEVEL2_WALLJUMP_REPEAT 200 // msec before new jump +#define LEVEL2_WALLJUMP_NORMAL 1.0f // magnitude scale from surface +#define LEVEL2_WALLJUMP_FORWARD 1.5f // magnitude scale in view direction +#define LEVEL2_WALLJUMP_UP 0.0f // magnitude scale up +#define LEVEL2_WALLJUMP_REPEAT 400 // msec before new jump +#define LEVEL2_WALLJUMP_RANGE 8.0f // how far away the wall can be #define LEVEL3_CLAW_DMG ADM(80) #define LEVEL3_CLAW_UPG_RANGE 96.0f @@ -169,13 +170,13 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #define LEVEL1_SPEED 1.25f #define LEVEL1_VALUE AVM(225) -#define LEVEL1_HEALTH AHM(75) +#define LEVEL1_HEALTH AHM(60) #define LEVEL1_REGEN 2 #define LEVEL1_COST 1 #define LEVEL1_UPG_SPEED 1.25f #define LEVEL1_UPG_VALUE AVM(275) -#define LEVEL1_UPG_HEALTH AHM(100) +#define LEVEL1_UPG_HEALTH AHM(80) #define LEVEL1_UPG_REGEN 3 #define LEVEL1_UPG_COST 1 |