mirror of
https://github.com/ZDoom/qzdoom.git
synced 2024-11-11 15:22:16 +00:00
d4c0ee9e43
This function calculated everything correctly but ultimately set the vertical velocity wrong. Most importantly this meant that the actual velocity vector and actor pitch - if CMF_SAVEPITCH was used - did not match. Since this bug has been present since the pitch parameter was added, this deprecates A_CustomMissile and replaces it with a properly implemented A_SpawnProjectile function and handling the compatibility case with a new flag and a scripted wrapper function. All internal uses of A_CustomMissile have been replaced as well.
331 lines
6.2 KiB
Text
331 lines
6.2 KiB
Text
|
|
// Alien Spectre 1 -----------------------------------------------------------
|
|
|
|
class AlienSpectre1 : SpectralMonster
|
|
{
|
|
Default
|
|
{
|
|
Health 1000;
|
|
Painchance 250;
|
|
Speed 12;
|
|
Radius 64;
|
|
Height 64;
|
|
FloatSpeed 5;
|
|
Mass 1000;
|
|
MinMissileChance 150;
|
|
RenderStyle "Translucent";
|
|
Alpha 0.666;
|
|
SeeSound "alienspectre/sight";
|
|
AttackSound "alienspectre/blade";
|
|
PainSound "alienspectre/pain";
|
|
DeathSound "alienspectre/death";
|
|
ActiveSound "alienspectre/active";
|
|
Obituary "$OB_ALIENSPECTRE";
|
|
+NOGRAVITY
|
|
+FLOAT
|
|
+SHADOW
|
|
+NOTDMATCH
|
|
+DONTMORPH
|
|
+NOBLOCKMONST
|
|
+INCOMBAT
|
|
+LOOKALLAROUND
|
|
+NOICEDEATH
|
|
}
|
|
|
|
States
|
|
{
|
|
Spawn:
|
|
ALN1 A 10 A_Look;
|
|
ALN1 B 10 A_SentinelBob;
|
|
Loop;
|
|
See:
|
|
ALN1 AB 4 Bright A_Chase;
|
|
ALN1 C 4 Bright A_SentinelBob;
|
|
ALN1 DEF 4 Bright A_Chase;
|
|
ALN1 G 4 Bright A_SentinelBob;
|
|
ALN1 HIJ 4 Bright A_Chase;
|
|
ALN1 K 4 Bright A_SentinelBob;
|
|
Loop;
|
|
Melee:
|
|
ALN1 J 4 Bright A_FaceTarget;
|
|
ALN1 I 4 Bright A_CustomMeleeAttack((random[SpectreMelee](0,255)&9)*5);
|
|
ALN1 H 4 Bright;
|
|
Goto See;
|
|
Missile:
|
|
ALN1 J 4 Bright A_FaceTarget;
|
|
ALN1 I 4 Bright A_SpotLightning;
|
|
ALN1 H 4 Bright;
|
|
Goto See+10;
|
|
Pain:
|
|
ALN1 J 2 A_Pain;
|
|
Goto See+6;
|
|
Death:
|
|
AL1P A 6 Bright A_SpectreChunkSmall;
|
|
AL1P B 6 Bright A_Scream;
|
|
AL1P C 6 Bright A_SpectreChunkSmall;
|
|
AL1P DE 6 Bright;
|
|
AL1P F 6 Bright A_SpectreChunkSmall;
|
|
AL1P G 6 Bright;
|
|
AL1P H 6 Bright A_SpectreChunkSmall;
|
|
AL1P IJK 6 Bright;
|
|
AL1P LM 5 Bright;
|
|
AL1P N 5 Bright A_SpectreChunkLarge;
|
|
AL1P OPQ 5 Bright;
|
|
AL1P R 5 Bright A_AlienSpectreDeath;
|
|
Stop;
|
|
}
|
|
|
|
//============================================================================
|
|
|
|
void A_AlienSpectreDeath ()
|
|
{
|
|
PlayerPawn player = null;
|
|
int log = 0;
|
|
|
|
A_NoBlocking(); // [RH] Need this for Sigil rewarding
|
|
if (!CheckBossDeath ())
|
|
{
|
|
return;
|
|
}
|
|
for (int i = 0; i < MAXPLAYERS; ++i)
|
|
{
|
|
if (playeringame[i] && players[i].health > 0)
|
|
{
|
|
player = players[i].mo;
|
|
break;
|
|
}
|
|
}
|
|
if (player == null)
|
|
{
|
|
return;
|
|
}
|
|
|
|
class<Actor> cls = GetClass();
|
|
if (cls == "AlienSpectre1")
|
|
{
|
|
Floor_LowerToLowest(999, 8);
|
|
log = 95;
|
|
}
|
|
else if (cls == "AlienSpectre2")
|
|
{
|
|
C_MidPrint("SmallFont", "$TXT_KILLED_BISHOP");
|
|
log = 74;
|
|
player.GiveInventoryType ("QuestItem21");
|
|
}
|
|
else if (cls == "AlienSpectre3")
|
|
{
|
|
C_MidPrint("SmallFont", "$TXT_KILLED_ORACLE");
|
|
// If there are any Oracles still alive, kill them.
|
|
ThinkerIterator it = ThinkerIterator.Create("Oracle");
|
|
Actor oracle;
|
|
|
|
while ( (oracle = Actor(it.Next())) != null)
|
|
{
|
|
if (oracle.health > 0)
|
|
{
|
|
oracle.health = 0;
|
|
oracle.Die (self, self);
|
|
}
|
|
}
|
|
player.GiveInventoryType ("QuestItem23");
|
|
if (player.FindInventory ("QuestItem21"))
|
|
{ // If the Bishop is dead, set quest item 22
|
|
player.GiveInventoryType ("QuestItem22");
|
|
}
|
|
if (player.FindInventory ("QuestItem24") == null)
|
|
{ // Macil is calling us back...
|
|
log = 87;
|
|
}
|
|
else
|
|
{ // You wield the power of the complete Sigil.
|
|
log = 85;
|
|
}
|
|
Door_Open(222, 64);
|
|
}
|
|
else if (cls == "AlienSpectre4")
|
|
{
|
|
C_MidPrint("SmallFont", "$TXT_KILLED_MACIL");
|
|
player.GiveInventoryType ("QuestItem24");
|
|
if (player.FindInventory ("QuestItem25") == null)
|
|
{ // Richter has taken over. Macil is a snake.
|
|
log = 79;
|
|
}
|
|
else
|
|
{ // Back to the factory for another Sigil!
|
|
log = 106;
|
|
}
|
|
}
|
|
else if (cls == "AlienSpectre5")
|
|
{
|
|
C_MidPrint("SmallFont", "$TXT_KILLED_LOREMASTER");
|
|
|
|
player.GiveInventoryType ("QuestItem26");
|
|
if (!multiplayer)
|
|
{
|
|
player.GiveInventoryType ("UpgradeStamina");
|
|
player.GiveInventoryType ("UpgradeAccuracy");
|
|
}
|
|
Sigil sigl = Sigil(player.FindInventory("Sigil"));
|
|
if (sigl != null /*&& sigl.NumPieces == 5*/)
|
|
{ // You wield the power of the complete Sigil.
|
|
log = 85;
|
|
}
|
|
else
|
|
{ // Another Sigil piece. Woohoo!
|
|
log = 83;
|
|
}
|
|
Floor_LowerToLowest(666, 8);
|
|
}
|
|
if (log > 0)
|
|
{
|
|
String voc = "svox/voc" .. log;
|
|
A_PlaySound(voc, CHAN_VOICE);
|
|
player.player.SetLogNumber (log);
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
|
|
// Alien Spectre 2 -----------------------------------------------------------
|
|
|
|
class AlienSpectre2 : AlienSpectre1
|
|
{
|
|
Default
|
|
{
|
|
Health 1200;
|
|
Painchance 50;
|
|
Radius 24;
|
|
DropItem "Sigil2";
|
|
}
|
|
States
|
|
{
|
|
Missile:
|
|
ALN1 F 4 A_FaceTarget;
|
|
ALN1 I 4 A_SpawnProjectile("SpectralLightningH3", 32, 0);
|
|
ALN1 E 4;
|
|
Goto See+10;
|
|
}
|
|
}
|
|
|
|
// Alien Spectre 3 ----------------------------------------------------------
|
|
// This is the Oracle's personal spectre, so it's a little different.
|
|
|
|
class AlienSpectre3 : AlienSpectre1
|
|
{
|
|
Default
|
|
{
|
|
Health 1500;
|
|
Painchance 50;
|
|
Radius 24;
|
|
+SPAWNCEILING
|
|
DropItem "Sigil3";
|
|
DamageFactor "SpectralLow", 0;
|
|
}
|
|
States
|
|
{
|
|
Spawn:
|
|
ALN1 ABCDEFGHIJK 5;
|
|
Loop;
|
|
See:
|
|
ALN1 AB 5 A_Chase;
|
|
ALN1 C 5 A_SentinelBob;
|
|
ALN1 DEF 5 A_Chase;
|
|
ALN1 G 5 A_SentinelBob;
|
|
ALN1 HIJ 5 A_Chase;
|
|
ALN1 K 5 A_SentinelBob;
|
|
Loop;
|
|
Melee:
|
|
ALN1 J 4 A_FaceTarget;
|
|
ALN1 I 4 A_CustomMeleeAttack((random[SpectreMelee](0,255)&9)*5);
|
|
ALN1 C 4;
|
|
Goto See+2;
|
|
Missile:
|
|
ALN1 F 4 A_FaceTarget;
|
|
ALN1 I 4 A_Spectre3Attack;
|
|
ALN1 E 4;
|
|
Goto See+10;
|
|
Pain:
|
|
ALN1 J 2 A_Pain;
|
|
Goto See+6;
|
|
}
|
|
}
|
|
|
|
|
|
// Alien Spectre 4 -----------------------------------------------------------
|
|
|
|
class AlienSpectre4 : AlienSpectre1
|
|
{
|
|
Default
|
|
{
|
|
Health 1700;
|
|
Painchance 50;
|
|
Radius 24;
|
|
DropItem "Sigil4";
|
|
}
|
|
States
|
|
{
|
|
Missile:
|
|
ALN1 F 4 A_FaceTarget;
|
|
ALN1 I 4 A_SpawnProjectile("SpectralLightningBigV2", 32, 0);
|
|
ALN1 E 4;
|
|
Goto See+10;
|
|
}
|
|
}
|
|
|
|
|
|
// Alien Spectre 5 -----------------------------------------------------------
|
|
|
|
class AlienSpectre5 : AlienSpectre1
|
|
{
|
|
Default
|
|
{
|
|
Health 2000;
|
|
Painchance 50;
|
|
Radius 24;
|
|
DropItem "Sigil5";
|
|
}
|
|
States
|
|
{
|
|
Missile:
|
|
ALN1 F 4 A_FaceTarget;
|
|
ALN1 I 4 A_SpawnProjectile("SpectralLightningBigBall2", 32, 0);
|
|
ALN1 E 4;
|
|
Goto See+10;
|
|
}
|
|
}
|
|
|
|
// Small Alien Chunk --------------------------------------------------------
|
|
|
|
class AlienChunkSmall : Actor
|
|
{
|
|
Default
|
|
{
|
|
+NOBLOCKMAP
|
|
+NOCLIP
|
|
}
|
|
States
|
|
{
|
|
Spawn:
|
|
NODE ABCDEFG 6 Bright;
|
|
Stop;
|
|
}
|
|
}
|
|
|
|
// Large Alien Chunk --------------------------------------------------------
|
|
|
|
class AlienChunkLarge : Actor
|
|
{
|
|
Default
|
|
{
|
|
+NOBLOCKMAP
|
|
+NOCLIP
|
|
}
|
|
States
|
|
{
|
|
Spawn:
|
|
MTHD ABCDEFGHIJK 5 Bright;
|
|
Stop;
|
|
}
|
|
}
|
|
|