diff --git a/project.godot b/project.godot index 29e0330..43ed708 100644 --- a/project.godot +++ b/project.godot @@ -11,7 +11,7 @@ config_version=5 [application] config/name="Facsimile Wing" -run/main_scene="uid://coix5dqblmu7r" +run/main_scene="uid://bj4fytc3sy482" config/features=PackedStringArray("4.6", "Forward Plus") config/icon="res://icon.svg" diff --git a/resources/player_weapons/weapon_shot.gd b/resources/player_weapons/weapon_shot.gd index 70c64c6..63adff0 100644 --- a/resources/player_weapons/weapon_shot.gd +++ b/resources/player_weapons/weapon_shot.gd @@ -5,11 +5,13 @@ extends Resource @export var shot_name: String @export var bullet_scene: PackedScene = null -#@export var sprite: Texture2D = preload("res://graphics/shot.png") - @export_category("Shot Data") @export var damage: int = 1 @export var speed: int = 135 @export var projectiles: int = 2 @export var spacing: float = 35 @export var origin: int = -23 + +@export_category("Stagger") +@export var horizontal_offset: float = 6.5 # Horizontal distance between projectiles +@export var stagger_offset: float = 5 # Time delay per projectile index diff --git a/resources/player_weapons/weapon_shot_stock.tres b/resources/player_weapons/weapon_shot_stock.tres index 5fb1b26..4a783c6 100644 --- a/resources/player_weapons/weapon_shot_stock.tres +++ b/resources/player_weapons/weapon_shot_stock.tres @@ -7,8 +7,9 @@ script = ExtResource("2_by0nb") shot_name = "Stock Shot" bullet_scene = ExtResource("1_by0nb") -speed = 375 +speed = 355 projectiles = 3 -spacing = 25.0 -origin = -20 +spacing = 32.0 +origin = -25 +stagger_offset = 0.75 metadata/_custom_type_script = "uid://7n1itonn35fm" diff --git a/scenes/game.gd b/scenes/game.gd new file mode 100644 index 0000000..d9dd459 --- /dev/null +++ b/scenes/game.gd @@ -0,0 +1,3 @@ +extends Node2D + +@onready var screensize = get_viewport().content_scale_size diff --git a/scenes/game.gd.uid b/scenes/game.gd.uid new file mode 100644 index 0000000..b7f02c2 --- /dev/null +++ b/scenes/game.gd.uid @@ -0,0 +1 @@ +uid://dkti4uwycpqrs diff --git a/scenes/game.tscn b/scenes/game.tscn index 18dbab4..ebf430e 100644 --- a/scenes/game.tscn +++ b/scenes/game.tscn @@ -1,9 +1,11 @@ [gd_scene format=3 uid="uid://dqd8cxe7aj3b4"] +[ext_resource type="Script" uid="uid://dkti4uwycpqrs" path="res://scenes/game.gd" id="1_lnu2h"] [ext_resource type="PackedScene" uid="uid://bj4fytc3sy482" path="res://scenes/world.tscn" id="1_uwrxv"] [ext_resource type="Texture2D" uid="uid://egqbrm636m4h" path="res://graphics/title.png" id="2_yqjtg"] [node name="Game" type="Node2D" unique_id=1673976895] +script = ExtResource("1_lnu2h") [node name="World" parent="." unique_id=1317852169 instance=ExtResource("1_uwrxv")] diff --git a/scenes/player.gd b/scenes/player.gd index 2fdf567..6439eb4 100644 --- a/scenes/player.gd +++ b/scenes/player.gd @@ -6,15 +6,23 @@ class_name Player extends Area2D @onready var shoot_component: ShootComponent = %ShootComponent @onready var weapon_component: WeaponComponent = %WeaponComponent +# Get the viewport size for positioning +@onready var screensize = get_viewport().content_scale_size + # Variables for Player shooting status @export var can_shoot: bool = true @export var is_shooting: bool = false +@export var muzzle_flash: bool = false # Variables for Player position calculations for equidistant bullets var previous_position: Vector2 var ship_displacement: float var travel: float = 0 +func _ready() -> void: + + ## Set initial start position + position = Vector2(screensize.x / 2, screensize.y - 45) func _process(delta) -> void: @@ -28,6 +36,12 @@ func _process(delta) -> void: if is_shooting == true: shoot_component.shoot() + $%MuzzleFlash.show() + + if is_shooting == false: + $%MuzzleFlash.hide() + + # Read Movement Component movement_component.input = input_component.move_dir diff --git a/scenes/player.tscn b/scenes/player.tscn index d3645ea..d8caa0d 100644 --- a/scenes/player.tscn +++ b/scenes/player.tscn @@ -90,6 +90,9 @@ size = Vector2(6, 5.75) [node name="Player" type="Area2D" unique_id=652131079] script = ExtResource("1_ur7pv") +can_shoot = null +is_shooting = null +muzzle_flash = null [node name="Ship" type="Sprite2D" parent="." unique_id=1155866924] unique_name_in_owner = true diff --git a/scenes/weapon_stock.gd b/scenes/weapon_stock.gd new file mode 100644 index 0000000..090c09a --- /dev/null +++ b/scenes/weapon_stock.gd @@ -0,0 +1,20 @@ +extends Area2D + +@onready var bullet: PackedScene = load("res://scenes/weapon_stock.tscn") + +@onready var shot_data: = load("res://resources/player_weapons/weapon_shot_stock.tres") + +# Time offset when this bullet was fired (relative to other bullets) +var time_offset: float = 0.5 + +#func activate(): + # Bullet does its damage/projectile work + +func _process(delta): + + #Calculation position along Y axis + position.y -= shot_data.speed * delta # Original Speed + #position.y -= 330 * delta # non-shot_data testing + +func _on_visible_on_screen_notifier_2d_screen_exited() -> void: + queue_free() diff --git a/scenes/weapon_stock.gd.uid b/scenes/weapon_stock.gd.uid new file mode 100644 index 0000000..f1e41f6 --- /dev/null +++ b/scenes/weapon_stock.gd.uid @@ -0,0 +1 @@ +uid://c5blhfopjpfny diff --git a/scenes/weapon_stock.tscn b/scenes/weapon_stock.tscn index 998e37b..ce1c91e 100644 --- a/scenes/weapon_stock.tscn +++ b/scenes/weapon_stock.tscn @@ -1,6 +1,6 @@ [gd_scene format=3 uid="uid://ddpclu2vdy2ve"] -[ext_resource type="Script" uid="uid://d1rwqotmrag1r" path="res://Deprecated/stock_weapon.gd" id="1_u1d5o"] +[ext_resource type="Script" uid="uid://c5blhfopjpfny" path="res://scenes/weapon_stock.gd" id="1_u1d5o"] [ext_resource type="Texture2D" uid="uid://ti1uy42vnnhw" path="res://graphics/shot.png" id="2_5bykt"] [sub_resource type="RectangleShape2D" id="RectangleShape2D_mvdrj"] diff --git a/scripts/movement_component.gd b/scripts/movement_component.gd index 1d3a4ac..18ebdb2 100644 --- a/scripts/movement_component.gd +++ b/scripts/movement_component.gd @@ -12,7 +12,7 @@ class_name MovementComponent extends Node var input = Input.get_vector("left", "right", "up","down") func tick(delta: float): - + # Check to see if there's a player to move if player == null: return diff --git a/scripts/shoot_component.gd b/scripts/shoot_component.gd index 65240d2..43f5f46 100644 --- a/scripts/shoot_component.gd +++ b/scripts/shoot_component.gd @@ -1,32 +1,49 @@ 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 = $".." - -# Change from instantiating WeaponComponent to instantiating Shot nodes 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: - for b in range(weapon_data.projectiles): - - # Get the Shot scene from the WeaponShot resource - var bullet_scene = weapon_data.bullet_scene # Or however you store it - - # Instantiate the bullet based data - var bullet := bullet_scene.instantiate() as Node - get_tree().root.add_child(bullet) - # Set up the bullet from resource data - #bullet.shot_data = weapon_data # Pass the configuration + # Calculate center index for symmetrical staggering + var center_index = (total_projectiles - 1) / 2.0 - # Adjust bullet spacing before firing - bullet.position = player.position + Vector2((b - (weapon_data.projectiles - 1) / 2.0) * round(round((weapon_data.projectiles + weapon_data.spacing / 2)) / 2 - 2), weapon_data.origin) - print(b, bullet.position.x) - print(weapon_data.shot_name + " "+"fired!") + 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) - # Subtract projectile spacing from current Player travel for next - player.travel -= weapon_data.spacing + # Calculate index relative to center (0 = center, -1/+1 = first from center) + var index_from_center: int = b - center_index - else: return + # 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.spacing_horizontal + + # 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