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 Mob Menu Implementation file							*
 ****************************************************************************/

#include	"stdafx.h"

#define		MOBMENU_CPP

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

CMenuData	*MobMenuData [];


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

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

	m_CurrPageLines = GetLineCount (MobMenus [m_PageNr]);
	m_pPageData = MobMenuData [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 (MobMenus [m_PageNr]);

	// fill in fields
	DisplayData (Ch);
}


void CMobMenu::DisplayData (CCharacter& Ch)
{
	// Write in the object name
	Ch.SendTextf ("\x1b[1;35H[%5u:%-10.10s]-----[%c]", m_Vnum, NCCP ma_Name,
		m_bProto ? 'P' : 'N');

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

	CSmaugMenu::DisplayData (Ch);
}


BOOL CMobMenu::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 CMobMenu::Save (CCharacter& Ch)
{
	CCharacter		&Mob = *m_pMob;
	CMobIndexData	&Idx = *Mob.GetMobIndex ();

	// see if mob still exists
    for (CCharacter* wch = first_char; wch; wch = wch->GetNext ())
		if (wch == &Ch) then break;

	for (CCharacter* wch = first_char; wch; wch = wch->GetNext ())
	if (! wch) {
		Ch.SendText ("Mob no longer exists, Cannot save.");
		return;
	}


	// Save a-page items
	Mob.SetName (ma_Name);
	Mob.SetShortDescr (ma_Short);
	Mob.SetLongDescr (ma_Long);
	Mob.SetDescription (ma_Desc);

	if (m_bProto) {
		STRFREE (Idx.GetPlayerName ());
		STRFREE (Idx.GetShortDescr ());
		STRFREE (Idx.GetLongDescr ());
		STRFREE (Idx.GetDescription ());
		Idx.SetPlayerName (STRALLOC (ma_Name));
		Idx.SetShortDescr (STRALLOC (ma_Short));
		Idx.SetLongDescr (STRALLOC (ma_Long));
		Idx.SetDescription (STRALLOC (ma_Desc));
	}

	Mob.SetLevel (ma_Level);
	Mob.SetSex (ma_Sex);
	Mob.SetGold (ma_Gold);
	Mob.SetAlignment (ma_Align);
	Mob.SetMobInvisLevel (ma_InvLevel);
	Mob.perm_str = ma_PermStr;
	Mob.perm_int = ma_PermInt;
	Mob.perm_wis = ma_PermWis;
	Mob.perm_dex = ma_PermDex;
	Mob.perm_con = ma_PermCon;
	Mob.perm_cha = ma_PermCha;
	Mob.SetArmor (ma_Ac);

	if (m_bProto) {
		Idx.level = ma_Level;
		Idx.sex = ma_Sex;
		Idx.gold = ma_Gold;
		Idx.alignment = ma_Align;
		Idx.SetMobInvisLevel (ma_InvLevel);
		Idx.perm_str = ma_PermStr;
		Idx.perm_int = ma_PermInt;
		Idx.perm_wis = ma_PermWis;
		Idx.perm_dex = ma_PermDex;
		Idx.perm_con = ma_PermCon;
		Idx.perm_cha = ma_PermCha;
		Idx.ac = ma_Ac;
	}

	#define		SETC(aa,bb)	if (aa) Mob.SetClass (bb)

	SETC (ma_Mage, NPC_MAGE);
	SETC (ma_Cleric, NPC_CLERIC);
	SETC (ma_Thief, NPC_THIEF);
	SETC (ma_Warrior, NPC_WARRIOR);
	SETC (ma_Vampire, NPC_VAMPIRE);
	SETC (ma_Druid, NPC_DRUID);
	SETC (ma_Ranger, NPC_RANGER);
	SETC (ma_Augurer, NPC_AUGURER);
	SETC (ma_Baker, NPC_BAKER);
	SETC (ma_Butcher, NPC_BUTCHER);
	SETC (ma_BlackSmith, NPC_BLACKSMITH);
	SETC (ma_Mayor, NPC_MAYOR);
	SETC (ma_King, NPC_KING);
	SETC (ma_Queen, NPC_QUEEN);

	if (m_bProto) {
		#define		ISETC(aa,bb)	if (aa) Idx.m_Class = bb

		ISETC (ma_Mage, NPC_MAGE);
		ISETC (ma_Cleric, NPC_CLERIC);
		ISETC (ma_Thief, NPC_THIEF);
		ISETC (ma_Warrior, NPC_WARRIOR);
		ISETC (ma_Vampire, NPC_VAMPIRE);
		ISETC (ma_Druid, NPC_DRUID);
		ISETC (ma_Ranger, NPC_RANGER);
		ISETC (ma_Augurer, NPC_AUGURER);
		ISETC (ma_Baker, NPC_BAKER);
		ISETC (ma_Butcher, NPC_BUTCHER);
		ISETC (ma_BlackSmith, NPC_BLACKSMITH);
		ISETC (ma_Mayor, NPC_MAYOR);
		ISETC (ma_King, NPC_KING);
		ISETC (ma_Queen, NPC_QUEEN);
	}

	// Save b-page items
	CActFlags	ActBits;
	ActBits.SetBit (ACT_IS_NPC);
	#define		ASET(aa,bb)		if (aa) ActBits.SetBit(bb)

	if (m_bProto) then ActBits.SetPrototype ();

	ASET (mb_Sentinel, ACT_SENTINEL);
	ASET (mb_Scavenger, ACT_SCAVENGER);
	ASET (mb_Aggro, ACT_AGGRESSIVE);
	ASET (mb_StayArea, ACT_STAY_AREA);
	ASET (mb_Wimpy, ACT_WIMPY);
	ASET (mb_Pet, ACT_PET);
	ASET (mb_Train, ACT_TRAIN);
	ASET (mb_Practice, ACT_PRACTICE);
	ASET (mb_Immortal, ACT_IMMORTAL);
	ASET (mb_Deadly, ACT_DEADLY);
	ASET (mb_PolySelf, ACT_POLYSELF);
	ASET (mb_MetaAggro, ACT_META_AGGR);
	ASET (mb_Guardian, ACT_GUARDIAN);
	ASET (mb_Running, ACT_RUNNING);
	ASET (mb_NoWander, ACT_NOWANDER);
	ASET (mb_Mountable, ACT_MOUNTABLE);
	ASET (mb_Mounted, ACT_MOUNTED);
	ASET (mb_Scholar, ACT_SCHOLAR);
	ASET (mb_Secretive, ACT_SECRETIVE);
	ASET (mb_Polymorphed, ACT_POLYMORPHED);
	ASET (mb_MobInvis, ACT_MOBINVIS);
	ASET (mb_NoAssist, ACT_NOASSIST);
	Mob.SetActFlags (ActBits);

	if (m_bProto) {
		CActFlags	act;
		act.SetBit (ACT_IS_NPC);
		act.SetPrototype ();
		#define		IASET(aa,bb)		if (aa) act.SetBit(bb)

		IASET (mb_Sentinel, ACT_SENTINEL);
		IASET (mb_Scavenger, ACT_SCAVENGER);
		IASET (mb_Aggro, ACT_AGGRESSIVE);
		IASET (mb_StayArea, ACT_STAY_AREA);
		IASET (mb_Wimpy, ACT_WIMPY);
		IASET (mb_Pet, ACT_PET);
		IASET (mb_Train, ACT_TRAIN);
		IASET (mb_Practice, ACT_PRACTICE);
		IASET (mb_Immortal, ACT_IMMORTAL);
		IASET (mb_Deadly, ACT_DEADLY);
		IASET (mb_PolySelf, ACT_POLYSELF);
		IASET (mb_MetaAggro, ACT_META_AGGR);
		IASET (mb_Guardian, ACT_GUARDIAN);
		IASET (mb_Running, ACT_RUNNING);
		IASET (mb_NoWander, ACT_NOWANDER);
		IASET (mb_Mountable, ACT_MOUNTABLE);
		IASET (mb_Mounted, ACT_MOUNTED);
		IASET (mb_Scholar, ACT_SCHOLAR);
		IASET (mb_Secretive, ACT_SECRETIVE);
		IASET (mb_Polymorphed, ACT_POLYMORPHED);
		IASET (mb_MobInvis, ACT_MOBINVIS);
		IASET (mb_NoAssist, ACT_NOASSIST);

		Idx.SetActFlags (act);
	}

	CAffectFlags	AffBits;
	#define		AFSET(aa,bb)		if (aa) AffBits.SetBit(bb)

	AFSET (mb_Blind, AFF_BLIND);
	AFSET (mb_DetInv, AFF_DETECT_INVIS);
	AFSET (mb_DetEvil, AFF_DETECT_EVIL);
	AFSET (mb_DetMagic, AFF_DETECT_MAGIC);
	AFSET (mb_DetHidden, AFF_DETECT_HIDDEN);
	AFSET (mb_AHold, AFF_HOLD);
	AFSET (mb_ASanct, AFF_SANCTUARY);
	AFSET (mb_AFaerieFire, AFF_FAERIE_FIRE);
	AFSET (mb_AInfra, AFF_INFRARED);
	AFSET (mb_ACurse, AFF_CURSE);
	AFSET (mb_AFlaming, AFF_FLAMING);
	AFSET (mb_APoison, AFF_POISON);
	AFSET (mb_AProtect, AFF_PROTECT);
	AFSET (mb_AParalysis, AFF_PARALYSIS);
	AFSET (mb_ASleep, AFF_SLEEP);
	AFSET (mb_AHide, AFF_HIDE);
	AFSET (mb_ASneak, AFF_SNEAK);
	AFSET (mb_ACharm, AFF_CHARM);
	AFSET (mb_AParalysis, AFF_PARALYSIS);
	AFSET (mb_AFly, AFF_FLYING);
	AFSET (mb_APass, AFF_PASS_DOOR);
	AFSET (mb_ATrueSight, AFF_TRUESIGHT);
	AFSET (mb_ADetTrap, AFF_DETECTTRAPS);
	AFSET (mb_AScry, AFF_SCRYING);
	AFSET (mb_AFireShield, AFF_FIRESHIELD);
	AFSET (mb_AShockShield, AFF_SHOCKSHIELD);
	AFSET (mb_AFloat, AFF_FLOATING);
	AFSET (mb_AInv, AFF_INVISIBLE);
	Mob.SetAffectFlags (AffBits);

	if (m_bProto) {
		CAffectFlags	aff;
		#define		IAFSET(aa,bb)		if (aa) aff.SetBit(bb)

		IAFSET (mb_Blind, AFF_BLIND);
		IAFSET (mb_DetInv, AFF_DETECT_INVIS);
		IAFSET (mb_DetEvil, AFF_DETECT_EVIL);
		IAFSET (mb_DetMagic, AFF_DETECT_MAGIC);
		IAFSET (mb_DetHidden, AFF_DETECT_HIDDEN);
		IAFSET (mb_AHold, AFF_HOLD);
		IAFSET (mb_ASanct, AFF_SANCTUARY);
		IAFSET (mb_AFaerieFire, AFF_FAERIE_FIRE);
		IAFSET (mb_AInfra, AFF_INFRARED);
		IAFSET (mb_ACurse, AFF_CURSE);
		IAFSET (mb_AFlaming, AFF_FLAMING);
		IAFSET (mb_APoison, AFF_POISON);
		IAFSET (mb_AProtect, AFF_PROTECT);
		IAFSET (mb_AParalysis, AFF_PARALYSIS);
		IAFSET (mb_ASleep, AFF_SLEEP);
		IAFSET (mb_AHide, AFF_HIDE);
		IAFSET (mb_ASneak, AFF_SNEAK);
		IAFSET (mb_ACharm, AFF_CHARM);
		IAFSET (mb_AParalysis, AFF_PARALYSIS);
		IAFSET (mb_AFly, AFF_FLYING);
		IAFSET (mb_APass, AFF_PASS_DOOR);
		IAFSET (mb_ATrueSight, AFF_TRUESIGHT);
		IAFSET (mb_ADetTrap, AFF_DETECTTRAPS);
		IAFSET (mb_AScry, AFF_SCRYING);
		IAFSET (mb_AFireShield, AFF_FIRESHIELD);
		IAFSET (mb_AShockShield, AFF_SHOCKSHIELD);
		IAFSET (mb_AFloat, AFF_FLOATING);
		IAFSET (mb_AInv, AFF_INVISIBLE);

		Idx.SetAffectFlags (aff);
	}

	// Save c-page items
	CAttackFlags	AttBits;
	#define		ATSET(aa,bb)	if (aa) AttBits.SetBit (bb)

	ATSET (mc_Bite, ATCK_BITE);
	ATSET (mc_Claws, ATCK_CLAWS);
	ATSET (mc_FireBreath, ATCK_FIREBREATH);
	ATSET (mc_Bash, ATCK_BASH);
	ATSET (mc_Stun, ATCK_STUN);
	ATSET (mc_AcidBreath, ATCK_ACIDBREATH);
	ATSET (mc_Drain, ATCK_DRAIN);
	ATSET (mc_Kick, ATCK_KICK);
	ATSET (mc_Feed, ATCK_FEED);
	ATSET (mc_GasBreath, ATCK_GASBREATH);
	ATSET (mc_Poison, ATCK_POISON);
	ATSET (mc_Gaze, ATCK_GAZE);
	ATSET (mc_Harm, ATCK_HARM);
	ATSET (mc_FrostBreath, ATCK_FROSTBREATH);
	ATSET (mc_Curse, ATCK_CURSE);
	ATSET (mc_BackStab, ATCK_BACKSTAB);
	ATSET (mc_Punch, ATCK_PUNCH);
	ATSET (mc_LightningBreath, ATCK_LIGHTNBREATH);
	ATSET (mc_Weaken, ATCK_WEAKEN);
	ATSET (mc_Tail, ATCK_TAIL);
	ATSET (mc_Sting, ATCK_STING);
	ATSET (mc_CSerious, ATCK_CAUSESERIOUS);
	ATSET (mc_Trip, ATCK_TRIP);
	ATSET (mc_FireBall, ATCK_FIREBALL);
	ATSET (mc_Gouge, ATCK_GOUGE);
	ATSET (mc_CCritical, ATCK_CAUSECRITICAL);
	ATSET (mc_FlameStrike, ATCK_FLAMESTRIKE);
	ATSET (mc_EarthQuake, ATCK_EARTHQUAKE);
	ATSET (mc_ColorSpray, ATCK_COLORSPRAY);
	ATSET (mc_NPoison, ATCK_NASTYPOISON);
	ATSET (mc_Blind, ATCK_BLINDNESS);
	Mob.SetAttackFlags (AttBits);

	if (m_bProto) {
		AttBits.Empty ();
		ATSET (mc_Bite, ATCK_BITE);
		ATSET (mc_Claws, ATCK_CLAWS);
		ATSET (mc_FireBreath, ATCK_FIREBREATH);
		ATSET (mc_Bash, ATCK_BASH);
		ATSET (mc_Stun, ATCK_STUN);
		ATSET (mc_AcidBreath, ATCK_ACIDBREATH);
		ATSET (mc_Drain, ATCK_DRAIN);
		ATSET (mc_Kick, ATCK_KICK);
		ATSET (mc_Feed, ATCK_FEED);
		ATSET (mc_GasBreath, ATCK_GASBREATH);
		ATSET (mc_Poison, ATCK_POISON);
		ATSET (mc_Gaze, ATCK_GAZE);
		ATSET (mc_Harm, ATCK_HARM);
		ATSET (mc_FrostBreath, ATCK_FROSTBREATH);
		ATSET (mc_Curse, ATCK_CURSE);
		ATSET (mc_BackStab, ATCK_BACKSTAB);
		ATSET (mc_Punch, ATCK_PUNCH);
		ATSET (mc_LightningBreath, ATCK_LIGHTNBREATH);
		ATSET (mc_Weaken, ATCK_WEAKEN);
		ATSET (mc_Tail, ATCK_TAIL);
		ATSET (mc_Sting, ATCK_STING);
		ATSET (mc_CSerious, ATCK_CAUSESERIOUS);
		ATSET (mc_Trip, ATCK_TRIP);
		ATSET (mc_FireBall, ATCK_FIREBALL);
		ATSET (mc_Gouge, ATCK_GOUGE);
		ATSET (mc_CCritical, ATCK_CAUSECRITICAL);
		ATSET (mc_FlameStrike, ATCK_FLAMESTRIKE);
		ATSET (mc_EarthQuake, ATCK_EARTHQUAKE);
		ATSET (mc_ColorSpray, ATCK_COLORSPRAY);
		ATSET (mc_NPoison, ATCK_NASTYPOISON);
		ATSET (mc_Blind, ATCK_BLINDNESS);
		Idx.SetAttackFlags (AttBits);
	}

	CDefenseFlags	DefBits;
	#define		DSET(aa,bb)		if (aa) DefBits.SetBit (bb)

	DSET (mc_Sanct, DFND_SANCTUARY);
	DSET (mc_CureLight, DFND_CURELIGHT);
	DSET (mc_DDispelEvil, DFND_DISPELEVIL);
	DSET (mc_DShield, DFND_SHIELD);
	DSET (mc_DCureSerious, DFND_CURESERIOUS);
	DSET (mc_DDispelMagic, DFND_DISPELMAGIC);
	DSET (mc_DDodge, DFND_DODGE);
	DSET (mc_DFireShield, DFND_FIRESHIELD);
	DSET (mc_DCureCritical, DFND_CURECRITICAL);
	DSET (mc_DTeleport, DFND_TELEPORT);
	DSET (mc_DParry, DFND_PARRY);
	DSET (mc_DShockShield, DFND_SHOCKSHIELD);
	DSET (mc_DHeal, DFND_HEAL);
	DSET (mc_DBless, DFND_BLESS);
	DSET (mc_DDisarm, DFND_DISARM);
	DSET (mc_DStoneSkin, DFND_STONESKIN);
	DSET (mc_DMonsum1, DFND_MONSUM1);
	DSET (mc_DMonsum2, DFND_MONSUM2);
	DSET (mc_DMonsum3, DFND_MONSUM3);
	DSET (mc_DMonsum4, DFND_MONSUM4);
	Mob.SetDefenseFlags (DefBits);

	if (m_bProto) {
		DefBits.Empty ();
		DSET (mc_Sanct, DFND_SANCTUARY);
		DSET (mc_CureLight, DFND_CURELIGHT);
		DSET (mc_DDispelEvil, DFND_DISPELEVIL);
		DSET (mc_DShield, DFND_SHIELD);
		DSET (mc_DCureSerious, DFND_CURESERIOUS);
		DSET (mc_DDispelMagic, DFND_DISPELMAGIC);
		DSET (mc_DDodge, DFND_DODGE);
		DSET (mc_DFireShield, DFND_FIRESHIELD);
		DSET (mc_DCureCritical, DFND_CURECRITICAL);
		DSET (mc_DTeleport, DFND_TELEPORT);
		DSET (mc_DParry, DFND_PARRY);
		DSET (mc_DShockShield, DFND_SHOCKSHIELD);
		DSET (mc_DHeal, DFND_HEAL);
		DSET (mc_DBless, DFND_BLESS);
		DSET (mc_DDisarm, DFND_DISARM);
		DSET (mc_DStoneSkin, DFND_STONESKIN);
		DSET (mc_DMonsum1, DFND_MONSUM1);
		DSET (mc_DMonsum2, DFND_MONSUM2);
		DSET (mc_DMonsum3, DFND_MONSUM3);
		DSET (mc_DMonsum4, DFND_MONSUM4);
		Idx.SetDefenseFlags (DefBits);
	}

	// Save d-page items
	Mob.saving_poison_death = md_SavPoisonDeath;
	Mob.saving_wand = md_SavWand;
	Mob.saving_para_petri = md_SavParaPetri;
	Mob.saving_breath = md_SavBreath;
	Mob.saving_spell_staff = md_SavSpellStaff;

	if (m_bProto) {
		Idx.saving_poison_death = md_SavPoisonDeath;
		Idx.saving_wand = md_SavWand;
		Idx.saving_para_petri = md_SavParaPetri;
		Idx.saving_breath = md_SavBreath;
		Idx.saving_spell_staff = md_SavSpellStaff;
	}

	int			xflags = 0;
	#define		XSET(aa,bb)		if (aa) xflags |= bb

	XSET (md_Fins, PART_FINS);
	XSET (md_Ear, PART_EAR);
	XSET (md_Eye, PART_EYE);
	XSET (md_Tounge, PART_LONG_TONGUE);
	XSET (md_Scales, PART_SCALES);
	XSET (md_Tail, PART_TAIL);
	XSET (md_Arms, PART_ARMS);
	XSET (md_Legs, PART_LEGS);
	XSET (md_Tentacles, PART_TENTACLES);
	XSET (md_Brains, PART_BRAINS);
	XSET (md_Guts, PART_GUTS);
	XSET (md_Head, PART_HEAD);
	XSET (md_Feet, PART_FEET);
	XSET (md_EyeStalks, PART_EYESTALKS);
	XSET (md_Fingers, PART_FINGERS);
	XSET (md_Wings, PART_WINGS);
	XSET (md_Hands, PART_HANDS);
	XSET (md_Heart, PART_HEART);
	XSET (md_Claws, PART_CLAWS);
	XSET (md_Horns, PART_HORNS);
	XSET (md_Tusks, PART_TUSKS);
	XSET (md_TailAttack, PART_TAILATTACK);
	XSET (md_SharpScales, PART_SHARPSCALES);
	Mob.SetXFlags (xflags);

	Mob.numattacks = md_NumAttacks;
	Mob.SetHitroll (md_HitRoll);
	Mob.SetDamroll (md_DamRoll);

	if (m_bProto) {
		Idx.xflags = 0;
		#define		IXSET(aa,bb)		if (aa) Idx.xflags |= bb

		IXSET (md_Fins, PART_FINS);
		IXSET (md_Ear, PART_EAR);
		IXSET (md_Eye, PART_EYE);
		IXSET (md_Tounge, PART_LONG_TONGUE);
		IXSET (md_Scales, PART_SCALES);
		IXSET (md_Tail, PART_TAIL);
		IXSET (md_Arms, PART_ARMS);
		IXSET (md_Legs, PART_LEGS);
		IXSET (md_Tentacles, PART_TENTACLES);
		IXSET (md_Brains, PART_BRAINS);
		IXSET (md_Guts, PART_GUTS);
		IXSET (md_Head, PART_HEAD);
		IXSET (md_Feet, PART_FEET);
		IXSET (md_EyeStalks, PART_EYESTALKS);
		IXSET (md_Fingers, PART_FINGERS);
		IXSET (md_Wings, PART_WINGS);
		IXSET (md_Hands, PART_HANDS);
		IXSET (md_Heart, PART_HEART);
		IXSET (md_Claws, PART_CLAWS);
		IXSET (md_Horns, PART_HORNS);
		IXSET (md_Tusks, PART_TUSKS);
		IXSET (md_TailAttack, PART_TAILATTACK);
		IXSET (md_SharpScales, PART_SHARPSCALES);

		Idx.numattacks = md_NumAttacks;
		Idx.hitroll = md_HitRoll;
		Idx.damroll = md_DamRoll;
		Idx.hitnodice = md_Hnodice;
		Idx.hitsizedice = md_Hsizedice;
		Idx.hitplus = md_Hplus;
		Idx.damnodice = md_Dnodice;
		Idx.damsizedice = md_Dsizedice;
		Idx.damplus = md_Dplus;
	}

	// have to do hit/damnodice, hit/damsizedice, hit/damplus

	// Save e-page items
	SPEC_FUN	*spec = GetSelectedSpecFun ();

	Mob.SetSpecialMobFunction (spec);
	if (m_bProto) then Idx.spec_fun = spec;

	Mob.defposition = me_Position;
	if (m_bProto)
		Idx.defposition = me_Position;

	SetMobRisFlag (me_RFire, RIS_FIRE);
	SetMobRisFlag (me_RFire, RIS_FIRE);
	SetMobRisFlag (me_RCold, RIS_COLD);
	SetMobRisFlag (me_RElect, RIS_ELECTRICITY);
	SetMobRisFlag (me_REnergy, RIS_ENERGY);
	SetMobRisFlag (me_RPoison, RIS_POISON);
	SetMobRisFlag (me_RBlunt, RIS_BLUNT);
	SetMobRisFlag (me_RPierce, RIS_PIERCE);
	SetMobRisFlag (me_RSlash, RIS_SLASH);
	SetMobRisFlag (me_RAcid, RIS_ACID);
	SetMobRisFlag (me_RNonMagic, RIS_NONMAGIC);
	SetMobRisFlag (me_RDrain, RIS_DRAIN);
	SetMobRisFlag (me_RSleep, RIS_SLEEP);
	SetMobRisFlag (me_RCharm, RIS_CHARM);
	SetMobRisFlag (me_RHold, RIS_HOLD);
	SetMobRisFlag (me_RMagic, RIS_MAGIC);
	SetMobRisFlag (me_RPlus1, RIS_PLUS1);
	SetMobRisFlag (me_RPlus2, RIS_PLUS2);
	SetMobRisFlag (me_RPlus3, RIS_PLUS3);
	SetMobRisFlag (me_RPlus4, RIS_PLUS4);
	SetMobRisFlag (me_RPlus5, RIS_PLUS5);
	SetMobRisFlag (me_RPlus6, RIS_PLUS6);

	// Save f-page items
	int		Race = GetMobRace ();
	Mob.SetRace (Race);
	if (m_bProto) then Idx.race = Race;
}


