Skip to content

Project outputs

A build writes everything under outDir — dist/ by default. Every file there is derived: rewritten on every build, never edited, never committed. Most are for the tools that pack a project into the game and for the server that talks to it. Four are for you.

Every warning the last build raised, one line each, file and line and code, with duplicates removed. A warning that scrolled past the terminal is here. Empty on a clean build.

For every interface the game does not load entirely as data, one line naming the interface and the reason: docs-quest-log -> a component prop that is not a constant. Written on every build.

The entry points: every interface the project declares, by name and number, with the components the game loads as data — their positions, sizes and properties. The number beside each name moves whenever an interface is added or renamed.

Every state cell by its qualified name — /settings#zoom — and the slot it was given. Open it to learn which slot a cell landed in when something outside the build must set or read it. Persisted cells keep their slots through the registry; session cells are numbered fresh each build.

One pair of files per function the build wrote out — every component, every handler, every helper, and the ones the build made for itself: <name>.cs2 is the readable form, <name>.bin the form the game loads.

Two tables from name to number. scripts.json covers every function under scripts/, including the ones the build made, keyed by the file name. symbols.json covers only what something outside the build can name — a component, an exported function — keyed by qualified name (/armoury#Cell). Packing uses the first to place every function; the server and the frame use the second to call one.

How to call each exported function from outside the build: its name, its parameters in order, and what each parameter becomes when the call is made. This is the contract a server reads to invoke a server entry point. It names functions, never numbers: a caller resolves the name through scripts.json when it loads, because the numbers move.

The state slots the game must know about before an interface can use them, and which of them persist. Packing reads it; you never do.

collections.json, db-tables.json and db-rows.json

Section titled “collections.json, db-tables.json and db-rows.json”

Every list and map declared with listOf and mapOf, with its entries; and for a collection of records, the table behind it — one column per field — and its rows. Packing writes them into the game’s data. Open collections.json to check what a build packed for a declaration when a read draws something you did not write.

Every enum marked @wire: the values ts2 authored that cross the wire, by member name, for the server’s build to turn into constants. Written on every build, empty or not. See Server entry points.

Every module-scope ref this build bound, by qualified name, and the component it resolved to. A folder of a workspace names this file as its externalRefs to compile alone against the full build’s answers.

What the client runs by name and which assets it loads, from the project’s defineEngineHooks declaration — written on every rift-extended build, declaration or not. See Engine hooks.

Every named static slot: the interface it is in, its number and its position. It is how the server and other interfaces address a slot to open something into. See Interfaces and slots.

Every value the project reads from the game — a game variable, a skill, a container, a shared cell — and the values the source compares it against. For a tool that drives a panel through its states; nothing in the game reads it.

One hash of every file the build read and the environment it read them in. A tool that wants to know whether dist/ still describes the tree compares this against a fresh computation instead of building again.

The persisted-state registry, ts2-state.lock.json, is written beside the sources rather than into dist/; commit it. See The state registry.