using System; using System.Collections; using System.Collections.Generic; using UnityEngine; public class DeliveryManager : MonoBehaviour { public event EventHandler OnRecipeSpawned; public event EventHandler OnRecipeCompleted; public event EventHandler OnRecipeSuccess; public event EventHandler OnRecipeFailed; public static DeliveryManager Instance { get; private set; } [SerializeField] private RecipeListSO recipeListSO; private List waitingRecipeSOList; private float spawnRecipeTimer; private float spawnRecipeTimerMax = 4f; private int waitingRecipesMax = 4; private void Awake() { Instance = this; waitingRecipeSOList = new List(); } private void Update() { spawnRecipeTimer -= Time.deltaTime; if (spawnRecipeTimer <= 0f) { spawnRecipeTimer = spawnRecipeTimerMax; if (waitingRecipeSOList.Count < waitingRecipesMax) { RecipeSO waitingRecipeSO = recipeListSO.recipeSOList[UnityEngine.Random.Range(0, recipeListSO.recipeSOList.Count)]; waitingRecipeSOList.Add(waitingRecipeSO); OnRecipeSpawned?.Invoke(this, EventArgs.Empty); } } } public void DeliverRecipe(PlateKitchenObject plateKitchenObject) { for (int i=0; i < waitingRecipeSOList.Count; ++i) { RecipeSO waitingRecipeSO = waitingRecipeSOList[i]; if (waitingRecipeSO.kitchenObjectSoList.Count == plateKitchenObject.GetKitchenObjectSOList().Count) { // Has equal ingreedients on plate bool plateContentsMatchesRecipe = true; foreach (KitchenObjectSO recipeKitchenObjectSO in waitingRecipeSO.kitchenObjectSoList) { // Cycle through all ingreedients within recipe bool ingreedientFound = false; foreach (KitchenObjectSO plateKitchenObjectSO in plateKitchenObject.GetKitchenObjectSOList()) { // Cycle through all ingreedients within plate if (plateKitchenObjectSO == recipeKitchenObjectSO) { // Ingreedient matches! ingreedientFound = true; break; } } if (!ingreedientFound) { // This Recipe ingreedient was not on plate plateContentsMatchesRecipe = false; } } if (plateContentsMatchesRecipe) { // Player delivered correct recipe waitingRecipeSOList.RemoveAt(i); OnRecipeCompleted?.Invoke(this, EventArgs.Empty); OnRecipeSuccess?.Invoke(this, EventArgs.Empty); return; } } } // No matches found! // Player brought the wrong recipe! OnRecipeFailed?.Invoke(this, EventArgs.Empty); } public List GetWaitingRecipeSOList() { return waitingRecipeSOList; } }