Animals can now be bought in AnimalShop

if bought they will be placed somewhere random on the map
This commit is contained in:
d-hain 2022-06-23 22:18:32 +02:00
parent acd602c85a
commit 441ffb900a
34 changed files with 2387 additions and 265 deletions

View file

@ -0,0 +1,21 @@
using UnityEngine;
namespace Shop {
public class AnimalShop : ElementStorage<Animal> {
#region Singleton
public static AnimalShop instance;
private void Awake() {
if(instance != null) {
Debug.LogWarning("More than one instance of AnimalShop found");
}
instance = this;
}
#endregion
}
}

View file

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 2c06d4c2082cfaa48ab284fbf112290b
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,61 @@
using TMPro;
using UnityEngine;
namespace Shop {
public class AnimalShopSlot : ElementStorageSlot<Animal> {
public TextMeshProUGUI nameText;
public TextMeshProUGUI costText;
private AnimalShop _animalShop;
private PlayerController _playerController;
private void Start() {
_animalShop = AnimalShop.instance;
_playerController = PlayerController.instance;
}
/**
* Clears the Shop Slot
*/
public override void ClearSlot() {
nameText.text = "";
costText.text = "";
amountText.text = "";
base.ClearSlot();
}
/**
* Gets called when the Shop Slot is clicked
*/
public override void UseElement() {
if(Element) {
if(_playerController.Money >= Element.price) {
if(Element) {
_playerController.ChangeMoney(-Element.price);
// Debug.Log("Buying Animal: " + Element.displayName);
}
PlaceCowRandomlyOnScreen();
_animalShop.RemoveElement(Element, 1);
} else {
// Debug.Log("Not enough money to buy Animal.");
}
_animalShop.onElementChangedCallback?.Invoke();
}
}
private void PlaceCowRandomlyOnScreen() {
float spawnY = Random.Range
(Camera.main.ScreenToWorldPoint(new Vector2(0, 0)).y,
Camera.main.ScreenToWorldPoint(new Vector2(0, Screen.height)).y);
float spawnX = Random.Range
(Camera.main.ScreenToWorldPoint(new Vector2(0, 0)).x,
Camera.main.ScreenToWorldPoint(new Vector2(Screen.width, 0)).x);
Vector2 spawnPosition = new Vector2(spawnX, spawnY);
Instantiate(Element.animalPrefab, spawnPosition, Quaternion.identity);
}
}
}

View file

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 12dc6c16906d3994380888118d0da675
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,53 @@
using UnityEngine;
namespace Shop {
public class ItemShop : ElementStorage<Item> {
#region Singleton
public static ItemShop instance;
private void Awake() {
if(instance != null) {
Debug.LogWarning("More than one instance of ItemShop found");
}
instance = this;
}
#endregion
public bool itemWasBought;
private PlayerController _playerController;
private Inventory _inventory;
private Item _lastBoughtItem;
private int _lastBoughtItemAmount;
/**
* Calls ElementStorage.RemoveItem() and sets 2 Variables to remember the last bought item
*/
public override void RemoveElement(Item item, int amount) {
base.RemoveElement(item, amount);
if(itemWasBought) {
_lastBoughtItem = item;
_lastBoughtItemAmount = amount;
}
}
public void UndoLastPurchase() {
if(itemWasBought) {
_inventory = Inventory.instance;
_playerController = PlayerController.instance;
if(_lastBoughtItem) {
_playerController.ChangeMoney(_lastBoughtItem.price);
_inventory.RemoveElement(_lastBoughtItem, _lastBoughtItemAmount);
AddElement(_lastBoughtItem, _lastBoughtItemAmount);
itemWasBought = false;
}
}
}
}
}

View file

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: bc5eb8967b8912c42b93a2086383ddd9
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,51 @@
using TMPro;
namespace Shop {
public class ItemShopSlot : ElementStorageSlot<Item> {
public TextMeshProUGUI nameText;
public TextMeshProUGUI costText;
private ItemShop _itemShop;
private Inventory _inventory;
private PlayerController _playerController;
private void Start() {
_itemShop = ItemShop.instance;
_inventory = Inventory.instance;
_playerController = PlayerController.instance;
}
/**
* Clears the Shop Slot
*/
public override void ClearSlot() {
nameText.text = "";
costText.text = "";
amountText.text = "";
base.ClearSlot();
}
/**
* Gets called when the Shop Slot is clicked
*/
public override void UseElement() {
if(Element) {
if(_playerController.Money >= Element.price) {
if(Element) {
_playerController.ChangeMoney(-Element.price);
_itemShop.itemWasBought = true;
// Debug.Log("Buying Item: " + Element.displayName);
}
_inventory.AddElement(Element, 1);
_itemShop.RemoveElement(Element, 1);
} else {
// Debug.Log("Not enough money to buy Item.");
}
_itemShop.onElementChangedCallback?.Invoke();
_inventory.onElementChangedCallback?.Invoke();
}
}
}
}

