qzdoom-gpl/wadsrc/static/zscript/strife/loremaster.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

141 lines
2.5 KiB
Text

// Loremaster (aka Priest) --------------------------------------------------
class Loremaster : Actor
{
Default
{
Health 800;
Speed 10;
Radius 15;
Height 56;
FloatSpeed 5;
Monster;
+FLOAT
+NOBLOOD
+NOGRAVITY
+NOTDMATCH
+FLOORCLIP
+NOBLOCKMONST
+INCOMBAT
+LOOKALLAROUND
+NOICEDEATH
+NEVERRESPAWN
DamageFactor "Fire", 0.5;
MinMissileChance 150;
Tag "$TAG_PRIEST";
SeeSound "loremaster/sight";
AttackSound "loremaster/attack";
PainSound "loremaster/pain";
DeathSound "loremaster/death";
ActiveSound "loremaster/active";
Obituary "$OB_LOREMASTER";
DropItem "Junk";
}
States
{
Spawn:
PRST A 10 A_Look;
PRST B 10 A_SentinelBob;
Loop;
See:
PRST A 4 A_Chase;
PRST A 4 A_SentinelBob;
PRST B 4 A_Chase;
PRST B 4 A_SentinelBob;
PRST C 4 A_Chase;
PRST C 4 A_SentinelBob;
PRST D 4 A_Chase;
PRST D 4 A_SentinelBob;
Loop;
Melee:
PRST E 4 A_FaceTarget;
PRST F 4 A_CustomMeleeAttack((random[SpectreMelee](0,255)&9)*5);
PRST E 4 A_SentinelBob;
Goto See;
Missile:
PRST E 4 A_FaceTarget;
PRST F 4 A_SpawnProjectile("LoreShot", 32, 0);
PRST E 4 A_SentinelBob;
Goto See;
Death:
PDED A 6;
PDED B 6 A_Scream;
PDED C 6;
PDED D 6 A_Fall;
PDED E 6;
PDED FGHIJIJIJKL 5;
PDED MNOP 4;
PDED Q 4 A_SpawnItemEx("AlienSpectre5", 0, 0, 0, 0, 0, random[spectrespawn](0,255)*0.0078125, 0, SXF_NOCHECKPOSITION);
PDED RS 4;
PDED T -1;
Stop;
}
}
// Loremaster Projectile ----------------------------------------------------
class LoreShot : Actor
{
Default
{
Speed 20;
Height 14;
Radius 10;
Projectile;
+STRIFEDAMAGE
Damage 2;
MaxStepHeight 4;
SeeSound "loremaster/chain";
ActiveSound "loremaster/swish";
}
States
{
Spawn:
OCLW A 2 A_LoremasterChain;
Loop;
Death:
OCLW A 6;
Stop;
}
override int DoSpecialDamage (Actor victim, int damage, Name damagetype)
{
if (victim != NULL && target != NULL && !victim.bDontThrust)
{
Vector3 thrust = victim.Vec3To(target);
victim.Vel += thrust.Unit() * (255. * 50 / max(victim.Mass, 1));
}
return damage;
}
void A_LoremasterChain ()
{
A_PlaySound ("loremaster/active", CHAN_BODY);
Spawn("LoreShot2", Pos, ALLOW_REPLACE);
Spawn("LoreShot2", Vec3Offset(-Vel.x/2., -Vel.y/2., -Vel.z/2.), ALLOW_REPLACE);
Spawn("LoreShot2", Vec3Offset(-Vel.x, -Vel.y, -Vel.z), ALLOW_REPLACE);
}
}
// Loremaster Subprojectile -------------------------------------------------
class LoreShot2 : Actor
{
Default
{
+NOBLOCKMAP
+NOGRAVITY
}
States
{
Spawn:
TEND A 20;
Stop;
}
}