A downloadable game

using System.Collections.Generic;

using UnityEngine;

using UnityEngine.UI;

using UnityEngine.EventSystems;

public class CodexMenu_FullscreenAllInOne : MonoBehaviour

{

    // Internal state

    private GameObject canvasGO;

    private GameObject backgroundPanel;

    private GameObject page1;

    private GameObject page2;

    // Page1 UI refs

    private InputField nameInput;

    private Button applyNameBtn;

    private Text nameDisplay;

    private Button giveMoneyBtn;

    private Text moneyDisplay;

    // Page2 UI refs

    private Button giveEverythingBtn;

    private Text feedbackText;

    // Page switching

    private Button nextPageBtn;

    private Button prevPageBtn;

    // Data

    private string playerName = "Player";

    private long money = 0;

    private const long ONE_TRILLION = 1_000_000_000_000L;

    // GiveEverything lists (editable in inspector if desired)

    public List<string> itemsToGive = new List<string>() { "item_sword", "item_shield" };

    public List<string> unlocks = new List<string>() { "level_2", "skin_red" };

    void Start()

    {

        BuildCanvasAndUI();

        SwitchToPage(1);

        UpdateNameUI();

        UpdateMoneyUI();

    }

    void Update()

    {

        // Accept Escape to toggle visibility of the whole menu

        if (Input.GetKeyDown(KeyCode.Escape))

        {

            bool on = canvasGO.activeSelf;

            canvasGO.SetActive(!on);

            // If turning on, ensure event system exists/select default

            if (!on) TrySelectDefault();

        }

    }

    // ----------------------------

    // UI Construction

    // ----------------------------

    void BuildCanvasAndUI()

