game: add xp orbs
This commit is contained in:
@@ -71,6 +71,7 @@ click={
|
|||||||
2d_physics/layer_1="Terrain"
|
2d_physics/layer_1="Terrain"
|
||||||
2d_physics/layer_2="Enemies"
|
2d_physics/layer_2="Enemies"
|
||||||
2d_physics/layer_3="Player"
|
2d_physics/layer_3="Player"
|
||||||
|
2d_physics/layer_4="XP"
|
||||||
|
|
||||||
[rendering]
|
[rendering]
|
||||||
|
|
||||||
|
@@ -86,3 +86,11 @@ func get_taunted():
|
|||||||
|
|
||||||
func toggle_god_mode(value: bool):
|
func toggle_god_mode(value: bool):
|
||||||
god_mode = value
|
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()
|
||||||
|
@@ -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="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"]
|
[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"]
|
[sub_resource type="CircleShape2D" id="CircleShape2D_3vyb7"]
|
||||||
radius = 8.0
|
radius = 8.0
|
||||||
|
|
||||||
|
[sub_resource type="CircleShape2D" id="CircleShape2D_qhqgy"]
|
||||||
|
radius = 8.0
|
||||||
|
|
||||||
[node name="Player" type="CharacterBody2D" groups=["damagable", "player"]]
|
[node name="Player" type="CharacterBody2D" groups=["damagable", "player"]]
|
||||||
collision_layer = 0
|
collision_layer = 0
|
||||||
script = ExtResource("1_g2els")
|
script = ExtResource("1_g2els")
|
||||||
@@ -21,3 +24,13 @@ shape = SubResource("CircleShape2D_3vyb7")
|
|||||||
|
|
||||||
[node name="AttackSword" parent="." node_paths=PackedStringArray("player") instance=ExtResource("3_qhqgy")]
|
[node name="AttackSword" parent="." node_paths=PackedStringArray("player") instance=ExtResource("3_qhqgy")]
|
||||||
player = NodePath("..")
|
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"]
|
||||||
|
@@ -9,6 +9,7 @@ var crit_chance: float = 0.05
|
|||||||
var crit_multiplier: float = 2.0
|
var crit_multiplier: float = 2.0
|
||||||
var move_speed: float = 200.0
|
var move_speed: float = 200.0
|
||||||
var attack_damage: float = 1.0
|
var attack_damage: float = 1.0
|
||||||
|
var pickup_radius: float = 50.0
|
||||||
|
|
||||||
func get_final(stat: String, modifiers: Array[PlayerStatsModifier]) -> Variant:
|
func get_final(stat: String, modifiers: Array[PlayerStatsModifier]) -> Variant:
|
||||||
var base_value = get(stat)
|
var base_value = get(stat)
|
||||||
|
@@ -2,3 +2,24 @@ class_name XPOrb
|
|||||||
extends Node2D
|
extends Node2D
|
||||||
|
|
||||||
@export var value: float
|
@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
|
||||||
|
@@ -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="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"]
|
[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"]]
|
[node name="XPOrb" type="Node2D" groups=["xp_orb"]]
|
||||||
script = ExtResource("1_me6n8")
|
script = ExtResource("1_me6n8")
|
||||||
|
|
||||||
[node name="Sprite2D" type="Sprite2D" parent="."]
|
[node name="Sprite2D" type="Sprite2D" parent="."]
|
||||||
texture = ExtResource("1_pkphv")
|
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")
|
||||||
|
Reference in New Issue
Block a user