using System.Collections.Generic; using UIWidgets; using UnityEngine; using UnityEngine.UI; namespace UIWidgetsSamples.Shops { public class HarborShop : MonoBehaviour { private Trader Harbor; [SerializeField] private HarborListView TradeView; [SerializeField] private Text TradeTotal; [SerializeField] private Button BuyButton; private Trader Player; [SerializeField] private Text PlayerMoney; private void Start() { Harbor = new Trader(false); Player = new Trader(false); Init(); BuyButton.onClick.AddListener(Trade); Harbor.OnItemsChange += UpdateTraderItems; Player.OnItemsChange += UpdateTraderItems; Player.OnMoneyChange += UpdatePlayerMoneyInfo; UpdateTraderItems(); UpdatePlayerMoneyInfo(); } public void Init() { Harbor.Money = -1; Harbor.PriceFactor = 1f; Harbor.Inventory.Clear(); List list = new List(); list.Add(new Item("Wood", 100)); list.Add(new Item("Wheat", 30)); list.Add(new Item("Fruits", 0)); list.Add(new Item("Sugar", 20)); list.Add(new Item("Metal", 40)); list.Add(new Item("Cotton", 0)); list.Add(new Item("Silver", 25)); list.Add(new Item("Gold", 55)); list.Add(new Item("Cocoa", 10)); list.Add(new Item("Coffee", 7)); list.Add(new Item("Tobacco", 20)); List items = list; Harbor.Inventory.AddRange(items); Player.Money = 5000; Player.PriceFactor = 0.5f; Player.Inventory.Clear(); list = new List(); list.Add(new Item("Wood", 50)); list.Add(new Item("Cocoa", 100)); list.Add(new Item("Metal", 20)); list.Add(new Item("Sugar", 10)); List items2 = list; Player.Inventory.AddRange(items2); } public void UpdateTotal() { HarborOrder harborOrder = new HarborOrder(TradeView.DataSource); TradeTotal.text = harborOrder.Total().ToString(); } private ObservableList CreateOrderLines(Trader harbor, Trader player) { return harbor.Inventory.Convert(delegate(Item item) { Item item2 = player.Inventory.Find((Item x) => x.Name == item.Name); return new HarborOrderLine(item, Prices.GetPrice(item, harbor.PriceFactor), Prices.GetPrice(item, player.PriceFactor), item.Count, (item2 != null) ? item2.Count : 0); }); } private void UpdateTraderItems() { TradeView.DataSource = CreateOrderLines(Harbor, Player); } private void UpdatePlayerMoneyInfo() { PlayerMoney.text = Player.Money.ToString(); } private void Trade() { HarborOrder harborOrder = new HarborOrder(TradeView.DataSource); if (Player.CanBuy(harborOrder)) { Harbor.Sell(harborOrder); Player.Buy(harborOrder); } else { string message = string.Format("Not enough money to buy items. Available: {0}; Required: {1}", Player.Money, harborOrder.Total()); Notify.Template("NotifyTemplateSimple").Show(message, 3f, null, null, null, null, NotifySequence.First, 0.3f, true); } } private void OnDestroy() { if (BuyButton != null) { BuyButton.onClick.RemoveListener(Trade); } if (Harbor != null) { Harbor.OnItemsChange -= UpdateTraderItems; } if (Player != null) { Player.OnItemsChange -= UpdateTraderItems; Player.OnMoneyChange -= UpdatePlayerMoneyInfo; } } } }