diff --git a/Assets/AddressableAssetsData/AssetGroups/BlokkemonCards.asset b/Assets/AddressableAssetsData/AssetGroups/BlokkemonCards.asset index e92adc01..41c8d678 100644 --- a/Assets/AddressableAssetsData/AssetGroups/BlokkemonCards.asset +++ b/Assets/AddressableAssetsData/AssetGroups/BlokkemonCards.asset @@ -63,18 +63,6 @@ MonoBehaviour: m_SerializedLabels: - BlokkemonCard FlaggedDuringContentUpdateRestriction: 0 - - m_GUID: 4f4ec75013bc276429c2f4fa52d165e0 - m_Address: Assets/Data/Cards/Card_KalkUlation 3.asset - m_ReadOnly: 0 - m_SerializedLabels: - - BlokkemonCard - FlaggedDuringContentUpdateRestriction: 0 - - m_GUID: 53996921ed2094948aa317efe4ca6630 - m_Address: Assets/Data/Cards/Card_MormorMarmor 3.asset - m_ReadOnly: 0 - m_SerializedLabels: - - BlokkemonCard - FlaggedDuringContentUpdateRestriction: 0 - m_GUID: 73d54071304571647b3238a799d9781f m_Address: Assets/Data/Cards/Card_New Card.asset m_ReadOnly: 0 diff --git a/Assets/Editor/Tools/AutoClearSavesOnPlay.cs b/Assets/Editor/Tools/AutoClearSavesOnPlay.cs new file mode 100644 index 00000000..43540408 --- /dev/null +++ b/Assets/Editor/Tools/AutoClearSavesOnPlay.cs @@ -0,0 +1,95 @@ +using System.IO; +using UnityEditor; +using UnityEngine; +using AppleHills.Core.Settings; + +namespace Editor.Tools +{ + /// + /// Editor script that automatically clears saves before entering play mode + /// if the autoClearSaves setting is enabled in DebugSettings + /// + [InitializeOnLoad] + public static class AutoClearSavesOnPlay + { + static AutoClearSavesOnPlay() + { + EditorApplication.playModeStateChanged += OnPlayModeStateChanged; + } + + private static void OnPlayModeStateChanged(PlayModeStateChange state) + { + // Only act when entering play mode (before the scene starts playing) + if (state != PlayModeStateChange.ExitingEditMode) + return; + + // Try to load the debug settings + DebugSettings debugSettings = LoadDebugSettings(); + + if (debugSettings == null) + { + Debug.LogWarning("[AutoClearSaves] Could not find DebugSettings asset. Auto-clear saves disabled."); + return; + } + + // Check if auto-clear is enabled + if (!debugSettings.AutoClearSaves) + { + return; + } + + // Execute the clear saves logic + ClearSavesFolder(); + } + + private static DebugSettings LoadDebugSettings() + { + // Try to find the DebugSettings asset in the project + string[] guids = AssetDatabase.FindAssets("t:DebugSettings"); + + if (guids.Length == 0) + { + return null; + } + + // Load the first found DebugSettings asset + string path = AssetDatabase.GUIDToAssetPath(guids[0]); + return AssetDatabase.LoadAssetAtPath(path); + } + + private static void ClearSavesFolder() + { + // Construct the save folder path (matches SaveLoadManager.DefaultSaveFolder) + string saveFolder = Path.Combine(Application.persistentDataPath, "GameSaves"); + + if (!Directory.Exists(saveFolder)) + { + Debug.Log("[AutoClearSaves] Save folder does not exist, nothing to clear."); + return; + } + + try + { + // Delete all files in the save folder + string[] files = Directory.GetFiles(saveFolder); + int deletedCount = 0; + + foreach (string file in files) + { + File.Delete(file); + deletedCount++; + } + + if (deletedCount > 0) + { + Debug.Log($"[AutoClearSaves] Automatically deleted {deletedCount} save file(s) before entering play mode"); + } + } + catch (System.Exception ex) + { + Debug.LogError($"[AutoClearSaves] Failed to auto-clear saves: {ex}"); + } + } + } +} + diff --git a/Assets/Editor/Tools/AutoClearSavesOnPlay.cs.meta b/Assets/Editor/Tools/AutoClearSavesOnPlay.cs.meta new file mode 100644 index 00000000..63efe13e --- /dev/null +++ b/Assets/Editor/Tools/AutoClearSavesOnPlay.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: c3ba01f7bb704c17bc4f22fd726f7fee +timeCreated: 1763974355 \ No newline at end of file diff --git a/Assets/Prefabs/Managers/PlayerHUD.prefab b/Assets/Prefabs/Managers/PlayerHUD.prefab index 6bacacc9..1c1b01fd 100644 --- a/Assets/Prefabs/Managers/PlayerHUD.prefab +++ b/Assets/Prefabs/Managers/PlayerHUD.prefab @@ -802,7 +802,7 @@ MonoBehaviour: m_SelectedTrigger: Selected m_DisabledTrigger: Disabled m_Interactable: 1 - m_TargetGraphic: {fileID: 0} + m_TargetGraphic: {fileID: 4189849640380816173} m_OnClick: m_PersistentCalls: m_Calls: @@ -1459,6 +1459,10 @@ PrefabInstance: serializedVersion: 3 m_TransformParent: {fileID: 2474710976069581060} m_Modifications: + - target: {fileID: 823686888810001266, guid: 428a0feafda9d6d4e87ecf43ad41dc20, type: 3} + propertyPath: m_OnClick.m_PersistentCalls.m_Calls.Array.data[0].m_CallState + value: 1 + objectReference: {fileID: 0} - target: {fileID: 5445689290567702089, guid: 428a0feafda9d6d4e87ecf43ad41dc20, type: 3} propertyPath: m_Pivot.x value: 1 diff --git a/Assets/Scenes/Levels/Quarry.unity b/Assets/Scenes/Levels/Quarry.unity index e56cbf76..3408b28d 100644 --- a/Assets/Scenes/Levels/Quarry.unity +++ b/Assets/Scenes/Levels/Quarry.unity @@ -450296,7 +450296,7 @@ GameObject: - component: {fileID: 1137411215} m_Layer: 0 m_Name: CinemachineCamera - m_TagString: Untagged + m_TagString: MainCinemachineCamera m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 diff --git a/Assets/Scripts/Core/Settings/Developer/DebugSettings.cs b/Assets/Scripts/Core/Settings/Developer/DebugSettings.cs index ca271fec..6f2d7846 100644 --- a/Assets/Scripts/Core/Settings/Developer/DebugSettings.cs +++ b/Assets/Scripts/Core/Settings/Developer/DebugSettings.cs @@ -31,6 +31,8 @@ namespace AppleHills.Core.Settings [Header("Save Load Options")] [Tooltip("Should use save laod system?")] [SerializeField] public bool useSaveLoadSystem = true; + [Tooltip("Automatically clear all saves before entering play mode in editor")] + [SerializeField] public bool autoClearSaves = false; [Header("Logging Options")] [Tooltip("Logging level for bootstrap services")] @@ -49,6 +51,7 @@ namespace AppleHills.Core.Settings // Property getters public bool ShowDebugUiMessages => showDebugUiMessages; public bool PauseTimeOnPauseGame => pauseTimeOnPauseGame; + public bool AutoClearSaves => autoClearSaves; public override void OnValidate() { diff --git a/Assets/Scripts/DamianExperiments/EagleEyeBehaviour.cs b/Assets/Scripts/DamianExperiments/EagleEyeBehaviour.cs index 4fa772d8..6674fefc 100644 --- a/Assets/Scripts/DamianExperiments/EagleEyeBehaviour.cs +++ b/Assets/Scripts/DamianExperiments/EagleEyeBehaviour.cs @@ -1,84 +1,131 @@ +using System.Collections; using Unity.Cinemachine; using UnityEngine; -using System.Collections; -public class EagleEyeBehaviour : MonoBehaviour +namespace DamianExperiments { - [SerializeField] private CinemachineCamera virtualCamera; - [SerializeField] private CinemachineConfiner2D confiner2D; - [SerializeField] private float zoomOutOrthoSize = 30f; - [SerializeField] private float normalOrthoSize = 15f; - private float currentOrthoSize; - [SerializeField] private float transitionDuration = 0.5f; // Duration of the transition - [SerializeField] private float eagleEyeDuration = 3f; // Duration to stay zoomed out - [SerializeField] private bool disablePlayerInputDuringEagleEye = true; // Gate input disable - [SerializeField] private UnityEngine.UI.Button eagleEyeButton; // Reference to the UI button - - private Coroutine zoomCoroutine; - - public void ActivateEagleEye() + public class EagleEyeBehaviour : MonoBehaviour { - //Assigns the Virtual Camera and Confiner if not already assigned - if (virtualCamera == null) - { - virtualCamera = FindAnyObjectByType(); - } - if (confiner2D == null) - { - confiner2D = virtualCamera.GetComponent(); - } + // Serialized backing fields allow manual assignment in the inspector + private GameObject _cinecameraObject; + private CinemachineCamera _virtualCamera; + private CinemachineConfiner2D _confiner2D; - // Implementation for activating eagle eye behaviour - if (disablePlayerInputDuringEagleEye) + // Lazy-fetched properties: if null, try to find the GameObject tagged "MainCinemachineCamera" + private CinemachineCamera VirtualCamera { - currentOrthoSize = virtualCamera.Lens.OrthographicSize; - } - if (eagleEyeButton != null) - { - eagleEyeButton.interactable = false; - } - if (zoomCoroutine != null) StopCoroutine(zoomCoroutine); - zoomCoroutine = StartCoroutine(EagleEyeSequence()); - } - - private IEnumerator EagleEyeSequence() - { - if (disablePlayerInputDuringEagleEye) - { - Core.GameManager.Instance.RequestPause(this); // Disable player input - } - yield return StartCoroutine(SmoothOrthoSize(virtualCamera, zoomOutOrthoSize, transitionDuration)); - yield return new WaitForSeconds(eagleEyeDuration); - float zoomInTarget = disablePlayerInputDuringEagleEye ? currentOrthoSize : normalOrthoSize; - yield return StartCoroutine(SmoothOrthoSize(virtualCamera, zoomInTarget, transitionDuration)); - if (disablePlayerInputDuringEagleEye) - { - Core.GameManager.Instance.ReleasePause(this); // Re-enable player input - } - if (eagleEyeButton != null) - { - eagleEyeButton.interactable = true; - } - } - - private IEnumerator SmoothOrthoSize(CinemachineCamera cam, float targetSize, float duration) - { - float startSize = cam.Lens.OrthographicSize; - float elapsed = 0f; - while (elapsed < duration) - { - elapsed += Time.deltaTime; - cam.Lens.OrthographicSize = Mathf.Lerp(startSize, targetSize, elapsed / duration); - if (confiner2D != null) + get { - confiner2D.InvalidateBoundingShapeCache(); + if (_virtualCamera == null) + { + if (_cinecameraObject == null) + _cinecameraObject = GameObject.FindWithTag("MainCinemachineCamera"); + if (_cinecameraObject != null) + { + _virtualCamera = _cinecameraObject.GetComponent(); + + if (_virtualCamera == null) + Debug.LogWarning("EagleEyeBehaviour: Found object with tag 'MainCinemachineCamera' " + + "but couldn't find a CinemachineCamera component."); + } + else + { + Debug.LogWarning("EagleEyeBehaviour: No GameObject found with tag 'MainCinemachineCamera'."); + } + } + + return _virtualCamera; } - yield return null; + set => _virtualCamera = value; } - cam.Lens.OrthographicSize = targetSize; - if (confiner2D != null) + + private CinemachineConfiner2D Confiner2D { - confiner2D.InvalidateBoundingShapeCache(); + get + { + if (_confiner2D == null) + { + // If a virtual camera exists, try to pull the confiner from it + if (VirtualCamera != null) + { + _confiner2D = VirtualCamera.GetComponent(); + } + + if (_confiner2D == null) + { + Debug.LogWarning("EagleEyeBehaviour: CinemachineConfiner2D not found on the MainCinemachineCamera object."); + } + } + + return _confiner2D; + } + set => _confiner2D = value; + } + + [SerializeField] private float zoomOutOrthoSize = 30f; + [SerializeField] private float normalOrthoSize = 15f; + [SerializeField] private float transitionDuration = 0.5f; // Duration of the transition + [SerializeField] private float eagleEyeDuration = 3f; // Duration to stay zoomed out + [SerializeField] private UnityEngine.UI.Button eagleEyeButton; // Reference to the UI button + + private Coroutine _zoomCoroutine; + private Coroutine _smoothOrthoCoroutine; + private float _currentOrthoSize; + + public void ResetEagleEye() + { + if (_zoomCoroutine != null) + StopCoroutine(_zoomCoroutine); + if (_smoothOrthoCoroutine != null) + StopCoroutine(_smoothOrthoCoroutine); + if (eagleEyeButton != null) + eagleEyeButton.interactable = true; + } + + + public void ActivateEagleEye() + { + if (eagleEyeButton != null) + { + eagleEyeButton.interactable = false; + } + if (_zoomCoroutine != null) StopCoroutine(_zoomCoroutine); + _zoomCoroutine = StartCoroutine(EagleEyeSequence()); + } + + private IEnumerator EagleEyeSequence() + { + _smoothOrthoCoroutine = StartCoroutine(SmoothOrthoSize(VirtualCamera, zoomOutOrthoSize, transitionDuration)); + yield return _smoothOrthoCoroutine; + yield return new WaitForSeconds(eagleEyeDuration); + float zoomInTarget = normalOrthoSize; + _smoothOrthoCoroutine = StartCoroutine(SmoothOrthoSize(VirtualCamera, zoomInTarget, transitionDuration));; + yield return _smoothOrthoCoroutine; + if (eagleEyeButton != null) + { + eagleEyeButton.interactable = true; + } + } + + private IEnumerator SmoothOrthoSize(CinemachineCamera cam, float targetSize, float duration) + { + float startSize = cam.Lens.OrthographicSize; + float elapsed = 0f; + while (elapsed < duration) + { + elapsed += Time.deltaTime; + cam.Lens.OrthographicSize = Mathf.Lerp(startSize, targetSize, elapsed / duration); + if (Confiner2D != null) + { + Confiner2D.InvalidateBoundingShapeCache(); + } + yield return null; + } + cam.Lens.OrthographicSize = targetSize; + if (Confiner2D != null) + { + Confiner2D.InvalidateBoundingShapeCache(); + } } } } diff --git a/Assets/Scripts/UI/PlayerHudManager.cs b/Assets/Scripts/UI/PlayerHudManager.cs index 8ab8fbea..9726464d 100644 --- a/Assets/Scripts/UI/PlayerHudManager.cs +++ b/Assets/Scripts/UI/PlayerHudManager.cs @@ -8,6 +8,7 @@ using UnityEngine.UI; using System.Linq; using System.Collections.Generic; using System; +using DamianExperiments; namespace UI { @@ -308,6 +309,9 @@ namespace UI /// private void ApplyUIModeOverrides(bool visible) { + // First, reset state to neutral + ResetStateBeforeLevelLoad(); + switch (currentUIMode) { case UIMode.Overworld: @@ -336,6 +340,11 @@ namespace UI } } + protected void ResetStateBeforeLevelLoad() + { + eagleEye.GetComponent()?.ResetEagleEye(); + } + /// /// Automatically manages HUD visibility based on page stack state /// diff --git a/Assets/Settings/Developer/DebugSettings.asset b/Assets/Settings/Developer/DebugSettings.asset index 59dda546..dfb88eef 100644 --- a/Assets/Settings/Developer/DebugSettings.asset +++ b/Assets/Settings/Developer/DebugSettings.asset @@ -15,6 +15,7 @@ MonoBehaviour: showDebugUiMessages: 1 pauseTimeOnPauseGame: 0 useSaveLoadSystem: 1 + autoClearSaves: 0 bootstrapLogVerbosity: 0 settingsLogVerbosity: 0 gameManagerLogVerbosity: 0 diff --git a/ProjectSettings/TagManager.asset b/ProjectSettings/TagManager.asset index 8d40c99f..70b32caf 100644 --- a/ProjectSettings/TagManager.asset +++ b/ProjectSettings/TagManager.asset @@ -10,6 +10,7 @@ TagManager: - Obstacle - Projectile - Target + - MainCinemachineCamera layers: - Default - TransparentFX