]>
git.cameronkatri.com Git - bsdgames-darwin.git/blob - larn/object.c
1 /* object.c Larn is copyrighted 1986 by Noah Morgan. */
9 subroutine to look for an object and give the player his options
10 if an object was found.
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;
20 case OGOLDPILE
: case OMAXGOLD
:
21 case OKGOLD
: case ODGOLD
: lprcat("\n\nYou have found some gold!"); ogold(i
); break;
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;
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]);
32 case OALTAR
: if (nearbymonst()) return;
33 lprcat("\n\nThere is a Holy Altar here!"); oaltar(); break;
35 case OBOOK
: lprcat("\n\nYou have found a book."); obook(); break;
37 case OCOOKIE
: lprcat("\n\nYou have found a fortune cookie."); ocookie(); break;
39 case OTHRONE
: if (nearbymonst()) return;
40 lprintf("\n\nThere is %s here!",objectname
[i
]); othrone(0); break;
42 case OTHRONE2
: if (nearbymonst()) return;
43 lprintf("\n\nThere is %s here!",objectname
[i
]); othrone(1); break;
45 case ODEADTHRONE
: lprintf("\n\nThere is %s here!",objectname
[i
]); odeadthrone(); break;
47 case OORB
: lprcat("\n\nYou have found the Orb!!!!!"); oorb(); break;
49 case OPIT
: lprcat("\n\nYou're standing at the top of a pit."); opit(); break;
51 case OSTAIRSUP
: lprcat("\n\nThere is a circular staircase here"); ostairs(1); /* up */ break;
53 case OELEVATORUP
: lprcat("\n\nYou feel heavy for a moment, but the feeling disappears");
54 oelevator(1); /* up */ break;
56 case OFOUNTAIN
: if (nearbymonst()) return;
57 lprcat("\n\nThere is a fountain here"); ofountain(); break;
59 case OSTATUE
: if (nearbymonst()) return;
60 lprcat("\n\nYou are standing in front of a statue"); ostatue(); break;
62 case OCHEST
: lprcat("\n\nThere is a chest here"); ochest(); break;
64 case OIVTELETRAP
: if (rnd(11)<6) return;
65 item
[playerx
][playery
] = OTELEPORTER
;
66 know
[playerx
][playery
] = 1;
68 case OTELEPORTER
: lprcat("\nZaaaappp! You've been teleported!\n");
69 beep(); nap(3000); oteleport(0);
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");
80 case OMIRROR
: if (nearbymonst()) return;
81 lprcat("\n\nThere is a mirror here"); omirror(); break;
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");
93 case ODEADFOUNTAIN
: if (nearbymonst()) return;
94 lprcat("\n\nThere is a dead fountain here"); break;
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();
101 dndstore(); /* the dnd adventurers store */
102 else lprcat(" stay here");
105 case OSTAIRSDOWN
: lprcat("\n\nThere is a circular staircase here"); ostairs(-1); /* down */ break;
107 case OELEVATORDOWN
: lprcat("\n\nYou feel light for a moment, but the feeling disappears");
108 oelevator(-1); /* down */
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
;
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; }
132 switch(iarg
[playerx
][playery
])
134 case 6: c
[AGGRAVATE
] += rnd(400); break;
136 case 7: lprcat("\nYou are jolted by an electric shock ");
137 lastnum
=274; losehp(rnd(20)); bottomline(); break;
139 case 8: loselevel(); break;
141 case 9: lprcat("\nYou suddenly feel weaker ");
142 if (c
[STRENGTH
]>3) c
[STRENGTH
]--;
147 playerx
= lastpx
; playery
= lastpy
;
151 forget(); item
[playerx
][playery
]=OOPENDOOR
;
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();
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;
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(); }
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;
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;
193 case OTRAPARROWIV
: if (rnd(17)<13) return; /* for an arrow trap */
194 item
[playerx
][playery
] = OTRAPARROW
;
195 know
[playerx
][playery
] = 0;
197 case OTRAPARROW
: lprcat("\nYou are hit by an arrow"); beep(); /* for an arrow trap */
198 lastnum
=259; losehp(rnd(10)+level
);
201 case OIVDARTRAP
: if (rnd(17)<13) return; /* for a dart trap */
202 item
[playerx
][playery
] = ODARTRAP
;
203 know
[playerx
][playery
] = 0;
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;
210 case OIVTRAPDOOR
: if (rnd(17)<13) return; /* for a trap door */
211 item
[playerx
][playery
] = OTRAPDOOR
;
212 know
[playerx
][playery
] = 1;
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();
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");
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");
239 case OANNIHILATION
: died(283); return; /* annihilated by sphere of annihilation */
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();
246 olrs(); /* the larn revenue service */
247 else lprcat(" stay here");
250 default: finditem(i
); break;
255 function to say what object we found and ask if player wants to take it
261 lprintf("\n\nYou have found %s ",objectname
[itm
]);
262 tmp
=iarg
[playerx
][playery
];
265 case ODIAMOND
: case ORUBY
: case OEMERALD
:
266 case OSAPPHIRE
: case OSPIRITSCARAB
: case OORBOFDRAGON
:
267 case OCUBEofUNDEAD
: case ONOTHEFT
: break;
270 if (tmp
>0) lprintf("+ %d",(long)tmp
); else if (tmp
<0) lprintf(" %d",(long)tmp
);
272 lprcat("\nDo you want to (t) take it"); iopts();
273 i
=0; while (i
!='t' && i
!='i' && i
!='\33') i
=getchar();
275 { lprcat("take"); if (take(itm
,tmp
)==0) forget(); return; }
285 subroutine to process the stair cases
286 if dir > 0 the up else down
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? ");
296 while (1) switch(getchar())
299 case 's': case 'i': lprcat("stay here"); return;
301 case 'f': lprcat("kick stairs");
303 lprcat("\nI hope you feel better. Showing anger rids you of frustration.");
307 lprintf("\nYou hurt your foot dumb dumb! You suffer %d hit points",(long)k
);
308 lastnum
=276; losehp(k
); bottomline();
312 case 'u': lprcat("go up");
313 if (dir
< 0) lprcat("\nThe stairs don't go up!");
315 if (level
>=2 && level
!=11)
317 k
= level
; newcavelevel(level
-1);
318 draws(0,MAXX
,0,MAXY
); bot_linex();
320 else lprcat("\nThe stairs lead to a dead end!");
323 case 'd': lprcat("go down");
324 if (dir
> 0) lprcat("\nThe stairs don't go down!");
326 if (level
!=0 && level
!=10 && level
!=13)
328 k
= level
; newcavelevel(level
+1);
329 draws(0,MAXX
,0,MAXY
); bot_linex();
331 else lprcat("\nThe stairs lead to a dead end!");
342 subroutine to handle a teleport trap +/- 1 level maximum
348 if (err
) if (rnd(151)<3) died(264); /* stuck in a rock */
349 c
[TELEFLAG
]=1; /* show ?? on bottomline if been teleported */
351 else if (level
< MAXLEVEL
)
352 { tmp
=rnd(5)+level
-3; if (tmp
>=MAXLEVEL
) tmp
=MAXLEVEL
-1;
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();
367 function to process a potion
372 lprcat("\nDo you (d) drink it, (t) take it"); iopts();
373 while (1) switch(getchar())
376 case 'i': ignore(); return;
378 case 'd': lprcat("drink\n"); forget(); /* destroy potion */
379 quaffpotion(pot
); return;
381 case 't': lprcat("take\n"); if (take(OPOTION
,pot
)==0) forget();
387 function to drink a potion
393 if (pot
<0 || pot
>=MAXPOTION
) return; /* check for within bounds */
394 potionname
[pot
] = potionhide
[pot
];
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
))
401 know
[j
][i
]=1; show1cell(j
,i
);
403 showplayer(); return;
405 case 19: lprcat("\nYou feel greedy . . ."); nap(2000);
406 for (i
=0; i
<MAXY
; i
++) for (j
=0; j
<MAXX
; j
++)
409 if ((k
==ODIAMOND
) || (k
==ORUBY
) || (k
==OEMERALD
) || (k
==OMAXGOLD
)
410 || (k
==OSAPPHIRE
) || (k
==OLARNEYE
) || (k
==OGOLDPILE
))
412 know
[j
][i
]=1; show1cell(j
,i
);
415 showplayer(); return;
417 case 20: c
[HP
] = c
[HPMAX
]; break; /* instant healing */
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;
423 case 2: lprcat("\nSuddenly, you feel much more skillful!");
424 raiselevel(); raisemhp(1); return;
426 case 3: lprcat("\nYou feel strange for a moment");
429 case 4: lprcat("\nYou feel more self confident!");
430 c
[WISDOM
] += rnd(2); break;
432 case 5: lprcat("\nWow! You feel great!");
433 if (c
[STRENGTH
]<12) c
[STRENGTH
]=12; else c
[STRENGTH
]++; break;
435 case 6: lprcat("\nYour charm went up by one!"); c
[CHARISMA
]++; break;
437 case 8: lprcat("\nYour intelligence went up by one!");
438 c
[INTELLIGENCE
]++; break;
440 case 10: for (i
=0; i
<MAXY
; i
++) for (j
=0; j
<MAXX
; j
++)
443 know
[j
][i
]=1; show1cell(j
,i
);
445 /* monster detection */ return;
447 case 12: lprcat("\nThis potion has no taste to it"); return;
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;
453 case 16: lprcat("\nYou have a greater intestinal constitude!");
454 c
[CONSTITUTION
]++; break;
456 case 17: lprcat("\nYou now have incredibly bulging muscles!!!");
457 if (c
[GIANTSTR
]==0) c
[STREXTRA
] += 21;
458 c
[GIANTSTR
] += 700; break;
460 case 18: lprcat("\nYou feel a chill run up your spine!");
461 c
[FIRERESISTANCE
] += 1000; break;
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;
467 case 7: lprcat("\nYou become dizzy!");
468 if (--c
[STRENGTH
] < 3) c
[STRENGTH
]=3; break;
470 case 11: lprcat("\nYou stagger for a moment . .");
471 for (i
=0; i
<MAXY
; i
++) for (j
=0; j
<MAXX
; j
++)
473 nap(2000); draws(0,MAXX
,0,MAXY
); /* potion of forgetfulness */ return;
475 case 13: lprcat("\nYou can't see anything!"); /* blindness */
476 c
[BLINDCOUNT
]+=500; return;
478 case 14: lprcat("\nYou feel confused"); c
[CONFUSE
]+= 20+rnd(9); return;
480 case 21: lprcat("\nYou don't seem to be affected"); return; /* cure dianthroritis */
482 case 22: lprcat("\nYou feel a sickness engulf you"); /* poison */
483 c
[HALFDAM
] += 200 + rnd(200); return;
485 case 23: lprcat("\nYou feel your vision sharpen"); /* see invisible */
486 c
[SEEINVISIBLE
] += rnd(1000)+400;
487 monstnamelist
[INVISIBLESTALKER
] = 'I'; return;
489 bottomline(); /* show new stats */ return;
497 function to process a magic scroll
503 if (c
[BLINDCOUNT
]==0) lprcat("(r) read it, "); lprcat("(t) take it"); iopts();
504 while (1) switch(getchar())
507 case 'i': ignore(); return;
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;
514 case 't': lprcat("take"); if (take(OSCROLL
,typ
)==0) forget(); /* destroy it */
520 data for the function to read a scroll
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
};
533 * function to adjust time when time warping and taking courses in school
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;
546 function to read a scroll
552 if (typ
<0 || typ
>=MAXSCROLL
) return; /* be sure we are within bounds */
553 scrollname
[typ
] = scrollhide
[typ
];
556 case 0: lprcat("\nYour armor glows for a moment"); enchantarmor(); return;
558 case 1: lprcat("\nYour weapon glows for a moment"); enchweapon(); return; /* enchant weapon */
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;
566 case 3: lprcat("\nThis scroll seems to be blank"); return;
568 case 4: createmonster(makemonst(level
+1)); return; /* this one creates a monster */
570 case 5: something(level
); /* create artifact */ return;
572 case 6: c
[AGGRAVATE
]+=800; return; /* aggravate monsters */
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 */
580 case 8: oteleport(0); return; /* teleportation */
582 case 9: c
[AWARENESS
] += 1800; return; /* expanded awareness */
584 case 10: c
[HASTEMONST
] += rnd(55)+12; return; /* haste monster */
586 case 11: for (i
=0; i
<MAXY
; i
++) for (j
=0; j
<MAXX
; j
++)
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 */
592 case 13: c
[UNDEADPRO
] += 300 + rnd(200); bottomline(); return; /* undead protection */
594 case 14: c
[STEALTH
] += 250 + rnd(250); bottomline(); return; /* stealth */
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;
600 case 16: c
[HOLDMONST
] += 30; bottomline(); return; /* hold monster */
602 case 17: for (i
=0; i
<26; i
++) /* gem perfection */
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;
613 case 18: for (i
=0; i
<11; i
++) c
[exten
[i
]] <<= 1; /* spell extension */
616 case 19: for (i
=0; i
<26; i
++) /* identify */
618 if (iven
[i
]==OPOTION
) potionname
[ivenarg
[i
]] = potionhide
[ivenarg
[i
]];
619 if (iven
[i
]==OSCROLL
) scrollname
[ivenarg
[i
]] = scrollhide
[ivenarg
[i
]];
623 case 20: for (i
=0; i
<10; i
++) /* remove curse */
624 if (c
[curse
[i
]]) c
[curse
[i
]] = 1;
627 case 21: annihilate(); break; /* scroll of annihilation */
629 case 22: godirect(22,150,"The ray hits the %s",0,' '); /* pulverization */
631 case 23: c
[LIFEPROT
]++; break; /* life protection */
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
650 i
=0; lprcat("\nYou fell into a pit! Your fall is cushioned by an unknown force\n");
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 */
658 losehp(i
); nap(2000); newcavelevel(level
+1); draws(0,MAXX
,0,MAXY
);
664 lprcat("\nYou fell into a bottomless pit!"); beep(); nap(3000); died(262);
687 if (c
[BLINDCOUNT
]==0) lprcat("(r) read it, "); lprcat("(t) take it"); iopts();
688 while (1) switch(getchar())
691 case 'i': ignore(); return;
693 case 'r': if (c
[BLINDCOUNT
]) break;
695 /* no more book */ readbook(iarg
[playerx
][playery
]); forget(); return;
697 case 't': lprcat("take"); if (take(OBOOK
,iarg
[playerx
][playery
])==0) forget(); /* no more book */
703 function to read a book
709 if (lev
<=3) i
= rund((tmp
=splev
[lev
])?tmp
:1); else
710 i
= rnd((tmp
=splev
[lev
]-9)?tmp
:1) + 9;
712 lprintf("\nSpell \"%s\": %s\n%s",spelcode
[i
],spelname
[i
],speldescript
[i
]);
714 { lprcat("\nYour int went up by one!"); c
[INTELLIGENCE
]++; bottomline(); }
720 lprcat("\nDo you (e) eat it, (t) take it"); iopts();
721 while (1) switch(getchar())
724 case 'i': ignore(); return;
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
);
733 case 't': lprcat("take"); if (take(OCOOKIE
,0)==0) forget(); /* no more book */
739 /* routine to pick up some gold -- if arg==OMAXGOLD then the pile is worth 100* the argument */
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 */
755 nosignal
= 1; /* disable signals */
756 for (i
=0; i
<26; i
++) if (iven
[i
]==OPOTION
) if (ivenarg
[i
]==21)
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");
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);
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");
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);
780 clear(); lprintf("Welcome home %s. Latest word from the doctor is not good.\n",logname
);
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);
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; }
802 /* routine to save program space */
804 { lprcat(", or (i) ignore it? "); }
806 { lprcat("ignore\n"); }