class_name ShootComponent extends Node @export var stagger_offset: float = 0.5 # Time delay per projectile index (seconds) @export var horizontal_offset: float = 1.0 # Horizontal distance per projectile index @onready var weapon_component: Node = %WeaponComponent @onready var player = $".." func shoot(): var weapon_data = weapon_component.data # WeaponShot resource configuration var current_time = Time.get_ticks_msec() / 1000.0 var total_projectiles = weapon_data.projectiles if player.travel > weapon_data.spacing: # Calculate center index for symmetrical staggering var center_index = (total_projectiles - 1) / 2.0 if total_projectiles > 0: for b in range(total_projectiles): var bullet_scene = weapon_data.bullet_scene var bullet := bullet_scene.instantiate() as Node get_tree().root.add_child(bullet) # Calculate index relative to center (0 = center, -1/+1 = first from center) var index_from_center: int = b - center_index # Calculate timing offset for staggered firing # Negative = fire before center (left), positive = fire after center (right) var time_offset: float = index_from_center * stagger_offset # Calculate horizontal offset for symmetrical spread (left = negative, right = positive) horizontal_offset = index_from_center * weapon_data.horizontal_offset # Calculate vertical offset from center point (creates symmetrical vertical spread) # Bullets on either side of center get offset by distance_from_center * spacing / 2 # This keeps the center bullet at origin and creates symmetrical vertical spread var distance_from_center: float = abs(index_from_center) var vertical_offset: float = (distance_from_center * weapon_data.origin * -1) / 2 # Final position combines symmetrical horizontal spread with symmetrical vertical spacing bullet.position = player.position + Vector2(horizontal_offset, weapon_data.origin + vertical_offset) ## Set timing properties on the bullet #bullet.time_offset = time_offset #bullet.fire_time = current_time + time_offset # Subtract projectile spacing from current Player travel for next player.travel -= weapon_data.spacing