verb.c

Go to the documentation of this file.
00001 /*      program VERB.C                                          */
00002 
00003 #include        "stdio.h"
00004 #include        "advent.h"
00005 #include        "advdec.h"
00006 
00007  /* Initialize default verb messages */
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   Routine to process a transitive verb
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   Routine to speak default verb message
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   CARRY TAKE etc.
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     /* Special case objects and fixed objects */
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     /* Special case for liquids */
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     /* Poster: hides wall safe */
00213     if (object == POSTER && g.place[SAFE] == 0) {
00214         g.prop[POSTER] = 1;
00215         msg = 362;
00216         /* Move safe and wall containing safe into view */
00217         drop(SAFE, g.loc);
00218         drop(WALL2, g.loc);
00219     }
00220     /* Boat: need the pole to push it */
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     /* Special case for bird. */
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     /* SWORD If in anvil, need crown & must yank */
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   DROP etc.
00306 */
00307 void vdrop()
00308 {
00309     int msg;
00310 
00311     /* Check for dynamite */
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     /* Snake and bird */
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         /* Set snake prop for use by travel options */
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     /* Coins and vending machine */
00358     if (object == COINS && here(VEND)) {
00359         destroy(COINS);
00360         drop(BATTERIES, g.loc);
00361         pspeak(BATTERIES, 0);
00362         return;
00363     }
00364     /* Bird and dragon (ouch!!) */
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     /* Bear and troll */
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     /* Vase */
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   OPEN. special stuff for opening clam/oyster.
00411   The following can be opened without a key:
00412   clam/oyster, door, pdoor, bottle, cask, cage
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    close, shut
00455    the following can be closed without keys:
00456    door, pdoor, bottle, cask, cage
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   Lamp ON.
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   Lamp OFF.
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   WAVE. no effect unless waving rod at fissure.
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         /* Demise of the Wumpus.  Champ must have just crossed bridge */
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   ATTACK, KILL etc.
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   POUR
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             /* If sword is alread oily, don't let him clean it. No
00753                soap. */
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   EAT
00781   If he ate the right thing and is in the right place, move him to
00782   the other place with all his junk.  Otherwise, narky message.
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         /* If he hasn't taken tiny key off shelf, don't let him get it
00828            for free! */
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   DRINK
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     /* UH-OH. He's a wino. Let him reap the rewards of incontinence.
00887        He'll wander around for awhile, then wake up somewhere or other,
00888        having dropped most of his stuff. */
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   THROW etc.
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         /* No indirect object was specified.  If a dwarf is present,
00943            assume it is the object. If not, look for other living
00944            thing. If no living things present, treat 'THROW' as 'DROP'. */
00945 
00946         if (dwarfn)
00947             iobj = DWARF;
00948         else {
00949             /* No dwarves present; figure out pausible object. */
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             /* It is a beastie of some sort.  Is there more than one?
00962                Don't kill the bird by default. */
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     /* If not axe, same as drop... */
00987     if (object != AXE && iobj != TROLL) {
00988         vdrop();
00989         return;
00990     }
00991     /* AXE is THROWN */
00992     msg = 48;
00993     switch (iobj) {
00994     case DRAGON:
00995         if (g.prop[DRAGON] == 0)
00996             msg = 152;
00997         break;
00998     case DWARF:
00999         /* At a dwarf... */
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         /* This'll teach him to throw axe at the bear */
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         /* Or the WUMPUS! */
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         /* Or the nice doggie! */
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         /* Snarf a treasure for the troll */
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         /* Otherwise it is an attack */
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   FIND might be carrying it, or it might be here. else give caveat.
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   FEED
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         /* See if there is anything edible around here. */
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     /* Feed object ot indirect object */
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   FILL. object with iobj
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   READ. Magazine in dwarvish, message we've seen, and ... oyster?
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   BREAK. works for mirror in repository and, of course the
01322   vase and bottle.  Also the sword is more brittle than it appears.
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   WAKE. only use is to disturb the dwarves or the Wumpus.
01381   Other wumpus-wakers link here.
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    YANK. A variant of 'CARRY'.  In general, not a good idea.
01406    At most, it gets the cloak or a couple of snide comments.
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         /* Cloak. big trouble ahead. */
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    WEAR.  Only good for jewels, ruby slippers, cloak & crown.
01433    But he might try the sword.  Anything else is ridiculous.
01434    Another variant of 'CARRY'.
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    HIT. If not punching out telephone, assume attack.
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    ANSWER (telephone). Smartass for anything else.
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    BLOW. Joshua fit de battle of Jericho, and de walls ...
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    DIAL. No effect unless at phone.
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    PLAY.  Only for horn or lyre.
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    PICK/ PICK UP.  Can pick flower & mushrooms,
01626    But must 'PICK UP' everything else.
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    PUT DOWN: equivalent to drop
01642    PUT IN: if liquid, means fill
01643    PUT ON: wear of drop
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         /* PUT ON: wear or put object on iobj */
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             /* PUT DOWN: "drop" */
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 /* turn on/off */
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    GET (no prep): "take"
01699    GET IN: "enter"
01700    GET OUT: "leave"
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    INSERT/PUT IN
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     /* Bird goes into cage and only cage */
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     /* Bar vase & pillow from safe, to force putting down on florr */
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     /* Put batteries in lamp. There is a glitch here, in that if he
01816        tries to get a third set of batteries before the second set has
01817        been inserted, the second set disappears!
01818        ***fix this some time ***
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 /* Remove or take from */
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    lock. chain, grate, chest, elfin door
01892    Here are the current lock/unlock messages & numbers:
01893    31   you have no keys.
01894    32   it has no lock.
01895    34   it's already locked.
01896    35   the grate is now locked.
01897    36   the grate is now unlocked.
01898    37   it was allready unlocked.
01899    55   you can't unlock the keys.
01900    171  The chain is now unlocked.
01901    172  The chain is now locked.
01902    173  There is nothing here to which the chain can be locked.
01903    224  Your keys are all too large.
01904    234  The wrought-iron door is now locked.
01905    235  The tiny door is now locked.
01906    236  The wrought-iron door is now unlocked.
01907    237  The tiny door is now unlocked.
01908    375  You don't have the right key.
01909    333  the chest is now locked.
01910    334  the chest is now unlocked.
01911    367  The safe's door swings shut.
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    UNLOCK. chain, grate, chest, elfin door.
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             /* Elvin door stuff to lock/unlock tiny door w/special key.
02048                the damn thing is really at four places, and we want the
02049                right messages if he only has 'BIG'keys (or no keys).
02050                Also, he can unlock it either while he is big or small. */
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    LOOK.
02094 */
02095 void vlook()
02096 {
02097     int sloc;
02098 
02099     if (object != 0) {
02100         rspeak(confuz());
02101         return;
02102     }
02103     /* Look into something (a container). */
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         /* Look at something. If written, read it. */
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 }

Generated on Fri Apr 14 22:56:39 2006 for minix by  doxygen 1.4.6