/****************************************************************************
* [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. *
* ------------------------------------------------------------------------ *
* SmaugWiz Player Menu Implementation file *
****************************************************************************/
#include "stdafx.h"
#define PLAYERMENU_CPP
#include "smaug.h"
#include "SysData.h"
#include "mobiles.h"
#include "affect.h"
#include "objects.h"
#include "rooms.h"
#include "SmaugWizDoc.h"
#include "smaugfiles.h"
#include "playermenu.h"
#include "descriptor.h"
#include "character.h"
CMenuData *PlrMenuData [];
CPlayerMenu::CPlayerMenu ()
{
m_Vnum = 0; // no vnum for pc's
m_bProto = FALSE;
extern void ClearAddrRange (void* start, void* end, UINT SizEnd);
ClearAddrRange (&ma_Level, &mb_IceShield, sizeof (mb_IceShield));
}
void CPlayerMenu::Display (CCharacter& Ch, int page)
{
m_HelpMenu = DIM (PlrMenus) - 1;
m_PageNr = page;
if (m_PageNr < 0 || m_PageNr > m_HelpMenu) then m_PageNr = m_HelpMenu;
m_CurrPageLines = GetLineCount (PlrMenus [m_PageNr]);
m_pPageData = PlrMenuData [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 (PlrMenus [m_PageNr]);
// fill in fields
DisplayData (Ch);
}
void CPlayerMenu::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 CPlayerMenu::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 CPlayerMenu::Save (CCharacter& Ch)
{
}
BOOL CPlayerMenu::Load (CCharacter& Ch, const char* name)
{
char buf [MAX_INPUT_LENGTH];
FILE *fp;
char *pLine;
CString Fname = FileTable.PlayerName (capitalize (name));
if (! FileTable.Exists (Fname)) {
CString Bname = FileTable.BackupPlayerName (capitalize (name));
if (FileTable.Exists (Bname)) {
Ch.SendText ("Loading from backup player file...");
Fname = Bname;
}
else return FALSE;
}
if ((fp = fopen (Fname, "r")) == NULL)
return FALSE;
sprintf (buf, "%s::PMENU:Loading player data for: %s",
Ch.GetName (), name);
gpDoc->LogString (buf, LOG_COMM, LEVEL_GREATER);
BOOL bLoaded = FALSE;
for (;;) {
char letter;
char *word;
pLine = fread_line (fp);
letter = *pLine++;
if (letter == '*')
continue;
if (letter != '#') {
bug ("CPlayerMenu::Load: %s, '#' not found.", name);
break;
}
word = ParseWord (pLine);
if (! str_cmp (word, "PLAYER")) {
if (LoadPlayer (Ch, fp)) {
if (Ch.GetTrustLevel () < ma_Level) {
set_char_color (AT_IMMORT, &Ch);
Ch.SendText ("Their godly glow prevents you from "
"getting a good look .\n\r");
break;
}
}
else break;
}
// else if (!str_cmp (word, "OBJECT")) // Objects
// fread_obj (vict, fp, OS_CARRY);
// else if (!str_cmp (word, "COMMENT"))
// fread_comment (vict, fp); // Comments
else if (!str_cmp (word, "END")) { // Done
bLoaded = TRUE;
break;
}
else {
bug ("Load_char_obj: bad section loading %s.", name);
break;
}
}
fclose (fp);
return bLoaded;
}
#define KEY(literal,field,value) \
if (!str_cmp (word, literal)) { \
field = value; \
fMatch = TRUE; \
break; \
}
BOOL CPlayerMenu::LoadPlayer (CCharacter& Ch, FILE* fp)
{
char *word;
BOOL fMatch;
char *pLine;
BOOL bDone = FALSE;
int file_ver = 0;
int killcnt = 0;
CAffectFlags AffectFlags;
CActFlags ActFlags;
do {
fMatch = FALSE;
if (! feof (fp)) {
pLine = fread_line (fp);
word = ParseWord (pLine);
}
else word = "End";
switch (UPPER (word [0])) {
case '*':
fMatch = TRUE;
break;
case 'A':
if (! str_cmp (word, "Act")) {
ActFlags.Parse (pLine);
fMatch = TRUE;
break;
}
if (! str_cmp (word, "AffectedBy")) {
AffectFlags.Parse (pLine);
fMatch = TRUE;
break;
}
KEY ("Alignment", ma_Align, ParseNumber (pLine));
KEY ("Armor", ma_Ac, ParseNumber (pLine));
// Look at character.cpp to see about affect and affect data...
// if (!str_cmp (word, "Affect") || !str_cmp (word, "AffectData"))
// if (! str_cmp (word, "AttrMod" )) {
// x1 = x2 = x3 = x4 = x5 = x6 = x7 = 13;
// sscanf (pLine, "%d %d %d %d %d %d %d", &x1, &x2, &x3, &x4,
// &x5, &x6, &x7);
// mod_str = x1;
// mod_int = x2;
// mod_wis = x3;
// mod_dex = x4;
// mod_con = x5;
// mod_cha = x6;
// mod_lck = x7;
// if (!x7)
// mod_lck = 0;
// fMatch = TRUE;
// break;
// }
if (!str_cmp (word, "AttrPerm")) {
sscanf (pLine, "%d %d %d %d %d %d %d",
&ma_Str, &ma_Int, &ma_Wis, &ma_Dex,
&ma_Con, &ma_Cha, &ma_Luck);
fMatch = TRUE;
break;
}
// KEY ("AuthedBy", ma_authed_by, ParseCString (pLine, fp));
break;
case 'B':
// KEY ("Bamfin", m_pPcdata->bamfin, ParseCString (pLine, fp));
// KEY ("Bamfout", m_pPcdata->bamfout, ParseCString (pLine, fp));
// KEY ("Bestowments", m_pPcdata->bestowments, ParseCString (pLine, fp));
KEY ("Bio", ma_Bio, ParseCString (pLine, fp));
break;
case 'C':
// KEY ("Clan", m?_Clan, ParseCString (pLine, fp));
// KEY ("Class", nClass, ParseNumber (pLine));
// if (! str_cmp (word, "Condition")) {
// sscanf (pLine, "%d %d %d %d", &x1, &x2, &x3, &x4);
// m_pPcdata->condition [0] = x1;
// m_pPcdata->condition [1] = x2;
// m_pPcdata->condition [2] = x3;
// m_pPcdata->condition [3] = x4;
// fMatch = TRUE;
// break;
// }
// KEY ("Council", m?_Council, ParseString (pLine, fp));
break;
case 'D':
KEY ("Damroll", ma_Damrol, ParseNumber (pLine));
// KEY ("Deaf", deaf, ParseNumber (pLine));
KEY ("Deity", ma_Deity, ParseString (pLine, fp));
break;
// 'E' was moved to after 'S'
case 'F':
KEY ("Favor", ma_Favor, ParseNumber (pLine));
// KEY ("Flags", m_pPcdata->m_flags, ParseNumber (pLine));
break;
case 'G':
KEY ("Glory", ma_Glory, ParseNumber (pLine));
KEY ("Gold", ma_Gold, ParseNumber (pLine));
// KEY ("Guild", m?_Guild, ParseCString (pLine, fp));
break;
case 'H':
// if (! str_cmp (word, "Helled")) {
// m_pPcdata->release_date = ParseNumber (pLine);
// m_pPcdata->helled_by = ParseCString (pLine, fp);
// if (m_pPcdata->release_date < current_time) {
// STRFREE (m_pPcdata->helled_by);
// m_pPcdata->helled_by = NULL;
// m_pPcdata->release_date = 0;
// }
// fMatch = TRUE;
// break;
// }
KEY ("Hitroll", ma_Hitrol, ParseNumber (pLine));
// KEY ("Homepage", m?_Homepage, ParseCString (pLine, fp));
if (! str_cmp (word, "HpManaMove")) {
ma_Hp = ParseNumber (pLine);
ma_MaxHp = ParseNumber (pLine);
ma_Mana = ParseNumber (pLine);
ma_MaxMana = ParseNumber (pLine);
ma_Move = ParseNumber (pLine);
ma_MaxMove = ParseNumber (pLine);
fMatch = TRUE;
break;
}
break;
case 'I':
// KEY ("IllegalPK", m_pPcdata->illegal_pk, ParseNumber (pLine));
// KEY ("Immune", m_immune, ParseNumber (pLine));
break;
case 'K':
// if (!str_cmp (word, "Killed")) {
// fMatch = TRUE;
// m_pPcdata->killed[killcnt].vnum = ParseNumber (pLine);
// m_pPcdata->killed[killcnt++].count = ParseNumber (pLine);
// }
// break;
case 'L':
KEY ("Level", ma_Level, ParseNumber (pLine));
// if (! str_cmp (word, "Languages")) {
// speaks = ParseNumber (pLine);
// speaking = ParseNumber (pLine);
// fMatch = TRUE;
// }
break;
case 'M':
KEY ("MDeaths", ma_Mdeaths, ParseNumber (pLine));
// KEY ("Mentalstate", SetMentalState, ParseNumber (pLine));
KEY ("MGlory", ma_MGlory, ParseNumber (pLine));
// KEY ("Minsnoop", m_pPcdata->min_snoop, ParseNumber (pLine));
KEY ("MKills", ma_Mkills, ParseNumber (pLine));
// if (!str_cmp (word, "MobRange")) {
// m_pPcdata->m_range_lo = ParseNumber (pLine);
// m_pPcdata->m_range_hi = ParseNumber (pLine);
// fMatch = TRUE;
// }
break;
case 'N':
KEY ("Name", ma_Name, ParseCString (pLine, fp));
break;
case 'O':
// KEY ("Outcast_time", m_pPcdata->outcast_time, ParseNumber (pLine));
// if (!str_cmp (word, "ObjRange")) {
// m_pPcdata->o_range_lo = ParseNumber (pLine);
// m_pPcdata->o_range_hi = ParseNumber (pLine);
// fMatch = TRUE;
// }
// break;
case 'P':
KEY ("Password", ma_Password, ParseCString (pLine, fp));
// KEY ("PDeaths", m_pPcdata->pdeaths, ParseNumber (pLine));
// KEY ("PKills", m_pPcdata->pkills, ParseNumber (pLine));
// KEY ("Played", SetPlayed, ParseNumber (pLine));
KEY ("Position", ma_Pos, ParseNumber (pLine));
KEY ("Practice", ma_Pract, ParseNumber (pLine));
KEY ("Prompt", ma_Prompt, ParseCString (pLine, fp));
// if (!str_cmp (word, "PTimer")) {
// add_timer (this , TIMER_PKILLED, ParseNumber (pLine), NULL, 0);
// fMatch = TRUE;
// break;
// }
break;
case 'R':
// KEY ("Race", Race, ParseNumber (pLine));
// KEY ("Rank", m_pPcdata->rank, ParseCString (pLine, fp));
// KEY ("Resistant", m_resist, ParseNumber (pLine));
// KEY ("Restore_time",m_pPcdata->restore_time, ParseNumber (pLine));
KEY ("Room", ma_Room, ParseNumber (pLine));
// if (!str_cmp (word, "RoomRange")) {
// m_pPcdata->r_range_lo = ParseNumber (pLine);
// m_pPcdata->r_range_hi = ParseNumber (pLine);
// fMatch = TRUE;
// }
break;
case 'S':
KEY ("Sex", ma_Sex, ParseNumber (pLine));
// KEY ("Susceptible", m_suscept, ParseNumber (pLine));
// if (! str_cmp (word, "SavingThrow")) {
// saving_wand = ParseNumber (pLine);
// saving_poison_death = saving_wand;
// saving_para_petri = saving_wand;
// saving_breath = saving_wand;
// saving_spell_staff = saving_wand;
// fMatch = TRUE;
// break;
// }
// if (! str_cmp (word, "SavingThrows")) {
// saving_poison_death = ParseNumber (pLine);
// saving_wand = ParseNumber (pLine);
// saving_para_petri = ParseNumber (pLine);
// saving_breath = ParseNumber (pLine);
// saving_spell_staff = ParseNumber (pLine);
// fMatch = TRUE;
// break;
// }
// if (! str_cmp (word, "Site")) {
// if (! preload) {
// sprintf (buf, "Last connected from: %s\n\r",
// ParseLine (pLine));
// SendText (buf);
// }
// fMatch = TRUE;
// if (preload)
// word = "End";
// else break;
// }
// if (! str_cmp (word, "Skill")) {
// int sn;
// int value;
//
// if (preload)
// word = "End";
// else {
// value = ParseNumber (pLine);
// sn = SkillTable.BsearchExact (ParseWord (pLine),
// gsn_first_skill, gsn_first_weapon-1);
// if (sn < 0)
// bug ("CCharacter::Read: unknown skill.");
// else {
// m_pPcdata->learned [sn] = value;
// Take care of people who have stuff they shouldn't
// Assumes class and level were loaded before. Altrag *
// Assumes practices are loaded first too now. Altrag */
// if (GetLevel () < LEVEL_IMMORTAL) {
// if (SkillTable.GetLevel (sn, m_Class) >= LEVEL_IMMORTAL) {
// m_pPcdata->learned [sn] = 0;
// AddPractices (1);
// }
// }
// }
// fMatch = TRUE;
// break;
// }
// }
// if (! str_cmp (word, "Spell")) {
// int sn;
// int value;
//
// if (preload)
// word = "End";
// else {
// value = ParseNumber (pLine);
//
// sn = SkillTable.BsearchExact (ParseWord (pLine),
// gsn_first_spell, gsn_first_skill-1);
// if (sn < 0)
// bug ("CCharacter::Read: unknown spell.");
// else {
// m_pPcdata->learned[sn] = value;
// if (GetLevel () < LEVEL_IMMORTAL)
// if (SkillTable.GetLevel (sn, m_Class) >= LEVEL_IMMORTAL) {
// m_pPcdata->learned [sn] = 0;
// AddPractices (1);
// }
// }
// fMatch = TRUE;
// break;
// }
// }
if (str_cmp (word, "End"))
break;
case 'E':
if (! str_cmp (word, "End")) {
// killcnt = URANGE (2,
// ((GetLevel ()+3) * MAX_KILLTRACK)/LEVEL_AVATAR,
// MAX_KILLTRACK);
// if (killcnt < MAX_KILLTRACK)
// m_pPcdata->killed [killcnt].vnum = 0;
bDone = TRUE;
break;
}
KEY ("Exp", ma_Exp, ParseNumber (pLine));
break;
case 'T':
// if (! str_cmp (word, "Tongue")) {
// int sn;
// int value;
//
// if (preload)
// word = "End";
// else {
// value = ParseNumber (pLine);
//
// sn = SkillTable.BsearchExact (ParseWord (pLine),
// gsn_first_tongue, gsn_top_sn-1);
// if (sn < 0)
// bug ("CCharacter::Read: unknown tongue.");
// else {
// m_pPcdata->learned [sn] = value;
// if (GetLevel () < LEVEL_IMMORTAL)
// if (SkillTable.GetLevel (sn, GetClass ()) >= LEVEL_IMMORTAL) {
// m_pPcdata->learned [sn] = 0;
// AddPractices (1);
// }
// }
// fMatch = TRUE;
// }
// break;
// }
KEY ("Trust", ma_Trust, ParseNumber (pLine));
// if (!str_cmp (word, "Title")) {
// m_pPcdata->title = ParseCString (pLine, fp);
// if (isalpha (m_pPcdata->title [0])
// || isdigit (m_pPcdata->title [0])) {
// sprintf (buf, " %s", m_pPcdata->title);
// if (m_pPcdata->title)
// STRFREE (m_pPcdata->title);
// m_pPcdata->title = STRALLOC (buf);
// }
// fMatch = TRUE;
// break;
// }
break;
case 'V':
KEY ("Version", file_ver, ParseNumber (pLine));
break;
case 'W':
// if (! str_cmp (word, "Weapon")) {
// int sn;
// int value;
//
// if (preload)
// word = "End";
// else {
// value = ParseNumber (pLine);
//
// sn = SkillTable.BsearchExact (ParseWord (pLine),
// gsn_first_weapon, gsn_first_tongue-1);
// if (sn < 0)
// bug ("CCharacter::Read: unknown weapon.", 0);
// else {
// m_pPcdata->learned [sn] = value;
// if (GetLevel () < LEVEL_IMMORTAL)
// if (SkillTable.GetLevel (sn, GetClass ()) >= LEVEL_IMMORTAL) {
// m_pPcdata->learned[sn] = 0;
// AddPractices (1);
// }
// }
// fMatch = TRUE;
// }
// break;
// }
KEY ("Wimpy", mb_Wimp, ParseNumber (pLine));
// KEY ("WizInvis", m_pPcdata->wizinvis, ParseNumber (pLine));
break;
}
if (! fMatch) {
bug ("CCharacter::Read: no match: %s", word);
}
} while (! bDone);
if (bDone) {
CCharacter Vc;
Vc.SetActFlags (ActFlags); // So we can use access functions
Vc.SetAffectFlags (AffectFlags);
mb_Silent = Vc.IsSilent ();
mb_Denied = Vc.IsDenied ();
mb_Nice = Vc.IsNice ();
mb_Frozen = Vc.IsFrozen ();
mb_Logged = Vc.IsLogged ();
mb_Attacker = Vc.IsAttacker ();
mb_Killer = Vc.IsKiller ();
mb_Thief = Vc.IsThief ();
mb_NoEmote = Vc.IsNoEmote ();
mb_AutoSac = Vc.IsAutoSac ();
mb_AutoLoot = Vc.IsAutoLoot ();
mb_AutoExit = Vc.IsAutoExit ();
mb_Poly = Vc.IsPolymorphed ();
mb_NoTell = Vc.IsNoTell ();
mb_WizInv = Vc.IsWizInvis ();
mb_Secret = Vc.IsSecretive ();
mb_HolyLight = Vc.IsHolyLight ();
mb_Combined = Vc.IsCombined ();
mb_HasPrompt = Vc.HasPrompt ();
mb_HasPet = Vc.HasPet ();
mb_NoAssist = Vc.IsNoAssist ();
mb_Blank = Vc.IsBlank ();
mb_Telenet = Vc.IsTelenet ();
mb_Rip = Vc.IsRip ();
mb_Ansi = Vc.IsAnsi ();
mb_Brief = Vc.IsBrief ();
mb_Vnums = Vc.IsVnums ();
mb_Wimpy = Vc.IsWimpy ();
mb_Sanct = Vc.HasSanctuary ();
mb_Flaming = Vc.IsFlaming ();
mb_Sleeping = Vc.IsSleeping ();
mb_Flying = Vc.IsFlying ();
mb_Scrying = Vc.IsScrying ();
mb_Invis = Vc.IsInvis ();
mb_Blinded = Vc.IsBlind ();
mb_DetMagic = Vc.CanSeeMagic ();
mb_FaerieFire = Vc.IsFaerieFire ();
mb_Poison = Vc.IsPoisoned ();
mb_Hidden = Vc.IsHidden ();
mb_Pass = Vc.CanPass ();
mb_FireShield = Vc.HasFireShield ();
mb_Beserk = Vc.IsBeserk ();
mb_DetInvis = Vc.CanSeeInvis ();
mb_DetHidden = Vc.CanSeeHidden ();
mb_Infra = Vc.CanSeeInfra ();
mb_Protect = Vc.IsProtected ();
mb_Sneak = Vc.IsSneaking ();
mb_TrueSight = Vc.HasTrueSight ();
mb_ShockShield = Vc.HasShockShield ();
mb_Aqua = Vc.IsAqua ();
mb_DetEvil = Vc.CanSeeEvil ();
mb_Curse = Vc.IsCursed ();
mb_Paralysed = Vc.IsParalysed ();
mb_Charmed = Vc.IsCharmed ();
mb_DetTrap = Vc.IsDetTrap ();
mb_Floating = Vc.IsFloating ();
mb_IceShield = Vc.HasIceShield ();
}
return bDone;
}
#define OFFSET(aa) offsetof(CPlayerMenu,aa)
CMenuData PlrPage_A [] = {
{ '1', 'a', 2, 20, 26, OFFSET(ma_Name), MT_CSTRING, 0, NULL },
{ '1', 'b', 3, 20, 26, OFFSET(ma_Title), MT_CSTRING, 0, NULL },
{ '1', 'c', 2, 56, 21, OFFSET(ma_Password), MT_CSTRING, 0, NULL },
{ '1', 'd', 3, 56, 21, OFFSET(ma_Deity), MT_CSTRING, 0, NULL },
{ '1', 'e', 4, 12, 66, OFFSET(ma_Prompt), MT_CSTRING, 0, NULL },
{ '1', 'f', 5, 10, 69, OFFSET(ma_Bio), MT_CSTRING, 0, MenuStringEditFn },
{ '2', 'a', 11, 12, 7, OFFSET(ma_Level), MT_INT, 0, NULL },
{ '2', 'b', 12, 12, 7, OFFSET(ma_Trust), MT_INT, 0, NULL },
{ '2', 'c', 13, 12, 7, OFFSET(ma_Align), MT_INT, 0, NULL },
{ '2', 'd', 14, 12, 7, OFFSET(ma_Favor), MT_INT, 0, NULL },
{ '2', 'e', 15, 12, 7, OFFSET(ma_Sex), MT_INT, 0, NULL },
{ '2', 'f', 16, 12, 7, OFFSET(ma_Ac), MT_INT, 0, NULL },
{ '2', 'g', 17, 12, 7, OFFSET(ma_Gold), MT_INT, 0, NULL },
{ '2', 'h', 9, 33, 6, OFFSET(ma_Hp), MT_INT, 0, NULL },
{ '2', 'i', 10, 33, 6, OFFSET(ma_MaxHp), MT_INT, 0, NULL },
{ '2', 'j', 11, 33, 6, OFFSET(ma_Mana), MT_INT, 0, NULL },
{ '2', 'k', 12, 33, 6, OFFSET(ma_MaxMana), MT_INT, 0, NULL },
{ '2', 'l', 13, 33, 6, OFFSET(ma_Move), MT_INT, 0, NULL },
{ '2', 'm', 14, 33, 6, OFFSET(ma_MaxMove), MT_INT, 0, NULL },
{ '2', 'n', 15, 33, 6, OFFSET(ma_Pos), MT_INT, 0, NULL },
{ '2', 'o', 16, 34, 6, OFFSET(ma_Pract), MT_INT, 0, NULL },
{ '2', 'p', 17, 35, 6, OFFSET(ma_Exp), MT_INT, 0, NULL },
{ '2', 'q', 9, 52, 6, OFFSET(ma_Hitrol), MT_INT, 0, NULL },
{ '2', 'r', 10, 52, 6, OFFSET(ma_Damrol), MT_INT, 0, NULL },
{ '2', 's', 11, 52, 6, OFFSET(ma_Glory), MT_INT, 0, NULL },
{ '2', 't', 12, 52, 6, OFFSET(ma_MGlory), MT_INT, 0, NULL },
{ '2', 'u', 13, 52, 6, OFFSET(ma_Room), MT_INT, 0, NULL },
{ '2', 'v', 14, 52, 6, OFFSET(ma_Played), MT_INT, 0, NULL },
{ '2', 'w', 15, 52, 6, OFFSET(ma_Mkills), MT_INT, 0, NULL },
{ '2', 'x', 16, 52, 6, OFFSET(ma_Mdeaths), MT_INT, 0, NULL },
{ '3', 'a', 11, 69, 6, OFFSET(ma_Str), MT_INT, 0, NULL },
{ '3', 'b', 12, 69, 6, OFFSET(ma_Int), MT_INT, 0, NULL },
{ '3', 'c', 13, 69, 6, OFFSET(ma_Wis), MT_INT, 0, NULL },
{ '3', 'd', 14, 69, 6, OFFSET(ma_Dex), MT_INT, 0, NULL },
{ '3', 'e', 15, 69, 6, OFFSET(ma_Con), MT_INT, 0, NULL },
{ '3', 'f', 16, 69, 6, OFFSET(ma_Cha), MT_INT, 0, NULL },
{ '3', 'g', 17, 69, 6, OFFSET(ma_Luck), MT_INT, 0, NULL },
{ 0, 0, 0, 0, 0, 0, MT_END }
}
;
CMenuData PlrPage_B [] = {
{ '1', 'a', 5, 12, 1, OFFSET(mb_Silent), MT_BOOL, 0, NULL },
{ '1', 'b', 6, 12, 1, OFFSET(mb_Denied), MT_BOOL, 0, NULL },
{ '1', 'c', 7, 12, 1, OFFSET(mb_Nice), MT_BOOL, 0, NULL },
{ '1', 'd', 8, 12, 1, OFFSET(mb_Frozen), MT_BOOL, 0, NULL },
{ '1', 'e', 9, 12, 1, OFFSET(mb_Logged), MT_BOOL, 0, NULL },
{ '1', 'f', 2, 29, 1, OFFSET(mb_Attacker), MT_BOOL, 0, NULL },
{ '1', 'g', 3, 29, 1, OFFSET(mb_Killer), MT_BOOL, 0, NULL },
{ '1', 'h', 4, 29, 1, OFFSET(mb_Thief), MT_BOOL, 0, NULL },
{ '1', 'i', 5, 29, 1, OFFSET(mb_NoEmote), MT_BOOL, 0, NULL },
{ '1', 'j', 6, 29, 1, OFFSET(mb_AutoSac), MT_BOOL, 0, NULL },
{ '1', 'k', 7, 29, 1, OFFSET(mb_AutoLoot), MT_BOOL, 0, NULL },
{ '1', 'l', 8, 29, 1, OFFSET(mb_AutoExit), MT_BOOL, 0, NULL },
{ '1', 'm', 9, 29, 1, OFFSET(mb_Poly), MT_BOOL, 0, NULL },
{ '1', 'n', 2, 47, 1, OFFSET(mb_NoTell), MT_BOOL, 0, NULL },
{ '1', 'o', 3, 47, 1, OFFSET(mb_WizInv), MT_BOOL, 0, NULL },
{ '1', 'p', 4, 47, 1, OFFSET(mb_Secret), MT_BOOL, 0, NULL },
{ '1', 'q', 5, 47, 1, OFFSET(mb_HolyLight), MT_BOOL, 0, NULL },
{ '1', 'r', 6, 47, 1, OFFSET(mb_Combined), MT_BOOL, 0, NULL },
{ '1', 's', 7, 47, 1, OFFSET(mb_HasPrompt), MT_BOOL, 0, NULL },
{ '1', 't', 8, 47, 1, OFFSET(mb_HasPet), MT_BOOL, 0, NULL },
{ '1', 'u', 9, 47, 1, OFFSET(mb_NoAssist), MT_BOOL, 0, NULL },
{ '1', 'v', 2, 64, 1, OFFSET(mb_Blank), MT_BOOL, 0, NULL },
{ '1', 'w', 3, 64, 1, OFFSET(mb_Telenet), MT_BOOL, 0, NULL },
{ '1', 'x', 4, 64, 1, OFFSET(mb_Rip), MT_BOOL, 0, NULL },
{ '1', 'y', 5, 64, 1, OFFSET(mb_Ansi), MT_BOOL, 0, NULL },
{ '1', 'z', 6, 64, 1, OFFSET(mb_Brief), MT_BOOL, 0, NULL },
{ '1', 'A', 7, 64, 1, OFFSET(mb_Vnums), MT_BOOL, 0, NULL },
{ '1', 'B', 8, 64, 1, OFFSET(mb_Wimpy), MT_BOOL, 0, NULL },
{ '1', 'C', 9, 64, 5, OFFSET(mb_Wimp), MT_INT, 0, NULL },
{ '2', 'a', 13, 12, 1, OFFSET(mb_Sanct), MT_BOOL, 0, NULL },
{ '2', 'b', 14, 12, 1, OFFSET(mb_Flaming), MT_BOOL, 0, NULL },
{ '2', 'c', 15, 12, 1, OFFSET(mb_Sleeping), MT_BOOL, 0, NULL },
{ '2', 'd', 16, 12, 1, OFFSET(mb_Flying), MT_BOOL, 0, NULL },
{ '2', 'e', 17, 12, 1, OFFSET(mb_Scrying), MT_BOOL, 0, NULL },
{ '2', 'f', 18, 12, 1, OFFSET(mb_Invis), MT_BOOL, 0, NULL },
{ '2', 'g', 11, 29, 1, OFFSET(mb_Blinded), MT_BOOL, 0, NULL },
{ '2', 'h', 12, 29, 1, OFFSET(mb_DetMagic), MT_BOOL, 0, NULL },
{ '2', 'i', 13, 29, 1, OFFSET(mb_FaerieFire), MT_BOOL, 0, NULL },
{ '2', 'j', 14, 29, 1, OFFSET(mb_Poison), MT_BOOL, 0, NULL },
{ '2', 'k', 15, 29, 1, OFFSET(mb_Hidden), MT_BOOL, 0, NULL },
{ '2', 'l', 16, 29, 1, OFFSET(mb_Pass), MT_BOOL, 0, NULL },
{ '2', 'm', 17, 29, 1, OFFSET(mb_FireShield), MT_BOOL, 0, NULL },
{ '2', 'n', 18, 29, 1, OFFSET(mb_Beserk), MT_BOOL, 0, NULL },
{ '2', 'o', 11, 47, 1, OFFSET(mb_DetInvis), MT_BOOL, 0, NULL },
{ '2', 'p', 12, 47, 1, OFFSET(mb_DetHidden), MT_BOOL, 0, NULL },
{ '2', 'q', 13, 47, 1, OFFSET(mb_Infra), MT_BOOL, 0, NULL },
{ '2', 'r', 14, 47, 1, OFFSET(mb_Protect), MT_BOOL, 0, NULL },
{ '2', 'w', 15, 47, 1, OFFSET(mb_Sneak), MT_BOOL, 0, NULL },
{ '2', 't', 16, 47, 1, OFFSET(mb_TrueSight), MT_BOOL, 0, NULL },
{ '2', 'u', 17, 47, 1, OFFSET(mb_ShockShield), MT_BOOL, 0, NULL },
{ '2', 'v', 18, 47, 1, OFFSET(mb_Aqua), MT_BOOL, 0, NULL },
{ '2', 'w', 11, 64, 1, OFFSET(mb_DetEvil), MT_BOOL, 0, NULL },
{ '2', 'x', 12, 64, 1, OFFSET(mb_Curse), MT_BOOL, 0, NULL },
{ '2', 'y', 13, 64, 1, OFFSET(mb_Paralysed), MT_BOOL, 0, NULL },
{ '2', 'z', 14, 64, 1, OFFSET(mb_Charmed), MT_BOOL, 0, NULL },
{ '2', 'A', 15, 64, 1, OFFSET(mb_DetTrap), MT_BOOL, 0, NULL },
{ '2', 'B', 16, 64, 1, OFFSET(mb_Floating), MT_BOOL, 0, NULL },
{ '2', 'C', 17, 64, 1, OFFSET(mb_IceShield), MT_BOOL, 0, NULL },
{ 0, 0, 0, 0, 0, 0, MT_END }
};
#ifdef XXXX
CMenuData PlrPage_C [] = {
{ '1', 'a', 5, 10, 1, OFFSET(mc_Aid), MT_BOOL, 0, NULL },
{ '1', 'b', 6, 10, 1, OFFSET(mc_Dig), MT_BOOL, 0, NULL },
{ '1', 'c', 7, 10, 1, OFFSET(mc_Grip), MT_BOOL, 0, NULL },
{ '1', 'd', 8, 10, 1, OFFSET(mc_Hide), MT_BOOL, 0, NULL },
{ '1', 'e', 9, 10, 1, OFFSET(mc_Bite), MT_BOOL, 0, NULL },
{ '1', 'f', 10, 10, 1, OFFSET(mc_Brew), MT_BOOL, 0, NULL },
{ '1', 'g', 11, 10, 1, OFFSET(mc_Peek), MT_BOOL, 0, NULL },
{ '1', 'h', 12, 10, 1, OFFSET(mc_Scan), MT_BOOL, 0, NULL },
{ '1', 'i', 13, 10, 1, OFFSET(mc_Stun), MT_BOOL, 0, NULL },
{ '1', 'j', 14, 10, 1, OFFSET(mc_Tail), MT_BOOL, 0, NULL },
{ '1', 'k', 2, 27, 1, OFFSET(mc_Circle), MT_BOOL, 0, NULL },
{ '1', 'l', 3, 27, 1, OFFSET(mc_Claw), MT_BOOL, 0, NULL },
{ '1', 'm', 4, 27, 1, OFFSET(mc_Climb), MT_BOOL, 0, NULL },
{ '1', 'n', 5, 27, 1, OFFSET(mc_Detrap), MT_BOOL, 0, NULL },
{ '1', 'o', 6, 27, 1, OFFSET(mc_Berserk), MT_BOOL, 0, NULL },
{ '1', 'p', 7, 27, 1, OFFSET(mc_Disarm), MT_BOOL, 0, NULL },
{ '1', 'q', 8, 27, 1, OFFSET(mc_Discern), MT_BOOL, 0, NULL },
{ '1', 'r', 9, 27, 1, OFFSET(mc_Dodge), MT_BOOL, 0, NULL },
{ '1', 's', 10, 27, 1, OFFSET(mc_Kick), MT_BOOL, 0, NULL },
{ '1', 't', 11, 27, 1, OFFSET(mc_Limber), MT_BOOL, 0, NULL },
{ '1', 'u', 12, 27, 1, OFFSET(mc_Mount), MT_BOOL, 0, NULL },
{ '1', 'v', 13, 27, 1, OFFSET(mc_Parry), MT_BOOL, 0, NULL },
{ '1', 'w', 14, 27, 1, OFFSET(mc_Punch), MT_BOOL, 0, NULL },
{ '1', 'x', 2, 46, 1, OFFSET(mc_DoorBash), MT_BOOL, 0, NULL },
{ '1', 'y', 3, 46, 1, OFFSET(mc_DualWield), MT_BOOL, 0, NULL },
{ '1', 'z', 4, 46, 1, OFFSET(mc_PickLock), MT_BOOL, 0, NULL },
{ '1', 'A', 5, 46, 1, OFFSET(mc_Feed), MT_BOOL, 0, NULL },
{ '1', 'B', 6, 46, 1, OFFSET(mc_Gouge), MT_BOOL, 0, NULL },
{ '1', 'C', 7, 46, 1, OFFSET(mc_Bash), MT_BOOL, 0, NULL },
{ '1', 'D', 8, 46, 1, OFFSET(mc_Hitall), MT_BOOL, 0, NULL },
{ '1', 'E', 9, 46, 1, OFFSET(mc_BackStab), MT_BOOL, 0, NULL },
{ '1', 'F', 10, 46, 1, OFFSET(mc_Dominate), MT_BOOL, 0, NULL },
{ '1', 'G', 11, 46, 1, OFFSET(mc_Meditate), MT_BOOL, 0, NULL },
{ '1', 'H', 12, 46, 1, OFFSET(mc_Rescue), MT_BOOL, 0, NULL },
{ '1', 'I', 13, 46, 1, OFFSET(mc_Track), MT_BOOL, 0, NULL },
{ '1', 'J', 14, 46, 1, OFFSET(mc_Trance), MT_BOOL, 0, NULL },
{ '1', 'K', 2, 69, 1, OFFSET(mc_2Att), MT_BOOL, 0, NULL },
{ '1', 'L', 3, 69, 1, OFFSET(mc_3Att), MT_BOOL, 0, NULL },
{ '1', 'M', 4, 69, 1, OFFSET(mc_4Att), MT_BOOL, 0, NULL },
{ '1', 'N', 5, 69, 1, OFFSET(mc_5Att), MT_BOOL, 0, NULL },
{ '1', 'O', 6, 69, 1, OFFSET(mc_PoisonWeapon), MT_BOOL, 0, NULL },
{ '1', 'P', 7, 69, 1, OFFSET(mc_EnhDamage), MT_BOOL, 0, NULL },
{ '1', 'Q', 8, 69, 1, OFFSET(mc_Visology), MT_BOOL, 0, NULL },
{ '1', 'R', 9, 69, 1, OFFSET(mc_Scribe), MT_BOOL, 0, NULL },
{ '1', 'S', 10, 69, 1, OFFSET(mc_Search), MT_BOOL, 0, NULL },
{ '1', 'T', 11, 69, 1, OFFSET(mc_Slice), MT_BOOL, 0, NULL },
{ '1', 'U', 12, 69, 1, OFFSET(mc_Sneak), MT_BOOL, 0, NULL },
{ '1', 'V', 13, 69, 1, OFFSET(mc_Steal), MT_BOOL, 0, NULL },
{ '1', 'W', 14, 69, 1, OFFSET(mc_Sting), MT_BOOL, 0, NULL },
{ 0, 0, 0, 0, 0, 0, MT_END }
};
CMenuData PlrPage_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 PlrPage_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', 9, 29, 1, OFFSET(me_PDead), MT_BOOL, 0, NULL },
{ '2', 'b', 10, 29, 1, OFFSET(me_PStunned), MT_BOOL, 0, NULL },
{ '2', 'c', 11, 29, 1, OFFSET(me_PSitting), MT_BOOL, 0, NULL },
{ '2', 'd', 12, 29, 1, OFFSET(me_PMounted), MT_BOOL, 0, NULL },
{ '2', 'e', 9, 46, 1, OFFSET(me_PMortal), MT_BOOL, 0, NULL },
{ '2', 'f', 10, 46, 1, OFFSET(me_PSleeping), MT_BOOL, 0, NULL },
{ '2', 'g', 11, 46, 1, OFFSET(me_PFighting), MT_BOOL, 0, NULL },
{ '2', 'h', 9, 69, 1, OFFSET(me_PIncap), MT_BOOL, 0, NULL },
{ '2', 'i', 10, 69, 1, OFFSET(me_PResting), MT_BOOL, 0, NULL },
{ '2', 'j', 11, 69, 1, OFFSET(me_PStanding), MT_BOOL, 0, NULL },
{ '3', 'a', 17, 9, 3, OFFSET(me_RFire), MT_RIS, 0, NULL },
{ '3', 'b', 14, 21, 3, OFFSET(me_RCold), MT_RIS, 0, NULL },
{ '3', 'c', 15, 21, 3, OFFSET(me_RElect), MT_RIS, 0, NULL },
{ '3', 'd', 16, 21, 3, OFFSET(me_REnergy), MT_RIS, 0, NULL },
{ '3', 'e', 17, 21, 3, OFFSET(me_RPoison), MT_RIS, 0, NULL },
{ '3', 'f', 14, 34, 3, OFFSET(me_RBlunt), MT_RIS, 0, NULL },
{ '3', 'g', 15, 34, 3, OFFSET(me_RPierce), MT_RIS, 0, NULL },
{ '3', 'h', 16, 34, 3, OFFSET(me_RSlash), MT_RIS, 0, NULL },
{ '3', 'i', 17, 34, 3, OFFSET(me_RAcid), MT_RIS, 0, NULL },
{ '3', 'j', 14, 47, 3, OFFSET(me_RNonMagic), MT_RIS, 0, NULL },
{ '3', 'k', 15, 47, 3, OFFSET(me_RDrain), MT_RIS, 0, NULL },
{ '3', 'l', 16, 47, 3, OFFSET(me_RSleep), MT_RIS, 0, NULL },
{ '3', 'm', 17, 47, 3, OFFSET(me_RCharm), MT_RIS, 0, NULL },
{ '3', 'n', 14, 60, 3, OFFSET(me_RHold), MT_RIS, 0, NULL },
{ '3', 'o', 15, 60, 3, OFFSET(me_RMagic), MT_RIS, 0, NULL },
{ '3', 'p', 16, 60, 3, OFFSET(me_RPlus1), MT_RIS, 0, NULL },
{ '3', 'q', 17, 60, 3, OFFSET(me_RPlus2), MT_RIS, 0, NULL },
{ '3', 'r', 14, 73, 3, OFFSET(me_RPlus3), MT_RIS, 0, NULL },
{ '3', 's', 15, 73, 3, OFFSET(me_RPlus4), MT_RIS, 0, NULL },
{ '3', 't', 16, 73, 3, OFFSET(me_RPlus5), MT_RIS, 0, NULL },
{ '3', 'u', 17, 73, 3, OFFSET(me_RPlus6), MT_RIS, 0, NULL },
{ 0, 0, 0, 0, 0, 0, MT_END }
};
CMenuData PlrPage_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 }
};
#endif
CMenuData *PlrMenuData [] = { PlrPage_A, PlrPage_B, /* PlrPage_C,
PlrPage_D, PlrPage_E, PlrPage_F, */ NULL };