-static int attack(FILE *input, long verb, token_t obj)
-/* 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. */
-{
- int spk = ACTSPK[verb];
- int i = ATDWRF(game.loc);
- if (obj == 0) {
- if (i > 0)
- obj=DWARF;
- if (HERE(SNAKE))obj=obj*NOBJECTS+SNAKE;
- 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 (obj > NOBJECTS) return(8000);
- if (obj == 0) {
- /* Can't attack bird or machine by throwing axe. */
- if (HERE(BIRD) && verb != THROW)obj=BIRD;
- if (HERE(VEND) && verb != THROW)obj=obj*NOBJECTS+VEND;
- /* 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 == BIRD) {
- spk=137;
- if (game.closed)
- {
- RSPEAK(spk);
- return GO_CLEAROBJ;
- }
- DSTROY(BIRD);
- game.prop[BIRD]=0;
- spk=45;
- }
- if (obj == VEND) {
- PSPEAK(VEND,game.prop[VEND]+2);
- game.prop[VEND]=3-game.prop[VEND];
- return GO_CLEAROBJ;
- }
-
- if (obj == 0)spk=44;
- if (obj == CLAM || obj == OYSTER)spk=150;
- if (obj == SNAKE)spk=46;
- if (obj == DWARF)spk=49;
- if (obj == DWARF && game.closed) return(19000);
- if (obj == DRAGON)spk=167;
- if (obj == TROLL)spk=157;
- if (obj == OGRE)spk=203;
- if (obj == OGRE && i > 0) {
- RSPEAK(spk);
- RSPEAK(6);
- DSTROY(OGRE);
- int k=0;
- for (i=1; i < PIRATE; i++) {
- if (game.dloc[i] == game.loc) {
- ++k;
- game.dloc[i]=61;
- game.dseen[i]=false;
- }
- }
- spk=spk+1+1/k;
- RSPEAK(spk);
- return GO_CLEAROBJ;
- }
- if (obj == BEAR)spk=165+(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(49);
- GETIN(input,&WD1,&WD1X,&WD2,&WD2X);
- if (WD1 != MAKEWD(25) && WD1 != MAKEWD(250519))
- return(2607);
- 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;
-}