CMobMenu::CMobMenu (CCharacter& Mob)
{
	CMobIndexData	&Idx = *Mob.GetMobIndex ();

	m_pMob = &Mob;
	m_Vnum = Idx.vnum;				// keep vnum for display
	m_bProto = Mob.IsPrototype ();

	// load local a-page items
	ma_Name = m_bProto ? Idx.GetPlayerName () : Mob.GetName ();
	ma_Short = m_bProto ? Idx.GetShortDescr () : Mob.GetShortDescr ();
	ma_Long = m_bProto ? Idx.GetLongDescr () : Mob.GetLongDescr ();
	ma_Desc = m_bProto ? Idx.GetDescription () : Mob.GetDescription ();

	ma_Level = m_bProto ? Idx.level : Mob.GetLevel ();
	ma_Sex = m_bProto ? Idx.sex : Mob.GetSex ();
	ma_Gold = m_bProto ? Idx.gold : Mob.GetGold ();
	ma_Align = m_bProto ? Idx.alignment : Mob.GetAlignment ();
	ma_InvLevel = m_bProto ? Idx.GetMobInvisLevel () : Mob.GetMobInvisLevel ();
	ma_PermStr = m_bProto ? Idx.perm_str : Mob.perm_str;
	ma_PermInt = m_bProto ? Idx.perm_int : Mob.perm_int;
	ma_PermWis = m_bProto ? Idx.perm_wis : Mob.perm_wis;
	ma_PermDex = m_bProto ? Idx.perm_dex : Mob.perm_dex;
	ma_PermCon = m_bProto ? Idx.perm_con : Mob.perm_con;
	ma_PermCha = m_bProto ? Idx.perm_cha : Mob.perm_cha;
	ma_Ac = m_bProto ? Idx.ac : Mob.GetArmor ();

	int	mclass = m_bProto ? Idx.m_Class : Mob.GetClass ();

	ma_Mage = mclass == NPC_MAGE;
	ma_Cleric = mclass == NPC_CLERIC;
	ma_Thief = mclass == NPC_THIEF;
	ma_Warrior = mclass == NPC_WARRIOR;
	ma_Vampire = mclass == NPC_VAMPIRE;
	ma_Druid = mclass == NPC_DRUID;
	ma_Ranger = mclass == NPC_RANGER;
	ma_Augurer = mclass == NPC_AUGURER;
	ma_Baker = mclass == NPC_BAKER;
	ma_Butcher = mclass == NPC_BUTCHER;
	ma_BlackSmith = mclass == NPC_BLACKSMITH;
	ma_Mayor = mclass == NPC_MAYOR;
	ma_King = mclass == NPC_KING;
	ma_Queen = mclass == NPC_QUEEN;

	// load local b-page items
	CActFlags	ActBits = m_bProto ? Idx.GetActFlags () : Mob.GetActFlags ();

	mb_Sentinel = ActBits.IsSet (ACT_SENTINEL);
	mb_Scavenger = ActBits.IsSet (ACT_SCAVENGER);
	mb_Aggro = ActBits.IsSet (ACT_AGGRESSIVE);
	mb_StayArea = ActBits.IsSet (ACT_STAY_AREA);
	mb_Wimpy = ActBits.IsSet (ACT_WIMPY);
	mb_Pet = ActBits.IsSet (ACT_PET);
	mb_Train = ActBits.IsSet (ACT_TRAIN);
	mb_Practice = ActBits.IsSet (ACT_PRACTICE);
	mb_Immortal = ActBits.IsSet (ACT_IMMORTAL);
	mb_Deadly = ActBits.IsSet (ACT_DEADLY);
	mb_PolySelf = ActBits.IsSet (ACT_POLYSELF);
	mb_MetaAggro = ActBits.IsSet (ACT_META_AGGR);
	mb_Guardian = ActBits.IsSet (ACT_GUARDIAN);
	mb_Running = ActBits.IsSet (ACT_RUNNING);
	mb_NoWander = ActBits.IsSet (ACT_NOWANDER);
	mb_Mountable = ActBits.IsSet (ACT_MOUNTABLE);
	mb_Mounted = ActBits.IsSet (ACT_MOUNTED);
	mb_Scholar = ActBits.IsSet (ACT_SCHOLAR);
	mb_Secretive = ActBits.IsSet (ACT_SECRETIVE);
	mb_Polymorphed = ActBits.IsSet (ACT_POLYMORPHED);
	mb_MobInvis = ActBits.IsSet (ACT_MOBINVIS);
	mb_NoAssist = ActBits.IsSet (ACT_NOASSIST);

	CAffectFlags	AffBits =
		m_bProto ? Idx.GetAffectFlags () : Mob.GetAffectFlags ();

	mb_Blind = AffBits.IsSet (AFF_BLIND);
	mb_DetInv = AffBits.IsSet (AFF_DETECT_INVIS);
	mb_DetEvil = AffBits.IsSet (AFF_DETECT_EVIL);
	mb_DetMagic = AffBits.IsSet (AFF_DETECT_MAGIC);
	mb_DetHidden = AffBits.IsSet (AFF_DETECT_HIDDEN);
	mb_AHold = AffBits.IsSet (AFF_HOLD);
	mb_ASanct = AffBits.IsSet (AFF_SANCTUARY);
	mb_AFaerieFire = AffBits.IsSet (AFF_FAERIE_FIRE);
	mb_AInfra = AffBits.IsSet (AFF_INFRARED);
	mb_ACurse = AffBits.IsSet (AFF_CURSE);
	mb_AFlaming = AffBits.IsSet (AFF_FLAMING);
	mb_APoison = AffBits.IsSet (AFF_POISON);
	mb_AProtect = AffBits.IsSet (AFF_PROTECT);
	mb_AParalysis = AffBits.IsSet (AFF_PARALYSIS);
	mb_ASleep = AffBits.IsSet (AFF_SLEEP);
	mb_AHide = AffBits.IsSet (AFF_HIDE);
	mb_ASneak = AffBits.IsSet (AFF_SNEAK);
	mb_ACharm = AffBits.IsSet (AFF_CHARM);
	mb_AParalysis = AffBits.IsSet (AFF_PARALYSIS);
	mb_AFly = AffBits.IsSet (AFF_FLYING);
	mb_APass = AffBits.IsSet (AFF_PASS_DOOR);
	mb_ATrueSight = AffBits.IsSet (AFF_TRUESIGHT);
	mb_ADetTrap = AffBits.IsSet (AFF_DETECTTRAPS);
	mb_AScry = AffBits.IsSet (AFF_SCRYING);
	mb_AFireShield = AffBits.IsSet (AFF_FIRESHIELD);
	mb_AShockShield = AffBits.IsSet (AFF_SHOCKSHIELD);
	mb_AFloat = AffBits.IsSet (AFF_FLOATING);
	mb_AInv = AffBits.IsSet (AFF_INVISIBLE);

	// load local c-page items
	CAttackFlags	AttBits =
		m_bProto ? Idx.GetAttackFlags () : Mob.GetAttackFlags ();

	mc_Bite = AttBits.CanBite ();
	mc_Claws = AttBits.CanUseClaws ();
	mc_FireBreath = AttBits.CanBreatheFire ();
	mc_Bash = AttBits.CanBash ();
	mc_Stun = AttBits.CanStun ();
	mc_AcidBreath = AttBits.CanBreatheAcid ();
	mc_Drain = AttBits.CanDrain ();
	mc_Kick = AttBits.CanKick ();
	mc_Feed = AttBits.CanFeed ();
	mc_GasBreath = AttBits.CanBreatheGas ();
	mc_Poison = AttBits.CanPoison ();
	mc_Gaze = AttBits.CanGaze ();
	mc_Harm = AttBits.CanHarm ();
	mc_FrostBreath = AttBits.CanBreatheFrost ();
	mc_Curse = AttBits.CanCurse ();
	mc_BackStab = AttBits.CanBackStab ();
	mc_Punch = AttBits.CanPunch ();
	mc_LightningBreath = AttBits.CanBreatheLightning ();
	mc_Weaken = AttBits.CanWeaken ();
	mc_Tail = AttBits.CanUseTail ();
	mc_Sting = AttBits.CanSting ();
	mc_CSerious = AttBits.CanCauseSerious ();
	mc_Trip = AttBits.CanTrip ();
	mc_FireBall = AttBits.CanFireball ();
	mc_Gouge = AttBits.CanGouge ();
	mc_CCritical = AttBits.CanCauseCritical ();
	mc_FlameStrike = AttBits.CanFlameStrike ();
	mc_EarthQuake = AttBits.CanQuake ();
	mc_ColorSpray = AttBits.CanColorSpray ();
	mc_NPoison = AttBits.CanNastyPoison ();
	mc_Blind = AttBits.CanBlind ();

	CDefenseFlags	DefBits =
		m_bProto ? Idx.GetDefenseFlags () : Mob.GetDefenseFlags ();

	mc_Sanct = DefBits.CanUseSanctuary ();
	mc_CureLight = DefBits.CanCureLight ();
	mc_DDispelEvil = DefBits.CanDispelEvil ();
	mc_DShield = DefBits.CanShield ();
	mc_DCureSerious = DefBits.CanCureSerious ();
	mc_DDispelMagic = DefBits.CanDispelMagic ();
	mc_DDodge = DefBits.CanDodge ();
	mc_DFireShield = DefBits.CanFireShield ();
	mc_DCureCritical = DefBits.CanCureCritical ();
	mc_DTeleport = DefBits.CanTeleport ();
	mc_DParry = DefBits.CanParry ();
	mc_DShockShield = DefBits.CanShockShield ();
	mc_DHeal = DefBits.CanHeal ();
	mc_DBless = DefBits.CanBless ();
	mc_DDisarm = DefBits.CanDisarm ();
	mc_DStoneSkin = DefBits.CanStoneSkin ();
	mc_DMonsum1 = DefBits.CanMonsum1 ();
	mc_DMonsum2 = DefBits.CanMonsum2 ();
	mc_DMonsum3 = DefBits.CanMonsum3 ();
	mc_DMonsum4 = DefBits.CanMonsum4 ();

	// load local d-page items
	md_SavPoisonDeath = m_bProto ? Idx.saving_poison_death : Mob.saving_poison_death;
	md_SavWand = m_bProto ? Idx.saving_wand : Mob.saving_wand;
	md_SavParaPetri = m_bProto ? Idx.saving_para_petri : Mob.saving_para_petri;
	md_SavBreath = m_bProto ? Idx.saving_breath : Mob.saving_breath;
	md_SavSpellStaff = m_bProto ? Idx.saving_spell_staff : Mob.saving_spell_staff;

	int		xflags = m_bProto ? Idx.xflags : Mob.GetXFlags ();

	md_Fins = IS_SET (xflags, PART_FINS);
	md_Ear = IS_SET (xflags, PART_EAR);
	md_Eye = IS_SET (xflags, PART_EYE);
	md_Tounge = IS_SET (xflags, PART_LONG_TONGUE);
	md_Scales = IS_SET (xflags, PART_SCALES);
	md_Tail = IS_SET (xflags, PART_TAIL);
	md_Arms = IS_SET (xflags, PART_ARMS);
	md_Legs = IS_SET (xflags, PART_LEGS);
	md_Tentacles = IS_SET (xflags, PART_TENTACLES);
	md_Brains = IS_SET (xflags, PART_BRAINS);
	md_Guts = IS_SET (xflags, PART_GUTS);
	md_Head = IS_SET (xflags, PART_HEAD);
	md_Feet = IS_SET (xflags, PART_FEET);
	md_EyeStalks = IS_SET (xflags, PART_EYESTALKS);
	md_Fingers = IS_SET (xflags, PART_FINGERS);
	md_Wings = IS_SET (xflags, PART_WINGS);
	md_Hands = IS_SET (xflags, PART_HANDS);
	md_Heart = IS_SET (xflags, PART_HEART);
	md_Claws = IS_SET (xflags, PART_CLAWS);
	md_Horns = IS_SET (xflags, PART_HORNS);
	md_Tusks = IS_SET (xflags, PART_TUSKS);
	md_TailAttack = IS_SET (xflags, PART_TAILATTACK);
	md_SharpScales = IS_SET (xflags, PART_SHARPSCALES);
	md_NumAttacks = m_bProto ? Idx.numattacks : Mob.numattacks;

	md_HitRoll = m_bProto ? Idx.hitroll : Mob.GetHitroll ();
	md_DamRoll = m_bProto ? Idx.damroll : Mob.GetDamroll ();

	md_Hnodice = Idx.hitnodice;
	md_Hsizedice = Idx.hitsizedice;
	md_Hplus = Idx.hitplus;
	md_Dnodice = Idx.damnodice;
	md_Dsizedice = Idx.damsizedice;
	md_Dplus = Idx.damplus;


	// load local e-page items
	char	*spec = lookup_spec (
		m_bProto ? Idx.spec_fun : Mob.GetSpecialMobFunction ());

	me_SFido = !str_cmp (spec, "spec_fido");
	me_SAdept = !str_cmp (spec, "spec_cast_adept");
	me_SFireBreath = !str_cmp (spec, "spec_breath_fire");
	me_SGuard = !str_cmp (spec, "spec_guard");
	me_SCleric = !str_cmp (spec, "spec_cast_cleric");
	me_SFrostBreath = !str_cmp (spec, "spec_breath_frost");
	me_SJanitor = !str_cmp (spec, "spec_janitor");
	me_SMage = !str_cmp (spec, "spec_cast_mage");
	me_SAcidBreath = !str_cmp (spec, "spec_breath_acid");
	me_SThief = !str_cmp (spec, "spec_thief");
	me_SUndead = !str_cmp (spec, "spec_cast_undead");
	me_SGasBreath = !str_cmp (spec, "spec_breath_gas");
	me_SMayor = !str_cmp (spec, "spec_mayor");
	me_SLightningBreath = !str_cmp (spec, "spec_breath_lightning");
	me_SPoison = !str_cmp (spec, "spec_poison");
	me_SExecutioner = !str_cmp (spec, "spec_executioner");
	me_SAnyBreath = !str_cmp (spec, "spec_breath_any");

	me_Position = m_bProto ? Idx.defposition : Mob.defposition;

	SetMobRisString (me_RFire, RIS_FIRE);
	SetMobRisString (me_RCold, RIS_COLD);
	SetMobRisString (me_RElect, RIS_ELECTRICITY);
	SetMobRisString (me_REnergy, RIS_ENERGY);
	SetMobRisString (me_RPoison, RIS_POISON);
	SetMobRisString (me_RBlunt, RIS_BLUNT);
	SetMobRisString (me_RPierce, RIS_PIERCE);
	SetMobRisString (me_RSlash, RIS_SLASH);
	SetMobRisString (me_RAcid, RIS_ACID);
	SetMobRisString (me_RNonMagic, RIS_NONMAGIC);
	SetMobRisString (me_RDrain, RIS_DRAIN);
	SetMobRisString (me_RSleep, RIS_SLEEP);
	SetMobRisString (me_RCharm, RIS_CHARM);
	SetMobRisString (me_RHold, RIS_HOLD);
	SetMobRisString (me_RMagic, RIS_MAGIC);
	SetMobRisString (me_RPlus1, RIS_PLUS1);
	SetMobRisString (me_RPlus2, RIS_PLUS2);
	SetMobRisString (me_RPlus3, RIS_PLUS3);
	SetMobRisString (me_RPlus4, RIS_PLUS4);
	SetMobRisString (me_RPlus5, RIS_PLUS5);
	SetMobRisString (me_RPlus6, RIS_PLUS6);


	// load local f-page items
	int		Race = m_bProto ? Idx.race : Mob.GetRace ();

	mf_Human = Race == RaceTable.GetNpcRace ("human");
	mf_Neand = Race == RaceTable.GetNpcRace ("neanderthal");
	mf_Avis = Race == RaceTable.GetNpcRace ("avis");
	mf_Amph = Race == RaceTable.GetNpcRace ("amphibian");
	mf_Elf = Race == RaceTable.GetNpcRace ("elf");
	mf_Orc = Race == RaceTable.GetNpcRace ("orc");
	mf_BugBear = Race == RaceTable.GetNpcRace ("bugbear");
	mf_Bovine = Race == RaceTable.GetNpcRace ("bovine");

	mf_Dwarf = Race == RaceTable.GetNpcRace ("dwarf");
	mf_Skeleton = Race == RaceTable.GetNpcRace ("skeleton");
	mf_Dragon = Race == RaceTable.GetNpcRace ("dragon");
	mf_Canine = Race == RaceTable.GetNpcRace ("canine");

	mf_Ant = Race == RaceTable.GetNpcRace ("ant");
	mf_Halfling = Race == RaceTable.GetNpcRace ("halfling");
	mf_Thoul = Race == RaceTable.GetNpcRace ("thoul");
	mf_Rust = Race == RaceTable.GetNpcRace ("rustmonster");
	mf_Crust = Race == RaceTable.GetNpcRace ("crustacean");
	mf_Bee = Race == RaceTable.GetNpcRace ("bee");
	mf_Pixie = Race == RaceTable.GetNpcRace ("pixie");
	mf_Undead = Race == RaceTable.GetNpcRace ("undead");
	mf_Shadow = Race == RaceTable.GetNpcRace ("shadow");
	mf_Feline = Race == RaceTable.GetNpcRace ("feline");
	mf_Beetle = Race == RaceTable.GetNpcRace ("beetle");
	mf_Vampire = Race == RaceTable.GetNpcRace ("vampire");
	mf_Zombie = Race == RaceTable.GetNpcRace ("zombie");
	mf_ShapeShifter = Race == RaceTable.GetNpcRace ("shapeshifter");
	mf_Fish = Race == RaceTable.GetNpcRace ("fish");
	mf_Fly = Race == RaceTable.GetNpcRace ("fly");
	mf_Gargolye = Race == RaceTable.GetNpcRace ("gargoyle");
	mf_Ape = Race == RaceTable.GetNpcRace ("ape");
	mf_Shrieker = Race == RaceTable.GetNpcRace ("shrieker");
	mf_Insect = Race == RaceTable.GetNpcRace ("insect");
	mf_Locust = Race == RaceTable.GetNpcRace ("locust");
	mf_Ghoul = Race == RaceTable.GetNpcRace ("ghoul");
	mf_Baboon = Race == RaceTable.GetNpcRace ("baboon");
	mf_Stirge = Race == RaceTable.GetNpcRace ("stirge");
	mf_Mammal = Race == RaceTable.GetNpcRace ("mammal");
	mf_Snake = Race == RaceTable.GetNpcRace ("snake");
	mf_Gnoll = Race == RaceTable.GetNpcRace ("gnoll");
	mf_Bat = Race == RaceTable.GetNpcRace ("bat");
	mf_Wight = Race == RaceTable.GetNpcRace ("wight");
	mf_Porcine = Race == RaceTable.GetNpcRace ("porcine");
	mf_Spider = Race == RaceTable.GetNpcRace ("spider");
	mf_Gnome = Race == RaceTable.GetNpcRace ("gnome");
	mf_Bear = Race == RaceTable.GetNpcRace ("bear");
	mf_Reptile = Race == RaceTable.GetNpcRace ("reptile");
	mf_Worm = Race == RaceTable.GetNpcRace ("worm");
	mf_Goblin = Race == RaceTable.GetNpcRace ("goblin");
	mf_Boar = Race == RaceTable.GetNpcRace ("boar");
	mf_Rodent = Race == RaceTable.GetNpcRace ("rodent");
	mf_Golem = Race == RaceTable.GetNpcRace ("golem");
	mf_Cat = Race == RaceTable.GetNpcRace ("cat");
	mf_Trog = Race == RaceTable.GetNpcRace ("troglodyte");
	mf_Gel = Race == RaceTable.GetNpcRace ("gelatin");
	mf_Gorgon = Race == RaceTable.GetNpcRace ("gorgon");
	mf_Dog = Race == RaceTable.GetNpcRace ("dog");
	mf_Spirit = Race == RaceTable.GetNpcRace ("spirit");
	mf_Mold = Race == RaceTable.GetNpcRace ("mold");
	mf_Harpy = Race == RaceTable.GetNpcRace ("harpy");
	mf_Ferret = Race == RaceTable.GetNpcRace ("ferret");
	mf_Magical = Race == RaceTable.GetNpcRace ("magical");
	mf_Ooze = Race == RaceTable.GetNpcRace ("ooze");
	mf_HobGob = Race == RaceTable.GetNpcRace ("hobgoblin");
	mf_Horse = Race == RaceTable.GetNpcRace ("horse");
	mf_Slime = Race == RaceTable.GetNpcRace ("slime");
	mf_Kobold = Race == RaceTable.GetNpcRace ("kobold");
	mf_Mule = Race == RaceTable.GetNpcRace ("mule");
	mf_LizardMan = Race == RaceTable.GetNpcRace ("lizardman");
	mf_Rat = Race == RaceTable.GetNpcRace ("rat");
	mf_Lycan = Race == RaceTable.GetNpcRace ("lycanthrope");
	mf_Shrew = Race == RaceTable.GetNpcRace ("shrew");
	mf_Minotaur = Race == RaceTable.GetNpcRace ("minotaur");
	mf_Wolf = Race == RaceTable.GetNpcRace ("wolf");
}


