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

@ -17,7 +17,7 @@ public partial class ForceField : Door
base.Open();
if (TurnOffMaterial is null) return;
_animatedSprite.Material = TurnOffMaterial;
//_animatedSprite.Material = TurnOffMaterial;
//((ShaderMaterial)_animatedSprite.Material).Shader = TurnOffShader;
_ = AnimateShutdownAsync();
}
@ -37,17 +37,17 @@ public partial class ForceField : Door
base.Close();
if (ActiveMaterial is null) return;
_animatedSprite.Material = ActiveMaterial;
//_animatedSprite.Material = ActiveMaterial;
//((ShaderMaterial)_animatedSprite.Material).Shader = ActiveShader;
}
private void SetShaderTeleportProgress(float value)
{
((ShaderMaterial)_animatedSprite.Material).SetShaderParameter("teleport_progress", value);
//((ShaderMaterial)_animatedSprite.Material).SetShaderParameter("teleport_progress", value);
}
private void SetShaderScanlineDensity(float value)
{
((ShaderMaterial)_animatedSprite.Material).SetShaderParameter("scanline_density", value);
//((ShaderMaterial)_animatedSprite.Material).SetShaderParameter("scanline_density", value);
}
}

View file

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

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)
{

View file

@ -5,9 +5,9 @@ using Cirno.Scripts;
public partial class Door : Activable
{
protected AnimatedSprite2D _animatedSprite;
protected CollisionShape2D _collisionShape;
protected CollisionShape2D _solidShape;
// protected AnimatedSprite2D _animatedSprite;
//protected CollisionShape2D _collisionShape;
//protected CollisionShape2D _solidShape;
protected AudioStreamPlayer2D _activationSound;
protected AudioStreamPlayer2D _deactivationSound;
@ -21,12 +21,15 @@ public partial class Door : Activable
[Signal]
public delegate void DoorClosedEventHandler();
[Signal]
public delegate void DestroyedEventHandler();
public override void _Ready()
{
_animatedSprite = GetNode<AnimatedSprite2D>("AnimatedSprite2D");
_collisionShape = GetNode<CollisionShape2D>("CollisionShape2D");
_solidShape = GetNode<CollisionShape2D>("RigidBody2D/CollisionShape2D");
// _animatedSprite = GetNode<AnimatedSprite2D>("AnimatedSprite2D");
//_collisionShape = GetNode<CollisionShape2D>("CollisionShape2D");
//_solidShape = GetNode<CollisionShape2D>("RigidBody2D/CollisionShape2D");
_activationSound = GetNodeOrNull<AudioStreamPlayer2D>("ActivationSound");
_deactivationSound = GetNodeOrNull<AudioStreamPlayer2D>("DeactivationSound");
@ -41,35 +44,39 @@ public partial class Door : Activable
public virtual void Open()
{
_animatedSprite.Play("Opening");
// _animatedSprite.Play("Opening");
State = DoorState.Open;
CallDeferred(MethodName.DeferredDisableCollision, true);
_deactivationSound?.Play();
EmitSignal(SignalName.DoorOpened);
//_collisionShape.Disabled = true;
//_solidShape.Disabled = true;
}
public virtual void Close()
{
_animatedSprite.Play("Closing");
// _animatedSprite.Play("Closing");
State = DoorState.Closed;
CallDeferred(MethodName.DeferredDisableCollision, false);
_activationSound?.Play();
EmitSignal(SignalName.DoorClosed);
//_collisionShape.Disabled = false;
//_solidShape.Disabled = false;
}
public void Destroy()
{
_animatedSprite.Play("Destroyed");
// _animatedSprite.Play("Destroyed");
State = DoorState.Destroyed;
CallDeferred(MethodName.DeferredDisableCollision, true);
EmitSignal(SignalName.Destroyed);
}
private void DeferredDisableCollision(bool state)
{
_collisionShape.Disabled = state;
_solidShape.Disabled = state;
//_collisionShape.Disabled = state;
//_solidShape.Disabled = state;
}
public override void Activate(ActivationType activationType = ActivationType.Toggle)
@ -136,20 +143,20 @@ public partial class Door : Activable
}
}
public void _on_animated_sprite_2d_animation_changed()
{
switch (_animatedSprite.Animation)
{
case "Opening":
break;
case "Closing":
break;
default:
break;
}
}
// public void _on_animated_sprite_2d_animation_changed()
// {
// switch (_animatedSprite.Animation)
// {
// case "Opening":
//
// break;
// case "Closing":
//
// break;
// default:
// break;
// }
// }
}
public enum DoorState

6
Scripts/ShaderTools.cs Normal file
View file

@ -0,0 +1,6 @@
namespace Cirno.Scripts;
public static class ShaderTools
{
}