and additional comments. Pull request #584 expands the oc_dir field of objects[] from 2 bits to 3 in order to hold the weapon strike- type bit mask. Closes #584
204 lines
6.9 KiB
C
204 lines
6.9 KiB
C
/* NetHack 3.7 objclass.h $NHDT-Date: 1596498553 2020/08/03 23:49:13 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.22 $ */
|
|
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
|
|
/*-Copyright (c) Pasi Kallinen, 2018. */
|
|
/* NetHack may be freely redistributed. See license for details. */
|
|
|
|
#ifndef OBJCLASS_H
|
|
#define OBJCLASS_H
|
|
|
|
/* [misnamed] definition of a type of object; many objects are composites
|
|
(liquid potion inside glass bottle, metal arrowhead on wooden shaft)
|
|
and object definitions only specify one type on a best-fit basis */
|
|
enum obj_material_types {
|
|
LIQUID = 1, /* currently only for venom */
|
|
WAX = 2,
|
|
VEGGY = 3, /* foodstuffs */
|
|
FLESH = 4, /* ditto */
|
|
PAPER = 5,
|
|
CLOTH = 6,
|
|
LEATHER = 7,
|
|
WOOD = 8,
|
|
BONE = 9,
|
|
DRAGON_HIDE = 10, /* not leather! */
|
|
IRON = 11, /* Fe - includes steel */
|
|
METAL = 12, /* Sn, &c. */
|
|
COPPER = 13, /* Cu - includes brass */
|
|
SILVER = 14, /* Ag */
|
|
GOLD = 15, /* Au */
|
|
PLATINUM = 16, /* Pt */
|
|
MITHRIL = 17,
|
|
PLASTIC = 18,
|
|
GLASS = 19,
|
|
GEMSTONE = 20,
|
|
MINERAL = 21
|
|
};
|
|
|
|
enum obj_armor_types {
|
|
ARM_SUIT = 0,
|
|
ARM_SHIELD = 1, /* needed for special wear function */
|
|
ARM_HELM = 2,
|
|
ARM_GLOVES = 3,
|
|
ARM_BOOTS = 4,
|
|
ARM_CLOAK = 5,
|
|
ARM_SHIRT = 6
|
|
};
|
|
|
|
struct objclass {
|
|
short oc_name_idx; /* index of actual name */
|
|
short oc_descr_idx; /* description when name unknown */
|
|
char *oc_uname; /* called by user */
|
|
Bitfield(oc_name_known, 1); /* discovered */
|
|
Bitfield(oc_merge, 1); /* merge otherwise equal objects */
|
|
Bitfield(oc_uses_known, 1); /* obj->known affects full description;
|
|
otherwise, obj->dknown and obj->bknown
|
|
tell all, and obj->known should always
|
|
be set for proper merging behavior. */
|
|
Bitfield(oc_pre_discovered, 1); /* Already known at start of game;
|
|
won't be listed as a discovery. */
|
|
Bitfield(oc_magic, 1); /* inherently magical object */
|
|
Bitfield(oc_charged, 1); /* may have +n or (n) charges */
|
|
Bitfield(oc_unique, 1); /* special one-of-a-kind object */
|
|
Bitfield(oc_nowish, 1); /* cannot wish for this object */
|
|
|
|
Bitfield(oc_big, 1);
|
|
#define oc_bimanual oc_big /* for weapons & tools used as weapons */
|
|
#define oc_bulky oc_big /* for armor */
|
|
Bitfield(oc_tough, 1); /* hard gems/rings */
|
|
|
|
Bitfield(oc_dir, 3);
|
|
/* oc_dir: zap style for wands and spells */
|
|
#define NODIR 1 /* non-directional */
|
|
#define IMMEDIATE 2 /* directional beam that doesn't ricochet */
|
|
#define RAY 3 /* beam that does bounce off walls */
|
|
/* overloaded oc_dir: strike mode bit mask for weapons and weptools */
|
|
#define PIERCE 01 /* pointed weapon punctures target */
|
|
#define SLASH 02 /* sharp weapon cuts target */
|
|
#define WHACK 04 /* blunt weapon bashes target */
|
|
|
|
/* 3 free bits */
|
|
|
|
Bitfield(oc_material, 5); /* one of obj_material_types */
|
|
|
|
#define is_organic(otmp) (objects[otmp->otyp].oc_material <= WOOD)
|
|
#define is_metallic(otmp) \
|
|
(objects[otmp->otyp].oc_material >= IRON \
|
|
&& objects[otmp->otyp].oc_material <= MITHRIL)
|
|
|
|
/* primary damage: fire/rust/--- */
|
|
/* is_flammable(otmp), is_rottable(otmp) in mkobj.c */
|
|
#define is_rustprone(otmp) (objects[otmp->otyp].oc_material == IRON)
|
|
|
|
/* secondary damage: rot/acid/acid */
|
|
#define is_corrodeable(otmp) \
|
|
(objects[otmp->otyp].oc_material == COPPER \
|
|
|| objects[otmp->otyp].oc_material == IRON)
|
|
|
|
#define is_damageable(otmp) \
|
|
(is_rustprone(otmp) || is_flammable(otmp) || is_rottable(otmp) \
|
|
|| is_corrodeable(otmp))
|
|
|
|
/* 3 free bits */
|
|
|
|
schar oc_subtyp;
|
|
#define oc_skill oc_subtyp /* Skills of weapons, spellbooks, tools, gems */
|
|
#define oc_armcat oc_subtyp /* for armor (enum obj_armor_types) */
|
|
|
|
uchar oc_oprop; /* property (invis, &c.) conveyed */
|
|
char oc_class; /* object class (enum obj_class_types) */
|
|
schar oc_delay; /* delay when using such an object */
|
|
uchar oc_color; /* color of the object */
|
|
|
|
short oc_prob; /* probability, used in mkobj() */
|
|
unsigned short oc_weight; /* encumbrance (1 cn = 0.1 lb.) */
|
|
short oc_cost; /* base cost in shops */
|
|
/* Check the AD&D rules! The FIRST is small monster damage. */
|
|
/* for weapons, and tools, rocks, and gems useful as weapons */
|
|
schar oc_wsdam, oc_wldam; /* max small/large monster damage */
|
|
schar oc_oc1, oc_oc2;
|
|
#define oc_hitbon oc_oc1 /* weapons: "to hit" bonus */
|
|
|
|
#define a_ac oc_oc1 /* armor class, used in ARM_BONUS in do.c */
|
|
#define a_can oc_oc2 /* armor: used in mhitu.c */
|
|
#define oc_level oc_oc2 /* books: spell level */
|
|
|
|
unsigned short oc_nutrition; /* food value */
|
|
};
|
|
|
|
struct class_sym {
|
|
char sym;
|
|
const char *name;
|
|
const char *explain;
|
|
};
|
|
|
|
struct objdescr {
|
|
const char *oc_name; /* actual name */
|
|
const char *oc_descr; /* description when name unknown */
|
|
};
|
|
|
|
/*
|
|
* All objects have a class. Make sure that all classes have a corresponding
|
|
* symbol below.
|
|
*/
|
|
|
|
enum objclass_defchars {
|
|
#define OBJCLASS_DEFCHAR_ENUM
|
|
#include "defsym.h"
|
|
#undef OBJCLASS_DEFCHAR_ENUM
|
|
};
|
|
|
|
enum objclass_classes {
|
|
RANDOM_CLASS = 0, /* used for generating random objects */
|
|
#define OBJCLASS_CLASS_ENUM
|
|
#include "defsym.h"
|
|
#undef OBJCLASS_CLASS_ENUM
|
|
MAXOCLASSES
|
|
};
|
|
|
|
/* Default characters for object classes */
|
|
enum objclass_syms {
|
|
#define OBJCLASS_S_ENUM
|
|
#include "defsym.h"
|
|
#undef OBJCLASS_S_ENUM
|
|
};
|
|
|
|
/* for mkobj() use ONLY! odd '-SPBOOK_CLASS' is in case of unsigned enums */
|
|
#define SPBOOK_no_NOVEL (0 - (int) SPBOOK_CLASS)
|
|
|
|
#define BURNING_OIL (MAXOCLASSES + 1) /* Can be used as input to explode. */
|
|
#define MON_EXPLODE (MAXOCLASSES + 2) /* Exploding monster (e.g. gas spore) */
|
|
|
|
#if 0 /* moved to decl.h so that makedefs.c won't see them */
|
|
extern const struct class_sym
|
|
def_oc_syms[MAXOCLASSES]; /* default class symbols */
|
|
extern uchar oc_syms[MAXOCLASSES]; /* current class symbols */
|
|
#endif
|
|
|
|
struct fruit {
|
|
char fname[PL_FSIZ];
|
|
int fid;
|
|
struct fruit *nextf;
|
|
};
|
|
#define newfruit() (struct fruit *) alloc(sizeof(struct fruit))
|
|
#define dealloc_fruit(rind) free((genericptr_t)(rind))
|
|
|
|
enum objects_nums {
|
|
#define OBJECTS_ENUM
|
|
#include "objects.h"
|
|
#undef OBJECTS_ENUM
|
|
NUM_OBJECTS
|
|
};
|
|
|
|
enum misc_object_nums {
|
|
LAST_GEM = (JADE),
|
|
NUM_GLASS_GEMS = ((LUCKSTONE - JADE) - 1),
|
|
MAXSPELL = ((SPE_BOOK_OF_THE_DEAD - SCR_BLANK_PAPER) + 1)
|
|
};
|
|
|
|
extern NEARDATA struct objclass objects[NUM_OBJECTS + 1];
|
|
extern NEARDATA struct objdescr obj_descr[NUM_OBJECTS + 1];
|
|
|
|
#define OBJ_NAME(obj) (obj_descr[(obj).oc_name_idx].oc_name)
|
|
#define OBJ_DESCR(obj) (obj_descr[(obj).oc_descr_idx].oc_descr)
|
|
|
|
#endif /* OBJCLASS_H */
|