summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/game/bg_misc.c26
-rw-r--r--src/game/bg_public.h2
-rw-r--r--src/game/g_active.c52
-rw-r--r--src/game/tremulous.h24
4 files changed, 51 insertions, 53 deletions
diff --git a/src/game/bg_misc.c b/src/game/bg_misc.c
index 567bb8c7..8ce10291 100644
--- a/src/game/bg_misc.c
+++ b/src/game/bg_misc.c
@@ -892,7 +892,7 @@ static const classAttributes_t bg_classList[ ] =
( 1 << S1 )|( 1 << S2 )|( 1 << S3 ), //int stages
0, //int health;
0.0f, //float fallDamage;
- 0, //int regenRate;
+ 0.0f, //float regenRate;
0, //int abilities;
WP_NONE, //weapon_t startWeapon
0.0f, //float buildDist;
@@ -919,7 +919,7 @@ static const classAttributes_t bg_classList[ ] =
( 1 << S1 )|( 1 << S2 )|( 1 << S3 ), //int stages
ABUILDER_HEALTH, //int health;
0.2f, //float fallDamage;
- ABUILDER_REGEN, //int regenRate;
+ ABUILDER_REGEN, //float regenRate;
SCA_TAKESFALLDAMAGE|SCA_FOVWARPS|SCA_ALIENSENSE,//int abilities;
WP_ABUILD, //weapon_t startWeapon
95.0f, //float buildDist;
@@ -947,7 +947,7 @@ static const classAttributes_t bg_classList[ ] =
( 1 << S2 )|( 1 << S3 ), //int stages
ABUILDER_UPG_HEALTH, //int health;
0.2f, //float fallDamage;
- ABUILDER_UPG_REGEN, //int regenRate;
+ ABUILDER_UPG_REGEN, //float regenRate;
SCA_TAKESFALLDAMAGE|SCA_FOVWARPS|SCA_WALLCLIMBER|SCA_ALIENSENSE, //int abilities;
WP_ABUILD2, //weapon_t startWeapon
105.0f, //float buildDist;
@@ -974,7 +974,7 @@ static const classAttributes_t bg_classList[ ] =
( 1 << S1 )|( 1 << S2 )|( 1 << S3 ), //int stages
LEVEL0_HEALTH, //int health;
0.0f, //float fallDamage;
- LEVEL0_REGEN, //int regenRate;
+ LEVEL0_REGEN, //float regenRate;
SCA_WALLCLIMBER|SCA_FOVWARPS|SCA_ALIENSENSE, //int abilities;
WP_ALEVEL0, //weapon_t startWeapon
0.0f, //float buildDist;
@@ -1003,7 +1003,7 @@ static const classAttributes_t bg_classList[ ] =
( 1 << S1 )|( 1 << S2 )|( 1 << S3 ), //int stages
LEVEL1_HEALTH, //int health;
0.0f, //float fallDamage;
- LEVEL1_REGEN, //int regenRate;
+ LEVEL1_REGEN, //float regenRate;
SCA_FOVWARPS|SCA_WALLCLIMBER|SCA_ALIENSENSE, //int abilities;
WP_ALEVEL1, //weapon_t startWeapon
0.0f, //float buildDist;
@@ -1032,7 +1032,7 @@ static const classAttributes_t bg_classList[ ] =
( 1 << S2 )|( 1 << S3 ), //int stages
LEVEL1_UPG_HEALTH, //int health;
0.0f, //float fallDamage;
- LEVEL1_UPG_REGEN, //int regenRate;
+ LEVEL1_UPG_REGEN, //float regenRate;
SCA_FOVWARPS|SCA_WALLCLIMBER|SCA_ALIENSENSE, //int abilities;
WP_ALEVEL1_UPG, //weapon_t startWeapon
0.0f, //float buildDist;
@@ -1059,7 +1059,7 @@ static const classAttributes_t bg_classList[ ] =
( 1 << S1 )|( 1 << S2 )|( 1 << S3 ), //int stages
LEVEL2_HEALTH, //int health;
0.0f, //float fallDamage;
- LEVEL2_REGEN, //int regenRate;
+ LEVEL2_REGEN, //float regenRate;
SCA_WALLJUMPER|SCA_FOVWARPS|SCA_ALIENSENSE, //int abilities;
WP_ALEVEL2, //weapon_t startWeapon
0.0f, //float buildDist;
@@ -1086,7 +1086,7 @@ static const classAttributes_t bg_classList[ ] =
( 1 << S2 )|( 1 << S3 ), //int stages
LEVEL2_UPG_HEALTH, //int health;
0.0f, //float fallDamage;
- LEVEL2_UPG_REGEN, //int regenRate;
+ LEVEL2_UPG_REGEN, //float regenRate;
SCA_WALLJUMPER|SCA_FOVWARPS|SCA_ALIENSENSE, //int abilities;
WP_ALEVEL2_UPG, //weapon_t startWeapon
0.0f, //float buildDist;
@@ -1114,7 +1114,7 @@ static const classAttributes_t bg_classList[ ] =
( 1 << S1 )|( 1 << S2 )|( 1 << S3 ), //int stages
LEVEL3_HEALTH, //int health;
0.0f, //float fallDamage;
- LEVEL3_REGEN, //int regenRate;
+ LEVEL3_REGEN, //float regenRate;
SCA_FOVWARPS|SCA_ALIENSENSE, //int abilities;
WP_ALEVEL3, //weapon_t startWeapon
0.0f, //float buildDist;
@@ -1142,7 +1142,7 @@ static const classAttributes_t bg_classList[ ] =
( 1 << S2 )|( 1 << S3 ), //int stages
LEVEL3_UPG_HEALTH, //int health;
0.0f, //float fallDamage;
- LEVEL3_UPG_REGEN, //int regenRate;
+ LEVEL3_UPG_REGEN, //float regenRate;
SCA_FOVWARPS|SCA_ALIENSENSE, //int abilities;
WP_ALEVEL3_UPG, //weapon_t startWeapon
0.0f, //float buildDist;
@@ -1171,7 +1171,7 @@ static const classAttributes_t bg_classList[ ] =
( 1 << S3 ), //int stages
LEVEL4_HEALTH, //int health;
0.0f, //float fallDamage;
- LEVEL4_REGEN, //int regenRate;
+ LEVEL4_REGEN, //float regenRate;
SCA_FOVWARPS|SCA_ALIENSENSE, //int abilities;
WP_ALEVEL4, //weapon_t startWeapon
0.0f, //float buildDist;
@@ -1197,7 +1197,7 @@ static const classAttributes_t bg_classList[ ] =
( 1 << S1 )|( 1 << S2 )|( 1 << S3 ), //int stages
100, //int health;
1.0f, //float fallDamage;
- 0, //int regenRate;
+ 0.0f, //float regenRate;
SCA_TAKESFALLDAMAGE|SCA_CANUSELADDERS, //int abilities;
WP_NONE, //special-cased in g_client.c //weapon_t startWeapon
110.0f, //float buildDist;
@@ -1223,7 +1223,7 @@ static const classAttributes_t bg_classList[ ] =
( 1 << S3 ), //int stages
100, //int health;
1.0f, //float fallDamage;
- 0, //int regenRate;
+ 0.0f, //float regenRate;
SCA_TAKESFALLDAMAGE|
SCA_CANUSELADDERS, //int abilities;
WP_NONE, //special-cased in g_client.c //weapon_t startWeapon
diff --git a/src/game/bg_public.h b/src/game/bg_public.h
index a08b8cdd..7f7f576f 100644
--- a/src/game/bg_public.h
+++ b/src/game/bg_public.h
@@ -916,7 +916,7 @@ typedef struct
int health;
float fallDamage;
- int regenRate;
+ float regenRate;
int abilities;
diff --git a/src/game/g_active.c b/src/game/g_active.c
index 2def0e5d..418b89c6 100644
--- a/src/game/g_active.c
+++ b/src/game/g_active.c
@@ -1399,28 +1399,26 @@ void ClientThink_real( gentity_t *ent )
}
// Replenish alien health
- while( ent->nextRegenTime < level.time )
+ if( level.surrenderTeam != client->pers.teamSelection &&
+ ent->nextRegenTime >= 0 && ent->nextRegenTime < level.time )
{
- int regenRate = BG_Class( ent->client->ps.stats[ STAT_CLASS ] )->regenRate;
+ float regenRate =
+ BG_Class( ent->client->ps.stats[ STAT_CLASS ] )->regenRate;
- if( !ent->client || ent->health <= 0 || ent->nextRegenTime < 0 ||
- regenRate == 0 )
- {
- ent->nextRegenTime = -1;
- break; // no regen
- }
-
- if( level.surrenderTeam != ent->client->pers.teamSelection )
+ if( ent->health <= 0 || ent->nextRegenTime < 0 || regenRate == 0 )
+ ent->nextRegenTime = -1; // no regen
+ else
{
int entityList[ MAX_GENTITIES ];
int i, num;
+ int count, interval;
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 );
+ 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++ )
@@ -1449,32 +1447,32 @@ void ClientThink_real( gentity_t *ent )
}
// 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 );
+ client->ps.stats[ STAT_STATE ] |= SS_HEALING_ACTIVE;
+ 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;
+ client->ps.stats[ STAT_STATE ] &= ~SS_HEALING_ACTIVE;
+ modifier *= ALIEN_REGEN_NOCREEP_MOD;
}
else if( modifier >= 3.0f )
- ent->client->ps.stats[ STAT_STATE ] |= SS_HEALING_3X;
+ client->ps.stats[ STAT_STATE ] |= SS_HEALING_3X;
else if( modifier >= 2.0f )
- ent->client->ps.stats[ STAT_STATE ] |= SS_HEALING_2X;
+ client->ps.stats[ STAT_STATE ] |= SS_HEALING_2X;
+
+ interval = 1000 / ( regenRate * modifier );
+ // if recovery interval is less than frametime, compensate
+ count = 1 + ( level.time - ent->nextRegenTime ) / interval;
+
+ ent->health += count;
+ ent->nextRegenTime += count * interval;
- ent->health += 1;
// if at max health, clear damage counters
- if( ent->health >= ent->client->ps.stats[ STAT_MAX_HEALTH ] )
+ if( ent->health >= client->ps.stats[ STAT_MAX_HEALTH ] )
{
- ent->health = ent->client->ps.stats[ STAT_MAX_HEALTH ];
+ ent->health = client->ps.stats[ STAT_MAX_HEALTH ];
for( i = 0; i < MAX_CLIENTS; i++ )
ent->credits[ i ] = 0;
}
- ent->nextRegenTime += 1000 / ( regenRate * modifier );
- }
- else
- {
- ent->health -= 1;
- ent->nextRegenTime += 1000 / regenRate;
}
}
diff --git a/src/game/tremulous.h b/src/game/tremulous.h
index 40887cf2..6d04d548 100644
--- a/src/game/tremulous.h
+++ b/src/game/tremulous.h
@@ -148,61 +148,61 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
#define ABUILDER_SPEED 0.7f
#define ABUILDER_VALUE AVM(200)
#define ABUILDER_HEALTH AHM(50)
-#define ABUILDER_REGEN 2
+#define ABUILDER_REGEN (0.04f * ABUILDER_HEALTH)
#define ABUILDER_COST 0
#define ABUILDER_UPG_SPEED 0.7f
#define ABUILDER_UPG_VALUE AVM(250)
#define ABUILDER_UPG_HEALTH AHM(75)
-#define ABUILDER_UPG_REGEN 3
+#define ABUILDER_UPG_REGEN (0.04f * ABUILDER_UPG_HEALTH)
#define ABUILDER_UPG_COST 0
#define LEVEL0_SPEED 1.4f
#define LEVEL0_VALUE AVM(150)
#define LEVEL0_HEALTH AHM(20)
-#define LEVEL0_REGEN 1
+#define LEVEL0_REGEN (0.05f * LEVEL0_HEALTH)
#define LEVEL0_COST 0
#define LEVEL1_SPEED 1.25f
#define LEVEL1_VALUE AVM(225)
#define LEVEL1_HEALTH AHM(60)
-#define LEVEL1_REGEN 2
+#define LEVEL1_REGEN (0.03f * LEVEL1_HEALTH)
#define LEVEL1_COST 1
#define LEVEL1_UPG_SPEED 1.25f
#define LEVEL1_UPG_VALUE AVM(275)
#define LEVEL1_UPG_HEALTH AHM(80)
-#define LEVEL1_UPG_REGEN 3
+#define LEVEL1_UPG_REGEN (0.03f * LEVEL1_UPG_HEALTH)
#define LEVEL1_UPG_COST 1
#define LEVEL2_SPEED 1.2f
#define LEVEL2_VALUE AVM(350)
#define LEVEL2_HEALTH AHM(150)
-#define LEVEL2_REGEN 4
+#define LEVEL2_REGEN (0.03f * LEVEL2_HEALTH)
#define LEVEL2_COST 1
#define LEVEL2_UPG_SPEED 1.2f
#define LEVEL2_UPG_VALUE AVM(450)
#define LEVEL2_UPG_HEALTH AHM(175)
-#define LEVEL2_UPG_REGEN 5
+#define LEVEL2_UPG_REGEN (0.03f * LEVEL2_UPG_HEALTH)
#define LEVEL2_UPG_COST 1
#define LEVEL3_SPEED 1.1f
#define LEVEL3_VALUE AVM(500)
#define LEVEL3_HEALTH AHM(200)
-#define LEVEL3_REGEN 6
+#define LEVEL3_REGEN (0.03f * LEVEL3_HEALTH)
#define LEVEL3_COST 1
#define LEVEL3_UPG_SPEED 1.1f
#define LEVEL3_UPG_VALUE AVM(600)
#define LEVEL3_UPG_HEALTH AHM(250)
-#define LEVEL3_UPG_REGEN 7
+#define LEVEL3_UPG_REGEN (0.03f * LEVEL3_UPG_HEALTH)
#define LEVEL3_UPG_COST 1
#define LEVEL4_SPEED 1.2f
#define LEVEL4_VALUE AVM(800)
#define LEVEL4_HEALTH AHM(350)
-#define LEVEL4_REGEN 9
+#define LEVEL4_REGEN (0.025f * LEVEL4_HEALTH)
#define LEVEL4_COST 2
/*
@@ -345,8 +345,8 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
#define ALIEN_SPAWN_REPEAT_TIME 10000
-#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_REGEN_DAMAGE_TIME 2000 //msec since damage that regen starts again
+#define ALIEN_REGEN_NOCREEP_MOD (1.0f/3.0f) //regen off creep
#define ALIEN_MAX_FRAGS 9
#define ALIEN_MAX_CREDITS (ALIEN_MAX_FRAGS*ALIEN_CREDITS_PER_FRAG)