View file

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 3e6f808bd381a554eb64a7e84f997f45
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,45 @@
using TMPro;
using UnityEngine;
using UnityEngine.UI;
namespace Shop {
public class ShopSwitcher : MonoBehaviour {
public Sprite animalShopSprite;
public Sprite itemShopSprite;
public Image switchButtonImage;
public TextMeshProUGUI shopTitleText;
public GameObject viewportItems;
public GameObject viewportAnimals;
public GameObject undoPurchaseButton;
private void Start() {
switchButtonImage.enabled = true;
switchButtonImage.sprite = animalShopSprite;
viewportItems.SetActive(true);
viewportAnimals.SetActive(false);
}
public void SwitchShops() {
// switch Shop Title text and Image of the Button
if(shopTitleText.text.StartsWith("Item")) {
shopTitleText.text = "Animal \nShop";
switchButtonImage.sprite = itemShopSprite;
} else {
shopTitleText.text = "Item \nShop";
switchButtonImage.sprite = animalShopSprite;
}
// switch the shown shops
viewportItems.SetActive(!viewportItems.activeSelf);
viewportAnimals.SetActive(!viewportAnimals.activeSelf);
// turn off undoPurchaseButton when opening Animal Shop because of lack of undoing purchases in the Animal Shop
undoPurchaseButton.SetActive(!undoPurchaseButton.activeSelf);
// remove undo purchase button when switching to an animal shop and fix content alignement
}
}
}

View file

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 47545d0c6734b804c9407d5752a08ee4
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,85 @@
using System.Linq;
using UnityEngine;
namespace Shop {
public class ShopUI : MonoBehaviour {
public Transform itemsParent;
public Transform animalsParent;
public GameObject shopUI;
public GameObject inventoryUI;
private ItemShop _itemShop;
private AnimalShop _animalShop;
private ItemShopSlot[] _itemSlots;
private AnimalShopSlot[] _animalSlots;
private void Start() {
// Get Shop instance and add UpdateUI method to OnItemChanged delegate
_itemShop = ItemShop.instance;
_animalShop = AnimalShop.instance;
_itemShop.onElementChangedCallback += UpdateUI;
_animalShop.onElementChangedCallback += UpdateUI;
// Add all ItemShopSlot GameObjects to _itemSlots and turn off the Shop UI
_itemSlots = itemsParent.GetComponentsInChildren<ItemShopSlot>();
_animalSlots = animalsParent.GetComponentsInChildren<AnimalShopSlot>();
ToggleShop();
// Set the icon to not be a raycast target for the Description Hovering to work
foreach(ItemShopSlot slot in _itemSlots) {
slot.image.raycastTarget = false;
}
foreach(AnimalShopSlot slot in _animalSlots) {
slot.image.raycastTarget = false;
}
UpdateUI();
}
private void Update() {
// When "Shop" button is pressed turn on/off Shop UI
if(Input.GetButtonDown("Shop")) {
ToggleShop();
}
}
/**
* Turn on/off the Shop UI
*/
private void ToggleShop() {
inventoryUI.gameObject.SetActive(!shopUI.activeSelf);
HoverManager.instance.HideDescription();
shopUI.SetActive(!shopUI.activeSelf);
}
/**
* Is called when something in the Shop UI should update
*/
private void UpdateUI() {
// Add all items to the correct slots and clear the ones where no item should be
for(int i = 0; i < _itemSlots.Length; i++) {
// Item Slots
if(i < _itemShop.Elements.Count) {
_itemSlots[i].AddElement(_itemShop.Elements.ElementAt(i).Key);
_itemSlots[i].nameText.text = _itemSlots[i].Element.displayName;
_itemSlots[i].costText.text = _itemSlots[i].Element.price + " µ";
_itemSlots[i].amountText.text = _itemShop.Elements[_itemShop.Elements.ElementAt(i).Key] + " #";
} else {
_itemSlots[i].ClearSlot();
}
// Animal SLots
if(i < _animalShop.Elements.Count) {
_animalSlots[i].AddElement(_animalShop.Elements.ElementAt(i).Key);
_animalSlots[i].nameText.text = _animalSlots[i].Element.displayName;
_animalSlots[i].costText.text = _animalSlots[i].Element.price + " µ";
_animalSlots[i].amountText.text =
_animalShop.Elements[_animalShop.Elements.ElementAt(i).Key] + " #";
} else {
_animalSlots[i].ClearSlot();
}
}
}
}
}

View file

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 61c489f20d0ead245902b7e9d7984c7f
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant: