// Function: A_MineExplode
// Description: Handles the explosion of a DSZ mine.
//
// var1 = unused
// var2 = unused
//
void A_MineExplode(void *data)
{
mobj_t *actor = data;
// INT32 locvar1 = var1;
// INT32 locvar2 = var2;
if (LUA_CallAction(A_MINEEXPLODE, actor))
return;
A_Scream(actor);
actor->flags = MF_NOGRAVITY|MF_NOCLIP;
quake.epicenter = NULL;
quake.radius = FixedMul(512*FRACUNIT, actor->scale);
quake.intensity = 8*FRACUNIT;
quake.time = TICRATE/3;
P_RadiusAttack(actor, actor->tracer, 192*FRACUNIT, DMG_CANHURTSELF, true);
P_MobjCheckWater(actor);
{
#define dist 64
UINT8 i;
mobjtype_t type = ((actor->eflags & MFE_UNDERWATER) ? MT_UWEXPLODE : MT_SONIC3KBOSSEXPLODE);
S_StartSoundFromMobj(actor, ((actor->eflags & MFE_UNDERWATER) ? sfx_s3k57 : sfx_s3k4e));
mobj_t *b = P_SpawnMobjFromMobj(actor, 0, 0, 0, type);
for (i = 0; i < 16; i++)
{
b = P_SpawnMobjFromMobj(actor, P_RandomRange(-dist, dist)*FRACUNIT,
P_RandomRange(-dist, dist)*FRACUNIT,
P_RandomRange(((actor->eflags & MFE_UNDERWATER) ? -dist : 0), dist)*FRACUNIT,
type);
if (P_MobjWasRemoved(b))
continue;
P_SetScale(b, actor->scale, true);
fixed_t dx = b->x - actor->x, dy = b->y - actor->y, dz = b->z - actor->z;
fixed_t dm = FixedDiv(GetDistance3D(0, 0, 0, dx, dy, dz), actor->scale);
b->momx = FixedDiv(dx, dm)*3;
b->momy = FixedDiv(dy, dm)*3;
b->momz = FixedDiv(dz, dm)*3;
if ((actor->watertop == INT32_MAX) || (b->z + b->height > actor->watertop))
b->flags &= ~MF_NOGRAVITY;
}
#undef dist
if (actor->watertop != INT32_MAX)
P_SpawnScaledMobj(actor->x, actor->y, actor->watertop, actor->scale, (actor->eflags & MFE_TOUCHLAVA) ? MT_LAVASPLISH : MT_SPLISH);
}
}