aboutsummaryrefslogtreecommitdiff
path: root/hack/hack.h
blob: f87538748e5722d1547daeb061093c25431a7d38 (plain)
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
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/* hack.h - version 1.0.3 */
/* $DragonFly: src/games/hack/hack.h,v 1.4 2006/08/21 19:45:32 pavalos Exp $ */

#include "config.h"
#include <fcntl.h>
#include <signal.h>
#include <stdarg.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

#include "def.objclass.h"

typedef struct {
	xchar x, y;
} coord;

#include "def.monst.h"	/* uses coord */
#include "def.gold.h"
#include "def.trap.h"
#include "def.obj.h"
#include "def.flag.h"
#include "def.mkroom.h"
#include "def.wseg.h"

#define	plur(x)	(((x) == 1) ? "" : "s")

#define	BUFSZ	256	/* for getlin buffers */
#define	PL_NSIZ	32	/* name of player, ghost, shopkeeper */

#include "def.rm.h"
#include "def.permonst.h"

extern xchar xdnstair, ydnstair, xupstair, yupstair; /* stairs up and down. */

#define	newstring(x)	alloc((unsigned)(x))
#include "hack.onames.h"

#define	ON	1
#define	OFF	0

extern struct obj *invent, *uwep, *uarm, *uarm2, *uarmh, *uarms, *uarmg,
	*uleft, *uright, *fcobj;
extern struct obj *uchain;	/* defined iff PUNISHED */
extern struct obj *uball;	/* defined if PUNISHED */

struct prop {
#define	TIMEOUT		007777	/* mask */
#define	LEFT_RING	W_RINGL	/* 010000L */
#define	RIGHT_RING	W_RINGR	/* 020000L */
#define	INTRINSIC	040000L
#define	LEFT_SIDE	LEFT_RING
#define	RIGHT_SIDE	RIGHT_RING
#define	BOTH_SIDES	(LEFT_SIDE | RIGHT_SIDE)
	long p_flgs;
	void (*p_tofn)(void);	/* called after timeout */
};

struct you {
	xchar ux, uy;
	schar dx, dy, dz;	/* direction of move (or zap or ... ) */
#ifdef QUEST
	schar di;		/* direction of FF */
	xchar ux0, uy0;		/* initial position FF */
#endif /* QUEST */
	xchar udisx, udisy;	/* last display pos */
	char usym;		/* usually '@' */
	schar uluck;
#define	LUCKMAX		10	/* on moonlit nights 11 */
#define	LUCKMIN		(-10)
	int last_str_turn:3;	/* 0: none, 1: half turn, 2: full turn */
				/* +: turn right, -: turn left */
	unsigned udispl:1;	/* @ on display */
	unsigned ulevel:4;	/* 1 - 14 */
#ifdef QUEST
	unsigned uhorizon:7;
#endif /* QUEST */
	unsigned utrap:3;	/* trap timeout */
	unsigned utraptype:1;	/* defined if utrap nonzero */
#define	TT_BEARTRAP	0
#define	TT_PIT		1
	unsigned uinshop:6;	/* used only in shk.c - (roomno+1) of shop */


/* perhaps these #define's should also be generated by makedefs */
#define	TELEPAT		LAST_RING		/* not a ring */
#define	Telepat		u.uprops[TELEPAT].p_flgs
#define	FAST		(LAST_RING+1)		/* not a ring */
#define	Fast		u.uprops[FAST].p_flgs
#define	CONFUSION	(LAST_RING+2)		/* not a ring */
#define	Confusion	u.uprops[CONFUSION].p_flgs
#define	INVIS		(LAST_RING+3)		/* not a ring */
#define	Invis		u.uprops[INVIS].p_flgs
#define	Invisible	(Invis && !See_invisible)
#define	GLIB		(LAST_RING+4)		/* not a ring */
#define	Glib		u.uprops[GLIB].p_flgs
#define	PUNISHED	(LAST_RING+5)		/* not a ring */
#define	Punished	u.uprops[PUNISHED].p_flgs
#define	SICK		(LAST_RING+6)		/* not a ring */
#define	Sick		u.uprops[SICK].p_flgs
#define	BLIND		(LAST_RING+7)		/* not a ring */
#define	Blind		u.uprops[BLIND].p_flgs
#define	WOUNDED_LEGS	(LAST_RING+8)		/* not a ring */
#define	Wounded_legs	u.uprops[WOUNDED_LEGS].p_flgs
#define	STONED		(LAST_RING+9)		/* not a ring */
#define	Stoned		u.uprops[STONED].p_flgs
#define	PROP(x)		(x-RIN_ADORNMENT)       /* convert ring to index in uprops */
	unsigned umconf:1;
	const char *usick_cause;
	struct prop uprops[LAST_RING+10];

