From 91a53c841715d2c331b928c5538ea1045ff0b4a3 Mon Sep 17 00:00:00 2001 From: mrtoine Date: Fri, 17 Oct 2025 12:43:38 +0200 Subject: [PATCH] =?UTF-8?q?Les=20portraits=20des=20aventuriers=20poss?= =?UTF-8?q?=C3=A9d=C3=A9s=20ne=20sont=20plus=20remplacer=20par=20une=20ima?= =?UTF-8?q?ge=20blanche=20lorsque=20l'on=20recrute.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Runtime/Adventurers/AdventurersPanel.cs | 63 +++++++++++++++++-- 1 file changed, 57 insertions(+), 6 deletions(-) diff --git a/Assets/_/Features/UI/Runtime/Adventurers/AdventurersPanel.cs b/Assets/_/Features/UI/Runtime/Adventurers/AdventurersPanel.cs index c3b60089..4e87db4d 100644 --- a/Assets/_/Features/UI/Runtime/Adventurers/AdventurersPanel.cs +++ b/Assets/_/Features/UI/Runtime/Adventurers/AdventurersPanel.cs @@ -55,19 +55,70 @@ namespace GameUI.Runtime void DisplayAdventurers() { + // Build a lookup of existing cards by their Adventurer instance + Dictionary existing = new Dictionary(); + List orphaned = new List(); foreach (Transform child in _heroesPanel.transform) { - Destroy(child.gameObject); + AdventurerCardUI card = child.GetComponent(); + if (card != null && card.Adventurer != null) + { + if (!existing.ContainsKey(card.Adventurer)) + existing.Add(card.Adventurer, card); + else + orphaned.Add(card); // duplicate safety + } + else if (card != null) + { + orphaned.Add(card); + } } List filtered = FilterAdventurers(_sort); - foreach (AdventurerClass adventurer in filtered) + // Reuse or create cards to match the filtered list and order + HashSet used = new HashSet(); + for (int i = 0; i < filtered.Count; i++) { - GameObject cardAdventurerGO = Instantiate(_adventurerPrefab, _heroesPanel.transform); - cardAdventurerGO.transform.SetAsLastSibling(); - AdventurerCardUI card = cardAdventurerGO.GetComponent(); - card.setup(adventurer); + AdventurerClass adv = filtered[i]; + AdventurerCardUI card; + if (existing.TryGetValue(adv, out card)) + { + // Refresh textual data and availability indicators without touching portrait + card.setup(adv); + card.transform.SetSiblingIndex(i); + } + else + { + GameObject cardAdventurerGO = Instantiate(_adventurerPrefab, _heroesPanel.transform); + cardAdventurerGO.transform.SetSiblingIndex(i); + card = cardAdventurerGO.GetComponent(); + if (card != null) + { + card.setup(adv); + } + } + if (card != null) + used.Add(card); + } + + // Remove cards that are no longer needed (not part of filtered) or orphaned + foreach (Transform child in _heroesPanel.transform) + { + AdventurerCardUI card = child.GetComponent(); + if (card != null && !used.Contains(card)) + { + Destroy(child.gameObject); + } + } + + // Cleanup any explicit orphaned duplicates detected earlier + foreach (var card in orphaned) + { + if (card != null && !used.Contains(card)) + { + Destroy(card.gameObject); + } } }