Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
44 commits
Select commit Hold shift + click to select a range
a70dcb2
feat: system builder Phase 1, the derived-value engine (not wired in)
Sep 29, 2026
8cfd83f
docs: the system builder note is unreleased, not part of 1.14.4
Sep 29, 2026
789685c
Merge branch 'main' into feature/system-builder
Sep 29, 2026
5a1d5a1
fix: a player's own login no longer opens the GM's routes and admin s…
Sep 29, 2026
b193d4f
fix: editor grants reach only the player promoted; edit approvals nee…
Sep 29, 2026
6991264
ci: run the test suites on every pull request, whatever its base
Sep 29, 2026
679816b
Merge pull request #104 from over2take/sb/1b-gm-route-auth
over2take Sep 29, 2026
f52a687
feat(system builder 2a): store custom systems, with the definition fo…
Sep 29, 2026
3b65e66
feat(system builder 2b): one bank account per player per game system,…
Sep 29, 2026
72cfc76
feat(system builder 2c): each game system keeps its own token health,…
Sep 29, 2026
d41a60a
feat(system builder 2d): a published custom system runs the game, its…
Sep 29, 2026
15b538a
Merge pull request #105 from over2take/sb/2a-system-storage
over2take Sep 29, 2026
c3e6562
Merge pull request #106 from over2take/sb/2b-backup-and-bank
over2take Sep 29, 2026
06d5311
test: the startup-path test clears the module cache by the backend's …
Sep 29, 2026
b79819b
Merge branch 'sb/2c-token-health' into sb/2d-load-and-render
Sep 29, 2026
3d8f293
Merge pull request #108 from over2take/sb/2c-token-health
over2take Sep 29, 2026
bb9330c
Merge pull request #109 from over2take/sb/2d-load-and-render
over2take Sep 29, 2026
4b79420
feat: the game system picker is a grouped, searchable dropdown that a…
Sep 30, 2026
517b87c
test: the startup-path test waits for the admin seed before closing t…
Sep 30, 2026
ba12347
Merge pull request #110 from over2take/sb/2e-system-picker
over2take Sep 30, 2026
70b64b4
feat: custom systems mark fields as the GM's to set, and give NPCs th…
Sep 30, 2026
795cdc6
Merge pull request #111 from over2take/sb/2f-privacy-and-npcs
over2take Sep 30, 2026
1ec1ca0
feat: custom systems record their setup answers, and the health model…
Sep 30, 2026
8bd2cba
Merge pull request #112 from over2take/sb/2g-core-setup
over2take Sep 30, 2026
2faf32e
feat: a custom system's health model takes damage and healing by its …
Sep 30, 2026
8d2f9c3
Merge pull request #113 from over2take/sb/2g2a-health-rules
over2take Sep 30, 2026
fdaf2a2
feat: the heart monitor's beat follows how hurt someone is, not just …
Sep 30, 2026
7899334
Merge pull request #114 from over2take/sb/2g2b-heartbeat
over2take Sep 30, 2026
2616462
feat: what a token's HEALTH folder is sent under a custom health model
Sep 30, 2026
e04968b
Merge pull request #115 from over2take/sb/2g2c-health-view
over2take Sep 30, 2026
2b2712b
feat: the HEALTH folder under each custom health model, as in the app…
Sep 30, 2026
193fcc5
Merge pull request #116 from over2take/sb/2g2d-health-panels
over2take Sep 30, 2026
1b1bc8d
feat: share a custom system as a .citysys file, and delete as a hide …
Sep 30, 2026
ba447c1
Merge pull request #117 from over2take/sb/2h-export-import
over2take Sep 30, 2026
5d64f1f
feat: the running system's words reach every window, with built-ins l…
Oct 1, 2026
0b5453b
docs: changelog lines for the system builder pieces since 2f
Oct 1, 2026
6e08c86
Merge pull request #118 from over2take/sb/3a1-words-plumbing
over2take Oct 1, 2026
7a77e6b
feat: a custom system's words on the sheet, the token window and the …
Oct 1, 2026
13175fd
docs: the 3a3 changelog line says the word is the GM's own, not a new…
Oct 1, 2026
74ff441
Merge pull request #119 from over2take/sb/3a3-words-sheet-and-health
over2take Oct 1, 2026
db453f6
feat: a custom system's words in the shops and the bank button
Oct 1, 2026
271eb55
Merge pull request #120 from over2take/sb/3a4-words-bank-and-shops
over2take Oct 1, 2026
82171f2
feat: a custom system's words in the initiative tracker and the dice log
Oct 1, 2026
f084574
refactor: remove the first tracker's initiative roll window
Oct 1, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 6 additions & 5 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
name: CI Tests

on:
# Runs tests whenever someone opens or updates a Pull Request targeting 'main' or
# 'dev' — the integration branch that publishes development images.
# Runs tests whenever someone opens or updates a Pull Request, whatever branch it targets.
#
# This used to be limited to 'main' and 'dev', so a long-running feature branch that takes
# its pieces as PRs of its own (feature/system-builder, with sb/* pieces merged into it)
# was never tested until the final merge to main. Every PR is a change about to land
# somewhere, so every PR gets the suites.
pull_request:
branches:
- main
- dev

# Runs tests when code is merged or pushed directly to 'main'.
#
Expand Down
105 changes: 105 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,111 @@ Format follows [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).

---

## [Unreleased]

### Changed

