Skip to content
This repository has been archived by the owner on Jun 18, 2024. It is now read-only.

Commit

Permalink
streamline recorder audio recording. fix a bunch of stuff using node ids
Browse files Browse the repository at this point in the history
  • Loading branch information
maxnut committed Mar 16, 2024
1 parent 36fb764 commit f984362
Show file tree
Hide file tree
Showing 5 changed files with 86 additions and 141 deletions.
11 changes: 9 additions & 2 deletions mod.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
"gd": {
"win": "2.204"
},
"version": "v2.8.5",
"version": "v2.8.6",
"id": "maxnu.gd_mega_overlay",
"name": "GD Mega Overlay",
"developers": ["maxnu", "SpaghettDev"],
Expand All @@ -18,5 +18,12 @@
"res/default_windows.json",
"res/shadow.png"
]
}
},
"dependencies": [
{
"id": "geode.node-ids",
"version": ">=v1.7.1",
"importance": "required"
}
]
}
15 changes: 2 additions & 13 deletions src/Hacks/HidePause.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,26 +20,15 @@ class $modify(CCScheduler)

if (playLayer)
{
auto uiLayer = reinterpret_cast<cocos2d::CCLayer*>(playLayer->getChildren()->objectAtIndex(8));

if (typeinfo_cast<EndLevelLayer*>(uiLayer))
uiLayer = reinterpret_cast<cocos2d::CCLayer*>(playLayer->getChildren()->objectAtIndex(9));

if (uiLayer && uiLayer->getChildrenCount() > 0)
reinterpret_cast<cocos2d::CCMenu*>(
uiLayer->getChildren()->objectAtIndex(0)
)->setVisible(!Settings::get<bool>("general/hide_pause/button"));
playLayer->getChildByID("UILayer")->getChildByID("pause-button-menu")->setVisible(!Settings::get<bool>("general/hide_pause/button"));


// bool m_isPaused; [PlayLayer + 0x2F17]
if (
MBO(bool, playLayer, 0x2F17) &&
runningScene && runningScene->getChildrenCount() > 1
) {
auto pauseLayer = reinterpret_cast<cocos2d::CCLayer*>(runningScene->getChildren()->objectAtIndex(1));

if (pauseLayer)
pauseLayer->setVisible(!Settings::get<bool>("general/hide_pause/menu"));
runningScene->getChildByID("PauseLayer")->setVisible(!Settings::get<bool>("general/hide_pause/menu"));
}
}

Expand Down
18 changes: 14 additions & 4 deletions src/Macrobot/Macrobot.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,12 @@ class $modify(PlayLayer)
checkpoints.clear();
}

void onExit()
{
botInput = false;
PlayLayer::onExit();
}

void loadFromCheckpoint(CheckpointObject * checkpoint)
{
resetFromStart = false;
Expand Down Expand Up @@ -141,8 +147,6 @@ class $modify(PlayerObject)
{
void pushButton(PlayerButton btn)
{
if ((playerMode == PLAYBACK && !botInput) || resetFrame)
return;
PlayerObject::pushButton(btn);

auto pl = PlayLayer::get();
Expand All @@ -158,8 +162,6 @@ class $modify(PlayerObject)

void releaseButton(PlayerButton btn)
{
if ((playerMode == PLAYBACK && !botInput) || resetFrame)
return;
PlayerObject::releaseButton(btn);

auto pl = PlayLayer::get();
Expand Down Expand Up @@ -220,6 +222,14 @@ class $modify(GJBaseGameLayer)

GJBaseGameLayer::update(dt);
}

void handleButton(bool down, int button, bool player1)
{
if ((playerMode == PLAYBACK && !botInput) || resetFrame)
return;

GJBaseGameLayer::handleButton(down, button, player1);
}
};

class $modify(CheckpointObject)
Expand Down
179 changes: 60 additions & 119 deletions src/Macrobot/Record.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,9 @@

#include "AudioRecord.h"
#include "Macrobot.h"
#include <Geode/cocos/platform/CCGL.h>
#include "portable-file-dialogs.h"

#include <Geode/cocos/platform/CCGL.h>
#include <Geode/binding/GJGameLevel.hpp>
#include <Geode/modify/PlayLayer.hpp>
#include <Geode/modify/ShaderLayer.hpp>
Expand Down Expand Up @@ -57,18 +58,9 @@ class $modify(PlayLayer)
PlayLayer::onQuit();
}

bool canPauseGame()
{
if(recorder.m_recording || recorder.m_recording_audio)
return false;

return PlayLayer::canPauseGame();
}

bool init(GJGameLevel* level, bool unk1, bool unk2)
{
bool res = PlayLayer::init(level, unk1, unk2);
endLevelLayer = nullptr;
return res;
}

Expand All @@ -85,15 +77,6 @@ class $modify(PlayLayer)
}
};

class $modify(EndLevelLayer)
{
void showLayer(bool unk)
{
endLevelLayer = this;
return EndLevelLayer::showLayer(unk);
}
};

