return GO_CLEAROBJ;
}
DESTROY(BIRD);
- game.prop[BIRD] = 0;
spk = BIRD_DEAD;
} else if (obj == VEND) {
- pspeak(VEND, game.prop[VEND] + 2);
- game.prop[VEND] = 3 - game.prop[VEND];
+ bool blocking = (game.prop[VEND] == VEND_BLOCKS);
+ game.prop[VEND] = blocking ? VEND_UNBLOCKS : VEND_BLOCKS;
+ rspeak(blocking ? MACHINE_SWINGOUT : MACHINE_SWINGBACK);
return GO_CLEAROBJ;
}
GETIN(input, &command->wd1, &command->wd1x, &command->wd2, &command->wd2x);
if (command->wd1 != MAKEWD(WORD_YINIT) && command->wd1 != MAKEWD(WORD_YES))
return GO_CHECKFOO;
- pspeak(DRAGON, 3);
+ pspeak(DRAGON, look, 3);
game.prop[DRAGON] = 1;
game.prop[RUG] = 0;
- int k = (PLAC[DRAGON] + FIXD[DRAGON]) / 2;
+ int k = (object_descriptions[DRAGON].plac + object_descriptions[DRAGON].fixd) / 2;
MOVE(DRAGON + NOBJECTS, -1);
MOVE(RUG + NOBJECTS, 0);
MOVE(DRAGON, k);
MOVE(RUG, k);
DROP(BLOOD, k);
for (obj = 1; obj <= NOBJECTS; obj++) {
- if (game.place[obj] == PLAC[DRAGON] || game.place[obj] == FIXD[DRAGON])
+ if (game.place[obj] == object_descriptions[DRAGON].plac || game.place[obj] == object_descriptions[DRAGON].fixd)
MOVE(obj, k);
}
game.loc = k;
return GO_CLEAROBJ;
}
game.foobar = 0;
- if (game.place[EGGS] == PLAC[EGGS] || (TOTING(EGGS) && game.loc == PLAC[EGGS])) {
+ if (game.place[EGGS] == object_descriptions[EGGS].plac || (TOTING(EGGS) && game.loc == object_descriptions[EGGS].plac)) {
rspeak(spk);
return GO_CLEAROBJ;
} else {
game.prop[TROLL] = 1;
k = 2;
if (HERE(EGGS))k = 1;
- if (game.loc == PLAC[EGGS])k = 0;
- MOVE(EGGS, PLAC[EGGS]);
- pspeak(EGGS, k);
+ if (game.loc == object_descriptions[EGGS].plac)k = 0;
+ MOVE(EGGS, object_descriptions[EGGS].plac);
+ pspeak(EGGS, look, k);
return GO_CLEAROBJ;
}
}
}
if (obj == WATER || obj == OIL) {
if (!HERE(BOTTLE) || LIQUID() != obj) {
- if (TOTING(BOTTLE) && game.prop[BOTTLE] == 1)
+ if (TOTING(BOTTLE) && game.prop[BOTTLE] == EMPTY_BOTTLE)
return (fill(verb, BOTTLE));
else {
- if (game.prop[BOTTLE] != 1)spk = BOTTLE_FULL;
+ if (game.prop[BOTTLE] != EMPTY_BOTTLE)
+ spk = BOTTLE_FULL;
if (!TOTING(BOTTLE))spk = NO_CONTAINER;
rspeak(spk);
return GO_CLEAROBJ;
if (game.holdng >= INVLIMIT) {
rspeak(spk);
return GO_CLEAROBJ;
- } else if (obj == BIRD && game.prop[BIRD] != 1 && -1 - game.prop[BIRD] != 1) {
- if (game.prop[BIRD] == 2) {
+ } else if (obj == BIRD && game.prop[BIRD] != BIRD_CAGED && -1 - game.prop[BIRD] != BIRD_CAGED) {
+ if (game.prop[BIRD] == BIRD_FOREST_UNCAGED) {
DESTROY(BIRD);
rspeak(BIRD_CRAP);
return GO_CLEAROBJ;
rspeak(spk);
return GO_CLEAROBJ;
}
- game.prop[BIRD] = 1;
+ game.prop[BIRD] = BIRD_CAGED;
}
- if ((obj == BIRD || obj == CAGE) && (game.prop[BIRD] == 1 || -1 - game.prop[BIRD] == 1))
+ if ((obj == BIRD || obj == CAGE) && (game.prop[BIRD] == BIRD_CAGED || -1 - game.prop[BIRD] == 1))
CARRY(BIRD + CAGE - obj, game.loc);
CARRY(obj, game.loc);
if (obj == BOTTLE && LIQUID() != 0)
} else {
spk = CHAIN_LOCKED;
if (game.prop[CHAIN] != 0)spk = ALREADY_LOCKED;
- if (game.loc != PLAC[CHAIN])spk = NO_LOCKSITE;
+ if (game.loc != object_descriptions[CHAIN].plac)spk = NO_LOCKSITE;
if (spk != CHAIN_LOCKED) {
rspeak(spk);
return GO_CLEAROBJ;
if (spk != RUG_WIGGLES) {
int k = 2 - game.prop[RUG];
game.prop[RUG] = k;
- if (k == 2) k = PLAC[SAPPH];
+ if (k == 2) k = object_descriptions[SAPPH].plac;
MOVE(RUG + NOBJECTS, k);
}
}
} else if (obj == COINS && HERE(VEND)) {
DESTROY(COINS);
DROP(BATTERY, game.loc);
- pspeak(BATTERY, 0);
+ pspeak(BATTERY, look, FRESH_BATTERIES);
return GO_CLEAROBJ;
} else if (obj == BIRD && AT(DRAGON) && game.prop[DRAGON] == 0) {
rspeak(BIRD_BURNT);
DESTROY(BIRD);
- game.prop[BIRD] = 0;
return GO_CLEAROBJ;
} else if (obj == BEAR && AT(TROLL)) {
rspeak(TROLL_SCAMPERS);
MOVE(TROLL, 0);
MOVE(TROLL + NOBJECTS, 0);
- MOVE(TROLL2, PLAC[TROLL]);
- MOVE(TROLL2 + NOBJECTS, FIXD[TROLL]);
+ MOVE(TROLL2, object_descriptions[TROLL].plac);
+ MOVE(TROLL2 + NOBJECTS, object_descriptions[TROLL].fixd);
JUGGLE(CHASM);
game.prop[TROLL] = 2;
- } else if (obj != VASE || game.loc == PLAC[PILLOW]) {
+ } else if (obj != VASE || game.loc == object_descriptions[PILLOW].plac) {
rspeak(OK_MAN);
} else {
game.prop[VASE] = 2;
if (AT(PILLOW))game.prop[VASE] = 0;
- pspeak(VASE, game.prop[VASE] + 1);
+ pspeak(VASE, look, game.prop[VASE] + 1);
if (game.prop[VASE] != 0)game.fixed[VASE] = -1;
}
}
if (k == obj)obj = BOTTLE;
if (obj == BOTTLE && k != 0)
game.place[k] = LOC_NOWHERE;
- if (obj == CAGE && game.prop[BIRD] == 1)DROP(BIRD, game.loc);
+ if (obj == CAGE && game.prop[BIRD] == BIRD_CAGED)
+ DROP(BIRD, game.loc);
DROP(obj, game.loc);
if (obj != BIRD) return GO_CLEAROBJ;
- game.prop[BIRD] = 0;
- if (FOREST(game.loc))game.prop[BIRD] = 2;
+ game.prop[BIRD] = BIRD_UNCAGED;
+ if (FOREST(game.loc))
+ game.prop[BIRD] = BIRD_FOREST_UNCAGED;
return GO_CLEAROBJ;
}
if (obj != BLOOD) {
if (obj != 0 && obj != WATER)spk = RIDICULOUS_ATTEMPT;
if (spk != RIDICULOUS_ATTEMPT && LIQUID() == WATER && HERE(BOTTLE)) {
- game.prop[BOTTLE] = 1;
+ game.prop[BOTTLE] = EMPTY_BOTTLE;
game.place[WATER] = LOC_NOWHERE;
spk = BOTTLE_EMPTY;
}
} else {
DESTROY(BLOOD);
game.prop[DRAGON] = 2;
- OBJSND[BIRD] = OBJSND[BIRD] + 3;
+ game.blooded = true;
spk = HEAD_BUZZES;
}
rspeak(spk);
{
int spk = ACTSPK[verb];
if (obj == INTRANSITIVE) {
- if (HERE(LAMP) && game.prop[LAMP] == 1)obj = LAMP;
+ if (HERE(LAMP) && game.prop[LAMP] == LAMP_BRIGHT)
+ obj = LAMP;
if (HERE(URN) && game.prop[URN] == 2)obj = obj * NOBJECTS + URN;
if (obj == INTRANSITIVE || obj == 0 || obj > NOBJECTS) return GO_UNKNOWN;
}
game.prop[URN] = game.prop[URN] / 2;
spk = URN_DARK;
} else if (obj == LAMP) {
- game.prop[LAMP] = 0;
+ game.prop[LAMP] = LAMP_DARK;
rspeak(LAMP_OFF);
spk = DARK(game.loc) ? PITCH_DARK : NO_MESSAGE;
} else if (obj == DRAGON || obj == VOLCANO)
if (obj == TROLL)spk = TROLL_VICES;
if (obj == SNAKE && !game.closed && HERE(BIRD)) {
DESTROY(BIRD);
- game.prop[BIRD] = 0;
spk = BIRD_DEVOURED;
}
} else if (obj == DWARF) {
return GO_CLEAROBJ;
}
game.place[k] = LOC_NOWHERE;
- game.prop[BOTTLE] = 1;
+ game.prop[BOTTLE] = EMPTY_BOTTLE;
if (k == OIL)game.prop[URN] = 1;
spk = WATER_URN + game.prop[URN];
rspeak(spk);
if (LIQUID() != 0)
spk = BOTTLE_FULL;
if (spk == BOTTLED_WATER) {
+ /* FIXME: Arithmetic on property values */
game.prop[BOTTLE] = MOD(conditions[game.loc], 4) / 2 * 2;
k = LIQUID();
if (TOTING(BOTTLE))
if (spk == NO_CARRY)
rspeak(NOW_HOLDING);
game.blklin = false;
- pspeak(i, -1);
+ pspeak(i, touch, -1);
game.blklin = true;
spk = NO_MESSAGE;
}
{
int spk = ACTSPK[verb];
if (obj == INTRANSITIVE) {
- if (HERE(LAMP) && game.prop[LAMP] == 0 && game.limit >= 0)obj = LAMP;
+ if (HERE(LAMP) && game.prop[LAMP] == LAMP_DARK && game.limit >= 0)
+ obj = LAMP;
if (HERE(URN) && game.prop[URN] == 1)obj = obj * NOBJECTS + URN;
if (obj == INTRANSITIVE || obj == 0 || obj > NOBJECTS) return GO_UNKNOWN;
}
rspeak(spk);
return GO_CLEAROBJ;
}
- game.prop[LAMP] = 1;
+ game.prop[LAMP] = LAMP_BRIGHT;
rspeak(LAMP_ON);
if (game.wzdark)
return GO_TOP;
int spk = ALL_SILENT;
k = locations[game.loc].sound;
if (k != SILENT) {
- rspeak(labs(k));
- if (k < 0) return GO_CLEAROBJ;
- spk = NO_MESSAGE;
+ rspeak(k);
+ if (locations[game.loc].loud)
+ return GO_CLEAROBJ;
+ else
+ spk = NO_MESSAGE;
}
for (int i = 1; i <= NOBJECTS; i++) {
- if (!HERE(i) || OBJSND[i] == 0 || game.prop[i] < 0)
+ if (!HERE(i) || object_descriptions[i].sounds[0] == NULL || game.prop[i] < 0)
continue;
- pspeak(i, OBJSND[i] + game.prop[i], game.zzword);
+ int mi = game.prop[i];
+ if (i == BIRD)
+ mi += 3 * game.blooded;
+ pspeak(i, hear, mi, game.zzword);
spk = NO_MESSAGE;
- if (i == BIRD && OBJSND[i] + game.prop[i] == 8)
+ /* FIXME: Magic number, sensitive to bird state logic */
+ if (i == BIRD && game.prop[i] == 5)
DESTROY(BIRD);
}
rspeak(spk);
if (!game.panic)game.clock2 = PANICTIME;
game.panic = true;
} else {
- game.prop[GRATE] = (verb == LOCK) ? 0 : 1;
+ game.prop[GRATE] = (verb == LOCK) ? GRATE_CLOSED : GRATE_OPEN;
spk = game.prop[GRATE] ? GRATE_UNLOCKED : GRATE_LOCKED;
}
}
}
if (HERE(URN) && game.prop[URN] == 0)
return fill(verb, URN);
- game.prop[BOTTLE] = 1;
+ game.prop[BOTTLE] = EMPTY_BOTTLE;
game.place[obj] = LOC_NOWHERE;
spk = GROUND_WET;
if (!(AT(PLANT) || AT(DOOR))) {
rspeak(spk);
return GO_CLEAROBJ;
}
- pspeak(PLANT, game.prop[PLANT] + 3);
+ pspeak(PLANT, look, game.prop[PLANT] + 3);
game.prop[PLANT] = MOD(game.prop[PLANT] + 1, 3);
game.prop[PLANT2] = game.prop[PLANT];
return GO_MOVE;
if (command.obj == INTRANSITIVE) {
command.obj = 0;
for (int i = 1; i <= NOBJECTS; i++) {
- if (HERE(i) && OBJTXT[i] != 0 && game.prop[i] >= 0)
+ if (HERE(i) && object_descriptions[i].texts[0] != NULL && game.prop[i] >= 0)
command.obj = command.obj * NOBJECTS + i;
}
if (command.obj > NOBJECTS || command.obj == 0 || DARK(game.loc))
if (DARK(game.loc)) {
rspeak(NO_SEE, command.wd1, command.wd1x);
- } else if (OBJTXT[command.obj] == 0 || game.prop[command.obj] < 0) {
- rspeak(ACTSPK[command.verb]);
- } else if (command.obj == OYSTER && !game.clshnt) {
+ } else if (command.obj == OYSTER && !game.clshnt && game.closed) {
game.clshnt = YES(arbitrary_messages[CLUE_QUERY], arbitrary_messages[WAYOUT_CLUE], arbitrary_messages[OK_MAN]);
+ } else if (object_descriptions[command.obj].texts[0] == NULL || game.prop[command.obj] < 0) {
+ rspeak(ACTSPK[command.verb]);
} else
- pspeak(command.obj, OBJTXT[command.obj] + game.prop[command.obj]);
+ pspeak(command.obj, study, game.prop[command.obj]);
return GO_CLEAROBJ;
}
rspeak(NOTHING_HAPPENS);
return GO_CLEAROBJ;
} else {
- pspeak(RESER, game.prop[RESER] + 1);
+ pspeak(RESER, look, game.prop[RESER] + 1);
game.prop[RESER] = 1 - game.prop[RESER];
if (AT(RESER))
return GO_CLEAROBJ;
rspeak(spk);
return GO_CLEAROBJ;
}
- if (command->obj >= MINTRS && command->obj <= MAXTRS && AT(TROLL)) {
+ if (object_descriptions[command->obj].is_treasure && AT(TROLL)) {
spk = TROLL_SATISFIED;
/* Snarf a treasure for the troll. */
DROP(command->obj, 0);
MOVE(TROLL, 0);
MOVE(TROLL + NOBJECTS, 0);
- DROP(TROLL2, PLAC[TROLL]);
- DROP(TROLL2 + NOBJECTS, FIXD[TROLL]);
+ DROP(TROLL2, object_descriptions[TROLL].plac);
+ DROP(TROLL2 + NOBJECTS, object_descriptions[TROLL].fixd);
JUGGLE(CHASM);
rspeak(spk);
return GO_CLEAROBJ;
rspeak(spk);
return GO_CLEAROBJ;
}
- if (HERE(BIRD))spk = FREE_FLY + MOD(game.prop[BIRD], 2);
+ /* FIXME: Arithemetic on proprty values */
+ if (HERE(BIRD))
+ spk = FREE_FLY + MOD(game.prop[BIRD], 2);
if (spk == FREE_FLY && game.loc == game.place[STEPS] && game.prop[JADE] < 0) {
DROP(JADE, game.loc);
game.prop[JADE] = 0;
}
if (HERE(BIRD))rspeak(spk);
game.prop[FISSURE] = 1 - game.prop[FISSURE];
- pspeak(FISSURE, 2 - game.prop[FISSURE]);
+ pspeak(FISSURE, look, 2 - game.prop[FISSURE]);
return GO_CLEAROBJ;
}
}