BITFALL/Assets/Artists/Scripts/UX/UXTrade.cs

162 lines
4.0 KiB
C#

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<IBasicItem> playerTradeItems = new();
private readonly List<IBasicItem> traderTradeItems = new();
protected override void Start()
{
base.Start();
Data.AddListener<PlayerTradeWithTrader>(OnTrade);
traderContainer.Clear();
playerContainer.Clear();
cancelButton.clicked += OnReturn;
}
protected override void Dispose()
{
base.Dispose();
Data.RemoveListender<PlayerTradeWithTrader>(OnTrade);
}
protected override void OnReturn()
{
UxService.Entry<UXHud>();
}
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();
}
}
}