Battle UFO: power-up drops take player momz, pick up immediately

This commit is contained in:
James R 2024-01-05 20:59:18 -08:00
parent e07fbd9a6e
commit 2bdb7d4349
5 changed files with 22 additions and 9 deletions

View file

@ -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->movecount = amount;
} }
drop->flags |= MF_NOCLIPTHING; if (type < FIRSTPOWERUP)
{
// Pick up power-ups immediately
drop->flags |= MF_NOCLIPTHING;
}
if (gametyperules & GTR_CLOSERPLAYERS) if (gametyperules & GTR_CLOSERPLAYERS)
{ {

View file

@ -182,7 +182,7 @@ boolean Obj_IsSuperFlickyTargettingYou(const mobj_t *flicky, mobj_t *player);
void Obj_BattleUFOLegThink(mobj_t *leg); void Obj_BattleUFOLegThink(mobj_t *leg);
void Obj_BattleUFOThink(mobj_t *ufo); void Obj_BattleUFOThink(mobj_t *ufo);
void Obj_SpawnBattleUFOLegs(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_LinkBattleUFOSpawner(mobj_t *spawner);
void Obj_UnlinkBattleUFOSpawner(mobj_t *spawner); void Obj_UnlinkBattleUFOSpawner(mobj_t *spawner);
void Obj_SpawnBattleUFOFromSpawner(void); void Obj_SpawnBattleUFOFromSpawner(void);

View file

@ -137,14 +137,14 @@ void Obj_BattleUFOThink(mobj_t *mobj)
K_BattleOvertimeKiller(mobj); K_BattleOvertimeKiller(mobj);
} }
void Obj_BattleUFODeath(mobj_t *mobj) void Obj_BattleUFODeath(mobj_t *mobj, mobj_t *inflictor)
{ {
UFO* ufo = static_cast<UFO*>(mobj); UFO* ufo = static_cast<UFO*>(mobj);
const SINT8 flip = P_MobjFlip(ufo); const SINT8 flip = P_MobjFlip(ufo);
ufo->momz = -(8*mapobjectscale)/2; ufo->momz = -(8*mapobjectscale)/2;
K_CreatePaperItem( mobj_t* drop = K_CreatePaperItem(
ufo->x, ufo->x,
ufo->y, ufo->y,
ufo->z + (flip), ufo->z + (flip),
@ -154,6 +154,14 @@ void Obj_BattleUFODeath(mobj_t *mobj)
BATTLE_POWERUP_TIME 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()) if (ufo->spawner())
{ {
g_battleufo.previousId = ufo->spawner()->id(); g_battleufo.previousId = ufo->spawner()->id();

View file

@ -396,9 +396,6 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
P_InstaThrust(player->mo, player->mo->angle, 20<<FRACBITS); P_InstaThrust(player->mo, player->mo->angle, 20<<FRACBITS);
return; return;
case MT_FLOATINGITEM: // SRB2Kart case MT_FLOATINGITEM: // SRB2Kart
// Avoid being picked up immediately
if (special->scale < special->destscale/2)
return;
if (special->threshold >= FIRSTPOWERUP) if (special->threshold >= FIRSTPOWERUP)
{ {
if (P_PlayerInPain(player)) if (P_PlayerInPain(player))
@ -408,6 +405,10 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
} }
else else
{ {
// Avoid being picked up immediately
if (special->scale < special->destscale/2)
return;
if (!P_CanPickupItem(player, 3) || (player->itemamount && player->itemtype != special->threshold)) if (!P_CanPickupItem(player, 3) || (player->itemamount && player->itemtype != special->threshold))
return; return;
@ -2347,7 +2348,7 @@ void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, UINT8 damaget
Obj_MonitorOnDeath(target); Obj_MonitorOnDeath(target);
break; break;
case MT_BATTLEUFO: case MT_BATTLEUFO:
Obj_BattleUFODeath(target); Obj_BattleUFODeath(target, inflictor);
break; break;
case MT_BLENDEYE_MAIN: case MT_BLENDEYE_MAIN:
VS_BlendEye_Death(target); VS_BlendEye_Death(target);

View file

@ -7451,7 +7451,7 @@ static boolean P_MobjRegularThink(mobj_t *mobj)
case MT_FLOATINGITEM: case MT_FLOATINGITEM:
{ {
P_ResetPitchRoll(mobj); P_ResetPitchRoll(mobj);
if (mobj->flags & MF_NOCLIPTHING) if (!(mobj->flags & MF_NOGRAVITY))
{ {
if (P_CheckDeathPitCollide(mobj)) if (P_CheckDeathPitCollide(mobj))
{ {