home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The C Users' Group Library 1994 August
/
wc-cdrom-cusersgrouplibrary-1994-08.iso
/
vol_100
/
159_01
/
verb.c
< prev
next >
Wrap
C/C++ Source or Header
|
1990-05-04
|
16KB
|
1,048 lines
/* VERB.C no mods for V 1.43 */
#include "advent.h"
/*
Routine to process a transitive verb
*/
VOID PASCAL trverb(VOID)
{
switch (verb)
{
case CALM:
case WALK:
case QUIT:
case SCORE:
case FOO:
case BRIEF:
case SUSPEND:
case HOURS:
case LOG:
actspk(verb);
break;
case TAKE:
vtake();
break;
case DROP:
vdrop();
break;
case OPEN:
case LOCK:
vopen();
break;
case SAY:
vsay();
break;
case NOTHING:
rspeak(54);
break;
case ON:
von();
break;
case OFF:
voff();
break;
case WAVE:
vwave();
break;
case KILL:
vkill();
break;
case POUR:
vpour();
break;
case EAT:
veat();
break;
case DRINK:
vdrink();
break;
case RUB:
if (object != LAMP)
rspeak(76);
else
actspk(RUB);
break;
case THROW:
vthrow();
break;
case FEED:
vfeed();
break;
case FIND:
case INVENTORY:
vfind();
break;
case FILL:
vfill();
break;
case READ:
vread();
break;
case BLAST:
vblast();
break;
case BREAK:
vbreak();
break;
case WAKE:
vwake();
break;
case SAVE:
saveadv();
describe();
descitem();
break;
case RESTORE:
restore();
describe();
descitem();
break;
default:
printf("This verb is not implemented yet.\n");
}
return;
}
/*
CARRY TAKE etc.
*/
VOID PASCAL vtake(VOID)
{
auto SHORT msg;
auto SHORT i;
if (toting(object))
{
actspk(verb);
return;
}
/* special case objects and fixed objects */
msg = 25;
if (object == PLANT && prop[PLANT] <= 0)
msg = 115;
if (object == BEAR && prop[BEAR] == 1)
msg = 169;
if (object == CHAIN && prop[BEAR] != 0)
msg = 170;
if (fixed[object])
{
rspeak(msg);
return;
}
/* special case for liquids */
if (object == WATER || object == OIL)
{
if (!here(BOTTLE) || liq() != object)
{
object = BOTTLE;
if (toting(BOTTLE) && prop[BOTTLE] == 1)
{
vfill();
return;
}
if (prop[BOTTLE] != 1)
msg = 105;
if (!toting(BOTTLE))
msg = 104;
rspeak(msg);
return;
}
object = BOTTLE;
}
if (holding >= 7)
{
rspeak(92);
return;
}
/* special case for bird. */
if (object == BIRD && prop[BIRD] == 0)
{
if (toting(ROD))
{
rspeak(26);
return;
}
if (!toting(CAGE))
{
rspeak(27);
return;
}
prop[BIRD] = 1;
}
if ((object == BIRD || object == CAGE) && prop[BIRD] != 0)
carry((BIRD + CAGE) - object, loc);
carry(object, loc);
/* handle liquid in bottle */
i = liq();
if (object == BOTTLE && i != 0)
place[i] = -1;
rspeak(54);
return;
}
/*
DROP etc.
*/
VOID PASCAL vdrop(VOID)
{
auto SHORT i;
/* check for dynamite */
if (toting(ROD2) && object == ROD && !toting(ROD))
object = ROD2;
if (!toting(object))
{
actspk(verb);
return;
}
/* snake and bird */
if (object == BIRD && here(SNAKE))
{
rspeak(30);
if (closed)
dwarfend();
dstroy(SNAKE);
prop[SNAKE] = -1;
}
else /* coins and vending machine */
{
if (object == COINS && here(VEND))
{
dstroy(COINS);
drop(BATTERIES, loc);
pspeak(BATTERIES, 0);
return;
}
else /* bird and dragon (ouch!!) */
{
if (object == BIRD && at(DRAGON) && prop[DRAGON] == 0)
{
rspeak(154);
dstroy(BIRD);
prop[BIRD] = 0;
if (place[SNAKE] != 0)
++tally2;
return;
}
}
}
/* Bear and troll */
if (object == BEAR && at(TROLL))
{
rspeak(163);
move(TROLL, 0);
move((TROLL + MAXOBJ), 0);
move(TROLL2, 117);
move((TROLL2 + MAXOBJ), 122);
juggle(CHASM);
prop[TROLL] = 2;
}
else /* vase */
{
if (object == VASE)
{
if (loc == 96)
rspeak(54);
else
{
prop[VASE] = at(PILLOW) ? 0 : 2;
pspeak(VASE, prop[VASE] + 1);
if (prop[VASE] != 0)
fixed[VASE] = -1;
}
}
}
/* handle liquid and bottle */
i = liq();
if (i == object)
object = BOTTLE;
if (object == BOTTLE && i != 0)
place[i] = 0;
/* handle bird and cage */
if (object == CAGE && prop[BIRD] != 0)
drop(BIRD, loc);
if (object == BIRD)
prop[BIRD] = 0;
drop(object, loc);
return;
}
/*
LOCK, UNLOCK, OPEN, CLOSE etc.
*/
VOID PASCAL vopen(VOID)
{
auto SHORT msg, oyclam;
switch (object)
{
case CLAM:
case OYSTER:
oyclam = (object == OYSTER ? 1 : 0);
if (verb == LOCK)
msg = 61;
else
{
if (!toting(TRIDENT))
msg = 122 + oyclam;
else
{
if (toting(object))
msg = 120 + oyclam;
else
{
msg = 124 + oyclam;
dstroy(CLAM);
drop(OYSTER, loc);
drop(PEARL, 105);
}
}
}
break;
case DOOR:
msg = (prop[DOOR] == 1 ? 54 : 111);
break;
case CAGE:
msg = 32;
break;
case KEYS:
msg = 55;
break;
case CHAIN:
if (!here(KEYS))
msg = 31;
else
{
if (verb == LOCK)
{
if (prop[CHAIN] != 0)
msg = 34;
else
if (loc != 130)
msg = 173;
else
{
prop[CHAIN] = 2;
if (toting(CHAIN))
drop(CHAIN, loc);
fixed[CHAIN] = -1;
msg = 172;
}
}
else
{
if (prop[BEAR] == 0)
msg = 41;
else
{
if (prop[CHAIN] == 0)
msg = 37;
else
{
prop[CHAIN] = 0;
fixed[CHAIN] = 0;
if (prop[BEAR] != 3)
prop[BEAR] = 2;
fixed[BEAR] = 2 - prop[BEAR];
msg = 171;
}
}
}
}
break;
case GRATE:
if (!here(KEYS))
msg = 31;
else
{
if (closing)
{
if (!panic)
{
clock2 = 15;
++panic;
}
msg = 130;
}
else
{
msg = 34 + prop[GRATE];
prop[GRATE] = (verb == LOCK ? 0 : 1);
msg += 2 * prop[GRATE];
}
}
break;
default:
msg = 33;
}
rspeak(msg);
return;
}
/*
SAY etc.
*/
VOID PASCAL vsay(VOID)
{
auto SHORT wtype, wval;
analyze(word1, &wtype, &wval);
printf("Okay.\n%s\n", wval == SAY ? word2 : word1);
return;
}
/*
ON etc.
*/
VOID PASCAL von(VOID)
{
if (!here(LAMP))
actspk(verb);
else
{
if (limit < 0)
rspeak(184);
else
{
prop[LAMP] = 1;
rspeak(39);
if (wzdark)
{
wzdark = 0;
describe();
descitem();
}
}
}
return;
}
/*
OFF etc.
*/
VOID PASCAL voff(VOID)
{
if (!here(LAMP))
actspk(verb);
else
{
prop[LAMP] = 0;
rspeak(40);
}
return;
}
/*
WAVE etc.
*/
VOID PASCAL vwave(VOID)
{
if (!toting(object) && (object != ROD || !toting(ROD2)))
rspeak(29);
else
{
if (object != ROD || !at(FISSURE) || !toting(object) || closing)
actspk(verb);
else
{
prop[FISSURE] = 1 - prop[FISSURE];
pspeak(FISSURE, 2 - prop[FISSURE]);
}
}
}
/*
ATTACK, KILL etc.
*/
VOID PASCAL vkill(VOID)
{
auto SHORT msg;
auto SHORT i;
switch (object)
{
case BIRD:
if (closed)
msg = 137;
else
{
dstroy(BIRD);
prop[BIRD] = 0;
if (place[SNAKE] == 19)
++tally2;
msg = 45;
}
break;
case 0:
msg = 44;
break;
case CLAM:
case OYSTER:
msg = 150;
break;
case SNAKE:
msg = 46;
break;
case DWARF:
if (closed)
dwarfend();
msg = 49;
break;
case TROLL:
msg = 157;
break;
case BEAR:
msg = 165 + (prop[BEAR] + 1) / 2;
break;
case DRAGON:
if (prop[DRAGON] != 0)
{
msg = 167;
break;
}
if (!yes(49, 0, 0))
break;
pspeak(DRAGON, 1);
prop[DRAGON] = 2;
prop[RUG] = 0;
move((DRAGON + MAXOBJ), -1);
move((RUG + MAXOBJ), 0);
move(DRAGON, 120);
move(RUG, 120);
for (i = 1; i < MAXOBJ; ++i)
if (place[i] == 119 || place[i] == 121)
move(i, 120);
newloc = 120;
return;
default:
actspk(verb);
return;
}
rspeak(msg);
}
/*
POUR
*/
VOID PASCAL vpour(VOID)
{
if (object == BOTTLE || object == 0)
object = liq();
if (object == 0)
{
needobj();
return;
}
if (!toting(object))
{
actspk(verb);
return;
}
if (object != OIL && object != WATER)
{
rspeak(78);
return;
}
prop[BOTTLE] = 1;
place[object] = 0;
if (at(PLANT))
{
if (object != WATER)
rspeak(112);
else
{
pspeak(PLANT, prop[PLANT] + 1);
prop[PLANT] = (prop[PLANT] + 2) % 6;
prop[PLANT2] = prop[PLANT] / 2;
describe();
}
}
else
{
if (at(DOOR))
{
prop[DOOR] = (object == OIL ? 1 : 0);
rspeak(113 + prop[DOOR]);
}
else
rspeak(77);
}
return;
}
/*
EAT
*/
VOID PASCAL veat(VOID)
{
auto SHORT msg;
switch (object)
{
case FOOD:
dstroy(FOOD);
msg = 72;
break;
case BIRD:
case SNAKE:
case CLAM:
case OYSTER:
case DWARF:
case DRAGON:
case TROLL:
case BEAR:
msg = 71;
break;
default:
actspk(verb);
return;
}
rspeak(msg);
return;
}
/*
DRINK
*/
VOID PASCAL vdrink(VOID)
{
if (object != WATER)
rspeak(110);
else
{
if (liq() != WATER || !here(BOTTLE))
actspk(verb);
else
{
prop[BOTTLE] = 1;
place[WATER] = 0;
rspeak(74);
}
}
return;
}
/*
THROW etc.
*/
VOID PASCAL vthrow(VOID)
{
auto SHORT msg;
auto SHORT i;
if (toting(ROD2) && object == ROD && !toting(ROD))
object = ROD2;
if (!toting(object))
{
actspk(verb);
return;
}
/* treasure to troll */
if (at(TROLL) && object >= 50 && object < MAXOBJ)
{
rspeak(159);
drop(object, 0);
move(TROLL, 0);
move((TROLL + MAXOBJ), 0);
drop(TROLL2, 117);
drop((TROLL2 + MAXOBJ), 122);
juggle(CHASM);
return;
}
/* feed the bears... */
if (object == FOOD && here(BEAR))
{
object = BEAR;
vfeed();
return;
}
/* if not axe, same as drop... */
if (object != AXE)
{
vdrop();
return;
}
/* AXE is THROWN */
/* at a dwarf... */
if (i = dcheck())
{
msg = 48;
if (pct(33))
{
dseen[i] = dloc[i] = 0;
msg = 47;
++dkill;
if (dkill == 1)
msg = 149;
}
}
else /* at a dragon... */
{
if (at(DRAGON) && prop[DRAGON] == 0)
msg = 152;
else /* at the troll... */
{
if (at(TROLL))
msg = 158;
else /* at the bear... */
{
if (here(BEAR) && prop[BEAR] == 0)
{
rspeak(164);
drop(AXE, loc);
fixed[AXE] = -1;
prop[AXE] = 1;
juggle(BEAR);
return;
}
else /* otherwise it is an attack */
{
verb = KILL;
object = 0;
itverb();
return;
}
}
}
}
/* handle the left over axe... */
rspeak(msg);
drop(AXE, loc);
describe();
return;
}
/*
INVENTORY, FIND etc.
*/
VOID PASCAL vfind(VOID)
{
auto SHORT msg;
if (toting(object))
msg = 24;
else
{
if (closed)
msg = 138;
else
{
if (dcheck() && dflag >= 2 && object == DWARF)
msg = 94;
else
{
if (at(object) ||
(liq() == object && here(BOTTLE)) ||
object == liqloc(loc))
msg = 94;
else
{
actspk(verb);
return;
}
}
}
}
rspeak(msg);
return;
}
/*
FILL
*/
VOID PASCAL vfill(VOID)
{
auto SHORT msg;
auto SHORT i;
switch (object)
{
case BOTTLE:
if (liq() != 0)
msg = 105;
else
{
if (liqloc(loc) == 0)
msg = 106;
else
{
prop[BOTTLE] = cond[loc] & WATOIL;
i = liq();
if (toting(BOTTLE))
place[i] = -1;
msg = (i == OIL ? 108 : 107);
}
}
break;
case VASE:
if (liqloc(loc) == 0)
{
msg = 144;
break;
}
if (!toting(VASE))
{
msg = 29;
break;
}
rspeak(145);
vdrop();
return;
default:
msg = 29;
}
rspeak(msg);
}
/*
FEED
*/
VOID PASCAL vfeed(VOID)
{
auto SHORT msg;
switch (object)
{
case BIRD:
msg = 100;
break;
case DWARF:
if (!here(FOOD))
{
actspk(verb);
return;
}
++dflag;
msg = 103;
break;
case BEAR:
if (!here(FOOD))
{
if (prop[BEAR] == 0)
msg = 102;
else
{
if (prop[BEAR] == 3)
msg = 110;
else
{
actspk(verb);
return;
}
}
break;
}
dstroy(FOOD);
prop[BEAR] = 1;
fixed[AXE] = 0;
prop[AXE] = 0;
msg = 168;
break;
case DRAGON:
msg = (prop[DRAGON] != 0 ? 110 : 102);
break;
case TROLL:
msg = 182;
break;
case SNAKE:
if (closed || !here(BIRD))
{
msg = 102;
break;
}
msg = 101;
dstroy(BIRD);
prop[BIRD] = 0;
++tally2;
break;
default:
msg = 14;
}
rspeak(msg);
}
/*
READ etc.
*/
VOID PASCAL vread(VOID)
{
auto SHORT msg;
msg = 0;
if (dark())
{
printf("I see no %s here.\n", probj(object));
return;
}
switch (object)
{
case MAGAZINE:
msg = 190;
break;
case TABLET:
msg = 196;
break;
case MESSAGE:
msg = 191;
break;
case OYSTER:
if (!toting(OYSTER) || !closed)
break;
yes(192, 193, 54);
return;
default:
;
}
if (msg)
rspeak(msg);
else
actspk(verb);
return;
}
/*
BLAST etc.
*/
VOID PASCAL vblast(VOID)
{
if (prop[ROD2] < 0 || !closed)
actspk(verb);
else
{
bonus = 133;
if (loc == 115)
bonus = 134;
if (here(ROD2))
bonus = 135;
rspeak(bonus);
normend();
}
return;
}
/*
BREAK etc.
*/
VOID PASCAL vbreak(VOID)
{
auto SHORT msg;
if (object == MIRROR)
{
msg = 148;
if (closed)
{
rspeak(197);
dwarfend();
}
}
else
{
if (object == VASE && prop[VASE] == 0)
{
msg = 198;
if (toting(VASE))
drop(VASE, loc);
prop[VASE] = 2;
fixed[VASE] = -1;
}
else
{
actspk(verb);
return;
}
}
rspeak(msg);
return;
}
/*
WAKE etc.
*/
VOID PASCAL vwake(VOID)
{
if (object != DWARF || !closed)
actspk(verb);
else
{
rspeak(199);
dwarfend();
}
return;
}
/*
Routine to speak default verb message
*/
VOID PASCAL actspk(SHORT verb)
{
auto SHORT i;
if (verb < 1 || verb > 31)
bug(39);
i = actmsg[verb];
if (i)
rspeak(i);
return;
}
/*
Routine to indicate no reasonable
object for verb found. Used mostly by
intransitive verbs.
*/
VOID PASCAL needobj(VOID)
{
auto SHORT wtype, wval;
analyze(word1, &wtype, &wval);
printf("%s what?\n", wtype == 2 ? word1 : word2);
return;
}