view arogue5/rogue.c @ 103:00baf21eb047

srogue: fix backspace key during prompts. md_readchar() handled the key properly, but get_str(), which is called when prompting user entry, called wgetch() instead of md_readchar().
author John "Elwin" Edwards
date Tue, 03 Sep 2013 14:02:15 -0700
parents 19903deed392
children ee250e3646fd
line wrap: on
line source

/*
 * global variable declaration
 *
 * Advanced Rogue
 * Copyright (C) 1984, 1985 Michael Morgan, Ken Dalka and AT&T
 * All rights reserved.
 *
 * Based on "Rogue: Exploring the Dungeons of Doom"
 * Copyright (C) 1980, 1981 Michael Toy, Ken Arnold and Glenn Wichman
 * All rights reserved.
 *
 * See the file LICENSE.TXT for full copyright and licensing information.
 */

#include <ctype.h>
#include "curses.h"
#include "rogue.h"

/*
 * Now all the global variables
 */
struct trap traps[MAXTRAPS];
struct room rooms[MAXROOMS];		/* One for each room -- A level */
struct room *oldrp;			/* Roomin(&player.t_oldpos) */
struct thing player;			/* The rogue */
struct object *cur_armor;		/* What a well dresssed rogue wears */
struct object *cur_ring[NUM_FINGERS];	/* Which rings are being worn */
struct object  *cur_misc[NUM_MM];	/* which MM's are in use */
int cur_relic[MAXRELIC];		/* Currently used relics */
struct linked_list *lvl_obj = NULL; 
struct linked_list *mlist = NULL;
struct linked_list *tlist = NULL;	/* list of monsters fallen down traps */
struct linked_list *monst_dead = NULL;	/* monster killed by monster	*/
struct object *cur_weapon = NULL;
int char_type = -1;			/* what type of character is player */
int foodlev = 1;			/* how fast he eats food */
int ntraps;				/* Number of traps on this level */
int trader = 0;				/* no. of purchases */
int curprice = -1;			/* current price of item */
int no_move;				/* Number of turns held in place */
int seed;				/* Random number seed */
int dnum;				/* Dungeon number */
int max_level;				/* Deepest player has gone ever */
int cur_max;				/* Deepest player has gone currently */
int lost_dext;				/* amount of lost dexterity */
int mpos = 0;
int no_command = 0;
int level = 1;
int purse = 0;
int inpack = 0;
int total = 0;
int no_food = 0;			/* how long has he gone with no food */
int foods_this_level = 0;		/* foods made per level */
int count = 0;
int food_left = HUNGERTIME;
int group = 1;
int hungry_state = F_OKAY;
int infest_dam=0;
int lost_str=0;
int lastscore = -1;
int hold_count = 0;
int trap_tries = 0;
int pray_time = 0;
int spell_power = 0;
int turns = 0;				/* Number of turns player has taken */
int quest_item = 0;			/* Item player is looking for */
char nfloors = -1;			/* Number of floors in this dungeon */
char curpurch[LINELEN*2];		/* name of item ready to buy */
char PLAYER = VPLAYER;			/* what the player looks like */
char take;				/* Thing the rogue is taking */
char prbuf[LINELEN*2];			/* Buffer for sprintfs */
char outbuf[BUFSIZ];			/* Output buffer for stdout */
char runch;				/* Direction player is running */
char *s_names[MAXSCROLLS];		/* Names of the scrolls */
char *p_colors[MAXPOTIONS];		/* Colors of the potions */
char *r_stones[MAXRINGS];		/* Stone settings of the rings */
char *ws_made[MAXSTICKS];		/* What sticks are made of */
char whoami[LINELEN];			/* Name of player */
char fruit[LINELEN];			/* Favorite fruit */
char huh[LINELEN];			/* The last message printed */
char *s_guess[MAXSCROLLS];		/* Players guess at what scroll is */
char *p_guess[MAXPOTIONS];		/* Players guess at what potion is */
char *r_guess[MAXRINGS];		/* Players guess at what ring is */
char *ws_guess[MAXSTICKS];		/* Players guess at what wand is */
char *m_guess[MAXMM];			/* Players guess at what MM is */
char *ws_type[MAXSTICKS];		/* Is it a wand or a staff */
char file_name[LINELEN];		/* Save file name */
char score_file[LINELEN];		/* Score file name */
char home[LINELEN];			/* User's home directory */
WINDOW *cw;				/* Window that the player sees */
WINDOW *hw;				/* Used for the help command */
WINDOW *mw;				/* Used to store mosnters */
WINDOW *msgw;				/* Used to display messages */
bool pool_teleport = FALSE;		/* just teleported from a pool */
bool inwhgt = FALSE;			/* true if from wghtchk() */
bool after;				/* True if we want after daemons */
bool waswizard;				/* Was a wizard sometime */
bool s_know[MAXSCROLLS];		/* Does he know what a scroll does */
bool p_know[MAXPOTIONS];		/* Does he know what a potion does */
bool r_know[MAXRINGS];			/* Does he know what a ring does */
bool ws_know[MAXSTICKS];		/* Does he know what a stick does */
bool m_know[MAXMM];			/* Does he know what a MM does */
bool playing = TRUE; 
bool running = FALSE; 
bool wizard = FALSE;
bool notify = TRUE; 
bool fight_flush = FALSE; 
bool terse = FALSE; 
bool auto_pickup = TRUE; 
bool door_stop = FALSE;
bool jump = FALSE; 
bool slow_invent = FALSE; 
bool firstmove = FALSE; 
bool askme = TRUE;
bool in_shell = FALSE; 
bool daytime = TRUE;
bool use_savedir = FALSE;
coord delta;				/* Change indicated to get_dir() */
LEVTYPE levtype;			/* type of level i'm on */

