using System; using System.Collections; using System.Collections.Concurrent; using System.Collections.Generic; using BITFALL.Player.Survival; using BITKit.Entities; using BITKit.Entities.Player; using BITKit.UX; using RotaryHeart.Lib.SerializableDictionary; using UnityEngine; using UnityEngine.TextCore.Text; using UnityEngine.UIElements; namespace BITFALL.UX { public class UXSurvival : MonoBehaviour { [SerializeReference,SubclassSelector] private IPlayerService playerService; [SerializeField] private SerializableDictionaryBase survivalEventIcons; [SerializeField] private UXBuilder survivalEventBuilder; private readonly ConcurrentDictionary spawnedSurvivalEvents = new(); private IPlayerSurvival _playerSurvival; private void Awake() { playerService.OnPlayerInitialized += OnPlayerInitialized; } private void OnDestroy() { playerService.OnPlayerInitialized -= OnPlayerInitialized; } private void OnPlayerInitialized(Entity obj) { _playerSurvival = obj.Get(); _playerSurvival.OnSurvivalEventOpened += OnSurvivalEventOpened; _playerSurvival.OnSurvivalEventClosed += OnSurvivalEventClosed; } private void OnSurvivalEventClosed(IPlayerSurvivalEvent obj) { if (spawnedSurvivalEvents.TryRemove(obj.GetType().Name, out var container)) { container.visualElement.RemoveFromHierarchy(); } } private void OnSurvivalEventOpened(IPlayerSurvivalEvent obj) { spawnedSurvivalEvents.GetOrAdd(obj.GetType().Name, (x)=>Create(obj)); } private UXContainer Create(IPlayerSurvivalEvent playerSurvivalEvent) { var container = survivalEventBuilder.BuildAsContainer(); var key = playerSurvivalEvent.GetType().Name; if (survivalEventIcons.TryGetValue(key, out var sprite)) { container.icon.style.backgroundImage = new StyleBackground(sprite); } container.contextLabel.text = playerSurvivalEvent.Title; return container; } } }