| File: | src/games/phantasia/interplayer.c |
| Warning: | line 309, column 10 Although the value stored to 'ch' is used in the enclosing expression, the value is never actually read from 'ch' |
Press '?' to see keyboard shortcuts
Keyboard shortcuts:
| 1 | /* $OpenBSD: interplayer.c,v 1.8 2016/01/06 14:28:09 mestre Exp $ */ |
| 2 | /* $NetBSD: interplayer.c,v 1.2 1995/03/24 03:58:47 cgd Exp $ */ |
| 3 | |
| 4 | /* |
| 5 | * interplayer.c - player to player routines for Phantasia |
| 6 | */ |
| 7 | |
| 8 | #include <curses.h> |
| 9 | #include <math.h> |
| 10 | #include <stdio.h> |
| 11 | #include <string.h> |
| 12 | #include <unistd.h> |
| 13 | |
| 14 | #include "macros.h" |
| 15 | #include "pathnames.h" |
| 16 | #include "phantdefs.h" |
| 17 | #include "phantglobs.h" |
| 18 | |
| 19 | /************************************************************************ |
| 20 | / |
| 21 | / FUNCTION NAME: checkbattle() |
| 22 | / |
| 23 | / FUNCTION: check to see if current player should battle another |
| 24 | / |
| 25 | / AUTHOR: E. A. Estes, 12/4/85 |
| 26 | / |
| 27 | / ARGUMENTS: none |
| 28 | / |
| 29 | / RETURN VALUE: none |
| 30 | / |
| 31 | / MODULES CALLED: battleplayer(), fread(), fseek() |
| 32 | / |
| 33 | / GLOBAL INPUTS: Other, Users, Player, Fileloc, *Playersfp |
| 34 | / |
| 35 | / GLOBAL OUTPUTS: Users |
| 36 | / |
| 37 | / DESCRIPTION: |
| 38 | / Seach player file for a foe at the same coordinates as the |
| 39 | / current player. |
| 40 | / Also update user count. |
| 41 | / |
| 42 | *************************************************************************/ |
| 43 | |
| 44 | void |
| 45 | checkbattle(void) |
| 46 | { |
| 47 | long foeloc = 0L; /* location in file of person to fight */ |
| 48 | |
| 49 | Users = 0; |
| 50 | fseek(Playersfp, 0L, SEEK_SET0); |
| 51 | |
| 52 | while (fread(&Other, SZ_PLAYERSTRUCTsizeof(struct player), 1, Playersfp) == 1) { |
| 53 | if (Other.p_status != S_OFF1 |
| 54 | && Other.p_status != S_NOTUSED0 |
| 55 | && Other.p_status != S_HUNGUP7 |
| 56 | && (Other.p_status != S_CLOAKED3 || Other.p_specialtype != SC_VALAR3)) |
| 57 | /* player is on and not a cloaked valar */ |
| 58 | { |
| 59 | ++Users; |
| 60 | |
| 61 | if (Player.p_x == Other.p_x |
| 62 | && Player.p_y == Other.p_y |
| 63 | /* same coordinates */ |
| 64 | && foeloc != Fileloc |
| 65 | /* not self */ |
| 66 | && Player.p_status == S_PLAYING2 |
| 67 | && (Other.p_status == S_PLAYING2 || Other.p_status == S_INBATTLE4) |
| 68 | /* both are playing */ |
| 69 | && Other.p_specialtype != SC_VALAR3 |
| 70 | && Player.p_specialtype != SC_VALAR3) |
| 71 | /* neither is valar */ |
| 72 | { |
| 73 | battleplayer(foeloc); |
| 74 | return; |
| 75 | } |
| 76 | } |
| 77 | foeloc += SZ_PLAYERSTRUCTsizeof(struct player); |
| 78 | } |
| 79 | } |
| 80 | /* */ |
| 81 | /************************************************************************ |
| 82 | / |
| 83 | / FUNCTION NAME: battleplayer() |
| 84 | / |
| 85 | / FUNCTION: inter-terminal battle with another player |
| 86 | / |
| 87 | / AUTHOR: E. A. Estes, 2/15/86 |
| 88 | / |
| 89 | / ARGUMENTS: |
| 90 | / long foeplace - location in player file of person to battle |
| 91 | / |
| 92 | / RETURN VALUE: none |
| 93 | / |
| 94 | / MODULES CALLED: readrecord(), readmessage(), writerecord(), collecttaxes(), |
| 95 | / displaystats(), fabs(), more(), death(), sleep(), wmove(), waddch(), printw(), |
| 96 | / myturn(), altercoordinates(), waddstr(), wrefresh(), mvprintw(), |
| 97 | / getanswer(), wclrtoeol(), wclrtobot() |
| 98 | / |
| 99 | / GLOBAL INPUTS: Foestrikes, LINES, Lines, Other, Shield, Player, *stdscr, |
| 100 | / Fileloc, *Enemyname |
| 101 | / |
| 102 | / GLOBAL OUTPUTS: Foestrikes, Lines, Shield, Player, Luckout, *Enemyname |
| 103 | / |
| 104 | / DESCRIPTION: |
| 105 | / Inter-terminal battle is a very fragile and slightly klugy thing. |
| 106 | / At any time, one player is master and the other is slave. |
| 107 | / We pick who is master first by speed and level. After that, |
| 108 | / the slave waits for the master to relinquish its turn, and |
| 109 | / the slave becomes master, and so on. |
| 110 | / |
| 111 | / The items in the player structure which control the handshake are: |
| 112 | / p_tampered: |
| 113 | / master increments this to relinquish control |
| 114 | / p_istat: |
| 115 | / master sets this to specify particular action |
| 116 | / p_1scratch: |
| 117 | / set to total damage inflicted so far; changes to indicate action |
| 118 | / |
| 119 | *************************************************************************/ |
| 120 | |
| 121 | void |
| 122 | battleplayer(long foeplace) |
| 123 | { |
| 124 | double dtemp; /* for temporary calculations */ |
| 125 | double oldhits = 0.0; /* previous damage inflicted by foe */ |
| 126 | int loop; /* for timing out */ |
| 127 | int ch; /* input */ |
| 128 | short oldtampered; /* old value of foe's p_tampered */ |
| 129 | |
| 130 | Lines = 8; |
| 131 | Luckout = FALSE0; |
| 132 | mvaddstr(4, 0, "Preparing for battle!\n")(wmove((stdscr),((4)),((0))) == (-1) ? (-1) : waddnstr((stdscr ),(("Preparing for battle!\n")),-1)); |
| 133 | refresh()wrefresh(stdscr); |
| 134 | |
| 135 | /* set up variables, file, etc. */ |
| 136 | Player.p_status = S_INBATTLE4; |
| 137 | Shield = Player.p_energy; |
| 138 | |
| 139 | /* if p_tampered is not 0, someone else may try to change it (king, |
| 140 | * etc.) */ |
| 141 | Player.p_tampered = oldtampered = 1; |
| 142 | Player.p_1scratch = 0.0; |
| 143 | Player.p_istat = I_OFF0; |
| 144 | |
| 145 | readrecord(&Other, foeplace); |
| 146 | if (fabs(Player.p_level - Other.p_level) > 20.0) |
| 147 | /* see if players are greatly mismatched */ |
| 148 | { |
| 149 | dtemp = (Player.p_level - Other.p_level) / MAX(Player.p_level, Other.p_level)((Player.p_level) > (Other.p_level) ? (Player.p_level) : ( Other.p_level)); |
| 150 | if (dtemp < -0.5) |
| 151 | /* foe outweighs this one */ |
| 152 | Player.p_speed *= 2.0; |
| 153 | } |
| 154 | writerecord(&Player, Fileloc); /* write out all our info */ |
| 155 | |
| 156 | if (Player.p_blindness) |
| 157 | Enemyname = "someone"; |
| 158 | else |
| 159 | Enemyname = Other.p_name; |
| 160 | |
| 161 | mvprintw(6, 0, "You have encountered %s Level: %.0f\n", Enemyname, Other.p_level); |
| 162 | refresh()wrefresh(stdscr); |
| 163 | |
| 164 | for (loop = 0; Other.p_status != S_INBATTLE4 && loop < 30; ++loop) |
| 165 | /* wait for foe to respond */ |
| 166 | { |
| 167 | readrecord(&Other, foeplace); |
| 168 | sleep(1); |
| 169 | } |
| 170 | |
| 171 | if (Other.p_status != S_INBATTLE4) |
| 172 | /* foe did not respond */ |
| 173 | { |
| 174 | mvprintw(5, 0, "%s is not responding.\n", Enemyname); |
| 175 | goto LEAVE; |
| 176 | } |
| 177 | /* else, we are ready to battle */ |
| 178 | |
| 179 | move(4, 0)wmove(stdscr,(4),(0)); |
| 180 | clrtoeol()wclrtoeol(stdscr); |
| 181 | |
| 182 | /* |
| 183 | * determine who is first master |
| 184 | * if neither player is faster, check level |
| 185 | * if neither level is greater, battle is not allowed |
| 186 | * (this should never happen, but we have to handle it) |
| 187 | */ |
| 188 | if (Player.p_speed > Other.p_speed) |
| 189 | Foestrikes = FALSE0; |
| 190 | else if (Other.p_speed > Player.p_speed) |
| 191 | Foestrikes = TRUE1; |
| 192 | else if (Player.p_level > Other.p_level) |
| 193 | Foestrikes = FALSE0; |
| 194 | else if (Other.p_level > Player.p_level) |
| 195 | Foestrikes = TRUE1; |
| 196 | else { |
| 197 | /* no one is faster */ |
| 198 | printw("You can't fight %s yet.", Enemyname); |
| 199 | goto LEAVE; |
| 200 | } |
| 201 | |
| 202 | for (;;) { |
| 203 | displaystats(); |
| 204 | readmessage(); |
| 205 | mvprintw(1, 26, "%20.0f", Shield); /* overprint energy */ |
| 206 | |
| 207 | if (!Foestrikes) |
| 208 | /* take action against foe */ |
| 209 | myturn(); |
| 210 | else |
| 211 | /* wait for foe to take action */ |
| 212 | { |
| 213 | mvaddstr(4, 0, "Waiting...\n")(wmove((stdscr),((4)),((0))) == (-1) ? (-1) : waddnstr((stdscr ),(("Waiting...\n")),-1)); |
| 214 | clrtoeol()wclrtoeol(stdscr); |
| 215 | refresh()wrefresh(stdscr); |
| 216 | |
| 217 | for (loop = 0; loop < 20; ++loop) |
| 218 | /* wait for foe to act */ |
| 219 | { |
| 220 | readrecord(&Other, foeplace); |
| 221 | if (Other.p_1scratch != oldhits) |
| 222 | /* p_1scratch changes to indicate |
| 223 | * action */ |
| 224 | break; |
| 225 | else |
| 226 | /* wait and try again */ |
| 227 | { |
| 228 | sleep(1); |
| 229 | addch('.')waddch(stdscr,('.')); |
| 230 | refresh()wrefresh(stdscr); |
| 231 | } |
| 232 | } |
| 233 | |
| 234 | if (Other.p_1scratch == oldhits) { |
| 235 | /* timeout */ |
| 236 | mvaddstr(22, 0, "Timeout: waiting for response. Do you want to wait ? ")(wmove((stdscr),((22)),((0))) == (-1) ? (-1) : waddnstr((stdscr ),(("Timeout: waiting for response. Do you want to wait ? ") ),-1)); |
| 237 | ch = getanswer("NY", FALSE0); |
| 238 | move(22, 0)wmove(stdscr,(22),(0)); |
| 239 | clrtobot()wclrtobot(stdscr); |
| 240 | if (ch == 'Y') |
| 241 | continue; |
| 242 | else |
| 243 | break; |
| 244 | } else |
| 245 | /* foe took action */ |
| 246 | { |
| 247 | switch (Other.p_istat) { |
| 248 | case I_RAN1: /* foe ran away */ |
| 249 | mvprintw(Lines++, 0, "%s ran away!", Enemyname); |
| 250 | break; |
| 251 | |
| 252 | case I_STUCK2: /* foe tried to run, but |
| 253 | * couldn't */ |
| 254 | mvprintw(Lines++, 0, "%s tried to run away.", Enemyname); |
| 255 | break; |
| 256 | |
| 257 | case I_BLEWIT3: /* foe tried to luckout, but |
| 258 | * didn't */ |
| 259 | mvprintw(Lines++, 0, "%s tried to luckout!", Enemyname); |
| 260 | break; |
| 261 | |
| 262 | default: |
| 263 | dtemp = Other.p_1scratch - oldhits; |
| 264 | mvprintw(Lines++, 0, "%s hit you %.0f times!", Enemyname, dtemp); |
| 265 | Shield -= dtemp; |
| 266 | break; |
| 267 | } |
| 268 | |
| 269 | oldhits = Other.p_1scratch; /* keep track of old |
| 270 | * hits */ |
| 271 | |
| 272 | if (Other.p_tampered != oldtampered) |
| 273 | /* p_tampered changes to relinquish |
| 274 | * turn */ |
| 275 | { |
| 276 | oldtampered = Other.p_tampered; |
| 277 | Foestrikes = FALSE0; |
| 278 | } |
| 279 | } |
| 280 | } |
| 281 | |
| 282 | /* decide what happens next */ |
| 283 | refresh()wrefresh(stdscr); |
| 284 | if (Lines > LINES - 2) { |
| 285 | more(Lines); |
| 286 | move(Lines = 8, 0)wmove(stdscr,(Lines = 8),(0)); |
| 287 | clrtobot()wclrtobot(stdscr); |
| 288 | } |
| 289 | if (Other.p_istat == I_KILLED4 || Shield < 0.0) |
| 290 | /* we died */ |
| 291 | { |
| 292 | Shield = -2.0; /* insure this value is negative */ |
| 293 | break; |
| 294 | } |
| 295 | if (Player.p_istat == I_KILLED4) |
| 296 | /* we killed foe; award treasre */ |
| 297 | { |
| 298 | mvprintw(Lines++, 0, "You killed %s!", Enemyname); |
| 299 | Player.p_experience += Other.p_experience; |
| 300 | Player.p_crowns += (Player.p_level < 1000.0) ? Other.p_crowns : 0; |
| 301 | Player.p_amulets += Other.p_amulets; |
| 302 | Player.p_charms += Other.p_charms; |
| 303 | collecttaxes(Other.p_gold, Other.p_gems); |
| 304 | Player.p_sword = MAX(Player.p_sword, Other.p_sword)((Player.p_sword) > (Other.p_sword) ? (Player.p_sword) : ( Other.p_sword)); |
| 305 | Player.p_shield = MAX(Player.p_shield, Other.p_shield)((Player.p_shield) > (Other.p_shield) ? (Player.p_shield) : (Other.p_shield)); |
| 306 | Player.p_quksilver = MAX(Player.p_quksilver, Other.p_quksilver)((Player.p_quksilver) > (Other.p_quksilver) ? (Player.p_quksilver ) : (Other.p_quksilver)); |
| 307 | if (Other.p_virgin && !Player.p_virgin) { |
| 308 | mvaddstr(Lines++, 0, "You have rescued a virgin. Will you be honorable ? ")(wmove((stdscr),((Lines++)),((0))) == (-1) ? (-1) : waddnstr( (stdscr),(("You have rescued a virgin. Will you be honorable ? " )),-1)); |
| 309 | if ((ch = getanswer("YN", FALSE0)) == 'Y') |
Although the value stored to 'ch' is used in the enclosing expression, the value is never actually read from 'ch' | |
| 310 | Player.p_virgin = TRUE1; |
| 311 | else { |
| 312 | ++Player.p_sin; |
| 313 | Player.p_experience += 8000.0; |
| 314 | } |
| 315 | } |
| 316 | sleep(3); /* give other person time to die */ |
| 317 | break; |
| 318 | } else |
| 319 | if (Player.p_istat == I_RAN1 || Other.p_istat == I_RAN1) |
| 320 | /* either player ran away */ |
| 321 | break; |
| 322 | } |
| 323 | |
| 324 | LEAVE: |
| 325 | /* clean up things and leave */ |
| 326 | writerecord(&Player, Fileloc); /* update a final time */ |
| 327 | altercoordinates(0.0, 0.0, A_NEAR2); /* move away from battle site */ |
| 328 | Player.p_energy = Shield; /* set energy to actual value */ |
| 329 | Player.p_tampered = T_OFF0; /* clear p_tampered */ |
| 330 | |
| 331 | more(Lines); /* pause */ |
| 332 | |
| 333 | move(4, 0)wmove(stdscr,(4),(0)); |
| 334 | clrtobot()wclrtobot(stdscr); /* clear bottom area of screen */ |
| 335 | |
| 336 | if (Player.p_energy < 0.0) |
| 337 | /* we are dead */ |
| 338 | death("Interterminal battle"); |
| 339 | } |
| 340 | /* */ |
| 341 | /************************************************************************ |
| 342 | / |
| 343 | / FUNCTION NAME: myturn() |
| 344 | / |
| 345 | / FUNCTION: process players action against foe in battle |
| 346 | / |
| 347 | / AUTHOR: E. A. Estes, 2/7/86 |
| 348 | / |
| 349 | / ARGUMENTS: none |
| 350 | / |
| 351 | / RETURN VALUE: none |
| 352 | / |
| 353 | / MODULES CALLED: writerecord(), inputoption(), floor(), wmove(), drandom(), |
| 354 | / waddstr(), wrefresh(), mvprintw(), wclrtoeol(), wclrtobot() |
| 355 | / |
| 356 | / GLOBAL INPUTS: Lines, Other, Player, *stdscr, Fileloc, Luckout, |
| 357 | / *Enemyname |
| 358 | / |
| 359 | / GLOBAL OUTPUTS: Foestrikes, Lines, Player, Luckout |
| 360 | / |
| 361 | / DESCRIPTION: |
| 362 | / Take action action against foe, and decide who is master |
| 363 | / for next iteration. |
| 364 | / |
| 365 | *************************************************************************/ |
| 366 | |
| 367 | void |
| 368 | myturn(void) |
| 369 | { |
| 370 | double dtemp; /* for temporary calculations */ |
| 371 | int ch; /* input */ |
| 372 | |
| 373 | mvaddstr(7, 0, "1:Fight 2:Run Away! 3:Power Blast ")(wmove((stdscr),((7)),((0))) == (-1) ? (-1) : waddnstr((stdscr ),(("1:Fight 2:Run Away! 3:Power Blast ")),-1)); |
| 374 | if (Luckout) |
| 375 | clrtoeol()wclrtoeol(stdscr); |
| 376 | else |
| 377 | addstr("4:Luckout ")waddnstr(stdscr,("4:Luckout "),-1); |
| 378 | |
| 379 | ch = inputoption(); |
| 380 | move(Lines = 8, 0)wmove(stdscr,(Lines = 8),(0)); |
| 381 | clrtobot()wclrtobot(stdscr); |
| 382 | |
| 383 | switch (ch) { |
| 384 | default: /* fight */ |
| 385 | dtemp = ROLL(2.0, Player.p_might)floor((2.0) + (Player.p_might) * drandom()); |
| 386 | HIT: |
| 387 | mvprintw(Lines++, 0, "You hit %s %.0f times!", Enemyname, dtemp); |
| 388 | Player.p_sin += 0.5; |
| 389 | Player.p_1scratch += dtemp; |
| 390 | Player.p_istat = I_OFF0; |
| 391 | break; |
| 392 | |
| 393 | case '2': /* run away */ |
| 394 | Player.p_1scratch -= 1.0; /* change this to indicate |
| 395 | * action */ |
| 396 | if (drandom() > 0.25) { |
| 397 | mvaddstr(Lines++, 0, "You got away!")(wmove((stdscr),((Lines++)),((0))) == (-1) ? (-1) : waddnstr( (stdscr),(("You got away!")),-1)); |
| 398 | Player.p_istat = I_RAN1; |
| 399 | } else { |
| 400 | mvprintw(Lines++, 0, "%s is still after you!", Enemyname); |
| 401 | Player.p_istat = I_STUCK2; |
| 402 | } |
| 403 | break; |
| 404 | |
| 405 | case '3': /* power blast */ |
| 406 | dtemp = MIN(Player.p_mana, Player.p_level * 5.0)((Player.p_mana) < (Player.p_level * 5.0) ? (Player.p_mana ) : (Player.p_level * 5.0)); |
| 407 | Player.p_mana -= dtemp; |
| 408 | dtemp *= (drandom() + 0.5) * Player.p_magiclvl * 0.2 + 2.0; |
| 409 | mvprintw(Lines++, 0, "You blasted %s !", Enemyname); |
| 410 | goto HIT; |
| 411 | |
| 412 | case '4': /* luckout */ |
| 413 | if (Luckout || drandom() > 0.1) { |
| 414 | if (Luckout) |
| 415 | mvaddstr(Lines++, 0, "You already tried that!")(wmove((stdscr),((Lines++)),((0))) == (-1) ? (-1) : waddnstr( (stdscr),(("You already tried that!")),-1)); |
| 416 | else { |
| 417 | mvaddstr(Lines++, 0, "Not this time . . .")(wmove((stdscr),((Lines++)),((0))) == (-1) ? (-1) : waddnstr( (stdscr),(("Not this time . . .")),-1)); |
| 418 | Luckout = TRUE1; |
| 419 | } |
| 420 | |
| 421 | Player.p_1scratch -= 1.0; |
| 422 | Player.p_istat = I_BLEWIT3; |
| 423 | } else { |
| 424 | mvaddstr(Lines++, 0, "You just lucked out!")(wmove((stdscr),((Lines++)),((0))) == (-1) ? (-1) : waddnstr( (stdscr),(("You just lucked out!")),-1)); |
| 425 | Player.p_1scratch = Other.p_energy * 1.1; |
| 426 | } |
| 427 | break; |
| 428 | } |
| 429 | |
| 430 | refresh()wrefresh(stdscr); |
| 431 | Player.p_1scratch = floor(Player.p_1scratch); /* clean up any mess */ |
| 432 | |
| 433 | if (Player.p_1scratch > Other.p_energy) |
| 434 | Player.p_istat = I_KILLED4; |
| 435 | else |
| 436 | if (drandom() * Player.p_speed < drandom() * Other.p_speed) |
| 437 | /* relinquish control */ |
| 438 | { |
| 439 | ++Player.p_tampered; |
| 440 | Foestrikes = TRUE1; |
| 441 | } |
| 442 | writerecord(&Player, Fileloc); /* let foe know what we did */ |
| 443 | } |
| 444 | /* */ |
| 445 | /************************************************************************ |
| 446 | / |
| 447 | / FUNCTION NAME: checktampered() |
| 448 | / |
| 449 | / FUNCTION: check if current player has been tampered with |
| 450 | / |
| 451 | / AUTHOR: E. A. Estes, 12/4/85 |
| 452 | / |
| 453 | / ARGUMENTS: none |
| 454 | / |
| 455 | / RETURN VALUE: none |
| 456 | / |
| 457 | / MODULES CALLED: readrecord(), fread(), fseek(), tampered(), writevoid() |
| 458 | / |
| 459 | / GLOBAL INPUTS: *Energyvoidfp, Other, Player, Fileloc, Enrgyvoid |
| 460 | / |
| 461 | / GLOBAL OUTPUTS: Enrgyvoid |
| 462 | / |
| 463 | / DESCRIPTION: |
| 464 | / Check for energy voids, holy grail, and tampering by other |
| 465 | / players. |
| 466 | / |
| 467 | *************************************************************************/ |
| 468 | |
| 469 | void |
| 470 | checktampered(void) |
| 471 | { |
| 472 | long loc = 0L; /* location in energy void file */ |
| 473 | |
| 474 | /* first check for energy voids */ |
| 475 | fseek(Energyvoidfp, 0L, SEEK_SET0); |
| 476 | while (fread(&Enrgyvoid, SZ_VOIDSTRUCTsizeof(struct energyvoid), 1, Energyvoidfp) == 1) |
| 477 | if (Enrgyvoid.ev_active |
| 478 | && Enrgyvoid.ev_x == Player.p_x |
| 479 | && Enrgyvoid.ev_y == Player.p_y) |
| 480 | /* sitting on one */ |
| 481 | { |
| 482 | if (loc > 0L) |
| 483 | /* not the holy grail; inactivate energy void */ |
| 484 | { |
| 485 | Enrgyvoid.ev_active = FALSE0; |
| 486 | writevoid(&Enrgyvoid, loc); |
| 487 | tampered(T_NRGVOID1, 0.0, 0.0); |
| 488 | } else |
| 489 | if (Player.p_status != S_CLOAKED3) |
| 490 | /* holy grail */ |
| 491 | tampered(T_GRAIL2, 0.0, 0.0); |
| 492 | break; |
| 493 | } else |
| 494 | loc += SZ_VOIDSTRUCTsizeof(struct energyvoid); |
| 495 | |
| 496 | /* now check for other things */ |
| 497 | readrecord(&Other, Fileloc); |
| 498 | if (Other.p_tampered != T_OFF0) |
| 499 | tampered(Other.p_tampered, Other.p_1scratch, Other.p_2scratch); |
| 500 | } |
| 501 | /* */ |
| 502 | /************************************************************************ |
| 503 | / |
| 504 | / FUNCTION NAME: tampered() |
| 505 | / |
| 506 | / FUNCTION: take care of tampering by other players |
| 507 | / |
| 508 | / AUTHOR: E. A. Estes, 12/4/85 |
| 509 | / |
| 510 | / ARGUMENTS: |
| 511 | / int what - what type of tampering |
| 512 | / double arg1, arg2 - rest of tampering info |
| 513 | / |
| 514 | / RETURN VALUE: none |
| 515 | / |
| 516 | / MODULES CALLED: writerecord(), more(), fread(), death(), fseek(), sleep(), |
| 517 | / floor(), wmove(), waddch(), drandom(), printw(), altercoordinates(), |
| 518 | / waddstr(), wrefresh(), encounter(), writevoid() |
| 519 | / |
| 520 | / GLOBAL INPUTS: Other, Player, *stdscr, Enrgyvoid, *Playersfp |
| 521 | / |
| 522 | / GLOBAL OUTPUTS: Other, Player, Changed, Enrgyvoid |
| 523 | / |
| 524 | / DESCRIPTION: |
| 525 | / Take care of energy voids, holy grail, decree and intervention |
| 526 | / action on current player. |
| 527 | / |
| 528 | *************************************************************************/ |
| 529 | |
| 530 | void |
| 531 | tampered(int what, double arg1, double arg2) |
| 532 | { |
| 533 | long loc; /* location in file of other players */ |
| 534 | |
| 535 | Changed = TRUE1; |
| 536 | move(4, 0)wmove(stdscr,(4),(0)); |
| 537 | |
| 538 | Player.p_tampered = T_OFF0; /* no longer tampered with */ |
| 539 | |
| 540 | switch (what) { |
| 541 | case T_NRGVOID1: |
| 542 | addstr("You've hit an energy void !\n")waddnstr(stdscr,("You've hit an energy void !\n"),-1); |
| 543 | Player.p_mana /= 3.0; |
| 544 | Player.p_energy /= 2.0; |
| 545 | Player.p_gold = floor(Player.p_gold / 1.25) + 0.1; |
| 546 | altercoordinates(0.0, 0.0, A_NEAR2); |
| 547 | break; |
| 548 | |
| 549 | case T_TRANSPORT3: |
| 550 | addstr("The king transported you ! ")waddnstr(stdscr,("The king transported you ! "),-1); |
| 551 | if (Player.p_charms > 0) { |
| 552 | addstr("But your charm saved you. . .\n")waddnstr(stdscr,("But your charm saved you. . .\n"),-1); |
| 553 | --Player.p_charms; |
| 554 | } else { |
| 555 | altercoordinates(0.0, 0.0, A_FAR3); |
| 556 | addch('\n')waddch(stdscr,('\n')); |
| 557 | } |
| 558 | break; |
| 559 | |
| 560 | case T_BESTOW4: |
| 561 | printw("The king has bestowed %.0f gold pieces on you !\n", arg1); |
| 562 | Player.p_gold += arg1; |
| 563 | break; |
| 564 | |
| 565 | case T_CURSED5: |
| 566 | addstr("You've been cursed ! ")waddnstr(stdscr,("You've been cursed ! "),-1); |
| 567 | if (Player.p_blessing) { |
| 568 | addstr("But your blessing saved you. . .\n")waddnstr(stdscr,("But your blessing saved you. . .\n"),-1); |
| 569 | Player.p_blessing = FALSE0; |
| 570 | } else { |
| 571 | addch('\n')waddch(stdscr,('\n')); |
| 572 | Player.p_poison += 2.0; |
| 573 | Player.p_energy = 10.0; |
| 574 | Player.p_maxenergy *= 0.95; |
| 575 | Player.p_status = S_PLAYING2; /* no longer cloaked */ |
| 576 | } |
| 577 | break; |
| 578 | |
| 579 | case T_VAPORIZED10: |
| 580 | addstr("You have been vaporized!\n")waddnstr(stdscr,("You have been vaporized!\n"),-1); |
| 581 | more(7); |
| 582 | death("Vaporization"); |
| 583 | break; |
| 584 | |
| 585 | case T_MONSTER6: |
| 586 | addstr("The Valar zapped you with a monster!\n")waddnstr(stdscr,("The Valar zapped you with a monster!\n"),-1 ); |
| 587 | more(7); |
| 588 | encounter((int) arg1); |
| 589 | return; |
| 590 | |
| 591 | case T_BLESSED7: |
| 592 | addstr("The Valar has blessed you!\n")waddnstr(stdscr,("The Valar has blessed you!\n"),-1); |
| 593 | Player.p_energy = (Player.p_maxenergy *= 1.05) + Player.p_shield; |
| 594 | Player.p_mana += 500.0; |
| 595 | Player.p_strength += 0.5; |
| 596 | Player.p_brains += 0.5; |
| 597 | Player.p_magiclvl += 0.5; |
| 598 | Player.p_poison = MIN(0.5, Player.p_poison)((0.5) < (Player.p_poison) ? (0.5) : (Player.p_poison)); |
| 599 | break; |
| 600 | |
| 601 | case T_RELOCATE8: |
| 602 | addstr("You've been relocated. . .\n")waddnstr(stdscr,("You've been relocated. . .\n"),-1); |
| 603 | altercoordinates(arg1, arg2, A_FORCED1); |
| 604 | break; |
| 605 | |
| 606 | case T_HEAL9: |
| 607 | addstr("You've been healed!\n")waddnstr(stdscr,("You've been healed!\n"),-1); |
| 608 | Player.p_poison -= 0.25; |
| 609 | Player.p_energy = Player.p_maxenergy + Player.p_shield; |
| 610 | break; |
| 611 | |
| 612 | case T_EXVALAR11: |
| 613 | addstr("You are no longer Valar!\n")waddnstr(stdscr,("You are no longer Valar!\n"),-1); |
| 614 | Player.p_specialtype = SC_COUNCIL2; |
| 615 | break; |
| 616 | |
| 617 | case T_GRAIL2: |
| 618 | addstr("You have found The Holy Grail!!\n")waddnstr(stdscr,("You have found The Holy Grail!!\n"),-1); |
| 619 | if (Player.p_specialtype < SC_COUNCIL2) |
| 620 | /* must be council of wise to behold grail */ |
| 621 | { |
| 622 | addstr("However, you are not experienced enough to behold it.\n")waddnstr(stdscr,("However, you are not experienced enough to behold it.\n" ),-1); |
| 623 | Player.p_sin *= Player.p_sin; |
| 624 | Player.p_mana += 1000; |
| 625 | } else |
| 626 | if (Player.p_specialtype == SC_VALAR3 |
| 627 | || Player.p_specialtype == SC_EXVALAR4) { |
| 628 | addstr("You have made it to the position of Valar once already.\n")waddnstr(stdscr,("You have made it to the position of Valar once already.\n" ),-1); |
| 629 | addstr("The Grail is of no more use to you now.\n")waddnstr(stdscr,("The Grail is of no more use to you now.\n") ,-1); |
| 630 | } else { |
| 631 | addstr("It is now time to see if you are worthy to behold it. . .\n")waddnstr(stdscr,("It is now time to see if you are worthy to behold it. . .\n" ),-1); |
| 632 | refresh()wrefresh(stdscr); |
| 633 | sleep(4); |
| 634 | |
| 635 | if (drandom() / 2.0 < Player.p_sin) { |
| 636 | addstr("You have failed!\n")waddnstr(stdscr,("You have failed!\n"),-1); |
| 637 | Player.p_strength = |
| 638 | Player.p_mana = |
| 639 | Player.p_energy = |
| 640 | Player.p_maxenergy = |
| 641 | Player.p_magiclvl = |
| 642 | Player.p_brains = |
| 643 | Player.p_experience = |
| 644 | Player.p_quickness = 1.0; |
| 645 | |
| 646 | altercoordinates(1.0, 1.0, A_FORCED1); |
| 647 | Player.p_level = 0.0; |
| 648 | } else { |
| 649 | addstr("You made to position of Valar!\n")waddnstr(stdscr,("You made to position of Valar!\n"),-1); |
| 650 | Player.p_specialtype = SC_VALAR3; |
| 651 | Player.p_lives = 5; |
| 652 | fseek(Playersfp, 0L, SEEK_SET0); |
| 653 | loc = 0L; |
| 654 | while (fread(&Other, SZ_PLAYERSTRUCTsizeof(struct player), 1, Playersfp) == 1) |
| 655 | /* search for existing valar */ |
| 656 | if (Other.p_specialtype == SC_VALAR3 |
| 657 | && Other.p_status != S_NOTUSED0) |
| 658 | /* found old valar */ |
| 659 | { |
| 660 | Other.p_tampered = T_EXVALAR11; |
| 661 | writerecord(&Other, loc); |
| 662 | break; |
| 663 | } else |
| 664 | loc += SZ_PLAYERSTRUCTsizeof(struct player); |
| 665 | } |
| 666 | } |
| 667 | |
| 668 | /* move grail to new location */ |
| 669 | Enrgyvoid.ev_active = TRUE1; |
| 670 | Enrgyvoid.ev_x = ROLL(-1.0e6, 2.0e6)floor((-1.0e6) + (2.0e6) * drandom()); |
| 671 | Enrgyvoid.ev_y = ROLL(-1.0e6, 2.0e6)floor((-1.0e6) + (2.0e6) * drandom()); |
| 672 | writevoid(&Enrgyvoid, 0L); |
| 673 | break; |
| 674 | } |
| 675 | refresh()wrefresh(stdscr); |
| 676 | sleep(2); |
| 677 | } |
| 678 | /* */ |
| 679 | /************************************************************************ |
| 680 | / |
| 681 | / FUNCTION NAME: userlist() |
| 682 | / |
| 683 | / FUNCTION: print list of players and locations |
| 684 | / |
| 685 | / AUTHOR: E. A. Estes, 2/28/86 |
| 686 | / |
| 687 | / ARGUMENTS: |
| 688 | / bool ingameflag - set if called while playing |
| 689 | / |
| 690 | / RETURN VALUE: none |
| 691 | / |
| 692 | / MODULES CALLED: descrstatus(), descrlocation(), more(), fread(), fseek(), |
| 693 | / floor(), wmove(), printw(), waddstr(), distance(), wrefresh(), |
| 694 | / descrtype(), wclrtobot() |
| 695 | / |
| 696 | / GLOBAL INPUTS: LINES, Other, Circle, Wizard, Player, *stdscr, *Playersfp |
| 697 | / |
| 698 | / GLOBAL OUTPUTS: none |
| 699 | / |
| 700 | / DESCRIPTION: |
| 701 | / We can only see the coordinate of those closer to the origin |
| 702 | / from us. |
| 703 | / Kings and council of the wise can see and can be seen by everyone. |
| 704 | / Palantirs are good for seeing everyone; and the valar can use |
| 705 | / one to see through a 'cloak' spell. |
| 706 | / The valar has no coordinates, and is completely invisible if |
| 707 | / cloaked. |
| 708 | / |
| 709 | *************************************************************************/ |
| 710 | |
| 711 | void |
| 712 | userlist(bool_Bool ingameflag) |
| 713 | { |
| 714 | int numusers = 0; /* number of users on file */ |
| 715 | |
| 716 | if (ingameflag && Player.p_blindness) { |
| 717 | mvaddstr(8, 0, "You cannot see anyone.\n")(wmove((stdscr),((8)),((0))) == (-1) ? (-1) : waddnstr((stdscr ),(("You cannot see anyone.\n")),-1)); |
| 718 | return; |
| 719 | } |
| 720 | fseek(Playersfp, 0L, SEEK_SET0); |
| 721 | mvaddstr(8, 0,(wmove((stdscr),((8)),((0))) == (-1) ? (-1) : waddnstr((stdscr ),(("Name X Y Lvl Type Login Status\n" )),-1)) |
| 722 | "Name X Y Lvl Type Login Status\n")(wmove((stdscr),((8)),((0))) == (-1) ? (-1) : waddnstr((stdscr ),(("Name X Y Lvl Type Login Status\n" )),-1)); |
| 723 | |
| 724 | while (fread(&Other, SZ_PLAYERSTRUCTsizeof(struct player), 1, Playersfp) == 1) { |
| 725 | if (Other.p_status == S_NOTUSED0 |
| 726 | /* record is unused */ |
| 727 | || (Other.p_specialtype == SC_VALAR3 && Other.p_status == S_CLOAKED3)) |
| 728 | /* cloaked valar */ |
| 729 | { |
| 730 | if (!Wizard) |
| 731 | /* wizard can see everything on file */ |
| 732 | continue; |
| 733 | } |
| 734 | ++numusers; |
| 735 | |
| 736 | if (ingameflag && |
| 737 | /* must be playing for the rest of these conditions */ |
| 738 | (Player.p_specialtype >= SC_KING1 |
| 739 | /* kings and higher can see others */ |
| 740 | || Other.p_specialtype >= SC_KING1 |
| 741 | /* kings and higher can be seen by others */ |
| 742 | || Circle >= CIRCLE(Other.p_x, Other.p_y)floor(distance(Other.p_x, 0.0, Other.p_y, 0.0) / 125.0 + 1) |
| 743 | /* those nearer the origin can be seen */ |
| 744 | || Player.p_palantir) |
| 745 | /* palantir enables one to see others */ |
| 746 | && (Other.p_status != S_CLOAKED3 |
| 747 | || (Player.p_specialtype == SC_VALAR3 && Player.p_palantir)) |
| 748 | /* not cloaked; valar can see through cloak with a palantir */ |
| 749 | && Other.p_specialtype != SC_VALAR3) |
| 750 | /* not a valar */ |
| 751 | /* coordinates should be printed */ |
| 752 | printw("%-20s %8.0f %8.0f ", |
| 753 | Other.p_name, Other.p_x, Other.p_y); |
| 754 | else |
| 755 | /* cannot see player's coordinates */ |
| 756 | printw("%-20s %19.19s ", |
| 757 | Other.p_name, descrlocation(&Other, TRUE1)); |
| 758 | |
| 759 | printw("%6.0f %s %-9.9s%s\n", Other.p_level, descrtype(&Other, TRUE1), |
| 760 | Other.p_login, descrstatus(&Other)); |
| 761 | |
| 762 | if ((numusers % (LINES - 10)) == 0) { |
| 763 | more(LINES - 1); |
| 764 | move(9, 0)wmove(stdscr,(9),(0)); |
| 765 | clrtobot()wclrtobot(stdscr); |
| 766 | } |
| 767 | } |
| 768 | |
| 769 | printw("Total players on file = %d\n", numusers); |
| 770 | refresh()wrefresh(stdscr); |
| 771 | } |
| 772 | /* */ |
| 773 | /************************************************************************ |
| 774 | / |
| 775 | / FUNCTION NAME: throneroom() |
| 776 | / |
| 777 | / FUNCTION: king stuff upon entering throne |
| 778 | / |
| 779 | / AUTHOR: E. A. Estes, 12/16/85 |
| 780 | / |
| 781 | / ARGUMENTS: none |
| 782 | / |
| 783 | / RETURN VALUE: none |
| 784 | / |
| 785 | / MODULES CALLED: writerecord(), fread(), fseek(), fopen(), wmove(), fclose(), |
| 786 | / fwrite(), altercoordinates(), waddstr(), fprintf() |
| 787 | / |
| 788 | / GLOBAL INPUTS: *Energyvoidfp, Other, Player, *stdscr, |
| 789 | / Enrgyvoid, *Playersfp |
| 790 | / |
| 791 | / GLOBAL OUTPUTS: Other, Player, Changed |
| 792 | / |
| 793 | / DESCRIPTION: |
| 794 | / If player is not already king, make him/her so if the old king |
| 795 | / is not playing. |
| 796 | / Clear energy voids with new king. |
| 797 | / Print 'decree' prompt. |
| 798 | / |
| 799 | *************************************************************************/ |
| 800 | |
| 801 | void |
| 802 | throneroom(void) |
| 803 | { |
| 804 | FILE *fp; /* to clear energy voids */ |
| 805 | long loc = 0L; /* location of old king in player file */ |
| 806 | |
| 807 | if (Player.p_specialtype < SC_KING1) |
| 808 | /* not already king -- assumes crown */ |
| 809 | { |
| 810 | fseek(Playersfp, 0L, SEEK_SET0); |
| 811 | while (fread(&Other, SZ_PLAYERSTRUCTsizeof(struct player), 1, Playersfp) == 1) |
| 812 | if (Other.p_specialtype == SC_KING1 && Other.p_status != S_NOTUSED0) |
| 813 | /* found old king */ |
| 814 | { |
| 815 | if (Other.p_status != S_OFF1) |
| 816 | /* old king is playing */ |
| 817 | { |
| 818 | mvaddstr(4, 0, "The king is playing, so you cannot steal his throne\n")(wmove((stdscr),((4)),((0))) == (-1) ? (-1) : waddnstr((stdscr ),(("The king is playing, so you cannot steal his throne\n")) ,-1)); |
| 819 | altercoordinates(0.0, 0.0, A_NEAR2); |
| 820 | move(6, 0)wmove(stdscr,(6),(0)); |
| 821 | return; |
| 822 | } else |
| 823 | /* old king is not playing - remove |
| 824 | * him/her */ |
| 825 | { |
| 826 | Other.p_specialtype = SC_NONE0; |
| 827 | if (Other.p_crowns) |
| 828 | --Other.p_crowns; |
| 829 | writerecord(&Other, loc); |
| 830 | break; |
| 831 | } |
| 832 | } else |
| 833 | loc += SZ_PLAYERSTRUCTsizeof(struct player); |
| 834 | |
| 835 | /* make player new king */ |
| 836 | Changed = TRUE1; |
| 837 | Player.p_specialtype = SC_KING1; |
| 838 | mvaddstr(4, 0, "You have become king!\n")(wmove((stdscr),((4)),((0))) == (-1) ? (-1) : waddnstr((stdscr ),(("You have become king!\n")),-1)); |
| 839 | |
| 840 | /* let everyone else know */ |
| 841 | fp = fopen(_PATH_MESS"/var/games/phantasia/mess", "w"); |
| 842 | fprintf(fp, "All hail the new king!"); |
| 843 | fclose(fp); |
| 844 | |
| 845 | /* clear all energy voids; retain location of holy grail */ |
| 846 | fseek(Energyvoidfp, 0L, SEEK_SET0); |
| 847 | fread(&Enrgyvoid, SZ_VOIDSTRUCTsizeof(struct energyvoid), 1, Energyvoidfp); |
| 848 | fp = fopen(_PATH_VOID"/var/games/phantasia/void", "w"); |
| 849 | fwrite(&Enrgyvoid, SZ_VOIDSTRUCTsizeof(struct energyvoid), 1, fp); |
| 850 | fclose(fp); |
| 851 | } |
| 852 | mvaddstr(6, 0, "0:Decree ")(wmove((stdscr),((6)),((0))) == (-1) ? (-1) : waddnstr((stdscr ),(("0:Decree ")),-1)); |
| 853 | } |
| 854 | /* */ |
| 855 | /************************************************************************ |
| 856 | / |
| 857 | / FUNCTION NAME: dotampered() |
| 858 | / |
| 859 | / FUNCTION: king and valar special options |
| 860 | / |
| 861 | / AUTHOR: E. A. Estes, 2/28/86 |
| 862 | / |
| 863 | / ARGUMENTS: none |
| 864 | / |
| 865 | / RETURN VALUE: none |
| 866 | / |
| 867 | / MODULES CALLED: writerecord(), truncstring(), fread(), fseek(), fopen(), |
| 868 | / floor(), wmove(), drandom(), fclose(), fwrite(), sscanf(), strcmp(), |
| 869 | / infloat(), waddstr(), findname(), distance(), userlist(), mvprintw(), |
| 870 | / allocvoid(), getanswer(), getstring(), wclrtoeol(), writevoid() |
| 871 | / |
| 872 | / GLOBAL INPUTS: *Energyvoidfp, Other, Illcmd[], Wizard, Player, *stdscr, |
| 873 | / Databuf[], Enrgyvoid |
| 874 | / |
| 875 | / GLOBAL OUTPUTS: Other, Player, Enrgyvoid |
| 876 | / |
| 877 | / DESCRIPTION: |
| 878 | / Tamper with other players. Handle king/valar specific options. |
| 879 | / |
| 880 | *************************************************************************/ |
| 881 | |
| 882 | void |
| 883 | dotampered(void) |
| 884 | { |
| 885 | short tamper; /* value for tampering with other players */ |
| 886 | char *option; /* pointer to option description */ |
| 887 | double temp1 = 0.0, temp2 = 0.0; /* other tampering values */ |
| 888 | int ch; /* input */ |
| 889 | long loc; /* location in energy void file */ |
| 890 | FILE *fp; /* for opening gold file */ |
| 891 | |
| 892 | move(6, 0)wmove(stdscr,(6),(0)); |
| 893 | clrtoeol()wclrtoeol(stdscr); |
| 894 | if (Player.p_specialtype < SC_COUNCIL2 && !Wizard) |
| 895 | /* king options */ |
| 896 | { |
| 897 | addstr("1:Transport 2:Curse 3:Energy Void 4:Bestow 5:Collect Taxes ")waddnstr(stdscr,("1:Transport 2:Curse 3:Energy Void 4:Bestow 5:Collect Taxes " ),-1); |
| 898 | |
| 899 | ch = getanswer(" ", TRUE1); |
| 900 | move(6, 0)wmove(stdscr,(6),(0)); |
| 901 | clrtoeol()wclrtoeol(stdscr); |
| 902 | move(4, 0)wmove(stdscr,(4),(0)); |
| 903 | switch (ch) { |
| 904 | case '1': /* transport someone */ |
| 905 | tamper = T_TRANSPORT3; |
| 906 | option = "transport"; |
| 907 | break; |
| 908 | |
| 909 | case '2': /* curse another */ |
| 910 | tamper = T_CURSED5; |
| 911 | option = "curse"; |
| 912 | break; |
| 913 | |
| 914 | case '3': /* create energy void */ |
| 915 | if ((loc = allocvoid()) > 20L * SZ_VOIDSTRUCTsizeof(struct energyvoid)) |
| 916 | /* can only have 20 void active at once */ |
| 917 | mvaddstr(5, 0, "Sorry, void creation limit reached.\n")(wmove((stdscr),((5)),((0))) == (-1) ? (-1) : waddnstr((stdscr ),(("Sorry, void creation limit reached.\n")),-1)); |
| 918 | else { |
| 919 | addstr("Enter the X Y coordinates of void ? ")waddnstr(stdscr,("Enter the X Y coordinates of void ? "),-1); |
| 920 | getstring(Databuf, SZ_DATABUF100); |
| 921 | sscanf(Databuf, "%lf %lf", &temp1, &temp2); |
| 922 | Enrgyvoid.ev_x = floor(temp1); |
| 923 | Enrgyvoid.ev_y = floor(temp2); |
| 924 | Enrgyvoid.ev_active = TRUE1; |
| 925 | writevoid(&Enrgyvoid, loc); |
| 926 | mvaddstr(5, 0, "It is done.\n")(wmove((stdscr),((5)),((0))) == (-1) ? (-1) : waddnstr((stdscr ),(("It is done.\n")),-1)); |
| 927 | } |
| 928 | return; |
| 929 | |
| 930 | case '4': /* bestow gold to subject */ |
| 931 | tamper = T_BESTOW4; |
| 932 | addstr("How much gold to bestow ? ")waddnstr(stdscr,("How much gold to bestow ? "),-1); |
| 933 | temp1 = infloat(); |
| 934 | if (temp1 > Player.p_gold || temp1 < 0) { |
| 935 | mvaddstr(5, 0, "You don't have that !\n")(wmove((stdscr),((5)),((0))) == (-1) ? (-1) : waddnstr((stdscr ),(("You don't have that !\n")),-1)); |
| 936 | return; |
| 937 | } |
| 938 | /* adjust gold after we are sure it will be given to |
| 939 | * someone */ |
| 940 | option = "give gold to"; |
| 941 | break; |
| 942 | |
| 943 | case '5': /* collect accumulated taxes */ |
| 944 | if ((fp = fopen(_PATH_GOLD"/var/games/phantasia/gold", "r+")) != NULL((void *)0)) |
| 945 | /* collect taxes */ |
| 946 | { |
| 947 | fread(&temp1, sizeof(double), 1, fp); |
| 948 | fseek(fp, 0L, SEEK_SET0); |
| 949 | /* clear out value */ |
| 950 | temp2 = 0.0; |
| 951 | fwrite(&temp2, sizeof(double), 1, fp); |
| 952 | fclose(fp); |
| 953 | } |
| 954 | mvprintw(4, 0, "You have collected %.0f in gold.\n", temp1); |
| 955 | Player.p_gold += floor(temp1); |
| 956 | return; |
| 957 | |
| 958 | default: |
| 959 | return; |
| 960 | } |
| 961 | /* end of king options */ |
| 962 | } else |
| 963 | /* council of wise, valar, wizard options */ |
| 964 | { |
| 965 | addstr("1:Heal ")waddnstr(stdscr,("1:Heal "),-1); |
| 966 | if (Player.p_palantir || Wizard) |
| 967 | addstr("2:Seek Grail ")waddnstr(stdscr,("2:Seek Grail "),-1); |
| 968 | if (Player.p_specialtype == SC_VALAR3 || Wizard) |
| 969 | addstr("3:Throw Monster 4:Relocate 5:Bless ")waddnstr(stdscr,("3:Throw Monster 4:Relocate 5:Bless "),-1 ); |
| 970 | if (Wizard) |
| 971 | addstr("6:Vaporize ")waddnstr(stdscr,("6:Vaporize "),-1); |
| 972 | |
| 973 | ch = getanswer(" ", TRUE1); |
| 974 | if (!Wizard) { |
| 975 | if (ch > '2' && Player.p_specialtype != SC_VALAR3) { |
| 976 | ILLCMD()(wmove((stdscr),((5)),((0))) == (-1) ? (-1) : waddnstr((stdscr ),((Illcmd)),-1)); |
| 977 | return; |
| 978 | } |
| 979 | if (Player.p_mana < MM_INTERVENE1000.0) { |
| 980 | mvaddstr(5, 0, "No mana left.\n")(wmove((stdscr),((5)),((0))) == (-1) ? (-1) : waddnstr((stdscr ),(("No mana left.\n")),-1)); |
| 981 | return; |
| 982 | } else |
| 983 | Player.p_mana -= MM_INTERVENE1000.0; |
| 984 | } |
| 985 | switch (ch) { |
| 986 | case '1': /* heal another */ |
| 987 | tamper = T_HEAL9; |
| 988 | option = "heal"; |
| 989 | break; |
| 990 | |
| 991 | case '2': /* seek grail */ |
| 992 | if (Player.p_palantir) |
| 993 | /* need a palantir to seek */ |
| 994 | { |
| 995 | fseek(Energyvoidfp, 0L, SEEK_SET0); |
| 996 | fread(&Enrgyvoid, SZ_VOIDSTRUCTsizeof(struct energyvoid), 1, Energyvoidfp); |
| 997 | temp1 = distance(Player.p_x, Enrgyvoid.ev_x, Player.p_y, Enrgyvoid.ev_y); |
| 998 | temp1 += ROLL(-temp1 / 10.0, temp1 / 5.0)floor((-temp1 / 10.0) + (temp1 / 5.0) * drandom()); /* add some error */ |
| 999 | mvprintw(5, 0, "The palantir says the Grail is about %.0f away.\n", temp1); |
| 1000 | } else |
| 1001 | /* no palantir */ |
| 1002 | mvaddstr(5, 0, "You need a palantir to seek the Grail.\n")(wmove((stdscr),((5)),((0))) == (-1) ? (-1) : waddnstr((stdscr ),(("You need a palantir to seek the Grail.\n")),-1)); |
| 1003 | return; |
| 1004 | |
| 1005 | case '3': /* lob monster at someone */ |
| 1006 | mvaddstr(4, 0, "Which monster [0-99] ? ")(wmove((stdscr),((4)),((0))) == (-1) ? (-1) : waddnstr((stdscr ),(("Which monster [0-99] ? ")),-1)); |
| 1007 | temp1 = infloat(); |
| 1008 | temp1 = MAX(0.0, MIN(99.0, temp1))((0.0) > (((99.0) < (temp1) ? (99.0) : (temp1))) ? (0.0 ) : (((99.0) < (temp1) ? (99.0) : (temp1)))); |
| 1009 | tamper = T_MONSTER6; |
| 1010 | option = "throw a monster at"; |
| 1011 | break; |
| 1012 | |
| 1013 | case '4': /* move another player */ |
| 1014 | mvaddstr(4, 0, "New X Y coordinates ? ")(wmove((stdscr),((4)),((0))) == (-1) ? (-1) : waddnstr((stdscr ),(("New X Y coordinates ? ")),-1)); |
| 1015 | getstring(Databuf, SZ_DATABUF100); |
| 1016 | sscanf(Databuf, "%lf %lf", &temp1, &temp2); |
| 1017 | tamper = T_RELOCATE8; |
| 1018 | option = "relocate"; |
| 1019 | break; |
| 1020 | |
| 1021 | case '5': /* bless a player */ |
| 1022 | tamper = T_BLESSED7; |
| 1023 | option = "bless"; |
| 1024 | break; |
| 1025 | |
| 1026 | case '6': /* kill off a player */ |
| 1027 | if (Wizard) { |
| 1028 | tamper = T_VAPORIZED10; |
| 1029 | option = "vaporize"; |
| 1030 | break; |
| 1031 | } else |
| 1032 | return; |
| 1033 | |
| 1034 | default: |
| 1035 | return; |
| 1036 | } |
| 1037 | |
| 1038 | /* adjust age after we are sure intervention will be done */ |
| 1039 | /* end of valar, etc. options */ |
| 1040 | } |
| 1041 | |
| 1042 | for (;;) |
| 1043 | /* prompt for player to affect */ |
| 1044 | { |
| 1045 | mvprintw(4, 0, "Who do you want to %s ? ", option); |
| 1046 | getstring(Databuf, SZ_DATABUF100); |
| 1047 | truncstring(Databuf); |
| 1048 | |
| 1049 | if (Databuf[0] == '\0') |
| 1050 | userlist(TRUE1); |
| 1051 | else |
| 1052 | break; |
| 1053 | } |
| 1054 | |
| 1055 | if (strcmp(Player.p_name, Databuf) != 0) |
| 1056 | /* name other than self */ |
| 1057 | { |
| 1058 | if ((loc = findname(Databuf, &Other)) >= 0L) { |
| 1059 | if (Other.p_tampered != T_OFF0) { |
| 1060 | mvaddstr(5, 0, "That person has something pending already.\n")(wmove((stdscr),((5)),((0))) == (-1) ? (-1) : waddnstr((stdscr ),(("That person has something pending already.\n")),-1)); |
| 1061 | return; |
| 1062 | } else { |
| 1063 | if (tamper == T_RELOCATE8 |
| 1064 | && CIRCLE(temp1, temp2)floor(distance(temp1, 0.0, temp2, 0.0) / 125.0 + 1) < CIRCLE(Other.p_x, Other.p_y)floor(distance(Other.p_x, 0.0, Other.p_y, 0.0) / 125.0 + 1) |
| 1065 | && !Wizard) |
| 1066 | mvaddstr(5, 0, "Cannot move someone closer to the Lord's Chamber.\n")(wmove((stdscr),((5)),((0))) == (-1) ? (-1) : waddnstr((stdscr ),(("Cannot move someone closer to the Lord's Chamber.\n")),- 1)); |
| 1067 | else { |
| 1068 | if (tamper == T_BESTOW4) |
| 1069 | Player.p_gold -= floor(temp1); |
| 1070 | if (!Wizard && (tamper == T_HEAL9 || tamper == T_MONSTER6 || |
| 1071 | tamper == T_RELOCATE8 || tamper == T_BLESSED7)) |
| 1072 | Player.p_age += N_AGE500; /* age penalty */ |
| 1073 | Other.p_tampered = tamper; |
| 1074 | Other.p_1scratch = floor(temp1); |
| 1075 | Other.p_2scratch = floor(temp2); |
| 1076 | writerecord(&Other, loc); |
| 1077 | mvaddstr(5, 0, "It is done.\n")(wmove((stdscr),((5)),((0))) == (-1) ? (-1) : waddnstr((stdscr ),(("It is done.\n")),-1)); |
| 1078 | } |
| 1079 | return; |
| 1080 | } |
| 1081 | } else |
| 1082 | /* player not found */ |
| 1083 | mvaddstr(5, 0, "There is no one by that name.\n")(wmove((stdscr),((5)),((0))) == (-1) ? (-1) : waddnstr((stdscr ),(("There is no one by that name.\n")),-1)); |
| 1084 | } else |
| 1085 | /* self */ |
| 1086 | mvaddstr(5, 0, "You may not do it to yourself!\n")(wmove((stdscr),((5)),((0))) == (-1) ? (-1) : waddnstr((stdscr ),(("You may not do it to yourself!\n")),-1)); |
| 1087 | } |
| 1088 | /* */ |
| 1089 | /************************************************************************ |
| 1090 | / |
| 1091 | / FUNCTION NAME: writevoid() |
| 1092 | / |
| 1093 | / FUNCTION: update energy void entry in energy void file |
| 1094 | / |
| 1095 | / AUTHOR: E. A. Estes, 12/4/85 |
| 1096 | / |
| 1097 | / ARGUMENTS: |
| 1098 | / struct energyvoid *vp - pointer to structure to write to file |
| 1099 | / long loc - location in file to update |
| 1100 | / |
| 1101 | / RETURN VALUE: none |
| 1102 | / |
| 1103 | / MODULES CALLED: fseek(), fwrite(), fflush() |
| 1104 | / |
| 1105 | / GLOBAL INPUTS: *Energyvoidfp |
| 1106 | / |
| 1107 | / GLOBAL OUTPUTS: none |
| 1108 | / |
| 1109 | / DESCRIPTION: |
| 1110 | / Write out energy void structure at specified location. |
| 1111 | / |
| 1112 | *************************************************************************/ |
| 1113 | |
| 1114 | void |
| 1115 | writevoid(struct energyvoid *vp, long loc) |
| 1116 | { |
| 1117 | |
| 1118 | fseek(Energyvoidfp, loc, SEEK_SET0); |
| 1119 | fwrite(vp, SZ_VOIDSTRUCTsizeof(struct energyvoid), 1, Energyvoidfp); |
| 1120 | fflush(Energyvoidfp); |
| 1121 | fseek(Energyvoidfp, 0L, SEEK_SET0); |
| 1122 | } |
| 1123 | /* */ |
| 1124 | /************************************************************************ |
| 1125 | / |
| 1126 | / FUNCTION NAME: allocvoid() |
| 1127 | / |
| 1128 | / FUNCTION: allocate space for a new energy void |
| 1129 | / |
| 1130 | / AUTHOR: E. A. Estes, 12/4/85 |
| 1131 | / |
| 1132 | / ARGUMENTS: none |
| 1133 | / |
| 1134 | / RETURN VALUE: location of new energy void space |
| 1135 | / |
| 1136 | / MODULES CALLED: fread(), fseek() |
| 1137 | / |
| 1138 | / GLOBAL INPUTS: *Energyvoidfp, Enrgyvoid |
| 1139 | / |
| 1140 | / GLOBAL OUTPUTS: none |
| 1141 | / |
| 1142 | / DESCRIPTION: |
| 1143 | / Search energy void file for an inactive entry and return its |
| 1144 | / location. |
| 1145 | / If no inactive ones are found, return one more than last location. |
| 1146 | / |
| 1147 | *************************************************************************/ |
| 1148 | |
| 1149 | long |
| 1150 | allocvoid(void) |
| 1151 | { |
| 1152 | long loc = 0L; /* location of new energy void */ |
| 1153 | |
| 1154 | fseek(Energyvoidfp, 0L, SEEK_SET0); |
| 1155 | while (fread(&Enrgyvoid, SZ_VOIDSTRUCTsizeof(struct energyvoid), 1, Energyvoidfp) == 1) |
| 1156 | if (Enrgyvoid.ev_active) |
| 1157 | loc += SZ_VOIDSTRUCTsizeof(struct energyvoid); |
| 1158 | else |
| 1159 | break; |
| 1160 | |
| 1161 | return (loc); |
| 1162 | } |