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
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
|
/*
* File: externs.h
* Summary: Fixed size 2D vector class that asserts if you do something bad.
* Written by: Linley Henzell
*
* Change History (most recent first):
*
* <3> 7/29/00 JDJ Renamed sh_x, sh_y, sh_greed, sh_type, sh_level so
* they start with shop.
* <2> 7/29/00 JDJ Switched to using bounds checked array classes.
* Made a few char arrays unsigned char arrays.
*/
#ifndef EXTERNS_H
#define EXTERNS_H
#include <queue>
#include <time.h>
#include "defines.h"
#include "enum.h"
#include "FixAry.h"
#include "message.h"
#define INFO_SIZE 200 // size of message buffers
#define ITEMNAME_SIZE 200 // size of item names/shop names/etc
#define HIGHSCORE_SIZE 800 // <= 10 Lines for long format scores
#define MAX_NUM_GODS 21
extern char info[INFO_SIZE]; // defined in acr.cc {dlb}
extern unsigned char show_green; // defined in view.cc {dlb}
// defined in mon-util.cc -- w/o this screen redraws *really* slow {dlb}
extern FixedVector<unsigned short, 1000> mcolour;
#ifdef SHORT_FILE_NAMES
const int kNameLen = 30;
const int kFileNameLen = 6;
const int kFileNameSize = 5 + kFileNameLen;
#else
#ifdef SAVE_DIR_PATH
// file name length has to be able to cover full paths -- bwross
const int kNameLen = 30;
const int kFileNameLen = 250;
const int kFileNameSize = 5 + kFileNameLen;
#else
const int kNameLen = 30;
const int kFileNameLen = 28;
const int kFileNameSize = 5 + kFileNameLen;
#endif
#endif
// Length of Path + File Name
const int kPathLen = 256;
// This value is used to mark that the current berserk is free from
// penalty (Xom's granted or from a deck of cards).
#define NO_BERSERK_PENALTY -1
struct coord_def
{
int x;
int y;
// coord_def( int x_in = 0, int y_in = 0 ) : x(x_in), y(y_in) {};
};
struct dice_def
{
int num;
int size;
dice_def( int n = 0, int s = 0 ) : num(n), size(s) {}
};
// output from direction() function:
struct dist
{
bool isValid; // valid target chosen?
bool isTarget; // target (true), or direction (false)?
bool isMe; // selected self (convenience: tx == you.x_pos,
// ty == you.y_pos)
bool isCancel; // user cancelled (usually <ESC> key)
int tx,ty; // target x,y or logical extension of beam to map edge
int dx,dy; // delta x and y if direction - always -1,0,1
// internal use - ignore
int prev_target; // previous target
};
struct bolt
{
// INPUT parameters set by caller
int range; // minimum range
int rangeMax; // maximum range
int type; // missile gfx
int colour;
int flavour;
int source_x, source_y; // beam origin
dice_def damage;
int ench_power, hit;
int target_x, target_y; // intended target
char thrower; // what kind of thing threw this?
char ex_size; // explosion radius (0==none)
int beam_source; // NON_MONSTER or monster index #
char beam_name[40];
bool isBeam; // beams? (can hits multiple targets?)
const char *aux_source; // source of KILL_MISC beams
// OUTPUT parameters (tracing, ID)
bool obviousEffect; // did an 'obvious' effect happen?
int fr_count, foe_count; // # of times a friend/foe is "hit"
int fr_power, foe_power; // total levels/hit dice affected
// INTERNAL use - should not usually be set outside of beam.cc
bool isTracer; // is this a tracer?
bool aimedAtFeet; // this was aimed at self!
bool msgGenerated; // an appropriate msg was already mpr'd
bool isExplosion; // explosion phase (as opposed to beam phase)
bool smartMonster; // tracer firer can guess at other mons. resists?
bool canSeeInvis; // tracer firer can see invisible?
bool isFriendly; // tracer firer is enslaved or pet
int foeRatio; // 100* foe ratio (see mons_should_fire())
};
struct run_check_dir
{
unsigned char grid;
char dx;
char dy;
};
struct delay_queue_item
{
int type;
int duration;
int parm1;
int parm2;
};
struct item_def
{
unsigned char base_type; // basic class (ie OBJ_WEAPON)
unsigned char sub_type; // type within that class (ie WPN_DAGGER)
short plus; // +to hit, charges, corpse mon id
short plus2; // +to dam, sub-sub type for boots and helms
long special; // special stuff
unsigned char colour; // item colour
unsigned long flags; // item statuc flags
short quantity; // number of items
short x; // x-location; for inventory items = -1
short y; // y-location; for inventory items = -1
short link; // link to next item; for inventory items = slot
};
struct player
{
char turn_is_over; // flag signaling that player has performed a timed action
unsigned char prev_targ;
char your_name[kNameLen];
unsigned char species;
char run_x;
char run_y;
FixedVector< run_check_dir, 3 > run_check; // array of grids to check
char running;
char special_wield;
char deaths_door;
char fire_shield;
double elapsed_time; // total amount of elapsed time in the game
unsigned char synch_time; // amount to wait before calling handle_time
unsigned char disease;
char max_level;
int x_pos;
int y_pos;
int hunger;
FixedVector<char, NUM_EQUIP> equip;
int hp;
int hp_max;
int base_hp; // temporary max HP loss (rotting)
int base_hp2; // base HPs from levels (and permanent loss)
int magic_points;
int max_magic_points;
int base_magic_points; // temporary max MP loss? (currently unused)
int base_magic_points2; // base MPs from levels and potions of magic
char strength;
char intel;
char dex;
char max_strength;
char max_intel;
char max_dex;
char hunger_state;
bool wield_change; // redraw weapon
unsigned long redraw_status_flags;
char redraw_hit_points;
char redraw_magic_points;
char redraw_strength;
char redraw_intelligence;
char redraw_dexterity;
char redraw_experience;
char redraw_armour_class;
char redraw_gold;
char redraw_evasion;
unsigned char hit_points_regeneration;
unsigned char magic_points_regeneration;
unsigned long experience;
int experience_level;
unsigned int gold;
int char_class;
char class_name[30];
// char speed; // now unused
int time_taken;
char shield_blocks; // number of shield blocks since last action
FixedVector< item_def, ENDOFPACK > inv;
int burden;
char burden_state;
FixedVector<unsigned char, 25> spells;
char spell_no;
unsigned char char_direction; //
unsigned char pet_target;
int your_level; // offset by one (-1 == 0, 0 == 1, etc.) for display
// durational things. Why didn't I do this for haste etc
// right from the start? Oh well.
FixedVector<int, NUM_DURATIONS> duration;
int invis;
int conf;
int paralysis;
int slow;
int haste;
int might;
int levitation;
int poison;
int rotting;
int berserker;
int exhausted; // fatigue counter for berserk
int berserk_penalty; // pelnalty for moving while berserk
FixedVector<unsigned char, 30> attribute; // see ATTRIBUTES in enum.h
char is_undead; // see UNDEAD_STATES in enum.h
std::queue< delay_queue_item > delay_queue; // pending actions
FixedVector<unsigned char, 50> skills;
FixedVector<unsigned char, 50> practise_skill;
FixedVector<unsigned int, 50> skill_points;
FixedVector<unsigned char, 50> skill_order;
int skill_cost_level;
int total_skill_points;
int exp_available;
FixedArray<unsigned char, 5, 50> item_description;
FixedVector<unsigned char, 50> unique_items;
FixedVector<unsigned char, 50> unique_creatures;
char level_type;
char where_are_you;
FixedVector<unsigned char, 30> branch_stairs;
char religion;
unsigned char piety;
unsigned char gift_timeout;
FixedVector<unsigned char, MAX_NUM_GODS> penance;
FixedVector<unsigned char, MAX_NUM_GODS> worshipped;
FixedVector<unsigned char, 100> mutation;
FixedVector<unsigned char, 100> demon_pow;
unsigned char magic_contamination;
char confusing_touch;
char sure_blade;
FixedVector<unsigned char, 50> had_book;
unsigned char betrayal;
unsigned char normal_vision; // how far the species gets to see
unsigned char current_vision; // current sight radius (cells)
unsigned char hell_exit; // which level plyr goes to on hell exit.
// This field is here even in non-WIZARD compiles, since the
// player might have been playing previously under wiz mode.
bool wizard; // true if player has entered wiz mode.
time_t birth_time; // start time of game
time_t start_time; // start time of session
long real_time; // real time played (in seconds)
long num_turns; // number of turns taken
int old_hunger; // used for hunger delta-meter (see output.cc)
// Warning: these two are quite different.
//
// The spell table is an index to a specific spell slot (you.spells).
// The ability table lists the ability (ABIL_*) which prefers that letter.
//
// In other words, the spell table contains hard links and the ability
// table contains soft links.
FixedVector<int, 52> spell_letter_table; // ref to spell by slot
FixedVector<int, 52> ability_letter_table; // ref to ability by enum
};
extern struct player you;
struct monsters
{
int type;
int hit_points;
int max_hit_points;
int hit_dice;
int armour_class; // great -- more mixed american/proper spelling
int evasion;
unsigned int speed;
unsigned int speed_increment;
unsigned char x;
unsigned char y;
unsigned char target_x;
unsigned char target_y;
FixedVector<int, 8> inv;
unsigned char attitude; // from MONS_ATTITUDE
unsigned int behaviour;
unsigned int foe;
FixedVector<unsigned int, NUM_MON_ENCHANTS> enchantment;
unsigned char flags; // bitfield of boolean flags
unsigned int number; // #heads (hydra), etc.
int foe_memory; // how long to 'remember' foe x,y
// once they go out of sight
};
struct cloud_struct
{
unsigned char x;
unsigned char y;
unsigned char type;
int decay;
};
struct shop_struct
{
unsigned char x;
unsigned char y;
unsigned char greed;
unsigned char type;
unsigned char level;
FixedVector<unsigned char, 3> keeper_name;
};
struct trap_struct
{
unsigned char x;
unsigned char y;
unsigned char type;
};
struct crawl_environment
{
unsigned char rock_colour;
unsigned char floor_colour;
FixedVector< item_def, MAX_ITEMS > item; // item list
FixedVector< monsters, MAX_MONSTERS > mons; // monster list
FixedArray< unsigned char, GXM, GYM > grid; // terrain grid
FixedArray< unsigned char, GXM, GYM > mgrid; // monster grid
FixedArray< int, GXM, GYM > igrid; // item grid
FixedArray< unsigned char, GXM, GYM > cgrid; // cloud grid
FixedArray< unsigned char, GXM, GYM > map; // discovered terrain
FixedArray< unsigned int, 19, 19> show; // view window char
FixedArray< unsigned short, 19, 19> show_col; // view window colour
FixedVector< cloud_struct, MAX_CLOUDS > cloud; // cloud list
unsigned char cloud_no;
FixedVector< shop_struct, MAX_SHOPS > shop; // shop list
FixedVector< trap_struct, MAX_TRAPS > trap; // trap list
FixedVector< int, 20 > mons_alloc;
int trap_known;
double elapsed_time; // used during level load
};
extern struct crawl_environment env;
struct ghost_struct
{
char name[20];
FixedVector< short, NUM_GHOST_VALUES > values;
};
extern struct ghost_struct ghost;
extern void (*viewwindow) (char, bool);
struct system_environment
{
char *crawl_name;
char *crawl_pizza;
char *crawl_rc;
char *crawl_dir;
char *home; // only used by MULTIUSER systems
bool board_with_nail; // Easter Egg silliness
};
extern system_environment SysEnv;
struct game_options
{
long autopickups; // items to autopickup
bool verbose_dump; // make character dumps contain more detail
bool colour_map; // add colour to the map
bool clean_map; // remove unseen clouds/monsters
bool show_uncursed; // label known uncursed items as "uncursed"
bool always_greet; // display greeting message when reloading
bool easy_open; // open doors with movement
bool easy_armour; // allow auto-removing of armour
bool easy_butcher; // open doors with movement
int easy_confirm; // make yesno() confirming easier
int easy_quit_item_prompts; // make item prompts quitable on space
int colour[16]; // macro fg colours to other colours
int background; // select default background colour
int channels[NUM_MESSAGE_CHANNELS]; // msg channel colouring
int weapon; // auto-choose weapon for character
int chaos_knight; // choice of god for Chaos Knights (Xom/Makleb)
int death_knight; // choice of god/necromancy for Death Knights
int priest; // choice of god for priests (Zin/Yred)
bool random_pick; // randomly generate character
int hp_warning; // percentage hp for danger warning
int hp_attention; // percentage hp for danger attention
char race; // preselected race
char cls; // preselected class
bool terse_hand; // use terse description for wielded item
bool delay_message_clear; // avoid clearing messages each turn
unsigned int friend_brand; // Attribute for branding friendly monsters
bool no_dark_brand; // Attribute for branding friendly monsters
int fire_items_start; // index of first item for fire command
FixedVector<int, NUM_FIRE_TYPES> fire_order; // order for 'f' command
bool auto_list; // automatically jump to appropriate item lists
bool flush_input[NUM_FLUSH_REASONS]; // when to flush input buff
bool lowercase_invocations; // prefer lowercase invocations
#ifdef CURSES
int num_colours; // used for setting up colour table (8 or 16)
#endif
#ifdef WIZARD
int wiz_mode; // yes, no, never in wiz mode to start
#endif
// internal use only:
int sc_entries; // # of score entries
int sc_format; // Format for score entries
};
extern game_options Options;
struct tagHeader
{
short tagID;
long offset;
};
struct scorefile_entry
{
char version;
char release;
long points;
char name[kNameLen];
long uid; // for multiuser systems
char race;
char cls;
char race_class_name[5]; // overrides race & cls if non-null
char lvl; // player level.
char best_skill; // best skill #
char best_skill_lvl; // best skill level
int death_type;
int death_source; // 0 or monster TYPE
int mon_num; // sigh...
char death_source_name[40]; // overrides death_source
char auxkilldata[ITEMNAME_SIZE]; // weapon wielded, spell cast, etc
char dlvl; // dungeon level (relative)
char level_type; // what kind of level died on..
char branch; // dungeon branch
int final_hp; // actual current HPs (probably <= 0)
int final_max_hp; // net HPs after rot
int final_max_max_hp; // gross HPs before rot
int damage; // damage of final attack
int str; // final str (useful for nickname)
int intel; // final int
int dex; // final dex (useful for nickname)
int god; // god
int piety; // piety
int penance; // penance
char wiz_mode; // character used wiz mode
time_t birth_time; // start time of character
time_t death_time; // end time of character
long real_time; // real playing time in seconds
long num_turns; // number of turns taken
int num_diff_runes; // number of rune types in inventory
int num_runes; // total number of runes in inventory
};
#endif // EXTERNS_H
|