diff --git a/.github/scripts/gitignore_check.sh b/.github/scripts/gitignore_check.sh
new file mode 100755
index 00000000000..f162e25391b
--- /dev/null
+++ b/.github/scripts/gitignore_check.sh
@@ -0,0 +1,26 @@
+set -uo pipefail
+shopt -s globstar
+
+echo -e ".gitignore validation..."
+
+# Get a list of files that exist in the repo but are ignored.
+
+# The --verbose flag also includes files un-ignored via ! prefixes.
+# We filter those out with a somewhat awkward `awk` directive.
+ # (Explanation: Split each line by : delimiters,
+ # see if the actual gitignore line shown in the third field starts with !,
+ # if it doesn't, print it.)
+
+# ignorecase for the sake of Windows users.
+
+output=$(git -c core.ignorecase=true check-ignore --verbose --no-index **/* | \
+ awk -F ':' '{ if ($3 !~ /^!/) print $0 }')
+
+# Then we take this result and return success if it's empty.
+if [ -z "$output" ]; then
+ exit 0
+else
+ # And print the result if it isn't.
+ echo "$output"
+ exit 1
+fi
diff --git a/.github/workflows/static_checks.yml b/.github/workflows/static_checks.yml
index faa949789b4..72088534be6 100644
--- a/.github/workflows/static_checks.yml
+++ b/.github/workflows/static_checks.yml
@@ -9,11 +9,24 @@ jobs:
- name: Checkout
uses: actions/checkout@v4
- - name: Install dependencies
+ # This needs to happen before Python and npm execution; it must happen before any extra files are written.
+ - name: .gitignore checks (gitignore_check.sh)
run: |
- sudo apt-get update -qq
- sudo apt-get install -qq dos2unix recode
+ bash ./.github/scripts/gitignore_check.sh
- - name: File formatting checks (file_format.sh)
+ - name: Get changed files
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
- bash ./file_format.sh
+ if [ "${{ github.event_name }}" == "pull_request" ]; then
+ files=$(git diff-tree --no-commit-id --name-only -r HEAD^1..HEAD 2> /dev/null || true)
+ elif [ "${{ github.event_name }}" == "push" -a "${{ github.event.forced }}" == "false" -a "${{ github.event.created }}" == "false" ]; then
+ files=$(git diff-tree --no-commit-id --name-only -r ${{ github.event.before }}..${{ github.event.after }} 2> /dev/null || true)
+ fi
+ files=$(echo "$files" | xargs -I {} sh -c 'echo "\"./{}\""' | tr '\n' ' ')
+ echo "CHANGED_FILES=$files" >> $GITHUB_ENV
+
+ - name: Style checks via pre-commit
+ uses: pre-commit/action@v3.0.1
+ with:
+ extra_args: --files ${{ env.CHANGED_FILES }}
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
new file mode 100644
index 00000000000..1943aa4ac42
--- /dev/null
+++ b/.pre-commit-config.yaml
@@ -0,0 +1,46 @@
+default_language_version:
+ python: python3
+
+repos:
+ - repo: https://github.com/codespell-project/codespell
+ rev: v2.4.1
+ hooks:
+ - id: codespell
+ additional_dependencies: [tomli]
+
+ - repo: local
+ hooks:
+ - id: file-format
+ name: file-format
+ language: python
+ entry: python file_format.py
+ types_or: [text]
+ exclude: |
+ (?x)^(
+ .*\.test\.txt|
+ .*\.svg|
+ .*\.patch|
+ .*\.out|
+ modules/gdscript/tests/scripts/parser/features/mixed_indentation_on_blank_lines\.gd|
+ modules/gdscript/tests/scripts/parser/warnings/empty_file_newline_comment\.norun\.gd|
+ modules/gdscript/tests/scripts/parser/warnings/empty_file_newline\.norun\.gd|
+ tests/data/.*\.bin
+ )$
+
+ - id: dotnet-format
+ name: dotnet-format
+ language: python
+ entry: python dotnet_format.py
+ types_or: [c#]
+#
+# End of upstream Godot pre-commit hooks.
+#
+# Keep this separation to let downstream forks add their own hooks to this file,
+# without running into merge conflicts when rebasing on latest upstream.
+#
+# Start of downstream pre-commit hooks.
+#
+# This is still the "repo: local" scope, so new local hooks can be defined directly at this indentation:
+# - id: new-local-hook
+# To add external repo hooks, bring the indentation back to:
+# - repo: my-remote-hook
diff --git a/2d/bullet_shower/bullets.gd b/2d/bullet_shower/bullets.gd
index e909645537f..cca86096a3c 100644
--- a/2d/bullet_shower/bullets.gd
+++ b/2d/bullet_shower/bullets.gd
@@ -1,5 +1,5 @@
extends Node2D
-# This demo is an example of controling a high number of 2D objects with logic
+# This demo is an example of controlling a high number of 2D objects with logic
# and collision without using nodes in the scene. This technique is a lot more
# efficient than using instancing and nodes, but requires more programming and
# is less visual. Bullets are managed together in the `bullets.gd` script.
diff --git a/2d/bullet_shower/player.gd b/2d/bullet_shower/player.gd
index 3f07285d135..5b519c88498 100644
--- a/2d/bullet_shower/player.gd
+++ b/2d/bullet_shower/player.gd
@@ -1,5 +1,5 @@
extends Node2D
-# This demo is an example of controling a high number of 2D objects with logic
+# This demo is an example of controlling a high number of 2D objects with logic
# and collision without using nodes in the scene. This technique is a lot more
# efficient than using instancing and nodes, but requires more programming and
# is less visual. Bullets are managed together in the `bullets.gd` script.
diff --git a/2d/particles/point_normal_texture_image_outline.tres b/2d/particles/point_normal_texture_image_outline.tres
index b5908b37d80..49023ad28bf 100644
--- a/2d/particles/point_normal_texture_image_outline.tres
+++ b/2d/particles/point_normal_texture_image_outline.tres
@@ -13,4 +13,3 @@ data = {
flags = 0
image = SubResource( 1 )
size = Vector2( 2048, 1 )
-
diff --git a/2d/particles/point_texture_emit.tres b/2d/particles/point_texture_emit.tres
index d02bd586a69..35e6b4d0c50 100644
--- a/2d/particles/point_texture_emit.tres
+++ b/2d/particles/point_texture_emit.tres
@@ -17,4 +17,3 @@ image = SubResource( 1 )
size = Vector2( 2048, 6 )
storage = 0
lossy_quality = 0.7
-
diff --git a/2d/particles/point_texture_image_outline.tres b/2d/particles/point_texture_image_outline.tres
index fcc1ac7bc85..87942190de2 100644
--- a/2d/particles/point_texture_image_outline.tres
+++ b/2d/particles/point_texture_image_outline.tres
@@ -13,4 +13,3 @@ data = {
flags = 0
image = SubResource( 1 )
size = Vector2( 2048, 1 )
-
diff --git a/2d/physics_platformer/stage.tscn b/2d/physics_platformer/stage.tscn
index 6335dcd3423..465fc45e12a 100644
--- a/2d/physics_platformer/stage.tscn
+++ b/2d/physics_platformer/stage.tscn
@@ -348,7 +348,7 @@ size_flags_vertical = 0
text = "This is a simple demo on how to make a platformer game with Godot.
This version uses physics and the 2D physics engine for motion and collision.
The demo also shows the benefits of using the scene system, where coins,
-enemies and the player are edited separatedly and instanced in the stage.
+enemies and the player are edited separately and instanced in the stage.
To edit the base tiles for the tileset, open the tileset_edit.tscn file and follow
instructions."
diff --git a/2d/role_playing_game/grid_movement/grid/lines/grid_lines_tileset.tres b/2d/role_playing_game/grid_movement/grid/lines/grid_lines_tileset.tres
index e1b5ab5eb52..056f0e4c9b7 100644
--- a/2d/role_playing_game/grid_movement/grid/lines/grid_lines_tileset.tres
+++ b/2d/role_playing_game/grid_movement/grid/lines/grid_lines_tileset.tres
@@ -14,4 +14,3 @@
0/occluder_offset = Vector2( 32, 32 )
0/navigation_offset = Vector2( 32, 32 )
0/shapes = [ ]
-
diff --git a/2d/role_playing_game/theme/fonts/montserrat_extra_bold_16.tres b/2d/role_playing_game/theme/fonts/montserrat_extra_bold_16.tres
index d89db56666f..6b23202aa5c 100644
--- a/2d/role_playing_game/theme/fonts/montserrat_extra_bold_16.tres
+++ b/2d/role_playing_game/theme/fonts/montserrat_extra_bold_16.tres
@@ -10,4 +10,3 @@ use_mipmaps = true
use_filter = true
font_data = ExtResource( 1 )
_sections_unfolded = [ "Settings" ]
-
diff --git a/2d/role_playing_game/theme/fonts/montserrat_extra_bold_24.tres b/2d/role_playing_game/theme/fonts/montserrat_extra_bold_24.tres
index b8665620bc7..63789d4a71a 100644
--- a/2d/role_playing_game/theme/fonts/montserrat_extra_bold_24.tres
+++ b/2d/role_playing_game/theme/fonts/montserrat_extra_bold_24.tres
@@ -10,4 +10,3 @@ use_mipmaps = true
use_filter = true
font_data = ExtResource( 1 )
_sections_unfolded = [ "Settings" ]
-
diff --git a/2d/role_playing_game/theme/fonts/montserrat_extra_bold_32.tres b/2d/role_playing_game/theme/fonts/montserrat_extra_bold_32.tres
index b8665620bc7..63789d4a71a 100644
--- a/2d/role_playing_game/theme/fonts/montserrat_extra_bold_32.tres
+++ b/2d/role_playing_game/theme/fonts/montserrat_extra_bold_32.tres
@@ -10,4 +10,3 @@ use_mipmaps = true
use_filter = true
font_data = ExtResource( 1 )
_sections_unfolded = [ "Settings" ]
-
diff --git a/2d/role_playing_game/theme/fonts/montserrat_extra_bold_62.tres b/2d/role_playing_game/theme/fonts/montserrat_extra_bold_62.tres
index 7934fff1036..eeb612b6dfc 100644
--- a/2d/role_playing_game/theme/fonts/montserrat_extra_bold_62.tres
+++ b/2d/role_playing_game/theme/fonts/montserrat_extra_bold_62.tres
@@ -10,4 +10,3 @@ use_mipmaps = true
use_filter = true
font_data = ExtResource( 1 )
_sections_unfolded = [ "Settings" ]
-
diff --git a/3d/graphics_settings/settings.gd b/3d/graphics_settings/settings.gd
index 60c64ed2698..f39b5f091c5 100644
--- a/3d/graphics_settings/settings.gd
+++ b/3d/graphics_settings/settings.gd
@@ -172,7 +172,7 @@ func _on_shadow_size_option_button_item_selected(index):
if index == 0: # Minimum
RenderingServer.directional_shadow_atlas_set_size(512, true)
# Adjust shadow bias according to shadow resolution.
- # Higher resultions can use a lower bias without suffering from shadow acne.
+ # Higher resolutions can use a lower bias without suffering from shadow acne.
directional_light.shadow_bias = 0.06
# Disable positional (omni/spot) light shadows entirely to further improve performance.
diff --git a/3d/ik/addons/sade/ik_fabrik.gd b/3d/ik/addons/sade/ik_fabrik.gd
index ce1e962e0ac..c2e774d5335 100644
--- a/3d/ik/addons/sade/ik_fabrik.gd
+++ b/3d/ik/addons/sade/ik_fabrik.gd
@@ -5,7 +5,7 @@ extends Node3D
# The delta/tolerance for the bone chain (how do the bones need to be before it is considered satisfactory)
const CHAIN_TOLERANCE = 0.01
-# The amount of interations the bone chain will go through in an attempt to get to the target position
+# The amount of iterations the bone chain will go through in an attempt to get to the target position
const CHAIN_MAX_ITER = 10
@export var skeleton_path: NodePath:
@@ -87,7 +87,7 @@ var chain_origin = Vector3()
# The combined length of every bone in the bone chain
var total_length = INF
# The amount of iterations we've been through, and whether or not we want to limit our solver to CHAIN_MAX_ITER
-# amounts of interations.
+# amounts of iterations.
@export var chain_iterations: int = 0
@export var limit_chain_iterations: bool = true
# Should we reset chain_iterations on movement during our update method?
@@ -151,7 +151,7 @@ func _ready():
update_mode = update_mode
-# Various upate methods
+# Various update methods
func _process(_delta):
if reset_iterations_on_update:
chain_iterations = 0
@@ -206,7 +206,7 @@ func update_skeleton():
for bone_name in bones_in_chain:
bone_IDs[bone_name] = skeleton.find_bone(bone_name)
- # Set the bone node to the currect bone position
+ # Set the bone node to the current bone position
bone_nodes[i].global_transform = get_bone_transform(i)
# If this is not the last bone in the bone chain, make it look at the next bone in the bone chain
if i < bone_IDs.size()-1:
@@ -423,7 +423,7 @@ func _make_editor_sphere_at_node(node, color):
indicator_mesh.radial_segments = 8
indicator_mesh.rings = 4
- # The mesh needs a material (unless we want to use the defualt one).
+ # The mesh needs a material (unless we want to use the default one).
# Let's create a material and use the EditorGizmoTexture to texture it.
var indicator_material = StandardMaterial3D.new()
indicator_material.flags_unshaded = true
diff --git a/3d/ik/fps/example_player.gd b/3d/ik/fps/example_player.gd
index c7fc450c18d..257f56a162e 100644
--- a/3d/ik/fps/example_player.gd
+++ b/3d/ik/fps/example_player.gd
@@ -5,7 +5,7 @@ const norm_grav = -38.8
const MAX_SPEED = 22
const JUMP_SPEED = 26
const ACCEL = 8.5
-# Sprinting variables. Similar to the varibles above, just allowing for quicker movement
+# Sprinting variables. Similar to the variables above, just allowing for quicker movement
const MAX_SPRINT_SPEED = 34
const SPRINT_ACCEL = 18
# How fast we slow down, and the steepest angle we can climb.
diff --git a/3d/ik/model/battle_bot_emission.tres b/3d/ik/model/battle_bot_emission.tres
index 830fb8dd32f..54530ca7d7c 100644
--- a/3d/ik/model/battle_bot_emission.tres
+++ b/3d/ik/model/battle_bot_emission.tres
@@ -56,4 +56,3 @@ uv2_triplanar_sharpness = 1.0
proximity_fade_enable = false
distance_fade_enable = false
_sections_unfolded = [ "Albedo" ]
-
diff --git a/3d/labels_and_texts/README.md b/3d/labels_and_texts/README.md
index e3d26f8dc9e..99b1fcc40fc 100644
--- a/3d/labels_and_texts/README.md
+++ b/3d/labels_and_texts/README.md
@@ -15,7 +15,7 @@ PrimitiveMesh resource you use within a MeshsInstance3D node. Therefore, you
won't see TextMesh in the Create New Node dialog.
Icons can also be displayed in Label3D and TextMesh using icon fonts, which can
-be generated from SVG files using serivces like
+be generated from SVG files using services like
[Fontello](https://fontello.com/). Note that while Label3D supports colored
rasterized fonts (such as emoji), only monochrome fonts can be generated from
Fontello. TextMesh and Label3D with MSDF fonts are limited to monochrome fonts
diff --git a/3d/material_testers/material_tester.tscn b/3d/material_testers/material_tester.tscn
index e7469cbf150..c74c696d106 100644
--- a/3d/material_testers/material_tester.tscn
+++ b/3d/material_testers/material_tester.tscn
@@ -13,7 +13,7 @@
[ext_resource type="Material" uid="uid://ca5id5w12cprn" path="res://test_materials/stones.tres" id="11"]
[ext_resource type="Material" uid="uid://dfsu6vtygh0tc" path="res://test_materials/brick.tres" id="12"]
[ext_resource type="Material" uid="uid://dtui5o3potpen" path="res://test_materials/wool.tres" id="13"]
-[ext_resource type="Material" uid="uid://cg7l6w2h0aq22" path="res://test_materials/aluminium.tres" id="14"]
+[ext_resource type="Material" uid="uid://cg7l6w2h0aq22" path="res://test_materials/aluminum.tres" id="14"]
[ext_resource type="Material" uid="uid://c5oxndmf0jbu3" path="res://test_materials/marble.tres" id="15"]
[ext_resource type="Material" uid="uid://dv76cxap5uj7y" path="res://test_materials/cheese.tres" id="16"]
[ext_resource type="Material" uid="uid://bx0jnmhhr8qwh" path="res://test_materials/wet_sand.tres" id="17"]
@@ -181,10 +181,10 @@ enable_shadows = true
cull_mask = 2147483519
reflection_mask = 128
-[node name="Aluminium" parent="Testers" instance=ExtResource("3")]
+[node name="Aluminum" parent="Testers" instance=ExtResource("3")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 6, 0, 0)
-[node name="GodotBall" type="MeshInstance3D" parent="Testers/Aluminium"]
+[node name="GodotBall" type="MeshInstance3D" parent="Testers/Aluminum"]
transform = Transform3D(0.8, 0, 0, 0, 0.8, 0, 0, 0, 0.8, 0, 0.5, -4)
layers = 256
mesh = ExtResource("4_7al4s")
@@ -193,7 +193,7 @@ surface_material_override/1 = ExtResource("6")
surface_material_override/2 = ExtResource("5")
surface_material_override/3 = ExtResource("7")
-[node name="ReflectionProbe" type="ReflectionProbe" parent="Testers/Aluminium/GodotBall" groups=["reflection_probe"]]
+[node name="ReflectionProbe" type="ReflectionProbe" parent="Testers/Aluminum/GodotBall" groups=["reflection_probe"]]
transform = Transform3D(1.25, 0, 0, 0, 1.25, 0, 0, 0, 1.25, 0, 3, 0)
size = Vector3(256, 256, 256)
enable_shadows = true
diff --git a/3d/material_testers/test_materials/aluminium.tres b/3d/material_testers/test_materials/aluminum.tres
similarity index 100%
rename from 3d/material_testers/test_materials/aluminium.tres
rename to 3d/material_testers/test_materials/aluminum.tres
diff --git a/3d/material_testers/test_materials/aluminium_albedo.png b/3d/material_testers/test_materials/aluminum_albedo.png
similarity index 100%
rename from 3d/material_testers/test_materials/aluminium_albedo.png
rename to 3d/material_testers/test_materials/aluminum_albedo.png
diff --git a/3d/material_testers/test_materials/aluminium_albedo.png.import b/3d/material_testers/test_materials/aluminum_albedo.png.import
similarity index 69%
rename from 3d/material_testers/test_materials/aluminium_albedo.png.import
rename to 3d/material_testers/test_materials/aluminum_albedo.png.import
index 425b0cad002..8602d4b2c57 100644
--- a/3d/material_testers/test_materials/aluminium_albedo.png.import
+++ b/3d/material_testers/test_materials/aluminum_albedo.png.import
@@ -3,15 +3,15 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://dsb01xyn6yui5"
-path="res://.godot/imported/aluminium_albedo.png-a68e22c8a951430ab431b2a7307e8bc7.ctex"
+path="res://.godot/imported/aluminum_albedo.png-081eadc1db150ab14ee333ec7c5a42e4.ctex"
metadata={
"vram_texture": false
}
[deps]
-source_file="res://test_materials/aluminium_albedo.png"
-dest_files=["res://.godot/imported/aluminium_albedo.png-a68e22c8a951430ab431b2a7307e8bc7.ctex"]
+source_file="res://test_materials/aluminum_albedo.png"
+dest_files=["res://.godot/imported/aluminum_albedo.png-081eadc1db150ab14ee333ec7c5a42e4.ctex"]
[params]
diff --git a/3d/material_testers/test_materials/aluminium_flow.png b/3d/material_testers/test_materials/aluminum_flow.png
similarity index 100%
rename from 3d/material_testers/test_materials/aluminium_flow.png
rename to 3d/material_testers/test_materials/aluminum_flow.png
diff --git a/3d/material_testers/test_materials/aluminium_flow.png.import b/3d/material_testers/test_materials/aluminum_flow.png.import
similarity index 70%
rename from 3d/material_testers/test_materials/aluminium_flow.png.import
rename to 3d/material_testers/test_materials/aluminum_flow.png.import
index afcdb252be2..9054b2ed903 100644
--- a/3d/material_testers/test_materials/aluminium_flow.png.import
+++ b/3d/material_testers/test_materials/aluminum_flow.png.import
@@ -3,15 +3,15 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://cqlianda7xhoy"
-path="res://.godot/imported/aluminium_flow.png-93fdac7ed0fa884674e32e5ec0c6d690.ctex"
+path="res://.godot/imported/aluminum_flow.png-33fc2e7d59813577c085f138a7f09d7e.ctex"
metadata={
"vram_texture": false
}
[deps]
-source_file="res://test_materials/aluminium_flow.png"
-dest_files=["res://.godot/imported/aluminium_flow.png-93fdac7ed0fa884674e32e5ec0c6d690.ctex"]
+source_file="res://test_materials/aluminum_flow.png"
+dest_files=["res://.godot/imported/aluminum_flow.png-33fc2e7d59813577c085f138a7f09d7e.ctex"]
[params]
diff --git a/3d/material_testers/test_materials/aluminium_normal.png b/3d/material_testers/test_materials/aluminum_normal.png
similarity index 100%
rename from 3d/material_testers/test_materials/aluminium_normal.png
rename to 3d/material_testers/test_materials/aluminum_normal.png
diff --git a/3d/material_testers/test_materials/aluminium_normal.png.import b/3d/material_testers/test_materials/aluminum_normal.png.import
similarity index 69%
rename from 3d/material_testers/test_materials/aluminium_normal.png.import
rename to 3d/material_testers/test_materials/aluminum_normal.png.import
index 330d6f35798..5ccf7ff9bdb 100644
--- a/3d/material_testers/test_materials/aluminium_normal.png.import
+++ b/3d/material_testers/test_materials/aluminum_normal.png.import
@@ -3,15 +3,15 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://ds1h5kb3sbtqq"
-path="res://.godot/imported/aluminium_normal.png-ff9bf84211f307b1d9e8bf86ebea04b1.ctex"
+path="res://.godot/imported/aluminum_normal.png-c3d4ddf3eca393ad1ee11941483c8807.ctex"
metadata={
"vram_texture": false
}
[deps]
-source_file="res://test_materials/aluminium_normal.png"
-dest_files=["res://.godot/imported/aluminium_normal.png-ff9bf84211f307b1d9e8bf86ebea04b1.ctex"]
+source_file="res://test_materials/aluminum_normal.png"
+dest_files=["res://.godot/imported/aluminum_normal.png-c3d4ddf3eca393ad1ee11941483c8807.ctex"]
[params]
diff --git a/3d/platformer/export_presets.cfg b/3d/platformer/export_presets.cfg
deleted file mode 100644
index 9573ac06e83..00000000000
--- a/3d/platformer/export_presets.cfg
+++ /dev/null
@@ -1,221 +0,0 @@
-[preset.0]
-
-exclude_filter=""
-export_filter="all_resources"
-include_filter=""
-name="Linux/X11"
-patch_list=PackedStringArray( )
-platform="Linux/X11"
-runnable=true
-
-[preset.0.options]
-
-binary_format/64_bits=true
-custom_template/debug=""
-custom_template/release=""
-texture_format/etc=false
-texture_format/etc2=false
-texture_format/s3tc=true
-
-[preset.1]
-
-exclude_filter=""
-export_filter="all_resources"
-include_filter=""
-name="Android"
-patch_list=PackedStringArray( )
-platform="Android"
-runnable=true
-
-[preset.1.options]
-
-apk_expansion/SALT=""
-apk_expansion/enable=false
-apk_expansion/public_key=""
-architecture/arm=true
-architecture/x86=false
-command_line/extra_args=""
-custom_package/debug=""
-custom_package/release=""
-keystore/release=""
-keystore/release_password=""
-keystore/release_user=""
-one_click_deploy/clear_previous_install=true
-package/icon=""
-package/name=""
-package/signed=true
-package/unique_name="org.godotengine.$genname"
-permissions/access_checkin_properties=false
-permissions/access_coarse_location=false
-permissions/access_fine_location=false
-permissions/access_location_extra_commands=false
-permissions/access_mock_location=false
-permissions/access_network_state=false
-permissions/access_surface_flinger=false
-permissions/access_wifi_state=false
-permissions/account_manager=false
-permissions/add_voicemail=false
-permissions/authenticate_accounts=false
-permissions/battery_stats=false
-permissions/bind_accessibility_service=false
-permissions/bind_appwidget=false
-permissions/bind_device_admin=false
-permissions/bind_input_method=false
-permissions/bind_nfc_service=false
-permissions/bind_notification_listener_service=false
-permissions/bind_print_service=false
-permissions/bind_remoteviews=false
-permissions/bind_text_service=false
-permissions/bind_vpn_service=false
-permissions/bind_wallpaper=false
-permissions/bluetooth=false
-permissions/bluetooth_admin=false
-permissions/bluetooth_privileged=false
-permissions/brick=false
-permissions/broadcast_package_removed=false
-permissions/broadcast_sms=false
-permissions/broadcast_sticky=false
-permissions/broadcast_wap_push=false
-permissions/call_phone=false
-permissions/call_privileged=false
-permissions/camera=false
-permissions/capture_audio_output=false
-permissions/capture_secure_video_output=false
-permissions/capture_video_output=false
-permissions/change_component_enabled_state=false
-permissions/change_configuration=false
-permissions/change_network_state=false
-permissions/change_wifi_multicast_state=false
-permissions/change_wifi_state=false
-permissions/clear_app_cache=false
-permissions/clear_app_user_data=false
-permissions/control_location_updates=false
-permissions/delete_cache_files=false
-permissions/delete_packages=false
-permissions/device_power=false
-permissions/diagnostic=false
-permissions/disable_keyguard=false
-permissions/dump=false
-permissions/expand_status_bar=false
-permissions/factory_test=false
-permissions/flashlight=false
-permissions/force_back=false
-permissions/get_accounts=false
-permissions/get_package_size=false
-permissions/get_tasks=false
-permissions/get_top_activity_info=false
-permissions/global_search=false
-permissions/hardware_test=false
-permissions/inject_events=false
-permissions/install_location_provider=false
-permissions/install_packages=false
-permissions/install_shortcut=false
-permissions/internal_system_window=false
-permissions/internet=false
-permissions/kill_background_processes=false
-permissions/location_hardware=false
-permissions/manage_accounts=false
-permissions/manage_app_tokens=false
-permissions/manage_documents=false
-permissions/master_clear=false
-permissions/media_content_control=false
-permissions/modify_audio_settings=false
-permissions/modify_phone_state=false
-permissions/mount_format_filesystems=false
-permissions/mount_unmount_filesystems=false
-permissions/nfc=false
-permissions/persistent_activity=false
-permissions/process_outgoing_calls=false
-permissions/read_calendar=false
-permissions/read_call_log=false
-permissions/read_contacts=false
-permissions/read_external_storage=false
-permissions/read_frame_buffer=false
-permissions/read_history_bookmarks=false
-permissions/read_input_state=false
-permissions/read_logs=false
-permissions/read_phone_state=false
-permissions/read_profile=false
-permissions/read_sms=false
-permissions/read_social_stream=false
-permissions/read_sync_settings=false
-permissions/read_sync_stats=false
-permissions/read_user_dictionary=false
-permissions/reboot=false
-permissions/receive_boot_completed=false
-permissions/receive_mms=false
-permissions/receive_sms=false
-permissions/receive_wap_push=false
-permissions/record_audio=false
-permissions/reorder_tasks=false
-permissions/restart_packages=false
-permissions/send_respond_via_message=false
-permissions/send_sms=false
-permissions/set_activity_watcher=false
-permissions/set_alarm=false
-permissions/set_always_finish=false
-permissions/set_animation_scale=false
-permissions/set_debug_app=false
-permissions/set_orientation=false
-permissions/set_pointer_speed=false
-permissions/set_preferred_applications=false
-permissions/set_process_limit=false
-permissions/set_time=false
-permissions/set_time_zone=false
-permissions/set_wallpaper=false
-permissions/set_wallpaper_hints=false
-permissions/signal_persistent_processes=false
-permissions/status_bar=false
-permissions/subscribed_feeds_read=false
-permissions/subscribed_feeds_write=false
-permissions/system_alert_window=false
-permissions/transmit_ir=false
-permissions/uninstall_shortcut=false
-permissions/update_device_stats=false
-permissions/use_credentials=false
-permissions/use_sip=false
-permissions/vibrate=false
-permissions/wake_lock=false
-permissions/write_apn_settings=false
-permissions/write_calendar=false
-permissions/write_call_log=false
-permissions/write_contacts=false
-permissions/write_external_storage=false
-permissions/write_gservices=false
-permissions/write_history_bookmarks=false
-permissions/write_profile=false
-permissions/write_secure_settings=false
-permissions/write_settings=false
-permissions/write_sms=false
-permissions/write_social_stream=false
-permissions/write_sync_settings=false
-permissions/write_user_dictionary=false
-screen/immersive_mode=true
-screen/orientation=0
-screen/support_large=true
-screen/support_normal=true
-screen/support_small=true
-screen/support_xlarge=true
-screen/use_32_bits_view=true
-user_permissions/0=false
-user_permissions/1=false
-user_permissions/10=false
-user_permissions/11=false
-user_permissions/12=false
-user_permissions/13=false
-user_permissions/14=false
-user_permissions/15=false
-user_permissions/16=false
-user_permissions/17=false
-user_permissions/18=false
-user_permissions/19=false
-user_permissions/2=false
-user_permissions/3=false
-user_permissions/4=false
-user_permissions/5=false
-user_permissions/6=false
-user_permissions/7=false
-user_permissions/8=false
-user_permissions/9=false
-version/code=1
-version/name="1.0"
diff --git a/audio/mic_record/MicRecord.gd b/audio/mic_record/MicRecord.gd
index 184ab3130e6..d0313790479 100644
--- a/audio/mic_record/MicRecord.gd
+++ b/audio/mic_record/MicRecord.gd
@@ -96,4 +96,3 @@ func _on_stereo_check_button_toggled(button_pressed: bool) -> void:
func _on_open_user_folder_button_pressed() -> void:
OS.shell_open(ProjectSettings.globalize_path("user://"))
-
diff --git a/compute/post_shader/README.md b/compute/post_shader/README.md
index 536cebe2035..51102b20ace 100644
--- a/compute/post_shader/README.md
+++ b/compute/post_shader/README.md
@@ -33,7 +33,7 @@ This approach is not able to make efficient use of shader caching and may not be
platforms, such as certain consoles, that require precompiling of shaders.
`post_process_grayscale.gd` show an example where the shader code is stored in a file,
-namely `post_process_grayscale.glsl` and is compiled on initialisation.
+namely `post_process_grayscale.glsl` and is compiled on initialization.
For editing a project this means that the shader is compiled once when the effect is loaded.
Making changes to the `glsl` file will require reloading the scene.
The advantage of this approach is that Godot can precompile the `glsl` file.
diff --git a/compute/post_shader/main.gd b/compute/post_shader/main.gd
index 27f333b37df..5a39b20ac33 100644
--- a/compute/post_shader/main.gd
+++ b/compute/post_shader/main.gd
@@ -20,4 +20,3 @@ Shader effect: %s
"Enabled" if compositor.compositor_effects[0].enabled else "Disabled",
"Enabled" if compositor.compositor_effects[1].enabled else "Disabled",
]
-
diff --git a/compute/post_shader/post_process_grayscale.glsl.import b/compute/post_shader/post_process_grayscale.glsl.import
index 653ea822221..f46e950ca08 100644
--- a/compute/post_shader/post_process_grayscale.glsl.import
+++ b/compute/post_shader/post_process_grayscale.glsl.import
@@ -11,4 +11,3 @@ source_file="res://post_process_grayscale.glsl"
dest_files=["res://.godot/imported/post_process_grayscale.glsl-74f080e1b01e56b39260b8709956a520.res"]
[params]
-
diff --git a/compute/texture/water_plane/water_compute.glsl b/compute/texture/water_plane/water_compute.glsl
index fbed31c784c..bf7ffeed0ed 100644
--- a/compute/texture/water_plane/water_compute.glsl
+++ b/compute/texture/water_plane/water_compute.glsl
@@ -24,7 +24,7 @@ void main() {
ivec2 uv = ivec2(gl_GlobalInvocationID.xy);
- // Just in case the texture size is not divisable by 8.
+ // Just in case the texture size is not divisible by 8.
if ((uv.x > size.x) || (uv.y > size.y)) {
return;
}
diff --git a/compute/texture/water_plane/water_compute.glsl.import b/compute/texture/water_plane/water_compute.glsl.import
index 8ef651fc6f5..ebf872a7679 100644
--- a/compute/texture/water_plane/water_compute.glsl.import
+++ b/compute/texture/water_plane/water_compute.glsl.import
@@ -11,4 +11,3 @@ source_file="res://water_plane/water_compute.glsl"
dest_files=["res://.godot/imported/water_compute.glsl-c7fe8f11197ba28412c4cdf6f7a9a21b.res"]
[params]
-
diff --git a/compute/texture/water_plane/water_plane.gd b/compute/texture/water_plane/water_plane.gd
index 9bcb925fe4e..1aa2fe07557 100644
--- a/compute/texture/water_plane/water_plane.gd
+++ b/compute/texture/water_plane/water_plane.gd
@@ -35,7 +35,7 @@ var mouse_pressed: bool = false
# Called when the node enters the scene tree for the first time.
func _ready() -> void:
# In case we're running stuff on the rendering thread
- # we need to do our initialisation on that thread.
+ # we need to do our initialization on that thread.
RenderingServer.call_on_render_thread(_initialize_compute_code.bind(texture_size))
# Get our texture from our material so we set our RID.
diff --git a/compute/texture/water_plane/water_plane.tscn b/compute/texture/water_plane/water_plane.tscn
index 0ca27a612d0..0868e1c9252 100644
--- a/compute/texture/water_plane/water_plane.tscn
+++ b/compute/texture/water_plane/water_plane.tscn
@@ -11,7 +11,7 @@ resource_local_to_scene = true
render_priority = 0
shader = ExtResource("1_rujqj")
shader_parameter/albedo = Color(5.19812e-06, 0.748295, 0.942472, 1)
-shader_parameter/metalic = 1.0
+shader_parameter/metallic = 1.0
shader_parameter/roughness = 0.0
shader_parameter/effect_texture = SubResource("Texture2DRD_gbeoi")
shader_parameter/effect_texture_size = Vector2(0, 0)
diff --git a/compute/texture/water_plane/water_shader.gdshader b/compute/texture/water_plane/water_shader.gdshader
index 481fb6ccafb..a74534eed1e 100644
--- a/compute/texture/water_plane/water_shader.gdshader
+++ b/compute/texture/water_plane/water_shader.gdshader
@@ -2,7 +2,7 @@ shader_type spatial;
render_mode blend_mix, depth_draw_opaque, cull_back, diffuse_burley, specular_schlick_ggx;
uniform vec3 albedo : source_color;
-uniform float metalic : hint_range(0.0, 1.0, 0.1) = 0.8;
+uniform float metallic : hint_range(0.0, 1.0, 0.1) = 0.8;
uniform float roughness : hint_range(0.0, 1.0, 0.1) = 0.2;
uniform sampler2D effect_texture;
uniform vec2 effect_texture_size;
@@ -27,7 +27,7 @@ void fragment() {
NORMAL_MAP = normalize(cross(binormal, tangent)) * 0.5 + 0.5;
ALBEDO = albedo.rgb;
- METALLIC = metalic;
+ METALLIC = metallic;
ROUGHNESS = roughness;
SPECULAR = 0.5;
}
diff --git a/dotnet_format.py b/dotnet_format.py
new file mode 100644
index 00000000000..51fd7a1223f
--- /dev/null
+++ b/dotnet_format.py
@@ -0,0 +1,34 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+import glob
+import os
+import sys
+
+if len(sys.argv) < 2:
+ print("Invalid usage of dotnet_format.py, it should be called with a path to one or multiple files.")
+ sys.exit(1)
+
+# Create dummy generated files, if needed.
+for path in [
+ "modules/mono/SdkPackageVersions.props",
+]:
+ if os.path.exists(path):
+ continue
+ os.makedirs(os.path.dirname(path), exist_ok=True)
+ with open(path, "w", encoding="utf-8", newline="\n") as f:
+ f.write("")
+
+# Avoid importing GeneratedIncludes.props.
+os.environ["GodotSkipGenerated"] = "true"
+
+# Match all the input files to their respective C# project.
+projects = {
+ path: " ".join([f for f in sys.argv[1:] if os.path.commonpath([f, path]) == path])
+ for path in [os.path.dirname(f) for f in glob.glob("**/*.csproj", recursive=True)]
+}
+
+# Run dotnet format on all projects with more than 0 modified files.
+for path, files in projects.items():
+ if files:
+ os.system(f"dotnet format {path} --include {files}")
diff --git a/file_format.py b/file_format.py
new file mode 100644
index 00000000000..a4ea544a451
--- /dev/null
+++ b/file_format.py
@@ -0,0 +1,51 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+import sys
+
+if len(sys.argv) < 2:
+ print("Invalid usage of file_format.py, it should be called with a path to one or multiple files.")
+ sys.exit(1)
+
+BOM = b"\xef\xbb\xbf"
+
+changed = []
+invalid = []
+
+for file in sys.argv[1:]:
+ try:
+ with open(file, "rt", encoding="utf-8") as f:
+ original = f.read()
+ except UnicodeDecodeError:
+ invalid.append(file)
+ continue
+
+ if original == "":
+ continue
+
+ EOL = "\r\n" if file.endswith((".csproj", ".sln", ".bat")) or file.startswith("misc/msvs") else "\n"
+ WANTS_BOM = file.endswith((".csproj", ".sln"))
+
+ revamp = EOL.join([line.rstrip("\n\r\t ") for line in original.splitlines(True)]).rstrip(EOL) + EOL
+
+ new_raw = revamp.encode(encoding="utf-8")
+ if not WANTS_BOM and new_raw.startswith(BOM):
+ new_raw = new_raw[len(BOM) :]
+ elif WANTS_BOM and not new_raw.startswith(BOM):
+ new_raw = BOM + new_raw
+
+ with open(file, "rb") as f:
+ old_raw = f.read()
+
+ if old_raw != new_raw:
+ changed.append(file)
+ with open(file, "wb") as f:
+ f.write(new_raw)
+
+if changed:
+ for file in changed:
+ print(f"FIXED: {file}")
+if invalid:
+ for file in invalid:
+ print(f"REQUIRES MANUAL CHANGES: {file}")
+ sys.exit(1)
diff --git a/file_format.sh b/file_format.sh
deleted file mode 100755
index fab029eb3cf..00000000000
--- a/file_format.sh
+++ /dev/null
@@ -1,55 +0,0 @@
-#!/usr/bin/env bash
-
-# This script ensures proper POSIX text file formatting and a few other things.
-
-set -uo pipefail
-IFS=$'\n\t'
-
-# Loops through all text files tracked by Git.
-git grep -zIl '' |
-while IFS= read -rd '' f; do
- # Exclude some types of files.
- if [[ "$f" == *"csproj" ]]; then
- continue
- elif [[ "$f" == *"hdr" ]]; then
- continue
- fi
- # Ensure that files are UTF-8 formatted.
- recode UTF-8 "$f" 2> /dev/null
- # Ensure that files have LF line endings and do not contain a BOM.
- dos2unix "$f" 2> /dev/null
- # Remove trailing space characters and ensures that files end
- # with newline characters. -l option handles newlines conveniently.
- perl -i -ple 's/\s*$//g' "$f"
- # Remove the character sequence "== true" if it has a leading space.
- perl -i -pe 's/\x20== true//g' "$f"
- # We don't want to change lines around braces in godot/tscn files.
- if [[ "$f" == *"godot" ]]; then
- continue
- elif [[ "$f" == *"tscn" ]]; then
- continue
- fi
- # Disallow empty lines after the opening brace.
- sed -z -i 's/\x7B\x0A\x0A/\x7B\x0A/g' "$f"
- # Disallow some empty lines before the closing brace.
- sed -z -i 's/\x0A\x0A\x7D/\x0A\x7D/g' "$f"
-done
-
-git diff > patch.patch
-FILESIZE="$(stat -c%s patch.patch)"
-MAXSIZE=5
-
-# If no patch has been generated all is OK, clean up, and exit.
-if (( FILESIZE < MAXSIZE )); then
- printf "Files in this commit comply with the formatting rules.\n"
- rm -f patch.patch
- exit 0
-fi
-
-# A patch has been created, notify the user, clean up, and exit.
-printf "\n*** The following differences were found between the code "
-printf "and the formatting rules:\n\n"
-cat patch.patch
-printf "\n*** Aborting, please fix your commit(s) with 'git commit --amend' or 'git rebase -i '\n"
-rm -f patch.patch
-exit 1
diff --git a/gui/bidi_and_font_features/bidi.gd b/gui/bidi_and_font_features/bidi.gd
index 27ac3104fc8..e869cb657bf 100644
--- a/gui/bidi_and_font_features/bidi.gd
+++ b/gui/bidi_and_font_features/bidi.gd
@@ -123,7 +123,3 @@ func _on_system_font_italic_toggled(button_pressed: bool) -> void:
func _on_system_font_name_text_changed(new_text: String) -> void:
var system_font: SystemFont = $"TabContainer/System fonts/VBoxContainer/Custom/FontName".get_theme_font("font")
system_font.font_names[0] = new_text
-
-
-
-
diff --git a/gui/gd_paint/paint_control.gd b/gui/gd_paint/paint_control.gd
index 8b7064ae281..5bd42f73c21 100644
--- a/gui/gd_paint/paint_control.gd
+++ b/gui/gd_paint/paint_control.gd
@@ -29,7 +29,7 @@ var mouse_click_start_pos := Vector2.INF
# A boolean to tell whether we've set undo_elements_list_num, which holds the size of draw_elements_list
# before a new stroke is added (unless the current brush mode is 'rectangle shape' or 'circle shape', in
-# which case we do things a litte differently. See the undo_stroke function for more details).
+# which case we do things a little differently. See the undo_stroke function for more details).
var undo_set := false
var undo_element_list_num := -1
@@ -97,7 +97,7 @@ func check_if_mouse_is_inside_canvas() -> bool:
# Make sure we have a mouse click starting position.
if mouse_click_start_pos != null:
# Make sure the mouse click starting position is inside the canvas.
- # This is so if we start out click outside the canvas (say chosing a color from the color picker)
+ # This is so if we start out click outside the canvas (say choosing a color from the color picker)
# and then move our mouse back into the canvas, it won't start painting.
if Rect2(drawing_area.position, drawing_area.size).has_point(mouse_click_start_pos):
# Make sure the current mouse position is inside the canvas.
@@ -141,7 +141,7 @@ func add_brush(mouse_pos: Vector2, type: BrushMode) -> void:
var new_brush := {}
# Populate the dictionary with values based on the global brush variables.
- # We will override these as needed if the brush is a rectange or circle.
+ # We will override these as needed if the brush is a rectangle or circle.
new_brush.brush_type = type
new_brush.brush_pos = mouse_pos
new_brush.brush_shape = brush_shape
@@ -176,10 +176,10 @@ func add_brush(mouse_pos: Vector2, type: BrushMode) -> void:
# If the brush isa circle shape, then we need to calculate the radius of the circle.
if type == BrushMode.CIRCLE_SHAPE:
- # Get the center point inbetween the mouse position and the position of the mouse when we clicked.
+ # Get the center point in between the mouse position and the position of the mouse when we clicked.
var center_pos := Vector2((mouse_pos.x + mouse_click_start_pos.x) / 2, (mouse_pos.y + mouse_click_start_pos.y) / 2)
# Assign the brush position to the center point, and calculate the radius of the circle using the distance from
- # the center to the top/bottom positon of the mouse.
+ # the center to the top/bottom position of the mouse.
new_brush.brush_pos = center_pos
new_brush.brush_shape_circle_radius = center_pos.distance_to(Vector2(center_pos.x, mouse_pos.y))
@@ -214,7 +214,7 @@ func _draw() -> void:
elif brush.brush_shape == BrushShape.CIRCLE:
draw_circle(brush.brush_pos, brush.brush_size / 2, bg_color)
BrushMode.RECTANGLE_SHAPE:
- # We make a Rect2 with the postion at the top left. To get the size we take the bottom right position
+ # We make a Rect2 with the position at the top left. To get the size we take the bottom right position
# and subtract the top left corner's position.
var rect := Rect2(brush.brush_pos, brush.brush_shape_rect_pos_BR - brush.brush_pos)
draw_rect(rect, brush.brush_color)
diff --git a/gui/gd_paint/tools_panel.gd b/gui/gd_paint/tools_panel.gd
index f58874aee80..25823bd8543 100644
--- a/gui/gd_paint/tools_panel.gd
+++ b/gui/gd_paint/tools_panel.gd
@@ -68,7 +68,7 @@ func button_pressed(button_name: String) -> void:
paint_control.brush_shape = paint_control.BrushShape.CIRCLE
shape_name = "Circle"
- # If a opperation button is pressed
+ # If a operation button is pressed
elif button_name == "clear_picture":
paint_control.brush_data_list.clear()
paint_control.queue_redraw()
@@ -104,5 +104,5 @@ func brush_size_changed(value: float) -> void:
func save_file_selected(path: String) -> void:
- # Call save_picture in paint_control, passing in the path we recieved from SaveFileDialog.
+ # Call save_picture in paint_control, passing in the path we received from SaveFileDialog.
paint_control.save_picture(path)
diff --git a/gui/translation/README.md b/gui/translation/README.md
index 3de786a9625..b20b3dc5951 100644
--- a/gui/translation/README.md
+++ b/gui/translation/README.md
@@ -16,7 +16,7 @@ automatically on locale change. This process is known as *remapping*.
Both CSV and gettext (PO/POT) approaches are showcased. Use the button in the
bottom-right corner to switch between the two approaches.
-The resouce remapping process with PO is the same with CSV. The in-game text translation
+The resource remapping process with PO is the same with CSV. The in-game text translation
process is also the same – use keys to fetch the appropriate translation.
The main difference between PO files and CSV files is the way both of them store
diff --git a/gui/translation/translation_demo_po.tscn b/gui/translation/translation_demo_po.tscn
index fa530bc218a..ac12f395614 100644
--- a/gui/translation/translation_demo_po.tscn
+++ b/gui/translation/translation_demo_po.tscn
@@ -70,7 +70,7 @@ size_flags_horizontal = 2
size_flags_vertical = 0
text = "This second demo showcases localization using gettext (PO/POT) files.
-The resouce remapping process is the same with CSV. The in-game text translation
+The resource remapping process is the same with CSV. The in-game text translation
process is also the same – use keys to fetch the appropriate translation.
The main difference between PO files and CSV files is the way both of them store
diff --git a/gui/translation/translation_po.gd b/gui/translation/translation_po.gd
index 921cbf5f333..c5f4118f95b 100644
--- a/gui/translation/translation_po.gd
+++ b/gui/translation/translation_po.gd
@@ -36,7 +36,7 @@ func _print_intro() -> void:
# PO plural translation example.
# The difference with CSV is that you must add the "plural_message" argument, because PO files
- # expect the data (else undefine behaviour might occur).
+ # expect the data (else undefine behavior might occur).
var days_passed := randi_range(1, 3)
print(tr_n("One day ago.", "{days} days ago.", days_passed).format({ days = days_passed }))
diff --git a/misc/compute_shader_heightmap/compute_shader.glsl.import b/misc/compute_shader_heightmap/compute_shader.glsl.import
index 64e0cfba1d8..92d45486180 100644
--- a/misc/compute_shader_heightmap/compute_shader.glsl.import
+++ b/misc/compute_shader_heightmap/compute_shader.glsl.import
@@ -11,4 +11,3 @@ source_file="res://compute_shader.glsl"
dest_files=["res://.godot/imported/compute_shader.glsl-0816de56a4f9dce0934d88a29a0758cf.res"]
[params]
-
diff --git a/misc/compute_shader_heightmap/main.gd b/misc/compute_shader_heightmap/main.gd
index c9a4781b101..75b6102c414 100644
--- a/misc/compute_shader_heightmap/main.gd
+++ b/misc/compute_shader_heightmap/main.gd
@@ -32,7 +32,7 @@ func _init() -> void:
gradient = Gradient.new()
gradient.add_point(0.6, Color(0.9, 0.9, 0.9, 1.0))
gradient.add_point(0.8, Color(1.0, 1.0, 1.0, 1.0))
- # The gradient will start black, transition to grey in the first 70%, then to white in the last 30%.
+ # The gradient will start black, transition to gray in the first 70%, then to white in the last 30%.
gradient.reverse()
# Create a 1D texture (single row of pixels) from gradient.
diff --git a/misc/graphics_tablet_input/graphics_tablet_input.gd b/misc/graphics_tablet_input/graphics_tablet_input.gd
index 49aa8fb1650..c24523b96cb 100644
--- a/misc/graphics_tablet_input/graphics_tablet_input.gd
+++ b/misc/graphics_tablet_input/graphics_tablet_input.gd
@@ -14,7 +14,7 @@ var event_tilt: Vector2
var line_color := Color.BLACK
var line_width: float = 3.0
-# If `true`, modulate line width accordding to pen pressure.
+# If `true`, modulate line width according to pen pressure.
# This is done using a width curve that is continuously recreated to match the line's actual profile
# as the line is being drawn by the user.
var pressure_sensitive: bool = true
diff --git a/misc/joypads/joypads.gd b/misc/joypads/joypads.gd
index cd07511ac13..71a9e18b053 100644
--- a/misc/joypads/joypads.gd
+++ b/misc/joypads/joypads.gd
@@ -71,7 +71,7 @@ func _process(_delta: float) -> void:
# Transparent white modulate, non-alpha color channels are not changed here.
joypad_axes.get_node(str(axis)).self_modulate.a = scaled_alpha_value
- # Highlight axis labels that are within the "active" value range. Simular to the button highlighting for loop below.
+ # Highlight axis labels that are within the "active" value range. Similar to the button highlighting for loop below.
axes.get_node("Axis" + str(axis) + "/Label").add_theme_color_override("font_color", FONT_COLOR_DEFAULT)
if abs(axis_value) >= DEADZONE:
axes.get_node("Axis" + str(axis) + "/Label").add_theme_color_override("font_color", FONT_COLOR_ACTIVE)
diff --git a/misc/os_test/Operating System Testing.csproj b/misc/os_test/Operating System Testing.csproj
index 973e86ecfab..0165519a799 100644
--- a/misc/os_test/Operating System Testing.csproj
+++ b/misc/os_test/Operating System Testing.csproj
@@ -1,6 +1,6 @@
-
+
net472
OperatingSystemTesting
-
\ No newline at end of file
+
diff --git a/misc/os_test/Operating System Testing.sln b/misc/os_test/Operating System Testing.sln
index cd21dcac765..d418afb2a02 100644
--- a/misc/os_test/Operating System Testing.sln
+++ b/misc/os_test/Operating System Testing.sln
@@ -1,4 +1,4 @@
-Microsoft Visual Studio Solution File, Format Version 12.00
+Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 2012
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Operating System Testing", "Operating System Testing.csproj", "{780B9CDA-51E7-446A-816F-0E2CF667C96C}"
EndProject
diff --git a/misc/window_management/README.md b/misc/window_management/README.md
index be89043e1c0..d46df456108 100644
--- a/misc/window_management/README.md
+++ b/misc/window_management/README.md
@@ -13,7 +13,7 @@ A demo showing the various window management features available through
Language: GDScript
-Renderer: Compatbility
+Renderer: Compatibility
Check out this demo on the asset library: https://godotengine.org/asset-library/asset/2791
diff --git a/mobile/android_iap/iap_demo.gd b/mobile/android_iap/iap_demo.gd
index 224545122c4..57aec022c30 100644
--- a/mobile/android_iap/iap_demo.gd
+++ b/mobile/android_iap/iap_demo.gd
@@ -60,7 +60,7 @@ func _on_connected() -> void:
func _on_query_purchases_response(query_result: Dictionary) -> void:
if query_result.status == OK:
for purchase: Dictionary in query_result.purchases:
- # We must acknowledge all puchases.
+ # We must acknowledge all purchases.
# See https://developer.android.com/google/play/billing/integrate#process for more information
if not purchase.is_acknowledged:
print("Purchase " + str(purchase.sku) + " has not been acknowledged. Acknowledging...")
@@ -106,7 +106,7 @@ func _on_purchase_error(code: int, message: String) -> void:
func _on_purchase_acknowledgement_error(code: int, message: String) -> void:
- show_alert("Purchase acknowledgement error %d: %s" % [code, message])
+ show_alert("Purchase acknowledgment error %d: %s" % [code, message])
func _on_purchase_consumption_error(code: int, message: String, purchase_token: String) -> void:
diff --git a/modules/mono/SdkPackageVersions.props b/modules/mono/SdkPackageVersions.props
new file mode 100644
index 00000000000..058246e4086
--- /dev/null
+++ b/modules/mono/SdkPackageVersions.props
@@ -0,0 +1 @@
+
diff --git a/mono/2.5d/2.5D Demo with C#.csproj b/mono/2.5d/2.5D Demo with C#.csproj
index fee388be00f..3ad04c65387 100644
--- a/mono/2.5d/2.5D Demo with C#.csproj
+++ b/mono/2.5d/2.5D Demo with C#.csproj
@@ -1,6 +1,6 @@
-
+
net472
Demo
-
\ No newline at end of file
+
diff --git a/mono/2.5d/2.5D Demo with C#.sln b/mono/2.5d/2.5D Demo with C#.sln
index 220c948e542..d65bb2862c7 100644
--- a/mono/2.5d/2.5D Demo with C#.sln
+++ b/mono/2.5d/2.5D Demo with C#.sln
@@ -1,4 +1,4 @@
-Microsoft Visual Studio Solution File, Format Version 12.00
+Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 2012
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "2.5D Demo with C#", "2.5D Demo with C#.csproj", "{5CA791DB-5050-44D0-989B-41D559AB1D50}"
EndProject
diff --git a/mono/android_iap/Android in-app purchases with C#.csproj b/mono/android_iap/Android in-app purchases with C#.csproj
index ab39c90de77..429ce0a361a 100644
--- a/mono/android_iap/Android in-app purchases with C#.csproj
+++ b/mono/android_iap/Android in-app purchases with C#.csproj
@@ -1,4 +1,4 @@
-
+
net6.0
net7.0
@@ -6,4 +6,4 @@
true
AndroidinapppurchaseswithC
-
\ No newline at end of file
+
diff --git a/mono/android_iap/Android in-app purchases with C#.sln b/mono/android_iap/Android in-app purchases with C#.sln
index 1e09aa4ec5b..7a72ede5895 100644
--- a/mono/android_iap/Android in-app purchases with C#.sln
+++ b/mono/android_iap/Android in-app purchases with C#.sln
@@ -1,4 +1,4 @@
-Microsoft Visual Studio Solution File, Format Version 12.00
+Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 2012
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Android in-app purchases with C#", "Android in-app purchases with C#.csproj", "{A29FB611-2B09-4E62-B23E-A68BAF8A8A3F}"
EndProject
diff --git a/mono/android_iap/Main.cs b/mono/android_iap/Main.cs
index a1163b81bf6..d39eb93761c 100644
--- a/mono/android_iap/Main.cs
+++ b/mono/android_iap/Main.cs
@@ -78,7 +78,7 @@ private void OnConnected()
{
GD.Print("PurchaseManager connected");
- // We must acknowledge all puchases.
+ // We must acknowledge all purchases.
// See https://developer.android.com/google/play/billing/integrate#process for more information
var purchasesResult = _payment.QueryPurchases(PurchaseType.InApp);
if (purchasesResult.Status == (int)Error.Ok)
@@ -160,7 +160,7 @@ private void OnPurchaseAcknowledged(string purchaseToken)
private void OnPurchaseAcknowledgementError(int code, string message)
{
- ShowAlert($"Purchase acknowledgement error {code}: {message}");
+ ShowAlert($"Purchase acknowledgment error {code}: {message}");
}
private void OnPurchaseConsumed(string purchaseToken)
@@ -170,7 +170,7 @@ private void OnPurchaseConsumed(string purchaseToken)
private void OnPurchaseConsumptionError(int code, string message, string purchaseToken)
{
- ShowAlert($"Purchase acknowledgement error {code}: {message}");
+ ShowAlert($"Purchase acknowledgment error {code}: {message}");
}
// GUI
diff --git a/mono/dodge_the_creeps/Dodge the Creeps with C#.csproj b/mono/dodge_the_creeps/Dodge the Creeps with C#.csproj
index c8d6221d586..ec6079fec7f 100644
--- a/mono/dodge_the_creeps/Dodge the Creeps with C#.csproj
+++ b/mono/dodge_the_creeps/Dodge the Creeps with C#.csproj
@@ -1,4 +1,4 @@
-
+
net6.0
true
@@ -10,4 +10,4 @@
-
\ No newline at end of file
+
diff --git a/mono/dodge_the_creeps/Dodge the Creeps with C#.sln b/mono/dodge_the_creeps/Dodge the Creeps with C#.sln
index 23b34d8bff1..7e86f8a790d 100644
--- a/mono/dodge_the_creeps/Dodge the Creeps with C#.sln
+++ b/mono/dodge_the_creeps/Dodge the Creeps with C#.sln
@@ -1,4 +1,4 @@
-Microsoft Visual Studio Solution File, Format Version 12.00
+Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 2012
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Dodge the Creeps with C#", "Dodge the Creeps with C#.csproj", "{75CB0382-CCCC-4A4D-ABF0-C6CD04D9F832}"
EndProject
diff --git a/mono/multiplayer_pong/Pong Multiplayer with C#.csproj b/mono/multiplayer_pong/Pong Multiplayer with C#.csproj
index 18dad044ecb..76d55bd60d4 100644
--- a/mono/multiplayer_pong/Pong Multiplayer with C#.csproj
+++ b/mono/multiplayer_pong/Pong Multiplayer with C#.csproj
@@ -1,6 +1,6 @@
-
+
net472
PongMultiplayer
-
\ No newline at end of file
+
diff --git a/mono/multiplayer_pong/Pong Multiplayer with C#.sln b/mono/multiplayer_pong/Pong Multiplayer with C#.sln
index 158b1317832..9acb48aef62 100644
--- a/mono/multiplayer_pong/Pong Multiplayer with C#.sln
+++ b/mono/multiplayer_pong/Pong Multiplayer with C#.sln
@@ -1,4 +1,4 @@
-Microsoft Visual Studio Solution File, Format Version 12.00
+Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 2012
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Pong Multiplayer with C#", "Pong Multiplayer with C#.csproj", "{4BB6C2D0-FC11-466E-8C73-8DAD689F135A}"
EndProject
diff --git a/mono/pong/Pong with C#.csproj b/mono/pong/Pong with C#.csproj
index c313c5876d5..7e5f73bb628 100644
--- a/mono/pong/Pong with C#.csproj
+++ b/mono/pong/Pong with C#.csproj
@@ -1,7 +1,7 @@
-
+
net6.0
true
Pong
-
\ No newline at end of file
+
diff --git a/mono/pong/Pong with C#.sln b/mono/pong/Pong with C#.sln
index 7f5db47c25b..f4a36acdfaa 100644
--- a/mono/pong/Pong with C#.sln
+++ b/mono/pong/Pong with C#.sln
@@ -1,4 +1,4 @@
-Microsoft Visual Studio Solution File, Format Version 12.00
+Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 2012
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Pong with C#", "Pong with C#.csproj", "{EBA5981B-C37E-48C5-A3B6-4390D9834F9A}"
EndProject
diff --git a/networking/multiplayer_pong/logic/ball.gd b/networking/multiplayer_pong/logic/ball.gd
index 714c2a28bda..91ee875de5b 100644
--- a/networking/multiplayer_pong/logic/ball.gd
+++ b/networking/multiplayer_pong/logic/ball.gd
@@ -11,7 +11,7 @@ var _speed := DEFAULT_SPEED
func _process(delta: float) -> void:
_speed += delta
# Ball will move normally for both players,
- # even if it's sightly out of sync between them,
+ # even if it's slightly out of sync between them,
# so each player sees the motion as smooth and not jerky.
if not stopped:
translate(_speed * delta * direction)
diff --git a/networking/webrtc_signaling/README.md b/networking/webrtc_signaling/README.md
index e75594e6b6c..2191a7bd5bb 100644
--- a/networking/webrtc_signaling/README.md
+++ b/networking/webrtc_signaling/README.md
@@ -1,6 +1,6 @@
# A WebSocket signaling server/client for WebRTC.
-This demo is devided in 4 parts:
+This demo is divided in 4 parts:
- The `server` folder contains the signaling server implementation written in GDScript (so it can be run by a game server running Godot)
- The `server_node` folder contains the signaling server implementation written in Node.js (if you don't plan to run a game server but only match-making).
diff --git a/networking/webrtc_signaling/project.godot b/networking/webrtc_signaling/project.godot
index 08b776d2f19..4ef95997fce 100644
--- a/networking/webrtc_signaling/project.godot
+++ b/networking/webrtc_signaling/project.godot
@@ -12,7 +12,7 @@ config_version=5
config/name="WebRTC Signaling Example"
config/description="A WebSocket signaling server/client for WebRTC.
-This demo is devided in 4 parts.
+This demo is divided in 4 parts.
The protocol is text based, and composed by a command and possibly
multiple payload arguments, each separated by a new line."
config/tags=PackedStringArray("demo", "network", "official")
diff --git a/networking/websocket_chat/client.gd b/networking/websocket_chat/client.gd
index 88102269957..64852a0a6ff 100644
--- a/networking/websocket_chat/client.gd
+++ b/networking/websocket_chat/client.gd
@@ -13,7 +13,7 @@ func info(msg: String) -> void:
#region Client signals
func _on_web_socket_client_connection_closed() -> void:
var ws := _client.get_socket()
- info("Client just disconnected with code: %s, reson: %s" % [ws.get_close_code(), ws.get_close_reason()])
+ info("Client just disconnected with code: %s, reason: %s" % [ws.get_close_code(), ws.get_close_reason()])
func _on_web_socket_client_connected_to_server() -> void:
diff --git a/plugins/addons/material_creator/material_resource.gd b/plugins/addons/material_creator/material_resource.gd
index 4cdef99a312..aa86d38fd3d 100644
--- a/plugins/addons/material_creator/material_resource.gd
+++ b/plugins/addons/material_creator/material_resource.gd
@@ -10,7 +10,7 @@ var metallic_strength := 0.0
var roughness_strength := 0.0
-# Convert our data into an dictonary so we can convert it
+# Convert our data into an dictionary so we can convert it
# into the JSON format.
func make_json() -> String:
var json_dict := {}
@@ -26,7 +26,7 @@ func make_json() -> String:
return JSON.stringify(json_dict)
-# Convert the passed in string to a JSON dictonary, and then
+# Convert the passed in string to a JSON dictionary, and then
# fill in our data.
func from_json(json_dict_as_string: String) -> void:
var json_dict: Dictionary = JSON.parse_string(json_dict_as_string)
diff --git a/pyproject.toml b/pyproject.toml
new file mode 100644
index 00000000000..046702bb0c7
--- /dev/null
+++ b/pyproject.toml
@@ -0,0 +1,45 @@
+[tool.codespell]
+enable-colors = true
+write-changes = true
+check-hidden = true
+quiet-level = 3
+builtin = ["clear", "rare", "en-GB_to_en-US"]
+skip = [
+ ".mailmap",
+ "*.gitignore",
+ "*.po",
+ "*.pot",
+ "*.csv",
+ "*/FONTLOG.txt",
+]
+ignore-words-list = [
+ "brane",
+ "breaked",
+ "buttonn",
+ "cancelled",
+ "checkin",
+ "colour",
+ "curvelinear",
+ "dialogue",
+ "doubleclick",
+ "expct",
+ "findn",
+ "gird",
+ "hel",
+ "inout",
+ "labelin",
+ "lod",
+ "mis",
+ "nd",
+ "numer",
+ "ot",
+ "outin",
+ "parm",
+ "requestor",
+ "sade",
+ "streamin",
+ "te",
+ "textin",
+ "thirdparty",
+ "vai",
+]
diff --git a/viewport/2d_in_3d/pong.gd b/viewport/2d_in_3d/pong.gd
index 9ce08dc868a..818ede0258b 100644
--- a/viewport/2d_in_3d/pong.gd
+++ b/viewport/2d_in_3d/pong.gd
@@ -25,7 +25,7 @@ func _process(delta: float) -> void:
var left_rect := Rect2(left_paddle.get_position() - pad_size * 0.5, pad_size)
var right_rect := Rect2(right_paddle.get_position() - pad_size * 0.5, pad_size)
- # Integrate new ball postion.
+ # Integrate new ball position.
ball_pos += direction * ball_speed * delta
# Flip when touching roof or floor.
diff --git a/viewport/dynamic_split_screen/README.md b/viewport/dynamic_split_screen/README.md
index f68b42bca0a..80821988ba5 100644
--- a/viewport/dynamic_split_screen/README.md
+++ b/viewport/dynamic_split_screen/README.md
@@ -12,7 +12,7 @@ Check out this demo on the asset library: https://godotengine.org/asset-library/
## Details
A dynamic split screen system displays a single screen when
-the two players are close but a splitted view when they move apart.
+the two players are close but a split view when they move apart.
The splitting line can take any angle depending on the players'
position, so it won't be either vertical or horizontal.
@@ -26,7 +26,7 @@ texture, as well as some other parameters, are passed to a
shader attached to a TextureRect filling the whole screen.
The `SplitScreen` shader, with the help of the `CameraController`
-script, chooses wich texture to display on each pixel to
+script, chooses which texture to display on each pixel to
achieve the effect.
The cameras are placed on the segment joining the two players,
diff --git a/viewport/dynamic_split_screen/camera_controller.gd b/viewport/dynamic_split_screen/camera_controller.gd
index 239c7a6d12f..7b6cd198d41 100644
--- a/viewport/dynamic_split_screen/camera_controller.gd
+++ b/viewport/dynamic_split_screen/camera_controller.gd
@@ -8,7 +8,7 @@ extends Node3D
# the first one is used for the entire screen thus allowing the players to play
# on a unsplit screen.
# In the second case, the screen is split in two with a line perpendicular to the
-# segement joining the two players.
+# segment joining the two players.
#
# The points of customization are:
# max_separation: the distance between players at which the view starts to split
diff --git a/xr/openxr_character_centric_movement/README.md b/xr/openxr_character_centric_movement/README.md
index 2a52bcd4bda..47702f710e7 100644
--- a/xr/openxr_character_centric_movement/README.md
+++ b/xr/openxr_character_centric_movement/README.md
@@ -12,7 +12,7 @@ Check out this demo on the asset library: https://godotengine.org/asset-library/
## How does it work?
With modern VR equipment the user is able to move around a large playspace.
-This is often refered to as roomscale VR.
+This is often referred to as roomscale VR.
The position of the headset and controllers are tracked in reference to a fixed point within this playspace.
This is often a point on the ground at the center of the playspace mapped out by the user when setting up their guardian.
diff --git a/xr/openxr_composition_layers/README.md b/xr/openxr_composition_layers/README.md
index 687a4e8d23c..83947826916 100644
--- a/xr/openxr_composition_layers/README.md
+++ b/xr/openxr_composition_layers/README.md
@@ -19,7 +19,7 @@ The subsequent quality loss often renders text unreadable or at the least ugly l
It turns out however that when 2D interfaces are presented on a virtual screen in front of the user,
often as a rectangle or slightly curved screen,
-that rendering this content ontop of the lens distorted 3D rendering,
+that rendering this content on top of the lens distorted 3D rendering,
and simply curving this 2D plane,
results in a high quality render.
diff --git a/xr/openxr_composition_layers/handle_pointers.gd b/xr/openxr_composition_layers/handle_pointers.gd
index fe97ed2b2e9..ce1b50d223a 100644
--- a/xr/openxr_composition_layers/handle_pointers.gd
+++ b/xr/openxr_composition_layers/handle_pointers.gd
@@ -22,7 +22,7 @@ func _input(event):
layer_viewport.push_input(event)
-# Convert the intersect point reurned by intersects_ray to local coords in the viewport.
+# Convert the intersect point returned by intersects_ray to local coords in the viewport.
func _intersect_to_viewport_pos(intersect : Vector2) -> Vector2i:
if layer_viewport and intersect != NO_INTERSECTION:
var pos : Vector2 = intersect * Vector2(layer_viewport.size)
diff --git a/xr/openxr_composition_layers/main.gd b/xr/openxr_composition_layers/main.gd
index bbcd69283ca..bf3d121a918 100644
--- a/xr/openxr_composition_layers/main.gd
+++ b/xr/openxr_composition_layers/main.gd
@@ -42,7 +42,7 @@ func _on_left_hand_button_pressed(action_name):
_do_tween_energy()
# And make us feel it.
- # NOTE: `frequence == 0.0` => XR runtime chooses optimal frequency for a given controller.
+ # NOTE: `frequency == 0.0` => XR runtime chooses optimal frequency for a given controller.
active_hand.trigger_haptic_pulse("haptic", 0.0, 1.0, 0.5, 0.0)
@@ -60,5 +60,5 @@ func _on_right_hand_button_pressed(action_name):
_do_tween_energy()
# And make us feel it.
- # NOTE: `frequence == 0.0` => XR runtime chooses optimal frequency for a given controller.
+ # NOTE: `frequency == 0.0` => XR runtime chooses optimal frequency for a given controller.
active_hand.trigger_haptic_pulse("haptic", 0.0, 1.0, 0.5, 0.0)
diff --git a/xr/openxr_hand_tracking_demo/README.md b/xr/openxr_hand_tracking_demo/README.md
index 718d9bb088c..8c6a1fd06dd 100644
--- a/xr/openxr_hand_tracking_demo/README.md
+++ b/xr/openxr_hand_tracking_demo/README.md
@@ -24,7 +24,7 @@ and depending on the XR runtime in use there may be gaps in functionality.
### Hand tracking is only for optical tracking
-The first school of thought treats hand tracking as a separate system that purely focusses on optical hand tracking.
+The first school of thought treats hand tracking as a separate system that purely focuses on optical hand tracking.
The hand tracking API in OpenXR, even if reported as supported, will only provide data if optical hand tracking is used.
This means that when controllers are used, no data is available and you as a developer have to come up with your own
@@ -43,13 +43,13 @@ and treats them as two versions of the same.
Especially with controllers like the Valve Index, or with various data gloves that are treated as controllers,
there is no discernible difference here.
-The hand tracking API is mostly used for visualising the players hand with bone positions either being inferred
+The hand tracking API is mostly used for visualizing the players hand with bone positions either being inferred
from controller input or matching the optical tracking.
For advanced gesture recognition you would still use this data however it is now accessible regardless of
the physical means in which this data is obtained.
At the same time, in this school of thought the action map system is seen as the primary means to gain input
-and is no longer restriced to input from controllers. The XR runtime is now responsible for recognising base
+and is no longer restricted to input from controllers. The XR runtime is now responsible for recognizing base
gestures such as pinching and pointing resulting in inputs that can be bound in the action map.
OpenXR is moving towards this approach and this demo has been build in accordance with this however not all runtimes have been updated yet.
@@ -76,7 +76,7 @@ This demo project shows what that future looks like.
## Hand tracking API
-As mentioned, the hand tracking API is at the center of visualising the users hand.
+As mentioned, the hand tracking API is at the center of visualizing the users hand.
In Godot 4.3 we overhauled the system so the XR Interface needs to convert hand tracking data to the Godot humanoid skeleton hand bone layout.
This also means that this logic works both in WebXR, OpenXR and any other XR Interface that adds support for this feature.
@@ -156,4 +156,3 @@ Note that Godot currently can't run using the WMR OpenXR runtime. Install SteamV
You must install the Android build templates and OpenXR loader plugin and configure an export template for your device.
Please follow [the instructions for deploying on Android in the manual](https://docs.godotengine.org/en/stable/tutorials/xr/deploying_to_android.html).
-
diff --git a/xr/openxr_origin_centric_movement/README.md b/xr/openxr_origin_centric_movement/README.md
index b6668df2671..fad08d5970f 100644
--- a/xr/openxr_origin_centric_movement/README.md
+++ b/xr/openxr_origin_centric_movement/README.md
@@ -12,7 +12,7 @@ Check out this demo on the asset library: https://godotengine.org/asset-library/
## How does it work?
With modern VR equipment the user is able to move around a large playspace.
-This is often refered to as roomscale VR.
+This is often referred to as roomscale VR.
The position of the headset and controllers are tracked in reference to a fixed point within this playspace.
This is often a point on the ground at the center of the playspace mapped out by the user when setting up their guardian.