using System; using System.Collections; using System.Collections.Generic; using System.Linq; using BITFALL.Entities.Inventory; using BITFALL.Player; using BITFALL.Trading; using BITKit; using BITKit.UX; using UnityEngine; using UnityEngine.UIElements; namespace BITFALL.UX { public sealed class UxPanelTrade : UXPanelBase { [SerializeField] private VisualTreeAsset itemTemplate; [UXBindPath("player-container")] private VisualElement playerContainer; [UXBindPath("trader-container")] private VisualElement traderContainer; [UXBindPath("cancel-button")] private Button cancelButton; [UXBindPath("reset-button")] private Button resetButton; [UXBindPath("trade-button")] private Button tradeButton; [UXBindPath("player-bar.fill-bar")] private VisualElement playerBar; [UXBindPath("trader-bar.fill-bar")] private VisualElement traderBar; [UXBindPath("player-bar.Label--0")] private Label playerLabel; [UXBindPath("trader-bar.Label--0")] private Label traderLabel; [UXBindPath("credit-label")] private Label creditLabel; [Inject] private IEntityInventory _inventory; private ITrader _trader; private readonly List playerTradeItems = new(); private readonly List traderTradeItems = new(); protected override void Start() { base.Start(); Data.AddListener(OnTrade); traderContainer.Clear(); playerContainer.Clear(); cancelButton.clicked += OnReturn; } protected override void Dispose() { base.Dispose(); Data.RemoveListender(OnTrade); } protected override void OnReturn() { UxService.Entry(); } private void OnTrade(PlayerTradeWithTrader obj) { _trader = obj.Trader; Entry(); traderContainer.Clear(); playerContainer.Clear(); resetButton.clickable = null; resetButton.clicked += () => { OnTrade(obj); }; tradeButton.clickable = null; tradeButton.clicked += () => { _trader.Trade(playerTradeItems.ToArray(), traderTradeItems.ToArray()); OnTrade(obj); playerTradeItems.Clear(); traderTradeItems.Clear(); }; var trader = obj.Trader; foreach (var x in _inventory.GetItems()) { var container = new UXContainer(playerContainer.Create(itemTemplate)); UXUtils.CreateItemContainer(container.visualElement, x); container.button.clicked += () => { if (playerTradeItems.Contains(x)) { playerTradeItems.Remove(x); container.visualElement.EnableInClassList("--checked",false); } else { playerTradeItems.Add(x); container.visualElement.EnableInClassList("--checked",true); } Rebuild(); }; container.button.tooltip = $"{x.Value}exp"; } foreach (var x in trader.Items) { var container = new UXContainer(traderContainer.Create(itemTemplate)); UXUtils.CreateItemContainer(container.visualElement, x); container.button.clicked += () => { if (traderTradeItems.Contains(x)) { traderTradeItems.Remove(x); container.visualElement.EnableInClassList("--checked",false); } else { traderTradeItems.Add(x); container.visualElement.EnableInClassList("--checked",true); } Rebuild(); }; container.button.tooltip = $"{x.Value}exp"; } Rebuild(); } protected override void OnPanelExit() { base.OnPanelExit(); traderContainer.Clear(); playerContainer.Clear(); playerTradeItems.Clear(); traderTradeItems.Clear(); } private void Rebuild() { var sum = _trader.Items.Sum(x => x.Value); var traderSum = traderTradeItems.Sum(x => x.Value); var playerSum = playerTradeItems.Sum(x => x.Value) + _trader.Credit; playerBar.style.width = Length.Percent(((float)playerSum / sum)*100); traderBar.style.width = Length.Percent(((float)traderSum / sum)*100); tradeButton.SetEnabled(playerSum>=traderSum); creditLabel.text = _trader.Credit.ToString(); playerLabel.text = playerSum.ToString(); traderLabel.text = traderSum.ToString(); } } }