From 1e618d8cd4bbfd07fd6c9885cefcd832ade4de5b Mon Sep 17 00:00:00 2001 From: Haze Weathers Date: Sat, 3 Jan 2026 12:04:49 -0600 Subject: [PATCH 1/2] player tracking --- scenes/test_scene_haze.tscn | 22 +++++++++++++++---- ...domizer.gd => randomized_spawn_pattern.gd} | 2 +- ...gd.uid => randomized_spawn_pattern.gd.uid} | 0 ...rn_stacker.gd => stacked_spawn_pattern.gd} | 2 +- ...er.gd.uid => stacked_spawn_pattern.gd.uid} | 0 .../spawn_patterns/targetted_spawn_pattern.gd | 15 +++++++++++++ .../targetted_spawn_pattern.gd.uid | 1 + 7 files changed, 36 insertions(+), 6 deletions(-) rename systems/bullets/spawn_patterns/{spawn_pattern_randomizer.gd => randomized_spawn_pattern.gd} (96%) rename systems/bullets/spawn_patterns/{spawn_pattern_randomizer.gd.uid => randomized_spawn_pattern.gd.uid} (100%) rename systems/bullets/spawn_patterns/{spawn_pattern_stacker.gd => stacked_spawn_pattern.gd} (96%) rename systems/bullets/spawn_patterns/{spawn_pattern_stacker.gd.uid => stacked_spawn_pattern.gd.uid} (100%) create mode 100644 systems/bullets/spawn_patterns/targetted_spawn_pattern.gd create mode 100644 systems/bullets/spawn_patterns/targetted_spawn_pattern.gd.uid diff --git a/scenes/test_scene_haze.tscn b/scenes/test_scene_haze.tscn index d11d72e..b3653a9 100644 --- a/scenes/test_scene_haze.tscn +++ b/scenes/test_scene_haze.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=15 format=3 uid="uid://dxsp66qpvm65b"] +[gd_scene load_steps=19 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"] @@ -9,6 +9,8 @@ [ext_resource type="Script" uid="uid://vus1a0flwtnm" path="res://systems/bullets/bullet_preset.gd" id="6_sle1e"] [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"] +[ext_resource type="Script" uid="uid://drxrjgbmeglwp" path="res://systems/bullets/spawn_patterns/stacked_spawn_pattern.gd" id="9_c0i5a"] +[ext_resource type="Script" uid="uid://b00hsbakgtsi0" path="res://systems/bullets/spawn_patterns/targetted_spawn_pattern.gd" id="9_sle1e"] [sub_resource type="Resource" id="Resource_c0i5a"] script = ExtResource("4_4oowd") @@ -31,10 +33,22 @@ metadata/_custom_type_script = "uid://0ognvvq2ncd7" [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_etmxr"] +script = ExtResource("9_c0i5a") +pattern = SubResource("Resource_uu3sg") +stack_count = 6 +min_speed = 60.0 +max_speed = 180.0 +metadata/_custom_type_script = "uid://drxrjgbmeglwp" + +[sub_resource type="Resource" id="Resource_377ep"] +script = ExtResource("9_sle1e") +pattern = SubResource("Resource_etmxr") +metadata/_custom_type_script = "uid://b00hsbakgtsi0" + [sub_resource type="Resource" id="Resource_hxqcc"] script = ExtResource("6_sle1e") behavior = SubResource("Resource_t1bs8") @@ -42,9 +56,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_uu3sg") +pattern = SubResource("Resource_377ep") rounds = 99999999 -round_delay = 0.2 +round_delay = 0.75 metadata/_custom_type_script = "uid://vus1a0flwtnm" [node name="TestScene" type="Node"] diff --git a/systems/bullets/spawn_patterns/spawn_pattern_randomizer.gd b/systems/bullets/spawn_patterns/randomized_spawn_pattern.gd similarity index 96% rename from systems/bullets/spawn_patterns/spawn_pattern_randomizer.gd rename to systems/bullets/spawn_patterns/randomized_spawn_pattern.gd index 554628c..622be7b 100644 --- a/systems/bullets/spawn_patterns/spawn_pattern_randomizer.gd +++ b/systems/bullets/spawn_patterns/randomized_spawn_pattern.gd @@ -1,5 +1,5 @@ @tool -class_name SpawnPatternRandomizer +class_name RandomizedSpawnPattern extends BulletSpawnPattern ## Randomizes properties of a child [BulletSpawnPattern] each [member iteration]. ## diff --git a/systems/bullets/spawn_patterns/spawn_pattern_randomizer.gd.uid b/systems/bullets/spawn_patterns/randomized_spawn_pattern.gd.uid similarity index 100% rename from systems/bullets/spawn_patterns/spawn_pattern_randomizer.gd.uid rename to systems/bullets/spawn_patterns/randomized_spawn_pattern.gd.uid diff --git a/systems/bullets/spawn_patterns/spawn_pattern_stacker.gd b/systems/bullets/spawn_patterns/stacked_spawn_pattern.gd similarity index 96% rename from systems/bullets/spawn_patterns/spawn_pattern_stacker.gd rename to systems/bullets/spawn_patterns/stacked_spawn_pattern.gd index 1731443..993058a 100644 --- a/systems/bullets/spawn_patterns/spawn_pattern_stacker.gd +++ b/systems/bullets/spawn_patterns/stacked_spawn_pattern.gd @@ -1,5 +1,5 @@ @tool -class_name SpawnPatternStacker +class_name StackedSpawnPattern extends BulletSpawnPattern ## Spawns a pattern in a "stack". The pattern will be spawned multiple ## times at once with a varying [code]bullet_speed[/code]. diff --git a/systems/bullets/spawn_patterns/spawn_pattern_stacker.gd.uid b/systems/bullets/spawn_patterns/stacked_spawn_pattern.gd.uid similarity index 100% rename from systems/bullets/spawn_patterns/spawn_pattern_stacker.gd.uid rename to systems/bullets/spawn_patterns/stacked_spawn_pattern.gd.uid diff --git a/systems/bullets/spawn_patterns/targetted_spawn_pattern.gd b/systems/bullets/spawn_patterns/targetted_spawn_pattern.gd new file mode 100644 index 0000000..b893aa4 --- /dev/null +++ b/systems/bullets/spawn_patterns/targetted_spawn_pattern.gd @@ -0,0 +1,15 @@ +class_name TargettedSpawnPattern +extends BulletSpawnPattern + + +@export var pattern: BulletSpawnPattern + + +func _spawn_bullets(bullet_set: BulletSet, preset: BulletPreset) -> void: + var original_spawn_rotation = bullet_set.spawn_rotation + var player = bullet_set.get_tree().get_first_node_in_group(&"player") as Player + if player: + var local_player_pos = bullet_set.to_local(player.global_position) + bullet_set.spawn_rotation = local_player_pos.angle() + pattern.spawn_bullets(bullet_set, preset) + bullet_set.spawn_rotation = original_spawn_rotation diff --git a/systems/bullets/spawn_patterns/targetted_spawn_pattern.gd.uid b/systems/bullets/spawn_patterns/targetted_spawn_pattern.gd.uid new file mode 100644 index 0000000..e206eab --- /dev/null +++ b/systems/bullets/spawn_patterns/targetted_spawn_pattern.gd.uid @@ -0,0 +1 @@ +uid://b00hsbakgtsi0 From abd45d7d649e0f9683123e47fb519024599057c5 Mon Sep 17 00:00:00 2001 From: Haze Weathers Date: Sat, 3 Jan 2026 12:34:28 -0600 Subject: [PATCH 2/2] the boss! --- .../normal_bullet/test_bullet_strip.tres | 11 + .../test_bullet_strip_overlay.tres | 11 + objects/bosses/tesu/tesu.tscn | 273 ++++++++++++++++++ objects/bosses/{tesu.gd => tesu_old.gd} | 0 .../bosses/{tesu.gd.uid => tesu_old.gd.uid} | 0 objects/bosses/{tesu.tscn => tesu_old.tscn} | 2 +- scenes/1d_vslice.tscn | 2 +- scenes/new_vslice.tscn | 30 ++ systems/boss/boss.gd | 34 +++ systems/boss/boss.gd.uid | 1 + systems/boss/boss_phase.gd | 62 ++++ systems/boss/boss_phase.gd.uid | 1 + systems/bullets/danmaku_emitter.gd | 19 ++ systems/bullets/danmaku_emitter.gd.uid | 1 + 14 files changed, 445 insertions(+), 2 deletions(-) create mode 100644 graphics/bullets/normal_bullet/test_bullet_strip.tres create mode 100644 graphics/bullets/normal_bullet/test_bullet_strip_overlay.tres create mode 100644 objects/bosses/tesu/tesu.tscn rename objects/bosses/{tesu.gd => tesu_old.gd} (100%) rename objects/bosses/{tesu.gd.uid => tesu_old.gd.uid} (100%) rename objects/bosses/{tesu.tscn => tesu_old.tscn} (99%) create mode 100644 scenes/new_vslice.tscn create mode 100644 systems/boss/boss.gd create mode 100644 systems/boss/boss.gd.uid create mode 100644 systems/boss/boss_phase.gd create mode 100644 systems/boss/boss_phase.gd.uid create mode 100644 systems/bullets/danmaku_emitter.gd create mode 100644 systems/bullets/danmaku_emitter.gd.uid diff --git a/graphics/bullets/normal_bullet/test_bullet_strip.tres b/graphics/bullets/normal_bullet/test_bullet_strip.tres new file mode 100644 index 0000000..6aa820d --- /dev/null +++ b/graphics/bullets/normal_bullet/test_bullet_strip.tres @@ -0,0 +1,11 @@ +[gd_resource type="Resource" script_class="AnimationStrip" load_steps=3 format=3 uid="uid://d4nwqsr1tyguc"] + +[ext_resource type="Script" uid="uid://0ognvvq2ncd7" path="res://systems/visuals/animation_strip.gd" id="1_s564h"] +[ext_resource type="Texture2D" uid="uid://c21fe72aym3fe" path="res://graphics/bullets/normal_bullet/test_bullet.png" id="2_w8fao"] + +[resource] +script = ExtResource("1_s564h") +texture = ExtResource("2_w8fao") +frames = 2 +fps = 10.0 +metadata/_custom_type_script = "uid://0ognvvq2ncd7" diff --git a/graphics/bullets/normal_bullet/test_bullet_strip_overlay.tres b/graphics/bullets/normal_bullet/test_bullet_strip_overlay.tres new file mode 100644 index 0000000..7001887 --- /dev/null +++ b/graphics/bullets/normal_bullet/test_bullet_strip_overlay.tres @@ -0,0 +1,11 @@ +[gd_resource type="Resource" script_class="AnimationStrip" load_steps=3 format=3 uid="uid://comjbd70kctg8"] + +[ext_resource type="Script" uid="uid://0ognvvq2ncd7" path="res://systems/visuals/animation_strip.gd" id="1_8q4ym"] +[ext_resource type="Texture2D" uid="uid://cgqgb84k38tbe" path="res://graphics/bullets/normal_bullet/test_bullet_overlay.png" id="2_mrles"] + +[resource] +script = ExtResource("1_8q4ym") +texture = ExtResource("2_mrles") +frames = 2 +fps = 10.0 +metadata/_custom_type_script = "uid://0ognvvq2ncd7" diff --git a/objects/bosses/tesu/tesu.tscn b/objects/bosses/tesu/tesu.tscn new file mode 100644 index 0000000..2f1ab7f --- /dev/null +++ b/objects/bosses/tesu/tesu.tscn @@ -0,0 +1,273 @@ +[gd_scene load_steps=34 format=3 uid="uid://bsgqhb8qak75u"] + +[ext_resource type="Script" uid="uid://b6ae108uhk7hk" path="res://systems/boss/boss.gd" id="1_8sblh"] +[ext_resource type="Script" uid="uid://nyslrh651s8u" path="res://systems/boss/boss_phase.gd" id="2_vnn1v"] +[ext_resource type="AudioStream" uid="uid://dwffpsx7xlfla" path="res://audio/sounds/boss_hit.ogg" id="3_vnhju"] +[ext_resource type="Texture2D" uid="uid://y0c5cddwa216" path="res://graphics/boss_sprites/tesu.png" id="3_vnn1v"] +[ext_resource type="Script" uid="uid://df8w64703kw0c" path="res://systems/bullets/danmaku_emitter.gd" id="4_duqw0"] +[ext_resource type="Script" uid="uid://vus1a0flwtnm" path="res://systems/bullets/bullet_preset.gd" id="5_aka0y"] +[ext_resource type="Resource" uid="uid://d4nwqsr1tyguc" path="res://graphics/bullets/normal_bullet/test_bullet_strip.tres" id="6_3hyls"] +[ext_resource type="Script" uid="uid://0ognvvq2ncd7" path="res://systems/visuals/animation_strip.gd" id="6_aka0y"] +[ext_resource type="Script" uid="uid://dntp60my5f65m" path="res://systems/bullets/bullet_behaviors/linear_motion_behavior.gd" id="7_vnhju"] +[ext_resource type="Resource" uid="uid://comjbd70kctg8" path="res://graphics/bullets/normal_bullet/test_bullet_strip_overlay.tres" id="8_vnhju"] +[ext_resource type="Script" uid="uid://dtuc6qerbfset" path="res://systems/bullets/spawn_patterns/ring_pattern.gd" id="9_3hyls"] +[ext_resource type="Script" uid="uid://ckedfcjjnv7dq" path="res://systems/bullets/spawn_patterns/randomized_spawn_pattern.gd" id="10_7bpd6"] +[ext_resource type="Script" uid="uid://t5lnmlng1vey" path="res://systems/bullets/spawn_patterns/spread_pattern.gd" id="13_7bpd6"] +[ext_resource type="Script" uid="uid://drxrjgbmeglwp" path="res://systems/bullets/spawn_patterns/stacked_spawn_pattern.gd" id="14_jr3ht"] +[ext_resource type="Script" uid="uid://b00hsbakgtsi0" path="res://systems/bullets/spawn_patterns/targetted_spawn_pattern.gd" id="15_hqscp"] + +[sub_resource type="Animation" id="Animation_3hyls"] +resource_name = "midway_left" +length = 7.0 +loop_mode = 1 +step = 0.25 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath(".:position") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 1, 2.5, 3, 4, 5, 6.5), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1), +"update": 0, +"values": [Vector2(120, 80), Vector2(40, 80), Vector2(40, 80), Vector2(120, 80), Vector2(120, 80), Vector2(200, 80), Vector2(200, 80)] +} + +[sub_resource type="Animation" id="Animation_vnhju"] +length = 0.001 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath(".:position") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(120, 80)] +} + +[sub_resource type="Animation" id="Animation_16jkj"] +resource_name = "pinch" +length = 8.0 +loop_mode = 1 +step = 0.25 +capture_included = true +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath(".:position") +tracks/0/interp = 2 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 4), +"transitions": PackedFloat32Array(1, 1), +"update": 2, +"values": [Vector2(40, 80), Vector2(200, 80)] +} + +[sub_resource type="AnimationLibrary" id="AnimationLibrary_16jkj"] +_data = { +&"RESET": SubResource("Animation_vnhju"), +&"midway_left": SubResource("Animation_3hyls"), +&"pinch": SubResource("Animation_16jkj") +} + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_vnn1v"] +size = Vector2(36, 36) + +[sub_resource type="Resource" id="Resource_hqscp"] +script = ExtResource("7_vnhju") +metadata/_custom_type_script = "uid://dntp60my5f65m" + +[sub_resource type="Resource" id="Resource_vnhju"] +script = ExtResource("9_3hyls") +bullet_count = 1 +bullet_speed = 120.0 +metadata/_custom_type_script = "uid://dtuc6qerbfset" + +[sub_resource type="Resource" id="Resource_lp5hl"] +script = ExtResource("10_7bpd6") +pattern = SubResource("Resource_vnhju") +property_min_values = Dictionary[StringName, float]({ +&"angle_offset": 0.0 +}) +property_max_values = Dictionary[StringName, float]({ +&"angle_offset": 6.283 +}) +iterations = 50 +metadata/_custom_type_script = "uid://ckedfcjjnv7dq" + +[sub_resource type="Resource" id="Resource_4tcmc"] +script = ExtResource("5_aka0y") +behavior = SubResource("Resource_hqscp") +hitbox_size = Vector2i(6, 6) +base_graphics = Array[ExtResource("6_aka0y")]([ExtResource("6_3hyls")]) +overlay_graphics = Array[ExtResource("6_aka0y")]([ExtResource("8_vnhju")]) +colors = Array[Color]([Color(1, 0, 0, 1), Color(0, 1, 0, 1), Color(0, 0, 1, 1), Color(1, 1, 0, 1)]) +pattern = SubResource("Resource_lp5hl") +metadata/_custom_type_script = "uid://vus1a0flwtnm" + +[sub_resource type="Resource" id="Resource_16jkj"] +script = ExtResource("7_vnhju") +acceleration = 80.0 +metadata/_custom_type_script = "uid://dntp60my5f65m" + +[sub_resource type="Resource" id="Resource_3hyls"] +script = ExtResource("9_3hyls") +radius = 16.0 +direction_rotation = 3.6651914291880923 +metadata/_custom_type_script = "uid://dtuc6qerbfset" + +[sub_resource type="Resource" id="Resource_7bpd6"] +script = ExtResource("10_7bpd6") +pattern = SubResource("Resource_3hyls") +property_min_values = Dictionary[StringName, float]({ +&"angle_offset": 0.0 +}) +property_max_values = Dictionary[StringName, float]({ +&"angle_offset": 6.283 +}) +iterations = 10 +metadata/_custom_type_script = "uid://ckedfcjjnv7dq" + +[sub_resource type="Resource" id="Resource_5v8uu"] +script = ExtResource("5_aka0y") +behavior = SubResource("Resource_16jkj") +hitbox_size = Vector2i(6, 6) +base_graphics = Array[ExtResource("6_aka0y")]([ExtResource("6_3hyls")]) +overlay_graphics = Array[ExtResource("6_aka0y")]([ExtResource("8_vnhju")]) +colors = Array[Color]([Color(1, 0, 1, 1), Color(0, 1, 1, 1), Color(1, 1, 1, 1)]) +pattern = SubResource("Resource_7bpd6") +metadata/_custom_type_script = "uid://vus1a0flwtnm" + +[sub_resource type="Resource" id="Resource_jr3ht"] +script = ExtResource("7_vnhju") +metadata/_custom_type_script = "uid://dntp60my5f65m" + +[sub_resource type="Resource" id="Resource_vbmnr"] +script = ExtResource("13_7bpd6") +bullet_count = 3 +spread = 1.0471975511965976 +metadata/_custom_type_script = "uid://t5lnmlng1vey" + +[sub_resource type="Resource" id="Resource_wmp00"] +script = ExtResource("14_jr3ht") +pattern = SubResource("Resource_vbmnr") +stack_count = 6 +min_speed = 60.0 +max_speed = 160.0 +metadata/_custom_type_script = "uid://drxrjgbmeglwp" + +[sub_resource type="Resource" id="Resource_fouyt"] +script = ExtResource("15_hqscp") +pattern = SubResource("Resource_wmp00") +metadata/_custom_type_script = "uid://b00hsbakgtsi0" + +[sub_resource type="Resource" id="Resource_0243l"] +script = ExtResource("5_aka0y") +behavior = SubResource("Resource_jr3ht") +hitbox_size = Vector2i(6, 6) +base_graphics = Array[ExtResource("6_aka0y")]([ExtResource("6_3hyls")]) +overlay_graphics = Array[ExtResource("6_aka0y")]([ExtResource("8_vnhju")]) +colors = Array[Color]([Color(1, 0, 0, 1), Color(1, 1, 0, 1), Color(1, 0.49803922, 0, 1)]) +pattern = SubResource("Resource_fouyt") +metadata/_custom_type_script = "uid://vus1a0flwtnm" + +[node name="Tesu" type="Node2D" node_paths=PackedStringArray("first_phase")] +script = ExtResource("1_8sblh") +first_phase = NodePath("Phases/Still") +metadata/_custom_type_script = "uid://b6ae108uhk7hk" + +[node name="Phases" type="Node" parent="."] + +[node name="Still" type="Node" parent="Phases" node_paths=PackedStringArray("next_phase")] +script = ExtResource("2_vnn1v") +hp = 200 +next_phase = NodePath("../MidwayLeft") +metadata/_custom_type_script = "uid://nyslrh651s8u" + +[node name="MidwayLeft" type="Node" parent="Phases" node_paths=PackedStringArray("next_phase")] +script = ExtResource("2_vnn1v") +hp = 100 +next_phase = NodePath("../Pinch") +metadata/_custom_type_script = "uid://nyslrh651s8u" + +[node name="Pinch" type="Node" parent="Phases"] +script = ExtResource("2_vnn1v") +hp = 100 +metadata/_custom_type_script = "uid://nyslrh651s8u" + +[node name="Sounds" type="Node" parent="."] + +[node name="HurtSound" type="AudioStreamPlayer" parent="Sounds"] +unique_name_in_owner = true +stream = ExtResource("3_vnhju") +max_polyphony = 8 + +[node name="Body" type="Node2D" parent="."] +position = Vector2(120, 80) + +[node name="Movements" type="AnimationPlayer" parent="Body"] +libraries = { +&"": SubResource("AnimationLibrary_16jkj") +} +blend_times = [&"midway_left", &"pinch", 2.0] + +[node name="Graphic" type="Sprite2D" parent="Body"] +texture = ExtResource("3_vnn1v") + +[node name="PlayerBulletDetector" type="Area2D" parent="Body"] +collision_layer = 0 +collision_mask = 4 +monitorable = false + +[node name="CollisionShape2D" type="CollisionShape2D" parent="Body/PlayerBulletDetector"] +shape = SubResource("RectangleShape2D_vnn1v") + +[node name="BasicRandomSpread" type="Node2D" parent="Body" node_paths=PackedStringArray("spawn_parent")] +script = ExtResource("4_duqw0") +spawn_parent = NodePath("../../Bullets") +preset = SubResource("Resource_4tcmc") +metadata/_custom_type_script = "uid://df8w64703kw0c" + +[node name="SpawnRandomBasic" type="Timer" parent="Body/BasicRandomSpread"] +process_callback = 0 +wait_time = 0.5 + +[node name="MidwayMadness" type="Node2D" parent="Body" node_paths=PackedStringArray("spawn_parent")] +script = ExtResource("4_duqw0") +spawn_parent = NodePath("../../Bullets") +preset = SubResource("Resource_5v8uu") +metadata/_custom_type_script = "uid://df8w64703kw0c" + +[node name="SpawnMidwayMadness" type="Timer" parent="Body/MidwayMadness"] +process_callback = 0 +wait_time = 0.5 + +[node name="Pinch" type="Node2D" parent="Body" node_paths=PackedStringArray("spawn_parent")] +script = ExtResource("4_duqw0") +spawn_parent = NodePath("../../Bullets") +preset = SubResource("Resource_0243l") +metadata/_custom_type_script = "uid://df8w64703kw0c" + +[node name="SpawnPinch" type="Timer" parent="Body/Pinch"] +process_callback = 0 +wait_time = 0.75 + +[node name="Bullets" type="Node2D" parent="."] + +[connection signal="damaged" from="." to="Sounds/HurtSound" method="play" unbinds=1] +[connection signal="ended" from="Phases/Still" to="Body/BasicRandomSpread/SpawnRandomBasic" method="stop"] +[connection signal="started" from="Phases/Still" to="Body/BasicRandomSpread/SpawnRandomBasic" method="start"] +[connection signal="ended" from="Phases/MidwayLeft" to="Body/MidwayMadness/SpawnMidwayMadness" method="stop"] +[connection signal="started" from="Phases/MidwayLeft" to="Body/MidwayMadness/SpawnMidwayMadness" method="start"] +[connection signal="started" from="Phases/MidwayLeft" to="Body/Movements" method="play" binds= [&"midway_left"]] +[connection signal="started" from="Phases/Pinch" to="Body/Pinch/SpawnPinch" method="start"] +[connection signal="started" from="Phases/Pinch" to="Body/Movements" method="play" binds= [&"pinch"]] +[connection signal="area_entered" from="Body/PlayerBulletDetector" to="." method="hurt" unbinds=1] +[connection signal="timeout" from="Body/BasicRandomSpread/SpawnRandomBasic" to="Body/BasicRandomSpread" method="spawn_preset"] +[connection signal="timeout" from="Body/MidwayMadness/SpawnMidwayMadness" to="Body/MidwayMadness" method="spawn_preset"] +[connection signal="timeout" from="Body/Pinch/SpawnPinch" to="Body/Pinch" method="spawn_preset"] diff --git a/objects/bosses/tesu.gd b/objects/bosses/tesu_old.gd similarity index 100% rename from objects/bosses/tesu.gd rename to objects/bosses/tesu_old.gd diff --git a/objects/bosses/tesu.gd.uid b/objects/bosses/tesu_old.gd.uid similarity index 100% rename from objects/bosses/tesu.gd.uid rename to objects/bosses/tesu_old.gd.uid diff --git a/objects/bosses/tesu.tscn b/objects/bosses/tesu_old.tscn similarity index 99% rename from objects/bosses/tesu.tscn rename to objects/bosses/tesu_old.tscn index 24f3b0c..af84815 100644 --- a/objects/bosses/tesu.tscn +++ b/objects/bosses/tesu_old.tscn @@ -1,6 +1,6 @@ [gd_scene load_steps=14 format=3 uid="uid://b1rm2x7lofhkm"] -[ext_resource type="Script" uid="uid://cv578r7dikm6r" path="res://objects/bosses/tesu.gd" id="1_aikw2"] +[ext_resource type="Script" uid="uid://cv578r7dikm6r" path="res://objects/bosses/tesu_old.gd" id="1_aikw2"] [ext_resource type="Texture2D" uid="uid://y0c5cddwa216" path="res://graphics/boss_sprites/tesu.png" id="1_h31ol"] [ext_resource type="AudioStream" uid="uid://dwffpsx7xlfla" path="res://audio/sounds/boss_hit.ogg" id="3_aikw2"] [ext_resource type="PackedScene" uid="uid://cciq2vk8sex8w" path="res://objects/bullet_emitter/test_bullet_emitter.tscn" id="4_jhpyq"] diff --git a/scenes/1d_vslice.tscn b/scenes/1d_vslice.tscn index 4a50585..f0d387e 100644 --- a/scenes/1d_vslice.tscn +++ b/scenes/1d_vslice.tscn @@ -3,7 +3,7 @@ [ext_resource type="PackedScene" uid="uid://q2fys6o0jy6w" path="res://objects/starfield/starfield.tscn" id="1_gl3rp"] [ext_resource type="Texture2D" uid="uid://cokpdf3gw10kr" path="res://space.png" id="2_nv70j"] [ext_resource type="PackedScene" uid="uid://c714s5d7d5765" path="res://objects/player/player.tscn" id="3_fyu15"] -[ext_resource type="PackedScene" uid="uid://b1rm2x7lofhkm" path="res://objects/bosses/tesu.tscn" id="4_0cr18"] +[ext_resource type="PackedScene" uid="uid://b1rm2x7lofhkm" path="res://objects/bosses/tesu_old.tscn" id="4_0cr18"] [ext_resource type="AudioStream" uid="uid://dftw8ufcgjbft" path="res://audio/music/04 - Stage 2 (Purple Sea).mp3" id="5_yu621"] [sub_resource type="RectangleShape2D" id="RectangleShape2D_ikr60"] diff --git a/scenes/new_vslice.tscn b/scenes/new_vslice.tscn new file mode 100644 index 0000000..1404704 --- /dev/null +++ b/scenes/new_vslice.tscn @@ -0,0 +1,30 @@ +[gd_scene load_steps=5 format=3 uid="uid://cvuaxqqm3sfiw"] + +[ext_resource type="PackedScene" uid="uid://q2fys6o0jy6w" path="res://objects/starfield/starfield.tscn" id="1_2jclk"] +[ext_resource type="PackedScene" uid="uid://c714s5d7d5765" path="res://objects/player/player.tscn" id="2_gadir"] +[ext_resource type="AudioStream" uid="uid://dftw8ufcgjbft" path="res://audio/music/04 - Stage 2 (Purple Sea).mp3" id="2_oxyio"] +[ext_resource type="PackedScene" uid="uid://bsgqhb8qak75u" path="res://objects/bosses/tesu/tesu.tscn" id="3_i608b"] + +[node name="TestScene" type="Node"] + +[node name="Background" type="CanvasLayer" parent="."] +layer = -10 + +[node name="Starfield" type="SubViewportContainer" parent="Background"] +offset_right = 240.0 +offset_bottom = 320.0 + +[node name="SubViewport" parent="Background/Starfield" instance=ExtResource("1_2jclk")] +size = Vector2i(240, 320) + +[node name="Music" type="AudioStreamPlayer" parent="."] +stream = ExtResource("2_oxyio") +autoplay = true +parameters/looping = true + +[node name="Player" parent="." instance=ExtResource("2_gadir")] +position = Vector2(122, 283) + +[node name="Tesu" parent="." instance=ExtResource("3_i608b")] + +[connection signal="defeated" from="Tesu" to="Tesu" method="queue_free"] diff --git a/systems/boss/boss.gd b/systems/boss/boss.gd new file mode 100644 index 0000000..bda0ad3 --- /dev/null +++ b/systems/boss/boss.gd @@ -0,0 +1,34 @@ +class_name Boss +extends Node2D + + +signal damaged(damage: int) +signal defeated() + + +@export var first_phase: BossPhase + + +var current_phase: BossPhase + + +func _ready() -> void: + if first_phase: + current_phase = first_phase + current_phase.ended.connect(_on_phase_ended, CONNECT_ONE_SHOT) + first_phase.start_phase() + + +func hurt(damage: int = 1) -> void: + if current_phase: + CurrentGame.change_score(100) + current_phase.hurt(damage) + damaged.emit(damage) + + +func _on_phase_ended() -> void: + current_phase = current_phase.next_phase + if current_phase: + current_phase.ended.connect(_on_phase_ended, CONNECT_ONE_SHOT) + else: + defeated.emit() diff --git a/systems/boss/boss.gd.uid b/systems/boss/boss.gd.uid new file mode 100644 index 0000000..0801730 --- /dev/null +++ b/systems/boss/boss.gd.uid @@ -0,0 +1 @@ +uid://b6ae108uhk7hk diff --git a/systems/boss/boss_phase.gd b/systems/boss/boss_phase.gd new file mode 100644 index 0000000..20fbb2f --- /dev/null +++ b/systems/boss/boss_phase.gd @@ -0,0 +1,62 @@ +class_name BossPhase +extends Node + + +signal started() +signal ended() +signal damaged(damage: int) + + +## Amount of HP this boss stage has. If 0, the boss is invulnerable during +## this phase and must survive until time runs out or [method end_phase] is called. +@export_range(0, 1, 1, "or_greater") var hp: int = 0 +## "Survival Time" of the phase. The phase will end when time is up, whether +## HP has been depleted or not. +@export_range(0.0, 1.0, 0.01, "or_greater", "suffix:s") var time: float = INF + +## The phase to automatically proceed to when this phase ends. +@export var next_phase: BossPhase + + +## [code]true[/code] if the phase is currently active. +var active: bool = false + + +var hp_left: int: + set(value): + hp_left = value + if active and hp_left <= 0 and hp > 0: + end_phase() + +var time_left: float = INF: + set(value): + time_left = value + if active and time_left <= 0.0: + end_phase() + + +func _physics_process(delta: float) -> void: + if active: + time_left -= delta + + +func start_phase() -> void: + if not active: + hp_left = hp + time_left = time + active = true + started.emit() + + +func end_phase() -> void: + if active: + active = false + ended.emit() + if next_phase: + next_phase.start_phase() + + +func hurt(damage: int) -> void: + if active: + hp_left = maxi(0, hp_left - damage) + damaged.emit(damage) diff --git a/systems/boss/boss_phase.gd.uid b/systems/boss/boss_phase.gd.uid new file mode 100644 index 0000000..edb0336 --- /dev/null +++ b/systems/boss/boss_phase.gd.uid @@ -0,0 +1 @@ +uid://nyslrh651s8u diff --git a/systems/bullets/danmaku_emitter.gd b/systems/bullets/danmaku_emitter.gd new file mode 100644 index 0000000..d4d1025 --- /dev/null +++ b/systems/bullets/danmaku_emitter.gd @@ -0,0 +1,19 @@ +class_name DanmakuEmitter +extends Node2D + + +@export var spawn_parent: Node2D +@export var preset: BulletPreset + + +func spawn_preset() -> void: + var bullet_set = BulletSet.new() + bullet_set.preset = preset + bullet_set.global_position = global_position + bullet_set.global_rotation = global_rotation + spawn_parent.add_child(bullet_set) + + +func clear_bullets() -> void: + for child in spawn_parent.get_children(): + child.queue_free() diff --git a/systems/bullets/danmaku_emitter.gd.uid b/systems/bullets/danmaku_emitter.gd.uid new file mode 100644 index 0000000..9cbfdc1 --- /dev/null +++ b/systems/bullets/danmaku_emitter.gd.uid @@ -0,0 +1 @@ +uid://df8w64703kw0c