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; } [field: SerializeField] public bool IsActivated { get; private set; } [field: SerializeField] public bool IsAutoSupply { get; private set; } private Material _instanceMaterial; private float _elapsedTime; 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(); EventManager.OnAddBarrels += AddCurrentAmount; EventManager.OnAutoSupplyBarrels += AutoSupply; _liquidImage.sprite = IsActivated ? _liquidData.Sprite : DataManager.Instance.SpriteDataSo.Lock; InteractionMessage = $"{_liquidData.Name} 따르기"; _instanceMaterial.SetColor(LiquidColorHash, _liquidData.Color * _colorIntensity); } private void Update() { if (!IsAutoSupply) return; if (_elapsedTime >= 1f) { AddCurrentAmount(TycoonManager.Instance.TycoonStatus.BarrelAutoIncrease); _elapsedTime -= 1f; } _elapsedTime += Time.deltaTime; } private void OnDestroy() { EventManager.OnAddBarrels -= AddCurrentAmount; EventManager.OnAutoSupplyBarrels -= AutoSupply; } 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); } public bool TryConsume(int amount) { if (!CanConsume(amount)) return false; Consume(amount); return true; } public LiquidData GetLiquidData() => _liquidData; public void SetCurrentAmount(int amount) { if (CurrentAmount == int.MaxValue) { return; } CurrentAmount = amount; var liquidAmount = CurrentAmount / 4000f; _instanceMaterial.SetFloat(LiquidAmountHash, liquidAmount); } public void Activate() { IsActivated = true; _liquidImage.sprite = IsActivated ? _liquidData.Sprite : DataManager.Instance.SpriteDataSo.Lock; SetCurrentAmount(_liquidData.GetMaxAmount()); } public void AutoSupply() { IsAutoSupply = true; } public void AddCurrentAmount(int addedValue) { if (!IsActivated) return; SetCurrentAmount(CurrentAmount + addedValue); } } }