diff --git a/Models/Dart/Dart.glb.import b/Models/Dart/Dart.glb.import new file mode 100644 index 0000000..5105045 --- /dev/null +++ b/Models/Dart/Dart.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://fp0gcwcyfd7g" +path="res://.godot/imported/Dart.glb-82b423f0f21d37c1bf28626083e1030e.scn" + +[deps] + +source_file="res://Models/Dart/Dart.glb" +dest_files=["res://.godot/imported/Dart.glb-82b423f0f21d37c1bf28626083e1030e.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/Models/Dart/Dart_Dart-Default.png b/Models/Dart/Dart_Dart-Default.png new file mode 100644 index 0000000..bfbaad5 Binary files /dev/null and b/Models/Dart/Dart_Dart-Default.png differ diff --git a/Models/Dart/Dart_Dart-Default.png.import b/Models/Dart/Dart_Dart-Default.png.import new file mode 100644 index 0000000..e5bb83e --- /dev/null +++ b/Models/Dart/Dart_Dart-Default.png.import @@ -0,0 +1,44 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bobnv6cyi7dc6" +path.s3tc="res://.godot/imported/Dart_Dart-Default.png-4bd6068152c7966988ca2c23bd03ba76.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} +generator_parameters={ +"md5": "9c4718c8d2830abe8cc9971ef621b46a" +} + +[deps] + +source_file="res://Models/Dart/Dart_Dart-Default.png" +dest_files=["res://.godot/imported/Dart_Dart-Default.png-4bd6068152c7966988ca2c23bd03ba76.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=0 diff --git a/Models/Dart/Dart_Wings-Default.png b/Models/Dart/Dart_Wings-Default.png new file mode 100644 index 0000000..6c07cdc Binary files /dev/null and b/Models/Dart/Dart_Wings-Default.png differ diff --git a/Models/Dart/Dart_Wings-Default.png.import b/Models/Dart/Dart_Wings-Default.png.import new file mode 100644 index 0000000..c9b8036 --- /dev/null +++ b/Models/Dart/Dart_Wings-Default.png.import @@ -0,0 +1,44 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bqxi7x76uv4tq" +path.s3tc="res://.godot/imported/Dart_Wings-Default.png-358040735cbc551a0d2abb04506c708a.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} +generator_parameters={ +"md5": "52ee9a89e7c6ed5f537103a41115551e" +} + +[deps] + +source_file="res://Models/Dart/Dart_Wings-Default.png" +dest_files=["res://.godot/imported/Dart_Wings-Default.png-358040735cbc551a0d2abb04506c708a.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=0 diff --git a/Models/Dart/Textures/Dart-Default.png.import b/Models/Dart/Textures/Dart-Default.png.import new file mode 100644 index 0000000..a79f5d2 --- /dev/null +++ b/Models/Dart/Textures/Dart-Default.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c7jxj25ophbsb" +path="res://.godot/imported/Dart-Default.png-2feb9f56821a29d976ec19a662a6977f.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Models/Dart/Textures/Dart-Default.png" +dest_files=["res://.godot/imported/Dart-Default.png-2feb9f56821a29d976ec19a662a6977f.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/Models/Dart/Textures/Wings-Default.png.import b/Models/Dart/Textures/Wings-Default.png.import new file mode 100644 index 0000000..f0f6e60 --- /dev/null +++ b/Models/Dart/Textures/Wings-Default.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bhbtrcw8xbp1g" +path="res://.godot/imported/Wings-Default.png-b4a7a92ebd237d86daaae21adc10d873.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Models/Dart/Textures/Wings-Default.png" +dest_files=["res://.godot/imported/Wings-Default.png-b4a7a92ebd237d86daaae21adc10d873.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/Models/Dart/Textures/Wings-Red-Blue.png.import b/Models/Dart/Textures/Wings-Red-Blue.png.import new file mode 100644 index 0000000..9aae953 --- /dev/null +++ b/Models/Dart/Textures/Wings-Red-Blue.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ch4b1pnokuu8d" +path="res://.godot/imported/Wings-Red-Blue.png-701faf0c1b6c3af11eb52058dfda7798.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Models/Dart/Textures/Wings-Red-Blue.png" +dest_files=["res://.godot/imported/Wings-Red-Blue.png-701faf0c1b6c3af11eb52058dfda7798.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/Models/Dartboard/Dartboard-Proto.blend b/Models/Dartboard/Dartboard-Proto.blend new file mode 100644 index 0000000..20771e6 Binary files /dev/null and b/Models/Dartboard/Dartboard-Proto.blend differ diff --git a/Models/Dartboard/Dartboard-Proto.blend1 b/Models/Dartboard/Dartboard-Proto.blend1 new file mode 100644 index 0000000..2a08ad5 Binary files /dev/null and b/Models/Dartboard/Dartboard-Proto.blend1 differ diff --git a/Models/Dartboard/Dartboard-Proto.glb b/Models/Dartboard/Dartboard-Proto.glb new file mode 100644 index 0000000..8da6afd Binary files /dev/null and b/Models/Dartboard/Dartboard-Proto.glb differ diff --git a/Models/Dartboard/Dartboard-Proto.glb.import b/Models/Dartboard/Dartboard-Proto.glb.import new file mode 100644 index 0000000..5731dd9 --- /dev/null +++ b/Models/Dartboard/Dartboard-Proto.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://c7ysojicqbx2v" +path="res://.godot/imported/Dartboard-Proto.glb-f1487085b0c09a3b97c6aa8be3864f01.scn" + +[deps] + +source_file="res://Models/Dartboard/Dartboard-Proto.glb" +dest_files=["res://.godot/imported/Dartboard-Proto.glb-f1487085b0c09a3b97c6aa8be3864f01.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/Models/Dartboard/Dartboard-Proto_Cork.png b/Models/Dartboard/Dartboard-Proto_Cork.png new file mode 100644 index 0000000..090f376 Binary files /dev/null and b/Models/Dartboard/Dartboard-Proto_Cork.png differ diff --git a/Models/Dartboard/Dartboard-Proto_Cork.png.import b/Models/Dartboard/Dartboard-Proto_Cork.png.import new file mode 100644 index 0000000..f8e4fbb --- /dev/null +++ b/Models/Dartboard/Dartboard-Proto_Cork.png.import @@ -0,0 +1,44 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dk6gnbvgumq7c" +path.s3tc="res://.godot/imported/Dartboard-Proto_Cork.png-9700f4c0b675dee65dc4e1c14aa931b3.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} +generator_parameters={ +"md5": "5b186b11689f911ad6691488292c3475" +} + +[deps] + +source_file="res://Models/Dartboard/Dartboard-Proto_Cork.png" +dest_files=["res://.godot/imported/Dartboard-Proto_Cork.png-9700f4c0b675dee65dc4e1c14aa931b3.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=0 diff --git a/Models/Dartboard/Dartboard-Proto_Green.png b/Models/Dartboard/Dartboard-Proto_Green.png new file mode 100644 index 0000000..b63714c Binary files /dev/null and b/Models/Dartboard/Dartboard-Proto_Green.png differ diff --git a/Models/Dartboard/Dartboard-Proto_Green.png.import b/Models/Dartboard/Dartboard-Proto_Green.png.import new file mode 100644 index 0000000..2e57368 --- /dev/null +++ b/Models/Dartboard/Dartboard-Proto_Green.png.import @@ -0,0 +1,44 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cs381hglod4k1" +path.s3tc="res://.godot/imported/Dartboard-Proto_Green.png-0f939f85106a12f4ae54352c096222a2.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} +generator_parameters={ +"md5": "c03f264d9d0115e28f662ed5ab27bbb2" +} + +[deps] + +source_file="res://Models/Dartboard/Dartboard-Proto_Green.png" +dest_files=["res://.godot/imported/Dartboard-Proto_Green.png-0f939f85106a12f4ae54352c096222a2.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=0 diff --git a/Models/Dartboard/Dartboard-Proto_Red.png b/Models/Dartboard/Dartboard-Proto_Red.png new file mode 100644 index 0000000..d3ddab7 Binary files /dev/null and b/Models/Dartboard/Dartboard-Proto_Red.png differ diff --git a/Models/Dartboard/Dartboard-Proto_Red.png.import b/Models/Dartboard/Dartboard-Proto_Red.png.import new file mode 100644 index 0000000..1e79333 --- /dev/null +++ b/Models/Dartboard/Dartboard-Proto_Red.png.import @@ -0,0 +1,44 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cvv4akpwsudu3" +path.s3tc="res://.godot/imported/Dartboard-Proto_Red.png-e757930c4a42a8dc67547b3409641a91.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} +generator_parameters={ +"md5": "e46ac968aab4da0b0c65bc59957f2f96" +} + +[deps] + +source_file="res://Models/Dartboard/Dartboard-Proto_Red.png" +dest_files=["res://.godot/imported/Dartboard-Proto_Red.png-e757930c4a42a8dc67547b3409641a91.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=0 diff --git a/Models/Dartboard/Dartboard.blend b/Models/Dartboard/Dartboard.blend new file mode 100644 index 0000000..ba66638 Binary files /dev/null and b/Models/Dartboard/Dartboard.blend differ diff --git a/Models/Dartboard/Dartboard.blend1 b/Models/Dartboard/Dartboard.blend1 new file mode 100644 index 0000000..8286c87 Binary files /dev/null and b/Models/Dartboard/Dartboard.blend1 differ diff --git a/Models/Dartboard/Dartboard.glb b/Models/Dartboard/Dartboard.glb new file mode 100644 index 0000000..ce876ee Binary files /dev/null and b/Models/Dartboard/Dartboard.glb differ diff --git a/Models/Dartboard/Dartboard.glb.import b/Models/Dartboard/Dartboard.glb.import new file mode 100644 index 0000000..4d8fd15 --- /dev/null +++ b/Models/Dartboard/Dartboard.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://6nml3641dpce" +path="res://.godot/imported/Dartboard.glb-35f0707e0e9b18915b2d48c5c14ac862.scn" + +[deps] + +source_file="res://Models/Dartboard/Dartboard.glb" +dest_files=["res://.godot/imported/Dartboard.glb-35f0707e0e9b18915b2d48c5c14ac862.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/Models/Dartboard/Dartboard_Spider.png b/Models/Dartboard/Dartboard_Spider.png new file mode 100644 index 0000000..6c26bd4 Binary files /dev/null and b/Models/Dartboard/Dartboard_Spider.png differ diff --git a/Models/Dartboard/Dartboard_Spider.png.import b/Models/Dartboard/Dartboard_Spider.png.import new file mode 100644 index 0000000..b66d1a6 --- /dev/null +++ b/Models/Dartboard/Dartboard_Spider.png.import @@ -0,0 +1,44 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ctr7mydgfca75" +path.s3tc="res://.godot/imported/Dartboard_Spider.png-3a7e01e42d10301e2794b3c6268069b4.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} +generator_parameters={ +"md5": "693560c0ab922fba23ec09a26ead7f48" +} + +[deps] + +source_file="res://Models/Dartboard/Dartboard_Spider.png" +dest_files=["res://.godot/imported/Dartboard_Spider.png-3a7e01e42d10301e2794b3c6268069b4.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=0 diff --git a/Models/Dartboard/Textures/Coffee.png b/Models/Dartboard/Textures/Coffee.png new file mode 100644 index 0000000..998206b Binary files /dev/null and b/Models/Dartboard/Textures/Coffee.png differ diff --git a/Models/Dartboard/Textures/Coffee.png.import b/Models/Dartboard/Textures/Coffee.png.import new file mode 100644 index 0000000..3306685 --- /dev/null +++ b/Models/Dartboard/Textures/Coffee.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b1vf3204p4ys6" +path="res://.godot/imported/Coffee.png-7ec89259677377dfb36274d8ce0e9258.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Models/Dartboard/Textures/Coffee.png" +dest_files=["res://.godot/imported/Coffee.png-7ec89259677377dfb36274d8ce0e9258.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/Models/Dartboard/Textures/Cork.png b/Models/Dartboard/Textures/Cork.png new file mode 100644 index 0000000..090f376 Binary files /dev/null and b/Models/Dartboard/Textures/Cork.png differ diff --git a/Models/Dartboard/Textures/Cork.png.import b/Models/Dartboard/Textures/Cork.png.import new file mode 100644 index 0000000..283ae19 --- /dev/null +++ b/Models/Dartboard/Textures/Cork.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://blvifdtblwcxg" +path="res://.godot/imported/Cork.png-8b577bb6a5aa8a82bae563118e794e18.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Models/Dartboard/Textures/Cork.png" +dest_files=["res://.godot/imported/Cork.png-8b577bb6a5aa8a82bae563118e794e18.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/Models/Dartboard/Textures/Flowers.jpg b/Models/Dartboard/Textures/Flowers.jpg new file mode 100644 index 0000000..d81be46 Binary files /dev/null and b/Models/Dartboard/Textures/Flowers.jpg differ diff --git a/Models/Dartboard/Textures/Flowers.jpg.import b/Models/Dartboard/Textures/Flowers.jpg.import new file mode 100644 index 0000000..04af584 --- /dev/null +++ b/Models/Dartboard/Textures/Flowers.jpg.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dxxon6pdl5aw4" +path="res://.godot/imported/Flowers.jpg-4755265eb848ca410e8aa3e15ab13280.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Models/Dartboard/Textures/Flowers.jpg" +dest_files=["res://.godot/imported/Flowers.jpg-4755265eb848ca410e8aa3e15ab13280.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/Models/Dartboard/Textures/Green.png b/Models/Dartboard/Textures/Green.png new file mode 100644 index 0000000..b63714c Binary files /dev/null and b/Models/Dartboard/Textures/Green.png differ diff --git a/Models/Dartboard/Textures/Green.png.import b/Models/Dartboard/Textures/Green.png.import new file mode 100644 index 0000000..bf524f8 --- /dev/null +++ b/Models/Dartboard/Textures/Green.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c2qvwu0v2uolj" +path="res://.godot/imported/Green.png-6f1f5b0c58d2ec51c6b638c11ba4264b.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Models/Dartboard/Textures/Green.png" +dest_files=["res://.godot/imported/Green.png-6f1f5b0c58d2ec51c6b638c11ba4264b.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/Models/Dartboard/Textures/Red.png b/Models/Dartboard/Textures/Red.png new file mode 100644 index 0000000..d3ddab7 Binary files /dev/null and b/Models/Dartboard/Textures/Red.png differ diff --git a/Models/Dartboard/Textures/Red.png.import b/Models/Dartboard/Textures/Red.png.import new file mode 100644 index 0000000..08eda5c --- /dev/null +++ b/Models/Dartboard/Textures/Red.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b1lclw6s66ou7" +path="res://.godot/imported/Red.png-5fe46449e66850590891dfad1c596ebf.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Models/Dartboard/Textures/Red.png" +dest_files=["res://.godot/imported/Red.png-5fe46449e66850590891dfad1c596ebf.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/Models/Dartboard/Textures/Spider.png b/Models/Dartboard/Textures/Spider.png new file mode 100644 index 0000000..53e9335 Binary files /dev/null and b/Models/Dartboard/Textures/Spider.png differ diff --git a/Models/Dartboard/Textures/Spider.png.import b/Models/Dartboard/Textures/Spider.png.import new file mode 100644 index 0000000..52b7b5a --- /dev/null +++ b/Models/Dartboard/Textures/Spider.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b3qw07lguggu6" +path="res://.godot/imported/Spider.png-3f1c947c2e5bcf6b7d7e259d62e6005a.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Models/Dartboard/Textures/Spider.png" +dest_files=["res://.godot/imported/Spider.png-3f1c947c2e5bcf6b7d7e259d62e6005a.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/Models/Dartboard/Textures/Stars.jpg b/Models/Dartboard/Textures/Stars.jpg new file mode 100644 index 0000000..873c7ca Binary files /dev/null and b/Models/Dartboard/Textures/Stars.jpg differ diff --git a/Models/Dartboard/Textures/Stars.jpg.import b/Models/Dartboard/Textures/Stars.jpg.import new file mode 100644 index 0000000..3f62466 --- /dev/null +++ b/Models/Dartboard/Textures/Stars.jpg.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ccoht16d1pkr3" +path="res://.godot/imported/Stars.jpg-9cc50027cae80115a1f7344b30169970.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Models/Dartboard/Textures/Stars.jpg" +dest_files=["res://.godot/imported/Stars.jpg-9cc50027cae80115a1f7344b30169970.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/Modifiers/coffee.tres b/Modifiers/coffee.tres new file mode 100644 index 0000000..89d4c07 --- /dev/null +++ b/Modifiers/coffee.tres @@ -0,0 +1,13 @@ +[gd_resource type="Resource" script_class="Modifier" format=3 uid="uid://ccyxtrth046pt"] + +[ext_resource type="Script" uid="uid://duh0lxb7gdimr" path="res://Scripts/Modifier.gd" id="1_6fe4u"] +[ext_resource type="Texture2D" uid="uid://b1vf3204p4ys6" path="res://Models/Dartboard/Textures/Coffee.png" id="2_6fe4u"] + +[resource] +script = ExtResource("1_6fe4u") +id = "0" +title = "Stars" +description = "Adds 40 to your score" +texture = ExtResource("2_6fe4u") +score_add = 40 +metadata/_custom_type_script = "uid://duh0lxb7gdimr" diff --git a/Modifiers/flowers.tres b/Modifiers/flowers.tres new file mode 100644 index 0000000..e91e00f --- /dev/null +++ b/Modifiers/flowers.tres @@ -0,0 +1,13 @@ +[gd_resource type="Resource" script_class="Modifier" format=3 uid="uid://bu11ohgune4yf"] + +[ext_resource type="Script" uid="uid://duh0lxb7gdimr" path="res://Scripts/Modifier.gd" id="1_urlsx"] +[ext_resource type="Texture2D" uid="uid://dxxon6pdl5aw4" path="res://Models/Dartboard/Textures/Flowers.jpg" id="2_urlsx"] + +[resource] +script = ExtResource("1_urlsx") +id = "0" +title = "Stars" +description = "Adds 40 to your score" +texture = ExtResource("2_urlsx") +score_add = 40 +metadata/_custom_type_script = "uid://duh0lxb7gdimr" diff --git a/Modifiers/stars_x5.tres b/Modifiers/stars_x5.tres new file mode 100644 index 0000000..bc71417 --- /dev/null +++ b/Modifiers/stars_x5.tres @@ -0,0 +1,13 @@ +[gd_resource type="Resource" script_class="Modifier" format=3 uid="uid://bigyh63smlbh5"] + +[ext_resource type="Script" uid="uid://duh0lxb7gdimr" path="res://Scripts/Modifier.gd" id="1_oxvfs"] +[ext_resource type="Texture2D" uid="uid://ccoht16d1pkr3" path="res://Models/Dartboard/Textures/Stars.jpg" id="2_5aq3x"] + +[resource] +script = ExtResource("1_oxvfs") +id = "0" +title = "Stars" +description = "Adds 40 to your score" +texture = ExtResource("2_5aq3x") +score_add = 40 +metadata/_custom_type_script = "uid://duh0lxb7gdimr" diff --git a/Scenes/Dartboard-Proto.tscn b/Scenes/Dartboard-Proto.tscn new file mode 100644 index 0000000..e707777 --- /dev/null +++ b/Scenes/Dartboard-Proto.tscn @@ -0,0 +1,49 @@ +[gd_scene format=3 uid="uid://cqe6bo8v564dc"] + +[ext_resource type="Script" uid="uid://d1i0lhibtflvq" path="res://Scripts/Main.gd" id="1_fq6v0"] +[ext_resource type="Script" uid="uid://x5kcjofb5pek" path="res://Scripts/DropCatcher.gd" id="3_qdhrm"] +[ext_resource type="Script" uid="uid://dnek55fao0l72" path="res://Scripts/ModifierTray.gd" id="5_kax6v"] +[ext_resource type="PackedScene" uid="uid://6nml3641dpce" path="res://Models/Dartboard/Dartboard.glb" id="5_thh7l"] + +[node name="DartboardProto" type="Node3D" unique_id=1829621191 node_paths=PackedStringArray("dartboard_root")] +script = ExtResource("1_fq6v0") +dartboard_root = NodePath("Dartboard") + +[node name="Camera3D" type="Camera3D" parent="." unique_id=393502700] +transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 2.6578834, 0.6292654, 0) + +[node name="DirectionalLight3D" type="DirectionalLight3D" parent="." unique_id=1020512688] + +[node name="Dartboard" parent="." unique_id=1632971704 instance=ExtResource("5_thh7l")] +transform = Transform3D(-4.371139e-08, 0, -1, 0, 1, 0, 1, 0, -4.371139e-08, 0.16272092, 1.2674973, 0) + +[node name="CanvasLayer" type="CanvasLayer" parent="." unique_id=80012783] + +[node name="DropCatcher" type="Control" parent="CanvasLayer" unique_id=1371111637 node_paths=PackedStringArray("camera", "main")] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("3_qdhrm") +camera = NodePath("../../Camera3D") +main = NodePath("../..") +reverse_direction = true +triple_max = 0.5 +outer_max = 0.7 + +[node name="TextureTray" type="HBoxContainer" parent="CanvasLayer/DropCatcher" unique_id=799936408] +layout_mode = 0 +offset_right = 40.0 +offset_bottom = 40.0 + +[node name="ModifierTray" type="Control" parent="CanvasLayer" unique_id=2127296352 node_paths=PackedStringArray("drop_catcher")] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("5_kax6v") +drop_catcher = NodePath("../DropCatcher") diff --git a/Scripts/DropCatcher.gd b/Scripts/DropCatcher.gd new file mode 100644 index 0000000..a5ddc1a --- /dev/null +++ b/Scripts/DropCatcher.gd @@ -0,0 +1,156 @@ +extends Control +# DropCatcher.gd (manual-drag version) +# No longer uses Godot's built-in _drop_data. Instead it exposes +# paint_at_screen_pos(), which the trapezoid calls on release. +# This Control no longer needs to catch mouse events at all, so it can be +# tiny/invisible — but keep it in the tree so it can reach the camera & board. + +@export var camera: Camera3D +@export var main: Node # the ROOT node (DartboardProto) + +const RAY_LENGTH := 1000.0 +var dartboard: MeshInstance3D + +# Standard dartboard number sequence, clockwise starting from the TOP (12 o'clock). +const DART_NUMBERS := [20, 1, 18, 4, 13, 6, 10, 15, 2, 17, + 3, 19, 7, 16, 8, 11, 14, 9, 12, 5] + +# Calibration: rotate which sector counts as "top". If the wrong number gets +# hit, bump this by 1 until it lines up. Range 0-19. +@export var sector_offset := 0 +# If your board's numbers go counter-clockwise in 3D, flip this. +@export var reverse_direction := false + +# --- Radial band boundaries (fractions of outer radius, 0=center 1=rim) --- +# Tune these in the Inspector by reading the norm= prints for each ring. +@export var bull_inner_max := 0.04 # <= this = inner bull (50) +@export var bull_outer_max := 0.09 # <= this = outer bull (25) +@export var inner_max := 0.45 # <= this = inner single +@export var triple_max := 0.55 # <= this = triple ring +@export var outer_max := 0.80 # <= this = outer single; above = double + +# Stores which modifier is applied to each surface index: { surface_index: Modifier } +var applied_modifiers: Dictionary = {} + +func _ready() -> void: + # Don't block mouse input; the trapezoids handle their own dragging. + mouse_filter = Control.MOUSE_FILTER_IGNORE + print("DropCatcher ready. camera=", camera, " main=", main) + +func _get_board() -> MeshInstance3D: + if dartboard == null and main != null and "dartboard" in main: + dartboard = main.dartboard + return dartboard + +# Public: try to apply a modifier (paint its texture + store its rule) at a +# screen position. Returns true if it hit the board, false if it missed. +func apply_modifier_at_screen_pos(screen_pos: Vector2, modifier: Resource) -> bool: + var board := _get_board() + if board == null: + push_error("DropCatcher: no dartboard mesh (is 'main' set?).") + return false + if camera == null: + push_error("DropCatcher: camera export not set.") + return false + if modifier == null: + return false + + var ray_origin := camera.project_ray_origin(screen_pos) + var ray_dir := camera.project_ray_normal(screen_pos) + var ray_end := ray_origin + ray_dir * RAY_LENGTH + + var space_state := get_viewport().world_3d.direct_space_state + var query := PhysicsRayQueryParameters3D.create(ray_origin, ray_end) + query.collide_with_areas = false + query.collide_with_bodies = true + var result := space_state.intersect_ray(query) + if result.is_empty(): + print(" drop missed the board") + return false + + var surface_index := _surface_from_hit(result, board) + if surface_index < 0: + return false + + _paint_surface(board, surface_index, modifier.texture) + applied_modifiers[surface_index] = modifier # remember the scoring rule + print(" applied '", modifier.id, "' to surface ", surface_index) + return true + +# Call this when a dart lands on a surface to get the modified score. +func score_for_surface(surface_index: int, base_value: int) -> int: + if applied_modifiers.has(surface_index): + return applied_modifiers[surface_index].apply_score(base_value) + return base_value + +func _surface_from_hit(result: Dictionary, board: MeshInstance3D) -> int: + var hit_point: Vector3 = result.get("position", Vector3.ZERO) + var local := board.to_local(hit_point) + var aabb := board.get_aabb() + var center := aabb.position + aabb.size * 0.5 + # Board disc lies in the X/Y plane (thin on Z). Measure radius/angle in X/Y. + var dx := local.x - center.x + var dy := local.y - center.y + var radius := Vector2(dx, dy).length() + var outer_radius : float = max(aabb.size.x, aabb.size.y) * 0.5 + var norm := radius / outer_radius if outer_radius > 0.0 else 0.0 + print(" local=", local, " dx=", "%.3f" % dx, " dy=", "%.3f" % dy, " norm=", "%.3f" % norm) + + # --- RADIAL BAND --- + # These thresholds are fractions of the outer radius. TUNE to match your art: + # the real proportions of a dartboard, from center outward. + var seg_name := "" + if norm <= bull_inner_max: + seg_name = "bull_inner" # inner bull (50) + elif norm <= bull_outer_max: + seg_name = "bull_outer" # outer bull (25) + elif norm > 1.0: + print(" outside board") + return -1 + else: + # --- ANGULAR SECTOR --- + # atan2 gives angle of the hit point. We map it to one of 20 sectors, + # then index into the dartboard number sequence. + var angle := atan2(dx, dy) # -PI..PI, 0 = straight up (+y = top) + # Convert to 0..1 going clockwise from top. Adjust the rotation so 0 = top. + var t := angle / (2.0 * PI) + t = fposmod(t, 1.0) + if reverse_direction: + t = 1.0 - t + var sector_index := int(floor(t * 20.0 + 0.5)) % 20 + sector_index = (sector_index + sector_offset) % 20 + var number : int = DART_NUMBERS[sector_index] + + # Which ring band within the sector. + var band := "" + if norm <= inner_max: + band = "inner" # inner single + elif norm <= triple_max: + band = "triple" # triple ring + elif norm <= outer_max: + band = "outer" # outer single + else: + band = "double" # double ring + seg_name = "seg_%d_%s" % [number, band] + + print(" norm=", "%.3f" % norm, " -> ", seg_name) + return _index_of_surface_named(board, seg_name) + +func _index_of_surface_named(board: MeshInstance3D, target_name: String) -> int: + var mesh := board.mesh + for i in mesh.get_surface_count(): + var mat := mesh.surface_get_material(i) + if mat and mat.resource_name == target_name: + return i + return -1 + +func _paint_surface(board: MeshInstance3D, surface_index: int, tex: Texture2D) -> void: + # Always build a fresh StandardMaterial3D so the texture shows as an IMAGE, + # not tinted by the old base color. If the segment looks like a flat color + # instead of the pattern, the mesh is missing proper UVs on that face. + var new_mat := StandardMaterial3D.new() + new_mat.albedo_color = Color.WHITE # white so texture isn't tinted + new_mat.albedo_texture = tex + new_mat.texture_filter = BaseMaterial3D.TEXTURE_FILTER_LINEAR + new_mat.shading_mode = BaseMaterial3D.SHADING_MODE_UNSHADED + board.set_surface_override_material(surface_index, new_mat) diff --git a/Scripts/DropCatcher.gd.uid b/Scripts/DropCatcher.gd.uid new file mode 100644 index 0000000..03f68f6 --- /dev/null +++ b/Scripts/DropCatcher.gd.uid @@ -0,0 +1 @@ +uid://x5kcjofb5pek diff --git a/Scripts/Main.gd b/Scripts/Main.gd new file mode 100644 index 0000000..ec733f1 --- /dev/null +++ b/Scripts/Main.gd @@ -0,0 +1,61 @@ +extends Node3D +# Attach to the ROOT node (DartboardProto). +# Leave `dartboard_root` empty to auto-search, or drag the glb node in. + +@export var dartboard_root: Node + +var dartboard: MeshInstance3D + +func _ready() -> void: + dartboard = _find_mesh_instance(dartboard_root if dartboard_root else self) + if dartboard == null: + push_error("Could not find a MeshInstance3D. Check that the glb is in the scene.") + return + print("Found dartboard mesh node: ", dartboard.name) + _print_surfaces() + _ensure_collision() + +func _find_mesh_instance(node: Node) -> MeshInstance3D: + if node is MeshInstance3D and node.mesh != null: + return node + for child in node.get_children(): + var found := _find_mesh_instance(child) + if found: + return found + return null + +func _print_surfaces() -> void: + var mesh := dartboard.mesh + print("=== Dartboard surfaces ===") + for i in mesh.get_surface_count(): + var mat := mesh.surface_get_material(i) + var mat_name := mat.resource_name if mat else "(no material)" + print("Surface ", i, " material name: '", mat_name, "'") + print("==========================") + var aabb := dartboard.get_aabb() + print("Board local size (x,y,z): ", aabb.size) + +# CHEAP collision: one box that matches the board's bounding box. +# This replaces create_trimesh_collision(), which was making it run at ~3 FPS +# because it built a collision triangle for every face of the board. +func _ensure_collision() -> void: + # Remove any existing auto-added body so we don't stack shapes on re-runs. + for child in dartboard.get_children(): + if child is StaticBody3D and child.name == "AutoBoardBody": + child.queue_free() + + var body := StaticBody3D.new() + body.name = "AutoBoardBody" + + var col := CollisionShape3D.new() + var box := BoxShape3D.new() + # Match the mesh's bounding box. Use the AABB size directly as the box size. + var aabb := dartboard.get_aabb() + box.size = aabb.size + col.shape = box + # Center the box on the mesh's bounding-box center (not always the origin). + col.position = aabb.position + aabb.size * 0.5 + + body.add_child(col) + dartboard.add_child(body) + print("Created cheap box collision for the dartboard.") diff --git a/Scripts/Main.gd.uid b/Scripts/Main.gd.uid new file mode 100644 index 0000000..d52721e --- /dev/null +++ b/Scripts/Main.gd.uid @@ -0,0 +1 @@ +uid://d1i0lhibtflvq diff --git a/Scripts/Modifier.gd b/Scripts/Modifier.gd new file mode 100644 index 0000000..e517576 --- /dev/null +++ b/Scripts/Modifier.gd @@ -0,0 +1,40 @@ +extends Resource +class_name Modifier +# One modifier definition: title + description + texture + scoring rule. +# Create instances of this as .tres files in the editor (right-click in +# FileSystem -> New Resource -> Modifier), OR build them in code in the catalog. +# +# Because a texture always maps to the same modifier, the texture lives HERE. + +# A stable unique id (e.g. "stars_x5"). Useful for saving which modifiers are +# applied to which segments, and for lookups. Keep it unique across the catalog. +@export var id: String = "" + +# Shown to the player when offered the piece. +@export var title: String = "" +@export_multiline var description: String = "" + +# The texture painted onto the segment when this modifier is applied. +@export var texture: Texture2D + +# --- Scoring rule --- +# Simple, data-only rules cover most cases without writing code per modifier. +# value = (base_value * mult + add) for the affected segment. +@export var score_mult: float = 1.0 +@export var score_add: int = 0 + +# Optional: rarity weight for random selection (higher = more common). +@export var weight: float = 1.0 + +# Apply this modifier's rule to a segment's base value. +func apply_score(base_value: int) -> int: + return int(round(base_value * score_mult)) + score_add + +# A short human-readable summary of the effect, for tooltips/UI. +func effect_text() -> String: + var parts: Array[String] = [] + if score_mult != 1.0: + parts.append("x%s" % str(score_mult)) + if score_add != 0: + parts.append(("+%d" % score_add) if score_add > 0 else str(score_add)) + return " ".join(parts) if parts.size() > 0 else "no change" diff --git a/Scripts/Modifier.gd.uid b/Scripts/Modifier.gd.uid new file mode 100644 index 0000000..9881d8d --- /dev/null +++ b/Scripts/Modifier.gd.uid @@ -0,0 +1 @@ +uid://duh0lxb7gdimr diff --git a/Scripts/ModifierCatalog.gd b/Scripts/ModifierCatalog.gd new file mode 100644 index 0000000..e9f6445 --- /dev/null +++ b/Scripts/ModifierCatalog.gd @@ -0,0 +1,84 @@ +extends Node +# ModifierCatalog.gd +# Holds the master list of every modifier in the game and picks random sets +# for each round. Register this as an AUTOLOAD (Project > Project Settings > +# Autoload) with the name "ModifierCatalog" so any script can reach it globally. +# +# Two ways to fill the catalog: +# A) Drop .tres Modifier files into res://Modifiers/ and they auto-load (below). +# B) Build them in code in _register_builtins() for quick prototyping. + +var modifiers: Array[Modifier] = [] +var _by_id: Dictionary = {} # id -> Modifier, for fast lookup + +func _ready() -> void: + _load_from_folder("res://Modifiers/") + if modifiers.is_empty(): + # Fallback so the prototype works before you author .tres files. + _register_builtins() + _reindex() + print("ModifierCatalog loaded ", modifiers.size(), " modifiers.") + +# Load every .tres Modifier resource from a folder. +func _load_from_folder(path: String) -> void: + var dir := DirAccess.open(path) + if dir == null: + return + dir.list_dir_begin() + var fname := dir.get_next() + while fname != "": + if not dir.current_is_dir() and fname.ends_with(".tres"): + var res := load(path + fname) + if res is Modifier: + modifiers.append(res) + fname = dir.get_next() + dir.list_dir_end() + +# Quick code-defined modifiers for prototyping. Replace texture paths with yours. +func _register_builtins() -> void: + modifiers.append(_make("stars_x5", "Stars", "Multiplies this segment's value by 5.", + "res://Models/Dartboard/Dartboard-Proto_Red.png", 5.0, 0)) + modifiers.append(_make("double", "Double", "Doubles this segment's value.", + "res://Models/Dartboard/Dartboard-Proto_Green.png", 2.0, 0)) + modifiers.append(_make("plus10", "Bonus +10", "Adds 10 points to this segment.", + "res://Models/Dartboard/Dartboard-Proto_Cork.png", 1.0, 10)) + +func _make(id: String, title: String, desc: String, tex_path: String, + mult: float, add: int) -> Modifier: + var m := Modifier.new() + m.id = id + m.title = title + m.description = desc + m.texture = load(tex_path) + m.score_mult = mult + m.score_add = add + return m + +func _reindex() -> void: + _by_id.clear() + for m in modifiers: + _by_id[m.id] = m + +func get_by_id(id: String) -> Modifier: + return _by_id.get(id) + +# Pick `count` distinct random modifiers, respecting weight. Returns an Array. +func pick_random(count: int) -> Array[Modifier]: + var pool := modifiers.duplicate() + var chosen: Array[Modifier] = [] + count = min(count, pool.size()) + for _i in count: + var total := 0.0 + for m in pool: + total += max(m.weight, 0.0001) + var r := randf() * total + var acc := 0.0 + var picked_index := 0 + for j in pool.size(): + acc += max(pool[j].weight, 0.0001) + if r <= acc: + picked_index = j + break + chosen.append(pool[picked_index]) + pool.remove_at(picked_index) # distinct: don't pick the same one twice + return chosen diff --git a/Scripts/ModifierCatalog.gd.uid b/Scripts/ModifierCatalog.gd.uid new file mode 100644 index 0000000..2c1a789 --- /dev/null +++ b/Scripts/ModifierCatalog.gd.uid @@ -0,0 +1 @@ +uid://btm4dwci50xmu diff --git a/Scripts/ModifierTray.gd b/Scripts/ModifierTray.gd new file mode 100644 index 0000000..9d6009e --- /dev/null +++ b/Scripts/ModifierTray.gd @@ -0,0 +1,69 @@ +extends Control +# ModifierTray.gd (catalog-driven) +# Each round, asks ModifierCatalog for 3 random modifiers and spawns a draggable +# trapezoid for each at the bottom-center. Dropping one onto the board applies it +# and consumes the round's pieces. + +@export var drop_catcher: Control +@export var pieces_per_round := 3 + +@export var piece_size := Vector2(90, 110) +@export var spacing := 24.0 +@export var bottom_margin := 30.0 + +const TrapezoidSwatch := preload("res://Scripts/TrapezoidSwatch.gd") + +var _pieces: Array[Control] = [] + +func _ready() -> void: + mouse_filter = Control.MOUSE_FILTER_IGNORE + spawn_round() + +# Offer a fresh set of random modifier pieces for a new round. +func spawn_round() -> void: + _clear_pieces() + # ModifierCatalog is an autoload singleton (set it up in Project Settings). + var choices: Array = ModifierCatalog.pick_random(pieces_per_round) + if choices.is_empty(): + push_warning("ModifierTray: catalog returned no modifiers.") + return + + for mod in choices: + var piece := Control.new() + piece.set_script(TrapezoidSwatch) + piece.custom_minimum_size = piece_size + piece.size = piece_size + piece.modifier = mod # carries the WHOLE modifier + piece.paint_texture = mod.texture # convenience for drawing + piece.drop_catcher = drop_catcher + piece.tray = self + add_child(piece) + _pieces.append(piece) + + _layout_pieces() + +func _layout_pieces() -> void: + var count := _pieces.size() + if count == 0: + return + var total_w := count * piece_size.x + (count - 1) * spacing + var screen := get_viewport_rect().size + var start_x := (screen.x - total_w) * 0.5 + var y := screen.y - piece_size.y - bottom_margin + for i in count: + _pieces[i].position = Vector2(start_x + i * (piece_size.x + spacing), y) + +# Called by a piece when successfully used: remove the whole set. +func consume() -> void: + _clear_pieces() + +func _clear_pieces() -> void: + for p in _pieces: + if is_instance_valid(p): + p.queue_free() + _pieces.clear() + +# TESTING ONLY: press SPACE to roll a new round of pieces. +func _unhandled_input(event: InputEvent) -> void: + if event is InputEventKey and event.pressed and event.keycode == KEY_SPACE: + spawn_round() diff --git a/Scripts/ModifierTray.gd.uid b/Scripts/ModifierTray.gd.uid new file mode 100644 index 0000000..14bae9c --- /dev/null +++ b/Scripts/ModifierTray.gd.uid @@ -0,0 +1 @@ +uid://dnek55fao0l72 diff --git a/Scripts/TrapezoidSwatch.gd b/Scripts/TrapezoidSwatch.gd new file mode 100644 index 0000000..d64d396 --- /dev/null +++ b/Scripts/TrapezoidSwatch.gd @@ -0,0 +1,97 @@ +extends Control +# TrapezoidSwatch.gd (manual-drag version) +# The trapezoid node ITSELF follows the cursor while dragging (no ghost). +# On release over the board, it tells DropCatcher to paint the hit segment, +# then asks the tray to consume the round's modifiers. + +@export var paint_texture: Texture2D: + set(value): + paint_texture = value + queue_redraw() +@export_range(0.0, 1.0) var top_width_ratio := 0.55 + +# Set by the tray when it spawns this piece. +var drop_catcher: Control # the DropCatcher node (does the 3D raycast+paint) +var tray: Node # the ModifierTray (so we can consume on use) + +# The full modifier this piece carries (texture + title + scoring rule). +var modifier: Resource + +var _dragging := false +var _home_position := Vector2.ZERO # where it sits in the tray +var _drag_offset := Vector2.ZERO # cursor-to-corner offset so it doesn't snap + +func _ready() -> void: + mouse_filter = Control.MOUSE_FILTER_STOP + if custom_minimum_size == Vector2.ZERO: + custom_minimum_size = Vector2(90, 110) + size = custom_minimum_size + +func _draw() -> void: + var w := size.x + var h := size.y + var inset := w * (1.0 - top_width_ratio) * 0.5 + var points := PackedVector2Array([ + Vector2(inset, 0), Vector2(w - inset, 0), + Vector2(w, h), Vector2(0, h), + ]) + if paint_texture != null: + var uvs := PackedVector2Array([ + Vector2(inset / w, 0), Vector2((w - inset) / w, 0), + Vector2(1, 1), Vector2(0, 1), + ]) + draw_polygon(points, PackedColorArray([Color.WHITE, Color.WHITE, Color.WHITE, Color.WHITE]), uvs, paint_texture) + else: + draw_colored_polygon(points, Color(0.8, 0.8, 0.8)) + var outline := points + outline.append(points[0]) + draw_polyline(outline, Color(0, 0, 0, 0.6), 2.0) + +func _gui_input(event: InputEvent) -> void: + if event is InputEventMouseButton and event.button_index == MOUSE_BUTTON_LEFT: + if event.pressed: + _start_drag() + else: + _end_drag() + +func _start_drag() -> void: + _dragging = true + _home_position = global_position + _drag_offset = global_position - get_global_mouse_position() + # top_level lets us move by global_position freely, ignoring the container + # layout, WITHOUT reparenting (reparenting mid-drag breaks the release event). + top_level = true + z_index = 100 # float above everything during drag + modulate.a = 0.85 + +func _end_drag() -> void: + if not _dragging: + return + _dragging = false + modulate.a = 1.0 + z_index = 0 + + # Ask the DropCatcher to try painting wherever we released. + var painted := false + print("PIECE released. drop_catcher=", drop_catcher, " modifier=", modifier) + if drop_catcher == null: + push_error("Piece has no drop_catcher reference! (tray export not set?)") + elif not drop_catcher.has_method("apply_modifier_at_screen_pos"): + push_error("drop_catcher has no apply_modifier_at_screen_pos method.") + else: + painted = drop_catcher.apply_modifier_at_screen_pos(get_global_mouse_position(), modifier) + + if painted: + # Used successfully: consume this round's modifier choices. + if tray and tray.has_method("consume"): + tray.consume() + else: + queue_free() + else: + # Missed the board: snap back home. + top_level = false + global_position = _home_position + +func _process(_delta: float) -> void: + if _dragging: + global_position = get_global_mouse_position() + _drag_offset diff --git a/Scripts/TrapezoidSwatch.gd.uid b/Scripts/TrapezoidSwatch.gd.uid new file mode 100644 index 0000000..13e5de0 --- /dev/null +++ b/Scripts/TrapezoidSwatch.gd.uid @@ -0,0 +1 @@ +uid://d0cdxnymxd6bs diff --git a/project.godot b/project.godot index 034d35b..d43d6b5 100644 --- a/project.godot +++ b/project.godot @@ -15,9 +15,18 @@ compatibility/default_parent_skeleton_in_mesh_instance_3d=true [application] config/name="Dart Game" +run/main_scene="uid://cqe6bo8v564dc" config/features=PackedStringArray("4.7", "Mobile") config/icon="res://icon.svg" +[autoload] + +ModifierCatalog="*uid://btm4dwci50xmu" + +[filesystem] + +import/blender/enabled=false + [rendering] renderer/rendering_method="mobile"