diff --git a/src/hooks.cpp b/src/hooks.cpp index edbaf0e..7489414 100644 --- a/src/hooks.cpp +++ b/src/hooks.cpp @@ -93,6 +93,7 @@ class $modify(FMODAudioEngine) { float left_over = 0.f; bool disable_render = false; +bool need_to_stop = false; class $modify(PlayLayer) { struct Fields { @@ -329,7 +330,7 @@ class $modify(PlayLayer) { auto& engine = ReplayEngine::get(); PlayLayer::resetLevel(); - engine.handle_reset(this); + engine.handle_reset(); if (config.get("no_do_not_flip", false) && m_attemptLabel) m_attemptLabel->setScaleY(1); @@ -439,11 +440,6 @@ class $modify(GJBaseGameLayer) { if (!config.get("tps_enabled", false)) return GJBaseGameLayer::update(dt); - if (!config.get("tps_enabled", false)) { - GJBaseGameLayer::update(dt); - return; - } - float tps_value = config.get("tps_value", 240.f); float newdt = 1.f / tps_value; @@ -455,6 +451,12 @@ class $modify(GJBaseGameLayer) { for (unsigned i = 0; i < times; ++i) { disable_render = (i != times - 1); + + if (need_to_stop) { + need_to_stop = false; + break; + } + GJBaseGameLayer::update(newdt); engine.handle_update(this); @@ -1037,4 +1039,18 @@ class $modify(LevelEditorLayer) { m_trailTimer = 0.1f; LevelEditorLayer::postUpdate(dt); } + + void onPlaytest() { + auto& engine = ReplayEngine::get(); + LevelEditorLayer::onPlaytest(); + + if (engine.mode == state::play) { + engine.handle_reset(); + } + } + + void onStopPlaytest() { + need_to_stop = true; + LevelEditorLayer::onStopPlaytest(); + } }; diff --git a/src/replayEngine.cpp b/src/replayEngine.cpp index 4145840..11218b1 100644 --- a/src/replayEngine.cpp +++ b/src/replayEngine.cpp @@ -174,7 +174,7 @@ void ReplayEngine::handle_update(GJBaseGameLayer* self) { } } -void ReplayEngine::handle_reset(GJBaseGameLayer* self) { +void ReplayEngine::handle_reset() { if (mode == state::record) { int lastCheckpointFrame = get_frame(); remove_actions(lastCheckpointFrame); diff --git a/src/replayEngine.hpp b/src/replayEngine.hpp index b005715..3b6d02a 100644 --- a/src/replayEngine.hpp +++ b/src/replayEngine.hpp @@ -51,7 +51,7 @@ class ReplayEngine { std::string clear(); void handle_update(GJBaseGameLayer* self); - void handle_reset(GJBaseGameLayer* self); + void handle_reset(); void handle_button(bool down, int button, bool isPlayer1); void auto_button_release();