File: global.h

package info (click to toggle)
crossfire 1.75.0-9
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 24,168 kB
  • sloc: ansic: 83,169; sh: 4,659; perl: 1,736; lex: 1,443; makefile: 1,199; python: 43
file content (372 lines) | stat: -rw-r--r-- 15,558 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
/**
 * @file
 * Global type definitions and header inclusions.
 */

#ifndef GLOBAL_H
#define GLOBAL_H

/**
 * Define external variables. This is used in an ugly hack where EXTERN is
 * re-defined to "" in 'init.c' in order to resolve missing symbols. Do not
 * use this macro in new code.
 */
#ifndef EXTERN
#define EXTERN extern
#endif

/* Include this first, because it lets us know what we are missing */
#ifdef WIN32 /* ---win32 exclude this, config comes from VC ide */
#include "win32.h"
#else
#include "autoconf.h"
/* socklen_t is defined in this file on some systems, and that type is
 * used in newserver.h, which is used in all other files
 */
#include <sys/socket.h>
#endif

#ifdef HAVE_LIBDMALLOC
#include <dmalloc.h>
#endif

#include <inttypes.h>
#include <stdbool.h>
#include <stdio.h>
#include <unistd.h>
#include "compat.h"

/** Strings that should be manipulated through add_string() and free_string(). */
typedef const char *sstring;

#include "config.h"
#include "define.h"
#include "logger.h"
#include "shared/newclient.h"

/* This blob, in this order, is needed to actually define maps */
#include "face.h"
/* Include the basic defines from spells.h */
#include "attack.h" /* needs to be before material.h */
#include "material.h"
#include "living.h"
#include "object.h"
#include "map.h"
#include "tod.h"

#include "skills.h"

/* This defines the Account_Char structure which is used in the socket */
#include "account_char.h"

/* Pull in the socket structure - used in the player structure */
#include "newserver.h"

#include "party.h"

/* Pull in the player structure */
#include "player.h"

/* pull in treasure structure */
#include "treasure.h"

#include "commands.h"

/* pull in book structures */
#include "book.h"

/* ob_methods and ob_types subsystem */
#include "ob_methods.h"
#include "ob_types.h"

/*
 * So far only used when dealing with artifacts.
 * (now used by alchemy and other code too. Nov 95 b.t).
 */
typedef struct linked_char {
    const char *name;
    struct linked_char *next;
} linked_char;


/* Pull in artifacts */
#include "artifact.h"

/* Now for gods */
#include "god.h"

/* Now for races */
#include "race.h"

/* Now for recipe/alchemy */
#include "recipe.h"

/* Now for spells */
#include "spells.h"

/*****************************************************************************
 * GLOBAL VARIABLES:                                                         *
 *****************************************************************************/

/**
 * @defgroup first_xxx Beginnings of linked lists.
 */
/*@{*/
EXTERN player *first_player;                /**< First player. */
EXTERN mapstruct *first_map;                /**< First map. */
EXTERN region *first_region;                /**< First region. */
EXTERN treasurelist *first_treasurelist;    /**< First treasure. */
EXTERN artifactlist *first_artifactlist;    /**< First artifact. */
EXTERN archetype *first_archetype;          /**< First archetype. */
EXTERN objectlink *first_friendly_object;   /**< Objects monsters will go after. */
EXTERN godlink *first_god;                  /**< God list. */
EXTERN racelink *first_race;                /**< Race list. */
/*@}*/

/*
 * Variables set by different flags (see init.c):
 */

EXTERN long init_done;             /**< Ignores signals until init_done is true. */
EXTERN long trying_emergency_save; /**< True when emergency_save() is reached. */
EXTERN long nroferrors;            /**< If it exceeds MAX_ERRORS, call fatal() */

extern uint32_t pticks;              /**< Used by various function to determine
                                    * how often to save the character */
/**
 * @defgroup GLOBAL_VARIABLES Misc global variables.
 */
