From f345aa458891f01c2ce2184a39ea48b00778ac76 Mon Sep 17 00:00:00 2001 From: Hbg1010 Date: Sun, 24 Nov 2024 19:41:58 -0500 Subject: [PATCH 01/53] added button on pause layer --- src/main.cpp | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/src/main.cpp b/src/main.cpp index 01b4ef2..578b02e 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -81,6 +81,40 @@ class $modify(PlayLayer) { }; +#include +class $modify(TimerPauseLayer, PauseLayer) { + void customSetup() override { + PauseLayer::customSetup(); + + auto spr = CircleButtonSprite::createWithSpriteFrameName("particle_197_001.png"); + spr->setScale(.65f); + CCMenuItemSpriteExtra* TimersettingsBtn = CCMenuItemSpriteExtra::create(spr, this, menu_selector(TimerPauseLayer::onTimerSettings)); + + auto settingsMenu = this->getChildByID("right-button-menu"); + CCMenuItemSpriteExtra* settingsBtn; + + for (auto* node : CCArrayExt(settingsMenu->getChildren())) { + if (node->getID() == "options-button") { + settingsBtn = static_cast(node); + break; + } + } + + if (settingsBtn == nullptr) { + log::error("Options button could not be found!"); + } + + TimersettingsBtn->setPosition(settingsBtn->getPositionX(), settingsBtn->getPositionY() - settingsBtn->getContentWidth() * 1.5f); + // TimersettingsBtn->setContentSize(settingsBtn->getScaledContentSize()); + settingsMenu->addChild(TimersettingsBtn); + TimersettingsBtn->setID("timer-settings-btn"_spr); + } + + void onTimerSettings(CCObject* sender) { + log::debug("Settings menu was pressed"); + } +}; + From 28f0296ac4d980f7fe291b6a0daf06004939a765 Mon Sep 17 00:00:00 2001 From: Hbg1010 Date: Sun, 24 Nov 2024 21:09:49 -0500 Subject: [PATCH 02/53] Created timer controls layer --- src/timer/Layers/TimerSettingsLayer.cpp | 35 +++++++++++++++++++++++++ src/timer/Layers/TimerSettingsLayer.hpp | 16 +++++++++++ 2 files changed, 51 insertions(+) create mode 100644 src/timer/Layers/TimerSettingsLayer.cpp create mode 100644 src/timer/Layers/TimerSettingsLayer.hpp diff --git a/src/timer/Layers/TimerSettingsLayer.cpp b/src/timer/Layers/TimerSettingsLayer.cpp new file mode 100644 index 0000000..0bd9c06 --- /dev/null +++ b/src/timer/Layers/TimerSettingsLayer.cpp @@ -0,0 +1,35 @@ +#include "TimerSettingsLayer.hpp" + +TimerSettingsLayer* TimerSettingsLayer::create(std::string const& menuID) { + auto temp = new TimerSettingsLayer(); + + // trys to make node + if (temp->initAnchored(300, 150, menuID, "GJ_square02.png")) { + temp->autorelease(); + return temp; + + } else { + CC_SAFE_DELETE(temp); + + return nullptr; + } +} + +bool TimerSettingsLayer::setup(std::string const& menuID) { + CCSize screenSize = CCDirector::sharedDirector()->getWinSize(); + log::debug("{}", menuID); + + this->setTitle("Timer Settings!"); + + CCMenu* menu = CCMenu::create(); + + menu->setContentWidth(300.f); + menu->setLayout( + RowLayout::create() + ->setAxisAlignment(AxisAlignment::Even) + ); + + this->addChild(menu); + menu->setID("timer-settings-menu"_spr); + return true; +} \ No newline at end of file diff --git a/src/timer/Layers/TimerSettingsLayer.hpp b/src/timer/Layers/TimerSettingsLayer.hpp new file mode 100644 index 0000000..e261a4c --- /dev/null +++ b/src/timer/Layers/TimerSettingsLayer.hpp @@ -0,0 +1,16 @@ +#pragma once + +#include +using namespace geode::prelude; + +class TimerSettingsLayer : public Popup { + + public: + static TimerSettingsLayer* create(std::string const& menuID); + + protected: + bool setup(std::string const& menuID); + void resetTimer(); + void changeSettings(); + void addTime(); +}; \ No newline at end of file From c0569c3b53337a0f10638cb6e296e7e0551681f4 Mon Sep 17 00:00:00 2001 From: Hbg1010 Date: Sun, 24 Nov 2024 21:10:21 -0500 Subject: [PATCH 03/53] hooked pause layer to add timer control layer --- src/main.cpp | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/main.cpp b/src/main.cpp index 578b02e..28ab28d 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -6,6 +6,8 @@ #include #include "timer/TimerEvent.cpp" #include "timer/TimerLayer.cpp" +#include "timer/Layers/TimerSettingsLayer.cpp" + // #include "timer/EditorTimer.cpp" /** @@ -91,6 +93,15 @@ class $modify(TimerPauseLayer, PauseLayer) { CCMenuItemSpriteExtra* TimersettingsBtn = CCMenuItemSpriteExtra::create(spr, this, menu_selector(TimerPauseLayer::onTimerSettings)); auto settingsMenu = this->getChildByID("right-button-menu"); + + // adjusts the right menu to properly allow new buttons to be added + settingsMenu->setLayout( + ColumnLayout::create() + ->setGap(5.f) + ->setGrowCrossAxis(true) + ->setAxisReverse(true) + ->setAxisAlignment(AxisAlignment::End) + ,true); CCMenuItemSpriteExtra* settingsBtn; for (auto* node : CCArrayExt(settingsMenu->getChildren())) { @@ -104,14 +115,20 @@ class $modify(TimerPauseLayer, PauseLayer) { log::error("Options button could not be found!"); } - TimersettingsBtn->setPosition(settingsBtn->getPositionX(), settingsBtn->getPositionY() - settingsBtn->getContentWidth() * 1.5f); + + // TimersettingsBtn->setPosition(settingsBtn->getPositionX(), settingsBtn->getPositionY() - settingsBtn->getContentWidth() * 1.5f); // TimersettingsBtn->setContentSize(settingsBtn->getScaledContentSize()); settingsMenu->addChild(TimersettingsBtn); TimersettingsBtn->setID("timer-settings-btn"_spr); + + settingsMenu->updateLayout(); } void onTimerSettings(CCObject* sender) { log::debug("Settings menu was pressed"); + auto layer = TimerSettingsLayer::create(this->getID()); + layer->m_scene = this; + layer->show(); } }; From ca8cbb6c8fedda5716fc65d84ca8a80e23874386 Mon Sep 17 00:00:00 2001 From: Hbg1010 Date: Sun, 24 Nov 2024 21:10:33 -0500 Subject: [PATCH 04/53] Shortened this --- README.md | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index e371a9e..23fb2ca 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,10 @@ # 202020 -This is where she makes a mod. + +This mod the mod's logo -*Update logo.png to change your mod's icon (please)* + ## Getting started We recommend heading over to [the getting started section on our docs](https://docs.geode-sdk.org/getting-started/) for useful info on what to do next. @@ -15,10 +16,4 @@ For more info, see [our docs](https://docs.geode-sdk.org/getting-started/create- geode build ``` -# Resources -* [Geode SDK Documentation](https://docs.geode-sdk.org/) -* [Geode SDK Source Code](https://github.com/geode-sdk/geode/) -* [Geode CLI](https://github.com/geode-sdk/cli) -* [Bindings](https://github.com/geode-sdk/bindings/) -* [Dev Tools](https://github.com/geode-sdk/DevTools) # 20-20-20-Geode From aa4292c1f0b6055cf92f056c8bc8194ac42842a8 Mon Sep 17 00:00:00 2001 From: Hbg1010 Date: Sun, 24 Nov 2024 22:07:48 -0500 Subject: [PATCH 05/53] Added custom timer settings button --- mod.json | 5 +++++ resources/TimerSettings.png | Bin 0 -> 23652 bytes src/main.cpp | 3 ++- 3 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 resources/TimerSettings.png diff --git a/mod.json b/mod.json index 227b291..915324d 100644 --- a/mod.json +++ b/mod.json @@ -16,6 +16,11 @@ "importance": "required" } ], + "resources": { + "sprites": [ + "resources/*.png" + ] + }, "settings": { "interval": { "type": "int", diff --git a/resources/TimerSettings.png b/resources/TimerSettings.png new file mode 100644 index 0000000000000000000000000000000000000000..ddefb070e8765765e7956ea08ad1cc85bbac4b1e GIT binary patch literal 23652 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 z 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 literal 0 HcmV?d00001 diff --git a/src/main.cpp b/src/main.cpp index 28ab28d..d9a578b 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -88,7 +88,8 @@ class $modify(TimerPauseLayer, PauseLayer) { void customSetup() override { PauseLayer::customSetup(); - auto spr = CircleButtonSprite::createWithSpriteFrameName("particle_197_001.png"); + // auto spr = CircleButtonSprite::createWithSpriteFrameName("particle_197_001.png"); + auto spr = CCSprite::create("TimerSettings.png"_spr); spr->setScale(.65f); CCMenuItemSpriteExtra* TimersettingsBtn = CCMenuItemSpriteExtra::create(spr, this, menu_selector(TimerPauseLayer::onTimerSettings)); From 7818c1fbd8c5fad740f8e59e2d37ac63a8cc1a66 Mon Sep 17 00:00:00 2001 From: Hbg1010 Date: Sun, 24 Nov 2024 22:42:46 -0500 Subject: [PATCH 06/53] made button functions have propper requests + variables --- src/timer/Layers/TimerSettingsLayer.hpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/timer/Layers/TimerSettingsLayer.hpp b/src/timer/Layers/TimerSettingsLayer.hpp index e261a4c..4255cff 100644 --- a/src/timer/Layers/TimerSettingsLayer.hpp +++ b/src/timer/Layers/TimerSettingsLayer.hpp @@ -7,10 +7,11 @@ class TimerSettingsLayer : public Popup { public: static TimerSettingsLayer* create(std::string const& menuID); + std::string m_menuID; protected: bool setup(std::string const& menuID); - void resetTimer(); - void changeSettings(); - void addTime(); + void resetTimer(CCObject* sender); + void changeSettings(CCObject* sender); + void addTime(CCObject* sender); }; \ No newline at end of file From dd2404b48b131917d04bd0ce7cff6f5e45285e1a Mon Sep 17 00:00:00 2001 From: Hbg1010 Date: Sun, 24 Nov 2024 22:43:00 -0500 Subject: [PATCH 07/53] added buttons --- src/timer/Layers/TimerSettingsLayer.cpp | 26 +++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/src/timer/Layers/TimerSettingsLayer.cpp b/src/timer/Layers/TimerSettingsLayer.cpp index 0bd9c06..c7c9d58 100644 --- a/src/timer/Layers/TimerSettingsLayer.cpp +++ b/src/timer/Layers/TimerSettingsLayer.cpp @@ -16,6 +16,7 @@ TimerSettingsLayer* TimerSettingsLayer::create(std::string const& menuID) { } bool TimerSettingsLayer::setup(std::string const& menuID) { + TimerSettingsLayer::m_menuID = menuID; CCSize screenSize = CCDirector::sharedDirector()->getWinSize(); log::debug("{}", menuID); @@ -31,5 +32,30 @@ bool TimerSettingsLayer::setup(std::string const& menuID) { this->addChild(menu); menu->setID("timer-settings-menu"_spr); + + // reset button + auto resetSpr = cocos2d::CCSprite::createWithSpriteFrameName("GJ_updateBtn_001.png");//"GJ_updateBtn_001.png" + CCMenuItemSpriteExtra* resetButton = CCMenuItemSpriteExtra::create(resetSpr, this, nullptr); //menu_selector(TimerSettingsLayer::resetTimer) + menu->addChild(resetButton); + resetButton->setID("reset-button"_spr); + + // add button + auto addSpr = cocos2d::CCSprite::createWithSpriteFrameName("GJ_plusBtn_001.png");//"GJ_plusBtn_001.png" + CCMenuItemSpriteExtra* addButton = CCMenuItemSpriteExtra::create(addSpr, this, nullptr); + menu->addChild(addButton); + addButton->setID("add-button"_spr); + + // settings button + auto settingsSpr = cocos2d::CCSprite::createWithSpriteFrameName("GJ_optionsBtn_001.png");//"GJ_optionsBtn_001.png" + CCMenuItemSpriteExtra* settingsButton = CCMenuItemSpriteExtra::create(settingsSpr, this, nullptr); + menu->addChild(settingsButton); + settingsButton->setID("settings-button"_spr); + + // updates the layout + menu->updateLayout(); return true; +} + +void TimerSettingsLayer::resetTimer(CCObject* sender) { + log::debug("reseting the timer!"); } \ No newline at end of file From 031ed74c5e25990d62a123ee686c083363ed5db1 Mon Sep 17 00:00:00 2001 From: hbg1010 Date: Mon, 25 Nov 2024 09:54:52 -0500 Subject: [PATCH 08/53] fixed formatting --- src/timer/EditorTimer.hpp | 18 +++++++++--------- src/timer/Layers/TimerSettingsLayer.hpp | 17 ++++++++--------- src/timer/TimerEvent.hpp | 18 +++++++++--------- src/timer/TimerLayer.hpp | 14 +++++++------- 4 files changed, 33 insertions(+), 34 deletions(-) diff --git a/src/timer/EditorTimer.hpp b/src/timer/EditorTimer.hpp index bbbb8c9..68d362e 100644 --- a/src/timer/EditorTimer.hpp +++ b/src/timer/EditorTimer.hpp @@ -6,19 +6,19 @@ using namespace geode::prelude; // EditorTimerTask startEditorTimer(); class popUpEnabledEvent : public Event { - public: - popUpEnabledEvent(bool isEnabled); - bool mode; +public: + popUpEnabledEvent(bool isEnabled); + bool mode; }; class popUpEnabledFilter : public EventFilter { - protected: - CCNode* m_target; +protected: + CCNode* m_target; - public: - using Callback = void(bool); - popUpEnabledFilter(CCNode* target); - ListenerResult handle(std::function fn, popUpEnabledEvent* ev); +public: + using Callback = void(bool); + popUpEnabledFilter(CCNode* target); + ListenerResult handle(std::function fn, popUpEnabledEvent* ev); }; \ No newline at end of file diff --git a/src/timer/Layers/TimerSettingsLayer.hpp b/src/timer/Layers/TimerSettingsLayer.hpp index 4255cff..e1536e6 100644 --- a/src/timer/Layers/TimerSettingsLayer.hpp +++ b/src/timer/Layers/TimerSettingsLayer.hpp @@ -4,14 +4,13 @@ using namespace geode::prelude; class TimerSettingsLayer : public Popup { +public: + static TimerSettingsLayer* create(std::string const& menuID); + std::string m_menuID; - public: - static TimerSettingsLayer* create(std::string const& menuID); - std::string m_menuID; - - protected: - bool setup(std::string const& menuID); - void resetTimer(CCObject* sender); - void changeSettings(CCObject* sender); - void addTime(CCObject* sender); +protected: + bool setup(std::string const& menuID); + void resetTimer(CCObject* sender); + void changeSettings(CCObject* sender); + void addTime(CCObject* sender); }; \ No newline at end of file diff --git a/src/timer/TimerEvent.hpp b/src/timer/TimerEvent.hpp index 98fac42..cba8f30 100644 --- a/src/timer/TimerEvent.hpp +++ b/src/timer/TimerEvent.hpp @@ -4,18 +4,18 @@ using namespace geode::prelude; class TimerEvent : public Event { - public: - TimerEvent(bool active, CCNode* currentLayer); - bool isActive(); - CCNode* getCurrentLayer(); +public: + TimerEvent(bool active, CCNode* currentLayer); + bool isActive(); + CCNode* getCurrentLayer(); - protected: - bool m_active; +protected: + bool m_active; }; class TimerFilter : public EventFilter { - public: - using Callback = void(); +public: + using Callback = void(); - ListenerResult handle(std::function fn, TimerEvent* ev); + ListenerResult handle(std::function fn, TimerEvent* ev); }; diff --git a/src/timer/TimerLayer.hpp b/src/timer/TimerLayer.hpp index 2d0d9ad..c52e7ea 100644 --- a/src/timer/TimerLayer.hpp +++ b/src/timer/TimerLayer.hpp @@ -7,13 +7,13 @@ using namespace geode::prelude; using countTask = Task; class TimerLayer : public Popup { - public: - static TimerLayer* create(std::string const& waitTime); +public: + static TimerLayer* create(std::string const& waitTime); - protected: - void countDown(countTask::Event* event); - bool setup(std::string const& waitTime); - void onClick(CCObject* sender); - virtual void onClose(cocos2d::CCObject*); +protected: + void countDown(countTask::Event* event); + bool setup(std::string const& waitTime); + void onClick(CCObject* sender); + virtual void onClose(cocos2d::CCObject*); }; \ No newline at end of file From f56bd82f11d1f472af15ec5004688329d9910b5f Mon Sep 17 00:00:00 2001 From: hbg1010 Date: Mon, 25 Nov 2024 16:28:47 -0500 Subject: [PATCH 09/53] changed to compile all C++ files --- CMakeLists.txt | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 0e87077..4d566f0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -7,10 +7,13 @@ set(CMAKE_CXX_VISIBILITY_PRESET hidden) project(202020 VERSION 1.0.0) # Set up the mod binary -add_library(${PROJECT_NAME} SHARED - src/main.cpp - # Add any extra C++ source files here -) + +file(GLOB_RECURSE SOURCES src/*.cpp) +add_library(${PROJECT_NAME} SHARED ${SOURCES}) +# add_library(${PROJECT_NAME} SHARED +# src/main.cpp +# # Add any extra C++ source files here +# ) if (NOT DEFINED ENV{GEODE_SDK}) message(FATAL_ERROR "Unable to find Geode SDK! Please define GEODE_SDK environment variable to point to Geode") From a240742dea6fe1275d958bd4fd810501d0ed3cab Mon Sep 17 00:00:00 2001 From: hbg1010 Date: Mon, 25 Nov 2024 16:30:34 -0500 Subject: [PATCH 10/53] Split all hooks into indivual files --- src/hooks/EditorTimerPause.cpp | 45 +++++ src/hooks/EditorTimerPause.hpp | 59 +++++++ src/hooks/EditorUITimer.cpp | 79 +++++++++ src/hooks/EditorUITimer.hpp | 100 ++++++++++++ src/hooks/TimerPauseLayer.cpp | 33 ++++ src/hooks/TimerPauseLayer.hpp | 54 ++++++ src/hooks/TimerPlayLayer.cpp | 48 ++++++ src/hooks/TimerPlayLayer.hpp | 23 +++ src/main.cpp | 289 +-------------------------------- 9 files changed, 445 insertions(+), 285 deletions(-) create mode 100644 src/hooks/EditorTimerPause.cpp create mode 100644 src/hooks/EditorTimerPause.hpp create mode 100644 src/hooks/EditorUITimer.cpp create mode 100644 src/hooks/EditorUITimer.hpp create mode 100644 src/hooks/TimerPauseLayer.cpp create mode 100644 src/hooks/TimerPauseLayer.hpp create mode 100644 src/hooks/TimerPlayLayer.cpp create mode 100644 src/hooks/TimerPlayLayer.hpp diff --git a/src/hooks/EditorTimerPause.cpp b/src/hooks/EditorTimerPause.cpp new file mode 100644 index 0000000..6242c9b --- /dev/null +++ b/src/hooks/EditorTimerPause.cpp @@ -0,0 +1,45 @@ +#include "EditorTimerPause.hpp" + +bool EditorTimerPause::init(LevelEditorLayer* lvl) { + + if (!EditorPauseLayer::init(lvl)) return false; + + // auto spr = CircleButtonSprite::createWithSpriteFrameName("particle_197_001.png"); + auto spr = CCSprite::create("TimerSettings.png"_spr); + spr->setScale(.65f); + CCMenuItemSpriteExtra* timersettingsBtn = CCMenuItemSpriteExtra::create(spr, this, menu_selector(EditorTimerPause::onTimerSettings)); + + auto settingsMenu = this->getChildByID("settings-menu"); + settingsMenu->setContentHeight(this->getContentHeight()*2); + settingsMenu->setPositionY(settingsMenu->getPositionY()+5.f); + settingsMenu->setLayout( + ColumnLayout::create() + ->setGap(5.f) + ->setGrowCrossAxis(true) + // ->setAxisReverse(true) + ->setAxisAlignment(AxisAlignment::Center) + ,true); + + + settingsMenu->addChild(timersettingsBtn); + timersettingsBtn->setID("timer-settings-btn"_spr); + + settingsMenu->updateLayout(); + return true; +} + +void EditorTimerPause::onResume(CCObject* sender) { + EditorPauseLayer::onResume(sender); + auto x = static_cast(EditorUITimer::get()); + + x->resetTimer(); + +} + +void EditorTimerPause::onTimerSettings(CCObject* sender) { + log::debug("Settings menu was pressed"); + auto layer = TimerSettingsLayer::create(this); + layer->m_scene = this; + layer->setTouchPriority(this->getTouchPriority() -1); + layer->show(); +} \ No newline at end of file diff --git a/src/hooks/EditorTimerPause.hpp b/src/hooks/EditorTimerPause.hpp new file mode 100644 index 0000000..ad5f44b --- /dev/null +++ b/src/hooks/EditorTimerPause.hpp @@ -0,0 +1,59 @@ + + +#include +#include "../timer/Layers/TimerSettingsLayer.hpp" +#include "EditorUITimer.hpp" + +using namespace geode::prelude; + +class $modify(EditorTimerPause, EditorPauseLayer) { + + bool init(LevelEditorLayer* lvl); + // { + + // if (!EditorPauseLayer::init(lvl)) return false; + + // // auto spr = CircleButtonSprite::createWithSpriteFrameName("particle_197_001.png"); + // auto spr = CCSprite::create("TimerSettings.png"_spr); + // spr->setScale(.65f); + // CCMenuItemSpriteExtra* timersettingsBtn = CCMenuItemSpriteExtra::create(spr, this, menu_selector(EditorTimerPause::onTimerSettings)); + + // auto settingsMenu = this->getChildByID("settings-menu"); + // settingsMenu->setContentHeight(this->getContentHeight()*2); + // settingsMenu->setPositionY(settingsMenu->getPositionY()+5.f); + // settingsMenu->setLayout( + // ColumnLayout::create() + // ->setGap(5.f) + // ->setGrowCrossAxis(true) + // // ->setAxisReverse(true) + // ->setAxisAlignment(AxisAlignment::Center) + // ,true); + + + // settingsMenu->addChild(timersettingsBtn); + // timersettingsBtn->setID("timer-settings-btn"_spr); + + // settingsMenu->updateLayout(); + // return true; + // } + + // reseys the timer found in EditorUITimer + void onResume(CCObject* sender); + // { + // EditorPauseLayer::onResume(sender); + // auto x = static_cast(EditorUITimer::get()); + + // x->resetTimer(); + + // } + + // variantion of the timer settings popup, but the layer sets its priority ABOVE the pause layer + void onTimerSettings(CCObject* sender); + // { + // log::debug("Settings menu was pressed"); + // auto layer = TimerSettingsLayer::create(this); + // layer->m_scene = this; + // layer->setTouchPriority(this->getTouchPriority() -1); + // layer->show(); + // } +}; \ No newline at end of file diff --git a/src/hooks/EditorUITimer.cpp b/src/hooks/EditorUITimer.cpp new file mode 100644 index 0000000..b65ef2f --- /dev/null +++ b/src/hooks/EditorUITimer.cpp @@ -0,0 +1,79 @@ +#include "EditorUITimer.hpp" + +bool EditorUITimer::init(LevelEditorLayer* editorLayer) { + if (!EditorUI::init(editorLayer)) return false; + + m_fields->pauseAfterPlaytest = false; + m_fields->isPlaytesting = false; + m_fields->isPlaytesting = false; + + if (Mod::get()->getSettingValue("editorLayer")) { + m_fields->timer.bind(this, &EditorUITimer::onEvent); + m_fields->timer.setFilter(startEditorTimer()); + } + + return true; +} + +// sets play testing flag +void EditorUITimer::onPlaytest(CCObject* sender) { + EditorUI::onPlaytest(sender); + m_fields->isPlaytesting = true; + + // m_fields->pauseAfterPlaytest = true; // temp +} + +// unsets and checks pause layers +void EditorUITimer::playtestStopped() { + EditorUI::playtestStopped(); + + m_fields->isPlaytesting = false; +} + +void EditorUITimer::onPause(CCObject* sender) { + EditorUI::onPause(sender); + + if (m_fields->pauseAfterPlaytest) { + TimerEvent(true, this).post(); + + m_fields->pauseAfterPlaytest = false; + } +} + +// resets the timer on call! +void EditorUITimer::resetTimer() { + if (m_fields->reset(this)) { + log::debug("timer was reset!"); + } +} + +// cancels the timer before reseting +void EditorUITimer::forceReset() { + m_fields->timer.getFilter().shallowCancel(); + + resetTimer(); +} + +// this event happens when binded with the event listener. it will throw a new event when the timer task attatched is called. + void EditorUITimer::onEvent(EditorTimerTask::Event* ev) { + + if (bool* result = ev->getValue()) { + if (m_fields->isPlaytesting) { + m_fields->pauseAfterPlaytest = true; + return; + } + + EditorUITimer::onPause(this); + TimerEvent(true, this).post(); + + + } else if (int* progress = ev->getProgress()) { + log::debug("min: {}", *progress); + + } else if (ev->isCancelled()) { + return; + } + // validates if event shouldnt run due to condition + + } + diff --git a/src/hooks/EditorUITimer.hpp b/src/hooks/EditorUITimer.hpp new file mode 100644 index 0000000..e13f2e4 --- /dev/null +++ b/src/hooks/EditorUITimer.hpp @@ -0,0 +1,100 @@ +/** + * Modified editor UI + * + * This is a modified editor UI paged used to track play testing and pausing on the editor. + */ +#include +#include "../timer/EditorTimer.hpp" +#include "../timer/TimerEvent.hpp" + +using namespace geode::prelude; + +class $modify(EditorUITimer, EditorUI) { + struct Fields { + bool isPlaytesting; + bool pauseAfterPlaytest; + EventListener timer; + + // resets timer when it is finished + bool reset(EditorUITimer* sender) { + if (this->timer.getFilter().isFinished()) { + this->timer.bind(sender, &EditorUITimer::onEvent); + this->timer.setFilter(startEditorTimer()); + return true; + } + + return false; + } + }; + + bool init(LevelEditorLayer* editorLayer); + + // sets play testing flag + void onPlaytest(CCObject* sender); + // { + // EditorUI::onPlaytest(sender); + // m_fields->isPlaytesting = true; + + // // m_fields->pauseAfterPlaytest = true; // temp + // } + + // unsets and checks pause layers + void playtestStopped(); + // { + // EditorUI::playtestStopped(); + + // m_fields->isPlaytesting = false; + + // } + + void onPause(CCObject* sender); + // { + // EditorUI::onPause(sender); + + // if (m_fields->pauseAfterPlaytest) { + // TimerEvent(true, this).post(); + + // m_fields->pauseAfterPlaytest = false; + // } + // } + + // resets the timer on call! + void resetTimer(); + // { + // if (m_fields->reset(this)) { + // log::debug("timer was reset!"); + // } + // } + + // cancels the timer before reseting + void forceReset(); + // { + // m_fields->timer.getFilter().shallowCancel(); + + // resetTimer(); + // } + + // this event happens when binded with the event listener. it will throw a new event when the timer task attatched is called. + void onEvent(EditorTimerTask::Event* ev); + // { + + // if (bool* result = ev->getValue()) { + // if (m_fields->isPlaytesting) { + // m_fields->pauseAfterPlaytest = true; + // return; + // } + + // EditorUITimer::onPause(this); + // TimerEvent(true, this).post(); + + + // } else if (int* progress = ev->getProgress()) { + // log::debug("min: {}", *progress); + + // } else if (ev->isCancelled()) { + // return; + // } + // // validates if event shouldnt run due to condition + + // } +}; \ No newline at end of file diff --git a/src/hooks/TimerPauseLayer.cpp b/src/hooks/TimerPauseLayer.cpp new file mode 100644 index 0000000..8581a6b --- /dev/null +++ b/src/hooks/TimerPauseLayer.cpp @@ -0,0 +1,33 @@ +#include "TimerPauseLayer.hpp" + + void TimerPauseLayer::customSetup() { + PauseLayer::customSetup(); + + // auto spr = CircleButtonSprite::createWithSpriteFrameName("particle_197_001.png"); + auto spr = CCSprite::create("TimerSettings.png"_spr); + spr->setScale(.65f); + CCMenuItemSpriteExtra* TimersettingsBtn = CCMenuItemSpriteExtra::create(spr, this, menu_selector(TimerPauseLayer::onTimerSettings)); + + auto settingsMenu = this->getChildByID("right-button-menu"); + + // adjusts the right menu to properly allow new buttons to be added + settingsMenu->setLayout( + ColumnLayout::create() + ->setGap(5.f) + ->setGrowCrossAxis(true) + ->setAxisReverse(true) + ->setAxisAlignment(AxisAlignment::End) + ,true); + + settingsMenu->addChild(TimersettingsBtn); + TimersettingsBtn->setID("timer-settings-btn"_spr); + + settingsMenu->updateLayout(); + } + + void TimerPauseLayer::onTimerSettings(CCObject* sender) { + log::debug("Settings menu was pressed"); + auto layer = TimerSettingsLayer::create(this); + layer->m_scene = this; + layer->show(); + } \ No newline at end of file diff --git a/src/hooks/TimerPauseLayer.hpp b/src/hooks/TimerPauseLayer.hpp new file mode 100644 index 0000000..2fa855f --- /dev/null +++ b/src/hooks/TimerPauseLayer.hpp @@ -0,0 +1,54 @@ +#include "../timer/Layers/TimerSettingsLayer.hpp" +#include + +using namespace geode::prelude; + +class $modify(TimerPauseLayer, PauseLayer) { + void customSetup();// { + // PauseLayer::customSetup(); + + // // auto spr = CircleButtonSprite::createWithSpriteFrameName("particle_197_001.png"); + // auto spr = CCSprite::create("TimerSettings.png"_spr); + // spr->setScale(.65f); + // CCMenuItemSpriteExtra* TimersettingsBtn = CCMenuItemSpriteExtra::create(spr, this, menu_selector(TimerPauseLayer::onTimerSettings)); + + // auto settingsMenu = this->getChildByID("right-button-menu"); + + // // adjusts the right menu to properly allow new buttons to be added + // settingsMenu->setLayout( + // ColumnLayout::create() + // ->setGap(5.f) + // ->setGrowCrossAxis(true) + // ->setAxisReverse(true) + // ->setAxisAlignment(AxisAlignment::End) + // ,true); + // // CCMenuItemSpriteExtra* settingsBtn; + + // // for (auto* node : CCArrayExt(settingsMenu->getChildren())) { + // // if (node->getID() == "options-button") { + // // settingsBtn = static_cast(node); + // // break; + // // } + // // } + + // // if (settingsBtn == nullptr) { + // // log::error("Options button could not be found!"); + // // } + + + // // TimersettingsBtn->setPosition(settingsBtn->getPositionX(), settingsBtn->getPositionY() - settingsBtn->getContentWidth() * 1.5f); + // // TimersettingsBtn->setContentSize(settingsBtn->getScaledContentSize()); + // settingsMenu->addChild(TimersettingsBtn); + // TimersettingsBtn->setID("timer-settings-btn"_spr); + + // settingsMenu->updateLayout(); + // } + + void onTimerSettings(CCObject* sender); + // { + // log::debug("Settings menu was pressed"); + // auto layer = TimerSettingsLayer::create(this); + // layer->m_scene = this; + // layer->show(); + // } +}; \ No newline at end of file diff --git a/src/hooks/TimerPlayLayer.cpp b/src/hooks/TimerPlayLayer.cpp new file mode 100644 index 0000000..9b67f45 --- /dev/null +++ b/src/hooks/TimerPlayLayer.cpp @@ -0,0 +1,48 @@ +#include "TimerPlayLayer.hpp" + +/* hooks +========== */ + + bool TimerPlayLayer::init(GJGameLevel* p0, bool p1, bool p2){ + if (!PlayLayer::init(p0,p1,p2)) return false; + // NodeIDs::provideFor(this); + m_fields->useTimer = Mod::get()->getSettingValue("playLayer"); + + if (m_fields->useTimer) { + auto tp1 = std::chrono::system_clock::now(); + + // m_fields->starttime = std::chrono::system_clock::now(); + m_fields->resetTimer(); + } + + + // std::time_t time = std::chrono::system_clock::to_time_t(m_fields->endtime); + // log::debug("TIme is {}", std::ctime(&time)); + return true; + } + + void TimerPlayLayer::resetLevel() { + PlayLayer::resetLevel(); + + if (!m_fields->useTimer) return; + + // condition. checks if current time > start time + 20min + auto difference = m_fields->endtime - std::chrono::system_clock::now(); + log::debug("{}", difference.count()); + /* + TODO: REVERSE INEQUALITY TO <= WHEN TESTING COMPLETE + */ + if (difference.count() <= 0) { + // calls the pause function. On windows, Pause (init) is out of line! + PlayLayer::pauseGame(true); + + log::debug("{}", this->getID()); + + // this posts the details of current events + TimerEvent(true, this).post(); + m_fields->resetTimer(); + + } else { + log::debug("Timer not called! {}", difference.count()); + } + } \ No newline at end of file diff --git a/src/hooks/TimerPlayLayer.hpp b/src/hooks/TimerPlayLayer.hpp new file mode 100644 index 0000000..c7b7397 --- /dev/null +++ b/src/hooks/TimerPlayLayer.hpp @@ -0,0 +1,23 @@ +#include +#include "../timer/TimerEvent.hpp" +#include +#include + +using namespace geode::prelude; + +// Controls pausing in game. +class $modify(TimerPlayLayer, PlayLayer) { + + struct Fields { + // std::chrono::time_point starttime; + std::chrono::time_point endtime; + bool useTimer; + // resets the timer on call; + void resetTimer() { + endtime = std::chrono::system_clock::now() + std::chrono::minutes{Mod::get()->getSettingValue("interval")}; // TODO: Replace with setting + } + }; + + bool init(GJGameLevel* p0, bool p1, bool p2); + void resetLevel(); +}; \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index d9a578b..5dc9f68 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -2,294 +2,14 @@ * Include the Geode headers. */ #include -#include -#include -#include "timer/TimerEvent.cpp" -#include "timer/TimerLayer.cpp" -#include "timer/Layers/TimerSettingsLayer.cpp" - -// #include "timer/EditorTimer.cpp" +#include "timer/TimerEvent.hpp" +#include "timer/TimerLayer.hpp" /** * Brings cocos2d and all Geode namespaces to the current scope. */ using namespace geode::prelude; -// Controls pausing in game. -#include -class $modify(PlayLayer) { - - struct Fields { - // std::chrono::time_point starttime; - std::chrono::time_point endtime; - bool useTimer; - // resets the timer on call; - void resetTimer() { - endtime = std::chrono::system_clock::now() + std::chrono::minutes{Mod::get()->getSettingValue("interval")}; // TODO: Replace with setting - } - }; - - bool init(GJGameLevel* p0, bool p1, bool p2){ - if (!PlayLayer::init(p0,p1,p2)) return false; - // NodeIDs::provideFor(this); - m_fields->useTimer = Mod::get()->getSettingValue("playLayer"); - - if (m_fields->useTimer) { - auto tp1 = std::chrono::system_clock::now(); - - // m_fields->starttime = std::chrono::system_clock::now(); - m_fields->resetTimer(); - } - - - // std::time_t time = std::chrono::system_clock::to_time_t(m_fields->endtime); - // log::debug("TIme is {}", std::ctime(&time)); - return true; - } - // "dependencies": [ - // { - // "id": "geode.node-ids", - // "version": "v1.17.0-beta.1", - // "importance": "required" - // } - // ] - - void resetLevel() { - PlayLayer::resetLevel(); - - if (!m_fields->useTimer) return; - - // condition. checks if current time > start time + 20min - auto difference = m_fields->endtime - std::chrono::system_clock::now(); - log::debug("{}", difference.count()); - /* - TODO: REVERSE INEQUALITY TO <= WHEN TESTING COMPLETE - */ - if (difference.count() <= 0) { - // calls the pause function. On windows, Pause (init) is out of line! - PlayLayer::pauseGame(true); - - log::debug("{}", this->getID()); - - // this posts the details of current events - TimerEvent(true, this).post(); - m_fields->resetTimer(); - - } else { - log::debug("Timer not called! {}", difference.count()); - } - } - - -}; - -#include -class $modify(TimerPauseLayer, PauseLayer) { - void customSetup() override { - PauseLayer::customSetup(); - - // auto spr = CircleButtonSprite::createWithSpriteFrameName("particle_197_001.png"); - auto spr = CCSprite::create("TimerSettings.png"_spr); - spr->setScale(.65f); - CCMenuItemSpriteExtra* TimersettingsBtn = CCMenuItemSpriteExtra::create(spr, this, menu_selector(TimerPauseLayer::onTimerSettings)); - - auto settingsMenu = this->getChildByID("right-button-menu"); - - // adjusts the right menu to properly allow new buttons to be added - settingsMenu->setLayout( - ColumnLayout::create() - ->setGap(5.f) - ->setGrowCrossAxis(true) - ->setAxisReverse(true) - ->setAxisAlignment(AxisAlignment::End) - ,true); - CCMenuItemSpriteExtra* settingsBtn; - - for (auto* node : CCArrayExt(settingsMenu->getChildren())) { - if (node->getID() == "options-button") { - settingsBtn = static_cast(node); - break; - } - } - - if (settingsBtn == nullptr) { - log::error("Options button could not be found!"); - } - - - // TimersettingsBtn->setPosition(settingsBtn->getPositionX(), settingsBtn->getPositionY() - settingsBtn->getContentWidth() * 1.5f); - // TimersettingsBtn->setContentSize(settingsBtn->getScaledContentSize()); - settingsMenu->addChild(TimersettingsBtn); - TimersettingsBtn->setID("timer-settings-btn"_spr); - - settingsMenu->updateLayout(); - } - - void onTimerSettings(CCObject* sender) { - log::debug("Settings menu was pressed"); - auto layer = TimerSettingsLayer::create(this->getID()); - layer->m_scene = this; - layer->show(); - } -}; - - - - -using EditorTimerTask = Task; - -//This is set up to check for each second, as an early canel would mean this event could just continue existing in memory -EditorTimerTask startEditorTimer() { - return EditorTimerTask::run([](auto progress, auto hasBeenCancelled) -> EditorTimerTask::Result { - log::debug("Starting editor timer!"); - int time = Mod::get()->getSettingValue("interval") *60; // gets the amount of seconds - - // sleeps every second, as this needs to check if the event has been cancelled to not cause any problems! - for (int i = 0; i < time; i++) { - if (hasBeenCancelled()) { - return EditorTimerTask::Cancel(); - - } else if (i % 60 == 0) { - progress(i / 60); - } - std::this_thread::sleep_for(std::chrono::seconds(1)); - } - - - return true; - }); -} - -/** - * Modified editor UI - * - * This is a modified editor UI paged used to track play testing and pausing on the editor. - */ -#include -class $modify(EditorUITimer, EditorUI) { - struct Fields { - bool isPlaytesting; - bool pauseAfterPlaytest; - EventListener timer; - - // resets timer when it is finished - bool reset(EditorUITimer* sender) { - if (this->timer.getFilter().isFinished()) { - this->timer.bind(sender, &EditorUITimer::onEvent); - this->timer.setFilter(startEditorTimer()); - return true; - } - - return false; - } - - }; - - bool init(LevelEditorLayer* editorLayer) { - if (!EditorUI::init(editorLayer)) return false; - - m_fields->pauseAfterPlaytest = false; - m_fields->isPlaytesting = false; - m_fields->isPlaytesting = false; - - if (Mod::get()->getSettingValue("editorLayer")) { - m_fields->timer.bind(this, &EditorUITimer::onEvent); - m_fields->timer.setFilter(startEditorTimer()); - } - - - - return true; - } - - // sets play testing flag - void onPlaytest(CCObject* sender) { - EditorUI::onPlaytest(sender); - m_fields->isPlaytesting = true; - - // m_fields->pauseAfterPlaytest = true; // temp - } - - // unsets and checks pause layers - void playtestStopped() { - EditorUI::playtestStopped(); - - m_fields->isPlaytesting = false; - - } - - void onPause(CCObject* sender) { - EditorUI::onPause(sender); - - if (m_fields->pauseAfterPlaytest) { - TimerEvent(true, this).post(); - - m_fields->pauseAfterPlaytest = false; - } - } - - // resets the timer on call! - void resetTimer() { - if (m_fields->reset(this)) { - log::debug("timer was reset!"); - } - } - - // this event happens when binded with the event listener. it will throw a new event when the timer task attatched is called. - void onEvent(EditorTimerTask::Event* ev) { - - if (bool* result = ev->getValue()) { - if (m_fields->isPlaytesting) { - m_fields->pauseAfterPlaytest = true; - return; - } - - EditorUITimer::onPause(this); - TimerEvent(true, this).post(); - - - } else if (int* progress = ev->getProgress()) { - log::debug("min: {}", *progress); - - } else if (ev->isCancelled()) { - return; - } - // validates if event shouldnt run due to condition - - } - - // //TODO: impl function - // void resetTimer() { - // return; - // } -}; - -#include -class $modify(EditorTimerFix, EditorPauseLayer) { - - // bool init(LevelEditorLayer* lvl) { - - // if (!EditorPauseLayer::init(lvl)) return false; - // // m_fields->listener = { - // // this, &onPopupEvent - // // } - // // for (auto node : CCArrayExt(this->getChildByID("resume-menu")->getChildren())) { - // // changeButtonState(node, false); - // // } - - // return true; - // } - - // reseys the timer found in EditorUITimer - void onResume(CCObject* sender) { - EditorPauseLayer::onResume(sender); - auto x = static_cast(EditorUITimer::get()); - - x->resetTimer(); - - } -}; - // this executes the event when it occurs $execute{ @@ -323,9 +43,8 @@ class $modify(EditorTimerFix, EditorPauseLayer) { // very open to knowing a better way to do this! ! ! Unlike the editorUI though, theres no get function :( auto editorPauseLayer = ev->getCurrentLayer()->getParent()->getChildByID("EditorPauseLayer"); if (editorPauseLayer != nullptr) x->setTouchPriority(static_cast(editorPauseLayer)->getTouchPriority() - 1); - - // log::debug("{}", x->getTouchPriority()); - // x->setID("TimerAlert"_spr); + + x->setID("TimerAlert"_spr); return ListenerResult::Stop; From 5872ef69d84e37082c79e944410f3176db40e523 Mon Sep 17 00:00:00 2001 From: hbg1010 Date: Mon, 25 Nov 2024 16:30:48 -0500 Subject: [PATCH 11/53] old main --- src/a.txt | 302 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 302 insertions(+) diff --git a/src/a.txt b/src/a.txt index abf1563..7bdb21e 100644 --- a/src/a.txt +++ b/src/a.txt @@ -87,4 +87,306 @@ // void onMyButton(CCObject*) { // FLAlertLayer::create("Geode", "Hello from my custom mod!", "OK")->show(); // } +// }; + +// // Controls pausing in game. +// #include +// class $modify(TimerPlayLayer, PlayLayer) { + +// struct Fields { +// // std::chrono::time_point starttime; +// std::chrono::time_point endtime; +// bool useTimer; +// // resets the timer on call; +// void resetTimer() { +// endtime = std::chrono::system_clock::now() + std::chrono::minutes{Mod::get()->getSettingValue("interval")}; // TODO: Replace with setting +// } +// }; + +// bool init(GJGameLevel* p0, bool p1, bool p2){ +// if (!PlayLayer::init(p0,p1,p2)) return false; +// // NodeIDs::provideFor(this); +// m_fields->useTimer = Mod::get()->getSettingValue("playLayer"); + +// if (m_fields->useTimer) { +// auto tp1 = std::chrono::system_clock::now(); + +// // m_fields->starttime = std::chrono::system_clock::now(); +// m_fields->resetTimer(); +// } + + +// // std::time_t time = std::chrono::system_clock::to_time_t(m_fields->endtime); +// // log::debug("TIme is {}", std::ctime(&time)); +// return true; +// } +// // "dependencies": [ +// // { +// // "id": "geode.node-ids", +// // "version": "v1.17.0-beta.1", +// // "importance": "required" +// // } +// // ] + +// void resetLevel() { +// PlayLayer::resetLevel(); + +// if (!m_fields->useTimer) return; + +// // condition. checks if current time > start time + 20min +// auto difference = m_fields->endtime - std::chrono::system_clock::now(); +// log::debug("{}", difference.count()); +// /* +// TODO: REVERSE INEQUALITY TO <= WHEN TESTING COMPLETE +// */ +// if (difference.count() <= 0) { +// // calls the pause function. On windows, Pause (init) is out of line! +// PlayLayer::pauseGame(true); + +// log::debug("{}", this->getID()); + +// // this posts the details of current events +// TimerEvent(true, this).post(); +// m_fields->resetTimer(); + +// } else { +// log::debug("Timer not called! {}", difference.count()); +// } +// } + + +// }; + +// #include +// class $modify(TimerPauseLayer, PauseLayer) { +// void customSetup() override { +// PauseLayer::customSetup(); + +// // auto spr = CircleButtonSprite::createWithSpriteFrameName("particle_197_001.png"); +// auto spr = CCSprite::create("TimerSettings.png"_spr); +// spr->setScale(.65f); +// CCMenuItemSpriteExtra* TimersettingsBtn = CCMenuItemSpriteExtra::create(spr, this, menu_selector(TimerPauseLayer::onTimerSettings)); + +// auto settingsMenu = this->getChildByID("right-button-menu"); + +// // adjusts the right menu to properly allow new buttons to be added +// settingsMenu->setLayout( +// ColumnLayout::create() +// ->setGap(5.f) +// ->setGrowCrossAxis(true) +// ->setAxisReverse(true) +// ->setAxisAlignment(AxisAlignment::End) +// ,true); +// // CCMenuItemSpriteExtra* settingsBtn; + +// // for (auto* node : CCArrayExt(settingsMenu->getChildren())) { +// // if (node->getID() == "options-button") { +// // settingsBtn = static_cast(node); +// // break; +// // } +// // } + +// // if (settingsBtn == nullptr) { +// // log::error("Options button could not be found!"); +// // } + + +// // TimersettingsBtn->setPosition(settingsBtn->getPositionX(), settingsBtn->getPositionY() - settingsBtn->getContentWidth() * 1.5f); +// // TimersettingsBtn->setContentSize(settingsBtn->getScaledContentSize()); +// settingsMenu->addChild(TimersettingsBtn); +// TimersettingsBtn->setID("timer-settings-btn"_spr); + +// settingsMenu->updateLayout(); +// } + +// void onTimerSettings(CCObject* sender) { +// log::debug("Settings menu was pressed"); +// auto layer = TimerSettingsLayer::create(this); +// layer->m_scene = this; +// layer->show(); +// } +// }; + + + + +// using EditorTimerTask = Task; + +// //This is set up to check for each second, as an early canel would mean this event could just continue existing in memory +// EditorTimerTask startEditorTimer() { +// return EditorTimerTask::run([](auto progress, auto hasBeenCancelled) -> EditorTimerTask::Result { +// log::debug("Starting editor timer!"); +// int time = Mod::get()->getSettingValue("interval") *60; // gets the amount of seconds + +// // sleeps every second, as this needs to check if the event has been cancelled to not cause any problems! +// for (int i = 0; i < time; i++) { +// if (hasBeenCancelled()) { +// return EditorTimerTask::Cancel(); + +// } else if (i % 60 == 0) { +// progress(i / 60); +// } +// std::this_thread::sleep_for(std::chrono::seconds(1)); +// } + + +// return true; +// }); +// } + + +// #include +// class $modify(EditorUITimer, EditorUI) { +// struct Fields { +// bool isPlaytesting; +// bool pauseAfterPlaytest; +// EventListener timer; + +// // resets timer when it is finished +// bool reset(EditorUITimer* sender) { +// if (this->timer.getFilter().isFinished()) { +// this->timer.bind(sender, &EditorUITimer::onEvent); +// this->timer.setFilter(startEditorTimer()); +// return true; +// } + +// return false; +// } + +// }; + +// bool init(LevelEditorLayer* editorLayer) { +// if (!EditorUI::init(editorLayer)) return false; + +// m_fields->pauseAfterPlaytest = false; +// m_fields->isPlaytesting = false; +// m_fields->isPlaytesting = false; + +// if (Mod::get()->getSettingValue("editorLayer")) { +// m_fields->timer.bind(this, &EditorUITimer::onEvent); +// m_fields->timer.setFilter(startEditorTimer()); +// } + + + +// return true; +// } + +// // sets play testing flag +// void onPlaytest(CCObject* sender) { +// EditorUI::onPlaytest(sender); +// m_fields->isPlaytesting = true; + +// // m_fields->pauseAfterPlaytest = true; // temp +// } + +// // unsets and checks pause layers +// void playtestStopped() { +// EditorUI::playtestStopped(); + +// m_fields->isPlaytesting = false; + +// } + +// void onPause(CCObject* sender) { +// EditorUI::onPause(sender); + +// if (m_fields->pauseAfterPlaytest) { +// TimerEvent(true, this).post(); + +// m_fields->pauseAfterPlaytest = false; +// } +// } + +// // resets the timer on call! +// void resetTimer() { +// if (m_fields->reset(this)) { +// log::debug("timer was reset!"); +// } +// } + +// // cancels the timer before reseting +// void forceReset() { +// m_fields->timer.getFilter().shallowCancel(); + +// resetTimer(); +// } + +// // this event happens when binded with the event listener. it will throw a new event when the timer task attatched is called. +// void onEvent(EditorTimerTask::Event* ev) { + +// if (bool* result = ev->getValue()) { +// if (m_fields->isPlaytesting) { +// m_fields->pauseAfterPlaytest = true; +// return; +// } + +// EditorUITimer::onPause(this); +// TimerEvent(true, this).post(); + + +// } else if (int* progress = ev->getProgress()) { +// log::debug("min: {}", *progress); + +// } else if (ev->isCancelled()) { +// return; +// } +// // validates if event shouldnt run due to condition + +// } + +// // //TODO: impl function +// // void resetTimer() { +// // return; +// // } +// }; + +// #include +// class $modify(EditorTimerPause, EditorPauseLayer) { + +// bool init(LevelEditorLayer* lvl) { + +// if (!EditorPauseLayer::init(lvl)) return false; + +// // auto spr = CircleButtonSprite::createWithSpriteFrameName("particle_197_001.png"); +// auto spr = CCSprite::create("TimerSettings.png"_spr); +// spr->setScale(.65f); +// CCMenuItemSpriteExtra* timersettingsBtn = CCMenuItemSpriteExtra::create(spr, this, menu_selector(EditorTimerPause::onTimerSettings)); + +// auto settingsMenu = this->getChildByID("settings-menu"); +// settingsMenu->setContentHeight(this->getContentHeight()*2); +// settingsMenu->setPositionY(settingsMenu->getPositionY()+5.f); +// settingsMenu->setLayout( +// ColumnLayout::create() +// ->setGap(5.f) +// ->setGrowCrossAxis(true) +// // ->setAxisReverse(true) +// ->setAxisAlignment(AxisAlignment::Center) +// ,true); + + +// settingsMenu->addChild(timersettingsBtn); +// timersettingsBtn->setID("timer-settings-btn"_spr); + +// settingsMenu->updateLayout(); +// return true; +// } + +// // reseys the timer found in EditorUITimer +// void onResume(CCObject* sender) { +// EditorPauseLayer::onResume(sender); +// auto x = static_cast(EditorUITimer::get()); + +// x->resetTimer(); + +// } + +// // variantion of the timer settings popup, but the layer sets its priority ABOVE the pause layer +// void onTimerSettings(CCObject* sender) { +// log::debug("Settings menu was pressed"); +// auto layer = TimerSettingsLayer::create(this); +// layer->m_scene = this; +// layer->setTouchPriority(this->getTouchPriority() -1); +// layer->show(); +// } // }; \ No newline at end of file From 7a96273b93af2d8895a00bd2de76fabe9cab12e2 Mon Sep 17 00:00:00 2001 From: hbg1010 Date: Mon, 25 Nov 2024 16:31:28 -0500 Subject: [PATCH 12/53] Uses CCNode* instead of std::String --- src/timer/Layers/TimerSettingsLayer.cpp | 21 ++++++++++++++++++--- src/timer/Layers/TimerSettingsLayer.hpp | 8 ++++---- 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/src/timer/Layers/TimerSettingsLayer.cpp b/src/timer/Layers/TimerSettingsLayer.cpp index c7c9d58..fdbbced 100644 --- a/src/timer/Layers/TimerSettingsLayer.cpp +++ b/src/timer/Layers/TimerSettingsLayer.cpp @@ -1,6 +1,6 @@ #include "TimerSettingsLayer.hpp" -TimerSettingsLayer* TimerSettingsLayer::create(std::string const& menuID) { +TimerSettingsLayer* TimerSettingsLayer::create(CCNode* const& menuID) { auto temp = new TimerSettingsLayer(); // trys to make node @@ -15,7 +15,7 @@ TimerSettingsLayer* TimerSettingsLayer::create(std::string const& menuID) { } } -bool TimerSettingsLayer::setup(std::string const& menuID) { +bool TimerSettingsLayer::setup(CCNode* const& menuID) { TimerSettingsLayer::m_menuID = menuID; CCSize screenSize = CCDirector::sharedDirector()->getWinSize(); log::debug("{}", menuID); @@ -45,6 +45,13 @@ bool TimerSettingsLayer::setup(std::string const& menuID) { menu->addChild(addButton); addButton->setID("add-button"_spr); + //TODO: Find propper nodeIDs + // disables buttons if the current layer is disabled. + if ((!Mod::get()->getSettingValue("playLayer") && menuID->getID() == "PauseLayer") || (!Mod::get()->getSettingValue("editorLayer") && menuID->getID() == "EditorPauseLayer")) { + resetButton->setEnabled(false); + addButton->setEnabled(false); + } + // settings button auto settingsSpr = cocos2d::CCSprite::createWithSpriteFrameName("GJ_optionsBtn_001.png");//"GJ_optionsBtn_001.png" CCMenuItemSpriteExtra* settingsButton = CCMenuItemSpriteExtra::create(settingsSpr, this, nullptr); @@ -56,6 +63,14 @@ bool TimerSettingsLayer::setup(std::string const& menuID) { return true; } +// this callback occurs when the button is clicked void TimerSettingsLayer::resetTimer(CCObject* sender) { - log::debug("reseting the timer!"); + if (TimerSettingsLayer::m_menuID->getID() == "PauseLayer") { + log::debug("todo"); + } else { + // // reseting here is very easy. + // auto layer = EditorUITimer::get(); + // auto x = static_cast(EditorUITimer::get()); + // x->forceReset(); + } } \ No newline at end of file diff --git a/src/timer/Layers/TimerSettingsLayer.hpp b/src/timer/Layers/TimerSettingsLayer.hpp index e1536e6..697c6a7 100644 --- a/src/timer/Layers/TimerSettingsLayer.hpp +++ b/src/timer/Layers/TimerSettingsLayer.hpp @@ -3,13 +3,13 @@ #include using namespace geode::prelude; -class TimerSettingsLayer : public Popup { +class TimerSettingsLayer : public Popup { public: - static TimerSettingsLayer* create(std::string const& menuID); - std::string m_menuID; + static TimerSettingsLayer* create(CCNode* const& menuID); protected: - bool setup(std::string const& menuID); + CCNode* m_menuID; + bool setup(CCNode* const& menuID); void resetTimer(CCObject* sender); void changeSettings(CCObject* sender); void addTime(CCObject* sender); From b143d4a40ff17f81e3315e673f28233a419d0457 Mon Sep 17 00:00:00 2001 From: hbg1010 Date: Mon, 25 Nov 2024 16:32:04 -0500 Subject: [PATCH 13/53] cleaned up file --- src/timer/TimerLayer.hpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/timer/TimerLayer.hpp b/src/timer/TimerLayer.hpp index c52e7ea..089219c 100644 --- a/src/timer/TimerLayer.hpp +++ b/src/timer/TimerLayer.hpp @@ -2,8 +2,6 @@ #include using namespace geode::prelude; -// #include "TimerEvent.hpp" - using countTask = Task; class TimerLayer : public Popup { From 2b4a6faca65b31c0c3d663fa78483be657ec677e Mon Sep 17 00:00:00 2001 From: hbg1010 Date: Mon, 25 Nov 2024 16:32:22 -0500 Subject: [PATCH 14/53] Moved EditorTimerTask back to files --- src/timer/EditorTimer.cpp | 40 ++++++++++++++++++--------------------- src/timer/EditorTimer.hpp | 22 ++------------------- 2 files changed, 20 insertions(+), 42 deletions(-) diff --git a/src/timer/EditorTimer.cpp b/src/timer/EditorTimer.cpp index 2b68c4f..44e408b 100644 --- a/src/timer/EditorTimer.cpp +++ b/src/timer/EditorTimer.cpp @@ -1,27 +1,23 @@ #include "EditorTimer.hpp" +//This is set up to check for each second, as an early canel would mean this event could just continue existing in memory +EditorTimerTask startEditorTimer() { + return EditorTimerTask::run([](auto progress, auto hasBeenCancelled) -> EditorTimerTask::Result { + log::debug("Starting editor timer!"); + int time = Mod::get()->getSettingValue("interval") *60; // gets the amount of seconds + // sleeps every second, as this needs to check if the event has been cancelled to not cause any problems! + for (int i = 0; i < time; i++) { + if (hasBeenCancelled()) { + return EditorTimerTask::Cancel(); + } else if (i % 60 == 0) { + progress(i / 60); + } + std::this_thread::sleep_for(std::chrono::seconds(1)); + } -// popUpEnabledEvent::popUpEnabledEvent(bool isEnabled) { -// popUpEnabledEvent::mode = isEnabled; -// log::debug("Event called with status: {}", isEnabled); -// } - -// popUpEnabledFilter::popUpEnabledFilter(CCNode* target) { -// popUpEnabledFilter::m_target = target; -// } - -// ListenerResult popUpEnabledFilter::handle(std::function fn, popUpEnabledEvent* ev) { -// try -// { -// fn(ev->mode); -// return ListenerResult::Stop; -// } -// catch(const std::exception& e) -// { -// return ListenerResult::Propagate; -// } - - -// } + + return true; + }); +} diff --git a/src/timer/EditorTimer.hpp b/src/timer/EditorTimer.hpp index 68d362e..8d4facb 100644 --- a/src/timer/EditorTimer.hpp +++ b/src/timer/EditorTimer.hpp @@ -2,23 +2,5 @@ #include using namespace geode::prelude; - -// EditorTimerTask startEditorTimer(); - -class popUpEnabledEvent : public Event { -public: - popUpEnabledEvent(bool isEnabled); - bool mode; - -}; - -class popUpEnabledFilter : public EventFilter { -protected: - CCNode* m_target; - -public: - using Callback = void(bool); - popUpEnabledFilter(CCNode* target); - ListenerResult handle(std::function fn, popUpEnabledEvent* ev); - -}; \ No newline at end of file +using EditorTimerTask = Task; +EditorTimerTask startEditorTimer(); \ No newline at end of file From 8eea52a7cca346ec33eb7513c5da2b62db124455 Mon Sep 17 00:00:00 2001 From: hbg1010 Date: Mon, 25 Nov 2024 16:39:04 -0500 Subject: [PATCH 15/53] deleted commented code --- src/hooks/EditorTimerPause.hpp | 46 ------------------------- src/hooks/EditorUITimer.hpp | 63 ---------------------------------- src/hooks/TimerPauseLayer.hpp | 47 +------------------------ src/hooks/TimerPlayLayer.hpp | 2 +- 4 files changed, 2 insertions(+), 156 deletions(-) diff --git a/src/hooks/EditorTimerPause.hpp b/src/hooks/EditorTimerPause.hpp index ad5f44b..4c583d0 100644 --- a/src/hooks/EditorTimerPause.hpp +++ b/src/hooks/EditorTimerPause.hpp @@ -7,53 +7,7 @@ using namespace geode::prelude; class $modify(EditorTimerPause, EditorPauseLayer) { - bool init(LevelEditorLayer* lvl); - // { - - // if (!EditorPauseLayer::init(lvl)) return false; - - // // auto spr = CircleButtonSprite::createWithSpriteFrameName("particle_197_001.png"); - // auto spr = CCSprite::create("TimerSettings.png"_spr); - // spr->setScale(.65f); - // CCMenuItemSpriteExtra* timersettingsBtn = CCMenuItemSpriteExtra::create(spr, this, menu_selector(EditorTimerPause::onTimerSettings)); - - // auto settingsMenu = this->getChildByID("settings-menu"); - // settingsMenu->setContentHeight(this->getContentHeight()*2); - // settingsMenu->setPositionY(settingsMenu->getPositionY()+5.f); - // settingsMenu->setLayout( - // ColumnLayout::create() - // ->setGap(5.f) - // ->setGrowCrossAxis(true) - // // ->setAxisReverse(true) - // ->setAxisAlignment(AxisAlignment::Center) - // ,true); - - - // settingsMenu->addChild(timersettingsBtn); - // timersettingsBtn->setID("timer-settings-btn"_spr); - - // settingsMenu->updateLayout(); - // return true; - // } - - // reseys the timer found in EditorUITimer void onResume(CCObject* sender); - // { - // EditorPauseLayer::onResume(sender); - // auto x = static_cast(EditorUITimer::get()); - - // x->resetTimer(); - - // } - - // variantion of the timer settings popup, but the layer sets its priority ABOVE the pause layer void onTimerSettings(CCObject* sender); - // { - // log::debug("Settings menu was pressed"); - // auto layer = TimerSettingsLayer::create(this); - // layer->m_scene = this; - // layer->setTouchPriority(this->getTouchPriority() -1); - // layer->show(); - // } }; \ No newline at end of file diff --git a/src/hooks/EditorUITimer.hpp b/src/hooks/EditorUITimer.hpp index e13f2e4..a9a8768 100644 --- a/src/hooks/EditorUITimer.hpp +++ b/src/hooks/EditorUITimer.hpp @@ -28,73 +28,10 @@ class $modify(EditorUITimer, EditorUI) { }; bool init(LevelEditorLayer* editorLayer); - - // sets play testing flag void onPlaytest(CCObject* sender); - // { - // EditorUI::onPlaytest(sender); - // m_fields->isPlaytesting = true; - - // // m_fields->pauseAfterPlaytest = true; // temp - // } - - // unsets and checks pause layers void playtestStopped(); - // { - // EditorUI::playtestStopped(); - - // m_fields->isPlaytesting = false; - - // } - void onPause(CCObject* sender); - // { - // EditorUI::onPause(sender); - - // if (m_fields->pauseAfterPlaytest) { - // TimerEvent(true, this).post(); - - // m_fields->pauseAfterPlaytest = false; - // } - // } - - // resets the timer on call! void resetTimer(); - // { - // if (m_fields->reset(this)) { - // log::debug("timer was reset!"); - // } - // } - - // cancels the timer before reseting void forceReset(); - // { - // m_fields->timer.getFilter().shallowCancel(); - - // resetTimer(); - // } - - // this event happens when binded with the event listener. it will throw a new event when the timer task attatched is called. void onEvent(EditorTimerTask::Event* ev); - // { - - // if (bool* result = ev->getValue()) { - // if (m_fields->isPlaytesting) { - // m_fields->pauseAfterPlaytest = true; - // return; - // } - - // EditorUITimer::onPause(this); - // TimerEvent(true, this).post(); - - - // } else if (int* progress = ev->getProgress()) { - // log::debug("min: {}", *progress); - - // } else if (ev->isCancelled()) { - // return; - // } - // // validates if event shouldnt run due to condition - - // } }; \ No newline at end of file diff --git a/src/hooks/TimerPauseLayer.hpp b/src/hooks/TimerPauseLayer.hpp index 2fa855f..da80e2c 100644 --- a/src/hooks/TimerPauseLayer.hpp +++ b/src/hooks/TimerPauseLayer.hpp @@ -4,51 +4,6 @@ using namespace geode::prelude; class $modify(TimerPauseLayer, PauseLayer) { - void customSetup();// { - // PauseLayer::customSetup(); - - // // auto spr = CircleButtonSprite::createWithSpriteFrameName("particle_197_001.png"); - // auto spr = CCSprite::create("TimerSettings.png"_spr); - // spr->setScale(.65f); - // CCMenuItemSpriteExtra* TimersettingsBtn = CCMenuItemSpriteExtra::create(spr, this, menu_selector(TimerPauseLayer::onTimerSettings)); - - // auto settingsMenu = this->getChildByID("right-button-menu"); - - // // adjusts the right menu to properly allow new buttons to be added - // settingsMenu->setLayout( - // ColumnLayout::create() - // ->setGap(5.f) - // ->setGrowCrossAxis(true) - // ->setAxisReverse(true) - // ->setAxisAlignment(AxisAlignment::End) - // ,true); - // // CCMenuItemSpriteExtra* settingsBtn; - - // // for (auto* node : CCArrayExt(settingsMenu->getChildren())) { - // // if (node->getID() == "options-button") { - // // settingsBtn = static_cast(node); - // // break; - // // } - // // } - - // // if (settingsBtn == nullptr) { - // // log::error("Options button could not be found!"); - // // } - - - // // TimersettingsBtn->setPosition(settingsBtn->getPositionX(), settingsBtn->getPositionY() - settingsBtn->getContentWidth() * 1.5f); - // // TimersettingsBtn->setContentSize(settingsBtn->getScaledContentSize()); - // settingsMenu->addChild(TimersettingsBtn); - // TimersettingsBtn->setID("timer-settings-btn"_spr); - - // settingsMenu->updateLayout(); - // } - + void customSetup(); void onTimerSettings(CCObject* sender); - // { - // log::debug("Settings menu was pressed"); - // auto layer = TimerSettingsLayer::create(this); - // layer->m_scene = this; - // layer->show(); - // } }; \ No newline at end of file diff --git a/src/hooks/TimerPlayLayer.hpp b/src/hooks/TimerPlayLayer.hpp index c7b7397..1ac3661 100644 --- a/src/hooks/TimerPlayLayer.hpp +++ b/src/hooks/TimerPlayLayer.hpp @@ -9,9 +9,9 @@ using namespace geode::prelude; class $modify(TimerPlayLayer, PlayLayer) { struct Fields { - // std::chrono::time_point starttime; std::chrono::time_point endtime; bool useTimer; + // resets the timer on call; void resetTimer() { endtime = std::chrono::system_clock::now() + std::chrono::minutes{Mod::get()->getSettingValue("interval")}; // TODO: Replace with setting From 6b0364b3fd6abeb734d7a0786adb9a6d2564da50 Mon Sep 17 00:00:00 2001 From: hbg1010 Date: Mon, 25 Nov 2024 16:39:44 -0500 Subject: [PATCH 16/53] moved non hooked functions to the top of files --- src/hooks/EditorTimerPause.cpp | 20 +++++---- src/hooks/EditorUITimer.cpp | 79 ++++++++++++++++++---------------- src/hooks/TimerPauseLayer.cpp | 54 ++++++++++++----------- 3 files changed, 82 insertions(+), 71 deletions(-) diff --git a/src/hooks/EditorTimerPause.cpp b/src/hooks/EditorTimerPause.cpp index 6242c9b..899381c 100644 --- a/src/hooks/EditorTimerPause.cpp +++ b/src/hooks/EditorTimerPause.cpp @@ -1,5 +1,17 @@ #include "EditorTimerPause.hpp" + +void EditorTimerPause::onTimerSettings(CCObject* sender) { + log::debug("Settings menu was pressed"); + auto layer = TimerSettingsLayer::create(this); + layer->m_scene = this; + layer->setTouchPriority(this->getTouchPriority() -1); + layer->show(); +} + +/* hooks +========== */ + bool EditorTimerPause::init(LevelEditorLayer* lvl) { if (!EditorPauseLayer::init(lvl)) return false; @@ -34,12 +46,4 @@ void EditorTimerPause::onResume(CCObject* sender) { x->resetTimer(); -} - -void EditorTimerPause::onTimerSettings(CCObject* sender) { - log::debug("Settings menu was pressed"); - auto layer = TimerSettingsLayer::create(this); - layer->m_scene = this; - layer->setTouchPriority(this->getTouchPriority() -1); - layer->show(); } \ No newline at end of file diff --git a/src/hooks/EditorUITimer.cpp b/src/hooks/EditorUITimer.cpp index b65ef2f..e2fa142 100644 --- a/src/hooks/EditorUITimer.cpp +++ b/src/hooks/EditorUITimer.cpp @@ -1,5 +1,46 @@ #include "EditorUITimer.hpp" + +// resets the timer on call! +void EditorUITimer::resetTimer() { + if (m_fields->reset(this)) { + log::debug("timer was reset!"); + } +} + +// cancels the timer before reseting +void EditorUITimer::forceReset() { + m_fields->timer.getFilter().shallowCancel(); + + resetTimer(); +} + +// this event happens when binded with the event listener. it will throw a new event when the timer task attatched is called. + void EditorUITimer::onEvent(EditorTimerTask::Event* ev) { + + if (bool* result = ev->getValue()) { + if (m_fields->isPlaytesting) { + m_fields->pauseAfterPlaytest = true; + return; + } + + EditorUITimer::onPause(this); + TimerEvent(true, this).post(); + + + } else if (int* progress = ev->getProgress()) { + log::debug("min: {}", *progress); + + } else if (ev->isCancelled()) { + return; + } + // validates if event shouldnt run due to condition + + } + +/* hooks +========== */ + bool EditorUITimer::init(LevelEditorLayer* editorLayer) { if (!EditorUI::init(editorLayer)) return false; @@ -39,41 +80,3 @@ void EditorUITimer::onPause(CCObject* sender) { m_fields->pauseAfterPlaytest = false; } } - -// resets the timer on call! -void EditorUITimer::resetTimer() { - if (m_fields->reset(this)) { - log::debug("timer was reset!"); - } -} - -// cancels the timer before reseting -void EditorUITimer::forceReset() { - m_fields->timer.getFilter().shallowCancel(); - - resetTimer(); -} - -// this event happens when binded with the event listener. it will throw a new event when the timer task attatched is called. - void EditorUITimer::onEvent(EditorTimerTask::Event* ev) { - - if (bool* result = ev->getValue()) { - if (m_fields->isPlaytesting) { - m_fields->pauseAfterPlaytest = true; - return; - } - - EditorUITimer::onPause(this); - TimerEvent(true, this).post(); - - - } else if (int* progress = ev->getProgress()) { - log::debug("min: {}", *progress); - - } else if (ev->isCancelled()) { - return; - } - // validates if event shouldnt run due to condition - - } - diff --git a/src/hooks/TimerPauseLayer.cpp b/src/hooks/TimerPauseLayer.cpp index 8581a6b..8528212 100644 --- a/src/hooks/TimerPauseLayer.cpp +++ b/src/hooks/TimerPauseLayer.cpp @@ -1,33 +1,37 @@ #include "TimerPauseLayer.hpp" - void TimerPauseLayer::customSetup() { - PauseLayer::customSetup(); - - // auto spr = CircleButtonSprite::createWithSpriteFrameName("particle_197_001.png"); - auto spr = CCSprite::create("TimerSettings.png"_spr); - spr->setScale(.65f); - CCMenuItemSpriteExtra* TimersettingsBtn = CCMenuItemSpriteExtra::create(spr, this, menu_selector(TimerPauseLayer::onTimerSettings)); - - auto settingsMenu = this->getChildByID("right-button-menu"); - - // adjusts the right menu to properly allow new buttons to be added - settingsMenu->setLayout( - ColumnLayout::create() - ->setGap(5.f) - ->setGrowCrossAxis(true) - ->setAxisReverse(true) - ->setAxisAlignment(AxisAlignment::End) - ,true); - - settingsMenu->addChild(TimersettingsBtn); - TimersettingsBtn->setID("timer-settings-btn"_spr); - - settingsMenu->updateLayout(); - } void TimerPauseLayer::onTimerSettings(CCObject* sender) { log::debug("Settings menu was pressed"); auto layer = TimerSettingsLayer::create(this); layer->m_scene = this; layer->show(); - } \ No newline at end of file + } + +/* hooks +========== */ + +void TimerPauseLayer::customSetup() { + PauseLayer::customSetup(); + + // auto spr = CircleButtonSprite::createWithSpriteFrameName("particle_197_001.png"); + auto spr = CCSprite::create("TimerSettings.png"_spr); + spr->setScale(.65f); + CCMenuItemSpriteExtra* TimersettingsBtn = CCMenuItemSpriteExtra::create(spr, this, menu_selector(TimerPauseLayer::onTimerSettings)); + + auto settingsMenu = this->getChildByID("right-button-menu"); + + // adjusts the right menu to properly allow new buttons to be added + settingsMenu->setLayout( + ColumnLayout::create() + ->setGap(5.f) + ->setGrowCrossAxis(true) + ->setAxisReverse(true) + ->setAxisAlignment(AxisAlignment::End) + ,true); + + settingsMenu->addChild(TimersettingsBtn); + TimersettingsBtn->setID("timer-settings-btn"_spr); + + settingsMenu->updateLayout(); +} \ No newline at end of file From cc080a86f06d9b8cba8abe03d130e1de2ac9ee12 Mon Sep 17 00:00:00 2001 From: hbg1010 Date: Mon, 25 Nov 2024 18:11:31 -0500 Subject: [PATCH 17/53] class to create and control settings button --- src/hooks/EditorTimerPause.cpp | 22 +++++++++-------- src/hooks/EditorTimerPause.hpp | 3 ++- src/timer/Layers/TimerSettingsButton.cpp | 30 ++++++++++++++++++++++++ src/timer/Layers/TimerSettingsButton.hpp | 11 +++++++++ 4 files changed, 55 insertions(+), 11 deletions(-) create mode 100644 src/timer/Layers/TimerSettingsButton.cpp create mode 100644 src/timer/Layers/TimerSettingsButton.hpp diff --git a/src/hooks/EditorTimerPause.cpp b/src/hooks/EditorTimerPause.cpp index 899381c..1adafcc 100644 --- a/src/hooks/EditorTimerPause.cpp +++ b/src/hooks/EditorTimerPause.cpp @@ -1,13 +1,13 @@ #include "EditorTimerPause.hpp" -void EditorTimerPause::onTimerSettings(CCObject* sender) { - log::debug("Settings menu was pressed"); - auto layer = TimerSettingsLayer::create(this); - layer->m_scene = this; - layer->setTouchPriority(this->getTouchPriority() -1); - layer->show(); -} +// void EditorTimerPause::onTimerSettings(CCObject* sender) { +// log::debug("Settings menu was pressed"); +// auto layer = TimerSettingsLayer::create(this); +// layer->m_scene = this; +// layer->setTouchPriority(this->getTouchPriority() -1); +// layer->show(); +// } /* hooks ========== */ @@ -17,9 +17,11 @@ bool EditorTimerPause::init(LevelEditorLayer* lvl) { if (!EditorPauseLayer::init(lvl)) return false; // auto spr = CircleButtonSprite::createWithSpriteFrameName("particle_197_001.png"); - auto spr = CCSprite::create("TimerSettings.png"_spr); - spr->setScale(.65f); - CCMenuItemSpriteExtra* timersettingsBtn = CCMenuItemSpriteExtra::create(spr, this, menu_selector(EditorTimerPause::onTimerSettings)); + // auto spr = CCSprite::create("TimerSettings.png"_spr); + // spr->setScale(.65f); + // CCMenuItemSpriteExtra* timersettingsBtn = CCMenuItemSpriteExtra::create(spr, this, menu_selector(EditorTimerPause::onTimerSettings)); + + CCMenuItemSpriteExtra* timersettingsBtn = TimerSettingsButton::create(this); auto settingsMenu = this->getChildByID("settings-menu"); settingsMenu->setContentHeight(this->getContentHeight()*2); diff --git a/src/hooks/EditorTimerPause.hpp b/src/hooks/EditorTimerPause.hpp index 4c583d0..abf9f10 100644 --- a/src/hooks/EditorTimerPause.hpp +++ b/src/hooks/EditorTimerPause.hpp @@ -2,6 +2,7 @@ #include #include "../timer/Layers/TimerSettingsLayer.hpp" +#include "../timer/Layers/TimerSettingsButton.hpp" #include "EditorUITimer.hpp" using namespace geode::prelude; @@ -9,5 +10,5 @@ using namespace geode::prelude; class $modify(EditorTimerPause, EditorPauseLayer) { bool init(LevelEditorLayer* lvl); void onResume(CCObject* sender); - void onTimerSettings(CCObject* sender); + // void onTimerSettings(CCObject* sender); }; \ No newline at end of file diff --git a/src/timer/Layers/TimerSettingsButton.cpp b/src/timer/Layers/TimerSettingsButton.cpp new file mode 100644 index 0000000..6155608 --- /dev/null +++ b/src/timer/Layers/TimerSettingsButton.cpp @@ -0,0 +1,30 @@ +#include "TimerSettingsButton.hpp" + +static CCNode* PARENT; + +CCMenuItemSpriteExtra* TimerSettingsButton::create(CCNode* target) { + + PARENT = target; + auto spr = CCSprite::create("TimerSettings.png"_spr); + spr->setScale(.65f); + CCMenuItemSpriteExtra* TimersettingsBtn = CCMenuItemSpriteExtra::create(spr, target, menu_selector(TimerSettingsButton::onTimerSettings)); + + return TimersettingsBtn; +} + +// this is the buttons callback +void TimerSettingsButton::onTimerSettings(CCObject* sender) { + log::debug("Settings menu was pressed"); + auto layer = TimerSettingsLayer::create(PARENT); + layer->m_scene = PARENT; + + if (PARENT->getID() == "EditorPauseLayer") { + log::debug("a"); + layer->setTouchPriority(static_cast(PARENT)->getTouchPriority() - 1); + } + + // stops opening effect if fast menu is used + layer->m_noElasticity = CCDirector::get()->getFastMenu(); + + layer->show(); +} \ No newline at end of file diff --git a/src/timer/Layers/TimerSettingsButton.hpp b/src/timer/Layers/TimerSettingsButton.hpp new file mode 100644 index 0000000..f11e5e6 --- /dev/null +++ b/src/timer/Layers/TimerSettingsButton.hpp @@ -0,0 +1,11 @@ +#pragma once +#include "TimerSettingsLayer.hpp" +using namespace geode::prelude; + + + +class TimerSettingsButton final { +public: + static CCMenuItemSpriteExtra* create(CCNode* target); + void onTimerSettings(CCObject* sender); +}; \ No newline at end of file From 7afbce8ca95bb12a624a7162f0c8735fcd457176 Mon Sep 17 00:00:00 2001 From: hbg1010 Date: Mon, 25 Nov 2024 18:13:01 -0500 Subject: [PATCH 18/53] fast menu checks --- src/main.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 5dc9f68..4e02b02 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -21,6 +21,7 @@ using namespace geode::prelude; // creates popup before the timer auto x = geode::createQuickPopup("Timer", timerAlert, "Start", "Skip", [ev](auto, bool btn2) { + // yeah I hate that not, but the constructor doesnt allow me to flip the things otherwise! if (!btn2) { // adds a new node to the layer parent @@ -33,11 +34,15 @@ using namespace geode::prelude; while(parent->getParent() != nullptr) { parent = parent->getParent(); } - + timePopUp->m_noElasticity = CCDirector::get()->getFastMenu(); parent->addChild(timePopUp, 20); timePopUp->setID("Timer-pop-up"_spr); } - }, true); + }, false); + + // displays x + x->m_noElasticity = CCDirector::get()->getFastMenu(); + x->show(); // if in editor, this will set the touch priority above the EditorPauseLayer // very open to knowing a better way to do this! ! ! Unlike the editorUI though, theres no get function :( From be8cf8e81a4e2ae8c09962b424dc85cdd1afd64a Mon Sep 17 00:00:00 2001 From: hbg1010 Date: Mon, 25 Nov 2024 18:13:50 -0500 Subject: [PATCH 19/53] fixed playtesting in editor --- src/hooks/EditorUITimer.cpp | 9 +++++++++ src/hooks/EditorUITimer.hpp | 10 +++++++--- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/src/hooks/EditorUITimer.cpp b/src/hooks/EditorUITimer.cpp index e2fa142..4b498cf 100644 --- a/src/hooks/EditorUITimer.cpp +++ b/src/hooks/EditorUITimer.cpp @@ -71,6 +71,15 @@ void EditorUITimer::playtestStopped() { m_fields->isPlaytesting = false; } +void EditorUITimer::onStopPlaytest(CCObject* sender) { + if (m_fields->pauseAfterPlaytest) { + EditorUITimer::onPause(sender); + + } else { + EditorUI::onStopPlaytest(sender); + } +} + void EditorUITimer::onPause(CCObject* sender) { EditorUI::onPause(sender); diff --git a/src/hooks/EditorUITimer.hpp b/src/hooks/EditorUITimer.hpp index a9a8768..1220ddb 100644 --- a/src/hooks/EditorUITimer.hpp +++ b/src/hooks/EditorUITimer.hpp @@ -27,11 +27,15 @@ class $modify(EditorUITimer, EditorUI) { } }; + // EditorUITimer + void resetTimer(); + void forceReset(); + void onEvent(EditorTimerTask::Event* ev); + + //hooked fns bool init(LevelEditorLayer* editorLayer); void onPlaytest(CCObject* sender); void playtestStopped(); + void onStopPlaytest(CCObject* sender); void onPause(CCObject* sender); - void resetTimer(); - void forceReset(); - void onEvent(EditorTimerTask::Event* ev); }; \ No newline at end of file From 4e382b6db4c84d995b5c57ed11ff32ec198256dc Mon Sep 17 00:00:00 2001 From: hbg1010 Date: Mon, 25 Nov 2024 18:14:22 -0500 Subject: [PATCH 20/53] Uses TimerSettingsButton --- src/hooks/TimerPauseLayer.cpp | 20 +++++++++++--------- src/hooks/TimerPauseLayer.hpp | 2 ++ 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/src/hooks/TimerPauseLayer.cpp b/src/hooks/TimerPauseLayer.cpp index 8528212..f159386 100644 --- a/src/hooks/TimerPauseLayer.cpp +++ b/src/hooks/TimerPauseLayer.cpp @@ -1,12 +1,12 @@ #include "TimerPauseLayer.hpp" - void TimerPauseLayer::onTimerSettings(CCObject* sender) { - log::debug("Settings menu was pressed"); - auto layer = TimerSettingsLayer::create(this); - layer->m_scene = this; - layer->show(); - } + // void TimerPauseLayer::onTimerSettings(CCObject* sender) { + // log::debug("Settings menu was pressed"); + // auto layer = TimerSettingsLayer::create(this); + // layer->m_scene = this; + // layer->show(); + // } /* hooks ========== */ @@ -15,9 +15,11 @@ void TimerPauseLayer::customSetup() { PauseLayer::customSetup(); // auto spr = CircleButtonSprite::createWithSpriteFrameName("particle_197_001.png"); - auto spr = CCSprite::create("TimerSettings.png"_spr); - spr->setScale(.65f); - CCMenuItemSpriteExtra* TimersettingsBtn = CCMenuItemSpriteExtra::create(spr, this, menu_selector(TimerPauseLayer::onTimerSettings)); + // auto spr = CCSprite::create("TimerSettings.png"_spr); + // spr->setScale(.65f); + // CCMenuItemSpriteExtra* TimersettingsBtn = CCMenuItemSpriteExtra::create(spr, this, menu_selector(TimerPauseLayer::onTimerSettings)); + + CCMenuItemSpriteExtra* TimersettingsBtn = TimerSettingsButton::create(this); auto settingsMenu = this->getChildByID("right-button-menu"); diff --git a/src/hooks/TimerPauseLayer.hpp b/src/hooks/TimerPauseLayer.hpp index da80e2c..7a10faf 100644 --- a/src/hooks/TimerPauseLayer.hpp +++ b/src/hooks/TimerPauseLayer.hpp @@ -1,4 +1,6 @@ #include "../timer/Layers/TimerSettingsLayer.hpp" +#include "../timer/Layers/TimerSettingsButton.hpp" +#include "../timer/Layers/TimerSettingsButton.hpp" #include using namespace geode::prelude; From f4588f93ab802404b9c0bed223c31b3ea023260b Mon Sep 17 00:00:00 2001 From: hbg1010 Date: Tue, 26 Nov 2024 14:29:37 -0500 Subject: [PATCH 21/53] fixed editor AGAIN --- src/hooks/EditorUITimer.cpp | 41 +++++++++++++++++++++++++++++-------- 1 file changed, 33 insertions(+), 8 deletions(-) diff --git a/src/hooks/EditorUITimer.cpp b/src/hooks/EditorUITimer.cpp index 4b498cf..35356a1 100644 --- a/src/hooks/EditorUITimer.cpp +++ b/src/hooks/EditorUITimer.cpp @@ -38,6 +38,17 @@ void EditorUITimer::forceReset() { } + bool EditorUITimer::checkEndPlaytest() { + if (m_fields->pauseAfterPlaytest) { + m_fields->pauseAfterPlaytest = false; + EditorUI::onPause(this); + TimerEvent(true, this).post(); + return true; + } else { + return false; + } + } + /* hooks ========== */ @@ -72,20 +83,34 @@ void EditorUITimer::playtestStopped() { } void EditorUITimer::onStopPlaytest(CCObject* sender) { - if (m_fields->pauseAfterPlaytest) { - EditorUITimer::onPause(sender); - - } else { + // if that function doesnt run, normal behavior occurs + if (!checkEndPlaytest()) { EditorUI::onStopPlaytest(sender); } } void EditorUITimer::onPause(CCObject* sender) { - EditorUI::onPause(sender); + if (!checkEndPlaytest()) { + EditorUI::onPause(sender); + } +} + +void EditorUITimer::showUI(bool p0){ + EditorUI::showUI(p0); + + log::debug("x"); + + if (checkEndPlaytest() && m_fields->isPlaytesting){ + CCMenuItemSpriteExtra* stopButton = static_cast(this->getChildByID("playtest-menu")->getChildByID("stop-playtest-button")); + + if (stopButton != nullptr) { + stopButton->setVisible(false); + stopButton->setEnabled(false); + } - if (m_fields->pauseAfterPlaytest) { - TimerEvent(true, this).post(); - m_fields->pauseAfterPlaytest = false; + // if (stopButton->getChildByID("stop-playtest-button") != nullptr) { + // stopButton->removeChildByID("stop-playtest-button"); + // } } } From a17064238504926639097a98941dfd511f903262 Mon Sep 17 00:00:00 2001 From: hbg1010 Date: Tue, 26 Nov 2024 14:29:49 -0500 Subject: [PATCH 22/53] added pragma once to fix linker --- src/hooks/EditorUITimer.hpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/hooks/EditorUITimer.hpp b/src/hooks/EditorUITimer.hpp index 1220ddb..8dca105 100644 --- a/src/hooks/EditorUITimer.hpp +++ b/src/hooks/EditorUITimer.hpp @@ -1,3 +1,5 @@ +#pragma once + /** * Modified editor UI * @@ -31,6 +33,7 @@ class $modify(EditorUITimer, EditorUI) { void resetTimer(); void forceReset(); void onEvent(EditorTimerTask::Event* ev); + bool checkEndPlaytest(); //hooked fns bool init(LevelEditorLayer* editorLayer); @@ -38,4 +41,5 @@ class $modify(EditorUITimer, EditorUI) { void playtestStopped(); void onStopPlaytest(CCObject* sender); void onPause(CCObject* sender); + void showUI(bool p0); }; \ No newline at end of file From 9284359924f838a685043e69f06275b5b7c4c43e Mon Sep 17 00:00:00 2001 From: hbg1010 Date: Tue, 26 Nov 2024 14:31:07 -0500 Subject: [PATCH 23/53] implemented timer reset button --- src/timer/Layers/TimerSettingsLayer.cpp | 18 +++++++++++------- src/timer/Layers/TimerSettingsLayer.hpp | 4 ++++ 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/src/timer/Layers/TimerSettingsLayer.cpp b/src/timer/Layers/TimerSettingsLayer.cpp index fdbbced..a3cef09 100644 --- a/src/timer/Layers/TimerSettingsLayer.cpp +++ b/src/timer/Layers/TimerSettingsLayer.cpp @@ -35,7 +35,7 @@ bool TimerSettingsLayer::setup(CCNode* const& menuID) { // reset button auto resetSpr = cocos2d::CCSprite::createWithSpriteFrameName("GJ_updateBtn_001.png");//"GJ_updateBtn_001.png" - CCMenuItemSpriteExtra* resetButton = CCMenuItemSpriteExtra::create(resetSpr, this, nullptr); //menu_selector(TimerSettingsLayer::resetTimer) + CCMenuItemSpriteExtra* resetButton = CCMenuItemSpriteExtra::create(resetSpr, this, menu_selector(TimerSettingsLayer::resetTimer)); //menu_selector(TimerSettingsLayer::resetTimer) menu->addChild(resetButton); resetButton->setID("reset-button"_spr); @@ -65,12 +65,16 @@ bool TimerSettingsLayer::setup(CCNode* const& menuID) { // this callback occurs when the button is clicked void TimerSettingsLayer::resetTimer(CCObject* sender) { + log::debug("{}", TimerSettingsLayer::m_menuID->getID()); if (TimerSettingsLayer::m_menuID->getID() == "PauseLayer") { - log::debug("todo"); + auto layer = static_cast(TimerPlayLayer::get()); + layer->m_fields->resetTimer(); + } else { - // // reseting here is very easy. - // auto layer = EditorUITimer::get(); - // auto x = static_cast(EditorUITimer::get()); - // x->forceReset(); + //reseting here is very easy. + auto layer = EditorUITimer::get(); + auto x = static_cast(EditorUITimer::get()); + x->forceReset(); } -} \ No newline at end of file +} + diff --git a/src/timer/Layers/TimerSettingsLayer.hpp b/src/timer/Layers/TimerSettingsLayer.hpp index 697c6a7..901178a 100644 --- a/src/timer/Layers/TimerSettingsLayer.hpp +++ b/src/timer/Layers/TimerSettingsLayer.hpp @@ -1,6 +1,10 @@ #pragma once #include +#include "../../hooks/EditorUITimer.hpp" +#include "../../hooks/TimerPlayLayer.hpp" + + using namespace geode::prelude; class TimerSettingsLayer : public Popup { From 4f7924e9f32500c4298704dd180b186e73e94b23 Mon Sep 17 00:00:00 2001 From: hbg1010 Date: Tue, 26 Nov 2024 18:25:36 -0500 Subject: [PATCH 24/53] reset functions now track time --- src/hooks/EditorUITimer.cpp | 27 ++++++++++++++++++--------- src/hooks/EditorUITimer.hpp | 14 ++++++++++---- 2 files changed, 28 insertions(+), 13 deletions(-) diff --git a/src/hooks/EditorUITimer.cpp b/src/hooks/EditorUITimer.cpp index 35356a1..478e236 100644 --- a/src/hooks/EditorUITimer.cpp +++ b/src/hooks/EditorUITimer.cpp @@ -2,8 +2,8 @@ // resets the timer on call! -void EditorUITimer::resetTimer() { - if (m_fields->reset(this)) { +void EditorUITimer::resetTimer(int time) { + if (m_fields->reset(this, time)) { log::debug("timer was reset!"); } } @@ -27,9 +27,15 @@ void EditorUITimer::forceReset() { EditorUITimer::onPause(this); TimerEvent(true, this).post(); - } else if (int* progress = ev->getProgress()) { - log::debug("min: {}", *progress); + + // if this is paused, this will recieve progress when cancelled + if (m_fields->paused) { + m_fields->remainingTime = *progress; + + } else { + log::debug("min: {}", *progress); + } } else if (ev->isCancelled()) { return; @@ -44,11 +50,16 @@ void EditorUITimer::forceReset() { EditorUI::onPause(this); TimerEvent(true, this).post(); return true; + } else { return false; } } + void onUnpause() { + + } + /* hooks ========== */ @@ -57,11 +68,11 @@ bool EditorUITimer::init(LevelEditorLayer* editorLayer) { m_fields->pauseAfterPlaytest = false; m_fields->isPlaytesting = false; - m_fields->isPlaytesting = false; - + m_fields->paused = false; + if (Mod::get()->getSettingValue("editorLayer")) { m_fields->timer.bind(this, &EditorUITimer::onEvent); - m_fields->timer.setFilter(startEditorTimer()); + m_fields->timer.setFilter(startEditorTimer(Mod::get()->getSettingValue("interval") * 6)); } return true; @@ -98,8 +109,6 @@ void EditorUITimer::onPause(CCObject* sender) { void EditorUITimer::showUI(bool p0){ EditorUI::showUI(p0); - log::debug("x"); - if (checkEndPlaytest() && m_fields->isPlaytesting){ CCMenuItemSpriteExtra* stopButton = static_cast(this->getChildByID("playtest-menu")->getChildByID("stop-playtest-button")); diff --git a/src/hooks/EditorUITimer.hpp b/src/hooks/EditorUITimer.hpp index 8dca105..4a3ec65 100644 --- a/src/hooks/EditorUITimer.hpp +++ b/src/hooks/EditorUITimer.hpp @@ -15,13 +15,18 @@ class $modify(EditorUITimer, EditorUI) { struct Fields { bool isPlaytesting; bool pauseAfterPlaytest; + bool paused; + int remainingTime; // this is for keeping the time left after pause + + bool isEditorPaused; //TODO: IMPL + EventListener timer; // resets timer when it is finished - bool reset(EditorUITimer* sender) { + bool reset(EditorUITimer* sender, int time) { if (this->timer.getFilter().isFinished()) { this->timer.bind(sender, &EditorUITimer::onEvent); - this->timer.setFilter(startEditorTimer()); + this->timer.setFilter(startEditorTimer(time)); //TODO ADD 0!! return true; } @@ -30,11 +35,12 @@ class $modify(EditorUITimer, EditorUI) { }; // EditorUITimer - void resetTimer(); + void resetTimer(int time = Mod::get()->getSettingValue("interval") * 6); void forceReset(); void onEvent(EditorTimerTask::Event* ev); bool checkEndPlaytest(); - + void onUnpause(); + //hooked fns bool init(LevelEditorLayer* editorLayer); void onPlaytest(CCObject* sender); From 7919139122c9804fc190257d631b8e0ed8ab4216 Mon Sep 17 00:00:00 2001 From: hbg1010 Date: Tue, 26 Nov 2024 18:26:15 -0500 Subject: [PATCH 25/53] UNFINISHED pausing support --- src/hooks/TimerPlayLayer.cpp | 21 +++++++++++---------- src/hooks/TimerPlayLayer.hpp | 1 + 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/src/hooks/TimerPlayLayer.cpp b/src/hooks/TimerPlayLayer.cpp index 9b67f45..702aab1 100644 --- a/src/hooks/TimerPlayLayer.cpp +++ b/src/hooks/TimerPlayLayer.cpp @@ -5,26 +5,27 @@ bool TimerPlayLayer::init(GJGameLevel* p0, bool p1, bool p2){ if (!PlayLayer::init(p0,p1,p2)) return false; - // NodeIDs::provideFor(this); - m_fields->useTimer = Mod::get()->getSettingValue("playLayer"); - - if (m_fields->useTimer) { - auto tp1 = std::chrono::system_clock::now(); + m_fields->useTimer = Mod::get()->getSettingValue("playLayer"); + m_fields->paused = false; + + if (m_fields->useTimer) { + auto tp1 = std::chrono::system_clock::now(); - // m_fields->starttime = std::chrono::system_clock::now(); - m_fields->resetTimer(); + // m_fields->starttime = std::chrono::system_clock::now(); + m_fields->resetTimer(); + // std::time_t time = std::chrono::system_clock::to_time_t(m_fields->endtime); + // log::debug("TIme is {}", std::ctime(&time)); } - // std::time_t time = std::chrono::system_clock::to_time_t(m_fields->endtime); - // log::debug("TIme is {}", std::ctime(&time)); + return true; } void TimerPlayLayer::resetLevel() { PlayLayer::resetLevel(); - if (!m_fields->useTimer) return; + if (!m_fields->useTimer || !m_fields->paused) return; // condition. checks if current time > start time + 20min auto difference = m_fields->endtime - std::chrono::system_clock::now(); diff --git a/src/hooks/TimerPlayLayer.hpp b/src/hooks/TimerPlayLayer.hpp index 1ac3661..d5090ce 100644 --- a/src/hooks/TimerPlayLayer.hpp +++ b/src/hooks/TimerPlayLayer.hpp @@ -11,6 +11,7 @@ class $modify(TimerPlayLayer, PlayLayer) { struct Fields { std::chrono::time_point endtime; bool useTimer; + bool paused; // resets the timer on call; void resetTimer() { From c5973c06223e888760bf2c395c8739ebd97aae83 Mon Sep 17 00:00:00 2001 From: hbg1010 Date: Tue, 26 Nov 2024 18:26:46 -0500 Subject: [PATCH 26/53] time as arg --- src/timer/EditorTimer.cpp | 7 ++++--- src/timer/EditorTimer.hpp | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/timer/EditorTimer.cpp b/src/timer/EditorTimer.cpp index 44e408b..7ba6de5 100644 --- a/src/timer/EditorTimer.cpp +++ b/src/timer/EditorTimer.cpp @@ -1,14 +1,15 @@ #include "EditorTimer.hpp" //This is set up to check for each second, as an early canel would mean this event could just continue existing in memory -EditorTimerTask startEditorTimer() { - return EditorTimerTask::run([](auto progress, auto hasBeenCancelled) -> EditorTimerTask::Result { +EditorTimerTask startEditorTimer(int time) { + return EditorTimerTask::run([time](auto progress, auto hasBeenCancelled) -> EditorTimerTask::Result { log::debug("Starting editor timer!"); - int time = Mod::get()->getSettingValue("interval") *60; // gets the amount of seconds + // int time = Mod::get()->getSettingValue("interval") *6; // gets the amount of seconds // sleeps every second, as this needs to check if the event has been cancelled to not cause any problems! for (int i = 0; i < time; i++) { if (hasBeenCancelled()) { + progress(time - i); // returns the seconds val before announcing cancel, so it can be stored if timer is paused return EditorTimerTask::Cancel(); } else if (i % 60 == 0) { diff --git a/src/timer/EditorTimer.hpp b/src/timer/EditorTimer.hpp index 8d4facb..33ec86f 100644 --- a/src/timer/EditorTimer.hpp +++ b/src/timer/EditorTimer.hpp @@ -3,4 +3,4 @@ using namespace geode::prelude; using EditorTimerTask = Task; -EditorTimerTask startEditorTimer(); \ No newline at end of file +EditorTimerTask startEditorTimer(int time); \ No newline at end of file From 3c2fec1baa1dc4dc0b97b67ec6e5123885ac29f1 Mon Sep 17 00:00:00 2001 From: hbg1010 Date: Tue, 26 Nov 2024 18:27:15 -0500 Subject: [PATCH 27/53] Added settings button. began pausing --- src/timer/Layers/TimerSettingsLayer.cpp | 24 +++++++++++++++++++++++- src/timer/Layers/TimerSettingsLayer.hpp | 5 +++-- 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/src/timer/Layers/TimerSettingsLayer.cpp b/src/timer/Layers/TimerSettingsLayer.cpp index a3cef09..b3cfd42 100644 --- a/src/timer/Layers/TimerSettingsLayer.cpp +++ b/src/timer/Layers/TimerSettingsLayer.cpp @@ -54,7 +54,7 @@ bool TimerSettingsLayer::setup(CCNode* const& menuID) { // settings button auto settingsSpr = cocos2d::CCSprite::createWithSpriteFrameName("GJ_optionsBtn_001.png");//"GJ_optionsBtn_001.png" - CCMenuItemSpriteExtra* settingsButton = CCMenuItemSpriteExtra::create(settingsSpr, this, nullptr); + CCMenuItemSpriteExtra* settingsButton = CCMenuItemSpriteExtra::create(settingsSpr, this, menu_selector(TimerSettingsLayer::changeSettings)); menu->addChild(settingsButton); settingsButton->setID("settings-button"_spr); @@ -78,3 +78,25 @@ void TimerSettingsLayer::resetTimer(CCObject* sender) { } } +void TimerSettingsLayer::pauseTime(CCObject* sender) { + log::debug("paused"); +} + +// opens geode settings page +void TimerSettingsLayer::changeSettings(CCObject* sender) { + geode::openSettingsPopup(Mod::get()); + + /* + TODO: + */ +} + +$execute { + new EventListener>(+[](ModLogoUIEvent* event) { + if (event->getModID() == "hbg1010.20_20_20") { + log::debug("hbg"); + } + // You should always propagate Geode UI events + return ListenerResult::Propagate; + }); +} diff --git a/src/timer/Layers/TimerSettingsLayer.hpp b/src/timer/Layers/TimerSettingsLayer.hpp index 901178a..8133204 100644 --- a/src/timer/Layers/TimerSettingsLayer.hpp +++ b/src/timer/Layers/TimerSettingsLayer.hpp @@ -1,10 +1,10 @@ #pragma once #include +#include #include "../../hooks/EditorUITimer.hpp" #include "../../hooks/TimerPlayLayer.hpp" - using namespace geode::prelude; class TimerSettingsLayer : public Popup { @@ -13,8 +13,9 @@ class TimerSettingsLayer : public Popup { protected: CCNode* m_menuID; + bool paused; bool setup(CCNode* const& menuID); void resetTimer(CCObject* sender); void changeSettings(CCObject* sender); - void addTime(CCObject* sender); + void pauseTime(CCObject* sender); }; \ No newline at end of file From 9e97984c74793715493f4b61a8dd823890528d45 Mon Sep 17 00:00:00 2001 From: hbg1010 Date: Tue, 26 Nov 2024 18:27:35 -0500 Subject: [PATCH 28/53] Added utils for testing --- src/utils/devMode.cpp | 0 src/utils/devMode.hpp | 18 ++++++++++++++++++ 2 files changed, 18 insertions(+) create mode 100644 src/utils/devMode.cpp create mode 100644 src/utils/devMode.hpp diff --git a/src/utils/devMode.cpp b/src/utils/devMode.cpp new file mode 100644 index 0000000..e69de29 diff --git a/src/utils/devMode.hpp b/src/utils/devMode.hpp new file mode 100644 index 0000000..e377609 --- /dev/null +++ b/src/utils/devMode.hpp @@ -0,0 +1,18 @@ +#pragma once + +static class devMode +{ +private: + bool isEnabled; +public: + devMode(bool enabled); + ~devMode(); +}; + +devMode::devMode(bool enabled) { + isEnabled = enabled; +} + +devMode::~devMode() +{ +} From 0b82d746848b35acce4ee669410ca3a2089665b9 Mon Sep 17 00:00:00 2001 From: hbg1010 Date: Mon, 2 Dec 2024 09:40:57 -0500 Subject: [PATCH 29/53] Added pause functionaility to play layer --- src/hooks/TimerPlayLayer.cpp | 13 +++++++++++++ src/hooks/TimerPlayLayer.hpp | 2 ++ src/timer/Layers/TimerSettingsLayer.cpp | 12 ++++++++++++ src/timer/Layers/TimerSettingsLayer.hpp | 2 ++ 4 files changed, 29 insertions(+) diff --git a/src/hooks/TimerPlayLayer.cpp b/src/hooks/TimerPlayLayer.cpp index 702aab1..24bcb11 100644 --- a/src/hooks/TimerPlayLayer.cpp +++ b/src/hooks/TimerPlayLayer.cpp @@ -1,5 +1,18 @@ #include "TimerPlayLayer.hpp" +// changes the bool to true / false +void TimerPlayLayer::pauseTimer(bool pauseState) { + log::debug("paused"); + + m_fields->paused = pauseState; + + if (m_fields->paused) { + m_fields->difference = m_fields->endtime - std::chrono::system_clock::now(); + } else { + m_fields->endtime = std::chrono::system_clock::now() + m_fields->difference; + } +} + /* hooks ========== */ diff --git a/src/hooks/TimerPlayLayer.hpp b/src/hooks/TimerPlayLayer.hpp index d5090ce..6304424 100644 --- a/src/hooks/TimerPlayLayer.hpp +++ b/src/hooks/TimerPlayLayer.hpp @@ -12,6 +12,7 @@ class $modify(TimerPlayLayer, PlayLayer) { std::chrono::time_point endtime; bool useTimer; bool paused; + std::chrono::duration difference; // resets the timer on call; void resetTimer() { @@ -21,4 +22,5 @@ class $modify(TimerPlayLayer, PlayLayer) { bool init(GJGameLevel* p0, bool p1, bool p2); void resetLevel(); + void pauseTimer(bool pauseState); }; \ No newline at end of file diff --git a/src/timer/Layers/TimerSettingsLayer.cpp b/src/timer/Layers/TimerSettingsLayer.cpp index b3cfd42..c31cefc 100644 --- a/src/timer/Layers/TimerSettingsLayer.cpp +++ b/src/timer/Layers/TimerSettingsLayer.cpp @@ -80,6 +80,18 @@ void TimerSettingsLayer::resetTimer(CCObject* sender) { void TimerSettingsLayer::pauseTime(CCObject* sender) { log::debug("paused"); + + // sets it to the opposite val on click + TimerSettingsLayer::paused = !TimerSettingsLayer::paused; + + if (TimerSettingsLayer::m_menuID->getID() == "PauseLayer") { + auto layer = static_cast(TimerPlayLayer::get()); + + layer->pauseTimer(TimerSettingsLayer::paused); + } else { + log::debug("todo"); + } + } // opens geode settings page diff --git a/src/timer/Layers/TimerSettingsLayer.hpp b/src/timer/Layers/TimerSettingsLayer.hpp index 8133204..8e36dea 100644 --- a/src/timer/Layers/TimerSettingsLayer.hpp +++ b/src/timer/Layers/TimerSettingsLayer.hpp @@ -18,4 +18,6 @@ class TimerSettingsLayer : public Popup { void resetTimer(CCObject* sender); void changeSettings(CCObject* sender); void pauseTime(CCObject* sender); + + void updateButtons(); }; \ No newline at end of file From 53bb6a0ee6c8010e2737f4d3621ed0ddb04a3c83 Mon Sep 17 00:00:00 2001 From: hbg1010 Date: Mon, 2 Dec 2024 17:11:32 -0500 Subject: [PATCH 30/53] fixed bug involving pausing --- src/hooks/TimerPlayLayer.cpp | 30 ++++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/src/hooks/TimerPlayLayer.cpp b/src/hooks/TimerPlayLayer.cpp index 24bcb11..edc6b12 100644 --- a/src/hooks/TimerPlayLayer.cpp +++ b/src/hooks/TimerPlayLayer.cpp @@ -18,17 +18,18 @@ void TimerPlayLayer::pauseTimer(bool pauseState) { bool TimerPlayLayer::init(GJGameLevel* p0, bool p1, bool p2){ if (!PlayLayer::init(p0,p1,p2)) return false; - m_fields->useTimer = Mod::get()->getSettingValue("playLayer"); m_fields->paused = false; - - if (m_fields->useTimer) { - auto tp1 = std::chrono::system_clock::now(); + m_fields->useTimer = Mod::get()->getSettingValue("playLayer"); - // m_fields->starttime = std::chrono::system_clock::now(); - m_fields->resetTimer(); - // std::time_t time = std::chrono::system_clock::to_time_t(m_fields->endtime); - // log::debug("TIme is {}", std::ctime(&time)); - } + m_fields->resetTimer(); + + + // if (m_fields->useTimer) { + // // auto tp1 = std::chrono::system_clock::now(); + // // m_fields->starttime = std::chrono::system_clock::now(); + // // std::time_t time = std::chrono::system_clock::to_time_t(m_fields->endtime); + // // log::debug("TIme is {}", std::ctime(&time)); + // } @@ -38,7 +39,16 @@ void TimerPlayLayer::pauseTimer(bool pauseState) { void TimerPlayLayer::resetLevel() { PlayLayer::resetLevel(); - if (!m_fields->useTimer || !m_fields->paused) return; + if (!Mod::get()->getSettingValue("playLayer") || m_fields->paused) { + m_fields->useTimer = false; + return; + } else if (!m_fields->useTimer) { + m_fields->resetTimer(); + m_fields->useTimer = true; + } + + + log::debug("this ran!"); // condition. checks if current time > start time + 20min auto difference = m_fields->endtime - std::chrono::system_clock::now(); From 6da6ac1879f12c295e8b0985d4386a3948fea795 Mon Sep 17 00:00:00 2001 From: hbg1010 Date: Mon, 2 Dec 2024 17:12:04 -0500 Subject: [PATCH 31/53] fixed bugs, began gui changes --- src/timer/Layers/TimerSettingsLayer.cpp | 78 +++++++++++++++++++------ src/timer/Layers/TimerSettingsLayer.hpp | 7 +++ 2 files changed, 68 insertions(+), 17 deletions(-) diff --git a/src/timer/Layers/TimerSettingsLayer.cpp b/src/timer/Layers/TimerSettingsLayer.cpp index c31cefc..2909291 100644 --- a/src/timer/Layers/TimerSettingsLayer.cpp +++ b/src/timer/Layers/TimerSettingsLayer.cpp @@ -15,11 +15,18 @@ TimerSettingsLayer* TimerSettingsLayer::create(CCNode* const& menuID) { } } +// sets up the layer! bool TimerSettingsLayer::setup(CCNode* const& menuID) { TimerSettingsLayer::m_menuID = menuID; CCSize screenSize = CCDirector::sharedDirector()->getWinSize(); log::debug("{}", menuID); + if (TimerSettingsLayer::m_menuID->getID() == "PauseLayer") { + TimerSettingsLayer::paused = static_cast(TimerPlayLayer::get())->m_fields->paused; + } else { + TimerSettingsLayer::paused = static_cast(EditorUITimer::get())->m_fields->paused; + } + this->setTitle("Timer Settings!"); CCMenu* menu = CCMenu::create(); @@ -30,6 +37,8 @@ bool TimerSettingsLayer::setup(CCNode* const& menuID) { ->setAxisAlignment(AxisAlignment::Even) ); + TimerSettingsLayer::menuPointer = menu; // stores pointer + this->addChild(menu); menu->setID("timer-settings-menu"_spr); @@ -40,17 +49,10 @@ bool TimerSettingsLayer::setup(CCNode* const& menuID) { resetButton->setID("reset-button"_spr); // add button - auto addSpr = cocos2d::CCSprite::createWithSpriteFrameName("GJ_plusBtn_001.png");//"GJ_plusBtn_001.png" - CCMenuItemSpriteExtra* addButton = CCMenuItemSpriteExtra::create(addSpr, this, nullptr); - menu->addChild(addButton); - addButton->setID("add-button"_spr); - - //TODO: Find propper nodeIDs - // disables buttons if the current layer is disabled. - if ((!Mod::get()->getSettingValue("playLayer") && menuID->getID() == "PauseLayer") || (!Mod::get()->getSettingValue("editorLayer") && menuID->getID() == "EditorPauseLayer")) { - resetButton->setEnabled(false); - addButton->setEnabled(false); - } + auto pauseSpr = cocos2d::CCSprite::createWithSpriteFrameName("GJ_plusBtn_001.png");//"GJ_plusBtn_001.png" + CCMenuItemSpriteExtra* pauseButton = CCMenuItemSpriteExtra::create(pauseSpr, this, menu_selector(TimerSettingsLayer::pauseTime)); + menu->addChild(pauseButton); + pauseButton->setID("pause-button"_spr); // settings button auto settingsSpr = cocos2d::CCSprite::createWithSpriteFrameName("GJ_optionsBtn_001.png");//"GJ_optionsBtn_001.png" @@ -60,6 +62,8 @@ bool TimerSettingsLayer::setup(CCNode* const& menuID) { // updates the layout menu->updateLayout(); + + updateButtons(); return true; } @@ -80,7 +84,6 @@ void TimerSettingsLayer::resetTimer(CCObject* sender) { void TimerSettingsLayer::pauseTime(CCObject* sender) { log::debug("paused"); - // sets it to the opposite val on click TimerSettingsLayer::paused = !TimerSettingsLayer::paused; @@ -92,19 +95,60 @@ void TimerSettingsLayer::pauseTime(CCObject* sender) { log::debug("todo"); } + updateButtons(); + } // opens geode settings page void TimerSettingsLayer::changeSettings(CCObject* sender) { - geode::openSettingsPopup(Mod::get()); + geode::openSettingsPopup(Mod::get(), false); + auto parent = this->getParent(); + + updateButtons(); + +} + +// this will update the visuals shown by the ui +void TimerSettingsLayer::updateButtons() { + CCMenuItemSpriteExtra* btnPointer = static_cast(TimerSettingsLayer::menuPointer->getChildByID("pause-button"_spr)); + if (btnPointer == nullptr) { + log::error("Button is nullptr"); + } + auto sprite = cocos2d::CCSprite::createWithSpriteFrameName(TimerSettingsLayer::paused ? "GJ_playBtn2_001.png" : "GJ_pauseEditorBtn_001.png"); + btnPointer->setSprite(sprite); + + // checks if the pause and play should be enabled + bool enabled = (Mod::get()->getSettingValue("playLayer") && m_menuID->getID() == "PauseLayer") || (Mod::get()->getSettingValue("editorLayer") && m_menuID->getID() == "EditorPauseLayer"); + + for (CCNode* node : CCArrayExt(menuPointer->getChildren())) { + if (node->getID() != "settings-button"_spr) { + TimerSettingsLayer::disableButton(node, enabled); + } + } +} + +// static function to disable a button on call +void TimerSettingsLayer::disableButton(CCNode* node, bool enable) { + //TODO Find a better spot to put this + const ccColor3B greyScale = {.r = 90, .g = 90, .b = 90}; + const ccColor3B color = {.r = 255, .g = 255, .b = 255}; + + if (auto btn = typeinfo_cast(node)) { + btn->setEnabled(enable); + auto spr = typeinfo_cast(btn->getNormalImage()); + spr->setCascadeColorEnabled(true); + spr->setCascadeOpacityEnabled(true); + spr->setColor(enable ? color : greyScale); + spr->setOpacity(200); + } +} - /* - TODO: - */ +TimerSettingsLayer::~TimerSettingsLayer() { + log::debug("destructed"); } $execute { - new EventListener>(+[](ModLogoUIEvent* event) { + new EventListener>(+[](ModPopupUIEvent* event) { if (event->getModID() == "hbg1010.20_20_20") { log::debug("hbg"); } diff --git a/src/timer/Layers/TimerSettingsLayer.hpp b/src/timer/Layers/TimerSettingsLayer.hpp index 8e36dea..8cd0dfc 100644 --- a/src/timer/Layers/TimerSettingsLayer.hpp +++ b/src/timer/Layers/TimerSettingsLayer.hpp @@ -10,14 +10,21 @@ using namespace geode::prelude; class TimerSettingsLayer : public Popup { public: static TimerSettingsLayer* create(CCNode* const& menuID); + static void disableButton(CCNode* node, bool enable); + + // static TimerSettingsLayer* get(); protected: CCNode* m_menuID; bool paused; + CCMenu* menuPointer; + // bool isDisabled; + bool setup(CCNode* const& menuID); void resetTimer(CCObject* sender); void changeSettings(CCObject* sender); void pauseTime(CCObject* sender); void updateButtons(); + ~TimerSettingsLayer(); }; \ No newline at end of file From 7ac3d6c5344de4d48b2fe0331752352f8e3b6acd Mon Sep 17 00:00:00 2001 From: hbg1010 Date: Mon, 9 Dec 2024 17:07:14 -0500 Subject: [PATCH 32/53] updated gui on settings change --- src/timer/Layers/TimerSettingsLayer.cpp | 53 +++++++++++++++++-------- src/timer/Layers/TimerSettingsLayer.hpp | 15 ++++--- 2 files changed, 46 insertions(+), 22 deletions(-) diff --git a/src/timer/Layers/TimerSettingsLayer.cpp b/src/timer/Layers/TimerSettingsLayer.cpp index 2909291..9c40293 100644 --- a/src/timer/Layers/TimerSettingsLayer.cpp +++ b/src/timer/Layers/TimerSettingsLayer.cpp @@ -1,4 +1,11 @@ #include "TimerSettingsLayer.hpp" +#include + +// EventListener m_listener = {this, upd}; + +// geode::EventListener m_listener = { +// this, &TimerSettingsLayer::updateButtons(), CloseEventFilter(this, ) +// } TimerSettingsLayer* TimerSettingsLayer::create(CCNode* const& menuID) { auto temp = new TimerSettingsLayer(); @@ -9,7 +16,7 @@ TimerSettingsLayer* TimerSettingsLayer::create(CCNode* const& menuID) { return temp; } else { - CC_SAFE_DELETE(temp); + // CC_SAFE_DELETE(temp); return nullptr; } @@ -17,6 +24,13 @@ TimerSettingsLayer* TimerSettingsLayer::create(CCNode* const& menuID) { // sets up the layer! bool TimerSettingsLayer::setup(CCNode* const& menuID) { + + + // TimerSettingsLayer::m_listener = listenForSettingChanges(menuID->getID() == "PauseLayer" ? "playLayer" : "editorLayer", &TimerSettingsLayer::updateButtons); + TimerSettingsLayer::m_listener = listenForSettingChanges(menuID->getID() == "PauseLayer" ? "playLayer" : "editorLayer", [this](bool resault) { + this->updateButtons(); + }); + TimerSettingsLayer::m_menuID = menuID; CCSize screenSize = CCDirector::sharedDirector()->getWinSize(); log::debug("{}", menuID); @@ -64,6 +78,23 @@ bool TimerSettingsLayer::setup(CCNode* const& menuID) { menu->updateLayout(); updateButtons(); + + // m_listener.setFilter(SettingChangedFilterV3(Mod::get(), "playLayer")); + // m_listener.bind([&](SettingChangedEventV3* ev) { + // log::debug("IM GONNA KMS"); + // }); + + // m_listener = EventListener(this, &onSettingsChanged, SettingChangedFilterV3(Mod::get(), "playLayer")); + // TimerSettingsLayer::m_listener.setFilter(SettingChangedFilterV3(Mod::get(), "playLayer")); + // TimerSettingsLayer::m_listener.bind(&[](SettingChangedEventV3* ev) { + + // }); + + // m_listener.bind(this, &TimerSettingsLayer::onSettingsChanged); + // = { + // this, updateButtons(), SettingChangedFilterV3(Mod::get(), "playLayer") + // }; + return true; } @@ -101,10 +132,7 @@ void TimerSettingsLayer::pauseTime(CCObject* sender) { // opens geode settings page void TimerSettingsLayer::changeSettings(CCObject* sender) { - geode::openSettingsPopup(Mod::get(), false); - auto parent = this->getParent(); - - updateButtons(); + auto settingsPopup = geode::openSettingsPopup(Mod::get(), true); } @@ -143,16 +171,9 @@ void TimerSettingsLayer::disableButton(CCNode* node, bool enable) { } } +// dtor to drop this global listener. TimerSettingsLayer::~TimerSettingsLayer() { log::debug("destructed"); -} - -$execute { - new EventListener>(+[](ModPopupUIEvent* event) { - if (event->getModID() == "hbg1010.20_20_20") { - log::debug("hbg"); - } - // You should always propagate Geode UI events - return ListenerResult::Propagate; - }); -} + m_listener->disable(); + CC_SAFE_DELETE(m_listener); +} \ No newline at end of file diff --git a/src/timer/Layers/TimerSettingsLayer.hpp b/src/timer/Layers/TimerSettingsLayer.hpp index 8cd0dfc..dffa48e 100644 --- a/src/timer/Layers/TimerSettingsLayer.hpp +++ b/src/timer/Layers/TimerSettingsLayer.hpp @@ -2,29 +2,32 @@ #include #include +#include #include "../../hooks/EditorUITimer.hpp" #include "../../hooks/TimerPlayLayer.hpp" using namespace geode::prelude; class TimerSettingsLayer : public Popup { + +// friend class modSettingsEvent; + public: static TimerSettingsLayer* create(CCNode* const& menuID); static void disableButton(CCNode* node, bool enable); - - // static TimerSettingsLayer* get(); + static TimerSettingsLayer* get(); protected: - CCNode* m_menuID; + + CCNode* m_menuID; // ptr to buttons attatched to this layer + EventListener* m_listener; bool paused; CCMenu* menuPointer; - // bool isDisabled; - + bool setup(CCNode* const& menuID); void resetTimer(CCObject* sender); void changeSettings(CCObject* sender); void pauseTime(CCObject* sender); - void updateButtons(); ~TimerSettingsLayer(); }; \ No newline at end of file From 46ba85a62d8f01f940eff2e73edbbbe3e037f6ff Mon Sep 17 00:00:00 2001 From: hbg1010 Date: Mon, 9 Dec 2024 17:07:50 -0500 Subject: [PATCH 33/53] no longer auto --- src/timer/Layers/TimerSettingsButton.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/timer/Layers/TimerSettingsButton.cpp b/src/timer/Layers/TimerSettingsButton.cpp index 6155608..b4f555e 100644 --- a/src/timer/Layers/TimerSettingsButton.cpp +++ b/src/timer/Layers/TimerSettingsButton.cpp @@ -15,7 +15,7 @@ CCMenuItemSpriteExtra* TimerSettingsButton::create(CCNode* target) { // this is the buttons callback void TimerSettingsButton::onTimerSettings(CCObject* sender) { log::debug("Settings menu was pressed"); - auto layer = TimerSettingsLayer::create(PARENT); + TimerSettingsLayer* layer = TimerSettingsLayer::create(PARENT); layer->m_scene = PARENT; if (PARENT->getID() == "EditorPauseLayer") { From 72aafcaafb5c1afff46b38a88bf611be20f3004f Mon Sep 17 00:00:00 2001 From: hbg1010 Date: Mon, 9 Dec 2024 17:50:20 -0500 Subject: [PATCH 34/53] spelling fix --- mod.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mod.json b/mod.json index 915324d..dc1a861 100644 --- a/mod.json +++ b/mod.json @@ -62,7 +62,7 @@ }, "editorLayer": { "type": "bool", - "name": "Editer", + "name": "Editor", "default": true, "description": "This setting enables or disables whether or not the timer is used in gameplay" } From a92927e117319cdd82e1def8b79d6c0306cc85c6 Mon Sep 17 00:00:00 2001 From: hbg1010 Date: Mon, 9 Dec 2024 17:50:44 -0500 Subject: [PATCH 35/53] changed force reset to take time arg --- src/hooks/EditorUITimer.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/hooks/EditorUITimer.hpp b/src/hooks/EditorUITimer.hpp index 4a3ec65..e3634d2 100644 --- a/src/hooks/EditorUITimer.hpp +++ b/src/hooks/EditorUITimer.hpp @@ -24,7 +24,7 @@ class $modify(EditorUITimer, EditorUI) { // resets timer when it is finished bool reset(EditorUITimer* sender, int time) { - if (this->timer.getFilter().isFinished()) { + if (this->timer.getFilter().isFinished() || this->timer.getCallback() == nullptr) { this->timer.bind(sender, &EditorUITimer::onEvent); this->timer.setFilter(startEditorTimer(time)); //TODO ADD 0!! return true; @@ -36,7 +36,7 @@ class $modify(EditorUITimer, EditorUI) { // EditorUITimer void resetTimer(int time = Mod::get()->getSettingValue("interval") * 6); - void forceReset(); + void forceReset(int time = Mod::get()->getSettingValue("interval") * 6); void onEvent(EditorTimerTask::Event* ev); bool checkEndPlaytest(); void onUnpause(); From ce1bc155c2b421ebb1ef6ec38aeb12880d76d531 Mon Sep 17 00:00:00 2001 From: hbg1010 Date: Mon, 9 Dec 2024 17:59:34 -0500 Subject: [PATCH 36/53] fixed pausing and resetting on editor layer --- src/hooks/EditorTimerPause.cpp | 5 ++++- src/hooks/EditorUITimer.cpp | 11 ++++++----- src/timer/Layers/TimerSettingsLayer.cpp | 3 +++ 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/src/hooks/EditorTimerPause.cpp b/src/hooks/EditorTimerPause.cpp index 1adafcc..095ffd1 100644 --- a/src/hooks/EditorTimerPause.cpp +++ b/src/hooks/EditorTimerPause.cpp @@ -46,6 +46,9 @@ void EditorTimerPause::onResume(CCObject* sender) { EditorPauseLayer::onResume(sender); auto x = static_cast(EditorUITimer::get()); - x->resetTimer(); + if (Mod::get()->getSettingValue("editorLayer") && !x->m_fields->paused) { + x->resetTimer(); + } + } \ No newline at end of file diff --git a/src/hooks/EditorUITimer.cpp b/src/hooks/EditorUITimer.cpp index 478e236..fc8d025 100644 --- a/src/hooks/EditorUITimer.cpp +++ b/src/hooks/EditorUITimer.cpp @@ -9,10 +9,9 @@ void EditorUITimer::resetTimer(int time) { } // cancels the timer before reseting -void EditorUITimer::forceReset() { - m_fields->timer.getFilter().shallowCancel(); - - resetTimer(); +void EditorUITimer::forceReset(int time) { + m_fields->timer.bind(this, &EditorUITimer::onEvent); + m_fields->timer.setFilter(startEditorTimer(time)); //TODO ADD 0!! } // this event happens when binded with the event listener. it will throw a new event when the timer task attatched is called. @@ -70,9 +69,11 @@ bool EditorUITimer::init(LevelEditorLayer* editorLayer) { m_fields->isPlaytesting = false; m_fields->paused = false; + m_fields->timer.bind(this, &EditorUITimer::onEvent); + if (Mod::get()->getSettingValue("editorLayer")) { - m_fields->timer.bind(this, &EditorUITimer::onEvent); m_fields->timer.setFilter(startEditorTimer(Mod::get()->getSettingValue("interval") * 6)); + } return true; diff --git a/src/timer/Layers/TimerSettingsLayer.cpp b/src/timer/Layers/TimerSettingsLayer.cpp index 9c40293..ed40228 100644 --- a/src/timer/Layers/TimerSettingsLayer.cpp +++ b/src/timer/Layers/TimerSettingsLayer.cpp @@ -29,6 +29,9 @@ bool TimerSettingsLayer::setup(CCNode* const& menuID) { // TimerSettingsLayer::m_listener = listenForSettingChanges(menuID->getID() == "PauseLayer" ? "playLayer" : "editorLayer", &TimerSettingsLayer::updateButtons); TimerSettingsLayer::m_listener = listenForSettingChanges(menuID->getID() == "PauseLayer" ? "playLayer" : "editorLayer", [this](bool resault) { this->updateButtons(); + if (resault) { + resetTimer(this); + } }); TimerSettingsLayer::m_menuID = menuID; From 07adf71f32b80946841c541d65d696ac98385524 Mon Sep 17 00:00:00 2001 From: hbg1010 Date: Tue, 10 Dec 2024 12:24:49 -0500 Subject: [PATCH 37/53] Implemented resetting editor timer. --- src/hooks/EditorUITimer.cpp | 10 ++++++++-- src/hooks/EditorUITimer.hpp | 2 ++ src/timer/Layers/TimerSettingsLayer.cpp | 7 ++++++- 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/src/hooks/EditorUITimer.cpp b/src/hooks/EditorUITimer.cpp index fc8d025..1caf4ad 100644 --- a/src/hooks/EditorUITimer.cpp +++ b/src/hooks/EditorUITimer.cpp @@ -4,12 +4,14 @@ // resets the timer on call! void EditorUITimer::resetTimer(int time) { if (m_fields->reset(this, time)) { + m_fields->remainingTime = time; // remaining time resets on force reset as a resault log::debug("timer was reset!"); } } // cancels the timer before reseting void EditorUITimer::forceReset(int time) { + m_fields->remainingTime = time; // remaining time resets on force reset as a resault m_fields->timer.bind(this, &EditorUITimer::onEvent); m_fields->timer.setFilter(startEditorTimer(time)); //TODO ADD 0!! } @@ -55,9 +57,13 @@ void EditorUITimer::forceReset(int time) { } } - void onUnpause() { +int EditorUITimer::getRemainder() { + return m_fields->remainingTime; +} - } +void EditorUITimer::cancelTimer() { + m_fields->timer.getFilter().cancel(); +} /* hooks ========== */ diff --git a/src/hooks/EditorUITimer.hpp b/src/hooks/EditorUITimer.hpp index e3634d2..997504f 100644 --- a/src/hooks/EditorUITimer.hpp +++ b/src/hooks/EditorUITimer.hpp @@ -40,6 +40,8 @@ class $modify(EditorUITimer, EditorUI) { void onEvent(EditorTimerTask::Event* ev); bool checkEndPlaytest(); void onUnpause(); + int getRemainder(); + void cancelTimer(); //hooked fns bool init(LevelEditorLayer* editorLayer); diff --git a/src/timer/Layers/TimerSettingsLayer.cpp b/src/timer/Layers/TimerSettingsLayer.cpp index ed40228..89135ec 100644 --- a/src/timer/Layers/TimerSettingsLayer.cpp +++ b/src/timer/Layers/TimerSettingsLayer.cpp @@ -126,7 +126,12 @@ void TimerSettingsLayer::pauseTime(CCObject* sender) { layer->pauseTimer(TimerSettingsLayer::paused); } else { - log::debug("todo"); + auto layer = static_cast(EditorUITimer::get()); + if (paused) { + layer->resetTimer(layer->getRemainder()); + } else { + layer->cancelTimer(); + } } updateButtons(); From 04ef7ff48c482cb1d947928c408fc8c70c1a3815 Mon Sep 17 00:00:00 2001 From: hbg1010 Date: Tue, 10 Dec 2024 19:59:45 -0500 Subject: [PATCH 38/53] Fixed pasuing functionality --- src/hooks/EditorUITimer.cpp | 28 ++++++++++++++++--------- src/hooks/EditorUITimer.hpp | 8 ++++--- src/timer/EditorTimer.cpp | 6 ++---- src/timer/Layers/TimerSettingsLayer.cpp | 20 ++++++++---------- 4 files changed, 34 insertions(+), 28 deletions(-) diff --git a/src/hooks/EditorUITimer.cpp b/src/hooks/EditorUITimer.cpp index 1caf4ad..e0b136a 100644 --- a/src/hooks/EditorUITimer.cpp +++ b/src/hooks/EditorUITimer.cpp @@ -23,22 +23,24 @@ void EditorUITimer::forceReset(int time) { if (m_fields->isPlaytesting) { m_fields->pauseAfterPlaytest = true; return; - } + } EditorUITimer::onPause(this); TimerEvent(true, this).post(); } else if (int* progress = ev->getProgress()) { + m_fields->remainingTime = *progress; + if (m_fields->remainingTime % 60 == 0) log::debug("{}", m_fields->remainingTime); // if this is paused, this will recieve progress when cancelled - if (m_fields->paused) { - m_fields->remainingTime = *progress; + // if (m_fields->paused) { + - } else { - log::debug("min: {}", *progress); - } + // } } else if (ev->isCancelled()) { + // m_fields->remainingTime = *ev->getProgress(); + log::debug("{}", m_fields->remainingTime); return; } // validates if event shouldnt run due to condition @@ -61,10 +63,17 @@ int EditorUITimer::getRemainder() { return m_fields->remainingTime; } -void EditorUITimer::cancelTimer() { - m_fields->timer.getFilter().cancel(); -} +void EditorUITimer::pauseTimer(bool isPaused) { + m_fields->paused = isPaused; + + if (m_fields->paused) { + m_fields->timer.getFilter().cancel(); + } else { + log::debug("{}", m_fields->remainingTime); + resetTimer(m_fields->remainingTime); + } +} /* hooks ========== */ @@ -79,7 +88,6 @@ bool EditorUITimer::init(LevelEditorLayer* editorLayer) { if (Mod::get()->getSettingValue("editorLayer")) { m_fields->timer.setFilter(startEditorTimer(Mod::get()->getSettingValue("interval") * 6)); - } return true; diff --git a/src/hooks/EditorUITimer.hpp b/src/hooks/EditorUITimer.hpp index 997504f..c66e686 100644 --- a/src/hooks/EditorUITimer.hpp +++ b/src/hooks/EditorUITimer.hpp @@ -24,8 +24,10 @@ class $modify(EditorUITimer, EditorUI) { // resets timer when it is finished bool reset(EditorUITimer* sender, int time) { - if (this->timer.getFilter().isFinished() || this->timer.getCallback() == nullptr) { + if (this->timer.getFilter().isFinished() || this->timer.getFilter().isCancelled()) { + log::debug("{}", time); this->timer.bind(sender, &EditorUITimer::onEvent); + // log::debug("time {}", time); this->timer.setFilter(startEditorTimer(time)); //TODO ADD 0!! return true; } @@ -41,8 +43,8 @@ class $modify(EditorUITimer, EditorUI) { bool checkEndPlaytest(); void onUnpause(); int getRemainder(); - void cancelTimer(); - + void pauseTimer(bool isPaused); + //hooked fns bool init(LevelEditorLayer* editorLayer); void onPlaytest(CCObject* sender); diff --git a/src/timer/EditorTimer.cpp b/src/timer/EditorTimer.cpp index 7ba6de5..78372f2 100644 --- a/src/timer/EditorTimer.cpp +++ b/src/timer/EditorTimer.cpp @@ -9,12 +9,10 @@ EditorTimerTask startEditorTimer(int time) { // sleeps every second, as this needs to check if the event has been cancelled to not cause any problems! for (int i = 0; i < time; i++) { if (hasBeenCancelled()) { - progress(time - i); // returns the seconds val before announcing cancel, so it can be stored if timer is paused return EditorTimerTask::Cancel(); - - } else if (i % 60 == 0) { - progress(i / 60); } + log::debug("{}", time - i); + progress(time - i); std::this_thread::sleep_for(std::chrono::seconds(1)); } diff --git a/src/timer/Layers/TimerSettingsLayer.cpp b/src/timer/Layers/TimerSettingsLayer.cpp index 89135ec..e5b2bdd 100644 --- a/src/timer/Layers/TimerSettingsLayer.cpp +++ b/src/timer/Layers/TimerSettingsLayer.cpp @@ -112,26 +112,24 @@ void TimerSettingsLayer::resetTimer(CCObject* sender) { //reseting here is very easy. auto layer = EditorUITimer::get(); auto x = static_cast(EditorUITimer::get()); - x->forceReset(); + if (paused) { + x->forceReset(); + } else { + x->m_fields->remainingTime = Mod::get()->getSettingValue("interval"); + } } } +// pauses the timer manager on either layer void TimerSettingsLayer::pauseTime(CCObject* sender) { - log::debug("paused"); // sets it to the opposite val on click TimerSettingsLayer::paused = !TimerSettingsLayer::paused; + log::debug("this is {}", paused); if (TimerSettingsLayer::m_menuID->getID() == "PauseLayer") { - auto layer = static_cast(TimerPlayLayer::get()); - - layer->pauseTimer(TimerSettingsLayer::paused); + static_cast(TimerPlayLayer::get())->pauseTimer(TimerSettingsLayer::paused); } else { - auto layer = static_cast(EditorUITimer::get()); - if (paused) { - layer->resetTimer(layer->getRemainder()); - } else { - layer->cancelTimer(); - } + static_cast(EditorUITimer::get())->pauseTimer(TimerSettingsLayer::paused); } updateButtons(); From 338353b62608c0d7b6995a8a18354b858d3dc190 Mon Sep 17 00:00:00 2001 From: hbg1010 Date: Wed, 11 Dec 2024 00:06:39 -0500 Subject: [PATCH 39/53] Changed Version log --- changelog.md | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/changelog.md b/changelog.md index 9f04fab..ac32ed1 100644 --- a/changelog.md +++ b/changelog.md @@ -1,2 +1,10 @@ +# 1.1.0 +- Added timer modifications layer + - Reset Timer + - Pause Timer + - Change Settings +- Fixed bugs +- Optimized + # 1.0.0 -- Edit this file to change your mod's changelog. +- Implemented Timer From 4073a614bdc1ea7028402fcd867995e2117e59f7 Mon Sep 17 00:00:00 2001 From: hbg1010 Date: Wed, 11 Dec 2024 00:06:52 -0500 Subject: [PATCH 40/53] Deleted unused function --- src/hooks/TimerPauseLayer.hpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/hooks/TimerPauseLayer.hpp b/src/hooks/TimerPauseLayer.hpp index 7a10faf..6592e65 100644 --- a/src/hooks/TimerPauseLayer.hpp +++ b/src/hooks/TimerPauseLayer.hpp @@ -7,5 +7,4 @@ using namespace geode::prelude; class $modify(TimerPauseLayer, PauseLayer) { void customSetup(); - void onTimerSettings(CCObject* sender); }; \ No newline at end of file From 773f313f2d0505b8a477322a2d5090f712f9a23f Mon Sep 17 00:00:00 2001 From: hbg1010 Date: Wed, 11 Dec 2024 00:07:29 -0500 Subject: [PATCH 41/53] Added option to disable timer menu --- mod.json | 8 +++++++- src/hooks/EditorTimerPause.cpp | 8 +++----- src/hooks/TimerPauseLayer.cpp | 13 ++----------- 3 files changed, 12 insertions(+), 17 deletions(-) diff --git a/mod.json b/mod.json index dc1a861..57807b3 100644 --- a/mod.json +++ b/mod.json @@ -6,7 +6,7 @@ }, "id": "hbg1010.20_20_20", "name": "20 20 20", - "version": "v1.0.0", + "version": "v1.1.0-Alpha1", "developer": "Hbg1010", "description": "", "dependencies": [ @@ -54,6 +54,12 @@ "default": true, "description": "enables sound effects to notify you when your timer is up!" }, + "useQuickSettings": { + "type": "bool", + "name": "Enable Settings Menu", + "default": true, + "description": "Disables the button to open timer modificaitons and settings from pause menus" + }, "playLayer": { "type": "bool", "name": "Play Layer", diff --git a/src/hooks/EditorTimerPause.cpp b/src/hooks/EditorTimerPause.cpp index 095ffd1..770af2a 100644 --- a/src/hooks/EditorTimerPause.cpp +++ b/src/hooks/EditorTimerPause.cpp @@ -15,15 +15,13 @@ bool EditorTimerPause::init(LevelEditorLayer* lvl) { if (!EditorPauseLayer::init(lvl)) return false; - - // auto spr = CircleButtonSprite::createWithSpriteFrameName("particle_197_001.png"); - // auto spr = CCSprite::create("TimerSettings.png"_spr); - // spr->setScale(.65f); - // CCMenuItemSpriteExtra* timersettingsBtn = CCMenuItemSpriteExtra::create(spr, this, menu_selector(EditorTimerPause::onTimerSettings)); + + if (!Mod::get()->getSettingValue("useQuickSettings")) return true; // early return if the timer button is disabled CCMenuItemSpriteExtra* timersettingsBtn = TimerSettingsButton::create(this); auto settingsMenu = this->getChildByID("settings-menu"); + settingsMenu->setContentHeight(this->getContentHeight()*2); settingsMenu->setPositionY(settingsMenu->getPositionY()+5.f); settingsMenu->setLayout( diff --git a/src/hooks/TimerPauseLayer.cpp b/src/hooks/TimerPauseLayer.cpp index f159386..37d13e7 100644 --- a/src/hooks/TimerPauseLayer.cpp +++ b/src/hooks/TimerPauseLayer.cpp @@ -1,16 +1,5 @@ #include "TimerPauseLayer.hpp" - - // void TimerPauseLayer::onTimerSettings(CCObject* sender) { - // log::debug("Settings menu was pressed"); - // auto layer = TimerSettingsLayer::create(this); - // layer->m_scene = this; - // layer->show(); - // } - -/* hooks -========== */ - void TimerPauseLayer::customSetup() { PauseLayer::customSetup(); @@ -19,6 +8,8 @@ void TimerPauseLayer::customSetup() { // spr->setScale(.65f); // CCMenuItemSpriteExtra* TimersettingsBtn = CCMenuItemSpriteExtra::create(spr, this, menu_selector(TimerPauseLayer::onTimerSettings)); + if (!Mod::get()->getSettingValue("useQuickSettings")) return; // early return if the timer button is disabled + CCMenuItemSpriteExtra* TimersettingsBtn = TimerSettingsButton::create(this); auto settingsMenu = this->getChildByID("right-button-menu"); From 5aaa981903586fe21fa73a2039367ab9a56c1f5e Mon Sep 17 00:00:00 2001 From: hbg1010 Date: Wed, 11 Dec 2024 09:11:44 -0500 Subject: [PATCH 42/53] Cleaned code --- src/hooks/EditorTimerPause.hpp | 2 -- src/hooks/TimerPauseLayer.cpp | 5 ----- 2 files changed, 7 deletions(-) diff --git a/src/hooks/EditorTimerPause.hpp b/src/hooks/EditorTimerPause.hpp index abf9f10..b13e2b2 100644 --- a/src/hooks/EditorTimerPause.hpp +++ b/src/hooks/EditorTimerPause.hpp @@ -1,5 +1,3 @@ - - #include #include "../timer/Layers/TimerSettingsLayer.hpp" #include "../timer/Layers/TimerSettingsButton.hpp" diff --git a/src/hooks/TimerPauseLayer.cpp b/src/hooks/TimerPauseLayer.cpp index 37d13e7..127f6b6 100644 --- a/src/hooks/TimerPauseLayer.cpp +++ b/src/hooks/TimerPauseLayer.cpp @@ -3,11 +3,6 @@ void TimerPauseLayer::customSetup() { PauseLayer::customSetup(); - // auto spr = CircleButtonSprite::createWithSpriteFrameName("particle_197_001.png"); - // auto spr = CCSprite::create("TimerSettings.png"_spr); - // spr->setScale(.65f); - // CCMenuItemSpriteExtra* TimersettingsBtn = CCMenuItemSpriteExtra::create(spr, this, menu_selector(TimerPauseLayer::onTimerSettings)); - if (!Mod::get()->getSettingValue("useQuickSettings")) return; // early return if the timer button is disabled CCMenuItemSpriteExtra* TimersettingsBtn = TimerSettingsButton::create(this); From 072d05ef4b38ef80cb096d48fac9851dbbf1eaa2 Mon Sep 17 00:00:00 2001 From: hbg1010 Date: Wed, 11 Dec 2024 09:11:54 -0500 Subject: [PATCH 43/53] changed version to alpha-1 --- mod.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mod.json b/mod.json index 57807b3..3d321ec 100644 --- a/mod.json +++ b/mod.json @@ -6,7 +6,7 @@ }, "id": "hbg1010.20_20_20", "name": "20 20 20", - "version": "v1.1.0-Alpha1", + "version": "v1.1.0-alpha.1", "developer": "Hbg1010", "description": "", "dependencies": [ From 3a662f21f0be3c4de456a4c896e648f9f8903f73 Mon Sep 17 00:00:00 2001 From: hbg1010 Date: Wed, 11 Dec 2024 12:22:38 -0500 Subject: [PATCH 44/53] sprite sheets + added reset button. --- mod.json | 9 +++-- resources/TL_ButtonSheet_001-uhd.plist | 54 +++++++++++++++++++++++++ resources/TL_ButtonSheet_001-uhd.png | Bin 0 -> 58812 bytes 3 files changed, 60 insertions(+), 3 deletions(-) create mode 100644 resources/TL_ButtonSheet_001-uhd.plist create mode 100644 resources/TL_ButtonSheet_001-uhd.png diff --git a/mod.json b/mod.json index 3d321ec..252de85 100644 --- a/mod.json +++ b/mod.json @@ -17,10 +17,13 @@ } ], "resources": { - "sprites": [ - "resources/*.png" - ] + "spritesheets": { + "TL_ButtonSheet_001-uhd": [ + "resources/*.png" + ] + } }, + "settings": { "interval": { "type": "int", diff --git a/resources/TL_ButtonSheet_001-uhd.plist b/resources/TL_ButtonSheet_001-uhd.plist new file mode 100644 index 0000000..c003e62 --- /dev/null +++ b/resources/TL_ButtonSheet_001-uhd.plist @@ -0,0 +1,54 @@ + + + + + frames + + TimerSettings.png + + aliases + + spriteOffset + {2,-3} + spriteSize + {180,182} + spriteSourceSize + {184,188} + textureRect + {{239,0},{180,182}} + textureRotated + + + TM_replayBtn.png + + aliases + + spriteOffset + {4,-7} + spriteSize + {238,244} + spriteSourceSize + {246,258} + textureRect + {{0,0},{238,244}} + textureRotated + + + + metadata + + format + 3 + pixelFormat + RGBA8888 + premultiplyAlpha + + realTextureFileName + TL_ButtonSheet_001-uhd.png + size + {419,244} + textureFileName + TL_ButtonSheet_001-uhd.png + + + \ No newline at end of file diff --git a/resources/TL_ButtonSheet_001-uhd.png b/resources/TL_ButtonSheet_001-uhd.png new file mode 100644 index 0000000000000000000000000000000000000000..b6f4a367e7364d2412635fa050fb009ffe9af3e1 GIT binary patch literal 58812 zcmV)@K!LxBP)Gvu6;0ulrjBVZ2bn%A7;s=KJWYg+UEhIMtm2I(mSb4jZxuFt$eG!!r!< z+0%MUTTfGQ;vZoQt=ZEqpf1jLZJG5z%+JWvzVH|D1t{EgQE*J ze+sYD@YU{h^1-PA;gh_(y&t^F{@2HW6sIevEEx30d{)zVrbD1E#y^g|OE zx!h%&c<>N5+t=K0@qYdZOe^rZtBD8^@2=hRk7rv!1R%cR-U&d;DLf!;MAsz`Eg#L$*W6kY} zV^??U)=hyEfr)^{ zmju!4V2NaRk{-C)yC#yInzr5ZdcX#u`*G$` zTS6Q!W59eLAp)ReQ`g;1fqT_%uL8^|v zo0ih}CQz!Q-mT}uVyxX~uizv4W_kxWcAk9l$-QFyc)9q?F1t*Pu_(z9WN4hRr@HR; zIWV#(yy@+*41*FYcZNusPs}<^Y~-{LBULWJ^{~q75zp6M&8dF8rNvVgpYEU_?mbVf5bi zA@R2bWNQIT>lc;CIsntM?~7$a907{%I}J)+`x)C!#p~wAt`@#mf{~rD`WbFOM80aL zo7?2Sj^L4Z*)+!BZ1B+;Px@n1;%xlxPqas}-Ey4pJkho3U0_V;fd}HVU>|-;YZ(Xt zBKQ!56u{UBp#TG*V;ea20!F4)#otQ`D`e^SyJY!yyJW${LfO8dBHFI@?MF~zA2L?! zv5^K&Kx(wB>Aen&@DNTxr;qY@gFArQGXT0;b(SQd9ZVfCE(yRI^PbSudQ0M(A` z>=|IB0h1uL{+BZO=GE;AoXUzU$6ut4@gxFL1dF?|_zqf0jf$$cSAdZn8`5RFBfXbu zds;#Sp@z%{8lZxyHPU@RmSp87+ksZg-_3w41FvRKRV}tmzqb)&wH9Ljpliv_N?E&T zmyXQJ8U$WT5qPD4n?KjV$6Z<&-C&5S!;PJEaF+caV`CM~qhmZq)9xO6Ad>hH#}+5b zXsw|WF6@rSf3z7M$a+lx0g%+4jDdex}++$j~Zw?8mhpA|Jf$K z{@Y;qL;^+@I9UN!Ye3sW+4py~l3A|HDZ zj-f^cNP8?8*>1Uaar>gW2GU6hLb13FybgB;RtYu?wDy42LlCk6!D`yNQSUV%7+ELd z!z&B0@NfO1Qe`>KhmV`gpzZ5p55R`&yC{OQ!H46xeiVSzB*5zRA@#7GP1~M|ONDk#9l$L!fdz{tWVYl!gwWncwu zM^43$|0_^=718>--5wHB!a1Nkx*ePjw;X`f$L)KXK6medNPvj(i(77qOaOo&bP@pQ zvO9Y#7qvA;EDE*#+dg9%`4_3ys9Q9#SZ2PqLstD5Sq@W#ZoA7HnrXL3fsyT&n~eJt zRe1+aY_x`=^<9S>vTeJh%Nf^qkz+4xufWHjEN4Gjdl49ER*;$`a9v~t&H7-6@_EO* z#gOc$PlYSL(M^f6(chU!fQW9nNOSRy7~M{8d~|(?a_-O({)#wf;}hen~*2GL{MBf!Xx550|! zj96itF1dIm*XbL{;Ob-Jhe^Ax7A|UbPZJpV&=`ZJQr^8SPkxEBwZuWid+Na#9z5>2 zPI$SgW|D{L$lk;&S%E;rMM5MVhqG_!E;s$HzrA$hbJGMywFpZ=mXS5rD3p?oi^}Dl zn>I&eB{Auo3p$t9V5Ejd4@MXeth#y!UJ;!u2MDd9c(UY3F+BkcpMgiV2nzK3S!(;b zWfaWT%U@T4AZ)(O{-7{!u_gM#IjEwnnAt@CcAJi@Re3IcOvNj#szRi+?e4DP(M&`=QR(FU3jI8;mMp;UV9TW#pijXm6&b~~L-LDCd{9WQjS%ItS zqmT9`bU|k69seEzx161q-ULR03pmBHjU9}52U*JElRLM`(#d?R-5VEjyq7MGb&;sl z5MM@;!>-#WjIZe8EUtN;?o!`udrCnKQ1) zZBV#=9;Mr^36Sib^`bQw30a}{pd5MfizB3&FK>wJkS5D0z?%?9Fw)_JxriZs`j>py z@xl!}k{aqI&e~|eC|V$jCa)p*E|Fq-oLq>DQFK57CZe{9UMW$Ffuv_E{+52f{$;zTvE&hu#$tSU4-k6#=D>{_6Bup8sd?6zi-!s@yMhUKw%aniZh~iQ9@8Z!P9{e5qEFgJFYK;VlPP(|O-1OK0X=V@={BfeX zw~Q)x*GOeWwNzEsNCjTyB^AmoynWMd*|N4w@;8=CaY40|7FEeE2ng>kua<-azcPwH zsO2Xq`7#J`At`Bzs$y(fGyH6xC@tEjNUP4NlG83p(wikoYDS_YVme7cB1&R%f+VGw z$*c7PMjX9VZ1~{!BsTbZKjgUbn1@uSNwJLrj3SK@abQr6K9({My#_W@c@9I4YUL9s zH1AXs7&QzSQJZfEwC^T7oF8#wpLze7BuipLg!J!y&SmF?Imd+``_apIBM{y7($E0H zPkmZO`2d{FYszHHx^mgEsX_|3SIEw7Az*?}L8baxQC6cssG`gQE!A9RL(O1I zN=lHF^hAIXe~JR2Oe|*8vl9VC36kA11+OG&);39+cS@1gU6LicttAP@d8Mx1bT+j} z`7$nH#itY14NM~*adftnQ&*hp!i>4`Gh7g zYB(@bw*xnYaU_D0SITPeeU6gYuulP!8)1P!#PQ}OUrz&(b^naynXprPk{95tFOA%MIsBedtDG38WfBo1tP9=&pb2w zvPER}{PmrKlr`id>NkOr8mGQO6#@BE{y*wEW~3(zty->Eq1!j?mUnL40?KN1v7`tk z_4R4&6M%&AcNs2tY`BS<9tbZbAbJnVm8ZTu(&w714=^eQ$ZT3wB1`9@)XAJ8$y-$_ zMcb>uDyx*TUDbG1nZvw3@d$1|k<`pYNy`HGD0g0xwCptH;V#5~ssIAsrnKs6xaX<}R+dwX`z0kMNn&E6<1-fN_Q40?_hjTG zN{4=_(tf`*X#+57*E>~Oc7aO|u_nftw1+0rq*qhf+|K|G1S6i$ym7l^!rk5giF%$c zB%rvLFZXumqMibrcf^gEf=@H1?{K3uVD<%!BvHn`tj<8AP_x0@kkJWQuRo(9-}zB>8kJm(A`Gs zXYuTvvT$Z0tf4|FEv}N?i2qa|{^JAyN_5qJnV%DUf?w8oI|utU$eG78f7hQo9n<{Y zWX75BO3O-=&I8k=$06y`Wk?#_d8v|$m{Wq^N8u=xs_Age#r`BCCt11ZFcCpysxlHf>Vd>tpZUy<194OQocw zM7^(DXg6SuB&R1xyFRJX=ZGxnbr@WDy;CF&R#GB{ZC!v7Cx*}AuKVROUm zk|+S_KYK&@2{#wHS5L$<0HPry+UVs;+$|&0u2(KBlzB4>WXVrOvUce%*^C?^T1ifg zfWntLmjQ4wU`&+fRW>ix!s0m7mcfqNPKiTCrk3|5KstM zZ2I?(9XraAM;^!`d)&~jvYJH{=feEtIVH2UzRUlUhAB+#T9%F zNht}6eb)xeyUv5@zDtvK`=v@^DyC>-!4?n8h{xk`-o0X*te+j87(_w?-E}V2mgC~C zs~0e`)fLv%TF!)+abp3ZlP>NecfJUH)c}jZ{-OqU(-pzzP2idQ&Sv~9RzcT>ZbMGY z1wds;3k6Qu(y9|&F7`<^R?8^bO!MHrjslRzVA6TIq3>C=-|r^(<5hF+u9t?%DVKJ) zhnQv6YRy4?Zqd5wcpT;hEypG z$K%j-w{G1!S-5ba{QUFJ3X}*?MMXslq_%9?5&%xLzJlF&Br>$_ks`g1OqX7VXGl8` z9>~O#gwU$pk;II&cZ5ePgNNb0EAwURlJL}b5Amb9xQ>WKt(`is&cVnAq9yopPZe6d z22PzWhFRa|-qg$bsF8pXS9dF6?M!}q6MmBMQ@=S6kxpEl;k!QO$~H3igj`93Pg^5X zLs7e(+;qVd)<`nVV+175h)3>;vO#uo>uQ|8W5rgliLEDJ(oO#IpM#7c7GE&h47c=r zcniM&Vyhx56l|?@1R_ly&@ml?%@Ic&A;%qeoN}jSWMoLQX3c!Do=_GEFJ$7xiE`(i zcPeX!K*ViL!UDg8fHY{(AbI4GN92SPP6#=ybnHokP+3`-EL*lrzWVAbWqC1iSjVJH zvV(a*0#atHM8uF%Wxu1dq}#A`$?asZ{NiaDad0#C`aS^3O{Kv@LTt?Jy7~Yk&oV!e zNR9+Q4Rp($d`VaT+YJatD;E~Y3asotd11Y*gas67%LQ!j2Vta+@G7i_ywuN_Li}0V z-j0@tJDZK{@Jx6c@^K0kQF#6aotPtihGzqqu+r>otrYz}Y-^<&X$c9vf{rC-uacQ{A9VUgB#suy3zHv|Ni?+pFVw5ENAG@p>pV4{iUtM2G`@+uTN(AtuVwP-CP9r;~|*z3f5+|wpjty&e%UB?4-jU^ejPQeH_ z@I#!Srz};k3?8Qk;GuViL!!Q2;71JrMw9-VCtu;U0DkUhTi(BrbCAs7C01ui)@mr} zAj^LpNvpDb!8KKQTq~=j>z!#*zN1(r<2A!L;%f^YAFm)a@PuXxlny>eSGjFmV8p&5 zAW@5J=f=p8*JGle+5LGKbR8qP9}T%J#$h*n|LRcZ;Ke;h!osVwj*|}Ev;1C%IDt_m z#eus(MKPZwQJWZ3rM@@^!L+};dgiK+Ewnj;|{s#qKlN9l@weZ8 ztH6n52ZA8Kn=jLKM=ChkcKaQjA${>`johTf#Q1_yHNqF;#}vqlDSpC*)3v#koPeA1 zzi@?K7)igF+twKvMM7AJL~br0>7~UOxZ)bJ@IkvpSpxLw)V)JxmK^*!4ObaU@tt9S5W+1|C~HEF*$ZITFj? z{B6DzZLFQIWnQP7yAE-&-tF48TM)=&ReP;+rHXnQ6+>NjktTy&TP5i}OBJzwDOEA1rV> z>VZmGZzpM&AwC=;2T+|s&x14N#4&B8&*2OV+e}5D`@s4|yK?+le7GEc{PBv>*1v!Mm@Jdvo50u&@A=zr zzpY$oPK}n>g%@6^a&8!_idUoi?w4PFQJ_Rnq@_gG9b2t966cg|$mdxVZ$(-My^JoWAZ(NYtNv zG2P()Nwz+~=)>pN%DCs($fhus5YM+=-wv|)vEnEIh$|gl6@ThUJ?^*22TmH8_|pU| z-RD&^%B5;)h4g&5xfHF)bA7hxx;yTMR?@atnj}L?Up?TqE2lm!BYrQ56%<#E29P{t zo|}EqXcZdVtRgR@g}?mgV9>aGut(ztM!Yw9t4rjYk2c9nEbNwp{v}0VC;qj zg<->nsWRsTBj)?WyU_w;PS6)$e4$=>d3j1G<)(n;#oyLazeF{OB%50hsJ zMtuGFVIOUM>zbyETEq1fz10M&3Ga zyQ{k{9GL-NIv=jO!IAb$TxYsS;zVT5QCi|O001BWNklv%$ z1y%KJxl}AFlXlmJPm)W`OpuXRwUUE>n=4t!k4QnGF+&sFci-a8rn8W*wlc(K$mhR< z%YD}+FtX;4~#agE0v!n=gXvbHp)`O ziz-kIPd77vi1Wh*7hIr#sAtcf(z0dCI(Yc4LvrG$ybo0vm?y;kVPhXLPl@pEKMjojiH6{P(~A^=ZQe=OZP-AnGt6RR*1wCEX84QNIqBbWuFOhy!#j+;!uw z4o|{zs}2i8Om~8|lt^v%n|OX90P>Q+2f=yO5n}

