diff arogue7/rogue.c @ 125:adfa37e67084

Import Advanced Rogue 7.7 from the Roguelike Restoration Project (r1490)
author John "Elwin" Edwards
date Fri, 08 May 2015 15:24:40 -0400
parents
children c697782a9b37
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/arogue7/rogue.c	Fri May 08 15:24:40 2015 -0400
@@ -0,0 +1,1689 @@
+/*
+ * rogue.c  -  Global game variables
+ *
+ * Advanced Rogue
+ * Copyright (C) 1984, 1985, 1986 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"
+#ifdef PC7300
+#include <sys/window.h>
+#endif
+
+#ifdef BSD
+char
+tolower(c)
+{
+    if (isupper(c)) return(_tolower(c));
+    else return(c);
+}
+char
+toupper(c)
+{
+    if (islower(c)) return(_toupper(c));
+    else return(c);
+}
+#endif
+
+/*
+ * 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 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 mpos = 0;
+int level = 0;
+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 = STOMACHSIZE-MORETIME-1;
+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 chant_time = 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 */
+int cols = 0;				/* number of columns in terminal */
+int lines = 0;				/* number of lines on the terminal */
+char nfloors = -1;			/* Number of floors in this dungeon */
+char curpurch[LINELEN];			/* 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 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 monsters */
+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 menu_overlay = TRUE;
+bool door_stop = FALSE;
+bool jump = FALSE; 
+bool slow_invent = FALSE; 
+bool firstmove = FALSE; 
+bool askme = FALSE;
+bool in_shell = FALSE; 
+bool daytime = TRUE;
+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]";
+#ifdef PC7300
+struct uwdata wdata, oldwin;	/* Static window information */
+char oldtext[WTXTNUM][WTXTLEN]; /* Saved window text */
+#endif
+
+/* 
+ * This lays out all the class specific details
+ *
+ * Here are the beginning experience levels for all players.
+ * All further experience levels are computed by muliplying by 2
+ * up through MAXDOUBLE. Then exp pts are calculated by adding
+ * in the cap figure. You must change MAXDOUBLE if you change the 
+ * cap figure. 
+ */
+struct character_types char_class[NUM_CHARTYPES] = {
+/* name		exppts	cap	hitpts	Base	Maxlvl,	Factor,	Offset,	Range */
+{ "fighter",	80,	1310720, 12,	10,	30,	2,	1,	2 },
+{ "ranger",	140,	2293760,  8,	10,	20,	2,	1,	2 },
+{ "paladin",	120,	1966080, 10,	10,	23,	2,	1,	2 },
+{ "magic user",	130,	2129920,  6,	9,	18,	2,	1,	5 },
+{ "cleric",	110,	1802240,  8,	10,	19,	2,	1,	3 },
+{ "thief",	75,	1228800,  6,	10,	25,	2,	1,	4 },
+{ "assassin",	85,	1392640,  6,	10,	25,	2,	1,	4 },
+{ "druid",	100,	1638400,  8,	10,	19,	2,	1,	3 },
+{ "monk",	95,	1556480,  6,	10,	25,	2,	1,	3 },
+{ "monster",	0,	0,	  8,	7,	30,	1,	0,	2 },
+};
+
+
+/*
+ * This array lists the names of the character's abilities.  It must be ordered
+ * according to the ability definitions in rogue.h.
+ */
+
+char *abilities[NUMABILITIES] = {
+  "Intelligence", "Strength", "Wisdom", "Dexterity", "Constitution", "Charisma"
+};
+
+/*
+ * 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"},
+    { D_STARVATION,	"starvation"},
+    { D_FOOD_CHOKE,	"choking on food"},
+    { D_SCROLL,		"reading a scroll"},
+};
+
+
+/*
+ * weapons and their attributes
+ */
+struct init_weps weaps[MAXWEAPONS] = {
+    { "mace",		"2d4",  "1d3", NONE,	ISMETAL, 3, 100, 8 },
+    { "long sword",	"1d12", "1d2", NONE,	ISMETAL, 4, 60, 18 },
+    { "short bow",	"1d1",  "1d1", NONE,	0, 6, 40, 15 },
+    { "arrow",		"1d1",  "1d6", BOW,	ISMANY|ISMISL, 1, 5, 1 },
+    { "dagger",		"1d6",  "1d4", NONE,	ISMETAL|ISMISL|ISMANY,1,7,2},
+    { "rock",		"1d2",  "1d4", SLING,	ISMANY|ISMISL, 1, 5, 1 },
+    { "two-handed sword","3d6",  "1d2", NONE,	ISMETAL, 5, 250, 40 },
+    { "sling",		"0d0",  "0d0", NONE,  	0, 1, 5, 1 },
+    { "dart",		"1d1",  "1d3", NONE,  	ISMANY|ISMISL, 1, 5, 1 },
+    { "crossbow",	"1d1",  "1d1", NONE,  	0, 6, 100, 15 },
+    { "crossbow bolt",	"1d2", "1d12", CROSSBOW,ISMANY|ISMISL, 1, 7, 1 },
+    { "spear",		"1d8",  "2d6", NONE,	ISMANY|ISMETAL|ISMISL,2,20,8},
+    { "trident",	"3d4",  "1d4", NONE,	ISMETAL, 4, 50, 20 },
+    { "spetum",		"2d6",  "1d3", NONE,	ISMETAL, 4, 50, 20 },
+    { "bardiche",	"3d4",  "1d2", NONE,	ISMETAL, 4, 125, 20 },
+    { "pike",		"1d12", "1d8", NONE,	ISMETAL, 4, 80, 18 },
+    { "bastard sword",	"2d8",  "1d2", NONE,	ISMETAL, 5, 100, 30 },
+    { "halberd",	"2d6",  "1d3", NONE,	ISMETAL, 4, 175, 10 },
+    { "battle axe", 	"1d8",	"1d3", NONE,	ISMETAL, 3, 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",	 50, 125, 0, 0 },
+    { "magic mapping",		 50, 150, 0, 0 },
+    { "light",			 70, 100, 21, 15 },
+    { "hold monster",		 30, 200, 33, 20 },
+    { "sleep",			 20, 150, 20, 0 },
+    { "enchantment",		170, 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, 700, 0, 0 },
+    { "protection",		 30, 190, 20, 0 },
+    { "trap finding",		 10, 180, 0, 0 },
+    { "runes",			 10,  50, 0, 0 },
+    { "charm monster",		 20, 275, 0, 15 },
+};
+
+struct magic_item p_magic[MAXPOTIONS] = {
+    { "clear thought",		 50, 180, 27, 10 },
+    { "gain ability",		160, 210, 15, 15 },
+    { "see invisible",		 50, 150, 25, 15 },
+    { "healing",		160, 130, 27, 27 },
+    { "monster detection",	 60, 120, 0, 0 },
+    { "magic detection",	 60, 105, 0, 0 },
+    { "raise level",		 10, 450, 11, 10 },
+    { "haste self",		 90, 180, 30, 5 },
+    { "restore abilities",	140, 140, 0, 10 },
+    { "phasing",		 50, 210, 21, 20 },
+    { "invisibility",		 50, 230, 0, 15 },
+    { "flying",			 40, 130, 0, 20 },
+    { "food detection",		 10, 150, 0, 0 },
+    { "skill",			 10, 200, 20, 10 },
+    { "fire resistance",	 10, 250, 0, 10 },
+    { "cold resistance",	 10, 250, 0, 10 },
+    { "lightning protection",	 10, 250, 0, 10 },
+    { "poison",			 30, 205, 0, 0 },
+};
+
+struct magic_item r_magic[MAXRINGS] = {
+    { "protection",		 50, 200, 33, 25 },
+    { "add strength",		 60, 200, 33, 25 },
+    { "sustain ability",	 50, 500, 0, 0 },
+    { "searching",		 50, 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",		 30, 300, 0, 0 },
+    { "add intelligence",	 60, 240, 33, 25 },
+    { "increase wisdom",	 60, 220, 33, 25 },
+    { "sustain health",		 80, 500, 0,  0 },
+    { "carrying",		 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},
+    { "free action",		 10, 370, 0, 0},
+    { "teleport control",	 10, 700, 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",			 80, 220, 25, 20 },
+    { "drain life",		 80, 210, 20, 0 },
+    { "charging",		 70, 400, 0,  0 },
+    { "teleport",		 90, 140, 25, 20 },
+    { "cancellation",		 40, 130, 0,  0 },
+    { "confusion",	   	 35, 100, 15,  0},
+    { "disintegration",	  	 10, 300, 33, 0},
+    { "petrification",		 30, 240, 0,  0},
+    { "paralyzation",		 30, 180, 15,  0},
+    { "degeneration",		 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},
+    { "Eye of Vecna",		   0, 50000,  0, 0},
+    { "Axe of Aklad",		   0, 50000,  0, 0},
+    { "Quill of Nagrom",	   0, 50000,  0, 0},
+    { "Amulet of Stonebones",	   0, 50000,  0, 0},
+    { "Ring of Surtur",		   0, 50000,  0, 0},
+};
+/*
+ * food and fruits that you get
+ */
+struct magic_item foods[MAXFOODS] = {
+    { "food ration",	800, 50, 750,  0},
+    { "apple",		 10, 20, 300,  0},
+    { "banana",		 10, 20, 300,  0},
+    { "blueberry",	 10, 20, 300,  0},
+    { "candleberry",	 10, 20, 300,  0},
+    { "caprifig",	 10, 20, 300,  0},
+    { "dewberry",	 10, 20, 300,  0},
+    { "elderberry",	 10, 20, 300,  0},
+    { "gooseberry",	 10, 20, 300,  0},
+    { "guanabana",	 10, 20, 300,  0},
+    { "hagberry",	 10, 20, 300,  0},
+    { "jaboticaba",	 10, 20, 300,  0},
+    { "peach",		 10, 20, 300,  0},
+    { "pitanga",	 10, 20, 300,  0},
+    { "prickly pear",	 10, 20, 300,  0},
+    { "rambutan",	 10, 20, 300,  0},
+    { "sapodilla",	 10, 20, 300,  0},
+    { "soursop",	 10, 20, 300,  0},
+    { "strawberry",	 10, 20, 300,  0},
+    { "sweetsop",	 10, 20, 300,  0},
+    { "whortleberry",	 10, 20, 300,  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	  },
+	{ WS_MISSILE,		15,	TYP_STICK,	0	  },
+	{ S_TELEP,		20,	TYP_SCROLL,	0	  },
+	{ S_SLEEP,		20,	TYP_SCROLL,	0	  },
+	{ P_FLY,		20,	TYP_POTION,	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	  },
+	{ WS_CHARGE,		55,	TYP_STICK,	ISBLESSED },
+	{ 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_LIGHT,		10,	TYP_SCROLL,	ISBLESSED },
+	{ S_REMOVE,		15,	TYP_SCROLL,	0	  },
+	{ P_HEALING,		20,	TYP_POTION,	0	  },
+	{ P_FFIND,		24,	TYP_POTION,	0	  },
+	{ S_FINDTRAPS,		26,	TYP_SCROLL,	0	  },
+	{ S_CURING,		27,	TYP_SCROLL,	0	  },
+	{ WS_PARALYZE,		30,	TYP_STICK,	ISBLESSED },
+	{ S_MAP,		31,	TYP_SCROLL,	0	  },
+	{ P_CLEAR,		32,	TYP_POTION,	0	  },
+	{ WS_FEAR,		33,	TYP_STICK,	ISBLESSED },
+	{ P_SEEINVIS,		35,	TYP_POTION,	0	  },
+	{ P_RESTORE,		40,	TYP_POTION,	0	  },
+	{ P_PHASE,		43,	TYP_POTION,	0	  },
+	{ S_TELEP,		45,	TYP_SCROLL,	0	  },
+	{ WS_CURING,		50,	TYP_STICK,	ISBLESSED },
+	{ WS_DRAIN,		50,	TYP_STICK,	0	  },
+};
+
+/*
+ * these are the spells that a druid can chant
+ */
+struct spells druid_spells[MAXCHANTS] = {
+	{ P_TFIND,		3,	TYP_POTION,	0	  },
+	{ P_MFIND,		3,	TYP_POTION,	0	  },
+	{ S_LIGHT,		7,	TYP_SCROLL,	ISBLESSED },
+	{ S_CONFUSE,		10,	TYP_SCROLL,	0	  },
+	{ S_MAP,		10,	TYP_SCROLL,	0	  },
+	{ P_FFIND,		15,	TYP_POTION,	0	  },
+	{ P_HEALING,		20,	TYP_POTION,	0	  },
+	{ S_CURING,		25,	TYP_SCROLL,	0	  },
+	{ P_FLY,		27,	TYP_POTION,	ISBLESSED },
+	{ P_FIRE,		30,	TYP_POTION,	ISBLESSED },
+	{ P_COLD,		30,	TYP_POTION,	ISBLESSED },
+	{ P_LIGHTNING,		30,	TYP_POTION,	ISBLESSED },
+	{ S_HOLD,		35,	TYP_SCROLL,	0	  },
+	{ WS_CURING,		40,	TYP_STICK,	ISBLESSED },
+	{ P_PHASE,		45,	TYP_POTION,	0	  },
+	{ S_CHARM,		50,	TYP_SCROLL,	ISBLESSED },
+};
+
+
+/*
+ * these are the scrolls that a quill can write
+ */
+struct quill quill_scrolls[MAXQUILL] = {
+	{ S_GFIND,		4,	},
+	{ S_IDENT,		5,	},
+	{ S_LIGHT,		6,	},
+	{ S_REMOVE,		7,	},
+	{ S_MAP,		10,	},
+	{ S_SLEEP,		20,	},
+	{ S_TELEP,		30,	},
+	{ S_CONFUSE,		40,	},
+	{ S_CURING,		50,	},
+	{ S_HOLD,		70,	},
+	{ S_PROTECT,		90,	},
+	{ S_SCARE,		110,	},
+	{ S_ALLENCH,		130,	},
+};
+
+char *cnames[NUM_CHARTYPES-1][NUM_CNAMES] = {
+{	"Veteran",			"Warrior",		/* Fighter */
+	"Swordsman",			"Hero",
+	"Swashbuckler",			"Myrmidon",
+	"Champion",			"Superhero",
+	"Lord",				"Lord",
+	"Lord",				"Lord",
+	"Lord",				"Lord",
+	"Lord",				"Lord",
+	"Lord"
+},
+{	"Runner",			"Strider",		/* Ranger */
+	"Scout",			"Courser",
+	"Tracker",			"Guide",
+	"Pathfinder",			"Ranger",
+	"Ranger Knight",		"Ranger Lord",
+	"Ranger Lord",			"Ranger Lord",
+	"Ranger Lord",			"Ranger Lord",
+	"Ranger Lord",			"Ranger Lord",
+	"Ranger Lord"
+},
+{	"Gallant",			"Keeper",		/* Paladin */
+	"Protector",			"Defender",
+	"Warder",			"Guardian",
+	"Chevalier",			"Justiciar",
+	"Paladin",			"Paladin",
+	"Paladin",			"Paladin",
+	"Paladin",			"Paladin",
+	"Paladin",			"Paladin",
+	"Paladin"
+},
+{	"Prestidigitator",		"Evoker",		/* Magic User */
+	"Conjurer",			"Theurgist",		
+	"Thaumaturgist",		"Magician",
+	"Enchanter",			"Warlock",
+	"Sorcerer",			"Necromancer",
+	"Wizard I",			"Wizard II",
+	"Wizard III",			"Wizard IV",
+	"Wizard V",			"Wizard VI",
+	"High Wizard"
+},
+{	"Acolyte",			"Adept",		/* Cleric */
+	"Priest",			"Curate",
+	"Prefect",			"Canon",
+	"Lama",				"Patriarch",
+	"High Priest",			"High Priest",
+	"High Priest",			"High Priest",
+	"High Priest",			"High Priest",
+	"High Priest",			"High Priest",
+	"High Priest"
+},
+{	"Rogue",			"Footpad",		/* Thief */