162 lines
4.0 KiB
C#
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();
|
|
}
|
|
}
|
|
}
|