X-Git-Url: https://jxself.org/git/?a=blobdiff_plain;f=actions.c;h=062c3721aaaf9b90936794b8b02bc35dc9162b39;hb=fc5267fe8b856de9480f2b5400fbe3a22519f0a3;hp=51ad0ef5d432d9d020c6279df161179e9f32e775;hpb=eeda78a2100cec2609a12d7cb618662e2370b870;p=open-adventure.git diff --git a/actions.c b/actions.c index 51ad0ef..062c372 100644 --- a/actions.c +++ b/actions.c @@ -20,9 +20,6 @@ static int attack(struct command_t *command) vocab_t verb = command->verb; vocab_t obj = command->obj; - if (obj == INTRANSITIVE) { - return GO_UNKNOWN; - } long spk = actions[verb].message; if (obj == NO_OBJECT || obj == INTRANSITIVE) { int changes = 0; @@ -208,21 +205,26 @@ static int bigwords(token_t foo) static int bivalve(token_t verb, token_t obj) /* Clam/oyster actions */ { - int spk; bool is_oyster = (obj == OYSTER); - spk = is_oyster ? OYSTER_OPENS : PEARL_FALLS; - if (TOTING(obj)) - spk = is_oyster ? DROP_OYSTER : DROP_CLAM; - if (!TOTING(TRIDENT)) - spk = is_oyster ? OYSTER_OPENER : CLAM_OPENER; - if (verb == LOCK) - spk = HUH_MAN; - if (spk == PEARL_FALLS) { + if (verb == LOCK) { + rspeak(HUH_MAN); + return GO_CLEAROBJ; + } + if (!TOTING(TRIDENT)) { + rspeak(is_oyster ? OYSTER_OPENER : CLAM_OPENER); + return GO_CLEAROBJ; + } + if (TOTING(obj)) { + rspeak( is_oyster ? DROP_OYSTER : DROP_CLAM); + return GO_CLEAROBJ; + } + + if (!is_oyster) { DESTROY(CLAM); drop(OYSTER, game.loc); drop(PEARL, LOC_CULDESAC); } - rspeak(spk); + rspeak(is_oyster ? OYSTER_OPENS : PEARL_FALLS); return GO_CLEAROBJ; } @@ -521,23 +523,25 @@ static int eat(token_t verb, token_t obj) /* Eat. Intransitive: assume food if present, else ask what. Transitive: food * ok, some things lose appetite, rest are ridiculous. */ { - int spk = actions[verb].message; if (obj == INTRANSITIVE) { if (!HERE(FOOD)) return GO_UNKNOWN; DESTROY(FOOD); - spk = THANKS_DELICIOUS; - } else { - if (obj == FOOD) { - DESTROY(FOOD); - spk = THANKS_DELICIOUS; - } - if (obj == BIRD || obj == SNAKE || obj == CLAM || obj == OYSTER || obj == - DWARF || obj == DRAGON || obj == TROLL || obj == BEAR || obj == - OGRE) - spk = LOST_APPETITE; + rspeak(THANKS_DELICIOUS); + return GO_CLEAROBJ; } - rspeak(spk); + if (obj == FOOD) { + DESTROY(FOOD); + rspeak(THANKS_DELICIOUS); + return GO_CLEAROBJ; + } + if (obj == BIRD || obj == SNAKE || obj == CLAM || obj == OYSTER || obj == + DWARF || obj == DRAGON || obj == TROLL || obj == BEAR || obj == + OGRE) { + rspeak(LOST_APPETITE); + return GO_CLEAROBJ; + } + rspeak(actions[verb].message); return GO_CLEAROBJ; } @@ -701,36 +705,36 @@ static int find(token_t verb, token_t obj) static int fly(token_t verb, token_t obj) /* Fly. Snide remarks unless hovering rug is here. */ { - int spk = actions[verb].message; if (obj == INTRANSITIVE) { - if (game.prop[RUG] != RUG_HOVER) - spk = RUG_NOTHING2; - if (!HERE(RUG)) - spk = FLAP_ARMS; - if (spk == RUG_NOTHING2 || spk == FLAP_ARMS) { - rspeak(spk); + if (!HERE(RUG)) { + rspeak(FLAP_ARMS); + return GO_CLEAROBJ; + } + if (game.prop[RUG] != RUG_HOVER) { + rspeak(RUG_NOTHING2); return GO_CLEAROBJ; } obj = RUG; } if (obj != RUG) { - rspeak(spk); + rspeak(actions[verb].message); return GO_CLEAROBJ; } - spk = RUG_NOTHING1; if (game.prop[RUG] != RUG_HOVER) { - rspeak(spk); + rspeak(RUG_NOTHING1); return GO_CLEAROBJ; } game.oldlc2 = game.oldloc; game.oldloc = game.loc; /* FIXME: Arithmetic on location values */ game.newloc = game.place[RUG] + game.fixed[RUG] - game.loc; - spk = RUG_GOES; - if (game.prop[SAPPH] >= 0) - spk = RUG_RETURNS; - rspeak(spk); + + if (game.prop[SAPPH] >= 0) { + rspeak(RUG_RETURNS); + } else { + rspeak(RUG_GOES); + } return GO_TERMINATE; } @@ -789,15 +793,12 @@ static int light(token_t verb, token_t obj) static int listen(void) /* Listen. Intransitive only. Print stuff based on objsnd/locsnd. */ { - long k; - int spk = ALL_SILENT; - k = locations[game.loc].sound; - if (k != SILENT) { - rspeak(k); - if (locations[game.loc].loud) - return GO_CLEAROBJ; - else - spk = NO_MESSAGE; + long sound = locations[game.loc].sound; + if (sound != SILENT) { + rspeak(sound); + if (!locations[game.loc].loud) + rspeak(NO_MESSAGE); + return GO_CLEAROBJ; } for (int i = 1; i <= NOBJECTS; i++) { if (!HERE(i) || objects[i].sounds[0] == NULL || game.prop[i] < 0) @@ -807,21 +808,20 @@ static int listen(void) mi += 3 * game.blooded; long packed_zzword = token_to_packed(game.zzword); pspeak(i, hear, mi, true, packed_zzword); - spk = NO_MESSAGE; + rspeak(NO_MESSAGE); /* FIXME: Magic number, sensitive to bird state logic */ if (i == BIRD && game.prop[i] == 5) DESTROY(BIRD); + return GO_CLEAROBJ; } - rspeak(spk); + rspeak(ALL_SILENT); return GO_CLEAROBJ; } static int lock(token_t verb, token_t obj) /* Lock, unlock, no object given. Assume various things if present. */ { - int spk = actions[verb].message; if (obj == INTRANSITIVE) { - spk = NOTHING_LOCKED; if (HERE(CLAM)) obj = CLAM; if (HERE(OYSTER)) @@ -833,19 +833,18 @@ static int lock(token_t verb, token_t obj) if (HERE(CHAIN)) obj = CHAIN; if (obj == NO_OBJECT || obj == INTRANSITIVE) { - rspeak(spk); + rspeak(NOTHING_LOCKED); return GO_CLEAROBJ; } } /* Lock, unlock object. Special stuff for opening clam/oyster * and for chain. */ + int spk = actions[verb].message; if (obj == CLAM || obj == OYSTER) return bivalve(verb, obj); if (obj == DOOR) - spk = RUSTY_DOOR; - if (obj == DOOR && game.prop[DOOR] == DOOR_UNRUSTED) - spk = OK_MAN; + spk = (game.prop[DOOR] == DOOR_UNRUSTED) ? OK_MAN : RUSTY_DOOR; if (obj == CAGE) spk = NO_LOCK; if (obj == KEYS) @@ -874,33 +873,30 @@ static int pour(token_t verb, token_t obj) /* Pour. If no object, or object is bottle, assume contents of bottle. * special tests for pouring water or oil on plant or rusty door. */ { - int spk = actions[verb].message; if (obj == BOTTLE || obj == NO_OBJECT) obj = LIQUID(); if (obj == NO_OBJECT) return GO_UNKNOWN; if (!TOTING(obj)) { - rspeak(spk); + rspeak(actions[verb].message); return GO_CLEAROBJ; } - spk = CANT_POUR; + if (obj != OIL && obj != WATER) { - rspeak(spk); + rspeak(CANT_POUR); return GO_CLEAROBJ; } if (HERE(URN) && game.prop[URN] == URN_EMPTY) return fill(verb, URN); game.prop[BOTTLE] = EMPTY_BOTTLE; game.place[obj] = LOC_NOWHERE; - spk = GROUND_WET; if (!(AT(PLANT) || AT(DOOR))) { - rspeak(spk); + rspeak(GROUND_WET); return GO_CLEAROBJ; } if (!AT(DOOR)) { - spk = SHAKING_LEAVES; if (obj != WATER) { - rspeak(spk); + rspeak(SHAKING_LEAVES); return GO_CLEAROBJ; } pspeak(PLANT, look, game.prop[PLANT] + 3, true); @@ -1089,16 +1085,13 @@ static int wake(token_t verb, token_t obj) static int wave(token_t verb, token_t obj) /* Wave. No effect unless waving rod at fissure or at bird. */ { - if ((!TOTING(obj)) && (obj != ROD || !TOTING(ROD2))) { - rspeak(ARENT_CARRYING); - return GO_CLEAROBJ; - } if (obj != ROD || !TOTING(obj) || (!HERE(BIRD) && (game.closng || !AT(FISSURE)))) { - rspeak(actions[verb].message); + rspeak(((!TOTING(obj)) && (obj != ROD || !TOTING(ROD2))) ? ARENT_CARRYING : actions[verb].message); return GO_CLEAROBJ; } + if (game.prop[BIRD] == BIRD_UNCAGED && game.loc == game.place[STEPS] && game.prop[JADE] < 0) { drop(JADE, game.loc); game.prop[JADE] = 0; @@ -1107,24 +1100,16 @@ static int wave(token_t verb, token_t obj) return GO_CLEAROBJ; } else { if (game.closed) { - rspeak(actions[verb].message); + rspeak((game.prop[BIRD] == BIRD_CAGED) ? CAGE_FLY : FREE_FLY); return GO_DWARFWAKE; } if (game.closng || !AT(FISSURE)) { - rspeak(actions[verb].message); + rspeak((game.prop[BIRD] == BIRD_CAGED) ? CAGE_FLY : FREE_FLY); return GO_CLEAROBJ; } - if (HERE(BIRD)) { - switch (game.prop[BIRD]) { - case BIRD_UNCAGED: - case BIRD_FOREST_UNCAGED: - rspeak(FREE_FLY); - break; - case BIRD_CAGED: - rspeak(CAGE_FLY); - break; - } - } + if (HERE(BIRD)) + rspeak((game.prop[BIRD] == BIRD_CAGED) ? CAGE_FLY : FREE_FLY); + /* FIXME: Arithemetic on property values */ game.prop[FISSURE] = 1 - game.prop[FISSURE]; pspeak(FISSURE, look, 2 - game.prop[FISSURE], true);