GuildTycoon/Assets/_/Features/Tests/Runtime/PromoUIFlow.cs

335 lines
13 KiB
C#
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
{
/// <summary>
/// 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.
/// </summary>
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<GameUI.Runtime.AdventurerCardUI>(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<GameUI.Runtime.RecruitementPanel>(true);
if (rp != null && _adventurerFactory != null)
{
rp.m_adventurersSO = _adventurerFactory;
rp.GenerateAdventurer(4);
}
card = _recruitementPanel.GetComponentsInChildren<GameUI.Runtime.AdventurerCardUI>(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<GameUI.Runtime.QuestCardUI>(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<GameUI.Runtime.QuestCardUI>();
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<GameUI.Runtime.InteractionQuestCard>(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<List<QuestClass>>("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<GameUI.Runtime.AdventurerCardSelectionnable>(true)
.FirstOrDefault();
if (selectable == null)
{
// Parfois les cartes sont ailleurs (liste globale), on tente dans toute la scène
selectable = GameObject.FindObjectsOfType<GameUI.Runtime.AdventurerCardSelectionnable>(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<GameUI.Runtime.InfoQuestPanel>();
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<AdventurerClass> { team[0] });
if (quest.State != QuestStateEnum.InProgress)
{
// S'assure que l'état est correct pour compléter
var gameTime = GetFact<GameTime>("game_time");
QuestManager.Instance.StartQuest(quest, new List<AdventurerClass> { 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<PlayerClass>(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<AdventurerClass> EnsureMyAdventurersFact()
{
if (!FactExists<List<AdventurerClass>>("my_adventurers", out var list) || list == null)
{
list = new List<AdventurerClass>();
SetFact("my_adventurers", list, FactPersistence.Persistent);
}
return list;
}
}
}