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(); } }