diff --git a/config/implemented.csv b/config/implemented.csv index eaf83cb4..a125f980 100644 --- a/config/implemented.csv +++ b/config/implemented.csv @@ -99,6 +99,7 @@ GameWindow::Present GameWindow::Render GameManager::GameManager GameManager::AddedCallback +GameManager::DeletedCallback GameManager::RegisterChain GameManager::CutChain GameManager::HasReachedMaxClears diff --git a/config/stubbed.csv b/config/stubbed.csv index d22543b1..c3f1e6fe 100644 --- a/config/stubbed.csv +++ b/config/stubbed.csv @@ -1,6 +1,8 @@ AnmManager::TakeScreenshotIfRequested AnmManager::DrawStringFormat AnmManager::DrawStringFormat2 +EclManager::Unload +EffectManager::CutChain EffectManager::DeletedCallback EffectManager::EffectUpdateCallback1 EffectManager::EffectUpdateCallback2 @@ -8,6 +10,7 @@ EffectManager::EffectUpdateCallback3 EffectManager::EffectUpdateCallback4 EffectManager::EffectUpdateCallback5 EffectManager::EffectUpdateCallback6 +Stage::CutChain Stage::DeletedCallback StageMenu::OnUpdateGameMenu StageMenu::OnUpdateRetryMenu @@ -37,13 +40,13 @@ Supervisor::DeletedCallback Supervisor::StopAudio Supervisor::SetupMidiPlayback Supervisor::ReadMidiFile -GameManager::DeletedCallback Ending::RegisterChain MusicRoom::RegisterChain ResultScreen::RegisterChain ResultScreen::ReleaseScoreDat ScreenEffect::RegisterChain MainMenu::SelectRelated +Gui::CutChain Gui::DeletedCallback Gui::CalculateStageScore Gui::HasCurrentMsgIdx @@ -56,6 +59,7 @@ Gui::ShowSpellcardBonus Gui::Vm6SetInterruptTo1 GuiImpl::RunMsg GuiImpl::DrawDialogue +EnemyManager::CutChain EnemyManager::DeletedCallback Enemy::SetVar Enemy::MathAdd @@ -67,6 +71,7 @@ Enemy::MathAtan2 Enemy::MovePosTime Enemy::MoveDirTime Enemy::MoveTime +BulletManager::CutChain BulletManager::DespawnBullets BulletManager::DeletedCallback BulletManager::InitializeToZero @@ -77,10 +82,12 @@ ItemManager::SpawnItem ItemManager::OnUpdate ItemManager::OnDraw ReplayManager::RegisterChain +ReplayManager::StopRecording SaveReplay ValidateReplayData DrawSquare Controller::GetControllerState +Player::CutChain Player::DrawBulletExplosions Player::CalcDamageToEnemy Player::DeletedCallback diff --git a/src/BulletManager.hpp b/src/BulletManager.hpp index e0d27c00..a4f449ee 100644 --- a/src/BulletManager.hpp +++ b/src/BulletManager.hpp @@ -90,6 +90,7 @@ C_ASSERT(sizeof(Laser) == 0x270); struct BulletManager { static ZunResult RegisterChain(char *bulletAnmPath); + static void CutChain(); static ZunResult AddedCallback(BulletManager *mgr); static ZunResult DeletedCallback(BulletManager *mgr); static ChainCallbackResult OnUpdate(BulletManager *mgr); diff --git a/src/EclManager.hpp b/src/EclManager.hpp index 7984d26b..b4c5dd72 100644 --- a/src/EclManager.hpp +++ b/src/EclManager.hpp @@ -477,6 +477,7 @@ enum EclRawInstrOpcode struct EclManager { ZunResult Load(char *ecl); + void Unload(); ZunResult RunEcl(Enemy *enemy); ZunResult CallEclSub(EnemyEclContext *enemyEcl, i16 subId); diff --git a/src/EffectManager.hpp b/src/EffectManager.hpp index 676225d0..3bc35220 100644 --- a/src/EffectManager.hpp +++ b/src/EffectManager.hpp @@ -14,6 +14,7 @@ struct EffectManager Effect dummyEffect; static ZunResult RegisterChain(); + static void CutChain(); static ChainCallbackResult OnUpdate(EffectManager *mgr); static ZunResult AddedCallback(EffectManager *mgr); static ZunResult DeletedCallback(EffectManager *mgr); diff --git a/src/EnemyManager.hpp b/src/EnemyManager.hpp index 50d84989..a112e8f9 100644 --- a/src/EnemyManager.hpp +++ b/src/EnemyManager.hpp @@ -21,6 +21,7 @@ struct EnemyManager { void Initialize(); static ZunResult RegisterChain(char *stgEnm1, char *stgEnm2); + static void CutChain(); static ChainCallbackResult OnUpdate(EnemyManager *enemyManager); static ChainCallbackResult OnDraw(EnemyManager *enemyManager); static ZunResult AddedCallback(EnemyManager *enemyManager); diff --git a/src/GameManager.cpp b/src/GameManager.cpp index 10378ec8..f07e8c7c 100644 --- a/src/GameManager.cpp +++ b/src/GameManager.cpp @@ -336,6 +336,30 @@ ZunResult GameManager::AddedCallback(GameManager *mgr) } #pragma optimize("", on) +#pragma optimize("s", on) +ZunResult GameManager::DeletedCallback(GameManager *mgr) +{ + i32 padding1, padding2, padding3; + + g_Supervisor.d3dDevice->ResourceManagerDiscardBytes(0); + if (!g_GameManager.demoMode) + { + g_Supervisor.StopAudio(); + } + Stage::CutChain(); + BulletManager::CutChain(); + Player::CutChain(); + EnemyManager::CutChain(); + g_EclManager.Unload(); + EffectManager::CutChain(); + Gui::CutChain(); + ReplayManager::StopRecording(); + mgr->isInMenu = 0; + g_AsciiManager.InitializeVms(); + return ZUN_SUCCESS; +} +#pragma optimize("", on) + #pragma optimize("s", on) i32 GameManager::HasReachedMaxClears(i32 character, i32 shottype) { diff --git a/src/Gui.hpp b/src/Gui.hpp index 25a565e0..5c687e70 100644 --- a/src/Gui.hpp +++ b/src/Gui.hpp @@ -20,6 +20,7 @@ struct GuiFlags struct Gui { static ZunResult RegisterChain(); + static void CutChain(); static ZunResult AddedCallback(Gui *); static ZunResult DeletedCallback(Gui *); static ChainCallbackResult OnUpdate(Gui *); diff --git a/src/Player.hpp b/src/Player.hpp index 7d873728..ac078e73 100644 --- a/src/Player.hpp +++ b/src/Player.hpp @@ -169,6 +169,7 @@ struct Player Player(); static ZunResult RegisterChain(u8 unk); + static void CutChain(); static ChainCallbackResult OnUpdate(Player *p); static ChainCallbackResult OnDrawHighPrio(Player *p); static ChainCallbackResult OnDrawLowPrio(Player *p); diff --git a/src/ReplayManager.hpp b/src/ReplayManager.hpp index 63aba529..b5934e7c 100644 --- a/src/ReplayManager.hpp +++ b/src/ReplayManager.hpp @@ -3,4 +3,5 @@ struct ReplayManager { static ZunResult RegisterChain(i32 isDemo, char *replayFile); + static void StopRecording(); }; diff --git a/src/Stage.hpp b/src/Stage.hpp index ebe1f336..e31469ff 100644 --- a/src/Stage.hpp +++ b/src/Stage.hpp @@ -102,6 +102,7 @@ enum StageOpcode struct Stage { static ZunResult RegisterChain(u32 stage); + static void CutChain(); static ChainCallbackResult OnUpdate(Stage *stage); static ChainCallbackResult OnDrawHighPrio(Stage *stage); static ChainCallbackResult OnDrawLowPrio(Stage *stage);