This commit is contained in:
Marco 2025-02-21 18:57:00 +01:00
commit b07a8fe60d
33 changed files with 594 additions and 58 deletions

View file

@ -4,6 +4,8 @@ namespace Cirno.Scripts;
public partial class AlarmManager : Node2D
{
public static AlarmManager Instance { get; private set; }
public bool IsAlarmOn { get; private set; } = false;
public Vector2 LastAlarmPosition { get; private set; } = new Vector2();
@ -14,6 +16,11 @@ public partial class AlarmManager : Node2D
[Signal]
public delegate void AlarmDisabledEventHandler();
public override void _Ready()
{
Instance = this;
}
public void SoundAlarm(Vector2 location)
{
if (IsAlarmOn) return;

View file

@ -0,0 +1,52 @@
using Godot;
namespace Cirno.Scripts.Components;
public partial class AlarmTrigger : Node2D
{
private AlarmManager _alarmManager;
[Export]
public AlarmTriggerType TriggerType { get; private set; }
[Export]
public Node2D Target { get; private set; }
public override void _Ready()
{
_alarmManager = this.GetAlarmManager(); //AlarmManager.Instance;
if (TriggerType is AlarmTriggerType.OnEnabled)
{
_alarmManager.AlarmEnabled += AlarmManagerOnAlarmEnabled;
}
else
{
_alarmManager.AlarmDisabled += AlarmManagerOnAlarmDisabled;
}
}
private void AlarmManagerOnAlarmDisabled()
{
Activate();
}
private void AlarmManagerOnAlarmEnabled(Vector2 location)
{
Activate();
}
private void Activate()
{
if (Target is IActivable activatable)
{
activatable.Activate();
}
}
public enum AlarmTriggerType
{
OnEnabled,
OnDisabled
}
}

View file

@ -45,6 +45,13 @@ public partial class Door : Activable
//_solidShape.Disabled = false;
}
public void Destroy()
{
_animatedSprite.Play("Destroyed");
State = DoorState.Destroyed;
CallDeferred(MethodName.DeferredDisableCollision, true);
}
private void DeferredDisableCollision(bool state)
{
_collisionShape.Disabled = state;
@ -56,30 +63,44 @@ public partial class Door : Activable
switch (activationType)
{
case ActivationType.Toggle:
switch (State)
{
case DoorState.Closed:
Open();
break;
case DoorState.Open:
Close();
break;
default:
throw new ArgumentOutOfRangeException();
}
ToggleDoor();
break;
case ActivationType.Enable:
Open();
break;
case ActivationType.Disable:
Close();
break;
case ActivationType.Disable:
Open();
break;
case ActivationType.Use:
ToggleDoor();
break;
case ActivationType.Destroy:
Destroy();
break;
case ActivationType.Open:
Open();
break;
case ActivationType.Close:
Close();
break;
default:
throw new ArgumentOutOfRangeException(nameof(activationType), activationType, null);
ToggleDoor();
break;
}
}
private void ToggleDoor()
{
switch (State)
{
case DoorState.Closed:
Open();
break;
case DoorState.Open:
Close();
break;
default:
throw new ArgumentOutOfRangeException();
}
}
@ -93,6 +114,9 @@ public partial class Door : Activable
case DoorState.Open:
Open();
break;
case DoorState.Destroyed:
Destroy();
break;
default:
throw new ArgumentOutOfRangeException();
}
@ -117,5 +141,6 @@ public partial class Door : Activable
public enum DoorState
{
Closed,
Open
Open,
Destroyed
}

View file

@ -195,11 +195,17 @@ public partial class GameManager : Node2D
CameraTargetObject(_player);
}
public void CameraTargetObject(Node2D target)
public void CameraTargetObject(Node2D target, Vector2? offset = null)
{
if (_cameraTarget is null) return;
_cameraTarget.Reparent(target, true);
_cameraTarget.GlobalPosition = target.GlobalPosition;
if (offset.HasValue)
{
_cameraTarget.Position += offset.Value;
}
}
private void SpawnWeapons()

View file

@ -11,5 +11,7 @@ public enum ActivationType
Enable,
Disable,
Use,
Destroy
Destroy,
Open,
Close
}

View file

@ -0,0 +1,21 @@
using Godot;
namespace Cirno.Scripts.Resources.Events;
[GlobalClass]
public partial class CameraTargetEvent : CameraTargetPlayerEvent
{
[Export]
public NodePath Target { get; private set; }
[Export]
public Vector2 Offset { get; private set; }
public override void Start(Node2D parent)
{
GameManager.Instance.CameraTargetObject(parent.GetNode<Node2D>(Target), Offset);
_isComplete = true;
}
}

View file

@ -0,0 +1,30 @@
using Godot;
namespace Cirno.Scripts.Resources.Events;
[GlobalClass]
public partial class CameraTargetPlayerEvent : EventResource
{
protected bool _isComplete = false;
public override void Init(Node2D parent)
{
}
public override void Start(Node2D parent)
{
GameManager.Instance.CameraTargetPlayer();
_isComplete = true;
}
public override void UpdateEvent(double delta)
{
}
public override bool IsComplete()
{
return _isComplete;
}
}

View file

@ -0,0 +1,38 @@
using System.Threading.Tasks;
using Godot;
namespace Cirno.Scripts.Resources.Events;
[GlobalClass]
public partial class WaitEvent : EventResource
{
[Export(PropertyHint.None, "suffix:s")]
public float WaitTime { get; set; }
protected bool _isComplete = false;
public override void Init(Node2D parent)
{
}
public override void Start(Node2D parent)
{
_ = Wait();
}
private async Task Wait()
{
await Task.Delay((int)(WaitTime)*1000);
_isComplete = true;
}
public override void UpdateEvent(double delta)
{
}
public override bool IsComplete()
{
return _isComplete;
}
}

View file

@ -0,0 +1,10 @@
{
"compilerOptions": {
"target": "es2016",
"module": "commonjs",
"esModuleInterop": true,
"forceConsistentCasingInFileNames": true,
"strict": true,
"skipLibCheck": true
}
}