94 lines
2.2 KiB
GDScript
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()
|