Back to Black Site Map Editor
SOURCE / PINNED RELEASE

Made of little things.

Black Site Map Editor

Release
32a57733b7e9…
Author-recorded commit
3f54890f542f…
License
LICENSE
Author’s source reference
nostr://npub1ye5ptcxfyyxl5vjvdjar2ua3f0hynkjzpx552mu5snj3qmx5pzjscpknpr/wss%3A%2F%2Fgit.shakespeare.diy%2F/black-site-map-editor

Archive hash verified: 7a4b1abbac7db5b0…. The source-to-build association is the author’s claim; it has not been independently rebuilt.

src/friendly-error.ts
/** Translate validator and service errors into player language. */
export function friendlyError(error: unknown): string {
    const message = error instanceof Error ? error.message : String(error);
    if (/no walkable route/i.test(message)) return 'Clear a path from insertion to extraction.';
    if (/blocked tile/i.test(message))
        return 'Move insertion, extraction, guards or caches onto open ground.';
    if (/Resize would clip/i.test(message))
        return 'Move objects inside the new map size before resizing.';
    if (/door.*(perimeter|edge)|perimeter.*door/i.test(message))
        return 'Place doors on the outside edge of the building.';
    if (/hash|sha256|bytes differ|size mismatch|integrity/i.test(message))
        return 'The map file could not be verified. Try opening it again.';
    if (/map ID|published map keeps its ID/i.test(message))
        return 'This map cannot be shared as a new map. Choose New or Remix to make a separate version.';
    if (/^name:/.test(message)) return 'Give your map a name of up to 32 characters.';
    if (/^desc:/.test(message)) return 'Keep the briefing within 200 characters.';
    if (/^size:/.test(message))
        return 'Map width and height must each be between 16 and 256 tiles.';
    if (/outside the|corners must be ordered/i.test(message))
        return 'Keep the selected object inside the map and check its size.';
    if (
        /^(?:start|exfil|theme|id|water|paved|roads|walls|buildings|containers|tanks|pipes|crates|wrecks|sandbags|enemies|caches)[.:]/.test(
            message,
        )
    )
        return 'Check the map settings and object positions before continuing.';
    if (
        /^(?:map|format|version)[.:]|\b(schema|JSON)\b|\[\d+\]|must be (an? |one of)|unknown (field|property)/i.test(
            message,
        )
    )
        return 'Some map settings are not valid. Check positions and sizes, or choose another map file.';
    if (/intent|convention|routing|payload|relay hint/i.test(message))
        return 'This map request could not be opened. Try opening it from Maps.';
    if (/OUTBOX|RESOURCE|NAP-|35858|Blossom|application\/json|upload rail|domain/i.test(message))
        return 'This service could not complete the request. Your map is still open; save a draft and try again.';
    if (/\b(seed|clutter|extraEnemies|extraCaches|generate|spawns)\b/i.test(message))
        return 'Check the extra scenery and enemy settings. Use whole numbers within the limits shown.';
    if (/public key|hex/i.test(message)) return 'Choose a player from Community maps.';
    return message;
}