From 41b740be4f03a0dbd7bc26679523dbe5a7dd89fa Mon Sep 17 00:00:00 2001 From: Dustin Date: Thu, 10 Apr 2025 20:12:47 -0700 Subject: [PATCH] Stamina counter --- lib/components/Stamina_Component.gd | 26 +++++++++++++++ lib/components/Stamina_Component.tscn | 6 ++++ project.godot | 6 ++++ .../playerE/PlayerE-Movement_StateReceiver.gd | 5 ++- src/actors/players/playerE/PlayerE.gd | 32 ++++++++++++++++--- src/actors/players/playerE/PlayerE.tscn | 16 +++++++--- src/ui/HUD.gd | 2 ++ src/ui/HUD.tscn | 5 +-- 8 files changed, 87 insertions(+), 11 deletions(-) create mode 100644 lib/components/Stamina_Component.gd create mode 100644 lib/components/Stamina_Component.tscn diff --git a/lib/components/Stamina_Component.gd b/lib/components/Stamina_Component.gd new file mode 100644 index 0000000..b4db627 --- /dev/null +++ b/lib/components/Stamina_Component.gd @@ -0,0 +1,26 @@ +class_name StaminaComponent +extends Node + +export var max_stamina: int = 0 +onready var stamina :int = max_stamina + + +signal stamina_depleted() + +func reduce_stamina(_amount :int): + if _amount < 0: + push_error("ERROR: Only positive numbers in stamina component functions.") + stamina -= _amount + + if stamina <= 0: + emit_signal("stamina_depleted") + stamina = 0 + +func recover(recover_amount :int): + if recover_amount < 0: + push_error("ERROR: Only positive numbers in stamina component functions.") + return + stamina += recover_amount + + if stamina > max_stamina: + stamina = max_stamina diff --git a/lib/components/Stamina_Component.tscn b/lib/components/Stamina_Component.tscn new file mode 100644 index 0000000..d0dee5b --- /dev/null +++ b/lib/components/Stamina_Component.tscn @@ -0,0 +1,6 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://lib/components/Stamina_Component.gd" type="Script" id=1] + +[node name="Stamina_Component" type="Node"] +script = ExtResource( 1 ) diff --git a/project.godot b/project.godot index 61ef071..082d5ef 100644 --- a/project.godot +++ b/project.godot @@ -104,6 +104,11 @@ _global_script_classes=[ { "language": "GDScript", "path": "res://lib/classes/sound_effect_state_frame.gd" }, { +"base": "Node", +"class": "StaminaComponent", +"language": "GDScript", +"path": "res://lib/components/Stamina_Component.gd" +}, { "base": "Resource", "class": "State", "language": "GDScript", @@ -159,6 +164,7 @@ _global_script_class_icons={ "Movement_StateReceiver": "", "Projectile": "", "SE_StateFrame": "", +"StaminaComponent": "", "State": "", "StateAnimatedActor": "", "StateMachine": "", diff --git a/src/actors/players/playerE/PlayerE-Movement_StateReceiver.gd b/src/actors/players/playerE/PlayerE-Movement_StateReceiver.gd index 899e644..23c47ce 100644 --- a/src/actors/players/playerE/PlayerE-Movement_StateReceiver.gd +++ b/src/actors/players/playerE/PlayerE-Movement_StateReceiver.gd @@ -5,6 +5,9 @@ var parent_request_state_change :FuncRef var player_number: int = 1 onready var pew_machine = $"%PewMachine" +onready var stamina_component = $"%Stamina_Component" + +var state_stamina_cost :Dictionary func _ready(): var state_ref :State @@ -30,7 +33,7 @@ func get_movement_direction() -> float: var _wants_jump :bool func wants_jump() -> bool: - if Input.is_action_just_pressed("jump_" + str(player_number)): + if Input.is_action_just_pressed("jump_" + str(player_number)) and stamina_component.stamina >= state_stamina_cost["jump"]: desired_movement_vector.y = UP _wants_jump = true return true diff --git a/src/actors/players/playerE/PlayerE.gd b/src/actors/players/playerE/PlayerE.gd index bc2d17a..6557ddc 100644 --- a/src/actors/players/playerE/PlayerE.gd +++ b/src/actors/players/playerE/PlayerE.gd @@ -7,25 +7,44 @@ export var player_number: int = 1 # var b = "text" onready var player_inventory :InventoryManager = InventoryManager.new() +onready var stamina_component = $"%Stamina_Component" +onready var health_component = $"%Health_Component" var punch_item :Item = preload("res://assets/items/punch.tres") +const state_stamina_cost :Dictionary = { + "jump": 10, + "attack_sword":20 +} + # Called when the node enters the scene tree for the first time. func _ready(): - PlayerInfo.player_health = $Health_Component.health + PlayerInfo.player_health = health_component.health PlayerInfo.player_inventory = player_inventory + PlayerInfo.player_stamina = stamina_component.stamina # Set initial player position in world. global_position = LevelInfo.player_start_position player_inventory.add_to_inventory(punch_item) player_inventory.select_primary(punch_item) + + movement_component.state_stamina_cost = state_stamina_cost - +var stamina_recovery :float = 0.0 # Called every frame. 'delta' is the elapsed time since the previous frame. func _process(delta): PlayerInfo.player_position = global_position.round() + stamina_recovery += delta + if stamina_recovery > 1.0: + stamina_component.recover(1) + stamina_recovery = 0.0 + #print("recover ", stamina_component.stamina) + + PlayerInfo.player_stamina = stamina_component.stamina + + match movement_state_machine.current_state.name: "idle": if Input.is_action_just_released("switch_primary_item_" + str(player_number)): @@ -39,10 +58,10 @@ func _process(delta): func hit_Receiver(damage): $Hurtbox_Component.set_hurtbox(false) - $Health_Component.take_damage(damage) + health_component.take_damage(damage) if $Health_Component.health > 0: movement_state_machine.change_to_known_state('hurt') - PlayerInfo.player_health = $Health_Component.health + PlayerInfo.player_health = health_component.health if PlayerInfo.player_health <= 0: return yield( get_tree().create_timer(2 + movement_state_machine.get_state_reference('hurt').timeout_seconds), "timeout") @@ -111,3 +130,8 @@ func secondary_item() -> String: # _: # None # return true # return true + + +func _on_Movement_StateMachine_state_changed(old_state_name, new_state): + if new_state.name == "jump": + stamina_component.reduce_stamina(state_stamina_cost["jump"]) diff --git a/src/actors/players/playerE/PlayerE.tscn b/src/actors/players/playerE/PlayerE.tscn index 84dc05d..871db73 100644 --- a/src/actors/players/playerE/PlayerE.tscn +++ b/src/actors/players/playerE/PlayerE.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=35 format=2] +[gd_scene load_steps=36 format=2] [ext_resource path="res://lib/parent_scenes/actor.tscn" type="PackedScene" id=1] [ext_resource path="res://assets/actors/players/playerE/PlayerE_SpriteFrames.tres" type="SpriteFrames" id=2] @@ -28,6 +28,7 @@ [ext_resource path="res://assets_tmp/SE/land.wav" type="AudioStream" id=26] [ext_resource path="res://src/actors/players/playerE/states/attack_punch.tres" type="Resource" id=27] [ext_resource path="res://src/components/PewMachine.tscn" type="PackedScene" id=28] +[ext_resource path="res://lib/components/Stamina_Component.tscn" type="PackedScene" id=29] [sub_resource type="Resource" id=3] resource_local_to_scene = true @@ -131,9 +132,14 @@ position = Vector2( 0, 2 ) shape = SubResource( 1 ) [node name="Health_Component" parent="." index="8" instance=ExtResource( 17 )] +unique_name_in_owner = true max_health = 100 -[node name="Hurtbox_Component" parent="." index="9" instance=ExtResource( 16 )] +[node name="Stamina_Component" parent="." index="9" instance=ExtResource( 29 )] +unique_name_in_owner = true +max_stamina = 50 + +[node name="Hurtbox_Component" parent="." index="10" instance=ExtResource( 16 )] collision_layer = 16 collision_mask = 128 hurtbox_entered_function = "hit_Receiver" @@ -143,8 +149,10 @@ modulate = Color( 0, 0, 1, 1 ) position = Vector2( -1, 2 ) shape = SubResource( 2 ) -[node name="Interactable_Receiver" type="Node" parent="." index="10"] +[node name="Interactable_Receiver" type="Node" parent="." index="11"] script = ExtResource( 21 ) interactable_parent_callback = "touch_the_thing" -[node name="PewMachine" parent="." index="11" instance=ExtResource( 28 )] +[node name="PewMachine" parent="." index="12" instance=ExtResource( 28 )] + +[connection signal="state_changed" from="Movement_StateMachine" to="." method="_on_Movement_StateMachine_state_changed"] diff --git a/src/ui/HUD.gd b/src/ui/HUD.gd index a31677e..a4bce21 100644 --- a/src/ui/HUD.gd +++ b/src/ui/HUD.gd @@ -16,6 +16,8 @@ onready var DialogIndicator = $PanelContainer/Polygon2D onready var health_bar = $HealthBar +onready var stamina_bar = $StaminaBar + ## Cool I can bring this in with a ctrl drag onready var selected_inventory_items = $"%SelectedInventoryItems" diff --git a/src/ui/HUD.tscn b/src/ui/HUD.tscn index 1040419..d30ffe9 100644 --- a/src/ui/HUD.tscn +++ b/src/ui/HUD.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=9 format=2] +[gd_scene load_steps=10 format=2] [ext_resource path="res://icon.png" type="Texture" id=1] [ext_resource path="res://assets/Fonts/QuinqueFive.tres" type="DynamicFont" id=2] @@ -8,6 +8,7 @@ [ext_resource path="res://assets/UI/Healthbar-Indicator.png" type="Texture" id=6] [ext_resource path="res://assets/UI/Staminabar-Indicator.png" type="Texture" id=7] [ext_resource path="res://src/ui/SelectedInventoryItems.gd" type="Script" id=8] +[ext_resource path="res://src/ui/StaminaBar.gd" type="Script" id=9] [node name="HUD" type="CanvasLayer"] pause_mode = 2 @@ -71,7 +72,7 @@ value = 50.0 texture_under = ExtResource( 4 ) texture_progress = ExtResource( 7 ) texture_progress_offset = Vector2( 1, 1 ) -script = ExtResource( 5 ) +script = ExtResource( 9 ) [node name="Debug" type="Label" parent="."] anchor_left = 1.0