diff --git a/Assets/Scripts/Helpers/Enums.cs b/Assets/Scripts/Helpers/Enums.cs index 53eb51f8..bda16608 100644 --- a/Assets/Scripts/Helpers/Enums.cs +++ b/Assets/Scripts/Helpers/Enums.cs @@ -7,6 +7,7 @@ public enum PlayerStates { Awake, Sleeping, Eating,Working } public enum StatsId { Money, RentAccount, Food, Energy, BankAccount, Job, } public enum Tasks { Move, Interact, Rotate }; public enum TaskStatus { Waiting, InProgress, Complete }; +public enum InteractionStatus { Complete, WaitForChoose, InProgress, FarFromPlayer }; public enum AnimationStates { [EnumMember(Value = "Idle")] diff --git a/Assets/Scripts/InteractableObjects/BaseInteractableObject.cs b/Assets/Scripts/InteractableObjects/BaseInteractableObject.cs index e74bd99e..c1af494e 100644 --- a/Assets/Scripts/InteractableObjects/BaseInteractableObject.cs +++ b/Assets/Scripts/InteractableObjects/BaseInteractableObject.cs @@ -1,5 +1,6 @@ -using UnityEngine; -using static UnityEditor.Experimental.GraphView.GraphView; +using System; +using System.Collections; +using UnityEngine; public class BaseInteractableObject : MonoBehaviour { @@ -7,15 +8,39 @@ public class BaseInteractableObject : MonoBehaviour public Transform _interactionPoint; [SerializeField] public PopupItemMenu _radialMenuPrefab; - protected Player _player; - public virtual void Interact(Player player) + private InteractionStatus _currentStatus=InteractionStatus.Complete; + + public InteractionStatus Interact(Player player) { _player=player; + if (_currentStatus == InteractionStatus.Complete) + { + UIManager.Instance.ShowItemsMenu(PopupMenuCallback); + _currentStatus = InteractionStatus.WaitForChoose; + } + else if(_currentStatus!=InteractionStatus.WaitForChoose) + { + if (_player.IsPathComplete(_interactionPoint.position)) + { + InteractAction(); + _currentStatus = InteractionStatus.Complete; + } + else + { + _currentStatus = InteractionStatus.FarFromPlayer; + } + } + return _currentStatus; } - public void SpawnMenu() + private void PopupMenuCallback() { - UIManager.Instance.ShowItemsMenu(); + _currentStatus = InteractionStatus.InProgress; } + + protected virtual void InteractAction() + { + + } } diff --git a/Assets/Scripts/InteractableObjects/Bed.cs b/Assets/Scripts/InteractableObjects/Bed.cs index 15ac926c..2cb65367 100644 --- a/Assets/Scripts/InteractableObjects/Bed.cs +++ b/Assets/Scripts/InteractableObjects/Bed.cs @@ -1,14 +1,13 @@ using System; +using System.Collections; public class Bed : BaseInteractableObject { - public override void Interact(Player player) + protected override void InteractAction() { - base.Interact(player); _player.SetPlayerAnimation(AnimationStates.Sitting, OnAnimationFinished); } - private void OnAnimationFinished() { UIManager.Instance.ShowTimeSliderDialog("Go to sleep", "Sleep until", OnCancel, OnConfirm); diff --git a/Assets/Scripts/InteractableObjects/CashierDesk.cs b/Assets/Scripts/InteractableObjects/CashierDesk.cs index a3e5c728..34db4919 100644 --- a/Assets/Scripts/InteractableObjects/CashierDesk.cs +++ b/Assets/Scripts/InteractableObjects/CashierDesk.cs @@ -11,16 +11,15 @@ public class CashierDesk : BaseInteractableObject private List _jobsInfoList; private JobInfoSO _playerJob; - public override void Interact(Player player) + protected override void InteractAction() { - base.Interact(player); - if (player.IsHoldContainerItem()) + if (_player.IsHoldContainerItem()) { BuyItems(); } else { - _playerJob = _jobsInfoList.Where(x => x.JobPosition == player.JobPosition).FirstOrDefault(); + _playerJob = _jobsInfoList.Where(x => x.JobPosition == _player.JobPosition).FirstOrDefault(); print($"playerJob is {_playerJob}"); if (_playerJob != null) { @@ -31,7 +30,7 @@ public class CashierDesk : BaseInteractableObject { print("You don't work here"); } - } + } } private void BuyItems() diff --git a/Assets/Scripts/InteractableObjects/Door.cs b/Assets/Scripts/InteractableObjects/Door.cs index 51ea2286..2a2aaa64 100644 --- a/Assets/Scripts/InteractableObjects/Door.cs +++ b/Assets/Scripts/InteractableObjects/Door.cs @@ -14,11 +14,11 @@ public class Door : BaseInteractableObject print($"Player came from to {_scene}"); Player.Instance.SetPosition(_interactionPoint.position); } + } - public override void Interact(Player player) - { - base.Interact(player); + protected override void InteractAction() + { if (!string.IsNullOrEmpty(_exitName)) { PlayerPrefs.SetString("lastExitName", _exitName.ToLower()); diff --git a/Assets/Scripts/InteractableObjects/Fridge.cs b/Assets/Scripts/InteractableObjects/Fridge.cs index a838a106..454aa9c2 100644 --- a/Assets/Scripts/InteractableObjects/Fridge.cs +++ b/Assets/Scripts/InteractableObjects/Fridge.cs @@ -12,12 +12,11 @@ public class Fridge : BaseInteractableObject private List _foodObjects = new List(); - public override void Interact(Player player) - { - base.Interact(player); - if (player.IsHoldContainerItem()) + protected override void InteractAction() + { + if (_player.IsHoldContainerItem()) { - var playerContainer = player.GetContainerItem(); + var playerContainer = _player.GetContainerItem(); if (!playerContainer.IsSalebleItems()) { if (_foodObjects.Count + playerContainer.GetItems().Count <= _containerSO.MaxCapacity) @@ -27,7 +26,7 @@ public class Fridge : BaseInteractableObject _foodObjects.Add(item); } - player.ClearContainerItem(); + _player.ClearContainerItem(); Debug.Log($"Fridge have {_foodObjects.Count} pices of food"); } else @@ -39,7 +38,7 @@ public class Fridge : BaseInteractableObject //Eat menu if (_foodObjects.Count > 0) { - var hunger = player.Stats[StatsId.Food].MaxValue - player.Stats[StatsId.Food].Value; + var hunger = _player.Stats[StatsId.Food].MaxValue - _player.Stats[StatsId.Food].Value; var eatingItems = _foodObjects.Count < (hunger / 10) ? _foodObjects.Count : (hunger / 10); StartCoroutine(EatRoutine(eatingItems)); _foodObjects.RemoveRange(0, (int)eatingItems); diff --git a/Assets/Scripts/InteractableObjects/OfficeTable.cs b/Assets/Scripts/InteractableObjects/OfficeTable.cs index 256deaa3..06eaafef 100644 --- a/Assets/Scripts/InteractableObjects/OfficeTable.cs +++ b/Assets/Scripts/InteractableObjects/OfficeTable.cs @@ -7,9 +7,8 @@ public class OfficeTable : BaseInteractableObject [SerializeField] private JobsListSO _jobPositionsSO; - public override void Interact(Player player) + protected override void InteractAction() { - base.Interact(player); UIManager.Instance.ShowJobSelectionDialog("Job agency", null, OnConfirm); } diff --git a/Assets/Scripts/InteractableObjects/ShopingBasket.cs b/Assets/Scripts/InteractableObjects/ShopingBasket.cs index a4aab49c..deb87407 100644 --- a/Assets/Scripts/InteractableObjects/ShopingBasket.cs +++ b/Assets/Scripts/InteractableObjects/ShopingBasket.cs @@ -7,10 +7,9 @@ public class ShopingContainer : BaseInteractableObject [SerializeField] //private ItemActionsUI _actionsMenu; - public override void Interact(Player player) + protected override void InteractAction() { - base.Interact(player); - if (!player.IsHoldContainerItem()) + if (!_player.IsHoldContainerItem()) { var transform = Instantiate(_containerSO.prefab, _interactionPoint); var containerItem = transform.GetComponent(); @@ -19,9 +18,7 @@ public class ShopingContainer : BaseInteractableObject Debug.LogError("Container Item is null"); return; } - player.SetContainerItem(containerItem); + _player.SetContainerItem(containerItem); } } - - } diff --git a/Assets/Scripts/InteractableObjects/StoreContainer.cs b/Assets/Scripts/InteractableObjects/StoreContainer.cs index 3eb94c64..cb56e009 100644 --- a/Assets/Scripts/InteractableObjects/StoreContainer.cs +++ b/Assets/Scripts/InteractableObjects/StoreContainer.cs @@ -6,16 +6,14 @@ public class StoreContainer : BaseInteractableObject [SerializeField] private SellableItemSO _sellableItemSO; - public override void Interact(Player player) + protected override void InteractAction() { - base.Interact(player); - if (player.IsHoldContainerItem()) + if (_player.IsHoldContainerItem()) { var clone = Instantiate(_sellableItemSO); - var container = player.GetContainerItem(); + var container = _player.GetContainerItem(); container.AddItem(clone); } - } } diff --git a/Assets/Scripts/Player/Player.cs b/Assets/Scripts/Player/Player.cs index 13e274ba..c5e99056 100644 --- a/Assets/Scripts/Player/Player.cs +++ b/Assets/Scripts/Player/Player.cs @@ -24,7 +24,7 @@ public class Player : MonoBehaviour public Dictionary Stats; public JobPositions JobPosition { get; set; } - public EducationSkill Education { get; set; } + public EducationSkill Education { get; set; } private readonly Queue _tasks = new Queue(); private PlayerTasks _currentTask; @@ -56,10 +56,10 @@ public class Player : MonoBehaviour TimeManager.Instance.OnMinuteChanged += UpdateStatsByClock; _animator.applyRootMotion = true; _navAgent.updatePosition = false; - + _currentActing = PlayerStates.Awake; - + } private void OnDestroy() @@ -105,18 +105,21 @@ public class Player : MonoBehaviour _currentTask.UpdateStatus(MoveToPoint()); break; case Tasks.Interact: - // Show interaction menu - _currentTask.TagretObject.SpawnMenu(); - _currentTask = null; - //if (IsPathComplete(_currentTask.TagretObject._interactionPoint.position)) - // _currentTask.UpdateStatus(InteractWithObject(_currentTask.TagretObject)); - //else - //{ - // AddTask(new PlayerTasks(Tasks.Move, _currentTask.TagretObject)); - // AddTask(new PlayerTasks(Tasks.Rotate, _currentTask.TagretObject)); - // AddTask(_currentTask); - // _currentTask = null; - //} + var result = _currentTask.TagretObject.Interact(this); + switch (result) + { + case InteractionStatus.FarFromPlayer: + AddTask(new PlayerTasks(Tasks.Move, _currentTask.TagretObject)); + AddTask(new PlayerTasks(Tasks.Rotate, _currentTask.TagretObject)); + AddTask(_currentTask); + _currentTask = null; + break; + case InteractionStatus.Complete: + _currentTask.UpdateStatus(TaskStatus.Complete); + break; + default: + break; + } break; } } @@ -137,7 +140,7 @@ public class Player : MonoBehaviour return IsPathComplete(_navAgent.destination) ? TaskStatus.Complete : TaskStatus.InProgress; } - private bool IsPathComplete(Vector3 destination) + public bool IsPathComplete(Vector3 destination) { var dest = new Vector3(destination.x, 0, destination.z); var pos = new Vector3(_navAgent.transform.position.x, 0, _navAgent.transform.position.z); @@ -174,11 +177,11 @@ public class Player : MonoBehaviour return Mathf.Abs(Quaternion.Dot(q1, q2)) >= 1 - precision; } - private TaskStatus InteractWithObject(BaseInteractableObject interactableObject) - { - interactableObject.Interact(this); - return TaskStatus.Complete; - } + //private TaskStatus InteractWithObject(BaseInteractableObject interactableObject) + //{ + // interactableObject.Interact(this); + // return TaskStatus.Complete; + //} public void SetPlayerAnimation(AnimationStates newState, Action onAnimationFinish) { diff --git a/Assets/Scripts/UIElements/PopupItemMenu.cs b/Assets/Scripts/UIElements/PopupItemMenu.cs index 435b2495..15b9b02c 100644 --- a/Assets/Scripts/UIElements/PopupItemMenu.cs +++ b/Assets/Scripts/UIElements/PopupItemMenu.cs @@ -1,3 +1,5 @@ +using System; +using System.Collections; using UnityEngine; using UnityEngine.UI; @@ -6,10 +8,27 @@ public class PopupItemMenu : MonoBehaviour [SerializeField] private Button _popupMenuItemButtonPrefab; - public void ShowButtons() + public void ShowButtons(Action menuButtonClick) { var button=Instantiate(_popupMenuItemButtonPrefab) as Button; button.transform.SetParent(transform,false); button.transform.localPosition = new Vector3(0, 100f, 0); + + button.onClick.AddListener(() => + { + menuButtonClick?.Invoke(); + Hide(); + CloseDialog(); + }); + } + private void CloseDialog() + { + UIManager.Instance.Unfreeze(); + Destroy(this); + } + + private void Hide() + { + gameObject.SetActive(false); } } diff --git a/Assets/Scripts/UIElements/UIManager.cs b/Assets/Scripts/UIElements/UIManager.cs index c50bae87..8e478eed 100644 --- a/Assets/Scripts/UIElements/UIManager.cs +++ b/Assets/Scripts/UIElements/UIManager.cs @@ -40,12 +40,12 @@ public class UIManager : MonoBehaviour jobSelector.ShowJobSelectionDialog(title, onCancel, onConfirm); } - public void ShowItemsMenu() + public void ShowItemsMenu(Action itemsMenuCallback) { var popupMenu = Instantiate(_itemPopupMenuPrefab) as PopupItemMenu; popupMenu.transform.transform.SetParent(transform, false); popupMenu.transform.position = Input.mousePosition; - popupMenu.ShowButtons(); + popupMenu.ShowButtons(itemsMenuCallback); } public void Freeze()