char *nothing  =	"Nothing seems to happen.";
char *spacemsg =	"--Press space to continue--";
char *morestr  =	"-- More --";
char *retstr   =	"[Press return to continue]";


/*
 * NOTE: the ordering of the points in this array is critical. They MUST
 *	 be listed in the following sequence:
 *
 *		7   4   6
 *		1   0   2
 *		5   3   8
 */

coord grid[9] = {{0,0},
		 { 0,-1}, { 0, 1}, {-1, 0}, { 1, 0},
		 {-1,-1}, { 1, 1}, { 1,-1}, {-1, 1}
		};

struct death_type deaths[DEATHNUM] = {
    { D_ARROW,		"an arrow"},
    { D_DART,		"a dart"},
    { D_BOLT,		"a bolt"},
    { D_POISON,		"poison"},
    { D_POTION,		"a cursed potion"},
    { D_PETRIFY,	"petrification"},
    { D_SUFFOCATION,	"suffocation"},
    { D_INFESTATION,	"a parasite"},
    { D_DROWN,		"drowning"},
    { D_ROT,		"body rot"},
    { D_CONSTITUTION,	"poor health"},
    { D_STRENGTH,	"being too weak"},
    { D_SIGNAL,		"a bug"},
    { D_CHOKE,		"dust of choking"},
    { D_STRANGLE,	"strangulation"},
    { D_FALL,		"a fall"},
    { D_RELIC,		"an artifact's wrath"},
};


/*
 * weapons and their attributes
 */
struct init_weps weaps[MAXWEAPONS] = {
    { "mace",		"2d4",  "1d3", NONE,		ISMETAL, 100, 8 },
    { "long sword",	"1d12", "1d2", NONE,		ISMETAL, 60, 18 },
    { "short bow",	"1d1",  "1d1", NONE,		0, 40, 15 },
    { "arrow",		"1d1",  "1d6", BOW,		ISMANY|ISMISL, 5, 1 },
    { "dagger",		"1d6",  "1d4", NONE,		ISMETAL|ISMISL|ISMANY, 10, 2 },
    { "rock",		"1d2",  "1d4", SLING,		ISMANY|ISMISL, 5, 1 },
    { "two-handed sword","3d6",  "1d2", NONE,		ISMETAL, 250, 40 },
    { "sling",		"0d0",  "0d0", NONE,  		0, 5, 1 },
    { "dart",		"1d1",  "1d3", NONE,  		ISMANY|ISMISL, 5, 1 },
    { "crossbow",	"1d1",  "1d1", NONE,  		0, 100, 15 },
    { "crossbow bolt",	"1d2", "1d12", CROSSBOW,	ISMANY|ISMISL, 7, 1 },
    { "spear",		"1d6",  "1d8", NONE,		ISMETAL|ISMISL, 50, 8 },
    { "trident",	"3d4",  "1d4", NONE,		ISMETAL, 50, 20 },
    { "spetum",		"2d6",  "1d3", NONE,		ISMETAL, 50, 20 },
    { "bardiche",	"3d4",  "1d2", NONE,		ISMETAL, 125, 20 },
    { "pike",		"1d12", "1d8", NONE,		ISMETAL, 80, 18 },
    { "bastard sword",	"2d8",  "1d2", NONE,		ISMETAL, 100, 30 },
    { "halberd",	"2d6",  "1d3", NONE,		ISMETAL, 175, 10 },
    { "battle axe", 	"1d8",	"1d3", NONE,		ISMETAL, 80, 10 },
};

