using Assets.Scripts.Interfaces; using System.Collections.Generic; using UnityEngine; public class Player : BaseCharacter { public static Player Instance { get; private set; } [SerializeField] private Transform _holdPoint; private PlayerStates _currentActing; public Dictionary Stats; public JobPositions JobPosition { get; set; } public EducationSkill Education { get; set; } private ContainerItem _containerItem; private string _locationName; private void Awake() { if (Instance != null) { Destroy(gameObject); Debug.Log("There's more than one player instance"); return; } PlayerPrefs.SetString("lastExitName", string.Empty); Instance = this; Stats = PlayerStats.CreateInitialStats(); JobPosition = JobPositions.Unemployed; DontDestroyOnLoad(gameObject); } private void Start() { GameManager.Instance.Time.OnMinuteChanged += UpdateStatsByClock; _animator.applyRootMotion = true; _navAgent.updatePosition = false; _currentActing = PlayerStates.Awake; } private void OnDestroy() { GameManager.Instance.Time.OnMinuteChanged -= UpdateStatsByClock; } public void SetPosition(Vector3 desiredPosition) { _navAgent.Warp(desiredPosition); _navAgent.updatePosition = false; } public void GoToPoint(BaseInteractableObject point) { AddTask(new PlayerTasks(Tasks.Move, point)); } public async void Interact(BaseInteractableObject interactionItem) { var result = await interactionItem.ShowPopupMenu(this); if (result != InteractionStatus.Complete) { if (!IsPathComplete(interactionItem._interactionPoint.position)) { AddTask(new PlayerTasks(Tasks.Move, interactionItem)); AddTask(new PlayerTasks(Tasks.Rotate, interactionItem)); AddTask(new PlayerTasks(Tasks.Interact, interactionItem)); } else { AddTask(new PlayerTasks(Tasks.Interact, interactionItem)); } } } public void SetPlayerActing(PlayerStates state) { _currentActing = state; } public void UpdateStatsByClock() { switch (_currentActing) { case PlayerStates.Eating: (Stats[StatsId.Food] as INumericStat).increase(10f); break; case PlayerStates.Sleeping: (Stats[StatsId.Energy] as INumericStat).increase(0.2f); (Stats[StatsId.Food] as INumericStat).deduct(0.03f); break; default: (Stats[StatsId.Food] as INumericStat).deduct(0.05f); // 48 hours it's 100, 100/2880=~0.034 per minute (Stats[StatsId.Energy] as INumericStat).deduct(0.1f); // 24 hours it's 100, 100/1440=~0.096 per minute break; } } public void Pay(float amount) { (Stats[StatsId.Money] as INumericStat).deduct(amount); } public void AddMoney(float amount) { (Stats[StatsId.Money] as INumericStat).increase(amount); } public void SetContainerItem(ContainerItem containerItem) { containerItem.transform.parent = _holdPoint; containerItem.transform.localPosition = Vector3.zero; _containerItem = containerItem; } public ContainerItem GetContainerItem() { return _containerItem; } public void ClearContainerItem() { Destroy(_containerItem.gameObject); _containerItem = null; } public bool IsHoldContainerItem() { return _containerItem != null; } public void SetLocationName(string locationName) { _locationName = locationName; } public string GetLocationName() { return _locationName; } }