	unsigned uswallow:1;		/* set if swallowed by a monster */
	unsigned uswldtim:4;		/* time you have been swallowed */
	unsigned uhs:3;			/* hunger state - see hack.eat.c */
	schar ustr, ustrmax;
	schar udaminc;
	schar uac;
	int uhp, uhpmax;
	long int ugold, ugold0, uexp, urexp;
	int uhunger;			/* refd only in eat.c and shk.c */
	int uinvault;
	struct monst *ustuck;
	int nr_killed[CMNUM+2];		/* used for experience bookkeeping */
};

extern struct you u;

extern const char *traps[];
extern char vowels[];

extern xchar curx, cury;	/* cursor location on screen */

extern coord bhitpos;	/* place where thrown weapon falls to the ground */

extern xchar seehx, seelx, seehy, seely; /* where to see*/
extern const char *save_cm, *killer, *nomovemsg;

extern xchar dlevel, maxdlevel; /* dungeon level */

extern long moves;

extern int multi;

extern char lock[];

extern const char *occtxt;
extern const char *hu_stat[];

#define	DIST(x1,y1,x2,y2)	(((x1)-(x2))*((x1)-(x2)) + ((y1)-(y2))*((y1)-(y2)))

#define	PL_CSIZ		20	/* sizeof pl_character */
#define	MAX_CARR_CAP	120	/* so that boulders can be heavier */
#define	MAXLEVEL	40
#define	FAR	(COLNO+2)	/* position outside screen */

extern schar xdir[], ydir[];
extern int hackpid, locknum, doorindex, done_stopprint;
extern char mlarge[], pl_character[PL_CSIZ], genocided[60], fut_geno[60];
extern char *hname, morc, plname[PL_NSIZ], sdir[];
extern boolean level_exists[], restoring, in_mklev;
extern struct permonst pm_eel, pm_ghost;
extern void (*afternmv)(void);
extern struct monst *mydogs;
extern bool (*occupation)(void);

/* Non-static function prototypes */

/* alloc.c */
void	*alloc(size_t);

/* hack.apply.c */
int	doapply(void);
int	holetime(void);
void	dighole(void);

/* hack.bones.c */
void	savebones(void);
int	getbones(void);

/* hack.c */
void	unsee(void);
void	seeoff(bool);
void	domove(void);
int	dopickup(void);
void	pickup(int);
void	lookaround(void);
bool	monster_nearby(void);
bool	cansee(xchar, xchar);
int	sgn(int);
void	setsee(void);
void	nomul(int);
int	abon(void);
int	dbon(void);
void	losestr(int);
void	losehp(int, const char *);
void	losehp_m(int, struct monst *);
void	losexp(void);
int	inv_weight(void);
long	newuexp(void);

/* hack.cmd.c */
void	rhack(const char *);
bool	movecmd(char);
bool	getdir(bool);
void	confdir(void);
#ifdef QUEST
void	finddir(void);
#endif
bool	isok(int, int);

/* hack.do.c */
int		 dodrop(void);
void		 dropx(struct obj *);
int		 doddrop(void);
int		 dodown(void);
int		 doup(void);
void		 goto_level(int, bool);
int		 donull(void);
int		 dopray(void);
int		 dothrow(void);
struct obj	*splitobj(struct obj *, int);
void		 more_experienced(int, int);
void		 set_wounded_legs(long, int);
void		 heal_legs(void);

/* hack.do_name.c */
coord	 getpos(int, const char *);
int	 do_mname(void);
int	 ddocall(void);
void	 docall(struct obj *);
char	*monnam(struct monst *);
char	*Monnam(struct monst *);
char	*amonnam(struct monst *, const char *);
char	*Amonnam(struct monst *, const char *);
char	*Xmonnam(struct monst *);

/* hack.do_wear.c */
int		 doremarm(void);
int		 doremring(void);
bool		 armoroff(struct obj *);
int		 doweararm(void);
int		 dowearring(void);
void		 ringoff(struct obj *);
void		 find_ac(void);
void		 glibr(void);
struct obj	*some_armor(void);
void		 corrode_armor(void);

