qzdoom/wadsrc/static/zscript/strife/alienspectres.txt
Christoph Oelckers d4c0ee9e43 - address bad use of pitch in A_CustomMissile.
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.
2016-12-24 14:46:34 +01:00

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;
}
}