A piece added to a running sloped belt kept its own cleat phase, so at the seam a rib could start just behind another and push its pocket into it, stalling the whole run with only a few grains. Every block of a run now takes the phase of the run's lower-left block. Downhill sloped belts no longer have cleats: they carry like a flat belt (90 grains/s, was 38) and draw only the sidewall. Middle click on a sloped belt's band, where it is drawn into the empty block beside it, now picks the belt. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
475 lines
35 KiB
Markdown
475 lines
35 KiB
Markdown
# Design
|
||
|
||
What Deepgrain Foundry is meant to be, how its systems fit together, and the decisions made so
|
||
far with their reasons. Read the relevant part before changing how the game plays. When the owner
|
||
decides something new, add it under "Decisions" with the date.
|
||
|
||
## What the owner wants (stated by the owner)
|
||
|
||
- A **Sandustry-style factory and automation game**. Every cell is a fine falling-sand grain
|
||
(one or two screen pixels at normal zoom), not a Terraria-size tile. The world is a
|
||
Terraria-like side view with dark caves.
|
||
- **Strictly a factory game.** No RPG elements, no enemies, and no character items besides the
|
||
dig and build tools.
|
||
- **Real physics, and player-built machines** instead of magic converter buildings. Furnaces are
|
||
built from blocks, metal is cast in molds, and heat, air and gravity do the work. Physics
|
||
hazards (heat, molten metal) damage builds only.
|
||
- **Loose material falls; solids hold.**
|
||
- **Copy and paste of builds.** Pasting places ghosts that the bot builds from the bag.
|
||
- **Tool upgrades are earned in a satisfying, not tedious way**, not bought with arbitrary
|
||
credits. So far that means casting them: a drill bit in a Bit mold, a bigger bag in a Tank mold.
|
||
The owner wants the whole upgrade system redesigned (task t14).
|
||
- **A hovering bot that flies freely.** A limited bag that can be upgraded.
|
||
- **An economy instead of a rocket or other final goal.**
|
||
- Sell materials at the trade dock; refined goods and alloys pay more.
|
||
- Spend the money on buildings.
|
||
- Pay off the $20,000 land claim, then keep growing.
|
||
- A milestone ledger marks progress.
|
||
- **Machines run without power**, for simplicity. The power code (water wheel, shaft, steam
|
||
engine) is still there but switched off (`POWER_FREE` in `src/sim/pieces.js`). Those pieces are
|
||
hidden from the menu, and old saves keep them.
|
||
- **Look.** Not pixel art. The default is the "smooth look": a smooth, illustrated style with
|
||
soft, clay-like lighting, drawn by WebGL2. The pixel look stays as an option and is what tests
|
||
use.
|
||
- **A water cycle, not springs.** Steam rises into clouds and comes back as rain, or as snow
|
||
where it is freezing.
|
||
- **Sound.** Generated ambient music that changes with depth, and retro chiptune effects.
|
||
- **No external assets.** Everything is drawn and synthesized in code.
|
||
- **Controls and settings.** Modern keyboard and mouse, plus gamepad support, and plenty of
|
||
graphics and display settings.
|
||
- **Platform.** A web game for now, built and tested by agents locally. A Rust version may come
|
||
much later, for performance; keeping `src/sim/` free of the DOM keeps that open.
|
||
|
||
## The core loop
|
||
|
||
1. Dig with the resonance drill. Rock shatters into loose grains: rubble, ore, coal, clay, sand.
|
||
2. Vacuum up what you want (a drag takes only the material it starts on), and blow out what's in hand where you need it.
|
||
3. Build a furnace from wall blocks, with a grate floor over a mold. Charge it with ore and coal,
|
||
light it, and let the molten metal run into the mold.
|
||
4. Bars drop out of the bottom of the mold; collect them and sell them at the trade dock, or fill buyers' orders, which pay more.
|
||
5. Better bits (copper, then iron, then steel) open harder rock: granite, then basalt. Deeper
|
||
ores give tin, zinc, silver and gold, and alloys (bronze, brass) pay more.
|
||
6. Automate with belts, screw conveyors, filters, fans, pipes and machines. Pay off the claim.
|
||
|
||
## Systems in brief
|
||
|
||
Details and numbers live in the code and in `docs/systems/`.
|
||
|
||
- **World:**
|
||
- sizes 2048×1024, 3072×1280 or 4096×1536 grains;
|
||
- layers: soil, stone, granite and basalt over a magma sea;
|
||
- ores by depth:
|
||
- coal, copper and clay near the top;
|
||
- tin in the upper stone;
|
||
- iron from about a quarter of the way down;
|
||
- zinc in the middle (stone and granite);
|
||
- silver deep in the granite;
|
||
- gold deepest (granite and basalt);
|
||
- ambient temperature falls with height and rises with depth.
|
||
- **Materials:** 95 material ids, counting air and a few used for built parts. Each is in a
|
||
phase: solid, powder, liquid, gas, or item (bars).
|
||
- Heat flows between cells. Things melt, freeze, boil, burn and react.
|
||
- Fire needs air: a buried fire chokes, and a fan blowing in makes it hotter.
|
||
- Coal burns at about 1350°C in still air and about 2000°C with a fan.
|
||
- **Drill:** see `docs/systems/dig-tools.md`. Pulse widths, tuning to one material, hardness by
|
||
bit tier.
|
||
- **Building:** a 4×4-grain block grid.
|
||
- Blocks: walls of any of several materials, belts, screw conveyors, filters, grates, gates,
|
||
pipes, pumps, outlets.
|
||
- Machines: fan, Refiner, Stone cutter, Silo.
|
||
- Molds: ingot, bit, tank. Ingot bars drop out of the bottom onto whatever is under the mold;
|
||
leave one open block below and a belt under that carries them off. Ingot molds empty themselves:
|
||
junk and mixed scrap drop below, slag is thrown away and the grate above is raked. Short stubs
|
||
stay for the next firing. Removing any mold returns its set metal to the bag: whole bars as
|
||
bars, the rest as scrap.
|
||
- Build actions: drag for lines, Shift-drag for rectangles, hold G to replace, hold C / X and
|
||
drag to copy / cut, V to paste, Ctrl+Z to undo, middle mouse to pick,
|
||
Shift+Q/E to switch build tabs.
|
||
- **Economy:**
|
||
- The trade dock pays for anything dropped through its grate, at the market price.
|
||
- Prices dip when you sell a lot of one thing and recover over minutes.
|
||
- Up to 3 orders at a time pay well over market. Builders' orders want bulk rubble, gravel,
|
||
sand or stone bricks.
|
||
- You start with $250 and $20,000 of claim debt.
|
||
- **Weather:** steam in the open sky becomes clouds. They drift and rain, or snow when cold.
|
||
The world's water is counted, so rain only returns what evaporated.
|
||
- **Waste rock and liquids:** see `docs/systems/stone-and-liquids.md`. It covers the Refiner,
|
||
pipes, the silo, glass bricks, the stone cutter and builders' orders.
|
||
|
||
## Decisions
|
||
|
||
The newest are at the bottom. The dates are when the decision was made or built.
|
||
|
||
**Up to 2026-10-19** (early design, stated by the owner): everything in "What the owner wants"
|
||
above, including:
|
||
- the economy replacing a rocket goal;
|
||
- machines without power;
|
||
- the smooth illustrated look;
|
||
- the water cycle instead of springs;
|
||
- testing in the pixel look unless graphics are being checked.
|
||
|
||
**2026-10-19 / 20, dig tools.** The resonance drill replaced the old drill. See
|
||
`docs/systems/dig-tools.md`.
|
||
|
||
**2026-10-22:**
|
||
- **Rock too hard for your bit never crumbles, however small.** Crumbling it to ore would give ore
|
||
without the right bit and confuse players. Crumbling it to stone would lose ore. Instead, world
|
||
generation makes no tiny hard specks: pieces of 30 grains or fewer become the rock around them,
|
||
and older saves are cleaned once on load. Iron and zinc veins are fewer and chunkier, with the
|
||
same total ore.
|
||
- Belts and filters next to each other look like one belt. Belt ends are square with rounded
|
||
corners.
|
||
- Dragging belts or filters sets their direction from the drag. R sets it when placing without
|
||
dragging. An arrow shows the direction while dragging, and the selection card names it.
|
||
- **Copy and cut** are held keys, not a tool. Hold C or X and drag a box; it acts on release.
|
||
Copy and cut look different. Cut is destructive, but it can be pasted back or undone.
|
||
- **Ctrl+Z undoes building** (up to 80 steps). The bot building ghosts is never a step of its own.
|
||
- **Holding Ctrl** while placing replaces what is built there (moved to G on 2026-10-23).
|
||
- **Fans melt like copper (1085°C).** Put the fan outside the furnace, blowing in through a grate.
|
||
The game warns when a fan gets close to melting.
|
||
- **The vacuum takes only marked materials** once any are marked, even if the drag starts on
|
||
something else. The t6 controls below replace the shared ticks; t16 replaces t6's modes; t20
|
||
replaces the marks with pick-what-you-click.
|
||
- **The Refiner** grinds stone, granite and basalt rubble, gravel, sand and dirt for trace ore,
|
||
roughly halving the waste. Ore and anything else it cannot grind drop straight through.
|
||
- **Pipes, pumps and outlets** move liquids up to 500°C, one liquid per line. A line is stored as
|
||
a count, not simulated grains. Water in pipes counts toward the world's water, so the weather
|
||
does not replace it.
|
||
|
||
**2026-10-23:**
|
||
- **Ingot molds drop bars below automatically.** The owner reported bars being thrown into the
|
||
furnace above and wants belts underneath to carry them off. Blocked bars wait in the trough;
|
||
short stubs stay for the next firing. The mold cleans itself and rakes the grate after dropping bars or clearing junk.
|
||
- **Screw conveyors carry no more than belts:** they move every other tick. For more throughput,
|
||
build more lines.
|
||
- **A heap on a belt moves as one**, up to 96 grains deep, not just its bottom layer. If a grain is blocked,
|
||
the load above it stands still and the belt slips underneath; the top no longer slides over
|
||
a stuck bottom. Filters still let their chosen materials drop through.
|
||
- **Pick** (middle mouse) selects the piece under the cursor with its direction,
|
||
wall material and filter settings. G no longer picks, as the owner requested (it is now Replace).
|
||
- **The build menu** is a bar of tabs and icon tiles along the bottom: Structure, Moving,
|
||
Liquids, Machines, Molds. Hover a tile for its full description, cost and placement help;
|
||
gamepad players see the selected tile’s popup. While building, the top-left card describes
|
||
the build tool and shows the R/F settings, Replace, ghosts and status.
|
||
- **No length limit when dragging.** Blocks out of the bot's reach become ghosts that it builds
|
||
when it gets there.
|
||
- **Pipes are thin:** sand, water and anything else loose passes them. Pumps and outlets are
|
||
solid.
|
||
- **Uses for waste rock and sand:**
|
||
- glass bricks (sand melted with a fan furnace, cast in an Ingot mold);
|
||
- a Silo for storing one loose material, which should look like a real silo, not a magic
|
||
black hole;
|
||
- builders' orders for bulk rubble, gravel, sand and stone bricks;
|
||
- a Stone cutter that makes stone bricks, which build cut-stone walls.
|
||
- **Rubble sells for a pittance** ($0.02 a grain, gravel $0.03). Dirt still earns nothing.
|
||
- **Re-refining sand stays allowed.** Refiner sand can be refined again, even in stacked
|
||
refiners until none is left. The owner's reason: it is less profitable than making glass, so
|
||
players will do it only when they need more ore rather than more money.
|
||
- The project moved from a claude.ai artifact to local development with coding agents. It is
|
||
built from small files, with `NOTES.md` as the owner's to-do inbox (since 2026-10-24, a
|
||
kandown board in `tasks/`).
|
||
- **Replace is held G, not Ctrl.** The owner hit the browser's Ctrl+W (close tab) and Ctrl+D
|
||
(bookmark) while replacing and flying with WASD, and the game ignored WASD while Ctrl was held.
|
||
|
||
- **The build tool's top-left card describes the build tool**, like the other tools' cards:
|
||
how to place, the build keys, the R/F settings (material, direction, filter), Replace · G and
|
||
ghosts waiting. The selected piece's name, cost and description are in the menu and its hover
|
||
popup. The owner asked for a general description rather than the selected building.
|
||
- **Ingot molds need no F.** They push junk and mixed metal out of the bottom as loose grains with the bars, throw slag away and rake the grate. Removing any mold returns its set metal: whole bars as bars, the rest as scrap. The owner asked what F was for once bars dropped on their own, and chose this over keeping F for cleaning.
|
||
|
||
- **Fewer, smaller messages.** Molds show only a small percentage, red when blocked or spoiled and gold when a casting waits for F; details are in the hover panel. Bars dropping, blocked molds and set castings no longer pop up cards or toasts. Fan heat is a red marker on the fan; melted screw conveyors and machines get a short red label where they were. Status lines are one short sentence. The owner found the messages too large and too many.
|
||
|
||
- **World sounds are local.** Sounds from the world (water sizzling on hot metal or lava, and
|
||
any other event with a place) are heard around the bot, whatever the zoom: full volume within
|
||
24 grains, fading to silent at 96, panned left or right. The owner heard a constant snapping
|
||
that followed the bot in an older world but not in a new one. It was the sizzle: in the
|
||
owner's world, water that had found its way down to hot basalt and granite (480-800°C, about
|
||
500 grains below the surface) boiled about 48 times a minute, every one at full volume. The
|
||
first fix faded sounds with distance from the view; zoomed out they were still heard, so the
|
||
owner asked for a radius around the bot instead.
|
||
- **The silo has pixel art in the pixel look**, drawn grain by grain like the rest of the world;
|
||
the smooth look keeps the illustrated silo. The owner noticed it looked the same in both.
|
||
|
||
- **Screw conveyors use all their lanes.** Grains in an up or down screw conveyor shift sideways toward the
|
||
emptier lanes of the block, and grains taken in from the side go to the far lanes first. A
|
||
block-wide lift fed by a belt from the side now carries about 90% of what the belt brings
|
||
(before, only the edge lane filled: the owner saw one line on either side). Belts keep their
|
||
speed.
|
||
- **Screw conveyors carry bars**, one whole bar at a time, in line with the grains: a belt pushes a
|
||
bar into a screw conveyor's side, it rides through corners and leaves the mouth. The owner asked how bars
|
||
should be moved and chose screw conveyors over a separate bar lift.
|
||
- **Several worlds are kept.** Each world has its own save and autosave; the title screen's Worlds
|
||
list loads, renames and deletes them, and a new or imported world never overwrites another. An
|
||
old single save becomes 'World 1'. The owner asked for multiple saves.
|
||
|
||
**2026-10-24:**
|
||
- **The to-do list is a kandown board.** `NOTES.md` became one task file per note in
|
||
`tasks/` (Todo for tasks, Backlog for discussions and ideas, Review for "done, please check").
|
||
The owner wanted a task tool built for AI agents.
|
||
- **Wall and mold materials have a menu (F).** It lists every wall material with what you have,
|
||
the cost and the heat it stands; R still cycles. The owner chose F to match the filter menu.
|
||
- **The camera's drift toward the pointer is a setting** ("Camera looks toward the pointer", on
|
||
by default). The owner doesn't like it.
|
||
- **Fog of war reveals by line of sight.** Unexplored ground is black with a soft edge; the sky
|
||
and the surface start seen. The owner chose line of sight over a plain circle around the bot.
|
||
- **Bars pile neatly, and a Bar rack stores them (t1).** Bars that come to rest snap to a tidy
|
||
brick pattern so piles have no air gaps; a Bar rack machine (the Silo for bars) takes them from
|
||
a belt or screw conveyor, counts them and lets them out with F. The owner wanted bar storage that doesn't
|
||
waste space, like stacked ingots in real life.
|
||
As built: a resting bar snaps to a 2-grain grid, and one with fewer than 2 of its 4 bottom cells
|
||
supported tips into the gap beside it. Storage became Rack blocks rather than a machine, like
|
||
the t4 hoppers: 50 bars of any kind per block, a column is one rack; bars landing on top go in
|
||
(into the lowest block with room), F opens the gate at the bottom of the column, and bars come
|
||
out oldest first, one every 20 ticks, onto whatever is below. Taking a block back returns its
|
||
bars.
|
||
- **Hopper blocks replace hopper machines (t4).** 1-block Grinder and Saw blocks each work what
|
||
lands on them and drop it below, so a wider row is a wider, faster hopper. The Refiner and Stone
|
||
cutter leave the build menu; built ones in old saves keep working. The owner wanted hoppers of
|
||
any width.
|
||
As built: a block is solid and works the grains resting on its top edge; results drop out of
|
||
its bottom, and it stops when that space is full. Same speed and price per width as the old
|
||
machines (Grinder 0.25 grains/tick, $60; Saw 0.5, $90). In a vertical stack only the top block
|
||
takes input and the result passes down through the rest, so a Saw on a Grinder cuts stone and
|
||
grinds everything else. Partial brick counts are not saved.
|
||
After the owner played it: the Refiner and Stone cutter code is gone (an old save that still has
|
||
one loads without it and refunds its price). Grinders draw as a pair of grinding wheels and
|
||
Saws as a round blade, turning while busy. The Saw also cuts wood chunks into Planks (2 build a
|
||
wood wall). Its stone output is now called a Stone block, so that only fired clay is a brick.
|
||
Items piling up under a block stay a thing to build around (a belt or an open drop), and the
|
||
Saw's text says so.
|
||
|
||
- **A world that lasts: deep ore, rock that pays, Huge worlds, new claims (t3, 2026-10-24).**
|
||
The owner found worlds small and quickly mined out, so the only way on was a new game. Keep the
|
||
bot and drill at today's pace and add more to find instead:
|
||
- Deeper is richer: ore gets more common the deeper you dig, about 4.7x the ore in a Medium
|
||
world (coal and copper ~5x, iron, zinc and tin ~4.5-5x, silver and gold ~3.4x, kept lower for
|
||
their price). The top quarter of the underground is unchanged; copper also forms in deep stone
|
||
and granite, coal in basalt, tin deeper. Lenses grow from lower noise thresholds only:
|
||
stretching the noise with depth sheared it into diagonal streaks.
|
||
No ore is placed where the natural rock temperature would light it (coal) or melt it (metal
|
||
ores, within 200°C): deep coal and gold next to the magma burned and ran forever once a
|
||
reload woke those areas, and a Huge world dropped to about 10 fps. So deep coal stays in a
|
||
cooler mid band, and coal is about 3.2x rather than 5x; total ore about 4.2x.
|
||
- Waste rock pays: grinding granite and basalt finds about twice the ore, and builders order
|
||
granite and basalt rubble in bulk.
|
||
- A Huge size (6144 x 2048); saves are gzip-compressed (a Medium save went from 29 MB to 0.4 MB).
|
||
- New claims: once a claim is paid off, open another for $5,000 down and twice the last debt
|
||
($40,000, $80,000, ...). Money, bag, upgrades, discoveries, milestones and stats belong to the
|
||
career and come along; buildings stay on their claim and wait (they don't run) until you
|
||
travel back from the notebook's Claims page.
|
||
|
||
- **A minimap and a full map (t32, 2026-10-24).** Bottom right: a minimap around the bot with
|
||
zoom (1 to 16 grains per pixel) and a Map button; M opens the full map (wheel zoom, drag to
|
||
pan, centre on bot, markers for the bot and the dock). Both draw from one low-resolution colour
|
||
image of the world (1 pixel per 2 grains, 4 on worlds wider than 4096) that refreshes a few
|
||
32-grain areas a frame, nearest the bot first, and respects fog of war. Onboarding cards moved
|
||
to the bottom centre to make room; mute moved to Shift+M. Bigger worlds and several claims
|
||
made it easy to get lost.
|
||
|
||
- **Long waits show what's happening (t30, 2026-10-24).** Generating, loading, opening a claim
|
||
and travelling show the loading overlay with a title, a moving bar and the current step
|
||
("Laying rock and ore", "Unpacking", "Building the world"...). Generation runs as steps that
|
||
give the browser a frame every 30 ms, producing exactly the same world as before. A small
|
||
"Saving…" chip shows bottom right only when a save takes longer than 150 ms. The owner found big
|
||
worlds froze on a 0% bar with no sign of progress.
|
||
|
||
- **Clay bricks come from a Brick press (t28, 2026-10-24).** A hopper block like the Saw: every
|
||
8 clay lumps on top become a Green brick below, and a Green brick fires into a Brick above about
|
||
900°C (any fire). 2 Bricks build a brick wall block; builders order them. The owner found it odd
|
||
that clay bricks (first planned as a mold) and stone bricks would be made in different ways, and
|
||
chose a press over a heated kiln block or a mold. Loose clay still fires into brick rubble.
|
||
- **The bag is the vacuum's control panel (t6).** Each bag row has separate pick-up and blow
|
||
marks; a chip on the tool card sets pick-up to everything, only marked, or the same as the
|
||
first click; R over a grain toggles its pick-up mark. The owner found the shared ticks confusing.
|
||
As built: T or the chip cycles What I click → Only marked → Everything; adding a mark switches
|
||
to Only marked and removing the last goes back to What I click. A bag name or Q/E blows one
|
||
material; ⬆ marks build an even mix (bars are never mixed).
|
||
- **The vacuum menu replaces the modes (t16, 2026-10-24).** Pick-up has no mode: nothing marked
|
||
takes everything, anything marked takes only those, Shift takes everything for one click. F with
|
||
the Vacuum (when nothing in reach can be used) or a click on the card opens a menu with ⬇ Pick up
|
||
and ⬆ Blow toggles per material; the bag rows lose their buttons. T no longer does anything for
|
||
the vacuum. The owner found t6's version had too many modes.
|
||
Later the same day the owner added: Shift + right click blows an even mix of everything loose in
|
||
the bag; Ctrl+click a bag name adds it to the blow mix and Ctrl+right-click to pick-up; the menu
|
||
is one line per material because the first version was too large.
|
||
|
||
- **Air streaks for the nozzle (t25, 2026-10-24).** On top of the grains that fly in and out, the
|
||
owner chose air streaks: while sucking, short teal streaks swirl in toward the ring; while
|
||
blowing, amber streaks run from the bot to the cursor and spread to the brush width. Drawn only
|
||
(time-based, no random numbers, so the simulation is unchanged), only in reach, and off with
|
||
"Sparks and debris" or in unexplored fog.
|
||
|
||
- **The Vacuum is the Pneumatic nozzle (t26, 2026-10-24).** The owner's choice of name, since the
|
||
tool blows as much as it sucks. It shows as the tool card's title row, with the nozzle width as a
|
||
chip, and in the hotbar tooltip and all player text ("the nozzle" after the first mention). Code
|
||
ids and names stay `vacuum`.
|
||
|
||
- **Tool messages are toasts (t27, 2026-10-24).** Every tool's messages ("Nothing selected", "Out
|
||
of reach.", "Nothing to use there.") show as toasts at the top of the screen, and the red line in
|
||
the tool card is gone. The owner asked for it for the vacuum and chose every tool. Errors have a
|
||
red edge, info a patina one. A message that repeats every tick while a button is held keeps one
|
||
toast alive instead of stacking more.
|
||
|
||
- **Pick up what you click, blow out what's in hand (t20, 2026-10-24).** Replaces t16's pick-up
|
||
marks and the vacuum menu; the owner wanted something simpler and more intuitive. A left drag
|
||
takes only the material it starts on (or the first loose grain it reaches); Shift takes
|
||
everything. The hand is the blow selection: click a bag name or Q/E for one material, Ctrl+click
|
||
for a mix, Shift + right click for everything loose. When something in hand runs out it leaves
|
||
the hand (this settles the old t18 question), and an empty hand blows nothing and says so.
|
||
Picking something up fills an empty hand, never a chosen one. One tool, no menu; R and F do
|
||
nothing special with the Vacuum. The owner mostly uses it to collect ore and fuel and feed furnaces.
|
||
Follow-up the same day: the hand became **one selection for both** picking up and blowing out,
|
||
because there was no way to choose several materials to pick up, or ones not in the bag yet. With
|
||
anything selected, a drag takes only the selection wherever it starts; with nothing selected it
|
||
takes what you click. Holding Ctrl lists every material found so far below a "Not in bag" divider
|
||
(no menu). Selected materials stay selected when they run out, and picking up never selects
|
||
anything (both reverse the first t20 version). Clear: a button in the bag, clicking the only
|
||
selected row, or gamepad B.
|
||
Then, after playing: blowing out the last of a material deselects it again (an empty selection
|
||
goes back to picking what you click; a selection kept on an empty material got in the way). A
|
||
material selected before you have any stays selected. Ctrl + wheel scrolls the bag instead of
|
||
zooming the page, and a click while Ctrl is held adds to the selection even when the click
|
||
arrives without the Ctrl flag (seen on the owner's Linux setup).
|
||
|
||
- **Fog of war also reveals the ground around the bot (t17, 2026-10-24).** About 20 grains in every
|
||
direction, through rock, fully clear with a soft edge. Line of sight alone hid everything inside
|
||
the ground, so the owner couldn't see what was around them or where to dig.
|
||
As tuned: clear to 12 grains, fading out by 24, with a grainy edge; the owner found the first
|
||
version's narrow fade too sharp.
|
||
Unexplored ground is pure black, not dark grey (the owner: "should be black anyway").
|
||
|
||
- **Water pours faster, and boiled-off rain spreads out (t21, 2026-10-24).** The owner found water
|
||
running off a ledge slower than expected. Only the top layer of a pool flows, so pools emptied
|
||
at a trickle and the old code left 24-650 grains stranded on a wide ledge for good.
|
||
- A liquid now steps up to 8 cells a tick toward a drop instead of 1, fewer the thicker it is
|
||
(water 8, molten copper 5, slag 4, magma 2, glass 1). A grain on top may look 4 times as far
|
||
for a drop, so thin film left behind drains too. A 100-wide pool empties in about 50 s
|
||
(it never fully emptied before); settled lakes still sleep.
|
||
- Raining clouds keep drifting downwind at half pace, and rain falls over a cloud's band and the
|
||
band either side. Before, a waterfall into a shaft hot enough to boil it could rain straight
|
||
back on its own lake.
|
||
- World generation settles the land at the old water speed, so every seed keeps making the
|
||
same world.
|
||
|
||
- **Piles near the player sort, and quickly (t21, 2026-10-24).** A grain at least twice as heavy as
|
||
the powder under it sinks through it at 20 times the old pace (ore through ash: 4 rows to the
|
||
bottom in about 7 s). Before, a resting pile went to sleep and never sorted. Now areas with loose
|
||
grains within about 100 grains of the bot get a sorting chance every 8 ticks; far away, piles
|
||
still sleep. Through burning fuel sinking stays at the old slow pace: furnace beds are tuned to
|
||
it, and dirt heaped on a burning pile must smother it into charcoal rather than sink through.
|
||
|
||
- **A loaded world starts around the player first (t21, 2026-10-25).** Loading used to start every
|
||
area of the world at once, and a Huge world then took 15 ms a tick for its first 10 seconds,
|
||
with ticks up to 80 ms. Now the areas within 150 grains of the bot start at once, the rest 12 a
|
||
tick, nearest first (a Huge world is fully started after 17 s), and flying toward areas still
|
||
waiting starts them. Nothing is skipped: the same settling happens, spread out.
|
||
|
||
- **Sloped walls and diagonal wall lines (t36, 2026-10-25).** The owner wanted funnel walls that
|
||
material slides down instead of catching on block steps. A Sloped wall is a half-block triangle
|
||
with a flat 45° face, in four orientations, built of any wall material at half a wall block's
|
||
cost. Dragging walls or slopes at about 45° lays a diagonal line; for slopes the drag direction
|
||
picks the orientation (solid side below) and T flips it, or turns a single piece. Each slope
|
||
also fills one cell past its corner so a diagonal run is sealed (grains move diagonally and
|
||
would otherwise slip through where two pieces meet). Square walls placed diagonally still
|
||
touch only at corners and leak there, like any square blocks.
|
||
Later the same day the owner asked for the Wall piece itself to work diagonally, the way screw conveyors
|
||
do, so the separate Sloped wall piece left the build menu: a wall drag at about 45° lays slopes
|
||
(solid side below, T flips it during the drag), straight drags and clicks lay squares, and for a
|
||
single block T cycles square and the four corners. Slope ids are unchanged, so saves still load.
|
||
|
||
- **Diagonal screw conveyors (t35, 2026-10-25).** Screw conveyors run in eight directions. A drag at about 45°
|
||
lays a diagonal run pointing along the drag, and R cycles all eight for a single screw conveyor. Diagonal
|
||
runs carry grains at the same rate as straight ones, join straight screw conveyors and belts, and carry
|
||
bars level, a block every eight ticks. They use new part ids (11-14) because part ids are saved.
|
||
|
||
- **Sloped belts and filters (t40, 2026-10-25).** The owner asked for belts, then filters, to work
|
||
diagonally like screw conveyors and walls. A Belt or Filter drag at about 45° lays slope-shaped blocks
|
||
whose face is a running belt, carrying grains and bars up or down in the drag's direction at
|
||
flat-belt speed; the face grips its load, so nothing slides back. A sloped filter drops what it
|
||
passes out underneath and carries the rest. New block codes (19-22), so saves still load.
|
||
- **Square corners hold grains (t39, 2026-10-26).** The owner wants square wall staircases to
|
||
hold material instead of leaking through each touching corner. Powder, liquid and gas cannot
|
||
step diagonally between two solid neighbours; powder neighbours still allow free piles to
|
||
slide as before. Free flyers and diagonal screw conveyor intakes obey the same solid-corner boundary.
|
||
Screw lane transport is unchanged. World generation disables cell corner sealing while
|
||
settling loose ground, preserving existing seed layouts. This supersedes the square-wall
|
||
leakage described in the t36 decision below.
|
||
- **Silo contents are visible without opening the gate (t38, 2026-10-26).** The owner wants
|
||
contents beside the cursor anywhere over the outline and a material-coloured fill window at
|
||
every zoom in both looks, while keeping the real steel silo shape.
|
||
- **Distant drill aim is normal (t41, 2026-10-26).** The owner normally points beyond the
|
||
drill's reach and expects players to do the same. Keep the pulse colour and light crosshair,
|
||
mark the pulse's far edge, and omit distance warnings for the drill. Other tools still warn.
|
||
- **Screw conveyors (t44, 2026-10-26).** The owner chose the real machine name for screw
|
||
conveyors; code uses `screw` because `conveyor` also covers belts and filters. Transport,
|
||
numeric ids and save versions stay unchanged.
|
||
- **No backward compatibility for now (2026-10-26).** The owner will start a new world after
|
||
changes: no one is playing the game for real yet. Changes may break old saves and blueprints;
|
||
don't add migration or alias code for them (first used by the t44 rename to screw conveyors).
|
||
- **No uphill sloped filters (t43, 2026-10-26).** The owner wants sloped belts and filters to be
|
||
realistic in how they look and behave. Real sorting screens run flat or tilted downhill and
|
||
shake; none climbs a 45° slope. So filters are flat or downhill
|
||
only; to sort while lifting, run a sloped belt up, then a filter. Not built yet.
|
||
|
||
- **Conveyor drawing and sleep follow-up (t42/t43, 2026-10-26).** The owner wants visible
|
||
rubber ribs on the actual cleat raster, filled corrugated far walls behind the load, and
|
||
smooth continuous mesh with rails for inclined screens. Walls stop at the slope ends;
|
||
only loaded screens shake. Empty moving cleats must let chunks sleep. Keep pocket transport,
|
||
uphill throughput near 71 grains/s and exact sorting unchanged.
|
||
|
||
- **Sidewall belts with moving cleats (t42, 2026-10-26; physics replaced by the entry below).** To replace the old full-column
|
||
grip, use moving barrier lines rather than material cells: the barrier mask blocks normal
|
||
powder movement without overwriting grains, terrain or parts. Cleats stand perpendicular
|
||
to the face, spaced 8 horizontal face cells apart and 6 grains tall (integer normal reach
|
||
4); named constants keep these tunable. A finite periodic pocket envelope carries only
|
||
what fits, stepping every other tick. End pockets continue while the cleat rounds the band.
|
||
Between steps no grains are stamped: bare face slides and excess rolls back. Water drains;
|
||
bars stay level. Dark corrugated far walls sit behind visible grains; drawing uses the
|
||
actual barrier mask, including after save/load. The envelope is a discrete transport model,
|
||
not a calculation of contact forces. A generous flat feed delivers about 71 grains/s uphill
|
||
versus 90 flat; accepting that reduction remains the owner's playtest decision.
|
||
- **Inclined vibrating screens built (t43, 2026-10-26).** Diagonal filters always travel
|
||
downhill, even when dragged uphill. R leaves a picked slope unchanged; flipping a blueprint
|
||
mirrors its slope and keeps downhill travel. Placement and filter settings enforce the
|
||
same direction. Sloped filters have neither column carry nor grip: gravity moves grains,
|
||
with one mesh-contact nudge every 4 ticks (15 downhill steps/s plus gravity). Unselected
|
||
bars step on that same cadence; selected bars fall through. Flat filters retain their
|
||
linear transport. Sorting both slope shapes in either mode conserves the complete mix.
|
||
Both looks use a sturdy mesh frame with a small tick-based shake only while loaded;
|
||
idle mesh has no running belt animation. No old uphill-save migration was added.
|
||
|
||
- **Screw conveyors stay, in every direction (2026-10-26).** The owner asked whether screw
|
||
conveyors are still needed now that belts climb 45°, whether they're realistic, and what a
|
||
downward screw is for. Kept as they are: real plants use both (screws for steep, vertical and
|
||
enclosed runs; belts for long, cheap, high-volume ones), and a downward screw is the same
|
||
machine turning the other way, useful for letting material down at a steady rate.
|
||
- **Stalls are the player's to fix, but visible; belts carry a realistic depth (t45,
|
||
2026-10-26).** An overloaded belt line jammed against a screw conveyor above it. The owner
|
||
agreed that's realistic and stays the player's problem, but wants a warning on the stalled
|
||
belt and the animation stopped on everything affected, and belts limited to a realistic
|
||
load depth instead of carrying 96-grain stacks. Not built yet.
|
||
|
||
- **Cleats really push their pockets (t42 feedback, 2026-10-26).** The owner found the first
|
||
cleats passed through heavy loads while the material climbed as before, and wants cleats that
|
||
hold the material and drag it up. Now nothing carries the load on a slope but the ribs and a
|
||
friction drag on the layer touching the belt (which gravity beats on 45°, so loose grains slide
|
||
back until a rib holds them). Each belt step every rib moves one face cell and pushes the
|
||
grains in its way ahead of it; whatever is heaped above the rib is left to roll back. A rib
|
||
never moves into a grain, never crosses a machine, and stops short of anything built. If any
|
||
rib of a run can't push its way, the whole run stalls that step and every move is undone (the
|
||
stall t45 will show). At the foot of an uphill run, each rib coming up around the end roller
|
||
scoops what lies on the feeding belt behind it into its pocket, like a real boot section.
|
||
Measured: about 80-86 grains/s uphill under a heavy feed (flat 90); downhill about 38, since
|
||
the top only feeds a layer two grains deep onto the face.
|
||
- **No cleats on downhill belts (t42 feedback, 2026-10-26).** The owner asked why a downhill
|
||
belt has cleats: on 45° the load slides anyway. A downhill sloped belt is now a plain belt with
|
||
a sidewall that carries at belt speed like a flat one (90 grains/s); only uphill runs have
|
||
ribs. A whole run also shares one cleat phase, so pieces added later line up with it.
|
||
|
||
## Ideas not built yet
|
||
|
||
- **Concrete**, as a stronger wall material from rubble.
|
||
- **Upgrade ideas for the drill**: an amplifier, a tuning fork, harmonics. Also a Grav pick
|
||
upgrade tool and mining charges. See `docs/systems/dig-tools.md`.
|
||
- The owner's ideas for later are tasks tagged `idea` in the Backlog of the task board.
|