X-Git-Url: https://jxself.org/git/?a=blobdiff_plain;f=actions.c;h=7a401eb65faada635e3093218f47110181b64c7d;hb=a57d93ce35ccdea6fa4f260bf004d6f8f9924b2f;hp=a69dbc5d1685fa6860f461021c8c6f18656af265;hpb=e5f9c4fbea18216c40f1501cdee2ec21914e477c;p=open-adventure.git diff --git a/actions.c b/actions.c index a69dbc5..7a401eb 100644 --- a/actions.c +++ b/actions.c @@ -21,9 +21,9 @@ static int attack(FILE *input, long verb, token_t obj) * enemies, or no enemies but 2 others. */ { int spk = ACTSPK[verb]; - int i = ATDWRF(game.loc); + int d = ATDWRF(game.loc); if (obj == 0) { - if (i > 0) + if (d > 0) obj=DWARF; if (HERE(SNAKE))obj=obj*NOBJECTS+SNAKE; if (AT(DRAGON) && game.prop[DRAGON] == 0)obj=obj*NOBJECTS+DRAGON; @@ -65,48 +65,52 @@ static int attack(FILE *input, long verb, token_t obj) if (obj == DWARF && game.closed) return GO_DWARFWAKE; if (obj == DRAGON)spk=ALREADY_DEAD; if (obj == TROLL)spk=ROCKY_TROLL; - if (obj == OGRE)spk=OGRE_DOFGE; - if (obj == OGRE && i > 0) { + if (obj == OGRE)spk=OGRE_DODGE; + if (obj == OGRE && d > 0) { RSPEAK(spk); RSPEAK(KNIFE_THROWN); DSTROY(OGRE); - int k=0; - for (i=1; i < PIRATE; i++) { + int dwarves=0; + for (int i=1; i < PIRATE; i++) { if (game.dloc[i] == game.loc) { - ++k; - game.dloc[i] = LOC_61; + ++dwarves; + game.dloc[i] = LOC_LONGWEST; game.dseen[i]=false; } } - spk=spk+1+1/k; - RSPEAK(spk); - return GO_CLEAROBJ; + spk=spk+1+1/dwarves; /* FIXME: Arithmetic on message numbers */ } - if (obj == BEAR)spk=BEAR_HANDS+(game.prop[BEAR]+1)/2; - if (obj != DRAGON || game.prop[DRAGON] != 0) {RSPEAK(spk); return GO_CLEAROBJ;} - /* Fun stuff for dragon. If he insists on attacking it, win! - * Set game.prop to dead, move dragon to central loc (still - * fixed), move rug there (not fixed), and move him there, - * too. Then do a null motion to get new description. */ - RSPEAK(BARE_HANDS_QUERY); - GETIN(input,&WD1,&WD1X,&WD2,&WD2X); - if (WD1 != MAKEWD(25) && WD1 != MAKEWD(250519)) - return GO_CHECKFOO; - PSPEAK(DRAGON,3); - game.prop[DRAGON]=1; - game.prop[RUG]=0; - int k=(PLAC[DRAGON]+FIXD[DRAGON])/2; - MOVE(DRAGON+NOBJECTS,-1); - MOVE(RUG+NOBJECTS,0); - MOVE(DRAGON,k); - MOVE(RUG,k); - DROP(BLOOD,k); - for (obj=1; obj<=NOBJECTS; obj++) { - if (game.place[obj] == PLAC[DRAGON] || game.place[obj] == FIXD[DRAGON]) - MOVE(obj,k); + else if (obj == BEAR) + /* FIXME: Arithmetic on message numbers */ + spk = BEAR_HANDS+(game.prop[BEAR]+1)/2; + else if (obj == DRAGON && game.prop[DRAGON] == 0) { + /* Fun stuff for dragon. If he insists on attacking it, win! + * Set game.prop to dead, move dragon to central loc (still + * fixed), move rug there (not fixed), and move him there, + * too. Then do a null motion to get new description. */ + RSPEAK(BARE_HANDS_QUERY); + GETIN(input,&WD1,&WD1X,&WD2,&WD2X); + if (WD1 != MAKEWD(25) && WD1 != MAKEWD(250519)) + return GO_CHECKFOO; + PSPEAK(DRAGON,3); + game.prop[DRAGON]=1; + game.prop[RUG]=0; + int k=(PLAC[DRAGON]+FIXD[DRAGON])/2; + MOVE(DRAGON+NOBJECTS,-1); + MOVE(RUG+NOBJECTS,0); + MOVE(DRAGON,k); + MOVE(RUG,k); + DROP(BLOOD,k); + for (obj=1; obj<=NOBJECTS; obj++) { + if (game.place[obj] == PLAC[DRAGON] || game.place[obj] == FIXD[DRAGON]) + MOVE(obj,k); + } + game.loc=k; + return GO_MOVE; } - game.loc=k; - return GO_MOVE; + + RSPEAK(spk); + return GO_CLEAROBJ; } static int bigwords(long foo) @@ -148,17 +152,16 @@ static int bigwords(long foo) static int bivalve(token_t verb, token_t obj) /* Clam/oyster actions */ { - int spk, k=0; - if (obj == OYSTER)k=1; - /* FIXME: Arithmetic on message numbers in next lines */ - spk=PEARL_FALLS+k; - if (TOTING(obj))spk=DROP_CLAM+k; - if (!TOTING(TRIDNT))spk=CLAM_OPENER+k; + 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(TRIDNT))spk= is_oyster ? OYSTER_OPENER : CLAM_OPENER; if (verb == LOCK)spk=HUH_MAN; if (spk == PEARL_FALLS) { DSTROY(CLAM); DROP(OYSTER,game.loc); - DROP(PEARL,LOC_105); + DROP(PEARL,LOC_CULDESAC); } RSPEAK(spk); return GO_CLEAROBJ; @@ -173,12 +176,12 @@ static int blast(void) return GO_CLEAROBJ; } game.bonus=133; - if (game.loc == LOC_115) + if (game.loc == LOC_NE) game.bonus=134; if (HERE(ROD2)) game.bonus=135; RSPEAK(game.bonus); - score(0); + score(endgame); return GO_CLEAROBJ; /* pacify compiler - we never get here */ } @@ -270,7 +273,7 @@ static int carry(token_t verb, token_t obj) } if (!TOTING(CAGE))spk=CANNOT_CARRY; if (TOTING(ROD))spk=BIRD_EVADES; - if (spk/2 == 13) { /* FIXME: Arithmetic on message number */ + if (spk == CANNOT_CARRY || spk == BIRD_EVADES) { RSPEAK(spk); return GO_CLEAROBJ; } @@ -280,7 +283,7 @@ static int carry(token_t verb, token_t obj) CARRY(BIRD+CAGE-obj,game.loc); CARRY(obj,game.loc); if (obj == BOTTLE && LIQUID() != 0) - game.place[LIQUID()] = -1; + game.place[LIQUID()] = CARRIED; if (GSTONE(obj) && game.prop[obj] != 0) { game.prop[obj]=0; game.prop[CAVITY]=1; @@ -306,7 +309,10 @@ static int chain(token_t verb) spk=CHAIN_LOCKED; if (game.prop[CHAIN] != 0)spk=ALREADY_LOCKED; if (game.loc != PLAC[CHAIN])spk=NO_LOCKSITE; - if (spk != CHAIN_LOCKED) {RSPEAK(spk); return GO_CLEAROBJ;} + if (spk != CHAIN_LOCKED) { + RSPEAK(spk); + return GO_CLEAROBJ; + } game.prop[CHAIN]=2; if (TOTING(CHAIN))DROP(CHAIN,game.loc); game.fixed[CHAIN]= -1; @@ -378,7 +384,7 @@ static int discard(token_t verb, token_t obj, bool just_do_it) int k = LIQUID(); if (k == obj)obj=BOTTLE; if (obj == BOTTLE && k != 0) - game.place[k]=0; + game.place[k] = NOWHERE; if (obj == CAGE && game.prop[BIRD] == 1)DROP(BIRD,game.loc); DROP(obj,game.loc); if (obj != BIRD) return GO_CLEAROBJ; @@ -396,9 +402,9 @@ static int drink(token_t verb, token_t obj) return GO_UNKNOWN; if (obj != BLOOD) { if (obj != 0 && obj != WATER)spk=RIDICULOUS_ATTEMPT; - if (spk != 110 && LIQUID() == WATER && HERE(BOTTLE)) { - game.prop[BOTTLE]=1; - game.place[WATER]=0; + if (spk != RIDICULOUS_ATTEMPT && LIQUID() == WATER && HERE(BOTTLE)) { + game.prop[BOTTLE] = 1; + game.place[WATER] = NOWHERE; spk=BOTTLE_EMPTY; } } else { @@ -519,7 +525,7 @@ int fill(token_t verb, token_t obj) return GO_CLEAROBJ; } RSPEAK(SHATTER_VASE); - game.prop[VASE]=2; + game.prop[VASE] = 2; game.fixed[VASE]= -1; return(discard(verb, obj, true)); } @@ -529,8 +535,8 @@ int fill(token_t verb, token_t obj) spk=FILL_INVALID; k=LIQUID(); if (k == 0 || !HERE(BOTTLE)) {RSPEAK(spk); return GO_CLEAROBJ;} - game.place[k]=0; - game.prop[BOTTLE]=1; + game.place[k] = NOWHERE; + game.prop[BOTTLE] = 1; if (k == OIL)game.prop[URN]=1; spk=WATER_URN+game.prop[URN]; RSPEAK(spk); @@ -553,7 +559,7 @@ int fill(token_t verb, token_t obj) game.prop[BOTTLE]=MOD(COND[game.loc],4)/2*2; k=LIQUID(); if (TOTING(BOTTLE)) - game.place[k]= -1; + game.place[k] = CARRIED; if (k == OIL) spk=BOTTLED_OIL; } @@ -583,7 +589,7 @@ static int fly(token_t verb, token_t obj) if (obj == INTRANSITIVE) { if (game.prop[RUG] != 2)spk=RUG_NOTHING2; if (!HERE(RUG))spk=FLAP_ARMS; - if (spk/2 == 112) { /* FIXME: Arithmetic on message numbers */ + if (spk == RUG_NOTHING2 || spk == FLAP_ARMS) { RSPEAK(spk); return GO_CLEAROBJ; } @@ -600,17 +606,17 @@ static int fly(token_t verb, token_t obj) game.oldloc=game.loc; game.newloc=game.place[RUG]+game.fixed[RUG]-game.loc; spk=RUG_GOES; - if (game.prop[SAPPH] >= 0)spk=RUG_RETURNS; + if (game.prop[SAPPH] >= 0) + spk=RUG_RETURNS; RSPEAK(spk); return GO_TERMINATE; } - -static int inven(token_t obj) + +static int inven(void) /* Inventory. If object, treat same as find. Else report on current burden. */ { - int i; int spk=NO_CARRY; - for (i=1; i<=NOBJECTS; i++) { + for (int i=1; i<=NOBJECTS; i++) { if (i == BEAR || !TOTING(i)) continue; if (spk == NO_CARRY) @@ -661,13 +667,13 @@ int light(token_t verb, token_t obj) return GO_TOP; else return GO_CLEAROBJ; - } + } } static int listen(void) /* Listen. Intransitive only. Print stuff based on objsnd/locsnd. */ { - int i, k; + int k; int spk=ALL_SILENT; k=LOCSND[game.loc]; if (k != 0) { @@ -676,7 +682,7 @@ static int listen(void) spk=ARB_0; } SETPRM(1,game.zzword,0); - for (i=1; i<=NOBJECTS; i++) { + for (int i=1; i<=NOBJECTS; i++) { if (!HERE(i) || OBJSND[i] == 0 || game.prop[i] < 0) continue; PSPEAK(i,OBJSND[i]+game.prop[i]); @@ -721,10 +727,10 @@ static int lock(token_t verb, token_t obj) if (!game.panic)game.clock2=15; game.panic=true; } else { - spk=ALREADY_LOCKED+game.prop[GRATE]; /* FIXME: Arithmetic on message number */ + spk=game.prop[GRATE] ? GRATE_LOCKED : ALREADY_LOCKED; game.prop[GRATE]=1; if (verb == LOCK)game.prop[GRATE]=0; - spk=spk+2*game.prop[GRATE]; + spk=game.prop[GRATE] ? GRATE_UNLOCKED : GRATE_LOCKED; } } } @@ -744,8 +750,8 @@ static int pour(token_t verb, token_t obj) if (obj != OIL && obj != WATER) {RSPEAK(spk); return GO_CLEAROBJ;} if (HERE(URN) && game.prop[URN] == 0) return fill(verb, URN); - game.prop[BOTTLE]=1; - game.place[obj]=0; + game.prop[BOTTLE] = 1; + game.place[obj] = NOWHERE; spk=GROUND_WET; if (!(AT(PLANT) || AT(DOOR))) {RSPEAK(spk); return GO_CLEAROBJ;} @@ -769,7 +775,7 @@ static int quit(FILE *input) /* Quit. Intransitive only. Verify intent and exit if that's what he wants. */ { if (YES(input,REALLY_QUIT,OK_MAN,OK_MAN)) - score(1); + score(quitgame); return GO_CLEAROBJ; } @@ -812,11 +818,14 @@ static int reservoir(void) } 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(NOT_BRIGHT); - return GO_TERMINATE; + if (AT(RESER)) + return GO_CLEAROBJ; + else { + game.oldlc2=game.loc; + game.newloc=0; + RSPEAK(NOT_BRIGHT); + return GO_TERMINATE; + } } } @@ -848,6 +857,7 @@ static int say(void) if (WD2 > 0) WD1=WD2; int wd=VOCAB(WD1,-1); + /* FIXME: Magic numbers */ if (wd == 62 || wd == 65 || wd == 71 || wd == 2025 || wd == 2034) { WD2=0; return GO_LOOKUP; @@ -876,7 +886,7 @@ static int throw(FILE *cmdin, long verb, token_t obj) RSPEAK(spk); return GO_CLEAROBJ; } - if (obj >= 50 && obj <= MAXTRS && AT(TROLL)) { + if (obj >= MINTRS && obj <= MAXTRS && AT(TROLL)) { spk=TROLL_SATISFIED; /* Snarf a treasure for the troll. */ DROP(obj,0); @@ -906,7 +916,7 @@ static int throw(FILE *cmdin, long verb, token_t obj) return throw_support(spk); } if (AT(OGRE)) { - spk=OGRE_DOFGE; + spk=OGRE_DODGE; return throw_support(spk); } if (HERE(BEAR) && game.prop[BEAR] == 0) { @@ -937,7 +947,7 @@ static int throw(FILE *cmdin, long verb, token_t obj) static int vscore(void) /* Score. Call scoring routine but tell it to return. */ { - score(-1); + score(scoregame); return GO_CLEAROBJ; } @@ -1004,10 +1014,10 @@ int action(FILE *input, enum speechpart part, long verb, token_t obj) if (HERE(obj)) /* FALL THROUGH */; else if (obj == GRATE) { - if (game.loc == LOC_1 || game.loc == LOC_4 || game.loc == LOC_7) + if (game.loc == LOC_START || game.loc == LOC_VALLEY || game.loc == LOC_SLIT) obj=DPRSSN; /* FIXME: Arithmetic on location numbers */ - if (game.loc > LOC_9 && game.loc < LOC_15) + if (game.loc > LOC_BELOWGRATE && game.loc < LOC_MISTHALL) obj=ENTRNC; if (obj != GRATE) return GO_MOVE; @@ -1075,7 +1085,7 @@ int action(FILE *input, enum speechpart part, long verb, token_t obj) case 16: /* TOSS */ return GO_UNKNOWN; case 17: /* QUIT */ return quit(input); case 18: /* FIND */ return GO_UNKNOWN; - case 19: /* INVEN */ return inven(obj); + case 19: /* INVEN */ return inven(); case 20: /* FEED */ return GO_UNKNOWN; case 21: /* FILL */ return fill(verb, obj); case 22: /* BLAST */ return blast();