diff --git a/client/assets/district/CREDITS.md b/client/assets/district/CREDITS.md new file mode 100644 index 0000000..0cbc92f --- /dev/null +++ b/client/assets/district/CREDITS.md @@ -0,0 +1,26 @@ +# Prototype district art credits + +Visual assets exported from Blender for the Godot prototype district. Gameplay collision and +nav meshes remain procedural in `client/scenes/main.tscn`. + +## Sketchfab models (interactables and combat dummies) + +| File | Sketchfab author | Model | +|------|------------------|-------| +| `props/terminal.glb` | Andrey3Ds | Sci-Fi Terminal low poly | +| `props/salvage_alpha.glb` | skipperino | Scrap Metal | +| `props/subsurface_beta.glb` | skaf13 | Low Poly Dirt Crystals | +| `props/bio_gamma.glb` | ScyBTC | A bizarre alien plant | +| `props/urban_delta.glb` | sousinho | Worn crates | +| `props/target_alpha.glb` | macomix | Robot Dummy | +| `props/target_beta.glb` | evgenytvidov | Crash-test dummy | + +Review each model’s Sketchfab license before shipping beyond internal prototype use. + +## Poly Haven + +- HDRI grade reference: `shanghai_bund` +- Floor texture reference: `asphalt_03` +- Obstacle texture reference: `brick_4` + +Environment textures are baked into `prototype_district_environment.glb` where applied in Blender. diff --git a/client/assets/district/props/bio_gamma.glb b/client/assets/district/props/bio_gamma.glb new file mode 100644 index 0000000..9581668 Binary files /dev/null and b/client/assets/district/props/bio_gamma.glb differ diff --git a/client/assets/district/props/bio_gamma.glb.import b/client/assets/district/props/bio_gamma.glb.import new file mode 100644 index 0000000..27faa17 --- /dev/null +++ b/client/assets/district/props/bio_gamma.glb.import @@ -0,0 +1,42 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://d1wfv024ojoin" +path="res://.godot/imported/bio_gamma.glb-630386297b495cd1c09fa7e9ec29d763.scn" + +[deps] + +source_file="res://assets/district/props/bio_gamma.glb" +dest_files=["res://.godot/imported/bio_gamma.glb-630386297b495cd1c09fa7e9ec29d763.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +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 diff --git a/client/assets/district/props/bio_gamma_material_0_baseColor.jpg b/client/assets/district/props/bio_gamma_material_0_baseColor.jpg new file mode 100644 index 0000000..81b7d00 Binary files /dev/null and b/client/assets/district/props/bio_gamma_material_0_baseColor.jpg differ diff --git a/client/assets/district/props/bio_gamma_material_0_baseColor.jpg.import b/client/assets/district/props/bio_gamma_material_0_baseColor.jpg.import new file mode 100644 index 0000000..b470828 --- /dev/null +++ b/client/assets/district/props/bio_gamma_material_0_baseColor.jpg.import @@ -0,0 +1,44 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://e8pyxxrqvqkv" +path.s3tc="res://.godot/imported/bio_gamma_material_0_baseColor.jpg-b0743fa206ff104d915b2c5accad1858.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} +generator_parameters={ +"md5": "85b6b003aaed873c85227cb6ac14c3d5" +} + +[deps] + +source_file="res://assets/district/props/bio_gamma_material_0_baseColor.jpg" +dest_files=["res://.godot/imported/bio_gamma_material_0_baseColor.jpg-b0743fa206ff104d915b2c5accad1858.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/client/assets/district/props/salvage_alpha.glb b/client/assets/district/props/salvage_alpha.glb new file mode 100644 index 0000000..8f9ed69 Binary files /dev/null and b/client/assets/district/props/salvage_alpha.glb differ diff --git a/client/assets/district/props/salvage_alpha.glb.import b/client/assets/district/props/salvage_alpha.glb.import new file mode 100644 index 0000000..faa5642 --- /dev/null +++ b/client/assets/district/props/salvage_alpha.glb.import @@ -0,0 +1,42 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://7cijlv0md6id" +path="res://.godot/imported/salvage_alpha.glb-a660fabbdb4c4035c9c5369559ac6e5c.scn" + +[deps] + +source_file="res://assets/district/props/salvage_alpha.glb" +dest_files=["res://.godot/imported/salvage_alpha.glb-a660fabbdb4c4035c9c5369559ac6e5c.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +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 diff --git a/client/assets/district/props/salvage_alpha_DefaultMaterial_baseColor.jpg b/client/assets/district/props/salvage_alpha_DefaultMaterial_baseColor.jpg new file mode 100644 index 0000000..015e077 Binary files /dev/null and b/client/assets/district/props/salvage_alpha_DefaultMaterial_baseColor.jpg differ diff --git a/client/assets/district/props/salvage_alpha_DefaultMaterial_baseColor.jpg.import b/client/assets/district/props/salvage_alpha_DefaultMaterial_baseColor.jpg.import new file mode 100644 index 0000000..fcd60f5 --- /dev/null +++ b/client/assets/district/props/salvage_alpha_DefaultMaterial_baseColor.jpg.import @@ -0,0 +1,44 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dcgro4xqqkgpj" +path.s3tc="res://.godot/imported/salvage_alpha_DefaultMaterial_baseColor.jpg-961c5b846a7281873b63b08cd0247ca2.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} +generator_parameters={ +"md5": "378cdab9c4290380e19de7b8467b6854" +} + +[deps] + +source_file="res://assets/district/props/salvage_alpha_DefaultMaterial_baseColor.jpg" +dest_files=["res://.godot/imported/salvage_alpha_DefaultMaterial_baseColor.jpg-961c5b846a7281873b63b08cd0247ca2.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/client/assets/district/props/salvage_alpha_DefaultMaterial_metallicRoughness.png b/client/assets/district/props/salvage_alpha_DefaultMaterial_metallicRoughness.png new file mode 100644 index 0000000..7684c78 Binary files /dev/null and b/client/assets/district/props/salvage_alpha_DefaultMaterial_metallicRoughness.png differ diff --git a/client/assets/district/props/salvage_alpha_DefaultMaterial_metallicRoughness.png.import b/client/assets/district/props/salvage_alpha_DefaultMaterial_metallicRoughness.png.import new file mode 100644 index 0000000..3bf1a7e --- /dev/null +++ b/client/assets/district/props/salvage_alpha_DefaultMaterial_metallicRoughness.png.import @@ -0,0 +1,44 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://tdk7gblcub0l" +path.s3tc="res://.godot/imported/salvage_alpha_DefaultMaterial_metallicRoughness.png-af9c4ecadae1f7617fbbf0b624199356.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} +generator_parameters={ +"md5": "2191ccefcd2d63c9339768c6a23ee835" +} + +[deps] + +source_file="res://assets/district/props/salvage_alpha_DefaultMaterial_metallicRoughness.png" +dest_files=["res://.godot/imported/salvage_alpha_DefaultMaterial_metallicRoughness.png-af9c4ecadae1f7617fbbf0b624199356.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=8 +roughness/src_normal="res://assets/district/props/salvage_alpha_DefaultMaterial_normal.png" +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/client/assets/district/props/salvage_alpha_DefaultMaterial_normal.png b/client/assets/district/props/salvage_alpha_DefaultMaterial_normal.png new file mode 100644 index 0000000..d7b1b1e Binary files /dev/null and b/client/assets/district/props/salvage_alpha_DefaultMaterial_normal.png differ diff --git a/client/assets/district/props/salvage_alpha_DefaultMaterial_normal.png.import b/client/assets/district/props/salvage_alpha_DefaultMaterial_normal.png.import new file mode 100644 index 0000000..40329fb --- /dev/null +++ b/client/assets/district/props/salvage_alpha_DefaultMaterial_normal.png.import @@ -0,0 +1,44 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://s4k8jpyrc3ci" +path.s3tc="res://.godot/imported/salvage_alpha_DefaultMaterial_normal.png-2caa1081be44544012e09f111cf0e771.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} +generator_parameters={ +"md5": "ac79ed15523dc439d76f2af17dc670a6" +} + +[deps] + +source_file="res://assets/district/props/salvage_alpha_DefaultMaterial_normal.png" +dest_files=["res://.godot/imported/salvage_alpha_DefaultMaterial_normal.png-2caa1081be44544012e09f111cf0e771.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=1 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=1 +roughness/src_normal="res://assets/district/props/salvage_alpha_DefaultMaterial_normal.png" +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/client/assets/district/props/subsurface_beta.glb b/client/assets/district/props/subsurface_beta.glb new file mode 100644 index 0000000..cae27e1 Binary files /dev/null and b/client/assets/district/props/subsurface_beta.glb differ diff --git a/client/assets/district/props/subsurface_beta.glb.import b/client/assets/district/props/subsurface_beta.glb.import new file mode 100644 index 0000000..0ea1e2f --- /dev/null +++ b/client/assets/district/props/subsurface_beta.glb.import @@ -0,0 +1,42 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://bqknlbfxqvaoe" +path="res://.godot/imported/subsurface_beta.glb-6d08ed3b726e717fd8e63372f5200264.scn" + +[deps] + +source_file="res://assets/district/props/subsurface_beta.glb" +dest_files=["res://.godot/imported/subsurface_beta.glb-6d08ed3b726e717fd8e63372f5200264.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +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 diff --git a/client/assets/district/props/subsurface_beta_Material1_baseColor.jpg b/client/assets/district/props/subsurface_beta_Material1_baseColor.jpg new file mode 100644 index 0000000..6cc673c Binary files /dev/null and b/client/assets/district/props/subsurface_beta_Material1_baseColor.jpg differ diff --git a/client/assets/district/props/subsurface_beta_Material1_baseColor.jpg.import b/client/assets/district/props/subsurface_beta_Material1_baseColor.jpg.import new file mode 100644 index 0000000..23f4110 --- /dev/null +++ b/client/assets/district/props/subsurface_beta_Material1_baseColor.jpg.import @@ -0,0 +1,44 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cb6in20qok7dw" +path.s3tc="res://.godot/imported/subsurface_beta_Material1_baseColor.jpg-edb244d6650f6008175086975c457306.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} +generator_parameters={ +"md5": "f5680413b03146969e48afbed4a4c7a6" +} + +[deps] + +source_file="res://assets/district/props/subsurface_beta_Material1_baseColor.jpg" +dest_files=["res://.godot/imported/subsurface_beta_Material1_baseColor.jpg-edb244d6650f6008175086975c457306.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/client/assets/district/props/subsurface_beta_Material1_emissive.jpg b/client/assets/district/props/subsurface_beta_Material1_emissive.jpg new file mode 100644 index 0000000..95480e0 Binary files /dev/null and b/client/assets/district/props/subsurface_beta_Material1_emissive.jpg differ diff --git a/client/assets/district/props/subsurface_beta_Material1_emissive.jpg.import b/client/assets/district/props/subsurface_beta_Material1_emissive.jpg.import new file mode 100644 index 0000000..d0c3f8c --- /dev/null +++ b/client/assets/district/props/subsurface_beta_Material1_emissive.jpg.import @@ -0,0 +1,44 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bfe3qdgxsoo4e" +path.s3tc="res://.godot/imported/subsurface_beta_Material1_emissive.jpg-6bb8516ee3945ed05edea0474d24e030.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} +generator_parameters={ +"md5": "b448abd4ef0f59c1ea3112b4182246c1" +} + +[deps] + +source_file="res://assets/district/props/subsurface_beta_Material1_emissive.jpg" +dest_files=["res://.godot/imported/subsurface_beta_Material1_emissive.jpg-6bb8516ee3945ed05edea0474d24e030.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/client/assets/district/props/subsurface_beta_Material1_metallicRoughness.png b/client/assets/district/props/subsurface_beta_Material1_metallicRoughness.png new file mode 100644 index 0000000..46405da Binary files /dev/null and b/client/assets/district/props/subsurface_beta_Material1_metallicRoughness.png differ diff --git a/client/assets/district/props/subsurface_beta_Material1_metallicRoughness.png.import b/client/assets/district/props/subsurface_beta_Material1_metallicRoughness.png.import new file mode 100644 index 0000000..a973564 --- /dev/null +++ b/client/assets/district/props/subsurface_beta_Material1_metallicRoughness.png.import @@ -0,0 +1,44 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ddibfq1c6rk10" +path.s3tc="res://.godot/imported/subsurface_beta_Material1_metallicRoughness.png-bc7e7d8d7a9f10e73d24608264e92e9a.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} +generator_parameters={ +"md5": "1f4c1ffb7b76fc03b3d984b4945b8fb5" +} + +[deps] + +source_file="res://assets/district/props/subsurface_beta_Material1_metallicRoughness.png" +dest_files=["res://.godot/imported/subsurface_beta_Material1_metallicRoughness.png-bc7e7d8d7a9f10e73d24608264e92e9a.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=8 +roughness/src_normal="res://assets/district/props/subsurface_beta_Material1_normal.png" +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/client/assets/district/props/subsurface_beta_Material1_normal.png b/client/assets/district/props/subsurface_beta_Material1_normal.png new file mode 100644 index 0000000..6378b7b Binary files /dev/null and b/client/assets/district/props/subsurface_beta_Material1_normal.png differ diff --git a/client/assets/district/props/subsurface_beta_Material1_normal.png.import b/client/assets/district/props/subsurface_beta_Material1_normal.png.import new file mode 100644 index 0000000..5648555 --- /dev/null +++ b/client/assets/district/props/subsurface_beta_Material1_normal.png.import @@ -0,0 +1,44 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c83orvalg2et" +path.s3tc="res://.godot/imported/subsurface_beta_Material1_normal.png-bf1e60bb817c1b50f3d68492f7cded3c.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} +generator_parameters={ +"md5": "8a274306f2e45e263c6d5b8834714e23" +} + +[deps] + +source_file="res://assets/district/props/subsurface_beta_Material1_normal.png" +dest_files=["res://.godot/imported/subsurface_beta_Material1_normal.png-bf1e60bb817c1b50f3d68492f7cded3c.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=1 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=1 +roughness/src_normal="res://assets/district/props/subsurface_beta_Material1_normal.png" +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/client/assets/district/props/subsurface_beta_Material2_baseColor.jpg b/client/assets/district/props/subsurface_beta_Material2_baseColor.jpg new file mode 100644 index 0000000..a83d33c Binary files /dev/null and b/client/assets/district/props/subsurface_beta_Material2_baseColor.jpg differ diff --git a/client/assets/district/props/subsurface_beta_Material2_baseColor.jpg.import b/client/assets/district/props/subsurface_beta_Material2_baseColor.jpg.import new file mode 100644 index 0000000..0d072d1 --- /dev/null +++ b/client/assets/district/props/subsurface_beta_Material2_baseColor.jpg.import @@ -0,0 +1,44 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bbrgittw4jypc" +path.s3tc="res://.godot/imported/subsurface_beta_Material2_baseColor.jpg-6bb7c9ae510be476c95d45ad683af0c2.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} +generator_parameters={ +"md5": "c98137920ca14272825d4eb32a58bdea" +} + +[deps] + +source_file="res://assets/district/props/subsurface_beta_Material2_baseColor.jpg" +dest_files=["res://.godot/imported/subsurface_beta_Material2_baseColor.jpg-6bb7c9ae510be476c95d45ad683af0c2.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/client/assets/district/props/subsurface_beta_Material2_emissive.jpg b/client/assets/district/props/subsurface_beta_Material2_emissive.jpg new file mode 100644 index 0000000..bb23f7b Binary files /dev/null and b/client/assets/district/props/subsurface_beta_Material2_emissive.jpg differ diff --git a/client/assets/district/props/subsurface_beta_Material2_emissive.jpg.import b/client/assets/district/props/subsurface_beta_Material2_emissive.jpg.import new file mode 100644 index 0000000..d62860b --- /dev/null +++ b/client/assets/district/props/subsurface_beta_Material2_emissive.jpg.import @@ -0,0 +1,44 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cb4suo8bmo36o" +path.s3tc="res://.godot/imported/subsurface_beta_Material2_emissive.jpg-6641f312b6055a9da8e16b63dbf6258f.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} +generator_parameters={ +"md5": "c375f568498d77f872b8b7e7886998df" +} + +[deps] + +source_file="res://assets/district/props/subsurface_beta_Material2_emissive.jpg" +dest_files=["res://.godot/imported/subsurface_beta_Material2_emissive.jpg-6641f312b6055a9da8e16b63dbf6258f.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/client/assets/district/props/subsurface_beta_Material2_metallicRoughness.png b/client/assets/district/props/subsurface_beta_Material2_metallicRoughness.png new file mode 100644 index 0000000..59f0377 Binary files /dev/null and b/client/assets/district/props/subsurface_beta_Material2_metallicRoughness.png differ diff --git a/client/assets/district/props/subsurface_beta_Material2_metallicRoughness.png.import b/client/assets/district/props/subsurface_beta_Material2_metallicRoughness.png.import new file mode 100644 index 0000000..f87a8a2 --- /dev/null +++ b/client/assets/district/props/subsurface_beta_Material2_metallicRoughness.png.import @@ -0,0 +1,44 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bx7jtb1bg5afe" +path.s3tc="res://.godot/imported/subsurface_beta_Material2_metallicRoughness.png-cc081d1f0985ed03233c9820cdfa0d33.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} +generator_parameters={ +"md5": "67592226a82117fd040ad1267adc67bc" +} + +[deps] + +source_file="res://assets/district/props/subsurface_beta_Material2_metallicRoughness.png" +dest_files=["res://.godot/imported/subsurface_beta_Material2_metallicRoughness.png-cc081d1f0985ed03233c9820cdfa0d33.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=8 +roughness/src_normal="res://assets/district/props/subsurface_beta_Material2_normal.png" +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/client/assets/district/props/subsurface_beta_Material2_normal.png b/client/assets/district/props/subsurface_beta_Material2_normal.png new file mode 100644 index 0000000..9137915 Binary files /dev/null and b/client/assets/district/props/subsurface_beta_Material2_normal.png differ diff --git a/client/assets/district/props/subsurface_beta_Material2_normal.png.import b/client/assets/district/props/subsurface_beta_Material2_normal.png.import new file mode 100644 index 0000000..e85e678 --- /dev/null +++ b/client/assets/district/props/subsurface_beta_Material2_normal.png.import @@ -0,0 +1,44 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://duckdlykjtcpv" +path.s3tc="res://.godot/imported/subsurface_beta_Material2_normal.png-ea9e658dec591ecba03fd57fec341a28.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} +generator_parameters={ +"md5": "05a73e451a958e875249375d70ebfef7" +} + +[deps] + +source_file="res://assets/district/props/subsurface_beta_Material2_normal.png" +dest_files=["res://.godot/imported/subsurface_beta_Material2_normal.png-ea9e658dec591ecba03fd57fec341a28.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=1 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=1 +roughness/src_normal="res://assets/district/props/subsurface_beta_Material2_normal.png" +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/client/assets/district/props/subsurface_beta_Material3_baseColor.jpg b/client/assets/district/props/subsurface_beta_Material3_baseColor.jpg new file mode 100644 index 0000000..c8d3e35 Binary files /dev/null and b/client/assets/district/props/subsurface_beta_Material3_baseColor.jpg differ diff --git a/client/assets/district/props/subsurface_beta_Material3_baseColor.jpg.import b/client/assets/district/props/subsurface_beta_Material3_baseColor.jpg.import new file mode 100644 index 0000000..708d945 --- /dev/null +++ b/client/assets/district/props/subsurface_beta_Material3_baseColor.jpg.import @@ -0,0 +1,44 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://627r7t3ke2b1" +path.s3tc="res://.godot/imported/subsurface_beta_Material3_baseColor.jpg-0c212b7d93e14ba0dfddabcbe940880f.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} +generator_parameters={ +"md5": "ac00f928dda1ecb1210d33559afc3f26" +} + +[deps] + +source_file="res://assets/district/props/subsurface_beta_Material3_baseColor.jpg" +dest_files=["res://.godot/imported/subsurface_beta_Material3_baseColor.jpg-0c212b7d93e14ba0dfddabcbe940880f.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/client/assets/district/props/subsurface_beta_Material3_emissive.jpg b/client/assets/district/props/subsurface_beta_Material3_emissive.jpg new file mode 100644 index 0000000..1131ad4 Binary files /dev/null and b/client/assets/district/props/subsurface_beta_Material3_emissive.jpg differ diff --git a/client/assets/district/props/subsurface_beta_Material3_emissive.jpg.import b/client/assets/district/props/subsurface_beta_Material3_emissive.jpg.import new file mode 100644 index 0000000..8f2f31e --- /dev/null +++ b/client/assets/district/props/subsurface_beta_Material3_emissive.jpg.import @@ -0,0 +1,44 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dm3ymk1xcoaa7" +path.s3tc="res://.godot/imported/subsurface_beta_Material3_emissive.jpg-8fa9175eb60ea66e7135095adae60cce.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} +generator_parameters={ +"md5": "0e46553690001ea867e8cb1dadbe661e" +} + +[deps] + +source_file="res://assets/district/props/subsurface_beta_Material3_emissive.jpg" +dest_files=["res://.godot/imported/subsurface_beta_Material3_emissive.jpg-8fa9175eb60ea66e7135095adae60cce.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/client/assets/district/props/subsurface_beta_Material3_metallicRoughness.png b/client/assets/district/props/subsurface_beta_Material3_metallicRoughness.png new file mode 100644 index 0000000..36d2625 Binary files /dev/null and b/client/assets/district/props/subsurface_beta_Material3_metallicRoughness.png differ diff --git a/client/assets/district/props/subsurface_beta_Material3_metallicRoughness.png.import b/client/assets/district/props/subsurface_beta_Material3_metallicRoughness.png.import new file mode 100644 index 0000000..13aa9d0 --- /dev/null +++ b/client/assets/district/props/subsurface_beta_Material3_metallicRoughness.png.import @@ -0,0 +1,44 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b8u1tgyp1t5t7" +path.s3tc="res://.godot/imported/subsurface_beta_Material3_metallicRoughness.png-ead169fa266b399309a60a81864dc112.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} +generator_parameters={ +"md5": "669a504ccaece4afc1b90b5b7d14bec2" +} + +[deps] + +source_file="res://assets/district/props/subsurface_beta_Material3_metallicRoughness.png" +dest_files=["res://.godot/imported/subsurface_beta_Material3_metallicRoughness.png-ead169fa266b399309a60a81864dc112.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=8 +roughness/src_normal="res://assets/district/props/subsurface_beta_Material3_normal.png" +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/client/assets/district/props/subsurface_beta_Material3_normal.png b/client/assets/district/props/subsurface_beta_Material3_normal.png new file mode 100644 index 0000000..2f07928 Binary files /dev/null and b/client/assets/district/props/subsurface_beta_Material3_normal.png differ diff --git a/client/assets/district/props/subsurface_beta_Material3_normal.png.import b/client/assets/district/props/subsurface_beta_Material3_normal.png.import new file mode 100644 index 0000000..ebf2fc7 --- /dev/null +++ b/client/assets/district/props/subsurface_beta_Material3_normal.png.import @@ -0,0 +1,44 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b7tu7erm2v76p" +path.s3tc="res://.godot/imported/subsurface_beta_Material3_normal.png-f440ec3f1aae6ba7d29782762dea1a8e.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} +generator_parameters={ +"md5": "f256255200957c8150efcb886d76d213" +} + +[deps] + +source_file="res://assets/district/props/subsurface_beta_Material3_normal.png" +dest_files=["res://.godot/imported/subsurface_beta_Material3_normal.png-f440ec3f1aae6ba7d29782762dea1a8e.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=1 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=1 +roughness/src_normal="res://assets/district/props/subsurface_beta_Material3_normal.png" +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/client/assets/district/props/subsurface_beta_Material4_baseColor.jpg b/client/assets/district/props/subsurface_beta_Material4_baseColor.jpg new file mode 100644 index 0000000..882680e Binary files /dev/null and b/client/assets/district/props/subsurface_beta_Material4_baseColor.jpg differ diff --git a/client/assets/district/props/subsurface_beta_Material4_baseColor.jpg.import b/client/assets/district/props/subsurface_beta_Material4_baseColor.jpg.import new file mode 100644 index 0000000..724e2a6 --- /dev/null +++ b/client/assets/district/props/subsurface_beta_Material4_baseColor.jpg.import @@ -0,0 +1,44 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://uw6akosqbysj" +path.s3tc="res://.godot/imported/subsurface_beta_Material4_baseColor.jpg-884e241b42d06e79d016a6f6efaa0f48.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} +generator_parameters={ +"md5": "a3633312d0028acaf4bfdf76e37ddb93" +} + +[deps] + +source_file="res://assets/district/props/subsurface_beta_Material4_baseColor.jpg" +dest_files=["res://.godot/imported/subsurface_beta_Material4_baseColor.jpg-884e241b42d06e79d016a6f6efaa0f48.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/client/assets/district/props/subsurface_beta_Material4_emissive.jpg b/client/assets/district/props/subsurface_beta_Material4_emissive.jpg new file mode 100644 index 0000000..9bb4a7b Binary files /dev/null and b/client/assets/district/props/subsurface_beta_Material4_emissive.jpg differ diff --git a/client/assets/district/props/subsurface_beta_Material4_emissive.jpg.import b/client/assets/district/props/subsurface_beta_Material4_emissive.jpg.import new file mode 100644 index 0000000..6e8a698 --- /dev/null +++ b/client/assets/district/props/subsurface_beta_Material4_emissive.jpg.import @@ -0,0 +1,44 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b1pkpj8x2lblg" +path.s3tc="res://.godot/imported/subsurface_beta_Material4_emissive.jpg-b355e35fb4e3bc4d82974c34a590176e.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} +generator_parameters={ +"md5": "58b638f6815a9214ce55b6b592c80a93" +} + +[deps] + +source_file="res://assets/district/props/subsurface_beta_Material4_emissive.jpg" +dest_files=["res://.godot/imported/subsurface_beta_Material4_emissive.jpg-b355e35fb4e3bc4d82974c34a590176e.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/client/assets/district/props/subsurface_beta_Material4_metallicRoughness.png b/client/assets/district/props/subsurface_beta_Material4_metallicRoughness.png new file mode 100644 index 0000000..36abcac Binary files /dev/null and b/client/assets/district/props/subsurface_beta_Material4_metallicRoughness.png differ diff --git a/client/assets/district/props/subsurface_beta_Material4_metallicRoughness.png.import b/client/assets/district/props/subsurface_beta_Material4_metallicRoughness.png.import new file mode 100644 index 0000000..1abf012 --- /dev/null +++ b/client/assets/district/props/subsurface_beta_Material4_metallicRoughness.png.import @@ -0,0 +1,44 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dlexajdytto26" +path.s3tc="res://.godot/imported/subsurface_beta_Material4_metallicRoughness.png-7c2053aac9d3be19cde144026d9a6c29.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} +generator_parameters={ +"md5": "5ec5cb7589e1d0c09dbc28e5514265f3" +} + +[deps] + +source_file="res://assets/district/props/subsurface_beta_Material4_metallicRoughness.png" +dest_files=["res://.godot/imported/subsurface_beta_Material4_metallicRoughness.png-7c2053aac9d3be19cde144026d9a6c29.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=8 +roughness/src_normal="res://assets/district/props/subsurface_beta_Material4_normal.png" +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/client/assets/district/props/subsurface_beta_Material4_normal.png b/client/assets/district/props/subsurface_beta_Material4_normal.png new file mode 100644 index 0000000..c709601 Binary files /dev/null and b/client/assets/district/props/subsurface_beta_Material4_normal.png differ diff --git a/client/assets/district/props/subsurface_beta_Material4_normal.png.import b/client/assets/district/props/subsurface_beta_Material4_normal.png.import new file mode 100644 index 0000000..779baae --- /dev/null +++ b/client/assets/district/props/subsurface_beta_Material4_normal.png.import @@ -0,0 +1,44 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://d12h3hmlfspa8" +path.s3tc="res://.godot/imported/subsurface_beta_Material4_normal.png-4b1c554fe8ac18774f9a1f19100f25c4.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} +generator_parameters={ +"md5": "e189ac98c77e2b796ba103722c84d552" +} + +[deps] + +source_file="res://assets/district/props/subsurface_beta_Material4_normal.png" +dest_files=["res://.godot/imported/subsurface_beta_Material4_normal.png-4b1c554fe8ac18774f9a1f19100f25c4.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=1 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=1 +roughness/src_normal="res://assets/district/props/subsurface_beta_Material4_normal.png" +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/client/assets/district/props/subsurface_beta_Material5_baseColor.jpg b/client/assets/district/props/subsurface_beta_Material5_baseColor.jpg new file mode 100644 index 0000000..0ef04cb Binary files /dev/null and b/client/assets/district/props/subsurface_beta_Material5_baseColor.jpg differ diff --git a/client/assets/district/props/subsurface_beta_Material5_baseColor.jpg.import b/client/assets/district/props/subsurface_beta_Material5_baseColor.jpg.import new file mode 100644 index 0000000..9309663 --- /dev/null +++ b/client/assets/district/props/subsurface_beta_Material5_baseColor.jpg.import @@ -0,0 +1,44 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cahq31lty83p3" +path.s3tc="res://.godot/imported/subsurface_beta_Material5_baseColor.jpg-62993e2d8a3acf8325e8b76503c9f60f.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} +generator_parameters={ +"md5": "b689294e0529e0b973afbf12604bfbd0" +} + +[deps] + +source_file="res://assets/district/props/subsurface_beta_Material5_baseColor.jpg" +dest_files=["res://.godot/imported/subsurface_beta_Material5_baseColor.jpg-62993e2d8a3acf8325e8b76503c9f60f.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/client/assets/district/props/subsurface_beta_Material5_emissive.jpg b/client/assets/district/props/subsurface_beta_Material5_emissive.jpg new file mode 100644 index 0000000..6d95cd5 Binary files /dev/null and b/client/assets/district/props/subsurface_beta_Material5_emissive.jpg differ diff --git a/client/assets/district/props/subsurface_beta_Material5_emissive.jpg.import b/client/assets/district/props/subsurface_beta_Material5_emissive.jpg.import new file mode 100644 index 0000000..5413b81 --- /dev/null +++ b/client/assets/district/props/subsurface_beta_Material5_emissive.jpg.import @@ -0,0 +1,44 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://y7grp6evtlr8" +path.s3tc="res://.godot/imported/subsurface_beta_Material5_emissive.jpg-e179ec15e23a75d63537d7c7718d6428.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} +generator_parameters={ +"md5": "85ed9ba9a78feb24b96051cb8f3166d4" +} + +[deps] + +source_file="res://assets/district/props/subsurface_beta_Material5_emissive.jpg" +dest_files=["res://.godot/imported/subsurface_beta_Material5_emissive.jpg-e179ec15e23a75d63537d7c7718d6428.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/client/assets/district/props/subsurface_beta_Material5_metallicRoughness.png b/client/assets/district/props/subsurface_beta_Material5_metallicRoughness.png new file mode 100644 index 0000000..3b3ae3c Binary files /dev/null and b/client/assets/district/props/subsurface_beta_Material5_metallicRoughness.png differ diff --git a/client/assets/district/props/subsurface_beta_Material5_metallicRoughness.png.import b/client/assets/district/props/subsurface_beta_Material5_metallicRoughness.png.import new file mode 100644 index 0000000..6c3d598 --- /dev/null +++ b/client/assets/district/props/subsurface_beta_Material5_metallicRoughness.png.import @@ -0,0 +1,44 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bhxrboubyolsm" +path.s3tc="res://.godot/imported/subsurface_beta_Material5_metallicRoughness.png-9d3ed4e7dde22c424c1bfc197d9b4b57.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} +generator_parameters={ +"md5": "b6f8921e7f4b28c43fec8f47a2a9e45d" +} + +[deps] + +source_file="res://assets/district/props/subsurface_beta_Material5_metallicRoughness.png" +dest_files=["res://.godot/imported/subsurface_beta_Material5_metallicRoughness.png-9d3ed4e7dde22c424c1bfc197d9b4b57.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=8 +roughness/src_normal="res://assets/district/props/subsurface_beta_Material5_normal.png" +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/client/assets/district/props/subsurface_beta_Material5_normal.png b/client/assets/district/props/subsurface_beta_Material5_normal.png new file mode 100644 index 0000000..f04e95f Binary files /dev/null and b/client/assets/district/props/subsurface_beta_Material5_normal.png differ diff --git a/client/assets/district/props/subsurface_beta_Material5_normal.png.import b/client/assets/district/props/subsurface_beta_Material5_normal.png.import new file mode 100644 index 0000000..ea61c55 --- /dev/null +++ b/client/assets/district/props/subsurface_beta_Material5_normal.png.import @@ -0,0 +1,44 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dtctifx0o4mfc" +path.s3tc="res://.godot/imported/subsurface_beta_Material5_normal.png-11f21eeffddf9c9d5cdf59dda786b09f.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} +generator_parameters={ +"md5": "4be1885ec1e83b6a5d38135bf0b7df9f" +} + +[deps] + +source_file="res://assets/district/props/subsurface_beta_Material5_normal.png" +dest_files=["res://.godot/imported/subsurface_beta_Material5_normal.png-11f21eeffddf9c9d5cdf59dda786b09f.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=1 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=1 +roughness/src_normal="res://assets/district/props/subsurface_beta_Material5_normal.png" +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/client/assets/district/props/target_alpha.glb b/client/assets/district/props/target_alpha.glb new file mode 100644 index 0000000..9be2434 Binary files /dev/null and b/client/assets/district/props/target_alpha.glb differ diff --git a/client/assets/district/props/target_alpha.glb.import b/client/assets/district/props/target_alpha.glb.import new file mode 100644 index 0000000..bc850e1 --- /dev/null +++ b/client/assets/district/props/target_alpha.glb.import @@ -0,0 +1,42 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://cmbsikvmknpcr" +path="res://.godot/imported/target_alpha.glb-643bc6a1fde327eaaee6fdf6f13c3d62.scn" + +[deps] + +source_file="res://assets/district/props/target_alpha.glb" +dest_files=["res://.godot/imported/target_alpha.glb-643bc6a1fde327eaaee6fdf6f13c3d62.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +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 diff --git a/client/assets/district/props/target_beta.glb b/client/assets/district/props/target_beta.glb new file mode 100644 index 0000000..90fef81 Binary files /dev/null and b/client/assets/district/props/target_beta.glb differ diff --git a/client/assets/district/props/target_beta.glb.import b/client/assets/district/props/target_beta.glb.import new file mode 100644 index 0000000..63b3c1d --- /dev/null +++ b/client/assets/district/props/target_beta.glb.import @@ -0,0 +1,42 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://djyskextg7hg4" +path="res://.godot/imported/target_beta.glb-87e3ecd303cacf7522546cc04eb1c56a.scn" + +[deps] + +source_file="res://assets/district/props/target_beta.glb" +dest_files=["res://.godot/imported/target_beta.glb-87e3ecd303cacf7522546cc04eb1c56a.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +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 diff --git a/client/assets/district/props/target_beta_material_0_baseColor.png b/client/assets/district/props/target_beta_material_0_baseColor.png new file mode 100644 index 0000000..a6ced42 Binary files /dev/null and b/client/assets/district/props/target_beta_material_0_baseColor.png differ diff --git a/client/assets/district/props/target_beta_material_0_baseColor.png.import b/client/assets/district/props/target_beta_material_0_baseColor.png.import new file mode 100644 index 0000000..1dc265d --- /dev/null +++ b/client/assets/district/props/target_beta_material_0_baseColor.png.import @@ -0,0 +1,44 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bwq517xgxbj31" +path.s3tc="res://.godot/imported/target_beta_material_0_baseColor.png-6280289f392e7b923a144af929695a59.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} +generator_parameters={ +"md5": "10cd1e3e4199248ba9bdc1d4498a210f" +} + +[deps] + +source_file="res://assets/district/props/target_beta_material_0_baseColor.png" +dest_files=["res://.godot/imported/target_beta_material_0_baseColor.png-6280289f392e7b923a144af929695a59.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/client/assets/district/props/terminal.glb b/client/assets/district/props/terminal.glb new file mode 100644 index 0000000..c34cc3f Binary files /dev/null and b/client/assets/district/props/terminal.glb differ diff --git a/client/assets/district/props/terminal.glb.import b/client/assets/district/props/terminal.glb.import new file mode 100644 index 0000000..2c31734 --- /dev/null +++ b/client/assets/district/props/terminal.glb.import @@ -0,0 +1,42 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://cslcq8l7bi1oc" +path="res://.godot/imported/terminal.glb-f2b1f04cc6d4556d4edaae8e65fb0d77.scn" + +[deps] + +source_file="res://assets/district/props/terminal.glb" +dest_files=["res://.godot/imported/terminal.glb-f2b1f04cc6d4556d4edaae8e65fb0d77.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +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 diff --git a/client/assets/district/props/terminal_Terminal_0_baseColor.png b/client/assets/district/props/terminal_Terminal_0_baseColor.png new file mode 100644 index 0000000..19faf1e Binary files /dev/null and b/client/assets/district/props/terminal_Terminal_0_baseColor.png differ diff --git a/client/assets/district/props/terminal_Terminal_0_baseColor.png.import b/client/assets/district/props/terminal_Terminal_0_baseColor.png.import new file mode 100644 index 0000000..24c760a --- /dev/null +++ b/client/assets/district/props/terminal_Terminal_0_baseColor.png.import @@ -0,0 +1,44 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dcv5rtujvkr4c" +path.s3tc="res://.godot/imported/terminal_Terminal_0_baseColor.png-6198962fc0328f34d5111f035ff5f731.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} +generator_parameters={ +"md5": "48c5a62df18607911895dee7663c37de" +} + +[deps] + +source_file="res://assets/district/props/terminal_Terminal_0_baseColor.png" +dest_files=["res://.godot/imported/terminal_Terminal_0_baseColor.png-6198962fc0328f34d5111f035ff5f731.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/client/assets/district/props/terminal_Terminal_0_emissive.jpg b/client/assets/district/props/terminal_Terminal_0_emissive.jpg new file mode 100644 index 0000000..79aa48b Binary files /dev/null and b/client/assets/district/props/terminal_Terminal_0_emissive.jpg differ diff --git a/client/assets/district/props/terminal_Terminal_0_emissive.jpg.import b/client/assets/district/props/terminal_Terminal_0_emissive.jpg.import new file mode 100644 index 0000000..f6582c8 --- /dev/null +++ b/client/assets/district/props/terminal_Terminal_0_emissive.jpg.import @@ -0,0 +1,44 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://30h1w1q3gsfr" +path.s3tc="res://.godot/imported/terminal_Terminal_0_emissive.jpg-18691055598d1cb8bc377dbfee3d39e9.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} +generator_parameters={ +"md5": "034c7561f290f970c1bdbb26190f30b8" +} + +[deps] + +source_file="res://assets/district/props/terminal_Terminal_0_emissive.jpg" +dest_files=["res://.godot/imported/terminal_Terminal_0_emissive.jpg-18691055598d1cb8bc377dbfee3d39e9.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/client/assets/district/props/terminal_Terminal_0_metallicRoughness.png b/client/assets/district/props/terminal_Terminal_0_metallicRoughness.png new file mode 100644 index 0000000..57f77e8 Binary files /dev/null and b/client/assets/district/props/terminal_Terminal_0_metallicRoughness.png differ diff --git a/client/assets/district/props/terminal_Terminal_0_metallicRoughness.png.import b/client/assets/district/props/terminal_Terminal_0_metallicRoughness.png.import new file mode 100644 index 0000000..2949b6a --- /dev/null +++ b/client/assets/district/props/terminal_Terminal_0_metallicRoughness.png.import @@ -0,0 +1,44 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://l7lyjq4eqspi" +path.s3tc="res://.godot/imported/terminal_Terminal_0_metallicRoughness.png-466d9ade66abf4c7d06f920b06673649.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} +generator_parameters={ +"md5": "e7f0d97be1cde36ce94120405895a0bf" +} + +[deps] + +source_file="res://assets/district/props/terminal_Terminal_0_metallicRoughness.png" +dest_files=["res://.godot/imported/terminal_Terminal_0_metallicRoughness.png-466d9ade66abf4c7d06f920b06673649.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/client/assets/district/props/terminal_Terminal_0_normal.png b/client/assets/district/props/terminal_Terminal_0_normal.png new file mode 100644 index 0000000..c757e73 Binary files /dev/null and b/client/assets/district/props/terminal_Terminal_0_normal.png differ diff --git a/client/assets/district/props/terminal_Terminal_0_normal.png.import b/client/assets/district/props/terminal_Terminal_0_normal.png.import new file mode 100644 index 0000000..aca87c4 --- /dev/null +++ b/client/assets/district/props/terminal_Terminal_0_normal.png.import @@ -0,0 +1,44 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cenryw07bqmmu" +path.s3tc="res://.godot/imported/terminal_Terminal_0_normal.png-8e8cd0ed3c381a833558fd4954f74cdb.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} +generator_parameters={ +"md5": "4a52de8473480cd921357256040b4e85" +} + +[deps] + +source_file="res://assets/district/props/terminal_Terminal_0_normal.png" +dest_files=["res://.godot/imported/terminal_Terminal_0_normal.png-8e8cd0ed3c381a833558fd4954f74cdb.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=1 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=1 +roughness/src_normal="res://assets/district/props/terminal_Terminal_0_normal.png" +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/client/assets/district/props/terminal_Terminal_baseColor.png b/client/assets/district/props/terminal_Terminal_baseColor.png new file mode 100644 index 0000000..70bc3e2 Binary files /dev/null and b/client/assets/district/props/terminal_Terminal_baseColor.png differ diff --git a/client/assets/district/props/terminal_Terminal_baseColor.png.import b/client/assets/district/props/terminal_Terminal_baseColor.png.import new file mode 100644 index 0000000..02cdbdc --- /dev/null +++ b/client/assets/district/props/terminal_Terminal_baseColor.png.import @@ -0,0 +1,44 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b5eujei6m1s8c" +path.s3tc="res://.godot/imported/terminal_Terminal_baseColor.png-a13a02a9a631a3dce0a5ebc4dbc8c374.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} +generator_parameters={ +"md5": "21d3e679d9b2f98655b0acc6fc67c73b" +} + +[deps] + +source_file="res://assets/district/props/terminal_Terminal_baseColor.png" +dest_files=["res://.godot/imported/terminal_Terminal_baseColor.png-a13a02a9a631a3dce0a5ebc4dbc8c374.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/client/assets/district/props/terminal_Terminal_emissive.jpg b/client/assets/district/props/terminal_Terminal_emissive.jpg new file mode 100644 index 0000000..2feadc6 Binary files /dev/null and b/client/assets/district/props/terminal_Terminal_emissive.jpg differ diff --git a/client/assets/district/props/terminal_Terminal_emissive.jpg.import b/client/assets/district/props/terminal_Terminal_emissive.jpg.import new file mode 100644 index 0000000..b9ac3d3 --- /dev/null +++ b/client/assets/district/props/terminal_Terminal_emissive.jpg.import @@ -0,0 +1,44 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dubriq5jo3blx" +path.s3tc="res://.godot/imported/terminal_Terminal_emissive.jpg-1d2e2e3e9c662d8d59cb70ad65269b2c.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} +generator_parameters={ +"md5": "ac2a943000f8e3fbee771acbdc7c32ac" +} + +[deps] + +source_file="res://assets/district/props/terminal_Terminal_emissive.jpg" +dest_files=["res://.godot/imported/terminal_Terminal_emissive.jpg-1d2e2e3e9c662d8d59cb70ad65269b2c.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/client/assets/district/props/terminal_Terminal_metallicRoughness.png b/client/assets/district/props/terminal_Terminal_metallicRoughness.png new file mode 100644 index 0000000..7535fcc Binary files /dev/null and b/client/assets/district/props/terminal_Terminal_metallicRoughness.png differ diff --git a/client/assets/district/props/terminal_Terminal_metallicRoughness.png.import b/client/assets/district/props/terminal_Terminal_metallicRoughness.png.import new file mode 100644 index 0000000..25bd4ff --- /dev/null +++ b/client/assets/district/props/terminal_Terminal_metallicRoughness.png.import @@ -0,0 +1,44 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://8gt21n2dqprx" +path.s3tc="res://.godot/imported/terminal_Terminal_metallicRoughness.png-b4f3d0bb334efd1673ad4050bd84e170.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} +generator_parameters={ +"md5": "0b041ceac618c79c83fcf0110825404f" +} + +[deps] + +source_file="res://assets/district/props/terminal_Terminal_metallicRoughness.png" +dest_files=["res://.godot/imported/terminal_Terminal_metallicRoughness.png-b4f3d0bb334efd1673ad4050bd84e170.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=8 +roughness/src_normal="res://assets/district/props/terminal_Terminal_normal.png" +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/client/assets/district/props/terminal_Terminal_normal.png b/client/assets/district/props/terminal_Terminal_normal.png new file mode 100644 index 0000000..81120a1 Binary files /dev/null and b/client/assets/district/props/terminal_Terminal_normal.png differ diff --git a/client/assets/district/props/terminal_Terminal_normal.png.import b/client/assets/district/props/terminal_Terminal_normal.png.import new file mode 100644 index 0000000..929e5f7 --- /dev/null +++ b/client/assets/district/props/terminal_Terminal_normal.png.import @@ -0,0 +1,44 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cfcrvci651mit" +path.s3tc="res://.godot/imported/terminal_Terminal_normal.png-741bc8cff628788fde4932468cff3fc0.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} +generator_parameters={ +"md5": "6bcf53a926ce6c5afa063822921ce819" +} + +[deps] + +source_file="res://assets/district/props/terminal_Terminal_normal.png" +dest_files=["res://.godot/imported/terminal_Terminal_normal.png-741bc8cff628788fde4932468cff3fc0.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=1 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=1 +roughness/src_normal="res://assets/district/props/terminal_Terminal_normal.png" +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/client/assets/district/props/urban_delta.glb b/client/assets/district/props/urban_delta.glb new file mode 100644 index 0000000..6bf4ba4 Binary files /dev/null and b/client/assets/district/props/urban_delta.glb differ diff --git a/client/assets/district/props/urban_delta.glb.import b/client/assets/district/props/urban_delta.glb.import new file mode 100644 index 0000000..3af2c81 --- /dev/null +++ b/client/assets/district/props/urban_delta.glb.import @@ -0,0 +1,42 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://ccdc8funv4kf3" +path="res://.godot/imported/urban_delta.glb-2b9b657f93362fb73b3240c875315e34.scn" + +[deps] + +source_file="res://assets/district/props/urban_delta.glb" +dest_files=["res://.godot/imported/urban_delta.glb-2b9b657f93362fb73b3240c875315e34.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +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 diff --git a/client/assets/district/props/urban_delta_T_Crates_baseColor.png b/client/assets/district/props/urban_delta_T_Crates_baseColor.png new file mode 100644 index 0000000..91a26bc Binary files /dev/null and b/client/assets/district/props/urban_delta_T_Crates_baseColor.png differ diff --git a/client/assets/district/props/urban_delta_T_Crates_baseColor.png.import b/client/assets/district/props/urban_delta_T_Crates_baseColor.png.import new file mode 100644 index 0000000..066e779 --- /dev/null +++ b/client/assets/district/props/urban_delta_T_Crates_baseColor.png.import @@ -0,0 +1,44 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://uqla71280c83" +path.s3tc="res://.godot/imported/urban_delta_T_Crates_baseColor.png-ba8e646d998a51448038a86d3c42dde3.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} +generator_parameters={ +"md5": "3d140e799f183bd658bb599b423717ac" +} + +[deps] + +source_file="res://assets/district/props/urban_delta_T_Crates_baseColor.png" +dest_files=["res://.godot/imported/urban_delta_T_Crates_baseColor.png-ba8e646d998a51448038a86d3c42dde3.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/client/assets/district/props/urban_delta_T_Crates_metallicRoughness.png b/client/assets/district/props/urban_delta_T_Crates_metallicRoughness.png new file mode 100644 index 0000000..d6518ad Binary files /dev/null and b/client/assets/district/props/urban_delta_T_Crates_metallicRoughness.png differ diff --git a/client/assets/district/props/urban_delta_T_Crates_metallicRoughness.png.import b/client/assets/district/props/urban_delta_T_Crates_metallicRoughness.png.import new file mode 100644 index 0000000..12edf0c --- /dev/null +++ b/client/assets/district/props/urban_delta_T_Crates_metallicRoughness.png.import @@ -0,0 +1,44 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://chj1nrnmywd12" +path.s3tc="res://.godot/imported/urban_delta_T_Crates_metallicRoughness.png-6bf27a286595f3a99cb5a7e286cd21aa.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} +generator_parameters={ +"md5": "8bb295c88a931ec62a077b3193839f06" +} + +[deps] + +source_file="res://assets/district/props/urban_delta_T_Crates_metallicRoughness.png" +dest_files=["res://.godot/imported/urban_delta_T_Crates_metallicRoughness.png-6bf27a286595f3a99cb5a7e286cd21aa.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/client/assets/district/props/urban_delta_T_Crates_normal.png b/client/assets/district/props/urban_delta_T_Crates_normal.png new file mode 100644 index 0000000..375e9ae Binary files /dev/null and b/client/assets/district/props/urban_delta_T_Crates_normal.png differ diff --git a/client/assets/district/props/urban_delta_T_Crates_normal.png.import b/client/assets/district/props/urban_delta_T_Crates_normal.png.import new file mode 100644 index 0000000..aa095e4 --- /dev/null +++ b/client/assets/district/props/urban_delta_T_Crates_normal.png.import @@ -0,0 +1,44 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://d0lg1udigc6i" +path.s3tc="res://.godot/imported/urban_delta_T_Crates_normal.png-a79bd1483cdb470ee2c7312a7d66d304.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} +generator_parameters={ +"md5": "0ed03e591784867d1083c9468dd445a8" +} + +[deps] + +source_file="res://assets/district/props/urban_delta_T_Crates_normal.png" +dest_files=["res://.godot/imported/urban_delta_T_Crates_normal.png-a79bd1483cdb470ee2c7312a7d66d304.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=1 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=1 +roughness/src_normal="res://assets/district/props/urban_delta_T_Crates_normal.png" +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/client/assets/district/prototype_district_environment.glb b/client/assets/district/prototype_district_environment.glb new file mode 100644 index 0000000..4e26f33 Binary files /dev/null and b/client/assets/district/prototype_district_environment.glb differ diff --git a/client/assets/district/prototype_district_environment.glb.import b/client/assets/district/prototype_district_environment.glb.import new file mode 100644 index 0000000..a3b409a --- /dev/null +++ b/client/assets/district/prototype_district_environment.glb.import @@ -0,0 +1,42 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://ccw8f6dsa2yy0" +path="res://.godot/imported/prototype_district_environment.glb-8331571169a589a272261bcec6bafb58.scn" + +[deps] + +source_file="res://assets/district/prototype_district_environment.glb" +dest_files=["res://.godot/imported/prototype_district_environment.glb-8331571169a589a272261bcec6bafb58.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +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 diff --git a/client/assets/district/prototype_district_environment_tmpawvk3wy4.jpg b/client/assets/district/prototype_district_environment_tmpawvk3wy4.jpg new file mode 100644 index 0000000..fd1a58c Binary files /dev/null and b/client/assets/district/prototype_district_environment_tmpawvk3wy4.jpg differ diff --git a/client/assets/district/prototype_district_environment_tmpawvk3wy4.jpg.import b/client/assets/district/prototype_district_environment_tmpawvk3wy4.jpg.import new file mode 100644 index 0000000..c1cac42 --- /dev/null +++ b/client/assets/district/prototype_district_environment_tmpawvk3wy4.jpg.import @@ -0,0 +1,44 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://swcpayav5cm3" +path.s3tc="res://.godot/imported/prototype_district_environment_tmpawvk3wy4.jpg-7afe48283d17d2da33d085fe8e713481.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} +generator_parameters={ +"md5": "8f1e0eb208551987253e225cbf45af42" +} + +[deps] + +source_file="res://assets/district/prototype_district_environment_tmpawvk3wy4.jpg" +dest_files=["res://.godot/imported/prototype_district_environment_tmpawvk3wy4.jpg-7afe48283d17d2da33d085fe8e713481.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/client/assets/district/prototype_district_environment_tmpazaypzad.png b/client/assets/district/prototype_district_environment_tmpazaypzad.png new file mode 100644 index 0000000..2791a0c Binary files /dev/null and b/client/assets/district/prototype_district_environment_tmpazaypzad.png differ diff --git a/client/assets/district/prototype_district_environment_tmpazaypzad.png.import b/client/assets/district/prototype_district_environment_tmpazaypzad.png.import new file mode 100644 index 0000000..50c31cf --- /dev/null +++ b/client/assets/district/prototype_district_environment_tmpazaypzad.png.import @@ -0,0 +1,44 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://krqlrajp0yav" +path.s3tc="res://.godot/imported/prototype_district_environment_tmpazaypzad.png-f437edf4230727b5fb0f9415a081a7b0.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} +generator_parameters={ +"md5": "a3022162120064fb4802b8200c6093e3" +} + +[deps] + +source_file="res://assets/district/prototype_district_environment_tmpazaypzad.png" +dest_files=["res://.godot/imported/prototype_district_environment_tmpazaypzad.png-f437edf4230727b5fb0f9415a081a7b0.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/client/assets/district/prototype_district_environment_tmpdo49xcr2.png b/client/assets/district/prototype_district_environment_tmpdo49xcr2.png new file mode 100644 index 0000000..23ccc66 Binary files /dev/null and b/client/assets/district/prototype_district_environment_tmpdo49xcr2.png differ diff --git a/client/assets/district/prototype_district_environment_tmpdo49xcr2.png.import b/client/assets/district/prototype_district_environment_tmpdo49xcr2.png.import new file mode 100644 index 0000000..f3edd85 --- /dev/null +++ b/client/assets/district/prototype_district_environment_tmpdo49xcr2.png.import @@ -0,0 +1,44 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bpgaws3dppyje" +path.s3tc="res://.godot/imported/prototype_district_environment_tmpdo49xcr2.png-9ff88fd01d7c59f7bd2971d0c5d631d3.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} +generator_parameters={ +"md5": "2b33e914a8ea1ae4465958b07a342d20" +} + +[deps] + +source_file="res://assets/district/prototype_district_environment_tmpdo49xcr2.png" +dest_files=["res://.godot/imported/prototype_district_environment_tmpdo49xcr2.png-9ff88fd01d7c59f7bd2971d0c5d631d3.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/client/assets/district/prototype_district_environment_tmpva1qr4x0.jpg b/client/assets/district/prototype_district_environment_tmpva1qr4x0.jpg new file mode 100644 index 0000000..f197f79 Binary files /dev/null and b/client/assets/district/prototype_district_environment_tmpva1qr4x0.jpg differ diff --git a/client/assets/district/prototype_district_environment_tmpva1qr4x0.jpg.import b/client/assets/district/prototype_district_environment_tmpva1qr4x0.jpg.import new file mode 100644 index 0000000..a0567d1 --- /dev/null +++ b/client/assets/district/prototype_district_environment_tmpva1qr4x0.jpg.import @@ -0,0 +1,44 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://vfw1lsa4mj7w" +path.s3tc="res://.godot/imported/prototype_district_environment_tmpva1qr4x0.jpg-936cd18ad45eab1d76c6fe1f8e95a50f.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} +generator_parameters={ +"md5": "ef897f5a2d75671bc8dcfdfa987e94fc" +} + +[deps] + +source_file="res://assets/district/prototype_district_environment_tmpva1qr4x0.jpg" +dest_files=["res://.godot/imported/prototype_district_environment_tmpva1qr4x0.jpg-936cd18ad45eab1d76c6fe1f8e95a50f.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/client/project.godot b/client/project.godot index e36fe4e..d069751 100644 --- a/client/project.godot +++ b/client/project.godot @@ -24,6 +24,7 @@ config/icon="res://icon.svg" window/size/viewport_width=1280 window/size/viewport_height=720 +window/size/mode=2 [dotnet] diff --git a/client/scenes/main.tscn b/client/scenes/main.tscn index 2489b1c..e077411 100644 --- a/client/scenes/main.tscn +++ b/client/scenes/main.tscn @@ -20,6 +20,8 @@ [ext_resource type="Script" path="res://scripts/craft_recipe_panel.gd" id="19_craft_panel"] [ext_resource type="Script" path="res://scripts/prototype_economy_hud_section.gd" id="20_economy_hud"] [ext_resource type="Script" path="res://scripts/gig_progression_client.gd" id="21_gig_prog"] +[ext_resource type="PackedScene" path="res://assets/district/prototype_district_environment.glb" id="22_district_env"] +[ext_resource type="Script" path="res://scripts/prototype_district_art.gd" id="23_district_art"] [sub_resource type="NavigationMesh" id="NavigationMesh_district"] geometry_collision_mask = 1 @@ -265,6 +267,9 @@ shape = SubResource("BoxShape3D_floor") [node name="InteractablesRoot" type="Node3D" parent="World/NavigationRegion3D" unique_id=1700011] +[node name="DistrictArt" parent="World/NavigationRegion3D" instance=ExtResource("22_district_env")] +script = ExtResource("23_district_art") + [node name="MoveRejectPedestal" type="StaticBody3D" parent="World/NavigationRegion3D" unique_id=1900021 groups=["walkable"]] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 7.5, 0, -6.5) collision_mask = 3 diff --git a/client/scripts/interactable_world_builder.gd b/client/scripts/interactable_world_builder.gd index c4968bd..fe94a30 100644 --- a/client/scripts/interactable_world_builder.gd +++ b/client/scripts/interactable_world_builder.gd @@ -3,6 +3,10 @@ extends Object ## NEO-25: spawns walkable interactable props + glow marker pairs from server descriptor dicts. ## Returns glow groups for [method InteractionRadiusIndicators.setup_glow_groups]. +const PrototypeDistrictVisualCatalog := preload( + "res://scripts/prototype_district_visual_catalog.gd" +) + const _PROP_SIZE := Vector3(0.9, 1.0, 0.4) const _MARKER_MESH_SIZE := Vector3(0.22, 0.35, 0.22) const _MARKER_OFFSET_A := Vector3(1.1, 0.25, 0.9) @@ -35,18 +39,7 @@ static func build_from_catalog( interactables_root.add_child(body) body.global_position = anchor - var prop_mesh := MeshInstance3D.new() - var box_mesh := BoxMesh.new() - box_mesh.size = _PROP_SIZE - prop_mesh.mesh = box_mesh - prop_mesh.position = Vector3.ZERO - var prop_mat := StandardMaterial3D.new() - if kind == "resource_node": - prop_mat.albedo_color = Color(0.18, 0.55, 0.32, 1.0) - else: - prop_mat.albedo_color = Color(0.28, 0.38, 0.45, 1.0) - prop_mesh.material_override = prop_mat - body.add_child(prop_mesh) + _add_prop_visual(body, id, kind, anchor.y) var col := CollisionShape3D.new() var box_shape := BoxShape3D.new() @@ -99,3 +92,31 @@ static func _make_marker_mesh() -> MeshInstance3D: m.size = _MARKER_MESH_SIZE mi.mesh = m return mi + + +static func _add_prop_visual( + body: StaticBody3D, interactable_id: String, kind: String, anchor_y: float +) -> void: + var packed: Variant = PrototypeDistrictVisualCatalog.INTERACTABLE_PROPS.get( + interactable_id, null + ) + if packed is PackedScene: + var visual: Node3D = PrototypeDistrictVisualCatalog.instantiate_prop( + packed as PackedScene, anchor_y + ) + visual.name = "PropVisual" + body.add_child(visual) + return + + var prop_mesh := MeshInstance3D.new() + var box_mesh := BoxMesh.new() + box_mesh.size = _PROP_SIZE + prop_mesh.mesh = box_mesh + prop_mesh.position = Vector3.ZERO + var prop_mat := StandardMaterial3D.new() + if kind == "resource_node": + prop_mat.albedo_color = Color(0.18, 0.55, 0.32, 1.0) + else: + prop_mat.albedo_color = Color(0.28, 0.38, 0.45, 1.0) + prop_mesh.material_override = prop_mat + body.add_child(prop_mesh) diff --git a/client/scripts/main.gd b/client/scripts/main.gd index 8301d0b..411be45 100644 --- a/client/scripts/main.gd +++ b/client/scripts/main.gd @@ -970,7 +970,7 @@ func _render_combat_target_hp_label() -> void: return var lock_id := _locked_target_id_from_state(_last_target_state) if lock_id.is_empty(): - _combat_target_hp_label.text = ("Target HP: — (Tab → orange/purple dummy near spawn)") + _combat_target_hp_label.text = ("Target HP: — (Tab → elite/melee/ranged near spawn)") return var row: Dictionary = {} if ( diff --git a/client/scripts/prototype_district_art.gd b/client/scripts/prototype_district_art.gd new file mode 100644 index 0000000..4891c9d --- /dev/null +++ b/client/scripts/prototype_district_art.gd @@ -0,0 +1,29 @@ +extends Node3D + +## Visual overlay for the prototype district (`prototype_district_environment.glb`). +## Hides placeholder box meshes under the navigation region while keeping collision shapes. +## Blender export mirrored +Z relative to `main.tscn`; flip art so visuals line up with colliders. + + +func _ready() -> void: + scale = Vector3(1.0, 1.0, -1.0) + var nav: NavigationRegion3D = get_parent() as NavigationRegion3D + if nav == null: + return + _hide_placeholder_meshes(nav) + + +static func _hide_placeholder_meshes(nav: NavigationRegion3D) -> void: + for child in nav.get_children(): + if child is Node3D and child.name == "DistrictArt": + continue + if child.name == "InteractablesRoot": + continue + _hide_mesh_instances(child) + + +static func _hide_mesh_instances(node: Node) -> void: + if node is MeshInstance3D: + (node as MeshInstance3D).visible = false + for child in node.get_children(): + _hide_mesh_instances(child) diff --git a/client/scripts/prototype_district_art.gd.uid b/client/scripts/prototype_district_art.gd.uid new file mode 100644 index 0000000..832dc33 --- /dev/null +++ b/client/scripts/prototype_district_art.gd.uid @@ -0,0 +1 @@ +uid://brx4j9m2n8k6v diff --git a/client/scripts/prototype_district_visual_catalog.gd b/client/scripts/prototype_district_visual_catalog.gd new file mode 100644 index 0000000..f22d7b3 --- /dev/null +++ b/client/scripts/prototype_district_visual_catalog.gd @@ -0,0 +1,62 @@ +extends Object + +## Blender-exported prototype district art (visual-only). Collision/nav stay on `main.tscn` boxes. +## Prop GLBs import as a wrapper root plus one child mesh node that still carries baked +## world transforms from Blender — see [method normalize_prop_visual]. + +const INTERACTABLE_PROPS: Dictionary = { + "prototype_terminal": preload("res://assets/district/props/terminal.glb"), + "prototype_resource_node_alpha": preload("res://assets/district/props/salvage_alpha.glb"), + "prototype_subsurface_vein_beta": preload("res://assets/district/props/subsurface_beta.glb"), + "prototype_bio_mat_gamma": preload("res://assets/district/props/bio_gamma.glb"), + "prototype_urban_bulk_delta": preload("res://assets/district/props/urban_delta.glb"), +} + +const TARGET_ALPHA: PackedScene = preload("res://assets/district/props/target_alpha.glb") +const TARGET_BETA: PackedScene = preload("res://assets/district/props/target_beta.glb") + +const TARGET_PROPS: Dictionary = { + "prototype_npc_melee": TARGET_ALPHA, + "prototype_npc_ranged": TARGET_BETA, + "prototype_npc_elite": TARGET_ALPHA, +} + + +static func instantiate_prop(packed: PackedScene, anchor_y: float = 0.5) -> Node3D: + var visual: Node3D = packed.instantiate() as Node3D + normalize_prop_visual(visual, anchor_y) + return visual + + +static func normalize_prop_visual(visual: Node3D, anchor_y: float) -> void: + _zero_node3d_tree(visual) + var meshes: Array = _collect_mesh_instances(visual) + if meshes.is_empty(): + visual.position = Vector3.ZERO + return + var min_y: float = INF + for mesh_variant: Variant in meshes: + var mesh: MeshInstance3D = mesh_variant as MeshInstance3D + min_y = min(min_y, mesh.get_aabb().position.y) + if min_y == INF: + visual.position = Vector3.ZERO + return + visual.position = Vector3(0.0, -anchor_y - min_y, 0.0) + + +static func _zero_node3d_tree(node: Node3D) -> void: + node.position = Vector3.ZERO + node.rotation = Vector3.ZERO + node.scale = Vector3.ONE + for child in node.get_children(): + if child is Node3D: + _zero_node3d_tree(child as Node3D) + + +static func _collect_mesh_instances(node: Node) -> Array: + var meshes: Array = [] + if node is MeshInstance3D: + meshes.append(node) + for child in node.get_children(): + meshes.append_array(_collect_mesh_instances(child)) + return meshes diff --git a/client/scripts/prototype_district_visual_catalog.gd.uid b/client/scripts/prototype_district_visual_catalog.gd.uid new file mode 100644 index 0000000..aba2a61 --- /dev/null +++ b/client/scripts/prototype_district_visual_catalog.gd.uid @@ -0,0 +1 @@ +uid://dqw8h2k5m3n7p diff --git a/client/scripts/prototype_target_constants.gd b/client/scripts/prototype_target_constants.gd index db28123..e0d46a7 100644 --- a/client/scripts/prototype_target_constants.gd +++ b/client/scripts/prototype_target_constants.gd @@ -1,33 +1,41 @@ extends Object -## NEO-24: prototype combat target ids in **tab cycle order** — must match -## `server/NeonSprawl.Server/Game/Targeting/PrototypeTargetRegistry.cs` -## (`PrototypeTargetAlphaId`, `PrototypeTargetBetaId`; ascending id order). -## Anchors + radii are a **display-only** mirror of the C# registry so the scene markers +## NEO-24 / NEO-91: prototype combat NPC ids in **tab cycle order** — must match +## `server/NeonSprawl.Server/Game/Npc/PrototypeNpcRegistry.cs` +## (`GetInstanceIdsInOrder()` ascending id order). +## Anchors + radii are a **display-only** mirror of the C# registry so scene markers ## (`prototype_target_markers.gd`) and HUD distance readouts match server-authoritative ## range decisions. If the server registry moves, update this file in the same commit — ## the two must stay in lock-step to avoid confusing "ok at 10 m / denied at 5 m" bugs. ## Static accessors only (no `class_name`; headless / CI loads before editor import — see client ## README Godot CLI section). -const ORDERED_IDS: Array[String] = ["prototype_target_alpha", "prototype_target_beta"] +const ORDERED_IDS: Array[String] = [ + "prototype_npc_elite", + "prototype_npc_melee", + "prototype_npc_ranged", +] -## All prototype targets share a single radius (`PrototypeTargetRegistry.SharedLockRadius` -## on the server). Per-target radii will come back with real combat design (E5.M1). +## All prototype NPCs share a single radius (`PrototypeNpcRegistry.SharedLockRadius` +## on the server). Per-instance radii will come back with real combat design (E5.M1). const SHARED_LOCK_RADIUS: float = 6.0 -## Keys match [constant ORDERED_IDS]; values mirror `PrototypeTargetRegistry.cs` anchors -## (world space) and horizontal lock radii (XZ meters). Anchors are placed so the two rings -## overlap at origin (~3.5 m wide), letting Tab flip between targets without locomotion. -## Keep in lock-step with the C# registry. +## Keys match [constant ORDERED_IDS]; values mirror `PrototypeNpcRegistry.cs` anchors +## (world space) and horizontal lock radii (XZ meters). const ANCHORS: Dictionary = { - "prototype_target_alpha": + "prototype_npc_elite": + { + "position": Vector3(0.0, 0.5, 0.0), + "radius": SHARED_LOCK_RADIUS, + "color": Color(1.0, 0.85, 0.2, 1.0), + }, + "prototype_npc_melee": { "position": Vector3(-3.0, 0.5, -3.0), "radius": SHARED_LOCK_RADIUS, "color": Color(1.0, 0.55, 0.2, 1.0), }, - "prototype_target_beta": + "prototype_npc_ranged": { "position": Vector3(3.0, 0.0, 3.0), "radius": SHARED_LOCK_RADIUS, @@ -118,10 +126,12 @@ static func next_in_range_id_after(current: Variant, world: Vector3) -> String: ## Player-facing short label for world [Label3D] markers (NEO-85 combat UX). static func display_short_name(target_id: String) -> String: match target_id: - "prototype_target_alpha": - return "Dummy α" - "prototype_target_beta": - return "Dummy β" + "prototype_npc_elite": + return "Elite" + "prototype_npc_melee": + return "Melee" + "prototype_npc_ranged": + return "Ranged" _: return target_id.strip_edges() diff --git a/client/scripts/prototype_target_markers.gd b/client/scripts/prototype_target_markers.gd index a8e73ae..faa8e20 100644 --- a/client/scripts/prototype_target_markers.gd +++ b/client/scripts/prototype_target_markers.gd @@ -1,14 +1,17 @@ extends Node3D -## NEO-24 UX: combat dummy anchors (`prototype_target_alpha`, `prototype_target_beta`) need -## obvious world markers — a capsule body, lock ring, and [Label3D] name per -## `PrototypeTargetConstants.ANCHORS`. NEO-85: highlight the server-locked dummy via +## NEO-24 / NEO-91 UX: prototype NPC anchors need obvious world markers — imported +## prop mesh (or capsule fallback), lock ring, and [Label3D] name per +## `PrototypeTargetConstants.ANCHORS`. NEO-85: highlight the server-locked NPC via ## [method set_locked_target]. ## ## Display-only; no game logic hangs off these nodes. If the server registry moves, ## update `prototype_target_constants.gd` — markers respawn on next scene load. const PrototypeTargetConstants := preload("res://scripts/prototype_target_constants.gd") +const PrototypeDistrictVisualCatalog := preload( + "res://scripts/prototype_district_visual_catalog.gd" +) ## Visual tuning — readable from the default isometric camera at spawn. const _DUMMY_CAPSULE_HEIGHT: float = 1.75 @@ -46,17 +49,29 @@ func _spawn_marker(target_id: String) -> void: group.position = anchor add_child(group) - var body := MeshInstance3D.new() + var body := Node3D.new() body.name = "DummyBody" - var capsule := CapsuleMesh.new() - capsule.radius = _DUMMY_CAPSULE_RADIUS - capsule.height = _DUMMY_CAPSULE_HEIGHT - body.mesh = capsule - body.position = Vector3(0.0, _DUMMY_CAPSULE_HEIGHT * 0.5, 0.0) - var body_mat := _make_unshaded_material(tint, 0.88) - body.material_override = body_mat group.add_child(body) + var body_mat: StandardMaterial3D = null + var packed: Variant = PrototypeDistrictVisualCatalog.TARGET_PROPS.get(target_id, null) + if packed is PackedScene: + var visual: Node3D = PrototypeDistrictVisualCatalog.instantiate_prop( + packed as PackedScene, anchor.y + ) + visual.name = "PropVisual" + body.add_child(visual) + else: + var fallback := MeshInstance3D.new() + var capsule := CapsuleMesh.new() + capsule.radius = _DUMMY_CAPSULE_RADIUS + capsule.height = _DUMMY_CAPSULE_HEIGHT + fallback.mesh = capsule + fallback.position = Vector3(0.0, _DUMMY_CAPSULE_HEIGHT * 0.5, 0.0) + body_mat = _make_unshaded_material(tint, 0.88) + fallback.material_override = body_mat + body.add_child(fallback) + var ring: MeshInstance3D = _make_radius_ring(radius, tint) ring.name = "RadiusRing" ring.position = Vector3(0.0, _RING_Y - anchor.y, 0.0) @@ -86,16 +101,19 @@ func _apply_highlight_states() -> void: var target_id: String = id_variant as String var entry: Dictionary = _markers_by_id[target_id] var tint: Color = entry["tint"] - var body_mat: StandardMaterial3D = entry["body_mat"] + var body_mat: Variant = entry.get("body_mat") var ring_mat: StandardMaterial3D = entry["ring_mat"] var highlighted: bool = target_id == _locked_target_id and not _locked_target_id.is_empty() + if body_mat is StandardMaterial3D: + if highlighted: + (body_mat as StandardMaterial3D).albedo_color = tint.lightened(0.25) + else: + (body_mat as StandardMaterial3D).albedo_color = Color(tint.r, tint.g, tint.b, 0.88) if highlighted: - body_mat.albedo_color = tint.lightened(0.25) var ring_c := tint ring_c.a = 0.78 ring_mat.albedo_color = ring_c else: - body_mat.albedo_color = Color(tint.r, tint.g, tint.b, 0.88) var ring_c2 := tint ring_c2.a = 0.45 ring_mat.albedo_color = ring_c2 diff --git a/client/test/ability_cast_client_test.gd b/client/test/ability_cast_client_test.gd index eeeeb84..e4dfda4 100644 --- a/client/test/ability_cast_client_test.gd +++ b/client/test/ability_cast_client_test.gd @@ -104,12 +104,12 @@ func test_request_cast_posts_target_id_string_when_set() -> void: transport.enqueue(HTTPRequest.RESULT_SUCCESS, 200, '{"schemaVersion":1,"accepted":true}') var c := _make_client(transport) # Act - var started: bool = bool(c.call("request_cast", 0, "prototype_pulse", "prototype_target_alpha")) + var started: bool = bool(c.call("request_cast", 0, "prototype_pulse", "prototype_npc_melee")) # Assert assert_that(started).is_true() var parsed: Variant = JSON.parse_string(transport.last_body) var body: Dictionary = parsed - assert_that(body.get("targetId")).is_equal("prototype_target_alpha") + assert_that(body.get("targetId")).is_equal("prototype_npc_melee") func test_request_cast_returns_false_when_http_request_fails_to_start() -> void: @@ -157,7 +157,7 @@ func test_cast_result_received_emits_false_with_reason_on_denied() -> void: got.append([accepted, reason, resolution]) ) # Act - var started: bool = bool(c.call("request_cast", 0, "prototype_pulse", "prototype_target_alpha")) + var started: bool = bool(c.call("request_cast", 0, "prototype_pulse", "prototype_npc_melee")) # Assert assert_that(started).is_true() assert_that(got.size()).is_equal(1) @@ -195,7 +195,7 @@ func test_cast_result_received_emits_combat_resolution_on_accept() -> void: 200, ( '{"schemaVersion":1,"accepted":true,"combatResolution":' - + '{"abilityId":"prototype_pulse","targetId":"prototype_target_alpha",' + + '{"abilityId":"prototype_pulse","targetId":"prototype_npc_melee",' + '"damageDealt":25,"targetRemainingHp":75,"targetDefeated":false}}' ) ) @@ -207,7 +207,7 @@ func test_cast_result_received_emits_combat_resolution_on_accept() -> void: got.append([accepted, reason, resolution]) ) # Act - var started: bool = bool(c.call("request_cast", 0, "prototype_pulse", "prototype_target_alpha")) + var started: bool = bool(c.call("request_cast", 0, "prototype_pulse", "prototype_npc_melee")) # Assert assert_that(started).is_true() assert_that(got.size()).is_equal(1) @@ -222,7 +222,7 @@ func test_parse_cast_response_json_maps_combat_resolution() -> void: # Arrange var body := ( '{"schemaVersion":1,"accepted":true,"combatResolution":' - + '{"abilityId":"prototype_pulse","targetId":"prototype_target_alpha",' + + '{"abilityId":"prototype_pulse","targetId":"prototype_npc_melee",' + '"damageDealt":25,"targetRemainingHp":75,"targetDefeated":false}}' ) # Act diff --git a/client/test/combat_feedback_refresh_test.gd b/client/test/combat_feedback_refresh_test.gd index 592bb55..1298886 100644 --- a/client/test/combat_feedback_refresh_test.gd +++ b/client/test/combat_feedback_refresh_test.gd @@ -13,7 +13,7 @@ class MockCastTransport: ) var body_json: String = ( '{"schemaVersion":1,"accepted":true,"combatResolution":' - + '{"abilityId":"prototype_pulse","targetId":"prototype_target_alpha",' + + '{"abilityId":"prototype_pulse","targetId":"prototype_npc_melee",' + '"damageDealt":25,"targetRemainingHp":75,"targetDefeated":false}}' ) @@ -76,7 +76,7 @@ class CombatRefreshHarness: return "" func request_cast() -> void: - _cast.call("request_cast", 0, "prototype_pulse", "prototype_target_alpha") + _cast.call("request_cast", 0, "prototype_pulse", "prototype_npc_melee") func test_successful_cast_triggers_combat_target_sync() -> void: @@ -106,7 +106,7 @@ func test_target_lock_change_triggers_combat_target_sync() -> void: harness.setup(self, transport) # Act harness.on_target_state_changed( - {"lockedTargetId": "prototype_target_alpha", "validity": "ok", "sequence": 1} + {"lockedTargetId": "prototype_npc_melee", "validity": "ok", "sequence": 1} ) # Assert assert_that(harness.combat_sync_calls).is_equal(1) @@ -122,11 +122,11 @@ func test_target_validity_only_update_skips_combat_target_sync() -> void: add_child(harness) harness.setup(self, transport) harness.on_target_state_changed( - {"lockedTargetId": "prototype_target_alpha", "validity": "ok", "sequence": 1} + {"lockedTargetId": "prototype_npc_melee", "validity": "ok", "sequence": 1} ) # Act harness.on_target_state_changed( - {"lockedTargetId": "prototype_target_alpha", "validity": "out_of_range", "sequence": 2} + {"lockedTargetId": "prototype_npc_melee", "validity": "out_of_range", "sequence": 2} ) # Assert assert_that(harness.combat_sync_calls).is_equal(1) diff --git a/client/test/combat_targets_client_test.gd b/client/test/combat_targets_client_test.gd index 0c2476e..e585b0b 100644 --- a/client/test/combat_targets_client_test.gd +++ b/client/test/combat_targets_client_test.gd @@ -30,11 +30,12 @@ class MockHttpTransport: return OK -static func _two_target_snapshot_json() -> String: +static func _prototype_npc_snapshot_json() -> String: return ( '{"schemaVersion":1,"targets":[' - + '{"targetId":"prototype_target_alpha","maxHp":100,"currentHp":75,"defeated":false},' - + '{"targetId":"prototype_target_beta","maxHp":100,"currentHp":100,"defeated":false}' + + '{"targetId":"prototype_npc_melee","maxHp":100,"currentHp":75,"defeated":false},' + + '{"targetId":"prototype_npc_ranged","maxHp":80,"currentHp":80,"defeated":false},' + + '{"targetId":"prototype_npc_elite","maxHp":200,"currentHp":200,"defeated":false}' + "]}" ) @@ -51,7 +52,7 @@ func _make_client(transport: Node) -> Node: func test_request_sync_gets_combat_targets_url() -> void: # Arrange var transport := MockHttpTransport.new() - transport.body_json = _two_target_snapshot_json() + transport.body_json = _prototype_npc_snapshot_json() var c := _make_client(transport) # Act c.call("request_sync_from_server") @@ -62,7 +63,7 @@ func test_request_sync_gets_combat_targets_url() -> void: func test_targets_received_emits_parsed_snapshot() -> void: # Arrange var transport := MockHttpTransport.new() - transport.body_json = _two_target_snapshot_json() + transport.body_json = _prototype_npc_snapshot_json() var c := _make_client(transport) var got: Array = [] c.connect("targets_received", func(snapshot: Dictionary) -> void: got.append(snapshot)) @@ -73,20 +74,20 @@ func test_targets_received_emits_parsed_snapshot() -> void: var snapshot: Dictionary = got[0] var targets: Variant = snapshot.get("targets", null) assert_that(targets is Array).is_true() - assert_that((targets as Array).size()).is_equal(2) + assert_that((targets as Array).size()).is_equal(3) -func test_target_row_returns_alpha_hp_fields() -> void: +func test_target_row_returns_melee_hp_fields() -> void: # Arrange var transport := MockHttpTransport.new() - transport.body_json = _two_target_snapshot_json() + transport.body_json = _prototype_npc_snapshot_json() var c := _make_client(transport) var got: Array = [] c.connect("targets_received", func(snapshot: Dictionary) -> void: got.append(snapshot)) c.call("request_sync_from_server") var snapshot: Dictionary = got[0] # Act - var row: Dictionary = c.call("target_row", "prototype_target_alpha", snapshot) as Dictionary + var row: Dictionary = c.call("target_row", "prototype_npc_melee", snapshot) as Dictionary # Assert assert_that(int(row.get("currentHp", 0))).is_equal(75) assert_that(int(row.get("maxHp", 0))).is_equal(100) diff --git a/client/test/gig_feedback_refresh_test.gd b/client/test/gig_feedback_refresh_test.gd index 56111b6..bc92c93 100644 --- a/client/test/gig_feedback_refresh_test.gd +++ b/client/test/gig_feedback_refresh_test.gd @@ -57,7 +57,7 @@ class GigRefreshHarness: _gig.request_sync_from_server() func request_cast() -> void: - _cast.call("request_cast", 0, "prototype_pulse", "prototype_target_alpha") + _cast.call("request_cast", 0, "prototype_pulse", "prototype_npc_melee") func test_defeat_cast_triggers_gig_progression_sync() -> void: @@ -65,7 +65,7 @@ func test_defeat_cast_triggers_gig_progression_sync() -> void: var transport := MockCastTransport.new() transport.body_json = ( '{"schemaVersion":1,"accepted":true,"combatResolution":' - + '{"abilityId":"prototype_pulse","targetId":"prototype_target_alpha",' + + '{"abilityId":"prototype_pulse","targetId":"prototype_npc_melee",' + '"damageDealt":25,"targetRemainingHp":0,"targetDefeated":true}}' ) var harness := GigRefreshHarness.new() @@ -87,7 +87,7 @@ func test_non_defeat_cast_skips_gig_progression_sync() -> void: var transport := MockCastTransport.new() transport.body_json = ( '{"schemaVersion":1,"accepted":true,"combatResolution":' - + '{"abilityId":"prototype_pulse","targetId":"prototype_target_alpha",' + + '{"abilityId":"prototype_pulse","targetId":"prototype_npc_melee",' + '"damageDealt":25,"targetRemainingHp":75,"targetDefeated":false}}' ) var harness := GigRefreshHarness.new() diff --git a/client/test/hotbar_cast_slot_resolver_test.gd b/client/test/hotbar_cast_slot_resolver_test.gd index 5174618..3c3210d 100644 --- a/client/test/hotbar_cast_slot_resolver_test.gd +++ b/client/test/hotbar_cast_slot_resolver_test.gd @@ -15,7 +15,7 @@ func test_resolve_returns_ok_with_target_from_locked_target_id() -> void: # Arrange var slots := _eight_empty_slots() slots[0] = "prototype_pulse" - var target_state := {"lockedTargetId": "prototype_target_alpha", "sequence": 3} + var target_state := {"lockedTargetId": "prototype_npc_melee", "sequence": 3} # Act var outcome: Dictionary = Resolver.resolve(0, slots, target_state) @@ -24,7 +24,7 @@ func test_resolve_returns_ok_with_target_from_locked_target_id() -> void: assert_that(bool(outcome.get(Resolver.KEY_OK, false))).is_true() assert_that(int(outcome.get(Resolver.KEY_SLOT_INDEX, -1))).is_equal(0) assert_that(outcome.get(Resolver.KEY_ABILITY_ID)).is_equal("prototype_pulse") - assert_that(outcome.get(Resolver.KEY_TARGET_ID)).is_equal("prototype_target_alpha") + assert_that(outcome.get(Resolver.KEY_TARGET_ID)).is_equal("prototype_npc_melee") func test_resolve_returns_null_target_when_no_lock() -> void: @@ -59,7 +59,7 @@ func test_resolve_denies_empty_slot_without_ability() -> void: # Arrange var slots := _eight_empty_slots() slots[3] = null - var target_state := {"lockedTargetId": "prototype_target_beta"} + var target_state := {"lockedTargetId": "prototype_npc_ranged"} # Act var outcome: Dictionary = Resolver.resolve(3, slots, target_state) diff --git a/client/test/prototype_district_visual_catalog_test.gd b/client/test/prototype_district_visual_catalog_test.gd new file mode 100644 index 0000000..434127f --- /dev/null +++ b/client/test/prototype_district_visual_catalog_test.gd @@ -0,0 +1,27 @@ +extends GdUnitTestSuite + +const Catalog := preload("res://scripts/prototype_district_visual_catalog.gd") + + +func test_instantiate_prop_clears_baked_child_transform() -> void: + # Arrange + var packed: PackedScene = Catalog.INTERACTABLE_PROPS["prototype_resource_node_alpha"] + # Act + var visual: Node3D = Catalog.instantiate_prop(packed, 0.5) + auto_free(visual) + # Assert + var mesh: Node3D = visual.get_node("IX_SalvageAlpha_Mesh") as Node3D + assert_that(mesh.position).is_equal(Vector3.ZERO) + + +func test_normalize_prop_visual_grounds_mesh_feet_at_floor() -> void: + # Arrange + var packed: PackedScene = Catalog.INTERACTABLE_PROPS["prototype_resource_node_alpha"] + var visual: Node3D = packed.instantiate() as Node3D + auto_free(visual) + var mesh: MeshInstance3D = visual.get_node("IX_SalvageAlpha_Mesh") as MeshInstance3D + var min_y: float = mesh.get_aabb().position.y + # Act + Catalog.normalize_prop_visual(visual, 0.5) + # Assert + assert_float(visual.position.y).is_equal_approx(-0.5 - min_y, 0.0001) diff --git a/client/test/prototype_district_visual_catalog_test.gd.uid b/client/test/prototype_district_visual_catalog_test.gd.uid new file mode 100644 index 0000000..904f8f5 --- /dev/null +++ b/client/test/prototype_district_visual_catalog_test.gd.uid @@ -0,0 +1 @@ +uid://c5m8p2n7k4w9x diff --git a/client/test/prototype_target_constants_test.gd b/client/test/prototype_target_constants_test.gd index 152d11b..acf0e75 100644 --- a/client/test/prototype_target_constants_test.gd +++ b/client/test/prototype_target_constants_test.gd @@ -1,18 +1,20 @@ extends GdUnitTestSuite -## NEO-85: prototype target display helpers for combat dummy markers and HUD copy. +## NEO-85 / NEO-91: prototype NPC display helpers for combat markers and HUD copy. const PrototypeTargetConstants := preload("res://scripts/prototype_target_constants.gd") -func test_display_short_name_maps_alpha_and_beta() -> void: +func test_display_short_name_maps_npc_archetypes() -> void: # Arrange # Act - var alpha: String = PrototypeTargetConstants.display_short_name("prototype_target_alpha") - var beta: String = PrototypeTargetConstants.display_short_name("prototype_target_beta") + var elite: String = PrototypeTargetConstants.display_short_name("prototype_npc_elite") + var melee: String = PrototypeTargetConstants.display_short_name("prototype_npc_melee") + var ranged: String = PrototypeTargetConstants.display_short_name("prototype_npc_ranged") # Assert - assert_that(alpha).is_equal("Dummy α") - assert_that(beta).is_equal("Dummy β") + assert_that(elite).is_equal("Elite") + assert_that(melee).is_equal("Melee") + assert_that(ranged).is_equal("Ranged") func test_display_short_name_falls_back_to_id() -> void: @@ -21,3 +23,13 @@ func test_display_short_name_falls_back_to_id() -> void: var unknown: String = PrototypeTargetConstants.display_short_name("unknown_target") # Assert assert_that(unknown).is_equal("unknown_target") + + +func test_ordered_ids_matches_server_tab_cycle() -> void: + # Arrange + # Act + var ids: Array[String] = PrototypeTargetConstants.ordered_ids() + # Assert + assert_that(ids).is_equal( + ["prototype_npc_elite", "prototype_npc_melee", "prototype_npc_ranged"] + ) diff --git a/client/test/prototype_target_markers_test.gd b/client/test/prototype_target_markers_test.gd index 0d734cd..d28afdf 100644 --- a/client/test/prototype_target_markers_test.gd +++ b/client/test/prototype_target_markers_test.gd @@ -4,20 +4,32 @@ extends GdUnitTestSuite const Markers := preload("res://scripts/prototype_target_markers.gd") -const ALPHA_ID := "prototype_target_alpha" +const MELEE_ID := "prototype_npc_melee" -func test_set_locked_target_brightens_body_albedo_without_emission() -> void: +func test_set_locked_target_brightens_ring_without_emission() -> void: # Arrange var markers: Node3D = Markers.new() auto_free(markers) add_child(markers) await get_tree().process_frame - var body: MeshInstance3D = markers.get_node("Marker_%s/DummyBody" % ALPHA_ID) as MeshInstance3D - var body_mat: StandardMaterial3D = body.material_override as StandardMaterial3D - var idle_color: Color = body_mat.albedo_color + var ring: MeshInstance3D = markers.get_node("Marker_%s/RadiusRing" % MELEE_ID) as MeshInstance3D + var ring_mat: StandardMaterial3D = ring.material_override as StandardMaterial3D + var idle_color: Color = ring_mat.albedo_color # Act - markers.set_locked_target(ALPHA_ID) + markers.set_locked_target(MELEE_ID) # Assert - assert_that(body_mat.albedo_color).is_not_equal(idle_color) - assert_that(body_mat.emission_enabled).is_false() + assert_that(ring_mat.albedo_color).is_not_equal(idle_color) + assert_that(ring_mat.emission_enabled).is_false() + + +func test_spawn_marker_uses_imported_prop_visual() -> void: + # Arrange + var markers: Node3D = Markers.new() + auto_free(markers) + add_child(markers) + await get_tree().process_frame + # Act + var visual: Node = markers.get_node("Marker_%s/DummyBody/PropVisual" % MELEE_ID) + # Assert + assert_that(visual).is_not_null() diff --git a/client/test/selection_event_client_test.gd b/client/test/selection_event_client_test.gd index f0e36a9..1aa120e 100644 --- a/client/test/selection_event_client_test.gd +++ b/client/test/selection_event_client_test.gd @@ -4,8 +4,9 @@ extends GdUnitTestSuite const TargetSelectionTestDouble := preload("res://test/target_selection_test_double.gd") -const ALPHA_ID := "prototype_target_alpha" -const BETA_ID := "prototype_target_beta" +const ELITE_ID := "prototype_npc_elite" +const MELEE_ID := "prototype_npc_melee" +const RANGED_ID := "prototype_npc_ranged" class MockHttpTransport: @@ -74,7 +75,7 @@ func test_tab_lock_change_emits_tab() -> void: # Arrange var transport := MockHttpTransport.new() transport.enqueue( - HTTPRequest.RESULT_SUCCESS, 200, _select_response_json(true, ALPHA_ID, "ok", 1) + HTTPRequest.RESULT_SUCCESS, 200, _select_response_json(true, MELEE_ID, "ok", 1) ) var c := _make_client(transport) var events: Array = [] @@ -86,7 +87,7 @@ func test_tab_lock_change_emits_tab() -> void: var last: Dictionary = events[0] as Dictionary assert_that(last.get("cause", "")).is_equal("tab") assert_that(last.get("previous")).is_null() - assert_that(last.get("next")).is_equal(ALPHA_ID) + assert_that(last.get("next")).is_equal(MELEE_ID) assert_that(int(last.get("sequence", -1))).is_equal(1) @@ -94,7 +95,7 @@ func test_clear_lock_change_emits_clear() -> void: # Arrange var transport := MockHttpTransport.new() transport.enqueue( - HTTPRequest.RESULT_SUCCESS, 200, _select_response_json(true, ALPHA_ID, "ok", 1) + HTTPRequest.RESULT_SUCCESS, 200, _select_response_json(true, MELEE_ID, "ok", 1) ) transport.enqueue(HTTPRequest.RESULT_SUCCESS, 200, _select_response_json(true, null, "none", 2)) var c := _make_client(transport) @@ -107,7 +108,7 @@ func test_clear_lock_change_emits_clear() -> void: assert_that(events.size()).is_equal(2) assert_that(int((events[0] as Dictionary).get("sequence", -1))).is_equal(1) assert_that((events[1] as Dictionary).get("cause", "")).is_equal("clear") - assert_that((events[1] as Dictionary).get("previous")).is_equal(ALPHA_ID) + assert_that((events[1] as Dictionary).get("previous")).is_equal(MELEE_ID) assert_that((events[1] as Dictionary).get("next")).is_null() assert_that(int((events[1] as Dictionary).get("sequence", -1))).is_equal(2) @@ -116,9 +117,9 @@ func test_get_lock_id_change_emits_server_correction() -> void: # Arrange var transport := MockHttpTransport.new() transport.enqueue( - HTTPRequest.RESULT_SUCCESS, 200, _select_response_json(true, ALPHA_ID, "ok", 1) + HTTPRequest.RESULT_SUCCESS, 200, _select_response_json(true, MELEE_ID, "ok", 1) ) - transport.enqueue(HTTPRequest.RESULT_SUCCESS, 200, _target_state_json(BETA_ID, "ok", 2)) + transport.enqueue(HTTPRequest.RESULT_SUCCESS, 200, _target_state_json(RANGED_ID, "ok", 2)) var c := _make_client(transport) var events: Array = [] c.selection_event.connect(func(ev: Dictionary) -> void: events.append(ev.duplicate())) @@ -129,8 +130,8 @@ func test_get_lock_id_change_emits_server_correction() -> void: assert_that(events.size()).is_equal(2) var last: Dictionary = events[1] as Dictionary assert_that(last.get("cause", "")).is_equal("server_correction") - assert_that(last.get("previous")).is_equal(ALPHA_ID) - assert_that(last.get("next")).is_equal(BETA_ID) + assert_that(last.get("previous")).is_equal(MELEE_ID) + assert_that(last.get("next")).is_equal(RANGED_ID) assert_that(int(last.get("sequence", -1))).is_equal(2) @@ -138,10 +139,10 @@ func test_get_validity_only_change_emits_nothing() -> void: # Arrange var transport := MockHttpTransport.new() transport.enqueue( - HTTPRequest.RESULT_SUCCESS, 200, _select_response_json(true, ALPHA_ID, "ok", 1) + HTTPRequest.RESULT_SUCCESS, 200, _select_response_json(true, MELEE_ID, "ok", 1) ) transport.enqueue( - HTTPRequest.RESULT_SUCCESS, 200, _target_state_json(ALPHA_ID, "out_of_range", 1) + HTTPRequest.RESULT_SUCCESS, 200, _target_state_json(MELEE_ID, "out_of_range", 1) ) var c := _make_client(transport) var events: Array = [] @@ -167,6 +168,6 @@ func test_denial_without_lock_id_change_emits_nothing() -> void: var events: Array = [] c.selection_event.connect(func(ev: Dictionary) -> void: events.append(ev.duplicate())) # Act - c.request_select_target_id(ALPHA_ID) + c.request_select_target_id(MELEE_ID) # Assert assert_that(events.size()).is_equal(0) diff --git a/client/test/target_refresh_on_locomotion_test.gd b/client/test/target_refresh_on_locomotion_test.gd index f4f81e6..6fdc78f 100644 --- a/client/test/target_refresh_on_locomotion_test.gd +++ b/client/test/target_refresh_on_locomotion_test.gd @@ -13,7 +13,7 @@ extends GdUnitTestSuite const PositionAuthorityTestDouble := preload("res://test/position_authority_test_double.gd") const TargetSelectionTestDouble := preload("res://test/target_selection_test_double.gd") -const ALPHA_ID := "prototype_target_alpha" +const ALPHA_ID := "prototype_npc_melee" # Mirrors the transports from the per-client suites: a queue-backed `Node` with a diff --git a/client/test/target_selection_client_test.gd b/client/test/target_selection_client_test.gd index d4e65d1..c835280 100644 --- a/client/test/target_selection_client_test.gd +++ b/client/test/target_selection_client_test.gd @@ -6,8 +6,9 @@ extends GdUnitTestSuite const TargetSelectionTestDouble := preload("res://test/target_selection_test_double.gd") -const ALPHA_ID := "prototype_target_alpha" -const BETA_ID := "prototype_target_beta" +const ELITE_ID := "prototype_npc_elite" +const MELEE_ID := "prototype_npc_melee" +const RANGED_ID := "prototype_npc_ranged" # In-process transport: not an HTTPRequest subclass (Godot 4 will not call script `request()` @@ -101,7 +102,7 @@ func test_tab_from_no_lock_selects_first_id() -> void: # Arrange var transport := MockHttpTransport.new() transport.enqueue( - HTTPRequest.RESULT_SUCCESS, 200, _select_response_json(true, ALPHA_ID, "ok", 1) + HTTPRequest.RESULT_SUCCESS, 200, _select_response_json(true, ELITE_ID, "ok", 1) ) var c := _make_client(transport) monitor_signals(c) @@ -110,49 +111,53 @@ func test_tab_from_no_lock_selects_first_id() -> void: # Assert assert_that(transport.last_url).contains("/target/select") assert_that(transport.last_method).is_equal(HTTPClient.METHOD_POST) - assert_that(transport.last_body).contains('"targetId":"%s"' % ALPHA_ID) + assert_that(transport.last_body).contains('"targetId":"%s"' % ELITE_ID) await assert_signal(c).is_emitted("target_state_changed", any()) - assert_that(c.cached_state().get("lockedTargetId")).is_equal(ALPHA_ID) + assert_that(c.cached_state().get("lockedTargetId")).is_equal(ELITE_ID) -func test_tab_from_alpha_requests_beta() -> void: +func test_tab_from_elite_requests_melee() -> void: # Arrange var transport := MockHttpTransport.new() transport.enqueue( - HTTPRequest.RESULT_SUCCESS, 200, _select_response_json(true, ALPHA_ID, "ok", 1) + HTTPRequest.RESULT_SUCCESS, 200, _select_response_json(true, ELITE_ID, "ok", 1) ) transport.enqueue( - HTTPRequest.RESULT_SUCCESS, 200, _select_response_json(true, BETA_ID, "ok", 2) + HTTPRequest.RESULT_SUCCESS, 200, _select_response_json(true, MELEE_ID, "ok", 2) ) var c := _make_client(transport) # Act c.request_tab_next() c.request_tab_next() # Assert - assert_that(transport.last_body).contains('"targetId":"%s"' % BETA_ID) - assert_that(c.cached_state().get("lockedTargetId")).is_equal(BETA_ID) + assert_that(transport.last_body).contains('"targetId":"%s"' % MELEE_ID) + assert_that(c.cached_state().get("lockedTargetId")).is_equal(MELEE_ID) -func test_tab_wraps_from_beta_to_alpha() -> void: +func test_tab_wraps_from_ranged_back_to_elite() -> void: # Arrange var transport := MockHttpTransport.new() transport.enqueue( - HTTPRequest.RESULT_SUCCESS, 200, _select_response_json(true, ALPHA_ID, "ok", 1) + HTTPRequest.RESULT_SUCCESS, 200, _select_response_json(true, ELITE_ID, "ok", 1) ) transport.enqueue( - HTTPRequest.RESULT_SUCCESS, 200, _select_response_json(true, BETA_ID, "ok", 2) + HTTPRequest.RESULT_SUCCESS, 200, _select_response_json(true, MELEE_ID, "ok", 2) ) transport.enqueue( - HTTPRequest.RESULT_SUCCESS, 200, _select_response_json(true, ALPHA_ID, "ok", 3) + HTTPRequest.RESULT_SUCCESS, 200, _select_response_json(true, RANGED_ID, "ok", 3) + ) + transport.enqueue( + HTTPRequest.RESULT_SUCCESS, 200, _select_response_json(true, ELITE_ID, "ok", 4) ) var c := _make_client(transport) # Act c.request_tab_next() c.request_tab_next() c.request_tab_next() + c.request_tab_next() # Assert - assert_that(transport.last_body).contains('"targetId":"%s"' % ALPHA_ID) - assert_that(c.cached_state().get("lockedTargetId")).is_equal(ALPHA_ID) + assert_that(transport.last_body).contains('"targetId":"%s"' % ELITE_ID) + assert_that(c.cached_state().get("lockedTargetId")).is_equal(ELITE_ID) func test_denial_reflects_authoritative_target_state() -> void: @@ -166,7 +171,7 @@ func test_denial_reflects_authoritative_target_state() -> void: ) var c := _make_client(transport) # Act - c.request_select_target_id(ALPHA_ID) + c.request_select_target_id(MELEE_ID) # Assert var state: Dictionary = c.cached_state() assert_that(bool(state.get("selectionApplied", true))).is_false() @@ -192,21 +197,21 @@ func test_authoritative_ack_while_locked_fires_refresh_get() -> void: var transport := MockHttpTransport.new() # Step 1: lock alpha via POST. transport.enqueue( - HTTPRequest.RESULT_SUCCESS, 200, _select_response_json(true, ALPHA_ID, "ok", 1) + HTTPRequest.RESULT_SUCCESS, 200, _select_response_json(true, MELEE_ID, "ok", 1) ) # Step 2: movement-triggered GET shows out_of_range (soft lock). transport.enqueue( - HTTPRequest.RESULT_SUCCESS, 200, _target_state_json(ALPHA_ID, "out_of_range", 1) + HTTPRequest.RESULT_SUCCESS, 200, _target_state_json(MELEE_ID, "out_of_range", 1) ) var c := _make_client(transport) # Act - c.request_select_target_id(ALPHA_ID) + c.request_select_target_id(MELEE_ID) var count_before_ack: int = transport.request_count c.on_authoritative_ack(Vector3.ZERO) # Assert assert_that(transport.request_count).is_equal(count_before_ack + 1) assert_that(c.cached_state().get("validity")).is_equal("out_of_range") - assert_that(c.cached_state().get("lockedTargetId")).is_equal(ALPHA_ID) + assert_that(c.cached_state().get("lockedTargetId")).is_equal(MELEE_ID) func test_authoritative_ack_without_lock_fires_nothing() -> void: @@ -223,14 +228,14 @@ func test_two_acks_within_cooldown_collapse_to_one_get() -> void: # Arrange var transport := MockHttpTransport.new() transport.enqueue( - HTTPRequest.RESULT_SUCCESS, 200, _select_response_json(true, ALPHA_ID, "ok", 1) + HTTPRequest.RESULT_SUCCESS, 200, _select_response_json(true, MELEE_ID, "ok", 1) ) transport.enqueue( - HTTPRequest.RESULT_SUCCESS, 200, _target_state_json(ALPHA_ID, "out_of_range", 1) + HTTPRequest.RESULT_SUCCESS, 200, _target_state_json(MELEE_ID, "out_of_range", 1) ) var c := _make_client(transport) # Act - c.request_select_target_id(ALPHA_ID) + c.request_select_target_id(MELEE_ID) var count_before: int = transport.request_count c.on_authoritative_ack(Vector3.ZERO) c.on_authoritative_ack(Vector3.ZERO) @@ -262,7 +267,7 @@ func test_select_post_kicks_freshness_stream_before_posting() -> void: # Arrange var transport := MockHttpTransport.new() transport.enqueue( - HTTPRequest.RESULT_SUCCESS, 200, _select_response_json(true, ALPHA_ID, "ok", 1) + HTTPRequest.RESULT_SUCCESS, 200, _select_response_json(true, MELEE_ID, "ok", 1) ) var c := _make_client(transport) var authority := FreshnessAuthorityStub.new() @@ -271,7 +276,7 @@ func test_select_post_kicks_freshness_stream_before_posting() -> void: var player := _make_player(Vector3(1.5, 0.5, -2.25)) c.set_freshness_kick(authority, player) # Act - c.request_select_target_id(ALPHA_ID) + c.request_select_target_id(MELEE_ID) # Assert # Exactly one freshness submit, matching the pre-POST capsule position. assert_that(authority.submit_count).is_equal(1) @@ -287,7 +292,7 @@ func test_select_post_includes_position_hint_when_player_wired() -> void: # `positionHint` so the server's range check can bypass any stale stored snap. var transport := MockHttpTransport.new() transport.enqueue( - HTTPRequest.RESULT_SUCCESS, 200, _select_response_json(true, BETA_ID, "ok", 1) + HTTPRequest.RESULT_SUCCESS, 200, _select_response_json(true, RANGED_ID, "ok", 1) ) var c := _make_client(transport) var authority := FreshnessAuthorityStub.new() @@ -298,12 +303,12 @@ func test_select_post_includes_position_hint_when_player_wired() -> void: var player := _make_player(Vector3(3.0, 0.5, 5.0)) c.set_freshness_kick(authority, player) # Act - c.request_select_target_id(BETA_ID) + c.request_select_target_id(RANGED_ID) # Assert var parsed: Variant = JSON.parse_string(transport.last_body) assert_that(parsed is Dictionary).is_true() var body: Dictionary = parsed - assert_that(body.get("targetId")).is_equal(BETA_ID) + assert_that(body.get("targetId")).is_equal(RANGED_ID) assert_that(body.has("positionHint")).is_true() var hint: Dictionary = body["positionHint"] assert_float(hint.get("x")).is_equal_approx(3.0, 0.0001) @@ -317,11 +322,11 @@ func test_select_post_without_freshness_wiring_is_a_noop() -> void: # still POST normally, *without* a `positionHint` (hint is opt-in per wiring). var transport := MockHttpTransport.new() transport.enqueue( - HTTPRequest.RESULT_SUCCESS, 200, _select_response_json(true, ALPHA_ID, "ok", 1) + HTTPRequest.RESULT_SUCCESS, 200, _select_response_json(true, MELEE_ID, "ok", 1) ) var c := _make_client(transport) # Act - c.request_select_target_id(ALPHA_ID) + c.request_select_target_id(MELEE_ID) # Assert assert_that(transport.last_url).contains("/target/select") # No `positionHint` key in the body when no player is wired — re-parse so the assertion @@ -329,29 +334,29 @@ func test_select_post_without_freshness_wiring_is_a_noop() -> void: var parsed: Variant = JSON.parse_string(transport.last_body) assert_that(parsed is Dictionary).is_true() assert_that((parsed as Dictionary).has("positionHint")).is_false() - assert_that(c.cached_state().get("lockedTargetId")).is_equal(ALPHA_ID) + assert_that(c.cached_state().get("lockedTargetId")).is_equal(MELEE_ID) -func test_tab_from_no_lock_skips_out_of_range_and_picks_beta() -> void: +func test_tab_from_no_lock_skips_out_of_range_and_picks_ranged() -> void: # Arrange - # Player stands next to beta (well outside alpha's ring). Without the range-aware - # tab cycle the server denies with `out_of_range` on alpha — see NEO-24 follow-up #3. + # Player stands next to ranged only (elite/melee rings are out of reach). Without the + # range-aware tab cycle the server denies on the first id in cycle order. var transport := MockHttpTransport.new() transport.enqueue( - HTTPRequest.RESULT_SUCCESS, 200, _select_response_json(true, BETA_ID, "ok", 1) + HTTPRequest.RESULT_SUCCESS, 200, _select_response_json(true, RANGED_ID, "ok", 1) ) var c := _make_client(transport) var authority := FreshnessAuthorityStub.new() auto_free(authority) add_child(authority) - # Near beta anchor (3, 3), ~1.4 m horizontal — inside 6 m. Far from alpha at (-3, -3). - var player := _make_player(Vector3(4.0, 0.5, 4.0)) + # Near ranged anchor (3, 3), inside 6 m; elite at origin and melee at (-3, -3) are out. + var player := _make_player(Vector3(7.0, 0.5, 7.0)) c.set_freshness_kick(authority, player) # Act c.request_tab_next() # Assert - assert_that(transport.last_body).contains('"targetId":"%s"' % BETA_ID) - assert_that(c.cached_state().get("lockedTargetId")).is_equal(BETA_ID) + assert_that(transport.last_body).contains('"targetId":"%s"' % RANGED_ID) + assert_that(c.cached_state().get("lockedTargetId")).is_equal(RANGED_ID) func test_tab_from_no_lock_with_nothing_in_range_falls_back_to_first_id() -> void: @@ -372,21 +377,21 @@ func test_tab_from_no_lock_with_nothing_in_range_falls_back_to_first_id() -> voi # Act c.request_tab_next() # Assert - assert_that(transport.last_body).contains('"targetId":"%s"' % ALPHA_ID) + assert_that(transport.last_body).contains('"targetId":"%s"' % ELITE_ID) assert_that(c.cached_state().get("reasonCode", "")).is_equal("out_of_range") -func test_tab_from_locked_alpha_at_origin_swaps_to_beta_when_both_in_range() -> void: +func test_tab_from_locked_elite_at_origin_swaps_to_melee_when_both_in_range() -> void: # Arrange - # With alpha (-3,-3) and beta (3,3) sharing r=6, origin is in both rings. Locked to - # alpha, Tab should request beta (normal cycle behavior; range-aware skip-current - # does not interfere when the next id is also in range). + # With elite (0,0), melee (-3,-3), and ranged (3,3) sharing r=6, origin is in elite/melee + # rings. Locked to elite, Tab should request melee (normal cycle behavior; range-aware + # skip-current does not interfere when the next id is also in range). var transport := MockHttpTransport.new() transport.enqueue( - HTTPRequest.RESULT_SUCCESS, 200, _select_response_json(true, ALPHA_ID, "ok", 1) + HTTPRequest.RESULT_SUCCESS, 200, _select_response_json(true, ELITE_ID, "ok", 1) ) transport.enqueue( - HTTPRequest.RESULT_SUCCESS, 200, _select_response_json(true, BETA_ID, "ok", 2) + HTTPRequest.RESULT_SUCCESS, 200, _select_response_json(true, MELEE_ID, "ok", 2) ) var c := _make_client(transport) var authority := FreshnessAuthorityStub.new() @@ -398,8 +403,8 @@ func test_tab_from_locked_alpha_at_origin_swaps_to_beta_when_both_in_range() -> c.request_tab_next() c.request_tab_next() # Assert - assert_that(transport.last_body).contains('"targetId":"%s"' % BETA_ID) - assert_that(c.cached_state().get("lockedTargetId")).is_equal(BETA_ID) + assert_that(transport.last_body).contains('"targetId":"%s"' % MELEE_ID) + assert_that(c.cached_state().get("lockedTargetId")).is_equal(MELEE_ID) func test_tab_when_only_current_lock_is_in_range_falls_back_to_cycle_for_denial() -> void: @@ -410,39 +415,39 @@ func test_tab_when_only_current_lock_is_in_range_falls_back_to_cycle_for_denial( # visible reaction to Tab. var transport := MockHttpTransport.new() transport.enqueue( - HTTPRequest.RESULT_SUCCESS, 200, _select_response_json(true, ALPHA_ID, "ok", 1) + HTTPRequest.RESULT_SUCCESS, 200, _select_response_json(true, MELEE_ID, "ok", 1) ) transport.enqueue( HTTPRequest.RESULT_SUCCESS, 200, - _select_response_json(false, ALPHA_ID, "ok", 1, "out_of_range") + _select_response_json(false, MELEE_ID, "ok", 1, "out_of_range") ) var c := _make_client(transport) var authority := FreshnessAuthorityStub.new() auto_free(authority) add_child(authority) - # Near alpha (-3, -3), ~1.4 m in — beta (3, 3) is ~8.5 m out. - var player := _make_player(Vector3(-2.0, 0.5, -2.0)) + # Near melee (-3, -3), inside its ring — elite at origin and ranged at (3, 3) are out. + var player := _make_player(Vector3(-8.0, 0.5, -3.0)) c.set_freshness_kick(authority, player) # Act - c.request_select_target_id(ALPHA_ID) + c.request_select_target_id(MELEE_ID) c.request_tab_next() # Assert - assert_that(transport.last_body).contains('"targetId":"%s"' % BETA_ID) + assert_that(transport.last_body).contains('"targetId":"%s"' % RANGED_ID) assert_that(c.cached_state().get("reasonCode", "")).is_equal("out_of_range") - assert_that(c.cached_state().get("lockedTargetId")).is_equal(ALPHA_ID) + assert_that(c.cached_state().get("lockedTargetId")).is_equal(MELEE_ID) func test_tab_without_player_ref_still_uses_plain_cycle_order() -> void: # Arrange # Regression: headless unit tests and any client that skips `set_freshness_kick(...)` - # must keep the pre-existing cycle-order semantics. Alpha is requested from no-lock. + # must keep the pre-existing cycle-order semantics. Elite is requested from no-lock. var transport := MockHttpTransport.new() transport.enqueue( - HTTPRequest.RESULT_SUCCESS, 200, _select_response_json(true, ALPHA_ID, "ok", 1) + HTTPRequest.RESULT_SUCCESS, 200, _select_response_json(true, ELITE_ID, "ok", 1) ) var c := _make_client(transport) # Act c.request_tab_next() # Assert - assert_that(transport.last_body).contains('"targetId":"%s"' % ALPHA_ID) + assert_that(transport.last_body).contains('"targetId":"%s"' % ELITE_ID)