190 lines
6.4 KiB
C#
190 lines
6.4 KiB
C#
using System;
|
|
using System.Linq;
|
|
using UnityEngine;
|
|
|
|
public class StoveCounter : BaseCounter, IHasProgress, IKitchenObjectParent
|
|
{
|
|
public enum State
|
|
{
|
|
Idle,
|
|
Frying,
|
|
Fried,
|
|
Burned
|
|
}
|
|
|
|
[SerializeField] private FryingRecipeSO[] fryingRecipeSOArray;
|
|
[SerializeField] private BurningRecipeSO[] burningRecipeSOArray;
|
|
private BurningRecipeSO burningRecipeSO;
|
|
private float burningTimer;
|
|
private FryingRecipeSO fryingRecipeSO;
|
|
private float fryingTimer;
|
|
|
|
private State state;
|
|
|
|
private void Start()
|
|
{
|
|
SetStateAndFireEvent(State.Idle);
|
|
}
|
|
|
|
private void Update()
|
|
{
|
|
if (KitchenObject != null)
|
|
{
|
|
switch (state)
|
|
{
|
|
case State.Idle:
|
|
break;
|
|
case State.Frying:
|
|
fryingTimer += Time.deltaTime;
|
|
FireProgressEvent(fryingTimer / fryingRecipeSO.fryingTimerMax);
|
|
if (fryingTimer > fryingRecipeSO.fryingTimerMax)
|
|
{
|
|
KitchenObject.DestroySelf();
|
|
_ = KitchenObject.SpawnKitchenObject(fryingRecipeSO.output, this);
|
|
// Debug.Log("Object fried");
|
|
SetStateAndFireEvent(State.Fried);
|
|
burningTimer = 0f;
|
|
burningRecipeSO = GetBurningRecipeSOWithInput(KitchenObject.KitchenObjectSO);
|
|
}
|
|
|
|
break;
|
|
case State.Fried:
|
|
burningTimer += Time.deltaTime;
|
|
FireProgressEvent(burningTimer / burningRecipeSO.burningTimerMax);
|
|
if (burningTimer > burningRecipeSO.burningTimerMax)
|
|
{
|
|
KitchenObject.DestroySelf();
|
|
_ = KitchenObject.SpawnKitchenObject(burningRecipeSO.output, this);
|
|
// Debug.Log("Object burned");
|
|
SetStateAndFireEvent(State.Burned);
|
|
FireProgressEvent(0f);
|
|
}
|
|
|
|
break;
|
|
case State.Burned:
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
public event EventHandler<IHasProgress.ProgressChangedEventArgs> OnProgressChanged;
|
|
public event EventHandler<StateChangedEventArgs> OnStateChanged;
|
|
|
|
private void SetStateAndFireEvent(State newState)
|
|
{
|
|
state = newState;
|
|
OnStateChanged?.Invoke(this, new() { State = newState });
|
|
}
|
|
|
|
private void FireProgressEvent(float progress)
|
|
{
|
|
OnProgressChanged?.Invoke(this, new()
|
|
{
|
|
ProgressNormalized = progress,
|
|
State = state
|
|
});
|
|
}
|
|
|
|
public override void Interact(Player player)
|
|
{
|
|
if (KitchenObject == null)
|
|
{
|
|
Debug.Log("There is no KitchenObject here");
|
|
if (player.KitchenObject != null && HasRecipeWithInput(player.KitchenObject.KitchenObjectSO))
|
|
{
|
|
Debug.Log($"Player is putting {player.KitchenObject.KitchenObjectSO.objectName} to StoveCounter");
|
|
player.KitchenObject.SetKitchenObjectParent(this);
|
|
player.KitchenObject = null;
|
|
fryingRecipeSO = GetFryingRecipeSOWithInput(KitchenObject.KitchenObjectSO);
|
|
SetStateAndFireEvent(State.Frying);
|
|
fryingTimer = 0f;
|
|
}
|
|
else
|
|
{
|
|
Debug.Log("Player not carrying anything for the StoveCounter!");
|
|
}
|
|
}
|
|
else
|
|
{
|
|
Debug.Log($"There is a {KitchenObject.KitchenObjectSO.objectName} on the StoveCounter");
|
|
if (player.KitchenObject != null)
|
|
{
|
|
if (player.KitchenObject.TryGetPlate(out PlateKitchenObject plateKitchenObject))
|
|
{
|
|
Debug.Log($"Player is carrying a {player.KitchenObject.KitchenObjectSO.objectName}, try to put Ingredient onto it...");
|
|
if (plateKitchenObject.TryAddIngredient(KitchenObject.KitchenObjectSO))
|
|
{
|
|
Debug.Log($"Player is taking {KitchenObject.KitchenObjectSO.objectName} from StoveCounter to plate");
|
|
KitchenObject.DestroySelf();
|
|
SetStateAndFireEvent(State.Idle);
|
|
FireProgressEvent(0f);
|
|
}
|
|
else
|
|
{
|
|
Debug.Log($"Ingredient {player.KitchenObject.KitchenObjectSO.objectName} does not fit anymore!");
|
|
}
|
|
}
|
|
else
|
|
{
|
|
Debug.Log($"Player is already carrying a {player.KitchenObject.KitchenObjectSO.objectName}!");
|
|
}
|
|
}
|
|
else
|
|
{
|
|
Debug.Log($"Player is taking {KitchenObject.KitchenObjectSO.objectName} from StoveCounter to hand");
|
|
KitchenObject.SetKitchenObjectParent(player);
|
|
KitchenObject = null;
|
|
SetStateAndFireEvent(State.Idle);
|
|
FireProgressEvent(0f);
|
|
}
|
|
}
|
|
}
|
|
|
|
public override void InteractAlternate(Player player)
|
|
{
|
|
Debug.Log("Nothing alternate to do here!");
|
|
}
|
|
|
|
private bool HasRecipeWithInput(KitchenObjectSO inputKitchenObjectSO)
|
|
{
|
|
return GetFryingRecipeSOWithInput(inputKitchenObjectSO);
|
|
}
|
|
|
|
private KitchenObjectSO GetOutputForInput(KitchenObjectSO inputKitchenObjectSO)
|
|
{
|
|
FryingRecipeSO fRSO = GetFryingRecipeSOWithInput(inputKitchenObjectSO);
|
|
return fRSO ? fRSO.output : null;
|
|
}
|
|
|
|
private FryingRecipeSO GetFryingRecipeSOWithInput(KitchenObjectSO inputKitchenObjectSO)
|
|
{
|
|
return fryingRecipeSOArray.FirstOrDefault(fRSO => fRSO.input == inputKitchenObjectSO);
|
|
}
|
|
|
|
private BurningRecipeSO GetBurningRecipeSOWithInput(KitchenObjectSO inputKitchenObjectSO)
|
|
{
|
|
BurningRecipeSO burningRecipeSO = burningRecipeSOArray.FirstOrDefault(fRSO => fRSO.input == inputKitchenObjectSO);
|
|
if (burningRecipeSO == null)
|
|
{
|
|
Debug.LogError($"No BurningRecipe found for {inputKitchenObjectSO.objectName}");
|
|
return null;
|
|
}
|
|
else
|
|
{
|
|
return burningRecipeSO;
|
|
}
|
|
}
|
|
|
|
public bool IsFrying()
|
|
{
|
|
return state == State.Frying;
|
|
}
|
|
|
|
public bool IsFried()
|
|
{
|
|
return state == State.Fried;
|
|
}
|
|
}
|