commit b47cd46703a43b95211cb253104dfa032284c285 Author: Nikolai Fedorov Date: Wed Apr 22 13:36:22 2026 +0300 inital commit diff --git a/.godot/.gdignore b/.godot/.gdignore new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/.godot/.gdignore @@ -0,0 +1 @@ + diff --git a/.godot/editor/Enemy.tscn-folding-e8b868f745946f74f22434b9ddd0af8d.cfg b/.godot/editor/Enemy.tscn-folding-e8b868f745946f74f22434b9ddd0af8d.cfg new file mode 100644 index 0000000..9a2f877 --- /dev/null +++ b/.godot/editor/Enemy.tscn-folding-e8b868f745946f74f22434b9ddd0af8d.cfg @@ -0,0 +1,5 @@ +[folding] + +node_unfolds=[NodePath("."), PackedStringArray("Collision")] +resource_unfolds=[] +nodes_folded=[] diff --git a/.godot/editor/Main.tscn-folding-4a24720ee5e787dbe30abc634fa3679d.cfg b/.godot/editor/Main.tscn-folding-4a24720ee5e787dbe30abc634fa3679d.cfg new file mode 100644 index 0000000..0f30ddf --- /dev/null +++ b/.godot/editor/Main.tscn-folding-4a24720ee5e787dbe30abc634fa3679d.cfg @@ -0,0 +1,5 @@ +[folding] + +node_unfolds=[NodePath("."), PackedStringArray("Visibility")] +resource_unfolds=[] +nodes_folded=[] diff --git a/.godot/editor/Player.tscn-folding-e8220e74d1354b9e6b168b513689419c.cfg b/.godot/editor/Player.tscn-folding-e8220e74d1354b9e6b168b513689419c.cfg new file mode 100644 index 0000000..9a2f877 --- /dev/null +++ b/.godot/editor/Player.tscn-folding-e8220e74d1354b9e6b168b513689419c.cfg @@ -0,0 +1,5 @@ +[folding] + +node_unfolds=[NodePath("."), PackedStringArray("Collision")] +resource_unfolds=[] +nodes_folded=[] diff --git a/.godot/editor/editor_layout.cfg b/.godot/editor/editor_layout.cfg new file mode 100644 index 0000000..66dff6e --- /dev/null +++ b/.godot/editor/editor_layout.cfg @@ -0,0 +1,72 @@ +[docks] + +dock_3_selected_tab_idx=0 +dock_4_selected_tab_idx=0 +dock_5_selected_tab_idx=0 +dock_floating={} +dock_closed=[] +dock_split_2=0 +dock_split_3=0 +dock_hsplit_1=0 +dock_hsplit_2=280 +dock_hsplit_3=-280 +dock_hsplit_4=0 +dock_9_selected_tab_idx=0 +dock_3="Scene,Import" +dock_4="FileSystem,History" +dock_5="Inspector,Signals,Groups" +dock_9="Output,Debugger,Audio,Animation,Shader Editor,Search Results,AnimationTree,ResourcePreloader,ShaderFile,SpriteFrames,Theme,Polygon,TileSet,TileMap,Replication,GridMap" + +[docks/FileSystem] + +h_split_offset=480 +v_split_offset=0 +display_mode=0 +file_sort=0 +file_list_display_mode=1 +selected_paths=PackedStringArray("res://scenes/Player.tscn") +uncollapsed_paths=PackedStringArray("Favorites", "res://", "res://scripts/", "res://scenes/") + +[docks/History] + +include_scene=true +include_global=true + +[EditorNode] + +open_scenes=PackedStringArray("res://scenes/Player.tscn") +current_scene="res://scenes/Player.tscn" +bottom_panel_offsets={ +"Audio": -450, +"Debugger": 0, +"Output": 0 +} +selected_default_debugger_tab_idx=1 +selected_main_editor_idx=1 + +[EditorWindow] + +screen=0 +mode="maximized" +position=Vector2i(0, 60) + +[ScriptEditor] + +open_scripts=["res://scripts/Enemy.gd", "res://scripts/Main.gd", "res://scripts/Player.gd"] +selected_script="res://scripts/Enemy.gd" +open_help=[] +script_split_offset=400 +list_split_offset=0 +zoom_factor=1.0 + +[GameView] + +floating_window_rect=Rect2i(854, 458, 1172, 806) +floating_window_screen=0 + +[ShaderEditor] + +open_shaders=[] +split_offset=400 +selected_shader="" +text_shader_zoom_factor=1.0 diff --git a/.godot/editor/filesystem_cache10 b/.godot/editor/filesystem_cache10 new file mode 100644 index 0000000..c593773 --- /dev/null +++ b/.godot/editor/filesystem_cache10 @@ -0,0 +1,11 @@ +63f7b34db8d8cdea90c76aacccf841ec +::res://::1776852182 +icon.svg::CompressedTexture2D::5982078435067271598::1776851681::1776852183::1::::<><><>0<>0<>ca0a886cd24b06b2f64ae5271fa97ce6<>res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex:: +::res://scenes/::1776851691 +Enemy.tscn::PackedScene::6409490066716950956::1776851687::0::1::::<><><>0<>0<><>::res://scripts/Enemy.gd +Main.tscn::PackedScene::8897127817261996046::1776851691::0::1::::<><><>0<>0<><>::res://scripts/Main.gd +Player.tscn::PackedScene::3474306994787601198::1776851684::0::1::::<><><>0<>0<><>::res://scripts/Player.gd +::res://scripts/::1776852042 +Enemy.gd::GDScript::1423062711014319506::1776851960::0::1::::<>CharacterBody3D<><>0<>0<><>:: +Main.gd::GDScript::3051304906098389946::1776852042::0::1::::<>Node3D<><>0<>0<><>:: +Player.gd::GDScript::2700327509467176353::1776851717::0::1::::<>CharacterBody3D<><>0<>0<><>:: diff --git a/.godot/editor/filesystem_update4 b/.godot/editor/filesystem_update4 new file mode 100644 index 0000000..ec092b6 --- /dev/null +++ b/.godot/editor/filesystem_update4 @@ -0,0 +1,3 @@ +res://scripts/Enemy.gd +res://scripts/Main.gd +res://scripts/Player.gd diff --git a/.godot/editor/script_editor_cache.cfg b/.godot/editor/script_editor_cache.cfg new file mode 100644 index 0000000..6a96df5 --- /dev/null +++ b/.godot/editor/script_editor_cache.cfg @@ -0,0 +1,41 @@ +[res://scripts/Main.gd] + +state={ +"bookmarks": PackedInt32Array(), +"breakpoints": PackedInt32Array(), +"column": 0, +"folded_lines": PackedInt32Array(), +"h_scroll_position": 0, +"row": 294, +"scroll_position": 392.0, +"selection": false, +"syntax_highlighter": "GDScript" +} + +[res://scripts/Enemy.gd] + +state={ +"bookmarks": PackedInt32Array(), +"breakpoints": PackedInt32Array(), +"column": 15, +"folded_lines": PackedInt32Array(), +"h_scroll_position": 0, +"row": 192, +"scroll_position": 184.0, +"selection": false, +"syntax_highlighter": "GDScript" +} + +[res://scripts/Player.gd] + +state={ +"bookmarks": PackedInt32Array(), +"breakpoints": PackedInt32Array(), +"column": 17, +"folded_lines": PackedInt32Array(), +"h_scroll_position": 0, +"row": 117, +"scroll_position": 156.0, +"selection": false, +"syntax_highlighter": "GDScript" +} diff --git a/.godot/global_script_class_cache.cfg b/.godot/global_script_class_cache.cfg new file mode 100644 index 0000000..32c2394 --- /dev/null +++ b/.godot/global_script_class_cache.cfg @@ -0,0 +1 @@ +list=[] diff --git a/.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex b/.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex new file mode 100644 index 0000000..e1fd692 Binary files /dev/null and b/.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex differ diff --git a/.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.md5 b/.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.md5 new file mode 100644 index 0000000..d67cee7 --- /dev/null +++ b/.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.md5 @@ -0,0 +1,3 @@ +source_md5="e51b0fee176db4042f82efec3432fe85" +dest_md5="39fbb8da890d40686d5f42136abbe9a9" + diff --git a/.godot/scene_groups_cache.cfg b/.godot/scene_groups_cache.cfg new file mode 100644 index 0000000..e69de29 diff --git a/.godot/shader_cache/BestFitNormalShaderRD/1ccb50327c01a8b810bcb5de747a978120c151a6fea245220edca74b9c528713/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache b/.godot/shader_cache/BestFitNormalShaderRD/1ccb50327c01a8b810bcb5de747a978120c151a6fea245220edca74b9c528713/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache new file mode 100644 index 0000000..c829e9b Binary files /dev/null and b/.godot/shader_cache/BestFitNormalShaderRD/1ccb50327c01a8b810bcb5de747a978120c151a6fea245220edca74b9c528713/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache differ diff --git a/.godot/shader_cache/BlitShaderRD/e5ff0c7f50cb8a6ee532997afb4a3408b6de2b9b03ebcb87e157b46ab8593e39/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache b/.godot/shader_cache/BlitShaderRD/e5ff0c7f50cb8a6ee532997afb4a3408b6de2b9b03ebcb87e157b46ab8593e39/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache new file mode 100644 index 0000000..5c2f424 Binary files /dev/null and b/.godot/shader_cache/BlitShaderRD/e5ff0c7f50cb8a6ee532997afb4a3408b6de2b9b03ebcb87e157b46ab8593e39/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache differ diff --git a/.godot/shader_cache/BokehDofShaderRD/5e76c505fe05e40992e5c54f643d9f694337f76d047ceb7ad161dc3efb2bf411/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache b/.godot/shader_cache/BokehDofShaderRD/5e76c505fe05e40992e5c54f643d9f694337f76d047ceb7ad161dc3efb2bf411/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache new file mode 100644 index 0000000..5afd5a8 Binary files /dev/null and b/.godot/shader_cache/BokehDofShaderRD/5e76c505fe05e40992e5c54f643d9f694337f76d047ceb7ad161dc3efb2bf411/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache differ diff --git a/.godot/shader_cache/CanvasOcclusionShaderRD/6d0046303c5068df99b2c3945434a844674a052389ae79e4a466f8196188cd35/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache b/.godot/shader_cache/CanvasOcclusionShaderRD/6d0046303c5068df99b2c3945434a844674a052389ae79e4a466f8196188cd35/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache new file mode 100644 index 0000000..34cf63e Binary files /dev/null and b/.godot/shader_cache/CanvasOcclusionShaderRD/6d0046303c5068df99b2c3945434a844674a052389ae79e4a466f8196188cd35/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache differ diff --git a/.godot/shader_cache/CanvasSdfShaderRD/900d0f09be693ae3458cb4ea5ca3733f93a58e342a661879987fa33f019737ef/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache b/.godot/shader_cache/CanvasSdfShaderRD/900d0f09be693ae3458cb4ea5ca3733f93a58e342a661879987fa33f019737ef/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache new file mode 100644 index 0000000..348f7f9 Binary files /dev/null and b/.godot/shader_cache/CanvasSdfShaderRD/900d0f09be693ae3458cb4ea5ca3733f93a58e342a661879987fa33f019737ef/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache differ diff --git a/.godot/shader_cache/CanvasShaderRD/44b626a71b331de17a1569c244e84cfc842a2c1ef1fe575d245ab80bccb9cb2d/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache b/.godot/shader_cache/CanvasShaderRD/44b626a71b331de17a1569c244e84cfc842a2c1ef1fe575d245ab80bccb9cb2d/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache new file mode 100644 index 0000000..00c653b Binary files /dev/null and b/.godot/shader_cache/CanvasShaderRD/44b626a71b331de17a1569c244e84cfc842a2c1ef1fe575d245ab80bccb9cb2d/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache differ diff --git a/.godot/shader_cache/CanvasShaderRD/44b626a71b331de17a1569c244e84cfc842a2c1ef1fe575d245ab80bccb9cb2d/45fb1ddc6499e56682916a355ce2839e61f42dfe.metal.cache b/.godot/shader_cache/CanvasShaderRD/44b626a71b331de17a1569c244e84cfc842a2c1ef1fe575d245ab80bccb9cb2d/45fb1ddc6499e56682916a355ce2839e61f42dfe.metal.cache new file mode 100644 index 0000000..4ce8c2a Binary files /dev/null and b/.godot/shader_cache/CanvasShaderRD/44b626a71b331de17a1569c244e84cfc842a2c1ef1fe575d245ab80bccb9cb2d/45fb1ddc6499e56682916a355ce2839e61f42dfe.metal.cache differ diff --git a/.godot/shader_cache/CanvasShaderRD/44b626a71b331de17a1569c244e84cfc842a2c1ef1fe575d245ab80bccb9cb2d/8a7277c8d3ac029b087c3fa9c55de85560be5119.metal.cache b/.godot/shader_cache/CanvasShaderRD/44b626a71b331de17a1569c244e84cfc842a2c1ef1fe575d245ab80bccb9cb2d/8a7277c8d3ac029b087c3fa9c55de85560be5119.metal.cache new file mode 100644 index 0000000..f120329 Binary files /dev/null and b/.godot/shader_cache/CanvasShaderRD/44b626a71b331de17a1569c244e84cfc842a2c1ef1fe575d245ab80bccb9cb2d/8a7277c8d3ac029b087c3fa9c55de85560be5119.metal.cache differ diff --git a/.godot/shader_cache/CanvasShaderRD/44b626a71b331de17a1569c244e84cfc842a2c1ef1fe575d245ab80bccb9cb2d/c0a681ae42aa3e0b5abba232ccae0b036be455e4.metal.cache b/.godot/shader_cache/CanvasShaderRD/44b626a71b331de17a1569c244e84cfc842a2c1ef1fe575d245ab80bccb9cb2d/c0a681ae42aa3e0b5abba232ccae0b036be455e4.metal.cache new file mode 100644 index 0000000..6a5ab8d Binary files /dev/null and b/.godot/shader_cache/CanvasShaderRD/44b626a71b331de17a1569c244e84cfc842a2c1ef1fe575d245ab80bccb9cb2d/c0a681ae42aa3e0b5abba232ccae0b036be455e4.metal.cache differ diff --git a/.godot/shader_cache/CanvasShaderRD/44b626a71b331de17a1569c244e84cfc842a2c1ef1fe575d245ab80bccb9cb2d/f3e258e8f7ec2e7e740b62f3bc48ecf5c99fb0db.metal.cache b/.godot/shader_cache/CanvasShaderRD/44b626a71b331de17a1569c244e84cfc842a2c1ef1fe575d245ab80bccb9cb2d/f3e258e8f7ec2e7e740b62f3bc48ecf5c99fb0db.metal.cache new file mode 100644 index 0000000..e0b6814 Binary files /dev/null and b/.godot/shader_cache/CanvasShaderRD/44b626a71b331de17a1569c244e84cfc842a2c1ef1fe575d245ab80bccb9cb2d/f3e258e8f7ec2e7e740b62f3bc48ecf5c99fb0db.metal.cache differ diff --git a/.godot/shader_cache/ClusterDebugShaderRD/b4dfb009f982372090b395f6b4b491ec859580fde542b137da30ba0125db4493/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache b/.godot/shader_cache/ClusterDebugShaderRD/b4dfb009f982372090b395f6b4b491ec859580fde542b137da30ba0125db4493/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache new file mode 100644 index 0000000..b192b18 Binary files /dev/null and b/.godot/shader_cache/ClusterDebugShaderRD/b4dfb009f982372090b395f6b4b491ec859580fde542b137da30ba0125db4493/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache differ diff --git a/.godot/shader_cache/ClusterRenderShaderRD/f863243f437e1e951de711609c6bf7e68a0d9b104c70be5c6a645fa26c179ccf/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache b/.godot/shader_cache/ClusterRenderShaderRD/f863243f437e1e951de711609c6bf7e68a0d9b104c70be5c6a645fa26c179ccf/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache new file mode 100644 index 0000000..5d1f9dc Binary files /dev/null and b/.godot/shader_cache/ClusterRenderShaderRD/f863243f437e1e951de711609c6bf7e68a0d9b104c70be5c6a645fa26c179ccf/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache differ diff --git a/.godot/shader_cache/ClusterStoreShaderRD/2b72ea813a706dc6e2daec5b08d2b7417fb67306de04679465b034b524dda1a8/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache b/.godot/shader_cache/ClusterStoreShaderRD/2b72ea813a706dc6e2daec5b08d2b7417fb67306de04679465b034b524dda1a8/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache new file mode 100644 index 0000000..8270b08 Binary files /dev/null and b/.godot/shader_cache/ClusterStoreShaderRD/2b72ea813a706dc6e2daec5b08d2b7417fb67306de04679465b034b524dda1a8/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache differ diff --git a/.godot/shader_cache/CopyShaderRD/65291954e15cb018018fc5f4646a638087a0a102918f3e04c7f5bd7b36a520d7/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache b/.godot/shader_cache/CopyShaderRD/65291954e15cb018018fc5f4646a638087a0a102918f3e04c7f5bd7b36a520d7/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache new file mode 100644 index 0000000..f45eb23 Binary files /dev/null and b/.godot/shader_cache/CopyShaderRD/65291954e15cb018018fc5f4646a638087a0a102918f3e04c7f5bd7b36a520d7/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache differ diff --git a/.godot/shader_cache/CopyToFbShaderRD/75d836894e920d01a392936493cf5f515633f4101cdab35e41710593c8961a8b/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache b/.godot/shader_cache/CopyToFbShaderRD/75d836894e920d01a392936493cf5f515633f4101cdab35e41710593c8961a8b/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache new file mode 100644 index 0000000..3d8de7d Binary files /dev/null and b/.godot/shader_cache/CopyToFbShaderRD/75d836894e920d01a392936493cf5f515633f4101cdab35e41710593c8961a8b/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache differ diff --git a/.godot/shader_cache/CubeToDpShaderRD/d7b798ab7df6267a749663467475b673a9c91bd0a35bf9b538439cb9902d869e/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache b/.godot/shader_cache/CubeToDpShaderRD/d7b798ab7df6267a749663467475b673a9c91bd0a35bf9b538439cb9902d869e/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache new file mode 100644 index 0000000..9d051c6 Binary files /dev/null and b/.godot/shader_cache/CubeToDpShaderRD/d7b798ab7df6267a749663467475b673a9c91bd0a35bf9b538439cb9902d869e/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache differ diff --git a/.godot/shader_cache/CubeToOctmapShaderRD/945003e6f9984a03124090615d87289ba22cea98da96752bf1b0cf69baef54d7/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache b/.godot/shader_cache/CubeToOctmapShaderRD/945003e6f9984a03124090615d87289ba22cea98da96752bf1b0cf69baef54d7/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache new file mode 100644 index 0000000..04dca1a Binary files /dev/null and b/.godot/shader_cache/CubeToOctmapShaderRD/945003e6f9984a03124090615d87289ba22cea98da96752bf1b0cf69baef54d7/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache differ diff --git a/.godot/shader_cache/FsrUpscaleShaderRD/d466030127f157943b9e4db32b126dcb3d9e6a2babf5212166346d08e6261fe7/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache b/.godot/shader_cache/FsrUpscaleShaderRD/d466030127f157943b9e4db32b126dcb3d9e6a2babf5212166346d08e6261fe7/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache new file mode 100644 index 0000000..2179dd7 Binary files /dev/null and b/.godot/shader_cache/FsrUpscaleShaderRD/d466030127f157943b9e4db32b126dcb3d9e6a2babf5212166346d08e6261fe7/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache differ diff --git a/.godot/shader_cache/GiShaderRD/154eef6b59156842af8c5b85ab6829061a5637da2edc33604b1a5e5949e5294a/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache b/.godot/shader_cache/GiShaderRD/154eef6b59156842af8c5b85ab6829061a5637da2edc33604b1a5e5949e5294a/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache new file mode 100644 index 0000000..1b19f48 Binary files /dev/null and b/.godot/shader_cache/GiShaderRD/154eef6b59156842af8c5b85ab6829061a5637da2edc33604b1a5e5949e5294a/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache differ diff --git a/.godot/shader_cache/IntegrateDfgShaderRD/42d754357677605b691c5336a8e22e09202dcff00a57b792ac11d2e0b161b993/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache b/.godot/shader_cache/IntegrateDfgShaderRD/42d754357677605b691c5336a8e22e09202dcff00a57b792ac11d2e0b161b993/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache new file mode 100644 index 0000000..4e73b2c Binary files /dev/null and b/.godot/shader_cache/IntegrateDfgShaderRD/42d754357677605b691c5336a8e22e09202dcff00a57b792ac11d2e0b161b993/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache differ diff --git a/.godot/shader_cache/LuminanceReduceShaderRD/ef89847c3d5789777bf23f6024aa0d004fdc3a7fe82c8bf865c3946f50157f75/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache b/.godot/shader_cache/LuminanceReduceShaderRD/ef89847c3d5789777bf23f6024aa0d004fdc3a7fe82c8bf865c3946f50157f75/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache new file mode 100644 index 0000000..ac1fae0 Binary files /dev/null and b/.godot/shader_cache/LuminanceReduceShaderRD/ef89847c3d5789777bf23f6024aa0d004fdc3a7fe82c8bf865c3946f50157f75/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache differ diff --git a/.godot/shader_cache/MotionVectorsShaderRD/e33ee4540533d576bfe475cc499a9491db25293c3cc5ae811495d43f58649020/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache b/.godot/shader_cache/MotionVectorsShaderRD/e33ee4540533d576bfe475cc499a9491db25293c3cc5ae811495d43f58649020/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache new file mode 100644 index 0000000..bcf9ba6 Binary files /dev/null and b/.godot/shader_cache/MotionVectorsShaderRD/e33ee4540533d576bfe475cc499a9491db25293c3cc5ae811495d43f58649020/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache differ diff --git a/.godot/shader_cache/MotionVectorsStoreShaderRD/acd09c2bad11ab393b69aaa2371e596e1cbf9903d3cdf14678c2ff60d9c3f163/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache b/.godot/shader_cache/MotionVectorsStoreShaderRD/acd09c2bad11ab393b69aaa2371e596e1cbf9903d3cdf14678c2ff60d9c3f163/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache new file mode 100644 index 0000000..8eaa415 Binary files /dev/null and b/.godot/shader_cache/MotionVectorsStoreShaderRD/acd09c2bad11ab393b69aaa2371e596e1cbf9903d3cdf14678c2ff60d9c3f163/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache differ diff --git a/.godot/shader_cache/OctmapDownsamplerShaderRD/b5d716a2f281f18de3f8145675905257c71ed306b08187f196135b4d6b900d18/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache b/.godot/shader_cache/OctmapDownsamplerShaderRD/b5d716a2f281f18de3f8145675905257c71ed306b08187f196135b4d6b900d18/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache new file mode 100644 index 0000000..b19f2c1 Binary files /dev/null and b/.godot/shader_cache/OctmapDownsamplerShaderRD/b5d716a2f281f18de3f8145675905257c71ed306b08187f196135b4d6b900d18/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache differ diff --git a/.godot/shader_cache/OctmapFilterShaderRD/29563446a265b7dd42bb80d9d6e3dc4d423069662549f27f646ae4dc33dd669a/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache b/.godot/shader_cache/OctmapFilterShaderRD/29563446a265b7dd42bb80d9d6e3dc4d423069662549f27f646ae4dc33dd669a/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache new file mode 100644 index 0000000..5551865 Binary files /dev/null and b/.godot/shader_cache/OctmapFilterShaderRD/29563446a265b7dd42bb80d9d6e3dc4d423069662549f27f646ae4dc33dd669a/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache differ diff --git a/.godot/shader_cache/OctmapRoughnessShaderRD/5e2dc8eaf1a38f928f118fb3b4ec9041422acb08ba3628df371772294faef0a4/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache b/.godot/shader_cache/OctmapRoughnessShaderRD/5e2dc8eaf1a38f928f118fb3b4ec9041422acb08ba3628df371772294faef0a4/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache new file mode 100644 index 0000000..96f2014 Binary files /dev/null and b/.godot/shader_cache/OctmapRoughnessShaderRD/5e2dc8eaf1a38f928f118fb3b4ec9041422acb08ba3628df371772294faef0a4/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache differ diff --git a/.godot/shader_cache/ParticlesCopyShaderRD/07564cb3473afac407c6bcff5eeecd5e1775822696a97e9598ea6df01e255aa9/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache b/.godot/shader_cache/ParticlesCopyShaderRD/07564cb3473afac407c6bcff5eeecd5e1775822696a97e9598ea6df01e255aa9/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache new file mode 100644 index 0000000..3bd80bd Binary files /dev/null and b/.godot/shader_cache/ParticlesCopyShaderRD/07564cb3473afac407c6bcff5eeecd5e1775822696a97e9598ea6df01e255aa9/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache differ diff --git a/.godot/shader_cache/ParticlesShaderRD/06a8e27fb2eb40a42c7d1c26614ce38ae841d0048941bee0ae85d930f4cd7c10/f128cab0b22fb7e0d9f023d6cdb81309be392d95.metal.cache b/.godot/shader_cache/ParticlesShaderRD/06a8e27fb2eb40a42c7d1c26614ce38ae841d0048941bee0ae85d930f4cd7c10/f128cab0b22fb7e0d9f023d6cdb81309be392d95.metal.cache new file mode 100644 index 0000000..266064b Binary files /dev/null and b/.godot/shader_cache/ParticlesShaderRD/06a8e27fb2eb40a42c7d1c26614ce38ae841d0048941bee0ae85d930f4cd7c10/f128cab0b22fb7e0d9f023d6cdb81309be392d95.metal.cache differ diff --git a/.godot/shader_cache/ResolveShaderRD/62ad9cf399fd17bc950adc9b1604f70db504a8c531198a947df8f6d8dcd16b34/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache b/.godot/shader_cache/ResolveShaderRD/62ad9cf399fd17bc950adc9b1604f70db504a8c531198a947df8f6d8dcd16b34/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache new file mode 100644 index 0000000..4210e85 Binary files /dev/null and b/.godot/shader_cache/ResolveShaderRD/62ad9cf399fd17bc950adc9b1604f70db504a8c531198a947df8f6d8dcd16b34/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache differ diff --git a/.godot/shader_cache/SceneForwardClusteredShaderRD/1d8f9fd61c770da8fbf2a971b3e81a1e4b82130a464dd2919dd0df65d3f4d4a6/111f8cfd3c260d918df85827eb251dc36a43cb13.metal.cache b/.godot/shader_cache/SceneForwardClusteredShaderRD/1d8f9fd61c770da8fbf2a971b3e81a1e4b82130a464dd2919dd0df65d3f4d4a6/111f8cfd3c260d918df85827eb251dc36a43cb13.metal.cache new file mode 100644 index 0000000..e9169fd Binary files /dev/null and b/.godot/shader_cache/SceneForwardClusteredShaderRD/1d8f9fd61c770da8fbf2a971b3e81a1e4b82130a464dd2919dd0df65d3f4d4a6/111f8cfd3c260d918df85827eb251dc36a43cb13.metal.cache differ diff --git a/.godot/shader_cache/SceneForwardClusteredShaderRD/1d8f9fd61c770da8fbf2a971b3e81a1e4b82130a464dd2919dd0df65d3f4d4a6/35a078cb7dc07df55e460ed1a913486a68ab6bb0.metal.cache b/.godot/shader_cache/SceneForwardClusteredShaderRD/1d8f9fd61c770da8fbf2a971b3e81a1e4b82130a464dd2919dd0df65d3f4d4a6/35a078cb7dc07df55e460ed1a913486a68ab6bb0.metal.cache new file mode 100644 index 0000000..eb7ca92 Binary files /dev/null and b/.godot/shader_cache/SceneForwardClusteredShaderRD/1d8f9fd61c770da8fbf2a971b3e81a1e4b82130a464dd2919dd0df65d3f4d4a6/35a078cb7dc07df55e460ed1a913486a68ab6bb0.metal.cache differ diff --git a/.godot/shader_cache/SceneForwardClusteredShaderRD/1d8f9fd61c770da8fbf2a971b3e81a1e4b82130a464dd2919dd0df65d3f4d4a6/7412c254abd0f944fb53942228920fe187f1d723.metal.cache b/.godot/shader_cache/SceneForwardClusteredShaderRD/1d8f9fd61c770da8fbf2a971b3e81a1e4b82130a464dd2919dd0df65d3f4d4a6/7412c254abd0f944fb53942228920fe187f1d723.metal.cache new file mode 100644 index 0000000..7bcc76c Binary files /dev/null and b/.godot/shader_cache/SceneForwardClusteredShaderRD/1d8f9fd61c770da8fbf2a971b3e81a1e4b82130a464dd2919dd0df65d3f4d4a6/7412c254abd0f944fb53942228920fe187f1d723.metal.cache differ diff --git a/.godot/shader_cache/SceneForwardClusteredShaderRD/1d8f9fd61c770da8fbf2a971b3e81a1e4b82130a464dd2919dd0df65d3f4d4a6/7a57964a6a80c226a1011fb78edbda41d2219632.metal.cache b/.godot/shader_cache/SceneForwardClusteredShaderRD/1d8f9fd61c770da8fbf2a971b3e81a1e4b82130a464dd2919dd0df65d3f4d4a6/7a57964a6a80c226a1011fb78edbda41d2219632.metal.cache new file mode 100644 index 0000000..8bc8509 Binary files /dev/null and b/.godot/shader_cache/SceneForwardClusteredShaderRD/1d8f9fd61c770da8fbf2a971b3e81a1e4b82130a464dd2919dd0df65d3f4d4a6/7a57964a6a80c226a1011fb78edbda41d2219632.metal.cache differ diff --git a/.godot/shader_cache/SceneForwardClusteredShaderRD/1d8f9fd61c770da8fbf2a971b3e81a1e4b82130a464dd2919dd0df65d3f4d4a6/7a6b05ba6ca90f8a542e0d1fcc3360f7d52c6e09.metal.cache b/.godot/shader_cache/SceneForwardClusteredShaderRD/1d8f9fd61c770da8fbf2a971b3e81a1e4b82130a464dd2919dd0df65d3f4d4a6/7a6b05ba6ca90f8a542e0d1fcc3360f7d52c6e09.metal.cache new file mode 100644 index 0000000..4d8cd89 Binary files /dev/null and b/.godot/shader_cache/SceneForwardClusteredShaderRD/1d8f9fd61c770da8fbf2a971b3e81a1e4b82130a464dd2919dd0df65d3f4d4a6/7a6b05ba6ca90f8a542e0d1fcc3360f7d52c6e09.metal.cache differ diff --git a/.godot/shader_cache/SceneForwardClusteredShaderRD/1d8f9fd61c770da8fbf2a971b3e81a1e4b82130a464dd2919dd0df65d3f4d4a6/7d4c2429f20db9b651852713d31971380f209eec.metal.cache b/.godot/shader_cache/SceneForwardClusteredShaderRD/1d8f9fd61c770da8fbf2a971b3e81a1e4b82130a464dd2919dd0df65d3f4d4a6/7d4c2429f20db9b651852713d31971380f209eec.metal.cache new file mode 100644 index 0000000..1f5c2d0 Binary files /dev/null and b/.godot/shader_cache/SceneForwardClusteredShaderRD/1d8f9fd61c770da8fbf2a971b3e81a1e4b82130a464dd2919dd0df65d3f4d4a6/7d4c2429f20db9b651852713d31971380f209eec.metal.cache differ diff --git a/.godot/shader_cache/SceneForwardClusteredShaderRD/1d8f9fd61c770da8fbf2a971b3e81a1e4b82130a464dd2919dd0df65d3f4d4a6/89044bace37a3ce54cf2cc5190e11bed6d14f97a.metal.cache b/.godot/shader_cache/SceneForwardClusteredShaderRD/1d8f9fd61c770da8fbf2a971b3e81a1e4b82130a464dd2919dd0df65d3f4d4a6/89044bace37a3ce54cf2cc5190e11bed6d14f97a.metal.cache new file mode 100644 index 0000000..db2b4aa Binary files /dev/null and b/.godot/shader_cache/SceneForwardClusteredShaderRD/1d8f9fd61c770da8fbf2a971b3e81a1e4b82130a464dd2919dd0df65d3f4d4a6/89044bace37a3ce54cf2cc5190e11bed6d14f97a.metal.cache differ diff --git a/.godot/shader_cache/SceneForwardClusteredShaderRD/1d8f9fd61c770da8fbf2a971b3e81a1e4b82130a464dd2919dd0df65d3f4d4a6/a38af1e47720abf30ca44f3d3c099c07b046df81.metal.cache b/.godot/shader_cache/SceneForwardClusteredShaderRD/1d8f9fd61c770da8fbf2a971b3e81a1e4b82130a464dd2919dd0df65d3f4d4a6/a38af1e47720abf30ca44f3d3c099c07b046df81.metal.cache new file mode 100644 index 0000000..1bde60d Binary files /dev/null and b/.godot/shader_cache/SceneForwardClusteredShaderRD/1d8f9fd61c770da8fbf2a971b3e81a1e4b82130a464dd2919dd0df65d3f4d4a6/a38af1e47720abf30ca44f3d3c099c07b046df81.metal.cache differ diff --git a/.godot/shader_cache/SceneForwardClusteredShaderRD/1d8f9fd61c770da8fbf2a971b3e81a1e4b82130a464dd2919dd0df65d3f4d4a6/ab0b960474f1491b42ef9f2ca13dbd4ccaf64911.metal.cache b/.godot/shader_cache/SceneForwardClusteredShaderRD/1d8f9fd61c770da8fbf2a971b3e81a1e4b82130a464dd2919dd0df65d3f4d4a6/ab0b960474f1491b42ef9f2ca13dbd4ccaf64911.metal.cache new file mode 100644 index 0000000..f5c885b Binary files /dev/null and b/.godot/shader_cache/SceneForwardClusteredShaderRD/1d8f9fd61c770da8fbf2a971b3e81a1e4b82130a464dd2919dd0df65d3f4d4a6/ab0b960474f1491b42ef9f2ca13dbd4ccaf64911.metal.cache differ diff --git a/.godot/shader_cache/SceneForwardClusteredShaderRD/1d8f9fd61c770da8fbf2a971b3e81a1e4b82130a464dd2919dd0df65d3f4d4a6/f88424e725a3bb50f358e9b042552af7b1c2f921.metal.cache b/.godot/shader_cache/SceneForwardClusteredShaderRD/1d8f9fd61c770da8fbf2a971b3e81a1e4b82130a464dd2919dd0df65d3f4d4a6/f88424e725a3bb50f358e9b042552af7b1c2f921.metal.cache new file mode 100644 index 0000000..97751cd Binary files /dev/null and b/.godot/shader_cache/SceneForwardClusteredShaderRD/1d8f9fd61c770da8fbf2a971b3e81a1e4b82130a464dd2919dd0df65d3f4d4a6/f88424e725a3bb50f358e9b042552af7b1c2f921.metal.cache differ diff --git a/.godot/shader_cache/SceneForwardClusteredShaderRD/1d8f9fd61c770da8fbf2a971b3e81a1e4b82130a464dd2919dd0df65d3f4d4a6/f89c365b12d7e2d46fb2e1f6ace46a76b6cd5e89.metal.cache b/.godot/shader_cache/SceneForwardClusteredShaderRD/1d8f9fd61c770da8fbf2a971b3e81a1e4b82130a464dd2919dd0df65d3f4d4a6/f89c365b12d7e2d46fb2e1f6ace46a76b6cd5e89.metal.cache new file mode 100644 index 0000000..0646f69 Binary files /dev/null and b/.godot/shader_cache/SceneForwardClusteredShaderRD/1d8f9fd61c770da8fbf2a971b3e81a1e4b82130a464dd2919dd0df65d3f4d4a6/f89c365b12d7e2d46fb2e1f6ace46a76b6cd5e89.metal.cache differ diff --git a/.godot/shader_cache/ScreenSpaceReflectionDownsampleShaderRD/efffc9e5a7c66f8a0f9ff93c2de0f3ae0f0204238caf8bd81b886c65eab90fd4/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache b/.godot/shader_cache/ScreenSpaceReflectionDownsampleShaderRD/efffc9e5a7c66f8a0f9ff93c2de0f3ae0f0204238caf8bd81b886c65eab90fd4/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache new file mode 100644 index 0000000..dddb8c8 Binary files /dev/null and b/.godot/shader_cache/ScreenSpaceReflectionDownsampleShaderRD/efffc9e5a7c66f8a0f9ff93c2de0f3ae0f0204238caf8bd81b886c65eab90fd4/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache differ diff --git a/.godot/shader_cache/ScreenSpaceReflectionFilterShaderRD/df57b17e0d3f8e6a2117eddae7b20ed4374b305ba8ca4574e4de35047a65e359/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache b/.godot/shader_cache/ScreenSpaceReflectionFilterShaderRD/df57b17e0d3f8e6a2117eddae7b20ed4374b305ba8ca4574e4de35047a65e359/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache new file mode 100644 index 0000000..a0b8cbc Binary files /dev/null and b/.godot/shader_cache/ScreenSpaceReflectionFilterShaderRD/df57b17e0d3f8e6a2117eddae7b20ed4374b305ba8ca4574e4de35047a65e359/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache differ diff --git a/.godot/shader_cache/ScreenSpaceReflectionHizShaderRD/997ce3e6161596f9996f5616548734cb1b6ae9ba53707e753153b0855fe4e6ab/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache b/.godot/shader_cache/ScreenSpaceReflectionHizShaderRD/997ce3e6161596f9996f5616548734cb1b6ae9ba53707e753153b0855fe4e6ab/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache new file mode 100644 index 0000000..385239c Binary files /dev/null and b/.godot/shader_cache/ScreenSpaceReflectionHizShaderRD/997ce3e6161596f9996f5616548734cb1b6ae9ba53707e753153b0855fe4e6ab/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache differ diff --git a/.godot/shader_cache/ScreenSpaceReflectionResolveShaderRD/33380c22729b8429fde29e1f93f85b5208c85e4ede0aa997a4929891c2c29ac3/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache b/.godot/shader_cache/ScreenSpaceReflectionResolveShaderRD/33380c22729b8429fde29e1f93f85b5208c85e4ede0aa997a4929891c2c29ac3/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache new file mode 100644 index 0000000..c62d86a Binary files /dev/null and b/.godot/shader_cache/ScreenSpaceReflectionResolveShaderRD/33380c22729b8429fde29e1f93f85b5208c85e4ede0aa997a4929891c2c29ac3/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache differ diff --git a/.godot/shader_cache/ScreenSpaceReflectionShaderRD/435a8cc42eafc61cd0a165605df5c12a844b2638060a76140c926e7ae3f17370/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache b/.godot/shader_cache/ScreenSpaceReflectionShaderRD/435a8cc42eafc61cd0a165605df5c12a844b2638060a76140c926e7ae3f17370/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache new file mode 100644 index 0000000..5d9ddca Binary files /dev/null and b/.godot/shader_cache/ScreenSpaceReflectionShaderRD/435a8cc42eafc61cd0a165605df5c12a844b2638060a76140c926e7ae3f17370/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache differ diff --git a/.godot/shader_cache/SdfgiDebugProbesShaderRD/c686dc153eb1e1b4ce9aa61259db41552f6a3d85a07bca8c284700c4e738a962/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache b/.godot/shader_cache/SdfgiDebugProbesShaderRD/c686dc153eb1e1b4ce9aa61259db41552f6a3d85a07bca8c284700c4e738a962/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache new file mode 100644 index 0000000..70c89ee Binary files /dev/null and b/.godot/shader_cache/SdfgiDebugProbesShaderRD/c686dc153eb1e1b4ce9aa61259db41552f6a3d85a07bca8c284700c4e738a962/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache differ diff --git a/.godot/shader_cache/SdfgiDebugShaderRD/770683c4abbe80e6aaa1fcce0e3aa9d0da557c3ab2aeb97c71adda2071ed6d9e/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache b/.godot/shader_cache/SdfgiDebugShaderRD/770683c4abbe80e6aaa1fcce0e3aa9d0da557c3ab2aeb97c71adda2071ed6d9e/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache new file mode 100644 index 0000000..dc3dbd5 Binary files /dev/null and b/.godot/shader_cache/SdfgiDebugShaderRD/770683c4abbe80e6aaa1fcce0e3aa9d0da557c3ab2aeb97c71adda2071ed6d9e/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache differ diff --git a/.godot/shader_cache/SdfgiDirectLightShaderRD/2fb0b4bb5244e2878ed914d5c7091b8a29a281b7ef61c89bd41cb1af4833f6f1/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache b/.godot/shader_cache/SdfgiDirectLightShaderRD/2fb0b4bb5244e2878ed914d5c7091b8a29a281b7ef61c89bd41cb1af4833f6f1/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache new file mode 100644 index 0000000..1822f4d Binary files /dev/null and b/.godot/shader_cache/SdfgiDirectLightShaderRD/2fb0b4bb5244e2878ed914d5c7091b8a29a281b7ef61c89bd41cb1af4833f6f1/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache differ diff --git a/.godot/shader_cache/SdfgiIntegrateShaderRD/b6bde7dbd199e845ade91714af87216fa88e23a5866f28aed59e0ee81da45cce/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache b/.godot/shader_cache/SdfgiIntegrateShaderRD/b6bde7dbd199e845ade91714af87216fa88e23a5866f28aed59e0ee81da45cce/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache new file mode 100644 index 0000000..cd41f31 Binary files /dev/null and b/.godot/shader_cache/SdfgiIntegrateShaderRD/b6bde7dbd199e845ade91714af87216fa88e23a5866f28aed59e0ee81da45cce/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache differ diff --git a/.godot/shader_cache/SdfgiPreprocessShaderRD/8209c4e09174b46160bf3298a91fdd988a8aae6b7e81d6dd381d87b0aad47434/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache b/.godot/shader_cache/SdfgiPreprocessShaderRD/8209c4e09174b46160bf3298a91fdd988a8aae6b7e81d6dd381d87b0aad47434/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache new file mode 100644 index 0000000..0c8b1ab Binary files /dev/null and b/.godot/shader_cache/SdfgiPreprocessShaderRD/8209c4e09174b46160bf3298a91fdd988a8aae6b7e81d6dd381d87b0aad47434/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache differ diff --git a/.godot/shader_cache/ShadowFrustumShaderRD/3deae303d647faccb68971539f74a832fa8321fe8d642826a8c88bbd3658b679/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache b/.godot/shader_cache/ShadowFrustumShaderRD/3deae303d647faccb68971539f74a832fa8321fe8d642826a8c88bbd3658b679/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache new file mode 100644 index 0000000..d6893ac Binary files /dev/null and b/.godot/shader_cache/ShadowFrustumShaderRD/3deae303d647faccb68971539f74a832fa8321fe8d642826a8c88bbd3658b679/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache differ diff --git a/.godot/shader_cache/SkeletonShaderRD/f5464247670c8a6767c45f6d3608e1cde3ee7c170567663cf709cd4ed8b3a4c1/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache b/.godot/shader_cache/SkeletonShaderRD/f5464247670c8a6767c45f6d3608e1cde3ee7c170567663cf709cd4ed8b3a4c1/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache new file mode 100644 index 0000000..1a6a48b Binary files /dev/null and b/.godot/shader_cache/SkeletonShaderRD/f5464247670c8a6767c45f6d3608e1cde3ee7c170567663cf709cd4ed8b3a4c1/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache differ diff --git a/.godot/shader_cache/SkyShaderRD/35d1b4b37bab144dc90408dd6cf6ddeee4a134e13f3efe56f0e3ae92e83a5124/03e3b11c69e24394b2d955a8c0ba85587bb70839.metal.cache b/.godot/shader_cache/SkyShaderRD/35d1b4b37bab144dc90408dd6cf6ddeee4a134e13f3efe56f0e3ae92e83a5124/03e3b11c69e24394b2d955a8c0ba85587bb70839.metal.cache new file mode 100644 index 0000000..916e301 Binary files /dev/null and b/.godot/shader_cache/SkyShaderRD/35d1b4b37bab144dc90408dd6cf6ddeee4a134e13f3efe56f0e3ae92e83a5124/03e3b11c69e24394b2d955a8c0ba85587bb70839.metal.cache differ diff --git a/.godot/shader_cache/SkyShaderRD/35d1b4b37bab144dc90408dd6cf6ddeee4a134e13f3efe56f0e3ae92e83a5124/de678811d1bad3cad4892a8db7b6ea0be197d51d.metal.cache b/.godot/shader_cache/SkyShaderRD/35d1b4b37bab144dc90408dd6cf6ddeee4a134e13f3efe56f0e3ae92e83a5124/de678811d1bad3cad4892a8db7b6ea0be197d51d.metal.cache new file mode 100644 index 0000000..ccce934 Binary files /dev/null and b/.godot/shader_cache/SkyShaderRD/35d1b4b37bab144dc90408dd6cf6ddeee4a134e13f3efe56f0e3ae92e83a5124/de678811d1bad3cad4892a8db7b6ea0be197d51d.metal.cache differ diff --git a/.godot/shader_cache/SkyShaderRD/35d1b4b37bab144dc90408dd6cf6ddeee4a134e13f3efe56f0e3ae92e83a5124/e105b1e014f9523daf8d734c2f2dc115ba341902.metal.cache b/.godot/shader_cache/SkyShaderRD/35d1b4b37bab144dc90408dd6cf6ddeee4a134e13f3efe56f0e3ae92e83a5124/e105b1e014f9523daf8d734c2f2dc115ba341902.metal.cache new file mode 100644 index 0000000..881ce18 Binary files /dev/null and b/.godot/shader_cache/SkyShaderRD/35d1b4b37bab144dc90408dd6cf6ddeee4a134e13f3efe56f0e3ae92e83a5124/e105b1e014f9523daf8d734c2f2dc115ba341902.metal.cache differ diff --git a/.godot/shader_cache/SmaaBlendingShaderRD/6088fec0579720c9b0477de3d431bbc3b7de4b868060edc13f716d8818817556/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache b/.godot/shader_cache/SmaaBlendingShaderRD/6088fec0579720c9b0477de3d431bbc3b7de4b868060edc13f716d8818817556/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache new file mode 100644 index 0000000..24829e2 Binary files /dev/null and b/.godot/shader_cache/SmaaBlendingShaderRD/6088fec0579720c9b0477de3d431bbc3b7de4b868060edc13f716d8818817556/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache differ diff --git a/.godot/shader_cache/SmaaEdgeDetectionShaderRD/a6c5c7327054acd529d0181b07bf068fccf6773b47e3bc26742813607b59ba24/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache b/.godot/shader_cache/SmaaEdgeDetectionShaderRD/a6c5c7327054acd529d0181b07bf068fccf6773b47e3bc26742813607b59ba24/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache new file mode 100644 index 0000000..29a2a18 Binary files /dev/null and b/.godot/shader_cache/SmaaEdgeDetectionShaderRD/a6c5c7327054acd529d0181b07bf068fccf6773b47e3bc26742813607b59ba24/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache differ diff --git a/.godot/shader_cache/SmaaWeightCalculationShaderRD/3893abaf810bdff4408209bba813141b7ed437601200519b8aee0a69f0349d05/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache b/.godot/shader_cache/SmaaWeightCalculationShaderRD/3893abaf810bdff4408209bba813141b7ed437601200519b8aee0a69f0349d05/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache new file mode 100644 index 0000000..9650650 Binary files /dev/null and b/.godot/shader_cache/SmaaWeightCalculationShaderRD/3893abaf810bdff4408209bba813141b7ed437601200519b8aee0a69f0349d05/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache differ diff --git a/.godot/shader_cache/SortShaderRD/f9ec1d3b74a8fc2c04e3f2648f95f2f1bbdce58b6c290cf9c4851a0bac4771d4/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache b/.godot/shader_cache/SortShaderRD/f9ec1d3b74a8fc2c04e3f2648f95f2f1bbdce58b6c290cf9c4851a0bac4771d4/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache new file mode 100644 index 0000000..ab67959 Binary files /dev/null and b/.godot/shader_cache/SortShaderRD/f9ec1d3b74a8fc2c04e3f2648f95f2f1bbdce58b6c290cf9c4851a0bac4771d4/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache differ diff --git a/.godot/shader_cache/SpecularMergeShaderRD/2c24bae3cdd8885d57ab9d12d4cfc7fc3bc7462a287e93293f3533163e9e82a3/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache b/.godot/shader_cache/SpecularMergeShaderRD/2c24bae3cdd8885d57ab9d12d4cfc7fc3bc7462a287e93293f3533163e9e82a3/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache new file mode 100644 index 0000000..24c7e95 Binary files /dev/null and b/.godot/shader_cache/SpecularMergeShaderRD/2c24bae3cdd8885d57ab9d12d4cfc7fc3bc7462a287e93293f3533163e9e82a3/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache differ diff --git a/.godot/shader_cache/SsEffectsDownsampleShaderRD/00b905de0ce61aa71e1203c86aadb464c5254c0f70c5df1c4a16ae369a011fd8/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache b/.godot/shader_cache/SsEffectsDownsampleShaderRD/00b905de0ce61aa71e1203c86aadb464c5254c0f70c5df1c4a16ae369a011fd8/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache new file mode 100644 index 0000000..2edb668 Binary files /dev/null and b/.godot/shader_cache/SsEffectsDownsampleShaderRD/00b905de0ce61aa71e1203c86aadb464c5254c0f70c5df1c4a16ae369a011fd8/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache differ diff --git a/.godot/shader_cache/SsaoBlurShaderRD/b65a0faa61bd9bc74ffa0d5e350fbcfb41b509b462ba4efc099932750277c6c9/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache b/.godot/shader_cache/SsaoBlurShaderRD/b65a0faa61bd9bc74ffa0d5e350fbcfb41b509b462ba4efc099932750277c6c9/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache new file mode 100644 index 0000000..b9384a4 Binary files /dev/null and b/.godot/shader_cache/SsaoBlurShaderRD/b65a0faa61bd9bc74ffa0d5e350fbcfb41b509b462ba4efc099932750277c6c9/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache differ diff --git a/.godot/shader_cache/SsaoImportanceMapShaderRD/8dea32f8f998a2826251eaa6f2e79afd0d32fe7c8f5cbfa07ffaa7e6dd065adb/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache b/.godot/shader_cache/SsaoImportanceMapShaderRD/8dea32f8f998a2826251eaa6f2e79afd0d32fe7c8f5cbfa07ffaa7e6dd065adb/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache new file mode 100644 index 0000000..8329bb5 Binary files /dev/null and b/.godot/shader_cache/SsaoImportanceMapShaderRD/8dea32f8f998a2826251eaa6f2e79afd0d32fe7c8f5cbfa07ffaa7e6dd065adb/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache differ diff --git a/.godot/shader_cache/SsaoInterleaveShaderRD/37d20a08ed7c0df456d74fe2afcd709bb63683bf17844b96ef3a831708fe33d6/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache b/.godot/shader_cache/SsaoInterleaveShaderRD/37d20a08ed7c0df456d74fe2afcd709bb63683bf17844b96ef3a831708fe33d6/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache new file mode 100644 index 0000000..d28562a Binary files /dev/null and b/.godot/shader_cache/SsaoInterleaveShaderRD/37d20a08ed7c0df456d74fe2afcd709bb63683bf17844b96ef3a831708fe33d6/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache differ diff --git a/.godot/shader_cache/SsaoShaderRD/3d813e95740f9b60dfc54dc27d3e8bef0fe774cbe665ce8ca001911d8bddd779/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache b/.godot/shader_cache/SsaoShaderRD/3d813e95740f9b60dfc54dc27d3e8bef0fe774cbe665ce8ca001911d8bddd779/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache new file mode 100644 index 0000000..69864d5 Binary files /dev/null and b/.godot/shader_cache/SsaoShaderRD/3d813e95740f9b60dfc54dc27d3e8bef0fe774cbe665ce8ca001911d8bddd779/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache differ diff --git a/.godot/shader_cache/SsilBlurShaderRD/4aebd32e075cc380fa044bbd25d6041f3b33e9642997142ff651a262e4919f58/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache b/.godot/shader_cache/SsilBlurShaderRD/4aebd32e075cc380fa044bbd25d6041f3b33e9642997142ff651a262e4919f58/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache new file mode 100644 index 0000000..5735590 Binary files /dev/null and b/.godot/shader_cache/SsilBlurShaderRD/4aebd32e075cc380fa044bbd25d6041f3b33e9642997142ff651a262e4919f58/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache differ diff --git a/.godot/shader_cache/SsilImportanceMapShaderRD/f06c8f5624e6170877d397deebb400e940cb4d625d05260d6a24d24e6682da98/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache b/.godot/shader_cache/SsilImportanceMapShaderRD/f06c8f5624e6170877d397deebb400e940cb4d625d05260d6a24d24e6682da98/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache new file mode 100644 index 0000000..198b7bd Binary files /dev/null and b/.godot/shader_cache/SsilImportanceMapShaderRD/f06c8f5624e6170877d397deebb400e940cb4d625d05260d6a24d24e6682da98/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache differ diff --git a/.godot/shader_cache/SsilInterleaveShaderRD/adb7d726b7686b420a442a3227b89ebbec02e308f3eecaca78455b1334d3d124/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache b/.godot/shader_cache/SsilInterleaveShaderRD/adb7d726b7686b420a442a3227b89ebbec02e308f3eecaca78455b1334d3d124/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache new file mode 100644 index 0000000..c86dbcc Binary files /dev/null and b/.godot/shader_cache/SsilInterleaveShaderRD/adb7d726b7686b420a442a3227b89ebbec02e308f3eecaca78455b1334d3d124/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache differ diff --git a/.godot/shader_cache/SsilShaderRD/3b05aa37155fafb48b5c5687c2743ee0d78977c853054b1533422ec2ef43dfc7/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache b/.godot/shader_cache/SsilShaderRD/3b05aa37155fafb48b5c5687c2743ee0d78977c853054b1533422ec2ef43dfc7/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache new file mode 100644 index 0000000..fbec0d1 Binary files /dev/null and b/.godot/shader_cache/SsilShaderRD/3b05aa37155fafb48b5c5687c2743ee0d78977c853054b1533422ec2ef43dfc7/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache differ diff --git a/.godot/shader_cache/SubsurfaceScatteringShaderRD/1b13b43aab403edf1776669251ef4c9219eb57ea9b8e86483f0c0b44cfbe566e/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache b/.godot/shader_cache/SubsurfaceScatteringShaderRD/1b13b43aab403edf1776669251ef4c9219eb57ea9b8e86483f0c0b44cfbe566e/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache new file mode 100644 index 0000000..d5d8bcb Binary files /dev/null and b/.godot/shader_cache/SubsurfaceScatteringShaderRD/1b13b43aab403edf1776669251ef4c9219eb57ea9b8e86483f0c0b44cfbe566e/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache differ diff --git a/.godot/shader_cache/TaaResolveShaderRD/80810a13c63cdcf213a9e1f7d092d977e0552d6453157bb11355fa7502e38656/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache b/.godot/shader_cache/TaaResolveShaderRD/80810a13c63cdcf213a9e1f7d092d977e0552d6453157bb11355fa7502e38656/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache new file mode 100644 index 0000000..e240f3c Binary files /dev/null and b/.godot/shader_cache/TaaResolveShaderRD/80810a13c63cdcf213a9e1f7d092d977e0552d6453157bb11355fa7502e38656/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache differ diff --git a/.godot/shader_cache/TonemapShaderRD/a56bf793a5b570b67656c7c358d65edc055616e7e6979e80c0c9c15416159004/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache b/.godot/shader_cache/TonemapShaderRD/a56bf793a5b570b67656c7c358d65edc055616e7e6979e80c0c9c15416159004/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache new file mode 100644 index 0000000..a7979e9 Binary files /dev/null and b/.godot/shader_cache/TonemapShaderRD/a56bf793a5b570b67656c7c358d65edc055616e7e6979e80c0c9c15416159004/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache differ diff --git a/.godot/shader_cache/VolumetricFogProcessShaderRD/e7111e4619b756f12ede8cd7e1882d809c920d3cd1e92800d26dc2843c1d7951/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache b/.godot/shader_cache/VolumetricFogProcessShaderRD/e7111e4619b756f12ede8cd7e1882d809c920d3cd1e92800d26dc2843c1d7951/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache new file mode 100644 index 0000000..feee5ea Binary files /dev/null and b/.godot/shader_cache/VolumetricFogProcessShaderRD/e7111e4619b756f12ede8cd7e1882d809c920d3cd1e92800d26dc2843c1d7951/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache differ diff --git a/.godot/shader_cache/VolumetricFogShaderRD/e1000919e80553e4e1df0331263cb2a0e46aa40a7e49b0a36818de89941c5685/9a227745af2d65830f930370a9fbba551fbd6f60.metal.cache b/.godot/shader_cache/VolumetricFogShaderRD/e1000919e80553e4e1df0331263cb2a0e46aa40a7e49b0a36818de89941c5685/9a227745af2d65830f930370a9fbba551fbd6f60.metal.cache new file mode 100644 index 0000000..6f3771f Binary files /dev/null and b/.godot/shader_cache/VolumetricFogShaderRD/e1000919e80553e4e1df0331263cb2a0e46aa40a7e49b0a36818de89941c5685/9a227745af2d65830f930370a9fbba551fbd6f60.metal.cache differ diff --git a/.godot/shader_cache/VoxelGiDebugShaderRD/0c11e2b01ffc801b382d12556a315f70379dc7769e0f04b55f281d9dfafc10e6/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache b/.godot/shader_cache/VoxelGiDebugShaderRD/0c11e2b01ffc801b382d12556a315f70379dc7769e0f04b55f281d9dfafc10e6/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache new file mode 100644 index 0000000..d3f5033 Binary files /dev/null and b/.godot/shader_cache/VoxelGiDebugShaderRD/0c11e2b01ffc801b382d12556a315f70379dc7769e0f04b55f281d9dfafc10e6/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache differ diff --git a/.godot/shader_cache/VoxelGiShaderRD/b12597d0afb0147a772f4ce6eab75f7a1d08b458e5ce7df8a01f34092bdb8984/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache b/.godot/shader_cache/VoxelGiShaderRD/b12597d0afb0147a772f4ce6eab75f7a1d08b458e5ce7df8a01f34092bdb8984/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache new file mode 100644 index 0000000..0e9f5f9 Binary files /dev/null and b/.godot/shader_cache/VoxelGiShaderRD/b12597d0afb0147a772f4ce6eab75f7a1d08b458e5ce7df8a01f34092bdb8984/087916079fba7c625e62b0c2cca570e0fb87c99a.metal.cache differ diff --git a/.godot/uid_cache.bin b/.godot/uid_cache.bin new file mode 100644 index 0000000..c3e54ed Binary files /dev/null and b/.godot/uid_cache.bin differ diff --git a/icon.svg b/icon.svg new file mode 100644 index 0000000..9aaf064 --- /dev/null +++ b/icon.svg @@ -0,0 +1,5 @@ + + + + 👟 + diff --git a/icon.svg.import b/icon.svg.import new file mode 100644 index 0000000..418efd2 --- /dev/null +++ b/icon.svg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://crh07tiwwxj6u" +path="res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://icon.svg" +dest_files=["res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/project.godot b/project.godot new file mode 100644 index 0000000..e90eecb --- /dev/null +++ b/project.godot @@ -0,0 +1,20 @@ +; Engine configuration file. +; It's best edited using the editor UI and not directly, +; since the parameters that go here are not all obvious. +; +; Format: +; [section] ; section goes between [] +; param=value ; assign values to parameters + +config_version=5 + +[animation] + +compatibility/default_parent_skeleton_in_mesh_instance_3d=true + +[application] + +config/name="KickSurvivors" +run/main_scene="res://scenes/Main.tscn" +config/features=PackedStringArray("4.6", "Forward Plus") +config/icon="res://icon.svg" diff --git a/scenes/Enemy.tscn b/scenes/Enemy.tscn new file mode 100644 index 0000000..d44ec51 --- /dev/null +++ b/scenes/Enemy.tscn @@ -0,0 +1,6 @@ +[gd_scene load_steps=2 format=3 uid="uid://cxk2mn5oab341"] + +[ext_resource type="Script" path="res://scripts/Enemy.gd" id="1_enemy"] + +[node name="Enemy" type="CharacterBody3D"] +script = ExtResource("1_enemy") diff --git a/scenes/Main.tscn b/scenes/Main.tscn new file mode 100644 index 0000000..3ffd369 --- /dev/null +++ b/scenes/Main.tscn @@ -0,0 +1,11 @@ +[gd_scene load_steps=2 format=3 uid="uid://dyz3no6pcd567"] + +[ext_resource type="Script" path="res://scripts/Main.gd" id="1_main"] + +[node name="Main" type="Node3D"] +script = ExtResource("1_main") + +[node name="SpawnTimer" type="Timer" parent="."] +wait_time = 1.5 +one_shot = false +autostart = false diff --git a/scenes/Player.tscn b/scenes/Player.tscn new file mode 100644 index 0000000..38c5b6d --- /dev/null +++ b/scenes/Player.tscn @@ -0,0 +1,6 @@ +[gd_scene load_steps=2 format=3 uid="uid://bpq8lf4mcvhw5"] + +[ext_resource type="Script" path="res://scripts/Player.gd" id="1_player"] + +[node name="Player" type="CharacterBody3D"] +script = ExtResource("1_player") diff --git a/scripts/Enemy.gd b/scripts/Enemy.gd new file mode 100644 index 0000000..0bdcfd9 --- /dev/null +++ b/scripts/Enemy.gd @@ -0,0 +1,202 @@ +extends CharacterBody3D + +signal died(points: int) + +enum State { CHASING, FLYING, STUNNED, DEAD } + +var move_speed: float = 3.0 +var health: int = 30 +var damage_to_player: int = 8 +var score_value: int = 10 +var wall_damage_mult: float = 1.8 +var chain_factor: float = 0.65 +var stun_time: float = 0.5 +var base_scale: float = 1.0 + +var state: State = State.CHASING +var fly_vel: Vector3 = Vector3.ZERO +var stun_timer: float = 0.0 +var contact_timer: float = 0.0 +var target: Node3D = null + +var mesh_node: MeshInstance3D +var mat: StandardMaterial3D + +var COLOR_CHASE = Color(1.0, 0.28, 0.18) +var COLOR_FLY = Color(1.0, 0.85, 0.1) +var COLOR_STUN = Color(0.55, 0.55, 0.65) +const CONTACT_CD = 0.7 +const AIR_FRICTION = 0.86 + +func _ready() -> void: + add_to_group("enemies") + _build_mesh() + _build_collider() + +func setup(type: String, wave: int) -> void: + match type: + "slime": + move_speed = 2.8 + wave * 0.12 + health = 28 + wave * 4 + score_value = 10 + damage_to_player = 8 + "bat": + move_speed = 5.5 + wave * 0.15 + health = 14 + wave * 2 + score_value = 15 + damage_to_player = 6 + base_scale = 0.7 + mesh_node.scale = Vector3(0.7, 0.7, 0.7) + COLOR_CHASE = Color(0.6, 0.2, 0.8) + mat.albedo_color = COLOR_CHASE + "ogre": + move_speed = 1.8 + wave * 0.08 + health = 80 + wave * 12 + score_value = 25 + damage_to_player = 18 + base_scale = 1.5 + mesh_node.scale = Vector3(1.5, 1.5, 1.5) + COLOR_CHASE = Color(0.3, 0.7, 0.3) + mat.albedo_color = COLOR_CHASE + +func _build_mesh() -> void: + mesh_node = MeshInstance3D.new() + var box := BoxMesh.new() + box.size = Vector3(0.85, 0.85, 0.85) + mesh_node.mesh = box + mesh_node.position.y = 0.425 + mat = StandardMaterial3D.new() + mat.albedo_color = COLOR_CHASE + mat.roughness = 0.8 + mesh_node.material_override = mat + add_child(mesh_node) + +func _build_collider() -> void: + var col := CollisionShape3D.new() + var shape := BoxShape3D.new() + shape.size = Vector3(0.85, 0.85, 0.85) + col.shape = shape + col.position.y = 0.425 + add_child(col) + +func _physics_process(delta: float) -> void: + match state: + State.CHASING: _chase(delta) + State.FLYING: _fly(delta) + State.STUNNED: _stun_tick(delta) + State.DEAD: pass + +func _chase(delta: float) -> void: + if not is_instance_valid(target): + return + contact_timer = max(0.0, contact_timer - delta) + + var diff := target.global_position - global_position + diff.y = 0.0 + var dist := diff.length() + + if dist < 1.0 and contact_timer <= 0.0: + contact_timer = CONTACT_CD + if target.has_method("take_damage"): + target.take_damage(damage_to_player) + + if dist > 0.05: + var dir := diff.normalized() + velocity.x = dir.x * move_speed + velocity.z = dir.z * move_speed + rotation.y = lerp_angle(rotation.y, atan2(dir.x, dir.z), 8.0 * delta) + velocity.y = 0.0 + move_and_slide() + +func _fly(delta: float) -> void: + var speed_now := Vector2(fly_vel.x, fly_vel.z).length() + velocity = fly_vel + velocity.y = 0.0 + move_and_slide() + + var hit_wall := false + for i in get_slide_collision_count(): + var col := get_slide_collision(i) + var col3d := col.get_collider() as Node3D + if col3d == null: + continue + + if col3d.has_meta("is_wall"): + var dmg := int(speed_now * wall_damage_mult) + _take_hit(dmg) + _wall_impact_effect() + fly_vel = Vector3.ZERO + velocity = Vector3.ZERO + _enter_stun() + hit_wall = true + break + elif col3d.is_in_group("enemies") and col3d != self: + var chain_dir := col3d.global_position - global_position + chain_dir.y = 0.0 + if chain_dir.length() > 0.01: + col3d.call("receive_kick", chain_dir.normalized(), speed_now * chain_factor) + elif col3d.is_in_group("player"): + col3d.call("take_damage", int(speed_now * 0.6)) + + if not hit_wall: + fly_vel = velocity + fly_vel.y = 0.0 + fly_vel *= pow(AIR_FRICTION, delta * 60.0) + if Vector2(fly_vel.x, fly_vel.z).length() < 0.4: + _enter_chase() + + # Spin while airborne + mesh_node.rotation.y += delta * 10.0 + +func _stun_tick(delta: float) -> void: + velocity = Vector3.ZERO + stun_timer -= delta + if stun_timer <= 0.0: + _enter_chase() + +func receive_kick(direction: Vector3, force: float) -> void: + if state == State.DEAD: + return + fly_vel = direction * force + fly_vel.y = 0.0 + state = State.FLYING + mat.albedo_color = COLOR_FLY + var tw := create_tween() + tw.tween_property(mesh_node, "scale:y", base_scale * 0.35, 0.06) + tw.tween_property(mesh_node, "scale:y", base_scale, 0.18) + +func _enter_stun() -> void: + state = State.STUNNED + stun_timer = stun_time + mat.albedo_color = COLOR_STUN + var bs := base_scale + var tw := create_tween() + tw.tween_property(mesh_node, "scale", Vector3(bs * 1.6, bs * 0.25, bs * 1.6), 0.07) + tw.tween_property(mesh_node, "scale", Vector3(bs, bs, bs), 0.22) + +func _enter_chase() -> void: + state = State.CHASING + mat.albedo_color = COLOR_CHASE + +func _take_hit(dmg: int) -> void: + if state == State.DEAD: + return + health -= dmg + if health <= 0: + _die() + +func _wall_impact_effect() -> void: + var tw := create_tween() + tw.tween_property(mat, "albedo_color", Color.WHITE, 0.04) + tw.tween_property(mat, "albedo_color", COLOR_STUN, 0.12) + +func _die() -> void: + if state == State.DEAD: + return + state = State.DEAD + set_physics_process(false) + emit_signal("died", score_value) + var tw := create_tween() + tw.tween_property(self, "scale", Vector3(2.0, 0.05, 2.0), 0.18) + tw.tween_property(self, "scale", Vector3(0.0, 0.0, 0.0), 0.1) + tw.tween_callback(queue_free) diff --git a/scripts/Enemy.gd.uid b/scripts/Enemy.gd.uid new file mode 100644 index 0000000..4824cc3 --- /dev/null +++ b/scripts/Enemy.gd.uid @@ -0,0 +1 @@ +uid://ujlvt8u71hg1 diff --git a/scripts/Main.gd b/scripts/Main.gd new file mode 100644 index 0000000..c9d0abc --- /dev/null +++ b/scripts/Main.gd @@ -0,0 +1,440 @@ +extends Node3D + +const PLAYER_SCENE := preload("res://scenes/Player.tscn") +const ENEMY_SCENE := preload("res://scenes/Enemy.tscn") + +const ARENA := 14.0 +const WALL_T := 1.2 +const CAM_DIST := 8.0 +const MOUSE_SENS := 0.18 +const PITCH_MIN := 5.0 +const PITCH_MAX := 70.0 + +var cam_yaw: float = 0.0 +var cam_pitch: float = 28.0 + +@onready var spawn_timer: Timer = $SpawnTimer + +var player: CharacterBody3D +var camera: Camera3D +var wave: int = 1 +var score: int = 0 +var kills: int = 0 +var kills_for_next: int = 10 +var game_active: bool = false +var upgrading: bool = false + +# UI nodes +var canvas: CanvasLayer +var score_label: Label +var wave_label: Label +var hp_bar: ColorRect +var hp_bar_bg: ColorRect +var progress_bar: ColorRect +var progress_bg: ColorRect +var upgrade_panel: Panel +var gameover_panel: Panel + +func _ready() -> void: + _create_environment() + _create_arena() + _create_camera() + _create_ui() + _spawn_player() + _start_game() + Input.mouse_mode = Input.MOUSE_MODE_CAPTURED + +func _input(event: InputEvent) -> void: + var motion := event as InputEventMouseMotion + if motion != null and Input.mouse_mode == Input.MOUSE_MODE_CAPTURED: + cam_yaw -= motion.relative.x * MOUSE_SENS + cam_pitch -= motion.relative.y * MOUSE_SENS + cam_pitch = clampf(cam_pitch, PITCH_MIN, PITCH_MAX) + + if event.is_action_pressed("ui_cancel"): + if Input.mouse_mode == Input.MOUSE_MODE_CAPTURED: + Input.mouse_mode = Input.MOUSE_MODE_VISIBLE + else: + Input.mouse_mode = Input.MOUSE_MODE_CAPTURED + +# ─── Environment ────────────────────────────────────────────────────────────── + +func _create_environment() -> void: + var env := Environment.new() + env.background_mode = Environment.BG_COLOR + env.background_color = Color(0.04, 0.04, 0.08) + env.ambient_light_source = Environment.AMBIENT_SOURCE_COLOR + env.ambient_light_color = Color(0.35, 0.35, 0.5) + env.ambient_light_energy = 0.6 + var we := WorldEnvironment.new() + we.environment = env + add_child(we) + + var sun := DirectionalLight3D.new() + sun.rotation_degrees = Vector3(-55, -25, 0) + sun.light_energy = 1.8 + sun.shadow_enabled = true + add_child(sun) + +# ─── Arena ──────────────────────────────────────────────────────────────────── + +func _create_arena() -> void: + var floor_mat := StandardMaterial3D.new() + floor_mat.albedo_color = Color(0.12, 0.12, 0.18) + floor_mat.roughness = 1.0 + + # Floor mesh (visual only) + var fm := MeshInstance3D.new() + var plane := PlaneMesh.new() + plane.size = Vector2(ARENA * 2, ARENA * 2) + plane.subdivide_width = 8 + plane.subdivide_depth = 8 + fm.mesh = plane + fm.material_override = floor_mat + add_child(fm) + + # Floor collider + var fb := StaticBody3D.new() + var fc := CollisionShape3D.new() + var fs := BoxShape3D.new() + fs.size = Vector3(ARENA * 2, 0.2, ARENA * 2) + fc.shape = fs + fb.position.y = -0.1 + fb.add_child(fc) + add_child(fb) + + # Grid lines on floor + _draw_grid() + + # Four walls + var wall_mat := StandardMaterial3D.new() + wall_mat.albedo_color = Color(0.28, 0.28, 0.42) + wall_mat.roughness = 0.9 + wall_mat.metallic = 0.1 + + _make_wall(Vector3(0, 0.5, -(ARENA + WALL_T * 0.5)), + Vector3(ARENA * 2 + WALL_T * 2, 1.0, WALL_T), wall_mat) + _make_wall(Vector3(0, 0.5, (ARENA + WALL_T * 0.5)), + Vector3(ARENA * 2 + WALL_T * 2, 1.0, WALL_T), wall_mat) + _make_wall(Vector3(-(ARENA + WALL_T * 0.5), 0.5, 0), + Vector3(WALL_T, 1.0, ARENA * 2), wall_mat) + _make_wall(Vector3( (ARENA + WALL_T * 0.5), 0.5, 0), + Vector3(WALL_T, 1.0, ARENA * 2), wall_mat) + +func _make_wall(pos: Vector3, size: Vector3, mat: StandardMaterial3D) -> void: + var body := StaticBody3D.new() + body.position = pos + body.set_meta("is_wall", true) + + var col := CollisionShape3D.new() + var shape := BoxShape3D.new() + shape.size = size + col.shape = shape + body.add_child(col) + + var msh := MeshInstance3D.new() + var box := BoxMesh.new() + box.size = size + msh.mesh = box + msh.material_override = mat + body.add_child(msh) + + add_child(body) + +func _draw_grid() -> void: + # Subtle grid as thin quads + var grid_mat := StandardMaterial3D.new() + grid_mat.albedo_color = Color(0.2, 0.2, 0.3, 0.5) + grid_mat.transparency = BaseMaterial3D.TRANSPARENCY_ALPHA + grid_mat.shading_mode = BaseMaterial3D.SHADING_MODE_UNSHADED + var step := 4.0 + var n := int(ARENA / step) + for i in range(-n, n + 1): + for axis in [0, 1]: + var msh := MeshInstance3D.new() + var box := BoxMesh.new() + if axis == 0: + box.size = Vector3(0.05, 0.01, ARENA * 2) + msh.position = Vector3(i * step, 0.005, 0) + else: + box.size = Vector3(ARENA * 2, 0.01, 0.05) + msh.position = Vector3(0, 0.005, i * step) + msh.mesh = box + msh.material_override = grid_mat + add_child(msh) + +# ─── Camera ─────────────────────────────────────────────────────────────────── + +func _create_camera() -> void: + camera = Camera3D.new() + camera.fov = 70.0 + add_child(camera) + +func _process(delta: float) -> void: + if is_instance_valid(player): + var yaw_r: float = deg_to_rad(cam_yaw) + var pitch_r: float = deg_to_rad(cam_pitch) + var offset := Vector3( + sin(yaw_r) * cos(pitch_r) * CAM_DIST, + sin(pitch_r) * CAM_DIST, + cos(yaw_r) * cos(pitch_r) * CAM_DIST + ) + var look_at_pos := player.global_position + Vector3(0, 0.8, 0) + camera.global_position = camera.global_position.lerp(look_at_pos + offset, 14.0 * delta) + camera.look_at(look_at_pos, Vector3.UP) + +# ─── Player ─────────────────────────────────────────────────────────────────── + +func _spawn_player() -> void: + player = PLAYER_SCENE.instantiate() as CharacterBody3D + player.position = Vector3(0, 0, 0) + player.connect("died", _on_player_died) + player.connect("health_changed", _on_health_changed) + add_child(player) + +# ─── Game flow ──────────────────────────────────────────────────────────────── + +func _start_game() -> void: + game_active = true + wave = 1 + score = 0 + kills = 0 + kills_for_next = 10 + _update_labels() + spawn_timer.wait_time = 1.4 + spawn_timer.connect("timeout", _on_spawn_timer) + spawn_timer.start() + +func _on_spawn_timer() -> void: + if not game_active or upgrading: + return + _spawn_enemy() + spawn_timer.wait_time = max(0.25, 1.4 - wave * 0.07) + +func _spawn_enemy() -> void: + var enemy := ENEMY_SCENE.instantiate() as CharacterBody3D + add_child(enemy) + + # Pick type based on wave + var pool: Array[String] = ["slime"] + if wave >= 4: pool.append("bat") + if wave >= 7: pool.append("ogre") + var type: String = pool[randi() % pool.size()] + enemy.setup(type, wave) + enemy.target = player + enemy.connect("died", _on_enemy_died) + + # Spawn at random edge + var side := randi() % 4 + var r := randf_range(-(ARENA - 1.0), ARENA - 1.0) + match side: + 0: enemy.position = Vector3(r, 0, -(ARENA - 0.5)) + 1: enemy.position = Vector3(r, 0, (ARENA - 0.5)) + 2: enemy.position = Vector3(-(ARENA - 0.5), 0, r) + 3: enemy.position = Vector3( (ARENA - 0.5), 0, r) + +func _on_enemy_died(points: int) -> void: + score += points + kills += 1 + _update_labels() + _update_progress() + + if kills >= kills_for_next: + kills = 0 + kills_for_next = int(kills_for_next * 1.6) + wave += 1 + _show_upgrade() + +func _on_player_died() -> void: + game_active = false + spawn_timer.stop() + _show_gameover() + +func _on_health_changed(cur: int, mx: int) -> void: + hp_bar.size.x = 200.0 * float(cur) / float(mx) + +# ─── Upgrades ───────────────────────────────────────────────────────────────── + +const UPGRADES := [ + {"id": "kick_force", "name": "💥 Stronger Kick", "desc": "Enemies fly farther"}, + {"id": "kick_range", "name": "🌐 Wider Kick", "desc": "Bigger kick area"}, + {"id": "kick_cooldown", "name": "⚡ Faster Kick", "desc": "Kick more often"}, + {"id": "move_speed", "name": "💨 Fleet Foot", "desc": "Move faster"}, + {"id": "max_health", "name": "❤️ Vitality", "desc": "+30 max HP"}, +] + +func _show_upgrade() -> void: + upgrading = true + get_tree().paused = true + upgrade_panel.visible = true + + # Pick 3 random upgrades + var pool: Array = UPGRADES.duplicate() + pool.shuffle() + var choices: Array = pool.slice(0, 3) + + for i in range(3): + var btn := upgrade_panel.get_node("VBox/Btn%d" % i) as Button + if i < choices.size(): + var upg: Dictionary = choices[i] + btn.text = "%s\n%s" % [upg["name"], upg["desc"]] + btn.visible = true + # Disconnect old signals + for conn in btn.get_signal_connection_list("pressed"): + btn.disconnect("pressed", conn["callable"]) + var uid: String = upg["id"] + btn.connect("pressed", _pick_upgrade.bind(uid)) + else: + btn.visible = false + +func _pick_upgrade(id: String) -> void: + player.apply_upgrade(id) + upgrade_panel.visible = false + get_tree().paused = false + upgrading = false + _update_labels() + +func _show_gameover() -> void: + gameover_panel.visible = true + var lbl := gameover_panel.get_node("VBox/ScoreLabel") as Label + lbl.text = "Score: %d\nWave: %d" % [score, wave] + +func _restart() -> void: + get_tree().paused = false + get_tree().reload_current_scene() + +# ─── UI ─────────────────────────────────────────────────────────────────────── + +func _create_ui() -> void: + canvas = CanvasLayer.new() + canvas.process_mode = Node.PROCESS_MODE_ALWAYS + add_child(canvas) + + _make_hud() + _make_upgrade_panel() + _make_gameover_panel() + +func _make_hud() -> void: + # Score + score_label = _label(Vector2(12, 10), "Score: 0", 22) + # Wave + wave_label = _label(Vector2(12, 38), "Wave: 1", 22) + + # HP bar + _label(Vector2(12, 68), "HP", 16) + hp_bar_bg = _crect(Vector2(12, 88), Vector2(200, 16), Color(0.25, 0.04, 0.04)) + hp_bar = _crect(Vector2(12, 88), Vector2(200, 16), Color(0.9, 0.15, 0.15)) + + # Kill progress toward next upgrade + _label(Vector2(12, 110), "Next upgrade", 16) + progress_bg = _crect(Vector2(12, 130), Vector2(200, 10), Color(0.1, 0.1, 0.25)) + progress_bar = _crect(Vector2(12, 130), Vector2(0, 10), Color(0.4, 0.8, 1.0)) + +func _make_upgrade_panel() -> void: + upgrade_panel = Panel.new() + upgrade_panel.process_mode = Node.PROCESS_MODE_ALWAYS + upgrade_panel.visible = false + canvas.add_child(upgrade_panel) + + # Center with explicit anchors (420x300) + upgrade_panel.anchor_left = 0.5 + upgrade_panel.anchor_right = 0.5 + upgrade_panel.anchor_top = 0.5 + upgrade_panel.anchor_bottom = 0.5 + upgrade_panel.offset_left = -210.0 + upgrade_panel.offset_right = 210.0 + upgrade_panel.offset_top = -150.0 + upgrade_panel.offset_bottom = 150.0 + + var vbox := VBoxContainer.new() + vbox.name = "VBox" + vbox.set_anchors_and_offsets_preset(Control.PRESET_FULL_RECT) + vbox.add_theme_constant_override("separation", 12) + vbox.alignment = BoxContainer.ALIGNMENT_CENTER + upgrade_panel.add_child(vbox) + + var title := Label.new() + title.text = "LEVEL UP! Choose an upgrade:" + title.add_theme_font_size_override("font_size", 20) + title.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER + vbox.add_child(title) + + for i in range(3): + var btn := Button.new() + btn.name = "Btn%d" % i + btn.custom_minimum_size = Vector2(380, 60) + btn.add_theme_font_size_override("font_size", 16) + btn.process_mode = Node.PROCESS_MODE_ALWAYS + vbox.add_child(btn) + +func _make_gameover_panel() -> void: + gameover_panel = Panel.new() + gameover_panel.process_mode = Node.PROCESS_MODE_ALWAYS + gameover_panel.visible = false + canvas.add_child(gameover_panel) + + # Center with explicit anchors (360x240) + gameover_panel.anchor_left = 0.5 + gameover_panel.anchor_right = 0.5 + gameover_panel.anchor_top = 0.5 + gameover_panel.anchor_bottom = 0.5 + gameover_panel.offset_left = -180.0 + gameover_panel.offset_right = 180.0 + gameover_panel.offset_top = -120.0 + gameover_panel.offset_bottom = 120.0 + + var vbox := VBoxContainer.new() + vbox.name = "VBox" + vbox.set_anchors_and_offsets_preset(Control.PRESET_FULL_RECT) + vbox.alignment = BoxContainer.ALIGNMENT_CENTER + vbox.add_theme_constant_override("separation", 16) + gameover_panel.add_child(vbox) + + var title := Label.new() + title.text = "GAME OVER" + title.add_theme_font_size_override("font_size", 32) + title.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER + vbox.add_child(title) + + var score_lbl := Label.new() + score_lbl.name = "ScoreLabel" + score_lbl.add_theme_font_size_override("font_size", 20) + score_lbl.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER + vbox.add_child(score_lbl) + + var restart_btn := Button.new() + restart_btn.text = "Play Again" + restart_btn.add_theme_font_size_override("font_size", 18) + restart_btn.process_mode = Node.PROCESS_MODE_ALWAYS + restart_btn.connect("pressed", _restart) + vbox.add_child(restart_btn) + +# ─── UI helpers ─────────────────────────────────────────────────────────────── + +func _label(pos: Vector2, text: String, size: int) -> Label: + var lbl := Label.new() + lbl.position = pos + lbl.text = text + lbl.add_theme_font_size_override("font_size", size) + lbl.add_theme_color_override("font_color", Color.WHITE) + lbl.add_theme_color_override("font_shadow_color", Color(0, 0, 0, 0.8)) + lbl.add_theme_constant_override("shadow_offset_x", 2) + lbl.add_theme_constant_override("shadow_offset_y", 2) + canvas.add_child(lbl) + return lbl + +func _crect(pos: Vector2, sz: Vector2, col: Color) -> ColorRect: + var r := ColorRect.new() + r.position = pos + r.size = sz + r.color = col + canvas.add_child(r) + return r + +func _update_labels() -> void: + score_label.text = "Score: %d" % score + wave_label.text = "Wave: %d" % wave + +func _update_progress() -> void: + var t := float(kills) / float(kills_for_next) + progress_bar.size.x = 200.0 * t diff --git a/scripts/Main.gd.uid b/scripts/Main.gd.uid new file mode 100644 index 0000000..9e27e67 --- /dev/null +++ b/scripts/Main.gd.uid @@ -0,0 +1 @@ +uid://bjqcstgcoedos diff --git a/scripts/Player.gd b/scripts/Player.gd new file mode 100644 index 0000000..9de3a49 --- /dev/null +++ b/scripts/Player.gd @@ -0,0 +1,231 @@ +extends CharacterBody3D + +signal died +signal health_changed(current: int, maximum: int) + +@export var move_speed: float = 7.0 +@export var kick_range: float = 3.5 +@export var kick_force: float = 22.0 +@export var kick_cooldown: float = 0.6 +@export var kick_angle: float = 120.0 +@export var max_health: int = 100 + +var health: int = max_health +var kick_timer: float = 0.0 +var invincible_timer: float = 0.0 +var is_alive: bool = true +var last_move_dir: Vector3 = Vector3.FORWARD + +var mesh_node: MeshInstance3D +var player_mat: StandardMaterial3D +var indicator_node: MeshInstance3D +var indicator_mat: StandardMaterial3D + +const IFRAMES_DURATION := 0.6 +const BASE_COLOR := Color(0.2, 0.55, 1.0) + +func _ready() -> void: + add_to_group("player") + _build_visuals() + _build_collider() + +func _build_visuals() -> void: + mesh_node = MeshInstance3D.new() + var capsule := CapsuleMesh.new() + capsule.radius = 0.4 + capsule.height = 1.0 + mesh_node.mesh = capsule + mesh_node.position.y = 0.5 + player_mat = StandardMaterial3D.new() + player_mat.albedo_color = BASE_COLOR + player_mat.roughness = 0.6 + player_mat.metallic = 0.2 + mesh_node.material_override = player_mat + add_child(mesh_node) + + # Kick arc indicator (sector/fan mesh on floor) + indicator_node = MeshInstance3D.new() + indicator_node.mesh = _make_kick_arc_mesh() + indicator_node.position.y = 0.02 + indicator_mat = StandardMaterial3D.new() + indicator_mat.albedo_color = Color(1.0, 0.85, 0.1, 0.2) + indicator_mat.transparency = BaseMaterial3D.TRANSPARENCY_ALPHA + indicator_mat.shading_mode = BaseMaterial3D.SHADING_MODE_UNSHADED + indicator_mat.no_depth_test = true + indicator_mat.cull_mode = BaseMaterial3D.CULL_DISABLED + indicator_node.material_override = indicator_mat + add_child(indicator_node) + +func _make_kick_arc_mesh() -> ArrayMesh: + var verts := PackedVector3Array() + var half_rad: float = deg_to_rad(kick_angle * 0.5) + const SEGS := 24 + verts.append(Vector3(0.0, 0.0, 0.0)) + for i in range(SEGS + 1): + var t: float = float(i) / float(SEGS) + var a: float = lerpf(-half_rad, half_rad, t) + verts.append(Vector3(sin(a) * kick_range, 0.0, -cos(a) * kick_range)) + + var indices := PackedInt32Array() + for i in range(SEGS): + indices.append(0) + indices.append(i + 1) + indices.append(i + 2) + + var arrays: Array = [] + arrays.resize(Mesh.ARRAY_MAX) + arrays[Mesh.ARRAY_VERTEX] = verts + arrays[Mesh.ARRAY_INDEX] = indices + + var mesh := ArrayMesh.new() + mesh.add_surface_from_arrays(Mesh.PRIMITIVE_TRIANGLES, arrays) + return mesh + +func _build_collider() -> void: + var col := CollisionShape3D.new() + var shape := CapsuleShape3D.new() + shape.radius = 0.4 + shape.height = 1.0 + col.shape = shape + col.position.y = 0.5 + add_child(col) + +func _physics_process(delta: float) -> void: + if not is_alive: + return + + _handle_movement(delta) + _handle_kick(delta) + _handle_iframes(delta) + + if Input.is_action_just_pressed("ui_accept") and kick_timer <= 0.0: + _do_kick() + +func _handle_movement(delta: float) -> void: + var input_x: float = ( + float(Input.is_key_pressed(KEY_D) or Input.is_key_pressed(KEY_RIGHT)) - + float(Input.is_key_pressed(KEY_A) or Input.is_key_pressed(KEY_LEFT)) + ) + var input_z: float = ( + float(Input.is_key_pressed(KEY_S) or Input.is_key_pressed(KEY_DOWN)) - + float(Input.is_key_pressed(KEY_W) or Input.is_key_pressed(KEY_UP)) + ) + + # Camera-relative movement: camera is independent (mouse-controlled), no feedback loop + var cam := get_viewport().get_camera_3d() + if (abs(input_x) > 0.0 or abs(input_z) > 0.0) and cam != null: + var cam_fwd := -cam.global_transform.basis.z + cam_fwd.y = 0.0 + if cam_fwd.length() > 0.01: + cam_fwd = cam_fwd.normalized() + else: + cam_fwd = Vector3(0.0, 0.0, -1.0) + + var cam_right := cam.global_transform.basis.x + cam_right.y = 0.0 + if cam_right.length() > 0.01: + cam_right = cam_right.normalized() + else: + cam_right = Vector3(1.0, 0.0, 0.0) + + var move := cam_fwd * (-input_z) + cam_right * input_x + if move.length() > 0.01: + move = move.normalized() + velocity.x = move.x * move_speed + velocity.z = move.z * move_speed + last_move_dir = move + var target_y: float = atan2(-move.x, -move.z) + rotation.y = lerp_angle(rotation.y, target_y, 16.0 * delta) + else: + velocity.x = move_toward(velocity.x, 0.0, move_speed * 12.0 * delta) + velocity.z = move_toward(velocity.z, 0.0, move_speed * 12.0 * delta) + + velocity.y = 0.0 + move_and_slide() + +func _handle_kick(delta: float) -> void: + kick_timer = max(0.0, kick_timer - delta) + var t: float = clamp(1.0 - kick_timer / kick_cooldown, 0.0, 1.0) + indicator_mat.albedo_color.a = 0.05 + t * 0.3 + +func _handle_iframes(delta: float) -> void: + if invincible_timer > 0.0: + invincible_timer -= delta + if invincible_timer > 0.0: + mesh_node.visible = fmod(invincible_timer * 10.0, 1.0) > 0.5 + else: + mesh_node.visible = true + +func _do_kick() -> void: + kick_timer = kick_cooldown + + var forward := -global_transform.basis.z + forward.y = 0.0 + if forward.length() > 0.01: + forward = forward.normalized() + else: + forward = Vector3(0, 0, -1) + + var half_cos: float = cos(deg_to_rad(kick_angle * 0.5)) + + var enemies := get_tree().get_nodes_in_group("enemies") + var kicked_any := false + for e in enemies: + if not is_instance_valid(e): + continue + var en := e as Node3D + if en == null: + continue + var diff := en.global_position - global_position + diff.y = 0.0 + var dist := diff.length() + if dist < 0.1 or dist > kick_range: + continue + var dir_to_enemy := diff / dist + if dir_to_enemy.dot(forward) >= half_cos: + en.call("receive_kick", dir_to_enemy, kick_force) + kicked_any = true + + if kicked_any: + _squish_effect() + +func _squish_effect() -> void: + var tw := create_tween() + tw.tween_property(mesh_node, "scale", Vector3(1.3, 0.55, 1.3), 0.07) + tw.tween_property(mesh_node, "scale", Vector3(1.0, 1.0, 1.0), 0.18) + +func take_damage(amount: int) -> void: + if not is_alive or invincible_timer > 0.0: + return + invincible_timer = IFRAMES_DURATION + health = max(0, health - amount) + emit_signal("health_changed", health, max_health) + + var tw := create_tween() + tw.tween_property(player_mat, "albedo_color", Color.RED, 0.08) + tw.tween_property(player_mat, "albedo_color", BASE_COLOR, 0.25) + + if health <= 0: + _die() + +func _die() -> void: + is_alive = false + emit_signal("died") + var tw := create_tween() + tw.tween_property(self, "scale", Vector3(2.0, 0.0, 2.0), 0.35) + +func apply_upgrade(id: String) -> void: + match id: + "kick_force": + kick_force += 6.0 + "kick_range": + kick_range += 0.7 + indicator_node.mesh = _make_kick_arc_mesh() + "kick_cooldown": + kick_cooldown = max(0.12, kick_cooldown - 0.09) + "move_speed": + move_speed += 1.2 + "max_health": + max_health += 30 + health = min(health + 30, max_health) + emit_signal("health_changed", health, max_health) diff --git a/scripts/Player.gd.uid b/scripts/Player.gd.uid new file mode 100644 index 0000000..09db6bf --- /dev/null +++ b/scripts/Player.gd.uid @@ -0,0 +1 @@ +uid://beqb88qvr2lk0