Annotation of src/games/phantasia/interplayer.c, Revision 1.10
1.10 ! dholland 1: /* $NetBSD: interplayer.c,v 1.9 2005/02/15 12:58:21 jsm Exp $ */
1.2 cgd 2:
1.1 jtc 3: /*
4: * interplayer.c - player to player routines for Phantasia
5: */
6:
7: #include "include.h"
1.8 he 8: #undef bool
1.7 ross 9: #include <curses.h>
1.1 jtc 10:
1.3 lukem 11: void
1.10 ! dholland 12: checkbattle(void)
1.1 jtc 13: {
1.3 lukem 14: long foeloc = 0L; /* location in file of person to fight */
1.1 jtc 15:
1.3 lukem 16: Users = 0;
1.5 jsm 17: fseek(Playersfp, 0L, SEEK_SET);
1.1 jtc 18:
1.3 lukem 19: while (fread((char *) &Other, SZ_PLAYERSTRUCT, 1, Playersfp) == 1) {
20: if (Other.p_status != S_OFF
21: && Other.p_status != S_NOTUSED
22: && Other.p_status != S_HUNGUP
23: && (Other.p_status != S_CLOAKED || Other.p_specialtype != SC_VALAR))
24: /* player is on and not a cloaked valar */
25: {
26: ++Users;
27:
28: if (Player.p_x == Other.p_x
29: && Player.p_y == Other.p_y
30: /* same coordinates */
31: && foeloc != Fileloc
32: /* not self */
33: && Player.p_status == S_PLAYING
34: && (Other.p_status == S_PLAYING || Other.p_status == S_INBATTLE)
35: /* both are playing */
36: && Other.p_specialtype != SC_VALAR
37: && Player.p_specialtype != SC_VALAR)
38: /* neither is valar */
39: {
40: battleplayer(foeloc);
41: return;
42: }
1.1 jtc 43: }
1.3 lukem 44: foeloc += SZ_PLAYERSTRUCT;
1.1 jtc 45: }
46: }
47:
1.3 lukem 48: void
1.10 ! dholland 49: battleplayer(long foeplace)
1.1 jtc 50: {
1.3 lukem 51: double dtemp; /* for temporary calculations */
52: double oldhits = 0.0; /* previous damage inflicted by foe */
53: int loop; /* for timing out */
54: int ch; /* input */
55: short oldtampered; /* old value of foe's p_tampered */
56:
57: Lines = 8;
58: Luckout = FALSE;
59: mvaddstr(4, 0, "Preparing for battle!\n");
60: refresh();
1.1 jtc 61:
62: #ifdef SYS5
1.3 lukem 63: flushinp();
1.1 jtc 64: #endif
65:
1.3 lukem 66: /* set up variables, file, etc. */
67: Player.p_status = S_INBATTLE;
68: Shield = Player.p_energy;
69:
70: /* if p_tampered is not 0, someone else may try to change it (king,
71: * etc.) */
72: Player.p_tampered = oldtampered = 1;
73: Player.p_1scratch = 0.0;
74: Player.p_istat = I_OFF;
75:
76: readrecord(&Other, foeplace);
77: if (fabs(Player.p_level - Other.p_level) > 20.0)
78: /* see if players are greatly mismatched */
1.1 jtc 79: {
1.3 lukem 80: dtemp = (Player.p_level - Other.p_level) / MAX(Player.p_level, Other.p_level);
81: if (dtemp < -0.5)
82: /* foe outweighs this one */
83: Player.p_speed *= 2.0;
1.1 jtc 84: }
1.3 lukem 85: writerecord(&Player, Fileloc); /* write out all our info */
1.1 jtc 86:
1.3 lukem 87: if (Player.p_blindness)
88: Enemyname = "someone";
89: else
90: Enemyname = Other.p_name;
1.1 jtc 91:
1.3 lukem 92: mvprintw(6, 0, "You have encountered %s Level: %.0f\n", Enemyname, Other.p_level);
93: refresh();
1.1 jtc 94:
1.3 lukem 95: for (loop = 0; Other.p_status != S_INBATTLE && loop < 30; ++loop)
96: /* wait for foe to respond */
1.1 jtc 97: {
1.3 lukem 98: readrecord(&Other, foeplace);
99: sleep(1);
1.1 jtc 100: }
101:
1.3 lukem 102: if (Other.p_status != S_INBATTLE)
103: /* foe did not respond */
1.1 jtc 104: {
1.3 lukem 105: mvprintw(5, 0, "%s is not responding.\n", Enemyname);
106: goto LEAVE;
1.1 jtc 107: }
1.3 lukem 108: /* else, we are ready to battle */
1.1 jtc 109:
1.3 lukem 110: move(4, 0);
111: clrtoeol();
1.1 jtc 112:
1.3 lukem 113: /*
114: * determine who is first master
115: * if neither player is faster, check level
116: * if neither level is greater, battle is not allowed
117: * (this should never happen, but we have to handle it)
118: */
119: if (Player.p_speed > Other.p_speed)
120: Foestrikes = FALSE;
1.1 jtc 121: else
1.3 lukem 122: if (Other.p_speed > Player.p_speed)
123: Foestrikes = TRUE;
124: else
125: if (Player.p_level > Other.p_level)
126: Foestrikes = FALSE;
127: else
128: if (Other.p_level > Player.p_level)
129: Foestrikes = TRUE;
130: else
131: /* no one is faster */
132: {
133: printw("You can't fight %s yet.", Enemyname);
134: goto LEAVE;
135: }
136:
137: for (;;) {
138: displaystats();
139: readmessage();
140: mvprintw(1, 26, "%20.0f", Shield); /* overprint energy */
141:
142: if (!Foestrikes)
143: /* take action against foe */
144: myturn();
145: else
146: /* wait for foe to take action */
1.1 jtc 147: {
1.3 lukem 148: mvaddstr(4, 0, "Waiting...\n");
149: clrtoeol();
150: refresh();
151:
152: for (loop = 0; loop < 20; ++loop)
153: /* wait for foe to act */
154: {
155: readrecord(&Other, foeplace);
156: if (Other.p_1scratch != oldhits)
157: /* p_1scratch changes to indicate
158: * action */
159: break;
160: else
161: /* wait and try again */
162: {
163: sleep(1);
164: addch('.');
165: refresh();
166: }
167: }
168:
169: if (Other.p_1scratch == oldhits) {
170: /* timeout */
171: mvaddstr(22, 0, "Timeout: waiting for response. Do you want to wait ? ");
172: ch = getanswer("NY", FALSE);
173: move(22, 0);
174: clrtobot();
175: if (ch == 'Y')
176: continue;
177: else
178: break;
179: } else
180: /* foe took action */
181: {
182: switch (Other.p_istat) {
183: case I_RAN: /* foe ran away */
184: mvprintw(Lines++, 0, "%s ran away!", Enemyname);
185: break;
186:
187: case I_STUCK: /* foe tried to run, but
188: * couldn't */
189: mvprintw(Lines++, 0, "%s tried to run away.", Enemyname);
190: break;
191:
192: case I_BLEWIT: /* foe tried to luckout, but
193: * didn't */
194: mvprintw(Lines++, 0, "%s tried to luckout!", Enemyname);
195: break;
196:
197: default:
198: dtemp = Other.p_1scratch - oldhits;
199: mvprintw(Lines++, 0, "%s hit you %.0f times!", Enemyname, dtemp);
200: Shield -= dtemp;
201: break;
202: }
203:
204: oldhits = Other.p_1scratch; /* keep track of old
205: * hits */
206:
207: if (Other.p_tampered != oldtampered)
208: /* p_tampered changes to relinquish
209: * turn */
210: {
211: oldtampered = Other.p_tampered;
212: Foestrikes = FALSE;
213: }
214: }
1.1 jtc 215: }
216:
1.3 lukem 217: /* decide what happens next */
218: refresh();
219: if (Lines > LINES - 2) {
220: more(Lines);
221: move(Lines = 8, 0);
222: clrtobot();
223: }
224: if (Other.p_istat == I_KILLED || Shield < 0.0)
225: /* we died */
1.1 jtc 226: {
1.3 lukem 227: Shield = -2.0; /* insure this value is negative */
228: break;
1.1 jtc 229: }
1.3 lukem 230: if (Player.p_istat == I_KILLED)
231: /* we killed foe; award treasre */
1.1 jtc 232: {
1.3 lukem 233: mvprintw(Lines++, 0, "You killed %s!", Enemyname);
234: Player.p_experience += Other.p_experience;
235: Player.p_crowns += (Player.p_level < 1000.0) ? Other.p_crowns : 0;
236: Player.p_amulets += Other.p_amulets;
237: Player.p_charms += Other.p_charms;
238: collecttaxes(Other.p_gold, Other.p_gems);
239: Player.p_sword = MAX(Player.p_sword, Other.p_sword);
240: Player.p_shield = MAX(Player.p_shield, Other.p_shield);
241: Player.p_quksilver = MAX(Player.p_quksilver, Other.p_quksilver);
242: if (Other.p_virgin && !Player.p_virgin) {
243: mvaddstr(Lines++, 0, "You have rescued a virgin. Will you be honorable ? ");
244: if ((ch = getanswer("YN", FALSE)) == 'Y')
245: Player.p_virgin = TRUE;
246: else {
247: ++Player.p_sin;
248: Player.p_experience += 8000.0;
249: }
250: }
251: sleep(3); /* give other person time to die */
1.1 jtc 252: break;
1.3 lukem 253: } else
254: if (Player.p_istat == I_RAN || Other.p_istat == I_RAN)
255: /* either player ran away */
256: break;
257: }
1.1 jtc 258:
1.3 lukem 259: LEAVE:
260: /* clean up things and leave */
261: writerecord(&Player, Fileloc); /* update a final time */
262: altercoordinates(0.0, 0.0, A_NEAR); /* move away from battle site */
263: Player.p_energy = Shield; /* set energy to actual value */
264: Player.p_tampered = T_OFF; /* clear p_tampered */
1.1 jtc 265:
1.3 lukem 266: more(Lines); /* pause */
1.1 jtc 267:
1.3 lukem 268: move(4, 0);
269: clrtobot(); /* clear bottom area of screen */
1.1 jtc 270:
1.3 lukem 271: if (Player.p_energy < 0.0)
272: /* we are dead */
273: death("Interterminal battle");
1.1 jtc 274: }
275:
1.3 lukem 276: void
1.10 ! dholland 277: myturn(void)
1.1 jtc 278: {
1.3 lukem 279: double dtemp; /* for temporary calculations */
280: int ch; /* input */
1.1 jtc 281:
1.3 lukem 282: mvaddstr(7, 0, "1:Fight 2:Run Away! 3:Power Blast ");
283: if (Luckout)
284: clrtoeol();
285: else
286: addstr("4:Luckout ");
1.1 jtc 287:
1.3 lukem 288: ch = inputoption();
289: move(Lines = 8, 0);
290: clrtobot();
291:
292: switch (ch) {
293: default: /* fight */
294: dtemp = ROLL(2.0, Player.p_might);
295: HIT:
296: mvprintw(Lines++, 0, "You hit %s %.0f times!", Enemyname, dtemp);
297: Player.p_sin += 0.5;
298: Player.p_1scratch += dtemp;
299: Player.p_istat = I_OFF;
300: break;
1.1 jtc 301:
1.3 lukem 302: case '2': /* run away */
303: Player.p_1scratch -= 1.0; /* change this to indicate
304: * action */
305: if (drandom() > 0.25) {
306: mvaddstr(Lines++, 0, "You got away!");
307: Player.p_istat = I_RAN;
308: } else {
309: mvprintw(Lines++, 0, "%s is still after you!", Enemyname);
310: Player.p_istat = I_STUCK;
1.1 jtc 311: }
1.3 lukem 312: break;
313:
314: case '3': /* power blast */
315: dtemp = MIN(Player.p_mana, Player.p_level * 5.0);
316: Player.p_mana -= dtemp;
317: dtemp *= (drandom() + 0.5) * Player.p_magiclvl * 0.2 + 2.0;
318: mvprintw(Lines++, 0, "You blasted %s !", Enemyname);
319: goto HIT;
320:
321: case '4': /* luckout */
322: if (Luckout || drandom() > 0.1) {
323: if (Luckout)
324: mvaddstr(Lines++, 0, "You already tried that!");
325: else {
326: mvaddstr(Lines++, 0, "Not this time . . .");
327: Luckout = TRUE;
328: }
329:
330: Player.p_1scratch -= 1.0;
331: Player.p_istat = I_BLEWIT;
332: } else {
333: mvaddstr(Lines++, 0, "You just lucked out!");
334: Player.p_1scratch = Other.p_energy * 1.1;
1.1 jtc 335: }
1.3 lukem 336: break;
337: }
1.1 jtc 338:
1.3 lukem 339: refresh();
340: Player.p_1scratch = floor(Player.p_1scratch); /* clean up any mess */
1.1 jtc 341:
1.3 lukem 342: if (Player.p_1scratch > Other.p_energy)
343: Player.p_istat = I_KILLED;
344: else
345: if (drandom() * Player.p_speed < drandom() * Other.p_speed)
346: /* relinquish control */
1.1 jtc 347: {
1.3 lukem 348: ++Player.p_tampered;
349: Foestrikes = TRUE;
1.1 jtc 350: }
1.3 lukem 351: writerecord(&Player, Fileloc); /* let foe know what we did */
1.1 jtc 352: }
353:
1.3 lukem 354: void
1.10 ! dholland 355: checktampered(void)
1.1 jtc 356: {
1.3 lukem 357: long loc = 0L; /* location in energy void file */
1.1 jtc 358:
1.3 lukem 359: /* first check for energy voids */
1.5 jsm 360: fseek(Energyvoidfp, 0L, SEEK_SET);
1.3 lukem 361: while (fread((char *) &Enrgyvoid, SZ_VOIDSTRUCT, 1, Energyvoidfp) == 1)
362: if (Enrgyvoid.ev_active
363: && Enrgyvoid.ev_x == Player.p_x
364: && Enrgyvoid.ev_y == Player.p_y)
365: /* sitting on one */
366: {
367: if (loc > 0L)
368: /* not the holy grail; inactivate energy void */
369: {
370: Enrgyvoid.ev_active = FALSE;
371: writevoid(&Enrgyvoid, loc);
372: tampered(T_NRGVOID, 0.0, 0.0);
373: } else
374: if (Player.p_status != S_CLOAKED)
375: /* holy grail */
376: tampered(T_GRAIL, 0.0, 0.0);
377: break;
378: } else
379: loc += SZ_VOIDSTRUCT;
1.1 jtc 380:
1.3 lukem 381: /* now check for other things */
382: readrecord(&Other, Fileloc);
383: if (Other.p_tampered != T_OFF)
384: tampered(Other.p_tampered, Other.p_1scratch, Other.p_2scratch);
1.1 jtc 385: }
386:
1.3 lukem 387: void
1.10 ! dholland 388: tampered(int what, double arg1, double arg2)
1.1 jtc 389: {
1.3 lukem 390: long loc; /* location in file of other players */
1.1 jtc 391:
1.3 lukem 392: Changed = TRUE;
393: move(4, 0);
1.1 jtc 394:
1.3 lukem 395: Player.p_tampered = T_OFF; /* no longer tampered with */
1.1 jtc 396:
1.3 lukem 397: switch (what) {
1.1 jtc 398: case T_NRGVOID:
1.3 lukem 399: addstr("You've hit an energy void !\n");
400: Player.p_mana /= 3.0;
401: Player.p_energy /= 2.0;
402: Player.p_gold = floor(Player.p_gold / 1.25) + 0.1;
403: altercoordinates(0.0, 0.0, A_NEAR);
404: break;
1.1 jtc 405:
406: case T_TRANSPORT:
1.3 lukem 407: addstr("The king transported you ! ");
408: if (Player.p_charms > 0) {
409: addstr("But your charm saved you. . .\n");
410: --Player.p_charms;
411: } else {
412: altercoordinates(0.0, 0.0, A_FAR);
413: addch('\n');
1.1 jtc 414: }
1.3 lukem 415: break;
1.1 jtc 416:
417: case T_BESTOW:
1.3 lukem 418: printw("The king has bestowed %.0f gold pieces on you !\n", arg1);
419: Player.p_gold += arg1;
420: break;
1.1 jtc 421:
422: case T_CURSED:
1.3 lukem 423: addstr("You've been cursed ! ");
424: if (Player.p_blessing) {
425: addstr("But your blessing saved you. . .\n");
426: Player.p_blessing = FALSE;
427: } else {
428: addch('\n');
429: Player.p_poison += 2.0;
430: Player.p_energy = 10.0;
431: Player.p_maxenergy *= 0.95;
432: Player.p_status = S_PLAYING; /* no longer cloaked */
1.1 jtc 433: }
1.3 lukem 434: break;
1.1 jtc 435:
436: case T_VAPORIZED:
1.3 lukem 437: addstr("You have been vaporized!\n");
438: more(7);
439: death("Vaporization");
440: break;
1.1 jtc 441:
442: case T_MONSTER:
1.3 lukem 443: addstr("The Valar zapped you with a monster!\n");
444: more(7);
445: encounter((int) arg1);
446: return;
1.1 jtc 447:
448: case T_BLESSED:
1.3 lukem 449: addstr("The Valar has blessed you!\n");
450: Player.p_energy = (Player.p_maxenergy *= 1.05) + Player.p_shield;
451: Player.p_mana += 500.0;
452: Player.p_strength += 0.5;
453: Player.p_brains += 0.5;
454: Player.p_magiclvl += 0.5;
455: Player.p_poison = MIN(0.5, Player.p_poison);
456: break;
1.1 jtc 457:
458: case T_RELOCATE:
1.3 lukem 459: addstr("You've been relocated. . .\n");
460: altercoordinates(arg1, arg2, A_FORCED);
461: break;
1.1 jtc 462:
463: case T_HEAL:
1.3 lukem 464: addstr("You've been healed!\n");
465: Player.p_poison -= 0.25;
466: Player.p_energy = Player.p_maxenergy + Player.p_shield;
467: break;
1.1 jtc 468:
469: case T_EXVALAR:
1.3 lukem 470: addstr("You are no longer Valar!\n");
471: Player.p_specialtype = SC_COUNCIL;
472: break;
1.1 jtc 473:
474: case T_GRAIL:
1.3 lukem 475: addstr("You have found The Holy Grail!!\n");
476: if (Player.p_specialtype < SC_COUNCIL)
477: /* must be council of wise to behold grail */
478: {
479: addstr("However, you are not experienced enough to behold it.\n");
480: Player.p_sin *= Player.p_sin;
481: Player.p_mana += 1000;
482: } else
483: if (Player.p_specialtype == SC_VALAR
484: || Player.p_specialtype == SC_EXVALAR) {
485: addstr("You have made it to the position of Valar once already.\n");
486: addstr("The Grail is of no more use to you now.\n");
487: } else {
488: addstr("It is now time to see if you are worthy to behold it. . .\n");
489: refresh();
490: sleep(4);
491:
492: if (drandom() / 2.0 < Player.p_sin) {
493: addstr("You have failed!\n");
494: Player.p_strength =
495: Player.p_mana =
496: Player.p_energy =
497: Player.p_maxenergy =
498: Player.p_magiclvl =
499: Player.p_brains =
500: Player.p_experience =
501: Player.p_quickness = 1.0;
502:
503: altercoordinates(1.0, 1.0, A_FORCED);
504: Player.p_level = 0.0;
505: } else {
506: addstr("You made to position of Valar!\n");
507: Player.p_specialtype = SC_VALAR;
508: Player.p_lives = 5;
1.5 jsm 509: fseek(Playersfp, 0L, SEEK_SET);
1.3 lukem 510: loc = 0L;
511: while (fread((char *) &Other, SZ_PLAYERSTRUCT, 1, Playersfp) == 1)
512: /* search for existing valar */
513: if (Other.p_specialtype == SC_VALAR
514: && Other.p_status != S_NOTUSED)
515: /* found old valar */
516: {
517: Other.p_tampered = T_EXVALAR;
518: writerecord(&Other, loc);
519: break;
520: } else
521: loc += SZ_PLAYERSTRUCT;
522: }
523: }
524:
525: /* move grail to new location */
526: Enrgyvoid.ev_active = TRUE;
527: Enrgyvoid.ev_x = ROLL(-1.0e6, 2.0e6);
528: Enrgyvoid.ev_y = ROLL(-1.0e6, 2.0e6);
529: writevoid(&Enrgyvoid, 0L);
530: break;
1.1 jtc 531: }
1.3 lukem 532: refresh();
533: sleep(2);
1.1 jtc 534: }
535:
1.3 lukem 536: void
1.10 ! dholland 537: userlist(phbool ingameflag)
1.1 jtc 538: {
1.3 lukem 539: int numusers = 0; /* number of users on file */
1.1 jtc 540:
1.3 lukem 541: if (ingameflag && Player.p_blindness) {
542: mvaddstr(8, 0, "You cannot see anyone.\n");
543: return;
1.1 jtc 544: }
1.5 jsm 545: fseek(Playersfp, 0L, SEEK_SET);
1.3 lukem 546: mvaddstr(8, 0,
547: "Name X Y Lvl Type Login Status\n");
1.1 jtc 548:
1.3 lukem 549: while (fread((char *) &Other, SZ_PLAYERSTRUCT, 1, Playersfp) == 1) {
550: if (Other.p_status == S_NOTUSED
551: /* record is unused */
552: || (Other.p_specialtype == SC_VALAR && Other.p_status == S_CLOAKED))
553: /* cloaked valar */
554: {
555: if (!Wizard)
556: /* wizard can see everything on file */
557: continue;
558: }
559: ++numusers;
1.1 jtc 560:
1.3 lukem 561: if (ingameflag &&
1.1 jtc 562: /* must be playing for the rest of these conditions */
1.3 lukem 563: (Player.p_specialtype >= SC_KING
1.1 jtc 564: /* kings and higher can see others */
1.3 lukem 565: || Other.p_specialtype >= SC_KING
1.1 jtc 566: /* kings and higher can be seen by others */
1.3 lukem 567: || Circle >= CIRCLE(Other.p_x, Other.p_y)
1.1 jtc 568: /* those nearer the origin can be seen */
1.3 lukem 569: || Player.p_palantir)
1.1 jtc 570: /* palantir enables one to see others */
1.3 lukem 571: && (Other.p_status != S_CLOAKED
572: || (Player.p_specialtype == SC_VALAR && Player.p_palantir))
1.1 jtc 573: /* not cloaked; valar can see through cloak with a palantir */
1.3 lukem 574: && Other.p_specialtype != SC_VALAR)
575: /* not a valar */
576: /* coordinates should be printed */
577: printw("%-20s %8.0f %8.0f ",
578: Other.p_name, Other.p_x, Other.p_y);
579: else
580: /* cannot see player's coordinates */
581: printw("%-20s %19.19s ",
582: Other.p_name, descrlocation(&Other, TRUE));
583:
584: printw("%6.0f %s %-9.9s%s\n", Other.p_level, descrtype(&Other, TRUE),
585: Other.p_login, descrstatus(&Other));
586:
587: if ((numusers % (LINES - 10)) == 0) {
588: more(LINES - 1);
589: move(9, 0);
590: clrtobot();
591: }
1.1 jtc 592: }
593:
1.3 lukem 594: printw("Total players on file = %d\n", numusers);
595: refresh();
1.1 jtc 596: }
597:
1.3 lukem 598: void
1.10 ! dholland 599: throneroom(void)
1.1 jtc 600: {
1.3 lukem 601: FILE *fp; /* to clear energy voids */
602: long loc = 0L; /* location of old king in player file */
1.1 jtc 603:
1.3 lukem 604: if (Player.p_specialtype < SC_KING)
605: /* not already king -- assumes crown */
1.1 jtc 606: {
1.5 jsm 607: fseek(Playersfp, 0L, SEEK_SET);
1.3 lukem 608: while (fread((char *) &Other, SZ_PLAYERSTRUCT, 1, Playersfp) == 1)
609: if (Other.p_specialtype == SC_KING && Other.p_status != S_NOTUSED)
610: /* found old king */
611: {
612: if (Other.p_status != S_OFF)
613: /* old king is playing */
614: {
615: mvaddstr(4, 0, "The king is playing, so you cannot steal his throne\n");
616: altercoordinates(0.0, 0.0, A_NEAR);
617: move(6, 0);
618: return;
619: } else
620: /* old king is not playing - remove
621: * him/her */
622: {
623: Other.p_specialtype = SC_NONE;
624: if (Other.p_crowns)
625: --Other.p_crowns;
626: writerecord(&Other, loc);
627: break;
628: }
629: } else
630: loc += SZ_PLAYERSTRUCT;
631:
632: /* make player new king */
633: Changed = TRUE;
634: Player.p_specialtype = SC_KING;
635: mvaddstr(4, 0, "You have become king!\n");
636:
637: /* let everyone else know */
638: fp = fopen(_PATH_MESS, "w");
639: fprintf(fp, "All hail the new king!");
640: fclose(fp);
641:
642: /* clear all energy voids; retain location of holy grail */
1.5 jsm 643: fseek(Energyvoidfp, 0L, SEEK_SET);
1.3 lukem 644: fread((char *) &Enrgyvoid, SZ_VOIDSTRUCT, 1, Energyvoidfp);
645: fp = fopen(_PATH_VOID, "w");
646: fwrite((char *) &Enrgyvoid, SZ_VOIDSTRUCT, 1, fp);
647: fclose(fp);
1.1 jtc 648: }
1.3 lukem 649: mvaddstr(6, 0, "0:Decree ");
1.1 jtc 650: }
651:
1.3 lukem 652: void
1.10 ! dholland 653: dotampered(void)
1.1 jtc 654: {
1.3 lukem 655: short tamper; /* value for tampering with other players */
1.4 jsm 656: const char *option; /* pointer to option description */
1.3 lukem 657: double temp1 = 0.0, temp2 = 0.0; /* other tampering values */
658: int ch; /* input */
659: long loc; /* location in energy void file */
660: FILE *fp; /* for opening gold file */
1.1 jtc 661:
662: move(6, 0);
663: clrtoeol();
1.3 lukem 664: if (Player.p_specialtype < SC_COUNCIL && !Wizard)
665: /* king options */
666: {
667: addstr("1:Transport 2:Curse 3:Energy Void 4:Bestow 5:Collect Taxes ");
1.1 jtc 668:
1.3 lukem 669: ch = getanswer(" ", TRUE);
670: move(6, 0);
671: clrtoeol();
672: move(4, 0);
673: switch (ch) {
674: case '1': /* transport someone */
675: tamper = T_TRANSPORT;
676: option = "transport";
677: break;
1.1 jtc 678:
1.3 lukem 679: case '2': /* curse another */
680: tamper = T_CURSED;
681: option = "curse";
682: break;
1.1 jtc 683:
1.3 lukem 684: case '3': /* create energy void */
1.6 jsm 685: if ((loc = allocvoid()) > 20L * (long)SZ_VOIDSTRUCT)
1.3 lukem 686: /* can only have 20 void active at once */
687: mvaddstr(5, 0, "Sorry, void creation limit reached.\n");
688: else {
689: addstr("Enter the X Y coordinates of void ? ");
690: getstring(Databuf, SZ_DATABUF);
691: sscanf(Databuf, "%lf %lf", &temp1, &temp2);
692: Enrgyvoid.ev_x = floor(temp1);
693: Enrgyvoid.ev_y = floor(temp2);
694: Enrgyvoid.ev_active = TRUE;
695: writevoid(&Enrgyvoid, loc);
696: mvaddstr(5, 0, "It is done.\n");
697: }
698: return;
699:
700: case '4': /* bestow gold to subject */
701: tamper = T_BESTOW;
702: addstr("How much gold to bestow ? ");
703: temp1 = infloat();
704: if (temp1 > Player.p_gold || temp1 < 0) {
705: mvaddstr(5, 0, "You don't have that !\n");
706: return;
707: }
708: /* adjust gold after we are sure it will be given to
709: * someone */
710: option = "give gold to";
711: break;
1.1 jtc 712:
1.3 lukem 713: case '5': /* collect accumulated taxes */
714: if ((fp = fopen(_PATH_GOLD, "r+")) != NULL)
715: /* collect taxes */
716: {
717: fread((char *) &temp1, sizeof(double), 1, fp);
1.5 jsm 718: fseek(fp, 0L, SEEK_SET);
1.3 lukem 719: /* clear out value */
720: temp2 = 0.0;
721: fwrite((char *) &temp2, sizeof(double), 1, fp);
722: fclose(fp);
723: }
724: mvprintw(4, 0, "You have collected %.0f in gold.\n", temp1);
725: Player.p_gold += floor(temp1);
726: return;
727:
728: default:
729: return;
730: }
731: /* end of king options */
732: } else
733: /* council of wise, valar, wizard options */
734: {
735: addstr("1:Heal ");
736: if (Player.p_palantir || Wizard)
737: addstr("2:Seek Grail ");
738: if (Player.p_specialtype == SC_VALAR || Wizard)
739: addstr("3:Throw Monster 4:Relocate 5:Bless ");
740: if (Wizard)
741: addstr("6:Vaporize ");
1.1 jtc 742:
1.3 lukem 743: ch = getanswer(" ", TRUE);
744: if (!Wizard) {
745: if (ch > '2' && Player.p_specialtype != SC_VALAR) {
746: ILLCMD();
747: return;
748: }
749: if (Player.p_mana < MM_INTERVENE) {
750: mvaddstr(5, 0, "No mana left.\n");
751: return;
752: } else
753: Player.p_mana -= MM_INTERVENE;
754: }
755: switch (ch) {
756: case '1': /* heal another */
757: tamper = T_HEAL;
758: option = "heal";
759: break;
1.1 jtc 760:
1.3 lukem 761: case '2': /* seek grail */
762: if (Player.p_palantir)
763: /* need a palantir to seek */
764: {
1.5 jsm 765: fseek(Energyvoidfp, 0L, SEEK_SET);
1.3 lukem 766: fread((char *) &Enrgyvoid, SZ_VOIDSTRUCT, 1, Energyvoidfp);
767: temp1 = distance(Player.p_x, Enrgyvoid.ev_x, Player.p_y, Enrgyvoid.ev_y);
768: temp1 += ROLL(-temp1 / 10.0, temp1 / 5.0); /* add some error */
769: mvprintw(5, 0, "The palantir says the Grail is about %.0f away.\n", temp1);
770: } else
771: /* no palantir */
772: mvaddstr(5, 0, "You need a palantir to seek the Grail.\n");
773: return;
774:
775: case '3': /* lob monster at someone */
776: mvaddstr(4, 0, "Which monster [0-99] ? ");
777: temp1 = infloat();
778: temp1 = MAX(0.0, MIN(99.0, temp1));
779: tamper = T_MONSTER;
780: option = "throw a monster at";
781: break;
1.1 jtc 782:
1.3 lukem 783: case '4': /* move another player */
784: mvaddstr(4, 0, "New X Y coordinates ? ");
785: getstring(Databuf, SZ_DATABUF);
786: sscanf(Databuf, "%lf %lf", &temp1, &temp2);
787: tamper = T_RELOCATE;
788: option = "relocate";
789: break;
1.1 jtc 790:
1.3 lukem 791: case '5': /* bless a player */
792: tamper = T_BLESSED;
793: option = "bless";
794: break;
1.1 jtc 795:
1.3 lukem 796: case '6': /* kill off a player */
797: if (Wizard) {
798: tamper = T_VAPORIZED;
799: option = "vaporize";
800: break;
801: } else
802: return;
1.1 jtc 803:
1.3 lukem 804: default:
805: return;
806: }
1.1 jtc 807:
1.3 lukem 808: /* adjust age after we are sure intervention will be done */
809: /* end of valar, etc. options */
1.1 jtc 810: }
811:
1.3 lukem 812: for (;;)
813: /* prompt for player to affect */
1.1 jtc 814: {
1.3 lukem 815: mvprintw(4, 0, "Who do you want to %s ? ", option);
816: getstring(Databuf, SZ_DATABUF);
817: truncstring(Databuf);
1.1 jtc 818:
1.3 lukem 819: if (Databuf[0] == '\0')
820: userlist(TRUE);
821: else
822: break;
1.1 jtc 823: }
824:
1.3 lukem 825: if (strcmp(Player.p_name, Databuf) != 0)
826: /* name other than self */
1.1 jtc 827: {
1.3 lukem 828: if ((loc = findname(Databuf, &Other)) >= 0L) {
829: if (Other.p_tampered != T_OFF) {
830: mvaddstr(5, 0, "That person has something pending already.\n");
831: return;
832: } else {
833: if (tamper == T_RELOCATE
834: && CIRCLE(temp1, temp2) < CIRCLE(Other.p_x, Other.p_y)
835: && !Wizard)
836: mvaddstr(5, 0, "Cannot move someone closer to the Lord's Chamber.\n");
837: else {
838: if (tamper == T_BESTOW)
839: Player.p_gold -= floor(temp1);
840: if (!Wizard && (tamper == T_HEAL || tamper == T_MONSTER ||
841: tamper == T_RELOCATE || tamper == T_BLESSED))
842: Player.p_age += N_AGE; /* age penalty */
843: Other.p_tampered = tamper;
844: Other.p_1scratch = floor(temp1);
845: Other.p_2scratch = floor(temp2);
846: writerecord(&Other, loc);
847: mvaddstr(5, 0, "It is done.\n");
848: }
849: return;
850: }
851: } else
852: /* player not found */
853: mvaddstr(5, 0, "There is no one by that name.\n");
854: } else
855: /* self */
856: mvaddstr(5, 0, "You may not do it to yourself!\n");
1.1 jtc 857: }
858:
1.3 lukem 859: void
1.10 ! dholland 860: writevoid(struct energyvoid *vp, long loc)
1.1 jtc 861: {
862:
1.5 jsm 863: fseek(Energyvoidfp, loc, SEEK_SET);
1.3 lukem 864: fwrite((char *) vp, SZ_VOIDSTRUCT, 1, Energyvoidfp);
865: fflush(Energyvoidfp);
1.5 jsm 866: fseek(Energyvoidfp, 0L, SEEK_SET);
1.1 jtc 867: }
868:
869: long
1.10 ! dholland 870: allocvoid(void)
1.1 jtc 871: {
1.3 lukem 872: long loc = 0L; /* location of new energy void */
1.1 jtc 873:
1.5 jsm 874: fseek(Energyvoidfp, 0L, SEEK_SET);
1.3 lukem 875: while (fread((char *) &Enrgyvoid, SZ_VOIDSTRUCT, 1, Energyvoidfp) == 1)
876: if (Enrgyvoid.ev_active)
877: loc += SZ_VOIDSTRUCT;
878: else
879: break;
1.1 jtc 880:
1.3 lukem 881: return (loc);
1.1 jtc 882: }
CVSweb <webmaster@jp.NetBSD.org>