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. */
8 /* definition of a class of objects */
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 */
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 */
33 #define NODIR 1 /* for wands/spells: non-directional */
34 #define IMMEDIATE 2 /* directional */
35 #define RAY 3 /* zap beams */
37 #define PIERCE 1 /* for weapons & tools used as weapons */
38 #define SLASH 2 /* (latter includes iron ball & chain) */
41 /*Bitfield(oc_subtyp,3);*/ /* Now too big for a bitfield... see below */
43 Bitfield(oc_material,5);
44 #define LIQUID 1 /* currently only for venom */
46 #define VEGGY 3 /* foodstuffs */
47 #define FLESH 4 /* ditto */
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 */
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)
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)
74 /* secondary damage: rot/acid/acid */
75 #define is_corrodeable(otmp) (objects[otmp->otyp].oc_material == COPPER || objects[otmp->otyp].oc_material == IRON)
77 #define is_damageable(otmp) (is_rustprone(otmp) || is_flammable(otmp) || \
78 is_rottable(otmp) || is_corrodeable(otmp))
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 */
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 */
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 */
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 */
109 unsigned short oc_nutrition; /* food value */
113 const char *oc_name; /* actual name */
114 const char *oc_descr; /* description when name unknown */
117 extern NEARDATA struct objclass objects[];
118 extern NEARDATA struct objdescr obj_descr[];
121 * All objects have a class. Make sure that all classes have a corresponding
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
129 #define AMULET_CLASS 5
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
138 #define ROCK_CLASS 14
139 #define BALL_CLASS 15
140 #define CHAIN_CLASS 16
141 #define VENOM_CLASS 17
142 #define MAXOCLASSES 18
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) /* */
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) */
151 #if 0 /* moved to decl.h so that makedefs.c won't see them */
152 extern const char def_oc_syms[MAXOCLASSES]; /* default class symbols */
153 extern uchar oc_syms[MAXOCLASSES]; /* current class symbols */
156 /* Default definitions of all object-symbols (must match classes above). */
158 #define ILLOBJ_SYM ']' /* also used for mimics */
159 #define WEAPON_SYM ')'
160 #define ARMOR_SYM '['
162 #define AMULET_SYM '"'
165 #define POTION_SYM '!'
166 #define SCROLL_SYM '?'
167 #define SPBOOK_SYM '+'
173 #define CHAIN_SYM '_'
174 #define VENOM_SYM '.'
181 #define newfruit() (struct fruit *)alloc(sizeof(struct fruit))
182 #define dealloc_fruit(rind) free((genericptr_t) (rind))
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 */