X-Git-Url: https://jxself.org/git/?a=blobdiff_plain;f=actions.c;h=29369de08c1ad87498b1b1a64dbca2b3f81ddbab;hb=d7bb3f61eb324d2fa180eace83879cbf08eab20f;hp=4d077628e4c8f003039ea2edb8c45fe5ba3909b7;hpb=0dc78b422167e0e19477efa5c28dea9af77a5785;p=open-adventure.git diff --git a/actions.c b/actions.c index 4d07762..29369de 100644 --- a/actions.c +++ b/actions.c @@ -48,7 +48,7 @@ static int attack(FILE *input, long verb, token_t obj) RSPEAK(spk); return GO_CLEAROBJ; } - DSTROY(BIRD); + DESTROY(BIRD); game.prop[BIRD]=0; spk=BIRD_DEAD; } @@ -65,54 +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)spk=OGRE_DODGE; if (obj == OGRE && d > 0) { RSPEAK(spk); RSPEAK(KNIFE_THROWN); - DSTROY(OGRE); - int k=0; + DESTROY(OGRE); + int dwarves=0; for (int i=1; i < PIRATE; i++) { if (game.dloc[i] == game.loc) { - ++k; + ++dwarves; game.dloc[i] = LOC_LONGWEST; game.dseen[i]=false; } } - spk=spk+1+1/k; /* FIXME: Arithmetic on message numbers */ - RSPEAK(spk); - return GO_CLEAROBJ; + spk=spk+1+1/dwarves; /* FIXME: Arithmetic on message numbers */ } - - if (obj == BEAR) + else if (obj == BEAR) /* FIXME: Arithmetic on message numbers */ 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 == 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) @@ -154,15 +152,14 @@ 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); + DESTROY(CLAM); DROP(OYSTER,game.loc); DROP(PEARL,LOC_CULDESAC); } @@ -184,7 +181,7 @@ static int blast(void) if (HERE(ROD2)) game.bonus=135; RSPEAK(game.bonus); - score(0); + score(endgame); return GO_CLEAROBJ; /* pacify compiler - we never get here */ } @@ -244,7 +241,7 @@ static int carry(token_t verb, token_t obj) if (obj == SIGN)spk=HAND_PASSTHROUGH; if (obj == MESSAG) { RSPEAK(REMOVE_MESSAGE); - DSTROY(MESSAG); + DESTROY(MESSAG); return GO_CLEAROBJ; } if (game.fixed[obj] != 0) { @@ -270,13 +267,13 @@ static int carry(token_t verb, token_t obj) } else if (obj == BIRD && game.prop[BIRD] != 1 && -1-game.prop[BIRD] != 1) { if (game.prop[BIRD] == 2) { - DSTROY(BIRD); + DESTROY(BIRD); RSPEAK(BIRD_CRAP); return GO_CLEAROBJ; } 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; } @@ -286,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; @@ -336,7 +333,7 @@ static int discard(token_t verb, token_t obj, bool just_do_it) if (obj == BIRD && HERE(SNAKE)) { RSPEAK(BIRD_ATTACKS); if (game.closed) return GO_DWARFWAKE; - DSTROY(SNAKE); + DESTROY(SNAKE); /* Set game.prop for use by travel options */ game.prop[SNAKE]=1; @@ -358,13 +355,13 @@ static int discard(token_t verb, token_t obj, bool just_do_it) } } } else if (obj == COINS && HERE(VEND)) { - DSTROY(COINS); + DESTROY(COINS); DROP(BATTER,game.loc); PSPEAK(BATTER,0); return GO_CLEAROBJ; } else if (obj == BIRD && AT(DRAGON) && game.prop[DRAGON] == 0) { RSPEAK(BIRD_BURNT); - DSTROY(BIRD); + DESTROY(BIRD); game.prop[BIRD]=0; return GO_CLEAROBJ; } else if (obj == BEAR && AT(TROLL)) { @@ -387,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; @@ -406,12 +403,12 @@ static int drink(token_t verb, token_t obj) if (obj != BLOOD) { if (obj != 0 && obj != WATER)spk=RIDICULOUS_ATTEMPT; if (spk != RIDICULOUS_ATTEMPT && LIQUID() == WATER && HERE(BOTTLE)) { - game.prop[BOTTLE]=1; - game.place[WATER]=0; + game.prop[BOTTLE] = 1; + game.place[WATER] = NOWHERE; spk=BOTTLE_EMPTY; } } else { - DSTROY(BLOOD); + DESTROY(BLOOD); game.prop[DRAGON]=2; OBJSND[BIRD]=OBJSND[BIRD]+3; spk=HEAD_BUZZES; @@ -428,11 +425,11 @@ static int eat(token_t verb, token_t obj) if (obj == INTRANSITIVE) { if (!HERE(FOOD)) return GO_UNKNOWN; - DSTROY(FOOD); + DESTROY(FOOD); spk=THANKS_DELICIOUS; } else { if (obj == FOOD) { - DSTROY(FOOD); + DESTROY(FOOD); spk=THANKS_DELICIOUS; } if (obj == BIRD || obj == SNAKE || obj == CLAM || obj == OYSTER || obj == @@ -482,7 +479,7 @@ static int feed(token_t verb, token_t obj) if (obj == DRAGON && game.prop[DRAGON] != 0)spk=RIDICULOUS_ATTEMPT; if (obj == TROLL)spk=TROLL_VICES; if (obj == SNAKE && !game.closed && HERE(BIRD)) { - DSTROY(BIRD); + DESTROY(BIRD); game.prop[BIRD]=0; spk = BIRD_DEVOURED; } @@ -497,7 +494,7 @@ static int feed(token_t verb, token_t obj) if (game.prop[BEAR] == 0)spk=NOTHING_EDIBLE; if (game.prop[BEAR] == 3)spk=RIDICULOUS_ATTEMPT; if (HERE(FOOD)) { - DSTROY(FOOD); + DESTROY(FOOD); game.prop[BEAR]=1; game.fixed[AXE]=0; game.prop[AXE]=0; @@ -538,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); @@ -562,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; } @@ -592,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; } @@ -615,7 +612,7 @@ static int fly(token_t verb, token_t obj) 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 spk=NO_CARRY; @@ -691,7 +688,7 @@ static int listen(void) PSPEAK(i,OBJSND[i]+game.prop[i]); spk=ARB_0; if (i == BIRD && OBJSND[i]+game.prop[i] == 8) - DSTROY(BIRD); + DESTROY(BIRD); } RSPEAK(spk); return GO_CLEAROBJ; @@ -730,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; } } } @@ -753,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;} @@ -778,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; } @@ -839,7 +836,7 @@ static int rub(token_t verb, token_t obj) if (obj != LAMP) spk=PECULIAR_NOTHING; if (obj == URN && game.prop[URN] == 2) { - DSTROY(URN); + DESTROY(URN); DROP(AMBER,game.loc); game.prop[AMBER]=1; --game.tally; @@ -860,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; @@ -918,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) { @@ -949,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; } @@ -1087,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();