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