Skip to content

Commit

Permalink
ChaosMod/DebugMenu: Grey out filtered effects and display filter reas…
Browse files Browse the repository at this point in the history
…on (#3705)

Co-authored-by: Reguas <[email protected]>
Co-authored-by: pongo1231 <[email protected]>
  • Loading branch information
3 people authored Feb 6, 2025
1 parent da50455 commit 4e5750f
Show file tree
Hide file tree
Showing 5 changed files with 59 additions and 11 deletions.
16 changes: 13 additions & 3 deletions ChaosMod/Components/DebugMenu.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
#include "Components/EffectDispatcher.h"
#include "Effects/EnabledEffects.h"
#include "Util/OptionsManager.h"
#include "Util/HelpText.h"

#define MAX_VIS_ITEMS 15

Expand Down Expand Up @@ -104,13 +105,19 @@ void DebugMenu::OnRun()

if (i == m_SelectedIdx)
{
DRAW_RECT(.1f, y, .2f, .05f, 255, 255, 255, 200, true);
if (IsEffectFilteredOut(m_Effects[i].Id))
DRAW_RECT(.1f, y, .2f, .05f, 180, 180, 180, 200, true);
else
DRAW_RECT(.1f, y, .2f, .05f, 255, 255, 255, 200, true);

SET_TEXT_COLOUR(0, 0, 0, 255);
}
else
{
DRAW_RECT(.1f, y, .2f, .05f, 0, 0, 0, 200, true);
if (IsEffectFilteredOut(m_Effects[i].Id))
DRAW_RECT(.1f, y, .2f, .05f, 90, 90, 90, 200, true);
else
DRAW_RECT(.1f, y, .2f, .05f, 0, 0, 0, 200, true);

SET_TEXT_COLOUR(255, 255, 255, 255);
}
Expand All @@ -120,6 +127,9 @@ void DebugMenu::OnRun()
y += .05f;
remainingDrawItems--;
}

if (IsEffectFilteredOut(m_Effects[m_SelectedIdx].Id))
DisplayHelpText("Effect disabled: " + GetFilterReason(m_Effects[m_SelectedIdx].Id));
}

bool DebugMenu::IsEnabled() const
Expand Down Expand Up @@ -208,7 +218,7 @@ void DebugMenu::OnKeyInput(DWORD key, bool repeated, bool isUpNow, bool isCtrlPr
break;
}
case VK_RETURN:
if (!m_Effects[m_SelectedIdx].Id.Id().empty())
if (!m_Effects[m_SelectedIdx].Id.Id().empty() && !IsEffectFilteredOut(m_Effects[m_SelectedIdx].Id))
m_DispatchEffect = true;

break;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,4 @@ static bool OnCondition()
return ComponentExists<Voting>() && GetComponent<Voting>()->IsEnabled() && GetComponent<Voting>()->GetVotingMode() == VotingMode::Percentage;
}

REGISTER_EFFECT_CONDITION(EffectConditionType::ProportionalVotingEnabled, OnCondition);
REGISTER_EFFECT_CONDITION(EffectConditionType::ProportionalVotingEnabled, OnCondition, "Proportional voting is not enabled");
2 changes: 1 addition & 1 deletion ChaosMod/Effects/Condition/ConditionVotingEnabled.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,4 @@ static bool OnCondition()
return ComponentExists<Voting>() && GetComponent<Voting>()->IsEnabled();
}

REGISTER_EFFECT_CONDITION(EffectConditionType::VotingEnabled, OnCondition);
REGISTER_EFFECT_CONDITION(EffectConditionType::VotingEnabled, OnCondition, "Voting is not enabled");
21 changes: 15 additions & 6 deletions ChaosMod/Effects/Condition/EffectCondition.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,20 @@
#include "Util/Logging.h"
#include "Util/MacroConcat.h"

#include <unordered_map>
#include <functional>

enum class EffectConditionType
{
None,
VotingEnabled, // Voting is enabled
ProportionalVotingEnabled
};

#define REGISTER_EFFECT_CONDITION(conditionType, condition) \
namespace \
{ \
EffectCondition CHAOSCONCAT(_effectCondition, __LINE__)(conditionType, condition); \
#define REGISTER_EFFECT_CONDITION(conditionType, condition, failReason) \
namespace \
{ \
EffectCondition CHAOSCONCAT(_effectCondition, __LINE__)(conditionType, condition, failReason); \
}

class EffectCondition;
Expand All @@ -24,10 +27,11 @@ class EffectCondition
{
const EffectConditionType ConditionType = EffectConditionType::None;
const std::function<bool()> Condition;
const std::string FailReason;

public:
EffectCondition(EffectConditionType conditionType, std::function<bool()> condition)
: ConditionType(conditionType), Condition(condition)
EffectCondition(EffectConditionType conditionType, std::function<bool()> condition, std::string failReason)
: ConditionType(conditionType), Condition(condition), FailReason(failReason)
{
if (conditionType == EffectConditionType::None)
{
Expand All @@ -50,6 +54,11 @@ class EffectCondition
g_EffectConditions[ConditionType] = this;
}

inline std::string GetFailReason()
{
return FailReason;
}

~EffectCondition()
{
g_EffectConditions.erase(ConditionType);
Expand Down
29 changes: 29 additions & 0 deletions ChaosMod/Effects/EnabledEffects.h
Original file line number Diff line number Diff line change
Expand Up @@ -38,4 +38,33 @@ inline std::vector<EffectData *> GetFilteredEnabledEffects()
filteredEffects.push_back(&effectData);

return filteredEffects;
}

inline bool IsEffectFilteredOut(EffectIdentifier id)
{
std::set<EffectConditionType> ensuredConditions;
for (auto &[conditionType, condition] : g_EffectConditions)
if (condition->CheckCondition())
ensuredConditions.insert(conditionType);

if (!g_EnabledEffects.contains(id))
return false;

const auto &effectData = g_EnabledEffects.at(id);

return effectData.ConditionType != EffectConditionType::None
&& !ensuredConditions.contains(effectData.ConditionType);
}

inline std::string GetFilterReason(EffectIdentifier id)
{
if (!g_EnabledEffects.contains(id))
return "";

const auto &effectData = g_EnabledEffects.at(id);

if (effectData.ConditionType == EffectConditionType::None)
return "";

return g_EffectConditions.at(effectData.ConditionType)->GetFailReason();
}

0 comments on commit 4e5750f

Please sign in to comment.