Add utility strings, update game state with drone count and points calculation.

This commit is contained in:
Dan 2024-05-09 15:42:04 +01:00
parent d879ca30bd
commit 491395e6b9
7 changed files with 105 additions and 5 deletions

View file

@ -18,6 +18,7 @@ config/icon="res://icon.svg"
[autoload] [autoload]
GameState="*res://utility/game_state.gd" GameState="*res://utility/game_state.gd"
Str="*res://utility/utility_strings.gd"
[display] [display]

View file

@ -53,6 +53,7 @@ func spawn_drone(drone_type : String) -> void:
new_drone = dancer_drone.instantiate() new_drone = dancer_drone.instantiate()
# Hide the dancer button # Hide the dancer button
%SpawnDancer.visible = false %SpawnDancer.visible = false
GameState.game_start() # Start the game when the first dancer is placed
elif drone_type == "distractor": elif drone_type == "distractor":
new_drone = distractor_drone.instantiate() new_drone = distractor_drone.instantiate()
elif drone_type == "collector": elif drone_type == "collector":
@ -73,6 +74,8 @@ func spawn_drone(drone_type : String) -> void:
reset_node_highlights() reset_node_highlights()
GameState.add_drone() ## Increase drone count on the game state
func place_drone(drone_type : String) -> void: func place_drone(drone_type : String) -> void:
if !spawning_drone: if !spawning_drone:
Input.set_custom_mouse_cursor(cursor, Input.CURSOR_ARROW, Vector2(32, 32)) Input.set_custom_mouse_cursor(cursor, Input.CURSOR_ARROW, Vector2(32, 32))

View file

@ -37,7 +37,27 @@ theme_override_constants/margin_bottom = 10
[node name="CenterContainer" type="CenterContainer" parent="MarginContainer"] [node name="CenterContainer" type="CenterContainer" parent="MarginContainer"]
layout_mode = 2 layout_mode = 2
[node name="Label" type="Label" parent="MarginContainer/CenterContainer"] [node name="VBoxContainer" type="VBoxContainer" parent="MarginContainer/CenterContainer"]
layout_mode = 2
[node name="HappyBees" type="Label" parent="MarginContainer/CenterContainer/VBoxContainer"]
layout_mode = 2 layout_mode = 2
text = "The Bees Are Happy!" text = "The Bees Are Happy!"
label_settings = SubResource("LabelSettings_phhcy") label_settings = SubResource("LabelSettings_phhcy")
[node name="TimeSpent" type="Label" parent="MarginContainer/CenterContainer/VBoxContainer"]
unique_name_in_owner = true
layout_mode = 2
text = "Time Spent: "
[node name="DronesUsed" type="Label" parent="MarginContainer/CenterContainer/VBoxContainer"]
unique_name_in_owner = true
layout_mode = 2
text = "Drones Used:"
[node name="TotalPoints" type="Label" parent="MarginContainer/CenterContainer/VBoxContainer"]
unique_name_in_owner = true
layout_mode = 2
size_flags_horizontal = 4
theme_override_font_sizes/font_size = 18
text = "Total Points: "

View file

@ -1,8 +1,18 @@
extends Control extends Control
@onready var time_label = get_node("%TimeSpent")
@onready var drones_label = get_node("%DronesUsed")
@onready var points_label = get_node("%TotalPoints")
func _ready(): func _ready():
visible = false visible = false
func _process(_delta): func _process(_delta):
if GameState.level_complete == true: if GameState.level_complete == true:
update_points()
visible = true visible = true
func update_points():
time_label.text = "Time Spent: " + Str.seconds_to_hms(GameState.level_timer)
drones_label.text = "Drones Used: " + str(GameState.drones_used)
points_label.text = "Total Points: " + Str.format_number(GameState.level_points)

View file

@ -8,6 +8,7 @@ var last_update : float = 0
@onready var help_text_container = get_node("%HelpTextContainer") @onready var help_text_container = get_node("%HelpTextContainer")
@onready var help_text_items = help_text_container.get_children() @onready var help_text_items = help_text_container.get_children()
@onready var level_text_label = get_node("%LevelText") @onready var level_text_label = get_node("%LevelText")
@onready var level_timer_label = get_node("%LevelTimer")
func _ready(): func _ready():
@ -24,10 +25,12 @@ func _process(delta):
if GameState.level_complete: if GameState.level_complete:
update_ui() update_ui()
level_timer_label.text = Str.seconds_to_hms(GameState.level_timer)
func update_ui(): func update_ui():
nectar_bar.value = GameState.gathered_nectar nectar_bar.value = GameState.gathered_nectar
nectar_bar.max_value = GameState.required_nectar nectar_bar.max_value = GameState.required_nectar
func hide_help_text(): func hide_help_text():
for item in help_text_items: for item in help_text_items:
item.hide() item.hide()

View file

@ -1,7 +1,9 @@
class_name GameStateManager extends Node class_name GameStateManager extends Node
var level_timer : float = 0.0
var level_started : bool = false
var level_complete : bool = false var level_complete : bool = false
var level_complete_time : float = 0.0
var gathered_nectar : int = 0 : var gathered_nectar : int = 0 :
get: get:
@ -13,13 +15,37 @@ var gathered_nectar : int = 0 :
@export var required_nectar : int = 100 @export var required_nectar : int = 100
@export var level_par : int = 2 @export var level_par : int = 2
@export var level_text : String = "" @export var drones_used : int = 0
var level_points : int = 0 :
get:
return required_nectar * 100 - round(level_timer) * 10 - drones_used * 100
var judge_level_par : int = 0 :
get:
## Return an amount of points based on the difference between the number of drones_used and the level_par
## Using more drones than the par is bad and should result in less points
var diff = drones_used - level_par
if diff > 0:
return -diff * 100
else:
return 0
func _process(delta):
if level_started and !level_complete:
level_timer += delta
func add_nectar(): func add_nectar():
gathered_nectar += 1 gathered_nectar += 1
func add_drone():
drones_used += 1
func remove_drone():
drones_used -= 1
func game_start(): func game_start():
pass level_started = true
func game_win(): func game_win():
Log.pr("Game win") Log.pr("Game win")

View file

@ -0,0 +1,37 @@
class_name StringUtilities extends Node
func seconds_to_hms(seconds: float) -> String:
var ms = fmod(seconds, 1) * 100
var s = fmod(seconds, 60)
var m = fmod(seconds, 3600) / 60
var formatted : String = "%02d:%02d:%02d" % [m, s, ms]
return formatted
####
## Formats the given number with commas every 3 digits.
####
func format_number(number: int) -> String:
# Handle negative numbers by adding the "minus" sign in advance, as we discard it
# when looping over the number.
var formatted_number := "-" if sign(number) == -1 else ""
var index := 0
var number_string := str(abs(number))
for digit in number_string:
formatted_number += digit
var counter := number_string.length() - index
# Don't add a comma at the end of the number, but add a comma every 3 digits
# (taking into account the number's length).
if counter >= 2 and counter % 3 == 1:
formatted_number += ","
index += 1
return formatted_number
func float_to_percentage(value: float) -> String:
return "%d%%" % int(value * 100)