using Gs2.Unity.Util; using System; using System.Threading.Tasks; using UnityEngine; using GS2Studio.Generated.Quest; using GS2Studio.Generated.Progress; using GS2Studio.Generated.Wallet; public sealed class AdventureStudioView : MonoBehaviour { [SerializeField] private QuestListHandler quests; private bool busy; private bool unresolved; private string message = ""; [SerializeField] private ProgressHandler progress; [SerializeField] private WalletHandler wallet; private void OnEnable() { if (quests != null) quests.Failed += ShowLoadError; if (progress != null) progress.Failed += ShowLoadError; if (wallet != null) wallet.Failed += ShowLoadError; } private void OnDisable() { if (quests != null) quests.Failed -= ShowLoadError; if (progress != null) progress.Failed -= ShowLoadError; if (wallet != null) wallet.Failed -= ShowLoadError; } private void ShowLoadError(Exception error) { message = "Could not load: " + error.GetType().Name; } private void OnGUI() { var sessionHolder = Gs2GameSessionHolder.Instance; if (quests == null || sessionHolder == null || !sessionHolder.Initialized) { return; } GUILayout.BeginArea(new Rect(20, 100, 650, 650), GUI.skin.box); GUILayout.Label(message); if (quests.IsLoaded) { DrawQuestButtons(); DrawPlayerStatus(); } else { GUILayout.Label("Loading adventures..."); } GUI.enabled = true; GUILayout.EndArea(); } private void DrawQuestButtons() { var canOperate = !busy && !unresolved && progress.HasValue; GUI.enabled = canOperate && !progress.Model.InProgress; foreach (var quest in quests.Binders) { GUILayout.Label(quest.DisplayName); if (GUILayout.Button("Start: " + quest.DisplayName)) { Run(() => quest.Start()); } } GUI.enabled = canOperate && progress.Model.InProgress; if (GUILayout.Button("Complete")) { Run(() => progress.Binder.Complete()); } GUI.enabled = true; } private void DrawPlayerStatus() { GUILayout.Label(wallet.HasValue ? "Coins: " + wallet.Model.Free : "Loading coins..."); if (!progress.HasValue) { GUILayout.Label("Loading progress..."); } else { GUILayout.Label(progress.Model.InProgress ? "Adventure in progress" : "Choose an adventure"); } } private async void Run(Func operation) { if (busy || unresolved) return; busy = true; unresolved = true; message = "Processing..."; try { await operation(); unresolved = false; message = "Action completed"; } catch (Exception error) { message = "Cannot confirm the result. New actions are paused: " + error.GetType().Name; } finally { busy = false; } } }