Merge branch 'fix-reducevfx' into 'master'

Fix `reducevfx` mkaing some VFX visible, when they shouldn't be

See merge request KartKrew/Kart!1622
This commit is contained in:
Oni 2023-11-18 07:11:25 +00:00
commit 94a593487b
16 changed files with 99 additions and 35 deletions

View file

@ -6658,6 +6658,7 @@ struct int_const_s const INT_CONST[] = {
{"RF_SHADOWEFFECTS",RF_SHADOWEFFECTS},
{"RF_DROPSHADOW",RF_DROPSHADOW},
{"RF_ABSOLUTELIGHTLEVEL",RF_ABSOLUTELIGHTLEVEL},
{"RF_REDUCEVFX",RF_REDUCEVFX},
{"RF_DONTDRAW",RF_DONTDRAW},
{"RF_DONTDRAWP1",RF_DONTDRAWP1},
{"RF_DONTDRAWP2",RF_DONTDRAWP2},

View file

@ -126,7 +126,7 @@ static void K_SpawnSingleHitLagSpark(
spark->colorized = true;
}
K_ReduceVFX(spark, NULL);
K_ReduceVFXForEveryone(spark);
}
}

View file

@ -320,7 +320,7 @@ UINT32 K_GetPlayerDontDrawFlag(player_t *player)
return flag;
}
void K_ReduceVFX(mobj_t *mo, player_t *owner)
void K_ReduceVFXForEveryone(mobj_t *mo)
{
if (cv_reducevfx.value == 0)
{
@ -329,11 +329,6 @@ void K_ReduceVFX(mobj_t *mo, player_t *owner)
}
mo->renderflags |= RF_DONTDRAW;
if (owner != NULL)
{
mo->renderflags &= ~K_GetPlayerDontDrawFlag(owner);
}
}
// Angle reflection used by springs & speed pads
@ -1741,7 +1736,8 @@ spawn_brake_dust
P_SetScale(spark, (spark->destscale =
FixedMul(scale, spark->scale)));
K_ReduceVFX(spark, master->player);
P_SetTarget(&spark->owner, master);
spark->renderflags |= RF_REDUCEVFX;
}
static void K_SpawnBrakeVisuals(player_t *player)
@ -1818,7 +1814,8 @@ void K_SpawnDriftBoostClip(player_t *player)
P_RandomFlip(P_RandomRange(PR_DECORATION, FRACUNIT/2, FRACUNIT)),
FixedMul(scale, player->speed));
K_ReduceVFX(clip, player);
P_SetTarget(&clip->owner, player->mo);
clip->renderflags |= RF_REDUCEVFX;
}
void K_SpawnDriftBoostClipSpark(mobj_t *clip)
@ -1875,7 +1872,8 @@ static void K_SpawnGenericSpeedLines(player_t *player, boolean top)
}
K_MatchGenericExtraFlags(fast, player->mo);
K_ReduceVFX(fast, player);
P_SetTarget(&fast->owner, player->mo);
fast->renderflags |= RF_REDUCEVFX;
if (top)
{
@ -1954,7 +1952,8 @@ void K_SpawnInvincibilitySpeedLines(mobj_t *mo)
fast->momz = 3*P_GetMobjZMovement(mo)/4;
K_MatchGenericExtraFlags(fast, mo);
K_ReduceVFX(fast, mo->player);
P_SetTarget(&fast->owner, mo);
fast->renderflags |= RF_REDUCEVFX;
fast->color = mo->color;
fast->colorized = true;
@ -3068,7 +3067,8 @@ void K_SpawnWaterRunParticles(mobj_t *mobj)
water->momz = mobj->momz;
P_SetScale(water, trailScale);
P_SetMobjState(water, curUnderlayFrame);
K_ReduceVFX(water, mobj->player);
P_SetTarget(&water->owner, mobj);
water->renderflags |= RF_REDUCEVFX;
// overlay
water = P_SpawnMobj(x1, y1,
@ -3080,7 +3080,8 @@ void K_SpawnWaterRunParticles(mobj_t *mobj)
water->momz = mobj->momz;
P_SetScale(water, trailScale);
P_SetMobjState(water, curOverlayFrame);
K_ReduceVFX(water, mobj->player);
P_SetTarget(&water->owner, mobj);
water->renderflags |= RF_REDUCEVFX;
// Right
// Underlay
@ -3093,7 +3094,8 @@ void K_SpawnWaterRunParticles(mobj_t *mobj)
water->momz = mobj->momz;
P_SetScale(water, trailScale);
P_SetMobjState(water, curUnderlayFrame);
K_ReduceVFX(water, mobj->player);
P_SetTarget(&water->owner, mobj);
water->renderflags |= RF_REDUCEVFX;
// Overlay
water = P_SpawnMobj(x2, y2,
@ -3105,7 +3107,8 @@ void K_SpawnWaterRunParticles(mobj_t *mobj)
water->momz = mobj->momz;
P_SetScale(water, trailScale);
P_SetMobjState(water, curOverlayFrame);
K_ReduceVFX(water, mobj->player);
P_SetTarget(&water->owner, mobj);
water->renderflags |= RF_REDUCEVFX;
if (!S_SoundPlaying(mobj, sfx_s3kdbs))
{
@ -5222,7 +5225,8 @@ static void K_SpawnDriftElectricity(player_t *player)
spark->momz = mo->momz;
spark->color = color;
K_GenericExtraFlagsNoZAdjust(spark, mo);
K_ReduceVFX(spark, player);
P_SetTarget(&spark->owner, mo);
spark->renderflags |= RF_REDUCEVFX;
spark->spritexscale += scalefactor/3;
spark->spriteyscale += scalefactor/8;
@ -5293,7 +5297,8 @@ void K_SpawnDriftElectricSparks(player_t *player, int color, boolean shockwave)
sparkangle += ANGLE_90;
K_ReduceVFX(spark, player);
P_SetTarget(&spark->owner, mo);
spark->renderflags |= RF_REDUCEVFX;
}
}
}
@ -5444,7 +5449,8 @@ static void K_SpawnDriftSparks(player_t *player)
spark->tics += trail;
K_MatchGenericExtraFlags(spark, player->mo);
K_ReduceVFX(spark, player);
P_SetTarget(&spark->owner, player->mo);
spark->renderflags |= RF_REDUCEVFX;
}
if (player->driftcharge >= dsthree)
@ -10641,7 +10647,8 @@ void K_KartEbrakeVisuals(player_t *p)
wave = P_SpawnMobj(p->mo->x, p->mo->y, p->mo->floorz, MT_SOFTLANDING);
P_InstaScale(wave, p->mo->scale);
P_SetTarget(&wave->target, p->mo);
K_ReduceVFX(wave, p);
P_SetTarget(&wave->owner, p->mo);
wave->renderflags |= RF_REDUCEVFX;
}
// sound
@ -10674,7 +10681,8 @@ void K_KartEbrakeVisuals(player_t *p)
p->mo->hprev->angle = p->mo->angle;
p->mo->hprev->fuse = TICRATE/2; // When we leave spindash for any reason, make sure this bubble goes away soon after.
K_FlipFromObject(p->mo->hprev, p->mo);
K_ReduceVFX(p->mo->hprev, p);
P_SetTarget(&p->mo->hprev->owner, p->mo);
p->mo->hprev->renderflags |= RF_REDUCEVFX;
p->mo->hprev->sprzoff = p->mo->sprzoff;
p->mo->hprev->colorized = false;
@ -10692,7 +10700,8 @@ void K_KartEbrakeVisuals(player_t *p)
spdl->colorized = true;
spdl->color = SKINCOLOR_WHITE;
K_MatchGenericExtraFlags(spdl, p->mo);
K_ReduceVFX(spdl, p);
P_SetTarget(&spdl->owner, p->mo);
spdl->renderflags |= RF_REDUCEVFX;
P_SetScale(spdl, p->mo->scale);
// squish the player a little bit.
@ -10811,8 +10820,6 @@ static void K_KartSpindashDust(mobj_t *parent)
dust->momx = FixedMul(hmomentum, FINECOSINE(ang >> ANGLETOFINESHIFT));
dust->momy = FixedMul(hmomentum, FINESINE(ang >> ANGLETOFINESHIFT));
dust->momz = vmomentum * flip;
//K_ReduceVFX(dust, parent->player);
}
}
@ -10840,7 +10847,8 @@ static void K_KartSpindashWind(mobj_t *parent)
wind->momz = 3 * P_GetMobjZMovement(parent) / 4;
K_MatchGenericExtraFlags(wind, parent);
K_ReduceVFX(wind, parent->player);
P_SetTarget(&wind->owner, parent);
wind->renderflags |= RF_REDUCEVFX;
}
// Time after which you get a thrust for releasing spindash
@ -13083,7 +13091,8 @@ void K_SetTireGrease(player_t *player, tic_t tics)
P_SetTarget(&grease->target, player->mo);
grease->angle = K_MomentumAngle(player->mo);
grease->extravalue1 = i;
K_ReduceVFX(grease, player);
P_SetTarget(&grease->owner, player->mo);
grease->renderflags |= RF_REDUCEVFX;
}
}

