CapersProject/Assets/02.Scripts/Tycoon/TycoonIngredientController.cs
2024-11-17 23:21:16 +09:00

127 lines
4.2 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using BlueWater.Items;
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<Barrel> _barrels;
private void Awake()
{
_barrels = new List<Barrel>
{
LiquidBarrelA, LiquidBarrelB, LiquidBarrelC, LiquidBarrelD, LiquidBarrelE, GarnishBarrel1, GarnishBarrel2
};
EventManager.OnCreateMold += SetMold;
}
private void OnDestroy()
{
EventManager.OnCreateMold -= SetMold;
}
/// <summary>
/// 주문 가능한 칵테일데이터 반환
/// </summary>
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<CocktailData> GetValidCocktails(List<string> activeIngredientsIdx)
{
var allCocktails = ItemManager.Instance.CocktailDataSo.GetData();
var validCocktails = new List<CocktailData>();
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<CocktailIngredient> cocktailIngredients)
{
var activatedBarrels = GetActivatedBarrels();
return cocktailIngredients.All(element =>
activatedBarrels.Find(barrel => barrel.GetLiquidData().Idx == element.Idx && barrel.CanMakingCocktailCrew(element.Amount)));
}
public void ConsumeMakingCocktailIngredient(List<CocktailIngredient> 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<Barrel> GetActivatedBarrels()
{
return _barrels.Where(barrel => barrel.IsActivated).ToList();
}
public void SetMold()
{
foreach (var element in GetActivatedBarrels())
{
if (!element.CanMold()) continue;
element.Mold();
return;
}
}
}
}