mirror of
https://github.com/ZDoom/qzdoom.git
synced 2025-01-31 04:50:48 +00:00
- Fixed: Friendly spectral monsters should be able to hurt unfriendly ones
and vice versa. - Fixed: In deathmatch specral missiles spawned by players should hurt other players. - Fixed: SpectralLightningBigBall didn't set the proper owner for the lightning projectiles it spawned. - Changed the EntityBoss's attack function to call the equivalent spectre functions instead of duplicating their code. - Gave many of Strife's code pointers that only had a number as name more meaningful names. - Fixed: All spectral attacks must set 'health' first before P_CheckMissileSpawn is called. SVN r1071 (trunk)
This commit is contained in:
parent
d0031b7fe7
commit
c4a1ca2ac8
9 changed files with 161 additions and 162 deletions
|
@ -1,4 +1,16 @@
|
||||||
July 12, 2008 (Changes by Graf Zahl)
|
July 12, 2008 (Changes by Graf Zahl)
|
||||||
|
- Fixed: Friendly spectral monsters should be able to hurt unfriendly ones
|
||||||
|
and vice versa.
|
||||||
|
- Fixed: In deathmatch specral missiles spawned by players should hurt other
|
||||||
|
players.
|
||||||
|
- Fixed: SpectralLightningBigBall didn't set the proper owner for the lightning
|
||||||
|
projectiles it spawned.
|
||||||
|
- Changed the EntityBoss's attack function to call the equivalent spectre
|
||||||
|
functions instead of duplicating their code.
|
||||||
|
- Gave many of Strife's code pointers that only had a number as name more
|
||||||
|
meaningful names.
|
||||||
|
- Fixed: All spectral attacks must set 'health' first before P_CheckMissileSpawn
|
||||||
|
is called.
|
||||||
- Added a compatibility option to play sector sounds from the precalculated
|
- Added a compatibility option to play sector sounds from the precalculated
|
||||||
center because some maps apparently abuse the behavior to make the sound
|
center because some maps apparently abuse the behavior to make the sound
|
||||||
play somewhere where it can't be heard by the player to fake silent movement.
|
play somewhere where it can't be heard by the player to fake silent movement.
|
||||||
|
|
|
@ -10,17 +10,17 @@
|
||||||
#include "gstrings.h"
|
#include "gstrings.h"
|
||||||
|
|
||||||
static FRandom pr_spectrespawn ("AlienSpectreSpawn");
|
static FRandom pr_spectrespawn ("AlienSpectreSpawn");
|
||||||
static FRandom pr_212e4 ("212e4");
|
static FRandom pr_spectrechunk ("212e4");
|
||||||
|
|
||||||
void A_SentinelBob (AActor *);
|
void A_SentinelBob (AActor *);
|
||||||
void A_20538 (AActor *);
|
void A_SpectreMelee (AActor *);
|
||||||
void A_SpotLightning (AActor *);
|
void A_SpotLightning (AActor *);
|
||||||
void A_212e4 (AActor *);
|
void A_SpectreChunkSmall (AActor *);
|
||||||
void A_2134c (AActor *);
|
void A_SpectreChunkLarge (AActor *);
|
||||||
void A_204d0 (AActor *);
|
void A_Spectre2Attack (AActor *);
|
||||||
void A_204a4 (AActor *);
|
void A_Spectre4Attack (AActor *);
|
||||||
void A_20314 (AActor *);
|
void A_Spectre5Attack (AActor *);
|
||||||
void A_20334 (AActor *);
|
void A_Spectre3Attack (AActor *);
|
||||||
void A_AlienSpectreDeath (AActor *);
|
void A_AlienSpectreDeath (AActor *);
|
||||||
|
|
||||||
void A_AlertMonsters (AActor *);
|
void A_AlertMonsters (AActor *);
|
||||||
|
@ -51,7 +51,7 @@ FState AAlienSpectre1::States[] =
|
||||||
|
|
||||||
#define S_ALIEN_MELEE (S_ALIEN_CHASE+11) // 809
|
#define S_ALIEN_MELEE (S_ALIEN_CHASE+11) // 809
|
||||||
S_BRIGHT (ALN1, 'J', 4, A_FaceTarget, &States[S_ALIEN_MELEE+1]),
|
S_BRIGHT (ALN1, 'J', 4, A_FaceTarget, &States[S_ALIEN_MELEE+1]),
|
||||||
S_BRIGHT (ALN1, 'I', 4, A_20538, &States[S_ALIEN_MELEE+2]),
|
S_BRIGHT (ALN1, 'I', 4, A_SpectreMelee, &States[S_ALIEN_MELEE+2]),
|
||||||
S_BRIGHT (ALN1, 'H', 4, NULL, &States[S_ALIEN_CHASE+2]),
|
S_BRIGHT (ALN1, 'H', 4, NULL, &States[S_ALIEN_CHASE+2]),
|
||||||
|
|
||||||
#define S_ALIEN_MISSILE (S_ALIEN_MELEE+3) // 812
|
#define S_ALIEN_MISSILE (S_ALIEN_MELEE+3) // 812
|
||||||
|
@ -63,20 +63,20 @@ FState AAlienSpectre1::States[] =
|
||||||
S_NORMAL (ALN1, 'J', 2, A_Pain, &States[S_ALIEN_CHASE+6]),
|
S_NORMAL (ALN1, 'J', 2, A_Pain, &States[S_ALIEN_CHASE+6]),
|
||||||
|
|
||||||
#define S_ALIEN_DIE (S_ALIEN_PAIN+1) // 816
|
#define S_ALIEN_DIE (S_ALIEN_PAIN+1) // 816
|
||||||
S_BRIGHT (AL1P, 'A', 6, A_212e4, &States[S_ALIEN_DIE+1]),
|
S_BRIGHT (AL1P, 'A', 6, A_SpectreChunkSmall, &States[S_ALIEN_DIE+1]),
|
||||||
S_BRIGHT (AL1P, 'B', 6, A_Scream, &States[S_ALIEN_DIE+2]),
|
S_BRIGHT (AL1P, 'B', 6, A_Scream, &States[S_ALIEN_DIE+2]),
|
||||||
S_BRIGHT (AL1P, 'C', 6, A_212e4, &States[S_ALIEN_DIE+3]),
|
S_BRIGHT (AL1P, 'C', 6, A_SpectreChunkSmall, &States[S_ALIEN_DIE+3]),
|
||||||
S_BRIGHT (AL1P, 'D', 6, NULL, &States[S_ALIEN_DIE+4]),
|
S_BRIGHT (AL1P, 'D', 6, NULL, &States[S_ALIEN_DIE+4]),
|
||||||
S_BRIGHT (AL1P, 'E', 6, NULL, &States[S_ALIEN_DIE+5]),
|
S_BRIGHT (AL1P, 'E', 6, NULL, &States[S_ALIEN_DIE+5]),
|
||||||
S_BRIGHT (AL1P, 'F', 6, A_212e4, &States[S_ALIEN_DIE+6]),
|
S_BRIGHT (AL1P, 'F', 6, A_SpectreChunkSmall, &States[S_ALIEN_DIE+6]),
|
||||||
S_BRIGHT (AL1P, 'G', 6, NULL, &States[S_ALIEN_DIE+7]),
|
S_BRIGHT (AL1P, 'G', 6, NULL, &States[S_ALIEN_DIE+7]),
|
||||||
S_BRIGHT (AL1P, 'H', 6, A_212e4, &States[S_ALIEN_DIE+8]),
|
S_BRIGHT (AL1P, 'H', 6, A_SpectreChunkSmall, &States[S_ALIEN_DIE+8]),
|
||||||
S_BRIGHT (AL1P, 'I', 6, NULL, &States[S_ALIEN_DIE+9]),
|
S_BRIGHT (AL1P, 'I', 6, NULL, &States[S_ALIEN_DIE+9]),
|
||||||
S_BRIGHT (AL1P, 'J', 6, NULL, &States[S_ALIEN_DIE+10]),
|
S_BRIGHT (AL1P, 'J', 6, NULL, &States[S_ALIEN_DIE+10]),
|
||||||
S_BRIGHT (AL1P, 'K', 6, NULL, &States[S_ALIEN_DIE+11]),
|
S_BRIGHT (AL1P, 'K', 6, NULL, &States[S_ALIEN_DIE+11]),
|
||||||
S_BRIGHT (AL1P, 'L', 5, NULL, &States[S_ALIEN_DIE+12]),
|
S_BRIGHT (AL1P, 'L', 5, NULL, &States[S_ALIEN_DIE+12]),
|
||||||
S_BRIGHT (AL1P, 'M', 5, NULL, &States[S_ALIEN_DIE+13]),
|
S_BRIGHT (AL1P, 'M', 5, NULL, &States[S_ALIEN_DIE+13]),
|
||||||
S_BRIGHT (AL1P, 'N', 5, A_2134c, &States[S_ALIEN_DIE+14]),
|
S_BRIGHT (AL1P, 'N', 5, A_SpectreChunkLarge, &States[S_ALIEN_DIE+14]),
|
||||||
S_BRIGHT (AL1P, 'O', 5, NULL, &States[S_ALIEN_DIE+15]),
|
S_BRIGHT (AL1P, 'O', 5, NULL, &States[S_ALIEN_DIE+15]),
|
||||||
S_BRIGHT (AL1P, 'P', 5, NULL, &States[S_ALIEN_DIE+16]),
|
S_BRIGHT (AL1P, 'P', 5, NULL, &States[S_ALIEN_DIE+16]),
|
||||||
S_BRIGHT (AL1P, 'Q', 5, NULL, &States[S_ALIEN_DIE+17]),
|
S_BRIGHT (AL1P, 'Q', 5, NULL, &States[S_ALIEN_DIE+17]),
|
||||||
|
@ -84,17 +84,17 @@ FState AAlienSpectre1::States[] =
|
||||||
|
|
||||||
#define S_ALIEN2_MISSILE (S_ALIEN_DIE+18) // 852
|
#define S_ALIEN2_MISSILE (S_ALIEN_DIE+18) // 852
|
||||||
S_NORMAL (ALN1, 'F', 4, A_FaceTarget, &States[S_ALIEN2_MISSILE+1]),
|
S_NORMAL (ALN1, 'F', 4, A_FaceTarget, &States[S_ALIEN2_MISSILE+1]),
|
||||||
S_NORMAL (ALN1, 'I', 4, A_204d0, &States[S_ALIEN2_MISSILE+2]),
|
S_NORMAL (ALN1, 'I', 4, A_Spectre2Attack, &States[S_ALIEN2_MISSILE+2]),
|
||||||
S_NORMAL (ALN1, 'E', 4, NULL, &States[S_ALIEN_CHASE+10]),
|
S_NORMAL (ALN1, 'E', 4, NULL, &States[S_ALIEN_CHASE+10]),
|
||||||
|
|
||||||
#define S_ALIEN4_MISSILE (S_ALIEN2_MISSILE+3) // 884
|
#define S_ALIEN4_MISSILE (S_ALIEN2_MISSILE+3) // 884
|
||||||
S_NORMAL (ALN1, 'F', 4, A_FaceTarget, &States[S_ALIEN4_MISSILE+1]),
|
S_NORMAL (ALN1, 'F', 4, A_FaceTarget, &States[S_ALIEN4_MISSILE+1]),
|
||||||
S_NORMAL (ALN1, 'I', 4, A_204a4, &States[S_ALIEN4_MISSILE+2]),
|
S_NORMAL (ALN1, 'I', 4, A_Spectre4Attack, &States[S_ALIEN4_MISSILE+2]),
|
||||||
S_NORMAL (ALN1, 'E', 4, NULL, &States[S_ALIEN_CHASE+10]),
|
S_NORMAL (ALN1, 'E', 4, NULL, &States[S_ALIEN_CHASE+10]),
|
||||||
|
|
||||||
#define S_ALIEN5_MISSILE (S_ALIEN4_MISSILE+3) // 887
|
#define S_ALIEN5_MISSILE (S_ALIEN4_MISSILE+3) // 887
|
||||||
S_NORMAL (ALN1, 'F', 4, A_FaceTarget, &States[S_ALIEN5_MISSILE+1]),
|
S_NORMAL (ALN1, 'F', 4, A_FaceTarget, &States[S_ALIEN5_MISSILE+1]),
|
||||||
S_NORMAL (ALN1, 'I', 4, A_20314, &States[S_ALIEN5_MISSILE+2]),
|
S_NORMAL (ALN1, 'I', 4, A_Spectre5Attack, &States[S_ALIEN5_MISSILE+2]),
|
||||||
S_NORMAL (ALN1, 'E', 4, NULL, &States[S_ALIEN_CHASE])
|
S_NORMAL (ALN1, 'E', 4, NULL, &States[S_ALIEN_CHASE])
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -195,12 +195,12 @@ FState AAlienSpectre3::States[] =
|
||||||
|
|
||||||
#define S_ALIEN3_MELEE (S_ALIEN3_CHASE+11) // 877
|
#define S_ALIEN3_MELEE (S_ALIEN3_CHASE+11) // 877
|
||||||
S_NORMAL (ALN1, 'J', 4, A_FaceTarget, &States[S_ALIEN3_MELEE+1]),
|
S_NORMAL (ALN1, 'J', 4, A_FaceTarget, &States[S_ALIEN3_MELEE+1]),
|
||||||
S_NORMAL (ALN1, 'I', 4, A_20538, &States[S_ALIEN3_MELEE+2]),
|
S_NORMAL (ALN1, 'I', 4, A_SpectreMelee, &States[S_ALIEN3_MELEE+2]),
|
||||||
S_NORMAL (ALN1, 'C', 4, NULL, &States[S_ALIEN3_CHASE+2]),
|
S_NORMAL (ALN1, 'C', 4, NULL, &States[S_ALIEN3_CHASE+2]),
|
||||||
|
|
||||||
#define S_ALIEN3_MISSILE (S_ALIEN3_MELEE+3) // 880
|
#define S_ALIEN3_MISSILE (S_ALIEN3_MELEE+3) // 880
|
||||||
S_NORMAL (ALN1, 'F', 4, A_FaceTarget, &States[S_ALIEN3_MISSILE+1]),
|
S_NORMAL (ALN1, 'F', 4, A_FaceTarget, &States[S_ALIEN3_MISSILE+1]),
|
||||||
S_NORMAL (ALN1, 'I', 4, A_20334, &States[S_ALIEN3_MISSILE+2]),
|
S_NORMAL (ALN1, 'I', 4, A_Spectre3Attack, &States[S_ALIEN3_MISSILE+2]),
|
||||||
S_NORMAL (ALN1, 'E', 4, NULL, &States[S_ALIEN3_CHASE+10]),
|
S_NORMAL (ALN1, 'E', 4, NULL, &States[S_ALIEN3_CHASE+10]),
|
||||||
|
|
||||||
#define S_ALIEN3_PAIN (S_ALIEN3_MISSILE+3) // 883
|
#define S_ALIEN3_PAIN (S_ALIEN3_MISSILE+3) // 883
|
||||||
|
@ -371,7 +371,7 @@ void A_SpawnSpectre5 (AActor *actor)
|
||||||
GenericSpectreSpawn (actor, RUNTIME_CLASS(AAlienSpectre5));
|
GenericSpectreSpawn (actor, RUNTIME_CLASS(AAlienSpectre5));
|
||||||
}
|
}
|
||||||
|
|
||||||
void A_212e4 (AActor *self)
|
void A_SpectreChunkSmall (AActor *self)
|
||||||
{
|
{
|
||||||
AActor *foo = Spawn<AAlienChunkSmall> (self->x, self->y, self->z + 10*FRACUNIT, ALLOW_REPLACE);
|
AActor *foo = Spawn<AAlienChunkSmall> (self->x, self->y, self->z + 10*FRACUNIT, ALLOW_REPLACE);
|
||||||
|
|
||||||
|
@ -379,17 +379,17 @@ void A_212e4 (AActor *self)
|
||||||
{
|
{
|
||||||
int t;
|
int t;
|
||||||
|
|
||||||
t = pr_212e4() & 15;
|
t = pr_spectrechunk() & 15;
|
||||||
foo->momx = (t - (pr_212e4() & 7)) << FRACBITS;
|
foo->momx = (t - (pr_spectrechunk() & 7)) << FRACBITS;
|
||||||
|
|
||||||
t = pr_212e4() & 15;
|
t = pr_spectrechunk() & 15;
|
||||||
foo->momy = (t - (pr_212e4() & 7)) << FRACBITS;
|
foo->momy = (t - (pr_spectrechunk() & 7)) << FRACBITS;
|
||||||
|
|
||||||
foo->momz = (pr_212e4() & 15) << FRACBITS;
|
foo->momz = (pr_spectrechunk() & 15) << FRACBITS;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void A_2134c (AActor *self)
|
void A_SpectreChunkLarge (AActor *self)
|
||||||
{
|
{
|
||||||
AActor *foo = Spawn<AAlienChunkLarge> (self->x, self->y, self->z + 10*FRACUNIT, ALLOW_REPLACE);
|
AActor *foo = Spawn<AAlienChunkLarge> (self->x, self->y, self->z + 10*FRACUNIT, ALLOW_REPLACE);
|
||||||
|
|
||||||
|
@ -397,65 +397,61 @@ void A_2134c (AActor *self)
|
||||||
{
|
{
|
||||||
int t;
|
int t;
|
||||||
|
|
||||||
t = pr_212e4() & 7;
|
t = pr_spectrechunk() & 7;
|
||||||
foo->momx = (t - (pr_212e4() & 15)) << FRACBITS;
|
foo->momx = (t - (pr_spectrechunk() & 15)) << FRACBITS;
|
||||||
|
|
||||||
t = pr_212e4() & 7;
|
t = pr_spectrechunk() & 7;
|
||||||
foo->momy = (t - (pr_212e4() & 15)) << FRACBITS;
|
foo->momy = (t - (pr_spectrechunk() & 15)) << FRACBITS;
|
||||||
|
|
||||||
foo->momz = (pr_212e4() & 7) << FRACBITS;
|
foo->momz = (pr_spectrechunk() & 7) << FRACBITS;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void A_204a4 (AActor *self)
|
void A_Spectre4Attack (AActor *self)
|
||||||
{
|
{
|
||||||
if (self->target != NULL)
|
if (self->target != NULL)
|
||||||
{
|
{
|
||||||
AActor *missile = P_SpawnMissile (self, self->target, RUNTIME_CLASS(ASpectralLightningBigV2));
|
AActor *missile = P_SpawnMissileXYZ (self->x, self->y, self->z + 32*FRACUNIT,
|
||||||
|
self, self->target, RUNTIME_CLASS(ASpectralLightningBigV2), false);
|
||||||
if (missile != NULL)
|
if (missile != NULL)
|
||||||
{
|
{
|
||||||
missile->tracer = self->target;
|
missile->tracer = self->target;
|
||||||
missile->health = -2;
|
missile->health = -2;
|
||||||
|
P_CheckMissileSpawn(missile);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void A_204d0 (AActor *self)
|
void A_Spectre2Attack (AActor *self)
|
||||||
{
|
{
|
||||||
if (self->target != NULL)
|
if (self->target != NULL)
|
||||||
{
|
{
|
||||||
AActor *missile = P_SpawnMissile (self, self->target, RUNTIME_CLASS(ASpectralLightningH3));
|
AActor *missile = P_SpawnMissileXYZ (self->x, self->y, self->z + 32*FRACUNIT,
|
||||||
|
self, self->target, RUNTIME_CLASS(ASpectralLightningH3), false);
|
||||||
if (missile != NULL)
|
if (missile != NULL)
|
||||||
{
|
{
|
||||||
missile->health = -2;
|
missile->health = -2;
|
||||||
|
P_CheckMissileSpawn(missile);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void A_20314 (AActor *self)
|
void A_Spectre5Attack (AActor *self)
|
||||||
{
|
{
|
||||||
if (self->target != NULL)
|
if (self->target != NULL)
|
||||||
{
|
{
|
||||||
AActor *missile = P_SpawnMissile (self, self->target, RUNTIME_CLASS(ASpectralLightningBigBall2));
|
AActor *missile = P_SpawnMissileXYZ (self->x, self->y, self->z + 32*FRACUNIT,
|
||||||
|
self, self->target, RUNTIME_CLASS(ASpectralLightningBigBall2), false);
|
||||||
if (missile != NULL)
|
if (missile != NULL)
|
||||||
{
|
{
|
||||||
missile->health = -2;
|
missile->health = -2;
|
||||||
|
P_CheckMissileSpawn(missile);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void A_20424 (AActor *self)
|
void A_Spectre3Attack (AActor *self)
|
||||||
{
|
|
||||||
self->angle += ANGLE_90;
|
|
||||||
P_SpawnSubMissile (self, RUNTIME_CLASS(ASpectralLightningH3), self);
|
|
||||||
self->angle += ANGLE_180;
|
|
||||||
P_SpawnSubMissile (self, RUNTIME_CLASS(ASpectralLightningH3), self);
|
|
||||||
self->angle += ANGLE_90;
|
|
||||||
P_SpawnSubMissile (self, RUNTIME_CLASS(ASpectralLightningH3), self);
|
|
||||||
}
|
|
||||||
|
|
||||||
void A_20334 (AActor *self)
|
|
||||||
{
|
{
|
||||||
if (self->target == NULL)
|
if (self->target == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -8,15 +8,19 @@
|
||||||
|
|
||||||
static FRandom pr_entity ("Entity");
|
static FRandom pr_entity ("Entity");
|
||||||
|
|
||||||
void A_SpawnEntity (AActor *);
|
void A_SpotLightning (AActor *);
|
||||||
void A_200e0 (AActor *);
|
|
||||||
void A_20c74 (AActor *);
|
|
||||||
|
|
||||||
void A_20538 (AActor *);
|
void A_SpawnEntity (AActor *);
|
||||||
void A_212e4 (AActor *);
|
void A_EntityAttack (AActor *);
|
||||||
void A_2134c (AActor *);
|
void A_SpawnSubEntities (AActor *);
|
||||||
void A_20334 (AActor *);
|
|
||||||
void A_204d0 (AActor *);
|
void A_SpectreMelee (AActor *);
|
||||||
|
void A_SpectreChunkSmall (AActor *);
|
||||||
|
void A_SpectreChunkLarge (AActor *);
|
||||||
|
void A_Spectre2Attack (AActor *);
|
||||||
|
void A_Spectre3Attack (AActor *);
|
||||||
|
void A_Spectre4Attack (AActor *);
|
||||||
|
void A_Spectre5Attack (AActor *);
|
||||||
void A_SentinelBob (AActor *);
|
void A_SentinelBob (AActor *);
|
||||||
void A_TossGib (AActor *);
|
void A_TossGib (AActor *);
|
||||||
|
|
||||||
|
@ -85,18 +89,18 @@ public:
|
||||||
FState AEntityBoss::States[] =
|
FState AEntityBoss::States[] =
|
||||||
{
|
{
|
||||||
#define S_ENTITY_SPAWN 0
|
#define S_ENTITY_SPAWN 0
|
||||||
S_NORMAL (MNAM, 'A', 100, NULL, &States[S_ENTITY_SPAWN+1]),
|
S_NORMAL (MNAM, 'A', 100, NULL, &States[S_ENTITY_SPAWN+1]),
|
||||||
S_BRIGHT (MNAM, 'B', 60, NULL, &States[S_ENTITY_SPAWN+2]),
|
S_BRIGHT (MNAM, 'B', 60, NULL, &States[S_ENTITY_SPAWN+2]),
|
||||||
S_BRIGHT (MNAM, 'C', 4, NULL, &States[S_ENTITY_SPAWN+3]),
|
S_BRIGHT (MNAM, 'C', 4, NULL, &States[S_ENTITY_SPAWN+3]),
|
||||||
S_BRIGHT (MNAM, 'D', 4, NULL, &States[S_ENTITY_SPAWN+4]),
|
S_BRIGHT (MNAM, 'D', 4, NULL, &States[S_ENTITY_SPAWN+4]),
|
||||||
S_BRIGHT (MNAM, 'E', 4, NULL, &States[S_ENTITY_SPAWN+5]),
|
S_BRIGHT (MNAM, 'E', 4, NULL, &States[S_ENTITY_SPAWN+5]),
|
||||||
S_BRIGHT (MNAM, 'F', 4, NULL, &States[S_ENTITY_SPAWN+6]),
|
S_BRIGHT (MNAM, 'F', 4, NULL, &States[S_ENTITY_SPAWN+6]),
|
||||||
S_BRIGHT (MNAM, 'G', 4, NULL, &States[S_ENTITY_SPAWN+7]),
|
S_BRIGHT (MNAM, 'G', 4, NULL, &States[S_ENTITY_SPAWN+7]),
|
||||||
S_BRIGHT (MNAM, 'H', 4, NULL, &States[S_ENTITY_SPAWN+8]),
|
S_BRIGHT (MNAM, 'H', 4, NULL, &States[S_ENTITY_SPAWN+8]),
|
||||||
S_BRIGHT (MNAM, 'I', 4, NULL, &States[S_ENTITY_SPAWN+9]),
|
S_BRIGHT (MNAM, 'I', 4, NULL, &States[S_ENTITY_SPAWN+9]),
|
||||||
S_BRIGHT (MNAM, 'J', 4, NULL, &States[S_ENTITY_SPAWN+10]),
|
S_BRIGHT (MNAM, 'J', 4, NULL, &States[S_ENTITY_SPAWN+10]),
|
||||||
S_BRIGHT (MNAM, 'K', 4, NULL, &States[S_ENTITY_SPAWN+11]),
|
S_BRIGHT (MNAM, 'K', 4, NULL, &States[S_ENTITY_SPAWN+11]),
|
||||||
S_BRIGHT (MNAM, 'L', 4, NULL, &States[S_ENTITY_SPAWN+12]),
|
S_BRIGHT (MNAM, 'L', 4, NULL, &States[S_ENTITY_SPAWN+12]),
|
||||||
S_BRIGHT (MNAL, 'A', 4, A_Look, &States[S_ENTITY_SPAWN+13]),
|
S_BRIGHT (MNAL, 'A', 4, A_Look, &States[S_ENTITY_SPAWN+13]),
|
||||||
S_BRIGHT (MNAL, 'B', 4, A_SentinelBob, &States[S_ENTITY_SPAWN+12]),
|
S_BRIGHT (MNAL, 'B', 4, A_SentinelBob, &States[S_ENTITY_SPAWN+12]),
|
||||||
|
|
||||||
|
@ -115,25 +119,25 @@ FState AEntityBoss::States[] =
|
||||||
|
|
||||||
#define S_ENTITY_MELEE (S_ENTITY_SEE+11)
|
#define S_ENTITY_MELEE (S_ENTITY_SEE+11)
|
||||||
S_BRIGHT (MNAL, 'J', 4, A_FaceTarget, &States[S_ENTITY_MELEE+1]),
|
S_BRIGHT (MNAL, 'J', 4, A_FaceTarget, &States[S_ENTITY_MELEE+1]),
|
||||||
S_BRIGHT (MNAL, 'I', 4, A_20538, &States[S_ENTITY_MELEE+2]),
|
S_BRIGHT (MNAL, 'I', 4, A_SpectreMelee, &States[S_ENTITY_MELEE+2]),
|
||||||
S_BRIGHT (MNAL, 'C', 4, NULL, &States[S_ENTITY_SEE+2]),
|
S_BRIGHT (MNAL, 'C', 4, NULL, &States[S_ENTITY_SEE+2]),
|
||||||
|
|
||||||
#define S_ENTITY_MISSILE (S_ENTITY_MELEE+3)
|
#define S_ENTITY_MISSILE (S_ENTITY_MELEE+3)
|
||||||
S_BRIGHT (MNAL, 'F', 4, A_FaceTarget, &States[S_ENTITY_MISSILE+1]),
|
S_BRIGHT (MNAL, 'F', 4, A_FaceTarget, &States[S_ENTITY_MISSILE+1]),
|
||||||
S_BRIGHT (MNAL, 'I', 4, A_200e0, &States[S_ENTITY_MISSILE+2]),
|
S_BRIGHT (MNAL, 'I', 4, A_EntityAttack, &States[S_ENTITY_MISSILE+2]),
|
||||||
S_BRIGHT (MNAL, 'E', 4, NULL, &States[S_ENTITY_SEE+10]),
|
S_BRIGHT (MNAL, 'E', 4, NULL, &States[S_ENTITY_SEE+10]),
|
||||||
|
|
||||||
#define S_ENTITY_PAIN (S_ENTITY_MISSILE+3)
|
#define S_ENTITY_PAIN (S_ENTITY_MISSILE+3)
|
||||||
S_BRIGHT (MNAL, 'J', 2, A_Pain, &States[S_ENTITY_SEE+6]),
|
S_BRIGHT (MNAL, 'J', 2, A_Pain, &States[S_ENTITY_SEE+6]),
|
||||||
|
|
||||||
#define S_ENTITY_DIE (S_ENTITY_PAIN+1)
|
#define S_ENTITY_DIE (S_ENTITY_PAIN+1)
|
||||||
S_BRIGHT (MNAL, 'L', 7, A_212e4, &States[S_ENTITY_DIE+1]),
|
S_BRIGHT (MNAL, 'L', 7, A_SpectreChunkSmall, &States[S_ENTITY_DIE+1]),
|
||||||
S_BRIGHT (MNAL, 'M', 7, A_Scream, &States[S_ENTITY_DIE+2]),
|
S_BRIGHT (MNAL, 'M', 7, A_Scream, &States[S_ENTITY_DIE+2]),
|
||||||
S_BRIGHT (MNAL, 'N', 7, A_212e4, &States[S_ENTITY_DIE+3]),
|
S_BRIGHT (MNAL, 'N', 7, A_SpectreChunkSmall, &States[S_ENTITY_DIE+3]),
|
||||||
S_BRIGHT (MNAL, 'O', 7, A_212e4, &States[S_ENTITY_DIE+4]),
|
S_BRIGHT (MNAL, 'O', 7, A_SpectreChunkSmall, &States[S_ENTITY_DIE+4]),
|
||||||
S_BRIGHT (MNAL, 'P', 7, A_2134c, &States[S_ENTITY_DIE+5]),
|
S_BRIGHT (MNAL, 'P', 7, A_SpectreChunkLarge, &States[S_ENTITY_DIE+5]),
|
||||||
S_BRIGHT (MNAL, 'Q', 64, A_212e4, &States[S_ENTITY_DIE+6]),
|
S_BRIGHT (MNAL, 'Q', 64, A_SpectreChunkSmall, &States[S_ENTITY_DIE+6]),
|
||||||
S_BRIGHT (MNAL, 'Q', 6, A_20c74, NULL),
|
S_BRIGHT (MNAL, 'Q', 6, A_SpawnSubEntities, NULL),
|
||||||
};
|
};
|
||||||
|
|
||||||
IMPLEMENT_ACTOR (AEntityBoss, Strife, 128, 0)
|
IMPLEMENT_ACTOR (AEntityBoss, Strife, 128, 0)
|
||||||
|
@ -212,12 +216,12 @@ FState AEntitySecond::States[] =
|
||||||
|
|
||||||
#define S_ENTITY2_MELEE (S_ENTITY2_SEE+6)
|
#define S_ENTITY2_MELEE (S_ENTITY2_SEE+6)
|
||||||
S_BRIGHT (MNAL, 'S', 4, A_FaceTarget, &States[S_ENTITY2_MELEE+1]),
|
S_BRIGHT (MNAL, 'S', 4, A_FaceTarget, &States[S_ENTITY2_MELEE+1]),
|
||||||
S_BRIGHT (MNAL, 'R', 4, A_20538, &States[S_ENTITY2_MELEE+2]),
|
S_BRIGHT (MNAL, 'R', 4, A_SpectreMelee, &States[S_ENTITY2_MELEE+2]),
|
||||||
S_BRIGHT (MNAL, 'T', 4, A_SentinelBob, &States[S_ENTITY2_SEE+1]),
|
S_BRIGHT (MNAL, 'T', 4, A_SentinelBob, &States[S_ENTITY2_SEE+1]),
|
||||||
|
|
||||||
#define S_ENTITY2_MISSILE (S_ENTITY2_MELEE+3)
|
#define S_ENTITY2_MISSILE (S_ENTITY2_MELEE+3)
|
||||||
S_BRIGHT (MNAL, 'W', 4, A_FaceTarget, &States[S_ENTITY2_MISSILE+1]),
|
S_BRIGHT (MNAL, 'W', 4, A_FaceTarget, &States[S_ENTITY2_MISSILE+1]),
|
||||||
S_BRIGHT (MNAL, 'U', 4, A_204d0, &States[S_ENTITY2_MISSILE+2]),
|
S_BRIGHT (MNAL, 'U', 4, A_Spectre2Attack, &States[S_ENTITY2_MISSILE+2]),
|
||||||
S_BRIGHT (MNAL, 'V', 4, A_SentinelBob, &States[S_ENTITY2_SEE+4]),
|
S_BRIGHT (MNAL, 'V', 4, A_SentinelBob, &States[S_ENTITY2_SEE+4]),
|
||||||
|
|
||||||
#define S_ENTITY2_PAIN (S_ENTITY2_MISSILE+3)
|
#define S_ENTITY2_PAIN (S_ENTITY2_MISSILE+3)
|
||||||
|
@ -286,62 +290,31 @@ void A_SubEntityDeath (AActor *self)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void A_200e0 (AActor *self)
|
void A_EntityAttack (AActor *self)
|
||||||
{
|
{
|
||||||
AActor *bar;
|
|
||||||
|
|
||||||
// Apparent Strife bug: Case 5 was unreachable because they used % 5 instead of % 6.
|
// Apparent Strife bug: Case 5 was unreachable because they used % 5 instead of % 6.
|
||||||
// I've fixed that by making case 1 duplicate it, since case 1 did nothing.
|
// I've fixed that by making case 1 duplicate it, since case 1 did nothing.
|
||||||
switch (pr_entity() % 5)
|
switch (pr_entity() % 5)
|
||||||
{
|
{
|
||||||
case 0:
|
case 0:
|
||||||
if (self->target != NULL)
|
A_SpotLightning(self);
|
||||||
{
|
|
||||||
bar = Spawn<ASpectralLightningSpot> (self->x, self->y, ONFLOORZ, ALLOW_REPLACE);
|
|
||||||
bar->threshold = 25;
|
|
||||||
bar->target = self;
|
|
||||||
bar->tracer = self->target;
|
|
||||||
bar->health = -2;
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 2:
|
case 2:
|
||||||
if (self->target != NULL)
|
A_Spectre2Attack (self);
|
||||||
{
|
|
||||||
bar = P_SpawnMissile (self, self->target, RUNTIME_CLASS(ASpectralLightningH3));
|
|
||||||
if (bar != NULL)
|
|
||||||
{
|
|
||||||
bar->health = -2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 3:
|
case 3:
|
||||||
A_20334 (self);
|
A_Spectre3Attack (self);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 4:
|
case 4:
|
||||||
if (self->target != NULL)
|
A_Spectre4Attack (self);
|
||||||
{
|
|
||||||
bar = P_SpawnMissile (self, self->target, RUNTIME_CLASS(ASpectralLightningBigV2));
|
|
||||||
if (bar != NULL)
|
|
||||||
{
|
|
||||||
bar->health = -2;
|
|
||||||
bar->tracer = self->target;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 1:
|
case 1:
|
||||||
case 5:
|
case 5:
|
||||||
if (self->target != NULL)
|
A_Spectre5Attack (self);
|
||||||
{
|
|
||||||
bar = P_SpawnMissile (self, self->target, RUNTIME_CLASS(ASpectralLightningBigBall2));
|
|
||||||
if (bar != NULL)
|
|
||||||
{
|
|
||||||
bar->health = -2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -358,7 +331,7 @@ void A_SpawnEntity (AActor *self)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void A_20c74 (AActor *selfa)
|
void A_SpawnSubEntities (AActor *selfa)
|
||||||
{
|
{
|
||||||
AEntityBoss *self = static_cast<AEntityBoss *>(selfa);
|
AEntityBoss *self = static_cast<AEntityBoss *>(selfa);
|
||||||
AEntitySecond *second;
|
AEntitySecond *second;
|
||||||
|
|
|
@ -11,9 +11,9 @@ static FRandom pr_atk1 ("FooMelee");
|
||||||
void A_SentinelBob (AActor *);
|
void A_SentinelBob (AActor *);
|
||||||
void A_SpawnSpectre5 (AActor *);
|
void A_SpawnSpectre5 (AActor *);
|
||||||
|
|
||||||
void A_20538 (AActor *);
|
void A_SpectreMelee (AActor *);
|
||||||
void A_20598 (AActor *);
|
void A_LoremasterAttack (AActor *);
|
||||||
void A_205b0 (AActor *);
|
void A_LoremasterChain (AActor *);
|
||||||
|
|
||||||
// Loremaster (aka Priest) --------------------------------------------------
|
// Loremaster (aka Priest) --------------------------------------------------
|
||||||
|
|
||||||
|
@ -42,12 +42,12 @@ FState ALoremaster::States[] =
|
||||||
|
|
||||||
#define S_PRIEST_MELEE (S_PRIEST_RUN+8)
|
#define S_PRIEST_MELEE (S_PRIEST_RUN+8)
|
||||||
S_NORMAL (PRST, 'E', 4, A_FaceTarget, &States[S_PRIEST_MELEE+1]),
|
S_NORMAL (PRST, 'E', 4, A_FaceTarget, &States[S_PRIEST_MELEE+1]),
|
||||||
S_NORMAL (PRST, 'F', 4, A_20538, &States[S_PRIEST_MELEE+2]),
|
S_NORMAL (PRST, 'F', 4, A_SpectreMelee, &States[S_PRIEST_MELEE+2]),
|
||||||
S_NORMAL (PRST, 'E', 4, A_SentinelBob, &States[S_PRIEST_RUN]),
|
S_NORMAL (PRST, 'E', 4, A_SentinelBob, &States[S_PRIEST_RUN]),
|
||||||
|
|
||||||
#define S_PRIEST_MISSILE (S_PRIEST_MELEE+3)
|
#define S_PRIEST_MISSILE (S_PRIEST_MELEE+3)
|
||||||
S_NORMAL (PRST, 'E', 4, A_FaceTarget, &States[S_PRIEST_MISSILE+1]),
|
S_NORMAL (PRST, 'E', 4, A_FaceTarget, &States[S_PRIEST_MISSILE+1]),
|
||||||
S_NORMAL (PRST, 'F', 4, A_20598, &States[S_PRIEST_MISSILE+2]),
|
S_NORMAL (PRST, 'F', 4, A_LoremasterAttack, &States[S_PRIEST_MISSILE+2]),
|
||||||
S_NORMAL (PRST, 'E', 4, A_SentinelBob, &States[S_PRIEST_RUN]),
|
S_NORMAL (PRST, 'E', 4, A_SentinelBob, &States[S_PRIEST_RUN]),
|
||||||
|
|
||||||
#define S_PRIEST_DIE (S_PRIEST_MISSILE+3)
|
#define S_PRIEST_DIE (S_PRIEST_MISSILE+3)
|
||||||
|
@ -125,7 +125,7 @@ public:
|
||||||
|
|
||||||
FState ALoreShot::States[] =
|
FState ALoreShot::States[] =
|
||||||
{
|
{
|
||||||
S_NORMAL (OCLW, 'A', 2, A_205b0, &States[0]),
|
S_NORMAL (OCLW, 'A', 2, A_LoremasterChain, &States[0]),
|
||||||
S_NORMAL (CCLW, 'A', 6, NULL, NULL)
|
S_NORMAL (CCLW, 'A', 6, NULL, NULL)
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -184,7 +184,7 @@ IMPLEMENT_ACTOR (ALoreShot2, Strife, -1, 0)
|
||||||
PROP_SeeSound ("loremaster/active")
|
PROP_SeeSound ("loremaster/active")
|
||||||
END_DEFAULTS
|
END_DEFAULTS
|
||||||
|
|
||||||
void A_20538 (AActor *self)
|
void A_SpectreMelee (AActor *self)
|
||||||
{
|
{
|
||||||
int damage;
|
int damage;
|
||||||
|
|
||||||
|
@ -197,7 +197,7 @@ void A_20538 (AActor *self)
|
||||||
P_TraceBleed (damage, self->target, self);
|
P_TraceBleed (damage, self->target, self);
|
||||||
}
|
}
|
||||||
|
|
||||||
void A_20598 (AActor *self)
|
void A_LoremasterAttack (AActor *self)
|
||||||
{
|
{
|
||||||
if (self->target != NULL)
|
if (self->target != NULL)
|
||||||
{
|
{
|
||||||
|
@ -205,7 +205,7 @@ void A_20598 (AActor *self)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void A_205b0 (AActor *self)
|
void A_LoremasterChain (AActor *self)
|
||||||
{
|
{
|
||||||
S_Sound (self, CHAN_BODY, "loremaster/active", 1, ATTN_NORM);
|
S_Sound (self, CHAN_BODY, "loremaster/active", 1, ATTN_NORM);
|
||||||
Spawn<ALoreShot2> (self->x, self->y, self->z, ALLOW_REPLACE);
|
Spawn<ALoreShot2> (self->x, self->y, self->z, ALLOW_REPLACE);
|
||||||
|
|
|
@ -7,11 +7,12 @@
|
||||||
#include "m_random.h"
|
#include "m_random.h"
|
||||||
#include "a_strifeglobal.h"
|
#include "a_strifeglobal.h"
|
||||||
|
|
||||||
void A_201fc (AActor *);
|
void A_SpectralLightning (AActor *);
|
||||||
|
|
||||||
void A_AlertMonsters (AActor *);
|
void A_AlertMonsters (AActor *);
|
||||||
void A_Countdown (AActor *);
|
void A_Countdown (AActor *);
|
||||||
void A_Tracer2 (AActor *);
|
void A_Tracer2 (AActor *);
|
||||||
|
AActor *P_SpawnSubMissile (AActor *source, PClass *type, AActor *target);
|
||||||
|
|
||||||
// Container for all spectral lightning deaths ------------------------------
|
// Container for all spectral lightning deaths ------------------------------
|
||||||
|
|
||||||
|
@ -96,13 +97,13 @@ END_DEFAULTS
|
||||||
|
|
||||||
// Spectral Lightning (Horizontal #1) ---------------------------------------
|
// Spectral Lightning (Horizontal #1) ---------------------------------------
|
||||||
|
|
||||||
void A_2046c (AActor *);
|
void A_SpectralLightningTail (AActor *);
|
||||||
|
|
||||||
FState ASpectralLightningH1::States[] =
|
FState ASpectralLightningH1::States[] =
|
||||||
{
|
{
|
||||||
S_BRIGHT (ZAP6, 'A', 4, NULL, &States[1]),
|
S_BRIGHT (ZAP6, 'A', 4, NULL, &States[1]),
|
||||||
S_BRIGHT (ZAP6, 'B', 4, A_2046c, &States[2]),
|
S_BRIGHT (ZAP6, 'B', 4, A_SpectralLightningTail, &States[2]),
|
||||||
S_BRIGHT (ZAP6, 'C', 4, A_2046c, &States[0])
|
S_BRIGHT (ZAP6, 'C', 4, A_SpectralLightningTail, &States[0])
|
||||||
};
|
};
|
||||||
|
|
||||||
IMPLEMENT_ACTOR (ASpectralLightningH1, Strife, -1, 0)
|
IMPLEMENT_ACTOR (ASpectralLightningH1, Strife, -1, 0)
|
||||||
|
@ -147,7 +148,7 @@ IMPLEMENT_ACTOR (ASpectralLightningHTail, Strife, -1, 0)
|
||||||
PROP_RenderStyle (STYLE_Add)
|
PROP_RenderStyle (STYLE_Add)
|
||||||
END_DEFAULTS
|
END_DEFAULTS
|
||||||
|
|
||||||
void A_2046c (AActor *self)
|
void A_SpectralLightningTail (AActor *self)
|
||||||
{
|
{
|
||||||
AActor *foo = Spawn<ASpectralLightningHTail> (self->x - self->momx, self->y - self->momy, self->z, ALLOW_REPLACE);
|
AActor *foo = Spawn<ASpectralLightningHTail> (self->x - self->momx, self->y - self->momy, self->z, ALLOW_REPLACE);
|
||||||
|
|
||||||
|
@ -157,15 +158,15 @@ void A_2046c (AActor *self)
|
||||||
|
|
||||||
// Spectral Lightning (Big Ball #1) -----------------------------------------
|
// Spectral Lightning (Big Ball #1) -----------------------------------------
|
||||||
|
|
||||||
void A_20424 (AActor *);
|
void A_SpectralBigBallLightning (AActor *);
|
||||||
|
|
||||||
FState ASpectralLightningBigBall1::States[] =
|
FState ASpectralLightningBigBall1::States[] =
|
||||||
{
|
{
|
||||||
S_BRIGHT (ZAP7, 'A', 4, A_20424, &States[1]),
|
S_BRIGHT (ZAP7, 'A', 4, A_SpectralBigBallLightning, &States[1]),
|
||||||
S_BRIGHT (ZAP7, 'B', 4, A_20424, &States[2]),
|
S_BRIGHT (ZAP7, 'B', 4, A_SpectralBigBallLightning, &States[2]),
|
||||||
S_BRIGHT (ZAP7, 'C', 6, A_20424, &States[3]),
|
S_BRIGHT (ZAP7, 'C', 6, A_SpectralBigBallLightning, &States[3]),
|
||||||
S_BRIGHT (ZAP7, 'D', 6, A_20424, &States[4]),
|
S_BRIGHT (ZAP7, 'D', 6, A_SpectralBigBallLightning, &States[4]),
|
||||||
S_BRIGHT (ZAP7, 'E', 6, A_20424, &States[0]),
|
S_BRIGHT (ZAP7, 'E', 6, A_SpectralBigBallLightning, &States[0]),
|
||||||
};
|
};
|
||||||
|
|
||||||
IMPLEMENT_ACTOR (ASpectralLightningBigBall1, Strife, -1, 0)
|
IMPLEMENT_ACTOR (ASpectralLightningBigBall1, Strife, -1, 0)
|
||||||
|
@ -180,6 +181,18 @@ IMPLEMENT_ACTOR (ASpectralLightningBigBall1, Strife, -1, 0)
|
||||||
PROP_MaxStepHeight (4)
|
PROP_MaxStepHeight (4)
|
||||||
END_DEFAULTS
|
END_DEFAULTS
|
||||||
|
|
||||||
|
|
||||||
|
void A_SpectralBigBallLightning (AActor *self)
|
||||||
|
{
|
||||||
|
self->angle += ANGLE_90;
|
||||||
|
P_SpawnSubMissile (self, RUNTIME_CLASS(ASpectralLightningH3), self->target);
|
||||||
|
self->angle += ANGLE_180;
|
||||||
|
P_SpawnSubMissile (self, RUNTIME_CLASS(ASpectralLightningH3), self->target);
|
||||||
|
self->angle += ANGLE_90;
|
||||||
|
P_SpawnSubMissile (self, RUNTIME_CLASS(ASpectralLightningH3), self->target);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// Spectral Lightning (Big Ball #2 - less damaging) -------------------------
|
// Spectral Lightning (Big Ball #2 - less damaging) -------------------------
|
||||||
|
|
||||||
IMPLEMENT_STATELESS_ACTOR (ASpectralLightningBigBall2, Strife, -1, 0)
|
IMPLEMENT_STATELESS_ACTOR (ASpectralLightningBigBall2, Strife, -1, 0)
|
||||||
|
@ -224,7 +237,7 @@ END_DEFAULTS
|
||||||
FState ASpectralLightningSpot::States[] =
|
FState ASpectralLightningSpot::States[] =
|
||||||
{
|
{
|
||||||
S_BRIGHT (ZAP5, 'A', 4, A_Countdown, &States[1]),
|
S_BRIGHT (ZAP5, 'A', 4, A_Countdown, &States[1]),
|
||||||
S_BRIGHT (ZAP5, 'B', 4, A_201fc, &States[2]),
|
S_BRIGHT (ZAP5, 'B', 4, A_SpectralLightning, &States[2]),
|
||||||
S_BRIGHT (ZAP5, 'C', 4, A_Countdown, &States[3]),
|
S_BRIGHT (ZAP5, 'C', 4, A_Countdown, &States[3]),
|
||||||
S_BRIGHT (ZAP5, 'D', 4, A_Countdown, &States[0]),
|
S_BRIGHT (ZAP5, 'D', 4, A_Countdown, &States[0]),
|
||||||
};
|
};
|
||||||
|
@ -275,7 +288,7 @@ END_DEFAULTS
|
||||||
|
|
||||||
static FRandom pr_zap5 ("Zap5");
|
static FRandom pr_zap5 ("Zap5");
|
||||||
|
|
||||||
void A_201fc (AActor *self)
|
void A_SpectralLightning (AActor *self)
|
||||||
{
|
{
|
||||||
AActor *flash;
|
AActor *flash;
|
||||||
fixed_t x, y;
|
fixed_t x, y;
|
||||||
|
|
|
@ -1408,6 +1408,22 @@ AActor *P_SpawnSubMissile (AActor *source, PClass *type, AActor *target)
|
||||||
other->momx = FixedMul (other->Speed, finecosine[source->angle >> ANGLETOFINESHIFT]);
|
other->momx = FixedMul (other->Speed, finecosine[source->angle >> ANGLETOFINESHIFT]);
|
||||||
other->momy = FixedMul (other->Speed, finesine[source->angle >> ANGLETOFINESHIFT]);
|
other->momy = FixedMul (other->Speed, finesine[source->angle >> ANGLETOFINESHIFT]);
|
||||||
|
|
||||||
|
if (other->flags4 & MF4_SPECTRAL)
|
||||||
|
{
|
||||||
|
if (source->flags & MF_MISSILE && source->flags4 & MF4_SPECTRAL)
|
||||||
|
{
|
||||||
|
other->health = source->health;
|
||||||
|
}
|
||||||
|
else if (target->player != NULL)
|
||||||
|
{
|
||||||
|
other->health = -1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
other->health = -2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (P_CheckMissileSpawn (other))
|
if (P_CheckMissileSpawn (other))
|
||||||
{
|
{
|
||||||
angle_t pitch = P_AimLineAttack (source, source->angle, 1024*FRACUNIT);
|
angle_t pitch = P_AimLineAttack (source, source->angle, 1024*FRACUNIT);
|
||||||
|
@ -2226,7 +2242,6 @@ void A_FireSigil1 (AActor *actor)
|
||||||
|
|
||||||
void A_FireSigil2 (AActor *actor)
|
void A_FireSigil2 (AActor *actor)
|
||||||
{
|
{
|
||||||
AActor *spot;
|
|
||||||
player_t *player = actor->player;
|
player_t *player = actor->player;
|
||||||
|
|
||||||
if (player == NULL || player->ReadyWeapon == NULL)
|
if (player == NULL || player->ReadyWeapon == NULL)
|
||||||
|
@ -2235,11 +2250,7 @@ void A_FireSigil2 (AActor *actor)
|
||||||
P_DamageMobj (actor, actor, NULL, 2*4, 0, DMG_NO_ARMOR);
|
P_DamageMobj (actor, actor, NULL, 2*4, 0, DMG_NO_ARMOR);
|
||||||
S_Sound (actor, CHAN_WEAPON, "weapons/sigilcharge", 1, ATTN_NORM);
|
S_Sound (actor, CHAN_WEAPON, "weapons/sigilcharge", 1, ATTN_NORM);
|
||||||
|
|
||||||
spot = P_SpawnPlayerMissile (actor, RUNTIME_CLASS(ASpectralLightningH1));
|
P_SpawnPlayerMissile (actor, RUNTIME_CLASS(ASpectralLightningH1));
|
||||||
if (spot != NULL)
|
|
||||||
{
|
|
||||||
spot->health = -1;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//============================================================================
|
//============================================================================
|
||||||
|
@ -2267,7 +2278,6 @@ void A_FireSigil3 (AActor *actor)
|
||||||
spot = P_SpawnSubMissile (actor, RUNTIME_CLASS(ASpectralLightningBall1), actor);
|
spot = P_SpawnSubMissile (actor, RUNTIME_CLASS(ASpectralLightningBall1), actor);
|
||||||
if (spot != NULL)
|
if (spot != NULL)
|
||||||
{
|
{
|
||||||
spot->health = -1;
|
|
||||||
spot->z = actor->z + 32*FRACUNIT;
|
spot->z = actor->z + 32*FRACUNIT;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2299,7 +2309,6 @@ void A_FireSigil4 (AActor *actor)
|
||||||
if (spot != NULL)
|
if (spot != NULL)
|
||||||
{
|
{
|
||||||
spot->tracer = linetarget;
|
spot->tracer = linetarget;
|
||||||
spot->health = -1;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -2309,7 +2318,6 @@ void A_FireSigil4 (AActor *actor)
|
||||||
{
|
{
|
||||||
spot->momx += FixedMul (spot->Speed, finecosine[actor->angle >> ANGLETOFINESHIFT]);
|
spot->momx += FixedMul (spot->Speed, finecosine[actor->angle >> ANGLETOFINESHIFT]);
|
||||||
spot->momy += FixedMul (spot->Speed, finesine[actor->angle >> ANGLETOFINESHIFT]);
|
spot->momy += FixedMul (spot->Speed, finesine[actor->angle >> ANGLETOFINESHIFT]);
|
||||||
spot->health = -1;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2322,7 +2330,6 @@ void A_FireSigil4 (AActor *actor)
|
||||||
|
|
||||||
void A_FireSigil5 (AActor *actor)
|
void A_FireSigil5 (AActor *actor)
|
||||||
{
|
{
|
||||||
AActor *spot;
|
|
||||||
player_t *player = actor->player;
|
player_t *player = actor->player;
|
||||||
|
|
||||||
if (player == NULL || player->ReadyWeapon == NULL)
|
if (player == NULL || player->ReadyWeapon == NULL)
|
||||||
|
@ -2331,11 +2338,7 @@ void A_FireSigil5 (AActor *actor)
|
||||||
P_DamageMobj (actor, actor, NULL, 5*4, 0, DMG_NO_ARMOR);
|
P_DamageMobj (actor, actor, NULL, 5*4, 0, DMG_NO_ARMOR);
|
||||||
S_Sound (actor, CHAN_WEAPON, "weapons/sigilcharge", 1, ATTN_NORM);
|
S_Sound (actor, CHAN_WEAPON, "weapons/sigilcharge", 1, ATTN_NORM);
|
||||||
|
|
||||||
spot = P_SpawnPlayerMissile (actor, RUNTIME_CLASS(ASpectralLightningBigBall1));
|
P_SpawnPlayerMissile (actor, RUNTIME_CLASS(ASpectralLightningBigBall1));
|
||||||
if (spot != NULL)
|
|
||||||
{
|
|
||||||
spot->health = -1;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//============================================================================
|
//============================================================================
|
||||||
|
|
|
@ -920,12 +920,12 @@ void P_DamageMobj (AActor *target, AActor *inflictor, AActor *source, int damage
|
||||||
{
|
{
|
||||||
if (player != NULL)
|
if (player != NULL)
|
||||||
{
|
{
|
||||||
if (inflictor->health == -1)
|
if (!deathmatch && inflictor->health == -1)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
else if (target->flags4 & MF4_SPECTRAL)
|
else if (target->flags4 & MF4_SPECTRAL)
|
||||||
{
|
{
|
||||||
if (inflictor->health == -2)
|
if (inflictor->health == -2 && !target->IsHostile(inflictor))
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -4773,6 +4773,9 @@ AActor *P_SpawnPlayerMissile (AActor *source, fixed_t x, fixed_t y, fixed_t z,
|
||||||
MissileActor->momy = FixedMul (vy, speed);
|
MissileActor->momy = FixedMul (vy, speed);
|
||||||
MissileActor->momz = FixedMul (vz, speed);
|
MissileActor->momz = FixedMul (vz, speed);
|
||||||
|
|
||||||
|
if (MissileActor->flags4 & MF4_SPECTRAL)
|
||||||
|
MissileActor->health = -1;
|
||||||
|
|
||||||
if (P_CheckMissileSpawn (MissileActor))
|
if (P_CheckMissileSpawn (MissileActor))
|
||||||
{
|
{
|
||||||
return MissileActor;
|
return MissileActor;
|
||||||
|
|
|
@ -236,10 +236,9 @@ static void DoAttack (AActor *self, bool domelee, bool domissile)
|
||||||
const PClass * ti=PClass::FindClass(MissileName);
|
const PClass * ti=PClass::FindClass(MissileName);
|
||||||
if (ti)
|
if (ti)
|
||||||
{
|
{
|
||||||
// Although there is a P_SpawnMissileZ function its
|
// This seemingly senseless code is needed for proper aiming.
|
||||||
// aiming is much too bad to be of any use
|
|
||||||
self->z+=MissileHeight-32*FRACUNIT;
|
self->z+=MissileHeight-32*FRACUNIT;
|
||||||
AActor * missile = P_SpawnMissile (self, self->target, ti);
|
AActor * missile = P_SpawnMissileXYZ (self->x, self->y, self->z + 32*FRACUNIT, self, self->target, ti, false);
|
||||||
self->z-=MissileHeight-32*FRACUNIT;
|
self->z-=MissileHeight-32*FRACUNIT;
|
||||||
|
|
||||||
if (missile)
|
if (missile)
|
||||||
|
@ -254,6 +253,7 @@ static void DoAttack (AActor *self, bool domelee, bool domissile)
|
||||||
{
|
{
|
||||||
missile->health=-2;
|
missile->health=-2;
|
||||||
}
|
}
|
||||||
|
P_CheckMissileSpawn(missile);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -937,10 +937,9 @@ void A_CustomComboAttack (AActor *self)
|
||||||
const PClass * ti=PClass::FindClass(MissileName);
|
const PClass * ti=PClass::FindClass(MissileName);
|
||||||
if (ti)
|
if (ti)
|
||||||
{
|
{
|
||||||
// Although there is a P_SpawnMissileZ function its
|
// This seemingly senseless code is needed for proper aiming.
|
||||||
// aiming is much too bad to be of any use
|
|
||||||
self->z+=SpawnHeight-32*FRACUNIT;
|
self->z+=SpawnHeight-32*FRACUNIT;
|
||||||
AActor * missile = P_SpawnMissile (self, self->target, ti);
|
AActor * missile = P_SpawnMissileXYZ (self->x, self->y, self->z + 32*FRACUNIT, self, self->target, ti, false);
|
||||||
self->z-=SpawnHeight-32*FRACUNIT;
|
self->z-=SpawnHeight-32*FRACUNIT;
|
||||||
|
|
||||||
if (missile)
|
if (missile)
|
||||||
|
@ -955,6 +954,7 @@ void A_CustomComboAttack (AActor *self)
|
||||||
{
|
{
|
||||||
missile->health=-2;
|
missile->health=-2;
|
||||||
}
|
}
|
||||||
|
P_CheckMissileSpawn(missile);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1095,7 +1095,6 @@ void A_FireCustomMissile (AActor * self)
|
||||||
misl->momx = FixedMul (missilespeed, finecosine[an]);
|
misl->momx = FixedMul (missilespeed, finecosine[an]);
|
||||||
misl->momy = FixedMul (missilespeed, finesine[an]);
|
misl->momy = FixedMul (missilespeed, finesine[an]);
|
||||||
}
|
}
|
||||||
if (misl->flags4&MF4_SPECTRAL) misl->health=-1;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue