1
0
forked from akanyan/mu3-mods

feat: implement postgame skip, fix crashes

This commit is contained in:
2024-12-15 11:50:43 +00:00
parent ca15fac6a1
commit 88dcd1d94e
5 changed files with 60 additions and 34 deletions

View File

@ -5,6 +5,8 @@ class patch_SoundManager: SoundManager {
private HandleInfo getHandle(Priority priority) => orig_getHandle(priority);
private patch_SoundPlayer[] _soundPlayers;
public void pause(HandleInfo handle, bool val) {
if(handle.Index < _soundPlayers.Length) {
_soundPlayers[handle.Index].pause(val);
}
}
}

View File

@ -0,0 +1,27 @@
using MonoMod;
using MU3.Util;
namespace MU3;
class patch_DailyBonus: DailyBonus {
[MonoModIgnore]
private enum State {
ItemWindow = 3,
ExitWait = 4,
}
private float waitCount;
private State _state;
private extern void orig_Update();
private void Update() {
if(_state < State.ItemWindow) {
if(Singleton<UIInput>.instance.getTriggerOn(UIInput.Key.Decision)) {
waitCount = 100.0f;
}
if(Singleton<UIInput>.instance.getTriggerOn(UIInput.Key.MenuLeft)) {
waitCount = 100.0f;
_state = State.ExitWait;
}
}
orig_Update();
}
}

View File

@ -4,27 +4,21 @@ namespace MU3;
class patch_Scene_30_NoticeReward: Scene_30_NoticeReward {
private Mode<Scene_30_NoticeReward, State> _mode;
public static bool Skipped { get; private set; }
private enum State {
RankingReward = 2,
FadeOut = 8,
}
private void Start() {
Skipped = false;
using IniFile iniFile = new("mu3.ini");
var quickLogin = iniFile.getValue("Sequence", "QuickLogin", false);
_mode = new Mode<Scene_30_NoticeReward, State>(this);
if(quickLogin) {
_mode.set(State.FadeOut);
} else {
_mode.set(State.RankingReward);
SingletonMonoBehaviour<SystemUI>.instance.Panel.pushState(0, show: true);
}
private void Update() {
if(_mode.get() < (int)State.FadeOut && Singleton<UIInput>.instance.getTriggerOn(UIInput.Key.MenuLeft)) {
Skipped = true;
_mode.set(State.FadeOut);
} else {
_mode.update();
}
}
private void End_Init() {
Skipped = false;
}
}

View File

@ -1,18 +0,0 @@
namespace MU3;
class patch_UIGetRewards: UIGetRewards {
private extern void orig_invokeOnFinish();
private extern void orig_startNextItem();
private void invokeOnFinish() => orig_invokeOnFinish();
private void startNextItem() {
if(!patch_Scene_30_NoticeReward.Skipped) {
orig_startNextItem();
}
}
void Update() {
// The panel state will still be screwed up for some reason but it won't crash
// This could be improved
if(patch_Scene_30_NoticeReward.Skipped) {
invokeOnFinish();
}
}
}

View File

@ -1,13 +1,16 @@
using MU3.Battle;
using MU3.Data;
using MU3.Game;
using MU3.Util;
namespace MU3.Sequence;
class patch_PlayMusic: PlayMusic {
private GameEngine _gameEngine;
private extern void orig_Execute_StartCutscene();
private SessionInfo _sessionInfo;
private bool _nuclearSkip = false;
public static bool ForceSkipped { get; private set; }
private extern void orig_Execute_StartCutscene();
private void Execute_StartCutscene() {
orig_Execute_StartCutscene();
ForceSkipped = false;
@ -17,4 +20,22 @@ class patch_PlayMusic: PlayMusic {
setNextState(EState.Countdown);
}
}
public extern bool orig_updateState(float deltaTime);
public override bool updateState(float deltaTime = -1f) {
var state = getCurrentState();
if(state >= EState.PlayEnd && Singleton<UIInput>.instance.getTriggerOn(UIInput.Key.MenuLeft)) {
_nuclearSkip = true;
}
if(_nuclearSkip) {
if(state < EState.CalcResult) {
setNextState(EState.CalcResult);
}
if(state > EState.CalcResult) {
int selectorID = SingletonStateMachine<DataManager, DataManager.EState>.instance.getMemoryChapterData(_sessionInfo.chapterSelection.memoryChapterId)?.getMemoryChapterSelectorID() ?? 4;
Singleton<GameSound>.instance.gameBGM.playBGM(236, selectorID);
setNextState(EState.End);
}
}
return orig_updateState(deltaTime);
}
}