struct init_armor armors[MAXARMORS] = {
	{ "leather armor",		11,  8,  70, 100 },
	{ "ring mail",			22,  7,  50, 250 },
	{ "studded leather armor",	33,  7,  50, 200 },
	{ "scale mail",			45,  6,  70, 250 },
	{ "padded armor",		57,  6, 150, 150 },
	{ "chain mail",			69,  5, 100, 300 },
	{ "splint mail",		80,  4, 150, 350 },
	{ "banded mail",		90,  4, 150, 350 },
	{ "plate mail",		 	96,  3, 400, 400 },
	{ "plate armor",		100, 2, 650, 450 },
};

struct magic_item things[NUMTHINGS] = {
    { "potion",			260,   10 },	/* potion		*/
    { "scroll",			260,   30 },	/* scroll		*/
    { "food",			180,   20 },	/* food			*/
    { "weapon",			 80,	0 },	/* weapon		*/
    { "armor",			 80,	0 },	/* armor		*/
    { "ring",			 50,	5 },	/* ring			*/
    { "stick",			 60,	0 },	/* stick		*/
    { "miscellaneous magic",	 30,   50 },	/* miscellaneous magic	*/
    { "artifact",		  0,   10 },	/* artifact		*/
};

struct magic_item s_magic[MAXSCROLLS] = {
    { "monster confusion",	 60, 125, 0, 0 },
    { "magic mapping",		 50, 150, 0, 0 },
    { "light",			 80, 100, 21, 15 },
    { "hold monster",		 30, 200, 33, 20 },
    { "sleep",			 30, 150, 20, 0 },
    { "enchantment",		180, 200, 9, 9 },
    { "identify",		200, 100, 0, 25 },
    { "scare monster",		 40, 250, 27, 21 },
    { "gold detection",		 30, 110, 0, 0 },
    { "teleportation",		 60, 165, 10, 20 },
    { "create monster",		 30,  75, 0, 0 },
    { "remove curse",		 70, 120, 9, 15 },
    { "petrification",		 10, 185, 0, 0 },
    { "genocide",		 10, 300, 0, 0 },
    { "cure disease",		 80, 160, 0, 0 },
    { "acquirement",		 10, 400, 0, 0 },
    { "protection",		 30, 190, 20, 0 },
};

struct magic_item p_magic[MAXPOTIONS] = {
    { "clear thought",		 60, 180, 27, 10 },
    { "gain ability",		160, 210, 15, 15 },
    { "see invisible",		 60, 150, 25, 15 },
    { "healing",		170, 130, 27, 27 },
    { "monster detection",	 60, 120, 0, 0 },
    { "magic detection",	 60, 105, 0, 0 },
    { "raise level",		 20, 350, 11, 10 },
    { "haste self",		100, 180, 30, 5 },
    { "restore abilities",	160, 140, 0, 0 },
    { "phasing",		 50, 210, 21, 20 },
    { "invisibility",		 50, 230, 0, 15 },
    { "flying",			 50, 130, 0, 20 },
};

struct magic_item r_magic[MAXRINGS] = {
    { "protection",		 50, 200, 33, 25 },
    { "add strength",		 60, 200, 33, 25 },
    { "sustain ability",	 50, 500, 0, 0 },
    { "searching",		 60, 400, 0, 0 },
    { "extra sight",		 40, 350, 0, 0 },
    { "alertness",		 40, 380, 0, 0 },
    { "aggravate monster",	 30, 100, 100, 0 },
    { "dexterity",		 60, 220, 33, 25 },
    { "increase damage",	 60, 220, 33, 25 },
    { "regeneration",		 40, 600, 0, 0 },
    { "slow digestion",		 40, 240, 15, 15 },
    { "teleportation",		 20, 100, 100, 0 },
    { "stealth",		 40, 300, 0, 0 },
    { "add intelligence",	 60, 240, 33, 25 },
    { "increase wisdom",	 60, 220, 33, 25 },
    { "sustain health",		 80, 500, 0,  0 },
    { "burden",			 20, 100, 100, 0 },
    { "illumination",		 30, 520, 0, 0 },
    { "delusion",		 20, 100, 75, 0 },
    { "fear",			 20, 100, 100, 0},
    { "heroism",		 30, 390, 0, 0 },
    { "fire resistance",	 40, 400, 0, 0 },
    { "warmth",	 		 40, 400, 0, 0 },
    { "vampiric regeneration",	 10,1000, 0, 0},
};

