SmaugWizard/Backup/
SmaugWizard/Backup/L/
SmaugWizard/Boards/
SmaugWizard/Building/
SmaugWizard/Corpses/
SmaugWizard/Councils/
SmaugWizard/Deity/
SmaugWizard/Gods/
SmaugWizard/MudProgs/
SmaugWizard/Player/L/
SmaugWizard/Src/
SmaugWizard/Src/res/
/****************************************************************************
 * [S]imulated [M]edieval [A]dventure multi[U]ser [G]ame      |				*
 * -----------------------------------------------------------|   \\._.//	*
 * SmaugWiz (C) 1998 by Russ Pillsbury (Windows NT version)   |   (0...0)	*
 * -----------------------------------------------------------|    ).:.(	*
 * SMAUG (C) 1994, 1995, 1996 by Derek Snider                 |    {o o}	*
 * -----------------------------------------------------------|   / ' ' \	*
 * SMAUG code team: Thoric, Altrag, Blodkai, Narn, Haus,      |~'~.VxvxV.~'~*
 * Scryn, Swordbearer, Rennard, Tricops, and Gorog.           |				*
 * ------------------------------------------------------------------------ *
 * Merc 2.1 Diku Mud improvments copyright (C) 1992, 1993 by Michael        *
 * Chastain, Michael Quan, and Mitchell Tse.                                *
 * Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer,          *
 * Michael Seifert, Hans Henrik Staerfeldt, Tom Madsen, and Katja Nyboe.    *
 * ------------------------------------------------------------------------ *
 *			    Smaug Object Menu Implementation file							*
 ****************************************************************************/

#include	"stdafx.h"

#define		OBJMENU_CPP

#include	"smaug.h"
#include	"SysData.h"
#include	"mobiles.h"
#include	"affect.h"
#include	"objects.h"
#include	"rooms.h"
#include	"class.h"
#include	"objectmenu.h"
#include	"descriptor.h"
#include	"character.h"

CMenuData	*ObjMenuData [];

char		*GetItemString (int item_number, int which_string);
void		SetRisAffect (char* ris, int apply, CAffectList& AList);
void		SetAffected (int bit, CAffectList& AList);


void CObjectMenu::Display (CCharacter& Ch, int page)
{
	m_HelpMenu = DIM (ObjMenus) - 1;
	m_PageNr = page;

	if (m_PageNr < 0 || m_PageNr > m_HelpMenu) then m_PageNr = m_HelpMenu;

	m_CurrPageLines = GetLineCount (ObjMenus [m_PageNr]);
	m_pPageData = ObjMenuData [m_PageNr];
	m_nDataItems = m_pPageData ? GetItemCount (m_pPageData) : 0;

	// clear page & home cursor
	Ch.GetDesc ()->WriteToBuffer ("\x1b[2J");

	// print the menu page
	Ch.GetDesc ()->WriteToBuffer (ObjMenus [m_PageNr]);

	// fill in fields
	DisplayData (Ch);
}


void CObjectMenu::DisplayData (CCharacter& Ch)
{
	char	buf [MAX_STRING_LENGTH];

	// Write in the object name
	sprintf (buf, "\x1b[1;35H[%5u:%-10.10s]-----[%c]", m_Vnum, ma_Name,
		m_bProto ? 'P' : 'N');
	Ch.GetDesc ()->WriteToBuffer (buf);

	m_Base [0] = (char*) this;
	m_Base [1] = NULL;

	CSmaugMenu::DisplayData (Ch);
}


BOOL CObjectMenu::Edit (CCharacter& Ch, char* argument, const char* command)
{
	if (command [0] == '-') {
		Display (Ch, argument [0]);
		return TRUE;
	}
	if (argument [0] == '-') return FALSE;

	m_Base [0] = (char*) this;
	m_Base [1] = NULL;

	return CSmaugMenu::Edit (Ch, argument, command);
}


