Add a second dungeon: the Proving Grounds, a test harness you walk into
ci / verify (push) Successful in 47s
ci / verify (push) Successful in 47s
Two labelled portals now stand side by side in the hub. The Proving Grounds runs the same generator, the same rooms, the same enemies and the same four-phase Warden -- enemies at a fifth health, the boss at 288 instead of 3600, and trash dropping potions 80% of the time instead of 8%. A manual pass over loot, the inventory, dropping and every boss phase takes a couple of minutes rather than a quarter of an hour. It is multipliers over the shared content rather than a parallel copy: a duplicated Content would drift the first time anything was tuned, and "identical but easier" would quietly stop being true. And it is a portal rather than a launch flag, so the two can be compared back to back without restarting the server -- which is most of the point. Which dungeon you enter is resolved from the player's server-side position, and PORTAL_USED carries the answer. There is deliberately no client message that names a dungeon: one would let any client ask for the generous loot table and bring the results back to the hub. Instance matching compares dungeon ids too, so walking into one entrance can never drop you into the other's run on timing alone. SimWorld.portals replaces portal_pos/portal_enabled, enter_instance carries the portal list and the dungeon id (the client needs the latter to scale the boss bar's ceiling the way the server scaled the boss), and Protocol.VERSION goes to 7. Also pins what happens when two players reach for one item on the same tick: exactly one gets it -- the loop is sequential and the pickup erases the entity before the next player looks. The tie-break is join order rather than distance, which is arbitrary rather than designed, so it is recorded as such. Stale doc fixed while here: MapGen.build() still claimed the client rebuilds the map from the seed, which has not been true since map streaming landed and is the opposite of the rule. check.sh clean, 288 tests, SMOKE PASS (18 assertions, both dungeon kinds opened over a real socket), all three diagnostics green. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -249,3 +249,34 @@ are all simpler for it. Add a count when something actually needs one.
|
||||
oldest evicted.** Dungeons close and take their litter with them, so only the
|
||||
hub — which never closes and where players can drop things — can realistically
|
||||
reach the cap.
|
||||
|
||||
---
|
||||
|
||||
## More than one dungeon
|
||||
|
||||
**A second dungeon is a set of multipliers over the shared content, not a
|
||||
parallel copy of it.** `DungeonDef` scales enemy health, boss health and loot
|
||||
chance; the generator, the rooms, the enemy mix and the boss are the same
|
||||
objects the real run uses. A duplicated `Content` would drift from the original
|
||||
the first time anything was tuned, and the whole value of the Proving Grounds is
|
||||
that it is *identical apart from the numbers*.
|
||||
|
||||
**It is reachable from the hub rather than hidden behind a launch flag.** A flag
|
||||
would need a server restart to switch, which makes comparing the two a chore
|
||||
and makes "does this behave the same in the real run?" a question nobody
|
||||
bothers to ask. Two portals a few metres apart makes it a five-second check.
|
||||
|
||||
**Which dungeon you enter is decided by where you are standing.** The portal is
|
||||
resolved server-side from the player's own position, and the `PORTAL_USED` event
|
||||
carries the answer. There is deliberately no client message that names a
|
||||
dungeon: one would let any client ask for the Proving Grounds' loot rate and
|
||||
walk out with it.
|
||||
|
||||
**The instance matcher compares dungeon ids.** A forming run only accepts party
|
||||
members who asked for that kind. Without it, walking into one entrance could
|
||||
drop you into the other's run purely on timing.
|
||||
|
||||
**Scaling clamps at both ends.** Health never scales below 1 — a creature with
|
||||
zero health is a crash waiting for a divide — and a boosted drop chance never
|
||||
exceeds certain, or the roll becomes dead code and "chance" stops meaning
|
||||
anything.
|
||||
|
||||
Reference in New Issue
Block a user