home *** CD-ROM | disk | FTP | other *** search
/ rtsi.com / 2014.01.www.rtsi.com.tar / www.rtsi.com / OS9 / TOP / USR / SRC / larn.t.Z / larn.t / object.c < prev    next >
Text File  |  1988-11-13  |  25KB  |  808 lines

  1. /*    object.c        Larn is copyrighted 1986 by Noah Morgan. */
  2. #include "header.h"
  3.  
  4. /*
  5.     ***************
  6.     LOOK_FOR_OBJECT
  7.     ***************
  8.  
  9.     subroutine to look for an object and give the player his options
  10.     if an object was found.
  11.  */
  12. lookforobject()
  13. {
  14. register int i,j;
  15. if (c[TIMESTOP])  return;    /* can't find objects is time is stopped    */
  16. i=item[playerx][playery];    if (i==0) return;
  17. showcell(playerx,playery);  cursors();  yrepcount=0;
  18. switch(i)
  19.     {
  20.     case OGOLDPILE:    case OMAXGOLD:
  21.     case OKGOLD:    case ODGOLD:    lprcat("\n\nYou have found some gold!");    ogold(i);    break;
  22.  
  23.     case OPOTION:    lprcat("\n\nYou have found a magic potion");
  24.                 i = iarg[playerx][playery];
  25.                 if (potionname[i][0]) lprintf(" of %s",&potionname[i][1]);  opotion(i);  break;
  26.  
  27.     case OSCROLL:    lprcat("\n\nYou have found a magic scroll");
  28.                 i = iarg[playerx][playery];
  29.                 if (scrollname[i][0])    lprintf(" of %s",&scrollname[i][1]);
  30.                 oscroll(i);  break;
  31.  
  32.     case OALTAR:    if (nearbymonst()) return;
  33.                     lprcat("\n\nThere is a Holy Altar here!"); oaltar(); break;
  34.  
  35.     case OBOOK:    lprcat("\n\nYou have found a book."); obook(); break;
  36.  
  37.     case OCOOKIE:    lprcat("\n\nYou have found a fortune cookie."); ocookie(); break;
  38.  
  39.     case OTHRONE:    if (nearbymonst()) return;
  40.                     lprintf("\n\nThere is %s here!",objectname[i]); othrone(0); break;
  41.  
  42.     case OTHRONE2:    if (nearbymonst()) return;
  43.                     lprintf("\n\nThere is %s here!",objectname[i]); othrone(1); break;
  44.  
  45.     case ODEADTHRONE: lprintf("\n\nThere is %s here!",objectname[i]); odeadthrone(); break;
  46.  
  47.     case OORB:        lprcat("\n\nYou have found the Orb!!!!!"); oorb(); break;
  48.  
  49.     case OPIT:        lprcat("\n\nYou're standing at the top of a pit."); opit(); break;
  50.  
  51.     case OSTAIRSUP:        lprcat("\n\nThere is a circular staircase here"); ostairs(1);  /* up */ break;
  52.  
  53.     case OELEVATORUP:    lprcat("\n\nYou feel heavy for a moment, but the feeling disappears");
  54.                 oelevator(1);  /*  up  */  break;
  55.  
  56.     case OFOUNTAIN:    if (nearbymonst()) return;
  57.                     lprcat("\n\nThere is a fountain here"); ofountain(); break;
  58.  
  59.     case OSTATUE:    if (nearbymonst()) return;
  60.                     lprcat("\n\nYou are standing in front of a statue"); ostatue(); break;
  61.  
  62.     case OCHEST:    lprcat("\n\nThere is a chest here");  ochest();  break;
  63.  
  64.     case OIVTELETRAP:    if (rnd(11)<6) return;
  65.                         item[playerx][playery] = OTELEPORTER;
  66.                         know[playerx][playery] = 1;
  67.  
  68.     case OTELEPORTER:    lprcat("\nZaaaappp!  You've been teleported!\n");
  69.                         beep(); nap(3000); oteleport(0);
  70.                         break; 
  71.  
  72.     case OSCHOOL:    if (nearbymonst()) return;
  73.                 lprcat("\n\nYou have found the College of Larn.");
  74.                 lprcat("\nDo you (g) go inside, or (i) stay here? ");
  75.                 i=0; while ((i!='g') && (i!='i') && (i!='\33')) i=getchar();
  76.                 if (i == 'g') { oschool();  /*    the college of larn    */ }
  77.                 else    lprcat(" stay here");
  78.                 break;
  79.  
  80.     case OMIRROR:    if (nearbymonst()) return;
  81.                     lprcat("\n\nThere is a mirror here");    omirror();    break;
  82.  
  83.     case OBANK2:
  84.     case OBANK:    if (nearbymonst()) return;
  85.                 if (i==OBANK) lprcat("\n\nYou have found the bank of Larn.");
  86.                 else lprcat("\n\nYou have found a branch office of the bank of Larn.");
  87.                 lprcat("\nDo you (g) go inside, or (i) stay here? ");
  88.                 j=0; while ((j!='g') && (j!='i') && (j!='\33')) j=getchar();
  89.                 if (j == 'g') {  if (i==OBANK) obank(); else obank2(); /*  the bank of larn  */  }
  90.                 else   lprcat(" stay here");
  91.                 break;
  92.  
  93.     case ODEADFOUNTAIN:    if (nearbymonst()) return;
  94.                         lprcat("\n\nThere is a dead fountain here"); break;
  95.  
  96.     case ODNDSTORE:    if (nearbymonst()) return;
  97.                     lprcat("\n\nThere is a DND store here.");
  98.                     lprcat("\nDo you (g) go inside, or (i) stay here? ");
  99.                     i=0; while ((i!='g') && (i!='i') && (i!='\33')) i=getchar();
  100.                     if (i == 'g')
  101.                         dndstore();  /*  the dnd adventurers store  */
  102.                     else  lprcat(" stay here");
  103.                     break;
  104.  
  105.     case OSTAIRSDOWN:    lprcat("\n\nThere is a circular staircase here"); ostairs(-1); /* down */ break;
  106.  
  107.     case OELEVATORDOWN:    lprcat("\n\nYou feel light for a moment, but the feeling disappears");
  108.                 oelevator(-1);    /*    down    */
  109.                 break;
  110.  
  111.     case OOPENDOOR:        lprintf("\n\nYou have found %s",objectname[i]);
  112.                         lprcat("\nDo you (c) close it"); iopts();
  113.                         i=0; while ((i!='c') && (i!='i') && (i!='\33')) i=getchar();
  114.                         if ((i=='\33') || (i=='i')) { ignore();  break; }
  115.                         lprcat("close");  forget();
  116.                         item[playerx][playery]=OCLOSEDDOOR;
  117.                         iarg[playerx][playery]=0;
  118.                         playerx = lastpx;  playery = lastpy;
  119.                         break;
  120.  
  121.     case OCLOSEDDOOR:    lprintf("\n\nYou have found %s",objectname[i]);
  122.                         lprcat("\nDo you (o) try to open it"); iopts();
  123.                         i=0; while ((i!='o') && (i!='i') && (i!='\33')) i=getchar();
  124.                         if ((i=='\33') || (i=='i'))
  125.                             { ignore();  playerx = lastpx;
  126.                             playery = lastpy; break; }
  127.                         else
  128.                         {
  129.                         lprcat("open");
  130.                         if (rnd(11)<7)
  131.                           {
  132.                           switch(iarg[playerx][playery])
  133.                             {
  134.                             case 6: c[AGGRAVATE] += rnd(400);    break;
  135.  
  136.                             case 7:    lprcat("\nYou are jolted by an electric shock "); 
  137.                                     lastnum=274; losehp(rnd(20));  bottomline();  break;
  138.  
  139.                             case 8:    loselevel();  break;
  140.  
  141.                             case 9:    lprcat("\nYou suddenly feel weaker ");
  142.                                     if (c[STRENGTH]>3) c[STRENGTH]--;
  143.                                     bottomline();  break;
  144.  
  145.                             default:    break;
  146.                             }
  147.                           playerx = lastpx;  playery = lastpy;
  148.                           }
  149.                         else
  150.                           {
  151.                           forget();  item[playerx][playery]=OOPENDOOR;
  152.                           }
  153.                         }
  154.                         break;
  155.  
  156.     case OENTRANCE:    lprcat("\nYou have found "); lprcat(objectname[OENTRANCE]);
  157.                     lprcat("\nDo you (g) go inside"); iopts();
  158.                     i=0; while ((i!='g') && (i!='i') && (i!='\33')) i=getchar();
  159.                     if (i == 'g')
  160.                         {
  161.                         newcavelevel(1); playerx=33; playery=MAXY-2;
  162.                         item[33][MAXY-1]=know[33][MAXY-1]=mitem[33][MAXY-1]=0;
  163.                         draws(0,MAXX,0,MAXY); bot_linex(); return;
  164.                         }
  165.                     else   ignore();
  166.                     break;
  167.  
  168.     case OVOLDOWN:    lprcat("\nYou have found "); lprcat(objectname[OVOLDOWN]);
  169.                         lprcat("\nDo you (c) climb down"); iopts();
  170.                         i=0; while ((i!='c') && (i!='i') && (i!='\33')) i=getchar();
  171.                         if ((i=='\33') || (i=='i')) { ignore();  break; }
  172.                     if (level!=0) { lprcat("\nThe shaft only extends 5 feet downward!"); return; }
  173.                     if (packweight() > 45+3*(c[STRENGTH]+c[STREXTRA])) { lprcat("\nYou slip and fall down the shaft"); beep();
  174.                                               lastnum=275;  losehp(30+rnd(20)); bottomhp(); }
  175.                     
  176.                     else lprcat("climb down");  nap(3000);  newcavelevel(MAXLEVEL);
  177.                     for (i=0; i<MAXY; i++)  for (j=0; j<MAXX; j++) /* put player near volcano shaft */
  178.                         if (item[j][i]==OVOLUP) { playerx=j; playery=i; j=MAXX; i=MAXY; positionplayer(); }
  179.                     draws(0,MAXX,0,MAXY); bot_linex(); return;
  180.  
  181.     case OVOLUP:    lprcat("\nYou have found "); lprcat(objectname[OVOLUP]);
  182.                         lprcat("\nDo you (c) climb up"); iopts();
  183.                         i=0; while ((i!='c') && (i!='i') && (i!='\33')) i=getchar();
  184.                         if ((i=='\33') || (i=='i')) { ignore();  break; }
  185.                     if (level!=11) { lprcat("\nThe shaft only extends 8 feet upwards before you find a blockage!"); return; }
  186.                     if (packweight() > 45+5*(c[STRENGTH]+c[STREXTRA])) { lprcat("\nYou slip and fall down the shaft"); beep();
  187.                                               lastnum=275; losehp(15+rnd(20)); bottomhp(); return; }
  188.                     lprcat("climb up"); lflush(); nap(3000); newcavelevel(0);
  189.                     for (i=0; i<MAXY; i++)  for (j=0; j<MAXX; j++) /* put player near volcano shaft */
  190.                         if (item[j][i]==OVOLDOWN) { playerx=j; playery=i; j=MAXX; i=MAXY; positionplayer(); }
  191.                     draws(0,MAXX,0,MAXY); bot_linex(); return;
  192.  
  193.     case OTRAPARROWIV:    if (rnd(17)<13) return;    /* for an arrow trap */
  194.                         item[playerx][playery] = OTRAPARROW;
  195.                         know[playerx][playery] = 0;
  196.  
  197.     case OTRAPARROW:    lprcat("\nYou are hit by an arrow"); beep();    /* for an arrow trap */
  198.                         lastnum=259;    losehp(rnd(10)+level);
  199.                         bottomhp();    return;
  200.  
  201.     case OIVDARTRAP:    if (rnd(17)<13) return;        /* for a dart trap */
  202.                         item[playerx][playery] = ODARTRAP;
  203.                         know[playerx][playery] = 0;
  204.  
  205.     case ODARTRAP:        lprcat("\nYou are hit by a dart"); beep();    /* for a dart trap */
  206.                         lastnum=260;    losehp(rnd(5));
  207.                         if ((--c[STRENGTH]) < 3) c[STRENGTH] = 3;
  208.                         bottomline();    return;
  209.  
  210.     case OIVTRAPDOOR:    if (rnd(17)<13) return;        /* for a trap door */
  211.                         item[playerx][playery] = OTRAPDOOR;
  212.                         know[playerx][playery] = 1;
  213.  
  214.     case OTRAPDOOR:        lastnum = 272; /* a trap door */
  215.                         if ((level==MAXLEVEL-1) || (level==MAXLEVEL+MAXVLEVEL-1))
  216.                             { lprcat("\nYou fell through a bottomless trap door!"); beep();  nap(3000);  died(271); }
  217.                         lprcat("\nYou fall through a trap door!"); beep();    /* for a trap door */
  218.                         losehp(rnd(5+level));
  219.                         nap(2000);  newcavelevel(level+1);  draws(0,MAXX,0,MAXY); bot_linex();
  220.                         return;
  221.  
  222.  
  223.     case OTRADEPOST:    if (nearbymonst()) return;
  224.                 lprcat("\nYou have found the Larn trading Post.");
  225.                 lprcat("\nDo you (g) go inside, or (i) stay here? ");
  226.                 i=0; while ((i!='g') && (i!='i') && (i!='\33')) i=getchar();
  227.                 if (i == 'g')  otradepost();  else  lprcat("stay here");
  228.                 return;
  229.  
  230.     case OHOME:    if (nearbymonst()) return;
  231.                 lprcat("\nYou have found your way home.");
  232.                 lprcat("\nDo you (g) go inside, or (i) stay here? ");
  233.                 i=0; while ((i!='g') && (i!='i') && (i!='\33')) i=getchar();
  234.                 if (i == 'g')  ohome();  else  lprcat("stay here");
  235.                 return;
  236.  
  237.     case OWALL:    break;
  238.  
  239.     case OANNIHILATION:    died(283); return;     /* annihilated by sphere of annihilation */
  240.  
  241.     case OLRS:    if (nearbymonst()) return;
  242.                 lprcat("\n\nThere is an LRS office here.");
  243.                 lprcat("\nDo you (g) go inside, or (i) stay here? ");
  244.                 i=0; while ((i!='g') && (i!='i') && (i!='\33')) i=getchar();
  245.                 if (i == 'g')
  246.                     olrs();  /*  the larn revenue service */
  247.                 else  lprcat(" stay here");
  248.                 break;
  249.  
  250.     default:    finditem(i); break;
  251.     };
  252. }
  253.  
  254. /*
  255.     function to say what object we found and ask if player wants to take it
  256.  */
  257. finditem(itm)
  258.     int itm;
  259.     {
  260.     int tmp,i;
  261.     lprintf("\n\nYou have found %s ",objectname[itm]);
  262.     tmp=iarg[playerx][playery];
  263.     switch(itm)
  264.         {
  265.         case ODIAMOND:        case ORUBY:            case OEMERALD:
  266.         case OSAPPHIRE:        case OSPIRITSCARAB:    case OORBOFDRAGON:
  267.         case OCUBEofUNDEAD:    case ONOTHEFT:    break;
  268.  
  269.         default:
  270.         if (tmp>0) lprintf("+ %d",(long)tmp); else if (tmp<0) lprintf(" %d",(long)tmp);
  271.         }
  272.     lprcat("\nDo you want to (t) take it"); iopts();
  273.     i=0; while (i!='t' && i!='i' && i!='\33') i=getchar();
  274.     if (i == 't')
  275.         {    lprcat("take");  if (take(itm,tmp)==0)  forget();    return;    }
  276.     ignore();
  277.     }
  278.  
  279.  
  280. /*
  281.     *******
  282.     OSTAIRS
  283.     *******
  284.  
  285.     subroutine to process the stair cases
  286.     if dir > 0 the up else down
  287.  */
  288. ostairs(dir)
  289.     int dir;
  290.     {
  291.     register int k;
  292.     lprcat("\nDo you (s) stay here  ");
  293.     if (dir > 0)    lprcat("(u) go up  ");    else    lprcat("(d) go down  ");
  294.     lprcat("or (f) kick stairs? ");
  295.  
  296.     while (1) switch(getchar())
  297.         {
  298.         case '\33':
  299.         case 's':    case 'i':    lprcat("stay here");    return;
  300.  
  301.         case 'f':    lprcat("kick stairs");
  302.                     if (rnd(2) == 1)
  303.                         lprcat("\nI hope you feel better.  Showing anger rids you of frustration.");
  304.                     else
  305.                         {
  306.                         k=rnd((level+1)<<1);
  307.                         lprintf("\nYou hurt your foot dumb dumb!  You suffer %d hit points",(long)k);
  308.                         lastnum=276;  losehp(k);  bottomline();
  309.                         }
  310.                     return;
  311.  
  312.         case 'u':    lprcat("go up");
  313.                     if (dir < 0)    lprcat("\nThe stairs don't go up!");
  314.                     else
  315.                       if (level>=2 && level!=11)
  316.                         {
  317.                         k = level;  newcavelevel(level-1);
  318.                         draws(0,MAXX,0,MAXY); bot_linex();
  319.                         }
  320.                       else lprcat("\nThe stairs lead to a dead end!");
  321.                     return;
  322.  
  323.         case 'd':    lprcat("go down");
  324.                     if (dir > 0)    lprcat("\nThe stairs don't go down!");
  325.                     else
  326.                       if (level!=0 && level!=10 && level!=13)
  327.                         {
  328.                         k = level;  newcavelevel(level+1);
  329.                         draws(0,MAXX,0,MAXY); bot_linex();
  330.                         }
  331.                       else lprcat("\nThe stairs lead to a dead end!");
  332.                     return;
  333.         };
  334.     }
  335.  
  336.  
  337. /*
  338.     *********
  339.     OTELEPORTER
  340.     *********
  341.  
  342.     subroutine to handle a teleport trap +/- 1 level maximum
  343.  */
  344. oteleport(err)
  345.     int err;
  346.     {
  347.     register int tmp;
  348.     if (err) if (rnd(151)<3)  died(264);  /*    stuck in a rock */
  349.     c[TELEFLAG]=1;    /*    show ?? on bottomline if been teleported    */
  350.     if (level==0) tmp=0;
  351.     else if (level < MAXLEVEL)
  352.         { tmp=rnd(5)+level-3; if (tmp>=MAXLEVEL) tmp=MAXLEVEL-1;
  353.             if (tmp<1) tmp=1; }
  354.     else
  355.         { tmp=rnd(3)+level-2; if (tmp>=MAXLEVEL+MAXVLEVEL) tmp=MAXLEVEL+MAXVLEVEL-1;
  356.             if (tmp<MAXLEVEL) tmp=MAXLEVEL; }
  357.     playerx = rnd(MAXX-2);    playery = rnd(MAXY-2);
  358.     if (level != tmp)    newcavelevel(tmp);  positionplayer();
  359.     draws(0,MAXX,0,MAXY); bot_linex();
  360.     }
  361.  
  362. /*
  363.     *******
  364.     OPOTION
  365.     *******
  366.  
  367.     function to process a potion
  368.  */
  369. opotion(pot)
  370.     int pot;
  371.     {
  372.     lprcat("\nDo you (d) drink it, (t) take it"); iopts();
  373.     while (1) switch(getchar())
  374.         {
  375.         case '\33':
  376.         case 'i':    ignore();  return;
  377.  
  378.         case 'd':    lprcat("drink\n");    forget();    /*    destroy potion    */
  379.                     quaffpotion(pot);        return;
  380.  
  381.         case 't':    lprcat("take\n");    if (take(OPOTION,pot)==0)  forget();
  382.                     return;
  383.         };
  384.     }
  385.         
  386. /*
  387.     function to drink a potion
  388.  */
  389. quaffpotion(pot)
  390.     int pot;
  391.     {
  392.     register int i,j,k;
  393.     if (pot<0 || pot>=MAXPOTION) return; /* check for within bounds */
  394.     potionname[pot][0] = ' ';
  395.     switch(pot)
  396.         {
  397.         case 9: lprcat("\nYou feel greedy . . .");   nap(2000);
  398.                 for (i=0; i<MAXY; i++)  for (j=0; j<MAXX; j++)
  399.                   if ((item[j][i]==OGOLDPILE) || (item[j][i]==OMAXGOLD))
  400.                     {
  401.                     know[j][i]=1; show1cell(j,i);
  402.                     }
  403.                 showplayer();  return;
  404.  
  405.         case 19: lprcat("\nYou feel greedy . . .");   nap(2000);
  406.                 for (i=0; i<MAXY; i++)  for (j=0; j<MAXX; j++)
  407.                     {
  408.                     k=item[j][i];
  409.                     if ((k==ODIAMOND) || (k==ORUBY) || (k==OEMERALD) || (k==OMAXGOLD)
  410.                          || (k==OSAPPHIRE) || (k==OLARNEYE) || (k==OGOLDPILE))
  411.                          {
  412.                          know[j][i]=1; show1cell(j,i);
  413.                          }
  414.                     }
  415.                 showplayer();  return;
  416.  
  417.         case 20: c[HP] = c[HPMAX]; break;    /* instant healing */
  418.  
  419.         case 1:    lprcat("\nYou feel better");
  420.                 if (c[HP] == c[HPMAX])  raisemhp(1);
  421.                 else if ((c[HP] += rnd(20)+20+c[LEVEL]) > c[HPMAX]) c[HP]=c[HPMAX];  break;
  422.  
  423.         case 2:    lprcat("\nSuddenly, you feel much more skillful!");
  424.                 raiselevel();  raisemhp(1); return;
  425.  
  426.         case 3:    lprcat("\nYou feel strange for a moment"); 
  427.                 c[rund(6)]++;  break;
  428.  
  429.         case 4:    lprcat("\nYou feel more self confident!");
  430.                 c[WISDOM] += rnd(2);  break;
  431.  
  432.         case 5:    lprcat("\nWow!  You feel great!");
  433.                 if (c[STRENGTH]<12) c[STRENGTH]=12; else c[STRENGTH]++;  break;
  434.  
  435.         case 6:    lprcat("\nYour charm went up by one!");  c[CHARISMA]++;  break;
  436.  
  437.         case 8:    lprcat("\nYour intelligence went up by one!");
  438.                 c[INTELLIGENCE]++;  break;
  439.  
  440.         case 10: for (i=0; i<MAXY; i++)  for (j=0; j<MAXX; j++)
  441.                    if (mitem[j][i])
  442.                     {
  443.                     know[j][i]=1; show1cell(j,i);
  444.                     }
  445.                  /*    monster detection    */  return;
  446.  
  447.         case 12: lprcat("\nThis potion has no taste to it");  return;
  448.  
  449.         case 15: lprcat("\nWOW!!!  You feel Super-fantastic!!!");
  450.                  if (c[HERO]==0) for (i=0; i<6; i++) c[i] += 11;
  451.                     c[HERO] += 250;  break;
  452.  
  453.         case 16: lprcat("\nYou have a greater intestinal constitude!");
  454.                  c[CONSTITUTION]++;  break;
  455.  
  456.         case 17: lprcat("\nYou now have incredibly bulging muscles!!!");
  457.                  if (c[GIANTSTR]==0) c[STREXTRA] += 21;
  458.                  c[GIANTSTR] += 700;  break;
  459.  
  460.         case 18: lprcat("\nYou feel a chill run up your spine!");
  461.                  c[FIRERESISTANCE] += 1000;  break;
  462.  
  463.         case 0:    lprcat("\nYou fall asleep. . .");
  464.                 i=rnd(11)-(c[CONSTITUTION]>>2)+2;  while(--i>0) { parse2();  nap(1000); }
  465.                 cursors();  lprcat("\nYou woke up!");  return;
  466.  
  467.         case 7:    lprcat("\nYou become dizzy!");
  468.                 if (--c[STRENGTH] < 3) c[STRENGTH]=3;  break;
  469.  
  470.         case 11: lprcat("\nYou stagger for a moment . .");
  471.                  for (i=0; i<MAXY; i++)  for (j=0; j<MAXX; j++)
  472.                     know[j][i]=0;
  473.                  nap(2000);    draws(0,MAXX,0,MAXY); /* potion of forgetfulness */  return;
  474.  
  475.         case 13: lprcat("\nYou can't see anything!");  /* blindness */
  476.                  c[BLINDCOUNT]+=500;  return;
  477.  
  478.         case 14: lprcat("\nYou feel confused"); c[CONFUSE]+= 20+rnd(9); return;
  479.  
  480.         case 21: lprcat("\nYou don't seem to be affected");  return; /* cure dianthroritis */
  481.  
  482.         case 22: lprcat("\nYou feel a sickness engulf you"); /* poison */
  483.                  c[HALFDAM] += 200 + rnd(200);  return;
  484.  
  485.         case 23: lprcat("\nYou feel your vision sharpen");    /* see invisible */
  486.                  c[SEEINVISIBLE] += rnd(1000)+400;
  487.                  monstnamelist[INVISIBLESTALKER] = 'I';  return;
  488.         };
  489.     bottomline();        /*    show new stats        */  return;
  490.     }
  491.  
  492. /*
  493.     *******
  494.     OSCROLL
  495.     *******
  496.  
  497.     function to process a magic scroll
  498.  */
  499. oscroll(typ)
  500.     int typ;
  501.     {
  502.     lprcat("\nDo you ");
  503.     if (c[BLINDCOUNT]==0) lprcat("(r) read it, "); lprcat("(t) take it"); iopts();
  504.     while (1) switch(getchar())
  505.         {
  506.         case '\33':
  507.         case 'i':    ignore();  return;
  508.  
  509.         case 'r':    if (c[BLINDCOUNT]) break;
  510.                     lprcat("read"); forget();
  511.                     if (typ==2 || typ==15)  { show1cell(playerx,playery); cursors(); }
  512.                     /*    destroy it    */    read_scroll(typ);  return;
  513.  
  514.         case 't':    lprcat("take"); if (take(OSCROLL,typ)==0)    forget();    /*    destroy it    */
  515.                     return;
  516.         };
  517.     }
  518.  
  519. /*
  520.     data for the function to read a scroll
  521.  */
  522. static int xh,yh,yl,xl;
  523. static char curse[] = { BLINDCOUNT, CONFUSE, AGGRAVATE, HASTEMONST, ITCHING,
  524.     LAUGHING, DRAINSTRENGTH, CLUMSINESS, INFEEBLEMENT, HALFDAM };
  525. static char exten[] = { PROTECTIONTIME, DEXCOUNT, STRCOUNT, CHARMCOUNT,
  526.     INVISIBILITY, CANCELLATION, HASTESELF, GLOBE, SCAREMONST, HOLDMONST, TIMESTOP };
  527. char time_change[] = { HASTESELF,HERO,ALTPRO,PROTECTIONTIME,DEXCOUNT,
  528.     STRCOUNT,GIANTSTR,CHARMCOUNT,INVISIBILITY,CANCELLATION,
  529.     HASTESELF,AGGRAVATE,SCAREMONST,STEALTH,AWARENESS,HOLDMONST,HASTEMONST,
  530.     FIRERESISTANCE,GLOBE,SPIRITPRO,UNDEADPRO,HALFDAM,SEEINVISIBLE,
  531.     ITCHING,CLUMSINESS, WTW };
  532. /*
  533.  *    function to adjust time when time warping and taking courses in school
  534.  */
  535. adjtime(tim)
  536.     register long tim;
  537.     {
  538.     register int j;
  539.     for (j=0; j<26; j++)    /* adjust time related parameters */
  540.         if (c[time_change[j]])
  541.             if ((c[time_change[j]] -= tim) < 1) c[time_change[j]]=1;
  542.     regen();
  543.     }
  544.  
  545. /*
  546.     function to read a scroll
  547.  */
  548. read_scroll(typ)
  549.     int typ;
  550.     {
  551.     register int i,j;
  552.     if (typ<0 || typ>=MAXSCROLL) return;  /* be sure we are within bounds */
  553.     scrollname[typ][0] = ' ';
  554.     switch(typ)
  555.       {
  556.       case 0:    lprcat("\nYour armor glows for a moment");  enchantarmor(); return;
  557.  
  558.       case 1:    lprcat("\nYour weapon glows for a moment"); enchweapon(); return;  /* enchant weapon */
  559.  
  560.       case 2:    lprcat("\nYou have been granted enlightenment!");
  561.                 yh = min(playery+7,MAXY);    xh = min(playerx+25,MAXX);
  562.                 yl = max(playery-7,0);        xl = max(playerx-25,0);
  563.                 for (i=yl; i<yh; i++) for (j=xl; j<xh; j++)  know[j][i]=1;
  564.                 nap(2000);    draws(xl,xh,yl,yh);    return;
  565.  
  566.       case 3:    lprcat("\nThis scroll seems to be blank");    return;
  567.  
  568.       case 4:    createmonster(makemonst(level+1));  return;  /*  this one creates a monster  */
  569.  
  570.       case 5:    something(level);    /*    create artifact        */  return;
  571.  
  572.       case 6:    c[AGGRAVATE]+=800; return; /* aggravate monsters */
  573.  
  574.       case 7:    gtime += (i = rnd(1000) - 850); /* time warp */ 
  575.                 if (i>=0) lprintf("\nYou went forward in time by %d mobuls",(long)((i+99)/100));
  576.                 else lprintf("\nYou went backward in time by %d mobuls",(long)(-(i+99)/100));
  577.                 adjtime((long)i);    /* adjust time for time warping */
  578.                 return;
  579.  
  580.       case 8:    oteleport(0);      return;    /*    teleportation */
  581.  
  582.       case 9:    c[AWARENESS] += 1800;  return;    /* expanded awareness    */
  583.  
  584.       case 10:    c[HASTEMONST] += rnd(55)+12; return;    /* haste monster */
  585.  
  586.       case 11:    for (i=0; i<MAXY; i++)  for (j=0; j<MAXX; j++)
  587.                     if (mitem[j][i])
  588.                         hitp[j][i] = monster[mitem[j][i]].hitpoints;
  589.                 return;    /* monster healing */
  590.       case 12:    c[SPIRITPRO] += 300 + rnd(200); bottomline(); return; /* spirit protection */
  591.  
  592.       case 13:    c[UNDEADPRO] += 300 + rnd(200); bottomline(); return; /* undead protection */
  593.  
  594.       case 14:    c[STEALTH] += 250 + rnd(250);  bottomline(); return; /* stealth */
  595.  
  596.       case 15:    lprcat("\nYou have been granted enlightenment!"); /* magic mapping */
  597.                 for (i=0; i<MAXY; i++) for (j=0; j<MAXX; j++)  know[j][i]=1;
  598.                 nap(2000);    draws(0,MAXX,0,MAXY);    return;
  599.  
  600.       case 16:    c[HOLDMONST] += 30; bottomline(); return; /* hold monster */
  601.  
  602.       case 17:    for (i=0; i<26; i++)    /* gem perfection */
  603.                     switch(iven[i])
  604.                         {
  605.                         case ODIAMOND:    case ORUBY:
  606.                         case OEMERALD:    case OSAPPHIRE:
  607.                             j = ivenarg[i];  j &= 255;  j <<= 1;
  608.                             if (j  > 255) j=255; /* double value */
  609.                             ivenarg[i] = j;    break;
  610.                         }
  611.                 break;
  612.  
  613.       case 18:    for (i=0; i<11; i++)    c[exten[i]] <<= 1; /* spell extension */
  614.                 break;
  615.  
  616.       case 19:    for (i=0; i<26; i++)    /* identify */
  617.                     {
  618.                     if (iven[i]==OPOTION)  potionname[ivenarg[i]][0] = ' ';
  619.                     if (iven[i]==OSCROLL)  scrollname[ivenarg[i]][0] = ' ';
  620.                     }
  621.                 break;
  622.  
  623.       case 20:    for (i=0; i<10; i++)    /* remove curse */
  624.                     if (c[curse[i]]) c[curse[i]] = 1;
  625.                 break;
  626.  
  627.       case 21:    annihilate();    break;    /* scroll of annihilation */
  628.  
  629.       case 22:    godirect(22,150,"The ray hits the %s",0,' ');    /* pulverization */
  630.                 break;
  631.       case 23:  c[LIFEPROT]++;  break; /* life protection */
  632.       };
  633.     }
  634.  
  635.  
  636. oorb()
  637.     {
  638.     }
  639.  
  640. opit()
  641.     {
  642.     register int i;
  643.     if (rnd(101)<81)
  644.       if (rnd(70) > 9*c[DEXTERITY]-packweight() || rnd(101)<5)
  645.         if (level==MAXLEVEL-1) obottomless(); else
  646.         if (level==MAXLEVEL+MAXVLEVEL-1) obottomless(); else
  647.             {
  648.             if (rnd(101)<20)
  649.                 {
  650.                 i=0; lprcat("\nYou fell into a pit!  Your fall is cushioned by an unknown force\n");
  651.                 }
  652.             else
  653.                 {
  654.                 i = rnd(level*3+3);
  655.                 lprintf("\nYou fell into a pit!  You suffer %d hit points damage",(long)i);
  656.                 lastnum=261;     /*    if he dies scoreboard will say so */
  657.                 }
  658.             losehp(i); nap(2000);  newcavelevel(level+1);  draws(0,MAXX,0,MAXY);
  659.             }
  660.     }
  661.  
  662. obottomless()
  663.     {
  664.     lprcat("\nYou fell into a bottomless pit!");  beep(); nap(3000);  died(262);
  665.     }
  666. oelevator(dir)
  667.     int dir;
  668.     {
  669. #ifdef lint
  670.     int x;
  671.     x=dir;
  672.     dir=x;
  673. #endif lint
  674.     }
  675.  
  676. ostatue()
  677.     {
  678.     }
  679.  
  680. omirror()
  681.     {
  682.     }
  683.  
  684. obook()
  685.     {
  686.     lprcat("\nDo you ");
  687.     if (c[BLINDCOUNT]==0) lprcat("(r) read it, "); lprcat("(t) take it"); iopts();
  688.     while (1) switch(getchar())
  689.         {
  690.         case '\33':
  691.         case 'i':    ignore();    return;
  692.  
  693.         case 'r':    if (c[BLINDCOUNT]) break;
  694.                     lprcat("read");
  695.                     /* no more book    */    readbook(iarg[playerx][playery]);  forget(); return;
  696.  
  697.         case 't':    lprcat("take");  if (take(OBOOK,iarg[playerx][playery])==0)  forget();    /* no more book    */
  698.                     return;
  699.         };
  700.     }
  701.  
  702. /*
  703.     function to read a book
  704.  */
  705. readbook(lev)
  706.     register int lev;
  707.     {
  708.     register int i,tmp;
  709.     if (lev<=3) i = rund((tmp=splev[lev])?tmp:1); else
  710.         i = rnd((tmp=splev[lev]-9)?tmp:1) + 9;
  711.     spelknow[i]=1;
  712.     lprintf("\nSpell \"%s\":  %s\n%s",spelcode[i],spelname[i],speldescript[i]);
  713.     if (rnd(10)==4)
  714.      { lprcat("\nYour int went up by one!"); c[INTELLIGENCE]++; bottomline(); }
  715.     }
  716.  
  717. ocookie()
  718.     {
  719.     char *p;
  720.     lprcat("\nDo you (e) eat it, (t) take it"); iopts();
  721.     while (1) switch(getchar())
  722.         {
  723.         case '\33':
  724.         case 'i':    ignore();    return;
  725.  
  726.         case 'e':    lprcat("eat\nThe cookie tasted good.");
  727.                     forget(); /* no more cookie    */
  728.                     if (c[BLINDCOUNT]) return;
  729.                     if (!(p=fortune(fortfile))) return;
  730.                     lprcat("  A message inside the cookie reads:\n"); lprcat(p);
  731.                     return;
  732.  
  733.         case 't':    lprcat("take");  if (take(OCOOKIE,0)==0) forget();    /* no more book    */
  734.                     return;
  735.         };
  736.     }
  737.  
  738.  
  739. /* routine to pick up some gold -- if arg==OMAXGOLD then the pile is worth 100* the argument */
  740. ogold(arg)
  741.     int arg;
  742.     {
  743.     register long i;
  744.     i = iarg[playerx][playery];
  745.     if (arg==OMAXGOLD) i *= 100;
  746.         else if (arg==OKGOLD) i *= 1000;
  747.             else if (arg==ODGOLD) i *= 10;
  748.     lprintf("\nIt is worth %d!",(long)i);    c[GOLD] += i;  bottomgold();
  749.     item[playerx][playery] = know[playerx][playery] = 0; /*    destroy gold    */
  750.     }
  751.  
  752. ohome()
  753.     {
  754.     register int i;
  755.     nosignal = 1;    /* disable signals */
  756.     for (i=0; i<26; i++) if (iven[i]==OPOTION) if (ivenarg[i]==21)
  757.         {
  758.         iven[i]=0;    /* remove the potion of cure dianthroritis from inventory */
  759.         clear(); lprcat("Congratulations.  You found a potion of cure dianthroritis.\n");
  760.         lprcat("\nFrankly, No one thought you could do it.  Boy!  Did you surprise them!\n");
  761.         if (gtime>TIMELIMIT)
  762.             {
  763.             lprcat("\nThe doctor has the sad duty to inform you that your daughter died!\n");
  764.             lprcat("You didn't make it in time.  In your agony, you kill the doctor,\nyour wife, and yourself!  Too bad!\n");
  765.             nap(5000); died(269);
  766.             }
  767.         else
  768.             {
  769.             lprcat("\nThe doctor is now administering the potion, and in a few moments\n");
  770.             lprcat("Your daughter should be well on her way to recovery.\n");
  771.             nap(6000);
  772.             lprcat("\nThe potion is"); nap(3000); lprcat(" working!  The doctor thinks that\n");
  773.             lprcat("your daughter will recover in a few days.  Congratulations!\n");
  774.             beep(); nap(5000); died(263);
  775.             }
  776.         }
  777.  
  778.     while (1)
  779.         {
  780.         clear(); lprintf("Welcome home %s.  Latest word from the doctor is not good.\n",logname);
  781.  
  782.         if (gtime>TIMELIMIT)
  783.             {
  784.             lprcat("\nThe doctor has the sad duty to inform you that your daughter died!\n");
  785.             lprcat("You didn't make it in time.  In your agony, you kill the doctor,\nyour wife, and yourself!  Too bad!\n");
  786.             nap(5000); died(269);
  787.             }
  788.  
  789.         lprcat("\nThe diagnosis is confirmed as dianthroritis.  He guesses that\n");
  790.         lprintf("your daughter has only %d mobuls left in this world.  It's up to you,\n",(long)((TIMELIMIT-gtime+99)/100));
  791.         lprintf("%s, to find the only hope for your daughter, the very rare\n",logname);
  792.         lprcat("potion of cure dianthroritis.  It is rumored that only deep in the\n");
  793.         lprcat("depths of the caves can this potion be found.\n\n\n");
  794.         lprcat("\n     ----- press "); standout("return");
  795.         lprcat(" to continue, "); standout("escape");
  796.         lprcat(" to leave ----- ");
  797.         i=getchar();  while (i!='\33' && i!='\n') i=getchar();
  798.         if (i=='\33') { drawscreen(); nosignal = 0; /* enable signals */ return; }
  799.         }
  800.     }
  801.  
  802. /*    routine to save program space    */
  803. iopts()
  804.     {    lprcat(", or (i) ignore it? ");    }
  805. ignore()
  806.     {    lprcat("ignore\n");    }
  807.  
  808.