diff options
author | Ben Millwood <thebenmachine@gmail.com> | 2009-10-03 12:22:28 +0000 |
---|---|---|
committer | Tim Angus <tim@ngus.net> | 2013-01-03 00:15:53 +0000 |
commit | 132f766b85c17ec4ad1d9f4ce77c8d20383c02e9 (patch) | |
tree | c4b95709a0db80da721ea66fc768aecc677e7b1d /src/game | |
parent | 7617d5cf6ce96f992d31ae763c470a6387c4be21 (diff) |
Smooth regeneration
A regen rate of 4 hp/s now means you regenerate one health point every
quarter of a second (fixes #28)
Diffstat (limited to 'src/game')
-rw-r--r-- | src/game/g_active.c | 156 | ||||
-rw-r--r-- | src/game/g_buildable.c | 2 | ||||
-rw-r--r-- | src/game/g_client.c | 1 | ||||
-rw-r--r-- | src/game/g_combat.c | 1 | ||||
-rw-r--r-- | src/game/g_local.h | 2 | ||||
-rw-r--r-- | src/game/tremulous.h | 4 |
6 files changed, 79 insertions, 87 deletions
diff --git a/src/game/g_active.c b/src/game/g_active.c index 68939ce6..b00bbc97 100644 --- a/src/game/g_active.c +++ b/src/game/g_active.c @@ -720,88 +720,6 @@ void ClientTimerActions( gentity_t *ent, int msec ) 0, damage, 0, MOD_POISON ); } - //replenish alien health - if( client->ps.stats[ STAT_TEAM ] == TEAM_ALIENS && - level.surrenderTeam != TEAM_ALIENS ) - { - int entityList[ MAX_GENTITIES ]; - vec3_t range = { LEVEL4_REGEN_RANGE, LEVEL4_REGEN_RANGE, LEVEL4_REGEN_RANGE }; - vec3_t mins, maxs; - int i, num; - gentity_t *boostEntity; - float modifier = 1.0f, new_modifier; - qboolean creep; - - VectorAdd( client->ps.origin, range, maxs ); - VectorSubtract( client->ps.origin, range, mins ); - - num = trap_EntitiesInBox( mins, maxs, entityList, MAX_GENTITIES ); - for( i = 0; i < num; i++ ) - { - boostEntity = &g_entities[ entityList[ i ] ]; - - new_modifier = 0.0f; - if( boostEntity->s.eType == ET_BUILDABLE && - boostEntity->s.modelindex == BA_A_BOOSTER && - boostEntity->spawned && boostEntity->health > 0 && - G_FindOvermind( boostEntity ) ) - new_modifier = BOOSTER_REGEN_MOD; - else if( boostEntity->client && boostEntity->health > 0 && - boostEntity->client->pers.teamSelection == TEAM_ALIENS ) - { - if( boostEntity->client->pers.classSelection == PCL_ALIEN_LEVEL1_UPG ) - new_modifier = LEVEL1_UPG_REGEN_MOD; - else if( boostEntity->client->pers.classSelection == PCL_ALIEN_LEVEL1 ) - new_modifier = LEVEL1_REGEN_MOD; - } - if( new_modifier > modifier ) - modifier = new_modifier; - } - - creep = G_FindCreep( ent ); - - // Transmit heal rate to the client so the HUD can display it properly - client->ps.stats[ STAT_STATE ] &= ~( SS_HEALING_2X | SS_HEALING_3X ); - if( modifier >= 3.0f ) - client->ps.stats[ STAT_STATE ] |= SS_HEALING_3X; - else if( modifier >= 2.0f ) - client->ps.stats[ STAT_STATE ] |= SS_HEALING_2X; - if( creep || modifier != 1.0f ) - client->ps.stats[ STAT_STATE ] |= SS_HEALING_ACTIVE; - else - client->ps.stats[ STAT_STATE ] &= ~SS_HEALING_ACTIVE; - - if( ent->health > 0 && - ent->health < client->ps.stats[ STAT_MAX_HEALTH ] && - ( ent->lastDamageTime + ALIEN_REGEN_DAMAGE_TIME ) < level.time ) - { - if( modifier == 1.0f && !creep ) - { - if( ( ent->lastRegenTime + ALIEN_REGEN_NOCREEP_TIME ) < level.time ) - { - ent->health += - BG_Class( client->ps.stats[ STAT_CLASS ] )->regenRate; - ent->lastRegenTime = level.time; - } - } - else - { - ent->health += modifier * - BG_Class( client->ps.stats[ STAT_CLASS ] )->regenRate; - ent->lastRegenTime = level.time; - } - } - - if( ent->health >= client->ps.stats[ STAT_MAX_HEALTH ] ) - { - int i; - ent->health = client->ps.stats[ STAT_MAX_HEALTH ]; - for( i = 0; i < MAX_CLIENTS; i++ ) - ent->credits[ i ] = 0; - } - - } - // turn off life support when a team admits defeat if( client->ps.stats[ STAT_TEAM ] == TEAM_ALIENS && level.surrenderTeam == TEAM_ALIENS ) @@ -1480,6 +1398,80 @@ void ClientThink_real( gentity_t *ent ) } } + // Replenish alien health + while( ent->nextRegenTime < level.time ) + { + int regenRate = BG_Class( ent->client->ps.stats[ STAT_CLASS ] )->regenRate; + + if( ent->nextRegenTime < 0 || regenRate == 0 ) + { + ent->nextRegenTime = -1; + break; // no regen + } + + if( level.surrenderTeam != ent->client->pers.teamSelection ) + { + int entityList[ MAX_GENTITIES ]; + int i, num; + vec3_t range, mins, maxs; + float modifier = 1.0f; + + VectorSet( range, REGEN_BOOST_RANGE, REGEN_BOOST_RANGE, + REGEN_BOOST_RANGE ); + VectorAdd( ent->client->ps.origin, range, maxs ); + VectorSubtract( ent->client->ps.origin, range, mins ); + + num = trap_EntitiesInBox( mins, maxs, entityList, MAX_GENTITIES ); + for( i = 0; i < num; i++ ) + { + gentity_t *boost = &g_entities[ entityList[ i ] ]; + + if( modifier < BOOSTER_REGEN_MOD && boost->s.eType == ET_BUILDABLE && + boost->s.modelindex == BA_A_BOOSTER && boost->spawned && + boost->health > 0 && level.overmindPresent ) + { + modifier = BOOSTER_REGEN_MOD; + continue; + } + + if( boost->s.eType == ET_PLAYER && boost->client && + boost->client->pers.teamSelection == + ent->client->pers.teamSelection && boost->health > 0 ) + { + class_t class = boost->client->ps.stats[ STAT_CLASS ]; + if( class == PCL_ALIEN_LEVEL1 && modifier < LEVEL1_REGEN_MOD ) + modifier = LEVEL1_REGEN_MOD; + else if( class == PCL_ALIEN_LEVEL1_UPG && + modifier < LEVEL1_UPG_REGEN_MOD ) + modifier = LEVEL1_UPG_REGEN_MOD; + } + } + + // Transmit heal rate to the client so it can be displayed on the HUD + ent->client->ps.stats[ STAT_STATE ] |= SS_HEALING_ACTIVE; + ent->client->ps.stats[ STAT_STATE ] &= ~( SS_HEALING_2X | SS_HEALING_3X ); + if( modifier == 1.0f && !G_FindCreep( ent ) ) + { + ent->client->ps.stats[ STAT_STATE ] &= ~SS_HEALING_ACTIVE; + modifier /= 3.0f; + } + else if( modifier >= 3.0f ) + ent->client->ps.stats[ STAT_STATE ] |= SS_HEALING_3X; + else if( modifier >= 2.0f ) + ent->client->ps.stats[ STAT_STATE ] |= SS_HEALING_2X; + + ent->health += 1; + // if at max health, clear damage counters + if( ent->health >= ent->client->ps.stats[ STAT_MAX_HEALTH ] ) + { + ent->health = ent->client->ps.stats[ STAT_MAX_HEALTH ]; + for( i = 0; i < MAX_CLIENTS; i++ ) + ent->credits[ i ] = 0; + } + ent->nextRegenTime += 1000 / ( regenRate * modifier ); + } + } + if( BG_InventoryContainsUpgrade( UP_GRENADE, client->ps.stats ) && BG_UpgradeIsActive( UP_GRENADE, client->ps.stats ) ) { diff --git a/src/game/g_buildable.c b/src/game/g_buildable.c index 5580bd88..af3ee8ec 100644 --- a/src/game/g_buildable.c +++ b/src/game/g_buildable.c @@ -2389,8 +2389,6 @@ void G_QueueBuildPoints( gentity_t *self ) { gentity_t *killer = NULL; - G_Printf( "G_QueueBuildPoints( %s )\n", BG_TeamName( self->buildableTeam ) ); - if( self->killedBy != ENTITYNUM_NONE ) killer = &g_entities[ self->killedBy ]; diff --git a/src/game/g_client.c b/src/game/g_client.c index 8b9beb5d..10445e5e 100644 --- a/src/game/g_client.c +++ b/src/game/g_client.c @@ -1581,6 +1581,7 @@ void ClientSpawn( gentity_t *ent, gentity_t *spawn, vec3_t origin, vec3_t angles client->respawnTime = level.time; client->lastKillTime = level.time; + ent->nextRegenTime = level.time; client->inactivityTime = level.time + g_inactivity.integer * 1000; client->latched_buttons = 0; diff --git a/src/game/g_combat.c b/src/game/g_combat.c index 5cb879f1..753ff673 100644 --- a/src/game/g_combat.c +++ b/src/game/g_combat.c @@ -1125,6 +1125,7 @@ void G_Damage( gentity_t *targ, gentity_t *inflictor, gentity_t *attacker, targ->client->ps.stats[ STAT_HEALTH ] = targ->health; targ->lastDamageTime = level.time; + targ->nextRegenTime = level.time + ALIEN_REGEN_DAMAGE_TIME; // add to the attackers "account" on the target if( attacker->client && attacker != targ && !OnSameTeam( targ, attacker ) ) diff --git a/src/game/g_local.h b/src/game/g_local.h index 8720c91c..d74982c5 100644 --- a/src/game/g_local.h +++ b/src/game/g_local.h @@ -242,7 +242,7 @@ struct gentity_s int suicideTime; // when the client will suicide int lastDamageTime; - int lastRegenTime; + int nextRegenTime; qboolean zapping; // adv maurader is zapping qboolean wasZapping; // adv maurader was zapping diff --git a/src/game/tremulous.h b/src/game/tremulous.h index dced83e5..7aac077c 100644 --- a/src/game/tremulous.h +++ b/src/game/tremulous.h @@ -115,7 +115,6 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #define LEVEL4_CLAW_HEIGHT 20.0f #define LEVEL4_CLAW_REPEAT 750 #define LEVEL4_CLAW_K_SCALE 1.0f -#define LEVEL4_REGEN_RANGE 200.0f #define LEVEL4_TRAMPLE_DMG ADM(111) #define LEVEL4_TRAMPLE_SPEED 2.0f @@ -338,6 +337,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #define ALIENSENSE_RANGE 1000.0f +#define REGEN_BOOST_RANGE 200.0f #define ALIEN_POISON_TIME 10000 #define ALIEN_POISON_DMG 5 @@ -345,7 +345,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #define ALIEN_SPAWN_REPEAT_TIME 10000 -#define ALIEN_REGEN_DAMAGE_TIME 2000 //msec since damage that regen starts again +#define ALIEN_REGEN_DAMAGE_TIME 1500 //msec since damage that regen starts again #define ALIEN_REGEN_NOCREEP_TIME 3000 //msec between regen off creep #define ALIEN_MAX_FRAGS 9 |