CapersProject/Assets/02.Scripts/Prop/Tycoon/Vomiting.cs

160 lines
5.1 KiB
C#
Raw Normal View History

2024-10-06 23:41:09 +00:00
using System;
2024-11-17 15:36:08 +00:00
using BlueWater.Audios;
2024-10-06 23:41:09 +00:00
using BlueWater.Interfaces;
2024-10-14 11:13:08 +00:00
using BlueWater.Npcs.Crews;
2024-10-22 12:41:31 +00:00
using BlueWater.Npcs.Crews.Cleaner;
2024-11-07 09:13:54 +00:00
using BlueWater.Uis;
2024-10-14 11:13:08 +00:00
using BlueWater.Utility;
2024-10-06 23:41:09 +00:00
using UnityEngine;
namespace BlueWater.Tycoons
{
[Serializable]
2024-10-14 11:13:08 +00:00
public class Vomiting : InteractionFurniture, ICrewInteraction
2024-10-06 23:41:09 +00:00
{
2024-11-07 09:13:54 +00:00
[SerializeField]
private PayMoneyUi _payMoneyUiObject;
[SerializeField]
private Vector3 _offset = new(0f, 1.5f, 0f);
2024-10-14 11:13:08 +00:00
[SerializeField]
2024-11-05 12:27:46 +00:00
private float _playerHoldingTime = 3f;
[SerializeField]
private float _crewHoldingTime = 9f;
2024-11-07 09:13:54 +00:00
2024-11-17 15:36:08 +00:00
[SerializeField]
private string _cleaningSfxName = "CleaningFloor";
2024-11-07 09:13:54 +00:00
private LevelData _currentLevelData;
2024-10-14 11:13:08 +00:00
private Coroutine _findCleanerCrewInstance;
private bool _isPlayerInteracting;
private bool _isCrewInteracting;
public event Action OnInteractionCompleted;
2024-10-06 23:41:09 +00:00
2024-10-31 05:41:13 +00:00
protected override void Start()
{
base.Start();
2024-11-15 07:28:13 +00:00
EventManager.OnCleaningAll += DestroyObject;
2024-10-31 05:41:13 +00:00
}
2024-10-06 23:41:09 +00:00
private void Update()
{
2024-10-14 11:13:08 +00:00
if (InteractionCanvas.BalloonUi.IsWaitTimeOver())
2024-10-06 23:41:09 +00:00
{
2024-10-14 11:13:08 +00:00
var damageable = GameManager.Instance.CurrentTycoonPlayer.GetComponent<IDamageable>();
damageable?.TakeDamage(1);
2024-11-15 07:28:13 +00:00
EventManager.InvokeCleaningResult(false);
DestroyObject();
2024-10-14 11:13:08 +00:00
}
2024-10-24 08:05:32 +00:00
if (IsShowing)
{
2024-11-05 12:27:46 +00:00
EventManager.InvokeHoldInteracting(HoldingElapsedTime);
2024-10-24 08:05:32 +00:00
}
2024-10-14 11:13:08 +00:00
2024-11-05 12:27:46 +00:00
if (HoldingElapsedTime >= 1f)
2024-10-14 11:13:08 +00:00
{
2024-11-07 09:13:54 +00:00
if (_isPlayerInteracting)
{
var tip = (int)(_currentLevelData.Gold * TycoonManager.Instance.TycoonStatus.TipMultiplier);
if (tip > 0)
{
var payMoneyUi = Instantiate(_payMoneyUiObject, transform.position + _offset,
Quaternion.identity, TycoonUiManager.Instance.WorldCanvas.transform);
2024-11-15 07:28:13 +00:00
payMoneyUi.Initialize(tip, true);
2024-11-07 09:13:54 +00:00
}
}
2024-11-15 07:28:13 +00:00
EventManager.InvokeCleaningResult(true);
DestroyObject();
2024-10-27 09:44:22 +00:00
}
2024-11-28 23:07:50 +00:00
float playerHoldingDeltaTime = Time.deltaTime / _playerHoldingTime;
2024-10-27 09:44:22 +00:00
if (_isPlayerInteracting)
{
2024-11-25 12:36:48 +00:00
InteractionCanvas.BalloonUi.PauseTween();
2024-11-28 23:07:50 +00:00
HoldingElapsedTime += playerHoldingDeltaTime;
2024-10-27 09:44:22 +00:00
}
if (_isCrewInteracting)
{
2024-11-25 12:36:48 +00:00
InteractionCanvas.BalloonUi.PauseTween();
2024-11-05 12:27:46 +00:00
HoldingElapsedTime += Time.deltaTime / (_crewHoldingTime - TycoonManager.Instance.TycoonStatus.CleanerCleaningReduction);
2024-10-27 09:44:22 +00:00
}
2024-10-06 23:41:09 +00:00
2024-10-27 09:44:22 +00:00
if (!_isPlayerInteracting && !_isCrewInteracting)
{
2024-11-25 12:36:48 +00:00
InteractionCanvas.BalloonUi.ResumeTween();
2024-10-27 09:44:22 +00:00
if (HoldingElapsedTime > 0f)
{
2024-11-28 23:07:50 +00:00
HoldingElapsedTime -= playerHoldingDeltaTime;
2024-10-27 09:44:22 +00:00
}
2024-10-06 23:41:09 +00:00
}
}
2024-10-31 05:41:13 +00:00
private void OnDestroy()
{
2024-11-15 07:28:13 +00:00
EventManager.OnCleaningAll -= DestroyObject;
2024-10-31 05:41:13 +00:00
}
2024-10-06 23:41:09 +00:00
public void Initialize()
{
2024-12-06 13:20:10 +00:00
InteractionCanvas.BalloonUi.OrderItem(0, TycoonManager.Instance.TycoonStageController.StageDataSo.VomitingWaitTime);
2024-10-15 18:01:16 +00:00
var crewController = TycoonManager.Instance.CrewController;
Utils.StartUniqueCoroutine(this, ref _findCleanerCrewInstance,
crewController.FindClosestCrewCoroutine(CenterTransform.position, crewController.CleanerCrews, crew => crew.OnMission(this)));
2024-11-07 09:13:54 +00:00
_currentLevelData = TycoonManager.Instance.GetCurrentLevelData();
2024-10-06 23:41:09 +00:00
}
public override void Interaction()
{
2024-10-14 11:13:08 +00:00
GameManager.Instance.CurrentTycoonPlayer.IsCleaningFloor = true;
_isPlayerInteracting = true;
2024-11-18 10:07:19 +00:00
AudioManager.Instance.PlaySfx(_cleaningSfxName);
2024-10-06 23:41:09 +00:00
}
public override void CancelInteraction()
{
2024-10-14 11:13:08 +00:00
GameManager.Instance.CurrentTycoonPlayer.IsCleaningFloor = false;
_isPlayerInteracting = false;
2024-11-17 15:36:08 +00:00
AudioManager.Instance.StopSfx(_cleaningSfxName);
2024-10-06 23:41:09 +00:00
}
public override bool CanInteraction()
{
2024-11-04 12:22:07 +00:00
return !GameManager.Instance.CurrentTycoonPlayer.TycoonPickupHandler.IsPickedUpAnything();
2024-10-06 23:41:09 +00:00
}
2024-11-15 07:28:13 +00:00
private void DestroyObject()
2024-10-06 23:41:09 +00:00
{
2024-10-28 04:52:11 +00:00
if (_isPlayerInteracting)
{
GameManager.Instance.CurrentTycoonPlayer.IsCleaningFloor = false;
}
2024-12-06 13:20:10 +00:00
OnInteractionCompleted?.Invoke();
OnInteractionCompleted = null;
2024-11-15 07:28:13 +00:00
2024-10-06 23:41:09 +00:00
Destroy(gameObject);
}
2024-10-14 11:13:08 +00:00
public void InteractionCrew(Crew crew)
{
_isCrewInteracting = true;
2024-10-22 12:41:31 +00:00
((CleanerCrew)crew).SetIsCleaningFloor(true);
2024-10-14 11:13:08 +00:00
}
public void CancelInteractionCrew()
{
_isCrewInteracting = false;
}
2024-10-27 09:44:22 +00:00
public bool CanInteractionCrew(Crew crew = null)
2024-10-14 11:13:08 +00:00
{
2024-10-27 09:44:22 +00:00
return true;
2024-10-14 11:13:08 +00:00
}
2024-10-06 23:41:09 +00:00
}
}