Crossfire Server, Trunk
init.cpp
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 #include "global.h"
20 
21 #include <stdlib.h>
22 #include <string.h>
23 
24 #include "object.h"
25 #include "output_file.h"
26 
27 #include "assets.h"
28 #include "AssetsManager.h"
29 
31 const char *const resist_save[NROFATTACKS] = {
32  "physical ", "magic ", "fire ", "electricity ", "cold ", "confusion ", "acid ",
33  "drain ", "weaponmagic ", "ghosthit ", "poison ", "slow ", "paralyze ",
34  "turn_undead ", "fear ", "cancellation ", "deplete ", "death ", "chaos ",
35  "counterspell ", "godpower ", "holyword ", "blind ", "internal ", "life_stealing ",
36  "disease "
37 };
38 
40 const char *const attacktype_desc[NROFATTACKS] = {
41  "physical", "magic", "fire", "electricity", "cold", "confusion", "acid",
42  "drain", "weapon magic", "ghost hit", "poison", "slow", "paralyze",
43  "turn undead", "fear", "cancellation", "deplete", "death", "chaos",
44  "counterspell", "god power", "holy word", "blind", "internal", "life stealing",
45  "disease"
46 };
47 
49 const char *const resist_plus[NROFATTACKS] = {
50  "armour", "resist magic", "resist fire", "resist electricity", "resist cold",
51  "resist confusion", "resist acid", "resist drain",
52  "resist weaponmagic", "resist ghosthit", "resist poison", "resist slow",
53  "resist paralyzation", "resist turn undead", "resist fear",
54  "resist cancellation", "resist depletion", "resist death", "resist chaos",
55  "resist counterspell", "resist god power", "resist holy word",
56  "resist blindness", "resist internal", "resist life stealing",
57  "resist diseases"
58 };
59 
61 const char *const resist_color[NROFATTACKS] = {
62  "#FF15CD", "#930C76", "red", "blue", "#2CFFFF", NULL, NULL, NULL, NULL, NULL, "green", NULL, NULL,
63  NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
64 };
65 
70 const char *const change_resist_msg[NROFATTACKS] = {
71  "physical", "magic", "fire", "electricity", "cold", "confusion", "acid",
72  "draining", "weapon magic", "ghosts", "poison", "slow", "paralyze",
73  "turn undead", "fear", "cancellation", "depletion", "death attacks", "chaos",
74  "counterspell", "god power", "holy word", "blinding attacks", "internal",
75  "life stealing", "disease"
76 };
77 
79 
82  { AT_PHYSICAL, 0 },
83  { AT_PHYSICAL, 0 }, /*face = explosion*/
84  { AT_PHYSICAL, 0 },
85  { AT_MAGIC, 1 },
86  { AT_MAGIC, 1 }, /* face = last-burnout */
87  { AT_MAGIC, 1 },
88  { AT_FIRE, 2 },
89  { AT_FIRE, 2 }, /* face = fire.... */
90  { AT_FIRE, 2 },
91  { AT_ELECTRICITY, 3 },
92  { AT_ELECTRICITY, 3 }, /* ball_lightning */
93  { AT_ELECTRICITY, 3 },
94  { AT_COLD, 4 },
95  { AT_COLD, 4 }, /* face=icestorm*/
96  { AT_COLD, 4 },
97  { AT_CONFUSION, 5 },
98  { AT_POISON, 7 },
99  { AT_POISON, 7 }, /* face = acid sphere. generator */
100  { AT_POISON, 7 }, /* poisoncloud face */
101  { AT_SLOW, 8 },
102  { AT_PARALYZE, 9 },
103  { AT_FEAR, 10 }
104 };
105 
108 std::vector<region *> all_regions;
114 FILE *logfile;
115 int exiting;
123 long ob_count;
124 
125 const char *undead_name; /* Used in hit_player() in main.c */
128 std::vector<materialtype_t *> materials;
129 
130 static void init_environ(void);
131 static void init_defaults(void);
132 static void init_dynamic(void);
133 static void init_clocks(void);
134 
135 /*
136  * Default values for settings.
137  * Anything with non-zero defaults in include/global.h must be set here.
138  */
139 struct Settings settings = {
140  .logfilename = nullptr,
141  .csport = CSPORT,
142  .debug = llevInfo,
143  .log_callback = nullptr,
144  .dumpvalues = 0,
145  .dumparg = nullptr,
146  .confdir = CONFDIR,
147  .datadir = DATADIR,
148  .localdir = LOCALDIR,
149  .playerdir = PLAYERDIR,
150  .mapdir = MAPDIR,
151  .regions = REGIONS,
152  .uniquedir = UNIQUE_DIR,
153  .templatedir = TEMPLATE_DIR,
154  .tmpdir = TMPDIR,
155  .stat_loss_on_death = STAT_LOSS_ON_DEATH,
156  .pk_luck_penalty = PK_LUCK_PENALTY,
157  .permanent_exp_ratio = PERMANENT_EXPERIENCE_RATIO,
158  .death_penalty_ratio = DEATH_PENALTY_RATIO,
159  .death_penalty_level = DEATH_PENALTY_LEVEL,
160  .balanced_stat_loss = BALANCED_STAT_LOSS,
161  .not_permadeth = NOT_PERMADETH,
162  .simple_exp = SIMPLE_EXP,
163  .reset_loc_time = RESET_LOCATION_TIME,
164  .set_title = SET_TITLE,
165  .resurrection = RESURRECTION,
166  .search_items = SEARCH_ITEMS,
167  .spell_encumbrance = SPELL_ENCUMBRANCE,
168  .spell_failure_effects = SPELL_FAILURE_EFFECTS,
169  .casting_time = CASTING_TIME,
170  .real_wiz = REAL_WIZ,
171  .recycle_tmp_maps = RECYCLE_TMP_MAPS,
172  .always_show_hp = ALWAYS_SHOW_HP,
173  .spellpoint_level_depend = SPELLPOINT_LEVEL_DEPEND,
174  .set_friendly_fire = SET_FRIENDLY_FIRE,
175  .who_format = { 0 },
176  .who_wiz_format = { 0 },
177  .motd = MOTD,
178  .rules = "rules",
179  .news = "news",
180  .meta_on = false,
181  .meta_server = { 0 },
182  .meta_host = { 0 },
183  .meta_port = 0,
184  .meta_comment = { 0 },
185  .worldmapstartx = 0,
186  .worldmapstarty = 0,
187  .worldmaptilesx = 0,
188  .worldmaptilesy = 0,
189  .worldmaptilesizex = 0,
190  .worldmaptilesizey = 0,
191  .fastclock = 0,
192  .emergency_mapname = nullptr,
193  .emergency_x = EMERGENCY_X,
194  .emergency_y = EMERGENCY_Y,
195  .max_level = 0,
196  .item_power_factor = 1.0,
197  /* Armor enchantment stuff */
198  .armor_max_enchant = ARMOR_MAX_ENCHANT,
199  .armor_weight_reduction = ARMOR_WEIGHT_REDUCTION,
200  .armor_weight_linear = ARMOR_WEIGHT_LINEAR,
201  .armor_speed_improvement = ARMOR_SPEED_IMPROVEMENT,
202  .armor_speed_linear = ARMOR_SPEED_LINEAR,
203  .no_player_stealing = 1,
204  .create_home_portals = 0,
205  .personalized_blessings = 1,
206  .pk_max_experience = 5000000,
207  .pk_max_experience_percent = 10,
208  .allow_denied_spells_writing = 0,
209  .allow_broken_converters = 0,
210  .log_timestamp = 0,
211  .log_timestamp_format = nullptr,
212  .starting_stat_min = 3,
213  .starting_stat_max = 18,
214  .starting_stat_points = 85,
215  .roll_stat_points = 115,
216  .max_stat = 0, /* max_stat - will be loaded from stats file */
217  .special_break_map = 1, /* 1 for historical reasons */
218  .disabled_plugins = { },
219  .ignore_plugin_compatibility = 0,
220  .account_block_create = 0,
221  .account_trusted_host = nullptr,
222  .crypt_mode = 0,
223  .min_name = 0,
224  .hooks_count = 0,
225  .hooks_filename = { nullptr },
226  .hooks = { nullptr },
227  .ignore_assets_errors = 0,
228  .assets_tracker = nullptr,
229  .fatal_hook = nullptr,
230  .stat_file = nullptr,
231 };
232 
234 
240 const char *const spellpathnames[NRSPELLPATHS] = {
241  "Protection",
242  "Fire",
243  "Frost",
244  "Electricity",
245  "Missiles",
246  "Self",
247  "Summoning",
248  "Abjuration",
249  "Restoration",
250  "Detonation",
251  "Mind",
252  "Creation",
253  "Teleportation",
254  "Information",
255  "Transmutation",
256  "Transferrence",
257  "Turning",
258  "Wounding",
259  "Death",
260  "Light"
261 };
262 
263 
275 static void init_emergency_mappath(void) {
276  char filename[MAX_BUF], tmpbuf[MAX_BUF];
277  FILE *fp;
278  int online = 0;
279 
281 
282  /* If this file doesn't exist, not a big deal */
283  snprintf(filename, sizeof(filename), "%s/%s/.emergency", settings.datadir, settings.mapdir);
284  fp = fopen(filename, "r");
285  if (fp != NULL) {
286  while (fgets(tmpbuf, MAX_BUF-1, fp)) {
287  if (tmpbuf[0] == '#')
288  continue; /* ignore comments */
289 
290  if (online == 0) {
291  tmpbuf[strlen(tmpbuf)-1] = 0; /* kill newline */
294  } else if (online == 1) {
295  settings.emergency_x = atoi(tmpbuf);
296  } else if (online == 2) {
297  settings.emergency_y = atoi(tmpbuf);
298  }
299  online++;
300  if (online > 2)
301  break;
302  }
303  fclose(fp);
304  if (online <= 2)
305  LOG(llevError, "Online read partial data from %s\n", filename);
306  LOG(llevDebug, "emergency map set to %s (%d, %d)\n",
309  }
310 }
311 
312 void load_assets(void) {
314  assets_end_load();
315 }
316 
324 void init_library(void) {
325  init_environ();
326  init_hash_table();
327  init_globals();
328  init_stats(); /* Needs to be fairly early, since the loader will check
329  * against the settings.max_stat value */
330 
331  for (int mess = 0; mess < MAXATTACKMESS; mess++) {
332  for (int level = 0; level < MAXATTACKMESS; level++) {
333  attack_mess[mess][level].level = -1;
334  attack_mess[mess][level].buf1 = NULL;
335  attack_mess[mess][level].buf2 = NULL;
336  attack_mess[mess][level].buf3 = NULL;
337  }
338  }
339 
340  assets_init();
341  i18n_init();
342  init_objects();
343  init_block();
344 
345  load_assets();
346 
347  init_clocks();
349  init_experience();
350 
351  if (getManager()->dumpUndefined() > 0 && !settings.ignore_assets_errors) {
352  LOG(llevError, "Assets errors, please fix and restart.\n");
354  }
355 
356  init_dynamic();
357 }
358 
364 static void init_environ(void) {
365  char *cp;
366 
367  cp = getenv("CROSSFIRE_LIBDIR");
368  if (cp)
369  settings.datadir = cp;
370  cp = getenv("CROSSFIRE_LOCALDIR");
371  if (cp)
372  settings.localdir = cp;
373  cp = getenv("CROSSFIRE_PLAYERDIR");
374  if (cp)
375  settings.playerdir = cp;
376  cp = getenv("CROSSFIRE_MAPDIR");
377  if (cp)
378  settings.mapdir = cp;
379  cp = getenv("CROSSFIRE_UNIQUEDIR");
380  if (cp)
381  settings.uniquedir = cp;
382  cp = getenv("CROSSFIRE_TEMPLATEDIR");
383  if (cp)
384  settings.templatedir = cp;
385  cp = getenv("CROSSFIRE_TMPDIR");
386  if (cp)
387  settings.tmpdir = cp;
388 }
389 
396 void init_globals(void) {
397  memset(&statistics, 0, sizeof(struct Statistics));
398 
399  /* Log to stderr by default. */
400  logfile = stderr;
401 
402  /* Try to open the log file specified on the command-line. */
403  if (settings.logfilename != NULL) {
404  logfile = fopen(settings.logfilename, "a");
405 
406  /* If writable, set buffer mode to per-line. */
407  if (logfile != NULL) {
408  setvbuf(logfile, NULL, _IOLBF, 0);
409  } else {
410  logfile = stderr;
411 
412  LOG(llevError, "Could not open '%s' for logging.\n",
414  }
415  }
416 
417  exiting = 0;
418  first_player = NULL;
419  first_map = NULL;
420  first_artifactlist = NULL;
421  *first_map_ext_path = 0;
422  nrofartifacts = 0;
423  nrofallowedstr = 0;
424  undead_name = add_string("undead");
425  blocks_prayer = add_string("blocks_prayer");
427  init_defaults();
428 }
429 
440 void free_globals(void) {
441  int msg, attack;
442 
445  for (msg = 0; msg < NROFATTACKMESS; msg++)
446  for (attack = 0; attack < MAXATTACKMESS; attack++) {
447  free(attack_mess[msg][attack].buf1);
448  free(attack_mess[msg][attack].buf2);
449  free(attack_mess[msg][attack].buf3);
450  }
451 
453 
455  free_experience();
456 
457  for (auto region : all_regions) {
463  }
464  all_regions.clear();
465 
466  assets_free();
467 }
468 
473 static void init_defaults(void) {
474  nroferrors = 0;
475 }
476 
486 static void init_dynamic(void) {
488  if (!at) {
489  LOG(llevError, "You need a archetype for a legacy map, with type %d and subtype %d\n", MAP, MAP_TYPE_LEGACY);
491  }
492  if (EXIT_PATH(&at->clone)) {
493  mapstruct *first;
494 
496  first = ready_map_name(first_map_path, 0);
497  if (!first) {
498  LOG(llevError, "Initial map %s can't be found! Please ensure maps are correctly installed.\n", first_map_path);
499  LOG(llevError, "Unable to continue without initial map.\n");
501  }
502  delete_map(first);
503  } else {
504  LOG(llevError, "Legacy map must have a 'slaying' field!\n");
506  }
507 
509  LOG(llevError, "Can not find object of type MAP subtype MAP_TYPE_DEFAULT.\n");
510  LOG(llevError, "Are the archetype files up to date? Can not continue.\n");
512  }
513 }
514 
519 void write_todclock(void) {
520  char filename[MAX_BUF];
521  FILE *fp;
522  OutputFile of;
523 
524  snprintf(filename, sizeof(filename), "%s/clockdata", settings.localdir);
525  fp = of_open(&of, filename);
526  if (fp == NULL)
527  return;
528  fprintf(fp, "%lu", todtick);
529  of_close(&of);
530 }
531 
536 static void init_clocks(void) {
537  char filename[MAX_BUF];
538  FILE *fp;
539  static int has_been_done = 0;
540 
541  if (has_been_done)
542  return;
543  else
544  has_been_done = 1;
545 
546  snprintf(filename, sizeof(filename), "%s/clockdata", settings.localdir);
547  fp = fopen(filename, "r");
548  if (fp == NULL) {
549  LOG(llevError, "Can't open %s.\n", filename);
550  todtick = 0;
551  write_todclock();
552  return;
553  }
554  /* Read TOD and default to 0 on failure. */
555  if (fscanf(fp, "%lu", &todtick) == 1) {
556  LOG(llevDebug, "clockdata: todtick is %lu\n", todtick);
557  fclose(fp);
558  } else {
559  LOG(llevError, "Couldn't parse todtick, using default value 0\n");
560  todtick = 0;
561  fclose(fp);
562  write_todclock();
563  }
564 }
565 
572 void init_attackmess(BufferReader *reader, const char *filename) {
573  char *buf;
574  char *cp, *p;
575  int mess = -1, level;
576  int mode = 0, total = 0;
577 
578  level = 0;
579  while ((buf = bufferreader_next_line(reader)) != NULL) {
580  if (*buf == '#' || *buf == '\0')
581  continue;
582  /*
583  * Skip blanks -- strspn is slightly faster than a loop w/ optimization on
584  * Also, note we go from the beginning of the line again, since cp was at the end.
585  * While here, also skip tabs for more complete whitespace handling.
586  *
587  * SilverNexus 2018-01-21
588  */
589  cp = buf + strspn(buf, " \t");
590 
591  if (strncmp(cp, "TYPE:", 5) == 0) {
592  p = strtok(buf, ":");
593  p = strtok(NULL, ":");
594  if (mode == 1) {
595  attack_mess[mess][level].level = -1;
596  free(attack_mess[mess][level].buf1);
597  free(attack_mess[mess][level].buf2);
598  free(attack_mess[mess][level].buf3);
599  attack_mess[mess][level].buf1 = NULL;
600  attack_mess[mess][level].buf2 = NULL;
601  attack_mess[mess][level].buf3 = NULL;
602  }
603  level = 0;
604  mess = atoi(p);
605  mode = 1;
606  continue;
607  }
608  if (mode == 1) {
609  p = strtok(buf, "=");
610  attack_mess[mess][level].level = atoi(buf);
611  p = strtok(NULL, "=");
612  free(attack_mess[mess][level].buf1);
613  if (p != NULL)
614  attack_mess[mess][level].buf1 = strdup_local(p);
615  else
616  attack_mess[mess][level].buf1 = strdup_local("");
617  mode = 2;
618  continue;
619  } else if (mode == 2) {
620  p = strtok(buf, "=");
621  attack_mess[mess][level].level = atoi(buf);
622  p = strtok(NULL, "=");
623  free(attack_mess[mess][level].buf2);
624  if (p != NULL)
625  attack_mess[mess][level].buf2 = strdup_local(p);
626  else
627  attack_mess[mess][level].buf2 = strdup_local("");
628  mode = 3;
629  continue;
630  } else if (mode == 3) {
631  p = strtok(buf, "=");
632  attack_mess[mess][level].level = atoi(buf);
633  p = strtok(NULL, "=");
634  free(attack_mess[mess][level].buf3);
635  if (p != NULL)
636  attack_mess[mess][level].buf3 = strdup_local(p);
637  else
638  attack_mess[mess][level].buf3 = strdup_local("");
639  mode = 1;
640  level++;
641  total++;
642  continue;
643  }
644  }
645  LOG(llevDebug, "attackmsg %s: %d messages in %d categories\n", filename, total, mess+1);
646 }
init_globals
void init_globals(void)
Definition: init.cpp:396
init_objects
void init_objects(void)
Definition: object.cpp:327
init_dynamic
static void init_dynamic(void)
Definition: init.cpp:486
NROFATTACKMESS
#define NROFATTACKMESS
Definition: attack.h:18
Settings::mapdir
const char * mapdir
Definition: global.h:251
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
nrofartifacts
long nrofartifacts
Definition: init.cpp:116
first_player
player * first_player
Definition: init.cpp:106
settings
struct Settings settings
Definition: init.cpp:139
MAP
@ MAP
Definition: object.h:130
AT_POISON
#define AT_POISON
Definition: attack.h:86
AT_MAGIC
#define AT_MAGIC
Definition: attack.h:77
Settings::emergency_y
uint16_t emergency_y
Definition: global.h:300
statistics
struct Statistics statistics
Definition: init.cpp:233
llevError
@ llevError
Definition: logger.h:11
init_emergency_mappath
static void init_emergency_mappath(void)
Definition: init.cpp:275
LOG
void LOG(LogLevel logLevel, const char *format,...)
Definition: logger.cpp:58
of_close
int of_close(OutputFile *of)
Definition: output_file.cpp:61
of_open
FILE * of_open(OutputFile *of, const char *fname)
Definition: output_file.cpp:30
player
Definition: player.h:105
strdup_local
#define strdup_local
Definition: compat.h:29
EMERGENCY_Y
#define EMERGENCY_Y
Definition: config.h:509
ready_map_name
mapstruct * ready_map_name(const char *name, int flags)
Definition: map.cpp:1768
AT_ELECTRICITY
#define AT_ELECTRICITY
Definition: attack.h:79
first_map_path
char first_map_path[MAX_BUF]
Definition: init.cpp:120
AssetsManager.h
spellpathnames
const char *const spellpathnames[NRSPELLPATHS]
Definition: init.cpp:240
first_map_ext_path
char first_map_ext_path[MAX_BUF]
Definition: init.cpp:121
Settings::datadir
const char * datadir
Definition: global.h:248
AT_PHYSICAL
#define AT_PHYSICAL
Definition: attack.h:76
todtick
unsigned long todtick
Definition: time.cpp:38
EXIT_PATH
#define EXIT_PATH(xyz)
Definition: define.h:439
init_attackmess
void init_attackmess(BufferReader *reader, const char *filename)
Definition: init.cpp:572
MAPDIR
#define MAPDIR
Definition: config.h:515
MOTD
#define MOTD
Definition: config.h:448
UNIQUE_DIR
#define UNIQUE_DIR
Definition: config.h:496
mail_login.total
total
Definition: mail_login.py:30
attackmess_t::buf1
char * buf1
Definition: attack.h:120
init_clocks
static void init_clocks(void)
Definition: init.cpp:536
Settings::emergency_x
uint16_t emergency_x
Definition: global.h:300
SEE_LAST_ERROR
@ SEE_LAST_ERROR
Definition: define.h:52
region::name
char * name
Definition: map.h:273
SIMPLE_EXP
#define SIMPLE_EXP
Definition: config.h:154
clear_friendly_list
void clear_friendly_list(void)
Definition: friend.cpp:134
NROFATTACKS
#define NROFATTACKS
Definition: attack.h:17
npc_dialog.filename
filename
Definition: npc_dialog.py:99
assets_free
void assets_free()
Definition: assets.cpp:72
Statistics
Definition: global.h:362
materials
std::vector< materialtype_t * > materials
Definition: init.cpp:128
MAXATTACKMESS
#define MAXATTACKMESS
Definition: attack.h:19
Settings::ignore_assets_errors
int ignore_assets_errors
Definition: global.h:335
SET_TITLE
#define SET_TITLE
Definition: config.h:153
buf
StringBuffer * buf
Definition: readable.cpp:1565
getManager
AssetsManager * getManager()
Definition: assets.cpp:305
REGIONS
#define REGIONS
Definition: config.h:517
init_stats
void init_stats()
Definition: living.cpp:2591
i18n_init
void i18n_init(void)
Definition: languages.cpp:130
region::longname
char * longname
Definition: map.h:279
DEATH_PENALTY_RATIO
#define DEATH_PENALTY_RATIO
Definition: config.h:151
RESURRECTION
#define RESURRECTION
Definition: config.h:161
write_todclock
void write_todclock(void)
Definition: init.cpp:519
nrofallowedstr
long nrofallowedstr
Definition: init.cpp:117
RECYCLE_TMP_MAPS
#define RECYCLE_TMP_MAPS
Definition: config.h:159
init_block
void init_block(void)
Definition: los.cpp:106
AT_COLD
#define AT_COLD
Definition: attack.h:80
ARMOR_SPEED_IMPROVEMENT
#define ARMOR_SPEED_IMPROVEMENT
Definition: config.h:171
init_environ
static void init_environ(void)
Definition: init.cpp:364
SPELLPOINT_LEVEL_DEPEND
#define SPELLPOINT_LEVEL_DEPEND
Definition: config.h:155
PK_LUCK_PENALTY
#define PK_LUCK_PENALTY
Definition: config.h:165
archetype::clone
object clone
Definition: object.h:487
Settings::logfilename
const char * logfilename
Definition: global.h:241
add_string
sstring add_string(const char *str)
Definition: shstr.cpp:124
first_map
mapstruct * first_map
Definition: init.cpp:107
region::msg
char * msg
Definition: map.h:281
trying_emergency_save
long trying_emergency_save
Definition: init.cpp:111
region::jailmap
char * jailmap
Definition: map.h:285
change_resist_msg
const char *const change_resist_msg[NROFATTACKS]
Definition: init.cpp:70
navar-midane_pickup.msg
list msg
Definition: navar-midane_pickup.py:13
SEARCH_ITEMS
#define SEARCH_ITEMS
Definition: config.h:162
nroferrors
long nroferrors
Definition: init.cpp:112
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
artifactlist
Definition: artifact.h:24
resist_save
const char *const resist_save[NROFATTACKS]
Definition: init.cpp:31
archetype
Definition: object.h:483
logfile
FILE * logfile
Definition: init.cpp:114
delete_map
void delete_map(mapstruct *m)
Definition: map.cpp:1696
TMPDIR
#define TMPDIR
Definition: config.h:488
ATTACKS
Chaos_Attacks ATTACKS[22]
Definition: init.cpp:81
ASSETS_ALL
#define ASSETS_ALL
Definition: assets.h:32
undead_name
const char * undead_name
Definition: init.cpp:125
fatal
void fatal(enum fatal_error err)
Definition: utils.cpp:590
resist_plus
const char *const resist_plus[NROFATTACKS]
Definition: init.cpp:49
MAX_BUF
#define MAX_BUF
Definition: define.h:35
CASTING_TIME
#define CASTING_TIME
Definition: config.h:166
strlcpy
size_t strlcpy(char *dst, const char *src, size_t size)
Definition: porting.cpp:222
Settings::playerdir
const char * playerdir
Definition: global.h:250
FREE_AND_CLEAR_STR
#define FREE_AND_CLEAR_STR(xyz)
Definition: global.h:198
load_assets
void load_assets(void)
Definition: init.cpp:312
ob_count
long ob_count
Definition: init.cpp:123
attack_mess
attackmess_t attack_mess[NROFATTACKMESS][MAXATTACKMESS]
Definition: init.cpp:78
Settings
Definition: global.h:240
region
Definition: map.h:272
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:299
llevInfo
@ llevInfo
Definition: logger.h:12
all_regions
std::vector< region * > all_regions
Definition: init.cpp:108
REAL_WIZ
#define REAL_WIZ
Definition: config.h:158
SET_FRIENDLY_FIRE
#define SET_FRIENDLY_FIRE
Definition: config.h:167
init_library
void init_library(void)
Definition: init.cpp:324
attacktype_desc
const char *const attacktype_desc[NROFATTACKS]
Definition: init.cpp:40
FREE_AND_CLEAR
#define FREE_AND_CLEAR(xyz)
Definition: global.h:193
AT_SLOW
#define AT_SLOW
Definition: attack.h:87
init_hash_table
void init_hash_table(void)
Definition: shstr.cpp:55
mapstruct
Definition: map.h:313
ALWAYS_SHOW_HP
#define ALWAYS_SHOW_HP
Definition: config.h:160
sstring
const typedef char * sstring
Definition: sstring.h:2
free_experience
void free_experience(void)
Definition: exp.cpp:263
TEMPLATE_DIR
#define TEMPLATE_DIR
Definition: config.h:516
init_experience
void init_experience(void)
Definition: exp.cpp:167
RESET_LOCATION_TIME
#define RESET_LOCATION_TIME
Definition: config.h:629
attackmess_t::buf2
char * buf2
Definition: attack.h:121
free_globals
void free_globals(void)
Definition: init.cpp:440
assets.h
SPELL_FAILURE_EFFECTS
#define SPELL_FAILURE_EFFECTS
Definition: config.h:157
init_defaults
static void init_defaults(void)
Definition: init.cpp:473
BALANCED_STAT_LOSS
#define BALANCED_STAT_LOSS
Definition: config.h:149
resist_color
const char *const resist_color[NROFATTACKS]
Definition: init.cpp:61
PERMANENT_EXPERIENCE_RATIO
#define PERMANENT_EXPERIENCE_RATIO
Definition: config.h:150
level
int level
Definition: readable.cpp:1563
first_artifactlist
artifactlist * first_artifactlist
Definition: init.cpp:109
attackmess_t::level
int level
Definition: attack.h:119
MAP_TYPE_DEFAULT
#define MAP_TYPE_DEFAULT
Definition: map.h:58
AT_FEAR
#define AT_FEAR
Definition: attack.h:90
EMERGENCY_X
#define EMERGENCY_X
Definition: config.h:508
get_archetype_by_type_subtype
archetype * get_archetype_by_type_subtype(int type, int subtype)
Definition: arch.cpp:99
Settings::templatedir
const char * templatedir
Definition: global.h:254
PLAYERDIR
#define PLAYERDIR
Definition: config.h:549
empty_archetype
archetype * empty_archetype
Definition: init.cpp:119
AT_CONFUSION
#define AT_CONFUSION
Definition: attack.h:81
assets_collect
void assets_collect(const char *datadir, int what)
Definition: assets.cpp:113
Chaos_Attacks
Definition: attack.h:125
blocks_prayer
sstring blocks_prayer
Definition: init.cpp:126
Settings::tmpdir
const char * tmpdir
Definition: global.h:255
AT_PARALYZE
#define AT_PARALYZE
Definition: attack.h:88
EMERGENCY_MAPPATH
#define EMERGENCY_MAPPATH
Definition: config.h:506
CSPORT
#define CSPORT
Definition: config.h:362
BufferReader
Definition: bufferreader.cpp:21
assets_init
void assets_init()
Definition: assets.cpp:65
exiting
int exiting
Definition: init.cpp:115
attackmess_t
Definition: attack.h:118
object.h
NOT_PERMADETH
#define NOT_PERMADETH
Definition: config.h:163
llevDebug
@ llevDebug
Definition: logger.h:13
NRSPELLPATHS
#define NRSPELLPATHS
Definition: spells.h:40
assets_end_load
void assets_end_load()
Definition: assets.cpp:227
Settings::uniquedir
const char * uniquedir
Definition: global.h:253
OutputFile
Definition: output_file.h:41
bufferreader_next_line
char * bufferreader_next_line(BufferReader *br)
Definition: bufferreader.cpp:102
AT_FIRE
#define AT_FIRE
Definition: attack.h:78
level
Definition: level.py:1
attackmess_t::buf3
char * buf3
Definition: attack.h:122
Settings::localdir
const char * localdir
Definition: global.h:249