    {

        // 1) Ensure EventSystem exists

        if (FindObjectOfType<EventSystem>() == null)

        {

            GameObject es = new GameObject("EventSystem", typeof(EventSystem), typeof(StandaloneInputModule));

            DontDestroyOnLoad(es);

        }

        // 2) Canvas root

        canvasGO = new GameObject("CodexMenu_Canvas");

        Canvas canvas = canvasGO.AddComponent<Canvas>();

        canvas.renderMode = RenderMode.ScreenSpaceOverlay;

        canvasGO.AddComponent<CanvasScaler>();

        canvasGO.AddComponent<GraphicRaycaster>();

        DontDestroyOnLoad(canvasGO);

        // 3) Background full-screen panel (black)

        backgroundPanel = CreateUIObject("Background", canvasGO.transform);

        Image bgImage = backgroundPanel.AddComponent<Image>();

        bgImage.color = Color.black;

        RectTransform bgRT = backgroundPanel.GetComponent<RectTransform>();

        StretchToParent(bgRT);

        // 4) Header Title

        GameObject title = CreateUIObject("Title", backgroundPanel.transform);

        Text titleText = AddText(title.transform, "CODEX MENU", 36, TextAnchor.UpperCenter);

        RectTransform titleRT = title.GetComponent<RectTransform>();

        titleRT.anchorMin = new Vector2(0.0f, 0.92f);

        titleRT.anchorMax = new Vector2(1.0f, 1.0f);

        titleRT.offsetMin = new Vector2(0, 0);

        titleRT.offsetMax = new Vector2(0, -4);

        titleText.color = Color.red;

        // 5) Page containers

        page1 = CreateUIObject("Page1", backgroundPanel.transform);

        RectTransform p1RT = page1.GetComponent<RectTransform>();

        p1RT.anchorMin = new Vector2(0.05f, 0.1f);

        p1RT.anchorMax = new Vector2(0.95f, 0.88f);

        p1RT.offsetMin = Vector2.zero;

        p1RT.offsetMax = Vector2.zero;

        page2 = CreateUIObject("Page2", backgroundPanel.transform);

        RectTransform p2RT = page2.GetComponent<RectTransform>();

        p2RT.anchorMin = p1RT.anchorMin;

        p2RT.anchorMax = p1RT.anchorMax;

        p2RT.offsetMin = Vector2.zero;

        p2RT.offsetMax = Vector2.zero;

        // 6) Page navigation (Next / Prev)

        nextPageBtn = CreateButton("NextPage", backgroundPanel.transform, "Page 2 →");

        RectTransform nbRT = nextPageBtn.GetComponent<RectTransform>();

        nbRT.anchorMin = new Vector2(0.75f, 0.02f);

        nbRT.anchorMax = new Vector2(0.95f, 0.08f);

        nbRT.offsetMin = Vector2.zero;

        nbRT.offsetMax = Vector2.zero;

        nextPageBtn.onClick.AddListener(() => SwitchToPage(2));

        TintButtonText(nextPageBtn);

        prevPageBtn = CreateButton("PrevPage", backgroundPanel.transform, "← Page 1");

        RectTransform pbRT = prevPageBtn.GetComponent<RectTransform>();

        pbRT.anchorMin = new Vector2(0.05f, 0.02f);

        pbRT.anchorMax = new Vector2(0.25f, 0.08f);

        pbRT.offsetMin = Vector2.zero;

        pbRT.offsetMax = Vector2.zero;

        prevPageBtn.onClick.AddListener(() => SwitchToPage(1));

        TintButtonText(prevPageBtn);

        // 7) PAGE 1 contents: Name & Money

        float y = 0.7f;

        nameInput = CreateInputField(page1.transform, "Enter New Name...", out RectTransform nRT);

        nRT.anchorMin = new Vector2(0.05f, y);

        nRT.anchorMax = new Vector2(0.95f, y + 0.12f);

        nRT.offsetMin = Vector2.zero;

        nRT.offsetMax = Vector2.zero;

        nameInput.onEndEdit.AddListener((s) => { if (Input.GetKeyDown(KeyCode.Return) || Input.GetKeyDown(KeyCode.KeypadEnter)) ApplyNameFromInput(); /* fallback */ });

        applyNameBtn = CreateButton("ApplyNameBtn", page1.transform, "Apply Name");

        RectTransform abRT = applyNameBtn.GetComponent<RectTransform>();

        abRT.anchorMin = new Vector2(0.30f, y - 0.08f);

        abRT.anchorMax = new Vector2(0.70f, y - 0.02f);

        abRT.offsetMin = Vector2.zero;

        abRT.offsetMax = Vector2.zero;

        applyNameBtn.onClick.AddListener(ApplyNameFromInput);

        TintButtonText(applyNameBtn);

        nameDisplay = CreateText(page1.transform, "Name: " + playerName, 24, TextAnchor.MiddleLeft);

        RectTransform ndRT = nameDisplay.GetComponent<RectTransform>();

        ndRT.anchorMin = new Vector2(0.05f, y - 0.20f);

        ndRT.anchorMax = new Vector2(0.95f, y - 0.10f);

        ndRT.offsetMin = Vector2.zero;

        ndRT.offsetMax = Vector2.zero;

        nameDisplay.color = Color.red;

        // Money controls

        giveMoneyBtn = CreateButton("GiveMoneyBtn", page1.transform, "Give 1T Money");

        RectTransform gmRT = giveMoneyBtn.GetComponent<RectTransform>();

        gmRT.anchorMin = new Vector2(0.05f, 0.15f);

        gmRT.anchorMax = new Vector2(0.45f, 0.25f);

        gmRT.offsetMin = Vector2.zero;

        gmRT.offsetMax = Vector2.zero;

        giveMoneyBtn.onClick.AddListener(GiveOneTrillion);

        TintButtonText(giveMoneyBtn);

        moneyDisplay = CreateText(page1.transform, "Money: 0", 24, TextAnchor.MiddleLeft);

        RectTransform mdRT = moneyDisplay.GetComponent<RectTransform>();

        mdRT.anchorMin = new Vector2(0.55f, 0.15f);

        mdRT.anchorMax = new Vector2(0.95f, 0.25f);

        mdRT.offsetMin = Vector2.zero;

        mdRT.offsetMax = Vector2.zero;

        moneyDisplay.color = Color.red;

        // 8) PAGE 2 contents: Give Everything + feedback

        giveEverythingBtn = CreateButton("GiveEverythingBtn", page2.transform, "Give EVERYTHING");

        RectTransform geRT = giveEverythingBtn.GetComponent<RectTransform>();

        geRT.anchorMin = new Vector2(0.25f, 0.55f);

        geRT.anchorMax = new Vector2(0.75f, 0.67f);

        geRT.offsetMin = Vector2.zero;

        geRT.offsetMax = Vector2.zero;

        giveEverythingBtn.onClick.AddListener(GiveEverything);

        TintButtonText(giveEverythingBtn);

        feedbackText = CreateText(page2.transform, "Feedback: Ready", 22, TextAnchor.MiddleCenter);

        RectTransform ftRT = feedbackText.GetComponent<RectTransform>();

        ftRT.anchorMin = new Vector2(0.05f, 0.10f);

        ftRT.anchorMax = new Vector2(0.95f, 0.30f);

        ftRT.offsetMin = Vector2.zero;

        ftRT.offsetMax = Vector2.zero;

        feedbackText.color = Color.red;

        // Set page2 inactive initially

        page2.SetActive(false);

        // Apply red tint to other text/buttons

        ApplyRedThemeRecursive(backgroundPanel.transform);

    }

