6 /* CARRY AN OBJECT. SPECIAL CASES FOR BIRD AND CAGE (IF BIRD IN CAGE, CAN'T
7 * TAKE ONE WITHOUT THE OTHER). LIQUIDS ALSO SPECIAL, SINCE THEY DEPEND ON
8 * STATUS OF BOTTLE. ALSO VARIOUS SIDE EFFECTS, ETC. */
11 if(TOTING(OBJ)) return(2011);
13 if(OBJ == PLANT && PROP[PLANT] <= 0)SPK=115;
14 if(OBJ == BEAR && PROP[BEAR] == 1)SPK=169;
15 if(OBJ == CHAIN && PROP[BEAR] != 0)SPK=170;
16 if(OBJ == URN)SPK=215;
17 if(OBJ == CAVITY)SPK=217;
18 if(OBJ == BLOOD)SPK=239;
19 if(OBJ == RUG && PROP[RUG] == 2)SPK=222;
20 if(OBJ == SIGN)SPK=196;
21 if(OBJ != MESSAG) goto L9011;
24 L9011: if(FIXED[OBJ] != 0) return(2011);
25 if(OBJ != WATER && OBJ != OIL) goto L9017;
28 if(HERE(BOTTLE) && LIQ(0) == K) goto L9017;
29 if(TOTING(BOTTLE) && PROP[BOTTLE] == 1) return(fill());
30 if(PROP[BOTTLE] != 1)SPK=105;
31 if(!TOTING(BOTTLE))SPK=104;
34 if(HOLDNG >= 7) return(2011);
35 if(OBJ != BIRD || PROP[BIRD] == 1 || -1-PROP[BIRD] == 1) goto L9014;
36 if(PROP[BIRD] == 2) goto L9015;
37 if(!TOTING(CAGE))SPK=27;
38 if(TOTING(ROD))SPK=26;
39 if(SPK/2 == 13) return(2011);
41 L9014: if((OBJ == BIRD || OBJ == CAGE) && (PROP[BIRD] == 1 || -1-PROP[BIRD] ==
42 1))CARRY(BIRD+CAGE-OBJ,LOC);
45 if(OBJ == BOTTLE && K != 0)PLACE[K]= -1;
46 if(!GSTONE(OBJ) || PROP[OBJ] == 0) return(2009);
56 /* DISCARD OBJECT. "THROW" ALSO COMES HERE FOR MOST OBJECTS. SPECIAL CASES FOR
57 * BIRD (MIGHT ATTACK SNAKE OR DRAGON) AND CAGE (MIGHT CONTAIN BIRD) AND VASE.
58 * DROP COINS AT VENDING MACHINE FOR EXTRA BATTERIES. */
60 int discard(bool just_do_it) {
61 if(just_do_it) goto L9021;
62 if(TOTING(ROD2) && OBJ == ROD && !TOTING(ROD))OBJ=ROD2;
63 if(!TOTING(OBJ)) return(2011);
64 if(OBJ != BIRD || !HERE(SNAKE)) goto L9023;
66 if(CLOSED) return(19000);
68 /* SET PROP FOR USE BY TRAVEL OPTIONS */
71 if(K == OBJ)OBJ=BOTTLE;
72 if(OBJ == BOTTLE && K != 0)PLACE[K]=0;
73 if(OBJ == CAGE && PROP[BIRD] == 1)DROP(BIRD,LOC);
75 if(OBJ != BIRD) return(2012);
77 if(FOREST(LOC))PROP[BIRD]=2;
80 L9023: if(!(GSTONE(OBJ) && AT(CAVITY) && PROP[CAVITY] != 0)) goto L9024;
84 if(!HERE(RUG) || !((OBJ == EMRALD && PROP[RUG] != 2) || (OBJ == RUBY &&
85 PROP[RUG] == 2))) goto L9021;
87 if(TOTING(RUG))SPK=220;
88 if(OBJ == RUBY)SPK=221;
90 if(SPK == 220) goto L9021;
93 if(K == 2)K=PLAC[SAPPH];
97 L9024: if(OBJ != COINS || !HERE(VEND)) goto L9025;
103 L9025: if(OBJ != BIRD || !AT(DRAGON) || PROP[DRAGON] != 0) goto L9026;
109 L9026: if(OBJ != BEAR || !AT(TROLL)) goto L9027;
113 MOVE(TROLL2,PLAC[TROLL]);
114 MOVE(TROLL2+100,FIXD[TROLL]);
119 L9027: if(OBJ == VASE && LOC != PLAC[PILLOW]) goto L9028;
124 if(AT(PILLOW))PROP[VASE]=0;
125 PSPEAK(VASE,PROP[VASE]+1);
126 if(PROP[VASE] != 0)FIXED[VASE]= -1;
130 /* ATTACK. ASSUME TARGET IF UNAMBIGUOUS. "THROW" ALSO LINKS HERE. ATTACKABLE
131 * OBJECTS FALL INTO TWO CATEGORIES: ENEMIES (SNAKE, DWARF, ETC.) AND OTHERS
132 * (BIRD, CLAM, MACHINE). AMBIGUOUS IF 2 ENEMIES, OR NO ENEMIES BUT 2 OTHERS. */
136 if(OBJ != 0) goto L9124;
138 if(HERE(SNAKE))OBJ=OBJ*100+SNAKE;
139 if(AT(DRAGON) && PROP[DRAGON] == 0)OBJ=OBJ*100+DRAGON;
140 if(AT(TROLL))OBJ=OBJ*100+TROLL;
141 if(AT(OGRE))OBJ=OBJ*100+OGRE;
142 if(HERE(BEAR) && PROP[BEAR] == 0)OBJ=OBJ*100+BEAR;
143 if(OBJ > 100) return(8000);
144 if(OBJ != 0) goto L9124;
145 /* CAN'T ATTACK BIRD OR MACHINE BY THROWING AXE. */
146 if(HERE(BIRD) && VERB != THROW)OBJ=BIRD;
147 if(HERE(VEND) && VERB != THROW)OBJ=OBJ*100+VEND;
148 /* CLAM AND OYSTER BOTH TREATED AS CLAM FOR INTRANSITIVE CASE; NO HARM DONE. */
149 if(HERE(CLAM) || HERE(OYSTER))OBJ=100*OBJ+CLAM;
150 if(OBJ > 100) return(8000);
151 L9124: if(OBJ != BIRD) goto L9125;
153 if(CLOSED) return(2011);
157 L9125: if(OBJ != VEND) goto L9126;
158 PSPEAK(VEND,PROP[VEND]+2);
159 PROP[VEND]=3-PROP[VEND];
162 L9126: if(OBJ == 0)SPK=44;
163 if(OBJ == CLAM || OBJ == OYSTER)SPK=150;
164 if(OBJ == SNAKE)SPK=46;
165 if(OBJ == DWARF)SPK=49;
166 if(OBJ == DWARF && CLOSED) return(19000);
167 if(OBJ == DRAGON)SPK=167;
168 if(OBJ == TROLL)SPK=157;
169 if(OBJ == OGRE)SPK=203;
170 if(OBJ == OGRE && I > 0) goto L9128;
171 if(OBJ == BEAR)SPK=165+(PROP[BEAR]+1)/2;
172 if(OBJ != DRAGON || PROP[DRAGON] != 0) return(2011);
173 /* FUN STUFF FOR DRAGON. IF HE INSISTS ON ATTACKING IT, WIN! SET PROP TO DEAD,
174 * MOVE DRAGON TO CENTRAL LOC (STILL FIXED), MOVE RUG THERE (NOT FIXED), AND
175 * MOVE HIM THERE, TOO. THEN DO A NULL MOTION TO GET NEW DESCRIPTION. */
179 GETIN(WD1,WD1X,WD2,WD2X);
180 if(WD1 != MAKEWD(25) && WD1 != MAKEWD(250519)) return(2607);
184 K=(PLAC[DRAGON]+FIXD[DRAGON])/2;
190 /* 9127 */ for (OBJ=1; OBJ<=100; OBJ++) {
191 if(PLACE[OBJ] == PLAC[DRAGON] || PLACE[OBJ] == FIXD[DRAGON])MOVE(OBJ,K);
202 /* 9129 */ for (I=1; I<=5; I++) {
203 if(DLOC[I] != LOC) goto L9129;
213 /* THROW. SAME AS DISCARD UNLESS AXE. THEN SAME AS ATTACK EXCEPT IGNORE BIRD,
214 * AND IF DWARF IS PRESENT THEN ONE MIGHT BE KILLED. (ONLY WAY TO DO SO!)
215 * AXE ALSO SPECIAL FOR DRAGON, BEAR, AND TROLL. TREASURES SPECIAL FOR TROLL. */
218 if(TOTING(ROD2) && OBJ == ROD && !TOTING(ROD))OBJ=ROD2;
219 if(!TOTING(OBJ)) return(2011);
220 if(OBJ >= 50 && OBJ <= MAXTRS && AT(TROLL)) goto L9178;
221 if(OBJ == FOOD && HERE(BEAR)) goto L9177;
222 if(OBJ != AXE) return(discard(false));
224 if(I > 0) goto L9172;
226 if(AT(DRAGON) && PROP[DRAGON] == 0) goto L9175;
228 if(AT(TROLL)) goto L9175;
230 if(AT(OGRE)) goto L9175;
231 if(HERE(BEAR) && PROP[BEAR] == 0) goto L9176;
236 if(RAN(7) < DFLAG) goto L9175;
241 if(DKILL == 1)SPK=149;
247 /* THIS'LL TEACH HIM TO THROW THE AXE AT THE BEAR! */
255 /* BUT THROWING FOOD IS ANOTHER STORY. */
260 /* SNARF A TREASURE FOR THE TROLL. */
264 DROP(TROLL2,PLAC[TROLL]);
265 DROP(TROLL2+100,FIXD[TROLL]);
270 /* FEED. IF BIRD, NO SEED. SNAKE, DRAGON, TROLL: QUIP. IF DWARF, MAKE HIM
271 * MAD. BEAR, SPECIAL. */
274 if(OBJ != BIRD) goto L9212;
278 L9212: if(OBJ != SNAKE && OBJ != DRAGON && OBJ != TROLL) goto L9213;
280 if(OBJ == DRAGON && PROP[DRAGON] != 0)SPK=110;
281 if(OBJ == TROLL)SPK=182;
282 if(OBJ != SNAKE || CLOSED || !HERE(BIRD)) return(2011);
288 L9213: if(OBJ != DWARF) goto L9214;
289 if(!HERE(FOOD)) return(2011);
294 L9214: if(OBJ != BEAR) goto L9215;
295 if(PROP[BEAR] == 0)SPK=102;
296 if(PROP[BEAR] == 3)SPK=110;
297 if(!HERE(FOOD)) return(2011);
305 L9215: if(OBJ != OGRE) goto L9216;
306 if(HERE(FOOD))SPK=202;
313 /* FILL. BOTTLE OR URN MUST BE EMPTY, AND LIQUID AVAILABLE. (VASE IS NASTY.) */
316 if(OBJ == VASE) goto L9222;
317 if(OBJ == URN) goto L9224;
318 if(OBJ != 0 && OBJ != BOTTLE) return(2011);
319 if(OBJ == 0 && !HERE(BOTTLE)) return(8000);
321 if(LIQLOC(LOC) == 0)SPK=106;
322 if(HERE(URN) && PROP[URN] != 0)SPK=214;
323 if(LIQ(0) != 0)SPK=105;
324 if(SPK != 107) return(2011);
325 PROP[BOTTLE]=MOD(COND[LOC],4)/2*2;
327 if(TOTING(BOTTLE))PLACE[K]= -1;
332 if(LIQLOC(LOC) == 0)SPK=144;
333 if(LIQLOC(LOC) == 0 || !TOTING(VASE)) return(2011);
337 return(discard(true));
340 if(PROP[URN] != 0) return(2011);
343 if(K == 0 || !HERE(BOTTLE)) return(2011);
346 if(K == OIL)PROP[URN]=1;