void CMobMenu::SetMobRisString (char* str, int bit)
{
	strcpy (str, "...");
	CMobIndexData	&Idx = *m_pMob->GetMobIndex ();

	int		Resist = m_bProto ? Idx.resistant : m_pMob->GetResistFlags ();
	int		Immune = m_bProto ? Idx.immune : m_pMob->GetImmuneFlags ();
	int		Suscept = m_bProto ? Idx.susceptible : m_pMob->GetSusceptFlags ();

	if (IS_SET (Resist, bit))
		str [0] = 'R';
	if (IS_SET (Immune, bit))
		str [1] = 'I';
	if (IS_SET (Suscept, bit))
		str [2] = 'S';
}


void CMobMenu::SetMobRisFlag (char* ris, int bit)
{
	if (ris [0] == 'R') then m_pMob->SetResistFlags (bit);
	if (ris [1] == 'I') then m_pMob->SetImmuneFlags (bit);
	if (ris [2] == 'S') then m_pMob->SetSusceptFlags (bit);

	if (m_bProto) {
		CMobIndexData	&Idx = *m_pMob->GetMobIndex ();
		if (ris [0] == 'R') then SET_BIT (Idx.resistant, bit);
		if (ris [1] == 'I') then SET_BIT (Idx.immune, bit);
		if (ris [2] == 'S') then SET_BIT (Idx.susceptible, bit);
	}
}