View file

@ -67,7 +67,7 @@ void K_TimerReset(void);
void K_TimerInit(void);
UINT32 K_GetPlayerDontDrawFlag(player_t *player);
void K_ReduceVFX(mobj_t *mo, player_t *owner);
void K_ReduceVFXForEveryone(mobj_t *mo);
boolean K_IsPlayerLosing(player_t *player);
fixed_t K_GetKartGameSpeedScalar(SINT8 value);

View file

@ -628,7 +628,8 @@ void K_ProcessTerrainEffect(mobj_t *mo)
spark->fuse = 9;
spark->cusval = K_StairJankFlip(ANGLE_90);
P_SetTarget(&spark->target, mo);
K_ReduceVFX(spark, player);
P_SetTarget(&spark->owner, mo);
spark->renderflags |= RF_REDUCEVFX;
}
player->stairjank = 17;

View file

@ -109,6 +109,7 @@ enum mobj_e {
mobj_stringargs,
mobj_reappear,
mobj_punt_ref,
mobj_owner,
};
static const char *const mobj_opt[] = {
@ -198,6 +199,7 @@ static const char *const mobj_opt[] = {
"stringargs",
"reappear",
"punt_ref",
"owner",
NULL};
#define UNIMPLEMENTED luaL_error(L, LUA_QL("mobj_t") " field " LUA_QS " is not implemented for Lua and cannot be accessed.", mobj_opt[field])
@ -508,6 +510,14 @@ static int mobj_get(lua_State *L)
}
LUA_PushUserdata(L, mo->punt_ref, META_MOBJ);
break;
case mobj_owner:
if (mo->owner && P_MobjWasRemoved(mo->owner))
{ // don't put invalid mobj back into Lua.
P_SetTarget(&mo->owner, NULL);
return 0;
}
LUA_PushUserdata(L, mo->owner, META_MOBJ);
break;
default: // extra custom variables in Lua memory
lua_getfield(L, LUA_REGISTRYINDEX, LREG_EXTVARS);
I_Assert(lua_istable(L, -1));
@ -910,6 +920,15 @@ static int mobj_set(lua_State *L)
P_SetTarget(&mo->punt_ref, punt_ref);
}
break;
case mobj_owner:
if (lua_isnil(L, 3))
P_SetTarget(&mo->owner, NULL);
else
{
mobj_t *owner = *((mobj_t **)luaL_checkudata(L, 3, META_MOBJ));
P_SetTarget(&mo->owner, owner);
}
break;
default:
lua_getfield(L, LUA_REGISTRYINDEX, LREG_EXTVARS);
I_Assert(lua_istable(L, -1));

