OSDN Git Service

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