int CMobMenu::GetMobRace ()
{
	if (mf_Human) return RaceTable.GetNpcRace ("human");
	if (mf_Neand) return RaceTable.GetNpcRace ("neanderthal");
	if (mf_Avis) return RaceTable.GetNpcRace ("avis");
	if (mf_Amph) return RaceTable.GetNpcRace ("amphibian");
	if (mf_Elf) return RaceTable.GetNpcRace ("elf");
	if (mf_Orc) return RaceTable.GetNpcRace ("orc");
	if (mf_BugBear) return RaceTable.GetNpcRace ("bugbear");
	if (mf_Bovine) return RaceTable.GetNpcRace ("bovine");

	if (mf_Dwarf) return RaceTable.GetNpcRace ("dwarf");
	if (mf_Skeleton) return RaceTable.GetNpcRace ("skeleton");
	if (mf_Dragon) return RaceTable.GetNpcRace ("dragon");
	if (mf_Canine) return RaceTable.GetNpcRace ("canine");

	if (mf_Ant) return RaceTable.GetNpcRace ("ant");
	if (mf_Halfling) return RaceTable.GetNpcRace ("halfling");
	if (mf_Thoul) return RaceTable.GetNpcRace ("thoul");
	if (mf_Rust) return RaceTable.GetNpcRace ("rustmonster");
	if (mf_Crust) return RaceTable.GetNpcRace ("crustacean");
	if (mf_Bee) return RaceTable.GetNpcRace ("bee");
	if (mf_Pixie) return RaceTable.GetNpcRace ("pixie");
	if (mf_Undead) return RaceTable.GetNpcRace ("undead");
	if (mf_Shadow) return RaceTable.GetNpcRace ("shadow");
	if (mf_Feline) return RaceTable.GetNpcRace ("feline");
	if (mf_Beetle) return RaceTable.GetNpcRace ("beetle");
	if (mf_Vampire) return RaceTable.GetNpcRace ("vampire");
	if (mf_Zombie) return RaceTable.GetNpcRace ("zombie");
	if (mf_ShapeShifter) return RaceTable.GetNpcRace ("shapeshifter");
	if (mf_Fish) return RaceTable.GetNpcRace ("fish");
	if (mf_Fly) return RaceTable.GetNpcRace ("fly");
	if (mf_Gargolye) return RaceTable.GetNpcRace ("gargoyle");
	if (mf_Ape) return RaceTable.GetNpcRace ("ape");
	if (mf_Shrieker) return RaceTable.GetNpcRace ("shrieker");
	if (mf_Insect) return RaceTable.GetNpcRace ("insect");
	if (mf_Locust) return RaceTable.GetNpcRace ("locust");
	if (mf_Ghoul) return RaceTable.GetNpcRace ("ghoul");
	if (mf_Baboon) return RaceTable.GetNpcRace ("baboon");
	if (mf_Stirge) return RaceTable.GetNpcRace ("stirge");
	if (mf_Mammal) return RaceTable.GetNpcRace ("mammal");
	if (mf_Snake) return RaceTable.GetNpcRace ("snake");
	if (mf_Gnoll) return RaceTable.GetNpcRace ("gnoll");
	if (mf_Bat) return RaceTable.GetNpcRace ("bat");
	if (mf_Wight) return RaceTable.GetNpcRace ("wight");
	if (mf_Porcine) return RaceTable.GetNpcRace ("porcine");
	if (mf_Spider) return RaceTable.GetNpcRace ("spider");
	if (mf_Gnome) return RaceTable.GetNpcRace ("gnome");
	if (mf_Bear) return RaceTable.GetNpcRace ("bear");
	if (mf_Reptile) return RaceTable.GetNpcRace ("reptile");
	if (mf_Worm) return RaceTable.GetNpcRace ("worm");
	if (mf_Goblin) return RaceTable.GetNpcRace ("goblin");
	if (mf_Boar) return RaceTable.GetNpcRace ("boar");
	if (mf_Rodent) return RaceTable.GetNpcRace ("rodent");
	if (mf_Golem) return RaceTable.GetNpcRace ("golem");
	if (mf_Cat) return RaceTable.GetNpcRace ("cat");
	if (mf_Trog) return RaceTable.GetNpcRace ("troglodyte");
	if (mf_Gel) return RaceTable.GetNpcRace ("gelatin");
	if (mf_Gorgon) return RaceTable.GetNpcRace ("gorgon");
	if (mf_Dog) return RaceTable.GetNpcRace ("dog");
	if (mf_Spirit) return RaceTable.GetNpcRace ("spirit");
	if (mf_Mold) return RaceTable.GetNpcRace ("mold");
	if (mf_Harpy) return RaceTable.GetNpcRace ("harpy");
	if (mf_Ferret) return RaceTable.GetNpcRace ("ferret");
	if (mf_Magical) return RaceTable.GetNpcRace ("magical");
	if (mf_Ooze) return RaceTable.GetNpcRace ("ooze");
	if (mf_HobGob) return RaceTable.GetNpcRace ("hobgoblin");
	if (mf_Horse) return RaceTable.GetNpcRace ("horse");
	if (mf_Slime) return RaceTable.GetNpcRace ("slime");
	if (mf_Kobold) return RaceTable.GetNpcRace ("kobold");
	if (mf_Mule) return RaceTable.GetNpcRace ("mule");
	if (mf_LizardMan) return RaceTable.GetNpcRace ("lizardman");
	if (mf_Rat) return RaceTable.GetNpcRace ("rat");
	if (mf_Lycan) return RaceTable.GetNpcRace ("lycanthrope");
	if (mf_Shrew) return RaceTable.GetNpcRace ("shrew");
	if (mf_Minotaur) return RaceTable.GetNpcRace ("minotaur");
	if (mf_Wolf) return RaceTable.GetNpcRace ("wolf");

	return -1;
}