/* hack.dog.c */
void	makedog(void);
void	losedogs(void);
void	keepdogs(void);
void	fall_down(struct monst *);
int	dog_move(struct monst *, int);
int	inroom(xchar, xchar);
bool	tamedog(struct monst *, struct obj *);

/* hack.eat.c */
void	init_uhunger(void);
int	doeat(void);
void	gethungry(void);
void	morehungry(int);
void	lesshungry(int);
bool	poisonous(struct obj *);

/* hack.end.c */
void	 done1(int);
void	 done_in_by(struct monst *);
void	 done(const char *);
void	 clearlocks(void);
#ifdef NOSAVEONHANGUP
void	 hangup(int);
#endif
char	*eos(char *);
void	 charcat(char *, char);
void	 prscore(int, char **);

/* hack.engrave.c */
bool	sengr_at(const char *, xchar, xchar);
void	u_wipe_engr(int);
void	wipe_engr_at(xchar, xchar, xchar);
void	read_engr_at(int, int);
void	make_engr_at(int, int, const char *);
int	doengrave(void);
void	save_engravings(int);
void	rest_engravings(int);

/* hack.fight.c */
int	hitmm(struct monst *, struct monst *);
void	mondied(struct monst *);
int	fightm(struct monst *);
bool	thitu(int, int, const char *);
bool	hmon(struct monst *, struct obj *, int);
bool	attack(struct monst *);

/* hack.invent.c */
struct obj	*addinv(struct obj *);
void		 useup(struct obj *);
void		 freeinv(struct obj *);
void		 delobj(struct obj *);
void		 freeobj(struct obj *);
void		 freegold(struct gold *);
void		 deltrap(struct trap *);
struct monst	*m_at(int, int);
struct obj	*o_at(int, int);
struct obj	*sobj_at(int, int, int);
bool		 carried(struct obj *);
bool		 carrying(int);
struct obj	*o_on(unsigned int, struct obj *);
struct trap	*t_at(int, int);
struct gold	*g_at(int, int);
struct obj	*getobj(const char *, const char *);
int		 ggetobj(const char *, int (*)(struct obj *), int);
int		 askchain(struct obj *, char *, int, int (*)(struct obj *),
			  bool (*)(struct obj *), int);
void		 prinv(struct obj *);
int		 ddoinv(void);
int		 dotypeinv(void);
int		 dolook(void);
void		 stackobj(struct obj *);
int		 doprgold(void);
int		 doprwep(void);
int		 doprarm(void);
int		 doprring(void);
bool		 digit(char);

/* hack.ioctl.c */
void	getioctls(void);
void	setioctls(void);
#ifdef SUSPEND
int	dosuspend(void);
#endif

/* hack.lev.c */
void	savelev(int, xchar);
void	bwrite(int, char *, unsigned int);
void	saveobjchn(int, struct obj *);
void	savemonchn(int, struct monst *);
void	getlev(int, int, xchar);
void	mread(int, char *, unsigned int);
void	mklev(void);

/* hack.main.c */
void	glo(int);
void	askname(void);
void	impossible(const char *, ...) __printflike(1, 2);
void	stop_occupation(void);

/* hack.makemon.c */
struct monst	*makemon(struct permonst *, int, int);
coord		 enexto(xchar, xchar);
bool		 goodpos(int, int);
void		 rloc(struct monst *);
struct monst	*mkmon_at(char, int, int);

/* hack.mhitu.c */
bool	mhitu(struct monst *);
bool	hitu(struct monst *, int);

/* hack.mklev.c */
void	makelevel(void);
void	mktrap(int, int, struct mkroom *);

/* hack.mkmaze.c */
void	makemaz(void);
coord	mazexy(void);

/* hack.mkobj.c */
struct obj	*mkobj_at(int, int, int);
void		 mksobj_at(int, int, int);
struct obj	*mkobj(int);
struct obj	*mksobj(int);
bool		 letter(char);
int		 weight(struct obj *);
void		 mkgold(long, int, int);

/* hack.mkshop.c */
#ifndef QUEST
void	mkshop(void);
void	mkzoo(int);
void	mkswamp(void);
#endif

