Crossfire Server, Trunk
init.c
Go to the documentation of this file.
1 /*
2  * Crossfire -- cooperative multi-player graphical RPG and adventure game
3  *
4  * Copyright (c) 1999-2014 Mark Wedel and the Crossfire Development Team
5  * Copyright (c) 1992 Frank Tore Johansen
6  *
7  * Crossfire is free software and comes with ABSOLUTELY NO WARRANTY. You are
8  * welcome to redistribute it under certain conditions. For details, please
9  * see COPYING and LICENSE.
10  *
11  * The authors can be reached via e-mail at <crossfire@metalforge.org>.
12  */
13 
19 #define EXTERN
20 #define INIT_C
21 
22 #include "global.h"
23 
24 #include <stdlib.h>
25 #include <string.h>
26 
27 #include "object.h"
28 #include "output_file.h"
29 #include "assets.h"
30 
31 static void init_environ(void);
32 static void init_defaults(void);
33 static void init_dynamic(void);
34 static void init_clocks(void);
35 
36 /*
37  * Anything with non-zero defaults in include/global.h must be set here.
38  */
39 struct Settings settings = {
40  .csport = CSPORT,
41  .debug = llevInfo,
42  .confdir = CONFDIR,
43  .datadir = DATADIR,
44  .localdir = LOCALDIR,
45  .playerdir = PLAYERDIR,
46  .mapdir = MAPDIR,
47  .regions = REGIONS,
48  .uniquedir = UNIQUE_DIR,
49  .templatedir = TEMPLATE_DIR,
50  .tmpdir = TMPDIR,
51  .stat_loss_on_death = STAT_LOSS_ON_DEATH,
52  .pk_luck_penalty = PK_LUCK_PENALTY,
53  .permanent_exp_ratio = PERMANENT_EXPERIENCE_RATIO,
54  .death_penalty_ratio = DEATH_PENALTY_RATIO,
55  .death_penalty_level = DEATH_PENALTY_LEVEL,
56  .balanced_stat_loss = BALANCED_STAT_LOSS,
57  .not_permadeth = NOT_PERMADETH,
58  .simple_exp = SIMPLE_EXP,
59  .reset_loc_time = RESET_LOCATION_TIME,
60  .set_title = SET_TITLE,
61  .resurrection = RESURRECTION,
62  .search_items = SEARCH_ITEMS,
63  .spell_encumbrance = SPELL_ENCUMBRANCE,
64  .spell_failure_effects = SPELL_FAILURE_EFFECTS,
65  .casting_time = CASTING_TIME,
66  .real_wiz = REAL_WIZ,
67  .recycle_tmp_maps = RECYCLE_TMP_MAPS,
68  .always_show_hp = ALWAYS_SHOW_HP,
69  .spellpoint_level_depend = SPELLPOINT_LEVEL_DEPEND,
70  .set_friendly_fire = SET_FRIENDLY_FIRE,
71  .motd = MOTD,
72  .rules = "rules",
73  .news = "news",
74  .emergency_x = EMERGENCY_X,
75  .emergency_y = EMERGENCY_Y,
76  .item_power_factor = 1.0,
77  /* Armor enchantment stuff */
78  .armor_max_enchant = ARMOR_MAX_ENCHANT,
79  .armor_weight_reduction = ARMOR_WEIGHT_REDUCTION,
80  .armor_weight_linear = ARMOR_WEIGHT_LINEAR,
81  .armor_speed_improvement = ARMOR_SPEED_IMPROVEMENT,
82  .armor_speed_linear = ARMOR_SPEED_LINEAR,
83  .no_player_stealing = 1,
84  .create_home_portals = 0,
85  .personalized_blessings = 1,
86  .pk_max_experience = 5000000,
87  .pk_max_experience_percent = 10,
88  .starting_stat_min = 3,
89  .starting_stat_max = 18,
90  .starting_stat_points = 85,
91  .roll_stat_points = 115,
92  .max_stat = 0, /* max_stat - will be loaded from stats file */
93  .special_break_map = 1, /* special_break_map, 1 for historical reasons */
94  .hooks_count = 0,
95  .ignore_assets_errors = 0,
96  .archetypes_tracker = NULL,
97  .fatal_hook = NULL,
98 };
99 
101 
107 const char *const spellpathnames[NRSPELLPATHS] = {
108  "Protection",
109  "Fire",
110  "Frost",
111  "Electricity",
112  "Missiles",
113  "Self",
114  "Summoning",
115  "Abjuration",
116  "Restoration",
117  "Detonation",
118  "Mind",
119  "Creation",
120  "Teleportation",
121  "Information",
122  "Transmutation",
123  "Transferrence",
124  "Turning",
125  "Wounding",
126  "Death",
127  "Light"
128 };
129 
130 
142 static void init_emergency_mappath(void) {
143  char filename[MAX_BUF], tmpbuf[MAX_BUF];
144  FILE *fp;
145  int online = 0;
146 
148 
149  /* If this file doesn't exist, not a big deal */
150  snprintf(filename, sizeof(filename), "%s/%s/.emergency", settings.datadir, settings.mapdir);
151  fp = fopen(filename, "r");
152  if (fp != NULL) {
153  while (fgets(tmpbuf, MAX_BUF-1, fp)) {
154  if (tmpbuf[0] == '#')
155  continue; /* ignore comments */
156 
157  if (online == 0) {
158  tmpbuf[strlen(tmpbuf)-1] = 0; /* kill newline */
161  } else if (online == 1) {
162  settings.emergency_x = atoi(tmpbuf);
163  } else if (online == 2) {
164  settings.emergency_y = atoi(tmpbuf);
165  }
166  online++;
167  if (online > 2)
168  break;
169  }
170  fclose(fp);
171  if (online <= 2)
172  LOG(llevError, "Online read partial data from %s\n", filename);
173  LOG(llevDebug, "emergency map set to %s (%d, %d)\n",
176  }
177 }
178 
179 void load_assets(void) {
181  assets_end_load();
182 }
183 
192 void init_library(void) {
193  init_environ();
194  init_hash_table();
195  init_globals();
196  init_stats(FALSE); /* Needs to be fairly early, since the loader will check
197  * against the settings.max_stat value
198  */
199 
200  for (int mess = 0; mess < MAXATTACKMESS; mess++) {
201  for (int level = 0; level < MAXATTACKMESS; level++) {
202  attack_mess[mess][level].level = -1;
203  attack_mess[mess][level].buf1 = NULL;
204  attack_mess[mess][level].buf2 = NULL;
205  attack_mess[mess][level].buf3 = NULL;
206  }
207  }
208 
209  assets_init();
210  i18n_init();
211  init_objects();
212  init_block();
213 
214  load_assets();
215 
216  init_clocks();
218  init_experience();
219 
221  LOG(llevError, "Assets errors, please fix and restart.\n");
223  }
224 
225  init_dynamic();
226 }
227 
233 static void init_environ(void) {
234  char *cp;
235 
236  cp = getenv("CROSSFIRE_LIBDIR");
237  if (cp)
238  settings.datadir = cp;
239  cp = getenv("CROSSFIRE_LOCALDIR");
240  if (cp)
241  settings.localdir = cp;
242  cp = getenv("CROSSFIRE_PLAYERDIR");
243  if (cp)
244  settings.playerdir = cp;
245  cp = getenv("CROSSFIRE_MAPDIR");
246  if (cp)
247  settings.mapdir = cp;
248  cp = getenv("CROSSFIRE_UNIQUEDIR");
249  if (cp)
250  settings.uniquedir = cp;
251  cp = getenv("CROSSFIRE_TEMPLATEDIR");
252  if (cp)
253  settings.templatedir = cp;
254  cp = getenv("CROSSFIRE_TMPDIR");
255  if (cp)
256  settings.tmpdir = cp;
257 }
258 
265 void init_globals(void) {
266  memset(&statistics, 0, sizeof(struct Statistics));
267 
268  /* Log to stderr by default. */
269  logfile = stderr;
270 
271  /* Try to open the log file specified on the command-line. */
272  if (settings.logfilename != NULL) {
273  logfile = fopen(settings.logfilename, "a");
274 
275  /* If writable, set buffer mode to per-line. */
276  if (logfile != NULL) {
277  setvbuf(logfile, NULL, _IOLBF, 0);
278  } else {
279  logfile = stderr;
280 
281  LOG(llevError, "Could not open '%s' for logging.\n",
283  }
284  }
285 
286  exiting = 0;
287  first_player = NULL;
288  first_map = NULL;
289  first_artifactlist = NULL;
290  *first_map_ext_path = 0;
291  nrofartifacts = 0;
292  nrofallowedstr = 0;
293  ring_arch = NULL;
294  amulet_arch = NULL;
295  undead_name = add_string("undead");
296  blocks_prayer = add_string("blocks_prayer");
298  init_defaults();
299 }
300 
311 void free_globals(void) {
312  int msg, attack;
313  region *reg;
314 
317  for (msg = 0; msg < NROFATTACKMESS; msg++)
318  for (attack = 0; attack < MAXATTACKMESS; attack++) {
319  free(attack_mess[msg][attack].buf1);
320  free(attack_mess[msg][attack].buf2);
321  free(attack_mess[msg][attack].buf3);
322  }
323 
325 
327  free_experience();
328 
329  while (first_region) {
330  reg = first_region->next;
336  first_region = reg;
337  }
338 
339  assets_free();
340 }
341 
346 static void init_defaults(void) {
347  nroferrors = 0;
348 }
349 
359 static void init_dynamic(void) {
361  if (!at) {
362  LOG(llevError, "You need a archetype for a legacy map, with type %d and subtype %d\n", MAP, MAP_TYPE_LEGACY);
364  }
365  if (EXIT_PATH(&at->clone)) {
366  mapstruct *first;
367 
369  first = ready_map_name(first_map_path, 0);
370  if (!first) {
371  LOG(llevError, "Initial map %s can't be found! Please ensure maps are correctly installed.\n", first_map_path);
372  LOG(llevError, "Unable to continue without initial map.\n");
374  }
375  delete_map(first);
376  } else {
377  LOG(llevError, "Legacy map must have a 'slaying' field!\n");
379  }
380 
382  LOG(llevError, "Can not find object of type MAP subtype MAP_TYPE_DEFAULT.\n");
383  LOG(llevError, "Are the archetype files up to date? Can not continue.\n");
385  }
386 }
387 
392 void write_todclock(void) {
393  char filename[MAX_BUF];
394  FILE *fp;
395  OutputFile of;
396 
397  snprintf(filename, sizeof(filename), "%s/clockdata", settings.localdir);
398  fp = of_open(&of, filename);
399  if (fp == NULL)
400  return;
401  fprintf(fp, "%lu", todtick);
402  of_close(&of);
403 }
404 
409 static void init_clocks(void) {
410  char filename[MAX_BUF];
411  FILE *fp;
412  static int has_been_done = 0;
413 
414  if (has_been_done)
415  return;
416  else
417  has_been_done = 1;
418 
419  snprintf(filename, sizeof(filename), "%s/clockdata", settings.localdir);
420  fp = fopen(filename, "r");
421  if (fp == NULL) {
422  LOG(llevError, "Can't open %s.\n", filename);
423  todtick = 0;
424  write_todclock();
425  return;
426  }
427  /* Read TOD and default to 0 on failure. */
428  if (fscanf(fp, "%lu", &todtick) == 1) {
429  LOG(llevDebug, "clockdata: todtick is %lu\n", todtick);
430  fclose(fp);
431  } else {
432  LOG(llevError, "Couldn't parse todtick, using default value 0\n");
433  todtick = 0;
434  fclose(fp);
435  write_todclock();
436  }
437 }
438 
445 void init_attackmess(BufferReader *reader, const char *filename) {
446  char *buf;
447  char *cp, *p;
448  int mess = -1, level;
449  int mode = 0, total = 0;
450 
451  level = 0;
452  while ((buf = bufferreader_next_line(reader)) != NULL) {
453  if (*buf == '#' || *buf == '\0')
454  continue;
455  /*
456  * Skip blanks -- strspn is slightly faster than a loop w/ optimization on
457  * Also, note we go from the beginning of the line again, since cp was at the end.
458  * While here, also skip tabs for more complete whitespace handling.
459  *
460  * SilverNexus 2018-01-21
461  */
462  cp = buf + strspn(buf, " \t");
463 
464  if (strncmp(cp, "TYPE:", 5) == 0) {
465  p = strtok(buf, ":");
466  p = strtok(NULL, ":");
467  if (mode == 1) {
468  attack_mess[mess][level].level = -1;
469  free(attack_mess[mess][level].buf1);
470  free(attack_mess[mess][level].buf2);
471  free(attack_mess[mess][level].buf3);
472  attack_mess[mess][level].buf1 = NULL;
473  attack_mess[mess][level].buf2 = NULL;
474  attack_mess[mess][level].buf3 = NULL;
475  }
476  level = 0;
477  mess = atoi(p);
478  mode = 1;
479  continue;
480  }
481  if (mode == 1) {
482  p = strtok(buf, "=");
483  attack_mess[mess][level].level = atoi(buf);
484  p = strtok(NULL, "=");
485  free(attack_mess[mess][level].buf1);
486  if (p != NULL)
487  attack_mess[mess][level].buf1 = strdup_local(p);
488  else
489  attack_mess[mess][level].buf1 = strdup_local("");
490  mode = 2;
491  continue;
492  } else if (mode == 2) {
493  p = strtok(buf, "=");
494  attack_mess[mess][level].level = atoi(buf);
495  p = strtok(NULL, "=");
496  free(attack_mess[mess][level].buf2);
497  if (p != NULL)
498  attack_mess[mess][level].buf2 = strdup_local(p);
499  else
500  attack_mess[mess][level].buf2 = strdup_local("");
501  mode = 3;
502  continue;
503  } else if (mode == 3) {
504  p = strtok(buf, "=");
505  attack_mess[mess][level].level = atoi(buf);
506  p = strtok(NULL, "=");
507  free(attack_mess[mess][level].buf3);
508  if (p != NULL)
509  attack_mess[mess][level].buf3 = strdup_local(p);
510  else
511  attack_mess[mess][level].buf3 = strdup_local("");
512  mode = 1;
513  level++;
514  total++;
515  continue;
516  }
517  }
518  LOG(llevDebug, "attackmsg %s: %d messages in %d categories\n", filename, total, mess+1);
519 }
init_hash_table
void init_hash_table(void)
Definition: shstr.c:55
ready_map_name
mapstruct * ready_map_name(const char *name, int flags)
Definition: map.c:1785
nrofallowedstr
EXTERN long nrofallowedstr
Definition: global.h:138
NROFATTACKMESS
#define NROFATTACKMESS
Definition: attack.h:18
Settings::mapdir
const char * mapdir
Definition: global.h:246
output_file.h
global.h
DEATH_PENALTY_LEVEL
#define DEATH_PENALTY_LEVEL
Definition: config.h:152
SPELL_ENCUMBRANCE
#define SPELL_ENCUMBRANCE
Definition: config.h:156
add_string
sstring add_string(const char *str)
Definition: shstr.c:124
MAP
@ MAP
Definition: object.h:125
attackmess::level
int level
Definition: attack.h:119
init_environ
static void init_environ(void)
Definition: init.c:233
Settings::emergency_y
uint16_t emergency_y
Definition: global.h:295
llevError
@ llevError
Definition: logger.h:11
assets_dump_undefined
size_t assets_dump_undefined()
Definition: assets.cpp:234
strdup_local
#define strdup_local
Definition: compat.h:29
EMERGENCY_Y
#define EMERGENCY_Y
Definition: config.h:501
attackmess::buf1
char * buf1
Definition: attack.h:120
FALSE
#define FALSE
Definition: compat.h:14
Settings::datadir
const char * datadir
Definition: global.h:243
EXIT_PATH
#define EXIT_PATH(xyz)
Definition: define.h:439
MAPDIR
#define MAPDIR
Definition: config.h:507
MOTD
#define MOTD
Definition: config.h:440
UNIQUE_DIR
#define UNIQUE_DIR
Definition: config.h:488
mail_login.total
total
Definition: mail_login.py:30
first_artifactlist
EXTERN artifactlist * first_artifactlist
Definition: global.h:118
bufferreader_next_line
char * bufferreader_next_line(BufferReader *br)
Definition: bufferreader.c:102
init_objects
void init_objects(void)
Definition: object.c:327
Settings::emergency_x
uint16_t emergency_x
Definition: global.h:295
SEE_LAST_ERROR
@ SEE_LAST_ERROR
Definition: define.h:52
SIMPLE_EXP
#define SIMPLE_EXP
Definition: config.h:154
clear_friendly_list
void clear_friendly_list(void)
Definition: friend.cpp:138
first_map_path
EXTERN char first_map_path[MAX_BUF]
Definition: global.h:141
free_experience
void free_experience(void)
Definition: exp.c:263
npc_dialog.filename
filename
Definition: npc_dialog.py:99
assets_free
void assets_free()
Definition: assets.cpp:76
first_map
EXTERN mapstruct * first_map
Definition: global.h:116
Settings::csport
uint16_t csport
Definition: global.h:238
Statistics
Definition: global.h:350
MAXATTACKMESS
#define MAXATTACKMESS
Definition: attack.h:19
Settings::ignore_assets_errors
int ignore_assets_errors
Definition: global.h:330
SET_TITLE
#define SET_TITLE
Definition: config.h:153
amulet_arch
EXTERN archetype * amulet_arch
Definition: global.h:152
REGIONS
#define REGIONS
Definition: config.h:509
archt
Definition: object.h:469
settings
struct Settings settings
Definition: init.c:39
undead_name
const EXTERN char * undead_name
Definition: global.h:153
DEATH_PENALTY_RATIO
#define DEATH_PENALTY_RATIO
Definition: config.h:151
regiondef::next
struct regiondef * next
Definition: map.h:276
RESURRECTION
#define RESURRECTION
Definition: config.h:161
RECYCLE_TMP_MAPS
#define RECYCLE_TMP_MAPS
Definition: config.h:159
ARMOR_SPEED_IMPROVEMENT
#define ARMOR_SPEED_IMPROVEMENT
Definition: config.h:171
of_close
int of_close(OutputFile *of)
Definition: output_file.c:61
SPELLPOINT_LEVEL_DEPEND
#define SPELLPOINT_LEVEL_DEPEND
Definition: config.h:155
PK_LUCK_PENALTY
#define PK_LUCK_PENALTY
Definition: config.h:165
Settings::logfilename
const char * logfilename
Definition: global.h:237
init_clocks
static void init_clocks(void)
Definition: init.c:409
fatal
void fatal(enum fatal_error err)
Definition: utils.c:580
attack_mess
EXTERN attackmess_t attack_mess[NROFATTACKMESS][MAXATTACKMESS]
Definition: attack.h:131
navar-midane_pickup.msg
list msg
Definition: navar-midane_pickup.py:13
SEARCH_ITEMS
#define SEARCH_ITEMS
Definition: config.h:162
todtick
unsigned long todtick
Definition: time.c:38
regiondef::name
char * name
Definition: map.h:277
first_player
EXTERN player * first_player
Definition: global.h:115
ARMOR_SPEED_LINEAR
#define ARMOR_SPEED_LINEAR
Definition: config.h:172
ARMOR_WEIGHT_REDUCTION
#define ARMOR_WEIGHT_REDUCTION
Definition: config.h:169
ARMOR_MAX_ENCHANT
#define ARMOR_MAX_ENCHANT
Definition: config.h:168
MAP_TYPE_LEGACY
#define MAP_TYPE_LEGACY
Definition: map.h:57
init_stats
void init_stats(int reload)
Definition: living.c:2594
nroferrors
EXTERN long nroferrors
Definition: global.h:126
mapdef
Definition: map.h:317
logfile
EXTERN FILE * logfile
Definition: global.h:134
TMPDIR
#define TMPDIR
Definition: config.h:480
blocks_prayer
EXTERN sstring blocks_prayer
Definition: global.h:154
delete_map
void delete_map(mapstruct *m)
Definition: map.c:1722
init_globals
void init_globals(void)
Definition: init.c:265
ASSETS_ALL
#define ASSETS_ALL
Definition: assets.h:36
strlcpy
size_t strlcpy(char *dst, const char *src, size_t size)
Definition: porting.c:220
MAX_BUF
#define MAX_BUF
Definition: define.h:35
CASTING_TIME
#define CASTING_TIME
Definition: config.h:166
Settings::playerdir
const char * playerdir
Definition: global.h:245
statistics
struct Statistics statistics
Definition: init.c:100
FREE_AND_CLEAR_STR
#define FREE_AND_CLEAR_STR(xyz)
Definition: global.h:195
Settings
Definition: global.h:236
ARMOR_WEIGHT_LINEAR
#define ARMOR_WEIGHT_LINEAR
Definition: config.h:170
STAT_LOSS_ON_DEATH
#define STAT_LOSS_ON_DEATH
Definition: config.h:164
Settings::emergency_mapname
char * emergency_mapname
Definition: global.h:294
llevInfo
@ llevInfo
Definition: logger.h:12
REAL_WIZ
#define REAL_WIZ
Definition: config.h:158
SET_FRIENDLY_FIRE
#define SET_FRIENDLY_FIRE
Definition: config.h:167
spellpathnames
const char *const spellpathnames[NRSPELLPATHS]
Definition: init.c:107
FREE_AND_CLEAR
#define FREE_AND_CLEAR(xyz)
Definition: global.h:190
archt::clone
object clone
Definition: object.h:473
regiondef::jailmap
char * jailmap
Definition: map.h:289
i18n_init
void i18n_init(void)
Definition: languages.c:154
LOG
void LOG(LogLevel logLevel, const char *format,...)
Definition: logger.c:51
ALWAYS_SHOW_HP
#define ALWAYS_SHOW_HP
Definition: config.h:160
of_open
FILE * of_open(OutputFile *of, const char *fname)
Definition: output_file.c:30
load_assets
void load_assets(void)
Definition: init.c:179
init_attackmess
void init_attackmess(BufferReader *reader, const char *filename)
Definition: init.c:445
TEMPLATE_DIR
#define TEMPLATE_DIR
Definition: config.h:508
RESET_LOCATION_TIME
#define RESET_LOCATION_TIME
Definition: config.h:621
assets.h
SPELL_FAILURE_EFFECTS
#define SPELL_FAILURE_EFFECTS
Definition: config.h:157
buf
StringBuffer * buf
Definition: readable.c:1610
BALANCED_STAT_LOSS
#define BALANCED_STAT_LOSS
Definition: config.h:149
PERMANENT_EXPERIENCE_RATIO
#define PERMANENT_EXPERIENCE_RATIO
Definition: config.h:150
MAP_TYPE_DEFAULT
#define MAP_TYPE_DEFAULT
Definition: map.h:58
EMERGENCY_X
#define EMERGENCY_X
Definition: config.h:500
get_archetype_by_type_subtype
archetype * get_archetype_by_type_subtype(int type, int subtype)
Definition: arch.cpp:101
first_map_ext_path
EXTERN char first_map_ext_path[MAX_BUF]
Definition: global.h:142
attackmess::buf3
char * buf3
Definition: attack.h:122
Settings::templatedir
const char * templatedir
Definition: global.h:249
trying_emergency_save
EXTERN long trying_emergency_save
Definition: global.h:125
PLAYERDIR
#define PLAYERDIR
Definition: config.h:541
init_block
void init_block(void)
Definition: los.c:88
level
int level
Definition: readable.c:1608
nrofartifacts
EXTERN long nrofartifacts
Definition: global.h:137
init_defaults
static void init_defaults(void)
Definition: init.c:346
init_emergency_mappath
static void init_emergency_mappath(void)
Definition: init.c:142
exiting
EXTERN int exiting
Definition: global.h:136
assets_collect
void assets_collect(const char *datadir, int what)
Definition: assets.cpp:117
init_library
void init_library(void)
Definition: init.c:192
Settings::tmpdir
const char * tmpdir
Definition: global.h:250
regiondef::msg
char * msg
Definition: map.h:285
EMERGENCY_MAPPATH
#define EMERGENCY_MAPPATH
Definition: config.h:498
ring_arch
EXTERN archetype * ring_arch
Definition: global.h:152
init_experience
void init_experience(void)
Definition: exp.c:167
init_dynamic
static void init_dynamic(void)
Definition: init.c:359
first_region
EXTERN region * first_region
Definition: global.h:117
CSPORT
#define CSPORT
Definition: config.h:354
regiondef::longname
char * longname
Definition: map.h:283
free_globals
void free_globals(void)
Definition: init.c:311
BufferReader
Definition: bufferreader.c:21
write_todclock
void write_todclock(void)
Definition: init.c:392
assets_init
void assets_init()
Definition: assets.cpp:69
object.h
NOT_PERMADETH
#define NOT_PERMADETH
Definition: config.h:163
llevDebug
@ llevDebug
Definition: logger.h:13
NRSPELLPATHS
#define NRSPELLPATHS
Definition: spells.h:40
attackmess::buf2
char * buf2
Definition: attack.h:121
assets_end_load
void assets_end_load()
Definition: assets.cpp:241
Settings::uniquedir
const char * uniquedir
Definition: global.h:248
OutputFile
Definition: output_file.h:41
level
Definition: level.py:1
Settings::localdir
const char * localdir
Definition: global.h:244
regiondef
Definition: map.h:275