date and time created 89/03/05 18:59:26 by bostic
authorKeith Bostic <bostic@ucbvax.Berkeley.EDU>
Mon, 6 Mar 1989 10:59:26 +0000 (02:59 -0800)
committerKeith Bostic <bostic@ucbvax.Berkeley.EDU>
Mon, 6 Mar 1989 10:59:26 +0000 (02:59 -0800)
SCCS-vsn: games/larn/moreobj.c 5.1

usr/src/games/larn/moreobj.c [new file with mode: 0644]

diff --git a/usr/src/games/larn/moreobj.c b/usr/src/games/larn/moreobj.c
new file mode 100644 (file)
index 0000000..65f8059
--- /dev/null
@@ -0,0 +1,368 @@
+/* moreobj.c           Larn is copyrighted 1986 by Noah Morgan.
+ *
+ *     Routines in this file:
+ *
+ *     oaltar()
+ *     othrone()
+ *     ochest()
+ *     ofountain()
+ */
+#include "header.h"
+
+/*
+ *     ******
+ *     OALTAR
+ *     ******
+ *
+ *     subroutine to process an altar object
+ */
+oaltar()
+       {
+       unsigned long k;
+
+       lprcat("\nDo you (p) pray  (d) desecrate"); iopts();
+       while (1)
+         {
+         while (1) switch(getchar())
+               {
+               case 'p':       lprcat(" pray\nDo you (m) give money or (j) just pray? ");
+                                       while (1) switch(getchar())
+                                         {
+                                         case 'j':     if (rnd(100)<75) 
+                                                                       lprcat("\nnothing happens");
+                                                               else if (rnd(13)<4) ohear();
+                                                               else if (rnd(43) == 10)
+                                                                       {
+                                                                       if (c[WEAR]) lprcat("\nYou feel your armor vibrate for a moment");
+                                                                       enchantarmor(); return;
+                                                                       }
+                                                               else if (rnd(43) == 10)
+                                                                       {
+                                                                       if (c[WIELD]) lprcat("\nYou feel your weapon vibrate for a moment");
+                                                                       enchweapon(); return;
+                                                                       }
+                                                               else createmonster(makemonst(level+1));
+                                                               return;
+
+                                         case 'm':     lprcat("\n\n");  cursor(1,24);  cltoeoln();
+                                                               cursor(1,23);  cltoeoln();
+                                                               lprcat("how much do you donate? ");
+                                                               k = readnum((long)c[GOLD]);
+                                                               if (c[GOLD]<k)
+                                                                       {
+                                                                       lprcat("\nYou don't have that much!");
+                                                                       return;
+                                                                       }
+                                                               c[GOLD] -= k;
+                                                               if (k < c[GOLD]/10 || k<rnd(50))
+                                                                       { createmonster(makemonst(level+1)); c[AGGRAVATE] += 200; }
+                                                               else if (rnd(101) > 50) { ohear(); return; }
+                                                               else if (rnd(43) == 5)
+                                                                       {
+                                                                       if (c[WEAR]) lprcat("\nYou feel your armor vibrate for a moment");
+                                                                       enchantarmor(); return;
+                                                                       }
+                                                               else if (rnd(43) == 8)
+                                                                       {
+                                                                       if (c[WIELD]) lprcat("\nYou feel your weapon vibrate for a moment");
+                                                                       enchweapon(); return;
+                                                                       }
+                                                               else    lprcat("\nThank You.");
+                                                               bottomline();   return;
+
+                                         case '\33':   return;
+                                         };
+
+               case 'd': lprcat(" desecrate");
+                                 if (rnd(100)<60)
+                                               { createmonster(makemonst(level+2)+8); c[AGGRAVATE] += 2500; }
+                                       else
+                                       if (rnd(101)<30)
+                                               {
+                                               lprcat("\nThe altar crumbles into a pile of dust before your eyes");
+                                               forget();       /*      remember to destroy the altar   */
+                                               }
+                                       else
+                                               lprcat("\nnothing happens");
+                                       return;
+
+               case 'i':
+               case '\33': ignore();
+                                 if (rnd(100)<30)      { createmonster(makemonst(level+1)); c[AGGRAVATE] += rnd(450); }
+                                       else    lprcat("\nnothing happens");
+                                       return;
+               };
+         }
+       }
+
+/*
+       function to cast a +3 protection on the player
+ */
+static ohear()
+       {
+       lprcat("\nYou have been heard!");
+       if (c[ALTPRO]==0) c[MOREDEFENSES]+=3;
+       c[ALTPRO] += 500;       /* protection field */
+       bottomline();
+       }
+
+/*
+       *******
+       OTHRONE
+       *******
+
+       subroutine to process a throne object
+ */
+othrone(arg)
+       int arg;
+       {
+       register int i,k;
+
+       lprcat("\nDo you (p) pry off jewels, (s) sit down"); iopts();
+       while (1)
+         {
+         while (1) switch(getchar())
+               {
+               case 'p':       lprcat(" pry off");  k=rnd(101);
+                                       if (k<25)
+                                               {
+                                               for (i=0; i<rnd(4); i++) creategem(); /* gems pop off the throne */
+                                               item[playerx][playery]=ODEADTHRONE;
+                                               know[playerx][playery]=0;
+                                               }
+                                       else if (k<40 && arg==0)
+                                               {
+                                               createmonster(GNOMEKING);
+                                               item[playerx][playery]=OTHRONE2;
+                                               know[playerx][playery]=0;
+                                               }
+                                       else lprcat("\nnothing happens");
+                                       return;
+
+               case 's':       lprcat(" sit down");  k=rnd(101);
+                                       if (k<30 && arg==0)
+                                               {
+                                               createmonster(GNOMEKING);
+                                               item[playerx][playery]=OTHRONE2;
+                                               know[playerx][playery]=0;
+                                               }
+                                       else if (k<35) { lprcat("\nZaaaappp!  You've been teleported!\n"); beep(); oteleport(0); }
+                                       else lprcat("\nnothing happens");
+                                       return;
+
+               case 'i':
+               case '\33': ignore(); return;
+               };
+         }
+       }
+
+odeadthrone()
+       {
+       register int k;
+
+       lprcat("\nDo you (s) sit down"); iopts();
+       while (1)
+         {
+         while (1) switch(getchar())
+               {
+               case 's':       lprcat(" sit down");  k=rnd(101);
+                                       if (k<35) { lprcat("\nZaaaappp!  You've been teleported!\n"); beep(); oteleport(0); }
+                                       else lprcat("\nnothing happens");
+                                       return;
+
+               case 'i':
+               case '\33': ignore(); return;
+               };
+         }
+       }
+
+/*
+       ******
+       OCHEST
+       ******
+
+       subroutine to process a throne object
+ */
+ochest()
+       {
+       register int i,k;
+       lprcat("\nDo you (t) take it, (o) try to open it"); iopts();
+       while (1)
+         {
+         while (1) switch(getchar())
+               {
+               case 'o':       lprcat(" open it");  k=rnd(101);
+                                       if (k<40)
+                                               {
+                                               lprcat("\nThe chest explodes as you open it"); beep();
+                                               i = rnd(10);  lastnum=281;  /* in case he dies */
+                                               lprintf("\nYou suffer %d hit points damage!",(long)i);
+                                               checkloss(i);
+                                               switch(rnd(10)) /* see if he gets a curse */
+                                                       {
+                                                       case 1: c[ITCHING]+= rnd(1000)+100;
+                                                                       lprcat("\nYou feel an irritation spread over your skin!");
+                                                                       beep();
+                                                                       break;
+
+                                                       case 2: c[CLUMSINESS]+= rnd(1600)+200;
+                                                                       lprcat("\nYou begin to lose hand to eye coordination!");
+                                                                       beep();
+                                                                       break;
+                                                       
+                                                       case 3: c[HALFDAM]+= rnd(1600)+200;
+                                                                       beep();
+                                                                       lprcat("\nA sickness engulfs you!");    break;
+                                                       };
+                                               item[playerx][playery]=know[playerx][playery]=0;
+                                               if (rnd(100)<69) creategem(); /* gems from the chest */
+                                               dropgold(rnd(110*iarg[playerx][playery]+200));
+                                               for (i=0; i<rnd(4); i++) something(iarg[playerx][playery]+2);
+                                               }
+                                       else lprcat("\nnothing happens");
+                                       return;
+
+               case 't':       lprcat(" take");
+                                       if (take(OCHEST,iarg[playerx][playery])==0)
+                                               item[playerx][playery]=know[playerx][playery]=0;
+                                       return;
+
+               case 'i':
+               case '\33': ignore(); return;
+               };
+         }
+       }
+
+/*
+       *********
+       OFOUNTAIN
+       *********
+ */
+
+ofountain()
+       {
+       register int x;
+       cursors();
+       lprcat("\nDo you (d) drink, (w) wash yourself"); iopts();
+       while (1) switch(getchar())
+               {
+               case 'd':       lprcat("drink");
+                                       if (rnd(1501)<2)
+                                               {
+                                               lprcat("\nOops!  You seem to have caught the dreadful sleep!");
+                                               beep(); lflush();  sleep(3);  died(280); return;
+                                               }
+                                       x = rnd(100);
+                                       if (x<7)
+                                               {
+                                               c[HALFDAM] += 200+rnd(200);
+                                               lprcat("\nYou feel a sickness coming on");
+                                               }
+                                       else if (x<13) quaffpotion(23); /* see invisible */
+                                       else if (x < 45)
+                                               lprcat("\nnothing seems to have happened");
+                                       else if (rnd(3) != 2)
+                                               fntchange(1);   /*      change char levels upward       */
+                                       else
+                                               fntchange(-1);  /*      change char levels downward     */
+                                       if (rnd(12)<3)
+                                               {
+                                               lprcat("\nThe fountains bubbling slowly quiets");
+                                               item[playerx][playery]=ODEADFOUNTAIN; /* dead fountain */
+                                               know[playerx][playery]=0;
+                                               }
+                                       return;
+
+               case '\33':
+               case 'i':       ignore();  return;
+
+               case 'w':       lprcat("wash yourself");
+                                       if (rnd(100) < 11)
+                                               {
+                                               x=rnd((level<<2)+2);
+                                               lprintf("\nOh no!  The water was foul!  You suffer %d hit points!",(long)x);
+                                               lastnum=273; losehp(x); bottomline();  cursors();
+                                               }
+                                       else
+                                       if (rnd(100) < 29)
+                                               lprcat("\nYou got the dirt off!");
+                                       else
+                                       if (rnd(100) < 31)
+                                               lprcat("\nThis water seems to be hard water!  The dirt didn't come off!");
+                                       else
+                                       if (rnd(100) < 34)
+                                               createmonster(WATERLORD); /*    make water lord         */
+                                       else
+                                       lprcat("\nnothing seems to have happened");
+                                       return;
+               }
+       }
+
+/*
+       a subroutine to raise or lower character levels
+       if x > 0 they are raised   if x < 0 they are lowered
+ */
+fntchange(how)
+       int how;
+       {
+       register long j;
+       lprc('\n');
+       switch(rnd(9))
+               {
+               case 1: lprcat("Your strength");                fch(how,&c[0]);         break;
+               case 2: lprcat("Your intelligence");    fch(how,&c[1]);         break;
+               case 3: lprcat("Your wisdom");                  fch(how,&c[2]);         break;
+               case 4: lprcat("Your constitution");    fch(how,&c[3]);         break;
+               case 5: lprcat("Your dexterity");               fch(how,&c[4]);         break;
+               case 6: lprcat("Your charm");                   fch(how,&c[5]);         break;
+               case 7: j=rnd(level+1);
+                               if (how < 0)
+                                       { lprintf("You lose %d hit point",(long)j);  if (j>1) lprcat("s!"); else lprc('!'); losemhp((int)j); }
+                               else
+                                       { lprintf("You gain %d hit point",(long)j);  if (j>1) lprcat("s!"); else lprc('!'); raisemhp((int)j); }
+                               bottomline();           break;
+
+               case 8: j=rnd(level+1);
+                               if (how > 0)
+                                       {
+                                       lprintf("You just gained %d spell",(long)j);  raisemspells((int)j);
+                                       if (j>1) lprcat("s!"); else lprc('!');
+                                       }
+                               else
+                                       {
+                                       lprintf("You just lost %d spell",(long)j);      losemspells((int)j);
+                                       if (j>1) lprcat("s!"); else lprc('!');
+                                       }
+                               bottomline();           break;
+
+               case 9: j = 5*rnd((level+1)*(level+1));
+                               if (how < 0)
+                                       {
+                                       lprintf("You just lost %d experience point",(long)j);
+                                       if (j>1) lprcat("s!"); else lprc('!'); loseexperience((long)j);
+                                       }
+                               else
+                                       {
+                                       lprintf("You just gained %d experience point",(long)j);
+                                       if (j>1) lprcat("s!"); else lprc('!'); raiseexperience((long)j);
+                                       }
+                               break;
+               }
+       cursors();
+       }
+
+/*
+       ***
+       FCH
+       ***
+
+       subroutine to process an up/down of a character attribute for ofountain
+ */
+static fch(how,x)
+       int how;
+       long *x;
+       {
+       if (how < 0)     { lprcat(" went down by one!");        --(*x); }
+               else             { lprcat(" went up by one!");  (*x)++; }
+       bottomline();
+       }