diff --git a/src/p_inter.c b/src/p_inter.c index 884091c2d..57a13e0ef 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -275,7 +275,8 @@ static void P_ItemPop(mobj_t *actor) actor->extravalue1 = 0; // de-solidify - actor->flags |= MF_NOCLIPTHING; + // (Nope! Handled in fusethink for item pickup leniency) + // actor->flags |= MF_NOCLIPTHING; // RF_DONTDRAW will flicker as the object's fuse gets // closer to running out (see P_FuseThink) @@ -447,12 +448,29 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck) statenum_t specialstate = special->state - states; - if (specialstate >= S_RANDOMITEM1 && specialstate <= S_RANDOMITEM12) + if (special->fuse) // This box is respawning, but was broken very recently (see P_FuseThink) + { + // What was this box broken as? + if (special->cvmem) + K_StartItemRoulette(player, false); + else + K_StartItemRoulette(player, true); + } + else if (specialstate >= S_RANDOMITEM1 && specialstate <= S_RANDOMITEM12) + { K_StartItemRoulette(player, false); + special->cvmem = 1; // Lenient pickup should be ITEM + } else + { K_StartItemRoulette(player, true); + special->cvmem = 0; // Lenient pickup should be RING + } + P_ItemPop(special); - special->fuse = TICRATE; + + if (!special->fuse) + special->fuse = TICRATE; return; } case MT_SPHEREBOX: diff --git a/src/p_mobj.c b/src/p_mobj.c index e6effb1fc..841f7aa29 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -9969,6 +9969,12 @@ static boolean P_FuseThink(mobj_t *mobj) mobj->fuse--; + // Simultaneous item pickup leniency + if (mobj->type == MT_RANDOMITEM && mobj->fuse <= TICRATE-5) + { + mobj->flags |= MF_NOCLIPTHING; + } + if (mobj->fuse) return true;