/*	SCCS Id: @(#)objclass.h	3.1	92/10/18	*/
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/* NetHack may be freely redistributed.  See license for details. */

#ifndef OBJCLASS_H
#define OBJCLASS_H

/* definition of a class of objects */

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);
	Bitfield(oc_merge,1);	/* merge otherwise equal objects */
	Bitfield(oc_uses_known,1); /* obj->known affects full decription */
				/* otherwise, obj->dknown and obj->bknown */
				/* tell all, and obj->known should always */
				/* be set for proper merging behavior */
	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 */
#define oc_bulky	oc_big	/* for armor */

	Bitfield(oc_dir,2);
#define	NODIR		1
#define	IMMEDIATE	2
#define	RAY		3

	Bitfield(oc_material,5);
#define LIQUID		1	/* currently only for venom */
#define WAX		2
#define VEGGY		3	/* foodstuffs */
#define FLESH		4	/*   ditto    */
#define PAPER		5
#define CLOTH		6
#define LEATHER		7
#define WOOD		8
#define BONE		9
#define DRAGON_HIDE	10	/* not leather! */
#define IRON		11	/* Fe - includes steel */
#define METAL		12	/* Sn, &c. */
#define COPPER		13	/* Cu - includes brass */
#define SILVER		14	/* Ag */
#define GOLD		15	/* Au */
#define PLATINUM	16	/* Pt */
#define MITHRIL		17
#define PLASTIC		18
#define GLASS		19
#define GEMSTONE	20
#define MINERAL		21

#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 <= PLATINUM)
#define is_corrodeable(otmp)	(objects[otmp->otyp].oc_material == COPPER)
#define is_rustprone(otmp)	(objects[otmp->otyp].oc_material == IRON)

	uchar	oc_oprop;		/* property (invis, &c.) conveyed */
	char	oc_class;		/* object class */
	schar	oc_delay;		/* delay when using such an object */
#ifdef TEXTCOLOR
	uchar	oc_color;		/* display color of the object */
#endif /* TEXTCOLOR */
	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 w_propellor	oc_oc2		/* weapons: negative value = bow */
#define WP_BOW		1
#define WP_SLING	2
#define WP_CROSSBOW	3

#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 objdescr {
	const char *oc_name;		/* actual name */
	const char *oc_descr;		/* description when name unknown */
};

extern NEARDATA struct objclass objects[];
extern NEARDATA struct objdescr obj_descr[];

/*
 * All objects have a class. Make sure that all classes have a corresponding
 * symbol below.
 */
#define	RANDOM_CLASS	 0	/* used for generating random objects */
#define	ILLOBJ_CLASS	 1
#define	WEAPON_CLASS	 2
#define	ARMOR_CLASS	 3
#define	RING_CLASS	 4
#define	AMULET_CLASS	 5
#define	TOOL_CLASS	 6
#define	FOOD_CLASS	 7
#define	POTION_CLASS	 8
#define	SCROLL_CLASS	 9
#define	SPBOOK_CLASS	10	/* actually SPELL-book */
#define	WAND_CLASS	11
#define	GOLD_CLASS	12
#define	GEM_CLASS	13
#define	ROCK_CLASS	14
#define	BALL_CLASS	15
#define	CHAIN_CLASS	16
#define	VENOM_CLASS	17
#define MAXOCLASSES     18

#define ALLOW_COUNT	(MAXOCLASSES+1)	/* Can be used in the object class */
#define ALL_CLASSES	(MAXOCLASSES+2)	/* input to getobj().		   */
#define ALLOW_NONE	(MAXOCLASSES+3)	/*				   */

#if 0	/* moved to decl.h so that makedefs.c won't see them */
extern const char def_oc_syms[MAXOCLASSES];	/* default class symbols */
extern uchar oc_syms[MAXOCLASSES];		/* current class symbols */
#endif

/* Default definitions of all object-symbols (must match classes above). */

#define	ILLOBJ_SYM	']'	/* should be same as S_MIMIC_DEF      */
#define	WEAPON_SYM	')'
#define	ARMOR_SYM	'['
#define	RING_SYM	'='
#define	AMULET_SYM	'"'
#define	TOOL_SYM	'('
#define	FOOD_SYM	'%'
#define	POTION_SYM	'!'
#define	SCROLL_SYM	'?'
#define	SPBOOK_SYM	'+'
#define	WAND_SYM	'/'
#define	GOLD_SYM	'$'
#define	GEM_SYM		'*'
#define	ROCK_SYM	'`'
#define	BALL_SYM	'0'
#define	CHAIN_SYM	'_'
#define	VENOM_SYM	'.'

#ifdef TUTTI_FRUTTI
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))
#endif

#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 */
