using System; using BlueWater.Items; using Sirenix.OdinInspector; using UnityEngine; namespace BlueWater.Tycoons { public class Barrel : InteractionFurniture { [SerializeField, Required] private SpriteRenderer _liquidImage; [SerializeField, Required] private SpriteRenderer _fill; [SerializeField, Range(1f, 5f), Tooltip("목표 색상 * 밝기")] private float _colorIntensity = 2f; [SerializeField] private string _idx; [SerializeField] private LiquidData _liquidData; [field: SerializeField] public int CurrentAmount { get; private set; } [SerializeField] private bool _isActivated; public bool IsActivated { get => _isActivated; private set { _isActivated = value; _liquidImage.sprite = _isActivated ? _liquidData.Sprite : DataManager.Instance.SpriteDataSo.Lock; } } private Material _instanceMaterial; public event Action OnAmountChanged; public static event Action OnBarrelInteracted; public static event Action OnBarrelCancelInteracted; // Hashes private static readonly int LiquidAmountHash = Shader.PropertyToID("_LiquidAmount"); private static readonly int LiquidColorHash = Shader.PropertyToID("_LiquidColor"); protected override void Awake() { base.Awake(); _instanceMaterial = Instantiate(_fill.material); _fill.material = _instanceMaterial; _liquidData = ItemManager.Instance.LiquidDataSo.GetDataByIdx(_idx); SetCurrentAmount(0); } protected override void Start() { base.Start(); _liquidImage.sprite = _isActivated ? _liquidData.Sprite : DataManager.Instance.SpriteDataSo.Lock; InteractionMessage = $"{_liquidData.Name} 따르기"; _instanceMaterial.SetColor(LiquidColorHash, _liquidData.Color * _colorIntensity); } public override void Interaction() { OnBarrelInteracted?.Invoke(this); GameManager.Instance.CurrentTycoonPlayer.IsMakingCocktail = true; } public override void CancelInteraction() { OnBarrelCancelInteracted?.Invoke(); GameManager.Instance.CurrentTycoonPlayer.IsMakingCocktail = false; } /// /// 1. 플레이어가 빈 잔을 들고 있거나 완성되지 않은 잔을 들고 있을 때 /// public override bool CanInteraction() { return IsActivated && !CurrentTycoonPlayer.TycoonPickupHandler.IsPickedUpItem() && CanConsume(1); } public bool CanConsume(int amount) { return CurrentAmount - amount > 0; } public void Consume(int amount) { if (CurrentAmount == int.MaxValue) { return; } var consumeAmount = CurrentAmount - amount; SetCurrentAmount(consumeAmount, true); } public bool TryConsume(int amount) { if (!CanConsume(amount)) return false; Consume(amount); return true; } public LiquidData GetLiquidData() => _liquidData; public void SetCurrentAmount(int amount, bool isFromAction = false) { if (CurrentAmount == int.MaxValue) { return; } CurrentAmount = amount; var liquidAmount = CurrentAmount / 4000f; _instanceMaterial.SetFloat(LiquidAmountHash, liquidAmount); if (!isFromAction) { OnAmountChanged?.Invoke(CurrentAmount); } } public void Activate() { IsActivated = true; SetCurrentAmount(_liquidData.GetMaxAmount()); } } }