-/* 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 attack() {
- I=ATDWRF(LOC);
- if(OBJ != 0) goto L9124;
- if(I > 0)OBJ=DWARF;
- if(HERE(SNAKE))OBJ=OBJ*100+SNAKE;
- if(AT(DRAGON) && PROP[DRAGON] == 0)OBJ=OBJ*100+DRAGON;
- if(AT(TROLL))OBJ=OBJ*100+TROLL;
- if(AT(OGRE))OBJ=OBJ*100+OGRE;
- if(HERE(BEAR) && PROP[BEAR] == 0)OBJ=OBJ*100+BEAR;
- if(OBJ > 100) return(8000);
- if(OBJ != 0) goto L9124;
-/* CAN'T ATTACK BIRD OR MACHINE BY THROWING AXE. */
- if(HERE(BIRD) && VERB != THROW)OBJ=BIRD;
- if(HERE(VEND) && VERB != THROW)OBJ=OBJ*100+VEND;
-/* CLAM AND OYSTER BOTH TREATED AS CLAM FOR INTRANSITIVE CASE; NO HARM DONE. */
- if(HERE(CLAM) || HERE(OYSTER))OBJ=100*OBJ+CLAM;
- if(OBJ > 100) return(8000);
-L9124: if(OBJ != BIRD) goto L9125;
- SPK=137;
- if(CLOSED) return(2011);
- DSTROY(BIRD);
- PROP[BIRD]=0;
- SPK=45;
-L9125: if(OBJ != VEND) goto L9126;
- PSPEAK(VEND,PROP[VEND]+2);
- PROP[VEND]=3-PROP[VEND];
- return(2012);
-
-L9126: 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 && CLOSED) return(19000);
- if(OBJ == DRAGON)SPK=167;
- if(OBJ == TROLL)SPK=157;
- if(OBJ == OGRE)SPK=203;
- if(OBJ == OGRE && I > 0) goto L9128;
- if(OBJ == BEAR)SPK=165+(PROP[BEAR]+1)/2;
- if(OBJ != DRAGON || PROP[DRAGON] != 0) return(2011);
-/* FUN STUFF FOR DRAGON. IF HE INSISTS ON ATTACKING IT, WIN! SET 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. */
+/* 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 attack(FILE *input, long obj, long verb) {
+ I=ATDWRF(game.loc);
+ if (obj != 0) goto L9124;
+ 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) goto L9124;
+ /* 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);
+L9124: if (obj == BIRD) {
+ SPK=137;
+ if (game.closed) return(2011);
+ DSTROY(BIRD);
+ game.prop[BIRD]=0;
+ SPK=45;
+ }
+L9125: if (obj == VEND) {
+ PSPEAK(VEND,game.prop[VEND]+2);
+ game.prop[VEND]=3-game.prop[VEND];
+ return(2012);
+ }
+
+ 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) goto L9128;
+ if (obj == BEAR)SPK=165+(game.prop[BEAR]+1)/2;
+ if (obj != DRAGON || game.prop[DRAGON] != 0) return(2011);
+ /* 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. */