Skip to content

Commit ca44282

Browse files
committed
real time mode and update gd.h
1 parent cd7524b commit ca44282

File tree

8 files changed

+67
-9
lines changed

8 files changed

+67
-9
lines changed

src/hooks.cpp

Lines changed: 38 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,21 +32,50 @@ void Hooks::init() {
3232
ADD_GD_HOOK(0x20D810, PlayLayer::onQuit);
3333
ADD_GD_HOOK(0x1E60E0, PlayLayer::onEditor);
3434

35+
ADD_GD_HOOK(0x205460, PlayLayer::updateVisiblity);
36+
3537
ADD_GD_HOOK(0x1E4620, PauseLayer_init);
3638

3739
ADD_GD_HOOK(0x1f4ff0, PlayerObject_ringJump);
3840
ADD_GD_HOOK(0xef0e0, GameObject_activateObject);
3941
ADD_GD_HOOK(0x10ed50, GJBaseGameLayer_bumpPlayer);
4042
}
4143

44+
// yes these are global, too lazy to store them in replaysystem or smth
45+
// not like theyre used anywhere else atm
46+
bool g_disable_render = false;
47+
float g_left_over = 0.f;
48+
4249
void __fastcall Hooks::CCScheduler_update_H(CCScheduler* self, int, float dt) {
4350
auto& rs = ReplaySystem::get_instance();
4451
if (rs.is_playing() || rs.is_recording() && gd::GameManager::sharedState()->getPlayLayer()) {
45-
auto fps = rs.get_replay().get_fps();
52+
const auto fps = rs.get_replay().get_fps();
4653
auto speedhack = self->getTimeScale();
47-
dt = 1.f / fps / speedhack;
54+
55+
const float target_dt = 1.f / fps / speedhack;
56+
57+
if (!rs.real_time_mode)
58+
return CCScheduler_update(self, target_dt);
59+
60+
// todo: find ways to disable more render stuff
61+
g_disable_render = true;
62+
63+
// TODO: not have this min()
64+
// doing the commented out if below causes really weird stutters for some reason
65+
const int times = min(static_cast<int>((dt + g_left_over) / target_dt), 150);
66+
// if the fps is really low then dont run it a lot of times
67+
// if (dt > 1.f / 10.f) {
68+
// times = min(times, 100);
69+
// }
70+
for (int i = 0; i < times; ++i) {
71+
if (i == times - 1)
72+
g_disable_render = false;
73+
CCScheduler_update(self, target_dt);
74+
}
75+
g_left_over += dt - target_dt * times;
76+
} else {
77+
CCScheduler_update(self, dt);
4878
}
49-
CCScheduler_update(self, dt);
5079
}
5180

5281
void __fastcall Hooks::CCKeyboardDispatcher_dispatchKeyboardMSG_H(CCKeyboardDispatcher* self, int, int key, bool down) {
@@ -211,4 +240,9 @@ void __fastcall Hooks::GJBaseGameLayer_bumpPlayer_H(gd::GJBaseGameLayer* self, i
211240
bool b = object->m_hasBeenActivatedP2;
212241
GJBaseGameLayer_bumpPlayer(self, player, object);
213242
_handle_activated_object(a, b, object);
214-
}
243+
}
244+
245+
void __fastcall Hooks::PlayLayer::updateVisiblity_H(gd::PlayLayer* self, int) {
246+
if (!g_disable_render)
247+
updateVisiblity(self);
248+
}

src/hooks.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ namespace Hooks {
3030
// maybe hook the destructor instead ?
3131
_THISCALL_HOOK(onQuit, void*, gd::PlayLayer)
3232
_THISCALL_HOOK(onEditor, void*, gd::PlayLayer, void*)
33+
34+
_THISCALL_HOOK(updateVisiblity, void, gd::PlayLayer)
3335
}
3436

3537
_THISCALL_HOOK(PauseLayer_init, bool, gd::PauseLayer)