    // ----------------------------

    // UI Helpers

    // ----------------------------

    GameObject CreateUIObject(string name, Transform parent)

    {

        GameObject go = new GameObject(name);

        go.transform.SetParent(parent, false);

        RectTransform rt = go.AddComponent<RectTransform>();

        rt.sizeDelta = Vector2.zero;

        return go;

    }

    void StretchToParent(RectTransform rt)

    {

        rt.anchorMin = Vector2.zero;

        rt.anchorMax = Vector2.one;

        rt.offsetMin = Vector2.zero;

        rt.offsetMax = Vector2.zero;

    }

    Text AddText(Transform parent, string text, int fontSize = 24, TextAnchor anchor = TextAnchor.MiddleCenter)

    {

        GameObject go = CreateUIObject("Text", parent);

        Text t = go.AddComponent<Text>();

        t.text = text;

        t.fontSize = fontSize;

        t.alignment = anchor;

        t.font = Resources.GetBuiltinResource<Font>("Arial.ttf");

        RectTransform rt = go.GetComponent<RectTransform>();

        rt.sizeDelta = new Vector2(200, 40);

        return t;

    }

    Text CreateText(Transform parent, string text, int fontSize, TextAnchor anchor)

    {

        Text t = AddText(parent, text, fontSize, anchor);

        return t;

    }

    Button CreateButton(string name, Transform parent, string label)

    {

        GameObject btnGO = CreateUIObject(name, parent);

        Image img = btnGO.AddComponent<Image>();

        img.color = new Color(0.12f, 0.12f, 0.12f, 0.95f); // dark button

        Button b = btnGO.AddComponent<Button>();

        RectTransform rt = btnGO.GetComponent<RectTransform>();

        rt.sizeDelta = new Vector2(200, 40);

        GameObject lbl = CreateUIObject("Label", btnGO.transform);

        Text t = lbl.AddComponent<Text>();

        t.text = label;

        t.alignment = TextAnchor.MiddleCenter;

        t.font = Resources.GetBuiltinResource<Font>("Arial.ttf");

        t.fontSize = 20;

        RectTransform lrt = lbl.GetComponent<RectTransform>();

        StretchToParent(lrt);

        return b;

    }

    InputField CreateInputField(Transform parent, string placeholderText, out RectTransform rect)

