projects
/
open-adventure.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Test cover all of discard
[open-adventure.git]
/
main.c
diff --git
a/main.c
b/main.c
index 7cf987aa551faa2b085baab57ab6deeb0ec11df9..5edcc755389d593929cfac3da0eac26cefb37aa6 100644
(file)
--- a/
main.c
+++ b/
main.c
@@
-294,7
+294,7
@@
static bool spotted_by_pirate(int i)
continue;
if (!(treasure == PYRAMID && (game.loc == objects[PYRAMID].plac ||
game.loc == objects[EMERALD].plac))) {
continue;
if (!(treasure == PYRAMID && (game.loc == objects[PYRAMID].plac ||
game.loc == objects[EMERALD].plac))) {
- if (AT(treasure) && game.fixed[treasure] ==
0
)
+ if (AT(treasure) && game.fixed[treasure] ==
IS_FREE
)
carry(treasure, game.loc);
if (TOTING(treasure))
drop(treasure, game.chloc);
carry(treasure, game.loc);
if (TOTING(treasure))
drop(treasure, game.chloc);
@@
-671,12
+671,13
@@
static void playermove( int motion)
game.newloc -= SPECIALBASE;
switch (game.newloc) {
case 1:
game.newloc -= SPECIALBASE;
switch (game.newloc) {
case 1:
- /*
Travel 30
1. Plover-alcove passage. Can carry only
+ /*
Special travel
1. Plover-alcove passage. Can carry only
* emerald. Note: travel table must include "useless"
* entries going through passage, which can never be used
* for actual motion, but can be spotted by "go back". */
* emerald. Note: travel table must include "useless"
* entries going through passage, which can never be used
* for actual motion, but can be spotted by "go back". */
- /* FIXME: Arithmetic on location numbers */
- game.newloc = 99 + 100 - game.loc;
+ game.newloc = (game.loc == LOC_PLOVER)
+ ? LOC_ALCOVE
+ : LOC_PLOVER;
if (game.holdng > 1 ||
(game.holdng == 1 && !TOTING(EMERALD))) {
game.newloc = game.loc;
if (game.holdng > 1 ||
(game.holdng == 1 && !TOTING(EMERALD))) {
game.newloc = game.loc;
@@
-684,7
+685,7
@@
static void playermove( int motion)
}
return;
case 2:
}
return;
case 2:
- /*
Travel 30
2. Plover transport. Drop the
+ /*
Special travel
2. Plover transport. Drop the
* emerald (only use special travel if toting
* it), so he's forced to use the plover-passage
* to get it out. Having dropped it, go back and
* emerald (only use special travel if toting
* it), so he's forced to use the plover-passage
* to get it out. Having dropped it, go back and
@@
-700,11
+701,11
@@
static void playermove( int motion)
travel_entry = te_tmp;
continue; /* goto L12 */
case 3:
travel_entry = te_tmp;
continue; /* goto L12 */
case 3:
- /*
Travel 303. Troll bridge. Must be done only
- *
as special motion so that dwarves won't wander
- *
across and encounter the bear. (They won't
- *
follow the player there because that region is
- * forbidden to the pirate.) If
+ /*
Special travel 3. Troll bridge. Must be done
+ *
only as special motion so that dwarves won't
+ *
wander across and encounter the bear. (They
+ *
won't follow the player there because that
+ *
region is
forbidden to the pirate.) If
* game.prop(TROLL)=1, he's crossed since paying,
* so step out and block him. (standard travel
* entries check for game.prop(TROLL)=0.) Special
* game.prop(TROLL)=1, he's crossed since paying,
* so step out and block him. (standard travel
* entries check for game.prop(TROLL)=0.) Special
@@
-729,7
+730,7
@@
static void playermove( int motion)
game.prop[CHASM] = BRIDGE_WRECKED;
game.prop[TROLL] = TROLL_GONE;
drop(BEAR, game.newloc);
game.prop[CHASM] = BRIDGE_WRECKED;
game.prop[TROLL] = TROLL_GONE;
drop(BEAR, game.newloc);
- game.fixed[BEAR] =
-1
;
+ game.fixed[BEAR] =
IS_FIXED
;
game.prop[BEAR] = BEAR_DEAD;
game.oldlc2 = game.newloc;
croak();
game.prop[BEAR] = BEAR_DEAD;
game.oldlc2 = game.newloc;
croak();
@@
-765,6
+766,7
@@
static bool closecheck(void)
* problems arise from the use of negative prop numbers to suppress
* the object descriptions until he's actually moved the objects. */
{
* problems arise from the use of negative prop numbers to suppress
* the object descriptions until he's actually moved the objects. */
{
+ /* Don't tick game.clock1 unless well into cave (and not at Y2). */
if (game.tally == 0 && INDEEP(game.loc) && game.loc != LOC_Y2)
--game.clock1;
if (game.tally == 0 && INDEEP(game.loc) && game.loc != LOC_Y2)
--game.clock1;
@@
-796,9
+798,9
@@
static bool closecheck(void)
if (game.prop[BEAR] != BEAR_DEAD)
DESTROY(BEAR);
game.prop[CHAIN] = CHAIN_HEAP;
if (game.prop[BEAR] != BEAR_DEAD)
DESTROY(BEAR);
game.prop[CHAIN] = CHAIN_HEAP;
- game.fixed[CHAIN] =
CHAIN_HEAP
;
- game.prop[AXE] =
0
;
- game.fixed[AXE] =
0
;
+ game.fixed[CHAIN] =
IS_FREE
;
+ game.prop[AXE] =
AXE_HERE
;
+ game.fixed[AXE] =
IS_FREE
;
rspeak(CAVE_CLOSING);
game.clock1 = -1;
game.closng = true;
rspeak(CAVE_CLOSING);
game.clock1 = -1;
game.closng = true;
@@
-914,7
+916,7
@@
static void listobjects(void)
if (game.prop[obj] < 0) {
if (game.closed)
continue;
if (game.prop[obj] < 0) {
if (game.closed)
continue;
- game.prop[obj] =
0
;
+ game.prop[obj] =
STATE_FOUND
;
if (obj == RUG)
game.prop[RUG] = RUG_DRAGON;
if (obj == CHAIN)
if (obj == RUG)
game.prop[RUG] = RUG_DRAGON;
if (obj == CHAIN)
@@
-936,8
+938,10
@@
static void listobjects(void)
* (so goes the rationalisation). */
}
int kk = game.prop[obj];
* (so goes the rationalisation). */
}
int kk = game.prop[obj];
- if (obj == STEPS && game.loc == game.fixed[STEPS])
- kk = 1;
+ if (obj == STEPS)
+ kk = (game.loc == game.fixed[STEPS])
+ ? STEPS_UP
+ : STEPS_DOWN;
pspeak(obj, look, kk, true);
}
}
pspeak(obj, look, kk, true);
}
}
@@
-946,7
+950,6
@@
static void listobjects(void)
static bool do_command()
/* Get and execute a command */
{
static bool do_command()
/* Get and execute a command */
{
- long V1, V2;
long kmod, defn;
static long igo = 0;
static struct command_t command;
long kmod, defn;
static long igo = 0;
static struct command_t command;
@@
-1004,7
+1007,7
@@
static bool do_command()
speak(msg);
if (FORCED(game.loc)) {
playermove(HERE);
speak(msg);
if (FORCED(game.loc)) {
playermove(HERE);
- return true;
+
return true;
}
if (game.loc == LOC_Y2 && PCT(25) && !game.closng)
rspeak(SAYS_PLUGH);
}
if (game.loc == LOC_Y2 && PCT(25) && !game.closng)
rspeak(SAYS_PLUGH);
@@
-1020,16
+1023,15
@@
L2600:
checkhints();
/* If closing time, check for any objects being toted with
checkhints();
/* If closing time, check for any objects being toted with
- * game.prop < 0 and set the prop to -1-game.prop. This way
- * objects won't be described until they've been picked up
- * and put down separate from their respective piles. Don't
- * tick game.clock1 unless well into cave (and not at Y2). */
+ * game.prop < 0 and stash them. This way objects won't be
+ * described until they've been picked up and put down
+ * separate from their respective piles. */
if (game.closed) {
if (game.prop[OYSTER] < 0 && TOTING(OYSTER))
pspeak(OYSTER, look, 1, true);
for (size_t i = 1; i <= NOBJECTS; i++) {
if (TOTING(i) && game.prop[i] < 0)
if (game.closed) {
if (game.prop[OYSTER] < 0 && TOTING(OYSTER))
pspeak(OYSTER, look, 1, true);
for (size_t i = 1; i <= NOBJECTS; i++) {
if (TOTING(i) && game.prop[i] < 0)
- game.prop[i] =
-1 - game.prop[i]
;
+ game.prop[i] =
STASHED(i)
;
}
}
game.wzdark = DARK(game.loc);
}
}
game.wzdark = DARK(game.loc);
@@
-1057,6
+1059,13
@@
L2600:
tokenize(inputbuf, &command);
tokenize(inputbuf, &command);
+ char word1[TOKLEN + 1];
+ char word2[TOKLEN + 1];
+ packed_to_token(command.wd1, word1);
+ packed_to_token(command.wd2, word2);
+ command.id1 = get_vocab_id(word1);
+ command.id2 = get_vocab_id(word2);
+
/* Every input, check "game.foobar" flag. If zero, nothing's
* going on. If pos, make neg. If neg, he skipped a word,
* so make it zero. */
/* Every input, check "game.foobar" flag. If zero, nothing's
* going on. If pos, make neg. If neg, he skipped a word,
* so make it zero. */
@@
-1073,7
+1082,7
@@
L2607:
}
}
}
}
- if (command.verb == SAY && command.
wd2 > 0
)
+ if (command.verb == SAY && command.
id2 != WORD_NOT_FOUND && command.id2 != WORD_EMPTY
)
command.verb = 0;
if (command.verb == SAY) {
command.part = transitive;
command.verb = 0;
if (command.verb == SAY) {
command.part = transitive;
@@
-1085,14
+1094,8
@@
L2607:
} else
lampcheck();
} else
lampcheck();
- char word1[TOKLEN+1];
- char word2[TOKLEN+1];
- packed_to_token(command.wd1, word1);
- packed_to_token(command.wd2, word2);
- V1 = get_vocab_id(word1);
- V2 = get_vocab_id(word2);
- if (V1 == ENTER && (V2 == STREAM ||
- V2 == PROMOTE_WORD(WATER))) {
+ if (command.id1 == ENTER && (command.id2 == STREAM ||
+ command.id2 == PROMOTE_WORD(WATER))) {
if (LIQLOC(game.loc) == WATER) {
rspeak(FEET_WET);
} else {
if (LIQLOC(game.loc) == WATER) {
rspeak(FEET_WET);
} else {
@@
-1100,17
+1103,19
@@
L2607:
}
goto L2012;
}
}
goto L2012;
}
- if (V1 == ENTER && command.wd2 > 0) {
- command.wd1 = command.wd2;
- wordclear(&command.wd2);
+ if (command.id1 == ENTER && command.id2 != WORD_NOT_FOUND && command.id2 != WORD_EMPTY) {
+ /* command.wd1 = command.wd2; */
+ /* wordclear(&command.wd2); */
+ command.id1 = command.id2;
+ command.id2 = WORD_EMPTY;
} else {
/* FIXME: Magic numbers related to vocabulary */
} else {
/* FIXME: Magic numbers related to vocabulary */
- if (!((
V1 != PROMOTE_WORD(WATER) && V
1 != PROMOTE_WORD(OIL)) ||
- (
V2 != PROMOTE_WORD(PLANT) && V
2 != PROMOTE_WORD(DOOR)))) {
- if (AT(DEMOTE_WORD(
V
2)))
+ if (!((
command.id1 != PROMOTE_WORD(WATER) && command.id
1 != PROMOTE_WORD(OIL)) ||
+ (
command.id2 != PROMOTE_WORD(PLANT) && command.id
2 != PROMOTE_WORD(DOOR)))) {
+ if (AT(DEMOTE_WORD(
command.id
2)))
command.wd2 = token_to_packed("POUR");
}
command.wd2 = token_to_packed("POUR");
}
- if (
V1 == PROMOTE_WORD(CAGE) && V
2 == PROMOTE_WORD(BIRD) && HERE(CAGE) && HERE(BIRD))
+ if (
command.id1 == PROMOTE_WORD(CAGE) && command.id
2 == PROMOTE_WORD(BIRD) && HERE(CAGE) && HERE(BIRD))
command.wd1 = token_to_packed("CATCH");
}
L2620:
command.wd1 = token_to_packed("CATCH");
}
L2620:
@@
-1126,7
+1131,7
@@
L2620:
Lookup:
packed_to_token(command.wd1, word1);
defn = get_vocab_id(word1);
Lookup:
packed_to_token(command.wd1, word1);
defn = get_vocab_id(word1);
- if (defn ==
-1
) {
+ if (defn ==
WORD_NOT_FOUND
) {
/* Gee, I don't understand. */
if (fallback_handler(inputbuf))
continue;
/* Gee, I don't understand. */
if (fallback_handler(inputbuf))
continue;
@@
-1138,7
+1143,7
@@
Lookup:
switch (defn / 1000) {
case 0:
playermove(kmod);
switch (defn / 1000) {
case 0:
playermove(kmod);
- return true;
+
return true;
case 1:
command.part = unknown;
command.obj = kmod;
case 1:
command.part = unknown;
command.obj = kmod;
@@
-1174,14
+1179,14
@@
Laction:
case GO_WORD2:
/* Get second word for analysis. */
command.wd1 = command.wd2;
case GO_WORD2:
/* Get second word for analysis. */
command.wd1 = command.wd2;
- strcpy(command.raw1, command.raw2);
+
strcpy(command.raw1, command.raw2);
wordclear(&command.wd2);
wordclear(&command.wd2);
- command.raw2[0] = '\0';
+
command.raw2[0] = '\0';
goto L2620;
case GO_UNKNOWN:
/* Random intransitive verbs come here. Clear obj just in case
* (see attack()). */
goto L2620;
case GO_UNKNOWN:
/* Random intransitive verbs come here. Clear obj just in case
* (see attack()). */
- command.raw1[0] = toupper(command.raw1[0]);
+
command.raw1[0] = toupper(command.raw1[0]);
sspeak(DO_WHAT, command.raw1);
command.obj = 0;
goto L2600;
sspeak(DO_WHAT, command.raw1);
command.obj = 0;
goto L2600;