From c469474e5d2ba90b66786797010b0b4f6992653c Mon Sep 17 00:00:00 2001 From: ZIlko <69888540+ZiLko@users.noreply.github.com> Date: Fri, 2 Feb 2024 12:20:25 -0600 Subject: [PATCH] Update main.cpp --- src/main.cpp | 176 ++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 133 insertions(+), 43 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 4818222..b1c24ce 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -17,7 +17,13 @@ bool restart = false; bool stepFrame = false; double prevSpeed = 1.0f; bool safeModeEnabled = false; -bool playerHolding; +bool playerHolding = false; +bool lastHold = false; +bool shouldPlay = false; +bool shouldPlay2 = false; + +CCLabelBMFont* frameLabel = nullptr; +CCLabelBMFont* stateLabel = nullptr; using namespace geode::prelude; @@ -502,7 +508,20 @@ void clearState(bool safeMode) { FMODAudioEngine::sharedEngine()->m_system->getMasterChannelGroup(&channel); channel->setPitch(1); recorder.state = state::off; + leftOver = 0.f; + if (PlayLayer::get()) { + CCArray* children = PlayLayer::get()->getChildren(); + CCObject* child; + CCARRAY_FOREACH(children, child) { + CCLabelBMFont* lbl = dynamic_cast(child); + if (lbl) { + if (lbl->getID() == "frameLabel" || lbl->getID() == "stateLabel") lbl->removeFromParentAndCleanup(true); + } + } + } + frameLabel = nullptr; + stateLabel = nullptr; Mod::get()->setSettingValue("frame_stepper", false); if (!safeMode) { safeModeEnabled = false; @@ -510,7 +529,7 @@ void clearState(bool safeMode) { } } - // ---------------- Hooks ---------------- // + // ---------------- Hooks ---------------- 539// class $modify(PauseLayer) { void customSetup() { @@ -561,6 +580,23 @@ class $modify(PauseLayer) { }; +void addLabel(const char* text) { + auto label = CCLabelBMFont::create(text, "chatFont.fnt"); + auto winSize = CCDirector::sharedDirector()->getWinSize(); + label->setScale(0.7f); + if (text != "Frame: 0") { + stateLabel = label; + label->setID("stateLabel"); + label->setPosition(winSize/2 + CCPOINT_CREATE(winSize.width/2, -winSize.height/2) + CCPOINT_CREATE(-31, 12)); + } else { + label->setAnchorPoint(CCPOINT_CREATE(0.0f,0.5f)); + label->setID("frameLabel"); + frameLabel = label; + label->setPosition(winSize/2 + CCPOINT_CREATE(-winSize.width/2, -winSize.height/2) + CCPOINT_CREATE(6, 12)); + } + PlayLayer::get()->addChild(label); +} + class $modify(GJBaseGameLayer) { void handleButton(bool holding, int button, bool player1) { GJBaseGameLayer::handleButton(holding,button,player1); @@ -573,18 +609,18 @@ class $modify(GJBaseGameLayer) { this->m_player1->getPositionX(), this->m_player1->getPositionY(), this->m_player1->m_isUpsideDown, - this->m_player1->getRotationX(), - -50085, - -50085 + -80085, + -80085, + -80085 }; if (this->m_player2 != nullptr) { p2 = { this->m_player2->getPositionX(), this->m_player2->getPositionY(), this->m_player2->m_isUpsideDown, - this->m_player2->getRotationX(), - -50085, - -50085 + -80085, + -80085, + -80085 }; } else { p2.xPos = 0; @@ -599,7 +635,35 @@ class $modify(GJBaseGameLayer) { void update(float dt) { + if (recorder.state != state::off) { + if (frameLabel != nullptr) { + if (Mod::get()->getSettingValue("show_frame_label")) + frameLabel->setString(("Frame: " + std::to_string(recorder.currentFrame())).c_str()); + else { + frameLabel->removeFromParent(); + frameLabel = nullptr; + } + } else if (Mod::get()->getSettingValue("show_frame_label")) { + addLabel("Frame: 0"); + } + } else if (shouldPlay) { + if (recorder.currentFrame() == 0) { + shouldPlay = false; + recorder.state = state::playing; + PlayLayer::get()->resetLevel(); + } + } if (recorder.state == state::recording) { + if (stateLabel != nullptr) { + if (stateLabel->getString() != "Recording" && Mod::get()->getSettingValue("show_recording_label")) + stateLabel->setString("Recording"); + else if (!Mod::get()->getSettingValue("show_recording_label")) { + stateLabel->removeFromParent(); + stateLabel = nullptr; + } + } else if (Mod::get()->getSettingValue("show_recording_label")) { + addLabel("Recording"); + } if (Mod::get()->getSettingValue("frame_stepper") && stepFrame == false) return; else if (stepFrame) { @@ -610,9 +674,8 @@ class $modify(GJBaseGameLayer) { true, 0 ); - } - } - GJBaseGameLayer::update(dt); + } else GJBaseGameLayer::update(dt); + } else GJBaseGameLayer::update(dt); } }; @@ -628,9 +691,9 @@ void GJBaseGameLayerProcessCommands(GJBaseGameLayer* self) { self->m_player1->getPositionX(), self->m_player1->getPositionY(), self->m_player1->m_isUpsideDown, - self->m_player1->getRotationX(), - -50085, - -50085 + -80085, + -80085, + -80085 }; playerData p2; if (self->m_player2 != nullptr) { @@ -638,9 +701,9 @@ void GJBaseGameLayerProcessCommands(GJBaseGameLayer* self) { self->m_player2->getPositionX(), self->m_player2->getPositionY(), self->m_player2->m_isUpsideDown, - self->m_player2->getRotationX(), - -50085, - -50085 + -80085, + -80085, + -80085 }; } else { p2.xPos = 0; @@ -651,6 +714,16 @@ void GJBaseGameLayerProcessCommands(GJBaseGameLayer* self) { } if (recorder.state == state::playing) { + if (stateLabel != nullptr) { + if (stateLabel->getString() != "Playing" && Mod::get()->getSettingValue("show_playing_label")) + stateLabel->setString("Playing"); + else if (!Mod::get()->getSettingValue("show_playing_label")) { + stateLabel->removeFromParent(); + stateLabel = nullptr; + } + } else if (Mod::get()->getSettingValue("show_playing_label")) { + addLabel("Playing"); + } int frame = recorder.currentFrame(); while (recorder.currentAction < static_cast(recorder.macro.size()) && frame >= recorder.macro[recorder.currentAction].frame && !self->m_player1->m_isDead) { @@ -660,38 +733,42 @@ void GJBaseGameLayerProcessCommands(GJBaseGameLayer* self) { safeModeEnabled = true; safeMode::updateSafeMode(); } - - if (currentActionIndex.p1.xPos != 0) { - if (self->m_player1->getPositionX() != currentActionIndex.p1.xPos || - self->m_player1->getPositionY() != currentActionIndex.p1.yPos) - self->m_player1->setPosition(cocos2d::CCPoint(currentActionIndex.p1.xPos, currentActionIndex.p1.yPos)); - - if (self->m_player1->m_isUpsideDown != currentActionIndex.p1.upsideDown && currentActionIndex.posOnly) - self->m_player1->flipGravity(currentActionIndex.p1.upsideDown, true); - - if (self->m_player1->getRotationX() != currentActionIndex.p1.rotation && currentActionIndex.p1.rotation >= 0) - self->m_player1->setRotationX(currentActionIndex.p1.rotation); - - if (currentActionIndex.p2.xPos != 0 && self->m_player2 != nullptr) { - if (self->m_player2->getPositionX() != currentActionIndex.p2.xPos || - self->m_player2->getPositionY() != currentActionIndex.p2.yPos) - self->m_player2->setPosition(cocos2d::CCPoint(currentActionIndex.p2.xPos, currentActionIndex.p2.yPos)); - - if (self->m_player2->m_isUpsideDown != currentActionIndex.p2.upsideDown && currentActionIndex.posOnly) - self->m_player2->flipGravity(currentActionIndex.p1.upsideDown, true); - - if (self->m_player2->getRotationX() != currentActionIndex.p2.rotation && currentActionIndex.p2.rotation >= 0) - self->m_player2->setRotationX(currentActionIndex.p2.rotation); + if (currentActionIndex.p1.xPos != 0 && (!Mod::get()->getSettingValue("vanilla") || Mod::get()->getSettingValue("frame_fix"))) { + if (((!Mod::get()->getSettingValue("vanilla") && !Mod::get()->getSettingValue("frame_fix")) && lastHold) + || Mod::get()->getSettingValue("frame_fix")) { + if (self->m_player1->getPositionX() != currentActionIndex.p1.xPos || + self->m_player1->getPositionY() != currentActionIndex.p1.yPos) + self->m_player1->setPosition(cocos2d::CCPoint(currentActionIndex.p1.xPos, currentActionIndex.p1.yPos)); + + if (self->m_player1->m_isUpsideDown != currentActionIndex.p1.upsideDown && currentActionIndex.posOnly) + self->m_player1->flipGravity(currentActionIndex.p1.upsideDown, true); + + + if (currentActionIndex.p2.xPos != 0 && self->m_player2 != nullptr) { + if (self->m_player2->getPositionX() != currentActionIndex.p2.xPos || + self->m_player2->getPositionY() != currentActionIndex.p2.yPos) + self->m_player2->setPosition(cocos2d::CCPoint(currentActionIndex.p2.xPos, currentActionIndex.p2.yPos)); + + if (self->m_player2->m_isUpsideDown != currentActionIndex.p2.upsideDown && currentActionIndex.posOnly) + self->m_player2->flipGravity(currentActionIndex.p1.upsideDown, true); + + } } } - if (!currentActionIndex.posOnly) + if (!currentActionIndex.posOnly) { self->handleButton(currentActionIndex.holding, currentActionIndex.button, currentActionIndex.player1); + if (currentActionIndex.holding) lastHold = true; + else lastHold = false; + } recorder.currentAction++; } - if (recorder.currentAction >= recorder.macro.size()) clearState(true); - } + if (recorder.currentAction >= recorder.macro.size()) { + if (stateLabel!=nullptr) stateLabel->removeFromParent(); + clearState(true); + } + } reinterpret_cast(base::get() + 0x1BD240)(self); } @@ -702,7 +779,7 @@ class $modify(PlayLayer) { leftOver = 0.f; restart = false; } - + safeModeEnabled = false; playerHolding = false; safeMode::updateSafeMode(); @@ -738,6 +815,10 @@ class $modify(PlayLayer) { void levelComplete() { PlayLayer::levelComplete(); + if (stateLabel!=nullptr) stateLabel->removeFromParent(); + if (recorder.state == state::recording) + shouldPlay2 = true; + clearState(true); } }; @@ -745,6 +826,11 @@ class $modify(PlayLayer) { class $modify(EndLevelLayer) { void onReplay(CCObject* s) { EndLevelLayer::onReplay(s); + if (shouldPlay2 && Mod::get()->getSettingValue("auto_enable_play")) { + shouldPlay2 = false; + shouldPlay = true; + } + clearState(false); } @@ -799,6 +885,7 @@ class $modify(CCKeyboardDispatcher) { Mod::get()->setSettingValue("speedhack", prevSpeed); else { prevSpeed = Mod::get()->getSettingValue("speedhack"); + Mod::get()->setSavedValue("previous_speed", prevSpeed); Mod::get()->setSettingValue("speedhack", 1.0); } } @@ -826,6 +913,9 @@ class $modify(CCKeyboardDispatcher) { }; $execute { + if (Mod::get()->getSavedValue("previous_speed")) + prevSpeed = Mod::get()->getSavedValue("previous_speed"); + Mod::get()->hook(reinterpret_cast(base::get() + 0x1BD240), &GJBaseGameLayerProcessCommands, "GJBaseGameLayer::processCommands", tulip::hook::TulipConvention::Thiscall); for (std::size_t i = 0; i < 15; i++) { safeMode::patches[i] = Mod::get()->patch(reinterpret_cast(base::get() + std::get<0>(safeMode::codes[i])),