Make sure we look at the correct sub op codes when
[dragonfly.git] / games / hack / hack.h
blob598c57685d38a24f9f5885a1eb1d9506e8475092
1 /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
2 /* hack.h - version 1.0.3 */
3 /* $DragonFly: src/games/hack/hack.h,v 1.4 2006/08/21 19:45:32 pavalos Exp $ */
5 #include "config.h"
6 #include <fcntl.h>
7 #include <signal.h>
8 #include <stdarg.h>
9 #include <stdbool.h>
10 #include <stdio.h>
11 #include <stdlib.h>
12 #include <string.h>
13 #include <unistd.h>
15 #ifndef BSD
16 #define index strchr
17 #define rindex strrchr
18 #endif /* BSD */
20 #define Null(type) ((struct type *) 0)
22 #include "def.objclass.h"
24 typedef struct {
25 xchar x,y;
26 } coord;
28 #include "def.monst.h" /* uses coord */
29 #include "def.gold.h"
30 #include "def.trap.h"
31 #include "def.obj.h"
32 #include "def.flag.h"
33 #include "def.mkroom.h"
34 #include "def.wseg.h"
36 #define plur(x) (((x) == 1) ? "" : "s")
38 #define BUFSZ 256 /* for getlin buffers */
39 #define PL_NSIZ 32 /* name of player, ghost, shopkeeper */
41 #include "def.rm.h"
42 #include "def.permonst.h"
44 extern xchar xdnstair, ydnstair, xupstair, yupstair; /* stairs up and down. */
46 #define newstring(x) (char *) alloc((unsigned)(x))
47 #include "hack.onames.h"
49 #define ON 1
50 #define OFF 0
52 extern struct obj *invent, *uwep, *uarm, *uarm2, *uarmh, *uarms, *uarmg,
53 *uleft, *uright, *fcobj;
54 extern struct obj *uchain; /* defined iff PUNISHED */
55 extern struct obj *uball; /* defined if PUNISHED */
57 struct prop {
58 #define TIMEOUT 007777 /* mask */
59 #define LEFT_RING W_RINGL /* 010000L */
60 #define RIGHT_RING W_RINGR /* 020000L */
61 #define INTRINSIC 040000L
62 #define LEFT_SIDE LEFT_RING
63 #define RIGHT_SIDE RIGHT_RING
64 #define BOTH_SIDES (LEFT_SIDE | RIGHT_SIDE)
65 long p_flgs;
66 void (*p_tofn)(void); /* called after timeout */
69 struct you {
70 xchar ux, uy;
71 schar dx, dy, dz; /* direction of move (or zap or ... ) */
72 #ifdef QUEST
73 schar di; /* direction of FF */
74 xchar ux0, uy0; /* initial position FF */
75 #endif /* QUEST */
76 xchar udisx, udisy; /* last display pos */
77 char usym; /* usually '@' */
78 schar uluck;
79 #define LUCKMAX 10 /* on moonlit nights 11 */
80 #define LUCKMIN (-10)
81 int last_str_turn:3; /* 0: none, 1: half turn, 2: full turn */
82 /* +: turn right, -: turn left */
83 unsigned udispl:1; /* @ on display */
84 unsigned ulevel:4; /* 1 - 14 */
85 #ifdef QUEST
86 unsigned uhorizon:7;
87 #endif /* QUEST */
88 unsigned utrap:3; /* trap timeout */
89 unsigned utraptype:1; /* defined if utrap nonzero */
90 #define TT_BEARTRAP 0
91 #define TT_PIT 1
92 unsigned uinshop:6; /* used only in shk.c - (roomno+1) of shop */
95 /* perhaps these #define's should also be generated by makedefs */
96 #define TELEPAT LAST_RING /* not a ring */
97 #define Telepat u.uprops[TELEPAT].p_flgs
98 #define FAST (LAST_RING+1) /* not a ring */
99 #define Fast u.uprops[FAST].p_flgs
100 #define CONFUSION (LAST_RING+2) /* not a ring */
101 #define Confusion u.uprops[CONFUSION].p_flgs
102 #define INVIS (LAST_RING+3) /* not a ring */
103 #define Invis u.uprops[INVIS].p_flgs
104 #define Invisible (Invis && !See_invisible)
105 #define GLIB (LAST_RING+4) /* not a ring */
106 #define Glib u.uprops[GLIB].p_flgs
107 #define PUNISHED (LAST_RING+5) /* not a ring */
108 #define Punished u.uprops[PUNISHED].p_flgs
109 #define SICK (LAST_RING+6) /* not a ring */
110 #define Sick u.uprops[SICK].p_flgs
111 #define BLIND (LAST_RING+7) /* not a ring */
112 #define Blind u.uprops[BLIND].p_flgs
113 #define WOUNDED_LEGS (LAST_RING+8) /* not a ring */
114 #define Wounded_legs u.uprops[WOUNDED_LEGS].p_flgs
115 #define STONED (LAST_RING+9) /* not a ring */
116 #define Stoned u.uprops[STONED].p_flgs
117 #define PROP(x) (x-RIN_ADORNMENT) /* convert ring to index in uprops */
118 unsigned umconf:1;
119 const char *usick_cause;
120 struct prop uprops[LAST_RING+10];
122 unsigned uswallow:1; /* set if swallowed by a monster */
123 unsigned uswldtim:4; /* time you have been swallowed */
124 unsigned uhs:3; /* hunger state - see hack.eat.c */
125 schar ustr,ustrmax;
126 schar udaminc;
127 schar uac;
128 int uhp,uhpmax;
129 long int ugold,ugold0,uexp,urexp;
130 int uhunger; /* refd only in eat.c and shk.c */
131 int uinvault;
132 struct monst *ustuck;
133 int nr_killed[CMNUM+2]; /* used for experience bookkeeping */
136 extern struct you u;
138 extern const char *traps[];
139 extern char vowels[];
141 extern xchar curx,cury; /* cursor location on screen */
143 extern coord bhitpos; /* place where thrown weapon falls to the ground */
145 extern xchar seehx,seelx,seehy,seely; /* where to see*/
146 extern const char *save_cm, *killer, *nomovemsg;
148 extern xchar dlevel, maxdlevel; /* dungeon level */
150 extern long moves;
152 extern int multi;
154 extern char lock[];
156 extern const char *occtxt;
157 extern const char *hu_stat[];
159 #define DIST(x1,y1,x2,y2) (((x1)-(x2))*((x1)-(x2)) + ((y1)-(y2))*((y1)-(y2)))
161 #define PL_CSIZ 20 /* sizeof pl_character */
162 #define MAX_CARR_CAP 120 /* so that boulders can be heavier */
163 #define MAXLEVEL 40
164 #define FAR (COLNO+2) /* position outside screen */
166 extern schar xdir[], ydir[];
167 extern int hackpid, locknum, doorindex, done_stopprint;
168 extern char mlarge[], pl_character[PL_CSIZ], genocided[60], fut_geno[60];
169 extern char *hname, morc, plname[PL_NSIZ], sdir[];
170 extern boolean level_exists[], restoring, in_mklev;
171 extern struct permonst pm_eel, pm_ghost;
172 extern void (*afternmv)(void);
173 extern struct monst *mydogs;
174 extern bool (*occupation)(void);
176 /* Non-static function prototypes */
178 /* alloc.c */
179 void *alloc(size_t);
181 /* hack.apply.c */
182 int doapply(void);
183 int holetime(void);
184 void dighole(void);
186 /* hack.bones.c */
187 void savebones(void);
188 int getbones(void);
190 /* hack.c */
191 void unsee(void);
192 void seeoff(bool);
193 void domove(void);
194 int dopickup(void);
195 void pickup(int);
196 void lookaround(void);
197 bool monster_nearby(void);
198 bool cansee(xchar, xchar);
199 int sgn(int);
200 void setsee(void);
201 void nomul(int);
202 int abon(void);
203 int dbon(void);
204 void losestr(int);
205 void losehp(int, const char *);
206 void losehp_m(int, struct monst *);
207 void losexp(void);
208 int inv_weight(void);
209 long newuexp(void);
211 /* hack.cmd.c */
212 void rhack(const char *);
213 bool movecmd(char);
214 bool getdir(bool);
215 void confdir(void);
216 #ifdef QUEST
217 void finddir(void);
218 #endif
219 bool isok(int, int);
221 /* hack.do.c */
222 int dodrop(void);
223 void dropx(struct obj *);
224 int doddrop(void);
225 int dodown(void);
226 int doup(void);
227 void goto_level(int, bool);
228 int donull(void);
229 int dopray(void);
230 int dothrow(void);
231 struct obj *splitobj(struct obj *, int);
232 void more_experienced(int, int);
233 void set_wounded_legs(long, int);
234 void heal_legs(void);
236 /* hack.do_name.c */
237 coord getpos(int, const char *);
238 int do_mname(void);
239 int ddocall(void);
240 void docall(struct obj *);
241 char *monnam(struct monst *);
242 char *Monnam(struct monst *);
243 char *amonnam(struct monst *, const char *);
244 char *Amonnam(struct monst *, const char *);
245 char *Xmonnam(struct monst *);
247 /* hack.do_wear.c */
248 int doremarm(void);
249 int doremring(void);
250 bool armoroff(struct obj *);
251 int doweararm(void);
252 int dowearring(void);
253 void ringoff(struct obj *);
254 void find_ac(void);
255 void glibr(void);
256 struct obj *some_armor(void);
257 void corrode_armor(void);
259 /* hack.dog.c */
260 void makedog(void);
261 void losedogs(void);
262 void keepdogs(void);
263 void fall_down(struct monst *);
264 int dog_move(struct monst *, int);
265 int inroom(xchar, xchar);
266 bool tamedog(struct monst *, struct obj *);
268 /* hack.eat.c */
269 void init_uhunger(void);
270 int doeat(void);
271 void gethungry(void);
272 void morehungry(int);
273 void lesshungry(int);
274 bool poisonous(struct obj *);
276 /* hack.end.c */
277 void done1(int);
278 void done_in_by(struct monst *);
279 void done(const char *);
280 void clearlocks(void);
281 #ifdef NOSAVEONHANGUP
282 void hangup(int);
283 #endif
284 char *eos(char *);
285 void charcat(char *, char);
286 void prscore(int, char **);
288 /* hack.engrave.c */
289 bool sengr_at(const char *, xchar, xchar);
290 void u_wipe_engr(int);
291 void wipe_engr_at(xchar, xchar, xchar);
292 void read_engr_at(int, int);
293 void make_engr_at(int, int, const char *);
294 int doengrave(void);
295 void save_engravings(int);
296 void rest_engravings(int);
298 /* hack.fight.c */
299 int hitmm(struct monst *, struct monst *);
300 void mondied(struct monst *);
301 int fightm(struct monst *);
302 bool thitu(int, int, const char *);
303 bool hmon(struct monst *, struct obj *, int);
304 bool attack(struct monst *);
306 /* hack.invent.c */
307 struct obj *addinv(struct obj *);
308 void useup(struct obj *);
309 void freeinv(struct obj *);
310 void delobj(struct obj *);
311 void freeobj(struct obj *);
312 void freegold(struct gold *);
313 void deltrap(struct trap *);
314 struct monst *m_at(int, int);
315 struct obj *o_at(int, int);
316 struct obj *sobj_at(int, int, int);
317 bool carried(struct obj *);
318 bool carrying(int);
319 struct obj *o_on(unsigned int, struct obj *);
320 struct trap *t_at(int, int);
321 struct gold *g_at(int, int);
322 struct obj *getobj(const char *, const char *);
323 int ggetobj(const char *, int (*)(struct obj *), int);
324 int askchain(struct obj *, char *, int, int (*)(struct obj *),
325 bool (*)(struct obj *), int);
326 void prinv(struct obj *);
327 int ddoinv(void);
328 int dotypeinv(void);
329 int dolook(void);
330 void stackobj(struct obj *);
331 int doprgold(void);
332 int doprwep(void);
333 int doprarm(void);
334 int doprring(void);
335 bool digit(char);
337 /* hack.ioctl.c */
338 void getioctls(void);
339 void setioctls(void);
340 #ifdef SUSPEND
341 int dosuspend(void);
342 #endif
344 /* hack.lev.c */
345 void savelev(int, xchar);
346 void bwrite(int, char *, unsigned int);
347 void saveobjchn(int, struct obj *);
348 void savemonchn(int, struct monst *);
349 void getlev(int, int, xchar);
350 void mread(int, char *, unsigned int);
351 void mklev(void);
353 /* hack.main.c */
354 void glo(int);
355 void askname(void);
356 void impossible(const char *, ...);
357 void stop_occupation(void);
359 /* hack.makemon.c */
360 struct monst *makemon(struct permonst *, int, int);
361 coord enexto(xchar, xchar);
362 bool goodpos(int, int);
363 void rloc(struct monst *);
364 struct monst *mkmon_at(char, int, int);
366 /* hack.mhitu.c */
367 bool mhitu(struct monst *);
368 bool hitu(struct monst *, int);
370 /* hack.mklev.c */
371 void makelevel(void);
372 void mktrap(int, int, struct mkroom *);
374 /* hack.mkmaze.c */
375 void makemaz(void);
376 coord mazexy(void);
378 /* hack.mkobj.c */
379 struct obj *mkobj_at(int, int, int);
380 void mksobj_at(int, int, int);
381 struct obj *mkobj(int);
382 struct obj *mksobj(int);
383 bool letter(char);
384 int weight(struct obj *);
385 void mkgold(long, int, int);
387 /* hack.mkshop.c */
388 #ifndef QUEST
389 void mkshop(void);
390 void mkzoo(int);
391 void mkswamp(void);
392 #endif
394 /* hack.mon.c */
395 void movemon(void);
396 void justswld(struct monst *, const char *);
397 void youswld(struct monst *, int, int, const char *);
398 bool dochug(struct monst *);
399 int m_move(struct monst *, int);
400 int mfndpos(struct monst *, coord *, int *, int);
401 int dist(int, int);
402 void poisoned(const char *, const char *);
403 void mondead(struct monst *);
404 void replmon(struct monst *, struct monst *);
405 void relmon(struct monst *);
406 void monfree(struct monst *);
407 void unstuck(struct monst *);
408 void killed(struct monst *);
409 void kludge(const char *, const char *);
410 void rescham(void);
411 bool newcham(struct monst *, struct permonst *);
412 void mnexto(struct monst *);
413 void setmangry(struct monst *);
414 bool canseemon(struct monst *);
416 /* hack.o_init.c */
417 int letindex(char);
418 void init_objects(void);
419 int probtype(char);
420 void oinit(void);
421 void savenames(int);
422 void restnames(int);
423 int dodiscovered(void);
425 /* hack.objnam.c */
426 char *typename(int);
427 char *xname(struct obj *);
428 char *doname(struct obj *);
429 void setan(const char *, char *);
430 char *aobjnam(struct obj *, const char *);
431 char *Doname(struct obj *);
432 struct obj *readobjnam(char *);
434 /* hack.options.c */
435 void initoptions(void);
436 int doset(void);
438 /* hack.pager.c */
439 int dowhatis(void);
440 void set_whole_screen(void);
441 #ifdef NEWS
442 bool readnews(void);
443 #endif
444 void set_pager(int);
445 bool page_line(const char *);
446 void cornline(int, const char *);
447 int dohelp(void);
448 bool page_file(const char *, bool);
449 #ifdef UNIX
450 #ifdef SHELL
451 int dosh(void);
452 #endif /* SHELL */
453 bool child(bool);
454 #endif /* UNIX */
456 /* hack.potion.c */
457 int dodrink(void);
458 void pluslvl(void);
459 void strange_feeling(struct obj *, const char *);
460 void potionhit(struct monst *, struct obj *);
461 void potionbreathe(struct obj *);
462 int dodip(void);
464 /* hack.pri.c */
465 void swallowed(void);
466 void panic(const char *, ...);
467 void atl(int, int, char);
468 void on_scr(int, int);
469 void tmp_at(schar, schar);
470 void Tmp_at(schar, schar);
471 void setclipped(void);
472 void at(xchar, xchar, char);
473 void prme(void);
474 int doredraw(void);
475 void docrt(void);
476 void docorner(int, int);
477 void curs_on_u(void);
478 void pru(void);
479 void prl(int, int);
480 char news0(xchar, xchar);
481 void newsym(int, int);
482 void mnewsym(int, int);
483 void nosee(int, int);
484 #ifndef QUEST
485 void prl1(int, int);
486 void nose1(int, int);
487 #endif
488 bool vism_at(int, int);
489 void unpobj(struct obj *);
490 void seeobjs(void);
491 void seemons(void);
492 void pmon(struct monst *);
493 void unpmon(struct monst *);
494 void nscr(void);
495 void bot(void);
496 #ifdef WAN_PROBING
497 void mstatusline(struct monst *);
498 #endif
499 void cls(void);
501 /* hack.read.c */
502 int doread(void);
503 int identify(struct obj *);
504 void litroom(bool);
506 /* hack.rip.c */
507 void outrip(void);
509 /* hack.rumors.c */
510 void outrumor(void);
512 /* hack.save.c */
513 int dosave(void);
514 #ifndef NOSAVEONHANGUP
515 void hangup(int);
516 #endif
517 bool dorecover(int);
518 struct obj *restobjchn(int);
519 struct monst *restmonchn(int);
521 /* hack.search.c */
522 int findit(void);
523 int dosearch(void);
524 int doidtrap(void);
525 void wakeup(struct monst *);
526 void seemimic(struct monst *);
528 /* hack.shk.c */
529 #ifdef QUEST
530 void obfree(struct obj *, struct obj *);
531 int inshop(void);
532 void shopdig(void);
533 void addtobill(void);
534 void subfrombill(void);
535 void splitbill(void);
536 int dopay(void);
537 void paybill(void);
538 int doinvbill(void);
539 void shkdead(void);
540 int shkcatch(void);
541 int shk_move(void);
542 void replshk(struct monst *, struct monst *);
543 const char *shkname(void);
544 #else
545 char *shkname(struct monst *);
546 void shkdead(struct monst *);
547 void replshk(struct monst *, struct monst *);
548 int inshop(void);
549 void obfree(struct obj *, struct obj *);
550 int dopay(void);
551 void paybill(void);
552 void addtobill(struct obj *);
553 void splitbill(struct obj *, struct obj *);
554 void subfrombill(struct obj *);
555 int doinvbill(int);
556 bool shkcatch(struct obj *);
557 int shk_move(struct monst *);
558 void shopdig(int);
559 #endif
560 bool online(int, int);
561 bool follower(struct monst *);
563 /* hack.shknam.c */
564 void findname(char *, char);
566 /* hack.steal.c */
567 long somegold(void);
568 void stealgold(struct monst *);
569 bool steal(struct monst *);
570 void mpickobj(struct monst *, struct obj *);
571 bool stealamulet(struct monst *);
572 void relobj(struct monst *, int);
574 /* hack.termcap.c */
575 void startup(void);
576 void start_screen(void);
577 void end_screen(void);
578 void curs(int, int);
579 void cl_end(void);
580 void clear_screen(void);
581 void home(void);
582 void standoutbeg(void);
583 void standoutend(void);
584 void backsp(void);
585 void bell(void);
586 void cl_eos(void);
588 /* hack.timeout.c */
589 void p_timeout(void);
591 /* hack.topl.c */
592 int doredotopl(void);
593 void remember_topl(void);
594 void addtopl(const char *);
595 void more(void);
596 void cmore(const char *);
597 void clrlin(void);
598 void pline(const char *, ...);
599 void vpline(const char *, va_list);
600 void putsym(char);
601 void putstr(const char *);
603 /* hack.track.c */
604 void initrack(void);
605 void settrack(void);
606 coord *gettrack(int, int);
608 /* hack.trap.c */
609 struct trap *maketrap(int, int, int);
610 void dotrap(struct trap *);
611 int mintrap(struct monst *);
612 void selftouch(const char *);
613 void float_up(void);
614 void float_down(void);
615 void tele(void);
616 int dotele(void);
617 void placebc(int);
618 void unplacebc(void);
619 void level_tele(void);
620 void drown(void);
622 /* hack.tty.c */
623 void gettty(void);
624 void settty(const char *);
625 void setftty(void);
626 void error(const char *, ...);
627 void getlin(char *);
628 void getret(void);
629 void cgetret(const char *);
630 void xwaitforspace(const char *);
631 char *parse(void);
632 char readchar(void);
633 void end_of_input(void);
635 /* hack.u_init.c */
636 void u_init(void);
637 void plnamesuffix(void);
639 /* hack.unix.c */
640 void setrandom(void);
641 int getyear(void);
642 char *getdate(void);
643 int phase_of_the_moon(void);
644 bool night(void);
645 bool midnight(void);
646 void gethdate(const char *);
647 bool uptodate(int);
648 void getlock(void);
649 #ifdef MAIL
650 void getmailstatus(void);
651 void ckmailstatus(void);
652 void readmail(void);
653 #endif
654 void regularize(char *);
656 /* hack.vault.c */
657 void setgd(void);
658 int gd_move(void);
659 void replgd(struct monst *, struct monst *);
660 void invault(void);
661 #ifdef QUEST
662 void gddead(struct monst *);
663 #else
664 void gddead(void);
665 #endif
667 /* hack.version.c */
668 int doversion(void);
670 /* hack.wield.c */
671 void setuwep(struct obj *);
672 int dowield(void);
673 void corrode_weapon(void);
674 bool chwepon(struct obj *, int);
676 /* hack.wizard.c */
677 void amulet(void);
678 bool wiz_hit(struct monst *);
679 void inrange(struct monst *);
681 /* hack.worm.c */
682 #ifndef NOWORM
683 bool getwn(struct monst *);
684 void initworm(struct monst *);
685 void worm_move(struct monst *);
686 void worm_nomove(struct monst *);
687 void wormdead(struct monst *);
688 void wormhit(struct monst *);
689 void wormsee(unsigned int);
690 void pwseg(struct wseg *);
691 void cutworm(struct monst *, xchar, xchar, uchar);
692 #endif
694 /* hack.worn.c */
695 void setworn(struct obj *, long);
696 void setnotworn(struct obj *);
698 /* hack.zap.c */
699 int dozap(void);
700 const char *exclam(int);
701 void hit(const char *, struct monst *, const char *);
702 void miss(const char *, struct monst *);
703 struct monst *bhit(int, int, int, char,
704 void (*)(struct monst *, struct obj *),
705 bool (*)(struct obj *, struct obj *), struct obj *);
706 struct monst *boomhit(int, int);
707 void buzz(int, xchar, xchar, int, int);
708 void fracture_rock(struct obj *);
710 /* rnd.c */
711 int rn1(int, int);
712 int rn2(int);
713 int rnd(int);
714 int d(int, int);