From bed957a52ecf32c7cea3b13babc5b0fa4a87b4e0 Mon Sep 17 00:00:00 2001 From: Artur David Date: Thu, 30 Apr 2026 10:44:49 +0200 Subject: [PATCH 1/2] feat: added automated hits when enemy is close enough --- scenes/player.tscn | 25 +++++++++++++---- scripts/blue_slime.gd | 8 +++--- scripts/cauldron_bar.gd | 1 - scripts/fire_slime.gd | 5 ++-- scripts/player.gd | 59 +++++++++++++++++++++++++++++++++++++++-- scripts/slime.gd | 4 +-- 6 files changed, 86 insertions(+), 16 deletions(-) diff --git a/scenes/player.tscn b/scenes/player.tscn index ca546ab..39cf88f 100644 --- a/scenes/player.tscn +++ b/scenes/player.tscn @@ -399,7 +399,7 @@ animations = [{ "duration": 1.0, "texture": SubResource("AtlasTexture_qk6i7") }], -"loop": true, +"loop": false, "name": &"attack_down", "speed": 10.0 }, { @@ -422,7 +422,7 @@ animations = [{ "duration": 1.0, "texture": SubResource("AtlasTexture_jx8is") }], -"loop": true, +"loop": false, "name": &"attack_left", "speed": 10.0 }, { @@ -445,7 +445,7 @@ animations = [{ "duration": 1.0, "texture": SubResource("AtlasTexture_cbf1i") }], -"loop": true, +"loop": false, "name": &"attack_right", "speed": 10.0 }, { @@ -468,7 +468,7 @@ animations = [{ "duration": 1.0, "texture": SubResource("AtlasTexture_qmsq4") }], -"loop": true, +"loop": false, "name": &"attack_up", "speed": 10.0 }, { @@ -775,6 +775,9 @@ animations = [{ "speed": 10.0 }] +[sub_resource type="CircleShape2D" id="CircleShape2D_tuyoq"] +radius = 30.0 + [node name="Player" type="CharacterBody2D" unique_id=804585690] collision_mask = 129 motion_mode = 1 @@ -786,4 +789,16 @@ shape = SubResource("CapsuleShape2D_u8vuu") [node name="AnimatedSprite2D" type="AnimatedSprite2D" parent="." unique_id=1616479252] texture_filter = 1 sprite_frames = SubResource("SpriteFrames_giy8y") -animation = &"attack_up" +animation = &"attack_left" + +[node name="MeleeArea" type="Area2D" parent="." unique_id=24997730] + +[node name="CollisionShape2D" type="CollisionShape2D" parent="MeleeArea" unique_id=2002113716] +shape = SubResource("CircleShape2D_tuyoq") + +[node name="AttackSpeed" type="Timer" parent="." unique_id=2072925004] +wait_time = 0.506 +autostart = true + +[connection signal="body_entered" from="MeleeArea" to="." method="_on_melee_area_body_entered"] +[connection signal="timeout" from="AttackSpeed" to="." method="_on_attack_speed_timeout"] diff --git a/scripts/blue_slime.gd b/scripts/blue_slime.gd index 740da5d..944a478 100644 --- a/scripts/blue_slime.gd +++ b/scripts/blue_slime.gd @@ -5,7 +5,7 @@ func _ready() -> void: speed = 15.0 max_hp = 25 hp = max_hp - $Area2D.body_entered.connect(_on_area_2d_body_entered) +# $Area2D.body_entered.connect(_on_area_2d_body_entered) func _process(delta: float) -> void: super._process(delta) @@ -13,6 +13,6 @@ func _process(delta: float) -> void: return _chase_witch() -func _on_area_2d_body_entered(body: Node2D) -> void: - if body == player: - take_damage(player.damage) +#func _on_area_2d_body_entered(body: Node2D) -> void: + #if body == player: + #take_damage(player.damage) diff --git a/scripts/cauldron_bar.gd b/scripts/cauldron_bar.gd index 61d0fde..726235a 100644 --- a/scripts/cauldron_bar.gd +++ b/scripts/cauldron_bar.gd @@ -92,7 +92,6 @@ func brew(fruits): elif grape_count == 3: witch.shoot_tornado() elif apple_count == 1 and grape_count == 2: - witch.shoot_fireballs() witch.shoot_shuriken() reset_texture() is_brewing = false diff --git a/scripts/fire_slime.gd b/scripts/fire_slime.gd index 968b083..210553a 100644 --- a/scripts/fire_slime.gd +++ b/scripts/fire_slime.gd @@ -14,5 +14,6 @@ func _process(delta: float) -> void: _chase_witch() func _on_area_2d_body_entered(body: Node2D) -> void: - if body == player: - take_damage(player.damage) + #if body == player: + # take_damage(player.damage) + pass diff --git a/scripts/player.gd b/scripts/player.gd index bdb8d90..caefe12 100644 --- a/scripts/player.gd +++ b/scripts/player.gd @@ -5,11 +5,15 @@ var max_xp = 5 var level = 1 var speed = 200 var damage: int = 10 +var strength = 3 +var attacks = false func _physics_process(delta): var direction = Input.get_vector("ui_left", "ui_right", "ui_up", "ui_down") velocity = direction * speed - + move_and_slide() + if attacks == true: + return if direction == Vector2.ZERO: animated_sprite_2d.play("idle") elif abs(direction.x) >= abs(direction.y): @@ -24,4 +28,55 @@ func _physics_process(delta): animated_sprite_2d.play("walk_down") - move_and_slide() + + +func attack(): + if attacks: + return + for body in $MeleeArea.get_overlapping_bodies(): + if body.is_in_group("enemies"): + attacks = true + var dir = global_position.direction_to(body.global_position) + if dir == Vector2.ZERO: + animated_sprite_2d.play("idle") + elif abs(dir.x) >= abs(dir.y): + if dir.x < 0: + animated_sprite_2d.play("attack_left") + else: + animated_sprite_2d.play("attack_right") + else: + if dir.y < 0: + animated_sprite_2d.play("attack_up") + else: + animated_sprite_2d.play("attack_down") + animated_sprite_2d.speed_scale = 0.5 / $AttackSpeed.wait_time * 1.4 + print(animated_sprite_2d.speed_scale) + var wait_time = $AttackSpeed.wait_time + await get_tree().create_timer(wait_time / 2).timeout + body.take_damage(strength) + var knockback_dir = global_position.direction_to(body.global_position) + var enemy_tween = create_tween() + enemy_tween.tween_property(body, "global_position", body.global_position + knockback_dir * 20, 0.1).set_ease(Tween.EASE_OUT).set_trans(Tween.TRANS_QUAD) + var player_tween = create_tween() + player_tween.tween_property(self, "global_position", global_position - knockback_dir * 10, 0.1).set_ease(Tween.EASE_OUT).set_trans(Tween.TRANS_QUAD) + await animated_sprite_2d.animation_finished + animated_sprite_2d.speed_scale = 1 + attacks = false + break + + + +func _on_attack_speed_timeout() -> void: + if $MeleeArea.get_overlapping_bodies().any(func(b): return b.is_in_group("enemies")): + attack() + else: + $AttackSpeed.call_deferred("stop") + pass # Replace with function body. + + + +func _on_melee_area_body_entered(body: Node2D) -> void: + if body.is_in_group("enemies"): + if $AttackSpeed.is_stopped(): + attack() + $AttackSpeed.start() diff --git a/scripts/slime.gd b/scripts/slime.gd index 4c1febf..efab6f4 100644 --- a/scripts/slime.gd +++ b/scripts/slime.gd @@ -15,5 +15,5 @@ func _process(delta: float) -> void: func _on_area_2d_body_entered(body: Node2D) -> void: if is_dying: return - if body == player: - take_damage(player.damage) +# if body == player: +# take_damage(player.damage) From 3d6a721b04803729d3953fc3de4395dc48c8fbc9 Mon Sep 17 00:00:00 2001 From: Artur David Date: Thu, 30 Apr 2026 10:46:15 +0200 Subject: [PATCH 2/2] fix: removed debugging artefact --- scripts/player.gd | 1 - 1 file changed, 1 deletion(-) diff --git a/scripts/player.gd b/scripts/player.gd index caefe12..a7747b6 100644 --- a/scripts/player.gd +++ b/scripts/player.gd @@ -50,7 +50,6 @@ func attack(): else: animated_sprite_2d.play("attack_down") animated_sprite_2d.speed_scale = 0.5 / $AttackSpeed.wait_time * 1.4 - print(animated_sprite_2d.speed_scale) var wait_time = $AttackSpeed.wait_time await get_tree().create_timer(wait_time / 2).timeout body.take_damage(strength)