X-Git-Url: https://jxself.org/git/?a=blobdiff_plain;ds=sidebyside;f=actions.c;h=fed70b9099531db585b436d51984d6d13f81628f;hb=c11938aed5e261ac40a562781325996628663610;hp=ec62447145edbe228892fb5d9ce6421ad97c69d7;hpb=258b7703f22045be1b6e9fb74bd3391ed94ed86b;p=open-adventure.git diff --git a/actions.c b/actions.c index ec62447..fed70b9 100644 --- a/actions.c +++ b/actions.c @@ -14,12 +14,11 @@ static phase_codes_t fill(verb_t, obj_t); -static phase_codes_t attack(command_t command) +static phase_codes_t attack(command_t command) { /* Attack. Assume target if unambiguous. "Throw" also links here. * Attackable objects fall into two categories: enemies (snake, * dwarf, etc.) and others (bird, clam, machine). Ambiguous if 2 * enemies, or no enemies but 2 others. */ -{ verb_t verb = command.verb; obj_t obj = command.obj; @@ -137,9 +136,9 @@ static phase_codes_t attack(command_t command) if (obj == OGRE) { rspeak(OGRE_DODGE); - if (atdwrf(game.loc) == 0) + if (atdwrf(game.loc) == 0) { return GO_CLEAROBJ; - + } rspeak(KNIFE_THROWN); DESTROY(OGRE); int dwarves = 0; @@ -185,12 +184,11 @@ static phase_codes_t attack(command_t command) return GO_CLEAROBJ; } -static phase_codes_t bigwords(vocab_t id) +static phase_codes_t bigwords(vocab_t id) { /* Only called on FEE FIE FOE FOO (AND FUM). Advance to next state if given * in proper order. 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). */ -{ int foobar = abs(game.foobar); /* Only FEE can start a magic-word sequence. */ @@ -219,30 +217,31 @@ static phase_codes_t bigwords(vocab_t id) if (game.objects[EGGS].place == LOC_NOWHERE && game.objects[TROLL].place == LOC_NOWHERE && game.objects[TROLL].prop == TROLL_UNPAID) game.objects[TROLL].prop = TROLL_PAIDONCE; - if (HERE(EGGS)) + if (HERE(EGGS)) { pspeak(EGGS, look, true, EGGS_VANISHED); - else if (game.loc == objects[EGGS].plac) + } else if (game.loc == objects[EGGS].plac) { pspeak(EGGS, look, true, EGGS_HERE); - else + } else { pspeak(EGGS, look, true, EGGS_DONE); + } move(EGGS, objects[EGGS].plac); return GO_CLEAROBJ; } } else { /* Magic-word sequence was started but is incorrect */ - if (settings.oldstyle || game.seenbigwords) - rspeak(START_OVER); - else + if (settings.oldstyle || game.seenbigwords) { + rspeak(START_OVER); + } else { rspeak(WELL_POINTLESS); + } game.foobar = WORD_EMPTY; return GO_CLEAROBJ; } } -static void blast(void) +static void blast(void) { /* Blast. No effect unless you've got dynamite, which is a neat trick! */ -{ if (PROP_IS_NOTFOUND(ROD2) || !game.closed) rspeak(REQUIRES_DYNAMITE); else { @@ -260,9 +259,8 @@ static void blast(void) } } -static phase_codes_t vbreak(verb_t verb, obj_t obj) +static phase_codes_t vbreak(verb_t verb, obj_t obj) { /* Break. Only works for mirror in repository and, of course, the vase. */ -{ switch (obj) { case MIRROR: if (game.closed) { @@ -287,26 +285,25 @@ static phase_codes_t vbreak(verb_t verb, obj_t obj) return (GO_CLEAROBJ); } -static phase_codes_t brief(void) +static phase_codes_t brief(void) { /* Brief. Intransitive only. Suppress full descriptions after first time. */ -{ game.abbnum = 10000; game.detail = 3; rspeak(BRIEF_CONFIRM); return GO_CLEAROBJ; } -static phase_codes_t vcarry(verb_t verb, obj_t obj) +static phase_codes_t vcarry(verb_t verb, obj_t obj) { /* Carry an object. Special cases for bird and cage (if bird in cage, can't * take one without the other). Liquids also special, since they depend on * status of bottle. Also various side effects, etc. */ -{ if (obj == INTRANSITIVE) { /* Carry, no object given yet. OK if only one object present. */ if (game.locs[game.loc].atloc == NO_OBJECT || game.link[game.locs[game.loc].atloc] != 0 || - atdwrf(game.loc) > 0) + atdwrf(game.loc) > 0) { return GO_UNKNOWN; + } obj = game.locs[game.loc].atloc; } @@ -362,8 +359,9 @@ static phase_codes_t vcarry(verb_t verb, obj_t obj) } if (game.objects[BOTTLE].prop == EMPTY_BOTTLE) { return (fill(verb, BOTTLE)); - } else + } else { rspeak(BOTTLE_FULL); + } return GO_CLEAROBJ; } obj = BOTTLE; @@ -399,8 +397,9 @@ static phase_codes_t vcarry(verb_t verb, obj_t obj) carry(obj, game.loc); - if (obj == BOTTLE && LIQUID() != NO_OBJECT) + if (obj == BOTTLE && LIQUID() != NO_OBJECT) { game.objects[LIQUID()].place = CARRIED; + } if (GSTONE(obj) && !PROP_IS_FOUND(obj)) { PROP_SET_FOUND(obj); @@ -410,9 +409,8 @@ static phase_codes_t vcarry(verb_t verb, obj_t obj) return GO_CLEAROBJ; } -static int chain(verb_t verb) +static int chain(verb_t verb) { /* Do something to the bear's chain */ -{ if (verb != LOCK) { if (game.objects[BEAR].prop == UNTAMED_BEAR) { rspeak(BEAR_BLOCKS); @@ -462,11 +460,10 @@ static int chain(verb_t verb) return GO_CLEAROBJ; } -static phase_codes_t discard(verb_t verb, obj_t obj) +static phase_codes_t discard(verb_t verb, obj_t obj) { /* Discard object. "Throw" also comes here for most objects. Special cases for * bird (might attack snake or dragon) and cage (might contain bird) and vase. * Drop coins at vending machine for extra batteries. */ -{ if (obj == ROD && !TOTING(ROD) && TOTING(ROD2)) { obj = ROD2; } @@ -482,17 +479,19 @@ static phase_codes_t discard(verb_t verb, obj_t obj) game.objects[CAVITY].prop = CAVITY_FULL; if (HERE(RUG) && ((obj == EMERALD && game.objects[RUG].prop != RUG_HOVER) || (obj == RUBY && game.objects[RUG].prop == RUG_HOVER))) { - if (obj == RUBY) - rspeak(RUG_SETTLES); - else if (TOTING(RUG)) - rspeak(RUG_WIGGLES); - else - rspeak(RUG_RISES); + if (obj == RUBY) { + rspeak(RUG_SETTLES); + } else if (TOTING(RUG)) { + rspeak(RUG_WIGGLES); + } else { + rspeak(RUG_RISES); + } if (!TOTING(RUG) || obj == RUBY) { int k = (game.objects[RUG].prop == RUG_HOVER) ? RUG_FLOOR : RUG_HOVER; game.objects[RUG].prop = k; - if (k == RUG_HOVER) + if (k == RUG_HOVER) { k = objects[SAPPH].plac; + } move(RUG + NOBJECTS, k); } } @@ -507,8 +506,9 @@ static phase_codes_t discard(verb_t verb, obj_t obj) return GO_CLEAROBJ; } - if (LIQUID() == obj) + if (LIQUID() == obj) { obj = BOTTLE; + } if (obj == BOTTLE && LIQUID() != NO_OBJECT) { game.objects[LIQUID()].place = LOC_NOWHERE; } @@ -529,8 +529,9 @@ static phase_codes_t discard(verb_t verb, obj_t obj) state_change(VASE, AT(PILLOW) ? VASE_WHOLE : VASE_DROPPED); - if (game.objects[VASE].prop != VASE_WHOLE) + if (game.objects[VASE].prop != VASE_WHOLE) { game.objects[VASE].fixed = IS_FIXED; + } drop(obj, game.loc); return GO_CLEAROBJ; } @@ -548,13 +549,15 @@ static phase_codes_t discard(verb_t verb, obj_t obj) } if (HERE(SNAKE)) { rspeak(BIRD_ATTACKS); - if (game.closed) + if (game.closed) { return GO_DWARFWAKE; + } DESTROY(SNAKE); /* Set game.prop for use by travel options */ game.objects[SNAKE].prop = SNAKE_CHASED; - } else + } else { rspeak(OK_MAN); + } game.objects[BIRD].prop = FOREST(game.loc) ? BIRD_FOREST_UNCAGED : BIRD_UNCAGED; drop(obj, game.loc); @@ -566,10 +569,9 @@ static phase_codes_t discard(verb_t verb, obj_t obj) return GO_CLEAROBJ; } -static phase_codes_t drink(verb_t verb, obj_t obj) +static phase_codes_t drink(verb_t verb, obj_t obj) { /* Drink. If no object, assume water and look for it here. If water is in * the bottle, drink that, else must be at a water loc, so drink stream. */ -{ if (obj == INTRANSITIVE && LIQLOC(game.loc) != WATER && (LIQUID() != WATER || !HERE(BOTTLE))) { return GO_UNKNOWN; @@ -596,10 +598,9 @@ static phase_codes_t drink(verb_t verb, obj_t obj) return GO_CLEAROBJ; } -static phase_codes_t eat(verb_t verb, obj_t obj) +static phase_codes_t eat(verb_t verb, obj_t obj) { /* Eat. Intransitive: assume food if present, else ask what. Transitive: food * ok, some things lose appetite, rest are ridiculous. */ -{ switch (obj) { case INTRANSITIVE: if (!HERE(FOOD)) @@ -626,16 +627,18 @@ static phase_codes_t eat(verb_t verb, obj_t obj) return GO_CLEAROBJ; } -static phase_codes_t extinguish(verb_t verb, obj_t obj) +static phase_codes_t extinguish(verb_t verb, obj_t obj) { /* Extinguish. Lamp, urn, dragon/volcano (nice try). */ -{ if (obj == INTRANSITIVE) { - if (HERE(LAMP) && game.objects[LAMP].prop == LAMP_BRIGHT) - obj = LAMP; - if (HERE(URN) && game.objects[URN].prop == URN_LIT) - obj = URN; - if (obj == INTRANSITIVE) - return GO_UNKNOWN; + if (HERE(LAMP) && game.objects[LAMP].prop == LAMP_BRIGHT) { + obj = LAMP; + } + if (HERE(URN) && game.objects[URN].prop == URN_LIT) { + obj = URN; + } + if (obj == INTRANSITIVE) { + return GO_UNKNOWN; + } } switch (obj) { @@ -662,26 +665,27 @@ static phase_codes_t extinguish(verb_t verb, obj_t obj) return GO_CLEAROBJ; } -static phase_codes_t feed(verb_t verb, obj_t obj) +static phase_codes_t feed(verb_t verb, obj_t obj) { /* Feed. If bird, no seed. Snake, dragon, troll: quip. If dwarf, make him * mad. Bear, special. */ -{ switch (obj) { case BIRD: rspeak(BIRD_PINING); break; case DRAGON: - if (game.objects[DRAGON].prop != DRAGON_BARS) - rspeak(RIDICULOUS_ATTEMPT); - else - rspeak(NOTHING_EDIBLE); + if (game.objects[DRAGON].prop != DRAGON_BARS) { + rspeak(RIDICULOUS_ATTEMPT); + } else { + rspeak(NOTHING_EDIBLE); + } break; case SNAKE: if (!game.closed && HERE(BIRD)) { DESTROY(BIRD); rspeak(BIRD_DEVOURED); - } else + } else { rspeak(NOTHING_EDIBLE); + } break; case TROLL: rspeak(TROLL_VICES); @@ -690,8 +694,9 @@ static phase_codes_t feed(verb_t verb, obj_t obj) if (HERE(FOOD)) { game.dflag += 2; rspeak(REALLY_MAD); - } else + } else { speak(actions[verb].message); + } break; case BEAR: if (game.objects[BEAR].prop == BEAR_DEAD) { @@ -704,17 +709,19 @@ static phase_codes_t feed(verb_t verb, obj_t obj) game.objects[AXE].fixed = IS_FREE; game.objects[AXE].prop = AXE_HERE; state_change(BEAR, SITTING_BEAR); - } else + } else { rspeak(NOTHING_EDIBLE); + } break; } speak(actions[verb].message); break; case OGRE: - if (HERE(FOOD)) - rspeak(OGRE_FULL); - else - speak(actions[verb].message); + if (HERE(FOOD)) { + rspeak(OGRE_FULL); + } else { + speak(actions[verb].message); + } break; default: rspeak(AM_GAME); @@ -722,10 +729,9 @@ static phase_codes_t feed(verb_t verb, obj_t obj) return GO_CLEAROBJ; } -phase_codes_t fill(verb_t verb, obj_t obj) +phase_codes_t fill(verb_t verb, obj_t obj) { /* Fill. Bottle or urn must be empty, and liquid available. (Vase * is nasty.) */ -{ if (obj == VASE) { if (LIQLOC(game.loc) == NO_OBJECT) { rspeak(FILL_INVALID); @@ -793,14 +799,14 @@ phase_codes_t fill(verb_t verb, obj_t obj) state_change(BOTTLE, (LIQLOC(game.loc) == OIL) ? OIL_BOTTLE : WATER_BOTTLE); - if (TOTING(BOTTLE)) + if (TOTING(BOTTLE)) { game.objects[LIQUID()].place = CARRIED; + } return GO_CLEAROBJ; } -static phase_codes_t find(verb_t verb, obj_t obj) +static phase_codes_t find(verb_t verb, obj_t obj) { /* Find. Might be carrying it, or it might be here. Else give caveat. */ -{ if (TOTING(obj)) { rspeak(ALREADY_CARRYING); return GO_CLEAROBJ; @@ -822,9 +828,8 @@ static phase_codes_t find(verb_t verb, obj_t obj) return GO_CLEAROBJ; } -static phase_codes_t fly(verb_t verb, obj_t obj) +static phase_codes_t fly(verb_t verb, obj_t obj) { /* Fly. Snide remarks unless hovering rug is here. */ -{ if (obj == INTRANSITIVE) { if (!HERE(RUG)) { rspeak(FLAP_ARMS); @@ -865,9 +870,8 @@ static phase_codes_t fly(verb_t verb, obj_t obj) return GO_TERMINATE; } -static phase_codes_t inven(void) +static phase_codes_t inven(void) { /* Inventory. If object, treat same as find. Else report on current burden. */ -{ bool empty = true; for (obj_t i = 1; i <= NOBJECTS; i++) { if (i == BEAR || !TOTING(i)) @@ -885,9 +889,8 @@ static phase_codes_t inven(void) return GO_CLEAROBJ; } -static phase_codes_t light(verb_t verb, obj_t obj) +static phase_codes_t light(verb_t verb, obj_t obj) { /* Light. Applicable only to lamp and urn. */ -{ if (obj == INTRANSITIVE) { int selects = 0; if (HERE(LAMP) && game.objects[LAMP].prop == LAMP_DARK && game.limit >= 0) { @@ -914,8 +917,9 @@ static phase_codes_t light(verb_t verb, obj_t obj) break; } state_change(LAMP, LAMP_BRIGHT); - if (game.wzdark) + if (game.wzdark) { return GO_TOP; + } break; default: speak(actions[verb].message); @@ -923,53 +927,61 @@ static phase_codes_t light(verb_t verb, obj_t obj) return GO_CLEAROBJ; } -static phase_codes_t listen(void) +static phase_codes_t listen(void) { /* Listen. Intransitive only. Print stuff based on object sound properties. */ -{ bool soundlatch = false; vocab_t sound = locations[game.loc].sound; if (sound != SILENT) { rspeak(sound); - if (!locations[game.loc].loud) + if (!locations[game.loc].loud) { rspeak(NO_MESSAGE); + } soundlatch = true; } for (obj_t i = 1; i <= NOBJECTS; i++) { - if (!HERE(i) || objects[i].sounds[0] == NULL || PROP_IS_STASHED_OR_UNSEEN(i)) - continue; + if (!HERE(i) || objects[i].sounds[0] == NULL || PROP_IS_STASHED_OR_UNSEEN(i)) { + continue; + } int mi = game.objects[i].prop; /* (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) + if (i == BIRD) { mi += 3 * game.blooded; + } pspeak(i, hear, true, mi, game.zzword); rspeak(NO_MESSAGE); - if (i == BIRD && mi == BIRD_ENDSTATE) + if (i == BIRD && mi == BIRD_ENDSTATE) { DESTROY(BIRD); + } soundlatch = true; } - if (!soundlatch) + if (!soundlatch) { rspeak(ALL_SILENT); + } return GO_CLEAROBJ; } -static phase_codes_t lock(verb_t verb, obj_t obj) +static phase_codes_t lock(verb_t verb, obj_t obj) { /* Lock, unlock, no object given. Assume various things if present. */ -{ if (obj == INTRANSITIVE) { - if (HERE(CLAM)) - obj = CLAM; - if (HERE(OYSTER)) - obj = OYSTER; - if (AT(DOOR)) - obj = DOOR; - if (AT(GRATE)) - obj = GRATE; - if (HERE(CHAIN)) - obj = CHAIN; + if (HERE(CLAM)) { + obj = CLAM; + } + if (HERE(OYSTER)) { + obj = OYSTER; + } + if (AT(DOOR)) { + obj = DOOR; + } + if (AT(GRATE)) { + obj = GRATE; + } + if (HERE(CHAIN)) { + obj = CHAIN; + } if (obj == INTRANSITIVE) { rspeak(NOTHING_LOCKED); return GO_CLEAROBJ; @@ -983,32 +995,35 @@ static phase_codes_t lock(verb_t verb, obj_t obj) case CHAIN: if (HERE(KEYS)) { return chain(verb); - } else + } else { rspeak(NO_KEYS); + } break; case GRATE: if (HERE(KEYS)) { if (game.closng) { rspeak(EXIT_CLOSED); - if (!game.panic) + if (!game.panic) { game.clock2 = PANICTIME; + } game.panic = true; } else { state_change(GRATE, (verb == LOCK) ? GRATE_CLOSED : GRATE_OPEN); } - } else + } else { rspeak(NO_KEYS); + } break; case CLAM: - if (verb == LOCK) - rspeak(HUH_MAN); - else if (TOTING(CLAM)) - rspeak(DROP_CLAM); - else if (!TOTING(TRIDENT)) - rspeak(CLAM_OPENER); - else { + if (verb == LOCK) { + rspeak(HUH_MAN); + } else if (TOTING(CLAM)) { + rspeak(DROP_CLAM); + } else if (!TOTING(TRIDENT)) { + rspeak(CLAM_OPENER); + } else { DESTROY(CLAM); drop(OYSTER, game.loc); drop(PEARL, LOC_CULDESAC); @@ -1016,14 +1031,15 @@ static phase_codes_t lock(verb_t verb, obj_t obj) } break; case OYSTER: - if (verb == LOCK) - rspeak(HUH_MAN); - else if (TOTING(OYSTER)) - rspeak(DROP_OYSTER); - else if (!TOTING(TRIDENT)) - rspeak(OYSTER_OPENER); - else - rspeak(OYSTER_OPENS); + if (verb == LOCK) { + rspeak(HUH_MAN); + } else if (TOTING(OYSTER)) { + rspeak(DROP_OYSTER); + } else if (!TOTING(TRIDENT)) { + rspeak(OYSTER_OPENER); + } else { + rspeak(OYSTER_OPENS); + } break; case DOOR: rspeak((game.objects[DOOR].prop == DOOR_UNRUSTED) ? OK_MAN : RUSTY_DOOR); @@ -1041,14 +1057,15 @@ static phase_codes_t lock(verb_t verb, obj_t obj) return GO_CLEAROBJ; } -static phase_codes_t pour(verb_t verb, obj_t obj) +static phase_codes_t pour(verb_t verb, obj_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. */ -{ - if (obj == BOTTLE || obj == INTRANSITIVE) - obj = LIQUID(); - if (obj == NO_OBJECT) - return GO_UNKNOWN; + if (obj == BOTTLE || obj == INTRANSITIVE) { + obj = LIQUID(); + } + if (obj == NO_OBJECT) { + return GO_UNKNOWN; + } if (!TOTING(obj)) { speak(actions[verb].message); return GO_CLEAROBJ; @@ -1058,8 +1075,9 @@ static phase_codes_t pour(verb_t verb, obj_t obj) rspeak(CANT_POUR); return GO_CLEAROBJ; } - if (HERE(URN) && game.objects[URN].prop == URN_EMPTY) + if (HERE(URN) && game.objects[URN].prop == URN_EMPTY) { return fill(verb, URN); + } game.objects[BOTTLE].prop = EMPTY_BOTTLE; game.objects[obj].place = LOC_NOWHERE; if (!(AT(PLANT) || AT(DOOR))) { @@ -1084,11 +1102,11 @@ static phase_codes_t pour(verb_t verb, obj_t obj) } } -static phase_codes_t quit(void) +static phase_codes_t quit(void) { /* Quit. Intransitive only. Verify intent and exit if that's what he wants. */ -{ - if (yes_or_no(arbitrary_messages[REALLY_QUIT], arbitrary_messages[OK_MAN], arbitrary_messages[OK_MAN])) - terminate(quitgame); + if (yes_or_no(arbitrary_messages[REALLY_QUIT], arbitrary_messages[OK_MAN], arbitrary_messages[OK_MAN])) { + terminate(quitgame); + } return GO_CLEAROBJ; } @@ -1098,11 +1116,13 @@ static phase_codes_t read(command_t command) if (command.obj == INTRANSITIVE) { command.obj = NO_OBJECT; for (int i = 1; i <= NOBJECTS; i++) { - if (HERE(i) && objects[i].texts[0] != NULL && !PROP_IS_STASHED(i)) - command.obj = command.obj * NOBJECTS + i; + if (HERE(i) && objects[i].texts[0] != NULL && !PROP_IS_STASHED(i)) { + command.obj = command.obj * NOBJECTS + i; + } } - if (command.obj > NOBJECTS || command.obj == NO_OBJECT || DARK(game.loc)) + if (command.obj > NOBJECTS || command.obj == NO_OBJECT || DARK(game.loc)) { return GO_UNKNOWN; + } } if (DARK(game.loc)) { @@ -1117,14 +1137,14 @@ static phase_codes_t read(command_t command) } } else if (objects[command.obj].texts[0] == NULL || PROP_IS_NOTFOUND(command.obj)) { speak(actions[command.verb].message); - } else + } else { pspeak(command.obj, study, true, game.objects[command.obj].prop); + } return GO_CLEAROBJ; } -static phase_codes_t reservoir(void) +static phase_codes_t reservoir(void) { /* Z'ZZZ (word gets recomputed at startup; different each game). */ -{ if (!AT(RESER) && game.loc != LOC_RESBOTTOM) { rspeak(NOTHING_HAPPENS); return GO_CLEAROBJ; @@ -1142,9 +1162,8 @@ static phase_codes_t reservoir(void) } } -static phase_codes_t rub(verb_t verb, obj_t obj) +static phase_codes_t rub(verb_t verb, obj_t obj) { /* Rub. Yields various snide remarks except for lit urn. */ -{ if (obj == URN && game.objects[URN].prop == URN_LIT) { DESTROY(URN); drop(AMBER, game.loc); @@ -1160,17 +1179,17 @@ static phase_codes_t rub(verb_t verb, obj_t obj) return GO_CLEAROBJ; } -static phase_codes_t say(command_t command) +static phase_codes_t say(command_t command) { /* Say. Echo WD2. Magic words override. */ -{ if (command.word[1].type == MOTION && (command.word[1].id == XYZZY || command.word[1].id == PLUGH || command.word[1].id == PLOVER)) { return GO_WORD2; } - if (command.word[1].type == ACTION && command.word[1].id == PART) + if (command.word[1].type == ACTION && command.word[1].id == PART) { return reservoir(); + } if (command.word[1].type == ACTION && (command.word[1].id == FEE || @@ -1192,12 +1211,11 @@ static phase_codes_t throw_support(vocab_t spk) return GO_MOVE; } -static phase_codes_t throwit(command_t command) +static phase_codes_t throwit(command_t command) { /* Throw. Same as discard unless axe. Then same as attack except * ignore bird, and if dwarf is present then one might be killed. * (Only way to do so!) Axe also special for dragon, bear, and * troll. Treasures special for troll. */ -{ if (!TOTING(command.obj)) { speak(actions[command.verb].message); return GO_CLEAROBJ; @@ -1218,16 +1236,18 @@ static phase_codes_t throwit(command_t command) command.obj = BEAR; return (feed(command.verb, command.obj)); } - if (command.obj != AXE) + if (command.obj != AXE) { return (discard(command.verb, command.obj)); - else { + } else { if (atdwrf(game.loc) <= 0) { if (AT(DRAGON) && game.objects[DRAGON].prop == DRAGON_BARS) return throw_support(DRAGON_SCALES); - if (AT(TROLL)) - return throw_support(TROLL_RETURNS); - if (AT(OGRE)) + if (AT(TROLL)) { + return throw_support(TROLL_RETURNS); + } + if (AT(OGRE)) { return throw_support(OGRE_DODGE); + } if (HERE(BEAR) && game.objects[BEAR].prop == UNTAMED_BEAR) { /* This'll teach him to throw the axe at the bear! */ drop(AXE, game.loc); @@ -1253,9 +1273,8 @@ static phase_codes_t throwit(command_t command) } } -static phase_codes_t wake(verb_t verb, obj_t obj) +static phase_codes_t wake(verb_t verb, obj_t obj) { /* Wake. Only use is to disturb the dwarves. */ -{ if (obj != DWARF || !game.closed) { speak(actions[verb].message); return GO_CLEAROBJ; @@ -1265,9 +1284,8 @@ static phase_codes_t wake(verb_t verb, obj_t obj) } } -static phase_codes_t seed(verb_t verb, const char *arg) +static phase_codes_t seed(verb_t verb, const char *arg) { /* Set seed */ -{ int32_t seed = strtol(arg, NULL, 10); speak(actions[verb].message, seed); set_seed(seed); @@ -1275,17 +1293,15 @@ static phase_codes_t seed(verb_t verb, const char *arg) return GO_TOP; } -static phase_codes_t waste(verb_t verb, turn_t turns) +static phase_codes_t waste(verb_t verb, turn_t turns) { /* Burn turns */ -{ game.limit -= turns; speak(actions[verb].message, (int)game.limit); return GO_TOP; } -static phase_codes_t wave(verb_t verb, obj_t obj) +static phase_codes_t wave(verb_t verb, obj_t obj) { /* Wave. No effect unless waving rod at fissure or at bird. */ -{ if (obj != ROD || !TOTING(obj) || (!HERE(BIRD) && (game.closng || !AT(FISSURE)))) { speak(((!TOTING(obj)) && (obj != ROD || !TOTING(ROD2))) ? @@ -1325,11 +1341,10 @@ static phase_codes_t wave(verb_t verb, obj_t obj) } } -phase_codes_t action(command_t command) +phase_codes_t action(command_t command) { /* Analyse a verb. Remember what it was, go back for object if second word * unless verb is "say", which snarfs arbitrary second word. */ -{ /* Previously, actions that result in a message, but don't do anything * further were called "specials". Now they're handled here as normal * actions. If noaction is true, then we spit out the message and return */ @@ -1346,14 +1361,14 @@ phase_codes_t action(command_t command) * they are never actually dropped at any location, but might * be here inside the bottle or urn or as a feature of the * location. */ - if (HERE(command.obj)) - /* FALL THROUGH */; - else if (command.obj == DWARF && atdwrf(game.loc) > 0) - /* FALL THROUGH */; - else if (!game.closed && ((LIQUID() == command.obj && HERE(BOTTLE)) || - command.obj == LIQLOC(game.loc))) - /* FALL THROUGH */; - else if (command.obj == OIL && HERE(URN) && game.objects[URN].prop != URN_EMPTY) { + if (HERE(command.obj)) { + /* FALL THROUGH */; + } else if (command.obj == DWARF && atdwrf(game.loc) > 0) { + /* FALL THROUGH */; + } else if (!game.closed && ((LIQUID() == command.obj && HERE(BOTTLE)) || + command.obj == LIQLOC(game.loc))) { + /* FALL THROUGH */; + } else if (command.obj == OIL && HERE(URN) && game.objects[URN].prop != URN_EMPTY) { command.obj = URN; /* FALL THROUGH */; } else if (command.obj == PLANT && AT(PLANT2) && game.objects[PLANT2].prop != PLANT_THIRSTY) { @@ -1367,26 +1382,29 @@ phase_codes_t action(command_t command) command.obj = ROD2; /* FALL THROUGH */; } else if ((command.verb == FIND || - command.verb == INVENTORY) && (command.word[1].id == WORD_EMPTY || command.word[1].id == WORD_NOT_FOUND)) + command.verb == INVENTORY) && (command.word[1].id == WORD_EMPTY || command.word[1].id == WORD_NOT_FOUND)) { /* FALL THROUGH */; - else { + } else { sspeak(NO_SEE, command.word[0].raw); return GO_CLEAROBJ; } - if (command.verb != 0) + if (command.verb != 0) { command.part = transitive; + } } switch (command.part) { case intransitive: - if (command.word[1].raw[0] != '\0' && command.verb != SAY) - return GO_WORD2; - if (command.verb == SAY) - /* KEYS is not special, anything not NO_OBJECT or INTRANSITIVE - * will do here. We're preventing interpretation as an intransitive - * verb when the word is unknown. */ - command.obj = command.word[1].raw[0] != '\0' ? KEYS : NO_OBJECT; + if (command.word[1].raw[0] != '\0' && command.verb != SAY) { + return GO_WORD2; + } + if (command.verb == SAY) { + /* KEYS is not special, anything not NO_OBJECT or INTRANSITIVE + * will do here. We're preventing interpretation as an intransitive + * verb when the word is unknown. */ + command.obj = command.word[1].raw[0] != '\0' ? KEYS : NO_OBJECT; + } if (command.obj == NO_OBJECT || command.obj == INTRANSITIVE) { /* Analyse an intransitive verb (ie, no object given yet). */ switch (command.verb) { @@ -1522,10 +1540,9 @@ phase_codes_t action(command_t command) return rub(command.verb, command.obj); case THROW: return throwit(command); - case QUIT: { + case QUIT: speak(actions[command.verb].message); return GO_CLEAROBJ; - } case FIND: return find(command.verb, command.obj); case INVENTORY: @@ -1537,42 +1554,36 @@ phase_codes_t action(command_t command) case BLAST: blast(); return GO_CLEAROBJ; - case SCORE: { + case SCORE: speak(actions[command.verb].message); return GO_CLEAROBJ; - } case FEE: case FIE: case FOE: case FOO: - case FUM: { + case FUM: speak(actions[command.verb].message); return GO_CLEAROBJ; - } - case BRIEF: { + case BRIEF: speak(actions[command.verb].message); return GO_CLEAROBJ; - } case READ: return read(command); case BREAK: return vbreak(command.verb, command.obj); case WAKE: return wake(command.verb, command.obj); - case SAVE: { + case SAVE: speak(actions[command.verb].message); return GO_CLEAROBJ; - } - case RESUME: { + case RESUME: speak(actions[command.verb].message); return GO_CLEAROBJ; - } case FLY: return fly(command.verb, command.obj); - case LISTEN: { + case LISTEN: speak(actions[command.verb].message); return GO_CLEAROBJ; - } // LCOV_EXCL_START // This case should never happen - here only as placeholder case PART: @@ -1593,3 +1604,5 @@ phase_codes_t action(command_t command) BUG(SPEECHPART_NOT_TRANSITIVE_OR_INTRANSITIVE_OR_UNKNOWN); // LCOV_EXCL_LINE } } + +// end