struct magic_item ws_magic[MAXSTICKS] = {
    { "light",			 90, 120, 20, 20 },
    { "striking",		 60, 115, 0,  0 },
    { "lightning",		 35, 200, 0,  0 },
    { "fire",			 35, 200, 0,  0 },
    { "cold",			 35, 200, 0,  0 },
    { "polymorph",		 80, 150, 0,  0 },
    { "magic missile",		 80, 170, 0,  0 },
    { "slow monster",		 80, 220, 25, 20 },
    { "drain life",		 90, 210, 20, 0 },
    { "charging",		 80, 400, 0,  0 },
    { "teleport monster",	 90, 140, 25, 20 },
    { "cancellation",		 40, 130, 0,  0 },
    { "confuse monster",   	 35, 100, 15,  0},
    { "disintegration",	  	 10, 300, 33, 0},
    { "petrification",		 10, 300, 0,  0},
    { "paralyze monster",	 30, 180, 15,  0},
    { "degenerate monster",	 30, 250, 30, 0},
    { "curing",			 10, 250, 25, 0},
    { "wonder",			 50, 110,  0, 0},
    { "fear",			 30, 180,  0, 0},
};

/*
 * WARNING: unique miscellaneous magic items must be put at the end
 *	    of this list. They MUST be the last items. The function
 *	    create_obj() in wizard.c depends on it.
 */
struct magic_item m_magic[MAXMM] = {
    { "alchemy jug",	 	  40,   240,  0, 0},
    { "beaker of potions",	  60,   300,  0, 0},
    { "book of spells",		  60,   300,  0, 0},
    { "boots of elvenkind",	  50,   500,  0, 0},
    { "bracers of defense",	 140,   100, 15, 0},
    { "chime of opening",	  50,   250,  0, 0},
    { "chime of hunger",	  50,   100,100, 0},
    { "cloak of displacement",	  60,   500,  0, 0},
    { "cloak of protection",	  70,   200, 15, 0},
    { "drums of panic",		  40,   350,  0, 0},
    { "dust of disappearance",	  40,   300,  0, 0},
    { "dust of choking",	  30,   100,100, 0},
    { "gauntlets of dexterity",	  30,   600, 25, 0},
    { "gauntlets of ogre power",  30,   600, 25, 0},
    { "jewel of attacks",	  40,   150,100, 0},
    { "keoghtoms ointment",	  50,   200,  0, 0},
    { "robe of powerlessness",	  30,   100,100, 0},
    { "gauntlets of fumbling",	  30,   100,100, 0},
    { "necklace of adaptation",	  20,   500,  0, 0},
    { "necklace of strangulation",30,   110,100, 0},
    { "boots of dancing",	  30,	120,100, 0},
    { "book of skills",		  20,	650,  0, 0},
};


struct magic_item rel_magic[MAXRELIC] = {
    { "Daggers of Musty Doit",	   0, 50000,  0, 0},
    { "Cloak of Emori",		   0, 50000,  0, 0},
    { "Ankh of Heil",		   0, 50000,  0, 0},
    { "Staff of Ming",		   0, 50000,  0, 0},
    { "Wand of Orcus",		   0, 50000,  0, 0},
    { "Rod of Asmodeus",	   0, 50000,  0, 0},
    { "Amulet of Yendor",	   0, 50000,  0, 0},
    { "Mandolin of Brian",	   0, 50000,  0, 0},
    { "Horn of Geryon",		   0, 50000,  0, 0},
    { "Morning Star of Hruggek",   0, 50000,  0, 0},
    { "Flail of Yeenoghu",	   0, 50000,  0, 0},
};

/*
 * these are the spells that a magic user can cast
 */
