From ac1f29d11153df588a165a2c2d543fff8a247e18 Mon Sep 17 00:00:00 2001 From: Taevas Date: Sun, 20 Apr 2025 23:25:51 +0200 Subject: [PATCH] new timer + save times to save files (#3) --- elements/timer.tscn | 81 ++++++++++++++++++++ fonts/Knewave/Knewave-Regular.ttf | Bin 0 -> 31280 bytes fonts/Knewave/Knewave-Regular.ttf.import | 35 +++++++++ fonts/Knewave/OFL.txt | 93 +++++++++++++++++++++++ index.tscn | 42 +++++----- menus/main/save_file_manager.tscn | 40 ++++++---- save_files.gd | 15 +++- 7 files changed, 269 insertions(+), 37 deletions(-) create mode 100644 elements/timer.tscn create mode 100644 fonts/Knewave/Knewave-Regular.ttf create mode 100644 fonts/Knewave/Knewave-Regular.ttf.import create mode 100644 fonts/Knewave/OFL.txt diff --git a/elements/timer.tscn b/elements/timer.tscn new file mode 100644 index 0000000..3a2ae36 --- /dev/null +++ b/elements/timer.tscn @@ -0,0 +1,81 @@ +[gd_scene load_steps=5 format=3 uid="uid://xd3nsiglcdfc"] + +[ext_resource type="FontFile" uid="uid://c3fsj6knyiuhl" path="res://fonts/Knewave/Knewave-Regular.ttf" id="1_m1tld"] + +[sub_resource type="GDScript" id="GDScript_q235s"] +script/source = "extends VBoxContainer + +var enabled := false: + get: return enabled + set(value): + enabled = value + if value == true: + var save_file = SaveFiles.read(SaveFiles.selected_file) + if save_file.has(\"played_for\") and save_file.played_for is float: + seconds_spent_total = save_file.played_for + else: + seconds_spent_total = 0.0 + +var seconds_spent_total := 0.0: + get: return seconds_spent_total + set(value): + seconds_spent_total = value + $Total.text = \"Total: \" + seconds_to_readable(seconds_spent_total) +var seconds_spent_level_attempt := 0.0: + get: return seconds_spent_level_attempt + set(value): + seconds_spent_level_attempt = value + $Level.text = \"Level: \" + seconds_to_readable(seconds_spent_level_attempt) + +func _ready(): + var data = SaveFiles.read(SaveFiles.selected_file) + if data.has(\"played_for\") and data.played_for is float: + seconds_spent_total = data.played_for + +func seconds_to_readable(seconds: float) -> String: + var minutes: int = floor(seconds / 60) + return (\"%0*d\" % [2, minutes]) + \":\" + (\"%0*.3f\" % [6, seconds - (minutes * 60)]) + +func _physics_process(delta: float) -> void: + if enabled: + seconds_spent_total += delta + seconds_spent_level_attempt += delta +" + +[sub_resource type="LabelSettings" id="LabelSettings_m1tld"] +font = ExtResource("1_m1tld") +font_size = 32 +outline_size = 8 +outline_color = Color(1, 0, 1, 1) +shadow_size = 8 +shadow_color = Color(0, 0, 0, 1) + +[sub_resource type="LabelSettings" id="LabelSettings_2a86r"] +font = ExtResource("1_m1tld") +font_size = 24 +outline_size = 8 +outline_color = Color(0, 0, 1, 1) +shadow_size = 8 +shadow_color = Color(0, 0, 0, 1) + +[node name="Timer" type="VBoxContainer"] +process_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_right = -992.0 +offset_bottom = -563.0 +grow_horizontal = 2 +grow_vertical = 2 +theme_override_constants/separation = -5 +script = SubResource("GDScript_q235s") + +[node name="Total" type="Label" parent="."] +layout_mode = 2 +text = "Total timer" +label_settings = SubResource("LabelSettings_m1tld") + +[node name="Level" type="Label" parent="."] +layout_mode = 2 +text = "Level timer" +label_settings = SubResource("LabelSettings_2a86r") diff --git a/fonts/Knewave/Knewave-Regular.ttf b/fonts/Knewave/Knewave-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..a98f750e3805519654e50a6764ad8c3bba8bc44a GIT binary patch literal 31280 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

LoaXAEoBO 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

j*TI-Rxgmz? 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 literal 0 HcmV?d00001 diff --git a/fonts/Knewave/Knewave-Regular.ttf.import b/fonts/Knewave/Knewave-Regular.ttf.import new file mode 100644 index 0000000..b563747 --- /dev/null +++ b/fonts/Knewave/Knewave-Regular.ttf.import @@ -0,0 +1,35 @@ +[remap] + +importer="font_data_dynamic" +type="FontFile" +uid="uid://c3fsj6knyiuhl" +path="res://.godot/imported/Knewave-Regular.ttf-621ce63e5403426c07f1520fe86b0560.fontdata" + +[deps] + +source_file="res://fonts/Knewave/Knewave-Regular.ttf" +dest_files=["res://.godot/imported/Knewave-Regular.ttf-621ce63e5403426c07f1520fe86b0560.fontdata"] + +[params] + +Rendering=null +antialiasing=1 +generate_mipmaps=false +disable_embedded_bitmaps=true +multichannel_signed_distance_field=false +msdf_pixel_range=8 +msdf_size=48 +allow_system_fallback=true +force_autohinter=false +hinting=1 +subpixel_positioning=4 +keep_rounding_remainders=true +oversampling=0.0 +Fallbacks=null +fallbacks=[] +Compress=null +compress=true +preload=[] +language_support={} +script_support={} +opentype_features={} diff --git a/fonts/Knewave/OFL.txt b/fonts/Knewave/OFL.txt new file mode 100644 index 0000000..34f48fe --- /dev/null +++ b/fonts/Knewave/OFL.txt @@ -0,0 +1,93 @@ +Copyright (c) 2010, Tyler Finck , with Reserved Font Name: "Knewave". + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +https://openfontlicense.org + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/index.tscn b/index.tscn index ae6d27c..324fcda 100644 --- a/index.tscn +++ b/index.tscn @@ -1,10 +1,11 @@ -[gd_scene load_steps=4 format=3 uid="uid://ccgnnif026wb4"] +[gd_scene load_steps=5 format=3 uid="uid://ccgnnif026wb4"] + +[ext_resource type="PackedScene" uid="uid://xd3nsiglcdfc" path="res://elements/timer.tscn" id="1_356j3"] [sub_resource type="GDScript" id="GDScript_8n212"] script/source = "extends Node var playing: bool = false -var seconds_spent: float = 0.00 var changing_level: bool = false var current_level_int: int = 0 @@ -15,6 +16,8 @@ var levels = [ ] var area_resource = preload(\"res://menus/main/area.tscn\") +@onready var timer := $GUI/Timer + func _ready() -> void: var os_name = OS.get_name() if os_name == \"Web\": ## we can't quit the game on web @@ -58,11 +61,15 @@ func start_level(level_scene: PackedScene) -> void: Vector3.DOWN ) changing_level = false + timer.seconds_spent_level_attempt = 0.0 + timer.enabled = true func stop_level() -> void: + timer.enabled = false PhysicsServer3D.area_set_param(get_viewport().find_world_3d().space, PhysicsServer3D.AREA_PARAM_GRAVITY, 1) playing = false changing_level = true + SaveFiles.change_property(\"played_for\", timer.seconds_spent_total, SaveFiles.selected_file) var current_levels = get_current_levels() for level in current_levels: @@ -95,6 +102,7 @@ func restart_level() -> void: start_level(levels[current_level_int]) func pause_game() -> void: + SaveFiles.change_property(\"played_for\", timer.seconds_spent_total, SaveFiles.selected_file) if $Levels.process_mode == PROCESS_MODE_INHERIT: $Levels.process_mode = Node.PROCESS_MODE_DISABLED playing = false @@ -114,7 +122,6 @@ func fullscreen_game() -> void: DisplayServer.window_set_mode(DisplayServer.WindowMode.WINDOW_MODE_WINDOWED) func start_game() -> void: - seconds_spent = 0.0 current_level_int = 0 var current_levels = $Levels.get_children(true) @@ -125,14 +132,7 @@ func start_game() -> void: Input.set_mouse_mode(Input.MOUSE_MODE_HIDDEN) start_level(levels[0]) -func update_timer(delta: float) -> void: - if playing: - seconds_spent += delta - var minutes = floor(seconds_spent / 60) - $Informations/MarginContainer/Timer.text = (\"%0*d\" % [2, minutes]) + \":\" + (\"%0*.2f\" % [5, seconds_spent - (minutes * 60)]) - -func _process(delta: float) -> void: - update_timer(delta) +func _process(_delta: float) -> void: var current_levels = get_current_levels() if len(current_levels): var current_level = current_levels[0] @@ -166,6 +166,18 @@ outline_color = Color(0, 0, 0, 1) [node name="Game" type="Node"] script = SubResource("GDScript_8n212") +[node name="GUI" type="MarginContainer" parent="."] +offset_right = 201.0 +offset_bottom = 104.0 +rotation = 0.0523599 +theme_override_constants/margin_left = 15 +theme_override_constants/margin_top = 15 +theme_override_constants/margin_right = 15 +theme_override_constants/margin_bottom = 15 + +[node name="Timer" parent="GUI" instance=ExtResource("1_356j3")] +layout_mode = 2 + [node name="Informations" type="Control" parent="."] visible = false layout_mode = 3 @@ -186,14 +198,6 @@ grow_vertical = 2 theme_override_constants/margin_left = 10 theme_override_constants/margin_right = 10 -[node name="Timer" type="Label" parent="Informations/MarginContainer"] -layout_mode = 2 -size_flags_horizontal = 0 -size_flags_vertical = 8 -text = "00:00.0" -label_settings = SubResource("LabelSettings_0s07t") -vertical_alignment = 2 - [node name="VBoxContainer" type="VBoxContainer" parent="Informations/MarginContainer"] layout_mode = 2 theme_override_constants/separation = -5 diff --git a/menus/main/save_file_manager.tscn b/menus/main/save_file_manager.tscn index 9a86fb7..10688de 100644 --- a/menus/main/save_file_manager.tscn +++ b/menus/main/save_file_manager.tscn @@ -5,33 +5,37 @@ script/source = "extends Control signal request_start -@onready var label = $VBoxContainer/MarginContainer/VBoxContainer/Label +@onready var label_name = $VBoxContainer/MarginContainer/VBoxContainer/Description/Name +@onready var label_time = $VBoxContainer/MarginContainer/VBoxContainer/Description/Time func _on_save_1_pressed() -> void: - label.text = $VBoxContainer/Save1.text + label_name.text = $VBoxContainer/Save1.text display_file_data(SaveFiles.read(SaveFiles.names[0])) func _on_save_2_pressed() -> void: - label.text = $VBoxContainer/Save2.text + label_name.text = $VBoxContainer/Save2.text display_file_data(SaveFiles.read(SaveFiles.names[1])) func _on_save_3_pressed() -> void: - label.text = $VBoxContainer/Save3.text + label_name.text = $VBoxContainer/Save3.text display_file_data(SaveFiles.read(SaveFiles.names[2])) func display_file_data(data: Variant) -> void: $VBoxContainer/MarginContainer.show() - label.text += \" | \" - if data.has(\"played_for\"): - label.text += data.played_for + label_time.text = \" | \" + if data.has(\"played_for\") and data.played_for is float: + var seconds: float = data.played_for + var minutes: int = floor(seconds / 60) + label_time.text += (\"%0*d\" % [2, minutes]) + \":\" + (\"%0*.3f\" % [6, seconds - (minutes * 60)]) else: - label.text += \"00:00\" + label_time.text += \"00:00\" func _on_start_pressed() -> void: request_start.emit() func _on_delete_pressed() -> void: SaveFiles.empty(SaveFiles.selected_file) + display_file_data(SaveFiles.read(SaveFiles.selected_file)) " [node name="SaveFileManager" type="Control"] @@ -69,7 +73,6 @@ layout_mode = 2 text = "Save file #3" [node name="MarginContainer" type="MarginContainer" parent="VBoxContainer"] -visible = false layout_mode = 2 theme_override_constants/margin_left = 30 theme_override_constants/margin_top = 30 @@ -79,27 +82,34 @@ theme_override_constants/margin_bottom = 30 [node name="VBoxContainer" type="VBoxContainer" parent="VBoxContainer/MarginContainer"] layout_mode = 2 -[node name="Label" type="Label" parent="VBoxContainer/MarginContainer/VBoxContainer"] +[node name="Description" type="HBoxContainer" parent="VBoxContainer/MarginContainer/VBoxContainer"] +layout_mode = 2 +alignment = 1 + +[node name="Name" type="Label" parent="VBoxContainer/MarginContainer/VBoxContainer/Description"] layout_mode = 2 text = "Save File" horizontal_alignment = 1 -[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer/MarginContainer/VBoxContainer"] +[node name="Time" type="Label" parent="VBoxContainer/MarginContainer/VBoxContainer/Description"] +layout_mode = 2 + +[node name="Buttons" type="HBoxContainer" parent="VBoxContainer/MarginContainer/VBoxContainer"] layout_mode = 2 theme_override_constants/separation = 10 alignment = 1 -[node name="Start" type="Button" parent="VBoxContainer/MarginContainer/VBoxContainer/HBoxContainer"] +[node name="Start" type="Button" parent="VBoxContainer/MarginContainer/VBoxContainer/Buttons"] layout_mode = 2 size_flags_horizontal = 3 text = "Start" -[node name="Delete" type="Button" parent="VBoxContainer/MarginContainer/VBoxContainer/HBoxContainer"] +[node name="Delete" type="Button" parent="VBoxContainer/MarginContainer/VBoxContainer/Buttons"] layout_mode = 2 text = "Delete" [connection signal="pressed" from="VBoxContainer/Save1" to="." method="_on_save_1_pressed"] [connection signal="pressed" from="VBoxContainer/Save2" to="." method="_on_save_2_pressed"] [connection signal="pressed" from="VBoxContainer/Save3" to="." method="_on_save_3_pressed"] -[connection signal="pressed" from="VBoxContainer/MarginContainer/VBoxContainer/HBoxContainer/Start" to="." method="_on_start_pressed"] -[connection signal="pressed" from="VBoxContainer/MarginContainer/VBoxContainer/HBoxContainer/Delete" to="." method="_on_delete_pressed"] +[connection signal="pressed" from="VBoxContainer/MarginContainer/VBoxContainer/Buttons/Start" to="." method="_on_start_pressed"] +[connection signal="pressed" from="VBoxContainer/MarginContainer/VBoxContainer/Buttons/Delete" to="." method="_on_delete_pressed"] diff --git a/save_files.gd b/save_files.gd index 71e00f5..2a5013c 100644 --- a/save_files.gd +++ b/save_files.gd @@ -19,9 +19,7 @@ func ensure_existence(save_file_name: String) -> void: func empty(save_file_name: String) -> void: print("Writing an empty object on ", save_file_name) - var save_file := FileAccess.open(save_file_name, FileAccess.WRITE) - save_file.store_line(JSON.stringify({})) - save_file.store_line("FOR YOUR SAFETY, ALWAYS CHECK IF THE DATA OF THE FILES YOU DOWNLOAD LOOKS OKAY") + write(JSON.stringify({}), save_file_name) func read(save_file_name: String) -> Variant: ensure_existence(save_file_name) @@ -36,3 +34,14 @@ func read(save_file_name: String) -> Variant: return {} return json.data + +func write(json_string: String, save_file_name: String) -> void: + var save_file := FileAccess.open(save_file_name, FileAccess.WRITE) + save_file.store_line(json_string) + save_file.store_line("FOR YOUR SAFETY, ALWAYS CHECK IF THE DATA OF THE FILES YOU DOWNLOAD LOOKS OKAY") + +func change_property(property: String, value, save_file_name: String) -> void: + ensure_existence(save_file_name) + var data = read(save_file_name) + data[property] = value + write(JSON.stringify(data), save_file_name)