Source:SLASH'EM 0.0.7E7F2/obj.h

Below is the full text to obj.h from the source code of SLASH'EM 0.0.7E7F2. To link to a particular line, write [[SLASH'EM 0.0.7E7F2/obj.h#line123 ]], for example.

The latest source code for vanilla NetHack is at Source code.

1.   /*	SCCS Id: @(#)obj.h	3.4	2002/01/07	*/ 2.   /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ 3.    /* NetHack may be freely redistributed. See license for details. */ 4.     5.    #ifndef OBJ_H 6.   #define OBJ_H 7.    8.    /* #define obj obj_nh */ /* uncomment for SCO UNIX, which has a conflicting 9.   			  * typedef for "obj" in  */ 10.   11.   union vptrs { 12.  	    struct obj *v_nexthere;	/* floor location lists */ 13.  	    struct obj *v_ocontainer;	/* point back to container */ 14.  	    struct monst *v_ocarry;	/* point back to carrying monst */ 15.  };  16.    17.   struct obj { 18.  	struct obj *nobj; 19.  	union vptrs v;  20. #define nexthere	v.v_nexthere 21.  #define ocontainer	v.v_ocontainer 22.  #define ocarry		v.v_ocarry 23.   24.   	struct obj *cobj;	/* contents list for containers */ 25.  	unsigned o_id; 26.  	xchar ox,oy; 27.  	short otyp;		/* object class number */ 28.  #ifdef UNPOLYPILE 29.  	short oldtyp;	/* WAC for unpolymorph */ 30.  #endif 31.  	unsigned owt; 32.  	long quan;		/* number of items */ 33.   34.   	schar spe;		/* quality of weapon, armor or ring (+ or -) 35.  				   number of charges for wand ( >= -1 ) 36.  				   marks your eggs, spinach tins 37.  				   royal coffers for a court ( == 2) 38.  				   tells which fruit a fruit is  39. special for uball and amulet 40.  				   historic and gender for statues */ 41.  #define STATUE_HISTORIC 0x01 42.  #define STATUE_MALE     0x02 43.  #define STATUE_FEMALE   0x04 44.  	char	oclass;		/* object class */ 45.  	char	invlet;		/* designation in inventory */ 46.  	char	oartifact;	/* artifact array index */ 47.  	schar 	altmode; 	/* alternate modes - eg. SMG, double Lightsaber */ 48.  				/* WP_MODEs are in decreasing speed */ 49.  #define WP_MODE_AUTO	0	/* Max firing speed */ 50.  #define WP_MODE_BURST	1	/* 1/3 of max rate */ 51.  #define WP_MODE_SINGLE 	2	/* Single shot */ 52.   53.   	xchar where;		/* where the object thinks it is */ 54.  #define OBJ_FREE	0		/* object not attached to anything */ 55.  #define OBJ_FLOOR	1		/* object on floor */ 56.  #define OBJ_CONTAINED	2		/* object in a container */ 57.  #define OBJ_INVENT	3		/* object in the hero's inventory */ 58.  #define OBJ_MINVENT	4		/* object in a monster inventory */ 59.  #define OBJ_MIGRATING	5		/* object sent off to another level */ 60.  #define OBJ_BURIED	6		/* object buried */ 61.  #define OBJ_ONBILL	7		/* object on shk bill */ 62.  #define NOBJ_STATES	8 63.  	xchar timed;		/* # of fuses (timers) attached to this obj */ 64.   65.   	Bitfield(cursed,1); 66.  	Bitfield(blessed,1); 67.  	Bitfield(unpaid,1);	/* on some bill */ 68.  	Bitfield(no_charge,1);	/* if shk shouldn't charge for this */ 69.  	Bitfield(known,1);	/* exact nature known */ 70.  	Bitfield(dknown,1);	/* color or text known */ 71.  	Bitfield(bknown,1);	/* blessing or curse known */ 72.  	Bitfield(rknown,1);	/* rustproof or not known */ 73.   74.   	Bitfield(oeroded,2);	/* rusted/burnt weapon/armor */ 75.  	Bitfield(oeroded2,2);	/* corroded/rotted weapon/armor */ 76.  #define greatest_erosion(otmp) (int)((otmp)->oeroded > (otmp)->oeroded2 ? (otmp)->oeroded : (otmp)->oeroded2) 77.  #define MAX_ERODE 3 78.  #define orotten oeroded		/* rotten food */ 79.  #define odiluted oeroded	/* diluted potions */ 80.  #define norevive oeroded2 81.  	Bitfield(oerodeproof,1); /* erodeproof weapon/armor */ 82.  	Bitfield(olocked,1);	/* object is locked */ 83.  #define oarmed olocked 84.  #define odrained olocked	/* drained corpse */ 85.  	Bitfield(obroken,1);	/* lock has been broken */ 86.  	Bitfield(otrapped,1);	/* container is trapped */ 87.  				/* or accidental tripped rolling boulder trap */ 88.  #define opoisoned otrapped	/* object (weapon) is coated with poison */ 89.   90.   	Bitfield(recharged,3);	/* number of times it's been recharged */ 91.  	Bitfield(lamplit,1);	/* a light-source -- can be lit */ 92.  #ifdef INVISIBLE_OBJECTS 93.  	Bitfield(oinvis,1);	/* invisible */ 94.  #endif 95.  	Bitfield(greased,1);	/* covered with grease */ 96.  	Bitfield(oattached,2);	/* obj struct has special attachment */ 97.  #define OATTACHED_NOTHING 0 98.  #define OATTACHED_MONST   1	/* monst struct in oextra */ 99.  #define OATTACHED_M_ID    2	/* monst id in oextra */ 100. #define OATTACHED_UNUSED3 3 101. 	Bitfield(in_use,1);	/* for magic items before useup items */ 102. 	Bitfield(bypass,1);	/* mark this as an object to be skipped by bhito */ 103.  104.  	Bitfield(yours,1);	/* obj is yours (eg. thrown by you) */ 105. 	Bitfield(was_thrown,1); /* thrown by the hero since last picked up */ 106. 	/* ? free bits */ 107.  108.  	int	corpsenm;	/* type of corpse is mons[corpsenm] */ 109. #define leashmon  corpsenm	/* gets m_id of attached pet */ 110. #define spestudied corpsenm	/* # of times a spellbook has been studied */ 111. #define fromsink  corpsenm	/* a potion from a sink */ 112. 	unsigned oeaten;	/* nutrition left in food, if partly eaten */ 113. 	long age;		/* creation date */ 114.  115.  	uchar onamelth;		/* length of name (following oxlth) */ 116. 	short oxlth;		/* length of following data */ 117. 	/* in order to prevent alignment problems oextra should 118. 	   be (or follow) a long int */ 119. 	long owornmask; 120. 	long oextra[1];		/* used for name of ordinary objects - length 121. 				   is flexible; amount for tmp gold objects */ 122. };  123.   124.  #define newobj(xl)	(struct obj *)alloc((unsigned)(xl) + sizeof(struct obj)) 125. #define ONAME(otmp)	(((char *)(otmp)->oextra) + (otmp)->oxlth) 126.  127.  /* All objects */ 128. #ifdef UNPOLYPILE 129. #define is_hazy(otmp)	((otmp)->oldtyp != STRANGE_OBJECT) 130. #endif 131. /* [ALI] None of the objects listed here can be picked up by normal monsters. 132.  * If any such objects need to be marked as indestructible then consideration 133.  * will need to be given to what happens when such a monster disappears 134.  * carrying the object. 135.  */  136.  #define evades_destruction(otmp) ( \  137.  			(otmp)->otyp == AMULET_OF_YENDOR || \  138.  			(otmp)->otyp == CANDELABRUM_OF_INVOCATION || \  139.  			(otmp)->otyp == BELL_OF_OPENING || \  140.  			(otmp)->otyp == SPE_BOOK_OF_THE_DEAD || \  141.  			(otmp)->oartifact == ART_KEY_OF_LAW || \  142.  			(otmp)->oartifact == ART_KEY_OF_NEUTRALITY || \  143.  			(otmp)->oartifact == ART_KEY_OF_CHAOS) 144. #ifdef INVISIBLE_OBJECTS 145. #define always_visible(otmp) ( \  146.  			(otmp)->otyp == MUMMY_WRAPPING || \  147.  			(otmp)->oclass == COIN_CLASS) 148. #endif 149.  150.  /* Weapons and weapon-tools */ 151. /* KMH -- now based on skill categories. Formerly: 152.  *	#define is_sword(otmp)	(otmp->oclass == WEAPON_CLASS && \  153.   *			 objects[otmp->otyp].oc_wepcat == WEP_SWORD) 154.  *	#define is_blade(otmp)	(otmp->oclass == WEAPON_CLASS && \  155.   *			 (objects[otmp->otyp].oc_wepcat == WEP_BLADE || \ 156.  *			  objects[otmp->otyp].oc_wepcat == WEP_SWORD)) 157.  *	#define is_weptool(o)	((o)->oclass == TOOL_CLASS && \  158.   *			 objects[(o)->otyp].oc_weptool) 159.  *	#define is_multigen(otyp) (otyp <= SHURIKEN) 160.  *	#define is_poisonable(otyp) (otyp <= BEC_DE_CORBIN) 161.  */  162.   163.  #define is_sword(otmp)	((otmp)->oclass == WEAPON_CLASS && \  164.  			 objects[(otmp)->otyp].oc_skill >= P_SHORT_SWORD && \  165.  			 objects[(otmp)->otyp].oc_skill <= P_SABER) 166. #define is_blade(otmp)	((otmp)->oclass == WEAPON_CLASS && \  167.  			 objects[(otmp)->otyp].oc_skill >= P_DAGGER && \  168.  			 objects[(otmp)->otyp].oc_skill <= P_SABER) 169. #define is_pole(otmp)	(((otmp)->oclass == WEAPON_CLASS || \ 170. 			(otmp)->oclass == TOOL_CLASS) && \  171.  			 (objects[(otmp)->otyp].oc_skill == P_POLEARMS || \ 172. 			 objects[(otmp)->otyp].oc_skill == P_LANCE)) 173. #define is_spear(otmp)	((otmp)->oclass == WEAPON_CLASS && \  174.  			 objects[(otmp)->otyp].oc_skill >= P_SPEAR && \  175.  			 objects[(otmp)->otyp].oc_skill <= P_JAVELIN) 176. #define is_axe(otmp)	((otmp)->oclass == WEAPON_CLASS && \  177.  			 objects[(otmp)->otyp].oc_skill == P_AXE) 178. #define is_launcher(otmp)	((otmp)->oclass == WEAPON_CLASS && \  179.  			 objects[(otmp)->otyp].oc_skill >= P_BOW && \  180.  			 objects[(otmp)->otyp].oc_skill <= P_CROSSBOW) 181. #define is_ammo(otmp)	(((otmp)->oclass == WEAPON_CLASS || \ 182. 			 (otmp)->oclass == GEM_CLASS) && \  183.  			 objects[(otmp)->otyp].oc_skill >= -P_CROSSBOW && \  184.  			 objects[(otmp)->otyp].oc_skill <= -P_BOW) 185. #define is_missile(otmp)	(((otmp)->oclass == WEAPON_CLASS || \ 186. 			 (otmp)->oclass == TOOL_CLASS) && \  187.  			 objects[(otmp)->otyp].oc_skill >= -P_BOOMERANG && \  188.  			 objects[(otmp)->otyp].oc_skill <= -P_DART) 189. #define is_grenade(otmp)	(is_ammo(otmp) && \  190.  			 	 objects[(otmp)->otyp].w_ammotyp == WP_GRENADE) 191. #define is_multigen(otmp)	((otmp)->oclass == WEAPON_CLASS && \  192.  			 objects[(otmp)->otyp].oc_skill >= -P_SHURIKEN && \  193.  			 objects[(otmp)->otyp].oc_skill <= -P_BOW) 194. #ifdef FIREARMS 195. #define is_unpoisonable_firearm_ammo(otmp)	\ 196. 			 (is_bullet(otmp) || (otmp)->otyp == STICK_OF_DYNAMITE) 197. #else 198. #define is_unpoisonable_firearm_ammo(otmp)	0 199. #endif 200. #define is_poisonable(otmp)	((otmp)->oclass == WEAPON_CLASS && \  201.  			 (objects[(otmp)->otyp].oc_skill <= P_SABER || \ 202. 			 (objects[(otmp)->otyp].oc_skill >= P_POLEARMS && \  203.  			 objects[(otmp)->otyp].oc_skill <= P_LANCE)) && \  204.  			 !is_unpoisonable_firearm_ammo(otmp)) 205. #define uslinging	(uwep && objects[uwep->otyp].oc_skill == P_SLING) 206. #define is_weptool(o)	((o)->oclass == TOOL_CLASS && \  207.  			 objects[(o)->otyp].oc_skill != P_NONE) 208. #define is_pick(otmp)	(((otmp)->oclass == WEAPON_CLASS || \ 209. 			 (otmp)->oclass == TOOL_CLASS) && \  210.  			 objects[(otmp)->otyp].oc_skill == P_PICK_AXE) 211. #define ammo_and_launcher(otmp,ltmp) \ 212. 			(is_ammo(otmp) && (ltmp) && \  213.  			objects[(otmp)->otyp].oc_skill == -objects[(ltmp)->otyp].oc_skill && \  214.  			  objects[(otmp)->otyp].w_ammotyp == objects[(ltmp)->otyp].w_ammotyp) 215. #define bimanual(otmp)	(((otmp)->oclass == WEAPON_CLASS || \ 216. 			  (otmp)->oclass == TOOL_CLASS) && \  217.  			 objects[(otmp)->otyp].oc_bimanual) 218.  219.  #ifdef LIGHTSABERS 220. #define is_lightsaber(otmp) (objects[(otmp)->otyp].oc_skill == P_LIGHTSABER) 221. #endif 222.  223.  #ifdef FIREARMS 224. #define is_firearm(otmp) \ 225. 			((otmp)->oclass == WEAPON_CLASS && \  226.  			 objects[(otmp)->otyp].oc_skill == P_FIREARM) 227. #define is_bullet(otmp)	((otmp)->oclass == WEAPON_CLASS && \  228.  			 objects[(otmp)->otyp].oc_skill == -P_FIREARM) 229. #endif 230.  231.  /* Armor */ 232. #define is_shield(otmp) ((otmp)->oclass == ARMOR_CLASS && \  233.  			 objects[(otmp)->otyp].oc_armcat == ARM_SHIELD) 234. #define is_helmet(otmp) ((otmp)->oclass == ARMOR_CLASS && \  235.  			 objects[(otmp)->otyp].oc_armcat == ARM_HELM) 236. #define is_boots(otmp)	((otmp)->oclass == ARMOR_CLASS && \  237.  			 objects[(otmp)->otyp].oc_armcat == ARM_BOOTS) 238. #define is_gloves(otmp) ((otmp)->oclass == ARMOR_CLASS && \  239.  			 objects[(otmp)->otyp].oc_armcat == ARM_GLOVES) 240. #define is_cloak(otmp)	((otmp)->oclass == ARMOR_CLASS && \  241.  			 objects[(otmp)->otyp].oc_armcat == ARM_CLOAK) 242. #define is_shirt(otmp)	((otmp)->oclass == ARMOR_CLASS && \  243.  			 objects[(otmp)->otyp].oc_armcat == ARM_SHIRT) 244. #define is_suit(otmp)	((otmp)->oclass == ARMOR_CLASS && \  245.  			 objects[(otmp)->otyp].oc_armcat == ARM_SUIT) 246. #define is_elven_armor(otmp)	((otmp)->otyp == ELVEN_LEATHER_HELM\  247.  				|| (otmp)->otyp == ELVEN_MITHRIL_COAT\  248.  				|| (otmp)->otyp == ELVEN_CLOAK\  249.  				|| (otmp)->otyp == ELVEN_SHIELD\  250.  				|| (otmp)->otyp == ELVEN_BOOTS) 251. #define is_orcish_armor(otmp)	((otmp)->otyp == ORCISH_HELM\  252.  				|| (otmp)->otyp == ORCISH_CHAIN_MAIL\  253.  				|| (otmp)->otyp == ORCISH_RING_MAIL\  254.  				|| (otmp)->otyp == ORCISH_CLOAK\  255.  				|| (otmp)->otyp == URUK_HAI_SHIELD\  256.  				|| (otmp)->otyp == ORCISH_SHIELD) 257. #define is_dwarvish_armor(otmp)	((otmp)->otyp == DWARVISH_IRON_HELM\  258.  				|| (otmp)->otyp == DWARVISH_MITHRIL_COAT\  259.  				|| (otmp)->otyp == DWARVISH_CLOAK\  260.  				|| (otmp)->otyp == DWARVISH_ROUNDSHIELD) 261. #define is_gnomish_armor(otmp)	(FALSE) 262.  263.  				  264.  /* Eggs and other food */ 265. #define MAX_EGG_HATCH_TIME 200	/* longest an egg can remain unhatched */ 266. #define stale_egg(egg)	((monstermoves - (egg)->age) > (2*MAX_EGG_HATCH_TIME)) 267. #define ofood(o) ((o)->otyp == CORPSE || (o)->otyp == EGG || (o)->otyp == TIN) 268. #define polyfodder(obj)	(ofood(obj) && (obj)->corpsenm == PM_CHAMELEON) 269. #define mlevelgain(obj) (ofood(obj) && (obj)->corpsenm == PM_WRAITH) 270. #define mhealup(obj)	(ofood(obj) && (obj)->corpsenm == PM_NURSE) 271. #define drainlevel(corpse) (mons[(corpse)->corpsenm].cnutrit*4/5) 272.  273.  /* Containers */ 274. #define carried(o)	((o)->where == OBJ_INVENT) 275. #define mcarried(o)	((o)->where == OBJ_MINVENT) 276. #define Has_contents(o) (/* (Is_container(o) || (o)->otyp == STATUE) && */ \  277.  			 (o)->cobj != (struct obj *)0) 278. #define Is_container(o) ((o)->otyp == MEDICAL_KIT || \  279.  			 (o)->otyp >= LARGE_BOX && (o)->otyp <= BAG_OF_TRICKS) 280. #define Is_box(otmp)	((otmp)->otyp == LARGE_BOX || (otmp)->otyp == CHEST) 281. #ifdef WALLET_O_P 282. #define Is_mbag(otmp)	((otmp)->otyp == BAG_OF_HOLDING || \  283.                           ((otmp)->oartifact && \ 284.                           (otmp)->oartifact == ART_WALLET_OF_PERSEUS) || \  285.    			             (otmp)->otyp == BAG_OF_TRICKS) 286. #else 287. #define Is_mbag(otmp)	((otmp)->otyp == BAG_OF_HOLDING || \  288.    			 (otmp)->otyp == BAG_OF_TRICKS) 289. #endif 290.  291.  /* dragon gear */ 292. #define Is_dragon_scales(obj)	((obj)->otyp >= GRAY_DRAGON_SCALES && \  293.  				 (obj)->otyp <= YELLOW_DRAGON_SCALES) 294. #define Is_dragon_mail(obj)	((obj)->otyp >= GRAY_DRAGON_SCALE_MAIL && \  295.  				 (obj)->otyp <= YELLOW_DRAGON_SCALE_MAIL) 296. #define Is_dragon_armor(obj)	(Is_dragon_scales(obj) || Is_dragon_mail(obj)) 297. #define Dragon_scales_to_pm(obj) &mons[PM_GRAY_DRAGON + (obj)->otyp \ 298. 				       - GRAY_DRAGON_SCALES] 299. #define Dragon_mail_to_pm(obj)	&mons[PM_GRAY_DRAGON + (obj)->otyp \ 300. 				      - GRAY_DRAGON_SCALE_MAIL] 301. #define Dragon_to_scales(pm)	(GRAY_DRAGON_SCALES + (pm - mons)) 302.  303.  /* Elven gear */ 304. #define is_elven_weapon(otmp)	((otmp)->otyp == ELVEN_ARROW\  305.  				|| (otmp)->otyp == ELVEN_SPEAR\  306.  				|| (otmp)->otyp == ELVEN_DAGGER\  307.  				|| (otmp)->otyp == ELVEN_SHORT_SWORD\  308.  				|| (otmp)->otyp == ELVEN_BROADSWORD\  309.  				|| (otmp)->otyp == ELVEN_BOW) 310. #define is_elven_obj(otmp)	(is_elven_armor(otmp) || is_elven_weapon(otmp)) 311.  312.  /* Orcish gear */ 313. #define is_orcish_obj(otmp)	(is_orcish_armor(otmp)\  314.  				|| (otmp)->otyp == ORCISH_ARROW\  315.  				|| (otmp)->otyp == ORCISH_SPEAR\  316.  				|| (otmp)->otyp == ORCISH_DAGGER\  317.  				|| (otmp)->otyp == ORCISH_SHORT_SWORD\  318.  				|| (otmp)->otyp == ORCISH_BOW) 319.  320.  /* Dwarvish gear */ 321. #define is_dwarvish_obj(otmp)	(is_dwarvish_armor(otmp)\  322.  				|| (otmp)->otyp == DWARVISH_SPEAR\  323.  				|| (otmp)->otyp == DWARVISH_SHORT_SWORD\  324.  				|| (otmp)->otyp == DWARVISH_MATTOCK) 325.  326.  /* Gnomish gear */ 327. #define is_gnomish_obj(otmp)	(is_gnomish_armor(otmp)) 328.  329.  /* Light sources */ 330. #define Is_candle(otmp)	((otmp)->otyp == TALLOW_CANDLE || \  331.  			 (otmp)->otyp == WAX_CANDLE || \  332.  			 (otmp)->otyp == MAGIC_CANDLE) 333. /* maximum amount of oil in a potion of oil */ 334. #define MAX_OIL_IN_FLASK 400 335.  336.  /* MAGIC_LAMP intentionally excluded below */ 337. /* age field of this is relative age rather than absolute */ 338. #define age_is_relative(otmp)	((otmp)->otyp == BRASS_LANTERN\  339.  				|| (otmp)->otyp == OIL_LAMP\  340.  				|| (otmp)->otyp == TORCH\  341.  				|| (otmp)->otyp == CANDELABRUM_OF_INVOCATION\  342.  				|| (otmp)->otyp == TALLOW_CANDLE\  343.  				|| (otmp)->otyp == WAX_CANDLE\  344.  				|| (otmp)->otyp == POT_OIL) 345. /* object can be ignited */ 346. #define ignitable(otmp)	((otmp)->otyp == BRASS_LANTERN\  347.  				|| (otmp)->otyp == OIL_LAMP\  348.  				|| (otmp)->otyp == TORCH\  349.  				|| (otmp)->otyp == CANDELABRUM_OF_INVOCATION\  350.  				|| (otmp)->otyp == TALLOW_CANDLE\  351.  				|| (otmp)->otyp == WAX_CANDLE\  352.  				|| (otmp)->otyp == MAGIC_CANDLE\  353.  				|| (otmp)->otyp == POT_OIL) 354.  355.  /* special stones */ 356. #define is_graystone(obj)	((obj)->otyp == LUCKSTONE || \  357.  				 (obj)->otyp == LOADSTONE || \  358.  				 (obj)->otyp == FLINT     || \  359.  				 (obj)->otyp == TOUCHSTONE || \  360.  				 (obj)->otyp == HEALTHSTONE || \  361.  				 (obj)->otyp == WHETSTONE) 362.  363.  /* misc */ 364. #ifdef KOPS 365. #define is_flimsy(otmp)		(objects[(otmp)->otyp].oc_material <= LEATHER || \  366.  				 (otmp)->otyp == RUBBER_HOSE) 367. #else 368. #define is_flimsy(otmp)		(objects[(otmp)->otyp].oc_material <= LEATHER) 369. #endif 370.  371.  /* helpers, simple enough to be macros */ 372. #define is_plural(o)	((o)->quan > 1 || \  373.  			 (o)->oartifact == ART_EYES_OF_THE_OVERWORLD) 374.  375.  /* Flags for get_obj_location. */ 376.  #define CONTAINED_TOO	0x1 377. #define BURIED_TOO	0x2 378.  379.  #endif /* OBJ_H */