#include "advent.h"
#include "database.h"
+/* Limit visibility of ugly globals. Eventually these should go away. */
+extern long K, WD1, WD1X, WD2, WD2X;
+
+static long SPK; /* This should go away too */
+
/*
* Action handlers. Eventually we'll do lookup through a method table
* that calls these. Absolutely nothing like the original FORTRAN.
}
if (obj == BIRD) {
SPK=137;
- if (game.closed) {RSPEAK(SPK); return 2012;}
+ if (game.closed)
+ {
+ RSPEAK(SPK);
+ return 2012;
+ }
DSTROY(BIRD);
game.prop[BIRD]=0;
SPK=45;
}
}
SPK=SPK+1+1/k;
- {RSPEAK(SPK); return 2012;}
+ RSPEAK(SPK);
+ return 2012;
}
if (obj == BEAR)SPK=165+(game.prop[BEAR]+1)/2;
if (obj != DRAGON || game.prop[DRAGON] != 0) {RSPEAK(SPK); return 2012;}
SPK=42;
if (game.foobar != 1-k) {
if (game.foobar != 0)SPK=151;
- {RSPEAK(SPK); return 2012;}
+ RSPEAK(SPK);
+ return 2012;
} else {
game.foobar=k;
- if (k != 4) return(2009);
+ if (k != 4) {
+ RSPEAK(54);
+ return 2012;
+ }
game.foobar=0;
- if (game.place[EGGS] == PLAC[EGGS] || (TOTING(EGGS) && game.loc == PLAC[EGGS]))
- {RSPEAK(SPK); return 2012;}
+ if (game.place[EGGS]==PLAC[EGGS] || (TOTING(EGGS) && game.loc==PLAC[EGGS])) {
+ RSPEAK(SPK);
+ return 2012;
+ }
/* Bring back troll if we steal the eggs back from him before
* crossing. */
if (game.place[EGGS]==0 && game.place[TROLL]==0 && game.prop[TROLL]==0)
static int bivalve(token_t verb, token_t obj)
/* Clam/oyster actions */
{
- int k=0;
+ int spk, k=0;
if (obj == OYSTER)k=1;
- SPK=124+k;
- if (TOTING(obj))SPK=120+k;
- if (!TOTING(TRIDNT))SPK=122+k;
- if (verb == LOCK)SPK=61;
- if (SPK != 124)
- {RSPEAK(SPK); return 2012;}
- DSTROY(CLAM);
- DROP(OYSTER,game.loc);
- DROP(PEARL,105);
- {RSPEAK(SPK); return 2012;}
+ spk=124+k;
+ if (TOTING(obj))spk=120+k;
+ if (!TOTING(TRIDNT))spk=122+k;
+ if (verb == LOCK)spk=61;
+ if (spk == 124) {
+ DSTROY(CLAM);
+ DROP(OYSTER,game.loc);
+ DROP(PEARL,105);
+ }
+ RSPEAK(spk);
+ return 2012;
}
static int blast(void)
/* Blast. No effect unless you've got dynamite, which is a neat trick! */
{
- if (game.prop[ROD2] < 0 || !game.closed) {RSPEAK(SPK); return 2012;}
+ if (game.prop[ROD2] < 0 || !game.closed)
+ {
+ RSPEAK(67);
+ return 2012;
+ }
game.bonus=133;
- if (game.loc == 115)game.bonus=134;
- if (HERE(ROD2))game.bonus=135;
+ if (game.loc == 115)
+ game.bonus=134;
+ if (HERE(ROD2))
+ game.bonus=135;
RSPEAK(game.bonus);
score(0);
}
static int vbreak(token_t obj)
/* Break. Only works for mirror in repository and, of course, the vase. */
{
+ /* FIXME: defaults from ACTSPK */
if (obj == MIRROR)SPK=148;
if (obj == VASE && game.prop[VASE] == 0) {
SPK=198;
if (TOTING(VASE))DROP(VASE,game.loc);
game.prop[VASE]=2;
game.fixed[VASE]= -1;
- {RSPEAK(SPK); return 2012;}
} else {
- if (obj != MIRROR || !game.closed) {RSPEAK(SPK); return 2012;}
- SPK=197;
- return(18999);
+ if (obj == MIRROR && game.closed) {
+ RSPEAK(197);
+ return(190000);
+ }
}
+ RSPEAK(SPK);
+ return 2012;
}
static int brief(void)
/* Brief. Intransitive only. Suppress long descriptions after first time. */
{
- SPK=156;
game.abbnum=10000;
game.detail=3;
- {RSPEAK(SPK); return 2012;}
+ RSPEAK(156);
+ return 2012;
}
static int carry(long obj)
* take one without the other). Liquids also special, since they depend on
* status of bottle. Also various side effects, etc. */
{
+ int spk;
if (obj == INTRANSITIVE) {
/* Carry, no object given yet. OK if only one object present. */
if(game.atloc[game.loc] == 0 ||
obj=game.atloc[game.loc];
}
- if (TOTING(obj)) {RSPEAK(SPK); return 2012;}
- SPK=25;
- if (obj == PLANT && game.prop[PLANT] <= 0)SPK=115;
- if (obj == BEAR && game.prop[BEAR] == 1)SPK=169;
- if (obj == CHAIN && game.prop[BEAR] != 0)SPK=170;
- if (obj == URN)SPK=215;
- if (obj == CAVITY)SPK=217;
- if (obj == BLOOD)SPK=239;
- if (obj == RUG && game.prop[RUG] == 2)SPK=222;
- if (obj == SIGN)SPK=196;
+ if (TOTING(obj)) {RSPEAK(24); return 2012;}
+ spk=25;
+ if (obj == PLANT && game.prop[PLANT] <= 0)spk=115;
+ if (obj == BEAR && game.prop[BEAR] == 1)spk=169;
+ if (obj == CHAIN && game.prop[BEAR] != 0)spk=170;
+ if (obj == URN)spk=215;
+ if (obj == CAVITY)spk=217;
+ if (obj == BLOOD)spk=239;
+ if (obj == RUG && game.prop[RUG] == 2)spk=222;
+ if (obj == SIGN)spk=196;
if (obj == MESSAG) {
- SPK=190;
+ spk=190;
+ return 2012;
DSTROY(MESSAG);
}
- if (game.fixed[obj] != 0)
- {RSPEAK(SPK); return 2012;}
+ if (game.fixed[obj] != 0) {
+ RSPEAK(spk);
+ return 2012;
+ }
if (obj == WATER || obj == OIL) {
if (!HERE(BOTTLE) || LIQUID() != obj) {
if (TOTING(BOTTLE) && game.prop[BOTTLE] == 1)
return(fill(BOTTLE));
- if (game.prop[BOTTLE] != 1)SPK=105;
- if (!TOTING(BOTTLE))SPK=104;
- {RSPEAK(SPK); return 2012;}
+ if (game.prop[BOTTLE] != 1)spk=105;
+ if (!TOTING(BOTTLE))spk=104;
+ RSPEAK(spk);
+ return 2012;
}
obj = BOTTLE;
}
- SPK=92;
- if (game.holdng >= INVLIMIT)
- {RSPEAK(SPK); return 2012;}
- if (obj == BIRD && game.prop[BIRD] != 1 && -1-game.prop[BIRD] != 1) {
+ spk=92;
+ if (game.holdng >= INVLIMIT) {
+ RSPEAK(spk);
+ return 2012;
+ }
+ else if (obj == BIRD && game.prop[BIRD] != 1 && -1-game.prop[BIRD] != 1) {
if (game.prop[BIRD] == 2) {
- SPK=238;
DSTROY(BIRD);
- {RSPEAK(SPK); return 2012;}
+ RSPEAK(238);
+ return 2012;
+ }
+ if (!TOTING(CAGE))spk=27;
+ if (TOTING(ROD))spk=26;
+ if (spk/2 == 13) {
+ RSPEAK(spk);
+ return 2012;
}
- if (!TOTING(CAGE))SPK=27;
- if (TOTING(ROD))SPK=26;
- if (SPK/2 == 13) {RSPEAK(SPK); return 2012;}
game.prop[BIRD]=1;
}
if ((obj==BIRD || obj==CAGE) && (game.prop[BIRD]==1 || -1-game.prop[BIRD]==1))
CARRY(obj,game.loc);
if (obj == BOTTLE && LIQUID() != 0)
game.place[LIQUID()] = -1;
- if (!GSTONE(obj) || game.prop[obj] == 0)
- return(2009);
- game.prop[obj]=0;
- game.prop[CAVITY]=1;
- return(2009);
+ if (GSTONE(obj) && game.prop[obj] != 0) {
+ game.prop[obj]=0;
+ game.prop[CAVITY]=1;
+ }
+ RSPEAK(54);
+ return(2012);
}
static int chain(token_t verb)
/* Do something to the bear's chain */
{
+ int spk;
if (verb != LOCK) {
- SPK=171;
- if (game.prop[BEAR] == 0)SPK=41;
- if (game.prop[CHAIN] == 0)SPK=37;
- if (SPK != 171) {RSPEAK(SPK); return 2012;}
+ spk=171;
+ if (game.prop[BEAR] == 0)spk=41;
+ if (game.prop[CHAIN] == 0)spk=37;
+ if (spk != 171) {RSPEAK(spk); return 2012;}
game.prop[CHAIN]=0;
game.fixed[CHAIN]=0;
if (game.prop[BEAR] != 3)game.prop[BEAR]=2;
game.fixed[BEAR]=2-game.prop[BEAR];
- {RSPEAK(SPK); return 2012;}
} else {
- SPK=172;
- if (game.prop[CHAIN] != 0)SPK=34;
- if (game.loc != PLAC[CHAIN])SPK=173;
- if (SPK != 172) {RSPEAK(SPK); return 2012;}
+ spk=172;
+ if (game.prop[CHAIN] != 0)spk=34;
+ if (game.loc != PLAC[CHAIN])spk=173;
+ if (spk != 172) {RSPEAK(spk); return 2012;}
game.prop[CHAIN]=2;
if (TOTING(CHAIN))DROP(CHAIN,game.loc);
game.fixed[CHAIN]= -1;
- {RSPEAK(SPK); return 2012;}
}
+ RSPEAK(spk);
+ return 2012;
}
static int discard(long obj, bool just_do_it)
game.prop[BOTTLE]=1;
game.place[WATER]=0;
SPK=74;
- {RSPEAK(SPK); return 2012;}
+ RSPEAK(SPK);
+ return 2012;
} else {
DSTROY(BLOOD);
game.prop[DRAGON]=2;
OBJSND[BIRD]=OBJSND[BIRD]+3;
SPK=240;
- {RSPEAK(SPK); return 2012;}
+ RSPEAK(SPK);
+ return 2012;
}
}
return(8000);
DSTROY(FOOD);
SPK=72;
- {RSPEAK(SPK); return 2012;}
} else {
if (obj == FOOD) {
DSTROY(FOOD);
SPK=72;
- {RSPEAK(SPK); return 2012;}
}
if (obj == BIRD || obj == SNAKE || obj == CLAM || obj == OYSTER || obj ==
DWARF || obj == DRAGON || obj == TROLL || obj == BEAR || obj ==
OGRE)SPK=71;
- {RSPEAK(SPK); return 2012;}
}
+ RSPEAK(SPK);
+ return 2012;
}
static int extinguish(int obj)
if (obj == INTRANSITIVE) {
if (HERE(LAMP) && game.prop[LAMP] == 1)obj=LAMP;
if (HERE(URN) && game.prop[URN] == 2)obj=obj*NOBJECTS+URN;
- if (obj == 0 || obj > NOBJECTS) return(8000);
+ if (obj == INTRANSITIVE || obj == 0 || obj > NOBJECTS) return(8000);
}
if (obj == URN) {
game.prop[URN]=game.prop[URN]/2;
SPK=210;
- {RSPEAK(SPK); return 2012;}
+ RSPEAK(SPK);
+ return 2012;
}
- if (obj == LAMP) {
+ else if (obj == LAMP) {
game.prop[LAMP]=0;
RSPEAK(40);
if (DARK(game.loc))
RSPEAK(16);
return(2012);
}
- if (obj == DRAGON || obj == VOLCAN)
+ else if (obj == DRAGON || obj == VOLCAN)
SPK=146;
- {RSPEAK(SPK); return 2012;}
+ RSPEAK(SPK);
+ return 2012;
}
static int feed(long obj)
* mad. Bear, special. */
{
if (obj == BIRD) {
- SPK=100;
- {RSPEAK(SPK); return 2012;}
+ RSPEAK(100);
+ return 2012;
}
if (!(obj != SNAKE && obj != DRAGON && obj != TROLL)) {
- SPK=102;
- if (obj == DRAGON && game.prop[DRAGON] != 0)SPK=110;
- if (obj == TROLL)SPK=182;
+ int spk=102;
+ if (obj == DRAGON && game.prop[DRAGON] != 0)spk=110;
+ if (obj == TROLL)spk=182;
if (obj != SNAKE || game.closed || !HERE(BIRD))
- {RSPEAK(SPK); return 2012;}
- SPK=101;
+ {
+ RSPEAK(spk);
+ return 2012;
+ }
DSTROY(BIRD);
game.prop[BIRD]=0;
- {RSPEAK(SPK); return 2012;}
+ RSPEAK(101);
+ return 2012;
}
if (obj == DWARF) {
if (!HERE(FOOD))
- {RSPEAK(SPK); return 2012;}
- SPK=103;
+ {
+ RSPEAK(SPK); /* FIXME: Defaults from ACTSPK */
+ return 2012;
+ }
game.dflag=game.dflag+2;
- {RSPEAK(SPK); return 2012;}
+ RSPEAK(103);
+ return 2012;
}
if (obj == BEAR) {
if (game.prop[BEAR] == 0)SPK=102;
if (game.prop[BEAR] == 3)SPK=110;
- if (!HERE(FOOD))
- {RSPEAK(SPK); return 2012;}
+ if (!HERE(FOOD)) {
+ RSPEAK(SPK);
+ return 2012;
+ }
DSTROY(FOOD);
game.prop[BEAR]=1;
game.fixed[AXE]=0;
game.prop[AXE]=0;
SPK=168;
- {RSPEAK(SPK); return 2012;}
+ RSPEAK(SPK);
+ return 2012;
}
if (obj == OGRE) {
if (HERE(FOOD))
SPK=202;
- {RSPEAK(SPK); return 2012;}
+ RSPEAK(SPK);
+ return 2012;
}
SPK=14;
- {RSPEAK(SPK); return 2012;}
+ RSPEAK(SPK);
+ return 2012;
}
int fill(long obj)
if (obj == VASE) {
SPK=29;
if (LIQLOC(game.loc) == 0)SPK=144;
- if (LIQLOC(game.loc) == 0 || !TOTING(VASE))
- {RSPEAK(SPK); return 2012;}
+ if (LIQLOC(game.loc) == 0 || !TOTING(VASE)) {
+ RSPEAK(SPK);
+ return 2012;
+ }
RSPEAK(145);
game.prop[VASE]=2;
game.fixed[VASE]= -1;
game.prop[BOTTLE]=1;
if (k == OIL)game.prop[URN]=1;
SPK=211+game.prop[URN];
- {RSPEAK(SPK); return 2012;}
+ RSPEAK(SPK);
+ return 2012;
}
- if (obj != 0 && obj != BOTTLE)
- {RSPEAK(SPK); return 2012;}
+ if (obj != 0 && obj != BOTTLE) {
+ RSPEAK(SPK);
+ return 2012;
+ }
if (obj == 0 && !HERE(BOTTLE))
return(8000);
SPK=107;
game.place[k]= -1;
if (k == OIL)
SPK=108;
- {RSPEAK(SPK); return 2012;}
+ RSPEAK(SPK);
+ return 2012;
}
static int find(token_t obj)
SPK=94;
if (game.closed)SPK=138;
if (TOTING(obj))SPK=24;
- {RSPEAK(SPK); return 2012;}
+ RSPEAK(SPK);
+ return 2012;
}
static int fly(token_t obj)
if (obj == INTRANSITIVE) {
if (game.prop[RUG] != 2)SPK=224;
if (!HERE(RUG))SPK=225;
- if (SPK/2 == 112) {RSPEAK(SPK); return 2012;}
+ if (SPK/2 == 112) {
+ RSPEAK(SPK);
+ return 2012;
+ }
obj=RUG;
}
- if (obj != RUG) {RSPEAK(SPK); return 2012;}
+ if (obj != RUG) {
+ RSPEAK(SPK);
+ return 2012;
+ }
SPK=223;
if (game.prop[RUG] != 2) {RSPEAK(SPK); return 2012;}
game.oldlc2=game.oldloc;
for (i=1; i<=NOBJECTS; i++) {
if (i == BEAR || !TOTING(i))
continue;
- if (SPK == 98)RSPEAK(99);
+ if (SPK == 98)
+ RSPEAK(99);
game.blklin=false;
PSPEAK(i,-1);
game.blklin=true;
}
if (TOTING(BEAR))
SPK=141;
- {RSPEAK(SPK); return 2012;}
+ RSPEAK(SPK);
+ return 2012;
}
int light(token_t obj)
/* Light. Applicable only to lamp and urn. */
{
+ int spk;
if (obj == INTRANSITIVE) {
if (HERE(LAMP) && game.prop[LAMP] == 0 && game.limit >= 0)obj=LAMP;
if (HERE(URN) && game.prop[URN] == 1)obj=obj*NOBJECTS+URN;
- if (obj == 0 || obj > NOBJECTS) return(8000);
+ if (obj == INTRANSITIVE || obj == 0 || obj > NOBJECTS) return(8000);
}
if (obj == URN) {
- SPK=38;
+ spk=38;
if (game.prop[URN] == 0)
- {RSPEAK(SPK); return 2012;}
- SPK=209;
+ {RSPEAK(spk); return 2012;}
+ spk=209;
game.prop[URN]=2;
- {RSPEAK(SPK); return 2012;}
+ RSPEAK(spk);
+ return 2012;
} else {
- if (obj != LAMP) {RSPEAK(SPK); return 2012;}
- SPK=184;
- if (game.limit < 0) {RSPEAK(SPK); return 2012;}
+ if (obj != LAMP)
+ {
+ RSPEAK(spk);
+ return 2012;
+ }
+ spk=184;
+ if (game.limit < 0) {
+ RSPEAK(spk);
+ return 2012;
+ }
game.prop[LAMP]=1;
RSPEAK(39);
- if (game.wzdark) return(2000);
+ if (game.wzdark)
+ return(2000);
return(2012);
}
}
/* Listen. Intransitive only. Print stuff based on objsnd/locsnd. */
{
int i, k;
- SPK=228;
+ int spk=228;
k=LOCSND[game.loc];
if (k != 0) {
RSPEAK(labs(k));
if (k < 0) return(2012);
- SPK=0;
+ spk=0;
}
SETPRM(1,game.zzword,0);
for (i=1; i<=NOBJECTS; i++) {
if (!HERE(i) || OBJSND[i] == 0 || game.prop[i] < 0)
continue;
PSPEAK(i,OBJSND[i]+game.prop[i]);
- SPK=0;
+ spk=0;
if (i == BIRD && OBJSND[i]+game.prop[i] == 8)
DSTROY(BIRD);
}
- {RSPEAK(SPK); return 2012;}
+ RSPEAK(spk);
+ return 2012;
}
static int lock(token_t verb, token_t obj)
if (obj == CAGE)SPK=32;
if (obj == KEYS)SPK=55;
if (obj == GRATE || obj == CHAIN)SPK=31;
- if (SPK != 31 || !HERE(KEYS)) {RSPEAK(SPK); return 2012;}
+ if (SPK != 31 || !HERE(KEYS)) {
+ RSPEAK(SPK);
+ return 2012;
+ }
if (obj == CHAIN)
return chain(verb);
if (game.closng) {
SPK=130;
if (!game.panic)game.clock2=15;
game.panic=true;
- {RSPEAK(SPK); return 2012;}
+ RSPEAK(SPK);
+ return 2012;
}
SPK=34+game.prop[GRATE];
game.prop[GRATE]=1;
if (verb == LOCK)game.prop[GRATE]=0;
SPK=SPK+2*game.prop[GRATE];
- {RSPEAK(SPK); return 2012;}
+ RSPEAK(SPK);
+ return 2012;
}
static int pour(token_t obj)
game.prop[DOOR]=0;
if (obj == OIL)game.prop[DOOR]=1;
SPK=113+game.prop[DOOR];
- {RSPEAK(SPK); return 2012;}
+ RSPEAK(SPK);
+ return 2012;
}
}
--game.tally;
DROP(CAVITY,game.loc);
SPK=216;
- {RSPEAK(SPK); return 2012;}
+ RSPEAK(SPK);
+ return 2012;
}
static int say(void)
return(2630);
}
RSPEAK(258);
- return(2012);
+ return 2012;
}
* troll. Treasures special for troll. */
{
if (TOTING(ROD2) && obj == ROD && !TOTING(ROD))obj=ROD2;
- if (!TOTING(obj))
- {RSPEAK(SPK); return 2012;}
+ if (!TOTING(obj)) {
+ RSPEAK(SPK); /* FIXME: Defaults from ACTSPK */
+ return 2012;
+ }
if (obj >= 50 && obj <= MAXTRS && AT(TROLL)) {
SPK=159;
/* Snarf a treasure for the troll. */
DROP(TROLL2,PLAC[TROLL]);
DROP(TROLL2+NOBJECTS,FIXD[TROLL]);
JUGGLE(CHASM);
- {RSPEAK(SPK); return 2012;}
+ RSPEAK(SPK);
+ return 2012;
}
if (obj == FOOD && HERE(BEAR)) {
/* But throwing food is another story. */
/* Score. Call scoring routine but tell it to return. */
{
score(-1);
- return(2012);
+ return 2012;
}
static int wake(token_t obj)
/* Wake. Only use is to disturb the dwarves. */
{
if (obj != DWARF || !game.closed) {RSPEAK(SPK); return 2012;}
- SPK=199;
- return(18999);
+ RSPEAK(199);
+ return(19000);
}
static int wave(token_t obj)
if ((!TOTING(obj)) && (obj != ROD || !TOTING(ROD2)))SPK=29;
if (obj != ROD ||
!TOTING(obj) ||
- (!HERE(BIRD) && (game.closng || !AT(FISSUR))))
- {RSPEAK(SPK); return 2012;}
+ (!HERE(BIRD) && (game.closng || !AT(FISSUR)))) {
+ RSPEAK(SPK);
+ return 2012;
+ }
if (HERE(BIRD))SPK=206+MOD(game.prop[BIRD],2);
if (SPK == 206 && game.loc == game.place[STEPS] && game.prop[JADE] < 0) {
DROP(JADE,game.loc);
game.prop[JADE]=0;
--game.tally;
SPK=208;
- {RSPEAK(SPK); return 2012;}
+ RSPEAK(SPK);
+ return 2012;
} else {
- if (game.closed) return(18999);
+ if (game.closed) {
+ RSPEAK(SPK); /* FIXME: How is SPK set here? */
+ return(19000);
+ }
if (game.closng || !AT(FISSUR)) {RSPEAK(SPK); return 2012;}
if (HERE(BIRD))RSPEAK(SPK);
game.prop[FISSUR]=1-game.prop[FISSUR];
PSPEAK(FISSUR,2-game.prop[FISSUR]);
- return(2012);
+ return 2012;
}
}
case 1: /* DROP */ return(8000);
case 2: /* SAY */ return(8000);
case 3: /* UNLOC */ return lock(verb, INTRANSITIVE);
- case 4: /* NOTHI */ return(2009);
+ case 4: /* NOTHI */ {RSPEAK(54); return(20012);}
case 5: /* LOCK */ return lock(verb, INTRANSITIVE);
case 6: /* LIGHT */ return light(INTRANSITIVE);
case 7: /* EXTIN */ return extinguish(INTRANSITIVE);
case 1: /* DROP */ return discard(obj, false);
case 2: /* SAY */ return say();
case 3: /* UNLOC */ return lock(verb, obj);
- case 4: /* NOTHI */ return(2009);
+ case 4: /* NOTHI */ {RSPEAK(54); return(20012);}
case 5: /* LOCK */ return lock(verb, obj);
case 6: /* LIGHT */ return light(obj);
case 7: /* EXTI */ return extinguish(obj);