From 8eb39f4a704de8ca73c6b6a6a27473ae91826bfd Mon Sep 17 00:00:00 2001 From: Haze Weathers Date: Sat, 3 Jan 2026 11:02:33 -0600 Subject: [PATCH] spreads and stacks! --- scenes/test_scene_haze.tscn | 33 +++++++------------ .../spawn_patterns/spawn_pattern_stacker.gd | 32 ++++++++++++++++++ .../spawn_pattern_stacker.gd.uid | 1 + .../bullets/spawn_patterns/spread_pattern.gd | 27 +++++++++++++++ .../spawn_patterns/spread_pattern.gd.uid | 1 + 5 files changed, 72 insertions(+), 22 deletions(-) create mode 100644 systems/bullets/spawn_patterns/spawn_pattern_stacker.gd create mode 100644 systems/bullets/spawn_patterns/spawn_pattern_stacker.gd.uid create mode 100644 systems/bullets/spawn_patterns/spread_pattern.gd create mode 100644 systems/bullets/spawn_patterns/spread_pattern.gd.uid diff --git a/scenes/test_scene_haze.tscn b/scenes/test_scene_haze.tscn index 889b6b0..d11d72e 100644 --- a/scenes/test_scene_haze.tscn +++ b/scenes/test_scene_haze.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=17 format=3 uid="uid://dxsp66qpvm65b"] +[gd_scene load_steps=15 format=3 uid="uid://dxsp66qpvm65b"] [ext_resource type="PackedScene" uid="uid://q2fys6o0jy6w" path="res://objects/starfield/starfield.tscn" id="1_4oowd"] [ext_resource type="PackedScene" uid="uid://c714s5d7d5765" path="res://objects/player/player.tscn" id="2_j8ivh"] @@ -7,9 +7,8 @@ [ext_resource type="Script" uid="uid://dntp60my5f65m" path="res://systems/bullets/bullet_behaviors/linear_motion_behavior.gd" id="4_t1bs8"] [ext_resource type="Texture2D" uid="uid://c21fe72aym3fe" path="res://graphics/bullets/normal_bullet/test_bullet.png" id="5_4oowd"] [ext_resource type="Script" uid="uid://vus1a0flwtnm" path="res://systems/bullets/bullet_preset.gd" id="6_sle1e"] -[ext_resource type="Script" uid="uid://dtuc6qerbfset" path="res://systems/bullets/spawn_patterns/ring_pattern.gd" id="6_uu3sg"] -[ext_resource type="Script" uid="uid://ckedfcjjnv7dq" path="res://systems/bullets/spawn_patterns/spawn_pattern_randomizer.gd" id="7_4oowd"] [ext_resource type="Texture2D" uid="uid://cgqgb84k38tbe" path="res://graphics/bullets/normal_bullet/test_bullet_overlay.png" id="7_sle1e"] +[ext_resource type="Script" uid="uid://t5lnmlng1vey" path="res://systems/bullets/spawn_patterns/spread_pattern.gd" id="8_sle1e"] [sub_resource type="Resource" id="Resource_c0i5a"] script = ExtResource("4_4oowd") @@ -29,23 +28,12 @@ frames = 2 fps = 10.0 metadata/_custom_type_script = "uid://0ognvvq2ncd7" -[sub_resource type="Resource" id="Resource_4oowd"] -script = ExtResource("6_uu3sg") -bullet_count = 1 -bullet_speed = 120.0 -metadata/_custom_type_script = "uid://dtuc6qerbfset" - -[sub_resource type="Resource" id="Resource_sle1e"] -script = ExtResource("7_4oowd") -pattern = SubResource("Resource_4oowd") -property_min_values = Dictionary[StringName, float]({ -&"direction_rotation": -3.142 -}) -property_max_values = Dictionary[StringName, float]({ -&"direction_rotation": 3.142 -}) -iterations = 50 -metadata/_custom_type_script = "uid://ckedfcjjnv7dq" +[sub_resource type="Resource" id="Resource_uu3sg"] +script = ExtResource("8_sle1e") +bullet_count = 3 +bullet_speed = 60.0 +spread = 1.0471975511965976 +metadata/_custom_type_script = "uid://t5lnmlng1vey" [sub_resource type="Resource" id="Resource_hxqcc"] script = ExtResource("6_sle1e") @@ -54,9 +42,9 @@ hitbox_size = Vector2i(6, 6) base_graphics = Array[ExtResource("4_4oowd")]([SubResource("Resource_c0i5a")]) overlay_graphics = Array[ExtResource("4_4oowd")]([SubResource("Resource_1xo0o")]) colors = Array[Color]([Color(1, 0, 0, 1), Color(0, 0, 1, 1), Color(0, 1, 0, 1), Color(1, 1, 0, 1)]) -pattern = SubResource("Resource_sle1e") +pattern = SubResource("Resource_uu3sg") rounds = 99999999 -round_delay = 0.5 +round_delay = 0.2 metadata/_custom_type_script = "uid://vus1a0flwtnm" [node name="TestScene" type="Node"] @@ -73,6 +61,7 @@ position = Vector2(122, 283) [node name="BulletSet" type="Node2D" parent="."] position = Vector2(122, 92) +rotation = 1.5707964 script = ExtResource("3_cf1so") preset = SubResource("Resource_hxqcc") metadata/_custom_type_script = "uid://cj2fj7snls8aa" diff --git a/systems/bullets/spawn_patterns/spawn_pattern_stacker.gd b/systems/bullets/spawn_patterns/spawn_pattern_stacker.gd new file mode 100644 index 0000000..1731443 --- /dev/null +++ b/systems/bullets/spawn_patterns/spawn_pattern_stacker.gd @@ -0,0 +1,32 @@ +@tool +class_name SpawnPatternStacker +extends BulletSpawnPattern +## Spawns a pattern in a "stack". The pattern will be spawned multiple +## times at once with a varying [code]bullet_speed[/code]. + + +## The subpattern to stack. +@export var pattern: BulletSpawnPattern +## The number of times to "stack" up the pattern. +@export_range(1, 1, 1, "or_greater") var stack_count: int = 1 +## The minimum speed of the stacked patterns. +@export var min_speed: float: + set(value): + if min_speed != value: + min_speed = value + max_speed = maxf(min_speed, max_speed) +## The maximum speed of the stacked patterns. +@export var max_speed: float: + set(value): + if max_speed != value: + max_speed = value + min_speed = minf(min_speed, max_speed) + + +func _spawn_bullets(bullet_set: BulletSet, preset: BulletPreset) -> void: + for i in stack_count: + pattern.set( + &"bullet_speed", + remap(float(i), 0.0, float(stack_count - 1), min_speed, max_speed) + ) + pattern.spawn_bullets(bullet_set, preset) diff --git a/systems/bullets/spawn_patterns/spawn_pattern_stacker.gd.uid b/systems/bullets/spawn_patterns/spawn_pattern_stacker.gd.uid new file mode 100644 index 0000000..0d528a9 --- /dev/null +++ b/systems/bullets/spawn_patterns/spawn_pattern_stacker.gd.uid @@ -0,0 +1 @@ +uid://drxrjgbmeglwp diff --git a/systems/bullets/spawn_patterns/spread_pattern.gd b/systems/bullets/spawn_patterns/spread_pattern.gd new file mode 100644 index 0000000..706363c --- /dev/null +++ b/systems/bullets/spawn_patterns/spread_pattern.gd @@ -0,0 +1,27 @@ +class_name SpreadPattern +extends BulletSpawnPattern + + +## Number of bullets to spawn along the spread. +@export_range(1, 1, 1, "or_greater") var bullet_count: int +## The speed that bullets will start with. +@export var bullet_speed: float + +## Angular distance between first and last bullet. +@export_range(0.0, 360.0, 0.1, "radians_as_degrees") var spread +## Radius of the arc that bullets spawn along the edge of. +@export var radius: float +## Rotation of the entire pattern. +@export_custom(0, "radians_as_degrees") var angle_offset: float +## Rotation of each bullet's travel direction. +@export_custom(0, "radians_as_degrees") var direction_rotation: float + + +func _spawn_bullets(bullet_set: BulletSet, preset: BulletPreset) -> void: + for i in bullet_count: + var angle = remap(float(i), 0.0, float(bullet_count - 1), -spread * 0.5, spread * 0.5) + angle += angle_offset + bullet_set.spawn_rotation + var bullet = Bullet.create(preset, Vector2.from_angle(angle + direction_rotation)) + bullet.speed = bullet_speed + bullet.position = bullet_set.spawn_offset + Vector2.from_angle(angle) * radius + bullet_set.add_bullet(bullet) diff --git a/systems/bullets/spawn_patterns/spread_pattern.gd.uid b/systems/bullets/spawn_patterns/spread_pattern.gd.uid new file mode 100644 index 0000000..8a2e963 --- /dev/null +++ b/systems/bullets/spawn_patterns/spread_pattern.gd.uid @@ -0,0 +1 @@ +uid://t5lnmlng1vey