[comp.sources.games] v03i053: omega - rogue like dungeon exploration, Part06/15

games-request@tekred.TEK.COM (01/20/88)

Submitted by: "Laurence R. Brothers" <brothers@paul.rutgers.edu>
Comp.sources.games: Volume 3, Issue 53
Archive-name: omega/Part06

#! /bin/sh

# This is a shell archive.  Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file".  To overwrite existing
# files, type "sh file -c".  You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g..  If this archive is complete, you
# will see the following message at the end:
#		"End of archive 6 (of 15)."
# Contents:  Makefile.orig oinitmon0to3.c ospell.c
# Wrapped by billr@tekred on Mon Jan 18 10:20:26 1988
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f Makefile.orig -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"Makefile.orig\"
else
echo shar: Extracting \"Makefile.orig\" \(760 characters\)
sed "s/^X//" >Makefile.orig <<'END_OF_Makefile.orig'
X# This makefile works on a Sun, but may not work on some other machines
X# It is pretty obviou what it does, though, just runs cc.
X# I use the -g flag for debugging info; if you don't intend to
X# hack omega you might change the -g's to -O's for optimization
X
Xobjects = o.o oaux1.o oaux2.o ochar.o ocity.o ocom.o odepths.o\
X	oeffect1.o oeffect2.o\
X	oetc.o ofile.o ogen.o oguild.o oinititem1.o oinititem2.o\
X	oinitmon0to3.o oinitmon4to7.o oinitmon8to10.o\
X	oinv.o oitem.o oitemf.o olev.o omon.o omonf.o omove.o\
X	oscr.o osite.o ospell.o otime.o outil.o
X
Xsourceflags = -g -c
X
Xobjectflags = -g
X
Xlibraries =  -lcurses -ltermlib
X
Xomega: $(objects)
X	cc -o $@ $(objectflags) $(objects) $(libraries)
X
X$(objects): odefs.h oglob.h $(@:.o=.c)
X	cc $(sourceflags) $(@:.o=.c)
END_OF_Makefile.orig
if test 760 -ne `wc -c <Makefile.orig`; then
    echo shar: \"Makefile.orig\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f oinitmon0to3.c -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"oinitmon0to3.c\"
