From c8a2da7f174dd16e600477dad51369a73f4804c2 Mon Sep 17 00:00:00 2001 From: Tim Evans Date: Tue, 2 Jun 2026 15:23:28 +0100 Subject: [PATCH] feat: add LevelDB compendium packs (armors, drugs, ebb formulae, specialties) --- build-packs.mjs | 108 +++++++++++++++++++++++++ packs/sla-armors/000003.log | Bin 0 -> 3924 bytes packs/sla-armors/CURRENT | 1 + packs/sla-armors/LOCK | 0 packs/sla-armors/LOG | 1 + packs/sla-armors/MANIFEST-000001 | Bin 0 -> 41 bytes packs/sla-armors/MANIFEST-000002 | Bin 0 -> 50 bytes packs/sla-drugs/000003.log | Bin 0 -> 10703 bytes packs/sla-drugs/CURRENT | 1 + packs/sla-drugs/LOCK | 0 packs/sla-drugs/LOG | 1 + packs/sla-drugs/MANIFEST-000001 | Bin 0 -> 41 bytes packs/sla-drugs/MANIFEST-000002 | Bin 0 -> 50 bytes packs/sla-ebb-formulae/000003.log | Bin 0 -> 29397 bytes packs/sla-ebb-formulae/CURRENT | 1 + packs/sla-ebb-formulae/LOCK | 0 packs/sla-ebb-formulae/LOG | 1 + packs/sla-ebb-formulae/MANIFEST-000001 | Bin 0 -> 41 bytes packs/sla-ebb-formulae/MANIFEST-000002 | Bin 0 -> 50 bytes packs/sla-specialties/000003.log | Bin 0 -> 13091 bytes packs/sla-specialties/CURRENT | 1 + packs/sla-specialties/LOCK | 0 packs/sla-specialties/LOG | 1 + packs/sla-specialties/MANIFEST-000001 | Bin 0 -> 41 bytes packs/sla-specialties/MANIFEST-000002 | Bin 0 -> 50 bytes system.json | 30 +++++++ 26 files changed, 146 insertions(+) create mode 100644 build-packs.mjs create mode 100644 packs/sla-armors/000003.log create mode 100644 packs/sla-armors/CURRENT create mode 100644 packs/sla-armors/LOCK create mode 100644 packs/sla-armors/LOG create mode 100644 packs/sla-armors/MANIFEST-000001 create mode 100644 packs/sla-armors/MANIFEST-000002 create mode 100644 packs/sla-drugs/000003.log create mode 100644 packs/sla-drugs/CURRENT create mode 100644 packs/sla-drugs/LOCK create mode 100644 packs/sla-drugs/LOG create mode 100644 packs/sla-drugs/MANIFEST-000001 create mode 100644 packs/sla-drugs/MANIFEST-000002 create mode 100644 packs/sla-ebb-formulae/000003.log create mode 100644 packs/sla-ebb-formulae/CURRENT create mode 100644 packs/sla-ebb-formulae/LOCK create mode 100644 packs/sla-ebb-formulae/LOG create mode 100644 packs/sla-ebb-formulae/MANIFEST-000001 create mode 100644 packs/sla-ebb-formulae/MANIFEST-000002 create mode 100644 packs/sla-specialties/000003.log create mode 100644 packs/sla-specialties/CURRENT create mode 100644 packs/sla-specialties/LOCK create mode 100644 packs/sla-specialties/LOG create mode 100644 packs/sla-specialties/MANIFEST-000001 create mode 100644 packs/sla-specialties/MANIFEST-000002 diff --git a/build-packs.mjs b/build-packs.mjs new file mode 100644 index 0000000..092ec19 --- /dev/null +++ b/build-packs.mjs @@ -0,0 +1,108 @@ +/** + * build-packs.mjs + * Converts JSON source files in /packs/ into Foundry v14 LevelDB compendium packs. + * + * Usage: node build-packs.mjs + * + * To add new items: edit the relevant JSON file in /packs/, then re-run this script + * and push to GitHub. Foundry will pick up the new items on next install/update. + */ + +import { ClassicLevel } from 'classic-level'; +import { readFileSync, rmSync, existsSync } from 'fs'; +import { join, dirname } from 'path'; +import { fileURLToPath } from 'url'; +import { randomBytes } from 'crypto'; + +const __dir = dirname(fileURLToPath(import.meta.url)); + +/** Generate a Foundry-style 16-char alphanumeric ID */ +function makeId() { + const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; + let id = ''; + const bytes = randomBytes(16); + for (const b of bytes) id += chars[b % chars.length]; + return id; +} + +/** + * Write an array of item objects into a Foundry LevelDB pack directory. + * @param {string} packDir - absolute path to the pack folder (will be wiped & recreated) + * @param {object[]} items - array of Foundry item documents (name, type, img, system) + */ +async function buildPack(packDir, items) { + // Wipe existing pack so we get a clean rebuild + if (existsSync(packDir)) { + rmSync(packDir, { recursive: true, force: true }); + } + + const db = new ClassicLevel(packDir, { keyEncoding: 'utf8', valueEncoding: 'utf8' }); + + for (const item of items) { + const id = makeId(); + const doc = { + _id: id, + name: item.name, + type: item.type, + img: item.img ?? 'icons/svg/item-bag.svg', + system: item.system ?? {}, + effects: [], + flags: {}, + folder: null, + sort: 0, + ownership: { default: 0 }, + _stats: { + systemId: 'zero-engine', + systemVersion: '1.3.0-dev', + coreVersion: '14.359', + createdTime: Date.now(), + modifiedTime: Date.now(), + lastModifiedBy: 'builder' + } + }; + await db.put(`!items!${id}`, JSON.stringify(doc)); + } + + await db.close(); + console.log(` ✓ ${items.length} items → ${packDir.replace(__dir, '.')}`); +} + +// ── Pack definitions ───────────────────────────────────────────────────────── +// Each entry: { id, label, source JSON file } +// To add a new pack: add an entry here and create the matching JSON source file. + +const PACKS = [ + { + id: 'sla-armors', + label: 'SLA Armors', + source: 'packs/armors.json', + }, + { + id: 'sla-drugs', + label: 'SLA Drugs & Consumables', + source: 'packs/drugs.json', + }, + { + id: 'sla-ebb-formulae', + label: 'SLA Ebb Formulae', + source: 'packs/ebb-formulae.json', + }, + { + id: 'sla-specialties', + label: 'SLA Specialties', + source: 'packs/specialties.json', + }, +]; + +// ── Run ────────────────────────────────────────────────────────────────────── +console.log('Building SLA Zero Engine compendium packs…\n'); + +for (const pack of PACKS) { + const sourcePath = join(__dir, pack.source); + const destDir = join(__dir, 'packs', pack.id); + const items = JSON.parse(readFileSync(sourcePath, 'utf8')); + console.log(`Building: ${pack.label} (${items.length} items)`); + await buildPack(destDir, items); +} + +console.log('\nDone. Re-run this script any time you update a source JSON file.'); diff --git a/packs/sla-armors/000003.log b/packs/sla-armors/000003.log new file mode 100644 index 0000000000000000000000000000000000000000..6eaec180c5a1543e6cc89834df7dc8c41dcc71d2 GIT binary patch literal 3924 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 O*wDIY<@uL0*ZdDyg$w5Z literal 0 HcmV?d00001 diff --git a/packs/sla-drugs/CURRENT b/packs/sla-drugs/CURRENT new file mode 100644 index 0000000..1a84852 --- /dev/null +++ b/packs/sla-drugs/CURRENT @@ -0,0 +1 @@ +MANIFEST-000002 diff --git a/packs/sla-drugs/LOCK b/packs/sla-drugs/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/packs/sla-drugs/LOG b/packs/sla-drugs/LOG new file mode 100644 index 0000000..3defcd3 --- /dev/null +++ b/packs/sla-drugs/LOG @@ -0,0 +1 @@ +2026/06/02-14:23:08.439934 faef77ffefa0 Delete type=3 #1 diff --git a/packs/sla-drugs/MANIFEST-000001 b/packs/sla-drugs/MANIFEST-000001 new file mode 100644 index 0000000000000000000000000000000000000000..18e5cab72c1550d8dc398e3413eea91bee24db77 GIT binary patch literal 41 wcmbPQv-7AD10$nUPHI_dPD+xVQ)NkNd1i5{bAE0?Vo_pAei0J`GZPB~05;AINdN!< literal 0 HcmV?d00001 diff --git a/packs/sla-drugs/MANIFEST-000002 b/packs/sla-drugs/MANIFEST-000002 new file mode 100644 index 0000000000000000000000000000000000000000..bbbc585686bcbcc33686059c69d80b7b4e1291cd GIT binary patch literal 50 zcmWIhx#Ncn10$nUPHI_dPD+xVQ)NkNd1i5{bAE0?Vo_pAe$kRS-TOEg7@3$k8JJmE F7y#sj5K{mE literal 0 HcmV?d00001 diff --git a/packs/sla-ebb-formulae/000003.log b/packs/sla-ebb-formulae/000003.log new file mode 100644 index 0000000000000000000000000000000000000000..a317cf7c7c3004bfd33e994ab8350936c17233c9 GIT binary patch literal 29397 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