X-Git-Url: https://jxself.org/git/?a=blobdiff_plain;f=actions.c;h=910d46c2eb555745959c081a20c461b249ec2552;hb=9d918edeaa244e97e4fc7b4605bf0efb31f2b5d1;hp=6189c36522443334bae0923827eacacf8a6aa584;hpb=aca6d79087dc9ef6f9f1b4e1d2ef0d25d405db9b;p=open-adventure.git diff --git a/actions.c b/actions.c index 6189c36..910d46c 100644 --- a/actions.c +++ b/actions.c @@ -6,6 +6,12 @@ static int fill(token_t, token_t); +static void state_change(long obj, long state) +{ + game.prop[obj] = state; + pspeak(obj, change, state); +} + static int attack(FILE *input, struct command_t *command) /* Attack. Assume target if unambiguous. "Throw" also links here. * Attackable objects fall into two categories: enemies (snake, @@ -22,7 +28,8 @@ static int attack(FILE *input, struct command_t *command) if (AT(DRAGON) && game.prop[DRAGON] == 0)obj = obj * NOBJECTS + DRAGON; if (AT(TROLL))obj = obj * NOBJECTS + TROLL; if (AT(OGRE))obj = obj * NOBJECTS + OGRE; - if (HERE(BEAR) && game.prop[BEAR] == 0)obj = obj * NOBJECTS + BEAR; + if (HERE(BEAR) && game.prop[BEAR] == UNTAMED_BEAR) + obj = obj * NOBJECTS + BEAR; if (obj > NOBJECTS) return GO_UNKNOWN; if (obj == 0) { /* Can't attack bird or machine by throwing axe. */ @@ -44,9 +51,8 @@ static int attack(FILE *input, struct command_t *command) DESTROY(BIRD); spk = BIRD_DEAD; } else if (obj == VEND) { - bool blocking = (game.prop[VEND] == VEND_BLOCKS); - game.prop[VEND] = blocking ? VEND_UNBLOCKS : VEND_BLOCKS; - rspeak(blocking ? MACHINE_SWINGOUT : MACHINE_SWINGBACK); + state_change(VEND, + game.prop[VEND]==VEND_BLOCKS ? VEND_UNBLOCKS : VEND_BLOCKS); return GO_CLEAROBJ; } @@ -224,8 +230,10 @@ static int vcarry(token_t verb, token_t obj) } spk = YOU_JOKING; if (obj == PLANT && game.prop[PLANT] <= 0)spk = DEEP_ROOTS; - if (obj == BEAR && game.prop[BEAR] == 1)spk = BEAR_CHAINED; - if (obj == CHAIN && game.prop[BEAR] != 0)spk = STILL_LOCKED; + if (obj == BEAR && game.prop[BEAR] == SITTING_BEAR) + spk = BEAR_CHAINED; + if (obj == CHAIN && game.prop[BEAR] != UNTAMED_BEAR) + spk = STILL_LOCKED; if (obj == URN)spk = URN_NOBUDGE; if (obj == CAVITY)spk = DOUGHNUT_HOLES; if (obj == BLOOD)spk = FEW_DROPS; @@ -280,7 +288,7 @@ static int vcarry(token_t verb, token_t obj) game.place[LIQUID()] = CARRIED; if (GSTONE(obj) && game.prop[obj] != 0) { game.prop[obj] = 0; - game.prop[CAVITY] = 1; + game.prop[CAVITY] = CAVITY_EMPTY; } rspeak(OK_MAN); return GO_CLEAROBJ; @@ -292,26 +300,33 @@ static int chain(token_t verb) int spk; if (verb != LOCK) { spk = CHAIN_UNLOCKED; - if (game.prop[BEAR] == 0)spk = BEAR_BLOCKS; - if (game.prop[CHAIN] == 0)spk = ALREADY_UNLOCKED; + if (game.prop[BEAR] == UNTAMED_BEAR) + spk = BEAR_BLOCKS; + if (game.prop[CHAIN] == 0) + spk = ALREADY_UNLOCKED; if (spk != CHAIN_UNLOCKED) { rspeak(spk); return GO_CLEAROBJ; } game.prop[CHAIN] = 0; game.fixed[CHAIN] = 0; - if (game.prop[BEAR] != 3)game.prop[BEAR] = 2; + if (game.prop[BEAR] != BEAR_DEAD) + game.prop[BEAR] = CONTENTED_BEAR; + /* FIXME: Arithmetic on state numbers */ game.fixed[BEAR] = 2 - game.prop[BEAR]; } else { spk = CHAIN_LOCKED; - if (game.prop[CHAIN] != 0)spk = ALREADY_LOCKED; - if (game.loc != objects[CHAIN].plac)spk = NO_LOCKSITE; + if (game.prop[CHAIN] != 0) + spk = ALREADY_LOCKED; + if (game.loc != objects[CHAIN].plac) + spk = NO_LOCKSITE; if (spk != CHAIN_LOCKED) { rspeak(spk); return GO_CLEAROBJ; } game.prop[CHAIN] = 2; - if (TOTING(CHAIN))drop(CHAIN, game.loc); + if (TOTING(CHAIN)) + drop(CHAIN, game.loc); game.fixed[CHAIN] = -1; } rspeak(spk); @@ -335,12 +350,12 @@ static int discard(token_t verb, token_t obj, bool just_do_it) if (game.closed) return GO_DWARFWAKE; DESTROY(SNAKE); /* Set game.prop for use by travel options */ - game.prop[SNAKE] = 1; + game.prop[SNAKE] = SNAKE_CHASED; - } else if ((GSTONE(obj) && AT(CAVITY) && game.prop[CAVITY] != 0)) { + } else if ((GSTONE(obj) && AT(CAVITY) && game.prop[CAVITY] != CAVITY_FULL)) { rspeak(GEM_FITS); game.prop[obj] = 1; - game.prop[CAVITY] = 0; + game.prop[CAVITY] = CAVITY_FULL; if (HERE(RUG) && ((obj == EMERALD && game.prop[RUG] != 2) || (obj == RUBY && game.prop[RUG] == 2))) { spk = RUG_RISES; @@ -456,8 +471,7 @@ static int extinguish(token_t verb, int obj) game.prop[URN] = game.prop[URN] / 2; spk = URN_DARK; } else if (obj == LAMP) { - game.prop[LAMP] = LAMP_DARK; - rspeak(LAMP_OFF); + state_change(LAMP, LAMP_DARK); spk = DARK(game.loc) ? PITCH_DARK : NO_MESSAGE; } else if (obj == DRAGON || obj == VOLCANO) spk = BEYOND_POWER; @@ -487,11 +501,13 @@ static int feed(token_t verb, token_t obj) spk = REALLY_MAD; } } else if (obj == BEAR) { - if (game.prop[BEAR] == 0)spk = NOTHING_EDIBLE; - if (game.prop[BEAR] == 3)spk = RIDICULOUS_ATTEMPT; + 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] = 1; + game.prop[BEAR] = SITTING_BEAR; game.fixed[AXE] = 0; game.prop[AXE] = 0; spk = BEAR_TAMED; @@ -663,8 +679,7 @@ static int light(token_t verb, token_t obj) rspeak(spk); return GO_CLEAROBJ; } - game.prop[LAMP] = LAMP_BRIGHT; - rspeak(LAMP_ON); + state_change(LAMP, LAMP_BRIGHT); if (game.wzdark) return GO_TOP; else @@ -737,8 +752,8 @@ static int lock(token_t verb, token_t obj) if (!game.panic)game.clock2 = PANICTIME; game.panic = true; } else { - game.prop[GRATE] = (verb == LOCK) ? GRATE_CLOSED : GRATE_OPEN; - spk = game.prop[GRATE] ? GRATE_UNLOCKED : GRATE_LOCKED; + state_change(GRATE, (verb == LOCK) ? GRATE_CLOSED : GRATE_OPEN); + return GO_CLEAROBJ; } } } @@ -927,7 +942,7 @@ static int throw (FILE *cmdin, struct command_t *command) return throw_support(TROLL_RETURNS); else if (AT(OGRE)) return throw_support(OGRE_DODGE); - else if (HERE(BEAR) && game.prop[BEAR] == 0) { + 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;