Modified Damage Behavior and Item Spawn Rate

This commit is contained in:
Melvin Weiß 2025-09-23 15:10:45 +02:00
parent a42d798490
commit 408fbb40e3
12 changed files with 218 additions and 37 deletions

View file

@ -34,6 +34,7 @@ collision_layer = 16
collision_mask = 32 collision_mask = 32
max_hp = 800 max_hp = 800
canvasItem = NodePath("..") canvasItem = NodePath("..")
id_block_time = 5.0
[node name="CollisionShape2D" type="CollisionShape2D" parent="EnemyHurtbox"] [node name="CollisionShape2D" type="CollisionShape2D" parent="EnemyHurtbox"]
rotation = 1.5708 rotation = 1.5708

View file

@ -41,6 +41,6 @@ func _on_death():
await $AudioStreamPlayer2D.finished await $AudioStreamPlayer2D.finished
self.queue_free() 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 current_knockback = - dir * knockback_weight
$AudioStreamPlayer2D.play() $AudioStreamPlayer2D.play()

View file

@ -9,11 +9,11 @@
[sub_resource type="RectangleShape2D" id="RectangleShape2D_cq6dk"] [sub_resource type="RectangleShape2D" id="RectangleShape2D_cq6dk"]
size = Vector2(2, 15) size = Vector2(2, 15)
[node name="Giant_Leech" type="Node2D"] [node name="Giant_Leech" type="Area2D"]
scale = Vector2(1, 1.2) scale = Vector2(1, 1.2)
script = ExtResource("1_wfsrb") script = ExtResource("1_wfsrb")
broadth = 400 broadth = 400
hp = 180 max_hp = 180
[node name="Segments" type="Node2D" parent="."] [node name="Segments" type="Node2D" parent="."]
@ -68,3 +68,6 @@ shape = SubResource("RectangleShape2D_cq6dk")
[node name="AudioStreamPlayer2D" type="AudioStreamPlayer2D" parent="."] [node name="AudioStreamPlayer2D" type="AudioStreamPlayer2D" parent="."]
stream = ExtResource("4_ps8gx") stream = ExtResource("4_ps8gx")
[connection signal="damage_taken" from="." to="." method="_on_damage_taken"]
[connection signal="died" from="." to="." method="_on_death"]

View file

@ -1,20 +1,13 @@
extends Node2D extends EnemyHurtbox
@export var broadth = 250 @export var broadth = 250
@export var move_dir = -1 @export var move_dir = -1
@export var angular_speed = 0.25 @export var angular_speed = 0.25
@export var hp = 400
var angle = 0.0 if move_dir == 1 else PI var angle = 0.0 if move_dir == 1 else PI
@onready var segments : Array[Node] = $Segments.get_children() @onready var segments : Array[Node] = $Segments.get_children()
@onready var segment_count = segments.size() @onready var segment_count = segments.size()
var iframes = 0.2
var iframe_time = 0
var dead = false var dead = false
func _ready() -> void:
for segment in segments:
segment.segment_damaged.connect(hurt)
func _process(delta: float) -> void: func _process(delta: float) -> void:
if dead: return if dead: return
if not $RayCast2D2.has_overlapping_bodies(): if not $RayCast2D2.has_overlapping_bodies():
@ -22,7 +15,6 @@ func _process(delta: float) -> void:
var y = position.length() var y = position.length()
var ratio = - move_dir * broadth / (2 * y) var ratio = - move_dir * broadth / (2 * y)
var rot_angle = - 2 * asin(ratio) var rot_angle = - 2 * asin(ratio)
iframe_time = max(0, iframe_time - delta)
angle -= TAU * delta * angular_speed * move_dir angle -= TAU * delta * angular_speed * move_dir
if(angle > PI + abs(rot_angle) / 2 or angle < - abs(rot_angle) / 2): if(angle > PI + abs(rot_angle) / 2 or angle < - abs(rot_angle) / 2):
angle = fmod(angle + PI, PI) 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), return {"position" : Vector2.UP * broadth * i / (segment_count - 1),
"rotation" : 3 * PI / 2} "rotation" : 3 * PI / 2}
func hurt(damage : int, _dir): func _on_damage_taken(_damage, _dir, _id):
if iframe_time <= 0: $AudioStreamPlayer2D.play()
hp -= damage
$AudioStreamPlayer2D.play() func _on_death():
if(hp<=0): dead = true
dead = true for child in get_children():
for child in get_children(): if not child is AudioStreamPlayer2D:
if not child is AudioStreamPlayer2D: child.queue_free()
child.queue_free() $AudioStreamPlayer2D.play()
await $AudioStreamPlayer2D.finished await $AudioStreamPlayer2D.finished
queue_free() queue_free()
else:
iframe_time = iframes

