SupaLidlGame/Entities/DynamicDoor.cs

82 lines
2.0 KiB
C#

using Godot;
using SupaLidlGame.Extensions;
namespace SupaLidlGame.Entities;
public partial class DynamicDoor : StaticBody2D
{
[Export]
public string MapStateKey { get; set; }
[Export]
public Godot.Collections.Array<NodePath> VisibleOnToggle { get; set; } = new();
[Export]
public bool DefaultState { get; set; }
private AnimationPlayer _animPlayer;
public override void _Ready()
{
_animPlayer = GetNode<AnimationPlayer>("AnimationPlayer");
var globalState = this.GetGlobalState();
globalState.MapState.MapStateBoolChanged += OnMapStateChanged;
SetAnimations(false);
RefreshMapState((bool)globalState.MapState[MapStateKey]);
}
public virtual void OnMapStateChanged(string key, bool value)
{
GD.Print("Map state changed");
if (key == MapStateKey)
{
SetAnimations(true);
RefreshMapState(value);
}
}
private void RefreshMapState(bool value)
{
if (value)
{
Open();
}
else
{
Close();
}
}
public virtual void Open()
{
_animPlayer?.TryPlay("open");
//this.GetWorld().CurrentPlayer.Camera.Shake(1, 0.5f);
}
public virtual void Close()
{
_animPlayer?.TryPlay("close");
//this.GetWorld().CurrentPlayer.Camera.Shake(2, 0.25f);
}
public void SetAnimations(bool isEnabled)
{
foreach (var animKey in _animPlayer.GetAnimationList())
{
var anim = _animPlayer.GetAnimation(animKey);
for (int i = 0; i < anim.GetTrackCount(); i++)
{
foreach (var nodePath in VisibleOnToggle)
{
if (anim.TrackGetPath(i) == nodePath)
{
GD.Print($"Disabled anim for {nodePath}");
anim.TrackSetEnabled(i, isEnabled);
}
}
}
}
}
}