extends Node signal on_collectible_unlocked(collectible_id: StringName) signal on_photo_saved(filePath: String) signal on_photo_preview_ready(image: Image) @export var collectibles_library: CollectibleLibrary var unlocked_collectibles_ids: Array[StringName] = [] var saved_photos: Array[String] = [] func _ready() -> void: load_save_data() func unlock_collectible(collectible_id: StringName) -> void: if not collectible_id in unlocked_collectibles_ids: var new_collectible = get_collectible_by_id(collectible_id) if new_collectible: unlocked_collectibles_ids.append(collectible_id) sync_save_data() on_collectible_unlocked.emit(collectible_id) func get_collectible_by_id(id: StringName) -> CollectibleResource: for collectible in collectibles_library.collectibles: if collectible.id == id: return collectible return null func get_all_collectibles() -> Array[CollectibleResource]: return collectibles_library.collectibles func get_unlocked_collectible_ids() -> Array[StringName]: return unlocked_collectibles_ids func save_photo_to_disk_async(image: Image) -> void: if not image: return if not DirAccess.dir_exists_absolute("user://photos"): DirAccess.make_dir_absolute("user://photos") var timestamp = str(Time.get_unix_time_from_system()) var file_path = "user://photos/photo_" + timestamp + ".png" WorkerThreadPool.add_task(func(): image.save_png(file_path) call_deferred("_on_photo_saved_callback", file_path) ) func _on_photo_saved_callback(file_path: String) -> void: saved_photos.append(file_path) sync_save_data() on_photo_saved.emit(file_path) func sync_save_data() -> void: GameState.save_data.unlocked_collectibles_ids = unlocked_collectibles_ids.duplicate() GameState.save_data.saved_photos = saved_photos.duplicate() func load_save_data() -> void: unlocked_collectibles_ids = GameState.save_data.unlocked_collectibles_ids.duplicate() saved_photos = GameState.save_data.saved_photos.duplicate() if unlocked_collectibles_ids.is_empty() and saved_photos.is_empty(): unlocked_collectibles_ids.append(&"cane") sync_save_data()