9 /* CARRY AN OBJECT. SPECIAL CASES FOR BIRD AND CAGE (IF BIRD IN CAGE, CAN'T
10 * TAKE ONE WITHOUT THE OTHER). LIQUIDS ALSO SPECIAL, SINCE THEY DEPEND ON
11 * STATUS OF BOTTLE. ALSO VARIOUS SIDE EFFECTS, ETC. */
14 if(TOTING(OBJ)) return(2011);
16 if(OBJ == PLANT && PROP[PLANT] <= 0)SPK=115;
17 if(OBJ == BEAR && PROP[BEAR] == 1)SPK=169;
18 if(OBJ == CHAIN && PROP[BEAR] != 0)SPK=170;
19 if(OBJ == URN)SPK=215;
20 if(OBJ == CAVITY)SPK=217;
21 if(OBJ == BLOOD)SPK=239;
22 if(OBJ == RUG && PROP[RUG] == 2)SPK=222;
23 if(OBJ == SIGN)SPK=196;
24 if(OBJ != MESSAG) goto L9011;
27 L9011: if(FIXED[OBJ] != 0) return(2011);
28 if(OBJ != WATER && OBJ != OIL) goto L9017;
31 if(HERE(BOTTLE) && LIQ(0) == K) goto L9017;
32 if(TOTING(BOTTLE) && PROP[BOTTLE] == 1) return(fill());
33 if(PROP[BOTTLE] != 1)SPK=105;
34 if(!TOTING(BOTTLE))SPK=104;
37 if(HOLDNG >= 7) return(2011);
38 if(OBJ != BIRD || PROP[BIRD] == 1 || -1-PROP[BIRD] == 1) goto L9014;
39 if(PROP[BIRD] == 2) goto L9015;
40 if(!TOTING(CAGE))SPK=27;
41 if(TOTING(ROD))SPK=26;
42 if(SPK/2 == 13) return(2011);
44 L9014: if((OBJ == BIRD || OBJ == CAGE) && (PROP[BIRD] == 1 || -1-PROP[BIRD] ==
45 1))CARRY(BIRD+CAGE-OBJ,LOC);
48 if(OBJ == BOTTLE && K != 0)PLACE[K]= -1;
49 if(!GSTONE(OBJ) || PROP[OBJ] == 0) return(2009);
59 /* DISCARD OBJECT. "THROW" ALSO COMES HERE FOR MOST OBJECTS. SPECIAL CASES FOR
60 * BIRD (MIGHT ATTACK SNAKE OR DRAGON) AND CAGE (MIGHT CONTAIN BIRD) AND VASE.
61 * DROP COINS AT VENDING MACHINE FOR EXTRA BATTERIES. */
63 discard(just_do_it)long just_do_it; {
64 if(just_do_it) goto L9021;
65 if(TOTING(ROD2) && OBJ == ROD && !TOTING(ROD))OBJ=ROD2;
66 if(!TOTING(OBJ)) return(2011);
67 if(OBJ != BIRD || !HERE(SNAKE)) goto L9023;
69 if(CLOSED) return(19000);
71 /* SET PROP FOR USE BY TRAVEL OPTIONS */
74 if(K == OBJ)OBJ=BOTTLE;
75 if(OBJ == BOTTLE && K != 0)PLACE[K]=0;
76 if(OBJ == CAGE && PROP[BIRD] == 1)DROP(BIRD,LOC);
78 if(OBJ != BIRD) return(2012);
80 if(FOREST(LOC))PROP[BIRD]=2;
83 L9023: if(!(GSTONE(OBJ) && AT(CAVITY) && PROP[CAVITY] != 0)) goto L9024;
87 if(!HERE(RUG) || !((OBJ == EMRALD && PROP[RUG] != 2) || (OBJ == RUBY &&
88 PROP[RUG] == 2))) goto L9021;
90 if(TOTING(RUG))SPK=220;
91 if(OBJ == RUBY)SPK=221;
93 if(SPK == 220) goto L9021;
96 if(K == 2)K=PLAC[SAPPH];
100 L9024: if(OBJ != COINS || !HERE(VEND)) goto L9025;
106 L9025: if(OBJ != BIRD || !AT(DRAGON) || PROP[DRAGON] != 0) goto L9026;
112 L9026: if(OBJ != BEAR || !AT(TROLL)) goto L9027;
116 MOVE(TROLL2,PLAC[TROLL]);
117 MOVE(TROLL2+100,FIXD[TROLL]);
122 L9027: if(OBJ == VASE && LOC != PLAC[PILLOW]) goto L9028;
127 if(AT(PILLOW))PROP[VASE]=0;
128 PSPEAK(VASE,PROP[VASE]+1);
129 if(PROP[VASE] != 0)FIXED[VASE]= -1;
133 /* ATTACK. ASSUME TARGET IF UNAMBIGUOUS. "THROW" ALSO LINKS HERE. ATTACKABLE
134 * OBJECTS FALL INTO TWO CATEGORIES: ENEMIES (SNAKE, DWARF, ETC.) AND OTHERS
135 * (BIRD, CLAM, MACHINE). AMBIGUOUS IF 2 ENEMIES, OR NO ENEMIES BUT 2 OTHERS. */
139 if(OBJ != 0) goto L9124;
141 if(HERE(SNAKE))OBJ=OBJ*100+SNAKE;
142 if(AT(DRAGON) && PROP[DRAGON] == 0)OBJ=OBJ*100+DRAGON;
143 if(AT(TROLL))OBJ=OBJ*100+TROLL;
144 if(AT(OGRE))OBJ=OBJ*100+OGRE;
145 if(HERE(BEAR) && PROP[BEAR] == 0)OBJ=OBJ*100+BEAR;
146 if(OBJ > 100) return(8000);
147 if(OBJ != 0) goto L9124;
148 /* CAN'T ATTACK BIRD OR MACHINE BY THROWING AXE. */
149 if(HERE(BIRD) && VERB != THROW)OBJ=BIRD;
150 if(HERE(VEND) && VERB != THROW)OBJ=OBJ*100+VEND;
151 /* CLAM AND OYSTER BOTH TREATED AS CLAM FOR INTRANSITIVE CASE; NO HARM DONE. */
152 if(HERE(CLAM) || HERE(OYSTER))OBJ=100*OBJ+CLAM;
153 if(OBJ > 100) return(8000);
154 L9124: if(OBJ != BIRD) goto L9125;
156 if(CLOSED) return(2011);
160 L9125: if(OBJ != VEND) goto L9126;
161 PSPEAK(VEND,PROP[VEND]+2);
162 PROP[VEND]=3-PROP[VEND];
165 L9126: if(OBJ == 0)SPK=44;
166 if(OBJ == CLAM || OBJ == OYSTER)SPK=150;
167 if(OBJ == SNAKE)SPK=46;
168 if(OBJ == DWARF)SPK=49;
169 if(OBJ == DWARF && CLOSED) return(19000);
170 if(OBJ == DRAGON)SPK=167;
171 if(OBJ == TROLL)SPK=157;
172 if(OBJ == OGRE)SPK=203;
173 if(OBJ == OGRE && I > 0) goto L9128;
174 if(OBJ == BEAR)SPK=165+(PROP[BEAR]+1)/2;
175 if(OBJ != DRAGON || PROP[DRAGON] != 0) return(2011);
176 /* FUN STUFF FOR DRAGON. IF HE INSISTS ON ATTACKING IT, WIN! SET PROP TO DEAD,
177 * MOVE DRAGON TO CENTRAL LOC (STILL FIXED), MOVE RUG THERE (NOT FIXED), AND
178 * MOVE HIM THERE, TOO. THEN DO A NULL MOTION TO GET NEW DESCRIPTION. */
182 GETIN(WD1,WD1X,WD2,WD2X);
183 if(WD1 != MAKEWD(25) && WD1 != MAKEWD(250519)) return(2607);
187 K=(PLAC[DRAGON]+FIXD[DRAGON])/2;
193 /* 9127 */ for (OBJ=1; OBJ<=100; OBJ++) {
194 if(PLACE[OBJ] == PLAC[DRAGON] || PLACE[OBJ] == FIXD[DRAGON])MOVE(OBJ,K);
205 /* 9129 */ for (I=1; I<=5; I++) {
206 if(DLOC[I] != LOC) goto L9129;
216 /* THROW. SAME AS DISCARD UNLESS AXE. THEN SAME AS ATTACK EXCEPT IGNORE BIRD,
217 * AND IF DWARF IS PRESENT THEN ONE MIGHT BE KILLED. (ONLY WAY TO DO SO!)
218 * AXE ALSO SPECIAL FOR DRAGON, BEAR, AND TROLL. TREASURES SPECIAL FOR TROLL. */
221 if(TOTING(ROD2) && OBJ == ROD && !TOTING(ROD))OBJ=ROD2;
222 if(!TOTING(OBJ)) return(2011);
223 if(OBJ >= 50 && OBJ <= MAXTRS && AT(TROLL)) goto L9178;
224 if(OBJ == FOOD && HERE(BEAR)) goto L9177;
225 if(OBJ != AXE) return(discard(FALSE));
227 if(I > 0) goto L9172;
229 if(AT(DRAGON) && PROP[DRAGON] == 0) goto L9175;
231 if(AT(TROLL)) goto L9175;
233 if(AT(OGRE)) goto L9175;
234 if(HERE(BEAR) && PROP[BEAR] == 0) goto L9176;
239 if(RAN(7) < DFLAG) goto L9175;
244 if(DKILL == 1)SPK=149;
250 /* THIS'LL TEACH HIM TO THROW THE AXE AT THE BEAR! */
258 /* BUT THROWING FOOD IS ANOTHER STORY. */
263 /* SNARF A TREASURE FOR THE TROLL. */
267 DROP(TROLL2,PLAC[TROLL]);
268 DROP(TROLL2+100,FIXD[TROLL]);
273 /* FEED. IF BIRD, NO SEED. SNAKE, DRAGON, TROLL: QUIP. IF DWARF, MAKE HIM
274 * MAD. BEAR, SPECIAL. */
277 if(OBJ != BIRD) goto L9212;
281 L9212: if(OBJ != SNAKE && OBJ != DRAGON && OBJ != TROLL) goto L9213;
283 if(OBJ == DRAGON && PROP[DRAGON] != 0)SPK=110;
284 if(OBJ == TROLL)SPK=182;
285 if(OBJ != SNAKE || CLOSED || !HERE(BIRD)) return(2011);
291 L9213: if(OBJ != DWARF) goto L9214;
292 if(!HERE(FOOD)) return(2011);
297 L9214: if(OBJ != BEAR) goto L9215;
298 if(PROP[BEAR] == 0)SPK=102;
299 if(PROP[BEAR] == 3)SPK=110;
300 if(!HERE(FOOD)) return(2011);
308 L9215: if(OBJ != OGRE) goto L9216;
309 if(HERE(FOOD))SPK=202;
316 /* FILL. BOTTLE OR URN MUST BE EMPTY, AND LIQUID AVAILABLE. (VASE IS NASTY.) */
319 if(OBJ == VASE) goto L9222;
320 if(OBJ == URN) goto L9224;
321 if(OBJ != 0 && OBJ != BOTTLE) return(2011);
322 if(OBJ == 0 && !HERE(BOTTLE)) return(8000);
324 if(LIQLOC(LOC) == 0)SPK=106;
325 if(HERE(URN) && PROP[URN] != 0)SPK=214;
326 if(LIQ(0) != 0)SPK=105;
327 if(SPK != 107) return(2011);
328 PROP[BOTTLE]=MOD(COND[LOC],4)/2*2;
330 if(TOTING(BOTTLE))PLACE[K]= -1;
335 if(LIQLOC(LOC) == 0)SPK=144;
336 if(LIQLOC(LOC) == 0 || !TOTING(VASE)) return(2011);
340 return(discard(TRUE));
343 if(PROP[URN] != 0) return(2011);
346 if(K == 0 || !HERE(BOTTLE)) return(2011);
349 if(K == OIL)PROP[URN]=1;