View file

@ -51,7 +51,7 @@ Obj_SpawnBrolyKi
x->tics = (duration + BUFFER_TICS);
K_ReduceVFX(x, NULL);
K_ReduceVFXForEveryone(x);
S_StartSound(x, sfx_cdfm74);

View file

@ -112,7 +112,8 @@ static void SpawnEmeraldSpeedLines(mobj_t *mo)
fast->momz = 3*P_GetMobjZMovement(mo)/4;
K_MatchGenericExtraFlags(fast, mo);
K_ReduceVFX(fast, mo->player);
P_SetTarget(&fast->owner, mo);
fast->renderflags |= RF_REDUCEVFX;
fast->color = mo->color;
fast->colorized = true;

View file

@ -3828,7 +3828,8 @@ void A_AttractChase(mobj_t *actor)
P_SetTarget(&sparkle->target, actor->target);
sparkle->angle = (actor->target->angle + (offset>>1)) + (offset * actor->target->player->sparkleanim);
actor->target->player->sparkleanim = (actor->target->player->sparkleanim+1) % 20;
K_ReduceVFX(sparkle, actor->target->player);
P_SetTarget(&sparkle->owner, actor->target);
sparkle->renderflags |= RF_REDUCEVFX;
P_KillMobj(actor, actor->target, actor->target, DMG_NORMAL);
return;

