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