/*@{*/
EXTERN FILE *logfile;                    /**< Used by server/daemon.c */
extern int reopen_logfile;
EXTERN int exiting;                      /**< True if the game is about to exit. */
EXTERN long nroftreasures;               /**< Only used in malloc_info(). */
EXTERN long nrofartifacts;               /**< Only used in malloc_info(). */
EXTERN long nrofallowedstr;              /**< Only used in malloc_info(). */

EXTERN archetype *empty_archetype;       /**< Nice to have fast access to it. */
EXTERN archetype *map_archeytpe;
EXTERN char first_map_path[MAX_BUF];     /**< The start-level. */
EXTERN char first_map_ext_path[MAX_BUF]; /**< Path used for per-race start maps. */

EXTERN long ob_count;
/*@}*/

/*
 * Used in treasure.c
 */
EXTERN archetype *ring_arch, *amulet_arch, *crown_arch;
EXTERN const char *undead_name; /* Used in hit_player() in main.c */

EXTERN Animations *animations;
EXTERN int num_animations, bmaps_checksum;

/* Rotate right from bsd sum. This is used in various places for checksumming */
#define ROTATE_RIGHT(c) if ((c)&01) (c) = ((c)>>1)+0x80000000; else (c) >>= 1;

#define SET_ANIMATION(ob, newanim) { ob->face = (ob->temp_animation ? ob->temp_animation : ob->animation)->faces[newanim]; }
#define GET_ANIMATION(ob, anim) ((ob->temp_animation ? ob->temp_animation : ob->animation)->faces[anim])
#define GET_ANIM(ob) (ob->temp_animation ? ob->temp_animation : ob->animation)
#define GET_ANIM_ID(ob) (ob->temp_animation ? ob->temp_animation->num : (ob->animation ? ob->animation->num : 0))
/* NUM_ANIMATIONS returns the number of animations allocated.  The last
 * usuable animation will be NUM_ANIMATIONS-1 (for example, if an object
 * has 8 animations, NUM_ANIMATIONS will return 8, but the values will
 * range from 0 through 7.
 */
#define NUM_ANIMATIONS(ob) ((ob->temp_animation ? ob->temp_animation : ob->animation)->num_animations)
#define NUM_FACINGS(ob) ((ob->temp_animation ? ob->temp_animation : ob->animation)->facings)

extern short freearr_x[SIZEOFFREE], freearr_y[SIZEOFFREE];
extern int maxfree[SIZEOFFREE], freedir[SIZEOFFREE];
extern int rightof_x[9], rightof_y[9];
extern int leftof_x[9], leftof_y[9];

extern const Face *blank_face, *empty_face;
extern const Face *smooth_face;

extern uint32_t max_time; /* loop time */
extern socket_struct *init_sockets;

#include "stringbuffer.h"
#include "libproto.h"
#include "sockproto.h"
#include "typesproto.h"

/**
 * Free the pointer and then set it to NULL.
 * This is generally done as a safety, and having this macro
 * makes the code a bit cleaner when doing so.
 */
#define FREE_AND_CLEAR(xyz) { free(xyz); xyz = NULL; }
/**
 * Release the shared string, and set it to NULL.
 * Must not be NULL.
 */
#define FREE_AND_CLEAR_STR(xyz) { free_string(xyz); xyz = NULL; }

/**
 * Release the shared string if not NULL, and make it a reference to nv.
 */
#define FREE_AND_COPY(sv, nv) { if (sv) free_string(sv); sv = add_string(nv); }

#ifndef WIN32 /* ---win32 we define this stuff in win32.h */
#if HAVE_DIRENT_H
# include <dirent.h>
# define NAMLEN(dirent) strlen((dirent)->d_name)
#else
# define dirent direct
# define NAMLEN(dirent) (dirent)->d_namlen
# if HAVE_SYS_NDIR_H
#  include <sys/ndir.h>
# endif
# if HAVE_SYS_DIR_H
#  include <sys/dir.h>
# endif
# if HAVE_NDIR_H
#  include <ndir.h>
# endif
#endif
#endif

/**
 * Convert saved total experience into permanent experience
 */
