cirnogodot/Scripts/Actors/ScriptableBulletsEmitter.cs

90 lines
2.2 KiB
C#
Raw Normal View History

2025-03-15 11:44:30 +01:00
using System;
using Cirno.Scripts.AttackPatterns;
using Cirno.Scripts.Resources;
using Godot;
namespace Cirno.Scripts.Actors;
2025-03-15 17:17:30 +01:00
public partial class ScriptableBulletsEmitter : Node2D, IActivable, IScriptHost
2025-03-15 11:44:30 +01:00
{
[Export]
public BulletScript Script { get; private set; }
2025-03-15 17:17:30 +01:00
[Export]
public bool InvertSignal { get; private set; } = false;
[Export]
public bool EmitOnStart { get; set; } = false;
[Signal]
public delegate void StateChangedEventHandler(bool isEmitting);
2025-03-15 11:44:30 +01:00
private bool _isActive = false;
2025-03-15 17:17:30 +01:00
//private BulletScript _scriptInstance;
protected BulletScript.BulletScriptMachine ScriptMachine;
2025-03-15 11:44:30 +01:00
public override void _Ready()
{
2025-03-15 17:17:30 +01:00
//_scriptInstance = Script.Duplicate(true) as BulletScript;
ScriptMachine = Script.Make(this);
2025-03-15 11:44:30 +01:00
_homePosition = this.GlobalPosition;
2025-03-15 17:17:30 +01:00
if (EmitOnStart)
{
_isActive = true;
ScriptMachine.Start();
}
EmitSignal(SignalName.StateChanged, _isActive);
2025-03-15 11:44:30 +01:00
}
public bool Activate(ActivationType activationType = ActivationType.Toggle)
{
switch (activationType)
{
case ActivationType.Use:
case ActivationType.Toggle:
_isActive = !_isActive;
break;
2025-03-15 17:17:30 +01:00
case ActivationType.Open:
2025-03-15 11:44:30 +01:00
case ActivationType.Enable:
2025-03-15 17:17:30 +01:00
_isActive = !InvertSignal;
2025-03-15 11:44:30 +01:00
break;
2025-03-15 17:17:30 +01:00
case ActivationType.Close:
2025-03-15 11:44:30 +01:00
case ActivationType.Disable:
2025-03-15 17:17:30 +01:00
_isActive = InvertSignal;
2025-03-15 11:44:30 +01:00
break;
case ActivationType.Destroy:
2025-03-15 17:17:30 +01:00
_isActive = InvertSignal;
// TODO: Explode
2025-03-15 11:44:30 +01:00
break;
}
if (_isActive)
{
2025-03-15 17:17:30 +01:00
ScriptMachine.Start();
2025-03-15 11:44:30 +01:00
}
2025-03-15 17:17:30 +01:00
EmitSignal(SignalName.StateChanged, _isActive);
2025-03-15 11:44:30 +01:00
return true;
}
public override void _Process(double delta)
{
if (!_isActive) return;
2025-03-15 17:17:30 +01:00
ScriptMachine.UpdatePhase(delta);
2025-03-15 11:44:30 +01:00
}
private Vector2 _homePosition;
public Vector2 HomePosition => _homePosition;
public void ChangeSpriteDirection(Vector2 direction)
{
}
}