From 2bdb7d434907df87c767e4d771a566a77df9bcac Mon Sep 17 00:00:00 2001 From: James R Date: Fri, 5 Jan 2024 20:59:18 -0800 Subject: [PATCH] Battle UFO: power-up drops take player momz, pick up immediately --- src/k_kart.c | 6 +++++- src/k_objects.h | 2 +- src/objects/battle-ufo.cpp | 12 ++++++++++-- src/p_inter.c | 9 +++++---- src/p_mobj.c | 2 +- 5 files changed, 22 insertions(+), 9 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 536fd929d..c481cb13a 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -7044,7 +7044,11 @@ mobj_t *K_CreatePaperItem(fixed_t x, fixed_t y, fixed_t z, angle_t angle, SINT8 drop->movecount = amount; } - drop->flags |= MF_NOCLIPTHING; + if (type < FIRSTPOWERUP) + { + // Pick up power-ups immediately + drop->flags |= MF_NOCLIPTHING; + } if (gametyperules & GTR_CLOSERPLAYERS) { diff --git a/src/k_objects.h b/src/k_objects.h index 3c68594c9..152f3ef6a 100644 --- a/src/k_objects.h +++ b/src/k_objects.h @@ -182,7 +182,7 @@ boolean Obj_IsSuperFlickyTargettingYou(const mobj_t *flicky, mobj_t *player); void Obj_BattleUFOLegThink(mobj_t *leg); void Obj_BattleUFOThink(mobj_t *ufo); void Obj_SpawnBattleUFOLegs(mobj_t *ufo); -void Obj_BattleUFODeath(mobj_t *ufo); +void Obj_BattleUFODeath(mobj_t *ufo, mobj_t *inflictor); void Obj_LinkBattleUFOSpawner(mobj_t *spawner); void Obj_UnlinkBattleUFOSpawner(mobj_t *spawner); void Obj_SpawnBattleUFOFromSpawner(void); diff --git a/src/objects/battle-ufo.cpp b/src/objects/battle-ufo.cpp index bbefa9672..cca89385a 100644 --- a/src/objects/battle-ufo.cpp +++ b/src/objects/battle-ufo.cpp @@ -137,14 +137,14 @@ void Obj_BattleUFOThink(mobj_t *mobj) K_BattleOvertimeKiller(mobj); } -void Obj_BattleUFODeath(mobj_t *mobj) +void Obj_BattleUFODeath(mobj_t *mobj, mobj_t *inflictor) { UFO* ufo = static_cast(mobj); const SINT8 flip = P_MobjFlip(ufo); ufo->momz = -(8*mapobjectscale)/2; - K_CreatePaperItem( + mobj_t* drop = K_CreatePaperItem( ufo->x, ufo->y, ufo->z + (flip), @@ -154,6 +154,14 @@ void Obj_BattleUFODeath(mobj_t *mobj) BATTLE_POWERUP_TIME ); + if (!P_MobjWasRemoved(inflictor) && inflictor->type == MT_INSTAWHIP) + { + // Take momentum of player who whips + inflictor = inflictor->target; + } + + drop->momz = !P_MobjWasRemoved(inflictor) ? inflictor->momz : 0; + if (ufo->spawner()) { g_battleufo.previousId = ufo->spawner()->id(); diff --git a/src/p_inter.c b/src/p_inter.c index e7597cc7a..ae931e8f9 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -396,9 +396,6 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck) P_InstaThrust(player->mo, player->mo->angle, 20<scale < special->destscale/2) - return; if (special->threshold >= FIRSTPOWERUP) { if (P_PlayerInPain(player)) @@ -408,6 +405,10 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck) } else { + // Avoid being picked up immediately + if (special->scale < special->destscale/2) + return; + if (!P_CanPickupItem(player, 3) || (player->itemamount && player->itemtype != special->threshold)) return; @@ -2347,7 +2348,7 @@ void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, UINT8 damaget Obj_MonitorOnDeath(target); break; case MT_BATTLEUFO: - Obj_BattleUFODeath(target); + Obj_BattleUFODeath(target, inflictor); break; case MT_BLENDEYE_MAIN: VS_BlendEye_Death(target); diff --git a/src/p_mobj.c b/src/p_mobj.c index 718a5520d..41f7ca8fc 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -7451,7 +7451,7 @@ static boolean P_MobjRegularThink(mobj_t *mobj) case MT_FLOATINGITEM: { P_ResetPitchRoll(mobj); - if (mobj->flags & MF_NOCLIPTHING) + if (!(mobj->flags & MF_NOGRAVITY)) { if (P_CheckDeathPitCollide(mobj)) {