#define PERM_EXP(exptotal) (exptotal * settings.permanent_exp_ratio / 100 )
#define MAX_TOTAL_EXPERIENCE (settings.permanent_exp_ratio ? (MAX_EXPERIENCE * 100 / settings.permanent_exp_ratio) : 0)

/**
 * Server settings.
 */
typedef struct Settings {
    const char *logfilename;    /**< Logfile to use */
    uint16_t  csport;             /**< Port for new client/server */
    LogLevel debug;             /**< Default debugging level */
    uint8_t   dumpvalues;         /**< Set to dump various values/tables */
    const char *dumparg;        /**< Additional argument for some dump functions */
    const char *confdir;        /**< Configuration files */
    const char *datadir;        /**< Read only data files */
    const char *localdir;       /**< Read/write data files */
    const char *playerdir;      /**< Where the player files are */
    const char *mapdir;         /**< Where the map files are */
    const char *archetypes;     /**< Name of the archetypes file - libdir is prepended */
    const char *regions;        /**< Name of the regions file - libdir is prepended */
    const char *treasures;      /**< Location of the treasures file. */
    const char *uniquedir;      /**< Directory for the unique items */
    const char *templatedir;    /**< Directory for the template map */
    const char *tmpdir;         /**< Directory to use for temporary files */
    uint8_t   stat_loss_on_death; /**< If true, chars lose a random stat when they die */
    int16_t  pk_luck_penalty;    /**< Amount by which player luck is reduced if they PK */
    uint8_t   permanent_exp_ratio; /**< How much exp should be 'permenant' and unable to be lost*/
    uint8_t   death_penalty_ratio; /**< Hhow much exp should be lost at death */
    uint8_t   death_penalty_level; /**< How many levels worth of exp may be lost on one death */
    uint8_t   balanced_stat_loss; /**< If true, Death stat depletion based on level etc */
    uint8_t   not_permadeth;      /**< If true, death is non-permament */
    uint8_t   simple_exp;         /**< If true, use the simple experience system */
    int     reset_loc_time;     /**< Number of seconds to put player back at home */
    uint8_t   set_title;          /**< Players can set thier title */
    uint8_t   resurrection;       /**< Ressurection possible w/ permadeth on */
    uint8_t   search_items;       /**< Search_items command */
    uint8_t   spell_encumbrance;  /**< Encumbrance effects spells */
    uint8_t   spell_failure_effects; /**< Nasty backlash to spell failures */
    uint8_t   casting_time;       /**< It takes awhile to cast a spell */
    uint8_t   real_wiz;           /**< Use mud-like wizards */
    uint8_t   recycle_tmp_maps;   /**< Re-use tmp maps. */
    uint8_t   always_show_hp;     /**< 'probe' spell HP bars for all living things (0, 1, or 2) */
    uint8_t   spellpoint_level_depend; /**< Spell costs go up with level */
    uint16_t  set_friendly_fire;       /**< Percent of damage done by peaceful player vs player damage */
    char    who_format[MAX_BUF];     /**< The format that the who command should use */
    char    who_wiz_format[MAX_BUF]; /**< The format that the who command should use when called by a dm*/
    char    motd[MAX_BUF];      /**< Name of the motd file */
    const char *rules;          /**< Name of rules file*/
    const char *news;           /**< Name of news file*/
    char    dm_mail[MAX_BUF];   /**< DM's Email address */

    /* The meta_ is information for the metaserver.  These are set in
     * the lib/settings file.
     */
    unsigned int meta_on:1;         /**< True if we should send updates */
    char    meta_server[MAX_BUF];   /**< Hostname/ip addr of the metaserver */
    char    meta_host[MAX_BUF];     /**< Hostname of this host */
    uint16_t  meta_port;              /**< Port number to use for updates */
    char    meta_comment[MAX_BUF];  /**< Comment we send to the metaserver */

    uint32_t  worldmapstartx;         /**< Starting x tile for the worldmap */
    uint32_t  worldmapstarty;         /**< Starting y tile for the worldmap */
    uint32_t  worldmaptilesx;         /**< Number of tiles wide the worldmap is */
    uint32_t  worldmaptilesy;         /**< Number of tiles high the worldmap is */
    uint32_t  worldmaptilesizex;      /**< Number of squares wide in a wm tile */
    uint32_t  worldmaptilesizey;      /**< Number of squares high in a wm tile */
    uint8_t   fastclock;              /**< If true, clock goes warp 9 */

    char    *emergency_mapname;       /**< Map to return players to in emergency */
    uint16_t  emergency_x, emergency_y; /**< Coordinates to use on that map */

    int16_t  max_level;                /**< This is read out of exp_table */
    float   item_power_factor;        /**< See note in setings file */

    int     armor_max_enchant;        /**< Maximum number of times an armor can be enchanted */
    int     armor_weight_reduction;   /**< Weight reduction per enchantment */
    uint8_t   armor_weight_linear;      /**< If 1, weight reduction is linear, else exponantiel */
    int     armor_speed_improvement;  /**< Speed improvement */
    uint8_t   armor_speed_linear;       /**< If 1, speed improvement is linear, else exponantiel */
    uint8_t   no_player_stealing;       /**< If 1, can not steal from other players */
    uint8_t   create_home_portals;      /**< If 1, can create portals in unique maps (apartments) */
    uint8_t   personalized_blessings;   /**< If 1, blessed weapons get an owner and a willpower value */
    int64_t  pk_max_experience;        /**< Maximum experience one can get for PKing. Ignore if negative. */
    int     pk_max_experience_percent; /**< Percentage of experience of victim the killer gets. */
    int     allow_denied_spells_writing; /**< If set, players can write spells they can't cast. */
    int     allow_broken_converters;  /**< If set, converters will work even if price of generated item is higher
                                          * than the price of converted items. */
    int     log_timestamp;            /**< If set, log will comport a timestamp. */
    char    *log_timestamp_format;    /**< Format for timestap, if log_timestamp is set. */
    uint8_t   starting_stat_min;        /**< Minimum value of a starting stat */
    uint8_t   starting_stat_max;        /**< Maximum value of a starting stat */
    uint8_t   starting_stat_points;     /**< How many stat points character starts with */
    uint8_t   roll_stat_points;         /**< How many stat points legacy (rolled) chars start with */
    uint8_t   max_stat;                 /**< Maximum stat value - 255 should be sufficient */
    uint8_t   special_break_map;        /**< If set, then submaps in random maps can break the walls. */
    linked_char *disabled_plugins;    /**< List of disabled plugins, 'All' means all. */
    uint8_t   ignore_plugin_compatibility;    /**< If set, don't check plugin version. */
    uint8_t   account_block_create;           /** Block account creation for untrusted hosts. */
    char*   account_trusted_host;     /**< Trusted host for account creation, defaults to 127.0.0.1. */
    uint8_t crypt_mode;               /**< 0 for legacy behavior, 1 for always Traditional */
    uint8_t min_name;                         /**< Minimum characters for an account or player name */
} Settings;

/**
 * Server settings.
 */
extern Settings settings;

/**
 * This is used for various performance tracking statistics,
 * or just how often certain events are done.  It is much better
 * to use a common structure then variables about.
 * Note that since these are often counters, I'm using uint64s -
 * this may be overkill, but it is just a couple extra bytes.
 * This is initialized/declared in common/init.c.  Note that if
 * it only contains integer values, very easy to initialize/clear it -
 * just a memset.
 */
typedef struct Statistics {
    uint64_t spell_merges;        /**< Number of spell merges done */
    uint64_t spell_hash_full;     /**< Number of times spell hash was full*/
    uint64_t spell_suppressions;  /**< Number of times ok_to_put_more() returned FALSE*/
} Statistics;

/**
 * Merged spell statistics.
 */
extern Statistics statistics;

/**
 * @defgroup SCRIPT_FIX_xxx For plugin events
 * GROS: Those are used by plugin events (argument fixthem).
 */
#define SCRIPT_FIX_ACTIVATOR 2
#define SCRIPT_FIX_ALL 1
#define SCRIPT_FIX_NOTHING 0

#include "plugin.h"

#endif /* GLOBAL_H */