SPEC_FUN* CMobMenu::GetSelectedSpecFun ()
{
	if (me_SFido) return spec_lookup ("spec_fido");
	if (me_SAdept) return spec_lookup ("spec_cast_adept");
	if (me_SFireBreath) return spec_lookup ("spec_breath_fire");
	if (me_SGuard) return spec_lookup ("spec_guard");
	if (me_SCleric) return spec_lookup ("spec_cast_cleric");
	if (me_SFrostBreath) return spec_lookup ("spec_breath_frost");
	if (me_SJanitor) return spec_lookup ("spec_janitor");
	if (me_SMage) return spec_lookup ("spec_cast_mage");
	if (me_SAcidBreath) return spec_lookup ("spec_breath_acid");
	if (me_SThief) return spec_lookup ("spec_thief");
	if (me_SUndead) return spec_lookup ("spec_cast_undead");
	if (me_SGasBreath) return spec_lookup ("spec_breath_gas");
	if (me_SMayor) return spec_lookup ("spec_mayor");
	if (me_SLightningBreath) return spec_lookup ("spec_breath_lightning");
	if (me_SPoison) return spec_lookup ("spec_poison");
	if (me_SExecutioner) return spec_lookup ("spec_executioner");
	if (me_SAnyBreath) return spec_lookup ("spec_breath_any");

	return NULL;
}



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

