using UnityEngine; using TMPro; using UnityEngine.SceneManagement; using UnityEngine.UI; public class MainMenuManager : MonoBehaviour { const string CryptoAddressPrefsKey = "MainMenu.CryptoAddress"; /// 500 CC fee to process a withdrawal. const int WithdrawalFeeCc = 500; /// $20 USD = 20.0 RC, stored in DB as 80 rc coins (4 coins per 1.0 RC). const int MinimumWithdrawalRcCoins = 80; [Header("Stats")] [SerializeField] private GameObject statsPanel; [SerializeField] private TMP_Text usernameText; [SerializeField] private TMP_Text ccText; [SerializeField] private TMP_Text rcText; [Header("Screens")] public GameObject mainMenuScreen; public GameObject gameModesScreen; public GameObject dummyBuyScreen; public GameObject withdrawalScreen; [Header("Play")] public Button btnPlay; public TMP_Text rcPlayText; [Header("Dummy Buy")] public Button btnBuyUsd5; public Button btnBuyUsd20; public Button btnBuyUsd50; [Header("Withdrawal")] public Button btnWithdrawal; public Button btnPaste; public TMP_InputField inputCryptoAddress; public TMP_Text txtWithdrawStatus; void Awake() { if(LoginManager.instance==null){ SceneManager.LoadScene(0); } } void Start() { LoginManager.OnUserDataUpdated += OnUserUpdated; usernameText.text = ""; ccText.text = ""; rcText.text = ""; LoginManager.instance.GetUserData((success, error, user) => { if(success){ OnUserUpdated(user); } }); btnBuyUsd5.onClick.AddListener(() => OnBuy(RcPack.Usd5)); btnBuyUsd20.onClick.AddListener(() => OnBuy(RcPack.Usd20)); btnBuyUsd50.onClick.AddListener(() => OnBuy(RcPack.Usd50)); if (inputCryptoAddress != null) { inputCryptoAddress.text = PlayerPrefs.GetString(CryptoAddressPrefsKey, string.Empty); inputCryptoAddress.onValueChanged.AddListener(OnCryptoAddressChanged); } UpdateWithdrawalStatus(); if (btnPaste != null) btnPaste.onClick.AddListener(OnPasteFromClipboard); btnPlay.onClick.AddListener(OnPlay); } void OnPlay(){ if(LoginManager.CurrentUser.rc < 21){ Debug.LogError("Not enough RC to play"); return; } CupidLobby.instance.Matchmake(); } void OnCryptoAddressChanged(string value) { PlayerPrefs.SetString(CryptoAddressPrefsKey, value ?? string.Empty); PlayerPrefs.Save(); UpdateWithdrawalStatus(); } void UpdateWithdrawalStatus(UserData user = null) { if (txtWithdrawStatus == null) return; UserData u = user ?? LoginManager.CurrentUser; if (u == null) return; if (inputCryptoAddress != null && string.IsNullOrWhiteSpace(inputCryptoAddress.text)) { txtWithdrawStatus.text = "Enter a valid wallet address to withdraw safely."; return; } if (u.rc < MinimumWithdrawalRcCoins) { txtWithdrawStatus.text = "Your RC balance is below the minimum withdrawal amount ($20 USD / 20.0 RC)."; return; } if (u.cc < WithdrawalFeeCc) { txtWithdrawStatus.text = "Withdrawal costs 500 CC. Your CC balance is below 500 CC."; return; } txtWithdrawStatus.text = string.Empty; } void OnPasteFromClipboard() { if (inputCryptoAddress == null) return; string clip = GUIUtility.systemCopyBuffer; if (!string.IsNullOrEmpty(clip)) inputCryptoAddress.text = clip; } void OnBuy(string packId){ LoginManager.instance.PurchaseRcPack(packId, (success, error) => { if(success){ OnUserUpdated(LoginManager.CurrentUser); AudioManager.instance.PlayCoinsSfx(); } }); } void OnDestroy() { LoginManager.OnUserDataUpdated -= OnUserUpdated; } // Update is called once per frame void Update() { } void OnUserUpdated(UserData user){ usernameText.text = user.username; ccText.text = user.cc.ToString("N0") + " CC"; rcText.text = CoinHelper.FormatString(user.rc) + " RC"; if(LoginManager.CurrentUser.rc < 21){ rcPlayText.text = "Not enough RC to play"; btnPlay.interactable = false; }else{ rcPlayText.text = ""; btnPlay.interactable = true; } UpdateWithdrawalStatus(user); } public void ShowMainMenuScreen(){ statsPanel.SetActive(true); mainMenuScreen.SetActive(true); gameModesScreen.SetActive(false); dummyBuyScreen.SetActive(false); withdrawalScreen.SetActive(false); } public void ShowGameModesScreen(){ statsPanel.SetActive(true); mainMenuScreen.SetActive(false); gameModesScreen.SetActive(true); dummyBuyScreen.SetActive(false); withdrawalScreen.SetActive(false); } public void ShowDummyBuyScreen(){ statsPanel.SetActive(false); mainMenuScreen.SetActive(false); gameModesScreen.SetActive(false); dummyBuyScreen.SetActive(true); withdrawalScreen.SetActive(false); } public void ShowWithdrawalScreen(){ statsPanel.SetActive(false); mainMenuScreen.SetActive(false); gameModesScreen.SetActive(false); dummyBuyScreen.SetActive(false); withdrawalScreen.SetActive(true); UpdateWithdrawalStatus(); } }