View file

@ -9,11 +9,11 @@
[sub_resource type="RectangleShape2D" id="RectangleShape2D_cq6dk"] [sub_resource type="RectangleShape2D" id="RectangleShape2D_cq6dk"]
size = Vector2(2, 12) size = Vector2(2, 12)
[node name="Leech" type="Node2D"] [node name="Leech" type="Area2D"]
scale = Vector2(1, 1.2) scale = Vector2(1, 1.2)
script = ExtResource("1_6u582") script = ExtResource("1_6u582")
broadth = 200 broadth = 200
hp = 80 max_hp = 80
[node name="Segments" type="Node2D" parent="."] [node name="Segments" type="Node2D" parent="."]
@ -59,3 +59,6 @@ shape = SubResource("RectangleShape2D_cq6dk")
[node name="AudioStreamPlayer2D" type="AudioStreamPlayer2D" parent="."] [node name="AudioStreamPlayer2D" type="AudioStreamPlayer2D" parent="."]
stream = ExtResource("4_b1m5t") stream = ExtResource("4_b1m5t")
volume_db = 15.0 volume_db = 15.0
[connection signal="damage_taken" from="." to="." method="_on_damage_taken"]
[connection signal="died" from="." to="." method="_on_death"]

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -2,11 +2,12 @@ extends Area2D
@onready var player = get_tree().get_root().get_node_or_null("main/Player") @onready var player = get_tree().get_root().get_node_or_null("main/Player")
var damage = 1 var damage = 1
signal segment_damaged #signal segment_damaged
func _process(_delta: float) -> void: func _process(_delta: float) -> void:
if (player != null and overlaps_body(player)): if (player != null and overlaps_body(player)):
player.hurt(damage, self.global_position-player.global_position) player.hurt(damage, self.global_position-player.global_position)
func _on_hurtbox_damaged(dmg : int, dir : Vector2): func _on_hurtbox_damaged(dmg : int, dir : Vector2, id):
segment_damaged.emit(dmg, dir) #segment_damaged.emit(dmg, dir)
get_parent().get_parent().hurt(dmg, dir, id)

View file

@ -26,7 +26,7 @@ shape = SubResource("RectangleShape2D_fgt1l")
collision_layer = 16 collision_layer = 16
canvasItem = NodePath("..") canvasItem = NodePath("..")
flashColor = Color(2.00392, 2.00392, 2.00392, 1) 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"] [node name="CollisionShape2D" type="CollisionShape2D" parent="EnemyHurtbox"]
visible = false visible = false

View file

@ -12,8 +12,8 @@
script = ExtResource("1_ms6tn") script = ExtResource("1_ms6tn")
common_items = Array[PackedScene]([ExtResource("2_w6i8k")]) common_items = Array[PackedScene]([ExtResource("2_w6i8k")])
rare_items = Array[PackedScene]([ExtResource("4_v0ua0"), ExtResource("5_uitgx"), ExtResource("3_yi7ag"), ExtResource("6_xqgya")]) rare_items = Array[PackedScene]([ExtResource("4_v0ua0"), ExtResource("5_uitgx"), ExtResource("3_yi7ag"), ExtResource("6_xqgya")])
unique_base_chance = 0.1 unique_base_chance = 0.05
rare_base_chance = 0.3 rare_base_chance = 0.1
metadata/_custom_type_script = "uid://b8em61mqgdi58" metadata/_custom_type_script = "uid://b8em61mqgdi58"
[node name="EarthAligner" parent="." instance=ExtResource("3_5pwuf")] [node name="EarthAligner" parent="." instance=ExtResource("3_5pwuf")]

View file

@ -1,15 +1,15 @@
extends Area2D class_name EnemyHurtbox extends Area2D
@export var max_hp : int @export var max_hp : int
@onready var hp = max_hp @onready var hp = max_hp
@export var flash_duration = 0.2 @export var flash_duration = 0.2
@export var canvasItem : CanvasItem @export var canvasItem : CanvasItem
@export var flashColor : Color = Color(1.5, 1.5, 1.5) @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 flash_time = 0
var blocked_damage_ids : Array[int] = [] var blocked_damage_ids : Array[int] = []
signal damage_taken(damage, dir) signal damage_taken(damage, dir, id)
signal died signal died
func _process(delta: float) -> void: 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 if canvasItem != null: canvasItem.modulate = flashColor
flash_time = flash_duration flash_time = flash_duration
hp = max(hp-damage, 0) hp = max(hp-damage, 0)
damage_taken.emit(damage, dir) damage_taken.emit(damage, dir, id)
if(hp <= 0): if(hp <= 0):
die() die()