From 0c5546efd2062bc87dec9b13a58146a2c28e6633 Mon Sep 17 00:00:00 2001 From: Michal Pikulski Date: Fri, 10 Oct 2025 14:31:51 +0200 Subject: [PATCH] Add backbone for card creation and implement Camera minigame mechanics --- Assets/Art/Sprites/Cards.meta | 8 + Assets/Art/Sprites/Cards/basic_background.png | Bin 0 -> 4870 bytes .../Sprites/Cards/basic_background.png.meta | 195 ++ Assets/Art/Sprites/Cards/basic_frame.png | Bin 0 -> 13268 bytes Assets/Art/Sprites/Cards/basic_frame.png.meta | 195 ++ Assets/Art/Sprites/Cards/basic_shapes.png | Bin 0 -> 11822 bytes .../Art/Sprites/Cards/basic_shapes.png.meta | 247 ++ Assets/Art/Sprites/Cards/name_plaque.png | Bin 0 -> 12125 bytes Assets/Art/Sprites/Cards/name_plaque.png.meta | 195 ++ Assets/Art/Sprites/UI.meta | 8 + Assets/Art/Sprites/UI/CameraCrosshair.png | Bin 0 -> 1416 bytes .../Art/Sprites/UI/CameraCrosshair.png.meta | 195 ++ Assets/Art/Sprites/UI/CameraGrid.png | Bin 0 -> 10603 bytes Assets/Art/Sprites/UI/CameraGrid.png.meta | 207 ++ Assets/Art/Sprites/UI/DashedCircle.png | Bin 0 -> 300549 bytes Assets/Art/Sprites/UI/DashedCircle.png.meta | 410 +++ Assets/Data/Cards.meta | 8 + Assets/Data/Cards/CardVisualConfig.asset | 41 + Assets/Data/Cards/CardVisualConfig.asset.meta | 8 + Assets/Data/Cards/Card_New Card 1.asset | 21 + Assets/Data/Cards/Card_New Card 1.asset.meta | 8 + Assets/Data/Cards/Card_New Card.asset | 21 + Assets/Data/Cards/Card_New Card.asset.meta | 8 + .../Card_Test example card (Copy) 1.asset | 21 + ...Card_Test example card (Copy) 1.asset.meta | 8 + .../Cards/Card_Test example card (Copy).asset | 21 + .../Card_Test example card (Copy).asset.meta | 8 + .../Card_Test example card 2 (Copy) 1.asset | 21 + ...rd_Test example card 2 (Copy) 1.asset.meta | 8 + .../Card_Test example card 2 (Copy).asset | 21 + ...Card_Test example card 2 (Copy).asset.meta | 8 + .../Card_Test example card 3 (Copy).asset | 21 + ...Card_Test example card 3 (Copy).asset.meta | 8 + Assets/Editor/CardSystem.meta | 3 + Assets/Editor/CardSystem/CardEditorWindow.cs | 1093 ++++++++ .../CardSystem/CardEditorWindow.cs.meta | 3 + .../LiberationSans SDF.asset | 2 +- .../DivingForPictures/QuarryMonster.prefab | 132 +- Assets/Prefabs/UI/CameraCrosshair.prefab | 343 +++ Assets/Prefabs/UI/CameraCrosshair.prefab.meta | 7 + Assets/Prefabs/UI/Cards.meta | 8 + Assets/Prefabs/UI/Cards/CardUI.prefab | 619 +++++ Assets/Prefabs/UI/Cards/CardUI.prefab.meta | 7 + .../MiniGames/DivingForPictures_MICHAL.unity | 2378 +++++++++++++++++ .../DivingForPictures_MICHAL.unity.meta | 7 + Assets/Scripts/Core/GameManager.cs | 2 +- Assets/Scripts/Core/Interfaces/IPausable.cs | 2 +- .../SceneOrientationEnforcer.cs | 0 .../SceneOrientationEnforcer.cs.meta | 0 .../Core/Settings/DivingMinigameSettings.cs | 54 + .../Core/Settings/SettingsInterfaces.cs | 12 + Assets/Scripts/Data/CardSystem.meta | 3 + Assets/Scripts/Data/CardSystem/CardData.cs | 115 + .../Scripts/Data/CardSystem/CardData.cs.meta | 3 + .../Scripts/Data/CardSystem/CardDefinition.cs | 61 + .../Data/CardSystem/CardDefinition.cs.meta | 3 + .../Data/CardSystem/CardSystemManager.cs | 264 ++ .../Data/CardSystem/CardSystemManager.cs.meta | 3 + .../Data/CardSystem/CardVisualConfig.cs | 203 ++ .../Data/CardSystem/CardVisualConfig.cs.meta | 3 + Assets/Scripts/Input/InputManager.cs | 149 +- .../DivingForPictures/Bubbles/Bubble.cs | 8 +- .../Bubbles/BubbleSpawner.cs | 23 +- .../DivingForPictures/DivingGameManager.cs | 483 +++- .../DivingForPictures/DivingScoreUI.cs | 31 +- .../DivingForPictures/Monster/Monster.cs | 91 +- .../Obstacles/FloatingObstacle.cs | 13 +- .../Obstacles/ObstacleSpawner.cs | 47 +- .../DivingForPictures/PictureCamera.meta | 3 + .../PictureCamera/CameraViewfinderManager.cs | 776 ++++++ .../CameraViewfinderManager.cs.meta | 3 + .../PictureCamera/Viewfinder.cs | 119 + .../PictureCamera/Viewfinder.cs.meta | 3 + .../Player/PlayerController.cs | 29 +- .../Player/RopeEndPhysicsFollower.cs | 2 +- .../Tiles/TrenchTileSpawner.cs | 45 +- .../DivingForPictures/Utilities.meta | 8 + .../Utilities/BottlePauser.cs | 31 + .../Utilities/BottlePauser.cs.meta | 2 + .../DivingForPictures/Utilities/RockPauser.cs | 34 + .../Utilities/RockPauser.cs.meta | 2 + Assets/Scripts/UI/CardSystem.meta | 3 + Assets/Scripts/UI/CardSystem/AlbumViewPage.cs | 343 +++ .../UI/CardSystem/AlbumViewPage.cs.meta | 3 + .../UI/CardSystem/BoosterOpeningPage.cs | 270 ++ .../UI/CardSystem/BoosterOpeningPage.cs.meta | 3 + Assets/Scripts/UI/CardSystem/CardAlbumUI.cs | 186 ++ .../Scripts/UI/CardSystem/CardAlbumUI.cs.meta | 3 + Assets/Scripts/UI/CardSystem/CardMenuPage.cs | 177 ++ .../UI/CardSystem/CardMenuPage.cs.meta | 3 + Assets/Scripts/UI/CardSystem/CardUIElement.cs | 255 ++ .../UI/CardSystem/CardUIElement.cs.meta | 3 + Assets/Scripts/UI/CardSystem/UIPage.cs | 92 + Assets/Scripts/UI/CardSystem/UIPage.cs.meta | 3 + .../Scripts/UI/CardSystem/UIPageController.cs | 109 + .../UI/CardSystem/UIPageController.cs.meta | 3 + Assets/Scripts/UI/PauseMenu.cs | 31 +- Assets/Scripts/UI/Utils.meta | 8 + Assets/Scripts/UI/Utils/MaxHeightScaler.cs | 39 + .../Scripts/UI/Utils/MaxHeightScaler.cs.meta | 2 + Assets/Scripts/Utilities.meta | 3 - Assets/Scripts/Utility.meta | 3 - Assets/Scripts/Utils/QuickAccess.cs | 32 + Assets/Scripts/Utils/QuickAccess.cs.meta | 3 + .../{Utilities => Utils}/UnityExtensions.cs | 0 .../UnityExtensions.cs.meta | 0 Assets/Settings/DivingMinigameSettings.asset | 41 +- 107 files changed, 10490 insertions(+), 280 deletions(-) create mode 100644 Assets/Art/Sprites/Cards.meta create mode 100644 Assets/Art/Sprites/Cards/basic_background.png create mode 100644 Assets/Art/Sprites/Cards/basic_background.png.meta create mode 100644 Assets/Art/Sprites/Cards/basic_frame.png create mode 100644 Assets/Art/Sprites/Cards/basic_frame.png.meta create mode 100644 Assets/Art/Sprites/Cards/basic_shapes.png create mode 100644 Assets/Art/Sprites/Cards/basic_shapes.png.meta create mode 100644 Assets/Art/Sprites/Cards/name_plaque.png create mode 100644 Assets/Art/Sprites/Cards/name_plaque.png.meta create mode 100644 Assets/Art/Sprites/UI.meta create mode 100644 Assets/Art/Sprites/UI/CameraCrosshair.png create mode 100644 Assets/Art/Sprites/UI/CameraCrosshair.png.meta create mode 100644 Assets/Art/Sprites/UI/CameraGrid.png create mode 100644 Assets/Art/Sprites/UI/CameraGrid.png.meta create mode 100644 Assets/Art/Sprites/UI/DashedCircle.png create mode 100644 Assets/Art/Sprites/UI/DashedCircle.png.meta create mode 100644 Assets/Data/Cards.meta create mode 100644 Assets/Data/Cards/CardVisualConfig.asset create mode 100644 Assets/Data/Cards/CardVisualConfig.asset.meta create mode 100644 Assets/Data/Cards/Card_New Card 1.asset create mode 100644 Assets/Data/Cards/Card_New Card 1.asset.meta create mode 100644 Assets/Data/Cards/Card_New Card.asset create mode 100644 Assets/Data/Cards/Card_New Card.asset.meta create mode 100644 Assets/Data/Cards/Card_Test example card (Copy) 1.asset create mode 100644 Assets/Data/Cards/Card_Test example card (Copy) 1.asset.meta create mode 100644 Assets/Data/Cards/Card_Test example card (Copy).asset create mode 100644 Assets/Data/Cards/Card_Test example card (Copy).asset.meta create mode 100644 Assets/Data/Cards/Card_Test example card 2 (Copy) 1.asset create mode 100644 Assets/Data/Cards/Card_Test example card 2 (Copy) 1.asset.meta create mode 100644 Assets/Data/Cards/Card_Test example card 2 (Copy).asset create mode 100644 Assets/Data/Cards/Card_Test example card 2 (Copy).asset.meta create mode 100644 Assets/Data/Cards/Card_Test example card 3 (Copy).asset create mode 100644 Assets/Data/Cards/Card_Test example card 3 (Copy).asset.meta create mode 100644 Assets/Editor/CardSystem.meta create mode 100644 Assets/Editor/CardSystem/CardEditorWindow.cs create mode 100644 Assets/Editor/CardSystem/CardEditorWindow.cs.meta create mode 100644 Assets/Prefabs/UI/CameraCrosshair.prefab create mode 100644 Assets/Prefabs/UI/CameraCrosshair.prefab.meta create mode 100644 Assets/Prefabs/UI/Cards.meta create mode 100644 Assets/Prefabs/UI/Cards/CardUI.prefab create mode 100644 Assets/Prefabs/UI/Cards/CardUI.prefab.meta create mode 100644 Assets/Scenes/MiniGames/DivingForPictures_MICHAL.unity create mode 100644 Assets/Scenes/MiniGames/DivingForPictures_MICHAL.unity.meta rename Assets/Scripts/{Utility => Core}/SceneOrientationEnforcer.cs (100%) rename Assets/Scripts/{Utility => Core}/SceneOrientationEnforcer.cs.meta (100%) create mode 100644 Assets/Scripts/Data/CardSystem.meta create mode 100644 Assets/Scripts/Data/CardSystem/CardData.cs create mode 100644 Assets/Scripts/Data/CardSystem/CardData.cs.meta create mode 100644 Assets/Scripts/Data/CardSystem/CardDefinition.cs create mode 100644 Assets/Scripts/Data/CardSystem/CardDefinition.cs.meta create mode 100644 Assets/Scripts/Data/CardSystem/CardSystemManager.cs create mode 100644 Assets/Scripts/Data/CardSystem/CardSystemManager.cs.meta create mode 100644 Assets/Scripts/Data/CardSystem/CardVisualConfig.cs create mode 100644 Assets/Scripts/Data/CardSystem/CardVisualConfig.cs.meta create mode 100644 Assets/Scripts/Minigames/DivingForPictures/PictureCamera.meta create mode 100644 Assets/Scripts/Minigames/DivingForPictures/PictureCamera/CameraViewfinderManager.cs create mode 100644 Assets/Scripts/Minigames/DivingForPictures/PictureCamera/CameraViewfinderManager.cs.meta create mode 100644 Assets/Scripts/Minigames/DivingForPictures/PictureCamera/Viewfinder.cs create mode 100644 Assets/Scripts/Minigames/DivingForPictures/PictureCamera/Viewfinder.cs.meta create mode 100644 Assets/Scripts/Minigames/DivingForPictures/Utilities.meta create mode 100644 Assets/Scripts/Minigames/DivingForPictures/Utilities/BottlePauser.cs create mode 100644 Assets/Scripts/Minigames/DivingForPictures/Utilities/BottlePauser.cs.meta create mode 100644 Assets/Scripts/Minigames/DivingForPictures/Utilities/RockPauser.cs create mode 100644 Assets/Scripts/Minigames/DivingForPictures/Utilities/RockPauser.cs.meta create mode 100644 Assets/Scripts/UI/CardSystem.meta create mode 100644 Assets/Scripts/UI/CardSystem/AlbumViewPage.cs create mode 100644 Assets/Scripts/UI/CardSystem/AlbumViewPage.cs.meta create mode 100644 Assets/Scripts/UI/CardSystem/BoosterOpeningPage.cs create mode 100644 Assets/Scripts/UI/CardSystem/BoosterOpeningPage.cs.meta create mode 100644 Assets/Scripts/UI/CardSystem/CardAlbumUI.cs create mode 100644 Assets/Scripts/UI/CardSystem/CardAlbumUI.cs.meta create mode 100644 Assets/Scripts/UI/CardSystem/CardMenuPage.cs create mode 100644 Assets/Scripts/UI/CardSystem/CardMenuPage.cs.meta create mode 100644 Assets/Scripts/UI/CardSystem/CardUIElement.cs create mode 100644 Assets/Scripts/UI/CardSystem/CardUIElement.cs.meta create mode 100644 Assets/Scripts/UI/CardSystem/UIPage.cs create mode 100644 Assets/Scripts/UI/CardSystem/UIPage.cs.meta create mode 100644 Assets/Scripts/UI/CardSystem/UIPageController.cs create mode 100644 Assets/Scripts/UI/CardSystem/UIPageController.cs.meta create mode 100644 Assets/Scripts/UI/Utils.meta create mode 100644 Assets/Scripts/UI/Utils/MaxHeightScaler.cs create mode 100644 Assets/Scripts/UI/Utils/MaxHeightScaler.cs.meta delete mode 100644 Assets/Scripts/Utilities.meta delete mode 100644 Assets/Scripts/Utility.meta create mode 100644 Assets/Scripts/Utils/QuickAccess.cs create mode 100644 Assets/Scripts/Utils/QuickAccess.cs.meta rename Assets/Scripts/{Utilities => Utils}/UnityExtensions.cs (100%) rename Assets/Scripts/{Utilities => Utils}/UnityExtensions.cs.meta (100%) diff --git a/Assets/Art/Sprites/Cards.meta b/Assets/Art/Sprites/Cards.meta new file mode 100644 index 00000000..1e5ca1c1 --- /dev/null +++ b/Assets/Art/Sprites/Cards.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 2d6e815822cccaf40b10ce3951beed36 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Art/Sprites/Cards/basic_background.png b/Assets/Art/Sprites/Cards/basic_background.png new file mode 100644 index 0000000000000000000000000000000000000000..37f1dffad10695b014841b5cd36e6789cc744fd4 GIT binary patch literal 4870 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 literal 0 HcmV?d00001 diff --git a/Assets/Art/Sprites/Cards/basic_background.png.meta b/Assets/Art/Sprites/Cards/basic_background.png.meta new file mode 100644 index 00000000..f3fda3d6 --- /dev/null +++ b/Assets/Art/Sprites/Cards/basic_background.png.meta @@ -0,0 +1,195 @@ +fileFormatVersion: 2 +guid: 6dd6a8569dd5cef408d97594bb5e9d49 +TextureImporter: + internalIDToNameTable: + - first: + 213: -3713692513169282065 + second: basic_background_0 + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 2 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: iOS + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: WebGL + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: WindowsStoreApps + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: + - serializedVersion: 2 + name: basic_background_0 + rect: + serializedVersion: 2 + x: 0 + y: 0 + width: 662 + height: 876 + alignment: 0 + pivot: {x: 0.5, y: 0.5} + border: {x: 120, y: 120, z: 120, w: 120} + customData: + outline: [] + physicsShape: [] + tessellationDetail: -1 + bones: [] + spriteID: feb6483d550567cc0800000000000000 + internalID: -3713692513169282065 + vertices: [] + indices: + edges: [] + weights: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: 11dbb82cfbe469a478659c7ea91b560e + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: + basic_background_0: -3713692513169282065 + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Art/Sprites/Cards/basic_frame.png b/Assets/Art/Sprites/Cards/basic_frame.png new file mode 100644 index 0000000000000000000000000000000000000000..ebe3d72949c252467bd49dc48ccf6dc8775cd56b GIT binary patch literal 13268 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 W3dHF{?_L1-qpGB-SakjNqyGiI%6&lq literal 0 HcmV?d00001 diff --git a/Assets/Art/Sprites/Cards/basic_frame.png.meta b/Assets/Art/Sprites/Cards/basic_frame.png.meta new file mode 100644 index 00000000..a286d141 --- /dev/null +++ b/Assets/Art/Sprites/Cards/basic_frame.png.meta @@ -0,0 +1,195 @@ +fileFormatVersion: 2 +guid: bd7528147fbfb4e40b0c06c68e99e217 +TextureImporter: + internalIDToNameTable: + - first: + 213: 855352274089539417 + second: basic_frame_0 + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 2 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: iOS + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: WebGL + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: WindowsStoreApps + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: + - serializedVersion: 2 + name: basic_frame_0 + rect: + serializedVersion: 2 + x: 0 + y: 0 + width: 662 + height: 876 + alignment: 0 + pivot: {x: 0.5, y: 0.5} + border: {x: 111, y: 143, z: 113, w: 131} + customData: + outline: [] + physicsShape: [] + tessellationDetail: -1 + bones: [] + spriteID: 957fde68c52dedb00800000000000000 + internalID: 855352274089539417 + vertices: [] + indices: + edges: [] + weights: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: 39ae7a6c6a40db644a51724672b938e1 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: + basic_frame_0: 855352274089539417 + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Art/Sprites/Cards/basic_shapes.png b/Assets/Art/Sprites/Cards/basic_shapes.png new file mode 100644 index 0000000000000000000000000000000000000000..f8b9175c39639d35e00b96de52882fa5fceeeba1 GIT binary patch literal 11822 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 z z&2Kb^Q4(=@R~0#_y9pQ;irwB%Mx?PB<;0Lyk~7RT-82D{(4dzSiM%cKw|2%ypljVZ zl&={{i-POg6lmBa=H-%vDa+2mz@v~>eYp aZ>aW-7q)S8DTDcSh?1N-rV4Eu{Qm&p9c(!O literal 0 HcmV?d00001 diff --git a/Assets/Art/Sprites/Cards/name_plaque.png.meta b/Assets/Art/Sprites/Cards/name_plaque.png.meta new file mode 100644 index 00000000..49198822 --- /dev/null +++ b/Assets/Art/Sprites/Cards/name_plaque.png.meta @@ -0,0 +1,195 @@ +fileFormatVersion: 2 +guid: bf14f631f4b34e74d83c20a1dd671422 +TextureImporter: + internalIDToNameTable: + - first: + 213: -3310850967021205615 + second: name_plaque_0 + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 2 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: iOS + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: WebGL + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: WindowsStoreApps + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: + - serializedVersion: 2 + name: name_plaque_0 + rect: + serializedVersion: 2 + x: 0 + y: 0 + width: 521 + height: 161 + alignment: 0 + pivot: {x: 0, y: 0} + border: {x: 0, y: 0, z: 0, w: 0} + customData: + outline: [] + physicsShape: [] + tessellationDetail: -1 + bones: [] + spriteID: 197417e469e7d02d0800000000000000 + internalID: -3310850967021205615 + vertices: [] + indices: + edges: [] + weights: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: + name_plaque_0: -3310850967021205615 + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Art/Sprites/UI.meta b/Assets/Art/Sprites/UI.meta new file mode 100644 index 00000000..06d39237 --- /dev/null +++ b/Assets/Art/Sprites/UI.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 162c13cb471747a40b1fc47e6c0ae164 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Art/Sprites/UI/CameraCrosshair.png b/Assets/Art/Sprites/UI/CameraCrosshair.png new file mode 100644 index 0000000000000000000000000000000000000000..65004ec723263847c5ad5ed04753926368d10666 GIT binary patch literal 1416 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K5893O0R7}x|G$5xX)7d$|)7e>}peR2rGbfdS zL1SX=L|c!;4l+mMgO^4r@s$Y_o(Nz)sHgQPVpRkS_tLc&RyCho8h>GlqGw^DNDMb$ zolcl+%$(BF0#TNO`~u|%JukX?{fUpt5PW>F(Ei@t>N|UxTijYR!~8`ql-%|?njB=d zU5hnN(8b=x$6?CMRFzBJk`;aHtAG5c5`P$Z@A*F&=B#^34gN}fMu)d_ns=m|=Qe+~ zE9{t>GWExtic3qlh3t!BGe1f{Uv!%3JkQLTS8NJ9BDBgjUOKuaCF_Xsk;Kr;n(-&L zMLgYeG;;Noh~M-6v?j&Hdlt`qrtv7kiOJI=Ai!Bt^hU>pRg;qxU4I+$|L=J1KgnA$ zT(U=odxcZ;n_mb2KPcZGmRPlFs>-p3d*a7`N-#6+cG&#R;{Nfz%QlRE&L5b1?_;?1 zfjjCizxIjQF|loL?0((1>jNJqE6(1e{WFuRmFYvB+x;obZF!9kqE>JJX6Gm0 zz*D-lhFM02>9OmnxbGF^@#Xpd=VgBX&OFJ#XtS-R_BUX(uqAoByD&&IC^H0}5NR<7 zif|TqL>4nJ=qZCRW5rVYGN2%PiKnkC`%5lP9s>n+(TI6KA;}Wgh!W@g+}zZ>5(ej@ z)Wnk16ovB4k_-iRPv3y>Mm}){2Id4$7srr_TW@b2^p$oLX?Xbk1gGYg2_BjXsyb7T zu2ayx!McR)4x^?5dzFIF@*jnULPDF$oz2>3{Jx1^ z-tog?^PBRtdo!*{tm{e8xURj{k>SOc|8GqnvO2CWX9RJ9NtA^_fWd)G2D$q1SW8&f#Q!V~G~GG9U+|-dpuJMk|(pH~KRsBos5=kPFVdQ&MBb@05a>VLjV8( literal 0 HcmV?d00001 diff --git a/Assets/Art/Sprites/UI/CameraCrosshair.png.meta b/Assets/Art/Sprites/UI/CameraCrosshair.png.meta new file mode 100644 index 00000000..0692d66c --- /dev/null +++ b/Assets/Art/Sprites/UI/CameraCrosshair.png.meta @@ -0,0 +1,195 @@ +fileFormatVersion: 2 +guid: c9d2fdec6416f7840a7eb9f6542b3c01 +TextureImporter: + internalIDToNameTable: + - first: + 213: -4229316332011032055 + second: CameraCrosshair_0 + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 2 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: iOS + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: WebGL + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: WindowsStoreApps + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: + - serializedVersion: 2 + name: CameraCrosshair_0 + rect: + serializedVersion: 2 + x: 6 + y: 6 + width: 245 + height: 245 + alignment: 0 + pivot: {x: 0, y: 0} + border: {x: 0, y: 0, z: 0, w: 0} + customData: + outline: [] + physicsShape: [] + tessellationDetail: -1 + bones: [] + spriteID: 90279b334337e45c0800000000000000 + internalID: -4229316332011032055 + vertices: [] + indices: + edges: [] + weights: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: + CameraCrosshair_0: -4229316332011032055 + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Art/Sprites/UI/CameraGrid.png b/Assets/Art/Sprites/UI/CameraGrid.png new file mode 100644 index 0000000000000000000000000000000000000000..5db239dc81040954a65910340be716dde8aa1b28 GIT binary patch literal 10603 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 literal 0 HcmV?d00001 diff --git a/Assets/Art/Sprites/UI/CameraGrid.png.meta b/Assets/Art/Sprites/UI/CameraGrid.png.meta new file mode 100644 index 00000000..10a61850 --- /dev/null +++ b/Assets/Art/Sprites/UI/CameraGrid.png.meta @@ -0,0 +1,207 @@ +fileFormatVersion: 2 +guid: 0db492dd1eea9514db54af61f1a4d79e +TextureImporter: + internalIDToNameTable: + - first: + 213: -2291430160556362638 + second: CameraGrid_0 + - first: + 213: -7433212772583906915 + second: CameraGrid_1 + - first: + 213: -6331681754600744794 + second: CameraGrid_2 + - first: + 213: 9186846772083346892 + second: CameraGrid_3 + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 2 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: iOS + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: WebGL + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: WindowsStoreApps + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: + - serializedVersion: 2 + name: CameraGrid_0 + rect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1080 + height: 1080 + alignment: 0 + pivot: {x: 0.5, y: 0.5} + border: {x: 319, y: 319, z: 321, w: 321} + customData: + outline: [] + physicsShape: [] + tessellationDetail: -1 + bones: [] + spriteID: 274fb64d8643330e0800000000000000 + internalID: -2291430160556362638 + vertices: [] + indices: + edges: [] + weights: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: 621374f63d453a746b2a05f897083f21 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: + CameraGrid_0: -2291430160556362638 + CameraGrid_1: -7433212772583906915 + CameraGrid_2: -6331681754600744794 + CameraGrid_3: 9186846772083346892 + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Art/Sprites/UI/DashedCircle.png b/Assets/Art/Sprites/UI/DashedCircle.png new file mode 100644 index 0000000000000000000000000000000000000000..92f0f12d66e1b778e3f283da349a9780da48a590 GIT binary patch literal 300549 zcmeFad010f_BM*M)eaP8mnaBWP?o=LWfDRJ1WHAyY6ToZ!W8Ct3L3&3fzzp3Vb?iHP#F);StvwQm< zgFQz227B}kOmz)R%=Va=85(c@a%qF^PWk$q9k;gm(i!;9LOU=rGQvz>KRP;EFWN|t za4JCG(A3ma(#D=Wy5J67Vr+P%SB!2rQAgT>wI9*vR8T}@5FvcKq(v`p0x8l$8w_<} z4q*{?cCv=UiC>TcnCZuOMd%yq8R&I;_ahQWr+oat z?K<*@4@H5Vzs%u(YL!vR}^wA?X01WoAwAAxWD0+1f%I{6x<;$k)uq#?ac-+8AZDAB8eB zJY>D!;Gp$>Lu(rYw6&?henUg)vpWloL$s;i9_jNAr-FdTdWHT!9)sDzQ+{5Ngi{y-Ayn$7N2Mri-(#d_ zwEchVynKSfCAj=;zT1UI{H(nq{VcR4POEEx(%oZ(F*GqVFfubX++|>BW?-;zs~y2N z$Uk*<`f}p`@G+p1ucTTwZR@V%4Y9DU^n9hyX^r+v$5G@VrpV& zZDg$dpy)~UpAPZf`|a~*e|R4gx|?8uR?=B`(Rm^dHG0IsD(Ds3yfLP zspN-?4cO1ef3KmpmyxcKkMUkzlfA}%y55FfXkFAEG}_qLV2_tE%0&8nbf6z-@;@ym zF@wxv3*8V2{*lpMr~LK@0H=`T2w+v#R%|?EXw$W z1DsBQ7(($R|6OTi>b9S)_hVwR-uD|WYcN>fP*VKaG$7Tq{KC10wV%1X`4IKLelZ}1 zulZkpI{%Zp`wbe4|7!c{KWok~;!j$;c-nmNwtigSzijc}cn@z}{1;!Zh+g~`Nn5H{ zEdHB^OH)}4m?f($hKkaXgDncn(z0I^mL&#T6qY42UKAFkr4YF&E=$pVQCOCQ%c8I> z3717-SrRUb!m=b>7KLR=xGW0Gl5klRmL=h`I4n!TWl>y~gv+9^ED4uIVObI`i^8%b zTo#38Nw_Qu%aU+e6qY67vN$YD!evohmW0cquq+9eMPXSIE{nplBwQASWl6X!3d@pk zSrnH4?+Ta1D4vsK%AUWo`8i&H{Yhc^NB->8hryqnAZb|nXQxp%{n>GlrA`zOm%Utq zO9qAf#gcc)v5>!7T8wfmu5q7@kw3NMyuMF9-i%OzToL80(s ziB=TAkiJ}^6)6&m|6igNMKq+ZmuN+bgyR2~Xhji?FRzzqWf4%6mS|-$RF-IEF;tdl zWf4@CXk`&lmS|-$P?VNvWieQmXk`&pmS|-WP?l(AF;JFhWl>a?Xk`&tmS|-WP?l(A zF;JFhWl>a?Xk`&tmS|-WQ2t-1m9OI|nzv@McTSPV>wk*65^9n;`ax~u6Vu0A+urvJ zc<=9A{r6RqDBopYd2WsR+Wfe-?M&0-Rja=8RKKY59c9b!-+qtX&cHdD|Euio?x5%$ zt?%Erv{^i;d0Z1Sv~AG0Y@GgiLS#{>-P7uYhQ@G??PIGFKE&q~wT8t*79rt% z$M6_@31e2LsSDCqvwUyv_wb)MWu zh!h>EVoh-sgh$;n#Q>f3ri3jFBpuW-ao0JL=%tfae=4J|lX(M2Q5OD#U|A@};_FjV zE7so0ea~Me@S%x&%Q-^r;lxNYJsu^dmF!Td7VHr}bcMEhGS$ATi&qje`wyMBi3xFS z=yjRh@g6`dU$nRG!s<4<$dI&UyFomkvIwgRGhB@63h5i|8%| zO?`zivvGYr)1s4Rs)X0tqr<+?WkE&R+PnHGww?Wnq0G8!?%Rx6*7M-UqVBDOqum(- zb0$Y@>p)~bB5DPpB9-O+mc027p+jWeP;nVD*XU|H6q0hOIle7|&0@s7^5hxszaH3XXB7+*+rIC*u%a#Fa8j1gt%PZNft`c zvYt4`#$tB5^SNw&JaOhiwrs_s3K#)x3tfE9@wx=r!Eu??hF3hi)gPbF<=? zO|Nn<&dH7cNpg$;uWQhc$Wzhv@Mj+vaT|Z#mqX1d%7JpSQ`#M>EQW%gihcr4 zsuPl8YZ3`QJXm^l+bAl6;ZJ(+KN(Ivns|i_hj4x*9U{#{?(1G#R%W_8zCnc1=7okg zK?lKS%9cTpx;iDgZbY?T-~<^80$h^o^i$f8OnMij)-qTLp=7J|(k_&gx_cEnaWYXw zy?Q?zNBW(7((PdvV_)mUN0e=44vVO7Pav=zs#7;n>Uwhd)i>h$jMG0psr1p2%)xg# zn8Qvgu%Ng98pvYw98EY*whPT5%^6tVS1Q>hzr=hiZb%S@3+3faD z(bE%1kkgPIv6w=U!yL)>s*50j)a*PMQV8bvLZ)@=9 zf9zk^^8TMI``h6hL>ScRl2!i7njfk2Rvf|DSZ8(IVla4^YyPD9OxT;?W{Ibq1=#d#F?ZQeH;%xk1&3acPwvB7I9harK9n6M-$&+- zbnMofCFsdoZ`iy;0i_bu`%r6qG{ck^cFtyK@M8H;H7CZWf)dBhPBwUFRV2LZVcw#8Lt? z)<8|_>?((HwHPZymX>S)N}2yws4z5eO3Nlh*&zWGoksB#!m+tQHtaGvlUJMXe6F|s zwI_+xtPw%^`!a!FWkD|*5bCD&{$*zF8X57wrhipU*l?+OwwFTW(&$vn?&;{pqIWTO z&9D~FF4pLCZX%~`K8fxCLh&7GzgN0p8hnhp^qO9!xXevDQ?MiNYx76$ByXQ>?WiNS zzJc6{Lx&1QZf>0y>*wBY8={zh9pMpPt9BXhIce$+7A>Imyp!IWD=QE6lT}98)yz63 zOC`$VVXuRI8fEYz)5?WhAZ(u`d@JozDXB-%^|Q2U-Hm2llgsou97F@Yn*4ZF`+5D^ z3P#n6@p&o^ex_Xe2GLu<{9Cs%Hny@J{uX7dJ(Sqy6W`Y}rXyNIjW!XJKc*n# zKPXt#zm>Zr z=KHiaWxIgf`eNW%VBn}jBSUL<7i7aHOrOd5z9E0RLWdtNakKnwM`raI!RLCq+H_$) zTyIlIZqFF;FJ-Iz%flaV?u#*w`#I~y&ZS2h*FQ$iC_v=&jvi#e(HPg$^!t`tC zR|!Q0Wk?+-hng8W-avmbk|Ce<1kWWv89Px}wIy!~h6 z6K^MXTWF1<4oTXt&{4O26c&xT|NfHGEDZ+00LbfR@+5Qw$RXf&x8 zTBnh0HP^r)E-cx|*u+Mk9*rW+97VCTdZ=ISGogoS)oxC?cD3ljeUK>m=&bj{3=i&) zB(7v=zWf)FzNXyF_|xecAoJLJc4VH2ZtYT=tM`hva0CleL4>VVU{24n+MCRJF!iIL8lVckJFB<&vHf65U_Q z5vda5xg&b7CQyl5yqv+PXOZl61yzjfM`1u$4XW02rYZ=o+XS>4@_6J>g;tY4DKx{6 zWMDN?+LH3ausfgL$QF$gvJ}>pr%8Q{s%(PYfoY$RqqAXfpZd$^68nmgS2dgaIeOGV z6A8gac<6zYk9x4<&4p2XK$JrZODUlIB5ORM^$nUC#_ij@f9BAZ#4ezEgHRvqt5jmx zG0ZRmG$A;wc296Azxk5V=lXYIRlBn4y6W+`y?5goYG~Q$sL$#0DvPg~ zs4?5udb6v)a<5*vs~aF+kKmOzQ*k@LU+T zHik+Q7@zr|YI2{aTBVjSWR9=D4R8Nkk0OAHkSYAh$mO<4pHY| zfZqyB%Wl2R&!$JlK38Ab@>%;+;=K_1cxN0fTvl2!;thRHH z6IdT17gsQ9L_g_p#Gj4ZO_onvg`68uJt@Gob;#9N!#5vV<+`JxryD=8rxmz5i+NW? z6W{WPsQWnclrt$zC$#1_tPAhxhfGp&S5ucqII1C$S;cy>wnPg`u?IPxr8vX1V!zg= z5<`2GxL7MY{<5yOt&STjgm>tA>t&mygmf0G>jH@9c|r8pR<1s#ot9oeo$YLCr(Wpt z!pUIt{7Nxd4!Fw(wC_zPth7<4r)z-GnD%+FXh6~C7UvY(mv0+#h|i0wS3%)hF0srW zCcZ^=rIxFCxVMxVxmlW7tWg@}4fn4zfC|(oYxK)p)pu@<+ohMu;h?HCLLT<#(sI%{ z&wx4*qncC)UlHX_*w?b>bAz14K3u~01>Y8BC%=6OgE;Ludld%AG%;(7CrmxC1--q? z1h_cTInj)}hCjuN2~wErq7TNloh>ijwF0f`y|k7og>VD2zQ6FM{I~_k2{RkakizrLzU1c+!kFZ14ET4T5B{;5ZARNaYW6<^97`0Lr19sNHvZY&|aFBad3 zb0Gb!<4p!xpVs~mlQfWxbxkvU=T=(|-RbDB)=K+U zYI&@Tlhv9UPSunM55q&D4|^Hcqc!|b1@S9ETz^(%bA9r4Y(mPY`aS-rn#$B@eqW9U zapsN9@1m=c%=ra$>pkO$`HB*Y>_TywO`R|=*n>0?>E>2nZuT^|Thx#-@@i^@dbQEm z=vABV6M6>RxEZk*@X1%Uv8JqT9Z=r9OR?2VLPk8a#w1)G+&yn8cuvD9(_{Ff1C|2q zmf&cH@(H~wSKD-l6U*Z&RXiw_D*lw4u)*wPa^P%pN8NK^+KMV#-Bo3!q_8&_{zGGe zuPsYSZ##@ zDQN6%p=w>5Y%0-$ad~|0KBqwOo-^C1 zyq_D$JzNGoBz6T)-;ol{+o9ySY45()D};#L0h-MKs6Ex{hg&@jehr*s?9xaIX(%B+ zhI#Vib-$>?BZ4PUkwJW3(B_S3`yW09>I}|xM~Y4d@gVn}$2(-+n$)#P9uJe=5UZKB z!Z#q3#m+)ij?t}kYm`c6vI}#vImvFlYftKHk26?xY}}ebRboU2eyrxx<_KzB1aF7Q zX;NGpZXP|#zhz@^YP6-+Aos93 z5JgG+kI#*j+4snLZ}}>Mv+%baCr^roBiWC(73-O49d3X7lTJ75{a_B`@D!%XzAU0p zh2YV0mS!`kMb#X5yh=7N&mKj$|7hwi@&wX%zz?nf`MJ{WY#;baN7j=^wABNuO}h%3 z({jBw8rvT&ySfb|7SzVkYhAU~apT78+Ks(=f-1Er%I%ZS&t0Gvpik|Wd2)A~qPDC`r0o~oGz!oUh24!%3)0;CERQ1S4S*sf(tPSIAmoFjUKhy4sXokmXw zTpN~#e#Hw(9TO4vGBC=FNuO}ka^4uhmegmw&Q@*b2WFKph(zH#0sfed+$w|6>7asi zzt-^*;UO5E;nu0i1pfUR@*OV zRy!$J0Y4fodC&njkA6t(dlClM*Q7ZuS9KiE^?x~I^FmYr7K>Ik2h`|gJ(rX#7|#h? z3vB`#;g%1qJnDX?>U9isdP>!GL!}kY!r5YQtv=mCGsDY4DT&7Mg}xi>Fm+!>P3k8=Y8Mory_aq48ZkXE;YOAo&u|LcyZ8^Uhmb;^zc?$&d{6v~)sg3a88ArNJRtcVq)tRoje&~j% z)Ean4TU9`T>A+W)r%b$gT@`9kY&tWanKx1KL(vU1vN!X7FYpjd%>(#dH*tj+IJt; zsIm20My)|^sH(2=Fiq|9lx;!mZQPo^WlG&y8`0Wbg6x;vE>!&wHN|m(x32Zx9(2a< z0Ryo@r)MGmdcI}jt=%C=fIzMlMY~=;s8jh=rdfLW0#3`(s+pVlOY^F z^1Pt7wD*L@P?823x&Ua#B+5(zJ4eY?YMS^mo2?Cb^Q{^&gJt z48P8)0-FM0^^H4Bb|Aktc9}UiUhwZ$k#?#yxJMxgtIXJ?Rywr{%A}f8l|kl<&V4je z$5P3zrDO~G{*i(aV0J=yqw%}=ZAI=GoJa4b-E{sCKLyb_@wOSNJwr*!z z*WkAi6eoG%)(=QYi`;4Eq)MuRccQrGMsSqD_+&37M-k_~3b$xgFpldmZ4Gj0E;l2XYIZc%tv{8uI| zrx9F!k=Zd(iAv<03x6&+%TrzsG1;I1FsGcY5(4r>%-oOsn@AhdIr+Ii4Ku#Cy}k6? zeU28L7kl)f2ej3_9yxkegKI(Y=X8*Jj^9C0Lw6s1Hl6X?oATNT{+xFrTA@vot%~0~ zKaD-h9S7yEwUul(GwwV&oT>-8Uw>JHzT^WB=-M`bHRRE<4t@Z)yKJZ!LJvfF=W8re z^4!{gEy}Rc@mpyCxQ!&xFoqcgbxR`Qal9x7xA~E<^59WISP+Cb%|KQ#p zRgjjAj7?l2>dWh=j0!mMscfMqwT|3J{$*1xVj>5DT5qEE0s3s^g~2pQesls(rEW@Y zf9D@rtTJW3uXSDWkCHs}NK-u2^iA*@Kz_r2GN z{lJw^@~6NEeSnl~h1-Ig+?rXd#tWkyca8$YlyU7QmQ_TvV;W%(ds8v`IAx3#J+U*m zSoE@SG-SuUC}8w|icj)mM$Wm62WD+~pNA?7sfW9_7f{E+nv!X^Bs)b8HLAJMi*D70 zZJ|_j9v5wVCeA#dFI?1rbO1A81$3O*@d5lm_38H5a@c8h7kmr00Eu%uRSR{1YpdpE zRVwM#QtZW_O}>(Ze=+Uy+5)c4k98oCE2@|g8JGNf{yq67kl)()Yn{w!o*fDS)AQvS zo39BT{5DYIQwe2Ps)P=u3`Iws(D}N$Wtm_kIY!8+66cO=f=f}8lQy?Sws2~}D61;2 zMkUzF6!>8hH{{L)VNT6sUB6Ll8`fcSCHv%_(r89{v?C5(pU8?Z3vXhaNV|7g!7;lZ zCY+Upl!lMJ9l<3cJXonsP^!t9n0S|zaiiK&mEySvHLB^)N|6i65rZ{}ZMggXSnfT*G6~mmBUn5$>!5e zwVV7+gpc9^Q098H4?EDYwtT2#ZKaiyMvmsBwNB?oC8dZ;tc!@52SlWpG!k$t3SHmE zl9bP*br5k5(u-wx4xHfjH?U%TtP0%~>vek-&bR|}7Lui(IF!_eaWv6TM4$UGS;oKB2htmXi&>H(4jF*pt35|9<2}&`kzZT0B zMvaW#nKG^)WaX(ug011gSzY*12RRCDAJy1scAUIxr%<-&JU1yQ>TY+ip-bjJK~8`L zX9pkZc%Kzk+d6h0sYEh~`g?BSs9GimrglQ3YA2^^q4@k6XZ|TrwHhJr2CFt=b%Bd0 z?#jjQBsiQ%cn*9lXpL!cnB6@OIp3-a8iT6ELq(}%Z_f9(Vbf8~{d zWX4&&(5(0GH9*2U{}28asO9YSVWNG<$$4>+3I*ihBT?=0a*0xaUx3cG=vcsF5-*6S zUV_NUN*V#983_d|w<6vMsyehx0XCP?9ADW>A}` z1XMk5(7d%G`AQ*+0rnzd*f)DmaIc>?GRKl@Cqi1MMR$Qpk#?d~mm^OI8#v_*W|>Op z97bn-bSx=|H1S(}SU?wUypWe0FHsUE$z4ENhFcE^P-l3v)LqnQR6W@17$DH~`iJpV zXK+*kXQj6z{F%R)IUbL{wYL5Y&VvZ#R)Q7_|aH^u^n~Y zAe~N<#;#qvh!SsJxJrt{i!2A$R?ZzK*^xXmz{0F}xY3bPD>R>v8x57E43#MMZDujE z21t^(i2@tEAs4 zU3+{LwpD*NmFkFgTmv;virg~qJxWee12+_>;qqr@B1Lp0l`4YoBzLV0hX&ED@lbTR zg~R)(I$<~|ly}JFv@)(Mn=`edqu-5uTeu4b(G~837?`2LoZcirnqRJK8CugaT=!D+ ziYB-m$UHxmKzh)~ zsNuO6)jMWq#9y`>J`49H-Xllha1N6^#0cafWv~OpaP$bao>0!MvXl3&uy5BO1eTrv zj^AeEJ4Qtselwro;D@HSC6edYi__or?aDrYtv9kE&any&YBr|T_sr`ZFHi|>tcO2D z>>nY6ztCnASom6F%whPXo zjM&K9i|#^c2hTfLOVFLT#Ef6`F=>qSG4<~R=2U?rV3N?`lz_1wgjbW+y^* z`$}Aevj2YC9N?k@qk(iLU>z6_h_Z?9)=*f0Wo3}?j?I>_2XHO5%CQR@Kk9mkbjptp z8U$8J>HxdUCm9<~&0Rt~M^+MXnDM}s_Xz~+0YdMvM*C}w&R}Ao#K5V>uV%-BY)2}J zLLdPy7s@HjDNgKP%cQV`_9FthT4yIIEKB{UgZ$DU%cmDZ@m*_gm9pLkKjcMWb{UOJ zSQs3eK%NCrEj{p^d-wNTg;6j~LSb-xK^37KEXdXmb(zoBn9ni(297nQbFRPyTq-&- zH-RxxGabioh#i!9l4rBRCR_|_9f)UI49gc6@p!A`@!DQ-cs3_sL2iu>{}RN@rjHlW zU5wBeQ2$57ybay&?jU{YANFMqh!K49rpIBo4?Uf0L(q^UD~VUnO=Fnk@odpC`cgMe zvTIiUMixkZ3+(KJQc?H0(HOKn(X+my+q2zKfSIG38BR*JtxMdo)Pj8HZXEsu-a=#O zS&YT&DTD>zBMrWMgwRQeEws072s1sp8%D<5a|;t|;|k+Ic}L~cTrj`k$gIq&p?^`} zAyN>(i%O|t27#=9FCaB;G|q~yS(H<#2`a7*Jy=_lV(HkookzioJEgpT12NC$9@=s>W=}gjhFl_@A=C!NFgP8aT&3G z#qH~9hEstis8v7BY*H_svV{&#(j*UL-fu6M5l4~<;JD2gH4|tMfpH!$t?o&a#q+gE zC$xfBcA(2L^Jm^5cWfSm?tcDIe}YVuA93?^RS3vizAM$oG(i@V^!sM9)gU7&0Ogd& z#;JA^qt}%_fLR^8>p*hPu2-2!#6kN7W9=XI>VH4%PI4rLRQT`?wcWo1uK@`ca?_?x zRB!WkPCdDu`?5w};oR$?AkfZVfV41LS@9}uy-$GVYXUR$s=1(kZ|VXyjWf^El~2;0%HM!ZkQ3c(@9SsYn7EB96%yM zH^*I}P03e^b!$^A`73xK`2HA;unCu5a&lL2qT9g0#Tp93%(5A1<1ZKC*?)Y>b9!R9}C(vZ40wa1>dN@p0RmIRw2$Ml5qUj z3AA*;*BOXn|Wf8xdOYU(NPykE;GDs;HYRn|0dA1Pg2#s6Fi!r zBNvEzGM(_@lH$?NB)iw?NC+(1U)pi^Imj{UvA4LFOihM@B{Ld({ zJlK0vhCmKo=$;jTlH4GVi`Ny*>X?GBghv3EMc z3BSv7Aom={@Pvf-(fzz|EQ=8X{%A~$;%ms z?@i?zA8@sz=3Eck1s+I>t*aH5^sG87{Qxe5nplk7N; zkab^Gvz^Hr40=}luexvliJ%Kioxv!v`~i@{Om~NZ;?S3? zPf=Jw8q|6xQ7ahV?HrnBFse7vf&T!Rh1X5eByLmkH*%fXUcoo6{d7d910yOI#sM+X z9w{1(#meZp68i61_kekIAXL!m${a{DhjSY2kq$xbSp;3ltnJ40fZAwpV?8#RvgTKS z9j-Mn8E&WQ5cOnXHI%GChK%S#d;!EZ2H9iG&A8hjt78By=*}NN?rarEc)B~-(oF<5 zmTOdIJoXQv`>}Prrd0G4Ld`7PPU2_3&T4$H;*hYRd%rK(1O*HACx6WRx7? zVvfaPIfF8Lc^WbEg=sK2&hc8;%*EmuD1{y;GlW>3ZgKaQW&_eN9)*_sCN=8@ufVw` zmR3WAI{&GoB=5#-=|Ge0`~?bUC^8%Ck!wggGLatLvwowaNAaL5_j+tv*~zHx^M)B zC03LQSrv*$kcSB&VSl**>0{;+Gw0%IIYFpiF$>8ADpISxMv}!gd{cXCqE|h$PmJgv zA(jhW_zX1$&BDn7%QBEJ-G)$;S>6DUk3YGV8fTm_9n zyGHSENbaEtIf?EAC&;%{(uCpn=XWkM?+w7?xN$;VWu)U7Ugp3ru)YJ4Dzpbx@i(B{ zJAw4{RLZ>D2YIt$i{3viiRsX?}t2Wz^ber8s zNJm0}3Q>ZOCy@!Nt`8lsT8!|JI&5@Fulb03R<;(7f+3fxj8g7SxM)ZXRbnSUh1DZ2;u|p%pb9X-z49dwW$|BtcfoHjMxQ7gYC84cBV|$mGI=j(sQ=k8UJi;6{T9p z2Sq9&F{YT}B4Vf;=J^SV5M}6a+vH^3QLvTgKHx|$5|$z2$^8-of{=3)X{=H_!Nd% z6g=u0lLgMac6=@e$1Cn2>dC)fA#fz#=jmmu(=UF8q(R_#Xt7?lzaRmcSXYc`H@5%F zj4hn&DB#>qmYMX9oFp1LOA2~D@F&Rm!ga|J9j6CfFrSk@&r#?6_^)H*KGVDd_yotf zTqLh7VJNL2whrt!TtS*)9k|GPp2DXeMH#!_VwO(y4hKM~m@db(BM&%W-`+)3gXE+~ z%VyekpQmu7rY#VZH9Cm{}K`f%VV50HD{RMoR72DTm7 zq`oXh(x;RDPW7ECpKbUw#EPNEu&g00?^CC$* zPWA}J z{1#QA7B<(4=$jn)M;cbOt-32jR3glTM?s9=G#$vN6!D70)xs$Lah>|eQ;qZ0n&HSO zl>OJSKl5J#nQjEfs~ZX~sqH-Z`tuByKW4iB2WjJ>rt+9rax%)~)%z}Vo&|d#xSTxx zTRiLXCU~w?$Zlml{-LCdSq;vhrpL~&k-e^}_Cz0@*Wz99PH=4greI)_R;jB2iS7AS z>Wsh1$kg>Bp-}ow(qxFOPGTgUuMT@qEst{v4;#?6^D^igT`NZxI3*$(RYXdP{p16r z2_8qe-%6nHn*q(ts_)F~ABYLNLX0jHj{aIDCDMj#BWgPpfM+sqmENKp3D*|Q)|E6e7${D@)exB zJNbstjlT<|^#f&L6*K*g<}B7St44;R32hSk{M+&(o*+)~8@|C1-bKbxUv}x45{tg(Vwz zsDC`$(-7z_B6|%CQ0^VpKnNLH0Wf_yI5=n{XH^U5Uv^}A( zjTf9yr!P4L@#XrkSuwZhwoWVp`)&-!D!_;Fqi%s$YG^{t0@@Ag=8hJotpgy8%;hm} z3a$AyjXxXfX9ut*IZpgX4`sU8v$^j-*RnxDG?pS^kpXaGSnQ1Mt+RKWYeyLE3)3p` z1Bbe4gIE?@_y*~K?EvKVIdriLzkSqQ8t0T^z`Uen;bhZ=W1E7~nmTm0EWDib`Dgw( zM)?a!C2zQa=lU68S)r31U=gk1xFNdLknk$aR*{7M!Ih@?}Hv%ZOSiOj0 zP5Z!Y8~R6Q5RcH|$*@&(;T4RDnOI*AUfT9>G55cqR8PaQdoO-SC{YQg^cAb?7BDa% zJ(te>h+feks2t24=T8JpWsi;m<+v;Pck_|1Id=FtKHC|T6}Xi8xS;w9Sr4u9}07Qy=dEH4tTJ?(h5O7Z6aJH{t}w(OB??xPE2&S0@Yx;rK#F zKQ23q_&3SWlFB~N8$;TnFttV%ubL zSC(`&c%G2&*?E@LFoCOYg4aN)j;igTCnj6yqLW9A=8G22uqM%X+~iH?2i---LE1fL zYS|eLc`$OE(^@O*l^y49#EpY@P~8Oj%;Nz8Lpg47N-RrHlhAUlnbhh@;6DKx=wPx_ z+Xmp^S&0~Ona~{wN;*<%s=8bNv!}efrhkf$+GeO-GfrYy$oIjoo`pReHMYh?Z zU!8M9voN2`J0^C)lVeQTIhw3h^13W1G5`p~(jZ<|boQOH<6uhw%Rl?>V>Gp3)NOtz z*z<=qkTUuJFWSU@uh53!YUL=p0FUR+!IkF@Q|Bs$lZ1(riO0$03 zltj%O8SVUCj#?W-83VR)`hdhB43e(>@e)}BD?_zv`!fk3z|PMl3%t>7CnPC{iX#U} zCds>~R)vEG50g?z6qBQssg*^_tZ2T-MFh;M^3@_v$cr!3d#J|$<& zz3Qr%E*v;30VUoNegY(vng$LMOiCt(4j5R7_z1|(uOP$ym$DkuAPO9V2gR6!^4+lp z?02$rf(<>@6~cDF&}r?pe;nT{sRlXg=uJLC#>&DMoD+(|g0~1?tx=s>mBSDhf~tjp zss#wW=IeRWfiIbva()RIA%m#A%YV?v+#EAt-r7ZN-`P7ar5iYrw)|8mx}EjddHNV% zUu}*(($q2SLI0@=8w` zth>2lz}_Feq_+*OpUfriIXbDC5SXC~Sy9D5gL>kR{O6&r(&kET{+G0KZJ&kOao}A% zzE@m|G$Bn|eb2>8ilNtncUE3FOrFbovy+M%HQ)!j1yHUZ{RM$`? zbe}Hh4$Uc^vx*mJ5M1%yv2( z^p<^-`;5~6<-I5PJxk}ta&7OM-N}FPKIHTL=D&tsyck(MI^%=4&0DU@Go6k8V^$Q$ zRTX5F30$;9(Of=0`$RTY!-HIGM(|zmu-!>b7)DXJrI~M|UU;16*fBUDQmVYodSqBtqUI zXJK@v=7+eMr}I%((jX^UPF-|{1~t{ON~_=SzCLgWk6^VhtDC}?kGD&1RJwkd3tfTC zQ#U$)4{})#4R>qfOMJ6&8hFu#V0ieNb9JFvmDw#}1j&uh zy?JQ9HG}wBOw|^R(u<+TxfNpmE#x}VjX+>mwE6s1sj(wiw2aJ5^?~^Zz?X*Sq#@)W zoNRMp_wR=@&m--{mc7QzQ#PcThJ_4siyw((&7a0LKEN{=&D0L+185Ue22EbrENe1* zi|mlHr%x!J#psQXXi8w_1zEo-&Odh5hpKOqT*FXLTX2vE-2P7u9oeg+cYiwumfSdF z@C3Q&-Mv!Hzpnc-sFKGt4Ou?e@UJN-|K4R5)ox8y=x;Sh8aN1b1@eK~v8q_y#`p8F zIq8uvJ2>;1%HhXI@GQ~;e+Q?5P@q-ZR;0HjO)6pvG58Jh+wFc&Kul#wip%RBhjkO-JDD8Y+P?H*j@D?R;~dMKM3}aWIS8 zO0DoAUb}i2_*WAePcW@u{!f>|{4Lt2 zzM4?C&GQfJ{y7tiF6OydRQ6UeNu;yEaCNcYn?I2I`D0scjq!ccKhr~`Ew^MTjamtL!B9pCKD_Y!~MAbr1QVc1M z^mE6GP$>pZo^njD>qi&a7gcIR@JKL&+Kw3qN<(xzsCvOUoc6jp_TiL^bB=PI!<=cF zTPuEZa~I{A(cY;&J_*;rS65_8hkDIIzPww~TB$lz5!KPiZ1fE%H0ywR*$~v$9Juh- znU>z(;IZHW#LLcy7fmzSnpXZk%R_WSc$D7;*3!4~rFrddifuZ=9aJ2~Rc|AS3bq1n*tR%#|Tny%@{^%$t^u~3StsVxU9xZ>S+RZTedmaS49SJJPr znk>US$a%~M%eT$eA-CXXc4xo0DoU(T8eIU3(~gBr;Ba^u{2-%oAYE$|I~1mNk`lnD z-IVQ)HJ?*3Qbz{j2YbQ!lM!`?0mB10@!7D{M7u5e9L=!;MvfELJ#0^T;0$1x0^t#0 zpns5_$jB{eM~f^hHt?&6q$;p|SGBro_YVTbATF#{rD+9mZ-{&9D%t3@8O2edw-3KWJUzZ3@rE(}1j zk>D*82c8c?2aMHD{YdHxE(qod*&41ISW%>Pw>JM3!gh3ZYn}yc?5Ke!(}S#EH?7ND zppf0i`*2nCsX|TM0K3;W@Y%-*KYlity&>2JB-*Z)I`Hl&xdYRCvZ-gOEC@U}Z81Kx zpPz>mZjI87s-oEkt1;)uZGmcQOlyQu9TBtN8vSiSPHwJ6*>!D+3TN7s5h|J=-|%~F zYuDv(UzAchoT9Yuf6|o5wuA~dd`K}M*8YCI^T9;etTTCCsYV;f5 zJr3CGVgAc0kTVn|n%-Vml1_iGq=uguxD$urUkuK?d8qlpBe)9iyTI7uy5R1YkOGWz z>7vYol7_lVd)YzLK54MmJ4Ya#;}C5SN2Z&VnT2>RXrhuxuG2t$ z@2$8<(p;%&b7MMKY|4(~jKsb2Y3!5R91Q3ce5zC5SYfa)t|9wwzC%K#anwYHY8|C}d0 z&VL8ak-XFKkuIFg88QQTn)c-d{XU`sNP$IlT$j*Bz_mm6F2j=x_eOBTj}6e64i(WI zH)aob=)1J(73Un&K$%I&$Md_bvQU2QRv$*0p!Twx#^kPVCp+_*h(kb({X$Fh9%}w~ zf_SU|((I44`*nO;#k{)j+MOsd*+{%1Y`!Wynpt2WrZpYJFR{ zXAla8V*X_gNgH{s#HLB4n#G=?-!YJ`1s+SzMKR=A^mh zaSgX@w5*+qLlw3i*JsHYnwkkCm-k<4`4$|O+?l*l>R{Jb$$YorI8kDwTU(Wj!_D?^ z)Uxm_P> z2!<8Z3%J_fT5IgFxLU_(sD5Adf(A<(<9$Rnjd@gs#y$Oz1M^^uHBqg-tKfK}L8*@x zZ-+P>jtyGc;^#`MV%`ah!Z_aw(bJ4Euvza1d!&3p!_&Q(Iu*=Jsfh1D(K3_QXPnl@ zrBd58HRk0RXu@EZfcy=qso1ff)f8I)v(jWG^BaukFrT%4bNmse&VNF;BqWVB1r=^w%u?q+HN-epH zIG4ZXuj9uCpx*G%wmQ?YxC8t<_hbUo$WOMexA@HlcOm;hKn=Ulxx3g0+KEk*8r*aL zKwVs92dX3U@}!W2W~p5@$E(@TqU;&&rI91QUvi3j4q;WsH({!`)1 zA1VVt@X0JS?dmawiO`761u4!g3afcD78eagF{YrYqRx%F8MMO?+Ob{h3#bh(19t%# zKNW?;8jYOLl2mMJk>29N`K8>Cl!l1m(-KBHFLbFO@LA8kTj+6pDH9B|FgO+L;nHkZ z93WPbmUyM`F<-E4_s;uu4-#$+5Z4tl#1+-I^Y&w6fCwo%ZsK)skuzn zTH-89g<|O%P)br+FZ-~c$#+=T0@!K==&*730WF56Bi>kQtwUZ{f^+i?1p^u92dcKY zV8FRhn%G;$N(}~bl#?r{%&>|O;OB{O{=rL|8Ctk@T8f4gpFCm#l7zg3xsdC61gMgq zNXQLY$!2|k%<9$kCNvNT*=E&o5gpgfaRhoCf&T(|eouD+q22bbC=276B*6AG$j(2K zw+o7PbjW-*BQ@FP9dafh0opjh|B(OkeEe^}IiIO_vZyo*k&gb-kUP8yT7%k9Ltr(G znnU2-WTJHmnqS&UIus^fz@AUKnY}f=Y_r=z53@Iv(S=_8WRQR0e25EoJ84_8#H6wO z3oEVY%!3sVmS>NLz)#jihDsaT;RE;g_rH~9Kb|N1Dw#ecPyTDZRhd_!WA=bCb)pR! zkt>z1_hp)(j;Emw2 z;91~9FQ*0|Sm*4u-`7#gGFSHvJu@Cod?OXI*gQL`1@$1b292NV^Il;!`+uoLJb0KtKuFXoDq9sV`{D-ZML?txSwem%aG#s_`%M4v9bfN#@+{{$%lCZGxjm$UoHOSr z+AqaLTI{E_OA7Hewi8nEDns)oeL~`6!8K$QQG_Mn zk?995%C^mCyKi48-R;r%*_Dq`5F@w}8PHiS`leBM*%G&q>DzA+M`LyUrJd)PRgcHX zTSPc!$5k&xb79mTq&Jy2#o;<*gMO~(+x9}P$7AiXS+P)B^4K$Hz*>^%#dmU;hO+@= zzMMzIfpZYDd~UfOx;=fAGq0eJmE_l1_PFidtHe)4IG%(huCztQowuF7;DRwc(Izw||Gp$6@Qdbbmu=A|hT$hltgw-&XOtcpq$i>7} zwA4`<-@^7Z*$ zUI~TcYlK%RfPx`-tL6OTh4-H~567ypsbb~@k%y3T5J3`x8^#!6T{A}75=FQNyHw(2 z;d}8#9lIOv@>W%Zes-@C`M8=bg?S>bP|&Dt>3?t*=zgCN8F*5ta{WvQ%V5}iU_6`9 zHkD{SxGKqEjfE=@b@>a!v?&mytt4Kh*L!taLtgUdL-yv?%5zM7JVtwvtQm>%4QBqn$3c@X##N4Ft!Ozz}*Zu}9+b#!y5b}(jz$rPvL8LZiy4U#y(Ih{goRVYIL zxci9wi>!dqfqLE|%u^U6#Ao$Y^^7-z_GSPRA{?5wKGMyOI zXvUE`pT81$mOc=~sK#%#P;rys^@=?JC-vR>005t8RyAwrX7NVqr`|Jay2G(GE4Ri-@TyF3)GG#=im_v;o;)hG5K* zj=+lm?*E!d$yq(Gpa>sjSxX_IAfQFVKa#Cdi#{t3i>W!Nycl|2_Xl~M#7zb=Uelsc zE^!F2^GLS&Fa#=q-8h*X-IlG?i6|seFsPQBB0nkX8818gSV?~E+3d5y0!cKZCe>u0 z+F91vpgnWzTQ9b1zXK-1e5{7v@THo0z#q|hBuAVpC+~pVKO$pI=3`GUENIeG`+Zo^ ztq)!Sg|=JQ-$)!k*hHP$(i<4u*B!)>*`>ATy>V|W2x~Zu%5KED4Ya8{To|jpL_W`1 zz3ovYsUvQ9?w{3dg(fZeEQ2jCFtfD0@L3fv^Um^(`Wv)4GjTY?JEqQv5{3J3eK6+`?Nn92YG1J_&Ww!mfX%Lcx)`J@#&?- z>DSur-lu00!}Ty zx8H?pT@d%arGw^p`q~cn+q;$_Wm5K3mEsGd3v~5?6x3@mtnmIFn9~F7=OXkT{%99RG|3P!oAuuh!`O~ z0fu2c7>4MDJKa~TMk-hGPm^(Yd{q%s;p=#Jaz4wDb5@lygFZvPgk-?W^^E8%;b<5R z_VhLvkB2ZJJL`jZYQ||R>C;z~t*R8Q7UB!CMmk_!fTgzR11sF|)`xlrdgWlu4vrY|D*OpS!WT{PCUIDHt%@<|&G8(!S4tX$%E+ zO51jTbM;pbIRF`uKxxwv1hk3AjPdilY#j!LbN;6vWD~m_b$js~d}RKkRn!XBwWbk4 z*kaCTew6FQZ9AAM(K;|6YkPWyXo*HdMe(BJv?xSd7N%WgHCo~6++ZDG$>lqwRwFep zi`wX_6zvoag`GdM;!xv!%$a?jrAPP%xShr@ns>@9KOkV>Q}b#7TI-%g<8EHkjN~8+ znvg8V@nmi?YcC5xprZc(n=VLONY)lEp(YihGZCoJA~KVBfU%n&jP$2R9n`b5z2wmm zlwwlccU6ei3cEqP34oq5Q=R9QC!HPdx;v9wVKB<-jV{l9;YRIkvbXu3<8f}cbbXX^ z!PK0Q0LoX;$OkyC6>Sx51pqYH-H+V@u2Umn{u&ZrjfqA&)I6=so$soSJIyUkx+qG} z9y?G&t?q7Vhg8IYc=UtOx`RzNwy{KVx-3}lEv!c(%qTPB)q))^=R{u@cM_AjvxWj^Jt-t%)qG1Im6TbrbC~MM zD%jCh$h^q>&+0+-z*(?h#RL~KsvS+VQSD!i&LCHS@5bdMbKU8HP2;7&lxwuVYvq}a z4-?t*m%IKkxx$dkMT(TMnx2Q?la{k>g}&T`y)iXgioJzC!u1CcMKJ9wLDXUU@zuD? z*6X_FUM!nCBnxQ%tMj`<2T_hxan?B0ISW>4L6$e5BO8Uh*KShIE3b;fZRdakCm;O% zgV8`guC7evp}j^{5V;@ir#6mvk`^EP%ZtEOcErxJOR*+a2z!IfZ3P`dZQJ50Yy{V` z2>DfTu1QPd#`x@e&iR7s^) zUb@iY5Mg8go>S)BRNOY}JU!OW9JX`#!WegnDCS^C(m)?jBe|T#Y%ZOj5R}timS&$1 zyHhUuTq_Q%II^nC4(sE1MA1-*pu9!)cr%&IHpiX7f8IWMj+rZ3(|Ecf;}JEhmjBS# z?u7Yh{#2QWRSemP(FYK+ygITQ#aleGL>>p^I9DZ@>iV<8SI8^GQrylg3N7w++RM>g zD_gDg@cgLXg&p2I_F_J8=Txel-yyhlN;-h^fdVnX%`lVtyx#<=pASvRo*9x`G$cSg___vHgI{ehn5k9ANEQNU*bYbu^@!Hjf@; zvSfnQfIXK*IhXZdO>BMn_yqaP=mNi^`@C`VZ)Rb^Z zOL)9+3AevCESqdc&@MypdV4_|&Q!F?eZh2Z2Dnd7;2sFGR{UkW7S-f0PIa!vV)qoPX@>*$aa*+Y&|Aa!08RFajIpaZ zZ`SB5_{7|(av5L&6=X}{0!o+I1RK*G_HU0yDhtMcC9KV&PMSN*v)Bnz^zT_LvtIx!%xv2$%;I>v}`VIK$8fkIh^~TAq zIAB)8V`^569Vg3)CG@uO+Kfnn;PZ}3rsDCn$Fn*3wO*SaBe6bqpw#w#bW<2Lt$oev z^)jmf*Aiv5CJT?Udk&S~6aPLMyc+T?nsO>Rih)OO^H0)Q4WMLSNsC2r+YLN9H8 z-q3$L5(N!CkczW2i=ci*u;3+TkN8Lt7cv|#u64cXdh;rA6nlU#HF{3p6e-)zwgkV=N$Jb6#icK86-3Y+TN?n{gC-(`2@=MD;iVSeQFwPTBwV=j2yd6z!2+!L7 zVvOrB50*>qqsjRkkKjra)9l%bkU_!Ya(3|s?GNO={eEjFe1!MMn|t>Ap_zYNVTdPU z8ee&A?d^I_+4{Ha(W6A+oPB201OH#5tHs`L1@yf;Bl0hP+;ZxSZN3}F(i_5vB!m$# zp1PD^pllybiOEHCVp2x%`P^uKF(U6OzNh^V-eePJG+bFQ_BG)INg?IM@m)Yh`cnIV zj)64AEhS8aD598Ke07!8L_SD+QSa~xG=olHD0ON#CMR8pvB2jU5%kTFf(8?EawOU$-X|9!fYJU&w z4l51QYFE`;;A%;t!v;PznWss{Vf>>wuBVyjM74L*Zq);CuWM7nX8N|-s|RoYrTfu? z6|YXo22Wsn<16>jRJx2~ydMQ57)yWG+%`ZDH->Ps^Sd|+5fK!m%}{9Kq8A1w#R#kC zPS)07dQN8P#!b{zBoVawxaQ06R54GBwiRE2!>Y&Jyj8_alezerL(-#Dtps>^sG`4n zbohW7b?*f|G$v$UUr)F}im>9%s0EL!i2|Y>8iW}A2*zuWl>BTW0rQ*6QtR1TXX1b( z1&lKU2Wak>{a&!MfTm9U0*92z%?wcGFwZKt)2^=Ks|YX4jh4OxzMT=eA$8aC!9?5AY72JgcX+{!oM%s40xw6P51`%TuY33if~ z?%v(BO|tFEJ>zBI{;N|^OiI1M5aXqByQsft9Ev@)r=bvgBGq%jHraT9@C)rtvY+-7 z(K~nBXfZeu=*NjK$l_YEBAsBGvDn)0)>pN@MiAO#eDMaAxqHN3nI0P_DiV;E|=TJ*Q@1vxi=%Q&$`jgwN+B@uUlV z9k1Epb`arN2lAQpJ_*+F*aO~{7pMBFx%!PN`S@`De`dxJ=e`81h;zem@;l-XHc{+g zeKui-aILlt@`>|T({w&gnhO94gZqwk^EV}6&j*8c^7?$+%wXyX zjaNxnRK1QOrZ6nF3x$VBA7TU>Xx2x4?9&X$*j6n`x)}453WF(T(JskQsj{sA`X3Y!C9A`)l~s=K(q4cR#w4w88LU!iK%ndH zk5Yz<$m@AS2Tu9$SDGUgS3~FC#NEY0;aA#fPv^=ghl|^ugZ~ZqhNYiwH+`KM{nCQ0 zK-EQG)vwjcv*XQhJ2LPQr)Se8v>+d*gSA`~?bhB8YYwX^TfK=lxW{w!^IWkuGJyKg_{OxpL`LuF_;) z>fnCz>$;)cdx?3(D-fPOz?1T;92)v4+2?t2>gwu_L{WczFLZ+31KbJs{HDWoC(CQF z(G_z`vjZ~SY55o9!wT|8Fm=0AmO`0mG=w3#U9%b}7)7z276}gK37%7ue`ikHmhE-# zS<3?g5*(b{sRL)&Y%7&a<%ymhu8-fW?IEr4QTFk=N0rn(4ti}_AreYfiy7O=ic-ovbq)W9M_C z@h;zlViTRtuz2(ul$`5vU&peZ-=Ml91B>rCwcj~~>+ZDaTAsZdE_WW%LpSgo*_S=m;2Y(-b%8pzMpLsJPmItRkAx3&rx zaAe+R8eAo1IAB@hWFQUuMEo5YPR-7pQ84~`qJF>MwtIh&k;Dzcd^Upf820XiUam!L zTXtR7##EEffgR<7mvZNuEu-YK%!)qun!2wcFM9|hg1qO|a`95mVphnTv;YdGA_82i z+9G#dU(56El!rotC%E~kZ_)#$ymY}%L|3rn^5>AUXs9pf>VoV`D-C=yY{awK(O8sY zS&&;o4zonG4zgd~)QxbeZM%ik!<@VQgbU`vafW&cYukbptc#!N#b0H-qp!vkkzX&9 z!&bXUlLj`a@W(Fp>V>`(=`d#5OH<}n^ za%kN99qi)Qw1COd=sUV{?^ZDFhRjB?oR!S2=5)VD+icBcWe~U}n;{$ZFdQzP3+_k{ zKbc~p$^KjnEOB){XKqyM#t<&JCyjSzNSO?V=2`p**_89qwnw&vEs=o5L#obp0lgkW z8r4XgvpL7dnz?&HV&~20R_pJeZR4yhf-nt&B_h)EPGrPh5A$)JQTpmcVtL(jm7=^9Ic-;JqG~ z4|M8hkACTXR-AY1c@8EwHww;hOD;2?DbT68KMO&?Tp$U%l$P_Q#?8&${Ur!;Q_gBA z;i~2)a~B)6pI}(Dz3~?yV?75UfBb|TfRy`udUuUkTtRNj+3^~!e3NbX!U*?DCZ^mf zK==w{-IZS8sl5&4Ku9~EEZ6|)2eo?q7TOZQtF%um`F8~?I)BjdZb!B}rJ#$Wi_wfB zndG%aZL$Q9cHon;;51u#SLgDFiCcpIP5m>ECV>JpbCOtxThu+;r}xd=sLEvu*Y?qD z*fAwnxE;80eV`b3Z38s+5t)GmP8?iMAI|M3JaFV5zUtOshk0YA&YjCqq`(*n)dM1O ziGb>r+S|#HadP+9?L^^-;#;GAI-AUimd5eKL2}%UYq<$#k~FIxEr-GOTXCe!J-02# z*VQRxTYdDx9k6dgdK@F~hjVrruHUF@-s3jtj6cAeIeLc%lr#ZvlrK08K$m2zGuY|nf_~K4bttas= zgT2@#q|*R`m9!5m*}6d<3`c#^nj@E` zU{$m;&AU%4y``omU0|0wmw)=?&%8)@3)oifc`OMSG2QZ&;9$fv0WFNh# zT;mMEdNAr6AgO5~J_ zj}5LR=HPm{uW;^Ag<^aQ+=iz>9I>NJG($WFESfFaQ)HKC_er1E>+=IR38$HR>9hKQ zwwU=Y?C63xy=zhiUd4tZ$Hs@BTtK@l2#EA{m5aUsDml?|>f}mHv<9~DK7FtMC7=WF zXLkS!-Nqg3OvO_}kH|L4r_qTFEW$fr*TL**N-x+onu+WR!X5=wq6^)yC%jw(_iZd^zSS(capV^f7->Kc(9)EN0_=nZjqNnTs7XtTB@tpC?f9CxnK4wG_-?~c>x z{#sf|p?4VmnRNgZ>8skL%1bb{7oplb@)%+M-z#s36-Ksc`R zi2;v?o5auD$ft=9C+JMB;(|mL<)^#Iq)!*xv|Wtwg8GgfkfA;p6ua$yC6J)H*&&>M zng~*)5TW?k-Z6u_L7pO?3KHhf*bM`i?R$hG$OUw-8UF&ZJ*O9xeGO@%N93P*Lz^iH zsp&9f=W8zevOA^Y8;Bgp`z86f7L4E3ptJ}>@EHCP6Rm~vgXe}B9VcEV0=a>*H=SnI ztZ|@|$!Vp_@DOf;913AVpEbMr>vllRfN`KbEtN{H_A+42ZGbyQ$sW6Kxxaq&IQw|Lg4RO3#F7FlzA9fiVW_G+4Fm=?zJbn)^qxd+ z1urqm7u@8-Vdum544LDrG4FY0h#1E(&>>6ZSplx4${T;Cx4sAf#sJj8(XitPty*pD zQuC))3$w!x0e18&k?q|16~f0Eioz(?07q95rY>CK2)V2=atJdwPUSm#Dppaz&S2&% z3E||Ej|sIrfL$)8N2xt-iB$vJvU_vH&2J}9GtWYF`-IjTYiaGguAKyabOY9jS@<_R z*oTYOYESM#AuxlH@9W(Ox#Pz8-=jWt3c1Ah1ujxHsXDfa%H8n3N4FMgNHfR=T!&ls z-rF55nOdjK+4CvN8Z$KP&Wk|q3+dNabY$`&Oyz4c>DdTroHQ+K1&}rRxD`_U9ykAu z(9WxA4--+N8Jg&d1RyUjCO|#gT!ge03r?FZ9uvH7TvUxE4j(xzv3Iu1;#hJrs~EKP zW8}9za1*d44yW0h84dMFD zjq=&68Z{28GMjdb!Nq!p$p`1 z2ENhdi^ph(CT;X~lPdG^@kQjnsAO1k+Uwp`buLz3m?X<(r zLkBV0`x%svJLzUjh3K0D0O3i%rPX;XfP2b`1w=f3MHq~w)k{%ha#dd{ZifL%K)?1bHV`UnP>{Q?|}?kYCLR>NpRk^DE(lOUo?!A^G<1 z#B-D=xl1CeCoY6N;SK~wt|;pvPx*kfIG|h-G;b;_2^-G>^*h@Pm_Nd5=b&!@2%@2@1uX!tf2F) zMe*H`T^}ZnyjB{K5A_$NqE<9p=qY#Ak3Z19{Qgvn*4-}dJS4}u=_(I@7ZhOHyEum` zXAPYsWbjL=&@m0GvNtZ~^!R?5MghT}UFv`IQ2MprZmyKJqY(^x5R1{!h3@Y8%3F8S zjtpOeJDr_shUA68iyq4R?ypyTPjxqlJYk*2l^AP`=k(_RQ9guQF&A=O?gdj9LMfWp zRMPW7$Bx?<6cf**4{rX?nIGR>KF_AG`n?tZU1)tY|LeoUg@4HY^Pep_>)w9nozK_I znl-C%zv_=w3xigB9!}?NIka%aC)c{x1f6l5&?y#0zw=he^MLTcic@_%YCqY#t*J`h zy)RfcVTjLc-gRM{LoR8+sjO#yLZ0X|?Nxfi^NbrlGMmW3lR51$%{+7GvAw!>sh}^!*;30V6)vQr@ z9RK0L2JYgmD8ZDLyTYUZO7L+@0a&=72|ibadj}p+s1(dqIis z4-~t1%7X@B0p}HMXu($iMjQST6 zE;m(LpD|4F3N?pmy*JhlO}E0j$>|vIJml%%Lr=!sB17@dc=_|L7b9klyQhw06YT7h zmx^YlDPBXS5`9PAlli6n8 zry8M)*U-S0Q^PTA@A5r22F-%Jw~@)vN8TGxGRDme`#DJ)!9OV?!@PHQS>Uc%_J(^t zlq2#PItW2yrv%s~6>U)vUDvX+WdXjbRd&Wc;7i+`h(XW61G<3XZCMRtJE016cFv!f zjJ+5c{<1ACo2YRV z*J-8I(=Hp&A(s%A5bfM9#hkf|*?}fIqj<+(4erGTVO{srR`_HX=EiLQ_snDjpU~xZo~;+PDZC4S2n#JDSzp2bAZzTWSl^08>X9c2Z1Z=x-} zn*>!J9Lr6*VM72H2P+yQnyd3>eh>b%32nyA@~wOacAj+K>!H0%EDcou31RZ>49z`yI492vXw%h*%NxoRSZTpkq)MmV6DxI7LYE#6(mLSwg(! z8KCfUgh0EBpUHMrj}IdI4woSKF?_KcN)6$=1J;N-T>CRRAWjj^F~`j0vK3{)oO-#N zKlnQd#hZ=5yyiklq%ad`U8%H6aWww=_Crv6^%jwU3&A^vPHiWNP!ralaYN=T75+%s zy2MONxJDiv=l41smiBS2v6R*qBe^Kvp_u##C&UcWHI(Gijd8&&y6 zgoS=Z988x``@r;0ACzA zDf)PP8!!ZZCX-R;LOk+A;HgQb zIg|wq_#2A0L_*<>>l83@BK0K`;U){T^nzqF33sezqpDaG1ySo|6V357yi>x=QP$W^ zcA108Tg(bvfN+Enq*BE_kE)1E!~iBVz}Oj3^bn3m8v#Iuc(KXxCh0iOy@ zqf*j}jkM^IB?aIMZtOHbsFgX)LTF5K$!Pf)E$?u#`h2U6k%bGoN6X2Jy#Tv@)8{ z%{DQ8j5&oe;9@>H5@>hOoE5^7^UqO^(p`NiPyZh(+pON+Ob!E6Ob!6^JU33Jk4^~G z8AKWf>_uQMx4M0QkTtnks3Yfj9_&yT{unY7PbqFnPa1nLX~<`N;4|+%Vs`SoIau?G z1=0GaCZc!ZpdVWnwlL8;TTa&ir1EwfRjjv$wo-YwwvmVxj&?f1(Y_>HWC=*%5G274SN1g^%6HX$|V!OOZS8+y0}IwhH|e=!vU$e^89)Lbdg$vLGs9Y0>}Cx8}hz2 zwjK`%j70O)ym2uKVNpw)gwPWsRT^gq)T8nBawEylFvb&%_;p#GA)Ul_mPGlh&W&F~ z$x2STsnX-^flfwMqPurfd|vnh%lrVrolWQ57#f@R`Ieg?4k}y{U?}|(Afn>ZWMt0s zLi)VmF$(Rsb5*H{o-z88vA6{4YR-nWUs~4qG#5&nghmfVL8li4^9BPl*#i#DtyxtYRcE0nj)p#9j1%P+ ztUgvnirLAthcHLysTUncj?+%knKj<8UEYu$gdrUH@S)bW^P=_F5S1RHZp#wPt?{8% z=Qo8_Hxe}7_+GXjqV)(?`ZyXJc!`gNRzS_*D{GS@&dQ;LY&}-xYzz??^V$gvx?ixH z0Un9$#=vUw6GD*Htf3w1ZQyo?<9;BIf3tv8{&`mPLIf|vf^u9>x5<@_kA7LO+XpzJ zM-g|C*G4OoaPxxoQketu;m&<(Q7oYTYIJr#&|oF=20X#ydf;t#{)ihDSu z0ghtXZ$5!#%={zS?dUAlI{H-RHIBnw&B0b2+SOZ5^y4Ay zz`%2qae}b~xymTOeom7&4U0LoXmqYSi@zKxqwna&w8*%sJmrHAPib2LSCWvo*L;dn zxNvv(FT*^bA6e;pz77e2@+?2qh4Eo@dujY$^N&$bQ!>Y#zHF`vXXcGRJX}w&MobJg zfw!K`1tQ1Eymi=dXtpzzfQ0N7+VuUN1H~cI^OGIX96QPSf<%WN$`BYvQb$Zcw7i3e zHjg@4V$Q7wCLGPh)qF@h)BkB_11Oexd&D;C+1Wde5aL_p{pC+jLYvg! zJF^l>nFWT+iSFOLpO8jdt7HqCu4T`^f8HW{ /// Resumes the component's functionality /// - void Resume(); + void DoResume(); /// /// Gets whether the component is currently paused diff --git a/Assets/Scripts/Utility/SceneOrientationEnforcer.cs b/Assets/Scripts/Core/SceneOrientationEnforcer.cs similarity index 100% rename from Assets/Scripts/Utility/SceneOrientationEnforcer.cs rename to Assets/Scripts/Core/SceneOrientationEnforcer.cs diff --git a/Assets/Scripts/Utility/SceneOrientationEnforcer.cs.meta b/Assets/Scripts/Core/SceneOrientationEnforcer.cs.meta similarity index 100% rename from Assets/Scripts/Utility/SceneOrientationEnforcer.cs.meta rename to Assets/Scripts/Core/SceneOrientationEnforcer.cs.meta diff --git a/Assets/Scripts/Core/Settings/DivingMinigameSettings.cs b/Assets/Scripts/Core/Settings/DivingMinigameSettings.cs index 4a395ac9..2d19789d 100644 --- a/Assets/Scripts/Core/Settings/DivingMinigameSettings.cs +++ b/Assets/Scripts/Core/Settings/DivingMinigameSettings.cs @@ -126,6 +126,38 @@ namespace AppleHills.Core.Settings [Tooltip("Whether to block player input during bump movement")] [SerializeField] private bool blockInputDuringBump = true; + [Header("Camera Viewfinder")] + [Tooltip("The prefab to use for the camera viewfinder UI")] + [SerializeField] private GameObject viewfinderPrefab; + + [Tooltip("Duration in seconds for the viewfinder to shrink")] + [SerializeField] private float viewfinderShrinkDuration = 1.5f; + + [Tooltip("Speed at which the viewfinder moves toward the target")] + [SerializeField] private float viewfinderMoveSpeed = 5f; + + [Tooltip("Animation curve for the shrinking effect")] + [SerializeField] private AnimationCurve viewfinderShrinkCurve = AnimationCurve.EaseInOut(0, 1, 1, 0); + + [Tooltip("Padding factor to add space around the monster (1.0 = exact size, 1.2 = 20% extra)")] + [SerializeField] private float paddingFactor = 1.2f; + + [Tooltip("Minimum size of the viewfinder as a percentage of screen width (0.15 = 15%)")] + [SerializeField] private float minSizePercent = 0.15f; + + [Tooltip("Maximum size of the viewfinder as a percentage of screen width (0.8 = 80%)")] + [SerializeField] private float maxSizePercent = 0.8f; + + + [Tooltip("Starting scale of the viewfinder (relative to screen width)")] + [SerializeField] private float viewfinderStartScale = 1.0f; + + [Tooltip("Final scale of the viewfinder")] + [SerializeField] private float viewfinderEndScale = 0.25f; + + [Tooltip("Progress percentages at which to trigger events (0-1)")] + [SerializeField] private float[] viewfinderProgressThresholds = new float[] { 0.25f, 0.5f, 0.75f, 1.0f }; + // IDivingMinigameSettings implementation - Basic Movement public float LerpSpeed => lerpSpeed; public float MaxOffset => maxOffset; @@ -177,6 +209,18 @@ namespace AppleHills.Core.Settings public float SmoothMoveSpeed => smoothMoveSpeed; public bool BlockInputDuringBump => blockInputDuringBump; + // IDivingMinigameSettings implementation - Camera Viewfinder + public GameObject ViewfinderPrefab => viewfinderPrefab; + public float ViewfinderShrinkDuration => viewfinderShrinkDuration; + public float ViewfinderMoveSpeed => viewfinderMoveSpeed; + public AnimationCurve ViewfinderShrinkCurve => viewfinderShrinkCurve; + public float ViewfinderStartScale => viewfinderStartScale; + public float ViewfinderEndScale => viewfinderEndScale; + public float[] ViewfinderProgressThresholds => viewfinderProgressThresholds; + public float PaddingFactor => paddingFactor; + public float MaxSizePercent => maxSizePercent; + public float MinSizePercent => minSizePercent; + public override void OnValidate() { base.OnValidate(); @@ -238,6 +282,16 @@ namespace AppleHills.Core.Settings damageImmunityDuration = Mathf.Max(0.1f, damageImmunityDuration); bumpForce = Mathf.Max(0.1f, bumpForce); smoothMoveSpeed = Mathf.Max(0.1f, smoothMoveSpeed); + + // Validate camera viewfinder settings + viewfinderShrinkDuration = Mathf.Max(0.1f, viewfinderShrinkDuration); + viewfinderMoveSpeed = Mathf.Max(0.1f, viewfinderMoveSpeed); + viewfinderStartScale = Mathf.Max(0.01f, viewfinderStartScale); + viewfinderEndScale = Mathf.Max(viewfinderStartScale, viewfinderEndScale); + for (int i = 0; i < viewfinderProgressThresholds.Length; i++) + { + viewfinderProgressThresholds[i] = Mathf.Clamp01(viewfinderProgressThresholds[i]); + } } } } diff --git a/Assets/Scripts/Core/Settings/SettingsInterfaces.cs b/Assets/Scripts/Core/Settings/SettingsInterfaces.cs index 4b48f197..a2706dc6 100644 --- a/Assets/Scripts/Core/Settings/SettingsInterfaces.cs +++ b/Assets/Scripts/Core/Settings/SettingsInterfaces.cs @@ -108,5 +108,17 @@ namespace AppleHills.Core.Settings float BumpForce { get; } float SmoothMoveSpeed { get; } bool BlockInputDuringBump { get; } + + // Camera Viewfinder Settings + GameObject ViewfinderPrefab { get; } + float ViewfinderShrinkDuration { get; } + float ViewfinderMoveSpeed { get; } + AnimationCurve ViewfinderShrinkCurve { get; } + float ViewfinderStartScale { get; } + float ViewfinderEndScale { get; } + float[] ViewfinderProgressThresholds { get; } + float PaddingFactor { get; } + float MaxSizePercent { get; } + float MinSizePercent { get; } } } diff --git a/Assets/Scripts/Data/CardSystem.meta b/Assets/Scripts/Data/CardSystem.meta new file mode 100644 index 00000000..17db497e --- /dev/null +++ b/Assets/Scripts/Data/CardSystem.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 52a47d9c5b29456faca1c9b43f8f4750 +timeCreated: 1759923654 \ No newline at end of file diff --git a/Assets/Scripts/Data/CardSystem/CardData.cs b/Assets/Scripts/Data/CardSystem/CardData.cs new file mode 100644 index 00000000..e607f652 --- /dev/null +++ b/Assets/Scripts/Data/CardSystem/CardData.cs @@ -0,0 +1,115 @@ +using System; +using UnityEngine; + +namespace AppleHills.Data.CardSystem +{ + [Serializable] + public class CardData + { + // Core data (serialized) + public string Id; // Auto-generated unique ID (GUID) + public string DefinitionId; // ID of the card definition this instance was created from + public CardRarity Rarity; // Current rarity (may be upgraded from original) + public int CopiesOwned; // Number of copies the player has (for stacking) + + // Reference back to the definition (not serialized) + [NonSerialized] + private CardDefinition _definition; + + // Properties that reference definition data + public string Name => _definition?.Name; + public string Description => _definition?.Description; + public CardZone Zone => _definition?.Zone ?? CardZone.AppleHills; + public int CollectionIndex => _definition?.CollectionIndex ?? 0; + public Sprite CardImage => _definition?.CardImage; + + // Derived properties + public Color BackgroundColor => _definition?.GetBackgroundColor() ?? Color.white; + + // Get frame shape based on rarity + public string GetFrameShapeName() + { + return $"Frame_{Rarity}"; + } + + // Default constructor + public CardData() + { + Id = Guid.NewGuid().ToString(); + CopiesOwned = 0; + } + + // Constructor from definition + public CardData(CardDefinition definition) + { + Id = Guid.NewGuid().ToString(); + DefinitionId = definition.Id; + Rarity = definition.Rarity; + CopiesOwned = 1; + _definition = definition; + } + + // Copy constructor + public CardData(CardData other) + { + Id = other.Id; + DefinitionId = other.DefinitionId; + Rarity = other.Rarity; + CopiesOwned = other.CopiesOwned; + _definition = other._definition; + } + + // Method to link this card data to its definition + public void SetDefinition(CardDefinition definition) + { + if (definition != null) + { + _definition = definition; + DefinitionId = definition.Id; + } + } + + // Method to upgrade rarity when enough copies are collected + public bool TryUpgradeRarity() + { + // Simple implementation - each rarity needs twice as many copies to upgrade + int requiredCopies = (int)Rarity * 2 + 1; + + if (CopiesOwned >= requiredCopies && Rarity < CardRarity.Legendary) + { + Rarity += 1; + CopiesOwned -= requiredCopies; + return true; + } + + return false; + } + + // ToString method for debugging + public override string ToString() + { + return $"CardData [ID: {Id}, Name: {Name}, Rarity: {Rarity}, Zone: {Zone}, " + + $"DefinitionID: {DefinitionId}, Copies: {CopiesOwned}, " + + $"Has Definition: {_definition != null}, Has Image: {CardImage != null}]"; + } + } + + // Enums for card attributes + public enum CardRarity + { + Common = 0, + Uncommon = 1, + Rare = 2, + Epic = 3, + Legendary = 4 + } + + public enum CardZone + { + AppleHills, + Quarry, + Forest, + Mountain, + Beach + } +} diff --git a/Assets/Scripts/Data/CardSystem/CardData.cs.meta b/Assets/Scripts/Data/CardSystem/CardData.cs.meta new file mode 100644 index 00000000..8be56ab3 --- /dev/null +++ b/Assets/Scripts/Data/CardSystem/CardData.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 812f681e555841c584d5791cb66278de +timeCreated: 1759923654 \ No newline at end of file diff --git a/Assets/Scripts/Data/CardSystem/CardDefinition.cs b/Assets/Scripts/Data/CardSystem/CardDefinition.cs new file mode 100644 index 00000000..0fa7902d --- /dev/null +++ b/Assets/Scripts/Data/CardSystem/CardDefinition.cs @@ -0,0 +1,61 @@ +using System; +using UnityEngine; + +namespace AppleHills.Data.CardSystem +{ + /// + /// Scriptable object defining a collectible card's properties. + /// Used as a template for generating CardData instances. + /// + [CreateAssetMenu(fileName = "New Card", menuName = "Apple Hills/Card System/Card Definition")] + public class CardDefinition : ScriptableObject + { + [Header("Identification")] + [Tooltip("Unique identifier for this card definition")] + public string Id = Guid.NewGuid().ToString(); + + [Header("Basic Info")] + public string Name; + [TextArea(3, 5)] + public string Description; + public CardRarity Rarity; + public CardZone Zone; + + [Header("Visual Elements")] + public Sprite CardImage; // The actual card image + + [Header("Collection Info")] + public int CollectionIndex; // Position in the album + + /// + /// Creates a new CardData instance from this definition + /// + public CardData CreateCardData() + { + return new CardData(this); + } + + /// + /// Gets the background color for this card based on its zone + /// + public Color GetBackgroundColor() + { + // Colors based on zone + switch (Zone) + { + case CardZone.AppleHills: + return new Color(0.8f, 0.9f, 0.8f); // Light green + case CardZone.Quarry: + return new Color(0.85f, 0.8f, 0.7f); // Sandy brown + case CardZone.Forest: + return new Color(0.6f, 0.8f, 0.6f); // Forest green + case CardZone.Mountain: + return new Color(0.7f, 0.7f, 0.9f); // Bluish + case CardZone.Beach: + return new Color(0.9f, 0.85f, 0.7f); // Sandy yellow + default: + return Color.white; + } + } + } +} diff --git a/Assets/Scripts/Data/CardSystem/CardDefinition.cs.meta b/Assets/Scripts/Data/CardSystem/CardDefinition.cs.meta new file mode 100644 index 00000000..34724df0 --- /dev/null +++ b/Assets/Scripts/Data/CardSystem/CardDefinition.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 2a80cc88c9884512b8b633110d838780 +timeCreated: 1759923702 \ No newline at end of file diff --git a/Assets/Scripts/Data/CardSystem/CardSystemManager.cs b/Assets/Scripts/Data/CardSystem/CardSystemManager.cs new file mode 100644 index 00000000..c80ed549 --- /dev/null +++ b/Assets/Scripts/Data/CardSystem/CardSystemManager.cs @@ -0,0 +1,264 @@ +using System; +using System.Collections.Generic; +using UnityEngine; + +namespace AppleHills.Data.CardSystem +{ + /// + /// Manages the player's card collection, booster packs, and related operations. + /// Uses a singleton pattern for global access. + /// + public class CardSystemManager : MonoBehaviour + { + private static CardSystemManager _instance; + private static bool _isQuitting = false; + + public static CardSystemManager Instance + { + get + { + if (_instance == null && Application.isPlaying && !_isQuitting) + { + _instance = FindAnyObjectByType(); + if (_instance == null) + { + var go = new GameObject("CardSystemManager"); + _instance = go.AddComponent(); + DontDestroyOnLoad(go); + } + } + return _instance; + } + } + + [Header("Card Collection")] + [SerializeField] private List availableCards = new List(); + + // Runtime data - will be serialized for save/load + [SerializeField] private CardInventory playerInventory = new CardInventory(); + + // Dictionary to quickly look up card definitions by ID + private Dictionary _definitionLookup = new Dictionary(); + + // Event callbacks using System.Action + public event Action> OnBoosterOpened; + public event Action OnCardCollected; + public event Action OnCardRarityUpgraded; + public event Action OnBoosterCountChanged; + + private void Awake() + { + if (_instance != null && _instance != this) + { + Destroy(gameObject); + return; + } + + _instance = this; + DontDestroyOnLoad(gameObject); + + // Build lookup dictionary + BuildDefinitionLookup(); + } + + private void OnApplicationQuit() + { + _isQuitting = true; + } + + /// + /// Builds a lookup dictionary for quick access to card definitions by ID + /// + private void BuildDefinitionLookup() + { + _definitionLookup.Clear(); + + foreach (var cardDef in availableCards) + { + if (cardDef != null && !string.IsNullOrEmpty(cardDef.Id)) + { + _definitionLookup[cardDef.Id] = cardDef; + } + } + + // Link existing card data to their definitions + foreach (var cardData in playerInventory.CollectedCards.Values) + { + if (!string.IsNullOrEmpty(cardData.DefinitionId) && + _definitionLookup.TryGetValue(cardData.DefinitionId, out CardDefinition def)) + { + cardData.SetDefinition(def); + } + } + } + + /// + /// Adds a booster pack to the player's inventory + /// + public void AddBoosterPack(int count = 1) + { + playerInventory.BoosterPackCount += count; + OnBoosterCountChanged?.Invoke(playerInventory.BoosterPackCount); + Debug.Log($"[CardSystemManager] Added {count} booster pack(s). Total: {playerInventory.BoosterPackCount}"); + } + + /// + /// Opens a booster pack and returns the newly obtained cards + /// + public List OpenBoosterPack() + { + if (playerInventory.BoosterPackCount <= 0) + { + Debug.LogWarning("[CardSystemManager] Attempted to open a booster pack, but none are available."); + return new List(); + } + + playerInventory.BoosterPackCount--; + OnBoosterCountChanged?.Invoke(playerInventory.BoosterPackCount); + + // Draw 3 cards based on rarity distribution + List drawnCards = DrawRandomCards(3); + + // Add cards to the inventory + foreach (var card in drawnCards) + { + AddCardToInventory(card); + } + + // Notify listeners + OnBoosterOpened?.Invoke(drawnCards); + + Debug.Log($"[CardSystemManager] Opened a booster pack and obtained {drawnCards.Count} cards. Remaining boosters: {playerInventory.BoosterPackCount}"); + return drawnCards; + } + + /// + /// Adds a card to the player's inventory, handles duplicates + /// + private void AddCardToInventory(CardData card) + { + // Check if the player already has this card type (definition) + if (playerInventory.CollectedCards.TryGetValue(card.DefinitionId, out CardData existingCard)) + { + existingCard.CopiesOwned++; + + // Check if the card can be upgraded + if (existingCard.TryUpgradeRarity()) + { + OnCardRarityUpgraded?.Invoke(existingCard); + } + + Debug.Log($"[CardSystemManager] Added duplicate card '{card.Name}'. Now have {existingCard.CopiesOwned} copies."); + } + else + { + // Add new card + playerInventory.CollectedCards.Add(card.DefinitionId, new CardData(card)); + OnCardCollected?.Invoke(card); + + Debug.Log($"[CardSystemManager] Added new card '{card.Name}' to collection."); + } + } + + /// + /// Draws random cards based on rarity distribution + /// + private List DrawRandomCards(int count) + { + List result = new List(); + + if (availableCards.Count == 0) + { + Debug.LogError("[CardSystemManager] No available cards defined!"); + return result; + } + + // Simple weighted random selection based on rarity + for (int i = 0; i < count; i++) + { + // Determine card rarity first + CardRarity rarity = DetermineRandomRarity(); + + // Filter cards by the selected rarity + List cardsOfRarity = availableCards.FindAll(c => c.Rarity == rarity); + + if (cardsOfRarity.Count > 0) + { + // Select a random card of this rarity + int randomIndex = UnityEngine.Random.Range(0, cardsOfRarity.Count); + CardDefinition selectedDef = cardsOfRarity[randomIndex]; + + // Create card data from definition + CardData newCard = selectedDef.CreateCardData(); + result.Add(newCard); + } + else + { + // Fallback if no cards of the selected rarity + Debug.LogWarning($"[CardSystemManager] No cards of rarity {rarity} available, selecting a random card instead."); + int randomIndex = UnityEngine.Random.Range(0, availableCards.Count); + CardDefinition randomDef = availableCards[randomIndex]; + + CardData newCard = randomDef.CreateCardData(); + result.Add(newCard); + } + } + + return result; + } + + /// + /// Determines a random card rarity with appropriate weighting + /// + private CardRarity DetermineRandomRarity() + { + // Simple weighted random - can be adjusted for better distribution + float rand = UnityEngine.Random.value; + + if (rand < 0.6f) return CardRarity.Common; + if (rand < 0.85f) return CardRarity.Uncommon; + if (rand < 0.95f) return CardRarity.Rare; + if (rand < 0.99f) return CardRarity.Epic; + return CardRarity.Legendary; + } + + /// + /// Returns all cards from the player's collection + /// + public List GetAllCollectedCards() + { + List result = new List(); + foreach (var card in playerInventory.CollectedCards.Values) + { + result.Add(card); + } + return result; + } + + /// + /// Returns the number of booster packs the player has + /// + public int GetBoosterPackCount() + { + return playerInventory.BoosterPackCount; + } + + /// + /// Returns whether a specific card definition has been collected + /// + public bool IsCardCollected(string definitionId) + { + return playerInventory.CollectedCards.ContainsKey(definitionId); + } + } + + /// + /// Serializable class to store the player's card inventory + /// + [Serializable] + public class CardInventory + { + public Dictionary CollectedCards = new Dictionary(); + public int BoosterPackCount; + } +} diff --git a/Assets/Scripts/Data/CardSystem/CardSystemManager.cs.meta b/Assets/Scripts/Data/CardSystem/CardSystemManager.cs.meta new file mode 100644 index 00000000..dce5702f --- /dev/null +++ b/Assets/Scripts/Data/CardSystem/CardSystemManager.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 8d80347e4bd04c87be23a9399860783d +timeCreated: 1759923691 \ No newline at end of file diff --git a/Assets/Scripts/Data/CardSystem/CardVisualConfig.cs b/Assets/Scripts/Data/CardSystem/CardVisualConfig.cs new file mode 100644 index 00000000..9d1488f0 --- /dev/null +++ b/Assets/Scripts/Data/CardSystem/CardVisualConfig.cs @@ -0,0 +1,203 @@ +using System; +using System.Collections.Generic; +using UnityEngine; + +namespace AppleHills.Data.CardSystem +{ + /// + /// ScriptableObject containing visual configuration for card display + /// Maps card rarities to colors and zones to colors/shapes + /// + [CreateAssetMenu(fileName = "CardVisualConfig", menuName = "Apple Hills/Card System/Visual Config")] + public class CardVisualConfig : ScriptableObject + { + [Serializable] + public class RarityColorMapping + { + public CardRarity rarity; + public Color color = Color.white; + } + + [Serializable] + public class ZoneVisualMapping + { + public CardZone zone; + public Color color = Color.white; + public Sprite backgroundShape; + } + + [Header("Rarity Configuration")] + [Tooltip("Color mappings for different card rarities")] + [SerializeField] private List rarityColors = new List(); + + [Header("Zone Configuration")] + [Tooltip("Visual mappings for different card zones")] + [SerializeField] private List zoneVisuals = new List(); + + private Dictionary _rarityColorLookup; + private Dictionary _zoneColorLookup; + private Dictionary _zoneShapeLookup; + + /// + /// Initialize the lookup dictionaries when the asset is loaded + /// + private void OnEnable() + { + InitializeLookups(); + } + + /// + /// Builds the lookup dictionaries from the serialized lists + /// + private void InitializeLookups() + { + // Build rarity color lookup + _rarityColorLookup = new Dictionary(); + foreach (var mapping in rarityColors) + { + _rarityColorLookup[mapping.rarity] = mapping.color; + } + + // Build zone color and shape lookups + _zoneColorLookup = new Dictionary(); + _zoneShapeLookup = new Dictionary(); + + foreach (var mapping in zoneVisuals) + { + _zoneColorLookup[mapping.zone] = mapping.color; + _zoneShapeLookup[mapping.zone] = mapping.backgroundShape; + } + } + + /// + /// Get the color for a specific card rarity + /// + public Color GetRarityColor(CardRarity rarity) + { + // Initialize lookups if needed + if (_rarityColorLookup == null) + { + InitializeLookups(); + } + + // Return the color if found, otherwise white + if (_rarityColorLookup.TryGetValue(rarity, out Color color)) + { + return color; + } + + Debug.LogWarning($"[CardVisualConfig] No color mapping found for rarity {rarity}, using default"); + return Color.white; + } + + /// + /// Get the color for a specific card zone + /// + public Color GetZoneColor(CardZone zone) + { + // Initialize lookups if needed + if (_zoneColorLookup == null) + { + InitializeLookups(); + } + + // Return the color if found, otherwise white + if (_zoneColorLookup.TryGetValue(zone, out Color color)) + { + return color; + } + + Debug.LogWarning($"[CardVisualConfig] No color mapping found for zone {zone}, using default"); + return Color.white; + } + + /// + /// Get the background shape sprite for a specific zone + /// + public Sprite GetZoneShape(CardZone zone) + { + // Initialize lookups if needed + if (_zoneShapeLookup == null) + { + InitializeLookups(); + } + + // Return the sprite if found, otherwise null + if (_zoneShapeLookup.TryGetValue(zone, out Sprite sprite)) + { + return sprite; + } + + Debug.LogWarning($"[CardVisualConfig] No shape mapping found for zone {zone}"); + return null; + } + +#if UNITY_EDITOR + /// + /// Editor-only utility to reset the config with default values + /// + public void ResetWithDefaults() + { + // Clear existing mappings + rarityColors.Clear(); + zoneVisuals.Clear(); + + // Add default rarity colors + rarityColors.Add(new RarityColorMapping { rarity = CardRarity.Common, color = Color.gray }); + rarityColors.Add(new RarityColorMapping { rarity = CardRarity.Uncommon, color = Color.green }); + rarityColors.Add(new RarityColorMapping { rarity = CardRarity.Rare, color = Color.blue }); + rarityColors.Add(new RarityColorMapping { rarity = CardRarity.Epic, color = new Color(0.5f, 0, 0.5f) }); + rarityColors.Add(new RarityColorMapping { rarity = CardRarity.Legendary, color = Color.yellow }); + + // Add default zone colors + zoneVisuals.Add(new ZoneVisualMapping { + zone = CardZone.AppleHills, + color = new Color(0.8f, 0.9f, 0.8f) + }); + + zoneVisuals.Add(new ZoneVisualMapping { + zone = CardZone.Quarry, + color = new Color(0.85f, 0.8f, 0.7f) + }); + + zoneVisuals.Add(new ZoneVisualMapping { + zone = CardZone.Forest, + color = new Color(0.6f, 0.8f, 0.6f) + }); + + zoneVisuals.Add(new ZoneVisualMapping { + zone = CardZone.Mountain, + color = new Color(0.7f, 0.7f, 0.9f) + }); + + zoneVisuals.Add(new ZoneVisualMapping { + zone = CardZone.Beach, + color = new Color(0.9f, 0.85f, 0.7f) + }); + + // Initialize the lookups + InitializeLookups(); + } +#endif + } + +#if UNITY_EDITOR + [UnityEditor.CustomEditor(typeof(CardVisualConfig))] + public class CardVisualConfigEditor : UnityEditor.Editor + { + public override void OnInspectorGUI() + { + DrawDefaultInspector(); + + CardVisualConfig config = (CardVisualConfig)target; + + UnityEditor.EditorGUILayout.Space(); + if (GUILayout.Button("Reset with Defaults")) + { + config.ResetWithDefaults(); + UnityEditor.EditorUtility.SetDirty(config); + } + } + } +#endif +} diff --git a/Assets/Scripts/Data/CardSystem/CardVisualConfig.cs.meta b/Assets/Scripts/Data/CardSystem/CardVisualConfig.cs.meta new file mode 100644 index 00000000..05d43792 --- /dev/null +++ b/Assets/Scripts/Data/CardSystem/CardVisualConfig.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: a82f88f485b4410e9eb7c383b44557cf +timeCreated: 1759931508 \ No newline at end of file diff --git a/Assets/Scripts/Input/InputManager.cs b/Assets/Scripts/Input/InputManager.cs index 80d110ae..bb8929ad 100644 --- a/Assets/Scripts/Input/InputManager.cs +++ b/Assets/Scripts/Input/InputManager.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; // Added for List using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.InputSystem; @@ -27,6 +28,9 @@ namespace Input private static InputManager _instance; private static bool _isQuitting = false; + // Override consumer stack - using a list to support multiple overrides that can be removed in LIFO order + private readonly List _overrideConsumers = new List(); + public static InputManager Instance { get @@ -38,7 +42,6 @@ namespace Input { var go = new GameObject("InputManager"); _instance = go.AddComponent(); - // DontDestroyOnLoad(go); } } return _instance; @@ -58,7 +61,6 @@ namespace Input void Awake() { _instance = this; - // DontDestroyOnLoad(gameObject); // Initialize settings reference _interactionSettings = GameManager.GetSettingsObject(); @@ -157,23 +159,27 @@ namespace Input /// private void OnTapMovePerformed(InputAction.CallbackContext ctx) { - if (EventSystem.current.IsPointerOverGameObject()) - { - return; - } - Vector2 screenPos = positionAction.ReadValue(); Vector3 worldPos = Camera.main.ScreenToWorldPoint(screenPos); Vector2 worldPos2D = new Vector2(worldPos.x, worldPos.y); Debug.Log($"[InputManager] TapMove performed at {worldPos2D}"); - if (!TryDelegateToInteractable(worldPos2D)) + + // First try to delegate to an override consumer if available + if (TryDelegateToOverrideConsumer(screenPos, worldPos2D)) { - Debug.Log("[InputManager] No interactable found, forwarding tap to default consumer"); + Debug.Log("[InputManager] Tap delegated to override consumer"); + return; + } + + // Then try to delegate to any ITouchInputConsumer (UI or world interactable) + if (!TryDelegateToAnyInputConsumer(screenPos, worldPos2D)) + { + Debug.Log("[InputManager] No input consumer found, forwarding tap to default consumer"); defaultConsumer?.OnTap(worldPos2D); } else { - Debug.Log("[InputManager] Tap delegated to interactable"); + Debug.Log("[InputManager] Tap delegated to input consumer"); } } @@ -219,14 +225,84 @@ namespace Input } } + /// + /// Attempts to delegate a tap to any ITouchInputConsumer at the given position. + /// Checks both UI elements and world interactables. + /// + private bool TryDelegateToAnyInputConsumer(Vector2 screenPos, Vector2 worldPos) + { + // First check if we hit a UI element implementing ITouchInputConsumer + if (TryDelegateToUIInputConsumer(screenPos)) + { + return true; + } + + // If no UI element with ITouchInputConsumer, try world interactables + return TryDelegateToInteractable(worldPos); + } + + /// + /// Attempts to delegate a tap to a UI element implementing ITouchInputConsumer. + /// + private bool TryDelegateToUIInputConsumer(Vector2 screenPos) + { + // Check for UI elements under the pointer + var eventData = new PointerEventData(EventSystem.current) + { + position = screenPos + }; + + var results = new System.Collections.Generic.List(); + EventSystem.current.RaycastAll(eventData, results); + + foreach (var result in results) + { + // Try to get ITouchInputConsumer component + var consumer = result.gameObject.GetComponent(); + if (consumer == null) + { + consumer = result.gameObject.GetComponentInParent(); + } + if (consumer != null) + { + Debug.unityLogger.Log("Interactable", $"[InputManager] Delegating tap to UI consumer at {screenPos} (GameObject: {result.gameObject.name})"); + consumer.OnTap(screenPos); + return true; + } + } + + return false; + } + /// /// Attempts to delegate a tap to an interactable at the given world position. /// Traces on the "Interactable" channel and logs detailed info. /// private bool TryDelegateToInteractable(Vector2 worldPos) { - LayerMask mask = _interactionSettings != null ? _interactionSettings.InteractableLayerMask : -1; - Collider2D hit = Physics2D.OverlapPoint(worldPos, mask); + // First try with the interaction layer mask if available + if (_interactionSettings != null) + { + LayerMask mask = _interactionSettings.InteractableLayerMask; + Collider2D hitWithMask = Physics2D.OverlapPoint(worldPos, mask); + if (hitWithMask != null) + { + var consumer = hitWithMask.GetComponent(); + if (consumer == null) + { + consumer = hitWithMask.GetComponentInParent(); + } + if (consumer != null) + { + Debug.unityLogger.Log("Interactable", $"[InputManager] Delegating tap to consumer at {worldPos} (GameObject: {hitWithMask.gameObject.name})"); + consumer.OnTap(worldPos); + return true; + } + } + } + + // If no hit with the mask or no settings available, try with all colliders + Collider2D hit = Physics2D.OverlapPoint(worldPos); if (hit != null) { var consumer = hit.GetComponent(); @@ -244,5 +320,54 @@ namespace Input } return false; } + + /// + /// Registers an override consumer to receive input events. + /// The most recently registered consumer will receive input first. + /// + public void RegisterOverrideConsumer(ITouchInputConsumer consumer) + { + if (consumer == null || _overrideConsumers.Contains(consumer)) + return; + + _overrideConsumers.Add(consumer); + Debug.Log($"[InputManager] Override consumer registered: {consumer}"); + } + + /// + /// Unregisters an override consumer, removing it from the input event delegation. + /// + public void UnregisterOverrideConsumer(ITouchInputConsumer consumer) + { + if (consumer == null || !_overrideConsumers.Contains(consumer)) + return; + + _overrideConsumers.Remove(consumer); + Debug.Log($"[InputManager] Override consumer unregistered: {consumer}"); + } + + /// + /// Clears all registered override consumers. + /// + public void ClearOverrideConsumers() + { + _overrideConsumers.Clear(); + Debug.Log("[InputManager] All override consumers cleared."); + } + + /// + /// Attempts to delegate a tap to the topmost registered override consumer, if any. + /// + private bool TryDelegateToOverrideConsumer(Vector2 screenPos, Vector2 worldPos) + { + if (_overrideConsumers.Count == 0) + return false; + + // Get the topmost override consumer (last registered) + var consumer = _overrideConsumers[_overrideConsumers.Count - 1]; + Debug.unityLogger.Log("Interactable", $"[InputManager] Delegating tap to override consumer at {worldPos} (GameObject: {consumer})"); + consumer.OnTap(worldPos); + return true; + } } } diff --git a/Assets/Scripts/Minigames/DivingForPictures/Bubbles/Bubble.cs b/Assets/Scripts/Minigames/DivingForPictures/Bubbles/Bubble.cs index a50d8629..b01aad7c 100644 --- a/Assets/Scripts/Minigames/DivingForPictures/Bubbles/Bubble.cs +++ b/Assets/Scripts/Minigames/DivingForPictures/Bubbles/Bubble.cs @@ -20,7 +20,7 @@ namespace Minigames.DivingForPictures private float maxScale = 1.2f; private float baseScale = 1f; - private Camera mainCamera; + private UnityEngine.Camera mainCamera; private BubblePool parentPool; // Coroutine references @@ -48,7 +48,7 @@ namespace Minigames.DivingForPictures } // Cache camera reference - mainCamera = Camera.main; + mainCamera = UnityEngine.Camera.main; } private void OnEnable() @@ -78,7 +78,7 @@ namespace Minigames.DivingForPictures /// /// Resumes all bubble behaviors /// - public void Resume() + public void DoResume() { if (!_isPaused) return; // Already running @@ -94,7 +94,7 @@ namespace Minigames.DivingForPictures /// private void StartBubbleBehavior() { - if (_isPaused) return; // Don't start if paused + if (_isPaused || !isActiveAndEnabled) return; // Don't start if paused _movementCoroutine = StartCoroutine(MovementCoroutine()); _wobbleCoroutine = StartCoroutine(WobbleCoroutine()); diff --git a/Assets/Scripts/Minigames/DivingForPictures/Bubbles/BubbleSpawner.cs b/Assets/Scripts/Minigames/DivingForPictures/Bubbles/BubbleSpawner.cs index 101d353b..0d4b702f 100644 --- a/Assets/Scripts/Minigames/DivingForPictures/Bubbles/BubbleSpawner.cs +++ b/Assets/Scripts/Minigames/DivingForPictures/Bubbles/BubbleSpawner.cs @@ -1,6 +1,5 @@ using System.Collections; using UnityEngine; -using Pooling; using AppleHills.Core.Settings; using AppleHills.Core.Interfaces; @@ -20,7 +19,7 @@ namespace Minigames.DivingForPictures private float _timer; private float _nextSpawnInterval; private BubblePool _bubblePool; - private Camera _mainCamera; // Cache camera reference + private UnityEngine.Camera _mainCamera; // Cache camera reference private bool _isSurfacing = false; // Pause state @@ -34,7 +33,7 @@ namespace Minigames.DivingForPictures void Awake() { - _mainCamera = Camera.main; + _mainCamera = UnityEngine.Camera.main; // Get developer settings and game settings _devSettings = GameManager.GetDeveloperSettings(); @@ -67,12 +66,7 @@ namespace Minigames.DivingForPictures void Start() { - // Register with DivingGameManager for pause/resume events - DivingGameManager gameManager = FindFirstObjectByType(); - if (gameManager != null) - { - gameManager.RegisterPausableComponent(this); - } + DivingGameManager.Instance.RegisterPausableComponent(this); // Start spawning if not paused StartSpawningCoroutine(); @@ -80,12 +74,7 @@ namespace Minigames.DivingForPictures void OnDestroy() { - // Unregister from DivingGameManager - DivingGameManager gameManager = FindFirstObjectByType(); - if (gameManager != null) - { - gameManager.UnregisterPausableComponent(this); - } + DivingGameManager.Instance.UnregisterPausableComponent(this); // Clean up any active coroutines StopAllCoroutines(); @@ -123,7 +112,7 @@ namespace Minigames.DivingForPictures /// /// Resumes the bubble spawner and all bubbles /// - public void Resume() + public void DoResume() { if (!_isPaused) return; // Already running @@ -138,7 +127,7 @@ namespace Minigames.DivingForPictures { if (bubble != null) { - bubble.Resume(); + bubble.DoResume(); } } diff --git a/Assets/Scripts/Minigames/DivingForPictures/DivingGameManager.cs b/Assets/Scripts/Minigames/DivingForPictures/DivingGameManager.cs index 646ad61c..eed65640 100644 --- a/Assets/Scripts/Minigames/DivingForPictures/DivingGameManager.cs +++ b/Assets/Scripts/Minigames/DivingForPictures/DivingGameManager.cs @@ -2,12 +2,15 @@ using System.Collections.Generic; using System; using System.Collections; +using System.Linq; using UnityEngine.Events; using UnityEngine.Playables; using AppleHills.Core.Settings; using Utility; using AppleHills.Core.Interfaces; +using Input; using UI; +using Minigames.DivingForPictures.PictureCamera; namespace Minigames.DivingForPictures { @@ -24,9 +27,11 @@ namespace Minigames.DivingForPictures [Header("Surfacing Settings")] [Tooltip("Reference to the PlayableDirector that will play the surfacing timeline")] [SerializeField] private PlayableDirector surfacingTimeline; + + private CameraViewfinderManager viewfinderManager; // Settings reference - private IDivingMinigameSettings _settings; + private IDivingMinigameSettings settings; // Private state variables private int playerScore = 0; @@ -37,13 +42,13 @@ namespace Minigames.DivingForPictures // Velocity management // Velocity state tracking - private float _currentVelocityFactor = 1.0f; // 1.0 = normal descent speed, -1.0 * surfacingSpeedFactor = full surfacing speed - private Coroutine _velocityTransitionCoroutine; - private Coroutine _surfacingSequenceCoroutine; + private float currentVelocityFactor = 1.0f; // 1.0 = normal descent speed, -1.0 * surfacingSpeedFactor = full surfacing speed + private Coroutine velocityTransitionCoroutine; + private Coroutine surfacingSequenceCoroutine; // Public properties public int PlayerScore => playerScore; - public float CurrentVelocityFactor => _currentVelocityFactor; + public float CurrentVelocityFactor => currentVelocityFactor; // Events public event Action OnScoreChanged; @@ -76,18 +81,58 @@ namespace Minigames.DivingForPictures // IPausable implementation public bool IsPaused => _isPaused; + + // Photo sequence state + private bool _isPhotoSequenceActive = false; + private Monster _currentPhotoTarget = null; + private Dictionary _pauseStateBackup = new Dictionary(); + private float _capturedProximity = 0f; // New: tracks how close to target the photo was taken (0-1) + + // List of components to exempt from pausing during photo sequence + private List _exemptFromPhotoSequencePausing = new List(); + + // Photo sequence events + public event Action OnPhotoSequenceStarted; + public event Action OnPhotoSequenceCompleted; // Now includes proximity score + public event Action OnPhotoSequenceProgressUpdated; + + private static DivingGameManager _instance; + private static bool _isQuitting = false; + public static DivingGameManager Instance + { + get + { + if (_instance == null && Application.isPlaying && !_isQuitting) + { + _instance = FindAnyObjectByType(); + if (_instance == null) + { + var go = new GameObject("DivingGameManager"); + _instance = go.AddComponent(); + } + } + return _instance; + } + } private void Awake() { - // Get settings from GameManager - _settings = GameManager.GetSettingsObject(); - if (_settings == null) - { - Debug.LogError("[DivingGameManager] Failed to load diving minigame settings!"); - } + settings = GameManager.GetSettingsObject(); + currentSpawnProbability = settings?.BaseSpawnProbability ?? 0.2f; - // Initialize with base probability from settings - currentSpawnProbability = _settings?.BaseSpawnProbability ?? 0.2f; + if (_instance == null) + { + _instance = this; + } + else if (_instance != this) + { + Destroy(gameObject); + } + } + + private void OnApplicationQuit() + { + _isQuitting = true; } private void Start() @@ -97,7 +142,7 @@ namespace Minigames.DivingForPictures if (pauseMenu != null) { pauseMenu.OnGamePaused += Pause; - pauseMenu.OnGameResumed += Resume; + pauseMenu.OnGameResumed += DoResume; Debug.Log("[DivingGameManager] Subscribed to PauseMenu events"); } @@ -135,35 +180,26 @@ namespace Minigames.DivingForPictures // Validate rope references (this doesn't depend on initialization) ValidateRopeReferences(); - } - /// - /// Initializes the game components once the orientation is correct. - /// This is called by SceneOrientationEnforcer when the device is properly oriented. - /// - public void InitializeGame() - { - // Prevent double initialization - if (_isGameInitialized) return; + viewfinderManager = CameraViewfinderManager.Instance; - Debug.Log("[DivingGameManager] Initializing game"); - - // Subscribe to tile spawned event - TrenchTileSpawner tileSpawner = FindFirstObjectByType(); - if (tileSpawner != null) + // Subscribe to viewfinder events if found + if (viewfinderManager != null) { - tileSpawner.onTileSpawned.AddListener(OnTileSpawned); - } - else - { - Debug.LogWarning("No TrenchTileSpawner found in scene. Monster spawning won't work."); + viewfinderManager.OnAnimationCompleted += OnViewfinderAnimationCompleted; + viewfinderManager.OnViewfinderTapped += OnViewfinderTapped; + viewfinderManager.OnProximityUpdated += OnProximityUpdated; + viewfinderManager.OnViewfinderTappedDuringAnimation += OnViewfinderTappedDuringAnimation; + viewfinderManager.OnReverseAnimationStarted += OnReverseAnimationStarted; + + // Add the viewfinder manager to exempt list to ensure it keeps working during photo sequences + if (viewfinderManager is IPausable viewfinderPausable) + { + RegisterExemptFromPhotoSequencePausing(viewfinderPausable); + } } - // Mark as initialized - _isGameInitialized = true; - - // Notify all listeners that the game is initialized - OnGameInitialized?.Invoke(); + OnMonsterSpawned += DoMonsterSpawned; } private void OnDestroy() @@ -181,7 +217,7 @@ namespace Minigames.DivingForPictures if (pauseMenu != null) { pauseMenu.OnGamePaused -= Pause; - pauseMenu.OnGameResumed -= Resume; + pauseMenu.OnGameResumed -= DoResume; } // Unregister from GameManager @@ -192,6 +228,16 @@ namespace Minigames.DivingForPictures // Unregister all pausable components _pausableComponents.Clear(); + + // Unsubscribe from viewfinder events + if (viewfinderManager != null) + { + viewfinderManager.OnAnimationCompleted -= OnViewfinderAnimationCompleted; + viewfinderManager.OnViewfinderTapped -= OnViewfinderTapped; + viewfinderManager.OnProximityUpdated -= OnProximityUpdated; + viewfinderManager.OnViewfinderTappedDuringAnimation -= OnViewfinderTappedDuringAnimation; + viewfinderManager.OnReverseAnimationStarted -= OnReverseAnimationStarted; + } } private void Update() @@ -200,10 +246,10 @@ namespace Minigames.DivingForPictures // Gradually increase spawn probability over time float previousProbability = currentSpawnProbability; - if (currentSpawnProbability < _settings.MaxSpawnProbability) + if (currentSpawnProbability < settings.MaxSpawnProbability) { - currentSpawnProbability += _settings.ProbabilityIncreaseRate * Time.deltaTime; - currentSpawnProbability = Mathf.Min(currentSpawnProbability, _settings.MaxSpawnProbability); + currentSpawnProbability += settings.ProbabilityIncreaseRate * Time.deltaTime; + currentSpawnProbability = Mathf.Min(currentSpawnProbability, settings.MaxSpawnProbability); // Only fire event if probability changed significantly if (Mathf.Abs(currentSpawnProbability - previousProbability) > 0.01f) @@ -223,8 +269,8 @@ namespace Minigames.DivingForPictures // If we're surfacing, don't spawn new monsters if (_isSurfacing) return; - bool forceSpawn = timeSinceLastSpawn >= _settings.GuaranteedSpawnTime; - bool onCooldown = timeSinceLastSpawn < _settings.SpawnCooldown; + bool forceSpawn = timeSinceLastSpawn >= settings.GuaranteedSpawnTime; + bool onCooldown = timeSinceLastSpawn < settings.SpawnCooldown; // Don't spawn if on cooldown, unless forced if (onCooldown && !forceSpawn) return; @@ -241,7 +287,7 @@ namespace Minigames.DivingForPictures // Reset timer and adjust probability lastSpawnTime = Time.time; timeSinceLastSpawn = 0f; - currentSpawnProbability = _settings.BaseSpawnProbability; + currentSpawnProbability = settings.BaseSpawnProbability; OnSpawnProbabilityChanged?.Invoke(currentSpawnProbability); } } @@ -265,14 +311,7 @@ namespace Minigames.DivingForPictures { // Parent the monster to the spawn point so it moves with the tile monsterObj.transform.SetParent(spawnPoint); - - // Subscribe to monster events - monster.OnPictureTaken += OnMonsterPictureTaken; - monster.OnMonsterDespawned += OnMonsterDespawned; - - // Add to active monsters list - activeMonsters.Add(monster); - + // Fire event OnMonsterSpawned?.Invoke(monster); } @@ -283,11 +322,11 @@ namespace Minigames.DivingForPictures } } - private void OnMonsterPictureTaken(Monster monster) + private void DoPictureTaken(Monster monster) { // Calculate points based on depth - int depthBonus = Mathf.FloorToInt(Mathf.Abs(monster.transform.position.y) * _settings.DepthMultiplier); - int pointsAwarded = _settings.BasePoints + depthBonus; + int depthBonus = Mathf.FloorToInt(Mathf.Abs(monster.transform.position.y) * settings.DepthMultiplier); + int pointsAwarded = settings.BasePoints + depthBonus; // Add score playerScore += pointsAwarded; @@ -296,17 +335,7 @@ namespace Minigames.DivingForPictures OnScoreChanged?.Invoke(playerScore); OnPictureTaken?.Invoke(monster, pointsAwarded); } - - private void OnMonsterDespawned(Monster monster) - { - // Remove from active list - activeMonsters.Remove(monster); - - // Unsubscribe from events - monster.OnPictureTaken -= OnMonsterPictureTaken; - monster.OnMonsterDespawned -= OnMonsterDespawned; - } - + /// /// Called when the player takes damage from any collision /// @@ -438,7 +467,7 @@ namespace Minigames.DivingForPictures _isSurfacing = true; // 1. Initiate smooth velocity transition to surfacing speed - float targetVelocityFactor = -1.0f * _settings.SurfacingSpeedFactor; + float targetVelocityFactor = -1.0f * settings.SurfacingSpeedFactor; SetVelocityFactor(targetVelocityFactor); // 2. Find and notify trench tile spawner about direction change (for spawning/despawning logic) @@ -457,7 +486,7 @@ namespace Minigames.DivingForPictures tileSpawner.StartSurfacing(); // Immediately send current velocity factor - tileSpawner.OnVelocityFactorChanged(_currentVelocityFactor); + tileSpawner.OnVelocityFactorChanged(currentVelocityFactor); } // Handle the Rock object - disable components and animate it falling offscreen @@ -525,15 +554,15 @@ namespace Minigames.DivingForPictures obstacleSpawner.StartSurfacing(); // Immediately send current velocity factor - obstacleSpawner.OnVelocityFactorChanged(_currentVelocityFactor); + obstacleSpawner.OnVelocityFactorChanged(currentVelocityFactor); } // Start the surfacing sequence coroutine - if (_surfacingSequenceCoroutine != null) + if (surfacingSequenceCoroutine != null) { - StopCoroutine(_surfacingSequenceCoroutine); + StopCoroutine(surfacingSequenceCoroutine); } - _surfacingSequenceCoroutine = StartCoroutine(SurfacingSequence()); + surfacingSequenceCoroutine = StartCoroutine(SurfacingSequence()); Debug.Log($"[DivingGameManager] Started surfacing with target velocity factor: {targetVelocityFactor}"); } @@ -546,7 +575,7 @@ namespace Minigames.DivingForPictures Vector3 startPosition = rockTransform.position; // Calculate position below the screen - Camera mainCamera = Camera.main; + UnityEngine.Camera mainCamera = UnityEngine.Camera.main; if (mainCamera == null) { Debug.LogWarning("[DivingGameManager] Cannot find main camera to calculate offscreen position"); @@ -609,7 +638,7 @@ namespace Minigames.DivingForPictures private IEnumerator SurfacingSequence() { // Wait for the configured delay - yield return new WaitForSeconds(_settings.SurfacingSpawnDelay); + yield return new WaitForSeconds(settings.SurfacingSpawnDelay); // Find tile spawner and tell it to stop spawning TrenchTileSpawner tileSpawner = FindFirstObjectByType(); @@ -662,12 +691,12 @@ namespace Minigames.DivingForPictures /// Target velocity factor (e.g., -1.0 for surfacing speed) public void SetVelocityFactor(float targetFactor) { - if (_velocityTransitionCoroutine != null) + if (velocityTransitionCoroutine != null) { - StopCoroutine(_velocityTransitionCoroutine); + StopCoroutine(velocityTransitionCoroutine); } - _velocityTransitionCoroutine = StartCoroutine(TransitionVelocityFactor(targetFactor)); + velocityTransitionCoroutine = StartCoroutine(TransitionVelocityFactor(targetFactor)); } /// @@ -675,29 +704,29 @@ namespace Minigames.DivingForPictures /// private IEnumerator TransitionVelocityFactor(float targetFactor) { - float startFactor = _currentVelocityFactor; + float startFactor = currentVelocityFactor; float elapsed = 0f; - while (elapsed < _settings.SpeedTransitionDuration) + while (elapsed < settings.SpeedTransitionDuration) { elapsed += Time.deltaTime; - float t = Mathf.Clamp01(elapsed / _settings.SpeedTransitionDuration); + float t = Mathf.Clamp01(elapsed / settings.SpeedTransitionDuration); // Smooth step interpolation float smoothStep = t * t * (3f - 2f * t); - _currentVelocityFactor = Mathf.Lerp(startFactor, targetFactor, smoothStep); + currentVelocityFactor = Mathf.Lerp(startFactor, targetFactor, smoothStep); // Notify listeners about the velocity factor change - OnVelocityFactorChanged?.Invoke(_currentVelocityFactor); + OnVelocityFactorChanged?.Invoke(currentVelocityFactor); yield return null; } - _currentVelocityFactor = targetFactor; + currentVelocityFactor = targetFactor; // Final assignment to ensure exact target value - OnVelocityFactorChanged?.Invoke(_currentVelocityFactor); + OnVelocityFactorChanged?.Invoke(currentVelocityFactor); } /// @@ -737,6 +766,11 @@ namespace Minigames.DivingForPictures /// Pause the game and all registered components /// public void Pause() + { + DoPause(); + } + + public void DoPause(bool turnOffGameInput = true) { if (_isPaused) return; // Already paused @@ -748,13 +782,17 @@ namespace Minigames.DivingForPictures component.Pause(); } + // Change input mode to UI when menu is open + if(turnOffGameInput) + InputManager.Instance.SetInputMode(InputMode.UI); + Debug.Log($"[DivingGameManager] Game paused. Paused {_pausableComponents.Count} components."); } /// /// Resume the game and all registered components /// - public void Resume() + public void DoResume() { if (!_isPaused) return; // Already running @@ -763,10 +801,281 @@ namespace Minigames.DivingForPictures // Resume all registered components foreach (var component in _pausableComponents) { - component.Resume(); + component.DoResume(); } + // Change input mode to UI when menu is open + InputManager.Instance.SetInputMode(InputMode.GameAndUI); + Debug.Log($"[DivingGameManager] Game resumed. Resumed {_pausableComponents.Count} components."); } + + #region Photo Sequence Methods + + /// + /// Called when the viewfinder animation phase changes to reverse (zoom out) + /// + private void OnReverseAnimationStarted() + { + Debug.Log("[DivingGameManager] Viewfinder animation entering reverse (zoom-out) phase"); + } + + /// + /// Called when proximity value is updated during animation + /// + private void OnProximityUpdated(float proximity) + { + // Store the current proximity value for potential use in scoring + _capturedProximity = proximity; + } + + /// + /// Called when the player taps during the viewfinder animation + /// + private void OnViewfinderTappedDuringAnimation(float proximity) + { + if (!_isPhotoSequenceActive || _currentPhotoTarget == null) + return; + + // Store the proximity value at the time of tap for scoring + _capturedProximity = proximity; + + Debug.Log($"[DivingGameManager] Player tapped during animation! Proximity: {proximity:F2}"); + + // Take the picture at the current proximity + TakePicture(); + } + + /// + /// Takes the picture with the current proximity value for scoring + /// + private void TakePicture() + { + if (!_isPhotoSequenceActive || _currentPhotoTarget == null) + return; + + // Notify the monster that its picture was taken + _currentPhotoTarget.NotifyPictureTaken(); + + // Calculate score based on proximity and depth + CalculateScore(_currentPhotoTarget, _capturedProximity); + + // Complete the sequence + CompletePhotoSequence(); + } + + /// + /// Calculates the score for a picture based on proximity to target and monster depth + /// + private void CalculateScore(Monster monster, float proximity) + { + if (monster == null) return; + + // Calculate base points from depth + int depthBonus = Mathf.FloorToInt(Mathf.Abs(monster.transform.position.y) * settings.DepthMultiplier); + + // Apply proximity multiplier (0-100%) + float proximityMultiplier = Mathf.Clamp01(proximity); // Ensure it's in 0-1 range + int proximityBonus = Mathf.RoundToInt(settings.BasePoints * proximityMultiplier); + + // Calculate total score + int pointsAwarded = settings.BasePoints + proximityBonus + depthBonus; + + Debug.Log($"[DivingGameManager] Picture score calculation: base={proximityBonus} (proximity={proximity:F2}), " + + $"depth bonus={depthBonus}, total={pointsAwarded}"); + + // Add score + playerScore += pointsAwarded; + + // Fire events + OnScoreChanged?.Invoke(playerScore); + OnPictureTaken?.Invoke(monster, pointsAwarded); + } + + /// + /// Handles completion of the viewfinder animation + /// + private void OnViewfinderAnimationCompleted() + { + if (!_isPhotoSequenceActive || _currentPhotoTarget == null) + return; + + // Take the picture at whatever the final proximity was + TakePicture(); + } + + /// + /// Cleans up and completes the picture-taking sequence + /// + private void CompletePhotoSequence() + { + if (!_isPhotoSequenceActive) + return; + + // Notify listeners that photo sequence has completed (with proximity score) + if (_currentPhotoTarget != null) + { + OnPhotoSequenceCompleted?.Invoke(_currentPhotoTarget, _capturedProximity); + + // We no longer despawn the monster after taking a picture + // _currentPhotoTarget.Despawn(false); + + // Just mark the photo sequence as no longer in progress + _currentPhotoTarget.NotifyPictureTaken(); + } + + DoResume(); + + // Reset state + _isPhotoSequenceActive = false; + _currentPhotoTarget = null; + + Debug.Log($"[DivingGameManager] Completed photo sequence with proximity score: {_capturedProximity:F2}"); + } + + /// + /// Register a component to be exempt from pausing during photo sequence + /// + public void RegisterExemptFromPhotoSequencePausing(IPausable component) + { + if (!_exemptFromPhotoSequencePausing.Contains(component)) + { + _exemptFromPhotoSequencePausing.Add(component); + } + } + + #endregion + + #region Game Initialization + + /// + /// Initializes the game components once the orientation is correct. + /// This is called by SceneOrientationEnforcer when the device is properly oriented. + /// + public void InitializeGame() + { + // Prevent double initialization + if (_isGameInitialized) return; + + Debug.Log("[DivingGameManager] Initializing game"); + + // Subscribe to tile spawned event + TrenchTileSpawner tileSpawner = FindFirstObjectByType(); + if (tileSpawner != null) + { + tileSpawner.onTileSpawned.AddListener(OnTileSpawned); + } + else + { + Debug.LogWarning("No TrenchTileSpawner found in scene. Monster spawning won't work."); + } + + // Mark as initialized + _isGameInitialized = true; + + // Notify all listeners that the game is initialized + OnGameInitialized?.Invoke(); + } + + #endregion + + private void DoMonsterSpawned(Monster monster) + { + if (monster != null) + { + // Subscribe to monster enter/exit events + monster.OnPlayerEnterDetectionRange += OnPlayerEnterMonsterRange; + monster.OnPlayerExitDetectionRange += OnPlayerExitMonsterRange; + monster.OnMonsterDespawned += DoMonsterDespawned; + + // Add to active monsters list + activeMonsters.Add(monster); + } + } + + private void DoMonsterDespawned(Monster monster) + { + // Remove from active list + activeMonsters.Remove(monster); + + // Unsubscribe from monster events + if (monster != null) + { + monster.OnPlayerEnterDetectionRange -= OnPlayerEnterMonsterRange; + monster.OnPlayerExitDetectionRange -= OnPlayerExitMonsterRange; + monster.OnMonsterDespawned -= DoMonsterDespawned; + } + } + + // Handles player entering monster detection range + private void OnPlayerEnterMonsterRange(Monster monster) + { + if (monster != null && !_isPhotoSequenceActive) + { + // Store current target for later use + _currentPhotoTarget = monster; + + // Show the full-screen viewfinder (first step in two-step process) + if (viewfinderManager != null) + { + viewfinderManager.ShowFullScreenViewfinder(); + Debug.Log($"[DivingGameManager] Player entered range of monster {monster.name}, showing full-screen viewfinder"); + } + } + } + + // Handles player exiting monster detection range + private void OnPlayerExitMonsterRange(Monster monster) + { + // Only hide viewfinder if we're not already in a photo sequence + if (!_isPhotoSequenceActive && monster == _currentPhotoTarget) + { + // Hide the viewfinder + if (viewfinderManager != null) + { + viewfinderManager.HideViewfinder(); + Debug.Log($"[DivingGameManager] Player exited range of monster {monster.name}, hiding viewfinder"); + } + + // Clear current target + _currentPhotoTarget = null; + } + } + + // Called when the player taps on the viewfinder + private void OnViewfinderTapped() + { + // Only proceed if we have a valid target and not already in a sequence + if (_currentPhotoTarget != null && !_isPhotoSequenceActive && _currentPhotoTarget.IsPlayerInDetectionRange) + { + // Pause the game immediately + DoPause(false); + Debug.Log($"[DivingGameManager] Pausing game before starting viewfinder animation"); + + // Mark the photo sequence as active + _isPhotoSequenceActive = true; + + // Mark monster as in photo sequence + _currentPhotoTarget.SetPhotoSequenceInProgress(); + + // Reset captured proximity + _capturedProximity = 0f; + + // Notify listeners that photo sequence has started + OnPhotoSequenceStarted?.Invoke(_currentPhotoTarget); + + // Start the complete animation sequence to target monster + if (viewfinderManager != null) + { + viewfinderManager.StartViewfinderSequence(_currentPhotoTarget.transform); + Debug.Log($"[DivingGameManager] Viewfinder tapped for monster {_currentPhotoTarget.name}, starting animation sequence"); + } + else + { + Debug.LogError("[DivingGameManager] No ViewfinderManager available!"); + CompletePhotoSequence(); + } + } + } } } diff --git a/Assets/Scripts/Minigames/DivingForPictures/DivingScoreUI.cs b/Assets/Scripts/Minigames/DivingForPictures/DivingScoreUI.cs index 81f39524..ddc6128f 100644 --- a/Assets/Scripts/Minigames/DivingForPictures/DivingScoreUI.cs +++ b/Assets/Scripts/Minigames/DivingForPictures/DivingScoreUI.cs @@ -9,25 +9,15 @@ namespace Minigames.DivingForPictures [SerializeField] private GameObject scorePopupPrefab; [SerializeField] private Transform popupParent; - private DivingGameManager gameManager; - private void Start() { - gameManager = FindFirstObjectByType(); + // Subscribe to events + DivingGameManager.Instance.OnScoreChanged += UpdateScoreDisplay; + DivingGameManager.Instance.OnPictureTaken += ShowScorePopup; - if (gameManager != null) - { - // Subscribe to events - gameManager.OnScoreChanged += UpdateScoreDisplay; - gameManager.OnPictureTaken += ShowScorePopup; - - // Initialize display - UpdateScoreDisplay(gameManager.PlayerScore); - } - else - { - Debug.LogWarning("No DivingGameManager found in scene."); - } + // Initialize display + UpdateScoreDisplay(DivingGameManager.Instance.PlayerScore); + // Create popup parent if needed if (popupParent == null) @@ -38,12 +28,9 @@ namespace Minigames.DivingForPictures private void OnDestroy() { - if (gameManager != null) - { - // Unsubscribe from events - gameManager.OnScoreChanged -= UpdateScoreDisplay; - gameManager.OnPictureTaken -= ShowScorePopup; - } + // Unsubscribe from events + DivingGameManager.Instance.OnScoreChanged -= UpdateScoreDisplay; + DivingGameManager.Instance.OnPictureTaken -= ShowScorePopup; } private void UpdateScoreDisplay(int score) diff --git a/Assets/Scripts/Minigames/DivingForPictures/Monster/Monster.cs b/Assets/Scripts/Minigames/DivingForPictures/Monster/Monster.cs index 5320fc6c..5e30a5ad 100644 --- a/Assets/Scripts/Minigames/DivingForPictures/Monster/Monster.cs +++ b/Assets/Scripts/Minigames/DivingForPictures/Monster/Monster.cs @@ -10,22 +10,29 @@ namespace Minigames.DivingForPictures [SerializeField] private CircleCollider2D detectionCollider; private bool pictureAlreadyTaken = false; - private Camera mainCamera; + private bool photoSequenceInProgress = false; + private UnityEngine.Camera mainCamera; + // Track if player is in detection range + private bool playerInDetectionRange = false; + // Events - public event Action OnPictureTaken; - public event Action OnMonsterSpawned; public event Action OnMonsterDespawned; + public event Action OnPlayerEnterDetectionRange; + public event Action OnPlayerExitDetectionRange; // Properties public float PictureRadius => detectionCollider != null ? detectionCollider.radius : 0f; + public bool IsPhotoSequenceInProgress => photoSequenceInProgress; + public bool IsPlayerInDetectionRange => playerInDetectionRange; + public bool IsPictureTaken => pictureAlreadyTaken; private void Awake() { if (detectionCollider == null) detectionCollider = GetComponent(); - mainCamera = Camera.main; + mainCamera = UnityEngine.Camera.main; // Start checking if monster is off-screen StartCoroutine(CheckIfOffScreen()); @@ -34,7 +41,7 @@ namespace Minigames.DivingForPictures private void OnEnable() { pictureAlreadyTaken = false; - OnMonsterSpawned?.Invoke(this); + photoSequenceInProgress = false; } private IEnumerator CheckIfOffScreen() @@ -56,7 +63,7 @@ namespace Minigames.DivingForPictures private bool IsVisibleToCamera() { if (mainCamera == null) - mainCamera = Camera.main; + mainCamera = UnityEngine.Camera.main; if (mainCamera == null) return false; @@ -81,18 +88,67 @@ namespace Minigames.DivingForPictures // Check if it's the player if (other.CompareTag("Player") && !pictureAlreadyTaken) { - TakePicture(); + playerInDetectionRange = true; + // Fire the event so the game manager can display the viewfinder without pausing + OnPlayerEnterDetectionRange?.Invoke(this); } } - // Called when a picture is taken of this monster - public void TakePicture() + private void OnTriggerExit2D(Collider2D other) + { + // Check if it's the player + if (other.CompareTag("Player")) + { + playerInDetectionRange = false; + // Fire the event so the game manager can hide the viewfinder + OnPlayerExitDetectionRange?.Invoke(this); + } + } + + /// + /// Mark this monster as having its photo sequence in progress + /// + public void SetPhotoSequenceInProgress(bool inProgress = true) + { + if (pictureAlreadyTaken) return; + photoSequenceInProgress = inProgress; + } + + /// + /// Notify that a picture has been taken of this monster + /// This is now called by DivingGameManager instead of handling the logic internally + /// + public void NotifyPictureTaken() { if (pictureAlreadyTaken) return; pictureAlreadyTaken = true; - OnPictureTaken?.Invoke(this); + photoSequenceInProgress = false; + } + /// + /// Despawn this monster (can be called externally) + /// + /// Whether to despawn immediately or after a delay + public void Despawn(bool immediate = false) + { + if (immediate) + { + DespawnMonster(); + } + else + { + // Add small delay before despawning + StartCoroutine(DelayedDespawn()); + } + } + + /// + /// Coroutine to despawn after a short delay + /// + private IEnumerator DelayedDespawn() + { + yield return new WaitForSeconds(1.0f); // 1-second delay before despawn DespawnMonster(); } @@ -106,20 +162,7 @@ namespace Minigames.DivingForPictures Destroy(gameObject); } } - - // Visualization for the picture radius in editor - private void OnDrawGizmosSelected() - { - // Get the collider in edit mode - if (detectionCollider == null) - detectionCollider = GetComponent(); - - if (detectionCollider != null) - { - Gizmos.color = Color.yellow; - Gizmos.DrawWireSphere(transform.position, detectionCollider.radius / 2); - } - } + #if UNITY_EDITOR // Update collider radius in editor diff --git a/Assets/Scripts/Minigames/DivingForPictures/Obstacles/FloatingObstacle.cs b/Assets/Scripts/Minigames/DivingForPictures/Obstacles/FloatingObstacle.cs index 4ad62ade..a6fd12e9 100644 --- a/Assets/Scripts/Minigames/DivingForPictures/Obstacles/FloatingObstacle.cs +++ b/Assets/Scripts/Minigames/DivingForPictures/Obstacles/FloatingObstacle.cs @@ -45,7 +45,7 @@ namespace Minigames.DivingForPictures // Private fields private Collider2D _collider; - private Camera _mainCamera; + private UnityEngine.Camera _mainCamera; private float _screenTop; private float _screenBottom; // Added to track bottom of screen private Coroutine _movementCoroutine; @@ -78,7 +78,7 @@ namespace Minigames.DivingForPictures Debug.LogError($"[FloatingObstacle] No Collider2D found on {gameObject.name}!"); } - _mainCamera = Camera.main; + _mainCamera = UnityEngine.Camera.main; // Get settings _settings = GameManager.GetSettingsObject(); @@ -153,7 +153,7 @@ namespace Minigames.DivingForPictures /// /// Resume this obstacle's movement and behavior /// - public void Resume() + public void DoResume() { if (!_isPaused) return; // Already running @@ -168,6 +168,9 @@ namespace Minigames.DivingForPictures /// private void StartObstacleCoroutines() { + if (!isActiveAndEnabled) + return; + if (enableMovement && _movementCoroutine == null) { _movementCoroutine = StartCoroutine(MovementCoroutine()); @@ -281,7 +284,7 @@ namespace Minigames.DivingForPictures { if (_mainCamera == null) { - _mainCamera = Camera.main; + _mainCamera = UnityEngine.Camera.main; if (_mainCamera == null) return; } @@ -357,7 +360,7 @@ namespace Minigames.DivingForPictures { // Reset all state first _screenTop = 0f; // Reset cached screen bounds - _mainCamera = Camera.main; // Refresh camera reference + _mainCamera = UnityEngine.Camera.main; // Refresh camera reference // Re-enable the collider for reuse if (_collider != null) diff --git a/Assets/Scripts/Minigames/DivingForPictures/Obstacles/ObstacleSpawner.cs b/Assets/Scripts/Minigames/DivingForPictures/Obstacles/ObstacleSpawner.cs index e03bd5ec..65dc729a 100644 --- a/Assets/Scripts/Minigames/DivingForPictures/Obstacles/ObstacleSpawner.cs +++ b/Assets/Scripts/Minigames/DivingForPictures/Obstacles/ObstacleSpawner.cs @@ -31,7 +31,7 @@ namespace Minigames.DivingForPictures // Private fields private ObstaclePool _obstaclePool; - private Camera _mainCamera; + private UnityEngine.Camera _mainCamera; private float _screenBottom; private float _spawnRangeX; private Coroutine _spawnCoroutine; @@ -50,7 +50,7 @@ namespace Minigames.DivingForPictures private void Awake() { - _mainCamera = Camera.main; + _mainCamera = UnityEngine.Camera.main; // Get settings from GameManager _settings = GameManager.GetSettingsObject(); @@ -84,38 +84,23 @@ namespace Minigames.DivingForPictures private void Start() { - // Find DivingGameManager and subscribe to its initialization event - DivingGameManager gameManager = FindFirstObjectByType(); - if (gameManager != null) + DivingGameManager.Instance.OnGameInitialized += Initialize; + + // Register with the DivingGameManager for pause/resume events + DivingGameManager.Instance.RegisterPausableComponent(this); + + // If game is already initialized, initialize immediately + if (DivingGameManager.Instance.GetType().GetField("_isGameInitialized", + System.Reflection.BindingFlags.NonPublic | + System.Reflection.BindingFlags.Instance)?.GetValue(DivingGameManager.Instance) is bool isInitialized && isInitialized) { - gameManager.OnGameInitialized += Initialize; - - // Register with the DivingGameManager for pause/resume events - gameManager.RegisterPausableComponent(this); - - // If game is already initialized, initialize immediately - if (gameManager.GetType().GetField("_isGameInitialized", - System.Reflection.BindingFlags.NonPublic | - System.Reflection.BindingFlags.Instance)?.GetValue(gameManager) is bool isInitialized && isInitialized) - { - Initialize(); - } - } - else - { - Debug.LogWarning("[ObstacleSpawner] DivingGameManager not found. Initializing immediately."); Initialize(); } } private void OnDestroy() { - // Unregister from DivingGameManager - DivingGameManager gameManager = FindFirstObjectByType(); - if (gameManager != null) - { - gameManager.UnregisterPausableComponent(this); - } + DivingGameManager.Instance.UnregisterPausableComponent(this); // Clean up any active coroutines StopAllCoroutines(); @@ -172,7 +157,7 @@ namespace Minigames.DivingForPictures /// /// Resumes the spawner and all associated processes /// - public void Resume() + public void DoResume() { if (!_isPaused) return; // Already running @@ -192,7 +177,7 @@ namespace Minigames.DivingForPictures FloatingObstacle obstacleComponent = obstacle.GetComponent(); if (obstacleComponent != null) { - obstacleComponent.Resume(); + obstacleComponent.DoResume(); } } } @@ -314,7 +299,7 @@ namespace Minigames.DivingForPictures { if (_mainCamera == null) { - _mainCamera = Camera.main; + _mainCamera = UnityEngine.Camera.main; if (_mainCamera == null) { Debug.LogError("[ObstacleSpawner] No main camera found!"); @@ -751,7 +736,7 @@ namespace Minigames.DivingForPictures if (_mainCamera == null) { - _mainCamera = Camera.main; + _mainCamera = UnityEngine.Camera.main; if (_mainCamera == null) { yield return new WaitForSeconds(checkInterval); diff --git a/Assets/Scripts/Minigames/DivingForPictures/PictureCamera.meta b/Assets/Scripts/Minigames/DivingForPictures/PictureCamera.meta new file mode 100644 index 00000000..0fb855cd --- /dev/null +++ b/Assets/Scripts/Minigames/DivingForPictures/PictureCamera.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: ddda7563ddf04d63ae19527266695bd2 +timeCreated: 1760016807 \ No newline at end of file diff --git a/Assets/Scripts/Minigames/DivingForPictures/PictureCamera/CameraViewfinderManager.cs b/Assets/Scripts/Minigames/DivingForPictures/PictureCamera/CameraViewfinderManager.cs new file mode 100644 index 00000000..85973ef7 --- /dev/null +++ b/Assets/Scripts/Minigames/DivingForPictures/PictureCamera/CameraViewfinderManager.cs @@ -0,0 +1,776 @@ +using UnityEngine; +using System; +using System.Collections; +using AppleHills.Core.Settings; + +namespace Minigames.DivingForPictures.PictureCamera +{ + /// + /// Manages the camera viewfinder visual representation and animation + /// Responsible only for visual aspects with no game logic + /// + public class CameraViewfinderManager : MonoBehaviour + { + // Singleton instance + private static CameraViewfinderManager _instance; + private static bool _isQuitting = false; + + public static CameraViewfinderManager Instance + { + get + { + if (_instance == null && Application.isPlaying && !_isQuitting) + { + _instance = FindAnyObjectByType(); + if (_instance == null) + { + var go = new GameObject("CameraViewfinderManager"); + _instance = go.AddComponent(); + } + } + + return _instance; + } + } + + [Header("References")] [Tooltip("The Canvas to spawn the viewfinder UI on")] [SerializeField] + private Canvas targetCanvas; + + // References + private GameObject viewfinderInstance; + private RectTransform viewfinderRectTransform; + private Viewfinder viewfinderComponent; + private UnityEngine.Camera mainCamera; + + // Animation state + private float animationProgress = 0f; + private bool isAnimating = false; + private bool isReversePhase = false; // Whether we're in the zoom-out phase + private float currentProximity = 0f; // How close we are to the target (0=far, 1=directly over target) + private Transform targetTransform; + private Coroutine animationCoroutine; + + // Target position and size (calculated once at start) + private Vector3 targetScreenPosition; + private float targetViewfinderSize; + private Vector2 targetAnchoredPosition; // target position in canvas units + + // Store settings + private IDivingMinigameSettings settings; + + // Events for progress milestones + public event Action OnProgressUpdated; // Continuous progress updates (0-1) + public event Action OnAnimationStarted; + public event Action OnAnimationCompleted; + public event Action OnReverseAnimationStarted; // New event for when zoom-out phase starts + public event Action OnProximityUpdated; // New event for proximity updates + public event Action OnProgressThresholdReached; // Fires at configured thresholds (25%, 50%, etc.) + public event Action OnViewfinderTapped; // Event when viewfinder is tapped during normal display + public event Action OnViewfinderTappedDuringAnimation; // Event when viewfinder is tapped during animation (with proximity) + + private void Awake() + { + if (_instance == null) + { + _instance = this; + } + else if (_instance != this) + { + Destroy(gameObject); + } + } + + private void OnApplicationQuit() + { + _isQuitting = true; + } + + private void Start() + { + settings = GameManager.GetSettingsObject(); + mainCamera = UnityEngine.Camera.main; + } + + /// + /// Begin the viewfinder animation targeting a specific transform + /// + /// The transform to focus on (usually the monster) + public void StartViewfinderAnimation(Transform target) + { + if (isAnimating) + { + StopViewfinderAnimation(); + } + + if (settings.ViewfinderPrefab == null) + { + Debug.LogError("[CameraViewfinderManager] No viewfinder prefab assigned!"); + return; + } + + if (targetCanvas == null) + { + Debug.LogError("[CameraViewfinderManager] No canvas assigned!"); + return; + } + + targetTransform = target; + + // Calculate target screen position and size only once at the start + CalculateTargetScreenPositionAndSize(); + + // Create viewfinder as UI element + viewfinderInstance = Instantiate(settings.ViewfinderPrefab, targetCanvas.transform); + viewfinderRectTransform = viewfinderInstance.GetComponent(); + viewfinderComponent = viewfinderInstance.GetComponent(); + if (viewfinderRectTransform == null) + { + Debug.LogError("[CameraViewfinderManager] Viewfinder prefab doesn't have a RectTransform component!"); + Destroy(viewfinderInstance); + return; + } + + // Initialize viewfinder with a reference to this manager + if (viewfinderComponent != null) + { + viewfinderComponent.Initialize(this); + viewfinderComponent.SetupInputOverride(); + viewfinderComponent.OnViewfinderTapped += HandleViewfinderTapped; + } + + // Reset state + animationProgress = 0f; + isAnimating = true; + + // Determine canvas width for CanvasScaler-consistent sizing + RectTransform canvasRect = targetCanvas.transform as RectTransform; + float canvasWidth = canvasRect != null ? canvasRect.rect.width : Screen.width; + + // Initialize viewfinder size and position to full canvas width (square) at center + float startSize = canvasWidth; + viewfinderRectTransform.sizeDelta = new Vector2(startSize, startSize); + viewfinderRectTransform.anchorMin = new Vector2(0.5f, 0.5f); + viewfinderRectTransform.anchorMax = new Vector2(0.5f, 0.5f); + viewfinderRectTransform.pivot = new Vector2(0.5f, 0.5f); + viewfinderRectTransform.anchoredPosition = Vector2.zero; + + // Compute target anchored position in canvas units from previously calculated screen position + targetAnchoredPosition = ScreenToAnchoredPosition(targetScreenPosition); + + // Fire starting event + OnAnimationStarted?.Invoke(); + + // Start animation coroutine + animationCoroutine = StartCoroutine(AnimateViewfinder()); + } + + /// + /// Calculates the target screen position and size based on monster's sprite bounds + /// + private void CalculateTargetScreenPositionAndSize() + { + if (targetTransform == null || mainCamera == null) return; + + RectTransform canvasRect = targetCanvas != null ? targetCanvas.transform as RectTransform : null; + if (canvasRect == null) + { + Debug.LogError("[CameraViewfinderManager] Target canvas RectTransform not found."); + return; + } + + // Choose UI camera for coordinate conversion + Camera uiCamera = null; + if (targetCanvas.renderMode == RenderMode.ScreenSpaceCamera || + targetCanvas.renderMode == RenderMode.WorldSpace) + { + uiCamera = targetCanvas.worldCamera; + } + + // Get sprite renderer from the monster + SpriteRenderer spriteRenderer = targetTransform.GetComponent(); + if (spriteRenderer == null || spriteRenderer.sprite == null) + { + // Fallback to transform position and default size if no sprite renderer + targetScreenPosition = mainCamera.WorldToScreenPoint(targetTransform.position); + // Convert to anchored UI position + RectTransformUtility.ScreenPointToLocalPointInRectangle(canvasRect, targetScreenPosition, uiCamera, + out targetAnchoredPosition); + + // Default size: fraction of canvas width (canvas units) + float canvasWidth = canvasRect.rect.width; + targetViewfinderSize = canvasWidth * 0.25f; + + Debug.LogWarning("[CameraViewfinderManager] No SpriteRenderer found on target, using default size"); + return; + } + + // Calculate world bounds of the sprite and apply padding + Bounds spriteBounds = spriteRenderer.bounds; + Vector3 paddedSize = spriteBounds.size * settings.PaddingFactor; + Bounds paddedBounds = new Bounds(spriteBounds.center, paddedSize); + + // Convert bounds corners to screen space + Vector3[] worldCorners = new Vector3[4]; + worldCorners[0] = new Vector3(paddedBounds.min.x, paddedBounds.min.y, paddedBounds.center.z); // BL + worldCorners[1] = new Vector3(paddedBounds.max.x, paddedBounds.min.y, paddedBounds.center.z); // BR + worldCorners[2] = new Vector3(paddedBounds.min.x, paddedBounds.max.y, paddedBounds.center.z); // TL + worldCorners[3] = new Vector3(paddedBounds.max.x, paddedBounds.max.y, paddedBounds.center.z); // TR + + // Convert screen-space corners to canvas local points (canvas units) + bool anyFailed = false; + Vector2[] localCorners = new Vector2[4]; + for (int i = 0; i < 4; i++) + { + Vector3 screenPos = mainCamera.WorldToScreenPoint(worldCorners[i]); + if (!RectTransformUtility.ScreenPointToLocalPointInRectangle(canvasRect, screenPos, uiCamera, + out localCorners[i])) + { + anyFailed = true; + } + } + + // Fallback: if conversion failed for some reason, keep original behavior (pixels -> clamp -> convert later) + if (anyFailed) + { + Vector2 minScreen = new Vector2(float.MaxValue, float.MaxValue); + Vector2 maxScreen = new Vector2(float.MinValue, float.MinValue); + foreach (Vector3 corner in worldCorners) + { + Vector3 sp = mainCamera.WorldToScreenPoint(corner); + minScreen.x = Mathf.Min(minScreen.x, sp.x); + minScreen.y = Mathf.Min(minScreen.y, sp.y); + maxScreen.x = Mathf.Max(maxScreen.x, sp.x); + maxScreen.y = Mathf.Max(maxScreen.y, sp.y); + } + + float widthPx = maxScreen.x - minScreen.x; + float heightPx = maxScreen.y - minScreen.y; + float canvasWidth = canvasRect.rect.width; + float scaleX = Screen.width > 0 ? canvasWidth / Screen.width : 1f; + targetViewfinderSize = Mathf.Max(widthPx, heightPx) * scaleX; // approximate conversion + float minCanvas = canvasWidth * settings.MinSizePercent; + float maxCanvas = canvasWidth * settings.MaxSizePercent; + targetViewfinderSize = Mathf.Clamp(targetViewfinderSize, minCanvas, maxCanvas); + + // Target position + targetScreenPosition = mainCamera.WorldToScreenPoint(spriteBounds.center); + RectTransformUtility.ScreenPointToLocalPointInRectangle(canvasRect, targetScreenPosition, uiCamera, + out targetAnchoredPosition); + return; + } + + // Compute width/height in canvas units from local corners + float minX = float.MaxValue, minY = float.MaxValue, maxX = float.MinValue, maxY = float.MinValue; + for (int i = 0; i < 4; i++) + { + minX = Mathf.Min(minX, localCorners[i].x); + minY = Mathf.Min(minY, localCorners[i].y); + maxX = Mathf.Max(maxX, localCorners[i].x); + maxY = Mathf.Max(maxY, localCorners[i].y); + } + + float widthCanvas = Mathf.Max(0f, maxX - minX); + float heightCanvas = Mathf.Max(0f, maxY - minY); + float canvasSquare = Mathf.Max(widthCanvas, heightCanvas); + + // Clamp using canvas width + float canvasW = canvasRect.rect.width; + float minSizeCanvas = canvasW * settings.MinSizePercent; + float maxSizeCanvas = canvasW * settings.MaxSizePercent; + targetViewfinderSize = Mathf.Clamp(canvasSquare, minSizeCanvas, maxSizeCanvas); + + // Target position in both screen and canvas units + targetScreenPosition = mainCamera.WorldToScreenPoint(spriteBounds.center); + RectTransformUtility.ScreenPointToLocalPointInRectangle(canvasRect, targetScreenPosition, uiCamera, + out targetAnchoredPosition); + + Debug.Log( + $"[CameraViewfinderManager] Target size (canvas): {targetViewfinderSize}, target anchored: {targetAnchoredPosition}"); + } + + /// + /// Stop the current viewfinder animation and clean up + /// + public void StopViewfinderAnimation() + { + if (animationCoroutine != null) + { + StopCoroutine(animationCoroutine); + animationCoroutine = null; + } + + if (viewfinderInstance != null) + { + Destroy(viewfinderInstance); + viewfinderInstance = null; + } + + isAnimating = false; + targetTransform = null; + } + + /// + /// Coroutine that handles the viewfinder animation + /// + private IEnumerator AnimateViewfinder() + { + RectTransform canvasRect = targetCanvas.transform as RectTransform; + float canvasWidth = canvasRect != null ? canvasRect.rect.width : Screen.width; + + // IMPORTANT: We're animating from full canvas width DOWN to the target size + float startSize = canvasWidth; // Always start with full canvas width + float endSize = targetViewfinderSize; // End at the calculated target size + + float elapsedTime = 0f; + bool[] thresholdTriggered = new bool[settings.ViewfinderProgressThresholds.Length]; + + // Debug the actual values + Debug.Log($"[CameraViewfinderManager] Animation starting: startSize={startSize}, endSize={endSize}, " + + $"current sizeDelta={viewfinderRectTransform.sizeDelta}"); + + // Verify the initial size is set correctly + viewfinderRectTransform.sizeDelta = new Vector2(startSize, startSize); + + while (elapsedTime < settings.ViewfinderShrinkDuration) + { + if (targetTransform == null) + { + StopViewfinderAnimation(); + yield break; + } + + elapsedTime += Time.unscaledDeltaTime; + animationProgress = Mathf.Clamp01(elapsedTime / settings.ViewfinderShrinkDuration); + + // The curve value might be inverted - ensure we're shrinking not growing + float curveValue = settings.ViewfinderShrinkCurve.Evaluate(animationProgress); + + // FIX: Ensure we're interpolating from large (start) to small (end) + // This is critical - we must ensure the start and end are in the right order + float currentSize = Mathf.Lerp(startSize, endSize, curveValue); + + // Additional check to ensure size is actually shrinking + if (startSize > endSize && currentSize > startSize) + { + Debug.LogWarning($"[CameraViewfinderManager] Animation curve producing wrong direction! " + + $"progress={animationProgress:F2}, curveValue={curveValue:F2}"); + // Force correct behavior + curveValue = animationProgress; // Override with linear interpolation + currentSize = Mathf.Lerp(startSize, endSize, curveValue); + } + + viewfinderRectTransform.sizeDelta = new Vector2(currentSize, currentSize); + + // Move in UI space towards the anchored target position + Vector2 currentPos = viewfinderRectTransform.anchoredPosition; + Vector2 newPos = Vector2.Lerp(currentPos, targetAnchoredPosition, + settings.ViewfinderMoveSpeed * Time.unscaledDeltaTime); + viewfinderRectTransform.anchoredPosition = newPos; + + // Log the animation state occasionally for debugging + if (animationProgress % 0.25f <= 0.01f || animationProgress >= 0.99f) + { + Debug.Log($"[CameraViewfinderManager] Animation progress: {animationProgress:F2}, " + + $"curveValue={curveValue:F2}, currentSize={currentSize:F2}, currentPos={newPos}"); + } + + for (int i = 0; i < settings.ViewfinderProgressThresholds.Length; i++) + { + if (!thresholdTriggered[i] && animationProgress >= settings.ViewfinderProgressThresholds[i]) + { + thresholdTriggered[i] = true; + OnProgressThresholdReached?.Invoke(settings.ViewfinderProgressThresholds[i]); + } + } + + OnProgressUpdated?.Invoke(animationProgress); + yield return null; + } + + // Ensure we reach the exact end size + viewfinderRectTransform.sizeDelta = new Vector2(endSize, endSize); + + animationProgress = 1f; + OnProgressUpdated?.Invoke(animationProgress); + OnAnimationCompleted?.Invoke(); + + // Log final state to confirm we reached the target size + Debug.Log( + $"[CameraViewfinderManager] Animation completed: final size={viewfinderRectTransform.sizeDelta}"); + + yield return new WaitForSecondsRealtime(0.5f); + StopViewfinderAnimation(); + } + + // Converts a screen-space point to a RectTransform anchoredPosition for the target canvas + private Vector2 ScreenToAnchoredPosition(Vector3 screenPosition) + { + if (targetCanvas == null) + { + return new Vector2(screenPosition.x, screenPosition.y); + } + + RectTransform canvasRect = targetCanvas.transform as RectTransform; + Camera uiCamera = null; + if (targetCanvas.renderMode == RenderMode.ScreenSpaceCamera || + targetCanvas.renderMode == RenderMode.WorldSpace) + { + uiCamera = targetCanvas.worldCamera; + } + + Vector2 localPoint; + RectTransformUtility.ScreenPointToLocalPointInRectangle(canvasRect, screenPosition, uiCamera, + out localPoint); + return localPoint; + } + + private void OnDestroy() + { + StopViewfinderAnimation(); + + if (_instance == this) + { + _instance = null; + } + } + + /// + /// Handles tap event from the viewfinder and forwards it + /// + private void HandleViewfinderTapped() + { + // Forward the tap event to any listeners + OnViewfinderTapped?.Invoke(); + } + + /// + /// Hides the currently displayed viewfinder + /// + public void HideViewfinder() + { + if (viewfinderInstance != null) + { + // Unsubscribe from the viewfinder's tap event + if (viewfinderComponent != null) + { + viewfinderComponent.OnViewfinderTapped -= HandleViewfinderTapped; + } + + Destroy(viewfinderInstance); + viewfinderInstance = null; + viewfinderComponent = null; + viewfinderRectTransform = null; + Debug.Log("[CameraViewfinderManager] Hid viewfinder"); + } + } + + /// + /// Shows the viewfinder in the middle of the screen at full size without animation + /// This is the first step in the two-step process, showing the UI without targeting a monster yet + /// + public void ShowFullScreenViewfinder() + { + if (viewfinderInstance != null) + { + // Already showing a viewfinder, destroy it first + Destroy(viewfinderInstance); + } + + if (settings.ViewfinderPrefab == null) + { + Debug.LogError("[CameraViewfinderManager] No viewfinder prefab assigned!"); + return; + } + + if (targetCanvas == null) + { + Debug.LogError("[CameraViewfinderManager] No canvas assigned!"); + return; + } + + isAnimating = false; + + // Create viewfinder as UI element + viewfinderInstance = Instantiate(settings.ViewfinderPrefab, targetCanvas.transform); + viewfinderRectTransform = viewfinderInstance.GetComponent(); + viewfinderComponent = viewfinderInstance.GetComponent(); + + if (viewfinderRectTransform == null) + { + Debug.LogError("[CameraViewfinderManager] Viewfinder prefab doesn't have a RectTransform component!"); + Destroy(viewfinderInstance); + return; + } + + // Initialize viewfinder with a reference to this manager + if (viewfinderComponent != null) + { + viewfinderComponent.Initialize(this); + viewfinderComponent.SetupInputOverride(); + viewfinderComponent.OnViewfinderTapped += HandleViewfinderTapped; + + } + + // Determine canvas width for full-screen sizing + RectTransform canvasRect = targetCanvas.transform as RectTransform; + float canvasWidth = canvasRect != null ? canvasRect.rect.width : Screen.width; + + // Set up the viewfinder in the center of the screen at full canvas width + viewfinderRectTransform.anchorMin = new Vector2(0.5f, 0.5f); + viewfinderRectTransform.anchorMax = new Vector2(0.5f, 0.5f); + viewfinderRectTransform.pivot = new Vector2(0.5f, 0.5f); + viewfinderRectTransform.sizeDelta = new Vector2(canvasWidth, canvasWidth); + viewfinderRectTransform.anchoredPosition = Vector2.zero; + + Debug.Log($"[CameraViewfinderManager] Showed full-screen viewfinder with size {canvasWidth}"); + } + + /// + /// Starts the complete viewfinder animation sequence (zoom in, then zoom out) + /// + /// The transform to focus on (usually the monster) + public void StartViewfinderSequence(Transform target) + { + if (isAnimating) + { + StopViewfinderAnimation(); + } + + if (settings.ViewfinderPrefab == null) + { + Debug.LogError("[CameraViewfinderManager] No viewfinder prefab assigned!"); + return; + } + + if (targetCanvas == null) + { + Debug.LogError("[CameraViewfinderManager] No canvas assigned!"); + return; + } + + targetTransform = target; + isReversePhase = false; + currentProximity = 0f; + + // Calculate target screen position and size based on monster's sprite bounds + CalculateTargetScreenPositionAndSize(); + + // Reuse existing viewfinder instance if it exists + if (viewfinderInstance == null) + { + // Create viewfinder as UI element if it doesn't exist yet + viewfinderInstance = Instantiate(settings.ViewfinderPrefab, targetCanvas.transform); + viewfinderRectTransform = viewfinderInstance.GetComponent(); + viewfinderComponent = viewfinderInstance.GetComponent(); + + if (viewfinderRectTransform == null) + { + Debug.LogError("[CameraViewfinderManager] Viewfinder prefab doesn't have a RectTransform component!"); + Destroy(viewfinderInstance); + return; + } + } + else + { + // Unsubscribe from any existing event to prevent multiple subscriptions + if (viewfinderComponent != null) + { + viewfinderComponent.OnViewfinderTapped -= HandleViewfinderTapped; + viewfinderComponent.OnViewfinderTapped -= HandleViewfinderTappedDuringAnimation; + } + + // Subscribe to the viewfinder's tap event for interrupting the animation + viewfinderComponent.OnViewfinderTapped += HandleViewfinderTappedDuringAnimation; + } + + // Reset state + animationProgress = 0f; + isAnimating = true; + + // Determine canvas width for CanvasScaler-consistent sizing + RectTransform canvasRect = targetCanvas.transform as RectTransform; + float canvasWidth = canvasRect != null ? canvasRect.rect.width : Screen.width; + + // Initialize viewfinder size and position to full canvas width (square) at center + float startSize = canvasWidth; + viewfinderRectTransform.sizeDelta = new Vector2(startSize, startSize); + viewfinderRectTransform.anchorMin = new Vector2(0.5f, 0.5f); + viewfinderRectTransform.anchorMax = new Vector2(0.5f, 0.5f); + viewfinderRectTransform.pivot = new Vector2(0.5f, 0.5f); + viewfinderRectTransform.anchoredPosition = Vector2.zero; + + // Compute target anchored position in canvas units from previously calculated screen position + targetAnchoredPosition = ScreenToAnchoredPosition(targetScreenPosition); + + // Fire starting event + OnAnimationStarted?.Invoke(); + + // Start sequence coroutine + animationCoroutine = StartCoroutine(AnimateViewfinderSequence()); + } + + /// + /// Coroutine that handles the complete viewfinder animation sequence (zoom in, then zoom out) + /// + private IEnumerator AnimateViewfinderSequence() + { + RectTransform canvasRect = targetCanvas.transform as RectTransform; + float canvasWidth = canvasRect != null ? canvasRect.rect.width : Screen.width; + + // Phase 1: Zoom in (from full screen to monster) + float startSize = canvasWidth; // Always start with full canvas width + float endSize = targetViewfinderSize; // End at the calculated target size + Vector2 startPos = Vector2.zero; // Center of screen + Vector2 endPos = targetAnchoredPosition; // Target position + + float elapsedTime = 0f; + bool[] thresholdTriggered = new bool[settings.ViewfinderProgressThresholds.Length]; + + // Debug the actual values + Debug.Log($"[CameraViewfinderManager] Animation sequence starting: startSize={startSize}, endSize={endSize}"); + + // Verify the initial size is set correctly + viewfinderRectTransform.sizeDelta = new Vector2(startSize, startSize); + + // Phase 1: Zoom In + while (elapsedTime < settings.ViewfinderShrinkDuration && !isReversePhase) + { + if (targetTransform == null) + { + StopViewfinderAnimation(); + yield break; + } + + elapsedTime += Time.unscaledDeltaTime; + animationProgress = Mathf.Clamp01(elapsedTime / settings.ViewfinderShrinkDuration); + + // Calculate proximity - it increases as we get closer to the target + currentProximity = animationProgress; + OnProximityUpdated?.Invoke(currentProximity); + + // The curve value might be inverted - ensure we're shrinking not growing + float curveValue = settings.ViewfinderShrinkCurve.Evaluate(animationProgress); + + // Interpolate size + float currentSize = Mathf.Lerp(startSize, endSize, curveValue); + viewfinderRectTransform.sizeDelta = new Vector2(currentSize, currentSize); + + // Interpolate position + Vector2 currentPos = viewfinderRectTransform.anchoredPosition; + Vector2 newPos = Vector2.Lerp(startPos, endPos, curveValue); + viewfinderRectTransform.anchoredPosition = newPos; + + // Log the animation state occasionally for debugging + if (animationProgress % 0.25f <= 0.01f || animationProgress >= 0.99f) + { + Debug.Log($"[CameraViewfinderManager] Animation progress: {animationProgress:F2}, " + + $"curveValue={curveValue:F2}, currentSize={currentSize:F2}, currentPos={newPos}, proximity={currentProximity:F2}"); + } + + for (int i = 0; i < settings.ViewfinderProgressThresholds.Length; i++) + { + if (!thresholdTriggered[i] && animationProgress >= settings.ViewfinderProgressThresholds[i]) + { + thresholdTriggered[i] = true; + OnProgressThresholdReached?.Invoke(settings.ViewfinderProgressThresholds[i]); + } + } + + OnProgressUpdated?.Invoke(animationProgress); + yield return null; + } + + // Ensure we reach the exact end size and position for phase 1 + viewfinderRectTransform.sizeDelta = new Vector2(endSize, endSize); + viewfinderRectTransform.anchoredPosition = endPos; + currentProximity = 1.0f; // At target + OnProximityUpdated?.Invoke(currentProximity); + + // Brief pause at target + yield return new WaitForSecondsRealtime(0.2f); + + // Start phase 2 - reverse animation + isReversePhase = true; + OnReverseAnimationStarted?.Invoke(); + + // Reset for reverse phase + elapsedTime = 0f; + animationProgress = 0f; + + // Phase 2: Zoom Out (from monster back to full screen) + while (elapsedTime < settings.ViewfinderShrinkDuration && isReversePhase) + { + if (targetTransform == null) + { + StopViewfinderAnimation(); + yield break; + } + + elapsedTime += Time.unscaledDeltaTime; + animationProgress = Mathf.Clamp01(elapsedTime / settings.ViewfinderShrinkDuration); + + // Calculate proximity - it decreases as we move away from target + currentProximity = 1.0f - animationProgress; + OnProximityUpdated?.Invoke(currentProximity); + + // The curve value for zooming out + float curveValue = settings.ViewfinderShrinkCurve.Evaluate(animationProgress); + + // Interpolate size (now growing) + float currentSize = Mathf.Lerp(endSize, startSize, curveValue); + viewfinderRectTransform.sizeDelta = new Vector2(currentSize, currentSize); + + // Interpolate position (now returning to center) + Vector2 currentPos = viewfinderRectTransform.anchoredPosition; + Vector2 newPos = Vector2.Lerp(endPos, startPos, curveValue); + viewfinderRectTransform.anchoredPosition = newPos; + + // Log the animation state occasionally for debugging + if (animationProgress % 0.25f <= 0.01f || animationProgress >= 0.99f) + { + Debug.Log($"[CameraViewfinderManager] Reverse animation progress: {animationProgress:F2}, " + + $"curveValue={curveValue:F2}, currentSize={currentSize:F2}, currentPos={newPos}, proximity={currentProximity:F2}"); + } + + OnProgressUpdated?.Invoke(animationProgress); + yield return null; + } + + // Animation completed (both phases) + HandleViewfinderTappedDuringAnimation(); + } + + /// + /// Handle tap events during animation (for capturing at current proximity) + /// + private void HandleViewfinderTappedDuringAnimation() + { + if (isAnimating) + { + // Fire event with current proximity value for scoring + OnViewfinderTappedDuringAnimation?.Invoke(currentProximity); + + // Complete the animation immediately + if (animationCoroutine != null) + { + StopCoroutine(animationCoroutine); + animationCoroutine = null; + } + + // Fire completed event + OnAnimationCompleted?.Invoke(); + isAnimating = false; + isReversePhase = false; + + // Hide the viewfinder on the second tap + viewfinderComponent.RemoveInputOverride(); + HideViewfinder(); + } + else + { + // Regular tap handling when not animating + HandleViewfinderTapped(); + } + } + } +} diff --git a/Assets/Scripts/Minigames/DivingForPictures/PictureCamera/CameraViewfinderManager.cs.meta b/Assets/Scripts/Minigames/DivingForPictures/PictureCamera/CameraViewfinderManager.cs.meta new file mode 100644 index 00000000..f9d20b51 --- /dev/null +++ b/Assets/Scripts/Minigames/DivingForPictures/PictureCamera/CameraViewfinderManager.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: e5a6d17776b84719a2599fdc35c7076d +timeCreated: 1760016840 \ No newline at end of file diff --git a/Assets/Scripts/Minigames/DivingForPictures/PictureCamera/Viewfinder.cs b/Assets/Scripts/Minigames/DivingForPictures/PictureCamera/Viewfinder.cs new file mode 100644 index 00000000..ca1d78b5 --- /dev/null +++ b/Assets/Scripts/Minigames/DivingForPictures/PictureCamera/Viewfinder.cs @@ -0,0 +1,119 @@ +using UnityEngine; +using UnityEngine.EventSystems; +using UnityEngine.UI; +using Input; + +namespace Minigames.DivingForPictures.PictureCamera +{ + /// + /// Attached to the viewfinder UI prefab. Handles tap detection and other viewfinder-specific operations. + /// + public class Viewfinder : MonoBehaviour, ITouchInputConsumer + { + [SerializeField] + private Image[] viewfinderImages; // Array of Image components to tint based on proximity + + // Events + public event System.Action OnViewfinderTapped; + + // State + private bool isActive = true; + private RectTransform _rectTransform; + private CameraViewfinderManager _viewfinderManager; + + private void Awake() + { + _rectTransform = GetComponent(); + } + + /// + /// Initializes the viewfinder with a reference to its manager + /// + /// Reference to the CameraViewfinderManager + public void Initialize(CameraViewfinderManager manager) + { + _viewfinderManager = manager; + + if (_viewfinderManager != null) + { + _viewfinderManager.OnProximityUpdated += UpdateProximityColor; + } + } + + private void OnDisable() + { + // Unsubscribe from events when disabled + if (_viewfinderManager != null) + { + _viewfinderManager.OnProximityUpdated -= UpdateProximityColor; + } + } + + /// + /// Updates the color of all viewfinder images based on proximity value + /// + /// Proximity value between 0 and 1 (0=far, 1=close) + private void UpdateProximityColor(float proximity) + { + // Lerp between green (close) and red (far) + Color tintColor = Color.Lerp(Color.red, Color.green, proximity); + + // Apply the color to all referenced image components + if (viewfinderImages != null && viewfinderImages.Length > 0) + { + foreach (Image image in viewfinderImages) + { + if (image != null) + { + image.color = tintColor; + } + } + } + } + + /// + /// Enable or disable input reception + /// + public void SetActive(bool active) + { + isActive = active; + } + + #region ITouchInputConsumer Implementation + + public void SetupInputOverride() + { + InputManager.Instance.RegisterOverrideConsumer(this); + } + + public void RemoveInputOverride() + { + InputManager.Instance.UnregisterOverrideConsumer(this); + } + + public void OnTap(Vector2 position) + { + if (isActive) + { + // Fire the tap event that PhotoSequenceController will listen to + OnViewfinderTapped?.Invoke(); + Debug.Log($"[MDPI] Viewfinder OnTap: {position}"); + } + } + + // Required interface methods (no-op implementations) + public void OnHoldStart(Vector2 position) { } + public void OnHoldMove(Vector2 position) { } + public void OnHoldEnd(Vector2 position) { } + + #endregion + + /// + /// Check if a point is within the viewfinder's bounds + /// + public bool ContainsPoint(Vector2 screenPoint) + { + return RectTransformUtility.RectangleContainsScreenPoint(_rectTransform, screenPoint); + } + } +} diff --git a/Assets/Scripts/Minigames/DivingForPictures/PictureCamera/Viewfinder.cs.meta b/Assets/Scripts/Minigames/DivingForPictures/PictureCamera/Viewfinder.cs.meta new file mode 100644 index 00000000..dcadc0be --- /dev/null +++ b/Assets/Scripts/Minigames/DivingForPictures/PictureCamera/Viewfinder.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 4b4b818dd8cb454abe85b8edcaece1db +timeCreated: 1760032922 \ No newline at end of file diff --git a/Assets/Scripts/Minigames/DivingForPictures/Player/PlayerController.cs b/Assets/Scripts/Minigames/DivingForPictures/Player/PlayerController.cs index 4a9c61b4..f171b715 100644 --- a/Assets/Scripts/Minigames/DivingForPictures/Player/PlayerController.cs +++ b/Assets/Scripts/Minigames/DivingForPictures/Player/PlayerController.cs @@ -42,23 +42,13 @@ namespace Minigames.DivingForPictures _targetFingerX = transform.position.x; _isTouchActive = false; - // Find DivingGameManager and subscribe to its initialization event - DivingGameManager gameManager = FindFirstObjectByType(); - if (gameManager != null) + DivingGameManager.Instance.OnGameInitialized += Initialize; + + // If game is already initialized, initialize immediately + if (DivingGameManager.Instance.GetType().GetField("_isGameInitialized", + System.Reflection.BindingFlags.NonPublic | + System.Reflection.BindingFlags.Instance)?.GetValue(DivingGameManager.Instance) is bool isInitialized && isInitialized) { - gameManager.OnGameInitialized += Initialize; - - // If game is already initialized, initialize immediately - if (gameManager.GetType().GetField("_isGameInitialized", - System.Reflection.BindingFlags.NonPublic | - System.Reflection.BindingFlags.Instance)?.GetValue(gameManager) is bool isInitialized && isInitialized) - { - Initialize(); - } - } - else - { - Debug.LogWarning("[PlayerController] DivingGameManager not found. Initializing immediately."); Initialize(); } } @@ -79,12 +69,7 @@ namespace Minigames.DivingForPictures private void OnDestroy() { - // Unsubscribe from events to prevent memory leaks - DivingGameManager gameManager = FindFirstObjectByType(); - if (gameManager != null) - { - gameManager.OnGameInitialized -= Initialize; - } + DivingGameManager.Instance.OnGameInitialized -= Initialize; } /// diff --git a/Assets/Scripts/Minigames/DivingForPictures/Player/RopeEndPhysicsFollower.cs b/Assets/Scripts/Minigames/DivingForPictures/Player/RopeEndPhysicsFollower.cs index b9ac81fa..a18babb5 100644 --- a/Assets/Scripts/Minigames/DivingForPictures/Player/RopeEndPhysicsFollower.cs +++ b/Assets/Scripts/Minigames/DivingForPictures/Player/RopeEndPhysicsFollower.cs @@ -31,7 +31,7 @@ public class RopeEndPhysicsFollower : MonoBehaviour private Vector2 offset; private Vector3 lastTargetPosition; private bool initialized = false; - private bool debugLog = true; + private bool debugLog = false; // Rope reference to get the actual rope length private Rope attachedRope; diff --git a/Assets/Scripts/Minigames/DivingForPictures/Tiles/TrenchTileSpawner.cs b/Assets/Scripts/Minigames/DivingForPictures/Tiles/TrenchTileSpawner.cs index f5a68231..0e15af05 100644 --- a/Assets/Scripts/Minigames/DivingForPictures/Tiles/TrenchTileSpawner.cs +++ b/Assets/Scripts/Minigames/DivingForPictures/Tiles/TrenchTileSpawner.cs @@ -37,7 +37,7 @@ namespace Minigames.DivingForPictures private int _spawnCounter; private float _speedUpTimer; - private Camera _mainCamera; + private UnityEngine.Camera _mainCamera; private float _screenBottom; private float _screenTop; private TrenchTilePool _tilePool; @@ -76,7 +76,7 @@ namespace Minigames.DivingForPictures private void Awake() { - _mainCamera = Camera.main; + _mainCamera = UnityEngine.Camera.main; // Get settings from GameManager _settings = GameManager.GetSettingsObject(); @@ -125,38 +125,23 @@ namespace Minigames.DivingForPictures private void Start() { - // Find DivingGameManager and subscribe to its initialization event - DivingGameManager gameManager = FindFirstObjectByType(); - if (gameManager != null) + DivingGameManager.Instance.OnGameInitialized += Initialize; + + // Register with the DivingGameManager for pause/resume events + DivingGameManager.Instance.RegisterPausableComponent(this); + + // If game is already initialized, initialize immediately + if (DivingGameManager.Instance.GetType().GetField("_isGameInitialized", + System.Reflection.BindingFlags.NonPublic | + System.Reflection.BindingFlags.Instance)?.GetValue(DivingGameManager.Instance) is bool isInitialized && isInitialized) { - gameManager.OnGameInitialized += Initialize; - - // Register with the DivingGameManager for pause/resume events - gameManager.RegisterPausableComponent(this); - - // If game is already initialized, initialize immediately - if (gameManager.GetType().GetField("_isGameInitialized", - System.Reflection.BindingFlags.NonPublic | - System.Reflection.BindingFlags.Instance)?.GetValue(gameManager) is bool isInitialized && isInitialized) - { - Initialize(); - } - } - else - { - Debug.LogWarning("[TrenchTileSpawner] DivingGameManager not found. Initializing immediately."); Initialize(); } } private void OnDestroy() { - // Unregister from DivingGameManager - DivingGameManager gameManager = FindFirstObjectByType(); - if (gameManager != null) - { - gameManager.UnregisterPausableComponent(this); - } + DivingGameManager.Instance.UnregisterPausableComponent(this); } /// @@ -199,7 +184,7 @@ namespace Minigames.DivingForPictures /// /// Resumes the spawner and all associated processes /// - public void Resume() + public void DoResume() { if (!_isPaused) return; // Already running @@ -386,7 +371,7 @@ namespace Minigames.DivingForPictures { if (_mainCamera == null) { - _mainCamera = Camera.main; + _mainCamera = UnityEngine.Camera.main; if (_mainCamera == null) { Debug.LogError("No main camera found!"); @@ -904,7 +889,7 @@ namespace Minigames.DivingForPictures if (!Application.isPlaying) { // Only try to calculate this if _screenBottom hasn't been set by the game - Camera editorCam = Camera.main; + UnityEngine.Camera editorCam = UnityEngine.Camera.main; if (editorCam != null) { Vector3 bottom = editorCam.ViewportToWorldPoint(new Vector3(0.5f, 0f, editorCam.nearClipPlane)); diff --git a/Assets/Scripts/Minigames/DivingForPictures/Utilities.meta b/Assets/Scripts/Minigames/DivingForPictures/Utilities.meta new file mode 100644 index 00000000..26e2fa72 --- /dev/null +++ b/Assets/Scripts/Minigames/DivingForPictures/Utilities.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 0892ac3d8370a274b8d5847ca51ac046 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Minigames/DivingForPictures/Utilities/BottlePauser.cs b/Assets/Scripts/Minigames/DivingForPictures/Utilities/BottlePauser.cs new file mode 100644 index 00000000..b524057e --- /dev/null +++ b/Assets/Scripts/Minigames/DivingForPictures/Utilities/BottlePauser.cs @@ -0,0 +1,31 @@ +using AppleHills.Core.Interfaces; +using UnityEngine; + +namespace Minigames.DivingForPictures.Utilities +{ + public class BottlePauser : MonoBehaviour, IPausable + { + [SerializeField] private WobbleBehavior wobbleReference; + + private bool isPaused = false; + + private void Awake() + { + DivingGameManager.Instance.RegisterPausableComponent(this); + } + + public void Pause() + { + wobbleReference.enabled = false; + isPaused = true; + } + + public void DoResume() + { + wobbleReference.enabled = true; + isPaused = false; + } + + public bool IsPaused => isPaused; + } +} diff --git a/Assets/Scripts/Minigames/DivingForPictures/Utilities/BottlePauser.cs.meta b/Assets/Scripts/Minigames/DivingForPictures/Utilities/BottlePauser.cs.meta new file mode 100644 index 00000000..08707fe4 --- /dev/null +++ b/Assets/Scripts/Minigames/DivingForPictures/Utilities/BottlePauser.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: cf50e6f7c05d5a14296152b8c3fbb923 \ No newline at end of file diff --git a/Assets/Scripts/Minigames/DivingForPictures/Utilities/RockPauser.cs b/Assets/Scripts/Minigames/DivingForPictures/Utilities/RockPauser.cs new file mode 100644 index 00000000..5d09a221 --- /dev/null +++ b/Assets/Scripts/Minigames/DivingForPictures/Utilities/RockPauser.cs @@ -0,0 +1,34 @@ +using AppleHills.Core.Interfaces; +using UnityEngine; + +namespace Minigames.DivingForPictures.Utilities +{ + public class RockPauser : MonoBehaviour, IPausable + { + [SerializeField] private RockFollower rockReference; + [SerializeField] private WobbleBehavior rockWobbleReference; + + private bool isPaused = false; + + private void Awake() + { + DivingGameManager.Instance.RegisterPausableComponent(this); + } + + public void Pause() + { + rockReference.enabled = false; + rockWobbleReference.enabled = false; + isPaused = true; + } + + public void DoResume() + { + rockReference.enabled = true; + rockWobbleReference.enabled = true; + isPaused = false; + } + + public bool IsPaused => isPaused; + } +} diff --git a/Assets/Scripts/Minigames/DivingForPictures/Utilities/RockPauser.cs.meta b/Assets/Scripts/Minigames/DivingForPictures/Utilities/RockPauser.cs.meta new file mode 100644 index 00000000..004658b5 --- /dev/null +++ b/Assets/Scripts/Minigames/DivingForPictures/Utilities/RockPauser.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: a392c919de2df0340b700309e221b7b1 \ No newline at end of file diff --git a/Assets/Scripts/UI/CardSystem.meta b/Assets/Scripts/UI/CardSystem.meta new file mode 100644 index 00000000..1590cbd4 --- /dev/null +++ b/Assets/Scripts/UI/CardSystem.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 27f0915ceda44ccf9415c3f344645b38 +timeCreated: 1759923720 \ No newline at end of file diff --git a/Assets/Scripts/UI/CardSystem/AlbumViewPage.cs b/Assets/Scripts/UI/CardSystem/AlbumViewPage.cs new file mode 100644 index 00000000..08bc1341 --- /dev/null +++ b/Assets/Scripts/UI/CardSystem/AlbumViewPage.cs @@ -0,0 +1,343 @@ +using System.Collections.Generic; +using AppleHills.Data.CardSystem; +using Pixelplacement; +using UnityEngine; +using UnityEngine.UI; + +namespace AppleHills.UI.CardSystem +{ + /// + /// UI page for viewing and organizing the player's card collection in an album. + /// + public class AlbumViewPage : UIPage + { + [Header("Album UI Elements")] + [SerializeField] private GridLayoutGroup albumGrid; + [SerializeField] private RectTransform cardStackContainer; + [SerializeField] private GameObject emptyAlbumMessage; + [SerializeField] private GameObject cardSlotPrefab; + [SerializeField] private GameObject cardPrefab; + + // Runtime references + private CardSystemManager _cardManager; + private List _displayedCards = new List(); + private Dictionary _albumSlots = new Dictionary(); + + // Drag and drop handling + private CardUIElement _currentlyDraggedCard = null; + private Vector3 _cardOriginalPosition; + + private void Awake() + { + _cardManager = CardSystemManager.Instance; + } + + /// + /// Sets up the album when the page becomes active + /// + public override void TransitionIn() + { + base.TransitionIn(); + + // Initialize the album when the page becomes active + InitializeAlbum(); + } + + /// + /// Initializes the album with card slots and the player's collection + /// + private void InitializeAlbum() + { + // Clear any previous setup + ClearAlbum(); + + // Get all collected cards + List collectedCards = _cardManager.GetAllCollectedCards(); + + // Show/hide empty message based on collection + if (emptyAlbumMessage != null) + { + emptyAlbumMessage.SetActive(collectedCards.Count == 0); + } + + if (collectedCards.Count == 0) + { + return; + } + + // Set up the album slots + SetupAlbumSlots(); + + // Create card UI elements for the stack + CreateCardStack(collectedCards); + } + + /// + /// Sets up empty slots in the album grid + /// + private void SetupAlbumSlots() + { + if (albumGrid == null || cardSlotPrefab == null) return; + + // Create predefined slots in the album + // For a simple implementation, we'll create a 5x5 grid of slots + int slotsPerZone = 5; // 5 slots per zone (one row) + int totalZones = System.Enum.GetValues(typeof(CardZone)).Length; + + for (int zone = 0; zone < totalZones; zone++) + { + for (int i = 0; i < slotsPerZone; i++) + { + // Create a slot at this position + GameObject slotObj = Instantiate(cardSlotPrefab, albumGrid.transform); + + // Calculate the collection index for this slot + int collectionIndex = zone * 100 + i; // Zone*100 + position to ensure unique indices + + // Store the slot reference + _albumSlots[collectionIndex] = slotObj.transform; + + // Set the slot label (optional) + Text slotLabel = slotObj.GetComponentInChildren(); + if (slotLabel != null) + { + CardZone zoneEnum = (CardZone)zone; + slotLabel.text = $"{zoneEnum} #{i+1}"; + } + } + } + } + + /// + /// Creates UI elements for the player's collected cards + /// + private void CreateCardStack(List cards) + { + if (cardStackContainer == null || cardPrefab == null) return; + + // Stack offset for visual effect + Vector3 stackOffset = new Vector3(5f, -5f, 0f); + Vector3 basePosition = Vector3.zero; + + // Sort cards by collection index + cards.Sort((a, b) => a.CollectionIndex.CompareTo(b.CollectionIndex)); + + // Create card UI elements + for (int i = 0; i < cards.Count; i++) + { + GameObject cardObj = Instantiate(cardPrefab, cardStackContainer); + CardUIElement cardUI = cardObj.GetComponent(); + + if (cardUI != null) + { + // Position in stack + cardObj.GetComponent().anchoredPosition = basePosition + (stackOffset * i); + + // Set up card data + cardUI.SetupCard(cards[i]); + + // Add drag handlers + SetupCardDragHandlers(cardUI); + + // Add to tracked cards + _displayedCards.Add(cardUI); + + // Check if this card should be placed in a slot already + int collectionIndex = cards[i].CollectionIndex; + if (_albumSlots.TryGetValue(collectionIndex, out Transform slot)) + { + // Card has a designated slot, place it there + PlaceCardInSlot(cardUI, slot); + } + } + } + } + + /// + /// Sets up drag and drop handlers for a card + /// + private void SetupCardDragHandlers(CardUIElement cardUI) + { + // // Get drag handler component (you might need to implement this) + // DragHandler dragHandler = cardUI.GetComponent(); + // if (dragHandler == null) + // { + // // This is a stub for the drag handler + // // In a real implementation, you'd have a proper drag handler component + // // For now, we'll just add click listeners + // + // // Add click listener + // Button cardButton = cardUI.GetComponent

Q!=Ln6NF?xH_!MU>{Qeayj|3@k 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 + /// Editor utility for managing card definitions without directly editing scriptable objects. + /// Provides a searchable list and visual preview of cards. + /// + public class CardEditorWindow : EditorWindow + { + // Paths + private const string CardDefinitionsPath = "Assets/Data/Cards"; + private const string MenuPath = "AppleHills/Card Editor"; + private const string CardUIPrefabPath = "Assets/Prefabs/UI/Cards/CardUI.prefab"; + private const string CardVisualConfigPath = CardDefinitionsPath + "/CardVisualConfig.asset"; + + // Editor state + private List _cards = new List(); + private CardDefinition _selectedCard; + private CardDefinition _editingCard; // Clone of selected card for editing + private Vector2 _cardListScrollPosition; + private Vector2 _cardEditScrollPosition; + private string _searchQuery = ""; + private bool _showPreview = true; + private bool _isDirty = false; + + // UI state for card preview + private GameObject _previewCardObject; + private CardUIElement _previewCardElement; + private CardData _previewCardData; + private Rect _previewRect; + private GameObject _cardUIPrefab; + private CardVisualConfig _cardVisualConfig; + private UnityEditor.Editor _cardPreviewEditor; + private Texture2D _staticPreviewTexture; + private bool _previewNeedsUpdate = true; + + // Preview settings + private float _previewZoom = 1.0f; + private Vector2 _previewOffset = Vector2.zero; + private bool _debugMode = false; + private float _zoomMultiplier = 1.5f; // Default multiplier (no zoom) + private const float DEFAULT_ZOOM = 1.5f; // Store default zoom as a constant + private const float BASE_ORTHO_SIZE = 400.0f; // Increased from 0.8f to 8.0f for a much wider view + + // PreviewRenderUtility for rendering the card in a hidden scene + private PreviewRenderUtility _previewUtility; + private float _orbitRotation = 0f; + private float _autoRotateSpeed = 0f; + private bool _autoRotate = false; + private GameObject _previewInstance; + + [MenuItem(MenuPath)] + public static void ShowWindow() + { + var window = GetWindow("Card Editor"); + window.minSize = new Vector2(800, 600); + window.Show(); + } + + private void OnEnable() + { + // Load all card definitions + LoadCardDefinitions(); + + // Initialize preview + InitializePreview(); + + // Register for undo/redo + Undo.undoRedoPerformed += OnUndoRedo; + + // Set up a repaint on script compilation + EditorApplication.update += OnEditorUpdate; + EditorApplication.playModeStateChanged += OnPlayModeStateChanged; + } + + private void OnDisable() + { + // Clean up preview + CleanupPreview(); + + // Unregister from undo/redo + Undo.undoRedoPerformed -= OnUndoRedo; + + // Unregister from update + EditorApplication.update -= OnEditorUpdate; + EditorApplication.playModeStateChanged -= OnPlayModeStateChanged; + } + + private void OnEditorUpdate() + { + if (_showPreview && _previewNeedsUpdate) + { + Repaint(); + } + + // Auto-rotate the preview if enabled + if (_autoRotate && _previewUtility != null) + { + _orbitRotation += _autoRotateSpeed * Time.deltaTime; + Repaint(); + } + } + + private void OnUndoRedo() + { + // Reload card definitions and refresh + LoadCardDefinitions(); + Repaint(); + } + + private void OnPlayModeStateChanged(PlayModeStateChange stateChange) + { + if (stateChange == PlayModeStateChange.EnteredEditMode) + { + LoadCardDefinitions(); + InitializePreview(); + } + else if (stateChange == PlayModeStateChange.ExitingEditMode) + { + CleanupPreview(); + } + } + + private void LoadCardDefinitions() + { + _cards.Clear(); + + // Create the directory structure if it doesn't exist + string dataDirectory = Path.GetDirectoryName(CardDefinitionsPath); // Gets the "Assets/Data" part + if (!Directory.Exists(dataDirectory)) + { + Directory.CreateDirectory(dataDirectory); + } + + if (!Directory.Exists(CardDefinitionsPath)) + { + Directory.CreateDirectory(CardDefinitionsPath); + AssetDatabase.Refresh(); + } + + // Find all card definition assets + string[] guids = AssetDatabase.FindAssets("t:CardDefinition", new[] { CardDefinitionsPath }); + foreach (string guid in guids) + { + string path = AssetDatabase.GUIDToAssetPath(guid); + CardDefinition card = AssetDatabase.LoadAssetAtPath(path); + if (card != null) + { + _cards.Add(card); + } + } + + // Sort by name + _cards = _cards.OrderBy(c => c.Name).ToList(); + + // If we had a selected card, try to find it again + if (_selectedCard != null) + { + _selectedCard = _cards.FirstOrDefault(c => c.Id == _selectedCard.Id); + if (_selectedCard != null) + { + _editingCard = CloneCard(_selectedCard); + UpdatePreview(); + } + } + } + + private void InitializePreview() + { + // Initialize PreviewRenderUtility for 3D preview + if (_previewUtility == null) + { + _previewUtility = new PreviewRenderUtility(); + + // Configure camera for 2D UI rendering + var cam = _previewUtility.camera; + cam.clearFlags = CameraClearFlags.Color; + cam.backgroundColor = Color.gray; // Background color when nothing is rendered + cam.orthographic = true; // Orthographic is better for 2D UI + cam.orthographicSize = 1f; + cam.nearClipPlane = 0.01f; + cam.farClipPlane = 100f; + cam.cullingMask = ~0; // Render everything + cam.transform.position = new Vector3(0, 0, -6); + cam.transform.rotation = Quaternion.identity; + + // Configure lights for better UI visibility + // Key light + _previewUtility.lights[0].intensity = 1.2f; + _previewUtility.lights[0].color = Color.white; + _previewUtility.lights[0].transform.rotation = Quaternion.Euler(30f, 30f, 0f); + + // Fill light + _previewUtility.lights[1].intensity = 0.7f; + _previewUtility.lights[1].color = new Color(0.7f, 0.7f, 0.8f); + _previewUtility.lights[1].transform.rotation = Quaternion.Euler(-30f, -30f, 0f); + } + + // Load the prefab + _cardUIPrefab = AssetDatabase.LoadAssetAtPath(CardUIPrefabPath); + if (_cardUIPrefab == null) + { + Debug.LogError($"[CardEditorWindow] Could not find card UI prefab at {CardUIPrefabPath}"); + return; + } + + // Try to load the visual config + _cardVisualConfig = AssetDatabase.LoadAssetAtPath(CardVisualConfigPath); + if (_cardVisualConfig == null) + { + Debug.LogWarning($"[CardEditorWindow] Could not find card visual config at {CardVisualConfigPath}"); + } + + // Create preview card object + CreatePreviewCardObject(); + } + + private void CreatePreviewCardObject() + { + // Clean up any existing preview objects + CleanupPreviewInstance(); + + if (_cardUIPrefab == null) + { + Debug.LogError("[CardEditorWindow] Card UI prefab not loaded"); + return; + } + + try + { + // Create the preview instance in the PreviewRenderUtility's scene + if (_previewUtility != null) + { + // 1. First create a root GameObject in the preview scene + _previewInstance = new GameObject("PreviewRoot"); + _previewInstance.hideFlags = HideFlags.HideAndDontSave; + + // 2. Create a Canvas to hold our card UI + GameObject canvasGO = new GameObject("PreviewCanvas"); + canvasGO.transform.SetParent(_previewInstance.transform, false); + + // 3. Add Canvas component and configure it + Canvas canvas = canvasGO.AddComponent(); + canvas.renderMode = RenderMode.WorldSpace; // Changed from ScreenSpaceCamera to WorldSpace + canvas.worldCamera = _previewUtility.camera; + + // Set fixed world space size for the canvas + RectTransform canvasRect = canvasGO.GetComponent(); + canvasRect.sizeDelta = new Vector2(30f, 30f * (9f/16f)); // Increased from 10f to 30f for better sizing with larger ortho + canvasRect.localPosition = Vector3.zero; // Center position + canvasRect.localScale = Vector3.one * 0.8f; // Slightly scaled down for better proportions + + // 4. Add CanvasScaler but configure it for constant physical size instead of responsive scaling + CanvasScaler scaler = canvasGO.AddComponent(); + scaler.uiScaleMode = CanvasScaler.ScaleMode.ConstantPixelSize; // Use constant pixel size instead of screen-based scaling + scaler.scaleFactor = 1f; // Base scale factor + + // 5. Add GraphicRaycaster (required for UI) + canvasGO.AddComponent(); + + // 6. Instantiate the card prefab as a child of the canvas + GameObject cardInstance = GameObject.Instantiate(_cardUIPrefab, canvasGO.transform, false); + + // 7. Position the card in the center of the canvas and set a fixed size + RectTransform cardRect = cardInstance.GetComponent(); + if (cardRect != null) + { + cardRect.anchorMin = new Vector2(0.5f, 0.5f); + cardRect.anchorMax = new Vector2(0.5f, 0.5f); + cardRect.pivot = new Vector2(0.5f, 0.5f); + cardRect.anchoredPosition = Vector2.zero; + // Use the original size of the card prefab + // No automatic scaling will occur in world space mode + } + + // 8. Get the CardUIElement component + _previewCardElement = cardInstance.GetComponent(); + if (_previewCardElement == null) + { + _previewCardElement = cardInstance.GetComponentInChildren(); + } + + // 9. Add the root to the preview scene + _previewUtility.AddSingleGO(_previewInstance); + + // 10. Set the visual config + if (_cardVisualConfig != null && _previewCardElement != null) + { + var serializedObject = new SerializedObject(_previewCardElement); + var visualConfigProperty = serializedObject.FindProperty("visualConfig"); + if (visualConfigProperty != null) + { + visualConfigProperty.objectReferenceValue = _cardVisualConfig; + serializedObject.ApplyModifiedProperties(); + } + } + + // 11. Update the preview with card data if available + if (_previewCardData != null && _previewCardElement != null) + { + _previewCardElement.SetupCard(_previewCardData); + } + + // Set up the camera to frame the canvas properly + SetupPreviewCamera(); + + Debug.Log($"[CardEditorWindow] Successfully created preview card with UI canvas in PreviewRenderUtility"); + } + else + { + // Fallback to the original method for creating the preview object + _previewCardObject = Instantiate(_cardUIPrefab); + _previewCardObject.hideFlags = _debugMode ? HideFlags.DontSave : HideFlags.HideAndDontSave; + + foreach (var renderer in _previewCardObject.GetComponentsInChildren()) + { + renderer.enabled = false; + } + + _previewCardElement = _previewCardObject.GetComponent(); + if (_previewCardElement == null) + { + _previewCardElement = _previewCardObject.GetComponentInChildren(); + } + + // Create an Editor for the preview object to generate previews + if (_cardPreviewEditor != null) + { + DestroyImmediate(_cardPreviewEditor); + } + _cardPreviewEditor = UnityEditor.Editor.CreateEditor(_previewCardObject); + } + + _previewNeedsUpdate = true; + } + catch (System.Exception e) + { + Debug.LogError($"[CardEditorWindow] Error creating preview card: {e.Message}\n{e.StackTrace}"); + } + } + + private void SetupPreviewCamera() + { + if (_previewUtility == null) + return; + + // Configure camera for UI rendering + Camera cam = _previewUtility.camera; + cam.clearFlags = CameraClearFlags.SolidColor; + cam.backgroundColor = new Color(0.2f, 0.2f, 0.2f); // Dark gray background + + // Apply the base orthographic size with the current zoom multiplier + cam.orthographicSize = BASE_ORTHO_SIZE / _zoomMultiplier; + + // Position the camera to look at the origin + cam.transform.position = new Vector3(0, 0, -5); + cam.transform.rotation = Quaternion.identity; + + if (_debugMode) + { + Debug.Log($"[CardEditorWindow] Setup preview camera at position: {cam.transform.position}, orthographicSize: {cam.orthographicSize}"); + } + } + + private void CleanupPreviewInstance() + { + if (_previewInstance != null) + { + DestroyImmediate(_previewInstance); + _previewInstance = null; + } + + _previewCardElement = null; + } + + private void CleanupPreview() + { + CleanupPreviewInstance(); + + if (_previewCardObject != null) + { + DestroyImmediate(_previewCardObject); + _previewCardObject = null; + } + + if (_cardPreviewEditor != null) + { + DestroyImmediate(_cardPreviewEditor); + _cardPreviewEditor = null; + } + + if (_staticPreviewTexture != null) + { + DestroyImmediate(_staticPreviewTexture); + _staticPreviewTexture = null; + } + + if (_previewUtility != null) + { + _previewUtility.Cleanup(); + _previewUtility = null; + } + } + + private void UpdatePreview() + { + if (_editingCard == null || !_showPreview) + return; + + try + { + // Update the preview card UI element + if (_previewCardElement != null) + { + // First set the cardDefinition field via reflection or SerializedObject + // (since it's a serialized field we don't have direct access) + var serializedObject = new SerializedObject(_previewCardElement); + var cardDefinitionProperty = serializedObject.FindProperty("cardDefinition"); + if (cardDefinitionProperty != null) + { + cardDefinitionProperty.objectReferenceValue = _editingCard; + serializedObject.ApplyModifiedProperties(); + } + + // Now directly call CreateFromDefinition which will create the card data and update visuals + var createFromDefMethod = typeof(CardUIElement).GetMethod("CreateFromDefinition", + System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public | + System.Reflection.BindingFlags.NonPublic); + + if (createFromDefMethod != null) + { + createFromDefMethod.Invoke(_previewCardElement, null); + + // Store a reference to the card data for other uses if needed + var cardDataField = typeof(CardUIElement).GetField("cardData", + System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic); + if (cardDataField != null) + { + _previewCardData = (CardData)cardDataField.GetValue(_previewCardElement); + } + + _previewNeedsUpdate = true; + } + else + { + Debug.LogError("[CardEditorWindow] Could not find CreateFromDefinition method in CardUIElement"); + } + + // Auto-frame the card in the preview by calculating its bounds + if (_previewInstance != null) + { + AutoFramePreviewObject(); + } + + if (_debugMode) + { + Debug.Log($"[CardEditorWindow] Updated preview card data via CreateFromDefinition: {_editingCard.Name}"); + } + } + } + catch (System.Exception ex) + { + Debug.LogError($"[CardEditorWindow] Error updating preview: {ex.Message}\n{ex.StackTrace}"); + } + } + + private void AutoFramePreviewObject() + { + if (_previewInstance == null || _previewUtility == null) + return; + + // Find all visible elements to calculate bounds + Bounds bounds = new Bounds(); + bool boundsInitialized = false; + + // Calculate bounds from RectTransforms properly by using their corners in world space + foreach (var rectTransform in _previewInstance.GetComponentsInChildren()) + { + // Get the corners of the RectTransform in world space + Vector3[] corners = new Vector3[4]; + rectTransform.GetWorldCorners(corners); + + // Initialize or expand bounds based on corners + if (!boundsInitialized) + { + bounds = new Bounds(corners[0], Vector3.zero); + boundsInitialized = true; + + // Expand initial bounds to include all corners + for (int i = 1; i < 4; i++) + { + bounds.Encapsulate(corners[i]); + } + } + else + { + // Encapsulate all corners for existing bounds + foreach (Vector3 corner in corners) + { + bounds.Encapsulate(corner); + } + } + } + + // Also check regular Renderers (if any) + foreach (var renderer in _previewInstance.GetComponentsInChildren()) + { + if (!boundsInitialized) + { + bounds = renderer.bounds; + boundsInitialized = true; + } + else + { + bounds.Encapsulate(renderer.bounds); + } + } + + // Keep using the existing camera settings, only update the orthographic size based on zoom + Camera cam = _previewUtility.camera; + cam.orthographicSize = BASE_ORTHO_SIZE / _zoomMultiplier; + + if (_debugMode) + { + Debug.Log($"[CardEditorWindow] Updated zoom: orthoSize={cam.orthographicSize}, zoomMultiplier={_zoomMultiplier}, position={cam.transform.position}"); + } + } + + private void RenderCardPreview(Rect rect) + { + if (_editingCard == null) + { + DrawSimplePreview(rect); + return; + } + + // Use PreviewRenderUtility if available + if (_previewUtility != null && _previewInstance != null) + { + try + { + // Store the current orthographic size before rendering (to restore it if changed) + float currentOrthoSize = _previewUtility.camera.orthographicSize; + + // Start the preview rendering - using a fixed size to maintain consistency + _previewUtility.BeginPreview(rect, GUIStyle.none); + + // Ensure the camera's orthographic size is correct before rendering + _previewUtility.camera.orthographicSize = BASE_ORTHO_SIZE / _zoomMultiplier; + + // Apply rotation based on orbit angle + if (_previewInstance != null) + { + _previewInstance.transform.rotation = Quaternion.Euler(0, _orbitRotation, 0); + } + + // Render the preview scene + _previewUtility.camera.Render(); + + // Get the rendered texture and draw it + Texture rendered = _previewUtility.EndPreview(); + + // Keep a constant aspect ratio when drawing + float textureAspect = (float)rendered.width / rendered.height; + float rectAspect = rect.width / rect.height; + + Rect drawRect = rect; + + // Adjust the drawing rectangle to maintain aspect ratio + if (textureAspect > rectAspect) // Texture is wider than rect + { + float newHeight = rect.width / textureAspect; + drawRect.y += (rect.height - newHeight) * 0.5f; + drawRect.height = newHeight; + } + else // Texture is taller than rect + { + float newWidth = rect.height * textureAspect; + drawRect.x += (rect.width - newWidth) * 0.5f; + drawRect.width = newWidth; + } + + // Draw with fixed aspect ratio + GUI.DrawTexture(drawRect, rendered, ScaleMode.StretchToFill); + + // Draw overlay info + GUI.Label(new Rect(rect.x + 10, rect.y + 10, rect.width - 20, 20), + $"Preview: {_editingCard.Name}", EditorStyles.boldLabel); + + if (_debugMode) + { + // Show size debugging info + GUI.Label(new Rect(rect.x + 10, rect.y + rect.height - 40, rect.width - 20, 20), + $"Texture: {rendered.width}x{rendered.height}, Rect: {rect.width}x{rect.height}", + EditorStyles.miniLabel); + } + + return; + } + catch (System.Exception ex) + { + Debug.LogError($"[CardEditorWindow] Error rendering with PreviewRenderUtility: {ex.Message}"); + // Fall through to backup rendering method + } + } + + // Fallback to the original preview method if PreviewRenderUtility failed + if (_cardPreviewEditor != null) + { + try + { + // Use the editor's OnInteractivePreviewGUI to render our card preview + _cardPreviewEditor.OnPreviewGUI(rect, EditorStyles.helpBox); + + // Draw overlay information + GUI.Label(new Rect(rect.x + 10, rect.y + 10, rect.width - 20, 20), + $"Preview: {_editingCard.Name}", EditorStyles.boldLabel); + return; + } + catch (System.Exception ex) + { + Debug.LogError($"[CardEditorWindow] Error rendering with Editor preview: {ex.Message}"); + } + } + + // Ultimate fallback if all else fails + DrawSimplePreview(rect); + } + + private void OnGUI() + { + GUILayout.BeginHorizontal(); + + // Card list panel (left) + DrawCardListPanel(); + + // Add padding between sections + GUILayout.Space(10); + + // Card editor panel (middle) + DrawCardEditPanel(); + + // Add padding between sections + GUILayout.Space(10); + + // Card preview panel (right) + DrawCardPreviewPanel(); + + GUILayout.EndHorizontal(); + } + + private void DrawCardListPanel() + { + GUILayout.BeginVertical(GUILayout.Width(250)); + + // Header + GUILayout.Label("Cards", EditorStyles.boldLabel); + + // Search bar + EditorGUI.BeginChangeCheck(); + _searchQuery = EditorGUILayout.TextField("Search", _searchQuery, GUILayout.ExpandWidth(true)); + if (EditorGUI.EndChangeCheck()) + { + Repaint(); + } + + // Create new card button + if (GUILayout.Button("Create New Card")) + { + CreateNewCard(); + } + + // Card list + _cardListScrollPosition = EditorGUILayout.BeginScrollView(_cardListScrollPosition); + + // Filter by search query if any + List filteredCards = _cards; + if (!string.IsNullOrWhiteSpace(_searchQuery)) + { + string search = _searchQuery.ToLowerInvariant(); + filteredCards = _cards.Where(c => + c.Name.ToLowerInvariant().Contains(search) || + c.Description.ToLowerInvariant().Contains(search) || + c.Zone.ToString().ToLowerInvariant().Contains(search) || + c.Rarity.ToString().ToLowerInvariant().Contains(search) + ).ToList(); + } + + // Display cards + foreach (var card in filteredCards) + { + bool isSelected = _selectedCard != null && _selectedCard.Id == card.Id; + + GUIStyle style = isSelected ? EditorStyles.selectionRect : EditorStyles.label; + + EditorGUILayout.BeginHorizontal(style); + + if (GUILayout.Button(card.Name, EditorStyles.label, GUILayout.ExpandWidth(true))) + { + SelectCard(card); + } + + GUILayout.Label(card.Rarity.ToString(), GUILayout.Width(70)); + + EditorGUILayout.EndHorizontal(); + } + + EditorGUILayout.EndScrollView(); + + GUILayout.EndVertical(); + } + + private void DrawCardEditPanel() + { + GUILayout.BeginVertical(GUILayout.ExpandWidth(true)); + + if (_editingCard != null) + { + // Header + GUILayout.Label("Edit Card", EditorStyles.boldLabel); + + _cardEditScrollPosition = EditorGUILayout.BeginScrollView(_cardEditScrollPosition); + + // Basic info + EditorGUI.BeginChangeCheck(); + + _editingCard.Name = EditorGUILayout.TextField("Name", _editingCard.Name); + _editingCard.Description = EditorGUILayout.TextArea(_editingCard.Description, GUILayout.Height(100)); + _editingCard.Rarity = (CardRarity)EditorGUILayout.EnumPopup("Rarity", _editingCard.Rarity); + _editingCard.Zone = (CardZone)EditorGUILayout.EnumPopup("Zone", _editingCard.Zone); + + // Visual elements + EditorGUILayout.Space(); + GUILayout.Label("Visual Elements", EditorStyles.boldLabel); + + _editingCard.CardImage = (Sprite)EditorGUILayout.ObjectField("Card Image", _editingCard.CardImage, typeof(Sprite), false); + + // Display derived properties (for information only) + GUI.enabled = false; + EditorGUILayout.ColorField("Background Color (from Zone)", _editingCard.GetBackgroundColor()); + EditorGUILayout.TextField("Frame Shape (from Rarity)", $"Frame_{_editingCard.Rarity}"); + GUI.enabled = true; + + // Collection info + EditorGUILayout.Space(); + GUILayout.Label("Collection Info", EditorStyles.boldLabel); + + _editingCard.CollectionIndex = EditorGUILayout.IntField("Collection Index", _editingCard.CollectionIndex); + + if (EditorGUI.EndChangeCheck()) + { + _isDirty = true; + UpdatePreview(); + } + + GUILayout.FlexibleSpace(); + + // Action buttons + GUILayout.BeginHorizontal(); + + if (GUILayout.Button("Apply Changes", GUILayout.Height(30))) + { + ApplyChanges(); + } + + if (GUILayout.Button("Duplicate", GUILayout.Height(30))) + { + DuplicateSelectedCard(); + } + + if (GUILayout.Button("Delete", GUILayout.Height(30))) + { + if (EditorUtility.DisplayDialog("Delete Card", + $"Are you sure you want to delete '{_selectedCard.Name}'?", + "Delete", "Cancel")) + { + DeleteSelectedCard(); + } + } + + GUILayout.EndHorizontal(); + + // Warning if dirty + if (_isDirty) + { + EditorGUILayout.HelpBox("You have unsaved changes.", MessageType.Info); + } + + EditorGUILayout.EndScrollView(); + } + else + { + GUILayout.Label("Select a card to edit", EditorStyles.centeredGreyMiniLabel); + } + + GUILayout.EndVertical(); + } + + private void DrawCardPreviewPanel() + { + GUILayout.BeginVertical(GUILayout.Width(300)); + + // Header with toggle + GUILayout.BeginHorizontal(); + GUILayout.Label("Preview", EditorStyles.boldLabel); + + EditorGUI.BeginChangeCheck(); + _showPreview = EditorGUILayout.Toggle("Show Preview", _showPreview); + if (EditorGUI.EndChangeCheck()) + { + if (_showPreview) + { + // Recreate the preview when toggling it on + CreatePreviewCardObject(); + UpdatePreview(); + } + } + GUILayout.EndHorizontal(); + + if (_showPreview && _editingCard != null) + { + // Preview area + _previewRect = GUILayoutUtility.GetRect(300, 400); + + // Render the preview + RenderCardPreview(_previewRect); + + // Preview controls + GUILayout.BeginHorizontal(); + + // Refresh button + if (GUILayout.Button("Refresh Preview")) + { + CreatePreviewCardObject(); + UpdatePreview(); + } + + // Auto-rotate toggle + EditorGUI.BeginChangeCheck(); + _autoRotate = GUILayout.Toggle(_autoRotate, "Auto-Rotate"); + if (EditorGUI.EndChangeCheck() && _autoRotate) + { + _autoRotateSpeed = 20f; // Degrees per second + } + + // Debug toggle + EditorGUI.BeginChangeCheck(); + _debugMode = GUILayout.Toggle(_debugMode, "Debug Mode"); + if (EditorGUI.EndChangeCheck()) + { + // If entering debug mode, make objects visible in hierarchy + if (_previewCardObject != null) + { + _previewCardObject.hideFlags = _debugMode ? + HideFlags.DontSave : HideFlags.HideAndDontSave; + } + } + + GUILayout.EndHorizontal(); + + // Manual rotation slider + if (!_autoRotate) + { + EditorGUI.BeginChangeCheck(); + _orbitRotation = EditorGUILayout.Slider("Rotation", _orbitRotation, 0f, 360f); + if (EditorGUI.EndChangeCheck()) + { + Repaint(); + } + } + + // Zoom control + EditorGUI.BeginChangeCheck(); + _zoomMultiplier = EditorGUILayout.Slider("Zoom", _zoomMultiplier, 0.0f, 4.0f); + if (EditorGUI.EndChangeCheck()) + { + if (_previewUtility != null) + { + // Adjust the orthographic size of the camera based on zoom level + _previewUtility.camera.orthographicSize = BASE_ORTHO_SIZE / _zoomMultiplier; + if (_debugMode) + { + Debug.Log($"[CardEditorWindow] Adjusted camera orthographic size for zoom. Zoom: {_zoomMultiplier}, Ortho: {_previewUtility.camera.orthographicSize}"); + } + } + } + + // Debug info + if (_debugMode) + { + EditorGUILayout.LabelField($"Card: {_editingCard.Name}"); + EditorGUILayout.LabelField($"Rarity: {_editingCard.Rarity}"); + EditorGUILayout.LabelField($"Zone: {_editingCard.Zone}"); + EditorGUILayout.LabelField($"Preview Method: {(_previewUtility != null ? "PreviewRenderUtility" : "Editor Preview")}"); + EditorGUILayout.LabelField($"UI Component: {(_previewCardElement != null ? "Found" : "Missing")}"); + + if (_previewUtility != null && _previewInstance != null) + { + EditorGUILayout.LabelField($"Camera Position: {_previewUtility.camera.transform.position}"); + EditorGUILayout.LabelField($"Card Rotation: {_previewInstance.transform.rotation.eulerAngles}"); + } + } + + EditorGUILayout.HelpBox( + "This preview uses PreviewRenderUtility to render the card prefab in a hidden scene. " + + "You can rotate the card to see it from different angles.", MessageType.Info); + } + + GUILayout.EndVertical(); + } + + + private void DrawSimplePreview(Rect rect) + { + // This is the original simple preview code as a fallback + + // Draw a colored background to represent the card + EditorGUI.DrawRect(rect, _editingCard.GetBackgroundColor()); + + // Draw a border + Rect borderRect = new Rect(rect.x + 2, rect.y + 2, rect.width - 4, rect.height - 4); + EditorGUI.DrawRect(borderRect, Color.white); + + // Draw card name + Rect nameRect = new Rect(rect.x + 20, rect.y + 20, rect.width - 40, 30); + EditorGUI.LabelField(nameRect, _editingCard.Name, EditorStyles.whiteLargeLabel); + + // Draw card image if available + if (_editingCard.CardImage != null) + { + Rect imageRect = new Rect(rect.x + 50, rect.y + 60, rect.width - 100, 200); + GUI.DrawTexture(imageRect, AssetPreview.GetAssetPreview(_editingCard.CardImage) ?? _editingCard.CardImage.texture); + } + + // Draw card description + Rect descRect = new Rect(rect.x + 20, rect.y + 270, rect.width - 40, 100); + EditorGUI.LabelField(descRect, _editingCard.Description, EditorStyles.wordWrappedLabel); + + // Draw rarity at the bottom + Rect rarityRect = new Rect(rect.x + 20, rect.y + rect.height - 40, rect.width - 40, 30); + EditorGUI.LabelField(rarityRect, $"Rarity: {_editingCard.Rarity}", EditorStyles.boldLabel); + } + + private Color GetRarityColor(CardRarity rarity) + { + switch (rarity) + { + case CardRarity.Common: + return Color.gray; + case CardRarity.Uncommon: + return Color.green; + case CardRarity.Rare: + return Color.blue; + case CardRarity.Epic: + return new Color(0.5f, 0f, 0.5f); // Purple + case CardRarity.Legendary: + return Color.yellow; + default: + return Color.white; + } + } + + private void SelectCard(CardDefinition card) + { + // Check for unsaved changes + if (_isDirty && _selectedCard != null) + { + if (EditorUtility.DisplayDialog("Unsaved Changes", + "You have unsaved changes. Do you want to apply them before switching cards?", + "Apply Changes", "Discard Changes")) + { + ApplyChanges(); + } + } + + _selectedCard = card; + _editingCard = CloneCard(card); + _isDirty = false; + + // Force a complete recreation of the preview when selecting a new card + if (_showPreview) + { + // Clean up previous preview objects to ensure a fresh start + CleanupPreviewInstance(); + // Create a new preview instance with the selected card + CreatePreviewCardObject(); + // Update preview with the new card data + UpdatePreview(); + } + } + + private void CreateNewCard() + { + // Create a new card definition + CardDefinition newCard = CreateInstance(); + + // Set default values + newCard.Id = System.Guid.NewGuid().ToString(); + newCard.Name = "New Card"; + newCard.Description = "Description goes here"; + newCard.Rarity = CardRarity.Common; + newCard.Zone = CardZone.AppleHills; + // Note: No longer setting BackgroundColor since it's derived from Zone + newCard.CollectionIndex = _cards.Count; + + // Save the asset + string path = $"{CardDefinitionsPath}/Card_{newCard.Name}.asset"; + path = AssetDatabase.GenerateUniqueAssetPath(path); + AssetDatabase.CreateAsset(newCard, path); + AssetDatabase.SaveAssets(); + AssetDatabase.Refresh(); + + // Reload cards and select the new one + LoadCardDefinitions(); + SelectCard(newCard); + } + + private void DuplicateSelectedCard() + { + if (_selectedCard == null) + return; + + // Create a new card definition + CardDefinition newCard = CloneCard(_editingCard); + + // Give it a new ID + newCard.Id = System.Guid.NewGuid().ToString(); + newCard.Name += " (Copy)"; + + // Save the asset + string path = $"{CardDefinitionsPath}/Card_{newCard.Name}.asset"; + path = AssetDatabase.GenerateUniqueAssetPath(path); + AssetDatabase.CreateAsset(newCard, path); + AssetDatabase.SaveAssets(); + AssetDatabase.Refresh(); + + // Reload cards and select the new one + LoadCardDefinitions(); + SelectCard(newCard); + } + + private void DeleteSelectedCard() + { + if (_selectedCard == null) + return; + + // Get the path of the selected card + string path = AssetDatabase.GetAssetPath(_selectedCard); + + // Delete the asset + AssetDatabase.DeleteAsset(path); + AssetDatabase.SaveAssets(); + AssetDatabase.Refresh(); + + // Clear selection and reload + _selectedCard = null; + _editingCard = null; + _isDirty = false; + LoadCardDefinitions(); + } + + private void ApplyChanges() + { + if (_selectedCard == null || _editingCard == null) + return; + + // Apply changes to the selected card + EditorUtility.CopySerialized(_editingCard, _selectedCard); + + // Mark as dirty and save + EditorUtility.SetDirty(_selectedCard); + AssetDatabase.SaveAssets(); + + // Clear dirty flag + _isDirty = false; + } + + private CardDefinition CloneCard(CardDefinition original) + { + CardDefinition clone = CreateInstance(); + EditorUtility.CopySerialized(original, clone); + return clone; + } + } +} diff --git a/Assets/Editor/CardSystem/CardEditorWindow.cs.meta b/Assets/Editor/CardSystem/CardEditorWindow.cs.meta new file mode 100644 index 00000000..87ccb730 --- /dev/null +++ b/Assets/Editor/CardSystem/CardEditorWindow.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 8055c7b5c1c541cbb3ee9e55bf65b376 +timeCreated: 1759925706 \ No newline at end of file diff --git a/Assets/External/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF.asset b/Assets/External/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF.asset index 54327370..d39ee081 100644 --- a/Assets/External/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF.asset +++ b/Assets/External/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF.asset @@ -37,7 +37,7 @@ Material: - _MaskSoftnessX: 0 - _MaskSoftnessY: 0 - _OutlineSoftness: 0 - - _OutlineWidth: 0.045 + - _OutlineWidth: 0.2 - _PerspectiveFilter: 0.875 - _ScaleRatioA: 0.9 - _ScaleRatioB: 1 diff --git a/Assets/Prefabs/Minigames/DivingForPictures/QuarryMonster.prefab b/Assets/Prefabs/Minigames/DivingForPictures/QuarryMonster.prefab index 4245050c..225b76bf 100644 --- a/Assets/Prefabs/Minigames/DivingForPictures/QuarryMonster.prefab +++ b/Assets/Prefabs/Minigames/DivingForPictures/QuarryMonster.prefab @@ -12,6 +12,7 @@ GameObject: - component: {fileID: 8447572436637192077} - component: {fileID: 4998672042618199381} - component: {fileID: 3714732064953161914} + - component: {fileID: 8725474797166928194} m_Layer: 12 m_Name: QuarryMonster m_TagString: Untagged @@ -19,21 +20,26 @@ GameObject: m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &6779310478082390115 -Transform: +--- !u!224 &6779310478082390115 +RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 2015720985618639356} - serializedVersion: 2 m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 2.46, y: -1.79, z: 0} + m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} m_ConstrainProportionsScale: 0 - m_Children: [] + m_Children: + - {fileID: 2948264547315403581} m_Father: {fileID: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 2.46, y: 3.45} + m_Pivot: {x: 0.5, y: 0.5} --- !u!212 &8447572436637192077 SpriteRenderer: m_ObjectHideFlags: 0 @@ -54,6 +60,8 @@ SpriteRenderer: m_RayTracingAccelStructBuildFlagsOverride: 0 m_RayTracingAccelStructBuildFlags: 1 m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: @@ -75,6 +83,7 @@ SpriteRenderer: m_AutoUVMaxDistance: 0.5 m_AutoUVMaxAngle: 89 m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 m_SortingLayerID: 0 m_SortingLayer: 0 m_SortingOrder: 0 @@ -124,7 +133,7 @@ CircleCollider2D: m_CompositeOperation: 0 m_CompositeOrder: 0 m_Offset: {x: 0, y: 0} - m_Radius: 3 + m_Radius: 4.8 --- !u!114 &3714732064953161914 MonoBehaviour: m_ObjectHideFlags: 0 @@ -138,3 +147,114 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: detectionCollider: {fileID: 4998672042618199381} +--- !u!222 &8725474797166928194 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2015720985618639356} + m_CullTransparentMesh: 1 +--- !u!1 &5329236367077024222 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2948264547315403581} + - component: {fileID: 3497342652431039817} + - component: {fileID: 1007575356016584257} + m_Layer: 12 + m_Name: ProximityIndicator + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2948264547315403581 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5329236367077024222} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0.19, y: 0.19, z: 0.19} + m_ConstrainProportionsScale: 1 + m_Children: [] + m_Father: {fileID: 6779310478082390115} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 20, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &3497342652431039817 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5329236367077024222} + m_CullTransparentMesh: 1 +--- !u!212 &1007575356016584257 +SpriteRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5329236367077024222} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 0 + m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: a97c105638bdf8b4a8650670310a4cd3, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 0 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_Sprite: {fileID: -1042073035024568290, guid: 0bbb26ed6c3670b4293fca36266cacd6, type: 3} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_FlipX: 0 + m_FlipY: 0 + m_DrawMode: 0 + m_Size: {x: 44.97, y: 44.920002} + m_AdaptiveModeThreshold: 0.5 + m_SpriteTileMode: 0 + m_WasSpriteAssigned: 1 + m_MaskInteraction: 0 + m_SpriteSortPoint: 0 diff --git a/Assets/Prefabs/UI/CameraCrosshair.prefab b/Assets/Prefabs/UI/CameraCrosshair.prefab new file mode 100644 index 00000000..0bd74e27 --- /dev/null +++ b/Assets/Prefabs/UI/CameraCrosshair.prefab @@ -0,0 +1,343 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &3191012273289593430 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5112036956614418003} + - component: {fileID: 1661625883045147498} + - component: {fileID: 3982494409369176681} + - component: {fileID: 644215793910550285} + - component: {fileID: 3473674839339771682} + m_Layer: 5 + m_Name: CameraCrosshair + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &5112036956614418003 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3191012273289593430} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 7977007561442923662} + - {fileID: 2458922740234910074} + - {fileID: 5102142052451200951} + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 1080, y: 1080} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1661625883045147498 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3191012273289593430} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.LayoutElement + m_IgnoreLayout: 0 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: -1 + m_PreferredHeight: 1080 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!114 &3982494409369176681 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3191012273289593430} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4b4b818dd8cb454abe85b8edcaece1db, type: 3} + m_Name: + m_EditorClassIdentifier: AppleHillsScripts::Minigames.DivingForPictures.PictureCamera.Viewfinder + viewfinderImages: + - {fileID: 6238430743545047181} + - {fileID: 1454823446688413410} + - {fileID: 4320080458651963543} +--- !u!222 &644215793910550285 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3191012273289593430} + m_CullTransparentMesh: 1 +--- !u!114 &3473674839339771682 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3191012273289593430} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 0} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &4595905309701925297 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2458922740234910074} + - component: {fileID: 5615879403855295613} + - component: {fileID: 1454823446688413410} + m_Layer: 5 + m_Name: FrameInner + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2458922740234910074 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4595905309701925297} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 5112036956614418003} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: -100, y: -100} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &5615879403855295613 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4595905309701925297} + m_CullTransparentMesh: 1 +--- !u!114 &1454823446688413410 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4595905309701925297} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: -2291430160556362638, guid: 0db492dd1eea9514db54af61f1a4d79e, type: 3} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 2.09 +--- !u!1 &5728489349197067000 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5102142052451200951} + - component: {fileID: 2870967395300042642} + - component: {fileID: 4320080458651963543} + m_Layer: 5 + m_Name: Crosshair + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &5102142052451200951 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5728489349197067000} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 5112036956614418003} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 100, y: 100} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &2870967395300042642 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5728489349197067000} + m_CullTransparentMesh: 1 +--- !u!114 &4320080458651963543 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5728489349197067000} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: -4229316332011032055, guid: c9d2fdec6416f7840a7eb9f6542b3c01, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &6361514160153350252 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 7977007561442923662} + - component: {fileID: 7721310424969853524} + - component: {fileID: 6238430743545047181} + m_Layer: 5 + m_Name: FrameOuter + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &7977007561442923662 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6361514160153350252} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 5112036956614418003} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &7721310424969853524 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6361514160153350252} + m_CullTransparentMesh: 1 +--- !u!114 &6238430743545047181 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6361514160153350252} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: -2291430160556362638, guid: 0db492dd1eea9514db54af61f1a4d79e, type: 3} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 2.09 diff --git a/Assets/Prefabs/UI/CameraCrosshair.prefab.meta b/Assets/Prefabs/UI/CameraCrosshair.prefab.meta new file mode 100644 index 00000000..1265ce8a --- /dev/null +++ b/Assets/Prefabs/UI/CameraCrosshair.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 99666bddf27a652479c2a3e0007a94dc +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Prefabs/UI/Cards.meta b/Assets/Prefabs/UI/Cards.meta new file mode 100644 index 00000000..0360a0d9 --- /dev/null +++ b/Assets/Prefabs/UI/Cards.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 320a6ca9a05e02f4aa97badfd140d9f1 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Prefabs/UI/Cards/CardUI.prefab b/Assets/Prefabs/UI/Cards/CardUI.prefab new file mode 100644 index 00000000..c3e1892c --- /dev/null +++ b/Assets/Prefabs/UI/Cards/CardUI.prefab @@ -0,0 +1,619 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &1674595570562273386 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8321041088571283042} + - component: {fileID: 8657710833814654092} + - component: {fileID: 3062587662617271504} + m_Layer: 5 + m_Name: Background + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &8321041088571283042 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1674595570562273386} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 7987423280633120294} + - {fileID: 6467154550771149323} + - {fileID: 5853287755371765300} + - {fileID: 1376284209458560831} + m_Father: {fileID: 2699789555794789249} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &8657710833814654092 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1674595570562273386} + m_CullTransparentMesh: 1 +--- !u!114 &3062587662617271504 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1674595570562273386} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image + m_Material: {fileID: 0} + m_Color: {r: 0.8, g: 0.9, b: 0.8, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 0 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: -3713692513169282065, guid: 6dd6a8569dd5cef408d97594bb5e9d49, type: 3} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 2.5 +--- !u!1 &2060536854119323360 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8124520331884430719} + - component: {fileID: 2165315952716078155} + - component: {fileID: 2550939788652313610} + m_Layer: 0 + m_Name: NameText + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &8124520331884430719 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2060536854119323360} + m_LocalRotation: {x: -0, y: -0, z: 0.15619579, w: 0.9877261} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 7987423280633120294} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 17.972} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: -2.9004517, y: 8.941284} + m_SizeDelta: {x: 200, y: 50} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &2165315952716078155 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2060536854119323360} + m_CullTransparentMesh: 1 +--- !u!114 &2550939788652313610 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2060536854119323360} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.TextMeshPro::TMPro.TextMeshProUGUI + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: Test example card 3 + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4294967295 + m_fontColor: {r: 1, g: 1, b: 1, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 15 + m_fontSizeBase: 15 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_TextWrappingMode: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 0 + m_ActiveFontFeatures: 6e72656b + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_EmojiFallbackSupport: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!1 &2421709636016798578 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 7987423280633120294} + - component: {fileID: 8745186166470585342} + - component: {fileID: 353314911414134125} + m_Layer: 0 + m_Name: NameBackground + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &7987423280633120294 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2421709636016798578} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 1 + m_Children: + - {fileID: 8124520331884430719} + m_Father: {fileID: 8321041088571283042} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0} + m_AnchorMax: {x: 0.5, y: 0} + m_AnchoredPosition: {x: 0, y: 54.599976} + m_SizeDelta: {x: 250, y: 77.5} + m_Pivot: {x: 0.5, y: 0} +--- !u!222 &8745186166470585342 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2421709636016798578} + m_CullTransparentMesh: 1 +--- !u!114 &353314911414134125 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2421709636016798578} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: -3310850967021205615, guid: bf14f631f4b34e74d83c20a1dd671422, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &3326706725254864107 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2699789555794789249} + - component: {fileID: 8725212443281664752} + - component: {fileID: 3914488700080302779} + - component: {fileID: 6599324117435394003} + m_Layer: 5 + m_Name: CardUI + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2699789555794789249 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3326706725254864107} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 8321041088571283042} + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 300, y: 450} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &8725212443281664752 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3326706725254864107} + m_CullTransparentMesh: 1 +--- !u!114 &3914488700080302779 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3326706725254864107} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 0} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &6599324117435394003 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3326706725254864107} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: aed7c581bdb84200a05dd8a7df409ab0, type: 3} + m_Name: + m_EditorClassIdentifier: AppleHillsScripts::AppleHills.UI.CardSystem.CardUIElement + cardNameText: {fileID: 2550939788652313610} + cardImage: {fileID: 959067373316088928} + frameImage: {fileID: 1665411369613789579} + backgroundImage: {fileID: 3062587662617271504} + backgroundShape: {fileID: 8871089254192903045} + cardDefinition: {fileID: 11400000, guid: 28dbfbd7a6b2cd84b8274bd1126b220b, type: 2} + cardData: + Id: aca05c10-f25d-4636-95bf-8497c841b95a + DefinitionId: ee1e2aec-bdb6-4c68-8d7a-061c7f5e8583 + Rarity: 2 + CopiesOwned: 1 + visualConfig: {fileID: 11400000, guid: 473a9bc98f6f6684e8023126fc557a88, type: 2} +--- !u!1 &3429746996164215956 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5853287755371765300} + - component: {fileID: 8909872439431770690} + - component: {fileID: 8871089254192903045} + m_Layer: 5 + m_Name: BackgroundShape + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &5853287755371765300 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3429746996164215956} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 8321041088571283042} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 29} + m_SizeDelta: {x: 250, y: 250} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &8909872439431770690 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3429746996164215956} + m_CullTransparentMesh: 1 +--- !u!114 &8871089254192903045 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3429746996164215956} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 8542402908941169558, guid: 84a9632f9bdc1ee4bab91cf4b764b5f7, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &5412331388939213537 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1376284209458560831} + - component: {fileID: 9097459168520965074} + - component: {fileID: 959067373316088928} + m_Layer: 5 + m_Name: Portrait + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1376284209458560831 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5412331388939213537} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 8321041088571283042} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 29} + m_SizeDelta: {x: 150, y: 150} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &9097459168520965074 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5412331388939213537} + m_CullTransparentMesh: 1 +--- !u!114 &959067373316088928 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5412331388939213537} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: -9213056636207805707, guid: 00354ded9d8f8d643acc14837a229544, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &5760001742287037279 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6467154550771149323} + - component: {fileID: 1731110110200268733} + - component: {fileID: 1665411369613789579} + m_Layer: 5 + m_Name: BorderFrame + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &6467154550771149323 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5760001742287037279} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 8321041088571283042} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &1731110110200268733 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5760001742287037279} + m_CullTransparentMesh: 1 +--- !u!114 &1665411369613789579 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5760001742287037279} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image + m_Material: {fileID: 0} + m_Color: {r: 0, g: 0.19755316, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 0 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 855352274089539417, guid: bd7528147fbfb4e40b0c06c68e99e217, type: 3} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 2.5 diff --git a/Assets/Prefabs/UI/Cards/CardUI.prefab.meta b/Assets/Prefabs/UI/Cards/CardUI.prefab.meta new file mode 100644 index 00000000..a2e80a14 --- /dev/null +++ b/Assets/Prefabs/UI/Cards/CardUI.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 594aad71e4281174da8fb4f47a8d19b0 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scenes/MiniGames/DivingForPictures_MICHAL.unity b/Assets/Scenes/MiniGames/DivingForPictures_MICHAL.unity new file mode 100644 index 00000000..1350ded3 --- /dev/null +++ b/Assets/Scenes/MiniGames/DivingForPictures_MICHAL.unity @@ -0,0 +1,2378 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!29 &1 +OcclusionCullingSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_OcclusionBakeSettings: + smallestOccluder: 5 + smallestHole: 0.25 + backfaceThreshold: 100 + m_SceneGUID: 00000000000000000000000000000000 + m_OcclusionCullingData: {fileID: 0} +--- !u!104 &2 +RenderSettings: + m_ObjectHideFlags: 0 + serializedVersion: 10 + m_Fog: 0 + m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} + m_FogMode: 3 + m_FogDensity: 0.01 + m_LinearFogStart: 0 + m_LinearFogEnd: 300 + m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} + m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} + m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} + m_AmbientIntensity: 1 + m_AmbientMode: 3 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} + m_SkyboxMaterial: {fileID: 0} + m_HaloStrength: 0.5 + m_FlareStrength: 1 + m_FlareFadeSpeed: 3 + m_HaloTexture: {fileID: 0} + m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} + m_DefaultReflectionMode: 0 + m_DefaultReflectionResolution: 128 + m_ReflectionBounces: 1 + m_ReflectionIntensity: 1 + m_CustomReflection: {fileID: 0} + m_Sun: {fileID: 0} + m_UseRadianceAmbientProbe: 0 +--- !u!157 &3 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 13 + m_BakeOnSceneLoad: 0 + m_GISettings: + serializedVersion: 2 + m_BounceScale: 1 + m_IndirectOutputScale: 1 + m_AlbedoBoost: 1 + m_EnvironmentLightingMode: 0 + m_EnableBakedLightmaps: 0 + m_EnableRealtimeLightmaps: 0 + m_LightmapEditorSettings: + serializedVersion: 12 + m_Resolution: 2 + m_BakeResolution: 40 + m_AtlasSize: 1024 + m_AO: 0 + m_AOMaxDistance: 1 + m_CompAOExponent: 1 + m_CompAOExponentDirect: 0 + m_ExtractAmbientOcclusion: 0 + m_Padding: 2 + m_LightmapParameters: {fileID: 0} + m_LightmapsBakeMode: 1 + m_TextureCompression: 1 + m_ReflectionCompression: 2 + m_MixedBakeMode: 2 + m_BakeBackend: 1 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 512 + m_PVRBounces: 2 + m_PVREnvironmentSampleCount: 256 + m_PVREnvironmentReferencePointCount: 2048 + m_PVRFilteringMode: 1 + m_PVRDenoiserTypeDirect: 1 + m_PVRDenoiserTypeIndirect: 1 + m_PVRDenoiserTypeAO: 1 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVREnvironmentMIS: 1 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 1 + m_PVRFilteringGaussRadiusAO: 1 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 + m_ExportTrainingData: 0 + m_TrainingDataDestination: TrainingData + m_LightProbeSampleCountMultiplier: 4 + m_LightingDataAsset: {fileID: 20201, guid: 0000000000000000f000000000000000, type: 0} + m_LightingSettings: {fileID: 0} +--- !u!196 &4 +NavMeshSettings: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_BuildSettings: + serializedVersion: 3 + agentTypeID: 0 + agentRadius: 0.5 + agentHeight: 2 + agentSlope: 45 + agentClimb: 0.4 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + minRegionArea: 2 + manualCellSize: 0 + cellSize: 0.16666667 + manualTileSize: 0 + tileSize: 256 + buildHeightMesh: 0 + maxJobWorkers: 0 + preserveTilesOutsideBounds: 0 + debug: + m_Flags: 0 + m_NavMeshData: {fileID: 0} +--- !u!1 &116234196 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 116234201} + - component: {fileID: 116234200} + - component: {fileID: 116234199} + - component: {fileID: 116234198} + - component: {fileID: 116234197} + m_Layer: 5 + m_Name: UI + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &116234197 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 116234196} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d5ec365b02ab496d8fa1d5f7d41a33e9, type: 3} + m_Name: + m_EditorClassIdentifier: + scoreText: {fileID: 1224833350} + scorePopupPrefab: {fileID: 0} + popupParent: {fileID: 0} +--- !u!114 &116234198 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 116234196} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreReversedGraphics: 1 + m_BlockingObjects: 0 + m_BlockingMask: + serializedVersion: 2 + m_Bits: 4294967295 +--- !u!114 &116234199 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 116234196} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UiScaleMode: 0 + m_ReferencePixelsPerUnit: 100 + m_ScaleFactor: 1 + m_ReferenceResolution: {x: 800, y: 600} + m_ScreenMatchMode: 0 + m_MatchWidthOrHeight: 0 + m_PhysicalUnit: 3 + m_FallbackScreenDPI: 96 + m_DefaultSpriteDPI: 96 + m_DynamicPixelsPerUnit: 1 + m_PresetInfoIsWorld: 0 +--- !u!223 &116234200 +Canvas: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 116234196} + m_Enabled: 1 + serializedVersion: 3 + m_RenderMode: 0 + m_Camera: {fileID: 0} + m_PlaneDistance: 100 + m_PixelPerfect: 0 + m_ReceivesEvents: 1 + m_OverrideSorting: 0 + m_OverridePixelPerfect: 0 + m_SortingBucketNormalizedSize: 0 + m_VertexColorAlwaysGammaSpace: 0 + m_AdditionalShaderChannelsFlag: 25 + m_UpdateRectTransformForStandalone: 0 + m_SortingLayerID: 0 + m_SortingOrder: 0 + m_TargetDisplay: 0 +--- !u!224 &116234201 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 116234196} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0, y: 0, z: 0} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1224833349} + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0, y: 0} +--- !u!1 &173052724 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 173052725} + - component: {fileID: 173052727} + - component: {fileID: 173052726} + - component: {fileID: 173052728} + m_Layer: 0 + m_Name: Rope2 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &173052725 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 173052724} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 2106431002} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &173052726 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 173052724} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: e2fcc597881599646a35e7161a5504ff, type: 3} + m_Name: + m_EditorClassIdentifier: + startPoint: {fileID: 730962733} + midPoint: {fileID: 0} + endPoint: {fileID: 2010418242} + linePoints: 10 + stiffness: 350 + damping: 15 + ropeLength: 2 + ropeWidth: 0.1 + midPointWeight: 1 + midPointPosition: 0.5 +--- !u!120 &173052727 +LineRenderer: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 173052724} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 0 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 0 + m_RayTracingMode: 0 + m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_Positions: + - {x: 0, y: 4.1716814, z: 0} + - {x: -0.0011514801, y: 3.9187107, z: 0} + - {x: -0.00230296, y: 3.6922278, z: 0} + - {x: -0.0034544398, y: 3.4922323, z: 0} + - {x: -0.00460592, y: 3.3187256, z: 0} + - {x: -0.0057574, y: 3.1717062, z: 0} + - {x: -0.0069088796, y: 3.0511749, z: 0} + - {x: -0.008060359, y: 2.9571314, z: 0} + - {x: -0.00921184, y: 2.8895762, z: 0} + - {x: -0.010363319, y: 2.8485086, z: 0} + - {x: -0.0115148, y: 2.833929, z: 0} + m_Parameters: + serializedVersion: 3 + widthMultiplier: 1 + widthCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0.1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + colorGradient: + serializedVersion: 2 + key0: {r: 1, g: 1, b: 1, a: 1} + key1: {r: 1, g: 1, b: 1, a: 1} + key2: {r: 0, g: 0, b: 0, a: 0} + key3: {r: 0, g: 0, b: 0, a: 0} + key4: {r: 0, g: 0, b: 0, a: 0} + key5: {r: 0, g: 0, b: 0, a: 0} + key6: {r: 0, g: 0, b: 0, a: 0} + key7: {r: 0, g: 0, b: 0, a: 0} + ctime0: 0 + ctime1: 65535 + ctime2: 0 + ctime3: 0 + ctime4: 0 + ctime5: 0 + ctime6: 0 + ctime7: 0 + atime0: 0 + atime1: 65535 + atime2: 0 + atime3: 0 + atime4: 0 + atime5: 0 + atime6: 0 + atime7: 0 + m_Mode: 0 + m_ColorSpace: -1 + m_NumColorKeys: 2 + m_NumAlphaKeys: 2 + numCornerVertices: 0 + numCapVertices: 0 + alignment: 0 + textureMode: 0 + textureScale: {x: 1, y: 1} + shadowBias: 0.5 + generateLightingData: 0 + m_MaskInteraction: 0 + m_UseWorldSpace: 1 + m_Loop: 0 + m_ApplyActiveColorSpace: 1 +--- !u!114 &173052728 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 173052724} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 30919200017f4879867c3b6289429924, type: 3} + m_Name: + m_EditorClassIdentifier: + breakPosition: 0.5 + breakEffect: {fileID: 0} + breakSound: {fileID: 0} + ropeFollowSpeed: 5 + ropeTrailing: 0.2 + ropeGravityStrength: 9.8 + ropeVerticalHangStrength: 2 + ropeDamping: 0.3 + initialSeparationDistance: 0.1 + initialFallImpulse: 2 +--- !u!1 &224729330 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 224729333} + - component: {fileID: 224729332} + - component: {fileID: 224729334} + m_Layer: 0 + m_Name: CinemachineCamera + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &224729332 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 224729330} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f9dfa5b682dcd46bda6128250e975f58, type: 3} + m_Name: + m_EditorClassIdentifier: + Priority: + Enabled: 0 + m_Value: 0 + OutputChannel: 1 + StandbyUpdate: 2 + m_StreamingVersion: 20241001 + m_LegacyPriority: 0 + Target: + TrackingTarget: {fileID: 747976397} + LookAtTarget: {fileID: 0} + CustomLookAtTarget: 0 + Lens: + FieldOfView: 60 + OrthographicSize: 6.75 + NearClipPlane: 0.3 + FarClipPlane: 1000 + Dutch: 0 + ModeOverride: 0 + PhysicalProperties: + GateFit: 2 + SensorSize: {x: 21.946, y: 16.002} + LensShift: {x: 0, y: 0} + FocusDistance: 10 + Iso: 200 + ShutterSpeed: 0.005 + Aperture: 16 + BladeCount: 5 + Curvature: {x: 2, y: 11} + BarrelClipping: 0.25 + Anamorphism: 0 + BlendHint: 0 +--- !u!4 &224729333 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 224729330} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: -10} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!95 &224729334 +Animator: + serializedVersion: 7 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 224729330} + m_Enabled: 1 + m_Avatar: {fileID: 0} + m_Controller: {fileID: 0} + m_CullingMode: 0 + m_UpdateMode: 0 + m_ApplyRootMotion: 0 + m_LinearVelocityBlending: 0 + m_StabilizeFeet: 0 + m_AnimatePhysics: 0 + m_WarningMessage: + m_HasTransformHierarchy: 1 + m_AllowConstantClipSamplingOptimization: 1 + m_KeepAnimatorStateOnDisable: 0 + m_WriteDefaultValuesOnDisable: 0 +--- !u!1 &323864663 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 323864665} + - component: {fileID: 323864664} + m_Layer: 0 + m_Name: ObstacleSpawner + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &323864664 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 323864663} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 49ec62157fd945fab730193e9ea0bff7, type: 3} + m_Name: + m_EditorClassIdentifier: + obstaclePrefabs: + - {fileID: 4743746373562280435, guid: 315a624eb99600444a51bb1d37c51742, type: 3} + onObstacleSpawned: + m_PersistentCalls: + m_Calls: [] + onObstacleDestroyed: + m_PersistentCalls: + m_Calls: [] +--- !u!4 &323864665 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 323864663} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -0.66745, y: 0.68592, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &424805724 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 424805726} + - component: {fileID: 424805725} + - component: {fileID: 424805728} + m_Layer: 0 + m_Name: MinigameManagers + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &424805725 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 424805724} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4b2b072821054504b03fc4014b063153, type: 3} + m_Name: + m_EditorClassIdentifier: + monsterPrefabs: + - {fileID: 8508541779489709744, guid: cd5c27c38c427524988b8932e7205d81, type: 3} + - {fileID: 8588568014006713718, guid: 7c45910be7187144b8d2af12ff772353, type: 3} + - {fileID: 2665121316138540107, guid: c0d4b6d8a3b9a2447b883a78c568826c, type: 3} + - {fileID: 827631101927032693, guid: 5d23561cb618e86409a2b7ccbf08e37d, type: 3} + playerRopes: + - {fileID: 1435210811} + - {fileID: 1062017697} + - {fileID: 173052728} + surfacingTimeline: {fileID: 2064311130} +--- !u!4 &424805726 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 424805724} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1.22304, y: -2.01526, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &424805728 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 424805724} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: e5a6d17776b84719a2599fdc35c7076d, type: 3} + m_Name: + m_EditorClassIdentifier: AppleHillsScripts::Minigames.DivingForPictures.PictureCamera.CameraViewfinderManager + targetCanvas: {fileID: 116234200} +--- !u!1 &461301695 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 461301697} + - component: {fileID: 461301696} + - component: {fileID: 461301698} + m_Layer: 0 + m_Name: DivingBackground + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!212 &461301696 +SpriteRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 461301695} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 0 + m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: a97c105638bdf8b4a8650670310a4cd3, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 0 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 + m_SortingLayerID: 622133659 + m_SortingLayer: -1 + m_SortingOrder: 0 + m_Sprite: {fileID: 5958968447627082961, guid: ad9b785acb09cb247ae2c8cd895863de, type: 3} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_FlipX: 0 + m_FlipY: 0 + m_DrawMode: 0 + m_Size: {x: 10.803711, y: 19.81} + m_AdaptiveModeThreshold: 0.5 + m_SpriteTileMode: 0 + m_WasSpriteAssigned: 1 + m_MaskInteraction: 0 + m_SpriteSortPoint: 0 +--- !u!4 &461301697 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 461301695} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 1.24, z: 0} + m_LocalScale: {x: 0.81438, y: 0.81438, z: 0.81438} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!95 &461301698 +Animator: + serializedVersion: 7 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 461301695} + m_Enabled: 1 + m_Avatar: {fileID: 0} + m_Controller: {fileID: 0} + m_CullingMode: 0 + m_UpdateMode: 0 + m_ApplyRootMotion: 0 + m_LinearVelocityBlending: 0 + m_StabilizeFeet: 0 + m_AnimatePhysics: 0 + m_WarningMessage: + m_HasTransformHierarchy: 1 + m_AllowConstantClipSamplingOptimization: 1 + m_KeepAnimatorStateOnDisable: 0 + m_WriteDefaultValuesOnDisable: 0 +--- !u!1 &730962732 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 730962733} + - component: {fileID: 730962734} + m_Layer: 0 + m_Name: BottleSprite + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &730962733 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 730962732} + serializedVersion: 2 + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 2.07, z: 0} + m_LocalScale: {x: 0.1, y: 0.1, z: 0.1} + m_ConstrainProportionsScale: 1 + m_Children: [] + m_Father: {fileID: 747976397} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!212 &730962734 +SpriteRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 730962732} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 0 + m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10754, guid: 0000000000000000f000000000000000, type: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 0 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_Sprite: {fileID: -8679947266657860767, guid: a6e77c94466133a488925fb29cb7b323, type: 3} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_FlipX: 0 + m_FlipY: 0 + m_DrawMode: 0 + m_Size: {x: 19.74, y: 12.53} + m_AdaptiveModeThreshold: 0.5 + m_SpriteTileMode: 0 + m_WasSpriteAssigned: 1 + m_MaskInteraction: 0 + m_SpriteSortPoint: 0 +--- !u!1 &747976396 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 747976397} + - component: {fileID: 747976398} + - component: {fileID: 747976399} + - component: {fileID: 747976400} + - component: {fileID: 747976401} + - component: {fileID: 747976402} + - component: {fileID: 747976403} + - component: {fileID: 747976404} + - component: {fileID: 747976405} + - component: {fileID: 747976406} + m_Layer: 0 + m_Name: BottleMarine + m_TagString: Player + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &747976397 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 747976396} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 2.9799, z: 0} + m_LocalScale: {x: 0.57574, y: 0.57574, z: 0.57574} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 730962733} + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &747976398 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 747976396} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d39dbaae819c4a128a11ca60fbbc98c9, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!114 &747976399 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 747976396} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9072050a53fc4b539f4f4716bab53c07, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!114 &747976400 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 747976396} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 8222f0e3aeeb4fc4975aaead6cf7afbe, type: 3} + m_Name: + m_EditorClassIdentifier: + playerCharacter: {fileID: 747976396} + playerController: {fileID: 747976398} +--- !u!114 &747976401 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 747976396} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c9c18dbd013d42ae8c221e6205e4d49c, type: 3} + m_Name: + m_EditorClassIdentifier: + playerCharacter: {fileID: 747976396} + playerController: {fileID: 747976398} +--- !u!60 &747976402 +PolygonCollider2D: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 747976396} + m_Enabled: 1 + serializedVersion: 3 + m_Density: 1 + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_ForceSendLayers: + serializedVersion: 2 + m_Bits: 4294967295 + m_ForceReceiveLayers: + serializedVersion: 2 + m_Bits: 4294967295 + m_ContactCaptureLayers: + serializedVersion: 2 + m_Bits: 4294967295 + m_CallbackLayers: + serializedVersion: 2 + m_Bits: 4294967295 + m_IsTrigger: 1 + m_UsedByEffector: 0 + m_CompositeOperation: 0 + m_CompositeOrder: 0 + m_Offset: {x: 0, y: 0} + m_SpriteTilingProperty: + border: {x: 0, y: 0, z: 0, w: 0} + pivot: {x: 0, y: 0} + oldSize: {x: 0, y: 0} + newSize: {x: 0, y: 0} + adaptiveTilingThreshold: 0 + drawMode: 0 + adaptiveTiling: 0 + m_AutoTiling: 0 + m_Points: + m_Paths: + - - {x: -0.7990411, y: 2.6669068} + - {x: -0.9294033, y: 2.502293} + - {x: -1.005722, y: 2.1038642} + - {x: -0.9038467, y: 1.652195} + - {x: -0.7700032, y: 1.5415951} + - {x: 0.28712562, y: 1.5507066} + - {x: 0.48471105, y: 1.6954134} + - {x: 0.5636723, y: 1.8504347} + - {x: 0.63941646, y: 1.8455681} + - {x: 0.69998366, y: 1.761524} + - {x: 0.95461226, y: 1.7980554} + - {x: 1.0003967, y: 2.1063333} + - {x: 0.94308287, y: 2.433347} + - {x: 0.8147154, y: 2.464337} + - {x: 0.6922814, y: 2.465095} + - {x: 0.6549096, y: 2.3498883} + - {x: 0.5677627, y: 2.3522122} + - {x: 0.38462818, y: 2.6102822} + - {x: 0.20396256, y: 2.6596293} + m_UseDelaunayMesh: 0 +--- !u!50 &747976403 +Rigidbody2D: + serializedVersion: 5 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 747976396} + m_BodyType: 1 + m_Simulated: 1 + m_UseFullKinematicContacts: 0 + m_UseAutoMass: 0 + m_Mass: 1 + m_LinearDamping: 0 + m_AngularDamping: 0.05 + m_GravityScale: 1 + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_Interpolate: 0 + m_SleepingMode: 1 + m_CollisionDetection: 0 + m_Constraints: 0 +--- !u!114 &747976404 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 747976396} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d8ea29cc80524de8affe17b930cd75c1, type: 3} + m_Name: + m_EditorClassIdentifier: + targetSpriteRenderer: {fileID: 730962734} +--- !u!95 &747976405 +Animator: + serializedVersion: 7 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 747976396} + m_Enabled: 1 + m_Avatar: {fileID: 0} + m_Controller: {fileID: 0} + m_CullingMode: 0 + m_UpdateMode: 0 + m_ApplyRootMotion: 0 + m_LinearVelocityBlending: 0 + m_StabilizeFeet: 0 + m_AnimatePhysics: 0 + m_WarningMessage: + m_HasTransformHierarchy: 1 + m_AllowConstantClipSamplingOptimization: 1 + m_KeepAnimatorStateOnDisable: 0 + m_WriteDefaultValuesOnDisable: 0 +--- !u!114 &747976406 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 747976396} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: cf50e6f7c05d5a14296152b8c3fbb923, type: 3} + m_Name: + m_EditorClassIdentifier: '::' + wobbleReference: {fileID: 747976399} +--- !u!1 &824396214 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 824396217} + - component: {fileID: 824396216} + - component: {fileID: 824396215} + m_Layer: 0 + m_Name: EventSystem + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &824396215 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 824396214} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 01614664b831546d2ae94a42149d80ac, type: 3} + m_Name: + m_EditorClassIdentifier: + m_SendPointerHoverToParent: 1 + m_MoveRepeatDelay: 0.5 + m_MoveRepeatRate: 0.1 + m_XRTrackingOrigin: {fileID: 0} + m_ActionsAsset: {fileID: -944628639613478452, guid: ca9f5fa95ffab41fb9a615ab714db018, type: 3} + m_PointAction: {fileID: -1654692200621890270, guid: ca9f5fa95ffab41fb9a615ab714db018, type: 3} + m_MoveAction: {fileID: -8784545083839296357, guid: ca9f5fa95ffab41fb9a615ab714db018, type: 3} + m_SubmitAction: {fileID: 392368643174621059, guid: ca9f5fa95ffab41fb9a615ab714db018, type: 3} + m_CancelAction: {fileID: 7727032971491509709, guid: ca9f5fa95ffab41fb9a615ab714db018, type: 3} + m_LeftClickAction: {fileID: 3001919216989983466, guid: ca9f5fa95ffab41fb9a615ab714db018, type: 3} + m_MiddleClickAction: {fileID: -2185481485913320682, guid: ca9f5fa95ffab41fb9a615ab714db018, type: 3} + m_RightClickAction: {fileID: -4090225696740746782, guid: ca9f5fa95ffab41fb9a615ab714db018, type: 3} + m_ScrollWheelAction: {fileID: 6240969308177333660, guid: ca9f5fa95ffab41fb9a615ab714db018, type: 3} + m_TrackedDevicePositionAction: {fileID: 6564999863303420839, guid: ca9f5fa95ffab41fb9a615ab714db018, type: 3} + m_TrackedDeviceOrientationAction: {fileID: 7970375526676320489, guid: ca9f5fa95ffab41fb9a615ab714db018, type: 3} + m_DeselectOnBackgroundClick: 1 + m_PointerBehavior: 0 + m_CursorLockBehavior: 0 + m_ScrollDeltaPerTick: 6 +--- !u!114 &824396216 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 824396214} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 76c392e42b5098c458856cdf6ecaaaa1, type: 3} + m_Name: + m_EditorClassIdentifier: + m_FirstSelected: {fileID: 0} + m_sendNavigationEvents: 1 + m_DragThreshold: 10 +--- !u!4 &824396217 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 824396214} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1003335103 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1003335105} + - component: {fileID: 1003335104} + m_Layer: 0 + m_Name: BubbleSpawner + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1003335104 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1003335103} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1f047af2457745158162344fe19c3477, type: 3} + m_Name: + m_EditorClassIdentifier: + bubblePrefab: {fileID: 8114503068028241010, guid: e7a40dc74a6c9564ebdda2c7ebd6b975, type: 3} + bubbleSprites: + - {fileID: -1935083779452269832, guid: 33e6f5fe26a891e4da5d6bfd9125a8fa, type: 3} + - {fileID: -3448220263590106980, guid: 3c68df10bb6cd72428ec4160e15deeaf, type: 3} + - {fileID: 8773148034285304506, guid: cba81aa25acbe564cb363782f87c988a, type: 3} + - {fileID: -5093844878195686178, guid: eb62213ffae1fa242bcf16e696d9324f, type: 3} + - {fileID: 8944853044452083345, guid: 4ad95f797558b28478685ca60bd90ff4, type: 3} +--- !u!4 &1003335105 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1003335103} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -0, y: -6.78, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1062017693 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1062017694} + - component: {fileID: 1062017696} + - component: {fileID: 1062017695} + - component: {fileID: 1062017697} + m_Layer: 0 + m_Name: Rope3 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1062017694 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1062017693} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 2106431002} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1062017695 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1062017693} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: e2fcc597881599646a35e7161a5504ff, type: 3} + m_Name: + m_EditorClassIdentifier: + startPoint: {fileID: 730962733} + midPoint: {fileID: 0} + endPoint: {fileID: 1266665688} + linePoints: 10 + stiffness: 350 + damping: 15 + ropeLength: 2 + ropeWidth: 0.1 + midPointWeight: 1 + midPointPosition: 0.5 +--- !u!120 &1062017696 +LineRenderer: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1062017693} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 0 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 0 + m_RayTracingMode: 0 + m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_Positions: + - {x: 0, y: 4.1716814, z: 0} + - {x: 0.036271624, y: 3.927396, z: 0} + - {x: 0.07254324, y: 3.7076683, z: 0} + - {x: 0.10881486, y: 3.5124984, z: 0} + - {x: 0.14508648, y: 3.3418865, z: 0} + - {x: 0.1813581, y: 3.195832, z: 0} + - {x: 0.21762972, y: 3.0743358, z: 0} + - {x: 0.25390133, y: 2.9773972, z: 0} + - {x: 0.29017296, y: 2.905017, z: 0} + - {x: 0.32644457, y: 2.857194, z: 0} + - {x: 0.3627162, y: 2.833929, z: 0} + m_Parameters: + serializedVersion: 3 + widthMultiplier: 1 + widthCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0.1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + colorGradient: + serializedVersion: 2 + key0: {r: 1, g: 1, b: 1, a: 1} + key1: {r: 1, g: 1, b: 1, a: 1} + key2: {r: 0, g: 0, b: 0, a: 0} + key3: {r: 0, g: 0, b: 0, a: 0} + key4: {r: 0, g: 0, b: 0, a: 0} + key5: {r: 0, g: 0, b: 0, a: 0} + key6: {r: 0, g: 0, b: 0, a: 0} + key7: {r: 0, g: 0, b: 0, a: 0} + ctime0: 0 + ctime1: 65535 + ctime2: 0 + ctime3: 0 + ctime4: 0 + ctime5: 0 + ctime6: 0 + ctime7: 0 + atime0: 0 + atime1: 65535 + atime2: 0 + atime3: 0 + atime4: 0 + atime5: 0 + atime6: 0 + atime7: 0 + m_Mode: 0 + m_ColorSpace: -1 + m_NumColorKeys: 2 + m_NumAlphaKeys: 2 + numCornerVertices: 0 + numCapVertices: 0 + alignment: 0 + textureMode: 0 + textureScale: {x: 1, y: 1} + shadowBias: 0.5 + generateLightingData: 0 + m_MaskInteraction: 0 + m_UseWorldSpace: 1 + m_Loop: 0 + m_ApplyActiveColorSpace: 1 +--- !u!114 &1062017697 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1062017693} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 30919200017f4879867c3b6289429924, type: 3} + m_Name: + m_EditorClassIdentifier: + breakPosition: 0.5 + breakEffect: {fileID: 0} + breakSound: {fileID: 0} + ropeFollowSpeed: 5 + ropeTrailing: 0.2 + ropeGravityStrength: 9.8 + ropeVerticalHangStrength: 2 + ropeDamping: 0.3 + initialSeparationDistance: 0.1 + initialFallImpulse: 2 +--- !u!1 &1063641111 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1063641114} + - component: {fileID: 1063641113} + - component: {fileID: 1063641112} + - component: {fileID: 1063641115} + - component: {fileID: 1063641116} + m_Layer: 0 + m_Name: Main Camera + m_TagString: MainCamera + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!81 &1063641112 +AudioListener: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1063641111} + m_Enabled: 1 +--- !u!20 &1063641113 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1063641111} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 2 + m_BackGroundColor: {r: 0.5722232, g: 0.6321867, b: 0.7264151, a: 0} + m_projectionMatrixMode: 1 + m_GateFitMode: 2 + m_FOVAxisMode: 0 + m_Iso: 200 + m_ShutterSpeed: 0.005 + m_Aperture: 16 + m_FocusDistance: 10 + m_FocalLength: 50 + m_BladeCount: 5 + m_Curvature: {x: 2, y: 11} + m_BarrelClipping: 0.25 + m_Anamorphism: 0 + m_SensorSize: {x: 36, y: 24} + m_LensShift: {x: 0, y: 0} + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.3 + far clip plane: 1000 + field of view: 60 + orthographic: 1 + orthographic size: 6.75 + m_Depth: -1 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_TargetEye: 3 + m_HDR: 1 + m_AllowMSAA: 1 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!4 &1063641114 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1063641111} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: -10} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1063641115 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1063641111} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 72ece51f2901e7445ab60da3685d6b5f, type: 3} + m_Name: + m_EditorClassIdentifier: + ShowDebugText: 0 + ShowCameraFrustum: 1 + IgnoreTimeScale: 0 + WorldUpOverride: {fileID: 0} + ChannelMask: -1 + UpdateMethod: 2 + BlendUpdateMethod: 1 + LensModeOverride: + Enabled: 0 + DefaultMode: 2 + DefaultBlend: + Style: 1 + Time: 2 + CustomCurve: + serializedVersion: 2 + m_Curve: [] + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + CustomBlends: {fileID: 0} +--- !u!114 &1063641116 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1063641111} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: a79441f348de89743a2939f4d699eac1, type: 3} + m_Name: + m_EditorClassIdentifier: + m_RenderShadows: 1 + m_RequiresDepthTextureOption: 2 + m_RequiresOpaqueTextureOption: 2 + m_CameraType: 0 + m_Cameras: [] + m_RendererIndex: -1 + m_VolumeLayerMask: + serializedVersion: 2 + m_Bits: 1 + m_VolumeTrigger: {fileID: 0} + m_VolumeFrameworkUpdateModeOption: 2 + m_RenderPostProcessing: 0 + m_Antialiasing: 0 + m_AntialiasingQuality: 2 + m_StopNaN: 0 + m_Dithering: 0 + m_ClearDepth: 1 + m_AllowXRRendering: 1 + m_AllowHDROutput: 1 + m_UseScreenCoordOverride: 0 + m_ScreenSizeOverride: {x: 0, y: 0, z: 0, w: 0} + m_ScreenCoordScaleBias: {x: 0, y: 0, z: 0, w: 0} + m_RequiresDepthTexture: 0 + m_RequiresColorTexture: 0 + m_TaaSettings: + m_Quality: 3 + m_FrameInfluence: 0.1 + m_JitterScale: 1 + m_MipBias: 0 + m_VarianceClampScale: 0.9 + m_ContrastAdaptiveSharpening: 0 + m_Version: 2 +--- !u!1 &1224833348 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1224833349} + - component: {fileID: 1224833351} + - component: {fileID: 1224833350} + m_Layer: 5 + m_Name: ScoreDisplay + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1224833349 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1224833348} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 116234201} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 200, y: -43} + m_SizeDelta: {x: 245.48071, y: 78.4255} + m_Pivot: {x: 0, y: 1} +--- !u!114 &1224833350 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1224833348} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: New Text + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4294967295 + m_fontColor: {r: 1, g: 1, b: 1, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 70 + m_fontSizeBase: 70 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 1 + m_HorizontalAlignment: 1 + m_VerticalAlignment: 256 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_TextWrappingMode: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 0 + m_ActiveFontFeatures: 6e72656b + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_EmojiFallbackSupport: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: -23.181305, y: 0, z: -63.748444, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &1224833351 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1224833348} + m_CullTransparentMesh: 1 +--- !u!1 &1266665687 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1266665688} + m_Layer: 0 + m_Name: RopeAttachPoint3 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1266665688 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1266665687} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0.63, y: 0.58, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 2106431002} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1435210807 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1435210808} + - component: {fileID: 1435210810} + - component: {fileID: 1435210809} + - component: {fileID: 1435210811} + m_Layer: 0 + m_Name: Rope1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1435210808 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1435210807} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 2106431002} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1435210809 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1435210807} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: e2fcc597881599646a35e7161a5504ff, type: 3} + m_Name: + m_EditorClassIdentifier: + startPoint: {fileID: 730962733} + midPoint: {fileID: 0} + endPoint: {fileID: 1916796530} + linePoints: 10 + stiffness: 350 + damping: 15 + ropeLength: 2 + ropeWidth: 0.1 + midPointWeight: 1 + midPointPosition: 0.5 +--- !u!120 &1435210810 +LineRenderer: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1435210807} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 0 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 0 + m_RayTracingMode: 0 + m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_Positions: + - {x: 0, y: 4.1716814, z: 0} + - {x: -0.03339292, y: 3.9260902, z: 0} + - {x: -0.066785835, y: 3.705347, z: 0} + - {x: -0.10017875, y: 3.5094519, z: 0} + - {x: -0.13357168, y: 3.3384047, z: 0} + - {x: -0.16696459, y: 3.1922054, z: 0} + - {x: -0.20035751, y: 3.0708542, z: 0} + - {x: -0.2337504, y: 2.9743507, z: 0} + - {x: -0.26714337, y: 2.9026957, z: 0} + - {x: -0.30053627, y: 2.8558884, z: 0} + - {x: -0.33392918, y: 2.833929, z: 0} + m_Parameters: + serializedVersion: 3 + widthMultiplier: 1 + widthCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0.1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + colorGradient: + serializedVersion: 2 + key0: {r: 0.4245283, g: 0.089180216, b: 0, a: 1} + key1: {r: 1, g: 1, b: 1, a: 1} + key2: {r: 0, g: 0, b: 0, a: 0} + key3: {r: 0, g: 0, b: 0, a: 0} + key4: {r: 0, g: 0, b: 0, a: 0} + key5: {r: 0, g: 0, b: 0, a: 0} + key6: {r: 0, g: 0, b: 0, a: 0} + key7: {r: 0, g: 0, b: 0, a: 0} + ctime0: 0 + ctime1: 65535 + ctime2: 0 + ctime3: 0 + ctime4: 0 + ctime5: 0 + ctime6: 0 + ctime7: 0 + atime0: 0 + atime1: 65535 + atime2: 0 + atime3: 0 + atime4: 0 + atime5: 0 + atime6: 0 + atime7: 0 + m_Mode: 0 + m_ColorSpace: 0 + m_NumColorKeys: 2 + m_NumAlphaKeys: 2 + numCornerVertices: 0 + numCapVertices: 0 + alignment: 0 + textureMode: 0 + textureScale: {x: 1, y: 1} + shadowBias: 0.5 + generateLightingData: 0 + m_MaskInteraction: 0 + m_UseWorldSpace: 1 + m_Loop: 0 + m_ApplyActiveColorSpace: 1 +--- !u!114 &1435210811 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1435210807} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 30919200017f4879867c3b6289429924, type: 3} + m_Name: + m_EditorClassIdentifier: + breakPosition: 0.5 + breakEffect: {fileID: 0} + breakSound: {fileID: 0} + ropeFollowSpeed: 5 + ropeTrailing: 0.2 + ropeGravityStrength: 9.8 + ropeVerticalHangStrength: 2 + ropeDamping: 0.3 + initialSeparationDistance: 0.1 + initialFallImpulse: 2 +--- !u!1 &1679185997 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1679185998} + - component: {fileID: 1679185999} + m_Layer: 0 + m_Name: TileSpawner + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1679185998 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1679185997} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1679185999 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1679185997} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fbe5f5d548d44d93b3f90be6542205d8, type: 3} + m_Name: + m_EditorClassIdentifier: + tilePrefabs: + - {fileID: 2956826569642009690, guid: 661c5018e2409034d92de025b7ac57b7, type: 3} + - {fileID: 2956826569642009690, guid: c24515e40c664f645bdef28a10d1b882, type: 3} + - {fileID: 2956826569642009690, guid: 4827a98c801e6ea42a9ac44eb9c176ff, type: 3} + - {fileID: 2956826569642009690, guid: 43ed47cbe958b9f46b462e2fca2382c5, type: 3} + - {fileID: 2956826569642009690, guid: 4f772f2aebd38b44ca31063d196c77c1, type: 3} + - {fileID: 2956826569642009690, guid: 7f7f10ca24a5afe46be797daea64111a, type: 3} + onTileSpawned: + m_PersistentCalls: + m_Calls: [] + onTileDestroyed: + m_PersistentCalls: + m_Calls: [] + onLastTileLeft: + m_PersistentCalls: + m_Calls: [] +--- !u!1 &1834056336 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1834056337} + - component: {fileID: 1834056338} + m_Layer: 0 + m_Name: RockSprite + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1834056337 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1834056336} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} + m_ConstrainProportionsScale: 1 + m_Children: [] + m_Father: {fileID: 2106431002} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!212 &1834056338 +SpriteRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1834056336} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 0 + m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10754, guid: 0000000000000000f000000000000000, type: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 0 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_Sprite: {fileID: 3452003437791708593, guid: 4c13556eeb918624c9dd3d7e4086242e, type: 3} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_FlipX: 0 + m_FlipY: 0 + m_DrawMode: 0 + m_Size: {x: 2.56, y: 2.56} + m_AdaptiveModeThreshold: 0.5 + m_SpriteTileMode: 0 + m_WasSpriteAssigned: 1 + m_MaskInteraction: 0 + m_SpriteSortPoint: 0 +--- !u!1 &1916796529 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1916796530} + m_Layer: 0 + m_Name: RopeAttachPoint1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1916796530 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1916796529} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -0.58, y: 0.58, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 2106431002} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &2006256175 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2006256176} + m_Layer: 0 + m_Name: ---- Managers and Controls ---- + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2006256176 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2006256175} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 15.41618, y: 5.41112, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &2010418241 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2010418242} + m_Layer: 0 + m_Name: RopeAttachPoint2 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2010418242 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2010418241} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -0.02, y: 0.58, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 2106431002} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &2064311128 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2064311129} + - component: {fileID: 2064311130} + m_Layer: 0 + m_Name: SurfacingTimeline + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2064311129 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2064311128} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!320 &2064311130 +PlayableDirector: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2064311128} + m_Enabled: 1 + serializedVersion: 3 + m_PlayableAsset: {fileID: 11400000, guid: 5ecd3cfdb172df5439e4522c15c48f75, type: 2} + m_InitialState: 0 + m_WrapMode: 0 + m_DirectorUpdateMode: 1 + m_InitialTime: 0 + m_SceneBindings: + - key: {fileID: 7536617106820686252, guid: 5ecd3cfdb172df5439e4522c15c48f75, type: 2} + value: {fileID: 747976405} + - key: {fileID: 1284158391674687369, guid: 5ecd3cfdb172df5439e4522c15c48f75, type: 2} + value: {fileID: 461301698} + - key: {fileID: -4039891455399305819, guid: 5ecd3cfdb172df5439e4522c15c48f75, type: 2} + value: {fileID: 224729334} + m_ExposedReferences: + m_References: [] +--- !u!1 &2106431001 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2106431002} + - component: {fileID: 2106431003} + - component: {fileID: 2106431004} + - component: {fileID: 2106431005} + m_Layer: 0 + m_Name: Rock + m_TagString: Rock + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2106431002 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2106431001} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 2.5, z: 0} + m_LocalScale: {x: 0.57574, y: 0.57574, z: 0.57574} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1834056337} + - {fileID: 1435210808} + - {fileID: 173052725} + - {fileID: 1062017694} + - {fileID: 1916796530} + - {fileID: 2010418242} + - {fileID: 1266665688} + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &2106431003 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2106431001} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f1a7937fe5974e9486dc7545de8cee6b, type: 3} + m_Name: + m_EditorClassIdentifier: + bottleTransform: {fileID: 747976397} + bottleWobble: {fileID: 747976399} + followStiffness: 4 + useWobbleOffset: 1 + baseY: 2.5 +--- !u!114 &2106431004 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2106431001} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9072050a53fc4b539f4f4716bab53c07, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!114 &2106431005 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2106431001} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: a392c919de2df0340b700309e221b7b1, type: 3} + m_Name: + m_EditorClassIdentifier: '::' + rockReference: {fileID: 2106431003} + rockWobbleReference: {fileID: 2106431004} +--- !u!1660057539 &9223372036854775807 +SceneRoots: + m_ObjectHideFlags: 0 + m_Roots: + - {fileID: 1063641114} + - {fileID: 224729333} + - {fileID: 747976397} + - {fileID: 2106431002} + - {fileID: 116234201} + - {fileID: 824396217} + - {fileID: 461301697} + - {fileID: 2064311129} + - {fileID: 2006256176} + - {fileID: 1003335105} + - {fileID: 1679185998} + - {fileID: 323864665} + - {fileID: 424805726} diff --git a/Assets/Scenes/MiniGames/DivingForPictures_MICHAL.unity.meta b/Assets/Scenes/MiniGames/DivingForPictures_MICHAL.unity.meta new file mode 100644 index 00000000..2ecc1539 --- /dev/null +++ b/Assets/Scenes/MiniGames/DivingForPictures_MICHAL.unity.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 0767853e6cd28b74f9e0aca241ce890e +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Core/GameManager.cs b/Assets/Scripts/Core/GameManager.cs index ceaac3c7..0dde7ffc 100644 --- a/Assets/Scripts/Core/GameManager.cs +++ b/Assets/Scripts/Core/GameManager.cs @@ -182,7 +182,7 @@ public class GameManager : MonoBehaviour // Resume all registered components foreach (var component in _pausableComponents) { - component.Resume(); + component.DoResume(); } // Broadcast resume event diff --git a/Assets/Scripts/Core/Interfaces/IPausable.cs b/Assets/Scripts/Core/Interfaces/IPausable.cs index 81739c39..9347e157 100644 --- a/Assets/Scripts/Core/Interfaces/IPausable.cs +++ b/Assets/Scripts/Core/Interfaces/IPausable.cs @@ -15,7 +15,7 @@ namespace AppleHills.Core.Interfaces ///