mirror of
https://github.com/ZDoom/qzdoom.git
synced 2024-11-28 15:02:01 +00:00
- scriptified Hexen's bats.
- removed AMinotaurFriend::IsOkayToAttack. The condition it checks (i.e. friendliness with player) is already covered by the base version of this function so this is quite redundant. - removed a few 'virtual' qualifiers from functions that never get overridden.
This commit is contained in:
parent
5bc89e7efc
commit
34fc6323a4
9 changed files with 98 additions and 123 deletions
|
@ -614,7 +614,7 @@ public:
|
||||||
|
|
||||||
virtual void BeginPlay(); // Called immediately after the actor is created
|
virtual void BeginPlay(); // Called immediately after the actor is created
|
||||||
virtual void PostBeginPlay(); // Called immediately before the actor's first tick
|
virtual void PostBeginPlay(); // Called immediately before the actor's first tick
|
||||||
virtual void LevelSpawned(); // Called after BeginPlay if this actor was spawned by the world
|
void LevelSpawned(); // Called after BeginPlay if this actor was spawned by the world
|
||||||
virtual void HandleSpawnFlags(); // Translates SpawnFlags into in-game flags.
|
virtual void HandleSpawnFlags(); // Translates SpawnFlags into in-game flags.
|
||||||
|
|
||||||
virtual void MarkPrecacheSounds() const; // Marks sounds used by this actor for precaching.
|
virtual void MarkPrecacheSounds() const; // Marks sounds used by this actor for precaching.
|
||||||
|
@ -733,7 +733,7 @@ public:
|
||||||
void ObtainInventory (AActor *other);
|
void ObtainInventory (AActor *other);
|
||||||
|
|
||||||
// Die. Now.
|
// Die. Now.
|
||||||
virtual bool Massacre ();
|
bool Massacre ();
|
||||||
|
|
||||||
// Transforms the actor into a finely-ground paste
|
// Transforms the actor into a finely-ground paste
|
||||||
virtual bool Grind(bool items);
|
virtual bool Grind(bool items);
|
||||||
|
@ -958,7 +958,7 @@ public:
|
||||||
{
|
{
|
||||||
SetOrigin(Pos() + vel, true);
|
SetOrigin(Pos() + vel, true);
|
||||||
}
|
}
|
||||||
virtual void SetOrigin(double x, double y, double z, bool moving);
|
void SetOrigin(double x, double y, double z, bool moving);
|
||||||
void SetOrigin(const DVector3 & npos, bool moving)
|
void SetOrigin(const DVector3 & npos, bool moving)
|
||||||
{
|
{
|
||||||
SetOrigin(npos.X, npos.Y, npos.Z, moving);
|
SetOrigin(npos.X, npos.Y, npos.Z, moving);
|
||||||
|
@ -970,7 +970,7 @@ public:
|
||||||
bool IsInsideVisibleAngles() const;
|
bool IsInsideVisibleAngles() const;
|
||||||
|
|
||||||
// Calculate amount of missile damage
|
// Calculate amount of missile damage
|
||||||
virtual int GetMissileDamage(int mask, int add);
|
int GetMissileDamage(int mask, int add);
|
||||||
|
|
||||||
bool CanSeek(AActor *target) const;
|
bool CanSeek(AActor *target) const;
|
||||||
|
|
||||||
|
|
|
@ -1,98 +0,0 @@
|
||||||
/*
|
|
||||||
#include "actor.h"
|
|
||||||
#include "info.h"
|
|
||||||
#include "m_random.h"
|
|
||||||
#include "p_local.h"
|
|
||||||
#include "s_sound.h"
|
|
||||||
#include "vm.h"
|
|
||||||
*/
|
|
||||||
|
|
||||||
static FRandom pr_batspawn ("BatSpawn");
|
|
||||||
static FRandom pr_batmove ("BatMove");
|
|
||||||
|
|
||||||
//===========================================================================
|
|
||||||
// Bat Spawner Variables
|
|
||||||
// special1 frequency counter
|
|
||||||
// special2
|
|
||||||
// args[0] frequency of spawn (1=fastest, 10=slowest)
|
|
||||||
// args[1] spread angle (0..255)
|
|
||||||
// args[2]
|
|
||||||
// args[3] duration of bats (in octics)
|
|
||||||
// args[4] turn amount per move (in degrees)
|
|
||||||
//
|
|
||||||
// Bat Variables
|
|
||||||
// special2 lifetime counter
|
|
||||||
// args[4] turn amount per move (in degrees)
|
|
||||||
//===========================================================================
|
|
||||||
|
|
||||||
DEFINE_ACTION_FUNCTION(AActor, A_BatSpawnInit)
|
|
||||||
{
|
|
||||||
PARAM_SELF_PROLOGUE(AActor);
|
|
||||||
|
|
||||||
self->special1 = 0; // Frequency count
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
DEFINE_ACTION_FUNCTION(AActor, A_BatSpawn)
|
|
||||||
{
|
|
||||||
PARAM_SELF_PROLOGUE(AActor);
|
|
||||||
|
|
||||||
AActor *mo;
|
|
||||||
int delta;
|
|
||||||
DAngle angle;
|
|
||||||
|
|
||||||
// Countdown until next spawn
|
|
||||||
if (self->special1-- > 0) return 0;
|
|
||||||
self->special1 = self->args[0]; // Reset frequency count
|
|
||||||
|
|
||||||
delta = self->args[1];
|
|
||||||
if (delta==0) delta=1;
|
|
||||||
|
|
||||||
angle = self->Angles.Yaw + (((pr_batspawn() % delta) - (delta >> 1)) * (360 / 256.));
|
|
||||||
|
|
||||||
mo = P_SpawnMissileAngle (self, PClass::FindActor("Bat"), angle, 0);
|
|
||||||
if (mo)
|
|
||||||
{
|
|
||||||
mo->args[0] = pr_batspawn()&63; // floatbob index
|
|
||||||
mo->args[4] = self->args[4]; // turn degrees
|
|
||||||
mo->special2 = self->args[3]<<3; // Set lifetime
|
|
||||||
mo->target = self;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
DEFINE_ACTION_FUNCTION(AActor, A_BatMove)
|
|
||||||
{
|
|
||||||
PARAM_SELF_PROLOGUE(AActor);
|
|
||||||
|
|
||||||
DAngle newangle;
|
|
||||||
|
|
||||||
if (self->special2 < 0)
|
|
||||||
{
|
|
||||||
self->SetState (self->FindState(NAME_Death));
|
|
||||||
}
|
|
||||||
self->special2 -= 2; // Called every 2 tics
|
|
||||||
|
|
||||||
if (pr_batmove()<128)
|
|
||||||
{
|
|
||||||
newangle = self->Angles.Yaw + self->args[4];
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
newangle = self->Angles.Yaw - self->args[4];
|
|
||||||
}
|
|
||||||
|
|
||||||
// Adjust velocity vector to new direction
|
|
||||||
self->VelFromAngle(self->Speed, newangle);
|
|
||||||
|
|
||||||
if (pr_batmove()<15)
|
|
||||||
{
|
|
||||||
S_Sound (self, CHAN_VOICE, "BatScream", 1, ATTN_IDLE);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Handle Z movement
|
|
||||||
self->SetZ(self->target->Z() + 2 * BobSin(self->args[0]));
|
|
||||||
self->args[0] = (self->args[0]+3)&63;
|
|
||||||
return 0;
|
|
||||||
}
|
|
|
@ -27,7 +27,6 @@
|
||||||
#include "vm.h"
|
#include "vm.h"
|
||||||
|
|
||||||
// Include all the Hexen stuff here to reduce compile time
|
// Include all the Hexen stuff here to reduce compile time
|
||||||
#include "a_bats.cpp"
|
|
||||||
#include "a_bishop.cpp"
|
#include "a_bishop.cpp"
|
||||||
#include "a_blastradius.cpp"
|
#include "a_blastradius.cpp"
|
||||||
#include "a_boostarmor.cpp"
|
#include "a_boostarmor.cpp"
|
||||||
|
|
|
@ -117,12 +117,6 @@ void AMinotaurFriend::Die (AActor *source, AActor *inflictor, int dmgflags)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool AMinotaurFriend::OkayToSwitchTarget (AActor *other)
|
|
||||||
{
|
|
||||||
if (other == tracer) return false; // Do not target the master
|
|
||||||
return Super::OkayToSwitchTarget (other);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Action functions for the minotaur ----------------------------------------
|
// Action functions for the minotaur ----------------------------------------
|
||||||
|
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
|
|
|
@ -21,7 +21,6 @@ public:
|
||||||
int StartTime;
|
int StartTime;
|
||||||
|
|
||||||
void Die (AActor *source, AActor *inflictor, int dmgflags);
|
void Die (AActor *source, AActor *inflictor, int dmgflags);
|
||||||
bool OkayToSwitchTarget (AActor *other);
|
|
||||||
void BeginPlay ();
|
void BeginPlay ();
|
||||||
|
|
||||||
void Serialize(FSerializer &arc);
|
void Serialize(FSerializer &arc);
|
||||||
|
|
|
@ -6885,6 +6885,14 @@ DEFINE_ACTION_FUNCTION(AActor, AddZ)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DEFINE_ACTION_FUNCTION(AActor, SetZ)
|
||||||
|
{
|
||||||
|
PARAM_SELF_PROLOGUE(AActor);
|
||||||
|
PARAM_FLOAT(z);
|
||||||
|
self->SetZ(z);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
DEFINE_ACTION_FUNCTION(AActor, SetDamage)
|
DEFINE_ACTION_FUNCTION(AActor, SetDamage)
|
||||||
{
|
{
|
||||||
PARAM_SELF_PROLOGUE(AActor);
|
PARAM_SELF_PROLOGUE(AActor);
|
||||||
|
|
|
@ -35,7 +35,6 @@ VMEXPORTED_NATIVES_START
|
||||||
VMEXPORTED_NATIVES_FUNC(Destroy)
|
VMEXPORTED_NATIVES_FUNC(Destroy)
|
||||||
VMEXPORTED_NATIVES_FUNC(Tick)
|
VMEXPORTED_NATIVES_FUNC(Tick)
|
||||||
VMEXPORTED_NATIVES_FUNC(PostBeginPlay)
|
VMEXPORTED_NATIVES_FUNC(PostBeginPlay)
|
||||||
VMEXPORTED_NATIVES_FUNC(DropInventory)
|
|
||||||
VMEXPORTED_NATIVES_END
|
VMEXPORTED_NATIVES_END
|
||||||
|
|
||||||
template<class T>
|
template<class T>
|
||||||
|
@ -103,11 +102,6 @@ public:
|
||||||
{
|
{
|
||||||
ExportedNatives<T>::Get()->template PostBeginPlay<void, T>(this);
|
ExportedNatives<T>::Get()->template PostBeginPlay<void, T>(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
AInventory *DropInventory(AInventory *item)
|
|
||||||
{
|
|
||||||
return ExportedNatives<T>::Get()->template DropInventory<AInventory *, T>(this, item);
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
template<class T>
|
template<class T>
|
||||||
|
@ -134,7 +128,7 @@ VMEXPORT_NATIVES_START(DThinker, DObject)
|
||||||
VMEXPORT_NATIVES_FUNC(PostBeginPlay)
|
VMEXPORT_NATIVES_FUNC(PostBeginPlay)
|
||||||
VMEXPORT_NATIVES_END(DThinker)
|
VMEXPORT_NATIVES_END(DThinker)
|
||||||
|
|
||||||
|
/*
|
||||||
VMEXPORT_NATIVES_START(AActor, DThinker)
|
VMEXPORT_NATIVES_START(AActor, DThinker)
|
||||||
VMEXPORT_NATIVES_FUNC(DropInventory)
|
|
||||||
VMEXPORT_NATIVES_END(AActor)
|
VMEXPORT_NATIVES_END(AActor)
|
||||||
|
*/
|
|
@ -53,6 +53,12 @@ class Actor : Thinker native
|
||||||
{
|
{
|
||||||
return GetPointer(ptr_select1) == GetPointer(ptr_select2);
|
return GetPointer(ptr_select1) == GetPointer(ptr_select2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static double BobSin(double fb)
|
||||||
|
{
|
||||||
|
return sin(fb * (180./32)) * 8;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
native static readonly<Actor> GetDefaultByType(class<Actor> cls);
|
native static readonly<Actor> GetDefaultByType(class<Actor> cls);
|
||||||
native static float deltaangle(float ang1, float ang2);
|
native static float deltaangle(float ang1, float ang2);
|
||||||
|
@ -84,6 +90,7 @@ class Actor : Thinker native
|
||||||
native bool CanSeek(Actor target);
|
native bool CanSeek(Actor target);
|
||||||
native double AngleTo(Actor target, bool absolute = false);
|
native double AngleTo(Actor target, bool absolute = false);
|
||||||
native void AddZ(float zadd);
|
native void AddZ(float zadd);
|
||||||
|
native void SetZ(float z);
|
||||||
native vector3 Vec3Offset(float x, float y, float z, bool absolute = false);
|
native vector3 Vec3Offset(float x, float y, float z, bool absolute = false);
|
||||||
native vector3 Vec3Angle(float length, float angle, float z = 0, bool absolute = false);
|
native vector3 Vec3Angle(float length, float angle, float z = 0, bool absolute = false);
|
||||||
native vector3 Vec2OffsetZ(float x, float y, float atz, bool absolute = false);
|
native vector3 Vec2OffsetZ(float x, float y, float atz, bool absolute = false);
|
||||||
|
|
|
@ -9,9 +9,6 @@ class BatSpawner : SwitchableDecoration
|
||||||
RenderStyle "None";
|
RenderStyle "None";
|
||||||
}
|
}
|
||||||
|
|
||||||
native void A_BatSpawnInit();
|
|
||||||
native void A_BatSpawn();
|
|
||||||
|
|
||||||
States
|
States
|
||||||
{
|
{
|
||||||
Spawn:
|
Spawn:
|
||||||
|
@ -24,6 +21,48 @@ class BatSpawner : SwitchableDecoration
|
||||||
TNT1 A -1;
|
TNT1 A -1;
|
||||||
Stop;
|
Stop;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
// Bat Spawner Variables
|
||||||
|
// special1 frequency counter
|
||||||
|
// special2
|
||||||
|
// args[0] frequency of spawn (1=fastest, 10=slowest)
|
||||||
|
// args[1] spread angle (0..255)
|
||||||
|
// args[2]
|
||||||
|
// args[3] duration of bats (in octics)
|
||||||
|
// args[4] turn amount per move (in degrees)
|
||||||
|
//
|
||||||
|
// Bat Variables
|
||||||
|
// special2 lifetime counter
|
||||||
|
// args[4] turn amount per move (in degrees)
|
||||||
|
//===========================================================================
|
||||||
|
|
||||||
|
void A_BatSpawnInit()
|
||||||
|
{
|
||||||
|
special1 = 0; // Frequency count
|
||||||
|
}
|
||||||
|
|
||||||
|
void A_BatSpawn()
|
||||||
|
{
|
||||||
|
// Countdown until next spawn
|
||||||
|
if (special1-- > 0) return;
|
||||||
|
special1 = args[0]; // Reset frequency count
|
||||||
|
|
||||||
|
int delta = args[1];
|
||||||
|
if (delta == 0) delta = 1;
|
||||||
|
|
||||||
|
double ang = Angle + (((random[BatSpawn]() % delta) - (delta >> 1)) * (360 / 256.));
|
||||||
|
|
||||||
|
Actor mo = SpawnMissileAngle ("Bat", ang, 0);
|
||||||
|
if (mo)
|
||||||
|
{
|
||||||
|
mo.args[0] = random[BatSpawn]() & 63; // floatbob index
|
||||||
|
mo.args[4] = args[4]; // turn degrees
|
||||||
|
mo.special2 = args[3] << 3; // Set lifetime
|
||||||
|
mo.target = self;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Bat ----------------------------------------------------------------------
|
// Bat ----------------------------------------------------------------------
|
||||||
|
@ -39,8 +78,6 @@ class Bat : Actor
|
||||||
+NOTELEPORT +CANPASS
|
+NOTELEPORT +CANPASS
|
||||||
}
|
}
|
||||||
|
|
||||||
native void A_BatMove();
|
|
||||||
|
|
||||||
States
|
States
|
||||||
{
|
{
|
||||||
Spawn:
|
Spawn:
|
||||||
|
@ -50,4 +87,39 @@ class Bat : Actor
|
||||||
ABAT A 2;
|
ABAT A 2;
|
||||||
Stop;
|
Stop;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void A_BatMove()
|
||||||
|
{
|
||||||
|
if (special2 < 0)
|
||||||
|
{
|
||||||
|
SetState ("Death");
|
||||||
|
}
|
||||||
|
special2 -= 2; // Called every 2 tics
|
||||||
|
|
||||||
|
double newangle;
|
||||||
|
if (random[BatMove]() < 128)
|
||||||
|
{
|
||||||
|
newangle = Angle + args[4];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
newangle = Angle - args[4];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Adjust velocity vector to new direction
|
||||||
|
VelFromAngle(Speed, newangle);
|
||||||
|
|
||||||
|
if (random[BatMove]() < 15)
|
||||||
|
{
|
||||||
|
A_PlaySound ("BatScream", CHAN_VOICE, 1, false, ATTN_IDLE);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Handle Z movement
|
||||||
|
SetZ(target.pos.Z + 2 * BobSin(args[0]));
|
||||||
|
args[0] = (args[0] + 3) & 63;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue