X-Git-Url: https://jxself.org/git/?a=blobdiff_plain;f=actions.c;h=cc2f66cedc1348eb781a5ee8c1ffa18425a03835;hb=73c9b595079be9494f33370709a1befdd2a94de8;hp=4f802b6f6a273de40a0d1191ffcdca0feca4af22;hpb=a02b3879998e78555852f4a81a19e80694e38cdc;p=open-adventure.git diff --git a/actions.c b/actions.c index 4f802b6..cc2f66c 100644 --- a/actions.c +++ b/actions.c @@ -29,7 +29,7 @@ static int attack(FILE *input, long verb, token_t obj) 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 (obj > NOBJECTS) return(8000); + if (obj > NOBJECTS) return GO_UNKNOWN; if (obj == 0) { /* Can't attack bird or machine by throwing axe. */ if (HERE(BIRD) && verb != THROW)obj=BIRD; @@ -37,7 +37,7 @@ static int attack(FILE *input, long verb, token_t obj) /* Clam and oyster both treated as clam for intransitive case; * no harm done. */ if (HERE(CLAM) || HERE(OYSTER))obj=NOBJECTS*obj+CLAM; - if (obj > NOBJECTS) return(8000); + if (obj > NOBJECTS) return GO_UNKNOWN; } } if (obj == BIRD) { @@ -129,17 +129,18 @@ static int bigwords(long foo) if (game.place[EGGS]==PLAC[EGGS] || (TOTING(EGGS) && game.loc==PLAC[EGGS])) { RSPEAK(spk); return GO_CLEAROBJ; + } else { + /* Bring back troll if we steal the eggs back from him before + * crossing. */ + if (game.place[EGGS]==0 && game.place[TROLL]==0 && game.prop[TROLL]==0) + game.prop[TROLL]=1; + k=2; + if (HERE(EGGS))k=1; + if (game.loc == PLAC[EGGS])k=0; + MOVE(EGGS,PLAC[EGGS]); + PSPEAK(EGGS,k); + return GO_CLEAROBJ; } - /* Bring back troll if we steal the eggs back from him before - * crossing. */ - if (game.place[EGGS]==0 && game.place[TROLL]==0 && game.prop[TROLL]==0) - game.prop[TROLL]=1; - k=2; - if (HERE(EGGS))k=1; - if (game.loc == PLAC[EGGS])k=0; - MOVE(EGGS,PLAC[EGGS]); - PSPEAK(EGGS,k); - return GO_CLEAROBJ; } } @@ -176,6 +177,7 @@ static int blast(void) game.bonus=135; RSPEAK(game.bonus); score(0); + return GO_CLEAROBJ; /* pacify compiler - we never get here */ } static int vbreak(token_t verb, token_t obj) @@ -191,7 +193,7 @@ static int vbreak(token_t verb, token_t obj) } else { if (obj == MIRROR && game.closed) { RSPEAK(197); - return(190000); + return GO_DWARFWAKE; } } RSPEAK(spk); @@ -218,7 +220,7 @@ static int carry(token_t verb, token_t obj) if(game.atloc[game.loc] == 0 || game.link[game.atloc[game.loc]] != 0 || ATDWRF(game.loc) > 0) - return(8000); + return GO_UNKNOWN; obj=game.atloc[game.loc]; } @@ -233,9 +235,9 @@ static int carry(token_t verb, token_t obj) if (obj == RUG && game.prop[RUG] == 2)spk=222; if (obj == SIGN)spk=196; if (obj == MESSAG) { - spk=190; - return GO_CLEAROBJ; + RSPEAK(190); DSTROY(MESSAG); + return GO_CLEAROBJ; } if (game.fixed[obj] != 0) { RSPEAK(spk); @@ -389,16 +391,14 @@ static int drink(token_t verb, token_t obj) { int spk = ACTSPK[verb]; if (obj == 0 && LIQLOC(game.loc) != WATER && (LIQUID() != WATER || !HERE(BOTTLE))) - return(8000); + return GO_UNKNOWN; if (obj != BLOOD) { if (obj != 0 && obj != WATER)spk=110; - if (spk == 110 || LIQUID() != WATER || !HERE(BOTTLE)) { - RSPEAK(spk); - return GO_CLEAROBJ; + if (spk != 110 && LIQUID() == WATER && HERE(BOTTLE)) { + game.prop[BOTTLE]=1; + game.place[WATER]=0; + spk=74; } - game.prop[BOTTLE]=1; - game.place[WATER]=0; - spk=74; } else { DSTROY(BLOOD); game.prop[DRAGON]=2; @@ -416,7 +416,7 @@ static int eat(token_t verb, token_t obj) int spk = ACTSPK[verb]; if (obj == INTRANSITIVE) { if (!HERE(FOOD)) - return(8000); + return GO_UNKNOWN; DSTROY(FOOD); spk=72; } else { @@ -439,21 +439,17 @@ static int extinguish(token_t verb, int obj) if (obj == INTRANSITIVE) { if (HERE(LAMP) && game.prop[LAMP] == 1)obj=LAMP; if (HERE(URN) && game.prop[URN] == 2)obj=obj*NOBJECTS+URN; - if (obj == INTRANSITIVE || obj == 0 || obj > NOBJECTS) return(8000); + if (obj == INTRANSITIVE || obj == 0 || obj > NOBJECTS) return GO_UNKNOWN; } if (obj == URN) { game.prop[URN]=game.prop[URN]/2; spk=210; - RSPEAK(spk); - return GO_CLEAROBJ; } else if (obj == LAMP) { game.prop[LAMP]=0; RSPEAK(40); - if (DARK(game.loc)) - RSPEAK(16); - return GO_CLEAROBJ; + spk = DARK(game.loc) ? 16 : 0; } else if (obj == DRAGON || obj == VOLCAN) spk=146; @@ -470,57 +466,39 @@ static int feed(token_t verb, token_t obj) RSPEAK(100); return GO_CLEAROBJ; } - - if (!(obj != SNAKE && obj != DRAGON && obj != TROLL)) { - int spk=102; + else if (obj == SNAKE || obj == DRAGON || obj == TROLL) { + spk=102; if (obj == DRAGON && game.prop[DRAGON] != 0)spk=110; if (obj == TROLL)spk=182; - if (obj != SNAKE || game.closed || !HERE(BIRD)) - { - RSPEAK(spk); - return GO_CLEAROBJ; + if (obj == SNAKE && !game.closed && HERE(BIRD)) { + DSTROY(BIRD); + game.prop[BIRD]=0; + spk = 101; } - DSTROY(BIRD); - game.prop[BIRD]=0; - RSPEAK(101); - return GO_CLEAROBJ; } - - if (obj == DWARF) { - if (!HERE(FOOD)) - { - RSPEAK(spk); - return GO_CLEAROBJ; + else if (obj == DWARF) { + if (HERE(FOOD)) { + game.dflag += 2; + spk = 103; } - game.dflag=game.dflag+2; - RSPEAK(103); - return GO_CLEAROBJ; } - - if (obj == BEAR) { + else if (obj == BEAR) { if (game.prop[BEAR] == 0)spk=102; if (game.prop[BEAR] == 3)spk=110; - if (!HERE(FOOD)) { - RSPEAK(spk); - return GO_CLEAROBJ; + if (HERE(FOOD)) { + DSTROY(FOOD); + game.prop[BEAR]=1; + game.fixed[AXE]=0; + game.prop[AXE]=0; + spk=168; } - DSTROY(FOOD); - game.prop[BEAR]=1; - game.fixed[AXE]=0; - game.prop[AXE]=0; - spk=168; - RSPEAK(spk); - return GO_CLEAROBJ; } - - if (obj == OGRE) { + else if (obj == OGRE) { if (HERE(FOOD)) spk=202; - RSPEAK(spk); - return GO_CLEAROBJ; + } else { + spk=14; } - - spk=14; RSPEAK(spk); return GO_CLEAROBJ; } @@ -543,8 +521,7 @@ int fill(token_t verb, token_t obj) game.fixed[VASE]= -1; return(discard(verb, obj, true)); } - - if (obj == URN){ + else if (obj == URN) { spk=213; if (game.prop[URN] != 0) {RSPEAK(spk); return GO_CLEAROBJ;} spk=144; @@ -557,13 +534,12 @@ int fill(token_t verb, token_t obj) RSPEAK(spk); return GO_CLEAROBJ; } - - if (obj != 0 && obj != BOTTLE) { + else if (obj != 0 && obj != BOTTLE) { RSPEAK(spk); return GO_CLEAROBJ; } - if (obj == 0 && !HERE(BOTTLE)) - return(8000); + else if (obj == 0 && !HERE(BOTTLE)) + return GO_UNKNOWN; spk=107; if (LIQLOC(game.loc) == 0) spk=106; @@ -571,14 +547,14 @@ int fill(token_t verb, token_t obj) spk=214; if (LIQUID() != 0) spk=105; - if (spk != 107) - {RSPEAK(spk); return GO_CLEAROBJ;} - game.prop[BOTTLE]=MOD(COND[game.loc],4)/2*2; - k=LIQUID(); - if (TOTING(BOTTLE)) - game.place[k]= -1; - if (k == OIL) - spk=108; + if (spk == 107) { + game.prop[BOTTLE]=MOD(COND[game.loc],4)/2*2; + k=LIQUID(); + if (TOTING(BOTTLE)) + game.place[k]= -1; + if (k == OIL) + spk=108; + } RSPEAK(spk); return GO_CLEAROBJ; } @@ -655,7 +631,7 @@ int light(token_t verb, token_t obj) if (obj == INTRANSITIVE) { if (HERE(LAMP) && game.prop[LAMP] == 0 && game.limit >= 0)obj=LAMP; if (HERE(URN) && game.prop[URN] == 1)obj=obj*NOBJECTS+URN; - if (obj == INTRANSITIVE || obj == 0 || obj > NOBJECTS) return(8000); + if (obj == INTRANSITIVE || obj == 0 || obj > NOBJECTS) return GO_UNKNOWN; } if (obj == URN) { @@ -713,7 +689,6 @@ static int listen(void) static int lock(token_t verb, token_t obj) /* Lock, unlock, no object given. Assume various things if present. */ { - int k; int spk = ACTSPK[verb]; if (obj == INTRANSITIVE) { spk=28; @@ -721,7 +696,7 @@ static int lock(token_t verb, token_t obj) if (HERE(OYSTER))obj=OYSTER; if (AT(DOOR))obj=DOOR; if (AT(GRATE))obj=GRATE; - if (obj != 0 && HERE(CHAIN)) return(8000); + if (obj != 0 && HERE(CHAIN)) return GO_UNKNOWN; if (HERE(CHAIN))obj=CHAIN; if (obj == 0) {RSPEAK(spk); return GO_CLEAROBJ;} } @@ -734,24 +709,23 @@ static int lock(token_t verb, token_t obj) if (obj == DOOR && game.prop[DOOR] == 1)spk=54; if (obj == CAGE)spk=32; if (obj == KEYS)spk=55; - if (obj == GRATE || obj == CHAIN)spk=31; - if (spk != 31 || !HERE(KEYS)) { - RSPEAK(spk); - return GO_CLEAROBJ; - } - if (obj == CHAIN) - return chain(verb); - if (game.closng) { - spk=130; - if (!game.panic)game.clock2=15; - game.panic=true; - RSPEAK(spk); - return GO_CLEAROBJ; + if (obj == GRATE || obj == CHAIN) { + spk=31; + if (HERE(KEYS)) { + if (obj == CHAIN) + return chain(verb); + if (game.closng) { + spk=130; + if (!game.panic)game.clock2=15; + game.panic=true; + } else { + spk=34+game.prop[GRATE]; + game.prop[GRATE]=1; + if (verb == LOCK)game.prop[GRATE]=0; + spk=spk+2*game.prop[GRATE]; + } + } } - spk=34+game.prop[GRATE]; - game.prop[GRATE]=1; - if (verb == LOCK)game.prop[GRATE]=0; - spk=spk+2*game.prop[GRATE]; RSPEAK(spk); return GO_CLEAROBJ; } @@ -762,7 +736,7 @@ static int pour(token_t verb, token_t obj) { int spk = ACTSPK[verb]; if (obj == BOTTLE || obj == 0)obj=LIQUID(); - if (obj == 0) return(8000); + if (obj == 0) return GO_UNKNOWN; if (!TOTING(obj)) {RSPEAK(spk); return GO_CLEAROBJ;} spk=78; if (obj != OIL && obj != WATER) {RSPEAK(spk); return GO_CLEAROBJ;} @@ -800,15 +774,14 @@ static int quit(FILE *input) static int read(FILE *input, token_t verb, token_t obj) /* Read. Print stuff based on objtxt. Oyster (?) is special case. */ { - int i; int spk = ACTSPK[verb]; if (obj == INTRANSITIVE) { obj = 0; - for (i=1; i<=NOBJECTS; i++) { + for (int i=1; i<=NOBJECTS; i++) { if (HERE(i) && OBJTXT[i] != 0 && game.prop[i] >= 0) obj = obj * NOBJECTS + i; } - if (obj > NOBJECTS || obj == 0 || DARK(game.loc)) return(8000); + if (obj > NOBJECTS || obj == 0 || DARK(game.loc)) return GO_UNKNOWN; } if (DARK(game.loc)) { @@ -834,28 +807,31 @@ static int reservoir(void) if (!AT(RESER) && game.loc != game.fixed[RESER]-1) { RSPEAK(75); return GO_CLEAROBJ; + } else { + PSPEAK(RESER,game.prop[RESER]+1); + game.prop[RESER]=1-game.prop[RESER]; + if (AT(RESER)) return GO_CLEAROBJ; + game.oldlc2=game.loc; + game.newloc=0; + RSPEAK(241); + return GO_TERMINATE; } - PSPEAK(RESER,game.prop[RESER]+1); - game.prop[RESER]=1-game.prop[RESER]; - if (AT(RESER)) return GO_CLEAROBJ; - game.oldlc2=game.loc; - game.newloc=0; - RSPEAK(241); - return GO_TERMINATE; } static int rub(token_t verb, token_t obj) /* Rub. Yields various snide remarks except for lit urn. */ { int spk = ACTSPK[verb]; - if (obj != LAMP)spk=76; - if (obj != URN || game.prop[URN] != 2) {RSPEAK(spk); return GO_CLEAROBJ;} - DSTROY(URN); - DROP(AMBER,game.loc); - game.prop[AMBER]=1; - --game.tally; - DROP(CAVITY,game.loc); - spk=216; + if (obj != LAMP) + spk=76; + if (obj == URN && game.prop[URN] == 2) { + DSTROY(URN); + DROP(AMBER,game.loc); + game.prop[AMBER]=1; + --game.tally; + DROP(CAVITY,game.loc); + spk=216; + } RSPEAK(spk); return GO_CLEAROBJ; } @@ -872,7 +848,7 @@ static int say(void) int wd=VOCAB(WD1,-1); if (wd == 62 || wd == 65 || wd == 71 || wd == 2025 || wd == 2034) { WD2=0; - return(2630); + return GO_LOOKUP; } RSPEAK(258); return GO_CLEAROBJ; @@ -966,7 +942,11 @@ static int vscore(void) static int wake(token_t verb, token_t obj) /* Wake. Only use is to disturb the dwarves. */ { - if (obj != DWARF || !game.closed) {RSPEAK(ACTSPK[verb]); return GO_CLEAROBJ;} + if (obj != DWARF || !game.closed) + { + RSPEAK(ACTSPK[verb]); + return GO_CLEAROBJ; + } RSPEAK(199); return(19000); } @@ -1008,7 +988,6 @@ int action(FILE *input, enum speechpart part, long verb, token_t obj) * unless verb is "say", which snarfs arbitrary second word. */ { - int kk; token_t spk=ACTSPK[verb]; if (part == unknown) @@ -1071,38 +1050,38 @@ int action(FILE *input, enum speechpart part, long verb, token_t obj) case intransitive: if (WD2 > 0 && verb != SAY) return(2800); if (verb == SAY)obj=WD2; - if (obj == 0) { + if (obj == 0 || obj == INTRANSITIVE) { /* Analyse an intransitive verb (ie, no object given yet). */ - switch (verb-1) { - case 0: /* CARRY */ return carry(verb, INTRANSITIVE); - case 1: /* DROP */ return(8000); - case 2: /* SAY */ return(8000); + switch (verb-1) { + case 0: /* CARRY */ return carry(verb, INTRANSITIVE); + case 1: /* DROP */ return GO_UNKNOWN; + case 2: /* SAY */ return GO_UNKNOWN; case 3: /* UNLOC */ return lock(verb, INTRANSITIVE); - case 4: /* NOTHI */ {RSPEAK(54); return(20012);} + case 4: /* NOTHI */ {RSPEAK(54); return(GO_CLEAROBJ);} case 5: /* LOCK */ return lock(verb, INTRANSITIVE); case 6: /* LIGHT */ return light(verb, INTRANSITIVE); case 7: /* EXTIN */ return extinguish(verb, INTRANSITIVE); - case 8: /* WAVE */ return(8000); - case 9: /* CALM */ return(8000); + case 8: /* WAVE */ return GO_UNKNOWN; + case 9: /* CALM */ return GO_UNKNOWN; case 10: /* WALK */ {RSPEAK(spk); return GO_CLEAROBJ;} case 11: /* ATTAC */ return attack(input, verb, obj); case 12: /* POUR */ return pour(verb, obj); case 13: /* EAT */ return eat(verb, INTRANSITIVE); case 14: /* DRINK */ return drink(verb, obj); - case 15: /* RUB */ return(8000); - case 16: /* TOSS */ return(8000); + case 15: /* RUB */ return GO_UNKNOWN; + case 16: /* TOSS */ return GO_UNKNOWN; case 17: /* QUIT */ return quit(input); - case 18: /* FIND */ return(8000); + case 18: /* FIND */ return GO_UNKNOWN; case 19: /* INVEN */ return inven(obj); - case 20: /* FEED */ return(8000); + case 20: /* FEED */ return GO_UNKNOWN; case 21: /* FILL */ return fill(verb, obj); case 22: /* BLAST */ return blast(); case 23: /* SCOR */ return vscore(); case 24: /* FOO */ return bigwords(WD1); case 25: /* BRIEF */ return brief(); case 26: /* READ */ return read(input, verb, INTRANSITIVE); - case 27: /* BREAK */ return(8000); - case 28: /* WAKE */ return(8000); + case 27: /* BREAK */ return GO_UNKNOWN; + case 28: /* WAKE */ return GO_UNKNOWN; case 29: /* SUSP */ return saveresume(input, false); case 30: /* RESU */ return saveresume(input, true); case 31: /* FLY */ return fly(verb, INTRANSITIVE); @@ -1119,7 +1098,7 @@ int action(FILE *input, enum speechpart part, long verb, token_t obj) case 1: /* DROP */ return discard(verb, obj, false); case 2: /* SAY */ return say(); case 3: /* UNLOC */ return lock(verb, obj); - case 4: /* NOTHI */ {RSPEAK(54); return(20012);} + case 4: /* NOTHI */ {RSPEAK(54); return(GO_CLEAROBJ);} case 5: /* LOCK */ return lock(verb, obj); case 6: /* LIGHT */ return light(verb, obj); case 7: /* EXTI */ return extinguish(verb, obj);