|
|
1.1 ! root 1: /*************************************************************************** ! 2: * WHOBJ.C - object animation code for Witchaven game * ! 3: * * ! 4: ***************************************************************************/ ! 5: ! 6: #include "icorp.h" ! 7: #include <memcheck.h> ! 8: ! 9: #pragma aux mulscale =\ ! 10: "imul ebx",\ ! 11: "shrd eax, edx, cl",\ ! 12: parm [eax][ebx][ecx]\ ! 13: modify [edx]\ ! 14: ! 15: extern int treasuresfound, ! 16: kills; ! 17: ! 18: ! 19: int shieldtype = 0; ! 20: int vampiretime = 0; ! 21: ! 22: long justwarpedcnt = 0; ! 23: extern justwarpedfx; ! 24: ! 25: extern int difficulty; ! 26: ! 27: extern int cartsnd; ! 28: ! 29: extern int mapon; ! 30: ! 31: extern int spellbooktics; ! 32: extern int spellbook; ! 33: extern int spellbookframe; ! 34: extern int spellbookflip; ! 35: ! 36: extern int pressedkey; ! 37: extern long pageoffset; ! 38: extern long selectedgun; ! 39: extern int currentpotion; ! 40: ! 41: short torchpattern[38] = {2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6, 4, 4, 6, 6, 4, 4, 6, 6, 4, 4, 6, 6, 4, 4, 6, 6, 5, 5, 4, 4, 3, 3, 3, 2, 2, 2}; ! 42: ! 43: char flashflag = 0x00; ! 44: ! 45: char displaybuf[50]; ! 46: char scorebuf[50]; ! 47: char healthbuf[50]; ! 48: char armorbuf[50]; ! 49: char potionbuf[50]; ! 50: ! 51: int displaytime; ! 52: int shadowtime; ! 53: int helmettime; ! 54: ! 55: int potiontilenum; ! 56: int debuginfo; ! 57: ! 58: int scoretime; ! 59: extern int strongtime, ! 60: invincibletime, ! 61: manatime, ! 62: invisibletime, ! 63: nightglowtime; ! 64: ! 65: extern ! 66: long qsetmode; ! 67: ! 68: void ! 69: monitor(void) ! 70: { ! 71: ! 72: int i, ! 73: j; ! 74: int val; ! 75: struct player *plr; ! 76: char buffer[20]; ! 77: long dist, ! 78: mindist; ! 79: short lockx, ! 80: locky; ! 81: short scrx, ! 82: scry; ! 83: char temph[30]; ! 84: ! 85: plr = &player[0]; ! 86: ! 87: if (justwarpedfx > 0) { ! 88: justwarpedfx -= synctics; ! 89: justwarpedcnt += synctics << 6; ! 90: rotatesprite(320 << 15, 200 << 15, justwarpedcnt << 9, 0, ANNIHILATE, 0, 0, 1 + 2, windowx1, windowy1, windowx2, windowy2); ! 91: if (justwarpedfx <= 0) ! 92: justwarpedcnt = 0; ! 93: } ! 94: ! 95: if (poisoned == 1) { ! 96: if (poisontime >= 0) { ! 97: poisontime -= synctics; ! 98: healthpic(0); ! 99: if (poisontime < 0) { ! 100: startredflash(50); ! 101: healthpic(-10); ! 102: poisontime = 7200; ! 103: } ! 104: } ! 105: } ! 106: ! 107: if (vampiretime > 0) ! 108: vampiretime -= synctics; ! 109: ! 110: if (shockme >= 0) ! 111: shockme -= synctics; ! 112: ! 113: if (helmettime > 0) { ! 114: helmettime -= synctics; ! 115: if (svga == 1) ! 116: rotatesprite(270L << 16, (long) (tilesizy[HELMET] >> 1) << 16, 32768L, 0, HELMET, 0, 0, 0x02, windowx1, windowy1, windowx2, windowy2); ! 117: else ! 118: rotatesprite(300L << 16, (long) (tilesizy[HELMET] >> 1) << 16, 32768L, 0, HELMET, 0, 0, 0x02, windowx1, windowy1, windowx2, windowy2); ! 119: } ! 120: ! 121: if (displaytime > 0) { ! 122: fancyfontscreen(18, 24, THEFONT, displaybuf); ! 123: displaytime -= ((long) synctics); ! 124: } ! 125: ! 126: if (shadowtime >= 0) ! 127: shadowtime -= synctics; ! 128: ! 129: if (nightglowtime >= 0) { ! 130: nightglowtime -= synctics; ! 131: visibility = 256; ! 132: if (nightglowtime < 0) ! 133: visibility = 1024; ! 134: } ! 135: ! 136: if (strongtime >= 0) { ! 137: strongtime -= synctics; ! 138: startwhiteflash(10); ! 139: } ! 140: ! 141: if (invisibletime >= 0) { ! 142: invisibletime -= synctics; ! 143: } ! 144: ! 145: if (manatime >= 0) { ! 146: manatime -= synctics; ! 147: } ! 148: ! 149: if (displaytime <= 0) { ! 150: if (manatime > 0) { ! 151: if (manatime < 512) { ! 152: if ((manatime%64) > 32) { ! 153: return; ! 154: } ! 155: } ! 156: fancyfontscreen(18, 24, THEFONT, "FIRE RESISTANCE"); ! 157: } ! 158: else if (poisoned == 1) { ! 159: fancyfontscreen(18, 24, THEFONT, "POISONED"); ! 160: } ! 161: else if (plr->orbactive[5] > 0) { ! 162: if (plr->orbactive[5] < 512) { ! 163: if ((plr->orbactive[5]%64) > 32) { ! 164: return; ! 165: } ! 166: } ! 167: fancyfontscreen(18, 24, THEFONT, "FLYING"); ! 168: } ! 169: else if (vampiretime > 0) { ! 170: fancyfontscreen(18, 24, THEFONT, "ORNATE HORN"); ! 171: } ! 172: } ! 173: return; ! 174: } ! 175: ! 176: extern ! 177: int droptheshield; ! 178: ! 179: extern void ! 180: fadeout(int start, int end, int red, int green, int blue, int steps); // JEFF ! 181: ! 182: extern ! 183: int spikeme; ! 184: ! 185: void ! 186: processobjs(struct player * plr) ! 187: { ! 188: ! 189: long dh, ! 190: dx, ! 191: dy, ! 192: dz, ! 193: nexti; ! 194: short i; ! 195: int j; ! 196: spritetype *spr; ! 197: ! 198: if (plr->sector < 0 || plr->sector >= numsectors) { ! 199: return; ! 200: } ! 201: i = headspritesect[plr->sector]; ! 202: while (i != -1) { ! 203: nexti = nextspritesect[i]; ! 204: spr = &sprite[i]; ! 205: dx = labs(plr->x - spr->x); // x distance to sprite ! 206: dy = labs(plr->y - spr->y); // y distance to sprite ! 207: dz = labs((plr->z >> 8) - (spr->z >> 8)); // z distance to sprite ! 208: dh = tilesizy[spr->picnum] >> 1; // height of sprite ! 209: if (dx + dy < PICKDISTANCE && dz - dh <= PICKHEIGHT) { ! 210: switch (spr->picnum) { ! 211: case SILVERBAG: ! 212: case SILVERCOINS: ! 213: strcpy(displaybuf, "Silver!"); ! 214: displaytime = 360; ! 215: deletesprite((short) i); ! 216: SND_Sound(S_POTION1); ! 217: score(rand() % 100 + 10); ! 218: break; ! 219: case GOLDBAG: ! 220: case GOLDBAG2: ! 221: case GOLDCOINS: ! 222: case GOLDCOINS2: ! 223: strcpy(displaybuf, "Gold!"); ! 224: displaytime = 360; ! 225: deletesprite((short) i); ! 226: SND_Sound(S_POTION1); ! 227: score(rand() % 100 + 10); ! 228: break; ! 229: case HELMET: ! 230: strcpy(displaybuf, "Hero Time"); ! 231: displaytime = 360; ! 232: deletesprite((short) i); ! 233: helmettime = 7200; ! 234: SND_Sound(S_STING1 + rand() % 2); ! 235: score(10); ! 236: treasuresfound++; ! 237: break; ! 238: case PLATEARMOR: ! 239: if (plr->armor <= 149) { ! 240: strcpy(displaybuf, "Plate Armor"); ! 241: displaytime = 360; ! 242: deletesprite((short) i); ! 243: plr->armortype = 3; ! 244: plr->armor = 0; ! 245: armorpic(150); ! 246: SND_Sound(S_POTION1); ! 247: score(40); ! 248: treasuresfound++; ! 249: } ! 250: break; ! 251: case CHAINMAIL: ! 252: if (plr->armor <= 99) { ! 253: strcpy(displaybuf, "Chain Mail"); ! 254: displaytime = 360; ! 255: deletesprite((short) i); ! 256: plr->armortype = 2; ! 257: plr->armor = 0; ! 258: armorpic(100); ! 259: SND_Sound(S_POTION1); ! 260: score(20); ! 261: treasuresfound++; ! 262: } ! 263: break; ! 264: case LEATHERARMOR: ! 265: if (plr->armor <= 49) { ! 266: strcpy(displaybuf, "Leather Armor"); ! 267: displaytime = 360; ! 268: deletesprite((short) i); ! 269: plr->armortype = 1; ! 270: plr->armor = 0; ! 271: armorpic(50); ! 272: SND_Sound(S_POTION1); ! 273: score(10); ! 274: treasuresfound++; ! 275: } ! 276: break; ! 277: case GIFTBOX: ! 278: treasuresfound++; ! 279: playsound_loc(S_TREASURE1, spr->x, spr->y); ! 280: j = rand() % 7; ! 281: switch (j) { ! 282: case 0: ! 283: switch (rand() % 5) { ! 284: case 0: ! 285: if (!potionspace(0)) { ! 286: break; ! 287: } ! 288: strcpy(displaybuf, "Health Potion"); ! 289: displaytime = 360; ! 290: updatepotion(HEALTHPOTION); ! 291: potionpic(0); ! 292: currentpotion = 0; ! 293: SND_Sound(S_POTION1); ! 294: score(10); ! 295: break; ! 296: case 1: ! 297: if (!potionspace(1)) { ! 298: break; ! 299: } ! 300: strcpy(displaybuf, "Strength Potion"); ! 301: displaytime = 360; ! 302: updatepotion(STRENGTHPOTION); ! 303: potionpic(1); ! 304: currentpotion = 1; ! 305: SND_Sound(S_POTION1); ! 306: score(20); ! 307: break; ! 308: case 2: ! 309: if (!potionspace(2)) { ! 310: break; ! 311: } ! 312: strcpy(displaybuf, "Cure Poison Potion"); ! 313: displaytime = 360; ! 314: updatepotion(ARMORPOTION); ! 315: potionpic(2); ! 316: currentpotion = 2; ! 317: SND_Sound(S_POTION1); ! 318: score(15); ! 319: break; ! 320: case 3: ! 321: if (!potionspace(3)) { ! 322: break; ! 323: } ! 324: strcpy(displaybuf, "Resist Fire Potion"); ! 325: displaytime = 360; ! 326: updatepotion(FIREWALKPOTION); ! 327: potionpic(3); ! 328: currentpotion = 3; ! 329: SND_Sound(S_POTION1); ! 330: score(15); ! 331: break; ! 332: case 4: ! 333: if (!potionspace(4)) { ! 334: break; ! 335: } ! 336: strcpy(displaybuf, "Invisibility Potion"); ! 337: displaytime = 360; ! 338: updatepotion(INVISIBLEPOTION); ! 339: potionpic(4); ! 340: currentpotion = 4; ! 341: SND_Sound(S_POTION1); ! 342: score(30); ! 343: break; ! 344: } ! 345: spr->picnum = OPENCHEST; ! 346: break; ! 347: case 1: ! 348: switch (rand() % 8) { ! 349: case 0: ! 350: if (plr->orbammo[0] < 10) { ! 351: plr->orb[0] = 1; ! 352: plr->orbammo[0]++; ! 353: strcpy(displaybuf, "Scare Scroll"); ! 354: displaytime = 360; ! 355: SND_Sound(S_POTION1); ! 356: } ! 357: break; ! 358: case 1: ! 359: if (plr->orbammo[1] < 10) { ! 360: plr->orb[1] = 1; ! 361: plr->orbammo[1]++; ! 362: strcpy(displaybuf, "Night Vision Scroll"); ! 363: displaytime = 360; ! 364: SND_Sound(S_POTION1); ! 365: } ! 366: break; ! 367: case 2: ! 368: if (plr->orbammo[2] < 10) { ! 369: plr->orb[2] = 1; ! 370: plr->orbammo[2]++; ! 371: strcpy(displaybuf, "Freeze Scroll"); ! 372: displaytime = 360; ! 373: SND_Sound(S_POTION1); ! 374: } ! 375: break; ! 376: case 3: ! 377: if (plr->orbammo[3] < 10) { ! 378: plr->orb[3] = 1; ! 379: plr->orbammo[3]++; ! 380: strcpy(displaybuf, "Magic Arrow Scroll"); ! 381: displaytime = 360; ! 382: SND_Sound(S_POTION1); ! 383: } ! 384: break; ! 385: case 4: ! 386: if (plr->orbammo[4] < 10) { ! 387: plr->orb[4] = 1; ! 388: plr->orbammo[4]++; ! 389: strcpy(displaybuf, "Open Door Scroll"); ! 390: displaytime = 360; ! 391: SND_Sound(S_POTION1); ! 392: } ! 393: break; ! 394: case 5: ! 395: if (plr->orbammo[5] < 10) { ! 396: plr->orb[5] = 1; ! 397: plr->orbammo[5]++; ! 398: strcpy(displaybuf, "Fly Scroll"); ! 399: displaytime = 360; ! 400: SND_Sound(S_POTION1); ! 401: } ! 402: break; ! 403: case 6: ! 404: if (plr->orbammo[6] < 10) { ! 405: plr->orb[6] = 1; ! 406: plr->orbammo[6]++; ! 407: strcpy(displaybuf, "Fireball Scroll"); ! 408: displaytime = 360; ! 409: SND_Sound(S_POTION1); ! 410: } ! 411: break; ! 412: case 7: ! 413: if (plr->orbammo[7] < 10) { ! 414: plr->orb[7] = 1; ! 415: plr->orbammo[7]++; ! 416: strcpy(displaybuf, "Nuke Scroll"); ! 417: displaytime = 360; ! 418: SND_Sound(S_POTION1); ! 419: } ! 420: break; ! 421: } ! 422: spr->picnum = OPENCHEST; ! 423: break; ! 424: case 2: ! 425: spr->picnum = OPENCHEST; ! 426: score((rand() % 400) + 100); ! 427: strcpy(displaybuf, "Treasure Chest"); ! 428: displaytime = 360; ! 429: SND_Sound(S_POTION1); ! 430: break; ! 431: case 3: ! 432: switch ((rand() % 5) + 1) { ! 433: case 1: ! 434: if (plr->ammo[1] < 12) { ! 435: plr->weapon[1] = 1; ! 436: plr->ammo[1] = 40; ! 437: strcpy(displaybuf, "Dagger"); ! 438: displaytime = 360; ! 439: SND_Sound(S_POTION1); ! 440: autoweaponchange(1); ! 441: score(10); ! 442: } ! 443: break; ! 444: case 2: ! 445: if (plr->ammo[3] < 12) { ! 446: plr->weapon[3] = 1; ! 447: plr->ammo[3] = 55; ! 448: strcpy(displaybuf, "Morning Star"); ! 449: displaytime = 360; ! 450: SND_Sound(S_POTION1); ! 451: autoweaponchange(3); ! 452: score(20); ! 453: } ! 454: break; ! 455: case 3: ! 456: if (plr->ammo[2] < 12) { ! 457: plr->weapon[2] = 1; ! 458: plr->ammo[2] = 30; ! 459: strcpy(displaybuf, "Short Sword"); ! 460: displaytime = 360; ! 461: SND_Sound(S_POTION1); ! 462: autoweaponchange(2); ! 463: score(10); ! 464: } ! 465: break; ! 466: case 4: ! 467: if (plr->ammo[5] < 12) { ! 468: plr->weapon[5] = 1; ! 469: plr->ammo[5] = 100; ! 470: strcpy(displaybuf, "Battle axe"); ! 471: displaytime = 360; ! 472: SND_Sound(S_POTION1); ! 473: autoweaponchange(5); ! 474: score(30); ! 475: } ! 476: break; ! 477: case 5: ! 478: if (plr->weapon[7] == 1) { ! 479: plr->weapon[7] = 2; ! 480: plr->ammo[7] = 1; ! 481: strcpy(displaybuf, "Pike axe"); ! 482: displaytime = 360; ! 483: deletesprite((short) i); ! 484: SND_Sound(S_POTION1); ! 485: score(30); ! 486: } ! 487: if (plr->weapon[7] == 2) { ! 488: plr->weapon[7] = 2; ! 489: plr->ammo[7]++; ! 490: strcpy(displaybuf, "Pike axe"); ! 491: displaytime = 360; ! 492: deletesprite((short) i); ! 493: SND_Sound(S_POTION1); ! 494: score(30); ! 495: } ! 496: if (plr->weapon[7] < 1) { ! 497: if (plr->ammo[7] < 12) { ! 498: plr->weapon[7] = 1; ! 499: plr->ammo[7] = 30; ! 500: strcpy(displaybuf, "Pike axe"); ! 501: displaytime = 360; ! 502: deletesprite((short) i); ! 503: SND_Sound(S_POTION1); ! 504: autoweaponchange(7); ! 505: score(30); ! 506: } ! 507: } ! 508: break; ! 509: } ! 510: spr->picnum = OPENCHEST; ! 511: break; ! 512: case 4: ! 513: // random armor ! 514: switch (krand() & 4) { ! 515: case 0: ! 516: strcpy(displaybuf, "Hero Time"); ! 517: displaytime = 360; ! 518: armorpic(10); ! 519: helmettime = 7200; ! 520: SND_Sound(S_STING1 + rand() % 2); ! 521: break; ! 522: case 1: ! 523: if (plr->armor <= 149) { ! 524: strcpy(displaybuf, "Plate Armor"); ! 525: displaytime = 360; ! 526: plr->armortype = 3; ! 527: plr->armor = 0; ! 528: armorpic(150); ! 529: SND_Sound(S_POTION1); ! 530: score(40); ! 531: } ! 532: break; ! 533: case 2: ! 534: if (plr->armor <= 99) { ! 535: strcpy(displaybuf, "Chain Mail"); ! 536: displaytime = 360; ! 537: plr->armortype = 2; ! 538: plr->armor = 0; ! 539: armorpic(100); ! 540: SND_Sound(S_POTION1); ! 541: score(20); ! 542: } ! 543: break; ! 544: case 3: ! 545: if (plr->armor <= 49) { ! 546: strcpy(displaybuf, "Leather Armor"); ! 547: displaytime = 360; ! 548: plr->armortype = 1; ! 549: plr->armor = 0; ! 550: armorpic(50); ! 551: SND_Sound(S_POTION1); ! 552: score(20); ! 553: } ! 554: break; ! 555: } ! 556: spr->picnum = OPENCHEST; ! 557: break; ! 558: case 5: ! 559: // poison chest ! 560: if (krand() & 2 == 0) { ! 561: poisoned = 1; ! 562: poisontime = 7200; ! 563: healthpic(-10); ! 564: strcpy(displaybuf, "Poisoned Chest"); ! 565: displaytime = 360; ! 566: } ! 567: else { ! 568: deletesprite((short) i); ! 569: score((krand() & 400) + 100); ! 570: strcpy(displaybuf, "Treasure Chest"); ! 571: displaytime = 360; ! 572: SND_Sound(S_POTION1); ! 573: } ! 574: break; ! 575: case 6: ! 576: explosion(i, spr->x, spr->y, spr->z, spr->owner); ! 577: playsound_loc(S_EXPLODE, spr->x, spr->y); ! 578: deletesprite((short) i); ! 579: break; ! 580: default: ! 581: spr->picnum = OPENCHEST; ! 582: score((rand() % 400) + 100); ! 583: strcpy(displaybuf, "Experience Gained"); ! 584: displaytime = 360; ! 585: SND_Sound(S_POTION1); ! 586: break; ! 587: } ! 588: break; ! 589: ! 590: case FLASKBLUE: ! 591: if (!potionspace(0)) ! 592: break; ! 593: strcpy(displaybuf, "Health Potion"); ! 594: displaytime = 360; ! 595: updatepotion(HEALTHPOTION); ! 596: potionpic(0); ! 597: currentpotion = 0; ! 598: deletesprite((short) i); ! 599: SND_Sound(S_POTION1); ! 600: score(10); ! 601: treasuresfound++; ! 602: break; ! 603: case FLASKRED: ! 604: if (!potionspace(3)) ! 605: break; ! 606: strcpy(displaybuf, "Resist Fire Potion"); ! 607: displaytime = 360; ! 608: updatepotion(FIREWALKPOTION); ! 609: potionpic(3); ! 610: currentpotion = 3; ! 611: deletesprite((short) i); ! 612: SND_Sound(S_POTION1); ! 613: score(20); ! 614: treasuresfound++; ! 615: break; ! 616: case FLASKGREEN: ! 617: if (!potionspace(1)) ! 618: break; ! 619: strcpy(displaybuf, "Strength Potion"); ! 620: displaytime = 360; ! 621: updatepotion(STRENGTHPOTION); ! 622: potionpic(1); ! 623: currentpotion = 1; ! 624: deletesprite((short) i); ! 625: SND_Sound(S_POTION1); ! 626: score(15); ! 627: treasuresfound++; ! 628: break; ! 629: case FLASKOCHRE: ! 630: if (!potionspace(2)) ! 631: break; ! 632: strcpy(displaybuf, "Cure Poison Potion"); ! 633: displaytime = 360; ! 634: updatepotion(ARMORPOTION); ! 635: potionpic(2); ! 636: currentpotion = 2; ! 637: deletesprite((short) i); ! 638: SND_Sound(S_POTION1); ! 639: score(15); ! 640: treasuresfound++; ! 641: break; ! 642: case FLASKTAN: ! 643: if (!potionspace(4)) ! 644: break; ! 645: strcpy(displaybuf, "Invisibility Potion"); ! 646: displaytime = 360; ! 647: updatepotion(INVISIBLEPOTION); ! 648: potionpic(4); ! 649: currentpotion = 4; ! 650: deletesprite((short) i); ! 651: SND_Sound(S_POTION1); ! 652: score(30); ! 653: treasuresfound++; ! 654: break; ! 655: case DIAMONDRING: ! 656: plr->treasure[0] = 1; ! 657: strcpy(displaybuf, "DIAMOND RING"); ! 658: displaytime = 360; ! 659: plr->armor = 0; ! 660: armorpic(200); ! 661: plr->armortype = 3; ! 662: deletesprite((short) i); ! 663: SND_Sound(S_POTION1); ! 664: score(25); ! 665: treasuresfound++; ! 666: break; ! 667: case SHADOWAMULET: ! 668: plr->treasure[1] = 1; ! 669: strcpy(displaybuf, "SHADOW AMULET"); ! 670: displaytime = 360; ! 671: deletesprite((short) i); ! 672: SND_Sound(S_POTION1); ! 673: shadowtime = 7500; ! 674: score(50); ! 675: treasuresfound++; ! 676: break; ! 677: case GLASSSKULL: ! 678: plr->treasure[2] = 1; ! 679: strcpy(displaybuf, "GLASS SKULL"); ! 680: displaytime = 360; ! 681: deletesprite((short) i); ! 682: SND_Sound(S_POTION1); ! 683: switch (plr->lvl) { ! 684: case 1: ! 685: plr->score = 2300; ! 686: break; ! 687: case 2: ! 688: plr->score = 4550; ! 689: break; ! 690: case 3: ! 691: plr->score = 9050; ! 692: break; ! 693: case 4: ! 694: plr->score = 18050; ! 695: break; ! 696: case 5: ! 697: plr->score = 36050; ! 698: break; ! 699: case 6: ! 700: plr->score = 75050; ! 701: break; ! 702: case 7: ! 703: plr->score = 180500; ! 704: break; ! 705: case 8: ! 706: plr->score = 280500; ! 707: break; ! 708: } ! 709: score(10); ! 710: treasuresfound++; ! 711: break; ! 712: case AHNK: ! 713: plr->treasure[3] = 1; ! 714: strcpy(displaybuf, "ANKH"); ! 715: displaytime = 360; ! 716: plr->health = 0; ! 717: healthpic(250); ! 718: deletesprite((short) i); ! 719: SND_Sound(S_POTION1); ! 720: score(100); ! 721: treasuresfound++; ! 722: break; ! 723: case BLUESCEPTER: ! 724: plr->treasure[4] = 1; ! 725: strcpy(displaybuf, "Water walk scepter"); ! 726: displaytime = 360; ! 727: deletesprite((short) i); ! 728: SND_Sound(S_POTION1); ! 729: score(10); ! 730: treasuresfound++; ! 731: break; ! 732: case YELLOWSCEPTER: ! 733: plr->treasure[5] = 1; ! 734: strcpy(displaybuf, "Fire walk scepter"); ! 735: displaytime = 360; ! 736: deletesprite((short) i); ! 737: SND_Sound(S_POTION1); ! 738: score(10); ! 739: treasuresfound++; ! 740: break; ! 741: case ADAMANTINERING: ! 742: // ring or protection +5 ! 743: plr->treasure[6] = 1; ! 744: strcpy(displaybuf, "ADAMANTINE RING"); ! 745: displaytime = 360; ! 746: deletesprite((short) i); ! 747: SND_Sound(S_POTION1); ! 748: score(30); ! 749: treasuresfound++; ! 750: break; ! 751: case ONYXRING: ! 752: // protection from missile ! 753: // anit-missile for level only ! 754: // dont forget to cleanup values ! 755: plr->treasure[7] = 1; ! 756: strcpy(displaybuf, "ONYX RING"); ! 757: displaytime = 360; ! 758: deletesprite((short) i); ! 759: SND_Sound(S_POTION1); ! 760: score(35); ! 761: treasuresfound++; ! 762: break; ! 763: case PENTAGRAM: ! 764: if (sector[plr->sector].lotag == 4002) ! 765: break; ! 766: else { ! 767: plr->treasure[8] = 1; ! 768: strcpy(displaybuf, "PENTAGRAM"); ! 769: displaytime = 360; ! 770: deletesprite((short) i); ! 771: SND_Sound(S_POTION1); ! 772: } ! 773: score(100); ! 774: treasuresfound++; ! 775: break; ! 776: case CRYSTALSTAFF: ! 777: plr->treasure[9] = 1; ! 778: strcpy(displaybuf, "CRYSTAL STAFF"); ! 779: displaytime = 360; ! 780: plr->health = 0; ! 781: healthpic(250); ! 782: plr->armortype = 2; ! 783: plr->armor = 0; ! 784: armorpic(300); ! 785: deletesprite((short) i); ! 786: SND_Sound(S_POTION1); ! 787: score(150); ! 788: treasuresfound++; ! 789: break; ! 790: case AMULETOFTHEMIST: ! 791: plr->treasure[10] = 1; ! 792: strcpy(displaybuf, "AMULET OF THE MIST"); ! 793: displaytime = 360; ! 794: deletesprite((short) i); ! 795: SND_Sound(S_POTION1); ! 796: invisibletime = 3200; ! 797: score(75); ! 798: treasuresfound++; ! 799: break; ! 800: case THEHORN: ! 801: plr->treasure[12] = 1; ! 802: strcpy(displaybuf, "Ornate Horn"); ! 803: displaytime = 360; ! 804: deletesprite((short) i); ! 805: SND_Sound(S_POTION1); ! 806: vampiretime = 7200; ! 807: // gain 5-10 hp when you kill something ! 808: // for 60 seconds ! 809: score(350); ! 810: treasuresfound++; ! 811: break; ! 812: case SAPHIRERING: ! 813: plr->treasure[13] = 1; ! 814: strcpy(displaybuf, "SAPPHIRE RING"); ! 815: displaytime = 360; ! 816: plr->armortype = 3; ! 817: deletesprite((short) i); ! 818: SND_Sound(S_POTION1); ! 819: score(25); ! 820: treasuresfound++; ! 821: break; ! 822: case BRASSKEY: ! 823: plr->treasure[14] = 1; ! 824: strcpy(displaybuf, "BRASS KEY"); ! 825: displaytime = 360; ! 826: deletesprite((short) i); ! 827: SND_Sound(S_POTION1); ! 828: keyspic(); ! 829: score(15); ! 830: treasuresfound++; ! 831: break; ! 832: case BLACKKEY: ! 833: plr->treasure[15] = 1; ! 834: strcpy(displaybuf, "BLACK KEY"); ! 835: displaytime = 360; ! 836: deletesprite((short) i); ! 837: SND_Sound(S_POTION1); ! 838: keyspic(); ! 839: score(15); ! 840: treasuresfound++; ! 841: break; ! 842: case GLASSKEY: ! 843: plr->treasure[16] = 1; ! 844: strcpy(displaybuf, "GLASS KEY"); ! 845: displaytime = 360; ! 846: deletesprite((short) i); ! 847: SND_Sound(S_POTION1); ! 848: keyspic(); ! 849: score(15); ! 850: treasuresfound++; ! 851: break; ! 852: case IVORYKEY: ! 853: plr->treasure[17] = 1; ! 854: strcpy(displaybuf, "IVORY KEY"); ! 855: displaytime = 360; ! 856: deletesprite((short) i); ! 857: SND_Sound(S_POTION1); ! 858: keyspic(); ! 859: score(15); ! 860: treasuresfound++; ! 861: break; ! 862: case SCROLLSCARE: ! 863: if (plr->orbammo[0] < 10) { ! 864: plr->orb[0] = 1; ! 865: plr->orbammo[0]+=5; ! 866: if (plr->orbammo[0] >= 10) { ! 867: plr->orbammo[0] = 9; ! 868: } ! 869: strcpy(displaybuf, "Scare Scroll"); ! 870: displaytime = 360; ! 871: deletesprite((short) i); ! 872: SND_Sound(S_POTION1); ! 873: treasuresfound++; ! 874: keystatus[0x3B] = 1; ! 875: } ! 876: break; ! 877: case SCROLLNIGHT: ! 878: if (plr->orbammo[1] < 10) { ! 879: plr->orb[1] = 1; ! 880: plr->orbammo[1] += 5; ! 881: if (plr->orbammo[1] >= 10) { ! 882: plr->orbammo[1] = 9; ! 883: } ! 884: strcpy(displaybuf, "Night Vision Scroll"); ! 885: displaytime = 360; ! 886: deletesprite((short) i); ! 887: SND_Sound(S_POTION1); ! 888: treasuresfound++; ! 889: keystatus[0x3B+1] = 1; ! 890: } ! 891: break; ! 892: case SCROLLFREEZE: ! 893: if (plr->orbammo[2] < 10) { ! 894: plr->orb[2] = 1; ! 895: plr->orbammo[2] += 5; ! 896: if (plr->orbammo[2] >= 10) { ! 897: plr->orbammo[2] = 9; ! 898: } ! 899: strcpy(displaybuf, "Freeze Scroll"); ! 900: displaytime = 360; ! 901: deletesprite((short) i); ! 902: SND_Sound(S_POTION1); ! 903: treasuresfound++; ! 904: keystatus[0x3B+2] = 1; ! 905: } ! 906: break; ! 907: case SCROLLMAGIC: ! 908: if (plr->orbammo[3] < 10) { ! 909: plr->orb[3] = 1; ! 910: plr->orbammo[3] += 5; ! 911: if (plr->orbammo[3] >= 10) { ! 912: plr->orbammo[3] = 9; ! 913: } ! 914: strcpy(displaybuf, "Magic Arrow Scroll"); ! 915: displaytime = 360; ! 916: deletesprite((short) i); ! 917: SND_Sound(S_POTION1); ! 918: treasuresfound++; ! 919: keystatus[0x3B+3] = 1; ! 920: } ! 921: break; ! 922: case SCROLLOPEN: ! 923: if (plr->orbammo[4] < 10) { ! 924: plr->orb[4] = 1; ! 925: plr->orbammo[4] += 5; ! 926: if (plr->orbammo[4] >= 10) { ! 927: plr->orbammo[4] = 9; ! 928: } ! 929: strcpy(displaybuf, "Open Door Scroll"); ! 930: displaytime = 360; ! 931: deletesprite((short) i); ! 932: SND_Sound(S_POTION1); ! 933: treasuresfound++; ! 934: keystatus[0x3B+4] = 1; ! 935: } ! 936: break; ! 937: case SCROLLFLY: ! 938: if (plr->orbammo[5] < 10) { ! 939: plr->orb[5] = 1; ! 940: plr->orbammo[5] += 5; ! 941: if (plr->orbammo[5] >= 10) { ! 942: plr->orbammo[5] = 9; ! 943: } ! 944: strcpy(displaybuf, "Fly Scroll"); ! 945: displaytime = 360; ! 946: deletesprite((short) i); ! 947: SND_Sound(S_POTION1); ! 948: treasuresfound++; ! 949: keystatus[0x3B+5] = 1; ! 950: } ! 951: break; ! 952: case SCROLLFIREBALL: ! 953: if (plr->orbammo[6] < 10) { ! 954: plr->orb[6] = 1; ! 955: plr->orbammo[6] += 5; ! 956: if (plr->orbammo[6] >= 10) { ! 957: plr->orbammo[6] = 9; ! 958: } ! 959: strcpy(displaybuf, "Fireball Scroll"); ! 960: displaytime = 360; ! 961: deletesprite((short) i); ! 962: SND_Sound(S_POTION1); ! 963: treasuresfound++; ! 964: keystatus[0x3B+6] = 1; ! 965: } ! 966: break; ! 967: case SCROLLNUKE: ! 968: if (plr->orbammo[7] < 10) { ! 969: plr->orb[7] = 1; ! 970: plr->orbammo[7] += 5; ! 971: if (plr->orbammo[7] >= 10) { ! 972: plr->orbammo[7] = 9; ! 973: } ! 974: strcpy(displaybuf, "Nuke Scroll"); ! 975: displaytime = 360; ! 976: deletesprite((short) i); ! 977: SND_Sound(S_POTION1); ! 978: treasuresfound++; ! 979: keystatus[0x3B+7] = 1; ! 980: } ! 981: break; ! 982: case QUIVER: ! 983: if (plr->ammo[6] < 100) { ! 984: plr->ammo[6] += 25; ! 985: if (plr->ammo[6] > 100) ! 986: plr->ammo[6] = 100; ! 987: strcpy(displaybuf, "Quiver of arrows"); ! 988: displaytime = 360; ! 989: deletesprite((short) i); ! 990: SND_Sound(S_POTION1); ! 991: score(10); ! 992: levelpic(); ! 993: } ! 994: break; ! 995: case WALLBOW: ! 996: case BOW: ! 997: plr->weapon[6] = 1; ! 998: plr->ammo[6] += 10; ! 999: if (plr->ammo[6] > 100) ! 1000: plr->ammo[6] = 100; ! 1001: strcpy(displaybuf, "long bow"); ! 1002: displaytime = 360; ! 1003: deletesprite((short) i); ! 1004: SND_Sound(S_POTION1); ! 1005: autoweaponchange(6); ! 1006: score(10); ! 1007: break; ! 1008: case WEAPON1: ! 1009: if (plr->ammo[1] < 12) { ! 1010: plr->weapon[1] = 1; ! 1011: plr->ammo[1] = 40; ! 1012: strcpy(displaybuf, "Dagger"); ! 1013: displaytime = 360; ! 1014: deletesprite((short) i); ! 1015: SND_Sound(S_POTION1); ! 1016: autoweaponchange(1); ! 1017: score(10); ! 1018: } ! 1019: break; ! 1020: case WEAPON1A: ! 1021: if (plr->ammo[1] < 12) { ! 1022: plr->weapon[1] = 3; ! 1023: plr->ammo[1] = 80; ! 1024: strcpy(displaybuf, "Jeweled Dagger"); ! 1025: displaytime = 360; ! 1026: deletesprite((short) i); ! 1027: SND_Sound(S_POTION1); ! 1028: autoweaponchange(1); ! 1029: score(30); ! 1030: } ! 1031: break; ! 1032: case GOBWEAPON: ! 1033: if (plr->ammo[2] < 12) { ! 1034: plr->weapon[2] = 1; ! 1035: plr->ammo[2] = 20; ! 1036: strcpy(displaybuf, "Short sword"); ! 1037: displaytime = 360; ! 1038: deletesprite((short) i); ! 1039: SND_Sound(S_POTION1); ! 1040: autoweaponchange(2); ! 1041: score(10); ! 1042: } ! 1043: break; ! 1044: case WEAPON2: ! 1045: if (plr->ammo[3] < 12) { ! 1046: plr->weapon[3] = 1; ! 1047: plr->ammo[3] = 55; ! 1048: strcpy(displaybuf, "Morning Star"); ! 1049: displaytime = 360; ! 1050: deletesprite((short) i); ! 1051: SND_Sound(S_POTION1); ! 1052: autoweaponchange(3); ! 1053: score(20); ! 1054: } ! 1055: break; ! 1056: case WALLSWORD: ! 1057: case WEAPON3A: ! 1058: if (plr->ammo[4] < 12) { ! 1059: plr->weapon[4] = 1; ! 1060: plr->ammo[4] = 160; ! 1061: strcpy(displaybuf, "Broad Sword"); ! 1062: displaytime = 360; ! 1063: deletesprite((short) i); ! 1064: SND_Sound(S_POTION1); ! 1065: autoweaponchange(4); ! 1066: score(60); ! 1067: } ! 1068: case WEAPON3: ! 1069: if (plr->ammo[4] < 12) { ! 1070: plr->weapon[4] = 1; ! 1071: plr->ammo[4] = 80; ! 1072: strcpy(displaybuf, "Broad Sword"); ! 1073: displaytime = 360; ! 1074: deletesprite((short) i); ! 1075: SND_Sound(S_POTION1); ! 1076: autoweaponchange(4); ! 1077: score(30); ! 1078: } ! 1079: break; ! 1080: case WALLAXE: ! 1081: case WEAPON4: ! 1082: if (plr->ammo[5] < 12) { ! 1083: plr->weapon[5] = 1; ! 1084: plr->ammo[5] = 100; ! 1085: strcpy(displaybuf, "Battle axe"); ! 1086: displaytime = 360; ! 1087: deletesprite((short) i); ! 1088: SND_Sound(S_POTION1); ! 1089: autoweaponchange(5); ! 1090: score(30); ! 1091: } ! 1092: break; ! 1093: case THROWHALBERD: ! 1094: case WEAPON5: ! 1095: if (plr->ammo[9] < 12) { ! 1096: plr->weapon[9] = 1; ! 1097: plr->ammo[9] = 30; ! 1098: strcpy(displaybuf, "Halberd"); ! 1099: displaytime = 360; ! 1100: deletesprite((short) i); ! 1101: SND_Sound(S_POTION1); ! 1102: autoweaponchange(9); ! 1103: score(30); ! 1104: } ! 1105: break; ! 1106: case GONZOBSHIELD: ! 1107: case GONZOCSHIELD: ! 1108: case GONZOGSHIELD: ! 1109: if (shieldpoints < 100) { ! 1110: shieldtype = 2; ! 1111: shieldpoints = 200; ! 1112: droptheshield = 0; ! 1113: deletesprite((short) i); ! 1114: strcpy(displaybuf, "Magic Shield"); ! 1115: displaytime = 360; ! 1116: SND_Sound(S_POTION1); ! 1117: score(50); ! 1118: } ! 1119: break; ! 1120: case SHIELD: ! 1121: if (shieldpoints < 100) { ! 1122: shieldtype = 1; ! 1123: shieldpoints = 100; ! 1124: droptheshield = 0; ! 1125: deletesprite((short) i); ! 1126: strcpy(displaybuf, "Shield"); ! 1127: displaytime = 360; ! 1128: SND_Sound(S_POTION1); ! 1129: score(10); ! 1130: } ! 1131: break; ! 1132: case WEAPON5B: ! 1133: if (plr->ammo[9] < 12) { ! 1134: deletesprite((short) i); ! 1135: } ! 1136: break; ! 1137: case WALLPIKE: ! 1138: case THROWPIKE + 1: ! 1139: if (plr->weapon[7] == 1) { ! 1140: plr->weapon[7] = 2; ! 1141: plr->ammo[7] = 2; ! 1142: strcpy(displaybuf, "Pike axe"); ! 1143: displaytime = 360; ! 1144: deletesprite((short) i); ! 1145: if ((rand()%10) > 6) ! 1146: SND_Sound(S_PICKUPAXE); ! 1147: score(30); ! 1148: levelpic(); ! 1149: } ! 1150: if (plr->weapon[7] == 2) { ! 1151: plr->weapon[7] = 2; ! 1152: plr->ammo[7]++; ! 1153: strcpy(displaybuf, "Pike axe"); ! 1154: displaytime = 360; ! 1155: deletesprite((short) i); ! 1156: if ((rand()%10) > 6) ! 1157: SND_Sound(S_PICKUPAXE); ! 1158: // score(30); ! 1159: levelpic(); ! 1160: } ! 1161: if (plr->weapon[7] < 1) { ! 1162: if (plr->ammo[7] < 12) { ! 1163: plr->weapon[7] = 1; ! 1164: plr->ammo[7] = 30; ! 1165: strcpy(displaybuf, "Pike axe"); ! 1166: displaytime = 360; ! 1167: deletesprite((short) i); ! 1168: SND_Sound(S_POTION1); ! 1169: autoweaponchange(7); ! 1170: score(30); ! 1171: } ! 1172: } ! 1173: ! 1174: break; ! 1175: case WEAPON6: ! 1176: if (plr->weapon[7] == 1) { ! 1177: plr->weapon[7] = 2; ! 1178: plr->ammo[7] = 25; ! 1179: strcpy(displaybuf, "Pike axe"); ! 1180: displaytime = 360; ! 1181: deletesprite((short) i); ! 1182: SND_Sound(S_POTION1); ! 1183: score(30); ! 1184: levelpic(); ! 1185: } ! 1186: if (plr->weapon[7] == 2) { ! 1187: plr->weapon[7] = 2; ! 1188: plr->ammo[7] += 25; ! 1189: strcpy(displaybuf, "Pike axe"); ! 1190: displaytime = 360; ! 1191: deletesprite((short) i); ! 1192: SND_Sound(S_POTION1); ! 1193: // score(30); ! 1194: levelpic(); ! 1195: } ! 1196: if (plr->weapon[7] < 1) { ! 1197: if (plr->ammo[7] < 12) { ! 1198: plr->weapon[7] = 2; ! 1199: plr->ammo[7] = 25; ! 1200: strcpy(displaybuf, "Pike axe"); ! 1201: displaytime = 360; ! 1202: deletesprite((short) i); ! 1203: SND_Sound(S_POTION1); ! 1204: autoweaponchange(7); ! 1205: score(30); ! 1206: } ! 1207: } ! 1208: break; ! 1209: // case WEAPON7: ! 1210: case WEAPON8: ! 1211: if (plr->ammo[8] < 12) { ! 1212: plr->weapon[8] = 1; ! 1213: plr->ammo[8] = 250; ! 1214: strcpy(displaybuf, "Two Handed Sword"); ! 1215: displaytime = 360; ! 1216: deletesprite((short) i); ! 1217: SND_Sound(S_POTION1); ! 1218: autoweaponchange(8); ! 1219: score(30); ! 1220: } ! 1221: break; ! 1222: case SPIKEBLADE: ! 1223: if (!godmode) ! 1224: if (invincibletime <= 0) { ! 1225: spikeme = 1; ! 1226: } ! 1227: break; ! 1228: case SPIKE: ! 1229: if (!godmode) ! 1230: if (invincibletime <= 0) { ! 1231: spikeme = 1; ! 1232: } ! 1233: break; ! 1234: case SPIKEPOLE: ! 1235: if (!godmode) ! 1236: if (invincibletime <= 0) { ! 1237: spikeme = 1; ! 1238: } ! 1239: break; ! 1240: case MONSTERBALL: ! 1241: if (sprite[i].owner != 4096) ! 1242: if (manatime < 1) ! 1243: healthpic(-1); ! 1244: break; ! 1245: case HORNEDSKULL: ! 1246: fadeout(0,255,0,0,0,64); // JEFF ! 1247: victory(0); ! 1248: } ! 1249: if (sprite[i].picnum >= EXPLOSTART ! 1250: && sprite[i].picnum <= EXPLOEND ! 1251: && sprite[i].owner != 4096) ! 1252: if (manatime < 1) ! 1253: healthpic(-1); ! 1254: ! 1255: } ! 1256: i = nexti; ! 1257: } ! 1258: ! 1259: } ! 1260: ! 1261: int ! 1262: potionspace(int vial) ! 1263: { ! 1264: ! 1265: struct player *plr; ! 1266: ! 1267: plr = &player[0]; ! 1268: ! 1269: if (plr->potion[vial] > 9) ! 1270: return (0); ! 1271: else ! 1272: return (1); ! 1273: } ! 1274: ! 1275: void ! 1276: updatepotion(int vial) ! 1277: { ! 1278: ! 1279: struct player *plr; ! 1280: ! 1281: plr = &player[0]; ! 1282: ! 1283: switch (vial) { ! 1284: case HEALTHPOTION: ! 1285: plr->potion[0]++; ! 1286: break; ! 1287: case STRENGTHPOTION: ! 1288: plr->potion[1]++; ! 1289: break; ! 1290: case ARMORPOTION: ! 1291: plr->potion[2]++; ! 1292: break; ! 1293: case FIREWALKPOTION: ! 1294: plr->potion[3]++; ! 1295: break; ! 1296: case INVISIBLEPOTION: ! 1297: plr->potion[4]++; ! 1298: break; ! 1299: } ! 1300: potionpic(currentpotion); ! 1301: ! 1302: } ! 1303: ! 1304: extern ! 1305: int debuganalyzespritesflag; ! 1306: ! 1307: int tspritelistcnt; ! 1308: ! 1309: spritetype tspritelist[MAXSPRITESONSCREEN]; ! 1310: ! 1311: void ! 1312: transformactors(struct player * plr) ! 1313: { ! 1314: ! 1315: long i, ! 1316: j, ! 1317: k; ! 1318: point3d *ospr; ! 1319: spritetype *tspr; ! 1320: ! 1321: tspritelistcnt=spritesortcnt; ! 1322: for (i = 0, tspr = &tsprite[0]; i < spritesortcnt; i++, tspr++) { ! 1323: memmove(&tspritelist[i],tspr,sizeof(spritetype)); ! 1324: switch (tspr->picnum) { ! 1325: case GRONHAL: ! 1326: case GRONSW: ! 1327: case GRONSWATTACK: ! 1328: case GRONMU: ! 1329: case DEVILSTAND: ! 1330: case DEVIL: ! 1331: case DEVILATTACK: ! 1332: case MINOTAUR: ! 1333: case MINOTAURATTACK: ! 1334: k = getangle(tspr->x - plr->x, tspr->y - plr->y); ! 1335: k = (((tspr->ang + 3072 + 128 - k) & 2047) >> 8) & 7; ! 1336: if (k <= 4) { ! 1337: tspr->picnum += (k << 2); ! 1338: tspr->cstat &= ~4; // clear x-flipping bit ! 1339: } ! 1340: else { ! 1341: tspr->picnum += ((8 - k) << 2); ! 1342: tspr->cstat |= 4; // set x-flipping bit ! 1343: } ! 1344: break; ! 1345: case SKELETON: ! 1346: case IMP: ! 1347: k = getangle(tspr->x - plr->x, tspr->y - plr->y); ! 1348: k = (((tspr->ang + 3072 + 128 - k) & 2047) >> 8) & 7; ! 1349: if (k <= 4) { ! 1350: tspr->picnum += (k * 6); ! 1351: tspr->cstat &= ~4; // clear x-flipping bit ! 1352: } ! 1353: else { ! 1354: tspr->picnum += ((8 - k) * 6); ! 1355: tspr->cstat |= 4; // set x-flipping bit ! 1356: } ! 1357: break; ! 1358: case KURTAT: ! 1359: case KOBOLD: ! 1360: k = getangle(tspr->x - plr->x, tspr->y - plr->y); ! 1361: k = (((tspr->ang + 3072 + 128 - k) & 2047) >> 8) & 7; ! 1362: if (k <= 4) { ! 1363: tspr->picnum += (k * 5); ! 1364: tspr->cstat &= ~4; // clear x-flipping bit ! 1365: } ! 1366: else { ! 1367: tspr->picnum += ((8 - k) * 5); ! 1368: tspr->cstat |= 4; // set x-flipping bit ! 1369: } ! 1370: break; ! 1371: case KATIE: ! 1372: case KATIEAT: ! 1373: ! 1374: k = getangle(tspr->x - plr->x, tspr->y - plr->y); ! 1375: k = (((tspr->ang + 3072 + 128 - k) & 2047) >> 8) & 7; ! 1376: if (k <= 4) { ! 1377: tspr->picnum += (k * 5); ! 1378: // tspr->cstat &= ~4; //clear x-flipping bit ! 1379: tspr->cstat |= 4; // set x-flipping bit ! 1380: } ! 1381: else { ! 1382: tspr->picnum += ((8 - k) * 5); ! 1383: // tspr->cstat |= 4; //set x-flipping bit ! 1384: tspr->cstat &= ~4; // clear x-flipping bit ! 1385: } ! 1386: break; ! 1387: ! 1388: case NEWGUY: ! 1389: case NEWGUYBOW: ! 1390: case NEWGUYMACE: ! 1391: ! 1392: case GONZOCSW: ! 1393: case GONZOCSWAT: ! 1394: k = getangle(tspr->x - plr->x, tspr->y - plr->y); ! 1395: k = (((tspr->ang + 3072 + 128 - k) & 2047) >> 8) & 7; ! 1396: if (k <= 4) { ! 1397: tspr->picnum += (k * 6); ! 1398: tspr->cstat &= ~4; // clear x-flipping bit ! 1399: } ! 1400: else { ! 1401: tspr->picnum += ((8 - k) * 6); ! 1402: tspr->cstat |= 4; // set x-flipping bit ! 1403: } ! 1404: break; ! 1405: ! 1406: break; ! 1407: case GONZOGSW: ! 1408: case GONZOGHM: ! 1409: k = getangle(tspr->x - plr->x, tspr->y - plr->y); ! 1410: k = (((tspr->ang + 3072 + 128 - k) & 2047) >> 8) & 7; ! 1411: if (k <= 4) { ! 1412: tspr->picnum += (k * 6); ! 1413: // tspr->cstat &= ~4; //clear x-flipping bit ! 1414: tspr->cstat |= 4; // set x-flipping bit ! 1415: } ! 1416: else { ! 1417: tspr->picnum += ((8 - k) * 6); ! 1418: // tspr->cstat |= 4; //set x-flipping bit ! 1419: tspr->cstat &= ~4; // clear x-flipping bit ! 1420: ! 1421: } ! 1422: break; ! 1423: ! 1424: case GONZOGSH: ! 1425: k = getangle(tspr->x - plr->x, tspr->y - plr->y); ! 1426: k = (((tspr->ang + 3072 + 128 - k) & 2047) >> 8) & 7; ! 1427: ! 1428: tspr->picnum += (k * 6); ! 1429: tspr->cstat |= 4; // set x-flipping bit ! 1430: break; ! 1431: ! 1432: ! 1433: case GRONMUATTACK: ! 1434: k = getangle(tspr->x - plr->x, tspr->y - plr->y); ! 1435: k = (((tspr->ang + 3072 + 128 - k) & 2047) >> 8) & 7; ! 1436: if (k <= 4) { ! 1437: tspr->picnum += (k * 6); ! 1438: tspr->cstat &= ~4; // clear x-flipping bit ! 1439: } ! 1440: else { ! 1441: tspr->picnum += ((8 - k) * 6); ! 1442: tspr->cstat |= 4; // set x-flipping bit ! 1443: } ! 1444: break; ! 1445: ! 1446: case GRONHALATTACK: ! 1447: k = getangle(tspr->x - plr->x, tspr->y - plr->y); ! 1448: k = (((tspr->ang + 3072 + 128 - k) & 2047) >> 8) & 7; ! 1449: if (k <= 4) { ! 1450: tspr->picnum += (k * 7); ! 1451: tspr->cstat &= ~4; // clear x-flipping bit ! 1452: } ! 1453: else { ! 1454: tspr->picnum += ((8 - k) * 7); ! 1455: tspr->cstat |= 4; // set x-flipping bit ! 1456: } ! 1457: break; ! 1458: case NEWGUYCAST: ! 1459: case NEWGUYPUNCH: ! 1460: case KURTPUNCH: ! 1461: k = getangle(tspr->x - plr->x, tspr->y - plr->y); ! 1462: k = (((tspr->ang + 3072 + 128 - k) & 2047) >> 8) & 7; ! 1463: if (k <= 4) { ! 1464: tspr->picnum += (k * 3); ! 1465: tspr->cstat &= ~4; // clear x-flipping bit ! 1466: } ! 1467: else { ! 1468: tspr->picnum += ((8 - k) * 3); ! 1469: tspr->cstat |= 4; // set x-flipping bit ! 1470: } ! 1471: break; ! 1472: case RAT: ! 1473: k = getangle(tspr->x - plr->x, tspr->y - plr->y); ! 1474: k = (((tspr->ang + 3072 + 128 - k) & 2047) >> 8) & 7; ! 1475: if (k <= 4) { ! 1476: tspr->picnum += (k * 2); ! 1477: tspr->cstat &= ~4; // clear x-flipping bit ! 1478: } ! 1479: else { ! 1480: tspr->picnum += ((8 - k) * 2); ! 1481: tspr->cstat |= 4; // set x-flipping bit ! 1482: } ! 1483: break; ! 1484: case NEWGUYSTAND: ! 1485: case NEWGUYKNEE: ! 1486: case KURTSTAND: ! 1487: case KURTKNEE: ! 1488: case GUARDIAN: ! 1489: k = getangle(tspr->x - plr->x, tspr->y - plr->y); ! 1490: k = (((tspr->ang + 3072 + 128 - k) & 2047) >> 8) & 7; ! 1491: if (k <= 4) { ! 1492: tspr->picnum += k; ! 1493: tspr->cstat &= ~4; // clear x-flipping bit ! 1494: } ! 1495: else { ! 1496: tspr->picnum += (8 - k); ! 1497: tspr->cstat |= 4; // set x-flipping bit ! 1498: } ! 1499: break; ! 1500: } ! 1501: if (debuganalyzespritesflag) { ! 1502: sprintf(tempbuf,"%d: K=%d PIC=%04d CSTAT=%04X SHADE=%02d " ! 1503: "SECT=%05d STAT=%04d",i,k,tspr->picnum, ! 1504: tspr->cstat,tspr->shade,tspr->sectnum, ! 1505: tspr->statnum); ! 1506: printext256(0L,(i*8L),31,-1,tempbuf,1); ! 1507: } ! 1508: } ! 1509: } ! 1510: ! 1511: void ! 1512: newstatus(short sn, int seq) ! 1513: { ! 1514: ! 1515: struct player *plr; ! 1516: spritetype *spr; ! 1517: int j; ! 1518: long k; ! 1519: ! 1520: spr = &sprite[sn]; ! 1521: ! 1522: switch (seq) { ! 1523: case CHILL: ! 1524: if (netgame) { ! 1525: break; ! 1526: } ! 1527: sprite[sn].lotag = 60; ! 1528: changespritestat(sn, CHILL); ! 1529: break; ! 1530: case AMBUSH: ! 1531: if (netgame) { ! 1532: break; ! 1533: } ! 1534: changespritestat(sn, AMBUSH); ! 1535: break; ! 1536: case LAND: ! 1537: if (netgame) { ! 1538: break; ! 1539: } ! 1540: changespritestat(sn, LAND); ! 1541: break; ! 1542: case EVILSPIRIT: ! 1543: if (netgame) { ! 1544: break; ! 1545: } ! 1546: changespritestat(sn, EVILSPIRIT); ! 1547: spr->lotag = 120 + (krand() & 64); ! 1548: break; ! 1549: case PATROL: ! 1550: if (netgame) { ! 1551: break; ! 1552: } ! 1553: changespritestat(sn, PATROL); ! 1554: break; ! 1555: case WARPFX: ! 1556: if (netgame) { ! 1557: break; ! 1558: } ! 1559: changespritestat(sn, WARPFX); ! 1560: spr->lotag = 12; ! 1561: break; ! 1562: case NUKED: ! 1563: if (netgame) { ! 1564: break; ! 1565: } ! 1566: changespritestat(sn, NUKED); ! 1567: break; ! 1568: case BROKENVASE: ! 1569: changespritestat(sn, BROKENVASE); ! 1570: switch (spr->picnum) { ! 1571: case VASEA: ! 1572: playsound_loc(S_GLASSBREAK1 + (rand() % 3), spr->x, spr->y); ! 1573: spr->picnum = SHATTERVASE; ! 1574: break; ! 1575: case VASEB: ! 1576: playsound_loc(S_GLASSBREAK1 + (rand() % 3), spr->x, spr->y); ! 1577: spr->picnum = SHATTERVASE2; ! 1578: break; ! 1579: case VASEC: ! 1580: playsound_loc(S_GLASSBREAK1 + (rand() % 3), spr->x, spr->y); ! 1581: spr->picnum = SHATTERVASE3; ! 1582: break; ! 1583: case STAINGLASS1: ! 1584: case STAINGLASS2: ! 1585: case STAINGLASS3: ! 1586: case STAINGLASS4: ! 1587: case STAINGLASS5: ! 1588: case STAINGLASS6: ! 1589: case STAINGLASS7: ! 1590: case STAINGLASS8: ! 1591: case STAINGLASS9: ! 1592: spr->picnum++; ! 1593: SND_Sound(S_BIGGLASSBREAK1 + (rand() % 3)); ! 1594: break; ! 1595: case FBARRELFALL: ! 1596: case BARREL: ! 1597: playsound_loc(S_BARRELBREAK, spr->x, spr->y); ! 1598: spr->picnum = FSHATTERBARREL; ! 1599: break; ! 1600: } ! 1601: spr->lotag = 12; ! 1602: spr->cstat &= ~3; ! 1603: break; ! 1604: case DRAIN: ! 1605: if (netgame) { ! 1606: break; ! 1607: } ! 1608: changespritestat(sn, DRAIN); ! 1609: spr->lotag = 24; ! 1610: spr->pal = 7; ! 1611: break; ! 1612: case ANIMLEVERDN: ! 1613: playsound_loc(S_PULLCHAIN1, spr->x, spr->y); ! 1614: spr->picnum = LEVERUP; ! 1615: changespritestat(sn, ANIMLEVERDN); ! 1616: spr->lotag = 24; ! 1617: break; ! 1618: case ANIMLEVERUP: ! 1619: playsound_loc(S_PULLCHAIN1, spr->x, spr->y); ! 1620: spr->picnum = LEVERDOWN; ! 1621: changespritestat(sn, ANIMLEVERUP); ! 1622: spr->lotag = 24; ! 1623: break; ! 1624: case SKULLPULLCHAIN1: ! 1625: case PULLTHECHAIN: ! 1626: playsound_loc(S_PULLCHAIN1, spr->x, spr->y); ! 1627: changespritestat(sn, PULLTHECHAIN); ! 1628: SND_PlaySound(S_CHAIN1, 0, 0, 0, 0); ! 1629: spr->lotag = 24; ! 1630: break; ! 1631: case FROZEN: ! 1632: if (netgame) { ! 1633: break; ! 1634: } ! 1635: playsound_loc(S_FREEZE, spr->x, spr->y); ! 1636: changespritestat(sn, FROZEN); ! 1637: spr->lotag = 3600; ! 1638: break; ! 1639: case DEVILFIRE: ! 1640: if (netgame) { ! 1641: break; ! 1642: } ! 1643: changespritestat(sn, DEVILFIRE); ! 1644: spr->lotag = krand() & 120 + 360; ! 1645: break; ! 1646: case DRIP: ! 1647: if (netgame) { ! 1648: break; ! 1649: } ! 1650: changespritestat(sn, DRIP); ! 1651: break; ! 1652: case BLOOD: ! 1653: if (netgame) { ! 1654: break; ! 1655: } ! 1656: changespritestat(sn, BLOOD); ! 1657: break; ! 1658: case WAR: ! 1659: if (netgame) { ! 1660: break; ! 1661: } ! 1662: changespritestat(sn, WAR); ! 1663: break; ! 1664: case PAIN: ! 1665: spr->lotag = 36; ! 1666: switch (spr->picnum) { ! 1667: case SKELETON: ! 1668: case SKELETONATTACK: ! 1669: if (netgame) { ! 1670: break; ! 1671: } ! 1672: spr->lotag = 24; ! 1673: spr->picnum = SKELETON; ! 1674: break; ! 1675: case DEMON: ! 1676: if (netgame) { ! 1677: break; ! 1678: } ! 1679: spr->lotag = 24; ! 1680: playsound_loc(S_GUARDIANPAIN1 + (rand() % 2), spr->x, spr->y); ! 1681: spr->picnum = DEMON - 1; ! 1682: changespritestat(sn, PAIN); ! 1683: break; ! 1684: case GUARDIAN: ! 1685: if (netgame) { ! 1686: break; ! 1687: } ! 1688: spr->lotag = 24; ! 1689: playsound_loc(S_GUARDIANPAIN1 + (rand() % 2), spr->x, spr->y); ! 1690: // needs pain ! 1691: spr->picnum = GUARDIAN; ! 1692: changespritestat(sn, PAIN); ! 1693: break; ! 1694: ! 1695: case GONZOBSHPAIN: ! 1696: if (netgame) { ! 1697: break; ! 1698: } ! 1699: spr->lotag = 24; ! 1700: spr->picnum = GONZOBSHPAIN; ! 1701: changespritestat(sn, PAIN); ! 1702: playsound_loc(S_GRONPAINA+(rand()%3),spr->x,spr->y); ! 1703: break; ! 1704: ! 1705: case NEWGUYSTAND: ! 1706: case NEWGUYKNEE: ! 1707: case NEWGUY: ! 1708: case NEWGUYBOW: ! 1709: case NEWGUYPUNCH: ! 1710: case NEWGUYMACE: ! 1711: case NEWGUYCAST: ! 1712: if (netgame) { ! 1713: break; ! 1714: } ! 1715: spr->lotag = 24; ! 1716: spr->picnum = NEWGUYPAIN; ! 1717: changespritestat(sn, PAIN); ! 1718: playsound_loc(S_AGM_PAIN1,spr->x,spr->y); ! 1719: break; ! 1720: ! 1721: case KURTSTAND: ! 1722: case KURTKNEE: ! 1723: case KURTAT: ! 1724: case KURTPUNCH: ! 1725: case KURTREADY: ! 1726: ! 1727: case GONZOCSW: ! 1728: if (netgame) { ! 1729: break; ! 1730: } ! 1731: spr->lotag = 24; ! 1732: spr->picnum = GONZOCSWPAIN; ! 1733: changespritestat(sn, PAIN); ! 1734: playsound_loc(S_GRONPAINA+(rand()%3),spr->x,spr->y); ! 1735: break; ! 1736: ! 1737: case GONZOGSW: ! 1738: if (netgame) { ! 1739: break; ! 1740: } ! 1741: spr->lotag = 24; ! 1742: spr->picnum = GONZOGSWPAIN; ! 1743: changespritestat(sn, PAIN); ! 1744: playsound_loc(S_GRONPAINA+(rand()%3),spr->x,spr->y); ! 1745: break; ! 1746: case GONZOGHM: ! 1747: if (netgame) { ! 1748: break; ! 1749: } ! 1750: spr->lotag = 24; ! 1751: spr->picnum = GONZOGHMPAIN; ! 1752: changespritestat(sn, PAIN); ! 1753: playsound_loc(S_GRONPAINA+(rand()%3),spr->x,spr->y); ! 1754: break; ! 1755: case GONZOGSH: ! 1756: if (netgame) { ! 1757: break; ! 1758: } ! 1759: spr->lotag = 24; ! 1760: spr->picnum = GONZOGSHPAIN; ! 1761: changespritestat(sn, PAIN); ! 1762: playsound_loc(S_GRONPAINA, spr->x, spr->y); ! 1763: break; ! 1764: ! 1765: case GRONHALPAIN: ! 1766: case GRONHAL: ! 1767: case GRONHALATTACK: ! 1768: spr->lotag = 24; ! 1769: spr->picnum = GRONHALPAIN; ! 1770: changespritestat(sn, PAIN); ! 1771: playsound_loc(S_GRONPAINA, spr->x, spr->y); ! 1772: break; ! 1773: case GRONSWPAIN: ! 1774: case GRONSW: ! 1775: case GRONSWATTACK: ! 1776: spr->lotag = 24; ! 1777: spr->picnum = GRONSWPAIN; ! 1778: changespritestat(sn, PAIN); ! 1779: playsound_loc(S_GRONPAINA+(rand()%3),spr->x,spr->y); ! 1780: break; ! 1781: case GRONMUPAIN: ! 1782: case GRONMU: ! 1783: case GRONMUATTACK: ! 1784: spr->lotag = 24; ! 1785: spr->picnum = GRONMUPAIN; ! 1786: changespritestat(sn, PAIN); ! 1787: playsound_loc(S_GRONPAINA, spr->x, spr->y); ! 1788: break; ! 1789: case KOBOLD: ! 1790: case KOBOLDATTACK: ! 1791: if (netgame) { ! 1792: break; ! 1793: } ! 1794: spr->picnum = KOBOLDDIE; ! 1795: changespritestat(sn, PAIN); ! 1796: playsound_loc(S_KPAIN1 + (rand() % 2), spr->x, spr->y); ! 1797: break; ! 1798: case KATIE: ! 1799: case KATIEAT: ! 1800: if (netgame) { ! 1801: break; ! 1802: } ! 1803: // playsound_loc(S_MPAIN1, spr->x, spr->y); ! 1804: spr->picnum = KATIEPAIN; ! 1805: changespritestat(sn, PAIN); ! 1806: break; ! 1807: case DEVILSTAND: ! 1808: case DEVIL: ! 1809: case DEVILATTACK: ! 1810: if (netgame) { ! 1811: break; ! 1812: } ! 1813: playsound_loc(S_MPAIN1, spr->x, spr->y); ! 1814: spr->picnum = DEVILPAIN; ! 1815: changespritestat(sn, PAIN); ! 1816: break; ! 1817: case IMP: ! 1818: case IMPATTACK: ! 1819: if (netgame) { ! 1820: break; ! 1821: } ! 1822: spr->lotag = 24; ! 1823: spr->picnum = IMPPAIN; ! 1824: changespritestat(sn, PAIN); ! 1825: // BIKINI ! 1826: // playsound_loc(S_GOBPAIN1+(rand()%2),spr->x,spr->y); ! 1827: ! 1828: break; ! 1829: case MINOTAUR: ! 1830: case MINOTAURATTACK: ! 1831: case MINOTAURPAIN: ! 1832: if (netgame) { ! 1833: break; ! 1834: } ! 1835: spr->picnum = MINOTAURPAIN; ! 1836: changespritestat(sn, PAIN); ! 1837: playsound_loc(S_MPAIN1, spr->x, spr->y); ! 1838: break; ! 1839: default: ! 1840: if (netgame) { ! 1841: break; ! 1842: } ! 1843: changespritestat(sn, FLEE); ! 1844: break; ! 1845: } ! 1846: break; ! 1847: case FLOCKSPAWN: ! 1848: if (netgame) { ! 1849: break; ! 1850: } ! 1851: spr->lotag = 36; ! 1852: spr->extra = 10; ! 1853: changespritestat(sn, FLOCKSPAWN); ! 1854: break; ! 1855: case FLOCK: ! 1856: if (netgame) { ! 1857: break; ! 1858: } ! 1859: spr->lotag = 128; ! 1860: spr->extra = 0; ! 1861: spr->pal = 0; ! 1862: changespritestat(sn, FLOCK); ! 1863: break; ! 1864: case FINDME: ! 1865: if (netgame) { ! 1866: break; ! 1867: } ! 1868: spr->lotag = 360; ! 1869: if (spr->picnum == RAT) { ! 1870: spr->ang = ((krand() & 512 - 256) + spr->ang + 1024) & 2047; // NEW ! 1871: changespritestat(sn, FLEE); ! 1872: } ! 1873: else { ! 1874: changespritestat(sn, FINDME); ! 1875: } ! 1876: break; ! 1877: case SKIRMISH: ! 1878: if (netgame) { ! 1879: break; ! 1880: } ! 1881: spr->lotag = 60; ! 1882: if (spr->picnum == RAT) { ! 1883: spr->ang = ((krand() & 512 - 256) + spr->ang + 1024) & 2047; // NEW ! 1884: changespritestat(sn, FLEE); ! 1885: } ! 1886: else { ! 1887: changespritestat(sn, SKIRMISH); ! 1888: } ! 1889: break; ! 1890: case WITCHSIT: ! 1891: if (netgame) { ! 1892: break; ! 1893: } ! 1894: spr->lotag = 12; ! 1895: changespritestat(sn, WITCHSIT); ! 1896: break; ! 1897: case FLEE: ! 1898: if (netgame) { ! 1899: break; ! 1900: } ! 1901: switch (spr->picnum) { ! 1902: case NEWGUYSTAND: ! 1903: case NEWGUYKNEE: ! 1904: spr->picnum = NEWGUY; ! 1905: break; ! 1906: case KURTSTAND: ! 1907: case KURTKNEE: ! 1908: spr->picnum = GONZOCSW; ! 1909: break; ! 1910: } ! 1911: changespritestat(sn, FLEE); ! 1912: spr->lotag = 60; ! 1913: break; ! 1914: case BOB: ! 1915: changespritestat(sn, BOB); ! 1916: break; ! 1917: case LIFTUP: ! 1918: //JSA_DEMO3 ! 1919: if (cartsnd == -1) { ! 1920: playsound_loc(S_CLUNK, spr->x, spr->y); ! 1921: cartsnd = SND_PlaySound(S_CHAIN1, spr->x, spr->y, 0, 5); ! 1922: } ! 1923: ! 1924: changespritestat(sn, LIFTUP); ! 1925: break; ! 1926: case LIFTDN: ! 1927: //JSA_DEMO3 ! 1928: if (cartsnd == -1) { ! 1929: playsound_loc(S_CLUNK, spr->x, spr->y); ! 1930: cartsnd = SND_PlaySound(S_CHAIN1, spr->x, spr->y, 0, 5); ! 1931: } ! 1932: ! 1933: changespritestat(sn, LIFTDN); ! 1934: break; ! 1935: case SHOVE: ! 1936: spr->lotag = 128; ! 1937: changespritestat(sn, SHOVE); ! 1938: break; ! 1939: case SHATTER: ! 1940: changespritestat(sn, SHATTER); ! 1941: switch (spr->picnum) { ! 1942: case FBARRELFALL: ! 1943: spr->picnum = FSHATTERBARREL; ! 1944: break; ! 1945: } ! 1946: break; ! 1947: case YELL: ! 1948: if (netgame) { ! 1949: break; ! 1950: } ! 1951: changespritestat(sn, YELL); ! 1952: spr->lotag = 12; ! 1953: break; ! 1954: case ATTACK: ! 1955: if (netgame) { ! 1956: break; ! 1957: } ! 1958: spr->lotag = 64; ! 1959: changespritestat(sn, ATTACK); ! 1960: switch (spr->picnum) { ! 1961: case NEWGUY: ! 1962: if (spr->extra > 20) { ! 1963: spr->picnum = NEWGUYCAST; ! 1964: spr->lotag = 24; ! 1965: } ! 1966: else if (spr->extra > 10) ! 1967: spr->picnum = NEWGUYBOW; ! 1968: else if (spr->extra > 0) ! 1969: spr->picnum = NEWGUYMACE; ! 1970: else ! 1971: spr->picnum = NEWGUYPUNCH; ! 1972: break; ! 1973: case GONZOCSW: ! 1974: if (spr->extra > 10) ! 1975: spr->picnum = GONZOCSWAT; ! 1976: else if (spr->extra > 0) { ! 1977: spr->picnum = KURTREADY; ! 1978: spr->lotag = 12; ! 1979: } ! 1980: else ! 1981: spr->picnum = KURTPUNCH; ! 1982: break; ! 1983: case GONZOGSW: ! 1984: spr->picnum = GONZOGSWAT; ! 1985: break; ! 1986: case GONZOGHM: ! 1987: spr->picnum = GONZOGHMAT; ! 1988: break; ! 1989: case GONZOGSH: ! 1990: spr->picnum = GONZOGSHAT; ! 1991: break; ! 1992: ! 1993: case GRONHAL: ! 1994: spr->picnum = GRONHALATTACK; ! 1995: break; ! 1996: case GRONMU: ! 1997: spr->picnum = GRONMUATTACK; ! 1998: break; ! 1999: case GRONSW: ! 2000: spr->picnum = GRONSWATTACK; ! 2001: break; ! 2002: case KOBOLD: ! 2003: spr->picnum = KOBOLDATTACK; ! 2004: if (rand() % 10 > 4) ! 2005: playsound_loc(S_KSNARL1 + (rand() % 4), spr->x, spr->y); ! 2006: break; ! 2007: case KATIE: ! 2008: if ((rand() % 10) > 4) { ! 2009: playsound_loc(S_JUDY1, spr->x, spr->y); ! 2010: } ! 2011: spr->picnum = KATIEAT; ! 2012: break; ! 2013: case DEVILSTAND: ! 2014: case DEVIL: ! 2015: if ((rand() % 10) > 4) { ! 2016: playsound_loc(S_DEMON1 + (rand() % 5), spr->x, spr->y); ! 2017: } ! 2018: spr->picnum = DEVILATTACK; ! 2019: break; ! 2020: case SKELETON: ! 2021: spr->picnum = SKELETONATTACK; ! 2022: break; ! 2023: case IMP: ! 2024: if ((rand() % 10) > 5) ! 2025: playsound_loc(S_IMPGROWL1+(rand()%3),spr->x,spr->y); ! 2026: spr->picnum = IMPATTACK; ! 2027: break; ! 2028: case MINOTAUR: ! 2029: if ((rand() % 10) > 4) ! 2030: playsound_loc(S_MSNARL1 + (rand() % 3), spr->x, spr->y); ! 2031: spr->picnum = MINOTAURATTACK; ! 2032: break; ! 2033: case WILLOW: ! 2034: playsound_loc(S_WISP + (rand() % 2), spr->x, spr->y); ! 2035: spr->pal = 7; ! 2036: break; ! 2037: case DEMON: ! 2038: playsound_loc(S_GUARDIAN1 + (rand() % 2), spr->x, spr->y); ! 2039: spr->picnum = DEMON; ! 2040: break; ! 2041: ! 2042: case GUARDIAN: ! 2043: playsound_loc(S_GUARDIAN1 + (rand() % 2), spr->x, spr->y); ! 2044: spr->picnum = GUARDIANATTACK; ! 2045: break; ! 2046: } ! 2047: break; ! 2048: case FACE: ! 2049: if (netgame) { ! 2050: break; ! 2051: } ! 2052: changespritestat(sn, FACE); ! 2053: break; ! 2054: case STAND: ! 2055: if (netgame) { ! 2056: break; ! 2057: } ! 2058: // changespritestat(sn,STAND); ! 2059: changespritestat(sn, FACE); ! 2060: spr->lotag = 0; ! 2061: break; ! 2062: case CHASE: ! 2063: if (netgame) { ! 2064: break; ! 2065: } ! 2066: if (spr->picnum == RAT) ! 2067: changespritestat(sn, FLEE); ! 2068: else ! 2069: changespritestat(sn, CHASE); ! 2070: spr->lotag = 256; ! 2071: switch (spr->picnum) { ! 2072: ! 2073: case NEWGUY: ! 2074: case NEWGUYSTAND: ! 2075: case NEWGUYKNEE: ! 2076: case NEWGUYBOW: ! 2077: case NEWGUYMACE: ! 2078: case NEWGUYPUNCH: ! 2079: case NEWGUYCAST: ! 2080: spr->picnum = NEWGUY; ! 2081: break; ! 2082: ! 2083: case KURTSTAND: ! 2084: case KURTKNEE: ! 2085: case KURTAT: ! 2086: case KURTPUNCH: ! 2087: case GONZOCSWAT: ! 2088: spr->picnum = GONZOCSW; ! 2089: break; ! 2090: case GONZOGSWAT: ! 2091: spr->picnum = GONZOGSW; ! 2092: break; ! 2093: case GONZOGHMAT: ! 2094: spr->picnum = GONZOGHM; ! 2095: break; ! 2096: case GONZOGSHAT: ! 2097: spr->picnum = GONZOGSH; ! 2098: break; ! 2099: ! 2100: ! 2101: ! 2102: case GRONHALATTACK: ! 2103: if (spr->extra > 2) ! 2104: spr->picnum = GRONHAL; ! 2105: else ! 2106: spr->picnum = GRONMU; ! 2107: break; ! 2108: case GRONSWATTACK: ! 2109: spr->picnum = GRONSW; ! 2110: break; ! 2111: case GRONMUATTACK: ! 2112: if (spr->extra > 0) ! 2113: spr->picnum = GRONMU; ! 2114: else ! 2115: spr->picnum = GRONSW; ! 2116: break; ! 2117: case KOBOLDATTACK: ! 2118: spr->picnum = KOBOLD; ! 2119: break; ! 2120: case KATIEAT: ! 2121: spr->picnum = KATIE; ! 2122: break; ! 2123: case DEVILATTACK: ! 2124: spr->picnum = DEVIL; ! 2125: break; ! 2126: case SKELETONATTACK: ! 2127: spr->picnum = SKELETON; ! 2128: break; ! 2129: case IMPATTACK: ! 2130: if (rand() % 10 > 2) ! 2131: // BIKINI ! 2132: // playsound_loc(S_GOBLIN1+(krand()%3),spr->x,spr->y); ! 2133: spr->picnum = IMP; ! 2134: break; ! 2135: case MINOTAURATTACK: ! 2136: //JSA_DEMO3 ! 2137: playsound_loc(S_MSNARL1 + (rand() % 4), spr->x, spr->y); ! 2138: spr->picnum = MINOTAUR; ! 2139: break; ! 2140: case DEMON: ! 2141: spr->picnum = DEMON; ! 2142: break; ! 2143: case GUARDIANATTACK: ! 2144: spr->picnum = GUARDIAN; ! 2145: break; ! 2146: case WILLOW: ! 2147: spr->pal = 6; ! 2148: break; ! 2149: } ! 2150: break; ! 2151: case MISSILE: ! 2152: changespritestat(sn, MISSILE); ! 2153: break; ! 2154: case CAST: ! 2155: changespritestat(sn, CAST); ! 2156: spr->lotag = 12; ! 2157: switch (spr->picnum) { ! 2158: case GRONHALATTACK: ! 2159: spr->lotag = 24; ! 2160: break; ! 2161: case GRONMUATTACK: ! 2162: spr->lotag = 36; ! 2163: break; ! 2164: case GONZOCSWAT: ! 2165: spr->lotag = 24; ! 2166: break; ! 2167: case NEWGUY: ! 2168: spr->lotag = 24; ! 2169: break; ! 2170: } ! 2171: break; ! 2172: case FX: ! 2173: changespritestat(sn, FX); ! 2174: break; ! 2175: case DIE: ! 2176: spr->cstat &= ~3; ! 2177: switch (spr->picnum) { ! 2178: ! 2179: case GONZOBSHPAIN: ! 2180: if (netgame) { ! 2181: break; ! 2182: } ! 2183: spr->lotag = 20; ! 2184: spr->picnum = GONZOBSHPAIN; ! 2185: playsound_loc(S_GRONDEATHA + rand() % 3, spr->x, spr->y); ! 2186: if (spr->shade > 30) { ! 2187: trailingsmoke(sn, 2); ! 2188: deletesprite((short) sn); ! 2189: goto outathere; ! 2190: } ! 2191: kills++; ! 2192: break; ! 2193: case NEWGUY: ! 2194: case NEWGUYSTAND: ! 2195: case NEWGUYKNEE: ! 2196: case NEWGUYCAST: ! 2197: case NEWGUYBOW: ! 2198: case NEWGUYMACE: ! 2199: case NEWGUYPUNCH: ! 2200: if (netgame) { ! 2201: break; ! 2202: } ! 2203: spr->lotag = 20; ! 2204: spr->picnum = NEWGUYDIE; ! 2205: playsound_loc(S_AGM_DIE1+(rand()%3),spr->x,spr->y); ! 2206: kills++; ! 2207: break; ! 2208: case KURTSTAND: ! 2209: case KURTKNEE: ! 2210: case KURTAT: ! 2211: case KURTPUNCH: ! 2212: case KURTREADY: ! 2213: case GONZOCSW: ! 2214: case GONZOCSWAT: ! 2215: case GONZOCSWPAIN: ! 2216: if (netgame) { ! 2217: break; ! 2218: } ! 2219: spr->lotag = 20; ! 2220: spr->picnum = GONZOCSWPAIN; ! 2221: playsound_loc(S_GRONDEATHA + rand() % 3, spr->x, spr->y); ! 2222: kills++; ! 2223: break; ! 2224: case GONZOGSW: ! 2225: case GONZOGSWAT: ! 2226: case GONZOGSWPAIN: ! 2227: if (netgame) { ! 2228: break; ! 2229: } ! 2230: spr->lotag = 20; ! 2231: spr->picnum = GONZOGSWPAIN; ! 2232: playsound_loc(S_GRONDEATHA + rand() % 3, spr->x, spr->y); ! 2233: kills++; ! 2234: break; ! 2235: case GONZOGHM: ! 2236: case GONZOGHMAT: ! 2237: case GONZOGHMPAIN: ! 2238: if (netgame) { ! 2239: break; ! 2240: } ! 2241: spr->lotag = 20; ! 2242: spr->picnum = GONZOGHMPAIN; ! 2243: playsound_loc(S_GRONDEATHA + rand() % 3, spr->x, spr->y); ! 2244: kills++; ! 2245: break; ! 2246: case GONZOGSH: ! 2247: case GONZOGSHAT: ! 2248: case GONZOGSHPAIN: ! 2249: if (netgame) { ! 2250: break; ! 2251: } ! 2252: spr->lotag = 20; ! 2253: spr->picnum = GONZOGSHPAIN; ! 2254: playsound_loc(S_GRONDEATHA + rand() % 3, spr->x, spr->y); ! 2255: kills++; ! 2256: break; ! 2257: ! 2258: case GRONHALPAIN: ! 2259: case GRONHAL: ! 2260: case GRONHALATTACK: ! 2261: spr->lotag = 20; ! 2262: spr->picnum = GRONHALDIE; ! 2263: playsound_loc(S_GRONDEATHA + rand() % 3, spr->x, spr->y); ! 2264: kills++; ! 2265: break; ! 2266: case GRONSWPAIN: ! 2267: case GRONSW: ! 2268: case GRONSWATTACK: ! 2269: spr->lotag = 20; ! 2270: spr->picnum = GRONSWDIE; ! 2271: playsound_loc(S_GRONDEATHA + rand() % 3, spr->x, spr->y); ! 2272: kills++; ! 2273: break; ! 2274: case GRONMUPAIN: ! 2275: case GRONMU: ! 2276: case GRONMUATTACK: ! 2277: spr->lotag = 20; ! 2278: spr->picnum = GRONMUDIE; ! 2279: playsound_loc(S_GRONDEATHA + rand() % 3, spr->x, spr->y); ! 2280: kills++; ! 2281: break; ! 2282: case FISH: ! 2283: case RAT: ! 2284: if (netgame) { ! 2285: break; ! 2286: } ! 2287: spr->lotag = 20; ! 2288: break; ! 2289: case KOBOLD: ! 2290: case KOBOLDATTACK: ! 2291: if (netgame) { ! 2292: break; ! 2293: } ! 2294: playsound_loc(S_KDIE1 + (rand() % 2), spr->x, spr->y); ! 2295: spr->lotag = 20; ! 2296: spr->picnum = KOBOLDDIE; ! 2297: kills++; ! 2298: break; ! 2299: case KATIE: ! 2300: case KATIEAT: ! 2301: if (netgame) { ! 2302: break; ! 2303: } ! 2304: playsound_loc(S_JUDYDIE,spr->x,spr->y); ! 2305: spr->lotag = 20; ! 2306: spr->picnum = KATIEPAIN; ! 2307: spawnhornskull(sn); ! 2308: kills++; ! 2309: break; ! 2310: case DEVILSTAND: ! 2311: case DEVIL: ! 2312: case DEVILATTACK: ! 2313: if (netgame) { ! 2314: break; ! 2315: } ! 2316: playsound_loc(S_DEMONDIE1 + (rand() % 2), spr->x, spr->y); ! 2317: spr->lotag = 20; ! 2318: spr->picnum = DEVILDIE; ! 2319: kills++; ! 2320: break; ! 2321: case SKELETON: ! 2322: case SKELETONATTACK: ! 2323: if (netgame) { ! 2324: break; ! 2325: } ! 2326: playsound_loc(S_SKELETONDIE, spr->x, spr->y); ! 2327: spr->lotag = 20; ! 2328: spr->picnum = SKELETONDIE; ! 2329: kills++; ! 2330: break; ! 2331: case IMP: ! 2332: case IMPATTACK: ! 2333: case IMPDIE: ! 2334: if (netgame) { ! 2335: break; ! 2336: } ! 2337: playsound_loc(S_IMPDIE1+(rand()%2),spr->x,spr->y); ! 2338: spr->lotag = 20; ! 2339: spr->picnum = IMPDIE; ! 2340: kills++; ! 2341: break; ! 2342: case MINOTAUR: ! 2343: case MINOTAURATTACK: ! 2344: if (netgame) { ! 2345: break; ! 2346: } ! 2347: playsound_loc(S_MDEATH1, spr->x, spr->y); ! 2348: spr->lotag = 10; ! 2349: spr->picnum = MINOTAURDIE; ! 2350: kills++; ! 2351: break; ! 2352: case DEMON: ! 2353: if (netgame) { ! 2354: break; ! 2355: } ! 2356: playsound_loc(S_GUARDIANDIE, spr->x, spr->y); ! 2357: kills++; ! 2358: explosion(sn, spr->x, spr->y, spr->z, spr->owner); ! 2359: deletesprite((short) sn); ! 2360: score(1500); ! 2361: goto outathere; ! 2362: break; ! 2363: case GUARDIAN: ! 2364: case GUARDIANATTACK: ! 2365: if (netgame) { ! 2366: break; ! 2367: } ! 2368: playsound_loc(S_GUARDIANDIE, spr->x, spr->y); ! 2369: explosion(sn, spr->x, spr->y, spr->z, spr->owner); ! 2370: deletesprite((short) sn); ! 2371: score(1500); ! 2372: kills++; ! 2373: goto outathere; ! 2374: break; ! 2375: case WILLOW: ! 2376: if (netgame) { ! 2377: break; ! 2378: } ! 2379: playsound_loc(S_WILLOWDIE, spr->x, spr->y); ! 2380: spr->pal = 0; ! 2381: spr->lotag = 20; ! 2382: spr->picnum = WILLOWEXPLO; ! 2383: kills++; ! 2384: break; ! 2385: } ! 2386: changespritestat(sn, DIE); ! 2387: outathere: ! 2388: break; ! 2389: ! 2390: case RESURECT: ! 2391: if (netgame) { ! 2392: break; ! 2393: } ! 2394: spr->lotag = 7200; ! 2395: switch (spr->picnum) { ! 2396: ! 2397: case GONZOBSHDEAD: ! 2398: spr->cstat &= ~3; ! 2399: changespritestat(sn, RESURECT); ! 2400: score(85); ! 2401: break; ! 2402: case NEWGUYDEAD: ! 2403: spr->cstat &= ~3; ! 2404: changespritestat(sn, RESURECT); ! 2405: score(55); ! 2406: break; ! 2407: case GONZOCSWDEAD: ! 2408: spr->cstat &= ~3; ! 2409: changespritestat(sn, RESURECT); ! 2410: score(55); ! 2411: break; ! 2412: case GONZOGSWDEAD: ! 2413: spr->cstat &= ~3; ! 2414: changespritestat(sn, RESURECT); ! 2415: score(105); ! 2416: break; ! 2417: case GONZOGHMDEAD: ! 2418: spr->cstat &= ~3; ! 2419: changespritestat(sn, RESURECT); ! 2420: score(100); ! 2421: break; ! 2422: case GONZOGSHDEAD: ! 2423: spr->cstat &= ~3; ! 2424: changespritestat(sn, RESURECT); ! 2425: score(110); ! 2426: break; ! 2427: ! 2428: case GRONDEAD: ! 2429: spr->picnum = GRONDEAD; ! 2430: spr->cstat &= ~3; ! 2431: spr->extra = 3; ! 2432: changespritestat(sn, RESURECT); ! 2433: switch (sprite[sn].pal) { ! 2434: case 0: ! 2435: score(125); ! 2436: break; ! 2437: case 10: ! 2438: score(90); ! 2439: break; ! 2440: case 11: ! 2441: score(115); ! 2442: break; ! 2443: case 12: ! 2444: score(65); ! 2445: break; ! 2446: } ! 2447: break; ! 2448: case FISH: ! 2449: case RAT: ! 2450: spr->picnum = RAT; ! 2451: spr->cstat &= ~3; ! 2452: changespritestat(sn, RESURECT); ! 2453: score(5); ! 2454: break; ! 2455: case KOBOLDDEAD: ! 2456: spr->picnum = KOBOLDDEAD; ! 2457: spr->cstat &= ~3; ! 2458: changespritestat(sn, RESURECT); ! 2459: switch (sprite[sn].pal) { ! 2460: case 0: ! 2461: score(25); ! 2462: break; ! 2463: case 7: ! 2464: score(40); ! 2465: break; ! 2466: } ! 2467: score(10); ! 2468: break; ! 2469: case KATIEDEAD: ! 2470: trailingsmoke(sn, 1); ! 2471: spr->picnum = KATIEDEAD; ! 2472: spr->cstat &= ~3; ! 2473: changespritestat(sn, RESURECT); ! 2474: spawnhornskull(sn); ! 2475: score(5000); ! 2476: break; ! 2477: case DEVILDEAD: ! 2478: trailingsmoke(sn, 1); ! 2479: spr->picnum = DEVILDEAD; ! 2480: spr->cstat &= ~3; ! 2481: changespritestat(sn, RESURECT); ! 2482: score(70); ! 2483: break; ! 2484: case SKELETONDEAD: ! 2485: spr->picnum = SKELETONDEAD; ! 2486: spr->cstat &= ~3; ! 2487: changespritestat(sn, RESURECT); ! 2488: score(20); ! 2489: break; ! 2490: case IMPDEAD: ! 2491: spr->picnum = IMPDEAD; ! 2492: spr->cstat &= ~3; ! 2493: changespritestat(sn, RESURECT); ! 2494: score(115); ! 2495: break; ! 2496: case MINOTAURDEAD: ! 2497: spr->picnum = MINOTAURDEAD; ! 2498: spr->cstat &= ~3; ! 2499: changespritestat(sn, RESURECT); ! 2500: score(95); ! 2501: break; ! 2502: case DEMON: ! 2503: case GUARDIAN: ! 2504: case GUARDIANATTACK: ! 2505: changespritestat(sn, 0); ! 2506: deletesprite((short) sn); ! 2507: score(120); ! 2508: break; ! 2509: case WILLOW: ! 2510: changespritestat(sn, 0); ! 2511: deletesprite((short) sn); ! 2512: score(15); ! 2513: break; ! 2514: } ! 2515: break; ! 2516: case DEAD: ! 2517: switch (spr->picnum) { ! 2518: case FISH: ! 2519: case RAT: ! 2520: if (netgame) { ! 2521: break; ! 2522: } ! 2523: spr->cstat &= ~3; ! 2524: changespritestat(sn, DEAD); ! 2525: score(5); ! 2526: break; ! 2527: ! 2528: case GONZOBSHDEAD: ! 2529: if (netgame) { ! 2530: break; ! 2531: } ! 2532: spr->picnum = GONZOBSHDEAD; ! 2533: spr->cstat &= ~3; ! 2534: changespritestat(sn, DEAD); ! 2535: if (spr->pal == 4) { ! 2536: changespritestat(sn, SHADE); ! 2537: deaddude(sn); ! 2538: } ! 2539: else { ! 2540: changespritestat(sn, DEAD); ! 2541: if (spr->shade < 25) ! 2542: monsterweapon(sn); ! 2543: } ! 2544: score(85); ! 2545: break; ! 2546: case GONZOCSWDEAD: ! 2547: if (netgame) { ! 2548: break; ! 2549: } ! 2550: spr->picnum = GONZOCSWDEAD; ! 2551: spr->cstat &= ~3; ! 2552: if (spr->pal == 4) { ! 2553: changespritestat(sn, SHADE); ! 2554: deaddude(sn); ! 2555: } ! 2556: else { ! 2557: changespritestat(sn, DEAD); ! 2558: monsterweapon(sn); ! 2559: } ! 2560: score(55); ! 2561: break; ! 2562: case GONZOGSWDEAD: ! 2563: if (netgame) { ! 2564: break; ! 2565: } ! 2566: spr->picnum = GONZOGSWDEAD; ! 2567: spr->cstat &= ~3; ! 2568: if (spr->pal == 4) { ! 2569: changespritestat(sn, SHADE); ! 2570: deaddude(sn); ! 2571: } ! 2572: else { ! 2573: changespritestat(sn, DEAD); ! 2574: monsterweapon(sn); ! 2575: } ! 2576: score(105); ! 2577: break; ! 2578: case GONZOGHMDEAD: ! 2579: if (netgame) { ! 2580: break; ! 2581: } ! 2582: spr->picnum = GONZOGHMDEAD; ! 2583: spr->cstat &= ~3; ! 2584: if (spr->pal == 4) { ! 2585: changespritestat(sn, SHADE); ! 2586: deaddude(sn); ! 2587: } ! 2588: else { ! 2589: changespritestat(sn, DEAD); ! 2590: monsterweapon(sn); ! 2591: } ! 2592: score(100); ! 2593: break; ! 2594: case NEWGUYDEAD: ! 2595: if (netgame) { ! 2596: break; ! 2597: } ! 2598: spr->picnum = NEWGUYDEAD; ! 2599: spr->cstat &= ~3; ! 2600: changespritestat(sn, DEAD); ! 2601: monsterweapon(sn); ! 2602: score(50); ! 2603: break; ! 2604: case GONZOGSHDEAD: ! 2605: if (netgame) { ! 2606: break; ! 2607: } ! 2608: spr->picnum = GONZOGSHDEAD; ! 2609: spr->cstat &= ~3; ! 2610: if (spr->pal == 4) { ! 2611: changespritestat(sn, SHADE); ! 2612: deaddude(sn); ! 2613: } ! 2614: else { ! 2615: changespritestat(sn, DEAD); ! 2616: monsterweapon(sn); ! 2617: } ! 2618: score(110); ! 2619: break; ! 2620: case GRONDEAD: ! 2621: spr->picnum = GRONDEAD; ! 2622: spr->cstat &= ~3; ! 2623: changespritestat(sn, DEAD); ! 2624: switch (sprite[sn].pal) { ! 2625: case 0: ! 2626: score(125); ! 2627: break; ! 2628: case 10: ! 2629: score(90); ! 2630: break; ! 2631: case 11: ! 2632: score(115); ! 2633: break; ! 2634: case 12: ! 2635: score(65); ! 2636: break; ! 2637: } ! 2638: monsterweapon(sn); ! 2639: break; ! 2640: case KOBOLDDEAD: ! 2641: if (netgame) { ! 2642: break; ! 2643: } ! 2644: spr->picnum = KOBOLDDEAD; ! 2645: spr->cstat &= ~3; ! 2646: changespritestat(sn, DEAD); ! 2647: switch (sprite[sn].pal) { ! 2648: case 0: ! 2649: score(25); ! 2650: break; ! 2651: case 7: ! 2652: score(40); ! 2653: break; ! 2654: } ! 2655: monsterweapon(sn); ! 2656: break; ! 2657: case KATIEDEAD: ! 2658: if (netgame) { ! 2659: break; ! 2660: } ! 2661: trailingsmoke(sn, 1); ! 2662: spr->picnum = DEVILDEAD; ! 2663: spr->cstat &= ~3; ! 2664: changespritestat(sn, DEAD); ! 2665: spawnhornskull(sn); ! 2666: score(500); ! 2667: break; ! 2668: case DEVILDEAD: ! 2669: if (netgame) { ! 2670: break; ! 2671: } ! 2672: trailingsmoke(sn, 1); ! 2673: spr->picnum = DEVILDEAD; ! 2674: spr->cstat &= ~3; ! 2675: changespritestat(sn, DEAD); ! 2676: score(70); ! 2677: monsterweapon(sn); ! 2678: break; ! 2679: case SKELETONDEAD: ! 2680: if (netgame) { ! 2681: break; ! 2682: } ! 2683: spr->picnum = SKELETONDEAD; ! 2684: spr->cstat &= ~3; ! 2685: changespritestat(sn, DEAD); ! 2686: score(20); ! 2687: monsterweapon(sn); ! 2688: break; ! 2689: case IMPDEAD: ! 2690: if (netgame) { ! 2691: break; ! 2692: } ! 2693: spr->picnum = IMPDEAD; ! 2694: spr->cstat &= ~3; ! 2695: changespritestat(sn, DEAD); ! 2696: score(115); ! 2697: monsterweapon(sn); ! 2698: break; ! 2699: case MINOTAURDEAD: ! 2700: if (netgame) { ! 2701: break; ! 2702: } ! 2703: spr->picnum = MINOTAURDEAD; ! 2704: spr->cstat &= ~3; ! 2705: changespritestat(sn, DEAD); ! 2706: score(95); ! 2707: if (rand() % 100 > 60) ! 2708: monsterweapon(sn); ! 2709: break; ! 2710: case WILLOWEXPLO + 2: ! 2711: if (netgame) { ! 2712: break; ! 2713: } ! 2714: spr->pal = 0; ! 2715: spr->cstat &= ~3; ! 2716: changespritestat(sn, 0); ! 2717: deletesprite((short) sn); ! 2718: score(15); ! 2719: break; ! 2720: } ! 2721: if (sector[spr->sectnum].floorpicnum == WATER ! 2722: || sector[spr->sectnum].floorpicnum == SLIME) { ! 2723: if (spr->picnum == MINOTAURDEAD) { ! 2724: spr->z += (8 << 8); ! 2725: setsprite((short) sn, spr->x, spr->y, spr->z); ! 2726: } ! 2727: } ! 2728: if (sector[spr->sectnum].floorpicnum == LAVA ! 2729: || sector[spr->sectnum].floorpicnum == LAVA1 ! 2730: || sector[spr->sectnum].floorpicnum == LAVA2) { ! 2731: trailingsmoke(sn, 1); ! 2732: deletesprite((short) sn); ! 2733: } ! 2734: break; ! 2735: ! 2736: } ! 2737: // ! 2738: // the control variable for monster release ! 2739: // ! 2740: ! 2741: } ! 2742: ! 2743: ! 2744: ! 2745: ! 2746: ! 2747: ! 2748: ! 2749: // FIRE BREATH ! 2750: ! 2751: void ! 2752: firebreath(short i, int a, int b, int c) ! 2753: { ! 2754: ! 2755: long j; ! 2756: int k; ! 2757: long discrim; ! 2758: long discrim2; ! 2759: ! 2760: struct player *plr; ! 2761: spritetype *spr; ! 2762: spritetype *tspr; ! 2763: ! 2764: plr = &player[pyrn]; ! 2765: spr = &sprite[i]; ! 2766: ! 2767: for (k = 0; k <= a; k++) { ! 2768: ! 2769: j = insertsprite(spr->sectnum, MISSILE); ! 2770: tspr = &sprite[j]; ! 2771: ! 2772: tspr->x = spr->x; ! 2773: tspr->y = spr->y; ! 2774: if (c == LOW) ! 2775: tspr->z = sector[spr->sectnum].floorz - (32 << 8); ! 2776: else ! 2777: tspr->z = sector[spr->sectnum].floorz - (tilesizy[spr->picnum] << 7); ! 2778: tspr->cstat = 0; ! 2779: tspr->picnum = MONSTERBALL; ! 2780: tspr->shade = -15; ! 2781: tspr->xrepeat = 128; ! 2782: tspr->yrepeat = 128; ! 2783: tspr->ang = ((((getangle(plr->x - tspr->x, plr->y - tspr->y) + (krand() & 15) - 8) + 2048) + ((b * 22) + (k * 10))) & 2047); ! 2784: tspr->xvel = (sintable[(tspr->ang + 2560) & 2047] >> 6); ! 2785: tspr->yvel = (sintable[(tspr->ang + 2048) & 2047] >> 6); ! 2786: discrim = ksqrt((plr->x - tspr->x) * (plr->x - tspr->x) ! 2787: + (plr->y - tspr->y) * (plr->y - tspr->y)); ! 2788: if (discrim == 0) ! 2789: discrim = 1; ! 2790: if (c == HIGH) ! 2791: tspr->zvel = ((plr->z + (32 << 8) - tspr->z) << 7) / discrim; ! 2792: else ! 2793: tspr->zvel = (((plr->z + (8 << 8)) - tspr->z) << 7) / discrim; // NEW ! 2794: ! 2795: tspr->owner = i; ! 2796: tspr->clipdist = 16; ! 2797: tspr->lotag = 512; ! 2798: tspr->hitag = 0; ! 2799: } ! 2800: ! 2801: ! 2802: ! 2803: } ! 2804: ! 2805: //cast ! 2806: ! 2807: void ! 2808: castspell(short i) ! 2809: { ! 2810: ! 2811: short j; ! 2812: long discrim; ! 2813: long discrim2; ! 2814: ! 2815: struct player *plr; ! 2816: spritetype *spr; ! 2817: spritetype *tspr; ! 2818: ! 2819: plr = &player[pyrn]; ! 2820: spr = &sprite[i]; ! 2821: ! 2822: j = insertsprite(spr->sectnum, MISSILE); ! 2823: tspr = &sprite[j]; ! 2824: ! 2825: tspr->x = spr->x; ! 2826: tspr->y = spr->y; ! 2827: if (spr->picnum == SPAWNFIREBALL) { ! 2828: tspr->z = spr->z - ((tilesizy[spr->picnum] >> 1) << 8); ! 2829: } ! 2830: else { ! 2831: tspr->z = spr->z - ((tilesizy[spr->picnum] >> 1) << 8); ! 2832: } ! 2833: tspr->cstat = 0; ! 2834: tspr->picnum = MONSTERBALL; ! 2835: tspr->shade = -15; ! 2836: tspr->xrepeat = 64; ! 2837: tspr->yrepeat = 64; ! 2838: if (sprite[i].picnum == SPAWNFIREBALL) { ! 2839: tspr->ang = ((getangle(plr->x - tspr->x, plr->y - tspr->y) + 2048) & 2047); ! 2840: } ! 2841: else { ! 2842: tspr->ang = (((getangle(plr->x - tspr->x, plr->y - tspr->y) + (krand() & 15) - 8) + 2048) & 2047); ! 2843: } ! 2844: tspr->xvel = (sintable[(tspr->ang + 2560) & 2047] >> 6); ! 2845: tspr->yvel = (sintable[(tspr->ang + 2048) & 2047] >> 6); ! 2846: ! 2847: // discrim=ksqrt((plr->x-tspr->x)*(plr->x-tspr->x)+(plr->y-tspr->y)*(plr->y ! 2848: // -tspr->y)); ! 2849: // if(discrim == 0) { ! 2850: // discrim=1; ! 2851: // } ! 2852: ! 2853: tspr->zvel = ((plr->z + (8 << 8) - tspr->z) << 8) / ! 2854: ksqrt((plr->x - tspr->x) * ! 2855: (plr->x - tspr->x) + ! 2856: (plr->y - tspr->y) * ! 2857: (plr->y - tspr->y)); ! 2858: ! 2859: tspr->owner = i; ! 2860: tspr->clipdist = 16; ! 2861: tspr->lotag = 512; ! 2862: tspr->hitag = 0; ! 2863: ! 2864: } ! 2865: ! 2866: void ! 2867: skullycastspell(short i) ! 2868: { ! 2869: ! 2870: short j; ! 2871: long discrim; ! 2872: long discrim2; ! 2873: ! 2874: struct player *plr; ! 2875: spritetype *spr; ! 2876: spritetype *tspr; ! 2877: ! 2878: plr = &player[pyrn]; ! 2879: spr = &sprite[i]; ! 2880: ! 2881: j = insertsprite(spr->sectnum, MISSILE); ! 2882: tspr = &sprite[j]; ! 2883: ! 2884: tspr->x = spr->x; ! 2885: tspr->y = spr->y; ! 2886: if (spr->picnum == SPAWNFIREBALL) { ! 2887: tspr->z = spr->z - ((tilesizy[spr->picnum] >> 1) << 8); ! 2888: } ! 2889: else { ! 2890: tspr->z = spr->z - ((tilesizy[spr->picnum] >> 1) << 8); ! 2891: } ! 2892: tspr->cstat = 0; ! 2893: tspr->picnum = PLASMA; ! 2894: tspr->shade = -15; ! 2895: tspr->xrepeat = 64; ! 2896: tspr->yrepeat = 64; ! 2897: if (spr->picnum == SPAWNFIREBALL) { ! 2898: tspr->ang = ((getangle(plr->x - tspr->x, plr->y - tspr->y) + 2048) & 2047); ! 2899: } ! 2900: else { ! 2901: tspr->ang = (((getangle(plr->x - tspr->x, plr->y - tspr->y) + (krand() & 15) - 8) + 2048) & 2047); ! 2902: } ! 2903: tspr->xvel = (sintable[(tspr->ang + 2560) & 2047] >> 6); ! 2904: tspr->yvel = (sintable[(tspr->ang + 2048) & 2047] >> 6); ! 2905: ! 2906: discrim = ksqrt((plr->x - tspr->x) * (plr->x - tspr->x) + (plr->y - tspr->y) * (plr->y - tspr->y)); ! 2907: if (discrim == 0) { ! 2908: discrim = 1; ! 2909: } ! 2910: tspr->zvel = ((plr->z + (48 << 8) - tspr->z) << 7) / discrim; ! 2911: tspr->owner = i; ! 2912: tspr->clipdist = 16; ! 2913: tspr->lotag = 512; ! 2914: tspr->hitag = 0; ! 2915: tspr->pal = 7; ! 2916: ! 2917: } ! 2918: ! 2919: ! 2920: ! 2921: int ! 2922: checkheat(short i) ! 2923: { ! 2924: ! 2925: short hitsect, ! 2926: hitwall, ! 2927: hitsprite, ! 2928: daang2, ! 2929: daang, ! 2930: dahoriz; ! 2931: long daz2, ! 2932: hitx, ! 2933: hity, ! 2934: hitz; ! 2935: long x, ! 2936: y, ! 2937: z, ! 2938: dasectnum; ! 2939: struct player *plr; ! 2940: int trys; ! 2941: ! 2942: plr = &player[pyrn]; ! 2943: hitsprite = 0; ! 2944: ! 2945: daang = sprite[i].ang; ! 2946: dahoriz = plr->horiz; ! 2947: ! 2948: x = sprite[i].x; ! 2949: y = sprite[i].y; ! 2950: z = sprite[i].z; ! 2951: ! 2952: dasectnum = sprite[i].sectnum; ! 2953: ! 2954: daang2 = ((daang + 2048 + (krand() & 31) - 16) & 2047); ! 2955: daz2 = ((100 - dahoriz) * 2000) + ((krand() - 32768) >> 1); ! 2956: ! 2957: hitscan(x, y, z, dasectnum, // Start position ! 2958: sintable[(daang2 + 2560) & 2047], // X vector of 3D ang ! 2959: sintable[(daang2 + 2048) & 2047], // Y vector of 3D ang ! 2960: daz2, // Z vector of 3D ang ! 2961: &hitsect, &hitwall, &hitsprite, &hitx, &hity, &hitz); ! 2962: ! 2963: if (hitsprite > 0 && hitsprite != plr->spritenum) { ! 2964: sprite[i].ang = (getangle(sprite[hitsprite].x - sprite[i].x, sprite[hitsprite].y - sprite[i].y) & 2047); ! 2965: return (1); ! 2966: } ! 2967: else { ! 2968: sprite[i].ang = plr->ang; ! 2969: if (plr->horiz > 100) { ! 2970: sprite[i].z -= plr->horiz; ! 2971: } ! 2972: } ! 2973: return (0); ! 2974: } ! 2975: ! 2976: int ! 2977: checkfacing(short i, long x, long y) ! 2978: { ! 2979: ! 2980: ! 2981: if (sintable[(sprite[i].ang + 2560) & 2047] * (x - sprite[i].x) ! 2982: + sintable[(sprite[i].ang + 2048) & 2047] * (y - sprite[i].y) >= 0) ! 2983: return (1); ! 2984: else ! 2985: return (0); ! 2986: ! 2987: } ! 2988: ! 2989: int ! 2990: checkmedusadist(short i, long x, long y, long z, int lvl) ! 2991: { ! 2992: ! 2993: long attackdist; ! 2994: ! 2995: attackdist = 8192 + (lvl << 9); ! 2996: ! 2997: if ((labs(x - sprite[i].x) + labs(y - sprite[i].y) < attackdist) ! 2998: && (labs((z >> 8) - ((sprite[i].z >> 8) ! 2999: - (tilesizy[sprite[i].picnum] >> 1))) <= 120)) ! 3000: return (1); ! 3001: else ! 3002: return (0); ! 3003: ! 3004: } ! 3005: ! 3006: ! 3007: int ! 3008: checkdist(short i, long x, long y, long z) ! 3009: { ! 3010: ! 3011: long attackdist; ! 3012: struct player *plr; ! 3013: ! 3014: plr = &player[0]; ! 3015: ! 3016: switch (sprite[i].picnum) { ! 3017: case KURTAT: ! 3018: ! 3019: case NEWGUY: ! 3020: case NEWGUYMACE: ! 3021: case NEWGUYCAST: ! 3022: case NEWGUYBOW: ! 3023: if (sprite[i].extra > 10) { ! 3024: attackdist = 2048 << 1; ! 3025: } ! 3026: else { ! 3027: attackdist = 1024 + 256; ! 3028: } ! 3029: break; ! 3030: ! 3031: case KURTPUNCH: ! 3032: case NEWGUYPUNCH: ! 3033: ! 3034: case GONZOGSW: ! 3035: case GONZOGHM: ! 3036: case GONZOGSH: ! 3037: ! 3038: ! 3039: case GONZOGSWAT: ! 3040: case GONZOGHMAT: ! 3041: case GONZOGSHAT: ! 3042: attackdist = 1024 + 256; ! 3043: break; ! 3044: ! 3045: case GONZOCSW: ! 3046: case GONZOCSWAT: ! 3047: if (sprite[i].extra > 10) ! 3048: attackdist = 2048 << 1; ! 3049: else ! 3050: attackdist = 1024 + 256; ! 3051: break; ! 3052: ! 3053: case GRONHALATTACK: ! 3054: case GRONHAL: ! 3055: attackdist = 1024 + 512; ! 3056: break; ! 3057: case GRONMU: ! 3058: case GRONMUATTACK: ! 3059: attackdist = 2048; ! 3060: break; ! 3061: case GRONSW: ! 3062: case GRONSWATTACK: ! 3063: attackdist = 1024 + 256; ! 3064: break; ! 3065: case MINOTAUR: ! 3066: case MINOTAURATTACK: ! 3067: attackdist = 1024 + 512; ! 3068: break; ! 3069: case SKELETONATTACK: ! 3070: case IMP: ! 3071: case IMPATTACK: ! 3072: case KOBOLD: ! 3073: case KOBOLDATTACK: ! 3074: attackdist = 1024; ! 3075: break; ! 3076: case DEMON: ! 3077: attackdist = 4096 + 2048; ! 3078: break; ! 3079: case GUARDIAN: ! 3080: case GUARDIANATTACK: ! 3081: attackdist = 4096; ! 3082: break; ! 3083: case KATIE: ! 3084: case KATIEAT: ! 3085: case DEVIL: ! 3086: case DEVILATTACK: ! 3087: attackdist = 2048; ! 3088: break; ! 3089: case FISH: ! 3090: case RAT: ! 3091: case WILLOW: ! 3092: attackdist = 512; ! 3093: break; ! 3094: default: ! 3095: attackdist = 512; ! 3096: } ! 3097: ! 3098: if ((labs(x - sprite[i].x) + labs(y - sprite[i].y) < attackdist) ! 3099: && (labs((z >> 8) - ((sprite[i].z >> 8) - (tilesizy[sprite[i].picnum] >> 1))) <= 120)) ! 3100: return (1); ! 3101: else ! 3102: return (0); ! 3103: ! 3104: } ! 3105: ! 3106: int ! 3107: checksight(short i, short *daang) ! 3108: { ! 3109: ! 3110: struct player *plr; ! 3111: plr = &player[pyrn]; ! 3112: if (invisibletime > 0) { ! 3113: *daang = ((krand() & 512) - 256) & 2047; ! 3114: return (0); ! 3115: } ! 3116: if (cansee(plr->x, plr->y, plr->z, plr->sector, ! 3117: sprite[i].x, sprite[i].y, sprite[i].z - (tilesizy[sprite[i].picnum] << 7), sprite[i].sectnum) == 1 ! 3118: && invisibletime < 0) { ! 3119: ! 3120: *daang = (getangle(plr->x - sprite[i].x, plr->y - sprite[i].y) & 2047); ! 3121: ! 3122: if (((sprite[i].ang + 2048 - *daang) & 2047) < 1024) ! 3123: sprite[i].ang = ((sprite[i].ang + 2048 - (synctics << 1)) & 2047); ! 3124: else ! 3125: sprite[i].ang = ((sprite[i].ang + (synctics << 1)) & 2047); ! 3126: ! 3127: return (1); ! 3128: } ! 3129: else { ! 3130: daang = 0; ! 3131: } ! 3132: ! 3133: return (0); ! 3134: } ! 3135: ! 3136: void ! 3137: checkmove(short i, short *movestat) ! 3138: { ! 3139: ! 3140: struct player *plr; ! 3141: spritetype *spr; ! 3142: ! 3143: plr = &player[pyrn]; ! 3144: spr = &sprite[i]; ! 3145: ! 3146: //*movestat=actormovesprite((short)i); ! 3147: ! 3148: *movestat = movesprite((short) i, ! 3149: (((long) sintable[(spr->ang + 512) & 2047]) * synctics) << 3, ! 3150: (((long) sintable[spr->ang]) * synctics) << 3, ! 3151: 0L, ! 3152: 4L << 8, ! 3153: 4L << 8, ! 3154: 2); ! 3155: ! 3156: ! 3157: ! 3158: if (*movestat != 0) { ! 3159: if (krand() & 1 == 0) { ! 3160: spr->ang = (getangle(plr->x - spr->x, plr->y - spr->y) & 2047); ! 3161: } ! 3162: else ! 3163: spr->ang = ((spr->ang + (synctics)) & 2047); ! 3164: } ! 3165: ! 3166: ! 3167: } ! 3168: ! 3169: extern ! 3170: int droptheshield; ! 3171: ! 3172: void ! 3173: shieldhit(int hp) ! 3174: { ! 3175: shieldpoints -= hp; ! 3176: if (shieldpoints <= 0) { ! 3177: strcpy(displaybuf, "Shield useless"); ! 3178: displaytime = 360; ! 3179: } ! 3180: } ! 3181: ! 3182: void ! 3183: attack(short i) ! 3184: { ! 3185: ! 3186: struct player *plr; ! 3187: int a=0,k,s=0; ! 3188: ! 3189: ! 3190: plr = &player[pyrn]; ! 3191: ! 3192: if (invincibletime > 0) ! 3193: return; ! 3194: ! 3195: if (plr->treasure[6] == 1 && krand() & 32 > 16) ! 3196: return; ! 3197: ! 3198: if (krand() & 15 < plr->armortype + 10) ! 3199: return; ! 3200: ! 3201: if (droptheshield == 0 && shieldpoints > 0 && selectedgun < 5) { ! 3202: a = getangle(sprite[i].x - plr->x, sprite[i].y - plr->y); ! 3203: if ((a < plr->ang && plr->ang - a < 128) || ! 3204: (a > plr->ang && ((plr->ang + a) & 2047) < 128)) { ! 3205: if (krand() % 100 > 80) { ! 3206: playsound_loc(S_SWORD1 + rand() % 3, plr->x, plr->y); ! 3207: return; ! 3208: } ! 3209: else { ! 3210: s = krand() % 50; ! 3211: shieldhit(-s); ! 3212: if (krand() % 100 > 50) { ! 3213: playsound_loc(S_SWORD1 + rand() % 3, plr->x, plr->y); ! 3214: return; ! 3215: } ! 3216: } ! 3217: } ! 3218: } ! 3219: ! 3220: #if 0 ! 3221: k = krand() % 100; ! 3222: if (k > (plr->armortype << 3)) ! 3223: k = 15; ! 3224: else ! 3225: k = 5; ! 3226: #endif ! 3227: switch (sprite[i].picnum) { ! 3228: case FISH: ! 3229: case RAT: ! 3230: break; ! 3231: case SKELETONATTACK: // damage 5 - 10 ! 3232: playsound_loc(S_RIP1 + (rand() % 3), sprite[i].x, sprite[i].y); ! 3233: if (rand() % 2) { ! 3234: playsound_loc(S_GORE1 + (rand() % 4), sprite[i].x, sprite[i].y); ! 3235: } ! 3236: if (rand() % 2) { ! 3237: playsound_loc(S_BREATH1 + (rand() % 6), sprite[i].x, sprite[i].y); ! 3238: } ! 3239: k = (krand() % 5) + 5; ! 3240: break; ! 3241: case KATIE: // damage 5 - 50 ! 3242: case KATIEAT: ! 3243: playsound_loc(S_DEMONTHROW, sprite[i].x, sprite[i].y); ! 3244: k = (krand() % 45) + 5; ! 3245: break; ! 3246: case DEVIL: // damage fireball 5 - 25 ! 3247: case DEVILATTACK: ! 3248: playsound_loc(S_DEMONTHROW, sprite[i].x, sprite[i].y); ! 3249: break; ! 3250: case KOBOLDATTACK: // damage 5 - 10 ! 3251: playsound_loc(S_GENSWING, sprite[i].x, sprite[i].y); ! 3252: if (rand() % 10 > 4) { ! 3253: playsound_loc(S_KOBOLDHIT, plr->x, plr->y); ! 3254: playsound_loc(S_BREATH1 + (rand() % 6), plr->x, plr->y); ! 3255: } ! 3256: k = (krand() % 5) + 5; ! 3257: break; ! 3258: case IMPATTACK: // damage 5 - 10 ! 3259: playsound_loc(S_RIP1 + (rand() % 3), sprite[i].x, sprite[i].y); ! 3260: if (rand() % 2) { ! 3261: playsound_loc(S_GORE1 + (rand() % 4), sprite[i].x, sprite[i].y); ! 3262: } ! 3263: if (rand() % 2) { ! 3264: playsound_loc(S_BREATH1 + (rand() % 6), sprite[i].x, sprite[i].y); ! 3265: } ! 3266: ! 3267: k = (krand() % 5) + 5; ! 3268: if (k > 8) { ! 3269: poisoned = 1; ! 3270: } ! 3271: break; ! 3272: ! 3273: case NEWGUYMACE: // damage 5 - 20 ! 3274: playsound_loc(S_PLRWEAPON2,sprite[i].x,sprite[i].y); ! 3275: if (rand()%10 > 4) { ! 3276: playsound_loc(S_KOBOLDHIT,plr->x,plr->y); ! 3277: playsound_loc(S_BREATH1+(rand()%6),plr->x,plr->y); ! 3278: } ! 3279: k = (krand() % 15) + 5; ! 3280: break; ! 3281: case NEWGUYPUNCH: // damage 1 - 5 ! 3282: case KURTPUNCH: ! 3283: playsound_loc(S_GENSWING,sprite[i].x,sprite[i].y); ! 3284: if (rand()%10 > 4) { ! 3285: playsound_loc(S_SOCK1+(rand()%4),plr->x,plr->y); ! 3286: playsound_loc(S_BREATH1+(rand()%6),plr->x,plr->y); ! 3287: } ! 3288: k = (krand() % 4) + 1; ! 3289: break; ! 3290: case KURTAT: // damage 5 - 15 ! 3291: playsound_loc(S_GENSWING, sprite[i].x, sprite[i].y); ! 3292: if (rand() % 10 > 3) { ! 3293: playsound_loc(S_SWORD1 + (rand() % 6), sprite[i].x, sprite[i].y); ! 3294: } ! 3295: k = (krand() % 10) + 5; ! 3296: break; ! 3297: case GONZOCSWAT: // damage 5- 20 ! 3298: case GONZOGSWAT: ! 3299: playsound_loc(S_GENSWING, sprite[i].x, sprite[i].y); ! 3300: if (rand() % 10 > 6) { ! 3301: playsound_loc(S_SWORD1 + (rand() % 6), sprite[i].x, sprite[i].y); ! 3302: } ! 3303: k = (krand() % 15) + 5; ! 3304: break; ! 3305: ! 3306: case GONZOGHMAT: // damage 5- 15 ! 3307: playsound_loc(S_GENSWING, sprite[i].x, sprite[i].y); ! 3308: if (rand() % 10 > 6) { ! 3309: playsound_loc(S_SWORD1 + (rand() % 6), sprite[i].x, sprite[i].y); ! 3310: } ! 3311: k = (krand() % 10) + 5; ! 3312: break; ! 3313: ! 3314: case GONZOGSHAT: // damage 5 - 20 ! 3315: playsound_loc(S_GENSWING, sprite[i].x, sprite[i].y); ! 3316: if (rand() % 10 > 3) { ! 3317: playsound_loc(S_SWORD1 + (rand() % 6), sprite[i].x, sprite[i].y); ! 3318: } ! 3319: k = (krand() % 15) + 5; ! 3320: break; ! 3321: ! 3322: case GRONSWATTACK: // damage 5 - 25 ! 3323: k = (krand() % 20) + 5; ! 3324: if (sprite[i].shade > 30) { ! 3325: k += krand() % 10; ! 3326: } ! 3327: playsound_loc(S_GENSWING, sprite[i].x, sprite[i].y); ! 3328: if (rand() % 10 > 3) { ! 3329: playsound_loc(S_SWORD1 + (rand() % 6), sprite[i].x, sprite[i].y); ! 3330: } ! 3331: break; ! 3332: ! 3333: case MINOTAURATTACK: // damage 5 - 30 ! 3334: playsound_loc(S_GENSWING, sprite[i].x, sprite[i].y); ! 3335: if (rand() % 10 > 4) { ! 3336: playsound_loc(S_SWORD1 + (rand() % 6), sprite[i].x, sprite[i].y); ! 3337: } ! 3338: k = (krand() % 25) + 5; ! 3339: break; ! 3340: } ! 3341: ! 3342: if (shieldpoints > 0) { ! 3343: if (s > k) { ! 3344: k = 0; ! 3345: } ! 3346: else { ! 3347: k -= s; ! 3348: } ! 3349: } ! 3350: ! 3351: switch (plr->armortype) { ! 3352: case 0: // none ! 3353: healthpic(-k); ! 3354: break; ! 3355: case 1: // leather ! 3356: a = krand() % 5; ! 3357: if (a > k) { ! 3358: k = 0; ! 3359: } ! 3360: else { ! 3361: k -= a; ! 3362: } ! 3363: armorpic(-a); ! 3364: healthpic(-k); ! 3365: break; ! 3366: case 2: // chain ! 3367: a = krand() % 10; ! 3368: if (a > k) { ! 3369: k = 0; ! 3370: } ! 3371: else { ! 3372: k -= a; ! 3373: } ! 3374: armorpic(-a); ! 3375: healthpic(-k); ! 3376: break; ! 3377: case 3: // plate ! 3378: a = krand() % 20; ! 3379: if (a > k) { ! 3380: k = 0; ! 3381: } ! 3382: else { ! 3383: k -= a; ! 3384: } ! 3385: armorpic(-a); ! 3386: healthpic(-k); ! 3387: break; ! 3388: } ! 3389: ! 3390: startredflash(k); ! 3391: ! 3392: #if 0 ! 3393: if (rand() % 100 > 50) { ! 3394: svel += (rand() % k) << 3; ! 3395: angvel += (rand() % k) << 3; ! 3396: } ! 3397: else { ! 3398: svel -= (rand() % k) << 3; ! 3399: angvel += (rand() % k) << 3; ! 3400: } ! 3401: #endif ! 3402: ! 3403: if (k == 0) ! 3404: k = 1; ! 3405: ! 3406: k = rand() % k; ! 3407: angvel += k << 3; ! 3408: svel += k << 3; ! 3409: vel -= k << 3; ! 3410: plr->hvel += k << 2; ! 3411: ! 3412: #if 0 ! 3413: if (plr->health < 21) { ! 3414: strcpy(displaybuf, "health critical"); ! 3415: displaytime = 30; ! 3416: } ! 3417: #endif ! 3418: ! 3419: } ! 3420: ! 3421: ! 3422: ! 3423: ! 3424: void ! 3425: fireballblast(short i) ! 3426: { ! 3427: ! 3428: long j; ! 3429: int k; ! 3430: spritetype *spr; ! 3431: spritetype *tspr; ! 3432: ! 3433: spr = &sprite[i]; ! 3434: ! 3435: for (k = 0; k < 8; k++) { ! 3436: ! 3437: j = insertsprite(spr->sectnum, FX); ! 3438: tspr = &sprite[j]; ! 3439: ! 3440: tspr->x = spr->x; ! 3441: tspr->y = spr->y; ! 3442: tspr->z = spr->z; ! 3443: ! 3444: tspr->cstat = 2; ! 3445: // tspr->picnum=FIREBALL; ! 3446: tspr->picnum = FATSPANK; ! 3447: tspr->shade = 0; ! 3448: ! 3449: tspr->xrepeat = 8; ! 3450: tspr->yrepeat = 8; ! 3451: tspr->ang = k << 8; ! 3452: tspr->xvel = ((krand() & 511) - 256) << 3; ! 3453: tspr->yvel = ((krand() & 511) - 256) << 3; ! 3454: tspr->zvel = ((krand() & 511) - 256) << 3; ! 3455: ! 3456: tspr->owner = spr->owner; ! 3457: tspr->lotag = 196; ! 3458: tspr->hitag = 0; ! 3459: ! 3460: } ! 3461: ! 3462: } ! 3463: ! 3464: void ! 3465: makeafire(short i, int firetype) ! 3466: { ! 3467: long j; ! 3468: spritetype *spr, ! 3469: *tspr; ! 3470: ! 3471: spr = &sprite[i]; ! 3472: ! 3473: j = insertsprite(spr->sectnum, FIRE); ! 3474: tspr = &sprite[j]; ! 3475: ! 3476: tspr->x = spr->x + (rand() & 1024) - 512; ! 3477: tspr->y = spr->y + (rand() & 1024) - 512; ! 3478: tspr->z = spr->z; ! 3479: tspr->cstat = 0; ! 3480: tspr->xrepeat = 64; ! 3481: tspr->yrepeat = 64; ! 3482: tspr->shade = 0; ! 3483: tspr->clipdist = 64; ! 3484: tspr->owner = spr->owner; ! 3485: tspr->lotag = 2047; ! 3486: tspr->hitag = 0; ! 3487: ! 3488: changespritestat(j, FIRE); ! 3489: ! 3490: } ! 3491: ! 3492: void ! 3493: explosion(short i, long x, long y, long z, short owner) ! 3494: { ! 3495: long j; ! 3496: spritetype *spr, ! 3497: *tspr; ! 3498: ! 3499: spr = &sprite[i]; ! 3500: j = insertsprite(spr->sectnum, EXPLO); ! 3501: tspr = &sprite[j]; ! 3502: ! 3503: tspr->x = x; ! 3504: tspr->y = y; ! 3505: tspr->z = z + (16 << 8); ! 3506: tspr->cstat = 0; ! 3507: tspr->cstat &= ~3; ! 3508: tspr->picnum = EXPLOSTART; ! 3509: tspr->shade = -15; ! 3510: tspr->xrepeat = 64; ! 3511: tspr->yrepeat = 64; ! 3512: tspr->ang = krand() & 2047; ! 3513: tspr->xvel = ((krand() & 511) - 256); ! 3514: tspr->yvel = ((krand() & 511) - 256); ! 3515: tspr->zvel = ((krand() & 511) - 256); ! 3516: tspr->owner = owner; ! 3517: tspr->lotag = 12; ! 3518: tspr->hitag = 0; ! 3519: tspr->pal = 0; ! 3520: ! 3521: } ! 3522: ! 3523: void ! 3524: explosion2(short i, long x, long y, long z, short owner) ! 3525: { ! 3526: long j; ! 3527: spritetype *spr, ! 3528: *tspr; ! 3529: ! 3530: spr = &sprite[i]; ! 3531: ! 3532: j = insertsprite(spr->sectnum, EXPLO); ! 3533: tspr = &sprite[j]; ! 3534: ! 3535: tspr->x = x; ! 3536: tspr->y = y; ! 3537: tspr->z = z + (16 << 8); ! 3538: tspr->cstat = 0; ! 3539: tspr->cstat &= ~3; ! 3540: tspr->picnum = EXPLOSTART; ! 3541: tspr->shade = -25; ! 3542: tspr->xrepeat = 64; ! 3543: tspr->yrepeat = 64; ! 3544: tspr->ang = krand() & 2047; ! 3545: tspr->xvel = ((krand() & 256) - 128); ! 3546: tspr->yvel = ((krand() & 256) - 128); ! 3547: tspr->zvel = ((krand() & 256) - 128); ! 3548: tspr->owner = spr->owner; ! 3549: tspr->lotag = 12; ! 3550: tspr->hitag = 0; ! 3551: tspr->pal = 0; ! 3552: ! 3553: } ! 3554: ! 3555: ! 3556: void ! 3557: trailingsmoke(short i, short ball) ! 3558: { ! 3559: long j; ! 3560: spritetype *spr, ! 3561: *tspr; ! 3562: ! 3563: spr = &sprite[i]; ! 3564: ! 3565: j = insertsprite(spr->sectnum, SMOKE); ! 3566: tspr = &sprite[j]; ! 3567: ! 3568: tspr->x = spr->x; ! 3569: tspr->y = spr->y; ! 3570: tspr->z = spr->z; ! 3571: tspr->cstat = 0x03; ! 3572: tspr->cstat &= ~3; ! 3573: tspr->picnum = SMOKEFX; ! 3574: tspr->shade = 0; ! 3575: if (ball == 1) { ! 3576: tspr->xrepeat = 128; ! 3577: tspr->yrepeat = 128; ! 3578: } ! 3579: else { ! 3580: tspr->xrepeat = 32; ! 3581: tspr->yrepeat = 32; ! 3582: } ! 3583: tspr->pal = 0; ! 3584: ! 3585: tspr->owner = spr->owner; ! 3586: tspr->lotag = 256; ! 3587: tspr->hitag = 0; ! 3588: ! 3589: } ! 3590: ! 3591: void ! 3592: icecubes(short i, long x, long y, long z, short owner) ! 3593: { ! 3594: long j; ! 3595: spritetype *spr, ! 3596: *tspr; ! 3597: ! 3598: spr = &sprite[i]; ! 3599: ! 3600: j = insertsprite(spr->sectnum, FX); ! 3601: tspr = &sprite[j]; ! 3602: ! 3603: tspr->x = x; ! 3604: tspr->y = y; ! 3605: tspr->z = sector[spr->sectnum].floorz - (PLAYERHEIGHT << 8) + (rand() & 4096); ! 3606: tspr->cstat = 0; ! 3607: tspr->picnum = ICECUBE; ! 3608: tspr->shade = -16; ! 3609: tspr->xrepeat = 16; ! 3610: tspr->yrepeat = 16; ! 3611: tspr->ang = ((rand() & 1023) - 1024) & 2047; ! 3612: tspr->xvel = ((rand() & 1023) - 512); ! 3613: tspr->yvel = ((rand() & 1023) - 512); ! 3614: tspr->zvel = ((rand() & 1023) - 512); ! 3615: tspr->pal = 6; ! 3616: tspr->owner = spr->owner; ! 3617: tspr->lotag = 2048; ! 3618: tspr->hitag = 0; ! 3619: ! 3620: } ! 3621: ! 3622: ! 3623: int ! 3624: damageactor(short hitobject, short i) ! 3625: { ! 3626: short osectnum, ! 3627: hitdamage, ! 3628: j, ! 3629: k; ! 3630: long nexti, ! 3631: dax, ! 3632: day, ! 3633: daz; ! 3634: short daang, ! 3635: movestat; ! 3636: struct player *plr; ! 3637: int incr; ! 3638: spritetype *spr, ! 3639: *tspr; ! 3640: ! 3641: plr = &player[pyrn]; ! 3642: spr = &sprite[i]; ! 3643: ! 3644: j = (hitobject & 4095); ! 3645: tspr = &sprite[j]; ! 3646: ! 3647: // if (tspr->owner == 4096) { ! 3648: // return(0); ! 3649: // } ! 3650: ! 3651: if (j == plr->spritenum && spr->owner == 4096) { ! 3652: return (0); ! 3653: } ! 3654: ! 3655: // if (j == plr->spritenum && spr->owner != 4096) { ! 3656: if (spr->owner != 4096) { ! 3657: if (invincibletime <= 0 || manatime <= 0) { ! 3658: if ((krand() & 9) == 0) { ! 3659: playsound_loc(S_PLRPAIN1 + (rand() % 2), sprite[i].x, sprite[i].y); ! 3660: } ! 3661: if (manatime > 0 && spr->picnum != FATSPANK && spr->picnum != PLASMA) { ! 3662: deletesprite((short) i); ! 3663: } ! 3664: else { ! 3665: if (spr->picnum == DART) { ! 3666: poisoned = 1; ! 3667: poisontime = 7200; ! 3668: strcpy(displaybuf, "Poisoned"); ! 3669: displaytime = 360; ! 3670: } ! 3671: if (netgame) { ! 3672: netdamageactor(j, i); ! 3673: } ! 3674: else { ! 3675: if (spr->picnum == PLASMA) { ! 3676: healthpic(-((krand() & 15) + 15)); ! 3677: vel -= (rand() % 20); ! 3678: } ! 3679: else if (spr->picnum == FATSPANK) { ! 3680: playsound_loc(S_GORE1A + (rand() % 3), plr->x, plr->y); ! 3681: healthpic(-((krand() & 10) + 10)); ! 3682: if (rand() % 100 > 90) { ! 3683: poisoned = 1; ! 3684: poisontime = 7200; ! 3685: strcpy(displaybuf, "Poisoned"); ! 3686: displaytime = 360; ! 3687: } ! 3688: } ! 3689: else if (spr->picnum == THROWPIKE) { ! 3690: healthpic(-((krand() % 10) + 5)); ! 3691: } ! 3692: else { ! 3693: healthpic(-((krand() % 20) + 5)); ! 3694: } ! 3695: } ! 3696: startredflash(10); ! 3697: } ! 3698: } ! 3699: } ! 3700: if (j != plr->spritenum && netgame == 0) { // Les 08/11/95 ! 3701: if (spr->owner != j) { ! 3702: switch (tspr->picnum) { ! 3703: case BARREL: ! 3704: case VASEA: ! 3705: case VASEB: ! 3706: case VASEC: ! 3707: case STAINGLASS1: ! 3708: case STAINGLASS2: ! 3709: case STAINGLASS3: ! 3710: case STAINGLASS4: ! 3711: case STAINGLASS5: ! 3712: case STAINGLASS6: ! 3713: case STAINGLASS7: ! 3714: case STAINGLASS8: ! 3715: case STAINGLASS9: ! 3716: if (tspr->hitag == 0) { ! 3717: tspr->hitag = 0; ! 3718: tspr->lotag = 0; ! 3719: newstatus(j, BROKENVASE); ! 3720: } ! 3721: break; ! 3722: ! 3723: ! 3724: case NEWGUY: ! 3725: case NEWGUYSTAND: ! 3726: case NEWGUYKNEE: ! 3727: case NEWGUYMACE: ! 3728: case NEWGUYCAST: ! 3729: case NEWGUYPUNCH: ! 3730: case NEWGUYBOW: ! 3731: ! 3732: case KURTSTAND: ! 3733: case KURTKNEE: ! 3734: case KURTAT: ! 3735: case KURTPUNCH: ! 3736: case KURTREADY: ! 3737: case GONZOCSW: ! 3738: case GONZOCSWAT: ! 3739: ! 3740: case GONZOGSW: ! 3741: case GONZOGSWAT: ! 3742: case GONZOGHM: ! 3743: case GONZOGHMAT: ! 3744: case GONZOGSH: ! 3745: case GONZOGSHAT: ! 3746: ! 3747: case GRONHAL: ! 3748: case GRONHALATTACK: ! 3749: case GRONMU: ! 3750: case GRONMUATTACK: ! 3751: case GRONSW: ! 3752: case GRONSWATTACK: ! 3753: case KOBOLD: ! 3754: case KOBOLDATTACK: ! 3755: case KATIE: ! 3756: case KATIEAT: ! 3757: case DEVIL: ! 3758: case DEVILATTACK: ! 3759: case IMP: ! 3760: case IMPATTACK: ! 3761: case MINOTAUR: ! 3762: case MINOTAURATTACK: ! 3763: case SKELETON: ! 3764: case SKELETONATTACK: ! 3765: switch (spr->picnum) { ! 3766: case PLASMA: ! 3767: tspr->hitag -= 40; ! 3768: break; ! 3769: case FATSPANK: ! 3770: tspr->hitag -= 10; ! 3771: break; ! 3772: case MONSTERBALL: ! 3773: tspr->hitag -= 40; ! 3774: break; ! 3775: // case FIREBALL: ! 3776: // tspr->hitag-=3; ! 3777: // break; ! 3778: case BULLET: ! 3779: tspr->hitag -= 10; ! 3780: break; ! 3781: case DISTORTIONBLAST: ! 3782: tspr->hitag = 10; ! 3783: break; ! 3784: case DART: ! 3785: case WALLARROW: ! 3786: case HORIZSPIKEBLADE: ! 3787: case THROWHALBERD: ! 3788: tspr->hitag -= 30; ! 3789: break; ! 3790: case THROWPIKE: ! 3791: if (rand() % 2) { ! 3792: playsound_loc(S_GORE1A + rand() % 2, sprite[i].x, sprite[i].y); ! 3793: } ! 3794: tspr->hitag -= 30; ! 3795: break; ! 3796: case BARREL: ! 3797: tspr->hitag -= 100; ! 3798: break; ! 3799: } ! 3800: if (tspr->hitag <= 0) { ! 3801: newstatus(j, DIE); ! 3802: deletesprite((short) i); ! 3803: return (1); ! 3804: } ! 3805: else { ! 3806: newstatus(j, PAIN); ! 3807: return (1); ! 3808: } ! 3809: break; ! 3810: ! 3811: case GONZOBSHPAIN: ! 3812: case GONZOCSWPAIN: ! 3813: case GONZOGSWPAIN: ! 3814: case GONZOGHMPAIN: ! 3815: case GONZOGSHPAIN: ! 3816: case NEWGUYPAIN: ! 3817: case GRONHALPAIN: ! 3818: case GRONMUPAIN: ! 3819: case GRONSWPAIN: ! 3820: case KOBOLDDIE: ! 3821: case KATIEPAIN: ! 3822: case DEVILDIE: ! 3823: case IMPDIE: ! 3824: case MINOTAURDIE: ! 3825: case SKELETONDIE: ! 3826: //JSA_NEW //why is this here it's in whplr ! 3827: //raf because monsters could shatter a guy thats been frozen ! 3828: if (tspr->pal == 6) { ! 3829: for (k = 0; k < 32; k++) { ! 3830: icecubes(j, tspr->x, tspr->y, tspr->z, j); ! 3831: } ! 3832: deletesprite((short) j); ! 3833: return (1); ! 3834: } ! 3835: default: ! 3836: deletesprite((short) i); ! 3837: return (1); ! 3838: } ! 3839: } ! 3840: } ! 3841: return (0); ! 3842: } ! 3843: ! 3844: void ! 3845: nukespell(short j) ! 3846: { ! 3847: ! 3848: long k; ! 3849: struct player *plr; ! 3850: ! 3851: plr = &player[pyrn]; ! 3852: ! 3853: // dont nuke a shade ! 3854: if (sprite[j].shade > 30) ! 3855: return; ! 3856: ! 3857: newstatus(j, NUKED); ! 3858: sprite[j].pal = 0; ! 3859: sprite[j].cstat |= 1; ! 3860: sprite[j].cstat &= ~3; ! 3861: sprite[j].shade = 6; ! 3862: sprite[j].lotag = 360; ! 3863: sprite[j].ang = plr->ang; ! 3864: score(150); ! 3865: ! 3866: k = insertsprite(sprite[j].sectnum, NUKED); ! 3867: sprite[k].lotag = 360; ! 3868: sprite[k].xrepeat = 30; ! 3869: sprite[k].yrepeat = 12; ! 3870: sprite[k].picnum = ZFIRE; ! 3871: sprite[k].pal = 0; ! 3872: sprite[k].ang = sprite[j].ang; ! 3873: sprite[k].x = sprite[j].x; ! 3874: sprite[k].y = sprite[j].y; ! 3875: sprite[k].z = sprite[j].z; ! 3876: sprite[k].cstat = sprite[j].cstat; ! 3877: ! 3878: } ! 3879: ! 3880: void ! 3881: medusa(short j) ! 3882: { ! 3883: ! 3884: newstatus(j, FROZEN); ! 3885: switch (sprite[j].picnum) { ! 3886: ! 3887: case NEWGUY: ! 3888: case NEWGUYSTAND: ! 3889: case NEWGUYKNEE: ! 3890: case NEWGUYCAST: ! 3891: case NEWGUYBOW: ! 3892: case NEWGUYMACE: ! 3893: case NEWGUYPUNCH: ! 3894: sprite[j].picnum = NEWGUYPAIN; ! 3895: break; ! 3896: ! 3897: case KURTSTAND: ! 3898: case KURTKNEE: ! 3899: case KURTAT: ! 3900: case KURTPUNCH: ! 3901: case KURTREADY: ! 3902: ! 3903: case GONZOCSW: ! 3904: case GONZOCSWAT: ! 3905: sprite[j].picnum = GONZOCSWPAIN; ! 3906: break; ! 3907: ! 3908: case GONZOGSW: ! 3909: case GONZOGSWAT: ! 3910: sprite[j].picnum = GONZOGSWPAIN; ! 3911: break; ! 3912: ! 3913: case GONZOGHM: ! 3914: case GONZOGHMAT: ! 3915: sprite[j].picnum = GONZOGHMPAIN; ! 3916: break; ! 3917: ! 3918: case GONZOGSH: ! 3919: case GONZOGSHAT: ! 3920: sprite[j].picnum = GONZOGHMPAIN; ! 3921: break; ! 3922: ! 3923: case KOBOLD: ! 3924: case KOBOLDATTACK: ! 3925: sprite[j].picnum = KOBOLDDIE; ! 3926: break; ! 3927: case KATIE: ! 3928: case KATIEAT: ! 3929: sprite[j].picnum = KATIEPAIN; ! 3930: break; ! 3931: case DEVIL: ! 3932: case DEVILATTACK: ! 3933: sprite[j].picnum = DEVILDIE; ! 3934: break; ! 3935: case IMP: ! 3936: case IMPATTACK: ! 3937: sprite[j].picnum = IMPDIE; ! 3938: break; ! 3939: case MINOTAUR: ! 3940: case MINOTAURATTACK: ! 3941: sprite[j].picnum = MINOTAURDIE; ! 3942: break; ! 3943: case SKELETON: ! 3944: sprite[j].picnum = SKELETONDIE; ! 3945: break; ! 3946: case GRONHAL: ! 3947: case GRONHALATTACK: ! 3948: sprite[j].picnum = GRONHALDIE; ! 3949: break; ! 3950: case GRONMU: ! 3951: case GRONMUATTACK: ! 3952: sprite[j].picnum = GRONMUDIE; ! 3953: break; ! 3954: case GRONSW: ! 3955: case GRONSWATTACK: ! 3956: sprite[j].picnum = GRONSWDIE; ! 3957: break; ! 3958: } ! 3959: sprite[j].pal = 6; ! 3960: sprite[j].cstat |= 1; ! 3961: score(100); ! 3962: ! 3963: } ! 3964: ! 3965: ! 3966: // New movesprite using getzrange. Note that I made the getzrange ! 3967: // parameters global (&globhiz,&globhihit,&globloz,&globlohit) so they ! 3968: // don't need to be passed everywhere. Also this should make this ! 3969: // movesprite function compatible with the older movesprite functions. ! 3970: int ! 3971: movesprite(short spritenum, long dx, long dy, long dz, long ceildist, long flordist, char cliptype) ! 3972: { ! 3973: long daz, ! 3974: zoffs, ! 3975: templong; ! 3976: short retval, ! 3977: dasectnum, ! 3978: tempshort; ! 3979: spritetype *spr; ! 3980: ! 3981: spr = &sprite[spritenum]; ! 3982: ! 3983: flordist = 32L; ! 3984: ! 3985: if ((spr->cstat & 128) == 0) ! 3986: zoffs = -((tilesizy[spr->picnum] * spr->yrepeat) << 1); ! 3987: else ! 3988: zoffs = 0; ! 3989: ! 3990: dasectnum = spr->sectnum; // Can't modify sprite sectors directly ! 3991: // becuase of linked lists ! 3992: daz = spr->z + zoffs; // Must do this if not using the new ! 3993: // centered centering (of course) ! 3994: retval = clipmove(&spr->x, &spr->y, &daz, &dasectnum, dx, dy, ! 3995: ((long) spr->clipdist) << 2, ceildist, flordist, cliptype); ! 3996: ! 3997: if ((dasectnum != spr->sectnum) && (dasectnum >= 0)) ! 3998: changespritesect(spritenum, dasectnum); ! 3999: ! 4000: // Set the blocking bit to 0 temporarly so getzrange doesn't pick up ! 4001: // its own sprite ! 4002: tempshort = spr->cstat; ! 4003: spr->cstat &= ~1; ! 4004: getzrange(spr->x, spr->y, spr->z - 1, spr->sectnum, ! 4005: &globhiz, &globhihit, &globloz, &globlohit, ! 4006: ((long) spr->clipdist) << 2, cliptype); ! 4007: spr->cstat = tempshort; ! 4008: ! 4009: daz = spr->z + zoffs + dz; ! 4010: if ((daz <= globhiz) || (daz > globloz)) { ! 4011: if (retval != 0) ! 4012: return (retval); ! 4013: return (16384 + dasectnum); ! 4014: } ! 4015: spr->z = daz - zoffs; ! 4016: return (retval); ! 4017: } ! 4018: ! 4019: #if 0 ! 4020: // New movesprite using getzrange. Note that I made the getzrange ! 4021: // parameters global (&globhiz,&globhihit,&globloz,&globlohit) so they ! 4022: // don't need to be passed everywhere. Also this should make this ! 4023: // movesprite function compatible with the older movesprite functions. ! 4024: int ! 4025: movesprite(short spritenum, long dx, long dy, long dz, long ceildist, long flordist, char cliptype) ! 4026: { ! 4027: long daz, ! 4028: zoffs, ! 4029: templong; ! 4030: short retval, ! 4031: dasectnum, ! 4032: tempshort; ! 4033: spritetype *spr; ! 4034: ! 4035: spr = &sprite[spritenum]; ! 4036: ! 4037: if ((spr->cstat & 128) == 0) { ! 4038: zoffs = -((tilesizy[spr->picnum] * spr->yrepeat) << 1); ! 4039: } ! 4040: else { ! 4041: zoffs = 0; ! 4042: } ! 4043: ! 4044: dasectnum = spr->sectnum; // Can't modify sprite sectors directly ! 4045: // becuase of linked lists ! 4046: daz = spr->z + zoffs; // Must do this if not using the new ! 4047: // centered centering (of course) ! 4048: retval = clipmove(&spr->x, &spr->y, &daz, &dasectnum, dx, dy, ! 4049: ((long) spr->clipdist) << 2, ceildist, flordist, cliptype); ! 4050: ! 4051: if ((dasectnum != spr->sectnum) && (dasectnum >= 0)) { ! 4052: changespritesect(spritenum, dasectnum); ! 4053: } ! 4054: ! 4055: // Set the blocking bit to 0 temporarly so getzrange doesn't pick up ! 4056: // its own sprite ! 4057: tempshort = spr->cstat; ! 4058: spr->cstat &= ~1; ! 4059: getzrange(spr->x, spr->y, spr->z - 1, spr->sectnum, ! 4060: &globhiz, &globhihit, &globloz, &globlohit, ! 4061: ((long) spr->clipdist) << 2, cliptype); ! 4062: spr->cstat = tempshort; ! 4063: daz = spr->z + zoffs + dz; ! 4064: if ((daz <= globhiz) || (daz > globloz)) { ! 4065: if (retval != 0) { ! 4066: return (retval); ! 4067: } ! 4068: return (16384 + dasectnum); ! 4069: } ! 4070: spr->z = daz - zoffs; ! 4071: return (retval); ! 4072: } ! 4073: #endif ! 4074: int ! 4075: actormovesprite(short spritenum) ! 4076: { ! 4077: long daz, ! 4078: zoffs, ! 4079: templong; ! 4080: short retval, ! 4081: dasectnum, ! 4082: tempshort; ! 4083: spritetype *spr; ! 4084: long dx, ! 4085: dy, ! 4086: dz; ! 4087: ! 4088: spr = &sprite[spritenum]; ! 4089: ! 4090: dx = (((long) sintable[(spr->ang + 512) & 2047]) * synctics) << 3, ! 4091: dy = (((long) sintable[spr->ang]) * synctics) << 3, ! 4092: dz = 0L; ! 4093: ! 4094: if ((spr->cstat & 128) == 0) { ! 4095: zoffs = -((tilesizy[spr->picnum] * spr->yrepeat) << 1); ! 4096: } ! 4097: else { ! 4098: zoffs = 0; ! 4099: } ! 4100: ! 4101: dasectnum = spr->sectnum; ! 4102: daz = spr->z + zoffs; ! 4103: retval = clipmove(&spr->x, &spr->y, &daz, &dasectnum, dx, dy, ! 4104: ((long) spr->clipdist) << 2, 1024L, 1024L, 2); ! 4105: ! 4106: if ((dasectnum != spr->sectnum) && (dasectnum >= 0)) { ! 4107: changespritesect(spritenum, dasectnum); ! 4108: } ! 4109: tempshort = spr->cstat; ! 4110: spr->cstat &= ~1; ! 4111: getzrange(spr->x, spr->y, spr->z - 1, spr->sectnum, ! 4112: &globhiz, &globhihit, &globloz, &globlohit, ! 4113: ((long) spr->clipdist) << 2, 2); ! 4114: spr->cstat = tempshort; ! 4115: daz = spr->z + zoffs; ! 4116: if ((daz <= globhiz) || (daz > globloz)) { ! 4117: if (retval != 0) { ! 4118: return (retval); ! 4119: } ! 4120: return (16384 + dasectnum); ! 4121: } ! 4122: spr->z = daz - zoffs; ! 4123: return (retval); ! 4124: } ! 4125: ! 4126: void ! 4127: guardianfire(short i, int k, struct player * plr) ! 4128: { ! 4129: ! 4130: short daang, ! 4131: j; ! 4132: int discrim; ! 4133: ! 4134: daang = (daang + (k << 2)) & 2047; ! 4135: j = insertsprite(sprite[i].sectnum, MISSILE); ! 4136: sprite[j].x = sprite[i].x; ! 4137: sprite[j].y = sprite[i].y; ! 4138: sprite[j].z = sprite[i].z + (8 << 8) + ((krand() & 10) << 8); ! 4139: sprite[j].cstat = 0; ! 4140: sprite[j].picnum = PLASMA; ! 4141: sprite[j].shade = -32; ! 4142: sprite[j].pal = 0; ! 4143: sprite[j].xrepeat = 16; ! 4144: sprite[j].yrepeat = 16; ! 4145: sprite[j].ang = daang; ! 4146: sprite[j].xvel = (sintable[(daang + 2560) & 2047] >> 5); ! 4147: sprite[j].yvel = (sintable[(daang + 2048) & 2047] >> 5); ! 4148: // sprite[j].zvel=((100-plr->horiz)<<4); ! 4149: discrim = ksqrt((plr->x - sprite[j].x) * (plr->x - sprite[j].x) + (plr->y - sprite[j].y) * (plr->y - sprite[j].y)); ! 4150: if (discrim == 0) ! 4151: discrim = 1; ! 4152: sprite[j].zvel = ((plr->z + (48 << 8) - sprite[j].z) << 7) / discrim; ! 4153: ! 4154: sprite[j].owner = 4096; ! 4155: sprite[j].lotag = 256; ! 4156: sprite[j].hitag = 0; ! 4157: sprite[j].clipdist = 48; ! 4158: ! 4159: } ! 4160: ! 4161: ! 4162: void ! 4163: gonzopike(short s) ! 4164: { ! 4165: long j, ! 4166: daz; ! 4167: struct player *plr; ! 4168: ! 4169: plr = &player[0]; ! 4170: ! 4171: j = insertsprite(sprite[s].sectnum, JAVLIN); ! 4172: ! 4173: sprite[j].x = sprite[s].x; ! 4174: sprite[j].y = sprite[s].y; ! 4175: sprite[j].z = sprite[s].z - (40<<8); ! 4176: ! 4177: sprite[j].cstat = 21; ! 4178: ! 4179: sprite[j].picnum = THROWPIKE; ! 4180: sprite[j].ang = ((sprite[s].ang + 2048 + 96) - 512) & 2047; ! 4181: sprite[j].xrepeat = 24; ! 4182: sprite[j].yrepeat = 24; ! 4183: sprite[j].clipdist = 32; ! 4184: ! 4185: sprite[j].extra = sprite[s].ang; ! 4186: sprite[j].shade = -15; ! 4187: sprite[j].xvel = ((krand() & 256) - 128); ! 4188: sprite[j].yvel = ((krand() & 256) - 128); ! 4189: // sprite[j].zvel=((krand()&256)-128); ! 4190: // sprite[j].zvel=((100-plr->horiz)<<4); ! 4191: ! 4192: sprite[j].zvel = ((plr->z + (8 << 8) - sprite[s].z) << 7) / ! 4193: ksqrt((plr->x - sprite[s].x) * ! 4194: (plr->x - sprite[s].x) + ! 4195: (plr->y - sprite[s].y) * ! 4196: (plr->y - sprite[s].y)); ! 4197: ! 4198: sprite[j].zvel += ((rand() % 256) - 128); ! 4199: ! 4200: sprite[j].owner = s; ! 4201: sprite[j].lotag = 1024; ! 4202: sprite[j].hitag = 0; ! 4203: sprite[j].pal = 0; ! 4204: ! 4205: ! 4206: } ! 4207: ! 4208: void ! 4209: newguyarrow(short s) ! 4210: { ! 4211: long j, ! 4212: daz; ! 4213: struct player *plr; ! 4214: ! 4215: plr = &player[0]; ! 4216: ! 4217: j = insertsprite(sprite[s].sectnum, JAVLIN); ! 4218: ! 4219: sprite[j].x = sprite[s].x; ! 4220: sprite[j].y = sprite[s].y; ! 4221: sprite[j].z = sprite[s].z - (40<<8); ! 4222: ! 4223: sprite[j].cstat = 21; ! 4224: ! 4225: sprite[j].picnum = WALLARROW; ! 4226: sprite[j].ang = ((sprite[s].ang + 2048 + 96) - 512) & 2047; ! 4227: sprite[j].xrepeat = 24; ! 4228: sprite[j].yrepeat = 24; ! 4229: sprite[j].clipdist = 32; ! 4230: ! 4231: sprite[j].extra = sprite[s].ang; ! 4232: sprite[j].shade = -15; ! 4233: sprite[j].xvel = ((krand() & 256) - 128); ! 4234: sprite[j].yvel = ((krand() & 256) - 128); ! 4235: ! 4236: sprite[j].zvel = ((plr->z + (8 << 8) - sprite[s].z) << 7) / ! 4237: ksqrt((plr->x - sprite[s].x) * ! 4238: (plr->x - sprite[s].x) + ! 4239: (plr->y - sprite[s].y) * ! 4240: (plr->y - sprite[s].y)); ! 4241: ! 4242: sprite[j].zvel += ((rand() % 256) - 128); ! 4243: ! 4244: sprite[j].owner = s; ! 4245: sprite[j].lotag = 1024; ! 4246: sprite[j].hitag = 0; ! 4247: sprite[j].pal = 0; ! 4248: ! 4249: ! 4250: } ! 4251: ! 4252: void ! 4253: trowajavlin(int s) ! 4254: { ! 4255: ! 4256: long j; ! 4257: ! 4258: j = insertsprite(sprite[s].sectnum, JAVLIN); ! 4259: ! 4260: sprite[j].x = sprite[s].x; ! 4261: sprite[j].y = sprite[s].y; ! 4262: sprite[j].z = sprite[s].z - (40<<8); ! 4263: ! 4264: sprite[j].cstat = 21; ! 4265: ! 4266: switch (sprite[s].lotag) { ! 4267: case 91: ! 4268: sprite[j].picnum = WALLARROW; ! 4269: sprite[j].ang = ((sprite[s].ang + 2048) - 512) & 2047; ! 4270: sprite[j].xrepeat = 16; ! 4271: sprite[j].yrepeat = 48; ! 4272: sprite[j].clipdist = 24; ! 4273: sprite[j].owner = s; ! 4274: ! 4275: break; ! 4276: case 92: ! 4277: sprite[j].picnum = DART; ! 4278: sprite[j].ang = ((sprite[s].ang + 2048) - 512) & 2047; ! 4279: sprite[j].xrepeat = 64; ! 4280: sprite[j].yrepeat = 64; ! 4281: sprite[j].clipdist = 16; ! 4282: sprite[j].owner = s; ! 4283: break; ! 4284: case 93: ! 4285: sprite[j].picnum = HORIZSPIKEBLADE; ! 4286: sprite[j].ang = ((sprite[s].ang + 2048) - 512) & 2047; ! 4287: sprite[j].xrepeat = 16; ! 4288: sprite[j].yrepeat = 48; ! 4289: sprite[j].clipdist = 32; ! 4290: sprite[j].owner = s; ! 4291: ! 4292: break; ! 4293: case 94: ! 4294: sprite[j].picnum = THROWPIKE; ! 4295: sprite[j].ang = ((sprite[s].ang + 2048) - 512) & 2047; ! 4296: sprite[j].xrepeat = 24; ! 4297: sprite[j].yrepeat = 24; ! 4298: sprite[j].clipdist = 32; ! 4299: sprite[j].owner = s; ! 4300: ! 4301: break; ! 4302: } ! 4303: ! 4304: sprite[j].extra = sprite[s].ang; ! 4305: sprite[j].shade = -15; ! 4306: sprite[j].xvel = ((krand() & 256) - 128); ! 4307: sprite[j].yvel = ((krand() & 256) - 128); ! 4308: sprite[j].zvel = ((krand() & 256) - 128); ! 4309: // sprite[j].owner=sprite[s].owner; ! 4310: sprite[j].owner = 0; ! 4311: sprite[j].lotag = 0; ! 4312: sprite[j].hitag = 0; ! 4313: sprite[j].pal = 0; ! 4314: ! 4315: } ! 4316: ! 4317: void ! 4318: throwhalberd(int s) ! 4319: { ! 4320: ! 4321: long j, ! 4322: daz; ! 4323: ! 4324: j = insertsprite(sprite[s].sectnum, JAVLIN); ! 4325: ! 4326: sprite[j].x = sprite[s].x; ! 4327: sprite[j].y = sprite[s].y; ! 4328: sprite[j].z = sprite[s].z - (40 << 8); ! 4329: ! 4330: sprite[j].cstat = 17; ! 4331: ! 4332: sprite[j].picnum = THROWHALBERD; ! 4333: sprite[j].ang = ((sprite[s].ang + 2048) - 512) & 2047; ! 4334: sprite[j].xrepeat = 8; ! 4335: sprite[j].yrepeat = 16; ! 4336: sprite[j].clipdist = 32; ! 4337: ! 4338: sprite[j].extra = sprite[s].ang; ! 4339: sprite[j].shade = -15; ! 4340: sprite[j].xvel = ((krand() & 256) - 128); ! 4341: sprite[j].yvel = ((krand() & 256) - 128); ! 4342: sprite[j].zvel = ((krand() & 256) - 128); ! 4343: sprite[j].owner = s; ! 4344: sprite[j].lotag = 0; ! 4345: sprite[j].hitag = 0; ! 4346: sprite[j].pal = 0; ! 4347: ! 4348: sprite[j].cstat = 0; ! 4349: daz = ((((long) sprite[j].zvel) * synctics) >> 3); ! 4350: movesprite((short) j, ! 4351: (((long) sintable[(sprite[j].extra + 512) & 2047]) * synctics) << 7, ! 4352: (((long) sintable[sprite[j].extra]) * synctics) << 7, ! 4353: daz, 4L << 8, 4L << 8, 1); ! 4354: sprite[j].cstat = 21; ! 4355: ! 4356: ! 4357: } ! 4358: ! 4359: void ! 4360: spawnhornskull(short i) ! 4361: { ! 4362: short j; ! 4363: ! 4364: j = insertsprite(sprite[i].sectnum, 0); ! 4365: sprite[j].x = sprite[i].x; ! 4366: sprite[j].y = sprite[i].y; ! 4367: sprite[j].z = sprite[i].z - (24 << 8); ! 4368: sprite[j].shade = -15; ! 4369: sprite[j].cstat = 0; ! 4370: sprite[j].cstat &= ~3; ! 4371: sprite[j].pal = 0; ! 4372: sprite[j].picnum = HORNEDSKULL; ! 4373: sprite[j].xrepeat = 64; ! 4374: sprite[j].yrepeat = 64; ! 4375: } ! 4376: ! 4377: extern ! 4378: int treasurescnt; ! 4379: ! 4380: void ! 4381: monsterweapon(short i) ! 4382: { ! 4383: ! 4384: short j; ! 4385: int k; ! 4386: ! 4387: if (sprite[i].shade > 20) ! 4388: return; ! 4389: ! 4390: switch (sprite[i].picnum) { ! 4391: case SKELETONDEAD: ! 4392: case KOBOLDDEAD: ! 4393: return; ! 4394: } ! 4395: if ((rand() % 100) < 75) { ! 4396: return; ! 4397: } ! 4398: ! 4399: j = insertsprite(sprite[i].sectnum, 0); ! 4400: ! 4401: sprite[j].x = sprite[i].x; ! 4402: sprite[j].y = sprite[i].y; ! 4403: sprite[j].z = sprite[i].z - (24 << 8); ! 4404: sprite[j].shade = -15; ! 4405: sprite[j].cstat = 0; ! 4406: sprite[j].cstat &= ~3; ! 4407: sprite[j].pal = 0; ! 4408: sprite[j].picnum = FLASKBLUE + (krand() % 4); ! 4409: ! 4410: switch (sprite[i].picnum) { ! 4411: case NEWGUYDEAD: ! 4412: sprite[j].xrepeat = 25; ! 4413: sprite[j].yrepeat = 20; ! 4414: if (sprite[j].extra < 20) ! 4415: sprite[j].picnum = WEAPON2; ! 4416: else ! 4417: sprite[j].picnum = QUIVER; ! 4418: ! 4419: sprite[j].pal = 0; ! 4420: break; ! 4421: ! 4422: case MINOTAURDEAD: ! 4423: sprite[j].xrepeat = 25; ! 4424: sprite[j].yrepeat = 20; ! 4425: sprite[j].picnum = WEAPON4; ! 4426: sprite[j].pal = 0; ! 4427: break; ! 4428: ! 4429: case GONZOBSHDEAD: ! 4430: sprite[j].picnum = GONZOBSHIELD; ! 4431: sprite[j].xrepeat = 12; ! 4432: sprite[j].yrepeat = 12; ! 4433: break; ! 4434: ! 4435: case GONZOCSWDEAD: ! 4436: if (sprite[j].extra > 10) { ! 4437: sprite[j].picnum = WEAPON6; ! 4438: sprite[j].xrepeat = 25; ! 4439: sprite[j].yrepeat = 20; ! 4440: } ! 4441: else if (sprite[j].extra > 0) { ! 4442: sprite[j].picnum = GOBWEAPON; ! 4443: sprite[j].xrepeat = 25; ! 4444: sprite[j].yrepeat = 20; ! 4445: } ! 4446: else { ! 4447: sprite[j].picnum = WEAPON1; ! 4448: sprite[j].xrepeat = 25; ! 4449: sprite[j].yrepeat = 20; ! 4450: } ! 4451: break; ! 4452: case GONZOCSHDEAD: ! 4453: sprite[j].picnum = GONZOCSHIELD; ! 4454: sprite[j].xrepeat = 12; ! 4455: sprite[j].yrepeat = 12; ! 4456: break; ! 4457: ! 4458: case GONZOGSWDEAD: ! 4459: sprite[j].picnum = WEAPON8; ! 4460: sprite[j].xrepeat = 25; ! 4461: sprite[j].yrepeat = 20; ! 4462: break; ! 4463: case GONZOGHMDEAD: ! 4464: sprite[j].picnum = PLATEARMOR; ! 4465: sprite[j].xrepeat = 26; ! 4466: sprite[j].yrepeat = 26; ! 4467: break; ! 4468: case GONZOGSHDEAD: ! 4469: sprite[j].picnum = GONZOGSHIELD; ! 4470: sprite[j].xrepeat = 12; ! 4471: sprite[j].yrepeat = 12; ! 4472: break; ! 4473: ! 4474: case GRONDEAD: ! 4475: if (netgame) { ! 4476: sprite[j].x = sprite[i].x; ! 4477: sprite[j].y = sprite[i].y; ! 4478: sprite[j].z = sprite[i].z - (24 << 8); ! 4479: sprite[j].shade = -15; ! 4480: sprite[j].cstat = 0; ! 4481: sprite[j].cstat &= ~3; ! 4482: sprite[j].xrepeat = 25; ! 4483: sprite[j].yrepeat = 20; ! 4484: k = krand() % 4; ! 4485: switch (k) { ! 4486: case 0: ! 4487: sprite[j].picnum = WEAPON3; ! 4488: sprite[j].xrepeat = 25; ! 4489: sprite[j].yrepeat = 20; ! 4490: break; ! 4491: case 1: ! 4492: sprite[j].picnum = WEAPON5; ! 4493: sprite[j].xrepeat = 25; ! 4494: sprite[j].yrepeat = 20; ! 4495: break; ! 4496: case 2: ! 4497: sprite[j].picnum = WEAPON6; ! 4498: sprite[j].xrepeat = 20; ! 4499: sprite[j].yrepeat = 15; ! 4500: break; ! 4501: case 3: ! 4502: sprite[j].picnum = SHIELD; ! 4503: sprite[j].xrepeat = 32; ! 4504: sprite[j].yrepeat = 32; ! 4505: break; ! 4506: } ! 4507: } ! 4508: else { ! 4509: switch (sprite[j].pal) { ! 4510: case 0: ! 4511: sprite[j].picnum = WEAPON3; ! 4512: sprite[j].xrepeat = 25; ! 4513: sprite[j].yrepeat = 20; ! 4514: break; ! 4515: case 10: ! 4516: sprite[j].picnum = WEAPON5; ! 4517: sprite[j].xrepeat = 25; ! 4518: sprite[j].yrepeat = 20; ! 4519: break; ! 4520: case 11: ! 4521: sprite[j].picnum = WEAPON6; ! 4522: sprite[j].xrepeat = 20; ! 4523: sprite[j].yrepeat = 15; ! 4524: break; ! 4525: case 12: ! 4526: sprite[j].picnum = SHIELD; ! 4527: sprite[j].xrepeat = 32; ! 4528: sprite[j].yrepeat = 32; ! 4529: break; ! 4530: } ! 4531: } ! 4532: sprite[j].pal = 0; ! 4533: break; ! 4534: default: ! 4535: treasurescnt++; ! 4536: break; ! 4537: } ! 4538: ! 4539: } ! 4540: ! 4541: // VAL 1-3 ! 4542: void ! 4543: madenoise(int val, long x, long y, long z) ! 4544: { ! 4545: ! 4546: long i, ! 4547: nexti; ! 4548: ! 4549: if (netgame) { ! 4550: return; ! 4551: } ! 4552: i = headspritestat[FACE]; ! 4553: while (i >= 0) { ! 4554: nexti = nextspritestat[i]; ! 4555: if ((labs(x - sprite[i].x) + labs(y - sprite[i].y) < (val * 4096))) ! 4556: newstatus(i, FINDME); ! 4557: i = nexti; ! 4558: } ! 4559: ! 4560: } ! 4561: ! 4562: void ! 4563: monsternoise(short i) ! 4564: { ! 4565: return; ! 4566: ! 4567: switch (sprite[i].picnum) { ! 4568: case KOBOLD: ! 4569: if (rand() % 100 > 98) ! 4570: playsound_loc(S_KSNARL1 + (rand() % 4), sprite[i].x, sprite[i].y); ! 4571: break; ! 4572: case IMP: ! 4573: case MINOTAUR: ! 4574: case SKELETON: ! 4575: break; ! 4576: } ! 4577: ! 4578: } ! 4579: ! 4580: void ! 4581: randompotion(short i) ! 4582: { ! 4583: ! 4584: short j; ! 4585: ! 4586: if (rand() % 100 > 20) ! 4587: return; ! 4588: ! 4589: j = insertsprite(sprite[i].sectnum, 0); ! 4590: ! 4591: sprite[j].x = sprite[i].x; ! 4592: sprite[j].y = sprite[i].y; ! 4593: sprite[j].z = sprite[i].z - (12 << 8); ! 4594: sprite[j].shade = -12; ! 4595: sprite[j].pal = 0; ! 4596: sprite[j].cstat = 0; ! 4597: sprite[j].cstat &= ~3; ! 4598: sprite[j].xrepeat = 64; ! 4599: sprite[j].yrepeat = 64; ! 4600: sprite[j].picnum = FLASKBLUE + krand() % 4; ! 4601: ! 4602: } ! 4603: ! 4604: ! 4605: void ! 4606: spawnabaddy(short i, short monster) ! 4607: { ! 4608: ! 4609: short j; ! 4610: ! 4611: j = insertsprite(sprite[i].sectnum, FACE); ! 4612: ! 4613: sprite[j].x = sprite[i].x + (krand() & 2048) - 1024; ! 4614: sprite[j].y = sprite[i].y + (krand() & 2048) - 1024; ! 4615: sprite[j].z = sprite[i].z; ! 4616: ! 4617: ! 4618: switch (monster) { ! 4619: case GRONSW: ! 4620: sprite[j].xrepeat = GRONSWXR; ! 4621: sprite[j].yrepeat = GRONSWYR; ! 4622: sprite[j].clipdist = 64; ! 4623: sprite[j].hitag = adjusthp(300); ! 4624: sprite[j].lotag = 100; ! 4625: sprite[j].cstat = 0; ! 4626: sprite[j].cstat |= 0x101; ! 4627: sprite[j].extra = 0; ! 4628: sprite[j].pal = 0; ! 4629: sprite[j].shade = 0; ! 4630: sprite[j].picnum = GRONSW; ! 4631: break; ! 4632: } ! 4633: setsprite((short) j, sprite[j].x, sprite[j].y, sprite[j].z); ! 4634: ! 4635: } ! 4636: ! 4637: ! 4638: ! 4639: void ! 4640: spawnapentagram(short sn) ! 4641: { ! 4642: ! 4643: short j; ! 4644: ! 4645: j = insertsprite(sprite[sn].sectnum, 0); ! 4646: ! 4647: sprite[j].x = sprite[sn].x; ! 4648: sprite[j].y = sprite[sn].y; ! 4649: sprite[j].z = sprite[sn].z - (8 << 8); ! 4650: sprite[j].xrepeat = sprite[j].yrepeat = 64; ! 4651: sprite[j].pal = 0; ! 4652: sprite[j].shade = -15; ! 4653: sprite[j].cstat = 0; ! 4654: sprite[j].clipdist = 64; ! 4655: sprite[j].lotag = 0; ! 4656: sprite[j].hitag = 0; ! 4657: sprite[j].extra = 0; ! 4658: sprite[j].picnum = PENTAGRAM; ! 4659: ! 4660: setsprite((short) j, sprite[j].x, sprite[j].y, sprite[j].z); ! 4661: ! 4662: } ! 4663: ! 4664: ! 4665: int ! 4666: isvalidactor(short i) ! 4667: { ! 4668: ! 4669: int valid; ! 4670: ! 4671: switch (sprite[i].picnum) { ! 4672: case SKELETON: ! 4673: case KOBOLD: ! 4674: case IMP: ! 4675: case GRONHAL: ! 4676: case GRONMU: ! 4677: case GRONSW: ! 4678: valid = 1; ! 4679: break; ! 4680: default: ! 4681: valid = 0; ! 4682: break; ! 4683: } ! 4684: ! 4685: return (valid); ! 4686: ! 4687: } ! 4688: ! 4689: int ! 4690: actoruse(short i) ! 4691: { ! 4692: ! 4693: spritetype *spr; ! 4694: ! 4695: spr = &sprite[i]; ! 4696: ! 4697: neartag(spr->x, ! 4698: spr->y, ! 4699: spr->z, ! 4700: spr->sectnum, ! 4701: spr->ang, ! 4702: &neartagsector, ! 4703: &neartagwall, ! 4704: &neartagsprite, ! 4705: &neartaghitdist, ! 4706: 1024, ! 4707: 3); ! 4708: ! 4709: if (neartagsector >= 0) { ! 4710: if (sector[neartagsector].hitag == 0) { ! 4711: if (sector[neartagsector].floorz != sector[neartagsector].ceilingz) { ! 4712: operatesector(neartagsector); ! 4713: return (1); ! 4714: } ! 4715: } ! 4716: } ! 4717: ! 4718: return (0); ! 4719: ! 4720: } ! 4721: ! 4722: ! 4723: ! 4724: ! 4725: void ! 4726: deaddude(short sn) ! 4727: { ! 4728: ! 4729: long j; ! 4730: ! 4731: j = insertsprite(sprite[sn].sectnum, DEAD); ! 4732: sprite[j].x = sprite[sn].x; ! 4733: sprite[j].y = sprite[sn].y; ! 4734: sprite[j].z = sprite[sn].z; ! 4735: sprite[j].cstat &= ~3; ! 4736: sprite[j].picnum = GONZOBSHDEAD; ! 4737: sprite[j].shade = 0; ! 4738: sprite[j].pal = 0; ! 4739: sprite[j].xrepeat = sprite[sn].xrepeat; ! 4740: sprite[j].yrepeat = sprite[sn].yrepeat; ! 4741: sprite[j].owner = 0; ! 4742: sprite[j].lotag = 0; ! 4743: sprite[j].hitag = 0; ! 4744: ! 4745: } ! 4746: ! 4747: int ! 4748: isActor(int spritenum) ! 4749: { ! 4750: switch (sprite[spritenum].picnum) { ! 4751: case KOBOLD: ! 4752: case KOBOLDATTACK: ! 4753: case DEVIL: ! 4754: case DEVILATTACK: ! 4755: case IMP: ! 4756: case IMPATTACK: ! 4757: case MINOTAUR: ! 4758: case MINOTAURATTACK: ! 4759: case SKELETON: ! 4760: case SKELETONATTACK: ! 4761: case GRONHAL: ! 4762: case GRONHALATTACK: ! 4763: case GRONMU: ! 4764: case GRONMUATTACK: ! 4765: case GRONSW: ! 4766: case GRONSWATTACK: ! 4767: case DEMON: ! 4768: case GUARDIAN: ! 4769: case GUARDIANATTACK: ! 4770: case WILLOW: ! 4771: case NEWGUYSTAND: ! 4772: case NEWGUYKNEE: ! 4773: case NEWGUY: ! 4774: case NEWGUYCAST: ! 4775: case NEWGUYBOW: ! 4776: case NEWGUYMACE: ! 4777: case NEWGUYPUNCH: ! 4778: case KURTSTAND: ! 4779: case KURTKNEE: ! 4780: case KURTAT: ! 4781: case KURTPUNCH: ! 4782: case KURTREADY: ! 4783: case GONZOCSW: ! 4784: case GONZOCSWAT: ! 4785: case GONZOCHMAT: ! 4786: case GONZOGSW: ! 4787: case GONZOGSWAT: ! 4788: case GONZOGHM: ! 4789: case GONZOGHMAT: ! 4790: case GONZOGSH: ! 4791: case GONZOGSHAT: ! 4792: case KATIE: ! 4793: case KATIEAT: ! 4794: return(1); ! 4795: } ! 4796: return(0); ! 4797: } ! 4798:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.