diff --git a/src/k_kart.c b/src/k_kart.c index b02f264c3d6013c5898f2b48251c18719a00dee1..6cbaf9ae2fb4ebdb5e129967950b256d0554d5c8 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 9c8a53db77b555c5fc00827b409fddb98ee9374c..8b1862fabfbed1fdf7d121e99cf1032d6985b040 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);