aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.gitignore1
-rw-r--r--cargo0
-rw-r--r--godot/assets/fonts/format.otfbin0 -> 18820 bytes
-rw-r--r--godot/assets/fonts/format.tres7
-rw-r--r--godot/assets/game_objects/W8.gltf.import1068
-rw-r--r--godot/assets/game_objects/_defaultMat(Clone).materialbin755 -> 129 bytes
-rw-r--r--godot/assets/game_objects/asphalt(Clone).materialbin1638 -> 129 bytes
-rw-r--r--godot/assets/game_objects/asphaltEdge(Clone).materialbin1646 -> 129 bytes
-rw-r--r--godot/assets/game_objects/border(Clone).materialbin1636 -> 129 bytes
-rw-r--r--godot/assets/game_objects/bricks(Clone).materialbin1636 -> 129 bytes
-rw-r--r--godot/assets/game_objects/colorPurple(Clone).materialbin1646 -> 129 bytes
-rw-r--r--godot/assets/game_objects/colorRed(Clone).materialbin1640 -> 129 bytes
-rw-r--r--godot/assets/game_objects/colorWhite(Clone).materialbin1620 -> 129 bytes
-rw-r--r--godot/assets/game_objects/colorYellow(Clone).materialbin1646 -> 129 bytes
-rw-r--r--godot/assets/game_objects/cone(Clone).materialbin1632 -> 129 bytes
-rw-r--r--godot/assets/game_objects/diceGolf_track1.glb.import3
-rw-r--r--godot/assets/game_objects/door(Clone).materialbin1632 -> 129 bytes
-rw-r--r--godot/assets/game_objects/glass(Clone).material4
-rw-r--r--godot/assets/game_objects/grass(Clone).materialbin1634 -> 129 bytes
-rw-r--r--godot/assets/game_objects/leafsDark(Clone).materialbin1642 -> 129 bytes
-rw-r--r--godot/assets/game_objects/line(Clone).materialbin1632 -> 129 bytes
-rw-r--r--godot/assets/game_objects/metalOrange(Clone).materialbin1658 -> 129 bytes
-rw-r--r--godot/assets/game_objects/pavement(Clone).materialbin1640 -> 129 bytes
-rw-r--r--godot/assets/game_objects/roof(Clone).materialbin1632 -> 129 bytes
-rw-r--r--godot/assets/game_objects/steel(Clone).materialbin1646 -> 129 bytes
-rw-r--r--godot/assets/game_objects/stone(Clone).materialbin1634 -> 129 bytes
-rw-r--r--godot/assets/game_objects/stoneDark(Clone).materialbin1642 -> 129 bytes
-rw-r--r--godot/assets/game_objects/stoneLight(Clone).material4
-rw-r--r--godot/assets/game_objects/trim(Clone).materialbin1632 -> 129 bytes
-rw-r--r--godot/assets/game_objects/window(Clone).materialbin1636 -> 129 bytes
-rw-r--r--godot/assets/game_objects/woodBarkDark(Clone).materialbin1648 -> 129 bytes
-rw-r--r--godot/assets/sounds/Uuhhh.mp3bin2212 -> 0 bytes
-rw-r--r--godot/assets/sounds/Uuhhh.mp3.import18
-rw-r--r--godot/assets/sounds/bgm.mp33
-rw-r--r--godot/assets/sounds/bgm.mp3.import3
-rw-r--r--godot/assets/sounds/main_menu.mp33
-rw-r--r--godot/assets/sounds/main_menu.mp3.import3
-rw-r--r--godot/assets/textures/grass-texture-26.jpg.import40
-rw-r--r--godot/assets/textures/sandstone-brick-wall-texture.jpg.import40
-rw-r--r--godot/assets/theme.tres47
-rw-r--r--godot/native/BasicDie.gdns8
-rw-r--r--godot/native/GoalTriggerBox.gdns8
-rw-r--r--godot/native/game.gdnlib6
-rw-r--r--godot/project.godot24
-rw-r--r--godot/scenes/Die.gd130
-rw-r--r--godot/scenes/Die.tscn60
-rw-r--r--godot/scenes/Game.gd87
-rw-r--r--godot/scenes/Game.tscn76
-rw-r--r--godot/scenes/Menu.gd25
-rw-r--r--godot/scenes/Menu.tscn47
-rw-r--r--godot/scenes/levels/GoalTriggerZone.tscn14
-rw-r--r--godot/scenes/levels/test_scene/TestScene.tscn11
-rw-r--r--godot/scenes/levels/test_scene_movement/Floor.tscn22
-rw-r--r--godot/scenes/levels/test_scene_movement/TestSceneMovement.tscn31
-rw-r--r--godot/scenes/levels/test_scene_movement/Wall.tscn23
-rw-r--r--godot/scenes/levels/test_scene_uuuhhh/TestSceneUuuhhh.tscn2
-rw-r--r--godot/scenes/objects/Camera.tscn10
-rw-r--r--godot/scenes/objects/Player.tscn18
-rw-r--r--godot/scenes/objects/Scoreboard.gd22
-rw-r--r--godot/scenes/objects/Scoreboard.tscn433
-rw-r--r--godot/scenes/objects/W8.tscn21
-rw-r--r--godot/scenes/objects/old/Die.tscn11
-rw-r--r--godot/scenes/scripts/roblox-cube.gd22
-rw-r--r--godot/scripts/GoalTriggerBox.gd22
-rw-r--r--lib/x86_64-pc-windows-msvc/code_with_your_friends2022.dllbin0 -> 578048 bytes
-rwxr-xr-xlib/x86_64-unknown-linux-gnu/libcode_with_your_friends2022.sobin25714184 -> 30387968 bytes
-rw-r--r--rust/src/basic_die.rs402
-rw-r--r--rust/src/buff_ball.rs91
-rw-r--r--rust/src/buff_bounce.rs52
-rw-r--r--rust/src/buff_extra.rs4
-rw-r--r--rust/src/buff_phase.rs27
-rw-r--r--rust/src/game.rs46
-rw-r--r--rust/src/goal_trigger.rs30
-rw-r--r--rust/src/lib.rs14
-rw-r--r--rust/src/spinning_cube.rs58
-rw-r--r--rust/src/test.rs58
76 files changed, 1684 insertions, 1475 deletions
diff --git a/.gitignore b/.gitignore
index 5146acf..c0cdeaa 100644
--- a/.gitignore
+++ b/.gitignore
@@ -34,3 +34,4 @@ rust/Cargo.lock
rust/debug/
target/
tramp
+make.bat
diff --git a/cargo b/cargo
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/cargo
diff --git a/godot/assets/fonts/format.otf b/godot/assets/fonts/format.otf
new file mode 100644
index 0000000..129be34
--- /dev/null
+++ b/godot/assets/fonts/format.otf
Binary files differ
diff --git a/godot/assets/fonts/format.tres b/godot/assets/fonts/format.tres
new file mode 100644
index 0000000..9020d9c
--- /dev/null
+++ b/godot/assets/fonts/format.tres
@@ -0,0 +1,7 @@
+[gd_resource type="DynamicFont" load_steps=2 format=2]
+
+[ext_resource path="res://assets/fonts/format.otf" type="DynamicFontData" id=1]
+
+[resource]
+size = 50
+font_data = ExtResource( 1 )
diff --git a/godot/assets/game_objects/W8.gltf.import b/godot/assets/game_objects/W8.gltf.import
index 5927656..f578268 100644
--- a/godot/assets/game_objects/W8.gltf.import
+++ b/godot/assets/game_objects/W8.gltf.import
@@ -1,1065 +1,3 @@
-[remap]
-
-importer="scene"
-type="PackedScene"
-path="res://.import/W8.gltf-131bd1b69ba26b8b06eb65df084f0320.scn"
-
-[deps]
-
-source_file="res://assets/game_objects/W8.gltf"
-dest_files=[ "res://.import/W8.gltf-131bd1b69ba26b8b06eb65df084f0320.scn" ]
-
-[params]
-
-nodes/root_type="Spatial"
-nodes/root_name="Scene Root"
-nodes/root_scale=1.0
-nodes/custom_script=""
-nodes/storage=0
-nodes/use_legacy_names=false
-materials/location=1
-materials/storage=1
-materials/keep_on_reimport=true
-meshes/octahedral_compression=true
-meshes/compress=4286
-meshes/ensure_tangents=true
-meshes/storage=0
-meshes/light_baking=0
-meshes/lightmap_texel_size=0.1
-skins/use_named_skins=true
-external_files/store_in_subdir=false
-animation/import=true
-animation/fps=15
-animation/filter_script=""
-animation/storage=false
-animation/keep_custom_tracks=false
-animation/optimizer/enabled=true
-animation/optimizer/max_linear_error=0.05
-animation/optimizer/max_angular_error=0.01
-animation/optimizer/max_angle=22
-animation/optimizer/remove_unused_tracks=true
-animation/clips/amount=0
-animation/clip_1/name=""
-animation/clip_1/start_frame=0
-animation/clip_1/end_frame=0
-animation/clip_1/loops=false
-animation/clip_2/name=""
-animation/clip_2/start_frame=0
-animation/clip_2/end_frame=0
-animation/clip_2/loops=false
-animation/clip_3/name=""
-animation/clip_3/start_frame=0
-animation/clip_3/end_frame=0
-animation/clip_3/loops=false
-animation/clip_4/name=""
-animation/clip_4/start_frame=0
-animation/clip_4/end_frame=0
-animation/clip_4/loops=false
-animation/clip_5/name=""
-animation/clip_5/start_frame=0
-animation/clip_5/end_frame=0
-animation/clip_5/loops=false
-animation/clip_6/name=""
-animation/clip_6/start_frame=0
-animation/clip_6/end_frame=0
-animation/clip_6/loops=false
-animation/clip_7/name=""
-animation/clip_7/start_frame=0
-animation/clip_7/end_frame=0
-animation/clip_7/loops=false
-animation/clip_8/name=""
-animation/clip_8/start_frame=0
-animation/clip_8/end_frame=0
-animation/clip_8/loops=false
-animation/clip_9/name=""
-animation/clip_9/start_frame=0
-animation/clip_9/end_frame=0
-animation/clip_9/loops=false
-animation/clip_10/name=""
-animation/clip_10/start_frame=0
-animation/clip_10/end_frame=0
-animation/clip_10/loops=false
-animation/clip_11/name=""
-animation/clip_11/start_frame=0
-animation/clip_11/end_frame=0
-animation/clip_11/loops=false
-animation/clip_12/name=""
-animation/clip_12/start_frame=0
-animation/clip_12/end_frame=0
-animation/clip_12/loops=false
-animation/clip_13/name=""
-animation/clip_13/start_frame=0
-animation/clip_13/end_frame=0
-animation/clip_13/loops=false
-animation/clip_14/name=""
-animation/clip_14/start_frame=0
-animation/clip_14/end_frame=0
-animation/clip_14/loops=false
-animation/clip_15/name=""
-animation/clip_15/start_frame=0
-animation/clip_15/end_frame=0
-animation/clip_15/loops=false
-animation/clip_16/name=""
-animation/clip_16/start_frame=0
-animation/clip_16/end_frame=0
-animation/clip_16/loops=false
-animation/clip_17/name=""
-animation/clip_17/start_frame=0
-animation/clip_17/end_frame=0
-animation/clip_17/loops=false
-animation/clip_18/name=""
-animation/clip_18/start_frame=0
-animation/clip_18/end_frame=0
-animation/clip_18/loops=false
-animation/clip_19/name=""
-animation/clip_19/start_frame=0
-animation/clip_19/end_frame=0
-animation/clip_19/loops=false
-animation/clip_20/name=""
-animation/clip_20/start_frame=0
-animation/clip_20/end_frame=0
-animation/clip_20/loops=false
-animation/clip_21/name=""
-animation/clip_21/start_frame=0
-animation/clip_21/end_frame=0
-animation/clip_21/loops=false
-animation/clip_22/name=""
-animation/clip_22/start_frame=0
-animation/clip_22/end_frame=0
-animation/clip_22/loops=false
-animation/clip_23/name=""
-animation/clip_23/start_frame=0
-animation/clip_23/end_frame=0
-animation/clip_23/loops=false
-animation/clip_24/name=""
-animation/clip_24/start_frame=0
-animation/clip_24/end_frame=0
-animation/clip_24/loops=false
-animation/clip_25/name=""
-animation/clip_25/start_frame=0
-animation/clip_25/end_frame=0
-animation/clip_25/loops=false
-animation/clip_26/name=""
-animation/clip_26/start_frame=0
-animation/clip_26/end_frame=0
-animation/clip_26/loops=false
-animation/clip_27/name=""
-animation/clip_27/start_frame=0
-animation/clip_27/end_frame=0
-animation/clip_27/loops=false
-animation/clip_28/name=""
-animation/clip_28/start_frame=0
-animation/clip_28/end_frame=0
-animation/clip_28/loops=false
-animation/clip_29/name=""
-animation/clip_29/start_frame=0
-animation/clip_29/end_frame=0
-animation/clip_29/loops=false
-animation/clip_30/name=""
-animation/clip_30/start_frame=0
-animation/clip_30/end_frame=0
-animation/clip_30/loops=false
-animation/clip_31/name=""
-animation/clip_31/start_frame=0
-animation/clip_31/end_frame=0
-animation/clip_31/loops=false
-animation/clip_32/name=""
-animation/clip_32/start_frame=0
-animation/clip_32/end_frame=0
-animation/clip_32/loops=false
-animation/clip_33/name=""
-animation/clip_33/start_frame=0
-animation/clip_33/end_frame=0
-animation/clip_33/loops=false
-animation/clip_34/name=""
-animation/clip_34/start_frame=0
-animation/clip_34/end_frame=0
-animation/clip_34/loops=false
-animation/clip_35/name=""
-animation/clip_35/start_frame=0
-animation/clip_35/end_frame=0
-animation/clip_35/loops=false
-animation/clip_36/name=""
-animation/clip_36/start_frame=0
-animation/clip_36/end_frame=0
-animation/clip_36/loops=false
-animation/clip_37/name=""
-animation/clip_37/start_frame=0
-animation/clip_37/end_frame=0
-animation/clip_37/loops=false
-animation/clip_38/name=""
-animation/clip_38/start_frame=0
-animation/clip_38/end_frame=0
-animation/clip_38/loops=false
-animation/clip_39/name=""
-animation/clip_39/start_frame=0
-animation/clip_39/end_frame=0
-animation/clip_39/loops=false
-animation/clip_40/name=""
-animation/clip_40/start_frame=0
-animation/clip_40/end_frame=0
-animation/clip_40/loops=false
-animation/clip_41/name=""
-animation/clip_41/start_frame=0
-animation/clip_41/end_frame=0
-animation/clip_41/loops=false
-animation/clip_42/name=""
-animation/clip_42/start_frame=0
-animation/clip_42/end_frame=0
-animation/clip_42/loops=false
-animation/clip_43/name=""
-animation/clip_43/start_frame=0
-animation/clip_43/end_frame=0
-animation/clip_43/loops=false
-animation/clip_44/name=""
-animation/clip_44/start_frame=0
-animation/clip_44/end_frame=0
-animation/clip_44/loops=false
-animation/clip_45/name=""
-animation/clip_45/start_frame=0
-animation/clip_45/end_frame=0
-animation/clip_45/loops=false
-animation/clip_46/name=""
-animation/clip_46/start_frame=0
-animation/clip_46/end_frame=0
-animation/clip_46/loops=false
-animation/clip_47/name=""
-animation/clip_47/start_frame=0
-animation/clip_47/end_frame=0
-animation/clip_47/loops=false
-animation/clip_48/name=""
-animation/clip_48/start_frame=0
-animation/clip_48/end_frame=0
-animation/clip_48/loops=false
-animation/clip_49/name=""
-animation/clip_49/start_frame=0
-animation/clip_49/end_frame=0
-animation/clip_49/loops=false
-animation/clip_50/name=""
-animation/clip_50/start_frame=0
-animation/clip_50/end_frame=0
-animation/clip_50/loops=false
-animation/clip_51/name=""
-animation/clip_51/start_frame=0
-animation/clip_51/end_frame=0
-animation/clip_51/loops=false
-animation/clip_52/name=""
-animation/clip_52/start_frame=0
-animation/clip_52/end_frame=0
-animation/clip_52/loops=false
-animation/clip_53/name=""
-animation/clip_53/start_frame=0
-animation/clip_53/end_frame=0
-animation/clip_53/loops=false
-animation/clip_54/name=""
-animation/clip_54/start_frame=0
-animation/clip_54/end_frame=0
-animation/clip_54/loops=false
-animation/clip_55/name=""
-animation/clip_55/start_frame=0
-animation/clip_55/end_frame=0
-animation/clip_55/loops=false
-animation/clip_56/name=""
-animation/clip_56/start_frame=0
-animation/clip_56/end_frame=0
-animation/clip_56/loops=false
-animation/clip_57/name=""
-animation/clip_57/start_frame=0
-animation/clip_57/end_frame=0
-animation/clip_57/loops=false
-animation/clip_58/name=""
-animation/clip_58/start_frame=0
-animation/clip_58/end_frame=0
-animation/clip_58/loops=false
-animation/clip_59/name=""
-animation/clip_59/start_frame=0
-animation/clip_59/end_frame=0
-animation/clip_59/loops=false
-animation/clip_60/name=""
-animation/clip_60/start_frame=0
-animation/clip_60/end_frame=0
-animation/clip_60/loops=false
-animation/clip_61/name=""
-animation/clip_61/start_frame=0
-animation/clip_61/end_frame=0
-animation/clip_61/loops=false
-animation/clip_62/name=""
-animation/clip_62/start_frame=0
-animation/clip_62/end_frame=0
-animation/clip_62/loops=false
-animation/clip_63/name=""
-animation/clip_63/start_frame=0
-animation/clip_63/end_frame=0
-animation/clip_63/loops=false
-animation/clip_64/name=""
-animation/clip_64/start_frame=0
-animation/clip_64/end_frame=0
-animation/clip_64/loops=false
-animation/clip_65/name=""
-animation/clip_65/start_frame=0
-animation/clip_65/end_frame=0
-animation/clip_65/loops=false
-animation/clip_66/name=""
-animation/clip_66/start_frame=0
-animation/clip_66/end_frame=0
-animation/clip_66/loops=false
-animation/clip_67/name=""
-animation/clip_67/start_frame=0
-animation/clip_67/end_frame=0
-animation/clip_67/loops=false
-animation/clip_68/name=""
-animation/clip_68/start_frame=0
-animation/clip_68/end_frame=0
-animation/clip_68/loops=false
-animation/clip_69/name=""
-animation/clip_69/start_frame=0
-animation/clip_69/end_frame=0
-animation/clip_69/loops=false
-animation/clip_70/name=""
-animation/clip_70/start_frame=0
-animation/clip_70/end_frame=0
-animation/clip_70/loops=false
-animation/clip_71/name=""
-animation/clip_71/start_frame=0
-animation/clip_71/end_frame=0
-animation/clip_71/loops=false
-animation/clip_72/name=""
-animation/clip_72/start_frame=0
-animation/clip_72/end_frame=0
-animation/clip_72/loops=false
-animation/clip_73/name=""
-animation/clip_73/start_frame=0
-animation/clip_73/end_frame=0
-animation/clip_73/loops=false
-animation/clip_74/name=""
-animation/clip_74/start_frame=0
-animation/clip_74/end_frame=0
-animation/clip_74/loops=false
-animation/clip_75/name=""
-animation/clip_75/start_frame=0
-animation/clip_75/end_frame=0
-animation/clip_75/loops=false
-animation/clip_76/name=""
-animation/clip_76/start_frame=0
-animation/clip_76/end_frame=0
-animation/clip_76/loops=false
-animation/clip_77/name=""
-animation/clip_77/start_frame=0
-animation/clip_77/end_frame=0
-animation/clip_77/loops=false
-animation/clip_78/name=""
-animation/clip_78/start_frame=0
-animation/clip_78/end_frame=0
-animation/clip_78/loops=false
-animation/clip_79/name=""
-animation/clip_79/start_frame=0
-animation/clip_79/end_frame=0
-animation/clip_79/loops=false
-animation/clip_80/name=""
-animation/clip_80/start_frame=0
-animation/clip_80/end_frame=0
-animation/clip_80/loops=false
-animation/clip_81/name=""
-animation/clip_81/start_frame=0
-animation/clip_81/end_frame=0
-animation/clip_81/loops=false
-animation/clip_82/name=""
-animation/clip_82/start_frame=0
-animation/clip_82/end_frame=0
-animation/clip_82/loops=false
-animation/clip_83/name=""
-animation/clip_83/start_frame=0
-animation/clip_83/end_frame=0
-animation/clip_83/loops=false
-animation/clip_84/name=""
-animation/clip_84/start_frame=0
-animation/clip_84/end_frame=0
-animation/clip_84/loops=false
-animation/clip_85/name=""
-animation/clip_85/start_frame=0
-animation/clip_85/end_frame=0
-animation/clip_85/loops=false
-animation/clip_86/name=""
-animation/clip_86/start_frame=0
-animation/clip_86/end_frame=0
-animation/clip_86/loops=false
-animation/clip_87/name=""
-animation/clip_87/start_frame=0
-animation/clip_87/end_frame=0
-animation/clip_87/loops=false
-animation/clip_88/name=""
-animation/clip_88/start_frame=0
-animation/clip_88/end_frame=0
-animation/clip_88/loops=false
-animation/clip_89/name=""
-animation/clip_89/start_frame=0
-animation/clip_89/end_frame=0
-animation/clip_89/loops=false
-animation/clip_90/name=""
-animation/clip_90/start_frame=0
-animation/clip_90/end_frame=0
-animation/clip_90/loops=false
-animation/clip_91/name=""
-animation/clip_91/start_frame=0
-animation/clip_91/end_frame=0
-animation/clip_91/loops=false
-animation/clip_92/name=""
-animation/clip_92/start_frame=0
-animation/clip_92/end_frame=0
-animation/clip_92/loops=false
-animation/clip_93/name=""
-animation/clip_93/start_frame=0
-animation/clip_93/end_frame=0
-animation/clip_93/loops=false
-animation/clip_94/name=""
-animation/clip_94/start_frame=0
-animation/clip_94/end_frame=0
-animation/clip_94/loops=false
-animation/clip_95/name=""
-animation/clip_95/start_frame=0
-animation/clip_95/end_frame=0
-animation/clip_95/loops=false
-animation/clip_96/name=""
-animation/clip_96/start_frame=0
-animation/clip_96/end_frame=0
-animation/clip_96/loops=false
-animation/clip_97/name=""
-animation/clip_97/start_frame=0
-animation/clip_97/end_frame=0
-animation/clip_97/loops=false
-animation/clip_98/name=""
-animation/clip_98/start_frame=0
-animation/clip_98/end_frame=0
-animation/clip_98/loops=false
-animation/clip_99/name=""
-animation/clip_99/start_frame=0
-animation/clip_99/end_frame=0
-animation/clip_99/loops=false
-animation/clip_100/name=""
-animation/clip_100/start_frame=0
-animation/clip_100/end_frame=0
-animation/clip_100/loops=false
-animation/clip_101/name=""
-animation/clip_101/start_frame=0
-animation/clip_101/end_frame=0
-animation/clip_101/loops=false
-animation/clip_102/name=""
-animation/clip_102/start_frame=0
-animation/clip_102/end_frame=0
-animation/clip_102/loops=false
-animation/clip_103/name=""
-animation/clip_103/start_frame=0
-animation/clip_103/end_frame=0
-animation/clip_103/loops=false
-animation/clip_104/name=""
-animation/clip_104/start_frame=0
-animation/clip_104/end_frame=0
-animation/clip_104/loops=false
-animation/clip_105/name=""
-animation/clip_105/start_frame=0
-animation/clip_105/end_frame=0
-animation/clip_105/loops=false
-animation/clip_106/name=""
-animation/clip_106/start_frame=0
-animation/clip_106/end_frame=0
-animation/clip_106/loops=false
-animation/clip_107/name=""
-animation/clip_107/start_frame=0
-animation/clip_107/end_frame=0
-animation/clip_107/loops=false
-animation/clip_108/name=""
-animation/clip_108/start_frame=0
-animation/clip_108/end_frame=0
-animation/clip_108/loops=false
-animation/clip_109/name=""
-animation/clip_109/start_frame=0
-animation/clip_109/end_frame=0
-animation/clip_109/loops=false
-animation/clip_110/name=""
-animation/clip_110/start_frame=0
-animation/clip_110/end_frame=0
-animation/clip_110/loops=false
-animation/clip_111/name=""
-animation/clip_111/start_frame=0
-animation/clip_111/end_frame=0
-animation/clip_111/loops=false
-animation/clip_112/name=""
-animation/clip_112/start_frame=0
-animation/clip_112/end_frame=0
-animation/clip_112/loops=false
-animation/clip_113/name=""
-animation/clip_113/start_frame=0
-animation/clip_113/end_frame=0
-animation/clip_113/loops=false
-animation/clip_114/name=""
-animation/clip_114/start_frame=0
-animation/clip_114/end_frame=0
-animation/clip_114/loops=false
-animation/clip_115/name=""
-animation/clip_115/start_frame=0
-animation/clip_115/end_frame=0
-animation/clip_115/loops=false
-animation/clip_116/name=""
-animation/clip_116/start_frame=0
-animation/clip_116/end_frame=0
-animation/clip_116/loops=false
-animation/clip_117/name=""
-animation/clip_117/start_frame=0
-animation/clip_117/end_frame=0
-animation/clip_117/loops=false
-animation/clip_118/name=""
-animation/clip_118/start_frame=0
-animation/clip_118/end_frame=0
-animation/clip_118/loops=false
-animation/clip_119/name=""
-animation/clip_119/start_frame=0
-animation/clip_119/end_frame=0
-animation/clip_119/loops=false
-animation/clip_120/name=""
-animation/clip_120/start_frame=0
-animation/clip_120/end_frame=0
-animation/clip_120/loops=false
-animation/clip_121/name=""
-animation/clip_121/start_frame=0
-animation/clip_121/end_frame=0
-animation/clip_121/loops=false
-animation/clip_122/name=""
-animation/clip_122/start_frame=0
-animation/clip_122/end_frame=0
-animation/clip_122/loops=false
-animation/clip_123/name=""
-animation/clip_123/start_frame=0
-animation/clip_123/end_frame=0
-animation/clip_123/loops=false
-animation/clip_124/name=""
-animation/clip_124/start_frame=0
-animation/clip_124/end_frame=0
-animation/clip_124/loops=false
-animation/clip_125/name=""
-animation/clip_125/start_frame=0
-animation/clip_125/end_frame=0
-animation/clip_125/loops=false
-animation/clip_126/name=""
-animation/clip_126/start_frame=0
-animation/clip_126/end_frame=0
-animation/clip_126/loops=false
-animation/clip_127/name=""
-animation/clip_127/start_frame=0
-animation/clip_127/end_frame=0
-animation/clip_127/loops=false
-animation/clip_128/name=""
-animation/clip_128/start_frame=0
-animation/clip_128/end_frame=0
-animation/clip_128/loops=false
-animation/clip_129/name=""
-animation/clip_129/start_frame=0
-animation/clip_129/end_frame=0
-animation/clip_129/loops=false
-animation/clip_130/name=""
-animation/clip_130/start_frame=0
-animation/clip_130/end_frame=0
-animation/clip_130/loops=false
-animation/clip_131/name=""
-animation/clip_131/start_frame=0
-animation/clip_131/end_frame=0
-animation/clip_131/loops=false
-animation/clip_132/name=""
-animation/clip_132/start_frame=0
-animation/clip_132/end_frame=0
-animation/clip_132/loops=false
-animation/clip_133/name=""
-animation/clip_133/start_frame=0
-animation/clip_133/end_frame=0
-animation/clip_133/loops=false
-animation/clip_134/name=""
-animation/clip_134/start_frame=0
-animation/clip_134/end_frame=0
-animation/clip_134/loops=false
-animation/clip_135/name=""
-animation/clip_135/start_frame=0
-animation/clip_135/end_frame=0
-animation/clip_135/loops=false
-animation/clip_136/name=""
-animation/clip_136/start_frame=0
-animation/clip_136/end_frame=0
-animation/clip_136/loops=false
-animation/clip_137/name=""
-animation/clip_137/start_frame=0
-animation/clip_137/end_frame=0
-animation/clip_137/loops=false
-animation/clip_138/name=""
-animation/clip_138/start_frame=0
-animation/clip_138/end_frame=0
-animation/clip_138/loops=false
-animation/clip_139/name=""
-animation/clip_139/start_frame=0
-animation/clip_139/end_frame=0
-animation/clip_139/loops=false
-animation/clip_140/name=""
-animation/clip_140/start_frame=0
-animation/clip_140/end_frame=0
-animation/clip_140/loops=false
-animation/clip_141/name=""
-animation/clip_141/start_frame=0
-animation/clip_141/end_frame=0
-animation/clip_141/loops=false
-animation/clip_142/name=""
-animation/clip_142/start_frame=0
-animation/clip_142/end_frame=0
-animation/clip_142/loops=false
-animation/clip_143/name=""
-animation/clip_143/start_frame=0
-animation/clip_143/end_frame=0
-animation/clip_143/loops=false
-animation/clip_144/name=""
-animation/clip_144/start_frame=0
-animation/clip_144/end_frame=0
-animation/clip_144/loops=false
-animation/clip_145/name=""
-animation/clip_145/start_frame=0
-animation/clip_145/end_frame=0
-animation/clip_145/loops=false
-animation/clip_146/name=""
-animation/clip_146/start_frame=0
-animation/clip_146/end_frame=0
-animation/clip_146/loops=false
-animation/clip_147/name=""
-animation/clip_147/start_frame=0
-animation/clip_147/end_frame=0
-animation/clip_147/loops=false
-animation/clip_148/name=""
-animation/clip_148/start_frame=0
-animation/clip_148/end_frame=0
-animation/clip_148/loops=false
-animation/clip_149/name=""
-animation/clip_149/start_frame=0
-animation/clip_149/end_frame=0
-animation/clip_149/loops=false
-animation/clip_150/name=""
-animation/clip_150/start_frame=0
-animation/clip_150/end_frame=0
-animation/clip_150/loops=false
-animation/clip_151/name=""
-animation/clip_151/start_frame=0
-animation/clip_151/end_frame=0
-animation/clip_151/loops=false
-animation/clip_152/name=""
-animation/clip_152/start_frame=0
-animation/clip_152/end_frame=0
-animation/clip_152/loops=false
-animation/clip_153/name=""
-animation/clip_153/start_frame=0
-animation/clip_153/end_frame=0
-animation/clip_153/loops=false
-animation/clip_154/name=""
-animation/clip_154/start_frame=0
-animation/clip_154/end_frame=0
-animation/clip_154/loops=false
-animation/clip_155/name=""
-animation/clip_155/start_frame=0
-animation/clip_155/end_frame=0
-animation/clip_155/loops=false
-animation/clip_156/name=""
-animation/clip_156/start_frame=0
-animation/clip_156/end_frame=0
-animation/clip_156/loops=false
-animation/clip_157/name=""
-animation/clip_157/start_frame=0
-animation/clip_157/end_frame=0
-animation/clip_157/loops=false
-animation/clip_158/name=""
-animation/clip_158/start_frame=0
-animation/clip_158/end_frame=0
-animation/clip_158/loops=false
-animation/clip_159/name=""
-animation/clip_159/start_frame=0
-animation/clip_159/end_frame=0
-animation/clip_159/loops=false
-animation/clip_160/name=""
-animation/clip_160/start_frame=0
-animation/clip_160/end_frame=0
-animation/clip_160/loops=false
-animation/clip_161/name=""
-animation/clip_161/start_frame=0
-animation/clip_161/end_frame=0
-animation/clip_161/loops=false
-animation/clip_162/name=""
-animation/clip_162/start_frame=0
-animation/clip_162/end_frame=0
-animation/clip_162/loops=false
-animation/clip_163/name=""
-animation/clip_163/start_frame=0
-animation/clip_163/end_frame=0
-animation/clip_163/loops=false
-animation/clip_164/name=""
-animation/clip_164/start_frame=0
-animation/clip_164/end_frame=0
-animation/clip_164/loops=false
-animation/clip_165/name=""
-animation/clip_165/start_frame=0
-animation/clip_165/end_frame=0
-animation/clip_165/loops=false
-animation/clip_166/name=""
-animation/clip_166/start_frame=0
-animation/clip_166/end_frame=0
-animation/clip_166/loops=false
-animation/clip_167/name=""
-animation/clip_167/start_frame=0
-animation/clip_167/end_frame=0
-animation/clip_167/loops=false
-animation/clip_168/name=""
-animation/clip_168/start_frame=0
-animation/clip_168/end_frame=0
-animation/clip_168/loops=false
-animation/clip_169/name=""
-animation/clip_169/start_frame=0
-animation/clip_169/end_frame=0
-animation/clip_169/loops=false
-animation/clip_170/name=""
-animation/clip_170/start_frame=0
-animation/clip_170/end_frame=0
-animation/clip_170/loops=false
-animation/clip_171/name=""
-animation/clip_171/start_frame=0
-animation/clip_171/end_frame=0
-animation/clip_171/loops=false
-animation/clip_172/name=""
-animation/clip_172/start_frame=0
-animation/clip_172/end_frame=0
-animation/clip_172/loops=false
-animation/clip_173/name=""
-animation/clip_173/start_frame=0
-animation/clip_173/end_frame=0
-animation/clip_173/loops=false
-animation/clip_174/name=""
-animation/clip_174/start_frame=0
-animation/clip_174/end_frame=0
-animation/clip_174/loops=false
-animation/clip_175/name=""
-animation/clip_175/start_frame=0
-animation/clip_175/end_frame=0
-animation/clip_175/loops=false
-animation/clip_176/name=""
-animation/clip_176/start_frame=0
-animation/clip_176/end_frame=0
-animation/clip_176/loops=false
-animation/clip_177/name=""
-animation/clip_177/start_frame=0
-animation/clip_177/end_frame=0
-animation/clip_177/loops=false
-animation/clip_178/name=""
-animation/clip_178/start_frame=0
-animation/clip_178/end_frame=0
-animation/clip_178/loops=false
-animation/clip_179/name=""
-animation/clip_179/start_frame=0
-animation/clip_179/end_frame=0
-animation/clip_179/loops=false
-animation/clip_180/name=""
-animation/clip_180/start_frame=0
-animation/clip_180/end_frame=0
-animation/clip_180/loops=false
-animation/clip_181/name=""
-animation/clip_181/start_frame=0
-animation/clip_181/end_frame=0
-animation/clip_181/loops=false
-animation/clip_182/name=""
-animation/clip_182/start_frame=0
-animation/clip_182/end_frame=0
-animation/clip_182/loops=false
-animation/clip_183/name=""
-animation/clip_183/start_frame=0
-animation/clip_183/end_frame=0
-animation/clip_183/loops=false
-animation/clip_184/name=""
-animation/clip_184/start_frame=0
-animation/clip_184/end_frame=0
-animation/clip_184/loops=false
-animation/clip_185/name=""
-animation/clip_185/start_frame=0
-animation/clip_185/end_frame=0
-animation/clip_185/loops=false
-animation/clip_186/name=""
-animation/clip_186/start_frame=0
-animation/clip_186/end_frame=0
-animation/clip_186/loops=false
-animation/clip_187/name=""
-animation/clip_187/start_frame=0
-animation/clip_187/end_frame=0
-animation/clip_187/loops=false
-animation/clip_188/name=""
-animation/clip_188/start_frame=0
-animation/clip_188/end_frame=0
-animation/clip_188/loops=false
-animation/clip_189/name=""
-animation/clip_189/start_frame=0
-animation/clip_189/end_frame=0
-animation/clip_189/loops=false
-animation/clip_190/name=""
-animation/clip_190/start_frame=0
-animation/clip_190/end_frame=0
-animation/clip_190/loops=false
-animation/clip_191/name=""
-animation/clip_191/start_frame=0
-animation/clip_191/end_frame=0
-animation/clip_191/loops=false
-animation/clip_192/name=""
-animation/clip_192/start_frame=0
-animation/clip_192/end_frame=0
-animation/clip_192/loops=false
-animation/clip_193/name=""
-animation/clip_193/start_frame=0
-animation/clip_193/end_frame=0
-animation/clip_193/loops=false
-animation/clip_194/name=""
-animation/clip_194/start_frame=0
-animation/clip_194/end_frame=0
-animation/clip_194/loops=false
-animation/clip_195/name=""
-animation/clip_195/start_frame=0
-animation/clip_195/end_frame=0
-animation/clip_195/loops=false
-animation/clip_196/name=""
-animation/clip_196/start_frame=0
-animation/clip_196/end_frame=0
-animation/clip_196/loops=false
-animation/clip_197/name=""
-animation/clip_197/start_frame=0
-animation/clip_197/end_frame=0
-animation/clip_197/loops=false
-animation/clip_198/name=""
-animation/clip_198/start_frame=0
-animation/clip_198/end_frame=0
-animation/clip_198/loops=false
-animation/clip_199/name=""
-animation/clip_199/start_frame=0
-animation/clip_199/end_frame=0
-animation/clip_199/loops=false
-animation/clip_200/name=""
-animation/clip_200/start_frame=0
-animation/clip_200/end_frame=0
-animation/clip_200/loops=false
-animation/clip_201/name=""
-animation/clip_201/start_frame=0
-animation/clip_201/end_frame=0
-animation/clip_201/loops=false
-animation/clip_202/name=""
-animation/clip_202/start_frame=0
-animation/clip_202/end_frame=0
-animation/clip_202/loops=false
-animation/clip_203/name=""
-animation/clip_203/start_frame=0
-animation/clip_203/end_frame=0
-animation/clip_203/loops=false
-animation/clip_204/name=""
-animation/clip_204/start_frame=0
-animation/clip_204/end_frame=0
-animation/clip_204/loops=false
-animation/clip_205/name=""
-animation/clip_205/start_frame=0
-animation/clip_205/end_frame=0
-animation/clip_205/loops=false
-animation/clip_206/name=""
-animation/clip_206/start_frame=0
-animation/clip_206/end_frame=0
-animation/clip_206/loops=false
-animation/clip_207/name=""
-animation/clip_207/start_frame=0
-animation/clip_207/end_frame=0
-animation/clip_207/loops=false
-animation/clip_208/name=""
-animation/clip_208/start_frame=0
-animation/clip_208/end_frame=0
-animation/clip_208/loops=false
-animation/clip_209/name=""
-animation/clip_209/start_frame=0
-animation/clip_209/end_frame=0
-animation/clip_209/loops=false
-animation/clip_210/name=""
-animation/clip_210/start_frame=0
-animation/clip_210/end_frame=0
-animation/clip_210/loops=false
-animation/clip_211/name=""
-animation/clip_211/start_frame=0
-animation/clip_211/end_frame=0
-animation/clip_211/loops=false
-animation/clip_212/name=""
-animation/clip_212/start_frame=0
-animation/clip_212/end_frame=0
-animation/clip_212/loops=false
-animation/clip_213/name=""
-animation/clip_213/start_frame=0
-animation/clip_213/end_frame=0
-animation/clip_213/loops=false
-animation/clip_214/name=""
-animation/clip_214/start_frame=0
-animation/clip_214/end_frame=0
-animation/clip_214/loops=false
-animation/clip_215/name=""
-animation/clip_215/start_frame=0
-animation/clip_215/end_frame=0
-animation/clip_215/loops=false
-animation/clip_216/name=""
-animation/clip_216/start_frame=0
-animation/clip_216/end_frame=0
-animation/clip_216/loops=false
-animation/clip_217/name=""
-animation/clip_217/start_frame=0
-animation/clip_217/end_frame=0
-animation/clip_217/loops=false
-animation/clip_218/name=""
-animation/clip_218/start_frame=0
-animation/clip_218/end_frame=0
-animation/clip_218/loops=false
-animation/clip_219/name=""
-animation/clip_219/start_frame=0
-animation/clip_219/end_frame=0
-animation/clip_219/loops=false
-animation/clip_220/name=""
-animation/clip_220/start_frame=0
-animation/clip_220/end_frame=0
-animation/clip_220/loops=false
-animation/clip_221/name=""
-animation/clip_221/start_frame=0
-animation/clip_221/end_frame=0
-animation/clip_221/loops=false
-animation/clip_222/name=""
-animation/clip_222/start_frame=0
-animation/clip_222/end_frame=0
-animation/clip_222/loops=false
-animation/clip_223/name=""
-animation/clip_223/start_frame=0
-animation/clip_223/end_frame=0
-animation/clip_223/loops=false
-animation/clip_224/name=""
-animation/clip_224/start_frame=0
-animation/clip_224/end_frame=0
-animation/clip_224/loops=false
-animation/clip_225/name=""
-animation/clip_225/start_frame=0
-animation/clip_225/end_frame=0
-animation/clip_225/loops=false
-animation/clip_226/name=""
-animation/clip_226/start_frame=0
-animation/clip_226/end_frame=0
-animation/clip_226/loops=false
-animation/clip_227/name=""
-animation/clip_227/start_frame=0
-animation/clip_227/end_frame=0
-animation/clip_227/loops=false
-animation/clip_228/name=""
-animation/clip_228/start_frame=0
-animation/clip_228/end_frame=0
-animation/clip_228/loops=false
-animation/clip_229/name=""
-animation/clip_229/start_frame=0
-animation/clip_229/end_frame=0
-animation/clip_229/loops=false
-animation/clip_230/name=""
-animation/clip_230/start_frame=0
-animation/clip_230/end_frame=0
-animation/clip_230/loops=false
-animation/clip_231/name=""
-animation/clip_231/start_frame=0
-animation/clip_231/end_frame=0
-animation/clip_231/loops=false
-animation/clip_232/name=""
-animation/clip_232/start_frame=0
-animation/clip_232/end_frame=0
-animation/clip_232/loops=false
-animation/clip_233/name=""
-animation/clip_233/start_frame=0
-animation/clip_233/end_frame=0
-animation/clip_233/loops=false
-animation/clip_234/name=""
-animation/clip_234/start_frame=0
-animation/clip_234/end_frame=0
-animation/clip_234/loops=false
-animation/clip_235/name=""
-animation/clip_235/start_frame=0
-animation/clip_235/end_frame=0
-animation/clip_235/loops=false
-animation/clip_236/name=""
-animation/clip_236/start_frame=0
-animation/clip_236/end_frame=0
-animation/clip_236/loops=false
-animation/clip_237/name=""
-animation/clip_237/start_frame=0
-animation/clip_237/end_frame=0
-animation/clip_237/loops=false
-animation/clip_238/name=""
-animation/clip_238/start_frame=0
-animation/clip_238/end_frame=0
-animation/clip_238/loops=false
-animation/clip_239/name=""
-animation/clip_239/start_frame=0
-animation/clip_239/end_frame=0
-animation/clip_239/loops=false
-animation/clip_240/name=""
-animation/clip_240/start_frame=0
-animation/clip_240/end_frame=0
-animation/clip_240/loops=false
-animation/clip_241/name=""
-animation/clip_241/start_frame=0
-animation/clip_241/end_frame=0
-animation/clip_241/loops=false
-animation/clip_242/name=""
-animation/clip_242/start_frame=0
-animation/clip_242/end_frame=0
-animation/clip_242/loops=false
-animation/clip_243/name=""
-animation/clip_243/start_frame=0
-animation/clip_243/end_frame=0
-animation/clip_243/loops=false
-animation/clip_244/name=""
-animation/clip_244/start_frame=0
-animation/clip_244/end_frame=0
-animation/clip_244/loops=false
-animation/clip_245/name=""
-animation/clip_245/start_frame=0
-animation/clip_245/end_frame=0
-animation/clip_245/loops=false
-animation/clip_246/name=""
-animation/clip_246/start_frame=0
-animation/clip_246/end_frame=0
-animation/clip_246/loops=false
-animation/clip_247/name=""
-animation/clip_247/start_frame=0
-animation/clip_247/end_frame=0
-animation/clip_247/loops=false
-animation/clip_248/name=""
-animation/clip_248/start_frame=0
-animation/clip_248/end_frame=0
-animation/clip_248/loops=false
-animation/clip_249/name=""
-animation/clip_249/start_frame=0
-animation/clip_249/end_frame=0
-animation/clip_249/loops=false
-animation/clip_250/name=""
-animation/clip_250/start_frame=0
-animation/clip_250/end_frame=0
-animation/clip_250/loops=false
-animation/clip_251/name=""
-animation/clip_251/start_frame=0
-animation/clip_251/end_frame=0
-animation/clip_251/loops=false
-animation/clip_252/name=""
-animation/clip_252/start_frame=0
-animation/clip_252/end_frame=0
-animation/clip_252/loops=false
-animation/clip_253/name=""
-animation/clip_253/start_frame=0
-animation/clip_253/end_frame=0
-animation/clip_253/loops=false
-animation/clip_254/name=""
-animation/clip_254/start_frame=0
-animation/clip_254/end_frame=0
-animation/clip_254/loops=false
-animation/clip_255/name=""
-animation/clip_255/start_frame=0
-animation/clip_255/end_frame=0
-animation/clip_255/loops=false
-animation/clip_256/name=""
-animation/clip_256/start_frame=0
-animation/clip_256/end_frame=0
-animation/clip_256/loops=false
+version https://git-lfs.github.com/spec/v1
+oid sha256:31aa94244218f79118d2c45bab3282ed3626819c8b64ff2fa34339c0653b8dad
+size 31837
diff --git a/godot/assets/game_objects/_defaultMat(Clone).material b/godot/assets/game_objects/_defaultMat(Clone).material
index 7d9d927..d253967 100644
--- a/godot/assets/game_objects/_defaultMat(Clone).material
+++ b/godot/assets/game_objects/_defaultMat(Clone).material
Binary files differ
diff --git a/godot/assets/game_objects/asphalt(Clone).material b/godot/assets/game_objects/asphalt(Clone).material
index c20cdef..8ac1ddb 100644
--- a/godot/assets/game_objects/asphalt(Clone).material
+++ b/godot/assets/game_objects/asphalt(Clone).material
Binary files differ
diff --git a/godot/assets/game_objects/asphaltEdge(Clone).material b/godot/assets/game_objects/asphaltEdge(Clone).material
index 8d1d68d..2efb60a 100644
--- a/godot/assets/game_objects/asphaltEdge(Clone).material
+++ b/godot/assets/game_objects/asphaltEdge(Clone).material
Binary files differ
diff --git a/godot/assets/game_objects/border(Clone).material b/godot/assets/game_objects/border(Clone).material
index a62b57c..271d791 100644
--- a/godot/assets/game_objects/border(Clone).material
+++ b/godot/assets/game_objects/border(Clone).material
Binary files differ
diff --git a/godot/assets/game_objects/bricks(Clone).material b/godot/assets/game_objects/bricks(Clone).material
index 57fe20e..6ff5b65 100644
--- a/godot/assets/game_objects/bricks(Clone).material
+++ b/godot/assets/game_objects/bricks(Clone).material
Binary files differ
diff --git a/godot/assets/game_objects/colorPurple(Clone).material b/godot/assets/game_objects/colorPurple(Clone).material
index 7d5fb56..c1db7de 100644
--- a/godot/assets/game_objects/colorPurple(Clone).material
+++ b/godot/assets/game_objects/colorPurple(Clone).material
Binary files differ
diff --git a/godot/assets/game_objects/colorRed(Clone).material b/godot/assets/game_objects/colorRed(Clone).material
index b427ddb..d3ff869 100644
--- a/godot/assets/game_objects/colorRed(Clone).material
+++ b/godot/assets/game_objects/colorRed(Clone).material
Binary files differ
diff --git a/godot/assets/game_objects/colorWhite(Clone).material b/godot/assets/game_objects/colorWhite(Clone).material
index e5e1f4d..7350a67 100644
--- a/godot/assets/game_objects/colorWhite(Clone).material
+++ b/godot/assets/game_objects/colorWhite(Clone).material
Binary files differ
diff --git a/godot/assets/game_objects/colorYellow(Clone).material b/godot/assets/game_objects/colorYellow(Clone).material
index de297ec..b3669da 100644
--- a/godot/assets/game_objects/colorYellow(Clone).material
+++ b/godot/assets/game_objects/colorYellow(Clone).material
Binary files differ
diff --git a/godot/assets/game_objects/cone(Clone).material b/godot/assets/game_objects/cone(Clone).material
index 1c154e0..eddedd6 100644
--- a/godot/assets/game_objects/cone(Clone).material
+++ b/godot/assets/game_objects/cone(Clone).material
Binary files differ
diff --git a/godot/assets/game_objects/diceGolf_track1.glb.import b/godot/assets/game_objects/diceGolf_track1.glb.import
new file mode 100644
index 0000000..a97f515
--- /dev/null
+++ b/godot/assets/game_objects/diceGolf_track1.glb.import
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:99304bfd3485d91b6f95434bc6dc743b2cc7a8784a70703fe2e05ab6f175eee8
+size 31873
diff --git a/godot/assets/game_objects/door(Clone).material b/godot/assets/game_objects/door(Clone).material
index 169d73f..e69e399 100644
--- a/godot/assets/game_objects/door(Clone).material
+++ b/godot/assets/game_objects/door(Clone).material
Binary files differ
diff --git a/godot/assets/game_objects/glass(Clone).material b/godot/assets/game_objects/glass(Clone).material
index 539a1a6..c83278f 100644
--- a/godot/assets/game_objects/glass(Clone).material
+++ b/godot/assets/game_objects/glass(Clone).material
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:a9a64980b989b54057860be82a11171ff20971687c072e38cf23263e741d00c0
-size 744
+oid sha256:bf48d47686c386e878fb5b1b1135d3960f305c1ea73ad000287e53e2ba33c7c8
+size 270
diff --git a/godot/assets/game_objects/grass(Clone).material b/godot/assets/game_objects/grass(Clone).material
index 581e49b..d967936 100644
--- a/godot/assets/game_objects/grass(Clone).material
+++ b/godot/assets/game_objects/grass(Clone).material
Binary files differ
diff --git a/godot/assets/game_objects/leafsDark(Clone).material b/godot/assets/game_objects/leafsDark(Clone).material
index b169b67..3c1a95b 100644
--- a/godot/assets/game_objects/leafsDark(Clone).material
+++ b/godot/assets/game_objects/leafsDark(Clone).material
Binary files differ
diff --git a/godot/assets/game_objects/line(Clone).material b/godot/assets/game_objects/line(Clone).material
index 44593c8..21cfd02 100644
--- a/godot/assets/game_objects/line(Clone).material
+++ b/godot/assets/game_objects/line(Clone).material
Binary files differ
diff --git a/godot/assets/game_objects/metalOrange(Clone).material b/godot/assets/game_objects/metalOrange(Clone).material
index 75e29a2..88cf887 100644
--- a/godot/assets/game_objects/metalOrange(Clone).material
+++ b/godot/assets/game_objects/metalOrange(Clone).material
Binary files differ
diff --git a/godot/assets/game_objects/pavement(Clone).material b/godot/assets/game_objects/pavement(Clone).material
index 97d05a9..f5c3af9 100644
--- a/godot/assets/game_objects/pavement(Clone).material
+++ b/godot/assets/game_objects/pavement(Clone).material
Binary files differ
diff --git a/godot/assets/game_objects/roof(Clone).material b/godot/assets/game_objects/roof(Clone).material
index e35c0b6..08b1bda 100644
--- a/godot/assets/game_objects/roof(Clone).material
+++ b/godot/assets/game_objects/roof(Clone).material
Binary files differ
diff --git a/godot/assets/game_objects/steel(Clone).material b/godot/assets/game_objects/steel(Clone).material
index 766baef..c5b3e6c 100644
--- a/godot/assets/game_objects/steel(Clone).material
+++ b/godot/assets/game_objects/steel(Clone).material
Binary files differ
diff --git a/godot/assets/game_objects/stone(Clone).material b/godot/assets/game_objects/stone(Clone).material
index 499b886..d3491ac 100644
--- a/godot/assets/game_objects/stone(Clone).material
+++ b/godot/assets/game_objects/stone(Clone).material
Binary files differ
diff --git a/godot/assets/game_objects/stoneDark(Clone).material b/godot/assets/game_objects/stoneDark(Clone).material
index c53decb..f6f1fec 100644
--- a/godot/assets/game_objects/stoneDark(Clone).material
+++ b/godot/assets/game_objects/stoneDark(Clone).material
Binary files differ
diff --git a/godot/assets/game_objects/stoneLight(Clone).material b/godot/assets/game_objects/stoneLight(Clone).material
index 292845a..3629201 100644
--- a/godot/assets/game_objects/stoneLight(Clone).material
+++ b/godot/assets/game_objects/stoneLight(Clone).material
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:a2301d2b02bba64ab8864c3c6400a4da0c0517c14717505d3da3093aa2ca0b1a
-size 764
+oid sha256:f5181fae2dfe1da3cf826d7e68e8f97f60871248e0364ef80327630da8c7ba15
+size 270
diff --git a/godot/assets/game_objects/trim(Clone).material b/godot/assets/game_objects/trim(Clone).material
index c2e00a2..c60b5c8 100644
--- a/godot/assets/game_objects/trim(Clone).material
+++ b/godot/assets/game_objects/trim(Clone).material
Binary files differ
diff --git a/godot/assets/game_objects/window(Clone).material b/godot/assets/game_objects/window(Clone).material
index b35e12b..62c30d7 100644
--- a/godot/assets/game_objects/window(Clone).material
+++ b/godot/assets/game_objects/window(Clone).material
Binary files differ
diff --git a/godot/assets/game_objects/woodBarkDark(Clone).material b/godot/assets/game_objects/woodBarkDark(Clone).material
index 82da2a6..531dc26 100644
--- a/godot/assets/game_objects/woodBarkDark(Clone).material
+++ b/godot/assets/game_objects/woodBarkDark(Clone).material
Binary files differ
diff --git a/godot/assets/sounds/Uuhhh.mp3 b/godot/assets/sounds/Uuhhh.mp3
deleted file mode 100644
index ea917a2..0000000
--- a/godot/assets/sounds/Uuhhh.mp3
+++ /dev/null
Binary files differ
diff --git a/godot/assets/sounds/Uuhhh.mp3.import b/godot/assets/sounds/Uuhhh.mp3.import
index 4044597..748d572 100644
--- a/godot/assets/sounds/Uuhhh.mp3.import
+++ b/godot/assets/sounds/Uuhhh.mp3.import
@@ -1,15 +1,3 @@
-[remap]
-
-importer="mp3"
-type="AudioStreamMP3"
-path="res://.import/Uuhhh.mp3-1452b4c6d720c509ff34f445446a352e.mp3str"
-
-[deps]
-
-source_file="res://assets/sounds/Uuhhh.mp3"
-dest_files=[ "res://.import/Uuhhh.mp3-1452b4c6d720c509ff34f445446a352e.mp3str" ]
-
-[params]
-
-loop=true
-loop_offset=0
+version https://git-lfs.github.com/spec/v1
+oid sha256:438df26bf3f392ff8f33d0cdc6ae6379b28a9ae306cccfe80e193127504c589a
+size 286
diff --git a/godot/assets/sounds/bgm.mp3 b/godot/assets/sounds/bgm.mp3
new file mode 100644
index 0000000..cad9651
--- /dev/null
+++ b/godot/assets/sounds/bgm.mp3
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:6b3907d7df22c82ee15cfff306a69dd3f5f003cec8a031972f84004dc268da51
+size 5963398
diff --git a/godot/assets/sounds/bgm.mp3.import b/godot/assets/sounds/bgm.mp3.import
new file mode 100644
index 0000000..c98d401
--- /dev/null
+++ b/godot/assets/sounds/bgm.mp3.import
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:128cf14fafb0d84338eca1ea75b9f54d21b86505f97f047a412607dc4e6fbbf3
+size 280
diff --git a/godot/assets/sounds/main_menu.mp3 b/godot/assets/sounds/main_menu.mp3
new file mode 100644
index 0000000..1f262dc
--- /dev/null
+++ b/godot/assets/sounds/main_menu.mp3
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b320e47c06cc8ba3889e3ac6467eff129fd9c6dced99de1de919783faea9ae23
+size 6169312
diff --git a/godot/assets/sounds/main_menu.mp3.import b/godot/assets/sounds/main_menu.mp3.import
new file mode 100644
index 0000000..c593491
--- /dev/null
+++ b/godot/assets/sounds/main_menu.mp3.import
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d5090dd2ec3c9f87d013bd43165984f1643934d2f51bd8b2aa3e63e784335a2d
+size 298
diff --git a/godot/assets/textures/grass-texture-26.jpg.import b/godot/assets/textures/grass-texture-26.jpg.import
index 26272f5..cdf0c2f 100644
--- a/godot/assets/textures/grass-texture-26.jpg.import
+++ b/godot/assets/textures/grass-texture-26.jpg.import
@@ -1,37 +1,3 @@
-[remap]
-
-importer="texture"
-type="StreamTexture"
-path.s3tc="res://.import/grass-texture-26.jpg-f4d636ca8594cebf001f20c088d6db38.s3tc.stex"
-path.etc2="res://.import/grass-texture-26.jpg-f4d636ca8594cebf001f20c088d6db38.etc2.stex"
-metadata={
-"imported_formats": [ "s3tc", "etc2" ],
-"vram_texture": true
-}
-
-[deps]
-
-source_file="res://assets/textures/grass-texture-26.jpg"
-dest_files=[ "res://.import/grass-texture-26.jpg-f4d636ca8594cebf001f20c088d6db38.s3tc.stex", "res://.import/grass-texture-26.jpg-f4d636ca8594cebf001f20c088d6db38.etc2.stex" ]
-
-[params]
-
-compress/mode=2
-compress/lossy_quality=0.7
-compress/hdr_mode=0
-compress/bptc_ldr=0
-compress/normal_map=0
-flags/repeat=true
-flags/filter=true
-flags/mipmaps=true
-flags/anisotropic=false
-flags/srgb=1
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/HDR_as_SRGB=false
-process/invert_color=false
-process/normal_map_invert_y=false
-stream=false
-size_limit=0
-detect_3d=false
-svg/scale=1.0
+version https://git-lfs.github.com/spec/v1
+oid sha256:a99bebeeb2e09fc6bee8c1dba5d8136aa3992439dfb6e207060f15f1adb40272
+size 954
diff --git a/godot/assets/textures/sandstone-brick-wall-texture.jpg.import b/godot/assets/textures/sandstone-brick-wall-texture.jpg.import
index 0d3ef4c..51a1e75 100644
--- a/godot/assets/textures/sandstone-brick-wall-texture.jpg.import
+++ b/godot/assets/textures/sandstone-brick-wall-texture.jpg.import
@@ -1,37 +1,3 @@
-[remap]
-
-importer="texture"
-type="StreamTexture"
-path.s3tc="res://.import/sandstone-brick-wall-texture.jpg-c5b2a47ccb2119e07ae706d0127496d2.s3tc.stex"
-path.etc2="res://.import/sandstone-brick-wall-texture.jpg-c5b2a47ccb2119e07ae706d0127496d2.etc2.stex"
-metadata={
-"imported_formats": [ "s3tc", "etc2" ],
-"vram_texture": true
-}
-
-[deps]
-
-source_file="res://assets/textures/sandstone-brick-wall-texture.jpg"
-dest_files=[ "res://.import/sandstone-brick-wall-texture.jpg-c5b2a47ccb2119e07ae706d0127496d2.s3tc.stex", "res://.import/sandstone-brick-wall-texture.jpg-c5b2a47ccb2119e07ae706d0127496d2.etc2.stex" ]
-
-[params]
-
-compress/mode=2
-compress/lossy_quality=0.7
-compress/hdr_mode=0
-compress/bptc_ldr=0
-compress/normal_map=0
-flags/repeat=true
-flags/filter=true
-flags/mipmaps=true
-flags/anisotropic=false
-flags/srgb=1
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/HDR_as_SRGB=false
-process/invert_color=false
-process/normal_map_invert_y=false
-stream=false
-size_limit=0
-detect_3d=false
-svg/scale=1.0
+version https://git-lfs.github.com/spec/v1
+oid sha256:6b9d95efee0199ac1cb70a4ee5c66604b42aa02344b34af775d731499a5508cc
+size 1014
diff --git a/godot/assets/theme.tres b/godot/assets/theme.tres
new file mode 100644
index 0000000..1269b54
--- /dev/null
+++ b/godot/assets/theme.tres
@@ -0,0 +1,47 @@
+[gd_resource type="Theme" load_steps=10 format=2]
+
+[ext_resource path="res://assets/fonts/format.otf" type="DynamicFontData" id=1]
+[ext_resource path="res://assets/fonts/format.tres" type="DynamicFont" id=2]
+
+[sub_resource type="DynamicFont" id=1]
+size = 55
+extra_spacing_bottom = -15
+font_data = ExtResource( 1 )
+
+[sub_resource type="StyleBoxFlat" id=2]
+content_margin_top = 10.0
+content_margin_bottom = 10.0
+bg_color = Color( 0.4, 0.337255, 0.313726, 0.32549 )
+
+[sub_resource type="StyleBoxFlat" id=3]
+content_margin_top = 10.0
+content_margin_bottom = 10.0
+bg_color = Color( 0.176471, 0.14902, 0.141176, 1 )
+
+[sub_resource type="StyleBoxFlat" id=4]
+content_margin_top = 10.0
+content_margin_bottom = 10.0
+bg_color = Color( 0.4, 0.337255, 0.313726, 1 )
+
+[sub_resource type="StyleBoxFlat" id=5]
+content_margin_top = 20.0
+content_margin_bottom = 20.0
+bg_color = Color( 0.290196, 0.247059, 0.231373, 1 )
+
+[sub_resource type="StyleBoxFlat" id=6]
+content_margin_top = 10.0
+content_margin_bottom = 10.0
+bg_color = Color( 0.176471, 0.14902, 0.141176, 1 )
+
+[sub_resource type="StyleBoxFlat" id=7]
+bg_color = Color( 0.160784, 0.133333, 0.133333, 1 )
+
+[resource]
+Button/fonts/font = SubResource( 1 )
+Button/styles/disabled = SubResource( 2 )
+Button/styles/focus = SubResource( 3 )
+Button/styles/hover = SubResource( 4 )
+Button/styles/normal = SubResource( 5 )
+Button/styles/pressed = SubResource( 6 )
+Label/fonts/font = ExtResource( 2 )
+Panel/styles/panel = SubResource( 7 )
diff --git a/godot/native/BasicDie.gdns b/godot/native/BasicDie.gdns
new file mode 100644
index 0000000..ab5d534
--- /dev/null
+++ b/godot/native/BasicDie.gdns
@@ -0,0 +1,8 @@
+[gd_resource type="NativeScript" load_steps=2 format=2]
+
+[ext_resource path="res://native/game.gdnlib" type="GDNativeLibrary" id=1]
+
+[resource]
+resource_name = "BasicDie"
+class_name = "BasicDie"
+library = ExtResource( 1 )
diff --git a/godot/native/GoalTriggerBox.gdns b/godot/native/GoalTriggerBox.gdns
new file mode 100644
index 0000000..249df19
--- /dev/null
+++ b/godot/native/GoalTriggerBox.gdns
@@ -0,0 +1,8 @@
+[gd_resource type="NativeScript" load_steps=2 format=2]
+
+[ext_resource path="res://native/game.gdnlib" type="GDNativeLibrary" id=1]
+
+[resource]
+resource_name = "GoalTriggerZone"
+class_name = "GoalTriggerZone"
+library = ExtResource( 1 )
diff --git a/godot/native/game.gdnlib b/godot/native/game.gdnlib
index 439db91..b7c3ec4 100644
--- a/godot/native/game.gdnlib
+++ b/godot/native/game.gdnlib
@@ -11,14 +11,14 @@ Android.arm64-v8a="res://../lib/aarch64-linux-android/libcode_with_your_friends2
Android.armeabi-v7a="res://../lib/armv7-linux-androideabi/libcode_with_your_friends2022.so"
Android.x86="res://../lib/i686-linux-android/libcode_with_your_friends2022.so"
Android.x86_64="res://../lib/x86_64-linux-android/libcode_with_your_friends2022.so"
-HTML5.wasm32 = "res://../lib/wasm32-unknown-emscripten/code_with_your_friends2022.wasm"
+HTML5.wasm32="res://../lib/wasm32-unknown-emscripten/code_with_your_friends2022.wasm"
iOS.arm64="res://../lib/aarch64-apple-ios/libcode_with_your_friends2022.a"
OSX.64="res://../lib/x86_64-apple-darwin/libcode_with_your_friends2022.dylib"
Server.32="res://../lib/i686-unknown-linux-gnu/libcode_with_your_friends2022.so"
Server.64="res://../lib/x86_64-unknown-linux-gnu/libcode_with_your_friends2022.so"
-# Windows.32="res://../lib/i686-pc-windows-gnu/code_with_your_friends2022.dll"
+#Windows.32="res://../lib/i686-pc-windows-gnu/code_with_your_friends2022.dll"
Windows.32="res://../lib/i686-pc-windows-msvc/code_with_your_friends2022.dll"
-# Windows.64="res://../lib/x86_64-pc-windows-gnu/code_with_your_friends2022.dll"
+#Windows.64="res://../lib/x86_64-pc-windows-gnu/code_with_your_friends2022.dll"
Windows.64="res://../lib/x86_64-pc-windows-msvc/code_with_your_friends2022.dll"
X11.32="res://../lib/i686-unknown-linux-gnu/libcode_with_your_friends2022.so"
X11.64="res://../lib/x86_64-unknown-linux-gnu/libcode_with_your_friends2022.so"
diff --git a/godot/project.godot b/godot/project.godot
index a8f6586..e98a5a8 100644
--- a/godot/project.godot
+++ b/godot/project.godot
@@ -8,16 +8,38 @@
config_version=4
+_global_script_classes=[ ]
+_global_script_class_icons={
+}
+
[application]
config/name="code-with-your-friends2022"
-run/main_scene="res://scenes/Game.tscn"
+run/main_scene="res://scenes/Menu.tscn"
config/icon="res://assets/godot-ferris-32x32.png"
+[display]
+
+window/size/width=1920
+window/size/height=1080
+window/stretch/mode="2d"
+
[gdnative]
singletons=[ ]
+[input]
+
+mouse_btn_left={
+"deadzone": 0.5,
+"events": [ Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"button_mask":0,"position":Vector2( 0, 0 ),"global_position":Vector2( 0, 0 ),"factor":1.0,"button_index":1,"pressed":false,"doubleclick":false,"script":null)
+ ]
+}
+esc={
+"deadzone": 0.5,
+"events": [ ]
+}
+
[rendering]
environment/default_environment="res://default_env.tres"
diff --git a/godot/scenes/Die.gd b/godot/scenes/Die.gd
new file mode 100644
index 0000000..21a408e
--- /dev/null
+++ b/godot/scenes/Die.gd
@@ -0,0 +1,130 @@
+extends RigidBody
+
+const Game = preload("res://scenes/Game.gd")
+
+var camrot_h = 0
+var camrot_v = 0
+var camrot_v_locked_val = 0
+var cam_v_min = -90
+var cam_v_max = 90
+var sensitivity = 0.5
+var dice_is_moving = false
+var last_frame_position = Vector3(1.0,1.0,1.0)
+var mouse_origin = Vector2(0,0)
+var die_launch_force_magnitude = 0
+var die_launch_force_direction = Vector3(0,0,0)
+var die_launch_force = Vector3(0,0,0)
+var die_launch_force_multiplier = 0.05
+var left_pressed = false
+
+var mat
+var target_bounce = 1
+var previous_bounciness = 0
+
+var _game: Game = null
+
+# Called when the node enters the scene tree for the first time.
+func _ready():
+ Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED)
+ $CamRoot/Horizontal/Vertical/Camera.add_exception(self)
+ $CamRoot.set_as_toplevel(true)
+ _game = get_node("/root/Game")
+ mat = get_physics_material_override()
+ previous_bounciness = mat.get_bounce()
+
+func _input(event):
+
+ if event is InputEventKey:
+ if event.scancode == KEY_TAB:
+ if event.is_pressed():
+ _game.open_scoreboard()
+ else:
+ _game.close_scoreboard()
+ return
+
+ if event is InputEventMouseButton and dice_is_moving == false:
+ if event.is_pressed() and left_pressed == false:
+ Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE)
+ mouse_origin = event.global_position
+ camrot_v_locked_val = camrot_v
+ left_pressed = true
+ else:
+ left_pressed = false
+ die_launch_force_magnitude = -(mouse_origin.y - event.global_position.y)
+ die_launch_force_direction = $CamRoot/Horizontal/Vertical/Camera.get_global_transform().basis
+ die_launch_force_direction = -die_launch_force_direction.z
+ die_launch_force = die_launch_force_direction * die_launch_force_magnitude * die_launch_force_multiplier
+ self.apply_central_impulse(die_launch_force)
+ Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED)
+
+ if event is InputEventMouseMotion:
+ camrot_h += -event.relative.x * sensitivity
+ if left_pressed:
+ camrot_v = camrot_v_locked_val
+ else:
+ camrot_v += -event.relative.y * sensitivity
+
+
+func _physics_process(delta):
+ camrot_v = clamp(camrot_v, cam_v_min, cam_v_max)
+
+ $CamRoot/Horizontal.rotation_degrees.y = camrot_h
+ $CamRoot/Horizontal/Vertical.rotation_degrees.x = camrot_v
+ $CamRoot.translation.x = translation.x
+ $CamRoot.translation.y = translation.y
+ $CamRoot.translation.z = translation.z
+
+ if last_frame_position != Vector3(translation.x, translation.y, translation.x):
+ dice_is_moving = true
+ else:
+ dice_is_moving = false
+
+ if angular_velocity.length() == 0:
+ get_upwards_side()
+
+ last_frame_position = Vector3(translation.x, translation.y, translation.x)
+
+
+# Called every frame. 'delta' is the elapsed time since the previous frame.
+#func _process(delta):
+# pass
+
+
+"""
+BUFFS
+"""
+
+func get_upwards_side():
+ return 0
+
+
+func extra_stroke():
+ _game.revoke_stroke()
+
+
+func bounciness():
+ mat.set_bounce(target_bounce)
+
+
+func bounciness_revert():
+ mat.set_bounce(previous_bounciness)
+
+
+func phase():
+ set_collision_layer_bit(2, false)
+
+
+func phase_revert():
+ set_collision_layer_bit(2, true)
+
+
+func ball():
+ $BallShape.show()
+ $BallShape.set_process(true)
+ $BallShape.disabled = false
+
+
+func ball_revert():
+ $BallShape.hide()
+ $BallShape.set_process(false)
+ $BallShape.disabled = true
diff --git a/godot/scenes/Die.tscn b/godot/scenes/Die.tscn
new file mode 100644
index 0000000..2d73734
--- /dev/null
+++ b/godot/scenes/Die.tscn
@@ -0,0 +1,60 @@
+[gd_scene load_steps=8 format=2]
+
+[ext_resource path="res://scenes/Die.gd" type="Script" id=1]
+[ext_resource path="res://assets/game_objects/W8baseColor_Mat.material" type="Material" id=2]
+
+[sub_resource type="PhysicsMaterial" id=3]
+
+[sub_resource type="ConvexPolygonShape" id=2]
+points = PoolVector3Array( -0.0850063, -0.879389, -0.0282584, 0.0288993, 0.929375, 0.0289349, 0.0288993, 0.929375, -0.0289349, 0.929367, -0.0289314, 0.0289314, -0.0289784, -0.0289338, 0.929338, -0.929369, 0.028929, 0.028929, 0.0288993, -0.0289349, -0.929375, 0.0288993, -0.929375, 0.0289349, -0.0850063, 0.0282584, -0.879389, 0.0282247, 0.084959, 0.87945, 0.857489, 0.056933, -0.0855785, -0.879454, -0.0849424, 0.0282549, 0.0570775, -0.885814, -0.0571088, 0.0570775, -0.0571088, 0.885814, -0.0571532, 0.885743, -0.0571043, -0.0571532, 0.885743, 0.0571043, 0.0570775, 0.0571088, -0.885814, -0.885806, -0.057097, -0.057097, 0.879446, 0.0849494, 0.0282572, 0.857335, -0.0571018, -0.0855632, -0.0571532, 0.0571043, 0.885743, -0.0571532, -0.885743, 0.0571043, -0.885806, 0.057097, -0.057097, -0.0571532, -0.0571043, -0.885743, 0.0570775, 0.0571088, 0.885814, -0.0571532, -0.885743, -0.0571043, -0.0571532, 0.0571043, -0.885743, 0.0570775, -0.885814, 0.0571088, 0.0570775, 0.885814, 0.0571088, -0.0571532, -0.0571043, 0.885743, -0.885806, 0.057097, 0.057097, 0.0570775, 0.885814, -0.0571088, 0.0570775, -0.0571088, -0.885814, 0.857335, -0.0571018, 0.0855632, -0.885806, -0.057097, 0.057097, 0.857489, 0.056933, 0.0855785, 0.929425, 0.0287513, -0.0289333, 0.929367, -0.0289314, -0.0289314, -0.0289784, 0.929338, -0.0289338, 0.0288993, 0.0289349, -0.929375, -0.929369, -0.028929, -0.028929, -0.0283039, -0.87942, -0.0849561, 0.084933, 0.0282608, 0.879461, -0.0289784, 0.929338, 0.0289338, -0.0289784, -0.0289338, -0.929338, -0.0289784, 0.0289338, 0.929338, 0.0288993, -0.0289349, 0.929375, 0.0288993, -0.929375, -0.0289349, -0.0289784, -0.929338, 0.0289338, -0.929369, 0.028929, -0.028929, -0.0283039, 0.0849561, -0.87942, -0.879454, -0.0282549, 0.0849424, 0.879512, 0.0280816, 0.0849558, 0.879446, -0.0849494, -0.0282572, -0.0282988, -0.822574, 0.141805, 0.17021, 0.0280745, -0.794261, -0.879454, 0.0849424, -0.0282549, -0.0283039, 0.87942, 0.0849561, 0.0282247, 0.87945, -0.084959, 0.0282247, -0.084959, -0.87945, -0.879454, -0.0282549, -0.0849424, -0.0850063, 0.0282584, 0.879389, -0.0850063, 0.879389, 0.0282584, 0.084933, -0.0282608, 0.879461 )
+
+[sub_resource type="ArrayMesh" id=1]
+resource_name = "W8_Cone"
+surfaces/0 = {
+"aabb": AABB( -0.956074, -0.956074, -0.956074, 1.91215, 1.91215, 1.91215 ),
+"array_data": PoolByteArray( 243, 55, 39, 61, 242, 55, 39, 189, 1, 25, 107, 191, 90, 166, 181, 114, 182, 56, 213, 56, 243, 55, 39, 189, 242, 55, 39, 189, 1, 25, 107, 191, 166, 166, 202, 117, 195, 56, 249, 56, 243, 55, 39, 189, 242, 55, 39, 61, 1, 25, 107, 191, 166, 90, 68, 9, 203, 59, 28, 52, 243, 55, 39, 61, 242, 55, 39, 61, 1, 25, 107, 191, 90, 90, 179, 93, 211, 56, 187, 56, 0, 0, 0, 0, 194, 217, 73, 189, 30, 67, 109, 191, 74, 129, 189, 114, 188, 56, 231, 56, 0, 0, 0, 0, 0, 0, 0, 0, 64, 193, 116, 191, 127, 127, 208, 102, 215, 56, 221, 56, 0, 0, 0, 0, 0, 0, 0, 0, 64, 193, 116, 191, 127, 127, 35, 17, 234, 59, 51, 52, 196, 217, 73, 189, 0, 0, 0, 0, 30, 67, 109, 191, 129, 74, 9, 124, 216, 56, 251, 56, 196, 217, 73, 189, 0, 0, 0, 0, 30, 67, 109, 191, 129, 74, 64, 18, 219, 59, 3, 52, 0, 0, 0, 0, 194, 217, 73, 61, 30, 67, 109, 191, 74, 127, 179, 77, 229, 56, 195, 56, 0, 0, 0, 0, 194, 217, 73, 61, 30, 67, 109, 191, 74, 127, 62, 8, 207, 59, 68, 52, 196, 217, 73, 61, 0, 0, 0, 0, 30, 67, 109, 191, 127, 74, 185, 106, 196, 56, 200, 56, 1, 25, 107, 63, 242, 55, 39, 189, 232, 55, 39, 189, 90, 184, 179, 121, 112, 54, 156, 54, 1, 25, 107, 63, 243, 55, 39, 61, 232, 55, 39, 189, 90, 72, 181, 101, 169, 54, 105, 54, 1, 25, 107, 63, 244, 55, 39, 61, 253, 55, 39, 61, 54, 36, 202, 109, 143, 54, 33, 54, 1, 25, 107, 63, 242, 55, 39, 189, 253, 55, 39, 61, 54, 220, 206, 34, 252, 39, 251, 57, 31, 67, 109, 63, 252, 254, 180, 177, 177, 217, 73, 189, 126, 204, 185, 112, 141, 54, 131, 54, 64, 193, 116, 63, 2, 43, 165, 48, 23, 193, 39, 51, 126, 0, 0, 17, 30, 36, 240, 57, 64, 193, 116, 63, 2, 43, 165, 48, 23, 193, 39, 51, 126, 0, 48, 126, 104, 54, 89, 54, 30, 67, 109, 63, 196, 217, 73, 61, 245, 193, 47, 51, 74, 52, 189, 105, 157, 54, 69, 54, 30, 67, 109, 63, 0, 0, 0, 49, 206, 217, 73, 61, 74, 0, 230, 32, 252, 37, 8, 58, 30, 67, 109, 63, 0, 0, 0, 49, 206, 217, 73, 61, 74, 0, 253, 122, 102, 54, 29, 54, 30, 67, 109, 63, 195, 217, 73, 189, 245, 193, 47, 51, 74, 204, 211, 31, 126, 39, 231, 57, 30, 67, 109, 63, 195, 217, 73, 189, 245, 193, 47, 51, 74, 204, 98, 116, 75, 54, 141, 54, 221, 55, 39, 61, 242, 55, 39, 189, 1, 25, 107, 63, 36, 220, 190, 39, 246, 50, 180, 59, 221, 55, 39, 61, 242, 55, 39, 61, 1, 25, 107, 63, 36, 36, 196, 102, 169, 55, 244, 46, 8, 56, 39, 189, 240, 55, 39, 61, 1, 25, 107, 63, 220, 36, 154, 101, 224, 55, 32, 46, 7, 56, 39, 189, 242, 55, 39, 189, 1, 25, 107, 63, 220, 220, 133, 89, 136, 51, 193, 59, 179, 217, 73, 61, 252, 254, 180, 177, 30, 67, 109, 63, 52, 0, 211, 39, 190, 50, 195, 59, 179, 217, 73, 61, 252, 254, 180, 177, 30, 67, 109, 63, 52, 0, 228, 102, 131, 55, 187, 46, 81, 109, 158, 179, 172, 28, 154, 176, 64, 193, 116, 63, 0, 0, 161, 47, 27, 51, 212, 59, 81, 109, 158, 179, 172, 28, 154, 176, 64, 193, 116, 63, 0, 0, 190, 93, 159, 55, 238, 45, 245, 193, 175, 179, 194, 217, 73, 61, 30, 67, 109, 63, 0, 52, 172, 100, 197, 55, 141, 46, 218, 217, 73, 189, 0, 0, 128, 177, 30, 67, 109, 63, 204, 0, 137, 91, 144, 51, 213, 59, 218, 217, 73, 189, 0, 0, 128, 177, 30, 67, 109, 63, 204, 0, 155, 97, 211, 55, 133, 45, 245, 193, 171, 179, 195, 217, 73, 189, 30, 67, 109, 63, 0, 204, 155, 41, 64, 51, 186, 59, 1, 25, 107, 191, 242, 55, 39, 189, 240, 55, 39, 61, 202, 220, 154, 101, 27, 56, 70, 59, 1, 25, 107, 191, 242, 55, 39, 61, 240, 55, 39, 61, 202, 36, 133, 103, 41, 58, 135, 40, 1, 25, 107, 191, 242, 55, 39, 61, 246, 55, 39, 189, 166, 72, 79, 6, 77, 58, 90, 41, 1, 25, 107, 191, 242, 55, 39, 189, 246, 55, 39, 189, 166, 184, 196, 121, 54, 56, 43, 59, 31, 67, 109, 191, 0, 0, 0, 0, 192, 217, 73, 61, 182, 0, 155, 105, 33, 56, 89, 59, 31, 67, 109, 191, 0, 0, 0, 0, 192, 217, 73, 61, 182, 0, 137, 102, 39, 58, 137, 38, 64, 193, 116, 191, 0, 0, 0, 0, 46, 230, 13, 178, 129, 0, 190, 127, 59, 56, 76, 59, 64, 193, 116, 191, 0, 0, 0, 0, 46, 230, 13, 178, 129, 0, 161, 1, 68, 58, 172, 38, 30, 67, 109, 191, 205, 217, 73, 61, 124, 173, 63, 178, 182, 52, 155, 8, 59, 58, 248, 40, 30, 67, 109, 191, 0, 0, 0, 0, 199, 217, 73, 189, 129, 52, 48, 117, 73, 56, 50, 59, 30, 67, 109, 191, 0, 0, 0, 0, 199, 217, 73, 189, 129, 52, 78, 16, 92, 58, 107, 40, 30, 67, 109, 191, 205, 217, 73, 189, 124, 173, 63, 178, 182, 204, 172, 111, 40, 56, 56, 59, 243, 55, 39, 189, 1, 25, 107, 63, 242, 55, 39, 189, 184, 90, 180, 1, 140, 57, 188, 52, 242, 55, 39, 189, 1, 25, 107, 63, 243, 55, 39, 61, 220, 54, 140, 101, 105, 57, 157, 52, 242, 55, 39, 61, 1, 25, 107, 63, 244, 55, 39, 61, 36, 54, 180, 101, 78, 57, 209, 52, 242, 55, 39, 61, 1, 25, 107, 63, 242, 55, 39, 189, 72, 90, 165, 90, 91, 57, 24, 53, 195, 217, 73, 189, 30, 67, 109, 63, 153, 186, 72, 48, 204, 74, 149, 14, 122, 57, 172, 52, 0, 0, 0, 46, 64, 193, 116, 63, 129, 149, 40, 49, 0, 126, 130, 32, 110, 57, 223, 52, 205, 12, 189, 177, 30, 67, 109, 63, 196, 217, 73, 61, 0, 74, 159, 99, 91, 57, 183, 52, 194, 217, 73, 61, 30, 67, 109, 63, 233, 6, 164, 49, 52, 74, 171, 97, 84, 57, 244, 52, 0, 0, 0, 0, 30, 67, 109, 63, 195, 217, 73, 189, 204, 126, 138, 65, 112, 57, 28, 53, 0, 0, 0, 0, 30, 67, 109, 63, 195, 217, 73, 189, 204, 126, 74, 1, 140, 57, 229, 52, 242, 55, 39, 189, 1, 25, 107, 191, 243, 55, 39, 189, 184, 166, 180, 114, 123, 53, 161, 57, 243, 55, 39, 61, 1, 25, 107, 191, 242, 55, 39, 189, 72, 166, 165, 117, 96, 53, 125, 57, 242, 55, 39, 61, 1, 25, 107, 191, 243, 55, 39, 61, 36, 202, 180, 37, 254, 52, 171, 57, 243, 55, 39, 189, 1, 25, 107, 191, 242, 55, 39, 61, 220, 202, 140, 93, 68, 53, 187, 57, 0, 0, 0, 0, 30, 67, 109, 191, 195, 217, 73, 189, 204, 129, 171, 113, 110, 53, 143, 57, 0, 0, 192, 174, 64, 193, 116, 191, 172, 28, 102, 48, 0, 129, 129, 95, 57, 53, 154, 57, 195, 217, 73, 61, 30, 67, 109, 191, 234, 6, 164, 49, 52, 182, 183, 37, 253, 52, 151, 57, 195, 217, 73, 61, 30, 67, 109, 191, 234, 6, 164, 49, 52, 182, 123, 124, 54, 53, 123, 57, 164, 27, 16, 177, 30, 67, 109, 191, 195, 217, 73, 61, 0, 182, 149, 39, 33, 53, 179, 57, 195, 217, 73, 189, 30, 67, 109, 191, 149, 186, 72, 48, 204, 182, 159, 105, 96, 53, 174, 57 ),
+"array_index_data": PoolByteArray( 38, 0, 2, 0, 48, 0, 15, 0, 60, 0, 24, 0, 27, 0, 61, 0, 36, 0, 39, 0, 58, 0, 1, 0, 3, 0, 13, 0, 51, 0, 26, 0, 37, 0, 49, 0, 14, 0, 25, 0, 50, 0, 0, 0, 5, 0, 4, 0, 0, 0, 11, 0, 5, 0, 1, 0, 5, 0, 7, 0, 1, 0, 4, 0, 5, 0, 2, 0, 6, 0, 10, 0, 2, 0, 8, 0, 6, 0, 3, 0, 5, 0, 11, 0, 3, 0, 9, 0, 5, 0, 12, 0, 18, 0, 16, 0, 12, 0, 23, 0, 18, 0, 13, 0, 18, 0, 19, 0, 13, 0, 16, 0, 18, 0, 14, 0, 18, 0, 21, 0, 14, 0, 19, 0, 18, 0, 15, 0, 17, 0, 22, 0, 15, 0, 20, 0, 17, 0, 24, 0, 30, 0, 28, 0, 24, 0, 35, 0, 30, 0, 25, 0, 31, 0, 32, 0, 25, 0, 29, 0, 31, 0, 26, 0, 31, 0, 34, 0, 26, 0, 32, 0, 31, 0, 27, 0, 30, 0, 35, 0, 27, 0, 33, 0, 30, 0, 36, 0, 42, 0, 40, 0, 36, 0, 47, 0, 42, 0, 37, 0, 43, 0, 44, 0, 37, 0, 41, 0, 43, 0, 38, 0, 43, 0, 46, 0, 38, 0, 44, 0, 43, 0, 39, 0, 42, 0, 47, 0, 39, 0, 45, 0, 42, 0, 48, 0, 53, 0, 52, 0, 48, 0, 57, 0, 53, 0, 49, 0, 53, 0, 54, 0, 49, 0, 52, 0, 53, 0, 50, 0, 53, 0, 55, 0, 50, 0, 54, 0, 53, 0, 51, 0, 53, 0, 56, 0, 51, 0, 55, 0, 53, 0, 58, 0, 63, 0, 62, 0, 58, 0, 67, 0, 63, 0, 59, 0, 63, 0, 65, 0, 59, 0, 62, 0, 63, 0, 60, 0, 63, 0, 66, 0, 60, 0, 64, 0, 63, 0, 61, 0, 63, 0, 67, 0, 61, 0, 66, 0, 63, 0, 3, 0, 16, 0, 13, 0, 3, 0, 11, 0, 16, 0, 11, 0, 12, 0, 16, 0, 11, 0, 0, 0, 12, 0, 2, 0, 57, 0, 48, 0, 2, 0, 10, 0, 57, 0, 9, 0, 51, 0, 56, 0, 9, 0, 3, 0, 51, 0, 50, 0, 19, 0, 14, 0, 50, 0, 55, 0, 19, 0, 55, 0, 13, 0, 19, 0, 55, 0, 51, 0, 13, 0, 14, 0, 29, 0, 25, 0, 14, 0, 21, 0, 29, 0, 20, 0, 24, 0, 28, 0, 20, 0, 15, 0, 24, 0, 49, 0, 32, 0, 26, 0, 49, 0, 54, 0, 32, 0, 54, 0, 25, 0, 32, 0, 54, 0, 50, 0, 25, 0, 26, 0, 41, 0, 37, 0, 26, 0, 34, 0, 41, 0, 33, 0, 36, 0, 40, 0, 33, 0, 27, 0, 36, 0, 48, 0, 44, 0, 38, 0, 48, 0, 52, 0, 44, 0, 52, 0, 37, 0, 44, 0, 52, 0, 49, 0, 37, 0, 38, 0, 8, 0, 2, 0, 38, 0, 46, 0, 8, 0, 45, 0, 1, 0, 7, 0, 45, 0, 39, 0, 1, 0, 0, 0, 62, 0, 59, 0, 0, 0, 4, 0, 62, 0, 4, 0, 58, 0, 62, 0, 4, 0, 1, 0, 58, 0, 59, 0, 23, 0, 12, 0, 59, 0, 65, 0, 23, 0, 64, 0, 15, 0, 22, 0, 64, 0, 60, 0, 15, 0, 60, 0, 35, 0, 24, 0, 60, 0, 66, 0, 35, 0, 66, 0, 27, 0, 35, 0, 66, 0, 61, 0, 27, 0, 61, 0, 47, 0, 36, 0, 61, 0, 67, 0, 47, 0, 67, 0, 39, 0, 47, 0, 67, 0, 58, 0, 39, 0, 0, 0, 59, 0, 12, 0 ),
+"blend_shape_data": [ ],
+"format": 2194711,
+"index_count": 312,
+"material": ExtResource( 2 ),
+"primitive": 4,
+"skeleton_aabb": [ ],
+"vertex_count": 68
+}
+
+[sub_resource type="SphereShape" id=4]
+
+[sub_resource type="SphereMesh" id=5]
+
+[node name="Die" type="RigidBody"]
+collision_mask = 3
+physics_material_override = SubResource( 3 )
+script = ExtResource( 1 )
+
+[node name="CollisionShape" type="CollisionShape" parent="."]
+shape = SubResource( 2 )
+
+[node name="Cone" type="MeshInstance" parent="CollisionShape"]
+mesh = SubResource( 1 )
+skeleton = NodePath("../../..")
+material/0 = null
+
+[node name="BallShape" type="CollisionShape" parent="."]
+visible = false
+shape = SubResource( 4 )
+disabled = true
+
+[node name="Ball" type="MeshInstance" parent="BallShape"]
+mesh = SubResource( 5 )
+skeleton = NodePath("../..")
+material/0 = null
+
+[node name="CamRoot" type="Spatial" parent="."]
+
+[node name="Horizontal" type="Spatial" parent="CamRoot"]
+
+[node name="Vertical" type="Spatial" parent="CamRoot/Horizontal"]
+
+[node name="Camera" type="ClippedCamera" parent="CamRoot/Horizontal/Vertical"]
+transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 10.1285 )
diff --git a/godot/scenes/Game.gd b/godot/scenes/Game.gd
new file mode 100644
index 0000000..f24219e
--- /dev/null
+++ b/godot/scenes/Game.gd
@@ -0,0 +1,87 @@
+extends Spatial
+
+const NUM_LEVELS = 9
+const PAR = [1,2,3,4,5,6,7,8,9]
+
+# level control
+var current_level_id = 0
+var levels = []
+var post_game = false
+
+# stroke control
+var current_strokes = 0
+var strokes_per_level = [0,0,0,0,0,0,0,0,0]
+
+# Called when the node enters the scene tree for the first time.
+func _ready():
+ for i in range(NUM_LEVELS):
+ levels.append(get_node("/root/Game/Level%d" % (i+1)))
+
+ current_strokes = 0
+ levels[0].show()
+
+
+# Called every frame. 'delta' is the elapsed time since the previous frame.
+func _process(delta):
+ if Input.is_action_just_pressed("ui_cancel"):
+ get_tree().paused = true
+ $PausePopup.show()
+ Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE)
+
+
+
+func _on_QuitButton_pressed():
+ get_tree().quit()
+
+
+func _on_ResumeButton_pressed():
+ $PausePopup.hide()
+ get_tree().paused = false
+ Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED)
+
+
+func end_level():
+ # save current strokes and reset
+ strokes_per_level[current_level_id] = current_strokes
+ current_strokes = 0
+
+ post_game = true
+
+ open_scoreboard()
+
+
+func add_stroke():
+ current_strokes += 1
+
+
+func revoke_stroke():
+ current_strokes -= 1
+
+
+func open_scoreboard():
+ $Scoreboard.update_values(strokes_per_level, PAR)
+ $Scoreboard.show()
+
+
+func close_scoreboard():
+ $Scoreboard.hide()
+
+
+func is_post_game():
+ return post_game
+
+
+func next_level():
+ post_game = false
+
+ levels[current_level_id].hide()
+ current_level_id = current_level_id + 1
+
+ if current_level_id >= NUM_LEVELS:
+ # TODO load main menu
+ return
+
+ # load next level
+ levels[current_level_id].show()
+
+ close_scoreboard()
diff --git a/godot/scenes/Game.tscn b/godot/scenes/Game.tscn
index f8b17cb..9891f4e 100644
--- a/godot/scenes/Game.tscn
+++ b/godot/scenes/Game.tscn
@@ -1,14 +1,74 @@
-[gd_scene load_steps=3 format=2]
+[gd_scene load_steps=7 format=2]
-[ext_resource path="res://native/Game.gdns" type="Script" id=1]
-[ext_resource path="res://scenes/levels/test_scene_uuuhhh/TestSceneUuuhhh.tscn" type="PackedScene" id=2]
+[ext_resource path="res://scenes/Game.gd" type="Script" id=1]
+[ext_resource path="res://scenes/levels/test_scene_movement/TestSceneMovement.tscn" type="PackedScene" id=2]
+[ext_resource path="res://assets/theme.tres" type="Theme" id=3]
+[ext_resource path="res://assets/fonts/format.tres" type="DynamicFont" id=4]
+[ext_resource path="res://scenes/objects/Scoreboard.tscn" type="PackedScene" id=5]
+[ext_resource path="res://assets/sounds/bgm.mp3" type="AudioStream" id=6]
[node name="Game" type="Spatial"]
script = ExtResource( 1 )
-[node name="Camera" type="Camera" parent="."]
-transform = Transform( -0.538224, 0.336461, -0.772728, 0, 0.916856, 0.399217, 0.842802, 0.214868, -0.493474, -6.58972, 3.31005, -7.31211 )
-current = true
-fov = 64.6875
+[node name="TestScene" parent="." instance=ExtResource( 2 )]
-[node name="TestSceneUuuhhh" parent="." instance=ExtResource( 2 )]
+[node name="PausePopup" type="Control" parent="."]
+pause_mode = 2
+visible = false
+anchor_right = 1.0
+anchor_bottom = 1.0
+margin_right = 40.0
+margin_bottom = 40.0
+
+[node name="Panel" type="Panel" parent="PausePopup"]
+anchor_right = 1.0
+anchor_bottom = 1.0
+margin_left = 300.0
+margin_top = 200.0
+margin_right = -300.0
+margin_bottom = -200.0
+theme = ExtResource( 3 )
+
+[node name="Label" type="Label" parent="PausePopup/Panel"]
+anchor_right = 1.0
+anchor_bottom = 0.3
+theme = ExtResource( 3 )
+custom_fonts/font = ExtResource( 4 )
+text = "Game is Paused"
+align = 1
+valign = 1
+
+[node name="VBoxContainer" type="VBoxContainer" parent="PausePopup/Panel"]
+anchor_top = 0.3
+anchor_right = 1.0
+anchor_bottom = 1.0
+margin_left = 500.0
+margin_right = -500.0
+custom_constants/separation = 20
+alignment = 1
+
+[node name="ResumeButton" type="Button" parent="PausePopup/Panel/VBoxContainer"]
+margin_top = 161.0
+margin_right = 360.0
+margin_bottom = 242.0
+text = "Resume"
+
+[node name="QuitButton" type="Button" parent="PausePopup/Panel/VBoxContainer"]
+margin_top = 262.0
+margin_right = 360.0
+margin_bottom = 343.0
+text = "Quit"
+
+[node name="Scoreboard" parent="." instance=ExtResource( 5 )]
+visible = false
+margin_right = -0.319946
+margin_bottom = 0.47998
+
+[node name="Level1" type="Spatial" parent="."]
+
+[node name="AudioStreamPlayer" type="AudioStreamPlayer" parent="."]
+stream = ExtResource( 6 )
+autoplay = true
+
+[connection signal="pressed" from="PausePopup/Panel/VBoxContainer/ResumeButton" to="." method="_on_ResumeButton_pressed"]
+[connection signal="pressed" from="PausePopup/Panel/VBoxContainer/QuitButton" to="." method="_on_QuitButton_pressed"]
diff --git a/godot/scenes/Menu.gd b/godot/scenes/Menu.gd
new file mode 100644
index 0000000..2634e37
--- /dev/null
+++ b/godot/scenes/Menu.gd
@@ -0,0 +1,25 @@
+extends Control
+
+
+# Declare member variables here. Examples:
+# var a = 2
+# var b = "text"
+
+
+# Called when the node enters the scene tree for the first time.
+func _ready():
+ pass # Replace with function body.
+
+
+# Called every frame. 'delta' is the elapsed time since the previous frame.
+func _process(delta):
+ pass
+
+
+func _on_StartButton_pressed():
+ get_tree().change_scene("res://scenes/Game.tscn")
+
+
+
+func _on_QuitButton_pressed():
+ get_tree().quit()
diff --git a/godot/scenes/Menu.tscn b/godot/scenes/Menu.tscn
new file mode 100644
index 0000000..792bc28
--- /dev/null
+++ b/godot/scenes/Menu.tscn
@@ -0,0 +1,47 @@
+[gd_scene load_steps=4 format=2]
+
+[ext_resource path="res://assets/theme.tres" type="Theme" id=1]
+[ext_resource path="res://scenes/Menu.gd" type="Script" id=2]
+[ext_resource path="res://assets/sounds/main_menu.mp3" type="AudioStream" id=3]
+
+[node name="Menu" type="Control"]
+anchor_right = 1.0
+anchor_bottom = 1.0
+script = ExtResource( 2 )
+
+[node name="VBoxContainer" type="VBoxContainer" parent="."]
+anchor_right = 0.25
+anchor_bottom = 1.0
+margin_left = 40.0
+margin_top = 789.0
+margin_bottom = -40.0
+theme = ExtResource( 1 )
+alignment = 2
+
+[node name="StartButton" type="Button" parent="VBoxContainer"]
+margin_top = 85.0
+margin_right = 440.0
+margin_bottom = 166.0
+focus_neighbour_top = NodePath("../QuitButton")
+text = "Start"
+
+[node name="LevelButton" type="Button" parent="VBoxContainer"]
+visible = false
+margin_top = 85.0
+margin_right = 440.0
+margin_bottom = 166.0
+text = "Levels"
+
+[node name="QuitButton" type="Button" parent="VBoxContainer"]
+margin_top = 170.0
+margin_right = 440.0
+margin_bottom = 251.0
+focus_neighbour_bottom = NodePath("../StartButton")
+text = "Quit"
+
+[node name="AudioStreamPlayer" type="AudioStreamPlayer" parent="."]
+stream = ExtResource( 3 )
+autoplay = true
+
+[connection signal="pressed" from="VBoxContainer/StartButton" to="." method="_on_StartButton_pressed"]
+[connection signal="pressed" from="VBoxContainer/QuitButton" to="." method="_on_QuitButton_pressed"]
diff --git a/godot/scenes/levels/GoalTriggerZone.tscn b/godot/scenes/levels/GoalTriggerZone.tscn
new file mode 100644
index 0000000..861db4d
--- /dev/null
+++ b/godot/scenes/levels/GoalTriggerZone.tscn
@@ -0,0 +1,14 @@
+[gd_scene load_steps=3 format=2]
+
+[ext_resource path="res://scripts/GoalTriggerBox.gd" type="Script" id=1]
+
+[sub_resource type="BoxShape" id=1]
+
+[node name="GoalTriggerZone" type="Area"]
+transform = Transform( 10, 0, 0, 0, 10, 0, 0, 0, 10, 20, 0, 0 )
+script = ExtResource( 1 )
+
+[node name="CollisionShape" type="CollisionShape" parent="."]
+shape = SubResource( 1 )
+
+[connection signal="body_entered" from="." to="." method="_on_Area2_body_entered"]
diff --git a/godot/scenes/levels/test_scene/TestScene.tscn b/godot/scenes/levels/test_scene/TestScene.tscn
deleted file mode 100644
index ed981f8..0000000
--- a/godot/scenes/levels/test_scene/TestScene.tscn
+++ /dev/null
@@ -1,11 +0,0 @@
-[gd_scene load_steps=3 format=2]
-
-[ext_resource path="res://scenes/levels/test_scene/Floor.tscn" type="PackedScene" id=1]
-[ext_resource path="res://scenes/W8.tscn" type="PackedScene" id=2]
-
-[node name="TestScene" type="Spatial"]
-
-[node name="Floor" parent="." instance=ExtResource( 1 )]
-
-[node name="RigidBody" parent="." instance=ExtResource( 2 )]
-transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0.0339947, 2.91518, -1.40456 )
diff --git a/godot/scenes/levels/test_scene_movement/Floor.tscn b/godot/scenes/levels/test_scene_movement/Floor.tscn
new file mode 100644
index 0000000..f8970a7
--- /dev/null
+++ b/godot/scenes/levels/test_scene_movement/Floor.tscn
@@ -0,0 +1,22 @@
+[gd_scene load_steps=5 format=2]
+
+[ext_resource path="res://assets/textures/grass-texture-26.jpg" type="Texture" id=1]
+
+[sub_resource type="CubeMesh" id=1]
+
+[sub_resource type="SpatialMaterial" id=3]
+albedo_texture = ExtResource( 1 )
+
+[sub_resource type="BoxShape" id=2]
+
+[node name="StaticBody" type="StaticBody"]
+
+[node name="MeshInstance" type="MeshInstance" parent="."]
+transform = Transform( 10, 0, 0, 0, 1, 0, 0, 0, 10, 0, 0, 0 )
+mesh = SubResource( 1 )
+skeleton = NodePath("../CollisionShape")
+material/0 = SubResource( 3 )
+
+[node name="CollisionShape" type="CollisionShape" parent="."]
+transform = Transform( 10, 0, 0, 0, 1, 0, 0, 0, 10, 0, 0, 0 )
+shape = SubResource( 2 )
diff --git a/godot/scenes/levels/test_scene_movement/TestSceneMovement.tscn b/godot/scenes/levels/test_scene_movement/TestSceneMovement.tscn
new file mode 100644
index 0000000..dc25498
--- /dev/null
+++ b/godot/scenes/levels/test_scene_movement/TestSceneMovement.tscn
@@ -0,0 +1,31 @@
+[gd_scene load_steps=4 format=2]
+
+[ext_resource path="res://scenes/levels/test_scene_uuuhhh/Wall.tscn" type="PackedScene" id=1]
+[ext_resource path="res://scenes/levels/test_scene_uuuhhh/Floor.tscn" type="PackedScene" id=2]
+[ext_resource path="res://scenes/Die.tscn" type="PackedScene" id=3]
+
+[node name="TestScene" type="Spatial"]
+
+[node name="Floor" parent="." instance=ExtResource( 2 )]
+transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0.0290833, -0.981747, 0.00208664 )
+
+[node name="Floor2" parent="." instance=ExtResource( 2 )]
+transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -1, -20 )
+
+[node name="Floor3" parent="." instance=ExtResource( 2 )]
+transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 20, -1, 0 )
+
+[node name="Floor4" parent="." instance=ExtResource( 2 )]
+transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 20, -1, -20 )
+
+[node name="Floor5" parent="." instance=ExtResource( 2 )]
+transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 40, -1, 0 )
+
+[node name="Floor6" parent="." instance=ExtResource( 2 )]
+transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 40, -1, -20 )
+
+[node name="Wall" parent="." instance=ExtResource( 1 )]
+transform = Transform( 0.766044, 0, 0.642788, 0, 2, 0, -0.642788, 0, 0.766044, 19.47, 0, -14 )
+
+[node name="Die" parent="." instance=ExtResource( 3 )]
+transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0.759363, 4.18965, -3.60846 )
diff --git a/godot/scenes/levels/test_scene_movement/Wall.tscn b/godot/scenes/levels/test_scene_movement/Wall.tscn
new file mode 100644
index 0000000..e3afe23
--- /dev/null
+++ b/godot/scenes/levels/test_scene_movement/Wall.tscn
@@ -0,0 +1,23 @@
+[gd_scene load_steps=5 format=2]
+
+[ext_resource path="res://assets/textures/sandstone-brick-wall-texture.jpg" type="Texture" id=1]
+
+[sub_resource type="CubeMesh" id=1]
+
+[sub_resource type="SpatialMaterial" id=2]
+albedo_texture = ExtResource( 1 )
+
+[sub_resource type="ConvexPolygonShape" id=3]
+points = PoolVector3Array( 1, 1, 1, 1, 1, -1, -1, 1, 1, 1, -1, 1, 1, -1, -1, -1, 1, -1, -1, -1, 1, -1, -1, -1 )
+
+[node name="StaticBody" type="StaticBody"]
+
+[node name="MeshInstance" type="MeshInstance" parent="."]
+transform = Transform( 0.3, 0, 0, 0, 1, 0, 0, 0, 5, 0, 1, 0 )
+mesh = SubResource( 1 )
+skeleton = NodePath("")
+material/0 = SubResource( 2 )
+
+[node name="CollisionShape" type="CollisionShape" parent="."]
+transform = Transform( 0.3, 0, 0, 0, 1, 0, 0, 0, 5, 0, 1, 0 )
+shape = SubResource( 3 )
diff --git a/godot/scenes/levels/test_scene_uuuhhh/TestSceneUuuhhh.tscn b/godot/scenes/levels/test_scene_uuuhhh/TestSceneUuuhhh.tscn
index a8f9003..0820451 100644
--- a/godot/scenes/levels/test_scene_uuuhhh/TestSceneUuuhhh.tscn
+++ b/godot/scenes/levels/test_scene_uuuhhh/TestSceneUuuhhh.tscn
@@ -4,7 +4,7 @@
[ext_resource path="res://scenes/levels/test_scene_uuuhhh/Floor.tscn" type="PackedScene" id=2]
[ext_resource path="res://scenes/scripts/roblox-cube.gd" type="Script" id=3]
[ext_resource path="res://assets/sounds/Uuhhh.mp3" type="AudioStream" id=4]
-[ext_resource path="res://scenes/objects/W8.tscn" type="PackedScene" id=5]
+[ext_resource path="res://scenes/Die.tscn" type="PackedScene" id=5]
[node name="TestScene" type="Spatial"]
diff --git a/godot/scenes/objects/Camera.tscn b/godot/scenes/objects/Camera.tscn
new file mode 100644
index 0000000..1c13dd0
--- /dev/null
+++ b/godot/scenes/objects/Camera.tscn
@@ -0,0 +1,10 @@
+[gd_scene format=2]
+
+[node name="CameraRoot" type="Spatial"]
+
+[node name="CameraArmHorizontal" type="Spatial" parent="."]
+
+[node name="CameraArmVertical" type="Spatial" parent="CameraArmHorizontal"]
+
+[node name="Camera" type="Camera" parent="CameraArmHorizontal/CameraArmVertical"]
+transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 10 )
diff --git a/godot/scenes/objects/Player.tscn b/godot/scenes/objects/Player.tscn
new file mode 100644
index 0000000..cc3662e
--- /dev/null
+++ b/godot/scenes/objects/Player.tscn
@@ -0,0 +1,18 @@
+[gd_scene load_steps=4 format=2]
+
+[ext_resource path="res://scenes/objects/W8.tscn" type="PackedScene" id=1]
+[ext_resource path="res://scenes/objects/Camera.tscn" type="PackedScene" id=2]
+[ext_resource path="res://native/BasicDie.gdns" type="Script" id=3]
+
+[node name="PlayerRoot" type="Spatial"]
+script = ExtResource( 3 )
+camera/camera_clamp = Vector2( 0, -1.3 )
+shooting/max_force = 30.0
+shooting/up_angle = 0.3
+shooting/stopping_velocity = 0.003
+
+[node name="W8" parent="." instance=ExtResource( 1 )]
+transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.1, 0 )
+
+[node name="Camera" parent="." instance=ExtResource( 2 )]
+transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2, 0 )
diff --git a/godot/scenes/objects/Scoreboard.gd b/godot/scenes/objects/Scoreboard.gd
new file mode 100644
index 0000000..0f6d32b
--- /dev/null
+++ b/godot/scenes/objects/Scoreboard.gd
@@ -0,0 +1,22 @@
+extends Control
+
+func update_values(values, pars):
+ $Panel/GridContainer/Player0.text = "%d" % values[0]
+ $Panel/GridContainer/Player1.text = "%d" % values[1]
+ $Panel/GridContainer/Player2.text = "%d" % values[2]
+ $Panel/GridContainer/Player3.text = "%d" % values[3]
+ $Panel/GridContainer/Player4.text = "%d" % values[4]
+ $Panel/GridContainer/Player5.text = "%d" % values[5]
+ $Panel/GridContainer/Player6.text = "%d" % values[6]
+ $Panel/GridContainer/Player7.text = "%d" % values[7]
+ $Panel/GridContainer/Player8.text = "%d" % values[8]
+
+ $Panel/GridContainer/Par0.text = "%d" % pars[0]
+ $Panel/GridContainer/Par1.text = "%d" % pars[1]
+ $Panel/GridContainer/Par2.text = "%d" % pars[2]
+ $Panel/GridContainer/Par3.text = "%d" % pars[3]
+ $Panel/GridContainer/Par4.text = "%d" % pars[4]
+ $Panel/GridContainer/Par5.text = "%d" % pars[5]
+ $Panel/GridContainer/Par6.text = "%d" % pars[6]
+ $Panel/GridContainer/Par7.text = "%d" % pars[7]
+ $Panel/GridContainer/Par8.text = "%d" % pars[8]
diff --git a/godot/scenes/objects/Scoreboard.tscn b/godot/scenes/objects/Scoreboard.tscn
new file mode 100644
index 0000000..ab9c887
--- /dev/null
+++ b/godot/scenes/objects/Scoreboard.tscn
@@ -0,0 +1,433 @@
+[gd_scene load_steps=3 format=2]
+
+[ext_resource path="res://assets/theme.tres" type="Theme" id=1]
+[ext_resource path="res://scenes/objects/Scoreboard.gd" type="Script" id=2]
+
+[node name="Scoreboard" type="Control"]
+anchor_right = 1.0
+anchor_bottom = 1.0
+margin_right = -0.320004
+margin_bottom = 0.48
+script = ExtResource( 2 )
+
+[node name="Panel" type="Panel" parent="."]
+anchor_right = 1.0
+anchor_bottom = 0.952
+margin_left = 120.0
+margin_top = 120.0
+margin_right = -119.68
+margin_bottom = -665.617
+
+[node name="GridContainer" type="GridContainer" parent="Panel"]
+anchor_right = 1.0
+anchor_bottom = 1.0
+margin_left = 50.0
+margin_top = 50.0
+columns = 10
+
+[node name="LabelHeader" type="Label" parent="Panel/GridContainer"]
+margin_right = 159.0
+margin_bottom = 51.0
+size_flags_horizontal = 3
+size_flags_vertical = 1
+size_flags_stretch_ratio = 20.0
+theme = ExtResource( 1 )
+text = "Hole"
+align = 3
+valign = 3
+autowrap = true
+
+[node name="Label" type="Label" parent="Panel/GridContainer"]
+margin_left = 163.0
+margin_right = 322.0
+margin_bottom = 51.0
+size_flags_horizontal = 3
+size_flags_vertical = 1
+size_flags_stretch_ratio = 20.0
+theme = ExtResource( 1 )
+text = "1"
+align = 3
+valign = 3
+autowrap = true
+
+[node name="Label2" type="Label" parent="Panel/GridContainer"]
+margin_left = 326.0
+margin_right = 485.0
+margin_bottom = 51.0
+size_flags_horizontal = 3
+size_flags_vertical = 1
+size_flags_stretch_ratio = 20.0
+theme = ExtResource( 1 )
+text = "2"
+align = 3
+valign = 3
+autowrap = true
+
+[node name="Label3" type="Label" parent="Panel/GridContainer"]
+margin_left = 489.0
+margin_right = 648.0
+margin_bottom = 51.0
+size_flags_horizontal = 3
+size_flags_vertical = 1
+size_flags_stretch_ratio = 20.0
+theme = ExtResource( 1 )
+text = "3"
+align = 3
+valign = 3
+autowrap = true
+
+[node name="Label4" type="Label" parent="Panel/GridContainer"]
+margin_left = 652.0
+margin_right = 811.0
+margin_bottom = 51.0
+size_flags_horizontal = 3
+size_flags_vertical = 1
+size_flags_stretch_ratio = 20.0
+theme = ExtResource( 1 )
+text = "4"
+align = 3
+valign = 3
+autowrap = true
+
+[node name="Label5" type="Label" parent="Panel/GridContainer"]
+margin_left = 815.0
+margin_right = 974.0
+margin_bottom = 51.0
+size_flags_horizontal = 3
+size_flags_vertical = 1
+size_flags_stretch_ratio = 20.0
+theme = ExtResource( 1 )
+text = "5"
+align = 3
+valign = 3
+autowrap = true
+
+[node name="Label6" type="Label" parent="Panel/GridContainer"]
+margin_left = 978.0
+margin_right = 1137.0
+margin_bottom = 51.0
+size_flags_horizontal = 3
+size_flags_vertical = 1
+size_flags_stretch_ratio = 20.0
+theme = ExtResource( 1 )
+text = "6"
+align = 3
+valign = 3
+autowrap = true
+
+[node name="Label7" type="Label" parent="Panel/GridContainer"]
+margin_left = 1141.0
+margin_right = 1300.0
+margin_bottom = 51.0
+size_flags_horizontal = 3
+size_flags_vertical = 1
+size_flags_stretch_ratio = 20.0
+theme = ExtResource( 1 )
+text = "7"
+align = 3
+valign = 3
+autowrap = true
+
+[node name="Label8" type="Label" parent="Panel/GridContainer"]
+margin_left = 1304.0
+margin_right = 1463.0
+margin_bottom = 51.0
+size_flags_horizontal = 3
+size_flags_vertical = 1
+size_flags_stretch_ratio = 20.0
+theme = ExtResource( 1 )
+text = "8"
+align = 3
+valign = 3
+autowrap = true
+
+[node name="Label9" type="Label" parent="Panel/GridContainer"]
+margin_left = 1467.0
+margin_right = 1626.0
+margin_bottom = 51.0
+size_flags_horizontal = 3
+size_flags_vertical = 1
+size_flags_stretch_ratio = 20.0
+theme = ExtResource( 1 )
+text = "9"
+align = 3
+valign = 3
+autowrap = true
+
+[node name="LabelHeader2" type="Label" parent="Panel/GridContainer"]
+margin_top = 55.0
+margin_right = 159.0
+margin_bottom = 106.0
+size_flags_horizontal = 3
+size_flags_vertical = 1
+size_flags_stretch_ratio = 20.0
+theme = ExtResource( 1 )
+text = "Par"
+align = 3
+valign = 3
+autowrap = true
+
+[node name="Par0" type="Label" parent="Panel/GridContainer"]
+margin_left = 163.0
+margin_top = 55.0
+margin_right = 322.0
+margin_bottom = 106.0
+size_flags_horizontal = 3
+size_flags_vertical = 1
+size_flags_stretch_ratio = 20.0
+theme = ExtResource( 1 )
+text = "0"
+align = 3
+valign = 3
+autowrap = true
+
+[node name="Par1" type="Label" parent="Panel/GridContainer"]
+margin_left = 326.0
+margin_top = 55.0
+margin_right = 485.0
+margin_bottom = 106.0
+size_flags_horizontal = 3
+size_flags_vertical = 1
+size_flags_stretch_ratio = 20.0
+theme = ExtResource( 1 )
+text = "0"
+align = 3
+valign = 3
+autowrap = true
+
+[node name="Par2" type="Label" parent="Panel/GridContainer"]
+margin_left = 489.0
+margin_top = 55.0
+margin_right = 648.0
+margin_bottom = 106.0
+size_flags_horizontal = 3
+size_flags_vertical = 1
+size_flags_stretch_ratio = 20.0
+theme = ExtResource( 1 )
+text = "0"
+align = 3
+valign = 3
+autowrap = true
+
+[node name="Par3" type="Label" parent="Panel/GridContainer"]
+margin_left = 652.0
+margin_top = 55.0
+margin_right = 811.0
+margin_bottom = 106.0
+size_flags_horizontal = 3
+size_flags_vertical = 1
+size_flags_stretch_ratio = 20.0
+theme = ExtResource( 1 )
+text = "0"
+align = 3
+valign = 3
+autowrap = true
+
+[node name="Par4" type="Label" parent="Panel/GridContainer"]
+margin_left = 815.0
+margin_top = 55.0
+margin_right = 974.0
+margin_bottom = 106.0
+size_flags_horizontal = 3
+size_flags_vertical = 1
+size_flags_stretch_ratio = 20.0
+theme = ExtResource( 1 )
+text = "0"
+align = 3
+valign = 3
+autowrap = true
+
+[node name="Par5" type="Label" parent="Panel/GridContainer"]
+margin_left = 978.0
+margin_top = 55.0
+margin_right = 1137.0
+margin_bottom = 106.0
+size_flags_horizontal = 3
+size_flags_vertical = 1
+size_flags_stretch_ratio = 20.0
+theme = ExtResource( 1 )
+text = "0"
+align = 3
+valign = 3
+autowrap = true
+
+[node name="Par6" type="Label" parent="Panel/GridContainer"]
+margin_left = 1141.0
+margin_top = 55.0
+margin_right = 1300.0
+margin_bottom = 106.0
+size_flags_horizontal = 3
+size_flags_vertical = 1
+size_flags_stretch_ratio = 20.0
+theme = ExtResource( 1 )
+text = "0"
+align = 3
+valign = 3
+autowrap = true
+
+[node name="Par7" type="Label" parent="Panel/GridContainer"]
+margin_left = 1304.0
+margin_top = 55.0
+margin_right = 1463.0
+margin_bottom = 106.0
+size_flags_horizontal = 3
+size_flags_vertical = 1
+size_flags_stretch_ratio = 20.0
+theme = ExtResource( 1 )
+text = "0"
+align = 3
+valign = 3
+autowrap = true
+
+[node name="Par8" type="Label" parent="Panel/GridContainer"]
+margin_left = 1467.0
+margin_top = 55.0
+margin_right = 1626.0
+margin_bottom = 106.0
+size_flags_horizontal = 3
+size_flags_vertical = 1
+size_flags_stretch_ratio = 20.0
+theme = ExtResource( 1 )
+text = "0"
+align = 3
+valign = 3
+autowrap = true
+
+[node name="LabelHeader3" type="Label" parent="Panel/GridContainer"]
+margin_top = 110.0
+margin_right = 159.0
+margin_bottom = 161.0
+size_flags_horizontal = 3
+size_flags_vertical = 1
+size_flags_stretch_ratio = 20.0
+theme = ExtResource( 1 )
+text = "Player"
+align = 3
+valign = 3
+autowrap = true
+
+[node name="Player0" type="Label" parent="Panel/GridContainer"]
+margin_left = 163.0
+margin_top = 110.0
+margin_right = 322.0
+margin_bottom = 161.0
+size_flags_horizontal = 3
+size_flags_vertical = 1
+size_flags_stretch_ratio = 20.0
+theme = ExtResource( 1 )
+text = "0"
+align = 3
+valign = 3
+autowrap = true
+
+[node name="Player1" type="Label" parent="Panel/GridContainer"]
+margin_left = 326.0
+margin_top = 110.0
+margin_right = 485.0
+margin_bottom = 161.0
+size_flags_horizontal = 3
+size_flags_vertical = 1
+size_flags_stretch_ratio = 20.0
+theme = ExtResource( 1 )
+text = "0"
+align = 3
+valign = 3
+autowrap = true
+
+[node name="Player2" type="Label" parent="Panel/GridContainer"]
+margin_left = 489.0
+margin_top = 110.0
+margin_right = 648.0
+margin_bottom = 161.0
+size_flags_horizontal = 3
+size_flags_vertical = 1
+size_flags_stretch_ratio = 20.0
+theme = ExtResource( 1 )
+text = "0"
+align = 3
+valign = 3
+autowrap = true
+
+[node name="Player3" type="Label" parent="Panel/GridContainer"]
+margin_left = 652.0
+margin_top = 110.0
+margin_right = 811.0
+margin_bottom = 161.0
+size_flags_horizontal = 3
+size_flags_vertical = 1
+size_flags_stretch_ratio = 20.0
+theme = ExtResource( 1 )
+text = "0"
+align = 3
+valign = 3
+autowrap = true
+
+[node name="Player4" type="Label" parent="Panel/GridContainer"]
+margin_left = 815.0
+margin_top = 110.0
+margin_right = 974.0
+margin_bottom = 161.0
+size_flags_horizontal = 3
+size_flags_vertical = 1
+size_flags_stretch_ratio = 20.0
+theme = ExtResource( 1 )
+text = "0"
+align = 3
+valign = 3
+autowrap = true
+
+[node name="Player5" type="Label" parent="Panel/GridContainer"]
+margin_left = 978.0
+margin_top = 110.0
+margin_right = 1137.0
+margin_bottom = 161.0
+size_flags_horizontal = 3
+size_flags_vertical = 1
+size_flags_stretch_ratio = 20.0
+theme = ExtResource( 1 )
+text = "0"
+align = 3
+valign = 3
+autowrap = true
+
+[node name="Player6" type="Label" parent="Panel/GridContainer"]
+margin_left = 1141.0
+margin_top = 110.0
+margin_right = 1300.0
+margin_bottom = 161.0
+size_flags_horizontal = 3
+size_flags_vertical = 1
+size_flags_stretch_ratio = 20.0
+theme = ExtResource( 1 )
+text = "0"
+align = 3
+valign = 3
+autowrap = true
+
+[node name="Player7" type="Label" parent="Panel/GridContainer"]
+margin_left = 1304.0
+margin_top = 110.0
+margin_right = 1463.0
+margin_bottom = 161.0
+size_flags_horizontal = 3
+size_flags_vertical = 1
+size_flags_stretch_ratio = 20.0
+theme = ExtResource( 1 )
+text = "0"
+align = 3
+valign = 3
+autowrap = true
+
+[node name="Player8" type="Label" parent="Panel/GridContainer"]
+margin_left = 1467.0
+margin_top = 110.0
+margin_right = 1626.0
+margin_bottom = 161.0
+size_flags_horizontal = 3
+size_flags_vertical = 1
+size_flags_stretch_ratio = 20.0
+theme = ExtResource( 1 )
+text = "0"
+align = 3
+valign = 3
+autowrap = true
diff --git a/godot/scenes/objects/W8.tscn b/godot/scenes/objects/W8.tscn
index 91f58eb..8766011 100644
--- a/godot/scenes/objects/W8.tscn
+++ b/godot/scenes/objects/W8.tscn
@@ -1,4 +1,4 @@
-[gd_scene load_steps=4 format=2]
+[gd_scene load_steps=6 format=2]
[ext_resource path="res://assets/game_objects/W8baseColor_Mat.material" type="Material" id=2]
@@ -20,12 +20,27 @@ surfaces/0 = {
[sub_resource type="ConvexPolygonShape" id=2]
points = PoolVector3Array( -0.0850063, -0.879389, -0.0282584, 0.0288993, 0.929375, 0.0289349, 0.0288993, 0.929375, -0.0289349, 0.929367, -0.0289314, 0.0289314, -0.0289784, -0.0289338, 0.929338, -0.929369, 0.028929, 0.028929, 0.0288993, -0.0289349, -0.929375, 0.0288993, -0.929375, 0.0289349, -0.0850063, 0.0282584, -0.879389, 0.0282247, 0.084959, 0.87945, 0.857489, 0.056933, -0.0855785, -0.879454, -0.0849424, 0.0282549, 0.0570775, -0.885814, -0.0571088, 0.0570775, -0.0571088, 0.885814, -0.0571532, 0.885743, -0.0571043, -0.0571532, 0.885743, 0.0571043, 0.0570775, 0.0571088, -0.885814, -0.885806, -0.057097, -0.057097, 0.879446, 0.0849494, 0.0282572, 0.857335, -0.0571018, -0.0855632, -0.0571532, 0.0571043, 0.885743, -0.0571532, -0.885743, 0.0571043, -0.885806, 0.057097, -0.057097, -0.0571532, -0.0571043, -0.885743, 0.0570775, 0.0571088, 0.885814, -0.0571532, -0.885743, -0.0571043, -0.0571532, 0.0571043, -0.885743, 0.0570775, -0.885814, 0.0571088, 0.0570775, 0.885814, 0.0571088, -0.0571532, -0.0571043, 0.885743, -0.885806, 0.057097, 0.057097, 0.0570775, 0.885814, -0.0571088, 0.0570775, -0.0571088, -0.885814, 0.857335, -0.0571018, 0.0855632, -0.885806, -0.057097, 0.057097, 0.857489, 0.056933, 0.0855785, 0.929425, 0.0287513, -0.0289333, 0.929367, -0.0289314, -0.0289314, -0.0289784, 0.929338, -0.0289338, 0.0288993, 0.0289349, -0.929375, -0.929369, -0.028929, -0.028929, -0.0283039, -0.87942, -0.0849561, 0.084933, 0.0282608, 0.879461, -0.0289784, 0.929338, 0.0289338, -0.0289784, -0.0289338, -0.929338, -0.0289784, 0.0289338, 0.929338, 0.0288993, -0.0289349, 0.929375, 0.0288993, -0.929375, -0.0289349, -0.0289784, -0.929338, 0.0289338, -0.929369, 0.028929, -0.028929, -0.0283039, 0.0849561, -0.87942, -0.879454, -0.0282549, 0.0849424, 0.879512, 0.0280816, 0.0849558, 0.879446, -0.0849494, -0.0282572, -0.0282988, -0.822574, 0.141805, 0.17021, 0.0280745, -0.794261, -0.879454, 0.0849424, -0.0282549, -0.0283039, 0.87942, 0.0849561, 0.0282247, 0.87945, -0.084959, 0.0282247, -0.084959, -0.87945, -0.879454, -0.0282549, -0.0849424, -0.0850063, 0.0282584, 0.879389, -0.0850063, 0.879389, 0.0282584, 0.084933, -0.0282608, 0.879461 )
+[sub_resource type="SphereShape" id=3]
+
+[sub_resource type="SphereMesh" id=4]
+
[node name="RigidBody" type="RigidBody"]
-[node name="Cone" type="MeshInstance" parent="."]
+[node name="MeshDie" type="MeshInstance" parent="."]
mesh = SubResource( 1 )
skeleton = NodePath("../..")
material/0 = null
-[node name="CollisionShape" type="CollisionShape" parent="."]
+[node name="CollisionShapeDie" type="CollisionShape" parent="."]
shape = SubResource( 2 )
+
+[node name="CollisionShapeSphere" type="CollisionShape" parent="."]
+transform = Transform( 0.7, 0, 0, 0, 0.7, 0, 0, 0, 0.7, 0, 0, 0 )
+shape = SubResource( 3 )
+disabled = true
+
+[node name="MeshSphere" type="MeshInstance" parent="."]
+transform = Transform( 0.7, 0, 0, 0, 0.7, 0, 0, 0, 0.7, 0, 0, 0 )
+visible = false
+mesh = SubResource( 4 )
+material/0 = ExtResource( 2 )
diff --git a/godot/scenes/objects/old/Die.tscn b/godot/scenes/objects/old/Die.tscn
new file mode 100644
index 0000000..cab0d15
--- /dev/null
+++ b/godot/scenes/objects/old/Die.tscn
@@ -0,0 +1,11 @@
+[gd_scene load_steps=2 format=2]
+
+[ext_resource path="res://scenes/Die.tscn" type="PackedScene" id=1]
+
+[node name="Die" type="Spatial"]
+
+[node name="Die" parent="." instance=ExtResource( 1 )]
+transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.1, 0 )
+
+[node name="CamRoot" type="Spatial" parent="Die"]
+transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -1.1, 0 )
diff --git a/godot/scenes/scripts/roblox-cube.gd b/godot/scenes/scripts/roblox-cube.gd
deleted file mode 100644
index 453067b..0000000
--- a/godot/scenes/scripts/roblox-cube.gd
+++ /dev/null
@@ -1,22 +0,0 @@
-extends Spatial
-
-
-# Declare member variables here. Examples:
-# var a = 2
-# var b = "text"
-func on_collision(other):
- var ap = get_parent().get_node("AudioStreamPlayer")
- ap.play()
-
-
-# Called when the node enters the scene tree for the first time.
-func _ready():
- var rb = self
- rb.apply_impulse(Vector3(), Vector3(40, 1, 10))
- rb.connect("body_entered", self, "on_collision")
-
-
-# Called every frame. 'delta' is the elapsed time since the previous frame.
-#func _process(delta):
-# pass
-
diff --git a/godot/scripts/GoalTriggerBox.gd b/godot/scripts/GoalTriggerBox.gd
new file mode 100644
index 0000000..6e1034b
--- /dev/null
+++ b/godot/scripts/GoalTriggerBox.gd
@@ -0,0 +1,22 @@
+extends Area
+
+const Loader = preload("res://scenes/Game.gd")
+var loader: Loader = null
+
+# Called when the node enters the scene tree for the first time.
+func _ready():
+ loader = get_node("/root/Game")
+
+
+# Called every frame. 'delta' is the elapsed time since the previous frame.
+#func _process(delta):
+# pass
+
+
+func _on_Area2_body_entered(body: RigidBody):
+ # return when body is not a rigidbody
+ if body == null:
+ return
+
+ loader.end_level()
+
diff --git a/lib/x86_64-pc-windows-msvc/code_with_your_friends2022.dll b/lib/x86_64-pc-windows-msvc/code_with_your_friends2022.dll
new file mode 100644
index 0000000..9c500ba
--- /dev/null
+++ b/lib/x86_64-pc-windows-msvc/code_with_your_friends2022.dll
Binary files differ
diff --git a/lib/x86_64-unknown-linux-gnu/libcode_with_your_friends2022.so b/lib/x86_64-unknown-linux-gnu/libcode_with_your_friends2022.so
index 14b6058..962bdb5 100755
--- a/lib/x86_64-unknown-linux-gnu/libcode_with_your_friends2022.so
+++ b/lib/x86_64-unknown-linux-gnu/libcode_with_your_friends2022.so
Binary files differ
diff --git a/rust/src/basic_die.rs b/rust/src/basic_die.rs
new file mode 100644
index 0000000..304df90
--- /dev/null
+++ b/rust/src/basic_die.rs
@@ -0,0 +1,402 @@
+use std::borrow::Borrow;
+use gdnative::api::*;
+use gdnative::prelude::*;
+use gdnative::core_types::VariantArray;
+use crate::buff_trait::Buff;
+use crate::buff_ball::BuffBall;
+use crate::buff_bounce::BuffBounce;
+use crate::buff_phase::BuffPhase;
+use crate::buff_extra::BuffExtra;
+
+/// the input state for the player
+enum InputState {
+ Default,
+ Shooting,
+ Moving
+}
+
+
+type SpatialRef = Option<Ref<Spatial>>;
+type NodeRef = Option<Ref<Node>>;
+
+/// the basic die used by the player
+#[derive(NativeClass)]
+#[inherit(Spatial)]
+#[register_with(Self::register_builder)]
+pub struct BasicDie {
+ #[property(path="camera/camera_clamp")]
+ camera_clamp: Vector2,
+ #[property(path="shooting/max_force")]
+ max_force: f32,
+ #[property(path="shooting/up_angle")]
+ up_angle: f32,
+ #[property(path="shooting/stopping_velocity")]
+ stopping_velocity: f32,
+ #[property(path="shooting/stopping_min_milliseconds")]
+ stopping_min_ms: i64,
+ #[property(path="input/camera_mouse_sensitivity")]
+ mouse_sensitivity: Vector2,
+ #[property(path="input/shoot_sensitivity")]
+ shoot_sensitivity: f32,
+ #[property(path="input/current_buff_index")]
+ current_buff_index: i32,
+
+ all_buffs: [Option<Box<dyn Buff>>; 5],
+
+ input_state: InputState,
+ current_force: f32,
+ last_shot_time: i64,
+
+ action_shooting: String,
+
+ node_die: SpatialRef,
+
+ node_camera_root: SpatialRef,
+ node_camera_arm_horizontal: SpatialRef,
+ node_camera_arm_vertical: SpatialRef,
+ node_camera: SpatialRef,
+ node_loader: NodeRef,
+}
+
+#[methods]
+impl BasicDie {
+ // Register the builder for methods, properties and/or signals.
+ fn register_builder(_builder: &ClassBuilder<Self>) {
+ godot_print!("BasicDie builder is registered!");
+ }
+
+ fn new(_owner: &Spatial) -> Self {
+ BasicDie {
+ camera_clamp: Vector2 { x: 0.0, y: 0.0 },
+ max_force: 0.0,
+ up_angle: 5.0,
+ stopping_velocity: 0.0,
+ stopping_min_ms: 1000,
+ mouse_sensitivity: Vector2 { x: 1.0, y: 1.0 },
+ shoot_sensitivity: 1.0,
+ current_buff_index: 0,
+ all_buffs: [None, None, None, None, None],
+
+ input_state: InputState::Default,
+ current_force: 0.0,
+ last_shot_time: 0,
+
+ action_shooting: String::from("mouse_btn_left"),
+
+ node_die: None,
+
+ node_camera_root: None,
+ node_camera_arm_horizontal: None,
+ node_camera_arm_vertical: None,
+ node_camera: None,
+ node_loader: None,
+ }
+ }
+
+ #[export]
+ unsafe fn _ready(&mut self, owner: &Spatial) {
+
+ Input::godot_singleton().set_mouse_mode(Input::MOUSE_MODE_CAPTURED);
+ owner.set_physics_process(true);
+
+ self.last_shot_time = OS::godot_singleton().get_ticks_msec();
+
+ let search_node = | parent: &SpatialRef, name: String | {
+ let parent_node = match parent {
+ Some(node) => node.assume_safe().as_ref(),
+ None => owner
+ };
+ match parent_node.get_node(NodePath::from_str(&name)) {
+ None => { godot_warn!("Could not find {}.", name); None },
+ Some(node) => {
+ let save_node = node.assume_safe();
+ match save_node.cast::<Spatial>() {
+ None => { godot_warn!("{} was not of type 'Spatial'.", name); None },
+ Some(casted) => Some(casted.claim())
+ }
+ }
+ }
+ };
+
+ // look for the camera and arm nodes
+ self.node_camera_root = search_node(&None, String::from("Camera"));
+ self.node_camera_arm_horizontal = search_node(&self.node_camera_root, String::from("CameraArmHorizontal"));
+ self.node_camera_arm_vertical = search_node(&self.node_camera_arm_horizontal, String::from("CameraArmVertical"));
+ self.node_camera = search_node(&self.node_camera_arm_vertical, String::from("Camera"));
+
+ // look for the level loader in the hierarchy
+ self.node_loader = owner.get_node("/root/Game/LevelLoader");
+
+ godot_print!("{:?}", self.node_camera_root);
+ godot_print!("{:?}", self.node_camera_arm_horizontal);
+ godot_print!("{:?}", self.node_camera_arm_vertical);
+ godot_print!("{:?}", self.node_camera);
+ godot_print!("{:?}", self.node_loader);
+
+ self.node_die = search_node(&None, String::from("W8"));
+
+ let die = match self.node_die {
+ None => { godot_warn!("No W8 assigned."); return; },
+ Some(node) =>
+ match node.assume_safe().cast::<RigidBody>() {
+ None => { godot_warn!("W8 is not a RigidBody."); return; },
+ Some(rb) => rb.claim()
+ }
+ };
+
+ self.all_buffs = [
+ None,
+ Some(Box::new(BuffBall ::new(Box::new(die)))),
+ Some(Box::new(BuffBounce::new(Box::new(die)))),
+ Some(Box::new(BuffPhase ::new(Box::new(die)))),
+ Some(Box::new(BuffExtra ::new())),
+ ];
+
+ godot_print!("Current Buff: {}", self.current_buff_index);
+ godot_print!("Player is ready");
+ }
+
+ #[export]
+ unsafe fn _physics_process(&mut self, _owner: &Spatial, _delta: f64) {
+
+ let die = match self.node_die {
+ None => { godot_warn!("No W8 assigned."); return; },
+ Some(node) => match node.assume_safe().cast::<RigidBody>() {
+ None => { godot_warn!("W8 is not a RigidBody."); return; },
+ Some(rb) => rb
+ }
+ };
+
+ // let the cam follow the die
+ match self.node_camera_root {
+ None => { godot_warn!("No W8 assigned."); },
+ Some(cam) => {
+ cam.assume_safe().set_translation(die.translation());
+ }
+ }
+
+ let delta_ms = OS::godot_singleton().get_ticks_msec() - self.last_shot_time;
+
+ // deactivate the Ball Buff after 5 seconds
+ if matches!(self.input_state, InputState::Moving)
+ && delta_ms > 5000
+ && self.current_buff_index == 1 {
+ self.stop_die(_owner);
+ }
+
+ // detect if the die stops moving
+ if matches!(self.input_state, InputState::Moving)
+ && (delta_ms > self.stopping_min_ms) {
+
+ // check if the velocity is less than the threshold and change input state in that case
+ let current_vel = die.linear_velocity().length();
+ if current_vel <= self.stopping_velocity {
+ self.input_state = InputState::Default;
+ godot_print!("Die stopped moving at velocity {} after {} ms", current_vel, delta_ms);
+
+ self.stop_die(_owner);
+ }
+ };
+ }
+
+ #[export]
+ unsafe fn _input(&mut self, _owner: &Spatial, event: Ref<InputEvent>) {
+
+ self.general_input(event.borrow());
+
+ match self.input_state {
+ InputState::Default => self.default_input(event),
+ InputState::Shooting => self.shooting_input(event),
+ InputState::Moving => self.moving_input(event),
+ }
+ }
+
+ /// this input method will always be called, regardless of the input state
+ unsafe fn general_input(&mut self, event: &Ref<InputEvent>) {
+ let save_event = event.assume_safe();
+
+ // rotate camera horizontally
+ let mouse_event = save_event.cast::<InputEventMouseMotion>(); // get the input as mouse input
+ match mouse_event {
+ Some(motion_event) => {
+ let x_mov = motion_event.relative().x * self.mouse_sensitivity.x;
+ self.rotate_cam_horizontal(x_mov);
+ },
+ _ => {}
+ }
+
+ let key_event = save_event.cast::<InputEventKey>();
+ match key_event {
+ Some(key_event) => {
+ if key_event.scancode() == GlobalConstants::KEY_ESCAPE {
+ Input::godot_singleton().set_mouse_mode(Input::MOUSE_MODE_VISIBLE);
+ }
+ },
+ _ => {}
+ }
+ }
+
+ /// this input method will be called when looking around, before taking a shot
+ unsafe fn default_input(&mut self, event: Ref<InputEvent>) {
+ let save_event = event.assume_safe();
+
+ // left mouse button was pressed => switch to shooting mode
+ if save_event.is_action_pressed(GodotString::from_str(&self.action_shooting), false, false) {
+ godot_print!("mouse_button, switching to shooting mode");
+ self.input_state = InputState::Shooting;
+ return;
+ }
+
+ // rotate camera vertically
+ let mouse_event = save_event.cast::<InputEventMouseMotion>(); // get the input as mouse input
+ match mouse_event {
+ Some(motion_event) => {
+ let y_mov = -motion_event.relative().y * self.mouse_sensitivity.y;
+ self.rotate_cam_vertical(y_mov);
+ },
+ _ => {}
+ };
+ }
+
+ /// this input method will be called when player is currently taking a shot
+ unsafe fn shooting_input(&mut self, event: Ref<InputEvent>) {
+ let save_event = event.assume_safe();
+
+ // mouse released, shoot
+ if save_event.is_action_released(GodotString::from_str(&self.action_shooting), false) {
+ self.input_state = InputState::Moving;
+ self.shoot();
+ self.current_force = 0.0;
+ return;
+ }
+
+ // charge shot with vertical mouse movement
+ let mouse_event = save_event.cast::<InputEventMouseMotion>(); // get the input as mouse input
+ match mouse_event {
+ Some(motion_event) => {
+ let y_mov = motion_event.relative().y * self.shoot_sensitivity;
+ self.current_force = match self.current_force + y_mov {
+ x if x < 0.0 => 0.0,
+ x if x > self.max_force => self.max_force,
+ x => x
+ };
+
+ godot_print!("current force: {}", self.current_force);
+ },
+ _ => {}
+ };
+ }
+
+ /// this input method will be called when player is moving
+ unsafe fn moving_input(&mut self, event: Ref<InputEvent>) {
+ let save_event = event.assume_safe();
+
+ // rotate camera vertically
+ let mouse_event = save_event.cast::<InputEventMouseMotion>(); // get the input as mouse input
+ match mouse_event {
+ Some(motion_event) => {
+ let y_mov = motion_event.relative().y * self.mouse_sensitivity.y;
+ self.rotate_cam_vertical(y_mov);
+ },
+ _ => {}
+ };
+ }
+
+ unsafe fn rotate_cam_horizontal(&mut self, input: f32) {
+ // make sure the arm exists
+ match self.node_camera_arm_horizontal {
+ Some(arm) => {
+ // rotate the horizontal camera arm
+ let save_arm = arm.assume_safe();
+ save_arm.rotate_object_local(Vector3 {x: 0.0, y: 1.0, z: 0.0}, input as f64)
+ },
+ _ => godot_warn!("No horizontal camera arm assigned.")
+ }
+ }
+
+ unsafe fn rotate_cam_vertical(&mut self, input: f32) {
+ // make sure the camera arm actually exists
+ match self.node_camera_arm_vertical {
+ Some(arm) => {
+ // check for the current rotation
+ let save_arm = arm.assume_safe();
+ let current_rot = save_arm.rotation();
+
+ // clamp the rotation
+ if current_rot.x + input > self.camera_clamp.x || current_rot.x + input <= self.camera_clamp.y {
+ return;
+ }
+
+ // actually rotate if possible
+ let save_arm = arm.assume_safe();
+ save_arm.rotate_object_local(Vector3 {x: 1.0, y: 0.0, z: 0.0}, input as f64)
+ },
+ _ => godot_warn!("No vertical camera arm assigned")
+ }
+ }
+
+ unsafe fn shoot(&mut self) {
+
+ // make sure the camera actually exists
+ let impulse_dir = match self.node_camera {
+ None => { godot_warn!("No camera assigned!"); return; },
+ Some(cam) => {
+ // get the forward vector of the camera setting the up angle to the defined value in the editor
+ let mut forward_vector = -cam.assume_safe().global_transform().basis.c().normalized();
+ forward_vector.y = self.up_angle;
+
+ // calculate the impulse force
+ forward_vector.normalized() * self.current_force
+ }
+ };
+
+ // get the die
+ let die = match self.node_die {
+ None => { godot_warn!("No W8 assigned."); return; },
+ Some(node) =>
+ match node.assume_safe().cast::<RigidBody>() {
+ None => { godot_warn!("W8 is not a RigidBody."); return; },
+ Some(rb) => rb
+ }
+ };
+
+ // actually add the force
+ die.apply_impulse(die.transform().origin, impulse_dir);
+
+ self.last_shot_time = OS::godot_singleton().get_ticks_msec();
+
+ // call the stuff in GDScript
+ match self.node_loader {
+ Some(loader) => {
+ let save_loader = loader.assume_safe();
+ save_loader.call("add_stroke", &[]);
+ },
+ None => godot_warn!("No node loader assigned"),
+ }
+ }
+
+ unsafe fn stop_die(&mut self, owner: &Spatial) {
+ //deactivate the old buff
+ godot_print!("Current Buff: {}", self.current_buff_index);
+ match self.all_buffs[self.current_buff_index as usize] {
+ Some(ref mut buff) => buff.revert_buff(),
+ None => {}
+ }
+
+ // get the facing direction of the die and determine the next buff based on that
+ match self.node_die {
+ Some(die) => {
+ let forward = die.assume_safe().global_transform().basis.c().normalized();
+ godot_print!("forward: {} | {} | {}", forward.x, forward.y, forward.z);
+ },
+ None => {}
+ }
+
+ // apply the current buff
+ godot_print!("Current Buff: {}", self.current_buff_index);
+ match self.all_buffs[self.current_buff_index as usize] {
+ Some(ref mut buff) => buff.execute_buff(),
+ None => {}
+ }
+ }
+}
diff --git a/rust/src/buff_ball.rs b/rust/src/buff_ball.rs
index 4b89dbb..219e675 100644
--- a/rust/src/buff_ball.rs
+++ b/rust/src/buff_ball.rs
@@ -2,71 +2,66 @@ use gdnative::api::*;
use gdnative::prelude::*;
use crate::buff_trait::Buff;
-struct BuffBall {
+pub struct BuffBall {
name: String,
description: String,
-
- die_body: Option<Ref<RigidBody>>,
- sphere_body: Option<Ref<RigidBody>>
+ collision_die: Ref<CollisionShape>,
+ collision_sphere: Ref<CollisionShape>,
+ mesh_die: Ref<MeshInstance>,
+ mesh_sphere: Ref<MeshInstance>,
}
impl BuffBall {
- fn new(die_body: Option<Ref<RigidBody>>, sphere_body: Option<Ref<RigidBody>>) -> Self {
+
+ pub fn new(die_body: Box<Ref<RigidBody>>) -> Self {
+
+ // find a collision shape
+ fn search<T: SubClass<Node>> (die_body: &Box<Ref<RigidBody>>, name: String) -> Option<Ref<T>> {
+ unsafe{
+ match die_body.assume_safe().get_node(&name) {
+ None => {
+ godot_warn!("Could not find {}", name);
+ None
+ }
+ Some(node) => {
+ match node.assume_safe().cast::<T>() {
+ None => {
+ godot_warn!("{} is not a {}", name, std::any::type_name::<T>());
+ None
+ },
+ Some(cs) => Some(cs.claim())
+ }
+ }
+ }
+ }
+ }
+
BuffBall {
name: String::from("Ball"),
description: String::from("Roll the dice"),
-
- die_body,
- sphere_body
+ collision_die: search::<CollisionShape>(&die_body, String::from("CollisionShapeDie" )).unwrap(),
+ collision_sphere: search::<CollisionShape>(&die_body, String::from("CollisionShapeSphere")).unwrap(),
+ mesh_die: search::<MeshInstance>(&die_body, String::from("MeshDie" )).unwrap(),
+ mesh_sphere: search::<MeshInstance>(&die_body, String::from("MeshSphere")).unwrap(),
}
}
}
impl Buff for BuffBall {
unsafe fn execute_buff(&mut self) {
- // make sure the sphere rigid body exists
- match &self.sphere_body {
- Some(sphere) => {
- // make sure the dice rigid body exists
- match &self.die_body {
- Some(die) => {
- // get the safe references from the ref<>
- let save_sphere = sphere.assume_safe();
- let save_die = die.assume_safe();
-
- // set the properties of the rigid bodies
- save_die.set_process(false);
- save_sphere.set_process(true);
- save_sphere.show();
- },
- None => godot_warn!("Die body not assigned")
- }
- },
- None => godot_warn!("Sphere body not assigned")
- }
+ self.collision_die.assume_safe().set_disabled(true);
+ self.collision_sphere.assume_safe().set_disabled(false);
+ self.mesh_die.assume_safe().set_visible(false);
+ self.mesh_sphere.assume_safe().set_visible(true);
+ godot_print!("Ball activated");
}
unsafe fn revert_buff(&mut self) {
- // make sure the sphere rigid body exists
- match &self.sphere_body {
- Some(sphere) => {
- // make sure the dice rigid body exists
- match &self.die_body {
- Some(die) => {
- // get the safe references from the ref<>
- let save_sphere = sphere.assume_safe();
- let save_die = die.assume_safe();
-
- // set the properties of the rigid bodies
- save_die.set_process(true);
- save_sphere.set_process(false);
- save_sphere.hide();
- },
- None => godot_warn!("Die body not assigned")
- }
- },
- None => godot_warn!("Sphere body not assigned")
- }
+ self.collision_die.assume_safe().set_disabled(false);
+ self.collision_sphere.assume_safe().set_disabled(true);
+ self.mesh_sphere.assume_safe().set_visible(false);
+ self.mesh_die.assume_safe().set_visible(true);
+ godot_print!("Ball deactivated");
}
fn get_name(self) -> GodotString {
diff --git a/rust/src/buff_bounce.rs b/rust/src/buff_bounce.rs
index 179642d..cb9ded8 100644
--- a/rust/src/buff_bounce.rs
+++ b/rust/src/buff_bounce.rs
@@ -2,22 +2,21 @@ use gdnative::api::*;
use gdnative::prelude::*;
use crate::buff_trait::Buff;
-struct BuffBounce {
+pub struct BuffBounce {
name: String,
description: String,
- rigid_body: Option<Ref<RigidBody>>,
+ rigid_body: Box<Ref<RigidBody>>,
target_bounciness: f64,
previous_bounciness: f64
}
impl BuffBounce {
- fn new(rigid_body: Option<Ref<RigidBody>>) -> Self {
+ pub fn new(rigid_body: Box<Ref<RigidBody>>) -> Self {
BuffBounce {
name: String::from("Bounce"),
description: String::from("Let's the die bounce more than usual."),
rigid_body,
-
target_bounciness: 1.0,
previous_bounciness: 0.0
}
@@ -25,43 +24,30 @@ impl BuffBounce {
}
impl Buff for BuffBounce {
- unsafe fn execute_buff(&mut self) {
- // make sure the rigid body exists
- match &self.rigid_body {
- Some(body) => {
- let safe_body = body.assume_safe();
- // get the physics material
- match safe_body.physics_material_override() {
- Some(mat) => {
- let save_mat = mat.assume_safe();
- self.previous_bounciness = save_mat.bounce();
- save_mat.set_bounce(self.target_bounciness);
- },
- None => godot_warn!("Physics material was not found")
- }
+ unsafe fn execute_buff(&mut self) {
+ // get the physics material
+ match self.rigid_body.assume_safe().physics_material_override() {
+ Some(mat) => {
+ let save_mat = mat.assume_safe();
+ self.previous_bounciness = save_mat.bounce();
+ save_mat.set_bounce(self.target_bounciness);
},
- None => godot_warn!("No rigid body initialized to apply properties to")
+ None => godot_warn!("Physics material was not found")
}
+ godot_print!("Bounce activated");
}
unsafe fn revert_buff(&mut self) {
- // make sure the rigid body exists
- match &self.rigid_body {
- Some(body) => {
- let safe_body = body.assume_safe();
-
- // get the physics material
- match safe_body.physics_material_override() {
- Some(mat) => {
- let save_mat = mat.assume_safe();
- save_mat.set_bounce(self.previous_bounciness);
- },
- None => godot_warn!("Physics material was not found")
- }
+ // get the physics material
+ match self.rigid_body.assume_safe().physics_material_override() {
+ Some(mat) => {
+ let save_mat = mat.assume_safe();
+ save_mat.set_bounce(self.previous_bounciness);
},
- None => godot_warn!("No rigid body initialized to apply properties to")
+ None => godot_warn!("Physics material was not found")
}
+ godot_print!("Bounce deactivated");
}
fn get_name(self) -> GodotString {
diff --git a/rust/src/buff_extra.rs b/rust/src/buff_extra.rs
index 473cdde..a7b7902 100644
--- a/rust/src/buff_extra.rs
+++ b/rust/src/buff_extra.rs
@@ -2,13 +2,13 @@ use gdnative::api::*;
use gdnative::prelude::*;
use crate::buff_trait::Buff;
-struct BuffExtra {
+pub struct BuffExtra {
name: String,
description: String,
}
impl BuffExtra {
- fn new() -> Self {
+ pub fn new() -> Self {
BuffExtra {
name: String::from("Extra Stroke"),
description: String::from("One additional stroke that doesn't count"),
diff --git a/rust/src/buff_phase.rs b/rust/src/buff_phase.rs
index e64508e..f69fecc 100644
--- a/rust/src/buff_phase.rs
+++ b/rust/src/buff_phase.rs
@@ -2,16 +2,16 @@ use gdnative::api::*;
use gdnative::prelude::*;
use crate::buff_trait::Buff;
-struct BuffPhase {
+pub struct BuffPhase {
name: String,
description: String,
- rigid_body: Option<Ref<RigidBody>>,
+ rigid_body: Box<Ref<RigidBody>>,
wall_layer_bit: i64,
}
impl BuffPhase {
- fn new(rigid_body: Option<Ref<RigidBody>>) -> Self {
+ pub fn new(rigid_body: Box<Ref<RigidBody>>) -> Self {
// calculate the bit for the mask to enable/ disable collision detection
let mask_layer = 2;
let mask_bit = 2_i64.pow(mask_layer - 1);
@@ -20,7 +20,6 @@ impl BuffPhase {
name: String::from("Phase"),
description: String::from("Phases through thin fences"),
rigid_body,
-
wall_layer_bit: mask_bit,
}
}
@@ -28,26 +27,12 @@ impl BuffPhase {
impl Buff for BuffPhase {
unsafe fn execute_buff(&mut self) {
- match &self.rigid_body {
- Some(body) => {
- // actually disable the collision to the fences
- let save_body = body.assume_safe();
- save_body.set_collision_mask_bit(self.wall_layer_bit, false);
- },
- None => godot_warn!("Rigid body not found")
- }
+ // actually disable the collision to the fences
+ self.rigid_body.assume_safe().set_collision_mask_bit(self.wall_layer_bit, false);
}
unsafe fn revert_buff(& mut self) {
- // make sure the rigid body exists
- match &self.rigid_body {
- Some(body) => {
- // actually enable the collision again
- let save_body = body.assume_safe();
- save_body.set_collision_mask_bit(self.wall_layer_bit, false);
- },
- None => godot_warn!("Rigid body not found")
- }
+ self.rigid_body.assume_safe().set_collision_mask_bit(self.wall_layer_bit, false);
}
fn get_name(self) -> GodotString {
diff --git a/rust/src/game.rs b/rust/src/game.rs
deleted file mode 100644
index ece5a54..0000000
--- a/rust/src/game.rs
+++ /dev/null
@@ -1,46 +0,0 @@
-use gdnative::api::*;
-use gdnative::prelude::*;
-
-/// The Game "class"
-#[derive(NativeClass)]
-#[inherit(Spatial)]
-#[register_with(Self::register_builder)]
-pub struct Game {
- name: String,
-}
-
-// __One__ `impl` block can have the `#[methods]` attribute, which will generate
-// code to automatically bind any exported methods to Godot.
-#[methods]
-impl Game {
- // Register the builder for methods, properties and/or signals.
- fn register_builder(_builder: &ClassBuilder<Self>) {
- godot_print!("Game builder is registered!");
- }
-
- /// The "constructor" of the class.
- fn new(_owner: &Spatial) -> Self {
- godot_print!("Game is created!");
- Game {
- name: "".to_string(),
- }
- }
-
- // In order to make a method known to Godot, the #[export] attribute has to be used.
- // In Godot script-classes do not actually inherit the parent class.
- // Instead they are "attached" to the parent object, called the "owner".
- // The owner is passed to every single exposed method.
- #[export]
- unsafe fn _ready(&mut self, _owner: &Spatial) {
- // The `godot_print!` macro works like `println!` but prints to the Godot-editor
- // output tab as well.
- self.name = "Game".to_string();
- godot_print!("{} is ready!", self.name);
- }
-
- // This function will be called in every frame
- #[export]
- unsafe fn _process(&self, _owner: &Spatial, delta: f64) {
- godot_print!("Inside {} _process(), delta is {}", self.name, delta);
- }
-}
diff --git a/rust/src/goal_trigger.rs b/rust/src/goal_trigger.rs
new file mode 100644
index 0000000..457eb7b
--- /dev/null
+++ b/rust/src/goal_trigger.rs
@@ -0,0 +1,30 @@
+use gdnative::api::*;
+use gdnative::prelude::*;
+use gdnative::core_types::VariantArray;
+use gdnative::object::*;
+
+/// The SpinningCube "class"
+#[derive(NativeClass)]
+#[inherit(Node)]
+pub struct GoalTriggerZone {
+ level_loader: Option<Ref<Node>>,
+}
+
+#[methods]
+impl GoalTriggerZone {
+ fn new(_owner: &Node) -> Self {
+ GoalTriggerZone {
+ level_loader: None,
+ }
+ }
+
+ #[export]
+ unsafe fn _ready(&mut self, owner: &Node) {
+ // TODO get loader
+ }
+
+ #[export]
+ fn overlap(&mut self, owner: &Node) {
+ godot_print!("OVERLAPPED");
+ }
+}
diff --git a/rust/src/lib.rs b/rust/src/lib.rs
index 534955f..c8afc06 100644
--- a/rust/src/lib.rs
+++ b/rust/src/lib.rs
@@ -1,17 +1,27 @@
-mod game;
-mod spinning_cube;
mod buff_bounce;
mod buff_phase;
mod buff_trait;
mod buff_ball;
mod buff_extra;
+<<<<<<< HEAD
+pub mod goal_trigger;
+mod test;
+=======
+>>>>>>> menu
+mod basic_die;
use gdnative::prelude::{godot_init, InitHandle};
// Function that registers all exposed classes to Godot
fn init(handle: InitHandle) {
+<<<<<<< HEAD
handle.add_class::<game::Game>();
handle.add_class::<spinning_cube::SpinningCube>();
+ handle.add_class::<goal_trigger::GoalTriggerZone>();
+ handle.add_class::<test::SpinningCubeReverse>();
+=======
+>>>>>>> menu
+ handle.add_class::<basic_die::BasicDie>();
}
// macros that create the entry-points of the dynamic library.
diff --git a/rust/src/spinning_cube.rs b/rust/src/spinning_cube.rs
deleted file mode 100644
index 41b429f..0000000
--- a/rust/src/spinning_cube.rs
+++ /dev/null
@@ -1,58 +0,0 @@
-use gdnative::api::*;
-use gdnative::prelude::*;
-
-/// The SpinningCube "class"
-#[derive(NativeClass)]
-#[inherit(MeshInstance)]
-#[register_with(Self::register_builder)]
-pub struct SpinningCube {
- start: Vector3,
- time: f32,
- #[property(path = "base/rotate_speed")]
- rotate_speed: f64,
-}
-
-// __One__ `impl` block can have the `#[methods]` attribute, which will generate
-// code to automatically bind any exported methods to Godot.
-#[methods]
-impl SpinningCube {
- // Register the builder for methods, properties and/or signals.
- fn register_builder(_builder: &ClassBuilder<Self>) {
- godot_print!("SpinningCube builder is registered!");
- }
-
- /// The "constructor" of the class.
- fn new(_owner: &MeshInstance) -> Self {
- SpinningCube {
- start: Vector3::new(0.0, 0.0, 0.0),
- time: 0.0,
- rotate_speed: 0.05,
- }
- }
-
- // In order to make a method known to Godot, the #[export] attribute has to be used.
- // In Godot script-classes do not actually inherit the parent class.
- // Instead they are "attached" to the parent object, called the "owner".
- // The owner is passed to every single exposed method.
- #[export]
- unsafe fn _ready(&mut self, owner: &MeshInstance) {
- owner.set_physics_process(true);
- }
-
- #[export]
- unsafe fn _physics_process(&mut self, owner: &MeshInstance, delta: f64) {
- use gdnative::api::SpatialMaterial;
-
- self.time += delta as f32;
- owner.rotate_y(self.rotate_speed * delta);
-
- let offset = Vector3::new(0.0, 1.0, 0.0) * self.time.cos() * 0.5;
- owner.set_translation(self.start + offset);
-
- if let Some(mat) = owner.get_surface_material(0) {
- let mat = mat.assume_safe();
- let mat = mat.cast::<SpatialMaterial>().expect("Incorrect material");
- mat.set_albedo(Color::from_rgba(self.time.cos().abs(), 0.0, 0.0, 1.0));
- }
- }
-}
diff --git a/rust/src/test.rs b/rust/src/test.rs
deleted file mode 100644
index 6c0774f..0000000
--- a/rust/src/test.rs
+++ /dev/null
@@ -1,58 +0,0 @@
-use gdnative::api::*;
-use gdnative::prelude::*;
-
-/// The SpinningCube "class"
-#[derive(NativeClass)]
-#[inherit(MeshInstance)]
-#[register_with(Self::register_builder)]
-pub struct SpinningCubeReverse {
- start: Vector3,
- time: f32,
- #[property(path = "base/rotate_speed")]
- rotate_speed: f64,
-}
-
-// __One__ `impl` block can have the `#[methods]` attribute, which will generate
-// code to automatically bind any exported methods to Godot.
-#[methods]
-impl SpinningCubeReverse {
- // Register the builder for methods, properties and/or signals.
- fn register_builder(_builder: &ClassBuilder<Self>) {
- godot_print!("SpinningCube builder is registered!");
- }
-
- /// The "constructor" of the class.
- fn new(_owner: &MeshInstance) -> Self {
- SpinningCubeReverse {
- start: Vector3::new(0.0, 0.0, 0.0),
- time: 0.0,
- rotate_speed: 0.05,
- }
- }
-
- // In order to make a method known to Godot, the #[export] attribute has to be used.
- // In Godot script-classes do not actually inherit the parent class.
- // Instead they are "attached" to the parent object, called the "owner".
- // The owner is passed to every single exposed method.
- #[export]
- unsafe fn _ready(&mut self, owner: &MeshInstance) {
- owner.set_physics_process(true);
- }
-
- #[export]
- unsafe fn _physics_process(&mut self, owner: &MeshInstance, delta: f64) {
- use gdnative::api::SpatialMaterial;
-
- self.time += delta as f32;
- owner.rotate_y(self.rotate_speed * delta * -1.0);
-
- let offset = Vector3::new(0.0, 1.0, 0.0) * self.time.cos() * 0.5;
- owner.set_translation(self.start + offset);
-
- if let Some(mat) = owner.get_surface_material(0) {
- let mat = mat.assume_safe();
- let mat = mat.cast::<SpatialMaterial>().expect("Incorrect material");
- mat.set_albedo(Color::from_rgba(self.time.cos().abs(), 0.0, 0.0, 1.0));
- }
- }
-}