From f1054637ed892790a59b70e0daa5c59a10ebce20 Mon Sep 17 00:00:00 2001 From: TechieDamien Date: Thu, 31 Jul 2025 15:15:06 +0100 Subject: [PATCH] Adds score tracking to level --- Scenes/main.tscn | 9 ++++++++- Scenes/score_display.tscn | 35 +++++++++++++++++++++++++++++++++++ Scripts/game_manager.gd | 3 +++ Scripts/game_manager.gd.uid | 1 + Scripts/score_display.gd | 34 ++++++++++++++++++++++++++++++++++ Scripts/score_display.gd.uid | 1 + Scripts/snake_part.gd | 3 ++- project.godot | 1 + 8 files changed, 85 insertions(+), 2 deletions(-) create mode 100644 Scenes/score_display.tscn create mode 100644 Scripts/game_manager.gd create mode 100644 Scripts/game_manager.gd.uid create mode 100644 Scripts/score_display.gd create mode 100644 Scripts/score_display.gd.uid diff --git a/Scenes/main.tscn b/Scenes/main.tscn index d745e17..5d6664a 100644 --- a/Scenes/main.tscn +++ b/Scenes/main.tscn @@ -1,8 +1,9 @@ -[gd_scene load_steps=4 format=3 uid="uid://bs6an72avch86"] +[gd_scene load_steps=5 format=3 uid="uid://bs6an72avch86"] [ext_resource type="PackedScene" uid="uid://gkqku38yb2ng" path="res://Scenes/level.tscn" id="1_bo1nx"] [ext_resource type="PackedScene" uid="uid://d0okbjqyaoe0w" path="res://Scenes/snake_part.tscn" id="2_8gbba"] [ext_resource type="PackedScene" uid="uid://bldekmt1rakjl" path="res://Scenes/fruit.tscn" id="3_8gbba"] +[ext_resource type="PackedScene" uid="uid://mp03fsd536be" path="res://Scenes/score_display.tscn" id="4_jjvhh"] [node name="Main" type="Node2D"] @@ -34,5 +35,11 @@ position = Vector2(707, 325) [node name="RestartTimer" type="Timer" parent="." groups=["GameClockPause"]] +[node name="ScoreDisplay" parent="." instance=ExtResource("4_jjvhh")] +offset_left = 4.0 +offset_top = 42.0 +offset_right = 156.0 +offset_bottom = 197.0 + [connection signal="area_exited" from="Level" to="SnakePart" method="_on_level_area_exited"] [connection signal="timeout" from="RestartTimer" to="Timer" method="start" binds= [0.3]] diff --git a/Scenes/score_display.tscn b/Scenes/score_display.tscn new file mode 100644 index 0000000..4c8dbe2 --- /dev/null +++ b/Scenes/score_display.tscn @@ -0,0 +1,35 @@ +[gd_scene load_steps=2 format=3 uid="uid://mp03fsd536be"] + +[ext_resource type="Script" uid="uid://bwiflwp3hufyu" path="res://Scripts/score_display.gd" id="1_abl27"] + +[node name="ScoreDisplay" type="VBoxContainer"] +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("1_abl27") + +[node name="ScoreLabel" type="Label" parent="."] +layout_mode = 2 +text = "Score +0" +horizontal_alignment = 1 + +[node name="LengthLabel" type="Label" parent="."] +layout_mode = 2 +text = "Length +3" +horizontal_alignment = 1 + +[node name="PendingLengthLabel" type="Label" parent="."] +layout_mode = 2 +text = "Length +3" +horizontal_alignment = 1 + +[node name="OuroborosPossibleLabel" type="Label" parent="."] +layout_mode = 2 +text = "Ouroboros Possible +No" +horizontal_alignment = 1 diff --git a/Scripts/game_manager.gd b/Scripts/game_manager.gd new file mode 100644 index 0000000..9e97be0 --- /dev/null +++ b/Scripts/game_manager.gd @@ -0,0 +1,3 @@ +extends Node + +var score : int = 0 diff --git a/Scripts/game_manager.gd.uid b/Scripts/game_manager.gd.uid new file mode 100644 index 0000000..48ad794 --- /dev/null +++ b/Scripts/game_manager.gd.uid @@ -0,0 +1 @@ +uid://ce6w51wxkuq4l diff --git a/Scripts/score_display.gd b/Scripts/score_display.gd new file mode 100644 index 0000000..37ef7cd --- /dev/null +++ b/Scripts/score_display.gd @@ -0,0 +1,34 @@ +extends VBoxContainer + +@onready +var score_label : Label = $ScoreLabel +@onready +var length_label : Label = $LengthLabel +@onready +var pending_length_label : Label = $PendingLengthLabel +@onready +var ouroboros_label : Label = $OuroborosPossibleLabel + +var ouroboros_possible : bool = false + +func _process(delta: float) -> void: + score_label.text = "Score\n{score}".format(GameManager) + length_label.text = "Length\n{0}".format([get_snake_length()]) + var head : Node = get_tree().get_first_node_in_group("Head") + if head is SnakePart: + pending_length_label.text = "Eventual Length\n{0}".format([get_snake_length() + head.queued_growth]) + if ouroboros_possible: + ouroboros_label.text = "Ouroboros Possible\nYes" + else: + ouroboros_label.text = "Ouroboros Possible\nNo" + +func get_snake_length() -> int: + var length : int = 0 + var obstacles : Array = get_tree().get_nodes_in_group("BlocksSpawn") + for obstacle in obstacles: + if obstacle is SnakePart: + if obstacle.state == obstacle.States.ALIVE: + length += 1 + + ouroboros_possible = !length % 2 + return length diff --git a/Scripts/score_display.gd.uid b/Scripts/score_display.gd.uid new file mode 100644 index 0000000..f9477eb --- /dev/null +++ b/Scripts/score_display.gd.uid @@ -0,0 +1 @@ +uid://bwiflwp3hufyu diff --git a/Scripts/snake_part.gd b/Scripts/snake_part.gd index 45e1751..8929e34 100644 --- a/Scripts/snake_part.gd +++ b/Scripts/snake_part.gd @@ -33,7 +33,7 @@ var timer_ref : Timer = $"../Timer" var next_part : SnakePart = null var skip_next_move_propagation : bool = false -var queued_growth : int = 21 +var queued_growth : int = 0 signal on_movement(new_dir) signal on_death @@ -238,6 +238,7 @@ func ouroboros() -> void: # The head can spawn a new snake if part_type == PartTypes.HEAD: + GameManager.score += 1 get_tree().get_first_node_in_group("GameClockPause").start(1) get_tree().get_first_node_in_group("GameClock").stop() spawn_new_snake() diff --git a/project.godot b/project.godot index beb344d..dbf7f45 100644 --- a/project.godot +++ b/project.godot @@ -17,6 +17,7 @@ config/icon="res://icon.svg" [autoload] GridManager="*res://Scripts/grid_manager.gd" +GameManager="*res://Scripts/game_manager.gd" [global_group]