1 /*	SCCS Id: @(#)objclass.h 3.4	1996/06/16	*/
2 /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
3 /* NetHack may be freely redistributed.  See license for details. */
4 
5 #ifndef OBJCLASS_H
6 #define OBJCLASS_H
7 
8 /* definition of a class of objects */
9 
10 struct objclass {
11 	short	oc_name_idx;		/* index of actual name */
12 	short	oc_descr_idx;		/* description when name unknown */
13 	char *	oc_uname;		/* called by user */
14 	Bitfield(oc_name_known,1);
15 	Bitfield(oc_merge,1);	/* merge otherwise equal objects */
16 	Bitfield(oc_uses_known,1); /* obj->known affects full decription */
17 				/* otherwise, obj->dknown and obj->bknown */
18 				/* tell all, and obj->known should always */
19 				/* be set for proper merging behavior */
20 	Bitfield(oc_pre_discovered,1);	/* Already known at start of game; */
21 					/* won't be listed as a discovery. */
22 	Bitfield(oc_magic,1);	/* inherently magical object */
23 	Bitfield(oc_charged,1); /* may have +n or (n) charges */
24 	Bitfield(oc_unique,1);	/* special one-of-a-kind object */
25 	Bitfield(oc_nowish,1);	/* cannot wish for this object */
26 
27 	Bitfield(oc_big,1);
28 #define oc_bimanual	oc_big	/* for weapons & tools used as weapons */
29 #define oc_bulky	oc_big	/* for armor */
30 	Bitfield(oc_tough,1);	/* hard gems/rings */
31 
32 	Bitfield(oc_dir,2);
33 #define NODIR		1	/* for wands/spells: non-directional */
34 #define IMMEDIATE	2	/*		     directional */
35 #define RAY		3	/*		     zap beams */
36 
37 #define PIERCE		1	/* for weapons & tools used as weapons */
38 #define SLASH		2	/* (latter includes iron ball & chain) */
39 #define WHACK		0
40 
41 	/*Bitfield(oc_subtyp,3);*/	/* Now too big for a bitfield... see below */
42 
43 	Bitfield(oc_material,5);
44 #define LIQUID		1	/* currently only for venom */
45 #define WAX		2
46 #define VEGGY		3	/* foodstuffs */
47 #define FLESH		4	/*   ditto    */
48 #define PAPER		5
49 #define CLOTH		6
50 #define LEATHER		7
51 #define WOOD		8
52 #define BONE		9
53 #define DRAGON_HIDE	10	/* not leather! */
54 #define IRON		11	/* Fe - includes steel */
55 #define METAL		12	/* Sn, &c. */
56 #define COPPER		13	/* Cu - includes brass */
57 #define SILVER		14	/* Ag */
58 #define GOLD		15	/* Au */
59 #define PLATINUM	16	/* Pt */
60 #define MITHRIL		17
61 #define PLASTIC		18
62 #define GLASS		19
63 #define GEMSTONE	20
64 #define MINERAL		21
65 
66 #define is_organic(otmp)	(objects[otmp->otyp].oc_material <= WOOD)
67 #define is_metallic(otmp)	(objects[otmp->otyp].oc_material >= IRON && \
68 				 objects[otmp->otyp].oc_material <= MITHRIL)
69 #define is_iron(otmp)		(objects[otmp->otyp].oc_material == IRON)
70 #define is_silver(otmp)		(objects[otmp->otyp].oc_material == SILVER)
71 
72 /* primary damage: fire/rust/--- */
73 /* is_flammable(otmp), is_rottable(otmp) in mkobj.c */
74 #define is_rustprone(otmp)	(objects[otmp->otyp].oc_material == IRON)
75 
76 /* secondary damage: rot/acid/acid */
77 #define is_corrodeable(otmp)	(objects[otmp->otyp].oc_material == COPPER || objects[otmp->otyp].oc_material == IRON)
78 
79 #define is_damageable(otmp) (is_rustprone(otmp) || is_flammable(otmp) || \
80 				is_rottable(otmp) || is_corrodeable(otmp))
81 
82 	schar	oc_subtyp;
83 #define oc_skill	oc_subtyp   /* Skills of weapons, spellbooks, tools, gems */
84 #define oc_armcat	oc_subtyp   /* for armor */
85 #define ARM_SHIELD	1	/* needed for special wear function */
86 #define ARM_HELM	2
87 #define ARM_GLOVES	3
88 #define ARM_BOOTS	4
89 #define ARM_CLOAK	5
90 #define ARM_SHIRT	6
91 #define ARM_SUIT	0
92 
93 	uchar	oc_oprop;		/* property (invis, &c.) conveyed */
94 	char	oc_class;		/* object class */
95 	glyph_t	unicode_codepoint;	/* unicode codepoint for utf8graphics */
96 	schar	oc_delay;		/* delay when using such an object */
97 	uchar	oc_color;		/* color of the object */
98 
99 	short	oc_prob;		/* probability, used in mkobj() */
100 	unsigned short	oc_weight;	/* encumbrance (1 cn = 0.1 lb.) */
101 	short	oc_cost;		/* base cost in shops */
102 /* Check the AD&D rules!  The FIRST is small monster damage. */
103 /* for weapons, and tools, rocks, and gems useful as weapons */
104 	schar	oc_wsdam, oc_wldam;	/* max small/large monster damage */
105 	schar	oc_oc1, oc_oc2;
106 #define oc_hitbon	oc_oc1		/* weapons: "to hit" bonus */
107 
108 #define a_ac		oc_oc1	/* armor class, used in ARM_BONUS in do.c */
109 #define a_can		oc_oc2		/* armor: used in mhitu.c */
110 #define oc_level	oc_oc2		/* books: spell level */
111 
112 	unsigned short	oc_nutrition;	/* food value */
113 };
114 
115 struct objdescr {
116 	const char *oc_name;		/* actual name */
117 	const char *oc_descr;		/* description when name unknown */
118 };
119 
120 extern NEARDATA struct objclass objects[];
121 extern NEARDATA struct objdescr obj_descr[];
122 
123 /*
124  * All objects have a class. Make sure that all classes have a corresponding
125  * symbol below.
126  */
127 #define RANDOM_CLASS	 0	/* used for generating random objects */
128 #define ILLOBJ_CLASS	 1
129 #define WEAPON_CLASS	 2
130 #define ARMOR_CLASS	 3
131 #define RING_CLASS	 4
132 #define AMULET_CLASS	 5
133 #define TOOL_CLASS	 6
134 #define FOOD_CLASS	 7
135 #define POTION_CLASS	 8
136 #define SCROLL_CLASS	 9
137 #define SPBOOK_CLASS	10	/* actually SPELL-book */
138 #define WAND_CLASS	11
139 #define COIN_CLASS	12
140 #define GEM_CLASS	13
141 #define ROCK_CLASS	14
142 #define BALL_CLASS	15
143 #define CHAIN_CLASS	16
144 #define VENOM_CLASS	17
145 #define MAXOCLASSES	18
146 
147 #define ALLOW_COUNT	(MAXOCLASSES+1) /* Can be used in the object class */
148 #define ALL_CLASSES	(MAXOCLASSES+2) /* input to getobj().		   */
149 #define ALLOW_NONE	(MAXOCLASSES+3) /*				   */
150 
151 #define BURNING_OIL	(MAXOCLASSES+1) /* Can be used as input to explode. */
152 #define MON_EXPLODE	(MAXOCLASSES+2) /* Exploding monster (e.g. gas spore) */
153 
154 #if 0	/* moved to decl.h so that makedefs.c won't see them */
155 extern const char def_oc_syms[MAXOCLASSES];	/* default class symbols */
156 extern uchar oc_syms[MAXOCLASSES];		/* current class symbols */
157 #endif
158 
159 /* Default definitions of all object-symbols (must match classes above). */
160 
161 #define ILLOBJ_SYM	']'	/* also used for mimics */
162 #define WEAPON_SYM	')'
163 #define ARMOR_SYM	'['
164 #define RING_SYM	'='
165 #define AMULET_SYM	'"'
166 #define TOOL_SYM	'('
167 #define FOOD_SYM	'%'
168 #define POTION_SYM	'!'
169 #define SCROLL_SYM	'?'
170 #define SPBOOK_SYM	'+'
171 #define WAND_SYM	'/'
172 #define GOLD_SYM	'$'
173 #define GEM_SYM		'*'
174 #define ROCK_SYM	'`'
175 #define BALL_SYM	'0'
176 #define CHAIN_SYM	'_'
177 #define VENOM_SYM	'.'
178 
179 struct fruit {
180 	char fname[PL_FSIZ];
181 	int fid;
182 	struct fruit *nextf;
183 };
184 #define newfruit() (struct fruit *)alloc(sizeof(struct fruit))
185 #define dealloc_fruit(rind) free((genericptr_t) (rind))
186 
187 #define OBJ_NAME(obj)  (obj_descr[(obj).oc_name_idx].oc_name)
188 #define OBJ_DESCR(obj) (obj_descr[(obj).oc_descr_idx].oc_descr)
189 #endif /* OBJCLASS_H */
190