1 | /* program TURN.C */
|
---|
2 |
|
---|
3 |
|
---|
4 | #include <stdio.h>
|
---|
5 | #include <stdlib.h>
|
---|
6 | #include "advent.h"
|
---|
7 | #include "advdec.h"
|
---|
8 |
|
---|
9 | _PROTOTYPE(void descitem, (void));
|
---|
10 | _PROTOTYPE(void domove, (void));
|
---|
11 | _PROTOTYPE(void goback, (void));
|
---|
12 | _PROTOTYPE(void copytrv, (struct trav *, struct trav *));
|
---|
13 | _PROTOTYPE(void dotrav, (void));
|
---|
14 | _PROTOTYPE(void badmove, (void));
|
---|
15 | _PROTOTYPE(void spcmove, (int));
|
---|
16 | _PROTOTYPE(void death, (void));
|
---|
17 | _PROTOTYPE(void dwarves, (void));
|
---|
18 | _PROTOTYPE(void dopirate, (void));
|
---|
19 | _PROTOTYPE(int stimer, (void));
|
---|
20 | _PROTOTYPE(void do_hint, (int));
|
---|
21 |
|
---|
22 |
|
---|
23 | /*
|
---|
24 | Routine to take 1 turn
|
---|
25 | */
|
---|
26 | void turn()
|
---|
27 | {
|
---|
28 | int i, hint;
|
---|
29 | static int waste = 0;
|
---|
30 |
|
---|
31 | if (newtravel) {
|
---|
32 | /* If closing, then he can't leave except via the main office. */
|
---|
33 | if (outside(g.newloc) && g.newloc != 0 && g.closing) {
|
---|
34 | rspeak(130);
|
---|
35 | g.newloc = g.loc;
|
---|
36 | if (!g.panic)
|
---|
37 | g.clock2 = 15;
|
---|
38 | g.panic = TRUE;
|
---|
39 | }
|
---|
40 | /* See if a dwarf has seen him and has come from where he wants
|
---|
41 | to go. */
|
---|
42 | if (g.newloc != g.loc && !forced(g.loc) && g.loc_attrib[g.loc] & NOPIRAT == 0)
|
---|
43 | for (i = 1; i < (DWARFMAX - 1); ++i)
|
---|
44 | if (g.odloc[i] == g.newloc && g.dseen[i]) {
|
---|
45 | g.newloc = g.loc;
|
---|
46 | rspeak(2);
|
---|
47 | break;
|
---|
48 | }
|
---|
49 |
|
---|
50 | g.loc = g.newloc;
|
---|
51 | dwarves(); /* & special dwarf(pirate who
|
---|
52 | steals) */
|
---|
53 |
|
---|
54 | /* Check for death */
|
---|
55 | if (g.loc == 0) {
|
---|
56 | death();
|
---|
57 | return;
|
---|
58 | }
|
---|
59 | /* Check for forced move */
|
---|
60 | if (forced(g.loc)) {
|
---|
61 | desclg(g.loc);
|
---|
62 | ++g.visited[g.loc];
|
---|
63 | domove();
|
---|
64 | return;
|
---|
65 | }
|
---|
66 | /* Check for wandering in dark */
|
---|
67 | if (g.wzdark && dark() && pct(35)) {
|
---|
68 | rspeak(23);
|
---|
69 | g.oldloc2 = g.loc;
|
---|
70 | death();
|
---|
71 | return;
|
---|
72 | }
|
---|
73 | /* see if he is wasting his batteies out in the open */
|
---|
74 | if (outside(g.loc) && g.prop[LAMP]) {
|
---|
75 | waste++;
|
---|
76 | if (waste > 11) {
|
---|
77 | rspeak(324);
|
---|
78 | waste = 0;
|
---|
79 | }
|
---|
80 | } else
|
---|
81 | waste = 0;
|
---|
82 |
|
---|
83 | /* If wumpus is chasing stooge, see if wumpus gets him */
|
---|
84 | if (g.chase) {
|
---|
85 | g.chase++;
|
---|
86 | g.prop[WUMPUS] = g.chase / 2;
|
---|
87 | move(WUMPUS, g.loc);
|
---|
88 | if (g.chase >= 10) {
|
---|
89 | if (dark())
|
---|
90 | rspeak(270);
|
---|
91 | pspeak(WUMPUS, 5);
|
---|
92 | death();
|
---|
93 | return;
|
---|
94 | }
|
---|
95 | }
|
---|
96 | /* check for radiation poisoning. */
|
---|
97 | g.health += (outside(g.loc)) ? 3 : 1;
|
---|
98 | if (g.health > 100)
|
---|
99 | g.health = 100;
|
---|
100 | if (here(RADIUM) && (g.place[RADIUM] != -SHIELD || ajar(SHIELD)))
|
---|
101 | g.health -= 7;
|
---|
102 | if (g.health < 60) {
|
---|
103 | rspeak(391 + (60 - g.health) / 10);
|
---|
104 | if (g.health < 0) {
|
---|
105 | death();
|
---|
106 | return;
|
---|
107 | }
|
---|
108 | }
|
---|
109 | if ((g.oldloc == 188) && (g.loc != 188 && g.loc != 189)
|
---|
110 | && (g.prop[BOOTH] == 1)) {
|
---|
111 | move(GNOME, 0);
|
---|
112 | g.prop[BOOTH] = 0;
|
---|
113 | }
|
---|
114 | /* Describe his situation */
|
---|
115 | describe();
|
---|
116 | if (!blind()) {
|
---|
117 | ++g.visited[g.loc];
|
---|
118 | descitem();
|
---|
119 | }
|
---|
120 | } /* end of newtravel start for
|
---|
121 | second entry point */
|
---|
122 | /* Check if this location is eligible for any hints. If been here
|
---|
123 | long enough, branch to help section. Ignore "hints" < HNTMIN
|
---|
124 | (special stuff, see database notes. */
|
---|
125 | for (hint = HNTMIN; hint <= HNTMAX; hint++) {
|
---|
126 | if (g.hinted[hint])
|
---|
127 | continue;
|
---|
128 | if (g.loc_attrib[g.loc] / 256 != hint - 6)
|
---|
129 | g.hintlc[hint] = -1;
|
---|
130 | g.hintlc[hint]++;
|
---|
131 | if (g.hintlc[hint] >= g.hints[hint][1])
|
---|
132 | do_hint(hint);
|
---|
133 | }
|
---|
134 |
|
---|
135 | if (g.closed) {
|
---|
136 | if (g.prop[OYSTER] < 0 && toting(OYSTER))
|
---|
137 | pspeak(OYSTER, 1);
|
---|
138 | for (i = 1; i < MAXOBJ; ++i)
|
---|
139 | if (toting(i) && g.prop[i] < 0)
|
---|
140 | g.prop[i] = -1 - g.prop[i];
|
---|
141 | }
|
---|
142 | g.wzdark = dark();
|
---|
143 | if (g.knfloc > 0 && g.knfloc != g.loc)
|
---|
144 | g.knfloc = 0;
|
---|
145 | ++g.turns;
|
---|
146 | i = rand();
|
---|
147 |
|
---|
148 | if (stimer()) /* as the grains of sand slip
|
---|
149 | by */
|
---|
150 | return;
|
---|
151 |
|
---|
152 | while (!english()) /* retrieve player instructions */
|
---|
153 | ;
|
---|
154 |
|
---|
155 | vrbx = 1;
|
---|
156 | objx = objs[1] ? 1 : 0;
|
---|
157 | iobx = iobjs[1] ? 1 : 0;
|
---|
158 | verb = VAL(verbs[vrbx]);
|
---|
159 | do {
|
---|
160 | object = objx ? objs[objx] : 0;
|
---|
161 | iobj = iobx ? iobjs[iobx] : 0;
|
---|
162 | if (object && (objs[2] || iobjs[2])) {
|
---|
163 | pspeak(object, -1);
|
---|
164 | printf(" ");
|
---|
165 | }
|
---|
166 | switch (CLASS(verbs[vrbx])) {
|
---|
167 | case MOTION:
|
---|
168 | motion = verb;
|
---|
169 | domove();
|
---|
170 | break;
|
---|
171 | case NOUN:
|
---|
172 | bug(22);
|
---|
173 | case ACTION:
|
---|
174 | if (object || iobj)
|
---|
175 | trverb();
|
---|
176 | else
|
---|
177 | itverb();
|
---|
178 | break;
|
---|
179 | case MISC:
|
---|
180 | rspeak(verb);
|
---|
181 | if (verb == 51)
|
---|
182 | g.hinted[1] = TRUE;
|
---|
183 | break;
|
---|
184 | default:
|
---|
185 | bug(22);
|
---|
186 | }
|
---|
187 | if (objx) {
|
---|
188 | objx++;
|
---|
189 | if (objs[objx] == 0)
|
---|
190 | objx = 0;
|
---|
191 | }
|
---|
192 | if ((!objx || !objs[objx]) && iobx) {
|
---|
193 | iobx++;
|
---|
194 | if (iobjs[iobx] == 0)
|
---|
195 | iobx = 0;
|
---|
196 | if (iobx && iobjs[1])
|
---|
197 | objx = 1;
|
---|
198 | }
|
---|
199 | } while (objx || iobx);
|
---|
200 | return;
|
---|
201 | }
|
---|
202 |
|
---|
203 | /*
|
---|
204 | Routine to describe current location
|
---|
205 | */
|
---|
206 | void describe()
|
---|
207 | {
|
---|
208 | if (toting(BEAR))
|
---|
209 | rspeak(141);
|
---|
210 | if (dark())
|
---|
211 | rspeak(16);
|
---|
212 | else if ((g.terse && verb != LOOK) || g.visited[g.loc] % g.abbnum)
|
---|
213 | descsh(g.loc);
|
---|
214 | else
|
---|
215 | desclg(g.loc);
|
---|
216 | if (g.loc == 33 && pct(25) && !g.closing)
|
---|
217 | rspeak(8);
|
---|
218 | if (g.loc == 147 && !g.visited[g.loc])
|
---|
219 | rspeak(216);
|
---|
220 | return;
|
---|
221 | }
|
---|
222 |
|
---|
223 | /*
|
---|
224 | Routine to describe visible items
|
---|
225 | */
|
---|
226 | void descitem()
|
---|
227 | {
|
---|
228 | int i, state;
|
---|
229 |
|
---|
230 | for (i = 1; i < MAXOBJ; ++i) {
|
---|
231 | if (at(i)) {
|
---|
232 | if (i == STEPS && toting(NUGGET))
|
---|
233 | continue;
|
---|
234 | if (g.prop[i] < 0) {
|
---|
235 | if (g.closed)
|
---|
236 | continue;
|
---|
237 | else {
|
---|
238 | g.prop[i] = 0;
|
---|
239 | if (i == RUG || i == CHAIN
|
---|
240 | || i == SWORD || i == CASK)
|
---|
241 | g.prop[i] = 1;
|
---|
242 | if (i == CLOAK || i == RING)
|
---|
243 | g.prop[i] = 2;
|
---|
244 | --g.tally;
|
---|
245 | }
|
---|
246 | }
|
---|
247 | if (i == STEPS && g.loc == g.fixed[STEPS])
|
---|
248 | state = 1;
|
---|
249 | else
|
---|
250 | state = g.prop[i] % 8;
|
---|
251 | pspeak(i, state);
|
---|
252 | lookin(i);
|
---|
253 | }
|
---|
254 | }
|
---|
255 | /* If remaining treasures too elusive, zap his lamp */
|
---|
256 | if (g.tally == g.tally2 && g.tally != 0 && g.limit > 35)
|
---|
257 | g.limit = 35;
|
---|
258 | return;
|
---|
259 | }
|
---|
260 |
|
---|
261 | /*
|
---|
262 | Routine to handle player's demise via
|
---|
263 | waking up the dwarves...
|
---|
264 | */
|
---|
265 | void dwarfend()
|
---|
266 | {
|
---|
267 | rspeak(136);
|
---|
268 | normend();
|
---|
269 | return;
|
---|
270 | }
|
---|
271 |
|
---|
272 | /*
|
---|
273 | normal end of game
|
---|
274 | */
|
---|
275 | void normend()
|
---|
276 | {
|
---|
277 | score(FALSE);
|
---|
278 | gaveup = TRUE;
|
---|
279 | return;
|
---|
280 | }
|
---|
281 |
|
---|
282 | /*
|
---|
283 | Routine to handle the passing on of one
|
---|
284 | of the player's incarnations...
|
---|
285 | */
|
---|
286 | void death()
|
---|
287 | {
|
---|
288 | int yea, j;
|
---|
289 |
|
---|
290 | if (!g.closing) {
|
---|
291 | if (g.limit < 0) {
|
---|
292 | rspeak(185);
|
---|
293 | normend();
|
---|
294 | return;
|
---|
295 | }
|
---|
296 | yea = yes(81 + g.numdie * 2, 82 + g.numdie * 2, 54);
|
---|
297 | if (++g.numdie >= MAXDIE || !yea)
|
---|
298 | normend();
|
---|
299 | if (g.chase) {
|
---|
300 | g.chase = FALSE;
|
---|
301 | g.prop[WUMPUS] = 0;
|
---|
302 | move(WUMPUS, 174);
|
---|
303 | }
|
---|
304 | if (toting(LAMP))
|
---|
305 | g.prop[LAMP] = 0;
|
---|
306 | for (j = 1; j < MAXOBJ; ++j) {
|
---|
307 | if (toting(j))
|
---|
308 | drop(j, j == LAMP ? 1 : g.oldloc2);
|
---|
309 | if (wearng(j)) {
|
---|
310 | g.prop[j] = 0;
|
---|
311 | bitoff(j, WEARBT);
|
---|
312 | }
|
---|
313 | }
|
---|
314 | g.newloc = 3;
|
---|
315 | g.oldloc = g.loc;
|
---|
316 | g.health = 100;
|
---|
317 | return;
|
---|
318 | }
|
---|
319 | /* Closing -- no resurrection... */
|
---|
320 | rspeak(131);
|
---|
321 | ++g.numdie;
|
---|
322 | normend();
|
---|
323 | return;
|
---|
324 | }
|
---|
325 |
|
---|
326 | /*
|
---|
327 | dwarf stuff.
|
---|
328 | */
|
---|
329 | void dwarves()
|
---|
330 | {
|
---|
331 | int i, j, k, attack, stick, dtotal;
|
---|
332 |
|
---|
333 | /* See if dwarves allowed here */
|
---|
334 | if (g.newloc == 0 || forced(g.newloc) || g.loc_attrib[g.newloc] & NOPIRAT)
|
---|
335 | return;
|
---|
336 |
|
---|
337 | /* See if dwarves are active. */
|
---|
338 | if (!g.dflag) {
|
---|
339 | if (inside(g.newloc))
|
---|
340 | ++g.dflag;
|
---|
341 | return;
|
---|
342 | }
|
---|
343 | /* If first close encounter (of 3rd kind) */
|
---|
344 | if (g.dflag == 1) {
|
---|
345 | if (!inside(g.newloc) || pct(85))
|
---|
346 | return;
|
---|
347 | ++g.dflag;
|
---|
348 |
|
---|
349 | /* kill 0, 1 or 2 of the dwarfs */
|
---|
350 | for (i = 1; i < 3; ++i)
|
---|
351 | if (pct(50))
|
---|
352 | g.dloc[(ranz(DWARFMAX - 1)) + 1] = 0;
|
---|
353 |
|
---|
354 | /* If any of the survivors is at location, use alternate choise */
|
---|
355 | for (i = 1; i <= DWARFMAX; ++i) {
|
---|
356 | if (g.dloc[i] == g.newloc)
|
---|
357 | g.dloc[i] = g.daltloc;
|
---|
358 | g.odloc[i] = g.dloc[i];
|
---|
359 | }
|
---|
360 | rspeak(3);
|
---|
361 | drop(AXE, g.newloc);
|
---|
362 | return;
|
---|
363 | }
|
---|
364 | /* Things are in full swing. Move each dwarf at random, except if
|
---|
365 | he's seen us then he sticks with us. Dwarfs never go to
|
---|
366 | locations outside or meet the bear or following him into dead
|
---|
367 | end in maze. And of couse, dead dwarves don't do much of
|
---|
368 | anything. */
|
---|
369 |
|
---|
370 | dtotal = attack = stick = 0;
|
---|
371 | for (i = 1; i <= DWARFMAX; ++i) {
|
---|
372 | if (g.dloc[i] == 0)
|
---|
373 | continue;
|
---|
374 | /* Move a dwarf at random. we don't have a matrix around to do
|
---|
375 | it as in the original version... */
|
---|
376 | do
|
---|
377 | j = ranz(106) + 15;
|
---|
378 | /* allowed area */
|
---|
379 | while (j == g.odloc[i] || j == g.dloc[i]
|
---|
380 | || g.loc_attrib[j] & NOPIRAT);
|
---|
381 |
|
---|
382 | if (j == 0)
|
---|
383 | bug(36);
|
---|
384 | g.odloc[i] = g.dloc[i];
|
---|
385 | g.dloc[i] = j;
|
---|
386 |
|
---|
387 | g.dseen[i] = ((g.dseen[i] && inside(g.newloc))
|
---|
388 | || g.dloc[i] == g.newloc
|
---|
389 | || g.odloc[i] == g.newloc);
|
---|
390 |
|
---|
391 | if (g.dseen[i]) {
|
---|
392 | g.dloc[i] = g.newloc;
|
---|
393 | if (i == DWARFMAX)
|
---|
394 | dopirate();
|
---|
395 | else {
|
---|
396 | ++dtotal;
|
---|
397 | if (g.odloc[i] == g.dloc[i]) {
|
---|
398 | ++attack;
|
---|
399 | if (g.knfloc >= 0)
|
---|
400 | g.knfloc = g.newloc;
|
---|
401 | if (ranz(1000) < (45 * (g.dflag - 2)))
|
---|
402 | ++stick;
|
---|
403 | }
|
---|
404 | }
|
---|
405 | }
|
---|
406 | }
|
---|
407 |
|
---|
408 | /* Now we know shat's happing, let's tell the poor sucker about it */
|
---|
409 | if (dtotal == 0)
|
---|
410 | return;
|
---|
411 | if (dtotal > 1)
|
---|
412 | printf("There are %d threatening little dwarves in the room with you!\n", dtotal);
|
---|
413 | else
|
---|
414 | rspeak(4);
|
---|
415 | if (attack == 0)
|
---|
416 | return;
|
---|
417 | if (g.dflag == 2)
|
---|
418 | ++g.dflag;
|
---|
419 | if (attack > 1) {
|
---|
420 | printf("%d of them throw knives at you!!\n", attack);
|
---|
421 | k = 6;
|
---|
422 | } else {
|
---|
423 | rspeak(5);
|
---|
424 | k = 52;
|
---|
425 | }
|
---|
426 | if (stick <= 1) {
|
---|
427 | rspeak(stick + k);
|
---|
428 | if (stick == 0)
|
---|
429 | return;
|
---|
430 | } else
|
---|
431 | printf("%d of them get you !!!\n", stick);
|
---|
432 | g.oldloc2 = g.newloc;
|
---|
433 | death();
|
---|
434 | return;
|
---|
435 | }
|
---|
436 |
|
---|
437 | /*
|
---|
438 | pirate stuff
|
---|
439 | */
|
---|
440 | void dopirate()
|
---|
441 | {
|
---|
442 | int j;
|
---|
443 | boolean k;
|
---|
444 |
|
---|
445 | if (g.newloc == g.chloc || g.prop[CHEST] >= 0)
|
---|
446 | return;
|
---|
447 | k = FALSE;
|
---|
448 | /* Pirate won't take pyramid from plover room or dark room (too
|
---|
449 | easy! ) */
|
---|
450 | for (j = 1; j < MAXOBJ; ++j)
|
---|
451 | if (treasr(j) && !(j == CASK && liq(CASK) == WINE)
|
---|
452 | && !(j == PYRAMID && (g.newloc == g.place[PYRAMID]
|
---|
453 | || g.newloc == g.place[EMERALD]))) {
|
---|
454 | if (toting(j) && athand(j))
|
---|
455 | goto stealit;
|
---|
456 | if (here(j))
|
---|
457 | k = TRUE;
|
---|
458 | }
|
---|
459 | if (g.tally == g.tally2 + 1 && k == FALSE && g.place[CHEST] == 0 &&
|
---|
460 | athand(LAMP) && g.prop[LAMP] == 1) {
|
---|
461 | rspeak(186);
|
---|
462 | move(CHEST, g.chloc);
|
---|
463 | move(MESSAGE, g.chloc2);
|
---|
464 | g.dloc[DWARFMAX] = g.chloc;
|
---|
465 | g.odloc[DWARFMAX] = g.chloc;
|
---|
466 | g.dseen[DWARFMAX] = 0;
|
---|
467 | return;
|
---|
468 | }
|
---|
469 | if (g.odloc[DWARFMAX] != g.dloc[DWARFMAX] && pct(30))
|
---|
470 | rspeak(127);
|
---|
471 | return;
|
---|
472 |
|
---|
473 | stealit:
|
---|
474 |
|
---|
475 | rspeak(128);
|
---|
476 | /* don't steal chest back from troll! */
|
---|
477 | if (g.place[MESSAGE] == 0)
|
---|
478 | move(CHEST, g.chloc);
|
---|
479 | move(MESSAGE, g.chloc2);
|
---|
480 | for (j = 1; j < MAXOBJ; ++j) {
|
---|
481 | if (!treasr(j) || !athand(j)
|
---|
482 | || (j == PYRAMID &&
|
---|
483 | (g.newloc == plac[PYRAMID] || g.newloc == plac[EMERALD]))
|
---|
484 | || (j == CASK && (liq(CASK) != WINE)))
|
---|
485 | continue;
|
---|
486 | if (enclosed(j))
|
---|
487 | extract(j);
|
---|
488 | if (wearng(j)) {
|
---|
489 | g.prop[j] = 0;
|
---|
490 | bitoff(j, WEARBT);
|
---|
491 | }
|
---|
492 | insert(j, CHEST);
|
---|
493 | }
|
---|
494 | g.dloc[DWARFMAX] = g.chloc;
|
---|
495 | g.odloc[DWARFMAX] = g.chloc;
|
---|
496 | g.dseen[DWARFMAX] = FALSE;
|
---|
497 | return;
|
---|
498 | }
|
---|
499 |
|
---|
500 | /*
|
---|
501 | special time limit stuff...
|
---|
502 | */
|
---|
503 | int stimer()
|
---|
504 | {
|
---|
505 | int i, spk;
|
---|
506 | static int clock3;
|
---|
507 |
|
---|
508 | g.foobar = g.foobar > 0 ? -g.foobar : 0;
|
---|
509 | g.combo = g.combo > 0 ? -g.combo : 0;
|
---|
510 | if (g.turns > 310 && g.abbnum != 10000 && !g.terse)
|
---|
511 | rspeak(273);
|
---|
512 |
|
---|
513 | /* Bump all the right clocks for reconning battery life and closing */
|
---|
514 | if (g.closed) {
|
---|
515 | clock3--;
|
---|
516 | if (clock3 == 0) {
|
---|
517 | g.prop[PHONE] = 0;
|
---|
518 | g.prop[BOOTH] = 0;
|
---|
519 | rspeak(284);
|
---|
520 | } else if (clock3 < -7) {
|
---|
521 | rspeak(254);
|
---|
522 | normend();
|
---|
523 | return (TRUE);
|
---|
524 | }
|
---|
525 | }
|
---|
526 | if (g.tally == 0 && inside(g.loc) && g.loc != Y2)
|
---|
527 | --g.clock;
|
---|
528 | if (g.clock == 0) {
|
---|
529 | /* Start closing the cave */
|
---|
530 | g.prop[GRATE] = 0;
|
---|
531 | biton(GRATE, LOCKBT);
|
---|
532 | bitoff(GRATE, OPENBT);
|
---|
533 | g.prop[FISSURE] = 0;
|
---|
534 | g.prop[TDOOR] = 0;
|
---|
535 | biton(TDOOR, LOCKBT);
|
---|
536 | bitoff(TDOOR, OPENBT);
|
---|
537 | g.prop[TDOOR2] = 0;
|
---|
538 | biton(TDOOR2, LOCKBT);
|
---|
539 | bitoff(TDOOR2, OPENBT);
|
---|
540 | for (i = 1; i <= DWARFMAX; ++i) {
|
---|
541 | g.dseen[i] = FALSE;
|
---|
542 | g.dloc[i] = 0;
|
---|
543 | }
|
---|
544 | move(TROLL, 0);
|
---|
545 | move((TROLL + MAXOBJ), 0);
|
---|
546 | move(TROLL2, plac[TROLL]);
|
---|
547 | move((TROLL2 + MAXOBJ), fixd[TROLL]);
|
---|
548 | juggle(CHASM);
|
---|
549 | if (g.prop[BEAR] != 3)
|
---|
550 | destroy(BEAR);
|
---|
551 | g.prop[CHAIN] = 0;
|
---|
552 | g.fixed[CHAIN] = 0;
|
---|
553 | g.prop[AXE] = 0;
|
---|
554 | g.fixed[AXE] = 0;
|
---|
555 | rspeak(129);
|
---|
556 | g.clock = -1;
|
---|
557 | g.closing = TRUE;
|
---|
558 | return (FALSE);
|
---|
559 | }
|
---|
560 | if (g.clock < 0)
|
---|
561 | --g.clock2;
|
---|
562 | if (g.clock2 == 0) {
|
---|
563 | /* Set up storage room... and close the cave... */
|
---|
564 | g.prop[BOTTLE] = put(BOTTLE, 115, 8);
|
---|
565 | g.holder[BOTTLE] = WATER;
|
---|
566 | g.place[WATER] = -BOTTLE;
|
---|
567 | g.hlink[WATER] = 0;
|
---|
568 | bitoff(BOTTLE, OPENBT);
|
---|
569 | g.prop[PLANT] = put(PLANT, 115, 0);
|
---|
570 | g.prop[OYSTER] = put(OYSTER, 115, 0);
|
---|
571 | g.prop[LAMP] = put(LAMP, 115, 0);
|
---|
572 | g.prop[ROD] = put(ROD, 115, 0);
|
---|
573 | g.prop[DWARF] = put(DWARF, 115, 0);
|
---|
574 | g.loc = 115;
|
---|
575 | g.oldloc = 115;
|
---|
576 | g.newloc = 115;
|
---|
577 | /* Leave the grate with normal (non-negative property). */
|
---|
578 | put(GRATE, 116, 0);
|
---|
579 | biton(GRATE, LOCKBT);
|
---|
580 | bitoff(GRATE, OPENBT);
|
---|
581 | g.prop[SNAKE] = put(SNAKE, 116, 1);
|
---|
582 | g.prop[BIRD] = put(BIRD, 116, 1);
|
---|
583 | g.prop[CAGE] = put(CAGE, 116, 0);
|
---|
584 | g.prop[ROD2] = put(ROD2, 116, 0);
|
---|
585 | g.prop[PILLOW] = put(PILLOW, 116, 0);
|
---|
586 |
|
---|
587 | g.prop[BOOTH] = put(BOOTH, 116, -3);
|
---|
588 | g.fixed[BOOTH] = 115;
|
---|
589 | g.prop[PHONE] = put(PHONE, 212, -4);
|
---|
590 |
|
---|
591 | g.prop[MIRROR] = put(MIRROR, 115, 0);
|
---|
592 | g.fixed[MIRROR] = 116;
|
---|
593 | g.prop[BOOK2] = put(BOOK2, 115, 0);
|
---|
594 |
|
---|
595 | for (i = 1; i < MAXOBJ; ++i) {
|
---|
596 | if (toting(i) && enclosed(i))
|
---|
597 | extract(i);
|
---|
598 | if (toting(i))
|
---|
599 | destroy(i);
|
---|
600 | }
|
---|
601 | rspeak(132);
|
---|
602 | g.closed = TRUE;
|
---|
603 | clock3 = 20 + ranz(20);
|
---|
604 | newtravel = TRUE;
|
---|
605 | return (TRUE);
|
---|
606 | }
|
---|
607 | if (g.prop[LAMP] == 1)
|
---|
608 | --g.limit;
|
---|
609 | if (g.limit == 0) {
|
---|
610 | --g.limit;
|
---|
611 | g.prop[LAMP] = 0;
|
---|
612 | if (here(LAMP))
|
---|
613 | rspeak(184);
|
---|
614 | return (FALSE);
|
---|
615 | }
|
---|
616 | if (g.limit < 0 && outside(g.loc)) {
|
---|
617 | rspeak(185);
|
---|
618 | normend();
|
---|
619 | return (TRUE);
|
---|
620 | }
|
---|
621 | if (g.limit <= 40) {
|
---|
622 | if (g.lmwarn || !here(LAMP))
|
---|
623 | return (FALSE);
|
---|
624 | g.lmwarn = TRUE;
|
---|
625 | spk = 187;
|
---|
626 | if (g.prop[BATTERIES] == 1)
|
---|
627 | spk = 323;
|
---|
628 | if (g.place[BATTERIES] == 0)
|
---|
629 | spk = 183;
|
---|
630 | if (g.prop[VEND] == 1)
|
---|
631 | spk = 189;
|
---|
632 | rspeak(spk);
|
---|
633 | return (FALSE);
|
---|
634 | }
|
---|
635 | return (FALSE);
|
---|
636 | }
|
---|
637 |
|
---|
638 | /* HINTS
|
---|
639 | come here if he's been long enough at required location(s)
|
---|
640 | for some unused hint, hint number is in variable "hint".
|
---|
641 | Branch to quick test for additional conditions, then
|
---|
642 | do neet stuff. If conditions are met and we want to offer
|
---|
643 | hint. Clear hintlc if no action is taken.
|
---|
644 | */
|
---|
645 |
|
---|
646 | #define MASE 1
|
---|
647 | #define DARK 2
|
---|
648 | #define WITT 3
|
---|
649 | #define H_SWORD 4
|
---|
650 | #define SLIDE 5
|
---|
651 | #define H_GRATE 6
|
---|
652 | #define H_BIRD 7
|
---|
653 | #define H_ELFIN 8
|
---|
654 | #define RNBOW 9
|
---|
655 | #define STYX 10
|
---|
656 | #define H_SNAKE 11
|
---|
657 | #define CASTLE 12
|
---|
658 |
|
---|
659 | void do_hint(hint)
|
---|
660 | int hint;
|
---|
661 | {
|
---|
662 | g.hintlc[hint] = 0;
|
---|
663 | switch (hint + 1 - HNTMIN) {
|
---|
664 | case MASE:
|
---|
665 | if (!at(g.loc) && !at(g.oldloc)
|
---|
666 | && !at(g.loc) && burden(0) > 1)
|
---|
667 | break;
|
---|
668 | else
|
---|
669 | return;
|
---|
670 | case DARK:
|
---|
671 | if (g.prop[EMERALD] != -1 && g.prop[PYRAMID] == -1)
|
---|
672 | break;
|
---|
673 | else
|
---|
674 | return;
|
---|
675 | case WITT:
|
---|
676 | break;
|
---|
677 | case H_SWORD:
|
---|
678 | if ((g.prop[SWORD] == 1 || g.prop[SWORD] == 5)
|
---|
679 | && !toting(CROWN))
|
---|
680 | break;
|
---|
681 | else
|
---|
682 | return;
|
---|
683 | case SLIDE:
|
---|
684 | break;
|
---|
685 | case H_GRATE:
|
---|
686 | if (g.prop[GRATE] == 0 && !athand(KEYS))
|
---|
687 | break;
|
---|
688 | else
|
---|
689 | return;
|
---|
690 | case H_BIRD:
|
---|
691 | if (here(BIRD) && athand(ROD) && object == BIRD)
|
---|
692 | break;
|
---|
693 | else
|
---|
694 | return;
|
---|
695 | case H_ELFIN:
|
---|
696 | if (!g.visited[159])
|
---|
697 | break;
|
---|
698 | else
|
---|
699 | return;
|
---|
700 | case RNBOW:
|
---|
701 | if (!toting(SHOES) || g.visited[205])
|
---|
702 | break;
|
---|
703 | else
|
---|
704 | return;
|
---|
705 | case STYX:
|
---|
706 | if (!athand(LYRE) && g.prop[DOG] != 1)
|
---|
707 | break;
|
---|
708 | else
|
---|
709 | return;
|
---|
710 | case H_SNAKE:
|
---|
711 | if (here(SNAKE) && !here(BIRD))
|
---|
712 | break;
|
---|
713 | else
|
---|
714 | return;
|
---|
715 | case CASTLE:
|
---|
716 | break;
|
---|
717 | default:
|
---|
718 | printf(" TRYING TO PRINT HINT # %d\n", hint);
|
---|
719 | bug(27);
|
---|
720 | }
|
---|
721 | if (!yes(g.hints[hint][3], 0, 54))
|
---|
722 | return;
|
---|
723 | printf("\nI am prepared to give you a hint,");
|
---|
724 | printf(" but it will cost you %2d points\n", g.hints[hint][2]);
|
---|
725 | g.hinted[hint] = yes(175, g.hints[hint][4], 54);
|
---|
726 | if (g.hinted[hint] && g.limit > 30)
|
---|
727 | g.limit += 30 * g.hints[hint][2];
|
---|
728 | return;
|
---|
729 | }
|
---|