Annotation of 43BSDReno/games/larn/object.c, revision 1.1.1.1

1.1       root        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: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.