using System; using System.Collections.Generic; using System.Linq; using Adventurer.Runtime; using Core.Runtime; using EventSystem.Runtime; using Player.Runtime; using Quest.Runtime; using Quests.Runtime; using UnityEngine; using UnityEngine.UI; namespace TestFacts.Runtime { /// /// Automation orientée "vidéo promo" qui ouvre et utilise les différents panels UI /// pour illustrer un flow complet: /// 1) Ouvrir le panel de recrutement et acheter un aventurier /// 2) Ouvrir le panneau du tableau des quêtes et accepter une quête /// 3) Ouvrir le panneau des quêtes acceptées, afficher la fiche (InfoQuestPanel) /// 4) Sélectionner un aventurier via l'UI et lancer la quête /// 5) (Option promo) Compléter immédiatement la quête pour montrer l'écran terminé /// /// Placez ce composant sur un GameObject de la scène Marketing/Game avec les références UI assignées. /// public class PromoUIFlow : BaseMonoBehaviour { [Header("Références UI")] [SerializeField] UIManager _uiManager; [Tooltip("Panel boutique de recrutement (contenant RecruitementPanel)")] [SerializeField] GameObject _recruitementPanel; [Tooltip("Panel du tableau des quêtes disponibles (contenant QuestsBoardPanel)")] [SerializeField] GameObject _questsBoardPanel; [Tooltip("Panel des quêtes (liste des quêtes acceptées)")] [SerializeField] GameObject _questsPanel; [Tooltip("Panel Info d'une quête (contenant InfoQuestPanel)")] [SerializeField] GameObject _infoQuestPanel; [Header("Données (optionnelles)")] [SerializeField] AdventurerFactorySO _adventurerFactory; [SerializeField] QuestFactoryDatabase _questDatabase; [Header("Délais (s)")] [SerializeField] float _delayOpenRecruit = 0.6f; [SerializeField] float _delayBuy = 0.8f; [SerializeField] float _delayOpenBoard = 1.0f; [SerializeField] float _delayAcceptQuest = 0.8f; [SerializeField] float _delayOpenAcceptedPanel = 0.8f; [SerializeField] float _delayOpenInfo = 0.6f; [SerializeField] float _delaySelectAdventurer = 0.6f; [SerializeField] float _delayLaunch = 0.6f; [SerializeField] float _delayComplete = 0.8f; [Header("Options")] [SerializeField] int _fallbackGuildLevel = 1; [SerializeField] bool _autoCompleteForPromo = true; void Start() { EnsureBaselineFacts(); Invoke(nameof(Step_OpenRecruitPanel), _delayOpenRecruit); } // 1) Ouvrir panel recrutement void Step_OpenRecruitPanel() { try { if (_uiManager != null && _recruitementPanel != null) { _uiManager.HideAllPanels(); _uiManager.ShowPanel(_recruitementPanel); } Info("🎬 Ouverture panel Recrutement", Color.cyan); } catch (Exception ex) { Debug.LogError($"[PromoUIFlow] OpenRecruit error: {ex}"); } Invoke(nameof(Step_BuyFirstAdventurer), _delayBuy); } // 1b) Acheter le 1er aventurier via la carte UI void Step_BuyFirstAdventurer() { try { if (_recruitementPanel != null) { var card = _recruitementPanel.GetComponentsInChildren(true) .FirstOrDefault(c => c.m_buyButton != null); if (card == null) { // Forcer une génération si rien n'est présent (le panel devrait déjà le faire à OnEnable) var rp = _recruitementPanel.GetComponentInChildren(true); if (rp != null && _adventurerFactory != null) { rp.m_adventurersSO = _adventurerFactory; rp.GenerateAdventurer(4); } card = _recruitementPanel.GetComponentsInChildren(true) .FirstOrDefault(c => c.m_buyButton != null); } if (card != null && card.m_buyButton != null) { card.m_buyButton.onClick?.Invoke(); Info($"🧙 Aventurier acheté: {card.Adventurer?.Name}", Color.green); } } } catch (Exception ex) { Debug.LogError($"[PromoUIFlow] Buy error: {ex}"); } Invoke(nameof(Step_OpenQuestsBoard), _delayOpenBoard); } // 2) Ouvrir le tableau des quêtes et accepter la 1ère void Step_OpenQuestsBoard() { try { if (_uiManager != null && _questsBoardPanel != null) { _uiManager.HideAllPanels(); _uiManager.ShowPanel(_questsBoardPanel); } Info("📋 Ouverture tableau des quêtes", Color.cyan); } catch (Exception ex) { Debug.LogError($"[PromoUIFlow] OpenBoard error: {ex}"); } Invoke(nameof(Step_AcceptFirstQuestOnBoard), _delayAcceptQuest); } void Step_AcceptFirstQuestOnBoard() { try { QuestManager.Instance.NotifyAvailableQuestsUpdated(EnsurePlayerFact().GuildLevel); var card = _questsBoardPanel != null ? _questsBoardPanel.GetComponentsInChildren(true).FirstOrDefault() : null; if (card == null) { // Fallback: générer une quête à partir de la DB si possible var templ = _questDatabase?.GetAll()?.FirstOrDefault()?.questTemplates?.FirstOrDefault(); if (templ != null) { var generated = templ.ToQuestClass(QuestStateEnum.Disponible); var go = new GameObject("GeneratedQuestCardForPromo"); var qc = go.AddComponent(); qc.Setup(generated); card = qc; } } if (card != null) { card.AcceptQuest(); Info($"✅ Quête acceptée: {card.Quest?.Name}", Color.green); } } catch (Exception ex) { Debug.LogError($"[PromoUIFlow] Accept quest error: {ex}"); } Invoke(nameof(Step_OpenAcceptedQuestsPanel), _delayOpenAcceptedPanel); } // 3) Ouvrir la liste des quêtes acceptées void Step_OpenAcceptedQuestsPanel() { try { if (_uiManager != null && _questsPanel != null) { _uiManager.HideAllPanels(); _uiManager.ShowPanel(_questsPanel); } QuestSignals.RaiseRefreshQuests(); Info("📜 Ouverture panel Quêtes (acceptées)", Color.cyan); } catch (Exception ex) { Debug.LogError($"[PromoUIFlow] OpenAccepted error: {ex}"); } Invoke(nameof(Step_OpenInfoForFirstQuest), _delayOpenInfo); } // 3b) Ouvrir la fiche info d'une quête via la carte d'interaction void Step_OpenInfoForFirstQuest() { try { var inter = _questsPanel != null ? _questsPanel.GetComponentsInChildren(true).FirstOrDefault() : null; if (inter != null) { inter.OnClick(); // ouvre InfoQuestPanel via le signal } else { // Fallback: prendre la première quête acceptée et forcer l'ouverture var accepted = GetFact>("accepted_quests"); var quest = accepted?.FirstOrDefault(); if (quest != null) { QuestSignals.RaiseInfoQuestPanel(quest); } } Info("ℹ️ Ouverture InfoQuestPanel", Color.cyan); } catch (Exception ex) { Debug.LogError($"[PromoUIFlow] OpenInfo error: {ex}"); } Invoke(nameof(Step_SelectAdventurerInInfoPanel), _delaySelectAdventurer); } // 4) Sélectionner un aventurier sur l'UI et lancer la quête void Step_SelectAdventurerInInfoPanel() { try { if (_infoQuestPanel != null) { // Tenter de cliquer sur une carte sélectionnable d'aventurier var selectable = _infoQuestPanel.GetComponentsInChildren(true) .FirstOrDefault(); if (selectable == null) { // Parfois les cartes sont ailleurs (liste globale), on tente dans toute la scène selectable = GameObject.FindObjectsOfType(true).FirstOrDefault(); } if (selectable != null) { selectable.OnClick(); // Envoie AdventurerSignals.OnAdventurerSelected } } } catch (Exception ex) { Debug.LogError($"[PromoUIFlow] Select adventurer error: {ex}"); } Invoke(nameof(Step_LaunchQuestFromInfoPanel), _delayLaunch); } void Step_LaunchQuestFromInfoPanel() { try { if (_infoQuestPanel != null) { var info = _infoQuestPanel.GetComponent(); if (info != null) { info.LaunchQuest(); Info("🚀 Quête lancée", Color.yellow); } } } catch (Exception ex) { Debug.LogError($"[PromoUIFlow] Launch quest error: {ex}"); } if (_autoCompleteForPromo) Invoke(nameof(Step_CompleteQuestNow), _delayComplete); } // 5) Option promo: compléter immédiatement la quête pour montrer l'état terminé void Step_CompleteQuestNow() { try { var quest = QuestManager.Instance.CurrentQuest; if (quest == null) { Warning("Aucune quête courante à compléter."); return; } // Utiliser l'équipe d'un seul aventurier (le premier dispo) var team = EnsureMyAdventurersFact(); if (team.Count == 0) return; var ids = QuestClass.GetIdFromAdventurers(new List { team[0] }); if (quest.State != QuestStateEnum.InProgress) { // S'assure que l'état est correct pour compléter var gameTime = GetFact("game_time"); QuestManager.Instance.StartQuest(quest, new List { team[0] }, gameTime); } QuestManager.Instance.CompleteQuest(quest, ids); QuestManager.Instance.NotifyCompletedQuests(); QuestSignals.RaiseRefreshQuests(); Info($"🏁 Quête complétée (promo): {quest.Name}", Color.green); } catch (Exception ex) { Debug.LogError($"[PromoUIFlow] Complete quest error: {ex}"); } } // --- Utils ----------------------------------------------------------- void EnsureBaselineFacts() { var player = EnsurePlayerFact(); player.Money = Mathf.Max(player.Money, 9999); player.AdventurersMax = Mathf.Max(player.AdventurersMax, 10); SaveFacts(); } PlayerClass EnsurePlayerFact() { if (!FactExists(GameManager.Instance.Profile, out var player) || player == null) { player = new PlayerClass("Promo Guild", _fallbackGuildLevel, 9999, 10); SetFact(GameManager.Instance.Profile, player, FactPersistence.Persistent); } return player; } List EnsureMyAdventurersFact() { if (!FactExists>("my_adventurers", out var list) || list == null) { list = new List(); SetFact("my_adventurers", list, FactPersistence.Persistent); } return list; } } }