using UnityEngine; using System; using System.Collections; using Core; using Core.Lifecycle; using Core.SaveLoad; using UnityEngine.Audio; public class PicnicBehaviour : ManagedBehaviour { [Header("Random Call Settings")] public float getDistractedMin = 2f; public float getDistractedMax = 5f; public float getFlirtyMin = 1f; public float getFlirtyMax = 3f; private AppleMachine stateMachine; private Animator animator; [Header("The FakeChocolate to destroy!")] [SerializeField] private GameObject fakeChocolate; [SerializeField] private GameObject realChocolate; private AppleAudioSource _audioSource; public AudioResource distractedAudioClips; public AudioResource angryAudioClips; public AudioResource feederClips; public AudioResource moanerClips; // Save system configuration public override bool AutoRegisterForSave => true; // Runtime state tracking private bool _fakeChocolateDestroyed; internal override void OnManagedAwake() { stateMachine = GetComponent(); animator = GetComponent(); _audioSource = GetComponent(); } internal override void OnSceneRestoreCompleted() { if (_fakeChocolateDestroyed) { DestroyChocolateObjects(); } else { StartCoroutine(StateCycleRoutine()); } } private IEnumerator StateCycleRoutine() { while (true) { // Distracted state float distractedWait = UnityEngine.Random.Range(getDistractedMin, getDistractedMax); stateMachine.ChangeState("Picnic PPL Distracted"); animator.SetBool("theyDistracted", true); _audioSource.Stop(); yield return new WaitForSeconds(distractedWait); // Chilling state float chillingWait = UnityEngine.Random.Range(getFlirtyMin, getFlirtyMax); stateMachine.ChangeState("Picnic PPL Chilling"); animator.SetBool("theyDistracted", false); _audioSource.Stop(); yield return new WaitForSeconds(chillingWait); } } public void triedToStealChocolate() { _audioSource.Stop(); animator.SetTrigger("theyAngry"); Logging.Debug("Hey! Don't steal my chocolate!"); _audioSource.audioSource.resource = angryAudioClips; _audioSource.Play(0); } public void destroyFakeChocolate() { _fakeChocolateDestroyed = true; Destroy(fakeChocolate); Destroy(realChocolate); } private void DestroyChocolateObjects() { if (fakeChocolate != null) { Destroy(fakeChocolate); fakeChocolate = null; } if (realChocolate != null) { realChocolate.SetActive(true); } } public void PlayFeederAudio() { _audioSource.audioSource.resource = feederClips; _audioSource.Play(0); } public void PlayMoanerAudio() { _audioSource.audioSource.resource = moanerClips; _audioSource.Play(0); } public void PlayDistractedAudio() { _audioSource.audioSource.resource = distractedAudioClips; _audioSource.Play(0); } internal override string OnSceneSaveRequested() { var state = new PicnicBehaviourState { fakeChocolateDestroyed = _fakeChocolateDestroyed }; return JsonUtility.ToJson(state); } internal override void OnSceneRestoreRequested(string serializedData) { if (string.IsNullOrEmpty(serializedData)) return; try { var state = JsonUtility.FromJson(serializedData); if (state != null) { _fakeChocolateDestroyed = state.fakeChocolateDestroyed; } } catch (Exception ex) { Debug.LogWarning($"[PicnicBehaviour] Failed to restore state: {ex.Message}"); } } } [Serializable] public class PicnicBehaviourState { public bool fakeChocolateDestroyed; }