diff --git a/game/assets/store/cardboard-box.fractured.glb b/game/assets/store/cardboard-box.fractured.glb new file mode 100644 index 0000000..3802e91 Binary files /dev/null and b/game/assets/store/cardboard-box.fractured.glb differ diff --git a/game/assets/store/cardboard-box.fractured.glb.import b/game/assets/store/cardboard-box.fractured.glb.import new file mode 100644 index 0000000..6f0d7df --- /dev/null +++ b/game/assets/store/cardboard-box.fractured.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://cldpwxy8ebe6w" +path="res://.godot/imported/cardboard-box.fractured.glb-d0141d7eb4780d437d9ec7b3e7b5568b.scn" + +[deps] + +source_file="res://assets/store/cardboard-box.fractured.glb" +dest_files=["res://.godot/imported/cardboard-box.fractured.glb-d0141d7eb4780d437d9ec7b3e7b5568b.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/game/assets/store/cardboard-box.glb b/game/assets/store/cardboard-box.glb new file mode 100644 index 0000000..4d23d95 Binary files /dev/null and b/game/assets/store/cardboard-box.glb differ diff --git a/game/assets/store/cardboard-box.glb.import b/game/assets/store/cardboard-box.glb.import new file mode 100644 index 0000000..acf85c8 --- /dev/null +++ b/game/assets/store/cardboard-box.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://51dgs1keicby" +path="res://.godot/imported/cardboard-box.glb-e92b482df2eda3154fa80c653739460e.scn" + +[deps] + +source_file="res://assets/store/cardboard-box.glb" +dest_files=["res://.godot/imported/cardboard-box.glb-e92b482df2eda3154fa80c653739460e.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/game/assets/store/cardboard-box_Image_0.png b/game/assets/store/cardboard-box_Image_0.png new file mode 100644 index 0000000..ab71026 Binary files /dev/null and b/game/assets/store/cardboard-box_Image_0.png differ diff --git a/game/assets/store/cardboard-box_Image_0.png.import b/game/assets/store/cardboard-box_Image_0.png.import new file mode 100644 index 0000000..2678ea9 --- /dev/null +++ b/game/assets/store/cardboard-box_Image_0.png.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://da7nw437f560t" +path="res://.godot/imported/cardboard-box_Image_0.png-1ee980fda9ae4d497f5cca190eeb76c8.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "0cf1114797fe45a81d154d2fcc0a4f46" +} + +[deps] + +source_file="res://assets/store/cardboard-box_Image_0.png" +dest_files=["res://.godot/imported/cardboard-box_Image_0.png-1ee980fda9ae4d497f5cca190eeb76c8.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=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=1 diff --git a/game/assets/store/crate.fractured.glb b/game/assets/store/crate.fractured.glb new file mode 100644 index 0000000..721176e Binary files /dev/null and b/game/assets/store/crate.fractured.glb differ diff --git a/game/assets/store/crate.fractured.glb.import b/game/assets/store/crate.fractured.glb.import new file mode 100644 index 0000000..4feaad5 --- /dev/null +++ b/game/assets/store/crate.fractured.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://b6naq4mbi7t14" +path="res://.godot/imported/crate.fractured.glb-cb965a57396bc7ebfe2cebf951d63ad9.scn" + +[deps] + +source_file="res://assets/store/crate.fractured.glb" +dest_files=["res://.godot/imported/crate.fractured.glb-cb965a57396bc7ebfe2cebf951d63ad9.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/game/assets/store/crt-monitor.fractured.glb b/game/assets/store/crt-monitor.fractured.glb new file mode 100644 index 0000000..cb45101 Binary files /dev/null and b/game/assets/store/crt-monitor.fractured.glb differ diff --git a/game/assets/store/crt-monitor.fractured.glb.import b/game/assets/store/crt-monitor.fractured.glb.import new file mode 100644 index 0000000..80b7a1f --- /dev/null +++ b/game/assets/store/crt-monitor.fractured.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://cmxb08u2e2tnp" +path="res://.godot/imported/crt-monitor.fractured.glb-42214cad9a9d1a706b9270071b7698fd.scn" + +[deps] + +source_file="res://assets/store/crt-monitor.fractured.glb" +dest_files=["res://.godot/imported/crt-monitor.fractured.glb-42214cad9a9d1a706b9270071b7698fd.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/game/assets/store/crt-monitor.glb b/game/assets/store/crt-monitor.glb new file mode 100644 index 0000000..6d7aa2f Binary files /dev/null and b/game/assets/store/crt-monitor.glb differ diff --git a/game/assets/store/crt-monitor.glb.import b/game/assets/store/crt-monitor.glb.import new file mode 100644 index 0000000..0ca0619 --- /dev/null +++ b/game/assets/store/crt-monitor.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://cij60lf1jcvqy" +path="res://.godot/imported/crt-monitor.glb-0e8f40a2f331af5ccd79df45dc33ac27.scn" + +[deps] + +source_file="res://assets/store/crt-monitor.glb" +dest_files=["res://.godot/imported/crt-monitor.glb-0e8f40a2f331af5ccd79df45dc33ac27.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/game/assets/store/crt-monitor_Image_0.png b/game/assets/store/crt-monitor_Image_0.png new file mode 100644 index 0000000..c3bdbef Binary files /dev/null and b/game/assets/store/crt-monitor_Image_0.png differ diff --git a/game/assets/store/crt-monitor_Image_0.png.import b/game/assets/store/crt-monitor_Image_0.png.import new file mode 100644 index 0000000..4471fec --- /dev/null +++ b/game/assets/store/crt-monitor_Image_0.png.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://drngjhms1rnpn" +path="res://.godot/imported/crt-monitor_Image_0.png-da1d917eff01416cd93723dced8b6369.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "3875bd2eff71b363cd60ad42044396e3" +} + +[deps] + +source_file="res://assets/store/crt-monitor_Image_0.png" +dest_files=["res://.godot/imported/crt-monitor_Image_0.png-da1d917eff01416cd93723dced8b6369.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=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=1 diff --git a/game/assets/store/filing-cabinet.fractured.glb b/game/assets/store/filing-cabinet.fractured.glb new file mode 100644 index 0000000..f99dc4a Binary files /dev/null and b/game/assets/store/filing-cabinet.fractured.glb differ diff --git a/game/assets/store/filing-cabinet.fractured.glb.import b/game/assets/store/filing-cabinet.fractured.glb.import new file mode 100644 index 0000000..b493da5 --- /dev/null +++ b/game/assets/store/filing-cabinet.fractured.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://cgm6epsubjafk" +path="res://.godot/imported/filing-cabinet.fractured.glb-93114055f2088766690126f5f583ac50.scn" + +[deps] + +source_file="res://assets/store/filing-cabinet.fractured.glb" +dest_files=["res://.godot/imported/filing-cabinet.fractured.glb-93114055f2088766690126f5f583ac50.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/game/assets/store/filing-cabinet.glb b/game/assets/store/filing-cabinet.glb new file mode 100644 index 0000000..0281841 Binary files /dev/null and b/game/assets/store/filing-cabinet.glb differ diff --git a/game/assets/store/filing-cabinet.glb.import b/game/assets/store/filing-cabinet.glb.import new file mode 100644 index 0000000..f4999a7 --- /dev/null +++ b/game/assets/store/filing-cabinet.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://bljrbd26sxaxh" +path="res://.godot/imported/filing-cabinet.glb-d21e35af071b99d24049073a673e699f.scn" + +[deps] + +source_file="res://assets/store/filing-cabinet.glb" +dest_files=["res://.godot/imported/filing-cabinet.glb-d21e35af071b99d24049073a673e699f.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/game/assets/store/filing-cabinet_Image_0.png b/game/assets/store/filing-cabinet_Image_0.png new file mode 100644 index 0000000..3f000e0 Binary files /dev/null and b/game/assets/store/filing-cabinet_Image_0.png differ diff --git a/game/assets/store/filing-cabinet_Image_0.png.import b/game/assets/store/filing-cabinet_Image_0.png.import new file mode 100644 index 0000000..70bceff --- /dev/null +++ b/game/assets/store/filing-cabinet_Image_0.png.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bir2e14ccpyuo" +path="res://.godot/imported/filing-cabinet_Image_0.png-313e4db071c213a113487af87b8aea31.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "ccf317fa58cf300cc0b0127ce3c8ee2b" +} + +[deps] + +source_file="res://assets/store/filing-cabinet_Image_0.png" +dest_files=["res://.godot/imported/filing-cabinet_Image_0.png-313e4db071c213a113487af87b8aea31.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=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=1 diff --git a/game/assets/store/office-desk.fractured.glb b/game/assets/store/office-desk.fractured.glb new file mode 100644 index 0000000..77d365c Binary files /dev/null and b/game/assets/store/office-desk.fractured.glb differ diff --git a/game/assets/store/office-desk.fractured.glb.import b/game/assets/store/office-desk.fractured.glb.import new file mode 100644 index 0000000..cf7c5ce --- /dev/null +++ b/game/assets/store/office-desk.fractured.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://0wo3wsr311a8" +path="res://.godot/imported/office-desk.fractured.glb-094268c83c7776ca65d3808ee2007ee0.scn" + +[deps] + +source_file="res://assets/store/office-desk.fractured.glb" +dest_files=["res://.godot/imported/office-desk.fractured.glb-094268c83c7776ca65d3808ee2007ee0.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/game/assets/store/office-desk.glb b/game/assets/store/office-desk.glb new file mode 100644 index 0000000..a40f92a Binary files /dev/null and b/game/assets/store/office-desk.glb differ diff --git a/game/assets/store/office-desk.glb.import b/game/assets/store/office-desk.glb.import new file mode 100644 index 0000000..cca8e2d --- /dev/null +++ b/game/assets/store/office-desk.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://b4hxnw76jhwl8" +path="res://.godot/imported/office-desk.glb-14e954475893c49cbce5ceecd986038b.scn" + +[deps] + +source_file="res://assets/store/office-desk.glb" +dest_files=["res://.godot/imported/office-desk.glb-14e954475893c49cbce5ceecd986038b.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/game/assets/store/office-desk_Image_0.png b/game/assets/store/office-desk_Image_0.png new file mode 100644 index 0000000..60eefdd Binary files /dev/null and b/game/assets/store/office-desk_Image_0.png differ diff --git a/game/assets/store/office-desk_Image_0.png.import b/game/assets/store/office-desk_Image_0.png.import new file mode 100644 index 0000000..e29c1f4 --- /dev/null +++ b/game/assets/store/office-desk_Image_0.png.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c4jdtjsy2a4d2" +path="res://.godot/imported/office-desk_Image_0.png-b0bb1e28cdc788a542ac6f6a6412e209.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "3e881cbe87ea8723040dd9e590ac23b6" +} + +[deps] + +source_file="res://assets/store/office-desk_Image_0.png" +dest_files=["res://.godot/imported/office-desk_Image_0.png-b0bb1e28cdc788a542ac6f6a6412e209.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=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=1 diff --git a/game/assets/store/office-printer.fractured.glb b/game/assets/store/office-printer.fractured.glb new file mode 100644 index 0000000..70eab19 Binary files /dev/null and b/game/assets/store/office-printer.fractured.glb differ diff --git a/game/assets/store/office-printer.fractured.glb.import b/game/assets/store/office-printer.fractured.glb.import new file mode 100644 index 0000000..9e6f2d9 --- /dev/null +++ b/game/assets/store/office-printer.fractured.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://dktkliu5co00q" +path="res://.godot/imported/office-printer.fractured.glb-f2a939dd3b877e8fa91b39ba6b31bf79.scn" + +[deps] + +source_file="res://assets/store/office-printer.fractured.glb" +dest_files=["res://.godot/imported/office-printer.fractured.glb-f2a939dd3b877e8fa91b39ba6b31bf79.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/game/assets/store/office-printer.glb b/game/assets/store/office-printer.glb new file mode 100644 index 0000000..9cca8ac Binary files /dev/null and b/game/assets/store/office-printer.glb differ diff --git a/game/assets/store/office-printer.glb.import b/game/assets/store/office-printer.glb.import new file mode 100644 index 0000000..88e90e0 --- /dev/null +++ b/game/assets/store/office-printer.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://m4b3s4a35spx" +path="res://.godot/imported/office-printer.glb-dc3bb75868dbdf057e896d7e43fb7f1a.scn" + +[deps] + +source_file="res://assets/store/office-printer.glb" +dest_files=["res://.godot/imported/office-printer.glb-dc3bb75868dbdf057e896d7e43fb7f1a.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/game/assets/store/office-printer_Image_0.png b/game/assets/store/office-printer_Image_0.png new file mode 100644 index 0000000..7f48dcc Binary files /dev/null and b/game/assets/store/office-printer_Image_0.png differ diff --git a/game/assets/store/office-printer_Image_0.png.import b/game/assets/store/office-printer_Image_0.png.import new file mode 100644 index 0000000..bcae4ad --- /dev/null +++ b/game/assets/store/office-printer_Image_0.png.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dbaffh0f136nx" +path="res://.godot/imported/office-printer_Image_0.png-519809ff2a7badc15e516223548200d4.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "5e512866a9375ed59c4ac7fdb2afc748" +} + +[deps] + +source_file="res://assets/store/office-printer_Image_0.png" +dest_files=["res://.godot/imported/office-printer_Image_0.png-519809ff2a7badc15e516223548200d4.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=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=1 diff --git a/game/assets/store/rack.fractured.glb b/game/assets/store/rack.fractured.glb new file mode 100644 index 0000000..864aab4 Binary files /dev/null and b/game/assets/store/rack.fractured.glb differ diff --git a/game/assets/store/rack.fractured.glb.import b/game/assets/store/rack.fractured.glb.import new file mode 100644 index 0000000..eda6881 --- /dev/null +++ b/game/assets/store/rack.fractured.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://ri8j6wsd1ex4" +path="res://.godot/imported/rack.fractured.glb-f892363a7e228b97e6bfd0b320cb5753.scn" + +[deps] + +source_file="res://assets/store/rack.fractured.glb" +dest_files=["res://.godot/imported/rack.fractured.glb-f892363a7e228b97e6bfd0b320cb5753.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/game/assets/store/record.fractured.glb b/game/assets/store/record.fractured.glb new file mode 100644 index 0000000..86d07ca Binary files /dev/null and b/game/assets/store/record.fractured.glb differ diff --git a/game/assets/store/record.fractured.glb.import b/game/assets/store/record.fractured.glb.import new file mode 100644 index 0000000..356f3f3 --- /dev/null +++ b/game/assets/store/record.fractured.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://cuqm3vvha85kd" +path="res://.godot/imported/record.fractured.glb-f8b1ce37c2fbe8031f9191a3f4cce206.scn" + +[deps] + +source_file="res://assets/store/record.fractured.glb" +dest_files=["res://.godot/imported/record.fractured.glb-f8b1ce37c2fbe8031f9191a3f4cce206.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/game/assets/store/turntable.fractured.glb b/game/assets/store/turntable.fractured.glb new file mode 100644 index 0000000..6d8dcf5 Binary files /dev/null and b/game/assets/store/turntable.fractured.glb differ diff --git a/game/assets/store/turntable.fractured.glb.import b/game/assets/store/turntable.fractured.glb.import new file mode 100644 index 0000000..948d058 --- /dev/null +++ b/game/assets/store/turntable.fractured.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://dc1igsoj2qvkp" +path="res://.godot/imported/turntable.fractured.glb-6652c6f03732c845088964dcd74889f6.scn" + +[deps] + +source_file="res://assets/store/turntable.fractured.glb" +dest_files=["res://.godot/imported/turntable.fractured.glb-6652c6f03732c845088964dcd74889f6.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/game/assets/store/turntable.glb b/game/assets/store/turntable.glb new file mode 100644 index 0000000..8bde6f8 Binary files /dev/null and b/game/assets/store/turntable.glb differ diff --git a/game/assets/store/turntable.glb.import b/game/assets/store/turntable.glb.import new file mode 100644 index 0000000..21e1049 --- /dev/null +++ b/game/assets/store/turntable.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://diehyaj8yw1t3" +path="res://.godot/imported/turntable.glb-b8ad15a2053fefd4c7a12c3afb7042d7.scn" + +[deps] + +source_file="res://assets/store/turntable.glb" +dest_files=["res://.godot/imported/turntable.glb-b8ad15a2053fefd4c7a12c3afb7042d7.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/game/assets/store/turntable_Image_0.png b/game/assets/store/turntable_Image_0.png new file mode 100644 index 0000000..7a5942f Binary files /dev/null and b/game/assets/store/turntable_Image_0.png differ diff --git a/game/assets/store/turntable_Image_0.png.import b/game/assets/store/turntable_Image_0.png.import new file mode 100644 index 0000000..e7d3a13 --- /dev/null +++ b/game/assets/store/turntable_Image_0.png.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bwdpl5puobadl" +path="res://.godot/imported/turntable_Image_0.png-96693b5eca194d04c9a4e37390f0886a.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "380e36d37b70b4fb371e8ff3a77dc39b" +} + +[deps] + +source_file="res://assets/store/turntable_Image_0.png" +dest_files=["res://.godot/imported/turntable_Image_0.png-96693b5eca194d04c9a4e37390f0886a.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=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=1 diff --git a/game/assets/store/water-cooler.fractured.glb b/game/assets/store/water-cooler.fractured.glb new file mode 100644 index 0000000..459a8c4 Binary files /dev/null and b/game/assets/store/water-cooler.fractured.glb differ diff --git a/game/assets/store/water-cooler.fractured.glb.import b/game/assets/store/water-cooler.fractured.glb.import new file mode 100644 index 0000000..2656b8d --- /dev/null +++ b/game/assets/store/water-cooler.fractured.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://dqo5jteo8mx0c" +path="res://.godot/imported/water-cooler.fractured.glb-76c62cc8296c4814f4e97733dd0ae42a.scn" + +[deps] + +source_file="res://assets/store/water-cooler.fractured.glb" +dest_files=["res://.godot/imported/water-cooler.fractured.glb-76c62cc8296c4814f4e97733dd0ae42a.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/game/assets/store/water-cooler.glb b/game/assets/store/water-cooler.glb new file mode 100644 index 0000000..7b4fa7d Binary files /dev/null and b/game/assets/store/water-cooler.glb differ diff --git a/game/assets/store/water-cooler.glb.import b/game/assets/store/water-cooler.glb.import new file mode 100644 index 0000000..f8be6aa --- /dev/null +++ b/game/assets/store/water-cooler.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://desybhggydg5e" +path="res://.godot/imported/water-cooler.glb-2698baeb7745a2e3245e4c6fda087eb9.scn" + +[deps] + +source_file="res://assets/store/water-cooler.glb" +dest_files=["res://.godot/imported/water-cooler.glb-2698baeb7745a2e3245e4c6fda087eb9.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/game/assets/store/water-cooler_Image_0.png b/game/assets/store/water-cooler_Image_0.png new file mode 100644 index 0000000..0523f0f Binary files /dev/null and b/game/assets/store/water-cooler_Image_0.png differ diff --git a/game/assets/store/water-cooler_Image_0.png.import b/game/assets/store/water-cooler_Image_0.png.import new file mode 100644 index 0000000..86a217f --- /dev/null +++ b/game/assets/store/water-cooler_Image_0.png.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dp2giuk7nmmtn" +path="res://.godot/imported/water-cooler_Image_0.png-549056f3a4f7be121fc54dd397f77869.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "b9d554065d31b71c06e9c8417b773938" +} + +[deps] + +source_file="res://assets/store/water-cooler_Image_0.png" +dest_files=["res://.godot/imported/water-cooler_Image_0.png-549056f3a4f7be121fc54dd397f77869.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=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=1 diff --git a/game/scripts/Main.gd b/game/scripts/Main.gd index b7fa0f1..6209a22 100644 --- a/game/scripts/Main.gd +++ b/game/scripts/Main.gd @@ -92,6 +92,15 @@ const RACK_GLB := "res://assets/store/rack.glb" const CRATE_GLB := "res://assets/store/crate.glb" const RECORD_GLB := "res://assets/store/record.glb" +# Lane 2 hero props (each ships a .fractured.glb sibling → real shard-by-shard smashing) +const DESK_GLB := "res://assets/store/office-desk.glb" +const PRINTER_GLB := "res://assets/store/office-printer.glb" +const CRT_GLB := "res://assets/store/crt-monitor.glb" +const CABINET_GLB := "res://assets/store/filing-cabinet.glb" +const COOLER_GLB := "res://assets/store/water-cooler.glb" +const BOX_GLB := "res://assets/store/cardboard-box.glb" +const TURNTABLE_GLB := "res://assets/store/turntable.glb" + # Generated sleeve art (Nano Banana): each file is a 3x3 sheet of nine original # fictional album covers. A record picks one tile at random via uv1 scale/offset — # one texture in VRAM, eighteen different-looking records on the floor. @@ -124,6 +133,28 @@ func _build_rack(origin: Vector3) -> void: var rec := _place_record(xz + jitter, crate_top + float(i) * 0.03) (crate["piece"] as Smashable).supports.append(rec) print("[art] records skinned with sleeve art: ", _records_skinned) + _build_office(origin) + +## Lane 2's workplace props scattered as furniture, with the office PRINTER as the level +## boss on its desk (soaks several hits, dies in a bigger burst). Each of these ships a +## .fractured.glb, so _glb_piece auto-wires real chunk destruction (see there). +func _build_office(origin: Vector3) -> void: + var o := Vector2(origin.x, origin.z) + # the boss: a printer on a desk. Desk is a frozen support; smashing it drops the printer. + var desk := _glb_piece(DESK_GLB, "wood", o + Vector2(2.7, -0.3), true) + var printer := _glb_piece(PRINTER_GLB, "steel", o + Vector2(2.7, -0.3), false, desk["top"]) + var boss := printer["piece"] as Smashable + boss.is_boss = true + boss.hits_to_break = 5 # the boss soaks a beating before it bursts + boss.mass = 8.0 # heavy, so hits rock it but don't shove it off the desk + (desk["piece"] as Smashable).supports.append(printer["piece"]) + + # furniture around the booth — floor props you can wreck into real chunks + _glb_piece(CABINET_GLB, "steel", o + Vector2(-2.7, -0.3), false) + _glb_piece(COOLER_GLB, "steel", o + Vector2(3.3, 1.6), false) + _glb_piece(CRT_GLB, "glass", o + Vector2(-2.7, 1.3), false) + _glb_piece(BOX_GLB, "cardboard", o + Vector2(1.9, 2.4), false) + _glb_piece(TURNTABLE_GLB, "wood", o + Vector2(-1.7, -1.3), false) ## Spawn one grabbable Record (sleeve + nested disc) resting on `sit_on`. Mirrors ## _glb_piece's "drop the AABB bottom onto sit_on" trick, but the Record builds its own @@ -153,6 +184,10 @@ func _glb_piece(path: String, kind: String, xz: Vector2, frozen: bool, sit_on := var s := Smashable.new() s.kind = kind s.start_frozen = frozen + # real destruction: if Lane 2 shipped a .fractured.glb next to this GLB, use it + var frac := path.get_basename() + ".fractured.glb" + if ResourceLoader.exists(frac): + s.fractured_scene = load(frac) as PackedScene var packed := load(path) as PackedScene var vis: Node3D = packed.instantiate() s.add_child(vis) diff --git a/game/scripts/Smashable.gd b/game/scripts/Smashable.gd index 8da0778..a8adcf0 100644 --- a/game/scripts/Smashable.gd +++ b/game/scripts/Smashable.gd @@ -13,6 +13,16 @@ class_name Smashable @export_enum("wood", "cardboard", "vinyl", "glass", "steel") var kind: String = "wood" @export var start_frozen: bool = false +## Pre-fractured sibling (Lane 2 contract #2): a scene whose leaf `chunk_*` meshes are +## the real shards. When set, shatter() spawns those instead of primitive cubes. Main +## auto-assigns it from a `.fractured.glb` next to the intact GLB. +@export var fractured_scene: PackedScene = null +## Hits to destroy. 1 = normal (one smash breaks it). The printer boss takes several. +@export var hits_to_break: int = 1 +## Boss props get a bigger death burst (more juice particles) + survive extra hits. +@export var is_boss: bool = false +var _hits_taken := 0 + # per-material behaviour — this table is where "material identity" is authored. # brittle_speed 0.0 == not brittle (won't self-shatter on impact). const PROFILES := { @@ -58,8 +68,17 @@ func _on_body_entered(_body: Node) -> void: if _speed >= float(p["brittle_speed"]): shatter(Vector3.ZERO) -## Called by the hammer. +## Called by the hammer. Bosses (hits_to_break > 1) soak hits and visibly rock before +## the final blow shatters them; a normal prop (hits_to_break == 1) breaks on hit one. func smash(impulse: Vector3) -> void: + if _shattered: + return + _hits_taken += 1 + if _hits_taken < hits_to_break: + # survives this hit — a physical knockback so the boss reacts to the beating + sleeping = false + apply_central_impulse(impulse.limit_length(6.0) * 0.25) + return shatter(impulse) func shatter(impulse: Vector3) -> void: @@ -67,9 +86,13 @@ func shatter(impulse: Vector3) -> void: return _shattered = true var p: Dictionary = PROFILES.get(kind, PROFILES["wood"]) - smashed.emit(kind, global_position, int(p["shards"])) + var burst := 24 if is_boss else int(p["shards"]) # boss dies in a bigger cloud of juice + smashed.emit(kind, global_position, burst) _release_supported() # drop what I was holding up BEFORE I leave the tree — the cascade - _spawn_shards(int(p["shards"]), p["color"], impulse) + if fractured_scene != null: + _spawn_chunks(impulse) # real GLB shards (Lane 2) + else: + _spawn_shards(int(p["shards"]), p["color"], impulse) queue_free() ## Wake every piece this one was holding up. Guarded on both ends (each child's own @@ -93,6 +116,60 @@ func release() -> void: sleeping = false # defensive against a Jolt sleep frame apply_central_impulse(Vector3(randf_range(-0.6, 0.6), 0.15, randf_range(-0.6, 0.6))) +## Real destruction: instance the pre-fractured sibling and turn each `chunk_*` mesh into +## its own rigid body that inherits our velocity + the smash impulse. Chunks are named +## chunk_00…chunk_NN with each origin at its own centroid, in this model's local space +## (Lane 2 contract #2). We add the template at our transform so each chunk's global +## transform is already correct, then reparent it onto a fresh body. Debris group so the +## HUD count + Juice keep working. Falls back to primitive shards if the template is empty. +func _spawn_chunks(impulse: Vector3) -> void: + var parent := get_parent() + if parent == null: + return + var tmpl: Node3D = fractured_scene.instantiate() + parent.add_child(tmpl) + tmpl.global_transform = global_transform # chunks now sit exactly where the intact body was + var chunks: Array[MeshInstance3D] = [] + _collect_chunk_meshes(tmpl, chunks) + if chunks.is_empty(): + tmpl.queue_free() + var p: Dictionary = PROFILES.get(kind, PROFILES["wood"]) + _spawn_shards(int(p["shards"]), p["color"], impulse) + return + var inherited := linear_velocity + var here := global_position + for chunk in chunks: + var gt := chunk.global_transform + var body := RigidBody3D.new() + body.add_to_group("debris") + body.mass = 0.25 + # reparent the chunk mesh onto the body, centred on the body origin + chunk.owner = null + chunk.get_parent().remove_child(chunk) + body.add_child(chunk) + chunk.transform = Transform3D.IDENTITY + var ab := chunk.get_aabb() + var col := CollisionShape3D.new() + var box := BoxShape3D.new() + box.size = ab.size.max(Vector3(0.02, 0.02, 0.02)) + col.shape = box + col.position = ab.get_center() + body.add_child(col) + parent.add_child(body) + body.global_transform = gt + # fling outward from the smash centre + inherit motion + the hit impulse + var out := (gt.origin - here) + out = out.normalized() if out.length() > 0.001 else Vector3(randf_range(-1, 1), 0.5, randf_range(-1, 1)).normalized() + body.linear_velocity = inherited + out * randf_range(1.2, 3.2) + impulse * 0.3 + body.angular_velocity = Vector3(randf_range(-8, 8), randf_range(-8, 8), randf_range(-8, 8)) + tmpl.queue_free() # the now-empty template wrapper + +func _collect_chunk_meshes(n: Node, acc: Array[MeshInstance3D]) -> void: + if n is MeshInstance3D and n.name.to_lower().begins_with("chunk"): + acc.append(n) + for c in n.get_children(): + _collect_chunk_meshes(c, acc) + func _spawn_shards(n: int, color: Color, impulse: Vector3) -> void: if n <= 0: return