else
echo shar: Extracting \"oinitmon0to3.c\" \(36268 characters\)
sed "s/^X//" >oinitmon0to3.c <<'END_OF_oinitmon0to3.c'
X
X/* oinitmon0to3.c */
X
X
X#include <stdio.h>
X#include <strings.h>
X#include "oglob.h"
X
X
X/* from oitem */
Xextern void make_weapon();
X
X/* from omon */
Xextern void m_pickup();
X
Xvoid initmon0to3();
X
Xvoid initmon0to3()
X{
X  int i;
X  char filestring[80];
X  FILE *fd;
X  pob tob;
X
X  for(i=0;i<NUMLEVELS;i++)
X    Mlist[i] = NULL;
X  for(i=0;i<NUMMONSTERS;i++) {
X    Monsters[i].attacked = FALSE;
X    Monsters[i].click = 0;
X    Monsters[i].hitloc = 0;
X    Monsters[i].uniqueness = 0;
X  }
X
X  /* Find out how many players have played, for npc generator */
X  strcpy(filestring,OMEGALIB);
X  strcat(filestring,"omega.lognum");
X  fd = fopen(filestring,"r");
X  fscanf(fd,"%d",&Logsize);
X  fclose(fd);
X
X
X
X
X  /* the hornet */
X  Monsters[ML0+0].id = 0; /* monster id slot == index in Monsters */
X  Monsters[ML0+0].hp = 1;
X  Monsters[ML0+0].speed = 1;
X  Monsters[ML0+0].actions = 3;
X  Monsters[ML0+0].tactics = MM_POOR+MM_BERSERK;
X  Monsters[ML0+0].hit = 1;
X  Monsters[ML0+0].ac = 10;
X  Monsters[ML0+0].dmg = 2;
X  Monsters[ML0+0].sense = 4;
X  Monsters[ML0+0].wakeup = 1;
X  Monsters[ML0+0].level = 0;
X  Monsters[ML0+0].status = HOSTILE+MOBILE+FLYING;
X  Monsters[ML0+0].immunity = 0;
X  Monsters[ML0+0].sleep = 50;
X  Monsters[ML0+0].treasure = 0;
X  Monsters[ML0+0].possessions = NULL;
X  Monsters[ML0+0].xpv = 1;
X  Monsters[ML0+0].x = -1;
X  Monsters[ML0+0].y = -1;
X  Monsters[ML0+0].transformid = -1;
X  Monsters[ML0+0].corpsevalue = 1;
X  Monsters[ML0+0].monchar = 'h';
X  strcpy(Monsters[ML0+0].monstring,"hornet");
X  strcpy(Monsters[ML0+0].corpsestr,"dead hornet");
X  Monsters[ML0+0].corpseweight = 1;
X  Monsters[ML0+0].talkf = M_TALK_STUPID;
X  Monsters[ML0+0].movef = M_MOVE_FLUTTER;
X  Monsters[ML0+0].meleef = M_MELEE_NORMAL;
X  Monsters[ML0+0].strikef = M_NO_OP;
X  Monsters[ML0+0].specialf = M_NO_OP;
X
X
X
X
X  /* the mendicant priest */
X  Monsters[ML0+1].id = ML0+1;
X  Monsters[ML0+1].hp = 30;
X  Monsters[ML0+1].speed = 5;
X  Monsters[ML0+1].hit = 0;
X  Monsters[ML0+1].actions = 2;
X  Monsters[ML0+1].tactics = MM_POOR+MM_TIMID;
X  Monsters[ML0+1].ac = 0;
X  Monsters[ML0+1].dmg = 0;
X  Monsters[ML0+1].sense = 10;
X  Monsters[ML0+1].wakeup = 10;
X  Monsters[ML0+1].level = 0;
X  Monsters[ML0+1].status = NEEDY+MOBILE;
X  Monsters[ML0+1].immunity = 0;
X  Monsters[ML0+1].xpv = 15;
X  Monsters[ML0+1].treasure = 2;
X  Monsters[ML0+1].possessions = NULL;
X  Monsters[ML0+1].sleep = 100;
X  Monsters[ML0+1].x = -1;
X  Monsters[ML0+1].y = -1;
X  Monsters[ML0+1].transformid = -1;
X  Monsters[ML0+1].corpsevalue = 0;
X  if (random_range(2)) {
X    Monsters[ML0+1].monchar = 'm';
X    strcpy(Monsters[ML0+1].monstring,"man");
X  }
X  else {
X    Monsters[ML0+1].monchar = 'w';
X    strcpy(Monsters[ML0+1].monstring,"woman");
X  }
X  strcpy(Monsters[ML0+1].corpsestr,"dead mendicant priest");
X  Monsters[ML0+1].corpseweight = 1000;
X  Monsters[ML0+1].talkf = M_TALK_MP;
X  Monsters[ML0+1].movef = M_MOVE_FOLLOW;
X  Monsters[ML0+1].meleef = M_MELEE_MP;
X  Monsters[ML0+1].strikef = M_NO_OP;
X  Monsters[ML0+1].specialf = M_SP_MP;
X
X  /* Itinerant Merchant */
X  Monsters[ML0+2].id = ML0+2;
X  Monsters[ML0+2].hp = 15;
X  Monsters[ML0+2].speed = 7;
X  Monsters[ML0+2].hit = 0;
X  Monsters[ML0+2].actions = 1;
X  Monsters[ML0+2].tactics = MM_POOR+MM_TIMID;
X  Monsters[ML0+2].ac = 0;
X  Monsters[ML0+2].dmg = 0;
X  Monsters[ML0+2].sense = 10;
X  Monsters[ML0+2].wakeup = 10;
X  Monsters[ML0+2].level = 0;
X  Monsters[ML0+2].status = 0+MOBILE;
X  Monsters[ML0+2].immunity = 0;
X  Monsters[ML0+2].xpv = 5;
X  Monsters[ML0+2].treasure = 3;
X  Monsters[ML0+2].possessions = NULL;
X  Monsters[ML0+2].sleep = 0;
X  Monsters[ML0+2].x = -1;
X  Monsters[ML0+2].y = -1;
X  Monsters[ML0+2].transformid = -1;
X  Monsters[ML0+2].corpsevalue = 0;
X  if (random_range(2)) {
X    Monsters[ML0+2].monchar = 'm';
X    strcpy(Monsters[ML0+2].monstring,"man");
X  }
X  else {
X    Monsters[ML0+2].monchar = 'w';
X    strcpy(Monsters[ML0+2].monstring,"woman");
X  }
X  strcpy(Monsters[ML0+2].corpsestr,"dead itinerant merchant");
X  Monsters[ML0+2].corpseweight = 1000;
X  Monsters[ML0+2].talkf = M_TALK_IM;
X  Monsters[ML0+2].movef = M_MOVE_FOLLOW;
X  Monsters[ML0+2].meleef = M_NO_OP;
X  Monsters[ML0+2].strikef = M_NO_OP;
X  Monsters[ML0+2].specialf = M_SP_ESCAPE;
X
X
X  /* Guardsman */
X  Monsters[ML0+3].id = ML0+3;
X  Monsters[ML0+3].hp = 150;
X  Monsters[ML0+3].speed = 3;
X  Monsters[ML0+3].hit = 20;
X  Monsters[ML0+3].actions = 6;
X  Monsters[ML0+3].tactics = MM_GOOD;
X  Monsters[ML0+3].ac = 20;
X  Monsters[ML0+3].dmg = 25;
X  Monsters[ML0+3].sense = 10;
X  Monsters[ML0+3].wakeup = 1;
X  Monsters[ML0+3].level = 0;
X  Monsters[ML0+3].status = 0+MOBILE;
X  Monsters[ML0+3].immunity = 0;
X  Monsters[ML0+3].xpv = 150;
X  Monsters[ML0+3].treasure = 0;
X  Monsters[ML0+3].possessions = NULL;
X  Monsters[ML0+3].sleep = 50;
X  Monsters[ML0+3].x = -1;
X  Monsters[ML0+3].y = -1;
X  Monsters[ML0+3].transformid = -1;
X  Monsters[ML0+3].corpsevalue = 0;
X  Monsters[ML0+3].monchar = 'G';
X  strcpy(Monsters[ML0+3].monstring,"guardsman");
X  strcpy(Monsters[ML0+3].corpsestr,"dead guardsman");
X  Monsters[ML0+3].corpseweight = 1000;
X  Monsters[ML0+3].talkf = M_TALK_GUARD;
X  Monsters[ML0+3].movef = M_MOVE_SMART;
X  Monsters[ML0+3].meleef = M_MELEE_NORMAL;
X  Monsters[ML0+3].strikef = M_NO_OP;
X  Monsters[ML0+3].specialf = M_NO_OP;
X
X
X  /* Random NPC from log */
X  Monsters[ML0+4].id = ML0+4;
X  Monsters[ML0+4].hp = 5; /* variable */
X  Monsters[ML0+4].speed = 5;
X  Monsters[ML0+4].hit = 5; /* variable */
X  Monsters[ML0+4].actions = 5;/* variable */
X  Monsters[ML0+4].tactics = MM_AVERAGE; /* variable */
X  Monsters[ML0+4].ac = 5; /* variable */
X  Monsters[ML0+4].dmg = 5; /* variable */
X  Monsters[ML0+4].sense = 5; /* variable */
X  Monsters[ML0+4].wakeup = 5; /* variable */
X  Monsters[ML0+4].level = 0;/* variable */
X  Monsters[ML0+4].status = 5; /* variable */
X  Monsters[ML0+4].immunity = 5; /* variable */
X  Monsters[ML0+4].xpv = 5; /* variable */
X  Monsters[ML0+4].treasure = 0; /* variable */
X  Monsters[ML0+4].possessions = NULL; /* variable */
X  Monsters[ML0+4].sleep = 5; /* variable */
X  Monsters[ML0+4].x = 5;
X  Monsters[ML0+4].y = 5;
X  Monsters[ML0+4].transformid = -1;
X  Monsters[ML0+4].corpsevalue = 0;
X  Monsters[ML0+4].monchar = 'm';
X  strcpy(Monsters[ML0+4].monstring,"an NPC");
X  strcpy(Monsters[ML0+4].corpsestr,"a human corpse");
X  Monsters[ML0+4].corpseweight = 1000;
X  Monsters[ML0+4].talkf = M_TALK_MAN;
X  Monsters[ML0+4].movef = M_MOVE_SMART;
X  Monsters[ML0+4].meleef = M_MELEE_NORMAL;
X  Monsters[ML0+4].strikef = M_NO_OP;
X  Monsters[ML0+4].specialf = M_NO_OP;
X
X
X  /* the grunt */
X  Monsters[ML1+0].id = ML1+0;
X  Monsters[ML1+0].hp = 25;
X  Monsters[ML1+0].speed = 8;
X  Monsters[ML1+0].hit = 8;
X  Monsters[ML1+0].actions = 2;
X  Monsters[ML1+0].tactics = MM_FORCED+MM_BERSERK;
X  Monsters[ML1+0].hitloc = CENTER;
X  Monsters[ML1+0].ac = 5;
X  Monsters[ML1+0].dmg = 15;
X  Monsters[ML1+0].sense = 3;
X  Monsters[ML1+0].wakeup = 3;
X  Monsters[ML1+0].level = 1;
X  Monsters[ML1+0].status = HOSTILE+HUNGRY+MOBILE;
X  Monsters[ML1+0].immunity = pow2(FLAME)+pow2(ELECTRICITY)+pow2(COLD);
X  Monsters[ML1+0].xpv = 10;
X  Monsters[ML1+0].treasure = 0;
X  Monsters[ML1+0].possessions = NULL;
X  Monsters[ML1+0].sleep = 100;
X  Monsters[ML1+0].x = -1;
X  Monsters[ML1+0].y = -1;
X  Monsters[ML1+0].transformid = -1;
X  Monsters[ML1+0].corpsevalue = 0;
X  Monsters[ML1+0].monchar = 'g';
X  strcpy(Monsters[ML1+0].monstring,"grunt");
X  strcpy(Monsters[ML1+0].corpsestr,"grunt's hide");
X  Monsters[ML1+0].corpseweight = 100;
X  Monsters[ML1+0].talkf = M_TALK_STUPID;
X  Monsters[ML1+0].movef = M_MOVE_NORMAL;
X  Monsters[ML1+0].meleef = M_MELEE_NORMAL;
X  Monsters[ML1+0].strikef = M_NO_OP;
X  Monsters[ML1+0].specialf = M_NO_OP;
X
X
X  /* the tse-tse fly */
X  Monsters[ML1+1].id = ML1+1;
X  Monsters[ML1+1].hp = 1;
X  Monsters[ML1+1].speed = 4;
X  Monsters[ML1+1].hit = 10;
X  Monsters[ML1+1].actions = 1;
X  Monsters[ML1+1].tactics = MM_BERSERK+MM_POOR;
X  Monsters[ML1+1].ac = 5;
X  Monsters[ML1+1].dmg = 2;
X  Monsters[ML1+1].sense = 10;
X  Monsters[ML1+1].wakeup = 10;
X  Monsters[ML1+1].level = 1;
X  Monsters[ML1+1].status = HOSTILE+MOBILE+FLYING;
X  Monsters[ML1+1].immunity = 0;
X  Monsters[ML1+1].xpv = 3;
X  Monsters[ML1+1].treasure = 0;
X  Monsters[ML1+1].possessions = NULL;
X  Monsters[ML1+1].sleep = 0;
X  Monsters[ML1+1].x = -1;
X  Monsters[ML1+1].y = -1;
X  Monsters[ML1+1].transformid = POTIONID+5;
X  Monsters[ML1+1].corpsevalue = 5;
X  Monsters[ML1+1].monchar = 't';
X  strcpy(Monsters[ML1+1].monstring,"tse-tse fly");
X  strcpy(Monsters[ML1+1].corpsestr,"dead tse-tse fly");
X  Monsters[ML1+1].corpseweight = 1;
X  Monsters[ML1+1].talkf = M_TALK_STUPID;
X  Monsters[ML1+1].movef = M_MOVE_FLUTTER;
X  Monsters[ML1+1].meleef = M_MELEE_SLEEP;
X  Monsters[ML1+1].strikef = M_NO_OP;
X  Monsters[ML1+1].specialf = M_NO_OP;
X
X
X
X  /* fnord */
X  Monsters[ML1+2].id = ML1+2;
X  Monsters[ML1+2].hp = 1;
X  Monsters[ML1+2].speed = 10;
X  Monsters[ML1+2].hit = 0;
X  Monsters[ML1+2].actions = 0;
X  Monsters[ML1+2].tactics = MM_POOR;
X  Monsters[ML1+2].ac = 0;
X  Monsters[ML1+2].dmg = 0;
X  Monsters[ML1+2].sense = 10;
X  Monsters[ML1+2].wakeup = 10;
X  Monsters[ML1+2].level = 1;
X  Monsters[ML1+2].status = COWARDLY;
X  Monsters[ML1+2].immunity = 0;
X  Monsters[ML1+2].xpv = 5;
X  Monsters[ML1+2].treasure = 1;
X  Monsters[ML1+2].possessions = NULL;
X  Monsters[ML1+2].sleep = 0;
X  Monsters[ML1+2].x = -1;
X  Monsters[ML1+2].y = -1;
X  Monsters[ML1+2].transformid = SCROLLID+21;
X  Monsters[ML1+2].corpsevalue = 50;
X  Monsters[ML1+2].monchar = 'f';
X  strcpy(Monsters[ML1+2].monstring,"fnord");
X  strcpy(Monsters[ML1+2].corpsestr,"fnord's antennae");
X  Monsters[ML1+2].corpseweight = 2;
X  Monsters[ML1+2].talkf = M_TALK_STUPID;
X  Monsters[ML1+2].movef = M_MOVE_FLUTTER;
X  Monsters[ML1+2].meleef = M_NO_OP;
X  Monsters[ML1+2].strikef = M_NO_OP;
X  Monsters[ML1+2].specialf = M_SP_SUMMON;
X
X
X  /* sewer rat */
X  Monsters[ML1+3].id = ML1+3;
X  Monsters[ML1+3].hp = 5;
X  Monsters[ML1+3].speed = 3;
X  Monsters[ML1+3].hit = 5;
X  Monsters[ML1+3].actions = 2;
X  Monsters[ML1+3].tactics = MM_BERSERK+MM_FORCED;
X  Monsters[ML1+3].hitloc = LOW;
X  Monsters[ML1+3].ac = 3;
X  Monsters[ML1+3].dmg = 5;
X  Monsters[ML1+3].sense = 5;
X  Monsters[ML1+3].wakeup = 2;
X  Monsters[ML1+3].level = 1;
X  Monsters[ML1+3].status = HOSTILE+HUNGRY+MOBILE+SWIMMING;
X  Monsters[ML1+3].immunity = 0;
X  Monsters[ML1+3].xpv = 5;
X  Monsters[ML1+3].treasure = 0;
X  Monsters[ML1+3].possessions = NULL;
X  Monsters[ML1+3].sleep = 30;
X  Monsters[ML1+3].x = -1;
X  Monsters[ML1+3].y = -1;
X  Monsters[ML1+3].transformid = -1;
X  Monsters[ML1+3].corpsevalue = 0;
X  Monsters[ML1+3].monchar = 'r';
X  strcpy(Monsters[ML1+3].monstring,"sewer rat");
X  strcpy(Monsters[ML1+3].corpsestr,"dead sewer rat");
X  Monsters[ML1+3].corpseweight = 10;
X  Monsters[ML1+3].talkf = M_TALK_STUPID;
X  Monsters[ML1+3].movef = M_MOVE_FLUTTER;
X  Monsters[ML1+3].meleef = M_MELEE_DISEASE;
X  Monsters[ML1+3].strikef = M_NO_OP;
X  Monsters[ML1+3].specialf = M_NO_OP;
X
X
X  /* aggravator fungus */
X  Monsters[ML1+4].id = ML1+4;
X  Monsters[ML1+4].hp = 12;
X  Monsters[ML1+4].speed = 10;
X  Monsters[ML1+4].hit = 0;
X  Monsters[ML1+4].actions = 0;
X  Monsters[ML1+4].tactics = MM_POOR;
X  Monsters[ML1+4].ac = 0;
X  Monsters[ML1+4].dmg = 0;
X  Monsters[ML1+4].sense = 10;
X  Monsters[ML1+4].wakeup = 10;
X  Monsters[ML1+4].level = 1;
X  Monsters[ML1+4].status = 0;
X  Monsters[ML1+4].immunity = pow2(FLAME);
X  Monsters[ML1+4].xpv = 1;
X  Monsters[ML1+4].treasure = 0;
X  Monsters[ML1+4].possessions = NULL;
X  Monsters[ML1+4].sleep = 0;
X  Monsters[ML1+4].x = -1;
X  Monsters[ML1+4].y = -1;
X  Monsters[ML1+4].transformid = -1;
X  Monsters[ML1+4].corpsevalue = 0;
X  Monsters[ML1+4].monchar = 'f';
X  strcpy(Monsters[ML1+4].monstring,"grey fungus");
X  strcpy(Monsters[ML1+4].corpsestr,"grey fungus spores");
X  Monsters[ML1+4].corpseweight = 1;
X  Monsters[ML1+4].talkf = M_TALK_STUPID;
X  Monsters[ML1+4].movef = M_NO_OP;
X  Monsters[ML1+4].meleef = M_NO_OP;
X  Monsters[ML1+4].strikef = M_NO_OP;
X  Monsters[ML1+4].specialf = M_SP_AGGRAVATE;
X
X
X  /* blipper */
X  Monsters[ML1+5].id = ML1+5;
X  Monsters[ML1+5].hp = 50;
X  Monsters[ML1+5].speed = 24;
X  Monsters[ML1+5].hit = 0;
X  Monsters[ML1+5].actions = 0;
X  Monsters[ML1+5].tactics = MM_POOR;
X  Monsters[ML1+5].ac = 5;
X  Monsters[ML1+5].dmg = 0;
X  Monsters[ML1+5].sense = 3;
X  Monsters[ML1+5].wakeup = 3;
X  Monsters[ML1+5].level = 1;
X  Monsters[ML1+5].status = MOBILE;
X  Monsters[ML1+5].immunity = 0;
X  Monsters[ML1+5].xpv = 20;
X  Monsters[ML1+5].treasure = 2;
X  Monsters[ML1+5].possessions = NULL;
X  Monsters[ML1+5].sleep = 100;
X  Monsters[ML1+5].x = -1;
X  Monsters[ML1+5].y = -1;
X  Monsters[ML1+5].transformid = SCROLLID+5;
X  Monsters[ML1+5].corpsevalue = 25;
X  Monsters[ML1+5].monchar = 'b';
X  strcpy(Monsters[ML1+5].monstring,"blipper");
X  strcpy(Monsters[ML1+5].corpsestr,"blipper organ");
X  Monsters[ML1+5].corpseweight = 20;
X  Monsters[ML1+5].talkf = M_TALK_STUPID;
X  Monsters[ML1+5].movef = M_NO_OP;
X  Monsters[ML1+5].meleef = M_NO_OP;
X  Monsters[ML1+5].strikef = M_NO_OP;
X  Monsters[ML1+5].specialf = M_MOVE_TELEPORT;
X
X
X  /* goblin */
X  Monsters[ML1+6].id = ML1+6;
X  Monsters[ML1+6].hp = 8;
X  Monsters[ML1+6].speed = 5;
X  Monsters[ML1+6].hit = 6;
X  Monsters[ML1+6].actions = 2;
X  Monsters[ML1+6].tactics = MM_AVERAGE;
X  Monsters[ML1+6].ac = 8;
X  Monsters[ML1+6].dmg = 8;
X  Monsters[ML1+6].sense = 10;
X  Monsters[ML1+6].wakeup = 2;
X  Monsters[ML1+6].level = 1;
X  Monsters[ML1+6].status = HOSTILE+GREEDY+MOBILE;
X  Monsters[ML1+6].immunity = 0;
X  Monsters[ML1+6].xpv = 10;
X  Monsters[ML1+6].treasure = 1;
X  Monsters[ML1+6].possessions = NULL;
X  Monsters[ML1+6].sleep = 0;
X  Monsters[ML1+6].x = -1;
X  Monsters[ML1+6].y = -1;
X  Monsters[ML1+6].transformid = -1;
X  Monsters[ML1+6].corpsevalue = 0;
X  Monsters[ML1+6].monchar = 'g';
X  strcpy(Monsters[ML1+6].monstring,"goblin");
X  strcpy(Monsters[ML1+6].corpsestr,"dead goblin");
X  Monsters[ML1+6].corpseweight = 500;
X  Monsters[ML1+6].talkf = M_TALK_GREEDY;
X  Monsters[ML1+6].movef = M_MOVE_SMART;
X  Monsters[ML1+6].meleef = M_MELEE_NORMAL;
X  Monsters[ML1+6].strikef = M_NO_OP;
X  Monsters[ML1+6].specialf = M_NO_OP;
X
X
X  /* phantasticon */
X  Monsters[ML1+7].id = ML1+7;
X  Monsters[ML1+7].hp = 10;
X  Monsters[ML1+7].speed = 9;
X  Monsters[ML1+7].hit = 10;
X  Monsters[ML1+7].actions = 2;
X  Monsters[ML1+7].tactics = MM_AVERAGE;
X  Monsters[ML1+7].ac = 10;
X  Monsters[ML1+7].dmg = 10;
X  Monsters[ML1+7].sense = 4;
X  Monsters[ML1+7].wakeup = 4;
X  Monsters[ML1+7].level = 1;
X  Monsters[ML1+7].status = HOSTILE+MOBILE;
X  Monsters[ML1+7].immunity = pow2(SLEEP);
X  Monsters[ML1+7].xpv = 25;
X  Monsters[ML1+7].treasure = 1;
X  Monsters[ML1+7].possessions = NULL;
X  Monsters[ML1+7].sleep = 50;
X  Monsters[ML1+7].x = -1;
X  Monsters[ML1+7].y = -1;
X  Monsters[ML1+7].transformid = SCROLLID+19;
X  Monsters[ML1+7].corpsevalue = 10;
X  Monsters[ML1+7].monchar = 'p';
X  strcpy(Monsters[ML1+7].monstring,"phantasticon");
X  strcpy(Monsters[ML1+7].corpsestr,"phantasticon's eyes");
X  Monsters[ML1+7].corpseweight = 5;
X  Monsters[ML1+7].talkf = M_TALK_SILENT;
X  Monsters[ML1+7].movef = M_MOVE_SMART;
X  Monsters[ML1+7].meleef = M_MELEE_NORMAL;
X  Monsters[ML1+7].strikef = M_NO_OP;
X  Monsters[ML1+7].specialf = M_SP_ILLUSION;
X
X
X  /* household robot */
X  Monsters[ML1+8].id = ML1+8;
X  Monsters[ML1+8].hp = 5;
X  Monsters[ML1+8].speed = 12;
X  Monsters[ML1+8].hit = 10;
X  Monsters[ML1+8].actions = 4;
X  Monsters[ML1+8].tactics = MM_POOR+MM_FORCED;
X  Monsters[ML1+8].hitloc = CENTER;
X  Monsters[ML1+8].ac = 10;
X  Monsters[ML1+8].dmg = 15;
X  Monsters[ML1+8].sense = 10;
X  Monsters[ML1+8].wakeup = 3;
X  Monsters[ML1+8].level = 1;
X  Monsters[ML1+8].status = 0+MOBILE;
X  Monsters[ML1+8].immunity = pow2(SLEEP)+pow2(POISON)+pow2(FEAR)+
X                             pow2(ELECTRICITY);
X  Monsters[ML1+8].xpv = 15;
X  Monsters[ML1+8].treasure = 0;
X  Monsters[ML1+8].possessions = NULL;
X  Monsters[ML1+8].sleep = 100;
X  Monsters[ML1+8].x = -1;
X  Monsters[ML1+8].y = -1;
X  Monsters[ML1+8].transformid = -1;
X  Monsters[ML1+8].corpsevalue = 0;
X  Monsters[ML1+8].monchar = 'R';
X  strcpy(Monsters[ML1+8].monstring,"household robot");
X  strcpy(Monsters[ML1+8].corpsestr,"household robot battery");
X  Monsters[ML1+8].corpseweight = 25;
X  Monsters[ML1+8].talkf = M_TALK_ROBOT;
X  Monsters[ML1+8].movef = M_MOVE_SMART;
X  Monsters[ML1+8].meleef = M_MELEE_NORMAL;
X  Monsters[ML1+8].strikef = M_NO_OP;
X  Monsters[ML1+8].specialf = M_NO_OP;
X
X
X  /* pencil-necked geek */
X  Monsters[ML1+9].id = ML1+9;
X  Monsters[ML1+9].hp = 1;
X  Monsters[ML1+9].speed = 8;
X  Monsters[ML1+9].hit = 5;
X  Monsters[ML1+9].actions = 1;
X  Monsters[ML1+9].tactics = MM_POOR;
X  Monsters[ML1+9].ac = 5;
X  Monsters[ML1+9].dmg = 5;
X  Monsters[ML1+9].sense = 10;
X  Monsters[ML1+9].wakeup = 10;
X  Monsters[ML1+9].level = 1;
X  Monsters[ML1+9].status = HOSTILE+MOBILE+COWARDLY;
X  Monsters[ML1+9].immunity = 0;
X  Monsters[ML1+9].xpv = 1;
X  Monsters[ML1+9].treasure = 0;
X  Monsters[ML1+9].possessions = NULL;
X  Monsters[ML1+9].sleep = 50;
X  Monsters[ML1+9].x = -1;
X  Monsters[ML1+9].y = -1;
X  Monsters[ML1+9].transformid = -1;
X  Monsters[ML1+9].corpsevalue = 0;
X  Monsters[ML1+9].monchar = 'g';
X  strcpy(Monsters[ML1+9].monstring,"pencil-necked geek");
X  strcpy(Monsters[ML1+9].corpsestr,"dead pencil-necked geek");
X  Monsters[ML1+9].corpseweight = 250;
X  Monsters[ML1+9].talkf = M_TALK_STUPID;
X  Monsters[ML1+9].movef = M_MOVE_FLUTTER;
X  Monsters[ML1+9].meleef = M_MELEE_NORMAL;
X  Monsters[ML1+9].strikef = M_NO_OP;
X  Monsters[ML1+9].specialf = M_NO_OP;
X
X  /* borogrove */
X  Monsters[ML1+10].id = ML1+10;
X  Monsters[ML1+10].hp = 6;
X  Monsters[ML1+10].speed = 4;
X  Monsters[ML1+10].hit = 8;
X  Monsters[ML1+10].actions = 1;
X  Monsters[ML1+10].tactics = MM_AVERAGE+MM_FORCED;
X  Monsters[ML1+10].hitloc = LOW;
X  Monsters[ML1+10].ac = 5;
X  Monsters[ML1+10].dmg = 6;
X  Monsters[ML1+10].sense = 4;
X  Monsters[ML1+10].wakeup = 3;
X  Monsters[ML1+10].level = 1;
X  Monsters[ML1+10].status = 0+MOBILE;
X  Monsters[ML1+10].immunity = 0;
X  Monsters[ML1+10].xpv = 6;
X  Monsters[ML1+10].treasure = 0;
X  Monsters[ML1+10].possessions = NULL;
X  Monsters[ML1+10].sleep = 50;
X  Monsters[ML1+10].x = -1;
X  Monsters[ML1+10].y = -1;
X  Monsters[ML1+10].transformid = -1;
X  Monsters[ML1+10].corpsevalue = 0;
X  Monsters[ML1+10].monchar = 'b';
X  strcpy(Monsters[ML1+10].monstring,"borogrove");
X  strcpy(Monsters[ML1+10].corpsestr,"borogrove wings");
X  Monsters[ML1+10].corpseweight = 30;
X  Monsters[ML1+10].talkf = M_TALK_MIMSY;
X  Monsters[ML1+10].movef = M_MOVE_FLUTTER;
X  Monsters[ML1+10].meleef = M_MELEE_NORMAL;
X  Monsters[ML1+10].strikef = M_NO_OP;
X  Monsters[ML1+10].specialf = M_NO_OP;
X
X
X
X  /* the ninja */
X  Monsters[ML2+0].id = ML2+0;
X  Monsters[ML2+0].hp = 20;
X  Monsters[ML2+0].speed = 3;
X  Monsters[ML2+0].hit = 12;
X  Monsters[ML2+0].actions = 4;
X  Monsters[ML2+0].tactics = MM_GOOD;
X  Monsters[ML2+0].ac = 10;
X  Monsters[ML2+0].dmg = 15;
X  Monsters[ML2+0].sense = 10;
X  Monsters[ML2+0].wakeup = 3;
X  Monsters[ML2+0].level = 2;
X  Monsters[ML2+0].status = HOSTILE+MOBILE+M_INVISIBLE;
X  Monsters[ML2+0].immunity = 0;
X  Monsters[ML2+0].xpv = 30;
X  Monsters[ML2+0].treasure = 1;
X  Monsters[ML2+0].possessions = NULL;
X  Monsters[ML2+0].sleep = 50;
X  Monsters[ML2+0].x = -1;
X  Monsters[ML2+0].y = -1;
X  Monsters[ML2+0].transformid = -1;
X  Monsters[ML2+0].corpsevalue = 0;
X  if (random_range(2)) {
X    Monsters[ML2+0].monchar = 'm';
X    strcpy(Monsters[ML2+0].monstring,"man");
X  }
X  else {
X    Monsters[ML2+0].monchar = 'w';
X    strcpy(Monsters[ML2+0].monstring,"woman");
X  }
X  strcpy(Monsters[ML2+0].corpsestr,"dead ninja");
X  Monsters[ML2+0].corpseweight = 1000;
X  Monsters[ML2+0].talkf = M_TALK_NINJA;
X  Monsters[ML2+0].movef = M_MOVE_SMART;
X  Monsters[ML2+0].meleef = M_MELEE_NORMAL;
X  Monsters[ML2+0].strikef = M_NO_OP;
X  Monsters[ML2+0].specialf = M_SP_SURPRISE;
X
X  /* the night gaunt */
X  Monsters[ML2+1].id = ML2+1;
X  Monsters[ML2+1].hp = 30;
X  Monsters[ML2+1].speed = 6;
X  Monsters[ML2+1].hit = 12;
X  Monsters[ML2+1].actions = 2;
X  Monsters[ML2+1].tactics = MM_FORCED+MM_POOR;
X  Monsters[ML2+1].hitloc = HIGH;
X  Monsters[ML2+1].ac = 10;
X  Monsters[ML2+1].dmg = 5;
X  Monsters[ML2+1].sense = 10;
X  Monsters[ML2+1].wakeup = 10;
X  Monsters[ML2+1].level = 2;
X  Monsters[ML2+1].status = HOSTILE+MOBILE+FLYING;
X  Monsters[ML2+1].immunity = 0;
X  Monsters[ML2+1].xpv = 25;
X  Monsters[ML2+1].treasure = 0;
X  Monsters[ML2+1].possessions = NULL;
X  Monsters[ML2+1].sleep = 0;
X  Monsters[ML2+1].x = -1;
X  Monsters[ML2+1].y = -1;
X  Monsters[ML2+1].transformid = -1;
X  Monsters[ML2+1].corpsevalue = 100;
X  Monsters[ML2+1].monchar = 'n';
X  strcpy(Monsters[ML2+1].monstring,"night gaunt");
X  strcpy(Monsters[ML2+1].corpsestr,"night gaunt's hide");
X  Monsters[ML2+1].corpseweight = 50;
X  Monsters[ML2+1].talkf = M_TALK_TITTER;
X  Monsters[ML2+1].movef = M_MOVE_FLUTTER;
X  Monsters[ML2+1].meleef = M_MELEE_NG;
X  Monsters[ML2+1].strikef = M_NO_OP;
X  Monsters[ML2+1].specialf = M_NO_OP;
X
X  /* thief */
X  Monsters[ML2+2].id = ML2+2;
X  Monsters[ML2+2].hp = 32;
X  Monsters[ML2+2].speed = 2;
X  Monsters[ML2+2].hit = 0;
X  Monsters[ML2+2].actions = 2;
X  Monsters[ML2+2].tactics = MM_TIMID+MM_AVERAGE;
X  Monsters[ML2+2].ac = 10;
X  Monsters[ML2+2].dmg = 0;
X  Monsters[ML2+2].sense = 10;
X  Monsters[ML2+2].wakeup = 10;
X  Monsters[ML2+2].level = 2;
X  Monsters[ML2+2].status = GREEDY + HOSTILE+MOBILE;
X  Monsters[ML2+2].immunity = 0;
X  Monsters[ML2+2].xpv = 20;
X  Monsters[ML2+2].treasure = 3;
X  Monsters[ML2+2].possessions = NULL;
X  Monsters[ML2+2].sleep = 0;
X  Monsters[ML2+2].x = -1;
X  Monsters[ML2+2].y = -1;
X  Monsters[ML2+2].transformid = -1;
X  Monsters[ML2+2].corpsevalue = 0;
X  if (random_range(2)) {
X    Monsters[ML2+2].monchar = 'm';
X    strcpy(Monsters[ML2+2].monstring,"man");
X  }
X  else {
X    Monsters[ML0+1].monchar = 'w';
X    strcpy(Monsters[ML2+2].monstring,"woman");
X  }
X  strcpy(Monsters[ML2+2].corpsestr,"dead sneak-thief");
X  Monsters[ML2+2].corpseweight = 1000;
X  Monsters[ML2+2].talkf = M_TALK_THIEF;
X  Monsters[ML2+2].movef = M_MOVE_SMART;
X  Monsters[ML2+2].meleef = M_NO_OP;
X  Monsters[ML2+2].strikef = M_NO_OP;
X  Monsters[ML2+2].specialf = M_SP_THIEF;
X
X
X
X  /* floating eye */
X  Monsters[ML2+3].id = ML2+3;
X  Monsters[ML2+3].hp = 25;
X  Monsters[ML2+3].speed = 5;
X  Monsters[ML2+3].hit = 0;
X  Monsters[ML2+3].actions = 0;
X  Monsters[ML2+3].tactics = MM_POOR;
X  Monsters[ML2+3].ac = 0;
X  Monsters[ML2+3].dmg = 0;
X  Monsters[ML2+3].sense = 10;
X  Monsters[ML2+3].wakeup = 10;
X  Monsters[ML2+3].level = 2;
X  Monsters[ML2+3].status = MOBILE+FLYING;
X  Monsters[ML2+3].immunity = pow2(SLEEP);
X  Monsters[ML2+3].xpv = 10;
X  Monsters[ML2+3].treasure = 0;
X  Monsters[ML2+3].possessions = NULL;
X  Monsters[ML2+3].sleep = 0;
X  Monsters[ML2+3].x = -1;
X  Monsters[ML2+3].y = -1;
X  Monsters[ML2+3].transformid = POTIONID+16;
X  Monsters[ML2+3].corpsevalue = 20;
X  Monsters[ML2+3].monchar = 'e';
X  strcpy(Monsters[ML2+3].monstring,"floating eye");
X  strcpy(Monsters[ML2+3].corpsestr,"dead floating eye");
X  Monsters[ML2+3].corpseweight = 1;
X  Monsters[ML2+3].talkf = M_NO_OP;
X  Monsters[ML2+3].movef = M_MOVE_RANDOM;
X  Monsters[ML2+3].meleef = M_NO_OP;
X  Monsters[ML2+3].strikef = M_NO_OP;
X  Monsters[ML2+3].specialf = M_SP_EXPLODE;
X
X
X
X  /* tove */
X  Monsters[ML2+4].id = ML2+4;
X  Monsters[ML2+4].hp = 30;
X  Monsters[ML2+4].speed = 4;
X  Monsters[ML2+4].hit = 10;
X  Monsters[ML2+4].actions = 2;
X  Monsters[ML2+4].tactics = MM_FORCED+MM_AVERAGE;
X  Monsters[ML2+4].hitloc = LOW;
X  Monsters[ML2+4].ac = 10;
X  Monsters[ML2+4].dmg = 10;
X  Monsters[ML2+4].sense = 6;
X  Monsters[ML2+4].wakeup = 3;
X  Monsters[ML2+4].level = 2;
X  Monsters[ML2+4].status = 0+MOBILE;
X  Monsters[ML2+4].immunity = 0;
X  Monsters[ML2+4].xpv = 15;
X  Monsters[ML2+4].treasure = 0;
X  Monsters[ML2+4].possessions = NULL;
X  Monsters[ML2+4].sleep = 0;
X  Monsters[ML2+4].x = -1;
X  Monsters[ML2+4].y = -1;
X  Monsters[ML2+4].transformid = -1;
X  Monsters[ML2+4].corpsevalue = 0;
X  Monsters[ML2+4].monchar = 't';
X  strcpy(Monsters[ML2+4].monstring,"tove");
X  strcpy(Monsters[ML2+4].corpsestr,"dead tove");
X  Monsters[ML2+4].corpseweight = 10;
X  Monsters[ML2+4].talkf = M_TALK_SLITHY;
X  Monsters[ML2+4].movef = M_MOVE_FLUTTER;
X  Monsters[ML2+4].meleef = M_MELEE_NORMAL;
X  Monsters[ML2+4].strikef = M_NO_OP;
X  Monsters[ML2+4].specialf = M_NO_OP;
X
X
X
X  /* transparent nasty  */
X  Monsters[ML2+5].id = ML2+5;
X  Monsters[ML2+5].hp = 32;
X  Monsters[ML2+5].speed = 8;
X  Monsters[ML2+5].hit = 15;
X  Monsters[ML2+5].actions = 2;
X  Monsters[ML2+5].tactics = MM_FORCED+MM_AVERAGE;
X  Monsters[ML2+5].hitloc = 2;
X  Monsters[ML2+5].ac = 10;
X  Monsters[ML2+5].dmg = 5;
X  Monsters[ML2+5].sense = 5;
X  Monsters[ML2+5].wakeup = 3;
X  Monsters[ML2+5].level = 2;
X  Monsters[ML2+5].status =  HOSTILE+MOBILE+M_INVISIBLE;
X  Monsters[ML2+5].immunity = 0;
X  Monsters[ML2+5].xpv = 20;
X  Monsters[ML2+5].treasure = 1;
X  Monsters[ML2+5].possessions = NULL;
X  Monsters[ML2+5].sleep = 0;
X  Monsters[ML2+5].x = -1;
X  Monsters[ML2+5].y = -1;
X  Monsters[ML2+5].transformid = POTIONID+10;
X  Monsters[ML2+5].corpsevalue = 30;
X  Monsters[ML2+5].monchar = 'n';
X  strcpy(Monsters[ML2+5].monstring,"transparent nasty");
X  strcpy(Monsters[ML2+5].corpsestr,"dead transparent nasty");
X  Monsters[ML2+5].corpseweight = 50;
X  Monsters[ML2+5].talkf = M_NO_OP;
X  Monsters[ML2+5].movef = M_MOVE_FLUTTER;
X  Monsters[ML2+5].meleef = M_MELEE_NORMAL;
X  Monsters[ML2+5].strikef = M_STRIKE_MISSILE;
X  Monsters[ML2+5].specialf = M_NO_OP;
X
X
X  /* ghost  */
X  Monsters[ML2+6].id = ML2+6;
X  Monsters[ML2+6].hp = 32;
X  Monsters[ML2+6].speed = 20;
X  Monsters[ML2+6].hit = 0;
X  Monsters[ML2+6].actions = 0;
X  Monsters[ML2+6].tactics = MM_POOR;
X  Monsters[ML2+6].ac = 10;
X  Monsters[ML2+6].dmg = 0;
X  Monsters[ML2+6].sense = 5;
X  Monsters[ML2+6].wakeup = 10;
X  Monsters[ML2+6].level = 2;
X  Monsters[ML2+6].status =  AWAKE+WANDERING+MOBILE+INTANGIBLE;
X  Monsters[ML2+6].immunity = pow2(SLEEP)+pow2(FEAR)+pow2(NORMAL_DAMAGE);
X  Monsters[ML2+6].xpv = 30;
X  Monsters[ML2+6].treasure = 0;
X  Monsters[ML2+6].possessions = NULL;
X  Monsters[ML2+6].sleep = 0;
X  Monsters[ML2+6].x = -1;
X  Monsters[ML2+6].y = -1;
X  Monsters[ML2+6].transformid = -1;
X  Monsters[ML2+6].corpsevalue = 0;
X  Monsters[ML2+6].monchar = 'g';
X  strcpy(Monsters[ML2+6].monstring,"ghost");
X  strcpy(Monsters[ML2+6].corpsestr,"ghost ectoplasm");
X  Monsters[ML2+6].corpseweight = 1;
X  Monsters[ML2+6].talkf = M_TALK_GHOST;
X  Monsters[ML2+6].movef = M_MOVE_SPIRIT;
X  Monsters[ML2+6].meleef = M_NO_OP;
X  Monsters[ML2+6].strikef = M_NO_OP;
X  Monsters[ML2+6].specialf = M_SP_GHOST;
X
X
X  /* enchanter  */
X  Monsters[ML2+7].id = ML2+7;
X  Monsters[ML2+7].hp = 20;
X  Monsters[ML2+7].speed = 8;
X  Monsters[ML2+7].hit = 5;
X  Monsters[ML2+7].actions = 2;
X  Monsters[ML2+7].tactics = MM_TIMID+MM_POOR;
X  Monsters[ML2+7].ac = 10;
X  Monsters[ML2+7].dmg = 5;
X  Monsters[ML2+7].sense = 5;
X  Monsters[ML2+7].wakeup = 3;
X  Monsters[ML2+7].level = 2;
X  Monsters[ML2+7].status =  AWAKE+HOSTILE+MOBILE+COWARDLY;
X  Monsters[ML2+7].immunity = pow2(COLD);
X  Monsters[ML2+7].xpv = 40;
X  Monsters[ML2+7].treasure = 2;
X  Monsters[ML2+7].possessions = NULL;
X  Monsters[ML2+7].sleep = 0;
X  Monsters[ML2+7].x = -1;
X  Monsters[ML2+7].y = -1;
X  Monsters[ML2+7].transformid = -1;
X  Monsters[ML2+7].corpsevalue = 100;
X  Monsters[ML2+7].monchar = 'e';
X  strcpy(Monsters[ML2+7].monstring,"enchanter");
X  strcpy(Monsters[ML2+7].corpsestr,"enchanter's wand");
X  Monsters[ML2+7].corpseweight = 1;
X  Monsters[ML2+7].talkf = M_TALK_EVIL;
X  Monsters[ML2+7].movef = M_MOVE_SMART;
X  Monsters[ML2+7].meleef = M_MELEE_NORMAL;
X  Monsters[ML2+7].strikef = M_NO_OP;
X  Monsters[ML2+7].specialf = M_SP_SPELL;
X
X
X
X  /* murk fungus  */
X  Monsters[ML2+8].id = ML2+7;
X  Monsters[ML2+8].hp = 7;
X  Monsters[ML2+8].speed = 12;
X  Monsters[ML2+8].hit = 0;
X  Monsters[ML2+8].actions = 0;
X  Monsters[ML2+8].tactics = MM_POOR;
X  Monsters[ML2+8].ac = 0;
X  Monsters[ML2+8].dmg = 0;
X  Monsters[ML2+8].sense = 10;
X  Monsters[ML2+8].wakeup = 3;
X  Monsters[ML2+8].level = 2;
X  Monsters[ML2+8].status =  AWAKE+HOSTILE;
X  Monsters[ML2+8].immunity = 0;
X  Monsters[ML2+8].xpv = 1;
X  Monsters[ML2+8].treasure = 0;
X  Monsters[ML2+8].possessions = NULL;
X  Monsters[ML2+8].sleep = 0;
X  Monsters[ML2+8].x = -1;
X  Monsters[ML2+8].y = -1;
X  Monsters[ML2+8].transformid = SCROLLID+22;
X  Monsters[ML2+8].corpsevalue = 10;
X  Monsters[ML2+8].monchar = 'f';
X  strcpy(Monsters[ML2+8].monstring,"murk fungus");
X  strcpy(Monsters[ML2+8].corpsestr,"murk cloud particles");
X  Monsters[ML2+8].corpseweight = 1;
X  Monsters[ML2+8].talkf = M_NO_OP;
X  Monsters[ML2+8].movef = M_NO_OP;
X  Monsters[ML2+8].meleef = M_NO_OP;
X  Monsters[ML2+8].strikef = M_NO_OP;
X  Monsters[ML2+8].specialf = M_SP_BLACKOUT;
X
X
X
X
X
X  /* the salamander */
X  Monsters[ML3+0].id = ML3+0;
X  Monsters[ML3+0].hp = 35;
X  Monsters[ML3+0].speed = 4;
X  Monsters[ML3+0].hit = 10;
X  Monsters[ML3+0].actions = 4;
X  Monsters[ML3+0].tactics = MM_AVERAGE;
X  Monsters[ML3+0].ac = 5;
X  Monsters[ML3+0].dmg = 30;
X  Monsters[ML3+0].sense = 4;
X  Monsters[ML3+0].wakeup = 1;
X  Monsters[ML3+0].level = 3;
X  Monsters[ML3+0].status = HOSTILE+GREEDY+MOBILE;
X  Monsters[ML3+0].immunity = pow2(FLAME);
X  Monsters[ML3+0].sleep = 50;
X  Monsters[ML3+0].treasure = 0;
X  Monsters[ML3+0].possessions = NULL;
X  Monsters[ML3+0].xpv = 75;
X  Monsters[ML3+0].x = -1;
X  Monsters[ML3+0].y = -1;
X  Monsters[ML3+0].transformid = RINGID+4;
X  Monsters[ML3+0].corpsevalue = 50;
X  Monsters[ML3+0].monchar = 's';
X  strcpy(Monsters[ML3+0].monstring,"salamander");
X  strcpy(Monsters[ML3+0].corpsestr,"salamander scales");
X  Monsters[ML3+0].corpseweight = 50;
X  Monsters[ML3+0].talkf = M_TALK_STUPID;
X  Monsters[ML3+0].movef = M_MOVE_FLUTTER;
X  Monsters[ML3+0].meleef = M_MELEE_FIRE;
X  Monsters[ML3+0].strikef = M_NO_OP;
X  Monsters[ML3+0].specialf = M_NO_OP;
X
X
X
X  /* the catoblepas */
X  Monsters[ML3+1].id = ML3+1;
X  Monsters[ML3+1].hp = 100;
X  Monsters[ML3+1].speed = 8;
X  Monsters[ML3+1].hit = 10;
X  Monsters[ML3+1].actions = 2;
X  Monsters[ML3+1].tactics = MM_FORCED+MM_POOR;
X  Monsters[ML3+1].hitloc = HIGH;
X  Monsters[ML3+1].ac = 10;
X  Monsters[ML3+1].dmg = 20;
X  Monsters[ML3+1].sense = 5;
X  Monsters[ML3+1].wakeup = 2;
X  Monsters[ML3+1].level = 3;
X  Monsters[ML3+1].status = HOSTILE+HUNGRY+GREEDY+MOBILE;
X  Monsters[ML3+1].immunity = 0;
X  Monsters[ML3+1].xpv = 50;
X  Monsters[ML3+1].treasure = 0;
X  Monsters[ML3+1].possessions = NULL;
X  Monsters[ML3+1].sleep = 50;
X  Monsters[ML3+1].x = -1;
X  Monsters[ML3+1].y = -1;
X  Monsters[ML3+1].transformid = RINGID+3;
X  Monsters[ML3+1].corpsevalue = 50;
X  Monsters[ML3+1].monchar = 'C';
X  strcpy(Monsters[ML3+1].monstring,"catoblepas");
X  strcpy(Monsters[ML3+1].corpsestr,"catoblepas' eyes");
X  Monsters[ML3+1].corpseweight = 10;
X  Monsters[ML3+1].talkf = M_TALK_STUPID;
X  Monsters[ML3+1].movef = M_MOVE_NORMAL;
X  Monsters[ML3+1].meleef = M_MELEE_NORMAL;
X  Monsters[ML3+1].strikef = M_STRIKE_BLIND;
X  Monsters[ML3+1].specialf = M_NO_OP;
X
X
X
X  /* Lesser Frost Demon */
X  Monsters[ML3+2].id = ML3+2;
X  Monsters[ML3+2].hp = 15;
X  Monsters[ML3+2].speed = 4;
X  Monsters[ML3+2].hit = 15;
X  Monsters[ML3+2].actions = 3;
X  Monsters[ML3+2].tactics = MM_GOOD;
X  Monsters[ML3+2].ac = 15;
X  Monsters[ML3+2].dmg = 15;
X  Monsters[ML3+2].sense = 3;
X  Monsters[ML3+2].wakeup = 3;
X  Monsters[ML3+2].level = 3;
X  Monsters[ML3+2].status = HOSTILE+MOBILE;
X  Monsters[ML3+2].immunity = pow2(SLEEP)+pow2(POISON)+pow2(FEAR)+pow2(COLD);
X  Monsters[ML3+2].xpv = 50;
X  Monsters[ML3+2].treasure = 2;
X  Monsters[ML3+2].possessions = NULL;
X  Monsters[ML3+2].sleep = 0;
X  Monsters[ML3+2].x = -1;
X  Monsters[ML3+2].y = -1;
X  Monsters[ML3+2].transformid = STICKID+10;
X  Monsters[ML3+2].corpsevalue = 50;
X  Monsters[ML3+2].monchar = 'f';
X  strcpy(Monsters[ML3+2].monstring,"lesser frost demon");
X  strcpy(Monsters[ML3+2].corpsestr,"lesser frost demon's heart");
X  Monsters[ML3+2].corpseweight = 25;
X  Monsters[ML3+2].talkf = M_TALK_EVIL;
X  Monsters[ML3+2].movef = M_MOVE_SMART;
X  Monsters[ML3+2].meleef = M_MELEE_COLD;
X  Monsters[ML3+2].strikef = M_NO_OP;
X  Monsters[ML3+2].specialf = M_SP_DEMON;
X
X
X
X  /* acid cloud */
X  Monsters[ML3+3].id = ML3+3;
X  Monsters[ML3+3].hp = 10;
X  Monsters[ML3+3].speed = 20;
X  Monsters[ML3+3].hit = 20;
X  Monsters[ML3+3].actions = 1;
X  Monsters[ML3+3].tactics = MM_POOR;
X  Monsters[ML3+3].ac = 0;
X  Monsters[ML3+3].dmg = 50;
X  Monsters[ML3+3].sense = 5;
X  Monsters[ML3+3].wakeup = 1;
X  Monsters[ML3+3].level = 3;
X  Monsters[ML3+3].status = 0+MOBILE+FLYING;
X  Monsters[ML3+3].immunity = pow2(SLEEP)+pow2(POISON);
X  Monsters[ML3+3].xpv = 30;
X  Monsters[ML3+3].treasure = 0;
X  Monsters[ML3+3].possessions = NULL;
X  Monsters[ML3+3].sleep = 0;
X  Monsters[ML3+3].x = -1;
X  Monsters[ML3+3].y = -1;
X  Monsters[ML3+3].transformid = -1;
X  Monsters[ML3+3].corpsevalue = 0;
X  Monsters[ML3+3].monchar = 'a';
X  strcpy(Monsters[ML3+3].monstring,"acid cloud");
X  strcpy(Monsters[ML3+3].corpsestr,"acid pool");
X  Monsters[ML3+3].corpseweight = 10;
X  Monsters[ML3+3].talkf = M_NO_OP;
X  Monsters[ML3+3].movef = M_MOVE_FOLLOW;
X  Monsters[ML3+3].meleef = M_MELEE_NORMAL;
X  Monsters[ML3+3].strikef = M_NO_OP;
X  Monsters[ML3+3].specialf = M_SP_ACID_CLOUD;
X
X
X
X  /* phantom */
X  Monsters[ML3+4].id = ML3+4;
X  Monsters[ML3+4].hp = 1;
X  Monsters[ML3+4].speed = 10;
X  Monsters[ML3+4].hit = 20;
X  Monsters[ML3+4].actions = 3;
X  Monsters[ML3+4].tactics = MM_GOOD+MM_BERSERK;
X  Monsters[ML3+4].ac = 0;
X  Monsters[ML3+4].dmg = 0;
X  Monsters[ML3+4].sense = 5;
X  Monsters[ML3+4].wakeup = 5;
X  Monsters[ML3+4].level = 2;
X  Monsters[ML3+4].status = HOSTILE+MOBILE+INTANGIBLE+FLYING+M_INVISIBLE;
X  Monsters[ML3+4].immunity = pow2(SLEEP)+pow2(POISON)+pow2(FEAR)+
X                             pow2(NORMAL_DAMAGE);
X  Monsters[ML3+4].xpv = 50;
X  Monsters[ML3+4].treasure = 0;
X  Monsters[ML3+4].possessions = NULL;
X  Monsters[ML3+4].sleep = 100;
X  Monsters[ML3+4].x = -1;
X  Monsters[ML3+4].y = -1;
X  Monsters[ML3+4].transformid = -1;
X  Monsters[ML3+4].corpsevalue = 0;
X  Monsters[ML3+4].monchar = 'p';
X  strcpy(Monsters[ML3+4].monstring,"phantom");
X  strcpy(Monsters[ML3+4].corpsestr,"phantom's cowl");
X  Monsters[ML3+4].corpseweight = 10;
X  Monsters[ML3+4].talkf = M_TALK_SILENT;
X  Monsters[ML3+4].movef = M_MOVE_SPIRIT;
X  Monsters[ML3+4].meleef = M_MELEE_SPIRIT;
X  Monsters[ML3+4].strikef = M_NO_OP;
X  Monsters[ML3+4].specialf = M_SP_SURPRISE;
X
X
X  /* Goblin King */
X  Monsters[ML3+5].id = ML3+5;
X  Monsters[ML3+5].uniqueness = 2;
X  Monsters[ML3+5].speed = 5;
X  Monsters[ML3+5].hp = 32;
X  Monsters[ML3+5].hit = 14;
X  Monsters[ML3+5].actions = 5;
X  Monsters[ML3+5].tactics = MM_GOOD;
X  Monsters[ML3+5].ac = 10;
X  Monsters[ML3+5].dmg = 32;
X  Monsters[ML3+5].sense = 5;
X  Monsters[ML3+5].wakeup = 20;
X  Monsters[ML3+5].level = 3;
X  Monsters[ML3+5].status = HOSTILE+GREEDY+MOBILE;
X  Monsters[ML3+5].immunity = 0;
X  Monsters[ML3+5].xpv = 75;
X  Monsters[ML3+5].treasure = 3;
X  Monsters[ML3+5].possessions = NULL;
X  /******* this is OK, since both creature and object are unique */
X  tob = ((pob) (calloc(1,sizeof(objtype))));
X  make_weapon(tob,36); /* Goblin's axe */
X  m_pickup(&(Monsters[ML3+5]),tob);
X  /*******/
X  Monsters[ML3+5].sleep = 100;
X  Monsters[ML3+5].x = -1;
X  Monsters[ML3+5].y = -1;
X  Monsters[ML3+5].transformid = -1;
X  Monsters[ML3+5].corpsevalue = 0;
X  Monsters[ML3+5].monchar = 'G';
X  strcpy(Monsters[ML3+5].monstring,"The Goblin King");
X  strcpy(Monsters[ML3+5].corpsestr,"The Head of the Goblin King");
X  Monsters[ML3+5].corpseweight = 100;
X  Monsters[ML3+5].talkf = M_TALK_GREEDY;
X  Monsters[ML3+5].movef = M_MOVE_SMART;
X  Monsters[ML3+5].meleef = M_MELEE_NORMAL;
X  Monsters[ML3+5].strikef = M_STRIKE_MISSILE;
X  Monsters[ML3+5].specialf = M_NO_OP;
X
X  /* Living Whirlwind */
X  Monsters[ML3+6].id = ML3+6;
X  Monsters[ML3+6].hp = 16;
X  Monsters[ML3+6].hit = 0;
X  Monsters[ML3+6].speed = 10;
X  Monsters[ML3+6].actions = 0;
X  Monsters[ML3+6].tactics = MM_POOR;
X  Monsters[ML3+6].ac = 1000;
X  Monsters[ML3+6].dmg = 0;
X  Monsters[ML3+6].sense = 5;
X  Monsters[ML3+6].wakeup = 0;
X  Monsters[ML3+6].level = 3;
X  Monsters[ML3+6].status = HOSTILE+MOBILE;
X  Monsters[ML3+6].immunity = EVERYTHING-FLAME;
X  Monsters[ML3+6].xpv = 75;
X  Monsters[ML3+6].treasure = 3;
X  Monsters[ML3+6].possessions = NULL;
X  Monsters[ML3+6].sleep = 0;
X  Monsters[ML3+6].x = -1;
X  Monsters[ML3+6].y = -1;
X  Monsters[ML3+6].transformid = -1;
X  Monsters[ML3+6].corpsevalue = 200;
X  Monsters[ML3+6].monchar = '6';
X  strcpy(Monsters[ML3+6].monstring,"living whirlwind ");
X  strcpy(Monsters[ML3+6].corpsestr,"whirlwind's eye");
X  Monsters[ML3+6].corpseweight = 1;
X  Monsters[ML3+6].talkf = M_NO_OP;
X  Monsters[ML3+6].movef = M_MOVE_RANDOM;
X  Monsters[ML3+6].meleef = M_NO_OP;
X  Monsters[ML3+6].strikef = M_NO_OP;
X  Monsters[ML3+6].specialf = M_SP_WHIRL;
X}
END_OF_oinitmon0to3.c
if test 36268 -ne `wc -c <oinitmon0to3.c`; then
    echo shar: \"oinitmon0to3.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f ospell.c -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"ospell.c\"
