using System.Collections; using System.Collections.Generic; using System.Linq; using UnityEngine; using Random = System.Random; namespace BlueWater.Tycoons { public class CustomerTable : InteractionFurniture { [SerializeField] private List _tableSeats; private TycoonManager _tycoonManager; private TableSeat _tableSeat; private Random _random = new(); private bool _isCleaning; protected override void OnEnable() { base.OnEnable(); _tycoonManager = TycoonManager.Instance; _tycoonManager.CustomerTableController.RegisterTable(this); } protected override void OnDisable() { base.OnDisable(); _tycoonManager.CustomerTableController.UnregisterTable(this); } public override void Interaction() { StartCoroutine(CleanUpTable(_tableSeat)); } public override bool CanInteraction() { if (_isCleaning) return false; _tableSeat = _tableSeats.Find(table => !table.IsOccupied && !table.IsCleaned); if (_tableSeat == null) return false; return true; } public TableSeat FindEmptySeat() { var seatCount = _tableSeats.Count; var indices = new List(Enumerable.Range(0, seatCount)); while (indices.Count > 0) { var randomIndex = _random.Next(indices.Count); var seatIndex = indices[randomIndex]; indices.RemoveAt(randomIndex); var tableSeat = _tableSeats[seatIndex]; if (!tableSeat.IsReserved && !tableSeat.IsOccupied && tableSeat.IsCleaned) { return tableSeat; } } return null; } private IEnumerator CleanUpTable(TableSeat tableSeat) { // TODO : n초간 테이블 청소 애니메이션 (청소 중에 키 작동 금지) _isCleaning = true; PlayerInputKeyManager.Instance.DisableCurrentPlayerInput(); var elapsedTime = 0f; while (elapsedTime <= 2f) { elapsedTime += Time.deltaTime; yield return null; } tableSeat.CleanUpFood(); PlayerInputKeyManager.Instance.EnableCurrentPlayerInput(); _isCleaning = false; } } }