gzdoom/src/g_shared/a_debris.cpp

299 lines
7.5 KiB
C++
Raw Normal View History

#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;
}
}