diff --git a/.editorconfig b/.editorconfig
deleted file mode 100644
index 896c9db..0000000
--- a/.editorconfig
+++ /dev/null
@@ -1,232 +0,0 @@
-# Remove the line below if you want to inherit .editorconfig settings from higher directories
-root = true
-
-# C# files
-[*.cs]
-
-#### Core EditorConfig Options ####
-
-# Indentation and spacing
-indent_size = 4
-indent_style = space
-tab_width = 4
-
-# New line preferences
-end_of_line = crlf
-insert_final_newline = false
-
-#### .NET Coding Conventions ####
-
-# Organize usings
-dotnet_separate_import_directive_groups = false
-dotnet_sort_system_directives_first = false
-file_header_template = unset
-
-# this. and Me. preferences
-dotnet_style_qualification_for_event = false
-dotnet_style_qualification_for_field = false
-dotnet_style_qualification_for_method = false
-dotnet_style_qualification_for_property = false
-
-# Language keywords vs BCL types preferences
-dotnet_style_predefined_type_for_locals_parameters_members = true
-dotnet_style_predefined_type_for_member_access = true
-
-# Parentheses preferences
-dotnet_style_parentheses_in_arithmetic_binary_operators = always_for_clarity
-dotnet_style_parentheses_in_other_binary_operators = always_for_clarity
-dotnet_style_parentheses_in_other_operators = never_if_unnecessary
-dotnet_style_parentheses_in_relational_binary_operators = always_for_clarity
-
-# Modifier preferences
-dotnet_style_require_accessibility_modifiers = for_non_interface_members
-
-# Expression-level preferences
-dotnet_style_coalesce_expression = true
-dotnet_style_collection_initializer = true
-dotnet_style_explicit_tuple_names = true
-dotnet_style_namespace_match_folder = true
-dotnet_style_null_propagation = true
-dotnet_style_object_initializer = true
-dotnet_style_operator_placement_when_wrapping = beginning_of_line
-dotnet_style_prefer_auto_properties = true
-dotnet_style_prefer_collection_expression = when_types_loosely_match
-dotnet_style_prefer_compound_assignment = true
-dotnet_style_prefer_conditional_expression_over_assignment = true
-dotnet_style_prefer_conditional_expression_over_return = true
-dotnet_style_prefer_foreach_explicit_cast_in_source = when_strongly_typed
-dotnet_style_prefer_inferred_anonymous_type_member_names = true
-dotnet_style_prefer_inferred_tuple_names = true
-dotnet_style_prefer_is_null_check_over_reference_equality_method = true
-dotnet_style_prefer_simplified_boolean_expressions = true
-dotnet_style_prefer_simplified_interpolation = true
-
-# Field preferences
-dotnet_style_readonly_field = true
-
-# Parameter preferences
-dotnet_code_quality_unused_parameters = all
-
-# Suppression preferences
-dotnet_remove_unnecessary_suppression_exclusions = none
-
-# New line preferences
-dotnet_style_allow_multiple_blank_lines_experimental = false
-dotnet_style_allow_statement_immediately_after_block_experimental = false
-
-#### C# Coding Conventions ####
-
-# var preferences
-csharp_style_var_elsewhere = false
-csharp_style_var_for_built_in_types = false
-csharp_style_var_when_type_is_apparent = false
-
-# Expression-bodied members
-csharp_style_expression_bodied_accessors = true
-csharp_style_expression_bodied_constructors = false
-csharp_style_expression_bodied_indexers = true
-csharp_style_expression_bodied_lambdas = true
-csharp_style_expression_bodied_local_functions = true:suggestion
-csharp_style_expression_bodied_methods = false:suggestion
-csharp_style_expression_bodied_operators = true
-csharp_style_expression_bodied_properties = true
-
-# Pattern matching preferences
-csharp_style_pattern_matching_over_as_with_null_check = true
-csharp_style_pattern_matching_over_is_with_cast_check = true
-csharp_style_prefer_extended_property_pattern = true
-csharp_style_prefer_not_pattern = true
-csharp_style_prefer_pattern_matching = true:suggestion
-csharp_style_prefer_switch_expression = true
-
-# Null-checking preferences
-csharp_style_conditional_delegate_call = true
-
-# Modifier preferences
-csharp_prefer_static_anonymous_function = true
-csharp_prefer_static_local_function = false:silent
-csharp_preferred_modifier_order = public,private,protected,internal,file,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,required,volatile,async
-csharp_style_prefer_readonly_struct = true
-csharp_style_prefer_readonly_struct_member = true
-
-# Code-block preferences
-csharp_prefer_braces = true
-csharp_prefer_simple_using_statement = true
-csharp_style_namespace_declarations = file_scoped:error
-csharp_style_prefer_method_group_conversion = false
-csharp_style_prefer_primary_constructors = true
-csharp_style_prefer_top_level_statements = true
-
-# Expression-level preferences
-csharp_prefer_simple_default_expression = false:silent
-csharp_style_deconstructed_variable_declaration = true
-csharp_style_implicit_object_creation_when_type_is_apparent = true
-csharp_style_inlined_variable_declaration = true
-csharp_style_prefer_index_operator = false:silent
-csharp_style_prefer_local_over_anonymous_function = true
-csharp_style_prefer_null_check_over_type_check = true
-csharp_style_prefer_range_operator = false:silent
-csharp_style_prefer_tuple_swap = true
-csharp_style_prefer_utf8_string_literals = true
-csharp_style_throw_expression = true
-csharp_style_unused_value_assignment_preference = discard_variable
-csharp_style_unused_value_expression_statement_preference = discard_variable
-
-# 'using' directive preferences
-csharp_using_directive_placement = outside_namespace
-
-# New line preferences
-csharp_style_allow_blank_line_after_colon_in_constructor_initializer_experimental = true
-csharp_style_allow_blank_line_after_token_in_arrow_expression_clause_experimental = true
-csharp_style_allow_blank_line_after_token_in_conditional_expression_experimental = true
-csharp_style_allow_blank_lines_between_consecutive_braces_experimental = false
-csharp_style_allow_embedded_statements_on_same_line_experimental = true
-
-#### C# Formatting Rules ####
-
-# New line preferences
-csharp_new_line_before_catch = true
-csharp_new_line_before_else = true
-csharp_new_line_before_finally = true
-csharp_new_line_before_members_in_anonymous_types = true
-csharp_new_line_before_members_in_object_initializers = true
-csharp_new_line_before_open_brace = all
-csharp_new_line_between_query_expression_clauses = true
-
-# Indentation preferences
-csharp_indent_block_contents = true
-csharp_indent_braces = false
-csharp_indent_case_contents = true
-csharp_indent_case_contents_when_block = false
-csharp_indent_labels = one_less_than_current
-csharp_indent_switch_labels = true
-
-# Space preferences
-csharp_space_after_cast = false
-csharp_space_after_colon_in_inheritance_clause = true
-csharp_space_after_comma = true
-csharp_space_after_dot = false
-csharp_space_after_keywords_in_control_flow_statements = true
-csharp_space_after_semicolon_in_for_statement = true
-csharp_space_around_binary_operators = before_and_after
-csharp_space_around_declaration_statements = ignore
-csharp_space_before_colon_in_inheritance_clause = true
-csharp_space_before_comma = false
-csharp_space_before_dot = false
-csharp_space_before_open_square_brackets = false
-csharp_space_before_semicolon_in_for_statement = false
-csharp_space_between_empty_square_brackets = false
-csharp_space_between_method_call_empty_parameter_list_parentheses = false
-csharp_space_between_method_call_name_and_opening_parenthesis = false
-csharp_space_between_method_call_parameter_list_parentheses = false
-csharp_space_between_method_declaration_empty_parameter_list_parentheses = false
-csharp_space_between_method_declaration_name_and_open_parenthesis = false
-csharp_space_between_method_declaration_parameter_list_parentheses = false
-csharp_space_between_parentheses = false
-csharp_space_between_square_brackets = false
-
-# Wrapping preferences
-csharp_preserve_single_line_blocks = true
-csharp_preserve_single_line_statements = false
-
-#### Naming styles ####
-
-# Naming rules
-
-dotnet_naming_rule.interface_should_be_begins_with_i.severity = suggestion
-dotnet_naming_rule.interface_should_be_begins_with_i.symbols = interface
-dotnet_naming_rule.interface_should_be_begins_with_i.style = begins_with_i
-
-dotnet_naming_rule.types_should_be_pascal_case.severity = suggestion
-dotnet_naming_rule.types_should_be_pascal_case.symbols = types
-dotnet_naming_rule.types_should_be_pascal_case.style = pascal_case
-
-dotnet_naming_rule.non_field_members_should_be_pascal_case.severity = suggestion
-dotnet_naming_rule.non_field_members_should_be_pascal_case.symbols = non_field_members
-dotnet_naming_rule.non_field_members_should_be_pascal_case.style = pascal_case
-
-# Symbol specifications
-
-dotnet_naming_symbols.interface.applicable_kinds = interface
-dotnet_naming_symbols.interface.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
-dotnet_naming_symbols.interface.required_modifiers =
-
-dotnet_naming_symbols.types.applicable_kinds = class, struct, interface, enum
-dotnet_naming_symbols.types.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
-dotnet_naming_symbols.types.required_modifiers =
-
-dotnet_naming_symbols.non_field_members.applicable_kinds = property, event, method
-dotnet_naming_symbols.non_field_members.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
-dotnet_naming_symbols.non_field_members.required_modifiers =
-
-# Naming styles
-
-dotnet_naming_style.pascal_case.required_prefix =
-dotnet_naming_style.pascal_case.required_suffix =
-dotnet_naming_style.pascal_case.word_separator =
-dotnet_naming_style.pascal_case.capitalization = pascal_case
-
-dotnet_naming_style.begins_with_i.required_prefix = I
-dotnet_naming_style.begins_with_i.required_suffix =
-dotnet_naming_style.begins_with_i.word_separator =
-dotnet_naming_style.begins_with_i.capitalization = pascal_case
diff --git a/Fonts/Press_Start_2P/OFL.txt b/Fonts/Press_Start_2P/OFL.txt
deleted file mode 100644
index c0f4383..0000000
--- a/Fonts/Press_Start_2P/OFL.txt
+++ /dev/null
@@ -1,93 +0,0 @@
-Copyright 2012 The Press Start 2P Project Authors (cody@zone38.net), with Reserved Font Name "Press Start 2P".
-
-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:
-http://scripts.sil.org/OFL
-
-
------------------------------------------------------------
-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/Fonts/Press_Start_2P/PressStart2P-Regular.ttf b/Fonts/Press_Start_2P/PressStart2P-Regular.ttf
deleted file mode 100644
index 2442aff..0000000
Binary files a/Fonts/Press_Start_2P/PressStart2P-Regular.ttf and /dev/null differ
diff --git a/Fonts/Press_Start_2P/PressStart2P-Regular.ttf.import b/Fonts/Press_Start_2P/PressStart2P-Regular.ttf.import
deleted file mode 100644
index e37847a..0000000
--- a/Fonts/Press_Start_2P/PressStart2P-Regular.ttf.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="font_data_dynamic"
-type="FontFile"
-uid="uid://tftlwb1c4m0s"
-path="res://.godot/imported/PressStart2P-Regular.ttf-66018d3b5001161018825e3befc2483b.fontdata"
-
-[deps]
-
-source_file="res://Fonts/Press_Start_2P/PressStart2P-Regular.ttf"
-dest_files=["res://.godot/imported/PressStart2P-Regular.ttf-66018d3b5001161018825e3befc2483b.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=1
-oversampling=0.0
-Fallbacks=null
-fallbacks=[]
-Compress=null
-compress=true
-preload=[]
-language_support={}
-script_support={}
-opentype_features={}
diff --git a/Fonts/Unbounded/OFL.txt b/Fonts/Unbounded/OFL.txt
deleted file mode 100644
index b79099e..0000000
--- a/Fonts/Unbounded/OFL.txt
+++ /dev/null
@@ -1,93 +0,0 @@
-Copyright 2022 The Unbounded Project Authors (https://github.com/googlefonts/unbounded)
-
-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:
-http://scripts.sil.org/OFL
-
-
------------------------------------------------------------
-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/Fonts/Unbounded/README.txt b/Fonts/Unbounded/README.txt
deleted file mode 100644
index 3212b38..0000000
--- a/Fonts/Unbounded/README.txt
+++ /dev/null
@@ -1,70 +0,0 @@
-Unbounded Variable Font
-=======================
-
-This download contains Unbounded as both a variable font and static fonts.
-
-Unbounded is a variable font with this axis:
- wght
-
-This means all the styles are contained in a single file:
- Unbounded-VariableFont_wght.ttf
-
-If your app fully supports variable fonts, you can now pick intermediate styles
-that aren’t available as static fonts. Not all apps support variable fonts, and
-in those cases you can use the static font files for Unbounded:
- static/Unbounded-ExtraLight.ttf
- static/Unbounded-Light.ttf
- static/Unbounded-Regular.ttf
- static/Unbounded-Medium.ttf
- static/Unbounded-SemiBold.ttf
- static/Unbounded-Bold.ttf
- static/Unbounded-ExtraBold.ttf
- static/Unbounded-Black.ttf
-
-Get started
------------
-
-1. Install the font files you want to use
-
-2. Use your app's font picker to view the font family and all the
-available styles
-
-Learn more about variable fonts
--------------------------------
-
- https://developers.google.com/web/fundamentals/design-and-ux/typography/variable-fonts
- https://variablefonts.typenetwork.com
- https://medium.com/variable-fonts
-
-In desktop apps
-
- https://theblog.adobe.com/can-variable-fonts-illustrator-cc
- https://helpx.adobe.com/nz/photoshop/using/fonts.html#variable_fonts
-
-Online
-
- https://developers.google.com/fonts/docs/getting_started
- https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Fonts/Variable_Fonts_Guide
- https://developer.microsoft.com/en-us/microsoft-edge/testdrive/demos/variable-fonts
-
-Installing fonts
-
- MacOS: https://support.apple.com/en-us/HT201749
- Linux: https://www.google.com/search?q=how+to+install+a+font+on+gnu%2Blinux
- Windows: https://support.microsoft.com/en-us/help/314960/how-to-install-or-remove-a-font-in-windows
-
-Android Apps
-
- https://developers.google.com/fonts/docs/android
- https://developer.android.com/guide/topics/ui/look-and-feel/downloadable-fonts
-
-License
--------
-Please read the full license text (OFL.txt) to understand the permissions,
-restrictions and requirements for usage, redistribution, and modification.
-
-You can use them in your products & projects – print or digital,
-commercial or otherwise.
-
-This isn't legal advice, please consider consulting a lawyer and see the full
-license for all details.
diff --git a/Fonts/Unbounded/Unbounded-VariableFont_wght.ttf b/Fonts/Unbounded/Unbounded-VariableFont_wght.ttf
deleted file mode 100644
index 9700edc..0000000
Binary files a/Fonts/Unbounded/Unbounded-VariableFont_wght.ttf and /dev/null differ
diff --git a/Fonts/Unbounded/Unbounded-VariableFont_wght.ttf.import b/Fonts/Unbounded/Unbounded-VariableFont_wght.ttf.import
deleted file mode 100644
index 0c39871..0000000
--- a/Fonts/Unbounded/Unbounded-VariableFont_wght.ttf.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="font_data_dynamic"
-type="FontFile"
-uid="uid://c1qgn2c1mlfmn"
-path="res://.godot/imported/Unbounded-VariableFont_wght.ttf-e137eb5f6d0ed49225cd288ba102d03a.fontdata"
-
-[deps]
-
-source_file="res://Fonts/Unbounded/Unbounded-VariableFont_wght.ttf"
-dest_files=["res://.godot/imported/Unbounded-VariableFont_wght.ttf-e137eb5f6d0ed49225cd288ba102d03a.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=1
-oversampling=0.0
-Fallbacks=null
-fallbacks=[]
-Compress=null
-compress=true
-preload=[]
-language_support={}
-script_support={}
-opentype_features={}
diff --git a/GodotUtils b/GodotUtils
index eabd41d..26af6c0 160000
--- a/GodotUtils
+++ b/GodotUtils
@@ -1 +1 @@
-Subproject commit eabd41dc3ade146dc1cb9fd86810174714510343
+Subproject commit 26af6c09101b94c26d185a8358b2a566fbd40da0
diff --git a/Localisation/text.csv b/Localisation/text.csv
deleted file mode 100644
index dbb8898..0000000
--- a/Localisation/text.csv
+++ /dev/null
@@ -1,37 +0,0 @@
-keys,en,fr,ja
-PLAY,Play,Jouer,遊ぶ
-OPTIONS,Options,Choix,オプション
-QUIT,Quit,Arrêter,やめる
-RESUME,Resume,Continuer,履歴書
-MAIN MENU,Main Menu,Menu Principal,メインメニュー
-CREDITS,Credits,Crédits,クレジット
-GENERAL,General,Général,全般的
-DISPLAY,Display,Afficher,画面
-AUDIO,Audio,l'audio,オーディオ
-INPUT,Input,Saisir,入力
-RESET_TO_DEFAULTS,Reset to Defaults,Réinitialiser les paramètres par défaut,既定値にリセット
-LANGUAGE,Language,Langue,言語
-WINDOW_MODE,Window Mode,Fenêtre Mode,窓モード
-WINDOW_SIZE,Window Size,Fenêtre Taille,窓サイズ
-VSYNC_MODE,VSync Mode,VSync Mode,垂直同期モード
-MAX_FPS,Max FPS,Max FPS,マックス FPS
-UNLIMITED,Unlimited,Illimité,無制限
-ENABLED,Enabled,Activé,有効
-DISABLED,Disabled,Désactivé,無効
-ADAPTIVE,Adaptive,Adaptatif,アダプティブ
-WINDOWED,Windowed,Fenêtré,ウィンドウ付き
-BORDERLESS,Borderless,Sans bordure,ボーダレス
-FULLSCREEN,Fullscreen,Plein écran,全画面表示
-APPLY,Apply,Appliquer,申し込み
-MUSIC,Music,Musique,音楽
-SOUNDS,Sounds,Des sons,サウンド
-PAUSE,Pause,Pause,一時停止
-TEMPLATE,Template,Modèle,レンプレート
-LICENSED,Licensed,Autorisé,認可済み
-INTERACT,Interact,Interagir,相互作用
-SPRINT,Sprint,Sprint,スプリント
-JUMP,Jump,Saut,ジャンプ
-MOVE_LEFT,Move Left,Se déplacer à gauche,左に移動
-MOVE_RIGHT,Move Right,Déplacer vers la droite,右に動く
-MOVE_UP,Move Up,Déplacer vers le haut,上に移動
-MOVE_DOWN,Move Down,Descendre,下に移動
\ No newline at end of file
diff --git a/Localisation/text.csv.import b/Localisation/text.csv.import
deleted file mode 100644
index 9dbda90..0000000
--- a/Localisation/text.csv.import
+++ /dev/null
@@ -1,17 +0,0 @@
-[remap]
-
-importer="csv_translation"
-type="Translation"
-uid="uid://b2enpily4v0j4"
-
-[deps]
-
-files=["res://Localisation/text.en.translation", "res://Localisation/text.fr.translation", "res://Localisation/text.ja.translation"]
-
-source_file="res://Localisation/text.csv"
-dest_files=["res://Localisation/text.en.translation", "res://Localisation/text.fr.translation", "res://Localisation/text.ja.translation"]
-
-[params]
-
-compress=true
-delimiter=0
diff --git a/Localisation/text.en.translation b/Localisation/text.en.translation
deleted file mode 100644
index fdd652d..0000000
Binary files a/Localisation/text.en.translation and /dev/null differ
diff --git a/Localisation/text.fr.translation b/Localisation/text.fr.translation
deleted file mode 100644
index 50d450f..0000000
Binary files a/Localisation/text.fr.translation and /dev/null differ
diff --git a/Localisation/text.ja.translation b/Localisation/text.ja.translation
deleted file mode 100644
index b6e9739..0000000
Binary files a/Localisation/text.ja.translation and /dev/null differ
diff --git a/Scenes/Prefabs/options.tscn b/Scenes/Prefabs/options.tscn
deleted file mode 100644
index f367bd3..0000000
--- a/Scenes/Prefabs/options.tscn
+++ /dev/null
@@ -1,271 +0,0 @@
-[gd_scene load_steps=11 format=3 uid="uid://cbajm5a75aiwu"]
-
-[ext_resource type="Theme" uid="uid://bi0f2eo0ywyyf" path="res://Themes/main.tres" id="1_0kbby"]
-[ext_resource type="Script" path="res://Scripts/UI/Options/UIOptions.cs" id="1_xjg3i"]
-[ext_resource type="Script" path="res://Scripts/UI/Options/UIOptionsNav.cs" id="2_w30yg"]
-[ext_resource type="Theme" uid="uid://8f4q252ns4xm" path="res://Themes/nav_btns.tres" id="3_mvq8n"]
-[ext_resource type="Script" path="res://Scripts/UI/Options/UIOptionsGeneral.cs" id="3_vefex"]
-[ext_resource type="Script" path="res://Scripts/UI/Options/UIOptionsDisplay.cs" id="4_o6e7i"]
-[ext_resource type="Script" path="res://Scripts/UI/Options/UIOptionsAudio.cs" id="5_hbpj8"]
-[ext_resource type="Script" path="res://Scripts/UI/Options/UIOptionsInput.cs" id="6_n2qcv"]
-
-[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_v8h3e"]
-bg_color = Color(0, 0, 0, 0.392157)
-
-[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_ijcjj"]
-
-[node name="Options" type="PanelContainer"]
-anchors_preset = 15
-anchor_right = 1.0
-anchor_bottom = 1.0
-grow_horizontal = 2
-grow_vertical = 2
-theme = ExtResource("1_0kbby")
-theme_override_styles/panel = SubResource("StyleBoxFlat_v8h3e")
-script = ExtResource("1_xjg3i")
-
-[node name="Margin" type="MarginContainer" parent="."]
-layout_mode = 2
-theme_override_constants/margin_left = 50
-theme_override_constants/margin_top = 50
-theme_override_constants/margin_right = 50
-theme_override_constants/margin_bottom = 50
-
-[node name="HBox" type="HBoxContainer" parent="Margin"]
-layout_mode = 2
-theme_override_constants/separation = 30
-
-[node name="Nav" type="VBoxContainer" parent="Margin/HBox"]
-layout_mode = 2
-theme = ExtResource("3_mvq8n")
-theme_override_constants/separation = 0
-alignment = 1
-script = ExtResource("2_w30yg")
-
-[node name="General" type="Button" parent="Margin/HBox/Nav"]
-custom_minimum_size = Vector2(150, 0)
-layout_mode = 2
-text = "GENERAL"
-
-[node name="Display" type="Button" parent="Margin/HBox/Nav"]
-custom_minimum_size = Vector2(150, 0)
-layout_mode = 2
-text = "DISPLAY"
-
-[node name="Audio" type="Button" parent="Margin/HBox/Nav"]
-custom_minimum_size = Vector2(150, 0)
-layout_mode = 2
-text = "AUDIO"
-
-[node name="Input" type="Button" parent="Margin/HBox/Nav"]
-custom_minimum_size = Vector2(150, 0)
-layout_mode = 2
-text = "INPUT"
-
-[node name="Content" type="PanelContainer" parent="Margin/HBox"]
-layout_mode = 2
-size_flags_horizontal = 3
-theme_override_styles/panel = SubResource("StyleBoxEmpty_ijcjj")
-
-[node name="General" type="VBoxContainer" parent="Margin/HBox/Content"]
-visible = false
-layout_mode = 2
-script = ExtResource("3_vefex")
-
-[node name="Language" type="HBoxContainer" parent="Margin/HBox/Content/General"]
-layout_mode = 2
-
-[node name="Label" type="Label" parent="Margin/HBox/Content/General/Language"]
-custom_minimum_size = Vector2(200, 0)
-layout_mode = 2
-text = "LANGUAGE"
-
-[node name="Language" type="OptionButton" parent="Margin/HBox/Content/General/Language"]
-layout_mode = 2
-item_count = 3
-selected = 0
-popup/item_0/text = "English"
-popup/item_0/id = 0
-popup/item_1/text = "French"
-popup/item_1/id = 1
-popup/item_2/text = "Japanese"
-popup/item_2/id = 2
-
-[node name="Display" type="VBoxContainer" parent="Margin/HBox/Content"]
-layout_mode = 2
-theme_override_constants/separation = 10
-script = ExtResource("4_o6e7i")
-
-[node name="WindowMode" type="HBoxContainer" parent="Margin/HBox/Content/Display"]
-layout_mode = 2
-
-[node name="Label" type="Label" parent="Margin/HBox/Content/Display/WindowMode"]
-custom_minimum_size = Vector2(200, 0)
-layout_mode = 2
-text = "WINDOW_MODE"
-
-[node name="WindowMode" type="OptionButton" parent="Margin/HBox/Content/Display/WindowMode"]
-layout_mode = 2
-item_count = 3
-selected = 0
-popup/item_0/text = "WINDOWED"
-popup/item_0/id = 0
-popup/item_1/text = "BORDERLESS"
-popup/item_1/id = 1
-popup/item_2/text = "FULLSCREEN"
-popup/item_2/id = 2
-
-[node name="WindowSize" type="HBoxContainer" parent="Margin/HBox/Content/Display"]
-layout_mode = 2
-
-[node name="Label" type="Label" parent="Margin/HBox/Content/Display/WindowSize"]
-custom_minimum_size = Vector2(200, 0)
-layout_mode = 2
-text = "WINDOW_SIZE"
-
-[node name="HBox" type="HBoxContainer" parent="Margin/HBox/Content/Display/WindowSize"]
-layout_mode = 2
-theme_override_constants/separation = 10
-
-[node name="WindowWidth" type="LineEdit" parent="Margin/HBox/Content/Display/WindowSize/HBox"]
-layout_mode = 2
-text = "1920"
-alignment = 1
-
-[node name="Label" type="Label" parent="Margin/HBox/Content/Display/WindowSize/HBox"]
-layout_mode = 2
-text = "x"
-
-[node name="WindowHeight" type="LineEdit" parent="Margin/HBox/Content/Display/WindowSize/HBox"]
-layout_mode = 2
-text = "1080"
-alignment = 1
-
-[node name="WindowSizeApply" type="Button" parent="Margin/HBox/Content/Display/WindowSize/HBox"]
-custom_minimum_size = Vector2(75, 0)
-layout_mode = 2
-text = "APPLY"
-
-[node name="VSyncMode" type="HBoxContainer" parent="Margin/HBox/Content/Display"]
-layout_mode = 2
-
-[node name="Label" type="Label" parent="Margin/HBox/Content/Display/VSyncMode"]
-custom_minimum_size = Vector2(200, 0)
-layout_mode = 2
-text = "VSYNC_MODE"
-
-[node name="VSyncMode" type="OptionButton" parent="Margin/HBox/Content/Display/VSyncMode"]
-layout_mode = 2
-tooltip_text = "VSync synchronizes the frame rate of the game with the monitor's refresh rate. Enable this to get rid of screen tearing. Disable this if stuttering is experienced."
-item_count = 3
-selected = 1
-popup/item_0/text = "DISABLED"
-popup/item_0/id = 0
-popup/item_1/text = "ENABLED"
-popup/item_1/id = 1
-popup/item_2/text = "ADAPTIVE"
-popup/item_2/id = 2
-
-[node name="MaxFPS" type="HBoxContainer" parent="Margin/HBox/Content/Display"]
-layout_mode = 2
-
-[node name="Label" type="Label" parent="Margin/HBox/Content/Display/MaxFPS"]
-custom_minimum_size = Vector2(200, 0)
-layout_mode = 2
-text = "MAX_FPS"
-
-[node name="HBox" type="HBoxContainer" parent="Margin/HBox/Content/Display/MaxFPS"]
-layout_mode = 2
-theme_override_constants/separation = 20
-
-[node name="MaxFPS" type="HSlider" parent="Margin/HBox/Content/Display/MaxFPS/HBox"]
-custom_minimum_size = Vector2(250, 0)
-layout_mode = 2
-size_flags_vertical = 4
-max_value = 120.0
-allow_greater = true
-
-[node name="Panel" type="PanelContainer" parent="Margin/HBox/Content/Display/MaxFPS/HBox"]
-layout_mode = 2
-
-[node name="Margin" type="MarginContainer" parent="Margin/HBox/Content/Display/MaxFPS/HBox/Panel"]
-layout_mode = 2
-theme_override_constants/margin_left = 10
-theme_override_constants/margin_top = 5
-theme_override_constants/margin_right = 10
-theme_override_constants/margin_bottom = 5
-
-[node name="MaxFPSFeedback" type="Label" parent="Margin/HBox/Content/Display/MaxFPS/HBox/Panel/Margin"]
-layout_mode = 2
-text = "UNLIMITED"
-vertical_alignment = 1
-
-[node name="Audio" type="VBoxContainer" parent="Margin/HBox/Content"]
-visible = false
-layout_mode = 2
-theme_override_constants/separation = 20
-script = ExtResource("5_hbpj8")
-
-[node name="Music" type="HBoxContainer" parent="Margin/HBox/Content/Audio"]
-layout_mode = 2
-
-[node name="Label" type="Label" parent="Margin/HBox/Content/Audio/Music"]
-custom_minimum_size = Vector2(200, 0)
-layout_mode = 2
-text = "MUSIC"
-
-[node name="Music" type="HSlider" parent="Margin/HBox/Content/Audio/Music"]
-custom_minimum_size = Vector2(400, 0)
-layout_mode = 2
-size_flags_vertical = 4
-value = 100.0
-
-[node name="Sounds" type="HBoxContainer" parent="Margin/HBox/Content/Audio"]
-layout_mode = 2
-
-[node name="Label" type="Label" parent="Margin/HBox/Content/Audio/Sounds"]
-custom_minimum_size = Vector2(200, 0)
-layout_mode = 2
-text = "SOUNDS"
-
-[node name="Sounds" type="HSlider" parent="Margin/HBox/Content/Audio/Sounds"]
-custom_minimum_size = Vector2(400, 0)
-layout_mode = 2
-size_flags_vertical = 4
-value = 75.0
-
-[node name="Input" type="VBoxContainer" parent="Margin/HBox/Content"]
-visible = false
-layout_mode = 2
-script = ExtResource("6_n2qcv")
-
-[node name="Scroll" type="ScrollContainer" parent="Margin/HBox/Content/Input"]
-layout_mode = 2
-size_flags_vertical = 3
-
-[node name="VBox" type="VBoxContainer" parent="Margin/HBox/Content/Input/Scroll"]
-layout_mode = 2
-
-[node name="ResetToDefaults" type="Button" parent="Margin/HBox/Content/Input"]
-custom_minimum_size = Vector2(200, 0)
-layout_mode = 2
-size_flags_horizontal = 4
-text = "RESET_TO_DEFAULTS"
-
-[connection signal="pressed" from="Margin/HBox/Nav/General" to="Margin/HBox/Nav" method="_on_general_pressed"]
-[connection signal="pressed" from="Margin/HBox/Nav/Display" to="Margin/HBox/Nav" method="_on_display_pressed"]
-[connection signal="pressed" from="Margin/HBox/Nav/Audio" to="Margin/HBox/Nav" method="_on_audio_pressed"]
-[connection signal="pressed" from="Margin/HBox/Nav/Input" to="Margin/HBox/Nav" method="_on_input_pressed"]
-[connection signal="item_selected" from="Margin/HBox/Content/General/Language/Language" to="Margin/HBox/Content/General" method="_on_language_item_selected"]
-[connection signal="item_selected" from="Margin/HBox/Content/Display/WindowMode/WindowMode" to="Margin/HBox/Content/Display" method="_on_window_mode_item_selected"]
-[connection signal="text_changed" from="Margin/HBox/Content/Display/WindowSize/HBox/WindowWidth" to="Margin/HBox/Content/Display" method="_on_window_width_text_changed"]
-[connection signal="text_submitted" from="Margin/HBox/Content/Display/WindowSize/HBox/WindowWidth" to="Margin/HBox/Content/Display" method="_on_window_width_text_submitted"]
-[connection signal="text_changed" from="Margin/HBox/Content/Display/WindowSize/HBox/WindowHeight" to="Margin/HBox/Content/Display" method="_on_window_height_text_changed"]
-[connection signal="text_submitted" from="Margin/HBox/Content/Display/WindowSize/HBox/WindowHeight" to="Margin/HBox/Content/Display" method="_on_window_height_text_submitted"]
-[connection signal="pressed" from="Margin/HBox/Content/Display/WindowSize/HBox/WindowSizeApply" to="Margin/HBox/Content/Display" method="_on_window_size_apply_pressed"]
-[connection signal="item_selected" from="Margin/HBox/Content/Display/VSyncMode/VSyncMode" to="Margin/HBox/Content/Display" method="_on_v_sync_mode_item_selected"]
-[connection signal="drag_ended" from="Margin/HBox/Content/Display/MaxFPS/HBox/MaxFPS" to="Margin/HBox/Content/Display" method="_on_max_fps_drag_ended"]
-[connection signal="value_changed" from="Margin/HBox/Content/Display/MaxFPS/HBox/MaxFPS" to="Margin/HBox/Content/Display" method="_on_max_fps_value_changed"]
-[connection signal="value_changed" from="Margin/HBox/Content/Audio/Music/Music" to="Margin/HBox/Content/Audio" method="_on_music_value_changed"]
-[connection signal="value_changed" from="Margin/HBox/Content/Audio/Sounds/Sounds" to="Margin/HBox/Content/Audio" method="_on_sounds_value_changed"]
-[connection signal="pressed" from="Margin/HBox/Content/Input/ResetToDefaults" to="Margin/HBox/Content/Input" method="_on_reset_to_defaults_pressed"]
diff --git a/Scenes/Prefabs/popup_menu.tscn b/Scenes/Prefabs/popup_menu.tscn
deleted file mode 100644
index cb4da30..0000000
--- a/Scenes/Prefabs/popup_menu.tscn
+++ /dev/null
@@ -1,59 +0,0 @@
-[gd_scene load_steps=4 format=3 uid="uid://c6pism2kgjr5c"]
-
-[ext_resource type="Theme" uid="uid://bi0f2eo0ywyyf" path="res://Themes/main.tres" id="1_8kp65"]
-[ext_resource type="Script" path="res://Scripts/UI/UIPopupMenu.cs" id="2_g08n2"]
-
-[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_j3vts"]
-
-[node name="UIPopupMenu" type="PanelContainer"]
-visible = false
-anchors_preset = 15
-anchor_right = 1.0
-anchor_bottom = 1.0
-grow_horizontal = 2
-grow_vertical = 2
-mouse_filter = 2
-theme = ExtResource("1_8kp65")
-theme_override_styles/panel = SubResource("StyleBoxEmpty_j3vts")
-script = ExtResource("2_g08n2")
-
-[node name="Center" type="CenterContainer" parent="."]
-layout_mode = 2
-
-[node name="Panel" type="PanelContainer" parent="Center"]
-layout_mode = 2
-
-[node name="Margin" type="MarginContainer" parent="Center/Panel"]
-layout_mode = 2
-theme_override_constants/margin_left = 50
-theme_override_constants/margin_top = 30
-theme_override_constants/margin_right = 50
-theme_override_constants/margin_bottom = 30
-
-[node name="Nav" type="VBoxContainer" parent="Center/Panel/Margin"]
-layout_mode = 2
-
-[node name="Resume" type="Button" parent="Center/Panel/Margin/Nav"]
-custom_minimum_size = Vector2(150, 0)
-layout_mode = 2
-text = "RESUME"
-
-[node name="Options" type="Button" parent="Center/Panel/Margin/Nav"]
-custom_minimum_size = Vector2(150, 0)
-layout_mode = 2
-text = "OPTIONS"
-
-[node name="Main Menu" type="Button" parent="Center/Panel/Margin/Nav"]
-custom_minimum_size = Vector2(150, 0)
-layout_mode = 2
-text = "MAIN MENU"
-
-[node name="Quit" type="Button" parent="Center/Panel/Margin/Nav"]
-custom_minimum_size = Vector2(150, 0)
-layout_mode = 2
-text = "QUIT"
-
-[connection signal="pressed" from="Center/Panel/Margin/Nav/Resume" to="." method="_on_resume_pressed"]
-[connection signal="pressed" from="Center/Panel/Margin/Nav/Options" to="." method="_on_options_pressed"]
-[connection signal="pressed" from="Center/Panel/Margin/Nav/Main Menu" to="." method="_on_main_menu_pressed"]
-[connection signal="pressed" from="Center/Panel/Margin/Nav/Quit" to="." method="_on_quit_pressed"]
diff --git a/Scenes/credits.tscn b/Scenes/credits.tscn
deleted file mode 100644
index 81f1949..0000000
--- a/Scenes/credits.tscn
+++ /dev/null
@@ -1,38 +0,0 @@
-[gd_scene load_steps=3 format=3 uid="uid://rbcqvr4snrvn"]
-
-[ext_resource type="Script" path="res://Scripts/UI/UICredits.cs" id="1_2ybu5"]
-
-[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_qx1q1"]
-bg_color = Color(0, 0, 0, 1)
-
-[node name="Credits" type="Panel"]
-anchors_preset = 15
-anchor_right = 1.0
-anchor_bottom = 1.0
-grow_horizontal = 2
-grow_vertical = 2
-theme_override_styles/panel = SubResource("StyleBoxFlat_qx1q1")
-script = ExtResource("1_2ybu5")
-
-[node name="HBox" type="HBoxContainer" parent="."]
-layout_mode = 1
-anchors_preset = 3
-anchor_left = 1.0
-anchor_top = 1.0
-anchor_right = 1.0
-anchor_bottom = 1.0
-offset_left = -40.0
-offset_top = -40.0
-grow_horizontal = 0
-grow_vertical = 0
-
-[node name="Pause" type="Button" parent="HBox"]
-layout_mode = 2
-text = "PAUSE"
-
-[node name="Speed" type="Button" parent="HBox"]
-layout_mode = 2
-text = "1.0x"
-
-[connection signal="pressed" from="HBox/Pause" to="." method="_on_pause_pressed"]
-[connection signal="pressed" from="HBox/Speed" to="." method="_on_speed_pressed"]
diff --git a/Scenes/level_3D.tscn b/Scenes/level_3D.tscn
index b413f37..81496ed 100644
--- a/Scenes/level_3D.tscn
+++ b/Scenes/level_3D.tscn
@@ -1,7 +1,6 @@
-[gd_scene load_steps=16 format=3 uid="uid://bmu34hfw77kcw"]
+[gd_scene load_steps=15 format=3 uid="uid://bmu34hfw77kcw"]
[ext_resource type="Script" path="res://Scripts/Planet.cs" id="1_8qujs"]
-[ext_resource type="PackedScene" uid="uid://c6pism2kgjr5c" path="res://Scenes/Prefabs/popup_menu.tscn" id="1_bhqx1"]
[ext_resource type="Script" path="res://Scripts/CameraController.cs" id="2_anx2t"]
[ext_resource type="Shader" path="res://water.gdshader" id="3_rujla"]
@@ -38,6 +37,9 @@ shader_parameter/albedo = Color(0, 0.227451, 0.32549, 1)
shader_parameter/albedo_fresnel = Color(0, 1, 0.956863, 1)
shader_parameter/metallic = 0.146
shader_parameter/roughness = 0.069
+shader_parameter/wave = SubResource("NoiseTexture2D_y1cd4")
+shader_parameter/texture_normal_1 = SubResource("NoiseTexture2D_j176p")
+shader_parameter/texture_normal_2 = SubResource("NoiseTexture2D_ygkpg")
shader_parameter/wave_direction_1 = Vector2(2, 0)
shader_parameter/wave_direction_2 = Vector2(0, 1)
shader_parameter/time_scale = 0.005
@@ -51,9 +53,6 @@ shader_parameter/edge_scale = 0.01
shader_parameter/near = 0.5
shader_parameter/far = 100.0
shader_parameter/edge_color = Color(0, 0, 0, 1)
-shader_parameter/wave = SubResource("NoiseTexture2D_y1cd4")
-shader_parameter/texture_normal_1 = SubResource("NoiseTexture2D_j176p")
-shader_parameter/texture_normal_2 = SubResource("NoiseTexture2D_ygkpg")
[sub_resource type="SphereMesh" id="SphereMesh_sg8se"]
material = SubResource("ShaderMaterial_3ifrl")
@@ -103,7 +102,3 @@ environment = SubResource("Environment_fx7rt")
[node name="DirectionalLight3D" type="DirectionalLight3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 0.707107, -0.707107, 0, 0.707107, 0.707107, 0, 0, 0)
-
-[node name="CanvasLayer" type="CanvasLayer" parent="."]
-
-[node name="popup_menu" parent="CanvasLayer" instance=ExtResource("1_bhqx1")]
diff --git a/Scenes/main_menu.tscn b/Scenes/main_menu.tscn
deleted file mode 100644
index 206903c..0000000
--- a/Scenes/main_menu.tscn
+++ /dev/null
@@ -1,102 +0,0 @@
-[gd_scene load_steps=7 format=3 uid="uid://b1ige5g5k8nma"]
-
-[ext_resource type="Script" path="res://Scripts/UI/UIMainMenu.cs" id="1_3ln8k"]
-
-[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_dbvcp"]
-bg_color = Color(0.172549, 0.172549, 0.172549, 1)
-
-[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_n05l1"]
-content_margin_left = 30.0
-content_margin_top = 15.0
-content_margin_right = 30.0
-content_margin_bottom = 15.0
-bg_color = Color(0, 0, 0, 0.392157)
-
-[sub_resource type="Theme" id="Theme_v88qt"]
-Button/styles/normal = SubResource("StyleBoxFlat_n05l1")
-
-[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_d325d"]
-content_margin_left = 10.0
-content_margin_top = 10.0
-content_margin_right = 10.0
-content_margin_bottom = 10.0
-bg_color = Color(0, 0, 0, 0.392157)
-
-[sub_resource type="Theme" id="Theme_nbt60"]
-default_font_size = 14
-Button/styles/normal = SubResource("StyleBoxFlat_d325d")
-
-[node name="Main Menu" type="Control"]
-layout_mode = 3
-anchors_preset = 15
-anchor_right = 1.0
-anchor_bottom = 1.0
-grow_horizontal = 2
-grow_vertical = 2
-script = ExtResource("1_3ln8k")
-
-[node name="PanelContainer" type="PanelContainer" parent="."]
-layout_mode = 0
-anchor_right = 1.0
-anchor_bottom = 1.0
-grow_horizontal = 2
-grow_vertical = 2
-theme_override_styles/panel = SubResource("StyleBoxFlat_dbvcp")
-
-[node name="CenterContainer" type="CenterContainer" parent="PanelContainer"]
-layout_mode = 2
-
-[node name="Nav" type="VBoxContainer" parent="PanelContainer/CenterContainer"]
-layout_mode = 2
-theme = SubResource("Theme_v88qt")
-
-[node name="Play" type="Button" parent="PanelContainer/CenterContainer/Nav"]
-custom_minimum_size = Vector2(150, 0)
-layout_mode = 2
-text = "PLAY"
-
-[node name="Options" type="Button" parent="PanelContainer/CenterContainer/Nav"]
-custom_minimum_size = Vector2(150, 0)
-layout_mode = 2
-text = "OPTIONS"
-
-[node name="Credits" type="Button" parent="PanelContainer/CenterContainer/Nav"]
-layout_mode = 2
-text = "CREDITS"
-
-[node name="Quit" type="Button" parent="PanelContainer/CenterContainer/Nav"]
-custom_minimum_size = Vector2(150, 0)
-layout_mode = 2
-text = "QUIT"
-
-[node name="Margin" type="MarginContainer" parent="PanelContainer"]
-layout_mode = 2
-size_flags_horizontal = 0
-size_flags_vertical = 8
-theme_override_constants/margin_left = 10
-theme_override_constants/margin_top = 10
-theme_override_constants/margin_right = 10
-theme_override_constants/margin_bottom = 10
-
-[node name="Socials" type="HBoxContainer" parent="PanelContainer/Margin"]
-layout_mode = 2
-size_flags_horizontal = 0
-size_flags_vertical = 8
-theme = SubResource("Theme_nbt60")
-
-[node name="Discord" type="Button" parent="PanelContainer/Margin/Socials"]
-layout_mode = 2
-size_flags_horizontal = 0
-size_flags_vertical = 0
-text = "Discord"
-
-[node name="Github" type="Button" parent="PanelContainer/Margin/Socials"]
-layout_mode = 2
-text = "GitHub"
-
-[connection signal="pressed" from="PanelContainer/CenterContainer/Nav/Play" to="." method="_on_play_pressed"]
-[connection signal="pressed" from="PanelContainer/CenterContainer/Nav/Options" to="." method="_on_options_pressed"]
-[connection signal="pressed" from="PanelContainer/CenterContainer/Nav/Credits" to="." method="_on_credits_pressed"]
-[connection signal="pressed" from="PanelContainer/CenterContainer/Nav/Quit" to="." method="_on_quit_pressed"]
-[connection signal="pressed" from="PanelContainer/Margin/Socials/Discord" to="." method="_on_discord_pressed"]
-[connection signal="pressed" from="PanelContainer/Margin/Socials/Github" to="." method="_on_github_pressed"]
diff --git a/Scripts/Autoloads/AudioManager.cs b/Scripts/Autoloads/AudioManager.cs
deleted file mode 100644
index 05837cc..0000000
--- a/Scripts/Autoloads/AudioManager.cs
+++ /dev/null
@@ -1,117 +0,0 @@
-namespace Planets;
-
-public partial class AudioManager : Node
-{
- private static GAudioPlayer MusicPlayer { get; set; }
-
- private static Node SFXPlayersParent { get; set; }
- private static float LastPitch { get; set; }
- private static ResourceOptions Options { get; set; }
-
- public static void PlayMusic(AudioStream song, bool instant = true, double fadeOut = 1.5, double fadeIn = 0.5)
- {
- if (!instant && MusicPlayer.Playing)
- {
- // Transition from current song being played to new song
- var tween = new GTween(MusicPlayer.StreamPlayer);
- tween.Create();
-
- // Fade out current song
- tween.Animate("volume_db", -80, fadeOut)
- .SetTrans(Tween.TransitionType.Sine)
- .SetEase(Tween.EaseType.In);
-
- // Set to new song
- tween.Callback(() =>
- {
- MusicPlayer.Stream = song;
- MusicPlayer.Play();
- });
-
- // Fade in to current song
- float volume = Options.MusicVolume;
- var volumeRemapped = volume == 0 ? -80 : volume.Remap(0, 100, -40, 0);
- tween.Animate("volume_db", volumeRemapped, fadeIn)
- .SetTrans(Tween.TransitionType.Sine)
- .SetEase(Tween.EaseType.In);
- }
- else
- {
- // Instantly switch to and play new song
- MusicPlayer.Stream = song;
- MusicPlayer.Volume = Options.MusicVolume;
- MusicPlayer.Play();
- }
- }
-
- public static void PlaySFX(AudioStream sound)
- {
- // Setup the SFX stream player
- var sfxPlayer = new GAudioPlayer(SFXPlayersParent, true)
- {
- Stream = sound,
- Volume = Options.SFXVolume
- };
-
- // Randomize the pitch
- RandomNumberGenerator rng = new();
- rng.Randomize();
- float pitch = rng.RandfRange(0.8f, 1.2f);
-
- // Ensure the current pitch is not the same as the last
- while (Mathf.Abs(pitch - LastPitch) < 0.1f)
- {
- rng.Randomize();
- pitch = rng.RandfRange(0.8f, 1.2f);
- }
-
- LastPitch = pitch;
-
- // Play the sound
- sfxPlayer.Pitch = pitch;
- sfxPlayer.Play();
- }
-
- ///
- /// Gradually fade out all sounds
- ///
- public static void FadeOutSFX(double fadeTime = 1)
- {
- foreach (AudioStreamPlayer audioPlayer in SFXPlayersParent.GetChildren())
- {
- var tween = new GTween(audioPlayer);
- tween.Create();
- tween.Animate("volume_db", -80, fadeTime);
- }
- }
-
- public static void SetMusicVolume(float v)
- {
- MusicPlayer.Volume = v;
- Options.MusicVolume = MusicPlayer.Volume;
- }
-
- public static void SetSFXVolume(float v)
- {
- // Set volume for future SFX players
- Options.SFXVolume = v;
-
- // Can't cast to GAudioPlayer so will have to remap manually again
- v = v == 0 ? -80 : v.Remap(0, 100, -40, 0);
-
- // Set volume of all SFX players currently in the scene
- foreach (AudioStreamPlayer audioPlayer in SFXPlayersParent.GetChildren())
- audioPlayer.VolumeDb = v;
- }
-
- public override void _Ready()
- {
- Options = OptionsManager.Options;
- MusicPlayer = new GAudioPlayer(this);
-
- SFXPlayersParent = new Node();
- AddChild(SFXPlayersParent);
-
- //PlayMusic(Music.Menu);
- }
-}
diff --git a/Scripts/Autoloads/Global.cs b/Scripts/Autoloads/Global.cs
deleted file mode 100644
index 1627746..0000000
--- a/Scripts/Autoloads/Global.cs
+++ /dev/null
@@ -1,49 +0,0 @@
-global using Godot;
-global using GodotUtils;
-global using System;
-global using System.Collections.Generic;
-global using System.Collections.Concurrent;
-global using System.Diagnostics;
-global using System.Linq;
-global using System.Runtime.CompilerServices;
-global using System.Threading;
-global using System.Text.RegularExpressions;
-global using System.Threading.Tasks;
-
-namespace Planets;
-
-public partial class Global : Node
-{
- private static Global Instance { get; set; }
-
- public override void _Ready()
- {
- Instance = this;
-
- // Gradually fade out all SFX whenever the scene is changed
- SceneManager.SceneChanged += name => AudioManager.FadeOutSFX();
- }
-
- public override void _PhysicsProcess(double delta)
- {
- Logger.Update();
- }
-
- public override void _Notification(int what)
- {
- if (what == NotificationWMCloseRequest)
- {
- GetTree().AutoAcceptQuit = false;
- Quit();
- }
- }
-
- public static void Quit()
- {
- // Handle cleanup here
- OptionsManager.SaveOptions();
- OptionsManager.SaveHotkeys();
-
- Instance.GetTree().Quit();
- }
-}
diff --git a/Scripts/Autoloads/OptionsManager.cs b/Scripts/Autoloads/OptionsManager.cs
deleted file mode 100644
index d068bc0..0000000
--- a/Scripts/Autoloads/OptionsManager.cs
+++ /dev/null
@@ -1,183 +0,0 @@
-namespace Planets;
-
-using Godot.Collections;
-
-public partial class OptionsManager : Node
-{
- public static event Action WindowModeChanged;
-
- public static ResourceOptions Options { get; set; }
-
- public static Dictionary> DefaultHotkeys { get; private set; }
- public static ResourceHotkeys Hotkeys { get; set; }
-
- public static string CurrentOptionsTab { get; set; } = "General";
-
- public static void SaveOptions()
- {
- Error error = ResourceSaver.Save(OptionsManager.Options, "user://options.tres");
-
- if (error != Error.Ok)
- GD.Print(error);
- }
-
- public static void SaveHotkeys()
- {
- Error error = ResourceSaver.Save(OptionsManager.Hotkeys, "user://hotkeys.tres");
-
- if (error != Error.Ok)
- GD.Print(error);
- }
-
- public static void ResetHotkeys()
- {
- // Deep clone default hotkeys over
- Hotkeys.Actions = new();
-
- foreach (KeyValuePair> element in DefaultHotkeys)
- {
- Array arr = new();
-
- foreach (InputEvent item in DefaultHotkeys[element.Key])
- {
- arr.Add((InputEvent)item.Duplicate());
- }
-
- Hotkeys.Actions.Add(element.Key, arr);
- }
-
- // Set input map
- LoadInputMap(DefaultHotkeys);
- }
-
- public override void _Ready()
- {
- LoadOptions();
-
- GetDefaultHotkeys();
- LoadHotkeys();
-
- SetWindowMode();
- SetVSyncMode();
- SetWinSize();
- SetMaxFPS();
- SetLanguage();
- }
-
- public override void _Input(InputEvent @event)
- {
- if (Input.IsActionJustPressed("fullscreen"))
- {
- if (DisplayServer.WindowGetMode() == DisplayServer.WindowMode.Windowed)
- {
- DisplayServer.WindowSetMode(DisplayServer.WindowMode.Fullscreen);
- Options.WindowMode = WindowMode.Borderless;
- WindowModeChanged?.Invoke(WindowMode.Borderless);
- }
- else
- {
- DisplayServer.WindowSetMode(DisplayServer.WindowMode.Windowed);
- Options.WindowMode = WindowMode.Windowed;
- WindowModeChanged?.Invoke(WindowMode.Windowed);
- }
- }
- }
-
- private void LoadOptions()
- {
- bool fileExists = FileAccess.FileExists("user://options.tres");
-
- Options = fileExists ?
- GD.Load("user://options.tres") : new();
- }
-
- private static void LoadInputMap(Dictionary> hotkeys)
- {
- Array actions = InputMap.GetActions();
-
- foreach (StringName action in actions)
- InputMap.EraseAction(action);
-
- foreach (StringName action in hotkeys.Keys)
- {
- InputMap.AddAction(action);
-
- foreach (InputEvent @event in hotkeys[action])
- InputMap.ActionAddEvent(action, @event);
- }
- }
-
- private void GetDefaultHotkeys()
- {
- // Get all the default actions defined in the input map
- Dictionary> actions = new();
-
- foreach (StringName action in InputMap.GetActions())
- {
- actions.Add(action, new Array());
-
- foreach (InputEvent actionEvent in InputMap.ActionGetEvents(action))
- actions[action].Add(actionEvent);
- }
-
- DefaultHotkeys = actions;
- }
-
- private void LoadHotkeys()
- {
- bool fileExists = FileAccess.FileExists("user://hotkeys.tres");
-
- if (fileExists)
- {
- Hotkeys = GD.Load("user://hotkeys.tres");
- LoadInputMap(Hotkeys.Actions);
- }
- else
- {
- Hotkeys = new();
- ResetHotkeys();
- }
- }
-
- private void SetWindowMode()
- {
- switch (Options.WindowMode)
- {
- case WindowMode.Windowed:
- DisplayServer.WindowSetMode(DisplayServer.WindowMode.Windowed);
- break;
- case WindowMode.Borderless:
- DisplayServer.WindowSetMode(DisplayServer.WindowMode.Fullscreen);
- break;
- case WindowMode.Fullscreen:
- DisplayServer.WindowSetMode(DisplayServer.WindowMode.ExclusiveFullscreen);
- break;
- }
- }
-
- private void SetVSyncMode() => DisplayServer.WindowSetVsyncMode(Options.VSyncMode);
-
- private void SetWinSize()
- {
- if (Options.WindowSize != Vector2I.Zero)
- {
- DisplayServer.WindowSetSize(Options.WindowSize);
-
- // center window
- Vector2I screenSize = DisplayServer.ScreenGetSize();
- Vector2I winSize = DisplayServer.WindowGetSize();
- DisplayServer.WindowSetPosition((screenSize / 2) - (winSize / 2));
- }
- }
-
- private void SetMaxFPS()
- {
- if (DisplayServer.WindowGetVsyncMode() == DisplayServer.VSyncMode.Disabled)
- {
- Engine.MaxFps = Options.MaxFPS;
- }
- }
-
- private void SetLanguage() => TranslationServer.SetLocale(
- Options.Language.ToString().Substring(0, 2).ToLower());
-}
diff --git a/Scripts/Autoloads/audio_manager.tscn b/Scripts/Autoloads/audio_manager.tscn
deleted file mode 100644
index 1ee1952..0000000
--- a/Scripts/Autoloads/audio_manager.tscn
+++ /dev/null
@@ -1,6 +0,0 @@
-[gd_scene load_steps=2 format=3 uid="uid://jnwu35ethg3x"]
-
-[ext_resource type="Script" path="res://Scripts/Autoloads/AudioManager.cs" id="1_e4p82"]
-
-[node name="audio_manager" type="Node"]
-script = ExtResource("1_e4p82")
diff --git a/Scripts/Autoloads/global.tscn b/Scripts/Autoloads/global.tscn
deleted file mode 100644
index dd5c407..0000000
--- a/Scripts/Autoloads/global.tscn
+++ /dev/null
@@ -1,12 +0,0 @@
-[gd_scene load_steps=3 format=3 uid="uid://cj2rg5607dbh3"]
-
-[ext_resource type="Script" path="res://Scripts/Autoloads/Global.cs" id="1_ueahs"]
-[ext_resource type="PackedScene" uid="uid://c4o3fj5cr8ua7" path="res://GodotUtils/Prefabs/UIConsole.tscn" id="2_ht13n"]
-
-[node name="Global" type="Node2D"]
-script = ExtResource("1_ueahs")
-
-[node name="CanvasLayer" type="CanvasLayer" parent="."]
-layer = 100
-
-[node name="UIConsole" parent="CanvasLayer" instance=ExtResource("2_ht13n")]
diff --git a/Scripts/CameraController.cs b/Scripts/CameraController.cs
index ed547cd..ef68515 100644
--- a/Scripts/CameraController.cs
+++ b/Scripts/CameraController.cs
@@ -1,56 +1,58 @@
-using System;
+using Godot;
+using GodotUtils;
namespace Planets;
public partial class CameraController : Node3D
{
- private float Sensitivity { get; } = 0.005f;
-
- private Camera3D Camera { get; set; }
- private bool HoldingLeftClick { get; set; }
- private Node3D Orbit { get; set; }
+ private Camera3D _camera;
+ private Node3D _orbit;
+ private float _sensitivity = 0.005f;
+ private bool _holdingLeftClick;
public override void _Ready()
{
- Orbit = GetNode("Orbit");
- Camera = Orbit.GetNode("Camera");
+ _orbit = GetNode("Orbit");
+ _camera = _orbit.GetNode("Camera");
}
public override void _Input(InputEvent @event)
{
if (@event is InputEventMouseButton button)
{
- HoldingLeftClick = button.ButtonIndex == MouseButton.Left && button.Pressed;
+ _holdingLeftClick = button.IsLeftClickPressed();
if (button.IsZoomIn())
{
- Camera.Position -= new Vector3(0, 0, 0.1f);
+ _camera.Position -= new Vector3(0, 0, 0.1f);
}
if (button.IsZoomOut())
{
- Camera.Position += new Vector3(0, 0, 0.1f);
+ _camera.Position += new Vector3(0, 0, 0.1f);
}
}
if (@event is InputEventMouseMotion motion)
+ {
Rotate(motion);
+ }
}
private void Rotate(InputEventMouseMotion motion)
{
- if (!HoldingLeftClick)
+ if (!_holdingLeftClick)
+ {
return;
+ }
- Vector2 vel = motion.Relative * Sensitivity;
-
+ Vector2 vel = motion.Relative * _sensitivity;
Vector3 rot = Rotation;
rot.X -= vel.Y;
rot.Y -= vel.X;
+ rot.X = Mathf.Clamp(rot.X, -Mathf.Pi / 2.0f, Mathf.Pi / 2.0f); // If the rot.X is not clamped then the rotation will become too chaotic
- // If the rot.X is not clamped then the rotation gets too chaotic
- rot.X = Mathf.Clamp(rot.X, -Mathf.Pi / 2.0f, Mathf.Pi / 2.0f);
Rotation = rot;
}
}
diff --git a/Scripts/Chunk.cs b/Scripts/ChunkUtils.cs
similarity index 58%
rename from Scripts/Chunk.cs
rename to Scripts/ChunkUtils.cs
index 70d670c..8e6153d 100644
--- a/Scripts/Chunk.cs
+++ b/Scripts/ChunkUtils.cs
@@ -1,62 +1,101 @@
-namespace Planets;
+using Godot;
+using System.Collections.Generic;
+using GodotUtils;
-public class Chunk
-{
- private Node Parent { get; set; }
+namespace Planets;
- public Chunk(Node parent, Vector3 posA, Vector3 posB, Vector3 posC, int resolution)
+public class ChunkUtils
+{
+ public static Mesh GenerateMesh(Vector3 posA, Vector3 posB, Vector3 posC, int resolution)
{
- Parent = parent;
-
Vector3[] vertices = BuildVertices(posA, posB, posC, resolution);
int[] indices = BuildIndices(resolution);
- GMesh gMesh = new(vertices, indices)
- {
- SimpleNormals = false,
- Colors = GenerateColors(vertices)
- };
+ return GenerateWithComplexNormals(vertices, indices, GenerateColors(vertices));
+ }
- Parent.AddChild(new MeshInstance3D
+ private static ArrayMesh GenerateWithComplexNormals(Vector3[] vertices, int[] indices, Color[] colors)
+ {
+ SurfaceTool st = new();
+ st.Begin(Mesh.PrimitiveType.Triangles);
+
+ for (int i = 0; i < vertices.Length; i++)
{
- Mesh = gMesh.Generate(),
- MaterialOverride = new StandardMaterial3D
+ if (colors != null)
{
- VertexColorUseAsAlbedo = true
+ st.SetColor(colors[i]);
}
- });
+
+ st.AddVertex(vertices[i]);
+ }
+
+ foreach (int index in indices)
+ {
+ st.AddIndex(index);
+ }
+
+ st.GenerateNormals();
+
+ return st.Commit();
}
- private Color[] GenerateColors(Vector3[] vertices)
+ private static ArrayMesh GenerateWithSimpleNormals(Vector3[] vertices, int[] indices, Color[] colors)
{
- FastNoiseLite noise = new()
+ Godot.Collections.Array arrays = [];
+ arrays.Resize((int)Mesh.ArrayType.Max);
+ arrays[(int)Mesh.ArrayType.Vertex] = vertices;
+
+ Vector3[] normals = new Vector3[vertices.Length];
+
+ for (int i = 0; i < normals.Length; i++)
{
- Frequency = 0.2f
- };
+ normals[i] = vertices[i].Normalized();
+ }
+
+ arrays[(int)Mesh.ArrayType.Normal] = normals;
+ //arrays[(int)Mesh.ArrayType.TexUv] = uvs;
+
+ if (colors != null)
+ {
+ arrays[(int)Mesh.ArrayType.Color] = colors;
+ }
+ arrays[(int)Mesh.ArrayType.Index] = indices;
+
+ ArrayMesh mesh = new();
+ mesh.AddSurfaceFromArrays(Mesh.PrimitiveType.Triangles, arrays);
+
+ return mesh;
+ }
+
+ private static Color[] GenerateColors(Vector3[] vertices)
+ {
Color[] colors = new Color[vertices.Length];
+
for (int i = 0; i < colors.Length; i++)
{
- float n = 1 + (noise.GetNoise3Dv(vertices[i]) * 10);
-
if (vertices[i].Length() > 9.5f)
+ {
colors[i] = new Color("316231"); // grass
+ }
else
+ {
colors[i] = new Color(1, 1, 0.73f); // sand
+ }
}
return colors;
}
- private Vector3[] BuildVertices(Vector3 posA, Vector3 posB, Vector3 posC, int res)
+ private static Vector3[] BuildVertices(Vector3 posA, Vector3 posB, Vector3 posC, int res)
{
- List vertices = new()
- {
+ List vertices =
+ [
// The 3 main corners
posA,
posB,
posC
- };
+ ];
// The edge midpoints
if (res >= 1)
@@ -70,7 +109,9 @@ private Vector3[] BuildVertices(Vector3 posA, Vector3 posB, Vector3 posC, int re
// The center points
if (res >= 2)
+ {
vertices.AddRange(GenerateCenterPoints(edgeMidpointsLeft, edgeMidpointsRight, res));
+ }
}
vertices = DeformVertices(vertices);
@@ -78,7 +119,7 @@ private Vector3[] BuildVertices(Vector3 posA, Vector3 posB, Vector3 posC, int re
return vertices.ToArray();
}
- private List DeformVertices(List vertices)
+ private static List DeformVertices(List vertices)
{
FastNoiseLite noise = new()
{
@@ -98,15 +139,15 @@ private List DeformVertices(List vertices)
return vertices;
}
- private int[] BuildIndices(int res)
+ private static int[] BuildIndices(int res)
{
- List indices = new();
+ List indices = [];
// If the resolution is 0 then there are no midpoints and thus there
// is only 1 triangle
if (res <= 0)
{
- indices.AddRange(new int[] { 0, 1, 2 });
+ indices.AddRange([0, 1, 2]);
return indices.ToArray();
}
@@ -123,7 +164,7 @@ private int[] BuildIndices(int res)
// The center points
int center = 3 + (res * 3);
- var centerBottomRight = center + GUMath.SumNaturalNumbers(res) - 1;
+ var centerBottomRight = center + CMath.SumNaturalNumbers(res) - 1;
var centerBottomLeft = centerBottomRight - res + 2;
// The last point in each midpoint array
@@ -133,20 +174,22 @@ private int[] BuildIndices(int res)
// Resolution can be greater than or equal to 1 here
// Draw the corner triangles
- indices.AddRange(new int[] { leftFirst, topMiddle, rightFirst });
- indices.AddRange(new int[] { bottomLeft, leftLast, bottomLast });
- indices.AddRange(new int[] { bottomFirst, rightLast, bottomRight });
+ indices.AddRange([leftFirst, topMiddle, rightFirst]);
+ indices.AddRange([bottomLeft, leftLast, bottomLast]);
+ indices.AddRange([bottomFirst, rightLast, bottomRight]);
// If resolution equals 1 then draw the special case triangle in center
if (res == 1)
- indices.AddRange(new int[] { leftFirst, rightFirst, bottomFirst });
+ {
+ indices.AddRange([leftFirst, rightFirst, bottomFirst]);
+ }
if (res >= 2)
{
// Draw the special triangles near each of the 3 main corners
- indices.AddRange(new int[] { center, leftFirst, rightFirst });
- indices.AddRange(new int[] { centerBottomLeft, bottomLast, leftLast });
- indices.AddRange(new int[] { centerBottomRight, rightLast, bottomFirst });
+ indices.AddRange([center, leftFirst, rightFirst]);
+ indices.AddRange([centerBottomLeft, bottomLast, leftLast]);
+ indices.AddRange([centerBottomRight, rightLast, bottomFirst]);
// Draw the outer edge triangles
List triOuterEdgeRight = IndicesOuterEdgeRight(res, rightFirst, center);
@@ -169,99 +212,99 @@ private int[] BuildIndices(int res)
return indices.ToArray();
}
- private List IndicesOuterEdgeRight(int res, int rightFirst, int center)
+ private static List IndicesOuterEdgeRight(int res, int rightFirst, int center)
{
- List indices = new();
+ List indices = [];
// Outer Right Edge Triangles
// Upside
for (int i = 0; i < res - 1; i++)
{
- indices.AddRange(new int[]
- {
+ indices.AddRange(
+ [
rightFirst + i,
rightFirst + i + 1,
- center + GUMath.SumNaturalNumbers(i + 2) - 1
- });
+ center + CMath.SumNaturalNumbers(i + 2) - 1
+ ]);
}
// Flipside
for (int i = 0; i < res - 2; i++)
{
- indices.AddRange(new int[]
- {
- center + GUMath.SumNaturalNumbers(i + 2) - 1,
+ indices.AddRange(
+ [
+ center + CMath.SumNaturalNumbers(i + 2) - 1,
rightFirst + i + 1,
- center + GUMath.SumNaturalNumbers(i + 3) - 1
- });
+ center + CMath.SumNaturalNumbers(i + 3) - 1
+ ]);
}
return indices;
}
- private List IndicesOuterEdgeLeft(int res, int leftFirst, int center)
+ private static List IndicesOuterEdgeLeft(int res, int leftFirst, int center)
{
- List indices = new();
+ List indices = [];
// Outer Left Edge Triangles
// Upside
for (int i = 0; i < res - 1; i++)
{
- indices.AddRange(new int[]
- {
+ indices.AddRange(
+ [
leftFirst + i,
- center + GUMath.SumNaturalNumbers(i + 2) - i - 1,
+ center + CMath.SumNaturalNumbers(i + 2) - i - 1,
leftFirst + i + 1
- });
+ ]);
}
// Flipside
for (int i = 0; i < res - 2; i++)
{
- indices.AddRange(new int[]
- {
+ indices.AddRange(
+ [
leftFirst + i + 1,
- center + GUMath.SumNaturalNumbers(i + 2) - i - 1,
- center + GUMath.SumNaturalNumbers(i + 3) - i - 2
- });
+ center + CMath.SumNaturalNumbers(i + 2) - i - 1,
+ center + CMath.SumNaturalNumbers(i + 3) - i - 2
+ ]);
}
return indices;
}
- private List IndicesOuterBottom(int res, int bottomFirst, int centerBottomRight)
+ private static List IndicesOuterBottom(int res, int bottomFirst, int centerBottomRight)
{
- List indices = new();
+ List indices = [];
// Outer Bottom Edge Triangles
// Upside
for (int i = 0; i < res - 1; i++)
{
- indices.AddRange(new int[]
- {
+ indices.AddRange(
+ [
bottomFirst + i + 1,
centerBottomRight - i,
bottomFirst + i
- });
+ ]);
}
// Flipside
for (int i = 0; i < res - 2; i++)
{
- indices.AddRange(new int[]
- {
+ indices.AddRange(
+ [
centerBottomRight - i - 1,
centerBottomRight - i,
bottomFirst + i + 1
- });
+ ]);
}
return indices;
}
- private List IndicesCenter(int res, int center)
+ private static List IndicesCenter(int res, int center)
{
- List indices = new();
+ List indices = [];
// Center Triangles
// Upside
@@ -269,16 +312,16 @@ private List IndicesCenter(int res, int center)
{
for (int i = 0; i < row; i++)
{
- var row1 = GUMath.SumNaturalNumbers(row) + i;
- var row2 = GUMath.SumNaturalNumbers(row + 1) + i;
+ var row1 = CMath.SumNaturalNumbers(row) + i;
+ var row2 = CMath.SumNaturalNumbers(row + 1) + i;
var x = row2;
var y = row1;
var z = row2 + 1;
- indices.AddRange(new int[] {
+ indices.AddRange([
center + x, center + y, center + z
- });
+ ]);
}
}
@@ -287,25 +330,25 @@ private List IndicesCenter(int res, int center)
{
for (int i = 0; i < row; i++)
{
- var row1 = GUMath.SumNaturalNumbers(row + 1) + i;
- var row2 = GUMath.SumNaturalNumbers(row + 2) + i;
+ var row1 = CMath.SumNaturalNumbers(row + 1) + i;
+ var row2 = CMath.SumNaturalNumbers(row + 2) + i;
var x = row1;
var y = row1 + 1;
var z = row2 + 1;
- indices.AddRange(new int[] {
+ indices.AddRange([
center + x, center + y, center + z
- });
+ ]);
}
}
return indices;
}
- private Vector3[] GenerateCenterPoints(Vector3[] edgeMidpointsLeft, Vector3[] edgeMidpointsRight, int resolution)
+ private static Vector3[] GenerateCenterPoints(Vector3[] edgeMidpointsLeft, Vector3[] edgeMidpointsRight, int resolution)
{
- Vector3[] centerPoints = new Vector3[GUMath.SumNaturalNumbers(resolution)];
+ Vector3[] centerPoints = new Vector3[CMath.SumNaturalNumbers(resolution)];
int index = 0;
@@ -324,7 +367,7 @@ private Vector3[] GenerateCenterPoints(Vector3[] edgeMidpointsLeft, Vector3[] ed
return centerPoints;
}
- private Vector3[] GenerateEdgeMidPoints(Vector3 posA, Vector3 posB, int resolution)
+ private static Vector3[] GenerateEdgeMidPoints(Vector3 posA, Vector3 posB, int resolution)
{
Vector3[] points = new Vector3[resolution];
diff --git a/Scripts/Geometry/DebugPoint.cs b/Scripts/Geometry/DebugPoint.cs
index 81d7351..7bc4693 100644
--- a/Scripts/Geometry/DebugPoint.cs
+++ b/Scripts/Geometry/DebugPoint.cs
@@ -1,4 +1,6 @@
-namespace Planets;
+using Godot;
+
+namespace Planets;
public class DebugPoint : Sphere
{
@@ -12,7 +14,7 @@ public DebugPoint(Node parent, Vector3 pos, string text) : base(parent, pos)
parent.AddChild(new Label3D
{
Text = text,
- Position = Position + new Vector3(0, 0.05f, 0),
+ Position = _position + new Vector3(0, 0.05f, 0),
FontSize = 12
});
}
diff --git a/Scripts/Geometry/Icosahedron.cs b/Scripts/Geometry/Icosahedron.cs
index 7b3f25e..6b8f684 100644
--- a/Scripts/Geometry/Icosahedron.cs
+++ b/Scripts/Geometry/Icosahedron.cs
@@ -1,4 +1,6 @@
-namespace Planets;
+using Godot;
+
+namespace Planets;
public class Icosahedron
{
@@ -9,8 +11,8 @@ public Icosahedron(float radius = 1)
{
float t = (1.0f + Mathf.Sqrt(5.0f)) / 2.0f;
- Vertices = new Vector3[]
- {
+ Vertices =
+ [
new Vector3(-1, t, 0).Normalized() * radius,
new Vector3( 1, t, 0).Normalized() * radius,
new Vector3(-1, -t, 0).Normalized() * radius,
@@ -23,9 +25,9 @@ public Icosahedron(float radius = 1)
new Vector3( t, 0, 1).Normalized() * radius,
new Vector3(-t, 0, -1).Normalized() * radius,
new Vector3(-t, 0, 1).Normalized() * radius
- };
+ ];
- Triangles = new int[] {
+ Triangles = [
0, 5, 11,
0, 1, 5,
0, 7, 1,
@@ -46,6 +48,6 @@ public Icosahedron(float radius = 1)
6, 10, 2,
8, 7, 6,
9, 1, 8
- };
+ ];
}
}
diff --git a/Scripts/Geometry/Sphere.cs b/Scripts/Geometry/Sphere.cs
index 779a459..f97bde1 100644
--- a/Scripts/Geometry/Sphere.cs
+++ b/Scripts/Geometry/Sphere.cs
@@ -1,24 +1,28 @@
-namespace Planets;
+using Godot;
+
+namespace Planets;
public class Sphere
{
- protected Vector3 Position { get; }
- private SphereMesh Mesh { get; }
+ protected Vector3 _position;
+
+ private readonly SphereMesh _mesh;
public Sphere(Node parent, Vector3 pos)
{
- Position = pos;
- Mesh = new();
+ _position = pos;
+ _mesh = new();
+
parent.AddChild(new MeshInstance3D
{
- Mesh = Mesh,
+ Mesh = _mesh,
Position = pos
});
}
public Sphere SetColor(Color color)
{
- Mesh.Material = new StandardMaterial3D
+ _mesh.Material = new StandardMaterial3D
{
AlbedoColor = color
};
@@ -28,22 +32,22 @@ public Sphere SetColor(Color color)
public Sphere SetRadius(float radius)
{
- Mesh.Radius = radius;
- Mesh.Height = radius * 2;
+ _mesh.Radius = radius;
+ _mesh.Height = radius * 2;
return this;
}
public Sphere SetRings(int rings)
{
- Mesh.Rings = rings;
+ _mesh.Rings = rings;
return this;
}
public Sphere SetRadialSegments(int segments)
{
- Mesh.RadialSegments = Mathf.Max(4, segments);
+ _mesh.RadialSegments = Mathf.Max(4, segments);
return this;
}
diff --git a/Scripts/Geometry/World3DUtils.cs b/Scripts/Geometry/World3DUtils.cs
deleted file mode 100644
index 27aacd2..0000000
--- a/Scripts/Geometry/World3DUtils.cs
+++ /dev/null
@@ -1,65 +0,0 @@
-namespace Planets;
-
-public class GMesh
-{
- public bool SimpleNormals { get; set; }
- public Color[] Colors { get; set; }
-
- private readonly Vector3[] vertices;
- private readonly int[] indices;
-
- public GMesh(Vector3[] vertices, int[] indices)
- {
- this.vertices = vertices;
- this.indices = indices;
- }
-
- public Mesh Generate() => SimpleNormals ?
- GenerateWithSimpleNormals() : GenerateWithComplexNormals();
-
- private Mesh GenerateWithSimpleNormals()
- {
- Godot.Collections.Array arrays = new();
- arrays.Resize((int)Mesh.ArrayType.Max);
- arrays[(int)Mesh.ArrayType.Vertex] = vertices;
-
- Vector3[] normals = new Vector3[vertices.Length];
-
- for (int i = 0; i < normals.Length; i++)
- normals[i] = vertices[i].Normalized();
-
- arrays[(int)Mesh.ArrayType.Normal] = normals;
- //arrays[(int)Mesh.ArrayType.TexUv] = uvs;
-
- if (Colors != null)
- arrays[(int)Mesh.ArrayType.Color] = Colors;
-
- arrays[(int)Mesh.ArrayType.Index] = indices;
-
- ArrayMesh mesh = new();
- mesh.AddSurfaceFromArrays(Mesh.PrimitiveType.Triangles, arrays);
-
- return mesh;
- }
-
- private Mesh GenerateWithComplexNormals()
- {
- SurfaceTool st = new();
- st.Begin(Mesh.PrimitiveType.Triangles);
-
- for (int i = 0; i < vertices.Length; i++)
- {
- if (Colors != null)
- st.SetColor(Colors[i]);
-
- st.AddVertex(vertices[i]);
- }
-
- foreach (int index in indices)
- st.AddIndex(index);
-
- st.GenerateNormals();
-
- return st.Commit();
- }
-}
diff --git a/Scripts/Planet.cs b/Scripts/Planet.cs
index 93b2bf0..9e41be1 100644
--- a/Scripts/Planet.cs
+++ b/Scripts/Planet.cs
@@ -1,3 +1,5 @@
+using Godot;
+
namespace Planets;
public partial class Planet : Node3D
@@ -12,16 +14,20 @@ public override void _Ready()
int resolution = 128;
- Logger.LogMs(() =>
+ for (int i = 0; i < indices.Length; i += 3)
{
- for (int i = 0; i < indices.Length; i += 3)
- {
- Vector3 posA = vertices[indices[i]];
- Vector3 posB = vertices[indices[i + 1]];
- Vector3 posC = vertices[indices[i + 2]];
+ Vector3 posA = vertices[indices[i]];
+ Vector3 posB = vertices[indices[i + 1]];
+ Vector3 posC = vertices[indices[i + 2]];
- new Chunk(this, posA, posB, posC, resolution);
- }
- });
+ AddChild(new MeshInstance3D
+ {
+ Mesh = ChunkUtils.GenerateMesh(posA, posB, posC, resolution),
+ MaterialOverride = new StandardMaterial3D
+ {
+ VertexColorUseAsAlbedo = true
+ }
+ });
+ }
}
}
diff --git a/Scripts/Resources/ResourceHotkeys.cs b/Scripts/Resources/ResourceHotkeys.cs
deleted file mode 100644
index b61d80e..0000000
--- a/Scripts/Resources/ResourceHotkeys.cs
+++ /dev/null
@@ -1,8 +0,0 @@
-namespace Planets;
-
-using Godot.Collections;
-
-public partial class ResourceHotkeys : Resource
-{
- [Export] public Dictionary> Actions { get; set; } = new();
-}
diff --git a/Scripts/Resources/ResourceOptions.cs b/Scripts/Resources/ResourceOptions.cs
deleted file mode 100644
index 6c1cdbd..0000000
--- a/Scripts/Resources/ResourceOptions.cs
+++ /dev/null
@@ -1,29 +0,0 @@
-namespace Planets;
-
-using VSyncMode = DisplayServer.VSyncMode;
-
-/*
- * If the ResourceOptions.cs script is moved then the file path will not updated
- * in the .tres file. In order to fix this go to
- * C:\Users\VALK-DESKTOP\AppData\Roaming\Godot\app_userdata\Planets
- * and delete the .tres file so Godot will be forced to generate it from
- * scratch. This is not a Godot bug it is just something to look out for.
- *
- * Resource props must have [Export] attribute otherwise they will not save
- * properly.
- *
- * The 'recommended' way of storing config files can be found here
- * https://docs.godotengine.org/en/stable/classes/class_configfile.html
- * However this is undesired because values are saved through string keys
- * instead of props.
- */
-public partial class ResourceOptions : Resource
-{
- [Export] public float MusicVolume { get; set; } = 100;
- [Export] public float SFXVolume { get; set; } = 100;
- [Export] public WindowMode WindowMode { get; set; } = WindowMode.Windowed;
- [Export] public VSyncMode VSyncMode { get; set; } = VSyncMode.Enabled;
- [Export] public Vector2I WindowSize { get; set; }
- [Export] public int MaxFPS { get; set; } = 60;
- [Export] public Language Language { get; set; } = Language.English;
-}
diff --git a/Scripts/Static/Music.cs b/Scripts/Static/Music.cs
deleted file mode 100644
index d2faa6f..0000000
--- a/Scripts/Static/Music.cs
+++ /dev/null
@@ -1,7 +0,0 @@
-namespace Planets;
-
-public static class Music
-{
- private static AudioStream Load(string path) =>
- GD.Load($"res://Audio/Songs/{path}");
-}
diff --git a/Scripts/Static/Prefabs.cs b/Scripts/Static/Prefabs.cs
deleted file mode 100644
index cf59d2f..0000000
--- a/Scripts/Static/Prefabs.cs
+++ /dev/null
@@ -1,9 +0,0 @@
-namespace Planets;
-
-public static class Prefabs
-{
- public static PackedScene Options { get; } = Load("options");
-
- private static PackedScene Load(string path) =>
- GD.Load($"res://Scenes/Prefabs/{path}.tscn");
-}
diff --git a/Scripts/Static/Sounds.cs b/Scripts/Static/Sounds.cs
deleted file mode 100644
index 789b6dc..0000000
--- a/Scripts/Static/Sounds.cs
+++ /dev/null
@@ -1,7 +0,0 @@
-namespace Planets;
-
-public static class Sounds
-{
- private static AudioStream Load(string path) =>
- GD.Load($"res://Audio/SFX/{path}");
-}
diff --git a/Scripts/UI/Console Commands/CommandDebug.cs b/Scripts/UI/Console Commands/CommandDebug.cs
deleted file mode 100644
index 1d58604..0000000
--- a/Scripts/UI/Console Commands/CommandDebug.cs
+++ /dev/null
@@ -1,9 +0,0 @@
-namespace Planets;
-
-public class CommandDebug : Command
-{
- public override void Run(string[] args)
- {
- Logger.Log("Debug");
- }
-}
diff --git a/Scripts/UI/Console Commands/CommandExit.cs b/Scripts/UI/Console Commands/CommandExit.cs
deleted file mode 100644
index 3d9e598..0000000
--- a/Scripts/UI/Console Commands/CommandExit.cs
+++ /dev/null
@@ -1,11 +0,0 @@
-namespace Planets;
-
-public class CommandExit : Command
-{
- public CommandExit() => Aliases = new[] { "quit" };
-
- public override void Run(string[] args)
- {
- Global.Quit();
- }
-}
diff --git a/Scripts/UI/Console Commands/CommandHelp.cs b/Scripts/UI/Console Commands/CommandHelp.cs
deleted file mode 100644
index 7589fe8..0000000
--- a/Scripts/UI/Console Commands/CommandHelp.cs
+++ /dev/null
@@ -1,15 +0,0 @@
-namespace Planets;
-
-using System.Reflection;
-
-public class CommandHelp : Command
-{
- private static List CommandNames { get; } = Assembly.GetExecutingAssembly()
- .GetTypes()
- .Where(x => typeof(Command).IsAssignableFrom(x) && !x.IsAbstract)
- .Select(Activator.CreateInstance).Cast()
- .Select(x => x.GetType().Name.Replace("Command", "").ToLower()).ToList();
-
- public override void Run(string[] args) =>
- Logger.Log($"Commands:\n{CommandNames.Print()}");
-}
diff --git a/Scripts/UI/Options/UIOptions.cs b/Scripts/UI/Options/UIOptions.cs
deleted file mode 100644
index a29efc5..0000000
--- a/Scripts/UI/Options/UIOptions.cs
+++ /dev/null
@@ -1,10 +0,0 @@
-namespace Planets;
-
-public partial class UIOptions : PanelContainer
-{
- public override void _Ready()
- {
- //if (SceneManager.CurrentScene.Name != "Options")
- // AddThemeStyleboxOverride("panel", new StyleBoxEmpty());
- }
-}
diff --git a/Scripts/UI/Options/UIOptionsAudio.cs b/Scripts/UI/Options/UIOptionsAudio.cs
deleted file mode 100644
index cd2e495..0000000
--- a/Scripts/UI/Options/UIOptionsAudio.cs
+++ /dev/null
@@ -1,32 +0,0 @@
-namespace Planets;
-
-public partial class UIOptionsAudio : Control
-{
- private ResourceOptions Options { get; set; }
-
- public override void _Ready()
- {
- Options = OptionsManager.Options;
-
- SetupMusic();
- SetupSounds();
- }
-
- private void SetupMusic()
- {
- HSlider slider = GetNode("Music/Music");
- slider.Value = Options.MusicVolume;
- }
-
- private void SetupSounds()
- {
- HSlider slider = GetNode("Sounds/Sounds");
- slider.Value = Options.SFXVolume;
- }
-
- private void _on_music_value_changed(float v) =>
- AudioManager.SetMusicVolume(v);
-
- private void _on_sounds_value_changed(float v) =>
- AudioManager.SetSFXVolume(v);
-}
diff --git a/Scripts/UI/Options/UIOptionsDisplay.cs b/Scripts/UI/Options/UIOptionsDisplay.cs
deleted file mode 100644
index 059df4d..0000000
--- a/Scripts/UI/Options/UIOptionsDisplay.cs
+++ /dev/null
@@ -1,167 +0,0 @@
-using static Godot.DisplayServer;
-
-namespace Planets;
-
-public partial class UIOptionsDisplay : Control
-{
- private ResourceOptions Options { get; set; }
-
- // Max FPS
- private HSlider SliderMaxFPS { get; set; }
- private Label LabelMaxFPSFeedback { get; set; }
-
- // Window Size
- private LineEdit ResX { get; set; }
- private LineEdit ResY { get; set; }
-
- private int PrevNumX, PrevNumY;
-
- // Window Mode
- private OptionButton OptionButtonWindowMode { get; set; }
-
- // VSync Mode
- private OptionButton OptionButtonVSyncMode { get; set; }
-
- public override void _Ready()
- {
- Options = OptionsManager.Options;
-
- SetupMaxFPS();
- SetupWindowSize();
- SetupWindowMode();
- SetupVSyncMode();
- }
-
- private void SetupMaxFPS()
- {
- LabelMaxFPSFeedback = GetNode