From 408fbb40e36adcbbb3ace8aa842efa01a94f851d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Melvin=20Wei=C3=9F?= Date: Tue, 23 Sep 2025 15:10:45 +0200 Subject: [PATCH] Modified Damage Behavior and Item Spawn Rate --- enemies/boss/boss.tscn | 1 + enemies/ghost/ghost.gd | 2 +- enemies/leech/giant_leech.tscn | 7 ++- enemies/leech/leech.gd | 34 +++++--------- enemies/leech/leech.tscn | 7 ++- enemies/leech/leech.tscn12453991835.tmp | 61 +++++++++++++++++++++++++ enemies/leech/leech.tscn12459859161.tmp | 61 +++++++++++++++++++++++++ enemies/leech/leech.tscn12471665304.tmp | 61 +++++++++++++++++++++++++ enemies/leech/segment.gd | 7 +-- enemies/leech/segment.tscn | 2 +- items/generic/item_spawn.tscn | 4 +- utils/enemy_hurtbox.gd | 8 ++-- 12 files changed, 218 insertions(+), 37 deletions(-) create mode 100644 enemies/leech/leech.tscn12453991835.tmp create mode 100644 enemies/leech/leech.tscn12459859161.tmp create mode 100644 enemies/leech/leech.tscn12471665304.tmp diff --git a/enemies/boss/boss.tscn b/enemies/boss/boss.tscn index ede2b73..d233d97 100644 --- a/enemies/boss/boss.tscn +++ b/enemies/boss/boss.tscn @@ -34,6 +34,7 @@ collision_layer = 16 collision_mask = 32 max_hp = 800 canvasItem = NodePath("..") +id_block_time = 5.0 [node name="CollisionShape2D" type="CollisionShape2D" parent="EnemyHurtbox"] rotation = 1.5708 diff --git a/enemies/ghost/ghost.gd b/enemies/ghost/ghost.gd index 119d714..453cdc7 100644 --- a/enemies/ghost/ghost.gd +++ b/enemies/ghost/ghost.gd @@ -41,6 +41,6 @@ func _on_death(): await $AudioStreamPlayer2D.finished self.queue_free() -func _on_damage_taken(_damage : int, dir: Vector2): +func _on_damage_taken(_damage : int, dir: Vector2, _id): current_knockback = - dir * knockback_weight $AudioStreamPlayer2D.play() diff --git a/enemies/leech/giant_leech.tscn b/enemies/leech/giant_leech.tscn index 161b69b..c1e4da2 100644 --- a/enemies/leech/giant_leech.tscn +++ b/enemies/leech/giant_leech.tscn @@ -9,11 +9,11 @@ [sub_resource type="RectangleShape2D" id="RectangleShape2D_cq6dk"] size = Vector2(2, 15) -[node name="Giant_Leech" type="Node2D"] +[node name="Giant_Leech" type="Area2D"] scale = Vector2(1, 1.2) script = ExtResource("1_wfsrb") broadth = 400 -hp = 180 +max_hp = 180 [node name="Segments" type="Node2D" parent="."] @@ -68,3 +68,6 @@ shape = SubResource("RectangleShape2D_cq6dk") [node name="AudioStreamPlayer2D" type="AudioStreamPlayer2D" parent="."] stream = ExtResource("4_ps8gx") + +[connection signal="damage_taken" from="." to="." method="_on_damage_taken"] +[connection signal="died" from="." to="." method="_on_death"] diff --git a/enemies/leech/leech.gd b/enemies/leech/leech.gd index 467a72a..819756b 100644 --- a/enemies/leech/leech.gd +++ b/enemies/leech/leech.gd @@ -1,20 +1,13 @@ -extends Node2D +extends EnemyHurtbox @export var broadth = 250 @export var move_dir = -1 @export var angular_speed = 0.25 -@export var hp = 400 var angle = 0.0 if move_dir == 1 else PI @onready var segments : Array[Node] = $Segments.get_children() @onready var segment_count = segments.size() -var iframes = 0.2 -var iframe_time = 0 var dead = false -func _ready() -> void: - for segment in segments: - segment.segment_damaged.connect(hurt) - func _process(delta: float) -> void: if dead: return if not $RayCast2D2.has_overlapping_bodies(): @@ -22,7 +15,6 @@ func _process(delta: float) -> void: var y = position.length() var ratio = - move_dir * broadth / (2 * y) var rot_angle = - 2 * asin(ratio) - iframe_time = max(0, iframe_time - delta) angle -= TAU * delta * angular_speed * move_dir if(angle > PI + abs(rot_angle) / 2 or angle < - abs(rot_angle) / 2): angle = fmod(angle + PI, PI) @@ -77,16 +69,14 @@ func calculate_segment_location_and_rotation (i) -> Dictionary: return {"position" : Vector2.UP * broadth * i / (segment_count - 1), "rotation" : 3 * PI / 2} -func hurt(damage : int, _dir): - if iframe_time <= 0: - hp -= damage - $AudioStreamPlayer2D.play() - if(hp<=0): - dead = true - for child in get_children(): - if not child is AudioStreamPlayer2D: - child.queue_free() - await $AudioStreamPlayer2D.finished - queue_free() - else: - iframe_time = iframes +func _on_damage_taken(_damage, _dir, _id): + $AudioStreamPlayer2D.play() + +func _on_death(): + dead = true + for child in get_children(): + if not child is AudioStreamPlayer2D: + child.queue_free() + $AudioStreamPlayer2D.play() + await $AudioStreamPlayer2D.finished + queue_free() diff --git a/enemies/leech/leech.tscn b/enemies/leech/leech.tscn index 4866c55..bacf79a 100644 --- a/enemies/leech/leech.tscn +++ b/enemies/leech/leech.tscn @@ -9,11 +9,11 @@ [sub_resource type="RectangleShape2D" id="RectangleShape2D_cq6dk"] size = Vector2(2, 12) -[node name="Leech" type="Node2D"] +[node name="Leech" type="Area2D"] scale = Vector2(1, 1.2) script = ExtResource("1_6u582") broadth = 200 -hp = 80 +max_hp = 80 [node name="Segments" type="Node2D" parent="."] @@ -59,3 +59,6 @@ shape = SubResource("RectangleShape2D_cq6dk") [node name="AudioStreamPlayer2D" type="AudioStreamPlayer2D" parent="."] stream = ExtResource("4_b1m5t") volume_db = 15.0 + +[connection signal="damage_taken" from="." to="." method="_on_damage_taken"] +[connection signal="died" from="." to="." method="_on_death"] diff --git a/enemies/leech/leech.tscn12453991835.tmp b/enemies/leech/leech.tscn12453991835.tmp new file mode 100644 index 0000000..7c3a000 --- /dev/null +++ b/enemies/leech/leech.tscn12453991835.tmp @@ -0,0 +1,61 @@ +[gd_scene load_steps=7 format=3 uid="uid://b62xcg0dd3vct"] + +[ext_resource type="Script" uid="uid://b70f2ylbb3btt" path="res://enemies/leech/leech.gd" id="1_6u582"] +[ext_resource type="PackedScene" uid="uid://dn8qucrpq6k72" path="res://enemies/leech/segment_end.tscn" id="2_i1r8c"] +[ext_resource type="PackedScene" uid="uid://cvoicwo2xnf7e" path="res://enemies/leech/segment.tscn" id="2_oqch2"] +[ext_resource type="PackedScene" uid="uid://chs0u61f45nau" path="res://utils/earth_aligner.tscn" id="3_0r7dp"] +[ext_resource type="AudioStream" uid="uid://co07360hqn6fk" path="res://sounds/686321__cjspellsfish__punch-land-soft.wav" id="4_b1m5t"] + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_cq6dk"] +size = Vector2(2, 12) + +[node name="Leech" type="Node2D"] +scale = Vector2(1, 1.2) +script = ExtResource("1_6u582") +broadth = 200 +max_hp = 80 + +[node name="Segments" type="Node2D" parent="."] + +[node name="SegmentEnd1" parent="Segments" instance=ExtResource("2_i1r8c")] +rotation = 3.1415927 +scale = Vector2(-1, -1) + +[node name="Segment2" parent="Segments" instance=ExtResource("2_oqch2")] + +[node name="Segment3" parent="Segments" instance=ExtResource("2_oqch2")] + +[node name="Segment4" parent="Segments" instance=ExtResource("2_oqch2")] + +[node name="Segment5" parent="Segments" instance=ExtResource("2_oqch2")] + +[node name="Segment6" parent="Segments" instance=ExtResource("2_oqch2")] + +[node name="Segment7" parent="Segments" instance=ExtResource("2_oqch2")] + +[node name="Segment8" parent="Segments" instance=ExtResource("2_oqch2")] + +[node name="SegmentEnd2" parent="Segments" instance=ExtResource("2_i1r8c")] + +[node name="EarthAligner" parent="." instance=ExtResource("3_0r7dp")] + +[node name="RayCast2D" type="Area2D" parent="."] +position = Vector2(248, 31.2) +collision_layer = 0 +collision_mask = 8 + +[node name="CollisionShape2D" type="CollisionShape2D" parent="RayCast2D"] +position = Vector2(0, 14.8) +shape = SubResource("RectangleShape2D_cq6dk") + +[node name="RayCast2D2" type="Area2D" parent="."] +collision_layer = 0 +collision_mask = 8 + +[node name="CollisionShape2D" type="CollisionShape2D" parent="RayCast2D2"] +position = Vector2(0, 8.8) +shape = SubResource("RectangleShape2D_cq6dk") + +[node name="AudioStreamPlayer2D" type="AudioStreamPlayer2D" parent="."] +stream = ExtResource("4_b1m5t") +volume_db = 15.0 diff --git a/enemies/leech/leech.tscn12459859161.tmp b/enemies/leech/leech.tscn12459859161.tmp new file mode 100644 index 0000000..7c3a000 --- /dev/null +++ b/enemies/leech/leech.tscn12459859161.tmp @@ -0,0 +1,61 @@ +[gd_scene load_steps=7 format=3 uid="uid://b62xcg0dd3vct"] + +[ext_resource type="Script" uid="uid://b70f2ylbb3btt" path="res://enemies/leech/leech.gd" id="1_6u582"] +[ext_resource type="PackedScene" uid="uid://dn8qucrpq6k72" path="res://enemies/leech/segment_end.tscn" id="2_i1r8c"] +[ext_resource type="PackedScene" uid="uid://cvoicwo2xnf7e" path="res://enemies/leech/segment.tscn" id="2_oqch2"] +[ext_resource type="PackedScene" uid="uid://chs0u61f45nau" path="res://utils/earth_aligner.tscn" id="3_0r7dp"] +[ext_resource type="AudioStream" uid="uid://co07360hqn6fk" path="res://sounds/686321__cjspellsfish__punch-land-soft.wav" id="4_b1m5t"] + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_cq6dk"] +size = Vector2(2, 12) + +[node name="Leech" type="Node2D"] +scale = Vector2(1, 1.2) +script = ExtResource("1_6u582") +broadth = 200 +max_hp = 80 + +[node name="Segments" type="Node2D" parent="."] + +[node name="SegmentEnd1" parent="Segments" instance=ExtResource("2_i1r8c")] +rotation = 3.1415927 +scale = Vector2(-1, -1) + +[node name="Segment2" parent="Segments" instance=ExtResource("2_oqch2")] + +[node name="Segment3" parent="Segments" instance=ExtResource("2_oqch2")] + +[node name="Segment4" parent="Segments" instance=ExtResource("2_oqch2")] + +[node name="Segment5" parent="Segments" instance=ExtResource("2_oqch2")] + +[node name="Segment6" parent="Segments" instance=ExtResource("2_oqch2")] + +[node name="Segment7" parent="Segments" instance=ExtResource("2_oqch2")] + +[node name="Segment8" parent="Segments" instance=ExtResource("2_oqch2")] + +[node name="SegmentEnd2" parent="Segments" instance=ExtResource("2_i1r8c")] + +[node name="EarthAligner" parent="." instance=ExtResource("3_0r7dp")] + +[node name="RayCast2D" type="Area2D" parent="."] +position = Vector2(248, 31.2) +collision_layer = 0 +collision_mask = 8 + +[node name="CollisionShape2D" type="CollisionShape2D" parent="RayCast2D"] +position = Vector2(0, 14.8) +shape = SubResource("RectangleShape2D_cq6dk") + +[node name="RayCast2D2" type="Area2D" parent="."] +collision_layer = 0 +collision_mask = 8 + +[node name="CollisionShape2D" type="CollisionShape2D" parent="RayCast2D2"] +position = Vector2(0, 8.8) +shape = SubResource("RectangleShape2D_cq6dk") + +[node name="AudioStreamPlayer2D" type="AudioStreamPlayer2D" parent="."] +stream = ExtResource("4_b1m5t") +volume_db = 15.0 diff --git a/enemies/leech/leech.tscn12471665304.tmp b/enemies/leech/leech.tscn12471665304.tmp new file mode 100644 index 0000000..7c3a000 --- /dev/null +++ b/enemies/leech/leech.tscn12471665304.tmp @@ -0,0 +1,61 @@ +[gd_scene load_steps=7 format=3 uid="uid://b62xcg0dd3vct"] + +[ext_resource type="Script" uid="uid://b70f2ylbb3btt" path="res://enemies/leech/leech.gd" id="1_6u582"] +[ext_resource type="PackedScene" uid="uid://dn8qucrpq6k72" path="res://enemies/leech/segment_end.tscn" id="2_i1r8c"] +[ext_resource type="PackedScene" uid="uid://cvoicwo2xnf7e" path="res://enemies/leech/segment.tscn" id="2_oqch2"] +[ext_resource type="PackedScene" uid="uid://chs0u61f45nau" path="res://utils/earth_aligner.tscn" id="3_0r7dp"] +[ext_resource type="AudioStream" uid="uid://co07360hqn6fk" path="res://sounds/686321__cjspellsfish__punch-land-soft.wav" id="4_b1m5t"] + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_cq6dk"] +size = Vector2(2, 12) + +[node name="Leech" type="Node2D"] +scale = Vector2(1, 1.2) +script = ExtResource("1_6u582") +broadth = 200 +max_hp = 80 + +[node name="Segments" type="Node2D" parent="."] + +[node name="SegmentEnd1" parent="Segments" instance=ExtResource("2_i1r8c")] +rotation = 3.1415927 +scale = Vector2(-1, -1) + +[node name="Segment2" parent="Segments" instance=ExtResource("2_oqch2")] + +[node name="Segment3" parent="Segments" instance=ExtResource("2_oqch2")] + +[node name="Segment4" parent="Segments" instance=ExtResource("2_oqch2")] + +[node name="Segment5" parent="Segments" instance=ExtResource("2_oqch2")] + +[node name="Segment6" parent="Segments" instance=ExtResource("2_oqch2")] + +[node name="Segment7" parent="Segments" instance=ExtResource("2_oqch2")] + +[node name="Segment8" parent="Segments" instance=ExtResource("2_oqch2")] + +[node name="SegmentEnd2" parent="Segments" instance=ExtResource("2_i1r8c")] + +[node name="EarthAligner" parent="." instance=ExtResource("3_0r7dp")] + +[node name="RayCast2D" type="Area2D" parent="."] +position = Vector2(248, 31.2) +collision_layer = 0 +collision_mask = 8 + +[node name="CollisionShape2D" type="CollisionShape2D" parent="RayCast2D"] +position = Vector2(0, 14.8) +shape = SubResource("RectangleShape2D_cq6dk") + +[node name="RayCast2D2" type="Area2D" parent="."] +collision_layer = 0 +collision_mask = 8 + +[node name="CollisionShape2D" type="CollisionShape2D" parent="RayCast2D2"] +position = Vector2(0, 8.8) +shape = SubResource("RectangleShape2D_cq6dk") + +[node name="AudioStreamPlayer2D" type="AudioStreamPlayer2D" parent="."] +stream = ExtResource("4_b1m5t") +volume_db = 15.0 diff --git a/enemies/leech/segment.gd b/enemies/leech/segment.gd index 54061bf..dd66406 100644 --- a/enemies/leech/segment.gd +++ b/enemies/leech/segment.gd @@ -2,11 +2,12 @@ extends Area2D @onready var player = get_tree().get_root().get_node_or_null("main/Player") var damage = 1 -signal segment_damaged +#signal segment_damaged func _process(_delta: float) -> void: if (player != null and overlaps_body(player)): player.hurt(damage, self.global_position-player.global_position) -func _on_hurtbox_damaged(dmg : int, dir : Vector2): - segment_damaged.emit(dmg, dir) +func _on_hurtbox_damaged(dmg : int, dir : Vector2, id): + #segment_damaged.emit(dmg, dir) + get_parent().get_parent().hurt(dmg, dir, id) diff --git a/enemies/leech/segment.tscn b/enemies/leech/segment.tscn index ac86a92..3bcf0f2 100644 --- a/enemies/leech/segment.tscn +++ b/enemies/leech/segment.tscn @@ -26,7 +26,7 @@ shape = SubResource("RectangleShape2D_fgt1l") collision_layer = 16 canvasItem = NodePath("..") flashColor = Color(2.00392, 2.00392, 2.00392, 1) -id_block_time = 0 +id_block_time = 0.0 [node name="CollisionShape2D" type="CollisionShape2D" parent="EnemyHurtbox"] visible = false diff --git a/items/generic/item_spawn.tscn b/items/generic/item_spawn.tscn index ffe4087..87c5d6e 100644 --- a/items/generic/item_spawn.tscn +++ b/items/generic/item_spawn.tscn @@ -12,8 +12,8 @@ script = ExtResource("1_ms6tn") common_items = Array[PackedScene]([ExtResource("2_w6i8k")]) rare_items = Array[PackedScene]([ExtResource("4_v0ua0"), ExtResource("5_uitgx"), ExtResource("3_yi7ag"), ExtResource("6_xqgya")]) -unique_base_chance = 0.1 -rare_base_chance = 0.3 +unique_base_chance = 0.05 +rare_base_chance = 0.1 metadata/_custom_type_script = "uid://b8em61mqgdi58" [node name="EarthAligner" parent="." instance=ExtResource("3_5pwuf")] diff --git a/utils/enemy_hurtbox.gd b/utils/enemy_hurtbox.gd index 5ac140a..88efbe8 100644 --- a/utils/enemy_hurtbox.gd +++ b/utils/enemy_hurtbox.gd @@ -1,15 +1,15 @@ -extends Area2D +class_name EnemyHurtbox extends Area2D @export var max_hp : int @onready var hp = max_hp @export var flash_duration = 0.2 @export var canvasItem : CanvasItem @export var flashColor : Color = Color(1.5, 1.5, 1.5) -@export var id_block_time = 10 +@export var id_block_time = 0.12 var flash_time = 0 var blocked_damage_ids : Array[int] = [] -signal damage_taken(damage, dir) +signal damage_taken(damage, dir, id) signal died func _process(delta: float) -> void: @@ -23,7 +23,7 @@ func hurt(damage : int, dir : Vector2 = Vector2.ZERO, id : int = -1): if canvasItem != null: canvasItem.modulate = flashColor flash_time = flash_duration hp = max(hp-damage, 0) - damage_taken.emit(damage, dir) + damage_taken.emit(damage, dir, id) if(hp <= 0): die()