char rawbuf[LINESIZE], INLINE[LINESIZE + 1];
long AMBER, AXE, BACK, BATTERY, BEAR, BIRD, BLOOD,
char rawbuf[LINESIZE], INLINE[LINESIZE + 1];
long AMBER, AXE, BACK, BATTERY, BEAR, BIRD, BLOOD,
RUBY, RUG, SAPPH, SAY, SIGN, SNAKE,
STEPS, STREAM, THROW, TRIDENT, TROLL, TROLL2,
URN, VASE, VEND, VOLCANO, WATER;
RUBY, RUG, SAPPH, SAY, SIGN, SNAKE,
STEPS, STREAM, THROW, TRIDENT, TROLL, TROLL2,
URN, VASE, VEND, VOLCANO, WATER;
- if (!YES(arbitrary_messages[HINTS[hint][3]], arbitrary_messages[NO_MESSAGE], arbitrary_messages[OK_MAN]))
+ if (!YES(hints[hint].question, arbitrary_messages[NO_MESSAGE], arbitrary_messages[OK_MAN]))
- SETPRM(1, HINTS[hint][2], HINTS[hint][2]);
- RSPEAK(HINT_COST);
- game.hinted[hint] = YES(arbitrary_messages[WANT_HINT], arbitrary_messages[HINTS[hint][4]], 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.tally == 1 && snarfed == 0 && game.place[CHEST] == LOC_NOWHERE && HERE(LAMP) && game.prop[LAMP] == 1) {
- RSPEAK(PIRATE_SPOTTED);
+ if (game.tally == 1 && snarfed == 0 && game.place[CHEST] == LOC_NOWHERE && HERE(LAMP) && game.prop[LAMP] == LAMP_BRIGHT) {
+ rspeak(PIRATE_SPOTTED);
/* You might get a hint of the pirate's presence even if the
* chest doesn't move... */
if (game.odloc[PIRATE] != game.dloc[PIRATE] && PCT(20))
/* You might get a hint of the pirate's presence even if the
* chest doesn't move... */
if (game.odloc[PIRATE] != game.dloc[PIRATE] && PCT(20))
- RSPEAK(PIRATE_POUNCES);
- for (int treasure = MINTRS; treasure <= MAXTRS; treasure++) {
- if (!(treasure == PYRAMID && (game.loc == PLAC[PYRAMID] || game.loc == PLAC[EMERALD]))) {
+ rspeak(PIRATE_POUNCES);
+ 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))
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. */
* 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. */
* the 5 dwarves. If any of the survivors is at loc,
* replace him with the alternate. */
if (game.dflag == 1) {
* the 5 dwarves. If any of the survivors is at loc,
* replace him with the alternate. */
if (game.dflag == 1) {
/* Now we know what's happening. Let's tell the poor sucker about it.
* Note that various of the "knife" messages must have specific relative
/* Now we know what's happening. Let's tell the poor sucker about it.
* Note that various of the "knife" messages must have specific relative
- SETPRM(1, game.dtotal, 0);
- RSPEAK(game.dtotal == 1 ? DWARF_SINGLE : DWARF_PACK);
+ rspeak(game.dtotal == 1 ? DWARF_SINGLE : DWARF_PACK, game.dtotal);
* 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
* 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
++game.detail;
game.wzdark = false;
game.abbrev[game.loc] = 0;
return true;
} else if (motion == CAVE) {
/* Cave. Different messages depending on whether above ground. */
++game.detail;
game.wzdark = false;
game.abbrev[game.loc] = 0;
return true;
} else if (motion == CAVE) {
/* Cave. Different messages depending on whether above ground. */
if (verb == FIND || verb == INVENT)spk = NEARBY;
if (motion == 62 || motion == 65)spk = NOTHING_HAPPENS;
if (motion == 17)spk = WHICH_WAY;
if (verb == FIND || verb == INVENT)spk = NEARBY;
if (motion == 62 || motion == 65)spk = NOTHING_HAPPENS;
if (motion == 17)spk = WHICH_WAY;
* and block him. (standard travel entries check for
* game.prop(TROLL)=0.) Special stuff for bear. */
if (game.prop[TROLL] == 1) {
* and block him. (standard travel entries check for
* game.prop(TROLL)=0.) Special stuff for bear. */
if (game.prop[TROLL] == 1) {
- MOVE(TROLL, PLAC[TROLL]);
- MOVE(TROLL + NOBJECTS, FIXD[TROLL]);
+ MOVE(TROLL, object_descriptions[TROLL].plac);
+ MOVE(TROLL + NOBJECTS, object_descriptions[TROLL].fixd);
* know the bivalve is an oyster. *And*, the dwarves must
* have been activated, since we've found chest. */
if (game.clock1 == 0) {
* know the bivalve is an oyster. *And*, the dwarves must
* have been activated, since we've found chest. */
if (game.clock1 == 0) {
- MOVE(TROLL2, PLAC[TROLL]);
- MOVE(TROLL2 + NOBJECTS, FIXD[TROLL]);
+ MOVE(TROLL2, object_descriptions[TROLL].plac);
+ MOVE(TROLL2 + NOBJECTS, object_descriptions[TROLL].fixd);
* 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. */
* 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[PLANT] = PUT(PLANT, LOC_NE, 0);
game.prop[OYSTER] = PUT(OYSTER, LOC_NE, 0);
game.prop[PLANT] = PUT(PLANT, LOC_NE, 0);
game.prop[OYSTER] = PUT(OYSTER, LOC_NE, 0);
game.prop[LAMP] = PUT(LAMP, LOC_NE, 0);
game.prop[ROD] = PUT(ROD, LOC_NE, 0);
game.prop[DWARF] = PUT(DWARF, LOC_NE, 0);
game.prop[LAMP] = PUT(LAMP, LOC_NE, 0);
game.prop[ROD] = PUT(ROD, LOC_NE, 0);
game.prop[DWARF] = PUT(DWARF, LOC_NE, 0);
game.prop[SNAKE] = PUT(SNAKE, LOC_SW, 1);
game.prop[BIRD] = PUT(BIRD, LOC_SW, 1);
game.prop[CAGE] = PUT(CAGE, LOC_SW, 0);
game.prop[SNAKE] = PUT(SNAKE, LOC_SW, 1);
game.prop[BIRD] = PUT(BIRD, LOC_SW, 1);
game.prop[CAGE] = PUT(CAGE, LOC_SW, 0);
* 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. */
* 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)) {
- RSPEAK(REPLACE_BATTERIES);
- game.prop[BATTERY] = 1;
+ if (game.limit <= WARNTIME && HERE(BATTERY) && game.prop[BATTERY] == FRESH_BATTERIES && HERE(LAMP)) {
+ rspeak(REPLACE_BATTERIES);
+ game.prop[BATTERY] = DEAD_BATTERIES;
} else if (game.limit <= WARNTIME) {
if (!game.lmwarn && HERE(LAMP)) {
game.lmwarn = true;
int spk = GET_BATTERIES;
if (game.place[BATTERY] == LOC_NOWHERE)spk = LAMP_DIM;
} else if (game.limit <= WARNTIME) {
if (!game.lmwarn && HERE(LAMP)) {
game.lmwarn = true;
int spk = GET_BATTERIES;
if (game.place[BATTERY] == LOC_NOWHERE)spk = LAMP_DIM;
/* Can't leave cave once it's closing (except by main office). */
if (OUTSID(game.newloc) && game.newloc != 0 && game.closng) {
/* Can't leave cave once it's closing (except by main office). */
if (OUTSID(game.newloc) && game.newloc != 0 && game.closng) {
* 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). */
* 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). */
return true;
else
continue; /* back to top of main interpreter loop */
}
if (game.loc == LOC_Y2 && PCT(25) && !game.closng)
return true;
else
continue; /* back to top of main interpreter loop */
}
if (game.loc == LOC_Y2 && PCT(25) && !game.closng)
* tick game.clock1 unless well into cave (and not at Y2). */
if (game.closed) {
if (game.prop[OYSTER] < 0 && TOTING(OYSTER))
* tick game.clock1 unless well into cave (and not at Y2). */
if (game.closed) {
if (game.prop[OYSTER] < 0 && TOTING(OYSTER))
for (size_t i = 1; i <= NOBJECTS; i++) {
if (TOTING(i) && game.prop[i] < 0)
game.prop[i] = -1 - game.prop[i];
for (size_t i = 1; i <= NOBJECTS; i++) {
if (TOTING(i) && game.prop[i] < 0)
game.prop[i] = -1 - game.prop[i];
- if (!GETIN(cmdin, &WD1, &WD1X, &WD2, &WD2X))
+ if (!GETIN(cmdin, &command.wd1, &command.wd1x, &command.wd2, &command.wd2x))
- if (game.turns == game.thresh) {
- speak(turn_threshold_messages[game.trndex]);
- game.trnluz = game.trnluz + TRNVAL[game.trndex] / 100000;
- ++game.trndex;
- game.thresh = -1;
- if (game.trndex <= TRNVLS)
- game.thresh = MOD(TRNVAL[game.trndex], 100000) + 1;
- }
- if (verb == SAY && WD2 > 0)
- verb = 0;
- if (verb == SAY) {
- part = transitive;
+
+ /* If a turn threshold has been met, apply penalties and tell
+ * the player about it. */
+ for (int i = 0; i < NTHRESHOLDS; ++i)
+ {
+ if (game.turns == turn_thresholds[i].threshold + 1)
+ {
+ game.trnluz += turn_thresholds[i].point_loss;
+ speak(turn_thresholds[i].message);
+ }
+ }
+
+ if (command.verb == SAY && command.wd2 > 0)
+ command.verb = 0;
+ if (command.verb == SAY) {
+ command.part = transitive;
- if (V1 == ENTER && WD2 > 0) {
- WD1 = WD2;
- WD1X = WD2X;
- wordclear(&WD2);
+ if (V1 == ENTER && command.wd2 > 0) {
+ command.wd1 = command.wd2;
+ command.wd1x = command.wd2x;
+ wordclear(&command.wd2);
if (defn == -1) {
/* Gee, I don't understand. */
if (fallback_handler(rawbuf))
continue;
if (defn == -1) {
/* Gee, I don't understand. */
if (fallback_handler(rawbuf))
continue;