void CObjectMenu::Save (CCharacter& Ch)
{
	CObjData	&Obj = *m_pObj;
	CObjIndexData	&Idx = *Obj.pIndexData;

	// first see if the object still exists
	if (! Idx.m_ObjList.Find (m_pObj)) {
		Ch.SendText ("Object no longer exists, Cannot save.");
		return;
	}

	// Save a-page items
	Obj.SetName (ma_Name);
	Obj.SetShortDescr (ma_Short);
	Obj.SetDescription (ma_Desc);
	Obj.SetActionDescr (ma_ActDesc);
	Obj.SetLevel (ma_Level);
	Obj.weight = ma_Weight;
	Obj.cost = ma_Cost;

	if (m_bProto) {
		Idx.SetName (ma_Name);
		Idx.SetShortDescr (ma_Short);
		Idx.SetDescription (ma_Desc);
		Idx.SetActionDescr (ma_ActDesc);
		Idx.level = ma_Level;
		Idx.weight = ma_Weight;
		Idx.cost = ma_Cost;
	}

	for (int i=0; i < 6; ++i) {
		Obj.value [i] = ma_Value [i];
		if (m_bProto)
			Idx.value [i] = ma_Value [i];
	}

	// Save b-page items
	Obj.item_type = 0;							// start with none
	if (m_bProto)
		Idx.item_type = 0;

	#define		ISET(aa,bb)		if (aa) {						\
									Obj.item_type |= bb;		\
									if (m_bProto)				\
										Idx.item_type |= bb;	\
								}

	ISET (mb_Fountain, ITEM_FOUNTAIN);
	ISET (mb_Furniture, ITEM_FURNITURE);
	ISET (mb_Armor, ITEM_ARMOR);
	ISET (mb_Food, ITEM_FOOD);
	ISET (mb_Money, ITEM_MONEY);
	ISET (mb_Potion, ITEM_POTION);
	ISET (mb_Chain, ITEM_PULLCHAIN);
	ISET (mb_Weapon, ITEM_WEAPON);
	ISET (mb_Map, ITEM_MAP);
	ISET (mb_Light, ITEM_LIGHT);
	ISET (mb_Button, ITEM_BUTTON);
	ISET (mb_Treasure, ITEM_TREASURE);
	ISET (mb_Herb, ITEM_HERB);
	ISET (mb_Trash, ITEM_TRASH);
	ISET (mb_Switch, ITEM_SWITCH);
	ISET (mb_Container, ITEM_CONTAINER);
	ISET (mb_Wand, ITEM_WAND);
	ISET (mb_Scroll, ITEM_SCROLL);
	ISET (mb_Staff, ITEM_STAFF);
	ISET (mb_BloodStain, ITEM_BLOODSTAIN);
	ISET (mb_Pill, ITEM_PILL);
	ISET (mb_Blood, ITEM_BLOOD);
	ISET (mb_Dial, ITEM_DIAL);
	ISET (mb_OldTrap, ITEM_TRAP);
	ISET (mb_Key, ITEM_KEY);
	ISET (mb_Incense, ITEM_INCENSE);
	ISET (mb_Lever, ITEM_LEVER);
	ISET (mb_CorpsePC, ITEM_CORPSE_PC);
	ISET (mb_Pipe, ITEM_PIPE);
	ISET (mb_Scraps, ITEM_SCRAPS);
	ISET (mb_Trap, ITEM_TRAP);
	ISET (mb_CorpseNPC, ITEM_CORPSE_NPC);
	ISET (mb_Book, ITEM_BOOK);
	ISET (mb_Match, ITEM_MATCH);
	ISET (mb_DrinkCon, ITEM_DRINK_CON);
	ISET (mb_Fire, ITEM_FIRE);
	ISET (mb_HerbCon, ITEM_HERB_CON);
	ISET (mb_Boat, ITEM_BOAT);
	ISET (mb_Rune, ITEM_RUNE);
	ISET (mb_RunePouch, ITEM_RUNEPOUCH);

	// Save c-page items
	CAffectList& AList = m_bProto ? Idx.AffList : Obj.AffList;

	AList.RemoveAll ();

	#define	ASET(aa,bb)		if(aa) SetAffect(AList,bb,aa);

	ASET (mc_SavingPoison, APPLY_SAVING_POISON);
	ASET (mc_Age, APPLY_AGE);
	ASET (mc_Strength, APPLY_STR);
	ASET (mc_SavingRod, APPLY_SAVING_ROD);
	ASET (mc_Class, APPLY_CLASS);
	ASET (mc_Intelligence, APPLY_INT);
	ASET (mc_SavingPara, APPLY_SAVING_PARA);
	ASET (mc_Level, APPLY_LEVEL);
	ASET (mc_Wisdom, APPLY_WIS);
	ASET (mc_SavingBreath, APPLY_SAVING_BREATH);
	ASET (mc_Sex, APPLY_SEX);
	ASET (mc_Dexterity, APPLY_DEX);
	ASET (mc_SavingSpell, APPLY_SAVING_SPELL);
	ASET (mc_Height, APPLY_HEIGHT);
	ASET (mc_Constitution, APPLY_CON);
	ASET (mc_Weight, APPLY_WEIGHT);
	ASET (mc_Charm, APPLY_CHA);
	ASET (mc_Mana, APPLY_MANA);
	ASET (mc_Ac, APPLY_AC);
	ASET (mc_Hit, APPLY_HIT);
	ASET (mc_Hitroll, APPLY_HITROLL);
	ASET (mc_Gold, APPLY_GOLD);
	ASET (mc_Move, APPLY_MOVE);
	ASET (mc_Damroll, APPLY_DAMROLL);
	ASET (mc_Experience, APPLY_EXP);

	#define	RSET(aa,bb)		SetRisAffect(aa,bb,AList);

	RSET (mc_rFire, RIS_FIRE);
	RSET (mc_rCold, RIS_COLD);
	RSET (mc_rElectricity, RIS_ELECTRICITY);
	RSET (mc_rEnergy, RIS_ENERGY);
	RSET (mc_rPoison, RIS_POISON);

	RSET (mc_rBlunt, RIS_BLUNT);
	RSET (mc_rPierce, RIS_PIERCE);
	RSET (mc_rSlash, RIS_SLASH);
	RSET (mc_rAcid, RIS_ACID);
	RSET (mc_rNonMagic, RIS_NONMAGIC);

	RSET (mc_rDrain, RIS_DRAIN);
	RSET (mc_rSleep, RIS_SLEEP);
	RSET (mc_rCharm, RIS_CHARM);
	RSET (mc_rHold, RIS_HOLD);
	RSET (mc_rMagic, RIS_MAGIC);

	RSET (mc_rPlus1, RIS_PLUS1);
	RSET (mc_rPlus2, RIS_PLUS2);
	RSET (mc_rPlus3, RIS_PLUS3);
	RSET (mc_rPlus4, RIS_PLUS4);
	RSET (mc_rPlus5, RIS_PLUS5);
	RSET (mc_rPlus6, RIS_PLUS6);

	// Save d-page items
	#define		AFSET(aa,bb)	if (aa) SetAffected (bb, AList);

	AFSET (md_Blind, AFF_BLIND);
	AFSET (md_DetectInv, AFF_DETECT_INVIS);
	AFSET (md_DetectEvil, AFF_DETECT_EVIL);
	AFSET (md_DetectMagic, AFF_DETECT_MAGIC);
	AFSET (md_DetectHidden, AFF_DETECT_HIDDEN);
	AFSET (md_Hold, AFF_HOLD);
	AFSET (md_Sanctuary, AFF_SANCTUARY);
	AFSET (md_FaerieFire, AFF_FAERIE_FIRE);
	AFSET (md_Infra, AFF_INFRARED);
	AFSET (md_Curse, AFF_CURSE);
	AFSET (md_Flaming, AFF_FLAMING);
	AFSET (md_Poison, AFF_POISON);
	AFSET (md_Protect, AFF_PROTECT);
	AFSET (md_Paralysis, AFF_PARALYSIS);
	AFSET (md_Sleep, AFF_SLEEP);
	AFSET (md_Hide, AFF_HIDE);
	AFSET (md_Sneak, AFF_SNEAK);
	AFSET (md_Charm, AFF_CHARM);
	AFSET (md_Fly, AFF_FLYING);
	AFSET (md_PassDoor, AFF_PASS_DOOR);
	AFSET (md_TrueSight, AFF_TRUESIGHT);
	AFSET (md_DetectTraps, AFF_DETECTTRAPS);
	AFSET (md_Scry, AFF_SCRYING);
	AFSET (md_FireShield, AFF_FIRESHIELD);
	AFSET (md_ShockShield, AFF_SHOCKSHIELD);
	AFSET (md_Float, AFF_FLOATING);
	AFSET (md_Invisible, AFF_INVISIBLE);

	// Save e-page items
	Obj.m_ExtraFlags.Empty ();	// clear them all then set the marked ones
	if (m_bProto) {
		Idx.m_ExtraFlags.Empty ();
		Obj.SetPrototype ();
		Idx.SetPrototype ();
	}

	#define	ESET(aa,bb)		if (aa) {								\
								Obj.m_ExtraFlags.SetBit (bb);		\
								if (m_bProto)						\
									Idx.m_ExtraFlags.SetBit (bb);	\
							}

	ESET (me_Evil, ITEM_EVIL);
	ESET (me_AntiGood, ITEM_ANTI_GOOD);
	ESET (me_NoDrop, ITEM_NODROP);
	ESET (me_Invis, ITEM_INVIS);
	ESET (me_AntiEvil, ITEM_ANTI_EVIL);
	ESET (me_NoRemove, ITEM_NOREMOVE);
	ESET (me_Hidden, ITEM_HIDDEN);
	ESET (me_AntiNeutral, ITEM_ANTI_NEUTRAL);
	ESET (me_Inventory, ITEM_INVENTORY);
	ESET (me_Glow, ITEM_GLOW);
	ESET (me_Bless, ITEM_BLESS);
	ESET (me_Donation, ITEM_DONATION);
	ESET (me_Hum, ITEM_HUM);
	ESET (me_Metal, ITEM_METAL);
	ESET (me_ClanObj, ITEM_CLANOBJECT);
	ESET (me_Dark, ITEM_DARK);
	ESET (me_Organic, ITEM_ORGANIC);
	ESET (me_ClanCorpse, ITEM_CLANCORPSE);
	ESET (me_Magic, ITEM_MAGIC);
	ESET (me_Loyal, ITEM_LOYAL);
	ESET (me_DeathRot, ITEM_DEATHROT);

	Obj.wear_flags = 0;			// clear them all then set the marked ones
	if (m_bProto)
		Idx.wear_flags = 0;

	#define	WSET(aa,bb)		if (aa) {						\
								Obj.wear_flags |= bb;		\
								if (m_bProto)				\
									Idx.wear_flags |= bb;	\
							}

	WSET (me_Take, ITEM_TAKE);
	WSET (me_Finger, ITEM_WEAR_FINGER);
	WSET (me_Neck, ITEM_WEAR_NECK);
	WSET (me_Body, ITEM_WEAR_BODY);
	WSET (me_Head, ITEM_WEAR_HEAD);
	WSET (me_Legs, ITEM_WEAR_LEGS);
	WSET (me_Feet, ITEM_WEAR_FEET);
	WSET (me_Hands, ITEM_WEAR_HANDS);
	WSET (me_Arms, ITEM_WEAR_ARMS);
	WSET (me_Shield, ITEM_WEAR_SHIELD);
	WSET (me_About, ITEM_WEAR_ABOUT);
	WSET (me_Waist, ITEM_WEAR_WAIST);
	WSET (me_Wrist, ITEM_WEAR_WRIST);
	WSET (me_Wield, ITEM_WIELD);
	WSET (me_Hold, ITEM_HOLD);
	WSET (me_Dual, ITEM_DUAL_WIELD);
	WSET (me_Ears, ITEM_WEAR_EARS);
	WSET (me_Eyes, ITEM_WEAR_EYES);

	// Save f-page items
	CBitVector	anti;
	for (int cl=0; cl < ClassTable.GetCount (); ++cl)
		if (mf_AntiClass [cl])
			anti.SetBit (cl);
	if (m_bProto)
		Idx.SetAntiClassFlags (anti);
	else Obj.SetAntiClassFlags (anti);
}


