* notes). */
static void checkhints(void)
{
- if (COND[game.loc] >= game.conds) {
- for (int hint = 1; hint <= HNTMAX; hint++) {
+ if (conditions[game.loc] >= game.conds) {
+ for (int hint = 0; hint < NHINTS; hint++) {
if (game.hinted[hint])
continue;
- if (!CNDBIT(game.loc, hint + HBASE))
+ if (!CNDBIT(game.loc, hint + 1 + COND_HBASE))
game.hintlc[hint] = -1;
++game.hintlc[hint];
/* Come here if he's been long enough at required loc(s) for some
* unused hint. */
- if (game.hintlc[hint] >= hints[hint-1].turns) {
+ if (game.hintlc[hint] >= hints[hint].turns) {
int i;
- switch (hint - 1) {
+ switch (hint) {
case 0:
/* cave */
- if (game.prop[GRATE] == 0 && !HERE(KEYS))
+ if (game.prop[GRATE] == GRATE_CLOSED && !HERE(KEYS))
break;
game.hintlc[hint] = 0;
return;
/* Fall through to hint display */
game.hintlc[hint] = 0;
- if (!YES(hints[hint-1].question, arbitrary_messages[NO_MESSAGE], arbitrary_messages[OK_MAN]))
+ if (!YES(hints[hint].question, arbitrary_messages[NO_MESSAGE], arbitrary_messages[OK_MAN]))
return;
- rspeak(HINT_COST, hints[hint-1].penalty, hints[hint-1].penalty);
- game.hinted[hint] = YES(arbitrary_messages[WANT_HINT], hints[hint-1].hint, arbitrary_messages[OK_MAN]);
+ rspeak(HINT_COST, hints[hint].penalty, hints[hint].penalty);
+ game.hinted[hint] = YES(arbitrary_messages[WANT_HINT], hints[hint].hint, arbitrary_messages[OK_MAN]);
if (game.hinted[hint] && game.limit > WARNTIME)
- game.limit += WARNTIME * hints[hint-1].penalty;
+ game.limit += WARNTIME * hints[hint].penalty;
}
}
}
return true;
int snarfed = 0;
bool movechest = false, robplayer = false;
- for (int treasure = MINTRS; treasure <= MAXTRS; treasure++) {
+ for (int treasure = 1; treasure <= NOBJECTS; treasure++) {
+ if (!object_descriptions[treasure].is_treasure)
+ continue;
/* Pirate won't take pyramid from plover room or dark
* room (too easy!). */
- if (treasure == PYRAMID && (game.loc == PLAC[PYRAMID] || game.loc == PLAC[EMERALD])) {
+ if (treasure == PYRAMID && (game.loc == object_descriptions[PYRAMID].plac || game.loc == object_descriptions[EMERALD].plac)) {
continue;
}
if (TOTING(treasure) || HERE(treasure))
}
}
/* Force chest placement before player finds last treasure */
- if (game.tally == 1 && snarfed == 0 && game.place[CHEST] == LOC_NOWHERE && HERE(LAMP) && game.prop[LAMP] == 1) {
+ if (game.tally == 1 && snarfed == 0 && game.place[CHEST] == LOC_NOWHERE && HERE(LAMP) && game.prop[LAMP] == LAMP_BRIGHT) {
rspeak(PIRATE_SPOTTED);
movechest = true;
}
}
if (robplayer) {
rspeak(PIRATE_POUNCES);
- for (int treasure = MINTRS; treasure <= MAXTRS; treasure++) {
- if (!(treasure == PYRAMID && (game.loc == PLAC[PYRAMID] || game.loc == PLAC[EMERALD]))) {
+ for (int treasure = 1; treasure <= NOBJECTS; treasure++) {
+ if (!object_descriptions[treasure].is_treasure)
+ continue;
+ if (!(treasure == PYRAMID && (game.loc == object_descriptions[PYRAMID].plac || game.loc == object_descriptions[EMERALD].plac))) {
if (AT(treasure) && game.fixed[treasure] == 0)
CARRY(treasure, game.loc);
if (TOTING(treasure))
* means dwarves won't follow him into dead end in maze, but
* c'est la vie. They'll wait for him outside the dead
* end. */
- if (game.loc == 0 || FORCED(game.loc) || CNDBIT(game.newloc, NOARRR))
+ if (game.loc == 0 || FORCED(game.loc) || CNDBIT(game.newloc, COND_NOARRR))
return true;
/* Dwarf activity level ratchets up */
* the 5 dwarves. If any of the survivors is at loc,
* replace him with the alternate. */
if (game.dflag == 1) {
- if (!INDEEP(game.loc) || (PCT(95) && (!CNDBIT(game.loc, NOBACK) || PCT(85))))
+ if (!INDEEP(game.loc) || (PCT(95) && (!CNDBIT(game.loc, COND_NOBACK) || PCT(85))))
return true;
game.dflag = 2;
for (int i = 1; i <= 2; i++) {
j >= 20 ||
game.newloc == game.dloc[i] ||
FORCED(game.newloc) ||
- (i == PIRATE && CNDBIT(game.newloc, NOARRR)) ||
+ (i == PIRATE && CNDBIT(game.newloc, COND_NOARRR)) ||
labs(TRAVEL[kk]) / 1000000 == 100);
if (!avoided) {
tk[j++] = game.newloc;
/* "You're dead, Jim."
*
* If the current loc is zero, it means the clown got himself killed.
- * We'll allow this maxdie times. maximum_deaths is automatically set based
+ * We'll allow this maxdie times. NDEATHS is automatically set based
* on the number of snide messages available. Each death results in
* a message (81, 83, etc.) which offers reincarnation; if accepted,
* this results in message 82, 84, etc. The last time, if he wants
* death and exit. */
rspeak(DEATH_CLOSING);
terminate(endgame);
- } else if (game.numdie == maximum_deaths || !YES(query, yes_response, arbitrary_messages[OK_MAN]))
+ } else if (game.numdie == NDEATHS || !YES(query, yes_response, arbitrary_messages[OK_MAN]))
terminate(endgame);
else {
game.place[WATER] = game.place[OIL] = LOC_NOWHERE;
if (TOTING(LAMP))
- game.prop[LAMP] = 0;
+ game.prop[LAMP] = LAMP_DARK;
for (int j = 1; j <= NOBJECTS; j++) {
int i = NOBJECTS + 1 - j;
if (TOTING(i)) {
game.oldloc = game.loc;
k2 = 0;
if (motion == game.loc)k2 = FORGOT_PATH;
- if (CNDBIT(game.loc, NOBACK))k2 = TWIST_TURN;
+ if (CNDBIT(game.loc, COND_NOBACK))k2 = TWIST_TURN;
if (k2 == 0) {
for (;;) {
scratchloc = MOD((labs(TRAVEL[kk]) / 1000), 1000);
* and block him. (standard travel entries check for
* game.prop(TROLL)=0.) Special stuff for bear. */
if (game.prop[TROLL] == 1) {
- pspeak(TROLL, 1);
+ pspeak(TROLL,look, 1);
game.prop[TROLL] = 0;
MOVE(TROLL2, 0);
MOVE(TROLL2 + NOBJECTS, 0);
- MOVE(TROLL, PLAC[TROLL]);
- MOVE(TROLL + NOBJECTS, FIXD[TROLL]);
+ MOVE(TROLL, object_descriptions[TROLL].plac);
+ MOVE(TROLL + NOBJECTS, object_descriptions[TROLL].fixd);
JUGGLE(CHASM);
game.newloc = game.loc;
return true;
} else {
- game.newloc = PLAC[TROLL] + FIXD[TROLL] - game.loc;
+ game.newloc = object_descriptions[TROLL].plac + object_descriptions[TROLL].fixd - game.loc;
if (game.prop[TROLL] == 0)game.prop[TROLL] = 1;
if (!TOTING(BEAR)) return true;
rspeak(BRIDGE_COLLAPSE);
* know the bivalve is an oyster. *And*, the dwarves must
* have been activated, since we've found chest. */
if (game.clock1 == 0) {
- game.prop[GRATE] = 0;
+ game.prop[GRATE] = GRATE_CLOSED;
game.prop[FISSURE] = 0;
for (int i = 1; i <= NDWARVES; i++) {
game.dseen[i] = false;
}
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);
if (game.prop[BEAR] != 3)DESTROY(BEAR);
game.prop[CHAIN] = 0;
* objects he might be carrying (lest he have some which
* could cause trouble, such as the keys). We describe the
* flash of light and trundle back. */
- game.prop[BOTTLE] = PUT(BOTTLE, LOC_NE, 1);
+ game.prop[BOTTLE] = PUT(BOTTLE, LOC_NE, EMPTY_BOTTLE);
game.prop[PLANT] = PUT(PLANT, LOC_NE, 0);
game.prop[OYSTER] = PUT(OYSTER, LOC_NE, 0);
- OBJTXT[OYSTER] = 3;
game.prop[LAMP] = PUT(LAMP, LOC_NE, 0);
game.prop[ROD] = PUT(ROD, LOC_NE, 0);
game.prop[DWARF] = PUT(DWARF, LOC_NE, 0);
* Reuse sign. */
PUT(GRATE, LOC_SW, 0);
PUT(SIGN, LOC_SW, 0);
- ++OBJTXT[SIGN];
+ game.prop[SIGN] = ENDGAME_SIGN;
game.prop[SNAKE] = PUT(SNAKE, LOC_SW, 1);
game.prop[BIRD] = PUT(BIRD, LOC_SW, 1);
game.prop[CAGE] = PUT(CAGE, LOC_SW, 0);
static void lampcheck(void)
/* Check game limit and lamp timers */
{
- if (game.prop[LAMP] == 1)
+ if (game.prop[LAMP] == LAMP_BRIGHT)
--game.limit;
/* Another way we can force an end to things is by having the
* here, in which case we replace the batteries and continue.
* Second is for other cases of lamp dying. Eve after it goes
* out, he can explore outside for a while if desired. */
- if (game.limit <= WARNTIME && HERE(BATTERY) && game.prop[BATTERY] == 0 && HERE(LAMP)) {
+ if (game.limit <= WARNTIME && HERE(BATTERY) && game.prop[BATTERY] == FRESH_BATTERIES && HERE(LAMP)) {
rspeak(REPLACE_BATTERIES);
- game.prop[BATTERY] = 1;
+ game.prop[BATTERY] = DEAD_BATTERIES;
if (TOTING(BATTERY))
DROP(BATTERY, game.loc);
game.limit += BATTERYLIFE;
game.lmwarn = false;
} else if (game.limit == 0) {
game.limit = -1;
- game.prop[LAMP] = 0;
+ game.prop[LAMP] = LAMP_DARK;
if (HERE(LAMP))
rspeak(LAMP_OUT);
} else if (game.limit <= WARNTIME) {
game.lmwarn = true;
int spk = GET_BATTERIES;
if (game.place[BATTERY] == LOC_NOWHERE)spk = LAMP_DIM;
- if (game.prop[BATTERY] == 1)spk = MISSING_BATTERYIES;
+ if (game.prop[BATTERY] == DEAD_BATTERIES)
+ spk = MISSING_BATTERIES;
rspeak(spk);
}
}
int kk = game.prop[obj];
if (obj == STEPS && game.loc == game.fixed[STEPS])
kk = 1;
- pspeak(obj, kk);
+ pspeak(obj, look, kk);
}
}
}
* wants to go. If so, the dwarf's blocking his way. If
* coming from place forbidden to pirate (dwarves rooted in
* place) let him get out (and attacked). */
- if (game.newloc != game.loc && !FORCED(game.loc) && !CNDBIT(game.loc, NOARRR)) {
+ if (game.newloc != game.loc && !FORCED(game.loc) && !CNDBIT(game.loc, COND_NOARRR)) {
for (size_t i = 1; i <= NDWARVES - 1; i++) {
if (game.odloc[i] == game.newloc && game.dseen[i]) {
game.newloc = game.loc;
* tick game.clock1 unless well into cave (and not at Y2). */
if (game.closed) {
if (game.prop[OYSTER] < 0 && TOTING(OYSTER))
- pspeak(OYSTER, 1);
+ pspeak(OYSTER, look, 1);
for (size_t i = 1; i <= NOBJECTS; i++) {
if (TOTING(i) && game.prop[i] < 0)
game.prop[i] = -1 - game.prop[i];
/* If a turn threshold has been met, apply penalties and tell
* the player about it. */
- for (int i = 0; i < turn_threshold_count; ++i)
+ for (int i = 0; i < NTHRESHOLDS; ++i)
{
if (game.turns == turn_thresholds[i].threshold + 1)
{