mirror of
https://github.com/ZDoom/gzdoom.git
synced 2024-11-07 21:41:07 +00:00
299 lines
7.5 KiB
C++
299 lines
7.5 KiB
C++
|
#include "actor.h"
|
||
|
#include "info.h"
|
||
|
#include "m_random.h"
|
||
|
|
||
|
static FRandom pr_dirt ("SpawnDirt");
|
||
|
|
||
|
// Convenient macros --------------------------------------------------------
|
||
|
|
||
|
#define _DEBCOMMON(cls,parent,ns,dstate,sid) \
|
||
|
class cls : public parent { DECLARE_STATELESS_ACTOR (cls, parent) static FState States[ns]; }; \
|
||
|
IMPLEMENT_ACTOR (cls, Any, -1, sid) \
|
||
|
PROP_DeathState (dstate) \
|
||
|
PROP_SpawnState (0)
|
||
|
|
||
|
#define _DEBSTARTSTATES(cls,ns) \
|
||
|
END_DEFAULTS FState cls::States[ns] =
|
||
|
|
||
|
#define DEBRIS(cls,spawnnum,ns,dstate) \
|
||
|
_DEBCOMMON(cls,AActor,ns,dstate,spawnnum) \
|
||
|
PROP_Flags (MF_NOBLOCKMAP|MF_DROPOFF|MF_MISSILE) \
|
||
|
PROP_Flags2 (MF2_NOTELEPORT) \
|
||
|
_DEBSTARTSTATES(cls,ns)
|
||
|
|
||
|
#define SHARD(cls,spawnnum,ns,dstate) \
|
||
|
_DEBCOMMON(cls,AGlassShard,ns,dstate,spawnnum) \
|
||
|
PROP_RadiusFixed (5) \
|
||
|
PROP_Flags (MF_NOBLOCKMAP|MF_DROPOFF|MF_MISSILE|MF_NOGRAVITY) \
|
||
|
PROP_Flags2 (MF2_NOTELEPORT|MF2_HEXENBOUNCE) \
|
||
|
_DEBSTARTSTATES(cls,ns)
|
||
|
|
||
|
// Rocks --------------------------------------------------------------------
|
||
|
|
||
|
#define S_ROCK1 0
|
||
|
#define S_ROCK1_D (S_ROCK1+1)
|
||
|
|
||
|
DEBRIS (ARock1, 41, 2, S_ROCK1_D)
|
||
|
{
|
||
|
S_NORMAL (ROKK, 'A', 20, NULL, &States[S_ROCK1]),
|
||
|
S_NORMAL (ROKK, 'A', 10, NULL, NULL)
|
||
|
};
|
||
|
|
||
|
#define S_ROCK2 0
|
||
|
#define S_ROCK2_D (S_ROCK2+1)
|
||
|
|
||
|
DEBRIS (ARock2, 42, 2, S_ROCK2_D)
|
||
|
{
|
||
|
S_NORMAL (ROKK, 'B', 20, NULL, &States[S_ROCK2]),
|
||
|
S_NORMAL (ROKK, 'B', 10, NULL, NULL)
|
||
|
};
|
||
|
|
||
|
#define S_ROCK3 0
|
||
|
#define S_ROCK3_D (S_ROCK3+1)
|
||
|
|
||
|
DEBRIS (ARock3, 43, 2, S_ROCK3_D)
|
||
|
{
|
||
|
S_NORMAL (ROKK, 'C', 20, NULL, &States[S_ROCK3+0]),
|
||
|
S_NORMAL (ROKK, 'C', 10, NULL, NULL)
|
||
|
};
|
||
|
|
||
|
// Dirt ---------------------------------------------------------------------
|
||
|
|
||
|
#define S_DIRT1 0
|
||
|
#define S_DIRT1_D (S_DIRT1+1)
|
||
|
|
||
|
DEBRIS (ADirt1, 44, 2, S_DIRT1_D)
|
||
|
{
|
||
|
S_NORMAL (ROKK, 'D', 20, NULL, &States[S_DIRT1]),
|
||
|
S_NORMAL (ROKK, 'D', 10, NULL, NULL)
|
||
|
};
|
||
|
|
||
|
#define S_DIRT2 0
|
||
|
#define S_DIRT2_D (S_DIRT2+1)
|
||
|
|
||
|
DEBRIS (ADirt2, 45, 2, S_DIRT2_D)
|
||
|
{
|
||
|
S_NORMAL (ROKK, 'E', 20, NULL, &States[S_DIRT2]),
|
||
|
S_NORMAL (ROKK, 'E', 10, NULL, NULL)
|
||
|
};
|
||
|
|
||
|
#define S_DIRT3 0
|
||
|
#define S_DIRT3_D (S_DIRT3+1)
|
||
|
|
||
|
DEBRIS (ADirt3, 46, 2, S_DIRT3_D)
|
||
|
{
|
||
|
S_NORMAL (ROKK, 'F', 20, NULL, &States[S_DIRT3]),
|
||
|
S_NORMAL (ROKK, 'F', 10, NULL, NULL)
|
||
|
};
|
||
|
|
||
|
#define S_DIRT4 0
|
||
|
#define S_DIRT4_D (S_DIRT4+1)
|
||
|
|
||
|
DEBRIS (ADirt4, 47, 2, S_DIRT4_D)
|
||
|
{
|
||
|
S_NORMAL (ROKK, 'G', 20, NULL, &States[S_DIRT4]),
|
||
|
S_NORMAL (ROKK, 'G', 10, NULL, NULL)
|
||
|
};
|
||
|
|
||
|
#define S_DIRT5 0
|
||
|
#define S_DIRT5_D (S_DIRT5+1)
|
||
|
|
||
|
DEBRIS (ADirt5, 48, 2, S_DIRT5_D)
|
||
|
{
|
||
|
S_NORMAL (ROKK, 'H', 20, NULL, &States[S_DIRT5]),
|
||
|
S_NORMAL (ROKK, 'H', 10, NULL, NULL)
|
||
|
};
|
||
|
|
||
|
#define S_DIRT6 0
|
||
|
#define S_DIRT6_D (S_DIRT6+1)
|
||
|
|
||
|
DEBRIS (ADirt6, 49, 2, S_DIRT6_D)
|
||
|
{
|
||
|
S_NORMAL (ROKK, 'I', 20, NULL, &States[S_DIRT6]),
|
||
|
S_NORMAL (ROKK, 'I', 10, NULL, NULL)
|
||
|
};
|
||
|
|
||
|
// Stained glass ------------------------------------------------------------
|
||
|
|
||
|
class AGlassShard : public AActor
|
||
|
{
|
||
|
DECLARE_STATELESS_ACTOR (AGlassShard, AActor)
|
||
|
public:
|
||
|
bool FloorBounceMissile (secplane_t &plane)
|
||
|
{
|
||
|
fixed_t bouncemomz = FixedMul (momz, (fixed_t)(-0.3*FRACUNIT));
|
||
|
|
||
|
if (abs (bouncemomz) < (FRACUNIT/2))
|
||
|
{
|
||
|
Destroy ();
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if (!Super::FloorBounceMissile (plane))
|
||
|
{
|
||
|
momz = bouncemomz;
|
||
|
return false;
|
||
|
}
|
||
|
}
|
||
|
return true;
|
||
|
}
|
||
|
};
|
||
|
|
||
|
IMPLEMENT_ABSTRACT_ACTOR (AGlassShard)
|
||
|
|
||
|
#define S_SGSHARD1 0
|
||
|
#define S_SGSHARD1_D (S_SGSHARD1+5)
|
||
|
|
||
|
SHARD (ASGShard1, 54, 6, S_SGSHARD1_D)
|
||
|
{
|
||
|
S_NORMAL (SGSA, 'A', 4, NULL , &States[S_SGSHARD1+1]),
|
||
|
S_NORMAL (SGSA, 'B', 4, NULL , &States[S_SGSHARD1+2]),
|
||
|
S_NORMAL (SGSA, 'C', 4, NULL , &States[S_SGSHARD1+3]),
|
||
|
S_NORMAL (SGSA, 'D', 4, NULL , &States[S_SGSHARD1+4]),
|
||
|
S_NORMAL (SGSA, 'E', 4, NULL , &States[S_SGSHARD1+0]),
|
||
|
|
||
|
S_NORMAL (SGSA, 'E', 30, NULL , NULL)
|
||
|
};
|
||
|
|
||
|
#define S_SGSHARD2 0
|
||
|
#define S_SGSHARD2_D (S_SGSHARD2+5)
|
||
|
|
||
|
SHARD (ASGShard2, 55, 6, S_SGSHARD2_D)
|
||
|
{
|
||
|
S_NORMAL (SGSA, 'F', 4, NULL , &States[S_SGSHARD2+1]),
|
||
|
S_NORMAL (SGSA, 'G', 4, NULL , &States[S_SGSHARD2+2]),
|
||
|
S_NORMAL (SGSA, 'H', 4, NULL , &States[S_SGSHARD2+3]),
|
||
|
S_NORMAL (SGSA, 'I', 4, NULL , &States[S_SGSHARD2+4]),
|
||
|
S_NORMAL (SGSA, 'J', 4, NULL , &States[S_SGSHARD2+0]),
|
||
|
|
||
|
S_NORMAL (SGSA, 'J', 30, NULL , NULL)
|
||
|
};
|
||
|
|
||
|
#define S_SGSHARD3 0
|
||
|
#define S_SGSHARD3_D (S_SGSHARD3+5)
|
||
|
|
||
|
SHARD (ASGShard3, 56, 6, S_SGSHARD3_D)
|
||
|
{
|
||
|
S_NORMAL (SGSA, 'K', 4, NULL , &States[S_SGSHARD3+1]),
|
||
|
S_NORMAL (SGSA, 'L', 4, NULL , &States[S_SGSHARD3+2]),
|
||
|
S_NORMAL (SGSA, 'M', 4, NULL , &States[S_SGSHARD3+3]),
|
||
|
S_NORMAL (SGSA, 'N', 4, NULL , &States[S_SGSHARD3+4]),
|
||
|
S_NORMAL (SGSA, 'O', 4, NULL , &States[S_SGSHARD3+0]),
|
||
|
|
||
|
S_NORMAL (SGSA, 'O', 30, NULL , NULL)
|
||
|
};
|
||
|
|
||
|
#define S_SGSHARD4 0
|
||
|
#define S_SGSHARD4_D (S_SGSHARD4+5)
|
||
|
|
||
|
SHARD (ASGShard4, 57, 6, S_SGSHARD4_D)
|
||
|
{
|
||
|
S_NORMAL (SGSA, 'P', 4, NULL , &States[S_SGSHARD4+1]),
|
||
|
S_NORMAL (SGSA, 'Q', 4, NULL , &States[S_SGSHARD4+2]),
|
||
|
S_NORMAL (SGSA, 'R', 4, NULL , &States[S_SGSHARD4+3]),
|
||
|
S_NORMAL (SGSA, 'S', 4, NULL , &States[S_SGSHARD4+4]),
|
||
|
S_NORMAL (SGSA, 'T', 4, NULL , &States[S_SGSHARD4+0]),
|
||
|
|
||
|
S_NORMAL (SGSA, 'T', 30, NULL , NULL)
|
||
|
};
|
||
|
|
||
|
#define S_SGSHARD5 0
|
||
|
#define S_SGSHARD5_D (S_SGSHARD5+5)
|
||
|
|
||
|
SHARD (ASGShard5, 58, 6, S_SGSHARD5_D)
|
||
|
{
|
||
|
S_NORMAL (SGSA, 'U', 4, NULL , &States[S_SGSHARD5+1]),
|
||
|
S_NORMAL (SGSA, 'V', 4, NULL , &States[S_SGSHARD5+2]),
|
||
|
S_NORMAL (SGSA, 'W', 4, NULL , &States[S_SGSHARD5+3]),
|
||
|
S_NORMAL (SGSA, 'X', 4, NULL , &States[S_SGSHARD5+4]),
|
||
|
S_NORMAL (SGSA, 'Y', 4, NULL , &States[S_SGSHARD5+0]),
|
||
|
|
||
|
S_NORMAL (SGSA, 'Y', 30, NULL , NULL)
|
||
|
};
|
||
|
|
||
|
#define S_SGSHARD6 0
|
||
|
#define S_SGSHARD6_D (S_SGSHARD6+1)
|
||
|
|
||
|
SHARD (ASGShard6, 59, 2, S_SGSHARD6_D)
|
||
|
{
|
||
|
S_NORMAL (SGSB, 'A', 4, NULL , &States[S_SGSHARD6+0]),
|
||
|
S_NORMAL (SGSB, 'A', 30, NULL , NULL)
|
||
|
};
|
||
|
|
||
|
#define S_SGSHARD7 0
|
||
|
#define S_SGSHARD7_D (S_SGSHARD7+1)
|
||
|
|
||
|
SHARD (ASGShard7, 60, 2, S_SGSHARD7_D)
|
||
|
{
|
||
|
S_NORMAL (SGSB, 'B', 4, NULL , &States[S_SGSHARD7+0]),
|
||
|
S_NORMAL (SGSB, 'B', 30, NULL , NULL)
|
||
|
};
|
||
|
|
||
|
#define S_SGSHARD8 0
|
||
|
#define S_SGSHARD8_D (S_SGSHARD8+1)
|
||
|
|
||
|
SHARD (ASGShard8, 61, 2, S_SGSHARD8_D)
|
||
|
{
|
||
|
S_NORMAL (SGSB, 'C', 4, NULL , &States[S_SGSHARD8+0]),
|
||
|
S_NORMAL (SGSB, 'C', 30, NULL , NULL)
|
||
|
};
|
||
|
|
||
|
#define S_SGSHARD9 0
|
||
|
#define S_SGSHARD9_D (S_SGSHARD9+1)
|
||
|
|
||
|
SHARD (ASGShard9, 62, 2, S_SGSHARD9_D)
|
||
|
{
|
||
|
S_NORMAL (SGSB, 'D', 4, NULL , &States[S_SGSHARD9+0]),
|
||
|
S_NORMAL (SGSB, 'D', 30, NULL , NULL)
|
||
|
};
|
||
|
|
||
|
#define S_SGSHARD0 0
|
||
|
#define S_SGSHARD0_D (S_SGSHARD0+1)
|
||
|
|
||
|
SHARD (ASGShard0, 63, 2, S_SGSHARD0_D)
|
||
|
{
|
||
|
S_NORMAL (SGSB, 'E', 4, NULL , &States[S_SGSHARD0+0]),
|
||
|
S_NORMAL (SGSB, 'E', 30, NULL , NULL)
|
||
|
};
|
||
|
|
||
|
// Dirt stuff
|
||
|
|
||
|
void P_SpawnDirt (AActor *actor, fixed_t radius)
|
||
|
{
|
||
|
fixed_t x,y,z;
|
||
|
const TypeInfo *dtype = NULL;
|
||
|
AActor *mo;
|
||
|
angle_t angle;
|
||
|
|
||
|
angle = pr_dirt()<<5; // <<24 >>19
|
||
|
x = actor->x + FixedMul(radius,finecosine[angle]);
|
||
|
y = actor->y + FixedMul(radius,finesine[angle]);
|
||
|
z = actor->z + (pr_dirt()<<9) + FRACUNIT;
|
||
|
switch (pr_dirt()%6)
|
||
|
{
|
||
|
case 0:
|
||
|
dtype = RUNTIME_CLASS(ADirt1);
|
||
|
break;
|
||
|
case 1:
|
||
|
dtype = RUNTIME_CLASS(ADirt2);
|
||
|
break;
|
||
|
case 2:
|
||
|
dtype = RUNTIME_CLASS(ADirt3);
|
||
|
break;
|
||
|
case 3:
|
||
|
dtype = RUNTIME_CLASS(ADirt4);
|
||
|
break;
|
||
|
case 4:
|
||
|
dtype = RUNTIME_CLASS(ADirt5);
|
||
|
break;
|
||
|
case 5:
|
||
|
dtype = RUNTIME_CLASS(ADirt6);
|
||
|
break;
|
||
|
}
|
||
|
mo = Spawn (dtype, x, y, z);
|
||
|
if (mo)
|
||
|
{
|
||
|
mo->momz = pr_dirt()<<10;
|
||
|
}
|
||
|
}
|