X-Git-Url: https://jxself.org/git/?a=blobdiff_plain;f=actions.c;h=3403fe58fb971a643e4de806020fff2af1d42a3f;hb=66ba9a01017229e765509d0ba09717f01c9c1daf;hp=6000f41e01980eb91a9ecf82296e5358a515809d;hpb=9a16382b121422b094539463e57710baaaf817dc;p=open-adventure.git diff --git a/actions.c b/actions.c index 6000f41..3403fe5 100644 --- a/actions.c +++ b/actions.c @@ -185,13 +185,13 @@ static int bigwords(long id) * Look up foo in special section of vocab to determine which word we've got. * Last word zips the eggs back to the giant room (unless already there). */ { - if ((game.foobar == WORD_EMPTY && id == ACTION_WORD(FEE)) || - (game.foobar == ACTION_WORD(FEE) && id == ACTION_WORD(FIE)) || - (game.foobar == ACTION_WORD(FIE) && id == ACTION_WORD(FOE)) || - (game.foobar == ACTION_WORD(FOE) && id == ACTION_WORD(FOO)) || - (game.foobar == ACTION_WORD(FOE) && id == ACTION_WORD(FUM))) { + if ((game.foobar == WORD_EMPTY && id == FEE) || + (game.foobar == FEE && id == FIE) || + (game.foobar == FIE && id == FOE) || + (game.foobar == FOE && id == FOO) || + (game.foobar == FOE && id == FUM)) { game.foobar = id; - if ((id != ACTION_WORD(FOO)) && (id != ACTION_WORD(FUM))) { + if ((id != FOO) && (id != FUM)) { rspeak(OK_MAN); return GO_CLEAROBJ; } @@ -236,13 +236,16 @@ static void blast(void) !game.closed) rspeak(REQUIRES_DYNAMITE); else { - if (HERE(ROD2)) - game.bonus = SPLATTER_MESSAGE; - else if (game.loc == LOC_NE) - game.bonus = DEFEAT_MESSAGE; - else - game.bonus = VICTORY_MESSAGE; - rspeak(game.bonus); + if (HERE(ROD2)) { + game.bonus = splatter; + rspeak(SPLATTER_MESSAGE); + } else if (game.loc == LOC_NE) { + game.bonus = defeat; + rspeak(DEFEAT_MESSAGE); + } else { + game.bonus = victory; + rspeak(VICTORY_MESSAGE); + } terminate(endgame); } } @@ -308,40 +311,35 @@ static int vcarry(verb_t verb, obj_t obj) } 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; - } - if (obj == BEAR && game.prop[BEAR] == SITTING_BEAR) { - rspeak(BEAR_CHAINED); - return GO_CLEAROBJ; - } - if (obj == CHAIN && game.prop[BEAR] != UNTAMED_BEAR) { - rspeak(STILL_LOCKED); - return GO_CLEAROBJ; - } - if (obj == URN) { + switch (obj) { + case PLANT: + /* Next guard tests whether plant is tiny or stashed */ + rspeak(game.prop[PLANT] <= PLANT_THIRSTY ? DEEP_ROOTS : YOU_JOKING); + break; + case BEAR: + rspeak( game.prop[BEAR] == SITTING_BEAR ? BEAR_CHAINED : YOU_JOKING); + break; + case CHAIN: + rspeak( game.prop[BEAR] != UNTAMED_BEAR ? STILL_LOCKED : YOU_JOKING); + break; + case RUG: + rspeak(game.prop[RUG] == RUG_HOVER ? RUG_HOVERS : YOU_JOKING); + break; + case URN: rspeak(URN_NOBUDGE); - return GO_CLEAROBJ; - } - if (obj == CAVITY) { + break; + case CAVITY: rspeak(DOUGHNUT_HOLES); - return GO_CLEAROBJ; - } - if (obj == BLOOD) { + break; + case BLOOD: rspeak(FEW_DROPS); - return GO_CLEAROBJ; - } - if (obj == RUG && game.prop[RUG] == RUG_HOVER) { - rspeak(RUG_HOVERS); - return GO_CLEAROBJ; - } - if (obj == SIGN) { + break; + case SIGN: rspeak(HAND_PASSTHROUGH); - return GO_CLEAROBJ; + break; + default: + rspeak(YOU_JOKING); } - rspeak(YOU_JOKING); return GO_CLEAROBJ; } @@ -349,14 +347,14 @@ static int vcarry(verb_t verb, obj_t obj) obj == OIL) { if (!HERE(BOTTLE) || LIQUID() != obj) { - if (TOTING(BOTTLE)) { - if (game.prop[BOTTLE] == EMPTY_BOTTLE) { - return (fill(verb, BOTTLE)); - } else if (game.prop[BOTTLE] != EMPTY_BOTTLE) - rspeak(BOTTLE_FULL); + if (!TOTING(BOTTLE)) { + rspeak(NO_CONTAINER); return GO_CLEAROBJ; } - rspeak(NO_CONTAINER); + if (game.prop[BOTTLE] == EMPTY_BOTTLE) { + return (fill(verb, BOTTLE)); + } else + rspeak(BOTTLE_FULL); return GO_CLEAROBJ; } obj = BOTTLE; @@ -386,12 +384,16 @@ static int vcarry(verb_t verb, obj_t obj) } if ((obj == BIRD || obj == CAGE) && - (game.prop[BIRD] == BIRD_CAGED || STASHED(BIRD) == BIRD_CAGED)) + (game.prop[BIRD] == BIRD_CAGED || STASHED(BIRD) == BIRD_CAGED)) { /* 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) game.place[LIQUID()] = CARRIED; + if (GSTONE(obj) && game.prop[obj] != STATE_FOUND) { game.prop[obj] = STATE_FOUND; game.prop[CAVITY] = CAVITY_EMPTY; @@ -419,11 +421,13 @@ static int chain(verb_t verb) switch (game.prop[BEAR]) { case BEAR_DEAD: - /* Can't be reached as long as the only way for the bear to die - * is from a bridge collapse. Leave in in case this changes, but - * exclude from coverage testing. */ - game.fixed[BEAR] = IS_FIXED; // LCOV_EXCL_LINE + // LCOV_EXCL_START + /* Can't be reached as long as the only way for the bear to die + * is from a bridge collapse. Leave in in case this changes, but + * exclude from coverage testing. */ + game.fixed[BEAR] = IS_FIXED; break; + // LCOV_EXCL_STOP default: game.fixed[BEAR] = IS_FREE; } @@ -475,15 +479,13 @@ static int discard(verb_t verb, obj_t obj) game.prop[CAVITY] = CAVITY_FULL; if (HERE(RUG) && ((obj == EMERALD && game.prop[RUG] != RUG_HOVER) || (obj == RUBY && game.prop[RUG] == RUG_HOVER))) { - int spk; if (obj == RUBY) - spk = RUG_SETTLES; + rspeak(RUG_SETTLES); else if (TOTING(RUG)) - spk = RUG_WIGGLES; + rspeak(RUG_WIGGLES); else - spk = RUG_RISES; - rspeak(spk); - if (spk != RUG_WIGGLES) { + rspeak(RUG_RISES); + if (!TOTING(RUG) || obj == RUBY) { int k = (game.prop[RUG] == RUG_HOVER) ? RUG_FLOOR : RUG_HOVER; game.prop[RUG] = k; if (k == RUG_HOVER) @@ -901,7 +903,11 @@ static int listen(void) game.prop[i] < 0) continue; int mi = game.prop[i]; - /* FIXME: Weird magic on object states */ + /* (ESR) Some unpleasant magic on object states here. Ideally + * we'd have liked the bird to be a normal object that we can + * use state_change() on; can't do it, because there are + * actually two different series of per-state birdsounds + * depending on whether player has drunk dragon's blood. */ if (i == BIRD) mi += 3 * game.blooded; long packed_zzword = token_to_packed(game.zzword); @@ -1121,16 +1127,18 @@ static int say(struct command_t *command) } char word1[TOKLEN + 1]; packed_to_token(command->wd1, word1); - int wd = (int) get_vocab_id(word1); - if (wd == MOTION_WORD(XYZZY) || - wd == MOTION_WORD(PLUGH) || - wd == MOTION_WORD(PLOVER) || - wd == ACTION_WORD(FEE) || - wd == ACTION_WORD(FIE) || - wd == ACTION_WORD(FOE) || - wd == ACTION_WORD(FOO) || - wd == ACTION_WORD(FUM) || - wd == ACTION_WORD(PART)) { + long wd; + enum wordtype type; + get_vocab_metadata(word1, &wd, &type); + if (wd == XYZZY || + wd == PLUGH || + wd == PLOVER || + wd == FEE || + wd == FIE || + wd == FOE || + wd == FOO || + wd == FUM || + wd == PART) { /* FIXME: scribbles on the interpreter's command block */ wordclear(&command->wd2); return GO_LOOKUP;