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