CObjectMenu::CObjectMenu (CObjData& Obj)
{
	ClearAddrRange (&ma_Level, &mf_AntiClass, sizeof (mf_AntiClass));
	CObjIndexData	&Idx = *Obj.pIndexData;

	m_pObj = &Obj;
	m_Vnum = Idx.vnum;				// keep vnum for display
	m_bProto = Idx.IsPrototype ();

	// load local a-page items
	ma_Name = m_bProto ? Idx.GetName () : Obj.GetName ();
	ma_Short = m_bProto ? Idx.GetShortDescr () : Obj.GetShortDescr ();
	ma_Desc = m_bProto ? Idx.GetDescription () : Obj.GetDescription ();
	ma_ActDesc = m_bProto ? Idx.GetActionDescr () : Obj.GetActionDescr ();

	ma_Level = m_bProto ? Idx.level : Obj.GetLevel ();

	int		*Value = m_bProto ? Idx.value : Obj.value;
	for (int i=0; i < 6; ++i)
		ma_Value [i] = Value [i];

	ma_Weight = m_bProto ? Idx.weight : Obj.weight;
	ma_Cost = m_bProto ? Idx.cost : Obj.cost;

	short	IType = m_bProto ? Idx.item_type : Obj.item_type;

	ma_pItemStr1 = GetItemString (IType, 1);
	ma_pItemStr2 = GetItemString (IType, 2);
	ma_pItemStr3 = GetItemString (IType, 3);
	ma_pItemStr4 = GetItemString (IType, 4);

	// load local b-page items
	mb_Fountain = IType == ITEM_FOUNTAIN;
	mb_Furniture = IType == ITEM_FURNITURE;
	mb_Armor = IType == ITEM_ARMOR;
	mb_Food = IType == ITEM_FOOD;
	mb_Money = IType == ITEM_MONEY;
	mb_Potion = IType == ITEM_POTION;
	mb_Chain = IType == ITEM_PULLCHAIN;
	mb_Weapon = IType == ITEM_WEAPON;
	mb_Map = IType == ITEM_MAP;
	mb_Light = IType == ITEM_LIGHT;
	mb_Button = IType == ITEM_BUTTON;
	mb_Treasure = IType == ITEM_TREASURE;
	mb_Herb = IType == ITEM_HERB;
	mb_Trash = IType == ITEM_TRASH;
	mb_Switch = IType == ITEM_SWITCH;
	mb_Container = IType == ITEM_CONTAINER;
	mb_Wand = IType == ITEM_WAND;
	mb_Scroll = IType == ITEM_SCROLL;
	mb_Staff = IType == ITEM_STAFF;
	mb_BloodStain = IType == ITEM_BLOODSTAIN;
	mb_Pill = IType == ITEM_PILL;
	mb_Blood = IType == ITEM_BLOOD;
	mb_Dial = IType == ITEM_DIAL;
	mb_OldTrap = IType == ITEM_TRAP;
	mb_Key = IType == ITEM_KEY;
	mb_Incense = IType == ITEM_INCENSE;
	mb_Lever = IType == ITEM_LEVER;
	mb_CorpsePC = IType == ITEM_CORPSE_PC;
	mb_Pipe = IType == ITEM_PIPE;
	mb_Scraps = IType == ITEM_SCRAPS;
	mb_Trap = IType == ITEM_TRAP;
	mb_CorpseNPC = IType == ITEM_CORPSE_NPC;
	mb_Book = IType == ITEM_BOOK;
	mb_Match = IType == ITEM_MATCH;
	mb_DrinkCon = IType == ITEM_DRINK_CON;
	mb_Portal = FALSE;
	mb_Pen = FALSE;
	mb_Fire = IType == ITEM_FIRE;
	mb_HerbCon = IType == ITEM_HERB_CON;
	mb_fireweapon = FALSE;
	mb_Boat = IType == ITEM_BOAT;
	mb_Rune = IType == ITEM_RUNE;
	mb_RunePouch = IType == ITEM_RUNEPOUCH;
	mb_Missile = FALSE;

	// load local c-page items
	CAffectList& AList = m_bProto ? Idx.AffList : Obj.AffList;

	mc_SavingPoison = GetAffect (AList, APPLY_SAVING_POISON);
	mc_Age = GetAffect (AList, APPLY_AGE);
	mc_Strength = GetAffect (AList, APPLY_STR);
	mc_SavingRod = GetAffect (AList, APPLY_SAVING_ROD);
	mc_Class = GetAffect (AList, APPLY_CLASS);
	mc_Intelligence = GetAffect (AList, APPLY_INT);
	mc_SavingPara = GetAffect (AList, APPLY_SAVING_PARA);
	mc_Level = GetAffect (AList, APPLY_LEVEL);
	mc_Wisdom = GetAffect (AList, APPLY_WIS);
	mc_SavingBreath = GetAffect (AList, APPLY_SAVING_BREATH);
	mc_Sex = GetAffect (AList, APPLY_SEX);
	mc_Dexterity = GetAffect (AList, APPLY_DEX);
	mc_SavingSpell = GetAffect (AList, APPLY_SAVING_SPELL);
	mc_Height = GetAffect (AList, APPLY_HEIGHT);
	mc_Constitution = GetAffect (AList, APPLY_CON);
	mc_Weight = GetAffect (AList, APPLY_WEIGHT);
	mc_Charm = GetAffect (AList, APPLY_CHA);
	mc_Mana = GetAffect (AList, APPLY_MANA);
	mc_Ac = GetAffect (AList, APPLY_AC);
	mc_Hit = GetAffect (AList, APPLY_HIT);
	mc_Hitroll = GetAffect (AList, APPLY_HITROLL);
	mc_Gold = GetAffect (AList, APPLY_GOLD);
	mc_Move = GetAffect (AList, APPLY_MOVE);
	mc_Damroll = GetAffect (AList, APPLY_DAMROLL);
	mc_Experience = GetAffect (AList, APPLY_EXP);


	SetRisString (mc_rFire, AList, RIS_FIRE);
	SetRisString (mc_rCold, AList, RIS_COLD);
	SetRisString (mc_rElectricity, AList, RIS_ELECTRICITY);
	SetRisString (mc_rEnergy, AList, RIS_ENERGY);
	SetRisString (mc_rPoison, AList, RIS_POISON);

	SetRisString (mc_rBlunt, AList, RIS_BLUNT);
	SetRisString (mc_rPierce, AList, RIS_PIERCE);
	SetRisString (mc_rSlash, AList, RIS_SLASH);
	SetRisString (mc_rAcid, AList, RIS_ACID);
	SetRisString (mc_rNonMagic, AList, RIS_NONMAGIC);

	SetRisString (mc_rDrain, AList, RIS_DRAIN);
	SetRisString (mc_rSleep, AList, RIS_SLEEP);
	SetRisString (mc_rCharm, AList, RIS_CHARM);
	SetRisString (mc_rHold, AList, RIS_HOLD);
	SetRisString (mc_rMagic, AList, RIS_MAGIC);

	SetRisString (mc_rPlus1, AList, RIS_PLUS1);
	SetRisString (mc_rPlus2, AList, RIS_PLUS2);
	SetRisString (mc_rPlus3, AList, RIS_PLUS3);
	SetRisString (mc_rPlus4, AList, RIS_PLUS4);
	SetRisString (mc_rPlus5, AList, RIS_PLUS5);
	SetRisString (mc_rPlus6, AList, RIS_PLUS6);

	// load local d-page items
	md_Blind = GetAffected (AList, AFF_BLIND);
	md_DetectInv = GetAffected (AList, AFF_DETECT_INVIS);
	md_DetectEvil = GetAffected (AList, AFF_DETECT_EVIL);
	md_DetectMagic = GetAffected (AList, AFF_DETECT_MAGIC);
	md_DetectHidden = GetAffected (AList, AFF_DETECT_HIDDEN);
	md_Hold = GetAffected (AList, AFF_HOLD);
	md_Sanctuary = GetAffected (AList, AFF_SANCTUARY);
	md_FaerieFire = GetAffected (AList, AFF_FAERIE_FIRE);
	md_Infra = GetAffected (AList, AFF_INFRARED);
	md_Curse = GetAffected (AList, AFF_CURSE);
	md_Flaming = GetAffected (AList, AFF_FLAMING);
	md_Poison = GetAffected (AList, AFF_POISON);
	md_Protect = GetAffected (AList, AFF_PROTECT);
	md_Paralysis = GetAffected (AList, AFF_PARALYSIS);
	md_Sleep = GetAffected (AList, AFF_SLEEP);
	md_Hide = GetAffected (AList, AFF_HIDE);
	md_Sneak = GetAffected (AList, AFF_SNEAK);
	md_Charm = GetAffected (AList, AFF_CHARM);
	md_Fly = GetAffected (AList, AFF_FLYING);
	md_PassDoor = GetAffected (AList, AFF_PASS_DOOR);
	md_TrueSight = GetAffected (AList, AFF_TRUESIGHT);
	md_DetectTraps = GetAffected (AList, AFF_DETECTTRAPS);
	md_Scry = GetAffected (AList, AFF_SCRYING);
	md_FireShield = GetAffected (AList, AFF_FIRESHIELD);
	md_ShockShield = GetAffected (AList, AFF_SHOCKSHIELD);
	md_Float = GetAffected (AList, AFF_FLOATING);
	md_Invisible = GetAffected (AList, AFF_INVISIBLE);

	// load local e-page items

	#define		TST(aa)	m_bProto ? Idx.aa() : Obj.aa ()

	me_Evil = TST(IsEvil);
	me_AntiGood = TST(IsAntiGood);
	me_NoDrop = TST(IsNoDrop);
	me_Invis = TST(IsInvisible);
	me_AntiEvil = TST(IsAntiEvil);
	me_NoRemove = TST(IsNoRemove);
	me_Hidden = TST(IsHidden);
	me_AntiNeutral = TST(IsAntiNeutral);
	me_Inventory = TST(IsInventory);
	me_Glow = TST(IsGlowing);
	me_Bless = TST(IsBlessed);
	me_Donation = TST(IsDonation);
	me_Hum = TST(IsHumming);
	me_Metal = TST(IsMetal);
	me_ClanObj = TST(IsClanObject);
	me_Dark = TST(IsDark);
	me_Organic = TST(IsOrganic);
	me_ClanCorpse = TST(IsClanCorpse);
	me_Magic = TST(IsMagic);
	me_Loyal = TST(IsLoyal);
	me_DeathRot = TST(IsDeathrot);

	int		WearFlags = m_bProto ? Idx.wear_flags : Obj.wear_flags;

	me_Take = IS_SET (WearFlags, ITEM_TAKE);
	me_Finger = IS_SET (WearFlags, ITEM_WEAR_FINGER);
	me_Neck = IS_SET (WearFlags, ITEM_WEAR_NECK);
	me_Body = IS_SET (WearFlags, ITEM_WEAR_BODY);
	me_Head = IS_SET (WearFlags, ITEM_WEAR_HEAD);
	me_Legs = IS_SET (WearFlags, ITEM_WEAR_LEGS);
	me_Feet = IS_SET (WearFlags, ITEM_WEAR_FEET);
	me_Hands = IS_SET (WearFlags, ITEM_WEAR_HANDS);
	me_Arms = IS_SET (WearFlags, ITEM_WEAR_ARMS);
	me_Shield = IS_SET (WearFlags, ITEM_WEAR_SHIELD);
	me_About = IS_SET (WearFlags, ITEM_WEAR_ABOUT);
	me_Waist = IS_SET (WearFlags, ITEM_WEAR_WAIST);
	me_Wrist = IS_SET (WearFlags, ITEM_WEAR_WRIST);
	me_Wield = IS_SET (WearFlags, ITEM_WIELD);
	me_Hold = IS_SET (WearFlags, ITEM_HOLD);
	me_Dual = IS_SET (WearFlags, ITEM_DUAL_WIELD);
	me_Ears = IS_SET (WearFlags, ITEM_WEAR_EARS);
	me_Eyes = IS_SET (WearFlags, ITEM_WEAR_EYES);


	// load local f-page items
	memset (mf_AntiClass, 0, sizeof (mf_AntiClass));
	CBitVector	anti =
		m_bProto ? Idx.GetAntiClassFlags () : Obj.GetAntiClassFlags ();
	
	for (int cl=0; cl < 32 && cl < ClassTable.GetCount (); ++cl)
		mf_AntiClass [cl] = anti.IsSet (cl);
}


