- added most of the remaining play code.

This commit is contained in:
Christoph Oelckers 2020-10-02 22:24:39 +02:00
parent 96637a25d1
commit f50b0f937d
30 changed files with 12813 additions and 82 deletions

View file

@ -121,6 +121,8 @@ enum
GAMEFLAG_PSEXHUMED = GAMEFLAG_POWERSLAVE | GAMEFLAG_EXHUMED, // the two games really are the same, except for the name and the publisher.
GAMEFLAG_WORLDTOUR = 0x00008000,
GAMEFLAG_DUKEDC = 0x00010000,
GAMEGLAG_WH = 0x00020000,
GAMEFLAG_WH2 = 0x00040000,
GAMEFLAGMASK = 0x0000FFFF, // flags allowed from grpinfo
// We still need these for the parsers.
@ -202,6 +204,11 @@ inline bool isShareware()
return g_gameType & GAMEFLAG_SHAREWARE;
}
inline bool isWh2()
{
return g_gameType & GAMEFLAG_WH2;
}
TArray<GrpEntry> GrpScan();
void S_PauseSound(bool notmusic, bool notsfx);
void S_ResumeSound(bool notsfx);

View file

@ -23,7 +23,19 @@ set( PCH_SOURCES
src/aiskully.cpp
src/aispider.cpp
src/aiwillow.cpp
src/items.cpp
src/names.cpp
src/potions.cpp
src/sndnames.cpp
src/spellbooks.cpp
src/weapons.cpp
src/wepdata.cpp
src/whani.cpp
src/whfx.cpp
src/whmap.cpp
src/whobj.cpp
src/whplr.cpp
src/whtag.cpp
)
add_game_library2( whaven )

View file

