From 4c7ec4bae0643dbf533238ab98fa57c4d0404190 Mon Sep 17 00:00:00 2001 From: JugadorXEI Date: Wed, 22 May 2024 21:00:22 +0200 Subject: [PATCH] Fix shield objects not being properly flipped --- src/k_kart.c | 3 +++ src/p_mobj.c | 13 ++++++++++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/k_kart.c b/src/k_kart.c index b02f264c3..6cbaf9ae2 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -13285,6 +13285,9 @@ void K_MoveKartPlayer(player_t *player, boolean onground) if (player->curshield != KSHIELD_BUBBLE) { mobj_t *shield = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_BUBBLESHIELD); + // MT_BUBBLESHIELD doesn't have MF_NOBLOCKMAP so we need to remove this manually. + // Otherwise if you roll a bubble shield while flipped, the visuals look too mismatched. + shield->eflags &= ~MFE_VERTICALFLIP; P_SetScale(shield, (shield->destscale = (5*shield->destscale)>>2)); P_SetTarget(&shield->target, player->mo); S_StartSound(player->mo, sfx_s3k3f); diff --git a/src/p_mobj.c b/src/p_mobj.c index 9c8a53db7..8b1862fab 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -8355,6 +8355,9 @@ static boolean P_MobjRegularThink(mobj_t *mobj) P_SetScale(mobj, (mobj->destscale = (5*mobj->target->scale)>>2)); P_MoveOrigin(mobj, mobj->target->x, mobj->target->y, mobj->target->z + mobj->target->height/2); + // Taken from K_FlipFromObject. We just want to flip the visual according to its target, but that's it. + mobj->eflags = (mobj->eflags & ~MFE_VERTICALFLIP)|(mobj->target->eflags & MFE_VERTICALFLIP); + break; } case MT_BUBBLESHIELD: @@ -8460,9 +8463,15 @@ static boolean P_MobjRegularThink(mobj_t *mobj) mobj->extravalue2 = mobj->target->player->bubbleblowup; P_SetScale(mobj, (mobj->destscale = scale)); + + // For some weird reason, the Bubble Shield is the exception flip-wise, it has the offset baked into the sprite. + // So instead of simply flipping the object, we have to do a position offset. + fixed_t positionOffset = 0; + if (P_IsObjectFlipped(mobj->target)) + positionOffset -= 8 * mobj->scale; mobj->flags &= ~(MF_NOCLIPTHING); - P_MoveOrigin(mobj, mobj->target->x, mobj->target->y, mobj->target->z); + P_MoveOrigin(mobj, mobj->target->x, mobj->target->y, mobj->target->z + positionOffset); mobj->flags |= MF_NOCLIPTHING; break; } @@ -8550,6 +8559,8 @@ static boolean P_MobjRegularThink(mobj_t *mobj) } } + // Taken from K_FlipFromObject. We just want to flip the visual according to its target, but that's it. + mobj->eflags = (mobj->eflags & ~MFE_VERTICALFLIP)|(mobj->target->eflags & MFE_VERTICALFLIP); P_MoveOrigin(mobj, mobj->target->x, mobj->target->y, mobj->target->z + mobj->target->height/2); mobj->angle = K_MomentumAngle(mobj->target);