else
echo shar: Extracting \"ospell.c\" \(17364 characters\)
sed "s/^X//" >ospell.c <<'END_OF_ospell.c'
X/* omega copyright (C) by Laurence Raphael Brothers, 1987 */
X/* ospell.c */
X/* functions having to do with spellcasting */
X
X#include <strings.h>
X#include "oglob.h"
X
X/* from outil */
Xextern int strprefix();
X
X
X/* from oscr */
Xextern void menuspellprint(),mprint(),printm(),menuclear(),dobackspace();
Xextern void maddch(),xredraw(),menuprint();
Xextern char mgetc();
X
X/* from oaux */
Xextern void findspace(),setspot();
X
X/* from oeffect 1 or 2*/
Xextern void identify(),mondet(),objdet(),fbolt(),lball(),nbolt();
Xextern void sleep_monster(),disintegrate(),heal(),enchant(),cure();
Xextern void disrupt(),knowledge(),regenerate(),displace(),truesight();
Xextern void augment(),invisible(),warp(),alert(),flux(),haste();
Xextern void recover_stat(),breathe(),apport(),clairvoyance(),sanctuary();
Xextern void bless(),summon(),p_teleport(),hero(),levitate(),accuracy();
Xextern void sanctify(),dispel(),polymorph(),hellfire();
Xextern void invulnerable(),shadowform();
X
X/* ospell functions */
Xvoid s_firebolt(),s_lball(),s_sleep(),s_objdet(),s_mondet(),s_identify();
Xvoid s_teleport(),s_disrupt(),s_disintegrate(),s_missile(),drain();
Xvoid s_heal(),s_dispel(),s_breathe(),s_invisible(),s_warp(),s_enchant();
Xvoid s_bless(),s_truesight(),s_hellfire(),s_knowledge(),s_hero();
Xvoid s_restore(),s_cure(),s_return(),s_desecrate(),s_summon();
Xvoid s_accuracy(),s_ritual(),s_apport(),s_shadowform(),s_alert();
Xvoid s_regenerate(),s_sanctify(),s_clairvoyance(),s_drain(),s_polymorph();
Xvoid s_invulnerable();
X
X
Xvoid initspells(),expandspellabbrevs();
Xint getspell(),expandspell();
Xchar *spellid();
X
Xvoid s_firebolt()
X{
X  int x=Player.x,y=Player.y;
X  setspot(&x,&y);
X  fbolt(Player.x,Player.y,x,y,Player.dex*2+Player.level,Player.level*10+10);
X}
X
Xvoid s_missile()
X{
X  int x=Player.x,y=Player.y;
X  setspot(&x,&y);
X  nbolt(Player.x,Player.y,x,y,Player.dex*2+Player.level,Player.level*3+3);
X}
X
Xvoid s_teleport()
X{
X  p_teleport(0);
X}
X/* disrupt */
Xvoid s_disrupt()
X{
X  int x=Player.x,y=Player.y;
X  setspot(&x,&y);
X  disrupt(x,y,Player.level*10+25);
X}
X
X/* disintegrate */
Xvoid s_disintegrate()
X{
X  int x=Player.x,y=Player.y;
X  setspot(&x,&y);
X  disintegrate(x,y);
X}
X
X/* sleep spell */
Xvoid s_sleep()
X{
X  sleep_monster(0);
X}
X
Xvoid s_heal()
X{
X  heal(3);
X}
X
Xvoid s_dispel()
X{
X  dispel((Player.level+Player.maxpow)/10); 
X}
X
Xvoid s_breathe()
X{
X  breathe(0);
X}
X
Xvoid s_invisible()
X{
X  invisible(0);
X}
X
X
Xvoid s_warp()
X{
X  warp(1);
X}
X
Xvoid s_enchant()
X{
X  enchant(1);
X}
X
X
Xvoid s_bless()
X{
X  bless(0);
X}
X
X
Xvoid s_restore()
X{
X  recover_stat(0);
X}
X
X
Xvoid s_cure()
X{
X  cure(0);
X}
X
X
Xvoid s_truesight()
X{
X  truesight(0);
X}
X
X
Xvoid s_hellfire()
X{
X  int x=Player.x,y=Player.y;
X  setspot(&x,&y);
X  hellfire(x,y,0);
X}
X
X
Xvoid s_knowledge()
X{
X  knowledge(0);
X}
X
X
Xvoid s_hero()
X{
X  hero(0);
X}
X
X/* spell works immediately only from city level */
Xvoid s_return()
X{
X  if (Dlevel == NUMLEVELS-1) 
X    mprint("Your spell doesn't seem to work.");
X  else {
X    mprint("You hear a whine as your spell begins to charge up.");
X    Player.status[RETURNING] = 
X      (Dlevel == 0 ? 3 : 200-(Player.level+Player.pow));
X  }
X}
X
Xvoid s_desecrate()
X{
X  sanctify(-1);
X}
X
X
Xvoid s_haste()
X{
X  haste(0);
X}
X
X
Xvoid s_summon()
X{
X  summon(1,-1);
X}
X
X
Xvoid s_sanctuary()
X{
X  sanctuary();
X}
X
Xvoid s_sanctify()
X{
X  sanctify(1);
X}
X
X
Xvoid s_accuracy()
X{
X  accuracy(0);
X}
X
X/* Has all kinds of effects in different circumstances.
X   Eventually will be more interesting */
Xvoid s_ritual()
X{
X  static int ritualhour = -1; /* only 1 ritual per hour */
X  static int lastroom = -100;
X  pob symbol;
X  int i,j,roomno;
X  mprint("You begin your ritual....");
X  mprint("You enter a deep trance. Time Passes...");
X  Skipplayer = TRUE;
X  time_clock();
X  Skipplayer = TRUE;
X  time_clock();
X  Skipplayer = TRUE;
X  time_clock();
X  Skipplayer = TRUE;
X  time_clock();
X  Skipplayer = TRUE;
X  time_clock();
X  if (ritualhour == hour())
X    mprint("Your mental fatigue prevents from completing the ritual!");
X  else if (random_range(100) > Player.iq+Player.pow+Player.level)
X    mprint("Your concentration was broken -- the ritual fails!");
X  else {
X    mprint("You charge the ritual with magical energy and focus your will.");
X    mprint("Time Passes...");
X    Skipplayer = TRUE;
X    time_clock();
X    Skipplayer = TRUE;
X    time_clock();
X    Skipplayer = TRUE;
X    time_clock();
X    Skipplayer = TRUE;
X    time_clock();
X    Skipplayer = TRUE;
X    time_clock();
X    ritualhour = hour();
X    /* set of random conditions for different ritual effects */
X    if (Dlevel == 0) {
X      mprint("Flowing waves of mystical light congeal all around you.");
X      mprint("'Like wow, man! Colors!'");
X      mprint("Appreciative citizens throw you spare change.");
X      Player.cash +=random_range(50);
X    }
X    else if ((roomno=Dungeon[Dlevel][Player.x][Player.y].roomnumber) >= 0) {
X      if (lastroom == Leveldata[Dlevel].rooms[roomno].rsi)
X	mprint("For some reason the ritual doesn't work this time...");
X      else {
X	lastroom = Leveldata[Dlevel].rooms[roomno].rsi;
X	switch (lastroom) {
X	case 6: /* charred wall room */
X	  mprint("Blasts of fire fill the room!!!");
X	  for(i=Leveldata[Dlevel].rooms[roomno].left+1;
X	      i<Leveldata[Dlevel].rooms[roomno].right;
X	      i++)
X	    for(j=Leveldata[Dlevel].rooms[roomno].top+1;
X		j<Leveldata[Dlevel].rooms[roomno].bottom;
X		j++)
X	      fbolt(Player.x,Player.y,i,j,100,100);
X	  break;
X	case 16: /* ransacked treasure chamber */
X	  mprint("Your spell sets off frenetic growth all around you!");
X	  for(i=0;i<8;i++){
X	    Dungeon[Dlevel][Player.x+Dirs[0][i]][Player.y+Dirs[1][i]].locchar =
X	      HEDGE;
X	    Dungeon[Dlevel][Player.x+Dirs[0][i]][Player.y+Dirs[1][i]].p_locf =
X	      L_TRIFID;
X	  }
X	  break;
X	case 22: /* boudoir */
X	  mprint("A secret chamber opens next to the bed....");
X	  if (random_range(2))
X	    summon(0,ML4+6); /* succubus/incubus */
X	  else summon(0,ML4+7); /* satyr/nymph */
X	  break;
X	case 25: /* sewer control room */
X	  mprint ("Louvers open and the room fills with water!");
X	  for(i=Leveldata[Dlevel].rooms[roomno].left+1;
X	      i<Leveldata[Dlevel].rooms[roomno].right;
X	      i++)
X	  for(j=Leveldata[Dlevel].rooms[roomno].top+1;
X	      j<Leveldata[Dlevel].rooms[roomno].bottom;
X	      j++) {
X	    Dungeon[Dlevel][i][j].locchar = WATER;
X	    Dungeon[Dlevel][i][j].p_locf = L_WATER;
X	    if (Dungeon[Dlevel][i][j].creature != NULL)
X	      m_water(Dungeon[Dlevel][i][j].creature);
X	  }
X	  break;
X	case 26: /* magician's lab */
X	  mprint("Your magical activity sets off a latent spell in the lab!");
X	  (*(Spells[random_range(NUMSPELLS)].castf))();
X	  break;
X	case 27: /* pentagram room */
X	  mprint("A smoky form begins to coalesce....");
X	  summon(-1,-1);
X	  mprint("Fortunately, it seems confined to the pentagram.");
X	  m_status_reset(Mlist[Dlevel]->m,MOBILE);
X	  break;
X	case 28: /* blue omega room */
X	  mprint("The Lords of Destiny look upon you....");
X	  if (Player.patron == DESTINY) {
X	    mprint("Your patrons take pity on you.");
X	    if ((Player.rank[PRIESTHOOD]<SPRIEST) &&
X		(! ((inpack(ARTIFACTID+19,-1))+1))) {
X	      symbol = ((pob) calloc(1,sizeof(objtype)));
X	      *symbol = Objects[ARTIFACTID+19];
X	      symbol->charge = 17;
X	      add_item_to_pack(symbol);
X	      mprint("You feel uplifted.");
X	    }
X	    else gain_experience(min(1000,Player.xp));
X	  }
X	  else if (random_range(3)==1) {
X	    mprint("You feel Fated.");
X	    gain_experience(Player.level*Player.level*10);
X	    Player.hp = Player.maxhp;
X	  }
X	  else if (random_range(2)) {
X	    mprint("You feel Doomed.");
X	    Player.hp = 1;
X	    Player.mana = 0;
X	    Player.xp = 0;
X	  }
X	  else mprint("The Lords of Destiny laugh at you!");
X	  break;
X	default:
X	  mprint("Well, not much effect. Chalk it up to experience.");
X	  gain_experience(Player.level*5);
X	  break;
X	}
X      }
X    }
X    else {
X      if (lastroom == Dungeon[Dlevel][Player.x][Player.y].roomnumber)
X	mprint("The ritual fails for some unexplainable reason.");
X      else {
X	lastroom = Dungeon[Dlevel][Player.x][Player.y].roomnumber;
X	switch (lastroom) {
X	case RS_WALLSPACE:
X	  shadowform();
X	  break;
X	case RS_CORRIDOR:
X	  haste(0);
X	  break;
X	case RS_PONDS:
X	  breathe(0);
X	  break;
X	case RS_ADEPT:
X	  hero(1);
X	  break;
X	default:
X	  mprint("The ritual doesn't seem to produce any tangible results...");
X	  gain_experience(Player.level*6);
X	}
X      }
X    }
X  }
X}
X
X
Xvoid s_invulnerable()
X{
X  invulnerable();
X}
X
Xvoid s_apport()
X{
X  apport(0);
X}
X
Xvoid s_shadowform()
X{
X  shadowform();
X}
X
Xvoid s_alert()
X{
X  alert(0);
X}
X
Xvoid s_regenerate()
X{
X  regenerate(0);
X}
X
Xvoid s_clairvoyance()
X{
X  clairvoyance(10);
X}
X
Xvoid s_drain()
X{
X  drain(0);
X}
X
Xvoid s_levitate()
X{
X  levitate(0);
X}
X
Xvoid s_polymorph()
X{
X  polymorph(0);
X}
X
X
X/* lball spell */
Xvoid s_lball()
X{
X  int x=Player.x,y=Player.y;
X  setspot(&x,&y);
X  lball(Player.x,Player.y,x,y,Player.level*10+10);
X}
X
Xvoid s_identify()
X{
X  identify(0);
X}
X
Xvoid s_objdet()
X{
X  objdet(0);
X}
X
Xvoid s_mondet()
X{
X  mondet(0);
X}
X
X
X/* select a spell to cast */
Xint getspell()
X{
X  int spell= -2;
X  do {
X    mprint("\nCast Spell: [type spell abbrev, ?, or ESCAPE]: ");
X    spell = spellparse();
X  } while (spell < ABORT);
X  return(spell);
X}
X
X
Xchar *spellid(id)
Xint id;
X{
X  switch(id) {
X    case S_MON_DET:return("monster detection");break;
X    case S_OBJ_DET:return("object detection");break;
X    case S_IDENTIFY:return("identification");break;
X    case S_FIREBOLT:return("firebolt");break;
X    case S_LBALL:return("ball lightning");break;
X    case S_SLEEP:return("sleep");break;
X    case S_DISRUPT:return("disrupt");break;
X    case S_DISINTEGRATE:return("disintegrate");break;
X    case S_TELEPORT:return("teleport");break;
X    case S_MISSILE:return("magic missile"); break;
X    case S_HEAL:return("healing"); break;
X    case S_DISPEL:return("dispelling"); break;
X    case S_BREATHE:return("breathing"); break;
X    case S_INVISIBLE:return("invisibility"); break;
X    case S_WARP:return("the warp"); break;
X    case S_ENCHANT:return("enchantment"); break;
X    case S_BLESS:return("blessing"); break;
X    case S_RESTORE:return("restoration"); break;
X    case S_CURE:return("curing"); break;
X    case S_TRUESIGHT:return("true sight"); break;
X    case S_HELLFIRE:return("hellfire"); break;
X    case S_KNOWLEDGE:return("self knowledge"); break;
X    case S_HERO:return("heroism"); break;
X    case S_RETURN:return("return"); break;
X    case S_DESECRATE:return("desecration"); break;
X    case S_HASTE:return("haste"); break;
X    case S_SUMMON:return("summoning"); break;
X    case S_SANCTUARY:return("sanctuary"); break;
X    case S_ACCURACY:return("accuracy"); break;
X    case S_RITUAL:return("ritual magic"); break;
X    case S_INVULNERABLE:return("invulnerability"); break;
X    case S_APPORT:return("apportation"); break;
X    case S_SHADOWFORM:return("shadow form"); break;
X    case S_ALERT:return("alertness"); break;
X    case S_REGENERATE:return("regeneration"); break;
X    case S_SANCTIFY:return("sanctification"); break;
X    case S_CLAIRVOYANCE:return("clairvoyance"); break;
X    case S_DRAIN:return("energy drain"); break;
X    case S_LEVITATE:return("levitate"); break;
X    case S_POLYMORPH:return("polymorph"); break;
X    default:return("???"); break;
X  }      
X}
X
X
X
Xvoid initspells()
X{
X  int i;
X
X  for (i=0; i<NUMSPELLS; i++)
X    Spells[i].known = FALSE;
X
X  Spells[S_MON_DET].powerdrain = 3;
X  Spells[S_MON_DET].castf = s_mondet;
X  Spells[S_MON_DET].id = S_MON_DET;
X
X  Spells[S_OBJ_DET].powerdrain = 3;
X  Spells[S_OBJ_DET].castf = s_objdet;
X  Spells[S_OBJ_DET].id = S_OBJ_DET;
X
X  Spells[S_IDENTIFY].powerdrain = 10;
X  Spells[S_IDENTIFY].castf = s_identify;
X  Spells[S_IDENTIFY].id = S_IDENTIFY;
X
X  Spells[S_FIREBOLT].powerdrain = 20;
X  Spells[S_FIREBOLT].castf = s_firebolt;
X  Spells[S_FIREBOLT].id = S_FIREBOLT;
X
X  Spells[S_SLEEP].powerdrain = 15;
X  Spells[S_SLEEP].castf = s_sleep;
X  Spells[S_SLEEP].id = S_SLEEP;
X
X  Spells[S_LBALL].powerdrain = 25;
X  Spells[S_LBALL].castf = s_lball;
X  Spells[S_LBALL].id = S_LBALL;
X
X  Spells[S_TELEPORT].powerdrain = 20;
X  Spells[S_TELEPORT].castf = s_teleport;
X  Spells[S_TELEPORT].id = S_TELEPORT;
X
X  Spells[S_DISRUPT].powerdrain = 30;
X  Spells[S_DISRUPT].castf = s_disrupt;
X  Spells[S_DISRUPT].id = S_DISRUPT;
X
X  Spells[S_DISINTEGRATE].powerdrain = 40;
X  Spells[S_DISINTEGRATE].castf = s_disintegrate;
X  Spells[S_DISINTEGRATE].id = S_DISINTEGRATE;
X
X  Spells[S_MISSILE].powerdrain = 10;
X  Spells[S_MISSILE].castf = s_missile;
X  Spells[S_MISSILE].id = S_MISSILE;
X
X  Spells[S_HEAL].powerdrain = 15;
X  Spells[S_HEAL].castf = s_heal;
X  Spells[S_HEAL].id = S_HEAL;
X
X  Spells[S_DISPEL].powerdrain = 40;
X  Spells[S_DISPEL].castf = s_dispel;
X  Spells[S_DISPEL].id = S_DISPEL;
X
X  Spells[S_BREATHE].powerdrain = 20;
X  Spells[S_BREATHE].castf = s_breathe;
X  Spells[S_BREATHE].id = S_BREATHE;
X
X  Spells[S_INVISIBLE].powerdrain = 15;
X  Spells[S_INVISIBLE].castf = s_invisible;
X  Spells[S_INVISIBLE].id = S_INVISIBLE;
X
X  Spells[S_WARP].powerdrain = 50;
X  Spells[S_WARP].castf = s_warp;
X  Spells[S_WARP].id = S_WARP;
X
X  Spells[S_ENCHANT].powerdrain = 30;
X  Spells[S_ENCHANT].castf = s_enchant;
X  Spells[S_ENCHANT].id = S_ENCHANT;
X
X  Spells[S_BLESS].powerdrain = 30;
X  Spells[S_BLESS].castf = s_bless;
X  Spells[S_BLESS].id = S_BLESS;
X
X  Spells[S_RESTORE].powerdrain = 20;
X  Spells[S_RESTORE].castf = s_restore;
X  Spells[S_RESTORE].id = S_RESTORE;
X
X  Spells[S_CURE].powerdrain = 20;
X  Spells[S_CURE].castf = s_cure;
X  Spells[S_CURE].id = S_CURE;
X
X  Spells[S_TRUESIGHT].powerdrain = 20;
X  Spells[S_TRUESIGHT].castf = s_truesight;
X  Spells[S_TRUESIGHT].id = S_TRUESIGHT;
X
X  Spells[S_HELLFIRE].powerdrain = 100;
X  Spells[S_HELLFIRE].castf = s_hellfire;
X  Spells[S_HELLFIRE].id = S_HELLFIRE;
X
X  Spells[S_KNOWLEDGE].powerdrain = 10;
X  Spells[S_KNOWLEDGE].castf = s_knowledge;
X  Spells[S_KNOWLEDGE].id = S_KNOWLEDGE;
X
X  Spells[S_HERO].powerdrain = 20;
X  Spells[S_HERO].castf = s_hero;
X  Spells[S_HERO].id = S_HERO;
X
X  Spells[S_RETURN].powerdrain = 10;
X  Spells[S_RETURN].castf = s_return;
X  Spells[S_RETURN].id = S_RETURN;
X
X  Spells[S_DESECRATE].powerdrain = 50;
X  Spells[S_DESECRATE].castf = s_desecrate;
X  Spells[S_DESECRATE].id = S_DESECRATE;
X
X  Spells[S_HASTE].powerdrain = 15;
X  Spells[S_HASTE].castf = s_haste;
X  Spells[S_HASTE].id = S_HASTE;
X
X  Spells[S_SUMMON].powerdrain = 20;
X  Spells[S_SUMMON].castf = s_summon;
X  Spells[S_SUMMON].id = S_SUMMON;
X
X  Spells[S_SANCTUARY].powerdrain = 75;
X  Spells[S_SANCTUARY].castf = s_sanctuary;
X  Spells[S_SANCTUARY].id = S_SANCTUARY;
X
X  Spells[S_ACCURACY].powerdrain = 20;
X  Spells[S_ACCURACY].castf = s_accuracy;
X  Spells[S_ACCURACY].id = S_ACCURACY;
X
X  Spells[S_RITUAL].powerdrain = 50;
X  Spells[S_RITUAL].castf = s_ritual;
X  Spells[S_RITUAL].id = S_RITUAL;
X
X  Spells[S_INVULNERABLE].powerdrain = 50;
X  Spells[S_INVULNERABLE].castf = s_invulnerable;
X  Spells[S_INVULNERABLE].id = S_INVULNERABLE;
X
X  Spells[S_APPORT].powerdrain = 15;
X  Spells[S_APPORT].castf = s_apport;
X  Spells[S_APPORT].id = S_APPORT;
X
X  Spells[S_SHADOWFORM].powerdrain = 50;
X  Spells[S_SHADOWFORM].castf = s_shadowform;
X  Spells[S_SHADOWFORM].id = S_SHADOWFORM;
X
X  Spells[S_ALERT].powerdrain = 15;
X  Spells[S_ALERT].castf = s_alert;
X  Spells[S_ALERT].id = S_ALERT;
X
X  Spells[S_REGENERATE].powerdrain = 20;
X  Spells[S_REGENERATE].castf = s_regenerate;
X  Spells[S_REGENERATE].id = S_REGENERATE;
X
X  Spells[S_SANCTIFY].powerdrain = 75;
X  Spells[S_SANCTIFY].castf = s_sanctify;
X  Spells[S_SANCTIFY].id = S_SANCTIFY;
X
X  Spells[S_CLAIRVOYANCE].powerdrain = 10;
X  Spells[S_CLAIRVOYANCE].castf = s_clairvoyance;
X  Spells[S_CLAIRVOYANCE].id = S_CLAIRVOYANCE;
X
X  Spells[S_DRAIN].powerdrain = 40;
X  Spells[S_DRAIN].castf = s_drain;
X  Spells[S_DRAIN].id = S_DRAIN;
X
X  Spells[S_LEVITATE].powerdrain = 25;
X  Spells[S_LEVITATE].castf = s_levitate;
X  Spells[S_LEVITATE].id = S_LEVITATE;
X
X  Spells[S_POLYMORPH].powerdrain = 30;
X  Spells[S_POLYMORPH].castf = s_polymorph;
X  Spells[S_POLYMORPH].id = S_POLYMORPH;
X
X}
X
Xint spellparse()
X{
X  int spell= -3,place=0;
X  char byte,prefix[80];
X
X  prefix[0]=0;
X
X  do {
X    byte = mgetc();
X    if ((byte >= 'A') && (byte <= 'Z')) {
X      maddch(byte+'a'-'A');
X      prefix[place] = byte+'a'-'A';
X      prefix[place+1] = 0;
X      place++;
X    }
X    else if ((byte == ' ') || ((byte >= 'a') && (byte <= 'z'))) {
X      maddch(byte);
X      prefix[place] = byte;
X      prefix[place+1] = 0;
X      place++;
X    }
X    else if ((byte == 8) || (byte == 127)) { /* ^h or delete */ 
X      prefix[place]=0;
X      if (place > 0) {
X	place--;
X	dobackspace();
X      }
X    }
X    else if (byte == '?') {
X      maddch(byte);
X      expandspellabbrevs(prefix);
X      dobackspace();
X    }
X    else if (byte == '\n')
X      spell = expandspell(prefix);
X    else if (byte == ESCAPE)
X      spell = ABORT;
X  } while (spell == -3);
X  xredraw();
X  return(spell);
X}
X
Xvoid expandspellabbrevs(prefix)
Xchar prefix[80];
X{
X  int i,printed=FALSE;
X  
X  menuclear();
X  menuprint("\nPossible Spells:\n");
X  for (i=0;i<NUMSPELLS;i++)
X    if (Spells[i].known && strprefix(prefix,spellid(i))) {
X      menuspellprint(i);
X      printed = TRUE;
X    }
X  if (! printed)
X    menuprint("\nNo spells match that prefix!");
X}
X
X
Xint expandspell(prefix)
Xchar prefix[80];
X{
X  int i,spell,matched=0;
X  
X  for (i=0;i<NUMSPELLS;i++)
X    if (Spells[i].known && strprefix(prefix,spellid(i))) {
X      spell = i;
X      matched++;
X    }
X  if (matched==0) {
X    mprint("No spells match that prefix!");
X    return(-2);
X  }
X  else if (matched > 1) {
X    mprint("That is an ambiguous abbreviation!");
X    return(-2);
X  }
X  else return(spell);
X}
X
END_OF_ospell.c
if test 17364 -ne `wc -c <ospell.c`; then
    echo shar: \"ospell.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
echo shar: End of archive 6 \(of 15\).
cp /dev/null ark6isdone
MISSING=""
for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ; do
    if test ! -f ark${I}isdone ; then
	MISSING="${MISSING} ${I}"
    fi
done
if test "${MISSING}" = "" ; then
    echo You have unpacked all 15 archives.
    rm -f ark[1-9]isdone ark[1-9][0-9]isdone
else
    echo You still need to unpack the following archives:
    echo "        " ${MISSING}
fi
##  End of shell archive.
exit 0