CMenuData	MobPage_A [] = {
	{ '1', 'a', 2,  20, 59, OFFSET(ma_Name), MT_CSTRING, 0, NULL },
	{ '1', 'b', 3,  20, 59, OFFSET(ma_Short), MT_CSTRING, 0, NULL },
	{ '1', 'c', 4,  10, 68, OFFSET(ma_Long), MT_CSTRING, 0, MenuStringEditFn },
	{ '1', 'd', 5,  10, 68, OFFSET(ma_Desc), MT_CSTRING, 0, MenuStringEditFn },
	{ '2', 'a', 9,  12, 3,  OFFSET(ma_Level), MT_INT, 0, NULL },
	{ '2', 'b', 10, 12, 6,  OFFSET(ma_Sex), MT_INT, 0, NULL },
	{ '2', 'c', 11, 12, 11, OFFSET(ma_Gold), MT_INT, 0, NULL },
	{ '2', 'd', 12, 12, 4, OFFSET(ma_Align), MT_SINT, 0, NULL },
	{ '2', 'e', 13, 18, 2, OFFSET(ma_InvLevel), MT_INT, 0, NULL },
	{ '3', 'a', 9,  32, 2, OFFSET(ma_PermStr), MT_INT, 0, NULL },
	{ '3', 'b', 10, 32, 2, OFFSET(ma_PermInt), MT_INT, 0, NULL },
	{ '3', 'c', 11, 32, 2, OFFSET(ma_PermWis), MT_INT, 0, NULL },
	{ '3', 'd', 12, 32, 2, OFFSET(ma_PermDex), MT_INT, 0, NULL },
	{ '3', 'e', 13, 32, 2, OFFSET(ma_PermCon), MT_INT, 0, NULL },
	{ '3', 'f', 14, 32, 2, OFFSET(ma_PermCha), MT_INT, 0, NULL },
	{ '3', 'g', 15, 31, 4, OFFSET(ma_Ac), MT_SINT, 0, NULL },
	{ '4', 'a', 9,  49, 1, OFFSET(ma_Mage), MT_BOOL, 0, NULL },
	{ '4', 'b', 10, 49, 1, OFFSET(ma_Thief), MT_BOOL, 0, NULL },
	{ '4', 'c', 11, 49, 1, OFFSET(ma_Vampire), MT_BOOL, 0, NULL },
	{ '4', 'd', 12, 49, 1, OFFSET(ma_Ranger), MT_BOOL, 0, NULL },
	{ '4', 'e', 13, 49, 1, OFFSET(ma_Butcher), MT_BOOL, 0, NULL },
	{ '4', 'f', 14, 49, 1, OFFSET(ma_Mayor), MT_BOOL, 0, NULL },
	{ '4', 'g', 15, 49, 1, OFFSET(ma_Queen), MT_BOOL, 0, NULL },

	{ '4', 'h', 9,  68, 1, OFFSET(ma_Cleric), MT_BOOL, 0, NULL },
	{ '4', 'i', 10, 68, 1, OFFSET(ma_Warrior), MT_BOOL, 0, NULL },
	{ '4', 'j', 11, 68, 1, OFFSET(ma_Druid), MT_BOOL, 0, NULL },
	{ '4', 'k', 12, 68, 1, OFFSET(ma_Baker), MT_BOOL, 0, NULL },
	{ '4', 'l', 13, 68, 1, OFFSET(ma_BlackSmith), MT_BOOL, 0, NULL },
	{ '4', 'm', 14, 68, 1, OFFSET(ma_King), MT_BOOL, 0, NULL },
	{ '4', 'n', 15, 68, 1, OFFSET(ma_Augurer), MT_BOOL, 0, NULL },
	{ 0, 0, 0, 0, 0, 0, MT_END }
};


CMenuData	MobPage_B [] = {
	{ '1', 'a', 4, 12, 1, OFFSET(mb_Train), MT_BOOL, 0, NULL },
	{ '1', 'b', 5, 12, 1, OFFSET(mb_PolySelf), MT_BOOL, 0, NULL },
	{ '1', 'c', 6, 12, 1, OFFSET(mb_NoWander), MT_BOOL, 0, NULL },
	{ '1', 'd', 7, 13, 1, OFFSET(mb_Secretive), MT_BOOL, 0, NULL },

	{ '1', 'e', 2, 29, 1, OFFSET(mb_Sentinel), MT_BOOL, 0, NULL },
	{ '1', 'f', 3, 29, 1, OFFSET(mb_StayArea), MT_BOOL, 0, NULL },
	{ '1', 'g', 4, 29, 1, OFFSET(mb_Practice), MT_BOOL, 0, NULL },
	{ '1', 'h', 5, 29, 1, OFFSET(mb_MetaAggro), MT_BOOL, 0, NULL },
	{ '1', 'i', 6, 29, 1, OFFSET(mb_Mountable), MT_BOOL, 0, NULL },
	{ '1', 'j', 7, 29, 1, OFFSET(mb_Polymorphed), MT_BOOL, 0, NULL },

	{ '1', 'k', 2, 47, 1, OFFSET(mb_Scavenger), MT_BOOL, 0, NULL },
	{ '1', 'l', 3, 47, 1, OFFSET(mb_Wimpy), MT_BOOL, 0, NULL },
	{ '1', 'm', 4, 47, 1, OFFSET(mb_Immortal), MT_BOOL, 0, NULL },
	{ '1', 'n', 5, 47, 1, OFFSET(mb_Guardian), MT_BOOL, 0, NULL },
	{ '1', 'o', 6, 47, 1, OFFSET(mb_Mounted), MT_BOOL, 0, NULL },
	{ '1', 'p', 7, 47, 1, OFFSET(mb_MobInvis), MT_BOOL, 0, NULL },

	{ '1', 'q', 2, 63, 1, OFFSET(mb_Aggro), MT_BOOL, 0, NULL },
	{ '1', 'r', 3, 63, 1, OFFSET(mb_Pet), MT_BOOL, 0, NULL },
	{ '1', 's', 4, 63, 1, OFFSET(mb_Deadly), MT_BOOL, 0, NULL },
	{ '1', 't', 5, 63, 1, OFFSET(mb_Running), MT_BOOL, 0, NULL },
	{ '1', 'u', 6, 63, 1, OFFSET(mb_Scholar), MT_BOOL, 0, NULL },
	{ '1', 'v', 7, 63, 1, OFFSET(mb_NoAssist), MT_BOOL, 0, NULL },

	{ '2', 'a', 11, 12, 1, OFFSET(mb_ASanct), MT_BOOL, 0, NULL },
	{ '2', 'b', 12, 12, 1, OFFSET(mb_AFlaming), MT_BOOL, 0, NULL },
	{ '2', 'c', 13, 12, 1, OFFSET(mb_ASleep), MT_BOOL, 0, NULL },
	{ '2', 'd', 14, 12, 1, OFFSET(mb_AFly), MT_BOOL, 0, NULL },
	{ '2', 'e', 15, 12, 1, OFFSET(mb_AScry), MT_BOOL, 0, NULL },
	{ '2', 'f', 16, 12, 1, OFFSET(mb_AInv), MT_BOOL, 0, NULL },

	{ '2', 'g', 9, 29, 1, OFFSET(mb_Blind), MT_BOOL, 0, NULL },
	{ '2', 'h', 10, 29, 1, OFFSET(mb_DetMagic), MT_BOOL, 0, NULL },
	{ '2', 'i', 11, 29, 1, OFFSET(mb_AFaerieFire), MT_BOOL, 0, NULL },
	{ '2', 'j', 12, 29, 1, OFFSET(mb_APoison), MT_BOOL, 0, NULL },
	{ '2', 'k', 13, 29, 1, OFFSET(mb_AHide), MT_BOOL, 0, NULL },
	{ '2', 'l', 14, 29, 1, OFFSET(mb_APass), MT_BOOL, 0, NULL },
	{ '2', 'm', 15, 29, 1, OFFSET(mb_AFireShield), MT_BOOL, 0, NULL },

	{ '2', 'n', 9, 47, 1, OFFSET(mb_DetInv), MT_BOOL, 0, NULL },
	{ '2', 'o', 10, 47, 1, OFFSET(mb_DetHidden), MT_BOOL, 0, NULL },
	{ '2', 'p', 11, 47, 1, OFFSET(mb_AInfra), MT_BOOL, 0, NULL },
	{ '2', 'q', 12, 47, 1, OFFSET(mb_AProtect), MT_BOOL, 0, NULL },
	{ '2', 'r', 13, 47, 1, OFFSET(mb_ASneak), MT_BOOL, 0, NULL },
	{ '2', 's', 14, 47, 1, OFFSET(mb_ATrueSight), MT_BOOL, 0, NULL },
	{ '2', 't', 15, 47, 1, OFFSET(mb_AShockShield), MT_BOOL, 0, NULL },

	{ '2', 'u', 9, 63, 1, OFFSET(mb_DetEvil), MT_BOOL, 0, NULL },
	{ '2', 'v', 10, 63, 1, OFFSET(mb_AHold), MT_BOOL, 0, NULL },
	{ '2', 'w', 11, 63, 1, OFFSET(mb_ACurse), MT_BOOL, 0, NULL },
	{ '2', 'x', 12, 63, 1, OFFSET(mb_AParalysis), MT_BOOL, 0, NULL },
	{ '2', 'y', 13, 63, 1, OFFSET(mb_ACharm), MT_BOOL, 0, NULL },
	{ '2', 'z', 14, 63, 1, OFFSET(mb_ADetTrap), MT_BOOL, 0, NULL },
	{ '2', 'A', 15, 63, 1, OFFSET(mb_AFloat), MT_BOOL, 0, NULL },
	{ 0, 0, 0, 0, 0, 0, MT_END }
};


CMenuData	MobPage_C [] = {
	{ '1', 'a', 5, 11, 1, OFFSET(mc_Drain), MT_BOOL, 0, NULL },
	{ '1', 'b', 6, 11, 1, OFFSET(mc_Poison), MT_BOOL, 0, NULL },
	{ '1', 'c', 7, 11, 1, OFFSET(mc_Curse), MT_BOOL, 0, NULL },
	{ '1', 'd', 8, 11, 1, OFFSET(mc_Weaken), MT_BOOL, 0, NULL },
	{ '1', 'e', 9, 11, 1, OFFSET(mc_Trip), MT_BOOL, 0, NULL },
	{ '1', 'f', 10, 11, 1, OFFSET(mc_Bite), MT_BOOL, 0, NULL },

	{ '1', 'g', 2, 27, 1, OFFSET(mc_Bash), MT_BOOL, 0, NULL },
	{ '1', 'h', 3, 27, 1, OFFSET(mc_Kick), MT_BOOL, 0, NULL },
	{ '1', 'i', 4, 27, 1, OFFSET(mc_Gaze), MT_BOOL, 0, NULL },
	{ '1', 'j', 5, 27, 1, OFFSET(mc_Tail), MT_BOOL, 0, NULL },
	{ '1', 'k', 6, 27, 1, OFFSET(mc_BackStab), MT_BOOL, 0, NULL },
	{ '1', 'l', 7, 27, 1, OFFSET(mc_FireBall), MT_BOOL, 0, NULL },
	{ '1', 'm', 8, 30, 1, OFFSET(mc_FlameStrike), MT_BOOL, 0, NULL },
	{ '1', 'n', 9, 30, 1, OFFSET(mc_ColorSpray), MT_BOOL, 0, NULL },
	{ '1', 'o', 10, 30, 1, OFFSET(mc_NPoison), MT_BOOL, 0, NULL },

	{ '1', 'p', 2, 45, 1, OFFSET(mc_Claws), MT_BOOL, 0, NULL },
	{ '1', 'q', 3, 45, 1, OFFSET(mc_Stun), MT_BOOL, 0, NULL },
	{ '1', 'r', 4, 45, 1, OFFSET(mc_Feed), MT_BOOL, 0, NULL },
	{ '1', 's', 5, 45, 1, OFFSET(mc_Harm), MT_BOOL, 0, NULL },
	{ '1', 't', 6, 45, 1, OFFSET(mc_Punch), MT_BOOL, 0, NULL },
	{ '1', 'u', 7, 45, 1, OFFSET(mc_Sting), MT_BOOL, 0, NULL },
	{ '1', 'v', 8, 45, 1, OFFSET(mc_Gouge), MT_BOOL, 0, NULL },

	{ '1', 'w', 2, 69, 1, OFFSET(mc_FireBreath), MT_BOOL, 0, NULL },
	{ '1', 'x', 3, 69, 1, OFFSET(mc_AcidBreath), MT_BOOL, 0, NULL },
	{ '1', 'y', 4, 69, 1, OFFSET(mc_GasBreath), MT_BOOL, 0, NULL },
	{ '1', 'z', 5, 69, 1, OFFSET(mc_FrostBreath), MT_BOOL, 0, NULL },
	{ '1', 'A', 6, 69, 1, OFFSET(mc_LightningBreath), MT_BOOL, 0, NULL },
	{ '1', 'B', 7, 69, 1, OFFSET(mc_CSerious), MT_BOOL, 0, NULL },
	{ '1', 'C', 8, 69, 1, OFFSET(mc_CCritical), MT_BOOL, 0, NULL },
	{ '1', 'D', 9, 69, 1, OFFSET(mc_EarthQuake), MT_BOOL, 0, NULL },
	{ '1', 'E', 10, 69, 1, OFFSET(mc_Blind), MT_BOOL, 0, NULL },

	{ '2', 'a', 14, 11, 1, OFFSET(mc_DDodge), MT_BOOL, 0, NULL },
	{ '2', 'b', 15, 11, 1, OFFSET(mc_DParry), MT_BOOL, 0, NULL },
	{ '2', 'c', 16, 11, 1, OFFSET(mc_DDisarm), MT_BOOL, 0, NULL },

	{ '2', 'd', 12, 31, 1, OFFSET(mc_Sanct), MT_BOOL, 0, NULL },
	{ '2', 'e', 13, 31, 1, OFFSET(mc_DShield), MT_BOOL, 0, NULL },
	{ '2', 'f', 14, 31, 1, OFFSET(mc_DFireShield), MT_BOOL, 0, NULL },
	{ '2', 'g', 15, 31, 1, OFFSET(mc_DShockShield), MT_BOOL, 0, NULL },
	{ '2', 'h', 16, 31, 1, OFFSET(mc_DStoneSkin), MT_BOOL, 0, NULL },

	{ '2', 'i', 12, 51, 1, OFFSET(mc_CureLight), MT_BOOL, 0, NULL },
	{ '2', 'j', 13, 51, 1, OFFSET(mc_DCureSerious), MT_BOOL, 0, NULL },
	{ '2', 'k', 14, 51, 1, OFFSET(mc_DCureCritical), MT_BOOL, 0, NULL },
	{ '2', 'l', 15, 51, 1, OFFSET(mc_DHeal), MT_BOOL, 0, NULL },
	{ '2', 'm', 16, 51, 1, OFFSET(mc_DMonsum1), MT_BOOL, 0, NULL },
	{ '2', 'n', 17, 51, 1, OFFSET(mc_DMonsum2), MT_BOOL, 0, NULL },

	{ '2', 'o', 12, 70, 1, OFFSET(mc_DDispelEvil), MT_BOOL, 0, NULL },
	{ '2', 'p', 13, 70, 1, OFFSET(mc_DDispelMagic), MT_BOOL, 0, NULL },
	{ '2', 'q', 14, 70, 1, OFFSET(mc_DTeleport), MT_BOOL, 0, NULL },
	{ '2', 'r', 15, 70, 1, OFFSET(mc_DBless), MT_BOOL, 0, NULL },
	{ '2', 's', 16, 70, 1, OFFSET(mc_DMonsum3), MT_BOOL, 0, NULL },
	{ '2', 't', 17, 70, 1, OFFSET(mc_DMonsum4), MT_BOOL, 0, NULL },
	{ 0, 0, 0, 0, 0, 0, MT_END }
};


