using ABI_RC.Core; using ABI_RC.Core.InteractionSystem; using ABI_RC.Core.UI; using UnityEngine; namespace NAK.DummyMenu; public static class CreateDummyMenu { public static void Create() { CreateDefaultExamplePageIfNeeded(); GameObject cohtmlRootObject = GameObject.Find("Cohtml"); // Create menu rig // Cohtml -> Root -> Offset -> Menu GameObject dummyMenuRoot = new("DummyMenuRoot"); GameObject dummyMenuOffset = new("DummyMenuOffset"); GameObject dummyMenuItself = new("DummyMenu"); dummyMenuItself.transform.SetParent(dummyMenuOffset.transform); dummyMenuOffset.transform.SetParent(dummyMenuRoot.transform); dummyMenuRoot.transform.SetParent(cohtmlRootObject.transform); // Add dummy menu position helper DummyMenuPositionHelper positionHelper = dummyMenuRoot.AddComponent(); positionHelper._offsetTransform = dummyMenuOffset.transform; positionHelper.menuTransform = dummyMenuItself.transform; // Add components to menu (MeshFilter, MeshRenderer, Animator, CohtmlControlledView) MeshFilter meshFilter = dummyMenuItself.AddComponent(); MeshRenderer meshRenderer = dummyMenuItself.AddComponent(); Animator animator = dummyMenuItself.AddComponent(); CohtmlControlledView controlledView = dummyMenuItself.AddComponent(); // Add dummy menu manager DummyMenuManager menuManager = dummyMenuItself.AddComponent(); menuManager.cohtmlView = controlledView; menuManager._viewAnimator = animator; menuManager._uiRenderer = meshRenderer; // Steal from main menu menuManager.pattern = ViewManager.Instance.pattern; menuManager.timing = ViewManager.Instance.timing; meshFilter.mesh = ViewManager.Instance.GetComponent().sharedMesh; meshRenderer.sharedMaterial = null; // assign empty material animator.runtimeAnimatorController = ViewManager.Instance.GetComponent().runtimeAnimatorController; // Put everything on UI Internal layer dummyMenuRoot.SetLayerRecursive(CVRLayers.UIInternal); // Apply initial settings menuManager.TrySetMenuPage(); float pageWidth = ModSettings.EntryPageWidth.Value; float pageHeight = ModSettings.EntryPageHeight.Value; positionHelper.UpdateAspectRatio(pageWidth, pageHeight); } internal const string ExampleDummyMenuPath = "UIResources/DummyMenu/_example.html"; internal static string GetFullCouiPath(string couiPath) => Path.Combine(Application.streamingAssetsPath, "Cohtml", couiPath); private static void CreateDefaultExamplePageIfNeeded() { // Check if there is a file at our default path string fullPath = GetFullCouiPath(ExampleDummyMenuPath); if (File.Exists(fullPath)) { DummyMenuMod.Logger.Msg($"Dummy menu HTML file already exists at {fullPath}. No need to create a new one."); return; } DummyMenuMod.Logger.Msg($"No dummy menu HTML file found at {fullPath}. Creating a default one."); // Create the directory if it doesn't exist string directory = Path.GetDirectoryName(fullPath); if (!Directory.Exists(directory)) Directory.CreateDirectory(directory!); // Create a default HTML file using StreamWriter writer = new(fullPath, false); writer.Write(DefaultHtmlContent); writer.Flush(); writer.Close(); DummyMenuMod.Logger.Msg($"Created default dummy menu HTML file at {fullPath}. You can now open the dummy menu in-game."); } #region Default HTML Content private const string DefaultHtmlContent = """ Cohtml Bubble Pop — 1280×720

Hello World

Bubble pop — Gameface fixed
"""; #endregion Default HTML Content }