Compare commits
66
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
64ff8310f3 | ||
|
|
0a8847594e | ||
|
|
7fa1056e09 | ||
|
|
9937683a2c | ||
|
|
cce81e4eca | ||
|
|
9be04471ee | ||
|
|
ea1dd387b1 | ||
|
|
99d04b4972 | ||
|
|
f34c34aa73 | ||
|
|
d2eb388729 | ||
|
|
c8d397e19a | ||
|
|
945e5205b8 | ||
|
|
66543bbd4b | ||
|
|
4d5fca6dae | ||
|
|
c302b0cf42 | ||
|
|
28893c93bc | ||
|
|
282e9ce9ab | ||
|
|
06f8f90f19 | ||
|
|
9682cab6d4 | ||
|
|
c7256557bb | ||
|
|
b76f4516b7 | ||
|
|
94891db349 | ||
|
|
f4eddfb82b | ||
|
|
8d9e9c546b | ||
|
|
01403bb95e | ||
|
|
c95cc48340 | ||
|
|
67b6aba6eb | ||
|
|
196ce5ce62 | ||
|
|
d643718c48 | ||
|
|
2cf9cb843c | ||
|
|
c1a085ebb1 | ||
|
|
14194cb4be | ||
|
|
a18dcda8a4 | ||
|
|
1f56d27ded | ||
|
|
ec687b8c6c | ||
|
|
209d065f4e | ||
|
|
aa46406c92 | ||
|
|
255824ec6d | ||
|
|
cc6f98a932 | ||
|
|
152a2af6df | ||
|
|
a730a7d73c | ||
|
|
f3cedcacc8 | ||
|
|
36f82712ab | ||
|
|
41663761fb | ||
|
|
f822db8c50 | ||
|
|
11f6357c09 | ||
|
|
dc873ecb8b | ||
|
|
9df161046d | ||
|
|
9340bc132b | ||
|
|
ddfe78cf01 | ||
|
|
c50444b333 | ||
|
|
daf91891fc | ||
|
|
92f33b11c9 | ||
|
|
b70bb1f640 | ||
|
|
2b68b5d583 | ||
|
|
10911d4c86 | ||
|
|
a15af6ef9f | ||
|
|
9bbddc1e20 | ||
|
|
f953a9cc51 | ||
|
|
97c5ca4668 | ||
|
|
fec4f3bfe1 | ||
|
|
caa2463fda | ||
|
|
de677b49c5 | ||
|
|
6676d99c66 | ||
|
|
ce7df82b01 | ||
|
|
b270c4e818 |
+7
-2
@@ -6,5 +6,10 @@ node_modules/
|
||||
.DS_Store
|
||||
.venv/
|
||||
|
||||
# kandown web app: one 6.5 MB file that `kandown init` / `kandown update` regenerate
|
||||
.kandown/kandown.html
|
||||
# kept on this machine only: the kandown task board, the old notes inbox and agent instructions
|
||||
.kandown/
|
||||
tasks/
|
||||
docs/kandown.md
|
||||
NOTES.md
|
||||
CLAUDE.md
|
||||
AGENTS.md
|
||||
|
||||
@@ -1,9 +0,0 @@
|
||||
daemon.json
|
||||
daemon.lock
|
||||
.undo/
|
||||
|
||||
# Local extension state. Which extensions you enabled and which you trusted is a
|
||||
# per-machine decision, and a committed copy is ignored at load time anyway
|
||||
# (see docs/EXTENSIONS.md).
|
||||
extensions/enabled.json
|
||||
extensions/trust.json
|
||||
@@ -1,56 +0,0 @@
|
||||
# Kandown
|
||||
|
||||
File-based kanban for this project. Zero install, zero backend, plain markdown on disk.
|
||||
|
||||
## Layout
|
||||
|
||||
```
|
||||
.kandown/ # config, web UI, workflows, skills
|
||||
├── kandown.html # single-file web app — open this in your browser
|
||||
├── kandown.json # project preferences, columns, appearance
|
||||
├── kandown_work.md # optional project agent instructions
|
||||
├── workflows/ # optional local workflow packages
|
||||
├── skills/ # optional local Markdown skill packages
|
||||
└── README.md # this file
|
||||
|
||||
tasks/ # source of truth — one .md file per task
|
||||
├── t1.md
|
||||
├── t2.md
|
||||
└── archive/ # archived tasks live here
|
||||
```
|
||||
|
||||
## Usage
|
||||
|
||||
1. Open `.kandown/kandown.html` in Chrome, Edge, Brave or Opera (File System Access API required)
|
||||
2. Click **Select folder** and pick the **project root** (the parent of `.kandown/`), then grant read/write permission
|
||||
3. That's it
|
||||
|
||||
The app remembers the last 10 projects you've opened — no need to re-select the folder each time.
|
||||
|
||||
## Settings
|
||||
|
||||
Open Settings from the app header to tune this project. Board columns are stored in `.kandown/kandown.json` at `board.columns`. Each task chooses a column with its frontmatter `status`.
|
||||
|
||||
## Editing without the app
|
||||
|
||||
Everything is plain markdown. Edit files directly in your IDE, Obsidian, or vim. Click **Reload** in the app (or press `R`) to see changes.
|
||||
|
||||
The task editor includes a markdown-backed subtask checklist. Add steps with **Add subtask**, press **Enter** to insert another step, and expand a step to edit its description or report. Changes are saved back to the task file automatically.
|
||||
|
||||
## For AI agents
|
||||
|
||||
Run `kandown work` for the current agent protocol and live board context. Each task file in `tasks/` is its own source of truth. Moving a task means editing its frontmatter `status`.
|
||||
|
||||
## Keyboard shortcuts
|
||||
|
||||
| Key | Action |
|
||||
|---|---|
|
||||
| `⌘K` / `Ctrl+K` | Command palette |
|
||||
| `⌘1` / `Ctrl+1` | Board view |
|
||||
| `⌘2` / `Ctrl+2` | List view |
|
||||
| `N` | New task |
|
||||
| `R` | Reload |
|
||||
| `/` | Focus search |
|
||||
| `Esc` | Close drawer / palette |
|
||||
| `⌘S` | Save current task |
|
||||
| `⌘⌫` | Delete task (with confirmation) |
|
||||
@@ -1,74 +0,0 @@
|
||||
{
|
||||
"version": 1,
|
||||
"preferred": "claude",
|
||||
"cascade": {
|
||||
"unassignedBehavior": "skip",
|
||||
"sameSessionChain": false
|
||||
},
|
||||
"agents": [
|
||||
{
|
||||
"id": "claude",
|
||||
"name": "Claude Code",
|
||||
"bin": "claude",
|
||||
"interactive": true,
|
||||
"description": "Anthropic Claude (interactive session)",
|
||||
"aliases": ["claude", "claudecode", "anthropic", "claudeai"]
|
||||
},
|
||||
{
|
||||
"id": "codex",
|
||||
"name": "OpenAI Codex",
|
||||
"bin": "codex",
|
||||
"interactive": true,
|
||||
"description": "OpenAI Codex CLI",
|
||||
"aliases": ["codex", "openaicodex"]
|
||||
},
|
||||
{
|
||||
"id": "gemini",
|
||||
"name": "Gemini CLI",
|
||||
"bin": "gemini",
|
||||
"interactive": true,
|
||||
"description": "Google Gemini CLI",
|
||||
"aliases": ["gemini", "geminicli", "googlegemini"]
|
||||
},
|
||||
{
|
||||
"id": "goose",
|
||||
"name": "Goose",
|
||||
"bin": "goose",
|
||||
"interactive": false,
|
||||
"description": "Block open-source AI agent",
|
||||
"aliases": ["goose", "blockgoose"]
|
||||
},
|
||||
{
|
||||
"id": "aider",
|
||||
"name": "Aider",
|
||||
"bin": "aider",
|
||||
"interactive": true,
|
||||
"description": "Git-aware AI pair programmer",
|
||||
"aliases": ["aider"]
|
||||
},
|
||||
{
|
||||
"id": "opencode",
|
||||
"name": "OpenCode",
|
||||
"bin": "opencode",
|
||||
"interactive": true,
|
||||
"description": "SST AI coding TUI",
|
||||
"aliases": ["opencode", "sstopencode"]
|
||||
},
|
||||
{
|
||||
"id": "cursor",
|
||||
"name": "Cursor",
|
||||
"bin": "cursor",
|
||||
"interactive": true,
|
||||
"description": "Cursor IDE (opens project; paste prompt)",
|
||||
"aliases": ["cursor"]
|
||||
},
|
||||
{
|
||||
"id": "pi",
|
||||
"name": "Pi",
|
||||
"bin": "pi",
|
||||
"interactive": true,
|
||||
"description": "Earendil Works pi coding agent",
|
||||
"aliases": ["pi", "piearendil", "picodingagent"]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,107 +0,0 @@
|
||||
{
|
||||
"ui": {
|
||||
"language": "en",
|
||||
"theme": "dark",
|
||||
"skin": "kandown",
|
||||
"font": "inter",
|
||||
"background": "solid",
|
||||
"onboardingCompleted": true,
|
||||
"categoryChips": true
|
||||
},
|
||||
"agent": {
|
||||
"suggestFollowUp": false,
|
||||
"maxSuggestions": 3,
|
||||
"workOutput": {
|
||||
"detailMode": "complete",
|
||||
"boardDigest": {
|
||||
"showColumnCounts": true,
|
||||
"showTasks": true,
|
||||
"showPriority": true,
|
||||
"showAssignee": true,
|
||||
"showBlockedBy": true,
|
||||
"showNextActionable": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"workflow": {
|
||||
"active": "guided-feature",
|
||||
"skills": [],
|
||||
"trackingCadence": "balanced"
|
||||
},
|
||||
"board": {
|
||||
"columns": [
|
||||
"Backlog",
|
||||
"Todo",
|
||||
"In Progress",
|
||||
"Review",
|
||||
"Done"
|
||||
],
|
||||
"defaultPriority": "P3",
|
||||
"defaultOwnerType": "human",
|
||||
"columnColors": {
|
||||
"backlog": "red",
|
||||
"todo": "blue",
|
||||
"in progress": "orange",
|
||||
"review": "violet",
|
||||
"done": "yellow"
|
||||
},
|
||||
"columnMeta": {
|
||||
"Backlog": {
|
||||
"role": "backlog",
|
||||
"instructions": "Capture unscheduled work here. Keep enough context to decide whether it belongs in this workflow."
|
||||
},
|
||||
"Todo": {
|
||||
"role": "ready",
|
||||
"instructions": "Only move work here when its required inputs, acceptance criteria, dependencies, and approvals are ready."
|
||||
},
|
||||
"In Progress": {
|
||||
"role": "active",
|
||||
"instructions": "Execute the current workflow phase, update the checklist as work happens, and record blockers immediately."
|
||||
},
|
||||
"Review": {
|
||||
"role": "review",
|
||||
"instructions": "Finished work waits here for the owner to check in the game. Only the owner moves it to Done; if it isn't fixed, the owner moves it back with feedback."
|
||||
},
|
||||
"Done": {
|
||||
"role": "terminal",
|
||||
"instructions": "Only accept work whose criteria and required review are satisfied. Preserve the completion report and evidence."
|
||||
}
|
||||
},
|
||||
"stackDefaultState": "collapsed"
|
||||
},
|
||||
"tui": {
|
||||
"defaultView": "list",
|
||||
"showDetailPane": true,
|
||||
"listSort": "status",
|
||||
"listSortDir": "asc",
|
||||
"columns": {
|
||||
"age": true,
|
||||
"status": true,
|
||||
"priority": true,
|
||||
"owner": true,
|
||||
"deps": true,
|
||||
"tags": false,
|
||||
"assignee": true
|
||||
}
|
||||
},
|
||||
"fields": {
|
||||
"priority": true,
|
||||
"assignee": false,
|
||||
"tags": true,
|
||||
"dueDate": false,
|
||||
"ownerType": false,
|
||||
"tools": false
|
||||
},
|
||||
"notifications": {
|
||||
"browser": false,
|
||||
"sound": true,
|
||||
"soundId": "soft",
|
||||
"statusChanges": false,
|
||||
"taskEdits": false,
|
||||
"subtaskCompletions": true,
|
||||
"editDebounceMs": 2000
|
||||
},
|
||||
"extensions": {
|
||||
"restricted": true
|
||||
}
|
||||
}
|
||||
@@ -1,30 +0,0 @@
|
||||
## Deepgrain Foundry: working the board
|
||||
|
||||
The board is the owner's to-do list. `docs/kandown.md` explains how kandown works here.
|
||||
|
||||
- **Work on tasks only when the owner asks** ("do the next task", "do t8"). Don't pick up work
|
||||
on your own.
|
||||
- **Kinds of task.**
|
||||
- **Todo**: things to build or fix.
|
||||
- **Backlog, tagged `discussion`**: give options with trade-offs and a recommendation, in
|
||||
chat, and write nothing in code until the owner decides. Then record the decision.
|
||||
- **Backlog, tagged `idea`**: ideas for later. Leave them alone unless asked.
|
||||
- Questions get answers.
|
||||
- **Keep the owner's words.** Never rewrite or tidy text the owner wrote in a task file, and don't
|
||||
rename tasks the owner made. Add what you learn as `## Subtasks` with `report:` lines, or in
|
||||
the `report` field.
|
||||
- **Writing tasks from chat.** When you write a description, task or subtask from what the owner
|
||||
said in chat, write it fully in your own words as a clear description of what they want. Don't
|
||||
label it as the owner's, add dates, or quote them.
|
||||
- **When a task is finished**, move it to **Review** (that is "done, please check") and set the
|
||||
`report` field: what changed, and how to check it in the game. Never move a task to Done:
|
||||
the owner does that after checking it. If the owner moves it back with feedback, keep the
|
||||
feedback and work from it.
|
||||
- **Log your work.** Add an entry at the top of `docs/agent-log.md` with the date, the task id
|
||||
and title, what changed, the files touched, the tests run, and anything left open.
|
||||
- **Record decisions.** When the owner decides something about the design, add it to the
|
||||
decisions list in `docs/DESIGN.md` with the date and the reason they gave.
|
||||
- **Commit task files with the work** they describe. The owner may be editing tasks too: stage
|
||||
only the task files you changed.
|
||||
- **New tasks the owner asks for**: `kandown create "title" --to Todo` (add `-t discussion` or
|
||||
`-t idea` for Backlog), then describe the task under `## Context`.
|
||||
@@ -1,180 +0,0 @@
|
||||
# Deepgrain Foundry: instructions for coding agents
|
||||
|
||||
Deepgrain Foundry is a 2D falling-sand factory game in the style of Sandustry, set in a
|
||||
Terraria-like side-view world. Every grain of sand, ore, water and fire is simulated. The player
|
||||
flies a small bot, digs with a resonance drill, vacuums up loose material, builds furnaces,
|
||||
belts, tubes and machines from blocks, casts metal in molds and sells goods at a trade dock to
|
||||
pay off a land claim. It runs in the browser as one self-contained HTML page, built from small
|
||||
JavaScript files with no dependencies.
|
||||
|
||||
The owner (the user) directs the work and is the real playtester. You build, test and report.
|
||||
|
||||
## Start of every session
|
||||
|
||||
1. Run `kandown work`. It prints the user's task board and the rules for working it (see
|
||||
"Working from the task board" below).
|
||||
2. Read `docs/PROJECT_MAP.md` before searching the code. It says where everything lives. Its
|
||||
index lists every top-level function and variable by file.
|
||||
3. Before changing how the game plays, read the relevant part of `docs/DESIGN.md`. Many choices
|
||||
were made deliberately and are recorded there with the reason.
|
||||
4. Look at the top of `docs/agent-log.md` for what was done recently.
|
||||
|
||||
## Honesty and accuracy
|
||||
|
||||
These rules matter more than speed.
|
||||
|
||||
- **Do not guess or assume.** If you have not checked something, say so. Keep "I tested this and
|
||||
it works" separate from "this should work".
|
||||
- **Prove it with the game.** Run the tests. For anything visible, take a screenshot and look at
|
||||
it before saying it looks right (see "Testing"). A passing test only covers what it checks.
|
||||
- **Never invent names.** Look a function or variable up in the project map's index, or search
|
||||
for it (`rg name src`), before you use it or talk about it.
|
||||
- **When you are not confident, check more than one source.** Use the web for anything outside
|
||||
this repository: browser APIs, Playwright, WebGL, real-world materials and temperatures,
|
||||
physics, how other games do something. Confirm important facts with at least two independent
|
||||
sources, and give the links.
|
||||
- **Report problems plainly.** Say when a test fails, when something is only partly done, or when
|
||||
you could not reproduce a problem. Never weaken or delete a test just to make it pass. If a
|
||||
test's expectation is outdated because the design changed on purpose, update it and say why.
|
||||
- **Ask when it matters.** If a request is unclear and getting it wrong would waste a lot of work,
|
||||
ask first. If the choice is small or easy to undo, take the sensible reading, say which one you
|
||||
took, and carry on.
|
||||
|
||||
## Working from the task board
|
||||
|
||||
The user's to-do list is a kandown board: one Markdown file per task in `tasks/`. **Read
|
||||
`docs/kandown.md` before using it**: it says how the board works here, which commands are safe
|
||||
(never run `kandown <command> --help`: it runs the command), and what a task file looks like.
|
||||
The rules for working the board are in `.kandown/kandown_work.md`, and `kandown work` prints
|
||||
them. In short:
|
||||
|
||||
- Work on tasks only when asked. Todo tasks are built; Backlog tasks tagged `discussion` get
|
||||
options with trade-offs and a recommendation, and nothing is built until the user decides.
|
||||
- Never reword the user's words in a task's `## Context`. Add your notes as subtasks with
|
||||
`report:` lines, or in the `report` field.
|
||||
- When a task is finished, move it to **Review** with a `report` saying what changed and how to
|
||||
check it in the game. Only the user moves tasks to Done.
|
||||
- **Log your work.** Add an entry at the top of `docs/agent-log.md` with the date, the task,
|
||||
what changed, the files touched, the tests run, and anything left open.
|
||||
- **Record decisions.** When the user decides something about the design, add it to the
|
||||
decisions list in `docs/DESIGN.md` with the date and the reason they gave.
|
||||
|
||||
## Commands
|
||||
|
||||
```sh
|
||||
python3 build.py # build dist/index.html from src/ (takes a second)
|
||||
python3 tools/serve.py # build, serve at http://localhost:8000, rebuild on src/ changes
|
||||
python3 test/run_all.py # all headless test suites, in parallel (about a minute)
|
||||
python3 test/run_all.py pipes # only suites whose name contains "pipes"
|
||||
python3 test/run_all.py --browser # also the browser tests (rebuilds first; about 3 more minutes)
|
||||
node test/t_pipes.js # one suite
|
||||
python3 tools/shot.py shots/x.png --setup tools/scenes/clear-sky.js --js "..." --ticks 60
|
||||
python3 tools/where.py 7614 # which source line is line 7614 of dist/index.html
|
||||
python3 tools/map.py # regenerate the index in docs/PROJECT_MAP.md
|
||||
```
|
||||
|
||||
You need Node (tested with 22) and Python 3. Playwright for Python and its Chromium live in
|
||||
`.venv/` in the repo (not committed); set up as in README.md → Develop. The browser scripts and
|
||||
`tools/shot.py` switch to `.venv` by themselves (`tools/use_venv.py`), so the commands above work
|
||||
with plain `python3`.
|
||||
|
||||
## How the code is put together
|
||||
|
||||
- `build.py` joins the files listed in `src/manifest.json`, in order, into one classic script
|
||||
inside `src/shell.html`. The output is `dist/index.html`. There are no modules and no
|
||||
import/export: every file shares one global scope.
|
||||
- **Order matters only for code that runs when the page loads.** A function can call a function
|
||||
from any file. But a top-level `const`/`let` must come before top-level code that uses it. New
|
||||
files go into the manifest in the right place: simulation first, then render, then UI.
|
||||
- `'use strict'` at the top of `src/sim/base.js` applies to the whole bundle.
|
||||
- **`src/sim/` must never touch the DOM** (no `document`, `window`, canvas or `localStorage`).
|
||||
The headless tests load only these files, and keeping the simulation pure keeps a later port to
|
||||
Rust or WebAssembly possible.
|
||||
- **Keep files small and on one topic.** Aim for under about 400 lines. Split a file that grows
|
||||
past that along a clear seam, add the new file to the manifest, and rebuild. Then run
|
||||
`python3 tools/map.py` and update the hand-written part of the project map.
|
||||
- **Errors point at real files.** In Node tests, stack traces name the source file and line. In
|
||||
the browser they point into `dist/index.html`; use `tools/where.py` to find the source line
|
||||
(`tools/shot.py` does this for you).
|
||||
|
||||
## Rules for the simulation
|
||||
|
||||
- **Performance.** The simulation runs 60 ticks a second over millions of cells.
|
||||
- Use the existing typed arrays.
|
||||
- Do not allocate objects or arrays inside per-cell loops.
|
||||
- Only chunks that are awake (32×32 grains) are simulated. After changing cells directly,
|
||||
wake them; `setCell` already does.
|
||||
- Measure before and after anything in a hot path (`tools/perf.py`,
|
||||
`tools/experiments/factory_cost.js`).
|
||||
- **Determinism.** Randomness in `src/sim/` comes only from `rnd()` (seeded) or `mulberry32`.
|
||||
Never use `Math.random` there. The headless tests rely on this: the same code gives the same
|
||||
output, line for line.
|
||||
- **Save compatibility.** The user has saved worlds they care about. Material ids, block codes
|
||||
(`BP_*`), part ids (`P_*`) and machine type names are stored in saves.
|
||||
- Never renumber or reuse them. Add new ones at the end (raise `NMAT` for materials).
|
||||
- New saved fields need a default when an older save lacks them. Migrations go in
|
||||
`deserializeWorld` (`src/sim/save.js`).
|
||||
- Only raise `SAVE_VERSION` if old saves truly cannot be read any more, and tell the user first.
|
||||
- **Undo.** Every building action the player takes must be undoable. Wrap it in
|
||||
`undoRecord(label, fn)`. The functions that place and remove things record their own steps
|
||||
with `undoNote`. The bot building ghosts is never an undo step of its own.
|
||||
|
||||
## Checklists
|
||||
|
||||
**A new material.** It needs:
|
||||
- an id constant in `src/sim/materials.js` (at the end, before `NMAT`, and raise `NMAT`);
|
||||
- a `def(...)` entry with a plain description;
|
||||
- its price in `PRICE` (`src/sim/economy.js`) if it can be sold;
|
||||
- its place in `BAG_ORDER` (`src/ui/state.js`) if it can go in the bag;
|
||||
- its place in `MARKET_GROUPS` (`src/ui/notebook.js`) if it is sold;
|
||||
- any special tables it belongs to: `CASTMETAL`, `SOLIDMETAL`, `METAL_TIER`, `BAR_OF`,
|
||||
`WALL_OF`/`WALL_LIST`, `REFINE`, `HOTLIQ`, `DROSS`.
|
||||
|
||||
Check its colour in both looks.
|
||||
|
||||
**A new buildable piece.** It needs:
|
||||
- an entry in `PIECES` (`src/sim/pieces.js`) with cost and description;
|
||||
- a block code or machine footprint;
|
||||
- placing and removing that support undo and Ctrl-replace;
|
||||
- a tile in `BUILD_CATS` and an icon in `PIECE_ICONS` (`src/ui/build-menu.js`);
|
||||
- hover info (`hoverInfo` in `src/ui/info.js`);
|
||||
- drawing in `src/render/` (pixel look, and a smooth-look class if it needs one);
|
||||
- saving and loading of any state it keeps;
|
||||
- a line in the controls help (`controlsHtml` in `src/ui/notebook.js`) if it adds controls;
|
||||
- a headless test.
|
||||
|
||||
**Text the player reads** (descriptions, toasts, hover info, help):
|
||||
- plain words and short sentences;
|
||||
- what it does and how to use it;
|
||||
- °C for temperatures, "grains" for cells, "blocks" for the 4×4 build grid;
|
||||
- no programmer words.
|
||||
|
||||
Match the existing descriptions in `PIECES` and the material `def`s.
|
||||
|
||||
## Testing
|
||||
|
||||
`docs/TESTING.md` has the details: the harness, how to write a suite, the browser tests,
|
||||
screenshots and the pitfalls. The essentials:
|
||||
|
||||
- Every change to the simulation gets a headless check in a `test/t_*.js` suite. Write the
|
||||
check first when fixing a bug, and see it fail.
|
||||
- **Test in the pixel look** (the default in the tools). Use the smooth look only when checking
|
||||
graphics, and then check both looks.
|
||||
- Look at your screenshots. Open the PNG and check it shows what you meant, especially after
|
||||
changing anything drawn.
|
||||
- Before you say you are finished, run `python3 test/run_all.py`. After changing anything in
|
||||
`src/ui/` or `src/render/`, run `python3 test/run_all.py --browser` too.
|
||||
- **For a refactor** that should not change behaviour, save the suites' output before and after
|
||||
and diff them. The headless suites are deterministic, so any difference is a real change (lines
|
||||
with timings in ms excepted).
|
||||
|
||||
## Git
|
||||
|
||||
- Small commits, one change each, with a message that says what changed for the player or
|
||||
developer. Run the tests first.
|
||||
- `dist/` and `shots/` are build output and are not committed.
|
||||
- Never commit secrets: tokens, passwords, or keys.
|
||||
- Work happens one agent at a time. If running several agents side by side is set up later,
|
||||
this section will say how they coordinate.
|
||||
|
||||
This project uses Kandown. Before task work, run `kandown work` and follow its output. <!-- kandown:agent-ref -->
|
||||
@@ -1,10 +0,0 @@
|
||||
@AGENTS.md
|
||||
|
||||
## Claude Code notes
|
||||
|
||||
- To look at a screenshot, open the PNG with the Read tool. Do this every time you change
|
||||
anything drawn, and before you call it done.
|
||||
- Use WebSearch and WebFetch for anything outside this repository, per the honesty rules above.
|
||||
- Keep `docs/agent-log.md`, the task files in `tasks/` and `docs/PROJECT_MAP.md` current, as
|
||||
described above.
|
||||
They are how the next session, yours or another agent's, picks up the work.
|
||||
@@ -60,9 +60,6 @@ The source is small JavaScript files with no dependencies or bundler:
|
||||
|
||||
## Documents
|
||||
|
||||
- `AGENTS.md` / `CLAUDE.md`: how coding agents work on this project.
|
||||
- `tasks/`: the to-do list, a [kandown](https://kandown.dev) board (`kandown` opens it; see
|
||||
`docs/kandown.md`).
|
||||
- `docs/PROJECT_MAP.md`: where everything is.
|
||||
- `docs/DESIGN.md`: what the game is meant to be, and the decisions made.
|
||||
- `docs/TESTING.md`: tests, screenshots and pitfalls.
|
||||
|
||||
+2
-2
@@ -8,8 +8,8 @@ top part by hand when the structure changes.
|
||||
## Layout
|
||||
|
||||
```
|
||||
AGENTS.md, CLAUDE.md instructions for coding agents
|
||||
tasks/, .kandown/ the owner's to-do list: a kandown board (docs/kandown.md)
|
||||
AGENTS.md, CLAUDE.md instructions for coding agents (local only, not in git)
|
||||
tasks/, .kandown/ the owner's to-do list: a kandown board (docs/kandown.md; local only, not in git)
|
||||
build.py joins src/ into dist/index.html (one self-contained page)
|
||||
src/manifest.json the build order: simulation files, then browser files
|
||||
src/shell.html page markup (HUD, menus, dialogs); CSS and JS are put in at the markers
|
||||
|
||||
-107
@@ -1,107 +0,0 @@
|
||||
# kandown: the task board
|
||||
|
||||
The owner's to-do list is a [kandown](https://kandown.dev) board: one Markdown file per task in
|
||||
`tasks/`, with settings in `.kandown/`. It replaced `NOTES.md` on 2026-10-24. This page records
|
||||
how it works here, as checked on kandown 0.52.0. The full upstream documentation is one file at
|
||||
https://kandown.dev/llms-full.txt (any docs page also works with `.md` added to its URL).
|
||||
|
||||
## Start of a session
|
||||
|
||||
```sh
|
||||
kandown work # the rules, our project instructions and the board, as Markdown (~1,900 tokens
|
||||
# with 14 tasks)
|
||||
kandown work t8 # the same, focused on one task
|
||||
```
|
||||
|
||||
Our project rules are in `.kandown/kandown_work.md`; `kandown work` includes them under
|
||||
"Project Instructions". `AGENTS.md` ends with the one-line pointer `kandown init` added; keep it.
|
||||
|
||||
## Columns
|
||||
|
||||
| Column | Role | What goes here |
|
||||
|---|---|---|
|
||||
| Backlog | backlog | Discussion notes (tag `discussion`) and ideas for later (tag `idea`) |
|
||||
| Todo | ready | The owner's tasks |
|
||||
| In Progress | active | What an agent is working on now |
|
||||
| Review | review | Finished work waiting for the owner to check in the game ("done, please check") |
|
||||
| Done | terminal | Checked by the owner. Only the owner moves tasks here |
|
||||
|
||||
## Commands
|
||||
|
||||
Task commands work offline and print data only on stdout (messages go to stderr), so they are
|
||||
safe to capture. Set `KANDOWN_NO_UPDATE=1` in scripts.
|
||||
|
||||
```sh
|
||||
kandown list # the board as a table; --json for data (no report field in it)
|
||||
kandown show t8 # one task file as it is on disk
|
||||
ID=$(kandown create "Title" --to Todo -t discussion) # prints only the new id, e.g. t15
|
||||
kandown move t8 "In Progress" # quote column names with spaces; "archived" archives
|
||||
kandown doctor # checks kandown.json and every task's frontmatter
|
||||
kandown # the owner's board: web page plus terminal UI (starts a daemon)
|
||||
kandown daemon stop # stop that daemon
|
||||
```
|
||||
|
||||
- **`--help` is not safe.** `kandown init --help` ignored the flag and ran `init` in the current
|
||||
folder, which also started a daemon. Use `kandown help` or the docs, never `<command> --help`.
|
||||
- `kandown init` starts the web daemon unless given `--no-open`. With an existing empty `tasks/`
|
||||
it created no sample tasks.
|
||||
- `kandown create` names the file from the id and the title: `tasks/t8_fog_war_unexplored.md`.
|
||||
Find it with `tasks/<id>_*.md`; don't rename it.
|
||||
- `kandown create` has no body option: write the body into the file after creating it.
|
||||
- `depends_on` blocks a move to Done until the listed tasks are done.
|
||||
- **Descriptions typed on the web board can be lost.** On 2026-10-24 the owner created t16–t19
|
||||
on the web board with descriptions; the files were saved with a title and no body. The owner
|
||||
believes it is a bug in the web daemon (not investigated). A task with only a title may have
|
||||
had a description: ask the owner, then write their words under `## Context` yourself.
|
||||
|
||||
## A task file
|
||||
|
||||
```markdown
|
||||
---
|
||||
id: t8
|
||||
title: Fog of war for unexplored areas
|
||||
status: Review
|
||||
created: 2026-10-24
|
||||
updated: 2026-10-24T04:41:46Z
|
||||
tags: [discussion]
|
||||
report: |
|
||||
(agent) What changed, in a few lines.
|
||||
To check: how the owner sees it in the game.
|
||||
---
|
||||
|
||||
## Context
|
||||
|
||||
- The owner's note, word for word.
|
||||
|
||||
## Subtasks
|
||||
|
||||
- [x] A step
|
||||
report: What actually happened.
|
||||
```
|
||||
|
||||
- Only `id`, `title` and `status` are required. Unknown keys are kept.
|
||||
- **`report`** is the completion summary the board shows prominently. A multi-line `report: |`
|
||||
block works (kandown's parser reads block scalars); `kandown doctor` accepts it.
|
||||
- `## Context` holds why the task exists: here, the owner's own words. `## Subtasks` is a
|
||||
checklist whose items can carry a `report:` line.
|
||||
- Editing files directly is supported; the board notices changes. Run `kandown doctor` after.
|
||||
|
||||
## Files
|
||||
|
||||
| Path | Committed | What it is |
|
||||
|---|---|---|
|
||||
| `tasks/*.md`, `tasks/archive/` | yes | The tasks; the folder is the whole state, no index |
|
||||
| `.kandown/kandown.json` | yes | Columns, column instructions, workflow, which fields show |
|
||||
| `.kandown/kandown_work.md` | yes | Our project rules for agents |
|
||||
| `.kandown/agents.json`, `README.md`, `.gitignore` | yes | Written by `kandown init` |
|
||||
| `.kandown/kandown.html` | no (`.gitignore`) | The 6.5 MB web app; `kandown init` / `kandown update` rebuild it |
|
||||
| `.kandown/daemon.json` | no (`.kandown/.gitignore`) | The running daemon's port and access token |
|
||||
|
||||
## Codex and kandown
|
||||
|
||||
`kandown list` and `kandown doctor` were checked inside Codex's `workspace-write` sandbox and
|
||||
work; the other task commands also only read and write files in the repo. Not checked under
|
||||
Codex: the web daemon (`kandown`
|
||||
with no command), which serves a page on a local port. Codex's `workspace-write` sandbox blocks
|
||||
network sockets (it is why headless Chrome crashed under Codex until runs passed
|
||||
`-c sandbox_workspace_write.network_access=true`).
|
||||
@@ -1,14 +0,0 @@
|
||||
---
|
||||
id: t12
|
||||
title: Exotic and sci-fi ores for late game
|
||||
status: Backlog
|
||||
created: 2026-10-24
|
||||
updated: 2026-10-24T23:27:52Z
|
||||
tags: [idea]
|
||||
order: 0
|
||||
archived: true
|
||||
---
|
||||
|
||||
## Context
|
||||
|
||||
- we can add more exotic/sci-fi ish ores and materials for more late game.
|
||||
@@ -1,19 +0,0 @@
|
||||
---
|
||||
id: t24
|
||||
status: Backlog
|
||||
order: 4
|
||||
priority: P3
|
||||
created: 2026-10-24
|
||||
updated: 2026-10-24T23:27:52Z
|
||||
title: Water Fixes
|
||||
archived: true
|
||||
---
|
||||
|
||||
# Context
|
||||
|
||||
Water never seems to run out in certain conditions when its running off the edge. maybe it actually does but it takes a while and i just didnt notice. Please do a full test suite of water physics and make sure it asks as it should in all conditions.
|
||||
|
||||
## Subtasks
|
||||
|
||||
- [ ] water physics fixes
|
||||
- [ ]
|
||||
@@ -1,19 +0,0 @@
|
||||
---
|
||||
id: t31
|
||||
title: Choose between several claims and sizes when opening a new claim
|
||||
status: Backlog
|
||||
created: 2026-10-24
|
||||
updated: 2026-10-24T23:27:52Z
|
||||
order: 6
|
||||
archived: true
|
||||
---
|
||||
|
||||
## Context
|
||||
|
||||
- Opening a new claim today always gives a random world the same size as the current one. Instead, offer a few claims to choose from, each with its own size and character: different ores, features and terrain, so every new claim feels distinct and worth picking. This builds on t13 (world generation options and planet presets) and is best done after it, using its options to make the claims differ.
|
||||
|
||||
## Subtasks
|
||||
|
||||
- [ ] When opening a new claim, offer a short list of claims to pick from (for example three), each showing its size, price and what makes it special
|
||||
- [ ] Claims differ in world generation: richer or rarer ores, unusual features, different terrain, using the t13 options
|
||||
- [ ] Each offered claim has its own down payment and debt to match its size and riches
|
||||
@@ -1,17 +0,0 @@
|
||||
---
|
||||
id: t10
|
||||
title: World name box for a new world
|
||||
status: Done
|
||||
created: 2026-10-24
|
||||
updated: 2026-10-24T23:25:51Z
|
||||
order: 4
|
||||
report: |
|
||||
(agent) The New world panel now has a Name box above Seed. It starts filled with the next
|
||||
"World N" and selected, so you can type over it; leave it empty to get "World N". Enter in
|
||||
the Name or Seed box starts the world. The name shows in the Worlds list and the pause menu.
|
||||
To check: title > New world, type a name, Enter. Pause (Esc) shows the name at the top.
|
||||
---
|
||||
|
||||
## Context
|
||||
|
||||
- add world name edit box to new world.
|
||||
@@ -1,18 +0,0 @@
|
||||
---
|
||||
id: t11
|
||||
title: Welcome and first milestone shown again on an older world
|
||||
status: Done
|
||||
created: 2026-10-24
|
||||
updated: 2026-10-24T23:25:51Z
|
||||
tags: [bug]
|
||||
order: 5
|
||||
report: |
|
||||
(agent) Fixed: loading a world now clears the cards in the lower right, so cards from the
|
||||
world you were just in (Welcome, first milestone) no longer carry over.
|
||||
To check: make a new world, quit to the title, load an older world from Worlds. No Welcome
|
||||
or milestone card should show. A brand-new world still shows its Welcome card.
|
||||
---
|
||||
|
||||
## Context
|
||||
|
||||
- when making a new world then going back to tile and selecting a previously created world. the bottom right welcome and first milestone messages are still shown after loading the older world where you have already completed those.
|
||||
@@ -1,21 +0,0 @@
|
||||
---
|
||||
id: t13
|
||||
title: Distinct worlds: generation options, planet presets, exotic ores and a choice of claims
|
||||
status: Backlog
|
||||
created: 2026-10-24
|
||||
updated: 2026-10-24T23:55:44Z
|
||||
tags: [idea]
|
||||
order: 0
|
||||
---
|
||||
|
||||
## Context
|
||||
|
||||
- Every world is generated the same way today, and a new claim is just another random world the same size as the last. Make worlds and claims feel distinct: options when generating a world, planet presets that change how a world looks and what is in it, exotic late-game ores that only some worlds have, and a choice of claims to open, each with its own size, character and price. (Merged from t12 exotic ores and t31 choosing claims.)
|
||||
|
||||
## Subtasks
|
||||
|
||||
- [ ] Generation options in the new-world dialog: how much ore, caves, water and mountains, and how deep the world goes
|
||||
- [ ] Planet presets that change the look and the climate: different trees, water, dirt and rock colours, for example a frozen world, a desert world and a volcanic world
|
||||
- [ ] Exotic, sci-fi ores and materials for the late game, found only on some planets or very deep, each with a use
|
||||
- [ ] Opening a new claim offers a few claims to choose from (for example three), each showing its size, preset, notable ores, down payment and debt
|
||||
- [ ] Claim prices match their size and riches
|
||||
@@ -1,19 +0,0 @@
|
||||
---
|
||||
id: t14
|
||||
title: Redesign drill upgrades
|
||||
status: Backlog
|
||||
created: 2026-10-24
|
||||
updated: 2026-10-24T23:55:44Z
|
||||
tags: [idea]
|
||||
order: 1
|
||||
---
|
||||
|
||||
## Context
|
||||
|
||||
- The Resonance drill is upgraded today by casting drill bits in a Bit mold, which doesn't make sense for a drill that shatters rock with pulses. Redesign how upgrades work as a whole. Earlier ideas from the design notes: an amplifier, a tuning fork and harmonics for the drill, a Grav pick tool and mining charges.
|
||||
|
||||
## Subtasks
|
||||
|
||||
- [ ] Decide what the drill's upgrades are (power, reach, width, tuning, harder rock) and how each is earned or built, replacing the Bit mold
|
||||
- [ ] Decide whether other upgrades (the bag/tank, Flask, thermal lens) follow the same system
|
||||
- [ ] Old saves keep the upgrades they already have
|
||||
@@ -1,14 +0,0 @@
|
||||
---
|
||||
id: t15
|
||||
status: Done
|
||||
order: 7
|
||||
priority: P3
|
||||
created: 2026-10-24
|
||||
updated: 2026-10-24T23:25:51Z
|
||||
title: material selection menu for vacuum tool
|
||||
report: |
|
||||
(agent) The owner chose to fold this into t6: the bag rows are the vacuum's material
|
||||
selection (⬇ pick up, ⬆ blow) instead of a separate menu. Check it with t6.
|
||||
---
|
||||
|
||||
|
||||
@@ -1,35 +0,0 @@
|
||||
---
|
||||
id: t16
|
||||
status: Done
|
||||
order: 12
|
||||
priority: P3
|
||||
created: 2026-10-24
|
||||
updated: 2026-10-24T23:25:51Z
|
||||
title: vacuum tool rework, again
|
||||
report: |
|
||||
(agent) Fewer modes. Left click picks up everything, or only what you've marked once you mark
|
||||
something; Shift takes everything for one click. F with the Vacuum (when nothing in reach can be
|
||||
used, like a mold or gate) opens the Vacuum menu: one line per material with ⬇ (pick up) and ⬆
|
||||
(blow), plus Pick up everything and Blow one at a time. Clicking the Pick up / Blow out chips on
|
||||
the card opens it too. Bag: click a name to blow only it, Ctrl+click to add it to the blow mix,
|
||||
Ctrl+right-click to add it to pick-up (a small ⬇ shows what's marked). Shift + right click blows
|
||||
an even mix of everything loose in the bag. Q/E still cycles, R still marks under the cursor.
|
||||
To check: Ctrl+click coal and copper ore in the bag and blow a mix; Ctrl+right-click copper ore
|
||||
and vacuum a mixed pile; Shift + right click to blow everything; press F for the compact menu.
|
||||
---
|
||||
|
||||
## Context
|
||||
|
||||
- The vacuum still has too many modes. Replace them with a menu on F, like the wall menu, where each material has a Pick up and a Blow toggle. Take the ⬇/⬆ buttons off the bag rows. Pick-up has only two states: everything when nothing is marked, or only the marked materials.
|
||||
|
||||
## Subtasks
|
||||
|
||||
- [x] Pick-up: everything unless something is marked (no mode variable)
|
||||
- [x] Vacuum menu on F and on the card chips; bag row buttons removed
|
||||
- [x] Text, tests and screenshots up
|
||||
- [x] shift to blow all
|
||||
report: Shift + right click (while not flying) blows an even mix of everything loose in the bag; bars are left out. What you've chosen to blow doesn't change.
|
||||
- [x] Ctrl+click bag items to select several for pick-up and blow
|
||||
report: Ctrl+click a bag name adds it to (or takes it out of) what you blow; Ctrl+right-click does the same for pick-up. Plain click still blows only that one.
|
||||
- [x] Compact the F menu: one line per item
|
||||
report: One row per material: swatch, name, count, a ⬇ and a ⬆ button under Pick up / Blow headings.
|
||||
@@ -1,28 +0,0 @@
|
||||
---
|
||||
id: t17
|
||||
status: Done
|
||||
order: 13
|
||||
priority: P3
|
||||
created: 2026-10-24
|
||||
updated: 2026-10-24T23:25:51Z
|
||||
title: fog of war changes
|
||||
report: |
|
||||
(agent) The bot now sees into the ground around it, through rock: fully clear out to 12 grains,
|
||||
then fading out softly by 24, with a grainy edge instead of a hard or stepped one. It moves with the bot and
|
||||
stays revealed afterwards, like the rest of the fog. Line of sight down tunnels and into caves
|
||||
works as before (out to 48 grains).
|
||||
To check: start or load a world, dig down, and look at the ore and caves showing in the rock
|
||||
around the bot as you go.
|
||||
---
|
||||
|
||||
## Context
|
||||
|
||||
- Fog of war only reveals open areas the bot can see into, so you can't tell what's in the ground around you or where to dig. Also reveal the ground around the bot, through rock, out to about 20 grains with a soft edge. Ground revealed this way looks fully clear, the same as ground seen in the open.
|
||||
|
||||
## Subtasks
|
||||
|
||||
- [x] Reveal ground within about 20 grains of the bot, through rock, with a soft edge
|
||||
- [x] Blend the fog edges more: they look sharp and stepped
|
||||
report: The ring around the bot now fades over 12 grains (clear to 12, gone at 24) instead of 4, rays fade 8 grains into rock and over the last 16 of their range, the surface fades over 16 grains, and partly seen grains get a little per-grain noise so the edge looks grainy instead of stepped.
|
||||
- [x] Remove the jagged grey edge, and make unexplored ground black
|
||||
report: Fading now eases into black along a curve, the grain noise is strongest mid-fade and gone at the edges, sight into rock always fades over 8 grains from however bright it arrived, and unexplored ground (and off the map) is pure black instead of dark grey.
|
||||
@@ -1,25 +0,0 @@
|
||||
---
|
||||
id: t19
|
||||
status: Done
|
||||
order: 9
|
||||
priority: P3
|
||||
created: 2026-10-24
|
||||
updated: 2026-10-24T23:25:51Z
|
||||
title: vacuum blow all visual
|
||||
report: |
|
||||
(agent) With the Vacuum, holding Shift (while not flying) now shows what Shift + right click
|
||||
will blow before you click: the card's Blow out line reads "Everything · mix of N", every bag
|
||||
row that will be blown lights up, and the swatches by the cursor show the whole mix. Let go of
|
||||
Shift and it goes back to your chosen material. It also shows while you're blowing everything.
|
||||
To check: with a few things in the bag and one chosen to blow, hold Shift and watch the card and
|
||||
bag; then hold Shift with WASD and see it doesn't change (Shift is boost then).
|
||||
---
|
||||
|
||||
## Context
|
||||
|
||||
- Show what Shift + right click will blow before you click. While Shift is held with the Vacuum, or while blowing everything, every bag row that will be blown lights up, the card's Blow out line reads "Everything · mix of N", and the swatches by the cursor show the whole mix.
|
||||
|
||||
## Subtasks
|
||||
|
||||
- [x] Card shows "Everything · mix of N" while Shift is held
|
||||
- [x] Bag rows that will be blown light up
|
||||
@@ -1,26 +0,0 @@
|
||||
---
|
||||
id: t1
|
||||
title: Ingot stacking and storage
|
||||
status: Review
|
||||
created: 2026-10-24
|
||||
updated: 2026-10-24T23:53:08Z
|
||||
tags: [discussion]
|
||||
order: 0
|
||||
report: |
|
||||
(agent) Bars now pile neatly: a bar that lands snaps into line, and one hanging mostly over a gap
|
||||
tips into it, so piles have no air holes. For storage there's a new Bar rack block ($40) in the
|
||||
Machines tab. Each block holds 50 bars of any kind; stack blocks in a column for more. Bars that
|
||||
land on top go in, the hover shows the counts by kind, and F opens the gate at the bottom so
|
||||
bars come out one at a time, oldest first, onto a belt below. Taking a block back gives its
|
||||
bars to you. Please try a rack under an ingot mold's belt and see if the stacking feels right.
|
||||
assignee: claude
|
||||
---
|
||||
|
||||
## Context
|
||||
|
||||
- stacking ingots is a little odd, they dont stack neatly. so putting them all in the same place means it will get full but have lots of air space. what can we do about this? WHat in real life might be the solution for storing ingots?
|
||||
|
||||
## Subtasks
|
||||
|
||||
- [x] Bars that come to rest snap to a 2-grain grid, and a bar with less than half of itself supported tips into the gap beside it, so piles have no air gaps
|
||||
- [x] Rack blocks: 1-block pieces stacked into a column, 50 bars each; bars dropped on top go in (any kind, counted by kind), F opens a gate at the bottom that lets them out one at a time, oldest first
|
||||
@@ -1,42 +0,0 @@
|
||||
---
|
||||
id: t20
|
||||
status: Done
|
||||
order: 14
|
||||
priority: P3
|
||||
created: 2026-10-24
|
||||
updated: 2026-10-24T23:25:51Z
|
||||
title: vacuum/blow tool rethink
|
||||
report: |
|
||||
(agent) The Vacuum has one selection for picking up and blowing out. With anything selected, a
|
||||
left drag takes only the selected materials, wherever it starts; with nothing selected it takes
|
||||
what you click (or the first loose grain it reaches). Right click blows the selected materials
|
||||
that are in the bag, as a mix. Click a bag name or Q/E selects one, Ctrl+click adds or removes.
|
||||
Hold Ctrl and the bag also lists everything you've found, under "Not in bag", so you can select
|
||||
materials you don't have yet. Blowing out the last of a material deselects it (one picked
|
||||
before you had any stays selected). Ctrl + wheel scrolls the bag list. Clear the
|
||||
selection with the Clear selection button under the bag list, by clicking the only selected row, or gamepad B.
|
||||
Shift takes or blows everything.
|
||||
To check: hold Ctrl, Ctrl+click two materials you don't have, then sweep a mixed pile (only
|
||||
those come up); blow a coal + ore mix until the coal runs out (ore keeps going, coal is
|
||||
deselected); Ctrl + wheel over the bag; Clear, then drag on something (only that comes up).
|
||||
---
|
||||
|
||||
# Context
|
||||
|
||||
I dont like the current tool. I want to completely rethink how to pick up and drop materials in the game. maybe a vacuum isnt the best tool. maybe it is. I just want to discuss some options for picking up and dropping the materials in the game. it dont need to be super complicated, but i do need to be able to selectively pick up and drop materials. lets brainstorm multiple ideas for tools maybe multiple tools or just one. i want it to be simple and intuitive.
|
||||
|
||||
## Subtasks
|
||||
|
||||
- [x] discuss with user in claude code when asked about it, to work out exactly what the user wants
|
||||
- [x] Pick up what you click: a drag that starts on a material sweeps up only that material, and Shift takes everything
|
||||
- [x] One bag item (or a Ctrl+click mix) is in hand; Q/E or clicking a bag row changes it, and right click blows it out
|
||||
- [x] When the last of something in hand is blown out, it leaves the hand; an empty hand says so instead of blowing
|
||||
- [x] Picking something up with an empty hand puts it in hand
|
||||
- [x] Remove the pick-up marks (R, Ctrl+right-click, the "Only marked" chip) and the F vacuum menu
|
||||
- [x] One selection for both: a drag picks up only the selected materials (or what you click when nothing is selected), and right click blows out the selected ones in the bag
|
||||
- [x] Holding Ctrl lists every material found so far in the bag, below a "Not in bag" divider, so several can be selected before any are picked up
|
||||
- [x] Blowing out the last of a selected material deselects it; materials selected before you have any stay selected
|
||||
- [x] An easy way to clear the selection (a Clear button, clicking the only selected row, gamepad B)
|
||||
- [x] Ctrl + wheel over the bag scrolls the list instead of zooming the page
|
||||
- [x] Ctrl+click adds to the selection on setups where the click arrives without the Ctrl flag
|
||||
- [x] The bag hint and a wider, more visible Clear selection button stay visible below the list instead of scrolling away
|
||||
@@ -1,32 +0,0 @@
|
||||
---
|
||||
id: t21
|
||||
status: Review
|
||||
order: 0
|
||||
priority: P3
|
||||
created: 2026-10-24
|
||||
updated: 2026-10-25T02:42:10Z
|
||||
title: Code health: refactor, speed up and test the physics
|
||||
report: |
|
||||
(agent) Done in six commits; all tests pass. Water: it did run out, just slowly. Pools now pour
|
||||
off ledges several times faster (a 100-wide pool empties in about 50 s) and leftover film drains;
|
||||
rain from steam spreads out downwind, so a waterfall into a hot shaft no longer refills its own
|
||||
lake. Found and fixed: steam or smoke trapped in a pocket never finished, and rain landing on
|
||||
steam deleted water. Piles near the bot now sort, quickly. Faster with identical results: the
|
||||
roof scan (4.6 -> 1.9 ms on a quiet Huge world) and the heat pass. A loaded world starts around
|
||||
the bot first (Huge, first 10 s: 15 -> 5.5 ms a tick, worst 80 -> 16 ms). Seven duplicates merged
|
||||
and six large files split. Seeds make the same worlds as before. Please check: pour a pond off a
|
||||
ledge; stand by a pile of ore on ash; load a Huge world and fly around in the first 20 s.
|
||||
assignee: claude
|
||||
---
|
||||
|
||||
## Context
|
||||
|
||||
- The code has grown fast. Clean it up and make it faster without changing how the game plays, and give the physics a full test pass, starting with water: water running off the edge of the world never seems to run out (it may only be slow; find out, and fix it if it really doesn't). (Merged from t24 water fixes.)
|
||||
|
||||
## Subtasks
|
||||
|
||||
- [x] Remove duplicated code and split the largest modules into smaller files
|
||||
- [x] Profile the simulation and rendering on a Huge world and speed up the slowest parts
|
||||
- [x] A full test pass over water physics in every situation (pools, flows, falls off the world edge, pumps and pipes, freezing and boiling); fix what is wrong
|
||||
- [x] The same kind of pass over sand, molten metal and gases where tests are thin
|
||||
- [x] Fix issues found along the way, and test every piece of gameplay the changes touch
|
||||
@@ -1,21 +0,0 @@
|
||||
---
|
||||
id: t25
|
||||
status: Done
|
||||
order: 11
|
||||
priority: P3
|
||||
created: 2026-10-24
|
||||
updated: 2026-10-24T23:25:51Z
|
||||
title: visual effect for vac/blow tool
|
||||
report: |
|
||||
(agent) While sucking, short teal streaks of air swirl in toward the nozzle ring; while blowing,
|
||||
amber streaks run from the bot toward the cursor and widen to the nozzle width. They're on top
|
||||
of the grains already flying in and out, and they turn off with "Sparks and debris" in
|
||||
settings. Please check whether they're too faint, too busy or too fast.
|
||||
---
|
||||
|
||||
## Subtasks
|
||||
|
||||
- [ ] add visual effects for suck and blow
|
||||
- [ ]
|
||||
- [x] While sucking, short teal streaks of air swirl in toward the nozzle ring
|
||||
- [x] While blowing, amber streaks push out from the bot toward the cursor and spread into a cone
|
||||
@@ -1,18 +0,0 @@
|
||||
---
|
||||
id: t26
|
||||
status: Done
|
||||
order: 10
|
||||
priority: P3
|
||||
created: 2026-10-24
|
||||
updated: 2026-10-24T23:25:51Z
|
||||
title: rename and make name visible somewhere the vac/blow tool
|
||||
report: |
|
||||
(agent) The tool is now the Pneumatic nozzle. Its card starts with a title row (the name and the
|
||||
nozzle width), and the hotbar tooltip, Welcome, milestones, notebook and empty-bag hint all use
|
||||
the new name. Please check the wording reads well in the notebook and the Welcome card.
|
||||
---
|
||||
|
||||
## Subtasks
|
||||
|
||||
- [x] The tool is called the Pneumatic nozzle in the hotbar tooltip and in all player text
|
||||
- [x] Its tool card starts with a title row showing the name and the nozzle width
|
||||
@@ -1,22 +0,0 @@
|
||||
---
|
||||
id: t27
|
||||
status: Done
|
||||
order: 8
|
||||
priority: P3
|
||||
created: 2026-10-24
|
||||
updated: 2026-10-24T23:25:51Z
|
||||
title: add toast for vac/blow tool
|
||||
report: |
|
||||
(agent) Every tool's messages now show as toasts at the top of the screen; the red line in the
|
||||
tool card is gone. Errors have a red edge, info messages a teal one. Holding a button that keeps
|
||||
repeating a message (blowing with nothing selected, the Igniter out of reach) keeps one toast up
|
||||
instead of piling them. Please check the toasts are readable and don't get in the way.
|
||||
---
|
||||
|
||||
## Subtasks
|
||||
|
||||
- [ ] when blowing without any items selected there is a message in red in the box on the top left, instead move it to a toast.
|
||||
- [ ] same for any other messages from the tool
|
||||
- [ ] s
|
||||
- [x] Every tool's messages show as toasts, and the red line in the tool card goes away
|
||||
- [x] A message that repeats while a button is held refreshes one toast instead of stacking up
|
||||
@@ -1,24 +0,0 @@
|
||||
---
|
||||
id: t28
|
||||
title: Brick press for clay bricks
|
||||
report: |
|
||||
(agent) The Brick press ($60) is in the Machines tab next to the Saw. Every 8 clay lumps resting
|
||||
on it become a Green brick that drops out underneath. Drop green bricks into a fire hotter than
|
||||
about 900°C (blow them in, belt them in, or put the press over a fire) and they turn into Bricks.
|
||||
2 Bricks build a brick wall block, they sell for about $9, and builders order them. Please try
|
||||
pressing and firing a batch, and check that the press's moving plate reads well.
|
||||
status: Done
|
||||
created: 2026-10-24
|
||||
updated: 2026-10-24T23:25:51Z
|
||||
order: 16
|
||||
---
|
||||
|
||||
## Context
|
||||
|
||||
- Clay bricks should be made the same way as the Saw's stone blocks: a 1-block hopper piece takes grains on top and drops an item below. A Brick press squeezes clay lumps into green bricks, and like real bricks they then have to be fired to become Bricks.
|
||||
|
||||
## Subtasks
|
||||
|
||||
- [x] Brick press block: every 8 clay lumps resting on it make a Green brick that drops out underneath
|
||||
- [x] A Green brick that gets hotter than about 900°C fires into a Brick
|
||||
- [x] Bricks build brick wall blocks (2 per block) and sell; builders order them
|
||||
@@ -1,11 +0,0 @@
|
||||
---
|
||||
id: t29
|
||||
status: Done
|
||||
order: 20
|
||||
priority: P3
|
||||
created: 2026-10-24
|
||||
updated: 2026-10-24T23:25:51Z
|
||||
title: add minimap
|
||||
---
|
||||
|
||||
|
||||
@@ -1,19 +0,0 @@
|
||||
---
|
||||
id: t2
|
||||
title: Construction materials as export products
|
||||
status: Backlog
|
||||
created: 2026-10-24
|
||||
updated: 2026-10-24T23:55:44Z
|
||||
tags: [discussion]
|
||||
order: 2
|
||||
---
|
||||
|
||||
## Context
|
||||
|
||||
- Decide what the factory ultimately makes for sale. Smelting ore, grinding rock and casting bars are the basics; the products worth exporting should be real construction materials, the things an actual building site orders. Some exist already (stone blocks, planks, bricks, glass bricks, metal bars); this is about designing the full set and how each is made.
|
||||
|
||||
## Subtasks
|
||||
|
||||
- [ ] List candidate products a building site buys (for example steel beams, rebar, pipe, wire, glass panes, cement and concrete, roof tiles) and pick the ones that fit the game
|
||||
- [ ] For each, decide its recipe from materials in the game and which machine or mold makes it
|
||||
- [ ] Builders' orders and prices for them, so making finished products pays better than selling raw bars
|
||||
@@ -1,25 +0,0 @@
|
||||
---
|
||||
id: t30
|
||||
title: Progress meters while generating, loading and saving
|
||||
report: |
|
||||
(agent) Making a world, opening a claim, loading a save and travelling now show the loading
|
||||
screen with a title, a bar that moves and the step it's on (shaping the land, laying rock and
|
||||
ore, settling loose ground, unpacking, building the world...). The game stays responsive while a
|
||||
Huge world generates, and worlds come out exactly as before. A small "Saving…" chip appears at
|
||||
the bottom right only if a save takes longer than about a sixth of a second. Please try a Huge
|
||||
world, Continue, a new claim and travel, and say whether the saving chip should stay.
|
||||
status: Done
|
||||
created: 2026-10-24
|
||||
updated: 2026-10-24T23:25:51Z
|
||||
order: 18
|
||||
---
|
||||
|
||||
## Context
|
||||
|
||||
- Making a world, opening a new claim, travelling between claims and loading a save can take several seconds on big worlds (a Huge world takes about 6 s to generate), and the screen gives little sign of what is happening. Show a progress bar with a short message for each step. Saving is quick today, but a small indicator would help there too, especially for Huge worlds.
|
||||
|
||||
## Subtasks
|
||||
|
||||
- [x] Generating a world shows a progress bar that moves and names the step (terrain, ores, caves, water, trees…)
|
||||
- [x] Loading a save, opening a new claim and travelling show progress (reading, unpacking, building the world)
|
||||
- [x] Saving shows a small, unobtrusive indicator while it runs
|
||||
@@ -1,26 +0,0 @@
|
||||
---
|
||||
id: t32
|
||||
title: Minimap with zoom, and a full map
|
||||
report: |
|
||||
(agent) A minimap sits in the bottom-right corner, centred on your bot, with − and + zoom and a
|
||||
Map button. M opens the full map of the world: scroll to zoom, drag to pan, "Centre on bot",
|
||||
and markers for you and the trade dock. Unexplored ground is black on both. The onboarding
|
||||
cards now pop up at the bottom centre, mute moved to Shift+M, and "Show minimap" in settings
|
||||
hides it. It costs about 0.1 ms a frame. Please try it on a Huge world, and say whether the
|
||||
minimap's size and position work.
|
||||
status: Done
|
||||
created: 2026-10-24
|
||||
updated: 2026-10-24T23:25:51Z
|
||||
order: 17
|
||||
---
|
||||
|
||||
## Context
|
||||
|
||||
- Big worlds and several claims make it easy to lose your way. Add a small minimap in the bottom-right corner, with zoom buttons and a button that opens a full map of the world. The full map opens with M too (mute moves to Shift+M and stays in settings). Onboarding cards move from the bottom right to the bottom centre to make room. Unexplored ground stays black on both maps.
|
||||
|
||||
## Subtasks
|
||||
|
||||
- [x] Minimap in the bottom-right corner around the bot, with + and − zoom and a button for the full map
|
||||
- [x] Full map (M): the whole world, zoom with the wheel or buttons, drag to pan, markers for the bot and the dock
|
||||
- [x] Both maps respect fog of war and keep up with digging and building without slowing the game
|
||||
- [x] Onboarding cards move to the bottom centre; mute moves to Shift+M
|
||||
@@ -1,17 +0,0 @@
|
||||
---
|
||||
id: t33
|
||||
title: Make solid ground easy to tell apart from loose grains on top of it
|
||||
status: Todo
|
||||
created: 2026-10-25
|
||||
updated: 2026-10-25T02:04:28Z
|
||||
---
|
||||
|
||||
## Context
|
||||
|
||||
- When loose material (rubble, dirt, ore) lies on top of or against solid rock, the two are hard to tell apart in the smooth look: the loose grains blend into the rock under them, so it's unclear where the solid ground starts and what is still to dig. The owner's screenshot: `/home/aaron/Pictures/Screenshots/Screenshot_20261024_214546.png` (a dug-out area around the bot where loose copper-coloured rubble covers the rock).
|
||||
|
||||
## Subtasks
|
||||
|
||||
- [ ] Find what makes them blend (similar colours, lighting, the smooth look's edge blending, no outline between loose and solid)
|
||||
- [ ] Give loose grains and solid ground a clear visual difference (for example an edge or shading on solid rock, a different texture or brightness for loose grains), in both looks
|
||||
- [ ] Check it in dark caves, under the bot's lamp, and with the thermal lens
|
||||
@@ -1,21 +0,0 @@
|
||||
---
|
||||
id: t34
|
||||
title: Limit how far the nozzle blows to the same reach as sucking
|
||||
status: Todo
|
||||
created: 2026-10-25
|
||||
updated: 2026-10-25T02:26:51Z
|
||||
---
|
||||
|
||||
|
||||
|
||||
## Context
|
||||
|
||||
- Blowing with the Pneumatic nozzle has no range limit: with the cursor outside the reach circle around the bot, blown grains still fly all the way to the cursor, and the farther you aim, the farther they go. Sucking only works inside the circle. Blowing should be limited to the same reach.
|
||||
- Cause: `nozzle()` in `src/sim/vacuum.js` works out a distance capped at the reach, but `toolBlow()` aims every grain at the cursor itself rather than at that capped point.
|
||||
|
||||
## Subtasks
|
||||
|
||||
- [ ] Aim blown grains at the cursor only when it's inside the reach; outside it, aim at the edge of the reach in the cursor's direction
|
||||
- [ ] Make the blow preview show where grains will land when the cursor is out of reach
|
||||
- [ ] Check thrown bars still match (they already aim at the capped point)
|
||||
- [ ] Add a check: blowing at a cursor far outside the reach lands nothing beyond it
|
||||
@@ -1,21 +0,0 @@
|
||||
---
|
||||
id: t35
|
||||
title: Diagonal screw tubes
|
||||
status: Todo
|
||||
created: 2026-10-25
|
||||
updated: 2026-10-25T02:35:19Z
|
||||
---
|
||||
|
||||
|
||||
|
||||
## Context
|
||||
|
||||
- Screw tubes only run straight: up, down, left or right. Add diagonal tubes, and let them be placed diagonally (dragging a line at 45° lays a diagonal run), so grains and bars can be carried up or down a slope without stair-stepping straight pieces.
|
||||
|
||||
## Subtasks
|
||||
|
||||
- [ ] Decide how a diagonal tube looks and fits the 4×4 block grid (a block per diagonal step, or a dedicated diagonal piece)
|
||||
- [ ] Move grains and bars along diagonal tubes, including joining onto and off straight tubes and belts
|
||||
- [ ] Placing: dragging at 45° lays a diagonal run; R picks the diagonal directions when placing a single piece
|
||||
- [ ] Copy, cut, paste, undo and blueprints handle diagonal tubes
|
||||
- [ ] Tests for carrying sand and bars up and down a diagonal run, and for the joins
|
||||
@@ -1,21 +0,0 @@
|
||||
---
|
||||
id: t36
|
||||
title: Diagonal wall blocks with a smooth sloped face
|
||||
status: Todo
|
||||
created: 2026-10-25
|
||||
updated: 2026-10-25T02:45:20Z
|
||||
---
|
||||
|
||||
|
||||
|
||||
## Context
|
||||
|
||||
- Walls can only be placed on the square block grid, so a sloped wall is a staircase of blocks. Grains catch on every step instead of sliding down, which makes funnels and hoppers clog. Add diagonal wall placement, and wall pieces whose face is a flat 45° slope, so loose material slides smoothly down a funnel wall.
|
||||
|
||||
## Subtasks
|
||||
|
||||
- [ ] Add sloped wall pieces: half-block triangles in the four orientations, so a run of them makes a flat 45° face
|
||||
- [ ] Dragging a wall line at 45° lays a diagonal run of sloped pieces; R picks the orientation for a single piece
|
||||
- [ ] Grains, liquids and bars slide down the flat face without catching (check powder sliding and the STICK rule against a straight 45° line)
|
||||
- [ ] Works with every wall material; refunds, copy, cut, paste, undo and blueprints handle the new pieces
|
||||
- [ ] Tests: sand poured into a V funnel of sloped walls all comes out the bottom; the same funnel built from square steps for comparison
|
||||
@@ -1,30 +0,0 @@
|
||||
---
|
||||
id: t3
|
||||
title: World feels small; resources run out
|
||||
status: Done
|
||||
created: 2026-10-24
|
||||
updated: 2026-10-24T23:25:51Z
|
||||
tags: [discussion]
|
||||
report: |
|
||||
(agent) Built all four. New worlds hold about 4.7x the ore: the top layers are as before, and
|
||||
ore gets steadily richer and veins bigger as you go deeper (copper, coal and tin now reach the
|
||||
deep layers too; gold and silver grew least so they stay valuable). Grinding granite and basalt
|
||||
finds about twice the ore, and builders order those rocks by the bagful. There's a Huge size, and
|
||||
saves are now compressed (a Medium world dropped from 29 MB to under 0.5 MB). Once a claim is
|
||||
paid off, the notebook's new Claims page opens another claim for $5,000 down and $40,000 owed
|
||||
(then $80,000...). Your money, bag, upgrades and discoveries come along, buildings stay put, and
|
||||
you can travel back. Existing worlds only get the richer ore if you start a new world or claim.
|
||||
order: 19
|
||||
---
|
||||
|
||||
## Context
|
||||
|
||||
- the world still seems quite small. i dont know if thats because the bot moves so fast, the bot can mine too fast, or the grains should be smaller... i would like to make the worl seem huge to the player and give them loads of resources to mine for a long game. as is, you could mine all the resources from the map pretty quickly and end up having to start a new world and new game as a result. or maybe there is some other solution that i havent thought of yet. need to brainstorm this.
|
||||
|
||||
## Subtasks
|
||||
|
||||
- [x] Deeper is richer: ore gets more common and comes in bigger veins the deeper you dig, for about five times the ore in a world; the shallow layers stay as they are
|
||||
report: Removed coordinate stretching and balanced thresholds per ore. Medium seed 424242 gives coal 170437 (5.09×), copper 127298 (4.80×), iron 361683 (4.66×), zinc 53527 (4.54×), tin 38551 (4.99×), silver 12166 (3.34×), gold 5858 (3.48×): 769520 total (4.73× the original 162519). Shallow ore positions/types match the original hash. Pixel screenshot /tmp/t3-balanced-ore.png inspected: rounded lenses, no diagonal ore streaks. Build/map regenerated; run_all.py --browser all passed (world 46, play 244, smooth 8 checks). Part 1 awaits owner review; remaining parts stay open.
|
||||
- [x] Waste rock pays: granite and basalt are worth grinding for ore, and builders buy them in bulk
|
||||
- [x] A Huge world size, with saves compressed so big worlds stay small on disk
|
||||
- [x] New claims: once a claim is paid off, open another for $5,000 down and a bigger debt, keeping money, bag, upgrades and knowledge; travel between your claims from the notebook
|
||||
@@ -1,35 +0,0 @@
|
||||
---
|
||||
id: t4
|
||||
title: Hopper blocks instead of fixed-size hoppers
|
||||
status: Done
|
||||
created: 2026-10-24
|
||||
updated: 2026-10-24T23:25:51Z
|
||||
tags: [discussion]
|
||||
order: 15
|
||||
report: |
|
||||
(agent) Built. Grinder ($60) and Saw ($90) are 1-block pieces in the Machines tab. Grains
|
||||
resting on top are worked and the result drops out underneath, so a row of them between two
|
||||
walls is a hopper of any width, and each block adds speed (two Grinders = one old Refiner, one
|
||||
Saw = one old Stone cutter). A Saw stacked on a Grinder cuts the stone and grinds everything
|
||||
else. If the space underneath fills up the block stops; hover it to see why. The Refiner and
|
||||
Stone cutter are gone from the menu; ones already built keep working. Please try a wide grinder
|
||||
hopper fed with the nozzle, a Saw on a Grinder, and an old save that has a Refiner.
|
||||
Follow-ups: the old Refiner and Stone cutter code is removed (a save that still has one loads
|
||||
and refunds it). Grinders now look like a pair of grinding wheels and Saws like a round blade.
|
||||
The Saw also cuts wood chunks into Planks, and its stone output is now called a Stone block.
|
||||
Clay bricks moved to their own task, t28 (Brick press).
|
||||
---
|
||||
|
||||
## Context
|
||||
|
||||
- instead of buildings like the refiner which have a fixed size hopper, just make a block the same size as a wall tile that looks like grinding wheels where the user can place multiple side by side to create a wide hopper. the same thing should be done for the other buildings like that.
|
||||
|
||||
## Subtasks
|
||||
|
||||
- [x] Grinder block (does what the Refiner does) and Saw block (Stone cutter), 1 block each; side by side they make a wider, faster hopper
|
||||
- [x] Refiner and Stone cutter leave the build menu; built ones in old saves keep working
|
||||
- [x] Remove the Refiner and Stone cutter code; an old save that still has one loads with the machine taken out and its cost refunded
|
||||
- [x] Grinders look like two grinding wheels and Saws like a round blade, turning while they work
|
||||
- [x] The Saw also cuts wood chunks into Planks, which build wood walls and sell
|
||||
- [x] Rename the Saw's "Stone brick" to "Stone block", so only fired clay is called a brick
|
||||
- [x] The Saw's description and "stopped" hover say to put a belt or an open drop under it
|
||||
@@ -1,18 +0,0 @@
|
||||
---
|
||||
id: t5
|
||||
title: Material selection menu
|
||||
status: Done
|
||||
created: 2026-10-24
|
||||
updated: 2026-10-24T23:25:51Z
|
||||
order: 1
|
||||
report: |
|
||||
(agent) New material menu for walls and molds. With the Build tool on a wall block or a mold,
|
||||
press F (or click the material chip on the Build card) to open it. Each material shows how
|
||||
much you have, what this piece costs in it and the heat it stands (melts at / burns at /
|
||||
won't melt). Ones you have come first; ones you can't afford are dimmed. R still cycles.
|
||||
To check: Build (3), Wall block, F, pick Clay. Then a mold piece, F again.
|
||||
---
|
||||
|
||||
## Context
|
||||
|
||||
- for buildings that need a material selection, lets make a new material selection menu
|
||||
@@ -1,27 +0,0 @@
|
||||
---
|
||||
id: t6
|
||||
title: Rework the vacuum/blower tool
|
||||
status: Done
|
||||
created: 2026-10-24
|
||||
updated: 2026-10-24T23:25:51Z
|
||||
tags: [discussion]
|
||||
order: 6
|
||||
report: |
|
||||
(agent) Built (t15 folded in). With the Vacuum (2) selected, each bag row has ⬇ (pick it up)
|
||||
and ⬆ (blow it out); click a name to blow only that. The tool card shows "Pick up" with a
|
||||
mode chip: What I click / Only marked / Everything (T or click the chip cycles). R over a
|
||||
grain marks it for pick-up and switches to Only marked; unmark the last one and it goes back.
|
||||
"Blow out" shows what right click blows (Q/E cycles one material; ⬆ on several = even mix).
|
||||
To check: mark coal and copper ore with ⬆ and blow a mix into a furnace; mark one thing with R
|
||||
and vacuum a mixed pile; press T to try Everything.
|
||||
---
|
||||
|
||||
## Context
|
||||
|
||||
- lets rework the vacuum/blower tool. the selecting, ticking, etc of the items for filtering and otherwise. its a little confusing and difficult to understand. lets ocme up with a simpler ui/ux, intuitive while still containing the same core functions like filtering what you pickup and drop and allowing pickup/drop all or filtered.
|
||||
|
||||
## Subtasks
|
||||
|
||||
- [x] Bag rows get separate pick-up and blow marks (no more shared ticks)
|
||||
- [x] Tool card chip: pick up everything / only marked / same as the first click
|
||||
- [x] R over a grain toggles its pick-up mark; blowing uses the rows marked to blow
|
||||
@@ -1,17 +0,0 @@
|
||||
---
|
||||
id: t7
|
||||
title: Option to turn off smooth pan following the mouse
|
||||
status: Done
|
||||
created: 2026-10-24
|
||||
updated: 2026-10-24T23:25:51Z
|
||||
order: 2
|
||||
report: |
|
||||
(agent) New setting: Settings > Display > "Camera looks toward the pointer". Turn it off and
|
||||
the camera stays centred on the bot instead of drifting toward the mouse (or right stick).
|
||||
It is on by default for new players; your choice is saved in the browser.
|
||||
To check: turn it off, move the mouse to a screen corner while flying: the view shouldn't move.
|
||||
---
|
||||
|
||||
## Context
|
||||
|
||||
- the smooth pan following the mouse should be an option in options. i personally dont like it much.
|
||||
@@ -1,20 +0,0 @@
|
||||
---
|
||||
id: t8
|
||||
title: Fog of war for unexplored areas
|
||||
status: Done
|
||||
created: 2026-10-24
|
||||
updated: 2026-10-24T23:25:51Z
|
||||
order: 3
|
||||
report: |
|
||||
(agent) Fog of war. Underground is black until the bot has seen it: it sees in straight
|
||||
lines through air, water and gas, about 48 grains, and a few grains into the rock it looks
|
||||
at. What you've seen stays seen and is saved with the world. The sky and surface start
|
||||
seen. Hover info says "Unexplored" in the black. Settings > Game > Fog of war turns the
|
||||
drawing off (exploration is still kept). Older worlds: the area around everything you've
|
||||
built and around the bot is revealed when loaded.
|
||||
To check: new world, dig down, look along a tunnel and into a cave. Try both looks.
|
||||
---
|
||||
|
||||
## Context
|
||||
|
||||
- There should be a 'fog of war' for unexplored areas.
|
||||
@@ -1,23 +0,0 @@
|
||||
---
|
||||
id: t9
|
||||
title: Script to run the local server for testing
|
||||
status: Done
|
||||
created: 2026-10-24
|
||||
updated: 2026-10-24T23:25:51Z
|
||||
order: 0
|
||||
report: |
|
||||
(agent) New: python3 tools/serve.py builds the game, serves it at http://localhost:8000 and
|
||||
rebuilds by itself when anything in src/ changes. Pages aren't cached, so a normal refresh
|
||||
shows the new build. If 8000 is taken (an old server still running), it uses 8001 and says so.
|
||||
To check: stop your old server (Ctrl+C), run python3 tools/serve.py, open the address it
|
||||
prints, change something in src/, refresh. Ctrl+C stops it.
|
||||
---
|
||||
|
||||
## Context
|
||||
|
||||
- i need a script to run the local server for testing.
|
||||
|
||||
## Subtasks
|
||||
|
||||
- [x] Add the server and update the command references and map.
|
||||
- [x] Check serving, rebuilds, port fallback and shutdown; run the headless suites.
|
||||
Reference in New Issue
Block a user