Annotation of src/games/phantasia/fight.c, Revision 1.12
1.12 ! dholland 1: /* $NetBSD: fight.c,v 1.11 2009/05/25 23:08:45 dholland Exp $ */
1.2 cgd 2:
1.1 jtc 3: /*
4: * fight.c Phantasia monster fighting routines
5: */
6:
7: #include "include.h"
1.10 he 8: #undef bool
1.9 ross 9: #include <curses.h>
1.1 jtc 10:
1.12 ! dholland 11: static void awardtreasure(void);
! 12: static void callmonster(int);
! 13: static void cancelmonster(void);
! 14: static void cursedtreasure(void);
! 15: static void hitmonster(double);
! 16: static void monsthits(void);
! 17: static int pickmonster(void);
! 18: static void playerhits(void);
! 19: static void scramblestats(void);
! 20: static void throwspell(void);
! 21:
1.3 lukem 22: void
1.11 dholland 23: encounter(int particular)
1.1 jtc 24: {
1.8 jsm 25: volatile bool firsthit = Player.p_blessing; /* set if player gets
26: * the first hit */
27: volatile int flockcnt = 1; /* how many time flocked */
1.3 lukem 28:
29: /* let others know what we are doing */
30: Player.p_status = S_MONSTER;
31: writerecord(&Player, Fileloc);
1.1 jtc 32:
33: #ifdef SYS5
1.3 lukem 34: flushinp();
1.1 jtc 35: #endif
36:
1.3 lukem 37: Shield = 0.0; /* no shield up yet */
1.1 jtc 38:
1.3 lukem 39: if (particular >= 0)
40: /* monster is specified */
41: Whichmonster = particular;
42: else
43: /* pick random monster */
44: Whichmonster = pickmonster();
1.1 jtc 45:
1.3 lukem 46: setjmp(Fightenv); /* this is to enable changing fight state */
1.1 jtc 47:
1.3 lukem 48: move(6, 0);
49: clrtobot(); /* clear bottom area of screen */
1.1 jtc 50:
1.3 lukem 51: Lines = 9;
52: callmonster(Whichmonster); /* set up monster to fight */
1.1 jtc 53:
1.3 lukem 54: Luckout = FALSE; /* haven't tried to luckout yet */
1.1 jtc 55:
1.3 lukem 56: if (Curmonster.m_type == SM_MORGOTH)
57: mvprintw(4, 0, "You've encountered %s, Bane of the Council and Valar.\n",
58: Enemyname);
1.1 jtc 59:
1.3 lukem 60: if (Curmonster.m_type == SM_UNICORN) {
61: if (Player.p_virgin) {
62: printw("You just subdued %s, thanks to the virgin.\n", Enemyname);
63: Player.p_virgin = FALSE;
64: } else {
65: printw("You just saw %s running away!\n", Enemyname);
66: Curmonster.m_experience = 0.0;
67: Curmonster.m_treasuretype = 0;
68: }
69: } else
70: /* not a special monster */
71: for (;;)
72: /* print header, and arbitrate between player and
73: * monster */
1.1 jtc 74: {
1.3 lukem 75: mvprintw(6, 0, "You are being attacked by %s, EXP: %.0f (Size: %.0f)\n",
76: Enemyname, Curmonster.m_experience, Circle);
77:
78: displaystats();
79: mvprintw(1, 26, "%20.0f", Player.p_energy + Shield); /* overprint energy */
80: readmessage();
81:
82: if (Curmonster.m_type == SM_DARKLORD
83: && Player.p_blessing
84: && Player.p_charms > 0)
85: /* overpower Dark Lord with blessing and charm */
86: {
87: mvprintw(7, 0, "You just overpowered %s!", Enemyname);
88: Lines = 8;
89: Player.p_blessing = FALSE;
90: --Player.p_charms;
91: break;
92: }
93: /* allow paralyzed monster to wake up */
94: Curmonster.m_speed = MIN(Curmonster.m_speed + 1.0, Curmonster.m_maxspeed);
95:
96: if (drandom() * Curmonster.m_speed > drandom() * Player.p_speed
97: /* monster is faster */
98: && Curmonster.m_type != SM_DARKLORD
99: /* not D. L. */
100: && Curmonster.m_type != SM_SHRIEKER
101: /* not mimic */
102: && !firsthit)
103: /* monster gets a hit */
104: monsthits();
105: else
106: /* player gets a hit */
107: {
108: firsthit = FALSE;
109: playerhits();
110: }
1.1 jtc 111:
1.3 lukem 112: refresh();
1.1 jtc 113:
1.3 lukem 114: if (Lines > LINES - 2)
115: /* near bottom of screen - pause */
116: {
117: more(Lines);
118: move(Lines = 8, 0);
119: clrtobot();
120: }
121: if (Player.p_energy <= 0.0)
122: /* player died */
123: {
124: more(Lines);
125: death(Enemyname);
126: cancelmonster();
127: break; /* fight ends if the player is saved
128: * from death */
129: }
130: if (Curmonster.m_energy <= 0.0)
131: /* monster died */
132: break;
1.1 jtc 133: }
134:
1.3 lukem 135: /* give player credit for killing monster */
136: Player.p_experience += Curmonster.m_experience;
1.1 jtc 137:
1.3 lukem 138: if (drandom() < Curmonster.m_flock / 100.0)
139: /* monster flocks */
140: {
1.1 jtc 141: more(Lines);
1.3 lukem 142: ++flockcnt;
143: longjmp(Fightenv, 0);
144: /* NOTREACHED */
145: } else
146: if (Circle > 1.0
147: && Curmonster.m_treasuretype > 0
148: && drandom() > 0.2 + pow(0.4, (double) (flockcnt / 3 + Circle / 3.0)))
149: /* monster has treasure; this takes # of flocks and
150: * size into account */
1.1 jtc 151: {
1.3 lukem 152: more(Lines);
153: awardtreasure();
1.1 jtc 154: }
1.3 lukem 155: /* pause before returning */
156: getyx(stdscr, Lines, flockcnt);
157: more(Lines + 1);
158:
159: Player.p_ring.ring_inuse = FALSE; /* not using ring */
160:
161: /* clean up the screen */
162: move(4, 0);
163: clrtobot();
164: }
1.1 jtc 165:
1.12 ! dholland 166: static int
1.11 dholland 167: pickmonster(void)
1.3 lukem 168: {
169: if (Player.p_specialtype == SC_VALAR)
170: /* even chance of any monster */
171: return ((int) ROLL(0.0, 100.0));
172:
173: if (Marsh)
174: /* water monsters */
175: return ((int) ROLL(0.0, 15.0));
1.1 jtc 176:
1.3 lukem 177: else
178: if (Circle > 24)
179: /* even chance of all non-water monsters */
180: return ((int) ROLL(14.0, 86.0));
1.1 jtc 181:
1.3 lukem 182: else
183: if (Circle > 15)
184: /* chance of all non-water monsters, weighted
185: * toward middle */
186: return ((int) (ROLL(0.0, 50.0) + ROLL(14.0, 37.0)));
1.1 jtc 187:
1.3 lukem 188: else
189: if (Circle > 8)
190: /* not all non-water monsters,
191: * weighted toward middle */
192: return ((int) (ROLL(0.0, 50.0) + ROLL(14.0, 26.0)));
1.1 jtc 193:
1.3 lukem 194: else
195: if (Circle > 3)
196: /* even chance of some tamer
197: * non-water monsters */
198: return ((int) ROLL(14.0, 50.0));
199:
200: else
201: /* even chance of some of the
202: * tamest non-water monsters */
203: return ((int) ROLL(14.0, 25.0));
1.1 jtc 204: }
205:
1.12 ! dholland 206: static void
1.11 dholland 207: playerhits(void)
1.1 jtc 208: {
1.3 lukem 209: double inflict; /* damage inflicted */
210: int ch; /* input */
1.1 jtc 211:
1.3 lukem 212: mvaddstr(7, 0, "1:Melee 2:Skirmish 3:Evade 4:Spell 5:Nick ");
213:
1.4 veego 214: if (!Luckout) {
1.3 lukem 215: /* haven't tried to luckout yet */
216: if (Curmonster.m_type == SM_MORGOTH)
217: /* cannot luckout against Morgoth */
218: addstr("6:Ally ");
219: else
220: addstr("6:Luckout ");
1.4 veego 221: }
1.1 jtc 222:
1.3 lukem 223: if (Player.p_ring.ring_type != R_NONE)
224: /* player has a ring */
225: addstr("7:Use Ring ");
1.1 jtc 226: else
1.3 lukem 227: clrtoeol();
228:
229: ch = inputoption();
1.1 jtc 230:
1.3 lukem 231: move(8, 0);
232: clrtobot(); /* clear any messages from before */
233: Lines = 9;
234: mvaddstr(4, 0, "\n\n"); /* clear status area */
1.1 jtc 235:
1.3 lukem 236: switch (ch) {
1.1 jtc 237: case 'T': /* timeout; lose turn */
1.3 lukem 238: break;
1.1 jtc 239:
240: case ' ':
241: case '1': /* melee */
1.3 lukem 242: /* melee affects monster's energy and strength */
243: inflict = ROLL(Player.p_might / 2.0 + 5.0, 1.3 * Player.p_might)
244: + (Player.p_ring.ring_inuse ? Player.p_might : 0.0);
245:
246: Curmonster.m_melee += inflict;
247: Curmonster.m_strength = Curmonster.m_o_strength
248: - Curmonster.m_melee / Curmonster.m_o_energy
249: * Curmonster.m_o_strength / 4.0;
250: hitmonster(inflict);
251: break;
1.1 jtc 252:
253: case '2': /* skirmish */
1.3 lukem 254: /* skirmish affects monter's energy and speed */
255: inflict = ROLL(Player.p_might / 3.0 + 3.0, 1.1 * Player.p_might)
256: + (Player.p_ring.ring_inuse ? Player.p_might : 0.0);
257:
258: Curmonster.m_skirmish += inflict;
259: Curmonster.m_maxspeed = Curmonster.m_o_speed
260: - Curmonster.m_skirmish / Curmonster.m_o_energy
261: * Curmonster.m_o_speed / 4.0;
262: hitmonster(inflict);
263: break;
1.1 jtc 264:
265: case '3': /* evade */
1.3 lukem 266: /* use brains and speed to try to evade */
267: if ((Curmonster.m_type == SM_DARKLORD
268: || Curmonster.m_type == SM_SHRIEKER
1.1 jtc 269: /* can always run from D. L. and shrieker */
1.3 lukem 270: || drandom() * Player.p_speed * Player.p_brains
271: > drandom() * Curmonster.m_speed * Curmonster.m_brains)
272: && (Curmonster.m_type != SM_MIMIC))
273: /* cannot run from mimic */
1.1 jtc 274: {
1.3 lukem 275: mvaddstr(Lines++, 0, "You got away!");
276: cancelmonster();
277: altercoordinates(0.0, 0.0, A_NEAR);
278: } else
279: mvprintw(Lines++, 0, "%s is still after you!", Enemyname);
1.1 jtc 280:
1.3 lukem 281: break;
1.1 jtc 282:
283: case 'M':
284: case '4': /* magic spell */
1.3 lukem 285: throwspell();
286: break;
1.1 jtc 287:
288: case '5': /* nick */
1.3 lukem 289: /* hit 1 plus sword; give some experience */
290: inflict = 1.0 + Player.p_sword;
291: Player.p_experience += floor(Curmonster.m_experience / 10.0);
292: Curmonster.m_experience *= 0.92;
293: /* monster gets meaner */
294: Curmonster.m_maxspeed += 2.0;
295: Curmonster.m_speed = (Curmonster.m_speed < 0.0) ? 0.0 : Curmonster.m_speed + 2.0;
296: if (Curmonster.m_type == SM_DARKLORD)
297: /* Dark Lord; doesn't like to be nicked */
1.1 jtc 298: {
1.3 lukem 299: mvprintw(Lines++, 0,
300: "You hit %s %.0f times, and made him mad!", Enemyname, inflict);
301: Player.p_quickness /= 2.0;
302: altercoordinates(0.0, 0.0, A_FAR);
303: cancelmonster();
304: } else
305: hitmonster(inflict);
306: break;
1.1 jtc 307:
308: case 'B':
1.3 lukem 309: case '6': /* luckout */
310: if (Luckout)
311: mvaddstr(Lines++, 0, "You already tried that.");
312: else {
313: Luckout = TRUE;
314: if (Curmonster.m_type == SM_MORGOTH)
315: /* Morgoth; ally */
1.1 jtc 316: {
1.3 lukem 317: if (drandom() < Player.p_sin / 100.0) {
318: mvprintw(Lines++, 0, "%s accepted!", Enemyname);
319: cancelmonster();
320: } else
321: mvaddstr(Lines++, 0, "Nope, he's not interested.");
322: } else
323: /* normal monster; use brains for success */
1.1 jtc 324: {
1.3 lukem 325: if ((drandom() + 0.333) * Player.p_brains
326: < (drandom() + 0.333) * Curmonster.m_brains)
327: mvprintw(Lines++, 0, "You blew it, %s.", Player.p_name);
328: else {
329: mvaddstr(Lines++, 0, "You made it!");
330: Curmonster.m_energy = 0.0;
331: }
1.1 jtc 332: }
333: }
1.3 lukem 334: break;
1.1 jtc 335:
336: case '7': /* use ring */
1.3 lukem 337: if (Player.p_ring.ring_type != R_NONE) {
338: mvaddstr(Lines++, 0, "Now using ring.");
339: Player.p_ring.ring_inuse = TRUE;
340: if (Player.p_ring.ring_type != R_DLREG)
341: /* age ring */
342: --Player.p_ring.ring_duration;
1.1 jtc 343: }
1.3 lukem 344: break;
1.1 jtc 345: }
346:
347: }
348:
1.12 ! dholland 349: static void
1.11 dholland 350: monsthits(void)
1.1 jtc 351: {
1.3 lukem 352: double inflict; /* damage inflicted */
353: int ch; /* input */
1.1 jtc 354:
1.3 lukem 355: switch (Curmonster.m_type)
356: /* may be a special monster */
1.1 jtc 357: {
358: case SM_DARKLORD:
1.3 lukem 359: /* hits just enough to kill player */
360: inflict = (Player.p_energy + Shield) * 1.02;
361: goto SPECIALHIT;
1.1 jtc 362:
363: case SM_SHRIEKER:
1.3 lukem 364: /* call a big monster */
365: mvaddstr(Lines++, 0,
366: "Shrieeeek!! You scared it, and it called one of its friends.");
367: more(Lines);
368: Whichmonster = (int) ROLL(70.0, 30.0);
369: longjmp(Fightenv, 0);
370: /* NOTREACHED */
1.1 jtc 371:
372: case SM_BALROG:
1.3 lukem 373: /* take experience away */
374: inflict = ROLL(10.0, Curmonster.m_strength);
375: inflict = MIN(Player.p_experience, inflict);
376: mvprintw(Lines++, 0,
377: "%s took away %.0f experience points.", Enemyname, inflict);
378: Player.p_experience -= inflict;
379: return;
1.1 jtc 380:
381: case SM_FAERIES:
1.3 lukem 382: if (Player.p_holywater > 0)
383: /* holy water kills when monster tries to hit */
1.1 jtc 384: {
1.3 lukem 385: mvprintw(Lines++, 0, "Your holy water killed it!");
386: --Player.p_holywater;
387: Curmonster.m_energy = 0.0;
388: return;
1.1 jtc 389: }
1.3 lukem 390: break;
1.1 jtc 391:
392: case SM_NONE:
1.3 lukem 393: /* normal hit */
394: break;
1.1 jtc 395:
396: default:
1.3 lukem 397: if (drandom() > 0.2)
398: /* normal hit */
399: break;
1.1 jtc 400:
1.3 lukem 401: /* else special things */
402: switch (Curmonster.m_type) {
1.1 jtc 403: case SM_LEANAN:
1.3 lukem 404: /* takes some of the player's strength */
405: inflict = ROLL(1.0, (Circle - 1.0) / 2.0);
406: inflict = MIN(Player.p_strength, inflict);
1.7 jdc 407: mvprintw(Lines++, 0, "%s sapped %.0f of your strength!",
1.3 lukem 408: Enemyname, inflict);
409: Player.p_strength -= inflict;
410: Player.p_might -= inflict;
411: break;
1.1 jtc 412:
413: case SM_SARUMAN:
1.3 lukem 414: if (Player.p_palantir)
415: /* take away palantir */
1.1 jtc 416: {
1.3 lukem 417: mvprintw(Lines++, 0, "Wormtongue stole your palantir!");
418: Player.p_palantir = FALSE;
419: } else
420: if (drandom() > 0.5)
421: /* gems turn to gold */
422: {
423: mvprintw(Lines++, 0,
424: "%s transformed your gems into gold!", Enemyname);
425: Player.p_gold += Player.p_gems;
426: Player.p_gems = 0.0;
427: } else
428: /* scramble some stats */
429: {
430: mvprintw(Lines++, 0, "%s scrambled your stats!", Enemyname);
431: scramblestats();
432: }
433: break;
1.1 jtc 434:
435: case SM_THAUMATURG:
1.3 lukem 436: /* transport player */
437: mvprintw(Lines++, 0, "%s transported you!", Enemyname);
438: altercoordinates(0.0, 0.0, A_FAR);
439: cancelmonster();
440: break;
1.1 jtc 441:
442: case SM_VORTEX:
1.3 lukem 443: /* suck up some mana */
444: inflict = ROLL(0, 7.5 * Circle);
445: inflict = MIN(Player.p_mana, floor(inflict));
446: mvprintw(Lines++, 0,
447: "%s sucked up %.0f of your mana!", Enemyname, inflict);
448: Player.p_mana -= inflict;
449: break;
1.1 jtc 450:
451: case SM_NAZGUL:
1.3 lukem 452: /* try to take ring if player has one */
453: if (Player.p_ring.ring_type != R_NONE)
454: /* player has a ring */
1.1 jtc 455: {
1.3 lukem 456: mvaddstr(Lines++, 0, "Will you relinguish your ring ? ");
457: ch = getanswer("YN", FALSE);
458: if (ch == 'Y')
459: /* take ring away */
460: {
461: Player.p_ring.ring_type = R_NONE;
462: Player.p_ring.ring_inuse = FALSE;
463: cancelmonster();
464: break;
465: }
1.1 jtc 466: }
1.3 lukem 467: /* otherwise, take some brains */
468: mvprintw(Lines++, 0,
469: "%s neutralized 1/5 of your brain!", Enemyname);
470: Player.p_brains *= 0.8;
471: break;
1.1 jtc 472:
473: case SM_TIAMAT:
1.3 lukem 474: /* take some gold and gems */
475: mvprintw(Lines++, 0,
476: "%s took half your gold and gems and flew off.", Enemyname);
477: Player.p_gold /= 2.0;
478: Player.p_gems /= 2.0;
479: cancelmonster();
480: break;
1.1 jtc 481:
482: case SM_KOBOLD:
1.3 lukem 483: /* steal a gold piece and run */
484: mvprintw(Lines++, 0,
485: "%s stole one gold piece and ran away.", Enemyname);
486: Player.p_gold = MAX(0.0, Player.p_gold - 1.0);
487: cancelmonster();
488: break;
1.1 jtc 489:
490: case SM_SHELOB:
1.3 lukem 491: /* bite and (medium) poison */
492: mvprintw(Lines++, 0,
493: "%s has bitten and poisoned you!", Enemyname);
494: Player.p_poison -= 1.0;
495: break;
1.1 jtc 496:
497: case SM_LAMPREY:
1.3 lukem 498: /* bite and (small) poison */
499: mvprintw(Lines++, 0, "%s bit and poisoned you!", Enemyname);
500: Player.p_poison += 0.25;
501: break;
1.1 jtc 502:
503: case SM_BONNACON:
1.3 lukem 504: /* fart and run */
505: mvprintw(Lines++, 0, "%s farted and scampered off.", Enemyname);
506: Player.p_energy /= 2.0; /* damage from fumes */
507: cancelmonster();
508: break;
1.1 jtc 509:
510: case SM_SMEAGOL:
1.3 lukem 511: if (Player.p_ring.ring_type != R_NONE)
512: /* try to steal ring */
1.1 jtc 513: {
1.3 lukem 514: mvprintw(Lines++, 0,
515: "%s tried to steal your ring, ", Enemyname);
516: if (drandom() > 0.1)
517: addstr("but was unsuccessful.");
518: else {
519: addstr("and ran away with it!");
520: Player.p_ring.ring_type = R_NONE;
521: cancelmonster();
522: }
1.1 jtc 523: }
1.3 lukem 524: break;
1.1 jtc 525:
526: case SM_SUCCUBUS:
1.3 lukem 527: /* inflict damage through shield */
528: inflict = ROLL(15.0, Circle * 10.0);
529: inflict = MIN(inflict, Player.p_energy);
530: mvprintw(Lines++, 0, "%s sapped %.0f of your energy.",
531: Enemyname, inflict);
532: Player.p_energy -= inflict;
533: break;
1.1 jtc 534:
535: case SM_CERBERUS:
1.3 lukem 536: /* take all metal treasures */
537: mvprintw(Lines++, 0,
538: "%s took all your metal treasures!", Enemyname);
539: Player.p_crowns = 0;
540: Player.p_sword =
541: Player.p_shield =
542: Player.p_gold = 0.0;
543: cancelmonster();
544: break;
1.1 jtc 545:
546: case SM_UNGOLIANT:
1.3 lukem 547: /* (large) poison and take a quickness */
548: mvprintw(Lines++, 0,
549: "%s poisoned you, and took one quik.", Enemyname);
550: Player.p_poison += 5.0;
551: Player.p_quickness -= 1.0;
552: break;
1.1 jtc 553:
554: case SM_JABBERWOCK:
1.3 lukem 555: /* fly away, and leave either a Jubjub bird or
556: * Bonnacon */
557: mvprintw(Lines++, 0,
558: "%s flew away, and left you to contend with one of its friends.",
559: Enemyname);
1.6 jdolecek 560: Whichmonster = 55 + ((drandom() > 0.5) ? 22 : 0);
1.3 lukem 561: longjmp(Fightenv, 0);
562: /* NOTREACHED */
1.1 jtc 563:
564: case SM_TROLL:
1.3 lukem 565: /* partially regenerate monster */
566: mvprintw(Lines++, 0,
567: "%s partially regenerated his energy.!", Enemyname);
568: Curmonster.m_energy +=
569: floor((Curmonster.m_o_energy - Curmonster.m_energy) / 2.0);
570: Curmonster.m_strength = Curmonster.m_o_strength;
571: Curmonster.m_melee = Curmonster.m_skirmish = 0.0;
572: Curmonster.m_maxspeed = Curmonster.m_o_speed;
573: break;
1.1 jtc 574:
575: case SM_WRAITH:
1.3 lukem 576: if (!Player.p_blindness)
577: /* make blind */
1.1 jtc 578: {
1.3 lukem 579: mvprintw(Lines++, 0, "%s blinded you!", Enemyname);
580: Player.p_blindness = TRUE;
581: Enemyname = "A monster";
1.1 jtc 582: }
1.3 lukem 583: break;
1.1 jtc 584: }
1.3 lukem 585: return;
1.1 jtc 586: }
587:
1.3 lukem 588: /* fall through to here if monster inflicts a normal hit */
589: inflict = drandom() * Curmonster.m_strength + 0.5;
1.1 jtc 590: SPECIALHIT:
1.3 lukem 591: mvprintw(Lines++, 0, "%s hit you %.0f times!", Enemyname, inflict);
1.1 jtc 592:
1.3 lukem 593: if ((Shield -= inflict) < 0) {
594: Player.p_energy += Shield;
595: Shield = 0.0;
1.1 jtc 596: }
597: }
598:
1.12 ! dholland 599: static void
1.11 dholland 600: cancelmonster(void)
1.1 jtc 601: {
1.3 lukem 602: Curmonster.m_energy = 0.0;
603: Curmonster.m_experience = 0.0;
604: Curmonster.m_treasuretype = 0;
605: Curmonster.m_flock = 0.0;
1.1 jtc 606: }
607:
1.12 ! dholland 608: static void
1.11 dholland 609: hitmonster(double inflict)
1.1 jtc 610: {
1.3 lukem 611: mvprintw(Lines++, 0, "You hit %s %.0f times!", Enemyname, inflict);
612: Curmonster.m_energy -= inflict;
613: if (Curmonster.m_energy > 0.0) {
614: if (Curmonster.m_type == SM_DARKLORD || Curmonster.m_type == SM_SHRIEKER)
615: /* special monster didn't die */
616: monsthits();
617: } else
618: /* monster died. print message. */
1.1 jtc 619: {
1.3 lukem 620: if (Curmonster.m_type == SM_MORGOTH)
621: mvaddstr(Lines++, 0, "You have defeated Morgoth, but he may return. . .");
622: else
623: /* all other types of monsters */
624: {
625: mvprintw(Lines++, 0, "You killed it. Good work, %s.", Player.p_name);
626:
627: if (Curmonster.m_type == SM_MIMIC
628: && strcmp(Curmonster.m_name, "A Mimic") != 0
629: && !Player.p_blindness)
630: mvaddstr(Lines++, 0, "The body slowly changes into the form of a mimic.");
631: }
1.1 jtc 632: }
633: }
634:
1.12 ! dholland 635: static void
1.11 dholland 636: throwspell(void)
1.1 jtc 637: {
1.3 lukem 638: double inflict; /* damage inflicted */
639: double dtemp; /* for dtemporary calculations */
640: int ch; /* input */
641:
642: inflict = 0;
643: mvaddstr(7, 0, "\n\n"); /* clear menu area */
644:
645: if (Player.p_magiclvl >= ML_ALLORNOTHING)
646: mvaddstr(7, 0, "1:All or Nothing ");
647: if (Player.p_magiclvl >= ML_MAGICBOLT)
648: addstr("2:Magic Bolt ");
649: if (Player.p_magiclvl >= ML_FORCEFIELD)
650: addstr("3:Force Field ");
651: if (Player.p_magiclvl >= ML_XFORM)
652: addstr("4:Transform ");
653: if (Player.p_magiclvl >= ML_INCRMIGHT)
654: addstr("5:Increase Might\n");
655: if (Player.p_magiclvl >= ML_INVISIBLE)
656: mvaddstr(8, 0, "6:Invisibility ");
657: if (Player.p_magiclvl >= ML_XPORT)
658: addstr("7:Transport ");
659: if (Player.p_magiclvl >= ML_PARALYZE)
660: addstr("8:Paralyze ");
661: if (Player.p_specialtype >= SC_COUNCIL)
662: addstr("9:Specify");
663: mvaddstr(4, 0, "Spell ? ");
664:
665: ch = getanswer(" ", TRUE);
666:
667: mvaddstr(7, 0, "\n\n"); /* clear menu area */
668:
669: if (Curmonster.m_type == SM_MORGOTH && ch != '3')
670: /* can only throw force field against Morgoth */
671: ILLSPELL();
672: else
673: switch (ch) {
674: case '1': /* all or nothing */
675: if (drandom() < 0.25)
676: /* success */
677: {
678: inflict = Curmonster.m_energy * 1.01 + 1.0;
1.1 jtc 679:
1.3 lukem 680: if (Curmonster.m_type == SM_DARKLORD)
681: /* all or nothing doesn't quite work
682: * against D. L. */
683: inflict *= 0.9;
684: } else
685: /* failure -- monster gets stronger and
686: * quicker */
687: {
688: Curmonster.m_o_strength = Curmonster.m_strength *= 2.0;
689: Curmonster.m_maxspeed *= 2.0;
690: Curmonster.m_o_speed *= 2.0;
1.1 jtc 691:
1.3 lukem 692: /* paralyzed monsters wake up a bit */
693: Curmonster.m_speed = MAX(1.0, Curmonster.m_speed * 2.0);
1.1 jtc 694: }
695:
1.3 lukem 696: if (Player.p_mana >= MM_ALLORNOTHING)
697: /* take a mana if player has one */
698: Player.p_mana -= MM_ALLORNOTHING;
1.1 jtc 699:
1.3 lukem 700: hitmonster(inflict);
701: break;
702:
703: case '2': /* magic bolt */
704: if (Player.p_magiclvl < ML_MAGICBOLT)
705: ILLSPELL();
706: else {
707: do
708: /* prompt for amount to expend */
709: {
710: mvaddstr(4, 0, "How much mana for bolt? ");
711: dtemp = floor(infloat());
712: }
713: while (dtemp < 0.0 || dtemp > Player.p_mana);
714:
715: Player.p_mana -= dtemp;
716:
717: if (Curmonster.m_type == SM_DARKLORD)
718: /* magic bolts don't work against D.
719: * L. */
720: inflict = 0.0;
721: else
722: inflict = dtemp * ROLL(15.0, sqrt(Player.p_magiclvl / 3.0 + 1.0));
723: mvaddstr(5, 0, "Magic Bolt fired!\n");
724: hitmonster(inflict);
725: }
726: break;
1.1 jtc 727:
1.3 lukem 728: case '3': /* force field */
729: if (Player.p_magiclvl < ML_FORCEFIELD)
730: ILLSPELL();
731: else
732: if (Player.p_mana < MM_FORCEFIELD)
733: NOMANA();
734: else {
735: Player.p_mana -= MM_FORCEFIELD;
736: Shield = (Player.p_maxenergy + Player.p_shield) * 4.2 + 45.0;
737: mvaddstr(5, 0, "Force Field up.\n");
738: }
739: break;
1.1 jtc 740:
1.3 lukem 741: case '4': /* transform */
742: if (Player.p_magiclvl < ML_XFORM)
743: ILLSPELL();
744: else
745: if (Player.p_mana < MM_XFORM)
746: NOMANA();
747: else {
748: Player.p_mana -= MM_XFORM;
749: Whichmonster = (int) ROLL(0.0, 100.0);
750: longjmp(Fightenv, 0);
751: /* NOTREACHED */
752: }
753: break;
1.1 jtc 754:
1.3 lukem 755: case '5': /* increase might */
756: if (Player.p_magiclvl < ML_INCRMIGHT)
757: ILLSPELL();
758: else
759: if (Player.p_mana < MM_INCRMIGHT)
760: NOMANA();
761: else {
762: Player.p_mana -= MM_INCRMIGHT;
763: Player.p_might +=
764: (1.2 * (Player.p_strength + Player.p_sword)
765: + 5.0 - Player.p_might) / 2.0;
766: mvprintw(5, 0, "New strength: %.0f\n", Player.p_might);
767: }
768: break;
1.1 jtc 769:
1.3 lukem 770: case '6': /* invisible */
771: if (Player.p_magiclvl < ML_INVISIBLE)
772: ILLSPELL();
773: else
774: if (Player.p_mana < MM_INVISIBLE)
775: NOMANA();
776: else {
777: Player.p_mana -= MM_INVISIBLE;
778: Player.p_speed +=
779: (1.2 * (Player.p_quickness + Player.p_quksilver)
780: + 5.0 - Player.p_speed) / 2.0;
781: mvprintw(5, 0, "New quickness: %.0f\n", Player.p_speed);
782: }
783: break;
1.1 jtc 784:
1.3 lukem 785: case '7': /* transport */
786: if (Player.p_magiclvl < ML_XPORT)
787: ILLSPELL();
788: else
789: if (Player.p_mana < MM_XPORT)
790: NOMANA();
791: else {
792: Player.p_mana -= MM_XPORT;
793: if (Player.p_brains + Player.p_magiclvl
794: < Curmonster.m_experience / 200.0 * drandom()) {
795: mvaddstr(5, 0, "Transport backfired!\n");
796: altercoordinates(0.0, 0.0, A_FAR);
797: cancelmonster();
798: } else {
799: mvprintw(5, 0, "%s is transported.\n", Enemyname);
800: if (drandom() < 0.3)
801: /* monster didn't drop
802: * its treasure */
803: Curmonster.m_treasuretype = 0;
1.1 jtc 804:
1.3 lukem 805: Curmonster.m_energy = 0.0;
806: }
807: }
808: break;
1.1 jtc 809:
1.3 lukem 810: case '8': /* paralyze */
811: if (Player.p_magiclvl < ML_PARALYZE)
812: ILLSPELL();
813: else
814: if (Player.p_mana < MM_PARALYZE)
815: NOMANA();
816: else {
817: Player.p_mana -= MM_PARALYZE;
818: if (Player.p_magiclvl >
819: Curmonster.m_experience / 1000.0 * drandom()) {
820: mvprintw(5, 0, "%s is held.\n", Enemyname);
821: Curmonster.m_speed = -2.0;
822: } else
823: mvaddstr(5, 0, "Monster unaffected.\n");
824: }
825: break;
1.1 jtc 826:
1.3 lukem 827: case '9': /* specify */
828: if (Player.p_specialtype < SC_COUNCIL)
829: ILLSPELL();
830: else
831: if (Player.p_mana < MM_SPECIFY)
832: NOMANA();
833: else {
834: Player.p_mana -= MM_SPECIFY;
835: mvaddstr(5, 0, "Which monster do you want [0-99] ? ");
836: Whichmonster = (int) infloat();
837: Whichmonster = MAX(0, MIN(99, Whichmonster));
838: longjmp(Fightenv, 0);
839: /* NOTREACHED */
840: }
841: break;
842: }
1.1 jtc 843: }
844:
1.12 ! dholland 845: static void
1.11 dholland 846: callmonster(int which)
1.1 jtc 847: {
1.3 lukem 848: struct monster Othermonster; /* to find a name for mimics */
1.1 jtc 849:
1.3 lukem 850: which = MIN(which, 99); /* make sure within range */
1.1 jtc 851:
1.3 lukem 852: /* fill structure */
1.5 jsm 853: fseek(Monstfp, (long) which * (long) SZ_MONSTERSTRUCT, SEEK_SET);
1.3 lukem 854: fread((char *) &Curmonster, SZ_MONSTERSTRUCT, 1, Monstfp);
1.1 jtc 855:
1.3 lukem 856: /* handle some special monsters */
857: if (Curmonster.m_type == SM_MODNAR) {
858: if (Player.p_specialtype < SC_COUNCIL)
859: /* randomize some stats */
860: {
861: Curmonster.m_strength *= drandom() + 0.5;
862: Curmonster.m_brains *= drandom() + 0.5;
863: Curmonster.m_speed *= drandom() + 0.5;
864: Curmonster.m_energy *= drandom() + 0.5;
865: Curmonster.m_experience *= drandom() + 0.5;
866: Curmonster.m_treasuretype =
867: (int) ROLL(0.0, (double) Curmonster.m_treasuretype);
868: } else
869: /* make Modnar into Morgoth */
870: {
871: strcpy(Curmonster.m_name, "Morgoth");
872: Curmonster.m_strength = drandom() * (Player.p_maxenergy + Player.p_shield) / 1.4
873: + drandom() * (Player.p_maxenergy + Player.p_shield) / 1.5;
874: Curmonster.m_brains = Player.p_brains;
875: Curmonster.m_energy = Player.p_might * 30.0;
876: Curmonster.m_type = SM_MORGOTH;
877: Curmonster.m_speed = Player.p_speed * 1.1
1.6 jdolecek 878: + ((Player.p_specialtype == SC_EXVALAR) ? Player.p_speed : 0.0);
1.3 lukem 879: Curmonster.m_flock = 0.0;
880: Curmonster.m_treasuretype = 0;
881: Curmonster.m_experience = 0.0;
882: }
883: } else
884: if (Curmonster.m_type == SM_MIMIC)
885: /* pick another name */
886: {
887: which = (int) ROLL(0.0, 100.0);
1.5 jsm 888: fseek(Monstfp, (long) which * (long) SZ_MONSTERSTRUCT, SEEK_SET);
1.3 lukem 889: fread(&Othermonster, SZ_MONSTERSTRUCT, 1, Monstfp);
890: strcpy(Curmonster.m_name, Othermonster.m_name);
891: }
892: truncstring(Curmonster.m_name);
1.1 jtc 893:
1.3 lukem 894: if (Curmonster.m_type != SM_MORGOTH)
895: /* adjust stats based on which circle player is in */
1.1 jtc 896: {
1.3 lukem 897: Curmonster.m_strength *= (1.0 + Circle / 2.0);
898: Curmonster.m_brains *= Circle;
899: Curmonster.m_speed += Circle * 1.e-9;
900: Curmonster.m_energy *= Circle;
901: Curmonster.m_experience *= Circle;
1.1 jtc 902: }
1.3 lukem 903: if (Player.p_blindness)
904: /* cannot see monster if blind */
905: Enemyname = "A monster";
906: else
907: Enemyname = Curmonster.m_name;
1.1 jtc 908:
1.3 lukem 909: if (Player.p_speed <= 0.0)
910: /* make Player.p_speed positive */
1.1 jtc 911: {
1.3 lukem 912: Curmonster.m_speed += -Player.p_speed;
913: Player.p_speed = 1.0;
1.1 jtc 914: }
1.3 lukem 915: /* fill up the rest of the structure */
916: Curmonster.m_o_strength = Curmonster.m_strength;
917: Curmonster.m_o_speed = Curmonster.m_maxspeed = Curmonster.m_speed;
918: Curmonster.m_o_energy = Curmonster.m_energy;
919: Curmonster.m_melee = Curmonster.m_skirmish = 0.0;
1.1 jtc 920: }
921:
1.12 ! dholland 922: static void
1.11 dholland 923: awardtreasure(void)
1.1 jtc 924: {
1.3 lukem 925: int whichtreasure; /* calculated treasure to grant */
926: int temp; /* temporary */
927: int ch; /* input */
928: double treasuretype; /* monster's treasure type */
929: double gold = 0.0; /* gold awarded */
930: double gems = 0.0; /* gems awarded */
931: double dtemp; /* for temporary calculations */
932:
933: whichtreasure = (int) ROLL(1.0, 3.0); /* pick a treasure */
934: treasuretype = (double) Curmonster.m_treasuretype;
935:
936: move(4, 0);
937: clrtobot();
938: move(6, 0);
1.1 jtc 939:
1.3 lukem 940: if (drandom() > 0.65)
941: /* gold and gems */
1.1 jtc 942: {
1.3 lukem 943: if (Curmonster.m_treasuretype > 7)
944: /* gems */
945: {
946: gems = ROLL(1.0, (treasuretype - 7.0)
947: * (treasuretype - 7.0) * (Circle - 1.0) / 4.0);
948: printw("You have discovered %.0f gems!", gems);
949: } else
950: /* gold */
1.1 jtc 951: {
1.3 lukem 952: gold = ROLL(treasuretype * 10.0, treasuretype
953: * treasuretype * 10.0 * (Circle - 1.0));
954: printw("You have found %.0f gold pieces.", gold);
1.1 jtc 955: }
956:
1.3 lukem 957: addstr(" Do you want to pick them up ? ");
958: ch = getanswer("NY", FALSE);
959: addstr("\n\n");
960:
1.4 veego 961: if (ch == 'Y') {
1.3 lukem 962: if (drandom() < treasuretype / 35.0 + 0.04)
963: /* cursed */
964: {
965: addstr("They were cursed!\n");
966: cursedtreasure();
967: } else
968: collecttaxes(gold, gems);
1.4 veego 969: }
1.1 jtc 970:
971: return;
1.3 lukem 972: } else
973: /* other treasures */
974: {
975: addstr("You have found some treasure. Do you want to inspect it ? ");
976: ch = getanswer("NY", FALSE);
977: addstr("\n\n");
1.1 jtc 978:
1.3 lukem 979: if (ch != 'Y')
980: return;
981: else
982: if (drandom() < 0.08 && Curmonster.m_treasuretype != 4) {
983: addstr("It was cursed!\n");
984: cursedtreasure();
985: return;
986: } else
987: switch (Curmonster.m_treasuretype) {
988: case 1: /* treasure type 1 */
989: switch (whichtreasure) {
990: case 1:
991: addstr("You've discovered a power booster!\n");
992: Player.p_mana += ROLL(Circle * 4.0, Circle * 30.0);
993: break;
994:
995: case 2:
996: addstr("You have encountered a druid.\n");
997: Player.p_experience +=
998: ROLL(0.0, 2000.0 + Circle * 400.0);
999: break;
1000:
1001: case 3:
1002: addstr("You have found a holy orb.\n");
1003: Player.p_sin = MAX(0.0, Player.p_sin - 0.25);
1004: break;
1005: }
1006: break;
1007: /* end treasure type 1 */
1.1 jtc 1008:
1.3 lukem 1009: case 2: /* treasure type 2 */
1010: switch (whichtreasure) {
1011: case 1:
1012: addstr("You have found an amulet.\n");
1013: ++Player.p_amulets;
1014: break;
1015:
1016: case 2:
1017: addstr("You've found some holy water!\n");
1018: ++Player.p_holywater;
1019: break;
1020:
1021: case 3:
1022: addstr("You've met a hermit!\n");
1023: Player.p_sin *= 0.75;
1024: Player.p_mana += 12.0 * Circle;
1025: break;
1026: }
1027: break;
1028: /* end treasure type 2 */
1.1 jtc 1029:
1.3 lukem 1030: case 3: /* treasure type 3 */
1031: switch (whichtreasure) {
1032: case 1:
1033: dtemp = ROLL(7.0, 30.0 + Circle / 10.0);
1034: printw("You've found a +%.0f shield!\n", dtemp);
1035: if (dtemp >= Player.p_shield)
1036: Player.p_shield = dtemp;
1037: else
1038: SOMEBETTER();
1039: break;
1040:
1041: case 2:
1042: addstr("You have rescued a virgin. Will you be honorable ? ");
1043: ch = getanswer("NY", FALSE);
1044: addstr("\n\n");
1045: if (ch == 'Y')
1046: Player.p_virgin = TRUE;
1047: else {
1048: Player.p_experience += 2000.0 * Circle;
1049: ++Player.p_sin;
1050: }
1051: break;
1052:
1053: case 3:
1054: addstr("You've discovered some athelas!\n");
1055: --Player.p_poison;
1056: break;
1057: }
1058: break;
1059: /* end treasure type 3 */
1.1 jtc 1060:
1.3 lukem 1061: case 4: /* treasure type 4 */
1062: addstr("You've found a scroll. Will you read it ? ");
1063: ch = getanswer("NY", FALSE);
1064: addstr("\n\n");
1065:
1066: if (ch == 'Y')
1067: switch ((int) ROLL(1, 6)) {
1068: case 1:
1069: addstr("It throws up a shield for you next monster.\n");
1070: getyx(stdscr, whichtreasure, ch);
1071: more(whichtreasure);
1072: Shield =
1073: (Player.p_maxenergy + Player.p_energy) * 5.5 + Circle * 50.0;
1074: Whichmonster = pickmonster();
1075: longjmp(Fightenv, 0);
1076: /* NOTREACHED */
1077:
1078: case 2:
1079: addstr("It makes you invisible for you next monster.\n");
1080: getyx(stdscr, whichtreasure, ch);
1081: more(whichtreasure);
1082: Player.p_speed = 1e6;
1083: Whichmonster = pickmonster();
1084: longjmp(Fightenv, 0);
1085: /* NOTREACHED */
1086:
1087: case 3:
1088: addstr("It increases your strength ten fold to fight your next monster.\n");
1089: getyx(stdscr, whichtreasure, ch);
1090: more(whichtreasure);
1091: Player.p_might *= 10.0;
1092: Whichmonster = pickmonster();
1093: longjmp(Fightenv, 0);
1094: /* NOTREACHED */
1095:
1096: case 4:
1097: addstr("It is a general knowledge scroll.\n");
1098: Player.p_brains += ROLL(2.0, Circle);
1099: Player.p_magiclvl += ROLL(1.0, Circle / 2.0);
1100: break;
1101:
1102: case 5:
1103: addstr("It tells you how to pick your next monster.\n");
1104: addstr("Which monster do you want [0-99] ? ");
1105: Whichmonster = (int) infloat();
1106: Whichmonster = MIN(99, MAX(0, Whichmonster));
1107: longjmp(Fightenv, 0);
1108:
1109: case 6:
1110: addstr("It was cursed!\n");
1111: cursedtreasure();
1112: break;
1113: }
1114: break;
1115: /* end treasure type 4 */
1.1 jtc 1116:
1.3 lukem 1117: case 5: /* treasure type 5 */
1118: switch (whichtreasure) {
1119: case 1:
1120: dtemp = ROLL(Circle / 4.0 + 5.0, Circle / 2.0 + 9.0);
1121: printw("You've discovered a +%.0f dagger.\n", dtemp);
1122: if (dtemp >= Player.p_sword)
1123: Player.p_sword = dtemp;
1124: else
1125: SOMEBETTER();
1126: break;
1127:
1128: case 2:
1129: dtemp = ROLL(7.5 + Circle * 3.0, Circle * 2.0 + 160.0);
1130: printw("You have found some +%.0f armour!\n", dtemp);
1131: if (dtemp >= Player.p_shield)
1132: Player.p_shield = dtemp;
1133: else
1134: SOMEBETTER();
1135: break;
1136:
1137: case 3:
1138: addstr("You've found a tablet.\n");
1139: Player.p_brains += 4.5 * Circle;
1140: break;
1141: }
1142: break;
1143: /* end treasure type 5 */
1.1 jtc 1144:
1.3 lukem 1145: case 6: /* treasure type 6 */
1146: switch (whichtreasure) {
1147: case 1:
1148: addstr("You've found a priest.\n");
1149: Player.p_energy = Player.p_maxenergy + Player.p_shield;
1150: Player.p_sin /= 2.0;
1151: Player.p_mana += 24.0 * Circle;
1152: Player.p_brains += Circle;
1153: break;
1154:
1155: case 2:
1156: addstr("You have come upon Robin Hood!\n");
1157: Player.p_shield += Circle * 2.0;
1158: Player.p_strength += Circle / 2.5 + 1.0;
1159: break;
1160:
1161: case 3:
1162: dtemp = ROLL(2.0 + Circle / 4.0, Circle / 1.2 + 10.0);
1163: printw("You have found a +%.0f axe!\n", dtemp);
1164: if (dtemp >= Player.p_sword)
1165: Player.p_sword = dtemp;
1166: else
1167: SOMEBETTER();
1168: break;
1169: }
1170: break;
1171: /* end treasure type 6 */
1.1 jtc 1172:
1.3 lukem 1173: case 7: /* treasure type 7 */
1174: switch (whichtreasure) {
1175: case 1:
1176: addstr("You've discovered a charm!\n");
1177: ++Player.p_charms;
1178: break;
1179:
1180: case 2:
1181: addstr("You have encountered Merlyn!\n");
1182: Player.p_brains += Circle + 5.0;
1183: Player.p_magiclvl += Circle / 3.0 + 5.0;
1184: Player.p_mana += Circle * 10.0;
1185: break;
1186:
1187: case 3:
1188: dtemp = ROLL(5.0 + Circle / 3.0, Circle / 1.5 + 20.0);
1189: printw("You have found a +%.0f war hammer!\n", dtemp);
1190: if (dtemp >= Player.p_sword)
1191: Player.p_sword = dtemp;
1192: else
1193: SOMEBETTER();
1194: break;
1195: }
1196: break;
1197: /* end treasure type 7 */
1.1 jtc 1198:
1.3 lukem 1199: case 8: /* treasure type 8 */
1200: switch (whichtreasure) {
1201: case 1:
1202: addstr("You have found a healing potion.\n");
1203: Player.p_poison = MIN(-2.0, Player.p_poison - 2.0);
1204: break;
1205:
1206: case 2:
1207: addstr("You have discovered a transporter. Do you wish to go anywhere ? ");
1208: ch = getanswer("NY", FALSE);
1209: addstr("\n\n");
1210: if (ch == 'Y') {
1211: double x, y;
1212:
1213: addstr("X Y Coordinates ? ");
1214: getstring(Databuf, SZ_DATABUF);
1215: sscanf(Databuf, "%lf %lf", &x, &y);
1216: altercoordinates(x, y, A_FORCED);
1217: }
1218: break;
1219:
1220: case 3:
1221: dtemp = ROLL(10.0 + Circle / 1.2, Circle * 3.0 + 30.0);
1222: printw("You've found a +%.0f sword!\n", dtemp);
1223: if (dtemp >= Player.p_sword)
1224: Player.p_sword = dtemp;
1225: else
1226: SOMEBETTER();
1227: break;
1228: }
1229: break;
1230: /* end treasure type 8 */
1.1 jtc 1231:
1.3 lukem 1232: case 10:
1233: case 11:
1234: case 12:
1235: case 13: /* treasure types 10 - 13 */
1236: if (drandom() < 0.33) {
1237: if (Curmonster.m_treasuretype == 10) {
1238: addstr("You've found a pair of elven boots!\n");
1239: Player.p_quickness += 2.0;
1240: break;
1241: } else
1242: if (Curmonster.m_treasuretype == 11
1243: && !Player.p_palantir) {
1244: addstr("You've acquired Saruman's palantir.\n");
1245: Player.p_palantir = TRUE;
1246: break;
1247: } else
1248: if (Player.p_ring.ring_type == R_NONE
1249: && Player.p_specialtype < SC_COUNCIL
1250: && (Curmonster.m_treasuretype == 12
1251: || Curmonster.m_treasuretype == 13))
1252: /* roll
1253: * up
1254: * a
1255: * ring
1256: * */
1257: {
1258: if (drandom() < 0.8)
1259: /* r
1260: * e
1261: * g
1262: * u
1263: * l
1264: * a
1265: * r
1266: *
1267: * ri
1268: * n
1269: * g
1270: * s
1271: * */
1272: {
1273: if (Curmonster.m_treasuretype == 12) {
1274: whichtreasure = R_NAZREG;
1275: temp = 35;
1276: } else {
1277: whichtreasure = R_DLREG;
1278: temp = 0;
1279: }
1280: } else
1281: /* b
1282: * a
1283: * d
1284: *
1285: * ri
1286: * n
1287: * g
1288: * s
1289: * */
1290: {
1291: whichtreasure = R_BAD;
1292: temp = 15 + Statptr->c_ringduration + (int) ROLL(0, 5);
1293: }
1294:
1295: addstr("You've discovered a ring. Will you pick it up ? ");
1296: ch = getanswer("NY", FALSE);
1297: addstr("\n\n");
1298:
1299: if (ch == 'Y') {
1300: Player.p_ring.ring_type = whichtreasure;
1301: Player.p_ring.ring_duration = temp;
1302: }
1303: break;
1304: }
1.1 jtc 1305: }
1.3 lukem 1306: /* end treasure types 10 - 13 */
1307: /* fall through to treasure type 9 if
1308: * no treasure from above */
1309:
1310: case 9: /* treasure type 9 */
1311: switch (whichtreasure) {
1312: case 1:
1313: if (Player.p_level <= 1000.0
1314: && Player.p_crowns <= 3
1315: && Player.p_level >= 10.0) {
1316: addstr("You have found a golden crown!\n");
1317: ++Player.p_crowns;
1318: break;
1319: }
1320: /* fall through otherwise */
1321:
1322: case 2:
1323: addstr("You've been blessed!\n");
1324: Player.p_blessing = TRUE;
1325: Player.p_sin /= 3.0;
1326: Player.p_energy = Player.p_maxenergy + Player.p_shield;
1327: Player.p_mana += 100.0 * Circle;
1328: break;
1329:
1330: case 3:
1331: dtemp = ROLL(1.0, Circle / 5.0 + 5.0);
1332: dtemp = MIN(dtemp, 99.0);
1333: printw("You have discovered some +%.0f quicksilver!\n", dtemp);
1334: if (dtemp >= Player.p_quksilver)
1335: Player.p_quksilver = dtemp;
1336: else
1337: SOMEBETTER();
1338: break;
1.1 jtc 1339: }
1340: break;
1.3 lukem 1341: /* end treasure type 9 */
1.1 jtc 1342: }
1343: }
1344: }
1345:
1.12 ! dholland 1346: static void
1.11 dholland 1347: cursedtreasure(void)
1.1 jtc 1348: {
1.3 lukem 1349: if (Player.p_charms > 0) {
1350: addstr("But your charm saved you!\n");
1351: --Player.p_charms;
1352: } else
1353: if (Player.p_amulets > 0) {
1354: addstr("But your amulet saved you!\n");
1355: --Player.p_amulets;
1356: } else {
1357: Player.p_energy =
1358: (Player.p_maxenergy + Player.p_shield) / 10.0;
1359: Player.p_poison += 0.25;
1360: }
1.1 jtc 1361: }
1362:
1.12 ! dholland 1363: static void
1.11 dholland 1364: scramblestats(void)
1.1 jtc 1365: {
1.3 lukem 1366: double dbuf[6]; /* to put statistic in */
1367: double dtemp1, dtemp2; /* for swapping values */
1368: int first, second; /* indices for swapping */
1369: double *dptr; /* pointer for filling and emptying buf[] */
1370:
1371: /* fill buffer */
1372: dptr = &dbuf[0];
1373: *dptr++ = Player.p_strength;
1374: *dptr++ = Player.p_mana;
1375: *dptr++ = Player.p_brains;
1376: *dptr++ = Player.p_magiclvl;
1377: *dptr++ = Player.p_energy;
1378: *dptr = Player.p_sin;
1379:
1380: /* pick values to swap */
1381: first = (int) ROLL(0, 5);
1382: second = (int) ROLL(0, 5);
1383:
1384: /* swap values */
1385: dptr = &dbuf[0];
1386: dtemp1 = dptr[first];
1387: /* this expression is split to prevent a compiler loop on some
1388: * compilers */
1389: dtemp2 = dptr[second];
1390: dptr[first] = dtemp2;
1391: dptr[second] = dtemp1;
1392:
1393: /* empty buffer */
1394: Player.p_strength = *dptr++;
1395: Player.p_mana = *dptr++;
1396: Player.p_brains = *dptr++;
1397: Player.p_magiclvl = *dptr++;
1398: Player.p_energy = *dptr++;
1399: Player.p_sin = *dptr;
1.1 jtc 1400: }
CVSweb <webmaster@jp.NetBSD.org>