using System; using System.Collections; using System.Collections.Generic; using UnityEngine; public class CuttingCounter : BaseCounter { public event EventHandler OnProgressChange; public class OnProgressChangeEventsArgs : EventArgs { public float progressNormalized; } public event EventHandler OnCut; [SerializeField] private CuttingRecipeSO[] cuttingRecipeSOArray; private int cuttingProgress; public override void Interact(Player player) { if (!HasKitchenObject()) { // no KitchenObject here if (player.HasKitchenObject()) { // player has object if (HasRecipeWithInput(player.GetKitchenObject().GetKitchenObjectSO())) { // player is carrying an object that can be chopped player.GetKitchenObject().SetKitchenObjectParent(this); cuttingProgress = 0; CuttingRecipeSO cuttingRecipeSO = GetCuttingRecipeSOWithInput(GetKitchenObject().GetKitchenObjectSO()); OnProgressChange?.Invoke(this, new OnProgressChangeEventsArgs { progressNormalized = (float)cuttingProgress / cuttingRecipeSO.cuttingProgressMax, }); } } else { // player has nothing, do nothing } } else { // KitchenObject is here if (player.HasKitchenObject()) { // player has object, do nothing } else { // player has nothing GetKitchenObject().SetKitchenObjectParent(player); } } } public override void InteractAlternate(Player player) { if (HasKitchenObject() && HasRecipeWithInput(GetKitchenObject().GetKitchenObjectSO())) { // there is a KitchenObject AND it is able to be cut cuttingProgress++; OnCut?.Invoke(this, EventArgs.Empty); CuttingRecipeSO cuttingRecipeSO = GetCuttingRecipeSOWithInput(GetKitchenObject().GetKitchenObjectSO()); OnProgressChange?.Invoke(this, new OnProgressChangeEventsArgs { progressNormalized = (float)cuttingProgress / cuttingRecipeSO.cuttingProgressMax, }); if (cuttingProgress >= cuttingRecipeSO.cuttingProgressMax) { KitchenObjectSO outputKitchenSO = GetOutputForInput(GetKitchenObject().GetKitchenObjectSO()); GetKitchenObject().DestroySelf(); KitchenObject.SpawnKitchenObject(outputKitchenSO, this); } } } private bool HasRecipeWithInput(KitchenObjectSO inputKitchenObjectSO) { CuttingRecipeSO cuttingRecipeSO = GetCuttingRecipeSOWithInput(inputKitchenObjectSO); return cuttingRecipeSO != null; } private KitchenObjectSO GetOutputForInput(KitchenObjectSO inputKitchenObjectSO) { CuttingRecipeSO cuttingRecipeSO = GetCuttingRecipeSOWithInput(inputKitchenObjectSO); if (cuttingRecipeSO != null) { return cuttingRecipeSO.output; } else { return null; } } private CuttingRecipeSO GetCuttingRecipeSOWithInput(KitchenObjectSO inputKitchenObjectSO) { foreach (CuttingRecipeSO cuttingRecipeSO in cuttingRecipeSOArray) { if (cuttingRecipeSO.input == inputKitchenObjectSO) { return cuttingRecipeSO; } } return null; } }