using System.Linq; using Godot; using Godot.Collections; namespace Cirno.Scripts.Interactables; public partial class Switch3D : Interactable3D { [Export] public Node Target { get; set; } [Export] public Array Targets { get; private set; } = []; [Export] public ActivationType ActivationType { get; set; } = ActivationType.Toggle; [Signal] public delegate void OnActivatedEventHandler(ActivationType activationType); private AudioStreamPlayer _activationSound; private readonly string _activationSoundName = "ActivationSound"; public override void _Ready() { _activationSound = GetNodeOrNull(_activationSoundName); } public override bool Activate(ActivationType activationType = ActivationType.Toggle) { var activationTypeToUse = activationType is ActivationType.Use ? ActivationType : activationType; if (!MeetsRequirements()) return false; _activationSound?.Play(); EmitSignal(SignalName.OnActivated, (int)activationTypeToUse); // Compatibility for old single system bool success = ActivateTarget(Target, activationTypeToUse); return Targets.Aggregate(success, (current, target) => ActivateTarget(target, activationTypeToUse) | success); } private bool ActivateTarget(Node target, ActivationType activationType = ActivationType.Toggle) { if (target is not IActivable activable) return false; activable?.Activate(activationType); return true; } }