From 9b05276ad6e80f95b105279a8ed6d2f07dc46804 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Melvin=20Wei=C3=9F?= Date: Thu, 2 Oct 2025 15:08:59 +0200 Subject: [PATCH] Attack Knockback + Controller Keybinds --- player/player.gd | 15 +++++++++++---- player/sword.gd | 8 +++++++- project.godot | 9 +++++++++ utils/enemy_hurtbox.gd | 4 +++- 4 files changed, 30 insertions(+), 6 deletions(-) diff --git a/player/player.gd b/player/player.gd index d9d9362..9d621d9 100644 --- a/player/player.gd +++ b/player/player.gd @@ -44,9 +44,10 @@ var dead = false; var reset_to_velocity = Vector2.ZERO var knockback_strength = 1500 var damage_knockup = 500 +@export var friction = 0.5 # Attack Handling -var atk_cooldown = 0.5 +var atk_cooldown = 0.35 var atk_timer = 0 var can_upslash = false @@ -129,14 +130,20 @@ func manage_animation() -> void: func manage_velocity(delta: float) -> void: up_direction = (position - earth_center).normalized(); var old_local_velocity = earth_aligner.local_from_global(velocity) - var local_velocity = Vector2(old_local_velocity.x/pow(1.7,60*delta), old_local_velocity.y); + var local_velocity = Vector2(old_local_velocity.x * pow(1 - friction,60*delta), old_local_velocity.y); local_velocity += Vector2(0, gravity) if handle_input: if(Input.is_action_pressed("move_right")): - local_velocity += Vector2(hspeed, 0) + if local_velocity.x > -700: + local_velocity += Vector2(hspeed, 0) + else: + local_velocity += Vector2(hspeed/2.0, 0) if(Input.is_action_pressed("move_left")): - local_velocity += Vector2(-hspeed, 0) + if local_velocity.x < 700: + local_velocity += Vector2(-hspeed, 0) + else: + local_velocity += Vector2(-hspeed/2.0, 0) if(Input.is_action_just_pressed("jump") and (is_on_floor() or air_jumps_current > 0)): var dropped = false diff --git a/player/sword.gd b/player/sword.gd index 58374fb..cb277c5 100644 --- a/player/sword.gd +++ b/player/sword.gd @@ -6,6 +6,8 @@ var damage = 20 var facing = -1 var facing_mult = 1 var dmg_id +var swing_knockback = 1000 +var apply_swing_knockback = true func _ready() -> void: anim_sprite = $AnimatedSprite2D @@ -34,4 +36,8 @@ func _process(delta: float) -> void: anim_sprite.visible = false for area in get_overlapping_areas(): var hurt_dir = -get_parent().earth_aligner.global_from_local(Vector2(-facing, 0)).rotated(facing*rotation) - area.hurt(damage, hurt_dir, dmg_id) + if area.hurt(damage, hurt_dir, dmg_id) and apply_swing_knockback: + get_parent().reset_to_velocity = Vector2(swing_knockback * facing, 0) + apply_swing_knockback = false + else: + apply_swing_knockback = true diff --git a/project.godot b/project.godot index 1440eaf..e7ae270 100644 --- a/project.godot +++ b/project.godot @@ -31,52 +31,61 @@ move_right={ "deadzone": 0.2, "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194321,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) , Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":68,"key_label":0,"unicode":100,"location":0,"echo":false,"script":null) +, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":0,"axis_value":1.0,"script":null) ] } move_left={ "deadzone": 0.2, "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194319,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) , Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":65,"key_label":0,"unicode":97,"location":0,"echo":false,"script":null) +, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":0,"axis_value":-1.0,"script":null) ] } jump={ "deadzone": 0.2, "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":32,"key_label":0,"unicode":32,"location":0,"echo":false,"script":null) +, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":0,"pressure":0.0,"pressed":true,"script":null) ] } attack={ "deadzone": 0.2, "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":67,"key_label":0,"unicode":99,"location":0,"echo":false,"script":null) , Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":1,"position":Vector2(356, 29),"global_position":Vector2(365, 77),"factor":1.0,"button_index":1,"canceled":false,"pressed":true,"double_click":false,"script":null) +, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":2,"pressure":0.0,"pressed":true,"script":null) ] } drop={ "deadzone": 0.2, "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194322,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) , Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":83,"key_label":0,"unicode":115,"location":0,"echo":false,"script":null) +, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":1,"axis_value":1.0,"script":null) ] } item={ "deadzone": 0.2, "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":88,"key_label":0,"unicode":120,"location":0,"echo":false,"script":null) , Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":2,"position":Vector2(297, 25),"global_position":Vector2(306, 73),"factor":1.0,"button_index":2,"canceled":false,"pressed":true,"double_click":false,"script":null) +, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":10,"pressure":0.0,"pressed":true,"script":null) ] } drop_item={ "deadzone": 0.2, "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":90,"key_label":0,"unicode":121,"location":0,"echo":false,"script":null) , Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":0,"position":Vector2(0, 0),"global_position":Vector2(0, 0),"factor":1.0,"button_index":3,"canceled":false,"pressed":false,"double_click":false,"script":null) +, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":3,"pressure":0.0,"pressed":true,"script":null) ] } up={ "deadzone": 0.2, "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194320,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) , Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":87,"key_label":0,"unicode":119,"location":0,"echo":false,"script":null) +, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":1,"axis_value":-1.0,"script":null) ] } journal={ "deadzone": 0.2, "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":74,"key_label":0,"unicode":106,"location":0,"echo":false,"script":null) +, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":4,"pressure":0.0,"pressed":true,"script":null) ] } diff --git a/utils/enemy_hurtbox.gd b/utils/enemy_hurtbox.gd index 88efbe8..134b2c0 100644 --- a/utils/enemy_hurtbox.gd +++ b/utils/enemy_hurtbox.gd @@ -17,7 +17,7 @@ func _process(delta: float) -> void: if(flash_time <= 0 and canvasItem != null): canvasItem.modulate = Color(1,1,1) -func hurt(damage : int, dir : Vector2 = Vector2.ZERO, id : int = -1): +func hurt(damage : int, dir : Vector2 = Vector2.ZERO, id : int = -1) -> bool: if not id in blocked_damage_ids: block_id(id) if canvasItem != null: canvasItem.modulate = flashColor @@ -26,6 +26,8 @@ func hurt(damage : int, dir : Vector2 = Vector2.ZERO, id : int = -1): damage_taken.emit(damage, dir, id) if(hp <= 0): die() + return true + return false func block_id(id : int): blocked_damage_ids.append(id)