The data half of the extraction: 8 model directories, 13 utils, the shard
stream catalog and the 27-table schema fragment with its purge.
server/core.js is what makes the port a one-line import change per file rather
than a signature change per function. Ported code requires its dependencies at
file scope -- `const { query } = require('../../core')` -- which runs before
register() has been called and before any ctx exists. So every member is a
stable function that resolves ctx when CALLED, and nothing may be destructured
off ctx at init either, because core is free to hand over a getter.
Two helpers are vendored rather than taken from ctx, and the line between them
is the point. utils/excerpt.js is core's deriveExcerpt -- nine lines of pure
text handling. Core's sanitiser next to it was NOT copied: a second copy of a
security control diverges silently the moment either is fixed. announceLinks.js
vendors legError and articleUrl the same way, but baseUrl could not be: core's
reads APP_BASE_URL, and §2.7 forbids a module reading core's environment, so it
comes off ctx.site.baseUrl.
The schema fragment is core's 27 shard_*/uo_link_* statements, verbs CREATE,
ALTER and UPDATE only, every CREATE TABLE guarded. Two of its tables carry a
foreign key INTO users, which is allowed and is why the replay order matters --
core's schema is in place before this runs. The reverse never occurs and must
not: it would make core unable to boot without a module installed.
One real port bug caught by the integration run, not by tests: the atlas art
map resolved `../../../db/data`, which pointed at core's tree when this file
lived there and points outside server/ now. A path that happens to resolve is
exactly what survives a green suite, because the absent-file branch returns {}
and looks like the normal case.
Co-Authored-By: Claude <noreply@anthropic.com>
25 lines
1.2 KiB
JSON
25 lines
1.2 KiB
JSON
{
|
|
"_comment": [
|
|
"OPTIONAL operator-supplied creature art for the spawn atlas. Copy this file to",
|
|
"spawnAtlas.art.json (same directory) and edit it, then restart the server or run",
|
|
"`npm run atlas:import` — the art map is read on every atlas refresh.",
|
|
"",
|
|
"This project ships NO creature artwork and never will. UO sprites live in your",
|
|
"own client's .mul/.uop files and are yours to extract, not ours to redistribute.",
|
|
"If you want art on the atlas pages, export it yourself (UOFiddler, ClassicUO's",
|
|
"tooling, or any art extractor), drop the images under server/uploads/atlas/, and",
|
|
"map each creature slug to its file name here.",
|
|
"",
|
|
"Both spawnAtlas.art.json and server/uploads/ are gitignored, so neither the map",
|
|
"nor the images can be committed by accident.",
|
|
"",
|
|
"Keys are creature slugs, as reported by the atlas API and derived from the type",
|
|
"names in your own shard's Spawns/*.xml. Values are file names relative to",
|
|
"server/uploads/atlas/. Any creature with no entry here simply renders without",
|
|
"art — that is the default and fully supported state, not a degraded one."
|
|
],
|
|
"lizardman": "lizardman.png",
|
|
"orc": "orc.png",
|
|
"dragon": "dragon.png"
|
|
}
|