diff --git a/src/d_player.h b/src/d_player.h index c0ffb3519..7084542cb 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -417,7 +417,9 @@ struct roundconditions_t UINT8 hittrackhazard[((MAX_LAPS+1)/8) + 1]; + // Attack-based conditions targetdamaging_t targetdamaging; + UINT8 gachabom_miser; mobjeflag_t wet_player; diff --git a/src/deh_soc.c b/src/deh_soc.c index 822747a40..e520a73c0 100644 --- a/src/deh_soc.c +++ b/src/deh_soc.c @@ -3034,6 +3034,11 @@ static void readcondition(UINT16 set, UINT32 id, char *word2) return; } } + else if (fastcmp(params[0], "GACHABOMMISER")) + { + //PARAMCHECK(1); + ty = UCRP_GACHABOMMISER; + } else { deh_warning("Invalid condition name %s for condition ID %d", params[0], id+1); diff --git a/src/k_kart.c b/src/k_kart.c index be368aa19..370224ccf 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -11722,6 +11722,10 @@ void K_MoveKartPlayer(player_t *player, boolean onground) K_ThrowKartItem(player, true, MT_GACHABOM, 0, 0, 0); K_PlayAttackTaunt(player->mo); player->itemamount--; + player->roundconditions.gachabom_miser = ( + (player->roundconditions.gachabom_miser == 0) + ? 1 : 0xFF + ); K_UpdateHnextList(player, false); } break; diff --git a/src/m_cond.c b/src/m_cond.c index b11241373..bd41ec9db 100644 --- a/src/m_cond.c +++ b/src/m_cond.c @@ -1695,6 +1695,12 @@ boolean M_CheckCondition(condition_t *cn, player_t *player) case UCRP_TARGETATTACKMETHOD: return (player->roundconditions.targetdamaging == (targetdamaging_t)cn->requirement); + case UCRP_GACHABOMMISER: + return ( + player->roundconditions.targetdamaging == UFOD_GACHABOM + && player->roundconditions.gachabom_miser != 0xFF + ); + case UCRP_WETPLAYER: return (((player->roundconditions.wet_player & cn->requirement) == 0) && !player->roundconditions.fell_off); // Levels with water tend to texture their pits as water too @@ -2435,6 +2441,9 @@ static const char *M_GetConditionString(condition_t *cn) return va("using only %s", work); } + case UCRP_GACHABOMMISER: + return "using exactly one Gachabom repeatedly"; + case UCRP_WETPLAYER: return va("without %s %s", (cn->requirement & MFE_TOUCHWATER) ? "touching any" : "going into", diff --git a/src/m_cond.h b/src/m_cond.h index 008b996dc..8eaf93430 100644 --- a/src/m_cond.h +++ b/src/m_cond.h @@ -126,6 +126,7 @@ typedef enum UCRP_TRACKHAZARD, // (Don't) get hit by a track hazard (maybe specific lap) UCRP_TARGETATTACKMETHOD, // Break targets/UFO using only one method + UCRP_GACHABOMMISER, // Break targets/UFO using exactly one Gachabom repeatedly UCRP_WETPLAYER, // Don't touch [strictness] [fluid] } conditiontype_t; diff --git a/src/objects/gachabom-rebound.cpp b/src/objects/gachabom-rebound.cpp index 07aec4868..7da4a3f81 100644 --- a/src/objects/gachabom-rebound.cpp +++ b/src/objects/gachabom-rebound.cpp @@ -73,6 +73,8 @@ bool award_target(mobj_t* mobj) { player->itemtype = KITEM_GACHABOM; player->itemamount++; + if (player->roundconditions.gachabom_miser == 1) + player->roundconditions.gachabom_miser = 0; return true; } diff --git a/src/p_inter.c b/src/p_inter.c index fbd81a9fd..04c87f4a1 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -987,6 +987,10 @@ void P_TrackRoundConditionTargetDamage(targetdamaging_t targetdamaging) if (players[g_localplayers[i]].spectator) continue; players[i].roundconditions.targetdamaging |= targetdamaging; + /* -- the following isn't needed because we can just check for targetdamaging == UFOD_GACHABOM + if (targetdamaging != UFOD_GACHABOM) + players[i].roundconditions.gachabom_miser = 0xFF; + */ } }