World map and portals
repo: land-of-lor (game + director) and this workspace (site/) · depends on: server-architecture · updated 2026-08-18
What this is
Defined by Kris by voice on 2026-08-12, alongside accounts (server-architecture/010),
as the next significant build after the interface pass landed.
The world is organised into discrete areas — Kris’s working word is rooms, naming still open — linked to each other by portals. The public part of that graph is a shared, published thing: a village of Lor with portals out to a beginner battle arena, to the Badlands (desert), and onward. Every player also has a private part: their own home area, and portals to their friends’ realms. Both parts are one map with two layers, not two separate maps.
The map is a first-class artefact, not a UI convenience. Kris wants it in two places:
- On the public website, standalone — something people can look at without playing, showing how the world hangs together. A server picker sits above it, because there will be more than one server.
- In the game, reachable from the interface, showing the same public graph plus the player’s own private layer.
Kris has drawn a paper sketch of the Lor map. It is not yet in the repo — it needs to be photographed and added before the visual design of either surface is settled; the sketch is the source of truth for the initial public topology, not anything an agent invents.
Superseded, 2026-08-15. The sketch was never photographed in, and it is no longer
blocking: Kris commissioned the map’s design instead (three handoffs and two .dc.html
mocks, in land-of-lor/docs/design/ClaudeDesignWorldMapBrief/), and its nine-area world —
Village of Lor, Market Stalls, Beginner Arena, The Badlands, Deep Cut, Wizard Battle Pit,
and three private homes — is the starting topology, now authored in
land-of-lor/game/content/spellgrove.world.json. If the sketch turns up it becomes an edit
in the world editor, not a rebuild.
Why it exists as its own epic
It sits across three existing epics without belonging to any of them: server-architecture
owns the transport and the authoritative state, public-site-and-comms owns the website,
world-traversal-and-ground owns what the ground under your feet is made of. None of them
owns the shape of the world at the scale of areas — which areas exist, what links them,
what rules each one imposes, and how a player reads that at a glance. That’s this epic.
The substrate that already exists
This is not a green field. The multiplayer work adopted into land-of-lor/game/ already
carries most of the primitives, and any plan should build on them rather than re-invent:
worldstable (game/director/src/schema.sql) — id, name,owner_id, a JSONB snapshot blob,last_played_at. An “area” is a world row today.world_members— membership as an explicit whitelist, owner included. This is already the mechanism for “my realm, and the friends I let in.”- Portals are implemented, not hypothetical:
PortalConfigSchema/SetWorldPortalsRequest(which grid cells are portals and where each leads) and theportal_transfer_*control messages that move an entity between world processes via Postgres, carrying its full state and a spawn token. Seegame/director/src/protocol.ts. - A public commons world —
JoinPublicWorldRequestfinds-or-creates it and auto-members the caller, so strangers land in the same place.
So the graph the map draws is, structurally, worlds as nodes and portal configs as
directed edges. What’s missing is: the graph is currently a test-scoped configuration
detail, not a designed, named, rule-bearing thing anybody can look at.
The offline requirement — stated now, deliberately
Kris’s explicit call, 2026-08-12: the finished game must be playable offline. He recognises it is probably not achievable on the current build, and is stating it now anyway so that nothing gets architected in a way that forecloses it.
Offline play does not mean the same game with the network removed. Shared areas are inherently unavailable offline, and resource rules may have to differ. But that is not a special case bolted on later — it belongs to a broader principle Kris raised in the same breath: different areas already impose different rules. A battle arena, for example, probably won’t let you bring your whole inventory in. Once “an area carries its own rule set” is a real, designed concept, “offline” becomes one more rule set rather than a second codebase.
Open, and deliberately not decided here: what happens to resources gathered offline, and
whether offline progress reconciles with the server on reconnect. The worlds table
already carries last_played_at from day one specifically to keep offline progression
possible without a migration.
Scope
- Naming the concept (“rooms”? areas? realms?) and settling it.
- The area/portal graph model: what an area is as a designed object, what rules it can carry, how portals are authored rather than test-configured.
- The public topology, from Kris’s sketch.
- The public/private split: home areas, friends’ realms, who can see what on whose map.
- Multiple servers, and what a server means to a player choosing one from a dropdown.
- Two rendering surfaces (site page, in-game screen) from one source of truth.
- Offline play as a stated end-state requirement that the model must not foreclose.
Non-goals
- Not accounts and login — that’s
server-architecture/010, which this epic depends on for any personal/private map to mean anything. - Not ground types or moment-to-moment traversal within an area — that’s
world-traversal-and-ground. - Not building offline play now. Stating it as a requirement, and not blocking it.
Key open questions
- What are areas called? (Kris: “rooms for now.”)
- Is the map authored (a designed, hand-laid topology) or derived (drawn from whatever
worlds+ portal rows happen to exist)? This is the single biggest fork for both surfaces, and it decides whether the site page is a static asset or a live view. - What does a “server” mean to a player — a shard with its own worlds and its own population, or something lighter?
- What does the private layer reveal? Do you see a friend’s realm on your map before they’ve let you in?
Status
1 backlog15 done
Next: All built work signed off 2026-08-18. Only 008 (players stacking on the arrival cell) remains, in backlog until player collision exists.
Tasks (16)
backlog (1)
-
world-map-and-portals/008— Players pile up on the cell they arrive at (priority 3, estimate M )
done (15)
-
world-map-and-portals/001— Spec the world graph — areas, portals, per-area rules, and the public/private split (priority 1, estimate L ) -
world-map-and-portals/003— Areas and Portals in the database, and travel between them unblocked (priority 1, estimate L ) -
world-map-and-portals/004— Portals you can see and walk through, and a 3D object at every one (priority 1, estimate M ) -
world-map-and-portals/009— Homes connect to the world, and the game gets a way out of itself (priority 1, estimate L ) -
world-map-and-portals/010— What playing it actually found — starting at home, closed doors, a keyboard on iPad, and the builds nobody had shipped (priority 1, estimate L ) -
world-map-and-portals/012— The door that went nowhere — a portal frame lost to the disconnect behind it, the test map that flashed on every launch, and your own home missing from your own map (priority 1, estimate M ) -
world-map-and-portals/013— Meeting yourself in the Badlands — one account, one body, per world (priority 1, estimate S ) -
world-map-and-portals/014— One body everywhere — entity ids move from the world to the account, and the on-screen keyboard finally runs at all (priority 1, estimate M ) -
world-map-and-portals/015— "World" means Area — the rename the schema promised, across protocol, database, GDScript and docs (priority 1, estimate L ) -
world-map-and-portals/016— The player who wasn't there — a phone in the background keeps walking against a socket that died in silence (priority 1, estimate M ) -
world-map-and-portals/002— The two map surfaces — a standalone map page on the website and a map screen in the game (priority 2, estimate L ) -
world-map-and-portals/005— The authored world of Spellgrove, its loader, and the public map endpoint (priority 2, estimate M ) -
world-map-and-portals/006— The two map surfaces — the public site page and the in-game screen (priority 2, estimate M ) -
world-map-and-portals/011— Seeing where you are — a readable Area name, "You are here" on the world map, pinch zoom, and the identity chip off the title screen (priority 2, estimate S ) -
world-map-and-portals/007— The entity class restructure — ComplexItem, LivingCreature, Player (priority 3, estimate M )
Ask an agent about this epic
Paste your AI Task Runner API key once. It stays in this browser and is sent only to kris.ai-task-runner.com.
Also available as raw markdown.