Visual proximity mine radius

This commit is contained in:
Antonio Martinez 2025-06-05 19:05:35 -04:00
parent 53cb1cb45d
commit cff8d740b1
5 changed files with 123 additions and 4 deletions

View file

@ -1561,6 +1561,8 @@ const char *const STATE_LIST[] = { // array length left dynamic for sanity testi
"S_MAGICIANBOXTOP",
"S_MAGICIANBOXBOTTOM",
"S_MINERADIUS",
"S_WAVEDASH",
"S_INSTAWHIP",
@ -3549,6 +3551,7 @@ const char *const MOBJTYPE_LIST[] = { // array length left dynamic for sanity t
"MT_MONITOR_PART",
"MT_MONITOR_SHARD",
"MT_MAGICIANBOX",
"MT_MINERADIUS",
"MT_WAVEDASH",
"MT_INSTAWHIP",

View file

@ -317,6 +317,10 @@ char sprnames[NUMSPRITES + 1][5] =
"MGBX", // Heavy Magician transform box
"MGBT", // Heavy Magician transform box top
"MGBB", // Heavy Magician transform box bottom
"SSMA", // Mine radius
"SSMB",
"SSMC",
"SSMD",
"MSHD", // Item Monitor Big Shard
"IMDB", // Item Monitor Small Shard (Debris)
"MTWK", // Item Monitor Glass Twinkle
@ -2138,6 +2142,8 @@ state_t states[NUMSTATES] =
{SPR_MGBT, FF_FLOORSPRITE|0, -1, {NULL}, 0, 0, S_NULL}, // S_MAGICIANBOX_TOP
{SPR_MGBB, FF_FLOORSPRITE|0, -1, {NULL}, 0, 0, S_NULL}, // S_MAGICIANBOX_BOTTOM
{SPR_SSMA, FF_PAPERSPRITE|FF_ANIMATE|FF_ADD, -1, {NULL}, 59, 1, S_NULL}, // S_MINERADIUS
{SPR_SLPT, FF_PAPERSPRITE|0, -1, {NULL}, 0, 0, S_NULL}, // S_WAVEDASH
{SPR_IWHP, FF_FLOORSPRITE|FF_ANIMATE|0, -1, {NULL}, 6, 2, S_NULL}, // S_INSTAWHIP
@ -13541,6 +13547,33 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
S_NULL // raisestate
},
{ // MT_MINERADIUS
-1, // doomednum
S_MINERADIUS, // spawnstate
1000, // spawnhealth
S_NULL, // seestate
sfx_None, // seesound
0, // reactiontime
sfx_None, // attacksound
S_NULL, // painstate
0, // painchance
sfx_None, // painsound
S_NULL, // meleestate
S_NULL, // missilestate
S_NULL, // deathstate
S_NULL, // xdeathstate
sfx_None, // deathsound
0, // speed
0*FRACUNIT, // radius
0*FRACUNIT, // height
1, // display offset
100, // mass
0, // damage
sfx_None, // activesound
MF_NOGRAVITY|MF_NOCLIP|MF_NOCLIPTHING|MF_NOCLIPHEIGHT|MF_DONTENCOREMAP, // flags
S_NULL // raisestate
},
{ // MT_WAVEDASH
-1, // doomednum
S_WAVEDASH, // spawnstate

View file

@ -858,6 +858,10 @@ typedef enum sprite
SPR_MGBX, // Heavy Magician transform box
SPR_MGBT, // Heavy Magician transform box top
SPR_MGBB, // Heavy Magician transform box bottom
SPR_SSMA, // Mine radius
SPR_SSMB,
SPR_SSMC,
SPR_SSMD,
SPR_MSHD, // Item Monitor Big Shard
SPR_IMDB, // Item Monitor Small Shard (Debris)
SPR_MTWK, // Item Monitor Glass Twinkle
@ -2607,6 +2611,8 @@ typedef enum state
S_MAGICIANBOX_TOP,
S_MAGICIANBOX_BOTTOM,
S_MINERADIUS,
S_WAVEDASH,
S_INSTAWHIP,
@ -4622,6 +4628,7 @@ typedef enum mobj_type
MT_MONITOR_PART,
MT_MONITOR_SHARD,
MT_MAGICIANBOX,
MT_MINERADIUS,
MT_WAVEDASH,
MT_INSTAWHIP,

View file

@ -269,11 +269,17 @@ static inline BlockItReturn_t PIT_SSMineSearch(mobj_t *thing)
return BMIT_CONTINUE;
}
if (thing == grenade->target) // Don't blow up at your owner instantly.
return BMIT_CONTINUE;
extern consvar_t cv_debugpickmeup;
if (!cv_debugpickmeup.value)
{
if (thing == grenade->target) // Don't blow up at your owner instantly.
return BMIT_CONTINUE;
if (grenade->target->player && thing->player && G_SameTeam(grenade->target->player, thing->player))
return BMIT_CONTINUE;
}
if (grenade->target->player && thing->player && G_SameTeam(grenade->target->player, thing->player))
return BMIT_CONTINUE;
if (PIT_SSMineChecks(thing) == true)
return BMIT_CONTINUE;

View file

@ -7469,6 +7469,38 @@ static boolean P_MobjRegularThink(mobj_t *mobj)
mobj->momx = mobj->momy = 0;
S_StartSound(mobj, mobj->info->activesound);
P_SetMobjState(mobj, S_SSMINE_DEPLOY1);
spritenum_t parts[4] = {SPR_SSMA, SPR_SSMB, SPR_SSMC, SPR_SSMD};
#define RADIUSCOPIES 6
UINT8 lowlight = 191;
UINT8 highlight = 255;
UINT8 lightpercopy = (highlight - lowlight) / RADIUSCOPIES;
angle_t increment = ANG1*10;
for (UINT8 i = 0; i < 4; i++)
{
for (UINT8 j = 0; j < RADIUSCOPIES; j++)
{
mobj_t *radius = P_SpawnMobjFromMobj(mobj, 0, 0, 0, MT_MINERADIUS);
radius->angle -= j*increment;
P_SetTarget(&radius->target, mobj);
P_InstaScale(radius, mobj->scale/4);
radius->destscale = mobj->scale * 6; // Matches SSMINE_DEPLOY8 radius, will scale down when thinking after
radius->scalespeed = mobj->scale;
radius->sprite = parts[i];
radius->renderflags |= RF_ABSOLUTELIGHTLEVEL;
radius->lightlevel = highlight - (lightpercopy * j);
radius->renderflags |= (cv_reducevfx.value) ? RF_TRANS90 : RF_TRANS50;
}
}
#undef RADIUSCOPIES
}
}
@ -8397,6 +8429,44 @@ static boolean P_MobjRegularThink(mobj_t *mobj)
}
break;
}
case MT_MINERADIUS:
{
if (!mobj->target || P_MobjWasRemoved(mobj->target))
{
P_RemoveMobj(mobj);
return false;
}
statenum_t stateindex = mobj->target->state - states;
mobj->x = mobj->target->x;
mobj->y = mobj->target->y;
mobj->z = mobj->target->z + mobj->target->height/4;
K_MatchGenericExtraFlags(mobj, mobj->target);
mobj->color = mobj->target->color;
mobj->colorized = true;
mobj->angle += ANG1*5;
if (stateindex == S_SSMINE_DEPLOY8)
{
mobj->renderflags &= ~(RF_TRANSMASK);
if (cv_reducevfx.value)
mobj->renderflags |= RF_TRANS80;
}
if (stateindex == S_SSMINE_DEPLOY9) // Horseshit, see SSMineSearch
{
mobj->destscale = mobj->target->scale*4;
}
// mobj_t *ghost = P_SpawnGhostMobj(mobj);
// ghost->fuse = 12;
break;
}
case MT_SIDETRICK:
{
fixed_t destx, desty;