#ifdef XXXX
	char				buf [80];
	int					len;
	extern CMenuData	ObjPage_F [];		// forward declaration

	char	*pPagef = new char [strlen (ObjMenus [5])];
	strcpy (pPagef, ObjMenus [5]);
	ObjMenus [5] = pPagef;

	for (int cl=0; cl < 32; ++cl) {
		if (cl < ClassTable.GetCount ()) {
			mf_AntiClass [cl] = anti.IsSet (cl);
			len = sprintf (buf, "%c]%-10.10s( )",
				cl + 'a', ClassTable.GetName (cl));
		}
		else len = sprintf (buf, "               ");

		char	*ptr = pPagef + 71 * (ObjPage_F [cl].y - 1);
		ptr += ObjPage_F [cl].x - 14;
		memcpy (ptr, buf, len);
	}
#endif

void CObjectMenu::InitObjectMenu ()
{
	char				buf [80];
	int					len;
	extern CMenuData	ObjPage_F [];		// forward declaration

	m_pSavePagef = ObjMenus [5];
	char	*pPagef = new char [1 + strlen (ObjMenus [5])];
	strcpy (pPagef, ObjMenus [5]);
	ObjMenus [5] = pPagef;

	for (int cl=0; cl < 32; ++cl) {
		if (cl < ClassTable.GetCount ()) {
			len = sprintf (buf, "%c]%-10.10s( )",
				cl + 'a', ClassTable.GetName (cl));
		}
		else len = sprintf (buf, "               ");

		char	*ptr = pPagef + 71 * (ObjPage_F [cl].y - 1);
		ptr += ObjPage_F [cl].x - 14;
		memcpy (ptr, buf, len);
	}
}