struct spells magic_spells[MAXSPELLS] = {
	{ P_TFIND,		3,	TYP_POTION,	0	  },
	{ S_IDENT,		5,	TYP_SCROLL,	0	  },
	{ S_LIGHT,		7,	TYP_SCROLL,	ISBLESSED },
	{ S_REMOVE,		7,	TYP_SCROLL,	0	  },
	{ S_CONFUSE,		10,	TYP_SCROLL,	0	  },
	{ S_MAP,		10,	TYP_SCROLL,	0	  },
	{ WS_MISSILE,		15,	TYP_STICK,	0	  },
	{ P_CLEAR,		20,	TYP_POTION,	0	  },
	{ S_TELEP,		20,	TYP_SCROLL,	0	  },
	{ S_SLEEP,		20,	TYP_SCROLL,	0	  },
	{ P_SEEINVIS,		20,	TYP_POTION,	0	  },
	{ WS_COLD,		25,	TYP_STICK,	0	  },
	{ WS_ELECT,		25,	TYP_STICK,	0	  },
	{ WS_FIRE,		25,	TYP_STICK,	0	  },
	{ P_HASTE,		30,	TYP_POTION,	0	  },
	{ WS_CANCEL,		30,	TYP_STICK,	0	  },
	{ P_PHASE,		40,	TYP_POTION,	0	  },
	{ S_HOLD,		50,	TYP_SCROLL,	0	  },
	{ S_PROTECT,		60,	TYP_SCROLL,	0	  },
	{ S_ALLENCH,		70,	TYP_SCROLL,	0	  },
};

/*
 * these are the spells that a cleric can cast
 */
struct spells cleric_spells[MAXPRAYERS] = {
	{ P_MFIND,		3,	TYP_POTION,	0	  },
	{ P_TFIND,		7,	TYP_POTION,	0	  },
	{ S_IDENT,		15,	TYP_SCROLL,	0	  },
	{ S_LIGHT,		15,	TYP_SCROLL,	ISBLESSED },
	{ S_REMOVE,		20,	TYP_SCROLL,	0	  },
	{ P_HEALING,		25,	TYP_POTION,	0	  },
	{ S_CURING,		30,	TYP_SCROLL,	0	  },
	{ S_MAP,		30,	TYP_SCROLL,	0	  },
	{ P_CLEAR,		30,	TYP_POTION,	0	  },
	{ P_SEEINVIS,		35,	TYP_POTION,	0	  },
	{ P_RESTORE,		40,	TYP_POTION,	0	  },
	{ P_PHASE,		40,	TYP_POTION,	0	  },
	{ S_TELEP,		45,	TYP_SCROLL,	0	  },
	{ WS_CURING,		50,	TYP_STICK,	ISBLESSED },
	{ WS_DRAIN,		50,	TYP_STICK,	0	  },
};

char *cnames[4][11] = {
{	"Veteran",		"Warrior",	
	"Swordsman",		"Hero",
	"Swashbuckler",		"Myrmidon",	
	"Champion",		"Superhero",
	"Lord",			"Lord",		
	"Lord"
},
{	"Prestidigitator",	"Evoker",	
	"Conjurer",		"Theurgist",
	"Thaumaturgist",	"Magician",	
	"Enchanter",		"Warlock",
	"Sorcerer",		"Necromancer",
	"Wizard"
},
{	"Acolyte",		"Adept",
	"Priest",		"Curate",
	"Prefect",		"Canon",
	"Lama",			"Patriarch",
	"High Priest",		"High Priest",
	"High Priest"
},
{	"Rogue",		"Footpad",
	"Cutpurse",		"Robber",
	"Burglar",		"Filcher",
	"Sharper",		"Magsman",
	"Thief",		"Master Thief",
	"Master Thief"
}
} ;

