00001
00002
00003 #include "stdio.h"
00004 #include "advent.h"
00005 #include "advdec.h"
00006
00007
00008 static _CONST int actmsg[56] = {
00009 0, 24, 29, 0, 33, 0, 33, 38, 38, 42,
00010 14, 43, 110, 29, 110, 73, 75, 29, 13, 59,
00011 59, 174, 313, 67, 13, 147, 155, 369, 146, 110,
00012 13, 13, 24, 25, 110, 262, 14, 29, 271, 14,
00013 14, 24, 29, 38, 24, 331, 24, 109, 332, 0,
00014 0, 348, 358, 0, 364, 0};
00015
00016 _PROTOTYPE(static int ck_obj, (void));
00017 _PROTOTYPE(void von, (void));
00018 _PROTOTYPE(void voff, (void));
00019 _PROTOTYPE(void vwave, (void));
00020 _PROTOTYPE(void veat, (void));
00021 _PROTOTYPE(void vthrow, (void));
00022 _PROTOTYPE(void vfind, (void));
00023 _PROTOTYPE(void vfill, (void));
00024 _PROTOTYPE(void vfeed, (void));
00025 _PROTOTYPE(void vbreak, (void));
00026 _PROTOTYPE(void vwake, (void));
00027 _PROTOTYPE(void vdrop, (void));
00028 _PROTOTYPE(void vpour, (void));
00029 _PROTOTYPE(void vput, (void));
00030 _PROTOTYPE(void vread, (void));
00031 _PROTOTYPE(void vinsert, (void));
00032 _PROTOTYPE(void vextract, (void));
00033 _PROTOTYPE(static boolean do_battle, (int *));
00034 _PROTOTYPE(void vhit, (void));
00035 _PROTOTYPE(void vanswer, (void));
00036 _PROTOTYPE(void vblow, (void));
00037 _PROTOTYPE(void vdial, (void));
00038 _PROTOTYPE(void vplay, (void));
00039 _PROTOTYPE(void vpick, (void));
00040 _PROTOTYPE(void vput, (void));
00041 _PROTOTYPE(void vturn, (void));
00042 _PROTOTYPE(void vget, (void));
00043 _PROTOTYPE(void vlook, (void));
00044
00045
00046
00047
00048
00049 void trverb()
00050 {
00051 newtravel = FALSE;
00052 switch (verb) {
00053 case NOTHING:
00054 case CALM:
00055 case WALK:
00056 case QUIT:
00057 case SCORE:
00058 case FOO:
00059 case SUSPEND: break;
00060 case TAKE: vtake(); break;
00061 case DROP: vdrop(); break;
00062 case SAY: bug(34); break;
00063 case OPEN: vopen(); break;
00064 case CLOSE: vclose(); break;
00065 case LOCK: vlock(); break;
00066 case UNLOCK: vunlock(); break;
00067 case ON: von(); break;
00068 case OFF: voff(); break;
00069 case WAVE: vwave(); break;
00070 case KILL: vkill(); break;
00071 case POUR: vpour(); break;
00072 case EAT: veat(); break;
00073 case DRINK: vdrink(); break;
00074 case RUB:
00075 if (object != LAMP)
00076 rspeak(76);
00077 else
00078 actspk(RUB);
00079 break;
00080 case THROW:
00081 if (prep == PREPDN)
00082 vput();
00083 else
00084 vthrow();
00085 break;
00086 case FEED: vfeed(); break;
00087 case FIND:
00088 case INVENTORY: vfind(); break;
00089 case FILL: vfill(); break;
00090 case BLAST: ivblast(); break;
00091 case READ: vread(); break;
00092 case BREAK: vbreak(); break;
00093 case WAKE: vwake(); break;
00094 case REMOVE: vextract(); break;
00095 case YANK: vyank(); break;
00096 case WEAR: vwear(); break;
00097 case HIT: vhit(); break;
00098 case ANSWER: vanswer(); break;
00099 case BLOW: vblow(); break;
00100 case DIAL: vdial(); break;
00101 case PLAY: vplay(); break;
00102 case PICK: vpick(); break;
00103 case PUT: vput(); break;
00104 case TURN: vturn(); break;
00105 case GET: vget(); break;
00106 case INSRT: vinsert(); break;
00107 case LOOK: vlook(); break;
00108 default:
00109 printf("This verb is not implemented yet.\n");
00110 }
00111 return;
00112 }
00113
00114
00115
00116
00117 void actspk(verb)
00118 int verb;
00119 {
00120 int i;
00121
00122 if (verb < 1 || verb > 55)
00123 bug(39);
00124 i = actmsg[verb];
00125 if (i)
00126 rspeak(i);
00127 return;
00128 }
00129
00130
00131
00132
00133 void vtake()
00134 {
00135 int msg;
00136
00137 msg = 0;
00138 if (object == BIRD && !g.closed && athand(BIRD)
00139 && g.place[BIRD] != g.loc) {
00140 rspeak(407);
00141 return;
00142 }
00143 if (prep == PREPOF) {
00144 if (object && iobj) {
00145 rspeak(confuz());
00146 return;
00147 } else if (!object) {
00148 object = iobj;
00149 iobj = 0;
00150 vdrop();
00151 return;
00152 }
00153 }
00154 msg = 24;
00155 if (object == BOAT)
00156 msg = 281;
00157 if (plural(object))
00158 msg = 297;
00159 if (holding(object)) {
00160 rspeak(msg);
00161 return;
00162 }
00163
00164 msg = ck_obj();
00165 if (g.fixed[object]) {
00166 rspeak(msg);
00167 return;
00168 }
00169 if (prep == PREPIN) {
00170 vinsert();
00171 return;
00172 }
00173
00174 if (object == WATER || object == OIL || object == WINE) {
00175 if (here(BOTTLE) && here(CASK)) {
00176 rspeak(315);
00177 return;
00178 }
00179 iobj = object;
00180 if (here(BOTTLE)) {
00181 object = BOTTLE;
00182 if (holding(BOTTLE))
00183 vfill();
00184 else
00185 rspeak(312);
00186 return;
00187 } else if (here(CASK)) {
00188 object = CASK;
00189 if (holding(CASK))
00190 vfill();
00191 else
00192 rspeak(312);
00193 return;
00194 } else {
00195 rspeak(312);
00196 return;
00197 }
00198 }
00199 if (object != BEAR && ((burden(0) + burden(object)) > 15)) {
00200 if (wearng(object)) {
00201 g.prop[object] = 0;
00202 bitoff(object, WEARBT);
00203 }
00204 rspeak(92);
00205 return;
00206 }
00207 if (prep == PREPFR || enclosed(object)) {
00208 vextract();
00209 return;
00210 }
00211 msg = 343;
00212
00213 if (object == POSTER && g.place[SAFE] == 0) {
00214 g.prop[POSTER] = 1;
00215 msg = 362;
00216
00217 drop(SAFE, g.loc);
00218 drop(WALL2, g.loc);
00219 }
00220
00221 if (object == BOAT) {
00222 if (!toting(POLE) && g.place[POLE] != -BOAT) {
00223 rspeak(218);
00224 return;
00225 } else {
00226 g.prop[BOAT] = 1;
00227 msg = 221;
00228 }
00229 }
00230
00231 if (object == BIRD && g.prop[BIRD] <= 0) {
00232 if (athand(ROD)) {
00233 rspeak(26);
00234 return;
00235 }
00236 if (!holding(CAGE)) {
00237 rspeak(27);
00238 return;
00239 }
00240 if (!ajar(CAGE)) {
00241 rspeak(358);
00242 return;
00243 }
00244 insert(BIRD, CAGE);
00245 bitoff(CAGE, OPENBT);
00246 pspeak(object, -1);
00247 rspeak(54);
00248 return;
00249 }
00250
00251 if (object == SWORD && g.prop[SWORD] != 0) {
00252 if (iobj && iobj != ANVIL) {
00253 rspeak(noway());
00254 return;
00255 }
00256 if (verb != YANK)
00257 if (!yes(215, 0, 54))
00258 return;
00259
00260 if (!wearng(CROWN)) {
00261 g.fixed[SWORD] = -1;
00262 g.prop[SWORD] = 3;
00263 pspeak(SWORD, 2);
00264 return;
00265 }
00266 }
00267 carry(object, g.loc);
00268 if (object == POLE || object == SKEY || object == SWORD
00269 || ((object == CLOAK || object == RING) && !wearng(object)) )
00270 g.prop[object] = 0;
00271
00272 if (verb == YANK || object == SWORD)
00273 msg = 204;
00274 rspeak(msg);
00275 return;
00276 }
00277
00278 static int ck_obj()
00279 {
00280 int msg;
00281
00282 msg = noway();
00283 if (object == PLANT && g.prop[PLANT] <= 0)
00284 msg = 115;
00285 if (object == BEAR && g.prop[BEAR] == 1)
00286 msg = 169;
00287 if (object == CHAIN && g.prop[BEAR] != 0)
00288 msg = 170;
00289 if (object == SWORD && g.prop[SWORD] == 5)
00290 msg = 208;
00291 if (object == CLOAK && g.prop[CLOAK] == 2)
00292 msg = 242;
00293 if (object == AXE && g.prop[AXE] == 2)
00294 msg = 246;
00295 if (object == PHONE)
00296 msg = 251;
00297 if (object == BEES || object == HIVE)
00298 msg = 295;
00299 if (object == STICKS)
00300 msg = 296;
00301 return (msg);
00302 }
00303
00304
00305
00306
00307 void vdrop()
00308 {
00309 int msg;
00310
00311
00312 if (holding(ROD2) && object == ROD && !holding(ROD))
00313 object = ROD2;
00314 if (plural(object))
00315 msg = 105;
00316 else
00317 msg = 29;
00318
00319 if (object == liq(BOTTLE))
00320 object = BOTTLE;
00321 else if (object == liq(CASK))
00322 object = CASK;
00323
00324 if (!toting(object)) {
00325 rspeak(msg);
00326 return;
00327 }
00328 if (prep == PREPIN) {
00329 vinsert();
00330 return;
00331 }
00332
00333 if (object == BIRD && here(SNAKE)) {
00334 rspeak(30);
00335 if (g.closed) {
00336 dwarfend();
00337 return;
00338 }
00339 extract(BIRD);
00340 destroy(SNAKE);
00341
00342 g.prop[SNAKE] = 1;
00343 drop(BIRD, g.loc);
00344 return;
00345 }
00346 msg = 344;
00347 if (verb == LEAVE)
00348 msg = 353;
00349 if (verb == THROW)
00350 msg = 352;
00351 if (verb == TAKE)
00352 msg = 54;
00353 if (object == POLE && holding(BOAT)) {
00354 rspeak(280);
00355 return;
00356 }
00357
00358 if (object == COINS && here(VEND)) {
00359 destroy(COINS);
00360 drop(BATTERIES, g.loc);
00361 pspeak(BATTERIES, 0);
00362 return;
00363 }
00364
00365 if (object == BIRD && at(DRAGON) && g.prop[DRAGON] == 0) {
00366 rspeak(154);
00367 extract(BIRD);
00368 destroy(BIRD);
00369 if (g.place[SNAKE] == plac[SNAKE])
00370 g.tally2++;
00371 return;
00372 }
00373
00374 if (object == BEAR && at(TROLL)) {
00375 msg = 163;
00376 destroy(TROLL);
00377 destroy(TROLL + MAXOBJ);
00378 move(TROLL2, plac[TROLL]);
00379 move((TROLL2 + MAXOBJ), fixd[TROLL]);
00380 juggle(CHASM);
00381 g.prop[TROLL] = 2;
00382 }
00383
00384 else if (object == VASE) {
00385 if (g.loc == plac[PILLOW])
00386 msg = 54;
00387 else {
00388 g.prop[VASE] = at(PILLOW) ? 0 : 2;
00389 pspeak(VASE, g.prop[VASE] + 1);
00390 if (g.prop[VASE] != 0)
00391 g.fixed[VASE] = -1;
00392 }
00393 } else {
00394 if (worn(object) || object == POLE || object == BOAT)
00395 g.prop[object] = 0;
00396 if (worn(object))
00397 bitoff(object, WEARBT);
00398 if (object == POLE)
00399 g.prop[BOAT] = 0;
00400 }
00401
00402 if (enclosed(object))
00403 extract(object);
00404 drop(object, g.loc);
00405 rspeak(msg);
00406 return;
00407 }
00408
00409
00410
00411
00412
00413
00414 void vopen()
00415 {
00416 int msg, oyclam;
00417
00418 if (!hinged(object))
00419 msg = noway();
00420 else if (object == PDOOR && g.prop[PDOOR] == 1)
00421 msg = 253;
00422 else if (ajar(object))
00423 msg = 336;
00424 else if (locks(object) || iobj == KEYS || iobj == SKEY) {
00425 vunlock();
00426 return;
00427 } else if (locked(object))
00428 if (object == DOOR)
00429 msg = 111;
00430 else
00431 msg = 337;
00432 else if (object == CLAM || object == OYSTER) {
00433 oyclam = (object == OYSTER ? 1 : 0);
00434 msg = oyclam + holding(object) ? 120 : 124;
00435 if (!athand(TRIDENT))
00436 msg = 122 + oyclam;
00437 if (iobj != 0 && iobj != TRIDENT)
00438 msg = 376 + oyclam;
00439
00440 if (msg == 124) {
00441 destroy(CLAM);
00442 drop(OYSTER, g.loc);
00443 drop(PEARL, 105);
00444 }
00445 } else {
00446 msg = 54;
00447 biton(object, OPENBT);
00448 }
00449 rspeak(msg);
00450 return;
00451 }
00452
00453
00454
00455
00456
00457
00458 void vclose()
00459 {
00460 if (!hinged(object))
00461 rspeak(noway());
00462 else if (!ajar(object))
00463 rspeak(338);
00464 else if (locks(object))
00465 vlock();
00466 else {
00467 rspeak(54);
00468 bitoff(object, OPENBT);
00469 }
00470 }
00471
00472
00473
00474
00475 void von()
00476 {
00477 if (!athand(LAMP))
00478 actspk(verb);
00479 else if (g.limit < 0)
00480 rspeak(184);
00481 else if (g.prop[LAMP] == 1)
00482 rspeak(321);
00483 else {
00484 g.prop[LAMP] = 1;
00485 if (g.loc == 200)
00486 rspeak(108);
00487 else
00488 rspeak(39);
00489 if (g.wzdark) {
00490 g.wzdark = 0;
00491 describe();
00492 descitem();
00493 }
00494 }
00495 return;
00496 }
00497
00498
00499
00500
00501 void voff()
00502 {
00503 if (!athand(LAMP))
00504 actspk(verb);
00505 else if (g.prop[LAMP] == 0)
00506 rspeak(322);
00507 else {
00508 g.prop[LAMP] = 0;
00509 rspeak(40);
00510 if (dark())
00511 rspeak(16);
00512 }
00513 return;
00514 }
00515
00516
00517
00518
00519 void vwave()
00520 {
00521 if (!holding(object) &&
00522 (object != ROD || !holding(ROD2)))
00523 rspeak(29);
00524 else if (object != ROD || !at(FISSURE) ||
00525 !holding(object) || g.closing)
00526 actspk(verb);
00527 else if (iobj != 0 && iobj != FISSURE)
00528 actspk(verb);
00529 else {
00530 g.prop[FISSURE] = 1 - g.prop[FISSURE];
00531 pspeak(FISSURE, 2 - g.prop[FISSURE]);
00532 if (g.chase == 0 || g.prop[FISSURE] != 0)
00533 return;
00534 if ((g.loc == 17 && g.oldloc != 27)
00535 || (g.loc == 27 && g.oldloc != 17))
00536 return;
00537
00538 rspeak(244);
00539 g.chase = 0;
00540 drop(RING, 209);
00541 g.prop[WUMPUS] = 6;
00542 move(WUMPUS, 209);
00543 biton(WUMPUS, DEADBT);
00544 if (g.place[AXE] != plac[WUMPUS])
00545 return;
00546 g.fixed[AXE] = 0;
00547 g.prop[AXE] = 0;
00548
00549 }
00550 return;
00551 }
00552
00553
00554
00555
00556 void vkill()
00557 {
00558 int msg, i, k;
00559 boolean survival;
00560
00561 survival = TRUE;
00562 switch (object) {
00563 case BIRD:
00564 if (g.closed)
00565 msg = 137;
00566 else {
00567 destroy(BIRD);
00568 g.prop[BIRD] = 0;
00569 if (g.place[SNAKE] == plac[SNAKE])
00570 g.tally2++;
00571 msg = 45;
00572 }
00573 break;
00574 case DWARF:
00575 if (g.closed) {
00576 dwarfend();
00577 return;
00578 }
00579 survival = do_battle(&msg);
00580 break;
00581 case 0:
00582 msg = 44;
00583 break;
00584 case CLAM:
00585 case OYSTER:
00586 msg = 150;
00587 break;
00588 case DOG:
00589 if (g.prop[DOG] == 1)
00590 msg = 291;
00591 else if (iobj == AXE) {
00592 object = AXE;
00593 iobj = DOG;
00594 vthrow();
00595 return;
00596 } else
00597 msg = 110;
00598 break;
00599 case SNAKE:
00600 msg = 46;
00601 break;
00602 case TROLL:
00603 if (iobj == AXE)
00604 msg = 158;
00605 else
00606 msg = 110;
00607 break;
00608 case BEAR:
00609 msg = 165 + (g.prop[BEAR] + 1) / 2;
00610 break;
00611 case WUMPUS:
00612 if (g.prop[WUMPUS] == 6)
00613 msg = 167;
00614 else if (iobj == AXE) {
00615 object = AXE;
00616 iobj = WUMPUS;
00617 vthrow();
00618 return;
00619 } else
00620 msg = 110;
00621 break;
00622 case GNOME:
00623 msg = 320;
00624 break;
00625 case DRAGON:
00626 if (g.prop[DRAGON] != 0) {
00627 msg = 167;
00628 break;
00629 }
00630 if (!yes(49, 0, 0))
00631 break;
00632 pspeak(DRAGON, 1);
00633 biton(DRAGON, DEADBT);
00634 g.prop[DRAGON] = 2;
00635 g.prop[RUG] = 0;
00636 k = (plac[DRAGON] + fixd[DRAGON]) / 2;
00637 move((DRAGON + MAXOBJ), -1);
00638 move((RUG + MAXOBJ), 0);
00639 move(DRAGON, k);
00640 move(RUG, k);
00641 for (i = 1; i < MAXOBJ; i++)
00642 if (g.place[i] == plac[DRAGON]
00643 || g.place[i] == fixd[DRAGON]
00644 || holding(i))
00645 move(i, k);
00646 g.loc = k;
00647 g.newloc = k;
00648 return;
00649 default:
00650 actspk(verb);
00651 return;
00652 }
00653 rspeak(msg);
00654 if (!survival) {
00655 g.oldloc2 = g.loc;
00656 death();
00657 }
00658 return;
00659 }
00660
00661 static boolean do_battle(msg_ptr)
00662 int *msg_ptr;
00663 {
00664 boolean survival;
00665 int temp;
00666
00667 survival = TRUE;
00668 if (iobj == 0)
00669 *msg_ptr = 49;
00670 else if (iobj != AXE && iobj != SWORD) {
00671 *msg_ptr = 355;
00672 survival = FALSE;
00673 } else if (pct(25)) {
00674 temp = iobj;
00675 iobj = object;
00676 object = temp;
00677 vthrow();
00678 return (TRUE);
00679 } else if (pct(25)) {
00680 *msg_ptr = 355;
00681 survival = FALSE;
00682 } else if (pct(36))
00683 *msg_ptr = 354;
00684 else {
00685 rspeak(356);
00686 if (pct(61))
00687 *msg_ptr = 52;
00688 else {
00689 *msg_ptr = 53;
00690 survival = FALSE;
00691 }
00692 }
00693 return (survival);
00694 }
00695
00696
00697
00698
00699 void vpour()
00700 {
00701 int msg;
00702
00703 if (object == BOTTLE || object == CASK) {
00704 iobj = object;
00705 object = liq(iobj);
00706 if (object == 0) {
00707 rspeak(316);
00708 return;
00709 }
00710 } else {
00711 if (object < WATER || object > (WINE + 1)) {
00712 rspeak(78);
00713 return;
00714 }
00715 }
00716 if (!holding(BOTTLE) && !holding(CASK)) {
00717 rspeak(29);
00718 return;
00719 }
00720 if (holding(BOTTLE) && liq(BOTTLE) == object)
00721 iobj = BOTTLE;
00722 if (holding(CASK) && liq(CASK) == object)
00723 iobj = CASK;
00724 if (iobj == 0) {
00725 rspeak(29);
00726 return;
00727 }
00728 if (!ajar(iobj)) {
00729 rspeak(335);
00730 return;
00731 }
00732 if (iobj == CASK)
00733 object++;
00734 g.prop[iobj] = 1;
00735 extract(object);
00736 g.place[object] = 0;
00737 msg = 77;
00738 if (iobj == CASK) {
00739 object--;
00740 msg = 104;
00741 }
00742 if (at(PLANT) || at(DOOR) || (at(SWORD) && g.prop[SWORD] != 0)) {
00743 if (at(DOOR)) {
00744 g.prop[DOOR] = 0;
00745 if (object == OIL) {
00746 g.prop[DOOR] = 1;
00747 bitoff(DOOR, LOCKBT);
00748 biton(DOOR, OPENBT);
00749 }
00750 msg = 113 + g.prop[DOOR];
00751 } else if (at(SWORD)) {
00752
00753
00754 if (g.prop[SWORD] != 5) {
00755 g.prop[SWORD] = 4;
00756 if (object == OIL) {
00757 g.prop[SWORD] = 5;
00758 g.fixed[SWORD] = -1;
00759 }
00760 msg = 206 + g.prop[SWORD] - 4;
00761 }
00762 } else {
00763 msg = 112;
00764 if (object == WATER) {
00765 if (g.prop[PLANT] < 0)
00766 g.prop[PLANT] = -g.prop[PLANT] - 1;
00767 pspeak(PLANT, g.prop[PLANT] + 1);
00768 g.prop[PLANT] = (g.prop[PLANT] + 2) % 6;
00769 g.prop[PLANT2] = g.prop[PLANT] / 2;
00770 newtravel = TRUE;
00771 return;
00772 }
00773 }
00774 }
00775 rspeak(msg);
00776 return;
00777 }
00778
00779
00780
00781
00782
00783
00784 void veat()
00785 {
00786 int msg, i, k, ll, kk;
00787
00788 switch (object) {
00789 case HONEY:
00790 g.tally2++;
00791 case FOOD:
00792 destroy(object);
00793 msg = 72;
00794 break;
00795 case BIRD:
00796 case SNAKE:
00797 case CLAM:
00798 case OYSTER:
00799 case FLOWER:
00800 msg = 301;
00801 break;
00802 case DWARF:
00803 case DRAGON:
00804 case TROLL:
00805 case DOG:
00806 case WUMPUS:
00807 case BEAR:
00808 case GNOME:
00809 msg = 250;
00810 break;
00811 case MUSHRM:
00812 case CAKES:
00813 k = object - MUSHRM;
00814 ll = 229 + k;
00815 k = 159 - k;
00816 kk = SKEY;
00817 if (object == MUSHRM) {
00818 kk = TDOOR;
00819 if (g.loc != 158)
00820 g.tally2++;
00821 }
00822 destroy(object);
00823 msg = 228;
00824 if (!(here(kk) || g.fixed[kk] == g.loc))
00825 break;
00826 msg = ll;
00827
00828
00829 for (i = 1; i < MAXOBJ; i++) {
00830 if (i == SKEY && g.prop[SKEY] == 1)
00831 continue;
00832 if (g.place[i] == plac[kk] && g.fixed[i] == 0)
00833 move(i, k);
00834 }
00835 if (g.loc == plac[SKEY] && g.place[SKEY] == plac[SKEY])
00836 g.tally2++;
00837 g.loc = k;
00838 g.newloc = k;
00839 newtravel = TRUE;
00840 break;
00841 default:
00842 actspk(verb);
00843 return;
00844 }
00845 rspeak(msg);
00846 return;
00847 }
00848
00849
00850
00851
00852 void vdrink()
00853 {
00854 int msg, k, j;
00855
00856 if (object == 0 && (iobj == BOTTLE || iobj == CASK))
00857 object = liq(iobj);
00858 msg = 110;
00859 if (object == OIL)
00860 msg = 301;
00861 if (object != WATER && object != WINE) {
00862 rspeak(msg);
00863 return;
00864 }
00865 if (iobj == 0) {
00866 if (object == liqloc(g.loc))
00867 iobj = -1;
00868 if (athand(CASK) && object == liq(CASK))
00869 iobj = CASK;
00870 if (athand(BOTTLE) && object == liq(BOTTLE))
00871 iobj = BOTTLE;
00872 }
00873 msg = 73;
00874 if (iobj != -1) {
00875 if (iobj == CASK)
00876 object++;
00877 extract(object);
00878 g.place[object] = 0;
00879 g.prop[iobj] = 1;
00880 msg = (iobj == CASK) ? 299 : 74;
00881 }
00882 if (object == WATER || object == (WATER + 1)) {
00883 rspeak(msg);
00884 return;
00885 }
00886
00887
00888
00889 rspeak(300);
00890 if (g.prop[LAMP] == 1)
00891 g.limit -= ranz(g.limit) / 2;
00892 if (g.limit < 10)
00893 g.limit = 25;
00894 k = 0;
00895 if (pct(15))
00896 k = 49;
00897 if (k == 0 && pct(15))
00898 k = 53;
00899 if (k == 0 && pct(25))
00900 k = 132;
00901 if (k == 0)
00902 k = 175;
00903 if (outside(g.loc))
00904 k = 5;
00905 if (k == g.loc) {
00906 rspeak(msg);
00907 return;
00908 }
00909 if (holding(AXE))
00910 move(AXE, k);
00911 if (holding(LAMP))
00912 move(LAMP, k);
00913 for (j = 1; j < MAXOBJ; j++) {
00914 if (wearng(j))
00915 bitoff(j, WEARBT);
00916 if (holding(j))
00917 drop(j, g.loc);
00918 }
00919 g.loc = k;
00920 g.newloc = k;
00921 }
00922
00923
00924
00925
00926 void vthrow()
00927 {
00928 int msg, i, k, dwarfn;
00929
00930 if (holding(ROD2) && object == ROD && !holding(ROD))
00931 object = ROD2;
00932 if (!holding(object)) {
00933 actspk(verb);
00934 return;
00935 }
00936 if (object == BOAT || object == BEAR) {
00937 rspeak(noway());
00938 return;
00939 }
00940 dwarfn = dcheck();
00941 if (iobj == 0) {
00942
00943
00944
00945
00946 if (dwarfn)
00947 iobj = DWARF;
00948 else {
00949
00950 k = 0;
00951 for (i = 1; i < MAXOBJ; i++) {
00952 if (at(i) && living(i)) {
00953 iobj = i;
00954 k++;
00955 }
00956 }
00957 if (k == 0) {
00958 vdrop();
00959 return;
00960 }
00961
00962
00963 if (k > 1) {
00964 rspeak(43);
00965 return;
00966 } else {
00967 if (iobj == BIRD) {
00968 vdrop();
00969 return;
00970 }
00971 if (treasr(object) && at(TROLL))
00972 iobj = TROLL;
00973 }
00974 }
00975 }
00976 if (object == SWORD || object == BOTTLE) {
00977 vbreak();
00978 return;
00979 }
00980 if (object == FLOWER && iobj == HIVE)
00981 iobj = BEES;
00982 if (edible(object) && living(iobj)) {
00983 vfeed();
00984 return;
00985 }
00986
00987 if (object != AXE && iobj != TROLL) {
00988 vdrop();
00989 return;
00990 }
00991
00992 msg = 48;
00993 switch (iobj) {
00994 case DRAGON:
00995 if (g.prop[DRAGON] == 0)
00996 msg = 152;
00997 break;
00998 case DWARF:
00999
01000 if (pct(75)) {
01001 g.dseen[dwarfn] = g.dloc[dwarfn] = 0;
01002 msg = 47;
01003 ++g.dkill;
01004 if (g.dkill == 1)
01005 msg = 149;
01006 }
01007 break;
01008 case BEAR:
01009
01010 if (g.prop[BEAR] == 0) {
01011 msg = 164;
01012 drop(AXE, g.loc);
01013 g.fixed[AXE] = -1;
01014 g.prop[AXE] = 1;
01015 juggle(BEAR);
01016 }
01017 rspeak(msg);
01018 return;
01019 case WUMPUS:
01020
01021 if (g.prop[WUMPUS] == 6) {
01022 vdrop();
01023 return;
01024 } else {
01025 msg = 245;
01026 g.prop[AXE] = 2;
01027 if (g.prop[WUMPUS] == 0) {
01028 drop(AXE, g.loc);
01029 g.fixed[AXE] = -1;
01030 juggle(iobj);
01031 } else {
01032 msg = 243;
01033 destroy(AXE);
01034 }
01035 }
01036 rspeak(msg);
01037 return;
01038 case DOG:
01039
01040 if (g.prop[DOG] != 1) {
01041 msg = 248;
01042 g.prop[AXE] = 3;
01043 drop(AXE, g.loc);
01044 g.fixed[AXE] = -1;
01045 juggle(iobj);
01046 }
01047 rspeak(msg);
01048 return;
01049 case TROLL:
01050
01051 if (object == AXE) {
01052 msg = 158;
01053 } else if (!treasr(object) ||
01054 (object == CASK && (liq(CASK) != WINE))) {
01055 vdrop();
01056 return;
01057 } else {
01058 msg = 159;
01059 drop(object, 0);
01060 if (object == CASK)
01061 g.place[WINE + 1] = 0;
01062 move(TROLL, 0);
01063 move((TROLL + MAXOBJ), 0);
01064 drop(TROLL2, plac[TROLL]);
01065 drop((TROLL2 + MAXOBJ), fixd[TROLL]);
01066 juggle(CHASM);
01067 rspeak(msg);
01068 return;
01069 }
01070 break;
01071
01072 default:
01073
01074 verb = KILL;
01075 object = iobj;
01076 iobj = objs[objx];
01077 vkill();
01078 return;
01079 }
01080
01081 rspeak(msg);
01082 drop(AXE, g.loc);
01083 g.newloc = g.loc;
01084 describe();
01085 }
01086
01087
01088
01089
01090 void vfind()
01091 {
01092 int msg;
01093
01094 if (at(object) ||
01095 (liq(BOTTLE) == object && at(BOTTLE)) ||
01096 object == liqloc(g.loc))
01097 msg = 94;
01098 else if (dcheck() && g.dflag >= 2 && object == DWARF)
01099 msg = 94;
01100 else if (g.closed)
01101 msg = 138;
01102 else if (at(object))
01103 msg = 24;
01104 else {
01105 actspk(verb);
01106 return;
01107 }
01108 rspeak(msg);
01109 return;
01110 }
01111
01112
01113
01114
01115 void vfeed()
01116 {
01117 int msg;
01118
01119 if (iobj == 0 || !living(iobj)) {
01120 int i, k, kk;
01121
01122 if (object == BIRD) {
01123 rspeak(100);
01124 return;
01125 }
01126 if (!living(object)) {
01127 rspeak(noway());
01128 return;
01129 }
01130
01131
01132 kk = 0;
01133 k = 0;
01134 for (i = 1; i < MAXOBJ; i++)
01135 if (here(i) && edible(i)) {
01136 k++;
01137 kk = i;
01138 }
01139 iobj = object;
01140 object = kk;
01141 if (k != 1 && !dead(iobj)) {
01142 printf("What do you want to feed the %s\n", otxt[objx]);
01143 objs[1] = 0;
01144 objx = 0;
01145 return;
01146 }
01147 }
01148
01149 msg = 102;
01150 switch (iobj) {
01151 case DRAGON:
01152 if (g.prop[DRAGON] != 0)
01153 msg = noway();
01154 break;
01155 case TROLL:
01156 msg = 182;
01157 break;
01158 case SNAKE:
01159 if (object == BIRD && !g.closed) {
01160 msg = 101;
01161 destroy(BIRD);
01162 g.prop[BIRD] = 0;
01163 g.tally2++;
01164 }
01165 break;
01166 case DWARF:
01167 msg = 103;
01168 g.dflag++;
01169 break;
01170 case BEAR:
01171 if (g.prop[BEAR] == 3)
01172 msg = noway();
01173 if (g.prop[BEAR] == 1 || g.prop[BEAR] == 2)
01174 msg = 264;
01175 if (object == FOOD)
01176 msg = 278;
01177 if (object == HONEY) {
01178 g.prop[BEAR] = 1;
01179 g.fixed[AXE] = 0;
01180 destroy(HONEY);
01181 msg = 168;
01182 }
01183 break;
01184 case DOG:
01185 msg = 291;
01186 if (object == FOOD && g.prop[DOG] != 1) {
01187 msg = 249;
01188 destroy(FOOD);
01189 }
01190 break;
01191 case WUMPUS:
01192 if (g.prop[WUMPUS] == 6)
01193 msg = 326;
01194 if (g.prop[WUMPUS] == 0)
01195 msg = 327;
01196 if (object == FOOD)
01197 msg = 240;
01198 break;
01199 case BEES:
01200 if (object == FLOWER) {
01201 if (enclosed(FLOWER))
01202 extract(FLOWER);
01203 drop(FLOWER, g.loc);
01204 g.fixed[FLOWER] = -1;
01205 g.prop[FLOWER] = 1;
01206 drop(HONEY, g.loc);
01207 juggle(HONEY);
01208 msg = 267;
01209 g.prop[HIVE] = 1;
01210 }
01211 }
01212 rspeak(msg);
01213 return;
01214 }
01215
01216
01217
01218
01219 void vfill()
01220 {
01221 int msg, k;
01222
01223 if (!vessel(object))
01224 msg = 313;
01225 else {
01226 if (iobj == 0)
01227 iobj = liqloc(g.loc);
01228 if (object == BOTTLE || object == CASK) {
01229 k = (object == CASK) ? 1 : 0;
01230 msg = 0;
01231 if (iobj == 0)
01232 msg = 304 + k;
01233 if (liq(object) != 0)
01234 msg = 302 + k;
01235 if (msg != 0) {
01236 rspeak(msg);
01237 return;
01238 }
01239 msg = 306 + k;
01240 if (iobj == OIL)
01241 msg = 308 + k;
01242 if (iobj == WINE)
01243 msg = 310 + k;
01244 g.prop[object] = (int) g.loc_attrib[g.loc] & 14;
01245 g.place[iobj + k] = -1;
01246 insert(iobj + k, object);
01247 } else if (object == VASE) {
01248 if (iobj == 0 || !holding(VASE)) {
01249 rspeak(144);
01250 return;
01251 }
01252 msg = 145;
01253 g.prop[VASE] = 2;
01254 g.fixed[VASE] = -1;
01255 if (enclosed(object))
01256 extract(object);
01257 drop(object, g.loc);
01258 } else if (object == GRAIL)
01259 msg = 298;
01260 else
01261 msg = 339;
01262 }
01263 rspeak(msg);
01264 }
01265
01266
01267
01268
01269 void vread()
01270 {
01271 int msg;
01272
01273 if (blind()) {
01274 actspk(verb);
01275 return;
01276 }
01277 if (object && iobj) {
01278 rspeak(confuz());
01279 return;
01280 }
01281 msg = confuz();
01282 if (!object)
01283 object = iobj;
01284 switch (object) {
01285 case BOOK:
01286 case BOOK2:
01287 msg = 142;
01288 break;
01289 case BILLBD:
01290 msg = 361;
01291 break;
01292 case CARVNG:
01293 msg = 372;
01294 break;
01295 case MAGAZINE:
01296 msg = 190;
01297 break;
01298 case MESSAGE:
01299 msg = 191;
01300 break;
01301 case POSTER:
01302 msg = 370;
01303 break;
01304 case TABLET:
01305 msg = 196;
01306 break;
01307 case OYSTER:
01308 if (g.hinted[2] && holding(OYSTER))
01309 msg = 194;
01310 if (!g.hinted[2] && holding(OYSTER) && g.closed) {
01311 g.hinted[2] = yes(192, 193, 54);
01312 return;
01313 }
01314 break;
01315 }
01316 rspeak(msg);
01317 return;
01318 }
01319
01320
01321
01322
01323
01324 void vbreak()
01325 {
01326 int msg, k;
01327 boolean it_broke;
01328
01329 it_broke = FALSE;
01330 msg = 146;
01331 switch (object) {
01332 case MIRROR:
01333 msg = 148;
01334 if (g.closed) {
01335 rspeak(197);
01336 dwarfend();
01337 return;
01338 }
01339 break;
01340 case VASE:
01341 if (g.prop[VASE] == 0) {
01342 it_broke = TRUE;
01343 msg = 198;
01344 g.prop[VASE] = 2;
01345 }
01346 break;
01347 case BOTTLE:
01348 if (g.prop[BOTTLE] != 3) {
01349 it_broke = TRUE;
01350 k = liq(BOTTLE);
01351 msg = 231;
01352 g.prop[BOTTLE] = 3;
01353 if (k) {
01354 extract(k);
01355 g.place[k] = 0;
01356 }
01357 }
01358 break;
01359 case SWORD:
01360 msg = 29;
01361 if (holding(SWORD)) {
01362 msg = 279;
01363 g.prop[SWORD] = 4;
01364 it_broke = TRUE;
01365 }
01366 break;
01367 }
01368 if (it_broke) {
01369 if (enclosed(object))
01370 extract(object);
01371 if (holding(object))
01372 drop(object, g.loc);
01373 g.fixed[object] = -1;
01374 }
01375 rspeak(msg);
01376 return;
01377 }
01378
01379
01380
01381
01382
01383 void vwake()
01384 {
01385 int msg;
01386
01387 msg = actmsg[verb];
01388 if (at(WUMPUS)) {
01389 g.chase = TRUE;
01390 g.prop[WUMPUS] = 1;
01391 msg = 276;
01392 }
01393 if (at(DOG) && g.prop[DOG] == 1)
01394 msg = 291;
01395 if (object == DWARF && g.closed) {
01396 rspeak(199);
01397 dwarfend();
01398 return;
01399 }
01400 rspeak(msg);
01401 return;
01402 }
01403
01404
01405
01406
01407
01408 void vyank()
01409 {
01410 if (toting(object))
01411 vdrop();
01412 else if (object == BEAR && g.prop[CHAIN])
01413 rspeak(205);
01414 else if (object == CLOAK && g.prop[CLOAK] == 2) {
01415
01416 g.prop[ROCKS] = 1;
01417 g.prop[CLOAK] = 0;
01418 g.fixed[CLOAK] = 0;
01419 carry(CLOAK, g.loc);
01420 rspeak(241);
01421 if (at(WUMPUS) && g.prop[WUMPUS] == 0) {
01422 g.chase = 1;
01423 g.prop[WUMPUS] = 1;
01424 rspeak(276);
01425 }
01426 } else
01427 vtake();
01428 return;
01429 }
01430
01431
01432
01433
01434
01435
01436 void vwear()
01437 {
01438 int msg;
01439
01440 if (object == SWORD && g.prop[SWORD] != 3)
01441 msg = 209;
01442 else if (worn(object)) {
01443 if (object == CLOAK && g.prop[CLOAK] == 2)
01444 msg = 242;
01445 else if (wearng(object))
01446 msg = (object == SHOES) ? 227 : 210;
01447 else {
01448 g.prop[object] = 1;
01449 biton(object, WEARBT);
01450 if (enclosed(object))
01451 extract(object);
01452 if (holding(object))
01453 msg = 54;
01454 else {
01455 vtake();
01456 return;
01457 }
01458 }
01459 } else {
01460 printf("Just exactly how does one wear a %s\n", otxt[objx]);
01461 return;
01462 }
01463 rspeak(msg);
01464 return;
01465 }
01466
01467
01468
01469
01470 void vhit()
01471 {
01472 if (at(WUMPUS) && g.prop[WUMPUS] == 0) {
01473 vwake();
01474 return;
01475 }
01476 if (object != PHONE) {
01477 vkill();
01478 return;
01479 } else {
01480 if (g.closed) {
01481 rspeak(282);
01482 dwarfend();
01483 return;
01484 }
01485 if (g.prop[PHONE] == 2)
01486 rspeak(256);
01487 else {
01488 drop(SLUGS, g.loc);
01489 g.prop[PHONE] = 2;
01490 g.prop[BOOTH] = 2;
01491 rspeak(257);
01492 }
01493 }
01494 return;
01495 }
01496
01497
01498
01499
01500 void vanswer()
01501 {
01502 int msg;
01503
01504 switch (object) {
01505 case DWARF:
01506 case WUMPUS:
01507 case SNAKE:
01508 case BEAR:
01509 case DRAGON:
01510 msg = 259;
01511 break;
01512 case TROLL:
01513 msg = 258;
01514 break;
01515 case BIRD:
01516 msg = 260;
01517 break;
01518 case PHONE:
01519 if (g.prop[PHONE] != 0)
01520 msg = 269;
01521 else if (g.closed) {
01522 rspeak(283);
01523 normend();
01524 return;
01525 } else {
01526 msg = 261;
01527 g.prop[PHONE] = 1;
01528 g.prop[BOOTH] = 2;
01529 }
01530 break;
01531 default:
01532 msg = actmsg[verb];
01533 break;
01534 }
01535 rspeak(msg);
01536 return;
01537 }
01538
01539
01540
01541
01542 void vblow()
01543 {
01544 int msg, i, k;
01545
01546 msg = actmsg[verb];
01547 if (object != 0 && iobj != 0) {
01548 rspeak(msg);
01549 return;
01550 }
01551 if (object == 0)
01552 object = iobj;
01553 iobj = 0;
01554 if (object == 0)
01555 msg = 268;
01556 if (object == HORN) {
01557 msg = outside(g.loc) ? 277 : 266;
01558 if (at(WUMPUS)) {
01559 rspeak(msg);
01560 if (g.prop[WUMPUS] == 0)
01561 vwake();
01562 return;
01563 } else if (g.prop[WALL] != 1 && (g.loc == 102 || g.loc == 194)) {
01564 k = g.loc == 194 ? 195 : 196;
01565 msg = 265;
01566 g.prop[WALL] = 1;
01567 for (i = 1; i < MAXOBJ; i++)
01568 if (g.place[i] == g.loc || g.fixed[i] == g.loc)
01569 move(i, k);
01570 g.newloc = k;
01571 }
01572 }
01573 rspeak(msg);
01574 return;
01575 }
01576
01577
01578
01579
01580 void vdial()
01581 {
01582 if (object != PHONE)
01583 actspk(verb);
01584 else if (g.closed) {
01585 rspeak(283);
01586 normend();
01587 } else
01588 rspeak(271);
01589 return;
01590 }
01591
01592
01593
01594
01595 void vplay()
01596 {
01597 int msg;
01598
01599 msg = actmsg[verb];
01600 if (object != 0 && iobj != 0) {
01601 rspeak(confuz());
01602 return;
01603 }
01604 if (object == 0)
01605 object = iobj;
01606 if (object == HORN) {
01607 vblow();
01608 return;
01609 }
01610 if (object == LYRE) {
01611 msg = 287;
01612 if (here(DOG) && !dead(DOG)) {
01613 g.prop[DOG] = 1;
01614 biton(DOG, DEADBT);
01615 g.fixed[AXE] = 0;
01616 g.prop[AXE] = 0;
01617 msg = 288;
01618 }
01619 }
01620 rspeak(msg);
01621 return;
01622 }
01623
01624
01625
01626
01627
01628 void vpick()
01629 {
01630 if (object == 0)
01631 object = iobj;
01632 iobj = 0;
01633 if (object == FLOWER || object == MUSHRM || prep != 0)
01634 vtake();
01635 else
01636 rspeak(confuz());
01637 return;
01638 }
01639
01640
01641
01642
01643
01644
01645 void vput()
01646 {
01647 if (prep == 0) {
01648 printf("Where do you want to put the %s\n", otxt[objx]);
01649 return;
01650 }
01651 if (prep == PREPIN)
01652 vinsert();
01653 else {
01654
01655 if (prep == PREPON) {
01656 if (object == 0) {
01657 object = iobj;
01658 otxt[objx] = iotxt[iobx];
01659 iobj = 0;
01660 }
01661 if (worn(object) || object == 0)
01662 vwear();
01663 else
01664 vdrop();
01665 } else {
01666
01667 if (object == 0 && iobj == 0) {
01668 if (object == 0)
01669 object = iobj;
01670 iobj = 0;
01671 vdrop();
01672 } else
01673 rspeak(noway());
01674 }
01675 }
01676 return;
01677 }
01678
01679
01680 void vturn()
01681 {
01682 if (!prep)
01683 rspeak(confuz());
01684 else {
01685 if (!object && iobj == LAMP)
01686 object = LAMP;
01687 if (object != LAMP)
01688 rspeak(noway());
01689 else if (prep == PREPON)
01690 von();
01691 else
01692 voff();
01693 }
01694 return;
01695 }
01696
01697
01698
01699
01700
01701
01702 void vget()
01703 {
01704 if (prep == 0 || prep == PREPFR)
01705 vtake();
01706 else if (object == 0) {
01707 object = iobj;
01708 iobj = 0;
01709 prep = 0;
01710 vtake();
01711 }
01712 return;
01713 }
01714
01715
01716
01717
01718 void vinsert()
01719 {
01720 int msg;
01721
01722 if (iobj == 0) {
01723 printf("Where do you want to %s it?\n", vtxt[vrbx]);
01724 return;
01725 }
01726 msg = noway();
01727 if (object == SWORD && iobj == ANVIL && g.prop[SWORD] == 0)
01728 msg = 350;
01729 if (!vessel(iobj)) {
01730 rspeak(msg);
01731 return;
01732 }
01733 msg = ck_obj();
01734 if (g.fixed[object]) {
01735 rspeak(msg);
01736 return;
01737 }
01738 if (object == iobj) {
01739 rspeak(252);
01740 return;
01741 }
01742 if (iobj == BOTTLE || iobj == CASK || iobj == VASE
01743 || iobj == GRAIL || (object >= WATER && object <= WINE + 1)) {
01744 object = iobj;
01745 iobj = objs[objx];
01746 vfill();
01747 return;
01748 }
01749 if (!ajar(iobj)) {
01750 rspeak(358);
01751 return;
01752 }
01753 if (iobj == CHEST) {
01754 if (object == BOAT)
01755 msg = noway();
01756 else {
01757 if (wearng(object))
01758 bitoff(object, WEARBT);
01759 if (worn(object))
01760 g.prop[object] = 0;
01761 if (enclosed(object))
01762 extract(object);
01763 insert(object, iobj);
01764 msg = 54;
01765 }
01766 rspeak(msg);
01767 return;
01768 }
01769
01770 if (object == BIRD && iobj != CAGE) {
01771 rspeak(351);
01772 return;
01773 }
01774 if (object != BIRD && iobj == CAGE) {
01775 rspeak(329);
01776 return;
01777 }
01778 if (object == BIRD) {
01779 prep = 0;
01780 vtake();
01781 return;
01782 }
01783
01784 if ((object == VASE || object == PILLOW) && iobj == SAFE) {
01785 rspeak(329);
01786 return;
01787 }
01788 if (object != RADIUM && iobj == SHIELD) {
01789 rspeak(329);
01790 return;
01791 }
01792 if (iobj == PHONE) {
01793 if (object == COINS || object == SLUGS) {
01794 destroy(object);
01795 msg = 330;
01796 } else
01797 msg = 329;
01798 rspeak(msg);
01799 return;
01800 }
01801 if (iobj == VEND) {
01802 if (object == COINS || object == SLUGS) {
01803 destroy(object);
01804 move(BATTERIES, g.loc);
01805 if (g.prop[BATTERIES] == 1) {
01806 rspeak(317);
01807 g.prop[VEND] = 1;
01808 }
01809 g.prop[BATTERIES] = 0;
01810 pspeak(BATTERIES, 0);
01811 } else
01812 rspeak(noway());
01813 return;
01814 }
01815
01816
01817
01818
01819
01820 if (iobj == LAMP) {
01821 if (object != BATTERIES || g.prop[BATTERIES] != 0)
01822 msg = noway();
01823 else {
01824 g.prop[BATTERIES] = 1;
01825 if (enclosed(BATTERIES))
01826 extract(BATTERIES);
01827 if (holding(BATTERIES))
01828 drop(BATTERIES, g.loc);
01829 g.limit = 400;
01830 g.prop[LAMP] = 1;
01831 g.lmwarn = FALSE;
01832 msg = 188;
01833 }
01834 rspeak(msg);
01835 return;
01836 }
01837 if (!small(object))
01838 msg = 329;
01839 else {
01840 if (wearng(object))
01841 bitoff(object, WEARBT);
01842 if (worn(object))
01843 g.prop[object] = 0;
01844 if (enclosed(object))
01845 extract(object);
01846 insert(object, iobj);
01847 msg = 54;
01848 }
01849 rspeak(msg);
01850 return;
01851
01852 }
01853
01854
01855 void vextract()
01856 {
01857 int msg;
01858
01859 if (object == RING && g.prop[RING] == 2) {
01860 prep = 0;
01861 iobj = 0;
01862 vtake();
01863 return;
01864 }
01865 msg = 343;
01866 if (iobj == 0) {
01867 if (!enclosed(object))
01868 msg = 340;
01869 iobj = -g.place[object];
01870 }
01871 if (g.place[object] != -iobj)
01872 msg = 341;
01873 if (!ajar(iobj))
01874 msg = 335;
01875 if (object == WATER || object == OIL || object == WINE)
01876 msg = 342;
01877 if (!toting(object) && ((burden(0) + burden(object)) > 15))
01878 msg = 92;
01879 if (msg == 343) {
01880 if (object == BIRD) {
01881 vdrop();
01882 return;
01883 }
01884 extract(object);
01885 }
01886 rspeak(msg);
01887 return;
01888 }
01889
01890
01891
01892
01893
01894
01895
01896
01897
01898
01899
01900
01901
01902
01903
01904
01905
01906
01907
01908
01909
01910
01911
01912
01913 void vlock()
01914 {
01915 int msg, k;
01916
01917 if (!hinged(object))
01918 {
01919 printf("I don't know how to lock or unlock the %s\n",
01920 otxt[objx]);
01921 return;
01922 }
01923 else if (!locks(object))
01924 msg = 32;
01925 else if (locked(object))
01926 msg = 34;
01927 else if (!athand(KEYS) && !athand(SKEY) && object != SAFE)
01928 msg = 31;
01929 else {
01930 msg = 375;
01931 switch (object) {
01932 case CHAIN:
01933 if (!athand(KEYS))
01934 break;
01935 msg = 173;
01936 if (g.loc != plac[CHAIN])
01937 break;
01938 msg = 172;
01939 g.prop[CHAIN] = 2;
01940 if (enclosed(CHAIN))
01941 extract(CHAIN);
01942 if (holding(CHAIN))
01943 drop(CHAIN, g.loc);
01944 g.fixed[CHAIN] = -1;
01945 biton(CHAIN, LOCKBT);
01946 bitoff(CHAIN, OPENBT);
01947 break;
01948
01949 case CHEST:
01950 if (!athand(KEYS))
01951 break;
01952 msg = 334;
01953 biton(CHEST, LOCKBT);
01954 bitoff(CHEST, OPENBT);
01955 break;
01956
01957 case TDOOR:
01958 case TDOOR2:
01959 msg = 224;
01960 if (!toting(SKEY))
01961 break;
01962 g.prop[TDOOR] = 0;
01963 g.prop[TDOOR2] = 0;
01964 msg = 234 + (TDOOR2 - object);
01965 k = TDOOR + TDOOR2 - object;
01966 biton(k, LOCKBT);
01967 bitoff(k, OPENBT);
01968 biton(object, LOCKBT);
01969 bitoff(object, OPENBT);
01970 break;
01971
01972 case GRATE:
01973 if (!athand(KEYS))
01974 break;
01975 g.prop[GRATE] = 0;
01976 msg = 35;
01977 biton(GRATE, LOCKBT);
01978 bitoff(GRATE, OPENBT);
01979 break;
01980
01981 case SAFE:
01982 g.prop[SAFE] = 0;
01983 msg = 367;
01984 biton(SAFE, LOCKBT);
01985 bitoff(SAFE, OPENBT);
01986 break;
01987
01988 }
01989 }
01990 rspeak(msg);
01991 }
01992
01993
01994
01995
01996 void vunlock()
01997 {
01998 int msg, k;
01999
02000 if (object == KEYS || object == SKEY)
02001 msg = 55;
02002 else if (!hinged(object))
02003 {
02004 printf("I don't know how to lock or unlock the %s\n",
02005 otxt[objx]);
02006 return;
02007 }
02008 else if (!locked(object))
02009 msg = 37;
02010 else if (!locks(object))
02011 msg = 32;
02012 else if (object == SAFE) {
02013 if (iobj == KEYS || iobj == SKEY)
02014 msg = 368;
02015 else
02016 msg = 342;
02017 } else if (!athand(KEYS) && !athand(SKEY))
02018 msg = 31;
02019 else {
02020 msg = 375;
02021 switch (object) {
02022 case CHAIN:
02023 if (!athand(KEYS))
02024 break;
02025 if (g.prop[BEAR] == 0)
02026 msg = 41;
02027 else {
02028 msg = 171;
02029 g.prop[CHAIN] = 0;
02030 g.fixed[CHAIN] = 0;
02031 if (g.prop[BEAR] != 3)
02032 g.prop[BEAR] = 2;
02033 g.fixed[BEAR] = 2 - g.prop[BEAR];
02034 bitoff(CHAIN, LOCKBT);
02035 biton(CHAIN, OPENBT);
02036 }
02037 break;
02038 case CHEST:
02039 if (athand(KEYS)) {
02040 msg = 333;
02041 bitoff(CHEST, LOCKBT);
02042 biton(CHEST, OPENBT);
02043 }
02044 break;
02045 case TDOOR:
02046 case TDOOR2:
02047
02048
02049
02050
02051 msg = 224;
02052 if (!athand(SKEY))
02053 break;
02054 if (g.closing) {
02055 msg = 130;
02056 if (!g.panic)
02057 g.clock2 = 15;
02058 g.panic = TRUE;
02059 } else {
02060 g.prop[TDOOR] = 1;
02061 g.prop[TDOOR2] = 1;
02062 msg = 234 + 2 + (TDOOR2 - object);
02063 k = TDOOR + (TDOOR2 - object);
02064 bitoff(k, LOCKBT);
02065 biton(k, OPENBT);
02066 bitoff(object, LOCKBT);
02067 biton(object, OPENBT);
02068 }
02069 break;
02070 case GRATE:
02071 if (!athand(KEYS))
02072 break;
02073 if (g.closing) {
02074 msg = 130;
02075 if (!g.panic)
02076 g.clock2 = 15;
02077 g.panic = TRUE;
02078 } else {
02079 g.prop[GRATE] = 1;
02080 msg = 36;
02081 bitoff(GRATE, LOCKBT);
02082 biton(GRATE, OPENBT);
02083 }
02084 break;
02085 default:
02086 msg = 33;
02087 }
02088 }
02089 rspeak(msg);
02090 }
02091
02092
02093
02094
02095 void vlook()
02096 {
02097 int sloc;
02098
02099 if (object != 0) {
02100 rspeak(confuz());
02101 return;
02102 }
02103
02104 if (vessel(iobj)) {
02105 if (!ajar(iobj) && opaque(iobj))
02106 rspeak(actmsg[verb]);
02107 else if (g.holder[iobj] == 0)
02108 rspeak(359);
02109 else {
02110 putchar(' ');
02111 lookin(iobj);
02112 }
02113
02114
02115 } else if (printed(iobj)) {
02116 object = iobj;
02117 iobj = 0;
02118 vread();
02119 } else if (iobj == SPHERE) {
02120 if (!inside(g.loc) || athand(SAPPHIRE))
02121 rspeak(42);
02122 else {
02123 rspeak(400);
02124 printf(" ");
02125 sloc = g.place[SAPPHIRE];
02126 if ((g.loc_attrib[sloc] % 2 == 0 || enclosed(SAPPHIRE))
02127 && sloc != 200
02128 && !g.place[LAMP] == sloc && g.prop[LAMP] != 0)
02129 rspeak(401);
02130 else
02131 desclg(sloc);
02132 if (sloc == 239 && !g.flg239) {
02133 rspeak(403);
02134 g.flg239 = TRUE;
02135 }
02136 printf(" ");
02137 rspeak(402);
02138 }
02139 } else
02140 printf("I see nothing special about the %s?\n", iotxt[iobx]);
02141 return;
02142 }