b8332b697d
ci / verify (push) Successful in 49s
Audited the whole set rather than appending to it, and the two files a fresh session reads first were both wrong. README claimed the emergency escape takes three seconds and is CANCELLED BY DAMAGE. It takes one, and damage explicitly does not interrupt it -- that is a settled decision with its own entry in DECISIONS.md, and the front page said the opposite. It also described one stationary boss, one hub portal, and none of characters, permadeath, levels, inventory, loot, upgrades, settings or credits. Rewritten, with the "not ready for the internet" warning made explicit. ROADMAP had no "what is next" at all: every stage reads *done*, which for a cold start is a dead end. It opens with where things stand and a table of candidates -- auth, a reason to play past level 15, an economy, hit feedback, replacing the non-redistributable packs, DTLS -- each with what blocks it, and says plainly that the user has chosen none of them. Open questions renumbered from the orphaned 8-11 they were left at, with the solved one dropped and three real ones added. ARCHITECTURE's file map listed two files twice, missed five subsystems (upgrades, stats, poison, settings, credits, the UI theme), and still said MapGen.build() is "the entry point both sides use" -- it is server-only, and the whole anti-map-hack story depends on that. Rebuilt by layer and audited against the tree: every path listed exists, and every one of the 64 source files is covered. CLAUDE.md's security paragraph said a client can send "exactly two things" plus two roster requests. There are five client -> server messages. That number is the security model, so it is now a table naming each one and what it carries. Also records that nothing automated can see the screen. Smaller: a stale 156/156 test count in ASSETS.md, and test counts refreshed to 468 where they are quoted. check.sh clean, 468 tests, SMOKE PASS, all four diagnostics green, no broken internal links. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
63 lines
3.7 KiB
Markdown
63 lines
3.7 KiB
Markdown
# Transcience
|
||
|
||
Top-down twin-stick bullet-hell with a dedicated, server-authoritative backend.
|
||
Godot 4.7, GDScript, no external runtime dependencies.
|
||
|
||
## Play
|
||
|
||
```bash
|
||
tools/server.sh # dedicated server on :27015
|
||
tools/client.sh --join --name ada # connect a client
|
||
```
|
||
|
||
Or run one client and press **Host and play** for a listen server.
|
||
|
||
**Controls** — WASD move, mouse aim, LMB fire, **E** to pick up loot and to use
|
||
the hub's portals and quartermaster, **1–4** use an inventory slot, **shift+1–4**
|
||
drop one, **hold F** for one second to escape a dungeon, **Esc** menu, **F1**
|
||
hitbox overlay. Every one of those is rebindable in Settings.
|
||
|
||
## What is here
|
||
|
||
| | |
|
||
| --- | --- |
|
||
| **Twin-stick bullet hell** | Server-simulated bullet field, ~300 concurrent bullets at 0.28 ms/tick — around 60x headroom against the 60 Hz budget. |
|
||
| **Authoritative multiplayer** | Clients send input and nothing else. Hits, damage, death, loot, upgrades and instance transfers are all server decisions. Prediction and reconciliation for the local player. |
|
||
| **Enemies** | Five readable movements (static, drift, orbit, approach, strafe) composed with bullet emitters. Nothing deals contact damage; every threat is a bullet you can see. |
|
||
| **Two bosses** | The Warden of the Fold stands still through four phases. The Cantor of the Vault walks a circuit, chases, orbits, and marks the floor before it strikes. Both are pure data. |
|
||
| **Three dungeons** | Two real runs, one per boss, plus a Proving Grounds: the same content at a fraction of the health and ten times the drop rate, for testing by hand. |
|
||
| **Characters** | Up to five living per account, permadeath, levels 1–15, experience shared across the party undivided. |
|
||
| **Inventory and loot** | Four slots, always on screen. Loot is either world-shared or instanced per player, and the instanced kind is filtered on the wire rather than hidden in the client. |
|
||
| **Upgrades** | Seven, drawn three at a time and spent at a hub NPC. Damage, fire rate, extra projectiles, splitting, poison, and a legendary that deletes enemy bullets. |
|
||
| **Emergency escape** | A one-second channel back to the hub that damage does **not** interrupt — because if it did, quitting the process would be the better escape. Dropping your connection runs the same channel. |
|
||
| **Settings** | Rebindable controls and volumes, and an in-game credits screen. |
|
||
|
||
## Develop
|
||
|
||
```bash
|
||
tools/check.sh # parse-check every script ~5s
|
||
tools/test.sh # 468 GUT tests, headless ~4s
|
||
tools/smoke.sh # server + 4 bot clients over ENet ~40s
|
||
```
|
||
|
||
Read [CLAUDE.md](CLAUDE.md) first — it is short, and the Godot CLI gotchas in it
|
||
will otherwise cost an afternoon.
|
||
|
||
## Docs
|
||
|
||
- [docs/ROADMAP.md](docs/ROADMAP.md) — what is built, what is next, where each feature lives
|
||
- [docs/DECISIONS.md](docs/DECISIONS.md) — settled design decisions and their reasoning
|
||
- [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md) — code map and the node-free simulation
|
||
- [docs/NETCODE.md](docs/NETCODE.md) — replication model, hit validation, known gaps
|
||
- [docs/WORKFLOW.md](docs/WORKFLOW.md) — agent-assisted Godot development, and the verification traps this project has actually hit
|
||
- [docs/ASSETS.md](docs/ASSETS.md) — asset packs and their licence findings
|
||
- [CREDITS.md](CREDITS.md) — third-party attribution
|
||
- [CLAUDE.md](CLAUDE.md) — commands, invariants, Godot CLI gotchas
|
||
|
||
## Not ready for the internet
|
||
|
||
`LocalAuthProvider` lets any client claim any account id. It exists to have the
|
||
same shape as Steamworks so swapping is one class, and it must be replaced
|
||
before this is reachable from anywhere untrusted. There is no transport
|
||
encryption either. See [docs/ROADMAP.md](docs/ROADMAP.md).
|