Implement MVP for the statue decoration minigame (#65)

MVP implemented with:
- placing, removing etc. decorations
- saving the state, displaying it on the map, restoring when game restarts
- saving screenshots to folder on device

Co-authored-by: Michal Pikulski <michal@foolhardyhorizons.com>
Co-authored-by: Michal Pikulski <michal.a.pikulski@gmail.com>
Reviewed-on: #65
This commit is contained in:
2025-11-27 13:21:22 +00:00
parent 5ad84ca3e8
commit 83aa3d5e6d
71 changed files with 6421 additions and 976 deletions

View File

@@ -188,10 +188,21 @@ namespace AppleHills.Core.Settings
float HoverAnimationDuration { get; }
float PlacementAnimationDuration { get; }
// Addressables
string DecorationDataLabel { get; }
// Photo Settings
string PhotoSaveKey { get; }
int PhotoQuality { get; }
bool CaptureFullScreen { get; }
string CutoutPhotoFilename { get; } // Hardcoded filename for transparent cutout version
// Photo Gallery (DEPRECATED - Feature temporarily disabled)
int GalleryItemsPerPage { get; }
int GalleryThumbnailSize { get; }
int GalleryMaxCachedThumbnails { get; }
float GalleryEnlargedScale { get; }
float GalleryAnimationDuration { get; }
// Rewards
int CardsRewardCount { get; }

View File

@@ -49,6 +49,10 @@ namespace Core.Settings
[Tooltip("Duration for placement animation")]
[SerializeField] private float placementAnimationDuration = 0.15f;
[Header("Addressables")]
[Tooltip("Addressables label for loading DecorationData assets")]
[SerializeField] private string decorationDataLabel = "StatueDecorations";
[Header("Photo Settings")]
[Tooltip("PlayerPrefs key for saving the statue photo")]
[SerializeField] private string photoSaveKey = "MrCementStatuePhoto";
@@ -59,6 +63,16 @@ namespace Core.Settings
[Tooltip("Whether to capture full screen or just statue area")]
[SerializeField] private bool captureFullScreen;
[Tooltip("Filename for transparent cutout version (overwrites each time)")]
[SerializeField] private string cutoutPhotoFilename = "StatueCutout_Latest";
[Header("Photo Gallery - DEPRECATED (Feature Disabled)")]
[HideInInspector] [SerializeField] private int galleryItemsPerPage = 20;
[HideInInspector] [SerializeField] private int galleryThumbnailSize = 256;
[HideInInspector] [SerializeField] private int galleryMaxCachedThumbnails = 50;
[HideInInspector] [SerializeField] private float galleryEnlargedScale = 2.5f;
[HideInInspector] [SerializeField] private float galleryAnimationDuration = 0.3f;
[Header("Rewards")]
[Tooltip("Number of Blokkemon cards awarded on completion")]
[SerializeField] private int cardsRewardCount = 3;
@@ -97,10 +111,21 @@ namespace Core.Settings
public float HoverAnimationDuration => hoverAnimationDuration;
public float PlacementAnimationDuration => placementAnimationDuration;
// IStatueDressupSettings implementation - Addressables
public string DecorationDataLabel => decorationDataLabel;
// IStatueDressupSettings implementation - Photo Settings
public string PhotoSaveKey => photoSaveKey;
public int PhotoQuality => photoQuality;
public bool CaptureFullScreen => captureFullScreen;
public string CutoutPhotoFilename => cutoutPhotoFilename;
// IStatueDressupSettings implementation - Photo Gallery (DEPRECATED)
public int GalleryItemsPerPage => galleryItemsPerPage;
public int GalleryThumbnailSize => galleryThumbnailSize;
public int GalleryMaxCachedThumbnails => galleryMaxCachedThumbnails;
public float GalleryEnlargedScale => galleryEnlargedScale;
public float GalleryAnimationDuration => galleryAnimationDuration;
// IStatueDressupSettings implementation - Rewards
public int CardsRewardCount => cardsRewardCount;