void CObjectMenu::UnInitObjectMenu ()
{
	delete [] ObjMenus [5];
	ObjMenus [5] = m_pSavePagef;
}


void SetRisAffect (char* ris, int bit, CAffectList& AList)
{
	int	apply = 0;

	for (int i=0; i < 3; ++i) {
		if (ris [i] > '.') {
			apply = APPLY_RESISTANT + i;
			CAffectData	*aff = AList.GetAffect (apply);
			if (! aff) {
				aff = new CAffectData;
				AList.AddTail (aff);
				aff->location = apply;
				++top_affect;
			}
			SET_BIT (aff->modifier, bit);
		}
	}
}


void SetAffected (int bit, CAffectList& AList)
{
	CAffectData	*aff = new CAffectData;
	aff->location = APPLY_AFFECT;
	AList.AddTail (aff);
	++top_affect;
	SET_BIT (aff->modifier, 1 << bit);
}



#define		OFFSET(aa)	offsetof(CObjectMenu,aa)

CMenuData	ObjPage_A [] = {
	{ '1', 'a', 2, 20, 52, OFFSET(ma_Name), MT_CSTRING, 0, NULL },
	{ '1', 'b', 3, 21, 3,  OFFSET(ma_Level), MT_INT, 0, NULL },
	{ '1', 'c', 4, 11, 62, OFFSET(ma_Short), MT_CSTRING, 0, NULL },
	{ '1', 'd', 5, 10, 62, OFFSET(ma_Desc), MT_CSTRING, 0, MenuStringEditFn },
	{ '1', 'e', 6, 16, 56, OFFSET(ma_ActDesc), MT_CSTRING, 0, MenuStringEditFn },

	{ '2', 'a', 10, 13, 5, OFFSET(ma_Value[0]), MT_INT, 0, NULL },
	{ 0, 0, 10, 23, 19, OFFSET(ma_pItemStr1), MT_STRING, 0, NULL },
	{ '2', 'b', 11, 13, 5, OFFSET(ma_Value[1]), MT_INT, 0, NULL },
	{ 0, 0, 11, 23, 19, OFFSET(ma_pItemStr2), MT_STRING, 0, NULL },
	{ '2', 'c', 12, 13, 5, OFFSET(ma_Value[2]), MT_INT, 0, NULL },
	{ 0, 0, 12, 23, 19, OFFSET(ma_pItemStr3), MT_STRING, 0, NULL },
	{ '2', 'd', 13, 13, 5, OFFSET(ma_Value[3]), MT_INT, 0, NULL },
	{ 0, 0, 13, 23, 19, OFFSET(ma_pItemStr4), MT_STRING, 0, NULL },
	{ '3', 'a', 10, 59, 5, OFFSET(ma_Weight), MT_INT, 0, NULL },
	{ '3', 'b', 11, 59, 5, OFFSET(ma_Cost), MT_INT, 0, NULL },
	{ 0, 0, 0, 0, 0, 0, MT_END }
};


CMenuData	ObjPage_B [] = {
	{ '1', 'a', 6, 9, 1, OFFSET(mb_Herb), MT_BOOL, 0, NULL },
	{ '1', 'b', 7, 9, 1, OFFSET(mb_Wand), MT_BOOL, 0, NULL },
	{ '1', 'c', 8, 9, 1, OFFSET(mb_Pill), MT_BOOL, 0, NULL },
	{ '1', 'd', 9, 9, 1, OFFSET(mb_Key), MT_BOOL, 0, NULL },
	{ '1', 'e', 10, 9, 1, OFFSET(mb_Pipe), MT_BOOL, 0, NULL },
	{ '1', 'f', 11, 9, 1, OFFSET(mb_Book), MT_BOOL, 0, NULL },
	{ '1', 'g', 12, 9, 1, OFFSET(mb_Pen), MT_BOOL, 0, NULL },
	{ '1', 'h', 13, 9, 1, OFFSET(mb_Boat), MT_BOOL, 0, NULL },

	{ '1', 'i', 2, 23, 1, OFFSET(mb_Map), MT_BOOL, 0, NULL },
	{ '1', 'j', 3, 23, 1, OFFSET(mb_Armor), MT_BOOL, 0, NULL },
	{ '1', 'k', 4, 23, 1, OFFSET(mb_Potion), MT_BOOL, 0, NULL },
	{ '1', 'l', 5, 23, 1, OFFSET(mb_Light), MT_BOOL, 0, NULL },
	{ '1', 'm', 6, 23, 1, OFFSET(mb_Trash), MT_BOOL, 0, NULL },
	{ '1', 'n', 7, 23, 1, OFFSET(mb_Scroll), MT_BOOL, 0, NULL },
	{ '1', 'o', 8, 23, 1, OFFSET(mb_Blood), MT_BOOL, 0, NULL },
	{ '1', 'p', 9, 23, 1, OFFSET(mb_Incense), MT_BOOL, 0, NULL },
	{ '1', 'q', 10, 23, 1, OFFSET(mb_Scraps), MT_BOOL, 0, NULL },
	{ '1', 'r', 11, 23, 1, OFFSET(mb_Match), MT_BOOL, 0, NULL },
	{ '1', 's', 12, 23, 1, OFFSET(mb_Fire), MT_BOOL, 0, NULL },
	{ '1', 't', 13, 23, 1, OFFSET(mb_Rune), MT_BOOL, 0, NULL },

	{ '1', 'u', 2, 42, 1, OFFSET(mb_Fountain), MT_BOOL, 0, NULL },
	{ '1', 'v', 3, 42, 1, OFFSET(mb_Food), MT_BOOL, 0, NULL },
	{ '1', 'w', 4, 42, 1, OFFSET(mb_Chain), MT_BOOL, 0, NULL },
	{ '1', 'x', 5, 42, 1, OFFSET(mb_Button), MT_BOOL, 0, NULL },
	{ '1', 'y', 6, 42, 1, OFFSET(mb_Switch), MT_BOOL, 0, NULL },
	{ '1', 'z', 7, 42, 1, OFFSET(mb_Staff), MT_BOOL, 0, NULL },
	{ '1', 'A', 8, 42, 1, OFFSET(mb_Dial), MT_BOOL, 0, NULL },
	{ '1', 'B', 9, 42, 1, OFFSET(mb_Lever), MT_BOOL, 0, NULL },
	{ '1', 'C', 10, 42, 1, OFFSET(mb_Trap), MT_BOOL, 0, NULL },
	{ '1', 'D', 11, 42, 1, OFFSET(mb_DrinkCon), MT_BOOL, 0, NULL },
	{ '1', 'E', 12, 42, 1, OFFSET(mb_HerbCon), MT_BOOL, 0, NULL },
	{ '1', 'F', 13, 42, 1, OFFSET(mb_RunePouch), MT_BOOL, 0, NULL },

	{ '1', 'G', 2, 66, 1, OFFSET(mb_Furniture), MT_BOOL, 0, NULL },
	{ '1', 'H', 3, 66, 1, OFFSET(mb_Money), MT_BOOL, 0, NULL },
	{ '1', 'I', 4, 66, 1, OFFSET(mb_Weapon), MT_BOOL, 0, NULL },
	{ '1', 'J', 5, 66, 1, OFFSET(mb_Treasure), MT_BOOL, 0, NULL },
	{ '1', 'K', 6, 66, 1, OFFSET(mb_Container), MT_BOOL, 0, NULL },
	{ '1', 'L', 7, 66, 1, OFFSET(mb_BloodStain), MT_BOOL, 0, NULL },
	{ '1', 'M', 8, 66, 1, OFFSET(mb_OldTrap), MT_BOOL, 0, NULL },
	{ '1', 'N', 9, 66, 1, OFFSET(mb_CorpsePC), MT_BOOL, 0, NULL },
	{ '1', 'O', 10, 66, 1, OFFSET(mb_CorpseNPC), MT_BOOL, 0, NULL },
	{ '1', 'P', 11, 66, 1, OFFSET(mb_Portal), MT_BOOL, 0, NULL },
	{ '1', 'Q', 12, 66, 1, OFFSET(mb_fireweapon), MT_BOOL, 0, NULL },
	{ '1', 'R', 13, 66, 1, OFFSET(mb_Missile), MT_BOOL, 0, NULL },
	{ 0, 0, 0, 0, 0, 0, MT_END }
};


