mirror of
https://github.com/ZDoom/gzdoom.git
synced 2024-11-27 22:33:17 +00:00
135cfcf016
- refactored state bitfield members into a flag word because the address of a bitfield cannot be taken, making such variables inaccessible to scripts. - actually use PNativeStruct for representing native structs defined in a script.
222 lines
4.3 KiB
Text
222 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.
|
|
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();
|
|
}
|
|
|
|
}
|
|
|