kick force

This commit is contained in:
2026-04-22 22:42:27 +03:00
parent 89a9e1a83e
commit 9066eecf1e
9 changed files with 32 additions and 14 deletions
+4 -6
View File
@@ -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") script = ExtResource("1_main")
[node name="SpawnTimer" type="Timer" parent="."] [node name="SpawnTimer" type="Timer" parent="." unique_id=1093753659]
wait_time = 1.5 wait_time = 1.5
one_shot = false
autostart = false
+1
View File
@@ -10,6 +10,7 @@ const WALL_BOUNCE := 0.4
const WALL_SELF_DMG := 0.4 const WALL_SELF_DMG := 0.4
var kickable_type: String = "boulder" var kickable_type: String = "boulder"
var tier: int = 2
var state: State = State.IDLE var state: State = State.IDLE
var fly_vel: Vector3 = Vector3.ZERO var fly_vel: Vector3 = Vector3.ZERO
var health: float = 150.0 var health: float = 150.0
+3 -1
View File
@@ -12,6 +12,7 @@ enum State { CHASING, FLYING, STUNNED, DEAD, MERGING }
static var first_leather_spawned: bool = false static var first_leather_spawned: bool = false
var kickable_type: String = "" var kickable_type: String = ""
var tier: int = 1
var move_speed: float = 3.0 var move_speed: float = 3.0
var health: int = 30 var health: int = 30
var damage_to_player: int = 8 var damage_to_player: int = 8
@@ -53,6 +54,7 @@ func setup(type: String, wave: int) -> void:
enemy_type = type enemy_type = type
kickable_type = type kickable_type = type
wave_num = wave wave_num = wave
tier = enemy_level
match type: match type:
"slime": "slime":
move_speed = 2.8 + wave * 0.12 move_speed = 2.8 + wave * 0.12
@@ -178,7 +180,7 @@ func _stun_tick(delta: float) -> void:
_enter_chase() _enter_chase()
func can_merge_with(other: Node3D, collision_speed: float) -> bool: 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_type") == enemy_type
and other.get("enemy_level") == enemy_level and other.get("enemy_level") == enemy_level
and not is_upgrading and not is_upgrading
+1
View File
@@ -7,6 +7,7 @@ const MIN_SPEED := 0.3
const WALL_BOUNCE := 0.7 const WALL_BOUNCE := 0.7
var kickable_type: String = "leather" var kickable_type: String = "leather"
var tier: int = 1
var state: State = State.IDLE var state: State = State.IDLE
var fly_vel: Vector3 = Vector3.ZERO var fly_vel: Vector3 = Vector3.ZERO
var damage_modifier: float = 0.0 var damage_modifier: float = 0.0
+2 -1
View File
@@ -227,7 +227,8 @@ func _spawn_upgraded_enemy(pos: Vector3, type: String, level: int, w: int) -> Ch
add_child(enemy) add_child(enemy)
enemy.setup(type, w) enemy.setup(type, w)
enemy.target = player enemy.target = player
enemy.enemy_level = level + 1 enemy.enemy_level = level
enemy.tier = level
enemy.global_position = pos enemy.global_position = pos
enemy.connect("died", _on_enemy_died) enemy.connect("died", _on_enemy_died)
enemy.connect("merged", _on_enemy_merged) enemy.connect("merged", _on_enemy_merged)
+2 -2
View File
@@ -6,12 +6,12 @@ static var _list: Array[Dictionary] = [
{ {
"ingredients": ["leather", "stick"], "ingredients": ["leather", "stick"],
"result_scene": "res://scenes/LeatherBoots.tscn", "result_scene": "res://scenes/LeatherBoots.tscn",
"speed_threshold": 0.5, "speed_threshold": 18.0,
}, },
{ {
"ingredients": ["rock", "rock"], "ingredients": ["rock", "rock"],
"result_scene": "res://scenes/Boulder.tscn", "result_scene": "res://scenes/Boulder.tscn",
"speed_threshold": 5.0, "speed_threshold": 18.0,
}, },
] ]
+16 -3
View File
@@ -11,6 +11,7 @@ signal health_changed(current: int, maximum: int)
@export var max_health: int = 100 @export var max_health: int = 100
var health: int = max_health var health: int = max_health
var tier: int = 0
var kick_timer: float = 0.0 var kick_timer: float = 0.0
var invincible_timer: float = 0.0 var invincible_timer: float = 0.0
var is_alive: bool = true var is_alive: bool = true
@@ -135,9 +136,9 @@ func _do_kick() -> void:
forward.y = 0.0 forward.y = 0.0
forward = forward.normalized() if forward.length() > 0.01 else Vector3(0.0, 0.0, -1.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 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 var kicked_any := false
for e in enemies: for e in targets:
if not is_instance_valid(e): if not is_instance_valid(e):
continue continue
var en := e as Node3D var en := e as Node3D
@@ -149,7 +150,18 @@ func _do_kick() -> void:
if dist < 0.1 or dist > kick_range: if dist < 0.1 or dist > kick_range:
continue continue
if (diff / dist).dot(forward) >= half_cos: 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 kicked_any = true
if kicked_any: if kicked_any:
_squish_effect() _squish_effect()
@@ -218,6 +230,7 @@ func apply_upgrade(id: String) -> void:
emit_signal("health_changed", health, max_health) emit_signal("health_changed", health, max_health)
func apply_upgrade_boots(speed_bonus: float, _tier: int) -> void: func apply_upgrade_boots(speed_bonus: float, _tier: int) -> void:
tier += _tier
move_speed += speed_bonus move_speed += speed_bonus
var tw := create_tween() var tw := create_tween()
tw.tween_property(player_mat, "albedo_color", Color(1.0, 0.85, 0.2), 0.1) tw.tween_property(player_mat, "albedo_color", Color(1.0, 0.85, 0.2), 0.1)
+2 -1
View File
@@ -4,12 +4,13 @@ signal destroyed
enum State { IDLE, FLYING } enum State { IDLE, FLYING }
const AIR_FRICTION := 0.84 const AIR_FRICTION := 0.9
const MIN_SPEED := 0.5 const MIN_SPEED := 0.5
const WALL_BOUNCE := 0.5 const WALL_BOUNCE := 0.5
const WALL_SELF_DMG := 0.6 const WALL_SELF_DMG := 0.6
var kickable_type: String = "rock" var kickable_type: String = "rock"
var tier: int = 0
var state: State = State.IDLE var state: State = State.IDLE
var fly_vel: Vector3 = Vector3.ZERO var fly_vel: Vector3 = Vector3.ZERO
var health: float = 60.0 var health: float = 60.0
+1
View File
@@ -10,6 +10,7 @@ const WALL_BOUNCE := 0.5
const WALL_SELF_DMG := 0.5 const WALL_SELF_DMG := 0.5
var kickable_type: String = "stick" var kickable_type: String = "stick"
var tier: int = 0
var state: State = State.IDLE var state: State = State.IDLE
var fly_vel: Vector3 = Vector3.ZERO var fly_vel: Vector3 = Vector3.ZERO
var health: float = 40.0 var health: float = 40.0