summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--assets/models/weapons/lgun/light_lgun.md3bin0 -> 6648 bytes
-rw-r--r--assets/models/weapons/lgun/weapon.cfg8
-rw-r--r--src/cgame/cg_draw.c2
-rw-r--r--src/game/bg_misc.c297
-rw-r--r--src/game/bg_pmove.c56
-rw-r--r--src/game/bg_public.h4
-rw-r--r--src/game/g_active.c17
-rw-r--r--src/game/g_buildable.c113
-rw-r--r--src/game/g_combat.c22
-rw-r--r--src/game/g_local.h13
-rw-r--r--src/game/g_main.c79
-rw-r--r--src/game/g_missile.c154
-rw-r--r--src/game/g_weapon.c23
-rw-r--r--src/game/tremulous.h26
14 files changed, 568 insertions, 246 deletions
diff --git a/assets/models/weapons/lgun/light_lgun.md3 b/assets/models/weapons/lgun/light_lgun.md3
new file mode 100644
index 0000000..9ccf871
--- /dev/null
+++ b/assets/models/weapons/lgun/light_lgun.md3
Binary files differ
diff --git a/assets/models/weapons/lgun/weapon.cfg b/assets/models/weapons/lgun/weapon.cfg
index 1cbb7f2..8682728 100644
--- a/assets/models/weapons/lgun/weapon.cfg
+++ b/assets/models/weapons/lgun/weapon.cfg
@@ -11,3 +11,11 @@ primary
impactParticleSystem models/weapons/lasgun/impactPS
}
+
+secondary
+{
+ flashDlightColor 0.5 0.5 1.0
+ flashSound 0 models/weapons/lgun/flash0.wav
+
+ missileModel models/weapons/lgun/light_lgun.md3
+}
diff --git a/src/cgame/cg_draw.c b/src/cgame/cg_draw.c
index 2ec205f..6af1375 100644
--- a/src/cgame/cg_draw.c
+++ b/src/cgame/cg_draw.c
@@ -1746,7 +1746,7 @@ static void CG_DrawStageReport( rectDef_t *rect, float text_x, float text_y,
if( cg.snap->ps.stats[ STAT_TEAM ] == TEAM_NONE )
// return;
{
- Com_sprintf( s, MAX_TOKEN_CHARS, " %d [ye2]HUMANS |STAGE| ALIENS[Ye] %d ", cgs.humanStage + 1 , cgs.alienStage + 1);
+ Com_sprintf( s, MAX_TOKEN_CHARS, " %d [ye2]ALIENS |STAGE| HUMANS[Ye] %d ", cgs.alienStage + 1 , cgs.humanStage + 1);
}
diff --git a/src/game/bg_misc.c b/src/game/bg_misc.c
index e402982..71f5507 100644
--- a/src/game/bg_misc.c
+++ b/src/game/bg_misc.c
@@ -37,6 +37,12 @@ void trap_FS_FCloseFile( fileHandle_t f );
void trap_FS_Seek( fileHandle_t f, long offset, fsOrigin_t origin ); // fsOrigin_t
int trap_FS_GetFileList( const char *path, const char *extension, char *listbuf, int bufsize );
+#define STAGE_GE_5 ((1 << S5))
+#define STAGE_GE_4 ((1 << S4) | STAGE_GE_5)
+#define STAGE_GE_3 ((1 << S3) | STAGE_GE_4)
+#define STAGE_GE_2 ((1 << S2) | STAGE_GE_3)
+#define STAGE_GE_1 ((1 << S1) | STAGE_GE_2)
+
static const buildableAttributes_t bg_buildableList[ ] =
{
//ALIEN BUILDINGS
@@ -51,7 +57,7 @@ static const buildableAttributes_t bg_buildableList[ ] =
TR_GRAVITY, //trType_t traj;
0.0, //float bounce;
ASPAWN_BP, //int buildPoints;
- ( 1 << S1 )|( 1 << S2 )|( 1 << S3 ), //int stages
+ STAGE_GE_1, //int stages
ASPAWN_HEALTH, //int health;
ASPAWN_REGEN, //int regenRate;
ASPAWN_SPLASHDAMAGE, //int splashDamage;
@@ -86,7 +92,7 @@ static const buildableAttributes_t bg_buildableList[ ] =
TR_GRAVITY, //trType_t traj;
0.0, //float bounce;
OVERMIND_BP, //int buildPoints;
- ( 1 << S1 )|( 1 << S2 )|( 1 << S3 ), //int stages
+ STAGE_GE_1, //int stages
OVERMIND_HEALTH, //int health;
OVERMIND_REGEN, //int regenRate;
OVERMIND_SPLASHDAMAGE, //int splashDamage;
@@ -121,7 +127,7 @@ static const buildableAttributes_t bg_buildableList[ ] =
TR_GRAVITY, //trType_t traj;
0.0, //float bounce;
BARRICADE_BP, //int buildPoints;
- ( 1 << S1 )|( 1 << S2 )|( 1 << S3 ), //int stages
+ STAGE_GE_1, //int stages
BARRICADE_HEALTH, //int health;
BARRICADE_REGEN, //int regenRate;
BARRICADE_SPLASHDAMAGE,//int splashDamage;
@@ -156,7 +162,7 @@ static const buildableAttributes_t bg_buildableList[ ] =
TR_GRAVITY, //trType_t traj;
0.0, //float bounce;
ACIDTUBE_BP, //int buildPoints;
- ( 1 << S1 )|( 1 << S2 )|( 1 << S3 ), //int stages
+ STAGE_GE_1, //int stages
ACIDTUBE_HEALTH, //int health;
ACIDTUBE_REGEN, //int regenRate;
ACIDTUBE_SPLASHDAMAGE, //int splashDamage;
@@ -191,7 +197,7 @@ static const buildableAttributes_t bg_buildableList[ ] =
TR_GRAVITY, //trType_t traj;
0.0, //float bounce;
TRAPPER_BP, //int buildPoints;
- ( 1 << S2 )|( 1 << S3 ), //int stages
+ STAGE_GE_2, //int stages
TRAPPER_HEALTH, //int health;
TRAPPER_REGEN, //int regenRate;
TRAPPER_SPLASHDAMAGE, //int splashDamage;
@@ -227,7 +233,7 @@ static const buildableAttributes_t bg_buildableList[ ] =
TR_GRAVITY, //trType_t traj;
0.0, //float bounce;
BOOSTER_BP, //int buildPoints;
- ( 1 << S2 )|( 1 << S3 ), //int stages
+ STAGE_GE_3, //int stages
BOOSTER_HEALTH, //int health;
BOOSTER_REGEN, //int regenRate;
BOOSTER_SPLASHDAMAGE, //int splashDamage;
@@ -261,7 +267,7 @@ static const buildableAttributes_t bg_buildableList[ ] =
TR_GRAVITY, //trType_t traj;
0.0, //float bounce;
HIVE_BP, //int buildPoints;
- ( 1 << S3 ), //int stages
+ STAGE_GE_4, //int stages
HIVE_HEALTH, //int health;
HIVE_REGEN, //int regenRate;
HIVE_SPLASHDAMAGE, //int splashDamage;
@@ -295,7 +301,7 @@ static const buildableAttributes_t bg_buildableList[ ] =
TR_GRAVITY, //trType_t traj;
0, //float bounce;
PANZER_SMALL_BP, //int buildPoints;
- ( 1 << S1 )|( 1 << S2 )|( 1 << S3 ), //int stages
+ STAGE_GE_1, //int stages
PANZER_SMALL_HEALTH, //int health;
PANZER_SMALL_REGEN, //int regenRate;
PANZER_SMALL_SPLASHDAMAGE, //int splashDamage;
@@ -329,7 +335,7 @@ static const buildableAttributes_t bg_buildableList[ ] =
TR_GRAVITY, //trType_t traj;
0, //float bounce;
PANZER_MEDIUM_BP, //int buildPoints;
- ( 1 << S2 )|( 1 << S3 ), //int stages
+ STAGE_GE_3, //int stages
PANZER_MEDIUM_HEALTH, //int health;
PANZER_MEDIUM_REGEN, //int regenRate;
PANZER_MEDIUM_SPLASHDAMAGE, //int splashDamage;
@@ -363,7 +369,7 @@ static const buildableAttributes_t bg_buildableList[ ] =
TR_GRAVITY, //trType_t traj;
0, //float bounce;
PANZER_LARGE_BP, //int buildPoints;
- ( 1 << S3 ), //int stages
+ STAGE_GE_4, //int stages
PANZER_LARGE_HEALTH, //int health;
PANZER_LARGE_REGEN, //int regenRate;
PANZER_LARGE_SPLASHDAMAGE, //int splashDamage;
@@ -397,7 +403,7 @@ static const buildableAttributes_t bg_buildableList[ ] =
TR_GRAVITY, //trType_t traj;
0, //float bounce;
TENDON_SMALL_BP, //int buildPoints;
- ( 1 << S1 )|( 1 << S2 )|( 1 << S3 ), //int stages
+ STAGE_GE_1, //int stages
TENDON_SMALL_HEALTH, //int health;
TENDON_SMALL_REGEN, //int regenRate;
TENDON_SMALL_SPLASHDAMAGE, //int splashDamage;
@@ -432,7 +438,7 @@ static const buildableAttributes_t bg_buildableList[ ] =
TR_GRAVITY, //trType_t traj;
0.0, //float bounce;
TENDON_MEDIUM_BP, //int buildPoints;
- ( 1 << S2 )|( 1 << S3 ), //int stages
+ STAGE_GE_2, //int stages
TENDON_MEDIUM_HEALTH, //int health;
TENDON_MEDIUM_REGEN, //int regenRate;
TENDON_MEDIUM_SPLASHDAMAGE, //int splashDamage;
@@ -467,7 +473,7 @@ static const buildableAttributes_t bg_buildableList[ ] =
TR_GRAVITY, //trType_t traj;
0, //float bounce;
TENDON_LARGE_BP, //int buildPoints;
- ( 1 << S3 ), //int stages
+ STAGE_GE_3, //int stages
TENDON_LARGE_HEALTH, //int health;
TENDON_LARGE_REGEN, //int regenRate;
TENDON_LARGE_SPLASHDAMAGE, //int splashDamage;
@@ -503,7 +509,7 @@ static const buildableAttributes_t bg_buildableList[ ] =
TR_GRAVITY, //trType_t traj;
0, //float bounce;
NET_BP, //int buildPoints;
- ( 1 << S2 )|( 1 << S3 ), //int stages
+ STAGE_GE_3, //int stages
NET_HEALTH, //int health;
NET_REGEN, //int regenRate;
NET_SPLASHDAMAGE, //int splashDamage;
@@ -539,7 +545,7 @@ static const buildableAttributes_t bg_buildableList[ ] =
TR_GRAVITY, //trType_t traj;
0, //float bounce;
NET_SPIKE_BP, //int buildPoints;
- ( 1 << S1 )|( 1 << S2 )|( 1 << S3 ), //int stages
+ STAGE_GE_1, //int stages
NET_SPIKE_HEALTH, //int health;
NET_SPIKE_REGEN, //int regenRate;
NET_SPIKE_SPLASHDAMAGE, //int splashDamage;
@@ -576,7 +582,7 @@ static const buildableAttributes_t bg_buildableList[ ] =
TR_GRAVITY, //trType_t traj;
0, //float bounce;
INFESTATION_SLIME_BP, //int buildPoints;
- ( 1 << S2 )|( 1 << S3 ), //int stages
+ STAGE_GE_5, //int stages
INFESTATION_SLIME_HEALTH, //int health;
INFESTATION_SLIME_REGEN, //int regenRate;
INFESTATION_SLIME_SPLASHDAMAGE, //int splashDamage;
@@ -611,7 +617,7 @@ static const buildableAttributes_t bg_buildableList[ ] =
TR_GRAVITY, //trType_t traj;
0, //float bounce;
INFESTATION_THICKET_BP, //int buildPoints;
- ( 1 << S1 )|( 1 << S2 )|( 1 << S3 ), //int stages
+ STAGE_GE_1, //int stages
INFESTATION_THICKET_HEALTH, //int health;
INFESTATION_THICKET_REGEN, //int regenRate;
INFESTATION_THICKET_SPLASHDAMAGE, //int splashDamage;
@@ -647,7 +653,7 @@ static const buildableAttributes_t bg_buildableList[ ] =
TR_GRAVITY, //trType_t traj;
0.0, //float bounce;
INFESTATION_BLISTER_BP, //int buildPoints;
- ( 1 << S2 )|( 1 << S3 ), //int stages
+ STAGE_GE_2, //int stages
INFESTATION_BLISTER_HEALTH, //int health;
INFESTATION_BLISTER_REGEN, //int regenRate;
INFESTATION_BLISTER_SPLASHDAMAGE, //int splashDamage;
@@ -684,7 +690,7 @@ static const buildableAttributes_t bg_buildableList[ ] =
TR_GRAVITY, //trType_t traj;
0.0, //float bounce;
REFLECTOR_BP, //int buildPoints;
- ( 1 << S2 )|( 1 << S3 ), //int stages
+ STAGE_GE_3, //int stages
REFLECTOR_HEALTH, //int health;
REFLECTOR_REGEN, //int regenRate;
REFLECTOR_SPLASHDAMAGE, //int splashDamage;
@@ -717,8 +723,8 @@ static const buildableAttributes_t bg_buildableList[ ] =
"team_alien_muscle", //char *entityName;
TR_GRAVITY, //trType_t traj;
0, //float bounce;
- MUSCLE_BP, //int buildPoints;
- ( 1 << S2 )|( 1 << S3 ), //int stages
+ MUSCLE_BP, //int buildPoints;
+ STAGE_GE_2, //int stages
MUSCLE_HEALTH, //int health;
MUSCLE_REGEN, //int regenRate;
MUSCLE_SPLASHDAMAGE, //int splashDamage;
@@ -753,7 +759,7 @@ static const buildableAttributes_t bg_buildableList[ ] =
TR_GRAVITY, //trType_t traj;
0.0, //float bounce;
SPITEFUL_ABCESS_BP, //int buildPoints;
- ( 1 << S2 )|( 1 << S3 ), //int stages
+ STAGE_GE_2, //int stages
SPITEFUL_ABCESS_HEALTH, //int health;
SPITEFUL_ABCESS_REGEN, //int regenRate;
SPITEFUL_ABCESS_SPLASHDAMAGE, //int splashDamage;
@@ -789,7 +795,7 @@ static const buildableAttributes_t bg_buildableList[ ] =
TR_GRAVITY, //trType_t traj;
0, //float bounce;
COCOON_BP, //int buildPoints;
- ( 1 << S3 ), //int stages
+ STAGE_GE_4, //int stages
COCOON_HEALTH, //int health;
COCOON_REGEN, //int regenRate;
COCOON_SPLASHDAMAGE, //int splashDamage;
@@ -823,7 +829,7 @@ static const buildableAttributes_t bg_buildableList[ ] =
TR_GRAVITY, //trType_t traj;
0.0, //float bounce;
ORGANIC_BULB_BP, //int buildPoints;
- ( 1 << S3 ), //int stages
+ STAGE_GE_3, //int stages
ORGANIC_BULB_HEALTH, //int health;
ORGANIC_BULB_REGEN, //int regenRate;
ORGANIC_BULB_SPLASHDAMAGE, //int splashDamage;
@@ -858,7 +864,7 @@ static const buildableAttributes_t bg_buildableList[ ] =
TR_GRAVITY, //trType_t traj;
0.0, //float bounce;
POD_BP, //int buildPoints;
- ( 1 << S3 ), //int stages
+ STAGE_GE_4, //int stages
POD_HEALTH, //int health;
POD_REGEN, //int regenRate;
POD_SPLASHDAMAGE, //int splashDamage;
@@ -892,7 +898,7 @@ static const buildableAttributes_t bg_buildableList[ ] =
TR_GRAVITY, //trType_t traj;
0.0, //float bounce;
POD_STUMP_BP, //int buildPoints;
- ( 1 << S3 ), //int stages
+ STAGE_GE_4, //int stages
POD_STUMP_HEALTH, //int health;
POD_STUMP_REGEN, //int regenRate;
POD_STUMP_SPLASHDAMAGE, //int splashDamage;
@@ -925,7 +931,7 @@ static const buildableAttributes_t bg_buildableList[ ] =
TR_GRAVITY, //trType_t traj;
0.0, //float bounce;
CREEPCOLONY_BP, //int buildPoints;
- ( 1 << S2 )|( 1 << S3 ), //int stages
+ STAGE_GE_3, //int stages
CREEPCOLONY_HEALTH, //int health;
CREEPCOLONY_REGEN, //int regenRate;
CREEPCOLONY_SPLASHDAMAGE, //int splashDamage;
@@ -962,13 +968,13 @@ static const buildableAttributes_t bg_buildableList[ ] =
TR_GRAVITY, //trType_t traj;
0.0, //float bounce;
HSPAWN_BP, //int buildPoints;
- ( 1 << S1 )|( 1 << S2 )|( 1 << S3 ), //int stages
+ STAGE_GE_1, //int stages
HSPAWN_HEALTH, //int health;
0, //int regenRate;
HSPAWN_SPLASHDAMAGE, //int splashDamage;
HSPAWN_SPLASHRADIUS, //int splashRadius;
MOD_HSPAWN, //int meansOfDeath;
- TEAM_HUMANS, //int team;
+ TEAM_HUMANS, //int team;
( 1 << WP_HBUILD ), //weapon_t buildWeapon;
BANIM_IDLE1, //int idleAnim;
100, //int nextthink;
@@ -997,7 +1003,7 @@ static const buildableAttributes_t bg_buildableList[ ] =
TR_GRAVITY, //trType_t traj;
0.0, //float bounce;
MGTURRET_BP, //int buildPoints;
- ( 1 << S1 )|( 1 << S2 )|( 1 << S3 ), //int stages
+ STAGE_GE_1, //int stages
MGTURRET_HEALTH, //int health;
0, //int regenRate;
MGTURRET_SPLASHDAMAGE, //int splashDamage;
@@ -1032,7 +1038,7 @@ static const buildableAttributes_t bg_buildableList[ ] =
TR_GRAVITY, //trType_t traj;
0.0, //float bounce;
MGTURRET2_BP, //int buildPoints;
- ( 1 << S2 )|( 1 << S3 ), //int stages
+ STAGE_GE_3, //int stages
MGTURRET2_HEALTH, //int health;
0, //int regenRate;
MGTURRET2_SPLASHDAMAGE, //int splashDamage;
@@ -1067,7 +1073,7 @@ static const buildableAttributes_t bg_buildableList[ ] =
TR_GRAVITY, //trType_t traj;
0.0, //float bounce;
TESLAGEN_BP, //int buildPoints;
- ( 1 << S3 ), //int stages
+ STAGE_GE_4, //int stages
TESLAGEN_HEALTH, //int health;
0, //int regenRate;
TESLAGEN_SPLASHDAMAGE, //int splashDamage;
@@ -1102,7 +1108,7 @@ static const buildableAttributes_t bg_buildableList[ ] =
TR_GRAVITY, //trType_t traj;
0.0, //float bounce;
ARMOURY_BP, //int buildPoints;
- ( 1 << S1 )|( 1 << S2 )|( 1 << S3 ), //int stages
+ STAGE_GE_1, //int stages
ARMOURY_HEALTH, //int health;
0, //int regenRate;
ARMOURY_SPLASHDAMAGE, //int splashDamage;
@@ -1137,7 +1143,7 @@ static const buildableAttributes_t bg_buildableList[ ] =
TR_GRAVITY, //trType_t traj;
0.0, //float bounce;
DC_BP, //int buildPoints;
- ( 1 << S2 )|( 1 << S3 ), //int stages
+ STAGE_GE_2, //int stages
DC_HEALTH, //int health;
0, //int regenRate;
DC_SPLASHDAMAGE, //int splashDamage;
@@ -1173,13 +1179,13 @@ static const buildableAttributes_t bg_buildableList[ ] =
TR_GRAVITY, //trType_t traj;
0.0, //float bounce;
MEDISTAT_BP, //int buildPoints;
- ( 1 << S1 )|( 1 << S2 )|( 1 << S3 ), //int stages
+ STAGE_GE_1, //int stages
MEDISTAT_HEALTH, //int health;
0, //int regenRate;
MEDISTAT_SPLASHDAMAGE, //int splashDamage;
MEDISTAT_SPLASHRADIUS, //int splashRadius;
MOD_HSPAWN, //int meansOfDeath;
- TEAM_HUMANS, //int team;
+ TEAM_HUMANS, //int team;
( 1 << WP_HBUILD ), //weapon_t buildWeapon;
BANIM_IDLE1, //int idleAnim;
100, //int nextthink;
@@ -1208,7 +1214,7 @@ static const buildableAttributes_t bg_buildableList[ ] =
TR_GRAVITY, //trType_t traj;
0.0, //float bounce;
REACTOR_BP, //int buildPoints;
- ( 1 << S1 )|( 1 << S2 )|( 1 << S3 ), //int stages
+ STAGE_GE_1, //int stages
REACTOR_HEALTH, //int health;
0, //int regenRate;
REACTOR_SPLASHDAMAGE, //int splashDamage;
@@ -1243,13 +1249,13 @@ static const buildableAttributes_t bg_buildableList[ ] =
TR_GRAVITY, //trType_t traj;
0.0, //float bounce;
REPEATER_BP, //int buildPoints;
- ( 1 << S1 )|( 1 << S2 )|( 1 << S3 ), //int stages
+ STAGE_GE_1, //int stages
REPEATER_HEALTH, //int health;
0, //int regenRate;
REPEATER_SPLASHDAMAGE, //int splashDamage;
REPEATER_SPLASHRADIUS, //int splashRadius;
MOD_HSPAWN, //int meansOfDeath;
- TEAM_HUMANS, //int team;
+ TEAM_HUMANS, //int team;
( 1 << WP_HBUILD ), //weapon_t buildWeapon;
BANIM_IDLE1, //int idleAnim;
100, //int nextthink;
@@ -1278,7 +1284,7 @@ static const buildableAttributes_t bg_buildableList[ ] =
TR_GRAVITY, //trType_t traj;
0.0, //float bounce;
CONTAINER_SMALL_BP, //int buildPoints;
- ( 1 << S1 )|( 1 << S2 )|( 1 << S3 ), //int stages
+ STAGE_GE_1, //int stages
CONTAINER_SMALL_HEALTH, //int health;
0, //int regenRate;
CONTAINER_SMALL_SPLASHDAMAGE, //int splashDamage;
@@ -1313,7 +1319,7 @@ static const buildableAttributes_t bg_buildableList[ ] =
TR_GRAVITY, //trType_t traj;
0.0, //float bounce;
CONTAINER_MEDIUM_BP, //int buildPoints;
- ( 1 << S2 )|( 1 << S3 ), //int stages
+ STAGE_GE_3, //int stages
CONTAINER_MEDIUM_HEALTH, //int health;
0, //int regenRate;
CONTAINER_MEDIUM_SPLASHDAMAGE, //int splashDamage;
@@ -1348,7 +1354,7 @@ static const buildableAttributes_t bg_buildableList[ ] =
TR_GRAVITY, //trType_t traj;
0.0, //float bounce;
CONTAINER_LARGE_BP, //int buildPoints;
- ( 1 << S3 ), //int stages
+ STAGE_GE_4, //int stages
CONTAINER_LARGE_HEALTH, //int health;
0, //int regenRate;
CONTAINER_LARGE_SPLASHDAMAGE, //int splashDamage;
@@ -1383,7 +1389,7 @@ static const buildableAttributes_t bg_buildableList[ ] =
TR_GRAVITY, //trType_t traj;
0.0, //float bounce;
PLATE_SMALL_BP, //int buildPoints;
- ( 1 << S1 )|( 1 << S2 )|( 1 << S3 ), //int stages
+ STAGE_GE_1, //int stages
PLATE_SMALL_HEALTH, //int health;
0, //int regenRate;
PLATE_SMALL_SPLASHDAMAGE, //int splashDamage;
@@ -1418,7 +1424,7 @@ static const buildableAttributes_t bg_buildableList[ ] =
TR_GRAVITY, //trType_t traj;
0.0, //float bounce;
PLATE_LARGE_BP, //int buildPoints;
- ( 1 << S3 ), //int stages
+ STAGE_GE_3, //int stages
PLATE_LARGE_HEALTH, //int health;
0, //int regenRate;
PLATE_LARGE_SPLASHDAMAGE, //int splashDamage;
@@ -1453,7 +1459,7 @@ static const buildableAttributes_t bg_buildableList[ ] =
TR_GRAVITY, //trType_t traj;
0.0, //float bounce;
FENCE_BP, //int buildPoints;
- ( 1 << S2 )|( 1 << S3 ), //int stages
+ STAGE_GE_1, //int stages
FENCE_HEALTH, //int health;
0, //int regenRate;
FENCE_SPLASHDAMAGE, //int splashDamage;
@@ -1488,7 +1494,7 @@ static const buildableAttributes_t bg_buildableList[ ] =
TR_GRAVITY, //trType_t traj;
0.0, //float bounce;
FENCE_ROD_BP, //int buildPoints;
- ( 1 << S2 )|( 1 << S3 ), //int stages
+ STAGE_GE_1, //int stages
FENCE_HEALTH, //int health;
0, //int regenRate;
FENCE_ROD_SPLASHDAMAGE, //int splashDamage;
@@ -1523,7 +1529,7 @@ static const buildableAttributes_t bg_buildableList[ ] =
TR_GRAVITY, //trType_t traj;
0.0, //float bounce;
BARRIER_LINE_BP, //int buildPoints;
- ( 1 << S1 )|( 1 << S2 )|( 1 << S3 ), //int stages
+ STAGE_GE_2, //int stages
BARRIER_LINE_HEALTH, //int health;
0, //int regenRate;
BARRIER_LINE_SPLASHDAMAGE, //int splashDamage;
@@ -1558,7 +1564,7 @@ static const buildableAttributes_t bg_buildableList[ ] =
TR_GRAVITY, //trType_t traj;
0.0, //float bounce;
BARRIER_CORNER_BP, //int buildPoints;
- ( 1 << S2 )|( 1 << S3 ), //int stages
+ STAGE_GE_2, //int stages
BARRIER_CORNER_HEALTH, //int health;
0, //int regenRate;
BARRIER_CORNER_SPLASHDAMAGE, //int splashDamage;
@@ -1593,7 +1599,7 @@ static const buildableAttributes_t bg_buildableList[ ] =
TR_GRAVITY, //trType_t traj;
0.0, //float bounce;
BARRIER_POINT_BP, //int buildPoints;
- ( 1 << S2 )|( 1 << S3 ), //int stages
+ STAGE_GE_3, //int stages
BARRIER_POINT_HEALTH, //int health;
0, //int regenRate;
BARRIER_POINT_SPLASHDAMAGE, //int splashDamage;
@@ -1628,7 +1634,7 @@ static const buildableAttributes_t bg_buildableList[ ] =
TR_GRAVITY, //trType_t traj;
0.0, //float bounce;
SHIELD_BP, //int buildPoints;
- ( 1 << S3 ), //int stages
+ STAGE_GE_5, //int stages
SHIELD_HEALTH, //int health;
0, //int regenRate;
SHIELD_SPLASHDAMAGE, //int splashDamage;
@@ -1663,7 +1669,7 @@ static const buildableAttributes_t bg_buildableList[ ] =
TR_GRAVITY, //trType_t traj;
0, //float bounce;
LADDER_BP, //int buildPoints;
- ( 1 << S2 )|( 1 << S3 ), //int stages
+ STAGE_GE_3, //int stages
LADDER_HEALTH, //int health;
0, //int regenRate;
LADDER_SPLASHDAMAGE, //int splashDamage;
@@ -1698,7 +1704,7 @@ static const buildableAttributes_t bg_buildableList[ ] =
TR_GRAVITY, //trType_t traj;
0.0, //float bounce;
TEFLON_FOIL_BP, //int buildPoints;
- ( 1 << S1 )|( 1 << S2 )|( 1 << S3 ), //int stages
+ STAGE_GE_1, //int stages
TEFLON_FOIL_HEALTH, //int health;
0, //int regenRate;
TEFLON_FOIL_SPLASHDAMAGE, //int splashDamage;
@@ -1733,7 +1739,7 @@ static const buildableAttributes_t bg_buildableList[ ] =
TR_GRAVITY, //trType_t traj;
0.0, //float bounce;
BARREL_BP, //int buildPoints;
- ( 1 << S1 )|( 1 << S2 )|( 1 << S3 ), //int stages
+ STAGE_GE_2, //int stages
BARREL_HEALTH, //int health;
0, //int regenRate;
BARREL_SPLASHDAMAGE, //int splashDamage;
@@ -1768,7 +1774,7 @@ static const buildableAttributes_t bg_buildableList[ ] =
TR_GRAVITY, //trType_t traj;
0.0, //float bounce;
LIGHT_BP, //int buildPoints;
- ( 1 << S3 ), //int stages
+ STAGE_GE_5, //int stages
LIGHT_HEALTH, //int health;
0, //int regenRate;
LIGHT_SPLASHDAMAGE, //int splashDamage;
@@ -1804,7 +1810,7 @@ static const buildableAttributes_t bg_buildableList[ ] =
TR_GRAVITY, //trType_t traj;
0.0, //float bounce;
COVER_BP, //int buildPoints;
- ( 1 << S3 ), //int stages
+ STAGE_GE_4, //int stages
COVER_HEALTH, //int health;
0, //int regenRate;
COVER_SPLASHDAMAGE, //int splashDamage;
@@ -1839,7 +1845,7 @@ static const buildableAttributes_t bg_buildableList[ ] =
TR_GRAVITY, //trType_t traj;
0.0, //float bounce;
COVER_STUMP_BP, //int buildPoints;
- ( 1 << S3 ), //int stages
+ STAGE_GE_4, //int stages
COVER_STUMP_HEALTH, //int health;
0, //int regenRate;
COVER_STUMP_SPLASHDAMAGE, //int splashDamage;
@@ -1873,7 +1879,7 @@ static const buildableAttributes_t bg_buildableList[ ] =
TR_GRAVITY, //trType_t traj;
0.0, //float bounce;
REFINERY_BP, //int buildPoints;
- ( 1 << S2 )|( 1 << S3 ), //int stages
+ STAGE_GE_3, //int stages
REFINERY_HEALTH, //int health;
0, //int regenRate;
REFINERY_SPLASHDAMAGE, //int splashDamage;
@@ -2182,7 +2188,7 @@ static const classAttributes_t bg_classList[ ] =
PCL_NONE, //int classnum;
"spectator", //char *className;
"Observer mode",
- ( 1 << S1 )|( 1 << S2 )|( 1 << S3 ), //int stages
+ STAGE_GE_1, //int stages
0, //int health;
0.0f, //float fallDamage;
0.0f, //float regenRate;
@@ -2209,11 +2215,11 @@ static const classAttributes_t bg_classList[ ] =
"builder", //char *className;
"Responsible for building and maintaining all the alien structures. "
"Has a weak melee slash attack.",
- ( 1 << S1 )|( 1 << S2 )|( 1 << S3 ), //int stages
+ STAGE_GE_1, //int stages
ABUILDER_HEALTH, //int health;
0.0f, //float fallDamage;
ABUILDER_REGEN, //float regenRate;
- SCA_TAKESFALLDAMAGE|SCA_FOVWARPS|SCA_ALIENSENSE,//int abilities;
+ SCA_FOVWARPS|SCA_ALIENSENSE, //int abilities;
WP_ABUILD, //weapon_t startWeapon
95.0f, //float buildDist;
110, //int fov;
@@ -2237,11 +2243,11 @@ static const classAttributes_t bg_classList[ ] =
"Similar to the base Granger, except that in addition to "
"being able to build structures it has a spit attack "
"that slows victims and the ability to crawl on walls.",
- ( 1 << S2 )|( 1 << S3 ), //int stages
+ STAGE_GE_2, //int stages
ABUILDER_UPG_HEALTH, //int health;
0.0f, //float fallDamage;
ABUILDER_UPG_REGEN, //float regenRate;
- SCA_TAKESFALLDAMAGE|SCA_FOVWARPS|SCA_WALLCLIMBER|SCA_ALIENSENSE, //int abilities;
+ SCA_FOVWARPS|SCA_WALLCLIMBER|SCA_ALIENSENSE, //int abilities;
WP_ABUILD2, //weapon_t startWeapon
105.0f, //float buildDist;
110, //int fov;
@@ -2264,7 +2270,7 @@ static const classAttributes_t bg_classList[ ] =
"level0", //char *classname;
"Has a lethal reflexive bite and the ability to crawl on "
"walls and ceilings.",
- ( 1 << S1 )|( 1 << S2 )|( 1 << S3 ), //int stages
+ STAGE_GE_1, //int stages
LEVEL0_HEALTH, //int health;
0.0f, //float fallDamage;
LEVEL0_REGEN, //float regenRate;
@@ -2282,7 +2288,7 @@ static const classAttributes_t bg_classList[ ] =
400.0f, //float stopSpeed;
250.0f, //float jumpMagnitude;
2.0f, //float knockbackScale;
- { PCL_ALIEN_LEVEL0_UPG, PCL_NONE, PCL_NONE }, //int children[ 3 ];
+ { PCL_ALIEN_LEVEL1, PCL_ALIEN_LEVEL0_UPG, PCL_NONE }, //int children[ 3 ];
LEVEL0_COST, //int cost;
LEVEL0_VALUE, //int value;
},
@@ -2292,7 +2298,7 @@ static const classAttributes_t bg_classList[ ] =
"In addition to the basic Dretch abilities, the Advanced "
"Dretch has the ability to pounce and spread infections. "
"Advanced Dretch can also damage defensive structures.",
- ( 1 << S1 )|( 1 << S2 )|( 1 << S3 ), //int stages
+ STAGE_GE_2, //int stages
LEVEL0_UPG_HEALTH, //int health;
0.0f, //float fallDamage;
LEVEL0_UPG_REGEN, //float regenRate;
@@ -2320,9 +2326,10 @@ static const classAttributes_t bg_classList[ ] =
"A support class able to crawl on walls and ceilings. Its melee "
"attack is most effective when combined with the ability to grab "
"and hold its victims in place. Provides a weak healing aura "
- "that accelerates the healing rate of nearby aliens."
- "It has an Acid Bomb in his Butt wich can be used as a grenade.",
- ( 1 << S1 )|( 1 << S2 )|( 1 << S3 ), //int stages
+ "that accelerates the healing rate of nearby aliens. It also has "
+ "an acid bomb that can be used to deal moderate area damage. "
+ "The basilisk is also resistant to flamer.",
+ STAGE_GE_1, //int stages
LEVEL1_HEALTH, //int health;
0.0f, //float fallDamage;
LEVEL1_REGEN, //float regenRate;
@@ -2347,14 +2354,14 @@ static const classAttributes_t bg_classList[ ] =
{
PCL_ALIEN_LEVEL1_UPG, //int classnum;
"level1upg", //char *classname;
- "In addition to the basic Basilisk abilities, the Advanced"
- "Basilisk sprays a poisonous gas which disorients any"
- "nearby humans. Has a strong healing aura that"
- "that accelerates the healing rate of nearby aliens."
- "It becomes invisible if stays still and has full health."
- "It will become visible once Overmind is dead or it has < full health."
- "It has an (powerful) Acid Bomb in his Butt wich can be used as a grenade.",
- ( 1 << S2 )|( 1 << S3 ), //int stages
+ "In addition to the basic Basilisk abilities, the Advanced "
+ "Basilisk sprays a poisonous gas which slows down and disorients "
+ "nearby humans. Has a strong healing aura that that accelerates "
+ "the healing rate of nearby aliens. It is invisible while staying "
+ "still and at full health as long as there is an overmind around. "
+ "It also has an acid bomb similar to basilisk's one but stronger."
+ "The adv. basilisk is also resistant to flamer.",
+ STAGE_GE_3, //int stages
LEVEL1_UPG_HEALTH, //int health;
0.0f, //float fallDamage;
LEVEL1_UPG_REGEN, //float regenRate;
@@ -2381,7 +2388,7 @@ static const classAttributes_t bg_classList[ ] =
"level2", //char *classname;
"Has a melee attack and the ability to jump off walls. This "
"allows the Marauder to gather great speed in enclosed areas.",
- ( 1 << S1 )|( 1 << S2 )|( 1 << S3 ), //int stages
+ STAGE_GE_2, //int stages
LEVEL2_HEALTH, //int health;
0.0f, //float fallDamage;
LEVEL2_REGEN, //float regenRate;
@@ -2409,7 +2416,7 @@ static const classAttributes_t bg_classList[ ] =
"The Advanced Marauder has all the abilities of the basic Marauder "
"with the addition of a zap attack that chains through other "
"adv. marauders and can explode mines.",
- ( 1 << S2 )|( 1 << S3 ), //int stages
+ STAGE_GE_3, //int stages
LEVEL2_UPG_HEALTH, //int health;
0.0f, //float fallDamage;
LEVEL2_UPG_REGEN, //float regenRate;
@@ -2437,7 +2444,7 @@ static const classAttributes_t bg_classList[ ] =
"The Hummel is a flying alien with air pounce ability, "
"fast melee attacks and unlimited low damage shooting attack "
"that does not spread poison.",
- ( 1 << S2 )|( 1 << S3 ), //int stages
+ STAGE_GE_4, //int stages
LEVEL5_UPG_HEALTH, //int health;
0.0f, //float fallDamage;
LEVEL5_UPG_REGEN, //float regenRate;
@@ -2465,7 +2472,7 @@ static const classAttributes_t bg_classList[ ] =
"Possesses a melee attack and the pounce ability, which may "
"be used as both an attack and a means to reach remote "
"locations inaccessible from the ground.",
- ( 1 << S1 )|( 1 << S2 )|( 1 << S3 ), //int stages
+ STAGE_GE_3, //int stages
LEVEL3_HEALTH, //int health;
0.0f, //float fallDamage;
LEVEL3_REGEN, //float regenRate;
@@ -2492,8 +2499,8 @@ static const classAttributes_t bg_classList[ ] =
"level3upg", //char *classname;
"In addition to the basic Dragoon abilities, the Advanced "
"Dragoon has 3 barbs which may be used to attack humans "
- "from a distance and it has a higher jump high.",
- ( 1 << S2 )|( 1 << S3 ), //int stages
+ "from a distance and it has a higher jump height.",
+ STAGE_GE_4, //int stages
LEVEL3_UPG_HEALTH, //int health;
0.0f, //float fallDamage;
LEVEL3_UPG_REGEN, //float regenRate;
@@ -2518,11 +2525,11 @@ static const classAttributes_t bg_classList[ ] =
{
PCL_ALIEN_LEVEL4, //int classnum;
"level4", //char *classname;
- "A large alien with a strong melee attack, this class can "
- "also charge at enemy humans and structures, inflicting "
- "great damage. Any humans or their structures caught under "
- "a falling Tyrant will be crushed by its weight.",
- ( 1 << S3 ), //int stages
+ "A large alien with a strong melee attack and a weak flame blast. "
+ "This class can also charge at enemy players and structures, "
+ "inflicting great damage. Any humans caught under a falling "
+ "Tyrant will be crushed by its weight.",
+ STAGE_GE_5, //int stages
LEVEL4_HEALTH, //int health;
0.0f, //float fallDamage;
LEVEL4_REGEN, //float regenRate;
@@ -2548,7 +2555,7 @@ static const classAttributes_t bg_classList[ ] =
PCL_HUMAN, //int classnum;
"human_base", //char *classname;
"",
- ( 1 << S1 )|( 1 << S2 )|( 1 << S3 ), //int stages
+ STAGE_GE_1, //int stages
100, //int health;
1.0f, //float fallDamage;
0.0f, //float regenRate;
@@ -2574,7 +2581,7 @@ static const classAttributes_t bg_classList[ ] =
PCL_HUMAN_BSUIT, //int classnum;
"human_bsuit", //char *classname;
"",
- ( 1 << S3 ), //int stages
+ STAGE_GE_5, //int stages
100, //int health;
1.0f, //float fallDamage;
0.0f, //float regenRate;
@@ -3082,7 +3089,7 @@ static const weaponAttributes_t bg_weapons[ ] =
{
WP_ALEVEL0, //int weaponNum;
0, //int price;
- ( 1 << S1 )|( 1 << S2 )|( 1 << S3 ), //int stages
+ STAGE_GE_1, //int stages
SLOT_WEAPON, //int slots;
"level0", //char *weaponName;
"Bite", //char *humanName;
@@ -3107,7 +3114,7 @@ static const weaponAttributes_t bg_weapons[ ] =
{
WP_ALEVEL0_UPG, //int weaponNum;
0, //int price;
- ( 1 << S1 )|( 1 << S2 )|( 1 << S3 ), //int stages
+ STAGE_GE_2, //int stages
SLOT_WEAPON, //int slots;
"level0upg", //char *weaponName;
"Bite Upgrade", //char *humanName;
@@ -3132,7 +3139,7 @@ static const weaponAttributes_t bg_weapons[ ] =
{
WP_ALEVEL1, //int weaponNum;
0, //int price;
- ( 1 << S1 )|( 1 << S2 )|( 1 << S3 ), //int stages
+ STAGE_GE_1, //int stages
SLOT_WEAPON, //int slots;
"level1", //char *weaponName;
"Claws", //char *humanName;
@@ -3157,7 +3164,7 @@ static const weaponAttributes_t bg_weapons[ ] =
{
WP_ALEVEL1_UPG, //int weaponNum;
0, //int price;
- ( 1 << S1 )|( 1 << S2 )|( 1 << S3 ), //int stages
+ STAGE_GE_3, //int stages
SLOT_WEAPON, //int slots;
"level1upg", //char *weaponName;
"Claws Upgrade", //char *humanName;
@@ -3182,7 +3189,7 @@ static const weaponAttributes_t bg_weapons[ ] =
{
WP_ALEVEL2, //int weaponNum;
0, //int price;
- ( 1 << S1 )|( 1 << S2 )|( 1 << S3 ), //int stages
+ STAGE_GE_2, //int stages
SLOT_WEAPON, //int slots;
"level2", //char *weaponName;
"Claws", //char *humanName;
@@ -3207,7 +3214,7 @@ static const weaponAttributes_t bg_weapons[ ] =
{
WP_ALEVEL2_UPG, //int weaponNum;
0, //int price;
- ( 1 << S1 )|( 1 << S2 )|( 1 << S3 ), //int stages
+ STAGE_GE_3, //int stages
SLOT_WEAPON, //int slots;
"level2upg", //char *weaponName;
"Zap", //char *humanName;
@@ -3232,7 +3239,7 @@ static const weaponAttributes_t bg_weapons[ ] =
{
WP_ALEVEL5, //int weaponNum;
0, //int price;
- ( 1 << S1 )|( 1 << S2 )|( 1 << S3 ), //int stages
+ STAGE_GE_4, //int stages
SLOT_WEAPON, //int slots;
"level5", //char *weaponName;
"prickles", //char *humanName;
@@ -3257,7 +3264,7 @@ static const weaponAttributes_t bg_weapons[ ] =
{
WP_ALEVEL3, //int weaponNum;
0, //int price;
- ( 1 << S1 )|( 1 << S2 )|( 1 << S3 ), //int stages
+ STAGE_GE_3, //int stages
SLOT_WEAPON, //int slots;
"level3", //char *weaponName;
"Pounce", //char *humanName;
@@ -3282,7 +3289,7 @@ static const weaponAttributes_t bg_weapons[ ] =
{
WP_ALEVEL3_UPG, //int weaponNum;
0, //int price;
- ( 1 << S1 )|( 1 << S2 )|( 1 << S3 ), //int stages
+ STAGE_GE_4, //int stages
SLOT_WEAPON, //int slots;
"level3upg", //char *weaponName;
"Pounce (upgrade)", //char *humanName;
@@ -3307,7 +3314,7 @@ static const weaponAttributes_t bg_weapons[ ] =
{
WP_ALEVEL4, //int weaponNum;
0, //int price;
- ( 1 << S1 )|( 1 << S2 )|( 1 << S3 ), //int stages
+ STAGE_GE_5, //int stages
SLOT_WEAPON, //int slots;
"level4", //char *weaponName;
"Charge", //char *humanName;
@@ -3333,10 +3340,10 @@ static const weaponAttributes_t bg_weapons[ ] =
{
WP_BLASTER, //int weaponNum;
0, //int price;
- ( 1 << S1 )|( 1 << S2 )|( 1 << S3 ), //int stages
+ STAGE_GE_1, //int stages
0, //int slots;
"blaster", //char *weaponName;
- "[yefarms]Blaster", //char *humanName;
+ "[yefarms]Blaster", //char *humanName;
"",
0, //int maxAmmo;
0, //int maxClips;
@@ -3358,7 +3365,7 @@ static const weaponAttributes_t bg_weapons[ ] =
{
WP_MACHINEGUN, //int weaponNum;
RIFLE_PRICE, //int price;
- ( 1 << S1 )|( 1 << S2 )|( 1 << S3 ), //int stages
+ STAGE_GE_1, //int stages
SLOT_WEAPON, //int slots;
"rifle", //char *weaponName;
"[yefarms]Rifle", //char *humanName;
@@ -3384,7 +3391,7 @@ static const weaponAttributes_t bg_weapons[ ] =
{
WP_PAIN_SAW, //int weaponNum;
PAINSAW_PRICE, //int price;
- ( 1 << S1 )|( 1 << S2 )|( 1 << S3 ), //int stages
+ STAGE_GE_1, //int stages
SLOT_WEAPON, //int slots;
"psaw", //char *weaponName;
"[yefarms]Pain Saw", //char *humanName;
@@ -3411,7 +3418,7 @@ static const weaponAttributes_t bg_weapons[ ] =
{
WP_SHOTGUN, //int weaponNum;
SHOTGUN_PRICE, //int price;
- ( 1 << S1 )|( 1 << S2 )|( 1 << S3 ), //int stages
+ STAGE_GE_3, //int stages
SLOT_WEAPON, //int slots;
"shotgun", //char *weaponName;
"[yefarms]Shotgun", //char *humanName;
@@ -3438,7 +3445,7 @@ static const weaponAttributes_t bg_weapons[ ] =
{
WP_LAS_GUN, //int weaponNum;
LASGUN_PRICE, //int price;
- ( 1 << S1 )|( 1 << S2 )|( 1 << S3 ), //int stages
+ STAGE_GE_2, //int stages
SLOT_WEAPON, //int slots;
"lgun", //char *weaponName;
"[yefarms]Las Gun", //char *humanName;
@@ -3449,11 +3456,11 @@ static const weaponAttributes_t bg_weapons[ ] =
qfalse, //int infiniteAmmo;
qtrue, //int usesEnergy;
LASGUN_REPEAT, //int repeatRate1;
- 0, //int repeatRate2;
+ LASGUN_REPEAT2, //int repeatRate2;
0, //int repeatRate3;
LASGUN_RELOAD, //int reloadTime;
LASGUN_K_SCALE, //float knockbackScale;
- qfalse, //qboolean hasAltMode;
+ qtrue, //qboolean hasAltMode;
qfalse, //qboolean hasThirdMode;
qfalse, //qboolean canZoom;
90.0f, //float zoomFov;
@@ -3464,7 +3471,7 @@ static const weaponAttributes_t bg_weapons[ ] =
{
WP_MASS_DRIVER, //int weaponNum;
MDRIVER_PRICE, //int price;
- ( 1 << S1 )|( 1 << S2 )|( 1 << S3 ), //int stages
+ STAGE_GE_3, //int stages
SLOT_WEAPON, //int slots;
"mdriver", //char *weaponName;
"[yefarms]Mass Driver", //char *humanName;
@@ -3477,7 +3484,7 @@ static const weaponAttributes_t bg_weapons[ ] =
qtrue, //int usesEnergy;
MDRIVER_REPEAT, //int repeatRate1;
0, //int repeatRate2;
- MDRIVER_REPEAT2, //int repeatRate3;
+ MDRIVER_REPEAT2, //int repeatRate3;
MDRIVER_RELOAD, //int reloadTime;
MDRIVER_K_SCALE, //float knockbackScale;
qfalse, //qboolean hasAltMode;
@@ -3491,7 +3498,7 @@ static const weaponAttributes_t bg_weapons[ ] =
{
WP_CHAINGUN, //int weaponNum;
CHAINGUN_PRICE, //int price;
- ( 1 << S1 )|( 1 << S2 )|( 1 << S3 ), //int stages
+ STAGE_GE_3, //int stages
SLOT_WEAPON, //int slots;
"chaingun", //char *weaponName;
"[yefarms]Chaingun", //char *humanName;
@@ -3518,7 +3525,7 @@ static const weaponAttributes_t bg_weapons[ ] =
{
WP_FLAMER, //int weaponNum;
FLAMER_PRICE, //int price;
- ( 1 << S2 )|( 1 << S3 ), //int stages
+ STAGE_GE_4, //int stages
SLOT_WEAPON, //int slots;
"flamer", //char *weaponName;
"[yefarms]Flame Thrower", //char *humanName;
@@ -3545,7 +3552,7 @@ static const weaponAttributes_t bg_weapons[ ] =
{
WP_PULSE_RIFLE, //int weaponNum;
PRIFLE_PRICE, //int price;
- ( 1 << S2 )|( 1 << S3 ), //int stages
+ STAGE_GE_4, //int stages
SLOT_WEAPON, //int slots;
"prifle", //char *weaponName;
"[yefarms]Pulse Rifle", //char *humanName;
@@ -3570,7 +3577,7 @@ static const weaponAttributes_t bg_weapons[ ] =
{
WP_LUCIFER_CANNON, //int weaponNum;
LCANNON_PRICE, //int price;
- ( 1 << S3 ), //int stages
+ STAGE_GE_5, //int stages
SLOT_WEAPON, //int slots;
"lcannon", //char *weaponName;
"[yefarms]Lucifer Cannon", //char *humanName;
@@ -3597,7 +3604,7 @@ static const weaponAttributes_t bg_weapons[ ] =
{
WP_GRENADE, //int weaponNum;
GRENADE_PRICE, //int price;
- ( 1 << S2 )|( 1 << S3 ), //int stages
+ STAGE_GE_3, //int stages
SLOT_NONE, //int slots;
"grenade", //char *weaponName;
"Grenade", //char *humanName;
@@ -3622,7 +3629,7 @@ static const weaponAttributes_t bg_weapons[ ] =
{
WP_SMOKE, //int weaponNum;
SMOKE_PRICE, //int price;
- ( 1 << S1 )|( 1 << S2 )|( 1 << S3 ), //int stages
+ STAGE_GE_5, //int stages
SLOT_NONE, //int slots;
"smoke", //char *weaponName;
"Smoke", //char *weaponHumanName;
@@ -3647,7 +3654,7 @@ static const weaponAttributes_t bg_weapons[ ] =
{
WP_MINE, //int weaponNum;
MINE_PRICE, //int price;
- ( 1 << S2 )|( 1 << S3 ), //int stages
+ STAGE_GE_5, //int stages
SLOT_NONE, //int slots;
"mine", //char *weaponName;
"Mine", //char *weaponHumanName;
@@ -3672,7 +3679,7 @@ static const weaponAttributes_t bg_weapons[ ] =
{
WP_LOCKBLOB_LAUNCHER, //int weaponNum;
0, //int price;
- ( 1 << S1 )|( 1 << S2 )|( 1 << S3 ), //int stages
+ STAGE_GE_1, //int stages
SLOT_WEAPON, //int slots;
"lockblob", //char *weaponName;
"Lock Blob", //char *humanName;
@@ -3697,7 +3704,7 @@ static const weaponAttributes_t bg_weapons[ ] =
{
WP_HIVE, //int weaponNum;
0, //int price;
- ( 1 << S1 )|( 1 << S2 )|( 1 << S3 ), //int stages
+ STAGE_GE_1, //int stages
SLOT_WEAPON, //int slots;
"hive", //char *weaponName;
"Hive", //char *humanName;
@@ -3722,7 +3729,7 @@ static const weaponAttributes_t bg_weapons[ ] =
{
WP_TESLAGEN, //int weaponNum;
0, //int price;
- ( 1 << S1 )|( 1 << S2 )|( 1 << S3 ), //int stages
+ STAGE_GE_1, //int stages
SLOT_WEAPON, //int slots;
"teslagen", //char *weaponName;
"Tesla Generator", //char *humanName;
@@ -3747,7 +3754,7 @@ static const weaponAttributes_t bg_weapons[ ] =
{
WP_MGTURRET, //int weaponNum;
0, //int price;
- ( 1 << S1 )|( 1 << S2 )|( 1 << S3 ), //int stages
+ STAGE_GE_1, //int stages
SLOT_WEAPON, //int slots;
"mgturret", //char *weaponName;
"Machinegun Turret", //char *humanName;
@@ -3770,12 +3777,12 @@ static const weaponAttributes_t bg_weapons[ ] =
TEAM_HUMANS //team_t team;
},
{
- WP_MGTURRET2, //int weaponNum;
+ WP_MGTURRET2, //int weaponNum;
0, //int price;
- ( 1 << S3 ), //int stages
+ STAGE_GE_1, //int stages
SLOT_WEAPON, //int slots;
- "mgturret2", //char *weaponName;
- "Machinegun Turret2", //char *humanName;
+ "mgturret2", //char *weaponName;
+ "Machinegun Turret2", //char *humanName;
"",
0, //int maxAmmo;
0, //int maxClips;
@@ -3785,7 +3792,7 @@ static const weaponAttributes_t bg_weapons[ ] =
0, //int repeatRate2;
0, //int repeatRate3;
0, //int reloadTime;
- MGTURRET2_K_SCALE, //float knockbackScale;
+ MGTURRET2_K_SCALE, //float knockbackScale;
qfalse, //qboolean hasAltMode;
qfalse, //qboolean hasThirdMode;
qfalse, //qboolean canZoom;
@@ -3797,7 +3804,7 @@ static const weaponAttributes_t bg_weapons[ ] =
{
WP_ABUILD, //int weaponNum;
0, //int price;
- ( 1 << S1 )|( 1 << S2 )|( 1 << S3 ), //int stages
+ STAGE_GE_1, //int stages
SLOT_WEAPON, //int slots;
"abuild", //char *weaponName;
"Alien build weapon", //char *humanName;
@@ -3822,7 +3829,7 @@ static const weaponAttributes_t bg_weapons[ ] =
{
WP_ABUILD2, //int weaponNum;
0, //int price;
- ( 1 << S1 )|( 1 << S2 )|( 1 << S3 ), //int stages
+ STAGE_GE_1, //int stages
SLOT_WEAPON, //int slots;
"abuildupg", //char *weaponName;
"Alien build weapon2",//char *humanName;
@@ -3847,7 +3854,7 @@ static const weaponAttributes_t bg_weapons[ ] =
{
WP_HBUILD, //int weaponNum;
HBUILD_PRICE, //int price;
- ( 1 << S1 )|( 1 << S2 )|( 1 << S3 ), //int stages
+ STAGE_GE_1, //int stages
SLOT_WEAPON, //int slots;
"ckit", //char *weaponName;
"[yetool]Construction Kit", //char *humanName;
@@ -3923,7 +3930,7 @@ static const upgradeAttributes_t bg_upgrades[ ] =
{
UP_LIGHTARMOUR, //int upgradeNum;
LIGHTARMOUR_PRICE, //int price;
- ( 1 << S1 )|( 1 << S2 )|( 1 << S3 ), //int stages
+ STAGE_GE_1, //int stages
SLOT_TORSO|SLOT_ARMS|SLOT_LEGS, //int slots;
"larmour", //char *upgradeName;
"[yeshield]Light Armour", //char *humanName;
@@ -3937,7 +3944,7 @@ static const upgradeAttributes_t bg_upgrades[ ] =
{
UP_HELMET, //int upgradeNum;
HELMET_PRICE, //int price;
- ( 1 << S2 )|( 1 << S3 ), //int stages
+ STAGE_GE_3, //int stages
SLOT_HEAD, //int slots;
"helmet", //char *upgradeName;
"[yeshield]Helmet", //char *humanName;
@@ -3952,20 +3959,20 @@ static const upgradeAttributes_t bg_upgrades[ ] =
{
UP_MEDKIT, //int upgradeNum;
MEDKIT_PRICE, //int price;
- ( 1 << S1 )|( 1 << S2 )|( 1 << S3 ), //int stages
+ STAGE_GE_1, //int stages
SLOT_NONE, //int slots;
"medkit", //char *upgradeName;
- "[yemed]Medkit", //char *humanName;
+ "[yemed]Medkit", //char *humanName;
"Basic health kit. ",
"icons/iconu_atoxin",
(SPAWN_WITH_MEDKIT ? qfalse : qtrue), //qboolean purchasable
- qtrue, //qboolean usable
+ qtrue, //qboolean usable
TEAM_HUMANS //team_t team;
},
{
UP_BIOKIT, //int upgradeNum;
BIOKIT_PRICE, //int price;
- ( 1 << S2 )|( 1 << S3 ), //int stages
+ STAGE_GE_2, //int stages
SLOT_NONE, //int slots;
"biokit", //char *upgradeName;
"[yebiok]Biokit", //char *humanName;
@@ -3980,7 +3987,7 @@ static const upgradeAttributes_t bg_upgrades[ ] =
{
UP_CLOAK, //int upgradeNum;
CLOAK_PRICE, //int price;
- ( 1 << S2 )|( 1 << S3 ),//int stages
+ STAGE_GE_4, //int stages
SLOT_NONE, //int slots;
"cloak", //char *upgradeName;
"[yecloa]Cloak", //char *humanName;
@@ -3996,7 +4003,7 @@ static const upgradeAttributes_t bg_upgrades[ ] =
{
UP_BATTPACK, //int upgradeNum;
BATTPACK_PRICE, //int price;
- ( 1 << S1 )|( 1 << S2 )|( 1 << S3 ), //int stages
+ STAGE_GE_3, //int stages
SLOT_BACKPACK, //int slots;
"battpack", //char *upgradeName;
"[yebat]Battery Pack", //char *humanName;
@@ -4010,7 +4017,7 @@ static const upgradeAttributes_t bg_upgrades[ ] =
{
UP_JETPACK, //int upgradeNum;
JETPACK_PRICE, //int price;
- ( 1 << S2 )|( 1 << S3 ), //int stages
+ STAGE_GE_4, //int stages
SLOT_BACKPACK, //int slots;
"jetpack", //char *upgradeName;
"[yejet]Jet Pack", //char *humanName;
@@ -4025,7 +4032,7 @@ static const upgradeAttributes_t bg_upgrades[ ] =
{
UP_BATTLESUIT, //int upgradeNum;
BSUIT_PRICE, //int price;
- ( 1 << S3 ), //int stages
+ STAGE_GE_5, //int stages
SLOT_HEAD|SLOT_TORSO|SLOT_ARMS|SLOT_LEGS|SLOT_BACKPACK, //int slots;
"bsuit", //char *upgradeName;
"[yeshield]Battlesuit", //char *humanName;
@@ -4040,7 +4047,7 @@ static const upgradeAttributes_t bg_upgrades[ ] =
{
UP_GRENADE, //int upgradeNum;
GRENADE_PRICE, //int price;
- ( 1 << S2 )|( 1 << S3 ),//int stages
+ STAGE_GE_4, //int stages
SLOT_NONE, //int slots;
"gren", //char *upgradeName;
"[yenade]Explosive Grenade", //char *humanName;
@@ -4054,7 +4061,7 @@ static const upgradeAttributes_t bg_upgrades[ ] =
{
UP_MINE, //int upgradeNum;
MINE_PRICE, //int price;
- ( 1 << S2 )|( 1 << S3 ),//int stages
+ STAGE_GE_5, //int stages
SLOT_NONE, //int slots;
"min", //char *upgradeName;
"[yenade]Mine", //char *upgradeHumanName;
@@ -4065,11 +4072,11 @@ static const upgradeAttributes_t bg_upgrades[ ] =
TEAM_HUMANS //WUTeam_t team;
},
{
- UP_SMOKE, //int upgradeNum;
- SMOKE_PRICE, //int price;
- ( 1 << S1 )|( 1 << S2 )|( 1 << S3 ),//int stages
+ UP_SMOKE, //int upgradeNum;
+ SMOKE_PRICE, //int price;
+ STAGE_GE_5, //int stages
SLOT_NONE, //int slots;
- "smo", //char *upgradeName;
+ "smo", //char *upgradeName;
"[yenade]Smoke Grenade", //char *upgradeHumanName;
"",
0,
@@ -4080,7 +4087,7 @@ static const upgradeAttributes_t bg_upgrades[ ] =
{
UP_AMMO, //int upgradeNum;
0, //int price;
- ( 1 << S1 )|( 1 << S2 )|( 1 << S3 ), //int stages
+ STAGE_GE_1, //int stages
SLOT_NONE, //int slots;
"ammo", //char *upgradeName;
"[yeammo]Ammunition", //char *humanName;
diff --git a/src/game/bg_pmove.c b/src/game/bg_pmove.c
index 9fad4f4..62151f4 100644
--- a/src/game/bg_pmove.c
+++ b/src/game/bg_pmove.c
@@ -507,9 +507,11 @@ static float PM_CmdScale( usercmd_t *cmd )
if( BG_Class( pm->ps->stats[ STAT_CLASS ] )->jumpMagnitude == 0.0f )
cmd->upmove = 0;
+ /* Commented out as the following seems to cause swimming up/down issues for aliens
//prevent speed distortions for non ducking classes
if( !( pm->ps->pm_flags & PMF_DUCKED ) && pm->ps->pm_type != PM_JETPACK && cmd->upmove < 0 )
cmd->upmove = 0;
+ */
}
max = abs( cmd->forwardmove );
@@ -1204,7 +1206,6 @@ static void PM_WaterMove( void )
return;
}
-#if 0
// jump = head for surface
if ( pm->cmd.upmove >= 10 ) {
if (pm->ps->velocity[2] > -300) {
@@ -1217,7 +1218,6 @@ static void PM_WaterMove( void )
}
}
}
-#endif
PM_Friction( );
@@ -3064,6 +3064,7 @@ static void PM_Weapon( void )
qboolean attack1 = pm->cmd.buttons & BUTTON_ATTACK;
qboolean attack2 = pm->cmd.buttons & BUTTON_ATTACK2;
qboolean attack3 = pm->cmd.buttons & BUTTON_USE_HOLDABLE;
+ int minAmmo;
// Ignore weapons in some cases
if( pm->ps->persistant[ PERS_SPECSTATE ] != SPECTATOR_NOT )
@@ -3323,8 +3324,12 @@ static void PM_Weapon( void )
return;
}
+ if ( pm->ps->weapon == WP_LAS_GUN && attack2 )
+ minAmmo = 20;
+ else minAmmo = 1;
+
// check for out of ammo
- if( !pm->ps->ammo && !pm->ps->clips && !BG_Weapon( pm->ps->weapon )->infiniteAmmo )
+ if( pm->ps->ammo < minAmmo && !pm->ps->clips && !BG_Weapon( pm->ps->weapon )->infiniteAmmo )
{
if( attack1 || ( BG_Weapon( pm->ps->weapon )->hasAltMode && attack2 ) || ( BG_Weapon( pm->ps->weapon )->hasThirdMode && attack3 ) )
{
@@ -3723,22 +3728,35 @@ static void PM_Weapon( void )
( pm->ps->weapon == WP_ALEVEL4 && attack3 )||
( pm->ps->weapon == WP_ALEVEL5 && attack3 ))
{
- // Special case for md third mode, need a bat for function (6+1)
- if( (pm->ps->weapon == WP_MASS_DRIVER) && attack3 )
- pm->ps->ammo -= 7;
- //prevent removing ammo from player if plasma isnt working yet but still eats all ammo if player has ammo >6 and no s3
- if( (pm->ps->weapon == WP_MASS_DRIVER) && attack3 && pm->ps->ammo < 7 )
- pm->ps->ammo += 1;
- // Special case for lcannon
- if( (pm->ps->weapon == WP_LUCIFER_CANNON) && attack1 && !attack2 )
- pm->ps->ammo -= ( pm->ps->stats[ STAT_MISC ] * LCANNON_CHARGE_AMMO +
- LCANNON_CHARGE_TIME_MAX - 1 ) / LCANNON_CHARGE_TIME_MAX;
-
- if( (pm->ps->weapon == WP_FLAMER) && attack1 && !attack2 )
- pm->ps->ammo -= ( pm->ps->stats[ STAT_MISC ] * FLAMER_CHARGE_AMMO +
- FLAMER_CHARGE_TIME_MAX - 1 ) / FLAMER_CHARGE_TIME_MAX;
- else
- pm->ps->ammo--;
+ switch( pm->ps->weapon ) {
+ case WP_MASS_DRIVER:
+ if( attack3 ) {
+ pm->ps->ammo -= 7;
+ if( pm->ps->ammo < 7 ) pm->ps->ammo += 1;
+ } else pm->ps->ammo--;
+ break;
+ case WP_LUCIFER_CANNON:
+ if( attack1 && !attack2 ) {
+ pm->ps->ammo -= ( pm->ps->stats[ STAT_MISC ] * LCANNON_CHARGE_AMMO +
+ LCANNON_CHARGE_TIME_MAX - 1 ) / LCANNON_CHARGE_TIME_MAX;
+ } else pm->ps->ammo--;
+ break;
+ case WP_FLAMER:
+ if( attack1 && !attack2 ) {
+ pm->ps->ammo -= ( pm->ps->stats[ STAT_MISC ] * FLAMER_CHARGE_AMMO +
+ FLAMER_CHARGE_TIME_MAX - 1 ) / FLAMER_CHARGE_TIME_MAX;
+ } else pm->ps->ammo--;
+ break;
+ case WP_LAS_GUN:
+ if( attack2 ) {
+ pm->ps->ammo -= 25;
+ } else pm->ps->ammo--;
+ break;
+ default:
+ pm->ps->ammo--;
+ break;
+ }
+
// Stay on the safe side
if( pm->ps->ammo < 0 )
pm->ps->ammo = 0;
diff --git a/src/game/bg_public.h b/src/game/bg_public.h
index 7ce0d12..9109a35 100644
--- a/src/game/bg_public.h
+++ b/src/game/bg_public.h
@@ -961,7 +961,9 @@ typedef enum
{
S1,
S2,
- S3
+ S3,
+ S4,
+ S5
} stage_t;
#define MAX_BUILDABLE_MODELS 4
diff --git a/src/game/g_active.c b/src/game/g_active.c
index 9a4eb00..fc32ed6 100644
--- a/src/game/g_active.c
+++ b/src/game/g_active.c
@@ -1100,16 +1100,15 @@ void G_ArmaFreeLove( gentity_t *ent )
for( i = 0; i < g_maxclients.integer; i++ )
{
- cl = level.clients + i;
+ cl = level.clients + i;
- if( cl->ps.stats[ STAT_TEAM ] == TEAM_ALIENS )
- G_AddCreditToClient( cl, 7200, qtrue );
- else if( cl->ps.stats[ STAT_TEAM ] == TEAM_HUMANS )
- G_AddCreditToClient( cl, 4000, qtrue );
- }
- trap_SendServerCommand( -1, "print \"^5A flying hotdog does its weener magic and converts buildings into pure joy!\n\"" );
- G_Sound( ent, CHAN_VOICE, G_SoundIndex( "sound/edge/hdoglove.wav" ) );
-
+ if( cl->ps.stats[ STAT_TEAM ] == TEAM_ALIENS )
+ G_AddCreditToClient( cl, g_armageddonCreditAmount.integer, qtrue );
+ else if( cl->ps.stats[ STAT_TEAM ] == TEAM_HUMANS )
+ G_AddCreditToClient( cl, g_armageddonCreditAmount.integer, qtrue );
+ }
+ trap_SendServerCommand( -1, "print \"^5A flying hotdog does its weener magic and converts buildings into pure joy!\n\"" );
+ G_Sound( ent, CHAN_VOICE, G_SoundIndex( "sound/edge/hdoglove.wav" ) );
}
diff --git a/src/game/g_buildable.c b/src/game/g_buildable.c
index 954a546..3783053 100644
--- a/src/game/g_buildable.c
+++ b/src/game/g_buildable.c
@@ -1646,92 +1646,115 @@ void G_Push( gentity_t *self )
vec3_t range = { PUSH_RANGE, PUSH_RANGE, PUSH_RANGE };
vec3_t mins, maxs;
int i, num;
-// int a;
gentity_t *enemy;
vec3_t start,dir,end;
float force;
-
+ qboolean active = qfalse;
self->nextthink = level.time + PUSH_REPEAT;
VectorAdd( self->s.origin, range, maxs );
VectorSubtract( self->s.origin, range, mins );
-
- self->powered = G_FindPower( self, qfalse );
+ self->powered = G_FindPower( self, qfalse );
if( !self->spawned ) {
return;
- }
+ }
if( !self->powered ) {
- G_SetIdleBuildableAnim( self, BANIM_CONSTRUCT1 );
+ G_SetIdleBuildableAnim( self, BANIM_CONSTRUCT1 );
return;
- }
-
- if( self->powered )
- {
+ }
if( self->spawned && self->health > 0 && self->powered )
{
num = trap_EntitiesInBox( mins, maxs, entityList, MAX_GENTITIES );
+
for( i = 0; i < num; i++ )
{
enemy = &g_entities[ entityList[ i ] ];
if( enemy->flags & FL_NOTARGET )
continue;
-
if( !G_Visible( self, enemy, CONTENTS_SOLID ) )
- continue;
-
+ continue;
if (enemy->client && enemy->client->notrackEndTime >= level.time)
continue;
+ if( enemy->client && enemy->client->ps.stats[ STAT_TEAM ] != TEAM_HUMANS )
+ {
+ if (enemy == self)
+ continue;
- if( enemy->client && enemy->client->ps.stats[ STAT_TEAM ] == TEAM_ALIENS )
- {
- if (enemy == self)
- continue;
+ if (!enemy->client)
+ continue;
- if (!enemy->client)
- continue;
+ if (enemy == self->parent)
+ continue;
- if (enemy == self->parent)
- continue;
+ if (!enemy->takedamage)
+ continue;
- if (!enemy->takedamage)
- continue;
+ active = qtrue;
+ break;
+ }
+ }
+
+ if (active)
+ {
+ for( i = 0; i < num; i++ )
+ {
+ enemy = &g_entities[ entityList[ i ] ];
- if ( enemy->client->ps.stats[ STAT_CLASS ] == PCL_ALIEN_LEVEL5 )
- force = PUSH_FORCE;
- else
- force = WEAK_PUSH_FORCE;
+ if( enemy->flags & FL_NOTARGET )
+ continue;
- VectorCopy(enemy->r.currentOrigin, start);
- VectorCopy(self->r.currentOrigin, end);
- VectorSubtract(end, start, dir);
- VectorNormalize(dir);
- VectorScale(dir, force, enemy->client->ps.velocity);
- VectorCopy(dir, enemy->movedir);
- }
+ if( !G_Visible( self, enemy, CONTENTS_SOLID ) )
+ continue;
- if( enemy->client && enemy->client->ps.stats[ STAT_TEAM ] == TEAM_ALIENS )
- {
- // start the attack animation
- G_AddEvent( self, EV_FORCE_FIELD, DirToByte( self->s.origin2 ) );
+ if (enemy->client && enemy->client->notrackEndTime >= level.time)
+ continue;
+
+ if( enemy->client && enemy->client->ps.stats[ STAT_TEAM ] != TEAM_NONE )
+ {
+ if (enemy == self)
+ continue;
+
+ if (!enemy->client)
+ continue;
+
+ if (enemy == self->parent)
+ continue;
+
+ if (!enemy->takedamage)
+ continue;
+
+ if ( enemy->client->ps.stats[ STAT_CLASS ] == PCL_ALIEN_LEVEL5 )
+ force = PUSH_FORCE;
+ else
+ force = WEAK_PUSH_FORCE;
+
+ VectorCopy(enemy->r.currentOrigin, start);
+ VectorCopy(self->r.currentOrigin, end);
+ VectorSubtract(end, start, dir);
+ VectorNormalize(dir);
+ VectorScale(dir, force, enemy->client->ps.velocity);
+ VectorCopy(dir, enemy->movedir);
+ }
+ }
+
+ // start the attack animation
+ G_AddEvent( self, EV_FORCE_FIELD, DirToByte( self->s.origin2 ) );
- if( level.time >= self->timestamp + 500 )
- {
- self->timestamp = level.time;
- G_SetBuildableAnim( self, BANIM_ATTACK1, qfalse );
- }
- return;
+ if( level.time >= self->timestamp + 500 )
+ {
+ self->timestamp = level.time;
+ G_SetBuildableAnim( self, BANIM_ATTACK1, qfalse );
}
}
}
}
-}
/*
diff --git a/src/game/g_combat.c b/src/game/g_combat.c
index 51b7005..c79594d 100644
--- a/src/game/g_combat.c
+++ b/src/game/g_combat.c
@@ -299,8 +299,18 @@ float G_InstantRewardAttacker( gentity_t *self, gentity_t *target, float damage
value *= G_RewardScaleFactor( self, target, G_TeamRewardScaleFactor( target ) );
- if( value > 0 )
+ if( value > 0 ) {
G_AddCreditToClient( self->client, value, qtrue );
+ if( self->client->ps.stats[ STAT_TEAM ] == TEAM_ALIENS ) {
+ trap_Cvar_Set( "g_alienCredits",
+ va( "%d", (int) (g_alienCredits.integer + value) ) );
+ trap_Cvar_Update( &g_alienCredits );
+ } else {
+ trap_Cvar_Set( "g_humanCredits",
+ va( "%d", (int) (g_humanCredits.integer + value) ) );
+ trap_Cvar_Update( &g_humanCredits );
+ }
+ }
return value;
}
@@ -391,11 +401,11 @@ float G_RewardAttackers( gentity_t *self )
if( player->client->ps.stats[ STAT_TEAM ] == TEAM_ALIENS ) {
level.alienRewardKills += killValue;
G_AddCreditToClient( player->client, g_KillRewardMultiplierH.value*stageValue, qtrue );
- alienCredits += stageValue;
+ alienCredits += g_KillRewardMultiplierH.value*stageValue;
} else if( player->client->ps.stats[ STAT_TEAM ] == TEAM_HUMANS ) {
level.humanRewardKills += killValue;
G_AddCreditToClient( player->client, g_KillRewardMultiplierA.value*stageValue, qtrue );
- humanCredits += stageValue;
+ humanCredits += g_KillRewardMultiplierA.value*stageValue;
}
}
}
@@ -515,6 +525,12 @@ void player_die( gentity_t *self, gentity_t *inflictor, gentity_t *attacker, int
self->client->pers.netname, killerName ) );
goto finish_dying;
}
+
+ // Parent node on player used for tracking the shield projectile
+ if( self->parentNode )
+ {
+ G_FreeEntity(self->parentNode);
+ }
// broadcast the death event to everyone
ent = G_TempEntity( self->r.currentOrigin, EV_OBITUARY );
diff --git a/src/game/g_local.h b/src/game/g_local.h
index ab0809f..e437349 100644
--- a/src/game/g_local.h
+++ b/src/game/g_local.h
@@ -673,8 +673,12 @@ typedef struct
int alienStage2Time;
int alienStage3Time;
+ int alienStage4Time;
+ int alienStage5Time;
int humanStage2Time;
int humanStage3Time;
+ int humanStage4Time;
+ int humanStage5Time;
int nextCommandTime;
@@ -1147,6 +1151,11 @@ extern vmCvar_t g_minNameChangePeriod;
extern vmCvar_t g_maxNameChanges;
extern vmCvar_t g_timelimit;
extern vmCvar_t g_suddenDeathTime;
+extern vmCvar_t g_armageddonTimeStep;
+extern vmCvar_t g_armageddonInitialTimeStep;
+extern vmCvar_t g_armageddonDefensiveKillPercent;
+extern vmCvar_t g_armageddonOtherKillPercent;
+extern vmCvar_t g_armageddonCreditAmount;
extern vmCvar_t g_friendlyFire;
extern vmCvar_t g_friendlyBuildableFire;
extern vmCvar_t g_dretchPunt;
@@ -1193,11 +1202,15 @@ extern vmCvar_t g_humanCredits;
extern vmCvar_t g_humanMaxStage;
extern vmCvar_t g_humanStage2Threshold;
extern vmCvar_t g_humanStage3Threshold;
+extern vmCvar_t g_humanStage4Threshold;
+extern vmCvar_t g_humanStage5Threshold;
extern vmCvar_t g_alienStage;
extern vmCvar_t g_alienCredits;
extern vmCvar_t g_alienMaxStage;
extern vmCvar_t g_alienStage2Threshold;
extern vmCvar_t g_alienStage3Threshold;
+extern vmCvar_t g_alienStage4Threshold;
+extern vmCvar_t g_alienStage5Threshold;
extern vmCvar_t g_alienBarbsRegen2x;
extern vmCvar_t g_alienBarbsRegen3x;
extern vmCvar_t g_alienGrangerDanceBonus;
diff --git a/src/game/g_main.c b/src/game/g_main.c
index 1a4857f..45f7b03 100644
--- a/src/game/g_main.c
+++ b/src/game/g_main.c
@@ -55,6 +55,7 @@ vmCvar_t g_armageddonTimeStep;
vmCvar_t g_armageddonInitialTimeStep;
vmCvar_t g_armageddonDefensiveKillPercent;
vmCvar_t g_armageddonOtherKillPercent;
+vmCvar_t g_armageddonCreditAmount;
vmCvar_t g_friendlyFire;
vmCvar_t g_friendlyBuildableFire;
vmCvar_t g_dretchPunt;
@@ -111,11 +112,15 @@ vmCvar_t g_humanCredits;
vmCvar_t g_humanMaxStage;
vmCvar_t g_humanStage2Threshold;
vmCvar_t g_humanStage3Threshold;
+vmCvar_t g_humanStage4Threshold;
+vmCvar_t g_humanStage5Threshold;
vmCvar_t g_alienStage;
vmCvar_t g_alienCredits;
vmCvar_t g_alienMaxStage;
vmCvar_t g_alienStage2Threshold;
vmCvar_t g_alienStage3Threshold;
+vmCvar_t g_alienStage4Threshold;
+vmCvar_t g_alienStage5Threshold;
vmCvar_t g_alienBarbsRegen2x;
vmCvar_t g_alienBarbsRegen3x;
vmCvar_t g_alienGrangerDanceBonus;
@@ -217,6 +222,7 @@ static cvarTable_t gameCvarTable[ ] =
{ &g_armageddonInitialTimeStep, "g_armageddonInitialTimeStep", "10", CVAR_SERVERINFO | CVAR_ARCHIVE | CVAR_NORESTART, 0, qtrue },
{ &g_armageddonDefensiveKillPercent, "g_armageddonDefensiveKillPercent", "10", CVAR_SERVERINFO | CVAR_ARCHIVE | CVAR_NORESTART, 0, qtrue },
{ &g_armageddonOtherKillPercent, "g_armageddonOtherKillPercent", "5", CVAR_SERVERINFO | CVAR_ARCHIVE | CVAR_NORESTART, 0, qtrue },
+ { &g_armageddonCreditAmount, "g_armageddonCreditAmount", "500", CVAR_SERVERINFO | CVAR_ARCHIVE | CVAR_NORESTART, 0, qtrue },
{ &g_synchronousClients, "g_synchronousClients", "0", CVAR_SYSTEMINFO, 0, qfalse },
{ &g_friendlyFreeze, "g_friendlyFreeze", "0", CVAR_SERVERINFO | CVAR_ARCHIVE, 0, qfalse },
{ &g_friendlyFire, "g_friendlyFire", "0", CVAR_SERVERINFO | CVAR_ARCHIVE, 0, qtrue },
@@ -268,11 +274,15 @@ static cvarTable_t gameCvarTable[ ] =
{ &g_humanMaxStage, "g_humanMaxStage", DEFAULT_HUMAN_MAX_STAGE, 0, 0, qfalse, cv_humanMaxStage },
{ &g_humanStage2Threshold, "g_humanStage2Threshold", DEFAULT_HUMAN_STAGE2_THRESH, 0, 0, qfalse },
{ &g_humanStage3Threshold, "g_humanStage3Threshold", DEFAULT_HUMAN_STAGE3_THRESH, 0, 0, qfalse },
+ { &g_humanStage4Threshold, "g_humanStage4Threshold", DEFAULT_HUMAN_STAGE4_THRESH, 0, 0, qfalse },
+ { &g_humanStage5Threshold, "g_humanStage5Threshold", DEFAULT_HUMAN_STAGE5_THRESH, 0, 0, qfalse },
{ &g_alienStage, "g_alienStage", "0", 0, 0, qfalse },
{ &g_alienCredits, "g_alienCredits", "0", 0, 0, qfalse },
{ &g_alienMaxStage, "g_alienMaxStage", DEFAULT_ALIEN_MAX_STAGE, 0, 0, qfalse, cv_alienMaxStage },
{ &g_alienStage2Threshold, "g_alienStage2Threshold", DEFAULT_ALIEN_STAGE2_THRESH, 0, 0, qfalse },
{ &g_alienStage3Threshold, "g_alienStage3Threshold", DEFAULT_ALIEN_STAGE3_THRESH, 0, 0, qfalse },
+ { &g_alienStage4Threshold, "g_alienStage4Threshold", DEFAULT_ALIEN_STAGE4_THRESH, 0, 0, qfalse },
+ { &g_alienStage5Threshold, "g_alienStage5Threshold", DEFAULT_ALIEN_STAGE5_THRESH, 0, 0, qfalse },
{ &g_alienGrangerDanceBonus, "g_alienGrangerDanceBonus", "5", 0, 0, qfalse },
{ &g_alienBarbsRegen2x, "g_alienBarbsRegen2x", "1.4", CVAR_ARCHIVE, 0, qfalse },
{ &g_alienBarbsRegen3x, "g_alienBarbsRegen3x", "1.6", CVAR_ARCHIVE, 0, qfalse },
@@ -615,8 +625,8 @@ void G_InitGame( int levelTime, int randomSeed, int restart )
memset( &level, 0, sizeof( level ) );
level.time = levelTime;
level.startTime = levelTime;
- level.alienStage2Time = level.alienStage3Time =
- level.humanStage2Time = level.humanStage3Time = level.startTime;
+ level.alienStage2Time = level.alienStage3Time = level.alienStage4Time = level.alienStage5Time =
+ level.humanStage2Time = level.humanStage3Time = level.humanStage4Time = level.humanStage5Time = level.startTime;
level.snd_fry = G_SoundIndex( "sound/misc/fry.wav" ); // FIXME standing in lava / slime
level.humanRewardKills = level.alienRewardKills = 0.0f;
trap_Cvar_Set( "g_version", G_MOD_VERSION );
@@ -1392,9 +1402,7 @@ void G_CalculateStages( void )
level.alienStage2Time = level.time;
lastAlienStageModCount = g_alienStage.modificationCount;
G_LogPrintf("Stage: A 2: Aliens reached Stage 2\n");
- }
-
- if( g_alienCredits.integer >=
+ } else if( g_alienCredits.integer >=
(int)( ceil( (float)g_alienStage3Threshold.integer * alienPlayerCountMod ) ) &&
g_alienStage.integer == S2 && g_alienMaxStage.integer > S2 )
{
@@ -1402,6 +1410,22 @@ void G_CalculateStages( void )
level.alienStage3Time = level.time;
lastAlienStageModCount = g_alienStage.modificationCount;
G_LogPrintf("Stage: A 3: Aliens reached Stage 3\n");
+ } else if( g_alienCredits.integer >=
+ (int)( ceil( (float)g_alienStage4Threshold.integer * alienPlayerCountMod ) ) &&
+ g_alienStage.integer == S3 && g_alienMaxStage.integer > S3 )
+ {
+ trap_Cvar_Set( "g_alienStage", va( "%d", S4 ) );
+ level.alienStage4Time = level.time;
+ lastAlienStageModCount = g_alienStage.modificationCount;
+ G_LogPrintf("Stage: A 4: Aliens reached Stage 4\n");
+ } else if( g_alienCredits.integer >=
+ (int)( ceil( (float)g_alienStage5Threshold.integer * alienPlayerCountMod ) ) &&
+ g_alienStage.integer == S4 && g_alienMaxStage.integer > S4 )
+ {
+ trap_Cvar_Set( "g_alienStage", va( "%d", S5 ) );
+ level.alienStage5Time = level.time;
+ lastAlienStageModCount = g_alienStage.modificationCount;
+ G_LogPrintf("Stage: A 5: Aliens reached Stage 5\n");
}
if( g_humanCredits.integer >=
@@ -1412,9 +1436,7 @@ void G_CalculateStages( void )
level.humanStage2Time = level.time;
lastHumanStageModCount = g_humanStage.modificationCount;
G_LogPrintf("Stage: H 2: Humans reached Stage 2\n");
- }
-
- if( g_humanCredits.integer >=
+ } else if( g_humanCredits.integer >=
(int)( ceil( (float)g_humanStage3Threshold.integer * humanPlayerCountMod ) ) &&
g_humanStage.integer == S2 && g_humanMaxStage.integer > S2 )
{
@@ -1422,6 +1444,22 @@ void G_CalculateStages( void )
level.humanStage3Time = level.time;
lastHumanStageModCount = g_humanStage.modificationCount;
G_LogPrintf("Stage: H 3: Humans reached Stage 3\n");
+ } else if( g_humanCredits.integer >=
+ (int)( ceil( (float)g_humanStage4Threshold.integer * humanPlayerCountMod ) ) &&
+ g_humanStage.integer == S3 && g_humanMaxStage.integer > S3 )
+ {
+ trap_Cvar_Set( "g_humanStage", va( "%d", S4 ) );
+ level.humanStage4Time = level.time;
+ lastHumanStageModCount = g_humanStage.modificationCount;
+ G_LogPrintf("Stage: H 4: Humans reached Stage 4\n");
+ } else if( g_humanCredits.integer >=
+ (int)( ceil( (float)g_humanStage5Threshold.integer * humanPlayerCountMod ) ) &&
+ g_humanStage.integer == S4 && g_humanMaxStage.integer > S4 )
+ {
+ trap_Cvar_Set( "g_humanStage", va( "%d", S5 ) );
+ level.humanStage5Time = level.time;
+ lastHumanStageModCount = g_humanStage.modificationCount;
+ G_LogPrintf("Stage: H 5: Humans reached Stage 5\n");
}
if( g_alienStage.modificationCount > lastAlienStageModCount )
@@ -1432,6 +1470,10 @@ void G_CalculateStages( void )
level.alienStage2Time = level.time;
else if( g_alienStage.integer == S3 )
level.alienStage3Time = level.time;
+ else if( g_alienStage.integer == S4 )
+ level.alienStage4Time = level.time;
+ else if( g_alienStage.integer == S5 )
+ level.alienStage5Time = level.time;
lastAlienStageModCount = g_alienStage.modificationCount;
}
@@ -1444,6 +1486,10 @@ void G_CalculateStages( void )
level.humanStage2Time = level.time;
else if( g_humanStage.integer == S3 )
level.humanStage3Time = level.time;
+ else if( g_humanStage.integer == S4 )
+ level.humanStage4Time = level.time;
+ else if( g_humanStage.integer == S5 )
+ level.humanStage5Time = level.time;
lastHumanStageModCount = g_humanStage.modificationCount;
}
@@ -1452,6 +1498,10 @@ void G_CalculateStages( void )
alienNextStageThreshold = (int)( ceil( (float)g_alienStage2Threshold.integer * alienPlayerCountMod ) );
else if( g_alienStage.integer == S2 && g_alienMaxStage.integer > S2 )
alienNextStageThreshold = (int)( ceil( (float)g_alienStage3Threshold.integer * alienPlayerCountMod ) );
+ else if( g_alienStage.integer == S3 && g_alienMaxStage.integer > S3 )
+ alienNextStageThreshold = (int)( ceil( (float)g_alienStage4Threshold.integer * alienPlayerCountMod ) );
+ else if( g_alienStage.integer == S4 && g_alienMaxStage.integer > S4 )
+ alienNextStageThreshold = (int)( ceil( (float)g_alienStage5Threshold.integer * alienPlayerCountMod ) );
else
alienNextStageThreshold = -1;
@@ -1459,6 +1509,10 @@ void G_CalculateStages( void )
humanNextStageThreshold = (int)( ceil( (float)g_humanStage2Threshold.integer * humanPlayerCountMod ) );
else if( g_humanStage.integer == S2 && g_humanMaxStage.integer > S2 )
humanNextStageThreshold = (int)( ceil( (float)g_humanStage3Threshold.integer * humanPlayerCountMod ) );
+ else if( g_humanStage.integer == S3 && g_humanMaxStage.integer > S3 )
+ humanNextStageThreshold = (int)( ceil( (float)g_humanStage4Threshold.integer * humanPlayerCountMod ) );
+ else if( g_humanStage.integer == S4 && g_humanMaxStage.integer > S4 )
+ humanNextStageThreshold = (int)( ceil( (float)g_humanStage5Threshold.integer * humanPlayerCountMod ) );
else
humanNextStageThreshold = -1;
@@ -1908,7 +1962,7 @@ void G_SendGameStat( team_t team )
}
Com_sprintf( data, BIG_INFO_STRING,
- "%s %s T:%c A:%f H:%f M:%s D:%d SD:%d AS:%d AS2T:%d AS3T:%d HS:%d HS2T:%d HS3T:%d CL:%d",
+ "%s %s T:%c A:%f H:%f M:%s D:%d SD:%d AS:%d AS2T:%d AS3T:%d AS4T:%d AS5T:%d HS:%d HS2T:%d HS3T:%d HS4T: %d HS5T: %d CL:%d",
Q3_VERSION,
g_tag.string,
teamChar,
@@ -1920,9 +1974,13 @@ void G_SendGameStat( team_t team )
g_alienStage.integer,
level.alienStage2Time - level.startTime,
level.alienStage3Time - level.startTime,
+ level.alienStage4Time - level.startTime,
+ level.alienStage5Time - level.startTime,
g_humanStage.integer,
level.humanStage2Time - level.startTime,
level.humanStage3Time - level.startTime,
+ level.humanStage4Time - level.startTime,
+ level.humanStage5Time - level.startTime,
level.numConnectedClients );
dataLength = strlen( data );
@@ -2227,7 +2285,8 @@ void CheckExitRules( void )
LogExit( "Aliens win." );
G_MapLog_Result( 'a' );
}
- else if( level.time > level.suddenDeathBeginTime/2 &&
+ else if( level.suddenDeathBeginTime != 0 &&
+ level.time > level.suddenDeathBeginTime/2 &&
level.numAlienClients == 0 && level.numHumanClients == 0 )
{
// Close to sudden death started but no clients connected
diff --git a/src/game/g_missile.c b/src/game/g_missile.c
index aaa1f2b..0cf7c5d 100644
--- a/src/game/g_missile.c
+++ b/src/game/g_missile.c
@@ -1007,6 +1007,160 @@ gentity_t *launch_grenade( gentity_t *self, vec3_t start, vec3_t dir )
}
/*
+=============
+Lasgun shield
+=============
+*/
+
+void G_LasgunPush( gentity_t *self )
+{
+ int entityList[ MAX_GENTITIES ];
+ vec3_t range = { LASGUN_PUSH_RANGE, LASGUN_PUSH_RANGE, LASGUN_PUSH_RANGE };
+ vec3_t mins, maxs;
+ int i, num;
+ gentity_t *enemy;
+ vec3_t start,dir,end;
+ float force;
+ qboolean active = qfalse;
+
+ self->nextthink = level.time + LASGUN_PUSH_REPEAT;
+
+ VectorCopy( self->parent->s.origin, self->s.pos.trBase );
+ AngleVectors( self->parent->s.angles, self->s.pos.trDelta, NULL, NULL );
+ VectorCopy( self->parent->s.origin, self->r.currentOrigin );
+
+ VectorAdd( self->r.currentOrigin, range, maxs );
+ VectorSubtract( self->r.currentOrigin, range, mins );
+
+ if (self->count++ > LASGUN_PUSH_COUNT)
+ {
+ num = trap_EntitiesInBox( mins, maxs, entityList, MAX_GENTITIES );
+
+ for( i = 0; i < num; i++ )
+ {
+ enemy = &g_entities[ entityList[ i ] ];
+
+ if( enemy->flags & FL_NOTARGET )
+ continue;
+
+ if( !G_Visible( self, enemy, CONTENTS_SOLID ) )
+ continue;
+
+ if( enemy->client && enemy->client->ps.stats[ STAT_TEAM ] != TEAM_HUMANS )
+ {
+ if (!enemy->client)
+ continue;
+
+ if (enemy == self->parent)
+ continue;
+
+ if (!enemy->takedamage)
+ continue;
+
+ active = qtrue;
+ break;
+ }
+ }
+
+ if (active)
+ {
+ for( i = 0; i < num; i++ )
+ {
+ enemy = &g_entities[ entityList[ i ] ];
+
+ if( enemy->flags & FL_NOTARGET )
+ continue;
+
+ if( !G_Visible( self, enemy, CONTENTS_SOLID ) )
+ continue;
+
+ if( enemy->client && enemy->client->ps.stats[ STAT_TEAM ] != TEAM_NONE )
+ {
+ if (!enemy->client)
+ continue;
+
+ if (enemy == self->parent)
+ continue;
+
+ if (!enemy->takedamage)
+ continue;
+
+ if ( enemy->client->ps.stats[ STAT_CLASS ] == PCL_ALIEN_LEVEL5 )
+ force = LASGUN_PUSH_FORCE;
+ else
+ force = LASGUN_WEAK_FORCE;
+
+ VectorSubtract( enemy->r.currentOrigin, self->r.currentOrigin, dir);
+ VectorNormalize( dir );
+ VectorScale( dir, force, enemy->client->ps.velocity );
+ }
+ }
+ }
+ self->count = 0;
+ /*
+ if( enemy->client && enemy->client->ps.stats[ STAT_TEAM ] == TEAM_ALIENS )
+ {
+ // start the attack animation
+ G_AddEvent( self, EV_FORCE_FIELD, DirToByte( self->s.origin2 ) );
+
+ if( level.time >= self->timestamp + 500 )
+ {
+ self->timestamp = level.time;
+ G_SetBuildableAnim( self, BANIM_ATTACK1, qfalse );
+ }
+ return;
+ }
+ }
+ */
+ if( level.time >= self->timestamp ) {
+ self->freeAfterEvent = qtrue;
+ self->parent->parentNode = NULL;
+ }
+ }
+ trap_LinkEntity( self );
+}
+
+gentity_t *launch_shield( gentity_t *self, vec3_t start, vec3_t dir )
+{
+ vec3_t range = { LASGUN_PUSH_RANGE, LASGUN_PUSH_RANGE, LASGUN_PUSH_RANGE };
+ gentity_t *bolt;
+ VectorNormalize( dir );
+ bolt = G_Spawn( );
+ bolt->classname = "light";
+ bolt->pointAgainstWorld = qfalse;
+ bolt->nextthink = level.time + LASGUN_PUSH_REPEAT;
+ bolt->timestamp = level.time + LASGUN_PUSH_DURATION;
+ bolt->think = G_LasgunPush;
+ bolt->s.eType = ET_MISSILE;
+ bolt->r.svFlags = SVF_USE_CURRENT_ORIGIN;
+ bolt->s.weapon = WP_LAS_GUN;
+ // bolt->s.eFlags |= EF_BOUNCE_HALF | EF_NO_BOUNCE_SOUND;
+ bolt->s.generic1 = WPM_SECONDARY; //weaponMode
+ bolt->r.ownerNum = self->s.number;
+ bolt->parent = self;
+ bolt->damage = bolt->splashDamage = 0;
+ bolt->splashRadius = 0;
+ bolt->methodOfDeath = MOD_UNKNOWN;
+ bolt->splashMethodOfDeath = MOD_UNKNOWN;
+ // bolt->clipmask = MASK_SHOT;
+ bolt->target_ent = NULL;
+ bolt->r.mins[ 0 ] = bolt->r.mins[ 1 ] = bolt->r.mins[ 2 ] = -4.0f;
+ bolt->r.maxs[ 0 ] = bolt->r.maxs[ 1 ] = bolt->r.maxs[ 2 ] = 4.0f;
+ bolt->r.ownerNum = self->s.number; // *
+ bolt->s.time = level.time;
+ bolt->s.pos.trType = TR_STATIONARY;
+ bolt->s.pos.trTime = level.time;
+ // bolt->s.pos.trType = TR_LINEAR;
+ // bolt->s.pos.trTime = level.time - MISSILE_PRESTEP_TIME; // move a bit on the very first frame
+ VectorCopy( start, bolt->s.pos.trBase );
+ VectorScale( dir, 1, bolt->s.pos.trDelta );
+ SnapVector( bolt->s.pos.trDelta ); // save net bandwidth
+ VectorCopy( start, bolt->r.currentOrigin );
+ self->parentNode = bolt;
+ return bolt;
+}
+
+/*
=================
launch_saw
=================
diff --git a/src/game/g_weapon.c b/src/game/g_weapon.c
index aae97f9..a64f0f8 100644
--- a/src/game/g_weapon.c
+++ b/src/game/g_weapon.c
@@ -754,6 +754,13 @@ void lasGunFire( gentity_t *ent )
G_Damage( traceEnt, ent, ent, forward, tr.endpos, LASGUN_DAMAGE, 0, MOD_LASGUN );
}
+// Lasgun 2ndary (shield)
+
+void lasGunFire2( gentity_t *ent )
+{
+ launch_shield( ent, muzzle, forward );
+}
+
/*
======================================================================
PAIN SAW
@@ -1755,11 +1762,11 @@ gclient_t *client;
break;
case WP_MASS_DRIVER:
-if(g_humanStage.integer == S3 && BG_InventoryContainsUpgrade( UP_BATTPACK, ent->client->ps.stats ))
-{
- massDriverFire2( ent );
-}
- break;
+ if(g_humanStage.integer == S5 && BG_InventoryContainsUpgrade( UP_BATTPACK, ent->client->ps.stats ))
+ {
+ massDriverFire2( ent );
+ }
+ break;
case WP_ALEVEL1:
case WP_ALEVEL1_UPG:
@@ -1802,7 +1809,7 @@ void FireWeapon2( gentity_t *ent )
switch( ent->s.weapon )
{
- case WP_MACHINEGUN:
+ case WP_MACHINEGUN:
bulletFire( ent, RIFLE_SPREAD2, RIFLE_DMG2, MOD_MACHINEGUN );
break;
@@ -1829,6 +1836,10 @@ void FireWeapon2( gentity_t *ent )
case WP_FLAMER:
FlamerNormal( ent );
break;
+
+ case WP_LAS_GUN:
+ lasGunFire2( ent );
+ break;
case WP_PULSE_RIFLE:
prifleStasisFire( ent );
diff --git a/src/game/tremulous.h b/src/game/tremulous.h
index 879b290..40c0823 100644
--- a/src/game/tremulous.h
+++ b/src/game/tremulous.h
@@ -38,14 +38,18 @@ TREMULOUS EDGE MOD SRC FILE
#define FREEKILL_HUMAN LEVEL0_VALUE
#define DEFAULT_ALIEN_BUILDPOINTS "150"
#define DEFAULT_ALIEN_QUEUE_TIME "12000"
-#define DEFAULT_ALIEN_STAGE2_THRESH "12000"
-#define DEFAULT_ALIEN_STAGE3_THRESH "24000"
-#define DEFAULT_ALIEN_MAX_STAGE "2"
+#define DEFAULT_ALIEN_STAGE2_THRESH "6000"
+#define DEFAULT_ALIEN_STAGE3_THRESH "12000"
+#define DEFAULT_ALIEN_STAGE4_THRESH "18000"
+#define DEFAULT_ALIEN_STAGE5_THRESH "24000"
+#define DEFAULT_ALIEN_MAX_STAGE "4"
#define DEFAULT_HUMAN_BUILDPOINTS "150"
#define DEFAULT_HUMAN_QUEUE_TIME "8000"
-#define DEFAULT_HUMAN_STAGE2_THRESH "6000"
-#define DEFAULT_HUMAN_STAGE3_THRESH "12000"
-#define DEFAULT_HUMAN_MAX_STAGE "2"
+#define DEFAULT_HUMAN_STAGE2_THRESH "3000"
+#define DEFAULT_HUMAN_STAGE3_THRESH "6000"
+#define DEFAULT_HUMAN_STAGE4_THRESH "9000"
+#define DEFAULT_HUMAN_STAGE5_THRESH "12000"
+#define DEFAULT_HUMAN_MAX_STAGE "4"
#define DAMAGE_FRACTION_FOR_KILL 0.5f //how much damage players (versus structures) need to
#define MAXIMUM_BUILD_TIME 30000 // used for pie timer
@@ -146,7 +150,7 @@ TREMULOUS EDGE MOD SRC FILE
#define LEVEL1_VALUE AVM(270)
#define LEVEL1_HEALTH AHM(60)
#define LEVEL1_REGEN (0.03f * LEVEL1_HEALTH)
-#define LEVEL1_COST 0
+#define LEVEL1_COST 1
#define LEVEL1_UPG_SPEED 1.25f
#define LEVEL1_UPG_VALUE AVM(330)
#define LEVEL1_UPG_HEALTH AHM(80)
@@ -451,6 +455,14 @@ TREMULOUS EDGE MOD SRC FILE
#define LASGUN_RELOAD 2000
#define LASGUN_DAMAGE HDM(9)
+#define LASGUN_REPEAT2 5000
+#define LASGUN_PUSH_DURATION 4000
+#define LASGUN_PUSH_REPEAT 40
+#define LASGUN_PUSH_COUNT 10
+#define LASGUN_PUSH_RANGE 140
+#define LASGUN_PUSH_FORCE 900
+#define LASGUN_WEAK_FORCE 675
+
#define MDRIVER_PRICE 350
#define MDRIVER_CLIPSIZE 5
#define MDRIVER_MAXCLIPS 3