projects
/
open-adventure.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
same with bear, but without test
[open-adventure.git]
/
actions.c
diff --git
a/actions.c
b/actions.c
index abe9e5bb38ef2eac3a9b3e481bbbf1445c648874..9c22f66cba2e654d7f829ef51cfc758a336fc61f 100644
(file)
--- a/
actions.c
+++ b/
actions.c
@@
-6,13
+6,6
@@
static int fill(token_t, token_t);
static int fill(token_t, token_t);
-static void state_change(long obj, long state)
-/* Object must have a change-message list for this to be useful; only some do */
-{
- game.prop[obj] = state;
- pspeak(obj, change, state, true);
-}
-
static int attack(struct command_t *command)
/* Attack. Assume target if unambiguous. "Throw" also links here.
* Attackable objects fall into two categories: enemies (snake,
static int attack(struct command_t *command)
/* Attack. Assume target if unambiguous. "Throw" also links here.
* Attackable objects fall into two categories: enemies (snake,
@@
-261,7
+254,7
@@
static int vbreak(token_t verb, token_t obj)
if (TOTING(VASE))
drop(VASE, game.loc);
state_change(VASE, VASE_BROKEN);
if (TOTING(VASE))
drop(VASE, game.loc);
state_change(VASE, VASE_BROKEN);
- game.fixed[VASE] =
-1
;
+ game.fixed[VASE] =
IS_FIXED
;
return GO_CLEAROBJ;
}
rspeak(actions[verb].message);
return GO_CLEAROBJ;
}
rspeak(actions[verb].message);
@@
-302,8
+295,9
@@
static int vcarry(token_t verb, token_t obj)
return GO_CLEAROBJ;
}
return GO_CLEAROBJ;
}
- if (game.fixed[obj] != 0) {
- if (obj == PLANT && game.prop[PLANT] <= 0) {
+ if (game.fixed[obj] != IS_FREE) {
+ /* Next guard tests whether plant is tiny or stashed */
+ if (obj == PLANT && game.prop[PLANT] <= PLANT_THIRSTY) {
rspeak(DEEP_ROOTS);
return GO_CLEAROBJ;
}
rspeak(DEEP_ROOTS);
return GO_CLEAROBJ;
}
@@
-381,7
+375,7
@@
static int vcarry(token_t verb, token_t obj)
if ((obj == BIRD ||
obj == CAGE) &&
(game.prop[BIRD] == BIRD_CAGED || STASHED(BIRD) == BIRD_CAGED))
if ((obj == BIRD ||
obj == CAGE) &&
(game.prop[BIRD] == BIRD_CAGED || STASHED(BIRD) == BIRD_CAGED))
- /* expression maps BIRD to CAGE and CAGE to BIRD */
+
/* expression maps BIRD to CAGE and CAGE to BIRD */
carry(BIRD + CAGE - obj, game.loc);
carry(obj, game.loc);
if (obj == BOTTLE && LIQUID() != NO_OBJECT)
carry(BIRD + CAGE - obj, game.loc);
carry(obj, game.loc);
if (obj == BOTTLE && LIQUID() != NO_OBJECT)
@@
-407,16
+401,16
@@
static int chain(token_t verb)
return GO_CLEAROBJ;
}
game.prop[CHAIN] = CHAIN_HEAP;
return GO_CLEAROBJ;
}
game.prop[CHAIN] = CHAIN_HEAP;
- game.fixed[CHAIN] =
CHAIN_HEAP
;
+ game.fixed[CHAIN] =
IS_FREE
;
if (game.prop[BEAR] != BEAR_DEAD)
game.prop[BEAR] = CONTENTED_BEAR;
switch (game.prop[BEAR]) {
case BEAR_DEAD:
if (game.prop[BEAR] != BEAR_DEAD)
game.prop[BEAR] = CONTENTED_BEAR;
switch (game.prop[BEAR]) {
case BEAR_DEAD:
- game.fixed[BEAR] =
-1
;
+ game.fixed[BEAR] =
IS_FIXED
;
break;
default:
break;
default:
- game.fixed[BEAR] =
0
;
+ game.fixed[BEAR] =
IS_FREE
;
}
rspeak(CHAIN_UNLOCKED);
return GO_CLEAROBJ;
}
rspeak(CHAIN_UNLOCKED);
return GO_CLEAROBJ;
@@
-435,7
+429,7
@@
static int chain(token_t verb)
if (TOTING(CHAIN))
drop(CHAIN, game.loc);
if (TOTING(CHAIN))
drop(CHAIN, game.loc);
- game.fixed[CHAIN] =
-1
;
+ game.fixed[CHAIN] =
IS_FIXED
;
rspeak(CHAIN_LOCKED);
return GO_CLEAROBJ;
rspeak(CHAIN_LOCKED);
return GO_CLEAROBJ;
@@
-475,9
+469,9
@@
static int discard(token_t verb, token_t obj, bool just_do_it)
rspeak(spk);
if (spk != RUG_WIGGLES) {
/* FIXME: Arithmetic on state numbers */
rspeak(spk);
if (spk != RUG_WIGGLES) {
/* FIXME: Arithmetic on state numbers */
- int k =
2 - game.prop[RUG]
;
+ int k =
(game.prop[RUG] == RUG_HOVER) ? RUG_FLOOR : RUG_HOVER
;
game.prop[RUG] = k;
game.prop[RUG] = k;
- if (k ==
2
)
+ if (k ==
RUG_HOVER
)
k = objects[SAPPH].plac;
move(RUG + NOBJECTS, k);
}
k = objects[SAPPH].plac;
move(RUG + NOBJECTS, k);
}
@@
-502,12
+496,11
@@
static int discard(token_t verb, token_t obj, bool just_do_it)
game.loc == objects[PILLOW].plac) {
rspeak(OK_MAN);
} else {
game.loc == objects[PILLOW].plac) {
rspeak(OK_MAN);
} else {
- game.prop[VASE] = VASE_BROKEN;
- if (AT(PILLOW))
- game.prop[VASE] = VASE_WHOLE;
- pspeak(VASE, look, game.prop[VASE] + 1, true);
+ state_change(VASE, AT(PILLOW)
+ ? VASE_WHOLE
+ : VASE_DROPPED);
if (game.prop[VASE] != VASE_WHOLE)
if (game.prop[VASE] != VASE_WHOLE)
- game.fixed[VASE] =
-1
;
+ game.fixed[VASE] =
IS_FIXED
;
}
}
int k = LIQUID();
}
}
int k = LIQUID();
@@
-547,9
+540,8
@@
static int drink(token_t verb, token_t obj)
return GO_CLEAROBJ;
}
if (LIQUID() == WATER && HERE(BOTTLE)) {
return GO_CLEAROBJ;
}
if (LIQUID() == WATER && HERE(BOTTLE)) {
- game.prop[BOTTLE] = EMPTY_BOTTLE;
game.place[WATER] = LOC_NOWHERE;
game.place[WATER] = LOC_NOWHERE;
-
rspeak(BOTTLE_EMPTY
);
+
state_change(BOTTLE, EMPTY_BOTTLE
);
return GO_CLEAROBJ;
}
return GO_CLEAROBJ;
}
@@
-632,46
+624,59
@@
static int feed(token_t verb, token_t obj)
/* Feed. If bird, no seed. Snake, dragon, troll: quip. If dwarf, make him
* mad. Bear, special. */
{
/* Feed. If bird, no seed. Snake, dragon, troll: quip. If dwarf, make him
* mad. Bear, special. */
{
- int spk = actions[verb].message;
- if (obj == BIRD) {
+ switch (obj) {
+ case BIRD:
rspeak(BIRD_PINING);
rspeak(BIRD_PINING);
- return GO_CLEAROBJ;
- } else if (obj == SNAKE ||
- obj == DRAGON ||
- obj == TROLL) {
- spk = NOTHING_EDIBLE;
- if (obj == DRAGON && game.prop[DRAGON] != DRAGON_BARS)
- spk = RIDICULOUS_ATTEMPT;
- if (obj == TROLL)
- spk = TROLL_VICES;
- if (obj == SNAKE && !game.closed && HERE(BIRD)) {
+ break;
+ case DRAGON:
+ if (game.prop[DRAGON] != DRAGON_BARS)
+ rspeak(RIDICULOUS_ATTEMPT);
+ else
+ rspeak(NOTHING_EDIBLE);
+ break;
+ case SNAKE:
+ if (!game.closed && HERE(BIRD)) {
DESTROY(BIRD);
DESTROY(BIRD);
- spk = BIRD_DEVOURED;
- }
- } else if (obj == DWARF) {
+ rspeak(BIRD_DEVOURED);
+ } else
+ rspeak(NOTHING_EDIBLE);
+ break;
+ case TROLL:
+ rspeak(TROLL_VICES);
+ break;
+ case DWARF:
if (HERE(FOOD)) {
game.dflag += 2;
if (HERE(FOOD)) {
game.dflag += 2;
- spk = REALLY_MAD;
+ rspeak(REALLY_MAD);
+ } else
+ rspeak(actions[verb].message);
+ break;
+ case BEAR:
+ if (game.prop[BEAR] == BEAR_DEAD) {
+ rspeak(RIDICULOUS_ATTEMPT);
+ break;
}
}
- } else if (obj == BEAR) {
- if (game.prop[BEAR] == UNTAMED_BEAR)
- spk = NOTHING_EDIBLE;
- if (game.prop[BEAR] == BEAR_DEAD)
- spk = RIDICULOUS_ATTEMPT;
- if (HERE(FOOD)) {
- DESTROY(FOOD);
- game.prop[BEAR] = SITTING_BEAR;
- game.fixed[AXE] = 0;
- game.prop[AXE] = AXE_HERE;
- spk = BEAR_TAMED;
+ if (game.prop[BEAR] == UNTAMED_BEAR) {
+ if (HERE(FOOD)) {
+ DESTROY(FOOD);
+ game.fixed[AXE] = IS_FREE;
+ game.prop[AXE] = AXE_HERE;
+ state_change(BEAR, SITTING_BEAR);
+ } else
+ rspeak(NOTHING_EDIBLE);
+ break;
}
}
- } else if (obj == OGRE) {
+ rspeak(actions[verb].message);
+ break;
+ case OGRE:
if (HERE(FOOD))
if (HERE(FOOD))
- spk = OGRE_FULL;
- } else {
- spk = AM_GAME;
+ rspeak(OGRE_FULL);
+ else
+ rspeak(actions[verb].message);
+ break;
+ default:
+ rspeak(AM_GAME);
}
}
- rspeak(spk);
return GO_CLEAROBJ;
}
return GO_CLEAROBJ;
}
@@
-690,7
+695,7
@@
int fill(token_t verb, token_t obj)
}
rspeak(SHATTER_VASE);
game.prop[VASE] = VASE_BROKEN;
}
rspeak(SHATTER_VASE);
game.prop[VASE] = VASE_BROKEN;
- game.fixed[VASE] =
-1
;
+ game.fixed[VASE] =
IS_FIXED
;
return (discard(verb, VASE, true));
}
return (discard(verb, VASE, true));
}
@@
-742,13
+747,11
@@
int fill(token_t verb, token_t obj)
return GO_CLEAROBJ;
}
return GO_CLEAROBJ;
}
- game.prop[BOTTLE] = (LIQLOC(game.loc) == OIL) ? OIL_BOTTLE : WATER_BOTTLE;
+ state_change(BOTTLE, (LIQLOC(game.loc) == OIL)
+ ? OIL_BOTTLE
+ : WATER_BOTTLE);
if (TOTING(BOTTLE))
game.place[LIQUID()] = CARRIED;
if (TOTING(BOTTLE))
game.place[LIQUID()] = CARRIED;
- if (LIQUID() == OIL)
- rspeak(BOTTLED_OIL);
- else
- rspeak(BOTTLED_WATER);
return GO_CLEAROBJ;
}
return GO_CLEAROBJ;
}
@@
-806,10
+809,10
@@
static int fly(token_t verb, token_t obj)
/* FIXME: Arithmetic on location values */
game.newloc = game.place[RUG] + game.fixed[RUG] - game.loc;
/* FIXME: Arithmetic on location values */
game.newloc = game.place[RUG] + game.fixed[RUG] - game.loc;
- if (game.prop[SAPPH] >= 0) {
- rspeak(RUG_RETURNS);
- } else {
+ if (game.prop[SAPPH] == STATE_NOTFOUND) {
rspeak(RUG_GOES);
rspeak(RUG_GOES);
+ } else {
+ rspeak(RUG_RETURNS);
}
return GO_TERMINATE;
}
}
return GO_TERMINATE;
}
@@
-872,7
+875,7
@@
static int light(token_t verb, token_t obj)
}
static int listen(void)
}
static int listen(void)
-/* Listen. Intransitive only. Print stuff based on obj
snd/locsnd
. */
+/* Listen. Intransitive only. Print stuff based on obj
ect sound proprties
. */
{
long sound = locations[game.loc].sound;
if (sound != SILENT) {
{
long sound = locations[game.loc].sound;
if (sound != SILENT) {
@@
-892,8
+895,7
@@
static int listen(void)
long packed_zzword = token_to_packed(game.zzword);
pspeak(i, hear, mi, true, packed_zzword);
rspeak(NO_MESSAGE);
long packed_zzword = token_to_packed(game.zzword);
pspeak(i, hear, mi, true, packed_zzword);
rspeak(NO_MESSAGE);
- /* FIXME: Magic number, sensitive to bird state logic */
- if (i == BIRD && game.prop[i] == 5)
+ if (i == BIRD && mi == BIRD_ENDSTATE)
DESTROY(BIRD);
return GO_CLEAROBJ;
}
DESTROY(BIRD);
return GO_CLEAROBJ;
}
@@
-1169,7
+1171,7
@@
static int throw (struct command_t *command)
else if (HERE(BEAR) && game.prop[BEAR] == UNTAMED_BEAR) {
/* This'll teach him to throw the axe at the bear! */
drop(AXE, game.loc);
else if (HERE(BEAR) && game.prop[BEAR] == UNTAMED_BEAR) {
/* This'll teach him to throw the axe at the bear! */
drop(AXE, game.loc);
- game.fixed[AXE] =
-1
;
+ game.fixed[AXE] =
IS_FIXED
;
juggle(BEAR);
state_change(AXE, AXE_LOST);
return GO_CLEAROBJ;
juggle(BEAR);
state_change(AXE, AXE_LOST);
return GO_CLEAROBJ;