UmNm8-~CPS_V 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ⅅT|m9j|t~36aE#oMq}`2cu$$o?dn6G-%BQ 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 aEUQO9+ci(eg)G8k1O(caA^ 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 Date: Wed, 11 Dec 2024 12:24:54 -0500 Subject: [PATCH 45/53] replaced with sprite sheet --- resources/TimerSettings.png | Bin 23652 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 resources/TimerSettings.png diff --git a/resources/TimerSettings.png b/resources/TimerSettings.png deleted file mode 100644 index ddefb070e8765765e7956ea08ad1cc85bbac4b1e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23652 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 z 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 From afc0f66ac6f8fc513f5a6a0c84dd6676be3affbb Mon Sep 17 00:00:00 2001 From: hbg1010 Date: Wed, 11 Dec 2024 12:25:18 -0500 Subject: [PATCH 46/53] Replaced sprite using new reset button --- src/timer/Layers/TimerSettingsLayer.cpp | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/timer/Layers/TimerSettingsLayer.cpp b/src/timer/Layers/TimerSettingsLayer.cpp index e5b2bdd..0fd4606 100644 --- a/src/timer/Layers/TimerSettingsLayer.cpp +++ b/src/timer/Layers/TimerSettingsLayer.cpp @@ -60,10 +60,12 @@ bool TimerSettingsLayer::setup(CCNode* const& menuID) { menu->setID("timer-settings-menu"_spr); // reset button - auto resetSpr = cocos2d::CCSprite::createWithSpriteFrameName("GJ_updateBtn_001.png");//"GJ_updateBtn_001.png" + auto resetSpr = cocos2d::CCSprite::create("TM_replayBtn.png"_spr);//"GJ_updateBtn_001.png" + resetSpr->setScale(.75f); CCMenuItemSpriteExtra* resetButton = CCMenuItemSpriteExtra::create(resetSpr, this, menu_selector(TimerSettingsLayer::resetTimer)); //menu_selector(TimerSettingsLayer::resetTimer) menu->addChild(resetButton); resetButton->setID("reset-button"_spr); + // add button auto pauseSpr = cocos2d::CCSprite::createWithSpriteFrameName("GJ_plusBtn_001.png");//"GJ_plusBtn_001.png" @@ -148,7 +150,16 @@ void TimerSettingsLayer::updateButtons() { if (btnPointer == nullptr) { log::error("Button is nullptr"); } + auto sprite = cocos2d::CCSprite::createWithSpriteFrameName(TimerSettingsLayer::paused ? "GJ_playBtn2_001.png" : "GJ_pauseEditorBtn_001.png"); + + // TODO: ADJUST SIZES SLIGHTLY + if (TimerSettingsLayer::paused) { + sprite->setScale(.65f); + } else { + sprite->setScale(1.275f); + } + btnPointer->setSprite(sprite); // checks if the pause and play should be enabled From abc52724e05c26d879ea9416f6220145bbf09257 Mon Sep 17 00:00:00 2001 From: hbg1010 Date: Wed, 11 Dec 2024 13:06:29 -0500 Subject: [PATCH 47/53] Cleaned up file --- src/hooks/TimerPlayLayer.cpp | 30 ++++++++---------------------- 1 file changed, 8 insertions(+), 22 deletions(-) diff --git a/src/hooks/TimerPlayLayer.cpp b/src/hooks/TimerPlayLayer.cpp index edc6b12..911fd04 100644 --- a/src/hooks/TimerPlayLayer.cpp +++ b/src/hooks/TimerPlayLayer.cpp @@ -2,14 +2,19 @@ // changes the bool to true / false void TimerPlayLayer::pauseTimer(bool pauseState) { - log::debug("paused"); + // log::debug("paused"); m_fields->paused = pauseState; if (m_fields->paused) { m_fields->difference = m_fields->endtime - std::chrono::system_clock::now(); + log::debug("{}", m_fields->difference.count()); + } else { m_fields->endtime = std::chrono::system_clock::now() + m_fields->difference; + // auto x = std::chrono::system_clock::to_time_t(m_fields->endtime); + // // auto y = ; + // log::debug("time is now {}", std::ctime(&x)); } } @@ -23,16 +28,6 @@ void TimerPlayLayer::pauseTimer(bool pauseState) { m_fields->resetTimer(); - - // if (m_fields->useTimer) { - // // auto tp1 = std::chrono::system_clock::now(); - // // m_fields->starttime = std::chrono::system_clock::now(); - // // std::time_t time = std::chrono::system_clock::to_time_t(m_fields->endtime); - // // log::debug("TIme is {}", std::ctime(&time)); - // } - - - return true; } @@ -47,17 +42,10 @@ void TimerPlayLayer::pauseTimer(bool pauseState) { m_fields->useTimer = true; } - - log::debug("this ran!"); - - // condition. checks if current time > start time + 20min auto difference = m_fields->endtime - std::chrono::system_clock::now(); log::debug("{}", difference.count()); - /* - TODO: REVERSE INEQUALITY TO <= WHEN TESTING COMPLETE - */ + if (difference.count() <= 0) { - // calls the pause function. On windows, Pause (init) is out of line! PlayLayer::pauseGame(true); log::debug("{}", this->getID()); @@ -66,7 +54,5 @@ void TimerPlayLayer::pauseTimer(bool pauseState) { TimerEvent(true, this).post(); m_fields->resetTimer(); - } else { - log::debug("Timer not called! {}", difference.count()); - } + } } \ No newline at end of file From dcd4bf737f40fcf2eb0b520127383fd3bdd6ec55 Mon Sep 17 00:00:00 2001 From: hbg1010 Date: Wed, 11 Dec 2024 21:02:02 -0500 Subject: [PATCH 48/53] Updated changelog --- changelog.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/changelog.md b/changelog.md index ac32ed1..d72914a 100644 --- a/changelog.md +++ b/changelog.md @@ -1,10 +1,11 @@ -# 1.1.0 + +# 1.1.0-alpha1 +- inital testing release # 1.0.0 - Implemented Timer From fb7325f3740cf841826ec77e2a3d35fda6668252 Mon Sep 17 00:00:00 2001 From: hbg1010 Date: Wed, 11 Dec 2024 21:02:20 -0500 Subject: [PATCH 49/53] changed mod name and id --- mod.json | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/mod.json b/mod.json index 252de85..f0dc3f3 100644 --- a/mod.json +++ b/mod.json @@ -4,8 +4,8 @@ "gd": { "win": "2.2074" }, - "id": "hbg1010.20_20_20", - "name": "20 20 20", + "id": "hbg1010.break_mod", + "name": "Break Mod", "version": "v1.1.0-alpha.1", "developer": "Hbg1010", "description": "", @@ -17,11 +17,10 @@ } ], "resources": { - "spritesheets": { - "TL_ButtonSheet_001-uhd": [ - "resources/*.png" - ] - } + "sprites": [ + "resources/*.png" + ] + }, "settings": { @@ -75,5 +74,9 @@ "default": true, "description": "This setting enables or disables whether or not the timer is used in gameplay" } - } + }, + "tags":[ + "offline", + "universal" + ] } From fb61741e0971f58c6adf07ecd1b53b1567232662 Mon Sep 17 00:00:00 2001 From: hbg1010 Date: Wed, 11 Dec 2024 21:02:31 -0500 Subject: [PATCH 50/53] Reverted spritesheet change --- resources/TL_ButtonSheet_001-uhd.plist | 54 ------------------------- resources/TL_ButtonSheet_001-uhd.png | Bin 58812 -> 0 bytes resources/TM_replayBtn.png | Bin 0 -> 26611 bytes resources/TimerSettings.png | Bin 0 -> 23652 bytes 4 files changed, 54 deletions(-) delete mode 100644 resources/TL_ButtonSheet_001-uhd.plist delete mode 100644 resources/TL_ButtonSheet_001-uhd.png create mode 100644 resources/TM_replayBtn.png create mode 100644 resources/TimerSettings.png diff --git a/resources/TL_ButtonSheet_001-uhd.plist b/resources/TL_ButtonSheet_001-uhd.plist deleted file mode 100644 index c003e62..0000000 --- a/resources/TL_ButtonSheet_001-uhd.plist +++ /dev/null @@ -1,54 +0,0 @@ - - - - - frames - - TimerSettings.png - - aliases - - spriteOffset - {2,-3} - spriteSize - {180,182} - spriteSourceSize - {184,188} - textureRect - {{239,0},{180,182}} - textureRotated - - - TM_replayBtn.png - - aliases - - spriteOffset - {4,-7} - spriteSize - {238,244} - spriteSourceSize - {246,258} - textureRect - {{0,0},{238,244}} - textureRotated - - - - metadata - - format - 3 - pixelFormat - RGBA8888 - premultiplyAlpha - - realTextureFileName - TL_ButtonSheet_001-uhd.png - size - {419,244} - textureFileName - TL_ButtonSheet_001-uhd.png - - - \ No newline at end of file diff --git a/resources/TL_ButtonSheet_001-uhd.png b/resources/TL_ButtonSheet_001-uhd.png deleted file mode 100644 index b6f4a367e7364d2412635fa050fb009ffe9af3e1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 58812 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