struct h_list helpstr[] = {
    '?',	"	prints help",
    '/',	"	identify object",
    'h',	"	left",
    'j',	"	down",
    'k',	"	up",
    'l',	"	right",
    'y',	"	up & left",
    'u',	"	up & right",
    'b',	"	down & left",
    'n',	"	down & right",
    'H',	"	run left",
    'J',	"	run down",
    'K',	"	run up",
    'L',	"	run right",
    'Y',	"	run up & left",
    'U',	"	run up & right",
    'B',	"	run down & left",
    'N',	"	run down & right",
    't',	"<dir>	throw something",
    'f',	"<dir>	forward until find something",
    'z',	"<dir>	zap a wand or staff",
    '>',	"	go down a staircase",
    '<',	"	go up a staircase",
    's',	"	search for trap/secret door",
    '.',	"	rest for a while",
    'i',	"	inventory",
    'I',	"	inventory single item",
    'q',	"	quaff potion",
    'r',	"	read paper",
    'e',	"	eat food",
    'w',	"	wield a weapon",
    'W',	"	wear something",
    'T',	"	take off something",
    'd',	"	drop object",
    'P',	"	pick up object(s)",
    'c',	"	call object (generic)",
    'm',	"	mark object (specific)",
    'o',	"	examine/set options",
    'C',	"	cast a spell",
    'p',	"	pray",
    'a',	"	affect the undead",
    '^',	"	set a trap",
    'G',	"	sense gold",
    'D',	"	dip something (into a pool)",
    CTRL('T'),	"<dir>	take (steal) from (direction)",
    CTRL('U'),	"	use miscellaneous magic item",
    CTRL('L'),	"	redraw screen",
    CTRL('R'),	"	repeat last message",
    ESCAPE,	"	cancel command",
    'v',	"	print program version number",
    '!',	"	shell escape",
    'S',	"	save game",
    'Q',	"	quit",
    0, 0
} ;

struct h_list wiz_help[] = {
    CTRL('A'),	"	system activity",
    CTRL('C'),	"	move to	another	dungeon	level",
    CTRL('D'),	"	down 1 dungeon level",
    CTRL('E'),	"	food remaining",
    CTRL('F'),	"	display entire level",
    CTRL('H'),	"	jump 9 experience levels",
    CTRL('I'),	"	inventory of level",
    CTRL('J'),	"	teleport",
    CTRL('N'),	"	recharge staff",
    CTRL('P'),	"	toggle wizard status",
    CTRL('U'),	"	up 1 dungeon level",
    CTRL('X'),	"	detect monsters",
    CTRL('Z'),	"	identify",
    'M',	"	make object",
    0, 0
};


