diff --git a/.gitignore b/.gitignore index de4d1f00..5fd8e736 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ dist node_modules +src/packs/__source diff --git a/.idea/DSA41.iml b/.idea/DSA41.iml index 24643cc3..eb3c237b 100644 --- a/.idea/DSA41.iml +++ b/.idea/DSA41.iml @@ -5,8 +5,10 @@ + + - \ No newline at end of file + diff --git a/gulpfile.mjs b/gulpfile.mjs index 12992de4..9bf1cc29 100644 --- a/gulpfile.mjs +++ b/gulpfile.mjs @@ -1,23 +1,70 @@ import {dest, series, src} from 'gulp'; import process from 'node:process'; import replace from 'gulp-replace'; - +import {getRandomValues} from 'node:crypto'; import * as dartSass from 'sass'; import gulpSass from 'gulp-sass'; import {deleteAsync} from 'del'; - -import {readdirSync} from 'node:fs'; +import {readdirSync, readFileSync, writeFileSync, rmdirSync, existsSync, mkdirSync} from "fs"; import {join} from 'node:path'; import {compilePack} from '@foundryvtt/foundryvtt-cli'; const sass = gulpSass(dartSass); + +/** + * Generate a random alphanumeric string ID of a given requested length using `crypto.getRandomValues()`. + * @param {number} length The length of the random string to generate, which must be at most 16384. + * @returns {string} A string containing random letters (A-Z, a-z) and numbers (0-9). + */ +function randomID(length = 16) { + const chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; + const cutoff = 0x100000000 - (0x100000000 % chars.length); + const random = new Uint32Array(length); + do { + getRandomValues(random); + } while (random.some(x => x >= cutoff)); + let id = ""; + for (let i = 0; i < length; i++) id += chars[random[i] % chars.length]; + return id; +} + +const convert = function (from, to, ofType) { + + const SOURCE = from; + const DEST = to; + const TYPE = ofType; + + try { + rmdirSync(DEST, {force: true, recursive: true}) + } catch (e) { + } + mkdirSync(DEST) + + readdirSync(SOURCE).forEach(file => { + let originalSource = JSON.parse(readFileSync(join(SOURCE, file), {encoding: "utf8"})); + let id = randomID(); + let targetSource = { + _id: id, + _key: "!items!" + id, + type: TYPE, + img: originalSource.image, + name: originalSource.name.trim(), + system: {...originalSource} + } + delete targetSource.system.image; + let target = JSON.stringify(targetSource, null, 2); + let newFileName = "./" + join(DEST, id + ".json"); + writeFileSync(newFileName, target, {encoding: "utf8"}); + }); + +} + function cleanDist() { return deleteAsync(['dist/**']); } - function buildStyles() { return src('src/style/**/*.scss') .pipe(sass().on('error', sass.logError)) @@ -40,6 +87,27 @@ function updateManifestFile() { .pipe(dest('dist/')) } +async function prepareDB() { + + try { + if (!existsSync("./src/packs/__source")) { + mkdirSync("./src/packs/__source"); + } + + convert("./src/packs/_source/talente", "./src/packs/__source/talente", "Skill"); + convert("./src/packs/_source/zauber", "./src/packs/__source/zauber", "Spell"); + convert("./src/packs/_source/vorteile", "./src/packs/__source/vorteile", "Advantage"); + convert("./src/packs/_source/waffen", "./src/packs/__source/waffen", "Equipment"); + convert("./src/packs/_source/munition", "./src/packs/__source/munition", "Equipment"); + convert("./src/packs/_source/ruestzeug", "./src/packs/__source/ruestzeug", "Equipment"); + convert("./src/packs/_source/liturgien-und-segnungen", "./src/packs/__source/liturgien", "Liturgy"); + + } catch (err) { + console.error(err); + } + +} + function buildDB() { // Determine which source folders to process @@ -68,6 +136,7 @@ export default series( copySource, copyAssets, buildStyles, + prepareDB, buildDB, updateManifestFile )