using UnityEngine; using UnityEngine.UI; using UnityEngine.Events; using UnityEngine.SceneManagement; using UnityEngine.EventSystems; using System.Collections.Generic; using UnityEngine.Audio; using Bansonic; using Steamworks; using GameServer.Client; public class btmandtopController : MonoBehaviour, ICancelHandler { public static event System.Action GlobalSettingsVisibilityChanged; public static event System.Action GlobalOverlayPanelVisibilityChanged; public static bool CurrentSettingsVisible { get; private set; } public static bool CurrentOverlayPanelsVisible { get; private set; } public event System.Action SettingsVisibilityChanged; [Header("player unique so")] public Player_SO player_SO; public Text playerCoins_legacy; public Text player_mmrFragment; public Text player_rks; [Header("put prefabs here")] public GameObject putPrefabsHere; [Header("son buttons")] public Button settings_launch; public Button userInfo_launch; public Button store_launch; public Button showLevel_display; public Button email_display; public Button notice_display; public Button market_launch; public Button button_userBag; [Header("User Guide")] [SerializeField] private Button userGuideButton; [SerializeField] private Image guideDisplayImage; [SerializeField] private Button preIMGb; [SerializeField] private Button aftIMGb; [SerializeField] private Button closeGuideButton; [SerializeField] private Text guideIndexLegacyText; [SerializeField] private List guideMappings; [System.Serializable] public struct GuideMapping { public string sceneName; public List guideSprites; } public Button button_Music; [Header("MusicPic")] public RectTransform musicPicRoot; public AudioMixerGroup bgmMixerGroup; public bool showMusicPicInUI = false; public string uiSceneName = "UI_UI"; public float musicPicFadeTime = 0.25f; [Header("sig prefabs")] public GameObject showLevel_prefab; public GameObject store_prefab; public GameObject settings_prefab; public GameObject userInfo_prefab; public GameObject email_prefab; public GameObject notice_prefab; public GameObject userBag_prefab; [Header("mail red pot")] public Image mailRedPot; [Header("New Back Buttons")] [SerializeField] private Button back_navButton; [SerializeField] private Button home_navButton; [SerializeField] private Button settings_navButton; [SerializeField] private string homeSceneName = "UI_UI"; [SerializeField] private string backFallbackSceneName = "Main_main"; [Header("Scene Navigation Rules")] [Tooltip("Define explicit back-navigation targets for specific scenes. This overrides the history-based navigation.")] [SerializeField] private List navigationRules; [System.Serializable] public struct SceneNavigationRule { public string sceneName; [Tooltip("The scene to return to. If empty, falls back to history.")] public string backTargetScene; [Tooltip("Optional: Visual depth indicator (0=Root, 1=Chapter, etc)")] public int depth; } [Header("Steam Integration")] public Material steamMaterial; public Text steamUserNameText; public Text steamUserID64Text; public Text steamStatusText; public Image steamUserAvatarImage; private UnityAction instantiateSettings; private UnityAction instantiateUserInfo; private UnityAction instantiateStore; private UnityAction instantiateShowLevel; private UnityAction instantiateEmail; private UnityAction instantiateNotice; private UnityAction navBackAction; private UnityAction navHomeAction; private UnityAction navSettingsAction; private UnityAction navGuideAction; private UnityAction instantiateMarket; private UnityAction instantiateUserBag; // cached reference to the settings instance to ensure only one exists private GameObject settingsInstance; private GameObject userInfoInstance; private GameObject storeInstance; private GameObject showLevelInstance; private GameObject emailInstance; private GameObject noticeInstance; private GameObject userBagInstance; private CanvasGroup musicPicGroup; private Coroutine musicPicFade; private bool musicPicVisible = true; private bool navSceneLoading = false; private bool lastSettingsVisibilityState; private bool lastOverlayPanelsVisibilityState; private readonly Dictionary guideIndexByScene = new Dictionary(); private string currentGuideScene = string.Empty; private static btmandtopController activeInstance; private static readonly List sceneHistory = new List(); private static bool sceneHistoryHooked = false; private static string trackedCurrentScene = string.Empty; void Awake() { activeInstance = this; EnsureMusicPicRoot(); InitializeSceneHistoryIfNeeded(); } void Start() { PlayerEconomyLedger.EnsureInstance().AttachPlayerData(player_SO); PlayerEconomyLedger.EnsureInstance().OnCoinsChanged += HandleCoinsChanged; PlayerEconomyLedger.EnsureInstance().OnMaterialChanged += HandleMaterialChanged; PlayerRksService.EnsureLoaded(player_SO); PlayerRksService.OnRksChanged += HandleRksChanged; UpdatePlayerCoinsLegacyText(PlayerEconomyLedger.EnsureInstance().GetCoins()); UpdatePlayerMmrFragmentText(PlayerEconomyLedger.EnsureInstance().GetMaterial()); UpdatePlayerRksText(PlayerRksService.GetBestOverallRks(player_SO)); if (button_Music == null) { var btn = transform.Find("Button_Music") as RectTransform; if (btn != null) button_Music = btn.GetComponent