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 Area2D get_tree().root.add_child(bullet) # Calculate index relative to center (0 = center, -1/+1 = first from center) var index_from_center: float = b - center_index # Calculate timing offset for staggered firing var time_offset: float = index_from_center * stagger_offset # Calculate horizontal offset for this bullet (symmetrical: left=-ve, right=+ve) var bullet_horizontal_offset: float = index_from_center * weapon_data.horizontal_offset # Calculate vertical offset from center point (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(bullet_horizontal_offset, weapon_data.origin + (vertical_offset + weapon_data.origin - total_projectiles)) # Set timing properties on the bullet bullet.time_offset = time_offset bullet.fire_time = current_time + time_offset # Set the bullet data (this is what was missing) bullet.set_weapon_data(weapon_data.bullet_scene, weapon_data) # Subtract projectile spacing from current Player travel for next shot player.travel -= weapon_data.spacing