summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCaladius <Caladius@users.noreply.github.com>2024-11-15 22:12:58 -0500
committerMalkierian <malkierian@gmail.com>2025-11-21 10:56:47 -0700
commit99585ff27049ec182e92e92ff759780262de56c0 (patch)
treea47252c0f16f098008f7a585eb30efbf40ac6927
parent2ff9fcc8fa76bfc7e69646d2341e649f7e2f0ca2 (diff)
Holiday Fever (#4551)
* Holiday Fever * Swap to Int32 for safety net
-rw-r--r--soh/soh/Enhancements/Holiday/Caladius.cpp103
-rw-r--r--soh/soh/Enhancements/Holiday/Caladius.h11
-rw-r--r--soh/soh/SohGui/SohGui.cpp6
3 files changed, 120 insertions, 0 deletions
diff --git a/soh/soh/Enhancements/Holiday/Caladius.cpp b/soh/soh/Enhancements/Holiday/Caladius.cpp
new file mode 100644
index 000000000..340c63432
--- /dev/null
+++ b/soh/soh/Enhancements/Holiday/Caladius.cpp
@@ -0,0 +1,103 @@
+#include "Caladius.h"
+#include "Holiday.hpp"
+#include "soh/Notification/Notification.h"
+#include "soh/Enhancements/gameplaystats.h"
+
+extern "C" {
+#include "macros.h"
+#include "functions.h"
+#include "variables.h"
+extern PlayState* gPlayState;
+uint64_t GetUnixTimestamp();
+}
+
+#define AUTHOR "Caladius"
+#define CVAR(v) "gHoliday." AUTHOR "." v
+
+bool isDisabled = false;
+float fontScale = 1.0f;
+
+std::string formatTimestampIceTrapFever(uint32_t value) {
+ uint32_t sec = value / 10;
+ uint32_t hh = sec / 3600;
+ uint32_t mm = (sec - hh * 3600) / 60;
+ uint32_t ss = sec - hh * 3600 - mm * 60;
+ return fmt::format("{}:{:0>2}:{:0>2}", hh, mm, ss);
+}
+
+void OnTimeOver() {
+ gSaveContext.health = 0;
+}
+
+int32_t calculateRemainingTime() {
+ int32_t timeRemaining =
+ ((gSaveContext.sohStats.count[COUNT_ICE_TRAPS] * (CVarGetInteger(CVAR("ExtendTimer"), 0) * 600)) +
+ (CVarGetInteger(CVAR("StartTimer"), 0) * 600) - GAMEPLAYSTAT_TOTAL_TIME);
+ if (timeRemaining <= 0) {
+ OnTimeOver();
+ timeRemaining = 0;
+ }
+ return timeRemaining;
+}
+
+static void OnConfigurationChanged() {
+ isDisabled = !CVarGetInteger(CVAR("Enabled"), 0);
+ fontScale = CVarGetFloat(CVAR("FontScale"), 1.0f);
+ if (fontScale < 1.0f) {
+ fontScale = 1.0f;
+ }
+ if (CVarGetInteger(CVAR("ExtendTimer"), 0) < 1) {
+ CVarSetInteger(CVAR("ExtendTimer"), 1);
+ }
+ if (CVarGetInteger(CVAR("StartTimer"), 0) < 1) {
+ CVarSetInteger(CVAR("StartTimer"), 1);
+ }
+}
+
+void CaladiusWindow::Draw() {
+ if (!CVarGetInteger(CVAR("Enabled"), 0)) {
+ return;
+ }
+
+ ImGui::PushStyleColor(ImGuiCol_WindowBg, ImVec4(0, 0, 0, 0.5f));
+ ImGui::PushStyleColor(ImGuiCol_Border, ImVec4(0, 0, 0, 0));
+ ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 4.0f);
+ ImGui::Begin("TimerDisplay", nullptr, ImGuiWindowFlags_AlwaysAutoResize |
+ ImGuiWindowFlags_NoNav |
+ ImGuiWindowFlags_NoFocusOnAppearing |
+ ImGuiWindowFlags_NoResize |
+ ImGuiWindowFlags_NoDocking |
+ ImGuiWindowFlags_NoTitleBar |
+ ImGuiWindowFlags_NoScrollWithMouse |
+ ImGuiWindowFlags_NoScrollbar);
+ ImGui::SetWindowFontScale(fontScale);
+ ImGui::Text(formatTimestampIceTrapFever(calculateRemainingTime()).c_str());
+ ImGui::End();
+
+ ImGui::PopStyleColor(2);
+ ImGui::PopStyleVar(1);
+}
+
+static void DrawMenu() {
+ ImGui::SeparatorText(AUTHOR);
+ if (UIWidgets::EnhancementCheckbox("Holiday Fever", CVAR("Enabled"))) {
+ OnConfigurationChanged();
+ }
+ UIWidgets::Tooltip("Can you beat your objective before the Fever sets in?\n"
+ "- Obtaining Ice Traps extends your timer.");
+ ImGui::Text("Options");
+ if (UIWidgets::PaddedEnhancementSliderFloat("", "##FontScale", CVAR("FontScale"),
+ 1.0f, 5.0f, "%.1fx", 1.0f, false, false, false, false, isDisabled)) {
+ OnConfigurationChanged();
+ }
+ UIWidgets::PaddedEnhancementSliderInt("Starting Timer: %d minutes", "##StartTime", CVAR("StartTimer"),
+ 5, 30, "", 15, true, true, false, isDisabled);
+ UIWidgets::PaddedEnhancementSliderInt("Time Extensions: %d minutes", "##ExtendTime", CVAR("ExtendTimer"),
+ 1, 10, "", 5, true, true, false, isDisabled);
+}
+
+static void RegisterMod() {
+ OnConfigurationChanged();
+}
+
+static Holiday holiday(DrawMenu, RegisterMod);
diff --git a/soh/soh/Enhancements/Holiday/Caladius.h b/soh/soh/Enhancements/Holiday/Caladius.h
new file mode 100644
index 000000000..4bbd1ad8e
--- /dev/null
+++ b/soh/soh/Enhancements/Holiday/Caladius.h
@@ -0,0 +1,11 @@
+#include <libultraship/libultraship.h>
+
+class CaladiusWindow : public Ship::GuiWindow {
+ public:
+ using GuiWindow::GuiWindow;
+
+ void InitElement() override {};
+ void DrawElement() override {};
+ void Draw() override;
+ void UpdateElement() override {};
+}; \ No newline at end of file
diff --git a/soh/soh/SohGui/SohGui.cpp b/soh/soh/SohGui/SohGui.cpp
index d3646eb42..4c487caa6 100644
--- a/soh/soh/SohGui/SohGui.cpp
+++ b/soh/soh/SohGui/SohGui.cpp
@@ -36,6 +36,7 @@
#include "soh/Network/Archipelago/ArchipelagoConsoleWindow.h"
#include "soh/Enhancements/mod_menu.h"
#include "soh/Network/Anchor/Anchor.h"
+#include "soh/Enhancements/Holiday/Caladius.h"
namespace SohGui {
@@ -103,6 +104,7 @@ std::shared_ptr<SohModalWindow> mModalWindow;
std::shared_ptr<Notification::Window> mNotificationWindow;
std::shared_ptr<TimeDisplayWindow> mTimeDisplayWindow;
std::shared_ptr<AnchorRoomWindow> mAnchorRoomWindow;
+std::shared_ptr<CaladiusWindow> mCaladiusWindow;
UIWidgets::Colors GetMenuThemeColor() {
return mSohMenu->GetMenuThemeColor();
@@ -218,6 +220,9 @@ void SetupGuiElements() {
gui->AddGuiWindow(mTimeDisplayWindow);
mAnchorRoomWindow = std::make_shared<AnchorRoomWindow>(CVAR_WINDOW("AnchorRoom"), "Anchor Room");
gui->AddGuiWindow(mAnchorRoomWindow);
+ mCaladiusWindow = std::make_shared<CaladiusWindow>(CVAR_WINDOW("Holiday Cal"), "Holiday Cal");
+ gui->AddGuiWindow(mCaladiusWindow);
+ mCaladiusWindow->Show();
}
void Destroy() {
@@ -256,6 +261,7 @@ void Destroy() {
mArchipelagoConsoleWindow = nullptr;
mTimeDisplayWindow = nullptr;
mAnchorRoomWindow = nullptr;
+ mCaladiusWindow = nullptr;
}
void RegisterPopup(std::string title, std::string message, std::string button1, std::string button2,