using Core.SaveLoad; using Input; using UnityEngine; using UnityEngine.Events; namespace StateMachines.Quarry.AnneLise { public class TakePhotoState : AppleState { public Transform playerTargetObject; private GameObject _playerCharacter; private PlayerTouchController _playerTouchController; private Vector3 _newPlayerPosition; public UnityEvent animFlash; public UnityEvent animStart; /// /// Called when entering this state during normal gameplay. /// Initiates player movement and triggers photo-taking sequence. /// public override void OnEnterState() { // Find references that are needed regardless of enter/restore _playerCharacter = GameObject.FindWithTag("Player"); _playerTouchController = _playerCharacter.GetComponent(); // Subscribe to player arrival event _playerTouchController.OnArrivedAtTarget += PlayerHasArrived; // Move player to photo position _newPlayerPosition = new Vector3( playerTargetObject.transform.position.x, playerTargetObject.transform.position.y, playerTargetObject.transform.position.z); _playerTouchController.InterruptMoveTo(); _playerTouchController.MoveToAndNotify(_newPlayerPosition); // Disable input during photo sequence InputManager.Instance.SetInputMode(InputMode.InputDisabled); } /// /// Called when restoring this state from save data. /// Skips player movement and animations - just sets up the restored state. /// /// Serialized state data (currently unused for this state) public override void OnRestoreState(string data) { // When restoring, we don't want to move the player or play animations // The state is restored silently - player stays where they are // Input mode will be restored by the input system's own save/load // If we needed to restore any internal state data, we'd deserialize it here // For now, this state has no persistent data beyond being active } /// /// Serialize this state's data for saving. /// Currently this state has no additional data to save beyond being active. /// /// Serialized state data as JSON string public override string SerializeState() { // This state doesn't have internal data to save // The fact that it's the active state is saved by AppleMachine return ""; } // When the player has arrived at the bush do Animator.SetTrigger(Takephoto) and whatevs public void PhotoTaken() { ChangeState("Hidden"); InputManager.Instance.SetInputMode(InputMode.Game); } void PlayerHasArrived() { GetComponent().SetTrigger("TakePhoto"); _playerTouchController.OnArrivedAtTarget -= PlayerHasArrived; } private void OnDisable() { // Cleanup: Unsubscribe from events if (_playerTouchController != null) { _playerTouchController.OnArrivedAtTarget -= PlayerHasArrived; } } public void AnimStarted() { animStart.Invoke(); } public void Flash() { animFlash.Invoke(); } } }