cirnogodot/Scripts/Door.cs

152 lines
2.9 KiB
C#
Raw Normal View History

2025-01-20 12:17:27 +01:00
using Godot;
using System;
using System.Diagnostics;
using Cirno.Scripts;
public partial class Door : Activable
{
2025-02-23 01:24:29 +01:00
protected AnimatedSprite2D _animatedSprite;
protected CollisionShape2D _collisionShape;
protected CollisionShape2D _solidShape;
2025-01-20 12:17:27 +01:00
// Called when the node enters the scene tree for the first time.
[Export]
public DoorState State { get; set; }
2025-02-23 01:27:14 +01:00
[Signal]
public delegate void DoorOpenedEventHandler();
[Signal]
public delegate void DoorClosedEventHandler();
2025-01-20 12:17:27 +01:00
public override void _Ready()
{
_animatedSprite = GetNode<AnimatedSprite2D>("AnimatedSprite2D");
_collisionShape = GetNode<CollisionShape2D>("CollisionShape2D");
_solidShape = GetNode<CollisionShape2D>("RigidBody2D/CollisionShape2D");
SetState(State);
}
// Called every frame. 'delta' is the elapsed time since the previous frame.
public override void _Process(double delta)
{
}
2025-02-23 01:24:29 +01:00
public virtual void Open()
2025-01-20 12:17:27 +01:00
{
_animatedSprite.Play("Opening");
State = DoorState.Open;
2025-02-21 16:27:57 +01:00
CallDeferred(MethodName.DeferredDisableCollision, true);
//_collisionShape.Disabled = true;
//_solidShape.Disabled = true;
2025-01-20 12:17:27 +01:00
}
2025-02-23 01:24:29 +01:00
public virtual void Close()
2025-01-20 12:17:27 +01:00
{
_animatedSprite.Play("Closing");
State = DoorState.Closed;
2025-02-21 16:27:57 +01:00
CallDeferred(MethodName.DeferredDisableCollision, false);
//_collisionShape.Disabled = false;
//_solidShape.Disabled = false;
2025-01-20 12:17:27 +01:00
}
2025-02-21 18:57:00 +01:00
public void Destroy()
{
_animatedSprite.Play("Destroyed");
State = DoorState.Destroyed;
CallDeferred(MethodName.DeferredDisableCollision, true);
}
2025-02-21 16:27:57 +01:00
private void DeferredDisableCollision(bool state)
{
_collisionShape.Disabled = state;
_solidShape.Disabled = state;
}
2025-02-06 17:57:06 +01:00
public override void Activate(ActivationType activationType = ActivationType.Toggle)
2025-01-20 12:17:27 +01:00
{
2025-02-13 16:10:22 +01:00
switch (activationType)
2025-01-20 12:17:27 +01:00
{
2025-02-13 16:10:22 +01:00
case ActivationType.Toggle:
2025-02-21 18:57:00 +01:00
ToggleDoor();
2025-02-13 16:10:22 +01:00
break;
case ActivationType.Enable:
2025-02-21 18:57:00 +01:00
Close();
2025-01-20 12:17:27 +01:00
break;
2025-02-13 16:10:22 +01:00
case ActivationType.Disable:
2025-02-21 18:57:00 +01:00
Open();
2025-01-20 12:17:27 +01:00
break;
2025-02-13 16:10:22 +01:00
case ActivationType.Use:
2025-02-21 18:57:00 +01:00
ToggleDoor();
2025-02-13 16:10:22 +01:00
break;
case ActivationType.Destroy:
2025-02-21 18:57:00 +01:00
Destroy();
break;
case ActivationType.Open:
Open();
break;
case ActivationType.Close:
Close();
2025-02-13 16:10:22 +01:00
break;
2025-01-20 12:17:27 +01:00
default:
2025-02-21 18:57:00 +01:00
ToggleDoor();
break;
}
}
private void ToggleDoor()
{
switch (State)
{
case DoorState.Closed:
Open();
break;
case DoorState.Open:
Close();
break;
default:
throw new ArgumentOutOfRangeException();
2025-01-20 12:17:27 +01:00
}
}
private void SetState(DoorState state)
{
switch (state)
{
case DoorState.Closed:
Close();
break;
case DoorState.Open:
Open();
break;
2025-02-21 18:57:00 +01:00
case DoorState.Destroyed:
Destroy();
break;
2025-01-20 12:17:27 +01:00
default:
throw new ArgumentOutOfRangeException();
}
}
public void _on_animated_sprite_2d_animation_changed()
{
switch (_animatedSprite.Animation)
{
case "Opening":
break;
case "Closing":
break;
default:
break;
}
}
}
public enum DoorState
{
Closed,
2025-02-21 18:57:00 +01:00
Open,
Destroyed
2025-01-20 12:17:27 +01:00
}