Every transport piece moves material at belt speed and capacity (t105)
This commit is contained in:
@@ -98,6 +98,26 @@ Details and numbers live in the code and in `docs/systems/`.
|
||||
|
||||
## Decisions
|
||||
|
||||
- **Transport matches the t45 belt (t105, 2026-10-30).** The owner approved the flat belt
|
||||
and asked for the other transport pieces to keep the same pace and flow through mixed lines.
|
||||
The flat belt stays unchanged: 30 cells/s, 30 grains/s with one layer and 90 grains/s with a
|
||||
heavy feed. Straight screws and flat filters match it. Diagonal transport uses three steps
|
||||
every eight ticks: 31.8 cells/s along its path (the integer cadence keeps four screw lanes at
|
||||
90 grains/s). Bars follow the same distance clock. This replaces the old faster diagonal
|
||||
screw/belt pace and slower bar-only screen pace.
|
||||
Downhill belts and screens carry a bed six vertical grains deep, about four grains across
|
||||
their path; the mesh holds the contact layer between steps. Screens still drop the chosen
|
||||
grains through, with those grains waiting to sift instead of riding onto the outlet belt.
|
||||
Uphill sidewalls keep real pushing pockets and rollback, with 10-grain cleats spaced eight
|
||||
face cells apart and a boot scoop reaching nine cells back. Their 96-cell push bound stays.
|
||||
Belts, filters and screws run receivers before feeders; screw mouths preserve all four lanes
|
||||
through turns and place their output into the receiving belt's bed. Rising diagonal outlets
|
||||
throw their load clear of the raised belt's lip, which otherwise spills it underneath. These join rules avoid
|
||||
squeezing a full belt into one screw lane. The measured mixed chain carries about 90 grains/s
|
||||
without growing heaps or spills. This supersedes the earlier reduced uphill/screen rates,
|
||||
six-grain cleats and screen contact-only nudges below. World generation is unchanged.
|
||||
|
||||
|
||||
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"
|
||||
|
||||
+14
-11
@@ -259,7 +259,7 @@ Exploration only: never changes grains or the random stream.
|
||||
- functions: fogAlloc, fogMark, fogSeen, fogInit, fogLook, fogRevealAround, fogRevealAll
|
||||
- variables: FOG, FOG_SENSE, FOG_SENSE_FADE, fog, FW, FH
|
||||
|
||||
### src/sim/cells.js (322 lines)
|
||||
### src/sim/cells.js (332 lines)
|
||||
Cell helpers (setCell, move, enter) and the falling-sand movement of powders, liquids and gases (simMove).
|
||||
- functions: setCell, swapCells, swapCellData, move, enter, enterFree, powderOpen, powderFall, powderSpill, avalancheMove, powder, passable, liquid, liquidSearch, gas, wakeBotPowder, simMove, moveChunk
|
||||
- variables: SORTP, SORTP_FUEL, LSTEP, LFILM, CORNER_SEAL, POWDER_FAN
|
||||
@@ -269,7 +269,7 @@ Heat: conduction, melting and freezing, reactions, fire and air, steel.
|
||||
- functions: curAir, airflowAt, alloyMix, airy, hasO2, condPair, heatPass, heatChunk, neighborDir, react, char, quench, burningNear, burn, steelCheck
|
||||
- variables: POROUS, SOIL, HOTLIQ, REACT_MIN, ALLOY
|
||||
|
||||
### src/sim/machines.js (157 lines)
|
||||
### src/sim/machines.js (179 lines)
|
||||
Machines: the power network, footprints, placing and removing machines.
|
||||
- functions: markPow, partLost, rebuildPower, netSat, evictCells, cellBuildable, machineFootprint, canPlaceMachine, addMachine, removeMachine
|
||||
- variables: nextPowerBuild
|
||||
@@ -289,7 +289,7 @@ Pipes, pumps and outlets: each joined line holds one liquid as a count, not as g
|
||||
- functions: sideOf, pipeClosedSide, pipeJoins, rebuildPipes, pipeNetOf, pipeTakeShare, faceCell, pumpDraw, outletPour, pipesTick
|
||||
- variables: PIPE_CAP, PUMP_RATE, OUTLET_RATE, PUMP_MAX_T, SIDE_V, PUMP_V, OUTLET_V, pipeNets, pipeNetAt, pipesDirty
|
||||
|
||||
### src/sim/machine-tick.js (160 lines)
|
||||
### src/sim/machine-tick.js (97 lines)
|
||||
Per-tick machine work: steam engines, fans, belts, filters, screw conveyors (machinesTick).
|
||||
- functions: engineIntake, fanBlow, machinesTick
|
||||
|
||||
@@ -298,25 +298,25 @@ Travel-directed transport ends. Precomputed probes; world/plan queries allocate
|
||||
- functions: pieceEnds, joinCandidate, endJoin, pieceJoins, endAt, joinIsDrop, joinSnap, nearMiss
|
||||
- variables: JOIN_ENDS, NO_PIECE, NEAR_MISS_VIEW
|
||||
|
||||
### src/sim/conveyors.js (215 lines)
|
||||
How belts, filters and screw conveyors move what is on or in them. What rests on a belt or filter rides along: the bottom four grains standing on the carrying surface steps one cell toward d together (belts run front of the line first, so the way ahead is clear). If a powder grain is blocked, the load above it stands still and the belt slips underneath. A filter's own material drops through it instead, unless it is already full.
|
||||
- functions: conveyorStep, carryColumn, beltDrain, launchGrain, rebuildFilters, filterCarry, carryBeltsAndFilters, setFilter, filterRun, roomFor, screwSpread, screwIntake, screwAccepts, straightScrewNext, diagonalScrewNext
|
||||
- variables: CARRY_DEPTH, filterR, filterL, filtersDirty
|
||||
### src/sim/conveyors.js (344 lines)
|
||||
How belts, filters and screw conveyors move what is on or in them. What rests on a belt or filter rides along: the bottom four grains standing on the carrying surface steps one cell toward d together (belts run front of the line first, so the way ahead is clear). If a powder grain is blocked, the load above it stands still and the belt slips underneath. A filter's own material drops through it instead, unless it is already full. Six vertical grains give a 45° face roughly the same depth across its path.
|
||||
- functions: conveyorStep, carryColumn, beltDrain, launchGrain, rebuildFilters, filterCarry, carryBeltsAndFilters, setFilter, filterRun, roomFor, screwSpread, transportBed, screwIntake, screwAccepts, straightScrewNext, diagonalScrewNext, screwCarry
|
||||
- variables: CARRY_DEPTH, SLOPE_CARRY_DEPTH, filterR, filterL, filtersDirty, screwCarryR, screwCarryL
|
||||
|
||||
### src/sim/flow.js (26 lines)
|
||||
Throughput for the info overlay (t49): how many grains each belt, filter and screw conveyor block hands on, per second of game time. Counting runs only while the overlay is on, so normal play pays one flag check per carried grain. Bars are not counted.
|
||||
- functions: setFlowCounting, flowNote, flowCross, flowSlopeUnder, flowTick
|
||||
- variables: flowOn, flowCount, flowRate
|
||||
|
||||
### src/sim/transport-status.js (38 lines)
|
||||
### src/sim/transport-status.js (39 lines)
|
||||
Local backpressure: only loaded transport that cannot advance warns after half a second.
|
||||
- functions: transportNote, transportStalled, transportClock, transportBegin, transportEnd, transportCleat, transportBar
|
||||
- variables: STALL_TICKS, transportState
|
||||
|
||||
### src/sim/slope-conveyors.js (237 lines)
|
||||
### src/sim/slope-conveyors.js (232 lines)
|
||||
Cleats are rubber ribs standing up from a sloped belt's face, one every CLEAT_SPACING face cells. Loose grains treat them as solid (cleatMask). Nothing grips the bare face: grains slide down it until a cleat stops them. Each belt step moves every cleat one face cell along the belt, and the rib pushes whatever is in its way ahead of it, so the pocket in front rides along while anything heaped above the rib is left to roll back. If a rib can't push its way, its whole run stalls. Only uphill runs have cleats: downhill, the belt carries its load like a flat one.
|
||||
- functions: ribMove, cleatFoot, ribCells, slopeUphill, slopeFaceAt, pushRow, scoop, pocketRoom, advanceCleat, slopeRunKey, slopeCleatsTick, rebuildCleatMask, expelFromRib, screenNudge, wakeCleatLoad
|
||||
- variables: CLEAT_SPACING, CLEAT_HEIGHT, CLEAT_REACH, SCREEN_NUDGE_TICKS, cleatChunks, cleatMask, cleatCells, slopePhase, ribLog
|
||||
- functions: diagonalBeat, ribMove, cleatFoot, ribCells, slopeUphill, slopeFaceAt, pushRow, scoop, pocketRoom, advanceCleat, slopeRunKey, slopeCleatsTick, rebuildCleatMask, expelFromRib, screenNudge, wakeCleatLoad
|
||||
- variables: CLEAT_SPACING, CLEAT_HEIGHT, CLEAT_REACH, cleatChunks, cleatMask, cleatCells, slopePhase, ribLog
|
||||
|
||||
### src/sim/blocks.js (268 lines)
|
||||
Building blocks: placing, integrity, removing, lines and rectangles of blocks.
|
||||
@@ -701,6 +701,7 @@ The frame loop and boot.
|
||||
- `test/t_stalls.py`: t45: real transport warnings, hover, frozen animation and recovery in both looks.
|
||||
- `test/t_stone.js`: Uses for waste rock and sand: glass bricks from a fan furnace, the Saw, the silo and builders' orders.
|
||||
- `test/t_threads.js`: Shared allocation, checkerboard independence, and real worker-count determinism.
|
||||
- `test/t_transport_balance.js`: t105: compare every direction with the unchanged t45 belt and exercise the complete line.
|
||||
- `test/t_vacuum_collapse.js`: Real nozzle cuts into settled heaps, inline and through the real Node worker pool.
|
||||
- `test/t_vacuum_collapse.py`: Vacuum cuts in the real pixel frame loop with active browser workers and hardware graphics.
|
||||
- `test/t_water.js`: Water conservation, settling, ledge pouring, boundaries, pipes and phase changes. Tall worlds keep geothermal heat out of the ponds.
|
||||
@@ -729,6 +730,7 @@ The frame loop and boot.
|
||||
- `tools/experiments/slope-flow.js`: Reproducible generous-feed throughput and settled pile angles for t42.
|
||||
- `tools/experiments/smelter.js`: Smelter design experiments, built with the same block pieces a player uses. Layout (block rows, 4x4 grains each), on flat ground at row 25: roof with a vent ........ row g-CH-1 chamber, CH blocks tall .. charge of coal + copper ore inside grate floor ............. row g = 23 (liquids pass, powders do not) ingot mold .............. row 24, sitting on the ground side walls run from the roof down past the mold. Usage: node t_smelter.js [key=value ...]
|
||||
- `tools/experiments/starter.js`: Plays a starter design the way a player would: paste the blueprint, let the bot build it from the bag, blow an even ore/coal mix inside, light it, wait, knock out the castings. Usage: node tools/experiments/starter.js [design id] [ore] [coal]
|
||||
- `tools/experiments/transport-balance.js`: t105: same belt feed, open sink, central single-grain/bar travel. Run with node.
|
||||
- `tools/experiments/worldgen.js`: World generation report: time to generate, how many cells of each material, where the bot starts, and what idle ticks and ticks after digging cost.
|
||||
- `tools/scenes/bar-lift.js`: A mold drops copper bars onto a belt, through a screw lift and onto the upper belt.
|
||||
- `tools/scenes/belt-heap.js`: A belt feeding an upward screw: sand underneath a deep heap of copper ore. Run clear-sky.js first, e.g. python3 tools/shot.py /tmp/belt-heap.png --setup tools/scenes/clear-sky.js --js "$(cat tools/scenes/belt-heap.js)" --ticks 240 --zoom 7
|
||||
@@ -739,6 +741,7 @@ The frame loop and boot.
|
||||
- `tools/scenes/slope-conveyors.js`: Loaded sidewall conveyor and screen. Use --js 'slopeScene(false)' (belt) or 'slopeScene(true)' (screen).
|
||||
- `tools/scenes/stone-uses.js`: The stone and sand machines: a half-full silo with its gate open over a belt, a stone cutter fed with rubble, and cut stone and glass brick walls. Run clear-sky.js first, e.g. python3 tools/shot.py /tmp/stone.png --setup tools/scenes/clear-sky.js --js "$(cat tools/scenes/stone-uses.js)" --ticks 240 --zoom 7
|
||||
- `tools/scenes/t-screen-joint.js`: Downhill screen whose outlet belt sits level with its last block (the jam the owner saw).
|
||||
- `tools/scenes/t105-chain.js`: Load test/fixtures/t105-transport.js first. The measured chain, running at heavy feed.
|
||||
- `tools/scenes/t33-ground.js`: Paused dug pocket: copper ore, rubble and dirt against stone, granite and dirt. Use --js "..." to set daylight or R.lens after this setup; CAM frames the pocket.
|
||||
- `tools/scenes/t35-diagonal.js`: Run after clear-sky.js: a belt takes sand from a pile, up a diagonal screw to an upper belt.
|
||||
- `tools/scenes/t35-joins.js`: Run after clear-sky.js. Paused, empty pipes make casing, flights and mouths easy to inspect.
|
||||
|
||||
@@ -345,3 +345,12 @@ and [Chromium Dawn defaults](https://dawn.googlesource.com/dawn.git/+/refs/heads
|
||||
All game pipelines use async creation during capability checking. World loading submits both
|
||||
looks before `GAME.running` becomes true. Shader and loading timings are printed by `t_gpu.py`;
|
||||
look/zoom switches must not call synchronous pipeline creation.
|
||||
|
||||
|
||||
`t105` transport checks: `node tools/experiments/transport-balance.js` prints single-grain and
|
||||
bar path speeds, normal/heavy flow for both directions of every carrier, and the heavy mixed
|
||||
chain's output, conservation and per-join load counts. It uses `test/fixtures/t105-transport.js`;
|
||||
`t_transport_balance.js` pins the belt reference and requires 89–91 grains/s through the chain.
|
||||
`t_threads.js` also compares that chain with 0/1/2/8 real workers. To photograph the same chain,
|
||||
pass the fixture followed by `tools/scenes/t105-chain.js` together as `tools/shot.py --js`
|
||||
(they must share one setup scope); use zoom 5, no lighting and a 1280×760 viewport. Check both looks when changing cleat geometry.
|
||||
|
||||
@@ -4,6 +4,22 @@ What agents have done, newest first. Add an entry for every piece of work: the d
|
||||
note or request it was for, what changed, the files touched, the tests run, and anything left
|
||||
open or not verified. Keep each entry short; the git history has the details.
|
||||
|
||||
## 2026-10-30: t105 transport matches the t45 belt (Codex)
|
||||
|
||||
- Shared diagonal cadence, six-grain vertical slope beds, taller cleat pockets and four-lane
|
||||
screw handoffs; raised outlets throw clear of the belt lip. Flat belt and worldgen unchanged.
|
||||
Full before/after table in t105: mixed chain 30.0 → 89.9 grains/s, no spills, 7216/7216 grains
|
||||
accounted for. Diagonal path pace is 31.8 versus 30 cells/s straight (integer cadence).
|
||||
- Files: sim/{cells,conveyors,items,machine-tick,machines,pieces,slope-conveyors,transport-status};
|
||||
test/{t_conveyors,t_diag_screws,t_slope_belts,t_threads,t_transport_balance,fixtures/t105-transport};
|
||||
tools/{experiments/transport-balance,scenes/t105-chain}; docs/{DESIGN,TESTING,PROJECT_MAP}, t105.
|
||||
- All 44 headless suites pass, including 91 transport checks and 0/1/2/8-worker chain equality;
|
||||
42 new checks fail on original code. Two generated-world hashes match the original revision.
|
||||
Host-GPU t_stalls.py, t_smooth.py, play.py, t_gpu_golden.py and t_screw_heat.py pass.
|
||||
- Inspected shots/t105-chain{,-smooth}.png: full pockets and beds, connected joins, clear outlet.
|
||||
Map regenerated; measured transport cost in the task report. Sandbox browser startup timed out.
|
||||
Full browser suite not run; owner playtest remains. No commit.
|
||||
|
||||
## 2026-10-29: new belts stood still until reload; golden test after t45 (Claude)
|
||||
|
||||
- Owner bug: in a world started after a long session, belts built after loading never moved
|
||||
|
||||
Reference in New Issue
Block a user