From bcaccca46b86d5f6a7a7979f7d9b3211c152aa70 Mon Sep 17 00:00:00 2001 From: liqMix Date: Tue, 1 Apr 2025 22:58:19 -0600 Subject: [PATCH] add offgeki --- Assets/icon-Offgeki.png | Bin 0 -> 61233 bytes .../Offgeki/MU3.Battle/patch_EnemyFactory.cs | 22 ++ .../Offgeki/MU3.Battle/patch_EnemyManager.cs | 16 ++ Extras/Offgeki/MU3.Battle/patch_GameEngine.cs | 36 +++ Extras/Offgeki/MU3.Mod/State.cs | 111 +++++++++ .../Offgeki/MU3.Sequence/patch_PlayMusic.cs | 230 ++++++++++++++++++ Extras/Offgeki/MU3/patch_ANM_PLY_score.cs | 24 ++ Extras/Offgeki/MU3/patch_BattleUI.cs | 53 ++++ Extras/Offgeki/MU3/patch_UIPlayerInfo.cs | 17 ++ Extras/Offgeki/Offgeki.csproj | 9 + Extras/Offgeki/README.md | 121 +++++++++ Mu3Mods.sln | 6 + 12 files changed, 645 insertions(+) create mode 100644 Assets/icon-Offgeki.png create mode 100644 Extras/Offgeki/MU3.Battle/patch_EnemyFactory.cs create mode 100644 Extras/Offgeki/MU3.Battle/patch_EnemyManager.cs create mode 100644 Extras/Offgeki/MU3.Battle/patch_GameEngine.cs create mode 100644 Extras/Offgeki/MU3.Mod/State.cs create mode 100644 Extras/Offgeki/MU3.Sequence/patch_PlayMusic.cs create mode 100644 Extras/Offgeki/MU3/patch_ANM_PLY_score.cs create mode 100644 Extras/Offgeki/MU3/patch_BattleUI.cs create mode 100644 Extras/Offgeki/MU3/patch_UIPlayerInfo.cs create mode 100644 Extras/Offgeki/Offgeki.csproj create mode 100644 Extras/Offgeki/README.md diff --git a/Assets/icon-Offgeki.png b/Assets/icon-Offgeki.png new file mode 100644 index 0000000000000000000000000000000000000000..533792c9ff5d136fb6be9b875cdeb3722418df43 GIT binary patch literal 61233 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.instance; + if ( + (state.RemoveEnemy && enemy.name.Contains("Zako")) || + (state.RemoveBoss && enemy.name.Contains("Boss")) + ) + { + enemy?.gameObject.SetActive(false); + } + return enemy; + } +} diff --git a/Extras/Offgeki/MU3.Battle/patch_EnemyManager.cs b/Extras/Offgeki/MU3.Battle/patch_EnemyManager.cs new file mode 100644 index 0000000..44b007f --- /dev/null +++ b/Extras/Offgeki/MU3.Battle/patch_EnemyManager.cs @@ -0,0 +1,16 @@ +using MU3.Util; + +namespace MU3.Battle; + +class patch_EnemyManager : EnemyManager +{ + extern void orig_playEnemyDamageUI(DamageParam dp); + public new void playEnemyDamageUI(DamageParam dp) + { + Mod.State state = Singleton.instance; + if (!state.RemoveEnemy && !state.RemoveBullets) + { + orig_playEnemyDamageUI(dp); + } + } +} diff --git a/Extras/Offgeki/MU3.Battle/patch_GameEngine.cs b/Extras/Offgeki/MU3.Battle/patch_GameEngine.cs new file mode 100644 index 0000000..6d84703 --- /dev/null +++ b/Extras/Offgeki/MU3.Battle/patch_GameEngine.cs @@ -0,0 +1,36 @@ +using MU3.Util; + +namespace MU3.Battle; + +class patch_GameEngine +{ + private Player _player; + + private Ally[] _allies; + + extern public void orig_createPlayer(StartCutscenePosition startCutscenePos, int charaId); + + public void createPlayer(StartCutscenePosition startCutscenePos, int charaId) + { + orig_createPlayer(startCutscenePos, charaId); + if (Singleton.instance.RemovePlayerGeki && _player) + { + _player.gameObject.SetActive(false); + } + } + + extern public void orig_createAlly(int id, StartCutscenePosition startCutscenePos, int charaId, int allyNum); + public void createAlly(int id, StartCutscenePosition startCutscenePos, int charaId, int allyNum) + { + orig_createAlly(id, startCutscenePos, charaId, allyNum); + if (Singleton.instance.RemoveAllyGekis) + { + foreach (var a in _allies) + { + if (a) { + a.gameObject.SetActive(false); + } + } + } + } +} diff --git a/Extras/Offgeki/MU3.Mod/State.cs b/Extras/Offgeki/MU3.Mod/State.cs new file mode 100644 index 0000000..581ccc8 --- /dev/null +++ b/Extras/Offgeki/MU3.Mod/State.cs @@ -0,0 +1,111 @@ +using MU3.Util; +namespace MU3.Mod; + + +class State: Singleton { + public bool RemoveBackground { get; set; } = false; + public bool RemoveBackgroundFrame { get; set; } = false; + public bool RemoveHeader { get; set; } = false; + public bool RemoveFooter { get; set; } = false; + + public bool RemovePlayerHealthUI { get; set; } = false; + + public bool RemovePlayerBattleScoreUI { get; set; } = false; + public bool RemovePlayerScoreUI { get; set; } = false; + public bool RemoveEnemyUI { get; set; } = false; + + public bool RemovePlayerCardUI { get; set; } = false; + public bool RemovePlayerGeki { get; set; } = false; + public bool RemoveAllyGekis { get; set; } = false; + + public bool RemoveCharacterLine { get; set; } = false; + public bool RemoveEnemy { get; set; } = false; + public bool RemoveBoss { get; set; } = false; + + public bool RemoveBullets { get; set; } = false; + + public bool ReducedNoteFX { get; set; } = false; + public bool RemoveNoteFX { get; set; } = false; + + public float BackgroundR { get; set; } = 0f; + public float BackgroundG { get; set; } = 0f; + public float BackgroundB { get; set; } = 0f; + + private bool getValue(IniFile ini, string key) + { + UnityEngine.Debug.Log("Get value for key: " + key); + var value = ini.getValue("Offgeki", key, false); + UnityEngine.Debug.Log("Value: " + value); + return value; + } + private float getColorValue(IniFile ini, string key) + { + UnityEngine.Debug.Log("Get color value for key: " + key); + var value = ini.getValue("Offgeki", key, 0f); + + // Ceiling to 255 + if (value > 255) + { + value = 255; + } + + // Divide by 255 + value = value / 255.0f; + + UnityEngine.Debug.Log("Value: " + value); + return value; + } + + public void Init() + { + UnityEngine.Debug.Log("[Nogeki] Initializing State"); + using IniFile ini = new("mu3.ini"); + RemoveBackground = getValue(ini, "RemoveBackground"); + RemoveBackgroundFrame = getValue(ini, "RemoveBackgroundFrame"); + RemoveHeader = getValue(ini, "RemoveHeader"); + RemoveFooter = getValue(ini, "RemoveFooter"); + RemovePlayerHealthUI = getValue(ini, "RemovePlayerHealthUI"); + RemovePlayerBattleScoreUI = getValue(ini, "RemovePlayerBattleScoreUI"); + RemovePlayerScoreUI = getValue(ini, "RemovePlayerScoreUI"); + RemovePlayerCardUI = getValue(ini, "RemovePlayerCardUI"); + RemoveEnemyUI = getValue(ini, "RemoveEnemyUI"); + RemovePlayerGeki = getValue(ini, "RemovePlayerGeki"); + RemoveAllyGekis = getValue(ini, "RemoveAllyGekis"); + RemoveCharacterLine = getValue(ini, "RemoveCharacterLine"); + RemoveEnemy = getValue(ini, "RemoveEnemy"); + RemoveBoss = getValue(ini, "RemoveBoss"); + RemoveBullets = getValue(ini, "RemoveBullets"); + ReducedNoteFX = getValue(ini, "ReducedNoteFX"); + RemoveNoteFX = getValue(ini, "RemoveNoteFX"); + BackgroundR = getColorValue(ini, "BackgroundR"); + BackgroundG = getColorValue(ini, "BackgroundG"); + BackgroundB = getColorValue(ini, "BackgroundB"); + + UnityEngine.Debug.Log("[Nogeki] State initialized"); + } + + override public string ToString() + { + return "State: \n" + + "\tRemove Background: " + RemoveBackground + "\n" + + "\tRemove Background Frame: " + RemoveBackgroundFrame + "\n" + + "\tRemove Header: " + RemoveHeader + "\n" + + "\tRemove Footer: " + RemoveFooter + "\n" + + "\tRemove Player Health UI: " + RemovePlayerHealthUI + "\n" + + "\tRemove Player Battle Score UI: " + RemovePlayerBattleScoreUI + "\n" + + "\tRemove Player Score UI: " + RemovePlayerScoreUI + "\n" + + "\tRemove Player Card UI: " + RemovePlayerCardUI + "\n" + + "\tRemove Enemy UI: " + RemoveEnemyUI + "\n" + + "\tRemove Player Geki: " + RemovePlayerGeki + "\n" + + "\tRemove Ally Gekis: " + RemoveAllyGekis + "\n" + + "\tRemove Enemy: " + RemoveEnemy + "\n" + + "\tRemove Boss: " + RemoveBoss + "\n" + + "\tRemove Bullets: " + RemoveBullets + "\n" + + "\tRemove Bright Note FX: " + ReducedNoteFX + "\n" + + "\tRemove All Note FX: " + RemoveNoteFX + "\n" + + "\tRemove Character Line: " + RemoveCharacterLine + "\n" + + "\tBackground R: " + BackgroundR + "\n" + + "\tBackground G: " + BackgroundG + "\n" + + "\tBackground B: " + BackgroundB + "\n"; + } +} diff --git a/Extras/Offgeki/MU3.Sequence/patch_PlayMusic.cs b/Extras/Offgeki/MU3.Sequence/patch_PlayMusic.cs new file mode 100644 index 0000000..354949a --- /dev/null +++ b/Extras/Offgeki/MU3.Sequence/patch_PlayMusic.cs @@ -0,0 +1,230 @@ +using UnityEngine; +using MU3.Util; +using MU3.Game; +using UnityEngine.SceneManagement; +using System.Linq; +using System.Collections.Generic; + +namespace MU3.Sequence; + +class patch_PlayMusic : PlayMusic +{ + private SessionInfo _sessionInfo; + //private State _state = State; + private bool _nogeki_removed = false; + private bool _nogeki_enabled = false; + private GameObject _offgeki_bg; + + private void disableEffect(GameObject effect) + { + var childCount = effect.transform.childCount; + effect.transform.DetachChildren(); + effect.transform.localScale = new Vector3(0, 0, 0); + effect.SetActive(false); + } + + private extern void orig_Execute_SetupScene(); + private void Execute_SetupScene() + { + Mod.State state = Singleton.instance; + state.Init(); + orig_Execute_SetupScene(); + + if (state.RemoveBackground && _offgeki_bg == null) + { + // Create a black quad that fills the screen + GameObject bgQuad = GameObject.CreatePrimitive(PrimitiveType.Quad); + bgQuad.name = "OffgekiBackground"; + + // Scale it to cover the view + bgQuad.transform.localScale = new Vector3(10000, 10000, 1); + + // Position it far behind other elements + bgQuad.transform.position = new Vector3(0, 0, 500); + + // Assign the material + bgQuad.GetComponent().material = new(Shader.Find("Unlit/Color")) + { + color = new Color(state.BackgroundR, state.BackgroundG, state.BackgroundB) + }; + _offgeki_bg = bgQuad; + } + + // Remove canvases + SystemUI systemUI = SingletonMonoBehaviour.instance; + List disableCanvases = []; + if (state.RemoveBackground) + { + disableCanvases.Add("Canvas_P_Background"); + disableCanvases.Add("Canvas_P_FadeOut"); + } + + if (state.RemoveHeader) + { + disableCanvases.Add("Canvas_P_UserData"); + disableCanvases.Add("Canvas_P_Signage"); + } + if (state.RemoveFooter) + { + disableCanvases = [ + ..disableCanvases, + "Canvas_P_SystemButton", + "Canvas_P_ButtonGuide", + "Canvas_P_Credit" + ]; + } + + + foreach (var item in systemUI.GetComponentsInChildren()) + { + if (!item.enabled) continue; + if (disableCanvases.Contains(item.name)) + { + item.enabled = false; + } + } + + string name = $"st_{_sessionInfo.stageId:0000}"; + Scene sceneByName = SceneManager.GetSceneByName(name); + GameObject[] rootObjects = sceneByName.GetRootGameObjects(); + foreach (var obj in rootObjects) + { + if (obj.name == "BattleStage(Clone)" && state.RemoveBackgroundFrame) + { + obj.SetActive(false); + continue; + } + + + if (obj.name == "NotesPrimitiveManager(Clone)") + { + PrimitiveMesh[] childs = obj.GetComponentsInChildren(); + for (int i = 0; i < childs.Length; i++) + { + if (i == 2) + { + PrimitiveMesh child = childs[i]; + child.gameObject.SetActive(false); + } + } + } + + } + + List disableCharacterLines = state.RemoveCharacterLine ? [ + "fd_charaline", + "fd_charaline(Clone)", + "fd_charapole", + "fd_charapole (1)", + "fd_charazone", + "fd_checkpole", + "fd_checkpole (1)", + "fd_zonetry", + ] : []; + + List disableBullets = state.RemoveBullets ? [ + "FX_Bullet_03_Hit(Clone)", + "FX_Bullet_03_Break(Clone)", + "FX_Bullet_03_CBreak(Clone)", + "FX_Bullet_02_Hit(Clone)", + "FX_Bullet_02_Break(Clone)", + "FX_Bullet_02_CBreak(Clone)", + "FX_Bullet_Hit(Clone)", + "FX_Bullet_Break(Clone)", + "FX_Bullet_CBreak(Clone)", + ] : []; + + List disableHitFX = state.RemoveNoteFX ? [ + "EffectCache_attachBell", + + "EffectCache_flickHit", + "EffectCache_flickBreak", + "EffectCache_flickCBreak", + "EffectCache_flickPBreak", + + "EffectCache_crFlickHit", + "EffectCache_crFlickBreak", + "EffectCache_crFlickCBreak", + "EffectCache_crFlickPBreak", + + "EffectCache_normalHit", + "EffectCache_normalBreak", + "EffectCache_normalCBreak", + "EffectCache_normalPBreak", + + "EffectCache_holdEndHit", + "EffectCache_holdEndBreak", + "EffectCache_holdEndCBreak", + "EffectCache_holdEndPBreak", + "EffectCache_holdKeep", + + "FX_Tap_PBreak(Clone)", + "FX_Tap_CBreak(Clone)", + "FX_Tap_Break(Clone)", + "FX_Tap_Hit(Clone)", + "FX_Release_PBreak(Clone)", + ] : []; + + List reducedNoteFX = state.ReducedNoteFX ? [ + "EffectCache_holdEndCBreak", + "EffectCache_holdEndPBreak", + "EffectCache_holdKeep", + + + "EffectCache_crFlickPBreak", + + "EffectCache_flickPBreak", + ] : []; + + List disableBulletFX = state.RemoveBullets ? [ + "hitZako", + "criticalZako", + "explosionZako", + "EffectCache_explosionZako", + "EffectCache_hitZako", + "EffectCache_criticalZako", + + "hitBoss", + "criticalBoss", + "explosionBoss", + "EffectCache_explosionBoss", + "EffectCache_hitBoss", + "EffectCache_criticalBoss", + ] : []; + + List disableNames = [ + ..disableCharacterLines, + ..disableBullets, + ..disableHitFX, + ..reducedNoteFX, + ..disableBulletFX, + ]; + + + + Transform[] arrTransforms = Resources.FindObjectsOfTypeAll().Where((s) => (s.hideFlags == HideFlags.None)).ToArray(); + for (int i = 0; i < arrTransforms.Length; i++) + { + //UnityEngine.Debug.Log($"[Nogeki] Transform: {arrTransforms[i].name}"); + if (disableNames.Contains(arrTransforms[i].name)) + { + disableEffect(arrTransforms[i].gameObject); + } + } + } + + private extern void orig_Enter_DispCombo(); + private void Enter_DispCombo() + { + SystemUI systemUI = SingletonMonoBehaviour.instance; + foreach (var item in systemUI.GetComponentsInChildren()) + { + if (item.enabled) continue; + + item.enabled = true; + } + orig_Enter_DispCombo(); + } + + +} \ No newline at end of file diff --git a/Extras/Offgeki/MU3/patch_ANM_PLY_score.cs b/Extras/Offgeki/MU3/patch_ANM_PLY_score.cs new file mode 100644 index 0000000..b3c4d5c --- /dev/null +++ b/Extras/Offgeki/MU3/patch_ANM_PLY_score.cs @@ -0,0 +1,24 @@ +using MU3.CustomUI; +using MU3.Util; +using UnityEngine; + +namespace MU3; + +class patch_ANM_PLY_score : ANM_PLY_score +{ + private GameObject _baseBattleScore; + private MU3UICounter[] _scoreCountersMU3; + + extern private void orig_Awake(); + private void Awake() + { + orig_Awake(); + + + if (Singleton.instance.RemovePlayerBattleScoreUI) + { + _baseBattleScore.SetActive(value: false); + _scoreCountersMU3[0].gameObject.SetActive(value: false); + } + } +} diff --git a/Extras/Offgeki/MU3/patch_BattleUI.cs b/Extras/Offgeki/MU3/patch_BattleUI.cs new file mode 100644 index 0000000..aff9d23 --- /dev/null +++ b/Extras/Offgeki/MU3/patch_BattleUI.cs @@ -0,0 +1,53 @@ +using MU3.Util; +using UnityEngine; +using System.Collections.Generic; + +namespace MU3; + +public class patch_BattleUI : BattleUI +{ + private extern void orig_Awake(); + public extern void orig_dispFinish(); + + private void Awake() + { + orig_Awake(); + + Mod.State state = Singleton.instance; + state.Init(); + + List disabled = []; + if (state.RemoveBackground) + { + disabled.Add("CVS_SurfBoard3D"); + } + + if (state.RemoveEnemyUI) + { + disabled.Add("CVS_PLY_EnemyDamage"); + disabled.Add("CVS_PLY_Enemyinfo_00"); + } + + if (state.RemovePlayerCardUI) + { + disabled.Add("CVS_PLY_Cardinfo_00"); + } + + foreach (var item in GetComponentsInChildren()) + { + if (item.enabled && disabled.Contains(item.name)){ + item.enabled = false; + } + } + } + + public void dispFinish() + { + foreach (var item in GetComponentsInChildren()) + { + item.enabled = true; + } + + orig_dispFinish(); + } +} diff --git a/Extras/Offgeki/MU3/patch_UIPlayerInfo.cs b/Extras/Offgeki/MU3/patch_UIPlayerInfo.cs new file mode 100644 index 0000000..e67eedb --- /dev/null +++ b/Extras/Offgeki/MU3/patch_UIPlayerInfo.cs @@ -0,0 +1,17 @@ +using MU3.Util; + +namespace MU3; +class patch_UIPlayerInfo : UIPlayerInfo +{ + private ANM_PLY_life _playerLife; + extern private void orig_create(); + private new void create() + { + orig_create(); + + if(Singleton.instance.RemovePlayerHealthUI) + { + _playerLife.gameObject.SetActive(false); + } + } +} diff --git a/Extras/Offgeki/Offgeki.csproj b/Extras/Offgeki/Offgeki.csproj new file mode 100644 index 0000000..562443d --- /dev/null +++ b/Extras/Offgeki/Offgeki.csproj @@ -0,0 +1,9 @@ + + + Assembly-CSharp.Offgeki.mm + Modular removal of UI elements + 1.0.0 + extras + + + \ No newline at end of file diff --git a/Extras/Offgeki/README.md b/Extras/Offgeki/README.md new file mode 100644 index 0000000..5c7a8a9 --- /dev/null +++ b/Extras/Offgeki/README.md @@ -0,0 +1,121 @@ +# Offgeki + +Modular removal of UI elements. +Currently only supports removing elements during music play. +Potentially will support removing elements during other parts of the game. + +## Features +- Remove various UI elements during music play + - Background + - Player UI Elements + - Health + - Battle Score + - Technical Score + - Enemy UI Elements + - Health + - Bullets + - Gekis (enemies, boss, player, allies) + - NoteFX + +## Installation + +1. Install BepInEx +2. Drop the `Assembly-CSharp.Offgeki.mm.dll` file into the `BepInEx/monomod` folder +3. Launch the game + +## Configuration +Populate these values in `mu3.ini` to configure the mod. + +``` +[Offgeki] +RemoveBackground = 1 +RemoveBackgroundFrame = 1 +RemoveSignage = 1 +RemovePlayerHealthUI = 1 +RemovePlayerBattleScoreUI = 1 +RemovePlayerScoreUI = 0 +RemovePlayerCardUI = 1 +RemoveEnemyUI = 1 +RemovePlayerGeki = 1 +RemoveAllyGekis = 0 +RemoveCharacterLine = 1 +RemoveEnemy = 1 +RemoveBoss = 0 +RemoveBullets = 1 +ReducedNoteFX = 1 +RemoveNoteFX = 0 +BackgroundR = 25 +BackgroundG = 25 +BackgroundB = 25 + + +## Details + +### RemoveBackground +Removes the background. A blue frame is still present, but the background is removed. + +### RemoveBackgroundFrame +Removes the blue framing in the background + +### RemoveSignage +Removes the header and footer sections + +### RemovePlayerHealthUI +Removes the player's health + +### RemovePlayerBattleScoreUI +Removes the player's battle score + +### RemovePlayerScoreUI +Removes the player's technical score + +### RemovePlayerCardUI +Removes the player/ally card UI + +### RemoveEnemyUI +Removes the enemy's health + +### RemovePlayerGeki +Removes the player's geki + +### RemoveAllyGekis +Removes the ally's gekis +(Currently does not allow no player and allies) + +### RemoveCharacterLine +Removes the lines and area rendering underneath player characters. +Retains the note judgement line. + +### RemoveEnemy +Removes the enemies (Zekos) + +### RemoveBoss +Removes the boss + +### RemoveBullets +Removes the bullets + +### ReducedNoteFX +Reduces the note FX a bit by disabling a few FX but not all + +### RemoveNoteFX +Removes all note FX + +### BackgroundR +Background color red value + +### BackgroundG +Background color green value + +### BackgroundB +Background color blue value +``` + + +## Known Issues +- Unable to show only allies and not primary character. Probably due to the allies being anchored to the primary character. +- Some stages have background overlay that color the background a bit differently. +- Signage doesn't return after play. Will need to revise when the canvas's are reactivated. + + + diff --git a/Mu3Mods.sln b/Mu3Mods.sln index ad62f07..5873546 100644 --- a/Mu3Mods.sln +++ b/Mu3Mods.sln @@ -52,6 +52,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TestMenuConfig", "Extras\Te EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ExclusiveAudio", "Fixes\ExclusiveAudio\ExclusiveAudio.csproj", "{0043743F-24B5-4A39-838E-964091AC7FF1}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Offgeki", "Extras\Offgeki\Offgeki.csproj", "{A052743F-24B5-4A39-838E-964091AC7FF1}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|x64 = Debug|x64 @@ -158,6 +160,10 @@ Global {0043743F-24B5-4A39-838E-964091AC7FF1}.Debug|x64.Build.0 = Debug|x64 {0043743F-24B5-4A39-838E-964091AC7FF1}.Release|x64.ActiveCfg = Release|x64 {0043743F-24B5-4A39-838E-964091AC7FF1}.Release|x64.Build.0 = Release|x64 + {A052743F-24B5-4A39-838E-964091AC7FF1}.Debug|x64.ActiveCfg = Debug|x64 + {A052743F-24B5-4A39-838E-964091AC7FF1}.Debug|x64.Build.0 = Debug|x64 + {A052743F-24B5-4A39-838E-964091AC7FF1}.Release|x64.ActiveCfg = Release|x64 + {A052743F-24B5-4A39-838E-964091AC7FF1}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE