Implement Flipover damage sectors and Terrain

This commit is contained in:
NepDisk 2025-08-30 01:16:37 -04:00
parent 2871260bc3
commit 258b4ec6e0
5 changed files with 26 additions and 8 deletions

View file

@ -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;
}

View file

@ -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);
}

View file

@ -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"))
{

View file

@ -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;
}

View file

@ -441,6 +441,7 @@ typedef enum
SD_LAVA = 2,
SD_DEATHPIT = 3,
SD_INSTAKILL = 4,
SD_FLIPOVER = 5,
} sectordamage_t;
typedef enum