/* hack.mon.c */
void	movemon(void);
void	justswld(struct monst *, const char *);
void	youswld(struct monst *, int, int, const char *);
bool	dochug(struct monst *);
int	m_move(struct monst *, int);
int	mfndpos(struct monst *, coord *, int *, int);
int	dist(int, int);
void	poisoned(const char *, const char *);
void	mondead(struct monst *);
void	replmon(struct monst *, struct monst *);
void	relmon(struct monst *);
void	monfree(struct monst *);
void	unstuck(struct monst *);
void	killed(struct monst *);
void	kludge(const char *, const char *);
void	rescham(void);
bool	newcham(struct monst *, struct permonst *);
void	mnexto(struct monst *);
void	setmangry(struct monst *);
bool	canseemon(struct monst *);

/* hack.o_init.c */
int	letindex(char);
void	init_objects(void);
int	probtype(char);
void	oinit(void);
void	savenames(int);
void	restnames(int);
int	dodiscovered(void);

/* hack.objnam.c */
char		*typename(int);
char		*xname(struct obj *);
char		*doname(struct obj *);
void		 setan(const char *, char *);
char		*aobjnam(struct obj *, const char *);
char		*Doname(struct obj *);
struct obj	*readobjnam(char *);

/* hack.options.c */
void	initoptions(void);
int	doset(void);

/* hack.pager.c */
int	dowhatis(void);
void	set_whole_screen(void);
#ifdef NEWS
bool	readnews(void);
#endif
void	set_pager(int);
bool	page_line(const char *);
void	cornline(int, const char *);
int	dohelp(void);
bool	page_file(const char *, bool);
#ifdef UNIX
#ifdef SHELL
int	dosh(void);
#endif /* SHELL */
bool	child(bool);
#endif /* UNIX */

/* hack.potion.c */
int	dodrink(void);
void	pluslvl(void);
void	strange_feeling(struct obj *, const char *);
void	potionhit(struct monst *, struct obj *);
void	potionbreathe(struct obj *);
int	dodip(void);

/* hack.pri.c */
void	swallowed(void);
void	panic(const char *, ...) __printflike(1, 2);
void	atl(int, int, char);
void	on_scr(int, int);
void	tmp_at(schar, schar);
void	Tmp_at(schar, schar);
void	setclipped(void);
void	at(xchar, xchar, char);
void	prme(void);
int	doredraw(void);
void	docrt(void);
void	docorner(int, int);
void	curs_on_u(void);
void	pru(void);
void	prl(int, int);
char	news0(xchar, xchar);
void	newsym(int, int);
void	mnewsym(int, int);
void	nosee(int, int);
#ifndef QUEST
void	prl1(int, int);
void	nose1(int, int);
#endif
bool	vism_at(int, int);
void	unpobj(struct obj *);
void	seeobjs(void);
void	seemons(void);
void	pmon(struct monst *);
void	unpmon(struct monst *);
void	nscr(void);
void	bot(void);
#ifdef WAN_PROBING
void	mstatusline(struct monst *);
#endif
void	cls(void);

/* hack.read.c */
int	doread(void);
int	identify(struct obj *);
void	litroom(bool);

/* hack.rip.c */
void	outrip(void);

/* hack.rumors.c */
void	outrumor(void);

/* hack.save.c */
int		 dosave(void);
#ifndef NOSAVEONHANGUP
void		 hangup(int);
#endif
bool		 dorecover(int);
struct obj	*restobjchn(int);
struct monst	*restmonchn(int);

/* hack.search.c */
int	findit(void);
int	dosearch(void);
int	doidtrap(void);
void	wakeup(struct monst *);
void	seemimic(struct monst *);

/* hack.shk.c */
#ifdef QUEST
void		 obfree(struct obj *, struct obj *);
int		 inshop(void);
void		 shopdig(void);
void		 addtobill(void);
void		 subfrombill(void);
void		 splitbill(void);
int		 dopay(void);
void		 paybill(void);
int		 doinvbill(void);
void		 shkdead(void);
int		 shkcatch(void);
int		 shk_move(void);
void		 replshk(struct monst *, struct monst *);
const char	*shkname(void);
#else
char		*shkname(struct monst *);
void		 shkdead(struct monst *);
void		 replshk(struct monst *, struct monst *);
int		 inshop(void);
void		 obfree(struct obj *, struct obj *);
int		 dopay(void);
void		 paybill(void);
void		 addtobill(struct obj *);
void		 splitbill(struct obj *, struct obj *);
void		 subfrombill(struct obj *);
int		 doinvbill(int);
bool		 shkcatch(struct obj *);
int		 shk_move(struct monst *);
void		 shopdig(int);
#endif
bool		 online(int, int);
bool		 follower(struct monst *);

