Initial commit

This commit is contained in:
Octoturge
2026-06-09 22:06:56 +02:00
commit fb42c6e8cc
121 changed files with 14976 additions and 0 deletions
+71
View File
@@ -0,0 +1,71 @@
/**
* World data migration runner. Compares stored `flags.hbm.lastMigratedVersion`
* against the system version and applies any pending migrations in order.
*
* Each migration module exports `run(): Promise<void>` and a numeric `targetVersion`
* (semver-style string). Migrations are idempotent.
*/
import { SYSTEM_ID } from '../hbm';
import { migration_0_2_0 } from './0.2.0';
import { migration_1_2_0 } from './1.2.0';
export interface MigrationStep {
version: string; // version this migration brings the world TO
description: string;
run: () => Promise<void>;
}
const MIGRATIONS: MigrationStep[] = [
migration_0_2_0,
migration_1_2_0,
];
function compareSemver(a: string, b: string): number {
const pa = a.split('.').map(Number);
const pb = b.split('.').map(Number);
for (let i = 0; i < 3; i++) {
const da = pa[i] ?? 0;
const db = pb[i] ?? 0;
if (da !== db) return da - db;
}
return 0;
}
export async function runPendingMigrations(): Promise<void> {
if (!game.user?.isGM) return;
const sys = game.system as unknown as { version: string };
const currentVersion = sys.version ?? '0.0.0';
const last = (game.settings.get(SYSTEM_ID, 'lastMigratedVersion') as string | undefined) ?? '0.0.0';
if (compareSemver(last, currentVersion) >= 0) {
return;
}
console.log(`${SYSTEM_ID} | Running migrations: ${last}${currentVersion}`);
for (const step of MIGRATIONS) {
if (compareSemver(last, step.version) < 0 && compareSemver(step.version, currentVersion) <= 0) {
console.log(`${SYSTEM_ID} | Migration ${step.version}: ${step.description}`);
try {
await step.run();
} catch (err) {
console.error(`${SYSTEM_ID} | Migration ${step.version} failed`, err);
ui.notifications?.error(`HbM migration ${step.version} failed — see console.`);
return;
}
}
}
await game.settings.set(SYSTEM_ID, 'lastMigratedVersion', currentVersion);
ui.notifications?.info(`HbM RPG v3 migrated to ${currentVersion}.`);
}
export function registerMigrationSettings(): void {
game.settings.register(SYSTEM_ID, 'lastMigratedVersion', {
name: 'Last migrated system version',
scope: 'world',
config: false,
type: String,
default: '0.0.0',
});
}