CMenuData	MobPage_D [] = {
	{ '1', 'a', 2, 36, 2, OFFSET(md_SavPoisonDeath), MT_SINT, 0, NULL },
	{ '1', 'b', 3, 36, 2, OFFSET(md_SavWand), MT_INT, 0, NULL },
	{ '1', 'c', 4, 36, 2, OFFSET(md_SavSpellStaff), MT_SINT, 0, NULL },
	{ '1', 'd', 2, 63, 2, OFFSET(md_SavParaPetri), MT_SINT, 0, NULL },
	{ '1', 'e', 3, 63, 2, OFFSET(md_SavBreath), MT_SINT, 0, NULL },

	{ '2', 'a', 6, 20, 1, OFFSET(md_Fins), MT_BOOL, 0, NULL },
	{ '2', 'b', 7, 20, 1, OFFSET(md_Tail), MT_BOOL, 0, NULL },
	{ '2', 'c', 8, 20, 1, OFFSET(md_Guts), MT_BOOL, 0, NULL },
	{ '2', 'd', 9, 21, 1, OFFSET(md_Wings), MT_BOOL, 0, NULL },
	{ '2', 'e', 10, 21, 1, OFFSET(md_Claws), MT_BOOL, 0, NULL },
	{ '2', 'f', 11, 26, 1, OFFSET(md_TailAttack), MT_BOOL, 0, NULL },

	{ '2', 'g', 6, 31, 1, OFFSET(md_Ear), MT_BOOL, 0, NULL },
	{ '2', 'h', 7, 31, 1, OFFSET(md_Arms), MT_BOOL, 0, NULL },
	{ '2', 'i', 8, 31, 1, OFFSET(md_Head), MT_BOOL, 0, NULL },
	{ '2', 'j', 9, 32, 1, OFFSET(md_Hands), MT_BOOL, 0, NULL },
	{ '2', 'k', 10, 32, 1, OFFSET(md_Horns), MT_BOOL, 0, NULL },

	{ '2', 'l', 6, 42, 1, OFFSET(md_Eye), MT_BOOL, 0, NULL },
	{ '2', 'm', 7, 42, 1, OFFSET(md_Legs), MT_BOOL, 0, NULL },
	{ '2', 'n', 8, 42, 1, OFFSET(md_Feet), MT_BOOL, 0, NULL },
	{ '2', 'o', 9, 43, 1, OFFSET(md_Heart), MT_BOOL, 0, NULL },
	{ '2', 'p', 10, 43, 1, OFFSET(md_Tusks), MT_BOOL, 0, NULL },
	{ '2', 'q', 11, 49, 1, OFFSET(md_SharpScales), MT_BOOL, 0, NULL },

	{ '2', 'r', 6, 59, 1, OFFSET(md_Tounge), MT_BOOL, 0, NULL },
	{ '2', 's', 7, 59, 1, OFFSET(md_Tentacles), MT_BOOL, 0, NULL },
	{ '2', 't', 8, 59, 1, OFFSET(md_EyeStalks), MT_BOOL, 0, NULL },
	{ '2', 'u', 6, 72, 1, OFFSET(md_Scales), MT_BOOL, 0, NULL },
	{ '2', 'v', 7, 72, 1, OFFSET(md_Brains), MT_BOOL, 0, NULL },
	{ '2', 'w', 8, 72, 1, OFFSET(md_Fingers), MT_BOOL, 0, NULL },

	{ '3', 'a', 13, 27, 3, OFFSET(md_NumAttacks), MT_SINT, 0, NULL },
	{ '3', 'b', 14, 25, 5, OFFSET(md_HitRoll), MT_SINT, 0, NULL },
	{ '3', 'c', 15, 25, 5, OFFSET(md_DamRoll), MT_SINT, 0, NULL },
	{ '3', 'd', 13, 49, 5, OFFSET(md_Hnodice), MT_INT, 0, NULL },
	{ '3', 'e', 13, 57, 5, OFFSET(md_Hsizedice), MT_INT, 0, NULL },
	{ '3', 'f', 13, 65, 5, OFFSET(md_Hplus), MT_INT, 0, NULL },
	{ '3', 'g', 15, 49, 5, OFFSET(md_Dnodice), MT_INT, 0, NULL },
	{ '3', 'h', 15, 57, 5, OFFSET(md_Dsizedice), MT_INT, 0, NULL },
	{ '3', 'i', 15, 65, 5, OFFSET(md_Dplus), MT_INT, 0, NULL },
	{ 0, 0, 0, 0, 0, 0, MT_END }
};


CMenuData	MobPage_E [] = {
	{ '1', 'a', 2, 23, 1, OFFSET(me_SFido), MT_BOOL, 0, NULL },
	{ '1', 'b', 3, 23, 1, OFFSET(me_SGuard), MT_BOOL, 0, NULL },
	{ '1', 'c', 4, 23, 1, OFFSET(me_SJanitor), MT_BOOL, 0, NULL },
	{ '1', 'd', 5, 23, 1, OFFSET(me_SThief), MT_BOOL, 0, NULL },
	{ '1', 'e', 6, 23, 1, OFFSET(me_SMayor), MT_BOOL, 0, NULL },
	{ '1', 'f', 7, 23, 1, OFFSET(me_SPoison), MT_BOOL, 0, NULL },

	{ '1', 'g', 2, 42, 1, OFFSET(me_SAdept), MT_BOOL, 0, NULL },
	{ '1', 'h', 3, 42, 1, OFFSET(me_SCleric), MT_BOOL, 0, NULL },
	{ '1', 'i', 4, 42, 1, OFFSET(me_SMage), MT_BOOL, 0, NULL },
	{ '1', 'j', 5, 42, 1, OFFSET(me_SUndead), MT_BOOL, 0, NULL },
	{ '1', 'k', 7, 42, 1, OFFSET(me_SExecutioner), MT_BOOL, 0, NULL },

	{ '1', 'l', 2, 70, 1, OFFSET(me_SFireBreath), MT_BOOL, 0, NULL },
	{ '1', 'm', 3, 70, 1, OFFSET(me_SFrostBreath), MT_BOOL, 0, NULL },
	{ '1', 'n', 4, 70, 1, OFFSET(me_SAcidBreath), MT_BOOL, 0, NULL },
	{ '1', 'o', 5, 70, 1, OFFSET(me_SGasBreath), MT_BOOL, 0, NULL },
	{ '1', 'p', 6, 70, 1, OFFSET(me_SLightningBreath), MT_BOOL, 0, NULL },
	{ '1', 'q', 7, 70, 1, OFFSET(me_SAnyBreath), MT_BOOL, 0, NULL },

	{ '2', 'a', 13, 10, 1, OFFSET(me_Position), MT_GROUP, 0, NULL, 0,16 },
	{ '2', 'b',  9, 34, 1, OFFSET(me_Position), MT_GROUP, 0, NULL, 1,16 },
	{ '2', 'c', 10, 34, 1, OFFSET(me_Position), MT_GROUP, 0, NULL, 2,16 },
	{ '2', 'd', 11, 34, 1, OFFSET(me_Position), MT_GROUP, 0, NULL, 3,16 },
	{ '2', 'e', 12, 34, 1, OFFSET(me_Position), MT_GROUP, 0, NULL, 4,16 },
	{ '2', 'f', 13, 34, 1, OFFSET(me_Position), MT_GROUP, 0, NULL, 5,16 },

	{ '2', 'g',  9, 53, 1, OFFSET(me_Position), MT_GROUP, 0, NULL, 6,16 },
	{ '2', 'h', 10, 53, 1, OFFSET(me_Position), MT_GROUP, 0, NULL, 7,16 },
	{ '2', 'i', 11, 53, 1, OFFSET(me_Position), MT_GROUP, 0, NULL, 8,16 },
	{ '2', 'j', 12, 53, 1, OFFSET(me_Position), MT_GROUP, 0, NULL, 9,16 },
	{ '2', 'k', 13, 53, 1, OFFSET(me_Position), MT_GROUP, 0, NULL, 10,16 },

	{ '2', 'l',  9, 70, 1, OFFSET(me_Position), MT_GROUP, 0, NULL, 11,16 },
	{ '2', 'm', 10, 70, 1, OFFSET(me_Position), MT_GROUP, 0, NULL, 12,16 },
	{ '2', 'n', 11, 70, 1, OFFSET(me_Position), MT_GROUP, 0, NULL, 13,16 },
	{ '2', 'o', 12, 70, 1, OFFSET(me_Position), MT_GROUP, 0, NULL, 14,16 },
	{ '2', 'p', 13, 70, 1, OFFSET(me_Position), MT_GROUP, 0, NULL, 15,16 },


	{ '3', 'a', 18, 9, 3, OFFSET(me_RFire), MT_RIS, 0, NULL },
	{ '3', 'b', 15, 21, 3, OFFSET(me_RCold), MT_RIS, 0, NULL },
	{ '3', 'c', 16, 21, 3, OFFSET(me_RElect), MT_RIS, 0, NULL },
	{ '3', 'd', 17, 21, 3, OFFSET(me_REnergy), MT_RIS, 0, NULL },
	{ '3', 'e', 18, 21, 3, OFFSET(me_RPoison), MT_RIS, 0, NULL },

	{ '3', 'f', 15, 34, 3, OFFSET(me_RBlunt), MT_RIS, 0, NULL },
	{ '3', 'g', 16, 34, 3, OFFSET(me_RPierce), MT_RIS, 0, NULL },
	{ '3', 'h', 17, 34, 3, OFFSET(me_RSlash), MT_RIS, 0, NULL },
	{ '3', 'i', 18, 34, 3, OFFSET(me_RAcid), MT_RIS, 0, NULL },

	{ '3', 'j', 15, 47, 3, OFFSET(me_RNonMagic), MT_RIS, 0, NULL },
	{ '3', 'k', 16, 47, 3, OFFSET(me_RDrain), MT_RIS, 0, NULL },
	{ '3', 'l', 17, 47, 3, OFFSET(me_RSleep), MT_RIS, 0, NULL },
	{ '3', 'm', 18, 47, 3, OFFSET(me_RCharm), MT_RIS, 0, NULL },

	{ '3', 'n', 15, 60, 3, OFFSET(me_RHold), MT_RIS, 0, NULL },
	{ '3', 'o', 16, 60, 3, OFFSET(me_RMagic), MT_RIS, 0, NULL },
	{ '3', 'p', 17, 60, 3, OFFSET(me_RPlus1), MT_RIS, 0, NULL },
	{ '3', 'q', 18, 60, 3, OFFSET(me_RPlus2), MT_RIS, 0, NULL },

	{ '3', 'r', 15, 73, 3, OFFSET(me_RPlus3), MT_RIS, 0, NULL },
	{ '3', 's', 16, 73, 3, OFFSET(me_RPlus4), MT_RIS, 0, NULL },
	{ '3', 't', 17, 73, 3, OFFSET(me_RPlus5), MT_RIS, 0, NULL },
	{ '3', 'u', 18, 73, 3, OFFSET(me_RPlus6), MT_RIS, 0, NULL },
	{ 0, 0, 0, 0, 0, 0, MT_END }
};


