Quake II RTX doxygen  1.0 dev
g_spawn.c
Go to the documentation of this file.
1 /*
2 Copyright (C) 1997-2001 Id Software, Inc.
3 Copyright (C) 2019, NVIDIA CORPORATION. All rights reserved.
4 
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version.
9 
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
14 
15 You should have received a copy of the GNU General Public License along
16 with this program; if not, write to the Free Software Foundation, Inc.,
17 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18 */
19 
20 #include "g_local.h"
21 
22 typedef struct {
23  char *name;
24  void (*spawn)(edict_t *ent);
25 } spawn_func_t;
26 
27 typedef struct {
28  char *name;
29  size_t ofs;
32 
33 void SP_item_health(edict_t *self);
34 void SP_item_health_small(edict_t *self);
35 void SP_item_health_large(edict_t *self);
36 void SP_item_health_mega(edict_t *self);
37 
38 void SP_info_player_start(edict_t *ent);
39 void SP_info_player_deathmatch(edict_t *ent);
40 void SP_info_player_coop(edict_t *ent);
41 void SP_info_player_intermission(edict_t *ent);
42 
43 void SP_func_plat(edict_t *ent);
44 void SP_func_rotating(edict_t *ent);
45 void SP_func_button(edict_t *ent);
46 void SP_func_door(edict_t *ent);
47 void SP_func_door_secret(edict_t *ent);
48 void SP_func_door_rotating(edict_t *ent);
49 void SP_func_water(edict_t *ent);
50 void SP_func_train(edict_t *ent);
51 void SP_func_conveyor(edict_t *self);
52 void SP_func_wall(edict_t *self);
53 void SP_func_object(edict_t *self);
54 void SP_func_explosive(edict_t *self);
55 void SP_func_timer(edict_t *self);
56 void SP_func_areaportal(edict_t *ent);
57 void SP_func_clock(edict_t *ent);
58 void SP_func_killbox(edict_t *ent);
59 
60 void SP_trigger_always(edict_t *ent);
61 void SP_trigger_once(edict_t *ent);
62 void SP_trigger_multiple(edict_t *ent);
63 void SP_trigger_relay(edict_t *ent);
64 void SP_trigger_push(edict_t *ent);
65 void SP_trigger_hurt(edict_t *ent);
66 void SP_trigger_key(edict_t *ent);
67 void SP_trigger_counter(edict_t *ent);
68 void SP_trigger_elevator(edict_t *ent);
69 void SP_trigger_gravity(edict_t *ent);
70 void SP_trigger_monsterjump(edict_t *ent);
71 
72 void SP_target_temp_entity(edict_t *ent);
73 void SP_target_speaker(edict_t *ent);
74 void SP_target_explosion(edict_t *ent);
75 void SP_target_changelevel(edict_t *ent);
76 void SP_target_secret(edict_t *ent);
77 void SP_target_goal(edict_t *ent);
78 void SP_target_splash(edict_t *ent);
79 void SP_target_spawner(edict_t *ent);
80 void SP_target_blaster(edict_t *ent);
81 void SP_target_crosslevel_trigger(edict_t *ent);
82 void SP_target_crosslevel_target(edict_t *ent);
83 void SP_target_laser(edict_t *self);
84 void SP_target_help(edict_t *ent);
85 void SP_target_actor(edict_t *ent);
86 void SP_target_lightramp(edict_t *self);
87 void SP_target_earthquake(edict_t *ent);
88 void SP_target_character(edict_t *ent);
89 void SP_target_string(edict_t *ent);
90 
91 void SP_worldspawn(edict_t *ent);
92 void SP_viewthing(edict_t *ent);
93 
94 void SP_light(edict_t *self);
95 void SP_light_mine1(edict_t *ent);
96 void SP_light_mine2(edict_t *ent);
97 void SP_info_null(edict_t *self);
98 void SP_info_notnull(edict_t *self);
99 void SP_path_corner(edict_t *self);
100 void SP_point_combat(edict_t *self);
101 
102 void SP_misc_explobox(edict_t *self);
103 void SP_misc_banner(edict_t *self);
104 void SP_misc_satellite_dish(edict_t *self);
105 void SP_misc_actor(edict_t *self);
106 void SP_misc_gib_arm(edict_t *self);
107 void SP_misc_gib_leg(edict_t *self);
108 void SP_misc_gib_head(edict_t *self);
109 void SP_misc_insane(edict_t *self);
110 void SP_misc_deadsoldier(edict_t *self);
111 void SP_misc_viper(edict_t *self);
112 void SP_misc_viper_bomb(edict_t *self);
113 void SP_misc_bigviper(edict_t *self);
114 void SP_misc_strogg_ship(edict_t *self);
115 void SP_misc_teleporter(edict_t *self);
116 void SP_misc_teleporter_dest(edict_t *self);
117 void SP_misc_blackhole(edict_t *self);
118 void SP_misc_eastertank(edict_t *self);
119 void SP_misc_easterchick(edict_t *self);
120 void SP_misc_easterchick2(edict_t *self);
121 
122 void SP_monster_berserk(edict_t *self);
123 void SP_monster_gladiator(edict_t *self);
124 void SP_monster_gunner(edict_t *self);
125 void SP_monster_infantry(edict_t *self);
126 void SP_monster_soldier_light(edict_t *self);
127 void SP_monster_soldier(edict_t *self);
128 void SP_monster_soldier_ss(edict_t *self);
129 void SP_monster_tank(edict_t *self);
130 void SP_monster_medic(edict_t *self);
131 void SP_monster_flipper(edict_t *self);
132 void SP_monster_chick(edict_t *self);
133 void SP_monster_parasite(edict_t *self);
134 void SP_monster_flyer(edict_t *self);
135 void SP_monster_brain(edict_t *self);
136 void SP_monster_floater(edict_t *self);
137 void SP_monster_hover(edict_t *self);
138 void SP_monster_mutant(edict_t *self);
139 void SP_monster_supertank(edict_t *self);
140 void SP_monster_boss2(edict_t *self);
141 void SP_monster_jorg(edict_t *self);
142 void SP_monster_boss3_stand(edict_t *self);
143 
144 void SP_monster_commander_body(edict_t *self);
145 
146 void SP_turret_breach(edict_t *self);
147 void SP_turret_base(edict_t *self);
148 void SP_turret_driver(edict_t *self);
149 
150 static const spawn_func_t spawn_funcs[] = {
151  {"item_health", SP_item_health},
152  {"item_health_small", SP_item_health_small},
153  {"item_health_large", SP_item_health_large},
154  {"item_health_mega", SP_item_health_mega},
155 
156  {"info_player_start", SP_info_player_start},
157  {"info_player_deathmatch", SP_info_player_deathmatch},
158  {"info_player_coop", SP_info_player_coop},
159  {"info_player_intermission", SP_info_player_intermission},
160 
161  {"func_plat", SP_func_plat},
162  {"func_button", SP_func_button},
163  {"func_door", SP_func_door},
164  {"func_door_secret", SP_func_door_secret},
165  {"func_door_rotating", SP_func_door_rotating},
166  {"func_rotating", SP_func_rotating},
167  {"func_train", SP_func_train},
168  {"func_water", SP_func_water},
169  {"func_conveyor", SP_func_conveyor},
170  {"func_areaportal", SP_func_areaportal},
171  {"func_clock", SP_func_clock},
172  {"func_wall", SP_func_wall},
173  {"func_object", SP_func_object},
174  {"func_timer", SP_func_timer},
175  {"func_explosive", SP_func_explosive},
176  {"func_killbox", SP_func_killbox},
177 
178  {"trigger_always", SP_trigger_always},
179  {"trigger_once", SP_trigger_once},
180  {"trigger_multiple", SP_trigger_multiple},
181  {"trigger_relay", SP_trigger_relay},
182  {"trigger_push", SP_trigger_push},
183  {"trigger_hurt", SP_trigger_hurt},
184  {"trigger_key", SP_trigger_key},
185  {"trigger_counter", SP_trigger_counter},
186  {"trigger_elevator", SP_trigger_elevator},
187  {"trigger_gravity", SP_trigger_gravity},
188  {"trigger_monsterjump", SP_trigger_monsterjump},
189 
190  {"target_temp_entity", SP_target_temp_entity},
191  {"target_speaker", SP_target_speaker},
192  {"target_explosion", SP_target_explosion},
193  {"target_changelevel", SP_target_changelevel},
194  {"target_secret", SP_target_secret},
195  {"target_goal", SP_target_goal},
196  {"target_splash", SP_target_splash},
197  {"target_spawner", SP_target_spawner},
198  {"target_blaster", SP_target_blaster},
199  {"target_crosslevel_trigger", SP_target_crosslevel_trigger},
200  {"target_crosslevel_target", SP_target_crosslevel_target},
201  {"target_laser", SP_target_laser},
202  {"target_help", SP_target_help},
203  {"target_actor", SP_target_actor},
204  {"target_lightramp", SP_target_lightramp},
205  {"target_earthquake", SP_target_earthquake},
206  {"target_character", SP_target_character},
207  {"target_string", SP_target_string},
208 
209  {"worldspawn", SP_worldspawn},
210  {"viewthing", SP_viewthing},
211 
212  {"light", SP_light},
213  {"light_mine1", SP_light_mine1},
214  {"light_mine2", SP_light_mine2},
215  {"info_null", SP_info_null},
216  {"func_group", SP_info_null},
217  {"info_notnull", SP_info_notnull},
218  {"path_corner", SP_path_corner},
219  {"point_combat", SP_point_combat},
220 
221  {"misc_explobox", SP_misc_explobox},
222  {"misc_banner", SP_misc_banner},
223  {"misc_satellite_dish", SP_misc_satellite_dish},
224  {"misc_actor", SP_misc_actor},
225  {"misc_gib_arm", SP_misc_gib_arm},
226  {"misc_gib_leg", SP_misc_gib_leg},
227  {"misc_gib_head", SP_misc_gib_head},
228  {"misc_insane", SP_misc_insane},
229  {"misc_deadsoldier", SP_misc_deadsoldier},
230  {"misc_viper", SP_misc_viper},
231  {"misc_viper_bomb", SP_misc_viper_bomb},
232  {"misc_bigviper", SP_misc_bigviper},
233  {"misc_strogg_ship", SP_misc_strogg_ship},
234  {"misc_teleporter", SP_misc_teleporter},
235  {"misc_teleporter_dest", SP_misc_teleporter_dest},
236  {"misc_blackhole", SP_misc_blackhole},
237  {"misc_eastertank", SP_misc_eastertank},
238  {"misc_easterchick", SP_misc_easterchick},
239  {"misc_easterchick2", SP_misc_easterchick2},
240 
241  {"monster_berserk", SP_monster_berserk},
242  {"monster_gladiator", SP_monster_gladiator},
243  {"monster_gunner", SP_monster_gunner},
244  {"monster_infantry", SP_monster_infantry},
245  {"monster_soldier_light", SP_monster_soldier_light},
246  {"monster_soldier", SP_monster_soldier},
247  {"monster_soldier_ss", SP_monster_soldier_ss},
248  {"monster_tank", SP_monster_tank},
249  {"monster_tank_commander", SP_monster_tank},
250  {"monster_medic", SP_monster_medic},
251  {"monster_flipper", SP_monster_flipper},
252  {"monster_chick", SP_monster_chick},
253  {"monster_parasite", SP_monster_parasite},
254  {"monster_flyer", SP_monster_flyer},
255  {"monster_brain", SP_monster_brain},
256  {"monster_floater", SP_monster_floater},
257  {"monster_hover", SP_monster_hover},
258  {"monster_mutant", SP_monster_mutant},
259  {"monster_supertank", SP_monster_supertank},
260  {"monster_boss2", SP_monster_boss2},
261  {"monster_boss3_stand", SP_monster_boss3_stand},
262  {"monster_jorg", SP_monster_jorg},
263 
264  {"monster_commander_body", SP_monster_commander_body},
265 
266  {"turret_breach", SP_turret_breach},
267  {"turret_base", SP_turret_base},
268  {"turret_driver", SP_turret_driver},
269 
270  {NULL, NULL}
271 };
272 
273 static const spawn_field_t spawn_fields[] = {
274  {"classname", FOFS(classname), F_LSTRING},
275  {"model", FOFS(model), F_LSTRING},
276  {"spawnflags", FOFS(spawnflags), F_INT},
277  {"speed", FOFS(speed), F_FLOAT},
278  {"accel", FOFS(accel), F_FLOAT},
279  {"decel", FOFS(decel), F_FLOAT},
280  {"target", FOFS(target), F_LSTRING},
281  {"targetname", FOFS(targetname), F_LSTRING},
282  {"pathtarget", FOFS(pathtarget), F_LSTRING},
283  {"deathtarget", FOFS(deathtarget), F_LSTRING},
284  {"killtarget", FOFS(killtarget), F_LSTRING},
285  {"combattarget", FOFS(combattarget), F_LSTRING},
286  {"message", FOFS(message), F_LSTRING},
287  {"team", FOFS(team), F_LSTRING},
288  {"wait", FOFS(wait), F_FLOAT},
289  {"delay", FOFS(delay), F_FLOAT},
290  {"random", FOFS(random), F_FLOAT},
291  {"move_origin", FOFS(move_origin), F_VECTOR},
292  {"move_angles", FOFS(move_angles), F_VECTOR},
293  {"style", FOFS(style), F_INT},
294  {"count", FOFS(count), F_INT},
295  {"health", FOFS(health), F_INT},
296  {"sounds", FOFS(sounds), F_INT},
297  {"light", 0, F_IGNORE},
298  {"dmg", FOFS(dmg), F_INT},
299  {"mass", FOFS(mass), F_INT},
300  {"volume", FOFS(volume), F_FLOAT},
301  {"attenuation", FOFS(attenuation), F_FLOAT},
302  {"map", FOFS(map), F_LSTRING},
303  {"origin", FOFS(s.origin), F_VECTOR},
304  {"angles", FOFS(s.angles), F_VECTOR},
305  {"angle", FOFS(s.angles), F_ANGLEHACK},
306 
307  {NULL}
308 };
309 
310 // temp spawn vars -- only valid when the spawn function is called
311 static const spawn_field_t temp_fields[] = {
312  {"lip", STOFS(lip), F_INT},
313  {"distance", STOFS(distance), F_INT},
314  {"height", STOFS(height), F_INT},
315  {"noise", STOFS(noise), F_LSTRING},
316  {"pausetime", STOFS(pausetime), F_FLOAT},
317  {"item", STOFS(item), F_LSTRING},
318 
319  {"gravity", STOFS(gravity), F_LSTRING},
320  {"sky", STOFS(sky), F_LSTRING},
321  {"skyrotate", STOFS(skyrotate), F_FLOAT},
322  {"skyaxis", STOFS(skyaxis), F_VECTOR},
323  {"minyaw", STOFS(minyaw), F_FLOAT},
324  {"maxyaw", STOFS(maxyaw), F_FLOAT},
325  {"minpitch", STOFS(minpitch), F_FLOAT},
326  {"maxpitch", STOFS(maxpitch), F_FLOAT},
327  {"nextmap", STOFS(nextmap), F_LSTRING},
328 
329  {NULL}
330 };
331 
332 
333 /*
334 ===============
335 ED_CallSpawn
336 
337 Finds the spawn function for the entity and calls it
338 ===============
339 */
340 void ED_CallSpawn(edict_t *ent)
341 {
342  const spawn_func_t *s;
343  gitem_t *item;
344  int i;
345 
346  if (!ent->classname) {
347  gi.dprintf("ED_CallSpawn: NULL classname\n");
348  return;
349  }
350 
351  // check item spawn functions
352  for (i = 0, item = itemlist ; i < game.num_items ; i++, item++) {
353  if (!item->classname)
354  continue;
355  if (!strcmp(item->classname, ent->classname)) {
356  // found it
357  SpawnItem(ent, item);
358  return;
359  }
360  }
361 
362  // check normal spawn functions
363  for (s = spawn_funcs ; s->name ; s++) {
364  if (!strcmp(s->name, ent->classname)) {
365  // found it
366  s->spawn(ent);
367  return;
368  }
369  }
370  gi.dprintf("%s doesn't have a spawn function\n", ent->classname);
371 }
372 
373 /*
374 =============
375 ED_NewString
376 =============
377 */
378 static char *ED_NewString(const char *string)
379 {
380  char *newb, *new_p;
381  int i, l;
382 
383  l = strlen(string) + 1;
384 
385  newb = gi.TagMalloc(l, TAG_LEVEL);
386 
387  new_p = newb;
388 
389  for (i = 0 ; i < l ; i++) {
390  if (string[i] == '\\' && i < l - 1) {
391  i++;
392  if (string[i] == 'n')
393  *new_p++ = '\n';
394  else
395  *new_p++ = '\\';
396  } else
397  *new_p++ = string[i];
398  }
399 
400  return newb;
401 }
402 
403 
404 
405 
406 /*
407 ===============
408 ED_ParseField
409 
410 Takes a key/value pair and sets the binary values
411 in an edict
412 ===============
413 */
414 static qboolean ED_ParseField(const spawn_field_t *fields, const char *key, const char *value, byte *b)
415 {
416  const spawn_field_t *f;
417  float v;
418  vec3_t vec;
419 
420  for (f = fields ; f->name ; f++) {
421  if (!Q_stricmp(f->name, key)) {
422  // found it
423  switch (f->type) {
424  case F_LSTRING:
425  *(char **)(b + f->ofs) = ED_NewString(value);
426  break;
427  case F_VECTOR:
428  if (sscanf(value, "%f %f %f", &vec[0], &vec[1], &vec[2]) != 3) {
429  gi.dprintf("%s: couldn't parse '%s'\n", __func__, key);
430  VectorClear(vec);
431  }
432  ((float *)(b + f->ofs))[0] = vec[0];
433  ((float *)(b + f->ofs))[1] = vec[1];
434  ((float *)(b + f->ofs))[2] = vec[2];
435  break;
436  case F_INT:
437  *(int *)(b + f->ofs) = atoi(value);
438  break;
439  case F_FLOAT:
440  *(float *)(b + f->ofs) = atof(value);
441  break;
442  case F_ANGLEHACK:
443  v = atof(value);
444  ((float *)(b + f->ofs))[0] = 0;
445  ((float *)(b + f->ofs))[1] = v;
446  ((float *)(b + f->ofs))[2] = 0;
447  break;
448  case F_IGNORE:
449  break;
450  default:
451  break;
452  }
453  return qtrue;
454  }
455  }
456  return qfalse;
457 }
458 
459 /*
460 ====================
461 ED_ParseEdict
462 
463 Parses an edict out of the given string, returning the new position
464 ed should be a properly initialized empty edict.
465 ====================
466 */
467 void ED_ParseEdict(const char **data, edict_t *ent)
468 {
469  qboolean init;
470  char *key, *value;
471 
472  init = qfalse;
473  memset(&st, 0, sizeof(st));
474 
475 // go through all the dictionary pairs
476  while (1) {
477  // parse key
478  key = COM_Parse(data);
479  if (key[0] == '}')
480  break;
481  if (!*data)
482  gi.error("%s: EOF without closing brace", __func__);
483 
484  // parse value
485  value = COM_Parse(data);
486  if (!*data)
487  gi.error("%s: EOF without closing brace", __func__);
488 
489  if (value[0] == '}')
490  gi.error("%s: closing brace without data", __func__);
491 
492  init = qtrue;
493 
494  // keynames with a leading underscore are used for utility comments,
495  // and are immediately discarded by quake
496  if (key[0] == '_')
497  continue;
498 
499  if (!ED_ParseField(spawn_fields, key, value, (byte *)ent)) {
500  if (!ED_ParseField(temp_fields, key, value, (byte *)&st)) {
501  gi.dprintf("%s: %s is not a field\n", __func__, key);
502  }
503  }
504  }
505 
506  if (!init)
507  memset(ent, 0, sizeof(*ent));
508 }
509 
510 
511 /*
512 ================
513 G_FindTeams
514 
515 Chain together all entities with a matching team field.
516 
517 All but the first will have the FL_TEAMSLAVE flag set.
518 All but the last will have the teamchain field set to the next one
519 ================
520 */
521 void G_FindTeams(void)
522 {
523  edict_t *e, *e2, *chain;
524  int i, j;
525  int c, c2;
526 
527  c = 0;
528  c2 = 0;
529  for (i = 1, e = g_edicts + i ; i < globals.num_edicts ; i++, e++) {
530  if (!e->inuse)
531  continue;
532  if (!e->team)
533  continue;
534  if (e->flags & FL_TEAMSLAVE)
535  continue;
536  chain = e;
537  e->teammaster = e;
538  c++;
539  c2++;
540  for (j = i + 1, e2 = e + 1 ; j < globals.num_edicts ; j++, e2++) {
541  if (!e2->inuse)
542  continue;
543  if (!e2->team)
544  continue;
545  if (e2->flags & FL_TEAMSLAVE)
546  continue;
547  if (!strcmp(e->team, e2->team)) {
548  c2++;
549  chain->teamchain = e2;
550  e2->teammaster = e;
551  chain = e2;
552  e2->flags |= FL_TEAMSLAVE;
553  }
554  }
555  }
556 
557  gi.dprintf("%i teams with %i entities\n", c, c2);
558 }
559 
560 /*
561 ==============
562 SpawnEntities
563 
564 Creates a server's entity / program execution context by
565 parsing textual entity definitions out of an ent file.
566 ==============
567 */
568 void SpawnEntities(const char *mapname, const char *entities, const char *spawnpoint)
569 {
570  edict_t *ent;
571  int inhibit;
572  char *com_token;
573  int i;
574  float skill_level;
575 
576  skill_level = floor(skill->value);
577  if (skill_level < 0)
578  skill_level = 0;
579  if (skill_level > 3)
580  skill_level = 3;
581  if (skill->value != skill_level)
582  gi.cvar_forceset("skill", va("%f", skill_level));
583 
584  SaveClientData();
585 
586  gi.FreeTags(TAG_LEVEL);
587 
588  memset(&level, 0, sizeof(level));
589  memset(g_edicts, 0, game.maxentities * sizeof(g_edicts[0]));
590 
591  strncpy(level.mapname, mapname, sizeof(level.mapname) - 1);
592  strncpy(game.spawnpoint, spawnpoint, sizeof(game.spawnpoint) - 1);
593 
594  // set client fields on player ents
595  for (i = 0 ; i < game.maxclients ; i++)
596  g_edicts[i + 1].client = game.clients + i;
597 
598  ent = NULL;
599  inhibit = 0;
600 
601 // parse ents
602  while (1) {
603  // parse the opening brace
604  com_token = COM_Parse(&entities);
605  if (!entities)
606  break;
607  if (com_token[0] != '{')
608  gi.error("ED_LoadFromFile: found %s when expecting {", com_token);
609 
610  if (!ent)
611  ent = g_edicts;
612  else
613  ent = G_Spawn();
614  ED_ParseEdict(&entities, ent);
615 
616  // yet another map hack
617  if (!Q_stricmp(level.mapname, "command") && !Q_stricmp(ent->classname, "trigger_once") && !Q_stricmp(ent->model, "*27"))
618  ent->spawnflags &= ~SPAWNFLAG_NOT_HARD;
619 
620  // remove things (except the world) from different skill levels or deathmatch
621  if (ent != g_edicts) {
622  if (nomonsters->value && (strstr(ent->classname, "monster") || strstr(ent->classname, "misc_deadsoldier") || strstr(ent->classname, "misc_insane"))) {
623  G_FreeEdict(ent);
624  inhibit++;
625  continue;
626  }
627  if (deathmatch->value) {
628  if (ent->spawnflags & SPAWNFLAG_NOT_DEATHMATCH) {
629  G_FreeEdict(ent);
630  inhibit++;
631  continue;
632  }
633  } else {
634  if ( /* ((coop->value) && (ent->spawnflags & SPAWNFLAG_NOT_COOP)) || */
635  ((skill->value == 0) && (ent->spawnflags & SPAWNFLAG_NOT_EASY)) ||
636  ((skill->value == 1) && (ent->spawnflags & SPAWNFLAG_NOT_MEDIUM)) ||
637  (((skill->value == 2) || (skill->value == 3)) && (ent->spawnflags & SPAWNFLAG_NOT_HARD))
638  ) {
639  G_FreeEdict(ent);
640  inhibit++;
641  continue;
642  }
643  }
644 
646  }
647 
648  ED_CallSpawn(ent);
649  }
650 
651  gi.dprintf("%i entities inhibited\n", inhibit);
652 
653 #ifdef DEBUG
654  i = 1;
655  ent = EDICT_NUM(i);
656  while (i < globals.num_edicts) {
657  if (ent->inuse != 0 || ent->inuse != 1)
658  Com_DPrintf("Invalid entity %d\n", i);
659  i++, ent++;
660  }
661 #endif
662 
663  G_FindTeams();
664 
666 }
667 
668 
669 //===================================================================
670 
671 #if 0
672 // cursor positioning
673 xl <value>
674 xr <value>
675 yb <value>
676 yt <value>
677 xv <value>
678 yv <value>
679 
680 // drawing
681 statpic <name>
682 pic <stat>
683 num <fieldwidth> <stat>
684 string <stat>
685 
686 // control
687 if <stat>
688 ifeq <stat> <value>
689 ifbit <stat> <value>
690 endif
691 
692 #endif
693 
694 static const char single_statusbar[] =
695 "yb -24 "
696 
697 // health
698 "xv 0 "
699 "hnum "
700 "xv 50 "
701 "pic 0 "
702 
703 // ammo
704 "if 2 "
705 " xv 100 "
706 " anum "
707 " xv 150 "
708 " pic 2 "
709 "endif "
710 
711 // armor
712 "if 4 "
713 " xv 200 "
714 " rnum "
715 " xv 250 "
716 " pic 4 "
717 "endif "
718 
719 // selected item
720 "if 6 "
721 " xv 296 "
722 " pic 6 "
723 "endif "
724 
725 "yb -50 "
726 
727 // picked up item
728 "if 7 "
729 " xv 0 "
730 " pic 7 "
731 " xv 26 "
732 " yb -42 "
733 " stat_string 8 "
734 " yb -50 "
735 "endif "
736 
737 // timer
738 "if 9 "
739 " xv 262 "
740 " num 2 10 "
741 " xv 296 "
742 " pic 9 "
743 "endif "
744 
745 // help / weapon icon
746 "if 11 "
747 " xv 148 "
748 " pic 11 "
749 "endif "
750 ;
751 
752 static const char dm_statusbar[] =
753 "yb -24 "
754 
755 // health
756 "xv 0 "
757 "hnum "
758 "xv 50 "
759 "pic 0 "
760 
761 // ammo
762 "if 2 "
763 " xv 100 "
764 " anum "
765 " xv 150 "
766 " pic 2 "
767 "endif "
768 
769 // armor
770 "if 4 "
771 " xv 200 "
772 " rnum "
773 " xv 250 "
774 " pic 4 "
775 "endif "
776 
777 // selected item
778 "if 6 "
779 " xv 296 "
780 " pic 6 "
781 "endif "
782 
783 "yb -50 "
784 
785 // picked up item
786 "if 7 "
787 " xv 0 "
788 " pic 7 "
789 " xv 26 "
790 " yb -42 "
791 " stat_string 8 "
792 " yb -50 "
793 "endif "
794 
795 // timer
796 "if 9 "
797 " xv 246 "
798 " num 2 10 "
799 " xv 296 "
800 " pic 9 "
801 "endif "
802 
803 // help / weapon icon
804 "if 11 "
805 " xv 148 "
806 " pic 11 "
807 "endif "
808 
809 // frags
810 "xr -50 "
811 "yt 2 "
812 "num 3 14 "
813 
814 // spectator
815 "if 17 "
816 "xv 0 "
817 "yb -58 "
818 "string2 \"SPECTATOR MODE\" "
819 "endif "
820 
821 // chase camera
822 "if 16 "
823 "xv 0 "
824 "yb -68 "
825 "string \"Chasing\" "
826 "xv 64 "
827 "stat_string 16 "
828 "endif "
829 ;
830 
831 
832 /*QUAKED worldspawn (0 0 0) ?
833 
834 Only used for the world.
835 "sky" environment map name
836 "skyaxis" vector axis for rotating sky
837 "skyrotate" speed of rotation in degrees/second
838 "sounds" music cd track number
839 "gravity" 800 is default gravity
840 "message" text to print at user logon
841 */
842 void SP_worldspawn(edict_t *ent)
843 {
844  ent->movetype = MOVETYPE_PUSH;
845  ent->solid = SOLID_BSP;
846  ent->inuse = qtrue; // since the world doesn't use G_Spawn()
847  ent->s.modelindex = 1; // world model is always index 1
848 
849  //---------------
850 
851  // reserve some spots for dead player bodies for coop / deathmatch
852  InitBodyQue();
853 
854  // set configstrings for items
855  SetItemNames();
856 
857  if (st.nextmap)
858  strcpy(level.nextmap, st.nextmap);
859 
860  // make some data visible to the server
861 
862  if (ent->message && ent->message[0]) {
863  gi.configstring(CS_NAME, ent->message);
864  strncpy(level.level_name, ent->message, sizeof(level.level_name));
865  } else
866  strncpy(level.level_name, level.mapname, sizeof(level.level_name));
867 
868  if (st.sky && st.sky[0])
869  gi.configstring(CS_SKY, st.sky);
870  else
871  gi.configstring(CS_SKY, "unit1_");
872 
873  gi.configstring(CS_SKYROTATE, va("%f", st.skyrotate));
874 
875  gi.configstring(CS_SKYAXIS, va("%f %f %f",
876  st.skyaxis[0], st.skyaxis[1], st.skyaxis[2]));
877 
878  gi.configstring(CS_CDTRACK, va("%i", ent->sounds));
879 
880  gi.configstring(CS_MAXCLIENTS, va("%i", (int)(maxclients->value)));
881 
882  // status bar program
883  if (deathmatch->value)
884  gi.configstring(CS_STATUSBAR, dm_statusbar);
885  else
886  gi.configstring(CS_STATUSBAR, single_statusbar);
887 
888  //---------------
889 
890 
891  // help icon for statusbar
892  gi.imageindex("i_help");
893  level.pic_health = gi.imageindex("i_health");
894  gi.imageindex("help");
895  gi.imageindex("field_3");
896 
897  if (!st.gravity)
898  gi.cvar_set("sv_gravity", "800");
899  else
900  gi.cvar_set("sv_gravity", st.gravity);
901 
902  snd_fry = gi.soundindex("player/fry.wav"); // standing in lava / slime
903 
904  PrecacheItem(FindItem("Blaster"));
905 
906  gi.soundindex("player/lava1.wav");
907  gi.soundindex("player/lava2.wav");
908 
909  gi.soundindex("misc/pc_up.wav");
910  gi.soundindex("misc/talk1.wav");
911 
912  gi.soundindex("misc/udeath.wav");
913 
914  // gibs
915  gi.soundindex("items/respawn1.wav");
916 
917  // sexed sounds
918  gi.soundindex("*death1.wav");
919  gi.soundindex("*death2.wav");
920  gi.soundindex("*death3.wav");
921  gi.soundindex("*death4.wav");
922  gi.soundindex("*fall1.wav");
923  gi.soundindex("*fall2.wav");
924  gi.soundindex("*gurp1.wav"); // drowning damage
925  gi.soundindex("*gurp2.wav");
926  gi.soundindex("*jump1.wav"); // player jump
927  gi.soundindex("*pain25_1.wav");
928  gi.soundindex("*pain25_2.wav");
929  gi.soundindex("*pain50_1.wav");
930  gi.soundindex("*pain50_2.wav");
931  gi.soundindex("*pain75_1.wav");
932  gi.soundindex("*pain75_2.wav");
933  gi.soundindex("*pain100_1.wav");
934  gi.soundindex("*pain100_2.wav");
935 
936  // sexed models
937  // THIS ORDER MUST MATCH THE DEFINES IN g_local.h
938  // you can add more, max 15
939  gi.modelindex("#w_blaster.md2");
940  gi.modelindex("#w_shotgun.md2");
941  gi.modelindex("#w_sshotgun.md2");
942  gi.modelindex("#w_machinegun.md2");
943  gi.modelindex("#w_chaingun.md2");
944  gi.modelindex("#a_grenades.md2");
945  gi.modelindex("#w_glauncher.md2");
946  gi.modelindex("#w_rlauncher.md2");
947  gi.modelindex("#w_hyperblaster.md2");
948  gi.modelindex("#w_railgun.md2");
949  gi.modelindex("#w_bfg.md2");
950 
951  //-------------------
952 
953  gi.soundindex("player/gasp1.wav"); // gasping for air
954  gi.soundindex("player/gasp2.wav"); // head breaking surface, not gasping
955 
956  gi.soundindex("player/watr_in.wav"); // feet hitting water
957  gi.soundindex("player/watr_out.wav"); // feet leaving water
958 
959  gi.soundindex("player/watr_un.wav"); // head going underwater
960 
961  gi.soundindex("player/u_breath1.wav");
962  gi.soundindex("player/u_breath2.wav");
963 
964  gi.soundindex("items/pkup.wav"); // bonus item pickup
965  gi.soundindex("world/land.wav"); // landing thud
966  gi.soundindex("misc/h2ohit1.wav"); // landing splash
967 
968  gi.soundindex("items/damage.wav");
969  gi.soundindex("items/protect.wav");
970  gi.soundindex("items/protect4.wav");
971  gi.soundindex("weapons/noammo.wav");
972 
973  gi.soundindex("infantry/inflies1.wav");
974 
975  sm_meat_index = gi.modelindex("models/objects/gibs/sm_meat/tris.md2");
976  gi.modelindex("models/objects/gibs/arm/tris.md2");
977  gi.modelindex("models/objects/gibs/bone/tris.md2");
978  gi.modelindex("models/objects/gibs/bone2/tris.md2");
979  gi.modelindex("models/objects/gibs/chest/tris.md2");
980  gi.modelindex("models/objects/gibs/skull/tris.md2");
981  gi.modelindex("models/objects/gibs/head2/tris.md2");
982 
983 //
984 // Setup light animation tables. 'a' is total darkness, 'z' is doublebright.
985 //
986 
987  // 0 normal
988  gi.configstring(CS_LIGHTS + 0, "m");
989 
990  // 1 FLICKER (first variety)
991  gi.configstring(CS_LIGHTS + 1, "mmnmmommommnonmmonqnmmo");
992 
993  // 2 SLOW STRONG PULSE
994  gi.configstring(CS_LIGHTS + 2, "abcdefghijklmnopqrstuvwxyzyxwvutsrqponmlkjihgfedcba");
995 
996  // 3 CANDLE (first variety)
997  gi.configstring(CS_LIGHTS + 3, "mmmmmaaaaammmmmaaaaaabcdefgabcdefg");
998 
999  // 4 FAST STROBE
1000  gi.configstring(CS_LIGHTS + 4, "mamamamamama");
1001 
1002  // 5 GENTLE PULSE 1
1003  gi.configstring(CS_LIGHTS + 5, "jklmnopqrstuvwxyzyxwvutsrqponmlkj");
1004 
1005  // 6 FLICKER (second variety)
1006  gi.configstring(CS_LIGHTS + 6, "nmonqnmomnmomomno");
1007 
1008  // 7 CANDLE (second variety)
1009  gi.configstring(CS_LIGHTS + 7, "mmmaaaabcdefgmmmmaaaammmaamm");
1010 
1011  // 8 CANDLE (third variety)
1012  gi.configstring(CS_LIGHTS + 8, "mmmaaammmaaammmabcdefaaaammmmabcdefmmmaaaa");
1013 
1014  // 9 SLOW STROBE (fourth variety)
1015  gi.configstring(CS_LIGHTS + 9, "aaaaaaaazzzzzzzz");
1016 
1017  // 10 FLUORESCENT FLICKER
1018  gi.configstring(CS_LIGHTS + 10, "mmamammmmammamamaaamammma");
1019 
1020  // 11 SLOW PULSE NOT FADE TO BLACK
1021  gi.configstring(CS_LIGHTS + 11, "abcdefghijklmnopqrrqponmlkjihgfedcba");
1022 
1023  // styles 32-62 are assigned by the light program for switchable lights
1024 
1025  // 63 testing
1026  gi.configstring(CS_LIGHTS + 63, "a");
1027 }
1028 
FindItem
gitem_t * FindItem(char *pickup_name)
Definition: g_items.c:98
SP_func_plat
void SP_func_plat(edict_t *ent)
Definition: g_func.c:483
gi
game_import_t gi
Definition: g_main.c:23
level_locals_t::pic_health
int pic_health
Definition: g_local.h:321
deathmatch
cvar_t * deathmatch
Definition: g_main.c:33
PlayerTrail_Init
void PlayerTrail_Init(void)
Definition: p_trail.c:47
single_statusbar
static const char single_statusbar[]
Definition: g_spawn.c:694
SP_monster_parasite
void SP_monster_parasite(edict_t *self)
Definition: m_parasite.c:484
SP_target_blaster
void SP_target_blaster(edict_t *ent)
Definition: g_target.c:422
SP_trigger_once
void SP_trigger_once(edict_t *ent)
Definition: g_trigger.c:156
SP_misc_bigviper
void SP_misc_bigviper(edict_t *self)
Definition: g_misc.c:1255
SP_func_rotating
void SP_func_rotating(edict_t *ent)
Definition: g_func.c:587
SP_target_explosion
void SP_target_explosion(edict_t *ent)
Definition: g_target.c:252
G_Spawn
edict_t * G_Spawn(void)
Definition: g_utils.c:391
ED_NewString
static char * ED_NewString(const char *string)
Definition: g_spawn.c:378
SP_monster_infantry
void SP_monster_infantry(edict_t *self)
Definition: m_infantry.c:526
SP_monster_chick
void SP_monster_chick(edict_t *self)
Definition: m_chick.c:594
SP_target_earthquake
void SP_target_earthquake(edict_t *ent)
Definition: g_target.c:761
SP_misc_eastertank
void SP_misc_eastertank(edict_t *self)
Definition: g_misc.c:1013
height
static int height
Definition: physical_sky.c:39
F_IGNORE
@ F_IGNORE
Definition: g_local.h:581
SP_func_killbox
void SP_func_killbox(edict_t *ent)
Definition: g_func.c:1927
maxclients
cvar_t * maxclients
Definition: g_main.c:42
SP_trigger_key
void SP_trigger_key(edict_t *ent)
Definition: g_trigger.c:259
com_token
static char com_token[4][MAX_TOKEN_CHARS]
Definition: shared.c:444
SP_monster_soldier_light
void SP_monster_soldier_light(edict_t *self)
Definition: m_soldier.c:1189
SP_target_crosslevel_target
void SP_target_crosslevel_target(edict_t *ent)
Definition: g_target.c:468
SP_func_explosive
void SP_func_explosive(edict_t *self)
Definition: g_misc.c:771
InitBodyQue
void InitBodyQue(void)
Definition: p_client.c:887
spawn_temp_t::gravity
char * gravity
Definition: g_local.h:355
snd_fry
int snd_fry
Definition: g_main.c:28
spawn_field_t::ofs
size_t ofs
Definition: g_spawn.c:29
SP_func_object
void SP_func_object(edict_t *self)
Definition: g_misc.c:646
SP_monster_gladiator
void SP_monster_gladiator(edict_t *self)
Definition: m_gladiator.c:327
F_VECTOR
@ F_VECTOR
Definition: g_local.h:574
st
spawn_temp_t st
Definition: g_main.c:25
SP_monster_boss2
void SP_monster_boss2(edict_t *self)
Definition: m_boss2.c:599
SP_func_train
void SP_func_train(edict_t *ent)
Definition: g_func.c:1562
SPAWNFLAG_NOT_EASY
#define SPAWNFLAG_NOT_EASY
Definition: g_local.h:52
spawn_fields
static const spawn_field_t spawn_fields[]
Definition: g_spawn.c:273
SP_misc_easterchick
void SP_misc_easterchick(edict_t *self)
Definition: g_misc.c:1040
SP_target_speaker
void SP_target_speaker(edict_t *ent)
Definition: g_target.c:78
SP_info_null
void SP_info_null(edict_t *self)
Definition: g_misc.c:488
SP_misc_blackhole
void SP_misc_blackhole(edict_t *self)
Definition: g_misc.c:986
SpawnItem
void SpawnItem(edict_t *ent, gitem_t *item)
Definition: g_items.c:1003
SP_target_temp_entity
void SP_target_temp_entity(edict_t *ent)
Definition: g_target.c:32
SP_trigger_hurt
void SP_trigger_hurt(edict_t *ent)
Definition: g_trigger.c:461
SP_monster_commander_body
void SP_monster_commander_body(edict_t *self)
Definition: g_misc.c:1110
MOVETYPE_PUSH
@ MOVETYPE_PUSH
Definition: g_local.h:188
SP_light_mine2
void SP_light_mine2(edict_t *ent)
Definition: g_misc.c:1422
spawn_field_t
Definition: g_spawn.c:27
SP_turret_base
void SP_turret_base(edict_t *self)
Definition: g_turret.c:250
spawn_func_t::name
char * name
Definition: g_spawn.c:23
SP_misc_gib_arm
void SP_misc_gib_arm(edict_t *self)
Definition: g_misc.c:1434
SP_monster_jorg
void SP_monster_jorg(edict_t *self)
Definition: m_boss31.c:649
SP_target_splash
void SP_target_splash(edict_t *ent)
Definition: g_target.c:342
FOFS
#define FOFS(x)
Definition: g_local.h:498
SP_misc_banner
void SP_misc_banner(edict_t *self)
Definition: g_misc.c:1142
TAG_LEVEL
#define TAG_LEVEL
Definition: g_local.h:79
SP_turret_driver
void SP_turret_driver(edict_t *self)
Definition: g_turret.c:371
SP_monster_flipper
void SP_monster_flipper(edict_t *self)
Definition: m_flipper.c:346
SP_info_player_deathmatch
void SP_info_player_deathmatch(edict_t *ent)
Definition: p_client.c:117
SPAWNFLAG_NOT_MEDIUM
#define SPAWNFLAG_NOT_MEDIUM
Definition: g_local.h:53
game_locals_t::spawnpoint
char spawnpoint[512]
Definition: g_local.h:277
g_edicts
edict_t * g_edicts
Definition: g_main.c:31
itemlist
gitem_t itemlist[]
Definition: g_items.c:1063
PrecacheItem
void PrecacheItem(gitem_t *it)
Definition: g_items.c:937
SP_monster_floater
void SP_monster_floater(edict_t *self)
Definition: m_float.c:594
level_locals_t::level_name
char level_name[MAX_QPATH]
Definition: g_local.h:301
SP_func_areaportal
void SP_func_areaportal(edict_t *ent)
Definition: g_misc.c:42
spawn_field_t::type
fieldtype_t type
Definition: g_spawn.c:30
F_FLOAT
@ F_FLOAT
Definition: g_local.h:570
spawn_field_t::name
char * name
Definition: g_spawn.c:28
SetItemNames
void SetItemNames(void)
Definition: g_items.c:2146
SP_func_button
void SP_func_button(edict_t *ent)
Definition: g_func.c:726
temp_fields
static const spawn_field_t temp_fields[]
Definition: g_spawn.c:311
SP_misc_actor
void SP_misc_actor(edict_t *self)
Definition: m_actor.c:399
ED_CallSpawn
void ED_CallSpawn(edict_t *ent)
Definition: g_spawn.c:340
G_FreeEdict
void G_FreeEdict(edict_t *e)
Definition: g_utils.c:421
SP_info_player_intermission
void SP_info_player_intermission(edict_t *ent)
SP_misc_teleporter
void SP_misc_teleporter(edict_t *self)
Definition: g_misc.c:1748
SP_target_laser
void SP_target_laser(edict_t *self)
Definition: g_target.c:624
SP_misc_strogg_ship
void SP_misc_strogg_ship(edict_t *self)
Definition: g_misc.c:1354
SP_light
void SP_light(edict_t *self)
Definition: g_misc.c:525
fieldtype_t
fieldtype_t
Definition: g_local.h:565
game_locals_t::num_items
int num_items
Definition: g_local.h:287
SP_target_goal
void SP_target_goal(edict_t *ent)
Definition: g_target.c:197
SP_path_corner
void SP_path_corner(edict_t *self)
Definition: g_misc.c:376
SP_target_spawner
void SP_target_spawner(edict_t *ent)
Definition: g_target.c:386
SP_trigger_push
void SP_trigger_push(edict_t *ent)
Definition: g_trigger.c:390
SpawnEntities
void SpawnEntities(const char *mapname, const char *entities, const char *spawnpoint)
Definition: g_spawn.c:568
spawn_temp_t::nextmap
char * nextmap
Definition: g_local.h:347
SP_light_mine1
void SP_light_mine1(edict_t *ent)
Definition: g_misc.c:1411
SP_target_character
void SP_target_character(edict_t *ent)
Definition: g_misc.c:1501
SP_item_health
void SP_item_health(edict_t *self)
Definition: g_items.c:2071
SP_monster_flyer
void SP_monster_flyer(edict_t *self)
Definition: m_flyer.c:549
va
char * va(const char *format,...)
Definition: shared.c:429
SP_misc_insane
void SP_misc_insane(edict_t *self)
Definition: m_insane.c:589
SP_func_door_rotating
void SP_func_door_rotating(edict_t *ent)
Definition: g_func.c:1196
game_locals_t::clients
gclient_t * clients
Definition: g_local.h:273
SP_misc_teleporter_dest
void SP_misc_teleporter_dest(edict_t *self)
Definition: g_misc.c:1783
game
game_locals_t game
Definition: g_main.c:21
spawn_func_t
Definition: g_spawn.c:22
SP_target_secret
void SP_target_secret(edict_t *ent)
Definition: g_target.c:159
skyaxis
static vec3_t skyaxis
Definition: sky.c:22
SP_func_conveyor
void SP_func_conveyor(edict_t *self)
Definition: g_func.c:1734
random
#define random()
Definition: g_local.h:504
level_locals_t::nextmap
char nextmap[MAX_QPATH]
Definition: g_local.h:303
globals
game_export_t globals
Definition: g_main.c:24
void
void(APIENTRY *qwglDrawBuffer)(GLenum mode)
SP_func_door_secret
void SP_func_door_secret(edict_t *ent)
Definition: g_func.c:1855
SP_misc_gib_leg
void SP_misc_gib_leg(edict_t *self)
Definition: g_misc.c:1455
sm_meat_index
int sm_meat_index
Definition: g_main.c:27
SP_monster_soldier_ss
void SP_monster_soldier_ss(edict_t *self)
Definition: m_soldier.c:1231
SP_misc_satellite_dish
void SP_misc_satellite_dish(edict_t *self)
Definition: g_misc.c:1397
ED_ParseField
static qboolean ED_ParseField(const spawn_field_t *fields, const char *key, const char *value, byte *b)
Definition: g_spawn.c:414
SP_monster_hover
void SP_monster_hover(edict_t *self)
Definition: m_hover.c:546
SP_misc_explobox
void SP_misc_explobox(edict_t *self)
Definition: g_misc.c:918
skill
cvar_t * skill
Definition: g_main.c:36
SP_monster_medic
void SP_monster_medic(edict_t *self)
Definition: m_medic.c:686
spawn_funcs
static const spawn_func_t spawn_funcs[]
Definition: g_spawn.c:150
SP_worldspawn
void SP_worldspawn(edict_t *ent)
Definition: g_spawn.c:842
SP_info_player_start
void SP_info_player_start(edict_t *ent)
Definition: p_client.c:103
SP_monster_berserk
void SP_monster_berserk(edict_t *self)
Definition: m_berserk.c:399
SP_misc_gib_head
void SP_misc_gib_head(edict_t *self)
Definition: g_misc.c:1476
SP_item_health_large
void SP_item_health_large(edict_t *self)
Definition: g_items.c:2102
SP_turret_breach
void SP_turret_breach(edict_t *self)
Definition: g_turret.c:211
dm_statusbar
static const char dm_statusbar[]
Definition: g_spawn.c:752
SP_target_string
void SP_target_string(edict_t *ent)
Definition: g_misc.c:1543
c
statCounters_t c
Definition: main.c:30
SP_target_actor
void SP_target_actor(edict_t *ent)
Definition: m_actor.c:541
SPAWNFLAG_NOT_DEATHMATCH
#define SPAWNFLAG_NOT_DEATHMATCH
Definition: g_local.h:55
SPAWNFLAG_NOT_HARD
#define SPAWNFLAG_NOT_HARD
Definition: g_local.h:54
SP_trigger_monsterjump
void SP_trigger_monsterjump(edict_t *ent)
Definition: g_trigger.c:550
SP_func_water
void SP_func_water(edict_t *ent)
Definition: g_func.c:1308
SP_monster_tank
void SP_monster_tank(edict_t *self)
Definition: m_tank.c:752
SP_func_clock
void SP_func_clock(edict_t *ent)
Definition: g_misc.c:1670
ED_ParseEdict
void ED_ParseEdict(const char **data, edict_t *ent)
Definition: g_spawn.c:467
FL_TEAMSLAVE
#define FL_TEAMSLAVE
Definition: g_local.h:69
SP_target_crosslevel_trigger
void SP_target_crosslevel_trigger(edict_t *ent)
Definition: g_target.c:448
level
level_locals_t level
Definition: g_main.c:22
SP_target_help
void SP_target_help(edict_t *ent)
Definition: g_target.c:127
SP_monster_gunner
void SP_monster_gunner(edict_t *self)
Definition: m_gunner.c:559
SPAWNFLAG_NOT_COOP
#define SPAWNFLAG_NOT_COOP
Definition: g_local.h:56
SP_trigger_multiple
void SP_trigger_multiple(edict_t *ent)
Definition: g_trigger.c:109
skyrotate
static float skyrotate
Definition: sky.c:21
SP_info_notnull
void SP_info_notnull(edict_t *self)
Definition: g_misc.c:497
SP_trigger_always
void SP_trigger_always(edict_t *ent)
Definition: g_trigger.c:344
COM_Parse
char * COM_Parse(const char **data_p)
Definition: shared.c:455
spawn_temp_t::skyaxis
vec3_t skyaxis
Definition: g_local.h:346
spawn_temp_t::sky
char * sky
Definition: g_local.h:344
SP_point_combat
void SP_point_combat(edict_t *self)
Definition: g_misc.c:444
SP_item_health_small
void SP_item_health_small(edict_t *self)
Definition: g_items.c:2086
STOFS
#define STOFS(x)
Definition: g_local.h:499
EDICT_NUM
#define EDICT_NUM(n)
Definition: server.h:173
G_FindTeams
void G_FindTeams(void)
Definition: g_spawn.c:521
SP_trigger_gravity
void SP_trigger_gravity(edict_t *ent)
Definition: g_trigger.c:502
F_LSTRING
@ F_LSTRING
Definition: g_local.h:571
SP_info_player_coop
void SP_info_player_coop(edict_t *ent)
Definition: p_client.c:130
SaveClientData
void SaveClientData(void)
Definition: p_client.c:635
nomonsters
cvar_t * nomonsters
Definition: g_main.c:47
SP_func_door
void SP_func_door(edict_t *ent)
Definition: g_func.c:1078
game_locals_t::maxentities
int maxentities
Definition: g_local.h:281
level_locals_t::mapname
char mapname[MAX_QPATH]
Definition: g_local.h:302
SP_trigger_elevator
void SP_trigger_elevator(edict_t *ent)
Definition: g_func.c:1648
SP_monster_brain
void SP_monster_brain(edict_t *self)
Definition: m_brain.c:594
SP_misc_viper_bomb
void SP_misc_viper_bomb(edict_t *self)
Definition: g_misc.c:1317
spawn_temp_t::skyrotate
float skyrotate
Definition: g_local.h:345
F_INT
@ F_INT
Definition: g_local.h:569
SP_misc_easterchick2
void SP_misc_easterchick2(edict_t *self)
Definition: g_misc.c:1067
SP_monster_supertank
void SP_monster_supertank(edict_t *self)
Definition: m_supertank.c:646
SP_trigger_counter
void SP_trigger_counter(edict_t *ent)
Definition: g_trigger.c:323
F_ANGLEHACK
@ F_ANGLEHACK
Definition: g_local.h:575
SP_func_wall
void SP_func_wall(edict_t *self)
Definition: g_misc.c:573
SP_viewthing
void SP_viewthing(edict_t *ent)
Definition: g_misc.c:468
SP_func_timer
void SP_func_timer(edict_t *self)
Definition: g_func.c:1692
SP_trigger_relay
void SP_trigger_relay(edict_t *ent)
Definition: g_trigger.c:181
SP_item_health_mega
void SP_item_health_mega(edict_t *self)
Definition: g_items.c:2117
SP_target_lightramp
void SP_target_lightramp(edict_t *self)
Definition: g_target.c:688
SP_monster_boss3_stand
void SP_monster_boss3_stand(edict_t *self)
Definition: m_boss3.c:51
SP_misc_deadsoldier
void SP_misc_deadsoldier(edict_t *self)
Definition: g_misc.c:1170
SP_misc_viper
void SP_misc_viper(edict_t *self)
Definition: g_misc.c:1225
SP_monster_soldier
void SP_monster_soldier(edict_t *self)
Definition: m_soldier.c:1211
spawn_func_t::spawn
void(* spawn)(edict_t *ent)
Definition: g_spawn.c:24
SP_monster_mutant
void SP_monster_mutant(edict_t *self)
Definition: m_mutant.c:582
g_local.h
SP_target_changelevel
void SP_target_changelevel(edict_t *ent)
Definition: g_target.c:293
gitem_s::classname
char * classname
Definition: g_local.h:233
gitem_s
Definition: g_local.h:232
game_locals_t::maxclients
int maxclients
Definition: g_local.h:280