using System; using System.Collections.Generic; using BehaviorDesigner.Runtime.Tasks; using BlueWater.Items; using BlueWater.Npcs.Customers; using BlueWater.Uis; using PixelCrushers.DialogueSystem; using UnityEngine; using Random = UnityEngine.Random; namespace BlueWater.BehaviorTrees.Actions { [TaskCategory("Custom/Npc/Customer")] [Serializable] public class OrderFood : Conditional { private Customer _customer; private CustomerData _customerData; private FoodBalloonUi _foodBalloonUi; private int _orderFoodIdx; public override void OnAwake() { _customer = GetComponent(); _customerData = _customer.CustomerData; } public override void OnStart() { SetPreferredFoods(); _foodBalloonUi = _customer.FoodBalloonUi; _foodBalloonUi.OrderFood(_orderFoodIdx, _customerData.WaitTime, _customerData.HurryTime); _customer.OnInteraction += HandleFoodInteraction; _customer.RegisterPlayerInteraction(); _customer.Bark("OrderFood", BarkOrder.FirstValid); } public override TaskStatus OnUpdate() { if (_foodBalloonUi.IsFoodReceive()) { _customer.OnInteraction -= HandleFoodInteraction; _customer.UnregisterPlayerInteraction(); return TaskStatus.Success; } if (_foodBalloonUi.IsWaitTimeOver()) { _customer.OnInteraction -= HandleFoodInteraction; _customer.UnregisterPlayerInteraction(); _customer.AddHappyPoint(-3); if (_customer.HappyPoint <= 0) { _foodBalloonUi.CancelOrder(); var barkName = _customer.HappyPoint switch { >= 3 => "SatisfactoryEvaluation", >= 2 => "MediocreEvaluation", >= 1 => "MediocreEvaluation", _ => "UnsatisfactoryEvaluation" }; _customer.Bark(barkName, BarkOrder.FirstValid); } return TaskStatus.Failure; } return TaskStatus.Running; } private void HandleFoodInteraction() { var tycoonPlayer = GameManager.Instance.CurrentTycoonPlayer; var carriedFoodData = tycoonPlayer.GetCurrentItemData(); if (carriedFoodData == null) { Debug.Log("플레이어가 가지고 있는 음식의 데이터가 없습니다."); return; } if (carriedFoodData.Idx == _orderFoodIdx) { tycoonPlayer.GiveItem(); _foodBalloonUi.ReceiveFood(); _customer.SetFood(carriedFoodData); if (carriedFoodData.Quality == ItemQuality.High) { _customer.AddHappyPoint(1); } _customer.SpineController.PlayAnimation(CustomerSpineAnimation.Eat2.ToString(), true); } } private void SetPreferredFoods() { var dailyFoodSlotUis = TycoonUiManager.Instance.TycoonManagementUi.CookMenuUi.DailyFoodMenuUi.DailyFoodSlotUis; FoodTaste[] preferredTastes = { _customerData.GetPreferredFood(0), _customerData.GetPreferredFood(1), _customerData.GetPreferredFood(2) }; foreach (var taste in preferredTastes) { var preferredFoods = dailyFoodSlotUis.FindAll(food => food.FoodData.Taste == taste); if (preferredFoods.Count > 0) { var randomIndex = Random.Range(0, preferredFoods.Count); _orderFoodIdx = preferredFoods[randomIndex].FoodData.Idx; return; } } var randomDailyFoodIndex = Random.Range(0, dailyFoodSlotUis.Count); _orderFoodIdx = dailyFoodSlotUis[randomDailyFoodIndex].FoodData.Idx; } } }