class_name PowerBox extends Node3D signal power_restored signal power_revoked @export var can_interact: bool = true: set = set_can_interact @export var start_activated: bool = false @export var minigame: Node3D @export var requires_fuse: bool = true @export var interaction: PickupInteraction var world: World var is_restored: bool = false var is_active: bool = false var has_completed_minigame: bool = false @onready var world_proxy: WorldProxy = $WorldProxy @onready var _instance_persister: InstancePersister func _ready() -> void: world = await world_proxy.wait_for_world() _instance_persister = InstancePersister.new(self, world) is_restored = _instance_persister.get_property(&"is_restored", is_restored) is_active = _instance_persister.get_property(&"is_active", start_activated) has_completed_minigame = _instance_persister.get_property(&"has_completed_minigame", has_completed_minigame) can_interact = _instance_persister.get_property(&"can_interact", can_interact) interaction.picked_up.connect(_on_interaction_interacted) set_can_interact(can_interact) if is_active: turn_on() elif requires_fuse and not is_restored: set_can_interact(false) func turn_on() -> void: is_active = true _instance_persister.set_property_auto(&"is_active") power_restored.emit() func turn_off() -> void: is_active = false _instance_persister.set_property_auto(&"is_active") power_revoked.emit() func set_can_interact(value: bool) -> void: can_interact = value _instance_persister.set_property_auto(&"can_interact") if not is_node_ready(): await ready interaction.enabled = can_interact func on_fuse_picked_up() -> void: has_completed_minigame = true is_restored = true _instance_persister.set_property_auto(&"is_restored") _instance_persister.set_property_auto(&"has_completed_minigame") set_can_interact(true) func _on_interaction_interacted() -> void: if not is_restored: return if requires_fuse and not has_completed_minigame: interaction.stop_interaction() return if not has_completed_minigame: # TODO #start_minigame() pass if not is_active: turn_on() else: turn_off() # TODO func _on_minigame_completed() -> void: is_restored = true _instance_persister.set_property_auto(&"is_restored") turn_on()