View file

@ -3148,7 +3148,8 @@ boolean P_TryMove(mobj_t *thing, fixed_t x, fixed_t y, boolean allowdropoff, Try
spark->fuse = 9;
spark->cusval = K_StairJankFlip(ANGLE_90);
P_SetTarget(&spark->target, thing);
K_ReduceVFX(spark, thing->player);
P_SetTarget(&spark->owner, thing);
spark->renderflags |= RF_REDUCEVFX;
}
thing->player->stairjank = 17;

View file

@ -8036,7 +8036,8 @@ static boolean P_MobjRegularThink(mobj_t *mobj)
}
}
K_ReduceVFX(mobj, mobj->target->player);
P_SetTarget(&mobj->owner, mobj->target);
mobj->renderflags |= RF_REDUCEVFX;
break;
}
case MT_BOOSTFLAME:
@ -8125,7 +8126,8 @@ static boolean P_MobjRegularThink(mobj_t *mobj)
S_StartSound(mobj, sfx_cdfm17);
K_MatchGenericExtraFlags(mobj, mobj->target);
K_ReduceVFX(mobj, mobj->target->player);
P_SetTarget(&mobj->owner, mobj->target);
mobj->renderflags |= RF_REDUCEVFX;
if (leveltime & 1)
mobj->renderflags |= RF_DONTDRAW;
}
@ -8330,7 +8332,8 @@ static boolean P_MobjRegularThink(mobj_t *mobj)
mobj->renderflags = (mobj->renderflags & ~RF_TRANSMASK)|(trans << RF_TRANSSHIFT);
}
K_ReduceVFX(mobj, mobj->target->player);
P_SetTarget(&mobj->owner, mobj->target);
mobj->renderflags |= RF_REDUCEVFX;
break;
case MT_MAGICIANBOX:
{
@ -10447,6 +10450,8 @@ void P_MobjThinker(mobj_t *mobj)
P_SetTarget(&mobj->itnext, NULL);
if (mobj->punt_ref && P_MobjWasRemoved(mobj->punt_ref))
P_SetTarget(&mobj->punt_ref, NULL);
if (mobj->owner && P_MobjWasRemoved(mobj->owner))
P_SetTarget(&mobj->owner, NULL);
if (mobj->flags & MF_NOTHINK)
return;
@ -12002,6 +12007,7 @@ void P_RemoveMobj(mobj_t *mobj)
P_SetTarget(&mobj->itnext, NULL);
P_SetTarget(&mobj->punt_ref, NULL);
P_SetTarget(&mobj->owner, NULL);
P_RemoveThingTID(mobj);
P_DeleteMobjStringArgs(mobj);

View file

@ -445,6 +445,8 @@ struct mobj_t
// If punt_ref, set punt_ref->reappear, treat as if this->reappear
mobj_t *punt_ref;
mobj_t *owner;
// WARNING: New fields must be added separately to savegame and Lua.
};

