From 258b4ec6e0a56a8945d468ef2faa22c4535c09aa Mon Sep 17 00:00:00 2001 From: NepDisk Date: Sat, 30 Aug 2025 01:16:37 -0400 Subject: [PATCH] Implement Flipover damage sectors and Terrain --- src/k_kart.c | 20 ++++++++++++-------- src/k_terrain.c | 7 +++++++ src/p_setup.c | 2 ++ src/p_spec.c | 4 ++++ src/r_defs.h | 1 + 5 files changed, 26 insertions(+), 8 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 64aa29424..c136c01bf 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -4526,25 +4526,29 @@ void K_SpinPlayer(player_t *player, mobj_t *inflictor, mobj_t *source, INT32 typ void K_FlipPlayer(player_t *player, mobj_t *inflictor, mobj_t *source) { - (void)inflictor; - (void)source; - K_DirectorFollowAttack(player, inflictor, source); K_StatPlayerHit(player, source ? source->player : NULL); player->flipovertimer = 1; - if (inflictor) { fixed_t flipoveradd = R_PointToDist2(0, 0, player->rmomx, player->rmomy); - if (inflictor->player) + S_StartSound(player->mo, sfx_flipos); + + player->flipoverangle = K_MomentumAngle(player->mo)-ANG15; + + if (!inflictor) { - S_StartSound(inflictor, sfx_flipos); + // This is probably a damage sector so lets not make this feel like ass. + // Also don't softlock. + P_InstaThrust(player->mo, player->flipoverangle, FixedMul(FLIPOVERSPEED+flipoveradd+(5*FRACUNIT), player->mo->scale)); + } + else + { + P_InstaThrust(player->mo, player->flipoverangle, FixedMul(FLIPOVERSPEED+(flipoveradd/8), player->mo->scale)); } - player->flipoverangle = R_PointToAngle2(0,0,player->rmomx, player->rmomy)-ANG15; - P_InstaThrust(player->mo, player->flipoverangle, FixedMul(FLIPOVERSPEED+(flipoveradd/8), player->mo->scale)); player->mo->momz = FixedMul(FlipOverZMomentum(gravity), player->mo->scale); player->pflags |= PF_JUSTFLIPPED; } diff --git a/src/k_terrain.c b/src/k_terrain.c index 1816b1f03..90387eb46 100644 --- a/src/k_terrain.c +++ b/src/k_terrain.c @@ -601,6 +601,13 @@ void K_ProcessTerrainEffect(mobj_t *mo) if (terrain->damageType > 0) { UINT8 dmg = (terrain->damageType & 0xFF); + + if (dmg & DMG_FLIPOVER) + { + K_FlipPlayer(player, NULL, NULL); + dmg &= ~DMG_FLIPOVER; + } + P_DamageMobj(mo, NULL, NULL, 1, dmg); } diff --git a/src/p_setup.c b/src/p_setup.c index e93fc6abc..6a7743863 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -1922,6 +1922,8 @@ static void ParseTextmapSectorParameter(UINT32 i, const char *param, const char sectors[i].damagetype = SD_DEATHPIT; if (fastcmp(val, "Instakill")) sectors[i].damagetype = SD_INSTAKILL; + if ((mapnamespace == MNS_RINGRACERS && fastcmp(val, "Stumble")) || fastcmp(val, "FlipOver")) + sectors[i].damagetype = SD_FLIPOVER; } else if (fastcmp(param, "offroad")) { diff --git a/src/p_spec.c b/src/p_spec.c index cb4d1b8ce..1610cd711 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -5456,6 +5456,10 @@ static void P_EvaluateDamageType(player_t *player, sector_t *sector, boolean isT case SD_INSTAKILL: P_DamageMobj(player->mo, NULL, NULL, 1, DMG_INSTAKILL); break; + case SD_FLIPOVER: + if (isTouching) + K_FlipPlayer(player, NULL, NULL); + break; default: break; } diff --git a/src/r_defs.h b/src/r_defs.h index f65ef62cf..269c7b406 100644 --- a/src/r_defs.h +++ b/src/r_defs.h @@ -441,6 +441,7 @@ typedef enum SD_LAVA = 2, SD_DEATHPIT = 3, SD_INSTAKILL = 4, + SD_FLIPOVER = 5, } sectordamage_t; typedef enum