game: add xp orbs

This commit is contained in:
2025-08-19 16:14:48 +02:00
parent 9f5f628891
commit e3d68b5f2b
6 changed files with 57 additions and 2 deletions

View File

@@ -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()

View File

@@ -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"]

View File

@@ -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)

View File

@@ -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

View File

@@ -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")