summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/game/#bg_misc.c#5371
1 files changed, 0 insertions, 5371 deletions
diff --git a/src/game/#bg_misc.c# b/src/game/#bg_misc.c#
deleted file mode 100644
index e5936fc..0000000
--- a/src/game/#bg_misc.c#
+++ /dev/null
@@ -1,5371 +0,0 @@
-/*
-===========================================================================
-Copyright (C) 1999-2005 Id Software, Inc.
-Copyright (C) 2000-2009 Darklegion Development
-
-This file is part of Tremulous.
-
-Tremulous is free software; you can redistribute it
-and/or modify it under the terms of the GNU General Public License as
-published by the Free Software Foundation; either version 2 of the License,
-or (at your option) any later version.
-
-Tremulous is distributed in the hope that it will be
-useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with Tremulous; if not, write to the Free Software
-Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
-===========================================================================
-*/
-/*
-===========================================================================
-TREMULOUS EDGE MOD SRC FILE
-===========================================================================
-*/
-
-// bg_misc.c -- both games misc functions, all completely stateless
-#include "../qcommon/q_shared.h"
-#include "bg_public.h"
-
-int trap_FS_FOpenFile( const char *qpath, fileHandle_t *f, fsMode_t mode );
-void trap_FS_Read( void *buffer, int len, fileHandle_t f );
-void trap_FS_Write( const void *buffer, int len, fileHandle_t f );
-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 );
-
-static const buildableAttributes_t bg_buildableList[ ] =
-{
-//ALIEN BUILDINGS
- {
- BA_A_SPAWN, //int buildNum;
- "eggpod", //char *buildName;
- "Egg", //char *humanName;
- "The most basic alien structure. It allows aliens to spawn "
- "and protect the Overmind. Without any of these, the Overmind "
- "is left nearly defenseless and defeat is imminent.",
- "team_alien_spawn", //char *entityName;
- TR_GRAVITY, //trType_t traj;
- 0.0, //float bounce;
- ASPAWN_BP, //int buildPoints;
- ( 1 << S1 )|( 1 << S2 )|( 1 << S3 ), //int stages
- ASPAWN_HEALTH, //int health;
- ASPAWN_REGEN, //int regenRate;
- ASPAWN_SPLASHDAMAGE, //int splashDamage;
- ASPAWN_SPLASHRADIUS, //int splashRadius;
- MOD_ASPAWN, //int meansOfDeath;
- TEAM_ALIENS, //int team;
- ( 1 << WP_ABUILD )|( 1 << WP_ABUILD2 ), //weapon_t buildWeapon;
- BANIM_IDLE1, //int idleAnim;
- 100, //int nextthink;
- ASPAWN_BT, //int buildTime;
- qfalse, //qboolean usable;
- 0, //int turretRange;
- 0, //int turretFireSpeed;
- WP_NONE, //weapon_t turretProjType;
- 0.0f, //float minNormal;
- qtrue, //qboolean invertNormal;
- qfalse, //qboolean creepTest;
- ASPAWN_CREEPSIZE, //int creepSize;
- qfalse, //qboolean dccTest;
- qfalse, //qboolean transparentTest;
- qfalse, //qboolean uniqueTest;
- ASPAWN_VALUE, //int value;
- },
- {
- BA_A_OVERMIND, //int buildNum;
- "overmind", //char *buildName;
- "Overmind", //char *humanName;
- "A collective consciousness that controls all the alien structures "
- "in its vicinity. It must be protected at all costs, since its "
- "death will render alien structures defenseless.",
- "team_alien_overmind", //char *entityName;
- TR_GRAVITY, //trType_t traj;
- 0.0, //float bounce;
- OVERMIND_BP, //int buildPoints;
- ( 1 << S1 )|( 1 << S2 )|( 1 << S3 ), //int stages
- OVERMIND_HEALTH, //int health;
- OVERMIND_REGEN, //int regenRate;
- OVERMIND_SPLASHDAMAGE, //int splashDamage;
- OVERMIND_SPLASHRADIUS, //int splashRadius;
- MOD_ASPAWN, //int meansOfDeath;
- TEAM_ALIENS, //int team;
- ( 1 << WP_ABUILD )|( 1 << WP_ABUILD2 ), //weapon_t buildWeapon;
- BANIM_IDLE1, //int idleAnim;
- OVERMIND_ATTACK_REPEAT,//int nextthink;
- OVERMIND_BT, //int buildTime;
- qfalse, //qboolean usable;
- 0, //int turretRange;
- 0, //int turretFireSpeed;
- WP_NONE, //weapon_t turretProjType;
- 0.0f, //float minNormal;
- qtrue, //qboolean invertNormal;
- qfalse, //qboolean creepTest;
- OVERMIND_CREEPSIZE, //int creepSize;
- qfalse, //qboolean dccTest;
- qfalse, //qboolean transparentTest;
- qtrue, //qboolean uniqueTest;
- OVERMIND_VALUE, //int value;
- },
- {
- BA_A_BARRICADE, //int buildNum;
- "barricade", //char *buildName;
- "Barricade", //char *humanName;
- "Used to obstruct corridors and doorways, hindering humans from "
- "threatening the spawns and Overmind. Barricades will shrink "
- "to allow aliens to pass over them, however.",
- "team_alien_barricade",//char *entityName;
- TR_GRAVITY, //trType_t traj;
- 0.0, //float bounce;
- BARRICADE_BP, //int buildPoints;
- ( 1 << S1 )|( 1 << S2 )|( 1 << S3 ), //int stages
- BARRICADE_HEALTH, //int health;
- BARRICADE_REGEN, //int regenRate;
- BARRICADE_SPLASHDAMAGE,//int splashDamage;
- BARRICADE_SPLASHRADIUS,//int splashRadius;
- MOD_ASPAWN, //int meansOfDeath;
- TEAM_ALIENS, //int team;
- ( 1 << WP_ABUILD )|( 1 << WP_ABUILD2 ),//weapon_t buildWeapon;
- BANIM_IDLE1, //int idleAnim;
- 100, //int nextthink;
- BARRICADE_BT, //int buildTime;
- qfalse, //qboolean usable;
- 0, //int turretRange;
- 0, //int turretFireSpeed;
- WP_NONE, //weapon_t turretProjType;
- 0.0f, //float minNormal;
- qtrue, //qboolean invertNormal;//
- qtrue, //qboolean creepTest;
- BARRICADE_CREEPSIZE, //int creepSize;
- qfalse, //qboolean dccTest;
- qfalse, //qboolean transparentTest;
- qfalse, //qboolean uniqueTest;
- BARRICADE_VALUE, //int value;
- },
- {
- BA_A_ACIDTUBE, //int buildNum;
- "acid_tube", //char *buildName;
- "Acid Tube", //char *humanName;
- "Ejects lethal poisonous acid at an approaching human. These "
- "are highly effective when used in conjunction with a trapper "
- "to hold the victim in place.",
- "team_alien_acid_tube",//char *entityName;
- TR_GRAVITY, //trType_t traj;
- 0.0, //float bounce;
- ACIDTUBE_BP, //int buildPoints;
- ( 1 << S1 )|( 1 << S2 )|( 1 << S3 ), //int stages
- ACIDTUBE_HEALTH, //int health;
- ACIDTUBE_REGEN, //int regenRate;
- ACIDTUBE_SPLASHDAMAGE, //int splashDamage;
- ACIDTUBE_SPLASHRADIUS, //int splashRadius;
- MOD_ASPAWN, //int meansOfDeath;
- TEAM_ALIENS, //int team;
- ( 1 << WP_ABUILD )|( 1 << WP_ABUILD2 ), //weapon_t buildWeapon;
- BANIM_IDLE1, //int idleAnim;
- 200, //int nextthink;
- ACIDTUBE_BT, //int buildTime;
- qfalse, //qboolean usable;
- 0, //int turretRange;
- 0, //int turretFireSpeed;
- WP_NONE, //weapon_t turretProjType;
- 0.0f, //float minNormal;
- qtrue, //qboolean invertNormal;
- qtrue, //qboolean creepTest;
- ACIDTUBE_CREEPSIZE, //int creepSize;
- qfalse, //qboolean dccTest;
- qfalse, //qboolean transparentTest;
- qfalse, //qboolean uniqueTest;
- ACIDTUBE_VALUE, //int value;
- },
- {
- BA_A_TRAPPER, //int buildNum;
- "trapper", //char *buildName;
- "Trapper", //char *humanName;
- "Fires a blob of adhesive spit at any non-alien in its line of "
- "sight. This hinders their movement, making them an easy target "
- "for other defensive structures or aliens.",
- "team_alien_trapper", //char *entityName;
- TR_GRAVITY, //trType_t traj;
- 0.0, //float bounce;
- TRAPPER_BP, //int buildPoints;
- ( 1 << S2 )|( 1 << S3 ), //int stages
- TRAPPER_HEALTH, //int health;
- TRAPPER_REGEN, //int regenRate;
- TRAPPER_SPLASHDAMAGE, //int splashDamage;
- TRAPPER_SPLASHRADIUS, //int splashRadius;
- MOD_ASPAWN, //int meansOfDeath;
- TEAM_ALIENS, //int team;
- ( 1 << WP_ABUILD2 ), //weapon_t buildWeapon;
- BANIM_IDLE1, //int idleAnim;
- 100, //int nextthink;
- TRAPPER_BT, //int buildTime;
- qfalse, //qboolean usable;
- TRAPPER_RANGE, //int turretRange;
- TRAPPER_REPEAT, //int turretFireSpeed;
- WP_LOCKBLOB_LAUNCHER, //weapon_t turretProjType;
- 0.0f, //float minNormal;
- qtrue, //qboolean invertNormal;
- qtrue, //qboolean creepTest;
- TRAPPER_CREEPSIZE, //int creepSize;
- qfalse, //qboolean dccTest;
- qtrue, //qboolean transparentTest;
- qfalse, //qboolean uniqueTest;
- TRAPPER_VALUE, //int value;
- },
- {
- BA_A_BOOSTER, //int buildNum;
- "booster", //char *buildName;
- "Booster", //char *humanName;
- "Laces the attacks of any alien that touches it with a poison "
- "that will gradually deal damage to any humans exposed to it. "
- "The booster also increases the rate of health regeneration for "
- "any nearby aliens.",
- "team_alien_booster", //char *entityName;
- TR_GRAVITY, //trType_t traj;
- 0.0, //float bounce;
- BOOSTER_BP, //int buildPoints;
- ( 1 << S2 )|( 1 << S3 ), //int stages
- BOOSTER_HEALTH, //int health;
- BOOSTER_REGEN, //int regenRate;
- BOOSTER_SPLASHDAMAGE, //int splashDamage;
- BOOSTER_SPLASHRADIUS, //int splashRadius;
- MOD_ASPAWN, //int meansOfDeath;
- TEAM_ALIENS, //int team;
- ( 1 << WP_ABUILD2 ), //weapon_t buildWeapon;
- BANIM_IDLE1, //int idleAnim;
- 100, //int nextthink;
- BOOSTER_BT, //int buildTime;
- qfalse, //qboolean usable;
- 0, //int turretRange;
- 0, //int turretFireSpeed;
- WP_NONE, //weapon_t turretProjType;
- 0.0f, //float minNormal;
- qtrue, //qboolean invertNormal;
- qtrue, //qboolean creepTest;
- BOOSTER_CREEPSIZE, //int creepSize;
- qfalse, //qboolean dccTest;
- qtrue, //qboolean transparentTest;
- qfalse, //qboolean uniqueTest;
- BOOSTER_VALUE, //int value;
- },
- {
- BA_A_HIVE, //int buildNum;
- "hive", //char *buildName;
- "Hive", //char *humanName;
- "Houses millions of tiny insectoid aliens. When a human "
- "approaches this structure, the insectoids attack.",
- "team_alien_hive", //char *entityName;
- TR_GRAVITY, //trType_t traj;
- 0.0, //float bounce;
- HIVE_BP, //int buildPoints;
- ( 1 << S3 ), //int stages
- HIVE_HEALTH, //int health;
- HIVE_REGEN, //int regenRate;
- HIVE_SPLASHDAMAGE, //int splashDamage;
- HIVE_SPLASHRADIUS, //int splashRadius;
- MOD_ASPAWN, //int meansOfDeath;
- TEAM_ALIENS, //int team;
- ( 1 << WP_ABUILD2 ), //weapon_t buildWeapon;
- BANIM_IDLE1, //int idleAnim;
- 500, //int nextthink;
- HIVE_BT, //int buildTime;
- qfalse, //qboolean usable;
- 0, //int turretRange;
- 0, //int turretFireSpeed;
- WP_HIVE, //weapon_t turretProjType;
- 0.0f, //float minNormal;
- qtrue, //qboolean invertNormal;
- qtrue, //qboolean creepTest;
- HIVE_CREEPSIZE, //int creepSize;
- qfalse, //qboolean dccTest;
- qfalse, //qboolean transparentTest;
- qfalse, //qboolean uniqueTest;
- HIVE_VALUE, //int value;
- },
- {
- BA_A_PANZER_SMALL, //int buildNum;
- "panzer_small", //char *buildName;
- "[ye]Panzer Small", //char *humanName;
- "LIGHT ORGANIC STRUCTURE\n"
- "[yei]Used for passive base defense.\n",
- "team_alien_panzer_small", //char *entityName;
- TR_GRAVITY, //trType_t traj;
- 0, //float bounce;
- PANZER_SMALL_BP, //int buildPoints;
- ( 1 << S1 )|( 1 << S2 )|( 1 << S3 ), //int stages
- PANZER_SMALL_HEALTH, //int health;
- PANZER_SMALL_REGEN, //int regenRate;
- PANZER_SMALL_SPLASHDAMAGE, //int splashDamage;
- PANZER_SMALL_SPLASHRADIUS, //int splashRadius;
- MOD_ASPAWN, //int meansOfDeath;
- TEAM_ALIENS, //int team;
- ( 1 << WP_ABUILD )|( 1 << WP_ABUILD2 ), //weapon_t buildWeapon;
- BANIM_IDLE1, //int idleAnim;
- 1000, //int nextthink;
- PANZER_SMALL_BT, //int buildTime;
- qfalse, //qboolean usable;
- 0, //int turretRange;
- 0, //int turretFireSpeed;
- WP_NONE, //weapon_t turretProjType;
- 0.0f, //float minNormal;
- qtrue, //qboolean invertNormal;
- qtrue, //qboolean creepTest;
- PANZER_SMALL_CREEPSIZE, //int creepSize;
- qfalse, //qboolean dccTest;
- qfalse, //qboolean transparentTest;
- qfalse, //qboolean uniqueTest;
- PANZER_SMALL_VALUE, //int value;
- },
- {
- BA_A_PANZER_MEDIUM, //int buildNum;
- "panzer_medium", //char *buildName;
- "[ye]Panzer Medium", //char *humanName;
- "AVERAGE ORGANIC STRUCTURE\n"
- "[yei]Used for passive base defense.\n",
- "team_alien_panzer_medium", //char *entityName;
- TR_GRAVITY, //trType_t traj;
- 0, //float bounce;
- PANZER_MEDIUM_BP, //int buildPoints;
- ( 1 << S2 )|( 1 << S3 ), //int stages
- PANZER_MEDIUM_HEALTH, //int health;
- PANZER_MEDIUM_REGEN, //int regenRate;
- PANZER_MEDIUM_SPLASHDAMAGE, //int splashDamage;
- PANZER_MEDIUM_SPLASHRADIUS, //int splashRadius;
- MOD_ASPAWN, //int meansOfDeath;
- TEAM_ALIENS, //int team;
- ( 1 << WP_ABUILD2 ), //weapon_t buildWeapon;
- BANIM_IDLE1, //int idleAnim;
- 1000, //int nextthink;
- PANZER_MEDIUM_BT, //int buildTime;
- qfalse, //qboolean usable;
- 0, //int turretRange;
- 0, //int turretFireSpeed;
- WP_NONE, //weapon_t turretProjType;
- 0.0f, //float minNormal;
- qtrue, //qboolean invertNormal;
- qtrue, //qboolean creepTest;
- PANZER_MEDIUM_CREEPSIZE, //int creepSize;
- qfalse, //qboolean dccTest;
- qfalse, //qboolean transparentTest;
- qfalse, //qboolean uniqueTest;
- PANZER_MEDIUM_VALUE, //int value;
- },
- {
- BA_A_PANZER_LARGE, //int buildNum;
- "panzer_large", //char *buildName;
- "[ye]Panzer Large", //char *humanName;
- "HEAVY ORGANIC STRUCTURE\n"
- "[yei]Used for passive base defense.\n",
- "team_alien_panzer_large", //char *entityName;
- TR_GRAVITY, //trType_t traj;
- 0, //float bounce;
- PANZER_LARGE_BP, //int buildPoints;
- ( 1 << S3 ), //int stages
- PANZER_LARGE_HEALTH, //int health;
- PANZER_LARGE_REGEN, //int regenRate;
- PANZER_LARGE_SPLASHDAMAGE, //int splashDamage;
- PANZER_LARGE_SPLASHRADIUS, //int splashRadius;
- MOD_ASPAWN, //int meansOfDeath;
- TEAM_ALIENS, //int team;
- ( 1 << WP_ABUILD2 ), //weapon_t buildWeapon;
- BANIM_IDLE1, //int idleAnim;
- 1000, //int nextthink;
- PANZER_LARGE_BT, //int buildTime;
- qfalse, //qboolean usable;
- 0, //int turretRange;
- 0, //int turretFireSpeed;
- WP_NONE, //weapon_t turretProjType;
- 0.0f, //float minNormal;
- qtrue, //qboolean invertNormal;
- qtrue, //qboolean creepTest;
- PANZER_LARGE_CREEPSIZE, //int creepSize;
- qfalse, //qboolean dccTest;
- qfalse, //qboolean transparentTest;
- qfalse, //qboolean uniqueTest;
- PANZER_LARGE_VALUE, //int value;
- },
- {
- BA_A_TENDON_SMALL, //int buildNum;
- "tendon_small", //char *buildName;
- "[ye]Tendon Small", //char *humanName;
- "LIGHT ORGANIC STRUCTURE\n"
- "[yei]Used for passive base defense or bridges.\n",
- "team_alien_tendon_small", //char *entityName;
- TR_GRAVITY, //trType_t traj;
- 0, //float bounce;
- TENDON_SMALL_BP, //int buildPoints;
- ( 1 << S1 )|( 1 << S2 )|( 1 << S3 ), //int stages
- TENDON_SMALL_HEALTH, //int health;
- TENDON_SMALL_REGEN, //int regenRate;
- TENDON_SMALL_SPLASHDAMAGE, //int splashDamage;
- TENDON_SMALL_SPLASHRADIUS, //int splashRadius;
- MOD_ASPAWN, //int meansOfDeath;
- TEAM_ALIENS, //int team;
- ( 1 << WP_ABUILD )|( 1 << WP_ABUILD2 ), //weapon_t buildWeapon;
- BANIM_IDLE1, //int idleAnim;
- 1000, //int nextthink;
- TENDON_SMALL_BT, //int buildTime;
- qfalse, //qboolean usable;
- 0, //int turretRange;
- 0, //int turretFireSpeed;
- WP_NONE, //weapon_t turretProjType;
- 0.0f, //float minNormal;
- qtrue, //qboolean invertNormal;
- qtrue, //qboolean creepTest;
- TENDON_SMALL_CREEPSIZE, //int creepSize;
- qfalse, //qboolean dccTest;
- qfalse, //qboolean transparentTest;
- qfalse, //qboolean uniqueTest;
- TENDON_SMALL_VALUE, //int value;
- },
- {
- BA_A_TENDON_MEDIUM, //int buildNum;
- "tendon_medium", //char *buildName;
- "[ye]Tendon Medium", //char *humanName;
- "AVERAGE ORGANIC STRUCTURE\n"
- "[yei]Used for passive base defense or bridges.\n"
- "50HP",
- "team_alien_tendon_medium",//char *entityName;
- TR_GRAVITY, //trType_t traj;
- 0.0, //float bounce;
- TENDON_MEDIUM_BP, //int buildPoints;
- ( 1 << S2 )|( 1 << S3 ), //int stages
- TENDON_MEDIUM_HEALTH, //int health;
- TENDON_MEDIUM_REGEN, //int regenRate;
- TENDON_MEDIUM_SPLASHDAMAGE, //int splashDamage;
- TENDON_MEDIUM_SPLASHRADIUS, //int splashRadius;
- MOD_ASPAWN, //int meansOfDeath;
- TEAM_ALIENS, //int team;
- ( 1 << WP_ABUILD2 ), //weapon_t buildWeapon;
- BANIM_IDLE1, //int idleAnim;
- 1000, //int nextthink;
- TENDON_MEDIUM_BT, //int buildTime;
- qfalse, //qboolean usable;
- 0, //int turretRange;
- 0, //int turretFireSpeed;
- WP_NONE, //weapon_t turretProjType;
- 0.0f, //float minNormal;
- qtrue, //qboolean invertNormal;
- qtrue, //qboolean creepTest;
- TENDON_MEDIUM_CREEPSIZE, //int creepSize;
- qfalse, //qboolean dccTest;
- qfalse, //qboolean transparentTest;
- qfalse, //qboolean uniqueTest;
- TENDON_MEDIUM_VALUE, //int value;
- },
- {
- BA_A_TENDON_LARGE, //int buildNum;
- "tendon_large", //char *buildName;
- "[ye]Tendon Large", //char *humanName;
- "HEAVY ORGANIC STRUCTURE\n"
- "[yei]Used for passive base defense or big bridges.\n"
- "100HP",
- "team_alien_tendon_large",//char *entityName;
- TR_GRAVITY, //trType_t traj;
- 0, //float bounce;
- TENDON_LARGE_BP, //int buildPoints;
- ( 1 << S3 ), //int stages
- TENDON_LARGE_HEALTH, //int health;
- TENDON_LARGE_REGEN, //int regenRate;
- TENDON_LARGE_SPLASHDAMAGE, //int splashDamage;
- TENDON_LARGE_SPLASHRADIUS, //int splashRadius;
- MOD_ASPAWN, //int meansOfDeath;
- TEAM_ALIENS, //int team;
- ( 1 << WP_ABUILD2 ), //weapon_t buildWeapon;
- BANIM_IDLE1, //int idleAnim;
- 1000, //int nextthink;
- TENDON_LARGE_BT, //int buildTime;
- qfalse, //qboolean usable;
- 0, //int turretRange;
- 0, //int turretFireSpeed;
- WP_NONE, //weapon_t turretProjType;
- 0.0f, //float minNormal;
- qtrue, //qboolean invertNormal;
- qtrue, //qboolean creepTest;
- TENDON_LARGE_CREEPSIZE, //int creepSize;
- qfalse, //qboolean dccTest;
- qfalse, //qboolean transparentTest;
- qfalse, //qboolean uniqueTest;
- TENDON_LARGE_VALUE, //int value;
- },
- {
- BA_A_NET, //int buildNum;
- "net", //char *buildName;
- "[ye]Net", //char *humanName;
- "LIGHT ORGANIC STRUCTURE\n"
- "[yei]Used for passive base defense.\n"
- "Can be used for camouflage.\n"
- "80HP",
- "team_alien_net",//char *entityName;
- TR_GRAVITY, //trType_t traj;
- 0, //float bounce;
- NET_BP, //int buildPoints;
- ( 1 << S2 )|( 1 << S3 ), //int stages
- NET_HEALTH, //int health;
- NET_REGEN, //int regenRate;
- NET_SPLASHDAMAGE, //int splashDamage;
- NET_SPLASHRADIUS, //int splashRadius;
- MOD_ASPAWN, //int meansOfDeath;
- TEAM_ALIENS, //int team;
- ( 1 << WP_ABUILD2 ), //weapon_t buildWeapon;
- BANIM_IDLE1, //int idleAnim;
- 1000, //int nextthink;
- NET_BT, //int buildTime;
- qfalse, //qboolean usable;
- 0, //int turretRange;
- 0, //int turretFireSpeed;
- WP_NONE, //weapon_t turretProjType;
- 0.0f, //float minNormal;
- qtrue, //qboolean invertNormal;
- qtrue, //qboolean creepTest;
- NET_CREEPSIZE, //int creepSize;
- qfalse, //qboolean dccTest;
- qfalse, //qboolean transparentTest;
- qfalse, //qboolean uniqueTest;
- NET_VALUE, //int value;
- },
- {
- BA_A_NET_SPIKE, //int buildNum;
- "net_spike", //char *buildName;
- "[ye]Net Spike", //char *humanName;
- "LIGHT ORGANIC STRUCTURE\n"
- "[yei]Used for passive base defense.\n"
- "Can be used for camouflage.\n"
- "50HP",
- "team_alien_net_spike",//char *entityName;
- TR_GRAVITY, //trType_t traj;
- 0, //float bounce;
- NET_SPIKE_BP, //int buildPoints;
- ( 1 << S1 )|( 1 << S2 )|( 1 << S3 ), //int stages
- NET_SPIKE_HEALTH, //int health;
- NET_SPIKE_REGEN, //int regenRate;
- NET_SPIKE_SPLASHDAMAGE, //int splashDamage;
- NET_SPIKE_SPLASHRADIUS, //int splashRadius;
- MOD_ASPAWN, //int meansOfDeath;
- TEAM_ALIENS, //int team;
- ( 1 << WP_ABUILD )|( 1 << WP_ABUILD2 ), //weapon_t buildWeapon;
- BANIM_IDLE1, //int idleAnim;
- 1000, //int nextthink;
- NET_SPIKE_BT, //int buildTime;
- qfalse, //qboolean usable;
- 0, //int turretRange;
- 0, //int turretFireSpeed;
- WP_NONE, //weapon_t turretProjType;
- 0.0f, //float minNormal;
- qtrue, //qboolean invertNormal;
- qtrue, //qboolean creepTest;
- NET_SPIKE_CREEPSIZE, //int creepSize;
- qfalse, //qboolean dccTest;
- qfalse, //qboolean transparentTest;
- qfalse, //qboolean uniqueTest;
- NET_SPIKE_VALUE, //int value;
- },
- {
- BA_A_INFESTATION_SLIME, //int buildNum;
- "infestation_slime", //char *buildName;
- "[ye]Infestation Slime", //char *humanName;
- "LIGHT ORGANIC INFESTATION\n"
- "[yei]Used for passive and active base defense.\n"
- "Has the ability to slow down human players.\n"
- "Nearby Humans get *sucked* in and take damage.\n"
- "250HP",
- "team_alien_infestation_slime",//char *entityName;
- TR_GRAVITY, //trType_t traj;
- 0, //float bounce;
- INFESTATION_SLIME_BP, //int buildPoints;
- ( 1 << S2 )|( 1 << S3 ), //int stages
- INFESTATION_SLIME_HEALTH, //int health;
- INFESTATION_SLIME_REGEN, //int regenRate;
- INFESTATION_SLIME_SPLASHDAMAGE, //int splashDamage;
- INFESTATION_SLIME_SPLASHRADIUS, //int splashRadius;
- MOD_ASPAWN, //int meansOfDeath;
- TEAM_ALIENS, //int team;
- ( 1 << WP_ABUILD )|( 1 << WP_ABUILD2 ), //weapon_t buildWeapon;
- BANIM_IDLE1, //int idleAnim;
- 200, //int nextthink;
- INFESTATION_SLIME_BT, //int buildTime;
- qfalse, //qboolean usable;
- 0, //int turretRange;
- 0, //int turretFireSpeed;
- WP_NONE, //weapon_t turretProjType;
- 0.0f, //float minNormal;
- qtrue, //qboolean invertNormal;
- qtrue, //qboolean creepTest;
- INFESTATION_SLIME_CREEPSIZE, //int creepSize;
- qfalse, //qboolean transparentTest;
- qfalse, //qboolean uniqueTest;
- INFESTATION_SLIME_VALUE, //int value;
- },
- {
- BA_A_INFESTATION_THICKET, //int buildNum;
- "infestation_thicket", //char *buildName;
- "[ye]Infestation Thicket", //char *humanName;
- "AVERAGE ORGANIC INFESTATION\n"
- "[yei]Used for passive base defense.\n"
- "Has the ability to slow down human players.\n"
- "It's dense undergrowth can be used for camouflage.\n",
- "team_alien_infestation_thicket", //char *entityName;
- TR_GRAVITY, //trType_t traj;
- 0, //float bounce;
- INFESTATION_THICKET_BP, //int buildPoints;
- ( 1 << S1 )|( 1 << S2 )|( 1 << S3 ), //int stages
- INFESTATION_THICKET_HEALTH, //int health;
- INFESTATION_THICKET_REGEN, //int regenRate;
- INFESTATION_THICKET_SPLASHDAMAGE, //int splashDamage;
- INFESTATION_THICKET_SPLASHRADIUS, //int splashRadius;
- MOD_ASPAWN, //int meansOfDeath;
- TEAM_ALIENS, //int team;
- ( 1 << WP_ABUILD )|( 1 << WP_ABUILD2 ),//weapon_t buildWeapon;
- BANIM_IDLE1, //int idleAnim;
- 1000, //int nextthink;
- INFESTATION_THICKET_BT, //int buildTime;
- qfalse, //qboolean usable;
- 0, //int turretRange;
- 0, //int turretFireSpeed;
- WP_NONE, //weapon_t turretProjType;
- 0.0f, //float minNormal;
- qtrue, //qboolean invertNormal;
- qtrue, //qboolean creepTest;
- INFESTATION_THICKET_CREEPSIZE, //int creepSize;
- qfalse, //qboolean dccTest;
- qfalse, //qboolean transparentTest;
- qfalse, //qboolean uniqueTest;
- INFESTATION_THICKET_VALUE, //int value;
- },
- {
- BA_A_INFESTATION_BLISTER, //int buildNum;
- "infestation_blister", //char *buildName;
- "[ye]Infestation Blister", //char *humanName;
- "HEAVY ORGANIC INFESTATION\n"
- "[yei]Used for passive base defense.\n"
- "Has the ability to slow down human players.\n"
- "Creates a creep of massive scale.\n",
- "team_alien_infestation_blister", //char *entityName;
- TR_GRAVITY, //trType_t traj;
- 0.0, //float bounce;
- INFESTATION_BLISTER_BP, //int buildPoints;
- ( 1 << S2 )|( 1 << S3 ), //int stages
- INFESTATION_BLISTER_HEALTH, //int health;
- INFESTATION_BLISTER_REGEN, //int regenRate;
- INFESTATION_BLISTER_SPLASHDAMAGE, //int splashDamage;
- INFESTATION_BLISTER_SPLASHRADIUS, //int splashRadius;
- MOD_ASPAWN, //int meansOfDeath;
- TEAM_ALIENS, //int team;
- ( 1 << WP_ABUILD2 ), //weapon_t buildWeapon;
- BANIM_IDLE1, //int idleAnim;
- 1000, //int nextthink;
- INFESTATION_BLISTER_BT, //int buildTime;
- qfalse, //qboolean usable;
- 0, //int turretRange;
- 0, //int turretFireSpeed;
- WP_NONE, //weapon_t turretProjType;
- 0.0f, //float minNormal;
- qtrue, //qboolean invertNormal;
- qtrue, //qboolean creepTest;
- INFESTATION_BLISTER_CREEPSIZE, //int creepSize;
- qfalse, //qboolean dccTest;
- qfalse, //qboolean transparentTest;
- qfalse, //qboolean uniqueTest;
- INFESTATION_BLISTER_VALUE, //int value;
- },
- {
- BA_A_REFLECTOR, //int buildNum;
- "reflector", //char *buildName;
- "[ye]Reflector", //char *humanName;
- "INTELLIGENT ORGANIC STRUCTURE\n"
- "[yei]Used for passive base defense.\n"
- "This structure is filled with mercury.\n"
- "It reflects Pulse Rifle & Lucifer shots.\n"
- "Its vulnerable to mechanical projectiles.\n",
- "team_alien_reflector", //char *entityName;
- TR_GRAVITY, //trType_t traj;
- 0.0, //float bounce;
- REFLECTOR_BP, //int buildPoints;
- ( 1 << S2 )|( 1 << S3 ), //int stages
- REFLECTOR_HEALTH, //int health;
- REFLECTOR_REGEN, //int regenRate;
- REFLECTOR_SPLASHDAMAGE, //int splashDamage;
- REFLECTOR_SPLASHRADIUS, //int splashRadius;
- MOD_ASPAWN, //int meansOfDeath;
- TEAM_ALIENS, //int team;
- ( 1 << WP_ABUILD2 ), //weapon_t buildWeapon;
- BANIM_IDLE1, //int idleAnim;
- 1000, //int nextthink;
- REFLECTOR_BT, //int buildTime;
- qfalse, //qboolean usable;
- 0, //int turretRange;
- 0, //int turretFireSpeed;
- WP_NONE, //weapon_t turretProjType;
- 0.0f, //float minNormal;
- qtrue, //qboolean invertNormal;
- qtrue, //qboolean creepTest;
- REFLECTOR_CREEPSIZE, //int creepSize;
- qfalse, //qboolean dccTest;
- qfalse, //qboolean transparentTest;
- qfalse, //qboolean uniqueTest;
- REFLECTOR_VALUE, //int value;
- },
- {
- BA_A_MUSCLE, //int buildNum;
- "muscle", //char *buildName;
- "[ye]Muscle", //char *humanName;
- "INTELLIGENT ORGANIC STRUCTURE\n"
- "[yei]Used to push alien players up.\n",
- "team_alien_muscle", //char *entityName;
- TR_GRAVITY, //trType_t traj;
- 0, //float bounce;
- MUSCLE_BP, //int buildPoints;
- ( 1 << S2 )|( 1 << S3 ), //int stages
- MUSCLE_HEALTH, //int health;
- MUSCLE_REGEN, //int regenRate;
- MUSCLE_SPLASHDAMAGE, //int splashDamage;
- MUSCLE_SPLASHRADIUS, //int splashRadius;
- MOD_ASPAWN, //int meansOfDeath;
- TEAM_ALIENS, //int team;
- ( 1 << WP_ABUILD2 ), //weapon_t buildWeapon;
- BANIM_IDLE1, //int idleAnim;
- 500, //int nextthink;
- MUSCLE_BT, //int buildTime;
- qfalse, //qboolean usable;
- 0, //int turretRange;
- 0, //int turretFireSpeed;
- WP_NONE, //weapon_t turretProjType;
- 0.0f, //float minNormal;
- qtrue, //qboolean invertNormal;
- qtrue, //qboolean creepTest;
- MUSCLE_CREEPSIZE, //int creepSize;
- qfalse, //qboolean dccTest;
- qfalse, //qboolean transparentTest;
- qfalse, //qboolean uniqueTest;
- MUSCLE_VALUE, //int value;
- },
- {
- BA_A_SPITEFUL_ABCESS, //int buildNum;
- "spiteful_abcess", //char *buildName;
- "[ye]Spiteful Abcess", //char *humanName;
- "INTELLIGENT ORGANIC STRUCTURE\n"
- "[yei]Used for active base defense.\n"
- "The glowing top contains gas.\n",
- "team_alien_spiteful_abcess", //char *entityName;
- TR_GRAVITY, //trType_t traj;
- 0.0, //float bounce;
- SPITEFUL_ABCESS_BP, //int buildPoints;
- ( 1 << S2 )|( 1 << S3 ), //int stages
- SPITEFUL_ABCESS_HEALTH, //int health;
- SPITEFUL_ABCESS_REGEN, //int regenRate;
- SPITEFUL_ABCESS_SPLASHDAMAGE, //int splashDamage;
- SPITEFUL_ABCESS_SPLASHRADIUS, //int splashRadius;
- MOD_SPITEFUL_ABCESS, //int meansOfDeath;
- TEAM_ALIENS, //int team;
- ( 1 << WP_ABUILD )|( 1 << WP_ABUILD2 ), //weapon_t buildWeapon;
- BANIM_IDLE1, //int idleAnim;
- 200, //int nextthink;
- SPITEFUL_ABCESS_BT, //int buildTime;
- qfalse, //qboolean usable;
- 0, //int turretRange;
- 0, //int turretFireSpeed;
- WP_NONE, //weapon_t turretProjType;
- 0.0f, //float minNormal;
- qtrue, //qboolean invertNormal;
- qtrue, //qboolean creepTest;
- SPITEFUL_ABCESS_CREEPSIZE, //int creepSize;
- qfalse, //qboolean dccTest;
- qfalse, //qboolean transparentTest;
- qfalse, //qboolean uniqueTest;
- SPITEFUL_ABCESS_VALUE, //int value;
- },
- {
- BA_A_COCOON, //int buildNum;
- "cocoon", //char *buildName;
- "[ye]Cocoon", //char *humanName;
- "INTELLIGENT ORGANIC STRUCTURE\n"
- "[yei]This heals your team faster\n"
- "+faster adv.goon barb regen.\n"
- "Can only be built once\n",
- "team_alien_cocoon", //char *entityName;
- TR_GRAVITY, //trType_t traj;
- 0, //float bounce;
- COCOON_BP, //int buildPoints;
- ( 1 << S3 ), //int stages
- COCOON_HEALTH, //int health;
- COCOON_REGEN, //int regenRate;
- COCOON_SPLASHDAMAGE, //int splashDamage;
- COCOON_SPLASHRADIUS, //int splashRadius;
- MOD_ASPAWN, //int meansOfDeath;
- TEAM_ALIENS, //int team;
- ( 1 << WP_ABUILD2 ), //weapon_t buildWeapon;
- BANIM_IDLE1, //int idleAnim;
- 1000, //int nextthink;
- COCOON_BT, //int buildTime;
- qfalse, //qboolean usable;
- 0, //int turretRange;
- 0, //int turretFireSpeed;
- WP_NONE, //weapon_t turretProjType;
- 0.0f, //float minNormal;
- qtrue, //qboolean invertNormal;
- qtrue, //qboolean creepTest;
- COCOON_CREEPSIZE, //int creepSize;
- qfalse, //qboolean dccTest;
- qfalse, //qboolean transparentTest;
- qtrue, //qboolean uniqueTest;
- COCOON_VALUE, //int value;
- },
- {
- BA_A_ORGANIC_BULB, //int buildNum;
- "organic_bulb", //char *buildName;
- "[ye]Organic Bulb", //char *humanName;
- "INTELLIGENT ORGANIC STRUCTURE\n"
- "[yei]Used to light spots.\n",
- "team_alien_organic_bulb", //char *entityName;
- TR_GRAVITY, //trType_t traj;
- 0.0, //float bounce;
- ORGANIC_BULB_BP, //int buildPoints;
- ( 1 << S3 ), //int stages
- ORGANIC_BULB_HEALTH, //int health;
- ORGANIC_BULB_REGEN, //int regenRate;
- ORGANIC_BULB_SPLASHDAMAGE, //int splashDamage;
- ORGANIC_BULB_SPLASHRADIUS, //int splashRadius;
- MOD_ASPAWN, //int meansOfDeath;
- TEAM_ALIENS, //int team;
- ( 1 << WP_ABUILD2 ), //weapon_t buildWeapon;
- BANIM_IDLE1, //int idleAnim;
- 1000, //int nextthink;
- ORGANIC_BULB_BT, //int buildTime;
- qfalse, //qboolean usable;
- 0, //int turretRange;
- 0, //int turretFireSpeed;
- WP_NONE, //weapon_t turretProjType;
- 0.0f, //float minNormal;
- qtrue, //qboolean invertNormal;
- qtrue, //qboolean creepTest;
- ORGANIC_BULB_CREEPSIZE, //int creepSize;
- qfalse, //qboolean dccTest;
- qfalse, //qboolean transparentTest;
- qfalse, //qboolean uniqueTest;
- ORGANIC_BULB_VALUE, //int value;
- },
- {
- BA_A_POD, //int buildNum;
- "pod", //char *buildName;
- "[ye]Pod", //char *humanName;
- "HEAVY ORGANIC STRUCTURE\n"
- "[yei]This contains on top of the Pod Stump.\n"
- "It is used to shield the top of bases.\n",
- "team_alien_pod", //char *entityName;
- TR_GRAVITY, //trType_t traj;
- 0.0, //float bounce;
- POD_BP, //int buildPoints;
- ( 1 << S3 ), //int stages
- POD_HEALTH, //int health;
- POD_REGEN, //int regenRate;
- POD_SPLASHDAMAGE, //int splashDamage;
- POD_SPLASHRADIUS, //int splashRadius;
- MOD_ASPAWN, //int meansOfDeath;
- TEAM_ALIENS, //int team;
- ( 1 << WP_ABUILD2 ), //weapon_t buildWeapon;
- BANIM_IDLE1, //int idleAnim;
- 1000, //int nextthink;
- POD_BT, //int buildTime;
- qfalse, //qboolean usable;
- 0, //int turretRange;
- 0, //int turretFireSpeed;
- WP_NONE, //weapon_t turretProjType;
- 0.0f, //float minNormal;
- qtrue, //qboolean invertNormal;
- qtrue, //qboolean creepTest;
- POD_CREEPSIZE, //int creepSize;
- qfalse, //qboolean dccTest;
- qfalse, //qboolean transparentTest;
- qfalse, //qboolean uniqueTest;
- POD_VALUE, //int value;
- },
- {
- BA_A_POD_STUMP, //int buildNum;
- "pod_stump", //char *buildName;
- "[ye]Pod Stump", //char *humanName;
- "HEAVY ORGANIC STRUCTURE\n"
- "[yei]This is the stump for Pod.\n",
- "team_alien_pod_stump", //char *entityName;
- TR_GRAVITY, //trType_t traj;
- 0.0, //float bounce;
- POD_STUMP_BP, //int buildPoints;
- ( 1 << S3 ), //int stages
- POD_STUMP_HEALTH, //int health;
- POD_STUMP_REGEN, //int regenRate;
- POD_STUMP_SPLASHDAMAGE, //int splashDamage;
- POD_STUMP_SPLASHRADIUS, //int splashRadius;
- MOD_ASPAWN, //int meansOfDeath;
- TEAM_ALIENS, //int team;
- ( 1 << WP_ABUILD2 ), //weapon_t buildWeapon;
- BANIM_IDLE1, //int idleAnim;
- 1000, //int nextthink;
- POD_STUMP_BT, //int buildTime;
- qfalse, //qboolean usable;
- 0, //int turretRange;
- 0, //int turretFireSpeed;
- WP_NONE, //weapon_t turretProjType;
- 1.0f, //float minNormal;
- qtrue, //qboolean invertNormal;
- qtrue, //qboolean creepTest;
- POD_STUMP_CREEPSIZE, //int creepSize;
- qfalse, //qboolean dccTest;
- qfalse, //qboolean transparentTest;
- qfalse, //qboolean uniqueTest;
- POD_STUMP_VALUE, //int value;
- },
- {
- BA_A_CREEPCOLONY, //int buildNum;
- "creepcolony", //char *buildName;
- "[ye]Creep colony", //char *humanName;
- "[yei]Gives your team extra buildpoints.",
- "team_alien_creepcolony" , //char *entityName;
- TR_GRAVITY, //trType_t traj;
- 0.0, //float bounce;
- CREEPCOLONY_BP, //int buildPoints;
- ( 1 << S2 )|( 1 << S3 ), //int stages
- CREEPCOLONY_HEALTH, //int health;
- CREEPCOLONY_REGEN, //int regenRate;
- CREEPCOLONY_SPLASHDAMAGE, //int splashDamage;
- CREEPCOLONY_SPLASHRADIUS, //int splashRadius;
- MOD_ASPAWN, //int meansOfDeath;
- TEAM_ALIENS, //int team;
- ( 1 << WP_ABUILD2 ), //weapon_t buildWeapon;
- BANIM_IDLE1, //int idleAnim;
- 1000, //int nextthink;
- CREEPCOLONY_BT, //int buildTime;
- qfalse, //qboolean usable;
- 0, //int turretRange;
- 0, //int turretFireSpeed;
- WP_NONE, //weapon_t turretProjType;
- 0.0f, //float minNormal;
- qtrue, //qboolean invertNormal;
- qtrue, //qboolean creepTest;
- CREEPCOLONY_CREEPSIZE, //int creepSize;
- qfalse, //qboolean dccTest;
- qfalse, //qboolean transparentTest;
- qfalse, //qboolean uniqueTest;
- CREEPCOLONY_VALUE, //int value;
- },
-
-//HUMAN BUILDINGS
- {
- BA_H_SPAWN, //int buildNum;
- "telenode", //char *buildName;
- "Telenode", //char *humanName;
- "The most basic human structure. It provides a means for humans "
- "to enter the battle arena. Without any of these the humans "
- "cannot spawn and defeat is imminent.",
- "team_human_spawn", //char *entityName;
- TR_GRAVITY, //trType_t traj;
- 0.0, //float bounce;
- HSPAWN_BP, //int buildPoints;
- ( 1 << S1 )|( 1 << S2 )|( 1 << S3 ), //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;
- ( 1 << WP_HBUILD ), //weapon_t buildWeapon;
- BANIM_IDLE1, //int idleAnim;
- 100, //int nextthink;
- HSPAWN_BT, //int buildTime;
- qfalse, //qboolean usable;
- 0, //int turretRange;
- 0, //int turretFireSpeed;
- WP_NONE, //weapon_t turretProjType;
- 0.0f, //float minNormal;
- qfalse, //qboolean invertNormal;
- qfalse, //qboolean creepTest;
- 0, //int creepSize;
- qfalse, //qboolean dccTest;
- qtrue, //qboolean transparentTest;
- qfalse, //qboolean uniqueTest;
- HSPAWN_VALUE, //int value;
- },
- {
- BA_H_MGTURRET, //int buildNum;
- "mgturret", //char *buildName;
- "Machinegun Turret", //char *humanName;
- "Automated base defense that is effective against large targets "
- "but slow to begin firing. Should always be "
- "backed up by physical support.",
- "team_human_mgturret", //char *entityName;
- TR_GRAVITY, //trType_t traj;
- 0.0, //float bounce;
- MGTURRET_BP, //int buildPoints;
- ( 1 << S1 )|( 1 << S2 )|( 1 << S3 ), //int stages
- MGTURRET_HEALTH, //int health;
- 0, //int regenRate;
- MGTURRET_SPLASHDAMAGE, //int splashDamage;
- MGTURRET_SPLASHRADIUS, //int splashRadius;
- MOD_HSPAWN, //int meansOfDeath;
- TEAM_HUMANS, //int team;
- ( 1 << WP_HBUILD ), //weapon_t buildWeapon;
- BANIM_IDLE1, //int idleAnim;
- 50, //int nextthink;
- MGTURRET_BT, //int buildTime;
- qfalse, //qboolean usable;
- MGTURRET_RANGE, //int turretRange;
- MGTURRET_REPEAT, //int turretFireSpeed;
- WP_MGTURRET, //weapon_t turretProjType;
- 0.0f, //float minNormal;
- qtrue, //qboolean invertNormal;
- qfalse, //qboolean creepTest;
- 0, //int creepSize;
- qfalse, //qboolean dccTest;
- qtrue, //qboolean transparentTest;
- qfalse, //qboolean uniqueTest;
- MGTURRET_VALUE, //int value;
- },
- {
- BA_H_MGTURRET2, //int buildNum;
- "mgturret2", //char *buildName;
- "[ye]Flame Turret", //char *humanName;
- "Automated base defense that is effective against large targets "
- "but slow to begin firing. Should always be "
- "backed up by physical support.",
- "team_human_mgturret2", //char *entityName;
- TR_GRAVITY, //trType_t traj;
- 0.0, //float bounce;
- MGTURRET2_BP, //int buildPoints;
- ( 1 << S2 )|( 1 << S3 ), //int stages
- MGTURRET2_HEALTH, //int health;
- 0, //int regenRate;
- MGTURRET2_SPLASHDAMAGE, //int splashDamage;
- MGTURRET2_SPLASHRADIUS, //int splashRadius;
- MOD_HSPAWN, //int meansOfDeath;
- TEAM_HUMANS, //int team;
- ( 1 << WP_HBUILD ), //weapon_t buildWeapon;
- BANIM_IDLE1, //int idleAnim;
- 50, //int nextthink;
- MGTURRET2_BT, //int buildTime;
- qfalse, //qboolean usable;
- MGTURRET2_RANGE, //int turretRange;
- MGTURRET2_REPEAT, //int turretFireSpeed;
- WP_MGTURRET2, //weapon_t turretProjType;
- 0.0f, //float minNormal;
- qtrue, //qboolean invertNormal;
- qfalse, //qboolean creepTest;
- 0, //int creepSize;
- qfalse, //qboolean dccTest;
- qtrue, //qboolean transparentTest;
- qfalse, //qboolean uniqueTest;
- MGTURRET_VALUE, //int value;
- },
- {
- BA_H_TESLAGEN, //int buildNum;
- "tesla", //char *buildName;
- "Tesla Generator", //char *humanName;
- "A structure equipped with a strong electrical attack that fires "
- "instantly and always hits its target. It is effective against smaller "
- "aliens and for consolidating basic defense.",
- "team_human_tesla", //char *entityName;
- TR_GRAVITY, //trType_t traj;
- 0.0, //float bounce;
- TESLAGEN_BP, //int buildPoints;
- ( 1 << S3 ), //int stages
- TESLAGEN_HEALTH, //int health;
- 0, //int regenRate;
- TESLAGEN_SPLASHDAMAGE, //int splashDamage;
- TESLAGEN_SPLASHRADIUS, //int splashRadius;
- MOD_HSPAWN, //int meansOfDeath;
- TEAM_HUMANS, //int team;
- ( 1 << WP_HBUILD ), //weapon_t buildWeapon;
- BANIM_IDLE1, //int idleAnim;
- 150, //int nextthink;
- TESLAGEN_BT, //int buildTime;
- qfalse, //qboolean usable;
- TESLAGEN_RANGE, //int turretRange;
- TESLAGEN_REPEAT, //int turretFireSpeed;
- WP_TESLAGEN, //weapon_t turretProjType;
- 0.95f, //float minNormal;
- qtrue, //qboolean invertNormal;
- qfalse, //qboolean creepTest;
- 0, //int creepSize;
- qfalse, //qboolean dccTest;
- qtrue, //qboolean transparentTest;
- qfalse, //qboolean uniqueTest;
- TESLAGEN_VALUE, //int value;
- },
- {
- BA_H_ARMOURY, //int buildNum;
- "arm", //char *buildName;
- "Armoury", //char *humanName;
- "An essential part of the human base, providing a means "
- "to upgrade the basic human equipment. A range of upgrades "
- "and weapons are available for sale from the armoury.",
- "team_human_armoury", //char *entityName;
- TR_GRAVITY, //trType_t traj;
- 0.0, //float bounce;
- ARMOURY_BP, //int buildPoints;
- ( 1 << S1 )|( 1 << S2 )|( 1 << S3 ), //int stages
- ARMOURY_HEALTH, //int health;
- 0, //int regenRate;
- ARMOURY_SPLASHDAMAGE, //int splashDamage;
- ARMOURY_SPLASHRADIUS, //int splashRadius;
- MOD_HSPAWN, //int meansOfDeath;
- TEAM_HUMANS, //int team;
- ( 1 << WP_HBUILD ), //weapon_t buildWeapon;
- BANIM_IDLE1, //int idleAnim;
- 100, //int nextthink;
- ARMOURY_BT, //int buildTime;
- qtrue, //qboolean usable;
- 0, //int turretRange;
- 0, //int turretFireSpeed;
- WP_NONE, //weapon_t turretProjType;
- 0.0f, //float minNormal;
- qtrue, //qboolean invertNormal;
- qfalse, //qboolean creepTest;
- 0, //int creepSize;
- qfalse, //qboolean dccTest;
- qfalse, //qboolean transparentTest;
- qfalse, //qboolean uniqueTest;
- ARMOURY_VALUE, //int value;
- },
- {
- BA_H_DCC, //int buildNum;
- "dcc", //char *buildName;
- "Defence Computer", //char *humanName;
- "A structure that enables self-repair functionality in "
- "human structures. Each Defence Computer built increases "
- "repair rate slightly.",
- "team_human_dcc", //char *entityName;
- TR_GRAVITY, //trType_t traj;
- 0.0, //float bounce;
- DC_BP, //int buildPoints;
- ( 1 << S2 )|( 1 << S3 ), //int stages
- DC_HEALTH, //int health;
- 0, //int regenRate;
- DC_SPLASHDAMAGE, //int splashDamage;
- DC_SPLASHRADIUS, //int splashRadius;
- MOD_HSPAWN, //int meansOfDeath;
- TEAM_HUMANS, //int team;
- ( 1 << WP_HBUILD ), //weapon_t buildWeapon;
- BANIM_IDLE1, //int idleAnim;
- 100, //int nextthink;
- DC_BT, //int buildTime;
- qfalse, //qboolean usable;
- 0, //int turretRange;
- 0, //int turretFireSpeed;
- WP_NONE, //weapon_t turretProjType;
- 0.0f, //float minNormal;
- qtrue, //qboolean invertNormal;
- qfalse, //qboolean creepTest;
- 0, //int creepSize;
- qfalse, //qboolean dccTest;
- qfalse, //qboolean transparentTest;
- qfalse, //qboolean uniqueTest;
- DC_VALUE, //int value;
- },
- {
- BA_H_MEDISTAT, //int buildNum;
- "medistat", //char *buildName;
- "Medistation", //char *humanName;
- "A structure that automatically restores "
- "the health and stamina of any human that stands on it. "
- "It may only be used by one person at a time. This structure "
- "also issues medkits.",
- "team_human_medistat", //char *entityName;
- TR_GRAVITY, //trType_t traj;
- 0.0, //float bounce;
- MEDISTAT_BP, //int buildPoints;
- ( 1 << S1 )|( 1 << S2 )|( 1 << S3 ), //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;
- ( 1 << WP_HBUILD ), //weapon_t buildWeapon;
- BANIM_IDLE1, //int idleAnim;
- 100, //int nextthink;
- MEDISTAT_BT, //int buildTime;
- qfalse, //qboolean usable;
- 0, //int turretRange;
- 0, //int turretFireSpeed;
- WP_NONE, //weapon_t turretProjType;
- 0.0f, //float minNormal;
- qtrue, //qboolean invertNormal;
- qfalse, //qboolean creepTest;
- 0, //int creepSize;
- qfalse, //qboolean dccTest;
- qtrue, //qboolean transparentTest;
- qfalse, //qboolean uniqueTest;
- MEDISTAT_VALUE, //int value;
- },
- {
- BA_H_REACTOR, //int buildNum;
- "reactor", //char *buildName;
- "Reactor", //char *humanName;
- "All structures except the telenode rely on a reactor to operate. "
- "The reactor provides power for all the human structures either "
- "directly or via repeaters. Only one reactor can be built at a time.",
- "team_human_reactor", //char *entityName;
- TR_GRAVITY, //trType_t traj;
- 0.0, //float bounce;
- REACTOR_BP, //int buildPoints;
- ( 1 << S1 )|( 1 << S2 )|( 1 << S3 ), //int stages
- REACTOR_HEALTH, //int health;
- 0, //int regenRate;
- REACTOR_SPLASHDAMAGE, //int splashDamage;
- REACTOR_SPLASHRADIUS, //int splashRadius;
- MOD_HSPAWN, //int meansOfDeath;
- TEAM_HUMANS, //int team;
- ( 1 << WP_HBUILD ), //weapon_t buildWeapon;
- BANIM_IDLE1, //int idleAnim;
- REACTOR_ATTACK_DCC_REPEAT, //int nextthink;
- REACTOR_BT, //int buildTime;
- qtrue, //qboolean usable;
- 0, //int turretRange;
- 0, //int turretFireSpeed;
- WP_NONE, //weapon_t turretProjType;
- 0.0f, //float minNormal;
- qtrue, //qboolean invertNormal;
- qfalse, //qboolean creepTest;
- 0, //int creepSize;
- qfalse, //qboolean dccTest;
- qfalse, //qboolean transparentTest;
- qtrue, //qboolean uniqueTest;
- REACTOR_VALUE, //int value;
- },
- {
- BA_H_REPEATER, //int buildNum;
- "repeater", //char *buildName;
- "Repeater", //char *humanName;
- "A power distributor that transmits power from the reactor "
- "to remote locations, so that bases may be built far "
- "from the reactor.",
- "team_human_repeater", //char *entityName;
- TR_GRAVITY, //trType_t traj;
- 0.0, //float bounce;
- REPEATER_BP, //int buildPoints;
- ( 1 << S1 )|( 1 << S2 )|( 1 << S3 ), //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;
- ( 1 << WP_HBUILD ), //weapon_t buildWeapon;
- BANIM_IDLE1, //int idleAnim;
- 100, //int nextthink;
- REPEATER_BT, //int buildTime;
- qtrue, //qboolean usable;
- 0, //int turretRange;
- 0, //int turretFireSpeed;
- WP_NONE, //weapon_t turretProjType;
- 0.0f, //float minNormal;
- qtrue, //qboolean invertNormal;
- qfalse, //qboolean creepTest;
- 0, //int creepSize;
- qfalse, //qboolean dccTest;
- qfalse, //qboolean transparentTest;
- qfalse, //qboolean uniqueTest;
- REPEATER_VALUE, //int value;
- },
- {
- BA_H_CONTAINER_SMALL, //int buildNum;
- "container_small", //char *buildName;
- "[ye]Container Small", //char *humanName;
- "SOLID STRUCTURE\n"
- "[yei]Used for passive base defense.\n"
- "This building doesn't need a powered area!\n",
- "team_human_container_small", //char *entityName;
- TR_GRAVITY, //trType_t traj;
- 0.0, //float bounce;
- CONTAINER_SMALL_BP, //int buildPoints;
- ( 1 << S1 )|( 1 << S2 )|( 1 << S3 ), //int stages
- CONTAINER_SMALL_HEALTH, //int health;
- 0, //int regenRate;
- CONTAINER_SMALL_SPLASHDAMAGE, //int splashDamage;
- CONTAINER_SMALL_SPLASHRADIUS, //int splashRadius;
- MOD_HSPAWN, //int meansOfDeath;
- TEAM_HUMANS, //int team;
- ( 1 << WP_HBUILD ), //weapon_t buildWeapon;
- BANIM_IDLE1, //int idleAnim;
- 0, //int nextthink;
- CONTAINER_SMALL_BT, //int buildTime;
- qfalse, //qboolean usable;
- 0, //int turretRange;
- 0, //int turretFireSpeed;
- WP_NONE, //weapon_t turretProjType;
- 0.0f, //float minNormal;
- qtrue, //qboolean invertNormal;
- qfalse, //qboolean creepTest;
- 0, //int creepSize;
- qfalse, //qboolean dccTest;
- qfalse, //qboolean transparentTest;
- qfalse, //qboolean uniqueTest;
- CONTAINER_SMALL_VALUE, //int value;
- },
- {
- BA_H_CONTAINER_MEDIUM, //int buildNum;
- "container_medium", //char *buildName;
- "[ye]Container Medium", //char *humanName;
- "SOLID STRUCTURE\n"
- "[yei]Used for passive base defense.\n"
- "This building doesn't need a powered area!\n",
- "team_human_container_medium", //char *entityName;
- TR_GRAVITY, //trType_t traj;
- 0.0, //float bounce;
- CONTAINER_MEDIUM_BP, //int buildPoints;
- ( 1 << S2 )|( 1 << S3 ), //int stages
- CONTAINER_MEDIUM_HEALTH, //int health;
- 0, //int regenRate;
- CONTAINER_MEDIUM_SPLASHDAMAGE, //int splashDamage;
- CONTAINER_MEDIUM_SPLASHRADIUS, //int splashRadius;
- MOD_HSPAWN, //int meansOfDeath;
- TEAM_HUMANS, //int team;
- ( 1 << WP_HBUILD ), //weapon_t buildWeapon;
- BANIM_IDLE1, //int idleAnim;
- 0, //int nextthink;
- CONTAINER_MEDIUM_BT, //int buildTime;
- qfalse, //qboolean usable;
- 0, //int turretRange;
- 0, //int turretFireSpeed;
- WP_NONE, //weapon_t turretProjType;
- 0.0f, //float minNormal;
- qtrue, //qboolean invertNormal;
- qfalse, //qboolean creepTest;
- 0, //int creepSize;
- qfalse, //qboolean dccTest;
- qfalse, //qboolean transparentTest;
- qfalse, //qboolean uniqueTest;
- CONTAINER_MEDIUM_VALUE, //int value;
- },
- {
- BA_H_CONTAINER_LARGE, //int buildNum;
- "container_large", //char *buildName;
- "[ye]Container Large", //char *humanName;
- "SOLID STRUCTURE\n"
- "[yei]Used for passive base defense.\n"
- "This building doesn't need a powered area!\n",
- "team_human_container_large", //char *entityName;
- TR_GRAVITY, //trType_t traj;
- 0.0, //float bounce;
- CONTAINER_LARGE_BP, //int buildPoints;
- ( 1 << S3 ), //int stages
- CONTAINER_LARGE_HEALTH, //int health;
- 0, //int regenRate;
- CONTAINER_LARGE_SPLASHDAMAGE, //int splashDamage;
- CONTAINER_LARGE_SPLASHRADIUS, //int splashRadius;
- MOD_HSPAWN, //int meansOfDeath;
- TEAM_HUMANS, //int team;
- ( 1 << WP_HBUILD ), //weapon_t buildWeapon;
- BANIM_IDLE1, //int idleAnim;
- 0, //int nextthink;
- CONTAINER_LARGE_BT, //int buildTime;
- qfalse, //qboolean usable;
- 0, //int turretRange;
- 0, //int turretFireSpeed;
- WP_NONE, //weapon_t turretProjType;
- 0.0f, //float minNormal;
- qtrue, //qboolean invertNormal;
- qfalse, //qboolean creepTest;
- 0, //int creepSize;
- qfalse, //qboolean dccTest;
- qfalse, //qboolean transparentTest;
- qfalse, //qboolean uniqueTest;
- CONTAINER_LARGE_VALUE, //int value;
- },
- {
- BA_H_PLATE_SMALL, //int buildNum;
- "plate_small", //char *buildName;
- "[ye]Plate Small", //char *humanName;
- "SOLID STRUCTURE\n"
- "[yei]Used for passive base defense or bridges.\n"
- "This building doesn't need a powered area!\n",
- "team_human_plate_small", //char *entityName;
- TR_GRAVITY, //trType_t traj;
- 0.0, //float bounce;
- PLATE_SMALL_BP, //int buildPoints;
- ( 1 << S1 )|( 1 << S2 )|( 1 << S3 ), //int stages
- PLATE_SMALL_HEALTH, //int health;
- 0, //int regenRate;
- PLATE_SMALL_SPLASHDAMAGE, //int splashDamage;
- PLATE_SMALL_SPLASHRADIUS, //int splashRadius;
- MOD_HSPAWN, //int meansOfDeath;
- TEAM_HUMANS, //int team;
- ( 1 << WP_HBUILD ), //weapon_t buildWeapon;
- BANIM_IDLE1, //int idleAnim;
- 0, //int nextthink;
- PLATE_SMALL_BT, //int buildTime;
- qfalse, //qboolean usable;
- 0, //int turretRange;
- 0, //int turretFireSpeed;
- WP_NONE, //weapon_t turretProjType;
- 0.0f, //float minNormal;
- qtrue, //qboolean invertNormal;
- qfalse, //qboolean creepTest;
- 0, //int creepSize;
- qfalse, //qboolean dccTest;
- qfalse, //qboolean transparentTest;
- qfalse, //qboolean uniqueTest;
- PLATE_SMALL_VALUE, //int value;
- },
- {
- BA_H_PLATE_LARGE, //int buildNum;
- "plate_large", //char *buildName;
- "[ye]Plate Large", //char *humanName;
- "SOLID STRUCTURE\n"
- "[yei]Used for passive base defense or bridges.\n"
- "This building doesn't need a powered area!\n",
- "team_human_plate_large", //char *entityName;
- TR_GRAVITY, //trType_t traj;
- 0.0, //float bounce;
- PLATE_LARGE_BP, //int buildPoints;
- ( 1 << S3 ), //int stages
- PLATE_LARGE_HEALTH, //int health;
- 0, //int regenRate;
- PLATE_LARGE_SPLASHDAMAGE, //int splashDamage;
- PLATE_LARGE_SPLASHRADIUS, //int splashRadius;
- MOD_HSPAWN, //int meansOfDeath;
- TEAM_HUMANS, //int team;
- ( 1 << WP_HBUILD ), //weapon_t buildWeapon;
- BANIM_IDLE1, //int idleAnim;
- 0, //int nextthink;
- PLATE_LARGE_BT, //int buildTime;
- qfalse, //qboolean usable;
- 0, //int turretRange;
- 0, //int turretFireSpeed;
- WP_NONE, //weapon_t turretProjType;
- 0.0f, //float minNormal;
- qtrue, //qboolean invertNormal;
- qfalse, //qboolean creepTest;
- 0, //int creepSize;
- qfalse, //qboolean dccTest;
- qfalse, //qboolean transparentTest;
- qfalse, //qboolean uniqueTest;
- PLATE_LARGE_VALUE, //int value;
- },
- {
- BA_H_FENCE, //int buildNum;
- "fence", //char *buildName;
- "[ye]Fence", //char *humanName;
- "SOLID STRUCTURE\n"
- "[yei]Used for passive base defense.\n"
- "This building doesn't need a powered area!\n",
- "team_human_fence", //char *entityName;
- TR_GRAVITY, //trType_t traj;
- 0.0, //float bounce;
- FENCE_BP, //int buildPoints;
- ( 1 << S2 )|( 1 << S3 ), //int stages
- FENCE_HEALTH, //int health;
- 0, //int regenRate;
- FENCE_SPLASHDAMAGE, //int splashDamage;
- FENCE_SPLASHRADIUS, //int splashRadius;
- MOD_HSPAWN, //int meansOfDeath;
- TEAM_HUMANS, //int team;
- ( 1 << WP_HBUILD ), //weapon_t buildWeapon;
- BANIM_IDLE1, //int idleAnim;
- 0, //int nextthink;
- FENCE_BT, //int buildTime;
- qfalse, //qboolean usable;
- 0, //int turretRange;
- 0, //int turretFireSpeed;
- WP_NONE, //weapon_t turretProjType;
- 0.0f, //float minNormal;
- qtrue, //qboolean invertNormal;
- qfalse, //qboolean creepTest;
- 0, //int creepSize;
- qfalse, //qboolean dccTest;
- qfalse, //qboolean transparentTest;
- qfalse, //qboolean uniqueTest;
- FENCE_VALUE, //int value;
- },
- {
- BA_H_FENCE_ROD, //int buildNum;
- "fence_rod", //char *buildName;
- "[ye]Fence Rod", //char *humanName;
- "SOLID STRUCTURE\n"
- "[yei]Used for passive base defense.\n"
- "This building doesn't need a powered area!\n",
- "team_human_fence_rod", //char *entityName;
- TR_GRAVITY, //trType_t traj;
- 0.0, //float bounce;
- FENCE_ROD_BP, //int buildPoints;
- ( 1 << S2 )|( 1 << S3 ), //int stages
- FENCE_HEALTH, //int health;
- 0, //int regenRate;
- FENCE_ROD_SPLASHDAMAGE, //int splashDamage;
- FENCE_ROD_SPLASHRADIUS, //int splashRadius;
- MOD_HSPAWN, //int meansOfDeath;
- TEAM_HUMANS, //int team;
- ( 1 << WP_HBUILD ), //weapon_t buildWeapon;
- BANIM_IDLE1, //int idleAnim;
- 0, //int nextthink;
- FENCE_ROD_BT, //int buildTime;
- qfalse, //qboolean usable;
- 0, //int turretRange;
- 0, //int turretFireSpeed;
- WP_NONE, //weapon_t turretProjType;
- 0.0f, //float minNormal;
- qtrue, //qboolean invertNormal;
- qfalse, //qboolean creepTest;
- 0, //int creepSize;
- qfalse, //qboolean dccTest;
- qfalse, //qboolean transparentTest;
- qfalse, //qboolean uniqueTest;
- FENCE_ROD_VALUE, //int value;
- },
- {
- BA_H_BARRIER_LINE, //int buildNum;
- "barrier_line", //char *buildName;
- "[ye]Barrier Line", //char *humanName;
- "SOLID STRUCTURE\n"
- "[yei]Used for passive base defense.\n"
- "This building doesn't need a powered area!\n",
- "team_human_barrier_line", //char *entityName;
- TR_GRAVITY, //trType_t traj;
- 0.0, //float bounce;
- BARRIER_LINE_BP, //int buildPoints;
- ( 1 << S1 )|( 1 << S2 )|( 1 << S3 ), //int stages
- BARRIER_LINE_HEALTH, //int health;
- 0, //int regenRate;
- BARRIER_LINE_SPLASHDAMAGE, //int splashDamage;
- BARRIER_LINE_SPLASHRADIUS, //int splashRadius;
- MOD_HSPAWN, //int meansOfDeath;
- TEAM_HUMANS, //int team;
- ( 1 << WP_HBUILD ), //weapon_t buildWeapon;
- BANIM_IDLE1, //int idleAnim;
- 0, //int nextthink;
- BARRIER_LINE_BT, //int buildTime;
- qfalse, //qboolean usable;
- 0, //int turretRange;
- 0, //int turretFireSpeed;
- WP_NONE, //weapon_t turretProjType;
- 0.0f, //float minNormal;
- qtrue, //qboolean invertNormal;
- qfalse, //qboolean creepTest;
- 0, //int creepSize;
- qfalse, //qboolean dccTest;
- qfalse, //qboolean transparentTest;
- qfalse, //qboolean uniqueTest;
- BARRIER_LINE_VALUE, //int value;
- },
- {
- BA_H_BARRIER_CORNER, //int buildNum;
- "barrier_corner", //char *buildName;
- "[ye]Barrier Corner", //char *humanName;
- "SOLID STRUCTURE\n"
- "[yei]Used for passive base defense.\n"
- "This building doesn't need a powered area!\n",
- "team_human_barrier_corner", //char *entityName;
- TR_GRAVITY, //trType_t traj;
- 0.0, //float bounce;
- BARRIER_CORNER_BP, //int buildPoints;
- ( 1 << S2 )|( 1 << S3 ), //int stages
- BARRIER_CORNER_HEALTH, //int health;
- 0, //int regenRate;
- BARRIER_CORNER_SPLASHDAMAGE, //int splashDamage;
- BARRIER_CORNER_SPLASHRADIUS, //int splashRadius;
- MOD_HSPAWN, //int meansOfDeath;
- TEAM_HUMANS, //int team;
- ( 1 << WP_HBUILD ), //weapon_t buildWeapon;
- BANIM_IDLE1, //int idleAnim;
- 0, //int nextthink;
- BARRIER_CORNER_BT, //int buildTime;
- qfalse, //qboolean usable;
- 0, //int turretRange;
- 0, //int turretFireSpeed;
- WP_NONE, //weapon_t turretProjType;
- 0.0f, //float minNormal;
- qtrue, //qboolean invertNormal;
- qfalse, //qboolean creepTest;
- 0, //int creepSize;
- qfalse, //qboolean dccTest;
- qfalse, //qboolean transparentTest;
- qfalse, //qboolean uniqueTest;
- BARRIER_CORNER_VALUE, //int value;
- },
- {
- BA_H_BARRIER_POINT, //int buildNum;
- "barrier_point", //char *buildName;
- "[ye]Barrier Point", //char *humanName;
- "SOLID STRUCTURE\n"
- "[yei]Used for passive base defense.\n"
- "This building doesn't need a powered area!\n",
- "team_human_barrier_point", //char *entityName;
- TR_GRAVITY, //trType_t traj;
- 0.0, //float bounce;
- BARRIER_POINT_BP, //int buildPoints;
- ( 1 << S2 )|( 1 << S3 ), //int stages
- BARRIER_POINT_HEALTH, //int health;
- 0, //int regenRate;
- BARRIER_POINT_SPLASHDAMAGE, //int splashDamage;
- BARRIER_POINT_SPLASHRADIUS, //int splashRadius;
- MOD_HSPAWN, //int meansOfDeath;
- TEAM_HUMANS, //int team;
- ( 1 << WP_HBUILD ), //weapon_t buildWeapon;
- BANIM_IDLE1, //int idleAnim;
- 0, //int nextthink;
- BARRIER_POINT_BT, //int buildTime;
- qfalse, //qboolean usable;
- 0, //int turretRange;
- 0, //int turretFireSpeed;
- WP_NONE, //weapon_t turretProjType;
- 0.0f, //float minNormal;
- qtrue, //qboolean invertNormal;
- qfalse, //qboolean creepTest;
- 0, //int creepSize;
- qfalse, //qboolean dccTest;
- qfalse, //qboolean transparentTest;
- qfalse, //qboolean uniqueTest;
- BARRIER_POINT_VALUE, //int value;
- },
- {
- BA_H_SHIELD, //int buildNum;
- "shield", //char *buildName;
- "[ye]Shield", //char *humanName;
- "INTELLIGENT STRUCTURE\n"
- "[yei]Energy-Shield / Floodgate."
- "Can only be used by humans.",
- "team_human_shield", //char *entityName;
- TR_GRAVITY, //trType_t traj;
- 0.0, //float bounce;
- SHIELD_BP, //int buildPoints;
- ( 1 << S3 ), //int stages
- SHIELD_HEALTH, //int health;
- 0, //int regenRate;
- SHIELD_SPLASHDAMAGE, //int splashDamage;
- SHIELD_SPLASHRADIUS, //int splashRadius;
- MOD_HSPAWN, //int meansOfDeath;
- TEAM_HUMANS, //int team;
- ( 1 << WP_HBUILD ), //weapon_t buildWeapon;
- BANIM_IDLE1, //int idleAnim;
- 100, //int nextthink;
- SHIELD_BT, //int buildTime;
- qfalse, //qboolean usable;
- 0, //int turretRange;
- 0, //int turretFireSpeed;
- WP_NONE, //weapon_t turretProjType;
- 0, //float minNormal;
- qtrue, //qboolean invertNormal;
- qfalse, //qboolean creepTest;
- 0, //int creepSize;
- qfalse, //qboolean dccTest;
- qfalse, //qboolean transparentTest;
- qfalse, //qboolean uniqueTest;
- SHIELD_VALUE, //int value;
- },
- {
- BA_H_LADDER, //int buildNum;
- "ladder", //char *buildName;
- "[ye]Ammo Supply", //char *humanName;
- "INTELLIGENT STRUCTURE\n"
- "[yei]A tiny ammo box for non-energy weapons.\n"
- "This building doesn't need a powered area!\n",
- "team_human_ladder", //char *entityName;
- TR_GRAVITY, //trType_t traj;
- 0, //float bounce;
- LADDER_BP, //int buildPoints;
- ( 1 << S2 )|( 1 << S3 ), //int stages
- LADDER_HEALTH, //int health;
- 0, //int regenRate;
- LADDER_SPLASHDAMAGE, //int splashDamage;
- LADDER_SPLASHRADIUS, //int splashRadius;
- MOD_HSPAWN, //int meansOfDeath;
- TEAM_HUMANS, //int team;
- ( 1 << WP_HBUILD ), //weapon_t buildWeapon;
- BANIM_IDLE1, //int idleAnim;
- 0, //int nextthink;
- LADDER_BT, //int buildTime;
- qtrue, //qboolean usable;
- 0, //int turretRange;
- 0, //int turretFireSpeed;
- WP_NONE, //weapon_t turretProjType;
- 0, //float minNormal;
- qtrue, //qboolean invertNormal;
- qfalse, //qboolean creepTest;
- 0, //int creepSize;
- qfalse, //qboolean dccTest;
- qfalse, //qboolean transparentTest;
- qfalse, //qboolean uniqueTest;
- LADDER_VALUE, //int value;
- },
- {
- BA_H_TEFLON_FOIL, //int buildNum;
- "teflon_foil", //char *buildName;
- "[ye]Teflon Foil", //char *humanName;
- "SEMI-SOLID STRUCTURE\n"
- "[yei]Can be used for camouflage.\n"
- "This building doesn't need a powered area!\n",
- "team_human_teflon_foil", //char *entityName;
- TR_GRAVITY, //trType_t traj;
- 0.0, //float bounce;
- TEFLON_FOIL_BP, //int buildPoints;
- ( 1 << S1 )|( 1 << S2 )|( 1 << S3 ), //int stages
- TEFLON_FOIL_HEALTH, //int health;
- 0, //int regenRate;
- TEFLON_FOIL_SPLASHDAMAGE, //int splashDamage;
- TEFLON_FOIL_SPLASHRADIUS, //int splashRadius;
- MOD_HSPAWN, //int meansOfDeath;
- TEAM_HUMANS, //int team;
- ( 1 << WP_HBUILD ), //weapon_t buildWeapon;
- BANIM_IDLE1, //int idleAnim;
- 0, //int nextthink;
- TEFLON_FOIL_BT, //int buildTime;
- qfalse, //qboolean usable;
- 0, //int turretRange;
- 0, //int turretFireSpeed;
- WP_NONE, //weapon_t turretProjType;
- 0.0f, //float minNormal;
- qtrue, //qboolean invertNormal;
- qfalse, //qboolean creepTest;
- 0, //int creepSize;
- qfalse, //qboolean dccTest;
- qfalse, //qboolean transparentTest;
- qfalse, //qboolean uniqueTest;
- TEFLON_FOIL_VALUE, //int value;
- },
- {
- BA_H_BARREL, //int buildNum;
- "barrel", //char *buildName;
- "[ye]Barrel", //char *humanName;
- "SOLID STRUCTURE\n"
- "[yei]Used to build bases.\n"
- "This building doesn't need a powered area!\n",
- "team_human_barrel", //char *entityName;
- TR_GRAVITY, //trType_t traj;
- 0.0, //float bounce;
- BARREL_BP, //int buildPoints;
- ( 1 << S1 )|( 1 << S2 )|( 1 << S3 ), //int stages
- BARREL_HEALTH, //int health;
- 0, //int regenRate;
- BARREL_SPLASHDAMAGE, //int splashDamage;
- BARREL_SPLASHRADIUS, //int splashRadius;
- MOD_HSPAWN, //int meansOfDeath;
- TEAM_HUMANS, //int team;
- ( 1 << WP_HBUILD ), //weapon_t buildWeapon;
- BANIM_IDLE1, //int idleAnim;
- 0, //int nextthink;
- BARREL_BT, //int buildTime;
- qfalse, //qboolean usable;
- 0, //int turretRange;
- 0, //int turretFireSpeed;
- WP_NONE, //weapon_t turretProjType;
- 0.0f, //float minNormal;
- qtrue, //qboolean invertNormal;
- qfalse, //qboolean creepTest;
- 0, //int creepSize;
- qfalse, //qboolean dccTest;
- qfalse, //qboolean transparentTest;
- qfalse, //qboolean uniqueTest;
- BARREL_VALUE, //int value;
- },
- {
- BA_H_LIGHT, //int buildNum;
- "light", //char *buildName;
- "[ye]ForceField", //char *humanName;
- "INTELLIGENT SOLID STRUCTURE\n"
- "[yei]Creates a forcefield wich.\n"
- "pushes alien boddies back.\n",
- "team_human_light", //char *entityName;
- TR_GRAVITY, //trType_t traj;
- 0.0, //float bounce;
- LIGHT_BP, //int buildPoints;
- ( 1 << S3 ), //int stages
- LIGHT_HEALTH, //int health;
- 0, //int regenRate;
- LIGHT_SPLASHDAMAGE, //int splashDamage;
- LIGHT_SPLASHRADIUS, //int splashRadius;
- MOD_HSPAWN, //int meansOfDeath;
- TEAM_HUMANS, //int team;
- ( 1 << WP_HBUILD ), //weapon_t buildWeapon;
- BANIM_IDLE1, //int idleAnim;
- 400, //int nextthink;
- LIGHT_BT, //int buildTime;
- qfalse, //qboolean usable;
- 0, //int turretRange;
- 0, //int turretFireSpeed;
- WP_NONE, //weapon_t turretProjType;
- 0.0f, //float minNormal;
- qtrue, //qboolean invertNormal;
- qfalse, //qboolean creepTest;
- 0, //int creepSize;
- qfalse, //qboolean dccTest;
- qfalse, //qboolean transparentTest;
- qfalse, //qboolean uniqueTest;
- LIGHT_VALUE, //int value;
- },
- {
- BA_H_COVER, //int buildNum;
- "cover", //char *buildName;
- "[ye]Cover", //char *humanName;
- "HEAVY SOLID STRUCTURE\n"
- "[yei]This contains on top of the Cover Stump.\n"
- "It is used to shield the top of bases.\n"
- "This building doesn't need a powered area!\n",
- "team_human_cover", //char *entityName;
- TR_GRAVITY, //trType_t traj;
- 0.0, //float bounce;
- COVER_BP, //int buildPoints;
- ( 1 << S3 ), //int stages
- COVER_HEALTH, //int health;
- 0, //int regenRate;
- COVER_SPLASHDAMAGE, //int splashDamage;
- COVER_SPLASHRADIUS, //int splashRadius;
- MOD_HSPAWN, //int meansOfDeath;
- TEAM_HUMANS, //int team;
- ( 1 << WP_HBUILD ), //weapon_t buildWeapon;
- BANIM_IDLE1, //int idleAnim;
- 0, //int nextthink;
- COVER_BT, //int buildTime;
- qfalse, //qboolean usable;
- 0, //int turretRange;
- 0, //int turretFireSpeed;
- WP_NONE, //weapon_t turretProjType;
- 0.0f, //float minNormal;
- qtrue, //qboolean invertNormal;
- qfalse, //qboolean creepTest;
- 0, //int creepSize;
- qfalse, //qboolean dccTest;
- qfalse, //qboolean transparentTest;
- qfalse, //qboolean uniqueTest;
- COVER_VALUE, //int value;
- },
- {
- BA_H_COVER_STUMP, //int buildNum;
- "cover_stump", //char *buildName;
- "[ye]Cover Stump", //char *humanName;
- "HEAVY SOLID STRUCTURE\n"
- "[yei]This is the stump for the Cover.\n"
- "This building doesn't need a powered area!\n",
- "team_human_cover_stump", //char *entityName;
- TR_GRAVITY, //trType_t traj;
- 0.0, //float bounce;
- COVER_STUMP_BP, //int buildPoints;
- ( 1 << S3 ), //int stages
- COVER_STUMP_HEALTH, //int health;
- 0, //int regenRate;
- COVER_STUMP_SPLASHDAMAGE, //int splashDamage;
- COVER_STUMP_SPLASHRADIUS, //int splashRadius;
- MOD_HSPAWN, //int meansOfDeath;
- TEAM_HUMANS, //int team;
- ( 1 << WP_HBUILD ), //weapon_t buildWeapon;
- BANIM_IDLE1, //int idleAnim;
- 0, //int nextthink;
- COVER_STUMP_BT, //int buildTime;
- qfalse, //qboolean usable;
- 0, //int turretRange;
- 0, //int turretFireSpeed;
- WP_NONE, //weapon_t turretProjType;
- 0.0f, //float minNormal;
- qtrue, //qboolean invertNormal;
- qfalse, //qboolean creepTest;
- 0, //int creepSize;
- qfalse, //qboolean dccTest;
- qfalse, //qboolean transparentTest;
- qfalse, //qboolean uniqueTest;
- COVER_STUMP_VALUE, //int value;
- },
- {
- BA_H_REFINERY, //int buildNum;
- "refinery", //char *buildName;
- "[ye]Refinery", //char *humanName;
- "SUPPLY STRUCTURE\n"
- "[yei]Gives your team 75 buildpoints, ",
- "team_human_refinery", //char *entityName;
- TR_GRAVITY, //trType_t traj;
- 0.0, //float bounce;
- REFINERY_BP, //int buildPoints;
- ( 1 << S2 )|( 1 << S3 ), //int stages
- REFINERY_HEALTH, //int health;
- 0, //int regenRate;
- REFINERY_SPLASHDAMAGE, //int splashDamage;
- REFINERY_SPLASHRADIUS, //int splashRadius;
- MOD_HSPAWN, //int meansOfDeath;
- TEAM_HUMANS, //int team;
- ( 1 << WP_HBUILD ), //weapon_t buildWeapon;
- BANIM_IDLE1, //int idleAnim;
- 1000, //int nextthink;
- REFINERY_BT, //int buildTime;
- qfalse, //qboolean usable;
- 0, //int turretRange;
- 0, //int turretFireSpeed;
- WP_NONE, //weapon_t turretProjType;
- 0.0f, //float minNormal;
- qtrue, //qboolean invertNormal;
- qfalse, //qboolean creepTest;
- 0, //int creepSize;
- qfalse, //qboolean dccTest;
- qfalse, //qboolean transparentTest;
- qfalse, //qboolean uniqueTest;
- REFINERY_VALUE, //int value;
- },
- };
-
-int bg_numBuildables = sizeof( bg_buildableList ) / sizeof( bg_buildableList[ 0 ] );
-static const buildableAttributes_t nullBuildable = { 0 };
-/*
-==============
-BG_BuildableByName
-==============
-*/
-const buildableAttributes_t *BG_BuildableByName( const char *name )
-{
- int i;
-
- for( i = 0; i < bg_numBuildables; i++ )
- {
- if( !Q_stricmp( bg_buildableList[ i ].name, name ) )
- return &bg_buildableList[ i ];
- }
- return &nullBuildable;
-}
-
-/*
-==============
-BG_BuildableByEntityName
-==============
-*/
-const buildableAttributes_t *BG_BuildableByEntityName( const char *name )
-{
- int i;
-
- for( i = 0; i < bg_numBuildables; i++ )
- {
- if( !Q_stricmp( bg_buildableList[ i ].entityName, name ) )
- return &bg_buildableList[ i ];
- }
- return &nullBuildable;
-}
-
-/*
-==============
-BG_Buildable
-==============
-*/
-const buildableAttributes_t *BG_Buildable( buildable_t buildable )
-{
- return ( buildable > BA_NONE && buildable < BA_NUM_BUILDABLES ) ?
- &bg_buildableList[ buildable - 1 ] : &nullBuildable;
-}
-
-/*
-==============
-BG_BuildableAllowedInStage
-==============
-*/
-qboolean BG_BuildableAllowedInStage( buildable_t buildable,
- stage_t stage )
-{
- int stages = BG_Buildable( buildable )->stages;
-
- if( stages & ( 1 << stage ) )
- return qtrue;
- else
- return qfalse;
-}
-
-static buildableConfig_t bg_buildableConfigList[ BA_NUM_BUILDABLES ];
-
-/*
-==============
-BG_BuildableConfig
-==============
-*/
-buildableConfig_t *BG_BuildableConfig( buildable_t buildable )
-{
- return &bg_buildableConfigList[ buildable ];
-}
-
-/*
-==============
-BG_BuildableBoundingBox
-==============
-*/
-void BG_BuildableBoundingBox( buildable_t buildable,
- vec3_t mins, vec3_t maxs )
-{
- buildableConfig_t *buildableConfig = BG_BuildableConfig( buildable );
-
- if( mins != NULL )
- VectorCopy( buildableConfig->mins, mins );
- if( maxs != NULL )
- VectorCopy( buildableConfig->maxs, maxs );
-}
-
-/*
-======================
-BG_ParseBuildableFile
-
-Parses a configuration file describing a buildable
-======================
-*/
-static qboolean BG_ParseBuildableFile( const char *filename, buildableConfig_t *bc )
-{
- char *text_p;
- int i;
- int len;
- char *token;
- char text[ 20000 ];
- fileHandle_t f;
- float scale;
- int defined = 0;
- enum
- {
- MODEL = 1 << 0,
- MODELSCALE = 1 << 1,
- MINS = 1 << 2,
- MAXS = 1 << 3,
- ZOFFSET = 1 << 4
- };
-
- // load the file
- len = trap_FS_FOpenFile( filename, &f, FS_READ );
- if( len < 0 )
- {
- Com_Printf( S_COLOR_RED "ERROR: Buildable file %s doesn't exist\n", filename );
- return qfalse;
- }
-
- if( len == 0 || len >= sizeof( text ) - 1 )
- {
- trap_FS_FCloseFile( f );
- Com_Printf( S_COLOR_RED "ERROR: Buildable file %s is %s\n", filename,
- len == 0 ? "empty" : "too long" );
- return qfalse;
- }
-
- trap_FS_Read( text, len, f );
- text[ len ] = 0;
- trap_FS_FCloseFile( f );
-
- // parse the text
- text_p = text;
-
- // read optional parameters
- while( 1 )
- {
- token = COM_Parse( &text_p );
-
- if( !token )
- break;
-
- if( !Q_stricmp( token, "" ) )
- break;
-
- if( !Q_stricmp( token, "model" ) )
- {
- int index = 0;
-
- token = COM_Parse( &text_p );
- if( !token )
- break;
-
- index = atoi( token );
-
- if( index < 0 )
- index = 0;
- else if( index > 3 )
- index = 3;
-
- token = COM_Parse( &text_p );
- if( !token )
- break;
-
- Q_strncpyz( bc->models[ index ], token, sizeof( bc->models[ 0 ] ) );
-
- defined |= MODEL;
- continue;
- }
- else if( !Q_stricmp( token, "modelScale" ) )
- {
- token = COM_Parse( &text_p );
- if( !token )
- break;
-
- scale = atof( token );
-
- if( scale < 0.0f )
- scale = 0.0f;
-
- bc->modelScale = scale;
-
- defined |= MODELSCALE;
- continue;
- }
- else if( !Q_stricmp( token, "mins" ) )
- {
- for( i = 0; i <= 2; i++ )
- {
- token = COM_Parse( &text_p );
- if( !token )
- break;
-
- bc->mins[ i ] = atof( token );
- }
-
- defined |= MINS;
- continue;
- }
- else if( !Q_stricmp( token, "maxs" ) )
- {
- for( i = 0; i <= 2; i++ )
- {
- token = COM_Parse( &text_p );
- if( !token )
- break;
-
- bc->maxs[ i ] = atof( token );
- }
-
- defined |= MAXS;
- continue;
- }
- else if( !Q_stricmp( token, "zOffset" ) )
- {
- float offset;
-
- token = COM_Parse( &text_p );
- if( !token )
- break;
-
- offset = atof( token );
-
- bc->zOffset = offset;
-
- defined |= ZOFFSET;
- continue;
- }
-
-
- Com_Printf( S_COLOR_RED "ERROR: unknown token '%s'\n", token );
- return qfalse;
- }
-
- if( !( defined & MODEL ) ) token = "model";
- else if( !( defined & MODELSCALE ) ) token = "modelScale";
- else if( !( defined & MINS ) ) token = "mins";
- else if( !( defined & MAXS ) ) token = "maxs";
- else if( !( defined & ZOFFSET ) ) token = "zOffset";
- else token = "";
-
- if( strlen( token ) > 0 )
- {
- Com_Printf( S_COLOR_RED "ERROR: %s not defined in %s\n",
- token, filename );
- return qfalse;
- }
- return qtrue;
-}
-
-/*
-===============
-BG_InitBuildableConfigs
-===============
-*/
-void BG_InitBuildableConfigs( void )
-{
- int i;
- buildableConfig_t *bc;
-
- for( i = BA_NONE + 1; i < BA_NUM_BUILDABLES; i++ )
- {
- bc = BG_BuildableConfig( i );
- Com_Memset( bc, 0, sizeof( buildableConfig_t ) );
-
- BG_ParseBuildableFile( va( "configs/buildables/%s.cfg",
- BG_Buildable( i )->name ), bc );
- }
-}
-
-//CLASSES
-static const classAttributes_t bg_classList[ ] =
-{
- {
- PCL_NONE, //int classnum;
- "spectator", //char *className;
- "Observer mode",
- ( 1 << S1 )|( 1 << S2 )|( 1 << S3 ), //int stages
- 0, //int health;
- 0.0f, //float fallDamage;
- 0.0f, //float regenRate;
- 0, //int abilities;
- WP_NONE, //weapon_t startWeapon
- 0.0f, //float buildDist;
- 90, //int fov;
- 0.000f, //float bob;
- 1.0f, //float bobCycle;
- 0, //int steptime;
- 800, //float speed;
- 10.0f, //float acceleration;
- 1.0f, //float airAcceleration;
- 6.0f, //float friction;
- 100.0f, //float stopSpeed;
- 270.0f, //float jumpMagnitude;
- 1.0f, //float knockbackScale;
- { PCL_NONE, PCL_NONE, PCL_NONE }, //int children[ 3 ];
- 0, //int cost;
- 0, //int value;
- },
- {
- PCL_ALIEN_BUILDER0, //int classnum;
- "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
- ABUILDER_HEALTH, //int health;
- 0.0f, //float fallDamage;
- ABUILDER_REGEN, //float regenRate;
- SCA_TAKESFALLDAMAGE|SCA_FOVWARPS|SCA_ALIENSENSE,//int abilities;
- WP_ABUILD, //weapon_t startWeapon
- 95.0f, //float buildDist;
- 110, //int fov;
- 0.001f, //float bob;
- 2.0f, //float bobCycle;
- 150, //int steptime;
- ABUILDER_SPEED, //float speed;
- 10.0f, //float acceleration;
- 1.0f, //float airAcceleration;
- 6.0f, //float friction;
- 100.0f, //float stopSpeed;
- 195.0f, //float jumpMagnitude;
- 1.0f, //float knockbackScale;
- { PCL_ALIEN_BUILDER0_UPG, PCL_ALIEN_LEVEL0, PCL_NONE }, //int children[ 3 ];
- ABUILDER_COST, //int cost;
- ABUILDER_VALUE, //int value;
- },
- {
- PCL_ALIEN_BUILDER0_UPG, //int classnum;
- "builderupg", //char *classname;
- "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
- ABUILDER_UPG_HEALTH, //int health;
- 0.0f, //float fallDamage;
- ABUILDER_UPG_REGEN, //float regenRate;
- SCA_TAKESFALLDAMAGE|SCA_FOVWARPS|SCA_WALLCLIMBER|SCA_ALIENSENSE, //int abilities;
- WP_ABUILD2, //weapon_t startWeapon
- 105.0f, //float buildDist;
- 110, //int fov;
- 0.001f, //float bob;
- 2.0f, //float bobCycle;
- 100, //int steptime;
- ABUILDER_UPG_SPEED, //float speed;
- 10.0f, //float acceleration;
- 1.0f, //float airAcceleration;
- 6.0f, //float friction;
- 100.0f, //float stopSpeed;
- 270.0f, //float jumpMagnitude;
- 1.0f, //float knockbackScale;
- { PCL_ALIEN_LEVEL0, PCL_NONE, PCL_NONE }, //int children[ 3 ];
- ABUILDER_UPG_COST, //int cost;
- ABUILDER_UPG_VALUE, //int value;
- },
- {
- PCL_ALIEN_LEVEL0, //int classnum;
- "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
- LEVEL0_HEALTH, //int health;
- 0.0f, //float fallDamage;
- LEVEL0_REGEN, //float regenRate;
- SCA_WALLCLIMBER|SCA_FOVWARPS|SCA_ALIENSENSE, //int abilities;
- WP_ALEVEL0, //weapon_t startWeapon
- 0.0f, //float buildDist;
- 140, //int fov;
- 0.0f, //float bob;
- 2.5f, //float bobCycle;
- 25, //int steptime;
- LEVEL0_SPEED, //float speed;
- 10.0f, //float acceleration;
- 1.0f, //float airAcceleration;
- 6.0f, //float friction;
- 400.0f, //float stopSpeed;
- 250.0f, //float jumpMagnitude;
- 2.0f, //float knockbackScale;
- { PCL_ALIEN_LEVEL0_UPG, PCL_NONE, PCL_NONE }, //int children[ 3 ];
- LEVEL0_COST, //int cost;
- LEVEL0_VALUE, //int value;
- },
- {
- PCL_ALIEN_LEVEL0_UPG, //int classnum;
- "level0upg", //char *classname;
- "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
- LEVEL0_UPG_HEALTH, //int health;
- 0.0f, //float fallDamage;
- LEVEL0_UPG_REGEN, //float regenRate;
- SCA_WALLCLIMBER|SCA_FOVWARPS|SCA_ALIENSENSE, //int abilities;
- WP_ALEVEL0_UPG, //weapon_t startWeapon
- 0.0f, //float buildDist;
- 140, //int fov;
- 0.0f, //float bob;
- 2.5f, //float bobCycle;
- 25, //int steptime;
- LEVEL0_UPG_SPEED, //float speed;
- 10.0f, //float acceleration;
- 1.0f, //float airAcceleration;
- 6.0f, //float friction;
- 400.0f, //float stopSpeed;
- 250.0f, //float jumpMagnitude;
- 2.0f, //float knockbackScale;
- { PCL_ALIEN_LEVEL1, PCL_NONE, PCL_NONE }, //int children[ 3 ];
- LEVEL0_UPG_COST, //int cost;
- LEVEL0_UPG_VALUE //int value;
- },
- {
- PCL_ALIEN_LEVEL1, //int classnum;
- "level1", //char *classname;
- "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
- LEVEL1_HEALTH, //int health;
- 0.0f, //float fallDamage;
- LEVEL1_REGEN, //float regenRate;
- SCA_FOVWARPS|SCA_WALLCLIMBER|SCA_ALIENSENSE, //int abilities;
- WP_ALEVEL1, //weapon_t startWeapon
- 0.0f, //float buildDist;
- 120, //int fov;
- 0.001f, //float bob;
- 1.8f, //float bobCycle;
- 60, //int steptime;
- LEVEL1_SPEED, //float speed;
- 10.0f, //float acceleration;
- 1.0f, //float airAcceleration;
- 6.0f, //float friction;
- 300.0f, //float stopSpeed;
- 310.0f, //float jumpMagnitude;
- 1.2f, //float knockbackScale;
- { PCL_ALIEN_LEVEL2, PCL_ALIEN_LEVEL1_UPG, PCL_NONE }, //int children[ 3 ];
- LEVEL1_COST, //int cost;
- LEVEL1_VALUE, //int value;
- },
- {
- 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
- LEVEL1_UPG_HEALTH, //int health;
- 0.0f, //float fallDamage;
- LEVEL1_UPG_REGEN, //float regenRate;
- SCA_FOVWARPS|SCA_WALLCLIMBER|SCA_ALIENSENSE, //int abilities;
- WP_ALEVEL1_UPG, //weapon_t startWeapon
- 0.0f, //float buildDist;
- 120, //int fov;
- 0.001f, //float bob;
- 1.8f, //float bobCycle;
- 60, //int steptime;
- LEVEL1_UPG_SPEED, //float speed;
- 10.0f, //float acceleration;
- 1.0f, //float airAcceleration;
- 6.0f, //float friction;
- 300.0f, //float stopSpeed;
- 310.0f, //float jumpMagnitude;
- 1.1f, //float knockbackScale;
- { PCL_ALIEN_LEVEL2, PCL_NONE, PCL_NONE }, //int children[ 3 ];
- LEVEL1_UPG_COST, //int cost;
- LEVEL1_UPG_VALUE, //int value;
- },
- {
- PCL_ALIEN_LEVEL2, //int classnum;
- "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
- LEVEL2_HEALTH, //int health;
- 0.0f, //float fallDamage;
- LEVEL2_REGEN, //float regenRate;
- SCA_WALLJUMPER|SCA_FOVWARPS|SCA_ALIENSENSE|SCA_WALLCLIMBER, //int abilities;
- WP_ALEVEL2, //weapon_t startWeapon
- 0.0f, //float buildDist;
- 90, //int fov;
- 0.001f, //float bob;
- 1.5f, //float bobCycle;
- 80, //int steptime;
- LEVEL2_SPEED, //float speed;
- 10.0f, //float acceleration;
- 3.0f, //float airAcceleration;
- 6.0f, //float friction;
- 100.0f, //float stopSpeed;
- 380.0f, //float jumpMagnitude;
- 0.8f, //float knockbackScale;
- { PCL_ALIEN_LEVEL5, PCL_ALIEN_LEVEL3, PCL_ALIEN_LEVEL2_UPG }, //int children[ 3 ];
- LEVEL2_COST, //int cost;
- LEVEL2_VALUE, //int value;
- },
- {
- PCL_ALIEN_LEVEL2_UPG, //int classnum;
- "level2upg", //char *classname;
- "The Advanced Marauder has all the abilities of the basic Marauder "
- "with the addition of an area effect electric shock attack. "
- "It also has 3 barbs which may be used to attack humans "
- "from a distance.",
- ( 1 << S2 )|( 1 << S3 ), //int stages
- LEVEL2_UPG_HEALTH, //int health;
- 0.0f, //float fallDamage;
- LEVEL2_UPG_REGEN, //float regenRate;
- SCA_WALLJUMPER|SCA_FOVWARPS|SCA_ALIENSENSE|SCA_WALLCLIMBER, //int abilities;
- WP_ALEVEL2_UPG, //weapon_t startWeapon
- 0.0f, //float buildDist;
- 90, //int fov;
- 0.001f, //float bob;
- 1.5f, //float bobCycle;
- 80, //int steptime;
- LEVEL2_UPG_SPEED, //float speed;
- 10.0f, //float acceleration;
- 3.0f, //float airAcceleration;
- 6.0f, //float friction;
- 100.0f, //float stopSpeed;
- 380.0f, //float jumpMagnitude;
- 0.7f, //float knockbackScale;
- { PCL_ALIEN_LEVEL5, PCL_ALIEN_LEVEL3, PCL_NONE }, //int children[ 3 ];
- LEVEL2_UPG_COST, //int cost;
- LEVEL2_UPG_VALUE, //int value;
- },
- {
- PCL_ALIEN_LEVEL5, //int classnum;
- "level5", //char *classname;
- "The Hummel can fly by pressing run / walk button"
- "or bind a button with /bind BUTTON +speed /"
- "set a key in Options/Controls/HummelFly",
- ( 1 << S2 )|( 1 << S3 ), //int stages
- LEVEL5_UPG_HEALTH, //int health;
- 0.0f, //float fallDamage;
- LEVEL5_UPG_REGEN, //float regenRate;
- SCA_WALLJUMPER|SCA_FOVWARPS|SCA_ALIENSENSE|SCA_WALLCLIMBER, //int abilities;
- WP_ALEVEL5, //weapon_t startWeapon
- 0.0f, //float buildDist;
- 90, //int fov;
- 0.001f, //float bob;
- 1.5f, //float bobCycle;
- 80, //int steptime;
- LEVEL5_UPG_SPEED, //float speed;
- 9.0f, //float acceleration;
- 5.0f, //float airAcceleration;
- 6.0f, //float friction;
- 90.0f, //float stopSpeed;
- 250.0f, //float jumpMagnitude;
- 0.7f, //float knockbackScale;
- { PCL_ALIEN_LEVEL3, PCL_ALIEN_LEVEL3_UPG, PCL_NONE }, //int children[ 3 ];
- LEVEL5_UPG_COST, //int cost;
- LEVEL5_UPG_VALUE, //int value;
- },
- {
- PCL_ALIEN_LEVEL3, //int classnum;
- "level3", //char *classname;
- "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
- LEVEL3_HEALTH, //int health;
- 0.0f, //float fallDamage;
- LEVEL3_REGEN, //float regenRate;
- SCA_FOVWARPS|SCA_ALIENSENSE, //int abilities;
- WP_ALEVEL3, //weapon_t startWeapon
- 0.0f, //float buildDist;
- 90, //int fov;
- 0.0005f, //float bob;
- 1.3f, //float bobCycle;
- 90, //int steptime;
- LEVEL3_SPEED, //float speed;
- 10.0f, //float acceleration;
- 1.0f, //float airAcceleration;
- 6.0f, //float friction;
- 200.0f, //float stopSpeed;
- 270.0f, //float jumpMagnitude;
- 0.3f, //float knockbackScale;
- { PCL_ALIEN_LEVEL4, PCL_ALIEN_LEVEL3_UPG, PCL_NONE }, //int children[ 3 ];
- LEVEL3_COST, //int cost;
- LEVEL3_VALUE, //int value;
- },
- {
- PCL_ALIEN_LEVEL3_UPG, //int classnum;
- "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
- LEVEL3_UPG_HEALTH, //int health;
- 0.0f, //float fallDamage;
- LEVEL3_UPG_REGEN, //float regenRate;
- SCA_FOVWARPS|SCA_ALIENSENSE, //int abilities;
- WP_ALEVEL3_UPG, //weapon_t startWeapon
- 0.0f, //float buildDist;
- 90, //int fov;
- 0.0005f, //float bob;
- 1.3f, //float bobCycle;
- 90, //int steptime;
- LEVEL3_UPG_SPEED, //float speed;
- 10.0f, //float acceleration;
- 1.0f, //float airAcceleration;
- 6.0f, //float friction;
- 200.0f, //float stopSpeed;
- 270.0f, //float jumpMagnitude;
- 0.2f, //float knockbackScale;
- { PCL_ALIEN_LEVEL4, PCL_NONE, PCL_NONE }, //int children[ 3 ];
- LEVEL3_UPG_COST, //int cost;
- LEVEL3_UPG_VALUE, //int value;
- },
- {
- 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
- LEVEL4_HEALTH, //int health;
- 0.0f, //float fallDamage;
- LEVEL4_REGEN, //float regenRate;
- SCA_FOVWARPS|SCA_ALIENSENSE, //int abilities;
- WP_ALEVEL4, //weapon_t startWeapon
- 0.0f, //float buildDist;
- 90, //int fov;
- 0.001f, //float bob;
- 1.1f, //float bobCycle;
- 100, //int steptime;
- LEVEL4_SPEED, //float speed;
- 10.0f, //float acceleration;
- 1.0f, //float airAcceleration;
- 6.0f, //float friction;
- 100.0f, //float stopSpeed;
- 170.0f, //float jumpMagnitude;
- 0.1f, //float knockbackScale;
- { PCL_NONE, PCL_NONE, PCL_NONE }, //int children[ 3 ];
- LEVEL4_COST, //int cost;
- LEVEL4_VALUE, //int value;
- },
- {
- PCL_HUMAN, //int classnum;
- "human_base", //char *classname;
- "",
- ( 1 << S1 )|( 1 << S2 )|( 1 << S3 ), //int stages
- 100, //int health;
- 1.0f, //float fallDamage;
- 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;
- 90, //int fov;
- 0.002f, //float bob;
- 1.0f, //float bobCycle;
- 100, //int steptime;
- 1.0f, //float speed;
- 10.0f, //float acceleration;
- 1.0f, //float airAcceleration;
- 6.0f, //float friction;
- 100.0f, //float stopSpeed;
- 220.0f, //float jumpMagnitude;
- 1.0f, //float knockbackScale;
- { PCL_NONE, PCL_NONE, PCL_NONE }, //int children[ 3 ];
- 0, //int cost;
- ALIEN_CREDITS_PER_KILL, //int value;
- },
- {
- PCL_HUMAN_BSUIT, //int classnum;
- "human_bsuit", //char *classname;
- "",
- ( 1 << S3 ), //int stages
- 100, //int health;
- 1.0f, //float fallDamage;
- 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;
- 90, //int fov;
- 0.002f, //float bob;
- 1.0f, //float bobCycle;
- 100, //int steptime;
- 1.0f, //float speed;
- 10.0f, //float acceleration;
- 1.0f, //float airAcceleration;
- 6.0f, //float friction;
- 100.0f, //float stopSpeed;
- 220.0f, //float jumpMagnitude;
- 1.0f, //float knockbackScale;
- { PCL_NONE, PCL_NONE, PCL_NONE }, //int children[ 3 ];
- 0, //int cost;
- ALIEN_CREDITS_PER_KILL, //int value;
- }
-};
-
-int bg_numClasses = sizeof( bg_classList ) / sizeof( bg_classList[ 0 ] );
-static const classAttributes_t nullClass = { 0 };
-
-/*
-==============
-BG_ClassByName
-==============
-*/
-const classAttributes_t *BG_ClassByName( const char *name )
-{
- int i;
-
- for( i = 0; i < bg_numClasses; i++ )
- {
- if( !Q_stricmp( bg_classList[ i ].name, name ) )
- return &bg_classList[ i ];
- }
- return &nullClass;
-}
-
-/*
-==============
-BG_Class
-==============
-*/
-const classAttributes_t *BG_Class( class_t class )
-{
- return ( class >= PCL_NONE && class < PCL_NUM_CLASSES ) ?
- &bg_classList[ class ] : &nullClass;
-}
-
-/*
-==============
-BG_ClassAllowedInStage
-==============
-*/
-qboolean BG_ClassAllowedInStage( class_t class,
- stage_t stage )
-{
- int stages = BG_Class( class )->stages;
-
- return stages & ( 1 << stage );
-}
-
-static classConfig_t bg_classConfigList[ PCL_NUM_CLASSES ];
-/*
-==============
-BG_ClassConfig
-==============
-*/
-classConfig_t *BG_ClassConfig( class_t class )
-{
- return &bg_classConfigList[ class ];
-}
-
-/*
-==============
-BG_ClassBoundingBox
-==============
-*/
-void BG_ClassBoundingBox( class_t class,
- vec3_t mins, vec3_t maxs,
- vec3_t cmaxs, vec3_t dmins, vec3_t dmaxs )
-{
- classConfig_t *classConfig = BG_ClassConfig( class );
-
- if( mins != NULL )
- VectorCopy( classConfig->mins, mins );
-
- if( maxs != NULL )
- VectorCopy( classConfig->maxs, maxs );
-
- if( cmaxs != NULL )
- VectorCopy( classConfig->crouchMaxs, cmaxs );
-
- if( dmins != NULL )
- VectorCopy( classConfig->deadMins, dmins );
-
- if( dmaxs != NULL )
- VectorCopy( classConfig->deadMaxs, dmaxs );
-}
-
-/*
-==============
-BG_ClassHasAbility
-==============
-*/
-qboolean BG_ClassHasAbility( class_t class, int ability )
-{
- int abilities = BG_Class( class )->abilities;
- return abilities & ability;
-}
-
-/*
-==============
-BG_ClassCanEvolveFromTo
-==============
-*/
-int BG_ClassCanEvolveFromTo( class_t fclass,
- class_t tclass,
- int credits, int stage,
- int cost )
-{
- int i, j, best, value;
-
- if( credits < cost || fclass == PCL_NONE || tclass == PCL_NONE ||
- fclass == tclass )
- return -1;
-
- for( i = 0; i < bg_numClasses; i++ )
-
- {
- if( bg_classList[ i ].number != fclass )
- continue;
-
- best = credits + 1;
- for( j = 0; j < 3; j++ )
- {
- int thruClass, evolveCost;
-
- thruClass = bg_classList[ i ].children[ j ];
- if( thruClass == PCL_NONE || !BG_ClassAllowedInStage( thruClass, stage ) ||
- !BG_ClassIsAllowed( thruClass ) )
- continue;
-
- evolveCost = BG_Class( thruClass )->cost * ALIEN_CREDITS_PER_KILL;
- if( thruClass == tclass )
- value = cost + evolveCost;
- else
- value = BG_ClassCanEvolveFromTo( thruClass, tclass, credits, stage,
- cost + evolveCost );
-
- if( value >= 0 && value < best )
- best = value;
- }
-
- return best <= credits ? best : -1;
- }
-
- Com_Printf( S_COLOR_YELLOW "WARNING: fallthrough in BG_ClassCanEvolveFromTo\n" );
- return -1;
-}
-
-/*
-==============
-BG_AlienCanEvolve
-==============
-*/
-qboolean BG_AlienCanEvolve( class_t class, int credits, int stage )
-{
- int i, j, tclass;
-
- for( i = 0; i < bg_numClasses; i++ )
- {
- if( bg_classList[ i ].number != class )
- continue;
-
- for( j = 0; j < 3; j++ )
- {
- tclass = bg_classList[ i ].children[ j ];
- if( tclass != PCL_NONE &&
- BG_ClassAllowedInStage( tclass, stage ) &&
- BG_ClassIsAllowed( tclass ) &&
- credits >= BG_Class( tclass )->cost * ALIEN_CREDITS_PER_KILL )
- return qtrue;
- }
- return qfalse;
- }
- Com_Printf( S_COLOR_YELLOW "WARNING: fallthrough in BG_AlienCanEvolve\n" );
- return qfalse;
-}
-
-/*
-======================
-BG_ParseClassFile
-
-Parses a configuration file describing a class
-======================
-*/
-static qboolean BG_ParseClassFile( const char *filename, classConfig_t *cc )
-{
- char *text_p;
- int i;
- int len;
- char *token;
- char text[ 20000 ];
- fileHandle_t f;
- float scale = 0.0f;
- int defined = 0;
- enum
- {
- MODEL = 1 << 0,
- SKIN = 1 << 1,
- HUD = 1 << 2,
- MODELSCALE = 1 << 3,
- SHADOWSCALE = 1 << 4,
- MINS = 1 << 5,
- MAXS = 1 << 6,
- DEADMINS = 1 << 7,
- DEADMAXS = 1 << 8,
- CROUCHMAXS = 1 << 9,
- VIEWHEIGHT = 1 << 10,
- CVIEWHEIGHT = 1 << 11,
- ZOFFSET = 1 << 12,
- NAME = 1 << 13,
- SHOULDEROFFSETS = 1 << 14
- };
-
- // load the file
- len = trap_FS_FOpenFile( filename, &f, FS_READ );
- if( len < 0 )
- return qfalse;
-
- if( len == 0 || len >= sizeof( text ) - 1 )
- {
- trap_FS_FCloseFile( f );
- Com_Printf( S_COLOR_RED "ERROR: Class file %s is %s\n", filename,
- len == 0 ? "empty" : "too long" );
- return qfalse;
- }
-
- trap_FS_Read( text, len, f );
- text[ len ] = 0;
- trap_FS_FCloseFile( f );
-
- // parse the text
- text_p = text;
-
- // read optional parameters
- while( 1 )
- {
- token = COM_Parse( &text_p );
-
- if( !token )
- break;
-
- if( !Q_stricmp( token, "" ) )
- break;
-
- if( !Q_stricmp( token, "model" ) )
- {
- token = COM_Parse( &text_p );
- if( !token )
- break;
-
- Q_strncpyz( cc->modelName, token, sizeof( cc->modelName ) );
-
- defined |= MODEL;
- continue;
- }
- else if( !Q_stricmp( token, "skin" ) )
- {
- token = COM_Parse( &text_p );
- if( !token )
- break;
-
- Q_strncpyz( cc->skinName, token, sizeof( cc->skinName ) );
-
- defined |= SKIN;
- continue;
- }
- else if( !Q_stricmp( token, "hud" ) )
- {
- token = COM_Parse( &text_p );
- if( !token )
- break;
-
- Q_strncpyz( cc->hudName, token, sizeof( cc->hudName ) );
-
- defined |= HUD;
- continue;
- }
- else if( !Q_stricmp( token, "modelScale" ) )
- {
- token = COM_Parse( &text_p );
- if( !token )
- break;
-
- scale = atof( token );
-
- if( scale < 0.0f )
- scale = 0.0f;
-
- cc->modelScale = scale;
-
- defined |= MODELSCALE;
- continue;
- }
- else if( !Q_stricmp( token, "shadowScale" ) )
- {
- token = COM_Parse( &text_p );
- if( !token )
- break;
-
- scale = atof( token );
-
- if( scale < 0.0f )
- scale = 0.0f;
-
- cc->shadowScale = scale;
-
- defined |= SHADOWSCALE;
- continue;
- }
- else if( !Q_stricmp( token, "mins" ) )
- {
- for( i = 0; i <= 2; i++ )
- {
- token = COM_Parse( &text_p );
- if( !token )
- break;
-
- cc->mins[ i ] = atof( token );
- }
-
- defined |= MINS;
- continue;
- }
- else if( !Q_stricmp( token, "maxs" ) )
- {
- for( i = 0; i <= 2; i++ )
- {
- token = COM_Parse( &text_p );
- if( !token )
- break;
-
- cc->maxs[ i ] = atof( token );
- }
-
- defined |= MAXS;
- continue;
- }
- else if( !Q_stricmp( token, "deadMins" ) )
- {
- for( i = 0; i <= 2; i++ )
- {
- token = COM_Parse( &text_p );
- if( !token )
- break;
-
- cc->deadMins[ i ] = atof( token );
- }
-
- defined |= DEADMINS;
- continue;
- }
- else if( !Q_stricmp( token, "deadMaxs" ) )
- {
- for( i = 0; i <= 2; i++ )
- {
- token = COM_Parse( &text_p );
- if( !token )
- break;
-
- cc->deadMaxs[ i ] = atof( token );
- }
-
- defined |= DEADMAXS;
- continue;
- }
- else if( !Q_stricmp( token, "crouchMaxs" ) )
- {
- for( i = 0; i <= 2; i++ )
- {
- token = COM_Parse( &text_p );
- if( !token )
- break;
-
- cc->crouchMaxs[ i ] = atof( token );
- }
-
- defined |= CROUCHMAXS;
- continue;
- }
- else if( !Q_stricmp( token, "viewheight" ) )
- {
- token = COM_Parse( &text_p );
- cc->viewheight = atoi( token );
- defined |= VIEWHEIGHT;
- continue;
- }
- else if( !Q_stricmp( token, "crouchViewheight" ) )
- {
- token = COM_Parse( &text_p );
- cc->crouchViewheight = atoi( token );
- defined |= CVIEWHEIGHT;
- continue;
- }
- else if( !Q_stricmp( token, "zOffset" ) )
- {
- float offset;
-
- token = COM_Parse( &text_p );
- if( !token )
- break;
-
- offset = atof( token );
-
- cc->zOffset = offset;
-
- defined |= ZOFFSET;
- continue;
- }
- else if( !Q_stricmp( token, "name" ) )
- {
- token = COM_Parse( &text_p );
- if( !token )
- break;
-
- Q_strncpyz( cc->humanName, token, sizeof( cc->humanName ) );
-
- defined |= NAME;
- continue;
- }
- else if( !Q_stricmp( token, "shoulderOffsets" ) )
- {
- for( i = 0; i <= 2; i++ )
- {
- token = COM_Parse( &text_p );
- if( !token )
- break;
-
- cc->shoulderOffsets[ i ] = atof( token );
- }
-
- defined |= SHOULDEROFFSETS;
- continue;
- }
-
- Com_Printf( S_COLOR_RED "ERROR: unknown token '%s'\n", token );
- return qfalse;
- }
-
- if( !( defined & MODEL ) ) token = "model";
- else if( !( defined & SKIN ) ) token = "skin";
- else if( !( defined & HUD ) ) token = "hud";
- else if( !( defined & MODELSCALE ) ) token = "modelScale";
- else if( !( defined & SHADOWSCALE ) ) token = "shadowScale";
- else if( !( defined & MINS ) ) token = "mins";
- else if( !( defined & MAXS ) ) token = "maxs";
- else if( !( defined & DEADMINS ) ) token = "deadMins";
- else if( !( defined & DEADMAXS ) ) token = "deadMaxs";
- else if( !( defined & CROUCHMAXS ) ) token = "crouchMaxs";
- else if( !( defined & VIEWHEIGHT ) ) token = "viewheight";
- else if( !( defined & CVIEWHEIGHT ) ) token = "crouchViewheight";
- else if( !( defined & ZOFFSET ) ) token = "zOffset";
- else if( !( defined & NAME ) ) token = "name";
- else if( !( defined & SHOULDEROFFSETS ) ) token = "shoulderOffsets";
- else token = "";
-
- if( strlen( token ) > 0 )
- {
- Com_Printf( S_COLOR_RED "ERROR: %s not defined in %s\n",
- token, filename );
- return qfalse;
- }
- return qtrue;
-}
-
-/*
-===============
-BG_InitClassConfigs
-===============
-*/
-void BG_InitClassConfigs( void )
-{
- int i;
- classConfig_t *cc;
-
- for( i = PCL_NONE; i < PCL_NUM_CLASSES; i++ )
- {
- cc = BG_ClassConfig( i );
-
- BG_ParseClassFile( va( "configs/classes/%s.cfg",
- BG_Class( i )->name ), cc );
- }
-}
-
-static const weaponAttributes_t bg_weapons[ ] =
-{
- {
- WP_ALEVEL0, //int weaponNum;
- 0, //int price;
- ( 1 << S1 )|( 1 << S2 )|( 1 << S3 ), //int stages
- SLOT_WEAPON, //int slots;
- "level0", //char *weaponName;
- "Bite", //char *humanName;
- "",
- 0, //int maxAmmo;
- 0, //int maxClips;
- qtrue, //int infiniteAmmo;
- qfalse, //int usesEnergy;
- LEVEL0_BITE_REPEAT, //int repeatRate1;
- 0, //int repeatRate2;
- 0, //int repeatRate3;
- 0, //int reloadTime;
- LEVEL0_BITE_K_SCALE, //float knockbackScale;
- qfalse, //qboolean hasAltMode;
- qfalse, //qboolean hasThirdMode;
- qfalse, //qboolean canZoom;
- 90.0f, //float zoomFov;
- qfalse, //qboolean purchasable;
- qfalse, //qboolean longRanged;
- TEAM_ALIENS //team_t team;
- },
- {
- WP_ALEVEL0_UPG, //int weaponNum;
- 0, //int price;
- ( 1 << S1 )|( 1 << S2 )|( 1 << S3 ), //int stages
- SLOT_WEAPON, //int slots;
- "level0upg", //char *weaponName;
- "Bite Upgrade", //char *humanName;
- "",
- 0, //int maxAmmo;
- 0, //int maxClips;
- qtrue, //int infiniteAmmo;
- qfalse, //int usesEnergy;
- LEVEL0_BITE_REPEAT, //int repeatRate1;
- 0, //int repeatRate2;
- 0, //int repeatRate3;
- 0, //int reloadTime;
- LEVEL0_BITE_K_SCALE, //float knockbackScale;
- qfalse, //qboolean hasAltMode;
- qfalse, //qboolean hasThirdMode;
- qfalse, //qboolean canZoom;
- 90.0f, //float zoomFov;
- qfalse, //qboolean purchasable;
- qfalse, //qboolean longRanged;
- TEAM_ALIENS //team_t team;
- },
- {
- WP_ALEVEL1, //int weaponNum;
- 0, //int price;
- ( 1 << S1 )|( 1 << S2 )|( 1 << S3 ), //int stages
- SLOT_WEAPON, //int slots;
- "level1", //char *weaponName;
- "Claws", //char *humanName;
- "",
- 1, //int maxAmmo;
- 0, //int maxClips;
- qtrue, //int infiniteAmmo;
- qfalse, //int usesEnergy;
- LEVEL1_CLAW_REPEAT, //int repeatRate1;
- 0, //int repeatRate2;
- ABOMB2_REPEAT, //int repeatRate3;
- 0, //int reloadTime;
- LEVEL1_CLAW_K_SCALE, //float knockbackScale;
- qfalse, //qboolean hasAltMode;
- qtrue, //qboolean hasThirdMode;
- qfalse, //qboolean canZoom;
- 90.0f, //float zoomFov;
- qfalse, //qboolean purchasable;
- qfalse, //qboolean longRanged;
- TEAM_ALIENS //team_t team;
- },
- {
- WP_ALEVEL1_UPG, //int weaponNum;
- 0, //int price;
- ( 1 << S1 )|( 1 << S2 )|( 1 << S3 ), //int stages
- SLOT_WEAPON, //int slots;
- "level1upg", //char *weaponName;
- "Claws Upgrade", //char *humanName;
- "",
- 1, //int maxAmmo;
- 0, //int maxClips;
- qtrue, //int infiniteAmmo;
- qfalse, //int usesEnergy;
- LEVEL1_CLAW_U_REPEAT, //int repeatRate1;
- LEVEL1_PCLOUD_REPEAT, //int repeatRate2;
- ABOMB_REPEAT, //int repeatRate3;
- 0, //int reloadTime;
- LEVEL1_CLAW_U_K_SCALE,//float knockbackScale;
- qtrue, //qboolean hasAltMode;
- qtrue, //qboolean hasThirdMode;
- qfalse, //qboolean canZoom;
- 90.0f, //float zoomFov;
- qfalse, //qboolean purchasable;
- qtrue, //qboolean longRanged;
- TEAM_ALIENS //team_t team;
- },
- {
- WP_ALEVEL2, //int weaponNum;
- 0, //int price;
- ( 1 << S1 )|( 1 << S2 )|( 1 << S3 ), //int stages
- SLOT_WEAPON, //int slots;
- "level2", //char *weaponName;
- "Claws", //char *humanName;
- "",
- 0, //int maxAmmo;
- 0, //int maxClips;
- qtrue, //int infiniteAmmo;
- qfalse, //int usesEnergy;
- LEVEL2_CLAW_REPEAT, //int repeatRate1;
- 0, //int repeatRate2;
- 0, //int repeatRate3;
- 0, //int reloadTime;
- LEVEL2_CLAW_K_SCALE, //float knockbackScale;
- qfalse, //qboolean hasAltMode;
- qfalse, //qboolean hasThirdMode;
- qfalse, //qboolean canZoom;
- 90.0f, //float zoomFov;
- qfalse, //qboolean purchasable;
- qfalse, //qboolean longRanged;
- TEAM_ALIENS //team_t team;
- },
- {
- WP_ALEVEL2_UPG, //int weaponNum;
- 0, //int price;
- ( 1 << S1 )|( 1 << S2 )|( 1 << S3 ), //int stages
- SLOT_WEAPON, //int slots;
- "level2upg", //char *weaponName;
- "Zap", //char *humanName;
- "",
- 3, //int maxAmmo;
- 0, //int maxClips;
- qtrue, //int infiniteAmmo;
- qfalse, //int usesEnergy;
- LEVEL2_CLAW_U_REPEAT, //int repeatRate1;
- LEVEL2_AREAZAP_REPEAT,//int repeatRate2;
- LEVEL2_BOUNCEBALL_REPEAT,//int repeatRate3;
- 0, //int reloadTime;
- LEVEL2_CLAW_U_K_SCALE,//float knockbackScale;
- qtrue, //qboolean hasAltMode;
- qtrue, //qboolean hasThirdMode;
- qfalse, //qboolean canZoom;
- 90.0f, //float zoomFov;
- qfalse, //qboolean purchasable;
- qtrue, //qboolean longRanged;
- TEAM_ALIENS //team_t team;
- },
- {
- WP_ALEVEL5, //int weaponNum;
- 0, //int price;
- ( 1 << S1 )|( 1 << S2 )|( 1 << S3 ), //int stages
- SLOT_WEAPON, //int slots;
- "level5", //char *weaponName;
- "prickles", //char *humanName;
- "",
- 10, //int maxAmmo;
- 0, //int maxClips;
- qtrue, //int infiniteAmmo;
- qfalse, //int usesEnergy;
- LEVEL5_CLAW_U_REPEAT, //int repeatRate1;
- LEVEL5_POUNCE_REPEAT, //int repeatRate2;
- LEVEL5_PRICKLES_REPEAT, //int repeatRate3;
- 0, //int reloadTime;
- LEVEL5_CLAW_U_K_SCALE, //float knockbackScale;
- qfalse, //qboolean hasAltMode;
- qtrue, //qboolean hasThirdMode;
- qtrue, //qboolean canZoom;
- 90.0f, //float zoomFov;
- qfalse, //qboolean purchasable;
- qtrue, //qboolean longRanged;
- TEAM_ALIENS //team_t team;
- },
- {
- WP_ALEVEL3, //int weaponNum;
- 0, //int price;
- ( 1 << S1 )|( 1 << S2 )|( 1 << S3 ), //int stages
- SLOT_WEAPON, //int slots;
- "level3", //char *weaponName;
- "Pounce", //char *humanName;
- "",
- 0, //int maxAmmo;
- 0, //int maxClips;
- qtrue, //int infiniteAmmo;
- qfalse, //int usesEnergy;
- LEVEL3_CLAW_REPEAT, //int repeatRate1;
- 0, //int repeatRate2;
- 0, //int repeatRate3;
- 0, //int reloadTime;
- LEVEL3_CLAW_K_SCALE, //float knockbackScale;
- qfalse, //qboolean hasAltMode;
- qfalse, //qboolean hasThirdMode;
- qtrue, //qboolean canZoom;
- 100.0f, //float zoomFov;
- qfalse, //qboolean purchasable;
- qfalse, //qboolean longRanged;
- TEAM_ALIENS //team_t team;
- },
- {
- WP_ALEVEL3_UPG, //int weaponNum;
- 0, //int price;
- ( 1 << S1 )|( 1 << S2 )|( 1 << S3 ), //int stages
- SLOT_WEAPON, //int slots;
- "level3upg", //char *weaponName;
- "Pounce (upgrade)", //char *humanName;
- "",
- 3, //int maxAmmo;
- 0, //int maxClips;
- qtrue, //int infiniteAmmo;
- qfalse, //int usesEnergy;
- LEVEL3_CLAW_U_REPEAT, //int repeatRate1;
- 0, //int repeatRate2;
- LEVEL3_BOUNCEBALL_REPEAT,//int repeatRate3;
- 0, //int reloadTime;
- LEVEL3_CLAW_U_K_SCALE,//float knockbackScale;
- qfalse, //qboolean hasAltMode;
- qtrue, //qboolean hasThirdMode;
- qtrue, //qboolean canZoom;
- 90.0f, //float zoomFov;
- qfalse, //qboolean purchasable;
- qtrue, //qboolean longRanged;
- TEAM_ALIENS //team_t team;
- },
- {
- WP_ALEVEL4, //int weaponNum;
- 0, //int price;
- ( 1 << S1 )|( 1 << S2 )|( 1 << S3 ), //int stages
- SLOT_WEAPON, //int slots;
- "level4", //char *weaponName;
- "Charge", //char *humanName;
- "",
- 3, //int maxAmmo;
- 0, //int maxClips;
- qtrue, //int infiniteAmmo;
- qfalse, //int usesEnergy;
- LEVEL4_CLAW_REPEAT, //int repeatRate1;
- 0, //int repeatRate2;
- LEVEL4_FIREBREATHREPEAT, //int repeatRate3;
- 0, //int reloadTime;
- LEVEL4_CLAW_K_SCALE, //float knockbackScale;
- qfalse, //qboolean hasAltMode;
- qtrue, //qboolean hasThirdMode;
- qfalse, //qboolean canZoom;
- 90.0f, //float zoomFov;
- qfalse, //qboolean purchasable;
- qfalse, //qboolean longRanged;
- TEAM_ALIENS //team_t team;
- },
-
- {
- WP_BLASTER, //int weaponNum;
- 0, //int price;
- ( 1 << S1 )|( 1 << S2 )|( 1 << S3 ), //int stages
- 0, //int slots;
- "blaster", //char *weaponName;
- "[yefarms]Blaster", //char *humanName;
- "",
- 0, //int maxAmmo;
- 0, //int maxClips;
- qtrue, //int infiniteAmmo;
- qfalse, //int usesEnergy;
- BLASTER_REPEAT, //int repeatRate1;
- 0, //int repeatRate2;
- 0, //int repeatRate3;
- 0, //int reloadTime;
- BLASTER_K_SCALE, //float knockbackScale;
- qfalse, //qboolean hasAltMode;
- qfalse, //qboolean hasThirdMode;
- qfalse, //qboolean canZoom;
- 90.0f, //float zoomFov;
- qfalse, //qboolean purchasable;
- qtrue, //qboolean longRanged;
- TEAM_HUMANS //team_t team;
- },
- {
- WP_MACHINEGUN, //int weaponNum;
- RIFLE_PRICE, //int price;
- ( 1 << S1 )|( 1 << S2 )|( 1 << S3 ), //int stages
- SLOT_WEAPON, //int slots;
- "rifle", //char *weaponName;
- "[yefarms]Rifle", //char *humanName;
- "Basic weapon. Cased projectile weapon, with a slow clip based "
- "reload system & a fast 2nd mode.",
- RIFLE_CLIPSIZE, //int maxAmmo;
- RIFLE_MAXCLIPS, //int maxClips;
- qfalse, //int infiniteAmmo;
- qfalse, //int usesEnergy;
- RIFLE_REPEAT, //int repeatRate1;
- RIFLE_REPEAT2, //int repeatRate2;
- 0, //int repeatRate3;
- RIFLE_RELOAD, //int reloadTime;
- RIFLE_K_SCALE, //float knockbackScale;
- qtrue, //qboolean hasAltMode;
- qfalse, //qboolean hasThirdMode;
- qfalse, //qboolean canZoom;
- 90.0f, //float zoomFov;
- qtrue, //qboolean purchasable;
- qtrue, //qboolean longRanged;
- TEAM_HUMANS //team_t team;
- },
- {
- WP_PAIN_SAW, //int weaponNum;
- PAINSAW_PRICE, //int price;
- ( 1 << S1 )|( 1 << S2 )|( 1 << S3 ), //int stages
- SLOT_WEAPON, //int slots;
- "psaw", //char *weaponName;
- "[yefarms]Pain Saw", //char *humanName;
- "Similar to a chainsaw, but instead of a chain it has an "
- "electric arc capable of dealing a great deal of damage at "
- "close range. It has a blade mode for secondary fire",
- 0, //int maxAmmo;
- 0, //int maxClips;
- qtrue, //int infiniteAmmo;
- qfalse, //int usesEnergy;
- PAINSAW_REPEAT, //int repeatRate1;
- PAINSAW_REPEAT2, //int repeatRate2;
- 0, //int repeatRate3;
- 0, //int reloadTime;
- PAINSAW_K_SCALE, //float knockbackScale;
- qtrue, //qboolean hasAltMode;
- qfalse, //qboolean hasThirdMode;
- qfalse, //qboolean canZoom;
- 90.0f, //float zoomFov;
- qtrue, //qboolean purchasable;
- qfalse, //qboolean longRanged;
- TEAM_HUMANS //team_t team;
- },
- {
- WP_SHOTGUN, //int weaponNum;
- SHOTGUN_PRICE, //int price;
- ( 1 << S1 )|( 1 << S2 )|( 1 << S3 ), //int stages
- SLOT_WEAPON, //int slots;
- "shotgun", //char *weaponName;
- "[yefarms]Shotgun", //char *humanName;
- "Close range weapon that is useful against larger foes. "
- "It has a slow repeat rate, but can be devastatingly "
- "effective.",
- SHOTGUN_SHELLS, //int maxAmmo;
- SHOTGUN_MAXCLIPS, //int maxClips;
- qfalse, //int infiniteAmmo;
- qfalse, //int usesEnergy;
- SHOTGUN_REPEAT, //int repeatRate1;
- 0, //int repeatRate2;
- 0, //int repeatRate3;
- SHOTGUN_RELOAD, //int reloadTime;
- SHOTGUN_K_SCALE, //float knockbackScale;
- qfalse, //qboolean hasAltMode;
- qfalse, //qboolean hasThirdMode;
- qfalse, //qboolean canZoom;
- 90.0f, //float zoomFov;
- qtrue, //qboolean purchasable;
- qtrue, //qboolean longRanged;
- TEAM_HUMANS //team_t team;
- },
- {
- WP_LAS_GUN, //int weaponNum;
- LASGUN_PRICE, //int price;
- ( 1 << S1 )|( 1 << S2 )|( 1 << S3 ), //int stages
- SLOT_WEAPON, //int slots;
- "lgun", //char *weaponName;
- "[yefarms]Las Gun", //char *humanName;
- "Slightly more powerful than the basic rifle, rapidly fires "
- "small packets of energy.",
- LASGUN_AMMO, //int maxAmmo;
- 0, //int maxClips;
- qfalse, //int infiniteAmmo;
- qtrue, //int usesEnergy;
- LASGUN_REPEAT, //int repeatRate1;
- 0, //int repeatRate2;
- 0, //int repeatRate3;
- LASGUN_RELOAD, //int reloadTime;
- LASGUN_K_SCALE, //float knockbackScale;
- qfalse, //qboolean hasAltMode;
- qfalse, //qboolean hasThirdMode;
- qfalse, //qboolean canZoom;
- 90.0f, //float zoomFov;
- qtrue, //qboolean purchasable;
- qtrue, //qboolean longRanged;
- TEAM_HUMANS //team_t team;
- },
- {
- WP_MASS_DRIVER, //int weaponNum;
- MDRIVER_PRICE, //int price;
- ( 1 << S1 )|( 1 << S2 )|( 1 << S3 ), //int stages
- SLOT_WEAPON, //int slots;
- "mdriver", //char *weaponName;
- "[yefarms]Mass Driver", //char *humanName;
- "A portable particle accelerator which causes minor nuclear "
- "reactions at the point of impact. It has a very large "
- "payload, but fires slowly. The secondary fire mode is "
- "triggered with a combo of [primary attack] and [activate upgrade]. "
- "It needs a full clip and fires a target seeking ball-lightning "
- "towarads the enemy. It is available at S3",
- MDRIVER_CLIPSIZE, //int maxAmmo;
- MDRIVER_MAXCLIPS, //int maxClips;
- qfalse, //int infiniteAmmo;
- qtrue, //int usesEnergy;
- MDRIVER_REPEAT, //int repeatRate1;
- 0, //int repeatRate2;
- MDRIVER_REPEAT2, //int repeatRate3;
- MDRIVER_RELOAD, //int reloadTime;
- MDRIVER_K_SCALE, //float knockbackScale;
- qfalse, //qboolean hasAltMode;
- qtrue, //qboolean hasThirdMode;
- qtrue, //qboolean canZoom;
- 25.0f, //float zoomFov;
- qtrue, //qboolean purchasable;
- qtrue, //qboolean longRanged;
- TEAM_HUMANS //team_t team;
- },
- {
- WP_CHAINGUN, //int weaponNum;
- CHAINGUN_PRICE, //int price;
- ( 1 << S1 )|( 1 << S2 )|( 1 << S3 ), //int stages
- SLOT_WEAPON, //int slots;
- "chaingun", //char *weaponName;
- "[yefarms]Chaingun", //char *humanName;
- "Belt drive, cased projectile weapon. It has a high repeat "
- "rate but a wide firing angle and is therefore relatively "
- "inaccurate.",
- CHAINGUN_BULLETS, //int maxAmmo;
- 0, //int maxClips;
- qfalse, //int infiniteAmmo;
- qfalse, //int usesEnergy;
- CHAINGUN_REPEAT, //int repeatRate1;
- CHAINGUN_REPEAT2, //int repeatRate2;
- 0, //int repeatRate3;
- 0, //int reloadTime;
- CHAINGUN_K_SCALE, //float knockbackScale;
- qtrue, //qboolean hasAltMode;
- qfalse, //qboolean hasThirdMode;
- qfalse, //qboolean canZoom;
- 90.0f, //float zoomFov;
- qtrue, //qboolean purchasable;
- qtrue, //qboolean longRanged;
- TEAM_HUMANS //team_t team;
- },
- {
- WP_FLAMER, //int weaponNum;
- FLAMER_PRICE, //int price;
- ( 1 << S2 )|( 1 << S3 ), //int stages
- SLOT_WEAPON, //int slots;
- "flamer", //char *weaponName;
- "[yefarms]Flame Thrower", //char *humanName;
- "Sprays fire at its target. It is powered by compressed "
- "gas. The relatively low rate of fire means this weapon is most "
- "effective against static targets.",
- 150, //int maxAmmo;
- 1, //int maxClips;
- qfalse, //int infiniteAmmo;
- qfalse, //int usesEnergy;
- FLAMER_REPEAT, //int repeatRate1;
- FLAMER_SECONDARY_REPEAT, //int repeatRate2;
- FLAMER_REPEAT, //int repeatRate3;
- 3000, //int reloadTime;
- FLAMER_K_SCALE, //float knockbackScale;
- qtrue, //qboolean hasAltMode;
- qtrue, //qboolean hasThirdMode;
- qfalse, //qboolean canZoom;
- 90.0f, //float zoomFov;
- qtrue, //qboolean purchasable;
- qtrue, //qboolean longRanged;
- TEAM_HUMANS //team_t team;
- },
- {
- WP_PULSE_RIFLE, //int weaponNum;
- PRIFLE_PRICE, //int price;
- ( 1 << S2 )|( 1 << S3 ), //int stages
- SLOT_WEAPON, //int slots;
- "prifle", //char *weaponName;
- "[yefarms]Pulse Rifle", //char *humanName;
- "An energy weapon that fires rapid pulses of concentrated energy.",
- PRIFLE_CLIPS, //int maxAmmo;
- PRIFLE_MAXCLIPS, //int maxClips;
- qfalse, //int infiniteAmmo;
- qtrue, //int usesEnergy;
- PRIFLE_REPEAT, //int repeatRate1;
- PRIFLE_SECONDARY_REPEAT, //int repeatRate2;
- 0, //int repeatRate3;
- PRIFLE_RELOAD, //int reloadTime;
- PRIFLE_K_SCALE, //float knockbackScale;
- qtrue, //qboolean hasAltMode;
- qfalse, //qboolean hasThirdMode;
- qfalse, //qboolean canZoom;
- 90.0f, //float zoomFov;
- qtrue, //qboolean purchasable;
- qtrue, //qboolean longRanged;
- TEAM_HUMANS //team_t team;
- },
- {
- WP_LUCIFER_CANNON, //int weaponNum;
- LCANNON_PRICE, //int price;
- ( 1 << S3 ), //int stages
- SLOT_WEAPON, //int slots;
- "lcannon", //char *weaponName;
- "[yefarms]Lucifer Cannon", //char *humanName;
- "Blaster technology scaled up to deliver devastating power. "
- "Primary fire must be charged before firing. It has a quick "
- "secondary attack that does not require charging.",
- LCANNON_AMMO, //int maxAmmo;
- 0, //int maxClips;
- qfalse, //int infiniteAmmo;
- qtrue, //int usesEnergy;
- LCANNON_REPEAT, //int repeatRate1;
- LCANNON_SECONDARY_REPEAT, //int repeatRate2;
- 0, //int repeatRate3;
- LCANNON_RELOAD, //int reloadTime;
- LCANNON_K_SCALE, //float knockbackScale;
- qtrue, //qboolean hasAltMode;
- qfalse, //qboolean hasThirdMode;
- qfalse, //qboolean canZoom;
- 90.0f, //float zoomFov;
- qtrue, //qboolean purchasable;
- qtrue, //qboolean longRanged;
- TEAM_HUMANS //team_t team;
- },
- {
- WP_GRENADE, //int weaponNum;
- GRENADE_PRICE, //int price;
- ( 1 << S2 )|( 1 << S3 ), //int stages
- SLOT_NONE, //int slots;
- "grenade", //char *weaponName;
- "Grenade", //char *humanName;
- "",
- 1, //int maxAmmo;
- 0, //int maxClips;
- qfalse, //int infiniteAmmo;
- qfalse, //int usesEnergy;
- GRENADE_REPEAT, //int repeatRate1;
- 0, //int repeatRate2;
- 0, //int repeatRate3;
- 0, //int reloadTime;
- GRENADE_K_SCALE, //float knockbackScale;
- qfalse, //qboolean hasAltMode;
- qfalse, //qboolean hasThirdMode;
- qfalse, //qboolean canZoom;
- 90.0f, //float zoomFov;
- qfalse, //qboolean purchasable;
- qfalse, //qboolean longRanged;
- TEAM_HUMANS //team_t team;
- },
- {
- WP_LOCKBLOB_LAUNCHER, //int weaponNum;
- 0, //int price;
- ( 1 << S1 )|( 1 << S2 )|( 1 << S3 ), //int stages
- SLOT_WEAPON, //int slots;
- "lockblob", //char *weaponName;
- "Lock Blob", //char *humanName;
- "",
- 0, //int maxAmmo;
- 0, //int maxClips;
- qtrue, //int infiniteAmmo;
- qfalse, //int usesEnergy;
- 500, //int repeatRate1;
- 500, //int repeatRate2;
- 500, //int repeatRate3;
- 0, //int reloadTime;
- LOCKBLOB_K_SCALE, //float knockbackScale;
- qfalse, //qboolean hasAltMode;
- qfalse, //qboolean hasThirdMode;
- qfalse, //qboolean canZoom;
- 90.0f, //float zoomFov;
- qfalse, //qboolean purchasable;
- qfalse, //qboolean longRanged;
- TEAM_ALIENS //team_t team;
- },
- {
- WP_HIVE, //int weaponNum;
- 0, //int price;
- ( 1 << S1 )|( 1 << S2 )|( 1 << S3 ), //int stages
- SLOT_WEAPON, //int slots;
- "hive", //char *weaponName;
- "Hive", //char *humanName;
- "",
- 0, //int maxAmmo;
- 0, //int maxClips;
- qtrue, //int infiniteAmmo;
- qfalse, //int usesEnergy;
- 500, //int repeatRate1;
- 500, //int repeatRate2;
- 500, //int repeatRate3;
- 0, //int reloadTime;
- HIVE_K_SCALE, //float knockbackScale;
- qfalse, //qboolean hasAltMode;
- qfalse, //qboolean hasThirdMode;
- qfalse, //qboolean canZoom;
- 90.0f, //float zoomFov;
- qfalse, //qboolean purchasable;
- qfalse, //qboolean longRanged;
- TEAM_ALIENS //team_t team;
- },
- {
- WP_TESLAGEN, //int weaponNum;
- 0, //int price;
- ( 1 << S1 )|( 1 << S2 )|( 1 << S3 ), //int stages
- SLOT_WEAPON, //int slots;
- "teslagen", //char *weaponName;
- "Tesla Generator", //char *humanName;
- "",
- 0, //int maxAmmo;
- 0, //int maxClips;
- qtrue, //int infiniteAmmo;
- qtrue, //int usesEnergy;
- 500, //int repeatRate1;
- 500, //int repeatRate2;
- 500, //int repeatRate3;
- 0, //int reloadTime;
- TESLAGEN_K_SCALE, //float knockbackScale;
- qfalse, //qboolean hasAltMode;
- qfalse, //qboolean hasThirdMode;
- qfalse, //qboolean canZoom;
- 90.0f, //float zoomFov;
- qfalse, //qboolean purchasable;
- qfalse, //qboolean longRanged;
- TEAM_HUMANS //team_t team;
- },
- {
- WP_MGTURRET, //int weaponNum;
- 0, //int price;
- ( 1 << S1 )|( 1 << S2 )|( 1 << S3 ), //int stages
- SLOT_WEAPON, //int slots;
- "mgturret", //char *weaponName;
- "Machinegun Turret", //char *humanName;
- "",
- 0, //int maxAmmo;
- 0, //int maxClips;
- qtrue, //int infiniteAmmo;
- qfalse, //int usesEnergy;
- 0, //int repeatRate1;
- 0, //int repeatRate2;
- 0, //int repeatRate3;
- 0, //int reloadTime;
- MGTURRET_K_SCALE, //float knockbackScale;
- qfalse, //qboolean hasAltMode;
- qfalse, //qboolean hasThirdMode;
- qfalse, //qboolean canZoom;
- 90.0f, //float zoomFov;
- qfalse, //qboolean purchasable;
- qfalse, //qboolean longRanged;
- TEAM_HUMANS //team_t team;
- },
- {
- WP_MGTURRET2, //int weaponNum;
- 0, //int price;
- ( 1 << S3 ), //int stages
- SLOT_WEAPON, //int slots;
- "mgturret2", //char *weaponName;
- "Machinegun Turret2", //char *humanName;
- "",
- 0, //int maxAmmo;
- 0, //int maxClips;
- qtrue, //int infiniteAmmo;
- qfalse, //int usesEnergy;
- 0, //int repeatRate1;
- 0, //int repeatRate2;
- 0, //int repeatRate3;
- 0, //int reloadTime;
- MGTURRET2_K_SCALE, //float knockbackScale;
- qfalse, //qboolean hasAltMode;
- qfalse, //qboolean hasThirdMode;
- qfalse, //qboolean canZoom;
- 90.0f, //float zoomFov;
- qfalse, //qboolean purchasable;
- qfalse, //qboolean longRanged;
- TEAM_HUMANS //team_t team;
- },
- {
- WP_ABUILD, //int weaponNum;
- 0, //int price;
- ( 1 << S1 )|( 1 << S2 )|( 1 << S3 ), //int stages
- SLOT_WEAPON, //int slots;
- "abuild", //char *weaponName;
- "Alien build weapon", //char *humanName;
- "",
- 0, //int maxAmmo;
- 0, //int maxClips;
- qtrue, //int infiniteAmmo;
- qfalse, //int usesEnergy;
- ABUILDER_BUILD_REPEAT,//int repeatRate1;
- ABUILDER_CLAW_REPEAT, //int repeatRate2;
- 0, //int repeatRate3;
- 0, //int reloadTime;
- ABUILDER_CLAW_K_SCALE,//float knockbackScale;
- qtrue, //qboolean hasAltMode;
- qfalse, //qboolean hasThirdMode;
- qfalse, //qboolean canZoom;
- 90.0f, //float zoomFov;
- qtrue, //qboolean purchasable;
- qfalse, //qboolean longRanged;
- TEAM_ALIENS //team_t team;
- },
- {
- WP_ABUILD2, //int weaponNum;
- 0, //int price;
- ( 1 << S1 )|( 1 << S2 )|( 1 << S3 ), //int stages
- SLOT_WEAPON, //int slots;
- "abuildupg", //char *weaponName;
- "Alien build weapon2",//char *humanName;
- "",
- 0, //int maxAmmo;
- 0, //int maxClips;
- qtrue, //int infiniteAmmo;
- qfalse, //int usesEnergy;
- ABUILDER_BUILD_REPEAT,//int repeatRate1;
- ABUILDER_CLAW_REPEAT, //int repeatRate2;
- ABUILDER_BLOB_REPEAT, //int repeatRate3;
- 0, //int reloadTime;
- ABUILDER_CLAW_K_SCALE,//float knockbackScale;
- qtrue, //qboolean hasAltMode;
- qtrue, //qboolean hasThirdMode;
- qfalse, //qboolean canZoom;
- 90.0f, //float zoomFov;
- qtrue, //qboolean purchasable;
- qfalse, //qboolean longRanged;
- TEAM_ALIENS //team_t team;
- },
- {
- WP_HBUILD, //int weaponNum;
- HBUILD_PRICE, //int price;
- ( 1 << S1 )|( 1 << S2 )|( 1 << S3 ), //int stages
- SLOT_WEAPON, //int slots;
- "ckit", //char *weaponName;
- "[yetool]Construction Kit", //char *humanName;
- "Used for building structures. This includes "
- "spawns, power and basic defense. More structures become "
- "available with new stages.",
- 0, //int maxAmmo;
- 0, //int maxClips;
- qtrue, //int infiniteAmmo;
- qfalse, //int usesEnergy;
- HBUILD_REPEAT, //int repeatRate1;
- 0, //int repeatRate2;
- 0, //int repeatRate3;
- 0, //int reloadTime;
- 0.0f, //float knockbackScale;
- qtrue, //qboolean hasAltMode;
- qfalse, //qboolean hasThirdMode;
- qfalse, //qboolean canZoom;
- 90.0f, //float zoomFov;
- qtrue, //qboolean purchasable;
- qfalse, //qboolean longRanged;
- TEAM_HUMANS //team_t team;
- }
-};
-
-int bg_numWeapons = sizeof( bg_weapons ) / sizeof( bg_weapons[ 0 ] );
-static const weaponAttributes_t nullWeapon = { 0 };
-
-/*
-==============
-BG_WeaponByName
-==============
-*/
-const weaponAttributes_t *BG_WeaponByName( const char *name )
-{
- int i;
-
- for( i = 0; i < bg_numWeapons; i++ )
- {
- if( !Q_stricmp( bg_weapons[ i ].name, name ) )
- {
- return &bg_weapons[ i ];
- }
- }
- return &nullWeapon;
-}
-
-/*
-==============
-BG_Weapon
-==============
-*/
-const weaponAttributes_t *BG_Weapon( weapon_t weapon )
-{
- return ( weapon > WP_NONE && weapon < WP_NUM_WEAPONS ) ?
- &bg_weapons[ weapon - 1 ] : &nullWeapon;
-}
-
-/*
-==============
-BG_WeaponAllowedInStage
-==============
-*/
-qboolean BG_WeaponAllowedInStage( weapon_t weapon, stage_t stage )
-{
- int stages = BG_Weapon( weapon )->stages;
-
- return stages & ( 1 << stage );
-}
-
-static const upgradeAttributes_t bg_upgrades[ ] =
-{
- {
- UP_LIGHTARMOUR, //int upgradeNum;
- LIGHTARMOUR_PRICE, //int price;
- ( 1 << S1 )|( 1 << S2 )|( 1 << S3 ), //int stages
- SLOT_TORSO|SLOT_ARMS|SLOT_LEGS, //int slots;
- "larmour", //char *upgradeName;
- "[yeshield]Light Armour", //char *humanName;
- "Protective armour that helps to defend against light alien melee "
- "attacks.",
- "icons/iconu_larmour",
- qtrue, //qboolean purchasable
- qfalse, //qboolean usable
- TEAM_HUMANS //team_t team;
- },
- {
- UP_HELMET, //int upgradeNum;
- HELMET_PRICE, //int price;
- ( 1 << S2 )|( 1 << S3 ), //int stages
- SLOT_HEAD, //int slots;
- "helmet", //char *upgradeName;
- "[yeshield]Helmet", //char *humanName;
- "In addition to protecting your head, the helmet provides a "
- "scanner indicating the presence of any friendly or hostile "
- "lifeforms and structures in your immediate vicinity.",
- "icons/iconu_helmet",
- qtrue, //qboolean purchasable
- qfalse, //qboolean usable
- TEAM_HUMANS //team_t team;
- },
- {
- UP_MEDKIT, //int upgradeNum;
- MEDKIT_PRICE, //int price;
- ( 1 << S1 )|( 1 << S2 )|( 1 << S3 ), //int stages
- SLOT_NONE, //int slots;
- "medkit", //char *upgradeName;
- "[yemed]Medkit", //char *humanName;
- "Basic health kit. ",
- "icons/iconu_atoxin",
- qtrue, //qboolean purchasable
- qtrue, //qboolean usable
- TEAM_HUMANS //team_t team;
- },
- {
- UP_BIOKIT, //int upgradeNum;
- BIOKIT_PRICE, //int price;
- ( 1 << S2 )|( 1 << S3 ), //int stages
- SLOT_NONE, //int slots;
- "biokit", //char *upgradeName;
- "[yebiok]Biokit", //char *humanName;
- "The Biokit is a biological enhancement system that heals "
- "wounds, improves stamina, and provides some resistance to "
- "alien infection.",
- "icons/iconu_biokit",
- qtrue, //qboolean purchasable
- qfalse, //qboolean usable
- TEAM_HUMANS //team_t team;
- },
- {
- UP_CLOAK, //int upgradeNum;
- CLOAK_PRICE, //int price;
- ( 1 << S2 )|( 1 << S3 ),//int stages
- SLOT_NONE, //int slots;
- "cloak", //char *upgradeName;
- "[yecloa]Cloak", //char *humanName;
- "Invisibility cloak that can be used to sneak up on aliens "
- "without being seen. The cloak lasts for 30 seconds once it "
- "is activated. Back-mounted battery pack and jet pack will "
- "stay visible.",
- "icons/iconu_cloak",
- qtrue, //qboolean purchasable
- qtrue, //qboolean usable
- TEAM_HUMANS //team_t team;
- },
- {
- UP_BATTPACK, //int upgradeNum;
- BATTPACK_PRICE, //int price;
- ( 1 << S1 )|( 1 << S2 )|( 1 << S3 ), //int stages
- SLOT_BACKPACK, //int slots;
- "battpack", //char *upgradeName;
- "[yebat]Battery Pack", //char *humanName;
- "Back-mounted battery pack that permits storage of one and a half "
- "times the normal energy capacity for energy weapons.",
- "icons/iconu_battpack",
- qtrue, //qboolean purchasable
- qfalse, //qboolean usable
- TEAM_HUMANS //team_t team;
- },
- {
- UP_JETPACK, //int upgradeNum;
- JETPACK_PRICE, //int price;
- ( 1 << S2 )|( 1 << S3 ), //int stages
- SLOT_BACKPACK, //int slots;
- "jetpack", //char *upgradeName;
- "[yejet]Jet Pack", //char *humanName;
- "Back-mounted jet pack that enables the user to fly to remote "
- "locations. It is very useful against alien spawns in hard "
- "to reach spots.",
- "icons/iconu_jetpack",
- qtrue, //qboolean purchasable
- qtrue, //qboolean usable
- TEAM_HUMANS //team_t team;
- },
- {
- UP_BATTLESUIT, //int upgradeNum;
- BSUIT_PRICE, //int price;
- ( 1 << S3 ), //int stages
- SLOT_HEAD|SLOT_TORSO|SLOT_ARMS|SLOT_LEGS|SLOT_BACKPACK, //int slots;
- "bsuit", //char *upgradeName;
- "[yeshield]Battlesuit", //char *humanName;
- "A full body armour that is highly effective at repelling alien attacks. "
- "It allows the user to enter hostile situations with a greater degree "
- "of confidence.",
- "icons/iconu_bsuit",
- qtrue, //qboolean purchasable
- qfalse, //qboolean usable
- TEAM_HUMANS //team_t team;
- },
- {
- UP_GRENADE, //int upgradeNum;
- GRENADE_PRICE, //int price;
- ( 1 << S2 )|( 1 << S3 ),//int stages
- SLOT_NONE, //int slots;
- "gren", //char *upgradeName;
- "[yenade]Explosive Grenade", //char *humanName;
- "A small incendinary device ideal for damaging tightly packed "
- "alien structures. Has a five second timer.",
- 0,
- qtrue, //qboolean purchasable
- qtrue, //qboolean usable
- TEAM_HUMANS //team_t team;
- },
- {
- UP_AMMO, //int upgradeNum;
- 0, //int price;
- ( 1 << S1 )|( 1 << S2 )|( 1 << S3 ), //int stages
- SLOT_NONE, //int slots;
- "ammo", //char *upgradeName;
- "[yeammo]Ammunition", //char *humanName;
- "Ammunition for the currently held weapon.",
- 0,
- qtrue, //qboolean purchasable
- qfalse, //qboolean usable
- TEAM_HUMANS //team_t team;
- }
-};
-
-int bg_numUpgrades = sizeof( bg_upgrades ) / sizeof( bg_upgrades[ 0 ] );
-static const upgradeAttributes_t nullUpgrade = { 0 };
-
-/*
-==============
-BG_UpgradeByName
-==============
-*/
-const upgradeAttributes_t *BG_UpgradeByName( const char *name )
-{
- int i;
-
- for( i = 0; i < bg_numUpgrades; i++ )
- {
- if( !Q_stricmp( bg_upgrades[ i ].name, name ) )
- {
- return &bg_upgrades[ i ];
- }
- }
- return &nullUpgrade;
-}
-
-/*
-==============
-BG_Upgrade
-==============
-*/
-const upgradeAttributes_t *BG_Upgrade( upgrade_t upgrade )
-{
- return ( upgrade > UP_NONE && upgrade < UP_NUM_UPGRADES ) ?
- &bg_upgrades[ upgrade - 1 ] : &nullUpgrade;
-}
-
-/*
-==============
-BG_UpgradeAllowedInStage
-==============
-*/
-qboolean BG_UpgradeAllowedInStage( upgrade_t upgrade, stage_t stage )
-{
- int stages = BG_Upgrade( upgrade )->stages;
-
- return stages & ( 1 << stage );
-}
-
-/*
-================
-BG_EvaluateTrajectory
-================
-*/
-void BG_EvaluateTrajectory( const trajectory_t *tr, int atTime, vec3_t result )
-{
- float deltaTime;
- float phase;
-
- switch( tr->trType )
- {
- case TR_STATIONARY:
- case TR_INTERPOLATE:
- VectorCopy( tr->trBase, result );
- break;
-
- case TR_LINEAR:
- deltaTime = ( atTime - tr->trTime ) * 0.001; // milliseconds to seconds
- VectorMA( tr->trBase, deltaTime, tr->trDelta, result );
- break;
-
- case TR_SINE:
- deltaTime = ( atTime - tr->trTime ) / (float)tr->trDuration;
- phase = sin( deltaTime * M_PI * 2 );
- VectorMA( tr->trBase, phase, tr->trDelta, result );
- break;
-
- case TR_LINEAR_STOP:
- if( atTime > tr->trTime + tr->trDuration )
- atTime = tr->trTime + tr->trDuration;
-
- deltaTime = ( atTime - tr->trTime ) * 0.001; // milliseconds to seconds
- if( deltaTime < 0 )
- deltaTime = 0;
-
- VectorMA( tr->trBase, deltaTime, tr->trDelta, result );
- break;
-
- case TR_GRAVITY:
- deltaTime = ( atTime - tr->trTime ) * 0.001; // milliseconds to seconds
- VectorMA( tr->trBase, deltaTime, tr->trDelta, result );
- result[ 2 ] -= 0.5 * DEFAULT_GRAVITY * deltaTime * deltaTime; // FIXME: local gravity...
- break;
-
- case TR_BUOYANCY:
- deltaTime = ( atTime - tr->trTime ) * 0.001; // milliseconds to seconds
- VectorMA( tr->trBase, deltaTime, tr->trDelta, result );
- result[ 2 ] += 0.5 * DEFAULT_GRAVITY * deltaTime * deltaTime; // FIXME: local gravity...
- break;
-
- default:
- Com_Error( ERR_DROP, "BG_EvaluateTrajectory: unknown trType: %i", tr->trTime );
- break;
- }
-}
-
-/*
-================
-BG_EvaluateTrajectoryDelta
-For determining velocity at a given time
-================
-*/
-void BG_EvaluateTrajectoryDelta( const trajectory_t *tr, int atTime, vec3_t result )
-{
- float deltaTime;
- float phase;
-
- switch( tr->trType )
- {
- case TR_STATIONARY:
- case TR_INTERPOLATE:
- VectorClear( result );
- break;
-
- case TR_LINEAR:
- VectorCopy( tr->trDelta, result );
- break;
-
- case TR_SINE:
- deltaTime = ( atTime - tr->trTime ) / (float)tr->trDuration;
- phase = cos( deltaTime * M_PI * 2 ); // derivative of sin = cos
- phase *= 0.5;
- VectorScale( tr->trDelta, phase, result );
- break;
-
- case TR_LINEAR_STOP:
- if( atTime > tr->trTime + tr->trDuration )
- {
- VectorClear( result );
- return;
- }
- VectorCopy( tr->trDelta, result );
- break;
-
- case TR_GRAVITY:
- deltaTime = ( atTime - tr->trTime ) * 0.001; // milliseconds to seconds
- VectorCopy( tr->trDelta, result );
- result[ 2 ] -= DEFAULT_GRAVITY * deltaTime; // FIXME: local gravity...
- break;
-
- case TR_BUOYANCY:
- deltaTime = ( atTime - tr->trTime ) * 0.001; // milliseconds to seconds
- VectorCopy( tr->trDelta, result );
- result[ 2 ] += DEFAULT_GRAVITY * deltaTime; // FIXME: local gravity...
- break;
-
- default:
- Com_Error( ERR_DROP, "BG_EvaluateTrajectoryDelta: unknown trType: %i", tr->trTime );
- break;
- }
-}
-
-char *eventnames[ ] =
-{
- "EV_NONE",
- "EV_FOOTSTEP",
- "EV_FOOTSTEP_METAL",
- "EV_FOOTSTEP_SQUELCH",
- "EV_FOOTSPLASH",
- "EV_FOOTWADE",
- "EV_SWIM",
- "EV_STEP_4",
- "EV_STEP_8",
- "EV_STEP_12",
- "EV_STEP_16",
- "EV_STEPDN_4",
- "EV_STEPDN_8",
- "EV_STEPDN_12",
- "EV_STEPDN_16",
- "EV_FALL_SHORT",
- "EV_FALL_MEDIUM",
- "EV_FALL_FAR",
- "EV_FALLING",
- "EV_JUMP",
- "EV_AIRPOUNCE",
- "EV_WATER_TOUCH", // foot touches
- "EV_WATER_LEAVE", // foot leaves
- "EV_WATER_UNDER", // head touches
- "EV_WATER_CLEAR", // head leaves
- "EV_NOAMMO",
- "EV_CHANGE_WEAPON",
- "EV_FIRE_WEAPON",
- "EV_FIRE_WEAPON2",
- "EV_FIRE_WEAPON3",
- "EV_PLAYER_RESPAWN", // for fovwarp effects
- "EV_PLAYER_TELEPORT_IN",
- "EV_PLAYER_TELEPORT_OUT",
- "EV_GRENADE_BOUNCE", // eventParm will be the soundindex
- "EV_MINE_BOUNCE", // eventParm will be the soundindex
- "EV_GENERAL_SOUND",
- "EV_GLOBAL_SOUND", // no attenuation
- "EV_BULLET_HIT_FLESH",
- "EV_BULLET_HIT_WALL",
- "EV_SHOTGUN",
- "EV_MASS_DRIVER",
- "EV_MISSILE_HIT",
- "EV_MISSILE_MISS",
- "EV_MISSILE_MISS_METAL",
- "EV_TESLATRAIL",
- "EV_SLIMETRAIL",
- "EV_BULLET", // otherEntity is the shooter
- "EV_LEV1_GRAB",
- "EV_LEV4_TRAMPLE_PREPARE",
- "EV_LEV4_TRAMPLE_START",
- "EV_PAIN",
- "EV_DEATH1",
- "EV_DEATH2",
- "EV_DEATH3",
- "EV_OBITUARY",
- "EV_GIB_PLAYER", // gib a previously living player
- "EV_BUILD_CONSTRUCT",
- "EV_BUILD_DESTROY",
- "EV_BUILD_DELAY", // can't build yet
- "EV_BUILD_REPAIR", // repairing buildable
- "EV_BUILD_REPAIRED", // buildable has full health
- "EV_HUMAN_BUILDABLE_EXPLOSION",
- "EV_ALIEN_BUILDABLE_EXPLOSION",
- "EV_ALIEN_ACIDTUBE",
- "EV_ALIEN_SLIME",
- "EV_FORCE_FIELD",
- "EV_MEDKIT_USED",
- "EV_ALIEN_EVOLVE",
- "EV_ALIEN_EVOLVE_FAILED",
- "EV_DEBUG_LINE",
- "EV_STOPLOOPINGSOUND",
- "EV_TAUNT",
- "EV_HUMMEL",
- "EV_OVERMIND_ATTACK", // overmind under attack
- "EV_OVERMIND_DYING", // overmind close to death
- "EV_OVERMIND_SPAWNS", // overmind needs spawns
- "EV_DCC_ATTACK", // dcc under attack
- "EV_MGTURRET_SPINUP", // trigger a sound
- "EV_RPTUSE_SOUND", // trigger a sound
- "EV_LEV2_ZAP",
- "EV_ACIDBOMB_BOUNCE"
-};
-
-/*
-===============
-BG_EventName
-===============
-*/
-const char *BG_EventName( int num )
-{
- if( num < 0 || num >= sizeof( eventnames ) / sizeof( char * ) )
- return "UNKNOWN";
-
- return eventnames[ num ];
-}
-
-/*
-===============
-BG_AddPredictableEventToPlayerstate
-
-Handles the sequence numbers
-===============
-*/
-
-void trap_Cvar_VariableStringBuffer( const char *var_name, char *buffer, int bufsize );
-
-void BG_AddPredictableEventToPlayerstate( int newEvent, int eventParm, playerState_t *ps )
-{
-#ifdef _DEBUG
- {
- char buf[ 256 ];
- trap_Cvar_VariableStringBuffer( "showevents", buf, sizeof( buf ) );
-
- if( atof( buf ) != 0 )
- {
-#ifdef GAME
- Com_Printf( " game event svt %5d -> %5d: num = %20s parm %d\n",
- ps->pmove_framecount/*ps->commandTime*/, ps->eventSequence,
- BG_EventName( newEvent ), eventParm );
-#else
- Com_Printf( "Cgame event svt %5d -> %5d: num = %20s parm %d\n",
- ps->pmove_framecount/*ps->commandTime*/, ps->eventSequence,
- BG_EventName( newEvent ), eventParm );
-#endif
- }
- }
-#endif
- ps->events[ ps->eventSequence & ( MAX_PS_EVENTS - 1 ) ] = newEvent;
- ps->eventParms[ ps->eventSequence & ( MAX_PS_EVENTS - 1 ) ] = eventParm;
- ps->eventSequence++;
-}
-
-
-/*
-========================
-BG_PlayerStateToEntityState
-
-This is done after each set of usercmd_t on the server,
-and after local prediction on the client
-========================
-*/
-void BG_PlayerStateToEntityState( playerState_t *ps, entityState_t *s, qboolean snap )
-{
- int i;
-
- if( ps->pm_type == PM_INTERMISSION || ps->pm_type == PM_SPECTATOR || ps->pm_type == PM_FREEZE )
- s->eType = ET_INVISIBLE;
- else if( ps->persistant[ PERS_SPECSTATE ] != SPECTATOR_NOT )
- s->eType = ET_INVISIBLE;
- else
- s->eType = ET_PLAYER;
-
- s->number = ps->clientNum;
-
- s->pos.trType = TR_INTERPOLATE;
- VectorCopy( ps->origin, s->pos.trBase );
-
- if( snap )
- SnapVector( s->pos.trBase );
-
- //set the trDelta for flag direction
- VectorCopy( ps->velocity, s->pos.trDelta );
-
- s->apos.trType = TR_INTERPOLATE;
- VectorCopy( ps->viewangles, s->apos.trBase );
-
- if( snap )
- SnapVector( s->apos.trBase );
-
- s->time2 = ps->movementDir;
- s->legsAnim = ps->legsAnim;
- s->torsoAnim = ps->torsoAnim;
- s->weaponAnim = ps->weaponAnim;
- s->clientNum = ps->clientNum; // ET_PLAYER looks here instead of at number
- // so corpses can also reference the proper config
- s->eFlags = ps->eFlags;
- if( ps->stats[STAT_HEALTH] <= 0 )
- s->eFlags |= EF_DEAD;
- else
- s->eFlags &= ~EF_DEAD;
-
- if( ps->stats[ STAT_STATE ] & SS_BLOBLOCKED )
- s->eFlags |= EF_BLOBLOCKED;
- else
- s->eFlags &= ~EF_BLOBLOCKED;
-
- if( ps->externalEvent )
- {
- s->event = ps->externalEvent;
- s->eventParm = ps->externalEventParm;
- }
- else if( ps->entityEventSequence < ps->eventSequence )
- {
- int seq;
-
- if( ps->entityEventSequence < ps->eventSequence - MAX_PS_EVENTS )
- ps->entityEventSequence = ps->eventSequence - MAX_PS_EVENTS;
-
- seq = ps->entityEventSequence & ( MAX_PS_EVENTS - 1 );
- s->event = ps->events[ seq ] | ( ( ps->entityEventSequence & 3 ) << 8 );
- s->eventParm = ps->eventParms[ seq ];
- ps->entityEventSequence++;
- }
-
- s->weapon = ps->weapon;
- s->groundEntityNum = ps->groundEntityNum;
-
- //store items held and active items in modelindex and modelindex2
- s->modelindex = 0;
- s->modelindex2 = 0;
- for( i = UP_NONE + 1; i < UP_NUM_UPGRADES; i++ )
- {
- if( BG_InventoryContainsUpgrade( i, ps->stats ) )
- {
- s->modelindex |= 1 << i;
-
- if( BG_UpgradeIsActive( i, ps->stats ) )
- s->modelindex2 |= 1 << i;
- }
- }
-
- // use misc field to store team/class info:
- s->misc = ps->stats[ STAT_TEAM ] | ( ps->stats[ STAT_CLASS ] << 8 );
-
- // have to get the surfNormal through somehow...
- VectorCopy( ps->grapplePoint, s->angles2 );
-
- s->loopSound = ps->loopSound;
- s->generic1 = ps->generic1;
-
- if( s->generic1 <= WPM_NONE || s->generic1 >= WPM_NUM_WEAPONMODES )
- s->generic1 = WPM_PRIMARY;
-
- s->otherEntityNum = ps->otherEntityNum;
-}
-
-/*
-========================
-BG_PlayerStateToEntityStateExtraPolate
-This is done after each set of usercmd_t on the server,
-and after local prediction on the client
-========================
-*/
-void BG_PlayerStateToEntityStateExtraPolate( playerState_t *ps, entityState_t *s, int time, qboolean snap )
-{
- int i;
-
- if( ps->pm_type == PM_INTERMISSION || ps->pm_type == PM_SPECTATOR || ps->pm_type == PM_FREEZE )
- s->eType = ET_INVISIBLE;
- else if( ps->persistant[ PERS_SPECSTATE ] != SPECTATOR_NOT )
- s->eType = ET_INVISIBLE;
- else
- s->eType = ET_PLAYER;
-
- s->number = ps->clientNum;
-
- s->pos.trType = TR_LINEAR_STOP;
- VectorCopy( ps->origin, s->pos.trBase );
-
- if( snap )
- SnapVector( s->pos.trBase );
-
- // set the trDelta for flag direction and linear prediction
- VectorCopy( ps->velocity, s->pos.trDelta );
- // set the time for linear prediction
- s->pos.trTime = time;
- // set maximum extra polation time
- s->pos.trDuration = 50; // 1000 / sv_fps (default = 20)
-
- s->apos.trType = TR_INTERPOLATE;
- VectorCopy( ps->viewangles, s->apos.trBase );
- if( snap )
- SnapVector( s->apos.trBase );
-
- s->time2 = ps->movementDir;
- s->legsAnim = ps->legsAnim;
- s->torsoAnim = ps->torsoAnim;
- s->weaponAnim = ps->weaponAnim;
- s->clientNum = ps->clientNum; // ET_PLAYER looks here instead of at number
- // so corpses can also reference the proper config
- s->eFlags = ps->eFlags;
-
- if( ps->stats[STAT_HEALTH] <= 0 )
- s->eFlags |= EF_DEAD;
- else
- s->eFlags &= ~EF_DEAD;
-
- if( ps->stats[ STAT_STATE ] & SS_BLOBLOCKED )
- s->eFlags |= EF_BLOBLOCKED;
- else
- s->eFlags &= ~EF_BLOBLOCKED;
-
- if( ps->externalEvent )
- {
- s->event = ps->externalEvent;
- s->eventParm = ps->externalEventParm;
- }
- else if( ps->entityEventSequence < ps->eventSequence )
- {
- int seq;
-
- if( ps->entityEventSequence < ps->eventSequence - MAX_PS_EVENTS )
- ps->entityEventSequence = ps->eventSequence - MAX_PS_EVENTS;
-
- seq = ps->entityEventSequence & ( MAX_PS_EVENTS - 1 );
- s->event = ps->events[ seq ] | ( ( ps->entityEventSequence & 3 ) << 8 );
- s->eventParm = ps->eventParms[ seq ];
- ps->entityEventSequence++;
- }
-
- s->weapon = ps->weapon;
- s->groundEntityNum = ps->groundEntityNum;
-
- //store items held and active items in modelindex and modelindex2
- s->modelindex = 0;
- s->modelindex2 = 0;
-
- for( i = UP_NONE + 1; i < UP_NUM_UPGRADES; i++ )
- {
- if( BG_InventoryContainsUpgrade( i, ps->stats ) )
- {
- s->modelindex |= 1 << i;
-
- if( BG_UpgradeIsActive( i, ps->stats ) )
- s->modelindex2 |= 1 << i;
- }
- }
-
- // use misc field to store team/class info:
- s->misc = ps->stats[ STAT_TEAM ] | ( ps->stats[ STAT_CLASS ] << 8 );
-
- // have to get the surfNormal through somehow...
- VectorCopy( ps->grapplePoint, s->angles2 );
-
- s->loopSound = ps->loopSound;
- s->generic1 = ps->generic1;
-
- if( s->generic1 <= WPM_NONE || s->generic1 >= WPM_NUM_WEAPONMODES )
- s->generic1 = WPM_PRIMARY;
-
- s->otherEntityNum = ps->otherEntityNum;
-}
-
-/*
-========================
-BG_WeaponIsFull
-Check if a weapon has full ammo
-========================
-*/
-qboolean BG_WeaponIsFull( weapon_t weapon, int stats[ ], int ammo, int clips )
-{
- int maxAmmo, maxClips;
-
- maxAmmo = BG_Weapon( weapon )->maxAmmo;
- maxClips = BG_Weapon( weapon )->maxClips;
-
- if( BG_InventoryContainsUpgrade( UP_BATTPACK, stats ) )
- maxAmmo = (int)( (float)maxAmmo * BATTPACK_MODIFIER );
-
-
- return ( maxAmmo == ammo ) && ( maxClips == clips );
-}
-
-/*
-========================
-BG_InventoryContainsWeapon
-Does the player hold a weapon?
-========================
-*/
-qboolean BG_InventoryContainsWeapon( int weapon, int stats[ ] )
-{
- // humans always have a blaster
- if( stats[ STAT_TEAM ] == TEAM_HUMANS && weapon == WP_BLASTER )
- return qtrue;
-
- return ( stats[ STAT_WEAPON ] == weapon );
-}
-
-/*
-========================
-BG_SlotsForInventory
-Calculate the slots used by an inventory and warn of conflicts
-========================
-*/
-int BG_SlotsForInventory( int stats[ ] )
-{
- int i, slot, slots;
-
- slots = BG_Weapon( stats[ STAT_WEAPON ] )->slots;
- if( stats[ STAT_TEAM ] == TEAM_HUMANS )
- slots |= BG_Weapon( WP_BLASTER )->slots;
-
- for( i = UP_NONE; i < UP_NUM_UPGRADES; i++ )
- {
- if( BG_InventoryContainsUpgrade( i, stats ) )
- {
- slot = BG_Upgrade( i )->slots;
-
- // this check should never be true
- if( slots & slot )
- {
- Com_Printf( S_COLOR_YELLOW "WARNING: held item %d conflicts with "
- "inventory slot %d\n", i, slot );
- }
-
- slots |= slot;
- }
- }
- return slots;
-}
-
-/*
-========================
-BG_AddUpgradeToInventory
-Give the player an upgrade
-========================
-*/
-void BG_AddUpgradeToInventory( int item, int stats[ ] )
-{
- stats[ STAT_ITEMS ] |= ( 1 << item );
-}
-
-/*
-========================
-BG_RemoveUpgradeFromInventory
-Take an upgrade from the player
-========================
-*/
-void BG_RemoveUpgradeFromInventory( int item, int stats[ ] )
-{
- stats[ STAT_ITEMS ] &= ~( 1 << item );
-}
-
-/*
-========================
-BG_InventoryContainsUpgrade
-Does the player hold an upgrade?
-========================
-*/
-qboolean BG_InventoryContainsUpgrade( int item, int stats[ ] )
-{
- return( stats[ STAT_ITEMS ] & ( 1 << item ) );
-}
-
-/*
-========================
-BG_ActivateUpgrade
-Activates an upgrade
-========================
-*/
-void BG_ActivateUpgrade( int item, int stats[ ] )
-{
- stats[ STAT_ACTIVEITEMS ] |= ( 1 << item );
-}
-
-/*
-========================
-BG_DeactivateUpgrade
-Deactivates an upgrade
-========================
-*/
-void BG_DeactivateUpgrade( int item, int stats[ ] )
-{
- stats[ STAT_ACTIVEITEMS ] &= ~( 1 << item );
-}
-
-/*
-========================
-BG_UpgradeIsActive
-Is this upgrade active?
-========================
-*/
-qboolean BG_UpgradeIsActive( int item, int stats[ ] )
-{
- return( stats[ STAT_ACTIVEITEMS ] & ( 1 << item ) );
-}
-
-/*
-===============
-BG_RotateAxis
-Shared axis rotation function
-===============
-*/
-qboolean BG_RotateAxis( vec3_t surfNormal, vec3_t inAxis[ 3 ],
- vec3_t outAxis[ 3 ], qboolean inverse, qboolean ceiling )
-{
- vec3_t refNormal = { 0.0f, 0.0f, 1.0f };
- vec3_t ceilingNormal = { 0.0f, 0.0f, -1.0f };
- vec3_t localNormal, xNormal;
- float rotAngle;
-
- //the grapplePoint being a surfNormal rotation Normal hack... see above :)
- if( ceiling )
- {
- VectorCopy( ceilingNormal, localNormal );
- VectorCopy( surfNormal, xNormal );
- }
- else
- {
- //cross the reference normal and the surface normal to get the rotation axis
- VectorCopy( surfNormal, localNormal );
- CrossProduct( localNormal, refNormal, xNormal );
- VectorNormalize( xNormal );
- }
-
- //can't rotate with no rotation vector
- if( VectorLength( xNormal ) != 0.0f )
- {
- rotAngle = RAD2DEG( acos( DotProduct( localNormal, refNormal ) ) );
-
- if( inverse )
- rotAngle = -rotAngle;
-
- AngleNormalize180( rotAngle );
-
- //hmmm could get away with only one rotation and some clever stuff later... but i'm lazy
- RotatePointAroundVector( outAxis[ 0 ], xNormal, inAxis[ 0 ], -rotAngle );
- RotatePointAroundVector( outAxis[ 1 ], xNormal, inAxis[ 1 ], -rotAngle );
- RotatePointAroundVector( outAxis[ 2 ], xNormal, inAxis[ 2 ], -rotAngle );
- }
- else
- return qfalse;
- return qtrue;
-}
-
-/*
-===============
-BG_GetClientNormal
-Get the normal for the surface the client is walking on
-===============
-*/
-void BG_GetClientNormal( const playerState_t *ps, vec3_t normal )
-{
- if( ps->stats[ STAT_STATE ] & SS_WALLCLIMBING )
- {
- if( ps->eFlags & EF_WALLCLIMBCEILING )
- VectorSet( normal, 0.0f, 0.0f, -1.0f );
- else
- VectorCopy( ps->grapplePoint, normal );
- }
- else
- VectorSet( normal, 0.0f, 0.0f, 1.0f );
-}
-
-/*
-===============
-BG_GetClientViewOrigin
-Get the position of the client's eye, based on the client's position, the surface's normal, and client's view height
-===============
-*/
-void BG_GetClientViewOrigin( const playerState_t *ps, vec3_t viewOrigin )
-{
- vec3_t normal;
- BG_GetClientNormal( ps, normal );
- VectorMA( ps->origin, ps->viewheight, normal, viewOrigin );
-}
-
-/*
-===============
-BG_PositionBuildableRelativeToPlayer
-Find a place to build a buildable
-===============
-*/
-void BG_PositionBuildableRelativeToPlayer( const playerState_t *ps,
- const vec3_t mins, const vec3_t maxs,
- void (*trace)( trace_t *, const vec3_t, const vec3_t,
- const vec3_t, const vec3_t, int, int ),
- vec3_t outOrigin, vec3_t outAngles, trace_t *tr )
-{
- vec3_t forward, entityOrigin, targetOrigin;
- vec3_t angles, playerOrigin, playerNormal;
- float buildDist;
-
- BG_GetClientNormal( ps, playerNormal );
-
- VectorCopy( ps->viewangles, angles );
- VectorCopy( ps->origin, playerOrigin );
- buildDist = BG_Class( ps->stats[ STAT_CLASS ] )->buildDist;
-
- AngleVectors( angles, forward, NULL, NULL );
- ProjectPointOnPlane( forward, forward, playerNormal );
- VectorNormalize( forward );
-
- VectorMA( playerOrigin, buildDist, forward, entityOrigin );
-
- VectorCopy( entityOrigin, targetOrigin );
-
- //so buildings can be placed facing slopes
- VectorMA( entityOrigin, 32, playerNormal, entityOrigin );
-
- //so buildings drop to floor
- VectorMA( targetOrigin, -128, playerNormal, targetOrigin );
-
- // The mask is MASK_DEADSOLID on purpose to avoid collisions with other entities
- (*trace)( tr, entityOrigin, mins, maxs, targetOrigin, ps->clientNum, MASK_PLAYERSOLID );
- VectorCopy( tr->endpos, entityOrigin );
- VectorMA( entityOrigin, 0.1f, playerNormal, outOrigin );
- vectoangles( forward, outAngles );
-}
-
-/*
-===============
-BG_GetValueOfPlayer
-Returns the credit value of a player
-===============
-*/
-int BG_GetValueOfPlayer( playerState_t *ps )
-{
- int i, worth = 0;
-
- worth = BG_Class( ps->stats[ STAT_CLASS ] )->value;
-
- // Humans have worth from their equipment as well
- if( ps->stats[ STAT_TEAM ] == TEAM_HUMANS )
- {
- for( i = UP_NONE + 1; i < UP_NUM_UPGRADES; i++ )
- {
- if( BG_InventoryContainsUpgrade( i, ps->stats ) )
- worth += BG_Upgrade( i )->price;
- }
-
- for( i = WP_NONE + 1; i < WP_NUM_WEAPONS; i++ )
- {
- if( BG_InventoryContainsWeapon( i, ps->stats ) )
- worth += BG_Weapon( i )->price;
- }
- }
- return worth;
-}
-
-/*
-=================
-BG_PlayerCanChangeWeapon
-=================
-*/
-qboolean BG_PlayerCanChangeWeapon( playerState_t *ps )
-{
- // Do not allow Lucifer Cannon "canceling" via weapon switch
- if( (ps->weapon == WP_LUCIFER_CANNON || ps->weapon == WP_FLAMER) &&
- ps->stats[ STAT_MISC ] > LCANNON_CHARGE_TIME_MIN )
- return qfalse;
-
- return ps->weaponTime <= 0 || ps->weaponstate != WEAPON_FIRING;
-}
-
-/*
-=================
-BG_PlayerPoisonCloudTime
-=================
-*/
-int BG_PlayerPoisonCloudTime( playerState_t *ps )
-{
- int time = LEVEL1_PCLOUD_TIME;
-
- if( BG_InventoryContainsUpgrade( UP_BATTLESUIT, ps->stats ) )
- time -= BSUIT_PCLOUD_PROTECTION;
- if( BG_InventoryContainsUpgrade( UP_HELMET, ps->stats ) )
- time -= HELMET_PCLOUD_PROTECTION;
- if( BG_InventoryContainsUpgrade( UP_LIGHTARMOUR, ps->stats ) )
- time -= LIGHTARMOUR_PCLOUD_PROTECTION;
-
- return time;
-}
-
-/*
-=================
-BG_GetPlayerWeapon
-
-Returns the players current weapon or the weapon they are switching to.
-Only needs to be used for human weapons.
-=================
-*/
-weapon_t BG_GetPlayerWeapon( playerState_t *ps )
-{
- if( ps->persistant[ PERS_NEWWEAPON ] )
- return ps->persistant[ PERS_NEWWEAPON ];
-
- return ps->weapon;
-}
-
-/*
-===============
-atof_neg
-atof with an allowance for negative values
-===============
-*/
-float atof_neg( char *token, qboolean allowNegative )
-{
- float value;
-
- value = atof( token );
-
- if( !allowNegative && value < 0.0f )
- value = 1.0f;
-
- return value;
-}
-
-/*
-===============
-atoi_neg
-atoi with an allowance for negative values
-===============
-*/
-int atoi_neg( char *token, qboolean allowNegative )
-{
- int value;
-
- value = atoi( token );
-
- if( !allowNegative && value < 0 )
- value = 1;
-
- return value;
-}
-
-#define MAX_NUM_PACKED_ENTITY_NUMS 10
-
-/*
-===============
-BG_PackEntityNumbers
-Pack entity numbers into an entityState_t
-===============
-*/
-void BG_PackEntityNumbers( entityState_t *es, const int *entityNums, int count )
-{
- int i;
-
- if( count > MAX_NUM_PACKED_ENTITY_NUMS )
- {
- count = MAX_NUM_PACKED_ENTITY_NUMS;
- Com_Printf( S_COLOR_YELLOW "WARNING: A maximum of %d entity numbers can be "
- "packed, but BG_PackEntityNumbers was passed %d entities",
- MAX_NUM_PACKED_ENTITY_NUMS, count );
- }
-
- es->misc = es->time = es->time2 = es->constantLight = 0;
-
- for( i = 0; i < MAX_NUM_PACKED_ENTITY_NUMS; i++ )
- {
- int entityNum;
-
- if( i < count )
- entityNum = entityNums[ i ];
- else
- entityNum = ENTITYNUM_NONE;
-
- if( entityNum & ~GENTITYNUM_MASK )
- {
- Com_Error( ERR_FATAL, "BG_PackEntityNumbers passed an entity number (%d) which "
- "exceeds %d bits", entityNum, GENTITYNUM_BITS );
- }
-
- switch( i )
- {
- case 0: es->misc |= entityNum; break;
- case 1: es->time |= entityNum; break;
- case 2: es->time |= entityNum << GENTITYNUM_BITS; break;
- case 3: es->time |= entityNum << (GENTITYNUM_BITS * 2); break;
- case 4: es->time2 |= entityNum; break;
- case 5: es->time2 |= entityNum << GENTITYNUM_BITS; break;
- case 6: es->time2 |= entityNum << (GENTITYNUM_BITS * 2); break;
- case 7: es->constantLight |= entityNum; break;
- case 8: es->constantLight |= entityNum << GENTITYNUM_BITS; break;
- case 9: es->constantLight |= entityNum << (GENTITYNUM_BITS * 2); break;
- default: Com_Error( ERR_FATAL, "Entity index %d not handled", i ); break;
- }
- }
-}
-
-/*
-===============
-BG_UnpackEntityNumbers
-Unpack entity numbers from an entityState_t
-===============
-*/
-int BG_UnpackEntityNumbers( entityState_t *es, int *entityNums, int count )
-{
- int i;
-
- if( count > MAX_NUM_PACKED_ENTITY_NUMS )
- count = MAX_NUM_PACKED_ENTITY_NUMS;
-
- for( i = 0; i < count; i++ )
- {
- int *entityNum = &entityNums[ i ];
-
- switch( i )
- {
- case 0: *entityNum = es->misc; break;
- case 1: *entityNum = es->time; break;
- case 2: *entityNum = (es->time >> GENTITYNUM_BITS); break;
- case 3: *entityNum = (es->time >> (GENTITYNUM_BITS * 2)); break;
- case 4: *entityNum = es->time2; break;
- case 5: *entityNum = (es->time2 >> GENTITYNUM_BITS); break;
- case 6: *entityNum = (es->time2 >> (GENTITYNUM_BITS * 2)); break;
- case 7: *entityNum = es->constantLight; break;
- case 8: *entityNum = (es->constantLight >> GENTITYNUM_BITS); break;
- case 9: *entityNum = (es->constantLight >> (GENTITYNUM_BITS * 2)); break;
- default: Com_Error( ERR_FATAL, "Entity index %d not handled", i ); break;
- }
- *entityNum &= GENTITYNUM_MASK;
-
- if( *entityNum == ENTITYNUM_NONE )
- break;
- }
- return i;
-}
-
-/*
-===============
-BG_ParseCSVEquipmentList
-===============
-*/
-void BG_ParseCSVEquipmentList( const char *string, weapon_t *weapons, int weaponsSize,
- upgrade_t *upgrades, int upgradesSize )
-{
- char buffer[ MAX_STRING_CHARS ];
- int i = 0, j = 0;
- char *p, *q;
- qboolean EOS = qfalse;
-
- Q_strncpyz( buffer, string, MAX_STRING_CHARS );
-
- p = q = buffer;
-
- while( *p != '\0' )
- {
- //skip to first , or EOS
- while( *p != ',' && *p != '\0' )
- p++;
-
- if( *p == '\0' )
- EOS = qtrue;
-
- *p = '\0';
-
- //strip leading whitespace
- while( *q == ' ' )
- q++;
-
- if( weaponsSize )
- weapons[ i ] = BG_WeaponByName( q )->number;
-
- if( upgradesSize )
- upgrades[ j ] = BG_UpgradeByName( q )->number;
-
- if( weaponsSize && weapons[ i ] == WP_NONE &&
- upgradesSize && upgrades[ j ] == UP_NONE )
- Com_Printf( S_COLOR_YELLOW "WARNING: unknown equipment %s\n", q );
- else if( weaponsSize && weapons[ i ] != WP_NONE )
- i++;
- else if( upgradesSize && upgrades[ j ] != UP_NONE )
- j++;
-
- if( !EOS )
- {
- p++;
- q = p;
- }
- else
- break;
-
- if( i == ( weaponsSize - 1 ) || j == ( upgradesSize - 1 ) )
- break;
- }
-
- if( weaponsSize )
- weapons[ i ] = WP_NONE;
-
- if( upgradesSize )
- upgrades[ j ] = UP_NONE;
-}
-
-/*
-===============
-BG_ParseCSVClassList
-===============
-*/
-void BG_ParseCSVClassList( const char *string, class_t *classes, int classesSize )
-{
- char buffer[ MAX_STRING_CHARS ];
- int i = 0;
- char *p, *q;
- qboolean EOS = qfalse;
-
- Q_strncpyz( buffer, string, MAX_STRING_CHARS );
-
- p = q = buffer;
-
- while( *p != '\0' && i < classesSize - 1 )
- {
- //skip to first , or EOS
- while( *p != ',' && *p != '\0' )
- p++;
-
- if( *p == '\0' )
- EOS = qtrue;
-
- *p = '\0';
-
- //strip leading whitespace
- while( *q == ' ' )
- q++;
-
- classes[ i ] = BG_ClassByName( q )->number;
-
- if( classes[ i ] == PCL_NONE )
- Com_Printf( S_COLOR_YELLOW "WARNING: unknown class %s\n", q );
- else
- i++;
-
- if( !EOS )
- {
- p++;
- q = p;
- }
- else
- break;
- }
-
- classes[ i ] = PCL_NONE;
-}
-
-/*
-===============
-BG_ParseCSVBuildableList
-===============
-*/
-void BG_ParseCSVBuildableList( const char *string, buildable_t *buildables, int buildablesSize )
-{
- char buffer[ MAX_STRING_CHARS ];
- int i = 0;
- char *p, *q;
- qboolean EOS = qfalse;
-
- Q_strncpyz( buffer, string, MAX_STRING_CHARS );
-
- p = q = buffer;
-
- while( *p != '\0' && i < buildablesSize - 1 )
- {
- //skip to first , or EOS
- while( *p != ',' && *p != '\0' )
- p++;
-
- if( *p == '\0' )
- EOS = qtrue;
-
- *p = '\0';
-
- //strip leading whitespace
- while( *q == ' ' )
- q++;
-
- buildables[ i ] = BG_BuildableByName( q )->number;
-
- if( buildables[ i ] == BA_NONE )
- Com_Printf( S_COLOR_YELLOW "WARNING: unknown buildable %s\n", q );
- else
- i++;
-
- if( !EOS )
- {
- p++;
- q = p;
- }
- else
- break;
- }
-
- buildables[ i ] = BA_NONE;
-}
-
-typedef struct gameElements_s
-{
- buildable_t buildables[ BA_NUM_BUILDABLES ];
- class_t classes[ PCL_NUM_CLASSES ];
- weapon_t weapons[ WP_NUM_WEAPONS ];
- upgrade_t upgrades[ UP_NUM_UPGRADES ];
-} gameElements_t;
-
-static gameElements_t bg_disabledGameElements;
-
-/*
-============
-BG_InitAllowedGameElements
-============
-*/
-void BG_InitAllowedGameElements( void )
-{
- char cvar[ MAX_CVAR_VALUE_STRING ];
-
- trap_Cvar_VariableStringBuffer( "g_disabledEquipment",
- cvar, MAX_CVAR_VALUE_STRING );
-
- BG_ParseCSVEquipmentList( cvar,
- bg_disabledGameElements.weapons, WP_NUM_WEAPONS,
- bg_disabledGameElements.upgrades, UP_NUM_UPGRADES );
-
- trap_Cvar_VariableStringBuffer( "g_disabledClasses",
- cvar, MAX_CVAR_VALUE_STRING );
-
- BG_ParseCSVClassList( cvar,
- bg_disabledGameElements.classes, PCL_NUM_CLASSES );
-
- trap_Cvar_VariableStringBuffer( "g_disabledBuildables",
- cvar, MAX_CVAR_VALUE_STRING );
-
- BG_ParseCSVBuildableList( cvar,
- bg_disabledGameElements.buildables, BA_NUM_BUILDABLES );
-}
-
-/*
-============
-BG_WeaponIsAllowed
-============
-*/
-qboolean BG_WeaponIsAllowed( weapon_t weapon )
-{
- int i;
-
- for( i = 0; i < WP_NUM_WEAPONS &&
- bg_disabledGameElements.weapons[ i ] != WP_NONE; i++ )
- {
- if( bg_disabledGameElements.weapons[ i ] == weapon )
- return qfalse;
- }
-
- return qtrue;
-}
-
-/*
-============
-BG_UpgradeIsAllowed
-============
-*/
-qboolean BG_UpgradeIsAllowed( upgrade_t upgrade )
-{
- int i;
-
- for( i = 0; i < UP_NUM_UPGRADES &&
- bg_disabledGameElements.upgrades[ i ] != UP_NONE; i++ )
- {
- if( bg_disabledGameElements.upgrades[ i ] == upgrade )
- return qfalse;
- }
-
- return qtrue;
-}
-
-/*
-============
-BG_ClassIsAllowed
-============
-*/
-qboolean BG_ClassIsAllowed( class_t class )
-{
- int i;
-
- for( i = 0; i < PCL_NUM_CLASSES &&
- bg_disabledGameElements.classes[ i ] != PCL_NONE; i++ )
- {
- if( bg_disabledGameElements.classes[ i ] == class )
- return qfalse;
- }
-
- return qtrue;
-}
-
-/*
-============
-BG_BuildableIsAllowed
-============
-*/
-qboolean BG_BuildableIsAllowed( buildable_t buildable )
-{
- int i;
-
- for( i = 0; i < BA_NUM_BUILDABLES &&
- bg_disabledGameElements.buildables[ i ] != BA_NONE; i++ )
- {
- if( bg_disabledGameElements.buildables[ i ] == buildable )
- return qfalse;
- }
-
- return qtrue;
-}
-
-/*
-============
-BG_PrimaryWeapon
-============
-*/
-weapon_t BG_PrimaryWeapon( int stats[ ] )
-{
- int i;
-
- for( i = WP_NONE; i < WP_NUM_WEAPONS; i++ )
- {
- if( BG_Weapon( i )->slots != SLOT_WEAPON )
- continue;
- if( BG_InventoryContainsWeapon( i, stats ) )
- return i;
- }
-
- if( BG_InventoryContainsWeapon( WP_BLASTER, stats ) )
- return WP_BLASTER;
-
- return WP_NONE;
-}
-
-/*
-============
-BG_LoadEmoticons
-============
-*/
-int BG_LoadEmoticons( emoticon_t *emoticons, int num )
-{
- int numFiles;
- char fileList[ MAX_EMOTICONS * ( MAX_EMOTICON_NAME_LEN + 9 ) ] = {""};
- int i;
- char *filePtr;
- int fileLen;
- int count;
-
- numFiles = trap_FS_GetFileList( "emoticons", "x1.tga", fileList,
- sizeof( fileList ) );
-
- if( numFiles < 1 )
- return 0;
-
- filePtr = fileList;
- fileLen = 0;
- count = 0;
- for( i = 0; i < numFiles && count < num; i++, filePtr += fileLen + 1 )
- {
- fileLen = strlen( filePtr );
- if( fileLen < 9 || filePtr[ fileLen - 8 ] != '_' ||
- filePtr[ fileLen - 7 ] < '1' || filePtr[ fileLen - 7 ] > '9' )
- {
- Com_Printf( S_COLOR_YELLOW "skipping invalidly named emoticon \"%s\"\n",
- filePtr );
- continue;
- }
- if( fileLen - 8 > MAX_EMOTICON_NAME_LEN )
- {
- Com_Printf( S_COLOR_YELLOW "emoticon file name \"%s\" too long (>%d)\n",
- filePtr, MAX_EMOTICON_NAME_LEN + 8 );
- continue;
- }
- if( !trap_FS_FOpenFile( va( "emoticons/%s", filePtr ), NULL, FS_READ ) )
- {
- Com_Printf( S_COLOR_YELLOW "could not open \"emoticons/%s\"\n", filePtr );
- continue;
- }
-
- Q_strncpyz( emoticons[ count ].name, filePtr, fileLen - 8 + 1 );
-#ifndef GAME
- emoticons[ count ].width = filePtr[ fileLen - 7 ] - '0';
-#endif
- count++;
- }
-
- Com_Printf( "Loaded %d of %d emoticons (MAX_EMOTICONS is %d)\n",
- count, numFiles, MAX_EMOTICONS );
- return count;
-}
-
-/*
-============
-BG_TeamName
-============
-*/
-char *BG_TeamName( team_t team )
-{
- if( team == TEAM_NONE )
- return "spectator";
- if( team == TEAM_ALIENS )
- return "alien";
- if( team == TEAM_HUMANS )
- return "human";
- return "<team>";
-}
-
-int cmdcmp( const void *a, const void *b )
-{
- return Q_stricmp( (const char *)a, ((dummyCmd_t *)b)->name );
-}