1 1.14 rillig /* $NetBSD: subr.c,v 1.14 2021/05/02 12:50:43 rillig Exp $ */ 2 1.2 cgd 3 1.1 jtc /*- 4 1.1 jtc * Copyright (c) 1991, 1993 5 1.1 jtc * The Regents of the University of California. All rights reserved. 6 1.1 jtc * 7 1.1 jtc * The game adventure was originally written in Fortran by Will Crowther 8 1.1 jtc * and Don Woods. It was later translated to C and enhanced by Jim 9 1.1 jtc * Gillogly. This code is derived from software contributed to Berkeley 10 1.1 jtc * by Jim Gillogly at The Rand Corporation. 11 1.1 jtc * 12 1.1 jtc * Redistribution and use in source and binary forms, with or without 13 1.1 jtc * modification, are permitted provided that the following conditions 14 1.1 jtc * are met: 15 1.1 jtc * 1. Redistributions of source code must retain the above copyright 16 1.1 jtc * notice, this list of conditions and the following disclaimer. 17 1.1 jtc * 2. Redistributions in binary form must reproduce the above copyright 18 1.1 jtc * notice, this list of conditions and the following disclaimer in the 19 1.1 jtc * documentation and/or other materials provided with the distribution. 20 1.10 agc * 3. Neither the name of the University nor the names of its contributors 21 1.1 jtc * may be used to endorse or promote products derived from this software 22 1.1 jtc * without specific prior written permission. 23 1.1 jtc * 24 1.1 jtc * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 25 1.1 jtc * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 26 1.1 jtc * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 27 1.1 jtc * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 28 1.1 jtc * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 29 1.1 jtc * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 30 1.1 jtc * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 31 1.1 jtc * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 32 1.1 jtc * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 33 1.1 jtc * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 34 1.1 jtc * SUCH DAMAGE. 35 1.1 jtc */ 36 1.1 jtc 37 1.3 christos #include <sys/cdefs.h> 38 1.1 jtc #ifndef lint 39 1.2 cgd #if 0 40 1.1 jtc static char sccsid[] = "@(#)subr.c 8.1 (Berkeley) 5/31/93"; 41 1.2 cgd #else 42 1.14 rillig __RCSID("$NetBSD: subr.c,v 1.14 2021/05/02 12:50:43 rillig Exp $"); 43 1.2 cgd #endif 44 1.5 lukem #endif /* not lint */ 45 1.1 jtc 46 1.1 jtc /* Re-coding of advent in C: subroutines from main */ 47 1.1 jtc 48 1.3 christos #include <stdio.h> 49 1.9 matt #include <stdlib.h> 50 1.3 christos #include "hdr.h" 51 1.3 christos #include "extern.h" 52 1.1 jtc 53 1.12 dholland static void badmove(void); 54 1.12 dholland static int bitset(int, int); 55 1.12 dholland static int dropper(void); 56 1.12 dholland static int liq2(int); 57 1.12 dholland static int mback(void); 58 1.12 dholland static int specials(void); 59 1.12 dholland static int trbridge(void); 60 1.12 dholland 61 1.1 jtc /* Statement functions */ 62 1.3 christos int 63 1.11 jmc toting(int objj) 64 1.5 lukem { 65 1.5 lukem if (place[objj] == -1) 66 1.5 lukem return (TRUE); 67 1.5 lukem else 68 1.5 lukem return (FALSE); 69 1.1 jtc } 70 1.1 jtc 71 1.3 christos int 72 1.11 jmc here(int objj) 73 1.5 lukem { 74 1.5 lukem if (place[objj] == loc || toting(objj)) 75 1.5 lukem return (TRUE); 76 1.5 lukem else 77 1.5 lukem return (FALSE); 78 1.1 jtc } 79 1.1 jtc 80 1.3 christos int 81 1.11 jmc at(int objj) 82 1.5 lukem { 83 1.5 lukem if (place[objj] == loc || fixed[objj] == loc) 84 1.5 lukem return (TRUE); 85 1.5 lukem else 86 1.5 lukem return (FALSE); 87 1.1 jtc } 88 1.1 jtc 89 1.12 dholland static int 90 1.11 jmc liq2(int pbotl) 91 1.5 lukem { 92 1.5 lukem return ((1 - pbotl) * water + (pbotl / 2) * (water + oil)); 93 1.1 jtc } 94 1.1 jtc 95 1.3 christos int 96 1.11 jmc liq(void) 97 1.5 lukem { 98 1.5 lukem int i; 99 1.5 lukem i = prop[bottle]; 100 1.5 lukem if (i > -1 - i) 101 1.5 lukem return (liq2(i)); 102 1.5 lukem else 103 1.5 lukem return (liq2(-1 - i)); 104 1.1 jtc } 105 1.1 jtc 106 1.11 jmc /* may want to clean this one up a bit */ 107 1.3 christos int 108 1.11 jmc liqloc(int locc) 109 1.5 lukem { 110 1.5 lukem int i, j, l; 111 1.5 lukem i = cond[locc] / 2; 112 1.5 lukem j = ((i * 2) % 8) - 5; 113 1.5 lukem l = cond[locc] / 4; 114 1.5 lukem l = l % 2; 115 1.5 lukem return (liq2(j * l + 1)); 116 1.1 jtc } 117 1.1 jtc 118 1.12 dholland static int 119 1.11 jmc bitset(int l, int n) 120 1.5 lukem { 121 1.5 lukem if (cond[l] & setbit[n]) 122 1.5 lukem return (TRUE); 123 1.5 lukem return (FALSE); 124 1.1 jtc } 125 1.1 jtc 126 1.3 christos int 127 1.11 jmc forced(int locc) 128 1.5 lukem { 129 1.5 lukem if (cond[locc] == 2) 130 1.5 lukem return (TRUE); 131 1.5 lukem return (FALSE); 132 1.1 jtc } 133 1.1 jtc 134 1.3 christos int 135 1.11 jmc dark(void) 136 1.5 lukem { 137 1.5 lukem if ((cond[loc] % 2) == 0 && (prop[lamp] == 0 || !here(lamp))) 138 1.5 lukem return (TRUE); 139 1.5 lukem return (FALSE); 140 1.1 jtc } 141 1.1 jtc 142 1.3 christos int 143 1.11 jmc pct(int n) 144 1.5 lukem { 145 1.5 lukem if (ran(100) < n) 146 1.5 lukem return (TRUE); 147 1.5 lukem return (FALSE); 148 1.1 jtc } 149 1.1 jtc 150 1.1 jtc 151 1.3 christos int 152 1.11 jmc fdwarf(void) 153 1.5 lukem { /* 71 */ 154 1.5 lukem int i, j; 155 1.4 lukem struct travlist *kk; 156 1.1 jtc 157 1.5 lukem if (newloc != loc && !forced(loc) && !bitset(loc, 3)) { 158 1.5 lukem for (i = 1; i <= 5; i++) { 159 1.5 lukem if (odloc[i] != newloc || !dseen[i]) 160 1.5 lukem continue; 161 1.5 lukem newloc = loc; 162 1.1 jtc rspeak(2); 163 1.1 jtc break; 164 1.1 jtc } 165 1.1 jtc } 166 1.5 lukem loc = newloc; /* 74 */ 167 1.5 lukem if (loc == 0 || forced(loc) || bitset(newloc, 3)) 168 1.5 lukem return (2000); 169 1.5 lukem if (dflag == 0) { 170 1.5 lukem if (loc >= 15) 171 1.5 lukem dflag = 1; 172 1.5 lukem return (2000); 173 1.5 lukem } 174 1.5 lukem if (dflag == 1) { /* 6000 */ 175 1.5 lukem if (loc < 15 || pct(95)) 176 1.5 lukem return (2000); 177 1.5 lukem dflag = 2; 178 1.5 lukem for (i = 1; i <= 2; i++) { 179 1.5 lukem j = 1 + ran(5); 180 1.5 lukem if (pct(50) && saved == -1) 181 1.5 lukem dloc[j] = 0; /* 6001 */ 182 1.5 lukem } 183 1.5 lukem for (i = 1; i <= 5; i++) { 184 1.5 lukem if (dloc[i] == loc) 185 1.13 dholland dloc[i] = daltloc; 186 1.5 lukem odloc[i] = dloc[i]; /* 6002 */ 187 1.1 jtc } 188 1.1 jtc rspeak(3); 189 1.5 lukem drop(axe, loc); 190 1.5 lukem return (2000); 191 1.1 jtc } 192 1.5 lukem dtotal = attack = stick = 0; /* 6010 */ 193 1.5 lukem for (i = 1; i <= 6; i++) { /* loop to 6030 */ 194 1.5 lukem if (dloc[i] == 0) 195 1.5 lukem continue; 196 1.5 lukem j = 1; 197 1.5 lukem for (kk = travel[dloc[i]]; kk != 0; kk = kk->next) { 198 1.5 lukem newloc = kk->tloc; 199 1.5 lukem if (newloc > 300 || newloc < 15 || newloc == odloc[i] 200 1.5 lukem || (j > 1 && newloc == tk[j - 1]) || j >= 20 201 1.5 lukem || newloc == dloc[i] || forced(newloc) 202 1.5 lukem || (i == 6 && bitset(newloc, 3)) 203 1.5 lukem || kk->conditions == 100) 204 1.5 lukem continue; 205 1.5 lukem tk[j++] = newloc; 206 1.5 lukem } 207 1.5 lukem tk[j] = odloc[i]; /* 6016 */ 208 1.5 lukem if (j >= 2) 209 1.5 lukem j--; 210 1.5 lukem j = 1 + ran(j); 211 1.5 lukem odloc[i] = dloc[i]; 212 1.5 lukem dloc[i] = tk[j]; 213 1.14 rillig dseen[i] = (dseen[i] && loc >= 15) || 214 1.11 jmc (dloc[i] == loc || odloc[i] == loc); 215 1.5 lukem if (!dseen[i]) 216 1.5 lukem continue; /* i.e. goto 6030 */ 217 1.5 lukem dloc[i] = loc; 218 1.5 lukem if (i == 6) { /* pirate's spotted him */ 219 1.5 lukem if (loc == chloc || prop[chest] >= 0) 220 1.5 lukem continue; 221 1.5 lukem k = 0; 222 1.11 jmc for (j = 50; j <= maxtrs; j++) { /* loop to 6020 */ 223 1.13 dholland if (j == pyramid && (loc == plac[pyramid] 224 1.13 dholland || loc == plac[emerald])) 225 1.5 lukem goto l6020; 226 1.5 lukem if (toting(j)) 227 1.5 lukem goto l6022; 228 1.5 lukem l6020: if (here(j)) 229 1.5 lukem k = 1; 230 1.5 lukem } /* 6020 */ 231 1.5 lukem if (tally == tally2 + 1 && k == 0 && place[chest] == 0 232 1.5 lukem && here(lamp) && prop[lamp] == 1) 233 1.5 lukem goto l6025; 234 1.5 lukem if (odloc[6] != dloc[6] && pct(20)) 235 1.1 jtc rspeak(127); 236 1.5 lukem continue; /* to 6030 */ 237 1.5 lukem l6022: rspeak(128); 238 1.13 dholland if (place[message] == 0) 239 1.5 lukem move(chest, chloc); 240 1.13 dholland move(message, chloc2); 241 1.11 jmc for (j = 50; j <= maxtrs; j++) { /* loop to 6023 */ 242 1.13 dholland if (j == pyramid && (loc == plac[pyramid] 243 1.13 dholland || loc == plac[emerald])) 244 1.5 lukem continue; 245 1.5 lukem if (at(j) && fixed[j] == 0) 246 1.5 lukem carry(j, loc); 247 1.5 lukem if (toting(j)) 248 1.5 lukem drop(j, chloc); 249 1.1 jtc } 250 1.5 lukem l6024: dloc[6] = odloc[6] = chloc; 251 1.5 lukem dseen[6] = FALSE; 252 1.1 jtc continue; 253 1.5 lukem l6025: rspeak(186); 254 1.5 lukem move(chest, chloc); 255 1.13 dholland move(message, chloc2); 256 1.1 jtc goto l6024; 257 1.1 jtc } 258 1.5 lukem dtotal++; /* 6027 */ 259 1.5 lukem if (odloc[i] != dloc[i]) 260 1.5 lukem continue; 261 1.1 jtc attack++; 262 1.5 lukem if (knfloc >= 0) 263 1.5 lukem knfloc = loc; 264 1.5 lukem if (ran(1000) < 95 * (dflag - 2)) 265 1.5 lukem stick++; 266 1.5 lukem } /* 6030 */ 267 1.5 lukem if (dtotal == 0) 268 1.5 lukem return (2000); 269 1.5 lukem if (dtotal != 1) { 270 1.5 lukem printf("There are %d threatening little dwarves ", dtotal); 271 1.1 jtc printf("in the room with you.\n"); 272 1.5 lukem } else 273 1.5 lukem rspeak(4); 274 1.5 lukem if (attack == 0) 275 1.5 lukem return (2000); 276 1.5 lukem if (dflag == 2) 277 1.5 lukem dflag = 3; 278 1.5 lukem if (saved != -1) 279 1.5 lukem dflag = 20; 280 1.5 lukem if (attack != 1) { 281 1.5 lukem printf("%d of them throw knives at you!\n", attack); 282 1.5 lukem k = 6; 283 1.5 lukem l82: if (stick <= 1) { /* 82 */ 284 1.5 lukem rspeak(k + stick); 285 1.5 lukem if (stick == 0) 286 1.5 lukem return (2000); 287 1.5 lukem } else 288 1.5 lukem printf("%d of them get you!\n", stick); /* 83 */ 289 1.13 dholland oldloc2 = loc; 290 1.5 lukem return (99); 291 1.1 jtc } 292 1.1 jtc rspeak(5); 293 1.5 lukem k = 52; 294 1.1 jtc goto l82; 295 1.1 jtc } 296 1.1 jtc 297 1.1 jtc 298 1.11 jmc /* label 8 */ 299 1.3 christos int 300 1.11 jmc march(void) 301 1.14 rillig { 302 1.5 lukem int ll1, ll2; 303 1.5 lukem 304 1.5 lukem if ((tkk = travel[newloc = loc]) == 0) 305 1.5 lukem bug(26); 306 1.5 lukem if (k == null) 307 1.5 lukem return (2); 308 1.5 lukem if (k == cave) { /* 40 */ 309 1.5 lukem if (loc < 8) 310 1.5 lukem rspeak(57); 311 1.5 lukem if (loc >= 8) 312 1.5 lukem rspeak(58); 313 1.5 lukem return (2); 314 1.5 lukem } 315 1.5 lukem if (k == look) { /* 30 */ 316 1.5 lukem if (detail++ < 3) 317 1.5 lukem rspeak(15); 318 1.13 dholland wasdark = FALSE; 319 1.5 lukem abb[loc] = 0; 320 1.5 lukem return (2); 321 1.5 lukem } 322 1.5 lukem if (k == back) { /* 20 */ 323 1.5 lukem switch (mback()) { 324 1.5 lukem case 2: 325 1.5 lukem return (2); 326 1.5 lukem case 9: 327 1.5 lukem goto l9; 328 1.5 lukem default: 329 1.5 lukem bug(100); 330 1.1 jtc } 331 1.1 jtc } 332 1.13 dholland oldloc2 = oldloc; 333 1.5 lukem oldloc = loc; 334 1.1 jtc l9: 335 1.5 lukem for (; tkk != 0; tkk = tkk->next) 336 1.5 lukem if (tkk->tverb == 1 || tkk->tverb == k) 337 1.5 lukem break; 338 1.5 lukem if (tkk == 0) { 339 1.5 lukem badmove(); 340 1.5 lukem return (2); 341 1.5 lukem } 342 1.5 lukem l11: ll1 = tkk->conditions; /* 11 */ 343 1.5 lukem ll2 = tkk->tloc; 344 1.5 lukem newloc = ll1; /* newloc=conditions */ 345 1.5 lukem k = newloc % 100; /* k used for prob */ 346 1.5 lukem if (newloc <= 300) { 347 1.5 lukem if (newloc <= 100) { /* 13 */ 348 1.5 lukem if (newloc != 0 && !pct(newloc)) 349 1.5 lukem goto l12; /* 14 */ 350 1.5 lukem l16: newloc = ll2; /* newloc=location */ 351 1.5 lukem if (newloc <= 300) 352 1.5 lukem return (2); 353 1.5 lukem if (newloc <= 500) 354 1.5 lukem switch (specials()) { /* to 30000 */ 355 1.5 lukem case 2: 356 1.5 lukem return (2); 357 1.5 lukem case 12: 358 1.5 lukem goto l12; 359 1.5 lukem case 99: 360 1.5 lukem return (99); 361 1.5 lukem default: 362 1.5 lukem bug(101); 363 1.1 jtc } 364 1.5 lukem rspeak(newloc - 500); 365 1.5 lukem newloc = loc; 366 1.5 lukem return (2); 367 1.1 jtc } 368 1.5 lukem if (toting(k) || (newloc > 200 && at(k))) 369 1.5 lukem goto l16; 370 1.1 jtc goto l12; 371 1.1 jtc } 372 1.5 lukem if (prop[k] != (newloc / 100) - 3) 373 1.5 lukem goto l16; /* newloc still conditions */ 374 1.5 lukem l12: /* alternative to probability move */ 375 1.5 lukem for (; tkk != 0; tkk = tkk->next) 376 1.5 lukem if (tkk->tloc != ll2 || tkk->conditions != ll1) 377 1.5 lukem break; 378 1.5 lukem if (tkk == 0) 379 1.5 lukem bug(25); 380 1.1 jtc goto l11; 381 1.1 jtc } 382 1.1 jtc 383 1.11 jmc /* 20 */ 384 1.12 dholland static int 385 1.11 jmc mback(void) 386 1.14 rillig { 387 1.5 lukem struct travlist *tk2, *j; 388 1.5 lukem int ll; 389 1.5 lukem if (forced(k = oldloc)) 390 1.13 dholland k = oldloc2; /* k=location */ 391 1.13 dholland oldloc2 = oldloc; 392 1.5 lukem oldloc = loc; 393 1.5 lukem tk2 = 0; 394 1.5 lukem if (k == loc) { 395 1.5 lukem rspeak(91); 396 1.5 lukem return (2); 397 1.5 lukem } 398 1.5 lukem for (; tkk != 0; tkk = tkk->next) { /* 21 */ 399 1.5 lukem ll = tkk->tloc; 400 1.5 lukem if (ll == k) { 401 1.5 lukem k = tkk->tverb; /* k back to verb */ 402 1.5 lukem tkk = travel[loc]; 403 1.5 lukem return (9); 404 1.5 lukem } 405 1.5 lukem if (ll <= 300) { 406 1.5 lukem j = travel[loc]; 407 1.5 lukem if (forced(ll) && k == j->tloc) 408 1.5 lukem tk2 = tkk; 409 1.5 lukem } 410 1.5 lukem } 411 1.5 lukem tkk = tk2; /* 23 */ 412 1.5 lukem if (tkk != 0) { 413 1.5 lukem k = tkk->tverb; 414 1.5 lukem tkk = travel[loc]; 415 1.5 lukem return (9); 416 1.1 jtc } 417 1.1 jtc rspeak(140); 418 1.5 lukem return (2); 419 1.1 jtc } 420 1.1 jtc 421 1.11 jmc /* 30000 */ 422 1.12 dholland static int 423 1.11 jmc specials(void) 424 1.14 rillig { 425 1.5 lukem switch (newloc -= 300) { 426 1.5 lukem case 1: /* 30100 */ 427 1.5 lukem newloc = 99 + 100 - loc; 428 1.13 dholland if (holding == 0 || (holding == 1 && toting(emerald))) 429 1.5 lukem return (2); 430 1.5 lukem newloc = loc; 431 1.1 jtc rspeak(117); 432 1.5 lukem return (2); 433 1.5 lukem case 2: /* 30200 */ 434 1.13 dholland drop(emerald, loc); 435 1.5 lukem return (12); 436 1.5 lukem case 3: /* to 30300 */ 437 1.5 lukem return (trbridge()); 438 1.5 lukem default: 439 1.5 lukem bug(29); 440 1.1 jtc } 441 1.1 jtc } 442 1.1 jtc 443 1.11 jmc /* 30300 */ 444 1.12 dholland static int 445 1.11 jmc trbridge(void) 446 1.11 jmc { 447 1.5 lukem if (prop[troll] == 1) { 448 1.5 lukem pspeak(troll, 1); 449 1.5 lukem prop[troll] = 0; 450 1.5 lukem move(troll2, 0); 451 1.5 lukem move(troll2 + 100, 0); 452 1.5 lukem move(troll, plac[troll]); 453 1.5 lukem move(troll + 100, fixd[troll]); 454 1.1 jtc juggle(chasm); 455 1.5 lukem newloc = loc; 456 1.5 lukem return (2); 457 1.1 jtc } 458 1.11 jmc newloc = plac[troll] + fixd[troll] - loc; /* 30310 */ 459 1.5 lukem if (prop[troll] == 0) 460 1.5 lukem prop[troll] = 1; 461 1.5 lukem if (!toting(bear)) 462 1.5 lukem return (2); 463 1.1 jtc rspeak(162); 464 1.5 lukem prop[chasm] = 1; 465 1.5 lukem prop[troll] = 2; 466 1.5 lukem drop(bear, newloc); 467 1.1 jtc fixed[bear] = -1; 468 1.5 lukem prop[bear] = 3; 469 1.5 lukem if (prop[spices] < 0) 470 1.5 lukem tally2++; 471 1.13 dholland oldloc2 = newloc; 472 1.5 lukem return (99); 473 1.1 jtc } 474 1.1 jtc 475 1.11 jmc /* 20 */ 476 1.12 dholland static void 477 1.11 jmc badmove(void) 478 1.11 jmc { 479 1.5 lukem spk = 12; 480 1.5 lukem if (k >= 43 && k <= 50) 481 1.5 lukem spk = 9; 482 1.5 lukem if (k == 29 || k == 30) 483 1.5 lukem spk = 9; 484 1.5 lukem if (k == 7 || k == 36 || k == 37) 485 1.5 lukem spk = 10; 486 1.5 lukem if (k == 11 || k == 19) 487 1.5 lukem spk = 11; 488 1.5 lukem if (verb == find || verb == invent) 489 1.5 lukem spk = 59; 490 1.5 lukem if (k == 62 || k == 65) 491 1.5 lukem spk = 42; 492 1.5 lukem if (k == 17) 493 1.5 lukem spk = 80; 494 1.1 jtc rspeak(spk); 495 1.1 jtc } 496 1.1 jtc 497 1.7 hubertf void 498 1.11 jmc bug(int n) 499 1.5 lukem { 500 1.5 lukem printf("Please tell jim (at) rand.org that fatal bug %d happened.\n", n); 501 1.8 hubertf exit(1); 502 1.1 jtc } 503 1.1 jtc 504 1.11 jmc /* 2600 &c */ 505 1.7 hubertf void 506 1.11 jmc checkhints(void) 507 1.14 rillig { 508 1.5 lukem int hint; 509 1.13 dholland for (hint = 4; hint <= hintmax; hint++) { 510 1.5 lukem if (hinted[hint]) 511 1.5 lukem continue; 512 1.5 lukem if (!bitset(loc, hint)) 513 1.5 lukem hintlc[hint] = -1; 514 1.1 jtc hintlc[hint]++; 515 1.5 lukem if (hintlc[hint] < hints[hint][1]) 516 1.5 lukem continue; 517 1.5 lukem switch (hint) { 518 1.5 lukem case 4: /* 40400 */ 519 1.5 lukem if (prop[grate] == 0 && !here(keys)) 520 1.5 lukem goto l40010; 521 1.1 jtc goto l40020; 522 1.5 lukem case 5: /* 40500 */ 523 1.5 lukem if (here(bird) && toting(rod) && obj == bird) 524 1.5 lukem goto l40010; 525 1.5 lukem continue; /* i.e. goto l40030 */ 526 1.5 lukem case 6: /* 40600 */ 527 1.5 lukem if (here(snake) && !here(bird)) 528 1.5 lukem goto l40010; 529 1.1 jtc goto l40020; 530 1.5 lukem case 7: /* 40700 */ 531 1.5 lukem if (atloc[loc] == 0 && atloc[oldloc] == 0 532 1.13 dholland && atloc[oldloc2] == 0 && holding > 1) 533 1.5 lukem goto l40010; 534 1.1 jtc goto l40020; 535 1.5 lukem case 8: /* 40800 */ 536 1.13 dholland if (prop[emerald] != -1 && prop[pyramid] == -1) 537 1.5 lukem goto l40010; 538 1.1 jtc goto l40020; 539 1.5 lukem case 9: 540 1.5 lukem goto l40010; /* 40900 */ 541 1.5 lukem default: 542 1.5 lukem bug(27); 543 1.1 jtc } 544 1.5 lukem l40010: hintlc[hint] = 0; 545 1.5 lukem if (!yes(hints[hint][3], 0, 54)) 546 1.5 lukem continue; 547 1.1 jtc printf("I am prepared to give you a hint, but it will "); 548 1.5 lukem printf("cost you %d points.\n", hints[hint][2]); 549 1.5 lukem hinted[hint] = yes(175, hints[hint][4], 54); 550 1.5 lukem l40020: hintlc[hint] = 0; 551 1.1 jtc } 552 1.1 jtc } 553 1.1 jtc 554 1.11 jmc /* 9030 */ 555 1.3 christos int 556 1.11 jmc trsay(void) 557 1.11 jmc { 558 1.5 lukem int i; 559 1.5 lukem if (*wd2 != 0) 560 1.5 lukem copystr(wd2, wd1); 561 1.5 lukem i = vocab(wd1, -1, 0); 562 1.5 lukem if (i == 62 || i == 65 || i == 71 || i == 2025) { 563 1.5 lukem *wd2 = 0; 564 1.5 lukem obj = 0; 565 1.5 lukem return (2630); 566 1.5 lukem } 567 1.5 lukem printf("\nOkay, \"%s\".\n", wd2); 568 1.5 lukem return (2012); 569 1.1 jtc } 570 1.1 jtc 571 1.11 jmc /* 9010 */ 572 1.3 christos int 573 1.11 jmc trtake(void) 574 1.14 rillig { 575 1.5 lukem if (toting(obj)) 576 1.5 lukem return (2011); /* 9010 */ 577 1.5 lukem spk = 25; 578 1.5 lukem if (obj == plant && prop[plant] <= 0) 579 1.5 lukem spk = 115; 580 1.5 lukem if (obj == bear && prop[bear] == 1) 581 1.5 lukem spk = 169; 582 1.5 lukem if (obj == chain && prop[bear] != 0) 583 1.5 lukem spk = 170; 584 1.5 lukem if (fixed[obj] != 0) 585 1.5 lukem return (2011); 586 1.5 lukem if (obj == water || obj == oil) { 587 1.6 hubertf if (here(bottle) && liq() == obj) { 588 1.5 lukem obj = bottle; 589 1.1 jtc goto l9017; 590 1.1 jtc } 591 1.5 lukem obj = bottle; 592 1.5 lukem if (toting(bottle) && prop[bottle] == 1) 593 1.5 lukem return (9220); 594 1.5 lukem if (prop[bottle] != 1) 595 1.5 lukem spk = 105; 596 1.5 lukem if (!toting(bottle)) 597 1.5 lukem spk = 104; 598 1.5 lukem return (2011); 599 1.5 lukem } 600 1.13 dholland l9017: if (holding >= 7) { 601 1.5 lukem rspeak(92); 602 1.5 lukem return (2012); 603 1.5 lukem } 604 1.5 lukem if (obj == bird) { 605 1.5 lukem if (prop[bird] != 0) 606 1.5 lukem goto l9014; 607 1.5 lukem if (toting(rod)) { 608 1.5 lukem rspeak(26); 609 1.5 lukem return (2012); 610 1.1 jtc } 611 1.5 lukem if (!toting(cage)) { /* 9013 */ 612 1.5 lukem rspeak(27); 613 1.5 lukem return (2012); 614 1.1 jtc } 615 1.5 lukem prop[bird] = 1; /* 9015 */ 616 1.1 jtc } 617 1.5 lukem l9014: if ((obj == bird || obj == cage) && prop[bird] != 0) 618 1.5 lukem carry(bird + cage - obj, loc); 619 1.5 lukem carry(obj, loc); 620 1.6 hubertf k = liq(); 621 1.5 lukem if (obj == bottle && k != 0) 622 1.5 lukem place[k] = -1; 623 1.5 lukem return (2009); 624 1.1 jtc } 625 1.1 jtc 626 1.11 jmc /* 9021 */ 627 1.12 dholland static int 628 1.11 jmc dropper(void) 629 1.14 rillig { 630 1.6 hubertf k = liq(); 631 1.5 lukem if (k == obj) 632 1.5 lukem obj = bottle; 633 1.5 lukem if (obj == bottle && k != 0) 634 1.5 lukem place[k] = 0; 635 1.5 lukem if (obj == cage && prop[bird] != 0) 636 1.5 lukem drop(bird, loc); 637 1.5 lukem if (obj == bird) 638 1.5 lukem prop[bird] = 0; 639 1.5 lukem drop(obj, loc); 640 1.5 lukem return (2012); 641 1.1 jtc } 642 1.1 jtc 643 1.11 jmc /* 9020 */ 644 1.3 christos int 645 1.11 jmc trdrop(void) 646 1.11 jmc { 647 1.5 lukem if (toting(rod2) && obj == rod && !toting(rod)) 648 1.5 lukem obj = rod2; 649 1.5 lukem if (!toting(obj)) 650 1.5 lukem return (2011); 651 1.5 lukem if (obj == bird && here(snake)) { 652 1.5 lukem rspeak(30); 653 1.5 lukem if (closed) 654 1.5 lukem return (19000); 655 1.13 dholland destroy(snake); 656 1.5 lukem prop[snake] = 1; 657 1.5 lukem return (dropper()); 658 1.1 jtc } 659 1.5 lukem if (obj == coins && here(vend)) { /* 9024 */ 660 1.13 dholland destroy(coins); 661 1.5 lukem drop(batter, loc); 662 1.5 lukem pspeak(batter, 0); 663 1.5 lukem return (2012); 664 1.1 jtc } 665 1.11 jmc if (obj == bird && at(dragon) && prop[dragon] == 0) { /* 9025 */ 666 1.5 lukem rspeak(154); 667 1.13 dholland destroy(bird); 668 1.5 lukem prop[bird] = 0; 669 1.5 lukem if (place[snake] == plac[snake]) 670 1.5 lukem tally2--; 671 1.5 lukem return (2012); 672 1.5 lukem } 673 1.5 lukem if (obj == bear && at(troll)) { /* 9026 */ 674 1.5 lukem rspeak(163); 675 1.5 lukem move(troll, 0); 676 1.5 lukem move(troll + 100, 0); 677 1.5 lukem move(troll2, plac[troll]); 678 1.5 lukem move(troll2 + 100, fixd[troll]); 679 1.1 jtc juggle(chasm); 680 1.5 lukem prop[troll] = 2; 681 1.5 lukem return (dropper()); 682 1.1 jtc } 683 1.11 jmc if (obj != vase || loc == plac[pillow]) { /* 9027 */ 684 1.5 lukem rspeak(54); 685 1.5 lukem return (dropper()); 686 1.5 lukem } 687 1.5 lukem prop[vase] = 2; /* 9028 */ 688 1.5 lukem if (at(pillow)) 689 1.5 lukem prop[vase] = 0; 690 1.5 lukem pspeak(vase, prop[vase] + 1); 691 1.5 lukem if (prop[vase] != 0) 692 1.5 lukem fixed[vase] = -1; 693 1.5 lukem return (dropper()); 694 1.1 jtc } 695 1.1 jtc 696 1.11 jmc /* 9040 */ 697 1.3 christos int 698 1.11 jmc tropen(void) 699 1.11 jmc { 700 1.5 lukem if (obj == clam || obj == oyster) { 701 1.5 lukem k = 0; /* 9046 */ 702 1.5 lukem if (obj == oyster) 703 1.5 lukem k = 1; 704 1.5 lukem spk = 124 + k; 705 1.5 lukem if (toting(obj)) 706 1.5 lukem spk = 120 + k; 707 1.13 dholland if (!toting(trident)) 708 1.5 lukem spk = 122 + k; 709 1.5 lukem if (verb == lock) 710 1.5 lukem spk = 61; 711 1.5 lukem if (spk != 124) 712 1.5 lukem return (2011); 713 1.13 dholland destroy(clam); 714 1.5 lukem drop(oyster, loc); 715 1.5 lukem drop(pearl, 105); 716 1.5 lukem return (2011); 717 1.5 lukem } 718 1.5 lukem if (obj == door) 719 1.5 lukem spk = 111; 720 1.5 lukem if (obj == door && prop[door] == 1) 721 1.5 lukem spk = 54; 722 1.5 lukem if (obj == cage) 723 1.5 lukem spk = 32; 724 1.5 lukem if (obj == keys) 725 1.5 lukem spk = 55; 726 1.5 lukem if (obj == grate || obj == chain) 727 1.5 lukem spk = 31; 728 1.5 lukem if (spk != 31 || !here(keys)) 729 1.5 lukem return (2011); 730 1.5 lukem if (obj == chain) { 731 1.5 lukem if (verb == lock) { 732 1.5 lukem spk = 172; /* 9049: lock */ 733 1.5 lukem if (prop[chain] != 0) 734 1.5 lukem spk = 34; 735 1.5 lukem if (loc != plac[chain]) 736 1.5 lukem spk = 173; 737 1.5 lukem if (spk != 172) 738 1.5 lukem return (2011); 739 1.5 lukem prop[chain] = 2; 740 1.5 lukem if (toting(chain)) 741 1.5 lukem drop(chain, loc); 742 1.5 lukem fixed[chain] = -1; 743 1.5 lukem return (2011); 744 1.5 lukem } 745 1.5 lukem spk = 171; 746 1.5 lukem if (prop[bear] == 0) 747 1.5 lukem spk = 41; 748 1.5 lukem if (prop[chain] == 0) 749 1.5 lukem spk = 37; 750 1.5 lukem if (spk != 171) 751 1.5 lukem return (2011); 752 1.5 lukem prop[chain] = 0; 753 1.5 lukem fixed[chain] = 0; 754 1.5 lukem if (prop[bear] != 3) 755 1.5 lukem prop[bear] = 2; 756 1.5 lukem fixed[bear] = 2 - prop[bear]; 757 1.5 lukem return (2011); 758 1.5 lukem } 759 1.13 dholland if (isclosing) { 760 1.5 lukem k = 130; 761 1.5 lukem if (!panic) 762 1.5 lukem clock2 = 15; 763 1.5 lukem panic = TRUE; 764 1.5 lukem return (2010); 765 1.5 lukem } 766 1.5 lukem k = 34 + prop[grate]; /* 9043 */ 767 1.5 lukem prop[grate] = 1; 768 1.5 lukem if (verb == lock) 769 1.5 lukem prop[grate] = 0; 770 1.5 lukem k = k + 2 * prop[grate]; 771 1.5 lukem return (2010); 772 1.5 lukem } 773 1.5 lukem 774 1.11 jmc /* 9120 */ 775 1.5 lukem int 776 1.11 jmc trkill(void) 777 1.14 rillig { 778 1.5 lukem int i; 779 1.5 lukem for (i = 1; i <= 5; i++) 780 1.5 lukem if (dloc[i] == loc && dflag >= 2) 781 1.5 lukem break; 782 1.5 lukem if (i == 6) 783 1.5 lukem i = 0; 784 1.5 lukem if (obj == 0) { /* 9122 */ 785 1.5 lukem if (i != 0) 786 1.5 lukem obj = dwarf; 787 1.5 lukem if (here(snake)) 788 1.5 lukem obj = obj * 100 + snake; 789 1.5 lukem if (at(dragon) && prop[dragon] == 0) 790 1.5 lukem obj = obj * 100 + dragon; 791 1.5 lukem if (at(troll)) 792 1.5 lukem obj = obj * 100 + troll; 793 1.5 lukem if (here(bear) && prop[bear] == 0) 794 1.5 lukem obj = obj * 100 + bear; 795 1.5 lukem if (obj > 100) 796 1.5 lukem return (8000); 797 1.5 lukem if (obj == 0) { 798 1.5 lukem if (here(bird) && verb != throw) 799 1.5 lukem obj = bird; 800 1.5 lukem if (here(clam) || here(oyster)) 801 1.5 lukem obj = 100 * obj + clam; 802 1.5 lukem if (obj > 100) 803 1.5 lukem return (8000); 804 1.5 lukem } 805 1.5 lukem } 806 1.5 lukem if (obj == bird) { /* 9124 */ 807 1.5 lukem spk = 137; 808 1.5 lukem if (closed) 809 1.5 lukem return (2011); 810 1.13 dholland destroy(bird); 811 1.5 lukem prop[bird] = 0; 812 1.5 lukem if (place[snake] == plac[snake]) 813 1.5 lukem tally2++; 814 1.5 lukem spk = 45; 815 1.5 lukem } 816 1.5 lukem if (obj == 0) 817 1.5 lukem spk = 44; /* 9125 */ 818 1.5 lukem if (obj == clam || obj == oyster) 819 1.5 lukem spk = 150; 820 1.5 lukem if (obj == snake) 821 1.5 lukem spk = 46; 822 1.5 lukem if (obj == dwarf) 823 1.5 lukem spk = 49; 824 1.5 lukem if (obj == dwarf && closed) 825 1.5 lukem return (19000); 826 1.5 lukem if (obj == dragon) 827 1.5 lukem spk = 147; 828 1.5 lukem if (obj == troll) 829 1.5 lukem spk = 157; 830 1.5 lukem if (obj == bear) 831 1.5 lukem spk = 165 + (prop[bear] + 1) / 2; 832 1.5 lukem if (obj != dragon || prop[dragon] != 0) 833 1.5 lukem return (2011); 834 1.1 jtc rspeak(49); 835 1.5 lukem verb = 0; 836 1.5 lukem obj = 0; 837 1.5 lukem getin(&wd1, &wd2); 838 1.5 lukem if (!weq(wd1, "y") && !weq(wd1, "yes")) 839 1.5 lukem return (2608); 840 1.5 lukem pspeak(dragon, 1); 841 1.5 lukem prop[dragon] = 2; 842 1.5 lukem prop[rug] = 0; 843 1.5 lukem k = (plac[dragon] + fixd[dragon]) / 2; 844 1.5 lukem move(dragon + 100, -1); 845 1.5 lukem move(rug + 100, 0); 846 1.5 lukem move(dragon, k); 847 1.5 lukem move(rug, k); 848 1.5 lukem for (obj = 1; obj <= 100; obj++) 849 1.5 lukem if (place[obj] == plac[dragon] || place[obj] == fixd[dragon]) 850 1.5 lukem move(obj, k); 851 1.5 lukem loc = k; 852 1.5 lukem k = null; 853 1.5 lukem return (8); 854 1.1 jtc } 855 1.1 jtc 856 1.11 jmc /* 9170: throw */ 857 1.3 christos int 858 1.11 jmc trtoss(void) 859 1.14 rillig { 860 1.5 lukem int i; 861 1.5 lukem if (toting(rod2) && obj == rod && !toting(rod)) 862 1.5 lukem obj = rod2; 863 1.5 lukem if (!toting(obj)) 864 1.5 lukem return (2011); 865 1.5 lukem if (obj >= 50 && obj <= maxtrs && at(troll)) { 866 1.5 lukem spk = 159; /* 9178 */ 867 1.5 lukem drop(obj, 0); 868 1.5 lukem move(troll, 0); 869 1.5 lukem move(troll + 100, 0); 870 1.5 lukem drop(troll2, plac[troll]); 871 1.5 lukem drop(troll2 + 100, fixd[troll]); 872 1.1 jtc juggle(chasm); 873 1.5 lukem return (2011); 874 1.1 jtc } 875 1.5 lukem if (obj == food && here(bear)) { 876 1.5 lukem obj = bear; /* 9177 */ 877 1.5 lukem return (9210); 878 1.5 lukem } 879 1.5 lukem if (obj != axe) 880 1.5 lukem return (9020); 881 1.5 lukem for (i = 1; i <= 5; i++) { 882 1.5 lukem if (dloc[i] == loc) { 883 1.5 lukem spk = 48; /* 9172 */ 884 1.5 lukem if (ran(3) == 0 || saved != -1) 885 1.5 lukem l9175: { 886 1.5 lukem rspeak(spk); 887 1.5 lukem drop(axe, loc); 888 1.5 lukem k = null; 889 1.5 lukem return (8); 890 1.1 jtc } 891 1.5 lukem dseen[i] = FALSE; 892 1.5 lukem dloc[i] = 0; 893 1.5 lukem spk = 47; 894 1.1 jtc dkill++; 895 1.5 lukem if (dkill == 1) 896 1.5 lukem spk = 149; 897 1.1 jtc goto l9175; 898 1.1 jtc } 899 1.1 jtc } 900 1.5 lukem spk = 152; 901 1.5 lukem if (at(dragon) && prop[dragon] == 0) 902 1.5 lukem goto l9175; 903 1.5 lukem spk = 158; 904 1.5 lukem if (at(troll)) 905 1.1 jtc goto l9175; 906 1.5 lukem if (here(bear) && prop[bear] == 0) { 907 1.5 lukem spk = 164; 908 1.5 lukem drop(axe, loc); 909 1.5 lukem fixed[axe] = -1; 910 1.5 lukem prop[axe] = 1; 911 1.1 jtc juggle(bear); 912 1.5 lukem return (2011); 913 1.1 jtc } 914 1.5 lukem obj = 0; 915 1.5 lukem return (9120); 916 1.1 jtc } 917 1.1 jtc 918 1.11 jmc /* 9210 */ 919 1.3 christos int 920 1.11 jmc trfeed(void) 921 1.14 rillig { 922 1.5 lukem if (obj == bird) { 923 1.5 lukem spk = 100; 924 1.5 lukem return (2011); 925 1.1 jtc } 926 1.5 lukem if (obj == snake || obj == dragon || obj == troll) { 927 1.5 lukem spk = 102; 928 1.5 lukem if (obj == dragon && prop[dragon] != 0) 929 1.5 lukem spk = 110; 930 1.5 lukem if (obj == troll) 931 1.5 lukem spk = 182; 932 1.5 lukem if (obj != snake || closed || !here(bird)) 933 1.5 lukem return (2011); 934 1.5 lukem spk = 101; 935 1.13 dholland destroy(bird); 936 1.5 lukem prop[bird] = 0; 937 1.1 jtc tally2++; 938 1.5 lukem return (2011); 939 1.1 jtc } 940 1.5 lukem if (obj == dwarf) { 941 1.5 lukem if (!here(food)) 942 1.5 lukem return (2011); 943 1.5 lukem spk = 103; 944 1.1 jtc dflag++; 945 1.5 lukem return (2011); 946 1.1 jtc } 947 1.5 lukem if (obj == bear) { 948 1.5 lukem if (prop[bear] == 0) 949 1.5 lukem spk = 102; 950 1.5 lukem if (prop[bear] == 3) 951 1.5 lukem spk = 110; 952 1.5 lukem if (!here(food)) 953 1.5 lukem return (2011); 954 1.13 dholland destroy(food); 955 1.5 lukem prop[bear] = 1; 956 1.5 lukem fixed[axe] = 0; 957 1.5 lukem prop[axe] = 0; 958 1.5 lukem spk = 168; 959 1.5 lukem return (2011); 960 1.5 lukem } 961 1.5 lukem spk = 14; 962 1.5 lukem return (2011); 963 1.1 jtc } 964 1.1 jtc 965 1.11 jmc /* 9220 */ 966 1.3 christos int 967 1.11 jmc trfill(void) 968 1.11 jmc { 969 1.5 lukem if (obj == vase) { 970 1.5 lukem spk = 29; 971 1.5 lukem if (liqloc(loc) == 0) 972 1.5 lukem spk = 144; 973 1.5 lukem if (liqloc(loc) == 0 || !toting(vase)) 974 1.5 lukem return (2011); 975 1.1 jtc rspeak(145); 976 1.5 lukem prop[vase] = 2; 977 1.5 lukem fixed[vase] = -1; 978 1.5 lukem return (9020); /* advent/10 goes to 9024 */ 979 1.5 lukem } 980 1.5 lukem if (obj != 0 && obj != bottle) 981 1.5 lukem return (2011); 982 1.5 lukem if (obj == 0 && !here(bottle)) 983 1.5 lukem return (8000); 984 1.5 lukem spk = 107; 985 1.5 lukem if (liqloc(loc) == 0) 986 1.5 lukem spk = 106; 987 1.6 hubertf if (liq() != 0) 988 1.5 lukem spk = 105; 989 1.5 lukem if (spk != 107) 990 1.5 lukem return (2011); 991 1.5 lukem prop[bottle] = ((cond[loc] % 4) / 2) * 2; 992 1.6 hubertf k = liq(); 993 1.5 lukem if (toting(bottle)) 994 1.5 lukem place[k] = -1; 995 1.5 lukem if (k == oil) 996 1.5 lukem spk = 108; 997 1.5 lukem return (2011); 998 1.1 jtc } 999 1.1 jtc 1000 1.11 jmc /* 10000 */ 1001 1.7 hubertf void 1002 1.11 jmc closing(void) 1003 1.14 rillig { 1004 1.5 lukem int i; 1005 1.5 lukem 1006 1.13 dholland prop[grate] = prop[fissure] = 0; 1007 1.5 lukem for (i = 1; i <= 6; i++) { 1008 1.5 lukem dseen[i] = FALSE; 1009 1.5 lukem dloc[i] = 0; 1010 1.5 lukem } 1011 1.5 lukem move(troll, 0); 1012 1.5 lukem move(troll + 100, 0); 1013 1.5 lukem move(troll2, plac[troll]); 1014 1.5 lukem move(troll2 + 100, fixd[troll]); 1015 1.1 jtc juggle(chasm); 1016 1.5 lukem if (prop[bear] != 3) 1017 1.13 dholland destroy(bear); 1018 1.5 lukem prop[chain] = 0; 1019 1.5 lukem fixed[chain] = 0; 1020 1.5 lukem prop[axe] = 0; 1021 1.5 lukem fixed[axe] = 0; 1022 1.1 jtc rspeak(129); 1023 1.1 jtc clock1 = -1; 1024 1.13 dholland isclosing = TRUE; 1025 1.1 jtc } 1026 1.1 jtc 1027 1.11 jmc /* 11000 */ 1028 1.7 hubertf void 1029 1.11 jmc caveclose(void) 1030 1.14 rillig { 1031 1.5 lukem int i; 1032 1.5 lukem prop[bottle] = put(bottle, 115, 1); 1033 1.5 lukem prop[plant] = put(plant, 115, 0); 1034 1.5 lukem prop[oyster] = put(oyster, 115, 0); 1035 1.5 lukem prop[lamp] = put(lamp, 115, 0); 1036 1.5 lukem prop[rod] = put(rod, 115, 0); 1037 1.5 lukem prop[dwarf] = put(dwarf, 115, 0); 1038 1.5 lukem loc = 115; 1039 1.5 lukem oldloc = 115; 1040 1.5 lukem newloc = 115; 1041 1.5 lukem 1042 1.5 lukem put(grate, 116, 0); 1043 1.5 lukem prop[snake] = put(snake, 116, 1); 1044 1.5 lukem prop[bird] = put(bird, 116, 1); 1045 1.5 lukem prop[cage] = put(cage, 116, 0); 1046 1.5 lukem prop[rod2] = put(rod2, 116, 0); 1047 1.5 lukem prop[pillow] = put(pillow, 116, 0); 1048 1.5 lukem 1049 1.5 lukem prop[mirror] = put(mirror, 115, 0); 1050 1.5 lukem fixed[mirror] = 116; 1051 1.5 lukem 1052 1.5 lukem for (i = 1; i <= 100; i++) 1053 1.5 lukem if (toting(i)) 1054 1.13 dholland destroy(i); 1055 1.1 jtc rspeak(132); 1056 1.5 lukem closed = TRUE; 1057 1.1 jtc } 1058