|
|
1.1 root 1: /* moreobj.c Larn is copyrighted 1986 by Noah Morgan.
2: *
3: * Routines in this file:
4: *
5: * oaltar()
6: * othrone()
7: * ochest()
8: * ofountain()
9: */
10: #include "header.h"
11:
12: /*
13: * ******
14: * OALTAR
15: * ******
16: *
17: * subroutine to process an altar object
18: */
19: oaltar()
20: {
21: unsigned long k;
22:
23: lprcat("\nDo you (p) pray (d) desecrate"); iopts();
24: while (1)
25: {
26: while (1) switch(getchar())
27: {
28: case 'p': lprcat(" pray\nDo you (m) give money or (j) just pray? ");
29: while (1) switch(getchar())
30: {
31: case 'j': if (rnd(100)<75)
32: lprcat("\nnothing happens");
33: else if (rnd(13)<4) ohear();
34: else if (rnd(43) == 10)
35: {
36: if (c[WEAR]) lprcat("\nYou feel your armor vibrate for a moment");
37: enchantarmor(); return;
38: }
39: else if (rnd(43) == 10)
40: {
41: if (c[WIELD]) lprcat("\nYou feel your weapon vibrate for a moment");
42: enchweapon(); return;
43: }
44: else createmonster(makemonst(level+1));
45: return;
46:
47: case 'm': lprcat("\n\n"); cursor(1,24); cltoeoln();
48: cursor(1,23); cltoeoln();
49: lprcat("how much do you donate? ");
50: k = readnum((long)c[GOLD]);
51: if (c[GOLD]<k)
52: {
53: lprcat("\nYou don't have that much!");
54: return;
55: }
56: c[GOLD] -= k;
57: if (k < c[GOLD]/10 || k<rnd(50))
58: { createmonster(makemonst(level+1)); c[AGGRAVATE] += 200; }
59: else if (rnd(101) > 50) { ohear(); return; }
60: else if (rnd(43) == 5)
61: {
62: if (c[WEAR]) lprcat("\nYou feel your armor vibrate for a moment");
63: enchantarmor(); return;
64: }
65: else if (rnd(43) == 8)
66: {
67: if (c[WIELD]) lprcat("\nYou feel your weapon vibrate for a moment");
68: enchweapon(); return;
69: }
70: else lprcat("\nThank You.");
71: bottomline(); return;
72:
73: case '\33': return;
74: };
75:
76: case 'd': lprcat(" desecrate");
77: if (rnd(100)<60)
78: { createmonster(makemonst(level+2)+8); c[AGGRAVATE] += 2500; }
79: else
80: if (rnd(101)<30)
81: {
82: lprcat("\nThe altar crumbles into a pile of dust before your eyes");
83: forget(); /* remember to destroy the altar */
84: }
85: else
86: lprcat("\nnothing happens");
87: return;
88:
89: case 'i':
90: case '\33': ignore();
91: if (rnd(100)<30) { createmonster(makemonst(level+1)); c[AGGRAVATE] += rnd(450); }
92: else lprcat("\nnothing happens");
93: return;
94: };
95: }
96: }
97:
98: /*
99: function to cast a +3 protection on the player
100: */
101: static ohear()
102: {
103: lprcat("\nYou have been heard!");
104: if (c[ALTPRO]==0) c[MOREDEFENSES]+=3;
105: c[ALTPRO] += 500; /* protection field */
106: bottomline();
107: }
108:
109: /*
110: *******
111: OTHRONE
112: *******
113:
114: subroutine to process a throne object
115: */
116: othrone(arg)
117: int arg;
118: {
119: register int i,k;
120:
121: lprcat("\nDo you (p) pry off jewels, (s) sit down"); iopts();
122: while (1)
123: {
124: while (1) switch(getchar())
125: {
126: case 'p': lprcat(" pry off"); k=rnd(101);
127: if (k<25)
128: {
129: for (i=0; i<rnd(4); i++) creategem(); /* gems pop off the throne */
130: item[playerx][playery]=ODEADTHRONE;
131: know[playerx][playery]=0;
132: }
133: else if (k<40 && arg==0)
134: {
135: createmonster(GNOMEKING);
136: item[playerx][playery]=OTHRONE2;
137: know[playerx][playery]=0;
138: }
139: else lprcat("\nnothing happens");
140: return;
141:
142: case 's': lprcat(" sit down"); k=rnd(101);
143: if (k<30 && arg==0)
144: {
145: createmonster(GNOMEKING);
146: item[playerx][playery]=OTHRONE2;
147: know[playerx][playery]=0;
148: }
149: else if (k<35) { lprcat("\nZaaaappp! You've been teleported!\n"); beep(); oteleport(0); }
150: else lprcat("\nnothing happens");
151: return;
152:
153: case 'i':
154: case '\33': ignore(); return;
155: };
156: }
157: }
158:
159: odeadthrone()
160: {
161: register int k;
162:
163: lprcat("\nDo you (s) sit down"); iopts();
164: while (1)
165: {
166: while (1) switch(getchar())
167: {
168: case 's': lprcat(" sit down"); k=rnd(101);
169: if (k<35) { lprcat("\nZaaaappp! You've been teleported!\n"); beep(); oteleport(0); }
170: else lprcat("\nnothing happens");
171: return;
172:
173: case 'i':
174: case '\33': ignore(); return;
175: };
176: }
177: }
178:
179: /*
180: ******
181: OCHEST
182: ******
183:
184: subroutine to process a throne object
185: */
186: ochest()
187: {
188: register int i,k;
189: lprcat("\nDo you (t) take it, (o) try to open it"); iopts();
190: while (1)
191: {
192: while (1) switch(getchar())
193: {
194: case 'o': lprcat(" open it"); k=rnd(101);
195: if (k<40)
196: {
197: lprcat("\nThe chest explodes as you open it"); beep();
198: i = rnd(10); lastnum=281; /* in case he dies */
199: lprintf("\nYou suffer %d hit points damage!",(long)i);
200: checkloss(i);
201: switch(rnd(10)) /* see if he gets a curse */
202: {
203: case 1: c[ITCHING]+= rnd(1000)+100;
204: lprcat("\nYou feel an irritation spread over your skin!");
205: beep();
206: break;
207:
208: case 2: c[CLUMSINESS]+= rnd(1600)+200;
209: lprcat("\nYou begin to lose hand to eye coordination!");
210: beep();
211: break;
212:
213: case 3: c[HALFDAM]+= rnd(1600)+200;
214: beep();
215: lprcat("\nA sickness engulfs you!"); break;
216: };
217: item[playerx][playery]=know[playerx][playery]=0;
218: if (rnd(100)<69) creategem(); /* gems from the chest */
219: dropgold(rnd(110*iarg[playerx][playery]+200));
220: for (i=0; i<rnd(4); i++) something(iarg[playerx][playery]+2);
221: }
222: else lprcat("\nnothing happens");
223: return;
224:
225: case 't': lprcat(" take");
226: if (take(OCHEST,iarg[playerx][playery])==0)
227: item[playerx][playery]=know[playerx][playery]=0;
228: return;
229:
230: case 'i':
231: case '\33': ignore(); return;
232: };
233: }
234: }
235:
236: /*
237: *********
238: OFOUNTAIN
239: *********
240: */
241:
242: ofountain()
243: {
244: register int x;
245: cursors();
246: lprcat("\nDo you (d) drink, (w) wash yourself"); iopts();
247: while (1) switch(getchar())
248: {
249: case 'd': lprcat("drink");
250: if (rnd(1501)<2)
251: {
252: lprcat("\nOops! You seem to have caught the dreadful sleep!");
253: beep(); lflush(); sleep(3); died(280); return;
254: }
255: x = rnd(100);
256: if (x<7)
257: {
258: c[HALFDAM] += 200+rnd(200);
259: lprcat("\nYou feel a sickness coming on");
260: }
261: else if (x<13) quaffpotion(23); /* see invisible */
262: else if (x < 45)
263: lprcat("\nnothing seems to have happened");
264: else if (rnd(3) != 2)
265: fntchange(1); /* change char levels upward */
266: else
267: fntchange(-1); /* change char levels downward */
268: if (rnd(12)<3)
269: {
270: lprcat("\nThe fountains bubbling slowly quiets");
271: item[playerx][playery]=ODEADFOUNTAIN; /* dead fountain */
272: know[playerx][playery]=0;
273: }
274: return;
275:
276: case '\33':
277: case 'i': ignore(); return;
278:
279: case 'w': lprcat("wash yourself");
280: if (rnd(100) < 11)
281: {
282: x=rnd((level<<2)+2);
283: lprintf("\nOh no! The water was foul! You suffer %d hit points!",(long)x);
284: lastnum=273; losehp(x); bottomline(); cursors();
285: }
286: else
287: if (rnd(100) < 29)
288: lprcat("\nYou got the dirt off!");
289: else
290: if (rnd(100) < 31)
291: lprcat("\nThis water seems to be hard water! The dirt didn't come off!");
292: else
293: if (rnd(100) < 34)
294: createmonster(WATERLORD); /* make water lord */
295: else
296: lprcat("\nnothing seems to have happened");
297: return;
298: }
299: }
300:
301: /*
302: a subroutine to raise or lower character levels
303: if x > 0 they are raised if x < 0 they are lowered
304: */
305: fntchange(how)
306: int how;
307: {
308: register long j;
309: lprc('\n');
310: switch(rnd(9))
311: {
312: case 1: lprcat("Your strength"); fch(how,&c[0]); break;
313: case 2: lprcat("Your intelligence"); fch(how,&c[1]); break;
314: case 3: lprcat("Your wisdom"); fch(how,&c[2]); break;
315: case 4: lprcat("Your constitution"); fch(how,&c[3]); break;
316: case 5: lprcat("Your dexterity"); fch(how,&c[4]); break;
317: case 6: lprcat("Your charm"); fch(how,&c[5]); break;
318: case 7: j=rnd(level+1);
319: if (how < 0)
320: { lprintf("You lose %d hit point",(long)j); if (j>1) lprcat("s!"); else lprc('!'); losemhp((int)j); }
321: else
322: { lprintf("You gain %d hit point",(long)j); if (j>1) lprcat("s!"); else lprc('!'); raisemhp((int)j); }
323: bottomline(); break;
324:
325: case 8: j=rnd(level+1);
326: if (how > 0)
327: {
328: lprintf("You just gained %d spell",(long)j); raisemspells((int)j);
329: if (j>1) lprcat("s!"); else lprc('!');
330: }
331: else
332: {
333: lprintf("You just lost %d spell",(long)j); losemspells((int)j);
334: if (j>1) lprcat("s!"); else lprc('!');
335: }
336: bottomline(); break;
337:
338: case 9: j = 5*rnd((level+1)*(level+1));
339: if (how < 0)
340: {
341: lprintf("You just lost %d experience point",(long)j);
342: if (j>1) lprcat("s!"); else lprc('!'); loseexperience((long)j);
343: }
344: else
345: {
346: lprintf("You just gained %d experience point",(long)j);
347: if (j>1) lprcat("s!"); else lprc('!'); raiseexperience((long)j);
348: }
349: break;
350: }
351: cursors();
352: }
353:
354: /*
355: ***
356: FCH
357: ***
358:
359: subroutine to process an up/down of a character attribute for ofountain
360: */
361: static fch(how,x)
362: int how;
363: long *x;
364: {
365: if (how < 0) { lprcat(" went down by one!"); --(*x); }
366: else { lprcat(" went up by one!"); (*x)++; }
367: bottomline();
368: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.