Modularized doors and lightbridges

This commit is contained in:
Marco 2025-03-03 17:55:53 +01:00
commit 1a5bd1b6d8
27 changed files with 513 additions and 346 deletions

View file

@ -0,0 +1,29 @@
using Godot;
namespace Cirno.Scripts.Components.Actors;
public partial class DoorSpriteComponent : AnimatedSprite2D
{
protected Door _door;
public override void _Ready()
{
_door = GetParent<Door>();
_door.DoorOpened += DoorOpened;
_door.DoorClosed += DoorClosed;
}
protected virtual void DoorClosed()
{
this.Play("Closing");
}
protected virtual void DoorOpened()
{
this.Play("Opening");
}
}

View file

@ -0,0 +1 @@
uid://bbuhaam28lwld

View file

@ -0,0 +1,39 @@
using Godot;
namespace Cirno.Scripts.Components.Actors;
public partial class ForceFieldCollisionDisabler : CollisionShape2D
{
[Export]
protected Door _door;
[Export]
public bool Invert { get; private set; } = false;
public override void _Ready()
{
//_door = GetParent<Door>();
_door.DoorOpened += DoorOpened;
_door.DoorClosed += DoorClosed;
}
protected virtual void DoorClosed()
{
CallDeferred(MethodName.Enable);
}
private void Disable()
{
this.Disabled = !Invert;
}
protected virtual void DoorOpened()
{
CallDeferred(MethodName.Disable);
}
private void Enable()
{
this.Disabled = Invert;
}
}

View file

@ -0,0 +1 @@
uid://crpkvxepkcrir

View file

@ -0,0 +1,8 @@
using Godot;
namespace Cirno.Scripts.Components.Actors;
public partial class ForceFieldMaterialAnimationHandler : Node2D
{
}

View file

@ -0,0 +1 @@
uid://dmi8k8ogkwogi

View file

@ -0,0 +1,48 @@
using System.Threading.Tasks;
using Godot;
namespace Cirno.Scripts.Components.Actors;
public partial class ForceFieldSpriteComponent : DoorSpriteComponent
{
[Export]
public Material TurnOffMaterial { get; private set; }
[Export]
public Material ActiveMaterial { get; private set; }
protected override void DoorOpened()
{
base.DoorOpened();
if (TurnOffMaterial is null) return;
this.Material = TurnOffMaterial;
_ = AnimateShutdownAsync();
}
protected override void DoorClosed()
{
base.DoorClosed();
if (ActiveMaterial is null) return;
this.Material = ActiveMaterial;
}
protected async Task AnimateShutdownAsync()
{
Tween tween = GetTree().CreateTween();
tween.TweenMethod(Callable.From((float value) => SetShaderScanlineDensity(value)), 0f, 50f, 0.5);
tween.Parallel().TweenMethod(Callable.From((float value) => SetShaderTeleportProgress(value)), 0f, 1f, 0.5);
await ToSignal(tween, "finished");
}
private void SetShaderTeleportProgress(float value)
{
((ShaderMaterial)this.Material).SetShaderParameter("teleport_progress", value);
}
private void SetShaderScanlineDensity(float value)
{
((ShaderMaterial)this.Material).SetShaderParameter("scanline_density", value);
}
}

View file

@ -0,0 +1 @@
uid://cvsrm74jftau8

View file

@ -0,0 +1,57 @@
using System.Threading.Tasks;
using Godot;
namespace Cirno.Scripts.Components.Actors;
public partial class LightBridgeSpriteComponent : Sprite2D
{
[Export]
public Material TurnOffMaterial { get; private set; }
[Export]
public Material ActiveMaterial { get; private set; }
protected Door _door;
public override void _Ready()
{
_door = GetParent<Door>();
_door.DoorOpened += DoorOpened;
_door.DoorClosed += DoorClosed;
}
protected virtual void DoorOpened()
{
if (TurnOffMaterial is null) return;
this.Material = TurnOffMaterial;
_ = AnimateShutdownAsync();
}
protected virtual void DoorClosed()
{
if (ActiveMaterial is null) return;
this.Material = ActiveMaterial;
}
protected async Task AnimateShutdownAsync()
{
Tween tween = GetTree().CreateTween();
tween.TweenMethod(Callable.From((float value) => SetShaderScanlineDensity(value)), 0f, 50f, 0.5);
tween.Parallel().TweenMethod(Callable.From((float value) => SetShaderTeleportProgress(value)), 0f, 1f, 0.5);
await ToSignal(tween, "finished");
}
private void SetShaderTeleportProgress(float value)
{
((ShaderMaterial)this.Material).SetShaderParameter("teleport_progress", value);
}
private void SetShaderScanlineDensity(float value)
{
((ShaderMaterial)this.Material).SetShaderParameter("scanline_density", value);
}
}

View file

@ -0,0 +1 @@
uid://cwnfsmogt11mn

View file

@ -15,6 +15,8 @@ public partial class PlayerDamageReceiver : Area2D
private ActorResourceProvider _healthProvider;
[Export]
private ActorResourceProvider _shieldProvider;
[Export] public StringName AcidGroupName { get; private set; } = "Acid";
[Signal]
public delegate void HealthChangedEventHandler(float newValue, float maxValue);
@ -88,10 +90,23 @@ public partial class PlayerDamageReceiver : Area2D
{
if (!Enabled) return;
if (Invulnerable) return;
if (area.IsInGroup(AcidGroupName))
{
// Handle acid death
AcidDeath();
return;
}
if (area is not Bullet bullet || bullet.BulletOwner == BulletGroup) return;
this.Hit(bullet.Damage, bullet.DamageType);
bullet.RequestCollisionDestruction();
}
private void AcidDeath()
{
if (!Enabled) return;
GD.Print("Acid death");
_healthProvider.CurrentResource = 0;
}
public void Hit(float damage, DamageType type = DamageType.Neutral)
{