@ -35,30 +35,6 @@ void createSkullyAI();
void createSpiderAI();
void createWillowAI();
void premapDemon(short i);
void premapDevil(short i);
void premapDragon(short i);
void premapFatwitch(short i);
void premapFish(short i);
void premapFred(short i);
void premapGoblin(short i);
void premapGonzo(short i);
void premapGron(short i);
void premapGuardian(short i);
void premapImp(short i);
void premapJudy(short i);
void premapKatie(short i);
void premapKobold(short i);
void premapKurt(short i);
void premapMinotaur(short i);
void premapNewGuy(short i);
void premapRat(short i);
void premapSkeleton(short i);
void premapSkully(short i);
void premapSpider(short i);
void premapWillow(short i);
void initAI()
{
@ -75,7 +51,7 @@ void initAI()
* PATROL
*/
if (game.WH2)
if (isWh2())
createImpAI();
else
createGoblinAI();
@ -123,7 +99,7 @@ static void aiInit() {
killcnt++;
}
else if (pic == RAT) {
.premapRat(i);
premapRat(i);
}
else if (pic == FISH) {
premapFish(i);
@ -137,12 +113,12 @@ static void aiInit() {
case GOBLINSTAND:
case GOBLINCHILL:
killcnt++;
if (game.WH2 && spr.picnum == IMP) {
if (isWh2() && spr.picnum == IMP) {
premapImp(i);
break;
}
if (!game.WH2)
if (!isWh2())
premapGoblin(i);
break;
case DEVIL:
@ -251,7 +227,7 @@ void aiProcess() {
for (i = headspritestat[PATROL]; i >= 0; i = nextsprite) {
nextsprite = nextspritestat[i];
SPRITE spr = sprite[i];
SPRITE& spr = sprite[i];
short movestat = (short)movesprite((short)i, ((sintable[(spr.ang + 512) & 2047]) * TICSPERFRAME) << 3,
((sintable[spr.ang]) * TICSPERFRAME) << 3, 0, 4 << 8, 4 << 8, 0);
if (zr_florz > spr.z + (48 << 8)) {
@ -293,14 +269,14 @@ void aiProcess() {
for (i = headspritestat[CHASE]; i >= 0; i = nextsprite) {
nextsprite = nextspritestat[i];
SPRITE spr = sprite[i];
SPRITE& spr = sprite[i];
if (enemy[spr.detail] != null && enemy[spr.detail].chase != null)
enemy[spr.detail].chase.process(plr, i);
}
for (i = headspritestat[RESURECT]; i >= 0; i = nextsprite) {
nextsprite = nextspritestat[i];
SPRITE spr = sprite[i];
SPRITE& spr = sprite[i];
if (enemy[spr.detail] != null && enemy[spr.detail].resurect != null) {
enemy[spr.detail].resurect.process(plr, i);
}
@ -308,7 +284,7 @@ void aiProcess() {
for (i = headspritestat[FINDME]; i >= 0; i = nextsprite) {
nextsprite = nextspritestat[i];
SPRITE spr = sprite[i];
SPRITE& spr = sprite[i];
if (enemy[spr.detail] != null && enemy[spr.detail].search != null)
enemy[spr.detail].search.process(plr, i);
@ -316,7 +292,7 @@ void aiProcess() {
for (i = headspritestat[NUKED]; i >= 0; i = nextsprite) {
nextsprite = nextspritestat[i];
SPRITE spr = sprite[i];
SPRITE& spr = sprite[i];
if (spr.picnum == ZFIRE) {
spr.lotag -= TICSPERFRAME;
@ -331,14 +307,14 @@ void aiProcess() {
for (i = headspritestat[FROZEN]; i >= 0; i = nextsprite) {
nextsprite = nextspritestat[i];
SPRITE spr = sprite[i];
SPRITE& spr = sprite[i];
if (enemy[spr.detail] != null && enemy[spr.detail].frozen != null)
enemy[spr.detail].frozen.process(plr, i);
}
for (i = headspritestat[PAIN]; i >= 0; i = nextsprite) {
nextsprite = nextspritestat[i];
SPRITE spr = sprite[i];
SPRITE& spr = sprite[i];
if (enemy[spr.detail] != null && enemy[spr.detail].pain != null)
enemy[spr.detail].pain.process(plr, i);
@ -346,7 +322,7 @@ void aiProcess() {
for (i = headspritestat[FACE]; i >= 0; i = nextsprite) {
nextsprite = nextspritestat[i];
SPRITE spr = sprite[i];
SPRITE& spr = sprite[i];
if (enemy[spr.detail] != null && enemy[spr.detail].face != null)
enemy[spr.detail].face.process(plr, i);
@ -354,9 +330,9 @@ void aiProcess() {
for (i = headspritestat[ATTACK]; i >= 0; i = nextsprite) {
nextsprite = nextspritestat[i];
SPRITE spr = sprite[i];
SPRITE& spr = sprite[i];
if (game.WH2 && attacktheme == 0) {
if (isWh2() && attacktheme == 0) {
attacktheme = 1;
startsong((rand() % 2) + 2);
}
@ -367,7 +343,7 @@ void aiProcess() {
for (i = headspritestat[FLEE]; i >= 0; i = nextsprite) {
nextsprite = nextspritestat[i];
SPRITE spr = sprite[i];
SPRITE& spr = sprite[i];
if (enemy[spr.detail] != null && enemy[spr.detail].flee != null)
enemy[spr.detail].flee.process(plr, i);
@ -375,7 +351,7 @@ void aiProcess() {
for (i = headspritestat[CAST]; i >= 0; i = nextsprite) {
nextsprite = nextspritestat[i];
SPRITE spr = sprite[i];
SPRITE& spr = sprite[i];
if (enemy[spr.detail] != null && enemy[spr.detail].cast != null)
enemy[spr.detail].cast.process(plr, i);
@ -383,14 +359,14 @@ void aiProcess() {
for (i = headspritestat[DIE]; i >= 0; i = nextsprite) {
nextsprite = nextspritestat[i];
SPRITE spr = sprite[i];
SPRITE& spr = sprite[i];
if (enemy[spr.detail] != null && enemy[spr.detail].die != null)
enemy[spr.detail].die.process(plr, i);
}
for (i = headspritestat[SKIRMISH]; i >= 0; i = nextsprite) {
nextsprite = nextspritestat[i];
SPRITE spr = sprite[i];
SPRITE& spr = sprite[i];
if (enemy[spr.detail] != null && enemy[spr.detail].skirmish != null)
enemy[spr.detail].skirmish.process(plr, i);
@ -398,7 +374,7 @@ void aiProcess() {
for (i = headspritestat[STAND]; i >= 0; i = nextsprite) {
nextsprite = nextspritestat[i];
SPRITE spr = sprite[i];
SPRITE& spr = sprite[i];
if (enemy[spr.detail] != null && enemy[spr.detail].stand != null)
enemy[spr.detail].stand.process(plr, i);
@ -406,7 +382,7 @@ void aiProcess() {
for (i = headspritestat[CHILL]; i >= 0; i = nextsprite) {
nextsprite = nextspritestat[i];
SPRITE spr = sprite[i];
SPRITE& spr = sprite[i];
switch (spr.detail) {
case GOBLINTYPE:
goblinChill(plr, i);
@ -419,7 +395,7 @@ void aiProcess() {
for (i = headspritestat[DEAD]; i >= 0; i = nextsprite) {
nextsprite = nextspritestat[i];
SPRITE spr = sprite[i];
SPRITE& spr = sprite[i];
getzrange(spr.x, spr.y, spr.z - 1, spr.sectnum, (spr.clipdist) << 2, CLIPMASK0);
switch (checkfluid(i, zr_florhit)) {
@ -449,7 +425,7 @@ int aimove(short i) {
setsprite(i, ox, oy, oz);
if ((movestate & kHitTypeMask) != kHitWall) {
if (game.WH2)
if (isWh2())
sprite[i].z += WH2GRAVITYCONSTANT;
else
sprite[i].z += GRAVITYCONSTANT;
@ -463,7 +439,7 @@ int aimove(short i) {
}
int aifly(short i) {
SPRITE spr = sprite[i];
SPRITE& spr = sprite[i];
int movestate = movesprite(i, ((sintable[(sprite[i].ang + 512) & 2047]) * TICSPERFRAME) << 3,
((sintable[sprite[i].ang & 2047]) * TICSPERFRAME) << 3, 0, 4 << 8, 4 << 8, CLIFFCLIP);
@ -481,7 +457,7 @@ int aifly(short i) {
}
void aisearch(PLAYER& plr, short i, boolean fly) {
SPRITE spr = sprite[i];
SPRITE& spr = sprite[i];
spr.lotag -= TICSPERFRAME;
// if (plr.invisibletime > 0) {
@ -542,7 +518,7 @@ void aisearch(PLAYER& plr, short i, boolean fly) {
}
boolean checksector6(short i) {
SPRITE spr = sprite[i];
SPRITE& spr = sprite[i];
if (sector[spr.sectnum].floorz - (32 << 8) < sector[spr.sectnum].ceilingz) {
if (sector[spr.sectnum].lotag == 6)
newstatus(i, DIE);
@ -556,7 +532,7 @@ boolean checksector6(short i) {
}
int checkfluid(int i, int zr_florhit) {
SPRITE spr = sprite[i];
SPRITE& spr = sprite[i];
if (isValidSector(spr.sectnum) && (zr_florhit & kHitTypeMask) == kHitSector && (sector[spr.sectnum].floorpicnum == WATER
/* || sector[spr.sectnum].floorpicnum == LAVA2 */ || sector[spr.sectnum].floorpicnum == LAVA
|| sector[spr.sectnum].floorpicnum == SLIME || sector[spr.sectnum].floorpicnum == FLOORMIRROR
@ -577,7 +553,7 @@ int checkfluid(int i, int zr_florhit) {
}
void processfluid(int i, int zr_florhit, boolean fly) {
SPRITE spr = sprite[i];
SPRITE& spr = sprite[i];
switch (checkfluid(i, zr_florhit)) {
case TYPELAVA:
if (!fly) {
@ -601,7 +577,7 @@ void castspell(PLAYER& plr, int i) {
sprite[j].x = sprite[i].x;
sprite[j].y = sprite[i].y;
if (game.WH2 || sprite[i].picnum == SPAWNFIREBALL)
if (isWh2() || sprite[i].picnum == SPAWNFIREBALL)
sprite[j].z = sprite[i].z - ((tilesizy[sprite[i].picnum] >> 1) << 8);
else
sprite[j].z = getflorzofslope(sprite[i].sectnum, sprite[i].x, sprite[i].y) - ((tilesizy[sprite[i].picnum] >> 1) << 8);
@ -621,7 +597,7 @@ void castspell(PLAYER& plr, int i) {
int discrim = ksqrt((plr.x - sprite[j].x) * (plr.x - sprite[j].x) + (plr.y - sprite[j].y) * (plr.y - sprite[j].y));
if (discrim == 0)
discrim = 1;
if (game.WH2)
if (isWh2())
sprite[j].zvel = (short)(((plr.z + (8 << 8) - sprite[j].z) << 7) / discrim);
else
sprite[j].zvel = (short)(((plr.z + (48 << 8) - sprite[j].z) << 7) / discrim);
@ -703,7 +679,7 @@ void attack(PLAYER& plr, int i) {
}
int k = 5;
if (!game.WH2) {
if (!isWh2()) {
k = krand() % 100;
if (k > (plr.armortype << 3))
k = 15;
@ -726,7 +702,7 @@ void attack(PLAYER& plr, int i) {
if ((krand() % 2) != 0)
playsound_loc(S_BREATH1 + (krand() % 6), sprite[i].x, sprite[i].y);
if (game.WH2)
if (isWh2())
k = (krand() % 5) + 5;
else
k >>= 2;
@ -738,7 +714,7 @@ void attack(PLAYER& plr, int i) {
case DEVILTYPE:
playsound_loc(S_DEMONTHROW, sprite[i].x, sprite[i].y);
if (!game.WH2)
if (!isWh2())
k >>= 2;
break;
@ -748,7 +724,7 @@ void attack(PLAYER& plr, int i) {
playsound_loc(S_KOBOLDHIT, plr.x, plr.y);
playsound_loc(S_BREATH1 + (krand() % 6), plr.x, plr.y);
}
if (game.WH2)
if (isWh2())
k = (krand() % 5) + 5;
else
k >>= 2;
@ -763,7 +739,7 @@ void attack(PLAYER& plr, int i) {
k >>= 3;
break;
case IMPTYPE:
if (!game.WH2)
if (!isWh2())
break;
playsound_loc(S_RIP1 + (krand() % 3), sprite[i].x, sprite[i].y);
if ((krand() % 2) != 0) {
@ -779,7 +755,7 @@ void attack(PLAYER& plr, int i) {
}
break;
case GOBLINTYPE:
if (game.WH2)
if (isWh2())
break;
playsound_loc(S_GENSWING, sprite[i].x, sprite[i].y);
@ -836,7 +812,7 @@ void attack(PLAYER& plr, int i) {
if (sprite[i].picnum != GRONSWATTACK)
break;
if (game.WH2) {
if (isWh2()) {
k = (krand() % 20) + 5;
if (sprite[i].shade > 30) {
k += krand() % 10;
@ -855,7 +831,7 @@ void attack(PLAYER& plr, int i) {
playsound_loc(S_GENSWING, sprite[i].x, sprite[i].y);
if (krand() % 10 > 4)
playsound_loc(S_SWORD1 + (krand() % 6), sprite[i].x, sprite[i].y);
if (game.WH2)
if (isWh2())
k = (krand() % 25) + 5;
break;
}
@ -938,7 +914,7 @@ boolean checkdist(PLAYER& plr, int i) {
}
boolean checkdist(int i, int x, int y, int z) {
SPRITE spr = sprite[i];
SPRITE& spr = sprite[i];
int attackdist = 512;
int attackheight = 120;
@ -1032,7 +1008,7 @@ void monsterweapon(int i) {
case MINOTAURDEAD:
weap.xrepeat = 25;
weap.yrepeat = 20;
if (!game.WH2) {
if (!isWh2()) {
if (krand() % 100 > 50) {
weap.picnum = WEAPON4;
}
@ -1193,7 +1169,7 @@ PLAYER& aiGetPlayerTarget(short i) {
}
boolean actoruse(short i) {
SPRITE spr = sprite[i];
SPRITE& spr = sprite[i];
neartag(spr.x, spr.y, spr.z, spr.sectnum, spr.ang, neartag, 1024, 3);

View file

@ -115,6 +115,7 @@ enum EAIConst
};
extern Enemy enemy[MAXTYPES];
extern int checksight_ang;
void aiProcess();
int aimove(short i);
@ -135,6 +136,32 @@ void monsterweapon(int i);
PLAYER& aiGetPlayerTarget(short i);
boolean actoruse(short i);
void initAI();
void premapDemon(short i);
void premapDevil(short i);
void premapDragon(short i);
void premapFatwitch(short i);
void premapFish(short i);
void premapFred(short i);
void premapGoblin(short i);
void premapGonzo(short i);
void premapGron(short i);
void premapGuardian(short i);
void premapImp(short i);
void premapJudy(short i);
void premapKatie(short i);
void premapKobold(short i);
void premapKurt(short i);
void premapMinotaur(short i);
void premapNewGuy(short i);
void premapRat(short i);
void premapSkeleton(short i);
void premapSkully(short i);
void premapSpider(short i);
void premapWillow(short i);
inline int findplayer() {
return 0; // no multiplayer support, apparently...
}

View file

@ -215,7 +215,7 @@ static void frozen(PLAYER& plr, short i) {
static void nuked(PLAYER& plr, short i) {
SPRITE& spr = sprite[i];
if (game.WH2) {
if (isWh2()) {
chunksofmeat(plr, i, spr.x, spr.y, spr.z, spr.sectnum, spr.ang);
trailingsmoke(i, false);
newstatus((short)i, DIE);
@ -254,7 +254,7 @@ static void cast(PLAYER& plr, short i) {
void createDevilAI() {
auto &e = enemy[DEVILTYPE];
e.info.Init(game.WH2 ? 50 : 36, game.WH2 ? 50 : 36, 2048, 120, 0, 64, false, 50, 0);
e.info.Init(isWh2() ? 50 : 36, isWh2() ? 50 : 36, 2048, 120, 0, 64, false, 50, 0);
e.chase = chase;
e.die = die;
e.pain = pain;

View file

@ -181,7 +181,7 @@ static void search(PLAYER& plr, short i) {
static void nuked(PLAYER& plr, short i) {
SPRITE& spr = sprite[i];
if (game.WH2) {
if (isWh2()) {
chunksofmeat(plr, i, spr.x, spr.y, spr.z, spr.sectnum, spr.ang);
trailingsmoke(i, false);
newstatus((short)i, DIE);
@ -467,7 +467,7 @@ static void throwhalberd(int s) {
void createGronAI() {
auto& e = enemy[GRONTYPE];
e.info.Init(game.WH2 ? 35 : 30, game.WH2 ? 35 : 30, -1, 120, 0, 64, false, 300, 0);
e.info.Init(isWh2() ? 35 : 30, isWh2() ? 35 : 30, -1, 120, 0, 64, false, 300, 0);
e.info.getAttackDist = [](EnemyInfo& e, SPRITE& spr)
{
int out = e.attackdist;
@ -485,7 +485,7 @@ void createGronAI() {
e.info.getHealth = [](EnemyInfo& e, SPRITE& spr)
{
if (game.WH2) {
if (isWh2()) {
if (spr.picnum == GRONHAL)
return adjusthp(65);
if (spr.picnum == GRONMU)

View file

@ -73,7 +73,7 @@ static void chase(PLAYER& plr, short i) {
static void nuked(PLAYER& plr, short i) {
SPRITE& spr = sprite[i];
if (game.WH2) {
if (isWh2()) {
chunksofmeat(plr, i, spr.x, spr.y, spr.z, spr.sectnum, spr.ang);
trailingsmoke(i, false);
newstatus((short)i, DIE);
@ -227,7 +227,7 @@ static void cast(PLAYER& plr, short i) {
void createGuardianAI() {
auto& e = enemy[GUARDIANTYPE];
e.info.Init(game.WH2 ? 35 : 32, game.WH2 ? 35 : 32, 4096, 120, 0, 64, true, game.WH2 ? 100 : 200, 0);
e.info.Init(isWh2() ? 35 : 32, isWh2() ? 35 : 32, 4096, 120, 0, 64, true, isWh2() ? 100 : 200, 0);
e.chase = chase;
e.nuked = nuked;
e.attack = attack;

View file

@ -263,7 +263,7 @@ static void frozen(PLAYER& plr, short i) {
static void nuked(PLAYER& plr, short i) {
SPRITE& spr = sprite[i];
if (game.WH2) {
if (isWh2()) {
chunksofmeat(plr, i, spr.x, spr.y, spr.z, spr.sectnum, spr.ang);
trailingsmoke(i, false);
newstatus((short)i, DIE);
@ -333,7 +333,7 @@ static void checkexpl(PLAYER& plr, short i) {
void createKoboldAI() {
auto& e = enemy[KOBOLDTYPE];
e.info.Init(game.WH2 ? 60 : 54, game.WH2 ? 60 : 54, 1024, 120, 0, 64, false, 20, 0);
e.info.Init(isWh2() ? 60 : 54, isWh2() ? 60 : 54, 1024, 120, 0, 64, false, 20, 0);
e.chase = chase;
e.die = die;
e.pain = pain;

View file

@ -129,7 +129,7 @@ static void skirmish(PLAYER& plr, short i) {
static void nuked(PLAYER& plr, short i) {
SPRITE& spr = sprite[i];
if (game.WH2) {
if (isWh2()) {
chunksofmeat(plr, i, spr.x, spr.y, spr.z, spr.sectnum, spr.ang);
trailingsmoke(i, false);
newstatus((short)i, DIE);
@ -333,7 +333,7 @@ void createMinotaurAI() {
//picanm[MINOTAUR + 16] = 0;
auto& e = enemy[MINOTAURTYPE];
e.info.Init(64, 64, 1024 + 512, 120, 0, 64, false, game.WH2 ? 80 : 100, 0);
e.info.Init(64, 64, 1024 + 512, 120, 0, 64, false, isWh2() ? 80 : 100, 0);
e.chase = chase;
e.resurect = resurect;
e.skirmish = skirmish;

View file

@ -271,7 +271,7 @@ static void frozen(PLAYER& plr, short i) {
static void nuked(PLAYER& plr, short i) {
SPRITE& spr = sprite[i];
if (game.WH2) {
if (isWh2()) {
chunksofmeat(plr, i, spr.x, spr.y, spr.z, spr.sectnum, spr.ang);
trailingsmoke(i, false);
newstatus((short)i, DIE);
@ -354,7 +354,7 @@ static void checkexpl(PLAYER& plr, short i) {
void createSkeletonAI() {
auto& e = enemy[SKELETONTYPE];
e.info.Init(game.WH2 ? 35 : 24, game.WH2 ? 35 : 24, 1024, 120, 0, 64, false, game.WH2 ? 25 : 30, 0);
e.info.Init(isWh2() ? 35 : 24, isWh2() ? 35 : 24, 1024, 120, 0, 64, false, isWh2() ? 25 : 30, 0);
e.chase = chase;
e.die = die;
e.face = face;

View file

@ -84,7 +84,7 @@ static void attack(PLAYER& plr, short i) {
if (plr.shockme < 0)
if ((krand() & 1) != 0) {
plr.shockme = 120;
if (!game.WH2) {
if (!isWh2()) {
plr.lvl--;
switch (plr.lvl) {
case 1:
@ -230,7 +230,7 @@ static void die(PLAYER& plr, short i) {
static void nuked(PLAYER& plr, short i) {
SPRITE& spr = sprite[i];
if (game.WH2) {
if (isWh2()) {
chunksofmeat(plr, i, spr.x, spr.y, spr.z, spr.sectnum, spr.ang);
trailingsmoke(i, false);
newstatus((short)i, DIE);
@ -267,7 +267,7 @@ static void willowDrain(PLAYER& plr, short i) {
void createWillowAI() {
auto& e = enemy[WILLOWTYPE];
e.info.Init(32, 32, 512, 120, 0, 64, true, game.WH2 ? 5 : 400, 0);
e.info.Init(32, 32, 512, 120, 0, 64, true, isWh2() ? 5 : 400, 0);
e.chase = chase;
e.attack = attack;
e.face = face;

View file

@ -202,6 +202,10 @@ enum
TBLACKKEY = 15,
TGLASSKEY = 16,
TIVORYKEY = 17,
MAXWEAPONS = 10,
MAXPOTIONS = 5,
};
END_WH_NS

View file

@ -0,0 +1,20 @@
#pragma once
struct Item {
using Callback = void (*)(PLAYER &plr, short i);
int sizx, sizy;
boolean treasures, cflag;
Callback pickup;
void Init(int sizx, int sizy, boolean treasure, boolean cflag, Callback call)
{
this->sizx = sizx;
this->sizy = sizy;
this->treasures = treasure;
this->cflag = cflag;
this->callback = call;
}
};

File diff suppressed because it is too large Load diff

View file

@ -1,6 +1,8 @@
#include "ns.h"
#include "gamecontrol.h"
BEGIN_WH_NS
short KNIFEREADY;
short KNIFEATTACK;
short RFIST;
@ -167,7 +169,7 @@ short SHIELD;
void InitNames()
{
if(!game.WH2) {
if(!isWh2()) {
KNIFEREADY = 1249;
KNIFEATTACK = 1261;
RFIST = 1268;

View file

@ -83,8 +83,16 @@ struct PLAYER {
boolean noclip;
// no copy assignments for this one!
PLAYER() = default;
PLAYER(const PLAYER&) = delete;
PLAYER& operator=(const PLAYER&) = delete;
};
struct WEAPONINF {
int daweapontics;
int daweaponframe;
int currx;
int curry;
};
END_WH_NS

View file

@ -0,0 +1,193 @@
#include "ns.h"
#include "wh.h"
BEGIN_WH_NS
int potiontilenum;
void potiontext(PLAYER& plr) {
if( plr.potion[plr.currentpotion] > 0)
switch(plr.currentpotion) {
case 0:
showmessage("Health Potion", 240);
break;
case 1:
showmessage("Strength Potion", 240);
break;
case 2:
showmessage("Cure Poison Potion", 240);
break;
case 3:
showmessage("Resist Fire Potion", 240);
break;
case 4:
showmessage("Invisibility Potion", 240);
break;
}
}
void potionchange(int snum)
{
PLAYER& plr = player[snum];
int key = ((plr.pInput.bits & (15 << 16)) >> 16) - 1;
if(key != -1 && key < 7)
{
if(key == 5 || key == 6)
{
key = ( key == 5 ? -1 : 1 );
plr.currentpotion += key;
if(plr.currentpotion < 0)
plr.currentpotion = 4;
if(plr.currentpotion >= MAXPOTIONS)
plr.currentpotion = 0;
} else plr.currentpotion = key;
SND_Sound(S_BOTTLES);
potiontext(plr);
}
}
void usapotion(PLAYER& plr) {
if( plr.currentpotion == 0 && plr.health >= plr.maxhealth )
return;
if( plr.currentpotion == 2 && plr.poisoned == 0 )
return;
if( plr.potion[plr.currentpotion] <= 0)
return;
else
plr.potion[plr.currentpotion]--;
switch(plr.currentpotion) {
case 0: // health potion
if( plr.health+25 > plr.maxhealth) {
plr.health=0;
SND_Sound(S_DRINK);
addhealth(plr, plr.maxhealth);
}
else {
SND_Sound(S_DRINK);
addhealth(plr, 25);
}
startblueflash(10);
break;
case 1: // strength
plr.strongtime=3200;
SND_Sound(S_DRINK);
startredflash(10);
break;
case 2: // anti venom
SND_Sound(S_DRINK);
plr.poisoned=0;
plr.poisontime=0;
startwhiteflash(10);
showmessage("poison cured", 360);
addhealth(plr, 0);
break;
case 3: // fire resist
SND_Sound(S_DRINK);
plr.manatime=3200;
startwhiteflash(10);
if( lavasnd != -1 ) {
stopsound(lavasnd);
lavasnd = -1;
}
break;
case 4: // invisi
SND_Sound(S_DRINK);
plr.invisibletime=3200;
startgreenflash(10);
break;
}
}
boolean potionspace(PLAYER& plr, int vial) {
if(plr.potion[vial] > 9)
return false;
else
return true;
}
void updatepotion(PLAYER& plr, int vial) {
switch(vial) {
case HEALTHPOTION:
plr.potion[0]++;
break;
case STRENGTHPOTION:
plr.potion[1]++;
break;
case ARMORPOTION:
plr.potion[2]++;
break;
case FIREWALKPOTION:
plr.potion[3]++;
break;
case INVISIBLEPOTION:
plr.potion[4]++;
break;
}
}
void potionpic(PLAYER& plr, int currentpotion, int x, int y, int scale) {
int tilenum = SFLASKBLUE;
if( netgame )
return;
x = x + mulscale(200, scale, 16);
y = y - mulscale(94, scale, 16);
engine.rotatesprite(x<<16,y<<16,scale,0,SPOTIONBACKPIC,0, 0, 8 | 16, 0, 0, xdim, ydim-1);
engine.rotatesprite((x - mulscale(4, scale, 16))<<16,(y - mulscale(7, scale, 16))<<16,scale,0,SPOTIONARROW+currentpotion,0, 0, 8 | 16, 0, 0, xdim, ydim-1);
x += mulscale(4, scale, 16);
for(int i = 0; i < MAXPOTIONS; i++) {
if(plr.potion[i] < 0)
plr.potion[i] = 0;
if(plr.potion[i] > 0) {
switch(i) {
case 1:
tilenum=SFLASKGREEN;
break;
case 2:
tilenum=SFLASKOCHRE;
break;
case 3:
tilenum=SFLASKRED;
break;
case 4:
tilenum=SFLASKTAN;
break;
}
potiontilenum=tilenum;
engine.rotatesprite((x + mulscale(i*20, scale, 16))<<16,(y + mulscale(19, scale, 16))<<16,scale,0,potiontilenum,0, 0, 8 | 16, 0, 0, xdim, ydim-1);
char potionbuf[50];
Bitoa(plr.potion[i],potionbuf);
game.getFont(3).drawText(x + mulscale(7 +(i*20), scale, 16),y+mulscale(7, scale, 16), potionbuf, scale, 0, 0, TextAlign.Left, 0, false);
}
else
engine.rotatesprite((x + mulscale(i*20, scale, 16))<<16,(y + mulscale(19, scale, 16))<<16,scale,0,SFLASKBLACK,0, 0, 8 | 16, 0, 0, xdim, ydim-1);
}
}
void randompotion(int i) {
if( (engine.krand()%100) > 20)
return;
int j=engine.insertsprite(sprite[i].sectnum,(short)0);
sprite[j].x=sprite[i].x;
sprite[j].y=sprite[i].y;
sprite[j].z=sprite[i].z-(12<<8);
sprite[j].shade=-12;
sprite[j].pal=0;
sprite[j].cstat=0;
sprite[j].cstat&=~3;
sprite[j].xrepeat=64;
sprite[j].yrepeat=64;
int type = engine.krand()%4;
sprite[j].picnum = (short) (FLASKBLUE + type);
sprite[j].detail = (short) (FLASKBLUETYPE + type);
}

View file

@ -0,0 +1,301 @@
#include "ns.h"
#include "gamecontrol.h"
int S_THUNDER1 = 0;
int S_THUNDER2 = 1;
int S_THUNDER3 = 2;
int S_THUNDER4 = 3;
int S_WINDLOOP1 = 4;
int S_WAVELOOP1 = 5;
int S_LAVALOOP1 = 6;
int S_FIRELOOP1 = 7;
int S_STONELOOP1 = 8;
int S_BATSLOOP = 9;
int S_PLRWEAPON0 = 10;
int S_PLRWEAPON1 = 11;
int S_PLRWEAPON2 = 12;
int S_PLRWEAPON3 = 13;
int S_PLRWEAPON4 = 14;
int S_GOBLIN1 = 15;
int S_GOBLIN2 = 16;
int S_GOBLIN3 = 17;
int S_GOBPAIN1 = 18;
int S_GOBPAIN2 = 19;
int S_GOBDIE1 = 20;
int S_GOBDIE2 = 21;
int S_GOBDIE3 = 22;
int S_KSNARL1 = 23;
int S_KSNARL2 = 24;
int S_KSNARL3 = 25;
int S_KSNARL4 = 26;
int S_KPAIN1 = 27;
int S_KPAIN2 = 28;
int S_KDIE1 = 29;
int S_KDIE2 = 30;
int S_DEMON1 = 31;
int S_DEMON2 = 32;
int S_DEMON3 = 33;
int S_DEMON4 = 34;
int S_DEMON5 = 35;
int S_DEMONDIE1 = 36;
int S_DEMONDIE2 = 37;
int S_MSNARL1 = 38;
int S_MSNARL2 = 39;
int S_MSNARL3 = 40;
int S_MSNARL4 = 41;
int S_MPAIN1 = 42;
int S_MDEATH1 = 43;
int S_DRAGON1 = 44;
int S_DRAGON2 = 45;
int S_DRAGON3 = 46;
int S_RIP1 = 47;
int S_RIP2 = 48;
int S_RIP3 = 49;
int S_SKELHIT1 = 50;
int S_SKELHIT2 = 51;
int S_SKELETONDIE = 52;
int S_GUARDIAN1 = 53;
int S_GUARDIAN2 = 54;
int S_GUARDIANPAIN1 = 55;
int S_GUARDIANPAIN2 = 56;
int S_GUARDIANDIE = 57;
int S_WISP = 58;
int S_WISP2 = 59;
int S_SPLASH1 = 60;
int S_SPLASH2 = 61;
int S_SPLASH3 = 62;
int S_SPLASH4 = 63;
int S_SPLASH5 = 64;
int S_SPLASH6 = 65;
int S_WILLOWDIE = 66;
int S_FATWITCHDIE = 67;
int S_JUDY1 = 68;
int S_JUDY2 = 69;
int S_JUDY3 = 70;
int S_JUDY4 = 71;
int S_JUDYDIE = 72;
int S_SKULLWITCH1 = 73;
int S_SKULLWITCH2 = 74;
int S_SKULLWITCH3 = 75;
int S_SKULLWITCHDIE = 76;
int S_GRONDEATHA = 77;
int S_GRONDEATHB = 78;
int S_GRONDEATHC = 79;
int S_CHAIN1 = 80;
int S_FLAME1 = 81;
int S_GRONPAINA = 82;
int S_GRONPAINB = 83;
int S_GRONPAINC = 84;
int S_CLUNK = 85;
int S_DEMONTHROW = 86;
int S_WITCHTHROW = 87;
int S_DOOR1 = 88;
int S_DOOR2 = 89;
int S_DOOR3 = 90;
int S_CREAKDOOR1 = 91;
int S_CREAKDOOR2 = 92;
int S_CREAKDOOR3 = 93;
int S_STING1 = 94;
int S_STING2 = 95;
int S_POTION1 = 96;
int S_GENTHROW = 97;
int S_GENSWING = 98;
int S_ARROWHIT = 99;
int S_WALLHIT1 = 100;
int S_GONG = 101;
int S_SPELL1 = 102;
int S_FREEZE = 103;
int S_FREEZEDIE = 104;
int S_TRAP1 = 105;
int S_TRAP2 = 106;
int S_RATS1 = 107;
int S_RATS2 = 108;
int S_WINDLOOP2 = 109;
int S_BREATH1 = 110;
int S_BREATH2 = 111;
int S_PUSH1 = 112;
int S_PUSH2 = 113;
int S_PLRPAIN1 = 114;
int S_PLRPAIN2 = 115;
int S_GORE1 = 116;
int S_GORE2 = 117;
int S_GORE1A = 118;
int S_GORE1B = 119;
int S_DEADSTEP = 120;
int S_HEARTBEAT = 121;
int S_SOFTCHAINWALK = 122;
int S_SOFTCREAKWALK = 123;
int S_LOUDCHAINWALK = 124;
int S_GRATEWALK = 125;
int S_SCARYDUDE = 126;
int S_WATERY = 127;
int S_GLASSBREAK1 = 128;
int S_GLASSBREAK2 = 129;
int S_GLASSBREAK3 = 130;
int S_TREASURE1 = 131;
int S_SWORD1 = 132;
int S_SWORD2 = 133;
int S_SWORDCLINK1 = 134;
int S_SWORDCLINK2 = 135;
int S_SWORDCLINK3 = 136;
int S_SWORDCLINK4 = 137;
int S_SOCK1 = 138;
int S_SOCK2 = 139;
int S_SOCK3 = 140;
int S_SOCK4 = 141;
int S_KOBOLDHIT = 142;
int S_SPIDERBITE = 143;
int S_FIREBALL = 144;
int S_WOOD1 = 145;
int S_CHAINDOOR1 = 146;
int S_PULLCHAIN1 = 147;
int S_PICKUPAXE = 148;
int S_EXPLODE = 149;
int S_SKELSEE = 150;
int S_BARRELBREAK = 151;
int S_WARP = 152;
int S_PICKUPFLAG = 155;
int S_DROPFLAG = 156;
int S_LAUGH = 157;
int S_DRINK = 158;
int S_PAGE = 159;
int S_BOTTLES = 160;
int S_CRACKING = 161;
int S_PLRDIE1 = 162;
int S_FATLAUGH = 163;
void InitSoundNames()
{
if (isWh2()) {
S_WINDLOOP1 = 3;
S_WAVELOOP1 = 4;
S_LAVALOOP1 = 5;
S_FIRELOOP1 = 6;
S_STONELOOP1 = 7;
S_BATSLOOP = 8;
S_PLRWEAPON0 = 9;
S_PLRWEAPON1 = 10;
S_PLRWEAPON2 = 11;
S_PLRWEAPON3 = 12;
S_PLRWEAPON4 = 13;
S_KSNARL1 = 14;
S_KSNARL2 = 15;
S_KSNARL3 = 16;
S_KSNARL4 = 17;
S_KPAIN1 = 18;
S_KPAIN2 = 19;
S_KDIE1 = 20;
S_KDIE2 = 21;
S_DEMON1 = 22;
S_DEMON2 = 23;
S_DEMON3 = 24;
S_DEMON4 = 25;
S_DEMON5 = 26;
S_DEMONDIE1 = 27;
S_DEMONDIE2 = 28;
S_MSNARL1 = 29;
S_MSNARL2 = 30;
S_MSNARL3 = 31;
S_MSNARL4 = 32;
S_MPAIN1 = 33;
S_MDEATH1 = 34;
S_RIP1 = 35;
S_RIP2 = 36;
S_RIP3 = 37;
S_SKELHIT1 = 38;
S_SKELHIT2 = 39;
S_SKELETONDIE = 40;
S_SKELSEE = 41;
S_GUARDIAN1 = 42;
S_GUARDIAN2 = 43;
S_GUARDIANPAIN1 = 44;
S_GUARDIANPAIN2 = 45;
S_GUARDIANDIE = 46;
S_WISP = 47;
S_WISP2 = 48;
S_SPLASH1 = 49;
S_SPLASH2 = 50;
S_SPLASH3 = 51;
S_SPLASH4 = 52;
S_SPLASH5 = 53;
S_WILLOWDIE = 54;
S_JUDY1 = 55;
S_JUDYDIE = 56;
S_CHAIN1 = 57;
S_FLAME1 = 58;
S_CLUNK = 59;
S_DEMONTHROW = 60;
S_DOOR1 = 61;
S_DOOR2 = 62;
S_DOOR3 = 63;
S_CREAKDOOR1 = 64;
S_CREAKDOOR2 = 65;
S_CREAKDOOR3 = 66;
S_STING1 = 67;
S_STING2 = 68;
S_POTION1 = 69;
S_GENTHROW = 70;
S_GENSWING = 71;
S_ARROWHIT = 72;
S_WALLHIT1 = 73;
S_GONG = 74;
S_SPELL1 = 75;
S_FREEZE = 76;
S_FREEZEDIE = 77;
S_TRAP1 = 78;
S_TRAP2 = 79;
S_RATS1 = 80;
S_RATS2 = 81;
S_WINDLOOP2 = 82;
S_BREATH1 = 83;
S_BREATH2 = 84;
S_PUSH1 = 85;
S_PUSH2 = 86;
S_PLRPAIN1 = 87;
S_PLRPAIN2 = 88;
S_GORE1 = 89;
S_GORE2 = 90;
S_GORE1A = 91;
S_GORE1B = 92;
S_DEADSTEP = 93;
S_HEARTBEAT = 94;
S_SOFTCHAINWALK = 95;
S_SOFTCREAKWALK = 96;
S_LOUDCHAINWALK = 97;
S_SCARYDUDE = 98;
S_WATERY = 99;
S_GLASSBREAK1 = 100;
S_GLASSBREAK2 = 101;
S_GLASSBREAK3 = 102;
S_TREASURE1 = 103;
S_SWORD1 = 104;
S_SWORD2 = 105;
S_SWORDCLINK1 = 106;
S_SWORDCLINK2 = 107;
S_SWORDCLINK3 = 108;
S_SWORDCLINK4 = 109;
S_SOCK1 = 110;
S_SOCK2 = 111;
S_SOCK3 = 112;
S_SOCK4 = 113;
S_KOBOLDHIT = 114;
S_FIREBALL = 115;
S_PULLCHAIN1 = 116;
S_PICKUPAXE = 117;
S_EXPLODE = 118;
S_BARRELBREAK = 119;
S_WARP = 120;
S_PICKUPFLAG = 121;
S_DROPFLAG = 122;
S_LAUGH = 123;
S_DRINK = 124;
S_PAGE = 125;
S_BOTTLES = 126;
S_CRACKING = 127;
S_PLRDIE1 = 128;
S_GRONDEATHA = 136;
S_GRONDEATHB = 137;
S_GRONDEATHC = 138;
S_GRONPAINA = 142;
}
}

View file

@ -0,0 +1,203 @@
#include "ns.h"
BEGIN_WH_NS
extern int S_THUNDER1; //0;
extern int S_THUNDER2; //1;
extern int S_THUNDER3; //2;
extern int S_THUNDER4; //3;
extern int S_WINDLOOP1; //4;
extern int S_WAVELOOP1; //5;
extern int S_LAVALOOP1; //6;
extern int S_FIRELOOP1; //7;
extern int S_STONELOOP1; //8;
extern int S_BATSLOOP; //9;
extern int S_PLRWEAPON0; //10;
extern int S_PLRWEAPON1; //11;
extern int S_PLRWEAPON2; //12;
extern int S_PLRWEAPON3; //13;
extern int S_PLRWEAPON4; //14;
extern int S_GOBLIN1; //15;
extern int S_GOBLIN2; //16;
extern int S_GOBLIN3; //17;
extern int S_GOBPAIN1; //18;
extern int S_GOBPAIN2; //19;
extern int S_GOBDIE1; //20;
extern int S_GOBDIE2; //21;
extern int S_GOBDIE3; //22;
extern int S_KSNARL1; //23;
extern int S_KSNARL2; //24;
extern int S_KSNARL3; //25;
extern int S_KSNARL4; //26;
extern int S_KPAIN1; //27;
extern int S_KPAIN2; //28;
extern int S_KDIE1; //29;
extern int S_KDIE2; //30;
extern int S_DEMON1; //31;
extern int S_DEMON2; //32;
extern int S_DEMON3; //33;
extern int S_DEMON4; //34;
extern int S_DEMON5; //35;
extern int S_DEMONDIE1; //36;
extern int S_DEMONDIE2; //37;
extern int S_MSNARL1; //38;
extern int S_MSNARL2; //39;
extern int S_MSNARL3; //40;
extern int S_MSNARL4; //41;
extern int S_MPAIN1; //42;
extern int S_MDEATH1; //43;
extern int S_DRAGON1; //44;
extern int S_DRAGON2; //45;
extern int S_DRAGON3; //46;
extern int S_RIP1; //47;
extern int S_RIP2; //48;
extern int S_RIP3; //49;
extern int S_SKELHIT1; //50;
extern int S_SKELHIT2; //51;
extern int S_SKELETONDIE; //52;
extern int S_GUARDIAN1; //53;
extern int S_GUARDIAN2; //54;
extern int S_GUARDIANPAIN1; //55;
extern int S_GUARDIANPAIN2; //56;
extern int S_GUARDIANDIE; //57;
extern int S_WISP; //58;
extern int S_WISP2; //59;
extern int S_SPLASH1; //60;
extern int S_SPLASH2; //61;
extern int S_SPLASH3; //62;
extern int S_SPLASH4; //63;
extern int S_SPLASH5; //64;
extern int S_SPLASH6; //65;
extern int S_WILLOWDIE; //66;
extern int S_FATWITCHDIE; //67;
extern int S_JUDY1; //68;
extern int S_JUDY2; //69;
extern int S_JUDY3; //70;
extern int S_JUDY4; //71;
extern int S_JUDYDIE; //72;
extern int S_SKULLWITCH1; //73;
extern int S_SKULLWITCH2; //74;
extern int S_SKULLWITCH3; //75;
extern int S_SKULLWITCHDIE; //76;
extern int S_GRONDEATHA; //77;
extern int S_GRONDEATHB; //78;
extern int S_GRONDEATHC; //79;
extern int S_CHAIN1; //80;
extern int S_FLAME1; //81;
extern int S_GRONPAINA; //82;
extern int S_GRONPAINB; //83;
extern int S_GRONPAINC; //84;
extern int S_CLUNK; //85;
extern int S_DEMONTHROW; //86;
extern int S_WITCHTHROW; //87;
extern int S_DOOR1; //88;
extern int S_DOOR2; //89;
extern int S_DOOR3; //90;
extern int S_CREAKDOOR1; //91;
extern int S_CREAKDOOR2; //92;
extern int S_CREAKDOOR3; //93;
extern int S_STING1; //94;
extern int S_STING2; //95;
extern int S_POTION1; //96;
extern int S_GENTHROW; //97;
extern int S_GENSWING; //98;
extern int S_ARROWHIT; //99;
extern int S_WALLHIT1; //100;
extern int S_GONG; //101;
extern int S_SPELL1; //102;
extern int S_FREEZE; //103;
extern int S_FREEZEDIE; //104;
extern int S_TRAP1; //105;
extern int S_TRAP2; //106;
extern int S_RATS1; //107;
extern int S_RATS2; //108;
extern int S_WINDLOOP2; //109;
extern int S_BREATH1; //110;
extern int S_BREATH2; //111;
extern int S_PUSH1; //112;
extern int S_PUSH2; //113;
extern int S_PLRPAIN1; //114;
extern int S_PLRPAIN2; //115;
extern int S_GORE1; //116;
extern int S_GORE2; //117;
extern int S_GORE1A; //118;
extern int S_GORE1B; //119;
extern int S_DEADSTEP; //120;
extern int S_HEARTBEAT; //121;
extern int S_SOFTCHAINWALK; //122;
extern int S_SOFTCREAKWALK; //123;
extern int S_LOUDCHAINWALK; //124;
extern int S_GRATEWALK; //125;
extern int S_SCARYDUDE; //126;
extern int S_WATERY; //127;
extern int S_GLASSBREAK1; //128;
extern int S_GLASSBREAK2; //129;
extern int S_GLASSBREAK3; //130;
extern int S_TREASURE1; //131;
extern int S_SWORD1; //132;
extern int S_SWORD2; //133;
extern int S_SWORDCLINK1; //134;
extern int S_SWORDCLINK2; //135;
extern int S_SWORDCLINK3; //136;
extern int S_SWORDCLINK4; //137;
extern int S_SOCK1; //138;
extern int S_SOCK2; //139;
extern int S_SOCK3; //140;
extern int S_SOCK4; //141;
extern int S_KOBOLDHIT; //142;
extern int S_SPIDERBITE; //143;
extern int S_FIREBALL; //144;
extern int S_WOOD1; //145;
extern int S_CHAINDOOR1; //146;
extern int S_PULLCHAIN1; //147;
extern int S_PICKUPAXE; //148;
extern int S_EXPLODE; //149;
extern int S_SKELSEE; //150;
extern int S_BARRELBREAK; //151;
extern int S_WARP; //152;
extern int S_PICKUPFLAG; //155;
extern int S_DROPFLAG; //156;
extern int S_LAUGH; //157;
extern int S_DRINK; //158;
extern int S_PAGE; //159;
extern int S_BOTTLES; //160;
extern int S_CRACKING; //161;
extern int S_PLRDIE1; //162;
extern int S_FATLAUGH; //163;
enum WHSounds {
S_SPELL2 = 153,
S_THROWPIKE = 154,
// WH2 Sounds
S_AGM_ATTACK = 129,
S_AGM_PAIN1 = 130,
S_AGM_PAIN2 = 131,
S_AGM_PAIN3 = 132,
S_AGM_DIE1 = 133,
S_AGM_DIE2 = 134,
S_AGM_DIE3 = 135,
S_FIRESWING = 145,
S_FIREWEAPONLOOP = 146,
S_ENERGYWEAPONLOOP = 147,
S_ENERGYSWING = 148,
S_BIGGLASSBREAK1 = 149,
S_IMPGROWL1 = 152,
S_IMPGROWL2 = 153,
S_IMPGROWL3 = 154,
S_IMPDIE1 = 155,
S_IMPDIE2 = 156,
S_SWINGDOOR = 157,
S_NUKESPELL = 158,
S_DOORSPELL = 159,
S_FIRESPELL = 160,
S_GENERALMAGIC1 = 161,
S_GENERALMAGIC2 = 162,
S_GENERALMAGIC3 = 163,
S_GENERALMAGIC4 = 164,
};
END_WH_NS

View file

@ -0,0 +1,479 @@
#include "ns.h"
#include "wh.h"
BEGIN_WH_NS
void activatedaorb(PLAYER& plr) {
if (plr.orbammo[plr.currentorb] <= 0)
return;
switch (plr.currentorb) {
case 0: // SCARE
// shadowtime=1200+(plr.lvl*120);
break;
case 1: // NIGHT VISION
// nightglowtime=2400+(plr.lvl*600);
break;
case 2: // FREEZE
plr.orbactive[plr.currentorb] = -1;
break;
case 3: // MAGIC ARROW
plr.orbactive[plr.currentorb] = -1;
break;
case 4: // OPEN DOORS
plr.orbactive[plr.currentorb] = -1;
break;
case 5: // FLY
// plr.orbactive[currentorb]=3600+(plr.lvl*600);
break;
case 6: // FIREBALL
plr.orbactive[plr.currentorb] = -1;
break;
case 7: // NUKE
plr.orbactive[plr.currentorb] = -1;
break;
}
if (plr.orbammo[plr.currentorb] <= 0) {
plr.orb[plr.currentorb] = 0;
return;
} else
plr.orbammo[plr.currentorb]--;
plr.currweaponfired = 4;
plr.currweapontics = isWh2() ? wh2throwanimtics[plr.currentorb][0].daweapontics : throwanimtics[plr.currentorb][0].daweapontics;
}
void castaorb(PLAYER& plr) {
int k;
float daang;
switch (plr.currentorb) {
case 0: // SCARE
if (isWh2())
playsound_loc(S_GENERALMAGIC4, plr.x, plr.y);
plr.shadowtime = ((plr.lvl + 1) * 120) << 2;
break;
case 1: // NIGHTVISION
plr.nightglowtime = 3600 + (plr.lvl * 120);
break;
case 2: // FREEZE
if (isWh2())
playsound_loc(S_GENERALMAGIC3, plr.x, plr.y);
else
playsound_loc(S_SPELL1, plr.x, plr.y);
daang = plr.ang;
shootgun(plr, daang, 6);
break;
case 3: // MAGIC ARROW
if (isWh2()) {
lockon(plr,10,2);
playsound_loc(S_GENERALMAGIC2, plr.x, plr.y);
}
else {
daang = BClampAngle(plr.ang - 36);
for (k = 0; k < 10; k++) {
daang = BClampAngle(daang + (k << 1));
shootgun(plr, daang, 2);
}
playsound_loc(S_SPELL1, plr.x, plr.y);
}
break;
case 4: // OPEN DOORS
daang = plr.ang;
shootgun(plr, daang, 7);
if (isWh2())
playsound_loc(S_DOORSPELL, plr.x, plr.y);
else
playsound_loc(S_SPELL1, plr.x, plr.y);
break;
case 5: // FLY
plr.orbactive[plr.currentorb] = 3600 + (plr.lvl * 120);
if (isWh2())
playsound_loc(S_GENERALMAGIC1, plr.x, plr.y);
else
playsound_loc(S_SPELL1, plr.x, plr.y);
break;
case 6: // FIREBALL
if (isWh2()) {
lockon(plr,3,3);
playsound_loc(S_FIRESPELL, plr.x, plr.y);
}
else {
daang = plr.ang;
shootgun(plr, daang, 3);
playsound_loc(S_SPELL1, plr.x, plr.y);
}
break;
case 7: // NUKE
daang = plr.ang;
shootgun(plr, daang, 4);
if (isWh2())
playsound_loc(S_NUKESPELL, plr.x, plr.y);
else
playsound_loc(S_SPELL1, plr.x, plr.y);
break;
}
}
void spellswitch(PLAYER& plr, int j)
{
int i = plr.currentorb;
while(i >= 0 && i < MAXNUMORBS) {
i += j;
if(i == -1) i = MAXNUMORBS - 1;
else if(i == MAXNUMORBS) i = 0;
if(plr.spellbookflip != 0 || i == plr.currentorb)
break;
if (changebook(plr, i)) {
displayspelltext(plr);
plr.spelltime = 360;
break;
}
}
}
void bookprocess(int snum) {
PLAYER& plr = player[snum];
if (plr.currweaponanim == 0 && plr.currweaponflip == 0) {
int bits = plr.pInput.bits;
int spell = ((bits & (15 << 12)) >> 12) - 1;
if(spell != -1 && spell < 10)
{
if(spell != 9 && spell != 8) {
if (changebook(plr, spell)) {
displayspelltext(plr);
plr.spelltime = 360;
} else return;
} else
spellswitch(plr, spell == 9 ? -1 : 1);
plr.orbshot = 0;
}
}
for (int j = 0; j < MAXNUMORBS; j++) {
if (plr.orbactive[j] > -1) {
plr.orbactive[j] -= TICSPERFRAME;
}
}
}
boolean changebook(PLAYER& plr, int i) {
if(plr.orbammo[i] <= 0 || plr.currentorb == i)
return false;
plr.currentorb = i;
if (plr.spellbookflip == 0) {
plr.spellbook = 0;
plr.spellbooktics = 10;
plr.spellbookflip = 1;
SND_Sound(S_PAGE);
return true;
}
return false;
}
boolean lvlspellcheck(PLAYER& plr) {
if(isWh2()) return true;
switch (plr.currentorb) {
case 0:
case 1:
return true;
case 2:
if (plr.lvl > 1)
return true;
else
showmessage("must attain 2nd level", 360);
break;
case 3:
if (plr.lvl > 1)
return true;
else
showmessage("must attain 2nd level", 360);
break;
case 4:
if (plr.lvl > 2)
return true;
else
showmessage("must attain 3rd level", 360);
break;
case 5:
if (plr.lvl > 2)
return true;
else
showmessage("must attain 3rd level", 360);
break;
case 6:
if (plr.lvl > 3)
return true;
else
showmessage("must attain 4th level", 360);
break;
case 7:
if (plr.lvl > 4)
return true;
else
showmessage("must attain 5th level", 360);
break;
}
return false;
}
void speelbookprocess(PLAYER& plr) {
if (plr.spelltime > 0)
plr.spelltime -= TICSPERFRAME;
if (plr.spellbookflip == 1) {
plr.spellbooktics -= TICSPERFRAME;
if (plr.spellbooktics < 0)
plr.spellbook++;
if (plr.spellbook > 8)
plr.spellbook = 8;
if (plr.spellbook == 8)
plr.spellbookflip = 0;
}
}
void nukespell(PLAYER& plr, short j) {
if(sprite[j].detail != WILLOWTYPE && sprite[j].pal == 6) //don't nuke freezed enemies
return;
if (isWh2()) {
// dont nuke a shade
if (sprite[j].shade > 30)
return;
newstatus(j, NUKED);
sprite[j].pal = 0;
sprite[j].cstat |= 1;
sprite[j].cstat &= ~3;
sprite[j].shade = 6;
sprite[j].lotag = 360;
sprite[j].ang = (short) plr.ang;
sprite[j].hitag = 0;
addscore(plr, 150);
int k = engine.insertsprite(sprite[j].sectnum, NUKED);
sprite[k].lotag = 360;
sprite[k].xrepeat = 30;
sprite[k].yrepeat = 12;
sprite[k].picnum = ZFIRE;
sprite[k].pal = 0;
sprite[k].ang = sprite[j].ang;
sprite[k].x = sprite[j].x;
sprite[k].y = sprite[j].y;
sprite[k].z = sprite[j].z;
sprite[k].cstat = sprite[j].cstat;
return;
}
switch (sprite[j].detail) {
case WILLOWTYPE:
case SPIDERTYPE:
engine.deletesprite((short) j);
addscore(plr, 10);
break;
case KOBOLDTYPE:
sprite[j].picnum = KOBOLDCHAR;
newstatus(j, NUKED);
sprite[j].pal = 0;
sprite[j].cstat |= 1;
addscore(plr, 150);
break;
case DEVILTYPE:
sprite[j].picnum = DEVILCHAR;
newstatus(j, NUKED);
sprite[j].pal = 0;
sprite[j].cstat |= 1;
addscore(plr, 150);
break;
case GOBLINTYPE:
case IMPTYPE:
sprite[j].picnum = GOBLINCHAR;
newstatus(j, NUKED);
sprite[j].pal = 0;
sprite[j].cstat |= 1;
addscore(plr, 150);
break;
case MINOTAURTYPE:
sprite[j].picnum = MINOTAURCHAR;
newstatus(j, NUKED);
sprite[j].pal = 0;
sprite[j].cstat |= 1;
addscore(plr, 150);
break;
case SKELETONTYPE:
sprite[j].picnum = SKELETONCHAR;
newstatus(j, NUKED);
sprite[j].pal = 0;
sprite[j].cstat |= 1;
addscore(plr, 150);
break;
case GRONTYPE:
sprite[j].picnum = GRONCHAR;
newstatus(j, NUKED);
sprite[j].pal = 0;
sprite[j].cstat |= 1;
addscore(plr, 150);
break;
case DRAGONTYPE:
sprite[j].picnum = DRAGONCHAR;
newstatus(j, NUKED);
sprite[j].pal = 0;
sprite[j].cstat |= 1;
addscore(plr, 150);
break;
case GUARDIANTYPE:
sprite[j].picnum = GUARDIANCHAR;
newstatus(j, NUKED);
sprite[j].pal = 0;
sprite[j].cstat |= 1;
addscore(plr, 150);
break;
case FATWITCHTYPE:
sprite[j].picnum = FATWITCHCHAR;
newstatus(j, NUKED);
sprite[j].pal = 0;
sprite[j].cstat |= 1;
addscore(plr, 150);
break;
case SKULLYTYPE:
sprite[j].picnum = SKULLYCHAR;
newstatus(j, NUKED);
sprite[j].pal = 0;
sprite[j].cstat |= 1;
addscore(plr, 150);
break;
case JUDYTYPE:
if (mapon < 24) {
sprite[j].picnum = JUDYCHAR;
newstatus(j, NUKED);
sprite[j].pal = 0;
sprite[j].cstat |= 1;
addscore(plr, 150);
}
break;
}
}
void medusa(PLAYER& plr, short j) {
if(sprite[j].hitag <= 0) //don't freeze dead enemies
return;
newstatus(j, FROZEN);
int pic = sprite[j].picnum;
switch (sprite[j].detail) {
case NEWGUYTYPE:
sprite[j].picnum = NEWGUYPAIN;
break;
case KURTTYPE:
sprite[j].picnum = GONZOCSWPAIN;
break;
case GONZOTYPE:
if(pic == GONZOCSW || pic == GONZOCSWAT)
sprite[j].picnum = GONZOCSWPAIN;
else if(pic == GONZOGSW || pic == GONZOGSWAT)
sprite[j].picnum = GONZOGSWPAIN;
else if(pic == GONZOGHM || pic == GONZOGHMAT
|| pic == GONZOGSH || pic == GONZOGSHAT)
sprite[j].picnum = GONZOGHMPAIN;
break;
case KATIETYPE:
sprite[j].picnum = KATIEPAIN;
break;
case KOBOLDTYPE:
sprite[j].picnum = KOBOLDDIE;
break;
case DEVILTYPE:
sprite[j].picnum = DEVILDIE;
break;
case FREDTYPE:
sprite[j].picnum = FREDDIE;
break;
case GOBLINTYPE:
case IMPTYPE:
if(isWh2()) sprite[j].picnum = IMPDIE;
else sprite[j].picnum = GOBLINDIE;
break;
case MINOTAURTYPE:
sprite[j].picnum = MINOTAURDIE;
break;
case SPIDERTYPE:
sprite[j].picnum = SPIDERDIE;
break;
case SKELETONTYPE:
sprite[j].picnum = SKELETONDIE;
break;
case GRONTYPE:
if(pic == GRONHAL || pic == GRONHALATTACK)
sprite[j].picnum = (short) GRONHALDIE;
else if(pic == GRONMU || pic == GRONMUATTACK)
sprite[j].picnum = (short) GRONMUDIE;
else if(pic == GRONSW || pic == GRONSWATTACK)
sprite[j].picnum = (short) GRONSWDIE;
break;
}
sprite[j].pal = 6;
sprite[j].cstat |= 1;
addscore(plr, 100);
}
void displayspelltext(PLAYER& plr) {
switch (plr.currentorb) {
case 0:
showmessage("scare spell", 360);
break;
case 1:
showmessage("night vision spell", 360);
break;
case 2:
showmessage("freeze spell", 360);
break;
case 3:
showmessage("magic arrow spell", 360);
break;
case 4:
showmessage("open door spell", 360);
break;
case 5:
showmessage("fly spell", 360);
break;
case 6:
showmessage("fireball spell", 360);
break;
case 7:
showmessage("nuke spell", 360);
break;
}
}
void orbpic(PLAYER& plr, int currentorb) {
if (plr.orbammo[currentorb] < 0)
plr.orbammo[currentorb] = 0;
Bitoa(plr.orbammo[currentorb], tempchar);
int y = 382;
if (currentorb == 2)
y = 381;
if (currentorb == 3)
y = 383;
if (currentorb == 6)
y = 383;
if (currentorb == 7)
y = 380;
int spellbookpage = sspellbookanim[currentorb][8].daweaponframe;
overwritesprite(121 << 1, y, spellbookpage, 0, 0, 0);
game.getFont(4).drawText(126 << 1,439, tempchar, 0, 0, TextAlign.Left, 0, false);
}
END_WH_NS

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,699 @@
#include "ns.h"
#include "wh.h"
BEGIN_WH_NS
const WEAPONINF sspellbookanim[MAXNUMORBS][9] =
{
// SCARE
{{8, SSPELLBOOK8, 121, 389}, {8, SSPELLBOOK8 + 1, 121, 377},
{8, SSPELLBOOK8 + 2, 121, 383}, {8, SSPELLBOOK8 + 3, 121, 385},
{8, SSPELLBOOK8 + 4, 121, 389}, {8, SSPELLBOOK8 + 5, 121, 387},
{8, SSPELLBOOK8 + 6, 121, 389}, {8, SSPELLBOOK8 + 7, 121, 389},
{8, SSPELLBOOK8 + 7, 121, 389}
},
// NIGHT VISION
{{8, SSPELLBOOK6, 121, 389}, {8, SSPELLBOOK6 + 1, 121, 377},
{8, SSPELLBOOK6 + 2, 121, 383}, {8, SSPELLBOOK6 + 3, 121, 385},
{8, SSPELLBOOK6 + 4, 121, 389}, {8, SSPELLBOOK6 + 5, 121, 387},
{8, SSPELLBOOK6 + 6, 121, 389}, {8, SSPELLBOOK6 + 7, 121, 389},
{8, SSPELLBOOK6 + 7, 121, 389}
},
// FREEZE
{{8, SSPELLBOOK3, 121, 389}, {8, SSPELLBOOK3 + 1, 121, 377},
{8, SSPELLBOOK3 + 2, 121, 383}, {8, SSPELLBOOK3 + 3, 121, 385},
{8, SSPELLBOOK3 + 4, 121, 389}, {8, SSPELLBOOK3 + 5, 120, 387},
{8, SSPELLBOOK3 + 6, 120, 389}, {8, SSPELLBOOK3 + 7, 120, 389},
{8, SSPELLBOOK3 + 7, 121, 389}
},
// MAGIC ARROW
{{8, SSPELLBOOKBLANK, 121, 389}, {8, SSPELLBOOKBLANK + 1, 121, 377},
{8, SSPELLBOOKBLANK + 2, 121, 383}, {8, SSPELLBOOKBLANK + 3, 121, 385},
{8, SSPELLBOOKBLANK + 4, 121, 389}, {8, SSPELLBOOKBLANK + 5, 121, 387},
{8, SSPELLBOOKBLANK + 6, 120, 389}, {8, SSPELLBOOKBLANK + 7, 121, 389},
{8, SSPELLBOOKBLANK + 7, 122, 389}
},
// OPEN DOORS
{{8, SSPELLBOOK7, 121, 389}, {8, SSPELLBOOK7 + 1, 121, 377},
{8, SSPELLBOOK7 + 2, 121, 383}, {8, SSPELLBOOK7 + 3, 121, 385},
{8, SSPELLBOOK7 + 4, 121, 389}, {8, SSPELLBOOK7 + 5, 121, 387},
{8, SSPELLBOOK7 + 6, 121, 389}, {8, SSPELLBOOK7 + 7, 121, 389},
{8, SSPELLBOOK7 + 7, 121, 389}
},
// FLY
{{8, SSPELLBOOK2, 121, 389}, {8, SSPELLBOOK2 + 1, 121, 377},
{8, SSPELLBOOK2 + 2, 121, 383}, {8, SSPELLBOOK2 + 3, 121, 385},
{8, SSPELLBOOK2 + 4, 121, 389}, {8, SSPELLBOOK2 + 5, 121, 387},
{8, SSPELLBOOK2 + 6, 121, 389}, {8, SSPELLBOOK2 + 7, 121, 389},
{8, SSPELLBOOK2 + 7, 121, 389}
},
// FIRE BALL
{{8, SSPELLBOOK4, 121, 389}, {8, SSPELLBOOK4 + 1, 121, 377},
{8, SSPELLBOOK4 + 2, 121, 383}, {8, SSPELLBOOK4 + 3, 121, 385},
{8, SSPELLBOOK4 + 4, 121, 389}, {8, SSPELLBOOK4 + 5, 121, 387},
{8, SSPELLBOOK4 + 6, 121, 389}, {8, SSPELLBOOK4 + 6, 121, 389},
{8, SSPELLBOOK4 + 6, 121, 389}
},
// NUKE!
{{8, SSPELLBOOK5, 121, 389}, {8, SSPELLBOOK5 + 1, 121, 377},
{8, SSPELLBOOK5 + 2, 121, 383}, {8, SSPELLBOOK5 + 3, 121, 385},
{8, SSPELLBOOK5 + 4, 121, 389}, {8, SSPELLBOOK5 + 5, 121, 387},
{8, SSPELLBOOK5 + 6, 121, 389}, {8, SSPELLBOOK5 + 6, 121, 389},
{8, SSPELLBOOK5 + 6, 121, 389}
}
};
const WEAPONINF spikeanimtics[5] =
{ {10, DIESPIKE, 136, 145},
{10, DIESPIKE + 1, 136, 124},
{10, DIESPIKE + 2, 136, 100},
{10, DIESPIKE + 3, 136, 70},
{10, DIESPIKE + 4, 136, 50} };
const WEAPONINF wh2throwanimtics[MAXNUMORBS][MAXFRAMES + 1] =
{
// MUTWOHANDS - scare spell
{{1, EMPTY, 127, 170}, {10, MUTWOHANDS + 1, 0, 128}, {10, MUTWOHANDS + 2, 0, 93},
{10, MUTWOHANDS + 3, 0, 83}, {10, MUTWOHANDS + 4, 0, 72}, {10, MUTWOHANDS + 5, 0, 83},
{10, MUTWOHANDS + 6, 10, 96}, {10, MUTWOHANDS + 7, 43, 109}, {10, MUTWOHANDS + 8, 69, 113},
{10, MUTWOHANDS + 9, 65, 115}, {10, MUTWOHANDS + 10, 64, 117}, {10, MUTWOHANDS + 11, 63, 117},
{1, EMPTY, 127, 170}
},
// MUTWOHANDS - night vision
{{10, ZFIREBALL, 0, 177}, {10, ZFIREBALL + 1, 0, 137}, {10, ZFIREBALL + 2, 48, 82},
{10, ZFIREBALL + 3, 127, 41}, {10, ZFIREBALL + 4, 210, 9}, {10, ZFIREBALL + 5, 284, 26},
{10, ZFIREBALL + 6, 213, 63}, {10, ZFIREBALL + 7, 147, 99}, {10, ZFIREBALL + 8, 91, 136},
{10, ZFIREBALL + 9, 46, 183}, {1, EMPTY, 127, 170}, {1, EMPTY, 127, 170},
{1, EMPTY, 127, 170}
},
// MUTWOHANDS - freeze
{{1, EMPTY, 127, 170}, {10, ZFREEZE + 1, 0, 51}, {10, ZFREEZE + 2, 0, 71},
{10, ZFREEZE + 3, 4, 85}, {10, ZFREEZE + 4, 32, 78}, {10, ZFREEZE + 5, 51, 80},
{10, ZFREEZE + 6, 50, 80}, {10, ZFREEZE + 7, 49, 89}, {10, ZFREEZE + 8, 49, 89},
{10, ZFREEZE + 9, 49, 98}, {10, ZFREEZE + 10, 47, 105}, {10, ZFREEZE + 11, 48, 121},
{1, EMPTY, 127, 170}
},
// MUTWOHANDS - magic arrow
{{1, EMPTY, 127, 170}, {10, MUTWOHANDS + 1, 0, 128}, {10, MUTWOHANDS + 2, 0, 93},
{10, MUTWOHANDS + 3, 0, 83}, {10, MUTWOHANDS + 4, 0, 72}, {10, MUTWOHANDS + 5, 0, 83},
{10, MUTWOHANDS + 6, 10, 96}, {10, MUTWOHANDS + 7, 43, 109}, {10, MUTWOHANDS + 8, 69, 113},
{10, MUTWOHANDS + 9, 65, 115}, {10, MUTWOHANDS + 10, 64, 117}, {10, MUTWOHANDS + 11, 63, 117},
{1, EMPTY, 127, 170}
},
// MUTWOHANDS - open door
{{15, MUTWOHANDS, 19, 155}, {15, MUTWOHANDS + 1, 0, 128}, {15, MUTWOHANDS + 2, 0, 93},
{15, MUTWOHANDS + 3, 0, 83}, {15, MUTWOHANDS + 4, 0, 72}, {15, MUTWOHANDS + 5, 0, 83},
{15, MUTWOHANDS + 6, 10, 96}, {15, MUTWOHANDS + 7, 43, 109}, {15, MUTWOHANDS + 8, 69, 113},
{15, MUTWOHANDS + 9, 65, 115}, {15, MUTWOHANDS + 10, 64, 117}, {15, MUTWOHANDS + 11, 63, 117},
{1, EMPTY, 127, 170}
},
// MUMEDUSA - fly
{{10, ZLIGHT, 0, 177}, {10, ZLIGHT + 1, 0, 137}, {10, ZLIGHT + 2, 48, 82},
{10, ZLIGHT + 3, 127, 41}, {10, ZLIGHT + 4, 210, 9}, {10, ZLIGHT + 5, 284, 26},
{10, ZLIGHT + 6, 213, 63}, {10, ZLIGHT + 7, 147, 99}, {10, ZLIGHT + 8, 91, 136},
{10, ZLIGHT + 9, 46, 183}, {1, EMPTY, 127, 170}, {1, EMPTY, 127, 170},
{1, EMPTY, 127, 170}
},
// MUTWOHANDS - fireball
{{1, EMPTY, 127, 170}, {10, ZFIREBALL + 1, 0, 137}, {10, ZFIREBALL + 2, 48, 82},
{10, ZFIREBALL + 3, 127, 41}, {10, ZFIREBALL + 4, 210, 9}, {10, ZFIREBALL + 5, 284, 26},
{10, ZFIREBALL + 6, 213, 63}, {10, ZFIREBALL + 7, 147, 99}, {10, ZFIREBALL + 8, 91, 136},
{10, ZFIREBALL + 9, 46, 183}, {1, EMPTY, 127, 170}, {1, EMPTY, 127, 170},
{1, EMPTY, 127, 170}
},
// MUTWOHANDS - nuke
{{1, EMPTY, 127, 170}, {10, MUTWOHANDS + 1, 0, 128}, {10, MUTWOHANDS + 2, 0, 93},
{10, MUTWOHANDS + 3, 0, 83}, {10, MUTWOHANDS + 4, 0, 72}, {10, MUTWOHANDS + 5, 0, 83},
{10, MUTWOHANDS + 6, 10, 96}, {10, MUTWOHANDS + 7, 43, 109}, {10, MUTWOHANDS + 8, 69, 113},
{10, MUTWOHANDS + 9, 65, 115}, {10, MUTWOHANDS + 10, 64, 117}, {10, MUTWOHANDS + 11, 63, 117},
{1, EMPTY, 127, 170}
}
};
const WEAPONINF throwanimtics[MAXNUMORBS][MAXFRAMES + 1] =
{
// MUTWOHANDS
{ {10,MUTWOHANDS,19,155},{10,MUTWOHANDS + 1,0,128},{10,MUTWOHANDS + 2,0,93},
{10,MUTWOHANDS + 3,0,83},{10,MUTWOHANDS + 4,0,72},{10,MUTWOHANDS + 5,0,83},
{10,MUTWOHANDS + 6,10,96},{10,MUTWOHANDS + 7,43,109},{10,MUTWOHANDS + 8,69,113},
{10,MUTWOHANDS + 9,65,115},{10,MUTWOHANDS + 10,64,117},{10,MUTWOHANDS + 11,63,117},
{1,NULL,127,170}
},
// MUMEDUSA
{ {10,MUMEDUSA,0,177},{10,MUMEDUSA + 1,0,137},{10,MUMEDUSA + 2,48,82},
{10,MUMEDUSA + 3,127,41},{10,MUMEDUSA + 4,210,9},{10,MUMEDUSA + 5,284,26},
{10,MUMEDUSA + 6,213,63},{10,MUMEDUSA + 7,147,99},{10,MUMEDUSA + 8,91,136},
{10,MUMEDUSA + 9,46,183},{1,NULL,127,170},{1,NULL,127,170},
{1,NULL,127,170}
},
// BMUTWOHANDS
{ {10,MUTWOHANDS,19,155},{10,MUTWOHANDS + 1,0,128},{10,MUTWOHANDS + 2,0,93},
{10,MUTWOHANDS + 3,0,83},{10,BMUTWOHANDS,0,74},{10,BMUTWOHANDS + 1,0,97},
{10,BMUTWOHANDS + 2,10,109},{10,BMUTWOHANDS + 3,43,113},{10,BMUTWOHANDS + 4,69,115},
{10,BMUTWOHANDS + 5,65,117},{10,BMUTWOHANDS + 6,64,117},{10,BMUTWOHANDS + 7,63,117},
{1,NULL,127,170}
},
// MUTWOHANDS
{ {10,MUTWOHANDS,19,155},{10,MUTWOHANDS + 1,0,128},{10,MUTWOHANDS + 2,0,93},
{10,MUTWOHANDS + 3,0,83},{10,MUTWOHANDS + 4,0,72},{10,MUTWOHANDS + 5,0,83},
{10,MUTWOHANDS + 6,10,96},{10,MUTWOHANDS + 7,43,109},{10,MUTWOHANDS + 8,69,113},
{10,MUTWOHANDS + 9,65,115},{10,MUTWOHANDS + 10,64,117},{10,MUTWOHANDS + 11,63,117},
{1,NULL,127,170}
},
// MUTWOHANDS
{ {15,MUTWOHANDS,19,155},{15,MUTWOHANDS + 1,0,128},{15,MUTWOHANDS + 2,0,93},
{15,MUTWOHANDS + 3,0,83},{15,MUTWOHANDS + 4,0,72},{15,MUTWOHANDS + 5,0,83},
{15,MUTWOHANDS + 6,10,96},{15,MUTWOHANDS + 7,43,109},{15,MUTWOHANDS + 8,69,113},
{15,MUTWOHANDS + 9,65,115},{15,MUTWOHANDS + 10,64,117},{15,MUTWOHANDS + 11,63,117},
{1,NULL,127,170}
},
// MUMEDUSA
{ {10,MUMEDUSA,0,177},{10,MUMEDUSA + 1,0,137},{10,MUMEDUSA + 2,48,82},
{10,MUMEDUSA + 3,127,41},{10,MUMEDUSA + 4,210,9},{10,MUMEDUSA + 5,284,26},
{10,MUMEDUSA + 6,213,63},{10,MUMEDUSA + 7,147,99},{10,MUMEDUSA + 8,91,136},
{10,MUMEDUSA + 9,46,183},{1,NULL,127,170},{1,NULL,127,170},
{1,NULL,127,170}
},
// MUTWOHANDS
{ {10,MUTWOHANDS,19,155},{10,MUTWOHANDS + 1,0,128},{10,MUTWOHANDS + 2,0,93},
{10,MUTWOHANDS + 3,0,83},{10,MUTWOHANDS + 4,0,72},{10,MUTWOHANDS + 5,0,83},
{10,MUTWOHANDS + 6,10,96},{10,MUTWOHANDS + 7,43,109},{10,MUTWOHANDS + 8,69,113},
{10,MUTWOHANDS + 9,65,115},{10,MUTWOHANDS + 10,64,117},{10,MUTWOHANDS + 11,63,117},
{1,NULL,127,170}
},
// MUTWOHANDS
{ {10,MUTWOHANDS,19,155},{10,MUTWOHANDS + 1,0,128},{10,MUTWOHANDS + 2,0,93},
{10,MUTWOHANDS + 3,0,83},{10,MUTWOHANDS + 4,0,72},{10,MUTWOHANDS + 5,0,83},
{10,MUTWOHANDS + 6,10,96},{10,MUTWOHANDS + 7,43,109},{10,MUTWOHANDS + 8,69,113},
{10,MUTWOHANDS + 9,65,115},{10,MUTWOHANDS + 10,64,117},{10,MUTWOHANDS + 11,63,117},
{1,NULL,127,170}
}
};
const WEAPONINF cockanimtics[MAXFRAMES + 1] =
{
{24,NULL,10,10},
{12,BOWREADYEND + 1,101,115},{12,BOWREADYEND + 2,112,0},
{12,BOWREADYEND + 3,115,0},{12,BOWREADYEND + 4,75,13}
};
const WEAPONINF zcockanimtics[MAXFRAMES + 1] =
{
{24, EMPTY, 10, 10},
{12, BOWREADYEND + 1, 101, 115}, {12, BOWREADYEND + 2, 112, 0},
{12, BOWREADYEND + 3, 115, 0}, {12, ZBOWWALK, 75, 13}
};
//SCOTT
const WEAPONINF zreadyanimtics[MAXWEAPONS][MAXFRAMES + 1] =
{
// FIST
{{10, RFIST, 216, 180}, {10, RFIST, 216, 170}, {10, RFIST, 216, 160},
{10, RFIST, 216, 150}, {10, RFIST, 216, 140}, {10, RFIST, 216, 130},
{10, RFIST, 216, 124}, {1, RFIST, 216, 124}, {1, RFIST, 216, 124},
{1, RFIST, 216, 122}, {1, RFIST, 216, 122}, {1, RFIST, 216, 122},
{1, EMPTY, 147, 76}
},
// ZKNIFE
{{10, ZKNIFEREADY, 69, 171}, {10, ZKNIFEREADY + 1, 11, 146}, {10, ZKNIFEREADY + 2, 25, 146},
{10, ZKNIFEREADY + 3, 35, 158}, {10, ZKNIFEREADY + 4, 38, 158}, {10, ZKNIFEREADY + 5, 16, 157},
{10, ZKNIFEREADY + 6, 37, 102}, {10, ZKNIFEREADY + 7, 239, 63}, {10, ZKNIFEREADY + 8, 214, 85},
{10, ZKNIFEREADY + 9, 206, 110}, {10, ZKNIFEREADY + 10, 217, 108}, {10, ZKNIFEREADY + 11, 204, 95},
{1, EMPTY, 147, 76}
},
// ZSHORTREADY
{{12, ZSHORTREADY, 79, 169}, {12, ZSHORTREADY + 1, 95, 115}, {12, ZSHORTREADY + 2, 94, 93},
{12, ZSHORTREADY + 3, 156, 77}, {12, ZSHORTREADY + 4, 218, 64}, {12, ZSHORTREADY + 5, 224, 57},
{8, ZSHORTREADY + 6, 251, 54}, {1, ZSHORTREADY + 7, 243, 92}, {1, ZSHORTREADY + 7, 243, 92},
{1, ZSHORTREADY + 7, 243, 92}, {1, ZSHORTREADY + 7, 243, 92}, {1, ZSHORTREADY + 7, 243, 92},
{1, EMPTY, 147, 76}
},
// ZSTARATTACK
{{6, ZSTARATTACK, 194, 195}, {6, ZSTARATTACK, 194, 185}, {6, ZSTARATTACK, 194, 175},
{6, ZSTARATTACK, 194, 165}, {6, ZSTARATTACK, 194, 155}, {6, ZSTARATTACK, 194, 145},
{6, ZSTARATTACK, 194, 135}, {6, ZSTARATTACK, 194, 125}, {6, ZSTARATTACK, 194, 115},
{6, ZSTARATTACK, 194, 105}, {6, ZSTARATTACK, 194, 95}, {1, ZSTARATTACK, 194, 85},
{1, EMPTY, 147, 76}
},
// SWORD
{{10, SWORDPULL, 58, 160}, {10, SWORDPULL + 1, 81, 111}, {10, SWORDPULL + 2, 19, 88},
{10, SWORDPULL + 3, 0, 93}, {10, SWORDPULL + 4, 104, 0}, {10, SWORDPULL + 5, 169, 0},
{10, SWORDPULL + 6, 244, 38}, {6, SWORDPULL + 7, 225, 121}, {1, SWORDPULL + 7, 225, 121},
{1, SWORDPULL + 7, 225, 121}, {1, SWORDPULL + 7, 225, 121}, {1, SWORDPULL + 7, 225, 121},
{1, EMPTY, 147, 76}
},
// ZAXE
{{8, ZAXEREADY, 0, 108}, {8, ZAXEREADY + 1, 0, 58}, {8, ZAXEREADY + 2, 0, 57},
{8, ZAXEREADY + 3, 0, 69}, {8, ZAXEREADY + 4, 0, 100}, {8, ZAXEREADY + 5, 0, 9},
{8, ZAXEREADY + 6, 33, 0}, {8, ZAXEREADY + 7, 61, 0}, {8, ZAXEREADY + 8, 73, 20},
{8, ZAXEREADY + 9, 179, 117}, {8, EMPTY, 182, 116}, {1, EMPTY, 200, 122},
{1, EMPTY, 147, 76}
},
// ZBOW
{{12, ZBOWREADY, 0, 0}, {12, ZBOWREADY + 1, 0, 20}, {12, ZBOWREADY + 2, 0, 46},
{12, ZBOWREADY + 3, 0, 26}, {12, ZBOWREADY + 4, 0, 0}, {12, ZBOWREADY + 5, 71, 0},
{1, ZBOWWALK, 75, 13}, {1, ZBOWWALK, 75, 13}, {1, ZBOWWALK, 75, 13},
{1, ZBOWWALK, 75, 13}, {1, ZBOWWALK, 75, 13}, {1, ZBOWWALK, 75, 13},
{1, EMPTY, 147, 76}
},
// ZPIKE
{{8, ZPIKEREADY, 0, 150}, {8, ZPIKEREADY + 1, 0, 94}, {8, ZPIKEREADY + 2, 47, 45},
{8, ZPIKEREADY + 3, 138, 62}, {8, ZPIKEREADY + 4, 194, 95}, {8, ZPIKEREADY + 5, 59, 121},
{1, EMPTY, 80, 41}, {1, EMPTY, 107, 52}, {1, EMPTY, 147, 76},
{1, EMPTY, 80, 41}, {1, EMPTY, 107, 52}, {1, EMPTY, 147, 76},
{1, EMPTY, 147, 76}
},
{{12, ZTWOHANDREADY, 167, 131}, {12, ZTWOHANDREADY + 1, 71, 117}, {12, ZTWOHANDREADY, 0, 128},
{12, ZTWOHANDREADY + 3, 0, 150}, {12, ZTWOHANDREADY + 4, 10, 74}, {12, ZTWOHANDREADY + 5, 44, 81},
{12, ZTWOHANDREADY + 6, 0, 53}, {12, ZTWOHANDREADY + 7, 112, 0}, {12, ZTWOHANDREADY + 8, 220, 0},
{12, ZTWOHANDREADY + 9, 198, 84}, {12, ZTWOHANDREADY + 10, 186, 120}, {12, ZTWOHANDREADY + 11, 188, 124},
{1, EMPTY, 147, 76}
},
{{12, HALBERDDRAW, 183, 62}, {12, HALBERDDRAW + 1, 166, 10}, {12, HALBERDDRAW + 2, 173, 29},
{12, HALBERDDRAW + 3, 114, 35}, {1, HALBERDATTACK1, 245, 22}, {1, HALBERDATTACK1, 245, 22},
{1, HALBERDATTACK1, 245, 22}, {1, HALBERDATTACK1, 245, 22}, {1, HALBERDATTACK1, 245, 22},
{1, HALBERDATTACK1, 245, 22}, {1, HALBERDATTACK1, 245, 22}, {1, ZHALBERDATTACK, 245, 30},
{1, EMPTY, 147, 76}
}
};
const WEAPONINF readyanimtics[MAXWEAPONS][MAXFRAMES + 1] =
{
// FIST
{{10, RFIST, 216, 180}, {10, RFIST, 216, 170}, {10, RFIST, 216, 160},
{10, RFIST, 216, 150}, {10, RFIST, 216, 140}, {10, RFIST, 216, 130},
{10, RFIST, 216, 124}, {1, RFIST, 216, 124}, {1, RFIST, 216, 124},
{1, RFIST, 216, 122}, {1, RFIST, 216, 122}, {1, RFIST, 216, 122},
{1, EMPTY, 147, 76}
},
// KNIFE
{{10, KNIFEREADY, 69, 171}, {10, KNIFEREADY + 1, 11, 146}, {10, KNIFEREADY + 2, 25, 146},
{10, KNIFEREADY + 3, 35, 158}, {10, KNIFEREADY + 4, 38, 158}, {10, KNIFEREADY + 5, 16, 157},
{10, KNIFEREADY + 6, 37, 102}, {10, KNIFEREADY + 7, 239, 63}, {10, KNIFEREADY + 8, 214, 85},
{10, KNIFEREADY + 9, 206, 110}, {10, KNIFEREADY + 10, 217, 108}, {10, KNIFEREADY + 11, 204, 95},
{1, EMPTY, 147, 76}
},
// GOBSWORD
{{12, GOBSWORDPULL, 79, 169}, {12, GOBSWORDPULL + 1, 95, 115}, {12, GOBSWORDPULL + 2, 94, 93},
{12, GOBSWORDPULL + 3, 156, 77}, {12, GOBSWORDPULL + 4, 218, 64}, {12, GOBSWORDPULL + 5, 224, 57},
{8, GOBSWORDPULL + 6, 251, 54}, {1, GOBSWORDPULL + 7, 243, 92}, {1, GOBSWORDPULL + 7, 243, 92},
{1, GOBSWORDPULL + 7, 243, 92}, {1, GOBSWORDPULL + 7, 243, 92}, {1, GOBSWORDPULL + 7, 243, 92},
{1, EMPTY, 147, 76}
},
// MORNINGSTAR
{{6, MORNINGSTAR, 193, 190}, {6, MORNINGSTAR, 193, 180}, {6, MORNINGSTAR, 193, 170},
{6, MORNINGSTAR, 193, 160}, {6, MORNINGSTAR, 193, 150}, {6, MORNINGSTAR, 193, 140},
{6, MORNINGSTAR, 193, 130}, {6, MORNINGSTAR, 193, 120}, {6, MORNINGSTAR, 193, 110},
{6, MORNINGSTAR, 193, 100}, {6, MORNINGSTAR, 193, 90}, {1, MORNINGSTAR, 193, 90},
{1, EMPTY, 147, 76}
},
// SWORD
{{10, SWORDPULL, 58, 160}, {10, SWORDPULL + 1, 81, 111}, {10, SWORDPULL + 2, 19, 88},
{10, SWORDPULL + 3, 0, 93}, {10, SWORDPULL + 4, 104, 0}, {10, SWORDPULL + 5, 169, 0},
{10, SWORDPULL + 6, 244, 38}, {6, SWORDPULL + 7, 225, 121}, {1, SWORDPULL + 7, 225, 121},
{1, SWORDPULL + 7, 225, 121}, {1, SWORDPULL + 7, 225, 121}, {1, SWORDPULL + 7, 225, 121},
{1, EMPTY, 147, 76}
},
{{12, BIGAXEDRAW, 71, 108}, {12, BIGAXEDRAW + 1, 17, 58}, {12, BIGAXEDRAW + 2, 0, 56},
{12, BIGAXEDRAW + 3, 0, 71}, {12, BIGAXEDRAW + 4, 0, 102}, {12, BIGAXEDRAW + 5, 0, 11},
{12, BIGAXEDRAW + 6, 33, 0}, {12, BIGAXEDRAW + 7, 69, 0}, {12, BIGAXEDRAW + 8, 75, 20},
{12, BIGAXEDRAW9, 150, 92}, {12, BIGAXEDRAW10, 182, 116}, {1, EMPTY, 200, 122},
{1, EMPTY, 147, 76}
},
// BOW
{{12, BOWREADY, 0, 0}, {12, BOWREADY + 1, 0, 20}, {12, BOWREADY + 2, 0, 46},
{12, BOWREADY + 3, 0, 26}, {12, BOWREADY + 4, 0, 0}, {12, BOWREADY + 5, 71, 0},
{8, BOWREADYEND, 77, 23}, {1, BOWREADYEND, 77, 23}, {1, BOWREADYEND, 77, 23},
{1, BOWREADYEND, 77, 23}, {1, BOWREADYEND, 77, 23}, {1, BOWREADYEND, 77, 23},
{1, EMPTY, 147, 76}
},
{{8, PIKEDRAW, 0, 156}, {8, PIKEDRAW + 1, 15, 98}, {8, PIKEDRAW + 2, 83, 49},
{8, PIKEDRAW + 3, 144, 66}, {8, PIKEDRAW + 4, 197, 99}, {8, PIKEDRAW + 5, 216, 131},
{1, EMPTY, 80, 41}, {1, EMPTY, 107, 52}, {1, EMPTY, 147, 76},
{1, EMPTY, 80, 41}, {1, EMPTY, 107, 52}, {1, EMPTY, 147, 76},
{1, EMPTY, 147, 76}
},
{{12, EXCALDRAW, 167, 130}, {12, EXCALDRAW + 1, 70, 117}, {12, EXCALDRAW + 2, 0, 128},
{12, EXCALDRAW + 3, 0, 150}, {12, EXCALDRAW + 4, 4, 72}, {12, EXCALDRAW + 5, 38, 81},
{12, EXCALDRAW + 6, 0, 44}, {12, EXCALDRAW + 7, 112, 0}, {12, EXCALDRAW + 8, 224, 0},
{12, EXCALDRAW + 9, 198, 84}, {12, EXCALDRAW + 10, 186, 120}, {12, EXCALDRAW + 11, 188, 123},
{1, EMPTY, 147, 76}
},
{{12, HALBERDDRAW, 183, 62}, {12, HALBERDDRAW + 1, 166, 10}, {12, HALBERDDRAW + 2, 173, 29},
{12, HALBERDDRAW + 3, 114, 35}, {1, HALBERDATTACK1, 245, 22}, {1, HALBERDATTACK1, 245, 22},
{1, HALBERDATTACK1, 245, 22}, {1, HALBERDATTACK1, 245, 22}, {1, HALBERDATTACK1, 245, 22},
{1, HALBERDATTACK1, 245, 22}, {1, HALBERDATTACK1, 245, 22}, {1, HALBERDATTACK1, 245, 22},
{1, EMPTY, 147, 76}
}
};
const WEAPONINF weaponanimtics[MAXWEAPONS][MAXFRAMES] =
{
// FIST
{{10, RFIST, 216, 120}, {10, RFIST + 1, 166, 113}, {10, RFIST + 2, 156, 129},
{10, RFIST + 3, 169, 151}, {10, RFIST + 4, 153, 124}, {10, RFIST + 5, 224, 133},
{1, EMPTY, 80, 41}, {1, EMPTY, 107, 52}, {1, EMPTY, 147, 76},
{1, EMPTY, 80, 41}, {1, EMPTY, 107, 52}, {1, EMPTY, 147, 76}
},
// KNIFE
{{8, KNIFEATTACK, 189, 52}, {8, KNIFEATTACK + 1, 254, 68}, {8, EMPTY, 147, 76},
{8, EMPTY, 80, 41}, {8, KNIFEATTACK + 2, 254, 69}, {8, KNIFEATTACK + 3, 218, 80},
{8, KNIFEATTACK + 4, 137, 83}, {8, KNIFEATTACK + 5, 136, 100}, {8, KNIFEATTACK + 6, 126, 140},
{8, KNIFEATTACK + 5, 136, 100}, {8, KNIFEATTACK + 4, 137, 83}, {8, KNIFEATTACK, 189, 52}
},
// GOBLINATTACK
{{10, GOBSWORDATTACK, 243, 92}, {10, GOBSWORDATTACK + 1, 255, 68}, {10, GOBSWORDATTACK + 2, 279, 65},
{10, GOBSWORDATTACK + 3, 238, 55}, {10, GOBSWORDATTACK + 4, 153, 52}, {10, GOBSWORDATTACK + 5, 129, 152},
{10, GOBSWORDATTACK + 6, 90, 184}, {1, EMPTY, 297, 169}, {1, EMPTY, 275, 24},
{1, EMPTY, 275, 24}, {1, EMPTY, 275, 24}, {1, EMPTY, 275, 24}
},
// MORNINGSTAR
{{12, MORNINGSTAR, 193, 90}, {12, MORNINGSTAR + 1, 102, 133}, {12, MORNINGSTAR + 2, 77, 164},
{12, MORNINGSTAR + 3, 239, 86}, {12, EMPTY, 299, 86}, {12, EMPTY, 107, 52},
{12, MORNINGSTAR + 4, 197, 24}, {12, MORNINGSTAR + 5, 125, 124}, {12, MORNINGSTAR + 6, 109, 191},
{1, EMPTY, 80, 41}, {1, EMPTY, 107, 52}, {1, EMPTY, 147, 76}
},
// SWORD
{{8, SWORDATTACK, 229, 123}, {8, SWORDATTACK + 1, 221, 87}, {8, SWORDATTACK + 2, 193, 21},
{8, SWORDATTACK + 3, 173, 0}, {8, SWORDATTACK + 4, 61, 0}, {8, SWORDATTACK + 5, 33, 48},
{8, SWORDATTACK + 6, 126, 131}, {8, SWORDATTACK + 7, 297, 164}, {3, EMPTY, 147, 76},
{3, EMPTY, 80, 41}, {3, EMPTY, 107, 52}, {3, EMPTY, 147, 76}
},
{{12, BIGAXEATTACK, 184, 123}, {12, BIGAXEATTACK + 1, 223, 112}, {12, BIGAXEATTACK + 2, 63, 151},
{12, BIGAXEATTACK + 3, 91, 133}, {12, BIGAXEATTACK + 4, 127, 138}, {12, BIGAXEATTACK + 5, 106, 128},
{12, BIGAXEATTACK + 6, 117, 49}, {12, BIGAXEATTACK + 7, 140, 0}, {12, BIGAXEATTACK + 8, 152, 47},
{12, BIGAXEATTACK + 9, 166, 143}, {12, EMPTY, 107, 52}, {1, EMPTY, 147, 76}
},
// BOW
{{8, BOWWALK, 75, 13}, {8, BOWWALK + 1, 90, 0}, {8, BOWWALK + 2, 70, 0},
{8, BOWWALK + 3, 70, 0}, {6, BOWWALK + 4, 70, 0}, {4, BOWWALK + 5, 70, 0},
{1, EMPTY, 126, 131}, {1, EMPTY, 297, 164}, {1, EMPTY, 147, 76},
{1, EMPTY, 80, 41}, {1, EMPTY, 107, 52}, {1, EMPTY, 147, 76}
},
{{10, PIKEDRAW + 5, 216, 131}, {10, EMPTY, 80, 41}, {10, EMPTY, 107, 52}, {10, EMPTY, 147, 76},
{10, PIKEATTACK1, 0, 47}, {10, PIKEATTACK1 + 1, 0, 0}, {10, PIKEATTACK1 + 2, 0, 0},
{10, PIKEATTACK1 + 3, 73, 0}, {10, PIKEATTACK1 + 4, 130, 27}, {10, PIKEATTACK1 + 5, 138, 125},
{12, EMPTY, 80, 41}, {1, EMPTY, 107, 52}
},
{{8, EXCALATTACK1, 98, 133}, {8, EXCALATTACK1 + 1, 123, 130}, {8, EXCALATTACK1 + 2, 125, 128},
{8, EXCALATTACK1 + 3, 115, 82}, {8, EXCALATTACK1 + 4, 115, 6}, {8, EXCALATTACK1 + 5, 178, 0},
{8, EXCALATTACK1 + 6, 155, 0}, {8, EXCALATTACK1 + 7, 143, 0}, {8, EXCALATTACK1 + 8, 90, 91},
{8, EXCALATTACK1 + 9, 30, 159}, {1, EMPTY, 80, 41}, {1, EMPTY, 107, 52}
},
{{12, HALBERDATTACK1, 245, 22}, {12, EMPTY, 107, 52}, {12, EMPTY, 147, 76},
{12, HALBERDATTACK1 + 1, 249, 45}, {12, HALBERDATTACK1 + 2, 161, 60}, {12, HALBERDATTACK1 + 3, 45, 88},
{12, EMPTY, 80, 41}, {12, HALBERDATTACK1 + 3, 45, 88}, {12, HALBERDATTACK1 + 2, 161, 60},
{12, HALBERDATTACK1 + 1, 249, 45}, {12, EMPTY, 107, 52}, {1, EMPTY, 147, 76}
}
};
//SCOTT
const WEAPONINF zweaponanimtics[MAXWEAPONS][MAXFRAMES] =
{
// FIST
{{10, RFIST, 216, 120}, {10, RFIST + 1, 166, 113}, {10, RFIST + 2, 156, 129},
{10, RFIST + 3, 169, 151}, {10, RFIST + 4, 153, 124}, {10, RFIST + 5, 224, 133},
{1, EMPTY, 80, 41}, {1, EMPTY, 107, 52}, {1, EMPTY, 147, 76},
{1, EMPTY, 80, 41}, {1, EMPTY, 107, 52}, {1, EMPTY, 147, 76}
},
// ZKNIFE
{{8, ZKNIFEATTACK, 189, 52}, {8, ZKNIFEATTACK + 1, 254, 68},
{16, EMPTY, 147, 76}, {8, ZKNIFEATTACK + 1, 254, 68},
{8, ZKNIFEATTACK + 2, 218, 80}, {8, ZKNIFEATTACK + 3, 137, 83},
{8, ZKNIFEATTACK + 4, 136, 100}, {8, ZKNIFEATTACK + 5, 126, 140},
{8, ZKNIFEATTACK + 4, 136, 100}, {8, ZKNIFEATTACK + 3, 137, 83},
{8, ZKNIFEATTACK + 2, 218, 80}, {1, ZKNIFEATTACK, 189, 52}
},
// ZSHORTATTACK
{{10, ZSHORTATTACK, 243, 68}, {10, ZSHORTATTACK + 4, 255, 50},
{10, ZSHORTATTACK + 5, 279, 66}, {10, ZSHORTATTACK + 6, 238, 52},
{10, ZSHORTATTACK + 7, 181, 49}, {10, ZSHORTATTACK + 8, 129, 141},
{1, EMPTY, 90, 184}, {1, EMPTY, 297, 169}, {1, EMPTY, 275, 24},
{1, EMPTY, 275, 24}, {1, EMPTY, 275, 24}, {1, EMPTY, 275, 24}
},
// ZSTARATTACK
{{12, ZSTARATTACK, 193, 90}, {12, ZSTARATTACK + 3, 102, 128},
{12, ZSTARATTACK + 4, 77, 159}, {12, ZSTARATTACK + 5, 239, 79},
{12, EMPTY, 299, 86}, {12, EMPTY, 107, 52},
{12, ZSTARATTACK + 6, 175, 19}, {12, ZSTARATTACK + 7, 125, 124},
{12, ZSTARATTACK + 8, 109, 187},
{1, EMPTY, 80, 41}, {1, EMPTY, 107, 52}, {1, EMPTY, 147, 76}
},
// SWORD
{{8, SWORDATTACK, 229, 123}, {8, SWORDATTACK + 1, 221, 87}, {8, SWORDATTACK + 2, 193, 21},
{8, SWORDATTACK + 3, 173, 0}, {8, SWORDATTACK + 4, 61, 0}, {8, SWORDATTACK + 5, 33, 48},
{8, SWORDATTACK + 6, 126, 131}, {8, SWORDATTACK + 7, 297, 164}, {3, EMPTY, 147, 76},
{3, EMPTY, 80, 41}, {3, EMPTY, 107, 52}, {3, EMPTY, 147, 76}
},
// ZAXEATTACK
{{6, ZAXEATTACK, 179, 117}, {6, ZAXEATTACK + 6, 217, 107},
{6, ZAXEATTACK + 7, 106, 146}, {6, ZAXEATTACK + 8, 94, 128},
{6, ZAXEATTACK + 9, 123, 132}, {6, ZAXEATTACK + 10, 102, 134},
{6, ZAXEATTACK + 11, 112, 45}, {6, ZAXEATTACK + 12, 102, 0},
{6, ZAXEATTACK + 13, 68, 42}, {6, ZAXEATTACK + 14, 42, 138},
{6, EMPTY, 107, 52}, {1, EMPTY, 147, 76}
},
// ZBOW
{{8, ZBOWWALK, 75, 13}, {8, ZBOWATTACK, 90, 0}, {8, ZBOWATTACK + 1, 70, 0},
{8, ZBOWATTACK + 2, 70, 0}, {6, ZBOWATTACK + 3, 70, 0}, {4, ZBOWATTACK + 4, 70, 0},
{1, ZBOWWALK, 75, 13}, {1, ZBOWWALK, 75, 13}, {1, ZBOWWALK, 75, 13},
{1, ZBOWWALK, 75, 13}, {1, ZBOWWALK, 75, 13}, {1, EMPTY, 147, 76}
},
// ZPIKE
{{10, ZPIKEREADY + 5, 210, 127}, {10, EMPTY, 80, 41}, {10, EMPTY, 107, 52}, {10, EMPTY, 147, 76},
{10, ZPIKEATTACK, 0, 43}, {10, ZPIKEATTACK + 1, 0, 0}, {10, ZPIKEATTACK + 2, 0, 0},
{10, ZPIKEATTACK + 3, 45, 0}, {10, ZPIKEATTACK + 4, 51, 23}, {10, ZPIKEATTACK + 5, 59, 121},
{12, EMPTY, 80, 41}, {1, EMPTY, 107, 52}
},
{{8, ZTWOHANDATTACK, 98, 133}, {8, ZTWOHANDATTACK + 6, 115, 130},
{8, ZTWOHANDATTACK + 7, 125, 128}, {8, ZTWOHANDATTACK + 8, 116, 82},
{8, ZTWOHANDATTACK + 9, 117, 9}, {8, ZTWOHANDATTACK + 10, 180, 0},
{8, ZTWOHANDATTACK + 11, 174, 0}, {8, ZTWOHANDATTACK + 12, 166, 0},
{8, ZTWOHANDATTACK + 13, 125, 90}, {8, ZTWOHANDATTACK + 14, 83, 166},
{1, EMPTY, 30, 159}, {1, EMPTY, 80, 41}
},
// { { 12,ZHALBERDATTACK,173,29 },{6,EMPTY,107,52},
// { 6,EMPTY,147,76},{ 12,ZHALBERDATTACK+3,117,0 },
// { 12,ZHALBERDATTACK+4,245,0},{12,ZHALBERDATTACK+5,237,0},
// { 6,EMPTY,80,41 },{12,ZHALBERDATTACK+6,115,0},
// { 12,ZHALBERDATTACK+7,9,0 },{ 12,ZHALBERDATTACK+8,0,42 },
// { 1,ZHALBERDATTACK,173,29 },{ 1,EMPTY,147,76 }
// }
{{12, ZHALBERDATTACK, 245, 30}, {12, EMPTY, 107, 52}, {12, EMPTY, 147, 76},
{12, HALBERDATTACK1 + 1, 249, 45}, {12, HALBERDATTACK1 + 2, 161, 60}, {12, HALBERDATTACK1 + 3, 45, 88},
{12, EMPTY, 80, 41}, {12, HALBERDATTACK1 + 3, 45, 88}, {12, HALBERDATTACK1 + 2, 161, 60},
{12, HALBERDATTACK1 + 1, 249, 45}, {12, EMPTY, 107, 52}, {1, EMPTY, 147, 76}
}
};
// SCOTT
const WEAPONINF zlefthandanimtics[5][MAXFRAMES] =
{
{{10, RFIST, 15, 121}, {10, RFIST + 1, 17, 114}, {10, RFIST + 2, 54, 131},
{10, RFIST + 3, 76, 152}, {10, RFIST + 4, 31, 126}, {10, RFIST + 5, 26, 135},
{1, EMPTY, 80, 41}, {1, EMPTY, 107, 52}, {1, EMPTY, 147, 76},
{1, EMPTY, 80, 41}, {1, EMPTY, 107, 52}, {1, EMPTY, 147, 76}
},
// KNIFE
{{8, KNIFEATTACK2, 0, 113}, {8, KNIFEATTACK2 + 1, 44, 111}, {8, KNIFEATTACK2 + 2, 119, 137},
{8, KNIFEATTACK2 + 3, 187, 159}, {16, EMPTY, 136, 100}, {8, KNIFEATTACK2 + 3, 187, 159},
{8, KNIFEATTACK2 + 2, 119, 137}, {8, KNIFEATTACK2 + 1, 44, 111}, {8, KNIFEATTACK2, 0, 113},
{1, EMPTY, 80, 41}, {1, EMPTY, 107, 52}, {1, EMPTY, 147, 76}
},
// ZSHORTATTACK
{{10, ZSHORTATTACK, 255, 50}, {10, ZSHORTATTACK + 1, 279, 66}, {10, ZSHORTATTACK + 2, 238, 52},
{10, ZSHORTATTACK + 3, 181, 49}, {10, ZSHORTATTACK + 4, 129, 141}, {10, ZSHORTATTACK + 5, 70, 93},
{10, EMPTY, 90, 184}, {1, EMPTY, 297, 169}, {1, EMPTY, 275, 24},
{1, EMPTY, 275, 24}, {1, EMPTY, 275, 24}, {1, EMPTY, 275, 24}
},
// ZSTARATTACK2
{{12, ZSTARATTACK2, 38, 141}, {12, ZSTARATTACK2 + 1, 0, 111}, {12, ZSTARATTACK2 + 2, 0, 91},
{12, ZSTARATTACK2 + 3, 0, 47}, {12, EMPTY, 0, 24}, {1, EMPTY, 0, 24},
{1, EMPTY, 0, 24}, {1, EMPTY, 0, 24}, {1, EMPTY, 0, 24},
{1, EMPTY, 0, 24}, {1, EMPTY, 0, 24}, {1, EMPTY, 0, 24}
},
// ZSHORTATTACK2
{{10, ZSHORTATTACK2, 238, 99}, {10, ZSHORTATTACK2 + 1, 202, 11}, {10, ZSHORTATTACK2 + 2, 182, 0},
{10, ZSHORTATTACK2 + 3, 79, 13}, {10, ZSHORTATTACK2 + 4, 79, 13}, {10, ZSHORTATTACK2 + 5, 119, 123},
{10, ZSHORTATTACK2 + 6, 295, 179}, {1, EMPTY, 275, 24}, {1, EMPTY, 275, 24},
{1, EMPTY, 275, 24}, {1, EMPTY, 275, 24}, {1, EMPTY, 275, 24}
}
};
const WEAPONINF weaponanimtics2[MAXWEAPONS][MAXFRAMES] =
{
// FIST
{{10, RFIST, 216, 120}, {10, RFIST + 1, 166, 113}, {10, RFIST + 2, 156, 129},
{10, RFIST + 3, 169, 151}, {10, RFIST + 4, 153, 124}, {10, RFIST + 5, 224, 133},
{1, EMPTY, 80, 41}, {1, EMPTY, 107, 52}, {1, EMPTY, 147, 76},
{1, EMPTY, 80, 41}, {1, EMPTY, 107, 52}, {1, EMPTY, 147, 76}
},
// KNIFE
{{8, KNIFEATTACK, 189, 52}, {8, KNIFEATTACK + 1, 254, 68}, {16, EMPTY, 147, 76},
{8, KNIFEATTACK2, 206, 114}, {8, KNIFEATTACK2 + 1, 107, 112}, {8, KNIFEATTACK2 + 2, 22, 138},
{8, KNIFEATTACK2 + 3, 0, 161}, {16, EMPTY, 136, 100}, {8, KNIFEATTACK2 + 3, 0, 161},
{8, KNIFEATTACK2 + 2, 22, 138}, {8, KNIFEATTACK2 + 1, 107, 112}, {8, KNIFEATTACK2, 206, 114}
},
// GOBLINATTACK
{{10, GOBSWORDATTACK2, 236, 99}, {10, GOBSWORDATTACK2 + 1, 202, 24}, {10, GOBSWORDATTACK2 + 2, 181, 0},
{10, GOBSWORDATTACK2 + 3, 52, 12}, {10, GOBSWORDATTACK2 + 4, 72, 72}, {10, GOBSWORDATTACK2 + 5, 134, 139},
{10, GOBSWORDATTACK2 + 6, 297, 169}, {1, EMPTY, 275, 24}, {1, EMPTY, 275, 24},
{1, EMPTY, 275, 24}, {1, EMPTY, 275, 24}, {1, EMPTY, 275, 24}
},
// MORNINGATTACK2
{{12, MORNINGATTACK2, 85, 136}, {12, MORNINGATTACK2 + 1, 34, 110}, {12, MORNINGATTACK2 + 2, 32, 91},
{12, MORNINGATTACK2 + 3, 186, 47}, {12, MORNINGATTACK2 + 4, 275, 24}, {1, EMPTY, 275, 24},
{1, EMPTY, 275, 24}, {1, EMPTY, 275, 24}, {1, EMPTY, 275, 24},
{1, EMPTY, 275, 24}, {1, EMPTY, 275, 24}, {1, EMPTY, 275, 24}
},
// SWORD
{{8, SWORDATTACK2 + 1, 195, 63}, {8, SWORDATTACK2 + 2, 250, 54}, {8, SWORDATTACK2 + 3, 275, 37},
{16, EMPTY, 61, 0}, {8, SWORDATTACK2 + 4, 229, 66}, {8, SWORDATTACK2 + 5, 185, 0},
{8, SWORDATTACK2 + 6, 158, 115}, {8, SWORDATTACK2 + 7, 57, 163}, {1, EMPTY, 57, 163},
{1, EMPTY, 57, 163}, {1, EMPTY, 57, 163}, {1, EMPTY, 57, 163}
},
{{12, BIGAXEATTACK2, 200, 111}, {12, BIGAXEATTACK2 + 1, 5, 136}, {12, BIGAXEATTACK2 + 2, 69, 162},
{12, BIGAXEATTACK2 + 3, 147, 164}, {12, BIGAXEATTACK2 + 4, 76, 152}, {12, BIGAXEATTACK2 + 5, 33, 95},
{12, BIGAXEATTACK2 + 6, 0, 91}, {12, BIGAXEATTACK2 + 7, 0, 98}, {12, EMPTY, 147, 76},
{1, EMPTY, 80, 41}, {1, EMPTY, 107, 52}, {1, EMPTY, 147, 76}
},
// BOW
{{8, BOWWALK, 75, 13}, {8, BOWWALK + 1, 90, 0}, {8, BOWWALK + 2, 70, 0},
{8, BOWWALK + 3, 70, 0}, {6, BOWWALK + 4, 70, 0}, {4, BOWWALK + 5, 70, 0},
{1, EMPTY, 126, 131}, {1, EMPTY, 297, 164}, {1, EMPTY, 147, 76},
{1, EMPTY, 80, 41}, {1, EMPTY, 107, 52}, {1, EMPTY, 147, 76}
},
{{10, PIKEATTACK2, 266, 147}, {10, PIKEATTACK2 + 1, 182, 117}, {10, PIKEATTACK2 + 2, 123, 84},
{10, PIKEATTACK2 + 3, 7, 48}, {10, PIKEATTACK2 + 4, 0, 83}, {10, PIKEATTACK2 + 5, 0, 158},
{10, PIKEATTACK2 + 6, 25, 117}, {10, PIKEATTACK2 + 7, 139, 93}, {10, PIKEATTACK2 + 8, 234, 75},
{8, EMPTY, 80, 41}, {1, EMPTY, 107, 52}, {1, EMPTY, 147, 76}
},
{{8, EXCALATTACK2, 0, 143}, {8, EXCALATTACK2 + 1, 0, 103}, {8, EXCALATTACK2 + 2, 0, 70},
{8, EXCALATTACK2 + 3, 48, 0}, {8, EXCALATTACK2 + 4, 67, 0}, {8, EXCALATTACK2 + 5, 78, 21},
{8, EXCALATTACK2 + 6, 165, 107}, {8, EXCALATTACK2 + 7, 260, 168}, {1, EMPTY, 130, 27},
{1, EMPTY, 138, 125}, {1, EMPTY, 80, 41}, {1, EMPTY, 107, 52}
},
{{12, HALBERDATTACK1, 245, 22}, {12, HALBERDATTACK2, 114, 35}, {12, HALBERDATTACK2 + 1, 105, 87},
{12, HALBERDATTACK2 + 2, 54, 107}, {12, HALBERDATTACK2 + 3, 48, 102}, {1, HALBERDATTACK2 + 3, 48, 102},
{1, HALBERDATTACK2 + 3, 48, 102}, {12, HALBERDATTACK2 + 2, 54, 107}, {12, HALBERDATTACK2 + 1, 105, 87},
{1, EMPTY, 80, 41}, {1, EMPTY, 107, 52}, {1, EMPTY, 147, 76}
}
};
//SCOTT
const WEAPONINF zweaponanimtics2[MAXWEAPONS][MAXFRAMES] =
{
// FIST
{{10, RFIST, 216, 120}, {10, RFIST + 1, 166, 113}, {10, RFIST + 2, 156, 129},
{10, RFIST + 3, 169, 151}, {10, RFIST + 4, 153, 124}, {10, RFIST + 5, 224, 133},
{1, EMPTY, 80, 41}, {1, EMPTY, 107, 52}, {1, EMPTY, 147, 76},
{1, EMPTY, 80, 41}, {1, EMPTY, 107, 52}, {1, EMPTY, 147, 76}
},
// ZKNIFE
{{8, ZKNIFEATTACK, 189, 52}, {8, ZKNIFEATTACK + 1, 254, 68}, {16, EMPTY, 147, 76},
{8, ZKNIFEATTACK2, 206, 114}, {8, ZKNIFEATTACK2 + 1, 107, 112}, {8, ZKNIFEATTACK2 + 2, 22, 138},
{8, ZKNIFEATTACK2 + 3, 0, 161}, {16, EMPTY, 136, 100}, {8, KNIFEATTACK2 + 3, 0, 161},
{8, ZKNIFEATTACK2 + 2, 22, 138}, {8, ZKNIFEATTACK2 + 1, 107, 112}, {8, KNIFEATTACK2, 206, 114}
},
// ZSHORTATTACK2
{{10, ZSHORTATTACK2, 238, 99}, {10, ZSHORTATTACK2 + 1, 202, 11},
{10, ZSHORTATTACK2 + 2, 182, 0}, {10, ZSHORTATTACK2 + 3, 79, 13},
{10, ZSHORTATTACK2 + 4, 40, 45}, {10, ZSHORTATTACK2 + 5, 119, 123},
{10, ZSHORTATTACK2 + 6, 295, 179}, {1, EMPTY, 275, 24}, {1, EMPTY, 275, 24},
{1, EMPTY, 275, 24}, {1, EMPTY, 275, 24}, {1, EMPTY, 275, 24}
},
// ZSTARATTACK2
{{12, ZSTARATTACK2, 44, 110}, {12, ZSTARATTACK2 + 1, 26, 91}, {12, ZSTARATTACK2 + 2, 177, 38},
{12, ZSTARATTACK2 + 3, 262, 11}, {12, EMPTY, 275, 24}, {1, EMPTY, 275, 24},
{1, EMPTY, 275, 24}, {1, EMPTY, 275, 24}, {1, EMPTY, 275, 24},
{1, EMPTY, 275, 24}, {1, EMPTY, 275, 24}, {1, EMPTY, 275, 24}
},
// SWORD
{{8, SWORDATTACK2 + 1, 195, 63}, {8, SWORDATTACK2 + 2, 250, 54}, {8, SWORDATTACK2 + 3, 275, 37},
{16, EMPTY, 61, 0}, {8, SWORDATTACK2 + 4, 229, 66}, {8, SWORDATTACK2 + 5, 185, 0},
{8, SWORDATTACK2 + 6, 158, 115}, {8, SWORDATTACK2 + 7, 57, 163}, {1, EMPTY, 57, 163},
{1, EMPTY, 57, 163}, {1, EMPTY, 57, 163}, {1, EMPTY, 57, 163}
},
// ZAXEATTACK2
{{6, ZAXEATTACK2, 200, 111}, {6, ZAXEATTACK2 + 1, 5, 136}, {6, ZAXEATTACK2 + 2, 69, 162},
{6, ZAXEATTACK2 + 3, 147, 164}, {6, ZAXEATTACK2 + 4, 76, 152}, {6, ZAXEATTACK2 + 5, 33, 95},
{6, ZAXEATTACK2 + 6, 0, 91}, {6, ZAXEATTACK2 + 7, 0, 98}, {6, EMPTY, 147, 76},
{1, EMPTY, 80, 41}, {1, EMPTY, 107, 52}, {1, EMPTY, 147, 76}
},
// ZBOW
{{8, ZBOWWALK, 75, 13}, {8, ZBOWATTACK, 90, 0}, {8, ZBOWATTACK + 1, 70, 0},
{8, ZBOWATTACK + 2, 70, 0}, {6, ZBOWATTACK + 3, 70, 0}, {4, ZBOWATTACK + 4, 70, 0},
{1, ZBOWWALK, 75, 13}, {1, ZBOWWALK, 75, 13}, {1, ZBOWWALK, 75, 13},
{1, ZBOWWALK, 75, 13}, {1, ZBOWWALK, 75, 13}, {1, EMPTY, 147, 76}
},
// ZPIKEATTACK2
{{10, ZPIKEATTACK2, 266, 147}, {10, ZPIKEATTACK2 + 1, 182, 117}, {10, ZPIKEATTACK2 + 2, 123, 84},
{10, ZPIKEATTACK2 + 3, 7, 48}, {10, ZPIKEATTACK2 + 4, 0, 83}, {10, ZPIKEATTACK2 + 5, 0, 158},
{10, ZPIKEATTACK2 + 6, 25, 117}, {10, ZPIKEATTACK2 + 7, 139, 93}, {10, ZPIKEATTACK2 + 8, 234, 75},
{8, EMPTY, 80, 41}, {1, EMPTY, 107, 52}, {1, EMPTY, 147, 76}
},
// ZTWOHANDATTACK2
{{8, ZTWOHANDATTACK2, 0, 143}, {8, ZTWOHANDATTACK2 + 1, 0, 103}, {8, ZTWOHANDATTACK2 + 2, 0, 70},
{8, ZTWOHANDATTACK2 + 3, 41, 0}, {8, ZTWOHANDATTACK2 + 4, 54, 0}, {8, ZTWOHANDATTACK2 + 5, 166, 21},
{8, ZTWOHANDATTACK2 + 6, 242, 108}, {8, EMPTY, 260, 168}, {1, EMPTY, 130, 27},
{1, EMPTY, 138, 125}, {1, EMPTY, 80, 41}, {1, EMPTY, 107, 52}
},
// ZHALBERDATTACK2
{{12, HALBERDATTACK1, 245, 22}, {12, HALBERDATTACK2, 114, 35}, {12, HALBERDATTACK2 + 1, 105, 87},
{12, HALBERDATTACK2 + 2, 54, 107}, {12, HALBERDATTACK2 + 3, 48, 102}, {1, HALBERDATTACK2 + 3, 48, 102},
{1, HALBERDATTACK2 + 3, 48, 102}, {12, HALBERDATTACK2 + 2, 54, 107}, {12, HALBERDATTACK2 + 1, 105, 87},
{1, EMPTY, 80, 41}, {1, EMPTY, 107, 52}, {1, EMPTY, 147, 76}
}
};
const WEAPONINF lefthandanimtics[5][MAXFRAMES] =
{
{{10, RFIST, 15, 121}, {10, RFIST + 1, 17, 114}, {10, RFIST + 2, 54, 131},
{10, RFIST + 3, 76, 152}, {10, RFIST + 4, 31, 126}, {10, RFIST + 5, 26, 135},
{1, EMPTY, 80, 41}, {1, EMPTY, 107, 52}, {1, EMPTY, 147, 76},
{1, EMPTY, 80, 41}, {1, EMPTY, 107, 52}, {1, EMPTY, 147, 76}
},
// KNIFE
{{8, KNIFEATTACK2, 0, 113}, {8, KNIFEATTACK2 + 1, 44, 111}, {8, KNIFEATTACK2 + 2, 119, 137},
{8, KNIFEATTACK2 + 3, 187, 159}, {16, EMPTY, 136, 100}, {8, KNIFEATTACK2 + 3, 187, 159},
{8, KNIFEATTACK2 + 2, 119, 137}, {8, KNIFEATTACK2 + 1, 44, 111}, {8, KNIFEATTACK2, 0, 113},
{1, EMPTY, 80, 41}, {1, EMPTY, 107, 52}, {1, EMPTY, 147, 76}
},
// GOBLINATTACK
{{10, GOBSWORDATTACK, 243, 92}, {10, GOBSWORDATTACK + 1, 255, 68}, {10, GOBSWORDATTACK + 2, 279, 65},
{10, GOBSWORDATTACK + 3, 238, 55}, {10, GOBSWORDATTACK + 4, 153, 52}, {10, GOBSWORDATTACK + 5, 129, 152},
{10, GOBSWORDATTACK + 6, 90, 184}, {1, EMPTY, 297, 169}, {1, EMPTY, 275, 24},
{1, EMPTY, 275, 24}, {1, EMPTY, 275, 24}, {1, EMPTY, 275, 24}
},
// MORNINGATTACK2
{{12, MORNINGATTACK2, 38, 141}, {12, MORNINGATTACK2 + 1, 0, 111}, {12, MORNINGATTACK2 + 2, 0, 91},
{12, MORNINGATTACK2 + 3, 0, 47}, {12, MORNINGATTACK2 + 4, 0, 24}, {1, EMPTY, 0, 24},
{1, EMPTY, 0, 24}, {1, EMPTY, 0, 24}, {1, EMPTY, 0, 24},
{1, EMPTY, 0, 24}, {1, EMPTY, 0, 24}, {1, EMPTY, 0, 24}
},
// GOBLINATTACK2
{{10, GOBSWORDATTACK2, 236, 99}, {10, GOBSWORDATTACK2 + 1, 202, 24}, {10, GOBSWORDATTACK2 + 2, 181, 0},
{10, GOBSWORDATTACK2 + 3, 52, 12}, {10, GOBSWORDATTACK2 + 4, 72, 72}, {10, GOBSWORDATTACK2 + 5, 134, 139},
{10, GOBSWORDATTACK2 + 6, 297, 169}, {1, EMPTY, 275, 24}, {1, EMPTY, 275, 24},
{1, EMPTY, 275, 24}, {1, EMPTY, 275, 24}, {1, EMPTY, 275, 24}
}
};
END_WH_NS

View file

@ -6,12 +6,287 @@ BEGIN_WH_NS
using SPRITE = spritetype;
using boolean = bool;
using byte = uint8_t;
END_WH_NS
#include "globals.h"
#include "names.h"
#include "item.h"
#include "wh1names.h"
#include "wh2names.h"
#include "sndnames.h"
#include "player.h"
#include "ai.h"
#include "printf.h"
#include "gstrings.h"
#include "gamecontrol.h"
BEGIN_WH_NS
enum EItems
{
ITEMSBASE = 101,
SILVERBAGTYPE = 101,
GOLDBAGTYPE = 102,
HELMETTYPE = 103,
PLATEARMORTYPE = 104,
CHAINMAILTYPE = 105,
LEATHERARMORTYPE = 106,
GIFTBOXTYPE = 107,
FLASKBLUETYPE = 108,
FLASKGREENTYPE = 109,
FLASKOCHRETYPE = 110,
FLASKREDTYPE = 111,
FLASKTANTYPE = 112,
DIAMONDRINGTYPE = 113,
SHADOWAMULETTYPE = 114,
GLASSSKULLTYPE = 115,
AHNKTYPE = 116,
BLUESCEPTERTYPE = 117,
YELLOWSCEPTERTYPE = 118,
ADAMANTINERINGTYPE = 119,
ONYXRINGTYPE = 120,
PENTAGRAMTYPE = 121,
CRYSTALSTAFFTYPE = 122,
AMULETOFTHEMISTTYPE = 123,
HORNEDSKULLTYPE = 124,
THEHORNTYPE = 125,
SAPHIRERINGTYPE = 126,
BRASSKEYTYPE = 127,
BLACKKEYTYPE = 128,
GLASSKEYTYPE = 129,
IVORYKEYTYPE = 130,
SCROLLSCARETYPE = 131,
SCROLLNIGHTTYPE = 132,
SCROLLFREEZETYPE = 133,
SCROLLMAGICTYPE = 134,
SCROLLOPENTYPE = 135,
SCROLLFLYTYPE = 136,
SCROLLFIREBALLTYPE = 137,
SCROLLNUKETYPE = 138,
QUIVERTYPE = 139,
BOWTYPE = 140,
WEAPON1TYPE = 141,
WEAPON1ATYPE = 142,
GOBWEAPONTYPE = 143,
WEAPON2TYPE = 144,
WEAPON3ATYPE = 145,
WEAPON3TYPE = 146,
WEAPON4TYPE = 147,
THROWHALBERDTYPE = 148,
WEAPON5TYPE = 149,
GONZOSHIELDTYPE = 150,
SHIELDTYPE = 151,
WEAPON5BTYPE = 152,
WALLPIKETYPE = 153,
WEAPON6TYPE = 154,
WEAPON7TYPE = 155,
GYSERTYPE = 156, //WH1
SPIKEBLADETYPE = 157,
SPIKETYPE = 158,
SPIKEPOLETYPE = 159,
MONSTERBALLTYPE = 160,
WEAPON8TYPE = 161,
MAXITEMS = 162,
};
struct Delayitem {
int item;
int timer;
boolean func;
void memmove(const Delayitem& source)
{
item = source.item;
timer = source.timer;
func = source.func;
}
};
struct SwingDoor {
int wall[8];
int sector;
int angopen;
int angclosed;
int angopendir;
int ang;
int anginc;
int x[8];
int y[8];
};
struct PLOCATION {
int x;
int y;
int z;
float ang;
float horiz;
};
extern int killcnt;
// whobj
extern int justwarpedcnt;
extern byte flashflag;
extern short torchpattern[];
extern int monsterwarptime;
short adjusthp(int hp);
void timerprocess(PLAYER& plr);
int getPickHeight();
void processobjs(PLAYER& plr);
void newstatus(short sn, int seq);
void makeafire(int i, int firetype);
void explosion(int i, int x, int y, int z, int owner);
void explosion2(int i, int x, int y, int z, int owner);
void trailingsmoke(int i, boolean ball);
void icecubes(int i, int x, int y, int z, int owner);
boolean damageactor(PLAYER& plr, int hitobject, short i);
int movesprite(short spritenum, int dx, int dy, int dz, int ceildist, int flordist, int cliptype);
void trowajavlin(int s);
void spawnhornskull(short i);
void spawnapentagram(int sn);
// whplr
extern PLAYER player[MAXPLAYERS];
extern PLOCATION gPrevPlayerLoc[MAXPLAYERS];
extern short monsterangle[MAXSPRITESONSCREEN], monsterlist[MAXSPRITESONSCREEN];
extern int shootgunzvel;
extern boolean justteleported;
extern int victor;
extern int autohoriz; // XXX NOT FOR MULTIPLAYER
extern int pyrn;
extern int mapon;
extern int damage_vel, damage_svel, damage_angvel;
void viewBackupPlayerLoc(int nPlayer);
void playerdead(PLAYER& plr);
void initplayersprite(PLAYER& plr);
void updateviewmap(PLAYER& plr);
void plruse(PLAYER& plr);
void chunksofmeat(PLAYER& plr, int hitsprite, int hitx, int hity, int hitz, short hitsect, int daang);
void addhealth(PLAYER& plr, int hp);
void addarmor(PLAYER& plr, int arm);
void addscore(PLAYER& plr, int score);
void goesupalevel(PLAYER& plr);
// whtag.cpp
extern int d_soundplayed;
extern int delaycnt;
extern Delayitem delayitem[MAXSECTORS];
extern short ironbarsector[16];
extern short ironbarscnt;
extern int ironbarsgoal1[16], ironbarsgoal2[16];
extern short ironbarsdone[16], ironbarsanim[16];
extern int ironbarsgoal[16];
extern short warpsectorlist[64], warpsectorcnt;
extern short xpanningsectorlist[16], xpanningsectorcnt;
extern short ypanningwalllist[128], ypanningwallcnt;
extern short floorpanninglist[64], floorpanningcnt;
extern SwingDoor swingdoor[MAXSWINGDOORS];
extern short swingcnt;
extern short dragsectorlist[16], dragxdir[16], dragydir[16], dragsectorcnt;
extern int dragx1[16], dragy1[16], dragx2[16], dragy2[16], dragfloorz[16];
void operatesprite(PLAYER& plr, short s);
void operatesector(PLAYER& plr, int s);
void animatetags(int nPlayer);
void dodelayitems(int tics);
void setdelayfunc(int item, int delay);
// whmap
extern boolean nextlevel;
void loadnewlevel(int mapon);
void preparesectors();
boolean prepareboard(const char* fname);
// whani
void animateobjs(PLAYER& plr);
boolean isBlades(int pic);
// weapons
extern const WEAPONINF sspellbookanim[MAXNUMORBS][9];
extern const WEAPONINF spikeanimtics[5];
extern const WEAPONINF wh2throwanimtics[MAXNUMORBS][MAXFRAMES + 1];
extern const WEAPONINF throwanimtics[MAXNUMORBS][MAXFRAMES + 1];
extern const WEAPONINF cockanimtics[MAXFRAMES + 1];
extern const WEAPONINF zcockanimtics[MAXFRAMES + 1];
extern const WEAPONINF zreadyanimtics[MAXWEAPONS][MAXFRAMES + 1];
extern const WEAPONINF readyanimtics[MAXWEAPONS][MAXFRAMES + 1];
extern const WEAPONINF weaponanimtics[MAXWEAPONS][MAXFRAMES];
extern const WEAPONINF zweaponanimtics[MAXWEAPONS][MAXFRAMES];
extern const WEAPONINF zlefthandanimtics[5][MAXFRAMES];
extern const WEAPONINF weaponanimtics2[MAXWEAPONS][MAXFRAMES];
extern const WEAPONINF zweaponanimtics2[MAXWEAPONS][MAXFRAMES];
extern const WEAPONINF lefthandanimtics[5][MAXFRAMES];
extern int dropshieldcnt;
extern boolean droptheshield;
extern int dahand;
extern int weapondrop;
extern int snakex, snakey;
extern int enchantedsoundhandle;
boolean checkmedusadist(int i, int x, int y, int z, int lvl);
void autoweaponchange(PLAYER& plr, int dagun);
void weaponchange(int snum);
void plrfireweapon(PLAYER& plr);
void weaponsprocess(int snum);
void shootgun(PLAYER& plr, float ang, int guntype);
boolean checkweapondist(int i, int x, int y, int z, int guntype);
void swingdapunch(PLAYER& plr, int daweapon);
void swingdaweapon(PLAYER& plr);
void swingdacrunch(PLAYER& plr, int daweapon);
void swingdasound(int daweapon, boolean enchanted);
boolean isItemSprite(int i);
void InitItems();
// spellbook
void activatedaorb(PLAYER& plr);
void castaorb(PLAYER& plr);
void spellswitch(PLAYER& plr, int j);
void bookprocess(int snum);
boolean changebook(PLAYER& plr, int i);
boolean lvlspellcheck(PLAYER& plr);
void speelbookprocess(PLAYER& plr);
void nukespell(PLAYER& plr, short j);
void medusa(PLAYER& plr, short j);
void displayspelltext(PLAYER& plr);
void orbpic(PLAYER& plr, int currentorb);
// potion
extern int potiontilenum;
void potiontext(PLAYER& plr);
void potionchange(int snum);
void usapotion(PLAYER& plr);
boolean potionspace(PLAYER& plr, int vial);
void updatepotion(PLAYER& plr, int vial);
void potionpic(PLAYER& plr, int currentpotion, int x, int y, int scale);
void randompotion(int i);
inline void showmessage(const char* msg, int)
{
Printf(PRINT_NOTIFY, "%s\n", GStrings(msg));
}
END_WH_NS

View file

@ -1,4 +1,4 @@
#include "ns.h"
#pragma once
BEGIN_WH_NS

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,853 @@
#include "ns.h"
#include "wh.h"
BEGIN_WH_NS
boolean nextlevel;
void loadnewlevel(int mapon) {
#if 0
MapInfo nextmap;
if(gCurrentEpisode != nullptr && (nextmap = gCurrentEpisode.getMap(mapon)) != nullptr) {
boardfilename = nextmap.path;
Console.Println("Entering level " + boardfilename);
nextlevel = true;
gGameScreen.loadboard(boardfilename, nullptr);
} else game.show();
#endif
}
void preparesectors() {
int endwall, j, k = 0, startwall;
int dax, day;
int dasector;
int dax2, day2;
for (int i = 0; i < numsectors; i++) {
ceilingshadearray[i] = sector[i].ceilingshade;
floorshadearray[i] = sector[i].floorshade;
if(isWh2()) {
if(mapon == 13)
{
auto& s = sector[i];
if(i == 209 && s.lotag == 62)
s.lotag = 0;
if(i == 435 && s.lotag == 0)
s.lotag = 62;
}
}
// if (sector[i].lotag == 100)
// spikesector[spikecnt++] = i;
if (sector[i].lotag == 70)
skypanlist[skypancnt++] = (short) i;
if (sector[i].lotag >= 80 && sector[i].lotag <= 89)
floorpanninglist[floorpanningcnt++] = (short) i;
if (sector[i].lotag >= 900 && sector[i].lotag <= 999) {
lavadrylandsector[lavadrylandcnt] = (short) i;
lavadrylandcnt++;
}
if (sector[i].lotag >= 2100 && sector[i].lotag <= 2199) {
startwall = sector[i].wallptr;
endwall = startwall + sector[i].wallnum - 1;
dax = 0;
day = 0;
for (j = startwall; j <= endwall; j++) {
dax += wall[j].x;
day += wall[j].y;
}
revolvepivotx[revolvecnt] = (int) (dax / (endwall - startwall + 1));
revolvepivoty[revolvecnt] = (int) (day / (endwall - startwall + 1));
k = 0;
for (j = startwall; j <= endwall; j++) {
revolvex[revolvecnt][k] = wall[j].x;
revolvey[revolvecnt][k] = wall[j].y;
k++;
}
revolvesector[revolvecnt] = (short) i;
revolveang[revolvecnt] = 0;
revolveclip[revolvecnt] = 1;
if (sector[i].ceilingz == sector[wall[startwall].nextsector].ceilingz)
revolveclip[revolvecnt] = 0;
revolvecnt++;
}
switch (sector[i].lotag) {
case 131:
case 132:
case 133:
case 134:
case DOORSWINGTAG:
startwall = sector[i].wallptr;
endwall = startwall + sector[i].wallnum - 1;
for (j = startwall; j <= endwall; j++) {
if (wall[j].lotag == 4) {
k = wall[wall[wall[wall[j].point2].point2].point2].point2;
if ((wall[j].x == wall[k].x) && (wall[j].y == wall[k].y)) {
swingdoor[swingcnt].wall[0] = j;
swingdoor[swingcnt].wall[1] = wall[j].point2;
swingdoor[swingcnt].wall[2] = wall[wall[j].point2].point2;
swingdoor[swingcnt].wall[3] = wall[wall[wall[j].point2].point2].point2;
swingdoor[swingcnt].angopen = 1536;
swingdoor[swingcnt].angclosed = 0;
swingdoor[swingcnt].angopendir = -1;
} else {
swingdoor[swingcnt].wall[0] = wall[j].point2;
swingdoor[swingcnt].wall[1] = j;
swingdoor[swingcnt].wall[2] = lastwall(j);
swingdoor[swingcnt].wall[3] = lastwall(swingdoor[swingcnt].wall[2]);
swingdoor[swingcnt].angopen = 512;
swingdoor[swingcnt].angclosed = 0;
swingdoor[swingcnt].angopendir = 1;
}
for (k = 0; k < 4; k++) {
swingdoor[swingcnt].x[k] = wall[swingdoor[swingcnt].wall[k]].x;
swingdoor[swingcnt].y[k] = wall[swingdoor[swingcnt].wall[k]].y;
}
swingdoor[swingcnt].sector = i;
swingdoor[swingcnt].ang = swingdoor[swingcnt].angclosed;
swingdoor[swingcnt].anginc = 0;
swingcnt++;
}
}
break;
case 11:
xpanningsectorlist[xpanningsectorcnt++] = (short) i;
break;
case 12:
dasector = i;
dax = 0x7fffffff;
day = 0x7fffffff;
dax2 = 0x80000000;
day2 = 0x80000000;
startwall = sector[i].wallptr;
endwall = startwall + sector[i].wallnum - 1;
for (j = startwall; j <= endwall; j++) {
if (wall[j].x < dax)
dax = wall[j].x;
if (wall[j].y < day)
day = wall[j].y;
if (wall[j].x > dax2)
dax2 = wall[j].x;
if (wall[j].y > day2)
day2 = wall[j].y;
if (wall[j].lotag == 3)
k = j;
}
if (wall[k].x == dax)
dragxdir[dragsectorcnt] = -16;
if (wall[k].y == day)
dragydir[dragsectorcnt] = -16;
if (wall[k].x == dax2)
dragxdir[dragsectorcnt] = 16;
if (wall[k].y == day2)
dragydir[dragsectorcnt] = 16;
dasector = wall[startwall].nextsector;
dragx1[dragsectorcnt] = 0x7fffffff;
dragy1[dragsectorcnt] = 0x7fffffff;
dragx2[dragsectorcnt] = 0x80000000;
dragy2[dragsectorcnt] = 0x80000000;
startwall = sector[dasector].wallptr;
endwall = startwall + sector[dasector].wallnum - 1;
for (j = startwall; j <= endwall; j++) {
if (wall[j].x < dragx1[dragsectorcnt])
dragx1[dragsectorcnt] = wall[j].x;
if (wall[j].y < dragy1[dragsectorcnt])
dragy1[dragsectorcnt] = wall[j].y;
if (wall[j].x > dragx2[dragsectorcnt])
dragx2[dragsectorcnt] = wall[j].x;
if (wall[j].y > dragy2[dragsectorcnt])
dragy2[dragsectorcnt] = wall[j].y;
}
dragx1[dragsectorcnt] += (wall[sector[i].wallptr].x - dax);
dragy1[dragsectorcnt] += (wall[sector[i].wallptr].y - day);
dragx2[dragsectorcnt] -= (dax2 - wall[sector[i].wallptr].x);
dragy2[dragsectorcnt] -= (day2 - wall[sector[i].wallptr].y);
dragfloorz[dragsectorcnt] = sector[i].floorz;
dragsectorlist[dragsectorcnt++] = (short) i;
break;
case 10:
case 14:
// case 15:
// captureflag sector
case 4002:
warpsectorlist[warpsectorcnt++] = (short) i;
break;
case 10000:
bobbingsectorlist[bobbingsectorcnt++] = (short) i;
}
if (sector[i].floorpicnum == TELEPAD && sector[i].lotag == 0)
warpsectorlist[warpsectorcnt++] = (short) i;
if (sector[i].floorpicnum == FLOORMIRROR)
floormirrorsector[floormirrorcnt++] = (short) i;
}
ypanningwallcnt = 0;
for (int i = 0; i < numwalls; i++) {
wallshadearray[i] = wall[i].shade;
if (wall[i].lotag == 1) {
if (ypanningwallcnt < ypanningwalllist.length)
ypanningwalllist[ypanningwallcnt++] = (short) i;
}
}
// // Map starts out completed WH2 XXX
// // for(i=0;i<(MAXSECTORS>>3);i++) show2dsector[i] = 0xff;
// for(i=0;i<(MAXSECTORS>>3);i++) show2dsector[i] = 0x00;
// // for(i=0;i<(MAXWALLS>>3);i++) show2dwall[i] = 0xff;
// for(i=0;i<(MAXWALLS>>3);i++) show2dwall[i] = 0x00;
// // for(i=0;i<(MAXSPRITES>>3);i++) show2dsprite[i] = 0xff;
// for(i=0;i<(MAXSPRITES>>3);i++) show2dsprite[i] = 0x00;
}
boolean prepareboard(const char* fname) {
short i;
short treesize;
PLAYER plr = player[0];
srand(17);
BuildPos out = nullptr;
out = loadboard(fname);
plr.x = out.x;
plr.y = out.y;
plr.z = out.z;
plr.ang = out.ang;
plr.sector = out.sectnum;
// int ratcnt = 0;
swingcnt = 0;
xpanningsectorcnt = 0;
ypanningwallcnt = 0;
floorpanningcnt = 0;
// crushsectorcnt=0;
revolvecnt = 0;
warpsectorcnt = 0;
dragsectorcnt = 0;
ironbarscnt = 0;
bobbingsectorcnt = 0;
playertorch = 0;
damage_angvel = 0;
damage_svel = 0;
damage_vel = 0;
hours = 0;
minutes = 0;
seconds = 0;
fortieth = 0;
// goblinwarcnt = 0;
treasurescnt = 0;
treasuresfound = 0;
killcnt = 0;
kills = 0;
expgained = 0;
// numinterpolations=0;
// the new mirror code
floormirrorcnt = 0;
tilesizx[FLOORMIRROR] = 0;
tilesizy[FLOORMIRROR] = 0;
for (i = 0; i < ARROWCOUNTLIMIT; i++)
arrowsprite[i] = -1;
for (i = 0; i < THROWPIKELIMIT; i++)
throwpikesprite[i] = -1;
lavadrylandcnt = 0;
aiInit();
for (i = 0; i < MAXSPRITES; i++) { // setup sector effect options
if (sprite[i].statnum >= MAXSTATUS)
continue;
SPRITE& spr = sprite[i];
if(!isWh2() && mapon == 5 && i == 0 && spr.lotag == 0 && spr.hitag == 0) {
spr.lotag = 1;
spr.hitag = 34;
}
if (sprite[i].picnum == CONE) {
sparksx = sprite[i].x;
sparksy = sprite[i].y;
sparksz = sprite[i].z;
for (int j = 0; j < 10; j++) {
makesparks(i, 1);
}
for (int j = 10; j < 20; j++) {
makesparks(i, 2);
}
for (int j = 20; j < 30; j++) {
makesparks(i, 3);
}
sprite[i].cstat &= ~3;
sprite[i].cstat |= 0x8000;
sprite[i].clipdist = 4;
changespritestat(i, (short) 0);
sector[sprite[i].sectnum].lotag = 50;
sector[sprite[i].sectnum].hitag = sprite[i].hitag;
if (sector[sprite[i].sectnum].hitag == 0)
sector[sprite[i].sectnum].hitag = 1;
}
if ((spr.cstat & (16 + 32)) == (16 + 32))
spr.cstat &= ~(16 | 32);
// if (spr.picnum == RAT) {
// ratcnt++;
// if (ratcnt > 10)
// deletesprite((short) i);
// }
if (spr.picnum == SPAWN) {
deletesprite((short) i);
}
if (spr.picnum == TORCH) {
spr.cstat &= ~3;
changespritestat(i, TORCHLIGHT);
}
if (spr.picnum == STANDINTORCH || spr.picnum == BOWLOFFIRE) {
changespritestat(i, TORCHLIGHT);
}
if (spr.picnum == GLOW) {
changespritestat(i, GLOWLIGHT);
}
if (spr.picnum == SNDEFFECT) {
sector[spr.sectnum].extra = spr.lotag;
deletesprite((short) i);
}
if (spr.picnum == SNDLOOP) { // loop on
sector[spr.sectnum].extra = (short) (32768 | (spr.lotag << 1) | 1);
deletesprite((short) i);
}
if (spr.picnum == SNDLOOPOFF) { // loop off
sector[spr.sectnum].extra = (short) (32768 | (spr.lotag << 1));
deletesprite((short) i);
}
if (spr.lotag == 80) {
ironbarsector[ironbarscnt] = spr.sectnum;
ironbarsdone[ironbarscnt] = 0;
ironbarsanim[ironbarscnt] = (short) i;
ironbarsgoal[ironbarscnt] = 0;
ironbarscnt++;
}
if(isWh2()) {
switch (spr.picnum) {
case WH2HELMET:
spr.detail = HELMETTYPE;
break;
case WH2PLATEARMOR:
spr.detail = PLATEARMORTYPE;
break;
case WH2CHAINMAIL:
spr.detail = CHAINMAILTYPE;
break;
case WH2LEATHERARMOR:
spr.detail = LEATHERARMORTYPE;
break;
case WH2PENTAGRAM:
spr.detail = PENTAGRAMTYPE;
break;
case WH2CRYSTALSTAFF:
spr.detail = CRYSTALSTAFFTYPE;
break;
case WH2AMULETOFTHEMIST:
spr.detail = AMULETOFTHEMISTTYPE;
break;
case WH2HORNEDSKULL:
spr.detail = HORNEDSKULLTYPE;
break;
case WH2THEHORN:
spr.detail = THEHORNTYPE;
break;
case WH2BRASSKEY:
spr.detail = BRASSKEYTYPE;
break;
case WH2BLACKKEY:
spr.detail = BLACKKEYTYPE;
break;
case WH2GLASSKEY:
spr.detail = GLASSKEYTYPE;
break;
case WH2IVORYKEY:
spr.detail = IVORYKEYTYPE;
break;
case WH2SCROLLSCARE:
spr.detail = SCROLLSCARETYPE;
break;
case WH2SCROLLNIGHT:
spr.detail = SCROLLNIGHTTYPE;
break;
case WH2SCROLLFREEZE:
spr.detail = SCROLLFREEZETYPE;
break;
case WH2SCROLLMAGIC:
spr.detail = SCROLLMAGICTYPE;
break;
case WH2SCROLLOPEN:
spr.detail = SCROLLOPENTYPE;
break;
case WH2SCROLLFLY:
spr.detail = SCROLLFLYTYPE;
break;
case WH2SCROLLFIREBALL:
spr.detail = SCROLLFIREBALLTYPE;
break;
case WH2SCROLLNUKE:
spr.detail = SCROLLNUKETYPE;
break;
case WH2QUIVER:
spr.detail = QUIVERTYPE;
break;
case WALLBOW:
case WH2BOW:
spr.detail = BOWTYPE;
break;
case WH2WEAPON1:
spr.detail = WEAPON1TYPE;
break;
case WH2WEAPON1A:
spr.detail = WEAPON1ATYPE;
break;
case WH2GOBWEAPON:
spr.detail = GOBWEAPONTYPE;
break;
case WH2WEAPON2:
spr.detail = WEAPON2TYPE;
break;
case WALLAXE:
case WH2WEAPON4:
spr.detail = WEAPON4TYPE;
break;
case WH2THROWHALBERD:
spr.detail = THROWHALBERDTYPE;
break;
case WH2WEAPON5:
spr.detail = WEAPON5TYPE;
break;
case WH2SHIELD:
spr.detail = SHIELDTYPE;
break;
case WH2WEAPON5B:
spr.detail = WEAPON5BTYPE;
break;
case WALLPIKE:
case WH2THROWPIKE + 1:
spr.detail = WALLPIKETYPE;
break;
case WH2WEAPON6:
spr.detail = WEAPON6TYPE;
break;
case WH2WEAPON7:
spr.detail = WEAPON7TYPE;
break;
case WEAPON8:
spr.detail = WEAPON8TYPE;
break;
}
} else {
switch (spr.picnum) {
case WH1HELMET:
spr.detail = HELMETTYPE;
break;
case WH1PLATEARMOR:
spr.detail = PLATEARMORTYPE;
break;
case WH1CHAINMAIL:
spr.detail = CHAINMAILTYPE;
break;
case WH1LEATHERARMOR:
spr.detail = LEATHERARMORTYPE;
break;
case WH1PENTAGRAM:
spr.detail = PENTAGRAMTYPE;
break;
case WH1CRYSTALSTAFF:
spr.detail = CRYSTALSTAFFTYPE;
break;
case WH1AMULETOFTHEMIST:
spr.detail = AMULETOFTHEMISTTYPE;
break;
case WH1HORNEDSKULL:
spr.detail = HORNEDSKULLTYPE;
break;
case WH1THEHORN:
spr.detail = THEHORNTYPE;
break;
case WH1BRASSKEY:
spr.detail = BRASSKEYTYPE;
break;
case WH1BLACKKEY:
spr.detail = BLACKKEYTYPE;
break;
case WH1GLASSKEY:
spr.detail = GLASSKEYTYPE;
break;
case WH1IVORYKEY:
spr.detail = IVORYKEYTYPE;
break;
case WH1SCROLLSCARE:
spr.detail = SCROLLSCARETYPE;
break;
case WH1SCROLLNIGHT:
spr.detail = SCROLLNIGHTTYPE;
break;
case WH1SCROLLFREEZE:
spr.detail = SCROLLFREEZETYPE;
break;
case WH1SCROLLMAGIC:
spr.detail = SCROLLMAGICTYPE;
break;
case WH1SCROLLOPEN:
spr.detail = SCROLLOPENTYPE;
break;
case WH1SCROLLFLY:
spr.detail = SCROLLFLYTYPE;
break;
case WH1SCROLLFIREBALL:
spr.detail = SCROLLFIREBALLTYPE;
break;
case WH1SCROLLNUKE:
spr.detail = SCROLLNUKETYPE;
break;
case WH1QUIVER:
spr.detail = QUIVERTYPE;
break;
case WALLBOW:
case WH1BOW:
spr.detail = BOWTYPE;
break;
case WH1WEAPON1:
spr.detail = WEAPON1TYPE;
break;
case WH1WEAPON1A:
spr.detail = WEAPON1ATYPE;
break;
case WH1GOBWEAPON:
spr.detail = GOBWEAPONTYPE;
break;
case WH1WEAPON2:
spr.detail = WEAPON2TYPE;
break;
case WALLAXE:
case WH1WEAPON4:
spr.detail = WEAPON4TYPE;
break;
case WH1THROWHALBERD:
spr.detail = THROWHALBERDTYPE;
break;
case WH1WEAPON5:
spr.detail = WEAPON5TYPE;
break;
case WH1SHIELD:
spr.detail = SHIELDTYPE;
break;
case WH1WEAPON5B:
spr.detail = WEAPON5BTYPE;
break;
case WALLPIKE:
case WH1THROWPIKE + 1:
spr.detail = WALLPIKETYPE;
break;
case WH1WEAPON6:
spr.detail = WEAPON6TYPE;
break;
case WH1WEAPON7:
spr.detail = WEAPON7TYPE;
break;
}
}
switch (spr.picnum) {
case SILVERBAG:
case SILVERCOINS:
spr.detail = SILVERBAGTYPE;
break;
case GOLDBAG:
case GOLDBAG2:
case GOLDCOINS:
case GOLDCOINS2:
spr.detail = GOLDBAGTYPE;
break;
case GIFTBOX:
spr.detail = GIFTBOXTYPE;
break;
case FLASKBLUE:
spr.detail = FLASKBLUETYPE;
break;
case FLASKRED:
spr.detail = FLASKREDTYPE;
break;
case FLASKGREEN:
spr.detail = FLASKGREENTYPE;
break;
case FLASKOCHRE:
spr.detail = FLASKOCHRETYPE;
break;
case FLASKTAN:
spr.detail = FLASKTANTYPE;
break;
case DIAMONDRING:
spr.detail = DIAMONDRINGTYPE;
break;
case SHADOWAMULET:
spr.detail = SHADOWAMULETTYPE;
break;
case GLASSSKULL:
spr.detail = GLASSSKULLTYPE;
break;
case AHNK:
spr.detail = AHNKTYPE;
break;
case BLUESCEPTER:
spr.detail = BLUESCEPTERTYPE;
break;
case YELLOWSCEPTER:
spr.detail = YELLOWSCEPTERTYPE;
break;
case ADAMANTINERING:
spr.detail = ADAMANTINERINGTYPE;
break;
case ONYXRING:
spr.detail = ONYXRINGTYPE;
break;
case SAPHIRERING:
spr.detail = SAPHIRERINGTYPE;
break;
case WALLSWORD:
case WEAPON3A:
spr.detail = WEAPON3ATYPE;
break;
case WEAPON3:
spr.detail = WEAPON3TYPE;
break;
case GONZOBSHIELD:
case GONZOCSHIELD:
case GONZOGSHIELD:
spr.detail = GONZOSHIELDTYPE;
break;
case SPIKEBLADE:
spr.detail = SPIKEBLADETYPE;
break;
case SPIKE:
spr.detail = SPIKETYPE;
break;
case SPIKEPOLE:
spr.detail = SPIKEPOLETYPE;
break;
case MONSTERBALL:
spr.detail = MONSTERBALLTYPE;
break;
case WH1HANGMAN + 1:
case WH2HANGMAN + 1:
if ((spr.picnum == (WH1HANGMAN + 1) && isWh2()) || (spr.picnum == WH2HANGMAN + 1 && !isWh2()))
break;
spr.xrepeat = 28;
spr.yrepeat = 28;
break;
case GOBLINDEAD:
if (isWh2())
break;
spr.xrepeat = 36;
spr.yrepeat = 36;
break;
case STONEGONZOBSH:
case STONEGONZOBSW2:
case STONEGONZOCHM:
case STONEGONZOGSH:
case STONEGRONDOVAL:
case STONEGONZOBSW:
spr.xrepeat = 24;
spr.yrepeat = 24;
break;
case GONZOHMJUMP:
case GONZOSHJUMP:
spr.xrepeat = 24;
spr.yrepeat = 24;
spr.clipdist = 32;
spr.extra = spr.lotag;
spr.lotag = 20;
if (spr.extra == 3) {
spr.lotag = 80;
}
spr.cstat |= 0x101;
break;
case PINE:
spr.xrepeat = treesize = (short) (((krand() % 5) + 3) << 4);
spr.yrepeat = treesize;
break;
case GYSER:
if (isWh2()) break;
spr.xrepeat = 32;
spr.yrepeat = 18;
spr.shade = -17;
spr.pal = 0;
spr.detail = GYSERTYPE;
// changespritestat(i,DORMANT);
break;
case PATROLPOINT:
spr.xrepeat = 24;
spr.yrepeat = 32;
spr.cstat &= ~3;
spr.cstat |= 0x8000;
spr.clipdist = 4;
changespritestat(i, APATROLPOINT);
break;
case BARREL:
case VASEA:
case VASEB:
case VASEC:
case STAINGLASS1:
case STAINGLASS2:
case STAINGLASS3:
case STAINGLASS4:
case STAINGLASS5:
case STAINGLASS6:
case STAINGLASS7:
case STAINGLASS8:
case STAINGLASS9:
spr.cstat |= 0x101;
spr.clipdist = 64;
break;
case 2232: // team flags
if (!isWh2())
break;
// netmarkflag(i);
break;
case 2233: // team flags
if (isWh2())
break;
// XXX netmarkflag(i);
break;
}
if(isItemSprite(i)) {
Item& item = items[(spr.detail & 0xFF) - ITEMSBASE];
if(item.sizx != -1 && item.sizy != -1) {
spr.xrepeat = (short) item.sizx;
spr.yrepeat = (short) item.sizy;
}
if(item.treasures)
treasurescnt++;
spr.cstat &= ~1;
if(item.cflag)
spr.cstat &= ~3;
}
}
preparesectors();
automapping = 1;
if(isWh2()) {
if(mapon == 5) {
SPRITE& spr = sprite[185];
if(spr.picnum == 172 && spr.x == -36864 && spr.y == -53504)
deletesprite((short) 185);
}
if(mapon == 13) {
if(sector[427].floorpicnum == 291) {
int s = insertsprite((short)427, (short)0);
if(s != -1) {
SPRITE& sp = sprite[s];
sp.x = 27136;
sp.y = 51712;
sp.z = 7168;
sp.picnum = WH2PENTAGRAM;
sp.cstat = 515;
sp.shade = -3;
sp.xrepeat = sp.yrepeat = 64;
}
}
}
}
if (justteleported) { // next level
plr.hvel = 0;
plr.spritenum = insertsprite(plr.sector, (short) 0);
plr.oldsector = plr.sector;
sprite[plr.spritenum].x = plr.x;
sprite[plr.spritenum].y = plr.y;
sprite[plr.spritenum].z = sector[plr.sector].floorz;
sprite[plr.spritenum].cstat = 1 + 256;
sprite[plr.spritenum].picnum = isWh2() ? GRONSW : FRED;
sprite[plr.spritenum].shade = 0;
sprite[plr.spritenum].xrepeat = 36;
sprite[plr.spritenum].yrepeat = 36;
sprite[plr.spritenum].ang = (short) plr.ang;
sprite[plr.spritenum].xvel = 0;
sprite[plr.spritenum].yvel = 0;
sprite[plr.spritenum].zvel = 0;
sprite[plr.spritenum].owner = (short) (4096 + myconnectindex);
sprite[plr.spritenum].lotag = 0;
sprite[plr.spritenum].hitag = 0;
sprite[plr.spritenum].pal = (short) (isWh2() ? 10 : 1);
if(isWh2())
sprite[plr.spritenum].clipdist = 48;
setsprite(plr.spritenum, plr.x, plr.y, plr.z + (getPlayerHeight() << 8));
warpfxsprite(plr.spritenum);
plr.treasure[TBRASSKEY] = plr.treasure[TBLACKKEY] = plr.treasure[TGLASSKEY] = plr.treasure[TIVORYKEY] = 0;
plr.treasure[TBLUESCEPTER] = plr.treasure[TYELLOWSCEPTER] = 0;
// protection from missile
// anit-missile for level only
// dont forget to cleanup values
plr.treasure[TONYXRING] = 0;
SND_CheckLoops();
justteleported = false;
} else {
initplayersprite(plr);
dimension = 3;
SND_Sound(S_SCARYDUDE);
}
if (nextlevel) {
gAutosaveRequest = true;
nextlevel = false;
}
if (mUserFlag != UserFlag.UserMap)
startmusic(mapon - 1);
return true;
}
END_WH_NS

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,601 @@
#include "ns.h"
#include "wh.h"
BEGIN_WH_NS
PLAYER player[MAXPLAYERS];
PLOCATION gPrevPlayerLoc[MAXPLAYERS];
short monsterangle[MAXSPRITESONSCREEN], monsterlist[MAXSPRITESONSCREEN];
int shootgunzvel;
boolean justteleported;
int victor = 0;
int autohoriz = 0; // XXX NOT FOR MULTIPLAYER
int pyrn;
int mapon;
int damage_vel, damage_svel, damage_angvel;
void viewBackupPlayerLoc( int nPlayer )
{
SPRITE& pSprite = sprite[player[nPlayer].spritenum];
PLOCATION pPLocation = gPrevPlayerLoc[nPlayer];
pPLocation.x = pSprite.x;
pPLocation.y = pSprite.y;
pPLocation.z = player[nPlayer].z;
pPLocation.ang = player[nPlayer].ang;
pPLocation.horiz = player[nPlayer].horiz + player[nPlayer].jumphoriz;
}
void playerdead(PLAYER& plr) {
if (plr.dead)
return;
if (plr.potion[0] > 0 && plr.spiked == 0) {
int i = plr.currentpotion;
plr.currentpotion = 0;
usapotion(plr);
plr.currentpotion = i;
return;
}
plr.currspikeframe = 0;
if (plr.spiked == 1) {
plr.spiketics = spikeanimtics[0].daweapontics;
playsound_loc(S_GORE1, plr.x, plr.y);
SND_Sound(S_HEARTBEAT);
}
SND_Sound(S_PLRDIE1);
// netsendmove();
plr.dead = true;
}
void initplayersprite(PLAYER& plr) {
if (difficulty > 1) {
plr.currweapon = 1;
plr.selectedgun = 1;
} else {
plr.currweapon = 4;
plr.selectedgun = 4;
}
plr.currentpotion = 0;
plr.helmettime = -1;
plr.shadowtime = -1;
plr.nightglowtime = -1;
plr.strongtime = -1;
plr.invisibletime = -1;
plr.manatime = -1;
plr.currentorb = 0;
plr.currweaponfired = 3;
plr.currweaponanim = 0;
plr.currweaponattackstyle = 0;
plr.currweaponflip = 0;
plr.vampiretime = 0;
plr.shieldpoints = 0;
plr.shieldtype = 0;
plr.dead = false;
plr.spiked = 0;
plr.shockme = -1;
plr.poisoned = 0;
plr.poisontime = -1;
plr.oldsector = plr.sector;
plr.horiz = 100;
plr.height = getPlayerHeight();
plr.z = sector[plr.sector].floorz - (plr.height << 8);
plr.spritenum = (short) insertsprite(plr.sector, (short) 0);
plr.onsomething = 1;
sprite[plr.spritenum].x = plr.x;
sprite[plr.spritenum].y = plr.y;
sprite[plr.spritenum].z = plr.z + (plr.height << 8);
sprite[plr.spritenum].cstat = 1 + 256;
sprite[plr.spritenum].picnum = isWh2() ? GRONSW : FRED;
sprite[plr.spritenum].shade = 0;
sprite[plr.spritenum].xrepeat = 36;
sprite[plr.spritenum].yrepeat = 36;
sprite[plr.spritenum].ang = (short) plr.ang;
sprite[plr.spritenum].xvel = 0;
sprite[plr.spritenum].yvel = 0;
sprite[plr.spritenum].zvel = 0;
sprite[plr.spritenum].owner = (short) (4096 + myconnectindex);
sprite[plr.spritenum].lotag = 0;
sprite[plr.spritenum].hitag = 0;
sprite[plr.spritenum].pal = (short) (isWh2() ? 10 : 1);
if(isWh2())
sprite[plr.spritenum].clipdist = 48;
plr.selectedgun = 0;
if(isWh2()) {
for (int i = 0; i <= 9; i++) {
if (i < 5) {
plr.ammo[i] = 40;
plr.weapon[i] = 1;
} else {
plr.ammo[i] = 0;
plr.weapon[i] = 0;
}
if (i < 8) {
plr.orb[i] = 0;
plr.orbammo[i] = 0;
}
}
if (difficulty > 1) {
plr.weapon[0] = plr.weapon[1] = 1;
plr.ammo[0] = 32000;
plr.ammo[1] = 45;
}
} else {
if (difficulty > 1) {
for (int i = 0; i <= 9; i++) {
plr.ammo[i] = 0;
plr.weapon[i] = 0;
if (i < 8) {
plr.orb[i] = 0;
plr.orbammo[i] = 0;
}
}
plr.weapon[0] = plr.weapon[1] = 1;
plr.ammo[0] = 32000;
plr.ammo[1] = 45;
} else {
for (int i = 0; i <= 9; i++) {
plr.ammo[i] = 0;
plr.weapon[i] = 0;
if (i < 5) {
plr.ammo[i] = 40;
plr.weapon[i] = 1;
}
if (i < 8) {
plr.orb[i] = 0;
plr.orbammo[i] = 0;
}
}
}
}
for (int i = 0; i < MAXPOTIONS; i++)
plr.potion[i] = 0;
for (int i = 0; i < MAXTREASURES; i++)
plr.treasure[i] = 0;
plr.lvl = 1;
plr.score = 0;
plr.health = 100;
plr.maxhealth = 100;
plr.armor = 0;
plr.armortype = 0;
plr.currentorb = 0;
plr.currentpotion = 0;
if (difficulty > 1)
plr.currweapon = plr.selectedgun = 1;
else
plr.currweapon = plr.selectedgun = 4;
if (isWh2()) {
plr.potion[0] = 3;
plr.potion[3] = 1;
plr.currweapon = plr.selectedgun = 4;
}
plr.currweaponfired = 3;
plr.currweaponflip = 0;
for (int i = 0; i < MAXNUMORBS; i++)
plr.orbactive[i] = -1;
lockclock = totalclock;
playertorch = 0;
plr.spellbookflip = 0;
plr.invincibletime = plr.manatime = -1;
plr.hasshot = 0;
plr.orbshot = 0;
displaytime = -1;
plr.shadowtime = -1;
plr.helmettime = -1;
plr.nightglowtime = -1;
plr.strongtime = -1;
plr.invisibletime = -1;
}
void updateviewmap(PLAYER& plr) {
int i;
if ((i = plr.sector) > -1) {
int wallid = sector[i].wallptr;
show2dsector[i >> 3] |= (1 << (i & 7));
for (int j = sector[i].wallnum; j > 0; j--) {
WALL wal = wall[wallid++];
i = wal.nextsector;
if (i < 0)
continue;
if ((wal.cstat & 0x0071) != 0)
continue;
if (wall[wal.nextwall] != nullptr && (wall[wal.nextwall].cstat & 0x0071) != 0)
continue;
if (sector[i] != nullptr && sector[i].ceilingz >= sector[i].floorz)
continue;
show2dsector[i >> 3] |= (1 << (i & 7));
}
}
}
void plruse(PLAYER& plr) {
neartag(plr.x, plr.y, plr.z, (short) plr.sector, (short) plr.ang, neartag, 1024, 3);
if (neartag.tagsector >= 0) {
if (sector[neartag.tagsector].hitag == 0) {
operatesector(plr, neartag.tagsector);
} else {
short daang = (short) plr.ang;
int daz2 = (int) (100 - plr.horiz) * 2000;
hitscan(plr.x, plr.y, plr.z, plr.sector, // Start position
sintable[(daang + 2560) & 2047], // X vector of 3D ang
sintable[(daang + 2048) & 2047], // Y vector of 3D ang
daz2, // Z vector of 3D ang
pHitInfo, CLIPMASK1);
if (pHitInfo.hitwall >= 0) {
if ((klabs(plr.x - pHitInfo.hitx) + klabs(plr.y - pHitInfo.hity) < 512)
&& (klabs((plr.z >> 8) - ((pHitInfo.hitz >> 8) - (64))) <= (512 >> 3))) {
int pic = wall[pHitInfo.hitwall].picnum;
if(pic == PENTADOOR1 || pic == PENTADOOR2 || (pic >= PENTADOOR3 && pic <= PENTADOOR7))
showmessage("find door trigger", 360);
}
}
playsound_loc(S_PUSH1 + (krand() % 2), plr.x, plr.y);
}
}
if (neartag.tagsprite >= 0) {
if (sprite[neartag.tagsprite].lotag == 1) {
if(sprite[neartag.tagsprite].picnum == PULLCHAIN1 || sprite[neartag.tagsprite].picnum == SKULLPULLCHAIN1) {
sprite[neartag.tagsprite].lotag = 0;
newstatus(neartag.tagsprite, PULLTHECHAIN);
} else if(sprite[neartag.tagsprite].picnum == LEVERUP) {
sprite[neartag.tagsprite].lotag = 0;
newstatus(neartag.tagsprite, ANIMLEVERUP);
}
for (int i = 0; i < numsectors; i++)
if (sector[i].hitag == sprite[neartag.tagsprite].hitag)
operatesector(plr, i);
} else
operatesprite(plr, neartag.tagsprite);
}
}
void chunksofmeat(PLAYER& plr, int hitsprite, int hitx, int hity, int hitz, short hitsect, int daang) {
int j;
short k;
short zgore = 0;
int chunk = REDCHUNKSTART;
int newchunk;
if (!whcfg.gGameGore)
return;
if (sprite[hitsprite].picnum == JUDY || sprite[hitsprite].picnum == JUDYATTACK1
|| sprite[hitsprite].picnum == JUDYATTACK2)
return;
switch (plr.selectedgun) {
case 1:
case 2:
zgore = 1;
break;
case 3:
case 4:
zgore = 2;
break;
case 5:
zgore = 3;
break;
case 6:
zgore = 1;
break;
case 7:
zgore = 2;
break;
case 8:
case 9:
zgore = 3;
break;
}
if (sprite[hitsprite].statnum == NUKED) {
zgore = 32;
}
if (sprite[hitsprite].picnum == RAT)
zgore = 1;
if (sprite[hitsprite].picnum == WILLOW || sprite[hitsprite].picnum == WILLOWEXPLO
|| sprite[hitsprite].picnum == WILLOWEXPLO + 1 || sprite[hitsprite].picnum == WILLOWEXPLO + 2
|| sprite[hitsprite].picnum == GUARDIAN || sprite[hitsprite].picnum == GUARDIANATTACK
|| sprite[hitsprite].picnum == DEMON)
return;
if (sprite[hitsprite].picnum == SKELETON || sprite[hitsprite].picnum == SKELETONATTACK
|| sprite[hitsprite].picnum == SKELETONDIE) {
playsound_loc(S_SKELHIT1 + (krand() % 2), sprite[hitsprite].x, sprite[hitsprite].y);
} else {
if (krand() % 100 > 60)
playsound_loc(S_GORE1 + (krand() % 4), sprite[hitsprite].x, sprite[hitsprite].y);
}
if ((hitsprite >= 0) && (sprite[hitsprite].statnum < MAXSTATUS)) {
for (k = 0; k < zgore; k++) {
newchunk = 0;
j = insertsprite(hitsect, CHUNKOMEAT);
if(j == -1)
return;
sprite[j].x = hitx;
sprite[j].y = hity;
sprite[j].z = hitz;
sprite[j].cstat = 0;
if (krand() % 100 > 50) {
switch (sprite[hitsprite].detail) {
case GRONTYPE:
chunk = REDCHUNKSTART + (krand() % 8);
break;
case KOBOLDTYPE:
if (sprite[hitsprite].pal == 0)
chunk = BROWNCHUNKSTART + (krand() % 8);
if (sprite[hitsprite].pal == 4)
chunk = GREENCHUNKSTART + (krand() % 8);
if (sprite[hitsprite].pal == 7)
chunk = REDCHUNKSTART + (krand() % 8);
break;
case DRAGONTYPE:
chunk = GREENCHUNKSTART + (krand() % 8);
break;
case DEVILTYPE:
chunk = REDCHUNKSTART + (krand() % 8);
break;
case FREDTYPE:
chunk = BROWNCHUNKSTART + (krand() % 8);
break;
case GOBLINTYPE:
case IMPTYPE:
if(isWh2() && (sprite[hitsprite].picnum == IMP || sprite[hitsprite].picnum == IMPATTACK)) {
if (sprite[hitsprite].pal == 0)
chunk = GREENCHUNKSTART + (krand() % 8);
} else {
if (sprite[hitsprite].pal == 0)
chunk = GREENCHUNKSTART + (krand() % 8);
if (sprite[hitsprite].pal == 4)
chunk = BROWNCHUNKSTART + (krand() % 8);
if (sprite[hitsprite].pal == 5)
chunk = TANCHUNKSTART + (krand() % 8);
}
break;
case MINOTAURTYPE:
chunk = TANCHUNKSTART + (krand() % 8);
break;
case SPIDERTYPE:
chunk = GREYCHUNKSTART + (krand() % 8);
break;
case SKULLYTYPE:
case FATWITCHTYPE:
case JUDYTYPE:
chunk = REDCHUNKSTART + (krand() % 8);
break;
}
} else {
newchunk = 1;
if (!isWh2())
chunk = NEWCHUNK + (krand() % 9);
else
chunk = REDCHUNKSTART + (krand() % 8);
}
if (sprite[hitsprite].detail == SKELETONTYPE)
chunk = BONECHUNK1 + (krand() % 9);
if (plr.weapon[2] == 3 && plr.currweapon == 2) {
sprite[j].picnum = ARROWFLAME;
} else {
sprite[j].picnum = (short) chunk; // = REDCHUNKSTART + (rand() % 8);
}
sprite[j].shade = -16;
sprite[j].xrepeat = 64;
sprite[j].yrepeat = 64;
sprite[j].clipdist = 16;
sprite[j].ang = (short) (((krand() & 1023) - 1024) & 2047);
sprite[j].xvel = (short) ((krand() & 1023) - 512);
sprite[j].yvel = (short) ((krand() & 1023) - 512);
sprite[j].zvel = (short) ((krand() & 1023) - 512);
if (newchunk == 1)
sprite[j].zvel <<= 1;
sprite[j].owner = sprite[plr.spritenum].owner;
sprite[j].lotag = 512;
sprite[j].hitag = 0;
sprite[j].pal = 0;
movesprite((short) j, ((sintable[(sprite[j].ang + 512) & 2047]) * TICSPERFRAME) << 3,
((sintable[sprite[j].ang & 2047]) * TICSPERFRAME) << 3, 0, 4 << 8, 4 << 8, 0);
}
}
}
void addhealth(PLAYER& plr, int hp) {
if (plr.godMode && hp < 0)
return;
plr.health += hp;
if (plr.health < 0)
plr.health = 0;
}
void addarmor(PLAYER& plr, int arm) {
plr.armor += arm;
if (plr.armor < 0) {
plr.armor = 0;
plr.armortype = 0;
}
}
void addscore(PLAYER& plr, int score) {
if(plr == nullptr) return;
plr.score += score;
expgained += score;
goesupalevel(plr);
}
void goesupalevel(PLAYER& plr) {
if (isWh2())
goesupalevel2(plr);
else
goesupalevel1(plr);
}
void goesupalevel2(PLAYER& plr) {
switch (plr.lvl) {
case 0:
case 1:
if (plr.score > 9999) {
showmessage("thou art a warrior", 360);
plr.lvl = 2;
plr.maxhealth = 120;
}
break;
case 2:
if (plr.score > 19999) {
showmessage("thou art a swordsman", 360);
plr.lvl = 3;
plr.maxhealth = 140;
}
break;
case 3:
if (plr.score > 29999) {
showmessage("thou art a hero", 360);
plr.lvl = 4;
plr.maxhealth = 160;
}
break;
case 4:
if (plr.score > 39999) {
showmessage("thou art a champion", 360);
plr.lvl = 5;
plr.maxhealth = 180;
}
break;
case 5:
if (plr.score > 49999) {
showmessage("thou art a superhero", 360);
plr.lvl = 6;
plr.maxhealth = 200;
}
break;
case 6:
if (plr.score > 59999) {
showmessage("thou art a lord", 360);
plr.lvl = 7;
}
}
}
void goesupalevel1(PLAYER& plr) {
if (plr.score > 2250 && plr.score < 4499 && plr.lvl < 2) {
showmessage("thou art 2nd level", 360);
plr.lvl = 2;
plr.maxhealth = 120;
} else if (plr.score > 4500 && plr.score < 8999 && plr.lvl < 3) {
showmessage("thou art 3rd level", 360);
plr.lvl = 3;
plr.maxhealth = 140;
} else if (plr.score > 9000 && plr.score < 17999 && plr.lvl < 4) {
showmessage("thou art 4th level", 360);
plr.lvl = 4;
plr.maxhealth = 160;
} else if (plr.score > 18000 && plr.score < 35999 && plr.lvl < 5) {
showmessage("thou art 5th level", 360);
plr.lvl = 5;
plr.maxhealth = 180;
} else if (plr.score > 36000 && plr.score < 74999 && plr.lvl < 6) {
showmessage("thou art 6th level", 360);
plr.lvl = 6;
plr.maxhealth = 200;
} else if (plr.score > 75000 && plr.score < 179999 && plr.lvl < 7) {
showmessage("thou art 7th level", 360);
plr.lvl = 7;
} else if (plr.score > 180000 && plr.score < 279999 && plr.lvl < 8) {
showmessage("thou art 8th level", 360);
plr.lvl = 8;
} else if (plr.score > 280000 && plr.score < 379999 && plr.lvl < 9) {
showmessage("thou art hero", 360);
plr.lvl = 9;
}
}
void lockon(PLAYER& plr, int numshots, int shootguntype) {
short daang, i, k, n = 0, s;
SPRITE spr;
for (i = 0; i < tspritelistcnt && n < numshots; i++) {
spr = tspritelist[i];
if (cansee(plr.x, plr.y, plr.z, plr.sector, spr.x, spr.y, spr.z - (tilesizy[spr.picnum] << 7),
spr.sectnum)) {
switch (spr.detail) {
case KOBOLDTYPE:
case DEVILTYPE:
case IMPTYPE:
case MINOTAURTYPE:
case SKELETONTYPE:
case GRONTYPE:
case DEMONTYPE:
case GUARDIANTYPE:
case WILLOWTYPE:
case NEWGUYTYPE:
case KURTTYPE:
case GONZOTYPE:
case KATIETYPE:
monsterangle[n] = getangle(tspritelist[i].x - plr.x, tspritelist[i].y - plr.y);
monsterlist[n] = i;
n++;
break;
}
}
}
daang = (short) (plr.ang - ((numshots * (128 / numshots)) >> 1));
for (k = 0, s = 0; k < numshots; k++) {
if (n > 0) {
spr = tspritelist[monsterlist[s]];
daang = monsterangle[s];
shootgunzvel = ((spr.z - (48 << 8) - plr.z) << 8)
/ ksqrt((spr.x - plr.x) * (spr.x - plr.x) + (spr.y - plr.y) * (spr.y - plr.y));
s = (short) ((s + 1) % n);
} else {
daang += (128 / numshots);
}
shootgun(plr, daang, shootguntype);
}
}
int getPlayerHeight()
{
return isWh2() ? WH2PLAYERHEIGHT : PLAYERHEIGHT;
}
}

File diff suppressed because it is too large Load diff