projects
/
open-adventure.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Switch to 0-indexing for hint handling code.
[open-adventure.git]
/
main.c
diff --git
a/main.c
b/main.c
index 79572bba7267b046ad57f20104356a8538228444..724194df110d6f73d5434a47f4b9980e8daf8963 100644
(file)
--- a/
main.c
+++ b/
main.c
@@
-27,7
+27,7
@@
struct game_t game;
struct game_t game;
-long LNLENG, LNPOSN
, PARMS[MAXPARMS + 1]
;
+long LNLENG, LNPOSN;
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,
@@
-189,18
+189,18
@@
static bool fallback_handler(char *buf)
static void checkhints(void)
{
if (COND[game.loc] >= game.conds) {
static void checkhints(void)
{
if (COND[game.loc] >= game.conds) {
- for (int hint =
1; hint <= HNTMAX
; hint++) {
+ for (int hint =
0; hint < HINT_COUNT
; hint++) {
if (game.hinted[hint])
continue;
if (game.hinted[hint])
continue;
- if (!CNDBIT(game.loc, hint + HBASE))
+ if (!CNDBIT(game.loc, hint +
1 +
HBASE))
game.hintlc[hint] = -1;
++game.hintlc[hint];
/* Come here if he's been long enough at required loc(s) for some
* unused hint. */
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]
) {
+ if (game.hintlc[hint] >=
hints[hint].turns
) {
int i;
int i;
- switch (hint
- 1
) {
+ switch (hint) {
case 0:
/* cave */
if (game.prop[GRATE] == 0 && !HERE(KEYS))
case 0:
/* cave */
if (game.prop[GRATE] == 0 && !HERE(KEYS))
@@
-263,13
+263,12
@@
static void checkhints(void)
/* Fall through to hint display */
game.hintlc[hint] = 0;
/* Fall through to hint display */
game.hintlc[hint] = 0;
- 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]))
return;
return;
- 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.hinted[hint] && game.limit > WARNTIME)
if (game.hinted[hint] && game.limit > WARNTIME)
- game.limit += WARNTIME *
HINTS[hint][2]
;
+ game.limit += WARNTIME *
hints[hint].penalty
;
}
}
}
}
}
}
@@
-305,7
+304,7
@@
static bool spotted_by_pirate(int i)
}
/* 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) {
}
/* 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) {
-
RSPEAK
(PIRATE_SPOTTED);
+
rspeak
(PIRATE_SPOTTED);
movechest = true;
}
/* Do things in this order (chest move before robbery) so chest is listed
movechest = true;
}
/* Do things in this order (chest move before robbery) so chest is listed
@@
-320,10
+319,10
@@
static bool spotted_by_pirate(int i)
/* 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_RUSTLES);
+
rspeak
(PIRATE_RUSTLES);
}
if (robplayer) {
}
if (robplayer) {
-
RSPEAK
(PIRATE_POUNCES);
+
rspeak
(PIRATE_POUNCES);
for (int treasure = MINTRS; treasure <= MAXTRS; treasure++) {
if (!(treasure == PYRAMID && (game.loc == PLAC[PYRAMID] || game.loc == PLAC[EMERALD]))) {
if (AT(treasure) && game.fixed[treasure] == 0)
for (int treasure = MINTRS; treasure <= MAXTRS; treasure++) {
if (!(treasure == PYRAMID && (game.loc == PLAC[PYRAMID] || game.loc == PLAC[EMERALD]))) {
if (AT(treasure) && game.fixed[treasure] == 0)
@@
-383,7
+382,7
@@
static bool dwarfmove(void)
game.dloc[i] = DALTLC;
game.odloc[i] = game.dloc[i];
}
game.dloc[i] = DALTLC;
game.odloc[i] = game.dloc[i];
}
-
RSPEAK
(DWARF_RAN);
+
rspeak
(DWARF_RAN);
DROP(AXE, game.loc);
return true;
}
DROP(AXE, game.loc);
return true;
}
@@
-446,22
+445,19
@@
static bool dwarfmove(void)
/* 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
- * positions in the
RSPEAK
database. */
+ * positions in the
rspeak
database. */
if (game.dtotal == 0)
return true;
if (game.dtotal == 0)
return true;
- SETPRM(1, game.dtotal, 0);
- RSPEAK(game.dtotal == 1 ? DWARF_SINGLE : DWARF_PACK);
+ rspeak(game.dtotal == 1 ? DWARF_SINGLE : DWARF_PACK, game.dtotal);
if (attack == 0)
return true;
if (game.dflag == 2)game.dflag = 3;
if (attack == 0)
return true;
if (game.dflag == 2)game.dflag = 3;
- if (attack > 1){
- SETPRM(1, attack, 0);
- RSPEAK(THROWN_KNIVES);
- SETPRM(1, stick, 0);
- RSPEAK(stick > 1 ? MULTIPLE_HITS : (stick == 1 ? ONE_HIT : NONE_HIT));
+ if (attack > 1) {
+ rspeak(THROWN_KNIVES, attack);
+ rspeak(stick > 1 ? MULTIPLE_HITS : (stick == 1 ? ONE_HIT : NONE_HIT), stick);
} else {
} else {
-
RSPEAK
(KNIFE_THROWN);
-
RSPEAK
(MISSES_YOU);
+
rspeak
(KNIFE_THROWN);
+
rspeak
(MISSES_YOU);
}
if (stick == 0)
return true;
}
if (stick == 0)
return true;
@@
-498,7
+494,7
@@
static void croak(void)
if (game.closng) {
/* He died during closing time. No resurrection. Tally up a
* death and exit. */
if (game.closng) {
/* He died during closing time. No resurrection. Tally up a
* death and exit. */
-
RSPEAK
(DEATH_CLOSING);
+
rspeak
(DEATH_CLOSING);
terminate(endgame);
} else if (game.numdie == maximum_deaths || !YES(query, yes_response, arbitrary_messages[OK_MAN]))
terminate(endgame);
terminate(endgame);
} else if (game.numdie == maximum_deaths || !YES(query, yes_response, arbitrary_messages[OK_MAN]))
terminate(endgame);
@@
-560,7
+556,7
@@
static bool playermove(token_t verb, int motion)
}
kk = k2;
if (kk == 0) {
}
kk = k2;
if (kk == 0) {
-
RSPEAK
(NOT_CONNECTED);
+
rspeak
(NOT_CONNECTED);
return true;
}
}
return true;
}
}
@@
-570,7
+566,7
@@
static bool playermove(token_t verb, int motion)
break; /* fall through to ordinary travel */
}
} else {
break; /* fall through to ordinary travel */
}
} else {
-
RSPEAK
(k2);
+
rspeak
(k2);
return true;
}
} else if (motion == LOOK) {
return true;
}
} else if (motion == LOOK) {
@@
-578,14
+574,14
@@
static bool playermove(token_t verb, int motion)
* (though it may now be dark) so he won't fall into a
* pit while staring into the gloom. */
if (game.detail < 3)
* (though it may now be dark) so he won't fall into a
* pit while staring into the gloom. */
if (game.detail < 3)
-
RSPEAK
(NO_MORE_DETAIL);
+
rspeak
(NO_MORE_DETAIL);
++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. */
-
RSPEAK
((OUTSID(game.loc) && game.loc != LOC_GRATE) ? FOLLOW_STREAM : NEED_DETAIL);
+
rspeak
((OUTSID(game.loc) && game.loc != LOC_GRATE) ? FOLLOW_STREAM : NEED_DETAIL);
return true;
} else {
/* none of the specials */
return true;
} else {
/* none of the specials */
@@
-610,7
+606,7
@@
static bool playermove(token_t verb, int motion)
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;
-
RSPEAK
(spk);
+
rspeak
(spk);
return true;
}
++kk;
return true;
}
++kk;
@@
-664,7
+660,7
@@
static bool playermove(token_t verb, int motion)
game.newloc = 99 + 100 - game.loc;
if (game.holdng > 1 || (game.holdng == 1 && !TOTING(EMERALD))) {
game.newloc = game.loc;
game.newloc = 99 + 100 - game.loc;
if (game.holdng > 1 || (game.holdng == 1 && !TOTING(EMERALD))) {
game.newloc = game.loc;
-
RSPEAK
(MUST_DROP);
+
rspeak
(MUST_DROP);
}
return true;
case 2:
}
return true;
case 2:
@@
-691,7
+687,7
@@
static bool playermove(token_t verb, int motion)
* 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) {
-
PSPEAK
(TROLL, 1);
+
pspeak
(TROLL, 1);
game.prop[TROLL] = 0;
MOVE(TROLL2, 0);
MOVE(TROLL2 + NOBJECTS, 0);
game.prop[TROLL] = 0;
MOVE(TROLL2, 0);
MOVE(TROLL2 + NOBJECTS, 0);
@@
-704,7
+700,7
@@
static bool playermove(token_t verb, int motion)
game.newloc = PLAC[TROLL] + FIXD[TROLL] - game.loc;
if (game.prop[TROLL] == 0)game.prop[TROLL] = 1;
if (!TOTING(BEAR)) return true;
game.newloc = PLAC[TROLL] + FIXD[TROLL] - game.loc;
if (game.prop[TROLL] == 0)game.prop[TROLL] = 1;
if (!TOTING(BEAR)) return true;
-
RSPEAK
(BRIDGE_COLLAPSE);
+
rspeak
(BRIDGE_COLLAPSE);
game.prop[CHASM] = 1;
game.prop[TROLL] = 2;
DROP(BEAR, game.newloc);
game.prop[CHASM] = 1;
game.prop[TROLL] = 2;
DROP(BEAR, game.newloc);
@@
-722,7
+718,7
@@
static bool playermove(token_t verb, int motion)
} while
(false);
/* FIXME: Arithmetic on location number, becoming a message number */
} while
(false);
/* FIXME: Arithmetic on location number, becoming a message number */
-
RSPEAK
(game.newloc - 500);
+
rspeak
(game.newloc - 500);
game.newloc = game.loc;
return true;
}
game.newloc = game.loc;
return true;
}
@@
-781,7
+777,7
@@
static bool closecheck(void)
game.fixed[CHAIN] = 0;
game.prop[AXE] = 0;
game.fixed[AXE] = 0;
game.fixed[CHAIN] = 0;
game.prop[AXE] = 0;
game.fixed[AXE] = 0;
-
RSPEAK
(CAVE_CLOSING);
+
rspeak
(CAVE_CLOSING);
game.clock1 = -1;
game.closng = true;
return true;
game.clock1 = -1;
game.closng = true;
return true;
@@
-832,7
+828,7
@@
static bool closecheck(void)
DESTROY(i);
}
DESTROY(i);
}
-
RSPEAK
(CAVE_CLOSED);
+
rspeak
(CAVE_CLOSED);
game.closed = true;
return true;
}
game.closed = true;
return true;
}
@@
-853,7
+849,7
@@
static void lampcheck(void)
* 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)) {
* 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);
+
rspeak
(REPLACE_BATTERIES);
game.prop[BATTERY] = 1;
if (TOTING(BATTERY))
DROP(BATTERY, game.loc);
game.prop[BATTERY] = 1;
if (TOTING(BATTERY))
DROP(BATTERY, game.loc);
@@
-863,14
+859,14
@@
static void lampcheck(void)
game.limit = -1;
game.prop[LAMP] = 0;
if (HERE(LAMP))
game.limit = -1;
game.prop[LAMP] = 0;
if (HERE(LAMP))
-
RSPEAK
(LAMP_OUT);
+
rspeak
(LAMP_OUT);
} 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;
if (game.prop[BATTERY] == 1)spk = MISSING_BATTERYIES;
} 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;
if (game.prop[BATTERY] == 1)spk = MISSING_BATTERYIES;
-
RSPEAK
(spk);
+
rspeak
(spk);
}
}
}
}
}
}
@@
-916,7
+912,7
@@
static void listobjects(void)
int kk = game.prop[obj];
if (obj == STEPS && game.loc == game.fixed[STEPS])
kk = 1;
int kk = game.prop[obj];
if (obj == STEPS && game.loc == game.fixed[STEPS])
kk = 1;
-
PSPEAK
(obj, kk);
+
pspeak
(obj, kk);
}
}
}
}
}
}
@@
-932,7
+928,7
@@
static bool do_command(FILE *cmdin)
/* 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) {
-
RSPEAK
(EXIT_CLOSED);
+
rspeak
(EXIT_CLOSED);
game.newloc = game.loc;
if (!game.panic)game.clock2 = PANICTIME;
game.panic = true;
game.newloc = game.loc;
if (!game.panic)game.clock2 = PANICTIME;
game.panic = true;
@@
-946,7
+942,7
@@
static bool do_command(FILE *cmdin)
for (size_t i = 1; i <= NDWARVES - 1; i++) {
if (game.odloc[i] == game.newloc && game.dseen[i]) {
game.newloc = game.loc;
for (size_t i = 1; i <= NDWARVES - 1; i++) {
if (game.odloc[i] == game.newloc && game.dseen[i]) {
game.newloc = game.loc;
-
RSPEAK
(DWARF_BLOCK);
+
rspeak
(DWARF_BLOCK);
break;
}
}
break;
}
}
@@
-968,14
+964,14
@@
static bool do_command(FILE *cmdin)
/* The easiest way to get killed is to fall into a pit in
* pitch darkness. */
if (game.wzdark && PCT(35)) {
/* The easiest way to get killed is to fall into a pit in
* pitch darkness. */
if (game.wzdark && PCT(35)) {
-
RSPEAK
(PIT_FALL);
+
rspeak
(PIT_FALL);
game.oldlc2 = game.loc;
croak();
continue; /* back to top of main interpreter loop */
}
msg = arbitrary_messages[PITCH_DARK];
}
game.oldlc2 = game.loc;
croak();
continue; /* back to top of main interpreter loop */
}
msg = arbitrary_messages[PITCH_DARK];
}
- if (TOTING(BEAR))
RSPEAK
(TAME_BEAR);
+ if (TOTING(BEAR))
rspeak
(TAME_BEAR);
speak(msg);
if (FORCED(game.loc)) {
if (playermove(command.verb, 1))
speak(msg);
if (FORCED(game.loc)) {
if (playermove(command.verb, 1))
@@
-984,7
+980,7
@@
static bool do_command(FILE *cmdin)
continue; /* back to top of main interpreter loop */
}
if (game.loc == LOC_Y2 && PCT(25) && !game.closng)
continue; /* back to top of main interpreter loop */
}
if (game.loc == LOC_Y2 && PCT(25) && !game.closng)
-
RSPEAK
(SAYS_PLUGH);
+
rspeak
(SAYS_PLUGH);
listobjects();
listobjects();
@@
-1003,7
+999,7
@@
L2600:
* 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))
-
PSPEAK
(OYSTER, 1);
+
pspeak
(OYSTER, 1);
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];
@@
-1051,9
+1047,9
@@
L2607:
V2 = VOCAB(command.wd2, -1);
if (V1 == ENTER && (V2 == STREAM || V2 == 1000 + WATER)) {
if (LIQLOC(game.loc) == WATER) {
V2 = VOCAB(command.wd2, -1);
if (V1 == ENTER && (V2 == STREAM || V2 == 1000 + WATER)) {
if (LIQLOC(game.loc) == WATER) {
-
RSPEAK
(FEET_WET);
+
rspeak
(FEET_WET);
} else {
} else {
-
RSPEAK
(WHERE_QUERY);
+
rspeak
(WHERE_QUERY);
}
goto L2012;
}
}
goto L2012;
}
@@
-1062,7
+1058,7
@@
L2607:
command.wd1x = command.wd2x;
wordclear(&command.wd2);
} else {
command.wd1x = command.wd2x;
wordclear(&command.wd2);
} else {
- /* FIXME: Magic numbers */
+
/* FIXME: Magic numbers */
if (!((V1 != 1000 + WATER && V1 != 1000 + OIL) ||
(V2 != 1000 + PLANT && V2 != 1000 + DOOR))) {
if (AT(V2 - 1000))
if (!((V1 != 1000 + WATER && V1 != 1000 + OIL) ||
(V2 != 1000 + PLANT && V2 != 1000 + DOOR))) {
if (AT(V2 - 1000))
@@
-1075,11
+1071,11
@@
L2620:
if (wordeq(command.wd1, MAKEWD(WORD_WEST))) {
++game.iwest;
if (game.iwest == 10)
if (wordeq(command.wd1, MAKEWD(WORD_WEST))) {
++game.iwest;
if (game.iwest == 10)
-
RSPEAK
(W_IS_WEST);
+
rspeak
(W_IS_WEST);
}
if (wordeq(command.wd1, MAKEWD(WORD_GO)) && !wordempty(command.wd2)) {
if (++igo == 10)
}
if (wordeq(command.wd1, MAKEWD(WORD_GO)) && !wordempty(command.wd2)) {
if (++igo == 10)
-
RSPEAK
(GO_UNNEEDED);
+
rspeak
(GO_UNNEEDED);
}
Lookup:
defn = VOCAB(command.wd1, -1);
}
Lookup:
defn = VOCAB(command.wd1, -1);
@@
-1087,8
+1083,7
@@
Lookup:
/* Gee, I don't understand. */
if (fallback_handler(rawbuf))
continue;
/* Gee, I don't understand. */
if (fallback_handler(rawbuf))
continue;
- SETPRM(1, command.wd1, command.wd1x);
- RSPEAK(DONT_KNOW);
+ rspeak(DONT_KNOW, command.wd1, command.wd1x);
goto L2600;
}
kmod = MOD(defn, 1000);
goto L2600;
}
kmod = MOD(defn, 1000);
@@
-1107,7
+1102,7
@@
Lookup:
command.verb = kmod;
break;
case 3:
command.verb = kmod;
break;
case 3:
-
RSPEAK
(kmod);
+
rspeak
(kmod);
goto L2012;
default:
BUG(VOCABULARY_TYPE_N_OVER_1000_NOT_BETWEEN_0_AND_3);
goto L2012;
default:
BUG(VOCABULARY_TYPE_N_OVER_1000_NOT_BETWEEN_0_AND_3);
@@
-1139,13
+1134,12
@@
Laction:
case GO_UNKNOWN:
/* Random intransitive verbs come here. Clear obj just in case
* (see attack()). */
case GO_UNKNOWN:
/* Random intransitive verbs come here. Clear obj just in case
* (see attack()). */
- SETPRM(1, command.wd1, command.wd1x);
- RSPEAK(DO_WHAT);
+ rspeak(DO_WHAT, command.wd1, command.wd1x);
command.obj = 0;
goto L2600;
case GO_DWARFWAKE:
/* Oh dear, he's disturbed the dwarves. */
command.obj = 0;
goto L2600;
case GO_DWARFWAKE:
/* Oh dear, he's disturbed the dwarves. */
-
RSPEAK
(DWARVES_AWAKEN);
+
rspeak
(DWARVES_AWAKEN);
terminate(endgame);
default:
BUG(ACTION_RETURNED_PHASE_CODE_BEYOND_END_OF_SWITCH);
terminate(endgame);
default:
BUG(ACTION_RETURNED_PHASE_CODE_BEYOND_END_OF_SWITCH);