From a3caba4f2044fe06d022d18cb8c1c58e973d4eb2 Mon Sep 17 00:00:00 2001 From: James R Date: Tue, 27 Sep 2022 23:44:22 -0700 Subject: [PATCH 1/2] Add P_IsKartFieldItem, an item that is not attached to a player --- src/p_mobj.c | 53 ++++++++++++++++++++++++++++++++++++++++------------ src/p_mobj.h | 1 + 2 files changed, 42 insertions(+), 12 deletions(-) diff --git a/src/p_mobj.c b/src/p_mobj.c index 9b08f0e75..396a31acf 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -4992,20 +4992,49 @@ cont: } // Kartitem stuff. + +// This item is never attached to a player -- it can DIE +// unconditionally in death sectors. +boolean P_IsKartFieldItem(INT32 type) +{ + switch (type) + { + case MT_BANANA: + case MT_EGGMANITEM: + case MT_ORBINAUT: + case MT_JAWZ: + case MT_SSMINE: + case MT_LANDMINE: + case MT_BALLHOG: + case MT_BUBBLESHIELDTRAP: + case MT_POGOSPRING: + case MT_SINK: + case MT_DROPTARGET: + return true; + + default: + return false; + } +} + boolean P_IsKartItem(INT32 type) { - if (type == MT_EGGMANITEM || type == MT_EGGMANITEM_SHIELD || - type == MT_BANANA || type == MT_BANANA_SHIELD || - type == MT_DROPTARGET || type == MT_DROPTARGET_SHIELD || - type == MT_ORBINAUT || type == MT_ORBINAUT_SHIELD || - type == MT_JAWZ || type == MT_JAWZ_SHIELD || - type == MT_SSMINE || type == MT_SSMINE_SHIELD || - type == MT_SINK || type == MT_SINK_SHIELD || - type == MT_SPB || type == MT_BALLHOG || type == MT_BUBBLESHIELDTRAP || - type == MT_LANDMINE) - return true; - else - return false; + switch (type) + { + case MT_EGGMANITEM_SHIELD: + case MT_BANANA_SHIELD: + case MT_DROPTARGET_SHIELD: + case MT_ORBINAUT_SHIELD: + case MT_JAWZ_SHIELD: + case MT_SSMINE_SHIELD: + case MT_SINK_SHIELD: + case MT_SPB: + case MT_HYUDORO: + return true; + + default: + return P_IsKartFieldItem(type); + } } // Called when a kart item "thinks" diff --git a/src/p_mobj.h b/src/p_mobj.h index 4cdacea6d..b31eeb6b9 100644 --- a/src/p_mobj.h +++ b/src/p_mobj.h @@ -499,6 +499,7 @@ void P_RunCachedActions(void); void P_AddCachedAction(mobj_t *mobj, INT32 statenum); // kartitem stuff: Returns true if the specified 'type' is one of the kart item constants we want in the kitemcap list +boolean P_IsKartFieldItem(INT32 type); boolean P_IsKartItem(INT32 type); void P_AddKartItem(mobj_t *thing); // needs to be called in k_kart.c void P_RunKartItems(void); From cf026462299f528ad753bcc47bb8ee20b032a7fa Mon Sep 17 00:00:00 2001 From: James R Date: Tue, 27 Sep 2022 23:52:51 -0700 Subject: [PATCH 2/2] Add K_CanDeleteKartItem HAKAI --- src/p_mobj.c | 37 +++++++++++++++++++++---------------- src/p_mobj.h | 1 + 2 files changed, 22 insertions(+), 16 deletions(-) diff --git a/src/p_mobj.c b/src/p_mobj.c index 396a31acf..2cf01bd66 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -2179,17 +2179,6 @@ boolean P_ZMovement(mobj_t *mo) case MT_BIGTUMBLEWEED: case MT_LITTLETUMBLEWEED: case MT_SHELL: - // SRB2kart stuff that should die in pits - // Shouldn't stop moving along the Z if there's no speed though! - case MT_EGGMANITEM: - case MT_BANANA: - case MT_ORBINAUT: - case MT_JAWZ: - case MT_BALLHOG: - case MT_SSMINE: - case MT_LANDMINE: - case MT_DROPTARGET: - case MT_BUBBLESHIELDTRAP: // Remove stuff from death pits. if (P_CheckDeathPitCollide(mo)) { @@ -2271,6 +2260,17 @@ boolean P_ZMovement(mobj_t *mo) } break; default: + // SRB2kart stuff that should die in pits + // Shouldn't stop moving along the Z if there's no speed though! + if (P_CanDeleteKartItem(mo->type)) + { + // Remove stuff from death pits. + if (P_CheckDeathPitCollide(mo)) + { + P_RemoveMobj(mo); + return false; + } + } break; } @@ -5037,6 +5037,15 @@ boolean P_IsKartItem(INT32 type) } } +// This item can die in death sectors. There may be some +// special conditions for items that don't switch types... +// TODO: just make a general function for things that should +// die like this? +boolean P_CanDeleteKartItem(INT32 type) +{ + return P_IsKartFieldItem(type); +} + // Called when a kart item "thinks" void P_AddKartItem(mobj_t *thing) { @@ -9329,11 +9338,7 @@ void P_MobjThinker(mobj_t *mobj) return; // Destroy items sector special - if (mobj->type == MT_BANANA || mobj->type == MT_EGGMANITEM - || mobj->type == MT_ORBINAUT || mobj->type == MT_BALLHOG - || mobj->type == MT_JAWZ - || mobj->type == MT_SSMINE || mobj->type == MT_BUBBLESHIELDTRAP - || mobj->type == MT_LANDMINE) + if (P_CanDeleteKartItems(mobj->type)) { if (mobj->health > 0 && P_MobjTouchingSectorSpecial(mobj, 4, 7, true)) { diff --git a/src/p_mobj.h b/src/p_mobj.h index b31eeb6b9..3b3c7832f 100644 --- a/src/p_mobj.h +++ b/src/p_mobj.h @@ -501,6 +501,7 @@ void P_AddCachedAction(mobj_t *mobj, INT32 statenum); // kartitem stuff: Returns true if the specified 'type' is one of the kart item constants we want in the kitemcap list boolean P_IsKartFieldItem(INT32 type); boolean P_IsKartItem(INT32 type); +boolean P_CanDeleteKartItem(INT32 type); void P_AddKartItem(mobj_t *thing); // needs to be called in k_kart.c void P_RunKartItems(void);