/* hack.shknam.c */
void	findname(char *, char);

/* hack.steal.c */
long	somegold(void);
void	stealgold(struct monst *);
bool	steal(struct monst *);
void	mpickobj(struct monst *, struct obj *);
bool	stealamulet(struct monst *);
void	relobj(struct monst *, int);

/* hack.termcap.c */
void	startup(void);
void	start_screen(void);
void	end_screen(void);
void	curs(int, int);
void	cl_end(void);
void	clear_screen(void);
void	home(void);
void	standoutbeg(void);
void	standoutend(void);
void	backsp(void);
void	bell(void);
void	cl_eos(void);

/* hack.timeout.c */
void	p_timeout(void);

/* hack.topl.c */
int	doredotopl(void);
void	remember_topl(void);
void	addtopl(const char *);
void	more(void);
void	cmore(const char *);
void	clrlin(void);
void	pline(const char *, ...) __printflike(1, 2);
void	vpline(const char *, va_list) __printflike(1, 0);
void	putsym(char);
void	putstr(const char *);

/* hack.track.c */
void	 initrack(void);
void	 settrack(void);
coord	*gettrack(int, int);

/* hack.trap.c */
struct trap	*maketrap(int, int, int);
void		 dotrap(struct trap *);
int		 mintrap(struct monst *);
void		 selftouch(const char *);
void		 float_up(void);
void		 float_down(void);
void		 tele(void);
int		 dotele(void);
void		 placebc(int);
void		 unplacebc(void);
void		 level_tele(void);
void		 drown(void);

/* hack.tty.c */
void	 gettty(void);
void	 settty(const char *);
void	 setftty(void);
void	 error(const char *, ...) __printflike(1, 2);
void	 getlin(char *);
void	 getret(void);
void	 cgetret(const char *);
void	 xwaitforspace(const char *);
char	*parse(void);
char	 readchar(void);
void	 end_of_input(void);

/* hack.u_init.c */
void	u_init(void);
void	plnamesuffix(void);

/* hack.unix.c */
void	 setrandom(void);
int	 getyear(void);
char	*getdate(void);
int	 phase_of_the_moon(void);
bool	 night(void);
bool	 midnight(void);
void	 gethdate(const char *);
bool	 uptodate(int);
void	 getlock(void);
#ifdef MAIL
void	 getmailstatus(void);
void	 ckmailstatus(void);
void	 readmail(void);
#endif
void	 regularize(char *);

/* hack.vault.c */
void	setgd(void);
int	gd_move(void);
void	replgd(struct monst *, struct monst *);
void	invault(void);
#ifdef QUEST
void	gddead(struct monst *);
#else
void	gddead(void);
#endif

/* hack.version.c */
int	doversion(void);

/* hack.wield.c */
void	setuwep(struct obj *);
int	dowield(void);
void	corrode_weapon(void);
bool	chwepon(struct obj *, int);

/* hack.wizard.c */
void	amulet(void);
bool	wiz_hit(struct monst *);
void	inrange(struct monst *);

/* hack.worm.c */
#ifndef NOWORM
bool	getwn(struct monst *);
void	initworm(struct monst *);
void	worm_move(struct monst *);
void	worm_nomove(struct monst *);
void	wormdead(struct monst *);
void	wormhit(struct monst *);
void	wormsee(unsigned int);
void	pwseg(struct wseg *);
void	cutworm(struct monst *, xchar, xchar, uchar);
#endif

/* hack.worn.c */
void	setworn(struct obj *, long);
void	setnotworn(struct obj *);

/* hack.zap.c */
int		 dozap(void);
const char	*exclam(int);
void		 hit(const char *, struct monst *, const char *);
void		 miss(const char *, struct monst *);
struct monst	*bhit(int, int, int, char,
		      void (*)(struct monst *, struct obj *),
		      bool (*)(struct obj *, struct obj *), struct obj *);
struct monst	*boomhit(int, int);
void		 buzz(int, xchar, xchar, int, int);
void		 fracture_rock(struct obj *);

/* rnd.c */
int	rn1(int, int);
int	rn2(int);
int	rnd(int);
int	d(int, int);