mirror of
https://github.com/ZDoom/gzdoom.git
synced 2024-11-27 14:22:13 +00:00
3d61d2c1f4
Nothing should ever assume that spawning an actor is unconditionally successful. There can always be some edge cases where this is not the case.
223 lines
4.3 KiB
Text
223 lines
4.3 KiB
Text
//===========================================================================
|
|
//
|
|
// Mancubus
|
|
//
|
|
//===========================================================================
|
|
class Fatso : Actor
|
|
{
|
|
Default
|
|
{
|
|
Health 600;
|
|
Radius 48;
|
|
Height 64;
|
|
Mass 1000;
|
|
Speed 8;
|
|
PainChance 80;
|
|
Monster;
|
|
+FLOORCLIP
|
|
+BOSSDEATH
|
|
SeeSound "fatso/sight";
|
|
PainSound "fatso/pain";
|
|
DeathSound "fatso/death";
|
|
ActiveSound "fatso/active";
|
|
Obituary "$OB_FATSO";
|
|
}
|
|
States
|
|
{
|
|
Spawn:
|
|
FATT AB 15 A_Look;
|
|
Loop;
|
|
See:
|
|
FATT AABBCCDDEEFF 4 A_Chase;
|
|
Loop;
|
|
Missile:
|
|
FATT G 20 A_FatRaise;
|
|
FATT H 10 BRIGHT A_FatAttack1;
|
|
FATT IG 5 A_FaceTarget;
|
|
FATT H 10 BRIGHT A_FatAttack2;
|
|
FATT IG 5 A_FaceTarget;
|
|
FATT H 10 BRIGHT A_FatAttack3;
|
|
FATT IG 5 A_FaceTarget;
|
|
Goto See;
|
|
Pain:
|
|
FATT J 3;
|
|
FATT J 3 A_Pain;
|
|
Goto See;
|
|
Death:
|
|
FATT K 6;
|
|
FATT L 6 A_Scream;
|
|
FATT M 6 A_NoBlocking;
|
|
FATT NOPQRS 6;
|
|
FATT T -1 A_BossDeath;
|
|
Stop;
|
|
Raise:
|
|
FATT R 5;
|
|
FATT QPONMLK 5;
|
|
Goto See;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
//===========================================================================
|
|
//
|
|
// Mancubus fireball
|
|
//
|
|
//===========================================================================
|
|
class FatShot : Actor
|
|
{
|
|
Default
|
|
{
|
|
Radius 6;
|
|
Height 8;
|
|
Speed 20;
|
|
Damage 8;
|
|
Projectile;
|
|
+RANDOMIZE
|
|
RenderStyle "Add";
|
|
Alpha 1;
|
|
SeeSound "fatso/attack";
|
|
DeathSound "fatso/shotx";
|
|
}
|
|
States
|
|
{
|
|
Spawn:
|
|
MANF AB 4 BRIGHT;
|
|
Loop;
|
|
Death:
|
|
MISL B 8 BRIGHT;
|
|
MISL C 6 BRIGHT;
|
|
MISL D 4 BRIGHT;
|
|
Stop;
|
|
}
|
|
}
|
|
|
|
|
|
//===========================================================================
|
|
//
|
|
// Code (must be attached to Actor)
|
|
//
|
|
//===========================================================================
|
|
|
|
extend class Actor
|
|
{
|
|
const FATSPREAD = 90./8;
|
|
|
|
|
|
void A_FatRaise()
|
|
{
|
|
A_FaceTarget();
|
|
A_PlaySound("fatso/raiseguns", CHAN_WEAPON);
|
|
}
|
|
|
|
//
|
|
// Mancubus attack,
|
|
// firing three missiles in three different directions?
|
|
// Doesn't look like it.
|
|
//
|
|
|
|
void A_FatAttack1(class<Actor> spawntype = "FatShot")
|
|
{
|
|
if (target)
|
|
{
|
|
A_FaceTarget ();
|
|
// Change direction to ...
|
|
Angle += FATSPREAD;
|
|
SpawnMissile (target, spawntype);
|
|
Actor missile = SpawnMissile (target, spawntype);
|
|
if (missile)
|
|
{
|
|
missile.Angle += FATSPREAD;
|
|
missile.VelFromAngle();
|
|
}
|
|
}
|
|
}
|
|
|
|
void A_FatAttack2(class<Actor> spawntype = "FatShot")
|
|
{
|
|
if (target)
|
|
{
|
|
A_FaceTarget ();
|
|
// Now here choose opposite deviation.
|
|
Angle -= FATSPREAD;
|
|
SpawnMissile (target, spawntype);
|
|
Actor missile = SpawnMissile (target, spawntype);
|
|
if (missile)
|
|
{
|
|
missile.Angle -= FATSPREAD;
|
|
missile.VelFromAngle();
|
|
}
|
|
}
|
|
}
|
|
|
|
void A_FatAttack3(class<Actor> spawntype = "FatShot")
|
|
{
|
|
if (target)
|
|
{
|
|
A_FaceTarget ();
|
|
Actor missile = SpawnMissile (target, spawntype);
|
|
if (missile)
|
|
{
|
|
missile.Angle -= FATSPREAD/2;
|
|
missile.VelFromAngle();
|
|
}
|
|
missile = SpawnMissile (target, spawntype);
|
|
if (missile)
|
|
{
|
|
missile.Angle += FATSPREAD/2;
|
|
missile.VelFromAngle();
|
|
}
|
|
}
|
|
}
|
|
|
|
//
|
|
// killough 9/98: a mushroom explosion effect, sorta :)
|
|
// Original idea: Linguica
|
|
//
|
|
|
|
void A_Mushroom(class<Actor> spawntype = "FatShot", int numspawns = 0, int flags = 0, double vrange = 4.0, double hrange = 0.5)
|
|
{
|
|
int i, j;
|
|
|
|
if (numspawns == 0)
|
|
{
|
|
numspawns = GetMissileDamage(0, 1);
|
|
}
|
|
|
|
A_Explode(128, 128, (flags & MSF_DontHurt) ? 0 : XF_HURTSOURCE);
|
|
|
|
// Now launch mushroom cloud
|
|
Actor aimtarget = Spawn("Mapspot", pos, NO_REPLACE); // We need something to aim at.
|
|
if (aimtarget == null) return;
|
|
Actor owner = (flags & MSF_DontHurt) ? target : self;
|
|
aimtarget.Height = Height;
|
|
|
|
bool shootmode = ((flags & MSF_Classic) || // Flag explicitely set, or no flags and compat options
|
|
(flags == 0 && CurState.bDehacked && compat_mushroom));
|
|
|
|
for (i = -numspawns; i <= numspawns; i += 8)
|
|
{
|
|
for (j = -numspawns; j <= numspawns; j += 8)
|
|
{
|
|
Actor mo;
|
|
aimtarget.SetXYZ(pos + (i, j, (i, j).Length() * vrange)); // Aim up fairly high
|
|
if (shootmode)
|
|
{ // Use old function for MBF compatibility
|
|
mo = OldSpawnMissile(aimtarget, spawntype, owner);
|
|
}
|
|
else // Use normal function
|
|
{
|
|
mo = SpawnMissile(aimtarget, spawntype, owner);
|
|
}
|
|
if (mo)
|
|
{ // Slow it down a bit
|
|
mo.Vel *= hrange;
|
|
mo.bNoGravity = false; // Make debris fall under gravity
|
|
}
|
|
}
|
|
}
|
|
aimtarget.Destroy();
|
|
}
|
|
|
|
}
|
|
|