#define HPT(x) x
struct monster monsters[NUMMONST+1] = {
/* {"Name",
		CARRY,	NORMAL,	WANDER,	APPEAR,	INTEL,
		{ATTRIBUTES},
		"SUMMONED_CREATURE", NUMBER_SUMMONED,
		ADDED_EXPERIENCE/HIT_POINT,
		{str	exp,	level,	"armor", hit_points,
		"damage"}}, */
{"unknown",
		0,	FALSE,	FALSE,	'\0',	"",
		{0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
		0,
		0, 0,
		{10,	0,	0,	0,	HPT(""),
		""}},
{"bat",
		0,	TRUE,	FALSE,	'b',	"2-4",
		{ISMEAN, ISHUH, CANDISEASE, ISFLY, ISHASTE},
		0, 0,
		0,
		{10,	5,	2,	1,	HPT("1d4"),
		"1d2"}},
{"giant rat",
		0,	TRUE,	TRUE,	'R',	"2-4",
		{ISMEAN, CANDISEASE},
		0, 0,
		1,
		{10,	7,	1,	7,	HPT("1d4"),
		"1d3"}},
{"kobold",
		10,	TRUE,	TRUE,	'K',	"8",
		{ISMEAN, CANSHOOT, CARRYWEAPON},
		0, 0,
		1,
		{9,	5,	1,	7,	HPT("1d4"),
		"1d4"}},
{"gnome",
		10,	TRUE,	TRUE,	'G',	"11-12",
		{CANSHOOT, CARRYPOTION, CARRYWEAPON},
		0, 0,
		1,
		{10,	8,	1,	5,	HPT("1d6"),
		"1d6"}},
{"halfling",
		10,	TRUE,	TRUE,	'H',	"11-12",
		{CANSHOOT, CARRYPOTION, CARRYWEAPON},
		0, 0,
		1,
		{8,	9,	1,	4,	HPT("1d6"),
		"1d6"}},
{"dwarf",
		15,	TRUE,	TRUE,	'D',	"11-12",
		{CANSHOOT, CARRYPOTION, CARRYWEAPON},
		0, 0,
		1,
		{14,	10,	1,	4,	HPT("1d8"),
		"1d8"}},
{"orc",
		15,	TRUE,	TRUE,	'O',	"8",
		{ISMEAN, CANSHOOT, CARRYGOLD, CARRYWEAPON},
		0, 0,
		1,
		{12,	10,	1,	6,	HPT("1d8"),
		"1d8"}},
{"manes",
		0,	TRUE,	TRUE,	'M',	"2-4",
		{ISMEAN, MAGICHIT, ISUNDEAD, TURNABLE},
		0, 0,
		1,
		{10,	18,	1,	7,	HPT("1d8"),
		"1d2/1d2/1d4"}},
{"elf",
		50,	TRUE,	TRUE,	'E',	"13-20",
		{CANSHOOT, CARRYPOTION, CARRYSCROLL, CARRYWEAPON},
		0, 0,
		2,
		{12,	20,	1,	5,	HPT("1d8+1"),
		"1d10"}},
{"hobgoblin",
		10,	TRUE,	TRUE,	'h',	"8-10",
		{ISMEAN, CANSHOOT, CARRYWEAPON},
		0, 0,
		2,
		{14,	20,	1,	5,	HPT("1d8+1"),
		"1d8"}},
{"fire beetle", 
		0,	TRUE,	TRUE,	'B',	"0",
		{ISMEAN, HASFIRE},
		0, 0,
		2,
		{10,	20,	1,	4,	HPT("1d8+2"),
		"2d4"}},
{"giant ant",
		0,	TRUE,	TRUE,	'A',	"1",
		{ISMEAN, CANPOISON},
		0, 0,
		3,
		{10,	40,	2,	3,	HPT("2d8"),
		"1d6/1d6"}},
{"zombie",
		0,	TRUE,	TRUE,	'Z',	"0",
		{ISMEAN, ISUNDEAD, TURNABLE},
		0, 0,
		2,
		{10,	20,	2,	8,	HPT("2d8"),
		"1d8"}},
{"ear seeker",
		0,	TRUE,	TRUE,	'e',	"0",
		{ISMEAN, CANINFEST},
		0, 0,
		0,
		{10,	0,	1,	9,	HPT("1d1"),
		"0d0"}},
{"shrieker",
		0,	TRUE,	FALSE,	'S',	"0",
		{CANSHRIEK, NOMOVE, NOSTAB},
		0, 0,
		1,
		{10,	5,	3,	7,	HPT("3d8"),
		"0d0"}},
{"stirge",
		0,	TRUE,	TRUE,	's',	"1",
		{ISMEAN, CANDRAW, ISFLY},
		0, 0,
		2,
		{10,	36,	4,	8,	HPT("1d8+1"),
		"1d3"}},
{"gas spore",
		0,	TRUE,	FALSE,	'a',	"0",
		{ISMEAN, CANEXPLODE, CANINFEST, ISFLY},
		0, 0,
		5,
		{10,	90,	1,	9,	HPT("1d1"),
		"1d1"}},
{"troglodyte",
		5,	TRUE,	TRUE,	'T',	"5-7",
		{ISMEAN, CANSMELL, CANSHOOT, CARRYGOLD, CARRYWEAPON},
		0, 0,
		2,
		{10,	36,	2,	5,	HPT("2d8"),
		"1d3/1d3/2d5"}},
{"lemure",
		0,	TRUE,	FALSE,	'L',	"2-4",
		{ISMEAN, ISREGEN, MAGICHIT, ISUNDEAD, TURNABLE},
		0, 0,
		3,
		{10,	65,	3,	7,	HPT("3d8"),
		"1d3"}},
{"bugbear",
		5,	TRUE,	TRUE,	'b',	"5-8",
		{ISMEAN, CANSHOOT, CANSURPRISE, CARRYGOLD, CARRYPOTION,
		 CARRYWEAPON},
		0, 0,
		4,
		{16,	135,	3,	5,	HPT("3d8+1"),
		"2d4"}},
{"wererat",
		20,	TRUE,	TRUE,	'r',	"11-12",
		{ISMEAN, MAGICHIT, CARRYFOOD},
		0, 0,
		4,
		{10,	150,	3,	6,	HPT("3d8+1"),
		"1d8"}},
{"ghoul",
		0,	TRUE,	TRUE,	'g',	"5-7",
		{ISMEAN, CANPARALYZE, ISUNDEAD, TURNABLE},
		0, 0,
		2,
		{10,	65,	2,	6,	HPT("2d8"),
		"1d3/1d3/1d6"}},
{"leprechaun",
		100,	TRUE,	FALSE,	'l',	"15-16",
		{CARRYGOLD, STEALGOLD},
		0, 0,
		1,
		{10,	80,	6,	3,	HPT("1d4+1"),
		"0d0"}},
{"ogre",
		50,	TRUE,	TRUE,	'o',	"5-7",
		{ISMEAN, CARRYGOLD, CARRYWEAPON},
		0, 0,
		5,
		{18,	90,	4,	5,	HPT("4d8+1"),
		"1d10"}},
{"centaur",
		15,	TRUE,	TRUE,	'C',	"5-10",
		{CANSHOOT, CARRYPOTION, CARRYGOLD},
		0, 0,
		4,
		{10,	85,	4,	4,	HPT("4d8"),
		"1d6/1d6"}},
{"nymph",
		100,	TRUE,	FALSE,	'N',	"15-16",
		{STEALMAGIC, CARRYSCROLL, CARRYPOTION},
		0, 0,
		3,
		{10,	350,	4,	9,	HPT("3d8"),
		"0d0"}},
{"violet fungi", 
		0,	TRUE,	FALSE,	'F',	"0",
		{ISMEAN, CANHOLD, NOMOVE, CANROT, NOSTAB},
		0, 0,
		4,
		{10,	135,	3,	7,	HPT("3d8"),
		"5d1"}},
{"giant tick",
		0,	TRUE,	TRUE,	't',	"0",
		{ISMEAN, CANDRAW, CANDISEASE},
		0, 0,
		2,
		{10,	105,	3,	3,	HPT("3d8"),
		"1d4"}},
{"gelatinous cube", 
		90, TRUE,	TRUE,	'c',	"0",
		{ISMEAN, ISSCAVENGE, CANPARALYZE, NOSTAB, CARRYFOOD},
		0, 0,
		4,
		{10,	150,	4,	8,	HPT("4d8"),
		"2d4"}},
{"blink dog",
		0,	TRUE,	TRUE,	'B',	"8-10",
		{ISMEAN, CANBLINK},
		0, 0,
		5,
		{10,	170,	4,	5,	HPT("4d8"),
		"1d6"}},
{"very young dragon", 
		10,	TRUE,	FALSE,	'd',	"15-16",
		{ISMEAN, CANBRANDOM, ISGREED, CARRYGOLD, CARRYSTICK},
		0, 0,
		9,
		{10,	100,	9,	-1,	HPT("9d1"),
		"1d4/1d4/2d4"}},
{"rust monster", 
		0,	TRUE,	TRUE,	'R',	"1",
		{ISMEAN, CANRUST},
		0, 0,
		4,
		{10,	185,	5,	2,	HPT("3d8"),
		"0d0/0d0"}},
{"ghast",
		0,	TRUE,	TRUE,	'G',	"11-12",
		{CANPARALYZE, CANSTINK, ISMEAN, ISUNDEAD, TURNABLE},
		0, 0,
		4,
		{10,	190,	4,	4,	HPT("4d8"),
		"1d4/1d4/1d8"}},
{"blindheim",
		0,	TRUE,	FALSE,	'b',	"1",
		{CANBLIND, ISMEAN},
		0, 0,
		4,
		{8,	200,	2,	1,	HPT("4d8+2"),
		"1d8"}},
{"shadow",
		0,	TRUE,	TRUE,	'S',	"5-7",
		{ISSHADOW, ISMEAN, CANCHILL, ISUNDEAD, TURNABLE},
		0, 0,
		4,
		{10,	255,	3,	7,	HPT("3d8+3"),
		"1d4+1"}},
{"gargoyle",
		5,	TRUE,	TRUE,	'g',	"5-7",
		{ISMEAN, MAGICHIT, CARRYSTICK},
		0, 0,
		5,
		{10,	165,	4,	5,	HPT("4d8+4"),
		"1d3/1d3/1d6/1d4"}},
{"su-monster", 10,	TRUE,	TRUE,	's',	"8-10",
		{ISMEAN, CARRYSCROLL, CARRYGOLD, CARRYFOOD},
		0, 0,
		6,
		{10,	225,	5,	6,	HPT("5d8+5"),
		"4d4/2d4"}},
{"gray ooze", 
		50,	TRUE,	FALSE,	'o',	"1",
		{ISMEAN, NOMOVE, CANRUST, ISSCAVENGE, NOCOLD, NOFIRE, NOSTAB,
		 CARRYSTICK, CARRYFOOD},
		0, 0,
		5,
		{10,	200,	3,	8,	HPT("3d8+3"),
		"2d8"}},
{"owlbear",
		5,	TRUE,	TRUE,	'O',	"5-7",