/****************************************************************************
* [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];
}