class $modify(GJBaseGameLayer)
{
void update(float dt)
Expand All @@ -114,7 +97,7 @@ Recorder::Recorder()
void Recorder::start_audio()
{
std::string level_id = PlayLayer::get()->m_level->m_levelName.c_str() + ("_" + std::to_string(PlayLayer::get()->m_level->m_levelID.value()));
auto path = Mod::get()->getSaveDir() / "renders" / level_id / "rendered_video.mp4";
ghc::filesystem::path path = renderPath;
bool hasVideo = ghc::filesystem::exists(path);

if (!hasVideo)
Expand All @@ -129,6 +112,9 @@ void Recorder::start_audio()

recorder.m_recording_audio = true;

if (PlayLayer::get()->getChildByID("EndLevelLayer"))
PlayLayer::get()->getChildByID("EndLevelLayer")->removeFromParent();

PlayLayer::get()->stopAllActions();
MBO(float, PlayLayer::get(), 10960) = 0;//startgamedelayed
PlayLayer::get()->startGame();
Expand Down Expand Up @@ -186,37 +172,30 @@ void Recorder::start()
float afterEnd = Settings::get<float>("recorder/after_end", 3.4f);

m_after_end_extra_time = 0.f;
m_after_end_duration = afterEnd; // hacks.afterEndDuration;
m_after_end_duration = afterEnd;
m_renderer.m_width = m_width;
m_renderer.m_height = m_height;
m_renderer.begin();
tfx = 0;

m_song_start_offset = PlayLayer::get()->m_levelSettings->m_songOffset;

if (PlayLayer::get()->getChildByID("EndLevelLayer"))
PlayLayer::get()->getChildByID("EndLevelLayer")->removeFromParent();

PlayLayer::get()->stopAllActions();
MBO(float, PlayLayer::get(), 10960) = 0;//startgamedelayed
PlayLayer::get()->startGame();
PlayLayer::get()->resetLevelFromStart();

std::string level_id = PlayLayer::get()->m_level->m_levelName.c_str() + ("_" + std::to_string(PlayLayer::get()->m_level->m_levelID.value()));
auto bg_volume = 1;
auto sfx_volume = 1;

auto song_offset = m_song_start_offset;

if (!ghc::filesystem::is_directory(Mod::get()->getSaveDir() / "renders" / level_id) ||
!ghc::filesystem::exists(Mod::get()->getSaveDir() / "renders" / level_id))
{
ghc::filesystem::create_directory(Mod::get()->getSaveDir() / "renders" / level_id);
}

if (m_recording_audio)
return;

std::thread([&, bg_volume, sfx_volume, song_offset, level_id]()
std::thread([&, bg_volume, sfx_volume, song_offset]()
{
auto renderedVideo = (Mod::get()->getSaveDir() / "renders" / level_id / "rendered_video.mp4");
ghc::filesystem::path renderedVideo = renderPath;

{
std::stringstream stream;
Expand Down Expand Up @@ -270,7 +249,6 @@ void Recorder::start()

void Recorder::stop()
{
Common::showWithPriority(FLAlertLayer::create("Info", "Macro rendererd successfully!", "Ok"));
m_renderer.end();
m_recording = false;
}
Expand Down Expand Up @@ -341,20 +319,12 @@ void Recorder::capture_frame()

void Recorder::stop_audio()
{
Common::showWithPriority(FLAlertLayer::create("Info", "Sound recorded successfully!", "Ok"));
Common::showWithPriority(FLAlertLayer::create("Info", "Macro and sound rendererd successfully!", "Ok"));
AudioRecord::stop();
m_recording_audio = false;

GJGameLevel *level =
GameManager::get()
->getPlayLayer()
->m_level; // MBO(gd::GJGameLevel*, PlayLayer::get(), 1504); // found in playlayer_init

std::string level_id = PlayLayer::get()->m_level->m_levelName.c_str() + ("_" + std::to_string(PlayLayer::get()->m_level->m_levelID.value()));

ghc::filesystem::path video_path = Mod::get()->getSaveDir() / "renders" / level_id / "rendered_video.mp4";

ghc::filesystem::path temp_path = Mod::get()->getSaveDir() / "renders" / level_id / "music.mp4";
ghc::filesystem::path video_path = renderPath;
ghc::filesystem::path temp_path = video_path.parent_path() / "music.mp4";

std::stringstream ss;

Expand Down Expand Up @@ -406,10 +376,7 @@ void Recorder::handle_recording(GJBaseGameLayer *play_layer, float dt)
m_after_end_extra_time += dt;
m_finished_level = true;
}

/* if (!play_layer->m_hasCompletedLevel)
tfx = play_layer->timeForXPos(play_layer->m_pPlayer1->getPositionX());
else */

tfx += dt;
float timewarp = MBO(float, PlayLayer::get(), 724);

Expand Down Expand Up @@ -447,96 +414,70 @@ void Recorder::handle_recording(GJBaseGameLayer *play_layer, float dt)
else
{
stop();

if(Settings::get<bool>("recorder/record_audio", false))
start_audio();
else
Common::showWithPriority(FLAlertLayer::create("Info", "Macro rendererd successfully!", "Ok"));
}
}

void Record::renderWindow()
{
bool disabled = !PlayLayer::get() || levelDone || Record::recorder.m_recording_audio || Record::recorder.m_recording || Macrobot::macro.inputs.size() <= 0 || Macrobot::playerMode != 0;
if (disabled)
ImGui::BeginDisabled();

if (GUI::button("Start Recording"))
if(recorder.m_recording || recorder.m_recording_audio)
{
if (!ghc::filesystem::exists("ffmpeg.exe"))
if (GUI::button("Stop Recording"))
{
auto process = subprocess::Popen(string::wideToUtf8((Mod::get()->getResourcesDir() / "get_ffmpeg.exe").wstring()));
try
{
process.close();
}
catch (const std::exception &e)
{
std::cout << e.what() << '\n';
}
if(recorder.m_recording)
recorder.stop();
else if(recorder.m_recording_audio)
recorder.stop_audio();
}
if (ghc::filesystem::exists("ffmpeg.exe"))
Record::recorder.start();
else
Common::showWithPriority(FLAlertLayer::create("Error", "FFmpeg not found", "Ok"));
}
else
{
bool disabled = !PlayLayer::get() || Macrobot::macro.inputs.size() <= 0 || Macrobot::playerMode != 0;

if (GUI::shouldRender() && disabled && ImGui::IsItemHovered())
ImGui::SetTooltip("You need to be playing a macro to record");

if (disabled)
ImGui::EndDisabled();

disabled = !PlayLayer::get() || levelDone || Record::recorder.m_recording_audio || !Record::recorder.m_recording || Macrobot::macro.inputs.size() <= 0 || Macrobot::playerMode != 0;
if (disabled)
ImGui::BeginDisabled();

if (GUI::button("Stop Recording"))
Record::recorder.stop();

if (disabled)
ImGui::EndDisabled();

disabled = !PlayLayer::get() || levelDone || Record::recorder.m_recording || Record::recorder.m_recording_audio || Macrobot::macro.inputs.size() <= 0 || Macrobot::playerMode != 0;

if (disabled)
ImGui::BeginDisabled();
if(disabled)
ImGui::BeginDisabled();

if (GUI::button("Start Audio"))
{
if (!ghc::filesystem::exists("ffmpeg.exe"))
if (GUI::button("Start Recording"))
{
auto process = subprocess::Popen(string::wideToUtf8((Mod::get()->getResourcesDir() / "get_ffmpeg.exe").wstring()));
try
if (!ghc::filesystem::exists("ffmpeg.exe"))
{
process.close();
auto process = subprocess::Popen(string::wideToUtf8((Mod::get()->getResourcesDir() / "get_ffmpeg.exe").wstring()));
try
{
process.close();
}
catch (const std::exception &e)
{
std::cout << e.what() << '\n';
}
}
catch (const std::exception &e)

if (ghc::filesystem::exists("ffmpeg.exe"))
{
std::cout << e.what() << '\n';
renderPath = pfd::save_file("Save Render", string::wideToUtf8((Mod::get()->getSaveDir() / "renders").wstring()), { "Video Files", "*.mp4"}).result();

if(ghc::filesystem::path(renderPath).extension().string().empty())
renderPath.append(".mp4");

if(!renderPath.empty())
Record::recorder.start();
}
else
Common::showWithPriority(FLAlertLayer::create("Error", "FFmpeg not found", "Ok"));
}

if (ghc::filesystem::exists("ffmpeg.exe"))
recorder.start_audio();
else
Common::showWithPriority(FLAlertLayer::create("Error", "FFmpeg not found", "Ok"));
}

if (GUI::shouldRender() && disabled && ImGui::IsItemHovered())
ImGui::SetTooltip("You need to be playing a macro to record");

if (disabled)
ImGui::EndDisabled();

disabled = !PlayLayer::get() || levelDone || Record::recorder.m_recording || !Record::recorder.m_recording_audio || Macrobot::macro.inputs.size() <= 0 || Macrobot::playerMode != 0;

if (disabled)
ImGui::BeginDisabled();

if (GUI::button("Stop Audio") && Record::recorder.m_recording_audio)
{
recorder.m_recording_audio = false;
AudioRecord::stop();
if(disabled)
{
GUI::tooltip("You need to be playing a macro to record!");
ImGui::EndDisabled();
}
}

if (disabled)
ImGui::EndDisabled();
GUI::checkbox("Record audio", "recorder/record_audio");

int resolution[2];
resolution[0] = Settings::get<int>("recorder/resolution/x", 1920);
Expand Down
Loading

0 comments on commit f984362

Please sign in to comment.