138 lines
2.4 KiB
C#
138 lines
2.4 KiB
C#
using Godot;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
|
|
public partial class Spikes : Area2D
|
|
{
|
|
public enum State
|
|
{
|
|
Waiting,
|
|
Opening,
|
|
Closing
|
|
}
|
|
|
|
[Export] public bool Enabled = false;
|
|
[Export] public float SpikesTimeout = 1f;
|
|
[Export] public float StartOffset = 0f;
|
|
private AnimatedSprite2D _sprite;
|
|
private State _state = State.Waiting;
|
|
private float _timeSinceState;
|
|
private readonly List<Node2D> _bodiesOnButton = new List<Node2D>();
|
|
|
|
|
|
// Called when the node enters the scene tree for the first time.
|
|
public override void _Ready()
|
|
{
|
|
_sprite = (AnimatedSprite2D)FindChild("AnimatedSprite2D");
|
|
_timeSinceState -= StartOffset;
|
|
}
|
|
|
|
// Called every frame. 'delta' is the elapsed time since the previous frame.
|
|
public override void _Process(double delta)
|
|
{
|
|
}
|
|
|
|
public override void _PhysicsProcess(double delta)
|
|
{
|
|
if (Enabled)
|
|
{
|
|
switch (_state)
|
|
{
|
|
case State.Waiting:
|
|
_sprite.Stop();
|
|
_timeSinceState += (float)delta;
|
|
if (_timeSinceState > SpikesTimeout)
|
|
{
|
|
_state = State.Opening;
|
|
_timeSinceState = 0;
|
|
}
|
|
break;
|
|
case State.Opening:
|
|
_sprite.Play("default");
|
|
KillBodiesOnButton();
|
|
break;
|
|
case State.Closing:
|
|
_sprite.PlayBackwards("default");
|
|
break;
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
private void KillBodiesOnButton()
|
|
{
|
|
foreach (var body in _bodiesOnButton)
|
|
{
|
|
switch (body)
|
|
{
|
|
case LivingArmor armor:
|
|
armor.Kill(this);
|
|
break;
|
|
case Wretched wretched:
|
|
wretched.Kill(this);
|
|
break;
|
|
case Player player:
|
|
player.Kill(this);
|
|
break;
|
|
default:
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
|
|
private void _OnEntered(Node2D body)
|
|
{
|
|
// if (_state is State.Waiting)
|
|
// {
|
|
_bodiesOnButton.Add(body);
|
|
// }
|
|
// switch (body)
|
|
// {
|
|
// case Wretched wretched:
|
|
// wretched.Kill(this);
|
|
// break;
|
|
// case Player player:
|
|
// player.Kill(this);
|
|
// break;
|
|
// default:
|
|
// return;
|
|
// }
|
|
}
|
|
|
|
|
|
private void _OnExited(Node2D body)
|
|
{
|
|
_bodiesOnButton.Remove(body);
|
|
}
|
|
|
|
private void _WhenOpened()
|
|
{
|
|
switch (_state)
|
|
{
|
|
case State.Waiting:
|
|
break;
|
|
case State.Opening:
|
|
_state = State.Closing;
|
|
break;
|
|
case State.Closing:
|
|
_state = State.Waiting;
|
|
break;
|
|
|
|
}
|
|
}
|
|
|
|
private void On()
|
|
{
|
|
Enabled = true;
|
|
_timeSinceState = -StartOffset;
|
|
}
|
|
|
|
private void Off()
|
|
{
|
|
_sprite.Stop();
|
|
Enabled = false;
|
|
_state = State.Waiting;
|
|
}
|
|
|
|
}
|