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 
188 void init_library(void) {
189  init_environ();
190  init_globals();
191  init_stats(FALSE); /* Needs to be fairly early, since the loader will check
192  * against the settings.max_stat value
193  */
194 
195  for (int mess = 0; mess < MAXATTACKMESS; mess++) {
196  for (int level = 0; level < MAXATTACKMESS; level++) {
197  attack_mess[mess][level].level = -1;
198  attack_mess[mess][level].buf1 = NULL;
199  attack_mess[mess][level].buf2 = NULL;
200  attack_mess[mess][level].buf3 = NULL;
201  }
202  }
203 
204  assets_init();
205  init_hash_table();
206  i18n_init();
207  init_objects();
208  init_block();
209 
211  assets_end_load();
212 
213  init_clocks();
215  init_experience();
216 
218  LOG(llevError, "Assets errors, please fix and restart.\n");
220  }
221 
222  /* init_dynamic() loads a map, so needs a region */
223  if (init_regions() != 0) {
224  LOG(llevError, "Please check that your maps are correctly installed.\n");
226  }
227 
228  init_dynamic();
229 }
230 
236 static void init_environ(void) {
237  char *cp;
238 
239  cp = getenv("CROSSFIRE_LIBDIR");
240  if (cp)
241  settings.datadir = cp;
242  cp = getenv("CROSSFIRE_LOCALDIR");
243  if (cp)
244  settings.localdir = cp;
245  cp = getenv("CROSSFIRE_PLAYERDIR");
246  if (cp)
247  settings.playerdir = cp;
248  cp = getenv("CROSSFIRE_MAPDIR");
249  if (cp)
250  settings.mapdir = cp;
251  cp = getenv("CROSSFIRE_UNIQUEDIR");
252  if (cp)
253  settings.uniquedir = cp;
254  cp = getenv("CROSSFIRE_TEMPLATEDIR");
255  if (cp)
256  settings.templatedir = cp;
257  cp = getenv("CROSSFIRE_TMPDIR");
258  if (cp)
259  settings.tmpdir = cp;
260 }
261 
268 void init_globals(void) {
269  memset(&statistics, 0, sizeof(struct Statistics));
270 
271  /* Log to stderr by default. */
272  logfile = stderr;
273 
274  /* Try to open the log file specified on the command-line. */
275  if (settings.logfilename != NULL) {
276  logfile = fopen(settings.logfilename, "a");
277 
278  /* If writable, set buffer mode to per-line. */
279  if (logfile != NULL) {
280  setvbuf(logfile, NULL, _IOLBF, 0);
281  } else {
282  logfile = stderr;
283 
284  LOG(llevError, "Could not open '%s' for logging.\n",
286  }
287  }
288 
289  exiting = 0;
290  first_player = NULL;
291  first_friendly_object = NULL;
292  first_map = NULL;
293  first_artifactlist = NULL;
294  *first_map_ext_path = 0;
295  nrofartifacts = 0;
296  nrofallowedstr = 0;
297  ring_arch = NULL;
298  amulet_arch = NULL;
299  undead_name = add_string("undead");
301  init_defaults();
302 }
303 
314 void free_globals(void) {
315  int msg, attack;
316  objectlink *friend;
317  region *reg;
318 
320  for (msg = 0; msg < NROFATTACKMESS; msg++)
321  for (attack = 0; attack < MAXATTACKMESS; attack++) {
322  free(attack_mess[msg][attack].buf1);
323  free(attack_mess[msg][attack].buf2);
324  free(attack_mess[msg][attack].buf3);
325  }
326 
328 
329  while (first_friendly_object) {
330  friend = first_friendly_object->next;
332  first_friendly_object = friend;
333  }
334 
335  free_experience();
336 
337  while (first_region) {
338  reg = first_region->next;
345  first_region = reg;
346  }
347 
348  assets_free();
349 }
350 
355 static void init_defaults(void) {
356  nroferrors = 0;
357 }
358 
368 static void init_dynamic(void) {
370  if (!at) {
371  LOG(llevError, "You need a archetype for a legacy map, with type %d and subtype %d\n", MAP, MAP_TYPE_LEGACY);
373  }
374  if (EXIT_PATH(&at->clone)) {
375  mapstruct *first;
376 
378  first = ready_map_name(first_map_path, 0);
379  if (!first) {
380  LOG(llevError, "Initial map %s can't be found! Please ensure maps are correctly installed.\n", first_map_path);
381  LOG(llevError, "Unable to continue without initial map.\n");
383  }
384  delete_map(first);
385  } else {
386  LOG(llevError, "Legacy map must have a 'slaying' field!\n");
388  }
389 
391  LOG(llevError, "Can not find object of type MAP subtype MAP_TYPE_DEFAULT.\n");
392  LOG(llevError, "Are the archetype files up to date? Can not continue.\n");
394  }
395 }
396 
398 unsigned long todtick;
399 
404 void write_todclock(void) {
405  char filename[MAX_BUF];
406  FILE *fp;
407  OutputFile of;
408 
409  snprintf(filename, sizeof(filename), "%s/clockdata", settings.localdir);
410  fp = of_open(&of, filename);
411  if (fp == NULL)
412  return;
413  fprintf(fp, "%lu", todtick);
414  of_close(&of);
415 }
416 
421 static void init_clocks(void) {
422  char filename[MAX_BUF];
423  FILE *fp;
424  static int has_been_done = 0;
425 
426  if (has_been_done)
427  return;
428  else
429  has_been_done = 1;
430 
431  snprintf(filename, sizeof(filename), "%s/clockdata", settings.localdir);
432  fp = fopen(filename, "r");
433  if (fp == NULL) {
434  LOG(llevError, "Can't open %s.\n", filename);
435  todtick = 0;
436  write_todclock();
437  return;
438  }
439  /* Read TOD and default to 0 on failure. */
440  if (fscanf(fp, "%lu", &todtick) == 1) {
441  LOG(llevDebug, "clockdata: todtick is %lu\n", todtick);
442  fclose(fp);
443  } else {
444  LOG(llevError, "Couldn't parse todtick, using default value 0\n");
445  todtick = 0;
446  fclose(fp);
447  write_todclock();
448  }
449 }
450 
457 void init_attackmess(BufferReader *reader, const char *filename) {
458  char *buf;
459  char *cp, *p;
460  int mess = -1, level;
461  int mode = 0, total = 0;
462 
463  level = 0;
464  while ((buf = bufferreader_next_line(reader)) != NULL) {
465  if (*buf == '#')
466  continue;
467  /*
468  * Skip blanks -- strspn is slightly faster than a loop w/ optimization on
469  * Also, note we go from the beginning of the line again, since cp was at the end.
470  * While here, also skip tabs for more complete whitespace handling.
471  *
472  * SilverNexus 2018-01-21
473  */
474  cp = buf + strspn(buf, " \t");
475 
476  if (strncmp(cp, "TYPE:", 5) == 0) {
477  p = strtok(buf, ":");
478  p = strtok(NULL, ":");
479  if (mode == 1) {
480  attack_mess[mess][level].level = -1;
481  free(attack_mess[mess][level].buf1);
482  free(attack_mess[mess][level].buf2);
483  free(attack_mess[mess][level].buf3);
484  attack_mess[mess][level].buf1 = NULL;
485  attack_mess[mess][level].buf2 = NULL;
486  attack_mess[mess][level].buf3 = NULL;
487  }
488  level = 0;
489  mess = atoi(p);
490  mode = 1;
491  continue;
492  }
493  if (mode == 1) {
494  p = strtok(buf, "=");
495  attack_mess[mess][level].level = atoi(buf);
496  p = strtok(NULL, "=");
497  free(attack_mess[mess][level].buf1);
498  if (p != NULL)
499  attack_mess[mess][level].buf1 = strdup_local(p);
500  else
501  attack_mess[mess][level].buf1 = strdup_local("");
502  mode = 2;
503  continue;
504  } else if (mode == 2) {
505  p = strtok(buf, "=");
506  attack_mess[mess][level].level = atoi(buf);
507  p = strtok(NULL, "=");
508  free(attack_mess[mess][level].buf2);
509  if (p != NULL)
510  attack_mess[mess][level].buf2 = strdup_local(p);
511  else
512  attack_mess[mess][level].buf2 = strdup_local("");
513  mode = 3;
514  continue;
515  } else if (mode == 3) {
516  p = strtok(buf, "=");
517  attack_mess[mess][level].level = atoi(buf);
518  p = strtok(NULL, "=");
519  free(attack_mess[mess][level].buf3);
520  if (p != NULL)
521  attack_mess[mess][level].buf3 = strdup_local(p);
522  else
523  attack_mess[mess][level].buf3 = strdup_local("");
524  mode = 1;
525  level++;
526  total++;
527  continue;
528  }
529  }
530  LOG(llevDebug, "attackmsg %s: %d messages in %d categories\n", filename, total, mess+1);
531 }
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:1778
nrofallowedstr
EXTERN long nrofallowedstr
Definition: global.h:140
NROFATTACKMESS
#define NROFATTACKMESS
Definition: attack.h:18
Settings::mapdir
const char * mapdir
Definition: global.h:247
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:236
Settings::emergency_y
uint16_t emergency_y
Definition: global.h:296
llevError
@ llevError
Definition: logger.h:11
assets_dump_undefined
size_t assets_dump_undefined()
Definition: assets.cpp:228
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:244
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
init_regions
int init_regions(void)
Definition: region.c:293
bufferreader_next_line
char * bufferreader_next_line(BufferReader *br)
Definition: bufferreader.c:102
init_objects
void init_objects(void)
Definition: object.c:316
Settings::emergency_x
uint16_t emergency_x
Definition: global.h:296
SEE_LAST_ERROR
@ SEE_LAST_ERROR
Definition: define.h:52
SIMPLE_EXP
#define SIMPLE_EXP
Definition: config.h:154
first_map_path
EXTERN char first_map_path[MAX_BUF]
Definition: global.h:143
free_experience
void free_experience(void)
Definition: exp.c:262
todtick
unsigned long todtick
Definition: init.c:398
npc_dialog.filename
filename
Definition: npc_dialog.py:99
assets_free
void assets_free()
Definition: assets.cpp:75
first_map
EXTERN mapstruct * first_map
Definition: global.h:116
Settings::csport
uint16_t csport
Definition: global.h:239
Statistics
Definition: global.h:351
MAXATTACKMESS
#define MAXATTACKMESS
Definition: attack.h:19
Settings::ignore_assets_errors
int ignore_assets_errors
Definition: global.h:331
first_friendly_object
EXTERN objectlink * first_friendly_object
Definition: global.h:119
SET_TITLE
#define SET_TITLE
Definition: config.h:153
amulet_arch
EXTERN archetype * amulet_arch
Definition: global.h:154
REGIONS
#define REGIONS
Definition: config.h:509
regiondef::parent_name
char * parent_name
Definition: map.h:278
archt
Definition: object.h:468
settings
struct Settings settings
Definition: init.c:39
undead_name
const EXTERN char * undead_name
Definition: global.h:155
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
oblnk::next
struct oblnk * next
Definition: object.h:447
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:238
init_clocks
static void init_clocks(void)
Definition: init.c:421
fatal
void fatal(enum fatal_error err)
Definition: utils.c:597
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
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:128
mapdef
Definition: map.h:324
logfile
EXTERN FILE * logfile
Definition: global.h:136
TMPDIR
#define TMPDIR
Definition: config.h:480
delete_map
void delete_map(mapstruct *m)
Definition: map.c:1716
init_globals
void init_globals(void)
Definition: init.c:268
ASSETS_ALL
#define ASSETS_ALL
Definition: assets.h:35
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:246
statistics
struct Statistics statistics
Definition: init.c:100
FREE_AND_CLEAR_STR
#define FREE_AND_CLEAR_STR(xyz)
Definition: global.h:196
Settings
Definition: global.h:237
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:295
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:191
archt::clone
object clone
Definition: object.h:472
regiondef::jailmap
char * jailmap
Definition: map.h:296
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
init_attackmess
void init_attackmess(BufferReader *reader, const char *filename)
Definition: init.c:457
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:1606
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:144
attackmess::buf3
char * buf3
Definition: attack.h:122
Settings::templatedir
const char * templatedir
Definition: global.h:250
trying_emergency_save
EXTERN long trying_emergency_save
Definition: global.h:127
PLAYERDIR
#define PLAYERDIR
Definition: config.h:541
init_block
void init_block(void)
Definition: los.c:88
level
int level
Definition: readable.c:1604
nrofartifacts
EXTERN long nrofartifacts
Definition: global.h:139
init_defaults
static void init_defaults(void)
Definition: init.c:355
init_emergency_mappath
static void init_emergency_mappath(void)
Definition: init.c:142
exiting
EXTERN int exiting
Definition: global.h:138
assets_collect
void assets_collect(const char *datadir, int what)
Definition: assets.cpp:116
init_library
void init_library(void)
Definition: init.c:188
Settings::tmpdir
const char * tmpdir
Definition: global.h:251
oblnk
Definition: object.h:445
regiondef::msg
char * msg
Definition: map.h:292
EMERGENCY_MAPPATH
#define EMERGENCY_MAPPATH
Definition: config.h:498
ring_arch
EXTERN archetype * ring_arch
Definition: global.h:154
init_experience
void init_experience(void)
Definition: exp.c:167
init_dynamic
static void init_dynamic(void)
Definition: init.c:368
first_region
EXTERN region * first_region
Definition: global.h:117
CSPORT
#define CSPORT
Definition: config.h:354
regiondef::longname
char * longname
Definition: map.h:290
free_globals
void free_globals(void)
Definition: init.c:314
BufferReader
Definition: bufferreader.c:21
write_todclock
void write_todclock(void)
Definition: init.c:404
assets_init
void assets_init()
Definition: assets.cpp:68
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:235
Settings::uniquedir
const char * uniquedir
Definition: global.h:249
OutputFile
Definition: output_file.h:41
level
Definition: level.py:1
Settings::localdir
const char * localdir
Definition: global.h:245
regiondef
Definition: map.h:275