127 lines
4.2 KiB
C#
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 Barrel LiquidBarrelA { get; private set; }
|
|
|
|
[field: SerializeField]
|
|
public Barrel LiquidBarrelB { get; private set; }
|
|
|
|
[field: SerializeField]
|
|
public Barrel LiquidBarrelC { get; private set; }
|
|
|
|
[field: SerializeField]
|
|
public Barrel LiquidBarrelD { get; private set; }
|
|
|
|
[field: SerializeField]
|
|
public Barrel LiquidBarrelE { get; private set; }
|
|
|
|
[field: SerializeField]
|
|
public Barrel GarnishBarrel1 { get; private set; }
|
|
|
|
[field: SerializeField]
|
|
public Barrel 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.IsMoldy && barrel.CurrentAmount >= 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;
|
|
}
|
|
}
|
|
}
|
|
}
|