From c96c2f1a6765a10709a318c735fa70a3374d4fed Mon Sep 17 00:00:00 2001 From: Monster Robot Party Date: Sat, 1 Aug 2026 09:38:35 +1000 Subject: [PATCH] =?UTF-8?q?LANE8:=20the=20greengrocer=20=E2=80=94=20soft?= =?UTF-8?q?=20stock,=20stacks=20that=20collapse,=20and=20litres?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The only site whose contents are mostly SOFT, and that one material change rewrites the level. `produce` is a new Smashable material that throws no shards at all — Splat.gd bursts it instead: coloured pulp, a puddle that STAYS, a squelch, and litres counted, because "how much juice did you make" is a far better score for a greengrocer than "how many objects did you destroy". Two knock-ons make the level play itself, both falling out of existing systems rather than needing new ones: * produce has a low brittle_speed, so anything heavy landing on it squashes it — which means a pyramid crushes its OWN bottom layer as it collapses, with no special code. Knock one off the top and the pile does the rest. Shove test: 257 items -> 45, and 42 litres of juice out of the collapse. * puddles are slippery, cutting ACCELERATION rather than top speed so it reads as sliding rather than as being slowed down. The more mess you make, the less the floor cooperates. Stacks are built bottom-up by Main._build_stack and nothing is glued or frozen — they stand because they are stacked, so pulling one out of the bottom row does what you'd hope. 258 produce items spawn and settle to 0.00 m/s with no spawn crush. The glass bottles behind the juice bar are the deliberate exception: one shelf in the room that still rewards a proper swing, and the contrast between litres and shards is the joke. Round produce is authored CENTRED, not floor-centred like every other prop in this repo, because a rolling body whose origin sits on the floor plane wobbles like a loaded die. _glb_piece grew a `centred` flag for it. REAL BUG FOUND, and it was costing hits in every level: _strike took the NEAREST collider of any kind, so a static surface could eat a swing. Leaning over a display table, the table edge is a few centimetres nearer than the fruit piled on it, so every swing hit the table and nothing broke — 0/306 for the whole first take. It now prefers a Smashable and only falls back to loose bodies if there isn't one. The offices were quietly losing hits on desks and shelves the same way. tools/gen_produce.py: apple, orange, tomato, watermelon, cabbage, banana hand, glass juice bottle, display crate. The melon's stripes were radial boxes first time and it came out looking like a sea mine; they're thin lenses through the middle now. dev/probe_grocer.gd verifies stacks settle, that produce yields litres and NO debris, that a collapse crushes, and that none of it leaks to the next site. Co-Authored-By: Claude Opus 5 --- LANES/LANE7-cubicle-hell.md | 32 ++ README.md | 4 +- game/README.md | 27 ++ game/assets/store/juice-bottle.glb | Bin 0 -> 20888 bytes game/assets/store/juice-bottle.glb.import | 45 +++ game/assets/store/produce-apple.glb | Bin 0 -> 19828 bytes game/assets/store/produce-apple.glb.import | 45 +++ game/assets/store/produce-banana.glb | Bin 0 -> 41008 bytes game/assets/store/produce-banana.glb.import | 45 +++ game/assets/store/produce-cabbage.glb | Bin 0 -> 45528 bytes game/assets/store/produce-cabbage.glb.import | 45 +++ game/assets/store/produce-crate.glb | Bin 0 -> 13376 bytes game/assets/store/produce-crate.glb.import | 45 +++ game/assets/store/produce-melon.glb | Bin 0 -> 166512 bytes game/assets/store/produce-melon.glb.import | 45 +++ game/assets/store/produce-orange.glb | Bin 0 -> 13948 bytes game/assets/store/produce-orange.glb.import | 45 +++ game/assets/store/produce-tomato.glb | Bin 0 -> 20952 bytes game/assets/store/produce-tomato.glb.import | 45 +++ game/dev/DemoDriver.gd | 29 +- game/dev/probe_grocer.gd | 83 +++++ game/dev/probe_grocer.gd.uid | 1 + game/scripts/Levels.gd | 121 ++++++- game/scripts/Main.gd | 73 +++- game/scripts/Player.gd | 30 +- game/scripts/Smashable.gd | 11 +- game/scripts/Splat.gd | 215 +++++++++++ game/scripts/Splat.gd.uid | 1 + tools/gen_produce.py | 353 +++++++++++++++++++ 29 files changed, 1317 insertions(+), 23 deletions(-) create mode 100644 game/assets/store/juice-bottle.glb create mode 100644 game/assets/store/juice-bottle.glb.import create mode 100644 game/assets/store/produce-apple.glb create mode 100644 game/assets/store/produce-apple.glb.import create mode 100644 game/assets/store/produce-banana.glb create mode 100644 game/assets/store/produce-banana.glb.import create mode 100644 game/assets/store/produce-cabbage.glb create mode 100644 game/assets/store/produce-cabbage.glb.import create mode 100644 game/assets/store/produce-crate.glb create mode 100644 game/assets/store/produce-crate.glb.import create mode 100644 game/assets/store/produce-melon.glb create mode 100644 game/assets/store/produce-melon.glb.import create mode 100644 game/assets/store/produce-orange.glb create mode 100644 game/assets/store/produce-orange.glb.import create mode 100644 game/assets/store/produce-tomato.glb create mode 100644 game/assets/store/produce-tomato.glb.import create mode 100644 game/dev/probe_grocer.gd create mode 100644 game/dev/probe_grocer.gd.uid create mode 100644 game/scripts/Splat.gd create mode 100644 game/scripts/Splat.gd.uid create mode 100644 tools/gen_produce.py diff --git a/LANES/LANE7-cubicle-hell.md b/LANES/LANE7-cubicle-hell.md index faa55cf..009ac7d 100644 --- a/LANES/LANE7-cubicle-hell.md +++ b/LANES/LANE7-cubicle-hell.md @@ -260,3 +260,35 @@ Still open in LEVEL 0: the two entities can't yet be told apart by anything exce getting close, which is correct but means a first-time player has no way to learn the difference except dying. A tell at medium range — a sound only one of them makes, or one that never appears in the same frame as the other — would give skill somewhere to live. + +--- + +## THE GREENGROCER *(built)* + +> *"stack and fall physics, can squash to make juice, throw it, smash glass bottles of +> juice etc"* + +`Levels.grocer()` + `Splat.gd` + `tools/gen_produce.py`. + +The only site whose stock is mostly **soft**, and that single material change rewrites +everything. `produce` throws no shards; it bursts — coloured pulp, a puddle that stays, a +squelch, and LITRES, which is a much better score for a greengrocer than a body count. + +Two knock-ons make the level play itself: +- Low `brittle_speed` means anything heavy landing on produce squashes it, so a pyramid + **crushes its own bottom layer as it collapses** with no special code. Shove test: 257 + items became 45, and 42 litres. +- Puddles are slippery, cutting acceleration rather than top speed so it reads as sliding. + The more fun you have, the worse the footing. + +Stacks are built bottom-up and nothing is glued or frozen — they stand because they're +stacked. 258 produce items spawn and settle to 0.00 m/s with no spawn crush. The glass +bottles behind the juice bar are the deliberate exception: one shelf that still wants a +proper swing, and the contrast between litres and shards is the whole joke. + +Round produce is authored CENTRED rather than floor-centred like every other prop in the +repo, because a rolling body whose origin sits on the floor plane wobbles like a loaded +die. + +Still open here: you can't yet PICK UP a piece of fruit and throw it. The record +grab/throw ritual is right there and produce is the obvious second user of it. diff --git a/README.md b/README.md index 175b092..34462be 100644 --- a/README.md +++ b/README.md @@ -12,8 +12,8 @@ rest of your day. Your score is your payslip: **wages earned minus damages cause during a meltdown you want to wreck a lot of cheap rubbish rather than one expensive filing cabinet. Falling Down, scored by payroll. -**Five sites** (Scranton branch, Pawnee city hall, a hacker house, a windowless IT -basement, and the Backrooms — where the walls are procedurally generated and everything +**Six sites** (Scranton branch, Pawnee city hall, a hacker house, a windowless IT +basement, a greengrocer where everything is soft except the bottles, and the Backrooms — where the walls are procedurally generated and everything you're there to destroy is invisible until you coat it in extinguisher powder, some of which you breathe) and **four modes** (Cubicle Hell, the Gauntlet, Total Destruction, Against the Clock). Sites are data, not code — see `game/scripts/Levels.gd`. diff --git a/game/README.md b/game/README.md index 7ce41c6..964a7aa 100644 --- a/game/README.md +++ b/game/README.md @@ -43,11 +43,38 @@ generator can later emit the same structure. | **PAWNEE CITY HALL** | civic beige, blue-grey | a public counter, pinboards, over-partitioned | | **THE INCUBATOR** | timber, white, 3 m, pendants | nobody has a desk; they work at a dining table | | **SUB-LEVEL 4** | concrete, green strip lights | **no windows**, exposed services, a wall of servers | +| **THE GREENGROCER** | bright, pale, warm strips | everything is **soft** except the bottles — see below | | **LEVEL 0** | one colour, everywhere | the Backrooms. Walls are **generated**, and everything you're here to destroy is **invisible** | `dev/probe_levels.gd` builds every one and reports residual motion after a full second. All five must read `0.00 m/s`. +### THE GREENGROCER — soft things + +The only site whose contents are mostly **soft**, and that one material change rewrites +the level. `produce` is a new material in `Smashable.PROFILES` that doesn't throw shards +at all — `scripts/Splat.gd` bursts it instead: coloured pulp, a puddle that **stays**, a +squelch, and litres counted, because "how much juice did you make" is a far better score +for a greengrocer than "how many objects did you destroy". + +Two knock-ons make the level play itself: + +- Produce has a low `brittle_speed`, so **anything heavy landing on it squashes it**. A + pyramid therefore crushes its own bottom layer as it collapses, with no special code — + knock one off the top and the pile does the rest. A shove test turned 257 items into 45 + and 42 litres. +- Puddles are **slippery**. The more mess you make, the less the floor cooperates. It cuts + your acceleration rather than your top speed, so it reads as sliding rather than as + being slowed down. + +Stacks are built bottom-up by `Main._build_stack()` and nothing is glued or frozen — +they stand because they're stacked, so pulling one out of the bottom row does exactly +what you'd hope. The glass bottles behind the juice bar are the deliberate exception: +one shelf in the room that still rewards a proper swing. + +Round produce is authored **centred**, not floor-centred like every other prop, because +a rolling body whose origin sits on the floor plane wobbles like a loaded die. + ### LEVEL 0 — the Backrooms, and the dust The only site whose walls are **generated** rather than authored, which is both the diff --git a/game/assets/store/juice-bottle.glb b/game/assets/store/juice-bottle.glb new file mode 100644 index 0000000000000000000000000000000000000000..badfd2d969c0e860d018da617d24af5e33d0f630 GIT binary patch literal 20888 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 literal 0 HcmV?d00001 diff --git a/game/assets/store/juice-bottle.glb.import b/game/assets/store/juice-bottle.glb.import new file mode 100644 index 0000000..93d147d --- /dev/null +++ b/game/assets/store/juice-bottle.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://c1xc737dqd8ew" +path="res://.godot/imported/juice-bottle.glb-ab512d3a5d4e16cab1f48e2bcb7a8bac.scn" + +[deps] + +source_file="res://assets/store/juice-bottle.glb" +dest_files=["res://.godot/imported/juice-bottle.glb-ab512d3a5d4e16cab1f48e2bcb7a8bac.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/game/assets/store/produce-apple.glb b/game/assets/store/produce-apple.glb new file mode 100644 index 0000000000000000000000000000000000000000..e7c51bc5116254cabe03922ffc6ee89ede243690 GIT binary patch literal 19828 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 literal 0 HcmV?d00001 diff --git a/game/assets/store/produce-banana.glb.import b/game/assets/store/produce-banana.glb.import new file mode 100644 index 0000000..c2fd538 --- /dev/null +++ b/game/assets/store/produce-banana.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://n387rbsyllsf" +path="res://.godot/imported/produce-banana.glb-0c648edd65c43bc0ea3c5c898ede294e.scn" + +[deps] + +source_file="res://assets/store/produce-banana.glb" +dest_files=["res://.godot/imported/produce-banana.glb-0c648edd65c43bc0ea3c5c898ede294e.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/game/assets/store/produce-cabbage.glb b/game/assets/store/produce-cabbage.glb new file mode 100644 index 0000000000000000000000000000000000000000..bad09d758a94209f638db863410f6331e122f707 GIT binary patch literal 45528 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 TE``0~xCR9d{w@U`dYk?q)JCng literal 0 HcmV?d00001 diff --git a/game/assets/store/produce-crate.glb.import b/game/assets/store/produce-crate.glb.import new file mode 100644 index 0000000..12a79fc --- /dev/null +++ b/game/assets/store/produce-crate.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://x1cagigbbfcg" +path="res://.godot/imported/produce-crate.glb-7d146d61b07b4a3c6851aa5a253e5475.scn" + +[deps] + +source_file="res://assets/store/produce-crate.glb" +dest_files=["res://.godot/imported/produce-crate.glb-7d146d61b07b4a3c6851aa5a253e5475.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/game/assets/store/produce-melon.glb b/game/assets/store/produce-melon.glb new file mode 100644 index 0000000000000000000000000000000000000000..aaa1a555b2462709615388a4d65b03c431be75d0 GIT binary patch literal 166512 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 TDRrOXD~GWjwvYUW=GOfWoE%7U literal 0 HcmV?d00001 diff --git a/game/assets/store/produce-melon.glb.import b/game/assets/store/produce-melon.glb.import new file mode 100644 index 0000000..da70d43 --- /dev/null +++ b/game/assets/store/produce-melon.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://ccxqbgqdnthpf" +path="res://.godot/imported/produce-melon.glb-b2c52371dc88f9b458a88985a9557913.scn" + +[deps] + +source_file="res://assets/store/produce-melon.glb" +dest_files=["res://.godot/imported/produce-melon.glb-b2c52371dc88f9b458a88985a9557913.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/game/assets/store/produce-orange.glb b/game/assets/store/produce-orange.glb new file mode 100644 index 0000000000000000000000000000000000000000..a388baf396db9bea1320946040655930e78a266c GIT binary patch literal 13948 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 MI{tp9k&fv72mVRCR{#J2 literal 0 HcmV?d00001 diff --git a/game/assets/store/produce-orange.glb.import b/game/assets/store/produce-orange.glb.import new file mode 100644 index 0000000..cca339e --- /dev/null +++ b/game/assets/store/produce-orange.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://dyxit85msktn1" +path="res://.godot/imported/produce-orange.glb-1bd0c62975a090bd5dffe3cc0bd3f046.scn" + +[deps] + +source_file="res://assets/store/produce-orange.glb" +dest_files=["res://.godot/imported/produce-orange.glb-1bd0c62975a090bd5dffe3cc0bd3f046.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/game/assets/store/produce-tomato.glb b/game/assets/store/produce-tomato.glb new file mode 100644 index 0000000000000000000000000000000000000000..fa2462a82a3c2883c82816d4b0d7fe8f20f71765 GIT binary patch literal 20952 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 Dx Player: return null func _build_script() -> void: - # The two of them. Same silhouette at range; the tells are close-range only — the - # other one's head is thrown back, its arms are up, and its feet don't reach. + # THE GREENGROCER: look at the stacks, take the bat to one, watch it come down, then + # the bottles — the one shelf in here that still wants a proper swing. _script = [ - {"dur": 1.2, "move_to": null, "look_at": null, "act": "level:backrooms"}, - {"dur": 0.3, "move_to": Vector3(0, 0, 4.0), "look_at": Vector3(0, 1.6, -4.0), - "act": "ent:0,-4"}, - {"dur": 3.0, "move_to": null, "look_at": null, "act": ""}, - {"dur": 0.3, "move_to": null, "look_at": Vector3(4.0, 1.6, -4.0), "act": "two:4,-4"}, - {"dur": 3.4, "move_to": null, "look_at": null, "act": ""}, - {"dur": 3.0, "move_to": Vector3(2.0, 0, 1.0), "look_at": Vector3(4.0, 1.7, -4.0), - "act": ""}, + {"dur": 1.2, "move_to": null, "look_at": null, "act": "level:grocer"}, + {"dur": 0.3, "move_to": null, "look_at": null, "act": "mode:2"}, + {"dur": 2.6, "move_to": Vector3(-2.0, 0, 4.4), "look_at": Vector3(-3.6, 1.3, 0.0), "act": ""}, + {"dur": 2.0, "move_to": Vector3(-4.6, 0, 0.4), "look_at": Vector3(-5.4, 1.15, 1.4), "act": ""}, + {"dur": 0.4, "move_to": null, "look_at": null, "act": "weapon:2"}, + {"dur": 1.0, "move_to": null, "look_at": null, "act": "swing"}, + {"dur": 1.2, "move_to": null, "look_at": null, "act": "swing"}, + {"dur": 1.4, "move_to": null, "look_at": null, "act": "swing"}, + {"dur": 2.4, "move_to": Vector3(-4.9, 0, -1.4), "look_at": Vector3(-5.4, 1.10, -2.2), "act": ""}, + {"dur": 1.2, "move_to": null, "look_at": null, "act": "swing"}, + {"dur": 1.6, "move_to": null, "look_at": null, "act": "swing"}, + # and the bottles + {"dur": 2.6, "move_to": Vector3(-3.0, 0, -6.4), "look_at": Vector3(-3.0, 1.75, -7.7), "act": ""}, + {"dur": 0.4, "move_to": null, "look_at": null, "act": "weapon:4"}, + {"dur": 1.4, "move_to": null, "look_at": null, "act": "swing"}, + {"dur": 1.6, "move_to": null, "look_at": null, "act": "swing"}, + {"dur": 2.6, "move_to": Vector3(-1.0, 0, 2.0), "look_at": Vector3(-4.0, 0.6, -0.5), "act": ""}, ] func _motion(verbose := false) -> float: diff --git a/game/dev/probe_grocer.gd b/game/dev/probe_grocer.gd new file mode 100644 index 0000000..e98b02f --- /dev/null +++ b/game/dev/probe_grocer.gd @@ -0,0 +1,83 @@ +extends SceneTree + +## The greengrocer: do the pyramids build and SETTLE, does produce burst instead of +## shattering, does a collapse crush its own bottom layer, and does the floor get +## slippery. +## Godot --headless --path game --script dev/probe_grocer.gd + +func _initialize() -> void: + var main: Node = (load("res://main.tscn") as PackedScene).instantiate() + get_root().add_child(main) + await process_frame + main._load_level("grocer") + for i in 10: + await physics_frame + + var splat = main.get("_splat") + var produce := _count("produce") + print("site : ", main.get("_plan").level_name()) + print("produce : %d glass: %d total smashables: %d" % [ + produce, _count("glass"), get_nodes_in_group("smashable").size()]) + + # --- do the stacks hold? --- + for i in 120: + await physics_frame + var moving := 0 + var total := 0.0 + for n in get_nodes_in_group("smashable"): + var b := n as RigidBody3D + if b == null or b.freeze: + continue + var v := b.linear_velocity.length() + total += v + if v > 0.15: + moving += 1 + print("after 2s : %d still moving, total %.2f m/s (stacks should be at rest)" % [ + moving, total]) + print("survived : %d produce (spawn crush would show up as losses)" % _count("produce")) + + # --- squash one: does it burst rather than shard? --- + var before_l: float = splat.litres + var debris_before := get_nodes_in_group("debris").size() + var victim: Smashable = null + for n in get_nodes_in_group("smashable"): + if (n as Smashable).kind == "produce": + victim = n + break + var at := victim.global_position + victim.shatter(Vector3.UP) + await process_frame + print("squash one: litres %.2f -> %.2f debris %d -> %d (must NOT rise: fruit has no shards)" % [ + before_l, splat.litres, debris_before, get_nodes_in_group("debris").size()]) + + # --- drop a melon on a pile: does the collapse crush? --- + var n0 := _count("produce") + for n in get_nodes_in_group("smashable"): + var b := n as Smashable + if b != null and b.kind == "produce": + b.apply_central_impulse(Vector3(randf_range(-3, 3), 0, randf_range(-3, 3))) + for i in 150: + await physics_frame + print("shoved all: %d -> %d produce %.1f litres from the collapse" % [ + n0, _count("produce"), splat.litres]) + + # --- slippery? --- + var player = main.get("_player") + player.global_position = Vector3(at.x, 0.0, at.z) + await process_frame + print("slip here : %.2f (0 = dry floor)" % splat.slip_under_player()) + print("hud : ", splat.hud_line()) + + # --- and none of it leaks to the office --- + main._load_level("scranton") + for i in 6: + await physics_frame + print("at office : litres %.1f (reset) produce %d" % [splat.litres, _count("produce")]) + quit() + +func _count(kind: String) -> int: + var n := 0 + for s in get_nodes_in_group("smashable"): + if (s as Smashable) != null and (s as Smashable).kind == kind: + n += 1 + return n diff --git a/game/dev/probe_grocer.gd.uid b/game/dev/probe_grocer.gd.uid new file mode 100644 index 0000000..47e57f4 --- /dev/null +++ b/game/dev/probe_grocer.gd.uid @@ -0,0 +1 @@ +uid://dkeg30h37ndx1 diff --git a/game/scripts/Levels.gd b/game/scripts/Levels.gd index c5bb60f..e2c11e9 100644 --- a/game/scripts/Levels.gd +++ b/game/scripts/Levels.gd @@ -20,7 +20,7 @@ class_name Levels ## ## Godot 4.7 GDScript 2.0. -const ORDER := ["scranton", "pawnee", "house", "basement", "backrooms"] +const ORDER := ["scranton", "pawnee", "house", "basement", "grocer", "backrooms"] static func get_level(id: String) -> Dictionary: match id: @@ -28,6 +28,7 @@ static func get_level(id: String) -> Dictionary: "house": return house() "basement": return basement() "backrooms": return backrooms() + "grocer": return grocer() return scranton() static func next_id(id: String) -> String: @@ -558,3 +559,121 @@ static func backrooms() -> Dictionary: "stand": Vector3(0.0, 0.0, 0.2), "shredder": Vector3(3.0, 0.0, -1.0)}, "spawn": {"at": Vector3(0.0, 0.0, 16.5), "yaw": PI}, } + +# ================================================================ THE GROCER +## A greengrocer, and the only site whose contents are mostly SOFT. +## +## Everything else in the game shatters; here the stock bursts. That one material change +## rewrites the level: produce squashes instead of breaking, a pyramid crushes its own +## bottom layer as it collapses, and the floor fills with juice you then slip in. The +## glass bottles behind the juice bar are the exception, and the contrast is the point — +## one shelf in the room still rewards a proper swing. +## +## Bright, clean, warm track lighting on a pale floor, because the whole level is about +## making a mess and a mess needs somewhere clean to happen. +static func grocer() -> Dictionary: + var stacks: Array = [] + # Angled island displays. `at` is the TOP surface a pyramid piles onto; Main builds + # the pyramid itself so the physics settles honestly rather than being placed. + var islands := [ + [Vector3(-5.4, 0.95, -2.2), "apple", 5], + [Vector3(-5.4, 0.95, 1.4), "orange", 5], + [Vector3(-2.0, 0.95, -2.2), "tomato", 5], + [Vector3(-2.0, 0.95, 1.4), "apple", 4], + [Vector3(1.4, 0.95, -2.2), "cabbage", 3], + [Vector3(1.4, 0.95, 1.4), "orange", 4], + [Vector3(4.8, 0.80, -0.4), "melon", 3], + ] + for i in islands: + stacks.append({"at": i[0], "item": String(i[1]), "rows": int(i[2])}) + + var slabs: Array = [] + # the island tables themselves: a plinth, a timber top, and a raised back edge so a + # pyramid has something to fail against + for i in islands: + var p: Vector3 = i[0] + var big: bool = String(i[1]) == "melon" + var w := 2.4 if big else 1.5 + var d := 1.9 if big else 1.5 + var h: float = p.y + slabs.append({"size": Vector3(w, h - 0.10, d), + "at": Vector3(p.x, (h - 0.10) * 0.5, p.z), "mat": "trim"}) + slabs.append({"size": Vector3(w + 0.14, 0.10, d + 0.14), + "at": Vector3(p.x, h - 0.05, p.z), "mat": "wood"}) + for s in [-1.0, 1.0]: + slabs.append({"size": Vector3(w + 0.14, 0.10, 0.06), + "at": Vector3(p.x, h + 0.05, p.z + s * (d * 0.5 + 0.04)), "mat": "wood"}) + slabs.append({"size": Vector3(0.06, 0.10, d + 0.14), + "at": Vector3(p.x + s * (w * 0.5 + 0.04), h + 0.05, p.z), "mat": "wood"}) + + # juice bar along the back, with shelving above it for the bottles + slabs.append({"size": Vector3(7.0, 1.05, 0.75), "at": Vector3(-3.0, 0.525, -7.4), + "mat": "trim"}) + slabs.append({"size": Vector3(7.2, 0.09, 0.92), "at": Vector3(-3.0, 1.10, -7.4), + "mat": "wood"}) + for k in range(3): + slabs.append({"size": Vector3(6.6, 0.06, 0.34), + "at": Vector3(-3.0, 1.62 + k * 0.46, -7.72), "mat": "wood"}) + # chiller run down the right wall + slabs.append({"size": Vector3(0.80, 2.10, 8.0), "at": Vector3(10.4, 1.05, 1.0), + "mat": "trim"}) + for k in range(4): + slabs.append({"size": Vector3(0.86, 0.05, 8.0), + "at": Vector3(10.3, 0.55 + k * 0.46, 1.0), "mat": "ceiling"}) + + var smash: Array = [] + # bottles on the bar shelves — the one thing in here that still wants a proper swing + for k in range(3): + for b in range(11): + smash.append({"glb": "juice-bottle", "kind": "glass", + "at": Vector2(-6.0 + b * 0.60, -7.72), "sit_on": 1.65 + k * 0.46}) + for b in range(9): + smash.append({"glb": "juice-bottle", "kind": "glass", + "at": Vector2(-5.6 + b * 0.62, -7.4), "sit_on": 1.15}) + # loose crates of stock on the floor + for c in [Vector2(-8.6, 3.4), Vector2(-8.6, 4.4), Vector2(-8.0, 5.4), + Vector2(7.4, -4.6), Vector2(8.2, -4.0), Vector2(7.8, 5.2)]: + smash.append({"glb": "produce-crate", "kind": "wood", "at": c, + "yaw": randf_range(0.0, TAU)}) + # a few bananas and cabbages just lying about + for b in [Vector2(-7.2, 0.4), Vector2(3.2, 4.2), Vector2(6.0, 2.0)]: + smash.append({"glb": "produce-banana", "kind": "produce", "at": b}) + for c in [Vector2(-9.4, -2.0), Vector2(2.4, -5.6)]: + smash.append({"glb": "produce-cabbage", "kind": "produce", "at": c}) + + return { + "name": "THE GREENGROCER", + "subtitle": "everything here is soft except the bottles", + "bounds": {"x0": -11.0, "x1": 11.0, "z0": -8.0, "z1": 8.0, "h": 3.30}, + "palette": { + "floor": Color(0.70, 0.68, 0.64), "wall": Color(0.90, 0.89, 0.85), + "ceiling": Color(0.20, 0.20, 0.21), "trim": Color(0.15, 0.15, 0.16), + "partition": Color(0.30, 0.44, 0.40), "wood": Color(0.52, 0.36, 0.20), + "accent": Color(0.20, 0.48, 0.42), + }, + "floor_style": "lino", + "ceiling": "flat", + "walls": [], + "windows": [{"a": "z", "at": 8.0, "from": -11.0, "to": 11.0, + "y0": 0.35, "y1": 2.85, "blinds": false}], + "lights": {"xs": [-8.0, -4.0, 0.0, 4.0, 8.0], "zs": [-6.0, -2.0, 2.0, 6.0], + "color": Color(1.0, 0.94, 0.84), "energy": 2.4, "style": "strip", + "key_energy": 1.8}, + "sun": {"color": Color(1.0, 0.96, 0.88), "energy": 1.1, + "rot": Vector3(-40, 8, 0)}, + "env": {"bg": Color(0.76, 0.82, 0.88), "ambient": Color(0.60, 0.58, 0.55), + "ambient_energy": 0.66, "exposure": 1.04}, + "clusters": [], + "chairs": [], + "props": [ + {"glb": "office-plant", "at": Vector3(-10.2, 0.0, 7.0)}, + {"glb": "office-plant", "at": Vector3(9.6, 0.0, 7.0)}, + ], + "slabs": slabs, + "smashables": smash, + "stacks": stacks, + "records": [], + "gauntlet": {"at": Vector3(-8.6, 0.0, -6.0), "yaw": PI, + "stand": Vector3(-8.6, 0.0, -4.0), "shredder": Vector3(-6.4, 0.0, -5.4)}, + "spawn": {"at": Vector3(0.0, 0.0, 6.4), "yaw": PI}, + } diff --git a/game/scripts/Main.gd b/game/scripts/Main.gd index 03d8ab6..a07a216 100644 --- a/game/scripts/Main.gd +++ b/game/scripts/Main.gd @@ -42,6 +42,7 @@ var _modes: Modes var _gauntlet: Gauntlet var _dust: Dust var _backrooms: Backrooms +var _splat: Splat func _ready() -> void: randomize() @@ -83,6 +84,8 @@ func _ready() -> void: add_child(_dust) _backrooms = Backrooms.new() add_child(_backrooms) + _splat = Splat.new() + add_child(_splat) # rules layer: the record modes still exist behind M _game_mode = GameMode.new() @@ -95,6 +98,8 @@ func _ready() -> void: _ambience.adopt_lights(_plan) _gauntlet.setup(_player, _hud) _player.gauntlet = _gauntlet + _splat.setup(self, _player) + _player.splat = _splat _dust.setup(_player, _cam, _rage, _hud) _player.dust = _dust _backrooms.setup(_player, _cam, _hud, _rage, _dust, self) @@ -243,6 +248,10 @@ func _populate() -> void: (float(i) - 1.0) * 0.045), crate_top) (crate["piece"] as Smashable).supports.append(rec) + # --- stacked produce: pyramids that collapse honestly --- + for st in _plan.spec.get("stacks", []): + _build_stack(st) + # --- chairs: the best thing in an office to send across the room --- for t in _plan.chair_spots(): _glb_piece(CHAIR_GLB, "plastic", Vector2(t.origin.x, t.origin.z), false, 0.0, @@ -272,11 +281,43 @@ func _place_record(xz: Vector2, sit_on: float) -> Record: _records.append(rec) return rec +## A pyramid of produce, built bottom-up and left to settle. +## +## Nothing here is glued or frozen: it stands because it's stacked, which means pulling +## one out of the bottom row does exactly what you'd hope. Rows are inset and the whole +## thing spawns a few millimetres apart so the spawn guard has nothing to complain about. +func _build_stack(st: Dictionary) -> void: + var at: Vector3 = st["at"] + var item := String(st["item"]) + var rows := int(st.get("rows", 4)) + var glb := P + "produce-" + item + ".glb" + if not ResourceLoader.exists(glb): + return + # radius per item, so the lattice spacing matches what's actually being stacked + var radii := {"apple": 0.041, "orange": 0.038, "tomato": 0.034, + "melon": 0.150, "cabbage": 0.084} + var r: float = radii.get(item, 0.040) + var step: float = r * 2.06 # a whisker of air between neighbours + var lift: float = r * 1.72 # rows nest into the gaps below + for row in range(rows): + var n := rows - row + var y: float = at.y + r + row * lift + for i in range(n): + for j in range(n): + var x: float = at.x + (float(i) - (n - 1) * 0.5) * step + var z: float = at.z + (float(j) - (n - 1) * 0.5) * step + var s := _glb_piece(glb, "produce", Vector2(x, z), false, 0.0, + randf_range(0.0, TAU), true) + var body := s["piece"] as Smashable + body.global_position = Vector3(x, y, z) + body.set_meta("spawn_pos", body.global_position) + body.mass = maxf(r * r * r * 900.0, 0.08) + ## Instance a GLB as the VISUAL of a Smashable, give it a box collider auto-sized to ## the mesh AABB, and drop it so its bottom rests at height `sit_on`. Returns ## { piece: Smashable, top: float } so a caller can stack the next thing on top. func _glb_piece(path: String, kind: String, xz: Vector2, frozen: bool, sit_on := 0.0, - yaw := 0.0) -> Dictionary: + yaw := 0.0, centred := false) -> Dictionary: var s := Smashable.new() s.kind = kind s.start_frozen = frozen @@ -304,7 +345,12 @@ func _glb_piece(path: String, kind: String, xz: Vector2, frozen: bool, sit_on := col.position = ab.get_center() s.add_child(col) s.rotation.y = yaw - s.global_position = Vector3(xz.x, sit_on - ab.position.y, xz.y) # AABB bottom lands on sit_on + # Round produce is authored CENTRED so it rolls properly, so it must not be dropped + # by its AABB bottom like everything else — _build_stack places it directly. + if centred: + s.global_position = Vector3(xz.x, sit_on, xz.y) + else: + s.global_position = Vector3(xz.x, sit_on - ab.position.y, xz.y) # bottom on sit_on s.set_meta("spawn_pos", s.global_position) # for the spawn-guard warning _wire(s) return {"piece": s, "top": sit_on + ab.size.y, "aabb": ab} @@ -451,7 +497,14 @@ func _physics_process(dt: float) -> void: func _on_smashed(kind: String, at: Vector3, shards: int) -> void: _smash_count += 1 _tally[kind] = int(_tally.get(kind, 0)) + 1 - if _juice != null: + if kind == "produce": + # Splat owns this one: pulp, a puddle that stays, a squelch, and litres. Juice's + # shard-and-crack voice is exactly the wrong sound for a tomato. + if _splat != null: + _splat.burst(at, _last_produce, self) + if _juice != null: + _juice.add_trauma(0.10) + elif _juice != null: _juice.impact(kind, at, shards) # score AFTER impact() so this break's own combo step is counted _score += int(POINTS.get(kind, 15)) * maxi(_juice.combo(), 1) @@ -486,7 +539,15 @@ func _on_damaged(kind: String, at: Vector3, frac: float) -> void: _juice.dent(kind, at, frac) ## Every Smashable routes its three outcomes here. +var _last_produce := "generic" + func _wire(s: Smashable) -> void: + if s.kind == "produce": + # `smashed` only carries the MATERIAL, and every fruit is "produce". Stash the + # specific item off the node name so Splat can pick the right colour and yield. + var item := Splat.kind_of(s) + s.smashed.connect(func(_k, _a, _n): _last_produce = item, CONNECT_DEFERRED) + s.smashed.connect(func(_k, _a, _n): _last_produce = item) s.smashed.connect(_on_smashed) s.resisted.connect(_on_resisted) s.damaged.connect(_on_damaged) @@ -610,6 +671,8 @@ func _find_shredder(g: Dictionary) -> Node3D: ## Both are LEVEL 0 only, and both have to be explicitly torn down on the way out or they ## leak into an ordinary Tuesday at the Scranton branch. func _apply_site_horror() -> void: + if _splat != null: + _splat.reset() var blind := bool(_plan.spec.get("invisible", false)) if _dust != null: _dust.adopt(get_tree(), blind) @@ -716,7 +779,9 @@ func _process(_dt: float) -> void: "mode_line": _mode_line() + ("\n" + _dust.hud_line() if _dust != null and _dust.active else "") + ("\n" + _backrooms.hud_line() if _backrooms != null - and _backrooms.active else ""), + and _backrooms.active else "") + + ("\n" + _splat.hud_line() if _splat != null + and _splat.hud_line() != "" else ""), "mode_name": _modes.name_of() if _modes != null else "", "headline": _modes.headline() if _modes != null else "", "keys": KEYS_LINE, diff --git a/game/scripts/Player.gd b/game/scripts/Player.gd index 666dc19..1b65ddd 100644 --- a/game/scripts/Player.gd +++ b/game/scripts/Player.gd @@ -36,6 +36,9 @@ var tasks: Tasks = null var gauntlet: Gauntlet = null ## Set by Main. RMB discharges powder on sites where the smashables are invisible. var dust: Dust = null +## Set by Main. Juice on the floor costs you grip — the more mess you make, the less +## the floor cooperates. +var splat: Splat = null ## Set while you're dying, so you can't stroll around during it. var _frozen := false @@ -273,6 +276,10 @@ func _physics_process(delta: float) -> void: var target := wish * move_speed var a := accel if is_on_floor() else air_accel + if splat != null and is_on_floor(): + # standing in juice: you keep your top speed but lose the ability to change it, + # which reads as sliding rather than as being slowed down + a *= 1.0 - 0.82 * splat.slip_under_player() velocity.x = move_toward(velocity.x, target.x, a * move_speed * delta) velocity.z = move_toward(velocity.z, target.z, a * move_speed * delta) @@ -323,17 +330,32 @@ func _strike(w: Weapon) -> Node: if hits.is_empty(): return null + # Prefer a SMASHABLE over anything else in the sweep, and only fall back to loose + # bodies if there isn't one. + # + # This used to just take the nearest collider of any kind, which meant a static + # surface could eat the swing: leaning over a greengrocer's display table, the table + # edge is a few centimetres nearer than the fruit piled on it, so every swing hit + # the table and nothing broke. Same bug was quietly costing hits on desks and shelves + # in the offices too. var best: Node = null var best_d := INF + var fallback: Node = null + var fallback_d := INF for h in hits: var c = h.get("collider") if c == null or not (c is Node3D): continue var d: float = (c.global_position - origin).length_squared() - if d < best_d: - best_d = d - best = c - + if c is Smashable: + if d < best_d: + best_d = d + best = c + elif c is RigidBody3D and d < fallback_d: + fallback_d = d + fallback = c + if best == null: + best = fallback if best == null: return null diff --git a/game/scripts/Smashable.gd b/game/scripts/Smashable.gd index 4e6818a..a802728 100644 --- a/game/scripts/Smashable.gd +++ b/game/scripts/Smashable.gd @@ -10,7 +10,7 @@ class_name Smashable ## hard enough — that's the satisfying TAIL of the cascade: the record survives the ## tumble out of its jacket, then cracks a beat later when it smacks the floor. -@export_enum("wood", "cardboard", "vinyl", "glass", "steel", "plastic", "paper") var kind: String = "wood" +@export_enum("wood", "cardboard", "vinyl", "glass", "steel", "plastic", "paper", "produce") var kind: String = "wood" @export var start_frozen: bool = false ## Pre-fractured sibling (Lane 2 contract #2): a scene whose leaf `chunk_*` meshes are @@ -36,6 +36,10 @@ const PROFILES := { "steel": {"color": Color(0.7, 0.72, 0.76), "shards": 0, "brittle_speed": 0.0, "bounce": 0.25, "hp": 4.5}, "plastic": {"color": Color(0.82, 0.78, 0.70), "shards": 6, "brittle_speed": 0.0, "bounce": 0.15, "hp": 1.4}, "paper": {"color": Color(0.92, 0.90, 0.84), "shards": 3, "brittle_speed": 0.0, "bounce": 0.0, "hp": 0.3}, + # Produce does NOT throw shards — Splat.gd bursts it instead (see shatter()). The + # low brittle_speed is what makes a collapsing pyramid crush its own bottom layer + # with no special code: anything landing on it hard enough squashes it. + "produce": {"color": Color(0.80, 0.42, 0.20), "shards": 0, "brittle_speed": 1.8, "bounce": 0.10, "hp": 0.35}, } signal smashed(kind: String, at: Vector3, shard_count: int) @@ -121,7 +125,10 @@ func shatter(impulse: Vector3) -> void: var burst := 24 if is_boss else int(p["shards"]) # boss dies in a bigger cloud of juice smashed.emit(kind, global_position, burst) _release_supported() # drop what I was holding up BEFORE I leave the tree — the cascade - if fractured_scene != null: + # produce bursts rather than shattering; Main routes it to Splat off `smashed` + if kind == "produce": + pass + elif fractured_scene != null: _spawn_chunks(impulse) # real GLB shards (Lane 2) else: _spawn_shards(int(p["shards"]), p["color"], impulse) diff --git a/game/scripts/Splat.gd b/game/scripts/Splat.gd new file mode 100644 index 0000000..ae143fe --- /dev/null +++ b/game/scripts/Splat.gd @@ -0,0 +1,215 @@ +extends Node +class_name Splat + +## Produce doesn't break. It bursts. +## +## Everything else in this game shatters into shards, which is the wrong verb entirely +## for a tomato. So `produce` gets its own death: a wet burst of pulp in the fruit's own +## colour, a puddle left on the floor that STAYS, a squelch, and a litre counter — because +## "how much juice did you make" is a far better score for a greengrocer than "how many +## objects did you destroy". +## +## Two knock-ons that make the level play itself: +## * Anything heavy enough landing on produce squashes it, so a collapsing pyramid +## crushes its own bottom layer without any special code. Knock one melon off the top +## and the pile does the rest. +## * Puddles are SLIPPERY. Make enough juice and the floor stops cooperating, which is +## a self-inflicted hazard — the more fun you have, the worse the footing gets. +## +## Godot 4.7 GDScript 2.0. + +## Litres per item, roughly by size. A watermelon is worth a lot of tomatoes. +const YIELD := { + "apple": 0.18, "orange": 0.22, "tomato": 0.12, "melon": 2.40, + "cabbage": 0.35, "banana": 0.14, "generic": 0.20, +} + +## Juice colour per item. This is the whole visual identity of the level's mess. +const JUICE := { + "apple": Color(0.86, 0.78, 0.34), + "orange": Color(0.94, 0.52, 0.08), + "tomato": Color(0.68, 0.10, 0.07), + "melon": Color(0.88, 0.24, 0.30), + "cabbage": Color(0.72, 0.82, 0.48), + "banana": Color(0.92, 0.85, 0.52), + "generic": Color(0.85, 0.55, 0.25), +} + +## A body must land at least this hard to squash what it lands on. +const CRUSH_SPEED := 2.2 +## Puddles beyond this are recycled oldest-first, so a long session stays bounded. +const MAX_PUDDLES := 90 +## How close to a puddle counts as standing in it. +const PUDDLE_R := 0.55 + +var litres := 0.0 +var squashed := 0 + +var _host: Node3D +var _player: Node3D +var _puddles: Array = [] # [{node, pos, r}] +var _snd: Array[AudioStreamWAV] = [] +var _players: Array[AudioStreamPlayer3D] = [] +var _next_player := 0 + +func setup(host: Node3D, player: Node3D) -> void: + _host = host + _player = player + for i in 3: + _snd.append(_squelch(0.9 + i * 0.15)) + # a small pool, because a collapsing pyramid squashes a dozen things in one frame + for i in 8: + var p := AudioStreamPlayer3D.new() + p.unit_size = 5.0 + p.max_db = 2.0 + host.add_child(p) + _players.append(p) + +func reset() -> void: + litres = 0.0 + squashed = 0 + for e in _puddles: + var n = e["node"] + if is_instance_valid(n): + n.queue_free() + _puddles.clear() + +## Which produce is this? Derived from the node name, which Main sets from the GLB +## filename (`produce-apple` -> `apple`). +static func kind_of(n: Node) -> String: + var s := String(n.name).to_lower() + for k in YIELD.keys(): + if s.contains(k): + return k + return "generic" + +# ---------------------------------------------------------------- the burst +## Called instead of the usual shard spawn when a `produce` Smashable dies. +func burst(at: Vector3, item: String, host: Node3D) -> void: + var col: Color = JUICE.get(item, JUICE["generic"]) + var vol: float = YIELD.get(item, YIELD["generic"]) + litres += vol + squashed += 1 + _pulp(at, col, host, vol) + _puddle(at, col, vol) + _squelch_at(at) + +func _pulp(at: Vector3, col: Color, host: Node3D, vol: float) -> void: + var p := GPUParticles3D.new() + p.one_shot = true + p.explosiveness = 1.0 + p.amount = clampi(int(28 + vol * 40.0), 24, 140) + p.lifetime = 1.5 + p.local_coords = false + var pm := ParticleProcessMaterial.new() + pm.emission_shape = ParticleProcessMaterial.EMISSION_SHAPE_SPHERE + pm.emission_sphere_radius = 0.05 + pm.direction = Vector3(0, 1, 0) + pm.spread = 80.0 + pm.initial_velocity_min = 1.4 + pm.initial_velocity_max = 4.6 + vol + pm.gravity = Vector3(0, -12.0, 0) + pm.scale_min = 0.5 + pm.scale_max = 1.6 + pm.angular_velocity_min = -500.0 + pm.angular_velocity_max = 500.0 + p.process_material = pm + var mesh := BoxMesh.new() + mesh.size = Vector3(0.028, 0.028, 0.028) + var mat := StandardMaterial3D.new() + mat.albedo_color = col + mat.roughness = 0.35 + mesh.material = mat + p.draw_pass_1 = mesh + host.add_child(p) + p.global_position = at + p.emitting = true + p.finished.connect(p.queue_free) + +## A flat quad on the floor. Not a decal projector — this is one unshaded quad slightly +## above the carpet, which is cheap, and at grazing angles it reads exactly the same. +func _puddle(at: Vector3, col: Color, vol: float) -> void: + var r := clampf(0.22 + vol * 0.30, 0.22, 0.95) + var mi := MeshInstance3D.new() + var q := QuadMesh.new() + q.size = Vector2(r * 2.0, r * 2.0) + mi.mesh = q + var m := StandardMaterial3D.new() + m.albedo_color = Color(col.r, col.g, col.b, 0.72) + m.transparency = BaseMaterial3D.TRANSPARENCY_ALPHA + m.shading_mode = BaseMaterial3D.SHADING_MODE_UNSHADED + m.cull_mode = BaseMaterial3D.CULL_DISABLED + m.render_priority = -1 + mi.material_override = m + mi.cast_shadow = GeometryInstance3D.SHADOW_CASTING_SETTING_OFF + _host.add_child(mi) + mi.global_position = Vector3(at.x, 0.012, at.z) + mi.rotation = Vector3(-PI * 0.5, randf_range(0.0, TAU), 0.0) + _puddles.append({"node": mi, "pos": mi.global_position, "r": r}) + while _puddles.size() > MAX_PUDDLES: + var old = _puddles.pop_front() + if is_instance_valid(old["node"]): + old["node"].queue_free() + +func _squelch_at(at: Vector3) -> void: + if _players.is_empty(): + return + var p := _players[_next_player] + _next_player = (_next_player + 1) % _players.size() + p.stream = _snd[randi() % _snd.size()] + p.pitch_scale = randf_range(0.86, 1.18) + p.global_position = at + p.play() + +# ---------------------------------------------------------------- slipping +## How slippery the ground is under the player, 0..1. Player reads this to cut its +## acceleration — the more juice you've made, the less the floor cooperates. +func slip_under_player() -> float: + if _player == null: + return 0.0 + var here := _player.global_position + var worst := 0.0 + for e in _puddles: + var p: Vector3 = e["pos"] + var d := Vector2(here.x - p.x, here.z - p.z).length() + var reach: float = float(e["r"]) + PUDDLE_R * 0.5 + if d < reach: + worst = maxf(worst, 1.0 - d / reach) + return worst + +func hud_line() -> String: + if squashed <= 0: + return "" + var slip := slip_under_player() + return "%.1f litres · %d squashed%s" % [ + litres, squashed, " · SLIPPERY" if slip > 0.35 else ""] + +# ---------------------------------------------------------------- audio +## Wet, short, and low. Noise through a falling low-pass, roughly. +func _squelch(pitch: float) -> AudioStreamWAV: + var rate := 22050 + var dur := 0.30 + var n := int(rate * dur) + var out := PackedFloat32Array() + out.resize(n) + var lp := 0.0 + for i in n: + var t := float(i) / float(rate) + var env := exp(-t * 14.0) * (1.0 - exp(-t * 200.0)) + var raw := (randf() * 2.0 - 1.0) + # sweep the filter closed so it goes from a splat to a glop + var k := clampf(0.55 - t * 1.4, 0.06, 0.55) + lp += (raw - lp) * k + var s := lp * 1.5 * env + s += sin(TAU * 120.0 * pitch * t) * 0.22 * env + out[i] = clampf(s, -1.0, 1.0) + var w := AudioStreamWAV.new() + w.format = AudioStreamWAV.FORMAT_16_BITS + w.mix_rate = rate + w.stereo = false + var b := PackedByteArray() + b.resize(n * 2) + for i in n: + b.encode_s16(i * 2, int(out[i] * 32767.0)) + w.data = b + return w diff --git a/game/scripts/Splat.gd.uid b/game/scripts/Splat.gd.uid new file mode 100644 index 0000000..9978edb --- /dev/null +++ b/game/scripts/Splat.gd.uid @@ -0,0 +1 @@ +uid://bal2sx0f4h75a diff --git a/tools/gen_produce.py b/tools/gen_produce.py new file mode 100644 index 0000000..385e26d --- /dev/null +++ b/tools/gen_produce.py @@ -0,0 +1,353 @@ +"""The greengrocer's stock. + + /Applications/Blender.app/Contents/MacOS/Blender --background \ + --python tools/gen_produce.py -- [--render] + +ORIGIN RULE, and it differs from every other prop in this repo: round produce is +CENTRED, not floor-centred. These things are meant to roll, and a rolling body whose +origin sits on the floor plane wobbles like a loaded die. Everything else here (crates, +bottles, the banana bunch) keeps the usual floor-centre origin, and Main knows which is +which from the level spec. + +Deliberately a bit under-detailed: these spawn in pyramids of thirty, so the budget goes +on silhouette and colour rather than on a nice stem. +""" + +import bpy +import math +import os +import sys +from mathutils import Vector, Matrix + +OUT_DIR = os.path.join( + os.path.dirname(os.path.dirname(os.path.abspath(__file__))), + "game", "assets", "store") +PREVIEW_DIR = os.path.join(os.path.dirname(os.path.abspath(__file__)), "previews") +RENDER = "--render" in sys.argv + + +def reset(): + bpy.ops.wm.read_factory_settings(use_empty=True) + + +def mat(name, color, rough=0.55, metal=0.0, alpha=1.0): + m = bpy.data.materials.new(name) + m.use_nodes = True + b = m.node_tree.nodes["Principled BSDF"] + b.inputs["Base Color"].default_value = (color[0], color[1], color[2], alpha) + b.inputs["Roughness"].default_value = rough + b.inputs["Metallic"].default_value = metal + if alpha < 1.0: + b.inputs["Alpha"].default_value = alpha + m.blend_method = 'BLEND' + return m + + +def assign(o, m): + o.data.materials.clear() + o.data.materials.append(m) + return o + + +def box(size, loc=(0, 0, 0), rot=(0, 0, 0)): + bpy.ops.mesh.primitive_cube_add(size=1.0, location=loc, rotation=rot) + o = bpy.context.active_object + o.scale = (size[0], size[1], size[2]) + bpy.ops.object.transform_apply(scale=True) + return o + + +def cyl(r, depth, loc=(0, 0, 0), rot=(0, 0, 0), verts=16, r2=None): + if r2 is None: + bpy.ops.mesh.primitive_cylinder_add(radius=r, depth=depth, vertices=verts, + location=loc, rotation=rot) + else: + bpy.ops.mesh.primitive_cone_add(radius1=r, radius2=r2, depth=depth, + vertices=verts, location=loc, rotation=rot) + return bpy.context.active_object + + +def ball(r, loc=(0, 0, 0), segs=20, rings=12): + bpy.ops.mesh.primitive_uv_sphere_add(radius=r, segments=segs, ring_count=rings, + location=loc) + return bpy.context.active_object + + +def bevel(o, width=0.005, segments=2): + m = o.modifiers.new("bevel", "BEVEL") + m.width = width + m.segments = segments + m.limit_method = 'ANGLE' + m.angle_limit = math.radians(40) + bpy.context.view_layer.objects.active = o + try: + bpy.ops.object.modifier_apply(modifier=m.name) + except Exception: + o.modifiers.remove(m) + return o + + +def smooth(o, angle=45.0): + bpy.context.view_layer.objects.active = o + o.select_set(True) + try: + bpy.ops.object.shade_auto_smooth(angle=math.radians(angle)) + except Exception: + bpy.ops.object.shade_smooth() + o.select_set(False) + + +def span(r0, r1, p0, p1, verts=8): + p0, p1 = Vector(p0), Vector(p1) + d = p1 - p0 + n = d.length + if n < 1e-6: + return None + o = cyl(r0, n, verts=verts, r2=r1) + q = Vector((0, 0, 1)).rotation_difference(d.normalized()) + o.matrix_world = Matrix.Translation(p0 + d * 0.5) @ q.to_matrix().to_4x4() + bpy.ops.object.transform_apply(location=True, rotation=True) + return o + + +# ---------------------------------------------------------------- produce +# All the round ones are CENTRED on the origin so they roll properly. + +def p_apple(M): + parts = [] + b = ball(0.040, segs=18, rings=12) + b.scale = (1.0, 1.0, 0.92) + bpy.ops.object.transform_apply(scale=True) + parts.append(assign(b, M["apple"])) + # the dimple: a dark disc SUNK into the top, not a bobble sitting on it + d = ball(0.017, loc=(0, 0, 0.029), segs=12, rings=8) + d.scale = (1.0, 1.0, 0.34) + bpy.ops.object.transform_apply(scale=True) + parts.append(assign(d, M["apple_dark"])) + parts.append(assign(span(0.004, 0.003, Vector((0, 0, 0.032)), + Vector((0.006, 0.004, 0.062)), verts=6), M["stem"])) + return parts + + +def p_orange(M): + parts = [] + b = ball(0.037, segs=18, rings=12) + b.scale = (1.0, 1.0, 0.95) + bpy.ops.object.transform_apply(scale=True) + parts.append(assign(b, M["orange"])) + parts.append(assign(cyl(0.006, 0.004, loc=(0, 0, 0.034), verts=8), M["stem"])) + return parts + + +def p_tomato(M): + parts = [] + b = ball(0.033, segs=18, rings=12) + b.scale = (1.0, 1.0, 0.82) + bpy.ops.object.transform_apply(scale=True) + parts.append(assign(b, M["tomato"])) + # calyx: five little leaves + for i in range(5): + a = i * (math.tau / 5.0) + parts.append(assign(span(0.006, 0.002, + Vector((0, 0, 0.026)), + Vector((math.cos(a) * 0.020, math.sin(a) * 0.020, 0.030)), + verts=5), M["leaf"])) + return parts + + +def p_melon(M): + """Watermelon. Big, heavy, and the best thing in the shop to drop on other produce.""" + parts = [] + b = ball(0.145, segs=26, rings=16) + b.scale = (1.0, 1.28, 1.0) + bpy.ops.object.transform_apply(scale=True) + parts.append(assign(b, M["melon"])) + # Stripes as thin lenses through the middle, each a hair proud of the skin, so they + # read as bands wrapping the fruit. Boxes poking out radially made it look like a + # sea mine. + for i in range(7): + a = i * (math.pi / 7.0) + st = ball(0.1465, segs=26, rings=16) + st.scale = (0.115, 1.283, 1.004) + bpy.ops.object.transform_apply(scale=True) + st.rotation_euler = (0.0, 0.0, a) + bpy.ops.object.transform_apply(rotation=True) + parts.append(assign(st, M["melon_dark"])) + return parts + + +def p_cabbage(M): + parts = [] + b = ball(0.082, segs=20, rings=14) + b.scale = (1.0, 1.0, 0.88) + bpy.ops.object.transform_apply(scale=True) + parts.append(assign(b, M["cabbage"])) + # a few outer leaves, so it isn't just a green ball + for i in range(6): + a = i * (math.tau / 6.0) + lf = ball(0.052, loc=(math.cos(a) * 0.058, math.sin(a) * 0.058, -0.016), + segs=12, rings=8) + lf.scale = (1.25, 1.25, 0.42) + bpy.ops.object.transform_apply(scale=True) + parts.append(assign(lf, M["cabbage_out"])) + return parts + + +def p_banana(M): + """A hand of bananas. Floor-centred — these don't roll, they flop.""" + parts = [] + for i in range(5): + off = (i - 2) * 0.018 + pos = Vector((off, 0.0, 0.030)) + prev = pos + for seg in range(4): + a = math.radians(-38 + seg * 26) + nxt = prev + Vector((0.0, math.cos(a) * 0.042, math.sin(a) * 0.042 * 0.5)) + r = 0.016 - seg * 0.0022 + parts.append(assign(span(r, r * 0.86, prev, nxt, verts=8), M["banana"])) + prev = nxt + crown = box((0.10, 0.030, 0.026), loc=(0, -0.012, 0.030)) + parts.append(assign(bevel(crown, 0.008), M["stem"])) + return parts + + +# ---------------------------------------------------------------- fittings + +def p_bottle(M): + """Glass juice bottle. Floor-centred. Breaks like glass, not like fruit.""" + parts = [] + body = cyl(0.037, 0.185, loc=(0, 0, 0.093), verts=20) + parts.append(assign(body, M["glass"])) + juice = cyl(0.031, 0.140, loc=(0, 0, 0.076), verts=18) + parts.append(assign(juice, M["juice"])) + shoulder = cyl(0.037, 0.055, loc=(0, 0, 0.212), r2=0.017, verts=20) + parts.append(assign(shoulder, M["glass"])) + neck = cyl(0.017, 0.048, loc=(0, 0, 0.262), verts=14) + parts.append(assign(neck, M["glass"])) + cap = cyl(0.020, 0.020, loc=(0, 0, 0.294), verts=14) + parts.append(assign(cap, M["cap"])) + label = cyl(0.0385, 0.070, loc=(0, 0, 0.085), verts=20) + parts.append(assign(label, M["label"])) + return parts + + +def p_crate(M): + """Angled wooden display crate. Produce piles into it.""" + parts = [] + W, D, H, T = 0.52, 0.38, 0.15, 0.014 + parts.append(assign(box((W, T, H), loc=(0, -D / 2, H / 2)), M["crate"])) + parts.append(assign(box((W, T, H * 1.5), loc=(0, D / 2, H * 0.75)), M["crate"])) + for s in (-1, 1): + parts.append(assign(box((T, D, H * 1.2), loc=(s * W / 2, 0, H * 0.6)), M["crate"])) + for i in range(5): + parts.append(assign(box((W, D / 5 - 0.01, T), + loc=(0, -D / 2 + (i + 0.5) * D / 5, T / 2)), M["crate"])) + return parts + + +PROPS = { + "produce-apple": p_apple, + "produce-orange": p_orange, + "produce-tomato": p_tomato, + "produce-melon": p_melon, + "produce-cabbage": p_cabbage, + "produce-banana": p_banana, + "juice-bottle": p_bottle, + "produce-crate": p_crate, +} + + +def materials(): + return { + "apple": mat("apple", (0.62, 0.06, 0.07), rough=0.32), + "apple_dark": mat("apple_dark", (0.30, 0.04, 0.05), rough=0.5), + "orange": mat("orange", (0.88, 0.42, 0.05), rough=0.62), + "tomato": mat("tomato", (0.72, 0.07, 0.05), rough=0.28), + "melon": mat("melon", (0.16, 0.36, 0.12), rough=0.45), + "melon_dark": mat("melon_dark", (0.08, 0.20, 0.07), rough=0.45), + "cabbage": mat("cabbage", (0.68, 0.78, 0.48), rough=0.55), + "cabbage_out": mat("cabbage_out", (0.38, 0.58, 0.26), rough=0.62), + "banana": mat("banana", (0.90, 0.78, 0.18), rough=0.5), + "leaf": mat("leaf", (0.24, 0.44, 0.16), rough=0.7), + "stem": mat("stem", (0.34, 0.26, 0.13), rough=0.85), + "glass": mat("glass", (0.74, 0.82, 0.78), rough=0.06, alpha=0.34), + "juice": mat("juice", (0.86, 0.44, 0.06), rough=0.22), + "cap": mat("cap", (0.72, 0.70, 0.66), rough=0.3, metal=0.8), + "label": mat("label", (0.94, 0.92, 0.86), rough=0.85), + "crate": mat("crate", (0.56, 0.40, 0.22), rough=0.85), + } + + +def export(objs, name): + objs = [o for o in objs if o is not None] + bpy.ops.object.select_all(action='DESELECT') + for o in objs: + o.select_set(True) + bpy.context.view_layer.objects.active = objs[0] + path = os.path.join(OUT_DIR, name + ".glb") + bpy.ops.export_scene.gltf(filepath=path, export_format='GLB', + use_selection=True, export_apply=True, export_yup=True) + print("[produce] %-18s -> %s" % (name, os.path.basename(path))) + bpy.ops.object.select_all(action='DESELECT') + + +def render_preview(name): + scene = bpy.context.scene + engines = scene.render.bl_rna.properties['engine'].enum_items.keys() + for want in ('BLENDER_EEVEE_NEXT', 'BLENDER_EEVEE', 'BLENDER_WORKBENCH'): + if want in engines: + scene.render.engine = want + break + scene.render.resolution_x = 480 + scene.render.resolution_y = 480 + if scene.world is None: + scene.world = bpy.data.worlds.new("preview") + scene.world.use_nodes = True + bg = scene.world.node_tree.nodes.get("Background") + if bg: + bg.inputs[0].default_value = (0.10, 0.10, 0.11, 1.0) + lo = Vector((1e9,) * 3) + hi = Vector((-1e9,) * 3) + for o in scene.objects: + if o.type != 'MESH': + continue + for c in o.bound_box: + w = o.matrix_world @ Vector(c) + lo = Vector((min(lo.x, w.x), min(lo.y, w.y), min(lo.z, w.z))) + hi = Vector((max(hi.x, w.x), max(hi.y, w.y), max(hi.z, w.z))) + centre = (lo + hi) * 0.5 + radius = max((hi - lo).length * 0.5, 0.02) + dist = radius * 3.0 + d = Vector((0.62, -0.74, 0.34)).normalized() + bpy.ops.object.camera_add(location=tuple(centre + d * dist)) + cam = bpy.context.active_object + cam.data.lens = 58 + cam.rotation_mode = 'QUATERNION' + cam.rotation_quaternion = (-d).to_track_quat('-Z', 'Y') + scene.camera = cam + for off, e, s in ((Vector((1.0, -1.0, 1.1)), 60.0, 1.2), + (Vector((-1.1, -0.4, 0.3)), 18.0, 1.8)): + bpy.ops.object.light_add(type='AREA', location=tuple(centre + off * dist)) + L = bpy.context.active_object + L.data.energy = e * (dist ** 2) + L.data.size = s * radius + scene.render.filepath = os.path.join(PREVIEW_DIR, name + ".png") + bpy.ops.render.render(write_still=True) + + +def main(): + os.makedirs(OUT_DIR, exist_ok=True) + os.makedirs(PREVIEW_DIR, exist_ok=True) + for name, builder in PROPS.items(): + reset() + M = materials() + parts = builder(M) + for p in parts: + smooth(p, 45.0) + export(parts, name) + if RENDER: + render_preview(name) + print("[produce] done -> %s" % OUT_DIR) + + +main()