class_name CycleTimer @export var period: float = 1 var startTime: float = 0 var running: bool = false var distance: float = 200 var bullets: Array[BulletBase] = [] func start(): startTime = WorldManager.getTime() running = true func lifetime(): return WorldManager.getTime() - startTime func getStateAngle(index: int): return lifetime() / period * deg_to_rad(360) - deg_to_rad(360.0 * index / len(bullets)) func forceFilter(): bullets = bullets.filter( func(b): if b is BulletBase: return !b.destroying else: return false ) func apply(where: Vector2): forceFilter() for index in len(bullets): var bullet = bullets[index] var newStateAngle = lerp_angle(bullet.cycleStateAngle, getStateAngle(index), 0.1) var offset = Vector2.from_angle(newStateAngle) bullet.cycleStateAngle = newStateAngle offset.y *= 0.25 bullet.position = where + offset * distance bullet.scale = Vector2.ONE * (1 + offset.y) func host(bullet: BulletBase): bullets.append(bullet)