CMenuData	ObjPage_C [] = {
	{ '1', 'a', 2, 23, 2, OFFSET(mc_Strength), MT_INT, 0, NULL },
	{ '1', 'b', 3, 23, 2, OFFSET(mc_Intelligence), MT_INT, 0, NULL },
	{ '1', 'c', 4, 23, 2, OFFSET(mc_Wisdom), MT_INT, 0, NULL },
	{ '1', 'd', 5, 23, 2, OFFSET(mc_Dexterity), MT_INT, 0, NULL },
	{ '1', 'e', 6, 23, 2, OFFSET(mc_Constitution), MT_INT, 0, NULL },
	{ '1', 'f', 7, 23, 2, OFFSET(mc_Charm), MT_INT, 0, NULL },
	{ '1', 'g', 2, 45, 3, OFFSET(mc_SavingPoison), MT_INT, 0, NULL },
	{ '1', 'h', 3, 45, 3, OFFSET(mc_SavingRod), MT_INT, 0, NULL },
	{ '1', 'i', 4, 45, 3, OFFSET(mc_SavingPara), MT_INT, 0, NULL },
	{ '1', 'j', 5, 45, 3, OFFSET(mc_SavingBreath), MT_INT, 0, NULL },
	{ '1', 'k', 6, 45, 3, OFFSET(mc_SavingSpell), MT_INT, 0, NULL },
	{ '1', 'l', 2, 66, 3, OFFSET(mc_Age), MT_INT, 0, NULL },
	{ '1', 'm', 3, 66, 3, OFFSET(mc_Class), MT_INT, 0, NULL },
	{ '1', 'n', 4, 66, 3, OFFSET(mc_Level), MT_INT, 0, NULL },
	{ '1', 'o', 5, 66, 1, OFFSET(mc_Sex), MT_INT, 0, NULL },
	{ '1', 'p', 6, 66, 3, OFFSET(mc_Height), MT_INT, 0, NULL },
	{ '1', 'q', 7, 66, 3, OFFSET(mc_Weight), MT_INT, 0, NULL },
	{ '1', 'r', 9, 12, 4, OFFSET(mc_Mana), MT_INT, 0, NULL },
	{ '1', 's', 10, 12, 4, OFFSET(mc_Hit), MT_INT, 0, NULL },
	{ '1', 't', 11, 12, 4, OFFSET(mc_Move), MT_INT, 0, NULL },
	{ '1', 'u', 9, 41, 4, OFFSET(mc_Ac), MT_SINT, 0, NULL },
	{ '1', 'v', 10, 41, 4, OFFSET(mc_Hitroll), MT_INT, 0, NULL },
	{ '1', 'w', 11, 41, 4, OFFSET(mc_Damroll), MT_INT, 0, NULL },
	{ '1', 'x', 10, 63, 4, OFFSET(mc_Gold), MT_INT, 0, NULL },
	{ '1', 'y', 11, 63, 4, OFFSET(mc_Experience), MT_INT, 0, NULL },

	{ '2', 'a', 13, 22, 3, OFFSET(mc_rFire), MT_RIS, 0, NULL },
	{ '2', 'b', 14, 22, 3, OFFSET(mc_rCold), MT_RIS, 0, NULL },
	{ '2', 'c', 15, 22, 3, OFFSET(mc_rElectricity), MT_RIS, 0, NULL },
	{ '2', 'd', 16, 22, 3, OFFSET(mc_rEnergy), MT_RIS, 0, NULL },
	{ '2', 'e', 17, 22, 3, OFFSET(mc_rPoison), MT_RIS, 0, NULL },
	{ '2', 'f', 13, 34, 3, OFFSET(mc_rBlunt), MT_RIS, 0, NULL },
	{ '2', 'g', 14, 34, 3, OFFSET(mc_rPierce), MT_RIS, 0, NULL },
	{ '2', 'h', 15, 34, 3, OFFSET(mc_rSlash), MT_RIS, 0, NULL },
	{ '2', 'i', 16, 34, 3, OFFSET(mc_rAcid), MT_RIS, 0, NULL },
	{ '2', 'j', 17, 34, 3, OFFSET(mc_rNonMagic), MT_RIS, 0, NULL },
	{ '2', 'k', 13, 46, 3, OFFSET(mc_rDrain), MT_RIS, 0, NULL },
	{ '2', 'l', 14, 46, 3, OFFSET(mc_rSleep), MT_RIS, 0, NULL },
	{ '2', 'm', 15, 46, 3, OFFSET(mc_rCharm), MT_RIS, 0, NULL },
	{ '2', 'n', 16, 46, 3, OFFSET(mc_rHold), MT_RIS, 0, NULL },
	{ '2', 'o', 17, 46, 3, OFFSET(mc_rMagic), MT_RIS, 0, NULL },
	{ '2', 'p', 13, 58, 3, OFFSET(mc_rPlus1), MT_RIS, 0, NULL },
	{ '2', 'q', 13, 70, 3, OFFSET(mc_rPlus2), MT_RIS, 0, NULL },
	{ '2', 'r', 14, 70, 3, OFFSET(mc_rPlus3), MT_RIS, 0, NULL },
	{ '2', 's', 15, 70, 3, OFFSET(mc_rPlus4), MT_RIS, 0, NULL },
	{ '2', 't', 16, 70, 3, OFFSET(mc_rPlus5), MT_RIS, 0, NULL },
	{ '2', 'u', 17, 70, 3, OFFSET(mc_rPlus6), MT_RIS, 0, NULL },
	{ 0, 0, 0, 0, 0, 0, MT_END }
};