    {

        GameObject fieldGO = CreateUIObject("InputField", parent);

        Image bg = fieldGO.AddComponent<Image>();

        bg.color = new Color(0.0f, 0.0f, 0.0f, 0.6f);

        RectTransform rt = fieldGO.GetComponent<RectTransform>();

        rt.sizeDelta = new Vector2(400, 40);

        InputField input = fieldGO.AddComponent<InputField>();

        // Text component

        GameObject textGO = CreateUIObject("Text", fieldGO.transform);

        Text txt = textGO.AddComponent<Text>();

        txt.font = Resources.GetBuiltinResource<Font>("Arial.ttf");

        txt.fontSize = 20;

        txt.alignment = TextAnchor.MiddleLeft;

        txt.color = Color.red;

        RectTransform tRT = textGO.GetComponent<RectTransform>();

        StretchToParent(tRT);

        input.textComponent = txt;

        // Placeholder

        GameObject phGO = CreateUIObject("Placeholder", fieldGO.transform);

        Text ph = phGO.AddComponent<Text>();

        ph.text = placeholderText;

        ph.font = Resources.GetBuiltinResource<Font>("Arial.ttf");

        ph.fontSize = 18;

        ph.color = new Color(1f, 0.75f, 0.75f, 0.6f);

        ph.alignment = TextAnchor.MiddleLeft;

        RectTransform phRT = phGO.GetComponent<RectTransform>();

        StretchToParent(phRT);

        input.placeholder = ph;

        rect = rt;

        return input;

    }

    void TintButtonText(Button b)

    {

        if (b == null) return;

        Text t = b.GetComponentInChildren<Text>();

        if (t != null) t.color = Color.red;

    }

    void ApplyRedThemeRecursive(Transform root)

    {

        Text[] texts = root.GetComponentsInChildren<Text>(true);

        foreach (var t in texts)

            t.color = Color.red;

        Image[] imgs = root.GetComponentsInChildren<Image>(true);

        foreach (var i in imgs)

        {

            // keep main background black, darken other UI images

            if (i.gameObject == backgroundPanel) continue;

            if (i.gameObject.name.Contains("Label")) continue;

            i.color = new Color(0.08f, 0.08f, 0.08f, 0.95f);

        }

    }

    // ----------------------------

    // Menu Actions

    // ----------------------------

    void ApplyNameFromInput()

    {

        if (nameInput == null) return;

        string candidate = nameInput.text != null ? nameInput.text.Trim() : "";

        if (string.IsNullOrEmpty(candidate)) return;

        playerName = candidate;

        UpdateNameUI();

    }

    void UpdateNameUI()

    {

        if (nameDisplay != null)

            nameDisplay.text = "Name: " + playerName;

    }

    void GiveOneTrillion()

    {

        money += ONE_TRILLION;

        UpdateMoneyUI();

    }

    void UpdateMoneyUI()

    {

        if (moneyDisplay != null)

            moneyDisplay.text = "Money: " + money.ToString("N0");

    }

    void GiveEverything()

    {

        // Big money boost

        money += ONE_TRILLION * 10;

        UpdateMoneyUI();

        // Simulate granting items/unlocks (these are debug logs; replace with your game's calls)

        foreach (var id in itemsToGive)

            Debug.Log("[Codex] Granted item: " + id);

        foreach (var u in unlocks)

            Debug.Log("[Codex] Unlocked: " + u);

        if (feedbackText != null)

            feedbackText.text = "Gave EVERYTHING!";

    }

    // ----------------------------

    // Helpers

    // ----------------------------

    void SwitchToPage(int pageNumber)

    {

        if (page1 != null) page1.SetActive(pageNumber == 1);

        if (page2 != null) page2.SetActive(pageNumber == 2);

    }

    void TrySelectDefault()

    {

        // Try to select default UI element for keyboard navigation

        if (nameInput != null)

        {

            nameInput.ActivateInputField();

        }

    }

}

Leave a comment

Log in with itch.io to leave a comment.