comparison urogue/rogue.h @ 256:c495a4f288c6

Import UltraRogue from the Roguelike Restoration Project (r1490)
author John "Elwin" Edwards
date Tue, 31 Jan 2017 19:56:04 -0500
parents
children c4b12d2d1dcd
comparison
equal deleted inserted replaced
253:d9badb9c0179 256:c495a4f288c6
1 /*
2 rogue.h - A very large header file
3
4 UltraRogue: The Ultimate Adventure in the Dungeons of Doom
5 Copyright (C) 1984, 1991, 1997 Herb Chong
6 All rights reserved.
7
8 Based on "Advanced Rogue"
9 Copyright (C) 1984, 1985 Michael Morgan, Ken Dalka
10 All rights reserved.
11
12 Based on "Rogue: Exploring the Dungeons of Doom"
13 Copyright (C) 1980, 1981 Michael Toy, Ken Arnold and Glenn Wichman
14 All rights reserved.
15
16 See the file LICENSE.TXT for full copyright and licensing information.
17 */
18
19 #include <signal.h>
20 #include <stdio.h>
21 #include <stdarg.h>
22
23 #ifndef LINT
24 #include <curses.h>
25 #else
26 #include "lint-curses.h"
27 #endif
28
29 #define SHOTPENALTY 2 /* In line of sight of missile */
30 #define DOORPENALTY 1 /* Moving out of current room */
31
32 /* Maximum number of different things */
33 #define MAXROOMS 9 /* max rooms per normal level */
34 #define MAXDOORS 4 /* max doors to a room */
35 #define MAXOBJ 6 /* max number of items to find on a level */
36 #define MAXTREAS 30 /* max number monsters/treasure in treasure room */
37 #define MAXTRAPS 80 /* max traps per level */
38 #define MAXTRPTRY 16 /* max attempts/level allowed for setting traps */
39 #define MAXPURCH 8 /* max purchases per trading post visit */
40 #define NUMMONST (sizeof(monsters) / sizeof(struct monster) - 2)
41 #define NUMSUMMON 48 /* number of creatures that can summon hero */
42 #define NLEVMONS 8 /* number of new monsters per level */
43 #define LINELEN 512 /* characters in a buffer */
44
45 /* The character types */
46 #define C_FIGHTER 0
47 #define C_PALADIN 1
48 #define C_RANGER 2
49 #define C_CLERIC 3
50 #define C_DRUID 4
51 #define C_MAGICIAN 5
52 #define C_ILLUSION 6
53 #define C_THIEF 7
54 #define C_ASSASIN 8
55 #define C_NINJA 9
56 #define C_MONSTER 10
57 #define C_NOTSET 11 /* Must not be a value from above */
58
59 /* used for ring stuff */
60 #define LEFT_1 0
61 #define LEFT_2 1
62 #define LEFT_3 2
63 #define LEFT_4 3
64 #define LEFT_5 4
65 #define RIGHT_1 5
66 #define RIGHT_2 6
67 #define RIGHT_3 7
68 #define RIGHT_4 8
69 #define RIGHT_5 9
70
71 /* All the fun defines */
72 #define next(ptr) ((ptr)?(ptr->l_next):NULL)
73 #define prev(ptr) ((ptr)?(ptr->l_prev):NULL)
74 #define identifier(ptr) (ptr->o_ident)
75 #define winat(y,x) ( (char) \
76 ((mvwinch(mw,y,x) == ' ') ? mvwinch(stdscr,y,x) : winch(mw)) )
77
78 #define debug if (wizard && wiz_verbose) msg
79 #define verify(b) if (b) verify_function(__FILE__, __LINE__);
80 #define DISTANCE(c1, c2) ( ((c2).x - (c1).x)*((c2).x - (c1).x) + \
81 ((c2).y - (c1).y)*((c2).y - (c1).y) )
82
83 #define xyDISTANCE(y1, x1, y2, x2) ((x2 - x1)*(x2 - x1) + (y2 - y1)*(y2 - y1))
84 #define OBJPTR(what) ((*what).data.obj)
85 #define THINGPTR(what) ((*what).data.th)
86 #define ce(a, b) ((a).x == (b).x && (a).y == (b).y)
87 #define hero player.t_pos
88 #define pstats player.t_stats
89 #define max_stats player.maxstats
90 #define pack player.t_pack
91 #define attach(a, b) _attach(&a, b)
92 #define detach(a, b) _detach(&a, b)
93 #define free_list(a) _free_list(&a)
94 #ifndef max
95 #define max(a, b) ((a) > (b) ? (a) : (b))
96 #define min(a, b) ((a) < (b) ? (a) : (b))
97 #endif
98 #define GOLDCALC (rnd(50 + 30 * level) + 2)
99 #define o_charges o_ac
100 #define mi_wght mi_worth
101
102 /* Things that appear on the screens */
103 #define WALL ' '
104 #define PASSAGE '#'
105 #define DOOR '+'
106 #define FLOOR '.'
107 #define VPLAYER '@'
108 #define IPLAYER '_'
109 #define POST '^'
110 #define LAIR '('
111 #define RUSTTRAP ';'
112 #define TRAPDOOR '>'
113 #define ARROWTRAP '{'
114 #define SLEEPTRAP '$'
115 #define BEARTRAP '}'
116 #define TELTRAP '~'
117 #define DARTTRAP '`'
118 #define POOL '"'
119 #define MAZETRAP '\\'
120 #define FIRETRAP '<'
121 #define POISONTRAP '['
122 #define ARTIFACT ','
123 #define SECRETDOOR '&'
124 #define STAIRS '%'
125 #define GOLD '*'
126 #define POTION '!'
127 #define SCROLL '?'
128 #define MAGIC '$'
129 #define BMAGIC '>' /* Blessed magic */
130 #define CMAGIC '<' /* Cursed magic */
131 #define FOOD ':'
132 #define WEAPON ')'
133 #define ARMOR ']'
134 #define RING '='
135 #define STICK '/'
136
137 /* Various constants */
138 #define HOLDTIME 2
139 #define BEARTIME 3
140 #define SLEEPTIME 4
141 #define FREEZETIME 6
142 #define STINKTIME 6
143 #define CHILLTIME (roll(2, 4))
144 #define STONETIME 8
145 #define SICKTIME 10
146 #define CLRDURATION 15
147 #define HUHDURATION 20
148 #define SMELLTIME 20
149 #define HEROTIME 20
150 #define HEALTIME 30
151 #define WANDERTIME 140
152 #define GONETIME 200
153 #define PHASEDURATION 300
154 #define SEEDURATION 850
155
156 #define STPOS 0
157 #define BEFORE 1
158 #define AFTER 2
159
160 #define MORETIME 150
161 #define HUNGERTIME 1300
162 #define STOMACHSIZE 2000
163
164 #define BOLT_LENGTH 10
165 #define MARKLEN 20
166
167 #define LINEFEED 10
168 #define CARRIAGE_RETURN 13
169 #define ESCAPE 27
170
171 /* Adjustments for save against things */
172 #define VS_POISON 0
173 #define VS_PARALYZATION 0
174 #define VS_DEATH 0
175 #define VS_PETRIFICATION 1
176 #define VS_WAND 2
177 #define VS_BREATH 3
178 #define VS_MAGIC 4
179
180 /*attributes for treasures in dungeon */
181 #define ISNORMAL 0x00000000UL /* Neither blessed nor cursed */
182 #define ISCURSED 0x00000001UL /* cursed */
183 #define ISKNOW 0x00000002UL /* has been identified */
184 #define ISPOST 0x00000004UL /* object is in a trading post */
185 #define ISMETAL 0x00000008UL /* is metallic */
186 #define ISPROT 0x00000010UL /* object is protected */
187 #define ISBLESSED 0x00000020UL /* blessed */
188 #define ISZAPPED 0x00000040UL /* weapon has been charged by dragon */
189 #define ISVORPED 0x00000080UL /* vorpalized weapon */
190 #define ISSILVER 0x00000100UL /* silver weapon */
191 #define ISPOISON 0x00000200UL /* poisoned weapon */
192 #define CANRETURN 0x00000400UL /* weapon returns if misses */
193 #define ISOWNED 0x00000800UL /* weapon returns always */
194 #define ISLOST 0x00001000UL /* weapon always disappears */
195 #define ISMISL 0x00002000UL /* missile weapon */
196 #define ISMANY 0x00004000UL /* show up in a group */
197 #define CANBURN 0x00008000UL /* burns monsters */
198 #define ISSHARP 0x00010000UL /* cutting edge */
199 #define ISTWOH 0x00020000UL /* needs two hands to wield */
200 #define ISLITTLE 0x00040000UL /* small weapon */
201 #define ISLAUNCHER 0x00080000UL /* used to throw other weapons */
202 #define TYP_MAGIC_MASK 0x0f000000UL
203 #define POT_MAGIC 0x01000000UL
204 #define SCR_MAGIC 0x02000000UL
205 #define ZAP_MAGIC 0x04000000UL
206 #define SP_WIZARD 0x10000000UL /* only wizards */
207 #define SP_ILLUSION 0x20000000UL /* only illusionists */
208 #define SP_CLERIC 0x40000000UL /* only clerics/paladins */
209 #define SP_DRUID 0x80000000UL /* only druids/rangers */
210 #define SP_MAGIC 0x30000000UL /* wizard or illusionist */
211 #define SP_PRAYER 0xc0000000UL /* cleric or druid */
212 #define SP_ALL 0xf0000000UL /* all special classes */
213 #define _TWO_ ISBLESSED /* more powerful spell */
214
215 /* Various flag bits */
216 #define ISDARK 0x00000001UL
217 #define ISGONE 0x00000002UL
218 #define ISTREAS 0x00000004UL
219 #define ISFOUND 0x00000008UL
220 #define ISTHIEFSET 0x00000010UL
221 #define WASDARK 0x00000020UL
222
223 /* struct thing t_flags (might include player) for monster attributes */
224 #define ISBLIND 0x00000001UL
225 #define ISINWALL 0x00000002UL
226 #define ISRUN 0x00000004UL
227 #define ISFLEE 0x00000008UL
228 #define ISINVIS 0x00000010UL
229 #define ISMEAN 0x00000020UL
230 #define ISGREED 0x00000040UL
231 #define CANSHOOT 0x00000080UL
232 #define ISHELD 0x00000100UL
233 #define ISHUH 0x00000200UL
234 #define ISREGEN 0x00000400UL
235 #define CANHUH 0x00000800UL
236 #define CANSEE 0x00001000UL
237 #define HASFIRE 0x00002000UL
238 #define ISSLOW 0x00004000UL
239 #define ISHASTE 0x00008000UL
240 #define ISCLEAR 0x00010000UL
241 #define CANINWALL 0x00020000UL
242 #define ISDISGUISE 0x00040000UL
243 #define CANBLINK 0x00080000UL
244 #define CANSNORE 0x00100000UL
245 #define HALFDAMAGE 0x00200000UL
246 #define CANSUCK 0x00400000UL
247 #define CANRUST 0x00800000UL
248 #define CANPOISON 0x01000000UL
249 #define CANDRAIN 0x02000000UL
250 #define ISUNIQUE 0x04000000UL
251 #define STEALGOLD 0x08000000UL
252 #define STEALMAGIC 0x10000001UL
253 #define CANDISEASE 0x10000002UL
254 #define HASDISEASE 0x10000004UL
255 #define CANSUFFOCATE 0x10000008UL
256 #define DIDSUFFOCATE 0x10000010UL
257 #define BOLTDIVIDE 0x10000020UL
258 #define BLOWDIVIDE 0x10000040UL
259 #define NOCOLD 0x10000080UL
260 #define TOUCHFEAR 0x10000100UL
261 #define BMAGICHIT 0x10000200UL
262 #define NOFIRE 0x10000400UL
263 #define NOBOLT 0x10000800UL
264 #define CARRYGOLD 0x10001000UL
265 #define CANITCH 0x10002000UL
266 #define HASITCH 0x10004000UL
267 #define DIDDRAIN 0x10008000UL
268 #define WASTURNED 0x10010000UL
269 #define CANSELL 0x10020000UL
270 #define CANBLIND 0x10040000UL
271 #define CANBBURN 0x10080000UL
272 #define ISCHARMED 0x10100000UL
273 #define CANSPEAK 0x10200000UL
274 #define CANFLY 0x10400000UL
275 #define ISFRIENDLY 0x10800000UL
276 #define CANHEAR 0x11000000UL
277 #define ISDEAF 0x12000000UL
278 #define CANSCENT 0x14000000UL
279 #define ISUNSMELL 0x18000000UL
280 #define WILLRUST 0x20000001UL
281 #define WILLROT 0x20000002UL
282 #define SUPEREAT 0x20000004UL
283 #define PERMBLIND 0x20000008UL
284 #define MAGICHIT 0x20000010UL
285 #define CANINFEST 0x20000020UL
286 #define HASINFEST 0x20000040UL
287 #define NOMOVE 0x20000080UL
288 #define CANSHRIEK 0x20000100UL
289 #define CANDRAW 0x20000200UL
290 #define CANSMELL 0x20000400UL
291 #define CANPARALYZE 0x20000800UL
292 #define CANROT 0x20001000UL
293 #define ISSCAVENGE 0x20002000UL
294 #define DOROT 0x20004000UL
295 #define CANSTINK 0x20008000UL
296 #define HASSTINK 0x20010000UL
297 #define ISSHADOW 0x20020000UL
298 #define CANCHILL 0x20040000UL
299 #define CANHUG 0x20080000UL
300 #define CANSURPRISE 0x20100000UL
301 #define CANFRIGHTEN 0x20200000UL
302 #define CANSUMMON 0x20400000UL
303 #define TOUCHSTONE 0x20800000UL
304 #define LOOKSTONE 0x21000000UL
305 #define CANHOLD 0x22000000UL
306 #define DIDHOLD 0x24000000UL
307 #define DOUBLEDRAIN 0x28000000UL
308 #define ISUNDEAD 0x30000001UL
309 #define BLESSMAP 0x30000002UL
310 #define BLESSGOLD 0x30000004UL
311 #define BLESSMONS 0x30000008UL
312 #define BLESSMAGIC 0x30000010UL
313 #define BLESSFOOD 0x30000020UL
314 #define CANBRANDOM 0x30000040UL /* Types of breath */
315 #define CANBACID 0x30000080UL
316 #define CANBFIRE 0x30000100UL
317 #define CANBBOLT 0x30000200UL
318 #define CANBGAS 0x30000400UL
319 #define CANBICE 0x30000800UL
320 #define CANBPGAS 0x30001000UL /* Paralyze gas */
321 #define CANBSGAS 0x30002000UL /* Sleeping gas */
322 #define CANBSLGAS 0x30004000UL /* Slow gas */
323 #define CANBFGAS 0x30008000UL /* Fear gas */
324 #define CANBREATHE 0x3000ffc0UL /* Can it breathe at all? */
325 #define STUMBLER 0x30010000UL
326 #define POWEREAT 0x30020000UL
327 #define ISELECTRIC 0x30040000UL
328 #define HASOXYGEN 0x30080000UL /* Doesn't need to breath air */
329 #define POWERDEXT 0x30100000UL
330 #define POWERSTR 0x30200000UL
331 #define POWERWISDOM 0x30400000UL
332 #define POWERINTEL 0x30800000UL
333 #define POWERCONST 0x31000000UL
334 #define SUPERHERO 0x32000000UL
335 #define ISUNHERO 0x34000000UL
336 #define CANCAST 0x38000000UL
337 #define CANTRAMPLE 0x40000001UL
338 #define CANSWIM 0x40000002UL
339 #define LOOKSLOW 0x40000004UL
340 #define CANWIELD 0x40000008UL
341 #define CANDARKEN 0x40000010UL
342 #define ISFAST 0x40000020UL
343 #define CANBARGAIN 0x40000040UL
344 #define NOMETAL 0x40000080UL
345 #define CANSPORE 0x40000100UL
346 #define NOSHARP 0x40000200UL
347 #define DRAINWISDOM 0x40000400UL
348 #define DRAINBRAIN 0x40000800UL
349 #define ISLARGE 0x40001000UL
350 #define ISSMALL 0x40002000UL
351 #define CANSTAB 0x40004000UL
352 #define ISFLOCK 0x40008000UL
353 #define ISSWARM 0x40010000UL
354 #define CANSTICK 0x40020000UL
355 #define CANTANGLE 0x40040000UL
356 #define DRAINMAGIC 0x40080000UL
357 #define SHOOTNEEDLE 0x40100000UL
358 #define CANZAP 0x40200000UL
359 #define HASARMOR 0x40400000UL
360 #define CANTELEPORT 0x40800000UL
361 #define ISBERSERK 0x41000000UL
362 #define ISFAMILIAR 0x42000000UL
363 #define HASFAMILIAR 0x44000000UL
364 #define SUMMONING 0x48000000UL
365 #define CANREFLECT 0x50000001UL
366 #define LOWFRIENDLY 0x50000002UL
367 #define MEDFRIENDLY 0x50000004UL
368 #define HIGHFRIENDLY 0x50000008UL
369 #define MAGICATTRACT 0x50000010UL
370 #define ISGOD 0x50000020UL
371 #define CANLIGHT 0x50000040UL
372 #define HASSHIELD 0x50000080UL
373 #define HASMSHIELD 0x50000100UL
374 #define LOWCAST 0x50000200UL
375 #define MEDCAST 0x50000400UL
376 #define HIGHCAST 0x50000800UL
377 #define WASSUMMONED 0x50001000UL
378 #define HASSUMMONED 0x50002000UL
379 #define CANTRUESEE 0x50004000UL
380
381
382 #define FLAGSHIFT 28UL
383 #define FLAGINDEX 0x0000000fL
384 #define FLAGMASK 0x0fffffffL
385
386 /* on - check if a monster flag is on */
387 #define on(th, flag) \
388 ((th).t_flags[(flag >> FLAGSHIFT) & FLAGINDEX] & (flag & FLAGMASK))
389
390 /* off - check if a monster flag is off */
391 #define off(th, flag) \
392 (!((th).t_flags[(flag >> FLAGSHIFT) & FLAGINDEX] & (flag & FLAGMASK)))
393
394 /* turn_on - turn on a monster flag */
395 #define turn_on(th, flag) \
396 ( (th).t_flags[(flag >> FLAGSHIFT) & FLAGINDEX] |= (flag & FLAGMASK))
397
398 /* turn_off - turn off a monster flag */
399 #define turn_off(th, flag) \
400 ( (th).t_flags[(flag >> FLAGSHIFT) & FLAGINDEX] &= ~(flag & FLAGMASK))
401
402 #define SAME_POS(c1,c2) ( (c1.x == c2.x) && (c1.y == c2.y) )
403
404 /* types of things */
405 /* All magic spells duplicate a potion, scroll, or stick effect */
406
407 #define TYP_POTION 0
408 #define TYP_SCROLL 1
409 #define TYP_RING 2
410 #define TYP_STICK 3
411 #define MAXMAGICTYPES 4 /* max number of items in magic class */
412 #define MAXMAGICITEMS 50 /* max number of items in magic class */
413 #define TYP_FOOD 4
414 #define TYP_WEAPON 5
415 #define TYP_ARMOR 6
416 #define TYP_ARTIFACT 7
417 #define NUMTHINGS (sizeof(things) / sizeof(struct magic_item))
418
419 /* Artifact types */
420 #define TR_PURSE 0
421 #define TR_PHIAL 1
422 #define TR_AMULET 2
423 #define TR_PALANTIR 3
424 #define TR_CROWN 4
425 #define TR_SCEPTRE 5
426 #define TR_SILMARIL 6
427 #define TR_WAND 7
428 #define MAXARTIFACT (sizeof(arts) / sizeof(struct init_artifact))
429
430 /* Artifact flags */
431 #define ISUSED 01
432 #define ISACTIVE 02
433
434 /* Potion types - add also to magic_item.c and potions.c */
435 #define P_CLEAR 0
436 #define P_GAINABIL 1
437 #define P_SEEINVIS 2
438 #define P_HEALING 3
439 #define P_MONSTDET 4
440 #define P_TREASDET 5
441 #define P_RAISELEVEL 6
442 #define P_HASTE 7
443 #define P_RESTORE 8
444 #define P_PHASE 9
445 #define P_INVIS 10
446 #define P_SMELL 11
447 #define P_HEAR 12
448 #define P_SHERO 13
449 #define P_DISGUISE 14
450 #define P_FIRERESIST 15
451 #define P_COLDRESIST 16
452 #define P_HASOXYGEN 17
453 #define P_LEVITATION 18
454 #define P_REGENERATE 19
455 #define P_SHIELD 20
456 #define P_TRUESEE 21
457 #define MAXPOTIONS 22
458
459 /* Scroll types - add also to magic_item.c and scrolls.c */
460 #define S_CONFUSE 0
461 #define S_MAP 1
462 #define S_LIGHT 2
463 #define S_HOLD 3
464 #define S_SLEEP 4
465 #define S_ENCHANT 5
466 #define S_IDENTIFY 6
467 #define S_SCARE 7
468 #define S_GFIND 8
469 #define S_SELFTELEP 9
470 #define S_CREATE 10
471 #define S_REMOVECURSE 11
472 #define S_PETRIFY 12
473 #define S_GENOCIDE 13
474 #define S_CURING 14
475 #define S_MAKEITEMEM 15
476 #define S_PROTECT 16
477 #define S_NOTHING 17
478 #define S_SILVER 18
479 #define S_OWNERSHIP 19
480 #define S_FOODDET 20
481 #define S_ELECTRIFY 21
482 #define S_CHARM 22
483 #define S_SUMMON 23
484 #define S_REFLECT 24
485 #define S_SUMFAMILIAR 25
486 #define S_FEAR 26
487 #define S_MSHIELD 27
488 #define MAXSCROLLS 28
489
490 /* Rod/Wand/Staff types - add also to magic_item.c and sticks.c */
491 #define WS_LIGHT 0
492 #define WS_HIT 1
493 #define WS_ELECT 2
494 #define WS_FIRE 3
495 #define WS_COLD 4
496 #define WS_POLYMORPH 5
497 #define WS_MISSILE 6
498 #define WS_SLOW_M 7
499 #define WS_DRAIN 8
500 #define WS_CHARGE 9
501 #define WS_MONSTELEP 10
502 #define WS_CANCEL 11
503 #define WS_CONFMON 12
504 #define WS_DISINTEGRATE 13
505 #define WS_ANTIMATTER 14
506 #define WS_PARALYZE 15
507 #define WS_XENOHEALING 16
508 #define WS_NOTHING 17
509 #define WS_INVIS 18
510 #define WS_BLAST 19
511 #define WS_WEB 20
512 #define WS_KNOCK 21
513 #define WS_CLOSE 22
514 #define MAXSTICKS 23
515
516 /* Ring types */
517 #define R_PROTECT 0
518 #define R_ADDSTR 1
519 #define R_SUSABILITY 2
520 #define R_SEARCH 3
521 #define R_SEEINVIS 4
522 #define R_ALERT 5
523 #define R_AGGR 6
524 #define R_ADDHIT 7
525 #define R_ADDDAM 8
526 #define R_REGEN 9
527 #define R_DIGEST 10
528 #define R_TELEPORT 11
529 #define R_STEALTH 12
530 #define R_ADDINTEL 13
531 #define R_ADDWISDOM 14
532 #define R_HEALTH 15
533 #define R_VREGEN 16
534 #define R_LIGHT 17
535 #define R_DELUSION 18
536 #define R_CARRYING 19
537 #define R_ADORNMENT 20
538 #define R_LEVITATION 21
539 #define R_FIRERESIST 22
540 #define R_COLDRESIST 23
541 #define R_ELECTRESIST 24
542 #define R_RESURRECT 25
543 #define R_BREATHE 26
544 #define R_FREEDOM 27
545 #define R_WIZARD 28
546 #define R_PIETY 29
547 #define R_TELCONTROL 30
548 #define R_TRUESEE 31
549 #define MAXRINGS 32
550
551 /* Weapon types */
552 #define SLING 0 /* sling */
553 #define ROCK 1 /* rocks */
554 #define BULLET 2 /* sling bullet */
555 #define BOW 3 /* short bow */
556 #define ARROW 4 /* arrow */
557 #define SILVERARROW 5 /* silver arrows */
558 #define FLAMEARROW 6 /* flaming arrows */
559 #define FOOTBOW 7 /* footbow */
560 #define FBBOLT 8 /* footbow bolt */
561 #define CROSSBOW 9 /* crossbow */
562 #define BOLT 10 /* crossbow bolt */
563
564 #define DART 11 /* darts */
565 #define DAGGER 12 /* dagger */
566 #define HAMMER 13 /* hammer */
567 #define LEUKU 14 /* leuku */
568 #define JAVELIN 15 /* javelin */
569 #define TOMAHAWK 16 /* tomahawk */
570 #define MACHETE 17 /* machete */
571 #define THROW_AXE 18 /* throwing axe */
572 #define SHORT_SPEAR 19 /* spear */
573 #define BOOMERANG 20 /* boomerangs */
574 #define LONG_SPEAR 21 /* spear */
575 #define SHURIKEN 22 /* shurikens */
576 #define MOLOTOV 23 /* molotov cocktails */
577 #define GRENADE 24 /* grenade for explosions */
578 #define CLUB 25 /* club */
579 #define PITCHFORK 26 /* pitchfork */
580 #define SHORT_SWORD 27 /* short sword */
581 #define HAND_AXE 28 /* hand axe */
582 #define PARTISAN 29 /* partisan */
583 #define GRAIN_FLAIL 30 /* grain flail */
584 #define SINGLESTICK 31 /* singlestick */
585 #define RAPIER 32 /* rapier */
586 #define SICKLE 33 /* sickle */
587 #define HATCHET 34 /* hatchet */
588 #define SCIMITAR 35 /* scimitar */
589 #define LIGHT_MACE 36 /* mace */
590 #define MORNINGSTAR 37 /* morning star */
591 #define BROAD_SWORD 38 /* broad sword */
592 #define MINER_PICK 39 /* miner's pick */
593 #define GUISARME 40 /* guisarme */
594 #define WAR_FLAIL 41 /* war flail */
595 #define CRYSKNIFE 42 /* crysknife */
596 #define BATTLE_AXE 43 /* battle axe */
597 #define CUTLASS 44 /* cutlass sword */
598 #define GLAIVE 45 /* glaive */
599 #define PERTUSKA 46 /* pertuska */
600 #define LONG_SWORD 47 /* long sword */
601 #define LANCE 48 /* lance */
602 #define RANSEUR 49 /* ranseur */
603 #define SABRE 50 /* sabre */
604 #define SPETUM 51 /* spetum */
605 #define HALBERD 52 /* halberd */
606 #define TRIDENT 53 /* trident */
607 #define WAR_PICK 54 /* war pick */
608 #define BARDICHE 55 /* bardiche */
609 #define HEAVY_MACE 56 /* mace */
610 #define SCYTHE 57 /* great scythe */
611 #define QUARTERSTAFF 58 /* quarter staff */
612 #define BAST_SWORD 59 /* bastard sword */
613 #define PIKE 60 /* pike */
614 #define TWO_FLAIL 61 /* two-handed flail */
615 #define TWO_MAUL 62 /* two-handed maul */
616 #define TWO_PICK 63 /* two-handed pick */
617 #define TWO_SWORD 64 /* two-handed sword */
618 #define CLAYMORE 65 /* claymore sword */
619 #define MAXWEAPONS (sizeof(weaps) / sizeof(struct init_weps))
620 #define NONE 100 /* no weapon */
621
622 /* Armor types */
623 #define SOFT_LEATHER 0
624 #define CUIRBOLILLI 1
625 #define HEAVY_LEATHER 2
626 #define RING_MAIL 3
627 #define STUDDED_LEATHER 4
628 #define SCALE_MAIL 5
629 #define PADDED_ARMOR 6
630 #define CHAIN_MAIL 7
631 #define BRIGANDINE 8
632 #define SPLINT_MAIL 9
633 #define BANDED_MAIL 10
634 #define GOOD_CHAIN 11
635 #define PLATE_MAIL 12
636 #define PLATE_ARMOR 13
637 #define MITHRIL 14
638 #define CRYSTAL_ARMOR 15
639 #define MAXARMORS (sizeof(armors) / sizeof(struct init_armor))
640
641 /* Food types */
642 #define FD_RATION 0
643 #define FD_FRUIT 1
644 #define FD_CRAM 2
645 #define FD_CAKES 3
646 #define FD_LEMBA 4
647 #define FD_MIRUVOR 5
648 #define MAXFOODS (sizeof(fd_data) / sizeof(struct magic_item))
649
650 /* stuff to do with encumberance */
651 #define F_OK 0 /* have plenty of food in stomach */
652 #define F_HUNGRY 1 /* player is hungry */
653 #define F_WEAK 2 /* weak from lack of food */
654 #define F_FAINT 3 /* fainting from lack of food */
655
656 /* return values for get functions */
657 #define NORM 0 /* normal exit */
658 #define QUIT 1 /* quit option setting */
659 #define MINUS 2 /* back up one option */
660
661 /* These are the types of inventory styles. */
662 #define INV_SLOW 0
663 #define INV_OVER 1
664 #define INV_CLEAR 2
665
666 /* These will eventually become enumerations */
667 #define MESSAGE TRUE
668 #define NOMESSAGE FALSE
669 #define POINTS TRUE
670 #define NOPOINTS FALSE
671 #define LOWERCASE TRUE
672 #define UPPERCASE FALSE
673 #define WANDER TRUE
674 #define NOWANDER FALSE
675 #define GRAB TRUE
676 #define NOGRAB FALSE
677 #define FAMILIAR TRUE
678 #define NOFAMILIAR FALSE
679 #define MAXSTATS TRUE
680 #define NOMAXSTATS FALSE
681 #define FORCE TRUE
682 #define NOFORCE FALSE
683 #define THROWN TRUE
684 #define NOTHROWN FALSE
685
686 /* Ways to die */
687 #define D_PETRIFY -1
688 #define D_ARROW -2
689 #define D_DART -3
690 #define D_POISON -4
691 #define D_BOLT -5
692 #define D_SUFFOCATION -6
693 #define D_POTION -7
694 #define D_INFESTATION -8
695 #define D_DROWN -9
696 #define D_FALL -10
697 #define D_FIRE -11
698 #define D_SPELLFUMBLE -12
699 #define D_DRAINLIFE -13
700 #define D_ARTIFACT -14
701 #define D_GODWRATH -15
702 #define D_CLUMSY -16
703
704 /* values for games end */
705 #define SCOREIT -1
706 #define KILLED 0
707 #define CHICKEN 1
708 #define WINNER 2
709 #define TOTAL 3
710
711 /*
712 * definitions for function step_ok: MONSTOK indicates it is OK to step on a
713 * monster -- it is only OK when stepping diagonally AROUND a monster
714 */
715
716 #define MONSTOK 1
717 #define NOMONST 2
718
719
720
721 #define good_monster(m) (on(m, ISCHARMED) || \
722 on(m, ISFRIENDLY) || \
723 on(m, ISFAMILIAR))
724
725 /* Now we define the structures and types */
726
727 /* level types */
728 typedef enum
729 {
730 NORMLEV, /* normal level */
731 POSTLEV, /* trading post level */
732 MAZELEV, /* maze level */
733 THRONE /* unique monster's throne room */
734 } LEVTYPE;
735
736 /* Help list */
737
738 struct h_list
739 {
740 char h_ch;
741 char *h_desc;
742 };
743
744 /* Coordinate data type */
745 typedef struct
746 {
747 int x;
748 int y;
749 } coord;
750
751 /* Linked list data type */
752 typedef struct linked_list
753 {
754 struct linked_list *l_next;
755 struct linked_list *l_prev;
756
757 union
758 {
759 struct object *obj;
760 struct thing *th;
761 void *l_data;
762 } data;
763
764 } linked_list;
765
766 /* Stuff about magic items */
767
768 struct magic_item
769 {
770 char *mi_name;
771 char *mi_abrev;
772 int mi_prob;
773 long mi_worth;
774 int mi_curse;
775 int mi_bless;
776 };
777
778 /* Room structure */
779 struct room
780 {
781 coord r_pos; /* Upper left corner */
782 coord r_max; /* Size of room */
783 coord r_exit[MAXDOORS]; /* Where the exits are */
784 int r_flags; /* Info about the room */
785 int r_nexits; /* Number of exits */
786 short r_fires; /* Number of fires in room */
787 };
788
789 /* Initial artifact stats */
790 struct init_artifact
791 {
792 char *ar_name; /* name of the artifact */
793 int ar_level; /* first level where it appears */
794 int ar_rings; /* number of ring effects */
795 int ar_potions; /* number of potion effects */
796 int ar_scrolls; /* number of scroll effects */
797 int ar_wands; /* number of wand effects */
798 int ar_worth; /* gold pieces */
799 int ar_weight; /* weight of object */
800 };
801
802 /* Array of all traps on this level */
803
804 struct trap
805 {
806 coord tr_pos; /* Where trap is */
807 long tr_flags; /* Info about trap (i.e. ISFOUND) */
808 char tr_type; /* What kind of trap */
809 char tr_show; /* What disguised trap looks like */
810 };
811
812 /* Structure describing a fighting being */
813
814 struct stats
815 {
816 char *s_dmg; /* String describing damage done */
817 long s_exp; /* Experience */
818 long s_hpt; /* Hit points */
819 int s_pack; /* current weight of his pack */
820 int s_carry; /* max weight he can carry */
821 int s_lvl; /* Level of mastery */
822 int s_arm; /* Armor class */
823 int s_acmod; /* Armor clss modifier */
824 int s_power; /* Spell points */
825 int s_str; /* Strength */
826 int s_intel; /* Intelligence */
827 int s_wisdom; /* Wisdom */
828 int s_dext; /* Dexterity */
829 int s_const; /* Constitution */
830 int s_charisma; /* Charisma */
831 };
832
833 /* Structure describing a fighting being (monster at initialization) */
834
835 struct mstats
836 {
837 short s_str; /* Strength */
838 long s_exp; /* Experience */
839 int s_lvl; /* Level of mastery */
840 int s_arm; /* Armor class */
841 char *s_hpt; /* Hit points */
842 char *s_dmg; /* String describing damage done */
843 };
844
845 /* Structure for monsters and player */
846
847 /*
848 NOTE: In initial v1.04 code the t_chasee variable will be
849 reset during the save/restore process. Eventually
850 need to implement a "thing" manager where I can
851 refer to "things" by number such that references
852 to them can be saved. Problems exist with regard
853 to removing references to "things" that have been
854 killed.
855 */
856
857 typedef struct thing
858 {
859 long chasee_index, horde_index; /* Used in save/rest process */
860 struct linked_list *t_pack; /* What the thing is carrying */
861 struct stats t_stats; /* Physical description */
862 struct stats maxstats; /* maximum(or initial) stats */
863 int t_ischasing; /* Are we chasing someone? */
864 struct thing *t_chasee; /* Who are we chasing */
865 struct object *t_horde; /* What are we hordeing */
866 coord t_pos; /* Cuurent Position */
867 coord t_oldpos; /* Last Position */
868 coord t_nxtpos; /* Next Position */
869 long t_flags[16]; /* State word */
870 int t_praycnt; /* Times prayed... */
871 int t_trans; /* # of transactions at post */
872 int t_turn; /* If slowed, is it a turn to move */
873 int t_wasshot; /* Was character shot last round? */
874 int t_ctype; /* Character type */
875 int t_index; /* Index into monster table */
876 int t_no_move; /* How long the thing can't move */
877 int t_rest_hpt; /* used in hit point regeneration */
878 int t_rest_pow; /* used in spell point regeneration */
879 int t_doorgoal; /* What door are we heading to? */
880 char t_type; /* What it is */
881 char t_disguise; /* What mimic looks like */
882 char t_oldch; /* Character that was where it was */
883 } thing;
884
885 /* Array containing information on all the various types of monsters */
886
887 struct monster
888 {
889 char *m_name; /* What to call the monster */
890 short m_carry; /* Probability of carrying something */
891 int m_normal; /* Does monster exist? */
892 int m_wander; /* Does monster wander? */
893 char m_appear; /* What does monster look like? */
894 char *m_intel; /* Intelligence range */
895 unsigned long m_flags[16]; /* Things about the monster */
896 char *m_typesum; /* type of creature can he summon */
897 short m_numsum; /* how many creatures can he summon */
898 short m_add_exp; /* Added experience per hit point */
899 struct mstats m_stats; /* Initial stats */
900 };
901
902 /* Structure for a thing that the rogue can carry */
903
904 typedef struct object
905 {
906 coord o_pos; /* Where it lives on the screen */
907 struct linked_list *next_obj; /* The next obj. for stacked objects */
908 struct linked_list *o_bag; /* bag linked list pointer */
909 char *o_text; /* What it says if you read it */
910 char *o_damage; /* Damage if used like sword */
911 char *o_hurldmg; /* Damage if thrown */
912 long o_flags; /* Information about objects */
913 long ar_flags; /* general flags */
914 char o_type; /* What kind of object it is */
915 int o_ident; /* identifier for object */
916 unsigned int o_count; /* Count for plural objects */
917 int o_which; /* Which object of a type it is */
918 int o_hplus; /* Plusses to hit */
919 int o_dplus; /* Plusses to damage */
920 int o_ac; /* Armor class */
921 int o_group; /* Group number for this object */
922 int o_weight; /* weight of this object */
923 char o_launch; /* What you need to launch it */
924 char o_mark[MARKLEN]; /* Mark the specific object */
925 long o_worth;
926 } object;
927
928 /* weapon structure */
929
930 struct init_weps
931 {
932 char *w_name; /* name of weapon */
933 char *w_dam; /* hit damage */
934 char *w_hrl; /* hurl damage */
935 char w_launch; /* need to launch it */
936 int w_wght; /* weight of weapon */
937 long w_worth; /* worth of this weapon */
938 long w_flags; /* flags */
939 };
940
941 /* armor structure */
942
943 struct init_armor
944 {
945 char *a_name; /* name of armor */
946 long a_worth; /* worth of armor */
947 int a_prob; /* chance of getting armor */
948 int a_class; /* normal armor class */
949 int a_wght; /* weight of armor */
950 };
951
952 struct matrix
953 {
954 int base; /* Base to-hit value (AC 10) */
955 int max_lvl;/* Maximum level for changing value */
956 int factor; /* Amount base changes each time */
957 int offset; /* What to offset level */
958 int range; /* Range of levels for each offset */
959 };
960
961 /*
962 ANSI C Prototype Additions
963 */
964
965 /* armor.c */
966 extern void wear(void);
967 extern void take_off(void);
968 extern void waste_time(void);
969 extern int wear_ok(struct thing *th, struct object *obj, int print_message);
970
971 /* artifact.c */
972 extern void apply(void);
973 extern int possessed(int artifact);
974 extern int is_carrying(int artifact);
975 extern int make_artifact(void);
976 extern struct object *new_artifact(int which, struct object *cur);
977 extern void do_minor(struct object *obj);
978 extern void do_major(void);
979 extern void do_phial(void);
980 extern void do_palantir(void);
981 extern void do_sceptre(void);
982 extern void do_silmaril(void);
983 extern void do_amulet(void);
984 extern void do_bag(struct object *obj);
985 extern void do_wand(void);
986 extern void do_crown(void);
987 extern void level_eval(void);
988
989 /* bag.c */
990
991 typedef union
992 {
993 void *varg;
994 int *iarg;
995 struct object *obj;
996 } bag_arg;
997
998
999 extern struct object *apply_to_bag(struct linked_list *bag_p, int type,
1000 int (*bff_p)(struct object *obj, bag_arg *arg),
1001 int (*baf_p)(struct object *obj, bag_arg *arg, int id),
1002 void *user_arg);
1003 extern int count_bag(linked_list *bag_p, int type,
1004 int (*bff_p)(struct object *obj, bag_arg *arg));
1005 extern void del_bag(linked_list *bag_p, object *obj_p);
1006 extern struct object *pop_bag(linked_list **bag_pp, object *obj_p);
1007 extern void push_bag(linked_list **bag_pp, object *obj_p);
1008 extern struct object *scan_bag(linked_list *bag_p, int type, int id);
1009 extern struct object *select_bag(linked_list *bag_p, int type,
1010 int (*bff_p)(struct object *obj, bag_arg *arg), int index);
1011
1012 /* chase.c */
1013
1014 extern void do_chase(struct thing *th, int flee);
1015 extern void chase_it(coord *runner, struct thing *th);
1016 extern void runto(void);/* coord *runner, coord *spot); */
1017 extern int chase(struct thing *tp, coord *ee, int flee);
1018 extern struct room *roomin(coord cp);
1019 extern struct linked_list *find_mons(int y, int x);
1020 extern struct linked_list *f_mons_a(int y, int x, int hit_bad);
1021 extern int diag_ok(coord *sp, coord *ep, struct thing *flgptr);
1022 extern int cansee(int y, int x);
1023 extern coord *find_shoot(struct thing *tp, coord *dir);
1024 extern coord *can_shoot(coord *er, coord *ee, coord *dir);
1025 extern int straight_shot(int ery, int erx, int eey, int eex, coord *dir);
1026 extern struct linked_list *get_hurl(struct thing *tp);
1027 extern struct object *pick_weap(struct thing *tp);
1028 extern int can_blink(struct thing *tp);
1029
1030 /* command.c */
1031
1032 extern char fight_ch;
1033 extern char countch;
1034 extern void command(void);
1035 extern void do_after_effects(void);
1036 extern void make_omnipotent(void);
1037 extern void quit_handler(int sig);
1038 extern void quit(void);
1039 extern void search(int is_thief);
1040 extern void help(void);
1041 extern void identify(void);
1042 extern void d_level(void);
1043 extern void u_level(void);
1044 extern void call(int mark);
1045 extern int att_bonus(void);
1046
1047 /* daemon.c */
1048
1049 extern int demoncnt;
1050
1051 struct delayed_action
1052 {
1053 int d_type;
1054 int d_when;
1055 int d_id;
1056 void *d_arg;
1057 int d_time;
1058 };
1059
1060 #define EMPTY 0
1061 #define DAEMON 1
1062 #define FUSE 2
1063
1064 typedef void fuse;
1065 typedef void daemon;
1066
1067 typedef union
1068 {
1069 void *varg;
1070 int *iarg;
1071 struct linked_list *ll;
1072 } fuse_arg;
1073
1074 typedef union
1075 {
1076 void *varg;
1077 int *iarg;
1078 struct thing *thingptr;
1079 } daemon_arg;
1080
1081 struct fuse
1082 {
1083 int index;
1084 fuse (*func)(fuse_arg *arg);
1085 };
1086
1087 struct daemon
1088 {
1089 int index;
1090 daemon (*func)(daemon_arg *arg);
1091 };
1092
1093 #define MAXDAEMONS 60
1094
1095 #define FUSE_NULL 0
1096 #define FUSE_SWANDER 1
1097 #define FUSE_UNCONFUSE 2
1098 #define FUSE_UNSCENT 3
1099 #define FUSE_SCENT 4
1100 #define FUSE_UNHEAR 5
1101 #define FUSE_HEAR 6
1102 #define FUSE_UNSEE 7
1103 #define FUSE_UNSTINK 8
1104 #define FUSE_UNCLRHEAD 9
1105 #define FUSE_UNPHASE 10
1106 #define FUSE_SIGHT 11
1107 #define FUSE_RES_STRENGTH 12
1108 #define FUSE_NOHASTE 13
1109 #define FUSE_NOSLOW 14
1110 #define FUSE_SUFFOCATE 15
1111 #define FUSE_CURE_DISEASE 16
1112 #define FUSE_UNITCH 17
1113 #define FUSE_APPEAR 18
1114 #define FUSE_UNELECTRIFY 19
1115 #define FUSE_UNBHERO 20
1116 #define FUSE_UNSHERO 21
1117 #define FUSE_UNXRAY 22
1118 #define FUSE_UNDISGUISE 23
1119 #define FUSE_SHERO 24
1120 #define FUSE_WGHTCHK 25
1121 #define FUSE_UNSUMMON 26
1122 #define FUSE_UNGAZE 27
1123 #define FUSE_UNCOLD 28
1124 #define FUSE_UNHOT 29
1125 #define FUSE_UNFLY 30
1126 #define FUSE_UNBREATHE 31
1127 #define FUSE_UNREGEN 32
1128 #define FUSE_UNSUPEREAT 33
1129 #define FUSE_UNSHIELD 34
1130 #define FUSE_UNMSHIELD 35
1131 #define FUSE_UNTRUESEE 36
1132 #define FUSE_MAX 37
1133
1134 #define DAEMON_NULL 0
1135 #define DAEMON_DOCTOR 1
1136 #define DAEMON_ROLLWAND 2
1137 #define DAEMON_STOMACH 3
1138 #define DAEMON_RUNNERS 4
1139 #define DAEMON_MAX 5
1140
1141 extern struct delayed_action d_list[MAXDAEMONS];
1142 extern struct daemon daemons[DAEMON_MAX];
1143 extern struct fuse fuses[FUSE_MAX];
1144
1145 extern struct delayed_action *d_slot(void);
1146 extern struct delayed_action *find_slot(int id, int type);
1147 extern void start_daemon(int id, void *arg, int whendo);
1148 extern void kill_daemon(int id);
1149 extern void do_daemons(int now);
1150 extern void light_fuse(int id, void *arg, int time, int whendo);
1151 extern void lengthen_fuse(int id, int xtime);
1152 extern void extinguish_fuse(int id);
1153 extern void do_fuses(int flag);
1154 extern void activity(void);
1155
1156 /* daemons.c */
1157
1158 extern void doctor_spell_points(struct thing *tp);
1159 extern daemon runners(daemon_arg *arg);
1160 extern daemon doctor(daemon_arg *tp);
1161 extern daemon rollwand(daemon_arg *arg);
1162 extern daemon stomach(daemon_arg *arg);
1163 extern fuse swander(fuse_arg *arg);
1164 extern fuse unconfuse(fuse_arg *arg);
1165 extern fuse unscent(fuse_arg *arg);
1166 extern fuse scent(fuse_arg *arg);
1167 extern fuse unhear(fuse_arg *arg);
1168 extern fuse hear(fuse_arg *arg);
1169 extern fuse unsee(fuse_arg *arg);
1170 extern fuse unstink(fuse_arg *arg);
1171 extern fuse unclrhead(fuse_arg *arg);
1172 extern fuse unphase(fuse_arg *arg);
1173 extern fuse sight(fuse_arg *arg);
1174 extern fuse res_strength(fuse_arg *arg);
1175 extern fuse nohaste(fuse_arg *arg);
1176 extern fuse noslow(fuse_arg *arg);
1177 extern fuse suffocate(fuse_arg *arg);
1178 extern fuse cure_disease(fuse_arg *arg);
1179 extern fuse un_itch(fuse_arg *arg);
1180 extern fuse appear(fuse_arg *arg);
1181 extern fuse unelectrify(fuse_arg *arg);
1182 extern fuse unshero(fuse_arg *arg);
1183 extern fuse unbhero(fuse_arg *arg);
1184 extern fuse undisguise(fuse_arg *arg);
1185 extern fuse unsummon(fuse_arg *monst);
1186 extern fuse ungaze(fuse_arg *arg);
1187 extern fuse shero(fuse_arg *arg);
1188 extern fuse uncold(fuse_arg *arg);
1189 extern fuse unhot(fuse_arg *arg);
1190 extern fuse unfly(fuse_arg *arg);
1191 extern fuse unbreathe(fuse_arg *arg);
1192 extern fuse unregen(fuse_arg *arg);
1193 extern fuse unsupereat(fuse_arg *arg);
1194 extern fuse unshield(fuse_arg *arg);
1195 extern fuse unmshield(fuse_arg *arg);
1196 extern fuse untruesee(fuse_arg *arg);
1197 extern fuse wghtchk(fuse_arg *arg);
1198
1199 /* encumb.h */
1200
1201 extern void updpack(void);
1202 extern int packweight(void);
1203 extern int itemweight(struct object *wh);
1204 extern int playenc(void);
1205 extern int totalenc(void);
1206 extern int hitweight(void);
1207
1208 /* fight.c */
1209
1210 extern void do_fight(coord dir, int tothedeath);
1211 extern int fight(coord *mp, struct object *weap, int thrown);
1212 extern int attack(struct thing *mp, struct object *weapon, int thrown);
1213 extern int mon_mon_attack(struct thing *attacker, struct linked_list *mon,
1214 struct object *weapon, int thrown);
1215 extern int swing(int class, int at_lvl, int op_arm, int wplus);
1216 extern void init_exp(void);
1217 extern int next_exp_level(int print_message);
1218 extern void check_level(void);
1219 extern int roll_em(struct thing *att_er, struct thing *def_er,
1220 struct object *weap, int thrown, struct object *cur_weapon);
1221 extern const char *prname(char *who);
1222 extern void hit(char *ee);
1223 extern void miss(char *ee);
1224 extern int save_throw(int which, struct thing *tp);
1225 extern int save(int which);
1226 extern int dext_plus(int dexterity);
1227 extern int dext_prot(int dexterity);
1228 extern int str_plus(int str);
1229 extern int add_dam(int str);
1230 extern int hung_dam(void);
1231 extern void raise_level(void);
1232 extern void thunk(struct object *weap, char *mname);
1233 extern void m_thunk(struct object *weap, char *mname);
1234 extern void bounce(struct object *weap, char *mname);
1235 extern void m_bounce(struct object *weap, char *mname);
1236 extern void remove_monster(coord *mp, struct linked_list *item);
1237 extern int is_magic(struct object *obj);
1238 extern void killed(struct thing *killer,struct linked_list *item,
1239 int print_message, int give_points);
1240 extern struct object *wield_weap(struct object *weapon, struct thing *mp);
1241 extern void summon_help(struct thing *mons, int force);
1242 extern int maxdamage(char *cp);
1243
1244 /* getplay.c */
1245
1246 extern int geta_player(void);
1247 extern void puta_player(void);
1248 extern void do_getplayer(void);
1249 extern void print_stored(void);
1250 extern char *which_class(int c_class);
1251
1252 /* ident.c */
1253
1254 extern char print_letters[];
1255 extern int get_ident(struct object *obj_p);
1256 extern void free_ident(struct object *obj_p);
1257 extern int unprint_id(char *print_id);
1258 extern int max_print(void);
1259
1260 /* init.c */
1261
1262 extern void init_materials(void);
1263 extern void init_player(void);
1264 extern void init_flags(void);
1265 extern void init_things(void);
1266 extern void init_fd(void);
1267 extern void init_colors(void);
1268 extern void init_names(void);
1269 extern void init_stones(void);
1270 extern void badcheck(char *name, struct magic_item *magic, int bound);
1271
1272 /* io.c */
1273
1274 extern int get_string(char *buffer, WINDOW *win);
1275 extern void msg(const char *fmt, ...);
1276 extern void addmsg(const char *fmt, ...);
1277 extern void endmsg(void);
1278 extern void doadd(const char *fmt, va_list ap);
1279 extern char readchar(void);
1280 extern char readcharw(WINDOW *scr);
1281 extern void status(int display);
1282 extern void wait_for(int ch);
1283 extern void show_win(WINDOW *scr, char *message);
1284 extern void restscr(WINDOW *scr);
1285 extern void add_line(const char *fmt, ...);
1286 extern void end_line(void);
1287 extern void hearmsg(const char *fmt, ...);
1288 extern void seemsg(const char *fmt, ...);
1289
1290 /* list.c */
1291
1292 extern void *ur_alloc(size_t size);
1293 extern void ur_free(void *buf_p);
1294 extern void _detach(struct linked_list **list, struct linked_list *item);
1295 extern void _attach(struct linked_list **list, struct linked_list *item);
1296 extern void _attach_after(linked_list **list_pp, linked_list *list_p, linked_list *new_p);
1297 extern void _free_list(struct linked_list **ptr);
1298 extern void discard(struct linked_list *item);
1299 extern void throw_away(struct object *ptr);
1300 extern struct linked_list *new_item(int size);
1301 extern void *new_alloc(size_t size);
1302 extern struct linked_list *new_list(void);
1303
1304 /* magic.c */
1305
1306 /* for printing out messages */
1307
1308 #define CAST_NORMAL 0x000 /* cast normal version */
1309 #define CAST_CURSED 0x001 /* cast cursed version */
1310 #define CAST_BLESSED 0x002 /* cast blessed version */
1311 #define CAST_CROWN 0x010 /* crown helped out */
1312 #define CAST_SEPTRE 0x020 /* septre helped out */
1313
1314 #define MAX_SPELLS 100 /* Max # sorted_spells */
1315 #define MIN_FUMBLE_CHANCE 5
1316 #define MAX_FUMBLE_CHANCE 95
1317
1318 /* Spells that a monster can cast */
1319
1320 #define M_SELFTELEP 0
1321 #define M_HLNG2 1
1322 #define M_REGENERATE 2
1323 #define M_HLNG 3
1324 #define NUM_RUN 4
1325 #define M_HASTE 4
1326 #define M_SEEINVIS 5
1327 #define M_SHERO 6
1328 #define M_PHASE 7
1329 #define M_INVIS 8
1330 #define M_CANCEL 9
1331 #define M_OFFENSE 10
1332
1333
1334 struct spells
1335 {
1336 int sp_level; /* level of casting spell */
1337 int sp_which; /* which scroll or potion */
1338 unsigned long sp_flags; /* scroll, blessed, known */
1339 int sp_cost; /* generated in incant() */
1340 };
1341
1342
1343 extern void incant(struct thing *caster, coord shoot_dir);
1344 extern char *spell_name(struct spells *sp, char *buf);
1345 extern char *spell_abrev(struct spells *sp, char *buf);
1346 extern void fumble_spell(struct thing *caster, int num_fumbles);
1347 extern void learn_new_spells(void);
1348 extern struct spells *pick_monster_spell(struct thing *caster);
1349 extern int sort_spells(const void *a, const void *b);
1350
1351 /* magicitm.c */
1352
1353 extern struct magic_item things[]; /* Chances for each type of item*/
1354 extern struct magic_item s_magic[]; /* Names and chances for scrolls*/
1355 extern struct magic_item p_magic[]; /* Names and chances for potions*/
1356 extern struct magic_item r_magic[]; /* Names and chances for rings */
1357 extern struct magic_item ws_magic[]; /* Names and chances for sticks */
1358 extern struct magic_item fd_data[]; /* Names and chances for food */
1359 extern struct init_weps weaps[]; /* weapons and attributes */
1360 extern struct init_armor armors[]; /* armors and attributes */
1361 extern struct init_artifact arts[]; /* artifacts and attributes */
1362 extern int maxarmors;
1363 extern int maxartifact;
1364 extern int maxfoods;
1365 extern int maxpotions;
1366 extern int maxrings;
1367 extern int maxscrolls;
1368 extern int maxsticks;
1369 extern int maxweapons;
1370 extern int numthings;
1371 extern char *s_names[]; /* Names of the scrolls */
1372 extern char *p_colors[]; /* Colors of the potions */
1373 extern char *r_stones[]; /* Stone settings of the rings */
1374 extern char *guess_items[MAXMAGICTYPES][MAXMAGICITEMS];
1375 /* Players guess at what magic is */
1376 extern int know_items[MAXMAGICTYPES][MAXMAGICITEMS];
1377 /* Does he know what a magic item does */
1378 extern char *ws_type[]; /* Is it a wand or a staff */
1379 extern char *ws_made[]; /* What sticks are made of */
1380
1381 /* main.c */
1382
1383 extern FILE *fd_score;
1384 extern int summoned;
1385 extern coord dta;
1386 extern int main(int argc, char *argv[]);
1387 extern void fatal(char *s);
1388 extern int rnd(int range);
1389 extern unsigned char ucrnd(unsigned char range);
1390 extern short srnd(short range);
1391 extern unsigned long ulrnd(unsigned long range);
1392 extern int roll(int number, int sides);
1393
1394 /* maze.c */
1395
1396 extern void do_maze(void);
1397 extern void draw_maze(void);
1398 extern char *moffset(int y, int x);
1399 extern char *foffset(int y, int x);
1400 extern int findcells(int y, int x);
1401 extern void rmwall(int newy, int newx, int oldy, int oldx);
1402 extern void crankout(void);
1403
1404 /* memory.c */
1405
1406 extern void mem_debug(const int level);
1407 extern void mem_tracking(int flag);
1408 extern int mem_check(char *fname, int line);
1409 extern void *mem_malloc(const size_t bytes);
1410 extern void mem_free(const void *ptr);
1411 extern void *mem_realloc(const void *ptr, const size_t new_size);
1412 extern int mem_validate(const void *ptr);
1413
1414 /* misc.c */
1415
1416 extern char *tr_name(char ch, char *buf);
1417 extern void look(int wakeup);
1418 extern char secretdoor(int y, int x);
1419 extern struct linked_list *find_obj(int y, int x);
1420 extern void eat(void);
1421 extern void chg_str(int amt, int both, int lost);
1422 extern void chg_dext(int amt, int both, int lost);
1423 extern void add_haste(int blessed);
1424 extern void aggravate(void);
1425 extern char *vowelstr(char *str);
1426 extern int is_current(struct object *obj);
1427 extern int get_dir(void);
1428 extern int is_wearing(int type);
1429 extern int maze_view(int y, int x);
1430 extern void listen(void);
1431 extern void nothing_message(int flags);
1432 extern void feel_message(void);
1433 extern int const_bonus(void);
1434 extern int int_wis_bonus(void);
1435 extern void electrificate(void);
1436 extern void feed_me(int hungry_state);
1437 extern int get_monster_number(char *message);
1438
1439 /* monsdata.c */
1440
1441 extern struct monster monsters[];
1442 extern int nummonst;
1443
1444 /* monsters.c */
1445
1446 extern struct linked_list *summon_monster(int type, int familiar, int print_message);
1447 extern int randmonster(int wander, int grab);
1448 extern void new_monster(struct linked_list *item, int type, coord *cp, int max_monster);
1449 extern void wanderer(void);
1450 extern struct linked_list *wake_monster(int y, int x);
1451 extern void genocide(int flags);
1452 extern void id_monst(int monster);
1453 extern void check_residue(struct thing *tp);
1454 extern void sell(struct thing *tp);
1455 extern void carried_weapon(struct thing *owner, struct object *weapon);
1456
1457 /* move.c */
1458
1459 extern coord nh;
1460 extern void do_run(char ch);
1461 extern int step_ok(int y, int x, int can_on_monst, struct thing *flgptr);
1462 extern void corr_move(int dy, int dx);
1463 extern void do_move(int dy, int dx);
1464 extern void light(coord *cp);
1465 extern int blue_light(int flags);
1466 extern char show(int y, int x);
1467 extern char be_trapped(struct thing *th, coord tc);
1468 extern void dip_it(void);
1469 extern struct trap *trap_at(int y, int x);
1470 extern void set_trap(struct thing *tp, int y, int x);
1471 extern coord rndmove(struct thing *who);
1472 extern int isatrap(int ch);
1473
1474 /* newlvl.c */
1475
1476 extern void new_level(LEVTYPE ltype, int special);
1477 extern void put_things(LEVTYPE ltype);
1478 extern int throne_monster;
1479 extern void do_throne(int special);
1480 extern void create_lucifer(coord *stairs);
1481
1482 /* options.c */
1483
1484 typedef union
1485 {
1486 void *varg;
1487 char *str;
1488 int *iarg;
1489 } opt_arg;
1490
1491 struct optstruct
1492 {
1493 char *o_name; /* option name */
1494 char *o_prompt; /* prompt for interactive entry */
1495 opt_arg o_opt; /* pointer to thing to set */
1496 void (*o_putfunc)(opt_arg *arg,WINDOW *win);/* func to print value */
1497 int (*o_getfunc)(opt_arg *arg,WINDOW *win);/* func to get value */
1498 };
1499
1500 typedef struct optstruct OPTION;
1501
1502 extern void parse_opts(char *str);
1503 extern void option(void);
1504 extern void put_bool(opt_arg *iarg, WINDOW *win);
1505 extern void put_str(opt_arg *str, WINDOW *win);
1506 extern void put_abil(opt_arg *ability, WINDOW *win);
1507 extern void put_inv(opt_arg *inv, WINDOW *win);
1508 extern int get_bool(opt_arg *bp, WINDOW *win);
1509 extern int get_str(opt_arg *opt, WINDOW *win);
1510 extern int get_abil(opt_arg *abil, WINDOW *win);
1511 extern int get_inv(opt_arg *inv, WINDOW *win);
1512
1513 /* pack.c */
1514
1515 extern void swap_top(struct linked_list *top, struct linked_list *node);
1516 extern void get_all(struct linked_list *top);
1517 extern struct linked_list *get_stack(struct linked_list *item);
1518 extern int add_pack(struct linked_list *item, int print_message);
1519 extern void pack_report(object *obj, int print_message, char *message);
1520 extern void inventory(struct linked_list *container, int type);
1521 extern void pick_up(char ch);
1522 extern struct object *get_object(struct linked_list *container, char *purpose, int type, int (*bff_p)(struct object *obj, bag_arg *junk) );
1523 extern struct linked_list *get_item(char *purpose, int type);
1524 extern void del_pack(struct linked_list *what);
1525 extern void discard_pack(struct object *obj_p);
1526 extern void rem_pack(struct object *obj_p);
1527 extern void cur_null(struct object *op);
1528 extern void idenpack(void);
1529 extern void show_floor(void);
1530
1531 /* passages.c */
1532
1533 struct rdes
1534 {
1535 int conn[MAXROOMS]; /* possible to connect to room i? */
1536 int isconn[MAXROOMS]; /* connection been made to room i? */
1537 int ingraph; /* this room in graph already? */
1538 };
1539
1540 extern void do_passages(void);
1541 extern void conn(int r1, int r2);
1542 extern void door(struct room *rm, coord *cp);
1543
1544 /* player.c */
1545
1546 extern void prayer(void);
1547 extern int gsense(void);
1548 extern int is_stealth(struct thing *tp);
1549 extern void steal(void);
1550 extern void affect(void);
1551 extern void undead_sense(void);
1552
1553 /* potions.c */
1554
1555 extern void quaff(struct thing *quaffer, int which, int flag);
1556 extern void lower_level(int who);
1557 extern void res_dexterity(void);
1558 extern void res_wisdom(void);
1559 extern void res_intelligence(void);
1560 extern void add_strength(int cursed);
1561 extern void add_intelligence(int cursed);
1562 extern void add_wisdom(int cursed);
1563 extern void add_dexterity(int cursed);
1564 extern void add_const(int cursed);
1565 extern void monquaff(struct thing *quaffer, int which, int flag);
1566
1567 /* properti.c */
1568
1569 extern int baf_print_item(struct object *obj_p, bag_arg *type, int id);
1570 extern int baf_identify(struct object *obj_p, bag_arg *junk, int id);
1571 extern int baf_curse(struct object *obj_p, bag_arg *junk, int id);
1572 extern int baf_decrement_test(struct object *obj_p, bag_arg *count_p, int id);
1573 extern int baf_increment(struct object *obj_p, bag_arg *count_p, int id);
1574 extern int bafcweapon(struct object *obj_p, bag_arg *junk, int id);
1575 extern int bafcarmor(struct object *obj_p, bag_arg *junk, int id);
1576 extern int bff_group(struct object *obj_p, bag_arg *new_obj_p);
1577 extern int bff_callable(struct object *obj_p, bag_arg *junk);
1578 extern int bff_markable(struct object *obj_p, bag_arg *junk);
1579 extern int bffron(object *obj_p, bag_arg *junk);
1580 extern int bff_zappable(struct object *obj_p, bag_arg *junk);
1581
1582 /* random.c */
1583
1584 extern void ur_srandom(unsigned x);
1585 extern long ur_random(void);
1586
1587 /* rings.c */
1588
1589 extern void ring_on(void);
1590 extern void ring_off(void);
1591 extern int ring_eat(int hand);
1592 extern char *ring_num(struct object *obj, char *buf);
1593 extern int ring_value(int type);
1594
1595 /* rip.c */
1596
1597 extern void death(int monst);
1598 extern void score(long amount, int lvl, int flags, int monst);
1599 extern void total_winner(void);
1600 extern char *killname(int monst, char *buf);
1601 extern void showpack(char *howso);
1602 extern void byebye(void);
1603 extern int save_resurrect(int bonus);
1604
1605 /* rogue.c */
1606
1607 extern const char *monstern;
1608 extern const struct h_list helpstr[];
1609 extern const char *cnames[][15]; /* Character level names */
1610 extern char *spacemsg;
1611 extern char *morestr;
1612 extern char *retstr;
1613
1614 /* state.c */
1615
1616 extern int mpos; /* Where cursor is on top line */
1617 extern struct trap traps[];
1618 extern struct room rooms[]; /* One for each room -- A level */
1619 extern struct thing player; /* The rogue */
1620 extern struct thing *beast; /* The last monster attacking */
1621 extern struct object *cur_armor; /* What a well dresssed rogue wears */
1622 extern struct object *cur_weapon; /* Which weapon he is wielding */
1623 extern struct object *cur_ring[]; /* What rings are being worn */
1624 extern struct linked_list *fam_ptr; /* A ptr to the familiar */
1625 extern struct linked_list *lvl_obj; /* List of objects on this level */
1626 extern struct linked_list *mlist; /* List of monsters on the level */
1627 extern struct linked_list *curr_mons; /* The mons. currently moving */
1628 extern struct linked_list *next_mons; /* The mons. after curr_mons */
1629
1630 extern int prscore; /* Print scores */
1631 extern int prversion; /* Print version info */
1632
1633 extern WINDOW *cw; /* Window that the player sees */
1634 extern WINDOW *hw; /* Used for the help command */
1635 extern WINDOW *mw; /* Used to store mosnters */
1636 extern LEVTYPE levtype;
1637 extern coord delta; /* Change indicated to get_dir() */
1638
1639 extern char *release; /* Release number of rogue */
1640 extern char *lastfmt;
1641 extern char *lastarg;
1642 extern unsigned long total; /* Total dynamic memory bytes */
1643 extern long purse; /* How much gold the rogue has */
1644 extern int line_cnt; /* Counter for inventory style */
1645 extern int newpage;
1646 extern int resurrect; /* resurrection counter */
1647 extern int foodlev; /* how fast he eats food */
1648 extern int see_dist; /* (how far he can see)^2 */
1649 extern int level; /* What level rogue is on */
1650 extern int ntraps; /* Number of traps on this level */
1651 extern int no_command; /* Number of turns asleep */
1652 extern int no_food; /* Number of levels without food */
1653 extern int count; /* Number of times to repeat command */
1654 extern int dnum; /* Dungeon number */
1655 extern int max_level; /* Deepest player has gone */
1656 extern int food_left; /* Amount of food in hero's stomach */
1657 extern int group; /* Current group number */
1658 extern int hungry_state; /* How hungry is he */
1659 extern int infest_dam; /* Damage from parasites */
1660 extern int lost_str; /* Amount of strength lost */
1661 extern int lost_dext; /* amount of dexterity lost */
1662 extern int hold_count; /* Number of monsters holding player */
1663 extern int trap_tries; /* Number of attempts to set traps */
1664 extern int has_artifact; /* set for possesion of artifacts */
1665 extern int picked_artifact; /* set for any artifacts picked up */
1666 extern int msg_index; /* pointer to current message buffer */
1667 extern int luck; /* how expensive things to buy thing */
1668 extern int fam_type; /* Type of familiar */
1669 extern int times_prayed; /* The number of time prayed */
1670 extern int mons_summoned; /* Number of summoned monsters */
1671 extern int char_type; /* what type of character is player */
1672 extern int pool_teleport; /* just teleported from a pool */
1673 extern int inwhgt; /* true if from wghtchk() */
1674 extern int running; /* True if player is running */
1675 extern int fighting; /* True if player is fighting */
1676 extern int playing; /* True until he quits */
1677 extern int wizard; /* True if allows wizard commands */
1678 extern int wiz_verbose; /* True if show debug messages */
1679 extern int after; /* True if we want after daemons */
1680 extern int fight_flush; /* True if toilet input */
1681 extern int terse; /* True if we should be short */
1682 extern int doorstop; /* Stop running when we pass a door */
1683 extern int jump; /* Show running as series of jumps */
1684 extern int door_stop; /* Current status of doorstop */
1685 extern int firstmove; /* First move after setting door_stop */
1686 extern int waswizard; /* Was a wizard sometime */
1687 extern int canwizard; /* Will be permitted to do this */
1688 extern int askme; /* Ask about unidentified things */
1689 extern int moving; /* move using 'm' command */
1690
1691 extern int inv_type; /* Inven style. Bool so options works */
1692 extern char take; /* Thing the rogue is taking */
1693 extern char PLAYER; /* what the player looks like */
1694 extern char prbuf[]; /* Buffer for sprintfs */
1695 extern char runch; /* Direction player is running */
1696 extern char whoami[]; /* Name of player */
1697 extern char fruit[]; /* Favorite fruit */
1698 extern char msgbuf[10][2 * LINELEN]; /* message buffer */
1699 extern char file_name[]; /* Save file name */
1700 extern char score_file[]; /* Score file name */
1701
1702 extern struct linked_list *arrow, *bolt, *rock, *silverarrow, *fbbolt;
1703 extern struct linked_list *bullet, *firearrow, *dart, *dagger, *shuriken;
1704 extern struct linked_list *oil, *grenade;
1705 extern struct room *oldrp; /* Roomin(&oldpos) */
1706
1707 extern void ur_write_thing(FILE *savef, struct thing *t);
1708 extern struct thing *ur_read_thing(FILE *savef);
1709 extern void ur_write_object_stack(FILE *savef, struct linked_list *l);
1710 extern void ur_write_bag(FILE *savef, struct linked_list *l);
1711 extern struct linked_list *ur_read_bag(FILE *savef);
1712 extern struct linked_list *ur_read_object_stack(FILE *savef);
1713 extern int restore_file(FILE *savef);
1714
1715 /* rooms.c */
1716
1717 extern void do_rooms(void);
1718 extern void draw_room(struct room *rp);
1719 extern void horiz(int cnt);
1720 extern void vert(int cnt);
1721 extern void rnd_pos(struct room *rp, coord *cp);
1722 extern int rnd_room(void);
1723
1724 /* save.c */
1725
1726 extern int restore(char *file);
1727 extern int save_game(void);
1728 extern void save_file(FILE *savefd);
1729
1730 /* scrolls.c */
1731
1732 extern void read_scroll(struct thing *reader, int which, int flags);
1733 extern struct linked_list *creat_mons(struct thing *person,int monster,int message);
1734 extern int place_mons(int y, int x, coord *pos);
1735 extern int is_r_on(struct object *obj);
1736 extern void monread(struct thing *reader, int which, int flags);
1737
1738 /* status.c */
1739
1740 extern int has_defensive_spell(struct thing th);
1741
1742 /* sticks.c */
1743
1744 extern void fix_stick(struct object *cur);
1745 extern void do_zap(struct thing *zapper, int which, unsigned long flags);
1746 extern void drain(int ymin, int ymax, int xmin, int xmax);
1747 extern char *charge_str(struct object *obj, char *buf);
1748 extern void shoot_bolt(struct thing *shooter, coord start, coord dir, int get_points, int reason, char *name, int damage);
1749 extern void monster_do_zap(struct thing *zapper, int which, int flags);
1750 extern void cancel_player(int not_unique);
1751
1752 /* things.c */
1753
1754 extern char *inv_name(struct object *obj, int lowercase);
1755 extern void rem_obj(struct linked_list *item, int dis);
1756 extern void add_obj(struct linked_list *item, int y, int x);
1757 extern int drop(struct linked_list *item);
1758 extern int dropcheck(struct object *op);
1759 extern struct linked_list *new_thing(void);
1760 extern struct linked_list *spec_item(char type, int which, int hit, int damage);
1761 extern int pick_one(struct magic_item *magic, int nitems);
1762 extern char *blesscurse(long flags);
1763 extern int extras(void);
1764 extern char *name_type(int type);
1765 extern linked_list *make_item(object *obj_p);
1766 extern int is_member(char *list_p, int member);
1767
1768 /* trader.c */
1769
1770 extern void do_post(void);
1771 extern void buy_it(char itemtype, int flags);
1772 extern void sell_it(void);
1773 extern void describe_it(struct object *obj);
1774 extern int open_market(void);
1775 extern int get_worth(struct object *obj);
1776 extern void trans_line(void);
1777
1778 /* verify.c */
1779
1780 extern void verify_function(const char *file, const int line);
1781
1782 /* vers.c */
1783
1784 extern char *save_format;
1785 extern char *version;
1786 extern char *release;
1787
1788 /* weapons.c */
1789
1790 extern coord do_motion(int ob, int ydelta, int xdelta, struct thing *tp);
1791 extern void fall(struct thing *tp, struct linked_list *item, int pr, int
1792 player_owned);
1793 extern int hit_monster(int y, int x, struct object *weapon, struct thing *thrower);
1794 extern int wield_ok(struct thing *wieldee, struct object *obj, int print_message);
1795 extern int shoot_ok(int ch);
1796 extern int fallpos(coord pos, coord *newpos);
1797 extern void wield(void);
1798 extern char *num(int n1, int n2, char *buf);
1799 extern void init_weapon(struct object *weap, int type);
1800 extern void missile(int ydelta, int xdelta, struct linked_list *item, struct thing *tp);
1801
1802 /* wizard.c */
1803
1804 extern void whatis(struct linked_list *what);
1805 extern void teleport(void);
1806 extern int passwd(void);
1807
1808 /* mdport.c */
1809 char *md_strdup(const char *s);
1810 long md_random(void);
1811 void md_srandom(long seed);
1812 int md_readchar(WINDOW *win);
1813
1814 #define NOOP(x) (x += 0)
1815 #define CCHAR(x) ( (char) (x & A_CHARTEXT) )