- **Each game system has its own bank.** A character's money now belongs to the game it was
earned in: starting a new campaign on another system opens fresh accounts, and switching
back finds the old money exactly where it was. On the first start after updating, every
player's current balance, debt and bonuses are copied into each system they have a
character in, so nothing looks different in any existing game. A full copy of the
database is saved beside it first (when the disk has room), and the old bank records are
kept untouched.

- **Each game system keeps its own token health.** A token's HP, armor and injuries now belong
to the game being played: switching systems puts one game's values away and brings the
other's back, and a character who has never been in that game starts fresh. On the first
start after updating, every token's current values are saved for each system it could be
shown in, so switching looks exactly as it does today for anyone with a character there.

- **The game system picker is a searchable list.** The row of system buttons in the admin
panel's GAME tab is now one dropdown: the built-in systems first, then any the GM has made,
with a search box and arrow keys. Choosing a different system now asks first, since it
changes the game for everyone online.

- **The heart monitor's beat follows how hurt someone is.** Its color always changed as a
character was hurt; now its rhythm does too. It stays steady over half health, beats twice as
fast at half or less, and turns fast, uneven and weak at a quarter or less, before the
flatline. It still shows no numbers, in the HEALTH folder and on the stream overlay alike. With
reduced motion turned on in the system settings, the trace holds still but keeps its shape.

### Security

- **Players can no longer use the GM's tools.** A player's own login worked as a key to the GM's
side of the server: with the right request, a signed-in player could delete buildings, edit the
map, read GM notes, approve accounts, reset passwords, set anyone's bank balance, give themselves
editor rights, or post in chat as anyone. Only the GM, and players the GM has granted editing
rights, can now do those things. Nothing a player normally does changes: their sheet, portrait,
chat, shops and bank all work as before, and granting, revoking and giving back editor rights
work as before.

- **Editor rights go only to the player receiving them.** Granting editor rights, or approving an
edit request, used to send the new editor's key to every connected player, and any of them
could copy it. It now reaches only the player being promoted. Approving, denying and ending an
edit request were also open to anyone: a player could approve their own request. Those buttons
now work only for the GM and granted editors, as they appear in the admin panel.

### Under the hood

- **A custom system's words reach the initiative tracker and the dice log.** START, JOIN and END
INITIATIVE, the INIT score, the turn counter and the dice log's "rolled INITIATIVE" lines use the
words a custom system's GM chose for initiative and the turn. The built-in systems keep their
wording exactly, ROUND and PASS included. The first tracker's 1d20 roll window, which nothing
had opened since players began joining from the tracker itself in July, was removed.

- **A custom system's words reach the shops and the bank button.** The shop's messages, receipt
and refusals, the steps for stocking an empty shop, and the SHOP, VIEW_BANK and SHOP_CATALOGUES
buttons use the words a custom system's GM chose for shops, money, the bank, the GM and
characters: a game that calls its shops MERCHANTS says "NOTHING HERE THIS MERCHANT WOULD BUY".
A term the system did not rename keeps today's text, and the built-in systems are unchanged.
Custom systems get shops of their own in a later piece.

- **A custom system's words show on the sheet, the token window and the HEALTH folder.** When the
GM who built a custom system gives hit points, the character, the GM or initiative a name of
their own, those places use it: a game that calls hit points VIGOR shows VIGOR where HIT_POINTS
was. A term it did not rename keeps today's text. Nothing changes for the built-in systems, and
no custom system can be made yet.

- **Custom game systems can rename the app's words.** A system's own words for terms such as HP,
credits, level and GM now reach every window, ready for the windows to use them. Nothing on
screen changes yet, and the built-in systems keep their wording exactly.

- **Custom game systems can be shared as files.** A published system exports as one readable
`.citysys` file, and installs on another server after a preview that changes nothing: as a new
system, an update, or a second copy beside it. It is never merged, and a file never carries
characters. Deleting a custom system now hides it instead, so reinstalling its file brings it
back with every character played in it.

- **Custom game systems choose how health works.** Creating one asks how its core works: the
health model (one pool, two tracks, damage types, harm levels, a wound count, hit locations, or
none), how characters advance, its common dice and its unit of distance. Each health model
takes damage by its own rules and has its own HEALTH folder, and other players still see a
description, never a number. The built-in systems' health is unchanged.

- **Custom game systems can keep fields for the GM, and give NPCs their own stat blocks.** A
player sees a GM-only field, such as XP or an awarded item, but cannot change it, including by
uploading a sheet. NPCs can have a shorter layout and power tiers for GENERATE_SHEET.

- **A published custom game system can run the game.** It appears in the game system picker
beside the built-in ones, players' sheets are drawn from its own layout by the same sheet
window, and its derived values are worked out on every save. Players' browsers receive the
sheet's layout and wording, never its formulas. There is no editor for building one yet.

- **Custom game systems can be stored.** Each one keeps a draft the GM edits and a published
copy a game would run. A draft can be saved half-built, but it cannot be published until
its problems are fixed, and the system a game is running cannot be deleted. Only the main
admin can reach any of it, and nothing in the game uses these yet.

- **The first piece of the system builder.** An engine that works out a sheet's derived
values (modifiers, saves, maximums) from a written description instead of code, with a
safe formula language that can only do arithmetic. It is not switched on for anything:
every sheet is still worked out exactly as before. It is proven by restating CWN's and
Shadowrun's derived values as data and checking the results match the existing code on
thousands of generated sheets.

---

## [1.14.4] - 2026-09-29

NPC sheets and hidden faces stay with the GM.
Expand Down
Loading
Loading