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..a7747b6 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,54 @@ 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 + 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)