gzdoom-gles/wadsrc/static/zscript/heretic/hereticmisc.txt
Christoph Oelckers 3d61d2c1f4 - reviewd script code for spawn calls that did not check their results.
Nothing should ever assume that spawning an actor is unconditionally successful. There can always be some edge cases where this is not the case.
2016-12-31 15:40:51 +01:00

399 lines
7.2 KiB
Text

class HereticWeapon : Weapon
{
Default
{
Weapon.Kickback 150;
}
}
// Pod ----------------------------------------------------------------------
class Pod : Actor
{
Default
{
Health 45;
Radius 16;
Height 54;
Painchance 255;
+SOLID +NOBLOOD +SHOOTABLE +DROPOFF
+WINDTHRUST +PUSHABLE +SLIDESONWALLS
+CANPASS +TELESTOMP +DONTMORPH
+NOBLOCKMONST +DONTGIB +OLDRADIUSDMG
DeathSound "world/podexplode";
PushFactor 0.5;
}
States
{
Spawn:
PPOD A 10;
Loop;
Pain:
PPOD B 14 A_PodPain;
Goto Spawn;
Death:
PPOD C 5 BRIGHT A_RemovePod;
PPOD D 5 BRIGHT A_Scream;
PPOD E 5 BRIGHT A_Explode;
PPOD F 10 BRIGHT;
Stop;
Grow:
PPOD IJKLMNOP 3;
Goto Spawn;
}
//----------------------------------------------------------------------------
//
// PROC A_PodPain
//
//----------------------------------------------------------------------------
void A_PodPain (class<Actor> gootype = "PodGoo")
{
int chance = Random[PodPain]();
if (chance < 128)
{
return;
}
for (int count = chance > 240 ? 2 : 1; count; count--)
{
Actor goo = Spawn(gootype, pos + (0, 0, 48), ALLOW_REPLACE);
if (goo != null)
{
goo.target = self;
goo.Vel.X = Random2[PodPain]() / 128.;
goo.Vel.Y = Random2[PodPain]() / 128.;
goo.Vel.Z = 0.5 + random[PodPain]() / 128.;
}
}
}
//----------------------------------------------------------------------------
//
// PROC A_RemovePod
//
//----------------------------------------------------------------------------
void A_RemovePod ()
{
if (master && master.special1 > 0)
{
master.special1--;
}
}
}
// Pod goo (falls from pod when damaged) ------------------------------------
class PodGoo : Actor
{
Default
{
Radius 2;
Height 4;
Gravity 0.125;
+NOBLOCKMAP +MISSILE +DROPOFF
+NOTELEPORT +CANNOTPUSH
}
States
{
Spawn:
PPOD GH 8;
Loop;
Death:
PPOD G 10;
Stop;
}
}
// Pod generator ------------------------------------------------------------
class PodGenerator : Actor
{
Default
{
+NOBLOCKMAP
+NOSECTOR
+DONTSPLASH
AttackSound "world/podgrow";
}
States
{
Spawn:
TNT1 A 35 A_MakePod;
Loop;
}
//----------------------------------------------------------------------------
//
// PROC A_MakePod
//
//----------------------------------------------------------------------------
const MAX_GEN_PODS = 16;
void A_MakePod (class<Actor> podtype = "Pod")
{
if (special1 >= MAX_GEN_PODS)
{ // Too many generated pods
return;
}
Actor mo = Spawn(podtype, (pos.xy, ONFLOORZ), ALLOW_REPLACE);
if (!mo) return;
if (!mo.CheckPosition (mo.Pos.xy))
{ // Didn't fit
mo.Destroy ();
return;
}
mo.SetStateLabel("Grow");
mo.Thrust(4.5, random[MakePod]() * (360. / 256));
A_PlaySound (AttackSound, CHAN_BODY);
special1++; // Increment generated pod count
mo.master = self; // Link the generator to the pod
}
}
// Teleglitter generator 1 --------------------------------------------------
class TeleGlitterGenerator1 : Actor
{
Default
{
+NOBLOCKMAP
+NOGRAVITY
+DONTSPLASH
+MOVEWITHSECTOR
}
States
{
Spawn:
TNT1 A 8 A_SpawnItemEx("TeleGlitter1", random[TeleGlitter](0,31)-16, random[TeleGlitter](0,31)-16, 0, 0,0,0.25);
Loop;
}
}
// Teleglitter generator 2 --------------------------------------------------
class TeleGlitterGenerator2 : Actor
{
Default
{
+NOBLOCKMAP
+NOGRAVITY
+DONTSPLASH
+MOVEWITHSECTOR
}
States
{
Spawn:
TNT1 A 8 A_SpawnItemEx("TeleGlitter2", random[TeleGlitter2](0,31)-16, random[TeleGlitter2](0,31)-16, 0, 0,0,0.25);
Loop;
}
}
// Teleglitter 1 ------------------------------------------------------------
class TeleGlitter1 : Actor
{
Default
{
+NOBLOCKMAP +NOGRAVITY +MISSILE
RenderStyle "Add";
Damage 0;
}
States
{
Spawn:
TGLT A 2 BRIGHT;
TGLT B 2 BRIGHT A_AccTeleGlitter;
TGLT C 2 BRIGHT;
TGLT D 2 BRIGHT A_AccTeleGlitter;
TGLT E 2 BRIGHT;
Loop;
}
//----------------------------------------------------------------------------
//
// PROC A_AccTeleGlitter
//
//----------------------------------------------------------------------------
void A_AccTeleGlitter ()
{
if (++health > 35)
{
Vel.Z *= 1.5;
}
}
}
// Teleglitter 2 ------------------------------------------------------------
class TeleGlitter2 : TeleGlitter1
{
States
{
Spawn:
TGLT F 2 BRIGHT;
TGLT G 2 BRIGHT A_AccTeleGlitter;
TGLT H 2 BRIGHT;
TGLT I 2 BRIGHT A_AccTeleGlitter;
TGLT J 2 BRIGHT;
Loop;
}
}
// --- Volcano --------------------------------------------------------------
class Volcano : Actor
{
Default
{
Radius 12;
Height 20;
+SOLID
}
States
{
Spawn:
VLCO A 350;
VLCO A 35 A_VolcanoSet;
VLCO BCDBCD 3;
VLCO E 10 A_VolcanoBlast;
Goto Spawn+1;
}
//----------------------------------------------------------------------------
//
// PROC A_VolcanoSet
//
//----------------------------------------------------------------------------
void A_VolcanoSet ()
{
tics = 105 + (random[VolcanoSet]() & 127);
}
//----------------------------------------------------------------------------
//
// PROC A_VolcanoBlast
//
//----------------------------------------------------------------------------
void A_VolcanoBlast ()
{
int count = random[VolcanoBlast](1,3);
for (int i = 0; i < count; i++)
{
Actor blast = Spawn("VolcanoBlast", pos + (0, 0, 44), ALLOW_REPLACE);
if (blast != null)
{
blast.target = self;
blast.Angle = random[VolcanoBlast]() * (360 / 256.);
blast.VelFromAngle(1.);
blast.Vel.Z = 2.5 + random[VolcanoBlast]() / 64.;
blast.A_PlaySound ("world/volcano/shoot", CHAN_BODY);
blast.CheckMissileSpawn (radius);
}
}
}
}
// Volcano blast ------------------------------------------------------------
class VolcanoBlast : Actor
{
Default
{
Radius 8;
Height 8;
Speed 2;
Damage 2;
DamageType "Fire";
Gravity 0.125;
+NOBLOCKMAP +MISSILE +DROPOFF
+NOTELEPORT
DeathSound "world/volcano/blast";
}
States
{
Spawn:
VFBL AB 4 BRIGHT A_SpawnItemEx("Puffy", random2[BeastPuff]()*0.015625, random2[BeastPuff]()*0.015625, random2[BeastPuff]()*0.015625,
0,0,0,0,SXF_ABSOLUTEPOSITION, 64);
Loop;
Death:
XPL1 A 4 BRIGHT A_VolcBallImpact;
XPL1 BCDEF 4 BRIGHT;
Stop;
}
//----------------------------------------------------------------------------
//
// PROC A_VolcBallImpact
//
//----------------------------------------------------------------------------
void A_VolcBallImpact ()
{
if (pos.Z <= floorz)
{
bNoGravity = true;
Gravity = 1;
AddZ(28);
}
A_Explode(25, 25, XF_NOSPLASH|XF_HURTSOURCE, false, 0, 0, 0, "BulletPuff", 'Fire');
for (int i = 0; i < 4; i++)
{
Actor tiny = Spawn("VolcanoTBlast", Pos, ALLOW_REPLACE);
if (tiny)
{
tiny.target = self;
tiny.Angle = 90.*i;
tiny.VelFromAngle(0.7);
tiny.Vel.Z = 1. + random[VolcBallImpact]() / 128.;
tiny.CheckMissileSpawn (radius);
}
}
}
}
// Volcano T Blast ----------------------------------------------------------
class VolcanoTBlast : Actor
{
Default
{
Radius 8;
Height 6;
Speed 2;
Damage 1;
DamageType "Fire";
Gravity 0.125;
+NOBLOCKMAP +MISSILE +DROPOFF
+NOTELEPORT
}
States
{
Spawn:
VTFB AB 4 BRIGHT;
Loop;
Death:
SFFI CBABCDE 4 BRIGHT;
Stop;
}
}