1 /* SCCS Id: @(#)you.h 3.4 2000/05/21 */
2 /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
3 /* NetHack may be freely redistributed. See license for details. */
11 #include "prop.h" /* (needed here for util/makedefs.c) */
15 /*** Substructures ***/
18 const char *m; /* name when character is male */
19 const char *f; /* when female; null if same as male */
23 /* "fix" is the fixed amount, "rnd" is the random amount */
24 xchar infix, inrnd; /* at character initialization */
25 xchar lofix, lornd; /* gained per level < urole.xlev */
26 xchar hifix, hirnd; /* gained per level >= urole.xlev */
30 Bitfield(amulet,1); /* carrying Amulet */
31 Bitfield(bell,1); /* carrying Bell */
32 Bitfield(book,1); /* carrying Book */
33 Bitfield(menorah,1); /* carrying Candelabrum */
34 Bitfield(questart,1); /* carrying the Quest Artifact */
39 Bitfield(minor_oracle,1); /* received at least 1 cheap oracle */
40 Bitfield(major_oracle,1); /* " expensive oracle */
41 Bitfield(qcalled,1); /* called by Quest leader to do task */
42 Bitfield(qexpelled,1); /* expelled from the Quest dungeon */
43 Bitfield(qcompleted,1); /* successfully completed Quest task */
44 Bitfield(uheard_tune,2); /* 1=know about, 2=heard passtune */
45 Bitfield(uopened_dbridge,1); /* opened the drawbridge */
47 Bitfield(invoked,1); /* invoked Gate to the Sanctum level */
48 Bitfield(gehennom_entered,1); /* entered Gehennom via Valley */
50 Bitfield(uhand_of_elbereth,2); /* became Hand of Elbereth */
52 Bitfield(udemigod,1); /* killed the wiz */
53 Bitfield(ascended,1); /* has offered the Amulet */
57 * These are voluntary challenges. Each field denotes the number of
58 * times a challenge has been violated.
60 struct u_conduct { /* number of times... */
61 long unvegetarian; /* eaten any animal */
62 long unvegan; /* ... or any animal byproduct */
63 long food; /* ... or any comestible */
64 long gnostic; /* used prayer, priest, or altar */
65 long weaphit; /* hit a monster with a weapon */
66 long killer; /* killed a monster yourself */
67 long literate; /* read something (other than BotD) */
68 long polypiles; /* polymorphed an object */
69 long polyselfs; /* transformed yourself */
70 long wishes; /* used a wish */
71 long wisharti; /* wished for an artifact */
72 /* genocides already listed at end of game */
75 /*** Unified structure containing role information ***/
77 /*** Strings that name various things ***/
78 struct RoleName name; /* the role's name (from u_init.c) */
79 struct RoleName rank[9]; /* names for experience levels (from botl.c) */
80 const char *lgod, *ngod, *cgod; /* god names (from pray.c) */
81 const char *filecode; /* abbreviation for use in file names */
82 const char *homebase; /* quest leader's location (from questpgr.c) */
83 const char *intermed; /* quest intermediate goal (from questpgr.c) */
85 /*** Indices of important monsters and objects ***/
86 short malenum, /* index (PM_) as a male (botl.c) */
87 femalenum, /* ...or as a female (NON_PM == same) */
88 petnum, /* PM_ of preferred pet (NON_PM == random) */
89 ldrnum, /* PM_ of quest leader (questpgr.c) */
90 guardnum, /* PM_ of quest guardians (questpgr.c) */
91 neminum, /* PM_ of quest nemesis (questpgr.c) */
92 enemy1num, /* specific quest enemies (NON_PM == random) */
94 char enemy1sym, /* quest enemies by class (S_) */
96 short questarti; /* index (ART_) of quest artifact (questpgr.c) */
99 short allow; /* bit mask of allowed variations */
100 #define ROLE_RACEMASK 0x0ff8 /* allowable races */
101 #define ROLE_GENDMASK 0xf000 /* allowable genders */
102 #define ROLE_MALE 0x1000
103 #define ROLE_FEMALE 0x2000
104 #define ROLE_NEUTER 0x4000
105 #define ROLE_ALIGNMASK AM_MASK /* allowable alignments */
106 #define ROLE_LAWFUL AM_LAWFUL
107 #define ROLE_NEUTRAL AM_NEUTRAL
108 #define ROLE_CHAOTIC AM_CHAOTIC
110 /*** Attributes (from attrib.c and exper.c) ***/
111 xchar attrbase[A_MAX]; /* lowest initial attributes */
112 xchar attrdist[A_MAX]; /* distribution of initial attributes */
113 struct RoleAdvance hpadv; /* hit point advancement */
114 struct RoleAdvance enadv; /* energy advancement */
115 xchar xlev; /* cutoff experience level */
116 xchar initrecord; /* initial alignment record */
118 /*** Spell statistics (from spell.c) ***/
119 int spelbase; /* base spellcasting penalty */
120 int spelheal; /* penalty (-bonus) for healing spells */
121 int spelshld; /* penalty for wearing any shield */
122 int spelarmr; /* penalty for wearing metal armour */
123 int spelstat; /* which stat (A_) is used */
124 int spelspec; /* spell (SPE_) the class excels at */
125 int spelsbon; /* penalty (-bonus) for that spell */
127 /*** Properties in variable-length arrays ***/
128 /* intrinsics (see attrib.c) */
129 /* initial inventory (see u_init.c) */
130 /* skills (see u_init.c) */
132 /*** Don't forget to add... ***/
133 /* quest leader, guardians, nemesis (monst.c) */
134 /* quest artifact (artilist.h) */
135 /* quest dungeon definition (dat/Xyz.dat) */
136 /* quest text (dat/quest.txt) */
137 /* dictionary entries (dat/data.bas) */
140 extern const struct Role roles[]; /* table of available roles */
141 extern struct Role urole;
142 #define Role_if(X) (urole.malenum == (X))
143 #define Role_switch (urole.malenum)
145 /* used during initialization for race, gender, and alignment
146 as well as for character class */
147 #define ROLE_NONE (-1)
148 #define ROLE_RANDOM (-2)
150 /*** Unified structure specifying race information ***/
153 /*** Strings that name various things ***/
154 const char *noun; /* noun ("human", "elf") */
155 const char *adj; /* adjective ("human", "elven") */
156 const char *coll; /* collective ("humanity", "elvenkind") */
157 const char *filecode; /* code for filenames */
158 struct RoleName individual; /* individual as a noun ("man", "elf") */
160 /*** Indices of important monsters and objects ***/
161 short malenum, /* PM_ as a male monster */
162 femalenum, /* ...or as a female (NON_PM == same) */
163 mummynum, /* PM_ as a mummy */
164 zombienum; /* PM_ as a zombie */
167 short allow; /* bit mask of allowed variations */
168 short selfmask, /* your own race's bit mask */
169 lovemask, /* bit mask of always peaceful */
170 hatemask; /* bit mask of always hostile */
173 xchar attrmin[A_MAX]; /* minimum allowable attribute */
174 xchar attrmax[A_MAX]; /* maximum allowable attribute */
175 struct RoleAdvance hpadv; /* hit point advancement */
176 struct RoleAdvance enadv; /* energy advancement */
178 int nv_range; /* night vision range */
179 int xray_range; /* X-ray vision range */
182 /*** Properties in variable-length arrays ***/
183 /* intrinsics (see attrib.c) */
185 /*** Don't forget to add... ***/
186 /* quest leader, guardians, nemesis (monst.c) */
187 /* quest dungeon definition (dat/Xyz.dat) */
188 /* quest text (dat/quest.txt) */
189 /* dictionary entries (dat/data.bas) */
192 extern const struct Race races[]; /* Table of available races */
193 extern struct Race urace;
194 #define Race_if(X) (urace.malenum == (X))
195 #define Race_switch (urace.malenum)
197 /*** Unified structure specifying gender information ***/
199 const char *adj; /* male/female/neuter */
200 const char *he; /* he/she/it */
201 const char *him; /* him/her/it */
202 const char *his; /* his/her/its */
203 const char *filecode; /* file code */
204 short allow; /* equivalent ROLE_ mask */
206 #define ROLE_GENDERS 2 /* number of permitted player genders */
207 /* increment to 3 if you allow neuter roles */
209 extern const struct Gender genders[]; /* table of available genders */
210 #define uhe() (genders[flags.female ? 1 : 0].he)
211 #define uhim() (genders[flags.female ? 1 : 0].him)
212 #define uhis() (genders[flags.female ? 1 : 0].his)
213 #define mhe(mtmp) (genders[pronoun_gender(mtmp)].he)
214 #define mhim(mtmp) (genders[pronoun_gender(mtmp)].him)
215 #define mhis(mtmp) (genders[pronoun_gender(mtmp)].his)
218 /*** Unified structure specifying alignment information ***/
220 const char *noun; /* law/balance/chaos */
221 const char *adj; /* lawful/neutral/chaotic */
222 const char *filecode; /* file code */
223 short allow; /* equivalent ROLE_ mask */
224 aligntyp value; /* equivalent A_ value */
226 #define ROLE_ALIGNS 3 /* number of permitted player alignments */
228 extern const struct Align aligns[]; /* table of available alignments */
231 /*** Information about the player ***/
234 schar dx, dy, dz; /* direction of move (or zap or ... ) */
235 schar di; /* direction of FF */
236 xchar tx, ty; /* destination of travel */
237 xchar ux0, uy0; /* initial position FF */
238 d_level uz, uz0; /* your level on this and the previous turn */
239 d_level utolev; /* level monster teleported you to, or uz */
240 uchar utotype; /* bitmask of goto_level() flags for utolev */
241 boolean umoved; /* changed map location (post-move) */
242 int last_str_turn; /* 0: none, 1: half turn, 2: full turn */
243 /* +: turn right, -: turn left */
244 int ulevel; /* 1 to MAXULEV */
246 unsigned utrap; /* trap timeout */
247 unsigned utraptype; /* defined if utrap nonzero */
248 #define TT_BEARTRAP 0
253 char urooms[5]; /* rooms (roomno + 3) occupied now */
254 char urooms0[5]; /* ditto, for previous position */
255 char uentered[5]; /* rooms (roomno + 3) entered this turn */
256 char ushops[5]; /* shop rooms (roomno + 3) occupied now */
257 char ushops0[5]; /* ditto, for previous position */
258 char ushops_entered[5]; /* ditto, shops entered this turn */
259 char ushops_left[5]; /* ditto, shops exited this turn */
261 int uhunger; /* refd only in eat.c and shk.c */
262 unsigned uhs; /* hunger state - see eat.c */
264 struct prop uprops[LAST_PROP+1];
267 char usick_cause[PL_PSIZ+20]; /* sizeof "unicorn horn named "+1 */
268 Bitfield(usick_type,2);
269 #define SICK_VOMITABLE 0x01
270 #define SICK_NONVOMITABLE 0x02
271 #define SICK_ALL 0x03
273 /* These ranges can never be more than MAX_RANGE (vision.h). */
274 int nv_range; /* current night vision range */
275 int xray_range; /* current xray vision range */
278 * These variables are valid globally only when punished and blind.
280 #define BC_BALL 0x01 /* bit mask for ball in 'bc_felt' below */
281 #define BC_CHAIN 0x02 /* bit mask for chain in 'bc_felt' below */
282 int bglyph; /* glyph under the ball */
283 int cglyph; /* glyph under the chain */
284 int bc_order; /* ball & chain order [see bc_order() in ball.c] */
285 int bc_felt; /* mask for ball/chain being felt */
287 int umonster; /* hero's "real" monster num */
288 int umonnum; /* current monster number */
290 int mh, mhmax, mtimedone; /* for polymorph-self */
291 struct attribs macurr, /* for monster attribs */
292 mamax; /* for monster attribs */
293 int ulycn; /* lycanthrope type */
296 unsigned uswldtim; /* time you have been swallowed */
298 Bitfield(uswallow,1); /* true if swallowed */
299 Bitfield(uinwater,1); /* if you're currently in water (only
300 underwater possible currently) */
301 Bitfield(uundetected,1); /* if you're a hiding monster/piercer */
302 Bitfield(mfemale,1); /* saved human value of flags.female */
303 Bitfield(uinvulnerable,1); /* you're invulnerable (praying) */
304 Bitfield(uburied,1); /* you're buried */
305 Bitfield(uedibility,1); /* blessed food detection; sense unsafe food */
308 unsigned udg_cnt; /* how long you have been demigod */
309 struct u_event uevent; /* certain events have happened */
310 struct u_have uhave; /* you're carrying special objects */
311 struct u_conduct uconduct; /* KMH, conduct */
312 struct attribs acurr, /* your current attributes (eg. str)*/
313 aexe, /* for gain/loss via "exercise" */
314 abon, /* your bonus attributes (eg. str) */
315 amax, /* your max attributes (eg. str) */
316 atemp, /* used for temporary loss/gain */
317 atime; /* used for loss/gain countdown */
318 align ualign; /* character alignment */
322 aligntyp ualignbase[CONVERT]; /* for ualign conversion record */
323 schar uluck, moreluck; /* luck and luck bonus */
324 #define Luck (u.uluck + u.moreluck)
325 #define LUCKADD 3 /* added value when carrying luck stone */
326 #define LUCKMAX 10 /* on moonlit nights 11 */
327 #define LUCKMIN (-10)
331 uchar uspellprot; /* protection by SPE_PROTECTION */
332 uchar usptime; /* #moves until uspellprot-- */
333 uchar uspmtime; /* #moves between uspellprot-- */
335 int uen, uenmax; /* magical energy - M. Stephenson */
336 int ugangr; /* if the gods are angry at you */
337 int ugifts; /* number of artifacts bestowed */
338 int ublessed, ublesscnt; /* blessing/duration from #pray */
345 long ucleansed; /* to record moves when player was cleansed */
346 long usleep; /* sleeping; monstermove you last started */
348 struct monst *ustuck;
350 struct monst *usteed;
354 int umortality; /* how many times you died */
355 int ugrave_arise; /* you die and become something aside from a ghost */
356 time_t ubirthday; /* real world time when game began */
358 int weapon_slots; /* unused skill slots */
359 int skills_advanced; /* # of advances made so far */
360 xchar skill_record[P_SKILL_LIMIT]; /* skill advancements */
361 struct skills weapon_skills[P_NUM_SKILLS];
362 boolean twoweap; /* KMH -- Using two-weapon combat */
364 }; /* end of `struct you' */
366 #define Upolyd (u.umonnum != u.umonster)