CMenuData	ObjPage_D [] = {
	{ '1', 'a', 8, 12, 1, OFFSET(md_Fly), MT_BOOL, 0, NULL },
	{ '1', 'b', 9, 12, 1, OFFSET(md_Scry), MT_BOOL, 0, NULL },
	{ '1', 'c', 10, 12, 1, OFFSET(md_Invisible), MT_BOOL, 0, NULL },

	{ '1', 'd', 3, 29, 1, OFFSET(md_Sleep), MT_BOOL, 0, NULL },
	{ '1', 'e', 4, 29, 1, OFFSET(md_Blind), MT_BOOL, 0, NULL },
	{ '1', 'f', 5, 29, 1, OFFSET(md_DetectMagic), MT_BOOL, 0, NULL },
	{ '1', 'g', 6, 29, 1, OFFSET(md_FaerieFire), MT_BOOL, 0, NULL },
	{ '1', 'h', 7, 29, 1, OFFSET(md_Poison), MT_BOOL, 0, NULL },
	{ '1', 'i', 8, 29, 1, OFFSET(md_Hide), MT_BOOL, 0, NULL },
	{ '1', 'j', 9, 29, 1, OFFSET(md_PassDoor), MT_BOOL, 0, NULL },
	{ '1', 'k', 10, 29, 1, OFFSET(md_FireShield), MT_BOOL, 0, NULL },

	{ '1', 'l', 3, 47, 1, OFFSET(md_Sanctuary), MT_BOOL, 0, NULL },
	{ '1', 'm', 4, 47, 1, OFFSET(md_DetectInv), MT_BOOL, 0, NULL },
	{ '1', 'n', 5, 47, 1, OFFSET(md_DetectHidden), MT_BOOL, 0, NULL },
	{ '1', 'o', 6, 47, 1, OFFSET(md_Infra), MT_BOOL, 0, NULL },
	{ '1', 'p', 7, 47, 1, OFFSET(md_Protect), MT_BOOL, 0, NULL },
	{ '1', 'q', 8, 47, 1, OFFSET(md_Sneak), MT_BOOL, 0, NULL },
	{ '1', 'r', 9, 47, 1, OFFSET(md_TrueSight), MT_BOOL, 0, NULL },
	{ '1', 's', 10, 47, 1, OFFSET(md_ShockShield), MT_BOOL, 0, NULL },

	{ '1', 't', 3, 63, 1, OFFSET(md_Flaming), MT_BOOL, 0, NULL },
	{ '1', 'u', 4, 63, 1, OFFSET(md_DetectEvil), MT_BOOL, 0, NULL },
	{ '1', 'v', 5, 63, 1, OFFSET(md_Hold), MT_BOOL, 0, NULL },
	{ '1', 'w', 6, 63, 1, OFFSET(md_Curse), MT_BOOL, 0, NULL },
	{ '1', 'x', 7, 63, 1, OFFSET(md_Paralysis), MT_BOOL, 0, NULL },
	{ '1', 'y', 8, 63, 1, OFFSET(md_Charm), MT_BOOL, 0, NULL },
	{ '1', 'z', 9, 63, 1, OFFSET(md_DetectTraps), MT_BOOL, 0, NULL },
	{ '1', 'A', 10, 63, 1, OFFSET(md_Float), MT_BOOL, 0, NULL },
	{ 0, 0, 0, 0, 0, 0, MT_END }
};


CMenuData	ObjPage_E [] = {
	{ '1', 'a', 6, 12, 1, OFFSET(me_Glow), MT_BOOL, 0, NULL },
	{ '1', 'b', 7, 12, 1, OFFSET(me_Hum), MT_BOOL, 0, NULL },
	{ '1', 'c', 8, 12, 1, OFFSET(me_Dark), MT_BOOL, 0, NULL },

	{ '1', 'd', 3, 28, 1, OFFSET(me_Magic), MT_BOOL, 0, NULL },
	{ '1', 'e', 4, 28, 1, OFFSET(me_Loyal), MT_BOOL, 0, NULL },
	{ '1', 'f', 5, 28, 1, OFFSET(me_Evil), MT_BOOL, 0, NULL },
	{ '1', 'g', 6, 28, 1, OFFSET(me_Invis), MT_BOOL, 0, NULL },
	{ '1', 'h', 7, 28, 1, OFFSET(me_Hidden), MT_BOOL, 0, NULL },
	{ '1', 'i', 8, 28, 1, OFFSET(me_Bless), MT_BOOL, 0, NULL },

	{ '1', 'j', 3, 47, 1, OFFSET(me_Metal), MT_BOOL, 0, NULL },
	{ '1', 'k', 4, 47, 1, OFFSET(me_Organic), MT_BOOL, 0, NULL },
	{ '1', 'l', 5, 47, 1, OFFSET(me_AntiGood), MT_BOOL, 0, NULL },
	{ '1', 'm', 6, 47, 1, OFFSET(me_AntiEvil), MT_BOOL, 0, NULL },
	{ '1', 'n', 7, 47, 1, OFFSET(me_AntiNeutral), MT_BOOL, 0, NULL },
	{ '1', 'o', 8, 47, 1, OFFSET(me_NoDrop), MT_BOOL, 0, NULL },

	{ '1', 'p', 3, 65, 1, OFFSET(me_NoRemove), MT_BOOL, 0, NULL },
	{ '1', 'q', 4, 65, 1, OFFSET(me_Inventory), MT_BOOL, 0, NULL },
	{ '1', 'r', 5, 65, 1, OFFSET(me_Donation), MT_BOOL, 0, NULL },
	{ '1', 's', 6, 65, 1, OFFSET(me_ClanObj), MT_BOOL, 0, NULL },
	{ '1', 't', 7, 65, 1, OFFSET(me_ClanCorpse), MT_BOOL, 0, NULL },
	{ '1', 'u', 8, 65, 1, OFFSET(me_DeathRot), MT_BOOL, 0, NULL },

	{ '2', 'a', 14, 12, 1, OFFSET(me_Wrist), MT_BOOL, 0, NULL },
	{ '2', 'b', 15, 12, 1, OFFSET(me_Eyes), MT_BOOL, 0, NULL },

	{ '2', 'c', 11, 24, 1, OFFSET(me_Take), MT_BOOL, 0, NULL },
	{ '2', 'd', 12, 24, 1, OFFSET(me_Head), MT_BOOL, 0, NULL },
	{ '2', 'e', 13, 24, 1, OFFSET(me_Arms), MT_BOOL, 0, NULL },
	{ '2', 'f', 14, 24, 1, OFFSET(me_Wield), MT_BOOL, 0, NULL },

	{ '2', 'g', 11, 39, 1, OFFSET(me_Finger), MT_BOOL, 0, NULL },
	{ '2', 'h', 12, 39, 1, OFFSET(me_Legs), MT_BOOL, 0, NULL },
	{ '2', 'i', 13, 39, 1, OFFSET(me_Shield), MT_BOOL, 0, NULL },
	{ '2', 'j', 14, 39, 1, OFFSET(me_Hold), MT_BOOL, 0, NULL },

	{ '2', 'k', 11, 52, 1, OFFSET(me_Neck), MT_BOOL, 0, NULL },
	{ '2', 'l', 12, 52, 1, OFFSET(me_Feet), MT_BOOL, 0, NULL },
	{ '2', 'm', 13, 52, 1, OFFSET(me_About), MT_BOOL, 0, NULL },
	{ '2', 'n', 14, 52, 1, OFFSET(me_Dual), MT_BOOL, 0, NULL },

	{ '2', 'o', 11, 65, 1, OFFSET(me_Body), MT_BOOL, 0, NULL },
	{ '2', 'p', 12, 65, 1, OFFSET(me_Hands), MT_BOOL, 0, NULL },
	{ '2', 'q', 13, 65, 1, OFFSET(me_Waist), MT_BOOL, 0, NULL },
	{ '2', 'r', 14, 65, 1, OFFSET(me_Ears), MT_BOOL, 0, NULL },
	{ 0, 0, 0, 0, 0, 0, MT_END }
};


