Skip to content

Commit

Permalink
v1.7.0
Browse files Browse the repository at this point in the history
Partial rewrite
  • Loading branch information
vani11agirl committed Jan 25, 2025
1 parent 1e83eed commit 17ec5e7
Show file tree
Hide file tree
Showing 2 changed files with 165 additions and 83 deletions.
38 changes: 31 additions & 7 deletions src/util/hooks.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,39 @@
#define updateProgressBar updateProgressbar // I blame RobTop.

#include <Geode/modify/PlayLayer.hpp>
class $modify(PlayLayer) {
class $modify(canvas, PlayLayer) {
void repaint() {
m_progressFill->setColor(paint());
// beautiful. kill it with fire.
if (auto globedProgressBarWrapper = m_progressBar->getChildByID("dankmeme.globed2/progress-bar-wrapper")) { if (auto globedSelfPlayerProgress = globedProgressBarWrapper->getChildByID("dankmeme.globed2/self-player-progress")) { if (CCLayerColor* target = globedSelfPlayerProgress->getChildByType<CCLayerColor>(0)) { target->setColor(paint()); }}}
}

void resetLevel() {
Catgirl::getInstance()->context = Context::Normal;
Catgirl::getInstance()->updateSettings();
PlayLayer::resetLevel();
}

// TODO: find out a way to disable this hook when not dynamic
void updateProgressBar() {
PlayLayer::updateProgressBar();
colorutil::update(getSpeed());

if (!m_level->isPlatformer() && m_progressFill && m_progressBar->isVisible()) {
m_progressFill->setColor(paint());
// beautiful. kill it with fire.
if (auto globedProgressBarWrapper = m_progressBar->getChildByID("dankmeme.globed2/progress-bar-wrapper")) { if (auto globedSelfPlayerProgress = globedProgressBarWrapper->getChildByID("dankmeme.globed2/self-player-progress")) { if (CCLayerColor* target = globedSelfPlayerProgress->getChildByType<CCLayerColor>(0)) { target->setColor(paint()); }}}
auto levelPercentage = as<float>(PlayLayer::get()->getCurrentPercentInt());
auto levelBest = PlayLayer::get()->m_level->m_normalPercent;

// set context
if (m_isPracticeMode) {
if (levelPercentage > levelBest) {
if (fastGetSetting<"practice-override", bool>()) { Catgirl::getInstance()->context = Context::Practice; } else { Catgirl::getInstance()->context = Context::NewBest; }
} else {
Catgirl::getInstance()->context = Context::Practice;
}
} else {
if (levelPercentage > levelBest) { Catgirl::getInstance()->context = Context::NewBest; }
}

// update rgb speed
colorutil::update(getSpeed());
if (!m_level->isPlatformer() && m_progressFill && m_progressBar->isVisible()) { canvas::repaint(); }

}
};
210 changes: 134 additions & 76 deletions src/util/utils.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -17,20 +17,18 @@ struct TemplateStr {
template<unsigned N> TemplateStr(char const (&)[N]) -> TemplateStr<N - 1>;


template <TemplateStr setting, typename T>
template <TemplateStr settingName, typename T>
/**
* @brief getSettingValue but FAST :money_mouth:
*
* @tparam T The type of the setting value
* @return The cached setting value
*/
T fastGetSetting() {
static T cachedSetting = Mod::get()->getSettingValue<T>(setting);
geode::listenForSettingChanges<T>(setting, [](T v) {
cachedSetting = v;
});

return cachedSetting;
static T cachedSetting = (geode::listenForSettingChanges<T>(settingName, [](T v) {
cachedSetting = v;
}), geode::Mod::get()->getSettingValue<T>(settingName));
return cachedSetting;
}

enum class WorkingMode {
Expand All @@ -44,6 +42,13 @@ enum class WorkingMode {
Unknown // This should never happen either lmao
};

enum class Context {
Normal,
Practice,
NewBest,
Unknown // hate you
};

/**
* @brief string to enum converter real
*
Expand All @@ -52,29 +57,115 @@ enum class WorkingMode {
*/
WorkingMode getWorkingMode(const std::string& mode) {
static const std::unordered_map<std::string, WorkingMode> modeMap = {
{"Player Col 1", WorkingMode::PlayerCol1},
{"Player Col 2", WorkingMode::PlayerCol2},
{"Player Glow", WorkingMode::PlayerGlow},
{"Chroma", WorkingMode::Chroma},
{"Pastel", WorkingMode::Pastel},
{"Custom", WorkingMode::Custom}
{"Player Col 1", WorkingMode::PlayerCol1}, // 0
{"Player Col 2", WorkingMode::PlayerCol2}, // 1
{"Player Glow", WorkingMode::PlayerGlow}, // 2
{"Chroma", WorkingMode::Chroma}, // 3
{"Pastel", WorkingMode::Pastel}, // 4
{"Custom", WorkingMode::Custom} // 5
// {"Gradient", WorkingMode::Gradient} /* Placeholder */
};

auto idkWhatToNameThis = modeMap.find(mode);
return idkWhatToNameThis != modeMap.end() ? idkWhatToNameThis->second : WorkingMode::Unknown;
}

std::string contextKey(const Context context) {
static const std::unordered_map<Context, std::string> contextMap = {
{Context::Normal, "normal"},
{Context::Practice, "practice"},
{Context::NewBest, "enby"}
};

auto ret = contextMap.find(context);
return ret != contextMap.end() ? ret->second : "normal";
}

class Catgirl {
public:
static Catgirl* getInstance() {
if (meow == nullptr) {
meow = new Catgirl();
}
return meow;
}

void updateSettings() {
normalWorkingMode = getWorkingMode(fastGetSetting<"normal-working-mode", std::string>());
practiceWorkingMode = getWorkingMode(fastGetSetting<"practice-working-mode", std::string>());
newBestWorkingMode = getWorkingMode(fastGetSetting<"enby-working-mode", std::string>());
practiceToggle = fastGetSetting<"practice-mode-toggle", bool>();
practiceOverride = fastGetSetting<"practice-override", bool>();
practiceRgbSpeed = fastGetSetting<"practice-rgb-speed", double_t>();
enbyRgbSpeed = fastGetSetting<"enby-rgb-speed", double_t>();
normalRgbSpeed = fastGetSetting<"normal-rgb-speed", double_t>();
if (normalWorkingMode == WorkingMode::Chroma || normalWorkingMode == WorkingMode::Pastel || practiceWorkingMode == WorkingMode::Chroma || practiceWorkingMode == WorkingMode::Pastel || newBestWorkingMode == WorkingMode::Chroma || newBestWorkingMode == WorkingMode::Pastel) {
dynamic = true;
} else {
dynamic = false;
}
}

WorkingMode normalWorkingMode;
WorkingMode practiceWorkingMode;
WorkingMode newBestWorkingMode;
bool practiceToggle;
bool practiceOverride;
double_t practiceRgbSpeed;
double_t enbyRgbSpeed;
double_t normalRgbSpeed;
ccColor3B normalCustomColor;
ccColor3B practiceCustomColor;
ccColor3B enbyCustomColor;
Context context;

bool dynamic;

private:
static Catgirl* meow;

Catgirl() {
updateSettings();
}

Catgirl(const Catgirl&) = delete;
Catgirl& operator=(const Catgirl&) = delete;
};

Catgirl* Catgirl::meow = nullptr;
/**
* @brief Gets the color for a given working mode.
* @brief this also gets... the color, but this depends on the level state as well!
*
* @param mode the working mode
* @param customColorKey (only used when working mode is custom)
* @return c o l o r
*/
ccColor3B getColor(WorkingMode mode, const std::string& customColorKey) {
ccColor3B paint() {
Catgirl* delegate = Catgirl::getInstance();
Context context = delegate->context;
WorkingMode workingMode;
auto gm = GameManager::sharedState();
switch (mode) {

log::debug("Context: {}", static_cast<int>(context));

// Check for the context first
switch (context) {
case Context::Normal:
workingMode = delegate->normalWorkingMode;
break;
case Context::Practice:
workingMode = delegate->practiceWorkingMode;
break;
case Context::NewBest:
workingMode = delegate->newBestWorkingMode;
break;
default:
workingMode = delegate->normalWorkingMode;
break;
}

log::debug("Working Mode: {}", static_cast<int>(workingMode));

// Decide the working mode
switch (workingMode) {
case WorkingMode::PlayerCol1:
return gm->colorForIdx(gm->getPlayerColor());
case WorkingMode::PlayerCol2:
Expand All @@ -86,43 +177,19 @@ ccColor3B getColor(WorkingMode mode, const std::string& customColorKey) {
case WorkingMode::Pastel:
return colorutil::getPastelColour();
case WorkingMode::Custom:
return Mod::get()->getSettingValue<ccColor3B>(customColorKey);
// log::debug("Returning Custom color for context: {}", static_cast<int>(context));
switch (context) {
case Context::Normal:
return delegate->normalCustomColor;
case Context::Practice:
return delegate->practiceCustomColor;
case Context::NewBest:
return delegate->enbyCustomColor;
default:
return {0, 0, 0};
}
default:
return {255, 255, 255}; // Default to white, though this should never happen
}
}

/**
* @brief this also gets... the color, but this depends on the level state as well!
*
* @return c o l o r
*/
ccColor3B paint() {
auto gm = GameManager::sharedState(); // For convenience
auto gjbgl = GJBaseGameLayer::get();
auto pl = PlayLayer::get();

auto normalWorkingMode = getWorkingMode(fastGetSetting<"normal-working-mode", std::string>());
auto practiceWorkingMode = getWorkingMode(fastGetSetting<"practice-working-mode", std::string>());
auto newBestWorkingMode = getWorkingMode(fastGetSetting<"enby-working-mode", std::string>());
auto practiceToggle = fastGetSetting<"practice-mode-toggle", bool>();
auto practiceOverride = fastGetSetting<"practice-override", bool>();

auto levelPercentage = as<float>(PlayLayer::get()->getCurrentPercentInt()); // Level progress
auto levelBest = pl->m_level->m_normalPercent; // Level best

if (levelPercentage > levelBest) {
if (gjbgl->m_isPracticeMode && practiceOverride) {
return getColor(practiceWorkingMode, "practice-custom-color");
} else {
return getColor(newBestWorkingMode, "enby-custom-color");
}
} else {
if (gjbgl->m_isPracticeMode && practiceToggle) {
return getColor(practiceWorkingMode, "practice-custom-color");
} else {
return getColor(normalWorkingMode, "normal-custom-color");
}
return {0, 0, 0}; // Default
}
}

Expand All @@ -131,26 +198,17 @@ ccColor3B paint() {
* @return float
*/
float getSpeed() {
auto gjbgl = GJBaseGameLayer::get();
auto pl = PlayLayer::get();

auto practiceToggle = fastGetSetting<"practice-mode-toggle", bool>();
auto practiceOverride = fastGetSetting<"practice-override", bool>();

auto levelPercentage = as<float>(PlayLayer::get()->getCurrentPercentInt());
auto levelBest = pl->m_level->m_normalPercent;

if (levelPercentage > levelBest) {
if (gjbgl->m_isPracticeMode && practiceOverride) {
return fastGetSetting<"practice-rgb-speed", double_t>();
} else {
return fastGetSetting<"enby-rgb-speed", double_t>();
}
} else {
if (gjbgl->m_isPracticeMode && practiceToggle) {
return fastGetSetting<"practice-rgb-speed", double_t>();
} else {
return fastGetSetting<"normal-rgb-speed", double_t>();
}
}
Catgirl* delegate = Catgirl::getInstance();
Context context = delegate->context;

switch (context) {
case Context::Normal:
return delegate->normalRgbSpeed;
case Context::Practice:
return delegate->practiceRgbSpeed;
case Context::NewBest:
return delegate->enbyRgbSpeed;
default:
return delegate->normalRgbSpeed;
};
}

0 comments on commit 17ec5e7

Please sign in to comment.