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 Node2D 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 * weapon_data.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 fixed vertical offset from weapon origin bullet.position = player.position + Vector2(bullet_horizontal_offset, weapon_data.origin) # Set timing properties on the bullet bullet.time_offset = time_offset bullet.fire_time = current_time + time_offset # Set the angle for bullets - symmetrical spread around vertical (straight up = -90°) if weapon_data.angle == 0: # If angle is 0, all projectiles fire straight up bullet.angle = -90.0 else: # Set angle for bullets - symmetrical spread around vertical (straight up = -90°) if index_from_center == 0: # Center projectile fires straight up bullet.angle = -90.0 else: # Left projectiles: positive angle (up and to the left), Right projectiles: negative angle (up and to the right) bullet.angle = -90.0 + weapon_data.angle * sign(index_from_center) # Subtract projectile spacing from current Player travel for next shot player.travel -= weapon_data.spacing