UmNm8-~CPS_V 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ⅅT|m9j|t~36aE#oMq}`2cu$$o?dn6G-%BQ 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 aEUQO9+ci(eg)G8k1O(caA^ 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

%IJqKCa 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 z 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 literal 0 HcmV?d00001 From 2ffa204f6f1f8763a63fe93ea1c94b0a841334c8 Mon Sep 17 00:00:00 2001 From: hbg1010 Date: Wed, 11 Dec 2024 21:02:41 -0500 Subject: [PATCH 51/53] Began updating readme --- README.md | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 23fb2ca..e3f13b9 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,11 @@ -# 202020 +# Break mod -This mod +This mod reminds you to take breaks while playing levels or using the editor! the mod's logo -## Getting started -We recommend heading over to [the getting started section on our docs](https://docs.geode-sdk.org/getting-started/) for useful info on what to do next. - ## Build instructions For more info, see [our docs](https://docs.geode-sdk.org/getting-started/create-mod#build) ```sh @@ -16,4 +13,4 @@ For more info, see [our docs](https://docs.geode-sdk.org/getting-started/create- geode build ``` -# 20-20-20-Geode +# break-mod-Geode From 473afb195e927967882cb72e8a6e8689e6a5ef37 Mon Sep 17 00:00:00 2001 From: hbg1010 Date: Wed, 11 Dec 2024 21:02:56 -0500 Subject: [PATCH 52/53] Commented debug code --- src/timer/EditorTimer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/timer/EditorTimer.cpp b/src/timer/EditorTimer.cpp index 78372f2..99d190d 100644 --- a/src/timer/EditorTimer.cpp +++ b/src/timer/EditorTimer.cpp @@ -11,7 +11,7 @@ EditorTimerTask startEditorTimer(int time) { if (hasBeenCancelled()) { return EditorTimerTask::Cancel(); } - log::debug("{}", time - i); + // log::debug("{}", time - i); progress(time - i); std::this_thread::sleep_for(std::chrono::seconds(1)); } From 7f5d4751c5222bb1dc1f56401f098f35bc95867f Mon Sep 17 00:00:00 2001 From: hbg1010 Date: Wed, 11 Dec 2024 21:03:18 -0500 Subject: [PATCH 53/53] Changed layer to be headed by Break Time --- src/timer/TimerLayer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/timer/TimerLayer.cpp b/src/timer/TimerLayer.cpp index a033dfe..c10c0bd 100644 --- a/src/timer/TimerLayer.cpp +++ b/src/timer/TimerLayer.cpp @@ -61,7 +61,7 @@ TimerLayer* TimerLayer::create(std::string const& waitTime) { bool TimerLayer::setup(std::string const& waitTime) { CCSize screenSize = CCDirector::sharedDirector()->getWinSize(); currentCount = std::stoi(waitTime); - this->setTitle("20 20 20"); + this->setTitle("Break Time!"); m_closeBtn->setScale(0.5f); // m_closeBtn->setPosition(screenSize.width*2, screenSize.height * 3 / 4);