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