home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CP/M
/
CPM_CDROM.iso
/
simtel
/
cpmug
/
cpmug053.ark
/
TURN.C
< prev
next >
Wrap
C/C++ Source or Header
|
1984-04-29
|
14KB
|
816 lines
/* TURN.C no mods for V 1.43 */
#include "advent.h"
/*
Routine to take 1 turn
*/
turn()
{
char i;
/*
if closing, then he can't leave except via
the main office.
*/
if (newloc < 9 && newloc != 0 && closing) {
rspeak(130);
newloc = loc;
if (!panic)
clock2 = 15;
panic = 1;
}
/*
see if a dwarf has seen him and has come
from where he wants to go.
*/
if (newloc != loc && !forced(loc) && cond[loc]&NOPIRAT == 0)
for (i=1; i<(DWARFMAX-1); ++i)
if (odloc[i] == newloc && dseen[i]) {
newloc = loc;
rspeak(2);
break;
}
dwarves();
/*
on to the regular move.
*/
if(loc != newloc){
++turns;
loc=newloc;
/* check for death */
if(loc==0) {
death();
return;
}
/* check for forced move */
if(forced(loc)) {
describe();
domove();
return;
}
/* check for wandering in dark */
if(wzdark && dark() && pct(35)) {
rspeak(23);
oldloc2=loc;
death();
return;
}
/* describe his situation */
describe();
if(!dark()) {
++visited[loc];
descitem();
}
}
if (closed) {
if (prop[OYSTER] < 0 && toting(OYSTER))
pspeak(OYSTER,1);
for (i=1; i <= MAXOBJ; ++i)
if (toting(i) && prop[i] < 0)
prop[i] = -1-prop[i];
}
wzdark = dark();
if (knfloc > 0 && knfloc != loc)
knfloc = 0;
/*
run the timer routine
*/
if (stimer())
return;
/* ask what he wants to do */
/* debug */
if (dbgflg)
printf("Your current location is %d\n",loc);
while(!english())
;
/* act on his instructions */
if(motion)
domove();
else if(object)
doobj();
else
itverb();
}
/*
Routine to describe current location
*/
describe()
{
if(toting(BEAR))
rspeak(141);
if(dark())
rspeak(16);
else if(visited[loc])
descsh(loc);
else
desclg(loc);
if(loc==33 && pct(25) && !closing)
rspeak(8);
}
/*
Routine to describe visible items
*/
descitem()
{
int i,state;
for(i=1;i<MAXOBJ;++i) {
if(at(i)) {
if(i==STEPS && toting(NUGGET))
continue;
if(prop[i]<0) {
if(closed)
continue;
else {
prop[i]=0;
if(i==RUG || i==CHAIN)
++prop[i];
--tally;
}
}
if(i==STEPS && loc==fixed[STEPS])
state=1;
else
state=prop[i];
pspeak(i,state);
}
}
if(tally==tally2 && tally != 0 && limit > 35)
limit = 35;
}
/*
Routine to handle motion requests
*/
domove()
{
gettrav(loc);
switch(motion) {
case NULLX:
break;
case BACK:
goback();
break;
case LOOK:
if(detail++<3)
rspeak(15);
wzdark=0;
visited[loc]=0;
newloc=loc;
loc=0;
break;
case CAVE:
if(loc<8)
rspeak(57);
else
rspeak(58);
break;
default:
oldloc2=oldloc;
oldloc=loc;
dotrav();
}
}
/*
Routine to handle request to return
from whence we came!
*/
goback()
{
int kk,k2,want,temp;
struct trav strav[MAXTRAV];
if(forced(oldloc))
want=oldloc2;
else
want=oldloc;
oldloc2=oldloc;
oldloc=loc;
k2=0;
if(want==loc) {
rspeak(91);
return;
}
copytrv(travel,strav);
for(kk=0;travel[kk].tdest!=-1;++kk) {
if(!travel[kk].tcond && travel[kk].tdest==want) {
motion=travel[kk].tverb;
dotrav();
return;
}
if(!travel[kk].tcond) {
k2=kk;
temp=travel[kk].tdest;
gettrav(temp);
if(forced(temp) && travel[0].tdest==want)
k2=temp;
copytrv(strav,travel);
}
}
if(k2) {
motion=travel[k2].tverb;
dotrav();
}
else
rspeak(140);
}
/*
Routine to copy a travel array
*/
copytrv(trav1,trav2)
struct trav *trav1,*trav2;
{
int i;
for(i=0;i<MAXTRAV;++i) {
trav2 -> tdest = trav1 -> tdest;
trav2 -> tverb = trav1 -> tverb;
trav2 -> tcond = trav1 -> tcond;
}
}
/*
Routine to figure out a new location
given current location and a motion.
*/
dotrav()
{
char mvflag,hitflag,kk;
int rdest,rverb,rcond,robject;
int pctt;
newloc=loc;
mvflag=hitflag=0;
pctt = rand()%100;
for(kk=0;travel[kk].tdest>=0 && !mvflag; ++kk) {
rdest = travel[kk].tdest;
rverb = travel[kk].tverb;
rcond = travel[kk].tcond;
robject = rcond%100;
if(rverb != 1 && rverb != motion && !hitflag)
continue;
++hitflag;
switch(rcond/100) {
case 0:
if(rcond==0 || pctt < rcond)
++mvflag;
/* debug */
if(rcond)
printf("\% move %d %d\n",
pctt,mvflag);
break;
case 1:
if(robject==0)
++mvflag;
else if(toting(robject))
++mvflag;
break;
case 2:
if(toting(robject) || at(robject))
++mvflag;
break;
case 3:
case 4:
case 5:
case 7:
if(prop[robject] != (rcond/100)-3)
++mvflag;
break;
default:
bug(37);
}
}
if(!mvflag)
badmove();
else if(rdest>500)
rspeak(rdest-500);
else if(rdest>300)
spcmove(rdest);
else
newloc = rdest;
}
/*
The player tried a poor move option.
*/
badmove()
{
int msg;
msg=12;
if(motion >= 43 && motion <=50) msg=9;
if(motion == 29 || motion == 30) msg=9;
if(motion == 7 || motion==36 || motion==37) msg=10;
if(motion==11 || motion==19) msg=11;
if(verb==FIND || verb==INVENTORY) msg=59;
if(motion==62 || motion==65) msg=42;
if(motion==17) msg=80;
rspeak(msg);
}
/*
Routine to handle very special movement.
*/
spcmove(rdest)
int rdest;
{
switch(rdest-300) {
case 1: /* plover movement via alcove */
if(!holding || (holding==1 && toting(EMERALD)))
newloc=(99+100)-loc;
else
rspeak(117);
break;
case 2: /* trying to remove plover, bad route */
drop(EMERALD,loc);
break;
case 3: /* troll bridge */
if(prop[TROLL]==1) {
pspeak(TROLL,1);
prop[TROLL]=0;
move(TROLL2,0);
move((TROLL2+MAXOBJ),0);
move(TROLL,117);
move((TROLL+MAXOBJ),122);
juggle(CHASM);
newloc=loc;
}
else {
newloc=(loc==117 ? 122 : 117);
if(prop[TROLL]==0)
++prop[TROLL];
if(!toting(BEAR))
return;
rspeak(162);
prop[CHASM]=1;
prop[TROLL]=2;
drop(BEAR,newloc);
fixed[BEAR]=-1;
prop[BEAR]=3;
if(prop[SPICES]<0)
++tally2;
oldloc2=newloc;
death();
}
break;
default:
bug(38);
}
}
/*
Routine to handle player's demise via
waking up the dwarves...
*/
dwarfend()
{
death();
normend();
}
/*
normal end of game
*/
normend()
{
score();
exit();
}
/*
scoring
*/
score()
{
int t,i,k,s;
s = t = 0;
for (i=50; i<=MAXTRS; ++i) {
if (i==CHEST)
k = 14;
else if (i > CHEST)
k = 16;
else
k = 12;
if (prop[i] >= 0)
t += 2;
if (place[i] == 3 && prop[i] == 0)
t += k-2;
}
printf("%-20s%d\n","Treasures:",s=t);
t = (MAXDIE - numdie)*10;
if (t)
printf("%-20s%d\n","Survival:",t);
s += t;
if (!gaveup)
s += 4;
t = dflag ? 25 : 0;
if (t)
printf("%-20s%d\n","Getting well in:",t);
s += t;
t = closing ? 25 : 0;
if (t)
printf("%-20s%d\n","Masters section:",t);
s += t;
if (closed) {
if (bonus == 0)
t = 10;
else if (bonus == 135)
t = 25;
else if (bonus == 134)
t = 30;
else if (bonus == 133)
t = 45;
printf("%-20s%d\n","Bonus:",t);
s += t;
}
if (place[MAGAZINE] == 108)
s += 1;
s += 2;
printf("%-20s%d\n","Score:",s);
}
/*
Routine to handle the passing on of one
of the player's incarnations...
*/
death()
{
char yea,i,j,k;
if (!closing) {
yea = yes(81+numdie*2,82+numdie*2,54);
if (++numdie >= MAXDIE || !yea)
normend();
place[WATER] = 0;
place[OIL] = 0;
if (toting(LAMP))
prop[LAMP] = 0;
for (j=1; j<101; ++j) {
i = 101-j;
if (toting(i))
drop(i,i==LAMP ? 1:oldloc2);
}
newloc = 3;
oldloc = loc;
return;
}
/*
closing -- no resurrection...
*/
rspeak(131);
++numdie;
normend();
}
/*
Routine to process an object.
*/
doobj()
{
char i;
/*
is object here? if so, transitive
*/
if(fixed[object]==loc || here(object))
trobj();
/*
did he give grate as destination?
*/
else if(object==GRATE) {
if(loc==1 || loc==4 || loc==7) {
motion=DEPRESSION;
domove();
}
else if(loc>9 && loc<15) {
motion=ENTRANCE;
domove();
}
}
/*
is it a dwarf he is after?
*/
else if (dcheck() && dflag >= 2) {
object = DWARF;
trobj();
}
/*
is he trying to get/use a liquid?
*/
else if( (liq()==object && here(BOTTLE)) ||
liqloc(loc)==object)
trobj();
else if(object==PLANT && at(PLANT2) &&
prop[PLANT2]==0) {
object=PLANT2;
trobj();
}
/*
is he trying to grab a knife?
*/
else if(object==KNIFE && knfloc==loc) {
rspeak(116);
knfloc=-1;
}
/*
is he trying to get at dynamite?
*/
else if(object==ROD && here(ROD2)) {
object=ROD2;
trobj();
}
else
printf("I see no %s here.\n",probj(object));
}
/*
Routine to process an object being
referred to.
*/
trobj()
{
if(verb)
trverb();
else
printf("What do you want to do with the %s?\n",
probj(object));
}
/*
Routine to print word corresponding to object
*/
probj(object)
{
int wtype,wval;
analyze(word1,&wtype,&wval);
return (wtype==1 ? word1 : word2);
}
/*
dwarf stuff.
*/
dwarves()
{
int i,j,k,try,attack,stick,dtotal;
/*
see if dwarves allowed here
*/
if (newloc == 0 || forced(newloc) || cond[newloc]&NOPIRAT)
return;
/*
see if dwarves are active.
*/
if (!dflag) {
if (newloc > 15)
++dflag;
return;
}
/*
if first close encounter (of 3rd kind)
kill 0, 1 or 2
*/
if (dflag == 1) {
if (newloc < 15 || pct(95))
return;
++dflag;
for (i=1; i<3; ++i)
if (pct(50))
dloc[rand()%5+1] = 0;
for (i=1; i<(DWARFMAX-1); ++i) {
if (dloc[i] == newloc)
dloc[i] = daltloc;
odloc[i] = dloc[i];
}
rspeak(3);
drop(AXE,newloc);
return;
}
dtotal = attack = stick = 0;
for (i=1; i<DWARFMAX; ++i) {
if (dloc[i] == 0)
continue;
/*
move a dwarf at random. we don't
have a matrix around to do it
as in the original version...
*/
for (try=1; try<20; ++try) {
j = rand()%106+15; /* allowed area */
if (j!=odloc[i] && j!=dloc[i] &&
!(i==(DWARFMAX-1) && cond[j]&NOPIRAT==1))
break;
}
if (j==0)
j = odloc[i];
odloc[i] = dloc[i];
dloc[i] = j;
if ((dseen[i] && newloc >= 15) ||
dloc[i] == newloc || odloc[i] == newloc)
dseen[i] = 1;
else
dseen[i] = 0;
if (!dseen[i])
continue;
dloc[i] = newloc;
if (i==6)
dopirate();
else {
++dtotal;
if (odloc[i] == dloc[i]) {
++attack;
if (knfloc >= 0)
knfloc = newloc;
if (rand()%1000 < 95*(dflag-2))
++stick;
}
}
}
if (dtotal == 0)
return;
if (dtotal > 1)
printf("There are %d threatening little dwarves in the room with you!\n",dtotal);
else
rspeak(4);
if (attack == 0)
return;
if (dflag == 2)
++dflag;
if (attack > 1) {
printf("%d of them throw knives at you!!\n",attack);
k = 6;
}
else {
rspeak(5);
k = 52;
}
if (stick <= 1) {
rspeak(stick+k);
if (stick == 0)
return;
}
else
printf("%d of them get you !!!\n",stick);
oldloc2 = newloc;
death();
}
/*
pirate stuff
*/
dopirate()
{
int j,k;
if (newloc == chloc || prop[CHEST] >= 0)
return;
k = 0;
for (j=50; j<=MAXTRS; ++j)
if (j != PYRAMID ||
(newloc != place[PYRAMID] &&
newloc != place[EMERALD])) {
if (toting(j))
goto stealit;
if (here(j))
++k;
}
if (tally == tally2+1 && k == 0 && place[CHEST] == 0 &&
here(LAMP) && prop[LAMP] == 1) {
rspeak(186);
move(CHEST,chloc);
move(MESSAGE,chloc2);
dloc[6] = chloc;
odloc[6] = chloc;
dseen[6] = 0;
return;
}
if (odloc[6] != dloc[6] && pct(20)) {
rspeak(127);
return;
}
return;
stealit:
rspeak(128);
if (place[MESSAGE] == 0)
move(CHEST,chloc);
move(MESSAGE,chloc2);
for (j=50; j<=MAXTRS; ++j) {
if (j==PYRAMID &&
(newloc == place[PYRAMID] ||
newloc == place[EMERALD]))
continue;
if (at(j) && fixed[j] == 0)
carry(j,newloc);
if (toting(j))
drop(j,chloc);
}
dloc[6] = chloc;
odloc[6] = chloc;
dseen[6] = 0;
}
/*
special time limit stuff...
*/
stimer()
{
int i;
foobar = foobar > 0 ? -foobar : 0;
if (tally == 0 && loc >= 15 && loc != 33)
--clock;
if (clock == 0) {
/*
start closing the cave
*/
prop[GRATE] = 0;
prop[FISSURE] = 0;
for (i=1; i<DWARFMAX; ++i)
dseen[i] = 0;
move(TROLL,0);
move((TROLL+MAXOBJ),0);
move(TROLL2,117);
move((TROLL2+MAXOBJ),122);
juggle(CHASM);
if (prop[BEAR] != 3)
dstroy(BEAR);
prop[CHAIN] = 0;
fixed[CHAIN] = 0;
prop[AXE] = 0;
fixed[AXE] = 0;
rspeak(129);
clock = -1;
closing = 1;
return(0);
}
if (clock < 0)
--clock2;
if (clock2 == 0) {
/*
set up storage room...
and close the cave...
*/
prop[BOTTLE] = put(BOTTLE,115,1);
prop[PLANT] = put(PLANT,115,0);
prop[OYSTER] = put(OYSTER,115,0);
prop[LAMP] = put(LAMP,115,0);
prop[ROD] = put(ROD,115,0);
prop[DWARF] = put(DWARF,115,0);
loc = 115;
oldloc = 115;
newloc = 115;
put(GRATE,116,0);
prop[SNAKE] = put(SNAKE,116,1);
prop[BIRD] = put(BIRD,116,1);
prop[CAGE] = put(CAGE,116,0);
prop[ROD2] = put(ROD2,116,0);
prop[PILLOW] = put(PILLOW,116,0);
prop[MIRROR] = put(MIRROR,115,0);
fixed[MIRROR] = 116;
for (i=1; i<= MAXOBJ; ++i)
if (toting(i))
dstroy(i);
rspeak(132);
closed = 1;
return(1);
}
if (prop[LAMP] == 1)
--limit;
if (limit <= 30 &&
here(BATTERIES) && prop[BATTERIES] == 0 &&
here(LAMP)) {
rspeak(188);
prop[BATTERIES] = 1;
if (toting(BATTERIES))
drop(BATTERIES,loc);
limit += 2500;
lmwarn = 0;
return(0);
}
if (limit == 0) {
--limit;
prop[LAMP] = 0;
if (here(LAMP))
rspeak(184);
return(0);
}
if (limit < 0 && loc <= 8) {
rspeak(185);
gaveup = 1;
normend();
}
if (limit <= 30) {
if (lmwarn || !here(LAMP))
return(0);
lmwarn = 1;
i = 187;
if (place[BATTERIES] == 0)
i = 183;
if (prop[BATTERIES] == 1)
i = 189;
rspeak(i);
return(0);
}
return(0);
}