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