CMenuData	ObjPage_F [] = {
	{ '1', 'a', 6,  16, 1, OFFSET(mf_AntiClass [0]), MT_BOOL, 0, NULL },
	{ '1', 'b', 7,  16, 1, OFFSET(mf_AntiClass [1]), MT_BOOL, 0, NULL },
	{ '1', 'c', 8,  16, 1, OFFSET(mf_AntiClass [2]), MT_BOOL, 0, NULL },
	{ '1', 'd', 9,  16, 1, OFFSET(mf_AntiClass [3]), MT_BOOL, 0, NULL },
	{ '1', 'e', 10, 16, 1, OFFSET(mf_AntiClass [4]), MT_BOOL, 0, NULL },

	{ '1', 'f', 2,  33, 1, OFFSET(mf_AntiClass [5]), MT_BOOL, 0, NULL },
	{ '1', 'g', 3,  33, 1, OFFSET(mf_AntiClass [6]), MT_BOOL, 0, NULL },
	{ '1', 'h', 4,  33, 1, OFFSET(mf_AntiClass [7]), MT_BOOL, 0, NULL },
	{ '1', 'i', 5,  33, 1, OFFSET(mf_AntiClass [8]), MT_BOOL, 0, NULL },
	{ '1', 'j', 6,  33, 1, OFFSET(mf_AntiClass [9]), MT_BOOL, 0, NULL },
	{ '1', 'k', 7,  33, 1, OFFSET(mf_AntiClass [10]), MT_BOOL, 0, NULL },
	{ '1', 'l', 8,  33, 1, OFFSET(mf_AntiClass [11]), MT_BOOL, 0, NULL },
	{ '1', 'm', 9,  33, 1, OFFSET(mf_AntiClass [12]), MT_BOOL, 0, NULL },
	{ '1', 'n', 10, 33, 1, OFFSET(mf_AntiClass [13]), MT_BOOL, 0, NULL },

	{ '1', 'o', 2,  50, 1, OFFSET(mf_AntiClass [14]), MT_BOOL, 0, NULL },
	{ '1', 'p', 3,  50, 1, OFFSET(mf_AntiClass [15]), MT_BOOL, 0, NULL },
	{ '1', 'q', 4,  50, 1, OFFSET(mf_AntiClass [16]), MT_BOOL, 0, NULL },
	{ '1', 'r', 5,  50, 1, OFFSET(mf_AntiClass [17]), MT_BOOL, 0, NULL },
	{ '1', 's', 6,  50, 1, OFFSET(mf_AntiClass [18]), MT_BOOL, 0, NULL },
	{ '1', 't', 7,  50, 1, OFFSET(mf_AntiClass [19]), MT_BOOL, 0, NULL },
	{ '1', 'u', 8,  50, 1, OFFSET(mf_AntiClass [20]), MT_BOOL, 0, NULL },
	{ '1', 'v', 9,  50, 1, OFFSET(mf_AntiClass [21]), MT_BOOL, 0, NULL },
	{ '1', 'w', 10, 50, 1, OFFSET(mf_AntiClass [22]), MT_BOOL, 0, NULL },

	{ '1', 'x', 2,  67, 1, OFFSET(mf_AntiClass [23]), MT_BOOL, 0, NULL },
	{ '1', 'y', 3,  67, 1, OFFSET(mf_AntiClass [24]), MT_BOOL, 0, NULL },
	{ '1', 'z', 4,  67, 1, OFFSET(mf_AntiClass [25]), MT_BOOL, 0, NULL },
	{ '1', 'A', 5,  67, 1, OFFSET(mf_AntiClass [26]), MT_BOOL, 0, NULL },
	{ '1', 'B', 6,  67, 1, OFFSET(mf_AntiClass [27]), MT_BOOL, 0, NULL },
	{ '1', 'C', 7,  67, 1, OFFSET(mf_AntiClass [28]), MT_BOOL, 0, NULL },
	{ '1', 'D', 8,  67, 1, OFFSET(mf_AntiClass [29]), MT_BOOL, 0, NULL },
	{ '1', 'E', 9,  67, 1, OFFSET(mf_AntiClass [30]), MT_BOOL, 0, NULL },
	{ '1', 'F', 10, 67, 1, OFFSET(mf_AntiClass [31]), MT_BOOL, 0, NULL },
	{ 0, 0, 0, 0, 0, 0, MT_END }
};


CMenuData	*ObjMenuData [] = { ObjPage_A, ObjPage_B, ObjPage_C,
								ObjPage_D, ObjPage_E, ObjPage_F, NULL };


const char * ItemStrings [46][5] =
{ {"bad type",	"bad type",	"bad type",	"bad type",		"bad type"},	// 0
  {"light",		"unused",	"unused",	"timer",		"unused"},
  {"scroll",	"level",	"sn1",		"sn2",			"sn3"},
  {"wand",		"level",	"max charges","current charges","sn"},
  {"staff",		"level",	"max charges","current charges","sn"},
  {"weapon",	"condition","min hit",	"max hit",		"hit type"},
  {"undefined",	"unused",	"unused",	"unused",		"undefined"},
  {"undefined",	"unused",	"unused",	"unused",		"undefined"},
  {"treasure",	"type",		"condition","unused",		"unused"},
  {"armor",		"condition","original ac","unused",		"unused"},
  {"potion",	"level",	"sn1",		"sn2",			"sn3"},			// 10
  {"undefined",	"unused",	"unused",	"unused",		"undefined"},
  {"furniture",	"unused",	"unused",	"unused",		"unused"},
  {"trash",		"unused",	"unused",	"unused",		"unused"},
  {"undefined",	"unused",	"unused",	"unused",		"undefined"},
  {"container",	"max weight","flags",	"key vnum",		"condition"},
  {"undefined",	"unused",	"unused",	"unused",		"undefined"},
  {"drink con",	"capacity",	"how full",	"liquid number","is poisoned?"},
  {"key",		"vnum to",	"unused",	"unused",		"unused"},
  {"food",		"food_hours", "condition","unused",		"is poisoned?"},
  {"money",		"amt gold",	"unused",	"unused",		"unused"},		// 20
  {"undefined",	"unused",	"unused",	"unused",		"undefined"},
  {"boat",		"unused",	"unused",	"unused",		"unused"},
  {"npc corpse","unused",	"flags",	"unused",		"unused"},
  {"pc corpse",	"unused",	"flags",	"unused",		"unused"},
  {"fountain",	"unused",	"unused",	"unused",		"unused"},
  {"pill",		"level",	"sn1",		"sn2",			"sn3"},
  {"blood",		"?",		"?",		"?",			"?"},
  {"bloodstain","?",		"?",		"?",			"?"},
  {"scraps",	"?",		"?",		"?",			"?"},
  {"pipe",		"?",		"timer?",	"herb",			"flags"},		// 30
  {"herb con",	"capacity",	"huw full",	"herb",			"?"},
  {"herb",		"?",		"?",		"?",			"?"},
  {"incense",	"?",		"?",		"?",			"?"},
  {"fire",		"?",		"?",		"?",			"?"},
  {"book",		"?",		"?",		"?",			"?"},
  {"switch",	"position",	"?",		"?",			"?"},
  {"lever",		"position",	"?",		"?",			"?"},
  {"pullchain",	"position",	"?",		"?",			"?"},
  {"button",	"position",	"?",		"?",			"?"},
  {"dial",		"?",		"?",		"?",			"?"},			// 40
  {"rune",		"?",		"?",		"?",			"?"},
  {"runepouch",	"?",		"?",		"?",			"?"},
  {"match",		"?",		"?",		"?",			"?"},
  {"trap",		"charges",	"type",		"level",		"flags"},
  {"map",		"?",		"?",		"?",			"?"}			// 45
};

char *GetItemString (int item_number, int which_string)
{
	if ((item_number < 0) || (item_number > 45))
		return ("GetItemString bug");

	if ((which_string < 0) || (which_string > 4))
		return ("GetItemString bug");

	return (char*) ItemStrings [item_number][which_string];
}