]>
git.cameronkatri.com Git - bsdgames-darwin.git/blob - larn/object.c
2 static char rcsid
[] = "$NetBSD: object.c,v 1.7 1997/07/13 20:21:38 christos Exp $";
5 /* object.c Larn is copyrighted 1986 by Noah Morgan. */
13 subroutine to look for an object and give the player his options
14 if an object was found.
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;
24 case OGOLDPILE
: case OMAXGOLD
:
25 case OKGOLD
: case ODGOLD
: lprcat("\n\nYou have found some gold!"); ogold(i
); break;
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
]);
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
]);
37 case OALTAR
: if (nearbymonst()) return;
38 lprcat("\n\nThere is a Holy Altar here!"); oaltar(); break;
40 case OBOOK
: lprcat("\n\nYou have found a book."); obook(); break;
42 case OCOOKIE
: lprcat("\n\nYou have found a fortune cookie."); ocookie(); break;
44 case OTHRONE
: if (nearbymonst()) return;
45 lprintf("\n\nThere is %s here!",objectname
[i
]); othrone(0); break;
47 case OTHRONE2
: if (nearbymonst()) return;
48 lprintf("\n\nThere is %s here!",objectname
[i
]); othrone(1); break;
50 case ODEADTHRONE
: lprintf("\n\nThere is %s here!",objectname
[i
]); odeadthrone(); break;
52 case OORB
: lprcat("\n\nYou have found the Orb!!!!!"); oorb(); break;
54 case OPIT
: lprcat("\n\nYou're standing at the top of a pit."); opit(); break;
56 case OSTAIRSUP
: lprcat("\n\nThere is a circular staircase here"); ostairs(1); /* up */ break;
58 case OELEVATORUP
: lprcat("\n\nYou feel heavy for a moment, but the feeling disappears");
59 oelevator(1); /* up */ break;
61 case OFOUNTAIN
: if (nearbymonst()) return;
62 lprcat("\n\nThere is a fountain here"); ofountain(); break;
64 case OSTATUE
: if (nearbymonst()) return;
65 lprcat("\n\nYou are standing in front of a statue"); ostatue(); break;
67 case OCHEST
: lprcat("\n\nThere is a chest here"); ochest(); break;
69 case OIVTELETRAP
: if (rnd(11)<6) return;
70 item
[playerx
][playery
] = OTELEPORTER
;
71 know
[playerx
][playery
] = 1;
73 case OTELEPORTER
: lprcat("\nZaaaappp! You've been teleported!\n");
74 beep(); nap(3000); oteleport(0);
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");
85 case OMIRROR
: if (nearbymonst()) return;
86 lprcat("\n\nThere is a mirror here"); omirror(); break;
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");
98 case ODEADFOUNTAIN
: if (nearbymonst()) return;
99 lprcat("\n\nThere is a dead fountain here"); break;
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();
106 dndstore(); /* the dnd adventurers store */
107 else lprcat(" stay here");
110 case OSTAIRSDOWN
: lprcat("\n\nThere is a circular staircase here"); ostairs(-1); /* down */ break;
112 case OELEVATORDOWN
: lprcat("\n\nYou feel light for a moment, but the feeling disappears");
113 oelevator(-1); /* down */
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
;
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; }
137 switch(iarg
[playerx
][playery
])
139 case 6: c
[AGGRAVATE
] += rnd(400); break;
141 case 7: lprcat("\nYou are jolted by an electric shock ");
142 lastnum
=274; losehp(rnd(20)); bottomline(); break;
144 case 8: loselevel(); break;
146 case 9: lprcat("\nYou suddenly feel weaker ");
147 if (c
[STRENGTH
]>3) c
[STRENGTH
]--;
152 playerx
= lastpx
; playery
= lastpy
;
156 forget(); item
[playerx
][playery
]=OOPENDOOR
;
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();
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;
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(); }
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;
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;
198 case OTRAPARROWIV
: if (rnd(17)<13) return; /* for an arrow trap */
199 item
[playerx
][playery
] = OTRAPARROW
;
200 know
[playerx
][playery
] = 0;
202 case OTRAPARROW
: lprcat("\nYou are hit by an arrow"); beep(); /* for an arrow trap */
203 lastnum
=259; losehp(rnd(10)+level
);
206 case OIVDARTRAP
: if (rnd(17)<13) return; /* for a dart trap */
207 item
[playerx
][playery
] = ODARTRAP
;
208 know
[playerx
][playery
] = 0;
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;
215 case OIVTRAPDOOR
: if (rnd(17)<13) return; /* for a trap door */
216 item
[playerx
][playery
] = OTRAPDOOR
;
217 know
[playerx
][playery
] = 1;
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();
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");
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");
244 case OANNIHILATION
: died(283); return; /* annihilated by sphere of annihilation */
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();
251 olrs(); /* the larn revenue service */
252 else lprcat(" stay here");
255 default: finditem(i
); break;
260 function to say what object we found and ask if player wants to take it
266 lprintf("\n\nYou have found %s ",objectname
[itm
]);
267 tmp
=iarg
[playerx
][playery
];
270 case ODIAMOND
: case ORUBY
: case OEMERALD
:
271 case OSAPPHIRE
: case OSPIRITSCARAB
: case OORBOFDRAGON
:
272 case OCUBEofUNDEAD
: case ONOTHEFT
: break;
275 if (tmp
>0) lprintf("+ %d",(long)tmp
); else if (tmp
<0) lprintf(" %d",(long)tmp
);
277 lprcat("\nDo you want to (t) take it"); iopts();
278 i
=0; while (i
!='t' && i
!='i' && i
!='\33') i
=getchar();
280 { lprcat("take"); if (take(itm
,tmp
)==0) forget(); return; }
290 subroutine to process the stair cases
291 if dir > 0 the up else down
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? ");
301 while (1) switch(getchar())
304 case 's': case 'i': lprcat("stay here"); return;
306 case 'f': lprcat("kick stairs");
308 lprcat("\nI hope you feel better. Showing anger rids you of frustration.");
312 lprintf("\nYou hurt your foot dumb dumb! You suffer %d hit points",(long)k
);
313 lastnum
=276; losehp(k
); bottomline();
317 case 'u': lprcat("go up");
318 if (dir
< 0) lprcat("\nThe stairs don't go up!");
320 if (level
>=2 && level
!=11)
322 k
= level
; newcavelevel(level
-1);
323 draws(0,MAXX
,0,MAXY
); bot_linex();
325 else lprcat("\nThe stairs lead to a dead end!");
328 case 'd': lprcat("go down");
329 if (dir
> 0) lprcat("\nThe stairs don't go down!");
331 if (level
!=0 && level
!=10 && level
!=13)
333 k
= level
; newcavelevel(level
+1);
334 draws(0,MAXX
,0,MAXY
); bot_linex();
336 else lprcat("\nThe stairs lead to a dead end!");
347 subroutine to handle a teleport trap +/- 1 level maximum
353 if (err
) if (rnd(151)<3) died(264); /* stuck in a rock */
354 c
[TELEFLAG
]=1; /* show ?? on bottomline if been teleported */
356 else if (level
< MAXLEVEL
)
357 { tmp
=rnd(5)+level
-3; if (tmp
>=MAXLEVEL
) tmp
=MAXLEVEL
-1;
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();
372 function to process a potion
377 lprcat("\nDo you (d) drink it, (t) take it"); iopts();
378 while (1) switch(getchar())
381 case 'i': ignore(); return;
383 case 'd': lprcat("drink\n"); forget(); /* destroy potion */
384 quaffpotion(pot
); return;
386 case 't': lprcat("take\n"); if (take(OPOTION
,pot
)==0) forget();
392 function to drink a potion
398 if (pot
<0 || pot
>=MAXPOTION
) return; /* check for within bounds */
399 potionname
[pot
] = potionhide
[pot
];
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
))
406 know
[j
][i
]=1; show1cell(j
,i
);
408 showplayer(); return;
410 case 19: lprcat("\nYou feel greedy . . ."); nap(2000);
411 for (i
=0; i
<MAXY
; i
++) for (j
=0; j
<MAXX
; j
++)
414 if ((k
==ODIAMOND
) || (k
==ORUBY
) || (k
==OEMERALD
) || (k
==OMAXGOLD
)
415 || (k
==OSAPPHIRE
) || (k
==OLARNEYE
) || (k
==OGOLDPILE
))
417 know
[j
][i
]=1; show1cell(j
,i
);
420 showplayer(); return;
422 case 20: c
[HP
] = c
[HPMAX
]; break; /* instant healing */
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;
428 case 2: lprcat("\nSuddenly, you feel much more skillful!");
429 raiselevel(); raisemhp(1); return;
431 case 3: lprcat("\nYou feel strange for a moment");
434 case 4: lprcat("\nYou feel more self confident!");
435 c
[WISDOM
] += rnd(2); break;
437 case 5: lprcat("\nWow! You feel great!");
438 if (c
[STRENGTH
]<12) c
[STRENGTH
]=12; else c
[STRENGTH
]++; break;
440 case 6: lprcat("\nYour charm went up by one!"); c
[CHARISMA
]++; break;
442 case 8: lprcat("\nYour intelligence went up by one!");
443 c
[INTELLIGENCE
]++; break;
445 case 10: for (i
=0; i
<MAXY
; i
++) for (j
=0; j
<MAXX
; j
++)
448 know
[j
][i
]=1; show1cell(j
,i
);
450 /* monster detection */ return;
452 case 12: lprcat("\nThis potion has no taste to it"); return;
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;
458 case 16: lprcat("\nYou have a greater intestinal constitude!");
459 c
[CONSTITUTION
]++; break;
461 case 17: lprcat("\nYou now have incredibly bulging muscles!!!");
462 if (c
[GIANTSTR
]==0) c
[STREXTRA
] += 21;
463 c
[GIANTSTR
] += 700; break;
465 case 18: lprcat("\nYou feel a chill run up your spine!");
466 c
[FIRERESISTANCE
] += 1000; break;
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;
472 case 7: lprcat("\nYou become dizzy!");
473 if (--c
[STRENGTH
] < 3) c
[STRENGTH
]=3; break;
475 case 11: lprcat("\nYou stagger for a moment . .");
476 for (i
=0; i
<MAXY
; i
++) for (j
=0; j
<MAXX
; j
++)
478 nap(2000); draws(0,MAXX
,0,MAXY
); /* potion of forgetfulness */ return;
480 case 13: lprcat("\nYou can't see anything!"); /* blindness */
481 c
[BLINDCOUNT
]+=500; return;
483 case 14: lprcat("\nYou feel confused"); c
[CONFUSE
]+= 20+rnd(9); return;
485 case 21: lprcat("\nYou don't seem to be affected"); return; /* cure dianthroritis */
487 case 22: lprcat("\nYou feel a sickness engulf you"); /* poison */
488 c
[HALFDAM
] += 200 + rnd(200); return;
490 case 23: lprcat("\nYou feel your vision sharpen"); /* see invisible */
491 c
[SEEINVISIBLE
] += rnd(1000)+400;
492 monstnamelist
[INVISIBLESTALKER
] = 'I'; return;
494 bottomline(); /* show new stats */ return;
502 function to process a magic scroll
508 if (c
[BLINDCOUNT
]==0) lprcat("(r) read it, "); lprcat("(t) take it"); iopts();
509 while (1) switch(getchar())
512 case 'i': ignore(); return;
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;
519 case 't': lprcat("take"); if (take(OSCROLL
,typ
)==0) forget(); /* destroy it */
525 data for the function to read a scroll
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
};
538 * function to adjust time when time warping and taking courses in school
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;
551 function to read a scroll
557 if (typ
<0 || typ
>=MAXSCROLL
) return; /* be sure we are within bounds */
558 scrollname
[typ
] = scrollhide
[typ
];
561 case 0: lprcat("\nYour armor glows for a moment"); enchantarmor(); return;
563 case 1: lprcat("\nYour weapon glows for a moment"); enchweapon(); return; /* enchant weapon */
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;
571 case 3: lprcat("\nThis scroll seems to be blank"); return;
573 case 4: createmonster(makemonst(level
+1)); return; /* this one creates a monster */
575 case 5: something(level
); /* create artifact */ return;
577 case 6: c
[AGGRAVATE
]+=800; return; /* aggravate monsters */
579 case 7: gltime
+= (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 */
585 case 8: oteleport(0); return; /* teleportation */
587 case 9: c
[AWARENESS
] += 1800; return; /* expanded awareness */
589 case 10: c
[HASTEMONST
] += rnd(55)+12; return; /* haste monster */
591 case 11: for (i
=0; i
<MAXY
; i
++) for (j
=0; j
<MAXX
; j
++)
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 */
597 case 13: c
[UNDEADPRO
] += 300 + rnd(200); bottomline(); return; /* undead protection */
599 case 14: c
[STEALTH
] += 250 + rnd(250); bottomline(); return; /* stealth */
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;
605 case 16: c
[HOLDMONST
] += 30; bottomline(); return; /* hold monster */
607 case 17: for (i
=0; i
<26; i
++) /* gem perfection */
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;
618 case 18: for (i
=0; i
<11; i
++) c
[exten
[i
]] <<= 1; /* spell extension */
621 case 19: for (i
=0; i
<26; i
++) /* identify */
623 if (iven
[i
]==OPOTION
) potionname
[ivenarg
[i
]] = potionhide
[ivenarg
[i
]];
624 if (iven
[i
]==OSCROLL
) scrollname
[ivenarg
[i
]] = scrollhide
[ivenarg
[i
]];
628 case 20: for (i
=0; i
<10; i
++) /* remove curse */
629 if (c
[curse
[i
]]) c
[curse
[i
]] = 1;
632 case 21: annihilate(); break; /* scroll of annihilation */
634 case 22: godirect(22,150,"The ray hits the %s",0,' '); /* pulverization */
636 case 23: c
[LIFEPROT
]++; break; /* life protection */
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
655 i
=0; lprcat("\nYou fell into a pit! Your fall is cushioned by an unknown force\n");
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 */
663 losehp(i
); nap(2000); newcavelevel(level
+1); draws(0,MAXX
,0,MAXY
);
669 lprcat("\nYou fell into a bottomless pit!"); beep(); nap(3000); died(262);
692 if (c
[BLINDCOUNT
]==0) lprcat("(r) read it, "); lprcat("(t) take it"); iopts();
693 while (1) switch(getchar())
696 case 'i': ignore(); return;
698 case 'r': if (c
[BLINDCOUNT
]) break;
700 /* no more book */ readbook(iarg
[playerx
][playery
]); forget(); return;
702 case 't': lprcat("take"); if (take(OBOOK
,iarg
[playerx
][playery
])==0) forget(); /* no more book */
708 function to read a book
714 if (lev
<=3) i
= rund((tmp
=splev
[lev
])?tmp
:1); else
715 i
= rnd((tmp
=splev
[lev
]-9)?tmp
:1) + 9;
717 lprintf("\nSpell \"%s\": %s\n%s",spelcode
[i
],spelname
[i
],speldescript
[i
]);
719 { lprcat("\nYour int went up by one!"); c
[INTELLIGENCE
]++; bottomline(); }
725 lprcat("\nDo you (e) eat it, (t) take it"); iopts();
726 while (1) switch(getchar())
729 case 'i': ignore(); return;
731 case 'e': lprcat("eat\nThe cookie tasted good.");
732 forget(); /* no more cookie */
733 if (c
[BLINDCOUNT
]) return;
734 if (!(p
=fortune())) return;
735 lprcat(" A message inside the cookie reads:\n"); lprcat(p
);
738 case 't': lprcat("take"); if (take(OCOOKIE
,0)==0) forget(); /* no more book */
744 /* routine to pick up some gold -- if arg==OMAXGOLD then the pile is worth 100* the argument */
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 */
760 nosignal
= 1; /* disable signals */
761 for (i
=0; i
<26; i
++) if (iven
[i
]==OPOTION
) if (ivenarg
[i
]==21)
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 (gltime
>TIMELIMIT
)
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);
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");
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);
785 clear(); lprintf("Welcome home %s. Latest word from the doctor is not good.\n",logname
);
787 if (gltime
>TIMELIMIT
)
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);
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
-gltime
+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; }
807 /* routine to save program space */
809 { lprcat(", or (i) ignore it? "); }
811 { lprcat("ignore\n"); }