1
0
mirror of https://github.com/0O0o0oOoO00/Alas.git synced 2026-05-14 14:39:25 +08:00

add: pause lua state when setting better global speedup rate

This commit is contained in:
0O0o0oOoO00
2025-11-21 17:42:16 +08:00
parent e94bb9895e
commit fdda0b1e8c
4 changed files with 38 additions and 4 deletions

View File

@@ -641,6 +641,10 @@ void Cracker::print_value(std::vector<std::string>& path) {
}
}
void Cracker::better_global_speedup_pause(bool is_need) {
m_better_global_speedup_need_pause.store(is_need);
}
void Cracker::load_lua_resources() {
SPDLOG_INFO("Load lua resources");
@@ -966,6 +970,7 @@ void Cracker::hook_all_lua_functions() {
m_state["ys"]["Battle"]["BattleState"]["ExitBattle"] = [this](sol::this_state L, Lua::VariadicArgs args) {
m_original.ys_Battle_BattleState_ExitBattle(L, args);
if (IS_ENABLED(BETTER_GLOBAL_SPEEDUP)) {
better_global_speedup_pause(false);
better_global_speedup_set_rate(m_better_global_speedup_rate.load());
}
};
@@ -973,6 +978,7 @@ void Cracker::hook_all_lua_functions() {
m_state["ys"]["Battle"]["BattleState"]["ScaleTimer"] = [this](sol::this_state L, Lua::VariadicArgs args) {
m_original.ys_Battle_BattleState_ScaleTimer(L, args);
if (IS_ENABLED(BETTER_GLOBAL_SPEEDUP)) {
better_global_speedup_pause(false);
better_global_speedup_set_rate(m_better_global_speedup_rate.load());
}
};
@@ -1452,6 +1458,20 @@ void Cracker::hook_all_lua_functions() {
}
void Cracker::better_global_speedup_set_rate(double rate) {
if (m_better_global_speedup_need_pause.load()) {
better_global_speedup_set_rate_with_pause(rate);
} else {
better_global_speedup_set_rate_without_pause(rate);
}
}
void Cracker::better_global_speedup_set_rate_with_pause(double rate) {
LUA_STATUS_PAUSER_GUARD();
m_state["ys"]["Battle"]["BattleConfig"]["BASIC_TIME_SCALE"] = rate;
m_state["Time"]["timeScale"] = rate;
}
void Cracker::better_global_speedup_set_rate_without_pause(double rate) {
m_state["ys"]["Battle"]["BattleConfig"]["BASIC_TIME_SCALE"] = rate;
m_state["Time"]["timeScale"] = rate;
}

View File

@@ -256,11 +256,16 @@ public:
void print_table_field(std::vector<std::string>& path);
void print_value(std::vector<std::string>& path);
void better_global_speedup_pause(bool is_need);
Config get_config();
void apply_config(Config& config);
private:
void better_global_speedup_set_rate_with_pause(double rate);
void better_global_speedup_set_rate_without_pause(double rate);
void load_cracker_with_pause();
void load_cracker_without_pause();
@@ -436,6 +441,7 @@ private:
std::atomic<float> m_global_speedup_rate = 1.0;
std::atomic<double> m_better_global_speedup_rate = 1.0;
LuaStatePauser m_lua_state_pauser;
std::atomic<bool> m_better_global_speedup_need_pause = false;
};
#endif //CRACKER_HPP

View File

@@ -794,7 +794,9 @@ CrackerServer::CrackerServer() {
Post("/enable_better_global_speedup", [](const httplib::Request& req, httplib::Response& res) {
try {
Cracker::Instance().enable_better_global_speedup();
auto& ins = Cracker::Instance();
ins.better_global_speedup_pause(true);
ins.enable_better_global_speedup();
} catch (std::exception& e) {
SPDLOG_ERROR("Enable better global speedup failed: {}", e.what());
res.status = 500;
@@ -808,7 +810,9 @@ CrackerServer::CrackerServer() {
Json::Reader reader;
Json::Value j;
reader.parse(req.body, j);
Cracker::Instance().update_better_global_speedup_rate(j["rate"].asDouble());
auto& ins = Cracker::Instance();
ins.better_global_speedup_pause(true);
ins.update_better_global_speedup_rate(j["rate"].asDouble());
} catch (std::exception& e) {
SPDLOG_ERROR("Update better global speedup rate failed: {}", e.what());
res.status = 500;
@@ -819,7 +823,9 @@ CrackerServer::CrackerServer() {
Post("/disable_better_global_speedup", [](const httplib::Request& req, httplib::Response& res) {
try {
Cracker::Instance().disable_better_global_speedup();
auto& ins = Cracker::Instance();
ins.better_global_speedup_pause(true);
ins.disable_better_global_speedup();
} catch (std::exception& e) {
SPDLOG_ERROR("Disable better global speedup failed: {}", e.what());
res.status = 500;

View File

@@ -85,7 +85,9 @@ void CrackerUI::draw_menu() {
}
ImGui::SameLine();
if(ImGui::Button("应用")) {
Cracker::Instance(false).apply_config(m_cracker_config);
auto& ins = Cracker::Instance(false);
ins.better_global_speedup_pause(false);
ins.apply_config(m_cracker_config);
}
ImGui::SameLine();
if(ImGui::Button("关闭UI")) {