tarinai/scripts/achievement_save_metadata_audit.js
2026-07-15 16:27:56 +09:00

69 lines
2.1 KiB
JavaScript

"use strict";
const fs = require("fs");
const path = require("path");
const vm = require("vm");
const root = path.join(__dirname, "..");
const context = {
console,
Date,
Math,
JSON,
Object,
Array,
Map,
Set,
Uint8Array,
TextEncoder,
TextDecoder,
URLSearchParams,
performance,
location: { search: "" },
CompressionStream: undefined,
DecompressionStream: undefined,
TarinaiSnapshot: { version: 35 },
TarinaiSeedFactory: {
personalityArray() { return [100, 100, 100, 100]; },
birthProfile() { return { genetics: {} }; },
childSeed() { return "b1_0"; },
worldSeedFromWords(high, low) { return `w${(high >>> 0).toString(16).padStart(8, "0")}${(low >>> 0).toString(16).padStart(8, "0")}`; },
},
TarinaiSaveSchema: {
BINARY_SCHEMA_VERSION: 43,
FIELD_IDS: ["garden"],
itemTypeValue(_id, fallback = "") { return fallback; },
},
};
context.globalThis = context;
context.window = context;
vm.createContext(context);
vm.runInContext(fs.readFileSync(path.join(root, "js", "save_codec.js"), "utf8"), context, { filename: "save_codec.js" });
(async () => {
const metadata = {
w: [[1, 2], [3], 12, 87, 6, 145.5, 20, 18, 100, 90, -1],
t: [[10, 3, 120, 130]],
i: [[1, 121]],
s: [3, 3, 0, 28333333, [0, 2], [77, 13, 64, 2222, 19, 11, 12, 1025, 31, 444, 222, 555]],
};
const snapshot = {
v: 35,
a: "tj1",
m: [1, 0, "garden"],
w: [0, 0, 0, 120, 0, -9990, 1, 0, "seed", 0, 0, 0],
t: [[]],
i: [[0, 0, 0, 0, []]],
g: metadata,
};
const encoded = await context.TarinaiSaveCodec.encodeSnapshot(snapshot);
const decoded = await context.TarinaiSaveCodec.decodeSnapshot(encoded);
if (JSON.stringify(decoded.g) !== JSON.stringify(metadata)) {
console.error("expected", JSON.stringify(metadata));
console.error("actual ", JSON.stringify(decoded.g));
throw new Error("achievement metadata changed during binary save roundtrip");
}
console.log(`[OK] sparse binary achievement metadata roundtrip passed (${encoded.length} spell chars)`);
})().catch(error => {
console.error(error);
process.exitCode = 1;
});