124 lines
4 KiB
C#
124 lines
4 KiB
C#
using System;
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
|
|
public class CuttingCounter : BaseCounter, IHasProgress
|
|
{
|
|
|
|
public event EventHandler<IHasProgress.OnProgressChangeEventsArgs> OnProgressChange;
|
|
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 IHasProgress.OnProgressChangeEventsArgs
|
|
{
|
|
progressNormalized = (float)cuttingProgress / cuttingRecipeSO.cuttingProgressMax,
|
|
});
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// player has nothing, do nothing
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// KitchenObject is here
|
|
if (player.HasKitchenObject())
|
|
{
|
|
// player has object
|
|
if (player.GetKitchenObject().TryGetPlate(out PlateKitchenObject plateKitchenObject))
|
|
{
|
|
// Player is holding a plate
|
|
if (plateKitchenObject.TryAddIngreedient(GetKitchenObject().GetKitchenObjectSO()))
|
|
{
|
|
GetKitchenObject().DestroySelf();
|
|
}
|
|
}
|
|
}
|
|
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 IHasProgress.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;
|
|
|
|
}
|
|
}
|