MagicNStuff/game/src/gameplay/systems/power_box/power_box.gd

94 lines
2.2 KiB
GDScript

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()