CMenuData	MobPage_F [] = {
	{ '1', 'a', 5, 12, 1, OFFSET(mf_Ant), MT_BOOL, 0, NULL },
	{ '1', 'b', 6, 12, 1, OFFSET(mf_Bee), MT_BOOL, 0, NULL },
	{ '1', 'c', 7, 12, 1, OFFSET(mf_Beetle), MT_BOOL, 0, NULL },
	{ '1', 'd', 8, 12, 1, OFFSET(mf_Fly), MT_BOOL, 0, NULL },
	{ '1', 'e', 9, 12, 1, OFFSET(mf_Locust), MT_BOOL, 0, NULL },
	{ '1', 'f',10, 12, 1, OFFSET(mf_Snake), MT_BOOL, 0, NULL },
	{ '1', 'g',11, 12, 1, OFFSET(mf_Spider), MT_BOOL, 0, NULL },
	{ '1', 'h',12, 12, 1, OFFSET(mf_Worm), MT_BOOL, 0, NULL },

	{ '1', 'i', 2, 27, 1, OFFSET(mf_Human), MT_BOOL, 0, NULL },
	{ '1', 'j', 3, 27, 1, OFFSET(mf_Elf), MT_BOOL, 0, NULL },
	{ '1', 'k', 4, 27, 1, OFFSET(mf_Dwarf), MT_BOOL, 0, NULL },
	{ '1', 'l', 5, 27, 1, OFFSET(mf_Halfling), MT_BOOL, 0, NULL },
	{ '1', 'm', 6, 27, 1, OFFSET(mf_Pixie), MT_BOOL, 0, NULL },
	{ '1', 'n', 7, 27, 1, OFFSET(mf_Vampire), MT_BOOL, 0, NULL },
	{ '1', 'o', 8, 27, 1, OFFSET(mf_Gargolye), MT_BOOL, 0, NULL },
	{ '1', 'p', 9, 27, 1, OFFSET(mf_Ghoul), MT_BOOL, 0, NULL },
	{ '1', 'q',10, 27, 1, OFFSET(mf_Gnoll), MT_BOOL, 0, NULL },
	{ '1', 'r',11, 27, 1, OFFSET(mf_Gnome), MT_BOOL, 0, NULL },
	{ '1', 's',12, 27, 1, OFFSET(mf_Goblin), MT_BOOL, 0, NULL },

	{ '1', 't', 2, 42, 1, OFFSET(mf_Neand), MT_BOOL, 0, NULL },
	{ '1', 'u', 3, 42, 1, OFFSET(mf_Orc), MT_BOOL, 0, NULL },
	{ '1', 'v', 4, 42, 1, OFFSET(mf_Skeleton), MT_BOOL, 0, NULL },
	{ '1', 'w', 5, 42, 1, OFFSET(mf_Thoul), MT_BOOL, 0, NULL },
	{ '1', 'x', 6, 42, 1, OFFSET(mf_Undead), MT_BOOL, 0, NULL },
	{ '1', 'y', 7, 42, 1, OFFSET(mf_Zombie), MT_BOOL, 0, NULL },
	{ '1', 'z', 8, 42, 1, OFFSET(mf_Ape), MT_BOOL, 0, NULL },
	{ '1', 'A', 9, 42, 1, OFFSET(mf_Baboon), MT_BOOL, 0, NULL },
	{ '1', 'B',10, 42, 1, OFFSET(mf_Bat), MT_BOOL, 0, NULL },
	{ '1', 'C',11, 42, 1, OFFSET(mf_Bear), MT_BOOL, 0, NULL },
	{ '1', 'D',12, 42, 1, OFFSET(mf_Boar), MT_BOOL, 0, NULL },

	{ '1', 'E', 2, 57, 1, OFFSET(mf_Avis), MT_BOOL, 0, NULL },
	{ '1', 'F', 3, 57, 1, OFFSET(mf_BugBear), MT_BOOL, 0, NULL },
	{ '1', 'G', 4, 57, 1, OFFSET(mf_Dragon), MT_BOOL, 0, NULL },
	{ '1', 'H', 5, 57, 1, OFFSET(mf_Rust), MT_BOOL, 0, NULL },
	{ '1', 'I', 6, 57, 1, OFFSET(mf_Shadow), MT_BOOL, 0, NULL },
	{ '1', 'J', 7, 57, 1, OFFSET(mf_ShapeShifter), MT_BOOL, 0, NULL },
	{ '1', 'K', 8, 57, 1, OFFSET(mf_Shrieker), MT_BOOL, 0, NULL },
	{ '1', 'L', 9, 57, 1, OFFSET(mf_Stirge), MT_BOOL, 0, NULL },
	{ '1', 'M',10, 57, 1, OFFSET(mf_Wight), MT_BOOL, 0, NULL },
	{ '1', 'N',11, 57, 1, OFFSET(mf_Spirit), MT_BOOL, 0, NULL },
	{ '1', 'O',12, 57, 1, OFFSET(mf_Rodent), MT_BOOL, 0, NULL },

	{ '1', 'P', 2, 72, 1, OFFSET(mf_Amph), MT_BOOL, 0, NULL },
	{ '1', 'Q', 3, 72, 1, OFFSET(mf_Bovine), MT_BOOL, 0, NULL },
	{ '1', 'R', 4, 72, 1, OFFSET(mf_Canine), MT_BOOL, 0, NULL },
	{ '1', 'S', 5, 72, 1, OFFSET(mf_Crust), MT_BOOL, 0, NULL },
	{ '1', 'T', 6, 72, 1, OFFSET(mf_Feline), MT_BOOL, 0, NULL },
	{ '1', 'U', 7, 72, 1, OFFSET(mf_Fish), MT_BOOL, 0, NULL },
	{ '1', 'V', 8, 72, 1, OFFSET(mf_Insect), MT_BOOL, 0, NULL },
	{ '1', 'W', 9, 72, 1, OFFSET(mf_Mammal), MT_BOOL, 0, NULL },
	{ '1', 'X',10, 72, 1, OFFSET(mf_Porcine), MT_BOOL, 0, NULL },
	{ '1', 'Y',11, 72, 1, OFFSET(mf_Reptile), MT_BOOL, 0, NULL },
	{ '1', 'Z',12, 72, 1, OFFSET(mf_Trog), MT_BOOL, 0, NULL },

	{ '1', '1',14, 12, 1, OFFSET(mf_Golem), MT_BOOL, 0, NULL },
	{ '1', '2',15, 12, 1, OFFSET(mf_Cat), MT_BOOL, 0, NULL },
	{ '1', '3',16, 12, 1, OFFSET(mf_Dog), MT_BOOL, 0, NULL },
	{ '1', '4',17, 12, 1, OFFSET(mf_Horse), MT_BOOL, 0, NULL },
	{ '1', '5',18, 12, 1, OFFSET(mf_Wolf), MT_BOOL, 0, NULL },

	{ '1', '6',14, 27, 1, OFFSET(mf_Rat), MT_BOOL, 0, NULL },
	{ '1', '7',15, 27, 1, OFFSET(mf_Gorgon), MT_BOOL, 0, NULL },
	{ '1', '8',16, 27, 1, OFFSET(mf_Harpy), MT_BOOL, 0, NULL },
	{ '1', '9',17, 27, 1, OFFSET(mf_HobGob), MT_BOOL, 0, NULL },

	{ '1', '$',14, 42, 1, OFFSET(mf_Ferret), MT_BOOL, 0, NULL },
	{ '1', '~',15, 42, 1, OFFSET(mf_Kobold), MT_BOOL, 0, NULL },
	{ '1', '&',16, 42, 1, OFFSET(mf_Gel), MT_BOOL, 0, NULL },

	{ '1', '*',14, 56, 1, OFFSET(mf_Mold), MT_BOOL, 0, NULL },
	{ '1', '+',15, 56, 1, OFFSET(mf_Ooze), MT_BOOL, 0, NULL },
	{ '1', ':',16, 56, 1, OFFSET(mf_Mule), MT_BOOL, 0, NULL },
	{ '1', '^',17, 56, 1, OFFSET(mf_Shrew), MT_BOOL, 0, NULL },

	{ '1', '%',14, 72, 1, OFFSET(mf_Magical), MT_BOOL, 0, NULL },
	{ '1', '_',15, 72, 1, OFFSET(mf_Slime), MT_BOOL, 0, NULL },
	{ '1', '#',16, 72, 1, OFFSET(mf_Minotaur), MT_BOOL, 0, NULL },
	{ '1', '!',17, 72, 1, OFFSET(mf_LizardMan), MT_BOOL, 0, NULL },
	{ '1', '@',18, 72, 1, OFFSET(mf_Lycan), MT_BOOL, 0, NULL },
	{ 0, 0, 0, 0, 0, 0, MT_END }
};

CMenuData	*MobMenuData [] = { MobPage_A, MobPage_B, MobPage_C,
								MobPage_D, MobPage_E, MobPage_F, NULL };