mirror of
https://github.com/ZDoom/gzdoom.git
synced 2025-02-28 06:41:47 +00:00
- scriptified a_spectral.cpp.
- consolidated A_Tracer and A_Tracer2. Note that this commit temporarily disables a few features in order to make it compile.
This commit is contained in:
parent
b171d6e21f
commit
dc9ee0727a
13 changed files with 160 additions and 220 deletions
|
@ -871,7 +871,6 @@ set( NOT_COMPILED_SOURCE_FILES
|
||||||
g_strife/a_reaver.cpp
|
g_strife/a_reaver.cpp
|
||||||
g_strife/a_rebels.cpp
|
g_strife/a_rebels.cpp
|
||||||
g_strife/a_sentinel.cpp
|
g_strife/a_sentinel.cpp
|
||||||
g_strife/a_spectral.cpp
|
|
||||||
g_strife/a_stalker.cpp
|
g_strife/a_stalker.cpp
|
||||||
g_strife/a_strifeitems.cpp
|
g_strife/a_strifeitems.cpp
|
||||||
g_strife/a_strifeweapons.cpp
|
g_strife/a_strifeweapons.cpp
|
||||||
|
|
|
@ -674,6 +674,7 @@ public:
|
||||||
|
|
||||||
// Something just touched this actor.
|
// Something just touched this actor.
|
||||||
virtual void Touch (AActor *toucher);
|
virtual void Touch (AActor *toucher);
|
||||||
|
void CallTouch(AActor *toucher);
|
||||||
|
|
||||||
// Adds the item to this actor's inventory and sets its Owner.
|
// Adds the item to this actor's inventory and sets its Owner.
|
||||||
virtual void AddInventory (AInventory *item);
|
virtual void AddInventory (AInventory *item);
|
||||||
|
|
|
@ -36,7 +36,6 @@ void A_SpectralMissile (AActor *self, const char *missilename)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
DECLARE_ACTION(A_SpotLightning)
|
|
||||||
DECLARE_ACTION(A_Spectre3Attack)
|
DECLARE_ACTION(A_Spectre3Attack)
|
||||||
|
|
||||||
|
|
||||||
|
@ -49,7 +48,7 @@ DEFINE_ACTION_FUNCTION(AActor, A_EntityAttack)
|
||||||
switch (pr_entity() % 5)
|
switch (pr_entity() % 5)
|
||||||
{
|
{
|
||||||
case 0:
|
case 0:
|
||||||
CALL_ACTION(A_SpotLightning, self);
|
//CALL_ACTION(A_SpotLightning, self);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 2:
|
case 2:
|
||||||
|
@ -57,7 +56,7 @@ DEFINE_ACTION_FUNCTION(AActor, A_EntityAttack)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 3:
|
case 3:
|
||||||
CALL_ACTION(A_Spectre3Attack, self);
|
//CALL_ACTION(A_Spectre3Attack, self);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 4:
|
case 4:
|
||||||
|
|
|
@ -94,32 +94,6 @@ DEFINE_ACTION_FUNCTION(AActor, A_ProgrammerMelee)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
//============================================================================
|
|
||||||
//
|
|
||||||
// A_SpotLightning
|
|
||||||
//
|
|
||||||
//============================================================================
|
|
||||||
|
|
||||||
DEFINE_ACTION_FUNCTION(AActor, A_SpotLightning)
|
|
||||||
{
|
|
||||||
PARAM_SELF_PROLOGUE(AActor);
|
|
||||||
|
|
||||||
AActor *spot;
|
|
||||||
|
|
||||||
if (self->target == NULL)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
spot = Spawn("SpectralLightningSpot", self->target->PosAtZ(self->target->floorz), ALLOW_REPLACE);
|
|
||||||
if (spot != NULL)
|
|
||||||
{
|
|
||||||
spot->threshold = 25;
|
|
||||||
spot->target = self;
|
|
||||||
spot->FriendPlayer = 0;
|
|
||||||
spot->tracer = self->target;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
//============================================================================
|
//============================================================================
|
||||||
//
|
//
|
||||||
// A_SpawnProgrammerBase
|
// A_SpawnProgrammerBase
|
||||||
|
|
|
@ -1,144 +0,0 @@
|
||||||
/*
|
|
||||||
#include "actor.h"
|
|
||||||
#include "m_random.h"
|
|
||||||
#include "a_action.h"
|
|
||||||
#include "p_local.h"
|
|
||||||
#include "s_sound.h"
|
|
||||||
#include "m_random.h"
|
|
||||||
#include "a_strifeglobal.h"
|
|
||||||
#include "vm.h"
|
|
||||||
*/
|
|
||||||
|
|
||||||
class ASpectralMonster : public AActor
|
|
||||||
{
|
|
||||||
DECLARE_CLASS (ASpectralMonster, AActor)
|
|
||||||
public:
|
|
||||||
void Touch (AActor *toucher);
|
|
||||||
};
|
|
||||||
|
|
||||||
IMPLEMENT_CLASS(ASpectralMonster, false, false)
|
|
||||||
|
|
||||||
void ASpectralMonster::Touch (AActor *toucher)
|
|
||||||
{
|
|
||||||
P_DamageMobj (toucher, this, this, 5, NAME_Melee);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
DEFINE_ACTION_FUNCTION(AActor, A_SpectralLightningTail)
|
|
||||||
{
|
|
||||||
PARAM_SELF_PROLOGUE(AActor);
|
|
||||||
|
|
||||||
AActor *foo = Spawn("SpectralLightningHTail", self->Vec3Offset(-self->Vel.X, -self->Vel.Y, 0.), ALLOW_REPLACE);
|
|
||||||
|
|
||||||
foo->Angles.Yaw = self->Angles.Yaw;
|
|
||||||
foo->FriendPlayer = self->FriendPlayer;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
DEFINE_ACTION_FUNCTION(AActor, A_SpectralBigBallLightning)
|
|
||||||
{
|
|
||||||
PARAM_SELF_PROLOGUE(AActor);
|
|
||||||
|
|
||||||
PClassActor *cls = PClass::FindActor("SpectralLightningH3");
|
|
||||||
if (cls)
|
|
||||||
{
|
|
||||||
self->Angles.Yaw += 90.;
|
|
||||||
P_SpawnSubMissile (self, cls, self->target);
|
|
||||||
self->Angles.Yaw += 180.;
|
|
||||||
P_SpawnSubMissile (self, cls, self->target);
|
|
||||||
self->Angles.Yaw -= 270.;
|
|
||||||
P_SpawnSubMissile (self, cls, self->target);
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static FRandom pr_zap5 ("Zap5");
|
|
||||||
|
|
||||||
DEFINE_ACTION_FUNCTION(AActor, A_SpectralLightning)
|
|
||||||
{
|
|
||||||
PARAM_SELF_PROLOGUE(AActor);
|
|
||||||
|
|
||||||
AActor *flash;
|
|
||||||
|
|
||||||
if (self->threshold != 0)
|
|
||||||
--self->threshold;
|
|
||||||
|
|
||||||
self->Vel.X += pr_zap5.Random2(3);
|
|
||||||
self->Vel.Y += pr_zap5.Random2(3);
|
|
||||||
|
|
||||||
double xo = pr_zap5.Random2(3) * 50.;
|
|
||||||
double yo = pr_zap5.Random2(3) * 50.;
|
|
||||||
|
|
||||||
flash = Spawn (self->threshold > 25 ? PClass::FindActor(NAME_SpectralLightningV2) :
|
|
||||||
PClass::FindActor(NAME_SpectralLightningV1), self->Vec2OffsetZ(xo, yo, ONCEILINGZ), ALLOW_REPLACE);
|
|
||||||
|
|
||||||
flash->target = self->target;
|
|
||||||
flash->Vel.Z = -18;
|
|
||||||
flash->FriendPlayer = self->FriendPlayer;
|
|
||||||
|
|
||||||
flash = Spawn(NAME_SpectralLightningV2, self->PosAtZ(ONCEILINGZ), ALLOW_REPLACE);
|
|
||||||
|
|
||||||
flash->target = self->target;
|
|
||||||
flash->Vel.Z = -18;
|
|
||||||
flash->FriendPlayer = self->FriendPlayer;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// In Strife, this number is stored in the data segment, but it doesn't seem to be
|
|
||||||
// altered anywhere.
|
|
||||||
#define TRACEANGLE (19.6875)
|
|
||||||
|
|
||||||
DEFINE_ACTION_FUNCTION(AActor, A_Tracer2)
|
|
||||||
{
|
|
||||||
PARAM_SELF_PROLOGUE(AActor);
|
|
||||||
|
|
||||||
AActor *dest;
|
|
||||||
double dist;
|
|
||||||
double slope;
|
|
||||||
|
|
||||||
dest = self->tracer;
|
|
||||||
|
|
||||||
if (!dest || dest->health <= 0 || self->Speed == 0 || !self->CanSeek(dest))
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
DAngle exact = self->AngleTo(dest);
|
|
||||||
DAngle diff = deltaangle(self->Angles.Yaw, exact);
|
|
||||||
|
|
||||||
if (diff < 0)
|
|
||||||
{
|
|
||||||
self->Angles.Yaw -= TRACEANGLE;
|
|
||||||
if (deltaangle(self->Angles.Yaw, exact) > 0)
|
|
||||||
self->Angles.Yaw = exact;
|
|
||||||
}
|
|
||||||
else if (diff > 0)
|
|
||||||
{
|
|
||||||
self->Angles.Yaw += TRACEANGLE;
|
|
||||||
if (deltaangle(self->Angles.Yaw, exact) < 0.)
|
|
||||||
self->Angles.Yaw = exact;
|
|
||||||
}
|
|
||||||
|
|
||||||
self->VelFromAngle();
|
|
||||||
|
|
||||||
if (!(self->flags3 & (MF3_FLOORHUGGER|MF3_CEILINGHUGGER)))
|
|
||||||
{
|
|
||||||
// change slope
|
|
||||||
dist = self->DistanceBySpeed (dest, self->Speed);
|
|
||||||
if (dest->Height >= 56)
|
|
||||||
{
|
|
||||||
slope = (dest->Z()+40 - self->Z()) / dist;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
slope = (dest->Z() + self->Height*(2./3) - self->Z()) / dist;
|
|
||||||
}
|
|
||||||
if (slope < self->Vel.Z)
|
|
||||||
{
|
|
||||||
self->Vel.Z -= 1 / 8.;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
self->Vel.Z += 1 / 8.;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
|
@ -24,7 +24,6 @@
|
||||||
#include "vm.h"
|
#include "vm.h"
|
||||||
|
|
||||||
// Include all the other Strife stuff here to reduce compile time
|
// Include all the other Strife stuff here to reduce compile time
|
||||||
#include "a_spectral.cpp"
|
|
||||||
#include "a_coin.cpp"
|
#include "a_coin.cpp"
|
||||||
#include "a_crusader.cpp"
|
#include "a_crusader.cpp"
|
||||||
#include "a_entityboss.cpp"
|
#include "a_entityboss.cpp"
|
||||||
|
|
|
@ -105,8 +105,7 @@ void P_TouchSpecialThing (AActor *special, AActor *toucher)
|
||||||
toucher->player->Bot->prev = toucher->player->Bot->dest;
|
toucher->player->Bot->prev = toucher->player->Bot->dest;
|
||||||
toucher->player->Bot->dest = NULL;
|
toucher->player->Bot->dest = NULL;
|
||||||
}
|
}
|
||||||
|
special->CallTouch (toucher);
|
||||||
special->Touch (toucher);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1440,6 +1440,25 @@ void AActor::Touch (AActor *toucher)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DEFINE_ACTION_FUNCTION(AActor, Touch)
|
||||||
|
{
|
||||||
|
PARAM_SELF_PROLOGUE(AActor);
|
||||||
|
PARAM_OBJECT(toucher, AActor);
|
||||||
|
self->Touch(toucher);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void AActor::CallTouch(AActor *toucher)
|
||||||
|
{
|
||||||
|
IFVIRTUAL(AActor, Touch)
|
||||||
|
{
|
||||||
|
VMValue params[2] = { (DObject*)this, toucher };
|
||||||
|
VMFrameStack stack;
|
||||||
|
stack.Call(func, params, 2, nullptr, 0, nullptr);
|
||||||
|
}
|
||||||
|
else Touch(toucher);
|
||||||
|
}
|
||||||
|
|
||||||
//============================================================================
|
//============================================================================
|
||||||
//
|
//
|
||||||
// AActor :: Grind
|
// AActor :: Grind
|
||||||
|
|
|
@ -498,11 +498,14 @@ void player_t::SetLogText (const char *text)
|
||||||
{
|
{
|
||||||
LogText = text;
|
LogText = text;
|
||||||
|
|
||||||
|
if (mo->CheckLocalView(consoleplayer))
|
||||||
|
{
|
||||||
// Print log text to console
|
// Print log text to console
|
||||||
AddToConsole(-1, TEXTCOLOR_GOLD);
|
AddToConsole(-1, TEXTCOLOR_GOLD);
|
||||||
AddToConsole(-1, LogText);
|
AddToConsole(-1, LogText);
|
||||||
AddToConsole(-1, "\n");
|
AddToConsole(-1, "\n");
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
DEFINE_ACTION_FUNCTION(_PlayerInfo, SetLogText)
|
DEFINE_ACTION_FUNCTION(_PlayerInfo, SetLogText)
|
||||||
{
|
{
|
||||||
|
|
|
@ -268,6 +268,7 @@ class Actor : Thinker native
|
||||||
virtual native bool Slam(Actor victim);
|
virtual native bool Slam(Actor victim);
|
||||||
virtual native bool UseInventory(Inventory item);
|
virtual native bool UseInventory(Inventory item);
|
||||||
virtual native bool SpecialBlastHandling (Actor source, double strength);
|
virtual native bool SpecialBlastHandling (Actor source, double strength);
|
||||||
|
virtual native void Touch(Actor toucher);
|
||||||
|
|
||||||
virtual int SpecialMissileHit (Actor victim) // for this no native version exists
|
virtual int SpecialMissileHit (Actor victim) // for this no native version exists
|
||||||
{
|
{
|
||||||
|
@ -617,7 +618,6 @@ class Actor : Thinker native
|
||||||
native void A_TossGib();
|
native void A_TossGib();
|
||||||
native void A_SentinelBob();
|
native void A_SentinelBob();
|
||||||
native void A_SentinelRefire();
|
native void A_SentinelRefire();
|
||||||
native void A_Tracer2();
|
|
||||||
native void A_SetShadow();
|
native void A_SetShadow();
|
||||||
native void A_ClearShadow();
|
native void A_ClearShadow();
|
||||||
native void A_GetHurt();
|
native void A_GetHurt();
|
||||||
|
|
|
@ -129,8 +129,6 @@ class RevenantTracerSmoke : Actor
|
||||||
|
|
||||||
extend class Actor
|
extend class Actor
|
||||||
{
|
{
|
||||||
const TRACEANGLE = (16.875);
|
|
||||||
|
|
||||||
void A_SkelMissile()
|
void A_SkelMissile()
|
||||||
{
|
{
|
||||||
if (target == null) return;
|
if (target == null) return;
|
||||||
|
@ -166,32 +164,11 @@ extend class Actor
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void A_Tracer()
|
void A_Tracer2(double traceang = 19.6875)
|
||||||
{
|
{
|
||||||
double dist;
|
double dist;
|
||||||
double slope;
|
double slope;
|
||||||
Actor dest;
|
Actor dest;
|
||||||
Actor smoke;
|
|
||||||
|
|
||||||
// killough 1/18/98: this is why some missiles do not have smoke
|
|
||||||
// and some do. Also, internal demos start at random gametics, thus
|
|
||||||
// the bug in which revenants cause internal demos to go out of sync.
|
|
||||||
//
|
|
||||||
// killough 3/6/98: fix revenant internal demo bug by subtracting
|
|
||||||
// levelstarttic from gametic:
|
|
||||||
//
|
|
||||||
// [RH] level.time is always 0-based, so nothing special to do here.
|
|
||||||
|
|
||||||
if (level.time & 3) return;
|
|
||||||
|
|
||||||
// spawn a puff of smoke behind the rocket
|
|
||||||
SpawnPuff ("BulletPuff", pos, angle, angle, 3);
|
|
||||||
smoke = Spawn ("RevenantTracerSmoke", Vec3Offset(-Vel.X, -Vel.Y, 0.), ALLOW_REPLACE);
|
|
||||||
|
|
||||||
smoke.Vel.Z = 1.;
|
|
||||||
smoke.tics -= random[Tracer](0, 3);
|
|
||||||
if (smoke.tics < 1)
|
|
||||||
smoke.tics = 1;
|
|
||||||
|
|
||||||
// adjust direction
|
// adjust direction
|
||||||
dest = tracer;
|
dest = tracer;
|
||||||
|
@ -205,13 +182,13 @@ extend class Actor
|
||||||
|
|
||||||
if (diff < 0)
|
if (diff < 0)
|
||||||
{
|
{
|
||||||
angle -= TRACEANGLE;
|
angle -= traceang;
|
||||||
if (deltaangle(angle, exact) > 0)
|
if (deltaangle(angle, exact) > 0)
|
||||||
angle = exact;
|
angle = exact;
|
||||||
}
|
}
|
||||||
else if (diff > 0)
|
else if (diff > 0)
|
||||||
{
|
{
|
||||||
angle += TRACEANGLE;
|
angle += traceang;
|
||||||
if (deltaangle(angle, exact) < 0.)
|
if (deltaangle(angle, exact) < 0.)
|
||||||
angle = exact;
|
angle = exact;
|
||||||
}
|
}
|
||||||
|
@ -238,5 +215,31 @@ extend class Actor
|
||||||
Vel.Z += 1. / 8;
|
Vel.Z += 1. / 8;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void A_Tracer()
|
||||||
|
{
|
||||||
|
// killough 1/18/98: this is why some missiles do not have smoke
|
||||||
|
// and some do. Also, internal demos start at random gametics, thus
|
||||||
|
// the bug in which revenants cause internal demos to go out of sync.
|
||||||
|
//
|
||||||
|
// killough 3/6/98: fix revenant internal demo bug by subtracting
|
||||||
|
// levelstarttic from gametic:
|
||||||
|
//
|
||||||
|
// [RH] level.time is always 0-based, so nothing special to do here.
|
||||||
|
|
||||||
|
if (level.time & 3) return;
|
||||||
|
|
||||||
|
// spawn a puff of smoke behind the rocket
|
||||||
|
SpawnPuff ("BulletPuff", pos, angle, angle, 3);
|
||||||
|
Actor smoke = Spawn ("RevenantTracerSmoke", Vec3Offset(-Vel.X, -Vel.Y, 0.), ALLOW_REPLACE);
|
||||||
|
|
||||||
|
smoke.Vel.Z = 1.;
|
||||||
|
smoke.tics -= random[Tracer](0, 3);
|
||||||
|
if (smoke.tics < 1)
|
||||||
|
smoke.tics = 1;
|
||||||
|
|
||||||
|
// The rest of this function was identical with Strife's version, except for the angle being used.
|
||||||
|
A_Tracer2(16.875);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -36,7 +36,6 @@ class Programmer : Actor
|
||||||
native void A_ProgrammerMelee ();
|
native void A_ProgrammerMelee ();
|
||||||
native void A_SpawnProgrammerBase ();
|
native void A_SpawnProgrammerBase ();
|
||||||
native void A_ProgrammerDeath ();
|
native void A_ProgrammerDeath ();
|
||||||
native void A_SpotLightning();
|
|
||||||
|
|
||||||
States
|
States
|
||||||
{
|
{
|
||||||
|
@ -80,6 +79,27 @@ class Programmer : Actor
|
||||||
PRGR X -1 Bright A_ProgrammerDeath;
|
PRGR X -1 Bright A_ProgrammerDeath;
|
||||||
Stop;
|
Stop;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//============================================================================
|
||||||
|
//
|
||||||
|
// A_SpotLightning
|
||||||
|
//
|
||||||
|
//============================================================================
|
||||||
|
|
||||||
|
void A_SpotLightning()
|
||||||
|
{
|
||||||
|
if (target == NULL) return;
|
||||||
|
|
||||||
|
Actor spot = Spawn("SpectralLightningSpot", (target.pos.xy, target.floorz), ALLOW_REPLACE);
|
||||||
|
if (spot != NULL)
|
||||||
|
{
|
||||||
|
spot.threshold = 25;
|
||||||
|
spot.target = self;
|
||||||
|
spot.FriendPlayer = 0;
|
||||||
|
spot.tracer = target;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
// base for all spectral monsters which hurt when being touched--------------
|
// base for all spectral monsters which hurt when being touched--------------
|
||||||
|
|
||||||
class SpectralMonster : Actor native
|
class SpectralMonster : Actor
|
||||||
{
|
{
|
||||||
Default
|
Default
|
||||||
{
|
{
|
||||||
|
@ -12,6 +12,12 @@ class SpectralMonster : Actor native
|
||||||
+NOICEDEATH
|
+NOICEDEATH
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override void Touch (Actor toucher)
|
||||||
|
{
|
||||||
|
toucher.DamageMobj (self, self, 5, 'Melee');
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//============================================================================
|
//============================================================================
|
||||||
|
|
||||||
void A_SpectreChunkSmall ()
|
void A_SpectreChunkSmall ()
|
||||||
|
@ -71,7 +77,26 @@ class SpectralMonster : Actor native
|
||||||
Angle -= 90.;
|
Angle -= 90.;
|
||||||
}
|
}
|
||||||
|
|
||||||
native void A_SpotLightning ();
|
//============================================================================
|
||||||
|
//
|
||||||
|
// A_SpotLightning
|
||||||
|
//
|
||||||
|
//============================================================================
|
||||||
|
|
||||||
|
void A_SpotLightning()
|
||||||
|
{
|
||||||
|
if (target == null) return;
|
||||||
|
|
||||||
|
Actor spot = Spawn("SpectralLightningSpot", (target.pos.xy, target.floorz), ALLOW_REPLACE);
|
||||||
|
if (spot != null)
|
||||||
|
{
|
||||||
|
spot.threshold = 25;
|
||||||
|
spot.target = self;
|
||||||
|
spot.FriendPlayer = 0;
|
||||||
|
spot.tracer = target;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -180,7 +205,6 @@ class SpectralLightningH1 : SpectralLightningBase
|
||||||
+SPECTRAL
|
+SPECTRAL
|
||||||
}
|
}
|
||||||
|
|
||||||
native void A_SpectralLightningTail ();
|
|
||||||
|
|
||||||
States
|
States
|
||||||
{
|
{
|
||||||
|
@ -189,6 +213,14 @@ class SpectralLightningH1 : SpectralLightningBase
|
||||||
ZAP6 BC 4 Bright A_SpectralLightningTail;
|
ZAP6 BC 4 Bright A_SpectralLightningTail;
|
||||||
Loop;
|
Loop;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void A_SpectralLightningTail ()
|
||||||
|
{
|
||||||
|
Actor foo = Spawn("SpectralLightningHTail", Vec3Offset(-Vel.X, -Vel.Y, 0.), ALLOW_REPLACE);
|
||||||
|
|
||||||
|
foo.Angle = Angle;
|
||||||
|
foo.FriendPlayer = FriendPlayer;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -245,8 +277,6 @@ class SpectralLightningBigBall1 : SpectralLightningDeath2
|
||||||
+SPECTRAL
|
+SPECTRAL
|
||||||
}
|
}
|
||||||
|
|
||||||
native void A_SpectralBigBallLightning ();
|
|
||||||
|
|
||||||
States
|
States
|
||||||
{
|
{
|
||||||
Spawn:
|
Spawn:
|
||||||
|
@ -254,6 +284,21 @@ class SpectralLightningBigBall1 : SpectralLightningDeath2
|
||||||
ZAP7 CDE 6 Bright A_SpectralBigBallLightning;
|
ZAP7 CDE 6 Bright A_SpectralBigBallLightning;
|
||||||
Loop;
|
Loop;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void A_SpectralBigBallLightning ()
|
||||||
|
{
|
||||||
|
Class<Actor> cls = "SpectralLightningH3";
|
||||||
|
if (cls)
|
||||||
|
{
|
||||||
|
angle += 90.;
|
||||||
|
SpawnSubMissile (cls, target);
|
||||||
|
angle += 180.;
|
||||||
|
SpawnSubMissile (cls, target);
|
||||||
|
angle -= 270.;
|
||||||
|
SpawnSubMissile (cls, target);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -315,8 +360,6 @@ class SpectralLightningSpot : SpectralLightningDeath1
|
||||||
Alpha 0.6;
|
Alpha 0.6;
|
||||||
}
|
}
|
||||||
|
|
||||||
native void A_SpectralLightning ();
|
|
||||||
|
|
||||||
States
|
States
|
||||||
{
|
{
|
||||||
Spawn:
|
Spawn:
|
||||||
|
@ -325,6 +368,35 @@ class SpectralLightningSpot : SpectralLightningDeath1
|
||||||
ZAP5 CD 4 Bright A_Countdown;
|
ZAP5 CD 4 Bright A_Countdown;
|
||||||
Loop;
|
Loop;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void A_SpectralLightning ()
|
||||||
|
{
|
||||||
|
if (threshold != 0)
|
||||||
|
--threshold;
|
||||||
|
|
||||||
|
Vel.X += random2[Zap5](3);
|
||||||
|
Vel.Y += random2[Zap5](3);
|
||||||
|
|
||||||
|
double xo = random2[Zap5](3) * 50.;
|
||||||
|
double yo = random2[Zap5](3) * 50.;
|
||||||
|
|
||||||
|
class<Actor> cls;
|
||||||
|
if (threshold > 25) cls = "SpectralLightningV2";
|
||||||
|
else cls = "SpectralLightningV1";
|
||||||
|
|
||||||
|
Actor flash = Spawn (cls, Vec2OffsetZ(xo, yo, ONCEILINGZ), ALLOW_REPLACE);
|
||||||
|
|
||||||
|
flash.target = target;
|
||||||
|
flash.Vel.Z = -18;
|
||||||
|
flash.FriendPlayer = FriendPlayer;
|
||||||
|
|
||||||
|
flash = Spawn("SpectralLightningV2", (pos.xy, ONCEILINGZ), ALLOW_REPLACE);
|
||||||
|
|
||||||
|
flash.target = target;
|
||||||
|
flash.Vel.Z = -18;
|
||||||
|
flash.FriendPlayer = FriendPlayer;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Sigil Lightning (Big Vertical #1) ----------------------------------------
|
// Sigil Lightning (Big Vertical #1) ----------------------------------------
|
||||||
|
@ -357,7 +429,3 @@ class SpectralLightningBigV2 : SpectralLightningBigV1
|
||||||
Damage 60;
|
Damage 60;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue