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() loads a map, so needs a region */
226  if (init_regions() != 0) {
227  LOG(llevError, "Please check that your maps are correctly installed.\n");
229  }
230 
231  init_dynamic();
232 }
233 
239 static void init_environ(void) {
240  char *cp;
241 
242  cp = getenv("CROSSFIRE_LIBDIR");
243  if (cp)
244  settings.datadir = cp;
245  cp = getenv("CROSSFIRE_LOCALDIR");
246  if (cp)
247  settings.localdir = cp;
248  cp = getenv("CROSSFIRE_PLAYERDIR");
249  if (cp)
250  settings.playerdir = cp;
251  cp = getenv("CROSSFIRE_MAPDIR");
252  if (cp)
253  settings.mapdir = cp;
254  cp = getenv("CROSSFIRE_UNIQUEDIR");
255  if (cp)
256  settings.uniquedir = cp;
257  cp = getenv("CROSSFIRE_TEMPLATEDIR");
258  if (cp)
259  settings.templatedir = cp;
260  cp = getenv("CROSSFIRE_TMPDIR");
261  if (cp)
262  settings.tmpdir = cp;
263 }
264 
271 void init_globals(void) {
272  memset(&statistics, 0, sizeof(struct Statistics));
273 
274  /* Log to stderr by default. */
275  logfile = stderr;
276 
277  /* Try to open the log file specified on the command-line. */
278  if (settings.logfilename != NULL) {
279  logfile = fopen(settings.logfilename, "a");
280 
281  /* If writable, set buffer mode to per-line. */
282  if (logfile != NULL) {
283  setvbuf(logfile, NULL, _IOLBF, 0);
284  } else {
285  logfile = stderr;
286 
287  LOG(llevError, "Could not open '%s' for logging.\n",
289  }
290  }
291 
292  exiting = 0;
293  first_player = NULL;
294  first_friendly_object = NULL;
295  first_map = NULL;
296  first_artifactlist = NULL;
297  *first_map_ext_path = 0;
298  nrofartifacts = 0;
299  nrofallowedstr = 0;
300  ring_arch = NULL;
301  amulet_arch = NULL;
302  undead_name = add_string("undead");
303  blocks_prayer = add_string("blocks_prayer");
305  init_defaults();
306 }
307 
318 void free_globals(void) {
319  int msg, attack;
320  objectlink *friend;
321  region *reg;
322 
325  for (msg = 0; msg < NROFATTACKMESS; msg++)
326  for (attack = 0; attack < MAXATTACKMESS; attack++) {
327  free(attack_mess[msg][attack].buf1);
328  free(attack_mess[msg][attack].buf2);
329  free(attack_mess[msg][attack].buf3);
330  }
331 
333 
334  while (first_friendly_object) {
335  friend = first_friendly_object->next;
337  first_friendly_object = friend;
338  }
339 
340  free_experience();
341 
342  while (first_region) {
343  reg = first_region->next;
350  first_region = reg;
351  }
352 
353  assets_free();
354 }
355 
360 static void init_defaults(void) {
361  nroferrors = 0;
362 }
363 
373 static void init_dynamic(void) {
375  if (!at) {
376  LOG(llevError, "You need a archetype for a legacy map, with type %d and subtype %d\n", MAP, MAP_TYPE_LEGACY);
378  }
379  if (EXIT_PATH(&at->clone)) {
380  mapstruct *first;
381 
383  first = ready_map_name(first_map_path, 0);
384  if (!first) {
385  LOG(llevError, "Initial map %s can't be found! Please ensure maps are correctly installed.\n", first_map_path);
386  LOG(llevError, "Unable to continue without initial map.\n");
388  }
389  delete_map(first);
390  } else {
391  LOG(llevError, "Legacy map must have a 'slaying' field!\n");
393  }
394 
396  LOG(llevError, "Can not find object of type MAP subtype MAP_TYPE_DEFAULT.\n");
397  LOG(llevError, "Are the archetype files up to date? Can not continue.\n");
399  }
400 }
401 
406 void write_todclock(void) {
407  char filename[MAX_BUF];
408  FILE *fp;
409  OutputFile of;
410 
411  snprintf(filename, sizeof(filename), "%s/clockdata", settings.localdir);
412  fp = of_open(&of, filename);
413  if (fp == NULL)
414  return;
415  fprintf(fp, "%lu", todtick);
416  of_close(&of);
417 }
418 
423 static void init_clocks(void) {
424  char filename[MAX_BUF];
425  FILE *fp;
426  static int has_been_done = 0;
427 
428  if (has_been_done)
429  return;
430  else
431  has_been_done = 1;
432 
433  snprintf(filename, sizeof(filename), "%s/clockdata", settings.localdir);
434  fp = fopen(filename, "r");
435  if (fp == NULL) {
436  LOG(llevError, "Can't open %s.\n", filename);
437  todtick = 0;
438  write_todclock();
439  return;
440  }
441  /* Read TOD and default to 0 on failure. */
442  if (fscanf(fp, "%lu", &todtick) == 1) {
443  LOG(llevDebug, "clockdata: todtick is %lu\n", todtick);
444  fclose(fp);
445  } else {
446  LOG(llevError, "Couldn't parse todtick, using default value 0\n");
447  todtick = 0;
448  fclose(fp);
449  write_todclock();
450  }
451 }
452 
459 void init_attackmess(BufferReader *reader, const char *filename) {
460  char *buf;
461  char *cp, *p;
462  int mess = -1, level;
463  int mode = 0, total = 0;
464 
465  level = 0;
466  while ((buf = bufferreader_next_line(reader)) != NULL) {
467  if (*buf == '#' || *buf == '\0')
468  continue;
469  /*
470  * Skip blanks -- strspn is slightly faster than a loop w/ optimization on
471  * Also, note we go from the beginning of the line again, since cp was at the end.
472  * While here, also skip tabs for more complete whitespace handling.
473  *
474  * SilverNexus 2018-01-21
475  */
476  cp = buf + strspn(buf, " \t");
477 
478  if (strncmp(cp, "TYPE:", 5) == 0) {
479  p = strtok(buf, ":");
480  p = strtok(NULL, ":");
481  if (mode == 1) {
482  attack_mess[mess][level].level = -1;
483  free(attack_mess[mess][level].buf1);
484  free(attack_mess[mess][level].buf2);
485  free(attack_mess[mess][level].buf3);
486  attack_mess[mess][level].buf1 = NULL;
487  attack_mess[mess][level].buf2 = NULL;
488  attack_mess[mess][level].buf3 = NULL;
489  }
490  level = 0;
491  mess = atoi(p);
492  mode = 1;
493  continue;
494  }
495  if (mode == 1) {
496  p = strtok(buf, "=");
497  attack_mess[mess][level].level = atoi(buf);
498  p = strtok(NULL, "=");
499  free(attack_mess[mess][level].buf1);
500  if (p != NULL)
501  attack_mess[mess][level].buf1 = strdup_local(p);
502  else
503  attack_mess[mess][level].buf1 = strdup_local("");
504  mode = 2;
505  continue;
506  } else if (mode == 2) {
507  p = strtok(buf, "=");
508  attack_mess[mess][level].level = atoi(buf);
509  p = strtok(NULL, "=");
510  free(attack_mess[mess][level].buf2);
511  if (p != NULL)
512  attack_mess[mess][level].buf2 = strdup_local(p);
513  else
514  attack_mess[mess][level].buf2 = strdup_local("");
515  mode = 3;
516  continue;
517  } else if (mode == 3) {
518  p = strtok(buf, "=");
519  attack_mess[mess][level].level = atoi(buf);
520  p = strtok(NULL, "=");
521  free(attack_mess[mess][level].buf3);
522  if (p != NULL)
523  attack_mess[mess][level].buf3 = strdup_local(p);
524  else
525  attack_mess[mess][level].buf3 = strdup_local("");
526  mode = 1;
527  level++;
528  total++;
529  continue;
530  }
531  }
532  LOG(llevDebug, "attackmsg %s: %d messages in %d categories\n", filename, total, mess+1);
533 }
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:140
NROFATTACKMESS
#define NROFATTACKMESS
Definition: attack.h:18
Settings::mapdir
const char * mapdir
Definition: global.h:248
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:239
Settings::emergency_y
uint16_t emergency_y
Definition: global.h:297
llevError
@ llevError
Definition: logger.h:11
assets_dump_undefined
size_t assets_dump_undefined()
Definition: assets.cpp:232
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:245
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:327
Settings::emergency_x
uint16_t emergency_x
Definition: global.h:297
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: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:240
Statistics
Definition: global.h:352
MAXATTACKMESS
#define MAXATTACKMESS
Definition: attack.h:19
Settings::ignore_assets_errors
int ignore_assets_errors
Definition: global.h:332
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:470
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:449
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:239
init_clocks
static void init_clocks(void)
Definition: init.c:423
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:128
mapdef
Definition: map.h:324
logfile
EXTERN FILE * logfile
Definition: global.h:136
TMPDIR
#define TMPDIR
Definition: config.h:480
blocks_prayer
EXTERN sstring blocks_prayer
Definition: global.h:156
delete_map
void delete_map(mapstruct *m)
Definition: map.c:1722
init_globals
void init_globals(void)
Definition: init.c:271
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:247
statistics
struct Statistics statistics
Definition: init.c:100
FREE_AND_CLEAR_STR
#define FREE_AND_CLEAR_STR(xyz)
Definition: global.h:197
Settings
Definition: global.h:238
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:296
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:192
archt::clone
object clone
Definition: object.h:474
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
load_assets
void load_assets(void)
Definition: init.c:179
init_attackmess
void init_attackmess(BufferReader *reader, const char *filename)
Definition: init.c:459
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:144
attackmess::buf3
char * buf3
Definition: attack.h:122
Settings::templatedir
const char * templatedir
Definition: global.h:251
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:1608
nrofartifacts
EXTERN long nrofartifacts
Definition: global.h:139
init_defaults
static void init_defaults(void)
Definition: init.c:360
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:117
init_library
void init_library(void)
Definition: init.c:192
Settings::tmpdir
const char * tmpdir
Definition: global.h:252
oblnk
Definition: object.h:447
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:373
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:318
BufferReader
Definition: bufferreader.c:21
write_todclock
void write_todclock(void)
Definition: init.c:406
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:239
Settings::uniquedir
const char * uniquedir
Definition: global.h:250
OutputFile
Definition: output_file.h:41
level
Definition: level.py:1
Settings::localdir
const char * localdir
Definition: global.h:246
regiondef
Definition: map.h:275