home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Oldies but Goodies
/
OldiesButGoodiesROMMANTechnologies1993.disc1of1.iso
/
adventur
/
turn.c
< prev
next >
Wrap
Text File
|
1984-05-18
|
16KB
|
864 lines
/* program TURN.C *\
\* WARNING: "advent.c" allocates GLOBAL storage space by *\
\* including "advdef.h". *\
\* All other modules use "advdec.h". */
#include "stdio.h" /* drv = 1.1st file 2.def 3.A */
#include "advent.h"
#include "advdec.h"
extern int printf();
/*
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(); /* & special dwarf(pirate who steals) */
/* added by BDS C conversion */
if (loc != newloc) {
++turns;
loc = newloc;
/* causes occasional "move" with two describe & descitem */
/* } */ /* if (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();
}
/* causes occasional "move" with no describe & descitem */
} /* if (loc != newloc) */
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;
if (stimer()) /* as the grains of sand slip by */
return;
while (!english()) /* retrieve player instructions */
;
if (dbugflg)
printf("loc = %d, verb = %d, object = %d, \
motion = %d\n", loc, verb, object, motion);
if (motion) /* execute player instructions */
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 (dbugflg)
printf("rdest = %d, rverb = %d, rcond = %d, \
robject = %d in dotrav\n", rdest, rverb, \
rcond, robject);
if ((rverb != 1) && (rverb != motion) && !hitflag)
continue;
++hitflag;
switch(rcond/100) {
case 0:
if ((rcond == 0) || (pctt < rcond))
++mvflag;
if (rcond && dbugflg)
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;
if (dbugflg)
printf("newloc in dotrav = %d\n", newloc);
}
}
/*
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);
}
/*
random number seed
*/
static long rnum = 0;
srand(n)
short n;
{
rnum = (long)n;
}
/*
random number
*/
rand()
{
rnum = rnum * 0x41C64E6D + 0x3039;
return((short)(rnum >> 16) & 0x7FFF);
}