View file

@ -2708,6 +2708,7 @@ typedef enum
MD3_LIGHTLEVEL = 1,
MD3_REAPPEAR = 1<<1,
MD3_PUNT_REF = 1<<2,
MD3_OWNER = 1<<3,
} mobj_diff3_t;
typedef enum
@ -3032,6 +3033,8 @@ static void SaveMobjThinker(savebuffer_t *save, const thinker_t *th, const UINT8
diff3 |= MD3_REAPPEAR;
if (mobj->punt_ref)
diff3 |= MD3_PUNT_REF;
if (mobj->owner)
diff3 |= MD3_OWNER;
if (diff3 != 0)
diff2 |= MD2_MORE;
@ -3320,6 +3323,10 @@ static void SaveMobjThinker(savebuffer_t *save, const thinker_t *th, const UINT8
{
WRITEUINT32(save->p, mobj->punt_ref->mobjnum);
}
if (diff3 & MD3_OWNER)
{
WRITEUINT32(save->p, mobj->owner->mobjnum);
}
WRITEUINT32(save->p, mobj->mobjnum);
}
@ -4574,6 +4581,10 @@ static thinker_t* LoadMobjThinker(savebuffer_t *save, actionf_p1 thinker)
{
mobj->punt_ref = (mobj_t *)(size_t)READUINT32(save->p);
}
if (diff3 & MD3_OWNER)
{
mobj->owner = (mobj_t *)(size_t)READUINT32(save->p);
}
// set sprev, snext, bprev, bnext, subsector
P_SetThingPosition(mobj);
@ -5621,6 +5632,13 @@ static void P_RelinkPointers(void)
if (!P_SetTarget(&mobj->punt_ref, P_FindNewPosition(temp)))
CONS_Debug(DBG_GAMELOGIC, "punt_ref not found on %d\n", mobj->type);
}
if (mobj->owner)
{
temp = (UINT32)(size_t)mobj->owner;
mobj->owner = NULL;
if (!P_SetTarget(&mobj->owner, P_FindNewPosition(temp)))
CONS_Debug(DBG_GAMELOGIC, "owner not found on %d\n", mobj->type);
}
}
for (i = 0; i < MAXPLAYERS; i++)

View file

@ -1168,7 +1168,8 @@ mobj_t *P_SpawnGhostMobj(mobj_t *mobj)
ghost->old_roll = mobj->old_roll2;
ghost->old_scale = mobj->old_scale2;
K_ReduceVFX(ghost, mobj->player);
P_SetTarget(&ghost->owner, mobj);
ghost->renderflags |= RF_REDUCEVFX;
ghost->reappear = mobj->reappear;
P_SetTarget(&ghost->punt_ref, mobj->punt_ref);

View file

@ -973,6 +973,7 @@ typedef enum
RF_DROPSHADOW = (RF_SHADOWDRAW | RF_SHADOWEFFECTS | RF_FULLDARK),
RF_ABSOLUTELIGHTLEVEL = 0x00010000, // mobj_t.lightlevel is absolute instead of relative
RF_REDUCEVFX = 0x00020000, // only mobj_t.owner can see this object
RF_DONTDRAW = 0x00F00000, // --Don't generate a vissprite
RF_DONTDRAWP1 = 0x00100000, // No P1

View file

@ -3775,6 +3775,9 @@ boolean R_ThingVisible (mobj_t *thing)
|| (viewssnum == 3 && (thing->renderflags & RF_DONTDRAWP4)))
return false;
if ((thing->renderflags & RF_REDUCEVFX) && cv_reducevfx.value && thing->owner != players[displayplayers[viewssnum]].mo)
return false;
return true;
}