mirror of
https://github.com/ZDoom/gzdoom.git
synced 2024-11-11 07:12:02 +00:00
- scriptified Hexen's spike, which was the last remaining item in the game directories.
- added a BlockThingsIterator for scripts.
This commit is contained in:
parent
f17f6c30c2
commit
0c969746d0
8 changed files with 146 additions and 136 deletions
|
@ -828,7 +828,6 @@ endif()
|
|||
file( GLOB HEADER_FILES
|
||||
${EXTRA_HEADER_DIRS}
|
||||
fragglescript/*.h
|
||||
g_hexen/*.h
|
||||
g_shared/*.h
|
||||
g_strife/*.h
|
||||
intermission/*.h
|
||||
|
@ -859,7 +858,6 @@ set( NOT_COMPILED_SOURCE_FILES
|
|||
${OTHER_SYSTEM_SOURCES}
|
||||
sc_man_scanner.h
|
||||
sc_man_scanner.re
|
||||
g_hexen/a_spike.cpp
|
||||
g_shared/sbarinfo_commands.cpp
|
||||
xlat/xlat_parser.y
|
||||
xlat_parser.c
|
||||
|
@ -1108,7 +1106,6 @@ set (PCH_SOURCES
|
|||
w_wad.cpp
|
||||
wi_stuff.cpp
|
||||
zstrformat.cpp
|
||||
g_hexen/a_hexenmisc.cpp
|
||||
g_strife/strife_sbar.cpp
|
||||
g_shared/a_action.cpp
|
||||
g_shared/a_armor.cpp
|
||||
|
@ -1258,7 +1255,6 @@ endif()
|
|||
|
||||
target_link_libraries( zdoom ${ZDOOM_LIBS} gdtoa dumb lzma )
|
||||
include_directories( .
|
||||
g_hexen
|
||||
g_strife
|
||||
g_shared
|
||||
oplsynth
|
||||
|
@ -1389,7 +1385,6 @@ source_group("External\\Math" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/m
|
|||
source_group("External\\RapidJSON" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/rapidjson/.+")
|
||||
source_group("Externak\\SFMT" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/sfmt/.+")
|
||||
source_group("FraggleScript" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/fragglescript/.+")
|
||||
source_group("Games\\Hexen Game" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/g_hexen/.+")
|
||||
source_group("Games\\Strife Game" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/g_strife/.+")
|
||||
source_group("Intermission" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/intermission/.+")
|
||||
source_group("Menu" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/menu/.+")
|
||||
|
|
|
@ -1,27 +0,0 @@
|
|||
#include "d_player.h"
|
||||
#include "info.h"
|
||||
#include "p_local.h"
|
||||
#include "s_sound.h"
|
||||
#include "a_action.h"
|
||||
#include "m_random.h"
|
||||
#include "a_sharedglobal.h"
|
||||
#include "i_system.h"
|
||||
#include "gi.h"
|
||||
#include "g_level.h"
|
||||
#include "p_enemy.h"
|
||||
#include "a_weaponpiece.h"
|
||||
#include "doomstat.h"
|
||||
#include "p_lnspec.h"
|
||||
#include "p_terrain.h"
|
||||
#include "m_bbox.h"
|
||||
#include "v_palette.h"
|
||||
#include "g_game.h"
|
||||
#include "p_blockmap.h"
|
||||
#include "r_utility.h"
|
||||
#include "p_maputl.h"
|
||||
#include "p_spec.h"
|
||||
#include "serializer.h"
|
||||
#include "a_pickups.h"
|
||||
|
||||
// Include all the Hexen stuff here to reduce compile time
|
||||
#include "a_spike.cpp"
|
|
@ -1,90 +0,0 @@
|
|||
/*
|
||||
#include "actor.h"
|
||||
#include "info.h"
|
||||
#include "m_random.h"
|
||||
#include "p_enemy.h"
|
||||
#include "p_local.h"
|
||||
#include "a_sharedglobal.h"
|
||||
#include "s_sound.h"
|
||||
#include "m_bbox.h"
|
||||
#include "vm.h"
|
||||
*/
|
||||
|
||||
static FRandom pr_thrustraise ("ThrustRaise");
|
||||
|
||||
// Spike (thrust floor) -----------------------------------------------------
|
||||
|
||||
// AThrustFloor is just a container for all the spike states.
|
||||
// All the real spikes subclass it.
|
||||
|
||||
class AThrustFloor : public AActor
|
||||
{
|
||||
DECLARE_CLASS (AThrustFloor, AActor)
|
||||
public:
|
||||
|
||||
void Activate (AActor *activator);
|
||||
void Deactivate (AActor *activator);
|
||||
};
|
||||
|
||||
IMPLEMENT_CLASS(AThrustFloor, false, false)
|
||||
|
||||
void AThrustFloor::Activate (AActor *activator)
|
||||
{
|
||||
if (args[0] == 0)
|
||||
{
|
||||
S_Sound (this, CHAN_BODY, "ThrustSpikeLower", 1, ATTN_NORM);
|
||||
renderflags &= ~RF_INVISIBLE;
|
||||
if (args[1])
|
||||
SetState (FindState ("BloodThrustRaise"));
|
||||
else
|
||||
SetState (FindState ("ThrustRaise"));
|
||||
}
|
||||
}
|
||||
|
||||
void AThrustFloor::Deactivate (AActor *activator)
|
||||
{
|
||||
if (args[0] == 1)
|
||||
{
|
||||
S_Sound (this, CHAN_BODY, "ThrustSpikeRaise", 1, ATTN_NORM);
|
||||
if (args[1])
|
||||
SetState (FindState ("BloodThrustLower"));
|
||||
else
|
||||
SetState (FindState ("ThrustLower"));
|
||||
}
|
||||
}
|
||||
|
||||
DEFINE_ACTION_FUNCTION(AActor, A_ThrustImpale)
|
||||
{
|
||||
PARAM_SELF_PROLOGUE(AActor);
|
||||
|
||||
// This doesn't need to iterate through portals.
|
||||
|
||||
FPortalGroupArray check;
|
||||
FMultiBlockThingsIterator it(check, self);
|
||||
FMultiBlockThingsIterator::CheckResult cres;
|
||||
while (it.Next(&cres))
|
||||
{
|
||||
double blockdist = self->radius + cres.thing->radius;
|
||||
if (fabs(cres.thing->X() - cres.Position.X) >= blockdist || fabs(cres.thing->Y() - cres.Position.Y) >= blockdist)
|
||||
continue;
|
||||
|
||||
// Q: Make this z-aware for everything? It never was before.
|
||||
if (cres.thing->Top() < self->Z() || cres.thing->Z() > self->Top())
|
||||
{
|
||||
if (self->Sector->PortalGroup != cres.thing->Sector->PortalGroup)
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!(cres.thing->flags & MF_SHOOTABLE) )
|
||||
continue;
|
||||
|
||||
if (cres.thing == self)
|
||||
continue; // don't clip against self
|
||||
|
||||
int newdam = P_DamageMobj (cres.thing, self, self, 10001, NAME_Crush);
|
||||
P_TraceBleed (newdam > 0 ? newdam : 10001, cres.thing);
|
||||
self->args[1] = 1; // Mark thrust thing as bloody
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -4652,16 +4652,6 @@ void P_TraceBleed(int damage, AActor *target, AActor *missile)
|
|||
P_TraceBleed(damage, target->PosPlusZ(target->Height/2), target, missile->AngleTo(target), pitch);
|
||||
}
|
||||
|
||||
DEFINE_ACTION_FUNCTION(AActor, TraceBleed)
|
||||
{
|
||||
PARAM_SELF_PROLOGUE(AActor);
|
||||
PARAM_INT(damage);
|
||||
PARAM_OBJECT(missile, AActor);
|
||||
|
||||
P_TraceBleed(damage, self, missile);
|
||||
return 0;
|
||||
}
|
||||
|
||||
//==========================================================================
|
||||
//
|
||||
//
|
||||
|
@ -4706,6 +4696,18 @@ void P_TraceBleed(int damage, AActor *target)
|
|||
}
|
||||
}
|
||||
|
||||
DEFINE_ACTION_FUNCTION(AActor, TraceBleed)
|
||||
{
|
||||
PARAM_SELF_PROLOGUE(AActor);
|
||||
PARAM_INT(damage);
|
||||
PARAM_OBJECT(missile, AActor);
|
||||
|
||||
if (missile) P_TraceBleed(damage, self, missile);
|
||||
else P_TraceBleed(damage, self);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
//==========================================================================
|
||||
//
|
||||
// [RH] Rail gun stuffage
|
||||
|
|
|
@ -1152,6 +1152,75 @@ void FMultiBlockThingsIterator::Reset()
|
|||
startIteratorForGroup(basegroup);
|
||||
}
|
||||
|
||||
//===========================================================================
|
||||
//
|
||||
// and the scriptable version
|
||||
//
|
||||
//===========================================================================
|
||||
|
||||
class DBlockThingsIterator : public DObject, public FMultiBlockThingsIterator
|
||||
{
|
||||
DECLARE_CLASS(DBlockThingsIterator, DObject);
|
||||
FPortalGroupArray check;
|
||||
public:
|
||||
FMultiBlockThingsIterator::CheckResult cres;
|
||||
|
||||
public:
|
||||
bool Next()
|
||||
{
|
||||
return FMultiBlockThingsIterator::Next(&cres);
|
||||
}
|
||||
|
||||
DBlockThingsIterator(AActor *origin = nullptr, double checkradius = -1, bool ignorerestricted = false)
|
||||
: FMultiBlockThingsIterator(check, origin, checkradius, ignorerestricted)
|
||||
{
|
||||
cres.thing = nullptr;
|
||||
cres.Position.Zero();
|
||||
cres.portalflags = 0;
|
||||
}
|
||||
|
||||
DBlockThingsIterator(double checkx, double checky, double checkz, double checkh, double checkradius, bool ignorerestricted, sector_t *newsec)
|
||||
: FMultiBlockThingsIterator(check, checkx, checky, checkz, checkh, checkradius, ignorerestricted, newsec)
|
||||
{
|
||||
cres.thing = nullptr;
|
||||
cres.Position.Zero();
|
||||
cres.portalflags = 0;
|
||||
}
|
||||
};
|
||||
|
||||
IMPLEMENT_CLASS(DBlockThingsIterator, false, false);
|
||||
|
||||
DEFINE_ACTION_FUNCTION(DBlockThingsIterator, Create)
|
||||
{
|
||||
PARAM_PROLOGUE;
|
||||
PARAM_OBJECT(origin, AActor);
|
||||
PARAM_FLOAT_DEF(radius);
|
||||
PARAM_BOOL_DEF(ignore);
|
||||
ACTION_RETURN_OBJECT(new DBlockThingsIterator(origin, radius, ignore));
|
||||
}
|
||||
|
||||
DEFINE_ACTION_FUNCTION(DBlockThingsIterator, CreateFromPos)
|
||||
{
|
||||
PARAM_PROLOGUE;
|
||||
PARAM_FLOAT(x);
|
||||
PARAM_FLOAT(y);
|
||||
PARAM_FLOAT(z);
|
||||
PARAM_FLOAT(h);
|
||||
PARAM_FLOAT(radius);
|
||||
PARAM_BOOL(ignore);
|
||||
ACTION_RETURN_OBJECT(new DBlockThingsIterator(x, y, z, h, radius, ignore, nullptr));
|
||||
}
|
||||
|
||||
DEFINE_ACTION_FUNCTION(DBlockThingsIterator, Next)
|
||||
{
|
||||
PARAM_SELF_PROLOGUE(DBlockThingsIterator);
|
||||
ACTION_RETURN_BOOL(self->Next());
|
||||
}
|
||||
|
||||
DEFINE_FIELD_NAMED(DBlockThingsIterator, cres.thing, thing);
|
||||
DEFINE_FIELD_NAMED(DBlockThingsIterator, cres.Position, position);
|
||||
DEFINE_FIELD_NAMED(DBlockThingsIterator, cres.portalflags, portalflags);
|
||||
|
||||
//===========================================================================
|
||||
//
|
||||
// FPathTraverse :: Intercepts
|
||||
|
|
|
@ -387,7 +387,7 @@ class Actor : Thinker native
|
|||
// DECORATE compatible functions
|
||||
native int CountInv(class<Inventory> itemtype, int ptr_select = AAPTR_DEFAULT);
|
||||
native double GetDistance(bool checkz, int ptr = AAPTR_TARGET);
|
||||
native double GetAngle(int flags, int ptr = AAPTR_DEFAULT);
|
||||
native double GetAngle(int flags, int ptr = AAPTR_TARGET);
|
||||
native double GetZAt(double px = 0, double py = 0, double angle = 0, int flags = 0, int pick_pointer = AAPTR_DEFAULT);
|
||||
native int GetSpawnHealth();
|
||||
native int GetGibHealth();
|
||||
|
|
|
@ -42,6 +42,17 @@ class ActorIterator : Object native
|
|||
native void Reinit();
|
||||
}
|
||||
|
||||
class BlockThingsIterator : Object native
|
||||
{
|
||||
native Actor thing;
|
||||
native Vector3 position;
|
||||
native int portalflags;
|
||||
|
||||
native static BlockThingsIterator Create(Actor origin, double checkradius = -1, bool ignorerestricted = false);
|
||||
native static BlockThingsIterator CreateFromPos(double checkx, double checky, double checkz, double checkh, double checkradius, bool ignorerestricted);
|
||||
native bool Next();
|
||||
}
|
||||
|
||||
class DropItem : Object native
|
||||
{
|
||||
native readonly DropItem Next;
|
||||
|
|
|
@ -18,7 +18,7 @@ class DirtClump : Actor
|
|||
|
||||
// Spike (thrust floor) -----------------------------------------------------
|
||||
|
||||
class ThrustFloor : Actor native
|
||||
class ThrustFloor : Actor
|
||||
{
|
||||
Default
|
||||
{
|
||||
|
@ -26,8 +26,6 @@ class ThrustFloor : Actor native
|
|||
Height 128;
|
||||
}
|
||||
|
||||
native void A_ThrustImpale();
|
||||
|
||||
States
|
||||
{
|
||||
ThrustRaising:
|
||||
|
@ -78,6 +76,31 @@ class ThrustFloor : Actor native
|
|||
Loop;
|
||||
}
|
||||
|
||||
override void Activate (Actor activator)
|
||||
{
|
||||
if (args[0] == 0)
|
||||
{
|
||||
A_PlaySound ("ThrustSpikeLower", CHAN_BODY);
|
||||
bInvisible = false;
|
||||
if (args[1])
|
||||
SetStateLabel("BloodThrustRaise");
|
||||
else
|
||||
SetStateLabel("ThrustRaise");
|
||||
}
|
||||
}
|
||||
|
||||
override void Deactivate (Actor activator)
|
||||
{
|
||||
if (args[0] == 1)
|
||||
{
|
||||
A_PlaySound ("ThrustSpikeRaise", CHAN_BODY);
|
||||
if (args[1])
|
||||
SetStateLabel("BloodThrustLower");
|
||||
else
|
||||
SetStateLabel("ThrustLower");
|
||||
}
|
||||
}
|
||||
|
||||
//===========================================================================
|
||||
//
|
||||
// Thrust floor stuff
|
||||
|
@ -150,6 +173,33 @@ class ThrustFloor : Actor native
|
|||
}
|
||||
|
||||
|
||||
void A_ThrustImpale()
|
||||
{
|
||||
BlockThingsIterator it = BlockThingsIterator.Create(self);
|
||||
while (it.Next())
|
||||
{
|
||||
double blockdist = radius + it.thing.radius;
|
||||
if (abs(it.thing.pos.x - it.Position.X) >= blockdist || abs(it.thing.pos.y - it.Position.Y) >= blockdist)
|
||||
continue;
|
||||
|
||||
// Q: Make this z-aware for everything? It never was before.
|
||||
if (it.thing.pos.z + it.thing.height < pos.z || it.thing.pos.z > pos.z + height)
|
||||
{
|
||||
if (CurSector.PortalGroup != it.thing.CurSector.PortalGroup)
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!it.thing.bShootable)
|
||||
continue;
|
||||
|
||||
if (it.thing == self)
|
||||
continue; // don't clip against self
|
||||
|
||||
int newdam = it.thing.DamageMobj (self, self, 10001, 'Crush');
|
||||
it.thing.TraceBleed (newdam > 0 ? newdam : 10001, null);
|
||||
args[1] = 1; // Mark thrust thing as bloody
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Spike up -----------------------------------------------------------------
|
||||
|
|
Loading…
Reference in a new issue