From e3d68b5f2b97aba1f0b5c6b2c77dc8e72d17a1eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torjus=20H=C3=A5kestad?= Date: Tue, 19 Aug 2025 16:14:48 +0200 Subject: [PATCH] game: add xp orbs --- project.godot | 1 + scenes/player.gd | 8 ++++++++ scenes/player.tscn | 15 ++++++++++++++- scenes/player_stats.gd | 1 + scenes/xp_orb.gd | 21 +++++++++++++++++++++ scenes/xp_orb.tscn | 13 ++++++++++++- 6 files changed, 57 insertions(+), 2 deletions(-) diff --git a/project.godot b/project.godot index 9b0bfb5..18b5716 100644 --- a/project.godot +++ b/project.godot @@ -71,6 +71,7 @@ click={ 2d_physics/layer_1="Terrain" 2d_physics/layer_2="Enemies" 2d_physics/layer_3="Player" +2d_physics/layer_4="XP" [rendering] diff --git a/scenes/player.gd b/scenes/player.gd index 8fa53ca..5ef360e 100644 --- a/scenes/player.gd +++ b/scenes/player.gd @@ -86,3 +86,11 @@ func get_taunted(): func toggle_god_mode(value: bool): god_mode = value + + +func _on_pickup_area_area_entered(area: Area2D) -> void: + var body: XPOrb = area.get_parent() + if body.is_in_group(GlobalConst.GROUP_XP_ORB): + player_stats.current_xp += body.value + GlobalConst.sig_debug_stats_set.emit("player_xp", "%s" % player_stats.current_xp) + body.queue_free() diff --git a/scenes/player.tscn b/scenes/player.tscn index 5a068ef..9489c7b 100644 --- a/scenes/player.tscn +++ b/scenes/player.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=5 format=3 uid="uid://ca2so8fm3q8fe"] +[gd_scene load_steps=6 format=3 uid="uid://ca2so8fm3q8fe"] [ext_resource type="Texture2D" uid="uid://5x5wimok8uw2" path="res://assets/sprites/roguelikeChar_transparent.png" id="1_3vyb7"] [ext_resource type="Script" uid="uid://cvqaxckx4num3" path="res://scenes/player.gd" id="1_g2els"] @@ -7,6 +7,9 @@ [sub_resource type="CircleShape2D" id="CircleShape2D_3vyb7"] radius = 8.0 +[sub_resource type="CircleShape2D" id="CircleShape2D_qhqgy"] +radius = 8.0 + [node name="Player" type="CharacterBody2D" groups=["damagable", "player"]] collision_layer = 0 script = ExtResource("1_g2els") @@ -21,3 +24,13 @@ shape = SubResource("CircleShape2D_3vyb7") [node name="AttackSword" parent="." node_paths=PackedStringArray("player") instance=ExtResource("3_qhqgy")] player = NodePath("..") + +[node name="PickupArea" type="Area2D" parent="."] +collision_layer = 0 +collision_mask = 8 +monitorable = false + +[node name="CollisionShape2D" type="CollisionShape2D" parent="PickupArea"] +shape = SubResource("CircleShape2D_qhqgy") + +[connection signal="area_entered" from="PickupArea" to="." method="_on_pickup_area_area_entered"] diff --git a/scenes/player_stats.gd b/scenes/player_stats.gd index 5f8cba8..670f755 100644 --- a/scenes/player_stats.gd +++ b/scenes/player_stats.gd @@ -9,6 +9,7 @@ var crit_chance: float = 0.05 var crit_multiplier: float = 2.0 var move_speed: float = 200.0 var attack_damage: float = 1.0 +var pickup_radius: float = 50.0 func get_final(stat: String, modifiers: Array[PlayerStatsModifier]) -> Variant: var base_value = get(stat) diff --git a/scenes/xp_orb.gd b/scenes/xp_orb.gd index f84355a..5c08e6a 100644 --- a/scenes/xp_orb.gd +++ b/scenes/xp_orb.gd @@ -2,3 +2,24 @@ class_name XPOrb extends Node2D @export var value: float +@export var max_speed: float = 100.0 +@export var min_speed: float = 10.0 + +var player: Player + +func _ready() -> void: + player = get_tree().get_first_node_in_group(GlobalConst.GROUP_PLAYER) + +func _physics_process(delta: float) -> void: + if not player: + return + + var to_player = player.global_position - global_position + var dist = to_player.length() + var attract_radius = player.player_stats.get_final("pickup_radius", player.modifiers) + if dist < 4: + return + if dist < attract_radius: + var dir = to_player.normalized() + var speed = lerp(min_speed, max_speed, (attract_radius - dist) / attract_radius) + global_position += dir * speed * delta diff --git a/scenes/xp_orb.tscn b/scenes/xp_orb.tscn index a57e990..27a916c 100644 --- a/scenes/xp_orb.tscn +++ b/scenes/xp_orb.tscn @@ -1,10 +1,21 @@ -[gd_scene load_steps=3 format=3 uid="uid://du4dqne3o0d5b"] +[gd_scene load_steps=4 format=3 uid="uid://du4dqne3o0d5b"] [ext_resource type="Script" uid="uid://bx43us4qd2vpf" path="res://scenes/xp_orb.gd" id="1_me6n8"] [ext_resource type="Texture2D" uid="uid://crty0t7ryksqn" path="res://assets/sprites/xp_orb.png" id="1_pkphv"] +[sub_resource type="CircleShape2D" id="CircleShape2D_me6n8"] +radius = 7.0 + [node name="XPOrb" type="Node2D" groups=["xp_orb"]] script = ExtResource("1_me6n8") [node name="Sprite2D" type="Sprite2D" parent="."] texture = ExtResource("1_pkphv") + +[node name="Area2D" type="Area2D" parent="."] +collision_layer = 9 +monitoring = false + +[node name="CollisionShape2D" type="CollisionShape2D" parent="Area2D"] +position = Vector2(0, -1) +shape = SubResource("CircleShape2D_me6n8")