From 3f5220bdec1d93f32a02b3ef19b8bc25db637341 Mon Sep 17 00:00:00 2001 From: korenkonder Date: Wed, 1 May 2024 22:07:46 +0300 Subject: [PATCH] Added `get_pause` --- src/CRE/effect.cpp | 2 +- src/CRE/render_context.cpp | 26 ++++--- src/CRE/rob/ex_block.cpp | 10 +-- src/CRE/static_var.cpp | 6 ++ src/CRE/static_var.hpp | 1 + src/ReDIVA/data_test/motion_test.cpp | 4 + src/ReDIVA/dw.cpp | 3 + src/ReDIVA/game_state.cpp | 106 ++++++++++++++------------- src/ReDIVA/game_state.hpp | 1 + src/ReDIVA/render.cpp | 6 +- 10 files changed, 98 insertions(+), 67 deletions(-) diff --git a/src/CRE/effect.cpp b/src/CRE/effect.cpp index 450d47e2..57cdc685 100644 --- a/src/CRE/effect.cpp +++ b/src/CRE/effect.cpp @@ -2744,7 +2744,7 @@ bool TaskEffectLitproj::init() { } bool TaskEffectLitproj::ctrl() { - if (!stage_param_data_litproj_current) + if (!stage_param_data_litproj_current || get_pause()) return false; light_data& light = rctx_ptr->light_set[LIGHT_SET_MAIN].lights[LIGHT_PROJECTION]; diff --git a/src/CRE/render_context.cpp b/src/CRE/render_context.cpp index e50223b4..9699d32c 100644 --- a/src/CRE/render_context.cpp +++ b/src/CRE/render_context.cpp @@ -616,17 +616,22 @@ render_context::~render_context() { } void render_context::ctrl() { - delta_frame_history += get_delta_frame(); - float_t v1; - delta_frame_history = modff(delta_frame_history, &v1); - delta_frame_history_int = (int32_t)v1; - if (delta_frame_history < 0.001f) - delta_frame_history = 0.0f; - else if (1.0f - delta_frame_history < 0.001f) - delta_frame_history_int++; + if (!get_pause()) { + delta_frame_history += get_delta_frame(); + float_t mod; + delta_frame_history = modff(delta_frame_history, &mod); + delta_frame_history_int = (int32_t)mod; + if (delta_frame_history < 0.001f) + delta_frame_history = 0.0f; + else if (1.0f - delta_frame_history < 0.001f) + delta_frame_history_int++; + } rctx_ptr = this; - app::TaskWork::ctrl(); + + extern bool game_state_get_pause(); + if (!get_pause() || !game_state_get_pause()) + app::TaskWork::ctrl(); sound_ctrl(); file_handler_storage_ctrl(); } @@ -650,7 +655,8 @@ void render_context::disp() { render.lens_flare_texture = 0; render.aet_back = 0; render_manager->field_31C = false; - app::TaskWork::basic(); + if (!get_pause()) + app::TaskWork::basic(); } void render_context::free() { diff --git a/src/CRE/rob/ex_block.cpp b/src/CRE/rob/ex_block.cpp index 452ece90..669234a7 100644 --- a/src/CRE/rob/ex_block.cpp +++ b/src/CRE/rob/ex_block.cpp @@ -3048,7 +3048,7 @@ static void sub_140218560(RobCloth* rob_cls, float_t step, bool a3) { } } - if (step > 0.0f) { + if (step > 0.0f && !get_pause()) { sub_1402187D0(rob_cls, a3); sub_140219D10(rob_cls); sub_14021AA60(rob_cls, step, false); @@ -3442,7 +3442,7 @@ static void sub_14047C800(RobOsage* rob_osg, const mat4* root_matrix, mat4_transform_vector(&v130, &v113, &v128); float_t v25 = parent_scale->x; - if (!rob_osg->osage_reset && step <= 0.0f) + if (!rob_osg->osage_reset && (get_pause() || step <= 0.0f)) return; bool stiffness = rob_osg->skin_param_ptr->stiffness > 0.0f; @@ -3724,7 +3724,7 @@ static void sub_140482F30(vec3* pos1, vec3* pos2, float_t length) { static void sub_14047D8C0(RobOsage* rob_osg, const mat4* root_matrix, const vec3* parent_scale, float_t step, bool a5) { - if (!rob_osg->osage_reset && step <= 0.0f) + if (!rob_osg->osage_reset && (get_pause() || step <= 0.0f)) return; OsageCollision::Work* coli = rob_osg->coli; @@ -3865,7 +3865,7 @@ static void sub_14047C770(RobOsage* rob_osg, const mat4* root_matrix, } static void sub_14047D620(RobOsage* rob_osg, float_t step) { - if (step < 0.0f && rob_osg->disable_collision) + if (get_pause() || step <= 0.0f || rob_osg->disable_collision) return; std::vector& nodes = rob_osg->nodes; @@ -3898,7 +3898,7 @@ static void sub_14047D620(RobOsage* rob_osg, float_t step) { } static void sub_14047ECA0(RobOsage* rob_osg, float_t step) { - if (step <= 0.0f) + if (get_pause() || step <= 0.0f) return; OsageCollision::Work* coli_ring = rob_osg->coli_ring; diff --git a/src/CRE/static_var.cpp b/src/CRE/static_var.cpp index 2c49726f..fdd384b3 100644 --- a/src/CRE/static_var.cpp +++ b/src/CRE/static_var.cpp @@ -16,6 +16,8 @@ bool sv_anisotropy_changed = false; int32_t sv_old_anisotropy = 1; int32_t sv_anisotropy = 1; +bool pause = false; + size_t frame_counter = 0; bool select_frame_speed = false; @@ -65,6 +67,10 @@ uint32_t get_frame_counter() { return (uint32_t)frame_counter; } +bool get_pause() { + return pause; +} + float_t get_target_anim_fps() { return target_anim_fps; } diff --git a/src/CRE/static_var.hpp b/src/CRE/static_var.hpp index 7bb66150..b2498ec4 100644 --- a/src/CRE/static_var.hpp +++ b/src/CRE/static_var.hpp @@ -121,5 +121,6 @@ extern void sv_anisotropy_set(int32_t value); extern float_t get_anim_frame_speed(); extern float_t get_delta_frame(); extern uint32_t get_frame_counter(); +extern bool get_pause(); extern float_t get_target_anim_fps(); extern void uniform_value_reset(); diff --git a/src/ReDIVA/data_test/motion_test.cpp b/src/ReDIVA/data_test/motion_test.cpp index cde7acfb..260ed0ca 100644 --- a/src/ReDIVA/data_test/motion_test.cpp +++ b/src/ReDIVA/data_test/motion_test.cpp @@ -878,6 +878,8 @@ void DataTestMotA3d::Sync1pFrame() { return; float_t frame = dtm_mot_array->GetFrame(); + if (get_pause()) + frame -= dtm_mot_array->GetStep(); for (auth_3d_id& i : auth_3d_ids) i.set_req_frame(frame); @@ -1171,6 +1173,8 @@ bool DtmMot::ctrl() { state = 7; break; } + else if (get_pause()) + break; rob_chara* rob_chr = rob_chara_array_get(chara_id); diff --git a/src/ReDIVA/dw.cpp b/src/ReDIVA/dw.cpp index a495930d..5bc0e25b 100644 --- a/src/ReDIVA/dw.cpp +++ b/src/ReDIVA/dw.cpp @@ -3406,6 +3406,9 @@ void struc_751::sub_140300A10() { if (key_input[1]) key_input[1] |= 0x40000000; + + if (get_pause()) + key_input[1] |= 0x10000000; } void struc_751::sub_1403011A0() { diff --git a/src/ReDIVA/game_state.cpp b/src/ReDIVA/game_state.cpp index 498c0f78..d4a7d39f 100644 --- a/src/ReDIVA/game_state.cpp +++ b/src/ReDIVA/game_state.cpp @@ -380,7 +380,7 @@ struct GameStateData { struct SubGameStateData { SubGameStateEnum sub_game_state; - int32_t field_4; + bool pause; bool(*Init)(); bool(*Ctrl)(); bool(*Dest)(); @@ -529,287 +529,287 @@ GameStateData game_state_data_array[] = { SubGameStateData sub_game_state_data_array[] = { { SUB_GAME_STATE_DATA_INITIALIZE, - 1, + true, SubGameState::DataInitialize::Init, SubGameState::DataInitialize::Ctrl, SubGameState::DataInitialize::Dest, }, { SUB_GAME_STATE_SYSTEM_STARTUP, - 1, + true, SubGameState::SystemStartup::Init, SubGameState::SystemStartup::Ctrl, SubGameState::SystemStartup::Dest, }, { SUB_GAME_STATE_SYSTEM_STARTUP_ERROR, - 1, + true, SubGameState::SystemStartupError::Init, SubGameState::SystemStartupError::Ctrl, SubGameState::SystemStartupError::Dest, }, { SUB_GAME_STATE_WARNING, - 1, + true, SubGameState::Warning::Init, SubGameState::Warning::Ctrl, SubGameState::Warning::Dest, }, { SUB_GAME_STATE_LOGO, - 1, + true, SubGameState::Logo::Init, SubGameState::Logo::Ctrl, SubGameState::Logo::Dest, }, { SUB_GAME_STATE_RATING, - 1, + true, SubGameState::Rating::Init, SubGameState::Rating::Ctrl, SubGameState::Rating::Dest, }, { SUB_GAME_STATE_DEMO, - 1, + true, SubGameState::Demo::Init, SubGameState::Demo::Ctrl, SubGameState::Demo::Dest, }, { SUB_GAME_STATE_TITLE, - 1, + true, SubGameState::Title::Init, SubGameState::Title::Ctrl, SubGameState::Title::Dest, }, { SUB_GAME_STATE_RANKING, - 1, + true, SubGameState::Ranking::Init, SubGameState::Ranking::Ctrl, SubGameState::Ranking::Dest, }, { SUB_GAME_STATE_SCORE_RANKING, - 1, + true, SubGameState::ScoreRanking::Init, SubGameState::ScoreRanking::Ctrl, SubGameState::ScoreRanking::Dest, }, { SUB_GAME_STATE_CM, - 1, + true, SubGameState::CM::Init, SubGameState::CM::Ctrl, SubGameState::CM::Dest, }, { SUB_GAME_STATE_PHOTO_MODE_DEMO, - 1, + true, SubGameState::PhotoModeDemo::Init, SubGameState::PhotoModeDemo::Ctrl, SubGameState::PhotoModeDemo::Dest, }, { SUB_GAME_STATE_SELECTOR, - 1, + true, SubGameState::Selector::Init, SubGameState::Selector::Ctrl, SubGameState::Selector::Dest, }, { SUB_GAME_STATE_GAME_MAIN, - 1, + true, SubGameState::GameMain::Init, SubGameState::GameMain::Ctrl, SubGameState::GameMain::Dest, }, { SUB_GAME_STATE_GAME_SEL, - 1, + true, SubGameState::GameSel::Init, SubGameState::GameSel::Ctrl, SubGameState::GameSel::Dest, }, { SUB_GAME_STATE_STAGE_RESULT, - 1, + true, SubGameState::StageResult::Init, SubGameState::StageResult::Ctrl, SubGameState::StageResult::Dest, }, { SUB_GAME_STATE_SCREEN_SHOT_SEL, - 1, + true, SubGameState::ScreenShotSel::Init, SubGameState::ScreenShotSel::Ctrl, SubGameState::ScreenShotSel::Dest, }, { SUB_GAME_STATE_SCREEN_SHOT_RESULT, - 1, + true, SubGameState::ScreenShotResult::Init, SubGameState::ScreenShotResult::Ctrl, SubGameState::ScreenShotResult::Dest, }, { SUB_GAME_STATE_GAME_OVER, - 1, + true, SubGameState::GameOver::Init, SubGameState::GameOver::Ctrl, SubGameState::GameOver::Dest, }, { SUB_GAME_STATE_DATA_TEST_MAIN, - 1, + true, SubGameState::DataTestMain::Init, SubGameState::DataTestMain::Ctrl, SubGameState::DataTestMain::Dest, }, { SUB_GAME_STATE_DATA_TEST_MISC, - 1, + true, SubGameState::DataTestMisc::Init, SubGameState::DataTestMisc::Ctrl, SubGameState::DataTestMisc::Dest, }, { SUB_GAME_STATE_DATA_TEST_OBJ, - 0, + false, SubGameState::DataTestObj::Init, SubGameState::DataTestObj::Ctrl, SubGameState::DataTestObj::Dest, }, { SUB_GAME_STATE_DATA_TEST_STG, - 0, + false, SubGameState::DataTestStg::Init, SubGameState::DataTestStg::Ctrl, SubGameState::DataTestStg::Dest, }, { SUB_GAME_STATE_DATA_TEST_MOT, - 0, + false, SubGameState::DataTestMot::Init, SubGameState::DataTestMot::Ctrl, SubGameState::DataTestMot::Dest, }, { SUB_GAME_STATE_DATA_TEST_COLLISION, - 1, + true, SubGameState::DataTestCollision::Init, SubGameState::DataTestCollision::Ctrl, SubGameState::DataTestCollision::Dest, }, { SUB_GAME_STATE_DATA_TEST_SPR, - 1, + true, SubGameState::DataTestSpr::Init, SubGameState::DataTestSpr::Ctrl, SubGameState::DataTestSpr::Dest, }, { SUB_GAME_STATE_DATA_TEST_AET, - 1, + true, SubGameState::DataTestAet::Init, SubGameState::DataTestAet::Ctrl, SubGameState::DataTestAet::Dest, }, { SUB_GAME_STATE_DATA_TEST_AUTH_3D, - 1, + true, SubGameState::DataTestAuth3d::Init, SubGameState::DataTestAuth3d::Ctrl, SubGameState::DataTestAuth3d::Dest, }, { SUB_GAME_STATE_DATA_TEST_CHR, - 1, + true, SubGameState::DataTestChr::Init, SubGameState::DataTestChr::Ctrl, SubGameState::DataTestChr::Dest, }, { SUB_GAME_STATE_DATA_TEST_ITEM, - 1, + true, SubGameState::DataTestItem::Init, SubGameState::DataTestItem::Ctrl, SubGameState::DataTestItem::Dest, }, { SUB_GAME_STATE_DATA_TEST_PERF, - 1, + true, SubGameState::DataTestPerf::Init, SubGameState::DataTestPerf::Ctrl, SubGameState::DataTestPerf::Dest, }, { SUB_GAME_STATE_DATA_TEST_PVSCRIPT, - 1, + true, SubGameState::DataTestPvScript::Init, SubGameState::DataTestPvScript::Ctrl, SubGameState::DataTestPvScript::Dest, }, { SUB_GAME_STATE_DATA_TEST_PRINT, - 1, + true, SubGameState::DataTestPrint::Init, SubGameState::DataTestPrint::Ctrl, SubGameState::DataTestPrint::Dest, }, { SUB_GAME_STATE_DATA_TEST_CARD, - 1, + true, SubGameState::DataTestCard::Init, SubGameState::DataTestCard::Ctrl, SubGameState::DataTestCard::Dest, }, { SUB_GAME_STATE_DATA_TEST_OPD, - 1, + true, SubGameState::DataTestOpd::Init, SubGameState::DataTestOpd::Ctrl, SubGameState::DataTestOpd::Dest, }, { SUB_GAME_STATE_DATA_TEST_SLIDER, - 1, + true, SubGameState::DataTestSlider::Init, SubGameState::DataTestSlider::Ctrl, SubGameState::DataTestSlider::Dest, }, { SUB_GAME_STATE_DATA_TEST_GLITTER, - 1, + true, SubGameState::DataTestGlitter::Init, SubGameState::DataTestGlitter::Ctrl, SubGameState::DataTestGlitter::Dest, }, { SUB_GAME_STATE_DATA_TEST_GRAPHICS, - 1, + true, SubGameState::DataTestGraphics::Init, SubGameState::DataTestGraphics::Ctrl, SubGameState::DataTestGraphics::Dest, }, { SUB_GAME_STATE_DATA_TEST_COLLECTION_CARD, - 1, + true, SubGameState::DataTestCollectionCard::Init, SubGameState::DataTestCollectionCard::Ctrl, SubGameState::DataTestCollectionCard::Dest, }, { SUB_GAME_STATE_TEST_MODE_MAIN, - 0, + false, SubGameState::DataTestModeMain::Init, SubGameState::DataTestModeMain::Ctrl, SubGameState::DataTestModeMain::Dest, }, { SUB_GAME_STATE_APP_ERROR, - 0, + false, SubGameState::DataTestAppError::Init, SubGameState::DataTestAppError::Ctrl, SubGameState::DataTestAppError::Dest, @@ -818,7 +818,7 @@ SubGameStateData sub_game_state_data_array[] = { #if defined(ReDIVA_DEV) { // Added SUB_GAME_STATE_GLITTER_EDITOR, - 0, + false, SubGameState::GlitterEditor::Init, SubGameState::GlitterEditor::Ctrl, SubGameState::GlitterEditor::Dest, @@ -827,7 +827,7 @@ SubGameStateData sub_game_state_data_array[] = { #if DATA_EDIT { // Added SUB_GAME_STATE_DATA_EDIT, - 0, + false, SubGameState::DataEdit::Init, SubGameState::DataEdit::Ctrl, SubGameState::DataEdit::Dest, @@ -1948,6 +1948,14 @@ GameStateEnum game_state_get_game_state() { return game_state_get()->game_state; } +bool game_state_get_pause() { + GameState* game_state = game_state_get(); + SubGameStateData* sub_game_state_data = sub_game_state_data_array_get(game_state->sub_game_state); + if (sub_game_state_data) + return sub_game_state_data->pause; + return true; +} + size_t game_state_print(char* buf, size_t buf_size) { GameState* game_state = game_state_get(); const char* game_state_name = game_state_names[game_state->game_state]; @@ -1981,8 +1989,8 @@ void test_mode_set(bool value) { } static bool game_state_call_sub(GameState* game_state) { - SubGameStateData* v2 = sub_game_state_data_array_get(game_state->sub_game_state); - if (!v2) { + SubGameStateData* sub_game_state_data = sub_game_state_data_array_get(game_state->sub_game_state); + if (!sub_game_state_data) { game_state->sub_call_count++; return false; } @@ -1990,13 +1998,13 @@ static bool game_state_call_sub(GameState* game_state) { bool(*func)() = 0; switch (game_state->sub_mode) { case 0: - func = v2->Init; + func = sub_game_state_data->Init; break; case 1: - func = v2->Ctrl; + func = sub_game_state_data->Ctrl; break; case 2: - func = v2->Dest; + func = sub_game_state_data->Dest; break; } diff --git a/src/ReDIVA/game_state.hpp b/src/ReDIVA/game_state.hpp index 52c4c022..6b943415 100644 --- a/src/ReDIVA/game_state.hpp +++ b/src/ReDIVA/game_state.hpp @@ -78,6 +78,7 @@ enum SubGameStateEnum { extern void game_state_init(); extern void game_state_ctrl(); extern GameStateEnum game_state_get_game_state(); +extern bool game_state_get_pause(); extern size_t game_state_print(char* buf, size_t buf_size); extern void game_state_set_game_state_next(GameStateEnum state); extern void game_state_set_sub_game_state_next(SubGameStateEnum state); diff --git a/src/ReDIVA/render.cpp b/src/ReDIVA/render.cpp index 2b830774..4b4c79e8 100644 --- a/src/ReDIVA/render.cpp +++ b/src/ReDIVA/render.cpp @@ -1145,14 +1145,16 @@ static void render_context_ctrl(render_context* rctx) { rctx_ptr = rctx; input_state_ctrl(); - game_state_ctrl(); + if (!get_pause() || !game_state_get_pause()) + game_state_ctrl(); rctx->ctrl(); if (fast_loader_speed > 1 && game_state_get_game_state() == GAME_STATE_STARTUP) for (int32_t i = 1; i < fast_loader_speed; i++) { rctx_ptr = rctx; input_state_ctrl(); - game_state_ctrl(); + if (!get_pause() || !game_state_get_pause()) + game_state_ctrl(); rctx->ctrl(); }