OSDN Git Service

Initial Import
[nethackexpress/trunk.git] / include / objclass.h
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
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
112 struct objdescr {
113         const char *oc_name;            /* actual name */
114         const char *oc_descr;           /* description when name unknown */
115 };
116
117 extern NEARDATA struct objclass objects[];
118 extern 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 */
152 extern const char def_oc_syms[MAXOCLASSES];     /* default class symbols */
153 extern 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
176 struct 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 */