cirnogodot/Scripts/Resources/ScriptableBullets/ParallelPatternGroup.cs

66 lines
2 KiB
C#
Raw Normal View History

using System.Collections.Generic;
using Cirno.Scripts.AttackPatterns;
using Godot;
using Godot.Collections;
namespace Cirno.Scripts.Resources.ScriptableBullets;
[GlobalClass]
2025-06-03 10:11:09 +02:00
[Tool]
public partial class ParallelPatternGroup : AttackPattern
{
[Export(PropertyHint.None, "suffix:s")] public float Duration { get; private set; } = 10f;
[Export] public Array<AttackPattern> Patterns { get; private set; } = [];
public override IPatternMachine MakeMachine(Node2D parent)
{
return new ParallelPatternGroupMachine(this, parent);
}
public class ParallelPatternGroupMachine(ParallelPatternGroup patternGroup, Node2D parent) : IPatternMachine
{
public Node2D Parent => parent;
//private int _currentPatternIndex = 0;
//private AttackPattern CurrentPattern => patternGroup.Patterns[_currentPatternIndex];
2025-06-09 10:55:43 +02:00
private double _progressTimer = 0;
private List<IPatternMachine> _patternMachines = [];
public void Start()
{
//_currentPatternIndex = 0;
foreach (var pattern in patternGroup.Patterns)
{
var machine = pattern.MakeMachine(parent);
_patternMachines.Add(machine);
machine.Start();
}
}
public void UpdatePattern(double delta)
{
2025-06-09 10:55:43 +02:00
_progressTimer += delta;
foreach (var patternMachine in _patternMachines)
{
//if (!CurrentPattern.WaitForCompletion || _patternMachine.IsComplete())
2025-05-09 17:06:45 +02:00
if (patternMachine.IsComplete()) continue;
patternMachine.UpdatePattern(delta);
}
}
public bool IsComplete()
{
2025-06-09 10:55:43 +02:00
if (patternGroup.WaitForCompletion)
{
return _patternMachines.TrueForAll(x => x.IsComplete()) && _progressTimer >= patternGroup.Duration;
}
return _patternMachines.TrueForAll(x => x.IsComplete()) || _progressTimer >= patternGroup.Duration;
}
}
}