1 // Player and other actor definitions 2 3 enum { A_PLAYER = 0, A_BOT, A_TURRET, A_GRUNT, A_DRONE, A_ROLLER, A_MAX, A_ENEMY = A_TURRET, A_TOTAL = A_MAX-A_ENEMY }; 4 5 struct actor 6 { 7 const char *name; 8 int id; 9 bool hastags, jetfx, weapfx, steps, hitboxes, onlyfwd; 10 float height, radius; 11 const char *mdl; 12 }; 13 #ifdef CPP_GAME_SERVER 14 actor actors[] = { 15 { "player", A_PLAYER, true, true, true, true, true, false, 27.f, 5.5f, NULL }, 16 { "bot", A_BOT, true, true, true, true, true, false, 27.f, 5.5f, NULL }, 17 { "turret", A_TURRET, true, true, true, true, true, false, 27.f, 5.5f, NULL }, 18 { "grunt", A_GRUNT, true, true, true, true, true, false, 27.f, 5.5f, NULL }, 19 { "drone", A_DRONE, true, true, true, true, true, false, 27.f, 5.5f, NULL }, 20 { "roller", A_ROLLER, false, false, false, false, false, true, 13.5f, 6.75f, "actors/roller" }, 21 }; 22 #else 23 extern actor actors[]; 24 #endif 25 26 enum 27 { 28 A_A_MOVE = 0, A_A_JUMP, A_A_CROUCH, A_A_SLIDE, A_A_BOOST, A_A_POUND, A_A_PARKOUR, A_A_MELEE, 29 A_A_PRIMARY, A_A_SECONDARY, A_A_PUSHABLE, A_A_AFFINITY, A_A_REGEN, A_A_KAMIKAZE, A_A_MAX, 30 A_A_IMFIRST = A_A_SLIDE, A_A_IMLAST = A_A_PARKOUR, A_A_IMPULSE = A_A_IMLAST-A_A_IMFIRST, A_A_IMCOUNT = A_A_IMPULSE+1, 31 A_A_IMOFFSET = (1<<(A_A_SLIDE-A_A_IMFIRST))|(1<<(A_A_BOOST-A_A_IMFIRST))|(1<<(A_A_POUND-A_A_IMFIRST))|(1<<(A_A_PARKOUR-A_A_IMFIRST)), 32 A_A_IMRELAX = (1<<(A_A_PARKOUR-A_A_IMFIRST)), 33 A_A_ATTACK = (1<<A_A_MELEE)|(1<<A_A_PRIMARY)|(1<<A_A_SECONDARY)|(1<<A_A_KAMIKAZE), 34 A_A_ALL = (1<<A_A_MOVE)|(1<<A_A_JUMP)|(1<<A_A_CROUCH)|(1<<A_A_SLIDE)|(1<<A_A_BOOST)|(1<<A_A_POUND)|(1<<A_A_PARKOUR)|(1<<A_A_MELEE)|(1<<A_A_PRIMARY)|(1<<A_A_SECONDARY)|(1<<A_A_PUSHABLE)|(1<<A_A_AFFINITY)|(1<<A_A_REGEN), 35 A_A_PLAYER = (1<<A_A_MOVE)|(1<<A_A_JUMP)|(1<<A_A_CROUCH)|(1<<A_A_SLIDE)|(1<<A_A_BOOST)|(1<<A_A_POUND)|(1<<A_A_PARKOUR)|(1<<A_A_MELEE)|(1<<A_A_PRIMARY)|(1<<A_A_SECONDARY)|(1<<A_A_PUSHABLE)|(1<<A_A_AFFINITY)|(1<<A_A_REGEN), 36 A_A_MOVINGAI = (1<<A_A_MOVE)|(1<<A_A_JUMP)|(1<<A_A_CROUCH)|(1<<A_A_SLIDE)|(1<<A_A_BOOST)|(1<<A_A_POUND)|(1<<A_A_PARKOUR)|(1<<A_A_MELEE)|(1<<A_A_PRIMARY)|(1<<A_A_SECONDARY)|(1<<A_A_PUSHABLE)|(1<<A_A_AFFINITY)|(1<<A_A_REGEN), 37 A_A_LESSAI = (1<<A_A_MOVE)|(1<<A_A_JUMP)|(1<<A_A_MELEE)|(1<<A_A_PRIMARY)|(1<<A_A_SECONDARY)|(1<<A_A_PUSHABLE), 38 A_A_FIXEDAI = (1<<A_A_PRIMARY)|(1<<A_A_SECONDARY), 39 A_A_ROLLER = (1<<A_A_MOVE)|(1<<A_A_JUMP)|(1<<A_A_PARKOUR)|(1<<A_A_PUSHABLE)|(1<<A_A_KAMIKAZE), 40 }; 41 42 enum 43 { 44 A_C_PLAYERS = 0, A_C_BOTS, A_C_ENEMIES, A_C_MAX, 45 A_C_ALL = (1<<A_C_PLAYERS)|(1<<A_C_BOTS)|(1<<A_C_ENEMIES) 46 }; 47 48 enum 49 { 50 A_T_PLAYERS = 0, A_T_BOTS, A_T_ENEMIES, A_T_GHOST, A_T_MAX, 51 A_T_ALL = (1<<A_T_PLAYERS)|(1<<A_T_BOTS)|(1<<A_T_ENEMIES)|(1<<A_T_GHOST), 52 A_T_PLAYER = (1<<A_T_PLAYERS)|(1<<A_T_BOTS)|(1<<A_T_ENEMIES), 53 A_T_AI = (1<<A_T_BOTS)|(1<<A_T_ENEMIES) 54 }; 55 56 enum 57 { 58 T_NEUTRAL = 0, T_ALPHA, T_OMEGA, T_ENEMY, T_MAX, 59 T_FIRST = T_ALPHA, T_LAST = T_OMEGA, 60 T_COUNT = T_LAST+1, T_NUM = (T_LAST-T_FIRST)+1 61 }; 62 63 enum 64 { 65 TT_INFO = 1<<0, TT_RESET = 1<<1, TT_SMODE = 1<<2, 66 TT_INFOSM = TT_INFO|TT_SMODE, 67 TT_RESETX = TT_INFO|TT_RESET 68 }; 69 70 #ifdef CPP_GAME_SERVER 71 int mapbals[T_NUM][T_NUM] = { 72 { T_ALPHA, T_OMEGA }, 73 { T_OMEGA, T_ALPHA }, 74 }; 75 SVAR(IDF_READONLY, teamnames, "neutral alpha omega enemy"); 76 VAR(IDF_READONLY, teamidxneutral, 1, T_NEUTRAL, -1); 77 VAR(IDF_READONLY, teamidxalpha, 1, T_ALPHA, -1); 78 VAR(IDF_READONLY, teamidxomega, 1, T_OMEGA, -1); 79 VAR(IDF_READONLY, teamidxenemy, 1, T_ENEMY, -1); 80 VAR(IDF_READONLY, teamidxfirst, 1, T_FIRST, -1); 81 VAR(IDF_READONLY, teamidxlast, 1, T_LAST, -1); 82 VAR(IDF_READONLY, teamidxcount, 1, T_COUNT, -1); 83 VAR(IDF_READONLY, teamidxnum, 1, T_NUM, -1); 84 #else 85 extern int mapbals[T_NUM][T_NUM]; 86 #endif 87 88 #include "teamdef.h" 89 90 TPSVAR(IDF_GAMEMOD, 0, name, 91 "Neutral", "Alpha", "Omega", "Enemy" 92 ); 93 TPVAR(IDF_GAMEMOD|IDF_HEX, 0, colour, 0, 0xFFFFFF, 94 0x707070, 0x1040F8, 0xFF3210, 0xE0E020 95 ); 96 97 struct score 98 { 99 int team, total; teamscore100 score(int s = -1, int n = 0) : team(s), total(n) {} ~scorescore101 ~score() {} 102 }; 103 104 #define numteams(a,b) (m_team(a,b) ? T_NUM : 1) 105 #define teamcount(a,b) (m_team(a,b) ? T_COUNT : 1) 106 #define isteam(a,b,c,d) (m_team(a,b) ? (c >= d && c <= numteams(a,b)) : c == T_NEUTRAL) 107 #define valteam(a,b) (a >= b && a <= T_NUM) 108 109 #define PLAYERTYPES 2 110 #define PLAYERPATTERNS 16 111 112 struct playerpattern 113 { 114 const char *filename; 115 const char *id; 116 const char *name; 117 int clamp; 118 float scale; 119 }; 120 121 #ifdef CPP_GAME_SERVER 122 extern const char * const playertypes[PLAYERTYPES][7] = { 123 { "actors/player/male/hwep", "actors/player/male", "actors/player/male/body", "actors/player/male/headless", "player", "male", "Male" }, 124 { "actors/player/female/hwep", "actors/player/female", "actors/player/male/body", "actors/player/female/headless", "player", "female", "Female" } 125 }; 126 127 // final entry is texscale in playerpattern (512x -> 2 , 1024x -> 1) 128 extern const playerpattern playerpatterns[PLAYERPATTERNS] = { 129 { "<grey>textures/patterns/default", "default", "Default", 0, 1 }, 130 { "<grey>textures/patterns/soft", "soft", "Soft", 0, 1 }, 131 { "<grey>textures/patterns/camo", "camo", "Camo", 0, 1 }, 132 { "<grey>textures/patterns/heart", "heart", "Heart", 0x300, 2 }, 133 { "<grey>textures/patterns/crown", "crown", "Crown", 0x300, 2 }, 134 { "<grey>textures/patterns/zebra", "zebra", "Zebra", 0x300, 2 }, 135 { "<grey>textures/patterns/checker", "checker", "Checker", 0x300, 2 }, 136 { "<grey>textures/patterns/star", "star", "Star", 0x300, 2 }, 137 { "<grey>textures/patterns/flower", "flower", "Flower", 0x300, 2 }, 138 { "<grey>textures/patterns/leopard", "leopard", "Leopard", 0x300, 2 }, 139 { "<grey>textures/patterns/zigzag", "zigzag", "Zigzag", 0x300, 2 }, 140 { "<grey>textures/patterns/pixel", "pixel", "Pixel", 0x300, 2 }, 141 { "<grey>textures/patterns/circle", "circle", "Circle", 0x300, 2 }, 142 { "<grey>textures/patterns/ninja", "ninja", "Ninja", 0, 2 }, 143 { "<grey>textures/patterns/lines", "lines", "Lines", 0, 1 }, 144 { "<grey>textures/patterns/softhero", "softhero", "Softhero", 0, 1 }, 145 }; 146 #else 147 extern const char * const playertypes[PLAYERTYPES][7]; 148 extern const playerpattern playerpatterns[PLAYERPATTERNS]; 149 #endif 150 151 #include "playerdef.h" 152 153 APSVAR(IDF_GAMEMOD, 0, vname, 154 "Player", "Bot", "Turret", "Grunt", "Drone", "Roller" 155 ); 156 APVAR(IDF_GAMEMOD, 0, abilities, 0, A_A_ALL, 157 A_A_PLAYER, A_A_MOVINGAI, A_A_FIXEDAI, A_A_MOVINGAI, A_A_LESSAI, A_A_ROLLER 158 ); 159 APVAR(IDF_GAMEMOD, 0, collide, 0, A_C_ALL, 160 A_C_ALL, A_C_ALL, A_C_ALL, A_C_ALL, A_C_ALL, A_C_ALL 161 ); 162 APVAR(IDF_GAMEMOD, 0, health, 1, VAR_MAX, 163 1000, 1000, 1000, 500, 500, 500 164 ); 165 APVAR(IDF_GAMEMOD, 0, hurtstop, 1, VAR_MAX, 166 0, 0, 0, 100, 500, 100 167 ); 168 APVAR(IDF_GAMEMOD, 0, maxcarry, 0, WEAPCARRY, 169 WEAPCARRY, WEAPCARRY, 0, 0, 0, 0 170 ); 171 APFVAR(IDF_GAMEMOD, 0, scale, FVAR_NONZERO, FVAR_MAX, 172 1, 1, 0.5f, 1, 0.85f, 1.f 173 ); 174 APVAR(IDF_GAMEMOD, 0, spawndelay, 0, VAR_MAX, 175 5000, 5000, 30000, 30000, 30000, 30000 176 ); 177 APVAR(IDF_GAMEMOD, 0, spawndelayedit, 0, VAR_MAX, 178 0, 5000, 30000, 30000, 30000, 30000 179 ); 180 APVAR(IDF_GAMEMOD, 0, spawndelaybomber, 0, VAR_MAX, 181 3000, 3000, 30000, 30000, 30000, 30000 182 ); 183 APVAR(IDF_GAMEMOD, 0, spawndelaycapture, 0, VAR_MAX, 184 5000, 5000, 30000, 30000, 30000, 30000 185 ); 186 APVAR(IDF_GAMEMOD, 0, spawndelaydefend, 0, VAR_MAX, 187 5000, 5000, 30000, 30000, 30000, 30000 188 ); 189 APVAR(IDF_GAMEMOD, 0, spawndelaygauntlet, 0, VAR_MAX, 190 3000, 3000, 30000, 30000, 30000, 30000 191 ); 192 APFVAR(IDF_GAMEMOD, 0, spawndelayinstascale, 0, FVAR_MAX, 193 0.5f, 0.5f, 0.75f, 0.75f, 0.75f, 0.75f 194 ); 195 APVAR(IDF_GAMEMOD, 0, spawndelayrace, 0, VAR_MAX, 196 1000, 1000, 10000, 10000, 10000, 10000 197 ); 198 APVAR(IDF_GAMEMOD, 0, spawngrenades, 0, 2, 199 0, 0, 0, 0, 0, 0 200 ); 201 APVAR(IDF_GAMEMOD, 0, spawnmines, 0, 2, 202 0, 0, 0, 0, 0, 0 203 ); 204 APVAR(IDF_GAMEMOD, 0, teamdamage, 0, A_T_ALL, 205 A_T_PLAYER, A_T_AI, A_T_AI, A_T_AI, A_T_AI, A_T_AI 206 ); 207 APVAR(IDF_GAMEMOD, 0, weapongladiator, 0, W_ALL-1, 208 W_CLAW, W_CLAW, W_SMG, W_PISTOL, W_CLAW, W_CLAW 209 ); 210 APVAR(IDF_GAMEMOD, 0, weaponinsta, 0, W_ALL-1, 211 W_RIFLE, W_RIFLE, W_RIFLE, W_RIFLE, W_CLAW, W_CLAW 212 ); 213 APVAR(IDF_GAMEMOD, 0, weaponkaboom, 0, W_ALL-1, 214 W_GRENADE, W_GRENADE, W_GRENADE, W_GRENADE, W_CLAW, W_CLAW 215 ); 216 APVAR(IDF_GAMEMOD, 0, weaponmedieval, 0, W_ALL-1, 217 W_SWORD, W_SWORD, W_RIFLE, W_SWORD, W_CLAW, W_CLAW 218 ); 219 APVAR(IDF_GAMEMOD, 0, weaponrace, 0, W_ALL-1, 220 W_CLAW, W_CLAW, W_SMG, W_PISTOL, W_CLAW, W_CLAW 221 ); 222 APVAR(IDF_GAMEMOD, 0, weaponspawn, 0, W_ALL-1, 223 W_PISTOL, W_PISTOL, W_SMG, W_PISTOL, W_CLAW, W_CLAW 224 ); 225 // these are modified by gameent::configure() et al 226 APFVAR(IDF_GAMEMOD, 0, speed, 0, FVAR_MAX, 227 95, 95, 0, 85, 100, 100 228 ); 229 APFVAR(IDF_GAMEMOD, 0, speedextra, FVAR_MIN, FVAR_MAX, 230 0, 0, 0, 0, 0, 0 231 ); 232 APFVAR(IDF_GAMEMOD, 0, jumpspeed, 0, FVAR_MAX, 233 120, 120, 0, 110, 90, 75 234 ); 235 APFVAR(IDF_GAMEMOD, 0, jumpspeedextra, FVAR_MIN, FVAR_MAX, 236 0, 0, 0, 0, 0, 0 237 ); 238 APFVAR(IDF_GAMEMOD, 0, impulsespeed, 0, FVAR_MAX, 239 85, 85, 0, 85, 85, 75 240 ); 241 APFVAR(IDF_GAMEMOD, 0, impulsespeedextra, FVAR_MIN, FVAR_MAX, 242 0, 0, 0, 0, 0, 0 243 ); 244 APFVAR(IDF_GAMEMOD, 0, weight, 0, FVAR_MAX, 245 264, 264, 264, 264, 195, 150 246 ); 247 APFVAR(IDF_GAMEMOD, 0, weightextra, FVAR_MIN, FVAR_MAX, 248 0, 0, 0, 0, 0, 0 249 ); 250 251 #define VANITYMAX 16 252 #define ATTACHMENTMAX VANITYMAX+13 253 254 struct vanityfile 255 { 256 char *id, *name; 257 bool proj; 258 vanityfilevanityfile259 vanityfile() : id(NULL), name(NULL), proj(false) {} idvanityfile260 vanityfile(const char *d, const char *n, bool p = false) : id(newstring(d)), name(newstring(n)), proj(p) {} ~vanityfilevanityfile261 ~vanityfile() 262 { 263 if(id) delete[] id; 264 if(name) delete[] name; 265 } 266 }; 267 struct vanity 268 { 269 int type, cond, style; 270 char *ref, *model, *proj, *name, *tag; 271 vector<vanityfile> files; 272 vanityvanity273 vanity() : type(-1), cond(0), style(0), ref(NULL), model(NULL), proj(NULL), name(NULL), tag(NULL) {} vanityvanity274 vanity(int t, const char *r, const char *n, const char *g, int c, int s) : type(t), cond(c), style(s), ref(newstring(r)), model(NULL), proj(NULL), name(newstring(n)), tag(newstring(g)) { setmodel(r); } ~vanityvanity275 ~vanity() 276 { 277 if(ref) delete[] ref; 278 if(model) delete[] model; 279 if(proj) delete[] proj; 280 if(name) delete[] name; 281 if(tag) delete[] tag; 282 loopvrev(files) files.remove(i); 283 } 284 setmodelvanity285 void setmodel(const char *r) 286 { 287 if(model) delete[] model; 288 defformatstring(m, "vanities/%s", r); 289 model = newstring(m); 290 if(proj) delete[] proj; 291 formatstring(m, "%s/proj", model); 292 proj = newstring(m); 293 } 294 }; 295 #ifdef CPP_GAME_MAIN 296 vector<vanity> vanities; 297 #else 298 extern vector<vanity> vanities; 299 #endif 300