|
|
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:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.