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
10struct 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
70/* primary damage: fire/rust/--- */
71/* is_flammable(otmp), is_rottable(otmp) in mkobj.c */
72#define is_rustprone(otmp)	(objects[otmp->otyp].oc_material == IRON)
73
74/* secondary damage: rot/acid/acid */
75#define is_corrodeable(otmp)	(objects[otmp->otyp].oc_material == COPPER || objects[otmp->otyp].oc_material == IRON)
76
77#define is_damageable(otmp) (is_rustprone(otmp) || is_flammable(otmp) || \
78				is_rottable(otmp) || is_corrodeable(otmp))
79
80	schar	oc_subtyp;
81#define oc_skill	oc_subtyp   /* Skills of weapons, spellbooks, tools, gems */
82#define oc_armcat	oc_subtyp   /* for armor */
83#define ARM_SHIELD	1	/* needed for special wear function */
84#define ARM_HELM	2
85#define ARM_GLOVES	3
86#define ARM_BOOTS	4
87#define ARM_CLOAK	5
88#define ARM_SHIRT	6
89#define ARM_SUIT	0
90
91	uchar	oc_oprop;		/* property (invis, &c.) conveyed */
92	char	oc_class;		/* object class */
93	schar	oc_delay;		/* delay when using such an object */
94	uchar	oc_color;		/* color of the object */
95
96	short	oc_prob;		/* probability, used in mkobj() */
97	unsigned short	oc_weight;	/* encumbrance (1 cn = 0.1 lb.) */
98	short	oc_cost;		/* base cost in shops */
99/* Check the AD&D rules!  The FIRST is small monster damage. */
100/* for weapons, and tools, rocks, and gems useful as weapons */
101	schar	oc_wsdam, oc_wldam;	/* max small/large monster damage */
102	schar	oc_oc1, oc_oc2;
103#define oc_hitbon	oc_oc1		/* weapons: "to hit" bonus */
104
105#define a_ac		oc_oc1	/* armor class, used in ARM_BONUS in do.c */
106#define a_can		oc_oc2		/* armor: used in mhitu.c */
107#define oc_level	oc_oc2		/* books: spell level */
108
109	unsigned short	oc_nutrition;	/* food value */
110};
111
112struct objdescr {
113	const char *oc_name;		/* actual name */
114	const char *oc_descr;		/* description when name unknown */
115};
116
117extern NEARDATA struct objclass objects[];
118extern NEARDATA struct objdescr obj_descr[];
119
120/*
121 * All objects have a class. Make sure that all classes have a corresponding
122 * symbol below.
123 */
124#define RANDOM_CLASS	 0	/* used for generating random objects */
125#define ILLOBJ_CLASS	 1
126#define WEAPON_CLASS	 2
127#define ARMOR_CLASS	 3
128#define RING_CLASS	 4
129#define AMULET_CLASS	 5
130#define TOOL_CLASS	 6
131#define FOOD_CLASS	 7
132#define POTION_CLASS	 8
133#define SCROLL_CLASS	 9
134#define SPBOOK_CLASS	10	/* actually SPELL-book */
135#define WAND_CLASS	11
136#define COIN_CLASS	12
137#define GEM_CLASS	13
138#define ROCK_CLASS	14
139#define BALL_CLASS	15
140#define CHAIN_CLASS	16
141#define VENOM_CLASS	17
142#define MAXOCLASSES	18
143
144#define ALLOW_COUNT	(MAXOCLASSES+1) /* Can be used in the object class */
145#define ALL_CLASSES	(MAXOCLASSES+2) /* input to getobj().		   */
146#define ALLOW_NONE	(MAXOCLASSES+3) /*				   */
147
148#define BURNING_OIL	(MAXOCLASSES+1) /* Can be used as input to explode. */
149#define MON_EXPLODE	(MAXOCLASSES+2) /* Exploding monster (e.g. gas spore) */
150
151#if 0	/* moved to decl.h so that makedefs.c won't see them */
152extern const char def_oc_syms[MAXOCLASSES];	/* default class symbols */
153extern uchar oc_syms[MAXOCLASSES];		/* current class symbols */
154#endif
155
156/* Default definitions of all object-symbols (must match classes above). */
157
158#define ILLOBJ_SYM	']'	/* also used for mimics */
159#define WEAPON_SYM	')'
160#define ARMOR_SYM	'['
161#define RING_SYM	'='
162#define AMULET_SYM	'"'
163#define TOOL_SYM	'('
164#define FOOD_SYM	'%'
165#define POTION_SYM	'!'
166#define SCROLL_SYM	'?'
167#define SPBOOK_SYM	'+'
168#define WAND_SYM	'/'
169#define GOLD_SYM	'$'
170#define GEM_SYM		'*'
171#define ROCK_SYM	'`'
172#define BALL_SYM	'0'
173#define CHAIN_SYM	'_'
174#define VENOM_SYM	'.'
175
176struct fruit {
177	char fname[PL_FSIZ];
178	int fid;
179	struct fruit *nextf;
180};
181#define newfruit() (struct fruit *)alloc(sizeof(struct fruit))
182#define dealloc_fruit(rind) free((genericptr_t) (rind))
183
184#define OBJ_NAME(obj)  (obj_descr[(obj).oc_name_idx].oc_name)
185#define OBJ_DESCR(obj) (obj_descr[(obj).oc_descr_idx].oc_descr)
186#endif /* OBJCLASS_H */
187