From 9066eecf1e0341b81d89be7f037173a2f478b460 Mon Sep 17 00:00:00 2001 From: Nikolai Fedorov Date: Wed, 22 Apr 2026 22:42:27 +0300 Subject: [PATCH] kick force --- scenes/Main.tscn | 10 ++++------ scripts/Boulder.gd | 1 + scripts/Enemy.gd | 4 +++- scripts/Leather.gd | 1 + scripts/Main.gd | 3 ++- scripts/MergeRecipes.gd | 4 ++-- scripts/Player.gd | 19 ++++++++++++++++--- scripts/Rock.gd | 3 ++- scripts/Stick.gd | 1 + 9 files changed, 32 insertions(+), 14 deletions(-) diff --git a/scenes/Main.tscn b/scenes/Main.tscn index 3ffd369..d4fe3b8 100644 --- a/scenes/Main.tscn +++ b/scenes/Main.tscn @@ -1,11 +1,9 @@ -[gd_scene load_steps=2 format=3 uid="uid://dyz3no6pcd567"] +[gd_scene format=3 uid="uid://dy03no6pcd567"] -[ext_resource type="Script" path="res://scripts/Main.gd" id="1_main"] +[ext_resource type="Script" uid="uid://bjqcstgcoedos" path="res://scripts/Main.gd" id="1_main"] -[node name="Main" type="Node3D"] +[node name="Main" type="Node3D" unique_id=1185365760] script = ExtResource("1_main") -[node name="SpawnTimer" type="Timer" parent="."] +[node name="SpawnTimer" type="Timer" parent="." unique_id=1093753659] wait_time = 1.5 -one_shot = false -autostart = false diff --git a/scripts/Boulder.gd b/scripts/Boulder.gd index 16442f1..863233b 100644 --- a/scripts/Boulder.gd +++ b/scripts/Boulder.gd @@ -10,6 +10,7 @@ const WALL_BOUNCE := 0.4 const WALL_SELF_DMG := 0.4 var kickable_type: String = "boulder" +var tier: int = 2 var state: State = State.IDLE var fly_vel: Vector3 = Vector3.ZERO var health: float = 150.0 diff --git a/scripts/Enemy.gd b/scripts/Enemy.gd index d5414ff..a533a41 100644 --- a/scripts/Enemy.gd +++ b/scripts/Enemy.gd @@ -12,6 +12,7 @@ enum State { CHASING, FLYING, STUNNED, DEAD, MERGING } static var first_leather_spawned: bool = false var kickable_type: String = "" +var tier: int = 1 var move_speed: float = 3.0 var health: int = 30 var damage_to_player: int = 8 @@ -53,6 +54,7 @@ func setup(type: String, wave: int) -> void: enemy_type = type kickable_type = type wave_num = wave + tier = enemy_level match type: "slime": move_speed = 2.8 + wave * 0.12 @@ -178,7 +180,7 @@ func _stun_tick(delta: float) -> void: _enter_chase() func can_merge_with(other: Node3D, collision_speed: float) -> bool: - return (collision_speed >= 3.0 + return (collision_speed >= 18.0 and other.get("enemy_type") == enemy_type and other.get("enemy_level") == enemy_level and not is_upgrading diff --git a/scripts/Leather.gd b/scripts/Leather.gd index c09c63b..6884bf5 100644 --- a/scripts/Leather.gd +++ b/scripts/Leather.gd @@ -7,6 +7,7 @@ const MIN_SPEED := 0.3 const WALL_BOUNCE := 0.7 var kickable_type: String = "leather" +var tier: int = 1 var state: State = State.IDLE var fly_vel: Vector3 = Vector3.ZERO var damage_modifier: float = 0.0 diff --git a/scripts/Main.gd b/scripts/Main.gd index a9d3d8a..481e34a 100644 --- a/scripts/Main.gd +++ b/scripts/Main.gd @@ -227,7 +227,8 @@ func _spawn_upgraded_enemy(pos: Vector3, type: String, level: int, w: int) -> Ch add_child(enemy) enemy.setup(type, w) enemy.target = player - enemy.enemy_level = level + 1 + enemy.enemy_level = level + enemy.tier = level enemy.global_position = pos enemy.connect("died", _on_enemy_died) enemy.connect("merged", _on_enemy_merged) diff --git a/scripts/MergeRecipes.gd b/scripts/MergeRecipes.gd index 4918abc..2d2095f 100644 --- a/scripts/MergeRecipes.gd +++ b/scripts/MergeRecipes.gd @@ -6,12 +6,12 @@ static var _list: Array[Dictionary] = [ { "ingredients": ["leather", "stick"], "result_scene": "res://scenes/LeatherBoots.tscn", - "speed_threshold": 0.5, + "speed_threshold": 18.0, }, { "ingredients": ["rock", "rock"], "result_scene": "res://scenes/Boulder.tscn", - "speed_threshold": 5.0, + "speed_threshold": 18.0, }, ] diff --git a/scripts/Player.gd b/scripts/Player.gd index adc779e..478df9d 100644 --- a/scripts/Player.gd +++ b/scripts/Player.gd @@ -11,6 +11,7 @@ signal health_changed(current: int, maximum: int) @export var max_health: int = 100 var health: int = max_health +var tier: int = 0 var kick_timer: float = 0.0 var invincible_timer: float = 0.0 var is_alive: bool = true @@ -135,9 +136,9 @@ func _do_kick() -> void: forward.y = 0.0 forward = forward.normalized() if forward.length() > 0.01 else Vector3(0.0, 0.0, -1.0) var half_cos: float = cos(deg_to_rad(kick_angle * 0.5)) - var enemies := get_tree().get_nodes_in_group("enemies") + get_tree().get_nodes_in_group("kickable") + var targets := get_tree().get_nodes_in_group("enemies") + get_tree().get_nodes_in_group("kickable") var kicked_any := false - for e in enemies: + for e in targets: if not is_instance_valid(e): continue var en := e as Node3D @@ -149,7 +150,18 @@ func _do_kick() -> void: if dist < 0.1 or dist > kick_range: continue if (diff / dist).dot(forward) >= half_cos: - en.call("receive_kick", diff / dist, kick_force) + var obj_tier: int = en.get("tier") if en.get("tier") != null else 0 + var diff_tier := tier - obj_tier + var force: float + if diff_tier < 0: + force = 15.0 + elif diff_tier == 0: + force = 50.0 + elif diff_tier == 1: + force = 70.0 + else: + force = 80.0 + en.call("receive_kick", diff / dist, force) kicked_any = true if kicked_any: _squish_effect() @@ -218,6 +230,7 @@ func apply_upgrade(id: String) -> void: emit_signal("health_changed", health, max_health) func apply_upgrade_boots(speed_bonus: float, _tier: int) -> void: + tier += _tier move_speed += speed_bonus var tw := create_tween() tw.tween_property(player_mat, "albedo_color", Color(1.0, 0.85, 0.2), 0.1) diff --git a/scripts/Rock.gd b/scripts/Rock.gd index 7c7680c..dd30b1a 100644 --- a/scripts/Rock.gd +++ b/scripts/Rock.gd @@ -4,12 +4,13 @@ signal destroyed enum State { IDLE, FLYING } -const AIR_FRICTION := 0.84 +const AIR_FRICTION := 0.9 const MIN_SPEED := 0.5 const WALL_BOUNCE := 0.5 const WALL_SELF_DMG := 0.6 var kickable_type: String = "rock" +var tier: int = 0 var state: State = State.IDLE var fly_vel: Vector3 = Vector3.ZERO var health: float = 60.0 diff --git a/scripts/Stick.gd b/scripts/Stick.gd index e96ae10..42f7d14 100644 --- a/scripts/Stick.gd +++ b/scripts/Stick.gd @@ -10,6 +10,7 @@ const WALL_BOUNCE := 0.5 const WALL_SELF_DMG := 0.5 var kickable_type: String = "stick" +var tier: int = 0 var state: State = State.IDLE var fly_vel: Vector3 = Vector3.ZERO var health: float = 40.0