Make room for more unrands.
[crawl:crawl.git] / crawl-ref / source / defines.h
1 /**
2  * @file
3  * @brief Various definess used by Crawl.
4  *
5  * A variety of miscellaneous constant values are found here.
6 **/
7
8 #ifndef DEFINES_H
9 #define DEFINES_H
10
11 // Minimum terminal size allowed.
12 #define MIN_COLS  79
13 #define MIN_LINES 24
14
15 #define NUM_MONSTER_SPELL_SLOTS  6
16
17 #define ESCAPE '\x1b'           // most ansi-friendly way I can think of defining this.
18
19 // there's got to be a better way...
20 #ifndef _LIBUNIX_IMPLEMENTATION
21 #else
22     #ifndef TRUE
23      #define TRUE 1
24     #endif
25
26     #ifndef FALSE
27      #define FALSE 0
28     #endif
29 #endif
30
31 typedef uint32_t ucs_t;
32
33 // length of a single zot defence cycle
34 #define ZOTDEF_CYCLE_LENGTH 100
35
36 // Waiting time before monsters arrive
37 #define ZOTDEF_CYCLE_INTERVAL 50
38
39 // peak size of a random spawn
40 #define ZOTDEF_SPAWN_SIZE 1
41
42 // Extra power to assign to a boss monster
43 #define ZOTDEF_BOSS_EXTRA_POWER 5
44
45 // number of waves to pass between bosses generated with a rune
46 #define ZOTDEF_RUNE_FREQ 7
47
48 // max size of inventory array {dlb}:
49 #define ENDOFPACK 52
50
51 // Max ghosts on a level.
52 const int MAX_GHOSTS = 10;
53
54 #define NON_ENTITY 27000
55
56 enum extra_monster_index_type
57 {
58     MAX_MONSTERS = 700,                  // max size of monster array {dlb}
59     ANON_FRIENDLY_MONSTER = MAX_MONSTERS,// unknown/dead ally, for actor blaming
60     YOU_FAULTLESS,                       // full xp but no penalty (reflection)
61     NON_MONSTER  = NON_ENTITY,           // no monster
62
63     MHITNOT = NON_MONSTER,
64     MHITYOU,
65
66     ZOT_TRAP_MISCAST,
67     HELL_EFFECT_MISCAST,
68     WIELD_MISCAST,
69     MELEE_MISCAST,
70     MISC_MISCAST,
71 };
72
73 // number of monster attack specs
74 #define MAX_NUM_ATTACKS 4
75
76 // size of Pan monster sets. Also used for wave data in ZotDef.
77 #define PAN_MONS_ALLOC 10
78 #define MAX_MONS_ALLOC 20
79
80 #define MAX_SUBTYPES   60
81
82 // max size of item list {dlb}:
83 #define MAX_ITEMS 2000
84 // non-item -- (ITEMS + 1) {dlb}
85 #define NON_ITEM  NON_ENTITY
86
87 #if NON_ITEM <= MAX_ITEMS
88 #error NON_ITEM must be > MAX_ITEMS
89 #endif
90
91 // max size of cloud array {dlb}:
92 #define MAX_CLOUDS 600
93
94 // empty cloud -- (CLOUDS + 1) {dlb}:
95 #define EMPTY_CLOUD NON_ENTITY
96
97 #if EMPTY_CLOUD <= MAX_CLOUDS
98 #error EMPTY_CLOUD must be > MAX_CLOUDS
99 #endif
100
101 // max x-bound for level generation {dlb}
102 #define GXM 80
103 // max y-bound for level generation {dlb}
104 #define GYM 70
105
106 const int INFINITE_DISTANCE = 30000;
107 // max distance on a map
108 #define GDM 105
109
110 // this is the size of the border around the playing area (see in_bounds())
111 #define BOUNDARY_BORDER         1
112
113 // This is the border that must be left around the map. I'm not sure why it's
114 // necessary, beyond hysterical raisins.
115 const int MAPGEN_BORDER    = 2;
116
117 const int LABYRINTH_BORDER = 4;
118
119 // Now some defines about the actual play area:
120 // Note: these boundaries are exclusive for the zone the player can move/dig,
121 // and are inclusive for the area that we display on the map.
122 // Note: that the right (bottom) boundary is one smaller here.
123 #define X_BOUND_1               (-1 + BOUNDARY_BORDER)
124 #define X_BOUND_2               (GXM - BOUNDARY_BORDER)
125 #define X_WIDTH                 (X_BOUND_2 - X_BOUND_1 + 1)
126
127 #define Y_BOUND_1               (-1 + BOUNDARY_BORDER)
128 #define Y_BOUND_2               (GYM - BOUNDARY_BORDER)
129 #define Y_WIDTH                 (Y_BOUND_2 - Y_BOUND_1 + 1)
130
131 // maximal LOS radius
132 #define LOS_RADIUS 8
133 // maximal LOS radius squared, for comparison with distance()
134 #define LOS_RADIUS_SQ (LOS_RADIUS * LOS_RADIUS + 1)
135 // maximal horizontal or vertical LOS range:
136 //   a quadrant needs to fit inside an 2D array with
137 //     0 <= x, y <= LOS_MAX_RANGE
138 #define LOS_MAX_RANGE LOS_RADIUS
139 #define ENV_SHOW_OFFSET LOS_MAX_RANGE
140 #define ENV_SHOW_DIAMETER (ENV_SHOW_OFFSET * 2 + 1)
141
142 #define VIEW_BASE_WIDTH 33      // FIXME: never used
143 #define VIEW_MIN_WIDTH  ENV_SHOW_DIAMETER
144 #define VIEW_MIN_HEIGHT ENV_SHOW_DIAMETER
145 #define MSG_MIN_HEIGHT  5
146
147 // max traps per level
148 #define MAX_TRAPS         400
149
150 // max shops per level
151 #define MAX_SHOPS         64
152
153 // max shops randomly generated in a level.
154 // changing this affects the total number of shops in a game
155 #define MAX_RANDOM_SHOPS  5
156
157 #define MAX_BRANCH_DEPTH 27
158
159 // This value is used to make test_hit checks always succeed
160 #define AUTOMATIC_HIT           1500
161
162 // Yes, I know we have 32-bit ints now.
163 const int DEBUG_COOKIE = 32767;
164
165 const int MAX_SKILL_LEVEL = 27;
166 const int MAX_EXP_TOTAL = 8999999;
167 const int HIGH_EXP_POOL = 20000;
168 const int EXERCISE_QUEUE_SIZE = 100;
169
170 const int MIN_HIT_MISS_PERCENTAGE = 5;
171
172 // grids that monsters can see
173 const int MONSTER_LOS_RANGE = LOS_RADIUS;
174
175 // Maximum charge level for rods
176 const int MAX_ROD_CHARGE  = 17;
177 const int ROD_CHARGE_MULT = 100;
178
179 const int BASELINE_DELAY  = 10;
180 const int GOURMAND_MAX            = 200 * BASELINE_DELAY;
181 const int GOURMAND_NUTRITION_BASE = 10  * BASELINE_DELAY;
182
183 const int CHUNK_BASE_NUTRITION    = 1000;
184
185 const int ICEMAIL_MAX  = 10;
186 const int ICEMAIL_TIME = 300 * BASELINE_DELAY;
187
188 // The maximum number of abilities any god can have
189 #define MAX_GOD_ABILITIES               5
190
191 // This value is used to mark immune levels of MR
192 const int MAG_IMMUNE = 5000;
193
194 // This is the damage amount used to signal insta-death
195 const int INSTANT_DEATH = -9999;
196
197 // Maximum enchantment on weapons/armour/secondary armours
198 // This is the same as for ammunition.
199 const int MAX_WPN_ENCHANT = 9;
200
201 // Note: use armour_max_enchant(item) to get the correct limit for item
202 const int MAX_ARM_ENCHANT = 8;
203 const int MAX_SEC_ENCHANT = 2;
204
205 // The time (in aut) for a staff of power to decay 1 mp.
206 #define POWER_DECAY 50
207
208 const int MAX_KNOWN_SPELLS = 21;
209
210 const int INVALID_ABSDEPTH = -1000;
211
212 //#define DEBUG_MIMIC
213 #ifdef DEBUG_MIMIC
214 // Missing stairs are replaced in fixup_branch_stairs, but replacing
215 // too many breaks interlevel connectivity, so we don't use a chance of 1.
216   #define FEATURE_MIMIC_CHANCE 2
217   #define ITEM_MIMIC_CHANCE    1
218 #else
219   #define FEATURE_MIMIC_CHANCE 100
220   #define ITEM_MIMIC_CHANCE    1000
221 #endif
222
223 const int ANTITRAIN_PENALTY = 2;
224
225 #define TORNADO_RADIUS 6
226
227 #define NUMBER_OF_RUNES_NEEDED    3
228
229 // Size of unique_items in player class
230 #define MAX_UNRANDARTS 150
231
232 // Haste/slow boost.
233 #define haste_mul(x) div_rand_round((x) * 3, 2)
234 #define haste_div(x) div_rand_round((x) * 2, 3)
235 #define berserk_mul(x) div_rand_round((x) * 3, 2)
236 #define berserk_div(x) div_rand_round((x) * 2, 3)
237
238 #define MAX_MONSTER_HP 10000
239 #define DJ_MP_RATE 2
240
241 // some shortcuts:
242 #define menv   env.mons
243 #define mitm   env.item
244 #define grd    env.grid
245 #define mgrd   env.mgrid
246 #define igrd   env.igrid
247
248 // colors, such pretty colors ...
249 // The order is important (IRGB bit patterns).
250 enum COLORS
251 {
252     BLACK,
253     BLUE,
254     GREEN,
255     CYAN,
256     RED,
257     MAGENTA,
258     BROWN,
259     LIGHTGRAY,
260     LIGHTGREY = LIGHTGRAY,
261     DARKGRAY,
262     DARKGREY = DARKGRAY,
263     LIGHTBLUE,
264     LIGHTGREEN,
265     LIGHTCYAN,
266     LIGHTRED,
267     LIGHTMAGENTA,
268     YELLOW,
269     WHITE,
270     MAX_TERM_COLOUR
271 };
272
273 // Many, MANY places currently hard-code this to 8 bits, but we need to
274 // expand it. Please use colour_t in new code.
275 typedef uint8_t colour_t;
276
277 // Colour options... these are used as bit flags along with the colour
278 // value in the low byte.
279
280 // This is used to signal curses (which has seven base colours) to
281 // try to get a brighter version using recommisioned attribute flags.
282 #define COLFLAG_CURSES_BRIGHTEN          0x0080
283
284 #define COLFLAG_FRIENDLY_MONSTER         0x0100
285 #define COLFLAG_NEUTRAL_MONSTER          0x0200
286 #define COLFLAG_WILLSTAB                 0x0400
287 #define COLFLAG_MAYSTAB                  0x0800
288 #define COLFLAG_ITEM_HEAP                0x1000
289 #define COLFLAG_FEATURE_ITEM             0x2000
290 #define COLFLAG_TRAP_ITEM                0x4000
291 #define COLFLAG_REVERSE                  0x8000
292 #define COLFLAG_MASK                     0xFF00
293
294 enum CHAR_ATTRIBUTES
295 {
296     CHATTR_NORMAL,          /* 0 */
297     CHATTR_STANDOUT,
298     CHATTR_BOLD,
299     CHATTR_BLINK,
300     CHATTR_UNDERLINE,
301     CHATTR_REVERSE,         /* 5 */
302     CHATTR_DIM,
303     CHATTR_HILITE,
304
305     CHATTR_ATTRMASK = 0xF,  /* 15 (well, obviously) */
306
307     CHATTR_COLMASK = 0xF00, // Mask with this to get extra colour info.
308 };
309
310 #define PDESCS(colour) (colour)
311 #define PDESCQ(qualifier, colour) (((qualifier) * PDC_NCOLOURS) + (colour))
312
313 #define PCOLOUR(desc) ((desc) % PDC_NCOLOURS)
314 #define PQUAL(desc)   ((desc) / PDC_NCOLOURS)
315
316 // Convert capital letters into mystic numbers representing
317 // CTRL sequences.  This is a macro because a lot of the type
318 // it wants to be used in case labels.
319 #define CONTROL(xxx)          ((xxx) - 'A' + 1)
320
321 #define ARRAYSZ(x) (sizeof(x) / sizeof(x[0]))
322 #define RANDOM_ELEMENT(x) (x[random2(ARRAYSZ(x))])
323
324 const char * const MONSTER_HIT_DICE = "monster-hit-dice";
325 const char * const MONSTER_NUMBER = "monster-number";
326 const char * const CORPSE_NEVER_DECAYS = "corpse-no-decay";
327 const char * const MONSTER_MID = "monster-mid";
328
329 // Synthetic keys:
330 #define KEY_MACRO_MORE_PROTECT -10
331 #define KEY_MACRO_DISABLE_MORE -1
332 #define KEY_MACRO_ENABLE_MORE  -2
333
334 // cgotoxy regions
335 enum GotoRegion
336 {
337     GOTO_CRT,  // cprintf > crt
338     GOTO_MSG,  // cprintf > message
339     GOTO_STAT, // cprintf > character status
340     GOTO_DNGN, // cprintf > dungeon screen
341     GOTO_MLIST,// cprintf > monster list
342 };
343
344 // Mouse modes (for tiles)
345 enum mouse_mode
346 {
347     MOUSE_MODE_NORMAL,
348     MOUSE_MODE_COMMAND,
349     MOUSE_MODE_TARGET,
350     MOUSE_MODE_TARGET_DIR,
351     MOUSE_MODE_TARGET_PATH,
352     MOUSE_MODE_MORE,
353     MOUSE_MODE_MACRO,
354     MOUSE_MODE_PROMPT,
355     MOUSE_MODE_YESNO,
356     MOUSE_MODE_MAX,
357 };
358
359 #define PI 3.14159265359f
360
361 #endif