Monsters are now unkillable and fire a fixed bullet pattern; add periodic lasers

Removed the stomp-kill from walker.gd: landing on an enemy now just costs a heart like any other contact, so the only way past is to weave through the pattern or use the key throw + W warp. Enemies fire a fan of bullets every fire_interval whose directions are computed only from the facing and the exported spread, never from the player, so every volley traces the identical path and can be memorised. Bullets are code-generated circles (no art needed), die on hitting terrain via a probe raycast, and are freed after their lifetime. New laser prefab cycles wait -> blinking warmup -> firing, and only damages during the firing phase.
This commit is contained in:
2026-10-07 22:12:14 +08:00
parent 74e4bd1e97
commit 0d2bccc3a9
7 changed files with 271 additions and 43 deletions
+18 -7
View File
@@ -18,6 +18,7 @@
[ext_resource type="PackedScene" path="res://scenes/prefabs/collectibles/key_gold.tscn" id="16_3xffc"]
[ext_resource type="PackedScene" path="res://scenes/prefabs/collectibles/diamond.tscn" id="17_icuov"]
[ext_resource type="PackedScene" path="res://scenes/prefabs/enemies/walker.tscn" id="18_walker"]
[ext_resource type="PackedScene" path="res://scenes/prefabs/enemies/laser.tscn" id="19_laser"]
[node name="Main" type="Node2D" unique_id=2061129075]
@@ -167,7 +168,7 @@ tile_set = ExtResource("9_nflru")
[node name="TerrainDetailsA" type="TileMapLayer" parent="Level/TerrainTileMaps" unique_id=1513560262]
z_index = 1
position = Vector2(9, 9)
tile_map_data = PackedByteArray("AAADAA0AAAADAAYAAAABAAwAAAABAAYAAAABAA0AAAABAAYAAAACAAoAAAAIAAYAAAACAAsAAAACAAEAAAADAAsAAAADAAEAAAACAAwAAAACAAYAAAACAA4AAAACAAYAAAAXAAsAAAADAAUAAAAXAAwAAAADAAYAAAAXAA0AAAADAAYAAAAXAA4AAAADAAYAAAAWAAoAAAAEAAcAAAAWAAsAAAACAAUAAAAWAAwAAAAEAAUAAAAWAA0AAAACAAYAAAAWAA4AAAAEAAUAAAAVAAsAAAABAAUAAAAVAAwAAAABAAYAAAAVAA0AAAABAAYAAAAVAA4AAAABAAYAAAAQAA4AAAADAAYAAAAOAA4AAAAEAAUAAAAPAA4AAAACAAYAAAAQAA0AAAADAAMAAAANAA4AAAABAAYAAAAOAAwAAAAEAAYAAAAPAA0AAAACAAMAAAAOAA0AAAACAAMAAAANAA0AAAABAAMAAAAQAAQAAAATAAIAAAAQAAMAAAATAAEAAAAPAAQAAAASAAIAAAAKAAMAAAARAAAAAAAKAAQAAAARAAIAAAALAAMAAAASAAAAAAAMAAMAAAATAAAAAAAOAAIAAAARAAAAAAAPAAIAAAASAAAAAAAOAAMAAAARAAEAAAAMAAQAAAATAAIAAAALAAQAAAASAAIAAAADAAwAAAADAAYAAAAOAAQAAAARAAIAAAAPAAMAAAASAAEAAAAQAAIAAAATAAAAAAACAA0AAAAEAAUAAAABAA4AAAABAAYAAAADAA4AAAADAAYAAAABAAsAAAABAAEAAAAOAAsAAAANAAUAAAAOAAoAAAAPAAUAAAAPAAsAAAANAAYAAAAPAAkAAAANAAYAAAAOAAkAAAANAAQAAAAQAAkAAAAOAAQAAAAQAAoAAAAPAAUAAAAQAAsAAAAOAAUAAAAPAAoAAAASAAcAAAAPAAgAAAAIAAMAAAAUAPz/AAASAAcAAAA=")
tile_map_data = PackedByteArray("AAADAA0AAAADAAYAAAABAAwAAAABAAYAAAABAA0AAAABAAYAAAACAAsAAAACAAEAAAADAAsAAAADAAEAAAACAAwAAAACAAYAAAACAA4AAAACAAYAAAAXAAsAAAADAAUAAAAXAAwAAAADAAYAAAAXAA0AAAADAAYAAAAXAA4AAAADAAYAAAAWAAoAAAAEAAcAAAAWAAsAAAACAAUAAAAWAAwAAAAEAAUAAAAWAA0AAAACAAYAAAAWAA4AAAAEAAUAAAAVAAsAAAABAAUAAAAVAAwAAAABAAYAAAAVAA0AAAABAAYAAAAVAA4AAAABAAYAAAAQAA4AAAADAAYAAAAOAA4AAAAEAAUAAAAPAA4AAAACAAYAAAAQAA0AAAADAAMAAAANAA4AAAABAAYAAAAOAAwAAAAEAAYAAAAPAA0AAAACAAMAAAAOAA0AAAACAAMAAAANAA0AAAABAAMAAAAQAAQAAAATAAIAAAAQAAMAAAATAAEAAAAPAAQAAAASAAIAAAAKAAMAAAARAAAAAAAKAAQAAAARAAIAAAALAAMAAAASAAAAAAAMAAMAAAATAAAAAAAOAAIAAAARAAAAAAAPAAIAAAASAAAAAAAOAAMAAAARAAEAAAAMAAQAAAATAAIAAAALAAQAAAASAAIAAAADAAwAAAADAAYAAAAOAAQAAAARAAIAAAAPAAMAAAASAAEAAAAQAAIAAAATAAAAAAACAA0AAAAEAAUAAAABAA4AAAABAAYAAAADAA4AAAADAAYAAAABAAsAAAABAAEAAAAUAPz/AAASAAcAAAA=")
tile_set = ExtResource("9_nflru")
[node name="TerrainDetailsB" type="TileMapLayer" parent="Level/TerrainTileMaps" unique_id=478648603]
@@ -206,19 +207,29 @@ position = Vector2(109, 199)
z_index = 5
position = Vector2(331, 216)
[node name="Enemies" type="Node2D" parent="Level/PrefabInstances"]
[node name="Enemies" type="Node2D" parent="Level/PrefabInstances" unique_id=93211253]
[node name="Walker_01" parent="Level/PrefabInstances/Enemies" instance=ExtResource("18_walker")]
[node name="Walker_01" parent="Level/PrefabInstances/Enemies" unique_id=2100888628 instance=ExtResource("18_walker")]
position = Vector2(216, 216)
[node name="Walker_02" parent="Level/PrefabInstances/Enemies" instance=ExtResource("18_walker")]
[node name="Walker_02" parent="Level/PrefabInstances/Enemies" unique_id=1806208529 instance=ExtResource("18_walker")]
position = Vector2(306, 216)
start_direction = 1
[node name="Walker_03" parent="Level/PrefabInstances/Enemies" instance=ExtResource("18_walker")]
[node name="Walker_03" parent="Level/PrefabInstances/Enemies" unique_id=1711052130 instance=ExtResource("18_walker")]
position = Vector2(90, 198)
start_direction = 1
[node name="Laser_01" parent="Level/PrefabInstances/Enemies" instance=ExtResource("19_laser")]
position = Vector2(189, 216)
rotation = -1.5707964
[node name="Laser_02" parent="Level/PrefabInstances/Enemies" instance=ExtResource("19_laser")]
position = Vector2(297, 216)
rotation = -1.5707964
start_delay = 2.4
length = 108.0
[node name="Interactables" type="Node2D" parent="Level/PrefabInstances" unique_id=769532488]
[node name="SpringRed_01" parent="Level/PrefabInstances/Interactables" unique_id=34192139 instance=ExtResource("13_ac7c3")]
@@ -246,7 +257,7 @@ position = Vector2(219, 54)
[node name="KeyGold_01" parent="Level/PrefabInstances/Collectibles" unique_id=2060959680 instance=ExtResource("16_3xffc")]
z_index = 5
position = Vector2(126, 144)
position = Vector2(71, 182)
[node name="Diamond_01" parent="Level/PrefabInstances/Collectibles" unique_id=909237898 instance=ExtResource("17_icuov")]
z_index = 5
@@ -258,6 +269,6 @@ position = Vector2(204, 217)
[node name="Diamond_03" parent="Level/PrefabInstances/Collectibles" unique_id=1261326529 instance=ExtResource("17_icuov")]
z_index = 5
position = Vector2(270, 144)
position = Vector2(288, 125)
[node name="Signs" type="Node2D" parent="Level/PrefabInstances" unique_id=113197076]
+21
View File
@@ -0,0 +1,21 @@
[gd_scene load_steps=4 format=3]
[ext_resource type="Script" path="res://scripts/bullet.gd" id="1_bullet"]
[sub_resource type="CircleShape2D" id="Shape_bullet"]
radius = 3.0
[node name="Bullet" type="Area2D" groups=["bullet"]]
collision_layer = 4
collision_mask = 2
script = ExtResource("1_bullet")
[node name="Sprite" type="Sprite2D" parent="."]
texture_filter = 1
[node name="HitBox" type="CollisionShape2D" parent="."]
shape = SubResource("Shape_bullet")
[node name="Probe" type="RayCast2D" parent="."]
collision_mask = 1
target_position = Vector2(-12, 0)
+19
View File
@@ -0,0 +1,19 @@
[gd_scene load_steps=3 format=3]
[ext_resource type="Script" path="res://scripts/laser.gd" id="1_laser"]
[sub_resource type="RectangleShape2D" id="Shape_laser"]
size = Vector2(90, 6)
[node name="Laser" type="Area2D" groups=["hazard"]]
collision_layer = 4
collision_mask = 2
script = ExtResource("1_laser")
[node name="Beam" type="Polygon2D" parent="."]
color = Color(1, 0.25, 0.25, 1)
polygon = PackedVector2Array(0, -3, 90, -3, 90, 3, 0, 3)
[node name="HitBox" type="CollisionShape2D" parent="."]
position = Vector2(45, 0)
shape = SubResource("Shape_laser")