using System; using System.Collections.Generic; using System.Linq; using BlueWater.Items; using Sirenix.OdinInspector; using UnityEngine; using Random = UnityEngine.Random; namespace BlueWater.Tycoons { public class TycoonIngredientController: MonoBehaviour { [field: SerializeField] public LiquidBarrel LiquidBarrelA { get; private set; } [field: SerializeField] public LiquidBarrel LiquidBarrelB { get; private set; } [field: SerializeField] public LiquidBarrel LiquidBarrelC { get; private set; } [field: SerializeField] public LiquidBarrel LiquidBarrelD { get; private set; } [field: SerializeField] public LiquidBarrel LiquidBarrelE { get; private set; } [field: SerializeField] public GarnishBarrel GarnishBarrel1 { get; private set; } [field: SerializeField] public GarnishBarrel GarnishBarrel2 { get; private set; } private List _barrels; private void Awake() { _barrels = new List { LiquidBarrelA, LiquidBarrelB, LiquidBarrelC, LiquidBarrelD, LiquidBarrelE, GarnishBarrel1, GarnishBarrel2 }; EventManager.OnCreateMold += SetMold; } private void OnDestroy() { EventManager.OnCreateMold -= SetMold; } /// /// 주문 가능한 칵테일데이터 반환 /// public CocktailData GetRandomCocktailData() { var activeBarrels = _barrels.Where(barrel => barrel.IsActivated).ToList(); var activeIngredientsIdx = activeBarrels.Select(barrel => barrel.GetLiquidData().Idx).ToList(); var validCocktails = GetValidCocktails(activeIngredientsIdx); if (validCocktails == null || validCocktails.Count == 0) { Debug.LogWarning("유효한 칵테일 조합이 없습니다."); return null; } // 유효한 칵테일 중 랜덤으로 하나 선택 var randomCocktail = validCocktails[Random.Range(0, validCocktails.Count)]; return randomCocktail; } private List GetValidCocktails(List activeIngredientsIdx) { var allCocktails = ItemManager.Instance.CocktailDataSo.GetData(); var validCocktails = new List(); foreach (var element in allCocktails.Values) { var requiredIngredients = element.ValidIngredients.Select(ingredient => ingredient.Idx).ToList(); // 필요한 재료들이 모두 활성화된 재료 목록에 포함되어 있는지 확인 if (requiredIngredients.All(activeIngredientsIdx.Contains)) { if (element.Idx != "Cocktail000") { validCocktails.Add(element); } } } return validCocktails; } public bool IsMakingCocktail(List cocktailIngredients) { var activatedBarrels = GetActivatedBarrels(); return cocktailIngredients.All(element => activatedBarrels.Find(barrel => barrel.GetLiquidData().Idx == element.Idx && barrel.CanMakingCocktailCrew(element.Amount))); } public void ConsumeMakingCocktailIngredient(List cocktailIngredients) { var activatedBarrels = GetActivatedBarrels(); foreach (var element in cocktailIngredients) { var barrel = activatedBarrels.Find(barrel => barrel.GetLiquidData().Idx == element.Idx); barrel.Consume(element.Amount); } } public List GetActivatedBarrels() { return _barrels.Where(barrel => barrel.IsActivated).ToList(); } [Button("곰팡이 테스트")] public void SetMold() { List moldableElements = GetActivatedBarrels() .Where(element => element.CanMold()) .ToList(); if (moldableElements.Count == 0) return; int randomIndex = Random.Range(0, moldableElements.Count); moldableElements[randomIndex].Mold(); } } }