Commit Graph

19 Commits

Author SHA1 Message Date
Steve Biedermann 2305660d5a fix: exit shards when simulation threads fail
Supervise the shard simulation thread and exit with status 1 when it panics or stops, allowing the container restart policy to recover instead of leaving a live control server with no simulation. Cover startup panics and actor-reply timeouts with subprocess regression tests, and document recovery behavior.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-10-21 20:00:05 +02:00
Steve Biedermann f4e3ef4045 feat(admin): persist generated admin password
Co-Authored-By: GitHub Copilot <noreply@github.com>
2026-10-13 18:45:47 +02:00
Steve Biedermann 4ae5d40bea chore(compose): build before restarting services
Co-Authored-By: GitHub Copilot <noreply@github.com>
2026-10-13 17:59:17 +02:00
Steve Biedermann cdcbae4c05 feat(compose): run sqlite shards in separate containers
Co-Authored-By: GitHub Copilot <noreply@github.com>
2026-10-13 17:18:15 +02:00
Steve Biedermann bf0cb7d0c7 fix(access): recognize localhost through Compose
Co-Authored-By: GitHub Copilot <noreply@github.com>
2026-10-13 17:07:26 +02:00
Steve Biedermann 0332783a78 fix(access): restrict public clients to read-only
Co-Authored-By: GitHub Copilot <noreply@github.com>
2026-10-13 16:46:00 +02:00
Steve Biedermann a9055b8218 feat(cluster): route entity messages by actor path
Co-Authored-By: GitHub Copilot <noreply@github.com>
2026-10-13 16:33:23 +02:00
Steve Biedermann ec861de3ba docs: document the shard cluster, economy and per-shard databases
Describe the gateway and shard processes, transparent transfers, the
economy and console peers in the README. Compose creates one Postgres
database per shard and passes `SHARD_DATABASE_URL` and `SIM_SHARDS`;
the Justfile and Dockerfile use per-shard SQLite files.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-10-12 20:43:11 +02:00
Steve Biedermann 0009206a3c refactor(world)!: make Picard actors own entity state
People, rabbits, wolves and partnerships are now Picard actors that own
their state and apply their own rules (ageing, hunger and meals,
starvation, energy, breeding costs, death, birth intervals). The world
no longer keeps mirrored Vecs that were read from and written back to
generic entity actors every step; it only reaches entities through
typed messages and replies, correlated by request id through a single
inbox actor.

World-level state (terrain, resources, stockpile, houses, calendar, the
world random stream) stays in the world, and behaviour decisions stay
on the simulation thread because the Rune VM is not Send. Replies are
processed in entity order and each person has its own persisted random
stream, so runs and snapshot restores stay deterministic.

Rabbits killed by hunters no longer move or breed later in the same
tick.

BREAKING CHANGE: Picard actors are named person-<id>, rabbit-<id>,
wolf-<id> and partnership-<id> instead of entity-<id>, which changes
the paths used with the actor console.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-10-12 16:47:44 +02:00
Steve Biedermann fd243b30d6 feat(actor-console): expose Picard over WebSocket
Update Picard and forward console/serde features, serialize actor messages, and route console requests through the simulation thread.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-10-12 12:43:05 +02:00
Steve Biedermann 9285df4d7b feat(sim)!: move simulation settings and behaviours into config.rn
Starting values and tuning constants are now `pub const` items in a
single Rune file, config.rn, alongside the `person`, `rabbit` and `wolf`
behaviour functions. The behaviours read the constants directly. At
startup the server loads the file from SIM_CONFIG (default: config.rn),
reads and checks every constant, and test-runs each behaviour, so a bad
or missing value stops startup with an error that names it.

- Map width and height can now be configured and are stored in
  snapshots.
- The UI's edit limits (max speed, stock, inventory, hunger, energy,
  resource amounts) come from the config.
- The in-browser script editor now edits config.rn. Applied edits update
  behaviours and tuning values immediately; map size, initial population
  and calendar defaults apply on reset.
- The Docker image includes config.rn, and Compose mounts the
  repository's copy read-only.
- Documents the config file and how it works in the README.

BREAKING CHANGE: src/behavior.rn has been removed; behaviours now live
in config.rn. The server will not start without a valid config file.
Snapshots no longer store the behaviour script: on restart, config.rn
from disk replaces any edits made in the browser editor.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-10-11 20:42:29 +02:00
Steve Biedermann b6bab90503 feat(sim): expose Picard runtime stats and tracing
Enable Picard's stats and tracing features, publish actor counters to the UI, and initialize configurable tracing output.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-10-11 18:58:07 +02:00
Steve Biedermann a4eb181154 fix(sim): prevent starvation before population can recover
Use terrain-aware pathfinding for travel toward home and resources so settlers do not get stranded against blocked terrain. Add a startup food reserve, slow hunger accumulation, let villagers return for food sooner, ensure available food is consumed before starvation, and make the first birth check available at the first weekly boundary.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-10-11 18:39:50 +02:00
Steve Biedermann 52277ae779 fix(sim): improve population replacement rate
Raise starter settlement capacity above its initial population and allow eligible partnerships one birth opportunity per week instead of a 20% monthly roll. Preserve food and housing constraints and cover both initial growth and per-week births in tests.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-10-11 18:13:10 +02:00
Steve Biedermann a0f18df9ef feat(ui): expose life stages and fertility settings
Show each person's life stage, age, and partner in the inspector. Add per-stage fertility toggles and document the life cycle and birth conditions.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-10-11 17:48:35 +02:00
Steve Biedermann ca371bd414 feat(calendar): add configurable calendar and stage ranges
Persist calendar units and inclusive life-stage duration ranges, expose them in the UI, and preserve defaults when loading legacy snapshots. Date formatting now derives from calendar settings.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-10-11 17:38:57 +02:00
Steve Biedermann 81581132ad feat(sim): integrate Picard actors for living entities
Give people and animals persistent Picard actors and document runtime boundary.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-10-11 17:30:28 +02:00
Steve Biedermann 0fbe9d553d build: update Just workflows for Compose and SQLite development 2026-10-08 09:24:14 +02:00
Steve Biedermann d3a230bd47 docs: document setup and database options 2026-10-08 09:17:22 +02:00