src/overlay_layer.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,17 @@ bool OverlayLayer::init() {
9999
label->setPosition({win_size.width - 55, win_size.height - 155});
100100
addChild(label);
101101

102+
auto toggle = gd::CCMenuItemToggler::create(check_off_sprite, check_on_sprite, this, menu_selector(OverlayLayer::on_toggle_real_time));
103+
toggle->setPosition({win_size.width - 35, -190});
104+
toggle->toggle(rs.real_time_mode);
105+
menu->addChild(toggle);
106+
107+
label = CCLabelBMFont::create("Real Time", "bigFont.fnt");
108+
label->setAnchorPoint({1, 0.5});
109+
label->setScale(0.8f);
110+
label->setPosition({win_size.width - 55, win_size.height - 190});
111+
addChild(label);
112+
102113
sprite = CCSprite::create("square02b_001.png");
103114
sprite->setColor({0, 0, 0});
104115
sprite->setOpacity(69);
@@ -245,4 +256,11 @@ void OverlayLayer::on_frame(CCObject*) {
245256
m_x_pos_toggle->toggle(false);
246257
m_frame_toggle->toggle(false);
247258
ReplaySystem::get_instance().set_default_type(ReplayType::FRAME);
259+
}
260+
261+
void OverlayLayer::on_toggle_real_time(CCObject* toggle_) {
262+
auto toggle = cast<gd::CCMenuItemToggler*>(toggle_);
263+
if (toggle != nullptr) {
264+
ReplaySystem::get_instance().real_time_mode = !toggle->isOn(); // why is it flipped
265+
}
248266
}

src/overlay_layer.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@ class OverlayLayer : public gd::FLAlertLayer, public CCTextFieldDelegate, public
4242
void on_x_pos(CCObject*);
4343
void on_frame(CCObject*);
4444

45+
void on_toggle_real_time(CCObject*);
46+
4547
virtual void keyBackClicked();
4648
virtual void keyDown(enumKeyCodes key) {
4749
// keyDown overwrites keyBackClicked, how fun

src/practice_fixes.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,10 @@ struct CheckpointData {
77
float rotation;
88
bool buffer_orb;
99
static CheckpointData from_player(gd::PlayerObject* player) {
10-
return { player->yAccel, player->getRotation(), player->canBufferOrb };
10+
return { player->m_yAccel, player->getRotation(), player->m_hasJustHeld };
1111
};
1212
void apply(gd::PlayerObject* player) {
13-
player->yAccel = y_accel;
13+
player->m_yAccel = y_accel;
1414
player->setRotation(rotation);
1515
}
1616
};

src/replay_system.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,13 +64,13 @@ void ReplaySystem::on_reset() {
6464
else
6565
replay.remove_actions_after(get_frame());
6666
const auto& actions = replay.get_actions();
67-
bool holding = play_layer->m_player1->isActuallyHolding;
67+
bool holding = play_layer->m_player1->m_isHolding;
6868
if ((holding && actions.empty()) || (!actions.empty() && actions.back().hold != holding)) {
6969
record_action(holding, true, false);
7070
if (holding) {
7171
Hooks::PlayLayer::releaseButton(play_layer, 0, true);
7272
Hooks::PlayLayer::pushButton(play_layer, 0, true);
73-
play_layer->m_player1->canBufferOrb = true;
73+
play_layer->m_player1->m_hasJustHeld = true;
7474
}
7575
} else if (!actions.empty() && actions.back().hold && holding && !practice_fixes.checkpoints.empty() && practice_fixes.checkpoints.top().player1.buffer_orb) {
7676
Hooks::PlayLayer::releaseButton(play_layer, 0, true);

src/replay_system.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,4 +76,6 @@ class ReplaySystem {
7676
inline void set_frame_advance(bool b) { frame_advance = b; }
7777

7878
unsigned get_frame();
79+
80+
bool real_time_mode = true; // fuck it we going public
7981
};

0 commit comments

Comments
 (0)