From cff8d740b141956a2320d06876cc0e47c514b527 Mon Sep 17 00:00:00 2001 From: Antonio Martinez Date: Thu, 5 Jun 2025 19:05:35 -0400 Subject: [PATCH] Visual proximity mine radius --- src/deh_tables.c | 3 ++ src/info.c | 33 ++++++++++++++++++++++ src/info.h | 7 +++++ src/k_collide.cpp | 14 +++++++--- src/p_mobj.c | 70 +++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 123 insertions(+), 4 deletions(-) diff --git a/src/deh_tables.c b/src/deh_tables.c index e115287c8..63a8929ff 100644 --- a/src/deh_tables.c +++ b/src/deh_tables.c @@ -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", diff --git a/src/info.c b/src/info.c index d017dda40..f15ec9b9f 100644 --- a/src/info.c +++ b/src/info.c @@ -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 diff --git a/src/info.h b/src/info.h index 2be47f164..6a6b1f60f 100644 --- a/src/info.h +++ b/src/info.h @@ -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, diff --git a/src/k_collide.cpp b/src/k_collide.cpp index 3436ae936..775f0f1f4 100644 --- a/src/k_collide.cpp +++ b/src/k_collide.cpp @@ -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; diff --git a/src/p_mobj.c b/src/p_mobj.c index da9a8634f..4b1194dd7 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -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;