/* $OpenBSD: moreobj.c,v 1.4 2002/02/16 21:27:10 millert Exp $ */ /* $NetBSD: moreobj.c,v 1.4 1997/10/18 20:03:32 christos Exp $ */ /* * moreobj.c Larn is copyrighted 1986 by Noah Morgan. * * Routines in this file: * * oaltar() othrone() ochest() ofountain() */ #ifndef lint static char rcsid[] = "$OpenBSD: moreobj.c,v 1.4 2002/02/16 21:27:10 millert Exp $"; #endif /* not lint */ #include #include #include #include "header.h" #include "extern.h" static void ohear(int); static void fch(int, long *); /* * ****** * OALTAR * ****** * * subroutine to process an altar object */ void oaltar() { unsigned long k; lprcat("\nDo you (p) pray (d) desecrate"); iopts(); while (1) { while (1) switch (lgetchar()) { case 'p': lprcat(" pray\nDo you (m) give money or (j) just pray? "); while (1) switch (lgetchar()) { case 'j': if (rnd(100) < 75) lprcat("\nnothing happens"); else if (rnd(13) < 4) ohear(1); 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("You 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(0); return; } else if (rnd(43) == 5) { if (c[WEAR]) lprcat("You feel your armor vibrate for a moment"); enchantarmor(); return; } else if (rnd(43) == 8) { if (c[WIELD]) lprcat("You feel your weapon vibrate for a moment"); enchweapon(); return; } else lprcat("Thank 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 void ohear(do_newline) int do_newline; { if (do_newline) lprcat("\nYou have been heard!"); else lprcat("You have been heard!"); if (c[ALTPRO] == 0) c[MOREDEFENSES] += 3; c[ALTPRO] += 500; /* protection field */ bottomline(); } /* * ******* * OTHRONE * ******* * * subroutine to process a throne object */ void othrone(arg) int arg; { int i, k; lprcat("\nDo you (p) pry off jewels, (s) sit down"); iopts(); while (1) { while (1) switch (lgetchar()) { 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"); lbeep(); oteleport(0); } else lprcat("\nnothing happens"); return; case 'i': case '\33': ignore(); return; }; } } void odeadthrone() { int k; lprcat("\nDo you (s) sit down"); iopts(); while (1) { while (1) switch (lgetchar()) { case 's': lprcat(" sit down"); k = rnd(101); if (k < 35) { lprcat("\nZaaaappp! You've been teleported!\n"); lbeep(); oteleport(0); } else lprcat("\nnothing happens"); return; case 'i': case '\33': ignore(); return; }; } } /* * ****** * OCHEST * ****** * * subroutine to process a throne object */ void ochest() { int i, k; lprcat("\nDo you (t) take it, (o) try to open it"); iopts(); while (1) { while (1) switch (lgetchar()) { case 'o': lprcat(" open it"); k = rnd(101); if (k < 40) { lprcat("\nThe chest explodes as you open it"); lbeep(); 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!"); lbeep(); break; case 2: c[CLUMSINESS] += rnd(1600) + 200; lprcat("\nYou begin to lose hand to eye coordination!"); lbeep(); break; case 3: c[HALFDAM] += rnd(1600) + 200; lbeep(); 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 * ********* */ void ofountain() { int x; cursors(); lprcat("\nDo you (d) drink, (w) wash yourself"); iopts(); while (1) switch (lgetchar()) { case 'd': lprcat("drink"); if (rnd(1501) < 2) { lprcat("\nOops! You seem to have caught the dreadful sleep!"); lbeep(); 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; } } /* * *** * FCH * *** * * subroutine to process an up/down of a character attribute for ofountain */ static void fch(how, x) int how; long *x; { if (how < 0) { lprcat(" went down by one!"); --(*x); } else { lprcat(" went up by one!"); (*x)++; } bottomline(); } /* * a subroutine to raise or lower character levels * if x > 0 they are raised if x < 0 they are lowered */ void fntchange(how) int how; { 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(); }