You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
197 lines
4.0 KiB
197 lines
4.0 KiB
using UnityEngine; |
|
using UnityEngine.UI; |
|
using System.Collections; |
|
using System.Collections.Generic; |
|
using UIWidgets; |
|
|
|
namespace UIWidgetsSamples.Shops { |
|
/// <summary> |
|
/// JRPG shop. |
|
/// </summary> |
|
public class JRPGShop : MonoBehaviour { |
|
Trader Shop; |
|
|
|
[SerializeField] |
|
TraderListView ShopItems; |
|
|
|
[SerializeField] |
|
Button BuyButton; |
|
|
|
[SerializeField] |
|
Text ShopTotal; |
|
|
|
Trader Player; |
|
|
|
[SerializeField] |
|
TraderListView PlayerItems; |
|
|
|
[SerializeField] |
|
Button SellButton; |
|
|
|
[SerializeField] |
|
Text PlayerMoney; |
|
|
|
[SerializeField] |
|
Text PlayerTotal; |
|
|
|
[SerializeField] |
|
Notify notify; |
|
|
|
void Start() |
|
{ |
|
Shop = new Trader(); |
|
Player = new Trader(); |
|
|
|
Init(); |
|
|
|
BuyButton.onClick.AddListener(Buy); |
|
SellButton.onClick.AddListener(Sell); |
|
|
|
Shop.OnItemsChange += UpdateShopItems; |
|
|
|
Player.OnItemsChange += UpdatePlayerItems; |
|
Player.OnMoneyChange += UpdatePlayerMoneyInfo; |
|
|
|
UpdateShopItems(); |
|
|
|
UpdatePlayerItems(); |
|
UpdatePlayerMoneyInfo(); |
|
} |
|
|
|
/// <summary> |
|
/// Init this instance. |
|
/// </summary> |
|
public void Init() |
|
{ |
|
Shop.Money = -1; |
|
Shop.PriceFactor = 1; |
|
Shop.Inventory.Clear(); |
|
var shop_items = new List<Item>(){ |
|
new Item("Sword", 10), |
|
new Item("Short Sword", 5), |
|
new Item("Long Sword", 5), |
|
new Item("Knife", -1), |
|
new Item("Dagger", -1), |
|
new Item("Hammer", -1), |
|
new Item("Shield", -1), |
|
new Item("Leather Armor", 3), |
|
new Item("Ring", 2), |
|
new Item("Bow", -1), |
|
new Item("Crossbow", -1), |
|
|
|
new Item("HP Potion", -1), |
|
new Item("Mana Potion", -1), |
|
new Item("HP UP", 10), |
|
new Item("Mana UP", 10), |
|
}; |
|
Shop.Inventory.AddRange(shop_items); |
|
|
|
Player.Money = 2000; |
|
Player.PriceFactor = 0.5f; |
|
Player.Inventory.Clear(); |
|
var player_items = new List<Item>(){ |
|
new Item("Stick", 1), |
|
new Item("Sword", 1), |
|
new Item("HP Potion", 5), |
|
new Item("Mana Potion", 5), |
|
}; |
|
Player.Inventory.AddRange(player_items); |
|
} |
|
|
|
/// <summary> |
|
/// Updates the shop total. |
|
/// </summary> |
|
public void UpdateShopTotal() |
|
{ |
|
var order = new JRPGOrder(ShopItems.DataSource); |
|
ShopTotal.text = order.Total().ToString(); |
|
} |
|
|
|
/// <summary> |
|
/// Updates the player total. |
|
/// </summary> |
|
public void UpdatePlayerTotal() |
|
{ |
|
var order = new JRPGOrder(PlayerItems.DataSource); |
|
PlayerTotal.text = order.Total().ToString(); |
|
} |
|
|
|
ObservableList<JRPGOrderLine> CreateOrderLines(Trader trader) |
|
{ |
|
return trader.Inventory.Convert(item => { |
|
return new JRPGOrderLine(item, Prices.GetPrice(item, trader.PriceFactor)); |
|
}); |
|
} |
|
|
|
void UpdateShopItems() |
|
{ |
|
ShopItems.DataSource = CreateOrderLines(Shop); |
|
} |
|
|
|
void UpdatePlayerItems() |
|
{ |
|
PlayerItems.DataSource = CreateOrderLines(Player); |
|
} |
|
|
|
void UpdatePlayerMoneyInfo() |
|
{ |
|
PlayerMoney.text = Player.Money.ToString(); |
|
} |
|
|
|
void Buy() |
|
{ |
|
var order = new JRPGOrder(ShopItems.DataSource); |
|
|
|
if (Player.CanBuy(order)) |
|
{ |
|
Shop.Sell(order); |
|
Player.Buy(order); |
|
} |
|
else |
|
{ |
|
var message = string.Format("Not enough money to buy items. Available: {0}; Required: {1}", Player.Money, order.Total()); |
|
notify.Template().Show(message, customHideDelay: 3f, sequenceType: NotifySequence.First, clearSequence: true); |
|
} |
|
} |
|
|
|
void Sell() |
|
{ |
|
var order = new JRPGOrder(PlayerItems.DataSource); |
|
|
|
if (Shop.CanBuy(order)) |
|
{ |
|
Shop.Buy(order); |
|
Player.Sell(order); |
|
} |
|
else |
|
{ |
|
var message = string.Format("Not enough money in shop to sell items. Available: {0}; Required: {1}", Shop.Money, order.Total()); |
|
notify.Template().Show(message, customHideDelay: 3f, sequenceType: NotifySequence.First, clearSequence: true); |
|
} |
|
} |
|
|
|
void OnDestroy() |
|
{ |
|
if (BuyButton!=null) |
|
{ |
|
BuyButton.onClick.RemoveListener(Buy); |
|
} |
|
if (SellButton!=null) |
|
{ |
|
SellButton.onClick.RemoveListener(Sell); |
|
} |
|
|
|
if (Shop!=null) |
|
{ |
|
Shop.OnItemsChange -= UpdateShopItems; |
|
} |
|
|
|
if (Player!=null) |
|
{ |
|
Player.OnItemsChange -= UpdatePlayerItems; |
|
Player.OnMoneyChange -= UpdatePlayerMoneyInfo; |
|
} |
|
} |
|
|
|
} |
|
} |