From f979770250e9c8104256c4cb9912893c01027314 Mon Sep 17 00:00:00 2001 From: ToasterPanic Date: Sat, 9 May 2026 14:16:23 -0400 Subject: [PATCH] Combat adjustments, iframe + knockback fixes --- scenes/game.tscn | 12 +++++++++++- scripts/player.gd | 21 +++++++++++++++------ scripts/slime.gd | 7 ++++++- 3 files changed, 32 insertions(+), 8 deletions(-) diff --git a/scenes/game.tscn b/scenes/game.tscn index 1993af7..11fe480 100644 --- a/scenes/game.tscn +++ b/scenes/game.tscn @@ -21,7 +21,7 @@ albedo_color = Color(0.61, 0.28791997, 0.17079999, 1) size = Vector3(1.2, 1, 1.3) [sub_resource type="CapsuleShape3D" id="CapsuleShape3D_yqjtg"] -radius = 0.25 +radius = 0.15 height = 1.0 [sub_resource type="CapsuleShape3D" id="CapsuleShape3D_0tnpc"] @@ -149,6 +149,10 @@ _data = { &"leap": SubResource("Animation_dinhu") } +[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_vtaks"] +radius = 0.3 +height = 0.6 + [node name="Game" type="Node3D" unique_id=1358608749] script = ExtResource("1_gee14") @@ -250,6 +254,12 @@ texture = ExtResource("8_vtaks") root_node = NodePath("../..") libraries/ = SubResource("AnimationLibrary_kvuet") +[node name="HitCollision" type="Area3D" parent="Slime" unique_id=1071990193] + +[node name="Collision" type="CollisionShape3D" parent="Slime/HitCollision" unique_id=502790258] +shape = SubResource("CapsuleShape3D_vtaks") +debug_color = Color(0.9020641, 0, 0.13776582, 0.41960785) + [node name="Sun" type="DirectionalLight3D" parent="." unique_id=1000747668] transform = Transform3D(5.337265e-08, 0.90171933, -0.4323222, -0.3453802, 0.40571806, 0.8462301, 0.93846303, 0.14931537, 0.31143594, 0, 0, 0) shadow_enabled = true diff --git a/scripts/player.gd b/scripts/player.gd index efc4639..f1372d5 100644 --- a/scripts/player.gd +++ b/scripts/player.gd @@ -10,6 +10,7 @@ var face_left = false var combatable = true var iframes = 0 +var knockback_time = 0 var health = 100 @onready var game = get_parent() @@ -18,6 +19,14 @@ var health = 100 func hit_me(): iframes = 0.5 health -= 10 + +func on_hit(hitter: Node3D = null) -> void: + iframes = 0.8 + + if hitter: + knockback_time = 0.25 + velocity += hitter.global_position.direction_to(global_position) * 8 + velocity.y = 0 func _ready() -> void: $DreamerBody.look_at(game.get_node("PlayerCamera").global_position) @@ -32,6 +41,9 @@ func _process(delta: float) -> void: $DreamerBody/Body.modulate.a = 0.5 else: $DreamerBody/Body.modulate.a = 1 + + if knockback_time > 0: + knockback_time -= delta func _physics_process(delta: float) -> void: if not is_on_floor(): @@ -40,9 +52,6 @@ func _physics_process(delta: float) -> void: var viewport_half = (get_viewport().get_visible_rect().size / 2.0) var player_position = camera.unproject_position(global_transform.origin) - print(viewport_half) - print(player_position) - if face_left: $DreamerBody.rotation.y = face_rotation + deg_to_rad(180) else: @@ -106,15 +115,15 @@ func _physics_process(delta: float) -> void: body.on_knockback() var direction = (camera.transform.basis * Vector3(input_dir.x, 0, input_dir.y)).normalized() - if direction: + if direction and (knockback_time <= 0): velocity.x = direction.x * SPEED velocity.z = direction.z * SPEED $DreamerBody/Animator.set("parameters/walk/blend_amount", abs(direction.length())) else: - velocity.x = move_toward(velocity.x, 0, SPEED) - velocity.z = move_toward(velocity.z, 0, SPEED) + velocity.x = move_toward(velocity.x, 0, delta * 24) + velocity.z = move_toward(velocity.z, 0, delta * 24) $DreamerBody/Animator.set("parameters/walk/blend_amount", 0) diff --git a/scripts/slime.gd b/scripts/slime.gd index ad7ae31..2a44c44 100644 --- a/scripts/slime.gd +++ b/scripts/slime.gd @@ -7,7 +7,7 @@ var face_rotation = null var face_left = false var combatable = false -var health = 100 +var health = 40 var mid_knockback = false @onready var player = get_parent().get_node("Player") @@ -107,6 +107,11 @@ func _physics_process(delta: float) -> void: move_and_slide() + if player in $HitCollision.get_overlapping_bodies(): + if player.iframes <= 0: + player.health -= 20 + player.on_hit(self) + if mid_knockback: mid_knockback = false $Shadow.global_position.y = $Floorcast.get_collision_point().y + 0.01