diff --git a/.gitignore b/.gitignore index 892ed8f..ac1a351 100644 --- a/.gitignore +++ b/.gitignore @@ -19,24 +19,22 @@ tools/*.mjs !mengsan/tools/check-sts2-relics.mjs !mengsan/tools/write-sts2-relics-report.mjs -# Local updater downloads and runtime logs /.update_tmp/ +/.planning/ /mengsan/logs/ +/logs/ *.log -# Local credentials; keep shareable environment templates .env .env.* !.env.example !.env.sample !.env.template -# Dependency and interpreter caches node_modules/ __pycache__/ *.pyc -# Editor temporary files and OS metadata *.tmp *.bak *.swp diff --git a/diagnostics/README.md b/diagnostics/README.md new file mode 100644 index 0000000..ed90185 --- /dev/null +++ b/diagnostics/README.md @@ -0,0 +1,62 @@ +# 术樱包自动诊断日志 + +扩展加载后自动记录本扩展的关键业务步骤,发生错误时自动生成独立报告。 +无需开启控制台或手动开始录制;不上传任何数据。 + +## 文件位置 + +PC 和安卓客户端均写入游戏目录下的 `extension/术樱包/logs/`。 + +- `runtime-*.jsonl`:按行保存时间、模块、步骤、关联 ID 和上下文。 +- `report-*.json`:错误报告,包含首次/最近异常、错误栈、cause、内部异常、 + 运行版本、错误前操作、当前结算阶段和存档状态。 + +同一异常在存档层、结算层等多个入口被观察时,共用报告编号并更新修订号; +occurrences 表示被捕获的次数,不表示奖励发放次数。最近报告不会因普通日志 +轮转被删除。保存回执绑定对应修订和真实通道,旧版本写入成功不会误标新版本。 + +扩展设置中的“诊断日志位置”显示实际位置和最近报告保存状态。 +只需要保留相应报告和附近的 runtime 文件;如何发送由用户自行处理。 + +## 采集范围 + +- 主动记录术樱包加载、更新、梦三战斗、结算、存档、手牌、地图及菜单错误。 +- 全局错误仅接收来源文件或异常栈属于本扩展的情况,包含编码后的中文路径。 +- 不因为当前开启梦三就收集所有错误,也不根据错误消息包含“术樱包”归因。 +- 原引擎错误处理仍会执行;不替换引擎事件、Promise 或 console 的原型。 + +## 存档诊断 + +报告分别记录 storageStatus、memoryPublished 和 commitReceipt: + +- storageStatus=committed 表示存档事务完成,或 localStorage 写入已返回。 +- memoryPublished=true 表示运行内存已发布成功存档。 +- commitReceipt=true 表示结算协调器收到了提交成功结果。 + +资源清理、技能释放或地图展示随后失败时,不能据此判断存档失败。 +重试沿用现有去重和奖励提交规则,日志不参与存档事务,也不触发自动重试。 + +## 容量与兼容 + +默认每秒批量保存普通日志;错误报告立即排入写入队列。运行日志按约 +256 KiB 分段;内存保留最近约 512 KiB / 400 条记录。日志目录自动清理 +系统自己生成的旧文件,保留总量约 5 MiB、最多 64 个文件。报告包含截断和 +丢弃计数;“完整诊断”指受限的错误链与现场记录,不是无限保留整个游戏过程。 + +待写队列默认最多 12 项、合计 2 MiB,优先保存错误报告;另有最多一项正在写入。 +错误报告复用已脱敏的记录文本,按字节预算一次裁剪,保留首次和最近异常。 + +PC 使用异步文件操作,安卓使用 Cordova 目录和 FileWriter 回调,写入前截断旧 +内容,使用 UTF-8 Blob。单次保存操作设置 5 秒观察超时;超时后停止使用该 +文件通道,避免迟到写入与后续写入重叠。写入异常不会中断游戏业务。 + +原生文件不可用时,降级到独立的 `shuying-diagnostics` IndexedDB;它不与 +游戏存档共用数据库。若两种持久化方式都不可用,仅保留本次运行的内存 +记录,菜单会明确显示未持久化,不能宣称文件已生成。 + +切入后台或页面隐藏时尝试保存缓冲;被系统强制杀死或断电时,最后尚未完成的 +异步写入可能丢失。结算内部等待超过 15 秒会记录观察日志,选择奖励、地图节点 +和剧情等待不会被当作超时错误;观察器不会结束业务事件。 + +字段过滤会隐藏凭据字段、常见 URL 凭据参数和 Bearer 内容。报告不会复制完整 +玩家对象、DOM、引擎状态或整个存档。日志文件不进入发布清单和 Git。 diff --git a/diagnostics/index.js b/diagnostics/index.js new file mode 100644 index 0000000..06d5190 --- /dev/null +++ b/diagnostics/index.js @@ -0,0 +1,348 @@ +import { + byteLength, cleanText, extensionError, extensionSource, serializeError, snapshot, +} from "./serialize.js"; +import { createDiagnosticStorage, isDiagnosticFile, LOG_DIRECTORY } from "./storage.js"; + +const noop = () => null; +const inactive = Object.freeze({ + info: noop, warn: noop, error: noop, scope: () => inactive, + registerContext: () => noop, flush: async () => {}, + step: async (_event, action) => action(), + status: () => ({ enabled: false }), dispose: noop, +}); +let current = inactive; + +export function getDiagnostics() { return current; } + +export function createDiagnostics(options = {}) { + const env = options.env || {}; + const now = options.now || Date.now; + const monotonic = () => { + try { return env.performance?.now?.() ?? now(); } catch { return now(); } + }; + const launchId = `${now().toString(36)}-${Math.random().toString(36).slice(2, 10)}`; + const maxMemoryBytes = options.maxMemoryBytes ?? 512 * 1024; + const maxJournalBytes = options.maxJournalBytes ?? 256 * 1024; + const maxReportBytes = options.maxReportBytes ?? 512 * 1024; + const maxDiskBytes = options.maxDiskBytes ?? 5 * 1024 * 1024; + const maxFiles = options.maxFiles ?? 64; + const maxPending = options.maxPending ?? 12; + const maxPendingBytes = options.maxPendingBytes ?? 2 * 1024 * 1024; + const flushMs = options.flushMs ?? 1000; + const recent = [], contexts = new Map(), pending = new Map(); + const errors = new WeakMap(), fingerprints = new Map(), listeners = []; + let sequence = 0, reportSequence = 0, segment = 0, memoryBytes = 0; + let journal = [], journalBytes = 0, revision = 0, queuedRevision = -1; + let flushTimer = null, worker = null, stopped = false, unavailable = false; + let latestReport = null, droppedRecords = 0, droppedWrites = 0; + let inventory = null, inventoryKind = null; + let pendingBytes = 0; + const metadata = snapshot({ + extension: "术樱包", extensionVersion: options.version || "unknown", + engineVersion: env.lib?.version || "unknown", launchId, + platform: env.lib?.node ? "pc" : env.lib?.device ? "android" : "browser", + userAgent: env.window?.navigator?.userAgent || "unknown", + modules: { mengsan: env.lib?.config?.shuYing_mengsan_installed_version || null }, + }); + const roots = []; + try { + const root = new URL("../", import.meta.url); + if (["file:", "http:", "https:"].includes(root.protocol)) roots.push(root.href); + } catch {} + if (options.extensionRoot) { + try { + roots.push(new URL(options.extensionRoot.replace(/\/?$/, "/"), + env.document?.baseURI || env.window?.location?.href).href); + } catch {} + } + const storage = options.storage || createDiagnosticStorage(env, { + timeoutMs: options.storageTimeoutMs, + onFailure(error, phase) { + record("WARN", "diagnostics.storage.failure", { phase }, error, "diagnostics"); + }, + }); + const storageStatus = () => storage.status?.() || { kind: "file", location: LOG_DIRECTORY }; + const runtimeName = () => `runtime-${launchId}-${segment}.jsonl`; + + function contextFor(extra) { + const values = {}; + for (const [name, provider] of contexts) { + try { values[name] = snapshot(provider()); } + catch { values[name] = { diagnosticContextUnavailable: true }; } + } + return { ...values, ...snapshot(extra || {}) }; + } + + function schedule() { + if (flushTimer || stopped || unavailable) return; + flushTimer = setTimeout(() => { flushTimer = null; void flush(); }, flushMs); + flushTimer?.unref?.(); + } + + function record(level, event, extra, error, module = "extension") { + if (stopped) return null; + try { + const entry = { + schemaVersion: 1, sequence: ++sequence, time: new Date(now()).toISOString(), + launchId, level, module: cleanText(module, 128), event: cleanText(event, 256), + context: contextFor(extra), + }; + if (error !== undefined) entry.error = serializeError(error); + const item = { entry, bytes: 0, text: "" }; + recent.push(item); + if (level === "ERROR") createReport(entry, error); + const text = JSON.stringify(entry); + const bytes = byteLength(text) + 1; + item.text = text; + delete item.entry; + item.bytes = bytes; memoryBytes += bytes; + if (journalBytes + bytes > maxJournalBytes && journal.length) { + enqueue(runtimeName(), journal.join("")); + segment++; journal = []; journalBytes = 0; queuedRevision = -1; + } + journal.push(text + "\n"); journalBytes += bytes; revision++; + while (recent.length > 400 || memoryBytes > maxMemoryBytes) { + memoryBytes -= recent.shift().bytes; droppedRecords++; + } + schedule(); + if (level === "ERROR") void flush(); + return entry; + } catch { + return null; + } + } + + function createReport(entry, rawError) { + let known; + if (rawError && typeof rawError === "object") known = errors.get(rawError); + const fingerprint = `${entry.module}:${entry.event}:${entry.error?.name}:${entry.error?.message}`; + if (!known) { + const prior = fingerprints.get(fingerprint); + if (prior && now() - prior.time < 5000) known = prior; + } + if (!known) known = { id: `${launchId}-${++reportSequence}`, count: 0, + first: entry.time, time: now(), firstFailure: entry }; + known.count++; known.time = now(); + if (rawError && typeof rawError === "object") errors.set(rawError, known); + fingerprints.set(fingerprint, known); + while (fingerprints.size > 64) fingerprints.delete(fingerprints.keys().next().value); + entry.reportId = known.id; + const file = `report-${known.id}.json`; + const report = { + schemaVersion: 1, reportId: known.id, firstSeen: known.first, + lastSeen: entry.time, occurrences: known.count, environment: metadata, + storageAtCapture: snapshot(storageStatus()), firstFailure: known.firstFailure, + failure: entry, + droppedRecords, droppedWrites, + }; + const records = recent.map(item => { + const text = item.text || JSON.stringify(item.entry); + return { text, bytes: item.text ? item.bytes - 1 : byteLength(text) }; + }); + let start = 0; + let bytes = byteLength(JSON.stringify(report)) + 14 + + records.reduce((total, item) => total + item.bytes + 1, 0); + while (bytes + 32 > maxReportBytes && start < records.length - 1) { + bytes -= records[start++].bytes + 1; + } + report.droppedRecords += start; + const text = JSON.stringify(report).slice(0, -1) + ',"records":[' + + records.slice(start).map(item => item.text).join(",") + "]}"; + latestReport = { id: known.id, file, revision: known.count, + persisted: false, event: entry.event }; + enqueue(file, text, true, known.count); + } + + function enqueue(name, text, priority = false, reportRevision = null) { + if (unavailable || stopped) return; + const bytes = byteLength(text); + const previous = pending.get(name); + if (previous) { pendingBytes -= previous.bytes; pending.delete(name); } + if (bytes > maxPendingBytes) { droppedWrites++; return; } + while (pending.size >= maxPending || pendingBytes + bytes > maxPendingBytes) { + const victim = [...pending].find(([, item]) => !item.priority)?.[0] + || (priority ? pending.keys().next().value : null); + if (!victim) { droppedWrites++; return; } + pendingBytes -= pending.get(victim).bytes; + pending.delete(victim); droppedWrites++; + } + pending.set(name, { text, bytes, priority, reportRevision }); + pendingBytes += bytes; + startWorker(); + } + + async function prune(protect, text) { + const kind = storageStatus().kind; + if (!inventory || inventoryKind !== kind) { + inventory = new Map((await storage.list()).filter(file => + isDiagnosticFile(file.name)).map(file => [file.name, file])); + inventoryKind = kind; + } + inventory.set(protect, { name: protect, bytes: byteLength(text), time: now() }); + const files = [...inventory.values()]; + files.sort((a, b) => (a.time || 0) - (b.time || 0)); + let bytes = files.reduce((sum, file) => sum + (file.bytes || 0), 0); + let count = files.length; + for (const file of files) { + if (bytes <= maxDiskBytes && count <= maxFiles) break; + if (file.name === protect || file.name === runtimeName() + || file.name === latestReport?.file) continue; + await storage.remove(file.name); + inventory.delete(file.name); + bytes -= file.bytes || 0; count--; + } + } + + function startWorker() { + if (worker || !pending.size) return; + worker = Promise.resolve().then(async () => { + while (pending.size && !unavailable) { + const name = [...pending].find(([, item]) => item.priority)?.[0] + || pending.keys().next().value; + const item = pending.get(name); + pending.delete(name); + pendingBytes -= item.bytes; + try { + await storage.write(name, item.text); + if (latestReport?.file === name && latestReport.revision === item.reportRevision) { + latestReport.persisted = true; + latestReport.savedStorage = snapshot(storageStatus()); + } + try { await prune(name, item.text); } catch { inventory = null; } + } catch { + unavailable = true; pending.clear(); pendingBytes = 0; + } + } + }).catch(() => { unavailable = true; pending.clear(); pendingBytes = 0; }).finally(() => { + worker = null; + if (pending.size && !unavailable) startWorker(); + }); + } + + async function flush() { + try { + clearTimeout(flushTimer); flushTimer = null; + if (journal.length && queuedRevision !== revision) { + queuedRevision = revision; + enqueue(runtimeName(), journal.join("")); + } + while (worker) await worker; + } catch {} + } + + function scope(module, provider = () => ({})) { + const details = extra => { + try { + const context = typeof provider === "function" ? provider() : provider; + return { ...snapshot(context), ...snapshot(extra || {}) }; + } catch { return { diagnosticContextUnavailable: true }; } + }; + return Object.freeze({ + info: (event, extra) => record("INFO", event, details(extra), undefined, module), + warn: (event, extra, error) => record("WARN", event, details(extra), error, module), + error: (event, error, extra) => record("ERROR", event, details(extra), error, module), + async step(event, action, extra = {}, options = {}) { + const started = monotonic(); + record("INFO", `${event}.start`, details(extra), undefined, module); + let timer; + if (options.observeWait !== false) { + timer = setTimeout(() => { + if (env.document?.hidden) return; + record("WARN", `${event}.waiting`, details({ ...extra, + elapsedMs: monotonic() - started }), undefined, module); + }, options.waitMs ?? 15000); + timer?.unref?.(); + } + try { + const result = await action(); + record("INFO", `${event}.complete`, details({ ...extra, + elapsedMs: monotonic() - started }), undefined, module); + return result; + } catch (error) { + record("ERROR", `${event}.failed`, details({ ...extra, + elapsedMs: monotonic() - started }), error, module); + throw error; + } finally { clearTimeout(timer); } + }, + }); + } + + function listen(target, event, handler, capture = false) { + if (typeof target?.addEventListener !== "function") return; + target.addEventListener(event, handler, capture); + listeners.push(() => target.removeEventListener(event, handler, capture)); + } + const globalLogger = scope("extension.global"); + const globalSeen = new WeakMap(); + function captureGlobal(error, source, extra = {}) { + if (!extensionSource(source, roots) && !extensionError(error, roots)) return; + if (error && typeof error === "object") { + const last = globalSeen.get(error); + if (last !== undefined && now() - last < 20) return; + globalSeen.set(error, now()); + } + globalLogger.error("uncaught", error, { source, ...extra }); + } + listen(env.window, "error", event => { + try { + if (extensionSource(event.filename, roots) || extensionError(event.error, roots)) { + captureGlobal(event.error || event.message, event.filename, + { line: event.lineno, column: event.colno }); + } else { + const source = event.target?.src || event.target?.href; + if (extensionSource(source, roots)) globalLogger.error("resource.load", + new Error("术樱包资源加载失败"), { source }); + } + } catch {} + }, true); + listen(env.window, "unhandledrejection", event => { + try { + if (extensionError(event.reason, roots)) captureGlobal(event.reason, "", + { origin: "unhandledrejection" }); + } catch {} + }); + if (env.window) { + const previous = env.window.onerror; + const chained = function(message, source, line, column, error) { + try { captureGlobal(error || message, source, { line, column }); } catch {} + return typeof previous === "function" ? previous.apply(this, arguments) : undefined; + }; + env.window.onerror = chained; + listeners.push(() => { + if (env.window.onerror === chained) env.window.onerror = previous; + }); + } + listen(env.document, "visibilitychange", () => { + if (env.document.hidden) void flush(); + }); + listen(env.window, "pagehide", () => { void flush(); }); + const api = Object.freeze({ + ...scope("extension"), scope, + registerContext(name, provider) { + contexts.set(name, provider); + return () => contexts.delete(name); + }, + flush, + status: () => snapshot({ enabled: true, ...storageStatus(), + unavailable, latestReport, droppedRecords, droppedWrites, + pendingFiles: pending.size, pendingBytes, + runtimeFile: runtimeName(), launchId }), + dispose() { + void flush(); stopped = true; clearTimeout(flushTimer); + for (const remove of listeners) remove(); + if (current === api) current = inactive; + }, + }); + api.info("diagnostics.started", { environment: metadata }); + return api; +} + +export function configureDiagnostics({ lib, game, window, document, version, extensionRoot }) { + if (current !== inactive) return current; + try { + current = createDiagnostics({ version, extensionRoot, + env: { lib, game, window, document, performance: window?.performance, + localStorage: window?.localStorage, indexedDB: window?.indexedDB } }); + } catch {} + return current; +} diff --git a/diagnostics/serialize.js b/diagnostics/serialize.js new file mode 100644 index 0000000..83d6d98 --- /dev/null +++ b/diagnostics/serialize.js @@ -0,0 +1,127 @@ +const secretKey = /password|passwd|secret|token|cookie|authorization|api[_-]?key|credential/i; + +export function cleanText(value, limit = 8192) { + let text; + try { text = String(value); } catch { return "[unreadable]"; } + const truncated = text.length > limit; + text = text.slice(0, limit); + text = text.replace(/([?&](?:token|key|api[_-]?key|access_token|password|secret|auth)[a-z0-9_-]*=)[^&#\s]*/gi, + "$1[redacted]"); + text = text.replace(/((?:Bearer|Basic)\s+)[\w.+\/=-]+/gi, "$1[redacted]"); + text = text.replace(/\b(?:https?|ftp):\/\/[^\s/?#]*/gi, (url, offset, source) => { + const schemeEnd = url.indexOf("://") + 3; + const at = url.lastIndexOf("@"); + if (at >= schemeEnd) return url.slice(0, schemeEnd) + "[redacted]@" + url.slice(at + 1); + if (truncated && offset + url.length === source.length + && url.slice(schemeEnd).includes(":")) return url.slice(0, schemeEnd) + "[redacted]"; + return url; + }); + return !truncated && text.length <= limit ? text : text.slice(0, limit) + "[truncated]"; +} + +function read(object, key) { + try { return object[key]; } catch { return "[unreadable]"; } +} + +export function snapshot(value, depth = 0, seen = new WeakSet()) { + if (value === null || value === undefined) return value ?? null; + if (typeof value === "string") return cleanText(value, 2048); + if (typeof value === "boolean") return value; + if (typeof value === "number") return Number.isFinite(value) ? value : String(value); + if (typeof value !== "object") return cleanText(value, 256); + if (seen.has(value)) return "[circular]"; + if (depth >= 5) return "[depth limit]"; + seen.add(value); + if (Array.isArray(value)) { + const result = value.slice(0, 32).map(item => snapshot(item, depth + 1, seen)); + if (value.length > 32) result.push(`[${value.length - 32} more items]`); + return result; + } + let keys; + try { keys = Object.keys(value); } catch { return "[unreadable]"; } + const result = {}; + for (const key of keys.slice(0, 40)) { + if (key === "__proto__" || key === "constructor") continue; + result[key] = secretKey.test(key) ? "[redacted]" + : snapshot(read(value, key), depth + 1, seen); + } + if (keys.length > 40) result.truncatedKeys = keys.length - 40; + return result; +} + +export function serializeError(error, depth = 0, seen = new WeakSet(), + budget = { nodes: 0, characters: 32768 }) { + if (++budget.nodes > 32 || budget.characters <= 0) { + return { name: "TruncatedError", message: "[error size limit]" }; + } + const text = (value, limit = 8192) => { + const result = cleanText(value, Math.max(0, Math.min(limit, budget.characters))); + budget.characters -= result.length; + return result; + }; + if (!error || typeof error !== "object") { + return { name: "ThrownValue", message: text(error) }; + } + if (seen.has(error)) return { name: "CircularError", message: "[circular]" }; + if (depth >= 5) return { name: "TruncatedError", message: "[depth limit]" }; + seen.add(error); + const result = { + name: text(read(error, "name") || "Error", 128), + message: text(read(error, "message") || error), + stack: text(read(error, "stack") || "", 16384), + }; + for (const key of ["code", "operationUncertain"]) { + const value = read(error, key); + if (value !== undefined) result[key] = snapshot(value); + } + const cause = read(error, "cause"); + if (cause !== undefined) result.cause = serializeError(cause, depth + 1, seen, budget); + const errors = read(error, "errors"); + if (Array.isArray(errors)) { + result.errors = errors.slice(0, 16).map(item => + serializeError(item, depth + 1, seen, budget)); + if (errors.length > 16) result.truncatedErrors = errors.length - 16; + } + return result; +} + +function decode(value) { + let text = cleanText(value, 32768).replace(/\\/g, "/"); + for (let count = 0; count < 2; count++) { + try { text = decodeURIComponent(text); } catch { break; } + } + return text; +} + +export function extensionSource(value, roots = []) { + if (typeof value !== "string" || !value) return false; + const source = cleanText(value, 32768).replace(/\\/g, "/").trim(); + const url = source.match(/(?:file|https?):\/\/[^\n]+/i)?.[0]; + const native = source.match(/[a-z]:\/[^\n]+/i)?.[0]; + const candidate = decode((url || native || source) + .replace(/\)\s*$/, "").split(/[?#]/, 1)[0]); + if (roots.some(root => { + const base = decode(root).split(/[?#]/, 1)[0]; + return base && (candidate.startsWith(base) + || (base.startsWith("file:") && candidate.startsWith(base.replace(/^file:\/+/, "")))); + })) return true; + if (/^(?:\.?\/)?extension\/术樱包\//.test(candidate)) return true; + return !roots.length && /\/extension\/术樱包\//.test(candidate); +} + +export function extensionError(error, roots = [], depth = 0) { + if (!error || typeof error !== "object" || depth >= 5) return false; + const stack = read(error, "stack"); + if (typeof stack === "string" && stack.split("\n").slice(1).some(line => + /(?:\bat\s|@)/.test(line) && extensionSource(line, roots))) return true; + if (extensionSource(read(error, "fileName"), roots)) return true; + if (extensionError(read(error, "cause"), roots, depth + 1)) return true; + const errors = read(error, "errors"); + return Array.isArray(errors) && errors.slice(0, 16).some(item => + extensionError(item, roots, depth + 1)); +} + +export function byteLength(text) { + if (typeof TextEncoder === "function") return new TextEncoder().encode(text).length; + return new Blob([text]).size; +} diff --git a/diagnostics/storage.js b/diagnostics/storage.js new file mode 100644 index 0000000..8be17c8 --- /dev/null +++ b/diagnostics/storage.js @@ -0,0 +1,206 @@ +import { byteLength } from "./serialize.js"; + +export const LOG_DIRECTORY = "extension/术樱包/logs"; +const ownedName = /^(?:runtime|report)-[a-zA-Z0-9-]+\.(?:jsonl|json)$/; + +export function isDiagnosticFile(name) { + return typeof name === "string" && ownedName.test(name); +} + +function checkedName(name) { + if (!isDiagnosticFile(name)) throw new Error("Invalid diagnostic filename"); + return name; +} + +function callback(start) { + return new Promise((resolve, reject) => { + try { start(resolve, reject); } catch (error) { reject(error); } + }); +} + +function nodeStorage(env) { + const fs = env.lib?.node?.fs; + const root = env.window?.__dirname; + if (!fs || typeof root !== "string" || !root) return null; + const directory = `${root.replace(/[\\/]$/, "")}/${LOG_DIRECTORY}`; + const invoke = (method, ...args) => callback((resolve, reject) => { + fs[method](...args, (error, value) => error ? reject(error) : resolve(value)); + }); + const ready = () => invoke("mkdir", directory, { recursive: true }); + return { + kind: "file", location: directory, + async write(name, text) { + await ready(); + await invoke("writeFile", `${directory}/${checkedName(name)}`, text, "utf8"); + }, + async list() { + await ready(); + const names = (await invoke("readdir", directory)).filter(isDiagnosticFile); + const entries = []; + for (const name of names) { + const stat = await invoke("lstat", `${directory}/${name}`); + if (stat.isFile()) entries.push({ name, bytes: stat.size, time: stat.mtimeMs }); + } + return entries; + }, + remove: name => invoke("unlink", `${directory}/${checkedName(name)}`), + }; +} + +function cordovaStorage(env) { + const host = env.window; + if (typeof host?.resolveLocalFileSystemURL !== "function") return null; + const root = env.localStorage?.getItem("noname_inited"); + if (!root) return null; + let directoryPromise; + const directory = () => { + if (!directoryPromise) directoryPromise = callback((resolve, reject) => { + host.resolveLocalFileSystemURL(root, resolve, reject); + }).then(async entry => { + for (const part of LOG_DIRECTORY.split("/")) { + entry = await callback((resolve, reject) => + entry.getDirectory(part, { create: true }, resolve, reject)); + } + return entry; + }); + return directoryPromise; + }; + const file = async name => { + const entry = await directory(); + return callback((resolve, reject) => + entry.getFile(checkedName(name), { create: true }, resolve, reject)); + }; + return { + kind: "file", location: `${root.replace(/\/$/, "")}/${LOG_DIRECTORY}`, + async write(name, text) { + const entry = await file(name); + await callback((resolve, reject) => entry.createWriter(writer => { + let truncated = false; + writer.onerror = () => reject(writer.error || new Error("Diagnostic write failed")); + writer.onwriteend = () => { + if (writer.error) { reject(writer.error); return; } + if (truncated) { resolve(); return; } + truncated = true; + try { writer.write(new Blob([text], { type: "text/plain;charset=utf-8" })); } + catch (error) { reject(error); } + }; + try { writer.truncate(0); } catch (error) { reject(error); } + }, reject)); + }, + async list() { + const entry = await directory(); + const reader = entry.createReader(); + const entries = []; + while (true) { + const batch = await callback((resolve, reject) => + reader.readEntries(resolve, reject)); + if (!batch.length) break; + for (const item of batch) { + if (!item.isFile || !isDiagnosticFile(item.name)) continue; + const metadata = await callback((resolve, reject) => + item.getMetadata(resolve, reject)); + entries.push({ name: item.name, bytes: metadata.size, + time: new Date(metadata.modificationTime).getTime() }); + } + } + return entries; + }, + async remove(name) { + const entry = await file(name); + return callback((resolve, reject) => entry.remove(resolve, reject)); + }, + }; +} + +function databaseStorage(env) { + const indexedDB = env.indexedDB; + if (!indexedDB) return null; + let database; + const open = () => database ||= callback((resolve, reject) => { + const request = indexedDB.open("shuying-diagnostics", 1); + let failed = false; + request.onupgradeneeded = () => { + const db = request.result; + if (!db.objectStoreNames.contains("files")) db.createObjectStore("files", { keyPath: "name" }); + }; + request.onsuccess = () => { + if (failed) { request.result.close(); return; } + request.result.onversionchange = () => request.result.close(); + resolve(request.result); + }; + request.onerror = () => { failed = true; reject(request.error); }; + request.onblocked = () => { failed = true; reject(new Error("Diagnostic database blocked")); }; + }); + const transaction = async action => { + const db = await open(); + return callback((resolve, reject) => { + const tx = db.transaction(["files"], "readwrite"); + let value, failure; + tx.oncomplete = () => resolve(value); + tx.onerror = event => { failure = event.target?.error; }; + tx.onabort = () => reject(tx.error || failure || new Error("Diagnostic transaction aborted")); + try { action(tx.objectStore("files"), result => { value = result; }); } + catch (error) { try { tx.abort(); } catch {} reject(error); } + }); + }; + return { + kind: "indexeddb", location: "本机独立诊断数据库", + write(name, text) { + return transaction(store => store.put({ name: checkedName(name), text, + bytes: byteLength(text), time: Date.now() })); + }, + list() { + return transaction((store, done) => { + const entries = []; + const cursor = store.openCursor(); + cursor.onsuccess = () => { + const item = cursor.result; + if (!item) { done(entries); return; } + if (isDiagnosticFile(item.value.name)) entries.push({ + name: item.value.name, bytes: item.value.bytes, time: item.value.time, + }); + item.continue(); + }; + }); + }, + remove: name => transaction(store => store.delete(checkedName(name))), + }; +} + +export function createDiagnosticStorage(env, options = {}) { + const timeoutMs = options.timeoutMs ?? 5000; + const onFailure = options.onFailure || (() => {}); + const candidates = []; + try { + const native = nodeStorage(env) || cordovaStorage(env); + if (native) candidates.push(native); + } catch (error) { onFailure(error, "file.init"); } + try { + const database = databaseStorage(env); + if (database) candidates.push(database); + } catch (error) { onFailure(error, "database.init"); } + let index = 0; + const timed = action => new Promise((resolve, reject) => { + const timer = setTimeout(() => reject(new Error("Diagnostic storage timed out")), timeoutMs); + Promise.resolve().then(action).then(resolve, reject).finally(() => clearTimeout(timer)); + }); + const execute = async (method, ...args) => { + while (index < candidates.length) { + const backend = candidates[index]; + try { return await timed(() => backend[method](...args)); } + catch (error) { + try { onFailure(error, `${backend.kind}.${method}`); } catch {} + if (method !== "write") throw error; + index++; + } + } + throw new Error("Diagnostic persistence unavailable; records kept in memory"); + }; + return { + write: (name, text) => execute("write", name, text), + list: () => execute("list"), + remove: name => execute("remove", name), + status: () => ({ kind: candidates[index]?.kind || "memory", + location: candidates[index]?.location || "仅当前运行内存,未能持久化" }), + }; +} diff --git a/dist/manifest.json b/dist/manifest.json index 7400b05..d8b3484 100644 --- a/dist/manifest.json +++ b/dist/manifest.json @@ -1,16 +1,19 @@ { - "version": "2.0.2.3-rc.2", - "generated_at": "2026-10-05T15:23:57.473829+00:00", + "version": "2.0.2.3-rc.3", + "generated_at": "2026-10-08T15:53:16.835760+00:00", "algorithm": "sha256", "update_channels": true, - "file_count": 278, - "size_bytes": 55498582, - "folder_sha256": "b1f12f33bc8775deef47799b715ad34428abf8f0aa16232aa800c8d1db07499c", + "file_count": 281, + "size_bytes": 47971941, + "folder_sha256": "8211bd35c6c1ce35b7e4ce7f36016d7afa8b3d4c51dd64d5ff47c5cabee72f8a", "core": [ "extension.js", "menu.js", "function.js", "update.js", + "diagnostics/index.js", + "diagnostics/serialize.js", + "diagnostics/storage.js", "tianshu/extension.js", "tianshu/config.js", "pve/boss/index.js", @@ -292,8 +295,8 @@ "removeDirectories": [], "files": { "LICENSE": { - "size": 35147, - "sha256": "8ceb4b9ee5adedde47b31e975c1d90c73ad27b6b165a1dcd80c7c545eb65b903" + "size": 35821, + "sha256": "0b383d5a63da644f628d99c33976ea6487ed89aaa59f0b3257992deac1171e6b" }, "character/audio/ganning/fenwei_shuying1.mp3": { "size": 83302, @@ -344,20 +347,20 @@ "sha256": "f330d2665fd2c9bb85cd4a80f596f44a283c715333a1bf8aafffa5ef030c5126" }, "character/character.js": { - "size": 653, - "sha256": "6cbd7ec49ec9b9ec362f5dadb4251c219ecd468a099a082f17da86c61e0823f2" + "size": 673, + "sha256": "e90a755479cce77fa083926f221065bae3e42fa6c347537fe05a5c4d00fef72f" }, "character/characterFilter.js": { - "size": 63, - "sha256": "92164cec19b58e3a27d92426fbe227c426dff1391b2f56b2329a676a5fc4faf7" + "size": 66, + "sha256": "0dc51d476375435b50ea965fd540a6afb19134d974fe183bd924225dc3842062" }, "character/characterTitle.js": { - "size": 61, - "sha256": "f4be860d37d46261a6d45e30bce661d301d79d548aeef0bfc2e8ad67fe783cea" + "size": 64, + "sha256": "b736420c47616f5e6493bc0e5d00a1a6803e8540e312ff99b0a5ae2d2de17b6f" }, "character/dynamicTranslate.js": { - "size": 872, - "sha256": "63a56c336e881b15e08374656863b67b7465eedf6af683f8bade3d33b12f2704" + "size": 883, + "sha256": "58b234c5f801b6d7ec65ea5344d4cb075f9b2e1d2f4df65ef95ea24b3ddba995" }, "character/images/ganning_shuying.jpg": { "size": 1580990, @@ -368,48 +371,60 @@ "sha256": "ff13df281bd289d63033d2c52b8d31f2a9f0a8d9cdc0ad525db06b899411f4cb" }, "character/index.js": { - "size": 1002, - "sha256": "ef3dcf49147bead5a4b58c56aa23f983e7fda7c4769f276f1f228293f87acc33" + "size": 1030, + "sha256": "3e365b2c30eb0f9a890f7b4ed777f337a0ea4a202e7db0132e4b533a5ad5bbb0" }, "character/intro.js": { - "size": 61, - "sha256": "68187ccda36e322c0483a735e6de6e04e5d7ded9e6f6aa9a3e931f4400db2a5e" + "size": 64, + "sha256": "17fc80689618ad9d3601cc9ccb692e38eb7b66de82e21c75c246c749f2bdf1fd" }, "character/perfectPairs.js": { - "size": 55, - "sha256": "7f2bd697eaaff284d2b356321a402a3cc7c0139ff6fdf339f6cbdd8da208a05f" + "size": 58, + "sha256": "a9b5f18910cf92cd6a727cf254ad8d6e1e2ba60a9cf35e9a458da34ce4fda49f" }, "character/skill.js": { - "size": 31285, - "sha256": "608ad1b6463bda8318b91f729dce0cdf98a223d0a72fd1fac35cf32b49e69c08" + "size": 32111, + "sha256": "78294951c6d0e53ab2ad718aa128d437e3eea2579bb9644546a79864875e21f6" }, "character/sort.js": { - "size": 112, - "sha256": "42cf6bb834aca4ff883aa196604f3d9d2d9047bb320cf56a633aae4ecbb5ce4c" + "size": 116, + "sha256": "a2864d98878342280c81bc527a1168b4dccf7976dc40e49c50c9037679bc7ca5" }, "character/translate.js": { - "size": 2091, - "sha256": "2a31d41939f1d636f9c1b2378d0f15cf7aa5c9e2caa35b465066deb4f877e4bb" + "size": 2108, + "sha256": "e533d53409068342100dbdb42ec0832aac656988ca42a168a915dd851e7b4d06" }, "character/voices.js": { - "size": 43, - "sha256": "d7f3da55f8b2e8bf77ace03bd4911497a4abb9e1f942555f7685337801278205" + "size": 46, + "sha256": "54787af1d4efcd35f20c5eca55db2e60f0cd160d7fed728440542f118e7ae44a" + }, + "diagnostics/index.js": { + "size": 14862, + "sha256": "bb89045b70dd36ba3539b74ea80725e57f28bfae4d332c04c1e8319d99258bd6" + }, + "diagnostics/serialize.js": { + "size": 5607, + "sha256": "1456abb806511dcbe2f3cfea5f036741d8c0761a7a6c1f008a73c52007d1086d" + }, + "diagnostics/storage.js": { + "size": 8047, + "sha256": "3d6b861ce1186cd7d8123b61e7e8095f36bc2af041b13ab3511b04bb0b375f86" }, "extension.css": { - "size": 55501, - "sha256": "0907c22921f33d3180378dfcec4cdea793227d325c281d5f3a3f698c83b42b85" + "size": 57424, + "sha256": "f62d07820aa0f93915719bdd334b3513673b0b02d94e89f12deed3c07c4731dd" }, "extension.js": { - "size": 15464, - "sha256": "11db6f84273c2928db92b42d9ab1f2def6e2f796393119f7f7a0177ad2b9d818" + "size": 16317, + "sha256": "eee5e5ec1ba9f34a613d14812f1829c8aec656080812533596405434551983f6" }, "function.js": { - "size": 36025, - "sha256": "39a02025adc2459c93c4f5539c7c3a9b70c0d344284d43252af8be52e8565c33" + "size": 36629, + "sha256": "33ba3335fee271173fc454b25c5122e9e2b686eabdff30a54599e5cd31800710" }, "menu.js": { - "size": 29114, - "sha256": "bd54fda361282e08102d6d7557b21216fb74198c3db9d164405b12f74fcc7f3b" + "size": 30671, + "sha256": "3b6af8ff6d53c289f94fbaa320be91c3a7a0b554ba999e0bfc26ae6227981862" }, "pve/audio/dead/十二生肖/chenlong.mp3": { "size": 68757, @@ -816,276 +831,276 @@ "sha256": "ab0ec7394ee47c6d2b71a2a6617e854c9a6725a965af693ef18ce3b659e9fedd" }, "pve/boss/card.js": { - "size": 165, - "sha256": "81618e415c8932e76e88a8552be215143dc7fb075d24df30332646c8ba8df160" + "size": 171, + "sha256": "3c0a2d89226ed8ea5dfb5238221d63b117a6624e027cde03ba6671dfd5548c2c" }, "pve/boss/character.js": { - "size": 253, - "sha256": "ae70f8ee9c4aab84f6f6edac88cd6095a6213d19948d366c32d983f58c8bc2f3" + "size": 260, + "sha256": "3777e2a7cc00bf3b6e9842f65acf314df2786cb8596ee213254e074738782de4" }, "pve/boss/characterFilter.js": { - "size": 204, - "sha256": "f9b6cbe34f75d43b2493ffbaa137baebaebe1118b36ea731e5270497c7e88dfa" + "size": 210, + "sha256": "e0cffda20018e8abb3c208359221633f049c77d9246bfc492f740430162c05a1" }, "pve/boss/characterTitle.js": { - "size": 201, - "sha256": "8be70f8fa2ada89d26697b87234ee38e60d19b51d6d6dcc754e37455030810d0" + "size": 207, + "sha256": "f28a5994a540f50851a2a8c66733e8d326f8de59169f2f22a556243837cf0bc2" }, "pve/boss/dynamicTranslate.js": { - "size": 280, - "sha256": "ab9d2e77ab3df1fb6c57a0b678b4866f1ded3d3d2af9e2c309fcf7c43105a015" + "size": 287, + "sha256": "924be3ff97147ac8f113eb35ef1aeadab0b3227b1eca61fe5d4d5197242ced30" }, "pve/boss/index.js": { - "size": 1105, - "sha256": "ee95a08cec01c8dd33ad7469c33c2eaa18ab1697c0d668a930e4c943dcc24b96" + "size": 1137, + "sha256": "578e2c7f50e42c5e92b445e9bcf0dafa68f28ff2415877c4b1ff492783152372" }, "pve/boss/intro.js": { - "size": 201, - "sha256": "fbfacd5ccd33ff90844ea94eba09aa9072c24a8fbdb5ac259f1ad42ffb4860eb" + "size": 207, + "sha256": "6fe542ceb77e006a80810c95145b614ae13487acad5abd59059652417dbfb3ac" }, "pve/boss/merge.js": { - "size": 918, - "sha256": "482113df0ab59b0c5f1fb9c080cedee2a0c19f52613409fd0cb600213f555edf" + "size": 940, + "sha256": "47e0aa7f324b0e8d13737aa07065a18bef69049a6c4c5eafd61996024e84b387" }, "pve/boss/perfectPairs.js": { - "size": 192, - "sha256": "bdaf0a62c1480eed16a37258fe74c7f405380e889e43d41da0ef08f5f8436c49" + "size": 198, + "sha256": "228d84d6013ad2b11f789363854bc05dcfe259fdfadaee84acb95421497927ca" }, "pve/boss/pinyin.js": { - "size": 172, - "sha256": "85a0c2248d2b6c69391816a76d62e9eb6a4288f68d3647bc27a89e2a697c6fc2" + "size": 178, + "sha256": "34acc90748a2ce6de749d841e371b11a75bd169b782d6bd2672cb50a70bdb21b" }, "pve/boss/sets.js": { - "size": 488, - "sha256": "6809745b6ed34f473e0726c87ed41c30d48bc0b95cc4b5ec4796dc169582810c" + "size": 502, + "sha256": "78de634dd7eebc7b6657b23bafa74ea274568e303179eb489f052bae1d19d044" }, "pve/boss/sets/qingqingzijin/card.js": { - "size": 121, - "sha256": "d903002b4cc800b916e44729798bf5aa0a0f8ea0ba361620959591be723924d7" + "size": 126, + "sha256": "5fa35745834d9494a4be460c4f1cb842ee56ec797f7eaa45b7df6122c87c92ee" }, "pve/boss/sets/qingqingzijin/character.js": { - "size": 2395, - "sha256": "d303c8e2b14b9b859c08368e1740dd31782385951169f59b0d82e0894d4f9592" + "size": 2464, + "sha256": "8f7b1710cec7d7d90f62127330abb838163d91c29603fab7b8920711b1ec31e7" }, "pve/boss/sets/qingqingzijin/characterFilter.js": { - "size": 63, - "sha256": "92164cec19b58e3a27d92426fbe227c426dff1391b2f56b2329a676a5fc4faf7" + "size": 66, + "sha256": "0dc51d476375435b50ea965fd540a6afb19134d974fe183bd924225dc3842062" }, "pve/boss/sets/qingqingzijin/characterTitle.js": { - "size": 61, - "sha256": "f4be860d37d46261a6d45e30bce661d301d79d548aeef0bfc2e8ad67fe783cea" + "size": 64, + "sha256": "b736420c47616f5e6493bc0e5d00a1a6803e8540e312ff99b0a5ae2d2de17b6f" }, "pve/boss/sets/qingqingzijin/dynamicTranslate.js": { - "size": 4155, - "sha256": "660534f1ca8e49c531ceb3872321694d27556d031e8f97740aa2410084c8c3c4" + "size": 4248, + "sha256": "13ef52691ea5f23176608b21471d80e03285941e7687f69c3c93af5aeccf7e64" }, "pve/boss/sets/qingqingzijin/index.js": { - "size": 973, - "sha256": "663d9089071b4fc5886dfbfb0ad532501683bcbf54726ab707dfe86219575917" + "size": 1002, + "sha256": "850ce3d5771d926310a26293d40e9724c2dca292bb178d121d69a251e089ef26" }, "pve/boss/sets/qingqingzijin/intro.js": { - "size": 61, - "sha256": "68187ccda36e322c0483a735e6de6e04e5d7ded9e6f6aa9a3e931f4400db2a5e" + "size": 64, + "sha256": "17fc80689618ad9d3601cc9ccb692e38eb7b66de82e21c75c246c749f2bdf1fd" }, "pve/boss/sets/qingqingzijin/perfectPairs.js": { - "size": 55, - "sha256": "7f2bd697eaaff284d2b356321a402a3cc7c0139ff6fdf339f6cbdd8da208a05f" + "size": 58, + "sha256": "a9b5f18910cf92cd6a727cf254ad8d6e1e2ba60a9cf35e9a458da34ce4fda49f" }, "pve/boss/sets/qingqingzijin/pinyin.js": { - "size": 45, - "sha256": "626d5bd4048920086440e9fbf32d2ad3eadd2ff5413591ef8d76c3a165fc758a" + "size": 48, + "sha256": "4a8648524425c2edfb8595971476398ff3c513d27ff4850895c0839945b5c1c6" }, "pve/boss/sets/qingqingzijin/skill.js": { - "size": 31461, - "sha256": "1f92669bb3148b99a297c9591e77d472e64157b98093b1445fcbedef58703aaa" + "size": 32647, + "sha256": "c8d59ee3938a960416cf21330d3b5561d9bc63ad2b65db790de7791058bdb437" }, "pve/boss/sets/qingqingzijin/sort.js": { - "size": 326, - "sha256": "12eab1f489c156bc4d4e76f5cad45fcea4cb207ef5bd654845c6768990abcc50" + "size": 340, + "sha256": "c14a970e669bff9a46fa95a1fe225c6256c7b6bf5904255d86ae7193a2fbb247" }, "pve/boss/sets/qingqingzijin/translate.js": { - "size": 4582, - "sha256": "abbee642d2172a12bde54fb4af14a2090c28b8f0e9dfa6a6f583d959e3313b99" + "size": 4639, + "sha256": "e802c830329f35d2619cd1b0573699bf7f43cb3da7bc4bdc10344620793187aa" }, "pve/boss/sets/qingqingzijin/voices.js": { - "size": 43, - "sha256": "d7f3da55f8b2e8bf77ace03bd4911497a4abb9e1f942555f7685337801278205" + "size": 46, + "sha256": "54787af1d4efcd35f20c5eca55db2e60f0cd160d7fed728440542f118e7ae44a" }, "pve/boss/sets/shiershengxiao/card.js": { - "size": 121, - "sha256": "d903002b4cc800b916e44729798bf5aa0a0f8ea0ba361620959591be723924d7" + "size": 126, + "sha256": "5fa35745834d9494a4be460c4f1cb842ee56ec797f7eaa45b7df6122c87c92ee" }, "pve/boss/sets/shiershengxiao/character.js": { - "size": 4205, - "sha256": "916d49cb0300f6fe4be738d45aa23cf4dc3dc65c4bedce78e993ffdad10de965" + "size": 4340, + "sha256": "90b33dfe2843a1fbef325fd4c0e56c72e603d67b6d80858d7f78fc4092f7a33b" }, "pve/boss/sets/shiershengxiao/characterFilter.js": { - "size": 63, - "sha256": "92164cec19b58e3a27d92426fbe227c426dff1391b2f56b2329a676a5fc4faf7" + "size": 66, + "sha256": "0dc51d476375435b50ea965fd540a6afb19134d974fe183bd924225dc3842062" }, "pve/boss/sets/shiershengxiao/characterTitle.js": { - "size": 61, - "sha256": "f4be860d37d46261a6d45e30bce661d301d79d548aeef0bfc2e8ad67fe783cea" + "size": 64, + "sha256": "b736420c47616f5e6493bc0e5d00a1a6803e8540e312ff99b0a5ae2d2de17b6f" }, "pve/boss/sets/shiershengxiao/dynamicTranslate.js": { - "size": 65, - "sha256": "d409295767b35e4867e5aa6fae92020f2a8943f71569af5539436648a345bd2f" + "size": 68, + "sha256": "906eb5fd3a454b60015c93756f9c7c5314a226972b9361b227d498d28bae1544" }, "pve/boss/sets/shiershengxiao/index.js": { - "size": 973, - "sha256": "ae301e4d28b670aaa9841a61553cb8cd2f43acf2016874469ecedc0cb04413c7" + "size": 1002, + "sha256": "7f38b79454730d249bac4b13644338e8f92e962f69e6bdb547540e7b296d5d34" }, "pve/boss/sets/shiershengxiao/intro.js": { - "size": 61, - "sha256": "68187ccda36e322c0483a735e6de6e04e5d7ded9e6f6aa9a3e931f4400db2a5e" + "size": 64, + "sha256": "17fc80689618ad9d3601cc9ccb692e38eb7b66de82e21c75c246c749f2bdf1fd" }, "pve/boss/sets/shiershengxiao/perfectPairs.js": { - "size": 55, - "sha256": "7f2bd697eaaff284d2b356321a402a3cc7c0139ff6fdf339f6cbdd8da208a05f" + "size": 58, + "sha256": "a9b5f18910cf92cd6a727cf254ad8d6e1e2ba60a9cf35e9a458da34ce4fda49f" }, "pve/boss/sets/shiershengxiao/pinyin.js": { - "size": 45, - "sha256": "626d5bd4048920086440e9fbf32d2ad3eadd2ff5413591ef8d76c3a165fc758a" + "size": 48, + "sha256": "4a8648524425c2edfb8595971476398ff3c513d27ff4850895c0839945b5c1c6" }, "pve/boss/sets/shiershengxiao/skill.js": { - "size": 14844, - "sha256": "00a93659a0eb68757291b05117f82cc19222b8cb6c7653114fb69f8a83312f83" + "size": 15413, + "sha256": "e180512e49aa6f9274253c70d56987080a61ec0388999a3cbec269024ffe8306" }, "pve/boss/sets/shiershengxiao/sort.js": { - "size": 390, - "sha256": "245b6847978bf2321137bb4b0636a5bfbab33c903310ab91c7028d7582bdf855" + "size": 406, + "sha256": "be03f8ab9f2be5c32ea37df8f058788fd19750ede246e2038406c90dc6ce2cea" }, "pve/boss/sets/shiershengxiao/translate.js": { - "size": 2890, - "sha256": "d6a6568e0484d1fcd5674a0a447aea7d6b87dd5613d91c2a3f31edb9d7bee243" + "size": 2941, + "sha256": "c2f770ecea7c27a54fc665c621dc95655e9a827836990fd9eee65dd327ddbd31" }, "pve/boss/sets/shiershengxiao/voices.js": { - "size": 1468, - "sha256": "31d90482253665abc46b7b013645461c6c0def19b3a0159d3aa70389be9402fb" + "size": 1507, + "sha256": "45e6a08bfe638bbc2f79edd7642e1303090c8e81be65fce9886199563bc95311" }, "pve/boss/sets/tianshu/card.js": { - "size": 121, - "sha256": "d903002b4cc800b916e44729798bf5aa0a0f8ea0ba361620959591be723924d7" + "size": 126, + "sha256": "5fa35745834d9494a4be460c4f1cb842ee56ec797f7eaa45b7df6122c87c92ee" }, "pve/boss/sets/tianshu/character.js": { - "size": 2428, - "sha256": "4b67d1a4f06f96247e7495341d80554dc535a98e5208cf242701e8a11b10a23c" + "size": 2509, + "sha256": "97ae40a03a777ce170d4ddef64132d071b5b379574ed87ec326f10ca52ca3e2f" }, "pve/boss/sets/tianshu/characterFilter.js": { - "size": 63, - "sha256": "92164cec19b58e3a27d92426fbe227c426dff1391b2f56b2329a676a5fc4faf7" + "size": 66, + "sha256": "0dc51d476375435b50ea965fd540a6afb19134d974fe183bd924225dc3842062" }, "pve/boss/sets/tianshu/characterTitle.js": { - "size": 61, - "sha256": "f4be860d37d46261a6d45e30bce661d301d79d548aeef0bfc2e8ad67fe783cea" + "size": 64, + "sha256": "b736420c47616f5e6493bc0e5d00a1a6803e8540e312ff99b0a5ae2d2de17b6f" }, "pve/boss/sets/tianshu/dynamicTranslate.js": { - "size": 5676, - "sha256": "76d3a303b4b59e084b1a53328e97b189bffe0e98f29c5301b235f011a325dcf3" + "size": 5803, + "sha256": "15e4e97f0ab62f916f1fd42966ad93c18748bf9ef56ecd2f56d97be62b9ece70" }, "pve/boss/sets/tianshu/index.js": { - "size": 973, - "sha256": "07fc499a405320e0bd922c8c3c8f82e998d90c56395235f76001bee21ce1623e" + "size": 1002, + "sha256": "cc538ae9e76177c89ca2e67edde68d68f371700a802cc9d5348e521a8e664b68" }, "pve/boss/sets/tianshu/intro.js": { - "size": 61, - "sha256": "68187ccda36e322c0483a735e6de6e04e5d7ded9e6f6aa9a3e931f4400db2a5e" + "size": 64, + "sha256": "17fc80689618ad9d3601cc9ccb692e38eb7b66de82e21c75c246c749f2bdf1fd" }, "pve/boss/sets/tianshu/perfectPairs.js": { - "size": 55, - "sha256": "7f2bd697eaaff284d2b356321a402a3cc7c0139ff6fdf339f6cbdd8da208a05f" + "size": 58, + "sha256": "a9b5f18910cf92cd6a727cf254ad8d6e1e2ba60a9cf35e9a458da34ce4fda49f" }, "pve/boss/sets/tianshu/pinyin.js": { - "size": 45, - "sha256": "626d5bd4048920086440e9fbf32d2ad3eadd2ff5413591ef8d76c3a165fc758a" + "size": 48, + "sha256": "4a8648524425c2edfb8595971476398ff3c513d27ff4850895c0839945b5c1c6" }, "pve/boss/sets/tianshu/skill.js": { - "size": 22253, - "sha256": "e61fb3da297ec046408a6cb408fff146db4967f0982a935ec988865c1cb2d9d1" + "size": 23174, + "sha256": "2768ff21576e5d9a55b1d97d9bb866060370e342cb95f9cd5be0e341470acced" }, "pve/boss/sets/tianshu/sort.js": { - "size": 384, - "sha256": "97b4b441fa0480468bfb63b475d2dfc26e8b7bc85f03a5686f7d9d7ad0d5aa7f" + "size": 400, + "sha256": "42238b8b9a1a1fcbdd4f6d2f8092a49558ef923a1443f07f57371f40bd4506c4" }, "pve/boss/sets/tianshu/translate.js": { - "size": 4740, - "sha256": "021b77d6ee7ada8c9962826db17e316dcdba186496630a38794d9283e8ba16e1" + "size": 4799, + "sha256": "baa234a4f9b902e647f0df3a5189ac65312332fa20c998727c855d9afad0c56c" }, "pve/boss/sets/tianshu/voices.js": { - "size": 603, - "sha256": "392188be3370d7c437641c48424c04fc732bdb13cfc91c447de5556e4ac34ba2" + "size": 615, + "sha256": "0c36f009f74fff163dda7865a3c3e493a2da73c39d44c4873bc1eadd24c3a6b0" }, "pve/boss/sets/zhuoguiquxie/card.js": { - "size": 121, - "sha256": "d903002b4cc800b916e44729798bf5aa0a0f8ea0ba361620959591be723924d7" + "size": 126, + "sha256": "5fa35745834d9494a4be460c4f1cb842ee56ec797f7eaa45b7df6122c87c92ee" }, "pve/boss/sets/zhuoguiquxie/character.js": { - "size": 3301, - "sha256": "f369b61f9b68accdcde3c04723f145146d8b43c45f087590193c2eecbad0e871" + "size": 3411, + "sha256": "c6a79c1c08f94156276fcaa45236f9bc2166a4e2e0351f286981ef5dac5c73dc" }, "pve/boss/sets/zhuoguiquxie/characterFilter.js": { - "size": 63, - "sha256": "92164cec19b58e3a27d92426fbe227c426dff1391b2f56b2329a676a5fc4faf7" + "size": 66, + "sha256": "0dc51d476375435b50ea965fd540a6afb19134d974fe183bd924225dc3842062" }, "pve/boss/sets/zhuoguiquxie/characterTitle.js": { - "size": 61, - "sha256": "f4be860d37d46261a6d45e30bce661d301d79d548aeef0bfc2e8ad67fe783cea" + "size": 64, + "sha256": "b736420c47616f5e6493bc0e5d00a1a6803e8540e312ff99b0a5ae2d2de17b6f" }, "pve/boss/sets/zhuoguiquxie/dynamicTranslate.js": { - "size": 6870, - "sha256": "3e51c0d9a7ffacb8dc17a01dbd36631cbc75d94e771cdeba0e6c74c7e43a2fee" + "size": 7041, + "sha256": "fadb1892b7209b031674f31ecbb4932a27ede38ad649a42ec689f4db1b02bf78" }, "pve/boss/sets/zhuoguiquxie/index.js": { - "size": 973, - "sha256": "6ca0fa67dd8b5fc83aaac37d22e2f2665beb2134a606c75e8c641632bf467af8" + "size": 1002, + "sha256": "892502aaa8fdf6cf1874ab8e564504053ae8168d37c41e2abcb1546e9f90357d" }, "pve/boss/sets/zhuoguiquxie/intro.js": { - "size": 61, - "sha256": "68187ccda36e322c0483a735e6de6e04e5d7ded9e6f6aa9a3e931f4400db2a5e" + "size": 64, + "sha256": "17fc80689618ad9d3601cc9ccb692e38eb7b66de82e21c75c246c749f2bdf1fd" }, "pve/boss/sets/zhuoguiquxie/perfectPairs.js": { - "size": 55, - "sha256": "7f2bd697eaaff284d2b356321a402a3cc7c0139ff6fdf339f6cbdd8da208a05f" + "size": 58, + "sha256": "a9b5f18910cf92cd6a727cf254ad8d6e1e2ba60a9cf35e9a458da34ce4fda49f" }, "pve/boss/sets/zhuoguiquxie/pinyin.js": { - "size": 45, - "sha256": "626d5bd4048920086440e9fbf32d2ad3eadd2ff5413591ef8d76c3a165fc758a" + "size": 48, + "sha256": "4a8648524425c2edfb8595971476398ff3c513d27ff4850895c0839945b5c1c6" }, "pve/boss/sets/zhuoguiquxie/skill.js": { - "size": 45067, - "sha256": "02dcd87c7fa51022fff1549a33a84264c9db4408c8001d542e998fafbd50ce9c" + "size": 46830, + "sha256": "bb729ce909a0e2c3d11c0833741eaf6493e6e13c2689926ae444f2d55dd24bb0" }, "pve/boss/sets/zhuoguiquxie/sort.js": { - "size": 375, - "sha256": "d196e9c0ed205b24df471ffac455017ae5bfd98045a6cddeccc5934e6713da01" + "size": 390, + "sha256": "3855904cdc28e6301b9f9177b6c8e04d943ef44fd002a2ce83de5aab7572930c" }, "pve/boss/sets/zhuoguiquxie/translate.js": { - "size": 6739, - "sha256": "e77e8914eccbf69bea102324bd48902e98a144d1c8023f1df704ad7af3bf6516" + "size": 6823, + "sha256": "a0dde570b580beb633432ee1d74c2051520d7e5829c584297fec0c87e62c2684" }, "pve/boss/sets/zhuoguiquxie/voices.js": { - "size": 2079, - "sha256": "a7352f7b2c1cb2bea35c259d0501bac97e05c5ff775d08e09801b2dd70c9817f" + "size": 2115, + "sha256": "d93f873a87649d413d1fc7b827c8bdb01e5f61cc11d9650f64b59de9d575e9e1" }, "pve/boss/shared.js": { - "size": 416, - "sha256": "9c0c7b0757172078f920a91cc27569456c2d1e3134130391c88ec5ab86370f79" + "size": 425, + "sha256": "61bef51415590e0d37ea7d08f5b34306fd1dd3c7591cd8de77dc7ed629c49b98" }, "pve/boss/skill.js": { - "size": 264, - "sha256": "aec438c3af87f02f714579fc048bc301d9f1bc4c2e0aa4b28c504c440dda7781" + "size": 271, + "sha256": "dcfad38fde564a88baba111100cd9b121e156478e16c8b31a286adbb0aeffd23" }, "pve/boss/sort.js": { - "size": 323, - "sha256": "ed8ae6a07446dd489ac21a08c83656b1cf5716a7ad46d343241b3decf9aec4a9" + "size": 330, + "sha256": "f7ec05f54d771ded03a4c50b1b56a6b4e48cf530e4755796a879edd714278334" }, "pve/boss/translate.js": { - "size": 265, - "sha256": "77b8f54f51025615d4a093c885156324d21325caf03c856fd0369736b4580ff2" + "size": 272, + "sha256": "f58cf928b22b712fcb374f19e5fd3343d4035e2702388b0d09b11abdd1499376" }, "pve/boss/voices.js": { - "size": 682, - "sha256": "a72b8a89b18f393665e773678630422bb8dd115abc6cb668374a7057be8659cb" + "size": 700, + "sha256": "08e50d4bc547950b939949f2d1f12bf08aefbc65e84f26cddd76b33b242f11a0" }, "pve/images/tianshu.jpg": { "size": 250592, @@ -1200,8 +1215,8 @@ "sha256": "6787f2d322dcb02edc41bb282388623ac6d1fe9bd5966ba6fe017a7cb2bbe929" }, "pve/images/青青子衿/simayi_boss_shuying.jpg": { - "size": 7770307, - "sha256": "4752a33861a9ed55633de356e60819a73918cc99c82f3c0544a0befc29515473" + "size": 195590, + "sha256": "26933ced3153897bb9cc7f25f2a8098e0d376235c538946e1a22e6b91b4d1ddc" }, "pve/images/青青子衿/yuanshu_boss_shuying.jpg": { "size": 2155807, @@ -1284,44 +1299,44 @@ "sha256": "15adcfb80bd22035c604703005ae22d1721eeafcc0a1ee09c89c73713cd3d03a" }, "tianshu/bondSkills.js": { - "size": 41588, - "sha256": "0b5a1ec26d8a8881057aa1fc8d95fecaf06fa6753d23c99a4978de83f8c44ec6" + "size": 42902, + "sha256": "cd0a38257095269f5cee24e246d7c5961b849026375fab6f9754468dd9df329c" }, "tianshu/config.js": { - "size": 29040, - "sha256": "e76b17a94d713930a9349b73c3d6492881adeefcfeb646c81423f4d5d2e42b3f" + "size": 29707, + "sha256": "9b331adca63ff4b43dc06f707c3bd728d3ce0269b1c1f4cedec5e42281f13ff0" }, "tianshu/extension.js": { - "size": 75685, - "sha256": "4f8daf966a68f1402d8aee95592318167a51df8c36445fad82824984849f429d" + "size": 77106, + "sha256": "02e3cdd9b05b7912ee0454b9aff918576e128c1294b64ea722dcd3d2c446a872" }, "tianshu/shuYing_Skill_Xvxiang1.mp3": { "size": 15451, "sha256": "41914d7d542ddfb93c89aefffc245869d63a9fb2f52293df8e6667009832afd8" }, "update.js": { - "size": 74815, - "sha256": "8f9bb238f87e20f7874154a00e0e5d05c39df80a14d83e2d1a2ca34558b66455" + "size": 77689, + "sha256": "07b1a8e332fdb996e47455b34106d09d749701bf3cd26dd843d016edc03ae266" }, "update.txt": { - "size": 4787, - "sha256": "cba4f2eb6c04eee700423c0336311a86019666232763100d0a33cca5fe09c824" + "size": 4849, + "sha256": "605be3429a648ecd676c85ac3e42598be129ab6a19d93b77fc34d7735e090f93" }, "voices.js": { - "size": 1711, - "sha256": "975c58fe201cbbc0027af5038504064382a195df278085a75eca03b2ddace75a" + "size": 1756, + "sha256": "e25930cca7ea95af9337d01a098795c1e14dd2c9628baaeb0b7c7c140fca9c9f" }, "yuanshen/extension.js": { - "size": 1044, - "sha256": "9fc00f856d6d5e3ae90d5a05f963c96574b0fad7e824c361fab5b70d01dff715" + "size": 1082, + "sha256": "a630d543c3648700cb2e3525588643382a0d72779aa8725ee5ecaa7ceaf48d0e" }, "yuanshen/八重神子/1.jpg": { "size": 331322, "sha256": "e7a5f5d79278582e93c1b5277bc823f57c4e1ad2ce85ffa7d43ef1187aa5a5d7" }, "yuanshen/八重神子/character.js": { - "size": 11986, - "sha256": "54e1bb2e200b4d43a85f8d1741b6c16f76800592629757654bfb12a409cc4813" + "size": 12302, + "sha256": "2a3dbbc035f9a6595906a3bce88b192bf521f94cab0b6f12df5833da3c2f6c4e" }, "yuanshen/八重神子/shuYing_Shashengying1.mp3": { "size": 15466, @@ -1360,8 +1375,8 @@ "sha256": "7664f30a84fcdf24b7d8719db74e89de97dca904fec62e514e5a611bae21d0cd" }, "yuanshen/可莉/character.js": { - "size": 10773, - "sha256": "424ef7516b3fa311c1abf1c0be69ca63f4d6af4b4a0490d1d451724400b9b5e1" + "size": 11072, + "sha256": "3ee1fc9fcf08ac0d1fa9a6f2e617a7a95a45d2cd313415f66906f64ec9299bf4" }, "yuanshen/可莉/shuYing_Honghong1.mp3": { "size": 134764, @@ -1410,8 +1425,8 @@ "children": { "LICENSE": { "type": "file", - "size": 35147, - "sha256": "8ceb4b9ee5adedde47b31e975c1d90c73ad27b6b165a1dcd80c7c545eb65b903" + "size": 35821, + "sha256": "0b383d5a63da644f628d99c33976ea6487ed89aaa59f0b3257992deac1171e6b" }, "character": { "type": "directory", @@ -1493,23 +1508,23 @@ }, "character.js": { "type": "file", - "size": 653, - "sha256": "6cbd7ec49ec9b9ec362f5dadb4251c219ecd468a099a082f17da86c61e0823f2" + "size": 673, + "sha256": "e90a755479cce77fa083926f221065bae3e42fa6c347537fe05a5c4d00fef72f" }, "characterFilter.js": { "type": "file", - "size": 63, - "sha256": "92164cec19b58e3a27d92426fbe227c426dff1391b2f56b2329a676a5fc4faf7" + "size": 66, + "sha256": "0dc51d476375435b50ea965fd540a6afb19134d974fe183bd924225dc3842062" }, "characterTitle.js": { "type": "file", - "size": 61, - "sha256": "f4be860d37d46261a6d45e30bce661d301d79d548aeef0bfc2e8ad67fe783cea" + "size": 64, + "sha256": "b736420c47616f5e6493bc0e5d00a1a6803e8540e312ff99b0a5ae2d2de17b6f" }, "dynamicTranslate.js": { "type": "file", - "size": 872, - "sha256": "63a56c336e881b15e08374656863b67b7465eedf6af683f8bade3d33b12f2704" + "size": 883, + "sha256": "58b234c5f801b6d7ec65ea5344d4cb075f9b2e1d2f4df65ef95ea24b3ddba995" }, "images": { "type": "directory", @@ -1528,60 +1543,80 @@ }, "index.js": { "type": "file", - "size": 1002, - "sha256": "ef3dcf49147bead5a4b58c56aa23f983e7fda7c4769f276f1f228293f87acc33" + "size": 1030, + "sha256": "3e365b2c30eb0f9a890f7b4ed777f337a0ea4a202e7db0132e4b533a5ad5bbb0" }, "intro.js": { "type": "file", - "size": 61, - "sha256": "68187ccda36e322c0483a735e6de6e04e5d7ded9e6f6aa9a3e931f4400db2a5e" + "size": 64, + "sha256": "17fc80689618ad9d3601cc9ccb692e38eb7b66de82e21c75c246c749f2bdf1fd" }, "perfectPairs.js": { "type": "file", - "size": 55, - "sha256": "7f2bd697eaaff284d2b356321a402a3cc7c0139ff6fdf339f6cbdd8da208a05f" + "size": 58, + "sha256": "a9b5f18910cf92cd6a727cf254ad8d6e1e2ba60a9cf35e9a458da34ce4fda49f" }, "skill.js": { "type": "file", - "size": 31285, - "sha256": "608ad1b6463bda8318b91f729dce0cdf98a223d0a72fd1fac35cf32b49e69c08" + "size": 32111, + "sha256": "78294951c6d0e53ab2ad718aa128d437e3eea2579bb9644546a79864875e21f6" }, "sort.js": { "type": "file", - "size": 112, - "sha256": "42cf6bb834aca4ff883aa196604f3d9d2d9047bb320cf56a633aae4ecbb5ce4c" + "size": 116, + "sha256": "a2864d98878342280c81bc527a1168b4dccf7976dc40e49c50c9037679bc7ca5" }, "translate.js": { "type": "file", - "size": 2091, - "sha256": "2a31d41939f1d636f9c1b2378d0f15cf7aa5c9e2caa35b465066deb4f877e4bb" + "size": 2108, + "sha256": "e533d53409068342100dbdb42ec0832aac656988ca42a168a915dd851e7b4d06" }, "voices.js": { "type": "file", - "size": 43, - "sha256": "d7f3da55f8b2e8bf77ace03bd4911497a4abb9e1f942555f7685337801278205" + "size": 46, + "sha256": "54787af1d4efcd35f20c5eca55db2e60f0cd160d7fed728440542f118e7ae44a" + } + } + }, + "diagnostics": { + "type": "directory", + "children": { + "index.js": { + "type": "file", + "size": 14862, + "sha256": "bb89045b70dd36ba3539b74ea80725e57f28bfae4d332c04c1e8319d99258bd6" + }, + "serialize.js": { + "type": "file", + "size": 5607, + "sha256": "1456abb806511dcbe2f3cfea5f036741d8c0761a7a6c1f008a73c52007d1086d" + }, + "storage.js": { + "type": "file", + "size": 8047, + "sha256": "3d6b861ce1186cd7d8123b61e7e8095f36bc2af041b13ab3511b04bb0b375f86" } } }, "extension.css": { "type": "file", - "size": 55501, - "sha256": "0907c22921f33d3180378dfcec4cdea793227d325c281d5f3a3f698c83b42b85" + "size": 57424, + "sha256": "f62d07820aa0f93915719bdd334b3513673b0b02d94e89f12deed3c07c4731dd" }, "extension.js": { "type": "file", - "size": 15464, - "sha256": "11db6f84273c2928db92b42d9ab1f2def6e2f796393119f7f7a0177ad2b9d818" + "size": 16317, + "sha256": "eee5e5ec1ba9f34a613d14812f1829c8aec656080812533596405434551983f6" }, "function.js": { "type": "file", - "size": 36025, - "sha256": "39a02025adc2459c93c4f5539c7c3a9b70c0d344284d43252af8be52e8565c33" + "size": 36629, + "sha256": "33ba3335fee271173fc454b25c5122e9e2b686eabdff30a54599e5cd31800710" }, "menu.js": { "type": "file", - "size": 29114, - "sha256": "bd54fda361282e08102d6d7557b21216fb74198c3db9d164405b12f74fcc7f3b" + "size": 30671, + "sha256": "3b6af8ff6d53c289f94fbaa320be91c3a7a0b554ba999e0bfc26ae6227981862" }, "pve": { "type": "directory", @@ -2151,58 +2186,58 @@ "children": { "card.js": { "type": "file", - "size": 165, - "sha256": "81618e415c8932e76e88a8552be215143dc7fb075d24df30332646c8ba8df160" + "size": 171, + "sha256": "3c0a2d89226ed8ea5dfb5238221d63b117a6624e027cde03ba6671dfd5548c2c" }, "character.js": { "type": "file", - "size": 253, - "sha256": "ae70f8ee9c4aab84f6f6edac88cd6095a6213d19948d366c32d983f58c8bc2f3" + "size": 260, + "sha256": "3777e2a7cc00bf3b6e9842f65acf314df2786cb8596ee213254e074738782de4" }, "characterFilter.js": { "type": "file", - "size": 204, - "sha256": "f9b6cbe34f75d43b2493ffbaa137baebaebe1118b36ea731e5270497c7e88dfa" + "size": 210, + "sha256": "e0cffda20018e8abb3c208359221633f049c77d9246bfc492f740430162c05a1" }, "characterTitle.js": { "type": "file", - "size": 201, - "sha256": "8be70f8fa2ada89d26697b87234ee38e60d19b51d6d6dcc754e37455030810d0" + "size": 207, + "sha256": "f28a5994a540f50851a2a8c66733e8d326f8de59169f2f22a556243837cf0bc2" }, "dynamicTranslate.js": { "type": "file", - "size": 280, - "sha256": "ab9d2e77ab3df1fb6c57a0b678b4866f1ded3d3d2af9e2c309fcf7c43105a015" + "size": 287, + "sha256": "924be3ff97147ac8f113eb35ef1aeadab0b3227b1eca61fe5d4d5197242ced30" }, "index.js": { "type": "file", - "size": 1105, - "sha256": "ee95a08cec01c8dd33ad7469c33c2eaa18ab1697c0d668a930e4c943dcc24b96" + "size": 1137, + "sha256": "578e2c7f50e42c5e92b445e9bcf0dafa68f28ff2415877c4b1ff492783152372" }, "intro.js": { "type": "file", - "size": 201, - "sha256": "fbfacd5ccd33ff90844ea94eba09aa9072c24a8fbdb5ac259f1ad42ffb4860eb" + "size": 207, + "sha256": "6fe542ceb77e006a80810c95145b614ae13487acad5abd59059652417dbfb3ac" }, "merge.js": { "type": "file", - "size": 918, - "sha256": "482113df0ab59b0c5f1fb9c080cedee2a0c19f52613409fd0cb600213f555edf" + "size": 940, + "sha256": "47e0aa7f324b0e8d13737aa07065a18bef69049a6c4c5eafd61996024e84b387" }, "perfectPairs.js": { "type": "file", - "size": 192, - "sha256": "bdaf0a62c1480eed16a37258fe74c7f405380e889e43d41da0ef08f5f8436c49" + "size": 198, + "sha256": "228d84d6013ad2b11f789363854bc05dcfe259fdfadaee84acb95421497927ca" }, "pinyin.js": { "type": "file", - "size": 172, - "sha256": "85a0c2248d2b6c69391816a76d62e9eb6a4288f68d3647bc27a89e2a697c6fc2" + "size": 178, + "sha256": "34acc90748a2ce6de749d841e371b11a75bd169b782d6bd2672cb50a70bdb21b" }, "sets.js": { "type": "file", - "size": 488, - "sha256": "6809745b6ed34f473e0726c87ed41c30d48bc0b95cc4b5ec4796dc169582810c" + "size": 502, + "sha256": "78de634dd7eebc7b6657b23bafa74ea274568e303179eb489f052bae1d19d044" }, "sets": { "type": "directory", @@ -2212,68 +2247,68 @@ "children": { "card.js": { "type": "file", - "size": 121, - "sha256": "d903002b4cc800b916e44729798bf5aa0a0f8ea0ba361620959591be723924d7" + "size": 126, + "sha256": "5fa35745834d9494a4be460c4f1cb842ee56ec797f7eaa45b7df6122c87c92ee" }, "character.js": { "type": "file", - "size": 2395, - "sha256": "d303c8e2b14b9b859c08368e1740dd31782385951169f59b0d82e0894d4f9592" + "size": 2464, + "sha256": "8f7b1710cec7d7d90f62127330abb838163d91c29603fab7b8920711b1ec31e7" }, "characterFilter.js": { "type": "file", - "size": 63, - "sha256": "92164cec19b58e3a27d92426fbe227c426dff1391b2f56b2329a676a5fc4faf7" + "size": 66, + "sha256": "0dc51d476375435b50ea965fd540a6afb19134d974fe183bd924225dc3842062" }, "characterTitle.js": { "type": "file", - "size": 61, - "sha256": "f4be860d37d46261a6d45e30bce661d301d79d548aeef0bfc2e8ad67fe783cea" + "size": 64, + "sha256": "b736420c47616f5e6493bc0e5d00a1a6803e8540e312ff99b0a5ae2d2de17b6f" }, "dynamicTranslate.js": { "type": "file", - "size": 4155, - "sha256": "660534f1ca8e49c531ceb3872321694d27556d031e8f97740aa2410084c8c3c4" + "size": 4248, + "sha256": "13ef52691ea5f23176608b21471d80e03285941e7687f69c3c93af5aeccf7e64" }, "index.js": { "type": "file", - "size": 973, - "sha256": "663d9089071b4fc5886dfbfb0ad532501683bcbf54726ab707dfe86219575917" + "size": 1002, + "sha256": "850ce3d5771d926310a26293d40e9724c2dca292bb178d121d69a251e089ef26" }, "intro.js": { "type": "file", - "size": 61, - "sha256": "68187ccda36e322c0483a735e6de6e04e5d7ded9e6f6aa9a3e931f4400db2a5e" + "size": 64, + "sha256": "17fc80689618ad9d3601cc9ccb692e38eb7b66de82e21c75c246c749f2bdf1fd" }, "perfectPairs.js": { "type": "file", - "size": 55, - "sha256": "7f2bd697eaaff284d2b356321a402a3cc7c0139ff6fdf339f6cbdd8da208a05f" + "size": 58, + "sha256": "a9b5f18910cf92cd6a727cf254ad8d6e1e2ba60a9cf35e9a458da34ce4fda49f" }, "pinyin.js": { "type": "file", - "size": 45, - "sha256": "626d5bd4048920086440e9fbf32d2ad3eadd2ff5413591ef8d76c3a165fc758a" + "size": 48, + "sha256": "4a8648524425c2edfb8595971476398ff3c513d27ff4850895c0839945b5c1c6" }, "skill.js": { "type": "file", - "size": 31461, - "sha256": "1f92669bb3148b99a297c9591e77d472e64157b98093b1445fcbedef58703aaa" + "size": 32647, + "sha256": "c8d59ee3938a960416cf21330d3b5561d9bc63ad2b65db790de7791058bdb437" }, "sort.js": { "type": "file", - "size": 326, - "sha256": "12eab1f489c156bc4d4e76f5cad45fcea4cb207ef5bd654845c6768990abcc50" + "size": 340, + "sha256": "c14a970e669bff9a46fa95a1fe225c6256c7b6bf5904255d86ae7193a2fbb247" }, "translate.js": { "type": "file", - "size": 4582, - "sha256": "abbee642d2172a12bde54fb4af14a2090c28b8f0e9dfa6a6f583d959e3313b99" + "size": 4639, + "sha256": "e802c830329f35d2619cd1b0573699bf7f43cb3da7bc4bdc10344620793187aa" }, "voices.js": { "type": "file", - "size": 43, - "sha256": "d7f3da55f8b2e8bf77ace03bd4911497a4abb9e1f942555f7685337801278205" + "size": 46, + "sha256": "54787af1d4efcd35f20c5eca55db2e60f0cd160d7fed728440542f118e7ae44a" } } }, @@ -2282,68 +2317,68 @@ "children": { "card.js": { "type": "file", - "size": 121, - "sha256": "d903002b4cc800b916e44729798bf5aa0a0f8ea0ba361620959591be723924d7" + "size": 126, + "sha256": "5fa35745834d9494a4be460c4f1cb842ee56ec797f7eaa45b7df6122c87c92ee" }, "character.js": { "type": "file", - "size": 4205, - "sha256": "916d49cb0300f6fe4be738d45aa23cf4dc3dc65c4bedce78e993ffdad10de965" + "size": 4340, + "sha256": "90b33dfe2843a1fbef325fd4c0e56c72e603d67b6d80858d7f78fc4092f7a33b" }, "characterFilter.js": { "type": "file", - "size": 63, - "sha256": "92164cec19b58e3a27d92426fbe227c426dff1391b2f56b2329a676a5fc4faf7" + "size": 66, + "sha256": "0dc51d476375435b50ea965fd540a6afb19134d974fe183bd924225dc3842062" }, "characterTitle.js": { "type": "file", - "size": 61, - "sha256": "f4be860d37d46261a6d45e30bce661d301d79d548aeef0bfc2e8ad67fe783cea" + "size": 64, + "sha256": "b736420c47616f5e6493bc0e5d00a1a6803e8540e312ff99b0a5ae2d2de17b6f" }, "dynamicTranslate.js": { "type": "file", - "size": 65, - "sha256": "d409295767b35e4867e5aa6fae92020f2a8943f71569af5539436648a345bd2f" + "size": 68, + "sha256": "906eb5fd3a454b60015c93756f9c7c5314a226972b9361b227d498d28bae1544" }, "index.js": { "type": "file", - "size": 973, - "sha256": "ae301e4d28b670aaa9841a61553cb8cd2f43acf2016874469ecedc0cb04413c7" + "size": 1002, + "sha256": "7f38b79454730d249bac4b13644338e8f92e962f69e6bdb547540e7b296d5d34" }, "intro.js": { "type": "file", - "size": 61, - "sha256": "68187ccda36e322c0483a735e6de6e04e5d7ded9e6f6aa9a3e931f4400db2a5e" + "size": 64, + "sha256": "17fc80689618ad9d3601cc9ccb692e38eb7b66de82e21c75c246c749f2bdf1fd" }, "perfectPairs.js": { "type": "file", - "size": 55, - "sha256": "7f2bd697eaaff284d2b356321a402a3cc7c0139ff6fdf339f6cbdd8da208a05f" + "size": 58, + "sha256": "a9b5f18910cf92cd6a727cf254ad8d6e1e2ba60a9cf35e9a458da34ce4fda49f" }, "pinyin.js": { "type": "file", - "size": 45, - "sha256": "626d5bd4048920086440e9fbf32d2ad3eadd2ff5413591ef8d76c3a165fc758a" + "size": 48, + "sha256": "4a8648524425c2edfb8595971476398ff3c513d27ff4850895c0839945b5c1c6" }, "skill.js": { "type": "file", - "size": 14844, - "sha256": "00a93659a0eb68757291b05117f82cc19222b8cb6c7653114fb69f8a83312f83" + "size": 15413, + "sha256": "e180512e49aa6f9274253c70d56987080a61ec0388999a3cbec269024ffe8306" }, "sort.js": { "type": "file", - "size": 390, - "sha256": "245b6847978bf2321137bb4b0636a5bfbab33c903310ab91c7028d7582bdf855" + "size": 406, + "sha256": "be03f8ab9f2be5c32ea37df8f058788fd19750ede246e2038406c90dc6ce2cea" }, "translate.js": { "type": "file", - "size": 2890, - "sha256": "d6a6568e0484d1fcd5674a0a447aea7d6b87dd5613d91c2a3f31edb9d7bee243" + "size": 2941, + "sha256": "c2f770ecea7c27a54fc665c621dc95655e9a827836990fd9eee65dd327ddbd31" }, "voices.js": { "type": "file", - "size": 1468, - "sha256": "31d90482253665abc46b7b013645461c6c0def19b3a0159d3aa70389be9402fb" + "size": 1507, + "sha256": "45e6a08bfe638bbc2f79edd7642e1303090c8e81be65fce9886199563bc95311" } } }, @@ -2352,68 +2387,68 @@ "children": { "card.js": { "type": "file", - "size": 121, - "sha256": "d903002b4cc800b916e44729798bf5aa0a0f8ea0ba361620959591be723924d7" + "size": 126, + "sha256": "5fa35745834d9494a4be460c4f1cb842ee56ec797f7eaa45b7df6122c87c92ee" }, "character.js": { "type": "file", - "size": 2428, - "sha256": "4b67d1a4f06f96247e7495341d80554dc535a98e5208cf242701e8a11b10a23c" + "size": 2509, + "sha256": "97ae40a03a777ce170d4ddef64132d071b5b379574ed87ec326f10ca52ca3e2f" }, "characterFilter.js": { "type": "file", - "size": 63, - "sha256": "92164cec19b58e3a27d92426fbe227c426dff1391b2f56b2329a676a5fc4faf7" + "size": 66, + "sha256": "0dc51d476375435b50ea965fd540a6afb19134d974fe183bd924225dc3842062" }, "characterTitle.js": { "type": "file", - "size": 61, - "sha256": "f4be860d37d46261a6d45e30bce661d301d79d548aeef0bfc2e8ad67fe783cea" + "size": 64, + "sha256": "b736420c47616f5e6493bc0e5d00a1a6803e8540e312ff99b0a5ae2d2de17b6f" }, "dynamicTranslate.js": { "type": "file", - "size": 5676, - "sha256": "76d3a303b4b59e084b1a53328e97b189bffe0e98f29c5301b235f011a325dcf3" + "size": 5803, + "sha256": "15e4e97f0ab62f916f1fd42966ad93c18748bf9ef56ecd2f56d97be62b9ece70" }, "index.js": { "type": "file", - "size": 973, - "sha256": "07fc499a405320e0bd922c8c3c8f82e998d90c56395235f76001bee21ce1623e" + "size": 1002, + "sha256": "cc538ae9e76177c89ca2e67edde68d68f371700a802cc9d5348e521a8e664b68" }, "intro.js": { "type": "file", - "size": 61, - "sha256": "68187ccda36e322c0483a735e6de6e04e5d7ded9e6f6aa9a3e931f4400db2a5e" + "size": 64, + "sha256": "17fc80689618ad9d3601cc9ccb692e38eb7b66de82e21c75c246c749f2bdf1fd" }, "perfectPairs.js": { "type": "file", - "size": 55, - "sha256": "7f2bd697eaaff284d2b356321a402a3cc7c0139ff6fdf339f6cbdd8da208a05f" + "size": 58, + "sha256": "a9b5f18910cf92cd6a727cf254ad8d6e1e2ba60a9cf35e9a458da34ce4fda49f" }, "pinyin.js": { "type": "file", - "size": 45, - "sha256": "626d5bd4048920086440e9fbf32d2ad3eadd2ff5413591ef8d76c3a165fc758a" + "size": 48, + "sha256": "4a8648524425c2edfb8595971476398ff3c513d27ff4850895c0839945b5c1c6" }, "skill.js": { "type": "file", - "size": 22253, - "sha256": "e61fb3da297ec046408a6cb408fff146db4967f0982a935ec988865c1cb2d9d1" + "size": 23174, + "sha256": "2768ff21576e5d9a55b1d97d9bb866060370e342cb95f9cd5be0e341470acced" }, "sort.js": { "type": "file", - "size": 384, - "sha256": "97b4b441fa0480468bfb63b475d2dfc26e8b7bc85f03a5686f7d9d7ad0d5aa7f" + "size": 400, + "sha256": "42238b8b9a1a1fcbdd4f6d2f8092a49558ef923a1443f07f57371f40bd4506c4" }, "translate.js": { "type": "file", - "size": 4740, - "sha256": "021b77d6ee7ada8c9962826db17e316dcdba186496630a38794d9283e8ba16e1" + "size": 4799, + "sha256": "baa234a4f9b902e647f0df3a5189ac65312332fa20c998727c855d9afad0c56c" }, "voices.js": { "type": "file", - "size": 603, - "sha256": "392188be3370d7c437641c48424c04fc732bdb13cfc91c447de5556e4ac34ba2" + "size": 615, + "sha256": "0c36f009f74fff163dda7865a3c3e493a2da73c39d44c4873bc1eadd24c3a6b0" } } }, @@ -2422,68 +2457,68 @@ "children": { "card.js": { "type": "file", - "size": 121, - "sha256": "d903002b4cc800b916e44729798bf5aa0a0f8ea0ba361620959591be723924d7" + "size": 126, + "sha256": "5fa35745834d9494a4be460c4f1cb842ee56ec797f7eaa45b7df6122c87c92ee" }, "character.js": { "type": "file", - "size": 3301, - "sha256": "f369b61f9b68accdcde3c04723f145146d8b43c45f087590193c2eecbad0e871" + "size": 3411, + "sha256": "c6a79c1c08f94156276fcaa45236f9bc2166a4e2e0351f286981ef5dac5c73dc" }, "characterFilter.js": { "type": "file", - "size": 63, - "sha256": "92164cec19b58e3a27d92426fbe227c426dff1391b2f56b2329a676a5fc4faf7" + "size": 66, + "sha256": "0dc51d476375435b50ea965fd540a6afb19134d974fe183bd924225dc3842062" }, "characterTitle.js": { "type": "file", - "size": 61, - "sha256": "f4be860d37d46261a6d45e30bce661d301d79d548aeef0bfc2e8ad67fe783cea" + "size": 64, + "sha256": "b736420c47616f5e6493bc0e5d00a1a6803e8540e312ff99b0a5ae2d2de17b6f" }, "dynamicTranslate.js": { "type": "file", - "size": 6870, - "sha256": "3e51c0d9a7ffacb8dc17a01dbd36631cbc75d94e771cdeba0e6c74c7e43a2fee" + "size": 7041, + "sha256": "fadb1892b7209b031674f31ecbb4932a27ede38ad649a42ec689f4db1b02bf78" }, "index.js": { "type": "file", - "size": 973, - "sha256": "6ca0fa67dd8b5fc83aaac37d22e2f2665beb2134a606c75e8c641632bf467af8" + "size": 1002, + "sha256": "892502aaa8fdf6cf1874ab8e564504053ae8168d37c41e2abcb1546e9f90357d" }, "intro.js": { "type": "file", - "size": 61, - "sha256": "68187ccda36e322c0483a735e6de6e04e5d7ded9e6f6aa9a3e931f4400db2a5e" + "size": 64, + "sha256": "17fc80689618ad9d3601cc9ccb692e38eb7b66de82e21c75c246c749f2bdf1fd" }, "perfectPairs.js": { "type": "file", - "size": 55, - "sha256": "7f2bd697eaaff284d2b356321a402a3cc7c0139ff6fdf339f6cbdd8da208a05f" + "size": 58, + "sha256": "a9b5f18910cf92cd6a727cf254ad8d6e1e2ba60a9cf35e9a458da34ce4fda49f" }, "pinyin.js": { "type": "file", - "size": 45, - "sha256": "626d5bd4048920086440e9fbf32d2ad3eadd2ff5413591ef8d76c3a165fc758a" + "size": 48, + "sha256": "4a8648524425c2edfb8595971476398ff3c513d27ff4850895c0839945b5c1c6" }, "skill.js": { "type": "file", - "size": 45067, - "sha256": "02dcd87c7fa51022fff1549a33a84264c9db4408c8001d542e998fafbd50ce9c" + "size": 46830, + "sha256": "bb729ce909a0e2c3d11c0833741eaf6493e6e13c2689926ae444f2d55dd24bb0" }, "sort.js": { "type": "file", - "size": 375, - "sha256": "d196e9c0ed205b24df471ffac455017ae5bfd98045a6cddeccc5934e6713da01" + "size": 390, + "sha256": "3855904cdc28e6301b9f9177b6c8e04d943ef44fd002a2ce83de5aab7572930c" }, "translate.js": { "type": "file", - "size": 6739, - "sha256": "e77e8914eccbf69bea102324bd48902e98a144d1c8023f1df704ad7af3bf6516" + "size": 6823, + "sha256": "a0dde570b580beb633432ee1d74c2051520d7e5829c584297fec0c87e62c2684" }, "voices.js": { "type": "file", - "size": 2079, - "sha256": "a7352f7b2c1cb2bea35c259d0501bac97e05c5ff775d08e09801b2dd70c9817f" + "size": 2115, + "sha256": "d93f873a87649d413d1fc7b827c8bdb01e5f61cc11d9650f64b59de9d575e9e1" } } } @@ -2491,28 +2526,28 @@ }, "shared.js": { "type": "file", - "size": 416, - "sha256": "9c0c7b0757172078f920a91cc27569456c2d1e3134130391c88ec5ab86370f79" + "size": 425, + "sha256": "61bef51415590e0d37ea7d08f5b34306fd1dd3c7591cd8de77dc7ed629c49b98" }, "skill.js": { "type": "file", - "size": 264, - "sha256": "aec438c3af87f02f714579fc048bc301d9f1bc4c2e0aa4b28c504c440dda7781" + "size": 271, + "sha256": "dcfad38fde564a88baba111100cd9b121e156478e16c8b31a286adbb0aeffd23" }, "sort.js": { "type": "file", - "size": 323, - "sha256": "ed8ae6a07446dd489ac21a08c83656b1cf5716a7ad46d343241b3decf9aec4a9" + "size": 330, + "sha256": "f7ec05f54d771ded03a4c50b1b56a6b4e48cf530e4755796a879edd714278334" }, "translate.js": { "type": "file", - "size": 265, - "sha256": "77b8f54f51025615d4a093c885156324d21325caf03c856fd0369736b4580ff2" + "size": 272, + "sha256": "f58cf928b22b712fcb374f19e5fd3343d4035e2702388b0d09b11abdd1499376" }, "voices.js": { "type": "file", - "size": 682, - "sha256": "a72b8a89b18f393665e773678630422bb8dd115abc6cb668374a7057be8659cb" + "size": 700, + "sha256": "08e50d4bc547950b939949f2d1f12bf08aefbc65e84f26cddd76b33b242f11a0" } } }, @@ -2679,8 +2714,8 @@ }, "simayi_boss_shuying.jpg": { "type": "file", - "size": 7770307, - "sha256": "4752a33861a9ed55633de356e60819a73918cc99c82f3c0544a0befc29515473" + "size": 195590, + "sha256": "26933ced3153897bb9cc7f25f2a8098e0d376235c538946e1a22e6b91b4d1ddc" }, "yuanshu_boss_shuying.jpg": { "type": "file", @@ -2803,18 +2838,18 @@ "children": { "bondSkills.js": { "type": "file", - "size": 41588, - "sha256": "0b5a1ec26d8a8881057aa1fc8d95fecaf06fa6753d23c99a4978de83f8c44ec6" + "size": 42902, + "sha256": "cd0a38257095269f5cee24e246d7c5961b849026375fab6f9754468dd9df329c" }, "config.js": { "type": "file", - "size": 29040, - "sha256": "e76b17a94d713930a9349b73c3d6492881adeefcfeb646c81423f4d5d2e42b3f" + "size": 29707, + "sha256": "9b331adca63ff4b43dc06f707c3bd728d3ce0269b1c1f4cedec5e42281f13ff0" }, "extension.js": { "type": "file", - "size": 75685, - "sha256": "4f8daf966a68f1402d8aee95592318167a51df8c36445fad82824984849f429d" + "size": 77106, + "sha256": "02e3cdd9b05b7912ee0454b9aff918576e128c1294b64ea722dcd3d2c446a872" }, "shuYing_Skill_Xvxiang1.mp3": { "type": "file", @@ -2825,26 +2860,26 @@ }, "update.js": { "type": "file", - "size": 74815, - "sha256": "8f9bb238f87e20f7874154a00e0e5d05c39df80a14d83e2d1a2ca34558b66455" + "size": 77689, + "sha256": "07b1a8e332fdb996e47455b34106d09d749701bf3cd26dd843d016edc03ae266" }, "update.txt": { "type": "file", - "size": 4787, - "sha256": "cba4f2eb6c04eee700423c0336311a86019666232763100d0a33cca5fe09c824" + "size": 4849, + "sha256": "605be3429a648ecd676c85ac3e42598be129ab6a19d93b77fc34d7735e090f93" }, "voices.js": { "type": "file", - "size": 1711, - "sha256": "975c58fe201cbbc0027af5038504064382a195df278085a75eca03b2ddace75a" + "size": 1756, + "sha256": "e25930cca7ea95af9337d01a098795c1e14dd2c9628baaeb0b7c7c140fca9c9f" }, "yuanshen": { "type": "directory", "children": { "extension.js": { "type": "file", - "size": 1044, - "sha256": "9fc00f856d6d5e3ae90d5a05f963c96574b0fad7e824c361fab5b70d01dff715" + "size": 1082, + "sha256": "a630d543c3648700cb2e3525588643382a0d72779aa8725ee5ecaa7ceaf48d0e" }, "八重神子": { "type": "directory", @@ -2856,8 +2891,8 @@ }, "character.js": { "type": "file", - "size": 11986, - "sha256": "54e1bb2e200b4d43a85f8d1741b6c16f76800592629757654bfb12a409cc4813" + "size": 12302, + "sha256": "2a3dbbc035f9a6595906a3bce88b192bf521f94cab0b6f12df5833da3c2f6c4e" }, "shuYing_Shashengying1.mp3": { "type": "file", @@ -2911,8 +2946,8 @@ }, "character.js": { "type": "file", - "size": 10773, - "sha256": "424ef7516b3fa311c1abf1c0be69ca63f4d6af4b4a0490d1d451724400b9b5e1" + "size": 11072, + "sha256": "3ee1fc9fcf08ac0d1fa9a6f2e617a7a95a45d2cd313415f66906f64ec9299bf4" }, "shuYing_Honghong1.mp3": { "type": "file", @@ -2975,8 +3010,8 @@ "title": "梦三模式", "entry": "mengsan/register.js", "manifest": "dist/modules/mengsan.json", - "file_count": 458, - "size_bytes": 145105480, + "file_count": 763, + "size_bytes": 147712610, "legacy_manifest": "dist/modules/mengsan.legacy.json" } } diff --git a/dist/modules/mengsan.json b/dist/modules/mengsan.json index fe03455..a06b343 100644 --- a/dist/modules/mengsan.json +++ b/dist/modules/mengsan.json @@ -1,11 +1,11 @@ { - "version": "2.0.2.3-rc.2", - "generated_at": "2026-10-05T15:23:57.474506+00:00", + "version": "2.0.2.3-rc.3", + "generated_at": "2026-10-08T15:53:16.836871+00:00", "algorithm": "sha256", "update_channels": true, - "file_count": 458, - "size_bytes": 145105480, - "folder_sha256": "4b95da022c047949a009458df83b931c36f2f537807b3efd2494cdc79d147204", + "file_count": 763, + "size_bytes": 147712610, + "folder_sha256": "87eb69f97dde3ac7a02979505d5ca5bd98fbc67e721681c953e5eb5a35f1c22e", "core": [ "mengsan/register.js" ], @@ -302,6 +302,305 @@ "mengsan/assets/portraits/wriggler-forest-portrait.png", "mengsan/assets/portraits/wriggler-original.webp", "mengsan/assets/portraits/zhangfei-portrait.jpg", + "mengsan/assets/relics/akabeko.png", + "mengsan/assets/relics/alchemical_coffer.png", + "mengsan/assets/relics/amethyst_aubergine.png", + "mengsan/assets/relics/anchor.png", + "mengsan/assets/relics/arcane_scroll.png", + "mengsan/assets/relics/archaic_tooth.png", + "mengsan/assets/relics/art_of_war.png", + "mengsan/assets/relics/astrolabe.png", + "mengsan/assets/relics/bag_of_marbles.png", + "mengsan/assets/relics/bag_of_preparation.png", + "mengsan/assets/relics/beating_remnant.png", + "mengsan/assets/relics/beautiful_bracelet.png", + "mengsan/assets/relics/bellows.png", + "mengsan/assets/relics/belt_buckle.png", + "mengsan/assets/relics/big_hat.png", + "mengsan/assets/relics/big_mushroom.png", + "mengsan/assets/relics/biiig_hug.png", + "mengsan/assets/relics/bing_bong.png", + "mengsan/assets/relics/black_blood.png", + "mengsan/assets/relics/black_star.png", + "mengsan/assets/relics/blessed_antler.png", + "mengsan/assets/relics/blood_soaked_rose.png", + "mengsan/assets/relics/blood_vial.png", + "mengsan/assets/relics/bone_flute.png", + "mengsan/assets/relics/bone_tea.png", + "mengsan/assets/relics/book_of_five_rings.png", + "mengsan/assets/relics/book_repair_knife.png", + "mengsan/assets/relics/bookmark.png", + "mengsan/assets/relics/booming_conch.png", + "mengsan/assets/relics/bound_phylactery.png", + "mengsan/assets/relics/bowler_hat.png", + "mengsan/assets/relics/bread.png", + "mengsan/assets/relics/brilliant_scarf.png", + "mengsan/assets/relics/brimstone.png", + "mengsan/assets/relics/bronze_scales.png", + "mengsan/assets/relics/burning_blood.png", + "mengsan/assets/relics/burning_sticks.png", + "mengsan/assets/relics/byrdpip.png", + "mengsan/assets/relics/calling_bell.png", + "mengsan/assets/relics/candelabra.png", + "mengsan/assets/relics/captains_wheel.png", + "mengsan/assets/relics/cauldron.png", + "mengsan/assets/relics/centennial_puzzle.png", + "mengsan/assets/relics/chandelier.png", + "mengsan/assets/relics/charons_ashes.png", + "mengsan/assets/relics/chemical_x.png", + "mengsan/assets/relics/choices_paradox.png", + "mengsan/assets/relics/chosen_cheese.png", + "mengsan/assets/relics/circlet.png", + "mengsan/assets/relics/claws.png", + "mengsan/assets/relics/cloak_clasp.png", + "mengsan/assets/relics/cracked_core.png", + "mengsan/assets/relics/crossbow.png", + "mengsan/assets/relics/cursed_pearl.png", + "mengsan/assets/relics/darkstone_periapt.png", + "mengsan/assets/relics/data_disk.png", + "mengsan/assets/relics/daughter_of_the_wind.png", + "mengsan/assets/relics/delicate_frond.png", + "mengsan/assets/relics/demon_tongue.png", + "mengsan/assets/relics/diamond_diadem.png", + "mengsan/assets/relics/dingy_rug.png", + "mengsan/assets/relics/distinguished_cape.png", + "mengsan/assets/relics/divine_destiny.png", + "mengsan/assets/relics/divine_right.png", + "mengsan/assets/relics/dollys_mirror.png", + "mengsan/assets/relics/dowsing_rod.png", + "mengsan/assets/relics/dragon_fruit.png", + "mengsan/assets/relics/dream_catcher.png", + "mengsan/assets/relics/driftwood.png", + "mengsan/assets/relics/dusty_tome.png", + "mengsan/assets/relics/ectoplasm.png", + "mengsan/assets/relics/electric_shrymp.png", + "mengsan/assets/relics/ember_tea.png", + "mengsan/assets/relics/emotion_chip.png", + "mengsan/assets/relics/empty_cage.png", + "mengsan/assets/relics/eternal_feather.png", + "mengsan/assets/relics/fake_anchor.png", + "mengsan/assets/relics/fake_blood_vial.png", + "mengsan/assets/relics/fake_happy_flower.png", + "mengsan/assets/relics/fake_lees_waffle.png", + "mengsan/assets/relics/fake_mango.png", + "mengsan/assets/relics/fake_merchants_rug.png", + "mengsan/assets/relics/fake_orichalcum.png", + "mengsan/assets/relics/fake_snecko_eye.png", + "mengsan/assets/relics/fake_strike_dummy.png", + "mengsan/assets/relics/fake_venerable_tea_set.png", + "mengsan/assets/relics/fencing_manual.png", + "mengsan/assets/relics/festive_popper.png", + "mengsan/assets/relics/fiddle.png", + "mengsan/assets/relics/fishing_rod.png", + "mengsan/assets/relics/forgotten_soul.png", + "mengsan/assets/relics/fragrant_mushroom.png", + "mengsan/assets/relics/fresnel_lens.png", + "mengsan/assets/relics/frozen_egg.png", + "mengsan/assets/relics/funerary_mask.png", + "mengsan/assets/relics/fur_coat.png", + "mengsan/assets/relics/galactic_dust.png", + "mengsan/assets/relics/gambling_chip.png", + "mengsan/assets/relics/game_piece.png", + "mengsan/assets/relics/ghost_seed.png", + "mengsan/assets/relics/girya.png", + "mengsan/assets/relics/glass_eye.png", + "mengsan/assets/relics/glitter.png", + "mengsan/assets/relics/gnarled_hammer.png", + "mengsan/assets/relics/gold_plated_cables.png", + "mengsan/assets/relics/golden_compass.png", + "mengsan/assets/relics/golden_pearl.png", + "mengsan/assets/relics/gorget.png", + "mengsan/assets/relics/gremlin_horn.png", + "mengsan/assets/relics/hand_drill.png", + "mengsan/assets/relics/happy_flower.png", + "mengsan/assets/relics/hefty_tablet.png", + "mengsan/assets/relics/helical_dart.png", + "mengsan/assets/relics/history_course.png", + "mengsan/assets/relics/horn_cleat.png", + "mengsan/assets/relics/ice_cream.png", + "mengsan/assets/relics/infused_core.png", + "mengsan/assets/relics/intimidating_helmet.png", + "mengsan/assets/relics/iron_club.png", + "mengsan/assets/relics/ivory_tile.png", + "mengsan/assets/relics/jeweled_mask.png", + "mengsan/assets/relics/jewelry_box.png", + "mengsan/assets/relics/joss_paper.png", + "mengsan/assets/relics/juzu_bracelet.png", + "mengsan/assets/relics/kaleidoscope.png", + "mengsan/assets/relics/kifuda.png", + "mengsan/assets/relics/kunai.png", + "mengsan/assets/relics/kusarigama.png", + "mengsan/assets/relics/lantern.png", + "mengsan/assets/relics/large_capsule.png", + "mengsan/assets/relics/lasting_candy.png", + "mengsan/assets/relics/lava_lamp.png", + "mengsan/assets/relics/lava_rock.png", + "mengsan/assets/relics/lead_paperweight.png", + "mengsan/assets/relics/leafy_poultice.png", + "mengsan/assets/relics/lees_waffle.png", + "mengsan/assets/relics/letter_opener.png", + "mengsan/assets/relics/lizard_tail.png", + "mengsan/assets/relics/looming_fruit.png", + "mengsan/assets/relics/lords_parasol.png", + "mengsan/assets/relics/lost_coffer.png", + "mengsan/assets/relics/lost_wisp.png", + "mengsan/assets/relics/lucky_fysh.png", + "mengsan/assets/relics/lunar_pastry.png", + "mengsan/assets/relics/mango.png", + "mengsan/assets/relics/manifest.json", + "mengsan/assets/relics/massive_scroll.png", + "mengsan/assets/relics/maw_bank.png", + "mengsan/assets/relics/meal_ticket.png", + "mengsan/assets/relics/meat_cleaver.png", + "mengsan/assets/relics/meat_on_the_bone.png", + "mengsan/assets/relics/membership_card.png", + "mengsan/assets/relics/mercury_hourglass.png", + "mengsan/assets/relics/metronome.png", + "mengsan/assets/relics/mini_regent.png", + "mengsan/assets/relics/miniature_cannon.png", + "mengsan/assets/relics/miniature_tent.png", + "mengsan/assets/relics/molten_egg.png", + "mengsan/assets/relics/mr_struggles.png", + "mengsan/assets/relics/mummified_hand.png", + "mengsan/assets/relics/music_box.png", + "mengsan/assets/relics/mystic_lighter.png", + "mengsan/assets/relics/neows_bones.png", + "mengsan/assets/relics/neows_sacrifice.png", + "mengsan/assets/relics/neows_talisman.png", + "mengsan/assets/relics/neows_torment.png", + "mengsan/assets/relics/new_leaf.png", + "mengsan/assets/relics/ninja_scroll.png", + "mengsan/assets/relics/nunchaku.png", + "mengsan/assets/relics/nutritious_oyster.png", + "mengsan/assets/relics/nutritious_soup.png", + "mengsan/assets/relics/oddly_smooth_stone.png", + "mengsan/assets/relics/old_coin.png", + "mengsan/assets/relics/orange_dough.png", + "mengsan/assets/relics/orichalcum.png", + "mengsan/assets/relics/ornamental_fan.png", + "mengsan/assets/relics/orrery.png", + "mengsan/assets/relics/paels_blood.png", + "mengsan/assets/relics/paels_claw.png", + "mengsan/assets/relics/paels_eye.png", + "mengsan/assets/relics/paels_flesh.png", + "mengsan/assets/relics/paels_growth.png", + "mengsan/assets/relics/paels_horn.png", + "mengsan/assets/relics/paels_legion.png", + "mengsan/assets/relics/paels_tears.png", + "mengsan/assets/relics/paels_tooth.png", + "mengsan/assets/relics/paels_wing.png", + "mengsan/assets/relics/pandoras_box.png", + "mengsan/assets/relics/pantograph.png", + "mengsan/assets/relics/paper_krane.png", + "mengsan/assets/relics/paper_phrog.png", + "mengsan/assets/relics/parrying_shield.png", + "mengsan/assets/relics/pear.png", + "mengsan/assets/relics/pen_nib.png", + "mengsan/assets/relics/pendulum.png", + "mengsan/assets/relics/permafrost.png", + "mengsan/assets/relics/petrified_toad.png", + "mengsan/assets/relics/phial_holster.png", + "mengsan/assets/relics/philosophers_stone.png", + "mengsan/assets/relics/phylactery_unbound.png", + "mengsan/assets/relics/planisphere.png", + "mengsan/assets/relics/pocketwatch.png", + "mengsan/assets/relics/pollinous_core.png", + "mengsan/assets/relics/pomander.png", + "mengsan/assets/relics/potion_belt.png", + "mengsan/assets/relics/power_cell.png", + "mengsan/assets/relics/prayer_wheel.png", + "mengsan/assets/relics/precarious_shears.png", + "mengsan/assets/relics/precise_scissors.png", + "mengsan/assets/relics/preserved_fog.png", + "mengsan/assets/relics/prismatic_gem.png", + "mengsan/assets/relics/pumpkin_candle.png", + "mengsan/assets/relics/punch_dagger.png", + "mengsan/assets/relics/radiant_pearl.png", + "mengsan/assets/relics/rainbow_ring.png", + "mengsan/assets/relics/razor_tooth.png", + "mengsan/assets/relics/red_mask.png", + "mengsan/assets/relics/red_skull.png", + "mengsan/assets/relics/regal_pillow.png", + "mengsan/assets/relics/regalite.png", + "mengsan/assets/relics/reptile_trinket.png", + "mengsan/assets/relics/ring_of_the_drake.png", + "mengsan/assets/relics/ring_of_the_snake.png", + "mengsan/assets/relics/ringing_triangle.png", + "mengsan/assets/relics/ripple_basin.png", + "mengsan/assets/relics/royal_poison.png", + "mengsan/assets/relics/royal_stamp.png", + "mengsan/assets/relics/ruined_helmet.png", + "mengsan/assets/relics/runic_capacitor.png", + "mengsan/assets/relics/runic_pyramid.png", + "mengsan/assets/relics/sai.png", + "mengsan/assets/relics/sand_castle.png", + "mengsan/assets/relics/screaming_flagon.png", + "mengsan/assets/relics/scroll_boxes.png", + "mengsan/assets/relics/sea_glass.png", + "mengsan/assets/relics/seal_of_gold.png", + "mengsan/assets/relics/self_forming_clay.png", + "mengsan/assets/relics/sere_talon.png", + "mengsan/assets/relics/shovel.png", + "mengsan/assets/relics/shuriken.png", + "mengsan/assets/relics/signet_ring.png", + "mengsan/assets/relics/silken_tress.png", + "mengsan/assets/relics/silver_crucible.png", + "mengsan/assets/relics/sling_of_courage.png", + "mengsan/assets/relics/small_capsule.png", + "mengsan/assets/relics/snecko_eye.png", + "mengsan/assets/relics/snecko_skull.png", + "mengsan/assets/relics/sozu.png", + "mengsan/assets/relics/sparkling_rouge.png", + "mengsan/assets/relics/spiked_gauntlets.png", + "mengsan/assets/relics/stone_calendar.png", + "mengsan/assets/relics/stone_cracker.png", + "mengsan/assets/relics/stone_humidifier.png", + "mengsan/assets/relics/storybook.png", + "mengsan/assets/relics/strawberry.png", + "mengsan/assets/relics/strike_dummy.png", + "mengsan/assets/relics/sturdy_clamp.png", + "mengsan/assets/relics/sword_of_jade.png", + "mengsan/assets/relics/sword_of_stone.png", + "mengsan/assets/relics/symbiotic_virus.png", + "mengsan/assets/relics/tanxs_whistle.png", + "mengsan/assets/relics/tea_of_discourtesy.png", + "mengsan/assets/relics/the_abacus.png", + "mengsan/assets/relics/the_boot.png", + "mengsan/assets/relics/the_courier.png", + "mengsan/assets/relics/throwing_axe.png", + "mengsan/assets/relics/tingsha.png", + "mengsan/assets/relics/tiny_mailbox.png", + "mengsan/assets/relics/toasty_mittens.png", + "mengsan/assets/relics/toolbox.png", + "mengsan/assets/relics/touch_of_orobas.png", + "mengsan/assets/relics/tough_bandages.png", + "mengsan/assets/relics/toxic_egg.png", + "mengsan/assets/relics/toy_box.png", + "mengsan/assets/relics/tri_boomerang.png", + "mengsan/assets/relics/tungsten_rod.png", + "mengsan/assets/relics/tuning_fork.png", + "mengsan/assets/relics/twisted_funnel.png", + "mengsan/assets/relics/unceasing_top.png", + "mengsan/assets/relics/undying_sigil.png", + "mengsan/assets/relics/unsettling_lamp.png", + "mengsan/assets/relics/vajra.png", + "mengsan/assets/relics/vambrace.png", + "mengsan/assets/relics/velvet_choker.png", + "mengsan/assets/relics/venerable_tea_set.png", + "mengsan/assets/relics/very_hot_cocoa.png", + "mengsan/assets/relics/vexing_puzzlebox.png", + "mengsan/assets/relics/vitruvian_minion.png", + "mengsan/assets/relics/war_hammer.png", + "mengsan/assets/relics/war_paint.png", + "mengsan/assets/relics/whetstone.png", + "mengsan/assets/relics/whispering_earring.png", + "mengsan/assets/relics/white_beast_statue.png", + "mengsan/assets/relics/white_star.png", + "mengsan/assets/relics/wing_charm.png", + "mengsan/assets/relics/winged_boots.png", + "mengsan/assets/relics/wongo_customer_appreciation_badge.png", + "mengsan/assets/relics/wongos_mystery_ticket.png", + "mengsan/assets/relics/yummy_cookie.png", "mengsan/battle/battle-director.js", "mengsan/battle/battle-flow.js", "mengsan/battle/battle-loop.js", @@ -442,9 +741,14 @@ "mengsan/progression/state.js", "mengsan/progression/story.js", "mengsan/relics/battle.js", + "mengsan/relics/catalog.js", "mengsan/relics/combat.js", "mengsan/relics/definitions.js", + "mengsan/relics/hooks.js", + "mengsan/relics/progression.js", + "mengsan/relics/random.js", "mengsan/relics/rooms.js", + "mengsan/relics/rules.js", "mengsan/ui/bonds.js", "mengsan/ui/card-library.js", "mengsan/ui/dialogue.js", @@ -462,6 +766,7 @@ "mengsan/ui/map/index.js", "mengsan/ui/map/renderer.js", "mengsan/ui/navigation.js", + "mengsan/ui/relic-icon.js", "mengsan/ui/relics.js", "mengsan/ui/reward-package.js", "mengsan/ui/reward-ui.js", @@ -1639,669 +1944,1889 @@ "size": 3004186, "sha256": "f4d6e551a3098ecc869c6b53e8d24be50e8ca97f399ab987b96f32a53c75a02d" }, + "mengsan/assets/relics/akabeko.png": { + "size": 7370, + "sha256": "8c66d2626f785df6be565bd6ed8f698a6b241abee6e9a399e693093b3fbd89a5" + }, + "mengsan/assets/relics/alchemical_coffer.png": { + "size": 9259, + "sha256": "2ce35f217c19f072d9cc93a9bf87a71acfac92546bc19432038371155b9da15e" + }, + "mengsan/assets/relics/amethyst_aubergine.png": { + "size": 7960, + "sha256": "f16c052e5535ce2c2a1065626458956fad21ae03a49a30b09597058522e49b06" + }, + "mengsan/assets/relics/anchor.png": { + "size": 7211, + "sha256": "c5ef84383d5b8a5287b7eb0579dfaa00091e8a72d73f48bfa7773e25ce5d10b0" + }, + "mengsan/assets/relics/arcane_scroll.png": { + "size": 6664, + "sha256": "8f17daafc63841b7cd0abc6fb44507c540ed81a7cfeda8af8615487b6d8e008a" + }, + "mengsan/assets/relics/archaic_tooth.png": { + "size": 7478, + "sha256": "ec4e41ec74c92d1984440d78562a6b0967d8d9dc5050f2487d208b321474e420" + }, + "mengsan/assets/relics/art_of_war.png": { + "size": 8052, + "sha256": "9b21c2fa48179b787f1fd36521f0aaa0f08ca333ffb6586bbdae00f5729cbdc1" + }, + "mengsan/assets/relics/astrolabe.png": { + "size": 6548, + "sha256": "aeba41731d1f24e24989234e1ab122d0f5ef0dccc46f9f3d7543440ba8075d05" + }, + "mengsan/assets/relics/bag_of_marbles.png": { + "size": 4912, + "sha256": "4d399295206a16d5a00285ebb7297ddaca68e593031b8f4d751de6b7147ab762" + }, + "mengsan/assets/relics/bag_of_preparation.png": { + "size": 8988, + "sha256": "3454c060c46680288a03b85237ae10caed09d1b2b6de70f43ca229c4650121c4" + }, + "mengsan/assets/relics/beating_remnant.png": { + "size": 8688, + "sha256": "6125d8bbd95708c17044251b6be4c22d5b85cc2abfbae4199d5b3e8e7c8ba75f" + }, + "mengsan/assets/relics/beautiful_bracelet.png": { + "size": 7662, + "sha256": "c75f3bcb159ff5ce9c2ee1c6d6a4ba166f49a5343fa295ba540eb38b67e519b0" + }, + "mengsan/assets/relics/bellows.png": { + "size": 7584, + "sha256": "b488a47c2bda4d698e3200c7810bcd07f42c7c4375f0beb9a74067325449a73a" + }, + "mengsan/assets/relics/belt_buckle.png": { + "size": 7132, + "sha256": "8fe4a786453afb3fb9f31344189ce8de5555528a23137087dbbe1506c39de4b2" + }, + "mengsan/assets/relics/big_hat.png": { + "size": 6382, + "sha256": "9fa1f0c744dbf6c932867921c2a12f7045b068d391ec1d4ee4673ddfcb3ae779" + }, + "mengsan/assets/relics/big_mushroom.png": { + "size": 7337, + "sha256": "d25610bf6edb0951e55d1c7908d69c0cfc3505e6513479b8b376bd0995ba82af" + }, + "mengsan/assets/relics/biiig_hug.png": { + "size": 8590, + "sha256": "b2be9f4a4dff67325761d43c0c68873f60c69ec57c8302eea4b990cd831a348f" + }, + "mengsan/assets/relics/bing_bong.png": { + "size": 8671, + "sha256": "7ec0e8aa790e2f408eaed979443a8955b28bf6e5adb63d7cd8ddff8a8805898d" + }, + "mengsan/assets/relics/black_blood.png": { + "size": 6334, + "sha256": "16b2063051b6e92597e0247a3d08fc320fb7982e8c356fae8f959ace79519c51" + }, + "mengsan/assets/relics/black_star.png": { + "size": 5619, + "sha256": "8b04ea4e4c8a24535de25346fb782f3eaf77d5eba230dfb097d5f5b8edb85c67" + }, + "mengsan/assets/relics/blessed_antler.png": { + "size": 8151, + "sha256": "9d69e5099dd2633676e2f5ee272c73a9ed25a094fc623bc8b20cbd133e24af74" + }, + "mengsan/assets/relics/blood_soaked_rose.png": { + "size": 5546, + "sha256": "e1178b0a4fd60b0a36c48cdac66646c1c7ff48e99cb629fd4dc724b4e371334f" + }, + "mengsan/assets/relics/blood_vial.png": { + "size": 5729, + "sha256": "ce19f150946e44f32eb1e01a8c31b28fbbd92150eb831ff41c1febb1a9e671c2" + }, + "mengsan/assets/relics/bone_flute.png": { + "size": 5418, + "sha256": "be4b47186103b742fb19e07f81193f8cd65fc46ce3ad0a368af9a1736a6936ff" + }, + "mengsan/assets/relics/bone_tea.png": { + "size": 6791, + "sha256": "59ec4683c2da48edc13d5b3398a63e63d8005b6cf4c3d07724b278bdd1e7d45a" + }, + "mengsan/assets/relics/book_of_five_rings.png": { + "size": 8169, + "sha256": "5e2251669482e7c9191007776a75cfe56303cd88071b292e03ed2ba4fc9b8919" + }, + "mengsan/assets/relics/book_repair_knife.png": { + "size": 5558, + "sha256": "b61382dfb7d1087127b06998f2d8aa33a4080939bd383c4813b74a3dd07c2270" + }, + "mengsan/assets/relics/bookmark.png": { + "size": 8190, + "sha256": "03ccd1af4abef47b0e5624b461e381673f7419ac5ec40c7a5030dc98f6a442d9" + }, + "mengsan/assets/relics/booming_conch.png": { + "size": 9466, + "sha256": "3ecd75fd6e73e0b0b12d1a3254c80e066653644c71f8060492424354e1416f02" + }, + "mengsan/assets/relics/bound_phylactery.png": { + "size": 8874, + "sha256": "85a20ade6f5354209b0562a35603b0213ba02b9eb04584ec7d49591843e7a7a4" + }, + "mengsan/assets/relics/bowler_hat.png": { + "size": 5589, + "sha256": "29403835d283a7a5eaf71d83029a5d67d2606390a25807e47d7489453627d6e8" + }, + "mengsan/assets/relics/bread.png": { + "size": 7202, + "sha256": "bb0e824577aa58e76d91a9094ab2a0b277b777bd15ff50ba89385c0c6deba590" + }, + "mengsan/assets/relics/brilliant_scarf.png": { + "size": 7458, + "sha256": "08ed5ba0254fa7c2787ab4d081d0f48f259948e2dfe42b406644fed3f8bbcb44" + }, + "mengsan/assets/relics/brimstone.png": { + "size": 7533, + "sha256": "6ff582b28ed3f2ffda1b4aa14e5be6a83708dd75a16fd176fe4a95a3575324b7" + }, + "mengsan/assets/relics/bronze_scales.png": { + "size": 7094, + "sha256": "2c148ecbaed13b43e2c3ca1635bf2fef32a9cf827b28d7412743555ab2d19eee" + }, + "mengsan/assets/relics/burning_blood.png": { + "size": 6202, + "sha256": "eb267673cacbf90e519fc646c75403ff9b82fcc8b0f01a8213103cfbaeb6af75" + }, + "mengsan/assets/relics/burning_sticks.png": { + "size": 7372, + "sha256": "935327638f20fc08ca1fee8d0933de98cc617da4d833e7d0fb6fba7b2ddadfb1" + }, + "mengsan/assets/relics/byrdpip.png": { + "size": 7173, + "sha256": "25ba16ec451ca698a80727805e6775456e023519de9e2f63bf44271df0e52642" + }, + "mengsan/assets/relics/calling_bell.png": { + "size": 8215, + "sha256": "e9525274612afb288945f70eed7787967e656f20bbdcec4d35414dd9966c8852" + }, + "mengsan/assets/relics/candelabra.png": { + "size": 5701, + "sha256": "d79f21c8870c5aa42b996c0ba051c32b6258b1a1270b999895b95f1ba8e3469c" + }, + "mengsan/assets/relics/captains_wheel.png": { + "size": 7933, + "sha256": "8c7872210f2a38d13ef095eb5521a107840c25ccaeecb3053ae253d3c8b5369c" + }, + "mengsan/assets/relics/cauldron.png": { + "size": 7112, + "sha256": "701fca93a9d5953eb77cfad96c7cfaecc021d404b34a91744ad8130f5e07c1b2" + }, + "mengsan/assets/relics/centennial_puzzle.png": { + "size": 5795, + "sha256": "d089d68fd8592b45d2c55320fb4735b1d36e7f01b564d585892b95a348e21a23" + }, + "mengsan/assets/relics/chandelier.png": { + "size": 6424, + "sha256": "45ef85a055b6b6b684a1206f0daccea47862bbbc79b3cd6476302393dfffe9b9" + }, + "mengsan/assets/relics/charons_ashes.png": { + "size": 7056, + "sha256": "83fd67c7d8145f87855b6f5405734b77afe6833525480fed6312a40552e941cc" + }, + "mengsan/assets/relics/chemical_x.png": { + "size": 4646, + "sha256": "a02fcaabd5ab21f9ccf90debaec37e414297a568a220a63823801b4e31c9299b" + }, + "mengsan/assets/relics/choices_paradox.png": { + "size": 9191, + "sha256": "37a8ab0b7227ec4ed88116a79890296fe2ad5736e6189c2e3cc58f3e5ab12839" + }, + "mengsan/assets/relics/chosen_cheese.png": { + "size": 6214, + "sha256": "26b9b6ad3e2b7dc75b3875beaac0846cd559f1bd914564a4353658c7b816c787" + }, + "mengsan/assets/relics/circlet.png": { + "size": 4357, + "sha256": "19362699cfe501c24597cdbe03bb6827f3c114d6b162221e7d70ed567e97600c" + }, + "mengsan/assets/relics/claws.png": { + "size": 5630, + "sha256": "2e10948264d05bdc479aef17fdd920ffac539817205765fe931f7b06757cf3bc" + }, + "mengsan/assets/relics/cloak_clasp.png": { + "size": 5876, + "sha256": "25e777a9875e77eaea6cb904095adea847e71d0c534216d6f5d5520660254106" + }, + "mengsan/assets/relics/cracked_core.png": { + "size": 8536, + "sha256": "52988a84945823b2738d07e713286f2168149de6fb9112f127d763c05d5edefc" + }, + "mengsan/assets/relics/crossbow.png": { + "size": 7310, + "sha256": "6187a77f4c6a4971a759b4a1d6ef7deaf768f889020d40b9d4bbb1beff6509d0" + }, + "mengsan/assets/relics/cursed_pearl.png": { + "size": 7285, + "sha256": "7eb5851a98bee16bd3af60083c6ec8d1d86ae0238346661fd2ed9fd90595d1dd" + }, + "mengsan/assets/relics/darkstone_periapt.png": { + "size": 8875, + "sha256": "356fe89393f165732b1a4bc7776ac1075084b10edb4084b3fdcc84abdc87892f" + }, + "mengsan/assets/relics/data_disk.png": { + "size": 7979, + "sha256": "972bfee1affe49ac0d9442744db277883325555a0d41f21ab27f616665d8e61d" + }, + "mengsan/assets/relics/daughter_of_the_wind.png": { + "size": 9006, + "sha256": "b94b3e19b2b1936c3e8683cbd8bd27b2d6b9ae40d1d1c483c32b4e343e0e2db1" + }, + "mengsan/assets/relics/delicate_frond.png": { + "size": 6737, + "sha256": "47fce2993c7bad247654b9943200ecda94551c84b5647e1900296f920c52f5d0" + }, + "mengsan/assets/relics/demon_tongue.png": { + "size": 5413, + "sha256": "928712f8333587bdc722146a07621547c0ab921f86d46632cf53d3a059d295be" + }, + "mengsan/assets/relics/diamond_diadem.png": { + "size": 6007, + "sha256": "852039d98f8511dfb005764319ec8daf0fd91fd4617495096ccd942400adaf6b" + }, + "mengsan/assets/relics/dingy_rug.png": { + "size": 8697, + "sha256": "be09a50d401b217329f047375f03fe5ee8da258b105137b77a7fe6220007a0a9" + }, + "mengsan/assets/relics/distinguished_cape.png": { + "size": 5828, + "sha256": "76e0bccf5ba78f43cb471c225afabfd1c2b9f00660dd9665428bde4aabcfd17d" + }, + "mengsan/assets/relics/divine_destiny.png": { + "size": 8401, + "sha256": "1608d8ad1c29320626ad1adcc729d0923027ca8ed3669d904b4aa7202dcb51f4" + }, + "mengsan/assets/relics/divine_right.png": { + "size": 8739, + "sha256": "c85600185800761b3bc74176cdcb6c9ec7a2dfc82ec3f3444e4197cac70ee173" + }, + "mengsan/assets/relics/dollys_mirror.png": { + "size": 8280, + "sha256": "1967a29973bb3c30468531be5a78b8e5debb15d1caa40cd728e39bf52f53937f" + }, + "mengsan/assets/relics/dowsing_rod.png": { + "size": 5041, + "sha256": "081ba6552b04c75a8f480a700c423c4ac15d95a3414783cc4d4c15e7162d7dc9" + }, + "mengsan/assets/relics/dragon_fruit.png": { + "size": 9003, + "sha256": "722493d462329c2e4e8f0b945cd57eb24be216911c592c21d25352f3187aa9d3" + }, + "mengsan/assets/relics/dream_catcher.png": { + "size": 8486, + "sha256": "436ab41c68b63f6b9b9fc6e0320a1a9c3721bcf64a0ac5ad1028c09fb6e8f519" + }, + "mengsan/assets/relics/driftwood.png": { + "size": 6988, + "sha256": "e71bce47cfba5121992edd8f676692fb0e601ddc480ff7d01a83699d645987ee" + }, + "mengsan/assets/relics/dusty_tome.png": { + "size": 7793, + "sha256": "15f9d3c887c26123919f91159b9fc872eadb8979cd216433b565c0aec3e44f0f" + }, + "mengsan/assets/relics/ectoplasm.png": { + "size": 6117, + "sha256": "020d92067bb95f0f8d7bb889795a1c357d4bde56715ae07127d4cb2b8f9afeb1" + }, + "mengsan/assets/relics/electric_shrymp.png": { + "size": 8709, + "sha256": "866939038891726bc71169b28f73ee97424785283c94a254bf609619febbe051" + }, + "mengsan/assets/relics/ember_tea.png": { + "size": 6484, + "sha256": "cb7e6260e4f6b6155b8ce26b3b207205a2a737f1907ab142494e54bf01d6c67f" + }, + "mengsan/assets/relics/emotion_chip.png": { + "size": 5413, + "sha256": "403efc9ad99ee45e45bb0842c7f4867e23b262f5375b4c9f411a0c7f8e60f0a9" + }, + "mengsan/assets/relics/empty_cage.png": { + "size": 6599, + "sha256": "04cb56f647559f75b28d897a93a25ad12d409201432613134fe6f1903fd00f8a" + }, + "mengsan/assets/relics/eternal_feather.png": { + "size": 6627, + "sha256": "eedb47dacf42b236655b3f0f803ca039f162a4e146fe3d2463bc26de9d48b676" + }, + "mengsan/assets/relics/fake_anchor.png": { + "size": 8325, + "sha256": "b5177fb872f16a47ee51a080038c6bad73ff733779454ae4d1ee1a8f51beac9c" + }, + "mengsan/assets/relics/fake_blood_vial.png": { + "size": 7906, + "sha256": "03663890031196657a57c47a3f7f94119957e8b832a5c362bad3451a639637c3" + }, + "mengsan/assets/relics/fake_happy_flower.png": { + "size": 7346, + "sha256": "a1ca960f31f5b0932e0860fa2caafd3f7507e36eed1a84a63667ac8cb2e6c0d3" + }, + "mengsan/assets/relics/fake_lees_waffle.png": { + "size": 10442, + "sha256": "54e9eaeb9aad06201ef767ecb3ece1a9b6f6f98a780303141f2207cb9f5add44" + }, + "mengsan/assets/relics/fake_mango.png": { + "size": 10329, + "sha256": "91a8a2a2eaa4dd4182fa8f3a46372493cfaa708a520c8a8939c34f0b09a2106e" + }, + "mengsan/assets/relics/fake_merchants_rug.png": { + "size": 7462, + "sha256": "5ffd297d07a96f8d69766f1359b074ce7fd9665a5b380fa2592da0ad38a31ab7" + }, + "mengsan/assets/relics/fake_orichalcum.png": { + "size": 6671, + "sha256": "17a4813fa77fe1143cda0563a5cfcb018e04ac7688369d6704972b01bcb42a32" + }, + "mengsan/assets/relics/fake_snecko_eye.png": { + "size": 10878, + "sha256": "5513ee9db0faaec2e5548c9d4c561869874aad1ffe8b1541dce37a77ada0b859" + }, + "mengsan/assets/relics/fake_strike_dummy.png": { + "size": 10755, + "sha256": "2de722a772b8f0cd9ac6089d7ce8806294a420dd5b7a966522c04e1278ffa20c" + }, + "mengsan/assets/relics/fake_venerable_tea_set.png": { + "size": 10067, + "sha256": "689ce56a8421bb8ec25852cbd83b816984c781cebf9effe99fbf233012191a2f" + }, + "mengsan/assets/relics/fencing_manual.png": { + "size": 6554, + "sha256": "c51fab3e1c8e5c17d2c77ef7cf8efc0e523935982a9ffc8434d434069d262f7b" + }, + "mengsan/assets/relics/festive_popper.png": { + "size": 8348, + "sha256": "b59a97c3638f54899e7d3841a09051b320742cfe42e10e7799c59834779d4b09" + }, + "mengsan/assets/relics/fiddle.png": { + "size": 5494, + "sha256": "15d88439ce1921e06e0d440d27bd1b9e34839ff60b485cfd96d6d24c23b6920e" + }, + "mengsan/assets/relics/fishing_rod.png": { + "size": 5623, + "sha256": "604fdd9a5ad6a5b83c88fa77c0b976d38415af2ecac0649be819f1b9ae90f0c2" + }, + "mengsan/assets/relics/forgotten_soul.png": { + "size": 7405, + "sha256": "11ca6eccc1526a3e842a00cf799aef2706bf5210269ad24c8f4c6dd305e46eec" + }, + "mengsan/assets/relics/fragrant_mushroom.png": { + "size": 6051, + "sha256": "f068807c85b79bcd6f2234b8b39c9017a08419c865db17b0f7d6cdee05fed82e" + }, + "mengsan/assets/relics/fresnel_lens.png": { + "size": 10589, + "sha256": "7519a026cd671be5e3e6a9eae66bc27c4d64cef75b9cbe53afa3f681a419fc4d" + }, + "mengsan/assets/relics/frozen_egg.png": { + "size": 6468, + "sha256": "53b0e8bd035438a28c87dabab4c671847199911e9273e9707e860889b9a53f2a" + }, + "mengsan/assets/relics/funerary_mask.png": { + "size": 8372, + "sha256": "b7a035e06c72698519b0cc134d6443db8d89de298dd9150a0d760f20c1581656" + }, + "mengsan/assets/relics/fur_coat.png": { + "size": 10183, + "sha256": "f679624de0d1120ad27406b5cc9f82254116df7a906a508d899f01fb78f37fa1" + }, + "mengsan/assets/relics/galactic_dust.png": { + "size": 7036, + "sha256": "c87090992f813c8e41dae6277ba6dbe48c9376906e412f3948b037fece4a7afe" + }, + "mengsan/assets/relics/gambling_chip.png": { + "size": 8263, + "sha256": "eb0b6124d7cdf447c94b4bd2dc5d6f7757c6fe7cedac9014247e2b966031a54c" + }, + "mengsan/assets/relics/game_piece.png": { + "size": 6525, + "sha256": "677e13b35ff1b755a3310c0979b9d9d575e232e958ccdfa9ffc767bc1463d1d3" + }, + "mengsan/assets/relics/ghost_seed.png": { + "size": 7167, + "sha256": "9b3dc0d0e87cdcefdd62c3c400260d70e93516a8ebc297bb3b2d6e3f6dde652c" + }, + "mengsan/assets/relics/girya.png": { + "size": 7017, + "sha256": "b979788d9008933119fa78f80639a3ec59567d8b3c05e4b50e71d9c5695b0c0e" + }, + "mengsan/assets/relics/glass_eye.png": { + "size": 6006, + "sha256": "9c8192ae8b3e8eeb57bc76511ca8253eb136cfdc272fdcfd1672d2218c127f6b" + }, + "mengsan/assets/relics/glitter.png": { + "size": 8304, + "sha256": "9399b23ce2a115a364d4082c7ee3f0dc159fc3f55d11f24078f03ad480f801aa" + }, + "mengsan/assets/relics/gnarled_hammer.png": { + "size": 5429, + "sha256": "54196fd212f77ba2833515537a6bf0f0910d98b52011fe08f15a55e8c78008ac" + }, + "mengsan/assets/relics/gold_plated_cables.png": { + "size": 6804, + "sha256": "de3c75fd3e4a41a9dd9c845c552deec168daeed0c7189d0e7bfce46aa94bc3ef" + }, + "mengsan/assets/relics/golden_compass.png": { + "size": 8894, + "sha256": "a3fde88793b07d150e382f8536e313bc534282d4ae7b0fd8bdfdbbb2a8d8cb60" + }, + "mengsan/assets/relics/golden_pearl.png": { + "size": 8246, + "sha256": "ab6123ae2c16b2361710c41496855243ace03cb61622cd7c3f06436553fc88ff" + }, + "mengsan/assets/relics/gorget.png": { + "size": 7239, + "sha256": "dbcc4c8573b30696405673a028ebd3aa7bb9bdde79361e7ca4e87df8cb7f5792" + }, + "mengsan/assets/relics/gremlin_horn.png": { + "size": 6932, + "sha256": "4d5f0e4e1d23981d5fba175fcde9ef4563c315123e98572230a48d9891cdca82" + }, + "mengsan/assets/relics/hand_drill.png": { + "size": 6727, + "sha256": "4074fb1993bcdf826998e4c8e8b75c62bf75451872c70a9b8cd895ca68c78734" + }, + "mengsan/assets/relics/happy_flower.png": { + "size": 7156, + "sha256": "0f6eff613484c13e818d0b1f963a1c96337c3e7adfef71d770e9040a87844687" + }, + "mengsan/assets/relics/hefty_tablet.png": { + "size": 9092, + "sha256": "dc8e804b82f383c4f50eed1e872b99a75457cce9f140411a9fcbdc503efd9b52" + }, + "mengsan/assets/relics/helical_dart.png": { + "size": 6241, + "sha256": "cc9089ab5758b01f9ac211e06738cd2cef23e89eb3a46fed40ac9352c0577a94" + }, + "mengsan/assets/relics/history_course.png": { + "size": 6997, + "sha256": "2c4c07af26e8a3356e575a8ded8087bea93aac57f87df14c1a2cda1bb8b60c38" + }, + "mengsan/assets/relics/horn_cleat.png": { + "size": 4463, + "sha256": "a8438e3cb2a028dc983e0e83d19daeef253863aa3a10d15a9a2f56594096e165" + }, + "mengsan/assets/relics/ice_cream.png": { + "size": 7197, + "sha256": "38de2a36162746558aab496725c7b4ec6f070c207d74382161c88f29e35e00ef" + }, + "mengsan/assets/relics/infused_core.png": { + "size": 10310, + "sha256": "daff4b092b9a5b3da5016aa50feb873bb0259cdccd85e1f17dd2bff70c3e67c1" + }, + "mengsan/assets/relics/intimidating_helmet.png": { + "size": 8849, + "sha256": "1fdd25d525cb8b5c5023ca02fa2577989524243e122bf51aa0bd5e1d88ebdc97" + }, + "mengsan/assets/relics/iron_club.png": { + "size": 5576, + "sha256": "5df582548df6ddbdd8df05bbb98bda67ee487baef2fc9eb85fe5f561ab52cbb9" + }, + "mengsan/assets/relics/ivory_tile.png": { + "size": 5196, + "sha256": "0abb77b0e82dcb8d22b3c87c379ac49110886dbd98182c607d99d99f33ef22e2" + }, + "mengsan/assets/relics/jeweled_mask.png": { + "size": 7835, + "sha256": "666add62fd8551e5bb48e5c472b68bf323decfd1523af682ccb769bad1756e19" + }, + "mengsan/assets/relics/jewelry_box.png": { + "size": 7348, + "sha256": "50d088f9fc04da89156d02d88752fe5d81688e8b04ba69dea9994a09def6a97a" + }, + "mengsan/assets/relics/joss_paper.png": { + "size": 10387, + "sha256": "6fdeba44132726b088a4c8e13fc2e2e1dd41454b0bb14cf4876f13c1ddf8814b" + }, + "mengsan/assets/relics/juzu_bracelet.png": { + "size": 8301, + "sha256": "13494f8ffd72f04bf4cc6e87257e24a4c17c5c285e4d530f4f6a966403475c9c" + }, + "mengsan/assets/relics/kaleidoscope.png": { + "size": 7365, + "sha256": "3c5be7037b9b8418b6705a45f5633c2762a4a4103759f197fc58745a9c8748ea" + }, + "mengsan/assets/relics/kifuda.png": { + "size": 7972, + "sha256": "1448fc249a0092979aa9b80507de289cf51ebd6da36b72f4d9af9bc4369bf692" + }, + "mengsan/assets/relics/kunai.png": { + "size": 4476, + "sha256": "6e444551870a51664051bf5793596317c912b9917abb350edb6a974b1a8422ce" + }, + "mengsan/assets/relics/kusarigama.png": { + "size": 6107, + "sha256": "ae1be498dc2b59fc6c493c2fe6ebfc1c726ad86c2f87f9b2b33abd37faa03b1d" + }, + "mengsan/assets/relics/lantern.png": { + "size": 7201, + "sha256": "d6235c8f914bf3814dc4536fc26b5e956778227bfc904b5c8715f29bae367dcf" + }, + "mengsan/assets/relics/large_capsule.png": { + "size": 8368, + "sha256": "4cf9630ed3b00db019500593f7b421741f4a312a6094cd912a0a0da8b82bcf52" + }, + "mengsan/assets/relics/lasting_candy.png": { + "size": 9132, + "sha256": "c656cc9bbe48b9cbf80327b1b3cf31784dd2037c76498dc6bfe49bf41d8b7f82" + }, + "mengsan/assets/relics/lava_lamp.png": { + "size": 5447, + "sha256": "b8c39d25b474322ae39178ad7b9a5f30c9fa315b26d3a49fceab0661eab85ce7" + }, + "mengsan/assets/relics/lava_rock.png": { + "size": 9918, + "sha256": "fdd51e68eacf42adc7e082a75fd978280a300706c3447ad3a82568c012a3fd59" + }, + "mengsan/assets/relics/lead_paperweight.png": { + "size": 8083, + "sha256": "c8e86d34aee2d222015ce5a145f7c415d9081003f712e55c37f395c2566f3bb0" + }, + "mengsan/assets/relics/leafy_poultice.png": { + "size": 8769, + "sha256": "89f69c4b4d7c37587fb647f8a244ad26d8c4bce3280e37bebe9011d25152caa5" + }, + "mengsan/assets/relics/lees_waffle.png": { + "size": 8818, + "sha256": "5484235e41b281b117fcbd616daaade779329c99398bb41a4dcce1ee0f75e278" + }, + "mengsan/assets/relics/letter_opener.png": { + "size": 5423, + "sha256": "bcf26d13d7129cd76f4e47408c595806b2f22ba50061655ab9e8bfb5065cd1e5" + }, + "mengsan/assets/relics/lizard_tail.png": { + "size": 7566, + "sha256": "f35e673e7d3344048b9f5747786c2d86e9fc07b3348a58bfa4a95fadee37c518" + }, + "mengsan/assets/relics/looming_fruit.png": { + "size": 8357, + "sha256": "e103042a32053bfee08119395134e8012abdde1bd6942d024253803d1d71d156" + }, + "mengsan/assets/relics/lords_parasol.png": { + "size": 7980, + "sha256": "6e9201cc512fb516f9c87eb6b894c8c5eff24af5ac2379b0ed782508514c2ed2" + }, + "mengsan/assets/relics/lost_coffer.png": { + "size": 8032, + "sha256": "7132d681218312f2c5725ee43c03f8e69b2133c6f0cac7fa54dac2037c65e273" + }, + "mengsan/assets/relics/lost_wisp.png": { + "size": 7568, + "sha256": "2bf76657ff3f099cc9340df94d0278ecb38b279ee1d5e2da970f29707e5987c8" + }, + "mengsan/assets/relics/lucky_fysh.png": { + "size": 9458, + "sha256": "a68215fed91a79ea23edab925737fbc23b97cc485813d7bb84a6207d6b697d50" + }, + "mengsan/assets/relics/lunar_pastry.png": { + "size": 8027, + "sha256": "c2942020a364ef50318d03dd2e501a973dfebfed1069901cbdb5b7bc1399ccb9" + }, + "mengsan/assets/relics/mango.png": { + "size": 9461, + "sha256": "1bd7c0298cbbc160d6f17a838b99880548559fb7db66d83f10634f8fbfe04774" + }, + "mengsan/assets/relics/manifest.json": { + "size": 97396, + "sha256": "0c1643d0a0b937e670c0f09158cdcb4a9a70213fbd287e876923679fda5182ae" + }, + "mengsan/assets/relics/massive_scroll.png": { + "size": 7672, + "sha256": "84ade0cdeffb0459b5d2aa54c45f35f8b088f21cd47ae99641b2f2a5a8213265" + }, + "mengsan/assets/relics/maw_bank.png": { + "size": 5490, + "sha256": "1443b2b655331ec1e6840a5367e8d84f08ba4a10383e6cc86582ea07a55fe659" + }, + "mengsan/assets/relics/meal_ticket.png": { + "size": 6610, + "sha256": "bd3d8ba5a687e396c17b32c2eb616556f9c532d448f4aa529a8192fc7f785a68" + }, + "mengsan/assets/relics/meat_cleaver.png": { + "size": 4243, + "sha256": "56ae46bb753af86fc1948755bb027da473d1e03a83f1e0ee0a578854b83fbdf6" + }, + "mengsan/assets/relics/meat_on_the_bone.png": { + "size": 6570, + "sha256": "2e844815e199f9cb8afe92fd3beea1ace8e0caf1aa609bca1f7d059d89ffe5fb" + }, + "mengsan/assets/relics/membership_card.png": { + "size": 7343, + "sha256": "0fae3370f1e7a09864e88a005d968f0c7c72c6582a3d54b7d95ab419d1a762c3" + }, + "mengsan/assets/relics/mercury_hourglass.png": { + "size": 6038, + "sha256": "9a70f5f6add9e59db417fd42e627dc8bd997e44397c066447ae5ca709337b3f3" + }, + "mengsan/assets/relics/metronome.png": { + "size": 6549, + "sha256": "128950a834ca38f56eccbee87fc5dbfbe93a7a95697ad558fbd938b67257e0b8" + }, + "mengsan/assets/relics/mini_regent.png": { + "size": 6062, + "sha256": "14901f72839907f4fc2e0f90f38f96cb25060251e8958c453e48c1e54be5bc7a" + }, + "mengsan/assets/relics/miniature_cannon.png": { + "size": 8396, + "sha256": "db052b59371e475b8f6bede349aec67ce35e4c217a2cb6ab386b95b5f258fb68" + }, + "mengsan/assets/relics/miniature_tent.png": { + "size": 6993, + "sha256": "5a90dac1adcdf7d86e88a09c84892b67524aa33ea12a2bac090c91fd670a8f4a" + }, + "mengsan/assets/relics/molten_egg.png": { + "size": 8687, + "sha256": "3713acf536dc2c66eeb903377b0ef468114fc77552f550bd6bb65014c08b3725" + }, + "mengsan/assets/relics/mr_struggles.png": { + "size": 7422, + "sha256": "02c5ea06b237309683bf7567392166b075e59699109ea1172d594198ba14d77e" + }, + "mengsan/assets/relics/mummified_hand.png": { + "size": 7919, + "sha256": "2c88bd36ad1589e16e3ee01f985495e869df373b9ffc0db58bfa44420db72c87" + }, + "mengsan/assets/relics/music_box.png": { + "size": 7966, + "sha256": "a8e36a0f6502b4cbcef7880bc26600169839e597c7f59c1db673b36324808066" + }, + "mengsan/assets/relics/mystic_lighter.png": { + "size": 6646, + "sha256": "fc496c6fa2867d985f008898f8ebe929c3f52ebbcead3988ec891b2d324d44fc" + }, + "mengsan/assets/relics/neows_bones.png": { + "size": 7057, + "sha256": "bdac5e0c1a6a5f2c4652ec5188e53b7e062fa189f9f7e354cf0a6fdebbced224" + }, + "mengsan/assets/relics/neows_sacrifice.png": { + "size": 11221, + "sha256": "b5e0ae19d81e4b8c5356abdc6cdbecf8911a8dfcba242379535a892ac97bf3ce" + }, + "mengsan/assets/relics/neows_talisman.png": { + "size": 7091, + "sha256": "cc1a499fc9fba82ba676b87b996a235f462a5896bf1b50dbad56399d04be3f9b" + }, + "mengsan/assets/relics/neows_torment.png": { + "size": 10310, + "sha256": "ec5ab815f0c1ca316bb188c2828a62a32ed4a84d568988f36f10d97fdff340ab" + }, + "mengsan/assets/relics/new_leaf.png": { + "size": 7802, + "sha256": "e5ad70ee6e6a18b07dab6bb26a62cdb98d30258204b2422f1dfa215be4a70242" + }, + "mengsan/assets/relics/ninja_scroll.png": { + "size": 8733, + "sha256": "04eeb32f6bdbb4bfeff7c3533b767051088e6ceee2df38620276a6c3fd35d1d0" + }, + "mengsan/assets/relics/nunchaku.png": { + "size": 5482, + "sha256": "661f0d7276755f0e7cd667c3907edbc61ff2c10269289fcc45601fa5126469c9" + }, + "mengsan/assets/relics/nutritious_oyster.png": { + "size": 7897, + "sha256": "336b070f4418eeb6f8a9a470bd9472e8d680022737b405e471aa0abf06a78235" + }, + "mengsan/assets/relics/nutritious_soup.png": { + "size": 8375, + "sha256": "779c863291178a267cfce8aa7228415b1c13af872a35af42a99f148de233739a" + }, + "mengsan/assets/relics/oddly_smooth_stone.png": { + "size": 4824, + "sha256": "5e2fcf2f5b1bde89ce98bb9569283687a1e0416f03c65bf4aa4550a0f15451af" + }, + "mengsan/assets/relics/old_coin.png": { + "size": 8264, + "sha256": "8429b06a5a2ce9c194fed4674c186f65228b289c9f57104401e5991eb8132b16" + }, + "mengsan/assets/relics/orange_dough.png": { + "size": 9276, + "sha256": "08538a1bba026fa5c1ad95e2ebdf93bfb1e65375ee221c76e4a7381a59f90449" + }, + "mengsan/assets/relics/orichalcum.png": { + "size": 6289, + "sha256": "e260e9e451cece860d06f77f15c7746642e48ddfd18e0d5c781713365841999c" + }, + "mengsan/assets/relics/ornamental_fan.png": { + "size": 7744, + "sha256": "478b6a4adc748105fda587d39ce8b23f90309a6c30caba78656932f04750efb0" + }, + "mengsan/assets/relics/orrery.png": { + "size": 8419, + "sha256": "b50c2c7de0244df20057a345588e0baa52a50af2ce96987a8c4fc4c9ada33dc5" + }, + "mengsan/assets/relics/paels_blood.png": { + "size": 7744, + "sha256": "8ebd1d007b259e9cf4e3c673992a65a74804c73a0d642078c5f7e7a2546357ee" + }, + "mengsan/assets/relics/paels_claw.png": { + "size": 4364, + "sha256": "f6b0f305402c0b4661c31ccb78d6c5563894790889f72a07a2b92f274d34c52f" + }, + "mengsan/assets/relics/paels_eye.png": { + "size": 5024, + "sha256": "993a5037e4e1a66e0b174a127c706f2984099dd2ef91f459b5a07a626da471af" + }, + "mengsan/assets/relics/paels_flesh.png": { + "size": 7830, + "sha256": "31414224ae2f5c628001b73736c46dd65c3444851d98e2545a32babd96452864" + }, + "mengsan/assets/relics/paels_growth.png": { + "size": 6822, + "sha256": "f4a4f3d79536268883dbc10c9ed8c9c1289b9d18c6797a6bc6a339236177fbc7" + }, + "mengsan/assets/relics/paels_horn.png": { + "size": 5595, + "sha256": "9e309e7835c4bbc0abf3c35beeed794ed2dd472e29c8ba5711457aa252a9c1e6" + }, + "mengsan/assets/relics/paels_legion.png": { + "size": 7283, + "sha256": "b9e0c47ea23cd97872bb37ee4c9c7ba7f467cdafb6aa44f85a388cc238a6c774" + }, + "mengsan/assets/relics/paels_tears.png": { + "size": 7590, + "sha256": "1ef02bf1d1493906aad671da0970bf5d2daaf57ca0c42aee37b8d7a1f574f4a1" + }, + "mengsan/assets/relics/paels_tooth.png": { + "size": 5939, + "sha256": "47f5c5912abfec2f964ae98fdbeaac7a4b903362c9f8dde882f9d040d79ba6db" + }, + "mengsan/assets/relics/paels_wing.png": { + "size": 7217, + "sha256": "ee8145f3c9e377349f14459c42b49f1fadce6def582e604703cc8dbc762bfd36" + }, + "mengsan/assets/relics/pandoras_box.png": { + "size": 8118, + "sha256": "4656f0a580461dce22031a1994d59b032bdfe0d3f43e2d24ad53f1537987409a" + }, + "mengsan/assets/relics/pantograph.png": { + "size": 4490, + "sha256": "4e406b47cb55b34e7572096f230839b9f1b791f1f7bf71295d887b7e016e3d44" + }, + "mengsan/assets/relics/paper_krane.png": { + "size": 5861, + "sha256": "5374cf7a2721b311fc1582dcf73502f819619bf1610f4fb1b958188404526275" + }, + "mengsan/assets/relics/paper_phrog.png": { + "size": 5557, + "sha256": "eb9a5801bf872a7b8842116163eb6ebe44e9a98abadd2e42b232fa2ef03c61d0" + }, + "mengsan/assets/relics/parrying_shield.png": { + "size": 8633, + "sha256": "45c8cf452e2564512339a5c94ecfa1f27bd17a5a875d809c1aa259ed8a157e39" + }, + "mengsan/assets/relics/pear.png": { + "size": 5863, + "sha256": "7dcb4c0177a984dcf19a819f8cf304fe0e56be3e35fbc277018a4ccad70feb0b" + }, + "mengsan/assets/relics/pen_nib.png": { + "size": 4903, + "sha256": "3d11cefb852f19be8cae3aa24db5dfa3d270270eb82e320cc7a9b1936d6b7d05" + }, + "mengsan/assets/relics/pendulum.png": { + "size": 8656, + "sha256": "a9cb376378eb23de86a9be9df73f66528b237d7d9aae701a76c0ff0ae4ef2564" + }, + "mengsan/assets/relics/permafrost.png": { + "size": 6789, + "sha256": "25811d7ce1a2a56c7d5f98a8bea49e35dece0c1f6c38c4c1a073a0e5357c4b09" + }, + "mengsan/assets/relics/petrified_toad.png": { + "size": 8135, + "sha256": "3f710ba8c745013f9f712ad55af4b9c5c351c8045ea368315cc1df0a5c0f5c7a" + }, + "mengsan/assets/relics/phial_holster.png": { + "size": 7794, + "sha256": "7312e2100d32a9a0052df63c5e5e1056aa51dacdac8acb5d08127ac0fed45c07" + }, + "mengsan/assets/relics/philosophers_stone.png": { + "size": 6650, + "sha256": "0c251db0bf80d64d7f3b9099ec39d449ed5d8708397be442b1283f0ebe244416" + }, + "mengsan/assets/relics/phylactery_unbound.png": { + "size": 9269, + "sha256": "513d51bdef728523cf7335ae265219c8830f7fa07db69ac56872c7fb9230992f" + }, + "mengsan/assets/relics/planisphere.png": { + "size": 10303, + "sha256": "fe49142f5cf79487f8b408713775917d20710e55230436dd9ad6c9d564dad45b" + }, + "mengsan/assets/relics/pocketwatch.png": { + "size": 7534, + "sha256": "b292f3f97e935ca8071b13e4c59c6090fb3041229a9d91aa64b77c9f846674b5" + }, + "mengsan/assets/relics/pollinous_core.png": { + "size": 8880, + "sha256": "435fc8143f157f0c51d4af81212e73d5032803a91bcca6b42ff17d350205980f" + }, + "mengsan/assets/relics/pomander.png": { + "size": 5863, + "sha256": "45710eb8e65a08ead43c02efdd6cd83a9d3e4235ff2afd61f9c977f35d996d06" + }, + "mengsan/assets/relics/potion_belt.png": { + "size": 9220, + "sha256": "b98b1369d0a1709a7e8fde9c4d28e9e582214791645435445e861128702e7b3d" + }, + "mengsan/assets/relics/power_cell.png": { + "size": 8248, + "sha256": "287f3ff1f9334f73b9af2019c35aabb6bf2d66ea34485e163116ad8f3701c9df" + }, + "mengsan/assets/relics/prayer_wheel.png": { + "size": 6409, + "sha256": "e111b4b3d25ba1eafe68c01cc2c4c16b20ca70534ffb3a1bf6854700d4d5bcee" + }, + "mengsan/assets/relics/precarious_shears.png": { + "size": 5004, + "sha256": "781b61147ac56b1ab054c8f1fb6a5384abacd140ba53d2660308c2d17c6bc426" + }, + "mengsan/assets/relics/precise_scissors.png": { + "size": 6160, + "sha256": "604dc2cd93bd8fedd3a9064b32968ea5e9c73a5d3bf51d07028c64aa4441a409" + }, + "mengsan/assets/relics/preserved_fog.png": { + "size": 8061, + "sha256": "950ed9f7fc1b04960acebe60715513f67a8150f49991f00ab6e37c858d85d844" + }, + "mengsan/assets/relics/prismatic_gem.png": { + "size": 7194, + "sha256": "f439c5c6261f1bf158adaa0b9a01ebda0556fb29363f04606b697ea472d4359e" + }, + "mengsan/assets/relics/pumpkin_candle.png": { + "size": 7532, + "sha256": "aada5db33a7d8441fe9d5e3fe97c3e82aa4d92fbbdca315074824281dcb237c4" + }, + "mengsan/assets/relics/punch_dagger.png": { + "size": 5670, + "sha256": "9e6535fae9245effc72c312fd63c2d6c566991347a5da190167507d4d3521b63" + }, + "mengsan/assets/relics/radiant_pearl.png": { + "size": 7698, + "sha256": "87ad86002d70ae312aecb5d803680d24ae2a8cf011675eaaf85feeb1722333f7" + }, + "mengsan/assets/relics/rainbow_ring.png": { + "size": 9381, + "sha256": "ec629f835b8d9be5e2b41ec4476cfad14d9ff2b92f495ac93e3a2678dab16645" + }, + "mengsan/assets/relics/razor_tooth.png": { + "size": 4581, + "sha256": "7f0e5bce97187c044bb7f7e233901c23c046cbdf3febff8b722018ec78f05270" + }, + "mengsan/assets/relics/red_mask.png": { + "size": 6354, + "sha256": "6afb16919fc44eb9bead44cb1ed813c82bb16873e87f1a058d35ae87de8cf00e" + }, + "mengsan/assets/relics/red_skull.png": { + "size": 8046, + "sha256": "fedb3718178d41f24dbc32e24c527b861d51b43807e270131f273dd8f442f27a" + }, + "mengsan/assets/relics/regal_pillow.png": { + "size": 5706, + "sha256": "3cd134595131aa26fc2b2a79785089f481dc63c63bc128cd513e1bda4ef1689f" + }, + "mengsan/assets/relics/regalite.png": { + "size": 9031, + "sha256": "0cfc2a36e8677e1e680d885fb05d1298374ba7545c966ad6af831ca903d5d931" + }, + "mengsan/assets/relics/reptile_trinket.png": { + "size": 6845, + "sha256": "3a94643ca2d7830c86b8a19fc12c58f46a0566c8d9e893197e17971b0a978bff" + }, + "mengsan/assets/relics/ring_of_the_drake.png": { + "size": 7525, + "sha256": "ff619d5e28f00a35ffbeb3b598d87bdaede48f5469911aaaa9f29a5523c3a84d" + }, + "mengsan/assets/relics/ring_of_the_snake.png": { + "size": 9868, + "sha256": "b2461a8881c992f063ffdce770101b61be0c91ac24fa36ffa2337524b0fa9762" + }, + "mengsan/assets/relics/ringing_triangle.png": { + "size": 6181, + "sha256": "4194733def390949559d177ab19daa3bcd052880377321cd20623837b5187836" + }, + "mengsan/assets/relics/ripple_basin.png": { + "size": 7170, + "sha256": "2d5e3a087c546e74de029535462d29941f0feff4a7c348fde4a69658da239eba" + }, + "mengsan/assets/relics/royal_poison.png": { + "size": 9043, + "sha256": "74ce61226a6c807d743af17b5a09489c09635a88d79ee2dd399462623d8bd122" + }, + "mengsan/assets/relics/royal_stamp.png": { + "size": 5318, + "sha256": "ec96f594025c723782df21d347a7b8c9125a0e42471207b9d173fc30c35b342c" + }, + "mengsan/assets/relics/ruined_helmet.png": { + "size": 6839, + "sha256": "15d7c758a793bb988e1e97fd99a9435b8857ef17bdd07fdb54344f4f66086224" + }, + "mengsan/assets/relics/runic_capacitor.png": { + "size": 6900, + "sha256": "83f55c7440ad6cde425c6e0ea57482a49b1c4cb78d943d3922f26c95f8698338" + }, + "mengsan/assets/relics/runic_pyramid.png": { + "size": 6485, + "sha256": "c0abe039260e62c4a7f1f488cf99f8dd3df9caae179dd04b3eb362573ec59c9a" + }, + "mengsan/assets/relics/sai.png": { + "size": 5600, + "sha256": "af7463a24aedd51cfa3213d3f7ce59fb28742d83df47025173f04d80142c37be" + }, + "mengsan/assets/relics/sand_castle.png": { + "size": 7105, + "sha256": "1937e85219a571e04db9637a940f57edcc4adcd8987d10cf5fcfd39a772ec4b9" + }, + "mengsan/assets/relics/screaming_flagon.png": { + "size": 7754, + "sha256": "a0b820a01d512032ed2ec1f40a27aa73892c96053555e0d01624482c10b9a136" + }, + "mengsan/assets/relics/scroll_boxes.png": { + "size": 8801, + "sha256": "1c99c86c86463c339c689bf2df69beef554774015e274a3a979d91d3d4836686" + }, + "mengsan/assets/relics/sea_glass.png": { + "size": 6380, + "sha256": "8897c254dc89b289e6efbda0feb504ab2ed39c7464e273bfd5e6f994743eb5a1" + }, + "mengsan/assets/relics/seal_of_gold.png": { + "size": 7204, + "sha256": "0e9a3f4a0450802b2b6fa31e4d05d756348ee2ad7150ef6f80c34ad74f0b899e" + }, + "mengsan/assets/relics/self_forming_clay.png": { + "size": 7786, + "sha256": "afcd15a6590618c4c8b151002c7ed0746fd22bc66fe14e398bfca4bb681a9db8" + }, + "mengsan/assets/relics/sere_talon.png": { + "size": 7978, + "sha256": "121889753fee3c16691a167d8d4c0ce4f54d8d9fcb5f0222e4279e9390e69ca7" + }, + "mengsan/assets/relics/shovel.png": { + "size": 4860, + "sha256": "70bf095834de67ce491794d7863a64557b42bfdb7876a0d3ffe0be0f1a5f8aa5" + }, + "mengsan/assets/relics/shuriken.png": { + "size": 5605, + "sha256": "131a83cfe7aefaac27ae58c2b0595fb64e892826595486c39ced3d2f60b82e42" + }, + "mengsan/assets/relics/signet_ring.png": { + "size": 6190, + "sha256": "bff8910dd585f12edf8ba6c783561a8ebc38d501c067a0eb481879a00f720bf9" + }, + "mengsan/assets/relics/silken_tress.png": { + "size": 6040, + "sha256": "223d0fd4871ede9254f1b7b5dd49f497df7aa40e430a121c43f43323d1659884" + }, + "mengsan/assets/relics/silver_crucible.png": { + "size": 9964, + "sha256": "0d01378166aa08ac9b17d9f04c9d9d636256ec674989e25fedce4fa816d09214" + }, + "mengsan/assets/relics/sling_of_courage.png": { + "size": 6202, + "sha256": "e4246f601fbe535973c649e8e5dcb12fa5c511dacd58c283ff35a19f58d5dd93" + }, + "mengsan/assets/relics/small_capsule.png": { + "size": 7306, + "sha256": "96b79f384a82081396f36c848612fe0e592a2e5939d9d6ddec015b7a0c69b7b3" + }, + "mengsan/assets/relics/snecko_eye.png": { + "size": 5651, + "sha256": "700848be9e2cf6d8781f65db21392d242374bd531fd777932bcf0312c45d535b" + }, + "mengsan/assets/relics/snecko_skull.png": { + "size": 6524, + "sha256": "03d6d8150dcea2ee9e0cf3c34dd723da9646d287980f5e7d2c2eee1149554d04" + }, + "mengsan/assets/relics/sozu.png": { + "size": 5601, + "sha256": "142532dfe95b523c77a9ec9089527737a24bf624b3f965cee88374b5c0f2853e" + }, + "mengsan/assets/relics/sparkling_rouge.png": { + "size": 6177, + "sha256": "a2d2f8b06562db10e040974bc6dce74853dc8c3a518069a12802f743f4936a02" + }, + "mengsan/assets/relics/spiked_gauntlets.png": { + "size": 8148, + "sha256": "8d0c9f2da2068bc92c4d5f4be1ba40013121ee03aeac0da92716d052dc199e16" + }, + "mengsan/assets/relics/stone_calendar.png": { + "size": 7869, + "sha256": "37749a178fe9596b041c350597720764b4309bfe4064a918ce906f121a746cbe" + }, + "mengsan/assets/relics/stone_cracker.png": { + "size": 6968, + "sha256": "f1f8fe4fe14ebde969b9822a2b617f2c871f2ac58a659fe0ed06011271a10cec" + }, + "mengsan/assets/relics/stone_humidifier.png": { + "size": 9221, + "sha256": "12c28b9a7b65df277dcf39e61c47a72685fcf4bcb5fb4b765290e6e5b3ec7c47" + }, + "mengsan/assets/relics/storybook.png": { + "size": 6422, + "sha256": "01b0177a9d4fd2fb28b073f8a6dc525d4b2716691180012d4d0204fdfedf6f27" + }, + "mengsan/assets/relics/strawberry.png": { + "size": 10517, + "sha256": "12430e97af90ab910996f47533954c6e86a96830691771dca22f7b239618d163" + }, + "mengsan/assets/relics/strike_dummy.png": { + "size": 9102, + "sha256": "3e565da309adbc80b1e1c1c96d4fcf08bc0eb57caca512262048f625181a5627" + }, + "mengsan/assets/relics/sturdy_clamp.png": { + "size": 7020, + "sha256": "3b91fcb337fe065a60f11dfd4267a062fcef2817c98c156c4489060d53327391" + }, + "mengsan/assets/relics/sword_of_jade.png": { + "size": 6455, + "sha256": "b4a437a54bdb424a629cefd3a436a86443d134205339fc563a32db8e40d8fc1c" + }, + "mengsan/assets/relics/sword_of_stone.png": { + "size": 6107, + "sha256": "1e7d914b756161c323d2e6fec4641c7004b05d09f3ac60d626e5263debb09d4e" + }, + "mengsan/assets/relics/symbiotic_virus.png": { + "size": 7675, + "sha256": "e09c87d40b66f5379c595ee63805605d8bba9cc16234fbcf103b6e670d0c0241" + }, + "mengsan/assets/relics/tanxs_whistle.png": { + "size": 6009, + "sha256": "9f2ff889ec077848956d9908abd6103d7ef520b7d63b1dd9cf29d2c754a2339c" + }, + "mengsan/assets/relics/tea_of_discourtesy.png": { + "size": 6749, + "sha256": "a7621412f650b2ec044d15f087a3cb8c3f68366815b69461d34fad5d36224c49" + }, + "mengsan/assets/relics/the_abacus.png": { + "size": 7153, + "sha256": "bf1b372a7aca12a44b83edf76f0447d81f60377a2cd624f1a66aaf7b41ac8017" + }, + "mengsan/assets/relics/the_boot.png": { + "size": 7400, + "sha256": "5d62f1b57bb13482cbce1c105eb06261ab2b10cf896dc23b895188a287cc304c" + }, + "mengsan/assets/relics/the_courier.png": { + "size": 8351, + "sha256": "a22c348dcc4070dcf46095bdf2dec57aeecf4b20b72843788027f9873f8b9edd" + }, + "mengsan/assets/relics/throwing_axe.png": { + "size": 5003, + "sha256": "2cb0edd32ef0eebd475762b25c6bdbe74ad825514c58e2fe3e52a86bd188b891" + }, + "mengsan/assets/relics/tingsha.png": { + "size": 6163, + "sha256": "882d24515e2ac5fab5bca8b38890f0064d28f40cebf355d827107d31e1fbbdbf" + }, + "mengsan/assets/relics/tiny_mailbox.png": { + "size": 7945, + "sha256": "8f0552d98a3aa08e8f06d50a3fcc06781bcf4c231624cf80e70e02598e8e4c9e" + }, + "mengsan/assets/relics/toasty_mittens.png": { + "size": 7792, + "sha256": "301583435ebba4d4cb6606ac145ed3c1cd6f6ccc67fa9345e131012ecb4a10e3" + }, + "mengsan/assets/relics/toolbox.png": { + "size": 6117, + "sha256": "6232998b86233f3bf727e5fe3c227703c59f085b22fde51a1348ad0cf7436a72" + }, + "mengsan/assets/relics/touch_of_orobas.png": { + "size": 6276, + "sha256": "bc2d7dd2acd4db7cfbb857c3e6063b6d5ad68aa7a5dabe1d0af5ad5f02315540" + }, + "mengsan/assets/relics/tough_bandages.png": { + "size": 7351, + "sha256": "c08ebac638023f8a2dea12354c4f6496d7d2165a5e8e00f6124675f00ba856b7" + }, + "mengsan/assets/relics/toxic_egg.png": { + "size": 8054, + "sha256": "4fc4a9b774435adcfed8bb4ab2a07d20d3f897ef752c2ee96bc798ec23bc382b" + }, + "mengsan/assets/relics/toy_box.png": { + "size": 8576, + "sha256": "2392c41c607bf122ae7f7c0ce3f1bd809d3c469a346b5ea42f8aaf2d047a20e4" + }, + "mengsan/assets/relics/tri_boomerang.png": { + "size": 5666, + "sha256": "97a815de7a64e476b2ce21d6158ae336e1f186883898ff54463cea40d8721da9" + }, + "mengsan/assets/relics/tungsten_rod.png": { + "size": 5669, + "sha256": "40dc76faa4b6417856bf79eef32a03ad9e6905f6c6c57d20a2a71aa15c4561e3" + }, + "mengsan/assets/relics/tuning_fork.png": { + "size": 3921, + "sha256": "d498651f83436f02ecfd39eae2e281a64efad02fcecd21b83e478fb234640f3f" + }, + "mengsan/assets/relics/twisted_funnel.png": { + "size": 6585, + "sha256": "de7a9f6e7c263d70108a6bf1dd91c05ff06c7654f0de725462384135eacb4909" + }, + "mengsan/assets/relics/unceasing_top.png": { + "size": 9092, + "sha256": "563577e7410c6a0989ca9251bbc87a9746543f5d94fed3ab18de9b70b311651d" + }, + "mengsan/assets/relics/undying_sigil.png": { + "size": 9913, + "sha256": "336e379d9752975c89a3ee1fe9b503ee51f827f5ffe63c8e1956af995726ed09" + }, + "mengsan/assets/relics/unsettling_lamp.png": { + "size": 7484, + "sha256": "77a0a60f0db83cac36fadde9c7c1821cf38cf7072d275016e256c638a08b1575" + }, + "mengsan/assets/relics/vajra.png": { + "size": 5852, + "sha256": "ab2e88abaebcbb8f887fa5a19f3de272a09ef4d36a2580c3abe68fd5b1d327bc" + }, + "mengsan/assets/relics/vambrace.png": { + "size": 6282, + "sha256": "34e6d6269993431d779bdda9ee35fb6bda4c3dd0cf353d2117803beb78d1ecfe" + }, + "mengsan/assets/relics/velvet_choker.png": { + "size": 5199, + "sha256": "554328275385d693c2ee7caad0a99738b80df33f1762317d949f15165e5aab76" + }, + "mengsan/assets/relics/venerable_tea_set.png": { + "size": 8208, + "sha256": "4c2da5de5cea18897894c6fb909b04b7cdd60952d26ac157f72139ab94f299fe" + }, + "mengsan/assets/relics/very_hot_cocoa.png": { + "size": 7690, + "sha256": "4287fd7f352cacc5e307bc1cd7aca857907b5fc105d0748878e5a1b0f1f06208" + }, + "mengsan/assets/relics/vexing_puzzlebox.png": { + "size": 10329, + "sha256": "b6f299173d9019f5d0d267756b36b9f919a4eb0cd9a33f39fcc1f35547fe347e" + }, + "mengsan/assets/relics/vitruvian_minion.png": { + "size": 9816, + "sha256": "572f81d8d9b564e10c5e2b8495447204899232da29da1911fc1216c15873b587" + }, + "mengsan/assets/relics/war_hammer.png": { + "size": 5349, + "sha256": "e3208cc788cb12c6df02c57f40da9c1b5d77c4b35c8e1e2a1a28c8676d57822f" + }, + "mengsan/assets/relics/war_paint.png": { + "size": 7563, + "sha256": "42664bbb0152f980a8ff6189ff81936f99efc0351a9325fd34699a4fa119d89d" + }, + "mengsan/assets/relics/whetstone.png": { + "size": 7143, + "sha256": "6d19f8f00e73363d37a989170dda8af5c0c5a5d038e781690fe02d1f014788c2" + }, + "mengsan/assets/relics/whispering_earring.png": { + "size": 7993, + "sha256": "ad8f180c8cb5aa50f7d63aae1078516d37db39b2a8b611e1034bfde81c99e17c" + }, + "mengsan/assets/relics/white_beast_statue.png": { + "size": 7638, + "sha256": "1db528a8dba724edfa894c358018b02a00f42eaf9ff4c8ca54099d06d6add29e" + }, + "mengsan/assets/relics/white_star.png": { + "size": 4939, + "sha256": "52a6c1afaeed4d3fa03be37647e21cb17f1a33b7785409db5ec232c0c43235ad" + }, + "mengsan/assets/relics/wing_charm.png": { + "size": 7790, + "sha256": "d9908d450ffa80c1b98839fe6125ef40dd24ac35f00848b6bfd7ae06cefe6417" + }, + "mengsan/assets/relics/winged_boots.png": { + "size": 6578, + "sha256": "15cae5e9b75b4f510c09301e4cdda108f65e8522d13cf03fecbd96ba9861d343" + }, + "mengsan/assets/relics/wongo_customer_appreciation_badge.png": { + "size": 6031, + "sha256": "a64191f055a1b8ca08834420298e48d00202cacb1e84f3822d7f2ed0c41961fb" + }, + "mengsan/assets/relics/wongos_mystery_ticket.png": { + "size": 5807, + "sha256": "c57c94f6124b6c3b770d470f0ffa796f2fc43d532d19020c65527242e69200eb" + }, + "mengsan/assets/relics/yummy_cookie.png": { + "size": 8499, + "sha256": "0802618198a3f3f6d6c71cd52290996706d5e5a2c6119dc5c3207529fd4b9cb0" + }, "mengsan/battle/battle-director.js": { - "size": 12944, - "sha256": "ba3adfa4793a1ef3e2da9959a39fad62789fcd6f41b84e9e342c81ff88edbbff" + "size": 13125, + "sha256": "a82a031a5d92f4e734625a40793db883ef96bd4c9b56bfef5bc56f2b982e4aea" }, "mengsan/battle/battle-flow.js": { - "size": 5801, - "sha256": "9ceffe9539c1d303f75eb23e4512554c174e602f85f53e9f9a37e2fb1afe7bb1" + "size": 7910, + "sha256": "4cf8bf588e9a1d30c481fefd1e609b084a19dc658371af9ee9b516ff3c8b62bf" }, "mengsan/battle/battle-loop.js": { - "size": 3565, - "sha256": "0af53c3d317fe9816594c2786bf5a1bfa960babf0c135b9b4d524794730efbcf" + "size": 3652, + "sha256": "8ff23c71320c91cee2955cabfd8384190a07b80cbddd44bba50fcf9fef4daeb0" }, "mengsan/battle/battle-resources.js": { - "size": 3040, - "sha256": "6e29789023111c4f7b91a11d7169069cc6b9d0087a3451d526233fcf03f389a2" + "size": 3236, + "sha256": "a4584c4560ffd12fca2f2a540e94d7e211d7a68d1d0b498177a730f32cc2e764" }, "mengsan/battle/battle-session.js": { - "size": 5455, - "sha256": "5e50205af67054761876aa37fbd02ebefc3225f8d1a90afcd708c215ae8e5518" + "size": 6334, + "sha256": "e96d40a1c5fd4f4afe8046a412e78712e9df10fe00bbc6d858575e5a9b6a1102" }, "mengsan/battle/battle-settlement.js": { - "size": 11994, - "sha256": "be8ef59f8dba0c9cd1f3032ea1de1615058476d1a591c1858b4fa180a13ee578" + "size": 14376, + "sha256": "99f0a69aba0489f7a91954b95cd00d5856282779bb7e2ae91182bdbb89a8c63a" }, "mengsan/battle/camps.js": { - "size": 2386, - "sha256": "51ee6d2aa78261bd60b2ffa2662b7a37e62b516c379b8cedd46ecf0466630278" + "size": 2440, + "sha256": "0907129c78d843f02762b3ec4aa3b25542f605aaf73e61fcb417e46bd731c021" }, "mengsan/battle/combat-rules.js": { - "size": 5966, - "sha256": "e540dc2e2eb83ac20868252cef73373d6c807455d57f220949aafd1f762e3828" + "size": 6298, + "sha256": "807cdb1629c19890b67dcea112da9e2495b47926f5de7e37a182840cce179374" }, "mengsan/battle/death-blow.js": { - "size": 1113, - "sha256": "d0222776b90acacd2fc672559bf59d8c0376cfae68294d5a9603551ed182a0c1" + "size": 1151, + "sha256": "aa3ba0da315ae81ae8430c50a57203889838adac8d533aa5400a4bb9976becf5" }, "mengsan/battle/engine-session.js": { - "size": 3680, - "sha256": "6aaad4dd6641caea0c0e02028239e355a7b83c3d53b64f704989b56376855750" + "size": 3763, + "sha256": "1addfa8f6a6e1e56d2dd32b6d1249ef84aa0aaa1ca049a7e0ccb688be51261bb" }, "mengsan/battle/intent-damage.js": { - "size": 1266, - "sha256": "c0efe2d26f5ee76f090c5ef04b8607def99ad1a3315dedd5c2b8e42aff218a7d" + "size": 1298, + "sha256": "616a18728b31677b70cc14b88af027c4cc912ae90f11de41355b900ed2c29ea1" }, "mengsan/battle/intent-effects.js": { - "size": 2311, - "sha256": "5fc1c57b88c996b9ba1ff27d220749001acecea028950479c5fc4bf26b854fe9" + "size": 2359, + "sha256": "0b38b5b5eef925910200749c325c34a1cd4b4aa7cbacd44b63a2c31551f2a21d" }, "mengsan/battle/skill-teardown.js": { - "size": 6702, - "sha256": "49116eed862780a17c9d67182b103bceec3b28621355e16f7351b36520896320" + "size": 6849, + "sha256": "5f92d02d245aa3021ea47b245b221c58987b1e5770fe4329eef6ae733b0810ff" }, "mengsan/battle/stun-intent.js": { - "size": 1295, - "sha256": "3a73747311bbae29cd03a3327f0ff398aa085f2d2e480d4013f2f8f15d09f810" + "size": 1340, + "sha256": "898f9e64b80c5a963229eed340455f810eec2c1777bb98ba599d56101ba11bf7" }, "mengsan/bonds/battle.js": { - "size": 1729, - "sha256": "702bf42803374567630ebfc87515d14e6e7a8c3e33b49f16bdc98ac5e1954451" + "size": 1771, + "sha256": "bdb4d429b14b98d7d5434afb2d11039938b7eaea37cf5f87a3fba86fc958b254" }, "mengsan/bonds/definitions.js": { - "size": 2464, - "sha256": "2ff3db8f5db20416f218b184ad980b9adc93d82197a6f296726e0c76a49e2abe" + "size": 2527, + "sha256": "a736afb0c27d30d68290b952d41e304241e2ea6401fa19c6399e49309e958ac0" }, "mengsan/bonds/intents.js": { - "size": 2888, - "sha256": "514212bec0e6b523a0eea5857212d3369da4eef84cf812866baf5e9a4f3407fc" + "size": 2952, + "sha256": "935f5f1ec90ba7e0cd0539db9c51ad5ba11e9063bbbd060a56f4ef6c34bfe00d" }, "mengsan/bonds/state.js": { - "size": 4372, - "sha256": "8117b0a9c4b9c56ffa7ce8b367ffc89dd69ddacc19f93114c8fedb894cb8f33c" + "size": 4484, + "sha256": "45c7c4c09865c335bb2e181c5bd5fcffc20a55a5d5e57e8e36b88977d7329da2" }, "mengsan/cards/affixes.js": { - "size": 1114, - "sha256": "6f5a0975192aa3b159c3c6886a0214fd101869fccd866d2de831afc56f3fcb72" + "size": 1124, + "sha256": "f65993cabf6fe9b01e9a41de4ff0d47aba56eb67cd9e00d4a67cd87d9ed9bce8" }, "mengsan/cards/battle-card-copy.js": { - "size": 1737, - "sha256": "acffc9c0ecc7d22985f894522376e13d39067e71cf1532f2a2cd8d9466671fdf" + "size": 1766, + "sha256": "1cd2344a1d56da56b07a7968989fc3216346a89370b832ed1f869d0494f7148b" }, "mengsan/cards/battle-card-reclaim.js": { - "size": 1522, - "sha256": "c38d2f86719d682027be75e8a30639cabeb1cf4d7db87aef2304327181161fe8" + "size": 1551, + "sha256": "397a0c05591122d91bed20499cdd0b55f3fddcdaa6a2d6cf8d7f4434c1306feb" }, "mengsan/cards/battle-energy.js": { - "size": 1469, - "sha256": "dc1e4e9c215a5c3c3a93c6637c72dfd54e622688a243618a4cfafdbf77130af9" + "size": 1502, + "sha256": "cee19be46c41d274bf706c2add12f64834980ddb32526862e78de37bda28caef" }, "mengsan/cards/block-draw.js": { - "size": 1178, - "sha256": "fb93243cd983e35e4aaf95fd4f4ea9012cdb62c62ca0d080703918f5364dc5fa" + "size": 1197, + "sha256": "4770aa0a753b80d103e3c087bbe2046609e99a05dcbc5c388526ba87c554b7ce" }, "mengsan/cards/card-data.js": { - "size": 3405, - "sha256": "a943104aa2e0115b21a40ff03cd46533680bfa4d088e8906f54bc1ec99c798d0" + "size": 3552, + "sha256": "09dedace9b70c432f2b189a7d8fed149afde0d15d515c02c417343260c19b3ea" }, "mengsan/cards/card-definitions.js": { - "size": 3006, - "sha256": "b824439eb6808642fa55a81779f5b990e52382c85c9f256a6346f3e21331b9d0" + "size": 3053, + "sha256": "35c22815c71c0a5612537923b336637fd9e2e8a2aa506e1dae739eefbd0d0cc7" }, "mengsan/cards/card-pools.js": { - "size": 628, - "sha256": "1830028ecefe5dedf09f27358d9235a91d6282dbdea46d410a48315afbc3b118" + "size": 637, + "sha256": "c84c2c89de978d7f03dc2281da48c15728a977e64287ebe5d288ed6f39c217f7" }, "mengsan/cards/classification-types.js": { - "size": 515, - "sha256": "10813deaaf218c68512e44da8eac9a83717b8b942a48df498cfae570c9f939f4" + "size": 524, + "sha256": "75084272278f6d8596139657a8f9af9e7398e3b4ebdcf0ba753ecf9e00a6ae48" }, "mengsan/cards/description.js": { - "size": 524, - "sha256": "a37daf0e29fb05f8248ff3b9c9777e68e2dab6e7cf86a3c53510e099a1e10d1d" + "size": 532, + "sha256": "d938cc736a95a6bddf14df52165a9bda775bd845b958687bced06ba0254464a6" }, "mengsan/cards/hand-exhaust.js": { - "size": 2627, - "sha256": "36c64653a3646921f511d2721df69f7c75e6a38a11abaa5e2b09280aa0d38b98" + "size": 2673, + "sha256": "904bd21885750bcb5cabee5478d74a9f5e61651d2b9aeaff1f7b41559f1665e6" }, "mengsan/cards/hand-upgrade.js": { - "size": 4359, - "sha256": "599859fc9a5283655778816847d2edff52c787b47b41f1e5e6fc6ac2160caed7" + "size": 4446, + "sha256": "206e2a5d5ec96a8bc012a0ddc87e6388d7c0a7d93dfb9f8ebe3574156b6433a1" }, "mengsan/cards/havoc-play.js": { - "size": 1885, - "sha256": "60292a9bf9fef09c4fbb3cbc5ac4e87267f1b0a01650f4ddd2a23d4f65e33bb0" + "size": 1921, + "sha256": "dad0d45cbbd0a8f13a9aa0c238d14b3c6e7553eb3795e3291e2c53d5b69bd7d0" }, "mengsan/cards/infection-card.js": { - "size": 3056, - "sha256": "f39708a57dffe6ec86e176e4d3572fed9bad60350a83fadaf21d75e8d7f817f1" + "size": 3112, + "sha256": "831ae4c7c9e8497fd1255062894bb1b65169c0e6f7fb85a8b500a86115806fbc" }, "mengsan/cards/intrinsic-affixes.js": { - "size": 819, - "sha256": "67630d860ce74ceb9ba9fb40e8f7a4b13dcf55c83277653392d23b5f0ea9c0e1" + "size": 831, + "sha256": "4743f5ab95c32faf0eea70074b30f841bfe67f760a3f29d602aeb81cc1b21bbf" }, "mengsan/cards/ironclad-advanced-data.js": { - "size": 126, - "sha256": "e18fd3b159e910a02d26d4d0a9ea3d630b51fd71f734fb183b5542f6f777713b" + "size": 128, + "sha256": "3aa955dc4be0e89f14a434570775e09a738d51965dd5c3eb0fd38f7ebde01cab" }, "mengsan/cards/ironclad-data.js": { - "size": 117, - "sha256": "8a90e36e9375661d1e9273da6fbfea3c6ef1be8e0772c2d5899b518d1d127390" + "size": 119, + "sha256": "c8271851ec177ea62ce9f1076764540e988e733502a139cccc4a0ec85e7f5228" }, "mengsan/cards/ironclad-hooks.js": { - "size": 2240, - "sha256": "32eb74642d081bebd6e38b8e43c9fd8448163a4c93c1322c83e26798b3e556b7" + "size": 2362, + "sha256": "4e30d3cf8c57dc506020ecf7ff494000b090946aaf8a4886a77fbfbb77eba9fd" }, "mengsan/cards/ironclad.js": { - "size": 120, - "sha256": "5317a2bf599d8a7fabcf19dfa4f76284cbe6b7f43ec5a3f8c607ab9e69d9f61d" + "size": 122, + "sha256": "f49c6652f9a7eecb9343ad6c3425f68c27a64a90f7f18fb779f3f140704c2a7a" }, "mengsan/cards/life-loss-block.js": { - "size": 1177, - "sha256": "718254e938a08be9e4fa036698fe5c33ac98c842722e1edebf7bb9906922f64b" + "size": 1201, + "sha256": "a7d7fe06674a80fee348d543a4da7f1d9354edfe4869d7f43e40ed1d2f8ae5d9" }, "mengsan/cards/mode-cards.js": { - "size": 7770, - "sha256": "4a8f9d61ba438ea3ba2e857f0b81bd85bee2ffc1c9bd0bcbd18dbdeac36aec8f" + "size": 7899, + "sha256": "181a6b95d5f8080cd9ab10898713b27776c613fee965c9ec013594a9436eeaf6" }, "mengsan/cards/packs/colorless/data.js": { - "size": 30960, - "sha256": "6d4b62e53fcbd2a509d335670a07a75b5dce1268bc146f27a10113c68b86e0a5" + "size": 32174, + "sha256": "4ba74b97668b97b99099efd19fdba2e81da02e2ab3764b332fc71cbd135b87cd" }, "mengsan/cards/packs/colorless/index.js": { - "size": 382, - "sha256": "b106052a24fc47b10472b907c69036e341a90a5945d32e140d67dc2c030a5f92" + "size": 390, + "sha256": "b30d7ee8786f9f8cedade070c77f34fd2e4d2a3948d92ee211787cccc29ca247" }, "mengsan/cards/packs/colorless/rewards.js": { - "size": 613, - "sha256": "af212d7c4cd8f63c5837e8f29519cd341b775135fa332f8a0f4f82eae4ac349d" + "size": 621, + "sha256": "9b7e679b4f6ea3e6fe70671986cef7328d2dcf033f7620a5e2e06a47a9d9f5ac" }, "mengsan/cards/packs/curse/data.js": { - "size": 6436, - "sha256": "a85d48996fe637e1bb8b976d370e4fb49d1a2bb1e1dd6e9befc1ff6fa1827d9d" + "size": 6704, + "sha256": "35d43aa2ada598257fe0d0c18f5ea746d67429c0d9a3d73b145dedb363fe50df" }, "mengsan/cards/packs/data.js": { - "size": 902, - "sha256": "4f04d425ba55670fe5707ef189dd3b74fa9934117fc5929c0f1b9b67c874863b" + "size": 912, + "sha256": "11f10ede8a027567855b31d72e562f9851b2b7ffe96f57525268fdabac3e4145" }, "mengsan/cards/packs/event/data.js": { - "size": 14249, - "sha256": "b195639153c1cb6a3ac48d5af364c9a915a34e96d844ec4e4848d914e5896017" + "size": 14820, + "sha256": "0badede4d570d625e371f3e06750d708c381f2eff3f14e54f1a803690f28c1c9" }, "mengsan/cards/packs/index.js": { - "size": 1109, - "sha256": "0711819c90af702cc98fc189c710bd278a9aa66022f04a3566ab18509b92af53" + "size": 1128, + "sha256": "3a19244866f80379cfb9314dd599a67fed4adc305ed23c5393c6f09366075147" }, "mengsan/cards/packs/liubei/advanced-data.js": { - "size": 2842, - "sha256": "af05e8f5ffe996f11f1383023557f00d60eaccadc534a8fa8df3f9b57fc6b036" + "size": 2877, + "sha256": "7f9b1b67d987d15030a522d4899e29d39bbd2166866b29e1794119ef9fc2d1d6" }, "mengsan/cards/packs/liubei/advanced.js": { - "size": 31216, - "sha256": "736ea6b7c45650fa4219c4dcafdcc61886c743f065469b22ad972728e7552595" + "size": 31697, + "sha256": "6230a44ecc67c3f04a62a00d921b690e9fab7651da52f747706ae2d884bce21d" }, "mengsan/cards/packs/liubei/data.js": { - "size": 4464, - "sha256": "8e8f9ce7f3a5867c848e54133a726007af2a534106ba9749ade0f8a86ad73bee" + "size": 4516, + "sha256": "7103bf64a2c338137a5b470127a7220664a802a39de40d562c24cb2660f0c048" }, "mengsan/cards/packs/liubei/index.js": { - "size": 610, - "sha256": "49cd27d3341c93774bcaa05f1233d358962cdc3482c6dcfccb6d480cc5240dbb" + "size": 625, + "sha256": "18d0eaf53ca7117560f3987d5ca6911f2486bd27a9b40fbd2a345a9eebccef50" }, "mengsan/cards/packs/liubei/legacy.js": { - "size": 55175, - "sha256": "32776f897128bfa7ab2e6dad1cbab4c09901fd0c093da599da7161fe5dca16ff" + "size": 56085, + "sha256": "8fd3885129b5221e93f3634c0c1094b01f8525124b1c0b6c2ff32c585aa3985c" }, "mengsan/cards/packs/liubei/metadata.js": { - "size": 5618, - "sha256": "9b5dbdd73c6f901f1f005baecd1f70cf81997ca9cf0897e7309f5c5a73eb77cc" + "size": 5758, + "sha256": "5217360a7b5c6cb90974b7d05714c6cafb33273536978818dbbbb000d1ecf671" }, "mengsan/cards/packs/liubei/names.js": { - "size": 816, - "sha256": "d40ce599c1a9c21903ff6889ffb3f9d682d48eb269797ee960db9084d93905f9" + "size": 828, + "sha256": "8fc0b29eca5a85a679275130be644c972b1efc4c3b47401d7c341669ffee9758" }, "mengsan/cards/packs/liubei/rewards.js": { - "size": 12445, - "sha256": "5deddf3784b4e7ae8a757d4ff06481d0f32f1f31fed86b939cc1f9184e462396" + "size": 12516, + "sha256": "82d030a3dc79b684bedd6716b7497971c8d12809abe1de2c0d548656ca3ff2f7" }, "mengsan/cards/packs/liubei/runtime.js": { - "size": 21392, - "sha256": "ca6d9887fb9f8978c34ade455f564b3a0a52eceb5b844447e863390acdb3bed9" + "size": 21712, + "sha256": "a1526d9fccbc0f8b42512ae464669c2d93e207cd9beab284f416582e0b5d3107" }, "mengsan/cards/packs/liubei/traits.js": { - "size": 8178, - "sha256": "bd813bd37feec90300edd14d3d23fcca301d75ff32fca096555e3bbc35bd162d" + "size": 8277, + "sha256": "38e1b081a3789f3760c4a0889b34803667006b326dce1f8e2aa2c862d997a549" }, "mengsan/cards/packs/rewards.js": { - "size": 327, - "sha256": "e7f15d41aa526c6b6ba93b137dd2e31f63fbace91d1bf8c3f8dbdd0fa6ac3176" + "size": 331, + "sha256": "34c6df282cb63a47d5f933543e567d4232e3326d1b662440bc7a7417452149e7" }, "mengsan/cards/packs/shared/data.js": { - "size": 399, - "sha256": "ec004403090107d462d6948751154b03ad6f88a16ac6a844d1898f79e6184386" + "size": 405, + "sha256": "93244ab064a100fa9a93f0cb19acc1d22b6ce17036b2f5cc71fd4f1db42f8497" }, "mengsan/cards/packs/shared/runtime.js": { - "size": 41670, - "sha256": "f1f6541bae4da3d38911e62f51fc930270c16b5a1b2c3a4348c0712925396a7d" + "size": 42402, + "sha256": "b8b8eb4a0a921c4480ba25d42cdbb8766780e87ea7b468b8dd5209ca63c8a644" }, "mengsan/cards/packs/status/data.js": { - "size": 4334, - "sha256": "7ca46d39b6f3cf99189d86811a4d618dc759117c66e796a3e00ec70621765dc2" + "size": 4513, + "sha256": "16de512e265f4062ed9fa077d655a416147308b72d0893348c0ad8c27f5b89b3" }, "mengsan/cards/personal-piles.js": { - "size": 23856, - "sha256": "c02754f949c5853dbabb7e2df42189f82f994d6cc6fb3cdab57a3df784d0f03b" + "size": 24412, + "sha256": "ef9201fdb55dadbcb3a2c518a283f0d9af881aca47500414c710b4ce431f2e74" }, "mengsan/cards/rampage.js": { - "size": 5265, - "sha256": "7563d2316cece8ab1d9b04de28b47e4562b82ad8a6dd493e1c7f64e726a6a94c" + "size": 5369, + "sha256": "dcb64aebece3213651ed6f100e0b9928f5ee9d5ad08386295cc1b623f8b7c7a9" }, "mengsan/cards/random-hand-exhaust.js": { - "size": 1274, - "sha256": "7729cee9b27b696012e6ebf5287fa828e7fa6faf5a68a963a5529e2e9ee2fae6" + "size": 1293, + "sha256": "486758ef934e381bd825a46b07e140f5f28e08eceadba25dd9f107ffefe80372" }, "mengsan/cards/rarity-data.js": { - "size": 440, - "sha256": "ab3858d78537599e2b108e321e9e92dff7b414d8fb94ae472f55a7b0a54d3ec7" + "size": 447, + "sha256": "331af3a3a79affd7725e12391df4ef16d5e6a97f7235a9aec62d7085c4fd67e5" }, "mengsan/cards/rarity.js": { - "size": 3011, - "sha256": "2e2df62319ba5a95d76abc2a1864febe162809f07478103da26925d593c55224" + "size": 3062, + "sha256": "8490cff30bf06d32cf045f7f478ab64baafe6bfc414159d534d2431e4483f1db" }, "mengsan/cards/retired-cards.js": { - "size": 1575, - "sha256": "ce2f18876f10dbc685a712c990a289731fcff3f2e02256363f9476c68b7bfb2d" + "size": 1606, + "sha256": "7ab267d2c50f20c86c4b4e43088a37fa5a081b331725bade23030385765c317e" }, "mengsan/cards/shared-battle-end.js": { - "size": 946, - "sha256": "424b1e24bd19ebaee6a890521bdc4e30ecb26e7145581311208b1d9375b972f9" + "size": 962, + "sha256": "42413c067c71f2b891555d6d3e2f6e3ca7f267491db199dded8ff4807ffefe53" }, "mengsan/cards/shared-hooks.js": { - "size": 823, - "sha256": "bcd757ce6c1ea9c4f56ccfcfcec7adc7b8184c9e4567f0f4b4519a8a867cd7a0" + "size": 836, + "sha256": "58aff21c1ebeabf58ec4ccbf40df423a035c1f9749c91c73cb7c79173b5fc430" }, "mengsan/cards/slimed-card.js": { - "size": 1037, - "sha256": "e3cb9102bc28bbbd561f546dfe9cd6832a69e2336e9d989b1ad8d3636bf5e64e" + "size": 1056, + "sha256": "50b5ed27eb89c36256fcb3cabe05bdee18bfce644c46e77c917f72a8c1f21ad9" }, "mengsan/cards/spite.js": { - "size": 1832, - "sha256": "6cef9cd617cfce569238dbc90db242140724a4da3e4963581649cd1848e15d90" + "size": 1866, + "sha256": "64e7a8c41c707b821233889b180dde8ca213997db8bb757d3909a844ab4b784b" }, "mengsan/cards/starting-deck.js": { - "size": 1638, - "sha256": "44b221d309a96884a51f9ed402b4625200e61ab3c2af79db450102ad0813a37b" + "size": 1671, + "sha256": "ef196c61a7466e2c3b0e8a634ab9cb3351301c810b96004be4aa9aa3e4e888f0" }, "mengsan/cards/status-cards.js": { - "size": 746, - "sha256": "a2c623938bd4d9264c605899bb94cb6599bfcd962ebb5c06a59cb084236ab325" + "size": 760, + "sha256": "cf515ff35b0668c9b8bff7aafa406fbd41c4ee31313a1393595b2b2ec866a83f" }, "mengsan/cards/strike-counter.js": { - "size": 1503, - "sha256": "a1058fe9ec2f8d3bf21eae61326cc74435bce25a49a67ba024f0c516065a4e89" + "size": 1534, + "sha256": "a3de2b465d19a2f14de20ad51e915b4e3459def64fb355627ed2791865a83af6" }, "mengsan/cards/temporary-strength.js": { - "size": 3689, - "sha256": "f9720c6896583b3a7d682949945414ef6b6c1d17a906cfa6c8968c3bf5e455fa" + "size": 3764, + "sha256": "5b843d1f9367108e190a4170644c644f83e113d728ada4fb7d2a997f12ea2fc7" }, "mengsan/cards/upgrades.js": { - "size": 1892, - "sha256": "78f37bd5da682b3a1a3b679df25c026f256adeb5ccc48f6caa0be5d58bdb7529" + "size": 1940, + "sha256": "6517a6ce69f1723aa67a20950880d59c9f57e46f471f88919a867ffde3e213fb" }, "mengsan/cards/whirlwind.js": { - "size": 1581, - "sha256": "a62955b5d5291bc887e7c36b808cecbd189d1eb1506cd67873e7298f9369bf9d" + "size": 1609, + "sha256": "1c155c4c3e351235bcbb6b3aafbeeef8d5ab4672b8bd2ccbe61bba580ebccfa0" }, "mengsan/cards/wither-card.js": { - "size": 869, - "sha256": "8e4cac00e3196c1a4315c36c63e6a0ce36621e7fc2f73e44fa811a424254d17c" + "size": 884, + "sha256": "24831da555d8d0dcfdb5f61337b378628edd8d872b59a482f3670af956d232b5" }, "mengsan/cards/wound-card.js": { - "size": 1891, - "sha256": "2ac15f4252546c183b3de546bd6134a75f8b42ea67632f0d57b8fbd35a8796ea" + "size": 1928, + "sha256": "289c0f38f197a3f9e570ffdc908b69da6a57eba7e1097b509ce6203287cf2e7b" }, "mengsan/config.js": { - "size": 847, - "sha256": "738e1aa69e580ea2540827248cfb551a99da7d8096184e089705a90242662031" + "size": 877, + "sha256": "56d31b1dadbcf7b20f4ff1f065334601fc1fd35ebd8fa2ca92a1334bc8416c67" }, "mengsan/content/acts/act1/encounters.js": { - "size": 3800, - "sha256": "62d9a8fd585cfbcc7cc5ad2916d1e5b30d42834e1f89167b7f670b36dcde54db" + "size": 3866, + "sha256": "f610f8780c83e606dff8ab2195e2cf48942f52f242887f2b9d06d8dc05aa9a6b" }, "mengsan/content/acts/act1/index.js": { - "size": 464, - "sha256": "b9d3989f85ad8893c755d7364a35488a4c170dba9c09aac2e7e3c7c70553d580" + "size": 480, + "sha256": "b64978cde557ae78a31da5472d39a70cba0527042542bae091568ca1fe1c1caf" }, "mengsan/content/acts/act1/inklet-group.js": { - "size": 516, - "sha256": "bbc6ef9d321b8d04431acd03b2648fc71bb3cb4d892e695b6ac41d667d2ae22a" + "size": 528, + "sha256": "d51ab57e50cb1c1eca528fb62fc7177645bcc204ad2919c98187362c58e70a1d" }, "mengsan/content/acts/act1/kin-group.js": { - "size": 776, - "sha256": "82e43fbd9e9ad997cf07cf5c633ae63f1fe7564156e0ab9429e6c2c713689e23" + "size": 786, + "sha256": "d03bd12b44062e49aac3585ac07230c586870718193d03a2778ed71fe504f03b" }, "mengsan/content/acts/act1/map.js": { - "size": 1761, - "sha256": "cdc3ef153ccde6acac639c1ebc16383fe16e8ffd52935f915b80f27c95ecbb2d" + "size": 1804, + "sha256": "d809e8559b3d8ecb419424c39dc54858ba9ca8c94d9c90e2367a6700696bbadd" }, "mengsan/content/acts/act1/nibbit-pair.js": { - "size": 475, - "sha256": "e339e7d91ea24a86b409b89d05a9d6c6846023de343f951f840f68c3baab4a30" + "size": 483, + "sha256": "a380cad41acfb235c276406ae9827858e68e459e422da9c7211c1fb71ea9de40" }, "mengsan/content/acts/act1/raider-trio.js": { - "size": 1595, - "sha256": "a18f6bc3b1074bdfda23a8ea7887e4fd581a88698045f49e2ea94a6b989ea412" + "size": 1627, + "sha256": "7b5d6686573886b3d620d5c5f9866745aba6320c63e7c91e478b81c4bc540a72" }, "mengsan/content/acts/act1/rewards.js": { - "size": 772, - "sha256": "8a6f09e56748957693bfcf7a428670a3fbcfde90c746278e8fa372a51a32d3cf" + "size": 797, + "sha256": "dc9c450a77abe5cd35c4ab46dc8833e49287a9d63fa773bb0da1fd64525eb77a" }, "mengsan/content/acts/act1/stories/forest-ambush.js": { - "size": 5225, - "sha256": "de94b30bafc2e4251a6a70ecaf4b1ceaf300cc2750f71d30014971e1c389b240" + "size": 5339, + "sha256": "ddc43ce1f857082fe1c90db65a1625ff585d8f2cfc23f78b375c18bbec6f3fc2" }, "mengsan/content/acts/act1/stories/liubei-opening.js": { - "size": 5658, - "sha256": "23195b5af712b591d388c9d874a27a2cb19e70bd7a966fb88228bc349353eb99" + "size": 5731, + "sha256": "1d61fbea5194a1960d9e6bc95d0f5b733687afae7d769a1ac9e0846be97341b4" }, "mengsan/content/acts/act2/index.js": { - "size": 129, - "sha256": "d91675bca78c4064b2876c6e9601395aa776f679fe40e63d2385b484d1767c37" + "size": 137, + "sha256": "f4815459fb3244502c85144904a2daa9ffc3451842a9139dbe501b16d09718b7" }, "mengsan/content/acts/act2/map.js": { - "size": 402, - "sha256": "9a8a4a282402a8c25759408a57afba8d73a638d1f64d24407638b1f9156ce6a5" + "size": 415, + "sha256": "b27dbefa0578c06e5c444f693f4305c833f7aff3b535900af5e9e814908c60bc" }, "mengsan/content/acts/act3/index.js": { - "size": 129, - "sha256": "d91675bca78c4064b2876c6e9601395aa776f679fe40e63d2385b484d1767c37" + "size": 137, + "sha256": "f4815459fb3244502c85144904a2daa9ffc3451842a9139dbe501b16d09718b7" }, "mengsan/content/acts/act3/map.js": { - "size": 411, - "sha256": "274a4263af5db5e4d57e71702293c3a53fcc3ae9117e9c0ed5e86b6fa33ba6d1" + "size": 424, + "sha256": "b634af95b44141bfe4dd6149e8d39369c122f9ca5c219b09b20ffdcdf9983fce" }, "mengsan/content/encounters.js": { - "size": 870, - "sha256": "5f1cf6053693df8992cdece2a818ea56cbd6ddf023a60e42e2d0e54e27426fd2" + "size": 888, + "sha256": "580aae8b771084c5932acd0066cb6c8c45b5f4c78d811ada8e286454fe2b8439" }, "mengsan/content/registry.js": { - "size": 7479, - "sha256": "436dd3b3cb759045765778a3cfa1cdc93264646ed97b191197fcb2ec19e1788c" + "size": 7885, + "sha256": "facc90bab28be94062d189bb94716a2fb5aa3387fb65c966ab3bac3d3ab0964b" }, "mengsan/content/scenario-characters.js": { - "size": 9732, - "sha256": "c2678ddedd3349829eb9b3daca1862842ea6da2e928f8edda41c62d4d72e884d" + "size": 9847, + "sha256": "85a4f81946bde6e262f61712c55820f0cfde9d02866035275ec781978a22c64d" }, "mengsan/content/shared/index.js": { - "size": 126, - "sha256": "25625b636c2b82e58c0792c40b7f32562abca99e0fd7861b73a74cdf40c708af" + "size": 133, + "sha256": "5e92067de64aa26292f2fda6f3b270e06564e846a6f19b19c8ba27a04a25e95e" }, "mengsan/content/shared/rewards.js": { - "size": 8893, - "sha256": "867ac35043e5ae50a20349f944f2514c5e6201b71f2f92ca9fd28a0a26fe11f0" + "size": 9102, + "sha256": "e19f5d026318401a7a24f88a23ee900b2c9259872846f89b627899d2a32b693a" }, "mengsan/mode.js": { - "size": 113283, - "sha256": "dda3ece26a917cfe447fbd55ea3ca8f6f791efa5aa352267d898814936bf854b" + "size": 120958, + "sha256": "070f4f5e47df7c75dcc349b6513d5427867e121ac7b3e872a81e5d5d5b84b876" }, "mengsan/monsters/actions.js": { - "size": 33807, - "sha256": "4d07d53c1aa85278190217194cf68180ef428411dd89dafb5cdae7568a11500b" + "size": 34417, + "sha256": "97461914dd3a40e0bba6cb5e1ff41fe34208ab996dafcc64ed5a33d0d3cdebc5" }, "mengsan/monsters/artifact-status.js": { - "size": 2385, - "sha256": "b85161c9acc1d92715f4cb7be7603bfea8b5e6d42f4caa9d30835f38575ca03a" + "size": 2427, + "sha256": "96ff8c497cb3a59d79e3b2044a3eab9e043d56d514d2e62c868d7a8a37a22024" }, "mengsan/monsters/beast-intent.js": { - "size": 6805, - "sha256": "3962c0ab114907f692ee2d484311119d0c621dd460f00087875f6a9140886964" + "size": 6899, + "sha256": "b089382116ca2b4dfc6d12205318df39b6acb7ca7dee026de73a852e5cb5608b" }, "mengsan/monsters/byrdonis-intent.js": { - "size": 3062, - "sha256": "59847f053122a0600d6b4c8b0a5573427da14717177fb1461640b8def9141443" + "size": 3119, + "sha256": "9d029cbd3062c7114c0f3767f9cdfa99c936a2277d864a26980b69f3e1942fb1" }, "mengsan/monsters/crawler-intent.js": { - "size": 1587, - "sha256": "994561eea23a9983931d545ef76281e70dba575563a97059b8b5fc4501a4d40b" + "size": 1619, + "sha256": "5392844734e61a61ee65b746ed6a558b9133671743f795e9d59c4dfa848cf2bc" }, "mengsan/monsters/cubex-intent.js": { - "size": 2151, - "sha256": "bf4af01cbeb8a45ba47dd7f200fa96d808e18322b2908ed4254465644ed87903" + "size": 2194, + "sha256": "9111e0162c4c6eb16301f7956ba0e9b2f29dbe68159d0f49156c2ff3efcf46ac" }, "mengsan/monsters/effigy-intent.js": { - "size": 1462, - "sha256": "e244757471a7142e3b796be5f24f5a4765564d49fd6b7ddb1484883a46838a43" + "size": 1491, + "sha256": "2b4249d128cfb47009698c0292bc897d3f85b6e092d58af4e294e271ed100ba7" }, "mengsan/monsters/effigy-slow.js": { - "size": 3367, - "sha256": "d2c2cf715e24090df2be4e68ff15d55dfdebf862ad87fdfa592bbf7bf20f2f94" + "size": 3429, + "sha256": "4ee5b67badf5b126dc3b4bcf59cc3a6e12781328e6a8d8e30e860d2edcc9c250" }, "mengsan/monsters/flyconid-intent.js": { - "size": 1705, - "sha256": "cd65c7e8004c4810eb5bafda7b20563900ec4f264cfd352e2607f9d6050ab631" + "size": 1743, + "sha256": "6ff2be31555c591a872cc0ffcc7aea99a7bc9b6bd5156993f8847156eef8637b" }, "mengsan/monsters/fogmog-battle.js": { - "size": 3856, - "sha256": "c5cba9d10c25f7ece2290110f787e4fc3dfa50f266a9faac4bfdb0ac957868e4" + "size": 3931, + "sha256": "4695d2ef46b7c84d69c35d1aea1b35d303fe033bc9d73f3d64a9be5c869ff42f" }, "mengsan/monsters/fogmog-intent.js": { - "size": 2160, - "sha256": "367bf74fef71ff55d398902fd14512af5bfecc82e756237f73102fe116381c4e" + "size": 2196, + "sha256": "5d86b308905c65c9147995887ab1dd6f519ade0506ae13db8f99bc2e5bad7b15" }, "mengsan/monsters/inklet-intent.js": { - "size": 2925, - "sha256": "db404520db50e2d052beb236578973ae4b61e61c6a57a366c8b63452b01e19a3" + "size": 2978, + "sha256": "c2812d2dc16d3d69859e6ec70c283d714aba0ae5a4254d28e30f9afe0408b54a" }, "mengsan/monsters/jaxfruit-intent.js": { - "size": 1256, - "sha256": "46abbda7bf21af236f5e7a4c08a5739649bcf46ea70c59dcb18b5226b2568bb8" + "size": 1282, + "sha256": "c295f73ea1daac933310eff41d23f68bf9c59bf9d3aa34f12b54c16a08ab7bc6" }, "mengsan/monsters/kin-intent.js": { - "size": 4393, - "sha256": "3321a96df24d651c2bfea7a7ccfd920be20ae75fa2cb8543abb5985cf7501835" + "size": 4469, + "sha256": "04ad104fa8a99f82ab4811775512e4ecaa9c6d0b8b9732a0e6044f0ef838d93d" }, "mengsan/monsters/leafmedium-intent.js": { - "size": 1436, - "sha256": "ef04089133b4ec6157e48788eaa62c506a424c7e4ef479219529689f4b6bfc81" + "size": 1462, + "sha256": "ae373c29e39891992b857afaf11befac1354f163026a797e8bf13ad8d81b71ad" }, "mengsan/monsters/leafslime-goop.js": { - "size": 1627, - "sha256": "a65b6a00bf246951abed47fb66a6d476849d7cb427169524a1d2ce722ab4758b" + "size": 1653, + "sha256": "133da2f627601e79aa51b6eb87acff777a3ca60c74d142b0d205c40ccbfef3f0" }, "mengsan/monsters/leafslime-intent.js": { - "size": 1403, - "sha256": "3c8f841fb8a02683134a18d1197320b1bb03101f8765e069684654f9ff9ee3c8" + "size": 1430, + "sha256": "4a6f333cefd4c5c4f915f2d2c53b9abfb4d985fd5efc839f974eb862849baed2" }, "mengsan/monsters/mawler-intent.js": { - "size": 1899, - "sha256": "23bfd30298779d9a41c28a3100fb026e17ecd2d1e066f0bb842c57a9ee56b833" + "size": 1937, + "sha256": "2933d7f6b768a797b3bdbceb6f3f93760b68961bf53af3f72262cefa6af75f0d" }, "mengsan/monsters/monster.js": { - "size": 11416, - "sha256": "d6b6bbbece20f50da448adbba8f775acf5f155084008e8f44a61a30d2d1b2aef" + "size": 11658, + "sha256": "1464b42fce32b9266724c8f0eaa06923c1171cff539c337c96af1cc32bd7bc8a" }, "mengsan/monsters/nibbit-intent.js": { - "size": 2292, - "sha256": "b3e34455e8cd88528069345aec2f7f55938b52e05fef4af9b8cd803bbe1579b3" + "size": 2336, + "sha256": "9665a4e9ea519c9cf035f38fca0b65b4b3e83c31ef6a3b6f3951d57ef3f31120" }, "mengsan/monsters/phrog-battle.js": { - "size": 2197, - "sha256": "0c4621e858cc4a4b0e6d1fa86f7d5e06784dfc4ed4e9aba1342c65f6b80f9d02" + "size": 2235, + "sha256": "a9111bfefbbfd5c2641a0a660df5d9b83977bb7c675d77c57f5b5a23b3be3b2f" }, "mengsan/monsters/phrog-intent.js": { - "size": 4060, - "sha256": "e058edf8b6febadcd685dc7c16c05d90e8ba56c1d9b26c132e4ef2fc0e95d9df" + "size": 4135, + "sha256": "9b529fcd6217d87f0682f99c77017565d326b372811b215c20aa8b0e169ac7f2" }, "mengsan/monsters/raider-intent.js": { - "size": 2021, - "sha256": "70580ade399e910e817e3929a41dc2da52bfadf36fb3b494a17a86effab27ee1" + "size": 2060, + "sha256": "b15b89d53914c472c3ef4f2e54e3551bb6a80cd783c21d340676189c2e22c948" }, "mengsan/monsters/shrinker-intent.js": { - "size": 1491, - "sha256": "758ea3ef47d0cf529f09b9733c9fda02c029f7eb30f7ca12b1ccd506267ef90b" + "size": 1518, + "sha256": "fa3c3fee332dd7f709bbf70ab7a510c02a8bed0182c48faa02e1c9e5ae7c7dbd" }, "mengsan/monsters/shrinker-status.js": { - "size": 2356, - "sha256": "08a44974fb5064ea0f83b3b2d3d6d6030508ef8bef5ed4d8a91f274a8e6b95bf" + "size": 2401, + "sha256": "5d4d1482b1bcacd3c02e3b5acc7003edcd2e82452600ecdaabb1934b89249010" }, "mengsan/monsters/strangler-constrict.js": { - "size": 3054, - "sha256": "87b012405f7840e5a064e994e9413e8671e4aebe954ee9fd03c9798ed78efe61" + "size": 3116, + "sha256": "0480aab377f1303ce2d71786b54b25172df6b44cc11a87e80f0f0e87c4b9d174" }, "mengsan/monsters/strangler-intent.js": { - "size": 1578, - "sha256": "b5ea12fd74db365592ace7c55671bad8b18aa34da9a829852fc1a0e3cf1f229a" + "size": 1609, + "sha256": "d2272f4d3a349742195d5c80d8cc30d18de9c884240d23351b965a2a32d902b4" }, "mengsan/monsters/twigmedium-intent.js": { - "size": 2576, - "sha256": "c27f58e02f08b87ed62865fc11bb3ae43b5d2098ac199c5714946d24e0afaa87" + "size": 2623, + "sha256": "5e7039b76647b8b85d549c5ea7deb826ea3299a9d27af659a344a43cbc205ccf" }, "mengsan/monsters/twigslime-intent.js": { - "size": 1273, - "sha256": "26a3437ffc95bec9638911537e5b572f4b12d8a94a06d6df358d73237a181830" + "size": 1299, + "sha256": "dd772c38e732ebcdda6e5b0ecd4725f73b36cb880ff156f3aaa64470a53633bc" }, "mengsan/monsters/vantom-intent.js": { - "size": 2266, - "sha256": "29c0f36f5b060866e5c28c842883d951d55ceb4f0df7a7e204905fd6d803045b" + "size": 2309, + "sha256": "609880e2c33e1d9cadbe9b0a7f3e5e6087d82df94dc14c45e81cd8999f4c10d7" }, "mengsan/monsters/vine-intent.js": { - "size": 1229, - "sha256": "e2bc8348d9ef5d8ff38b3d65a0b05b741fef31cf12ca6b6abe7b81ce58515b00" + "size": 1249, + "sha256": "fa0de60bef2d798685d771182aaf7e6fdea35cb35b732a50fcd5a353bd15ae2b" }, "mengsan/monsters/vine-tangled.js": { - "size": 2214, - "sha256": "e8eb1e501af16d5da2157ff357bef3193233b4fbcd62cd823a4a6114124abd7e" + "size": 2255, + "sha256": "6913f1a6c55f33cf8f69efaa7ac15c3b384d7419305d2f968b07cf5edf81b586" }, "mengsan/progression/dialogue-choice.js": { - "size": 820, - "sha256": "b85e45995226cb30a488d5742c09a407ad9557d95e29136dd72fbaf695a4005f" + "size": 837, + "sha256": "e00707810480b281bf3e8c25923cf09997d06cf2dc3b7eea35c5a1a47c5cd3dd" }, "mengsan/progression/encounter-progress.js": { - "size": 1555, - "sha256": "e674c332baef9b3baffbfed3c86c41cd38a5c95bdd4fb3b1009a9819e90a06ba" + "size": 1586, + "sha256": "9d79bd7a98b6aede1e05e970ba5fc2ebce431d56016375111e2e191d0c6a3036" }, "mengsan/progression/map-checkpoint.js": { - "size": 314, - "sha256": "c0b5fa06fda99cf4d06570cb7e95fafc141b355055d20b0bd8f7ff91f1c1afa7" + "size": 322, + "sha256": "48b96ee1c6d3445d87b78d7fea42d8bbefa35ff9db4682e4012e36f53681bbf8" }, "mengsan/progression/mode-storage.js": { - "size": 3740, - "sha256": "7e266df0de15e4f2252600f10a21a09c01949680c1aaaaf5453591b9df3573d4" + "size": 5601, + "sha256": "9436f89b6885a6e6127ecdb436d7d3fb5ffb8002d693cd21a628fddf6d489b15" }, "mengsan/progression/reward-package.js": { - "size": 1527, - "sha256": "acd839d139bef9d22036e7bcb7acad8c5f25aea1c2a615d224020d97f4e7f313" + "size": 1572, + "sha256": "9922ab586d2c851a5975985460a64672d973d3a2466e17b9114dfdfcfa53bba8" }, "mengsan/progression/reward.js": { - "size": 3308, - "sha256": "31cb0895cfa98696cefd7301b967ba3652aee2c4401f7770e64d6a2cf68b53f0" + "size": 3368, + "sha256": "96884ebd8aa1c8c5ab825907294bfde2855ebb1d927a8d5ab2a20068351a88f3" }, "mengsan/progression/state.js": { - "size": 14578, - "sha256": "5cb6ac5494251f2a9ac68344862d74736e7ba076dc0e1eafdd06e9eac0923724" + "size": 15168, + "sha256": "27dcdb747b5c049b53a62643b6362d3a7d94ec5da6311ddc5a19cd54fdca0339" }, "mengsan/progression/story.js": { - "size": 718, - "sha256": "0719c33cf849fd2b647e4e4ff987560c5f9ea2a015b4acecc57269fb6b562059" + "size": 737, + "sha256": "4db3cf98d5a102cf5bf6d3022b0bdb4c7d70430537e2c4a6a9e541822951f016" }, "mengsan/register.js": { - "size": 791, - "sha256": "95290f693f1d5bbc592e35a3cd063201f46d5deffbd0e281682f371b02ae342e" + "size": 814, + "sha256": "1434e175ebebf75f1f1531eb8a13fe89108f7713b81b41b56074b52f4b12b24a" }, "mengsan/relics/battle.js": { - "size": 4893, - "sha256": "e3b9977b9a20a2c85b3cb01792c996b5255920f455ab07ab537a6f9c915eb470" + "size": 20603, + "sha256": "65d0b389bfab7b95d69e554a32447c65f70f704607ea44fb1e0f4bdd3462de87" + }, + "mengsan/relics/catalog.js": { + "size": 240568, + "sha256": "a8b77b73e47d937b882da5d2f6ebcc84e3f7be017ba1bc1688b124b170ad8cad" }, "mengsan/relics/combat.js": { - "size": 4018, - "sha256": "d5d2c53a596a3772e0f0931f56b0db423cbc69f20847318a9aa77dfb1d2c0e92" + "size": 6117, + "sha256": "71e464d185b9a1c4460bf357588032d71e78d8d2a2ae177f0938971fd61eb279" }, "mengsan/relics/definitions.js": { - "size": 4608, - "sha256": "e974f83405153b994b9135cf6ed3998a28ac8313bd42042075db9460cf9edc6f" + "size": 6689, + "sha256": "b7f6001cfd3691e07e4b5f01428246c7489e2f5208937a6d3097829f794c29e6" + }, + "mengsan/relics/hooks.js": { + "size": 1503, + "sha256": "99e0a84966dace354ebe7e1ec9c55cc6fcfbfbb4eba976dfbee7000d618237e2" + }, + "mengsan/relics/progression.js": { + "size": 10846, + "sha256": "a9935b851c066068a1a81c7078336f5fefcca0e75b6731cee067dd618c048e83" + }, + "mengsan/relics/random.js": { + "size": 574, + "sha256": "2b85c064e70257a73fbe2347b93ff80d1147e9b59367e36cb10abb73ae424a05" }, "mengsan/relics/rooms.js": { - "size": 1010, - "sha256": "331664f916965f8d72ac9db50a59c5ff4f18f7a95c6beb5eeb9e44d247ffd053" + "size": 3897, + "sha256": "e1f0f03762fbb7e8212c22f199810171971cf9f4a12a054add9c571bc3502ccc" + }, + "mengsan/relics/rules.js": { + "size": 18489, + "sha256": "6b4bfd2aa00dcc12248bf4b92d8329160b6433bd94eaabeed6ad09b383b15737" }, "mengsan/ui/bonds.js": { - "size": 4415, - "sha256": "275713f94c9ede664537104a1eb483ac198b477ecc3e5cca52bc51208b3b274d" + "size": 4737, + "sha256": "0df5099a728808116cdc01cc1e0adbbc86c4719e0e575fa44ac0006ad0750e09" }, "mengsan/ui/card-library.js": { - "size": 20528, - "sha256": "b58a96859599082e83da6e8c9026619392cf9a72ebe7223d86e078de3ea14d56" + "size": 21608, + "sha256": "237cc3ad94f337865b6bb26a802b0f93f12194def90b72373f1c23c07a51b80e" }, "mengsan/ui/dialogue.js": { - "size": 7649, - "sha256": "a405f315270c24cdb2c53ba4e211a3fd5bf9bb582335d5dbf910adb5622deac6" + "size": 7842, + "sha256": "e61b22cf27f810a45404e0d05969b03e0a6603d581f8cf7a052a3c30348325f7" }, "mengsan/ui/energy-display.js": { - "size": 498, - "sha256": "b12157ac3008c0e63fb384fe5fefe54964b86436652c73670f6a4c4faa4ad1da" + "size": 511, + "sha256": "37bc74971d52429c7e1c3d9d0c2dcccb29a61e968ac1bf4eb0a2330801d8fd69" }, "mengsan/ui/flow-ui.js": { - "size": 3044, - "sha256": "76032d73c27bd3ba3a54064a7cfc1741f3fea379e26636da3037000943ef6450" + "size": 3285, + "sha256": "42130f7634885f32d4ec5e4c1d165d1b0497668bd4da5557eda27f3109f8bf30" }, "mengsan/ui/gm-manager.js": { - "size": 4636, - "sha256": "e6feac7f157824fba6436330612267f98158a95c8db64b4ee5019e65d1fb8324" + "size": 4727, + "sha256": "1ffcf493ffcc4d9b16911e81ff62b15693213355c3226270e5224b03042e8868" }, "mengsan/ui/hand/adapter.js": { - "size": 935, - "sha256": "91adc86b2810e27bd09d07297ac427cbbc151936f4dd8736ab1413b4eab78a0c" + "size": 955, + "sha256": "dbec5a22b19ba7790c2118328701331b9065cdd7877ad237fa6ba635aad0ab6b" }, "mengsan/ui/hand/diagnostics.js": { - "size": 723, - "sha256": "f41c12348a508a7a1505fbc311b9c4b3cf85be038cc93e467a5f094bf1e5dde3" + "size": 1103, + "sha256": "e15ed8e5993f5185f496f15b4497a27964b3b3cdecd9ac4e5648abdf36517a75" }, "mengsan/ui/hand/fan.js": { - "size": 4355, - "sha256": "55e1e01dda7b4231c8e1a2fadf6ccbee39b5e98c543bc55500c6493cf6cd51b1" + "size": 4444, + "sha256": "c1c762219643592036196f03e2d09f14ac0b4487d8bf61b6b91ce3c73018c30a" }, "mengsan/ui/hand/index.js": { - "size": 8989, - "sha256": "c4f602e6b397b84e96f47a43858a835dcd78a4f671b0e89143b6df088c01204b" + "size": 10125, + "sha256": "4dee83b19ef24572bb0787cd0ffd388f051304fbbc5dc94e2e9cc0b0a51ee7e7" }, "mengsan/ui/hand/input.js": { - "size": 12278, - "sha256": "b04df574792e6e4be7cce4e0d8bd682efeb091b9b752b40a0b110575442adfbb" + "size": 12533, + "sha256": "d3616cc25652f0c8cf3c2432f2df0786d46e8e4fe7a2ce00f4cd19bd1b7ea07b" }, "mengsan/ui/hand/overlays.js": { - "size": 3970, - "sha256": "9e489fc939f97a21266764f1beccdda1cc3ac9df22f72c633647d7481fa4e662" + "size": 4067, + "sha256": "caf261473d3ee17afc46ffa25f76f8d4064317dc387fe0fb151eb9bc282f61ba" }, "mengsan/ui/hand/style.css": { - "size": 15492, - "sha256": "12618f7fd4acd54db197f1ca82dceed87b75c4b6003f02fcaa9054862718e692" + "size": 15882, + "sha256": "c81ee0ad9128cdc0ba2c441fd5cbd980e0394c513462951b5c850896420f09b8" }, "mengsan/ui/intent-display.js": { - "size": 10556, - "sha256": "feb7fdb208d4ee540a0fe66b329402c8587f22dcdb8de2e1eb455b7d6af9a185" + "size": 13543, + "sha256": "1db512b050a73e1dfa2cedcc1a4dc67adbf98dec3c3e297b284eb8363115f0e9" }, "mengsan/ui/map/index.js": { - "size": 61, - "sha256": "6fc56c6c084508a39d801521a103f8c39eea90eb895f47a78924997241d9f932" + "size": 62, + "sha256": "6fb7e6e2547eec9d421727b9d6794e3c96d8e3a77984d7688544a67a00c4999d" }, "mengsan/ui/map/renderer.js": { - "size": 25591, - "sha256": "ffbf4b8d0b3c6ce88cdeb2817a90e70b987396f767fb9a2fb593c28b4c4a3f71" + "size": 26945, + "sha256": "aff712e8b2257ed54bde843686ea9b76ceae5fb8375981c8adbe5a55e5338198" }, "mengsan/ui/navigation.js": { - "size": 8333, - "sha256": "fff29ce0f837931f16af40e09a193468273f0eab75068f8c9f8023e9dcc805ed" + "size": 8819, + "sha256": "3fc55ee51350f21d423d22375af029cf8278108603225a454d27c29caaf5ca32" + }, + "mengsan/ui/relic-icon.js": { + "size": 642, + "sha256": "ba1e2fcfcb3983d25734cca9ba33136a6f12dbc176439b8974fa7ff79a4e0c9e" }, "mengsan/ui/relics.js": { - "size": 3371, - "sha256": "bc24cd2eb4644bcf329a7acac28820feab22b0e4648a1d25ea9e1e3d8120f1a6" + "size": 3673, + "sha256": "76f0042edbb5af4aeb32e597eb21bbb3757ee2327092b29eebc530df26f088a7" }, "mengsan/ui/reward-package.js": { - "size": 4256, - "sha256": "0ca1458434ebe616fd29eebbbb9314c03249673fc9a9e2cbae6ee09be4cdc16e" + "size": 4347, + "sha256": "67d2e757fe6ced0f57d16a1d11aaba8caa4d90bcfe99d878aa5400e5e05003b7" }, "mengsan/ui/reward-ui.js": { - "size": 15170, - "sha256": "70a1bd26b1ec730bc7cdf04bddf160f2e3ae8daadd54c4c38c5263549aa88dee" + "size": 15837, + "sha256": "d403221c69abe676d080e6a8c3c2146242ccc2defb1de4887e62f4ed3611ee5b" }, "mengsan/ui/style.css": { - "size": 77648, - "sha256": "46e38bb6c818d3fae8c0b61e5e2cc7c5c29db69cb72daa244f1a2944db8ebfb8" + "size": 80055, + "sha256": "fcdab9e5cfdd98bcb6849db8e2bfa7da387cf1dd0e75c1fa7013cb3d355b53ac" }, "mengsan/ui/virtual-card-grid.js": { - "size": 4509, - "sha256": "0d8aa28041246a20895a289ab360e982044b2028f6c03090a0039ce85f7e2977" + "size": 4916, + "sha256": "4365dbc5a943dccb01386e22a2ca16cd80596e613c4c862b432b304540c151e0" } }, "tree": { @@ -3793,6 +5318,1506 @@ "sha256": "f4d6e551a3098ecc869c6b53e8d24be50e8ca97f399ab987b96f32a53c75a02d" } } + }, + "relics": { + "type": "directory", + "children": { + "akabeko.png": { + "type": "file", + "size": 7370, + "sha256": "8c66d2626f785df6be565bd6ed8f698a6b241abee6e9a399e693093b3fbd89a5" + }, + "alchemical_coffer.png": { + "type": "file", + "size": 9259, + "sha256": "2ce35f217c19f072d9cc93a9bf87a71acfac92546bc19432038371155b9da15e" + }, + "amethyst_aubergine.png": { + "type": "file", + "size": 7960, + "sha256": "f16c052e5535ce2c2a1065626458956fad21ae03a49a30b09597058522e49b06" + }, + "anchor.png": { + "type": "file", + "size": 7211, + "sha256": "c5ef84383d5b8a5287b7eb0579dfaa00091e8a72d73f48bfa7773e25ce5d10b0" + }, + "arcane_scroll.png": { + "type": "file", + "size": 6664, + "sha256": "8f17daafc63841b7cd0abc6fb44507c540ed81a7cfeda8af8615487b6d8e008a" + }, + "archaic_tooth.png": { + "type": "file", + "size": 7478, + "sha256": "ec4e41ec74c92d1984440d78562a6b0967d8d9dc5050f2487d208b321474e420" + }, + "art_of_war.png": { + "type": "file", + "size": 8052, + "sha256": "9b21c2fa48179b787f1fd36521f0aaa0f08ca333ffb6586bbdae00f5729cbdc1" + }, + "astrolabe.png": { + "type": "file", + "size": 6548, + "sha256": "aeba41731d1f24e24989234e1ab122d0f5ef0dccc46f9f3d7543440ba8075d05" + }, + "bag_of_marbles.png": { + "type": "file", + "size": 4912, + "sha256": "4d399295206a16d5a00285ebb7297ddaca68e593031b8f4d751de6b7147ab762" + }, + "bag_of_preparation.png": { + "type": "file", + "size": 8988, + "sha256": "3454c060c46680288a03b85237ae10caed09d1b2b6de70f43ca229c4650121c4" + }, + "beating_remnant.png": { + "type": "file", + "size": 8688, + "sha256": "6125d8bbd95708c17044251b6be4c22d5b85cc2abfbae4199d5b3e8e7c8ba75f" + }, + "beautiful_bracelet.png": { + "type": "file", + "size": 7662, + "sha256": "c75f3bcb159ff5ce9c2ee1c6d6a4ba166f49a5343fa295ba540eb38b67e519b0" + }, + "bellows.png": { + "type": "file", + "size": 7584, + "sha256": "b488a47c2bda4d698e3200c7810bcd07f42c7c4375f0beb9a74067325449a73a" + }, + "belt_buckle.png": { + "type": "file", + "size": 7132, + "sha256": "8fe4a786453afb3fb9f31344189ce8de5555528a23137087dbbe1506c39de4b2" + }, + "big_hat.png": { + "type": "file", + "size": 6382, + "sha256": "9fa1f0c744dbf6c932867921c2a12f7045b068d391ec1d4ee4673ddfcb3ae779" + }, + "big_mushroom.png": { + "type": "file", + "size": 7337, + "sha256": "d25610bf6edb0951e55d1c7908d69c0cfc3505e6513479b8b376bd0995ba82af" + }, + "biiig_hug.png": { + "type": "file", + "size": 8590, + "sha256": "b2be9f4a4dff67325761d43c0c68873f60c69ec57c8302eea4b990cd831a348f" + }, + "bing_bong.png": { + "type": "file", + "size": 8671, + "sha256": "7ec0e8aa790e2f408eaed979443a8955b28bf6e5adb63d7cd8ddff8a8805898d" + }, + "black_blood.png": { + "type": "file", + "size": 6334, + "sha256": "16b2063051b6e92597e0247a3d08fc320fb7982e8c356fae8f959ace79519c51" + }, + "black_star.png": { + "type": "file", + "size": 5619, + "sha256": "8b04ea4e4c8a24535de25346fb782f3eaf77d5eba230dfb097d5f5b8edb85c67" + }, + "blessed_antler.png": { + "type": "file", + "size": 8151, + "sha256": "9d69e5099dd2633676e2f5ee272c73a9ed25a094fc623bc8b20cbd133e24af74" + }, + "blood_soaked_rose.png": { + "type": "file", + "size": 5546, + "sha256": "e1178b0a4fd60b0a36c48cdac66646c1c7ff48e99cb629fd4dc724b4e371334f" + }, + "blood_vial.png": { + "type": "file", + "size": 5729, + "sha256": "ce19f150946e44f32eb1e01a8c31b28fbbd92150eb831ff41c1febb1a9e671c2" + }, + "bone_flute.png": { + "type": "file", + "size": 5418, + "sha256": "be4b47186103b742fb19e07f81193f8cd65fc46ce3ad0a368af9a1736a6936ff" + }, + "bone_tea.png": { + "type": "file", + "size": 6791, + "sha256": "59ec4683c2da48edc13d5b3398a63e63d8005b6cf4c3d07724b278bdd1e7d45a" + }, + "book_of_five_rings.png": { + "type": "file", + "size": 8169, + "sha256": "5e2251669482e7c9191007776a75cfe56303cd88071b292e03ed2ba4fc9b8919" + }, + "book_repair_knife.png": { + "type": "file", + "size": 5558, + "sha256": "b61382dfb7d1087127b06998f2d8aa33a4080939bd383c4813b74a3dd07c2270" + }, + "bookmark.png": { + "type": "file", + "size": 8190, + "sha256": "03ccd1af4abef47b0e5624b461e381673f7419ac5ec40c7a5030dc98f6a442d9" + }, + "booming_conch.png": { + "type": "file", + "size": 9466, + "sha256": "3ecd75fd6e73e0b0b12d1a3254c80e066653644c71f8060492424354e1416f02" + }, + "bound_phylactery.png": { + "type": "file", + "size": 8874, + "sha256": "85a20ade6f5354209b0562a35603b0213ba02b9eb04584ec7d49591843e7a7a4" + }, + "bowler_hat.png": { + "type": "file", + "size": 5589, + "sha256": "29403835d283a7a5eaf71d83029a5d67d2606390a25807e47d7489453627d6e8" + }, + "bread.png": { + "type": "file", + "size": 7202, + "sha256": "bb0e824577aa58e76d91a9094ab2a0b277b777bd15ff50ba89385c0c6deba590" + }, + "brilliant_scarf.png": { + "type": "file", + "size": 7458, + "sha256": "08ed5ba0254fa7c2787ab4d081d0f48f259948e2dfe42b406644fed3f8bbcb44" + }, + "brimstone.png": { + "type": "file", + "size": 7533, + "sha256": "6ff582b28ed3f2ffda1b4aa14e5be6a83708dd75a16fd176fe4a95a3575324b7" + }, + "bronze_scales.png": { + "type": "file", + "size": 7094, + "sha256": "2c148ecbaed13b43e2c3ca1635bf2fef32a9cf827b28d7412743555ab2d19eee" + }, + "burning_blood.png": { + "type": "file", + "size": 6202, + "sha256": "eb267673cacbf90e519fc646c75403ff9b82fcc8b0f01a8213103cfbaeb6af75" + }, + "burning_sticks.png": { + "type": "file", + "size": 7372, + "sha256": "935327638f20fc08ca1fee8d0933de98cc617da4d833e7d0fb6fba7b2ddadfb1" + }, + "byrdpip.png": { + "type": "file", + "size": 7173, + "sha256": "25ba16ec451ca698a80727805e6775456e023519de9e2f63bf44271df0e52642" + }, + "calling_bell.png": { + "type": "file", + "size": 8215, + "sha256": "e9525274612afb288945f70eed7787967e656f20bbdcec4d35414dd9966c8852" + }, + "candelabra.png": { + "type": "file", + "size": 5701, + "sha256": "d79f21c8870c5aa42b996c0ba051c32b6258b1a1270b999895b95f1ba8e3469c" + }, + "captains_wheel.png": { + "type": "file", + "size": 7933, + "sha256": "8c7872210f2a38d13ef095eb5521a107840c25ccaeecb3053ae253d3c8b5369c" + }, + "cauldron.png": { + "type": "file", + "size": 7112, + "sha256": "701fca93a9d5953eb77cfad96c7cfaecc021d404b34a91744ad8130f5e07c1b2" + }, + "centennial_puzzle.png": { + "type": "file", + "size": 5795, + "sha256": "d089d68fd8592b45d2c55320fb4735b1d36e7f01b564d585892b95a348e21a23" + }, + "chandelier.png": { + "type": "file", + "size": 6424, + "sha256": "45ef85a055b6b6b684a1206f0daccea47862bbbc79b3cd6476302393dfffe9b9" + }, + "charons_ashes.png": { + "type": "file", + "size": 7056, + "sha256": "83fd67c7d8145f87855b6f5405734b77afe6833525480fed6312a40552e941cc" + }, + "chemical_x.png": { + "type": "file", + "size": 4646, + "sha256": "a02fcaabd5ab21f9ccf90debaec37e414297a568a220a63823801b4e31c9299b" + }, + "choices_paradox.png": { + "type": "file", + "size": 9191, + "sha256": "37a8ab0b7227ec4ed88116a79890296fe2ad5736e6189c2e3cc58f3e5ab12839" + }, + "chosen_cheese.png": { + "type": "file", + "size": 6214, + "sha256": "26b9b6ad3e2b7dc75b3875beaac0846cd559f1bd914564a4353658c7b816c787" + }, + "circlet.png": { + "type": "file", + "size": 4357, + "sha256": "19362699cfe501c24597cdbe03bb6827f3c114d6b162221e7d70ed567e97600c" + }, + "claws.png": { + "type": "file", + "size": 5630, + "sha256": "2e10948264d05bdc479aef17fdd920ffac539817205765fe931f7b06757cf3bc" + }, + "cloak_clasp.png": { + "type": "file", + "size": 5876, + "sha256": "25e777a9875e77eaea6cb904095adea847e71d0c534216d6f5d5520660254106" + }, + "cracked_core.png": { + "type": "file", + "size": 8536, + "sha256": "52988a84945823b2738d07e713286f2168149de6fb9112f127d763c05d5edefc" + }, + "crossbow.png": { + "type": "file", + "size": 7310, + "sha256": "6187a77f4c6a4971a759b4a1d6ef7deaf768f889020d40b9d4bbb1beff6509d0" + }, + "cursed_pearl.png": { + "type": "file", + "size": 7285, + "sha256": "7eb5851a98bee16bd3af60083c6ec8d1d86ae0238346661fd2ed9fd90595d1dd" + }, + "darkstone_periapt.png": { + "type": "file", + "size": 8875, + "sha256": "356fe89393f165732b1a4bc7776ac1075084b10edb4084b3fdcc84abdc87892f" + }, + "data_disk.png": { + "type": "file", + "size": 7979, + "sha256": "972bfee1affe49ac0d9442744db277883325555a0d41f21ab27f616665d8e61d" + }, + "daughter_of_the_wind.png": { + "type": "file", + "size": 9006, + "sha256": "b94b3e19b2b1936c3e8683cbd8bd27b2d6b9ae40d1d1c483c32b4e343e0e2db1" + }, + "delicate_frond.png": { + "type": "file", + "size": 6737, + "sha256": "47fce2993c7bad247654b9943200ecda94551c84b5647e1900296f920c52f5d0" + }, + "demon_tongue.png": { + "type": "file", + "size": 5413, + "sha256": "928712f8333587bdc722146a07621547c0ab921f86d46632cf53d3a059d295be" + }, + "diamond_diadem.png": { + "type": "file", + "size": 6007, + "sha256": "852039d98f8511dfb005764319ec8daf0fd91fd4617495096ccd942400adaf6b" + }, + "dingy_rug.png": { + "type": "file", + "size": 8697, + "sha256": "be09a50d401b217329f047375f03fe5ee8da258b105137b77a7fe6220007a0a9" + }, + "distinguished_cape.png": { + "type": "file", + "size": 5828, + "sha256": "76e0bccf5ba78f43cb471c225afabfd1c2b9f00660dd9665428bde4aabcfd17d" + }, + "divine_destiny.png": { + "type": "file", + "size": 8401, + "sha256": "1608d8ad1c29320626ad1adcc729d0923027ca8ed3669d904b4aa7202dcb51f4" + }, + "divine_right.png": { + "type": "file", + "size": 8739, + "sha256": "c85600185800761b3bc74176cdcb6c9ec7a2dfc82ec3f3444e4197cac70ee173" + }, + "dollys_mirror.png": { + "type": "file", + "size": 8280, + "sha256": "1967a29973bb3c30468531be5a78b8e5debb15d1caa40cd728e39bf52f53937f" + }, + "dowsing_rod.png": { + "type": "file", + "size": 5041, + "sha256": "081ba6552b04c75a8f480a700c423c4ac15d95a3414783cc4d4c15e7162d7dc9" + }, + "dragon_fruit.png": { + "type": "file", + "size": 9003, + "sha256": "722493d462329c2e4e8f0b945cd57eb24be216911c592c21d25352f3187aa9d3" + }, + "dream_catcher.png": { + "type": "file", + "size": 8486, + "sha256": "436ab41c68b63f6b9b9fc6e0320a1a9c3721bcf64a0ac5ad1028c09fb6e8f519" + }, + "driftwood.png": { + "type": "file", + "size": 6988, + "sha256": "e71bce47cfba5121992edd8f676692fb0e601ddc480ff7d01a83699d645987ee" + }, + "dusty_tome.png": { + "type": "file", + "size": 7793, + "sha256": "15f9d3c887c26123919f91159b9fc872eadb8979cd216433b565c0aec3e44f0f" + }, + "ectoplasm.png": { + "type": "file", + "size": 6117, + "sha256": "020d92067bb95f0f8d7bb889795a1c357d4bde56715ae07127d4cb2b8f9afeb1" + }, + "electric_shrymp.png": { + "type": "file", + "size": 8709, + "sha256": "866939038891726bc71169b28f73ee97424785283c94a254bf609619febbe051" + }, + "ember_tea.png": { + "type": "file", + "size": 6484, + "sha256": "cb7e6260e4f6b6155b8ce26b3b207205a2a737f1907ab142494e54bf01d6c67f" + }, + "emotion_chip.png": { + "type": "file", + "size": 5413, + "sha256": "403efc9ad99ee45e45bb0842c7f4867e23b262f5375b4c9f411a0c7f8e60f0a9" + }, + "empty_cage.png": { + "type": "file", + "size": 6599, + "sha256": "04cb56f647559f75b28d897a93a25ad12d409201432613134fe6f1903fd00f8a" + }, + "eternal_feather.png": { + "type": "file", + "size": 6627, + "sha256": "eedb47dacf42b236655b3f0f803ca039f162a4e146fe3d2463bc26de9d48b676" + }, + "fake_anchor.png": { + "type": "file", + "size": 8325, + "sha256": "b5177fb872f16a47ee51a080038c6bad73ff733779454ae4d1ee1a8f51beac9c" + }, + "fake_blood_vial.png": { + "type": "file", + "size": 7906, + "sha256": "03663890031196657a57c47a3f7f94119957e8b832a5c362bad3451a639637c3" + }, + "fake_happy_flower.png": { + "type": "file", + "size": 7346, + "sha256": "a1ca960f31f5b0932e0860fa2caafd3f7507e36eed1a84a63667ac8cb2e6c0d3" + }, + "fake_lees_waffle.png": { + "type": "file", + "size": 10442, + "sha256": "54e9eaeb9aad06201ef767ecb3ece1a9b6f6f98a780303141f2207cb9f5add44" + }, + "fake_mango.png": { + "type": "file", + "size": 10329, + "sha256": "91a8a2a2eaa4dd4182fa8f3a46372493cfaa708a520c8a8939c34f0b09a2106e" + }, + "fake_merchants_rug.png": { + "type": "file", + "size": 7462, + "sha256": "5ffd297d07a96f8d69766f1359b074ce7fd9665a5b380fa2592da0ad38a31ab7" + }, + "fake_orichalcum.png": { + "type": "file", + "size": 6671, + "sha256": "17a4813fa77fe1143cda0563a5cfcb018e04ac7688369d6704972b01bcb42a32" + }, + "fake_snecko_eye.png": { + "type": "file", + "size": 10878, + "sha256": "5513ee9db0faaec2e5548c9d4c561869874aad1ffe8b1541dce37a77ada0b859" + }, + "fake_strike_dummy.png": { + "type": "file", + "size": 10755, + "sha256": "2de722a772b8f0cd9ac6089d7ce8806294a420dd5b7a966522c04e1278ffa20c" + }, + "fake_venerable_tea_set.png": { + "type": "file", + "size": 10067, + "sha256": "689ce56a8421bb8ec25852cbd83b816984c781cebf9effe99fbf233012191a2f" + }, + "fencing_manual.png": { + "type": "file", + "size": 6554, + "sha256": "c51fab3e1c8e5c17d2c77ef7cf8efc0e523935982a9ffc8434d434069d262f7b" + }, + "festive_popper.png": { + "type": "file", + "size": 8348, + "sha256": "b59a97c3638f54899e7d3841a09051b320742cfe42e10e7799c59834779d4b09" + }, + "fiddle.png": { + "type": "file", + "size": 5494, + "sha256": "15d88439ce1921e06e0d440d27bd1b9e34839ff60b485cfd96d6d24c23b6920e" + }, + "fishing_rod.png": { + "type": "file", + "size": 5623, + "sha256": "604fdd9a5ad6a5b83c88fa77c0b976d38415af2ecac0649be819f1b9ae90f0c2" + }, + "forgotten_soul.png": { + "type": "file", + "size": 7405, + "sha256": "11ca6eccc1526a3e842a00cf799aef2706bf5210269ad24c8f4c6dd305e46eec" + }, + "fragrant_mushroom.png": { + "type": "file", + "size": 6051, + "sha256": "f068807c85b79bcd6f2234b8b39c9017a08419c865db17b0f7d6cdee05fed82e" + }, + "fresnel_lens.png": { + "type": "file", + "size": 10589, + "sha256": "7519a026cd671be5e3e6a9eae66bc27c4d64cef75b9cbe53afa3f681a419fc4d" + }, + "frozen_egg.png": { + "type": "file", + "size": 6468, + "sha256": "53b0e8bd035438a28c87dabab4c671847199911e9273e9707e860889b9a53f2a" + }, + "funerary_mask.png": { + "type": "file", + "size": 8372, + "sha256": "b7a035e06c72698519b0cc134d6443db8d89de298dd9150a0d760f20c1581656" + }, + "fur_coat.png": { + "type": "file", + "size": 10183, + "sha256": "f679624de0d1120ad27406b5cc9f82254116df7a906a508d899f01fb78f37fa1" + }, + "galactic_dust.png": { + "type": "file", + "size": 7036, + "sha256": "c87090992f813c8e41dae6277ba6dbe48c9376906e412f3948b037fece4a7afe" + }, + "gambling_chip.png": { + "type": "file", + "size": 8263, + "sha256": "eb0b6124d7cdf447c94b4bd2dc5d6f7757c6fe7cedac9014247e2b966031a54c" + }, + "game_piece.png": { + "type": "file", + "size": 6525, + "sha256": "677e13b35ff1b755a3310c0979b9d9d575e232e958ccdfa9ffc767bc1463d1d3" + }, + "ghost_seed.png": { + "type": "file", + "size": 7167, + "sha256": "9b3dc0d0e87cdcefdd62c3c400260d70e93516a8ebc297bb3b2d6e3f6dde652c" + }, + "girya.png": { + "type": "file", + "size": 7017, + "sha256": "b979788d9008933119fa78f80639a3ec59567d8b3c05e4b50e71d9c5695b0c0e" + }, + "glass_eye.png": { + "type": "file", + "size": 6006, + "sha256": "9c8192ae8b3e8eeb57bc76511ca8253eb136cfdc272fdcfd1672d2218c127f6b" + }, + "glitter.png": { + "type": "file", + "size": 8304, + "sha256": "9399b23ce2a115a364d4082c7ee3f0dc159fc3f55d11f24078f03ad480f801aa" + }, + "gnarled_hammer.png": { + "type": "file", + "size": 5429, + "sha256": "54196fd212f77ba2833515537a6bf0f0910d98b52011fe08f15a55e8c78008ac" + }, + "gold_plated_cables.png": { + "type": "file", + "size": 6804, + "sha256": "de3c75fd3e4a41a9dd9c845c552deec168daeed0c7189d0e7bfce46aa94bc3ef" + }, + "golden_compass.png": { + "type": "file", + "size": 8894, + "sha256": "a3fde88793b07d150e382f8536e313bc534282d4ae7b0fd8bdfdbbb2a8d8cb60" + }, + "golden_pearl.png": { + "type": "file", + "size": 8246, + "sha256": "ab6123ae2c16b2361710c41496855243ace03cb61622cd7c3f06436553fc88ff" + }, + "gorget.png": { + "type": "file", + "size": 7239, + "sha256": "dbcc4c8573b30696405673a028ebd3aa7bb9bdde79361e7ca4e87df8cb7f5792" + }, + "gremlin_horn.png": { + "type": "file", + "size": 6932, + "sha256": "4d5f0e4e1d23981d5fba175fcde9ef4563c315123e98572230a48d9891cdca82" + }, + "hand_drill.png": { + "type": "file", + "size": 6727, + "sha256": "4074fb1993bcdf826998e4c8e8b75c62bf75451872c70a9b8cd895ca68c78734" + }, + "happy_flower.png": { + "type": "file", + "size": 7156, + "sha256": "0f6eff613484c13e818d0b1f963a1c96337c3e7adfef71d770e9040a87844687" + }, + "hefty_tablet.png": { + "type": "file", + "size": 9092, + "sha256": "dc8e804b82f383c4f50eed1e872b99a75457cce9f140411a9fcbdc503efd9b52" + }, + "helical_dart.png": { + "type": "file", + "size": 6241, + "sha256": "cc9089ab5758b01f9ac211e06738cd2cef23e89eb3a46fed40ac9352c0577a94" + }, + "history_course.png": { + "type": "file", + "size": 6997, + "sha256": "2c4c07af26e8a3356e575a8ded8087bea93aac57f87df14c1a2cda1bb8b60c38" + }, + "horn_cleat.png": { + "type": "file", + "size": 4463, + "sha256": "a8438e3cb2a028dc983e0e83d19daeef253863aa3a10d15a9a2f56594096e165" + }, + "ice_cream.png": { + "type": "file", + "size": 7197, + "sha256": "38de2a36162746558aab496725c7b4ec6f070c207d74382161c88f29e35e00ef" + }, + "infused_core.png": { + "type": "file", + "size": 10310, + "sha256": "daff4b092b9a5b3da5016aa50feb873bb0259cdccd85e1f17dd2bff70c3e67c1" + }, + "intimidating_helmet.png": { + "type": "file", + "size": 8849, + "sha256": "1fdd25d525cb8b5c5023ca02fa2577989524243e122bf51aa0bd5e1d88ebdc97" + }, + "iron_club.png": { + "type": "file", + "size": 5576, + "sha256": "5df582548df6ddbdd8df05bbb98bda67ee487baef2fc9eb85fe5f561ab52cbb9" + }, + "ivory_tile.png": { + "type": "file", + "size": 5196, + "sha256": "0abb77b0e82dcb8d22b3c87c379ac49110886dbd98182c607d99d99f33ef22e2" + }, + "jeweled_mask.png": { + "type": "file", + "size": 7835, + "sha256": "666add62fd8551e5bb48e5c472b68bf323decfd1523af682ccb769bad1756e19" + }, + "jewelry_box.png": { + "type": "file", + "size": 7348, + "sha256": "50d088f9fc04da89156d02d88752fe5d81688e8b04ba69dea9994a09def6a97a" + }, + "joss_paper.png": { + "type": "file", + "size": 10387, + "sha256": "6fdeba44132726b088a4c8e13fc2e2e1dd41454b0bb14cf4876f13c1ddf8814b" + }, + "juzu_bracelet.png": { + "type": "file", + "size": 8301, + "sha256": "13494f8ffd72f04bf4cc6e87257e24a4c17c5c285e4d530f4f6a966403475c9c" + }, + "kaleidoscope.png": { + "type": "file", + "size": 7365, + "sha256": "3c5be7037b9b8418b6705a45f5633c2762a4a4103759f197fc58745a9c8748ea" + }, + "kifuda.png": { + "type": "file", + "size": 7972, + "sha256": "1448fc249a0092979aa9b80507de289cf51ebd6da36b72f4d9af9bc4369bf692" + }, + "kunai.png": { + "type": "file", + "size": 4476, + "sha256": "6e444551870a51664051bf5793596317c912b9917abb350edb6a974b1a8422ce" + }, + "kusarigama.png": { + "type": "file", + "size": 6107, + "sha256": "ae1be498dc2b59fc6c493c2fe6ebfc1c726ad86c2f87f9b2b33abd37faa03b1d" + }, + "lantern.png": { + "type": "file", + "size": 7201, + "sha256": "d6235c8f914bf3814dc4536fc26b5e956778227bfc904b5c8715f29bae367dcf" + }, + "large_capsule.png": { + "type": "file", + "size": 8368, + "sha256": "4cf9630ed3b00db019500593f7b421741f4a312a6094cd912a0a0da8b82bcf52" + }, + "lasting_candy.png": { + "type": "file", + "size": 9132, + "sha256": "c656cc9bbe48b9cbf80327b1b3cf31784dd2037c76498dc6bfe49bf41d8b7f82" + }, + "lava_lamp.png": { + "type": "file", + "size": 5447, + "sha256": "b8c39d25b474322ae39178ad7b9a5f30c9fa315b26d3a49fceab0661eab85ce7" + }, + "lava_rock.png": { + "type": "file", + "size": 9918, + "sha256": "fdd51e68eacf42adc7e082a75fd978280a300706c3447ad3a82568c012a3fd59" + }, + "lead_paperweight.png": { + "type": "file", + "size": 8083, + "sha256": "c8e86d34aee2d222015ce5a145f7c415d9081003f712e55c37f395c2566f3bb0" + }, + "leafy_poultice.png": { + "type": "file", + "size": 8769, + "sha256": "89f69c4b4d7c37587fb647f8a244ad26d8c4bce3280e37bebe9011d25152caa5" + }, + "lees_waffle.png": { + "type": "file", + "size": 8818, + "sha256": "5484235e41b281b117fcbd616daaade779329c99398bb41a4dcce1ee0f75e278" + }, + "letter_opener.png": { + "type": "file", + "size": 5423, + "sha256": "bcf26d13d7129cd76f4e47408c595806b2f22ba50061655ab9e8bfb5065cd1e5" + }, + "lizard_tail.png": { + "type": "file", + "size": 7566, + "sha256": "f35e673e7d3344048b9f5747786c2d86e9fc07b3348a58bfa4a95fadee37c518" + }, + "looming_fruit.png": { + "type": "file", + "size": 8357, + "sha256": "e103042a32053bfee08119395134e8012abdde1bd6942d024253803d1d71d156" + }, + "lords_parasol.png": { + "type": "file", + "size": 7980, + "sha256": "6e9201cc512fb516f9c87eb6b894c8c5eff24af5ac2379b0ed782508514c2ed2" + }, + "lost_coffer.png": { + "type": "file", + "size": 8032, + "sha256": "7132d681218312f2c5725ee43c03f8e69b2133c6f0cac7fa54dac2037c65e273" + }, + "lost_wisp.png": { + "type": "file", + "size": 7568, + "sha256": "2bf76657ff3f099cc9340df94d0278ecb38b279ee1d5e2da970f29707e5987c8" + }, + "lucky_fysh.png": { + "type": "file", + "size": 9458, + "sha256": "a68215fed91a79ea23edab925737fbc23b97cc485813d7bb84a6207d6b697d50" + }, + "lunar_pastry.png": { + "type": "file", + "size": 8027, + "sha256": "c2942020a364ef50318d03dd2e501a973dfebfed1069901cbdb5b7bc1399ccb9" + }, + "mango.png": { + "type": "file", + "size": 9461, + "sha256": "1bd7c0298cbbc160d6f17a838b99880548559fb7db66d83f10634f8fbfe04774" + }, + "manifest.json": { + "type": "file", + "size": 97396, + "sha256": "0c1643d0a0b937e670c0f09158cdcb4a9a70213fbd287e876923679fda5182ae" + }, + "massive_scroll.png": { + "type": "file", + "size": 7672, + "sha256": "84ade0cdeffb0459b5d2aa54c45f35f8b088f21cd47ae99641b2f2a5a8213265" + }, + "maw_bank.png": { + "type": "file", + "size": 5490, + "sha256": "1443b2b655331ec1e6840a5367e8d84f08ba4a10383e6cc86582ea07a55fe659" + }, + "meal_ticket.png": { + "type": "file", + "size": 6610, + "sha256": "bd3d8ba5a687e396c17b32c2eb616556f9c532d448f4aa529a8192fc7f785a68" + }, + "meat_cleaver.png": { + "type": "file", + "size": 4243, + "sha256": "56ae46bb753af86fc1948755bb027da473d1e03a83f1e0ee0a578854b83fbdf6" + }, + "meat_on_the_bone.png": { + "type": "file", + "size": 6570, + "sha256": "2e844815e199f9cb8afe92fd3beea1ace8e0caf1aa609bca1f7d059d89ffe5fb" + }, + "membership_card.png": { + "type": "file", + "size": 7343, + "sha256": "0fae3370f1e7a09864e88a005d968f0c7c72c6582a3d54b7d95ab419d1a762c3" + }, + "mercury_hourglass.png": { + "type": "file", + "size": 6038, + "sha256": "9a70f5f6add9e59db417fd42e627dc8bd997e44397c066447ae5ca709337b3f3" + }, + "metronome.png": { + "type": "file", + "size": 6549, + "sha256": "128950a834ca38f56eccbee87fc5dbfbe93a7a95697ad558fbd938b67257e0b8" + }, + "mini_regent.png": { + "type": "file", + "size": 6062, + "sha256": "14901f72839907f4fc2e0f90f38f96cb25060251e8958c453e48c1e54be5bc7a" + }, + "miniature_cannon.png": { + "type": "file", + "size": 8396, + "sha256": "db052b59371e475b8f6bede349aec67ce35e4c217a2cb6ab386b95b5f258fb68" + }, + "miniature_tent.png": { + "type": "file", + "size": 6993, + "sha256": "5a90dac1adcdf7d86e88a09c84892b67524aa33ea12a2bac090c91fd670a8f4a" + }, + "molten_egg.png": { + "type": "file", + "size": 8687, + "sha256": "3713acf536dc2c66eeb903377b0ef468114fc77552f550bd6bb65014c08b3725" + }, + "mr_struggles.png": { + "type": "file", + "size": 7422, + "sha256": "02c5ea06b237309683bf7567392166b075e59699109ea1172d594198ba14d77e" + }, + "mummified_hand.png": { + "type": "file", + "size": 7919, + "sha256": "2c88bd36ad1589e16e3ee01f985495e869df373b9ffc0db58bfa44420db72c87" + }, + "music_box.png": { + "type": "file", + "size": 7966, + "sha256": "a8e36a0f6502b4cbcef7880bc26600169839e597c7f59c1db673b36324808066" + }, + "mystic_lighter.png": { + "type": "file", + "size": 6646, + "sha256": "fc496c6fa2867d985f008898f8ebe929c3f52ebbcead3988ec891b2d324d44fc" + }, + "neows_bones.png": { + "type": "file", + "size": 7057, + "sha256": "bdac5e0c1a6a5f2c4652ec5188e53b7e062fa189f9f7e354cf0a6fdebbced224" + }, + "neows_sacrifice.png": { + "type": "file", + "size": 11221, + "sha256": "b5e0ae19d81e4b8c5356abdc6cdbecf8911a8dfcba242379535a892ac97bf3ce" + }, + "neows_talisman.png": { + "type": "file", + "size": 7091, + "sha256": "cc1a499fc9fba82ba676b87b996a235f462a5896bf1b50dbad56399d04be3f9b" + }, + "neows_torment.png": { + "type": "file", + "size": 10310, + "sha256": "ec5ab815f0c1ca316bb188c2828a62a32ed4a84d568988f36f10d97fdff340ab" + }, + "new_leaf.png": { + "type": "file", + "size": 7802, + "sha256": "e5ad70ee6e6a18b07dab6bb26a62cdb98d30258204b2422f1dfa215be4a70242" + }, + "ninja_scroll.png": { + "type": "file", + "size": 8733, + "sha256": "04eeb32f6bdbb4bfeff7c3533b767051088e6ceee2df38620276a6c3fd35d1d0" + }, + "nunchaku.png": { + "type": "file", + "size": 5482, + "sha256": "661f0d7276755f0e7cd667c3907edbc61ff2c10269289fcc45601fa5126469c9" + }, + "nutritious_oyster.png": { + "type": "file", + "size": 7897, + "sha256": "336b070f4418eeb6f8a9a470bd9472e8d680022737b405e471aa0abf06a78235" + }, + "nutritious_soup.png": { + "type": "file", + "size": 8375, + "sha256": "779c863291178a267cfce8aa7228415b1c13af872a35af42a99f148de233739a" + }, + "oddly_smooth_stone.png": { + "type": "file", + "size": 4824, + "sha256": "5e2fcf2f5b1bde89ce98bb9569283687a1e0416f03c65bf4aa4550a0f15451af" + }, + "old_coin.png": { + "type": "file", + "size": 8264, + "sha256": "8429b06a5a2ce9c194fed4674c186f65228b289c9f57104401e5991eb8132b16" + }, + "orange_dough.png": { + "type": "file", + "size": 9276, + "sha256": "08538a1bba026fa5c1ad95e2ebdf93bfb1e65375ee221c76e4a7381a59f90449" + }, + "orichalcum.png": { + "type": "file", + "size": 6289, + "sha256": "e260e9e451cece860d06f77f15c7746642e48ddfd18e0d5c781713365841999c" + }, + "ornamental_fan.png": { + "type": "file", + "size": 7744, + "sha256": "478b6a4adc748105fda587d39ce8b23f90309a6c30caba78656932f04750efb0" + }, + "orrery.png": { + "type": "file", + "size": 8419, + "sha256": "b50c2c7de0244df20057a345588e0baa52a50af2ce96987a8c4fc4c9ada33dc5" + }, + "paels_blood.png": { + "type": "file", + "size": 7744, + "sha256": "8ebd1d007b259e9cf4e3c673992a65a74804c73a0d642078c5f7e7a2546357ee" + }, + "paels_claw.png": { + "type": "file", + "size": 4364, + "sha256": "f6b0f305402c0b4661c31ccb78d6c5563894790889f72a07a2b92f274d34c52f" + }, + "paels_eye.png": { + "type": "file", + "size": 5024, + "sha256": "993a5037e4e1a66e0b174a127c706f2984099dd2ef91f459b5a07a626da471af" + }, + "paels_flesh.png": { + "type": "file", + "size": 7830, + "sha256": "31414224ae2f5c628001b73736c46dd65c3444851d98e2545a32babd96452864" + }, + "paels_growth.png": { + "type": "file", + "size": 6822, + "sha256": "f4a4f3d79536268883dbc10c9ed8c9c1289b9d18c6797a6bc6a339236177fbc7" + }, + "paels_horn.png": { + "type": "file", + "size": 5595, + "sha256": "9e309e7835c4bbc0abf3c35beeed794ed2dd472e29c8ba5711457aa252a9c1e6" + }, + "paels_legion.png": { + "type": "file", + "size": 7283, + "sha256": "b9e0c47ea23cd97872bb37ee4c9c7ba7f467cdafb6aa44f85a388cc238a6c774" + }, + "paels_tears.png": { + "type": "file", + "size": 7590, + "sha256": "1ef02bf1d1493906aad671da0970bf5d2daaf57ca0c42aee37b8d7a1f574f4a1" + }, + "paels_tooth.png": { + "type": "file", + "size": 5939, + "sha256": "47f5c5912abfec2f964ae98fdbeaac7a4b903362c9f8dde882f9d040d79ba6db" + }, + "paels_wing.png": { + "type": "file", + "size": 7217, + "sha256": "ee8145f3c9e377349f14459c42b49f1fadce6def582e604703cc8dbc762bfd36" + }, + "pandoras_box.png": { + "type": "file", + "size": 8118, + "sha256": "4656f0a580461dce22031a1994d59b032bdfe0d3f43e2d24ad53f1537987409a" + }, + "pantograph.png": { + "type": "file", + "size": 4490, + "sha256": "4e406b47cb55b34e7572096f230839b9f1b791f1f7bf71295d887b7e016e3d44" + }, + "paper_krane.png": { + "type": "file", + "size": 5861, + "sha256": "5374cf7a2721b311fc1582dcf73502f819619bf1610f4fb1b958188404526275" + }, + "paper_phrog.png": { + "type": "file", + "size": 5557, + "sha256": "eb9a5801bf872a7b8842116163eb6ebe44e9a98abadd2e42b232fa2ef03c61d0" + }, + "parrying_shield.png": { + "type": "file", + "size": 8633, + "sha256": "45c8cf452e2564512339a5c94ecfa1f27bd17a5a875d809c1aa259ed8a157e39" + }, + "pear.png": { + "type": "file", + "size": 5863, + "sha256": "7dcb4c0177a984dcf19a819f8cf304fe0e56be3e35fbc277018a4ccad70feb0b" + }, + "pen_nib.png": { + "type": "file", + "size": 4903, + "sha256": "3d11cefb852f19be8cae3aa24db5dfa3d270270eb82e320cc7a9b1936d6b7d05" + }, + "pendulum.png": { + "type": "file", + "size": 8656, + "sha256": "a9cb376378eb23de86a9be9df73f66528b237d7d9aae701a76c0ff0ae4ef2564" + }, + "permafrost.png": { + "type": "file", + "size": 6789, + "sha256": "25811d7ce1a2a56c7d5f98a8bea49e35dece0c1f6c38c4c1a073a0e5357c4b09" + }, + "petrified_toad.png": { + "type": "file", + "size": 8135, + "sha256": "3f710ba8c745013f9f712ad55af4b9c5c351c8045ea368315cc1df0a5c0f5c7a" + }, + "phial_holster.png": { + "type": "file", + "size": 7794, + "sha256": "7312e2100d32a9a0052df63c5e5e1056aa51dacdac8acb5d08127ac0fed45c07" + }, + "philosophers_stone.png": { + "type": "file", + "size": 6650, + "sha256": "0c251db0bf80d64d7f3b9099ec39d449ed5d8708397be442b1283f0ebe244416" + }, + "phylactery_unbound.png": { + "type": "file", + "size": 9269, + "sha256": "513d51bdef728523cf7335ae265219c8830f7fa07db69ac56872c7fb9230992f" + }, + "planisphere.png": { + "type": "file", + "size": 10303, + "sha256": "fe49142f5cf79487f8b408713775917d20710e55230436dd9ad6c9d564dad45b" + }, + "pocketwatch.png": { + "type": "file", + "size": 7534, + "sha256": "b292f3f97e935ca8071b13e4c59c6090fb3041229a9d91aa64b77c9f846674b5" + }, + "pollinous_core.png": { + "type": "file", + "size": 8880, + "sha256": "435fc8143f157f0c51d4af81212e73d5032803a91bcca6b42ff17d350205980f" + }, + "pomander.png": { + "type": "file", + "size": 5863, + "sha256": "45710eb8e65a08ead43c02efdd6cd83a9d3e4235ff2afd61f9c977f35d996d06" + }, + "potion_belt.png": { + "type": "file", + "size": 9220, + "sha256": "b98b1369d0a1709a7e8fde9c4d28e9e582214791645435445e861128702e7b3d" + }, + "power_cell.png": { + "type": "file", + "size": 8248, + "sha256": "287f3ff1f9334f73b9af2019c35aabb6bf2d66ea34485e163116ad8f3701c9df" + }, + "prayer_wheel.png": { + "type": "file", + "size": 6409, + "sha256": "e111b4b3d25ba1eafe68c01cc2c4c16b20ca70534ffb3a1bf6854700d4d5bcee" + }, + "precarious_shears.png": { + "type": "file", + "size": 5004, + "sha256": "781b61147ac56b1ab054c8f1fb6a5384abacd140ba53d2660308c2d17c6bc426" + }, + "precise_scissors.png": { + "type": "file", + "size": 6160, + "sha256": "604dc2cd93bd8fedd3a9064b32968ea5e9c73a5d3bf51d07028c64aa4441a409" + }, + "preserved_fog.png": { + "type": "file", + "size": 8061, + "sha256": "950ed9f7fc1b04960acebe60715513f67a8150f49991f00ab6e37c858d85d844" + }, + "prismatic_gem.png": { + "type": "file", + "size": 7194, + "sha256": "f439c5c6261f1bf158adaa0b9a01ebda0556fb29363f04606b697ea472d4359e" + }, + "pumpkin_candle.png": { + "type": "file", + "size": 7532, + "sha256": "aada5db33a7d8441fe9d5e3fe97c3e82aa4d92fbbdca315074824281dcb237c4" + }, + "punch_dagger.png": { + "type": "file", + "size": 5670, + "sha256": "9e6535fae9245effc72c312fd63c2d6c566991347a5da190167507d4d3521b63" + }, + "radiant_pearl.png": { + "type": "file", + "size": 7698, + "sha256": "87ad86002d70ae312aecb5d803680d24ae2a8cf011675eaaf85feeb1722333f7" + }, + "rainbow_ring.png": { + "type": "file", + "size": 9381, + "sha256": "ec629f835b8d9be5e2b41ec4476cfad14d9ff2b92f495ac93e3a2678dab16645" + }, + "razor_tooth.png": { + "type": "file", + "size": 4581, + "sha256": "7f0e5bce97187c044bb7f7e233901c23c046cbdf3febff8b722018ec78f05270" + }, + "red_mask.png": { + "type": "file", + "size": 6354, + "sha256": "6afb16919fc44eb9bead44cb1ed813c82bb16873e87f1a058d35ae87de8cf00e" + }, + "red_skull.png": { + "type": "file", + "size": 8046, + "sha256": "fedb3718178d41f24dbc32e24c527b861d51b43807e270131f273dd8f442f27a" + }, + "regal_pillow.png": { + "type": "file", + "size": 5706, + "sha256": "3cd134595131aa26fc2b2a79785089f481dc63c63bc128cd513e1bda4ef1689f" + }, + "regalite.png": { + "type": "file", + "size": 9031, + "sha256": "0cfc2a36e8677e1e680d885fb05d1298374ba7545c966ad6af831ca903d5d931" + }, + "reptile_trinket.png": { + "type": "file", + "size": 6845, + "sha256": "3a94643ca2d7830c86b8a19fc12c58f46a0566c8d9e893197e17971b0a978bff" + }, + "ring_of_the_drake.png": { + "type": "file", + "size": 7525, + "sha256": "ff619d5e28f00a35ffbeb3b598d87bdaede48f5469911aaaa9f29a5523c3a84d" + }, + "ring_of_the_snake.png": { + "type": "file", + "size": 9868, + "sha256": "b2461a8881c992f063ffdce770101b61be0c91ac24fa36ffa2337524b0fa9762" + }, + "ringing_triangle.png": { + "type": "file", + "size": 6181, + "sha256": "4194733def390949559d177ab19daa3bcd052880377321cd20623837b5187836" + }, + "ripple_basin.png": { + "type": "file", + "size": 7170, + "sha256": "2d5e3a087c546e74de029535462d29941f0feff4a7c348fde4a69658da239eba" + }, + "royal_poison.png": { + "type": "file", + "size": 9043, + "sha256": "74ce61226a6c807d743af17b5a09489c09635a88d79ee2dd399462623d8bd122" + }, + "royal_stamp.png": { + "type": "file", + "size": 5318, + "sha256": "ec96f594025c723782df21d347a7b8c9125a0e42471207b9d173fc30c35b342c" + }, + "ruined_helmet.png": { + "type": "file", + "size": 6839, + "sha256": "15d7c758a793bb988e1e97fd99a9435b8857ef17bdd07fdb54344f4f66086224" + }, + "runic_capacitor.png": { + "type": "file", + "size": 6900, + "sha256": "83f55c7440ad6cde425c6e0ea57482a49b1c4cb78d943d3922f26c95f8698338" + }, + "runic_pyramid.png": { + "type": "file", + "size": 6485, + "sha256": "c0abe039260e62c4a7f1f488cf99f8dd3df9caae179dd04b3eb362573ec59c9a" + }, + "sai.png": { + "type": "file", + "size": 5600, + "sha256": "af7463a24aedd51cfa3213d3f7ce59fb28742d83df47025173f04d80142c37be" + }, + "sand_castle.png": { + "type": "file", + "size": 7105, + "sha256": "1937e85219a571e04db9637a940f57edcc4adcd8987d10cf5fcfd39a772ec4b9" + }, + "screaming_flagon.png": { + "type": "file", + "size": 7754, + "sha256": "a0b820a01d512032ed2ec1f40a27aa73892c96053555e0d01624482c10b9a136" + }, + "scroll_boxes.png": { + "type": "file", + "size": 8801, + "sha256": "1c99c86c86463c339c689bf2df69beef554774015e274a3a979d91d3d4836686" + }, + "sea_glass.png": { + "type": "file", + "size": 6380, + "sha256": "8897c254dc89b289e6efbda0feb504ab2ed39c7464e273bfd5e6f994743eb5a1" + }, + "seal_of_gold.png": { + "type": "file", + "size": 7204, + "sha256": "0e9a3f4a0450802b2b6fa31e4d05d756348ee2ad7150ef6f80c34ad74f0b899e" + }, + "self_forming_clay.png": { + "type": "file", + "size": 7786, + "sha256": "afcd15a6590618c4c8b151002c7ed0746fd22bc66fe14e398bfca4bb681a9db8" + }, + "sere_talon.png": { + "type": "file", + "size": 7978, + "sha256": "121889753fee3c16691a167d8d4c0ce4f54d8d9fcb5f0222e4279e9390e69ca7" + }, + "shovel.png": { + "type": "file", + "size": 4860, + "sha256": "70bf095834de67ce491794d7863a64557b42bfdb7876a0d3ffe0be0f1a5f8aa5" + }, + "shuriken.png": { + "type": "file", + "size": 5605, + "sha256": "131a83cfe7aefaac27ae58c2b0595fb64e892826595486c39ced3d2f60b82e42" + }, + "signet_ring.png": { + "type": "file", + "size": 6190, + "sha256": "bff8910dd585f12edf8ba6c783561a8ebc38d501c067a0eb481879a00f720bf9" + }, + "silken_tress.png": { + "type": "file", + "size": 6040, + "sha256": "223d0fd4871ede9254f1b7b5dd49f497df7aa40e430a121c43f43323d1659884" + }, + "silver_crucible.png": { + "type": "file", + "size": 9964, + "sha256": "0d01378166aa08ac9b17d9f04c9d9d636256ec674989e25fedce4fa816d09214" + }, + "sling_of_courage.png": { + "type": "file", + "size": 6202, + "sha256": "e4246f601fbe535973c649e8e5dcb12fa5c511dacd58c283ff35a19f58d5dd93" + }, + "small_capsule.png": { + "type": "file", + "size": 7306, + "sha256": "96b79f384a82081396f36c848612fe0e592a2e5939d9d6ddec015b7a0c69b7b3" + }, + "snecko_eye.png": { + "type": "file", + "size": 5651, + "sha256": "700848be9e2cf6d8781f65db21392d242374bd531fd777932bcf0312c45d535b" + }, + "snecko_skull.png": { + "type": "file", + "size": 6524, + "sha256": "03d6d8150dcea2ee9e0cf3c34dd723da9646d287980f5e7d2c2eee1149554d04" + }, + "sozu.png": { + "type": "file", + "size": 5601, + "sha256": "142532dfe95b523c77a9ec9089527737a24bf624b3f965cee88374b5c0f2853e" + }, + "sparkling_rouge.png": { + "type": "file", + "size": 6177, + "sha256": "a2d2f8b06562db10e040974bc6dce74853dc8c3a518069a12802f743f4936a02" + }, + "spiked_gauntlets.png": { + "type": "file", + "size": 8148, + "sha256": "8d0c9f2da2068bc92c4d5f4be1ba40013121ee03aeac0da92716d052dc199e16" + }, + "stone_calendar.png": { + "type": "file", + "size": 7869, + "sha256": "37749a178fe9596b041c350597720764b4309bfe4064a918ce906f121a746cbe" + }, + "stone_cracker.png": { + "type": "file", + "size": 6968, + "sha256": "f1f8fe4fe14ebde969b9822a2b617f2c871f2ac58a659fe0ed06011271a10cec" + }, + "stone_humidifier.png": { + "type": "file", + "size": 9221, + "sha256": "12c28b9a7b65df277dcf39e61c47a72685fcf4bcb5fb4b765290e6e5b3ec7c47" + }, + "storybook.png": { + "type": "file", + "size": 6422, + "sha256": "01b0177a9d4fd2fb28b073f8a6dc525d4b2716691180012d4d0204fdfedf6f27" + }, + "strawberry.png": { + "type": "file", + "size": 10517, + "sha256": "12430e97af90ab910996f47533954c6e86a96830691771dca22f7b239618d163" + }, + "strike_dummy.png": { + "type": "file", + "size": 9102, + "sha256": "3e565da309adbc80b1e1c1c96d4fcf08bc0eb57caca512262048f625181a5627" + }, + "sturdy_clamp.png": { + "type": "file", + "size": 7020, + "sha256": "3b91fcb337fe065a60f11dfd4267a062fcef2817c98c156c4489060d53327391" + }, + "sword_of_jade.png": { + "type": "file", + "size": 6455, + "sha256": "b4a437a54bdb424a629cefd3a436a86443d134205339fc563a32db8e40d8fc1c" + }, + "sword_of_stone.png": { + "type": "file", + "size": 6107, + "sha256": "1e7d914b756161c323d2e6fec4641c7004b05d09f3ac60d626e5263debb09d4e" + }, + "symbiotic_virus.png": { + "type": "file", + "size": 7675, + "sha256": "e09c87d40b66f5379c595ee63805605d8bba9cc16234fbcf103b6e670d0c0241" + }, + "tanxs_whistle.png": { + "type": "file", + "size": 6009, + "sha256": "9f2ff889ec077848956d9908abd6103d7ef520b7d63b1dd9cf29d2c754a2339c" + }, + "tea_of_discourtesy.png": { + "type": "file", + "size": 6749, + "sha256": "a7621412f650b2ec044d15f087a3cb8c3f68366815b69461d34fad5d36224c49" + }, + "the_abacus.png": { + "type": "file", + "size": 7153, + "sha256": "bf1b372a7aca12a44b83edf76f0447d81f60377a2cd624f1a66aaf7b41ac8017" + }, + "the_boot.png": { + "type": "file", + "size": 7400, + "sha256": "5d62f1b57bb13482cbce1c105eb06261ab2b10cf896dc23b895188a287cc304c" + }, + "the_courier.png": { + "type": "file", + "size": 8351, + "sha256": "a22c348dcc4070dcf46095bdf2dec57aeecf4b20b72843788027f9873f8b9edd" + }, + "throwing_axe.png": { + "type": "file", + "size": 5003, + "sha256": "2cb0edd32ef0eebd475762b25c6bdbe74ad825514c58e2fe3e52a86bd188b891" + }, + "tingsha.png": { + "type": "file", + "size": 6163, + "sha256": "882d24515e2ac5fab5bca8b38890f0064d28f40cebf355d827107d31e1fbbdbf" + }, + "tiny_mailbox.png": { + "type": "file", + "size": 7945, + "sha256": "8f0552d98a3aa08e8f06d50a3fcc06781bcf4c231624cf80e70e02598e8e4c9e" + }, + "toasty_mittens.png": { + "type": "file", + "size": 7792, + "sha256": "301583435ebba4d4cb6606ac145ed3c1cd6f6ccc67fa9345e131012ecb4a10e3" + }, + "toolbox.png": { + "type": "file", + "size": 6117, + "sha256": "6232998b86233f3bf727e5fe3c227703c59f085b22fde51a1348ad0cf7436a72" + }, + "touch_of_orobas.png": { + "type": "file", + "size": 6276, + "sha256": "bc2d7dd2acd4db7cfbb857c3e6063b6d5ad68aa7a5dabe1d0af5ad5f02315540" + }, + "tough_bandages.png": { + "type": "file", + "size": 7351, + "sha256": "c08ebac638023f8a2dea12354c4f6496d7d2165a5e8e00f6124675f00ba856b7" + }, + "toxic_egg.png": { + "type": "file", + "size": 8054, + "sha256": "4fc4a9b774435adcfed8bb4ab2a07d20d3f897ef752c2ee96bc798ec23bc382b" + }, + "toy_box.png": { + "type": "file", + "size": 8576, + "sha256": "2392c41c607bf122ae7f7c0ce3f1bd809d3c469a346b5ea42f8aaf2d047a20e4" + }, + "tri_boomerang.png": { + "type": "file", + "size": 5666, + "sha256": "97a815de7a64e476b2ce21d6158ae336e1f186883898ff54463cea40d8721da9" + }, + "tungsten_rod.png": { + "type": "file", + "size": 5669, + "sha256": "40dc76faa4b6417856bf79eef32a03ad9e6905f6c6c57d20a2a71aa15c4561e3" + }, + "tuning_fork.png": { + "type": "file", + "size": 3921, + "sha256": "d498651f83436f02ecfd39eae2e281a64efad02fcecd21b83e478fb234640f3f" + }, + "twisted_funnel.png": { + "type": "file", + "size": 6585, + "sha256": "de7a9f6e7c263d70108a6bf1dd91c05ff06c7654f0de725462384135eacb4909" + }, + "unceasing_top.png": { + "type": "file", + "size": 9092, + "sha256": "563577e7410c6a0989ca9251bbc87a9746543f5d94fed3ab18de9b70b311651d" + }, + "undying_sigil.png": { + "type": "file", + "size": 9913, + "sha256": "336e379d9752975c89a3ee1fe9b503ee51f827f5ffe63c8e1956af995726ed09" + }, + "unsettling_lamp.png": { + "type": "file", + "size": 7484, + "sha256": "77a0a60f0db83cac36fadde9c7c1821cf38cf7072d275016e256c638a08b1575" + }, + "vajra.png": { + "type": "file", + "size": 5852, + "sha256": "ab2e88abaebcbb8f887fa5a19f3de272a09ef4d36a2580c3abe68fd5b1d327bc" + }, + "vambrace.png": { + "type": "file", + "size": 6282, + "sha256": "34e6d6269993431d779bdda9ee35fb6bda4c3dd0cf353d2117803beb78d1ecfe" + }, + "velvet_choker.png": { + "type": "file", + "size": 5199, + "sha256": "554328275385d693c2ee7caad0a99738b80df33f1762317d949f15165e5aab76" + }, + "venerable_tea_set.png": { + "type": "file", + "size": 8208, + "sha256": "4c2da5de5cea18897894c6fb909b04b7cdd60952d26ac157f72139ab94f299fe" + }, + "very_hot_cocoa.png": { + "type": "file", + "size": 7690, + "sha256": "4287fd7f352cacc5e307bc1cd7aca857907b5fc105d0748878e5a1b0f1f06208" + }, + "vexing_puzzlebox.png": { + "type": "file", + "size": 10329, + "sha256": "b6f299173d9019f5d0d267756b36b9f919a4eb0cd9a33f39fcc1f35547fe347e" + }, + "vitruvian_minion.png": { + "type": "file", + "size": 9816, + "sha256": "572f81d8d9b564e10c5e2b8495447204899232da29da1911fc1216c15873b587" + }, + "war_hammer.png": { + "type": "file", + "size": 5349, + "sha256": "e3208cc788cb12c6df02c57f40da9c1b5d77c4b35c8e1e2a1a28c8676d57822f" + }, + "war_paint.png": { + "type": "file", + "size": 7563, + "sha256": "42664bbb0152f980a8ff6189ff81936f99efc0351a9325fd34699a4fa119d89d" + }, + "whetstone.png": { + "type": "file", + "size": 7143, + "sha256": "6d19f8f00e73363d37a989170dda8af5c0c5a5d038e781690fe02d1f014788c2" + }, + "whispering_earring.png": { + "type": "file", + "size": 7993, + "sha256": "ad8f180c8cb5aa50f7d63aae1078516d37db39b2a8b611e1034bfde81c99e17c" + }, + "white_beast_statue.png": { + "type": "file", + "size": 7638, + "sha256": "1db528a8dba724edfa894c358018b02a00f42eaf9ff4c8ca54099d06d6add29e" + }, + "white_star.png": { + "type": "file", + "size": 4939, + "sha256": "52a6c1afaeed4d3fa03be37647e21cb17f1a33b7785409db5ec232c0c43235ad" + }, + "wing_charm.png": { + "type": "file", + "size": 7790, + "sha256": "d9908d450ffa80c1b98839fe6125ef40dd24ac35f00848b6bfd7ae06cefe6417" + }, + "winged_boots.png": { + "type": "file", + "size": 6578, + "sha256": "15cae5e9b75b4f510c09301e4cdda108f65e8522d13cf03fecbd96ba9861d343" + }, + "wongo_customer_appreciation_badge.png": { + "type": "file", + "size": 6031, + "sha256": "a64191f055a1b8ca08834420298e48d00202cacb1e84f3822d7f2ed0c41961fb" + }, + "wongos_mystery_ticket.png": { + "type": "file", + "size": 5807, + "sha256": "c57c94f6124b6c3b770d470f0ffa796f2fc43d532d19020c65527242e69200eb" + }, + "yummy_cookie.png": { + "type": "file", + "size": 8499, + "sha256": "0802618198a3f3f6d6c71cd52290996706d5e5a2c6119dc5c3207529fd4b9cb0" + } + } } } }, @@ -3801,73 +6826,73 @@ "children": { "battle-director.js": { "type": "file", - "size": 12944, - "sha256": "ba3adfa4793a1ef3e2da9959a39fad62789fcd6f41b84e9e342c81ff88edbbff" + "size": 13125, + "sha256": "a82a031a5d92f4e734625a40793db883ef96bd4c9b56bfef5bc56f2b982e4aea" }, "battle-flow.js": { "type": "file", - "size": 5801, - "sha256": "9ceffe9539c1d303f75eb23e4512554c174e602f85f53e9f9a37e2fb1afe7bb1" + "size": 7910, + "sha256": "4cf8bf588e9a1d30c481fefd1e609b084a19dc658371af9ee9b516ff3c8b62bf" }, "battle-loop.js": { "type": "file", - "size": 3565, - "sha256": "0af53c3d317fe9816594c2786bf5a1bfa960babf0c135b9b4d524794730efbcf" + "size": 3652, + "sha256": "8ff23c71320c91cee2955cabfd8384190a07b80cbddd44bba50fcf9fef4daeb0" }, "battle-resources.js": { "type": "file", - "size": 3040, - "sha256": "6e29789023111c4f7b91a11d7169069cc6b9d0087a3451d526233fcf03f389a2" + "size": 3236, + "sha256": "a4584c4560ffd12fca2f2a540e94d7e211d7a68d1d0b498177a730f32cc2e764" }, "battle-session.js": { "type": "file", - "size": 5455, - "sha256": "5e50205af67054761876aa37fbd02ebefc3225f8d1a90afcd708c215ae8e5518" + "size": 6334, + "sha256": "e96d40a1c5fd4f4afe8046a412e78712e9df10fe00bbc6d858575e5a9b6a1102" }, "battle-settlement.js": { "type": "file", - "size": 11994, - "sha256": "be8ef59f8dba0c9cd1f3032ea1de1615058476d1a591c1858b4fa180a13ee578" + "size": 14376, + "sha256": "99f0a69aba0489f7a91954b95cd00d5856282779bb7e2ae91182bdbb89a8c63a" }, "camps.js": { "type": "file", - "size": 2386, - "sha256": "51ee6d2aa78261bd60b2ffa2662b7a37e62b516c379b8cedd46ecf0466630278" + "size": 2440, + "sha256": "0907129c78d843f02762b3ec4aa3b25542f605aaf73e61fcb417e46bd731c021" }, "combat-rules.js": { "type": "file", - "size": 5966, - "sha256": "e540dc2e2eb83ac20868252cef73373d6c807455d57f220949aafd1f762e3828" + "size": 6298, + "sha256": "807cdb1629c19890b67dcea112da9e2495b47926f5de7e37a182840cce179374" }, "death-blow.js": { "type": "file", - "size": 1113, - "sha256": "d0222776b90acacd2fc672559bf59d8c0376cfae68294d5a9603551ed182a0c1" + "size": 1151, + "sha256": "aa3ba0da315ae81ae8430c50a57203889838adac8d533aa5400a4bb9976becf5" }, "engine-session.js": { "type": "file", - "size": 3680, - "sha256": "6aaad4dd6641caea0c0e02028239e355a7b83c3d53b64f704989b56376855750" + "size": 3763, + "sha256": "1addfa8f6a6e1e56d2dd32b6d1249ef84aa0aaa1ca049a7e0ccb688be51261bb" }, "intent-damage.js": { "type": "file", - "size": 1266, - "sha256": "c0efe2d26f5ee76f090c5ef04b8607def99ad1a3315dedd5c2b8e42aff218a7d" + "size": 1298, + "sha256": "616a18728b31677b70cc14b88af027c4cc912ae90f11de41355b900ed2c29ea1" }, "intent-effects.js": { "type": "file", - "size": 2311, - "sha256": "5fc1c57b88c996b9ba1ff27d220749001acecea028950479c5fc4bf26b854fe9" + "size": 2359, + "sha256": "0b38b5b5eef925910200749c325c34a1cd4b4aa7cbacd44b63a2c31551f2a21d" }, "skill-teardown.js": { "type": "file", - "size": 6702, - "sha256": "49116eed862780a17c9d67182b103bceec3b28621355e16f7351b36520896320" + "size": 6849, + "sha256": "5f92d02d245aa3021ea47b245b221c58987b1e5770fe4329eef6ae733b0810ff" }, "stun-intent.js": { "type": "file", - "size": 1295, - "sha256": "3a73747311bbae29cd03a3327f0ff398aa085f2d2e480d4013f2f8f15d09f810" + "size": 1340, + "sha256": "898f9e64b80c5a963229eed340455f810eec2c1777bb98ba599d56101ba11bf7" } } }, @@ -3876,23 +6901,23 @@ "children": { "battle.js": { "type": "file", - "size": 1729, - "sha256": "702bf42803374567630ebfc87515d14e6e7a8c3e33b49f16bdc98ac5e1954451" + "size": 1771, + "sha256": "bdb4d429b14b98d7d5434afb2d11039938b7eaea37cf5f87a3fba86fc958b254" }, "definitions.js": { "type": "file", - "size": 2464, - "sha256": "2ff3db8f5db20416f218b184ad980b9adc93d82197a6f296726e0c76a49e2abe" + "size": 2527, + "sha256": "a736afb0c27d30d68290b952d41e304241e2ea6401fa19c6399e49309e958ac0" }, "intents.js": { "type": "file", - "size": 2888, - "sha256": "514212bec0e6b523a0eea5857212d3369da4eef84cf812866baf5e9a4f3407fc" + "size": 2952, + "sha256": "935f5f1ec90ba7e0cd0539db9c51ad5ba11e9063bbbd060a56f4ef6c34bfe00d" }, "state.js": { "type": "file", - "size": 4372, - "sha256": "8117b0a9c4b9c56ffa7ce8b367ffc89dd69ddacc19f93114c8fedb894cb8f33c" + "size": 4484, + "sha256": "45c7c4c09865c335bb2e181c5bd5fcffc20a55a5d5e57e8e36b88977d7329da2" } } }, @@ -3901,108 +6926,108 @@ "children": { "affixes.js": { "type": "file", - "size": 1114, - "sha256": "6f5a0975192aa3b159c3c6886a0214fd101869fccd866d2de831afc56f3fcb72" + "size": 1124, + "sha256": "f65993cabf6fe9b01e9a41de4ff0d47aba56eb67cd9e00d4a67cd87d9ed9bce8" }, "battle-card-copy.js": { "type": "file", - "size": 1737, - "sha256": "acffc9c0ecc7d22985f894522376e13d39067e71cf1532f2a2cd8d9466671fdf" + "size": 1766, + "sha256": "1cd2344a1d56da56b07a7968989fc3216346a89370b832ed1f869d0494f7148b" }, "battle-card-reclaim.js": { "type": "file", - "size": 1522, - "sha256": "c38d2f86719d682027be75e8a30639cabeb1cf4d7db87aef2304327181161fe8" + "size": 1551, + "sha256": "397a0c05591122d91bed20499cdd0b55f3fddcdaa6a2d6cf8d7f4434c1306feb" }, "battle-energy.js": { "type": "file", - "size": 1469, - "sha256": "dc1e4e9c215a5c3c3a93c6637c72dfd54e622688a243618a4cfafdbf77130af9" + "size": 1502, + "sha256": "cee19be46c41d274bf706c2add12f64834980ddb32526862e78de37bda28caef" }, "block-draw.js": { "type": "file", - "size": 1178, - "sha256": "fb93243cd983e35e4aaf95fd4f4ea9012cdb62c62ca0d080703918f5364dc5fa" + "size": 1197, + "sha256": "4770aa0a753b80d103e3c087bbe2046609e99a05dcbc5c388526ba87c554b7ce" }, "card-data.js": { "type": "file", - "size": 3405, - "sha256": "a943104aa2e0115b21a40ff03cd46533680bfa4d088e8906f54bc1ec99c798d0" + "size": 3552, + "sha256": "09dedace9b70c432f2b189a7d8fed149afde0d15d515c02c417343260c19b3ea" }, "card-definitions.js": { "type": "file", - "size": 3006, - "sha256": "b824439eb6808642fa55a81779f5b990e52382c85c9f256a6346f3e21331b9d0" + "size": 3053, + "sha256": "35c22815c71c0a5612537923b336637fd9e2e8a2aa506e1dae739eefbd0d0cc7" }, "card-pools.js": { "type": "file", - "size": 628, - "sha256": "1830028ecefe5dedf09f27358d9235a91d6282dbdea46d410a48315afbc3b118" + "size": 637, + "sha256": "c84c2c89de978d7f03dc2281da48c15728a977e64287ebe5d288ed6f39c217f7" }, "classification-types.js": { "type": "file", - "size": 515, - "sha256": "10813deaaf218c68512e44da8eac9a83717b8b942a48df498cfae570c9f939f4" + "size": 524, + "sha256": "75084272278f6d8596139657a8f9af9e7398e3b4ebdcf0ba753ecf9e00a6ae48" }, "description.js": { "type": "file", - "size": 524, - "sha256": "a37daf0e29fb05f8248ff3b9c9777e68e2dab6e7cf86a3c53510e099a1e10d1d" + "size": 532, + "sha256": "d938cc736a95a6bddf14df52165a9bda775bd845b958687bced06ba0254464a6" }, "hand-exhaust.js": { "type": "file", - "size": 2627, - "sha256": "36c64653a3646921f511d2721df69f7c75e6a38a11abaa5e2b09280aa0d38b98" + "size": 2673, + "sha256": "904bd21885750bcb5cabee5478d74a9f5e61651d2b9aeaff1f7b41559f1665e6" }, "hand-upgrade.js": { "type": "file", - "size": 4359, - "sha256": "599859fc9a5283655778816847d2edff52c787b47b41f1e5e6fc6ac2160caed7" + "size": 4446, + "sha256": "206e2a5d5ec96a8bc012a0ddc87e6388d7c0a7d93dfb9f8ebe3574156b6433a1" }, "havoc-play.js": { "type": "file", - "size": 1885, - "sha256": "60292a9bf9fef09c4fbb3cbc5ac4e87267f1b0a01650f4ddd2a23d4f65e33bb0" + "size": 1921, + "sha256": "dad0d45cbbd0a8f13a9aa0c238d14b3c6e7553eb3795e3291e2c53d5b69bd7d0" }, "infection-card.js": { "type": "file", - "size": 3056, - "sha256": "f39708a57dffe6ec86e176e4d3572fed9bad60350a83fadaf21d75e8d7f817f1" + "size": 3112, + "sha256": "831ae4c7c9e8497fd1255062894bb1b65169c0e6f7fb85a8b500a86115806fbc" }, "intrinsic-affixes.js": { "type": "file", - "size": 819, - "sha256": "67630d860ce74ceb9ba9fb40e8f7a4b13dcf55c83277653392d23b5f0ea9c0e1" + "size": 831, + "sha256": "4743f5ab95c32faf0eea70074b30f841bfe67f760a3f29d602aeb81cc1b21bbf" }, "ironclad-advanced-data.js": { "type": "file", - "size": 126, - "sha256": "e18fd3b159e910a02d26d4d0a9ea3d630b51fd71f734fb183b5542f6f777713b" + "size": 128, + "sha256": "3aa955dc4be0e89f14a434570775e09a738d51965dd5c3eb0fd38f7ebde01cab" }, "ironclad-data.js": { "type": "file", - "size": 117, - "sha256": "8a90e36e9375661d1e9273da6fbfea3c6ef1be8e0772c2d5899b518d1d127390" + "size": 119, + "sha256": "c8271851ec177ea62ce9f1076764540e988e733502a139cccc4a0ec85e7f5228" }, "ironclad-hooks.js": { "type": "file", - "size": 2240, - "sha256": "32eb74642d081bebd6e38b8e43c9fd8448163a4c93c1322c83e26798b3e556b7" + "size": 2362, + "sha256": "4e30d3cf8c57dc506020ecf7ff494000b090946aaf8a4886a77fbfbb77eba9fd" }, "ironclad.js": { "type": "file", - "size": 120, - "sha256": "5317a2bf599d8a7fabcf19dfa4f76284cbe6b7f43ec5a3f8c607ab9e69d9f61d" + "size": 122, + "sha256": "f49c6652f9a7eecb9343ad6c3425f68c27a64a90f7f18fb779f3f140704c2a7a" }, "life-loss-block.js": { "type": "file", - "size": 1177, - "sha256": "718254e938a08be9e4fa036698fe5c33ac98c842722e1edebf7bb9906922f64b" + "size": 1201, + "sha256": "a7d7fe06674a80fee348d543a4da7f1d9354edfe4869d7f43e40ed1d2f8ae5d9" }, "mode-cards.js": { "type": "file", - "size": 7770, - "sha256": "4a8f9d61ba438ea3ba2e857f0b81bd85bee2ffc1c9bd0bcbd18dbdeac36aec8f" + "size": 7899, + "sha256": "181a6b95d5f8080cd9ab10898713b27776c613fee965c9ec013594a9436eeaf6" }, "packs": { "type": "directory", @@ -4012,18 +7037,18 @@ "children": { "data.js": { "type": "file", - "size": 30960, - "sha256": "6d4b62e53fcbd2a509d335670a07a75b5dce1268bc146f27a10113c68b86e0a5" + "size": 32174, + "sha256": "4ba74b97668b97b99099efd19fdba2e81da02e2ab3764b332fc71cbd135b87cd" }, "index.js": { "type": "file", - "size": 382, - "sha256": "b106052a24fc47b10472b907c69036e341a90a5945d32e140d67dc2c030a5f92" + "size": 390, + "sha256": "b30d7ee8786f9f8cedade070c77f34fd2e4d2a3948d92ee211787cccc29ca247" }, "rewards.js": { "type": "file", - "size": 613, - "sha256": "af212d7c4cd8f63c5837e8f29519cd341b775135fa332f8a0f4f82eae4ac349d" + "size": 621, + "sha256": "9b7e679b4f6ea3e6fe70671986cef7328d2dcf033f7620a5e2e06a47a9d9f5ac" } } }, @@ -4032,103 +7057,103 @@ "children": { "data.js": { "type": "file", - "size": 6436, - "sha256": "a85d48996fe637e1bb8b976d370e4fb49d1a2bb1e1dd6e9befc1ff6fa1827d9d" + "size": 6704, + "sha256": "35d43aa2ada598257fe0d0c18f5ea746d67429c0d9a3d73b145dedb363fe50df" } } }, "data.js": { "type": "file", - "size": 902, - "sha256": "4f04d425ba55670fe5707ef189dd3b74fa9934117fc5929c0f1b9b67c874863b" + "size": 912, + "sha256": "11f10ede8a027567855b31d72e562f9851b2b7ffe96f57525268fdabac3e4145" }, "event": { "type": "directory", "children": { "data.js": { "type": "file", - "size": 14249, - "sha256": "b195639153c1cb6a3ac48d5af364c9a915a34e96d844ec4e4848d914e5896017" + "size": 14820, + "sha256": "0badede4d570d625e371f3e06750d708c381f2eff3f14e54f1a803690f28c1c9" } } }, "index.js": { "type": "file", - "size": 1109, - "sha256": "0711819c90af702cc98fc189c710bd278a9aa66022f04a3566ab18509b92af53" + "size": 1128, + "sha256": "3a19244866f80379cfb9314dd599a67fed4adc305ed23c5393c6f09366075147" }, "liubei": { "type": "directory", "children": { "advanced-data.js": { "type": "file", - "size": 2842, - "sha256": "af05e8f5ffe996f11f1383023557f00d60eaccadc534a8fa8df3f9b57fc6b036" + "size": 2877, + "sha256": "7f9b1b67d987d15030a522d4899e29d39bbd2166866b29e1794119ef9fc2d1d6" }, "advanced.js": { "type": "file", - "size": 31216, - "sha256": "736ea6b7c45650fa4219c4dcafdcc61886c743f065469b22ad972728e7552595" + "size": 31697, + "sha256": "6230a44ecc67c3f04a62a00d921b690e9fab7651da52f747706ae2d884bce21d" }, "data.js": { "type": "file", - "size": 4464, - "sha256": "8e8f9ce7f3a5867c848e54133a726007af2a534106ba9749ade0f8a86ad73bee" + "size": 4516, + "sha256": "7103bf64a2c338137a5b470127a7220664a802a39de40d562c24cb2660f0c048" }, "index.js": { "type": "file", - "size": 610, - "sha256": "49cd27d3341c93774bcaa05f1233d358962cdc3482c6dcfccb6d480cc5240dbb" + "size": 625, + "sha256": "18d0eaf53ca7117560f3987d5ca6911f2486bd27a9b40fbd2a345a9eebccef50" }, "legacy.js": { "type": "file", - "size": 55175, - "sha256": "32776f897128bfa7ab2e6dad1cbab4c09901fd0c093da599da7161fe5dca16ff" + "size": 56085, + "sha256": "8fd3885129b5221e93f3634c0c1094b01f8525124b1c0b6c2ff32c585aa3985c" }, "metadata.js": { "type": "file", - "size": 5618, - "sha256": "9b5dbdd73c6f901f1f005baecd1f70cf81997ca9cf0897e7309f5c5a73eb77cc" + "size": 5758, + "sha256": "5217360a7b5c6cb90974b7d05714c6cafb33273536978818dbbbb000d1ecf671" }, "names.js": { "type": "file", - "size": 816, - "sha256": "d40ce599c1a9c21903ff6889ffb3f9d682d48eb269797ee960db9084d93905f9" + "size": 828, + "sha256": "8fc0b29eca5a85a679275130be644c972b1efc4c3b47401d7c341669ffee9758" }, "rewards.js": { "type": "file", - "size": 12445, - "sha256": "5deddf3784b4e7ae8a757d4ff06481d0f32f1f31fed86b939cc1f9184e462396" + "size": 12516, + "sha256": "82d030a3dc79b684bedd6716b7497971c8d12809abe1de2c0d548656ca3ff2f7" }, "runtime.js": { "type": "file", - "size": 21392, - "sha256": "ca6d9887fb9f8978c34ade455f564b3a0a52eceb5b844447e863390acdb3bed9" + "size": 21712, + "sha256": "a1526d9fccbc0f8b42512ae464669c2d93e207cd9beab284f416582e0b5d3107" }, "traits.js": { "type": "file", - "size": 8178, - "sha256": "bd813bd37feec90300edd14d3d23fcca301d75ff32fca096555e3bbc35bd162d" + "size": 8277, + "sha256": "38e1b081a3789f3760c4a0889b34803667006b326dce1f8e2aa2c862d997a549" } } }, "rewards.js": { "type": "file", - "size": 327, - "sha256": "e7f15d41aa526c6b6ba93b137dd2e31f63fbace91d1bf8c3f8dbdd0fa6ac3176" + "size": 331, + "sha256": "34c6df282cb63a47d5f933543e567d4232e3326d1b662440bc7a7417452149e7" }, "shared": { "type": "directory", "children": { "data.js": { "type": "file", - "size": 399, - "sha256": "ec004403090107d462d6948751154b03ad6f88a16ac6a844d1898f79e6184386" + "size": 405, + "sha256": "93244ab064a100fa9a93f0cb19acc1d22b6ce17036b2f5cc71fd4f1db42f8497" }, "runtime.js": { "type": "file", - "size": 41670, - "sha256": "f1f6541bae4da3d38911e62f51fc930270c16b5a1b2c3a4348c0712925396a7d" + "size": 42402, + "sha256": "b8b8eb4a0a921c4480ba25d42cdbb8766780e87ea7b468b8dd5209ca63c8a644" } } }, @@ -4137,8 +7162,8 @@ "children": { "data.js": { "type": "file", - "size": 4334, - "sha256": "7ca46d39b6f3cf99189d86811a4d618dc759117c66e796a3e00ec70621765dc2" + "size": 4513, + "sha256": "16de512e265f4062ed9fa077d655a416147308b72d0893348c0ad8c27f5b89b3" } } } @@ -4146,100 +7171,100 @@ }, "personal-piles.js": { "type": "file", - "size": 23856, - "sha256": "c02754f949c5853dbabb7e2df42189f82f994d6cc6fb3cdab57a3df784d0f03b" + "size": 24412, + "sha256": "ef9201fdb55dadbcb3a2c518a283f0d9af881aca47500414c710b4ce431f2e74" }, "rampage.js": { "type": "file", - "size": 5265, - "sha256": "7563d2316cece8ab1d9b04de28b47e4562b82ad8a6dd493e1c7f64e726a6a94c" + "size": 5369, + "sha256": "dcb64aebece3213651ed6f100e0b9928f5ee9d5ad08386295cc1b623f8b7c7a9" }, "random-hand-exhaust.js": { "type": "file", - "size": 1274, - "sha256": "7729cee9b27b696012e6ebf5287fa828e7fa6faf5a68a963a5529e2e9ee2fae6" + "size": 1293, + "sha256": "486758ef934e381bd825a46b07e140f5f28e08eceadba25dd9f107ffefe80372" }, "rarity-data.js": { "type": "file", - "size": 440, - "sha256": "ab3858d78537599e2b108e321e9e92dff7b414d8fb94ae472f55a7b0a54d3ec7" + "size": 447, + "sha256": "331af3a3a79affd7725e12391df4ef16d5e6a97f7235a9aec62d7085c4fd67e5" }, "rarity.js": { "type": "file", - "size": 3011, - "sha256": "2e2df62319ba5a95d76abc2a1864febe162809f07478103da26925d593c55224" + "size": 3062, + "sha256": "8490cff30bf06d32cf045f7f478ab64baafe6bfc414159d534d2431e4483f1db" }, "retired-cards.js": { "type": "file", - "size": 1575, - "sha256": "ce2f18876f10dbc685a712c990a289731fcff3f2e02256363f9476c68b7bfb2d" + "size": 1606, + "sha256": "7ab267d2c50f20c86c4b4e43088a37fa5a081b331725bade23030385765c317e" }, "shared-battle-end.js": { "type": "file", - "size": 946, - "sha256": "424b1e24bd19ebaee6a890521bdc4e30ecb26e7145581311208b1d9375b972f9" + "size": 962, + "sha256": "42413c067c71f2b891555d6d3e2f6e3ca7f267491db199dded8ff4807ffefe53" }, "shared-hooks.js": { "type": "file", - "size": 823, - "sha256": "bcd757ce6c1ea9c4f56ccfcfcec7adc7b8184c9e4567f0f4b4519a8a867cd7a0" + "size": 836, + "sha256": "58aff21c1ebeabf58ec4ccbf40df423a035c1f9749c91c73cb7c79173b5fc430" }, "slimed-card.js": { "type": "file", - "size": 1037, - "sha256": "e3cb9102bc28bbbd561f546dfe9cd6832a69e2336e9d989b1ad8d3636bf5e64e" + "size": 1056, + "sha256": "50b5ed27eb89c36256fcb3cabe05bdee18bfce644c46e77c917f72a8c1f21ad9" }, "spite.js": { "type": "file", - "size": 1832, - "sha256": "6cef9cd617cfce569238dbc90db242140724a4da3e4963581649cd1848e15d90" + "size": 1866, + "sha256": "64e7a8c41c707b821233889b180dde8ca213997db8bb757d3909a844ab4b784b" }, "starting-deck.js": { "type": "file", - "size": 1638, - "sha256": "44b221d309a96884a51f9ed402b4625200e61ab3c2af79db450102ad0813a37b" + "size": 1671, + "sha256": "ef196c61a7466e2c3b0e8a634ab9cb3351301c810b96004be4aa9aa3e4e888f0" }, "status-cards.js": { "type": "file", - "size": 746, - "sha256": "a2c623938bd4d9264c605899bb94cb6599bfcd962ebb5c06a59cb084236ab325" + "size": 760, + "sha256": "cf515ff35b0668c9b8bff7aafa406fbd41c4ee31313a1393595b2b2ec866a83f" }, "strike-counter.js": { "type": "file", - "size": 1503, - "sha256": "a1058fe9ec2f8d3bf21eae61326cc74435bce25a49a67ba024f0c516065a4e89" + "size": 1534, + "sha256": "a3de2b465d19a2f14de20ad51e915b4e3459def64fb355627ed2791865a83af6" }, "temporary-strength.js": { "type": "file", - "size": 3689, - "sha256": "f9720c6896583b3a7d682949945414ef6b6c1d17a906cfa6c8968c3bf5e455fa" + "size": 3764, + "sha256": "5b843d1f9367108e190a4170644c644f83e113d728ada4fb7d2a997f12ea2fc7" }, "upgrades.js": { "type": "file", - "size": 1892, - "sha256": "78f37bd5da682b3a1a3b679df25c026f256adeb5ccc48f6caa0be5d58bdb7529" + "size": 1940, + "sha256": "6517a6ce69f1723aa67a20950880d59c9f57e46f471f88919a867ffde3e213fb" }, "whirlwind.js": { "type": "file", - "size": 1581, - "sha256": "a62955b5d5291bc887e7c36b808cecbd189d1eb1506cd67873e7298f9369bf9d" + "size": 1609, + "sha256": "1c155c4c3e351235bcbb6b3aafbeeef8d5ab4672b8bd2ccbe61bba580ebccfa0" }, "wither-card.js": { "type": "file", - "size": 869, - "sha256": "8e4cac00e3196c1a4315c36c63e6a0ce36621e7fc2f73e44fa811a424254d17c" + "size": 884, + "sha256": "24831da555d8d0dcfdb5f61337b378628edd8d872b59a482f3670af956d232b5" }, "wound-card.js": { "type": "file", - "size": 1891, - "sha256": "2ac15f4252546c183b3de546bd6134a75f8b42ea67632f0d57b8fbd35a8796ea" + "size": 1928, + "sha256": "289c0f38f197a3f9e570ffdc908b69da6a57eba7e1097b509ce6203287cf2e7b" } } }, "config.js": { "type": "file", - "size": 847, - "sha256": "738e1aa69e580ea2540827248cfb551a99da7d8096184e089705a90242662031" + "size": 877, + "sha256": "56d31b1dadbcf7b20f4ff1f065334601fc1fd35ebd8fa2ca92a1334bc8416c67" }, "content": { "type": "directory", @@ -4252,56 +7277,56 @@ "children": { "encounters.js": { "type": "file", - "size": 3800, - "sha256": "62d9a8fd585cfbcc7cc5ad2916d1e5b30d42834e1f89167b7f670b36dcde54db" + "size": 3866, + "sha256": "f610f8780c83e606dff8ab2195e2cf48942f52f242887f2b9d06d8dc05aa9a6b" }, "index.js": { "type": "file", - "size": 464, - "sha256": "b9d3989f85ad8893c755d7364a35488a4c170dba9c09aac2e7e3c7c70553d580" + "size": 480, + "sha256": "b64978cde557ae78a31da5472d39a70cba0527042542bae091568ca1fe1c1caf" }, "inklet-group.js": { "type": "file", - "size": 516, - "sha256": "bbc6ef9d321b8d04431acd03b2648fc71bb3cb4d892e695b6ac41d667d2ae22a" + "size": 528, + "sha256": "d51ab57e50cb1c1eca528fb62fc7177645bcc204ad2919c98187362c58e70a1d" }, "kin-group.js": { "type": "file", - "size": 776, - "sha256": "82e43fbd9e9ad997cf07cf5c633ae63f1fe7564156e0ab9429e6c2c713689e23" + "size": 786, + "sha256": "d03bd12b44062e49aac3585ac07230c586870718193d03a2778ed71fe504f03b" }, "map.js": { "type": "file", - "size": 1761, - "sha256": "cdc3ef153ccde6acac639c1ebc16383fe16e8ffd52935f915b80f27c95ecbb2d" + "size": 1804, + "sha256": "d809e8559b3d8ecb419424c39dc54858ba9ca8c94d9c90e2367a6700696bbadd" }, "nibbit-pair.js": { "type": "file", - "size": 475, - "sha256": "e339e7d91ea24a86b409b89d05a9d6c6846023de343f951f840f68c3baab4a30" + "size": 483, + "sha256": "a380cad41acfb235c276406ae9827858e68e459e422da9c7211c1fb71ea9de40" }, "raider-trio.js": { "type": "file", - "size": 1595, - "sha256": "a18f6bc3b1074bdfda23a8ea7887e4fd581a88698045f49e2ea94a6b989ea412" + "size": 1627, + "sha256": "7b5d6686573886b3d620d5c5f9866745aba6320c63e7c91e478b81c4bc540a72" }, "rewards.js": { "type": "file", - "size": 772, - "sha256": "8a6f09e56748957693bfcf7a428670a3fbcfde90c746278e8fa372a51a32d3cf" + "size": 797, + "sha256": "dc9c450a77abe5cd35c4ab46dc8833e49287a9d63fa773bb0da1fd64525eb77a" }, "stories": { "type": "directory", "children": { "forest-ambush.js": { "type": "file", - "size": 5225, - "sha256": "de94b30bafc2e4251a6a70ecaf4b1ceaf300cc2750f71d30014971e1c389b240" + "size": 5339, + "sha256": "ddc43ce1f857082fe1c90db65a1625ff585d8f2cfc23f78b375c18bbec6f3fc2" }, "liubei-opening.js": { "type": "file", - "size": 5658, - "sha256": "23195b5af712b591d388c9d874a27a2cb19e70bd7a966fb88228bc349353eb99" + "size": 5731, + "sha256": "1d61fbea5194a1960d9e6bc95d0f5b733687afae7d769a1ac9e0846be97341b4" } } } @@ -4312,13 +7337,13 @@ "children": { "index.js": { "type": "file", - "size": 129, - "sha256": "d91675bca78c4064b2876c6e9601395aa776f679fe40e63d2385b484d1767c37" + "size": 137, + "sha256": "f4815459fb3244502c85144904a2daa9ffc3451842a9139dbe501b16d09718b7" }, "map.js": { "type": "file", - "size": 402, - "sha256": "9a8a4a282402a8c25759408a57afba8d73a638d1f64d24407638b1f9156ce6a5" + "size": 415, + "sha256": "b27dbefa0578c06e5c444f693f4305c833f7aff3b535900af5e9e814908c60bc" } } }, @@ -4327,13 +7352,13 @@ "children": { "index.js": { "type": "file", - "size": 129, - "sha256": "d91675bca78c4064b2876c6e9601395aa776f679fe40e63d2385b484d1767c37" + "size": 137, + "sha256": "f4815459fb3244502c85144904a2daa9ffc3451842a9139dbe501b16d09718b7" }, "map.js": { "type": "file", - "size": 411, - "sha256": "274a4263af5db5e4d57e71702293c3a53fcc3ae9117e9c0ed5e86b6fa33ba6d1" + "size": 424, + "sha256": "b634af95b44141bfe4dd6149e8d39369c122f9ca5c219b09b20ffdcdf9983fce" } } } @@ -4341,31 +7366,31 @@ }, "encounters.js": { "type": "file", - "size": 870, - "sha256": "5f1cf6053693df8992cdece2a818ea56cbd6ddf023a60e42e2d0e54e27426fd2" + "size": 888, + "sha256": "580aae8b771084c5932acd0066cb6c8c45b5f4c78d811ada8e286454fe2b8439" }, "registry.js": { "type": "file", - "size": 7479, - "sha256": "436dd3b3cb759045765778a3cfa1cdc93264646ed97b191197fcb2ec19e1788c" + "size": 7885, + "sha256": "facc90bab28be94062d189bb94716a2fb5aa3387fb65c966ab3bac3d3ab0964b" }, "scenario-characters.js": { "type": "file", - "size": 9732, - "sha256": "c2678ddedd3349829eb9b3daca1862842ea6da2e928f8edda41c62d4d72e884d" + "size": 9847, + "sha256": "85a4f81946bde6e262f61712c55820f0cfde9d02866035275ec781978a22c64d" }, "shared": { "type": "directory", "children": { "index.js": { "type": "file", - "size": 126, - "sha256": "25625b636c2b82e58c0792c40b7f32562abca99e0fd7861b73a74cdf40c708af" + "size": 133, + "sha256": "5e92067de64aa26292f2fda6f3b270e06564e846a6f19b19c8ba27a04a25e95e" }, "rewards.js": { "type": "file", - "size": 8893, - "sha256": "867ac35043e5ae50a20349f944f2514c5e6201b71f2f92ca9fd28a0a26fe11f0" + "size": 9102, + "sha256": "e19f5d026318401a7a24f88a23ee900b2c9259872846f89b627899d2a32b693a" } } } @@ -4373,171 +7398,171 @@ }, "mode.js": { "type": "file", - "size": 113283, - "sha256": "dda3ece26a917cfe447fbd55ea3ca8f6f791efa5aa352267d898814936bf854b" + "size": 120958, + "sha256": "070f4f5e47df7c75dcc349b6513d5427867e121ac7b3e872a81e5d5d5b84b876" }, "monsters": { "type": "directory", "children": { "actions.js": { "type": "file", - "size": 33807, - "sha256": "4d07d53c1aa85278190217194cf68180ef428411dd89dafb5cdae7568a11500b" + "size": 34417, + "sha256": "97461914dd3a40e0bba6cb5e1ff41fe34208ab996dafcc64ed5a33d0d3cdebc5" }, "artifact-status.js": { "type": "file", - "size": 2385, - "sha256": "b85161c9acc1d92715f4cb7be7603bfea8b5e6d42f4caa9d30835f38575ca03a" + "size": 2427, + "sha256": "96ff8c497cb3a59d79e3b2044a3eab9e043d56d514d2e62c868d7a8a37a22024" }, "beast-intent.js": { "type": "file", - "size": 6805, - "sha256": "3962c0ab114907f692ee2d484311119d0c621dd460f00087875f6a9140886964" + "size": 6899, + "sha256": "b089382116ca2b4dfc6d12205318df39b6acb7ca7dee026de73a852e5cb5608b" }, "byrdonis-intent.js": { "type": "file", - "size": 3062, - "sha256": "59847f053122a0600d6b4c8b0a5573427da14717177fb1461640b8def9141443" + "size": 3119, + "sha256": "9d029cbd3062c7114c0f3767f9cdfa99c936a2277d864a26980b69f3e1942fb1" }, "crawler-intent.js": { "type": "file", - "size": 1587, - "sha256": "994561eea23a9983931d545ef76281e70dba575563a97059b8b5fc4501a4d40b" + "size": 1619, + "sha256": "5392844734e61a61ee65b746ed6a558b9133671743f795e9d59c4dfa848cf2bc" }, "cubex-intent.js": { "type": "file", - "size": 2151, - "sha256": "bf4af01cbeb8a45ba47dd7f200fa96d808e18322b2908ed4254465644ed87903" + "size": 2194, + "sha256": "9111e0162c4c6eb16301f7956ba0e9b2f29dbe68159d0f49156c2ff3efcf46ac" }, "effigy-intent.js": { "type": "file", - "size": 1462, - "sha256": "e244757471a7142e3b796be5f24f5a4765564d49fd6b7ddb1484883a46838a43" + "size": 1491, + "sha256": "2b4249d128cfb47009698c0292bc897d3f85b6e092d58af4e294e271ed100ba7" }, "effigy-slow.js": { "type": "file", - "size": 3367, - "sha256": "d2c2cf715e24090df2be4e68ff15d55dfdebf862ad87fdfa592bbf7bf20f2f94" + "size": 3429, + "sha256": "4ee5b67badf5b126dc3b4bcf59cc3a6e12781328e6a8d8e30e860d2edcc9c250" }, "flyconid-intent.js": { "type": "file", - "size": 1705, - "sha256": "cd65c7e8004c4810eb5bafda7b20563900ec4f264cfd352e2607f9d6050ab631" + "size": 1743, + "sha256": "6ff2be31555c591a872cc0ffcc7aea99a7bc9b6bd5156993f8847156eef8637b" }, "fogmog-battle.js": { "type": "file", - "size": 3856, - "sha256": "c5cba9d10c25f7ece2290110f787e4fc3dfa50f266a9faac4bfdb0ac957868e4" + "size": 3931, + "sha256": "4695d2ef46b7c84d69c35d1aea1b35d303fe033bc9d73f3d64a9be5c869ff42f" }, "fogmog-intent.js": { "type": "file", - "size": 2160, - "sha256": "367bf74fef71ff55d398902fd14512af5bfecc82e756237f73102fe116381c4e" + "size": 2196, + "sha256": "5d86b308905c65c9147995887ab1dd6f519ade0506ae13db8f99bc2e5bad7b15" }, "inklet-intent.js": { "type": "file", - "size": 2925, - "sha256": "db404520db50e2d052beb236578973ae4b61e61c6a57a366c8b63452b01e19a3" + "size": 2978, + "sha256": "c2812d2dc16d3d69859e6ec70c283d714aba0ae5a4254d28e30f9afe0408b54a" }, "jaxfruit-intent.js": { "type": "file", - "size": 1256, - "sha256": "46abbda7bf21af236f5e7a4c08a5739649bcf46ea70c59dcb18b5226b2568bb8" + "size": 1282, + "sha256": "c295f73ea1daac933310eff41d23f68bf9c59bf9d3aa34f12b54c16a08ab7bc6" }, "kin-intent.js": { "type": "file", - "size": 4393, - "sha256": "3321a96df24d651c2bfea7a7ccfd920be20ae75fa2cb8543abb5985cf7501835" + "size": 4469, + "sha256": "04ad104fa8a99f82ab4811775512e4ecaa9c6d0b8b9732a0e6044f0ef838d93d" }, "leafmedium-intent.js": { "type": "file", - "size": 1436, - "sha256": "ef04089133b4ec6157e48788eaa62c506a424c7e4ef479219529689f4b6bfc81" + "size": 1462, + "sha256": "ae373c29e39891992b857afaf11befac1354f163026a797e8bf13ad8d81b71ad" }, "leafslime-goop.js": { "type": "file", - "size": 1627, - "sha256": "a65b6a00bf246951abed47fb66a6d476849d7cb427169524a1d2ce722ab4758b" + "size": 1653, + "sha256": "133da2f627601e79aa51b6eb87acff777a3ca60c74d142b0d205c40ccbfef3f0" }, "leafslime-intent.js": { "type": "file", - "size": 1403, - "sha256": "3c8f841fb8a02683134a18d1197320b1bb03101f8765e069684654f9ff9ee3c8" + "size": 1430, + "sha256": "4a6f333cefd4c5c4f915f2d2c53b9abfb4d985fd5efc839f974eb862849baed2" }, "mawler-intent.js": { "type": "file", - "size": 1899, - "sha256": "23bfd30298779d9a41c28a3100fb026e17ecd2d1e066f0bb842c57a9ee56b833" + "size": 1937, + "sha256": "2933d7f6b768a797b3bdbceb6f3f93760b68961bf53af3f72262cefa6af75f0d" }, "monster.js": { "type": "file", - "size": 11416, - "sha256": "d6b6bbbece20f50da448adbba8f775acf5f155084008e8f44a61a30d2d1b2aef" + "size": 11658, + "sha256": "1464b42fce32b9266724c8f0eaa06923c1171cff539c337c96af1cc32bd7bc8a" }, "nibbit-intent.js": { "type": "file", - "size": 2292, - "sha256": "b3e34455e8cd88528069345aec2f7f55938b52e05fef4af9b8cd803bbe1579b3" + "size": 2336, + "sha256": "9665a4e9ea519c9cf035f38fca0b65b4b3e83c31ef6a3b6f3951d57ef3f31120" }, "phrog-battle.js": { "type": "file", - "size": 2197, - "sha256": "0c4621e858cc4a4b0e6d1fa86f7d5e06784dfc4ed4e9aba1342c65f6b80f9d02" + "size": 2235, + "sha256": "a9111bfefbbfd5c2641a0a660df5d9b83977bb7c675d77c57f5b5a23b3be3b2f" }, "phrog-intent.js": { "type": "file", - "size": 4060, - "sha256": "e058edf8b6febadcd685dc7c16c05d90e8ba56c1d9b26c132e4ef2fc0e95d9df" + "size": 4135, + "sha256": "9b529fcd6217d87f0682f99c77017565d326b372811b215c20aa8b0e169ac7f2" }, "raider-intent.js": { "type": "file", - "size": 2021, - "sha256": "70580ade399e910e817e3929a41dc2da52bfadf36fb3b494a17a86effab27ee1" + "size": 2060, + "sha256": "b15b89d53914c472c3ef4f2e54e3551bb6a80cd783c21d340676189c2e22c948" }, "shrinker-intent.js": { "type": "file", - "size": 1491, - "sha256": "758ea3ef47d0cf529f09b9733c9fda02c029f7eb30f7ca12b1ccd506267ef90b" + "size": 1518, + "sha256": "fa3c3fee332dd7f709bbf70ab7a510c02a8bed0182c48faa02e1c9e5ae7c7dbd" }, "shrinker-status.js": { "type": "file", - "size": 2356, - "sha256": "08a44974fb5064ea0f83b3b2d3d6d6030508ef8bef5ed4d8a91f274a8e6b95bf" + "size": 2401, + "sha256": "5d4d1482b1bcacd3c02e3b5acc7003edcd2e82452600ecdaabb1934b89249010" }, "strangler-constrict.js": { "type": "file", - "size": 3054, - "sha256": "87b012405f7840e5a064e994e9413e8671e4aebe954ee9fd03c9798ed78efe61" + "size": 3116, + "sha256": "0480aab377f1303ce2d71786b54b25172df6b44cc11a87e80f0f0e87c4b9d174" }, "strangler-intent.js": { "type": "file", - "size": 1578, - "sha256": "b5ea12fd74db365592ace7c55671bad8b18aa34da9a829852fc1a0e3cf1f229a" + "size": 1609, + "sha256": "d2272f4d3a349742195d5c80d8cc30d18de9c884240d23351b965a2a32d902b4" }, "twigmedium-intent.js": { "type": "file", - "size": 2576, - "sha256": "c27f58e02f08b87ed62865fc11bb3ae43b5d2098ac199c5714946d24e0afaa87" + "size": 2623, + "sha256": "5e7039b76647b8b85d549c5ea7deb826ea3299a9d27af659a344a43cbc205ccf" }, "twigslime-intent.js": { "type": "file", - "size": 1273, - "sha256": "26a3437ffc95bec9638911537e5b572f4b12d8a94a06d6df358d73237a181830" + "size": 1299, + "sha256": "dd772c38e732ebcdda6e5b0ecd4725f73b36cb880ff156f3aaa64470a53633bc" }, "vantom-intent.js": { "type": "file", - "size": 2266, - "sha256": "29c0f36f5b060866e5c28c842883d951d55ceb4f0df7a7e204905fd6d803045b" + "size": 2309, + "sha256": "609880e2c33e1d9cadbe9b0a7f3e5e6087d82df94dc14c45e81cd8999f4c10d7" }, "vine-intent.js": { "type": "file", - "size": 1229, - "sha256": "e2bc8348d9ef5d8ff38b3d65a0b05b741fef31cf12ca6b6abe7b81ce58515b00" + "size": 1249, + "sha256": "fa0de60bef2d798685d771182aaf7e6fdea35cb35b732a50fcd5a353bd15ae2b" }, "vine-tangled.js": { "type": "file", - "size": 2214, - "sha256": "e8eb1e501af16d5da2157ff357bef3193233b4fbcd62cd823a4a6114124abd7e" + "size": 2255, + "sha256": "6913f1a6c55f33cf8f69efaa7ac15c3b384d7419305d2f968b07cf5edf81b586" } } }, @@ -4546,73 +7571,98 @@ "children": { "dialogue-choice.js": { "type": "file", - "size": 820, - "sha256": "b85e45995226cb30a488d5742c09a407ad9557d95e29136dd72fbaf695a4005f" + "size": 837, + "sha256": "e00707810480b281bf3e8c25923cf09997d06cf2dc3b7eea35c5a1a47c5cd3dd" }, "encounter-progress.js": { "type": "file", - "size": 1555, - "sha256": "e674c332baef9b3baffbfed3c86c41cd38a5c95bdd4fb3b1009a9819e90a06ba" + "size": 1586, + "sha256": "9d79bd7a98b6aede1e05e970ba5fc2ebce431d56016375111e2e191d0c6a3036" }, "map-checkpoint.js": { "type": "file", - "size": 314, - "sha256": "c0b5fa06fda99cf4d06570cb7e95fafc141b355055d20b0bd8f7ff91f1c1afa7" + "size": 322, + "sha256": "48b96ee1c6d3445d87b78d7fea42d8bbefa35ff9db4682e4012e36f53681bbf8" }, "mode-storage.js": { "type": "file", - "size": 3740, - "sha256": "7e266df0de15e4f2252600f10a21a09c01949680c1aaaaf5453591b9df3573d4" + "size": 5601, + "sha256": "9436f89b6885a6e6127ecdb436d7d3fb5ffb8002d693cd21a628fddf6d489b15" }, "reward-package.js": { "type": "file", - "size": 1527, - "sha256": "acd839d139bef9d22036e7bcb7acad8c5f25aea1c2a615d224020d97f4e7f313" + "size": 1572, + "sha256": "9922ab586d2c851a5975985460a64672d973d3a2466e17b9114dfdfcfa53bba8" }, "reward.js": { "type": "file", - "size": 3308, - "sha256": "31cb0895cfa98696cefd7301b967ba3652aee2c4401f7770e64d6a2cf68b53f0" + "size": 3368, + "sha256": "96884ebd8aa1c8c5ab825907294bfde2855ebb1d927a8d5ab2a20068351a88f3" }, "state.js": { "type": "file", - "size": 14578, - "sha256": "5cb6ac5494251f2a9ac68344862d74736e7ba076dc0e1eafdd06e9eac0923724" + "size": 15168, + "sha256": "27dcdb747b5c049b53a62643b6362d3a7d94ec5da6311ddc5a19cd54fdca0339" }, "story.js": { "type": "file", - "size": 718, - "sha256": "0719c33cf849fd2b647e4e4ff987560c5f9ea2a015b4acecc57269fb6b562059" + "size": 737, + "sha256": "4db3cf98d5a102cf5bf6d3022b0bdb4c7d70430537e2c4a6a9e541822951f016" } } }, "register.js": { "type": "file", - "size": 791, - "sha256": "95290f693f1d5bbc592e35a3cd063201f46d5deffbd0e281682f371b02ae342e" + "size": 814, + "sha256": "1434e175ebebf75f1f1531eb8a13fe89108f7713b81b41b56074b52f4b12b24a" }, "relics": { "type": "directory", "children": { "battle.js": { "type": "file", - "size": 4893, - "sha256": "e3b9977b9a20a2c85b3cb01792c996b5255920f455ab07ab537a6f9c915eb470" + "size": 20603, + "sha256": "65d0b389bfab7b95d69e554a32447c65f70f704607ea44fb1e0f4bdd3462de87" + }, + "catalog.js": { + "type": "file", + "size": 240568, + "sha256": "a8b77b73e47d937b882da5d2f6ebcc84e3f7be017ba1bc1688b124b170ad8cad" }, "combat.js": { "type": "file", - "size": 4018, - "sha256": "d5d2c53a596a3772e0f0931f56b0db423cbc69f20847318a9aa77dfb1d2c0e92" + "size": 6117, + "sha256": "71e464d185b9a1c4460bf357588032d71e78d8d2a2ae177f0938971fd61eb279" }, "definitions.js": { "type": "file", - "size": 4608, - "sha256": "e974f83405153b994b9135cf6ed3998a28ac8313bd42042075db9460cf9edc6f" + "size": 6689, + "sha256": "b7f6001cfd3691e07e4b5f01428246c7489e2f5208937a6d3097829f794c29e6" + }, + "hooks.js": { + "type": "file", + "size": 1503, + "sha256": "99e0a84966dace354ebe7e1ec9c55cc6fcfbfbb4eba976dfbee7000d618237e2" + }, + "progression.js": { + "type": "file", + "size": 10846, + "sha256": "a9935b851c066068a1a81c7078336f5fefcca0e75b6731cee067dd618c048e83" + }, + "random.js": { + "type": "file", + "size": 574, + "sha256": "2b85c064e70257a73fbe2347b93ff80d1147e9b59367e36cb10abb73ae424a05" }, "rooms.js": { "type": "file", - "size": 1010, - "sha256": "331664f916965f8d72ac9db50a59c5ff4f18f7a95c6beb5eeb9e44d247ffd053" + "size": 3897, + "sha256": "e1f0f03762fbb7e8212c22f199810171971cf9f4a12a054add9c571bc3502ccc" + }, + "rules.js": { + "type": "file", + "size": 18489, + "sha256": "6b4bfd2aa00dcc12248bf4b92d8329160b6433bd94eaabeed6ad09b383b15737" } } }, @@ -4621,123 +7671,128 @@ "children": { "bonds.js": { "type": "file", - "size": 4415, - "sha256": "275713f94c9ede664537104a1eb483ac198b477ecc3e5cca52bc51208b3b274d" + "size": 4737, + "sha256": "0df5099a728808116cdc01cc1e0adbbc86c4719e0e575fa44ac0006ad0750e09" }, "card-library.js": { "type": "file", - "size": 20528, - "sha256": "b58a96859599082e83da6e8c9026619392cf9a72ebe7223d86e078de3ea14d56" + "size": 21608, + "sha256": "237cc3ad94f337865b6bb26a802b0f93f12194def90b72373f1c23c07a51b80e" }, "dialogue.js": { "type": "file", - "size": 7649, - "sha256": "a405f315270c24cdb2c53ba4e211a3fd5bf9bb582335d5dbf910adb5622deac6" + "size": 7842, + "sha256": "e61b22cf27f810a45404e0d05969b03e0a6603d581f8cf7a052a3c30348325f7" }, "energy-display.js": { "type": "file", - "size": 498, - "sha256": "b12157ac3008c0e63fb384fe5fefe54964b86436652c73670f6a4c4faa4ad1da" + "size": 511, + "sha256": "37bc74971d52429c7e1c3d9d0c2dcccb29a61e968ac1bf4eb0a2330801d8fd69" }, "flow-ui.js": { "type": "file", - "size": 3044, - "sha256": "76032d73c27bd3ba3a54064a7cfc1741f3fea379e26636da3037000943ef6450" + "size": 3285, + "sha256": "42130f7634885f32d4ec5e4c1d165d1b0497668bd4da5557eda27f3109f8bf30" }, "gm-manager.js": { "type": "file", - "size": 4636, - "sha256": "e6feac7f157824fba6436330612267f98158a95c8db64b4ee5019e65d1fb8324" + "size": 4727, + "sha256": "1ffcf493ffcc4d9b16911e81ff62b15693213355c3226270e5224b03042e8868" }, "hand": { "type": "directory", "children": { "adapter.js": { "type": "file", - "size": 935, - "sha256": "91adc86b2810e27bd09d07297ac427cbbc151936f4dd8736ab1413b4eab78a0c" + "size": 955, + "sha256": "dbec5a22b19ba7790c2118328701331b9065cdd7877ad237fa6ba635aad0ab6b" }, "diagnostics.js": { "type": "file", - "size": 723, - "sha256": "f41c12348a508a7a1505fbc311b9c4b3cf85be038cc93e467a5f094bf1e5dde3" + "size": 1103, + "sha256": "e15ed8e5993f5185f496f15b4497a27964b3b3cdecd9ac4e5648abdf36517a75" }, "fan.js": { "type": "file", - "size": 4355, - "sha256": "55e1e01dda7b4231c8e1a2fadf6ccbee39b5e98c543bc55500c6493cf6cd51b1" + "size": 4444, + "sha256": "c1c762219643592036196f03e2d09f14ac0b4487d8bf61b6b91ce3c73018c30a" }, "index.js": { "type": "file", - "size": 8989, - "sha256": "c4f602e6b397b84e96f47a43858a835dcd78a4f671b0e89143b6df088c01204b" + "size": 10125, + "sha256": "4dee83b19ef24572bb0787cd0ffd388f051304fbbc5dc94e2e9cc0b0a51ee7e7" }, "input.js": { "type": "file", - "size": 12278, - "sha256": "b04df574792e6e4be7cce4e0d8bd682efeb091b9b752b40a0b110575442adfbb" + "size": 12533, + "sha256": "d3616cc25652f0c8cf3c2432f2df0786d46e8e4fe7a2ce00f4cd19bd1b7ea07b" }, "overlays.js": { "type": "file", - "size": 3970, - "sha256": "9e489fc939f97a21266764f1beccdda1cc3ac9df22f72c633647d7481fa4e662" + "size": 4067, + "sha256": "caf261473d3ee17afc46ffa25f76f8d4064317dc387fe0fb151eb9bc282f61ba" }, "style.css": { "type": "file", - "size": 15492, - "sha256": "12618f7fd4acd54db197f1ca82dceed87b75c4b6003f02fcaa9054862718e692" + "size": 15882, + "sha256": "c81ee0ad9128cdc0ba2c441fd5cbd980e0394c513462951b5c850896420f09b8" } } }, "intent-display.js": { "type": "file", - "size": 10556, - "sha256": "feb7fdb208d4ee540a0fe66b329402c8587f22dcdb8de2e1eb455b7d6af9a185" + "size": 13543, + "sha256": "1db512b050a73e1dfa2cedcc1a4dc67adbf98dec3c3e297b284eb8363115f0e9" }, "map": { "type": "directory", "children": { "index.js": { "type": "file", - "size": 61, - "sha256": "6fc56c6c084508a39d801521a103f8c39eea90eb895f47a78924997241d9f932" + "size": 62, + "sha256": "6fb7e6e2547eec9d421727b9d6794e3c96d8e3a77984d7688544a67a00c4999d" }, "renderer.js": { "type": "file", - "size": 25591, - "sha256": "ffbf4b8d0b3c6ce88cdeb2817a90e70b987396f767fb9a2fb593c28b4c4a3f71" + "size": 26945, + "sha256": "aff712e8b2257ed54bde843686ea9b76ceae5fb8375981c8adbe5a55e5338198" } } }, "navigation.js": { "type": "file", - "size": 8333, - "sha256": "fff29ce0f837931f16af40e09a193468273f0eab75068f8c9f8023e9dcc805ed" + "size": 8819, + "sha256": "3fc55ee51350f21d423d22375af029cf8278108603225a454d27c29caaf5ca32" + }, + "relic-icon.js": { + "type": "file", + "size": 642, + "sha256": "ba1e2fcfcb3983d25734cca9ba33136a6f12dbc176439b8974fa7ff79a4e0c9e" }, "relics.js": { "type": "file", - "size": 3371, - "sha256": "bc24cd2eb4644bcf329a7acac28820feab22b0e4648a1d25ea9e1e3d8120f1a6" + "size": 3673, + "sha256": "76f0042edbb5af4aeb32e597eb21bbb3757ee2327092b29eebc530df26f088a7" }, "reward-package.js": { "type": "file", - "size": 4256, - "sha256": "0ca1458434ebe616fd29eebbbb9314c03249673fc9a9e2cbae6ee09be4cdc16e" + "size": 4347, + "sha256": "67d2e757fe6ced0f57d16a1d11aaba8caa4d90bcfe99d878aa5400e5e05003b7" }, "reward-ui.js": { "type": "file", - "size": 15170, - "sha256": "70a1bd26b1ec730bc7cdf04bddf160f2e3ae8daadd54c4c38c5263549aa88dee" + "size": 15837, + "sha256": "d403221c69abe676d080e6a8c3c2146242ccc2defb1de4887e62f4ed3611ee5b" }, "style.css": { "type": "file", - "size": 77648, - "sha256": "46e38bb6c818d3fae8c0b61e5e2cc7c5c29db69cb72daa244f1a2944db8ebfb8" + "size": 80055, + "sha256": "fcdab9e5cfdd98bcb6849db8e2bfa7da387cf1dd0e75c1fa7013cb3d355b53ac" }, "virtual-card-grid.js": { "type": "file", - "size": 4509, - "sha256": "0d8aa28041246a20895a289ab360e982044b2028f6c03090a0039ce85f7e2977" + "size": 4916, + "sha256": "4365dbc5a943dccb01386e22a2ca16cd80596e613c4c862b432b304540c151e0" } } } diff --git a/dist/modules/mengsan.legacy.json b/dist/modules/mengsan.legacy.json index eeb13d4..d0c2344 100644 --- a/dist/modules/mengsan.legacy.json +++ b/dist/modules/mengsan.legacy.json @@ -1,5 +1,5 @@ { - "version": "2.0.2.3-rc.2", + "version": "2.0.2.3-rc.3", "module_id": "mengsan", "snapshot": "legacy", "files": [ @@ -302,6 +302,305 @@ "mengsan/assets/portraits/wriggler-forest-portrait.png", "mengsan/assets/portraits/wriggler-original.webp", "mengsan/assets/portraits/zhangfei-portrait.jpg", + "mengsan/assets/relics/akabeko.png", + "mengsan/assets/relics/alchemical_coffer.png", + "mengsan/assets/relics/amethyst_aubergine.png", + "mengsan/assets/relics/anchor.png", + "mengsan/assets/relics/arcane_scroll.png", + "mengsan/assets/relics/archaic_tooth.png", + "mengsan/assets/relics/art_of_war.png", + "mengsan/assets/relics/astrolabe.png", + "mengsan/assets/relics/bag_of_marbles.png", + "mengsan/assets/relics/bag_of_preparation.png", + "mengsan/assets/relics/beating_remnant.png", + "mengsan/assets/relics/beautiful_bracelet.png", + "mengsan/assets/relics/bellows.png", + "mengsan/assets/relics/belt_buckle.png", + "mengsan/assets/relics/big_hat.png", + "mengsan/assets/relics/big_mushroom.png", + "mengsan/assets/relics/biiig_hug.png", + "mengsan/assets/relics/bing_bong.png", + "mengsan/assets/relics/black_blood.png", + "mengsan/assets/relics/black_star.png", + "mengsan/assets/relics/blessed_antler.png", + "mengsan/assets/relics/blood_soaked_rose.png", + "mengsan/assets/relics/blood_vial.png", + "mengsan/assets/relics/bone_flute.png", + "mengsan/assets/relics/bone_tea.png", + "mengsan/assets/relics/book_of_five_rings.png", + "mengsan/assets/relics/book_repair_knife.png", + "mengsan/assets/relics/bookmark.png", + "mengsan/assets/relics/booming_conch.png", + "mengsan/assets/relics/bound_phylactery.png", + "mengsan/assets/relics/bowler_hat.png", + "mengsan/assets/relics/bread.png", + "mengsan/assets/relics/brilliant_scarf.png", + "mengsan/assets/relics/brimstone.png", + "mengsan/assets/relics/bronze_scales.png", + "mengsan/assets/relics/burning_blood.png", + "mengsan/assets/relics/burning_sticks.png", + "mengsan/assets/relics/byrdpip.png", + "mengsan/assets/relics/calling_bell.png", + "mengsan/assets/relics/candelabra.png", + "mengsan/assets/relics/captains_wheel.png", + "mengsan/assets/relics/cauldron.png", + "mengsan/assets/relics/centennial_puzzle.png", + "mengsan/assets/relics/chandelier.png", + "mengsan/assets/relics/charons_ashes.png", + "mengsan/assets/relics/chemical_x.png", + "mengsan/assets/relics/choices_paradox.png", + "mengsan/assets/relics/chosen_cheese.png", + "mengsan/assets/relics/circlet.png", + "mengsan/assets/relics/claws.png", + "mengsan/assets/relics/cloak_clasp.png", + "mengsan/assets/relics/cracked_core.png", + "mengsan/assets/relics/crossbow.png", + "mengsan/assets/relics/cursed_pearl.png", + "mengsan/assets/relics/darkstone_periapt.png", + "mengsan/assets/relics/data_disk.png", + "mengsan/assets/relics/daughter_of_the_wind.png", + "mengsan/assets/relics/delicate_frond.png", + "mengsan/assets/relics/demon_tongue.png", + "mengsan/assets/relics/diamond_diadem.png", + "mengsan/assets/relics/dingy_rug.png", + "mengsan/assets/relics/distinguished_cape.png", + "mengsan/assets/relics/divine_destiny.png", + "mengsan/assets/relics/divine_right.png", + "mengsan/assets/relics/dollys_mirror.png", + "mengsan/assets/relics/dowsing_rod.png", + "mengsan/assets/relics/dragon_fruit.png", + "mengsan/assets/relics/dream_catcher.png", + "mengsan/assets/relics/driftwood.png", + "mengsan/assets/relics/dusty_tome.png", + "mengsan/assets/relics/ectoplasm.png", + "mengsan/assets/relics/electric_shrymp.png", + "mengsan/assets/relics/ember_tea.png", + "mengsan/assets/relics/emotion_chip.png", + "mengsan/assets/relics/empty_cage.png", + "mengsan/assets/relics/eternal_feather.png", + "mengsan/assets/relics/fake_anchor.png", + "mengsan/assets/relics/fake_blood_vial.png", + "mengsan/assets/relics/fake_happy_flower.png", + "mengsan/assets/relics/fake_lees_waffle.png", + "mengsan/assets/relics/fake_mango.png", + "mengsan/assets/relics/fake_merchants_rug.png", + "mengsan/assets/relics/fake_orichalcum.png", + "mengsan/assets/relics/fake_snecko_eye.png", + "mengsan/assets/relics/fake_strike_dummy.png", + "mengsan/assets/relics/fake_venerable_tea_set.png", + "mengsan/assets/relics/fencing_manual.png", + "mengsan/assets/relics/festive_popper.png", + "mengsan/assets/relics/fiddle.png", + "mengsan/assets/relics/fishing_rod.png", + "mengsan/assets/relics/forgotten_soul.png", + "mengsan/assets/relics/fragrant_mushroom.png", + "mengsan/assets/relics/fresnel_lens.png", + "mengsan/assets/relics/frozen_egg.png", + "mengsan/assets/relics/funerary_mask.png", + "mengsan/assets/relics/fur_coat.png", + "mengsan/assets/relics/galactic_dust.png", + "mengsan/assets/relics/gambling_chip.png", + "mengsan/assets/relics/game_piece.png", + "mengsan/assets/relics/ghost_seed.png", + "mengsan/assets/relics/girya.png", + "mengsan/assets/relics/glass_eye.png", + "mengsan/assets/relics/glitter.png", + "mengsan/assets/relics/gnarled_hammer.png", + "mengsan/assets/relics/gold_plated_cables.png", + "mengsan/assets/relics/golden_compass.png", + "mengsan/assets/relics/golden_pearl.png", + "mengsan/assets/relics/gorget.png", + "mengsan/assets/relics/gremlin_horn.png", + "mengsan/assets/relics/hand_drill.png", + "mengsan/assets/relics/happy_flower.png", + "mengsan/assets/relics/hefty_tablet.png", + "mengsan/assets/relics/helical_dart.png", + "mengsan/assets/relics/history_course.png", + "mengsan/assets/relics/horn_cleat.png", + "mengsan/assets/relics/ice_cream.png", + "mengsan/assets/relics/infused_core.png", + "mengsan/assets/relics/intimidating_helmet.png", + "mengsan/assets/relics/iron_club.png", + "mengsan/assets/relics/ivory_tile.png", + "mengsan/assets/relics/jeweled_mask.png", + "mengsan/assets/relics/jewelry_box.png", + "mengsan/assets/relics/joss_paper.png", + "mengsan/assets/relics/juzu_bracelet.png", + "mengsan/assets/relics/kaleidoscope.png", + "mengsan/assets/relics/kifuda.png", + "mengsan/assets/relics/kunai.png", + "mengsan/assets/relics/kusarigama.png", + "mengsan/assets/relics/lantern.png", + "mengsan/assets/relics/large_capsule.png", + "mengsan/assets/relics/lasting_candy.png", + "mengsan/assets/relics/lava_lamp.png", + "mengsan/assets/relics/lava_rock.png", + "mengsan/assets/relics/lead_paperweight.png", + "mengsan/assets/relics/leafy_poultice.png", + "mengsan/assets/relics/lees_waffle.png", + "mengsan/assets/relics/letter_opener.png", + "mengsan/assets/relics/lizard_tail.png", + "mengsan/assets/relics/looming_fruit.png", + "mengsan/assets/relics/lords_parasol.png", + "mengsan/assets/relics/lost_coffer.png", + "mengsan/assets/relics/lost_wisp.png", + "mengsan/assets/relics/lucky_fysh.png", + "mengsan/assets/relics/lunar_pastry.png", + "mengsan/assets/relics/mango.png", + "mengsan/assets/relics/manifest.json", + "mengsan/assets/relics/massive_scroll.png", + "mengsan/assets/relics/maw_bank.png", + "mengsan/assets/relics/meal_ticket.png", + "mengsan/assets/relics/meat_cleaver.png", + "mengsan/assets/relics/meat_on_the_bone.png", + "mengsan/assets/relics/membership_card.png", + "mengsan/assets/relics/mercury_hourglass.png", + "mengsan/assets/relics/metronome.png", + "mengsan/assets/relics/mini_regent.png", + "mengsan/assets/relics/miniature_cannon.png", + "mengsan/assets/relics/miniature_tent.png", + "mengsan/assets/relics/molten_egg.png", + "mengsan/assets/relics/mr_struggles.png", + "mengsan/assets/relics/mummified_hand.png", + "mengsan/assets/relics/music_box.png", + "mengsan/assets/relics/mystic_lighter.png", + "mengsan/assets/relics/neows_bones.png", + "mengsan/assets/relics/neows_sacrifice.png", + "mengsan/assets/relics/neows_talisman.png", + "mengsan/assets/relics/neows_torment.png", + "mengsan/assets/relics/new_leaf.png", + "mengsan/assets/relics/ninja_scroll.png", + "mengsan/assets/relics/nunchaku.png", + "mengsan/assets/relics/nutritious_oyster.png", + "mengsan/assets/relics/nutritious_soup.png", + "mengsan/assets/relics/oddly_smooth_stone.png", + "mengsan/assets/relics/old_coin.png", + "mengsan/assets/relics/orange_dough.png", + "mengsan/assets/relics/orichalcum.png", + "mengsan/assets/relics/ornamental_fan.png", + "mengsan/assets/relics/orrery.png", + "mengsan/assets/relics/paels_blood.png", + "mengsan/assets/relics/paels_claw.png", + "mengsan/assets/relics/paels_eye.png", + "mengsan/assets/relics/paels_flesh.png", + "mengsan/assets/relics/paels_growth.png", + "mengsan/assets/relics/paels_horn.png", + "mengsan/assets/relics/paels_legion.png", + "mengsan/assets/relics/paels_tears.png", + "mengsan/assets/relics/paels_tooth.png", + "mengsan/assets/relics/paels_wing.png", + "mengsan/assets/relics/pandoras_box.png", + "mengsan/assets/relics/pantograph.png", + "mengsan/assets/relics/paper_krane.png", + "mengsan/assets/relics/paper_phrog.png", + "mengsan/assets/relics/parrying_shield.png", + "mengsan/assets/relics/pear.png", + "mengsan/assets/relics/pen_nib.png", + "mengsan/assets/relics/pendulum.png", + "mengsan/assets/relics/permafrost.png", + "mengsan/assets/relics/petrified_toad.png", + "mengsan/assets/relics/phial_holster.png", + "mengsan/assets/relics/philosophers_stone.png", + "mengsan/assets/relics/phylactery_unbound.png", + "mengsan/assets/relics/planisphere.png", + "mengsan/assets/relics/pocketwatch.png", + "mengsan/assets/relics/pollinous_core.png", + "mengsan/assets/relics/pomander.png", + "mengsan/assets/relics/potion_belt.png", + "mengsan/assets/relics/power_cell.png", + "mengsan/assets/relics/prayer_wheel.png", + "mengsan/assets/relics/precarious_shears.png", + "mengsan/assets/relics/precise_scissors.png", + "mengsan/assets/relics/preserved_fog.png", + "mengsan/assets/relics/prismatic_gem.png", + "mengsan/assets/relics/pumpkin_candle.png", + "mengsan/assets/relics/punch_dagger.png", + "mengsan/assets/relics/radiant_pearl.png", + "mengsan/assets/relics/rainbow_ring.png", + "mengsan/assets/relics/razor_tooth.png", + "mengsan/assets/relics/red_mask.png", + "mengsan/assets/relics/red_skull.png", + "mengsan/assets/relics/regal_pillow.png", + "mengsan/assets/relics/regalite.png", + "mengsan/assets/relics/reptile_trinket.png", + "mengsan/assets/relics/ring_of_the_drake.png", + "mengsan/assets/relics/ring_of_the_snake.png", + "mengsan/assets/relics/ringing_triangle.png", + "mengsan/assets/relics/ripple_basin.png", + "mengsan/assets/relics/royal_poison.png", + "mengsan/assets/relics/royal_stamp.png", + "mengsan/assets/relics/ruined_helmet.png", + "mengsan/assets/relics/runic_capacitor.png", + "mengsan/assets/relics/runic_pyramid.png", + "mengsan/assets/relics/sai.png", + "mengsan/assets/relics/sand_castle.png", + "mengsan/assets/relics/screaming_flagon.png", + "mengsan/assets/relics/scroll_boxes.png", + "mengsan/assets/relics/sea_glass.png", + "mengsan/assets/relics/seal_of_gold.png", + "mengsan/assets/relics/self_forming_clay.png", + "mengsan/assets/relics/sere_talon.png", + "mengsan/assets/relics/shovel.png", + "mengsan/assets/relics/shuriken.png", + "mengsan/assets/relics/signet_ring.png", + "mengsan/assets/relics/silken_tress.png", + "mengsan/assets/relics/silver_crucible.png", + "mengsan/assets/relics/sling_of_courage.png", + "mengsan/assets/relics/small_capsule.png", + "mengsan/assets/relics/snecko_eye.png", + "mengsan/assets/relics/snecko_skull.png", + "mengsan/assets/relics/sozu.png", + "mengsan/assets/relics/sparkling_rouge.png", + "mengsan/assets/relics/spiked_gauntlets.png", + "mengsan/assets/relics/stone_calendar.png", + "mengsan/assets/relics/stone_cracker.png", + "mengsan/assets/relics/stone_humidifier.png", + "mengsan/assets/relics/storybook.png", + "mengsan/assets/relics/strawberry.png", + "mengsan/assets/relics/strike_dummy.png", + "mengsan/assets/relics/sturdy_clamp.png", + "mengsan/assets/relics/sword_of_jade.png", + "mengsan/assets/relics/sword_of_stone.png", + "mengsan/assets/relics/symbiotic_virus.png", + "mengsan/assets/relics/tanxs_whistle.png", + "mengsan/assets/relics/tea_of_discourtesy.png", + "mengsan/assets/relics/the_abacus.png", + "mengsan/assets/relics/the_boot.png", + "mengsan/assets/relics/the_courier.png", + "mengsan/assets/relics/throwing_axe.png", + "mengsan/assets/relics/tingsha.png", + "mengsan/assets/relics/tiny_mailbox.png", + "mengsan/assets/relics/toasty_mittens.png", + "mengsan/assets/relics/toolbox.png", + "mengsan/assets/relics/touch_of_orobas.png", + "mengsan/assets/relics/tough_bandages.png", + "mengsan/assets/relics/toxic_egg.png", + "mengsan/assets/relics/toy_box.png", + "mengsan/assets/relics/tri_boomerang.png", + "mengsan/assets/relics/tungsten_rod.png", + "mengsan/assets/relics/tuning_fork.png", + "mengsan/assets/relics/twisted_funnel.png", + "mengsan/assets/relics/unceasing_top.png", + "mengsan/assets/relics/undying_sigil.png", + "mengsan/assets/relics/unsettling_lamp.png", + "mengsan/assets/relics/vajra.png", + "mengsan/assets/relics/vambrace.png", + "mengsan/assets/relics/velvet_choker.png", + "mengsan/assets/relics/venerable_tea_set.png", + "mengsan/assets/relics/very_hot_cocoa.png", + "mengsan/assets/relics/vexing_puzzlebox.png", + "mengsan/assets/relics/vitruvian_minion.png", + "mengsan/assets/relics/war_hammer.png", + "mengsan/assets/relics/war_paint.png", + "mengsan/assets/relics/whetstone.png", + "mengsan/assets/relics/whispering_earring.png", + "mengsan/assets/relics/white_beast_statue.png", + "mengsan/assets/relics/white_star.png", + "mengsan/assets/relics/wing_charm.png", + "mengsan/assets/relics/winged_boots.png", + "mengsan/assets/relics/wongo_customer_appreciation_badge.png", + "mengsan/assets/relics/wongos_mystery_ticket.png", + "mengsan/assets/relics/yummy_cookie.png", "mengsan/assets/sushuang-zhangshiping.png", "mengsan/battle/battle-director.js", "mengsan/battle/battle-flow.js", @@ -453,9 +752,14 @@ "mengsan/progression/story.js", "mengsan/register.js", "mengsan/relics/battle.js", + "mengsan/relics/catalog.js", "mengsan/relics/combat.js", "mengsan/relics/definitions.js", + "mengsan/relics/hooks.js", + "mengsan/relics/progression.js", + "mengsan/relics/random.js", "mengsan/relics/rooms.js", + "mengsan/relics/rules.js", "mengsan/runtime/battle-director.js", "mengsan/runtime/battle-flow.js", "mengsan/runtime/battle-loop.js", @@ -499,6 +803,7 @@ "mengsan/ui/map/index.js", "mengsan/ui/map/renderer.js", "mengsan/ui/navigation.js", + "mengsan/ui/relic-icon.js", "mengsan/ui/relics.js", "mengsan/ui/reward-package.js", "mengsan/ui/reward-ui.js", diff --git a/extension.js b/extension.js index 112160d..2c2be28 100644 --- a/extension.js +++ b/extension.js @@ -2,10 +2,11 @@ import { lib, game, ui, get, ai, _status } from "../../noname.js"; import updater from "./update.js" import func from "./function.js" import initShuYingMenu from "./menu.js"; +import { configureDiagnostics } from "./diagnostics/index.js"; export const type = "extension"; export let shuYing = new Object(); -const shuYingLocalVersion = "2.0.2.3-rc.2"; +const shuYingLocalVersion = "2.0.2.3-rc.3"; shuYing.name = "术樱包"; shuYing.editable = false; @@ -16,6 +17,11 @@ shuYing.text = {}; //中上方文本 shuYing.text_style = {}; //中上方文本样式 shuYing.moduleCache = {}; //动态加载模块缓存,避免同一文件重复import shuYing.voices = {}; //语音台词表,voices.js缺失时保持为空 +shuYing.diagnostics = configureDiagnostics({ + lib, game, window, document, version: shuYingLocalVersion, + extensionRoot: shuYing.url, +}); +const diagnostics = shuYing.diagnostics.scope("extension"); //按需加载扩展内部模块。optional为true时,文件缺失只关闭对应功能,不中断整个扩展入口。 shuYing.loadModule = async (path, label, optional = true) => { @@ -24,6 +30,7 @@ shuYing.loadModule = async (path, label, optional = true) => { .then(module => module.default ?? module) .catch(error => { const message = `术樱包:${label || path}加载失败`; + diagnostics.error("module.load.failed", error, { path, label, optional }); if (!optional) throw error; console.warn(message, error); return null; @@ -125,6 +132,7 @@ shuYing.getVersion = (callback) => { .catch(error => { if (requestId != shuYing.versionRequestId) return null; console.error("术樱包获取在线版本失败:", error); + diagnostics.error("version.lookup.failed", error); shuYing.updateOnlineVersionMenu(null, "获取失败"); return null; }); @@ -245,7 +253,7 @@ shuYing.initCharacter = async () => { } //初始化游戏时 -shuYing.precontent = async () => { +shuYing.precontent = () => diagnostics.step("precontent", async () => { await shuYing.loadVoices(); shuYing.initCSS(); shuYing.initFunction(); @@ -273,7 +281,7 @@ shuYing.precontent = async () => { initShuYingMenu({ lib, game, ui, shuYing, updater }); shuYing.getVersion(); await shuYing.initCharacter(); -}; +}); shuYing.config = () => { diff --git a/mengsan/battle/battle-flow.js b/mengsan/battle/battle-flow.js index f789496..42ccf29 100644 --- a/mengsan/battle/battle-flow.js +++ b/mengsan/battle/battle-flow.js @@ -1,67 +1,89 @@ // Candidate external coordinator. Finish callbacks return a boolean, NEVER a drain promise. +import { getDiagnostics } from "../../diagnostics/index.js"; const copy = value => JSON.parse(JSON.stringify(value)); -export function createBattleFlow({settlement, chooseReward, chooseDefeat, showMap, showEnding, quiesce, releaseSkills = async () => {}, presentVictory = async () => {}}) { +export function createBattleFlow({settlement, chooseReward, chooseDefeat, showMap, showEnding, quiesce, releaseSkills = async () => {}, releaseBattle = () => {}, presentVictory = async () => {}}) { let state = "map", active = null, work = null, job = null, error = null; + let phase = "map", attempt = 0; + const diagnostics = getDiagnostics().scope("mengsan.flow", () => ({ + state, phase, attempt, sessionId: active?.session.id, + sessionState: active?.session.state, + pendingTasks: active?.session.pendingCount, + runId: active?.run.runId, revision: active?.run.revision, + nodeId: active?.node.id, settlementId: job?.pending?.id, + outcome: job?.input?.outcome, commitReceipt: !!job?.committed, + skillsReleased: !!job?.skillsReleased, delivered: !!job?.delivered, + })); + const step = (name, action, wait = true) => { + phase = name; + return diagnostics.step(name, action, {}, { observeWait: wait }); + }; async function drive() { try { state = "draining"; - await active.session.drain(); + await step("drain", () => active.session.drain()); // Allow mode-start/parent frames and foreign pauses to unwind; never resume them. - await quiesce(); - if (!job.pending) job.pending = await settlement.prepare(job.input); + await step("quiesce.beforePrepare", quiesce); + if (!job.pending) job.pending = await step("prepare", () => settlement.prepare(job.input)); if (job.pending.outcome === "victory" && !job.victoryPresented) { - await presentVictory(copy(job.pending)); + await step("victoryDialogue", () => presentVictory(copy(job.pending)), false); job.victoryPresented = true; } if (job.pending.state !== "chosen") { state = "choosing"; if (!job.hasChoice) { - job.choiceId = job.pending.outcome === "defeat" ? await chooseDefeat(copy(job.pending.base)) - : await chooseReward(copy(job.pending.choices), { + job.choiceId = await step("rewardSelection", () => job.pending.outcome === "defeat" ? chooseDefeat(copy(job.pending.base)) + : chooseReward(copy(job.pending.choices), { boss: job.pending.boss, elite: job.pending.elite, fixedRewards: copy(job.pending.fixedRewards || []), rewardPackage: copy(job.pending.rewardPackage || null), - }); + }), false); if (job.pending.outcome !== "defeat" && !job.pending.rewardPackage && job.choiceId !== null && !job.pending.choices.some(c => c.id === job.choiceId && c.kind !== "gold")) throw new Error("Invalid reward selection"); job.hasChoice = true; } - job.pending = await settlement.choose(job.input.run.runId, job.pending.id, job.choiceId); + job.pending = await step("applyChoice", () => settlement.choose(job.input.run.runId, job.pending.id, job.choiceId)); } if (!job.committed) { state = "committing"; - job.committed = await settlement.commit(job.input.run.runId, job.pending.id); + job.committed = await step("commit", () => settlement.commit(job.input.run.runId, job.pending.id)); } if (!job.skillsReleased) { state = "releasingSkills"; - await releaseSkills(); + await step("releaseSkills", releaseSkills); job.skillsReleased = true; - await quiesce(); + await step("quiesce.afterSkills", quiesce); } state = "cleaning"; - await active.session.dispose(); // Failed cleanup retry does NOT replay a committed reward. - await quiesce(); + await step("dispose", () => active.session.dispose()); // Failed cleanup retry does NOT replay a committed reward. + await step("quiesce.afterDispose", quiesce); + if (!job.battleReleased) { + await step("releaseBattle", releaseBattle); + job.battleReleased = true; + } if (!job.delivered) { state = "presenting"; if (job.committed.route === "map") { const mapRun = copy(job.committed.run); - job.nextNode = await showMap(mapRun); + job.nextNode = await step("showMap", () => showMap(mapRun), false); job.committed.run = mapRun; } else if (job.committed.route !== "new") { - await showEnding(job.committed.route, copy(job.committed.run)); + await step("showEnding", () => showEnding(job.committed.route, copy(job.committed.run)), false); } job.delivered = true; } state = job.committed.route === "map" ? "map" : "ended"; + diagnostics.info("settlement.complete", { route: job.committed.route }); return {...copy(job.committed), nextNode:copy(job.nextNode ?? null)}; } catch (cause) { + diagnostics.error("settlement.failed", cause, { failedPhase: phase }); error = cause; state = "retryable"; throw cause; } } function launch() { + attempt++; error = null; state = "draining"; work = Promise.resolve().then(drive); // The engine callback is fire-and-forget; keep failure observable without unhandled rejection. @@ -76,24 +98,33 @@ export function createBattleFlow({settlement, chooseReward, chooseDefeat, showMa if (!saved || saved.runId !== run.runId || saved.revision !== run.revision) throw new Error("Stale battle input"); state = "starting"; try { - await quiesce(); + await step("quiesce.beforeBattle", quiesce); active = {session, run, node:copy(node), encounter:copy(encounter)};job = null;work = null; // start MUST schedule only; it must not await the battle root's completion. - state = "battle"; start(); - } catch (cause) { state = "blocked"; error = cause; throw cause; } + state = "battle"; attempt = 0; start(); + diagnostics.info("battle.started"); + } catch (cause) { + diagnostics.error("battle.start.failed", cause, { runId: run.runId, nodeId: node.id }); + state = "blocked"; error = cause; throw cause; + } }, requestFinish({session, hp, outcome = "victory", defeatedEnemies = 1}) { - if (state !== "battle" || session !== active.session) return false; + if (state !== "battle" || session !== active.session) { + diagnostics.info("finish.ignored", { requestedSessionId: session?.id, outcome }); + return false; + } if (!["victory", "defeat"].includes(outcome)) throw new Error("Unknown outcome"); if (!Number.isInteger(defeatedEnemies) || defeatedEnemies < 0) throw new Error("Invalid defeated enemy count"); job = {input:{run:copy(active.run),node:copy(active.node),encounter:{...copy(active.encounter),defeatedEnemies},hp,outcome}}; state = "stopping"; + diagnostics.info("finish.accepted", { hp, defeatedEnemies }); active.session.requestStop(); launch(); return true; // No game.pause/resume: stop loop, let current body unwind, then open rewards. }, retry() { if (state !== "retryable") throw new Error("No failed settlement to retry"); + diagnostics.info("settlement.retry"); launch(); return work; }, wait() { if (!work) throw new Error("No settlement requested"); return work; }, diff --git a/mengsan/battle/battle-resources.js b/mengsan/battle/battle-resources.js index 6e6d7f3..3ad1912 100644 --- a/mengsan/battle/battle-resources.js +++ b/mengsan/battle/battle-resources.js @@ -20,11 +20,13 @@ export function createBattleResources(session, {game, ui, _status}) { session.ownResource({}, () => { for (const card of cards) card.remove(); for (const [node,parent] of nodes) if (node.parentNode === parent) node.remove(); - for (const {object,key,value,descriptor} of fields.reverse()) { + for (const {object,key,value,descriptor} of fields.slice().reverse()) { if (object[key] !== value) continue; // A replacement owned by another subsystem survives. if (descriptor) Object.defineProperty(object,key,descriptor); else delete object[key]; } game.phaseNumber = counters.phaseNumber; game.roundNumber = counters.roundNumber; + cards.clear(); nodes.clear(); fields.length = 0; + before.clear(); uiBefore.clear(); }); return Object.freeze({ field, @@ -49,6 +51,7 @@ export function createBattleResources(session, {game, ui, _status}) { for (const key of ["currentPhase","lastPhasedPlayer","roundStart"]) { if (owned.has(_status[key])) delete _status[key]; } + owned.clear(); }); }, }); diff --git a/mengsan/battle/battle-session.js b/mengsan/battle/battle-session.js index 6c41950..1fcd40d 100644 --- a/mengsan/battle/battle-session.js +++ b/mengsan/battle/battle-session.js @@ -1,4 +1,5 @@ // Candidate only. No engine globals, event prototype patches, or save writes. +import { getDiagnostics } from "../../diagnostics/index.js"; const owners = new WeakMap(); export function createBattleSession(id) { @@ -7,6 +8,11 @@ export function createBattleSession(id) { let state = "running", disposePromise = null; const pending = new Set(), events = new Set(), resources = new Map(), errors = []; const waiters = new Set(); + const diagnostics = getDiagnostics().scope("mengsan.session", () => ({ + sessionId: id, state, pendingTasks: pending.size, + eventCount: events.size, resourceCount: resources.size, + recordedErrors: errors.length, + })); const notify = () => { for (const wake of waiters) wake(); waiters.clear(); }; const ensureRunning = () => { if (state !== "running") throw new Error("Session is stopping"); }; const claim = object => { @@ -20,6 +26,7 @@ export function createBattleSession(id) { if (!(promise instanceof Promise)) throw new TypeError("Native completion Promise required"); pending.add(promise); promise.then(() => { pending.delete(promise); notify(); }, error => { + diagnostics.error("task.failed", error); errors.push(error); pending.delete(promise); notify(); }); return promise; @@ -58,9 +65,13 @@ export function createBattleSession(id) { requestStop() { if (state !== "running") return false; state = "stopping"; + diagnostics.info("stop.requested"); // Only explicitly registered events. Do not erase global next/after or guess ownership. for (const event of events) { - try { event.finish(); } catch (error) { errors.push(error); } + try { event.finish(); } catch (error) { + diagnostics.error("event.finish.failed", error, { eventName: event.name }); + errors.push(error); + } } notify(); return true; @@ -80,7 +91,10 @@ export function createBattleSession(id) { disposePromise = (async () => { // Reverse acquisition order; stop at first failure to preserve dependent resources. for (const [resource, release] of [...resources].reverse()) { - await release(resource); + await diagnostics.step("resource.release", () => release(resource), { + resourceType: resource?.constructor?.name, + playerId: resource?.playerid, nodeName: resource?.nodeName, + }); resources.delete(resource); owners.delete(resource); } for (const event of events) owners.delete(event); diff --git a/mengsan/battle/battle-settlement.js b/mengsan/battle/battle-settlement.js index 24114c5..6f10fd7 100644 --- a/mengsan/battle/battle-settlement.js +++ b/mengsan/battle/battle-settlement.js @@ -6,6 +6,7 @@ import { recordNormalBattleVictory } from "../progression/encounter-progress.js" import { stripBattleProgress } from "../progression/map-checkpoint.js"; import { grantGold } from "../relics/progression.js"; import { heldRelics } from "../relics/definitions.js"; +import { getDiagnostics } from "../../diagnostics/index.js"; import { prepareRewardPackage, applyRewardPackage } from "../progression/reward-package.js"; @@ -16,6 +17,11 @@ export function createBattleSettlement({ enterNextAct, createRun, now = Date.now, logRewardPackage = () => {}, resolveRelicChoices = async () => {}, }) { let item = null, committed = null, commitPromise = null, choicePromise = null, choiceSignature = null; + const diagnostics = getDiagnostics().scope("mengsan.settlement", () => ({ + settlementId: item?.id, runId: item?.base.runId, + nodeId: item?.nodeId, pendingState: item?.state, + route: item?.route, commitReceipt: !!committed, + })); const readRun = () => store.read()[config.saveKey]; function current(storage, runId) { const run = storage[config.saveKey]; @@ -29,6 +35,11 @@ export function createBattleSettlement({ function validateCheckpoint(run, snapshot, nodeId) { if (run.actIndex !== snapshot.actIndex || run.revision !== snapshot.revision || run.map?.nodes.find(node => node.id === nodeId)?.completed !== false) { + diagnostics.warn("checkpoint.mismatch", { + expectedRevision: snapshot.revision, actualRevision: run.revision, + expectedAct: snapshot.actIndex, actualAct: run.actIndex, + nodeId, completed: run.map?.nodes.find(node => node.id === nodeId)?.completed, + }); throw new Error("Stale node or revision"); } } @@ -78,6 +89,10 @@ export function createBattleSettlement({ getRandomRewardChoices) : null; item = {id, state:"awaitingChoice", nodeId:node.id, base, choices:copy(choices), fixedRewards:copy(fixedRewards), victoryDialogue:copy(encounter.victoryDialogue || []), boss:!!encounter.boss, elite, outcome, relicRecovery, bondGrowth}; item.rewardPackage = copy(rewardPackage); + diagnostics.info("prepared", { + outcome, choices: choices.map(choice => choice.id), fixedRewards, + expectedRevision: snapshot.revision, actualRevision: run.revision, + }); if (outcome === "victory" && !rewardPackage) { item.rewardMode = "one-or-skip"; } @@ -152,6 +167,7 @@ export function createBattleSettlement({ // 在内存锁定最终结果(包括随机牌实例),只在 commit 写入地图进度。 item.state = "chosen"; item.choiceId = copy(choiceId); item.result = stripBattleProgress(result); item.route = route; item.completedAt = now(); + diagnostics.info("choice.applied", { choiceId, route }); if (item.rewardPackage && item.outcome === "victory") { logRewardPackage(item.rewardPackage, choiceId); } @@ -160,8 +176,11 @@ export function createBattleSettlement({ async commit(runId, id) { const item = pending(runId, id); if (item.state !== "chosen") throw new Error("Player choice required before saving"); - if (committed) return {...copy(committed), duplicate:true}; - if (commitPromise) return commitPromise; + if (committed) { + diagnostics.info("commit.duplicate"); + return {...copy(committed), duplicate:true}; + } + if (commitPromise) { diagnostics.info("commit.inflight"); return commitPromise; } commitPromise = store.update(storage => { const saved = storage[config.saveKey]; const prior = storage[config.profileKey]?.completedRuns?.find(r => r.runId === runId && r.settlementId === id); @@ -191,8 +210,9 @@ export function createBattleSettlement({ else delete storage[config.saveKey]; // Same transaction as profile; never a second clear write. } return {route:item.route, run:item.route === "new" ? copy(item.nextRun) : result, duplicate:false}; - }).then(result => { + }, { runId, settlementId: id, nodeId: item.nodeId }).then(result => { committed = copy(result); + diagnostics.info("commit.receipt", { duplicate: result.duplicate, route: result.route }); return copy(committed); }).finally(() => { commitPromise = null; }); return commitPromise; diff --git a/mengsan/mode.js b/mengsan/mode.js index 4495ed7..0e9cfb1 100644 --- a/mengsan/mode.js +++ b/mengsan/mode.js @@ -64,7 +64,7 @@ import { STRANGLER_CHARACTER, isStrangler, rollStranglerHp, recordStranglerActio import { JAXFRUIT_CHARACTER, isJaxfruit, rollJaxfruitHp, recordJaxfruitAction } from "./monsters/jaxfruit-intent.js"; import { CRAWLER_CHARACTER, isCrawler, rollCrawlerHp, recordCrawlerAction } from "./monsters/crawler-intent.js"; import { INKLET_CHARACTER, isInklet, rollInkletHp, recordInkletAction, capInkletHpLoss } from "./monsters/inklet-intent.js"; -import { mountEnemyIntent } from "./ui/intent-display.js"; +import { mountEnemyIntent, refreshEnemyIntents } from "./ui/intent-display.js"; import { createFogmogBattle } from "./monsters/fogmog-battle.js"; import { createPhrogBattle } from "./monsters/phrog-battle.js"; import { PHROG_CHARACTER, WRIGGLER_CHARACTER, INFESTED_COUNT, isPhrogActor, isWriggler, rollPhrogHp, rollWrigglerHp, recordPhrogAction, initializePhrog, skipSpawnedWriggler } from "./monsters/phrog-intent.js"; @@ -96,6 +96,7 @@ import { mountGMManager } from "./ui/gm-manager.js"; import { createPlayerTeardown } from "./battle/skill-teardown.js"; import { createBattleResources } from "./battle/battle-resources.js"; import { createModeStorage } from "./progression/mode-storage.js"; +import { getDiagnostics } from "../diagnostics/index.js"; import { createBattleSession } from "./battle/battle-session.js"; import { observeFreshEvent } from "./battle/engine-session.js"; import { runPhaseLoop, stopBattleTurn } from "./battle/battle-loop.js"; @@ -143,7 +144,26 @@ const clearRun = modeStorage.clearRun; const showMap = run => renderMap(run, { saveRun }); let battleSequence = 0; let activeBattle = null; -const reportFlowError = error => { console.error("梦三流程暂停,未自动清档:", error); }; +const diagnosticService = getDiagnostics(); +const diagnostics = diagnosticService.scope("mengsan.mode"); +diagnosticService.registerContext("mengsan", () => { + const run = _status.mengsanRun_shuying; + const manager = _status.eventManager; + return { + runId: run?.runId, revision: run?.revision, actIndex: run?.actIndex, + character: run?.player?.character, hp: run?.player?.hp, + sessionId: activeBattle?.session.id, + flowState: activeBattle?.flow.state, pendingTasks: activeBattle?.session.pendingCount, + save: modeStorage.lastWrite, + engine: { paused: _status.paused, paused2: _status.paused2, + tempEvent: manager?.tempEvent?.name, + eventStack: manager?.eventStack?.slice(-8).map(event => ({ name: event?.name })) }, + }; +}); +const reportFlowError = error => { + diagnostics.error("journey.failed", error); + console.error("梦三流程暂停,未自动清档:", error); +}; const chooseRun = async savedRun => { const available = savedRun?.status === "running"; @@ -663,7 +683,7 @@ const prepareBattle = async (run, node, encounter, session, resources) => { }); for (const skill of [ "mengsan_draw_shuying", "mengsan_card_use_shuying", "mengsan_ic_bridge_shuying", "mengsan_shared_bridge_shuying", - "mengsan_card_affixes_shuying", "mengsan_scenario_shuying", + "mengsan_card_affixes_shuying", "mengsan_scenario_shuying", "mengsan_intent_refresh_shuying", "mengsan_card_payment_shuying", "mengsan_monster_draw_shuying", "mengsan_flyconid_action_shuying", "mengsan_raider_action_shuying", "mengsan_fogmog_action_shuying", "mengsan_mawler_action_shuying", @@ -756,8 +776,9 @@ const registerPlayers = (session, players) => { }); } }; -const makeFlow = (releaseSkills = async () => {}) => createBattleFlow({ +const makeFlow = (releaseSkills = async () => {}, releaseBattle = () => {}) => createBattleFlow({ releaseSkills, + releaseBattle, presentVictory: pending => { if (pending.bondGrowth) { const growth = pending.bondGrowth; @@ -803,7 +824,10 @@ const requestBattleFinish = outcome => { const current = activeBattle; if (!current) return false; // Complete the original card and all queued replays before snapshotting a victory. - if(outcome==="victory" && current.sharedPendingUses?.size){current.sharedDeferredVictory=true;return false;} + if(outcome==="victory" && current.sharedPendingUses?.size){ + diagnostics.info("victory.deferred", { pendingUses: current.sharedPendingUses.size }); + current.sharedDeferredVictory=true;return false; + } for (const player of game.dead) { recordBondDeath(player, _status.mengsanRun_shuying, message => game.log(message)); @@ -826,10 +850,12 @@ const awaitSettlement = async (flow, initial = flow.wait()) => { try { return await operation; } catch (error) { if (flow.state !== "retryable") throw error; + diagnostics.error("settlement.prompt", error, { flowState: flow.state }); const action = await chooseButtons("结算未完成", [ {id:"retry",name:"重试保存与结算"}, {id:"exit",name:"保留已保存进度并返回模式选择"}, ], "已提交的奖励不会重发。技能释放失败时请返回模式选择,避免重复调用释放回调。"); + diagnostics.info("settlement.prompt.action", { action }); if (action === "exit") { await openModeSelection(); throw error; } operation = flow.retry(); } @@ -840,14 +866,20 @@ const playBattle = async (run, node, encounter) => { if (lib.onfree) await new Promise(resolve => lib.onfree.push(resolve)); await quiesceEngine(_status); const session = createBattleSession(`${run.runId}:${++battleSequence}`); - const resources = createBattleResources(session, {game,ui,_status}); - let current; - const flow = makeFlow(() => current.releaseSkills?.()); + let resources = createBattleResources(session, {game,ui,_status}); + let current, root; + const flow = makeFlow(() => current.releaseSkills?.(), () => { + if (activeBattle === current) activeBattle = null; + for (const key of Object.keys(current)) { + if (key !== "session" && key !== "flow") delete current[key]; + } + root = null; resources = null; + }); let finished; const signal = new Promise(resolve => { finished = resolve; }); current = {session, flow, finished, resources, players: new Set(), monsterPiles: new Map(), energyUI: new Map(), intentUI: new Map()}; activeBattle = current; - const root = new lib.element.GameEvent("mengsanBattle", false, _status.eventManager); + root = new lib.element.GameEvent("mengsanBattle", false, _status.eventManager); current.root = root; const previousRoot = _status.eventManager.rootEvent; session.ownResource({}, () => { @@ -1756,6 +1788,15 @@ const createMode = () => { else player.removeSkill("mengsan_vulnerable_shuying"); }, }, + mengsan_intent_refresh_shuying: { + trigger: { global: ["useCardAfter", "useSkillAfter", "respondAfter", "changeHpAfter", "dieAfter", "phaseAfter"] }, + forced: true, silent: true, popup: false, priority: -1000, + filter() { return Boolean(activeBattle?.session.active); }, + async content() { + const session = activeBattle?.session; + if (session?.active) refreshEnemyIntents(session); + }, + }, mengsan_scenario_shuying: { trigger: { global: ["changeHpAfter", "gainAfter", "loseAfter", "dieAfter", "turnOverAfter", "linkAfter", "phaseAfter"] }, forced: true, silent: true, popup: false, priority: -100, diff --git a/mengsan/progression/mode-storage.js b/mengsan/progression/mode-storage.js index 94735a8..13cbe4a 100644 --- a/mengsan/progression/mode-storage.js +++ b/mengsan/progression/mode-storage.js @@ -1,8 +1,11 @@ // Candidate factory. Storage writer body reused from batch2 MODIFIED_STORAGE.js. import { migrateRetiredCards } from "../cards/retired-cards.js"; import { stripBattleProgress } from "./map-checkpoint.js"; +import { getDiagnostics } from "../../diagnostics/index.js"; export function createModeStorage({lib, game, config, localStorage, alert = () => {}, console = globalThis.console}) { const MODE_ID = config.modeId; +const diagnostics = getDiagnostics().scope("mengsan.storage"); +let writeSequence = 0, lastWrite = null; const copy = value => JSON.parse(JSON.stringify(value)); @@ -16,10 +19,14 @@ const copyStorage = () => { // Keep one mode-level writer; a failed write must not poison later retries. let modeStorageQueue = Promise.resolve(); -const writeModeStorage = storage => { +const writeModeStorage = (storage, receipt) => { + receipt.phase = "storage.write"; + receipt.storageStatus = "pending"; if (!lib.db) { // Do not switch backends after an IndexedDB error: that creates two saves. localStorage.setItem(`${lib.configprefix}${MODE_ID}`, JSON.stringify(storage)); + receipt.storageStatus = "committed"; + diagnostics.info("storage.committed", receipt); return Promise.resolve(); } return new Promise((resolve, reject) => { @@ -28,11 +35,18 @@ const writeModeStorage = storage => { try { // game.putDB resolves at request success, which is before commit. transaction = lib.db.transaction(["data"], "readwrite"); - transaction.oncomplete = () => resolve(); + transaction.oncomplete = () => { + receipt.storageStatus = "committed"; + diagnostics.info("transaction.committed", receipt); + resolve(); + }; transaction.onerror = event => { requestError = event.target?.error; }; - transaction.onabort = () => reject(transaction.error || requestError || new Error("梦三存档事务已中止")); + transaction.onabort = () => { + receipt.storageStatus = "aborted"; + reject(transaction.error || requestError || new Error("梦三存档事务已中止")); + }; transaction.objectStore("data").put(storage, MODE_ID); } catch (error) { @@ -45,18 +59,39 @@ const writeModeStorage = storage => { }); }; -const persistModeStorage = (update = () => {}) => { +const persistModeStorage = (update = () => {}, context = {}) => { + const receipt = { ...context, writeId: ++writeSequence, phase: "queued", + backend: lib.db ? "indexeddb" : "localStorage", + storageStatus: "notStarted", memoryPublished: false }; + diagnostics.info("save.queued", receipt); // Hold the engine reload guard from enqueue through commit and publication. // reload2 also drains the engine's queued database operations on release. lib.status.reload++; const operation = modeStorageQueue.then(async () => { + lastWrite = receipt; + receipt.phase = "snapshot"; const storage = copyStorage(); + receipt.phase = "mutator"; update(storage); stripBattleProgress(storage[config.saveKey]); storage.version = lib.version; - await writeModeStorage(storage); + await writeModeStorage(storage, receipt); + receipt.phase = "memory.publish"; lib.storage = storage; - }).finally(() => game.reload2()); + receipt.memoryPublished = true; + diagnostics.info("memory.published", receipt); + }).catch(error => { + diagnostics.error("save.failed", error, receipt); + throw error; + }).finally(() => { + receipt.phase = "reloadGuard.release"; + try { game.reload2(); } + catch (error) { + diagnostics.error("reloadGuard.failed", error, receipt); + throw error; + } + diagnostics.info("save.finished", receipt); + }); modeStorageQueue = operation.catch(() => {}); return operation; }; @@ -67,9 +102,11 @@ const saveRun = async run => { const snapshot = migrateRetiredCards(stripBattleProgress(copy(run))); await persistModeStorage(storage => { storage[config.saveKey] = snapshot; - }); + }, { runId: snapshot.runId, revision: snapshot.revision }); } catch (error) { + diagnostics.error("saveRun.failed", error, + { runId: run?.runId, revision: run?.revision, lastWrite }); // Neither delete the previous save nor attempt a second destructive write. alert("梦三存档失败,未覆盖上一次成功保存的进度。当前进度尚未保存,请勿刷新,并查看控制台错误。"); console.error("梦三存档失败:", error); @@ -87,13 +124,14 @@ const clearRun = async () => { return Object.freeze({ read: copyStorage, + get lastWrite() { return lastWrite ? { ...lastWrite } : null; }, saveRun, clearRun, - async update(mutator) { + async update(mutator, context = {}) { let value; await persistModeStorage(storage => { value = mutator(storage); if (value && typeof value.then === "function") throw new TypeError("Storage mutator must be synchronous"); - }); + }, context); return value === undefined ? undefined : copy(value); }, }); diff --git a/mengsan/ui/bonds.js b/mengsan/ui/bonds.js index 23f9c8e..72e453e 100644 --- a/mengsan/ui/bonds.js +++ b/mengsan/ui/bonds.js @@ -2,6 +2,7 @@ import { bondDefinitions, getBondCombat, getBondDeck } from "../bonds/definitions.js"; import { getBondIntents } from "../bonds/intents.js"; import { bondProbability, ensureBonds, selectBond } from "../bonds/state.js"; +import { getDiagnostics } from "../../diagnostics/index.js"; export function renderBonds(parent, run, saveRun, onBusy = () => {}) { const bonds = ensureBonds(run); @@ -33,6 +34,8 @@ export function renderBonds(parent, run, saveRun, onBusy = () => {}) { updated.querySelector('button[aria-pressed="true"]') ?.focus({ preventScroll: true }); } catch (error) { + getDiagnostics().scope("mengsan.bonds").error("selection.save.failed", error, + { runId: run.runId, revision: run.revision, bondId: id }); selectBond(run, previous); status.textContent = "保存失败,请重试。"; console.error("梦三助战选择保存失败", error); diff --git a/mengsan/ui/card-library.js b/mengsan/ui/card-library.js index 006a15c..2a164b2 100644 --- a/mengsan/ui/card-library.js +++ b/mengsan/ui/card-library.js @@ -132,15 +132,26 @@ export function openCardLibrary(run, options = {}) { if (typeof window !== "undefined") window.removeEventListener?.("resize", fitCards); if (dialog.open) dialog.close(); dialog.remove(); + list.replaceChildren(); detailPanel.replaceChildren(); body.replaceChildren(); + dialog.replaceChildren(); + catalogRecords = null; descriptionCache = new WeakMap(); + selectedButton = null; current = []; + virtualGrid = null; sizeObserver = null; if (previousFocus?.isConnected) previousFocus.focus(); + const onClose = options.onClose; + options = {}; run = null; + onClose?.(close); }; button("关闭", header, close); let view = !options.sections && options.view === "catalog" ? "catalog" : "deck"; const navigation = element("nav", "ms-deck-tabs", null, dialog); navigation.setAttribute("aria-label", "卡牌列表视图"); - navigation.hidden = Boolean(options.sections); const deckTab = button("持有牌", navigation, () => { view = "deck"; render(); }); const catalogTab = button("图鉴", navigation, () => { view = "catalog"; render(); }); + deckTab.hidden = catalogTab.hidden = Boolean(options.sections); + let sectionIndex = 0; + const sectionTabs = options.sections ? options.sections().map((section, index) => + button(section.title, navigation, () => { sectionIndex = index; render(); })) : []; const filters = element("div", "ms-catalog-filters", null, dialog); function field(label) { const wrapper = element("label", "ms-catalog-field", null, filters); @@ -179,13 +190,13 @@ export function openCardLibrary(run, options = {}) { summary.setAttribute("aria-live", "polite"); const body = element("div", "ms-deck-body", null, dialog); const footer = element("p", "ms-deck-footer", "点击卡牌查看完整介绍 · 仅供查看,不改变牌组或抽牌顺序", dialog); - const current = Array.isArray(run?.player?.deck) ? run.player.deck : []; - let detail = false, selectedButton = null, scrollTop = 0; - const list = element("div", options.sections ? "ms-deck-grid" : "ms-deck-grid ms-library-grid", null, body); + let current = Array.isArray(run?.player?.deck) ? run.player.deck : []; + let detail = false, selectedButton = null, scrollTop = 0, orderedView = false; + const list = element("div", "ms-deck-grid ms-library-grid", null, body); const detailPanel = element("section", "ms-deck-detail", null, body); detailPanel.hidden = true; let catalogRecords = null, descriptionCache = new WeakMap(); - if (!options.sections) virtualGrid = createVirtualCardGrid(body, list, createTile); + virtualGrid = createVirtualCardGrid(body, list, createTile); function back() { detail = false; detailPanel.hidden = true; list.hidden = false; detailPanel.replaceChildren(); body.scrollTop = scrollTop; fitCards(); @@ -214,12 +225,13 @@ export function openCardLibrary(run, options = {}) { body.scrollTop = 0; backButton.focus(); } function fitCards() { - if (options.sections || closed || !body.clientHeight) return; + if (closed || !body.clientHeight) return; const padding = getComputedStyle(body); const available = body.clientHeight - parseFloat(padding.paddingTop) - parseFloat(padding.paddingBottom); - const height = Math.max(64, Math.min(218, Math.floor((available - 8) / 2))); + const rows = available >= 264 ? 2 : 1; + const height = Math.max(128, Math.min(218, Math.floor((available - (rows - 1) * 8) / rows))); dialog.style.setProperty("--ms-card-height", String(height) + "px"); - dialog.style.setProperty("--ms-card-art-width", String(Math.max(8, Math.min(98, Math.floor((height - 80) * 5 / 7)))) + "px"); + dialog.style.setProperty("--ms-card-art-width", String(Math.max(8, Math.min(98, Math.floor((height - (orderedView ? 104 : 80)) * 5 / 7)))) + "px"); virtualGrid?.layout(height); } function createTile(record, index) { @@ -240,7 +252,6 @@ export function openCardLibrary(run, options = {}) { clearTimeout(searchTimer); detail = false; list.hidden = false; detailPanel.hidden = true; detailPanel.replaceChildren(); - if (!virtualGrid) list.replaceChildren(); body.scrollTop = 0; selectedButton = null; const catalog = !options.sections && view === "catalog"; @@ -248,8 +259,22 @@ export function openCardLibrary(run, options = {}) { deckTab.setAttribute("aria-pressed", String(!catalog)); catalogTab.setAttribute("aria-pressed", String(catalog)); list.classList.toggle("ms-catalog-grid", catalog); - let records = []; - if (catalog) { + let records = [], emptyMessage = "此处暂无卡牌。"; + orderedView = false; + if (options.sections) { + const sections = options.sections(); + const section = sections[sectionIndex]; + orderedView = Boolean(section?.ordered); + if (section?.ordered) emptyMessage = "剩余牌堆为空;下一次摸牌需按规则洗切弃牌堆,洗切后的顺序尚未确定。"; + sectionTabs.forEach((tab, index) => { + tab.textContent = `${sections[index].title} · ${sections[index].cards.length}`; + tab.setAttribute("aria-pressed", String(index === sectionIndex)); + }); + records = (section?.cards || []).map(card => ({ card, ordered: section.ordered })); + summary.textContent = section?.ordered + ? "剩余牌堆按从左到右、从上到下的顺序摸取;第 1 张为下一张。" + : `${section?.title || "牌堆"} · 共 ${records.length} 张`; + } else if (catalog) { const query = search.value.trim().toLocaleLowerCase(); catalogRecords ||= getCardCatalog().map(card => { const details = describeCatalogCard(card); @@ -273,24 +298,11 @@ export function openCardLibrary(run, options = {}) { } footer.textContent = catalog ? "图鉴仅供查阅,不会获得卡牌或改变征程牌组 · 点击卡牌查看完整介绍" : "点击卡牌查看完整介绍 · 仅供查看,不改变牌组或抽牌顺序"; - if (virtualGrid) { - virtualGrid.setRecords(catalog ? records : current.map(card => ({ card }))); - if (!(catalog ? records : current).length) { - element("p", "ms-deck-empty", catalog ? "没有符合筛选的卡牌,可清空筛选后查看全部图鉴。" : "此处暂无卡牌。", list); - } - fitCards(); - return; - } - const sections = catalog ? [{ title: "", cards: records.map(record => record.card) }] : - options.sections ? options.sections() : [{ title: "", cards: current }]; - for (const section of sections) { - const cards = section.cards; - if (section.title) element("h3", "ms-deck-section", `${section.title} · ${cards.length} 张`, list); - if (!cards.length) element("p", "ms-deck-empty", catalog ? "没有符合筛选的卡牌,可清空筛选后查看全部图鉴。" : section.ordered ? "剩余牌堆为空;下一次摸牌需按规则洗切弃牌堆,洗切后的顺序尚未确定。" : "此处暂无卡牌。", list); - cards.forEach((card, index) => { - list.appendChild(createTile({ card, ordered: section.ordered }, index)); - }); + virtualGrid.setRecords(catalog || options.sections ? records : current.map(card => ({ card }))); + if (!(catalog || options.sections ? records : current).length) { + element("p", "ms-deck-empty", catalog ? "没有符合筛选的卡牌,可清空筛选后查看全部图鉴。" : emptyMessage, list); } + fitCards(); } dialog.addEventListener("cancel", event => { event.preventDefault(); if (detail) back(); else close(); }); dialog.addEventListener("close", close); @@ -300,10 +312,10 @@ export function openCardLibrary(run, options = {}) { document.body.appendChild(dialog); try { dialog.showModal(); } catch (error) { close(); throw error; } fitCards(); - if (!options.sections && typeof ResizeObserver !== "undefined") { + if (typeof ResizeObserver !== "undefined") { sizeObserver = new ResizeObserver(fitCards); sizeObserver.observe(body); - } else if (!options.sections && typeof window !== "undefined") { + } else if (typeof window !== "undefined") { window.addEventListener?.("resize", fitCards); } header.querySelector("button").focus(); @@ -327,6 +339,7 @@ export function mountBattlePiles(session, battle) { closeDialog?.(); closeDialog = openCardLibrary(null, { title: "战斗牌堆", eyebrow: "梦三 · 个人牌堆", + onClose(handle) { if (closeDialog === handle) closeDialog = null; }, sections: () => [ { title: "剩余牌堆", cards: battle.drawPile, ordered: true }, { title: "弃牌堆", cards: battle.discardPile, ordered: false }, diff --git a/mengsan/ui/hand/diagnostics.js b/mengsan/ui/hand/diagnostics.js index 085fbd2..b28d2b1 100644 --- a/mengsan/ui/hand/diagnostics.js +++ b/mengsan/ui/hand/diagnostics.js @@ -1,8 +1,17 @@ +import { getDiagnostics } from "../../../diagnostics/index.js"; + const lines = []; let pendingWrite = Promise.resolve(); export function createHandDiagnostics(game, sessionId) { + const service = getDiagnostics(); + const diagnostics = service.scope("mengsan.hand", { sessionId }); return (message, error) => { + if (service.status().enabled) { + if (error) diagnostics.error("hand.failed", error, { message }); + else diagnostics.info("hand.message", { message }); + return; + } const line = `${new Date().toISOString()} [${sessionId}] ${message}` + (error ? ` ${error.message || error}` : ""); console[error ? "warn" : "info"](`梦三手牌 UI:${line}`); diff --git a/mengsan/ui/hand/index.js b/mengsan/ui/hand/index.js index 8d56066..27c050f 100644 --- a/mengsan/ui/hand/index.js +++ b/mengsan/ui/hand/index.js @@ -20,6 +20,7 @@ export async function mountHandUI(player, session, env) { let disposed = false; let observer, resizeObserver, pointer = null, nativeInput = false; let finishStyleLoad = null, refreshTimer = null; + let refreshFrame = null; const touchScrollClasses = new Map(); let layoutEnabled = false, warned = false; const log = (message, error) => { @@ -72,6 +73,15 @@ export async function mountHandUI(player, session, env) { } overlays.sync(adapter.cards()); } + function scheduleRefresh() { + if (disposed || document.hidden || refreshFrame !== null) return; + const draw = () => { + refreshFrame = null; + if (!document.hidden) refresh(); + }; + refreshFrame = typeof window.requestAnimationFrame === "function" + ? window.requestAnimationFrame(draw) : window.setTimeout(draw, 16); + } function listen(target, type, listener, options) { target.addEventListener(type, listener, options); restores.push(() => target.removeEventListener(type, listener, options)); @@ -120,6 +130,11 @@ export async function mountHandUI(player, session, env) { if (disposed || !nativeInput) return; nativeInput = false; window.clearTimeout(refreshTimer); + if (refreshFrame !== null) { + if (typeof window.requestAnimationFrame === "function") window.cancelAnimationFrame(refreshFrame); + else window.clearTimeout(refreshFrame); + refreshFrame = null; + } refreshTimer = window.setTimeout(refresh, 0); } function restoreTouchScroll() { @@ -154,6 +169,11 @@ export async function mountHandUI(player, session, env) { disposed = true; finishStyleLoad?.(); window.clearTimeout(refreshTimer); + if (refreshFrame !== null) { + if (typeof window.requestAnimationFrame === "function") window.cancelAnimationFrame(refreshFrame); + else window.clearTimeout(refreshFrame); + refreshFrame = null; + } restoreTouchScroll(); observer?.disconnect(); resizeObserver?.disconnect(); @@ -201,7 +221,7 @@ export async function mountHandUI(player, session, env) { listen(container, "touchend", () => restoreTouchScroll(), true); listen(container, "touchcancel", () => restoreTouchScroll(), true); } - observer = new window.MutationObserver(refresh); + observer = new window.MutationObserver(scheduleRefresh); for (const zone of adapter.zones) { observer.observe(zone, { childList: true, subtree: true, attributes: true, attributeFilter: ["class"] }); @@ -211,7 +231,7 @@ export async function mountHandUI(player, session, env) { observer.observe(adapter.root.parentNode, { childList: true }); } if (window.ResizeObserver && adapter.root) { - resizeObserver = new window.ResizeObserver(refresh); + resizeObserver = new window.ResizeObserver(scheduleRefresh); resizeObserver.observe(adapter.root); } if (window.PointerEvent && adapter.root) { @@ -221,6 +241,7 @@ export async function mountHandUI(player, session, env) { listen(window, "pointercancel", endInput, true); listen(window, "blur", () => endInput()); } + listen(document, "visibilitychange", scheduleRefresh); refresh(); diagnose(`已挂载手牌 UI,独立排列=${layoutEnabled}`); return { refresh, dispose }; diff --git a/mengsan/ui/intent-display.js b/mengsan/ui/intent-display.js index 22fbc20..03d10dc 100644 --- a/mengsan/ui/intent-display.js +++ b/mengsan/ui/intent-display.js @@ -2,6 +2,56 @@ import { attackHitCount, previewAttackDamage } from "../battle/intent-damage.js"; import { isDeathBlowIntent } from "../battle/death-blow.js"; import { isStunIntent } from "../battle/stun-intent.js"; +import { getDiagnostics } from "../../diagnostics/index.js"; + +const intentPollers = new WeakMap(); +const intentFields = ["damage", "hits", "intentType", "summon", "slimed", "infection", + "wound", "ringing", "plow", "dazed", "debuff", "stacks", "block", "strength", "sleep", "shrink"]; + +export function refreshEnemyIntents(session) { + intentPollers.get(session)?.schedule(); +} + +function observeIntents(session, document, update) { + let group = intentPollers.get(session); + if (!group) { + const callbacks = new Set(); + const host = document.defaultView || globalThis; + let frame = null; + const tick = () => { + if (document.hidden || session.active === false) return; + for (const callback of callbacks) { + try { callback(); } + catch (error) { + getDiagnostics().scope("mengsan.intent").error("refresh.failed", error); + } + } + }; + const schedule = () => { + if (frame !== null || document.hidden) return; + const draw = () => { frame = null; tick(); }; + frame = host.requestAnimationFrame ? host.requestAnimationFrame(draw) : host.setTimeout(draw, 16); + }; + const timer = host.setInterval(tick, 500); + timer?.unref?.(); + document.addEventListener?.("visibilitychange", schedule); + group = { callbacks, schedule, dispose() { + host.clearInterval(timer); + if (frame !== null) { + if (host.requestAnimationFrame) host.cancelAnimationFrame(frame); + else host.clearTimeout(frame); + } + document.removeEventListener?.("visibilitychange", schedule); + intentPollers.delete(session); + } }; + intentPollers.set(session, group); + } + group.callbacks.add(update); + return () => { + group.callbacks.delete(update); + if (!group.callbacks.size) group.dispose(); + }; +} export function attackIconForDamage(damage) { if (!Number.isInteger(damage) || damage < 0) { @@ -60,9 +110,9 @@ export function mountEnemyIntent(player, session, assetBase, document, badge.append(damageLine, debuffLine, blockLine, buffLine); player.appendChild(badge); let currentIntent = null; - let timer; + let previous = null, unsubscribe = () => {}; session.ownResource(badge, () => { - clearInterval(timer); + unsubscribe(); previous = null; currentIntent = null; badge.remove(); }); const refresh = () => { @@ -180,9 +230,23 @@ export function mountEnemyIntent(player, session, assetBase, document, if (badge.getAttribute("aria-label") !== label) badge.setAttribute("aria-label", label); badge.hidden = false; }; - timer = setInterval(refresh, 100); + const poll = () => { + const values = intentFields.map(key => currentIntent?.[key]); + values.push(player.maxHp); + if (currentIntent?.damage != null) { + const target = getTarget(); + const targets = Array.isArray(target) ? target : [target]; + for (const current of targets.length ? targets : [null]) { + values.push(previewAttackDamage(currentIntent, player, current)); + } + } + if (previous && previous.length === values.length && values.every((value, index) => Object.is(value, previous[index]))) return; + refresh(); previous = values; + }; + unsubscribe = observeIntents(session, document, poll); return intent => { currentIntent = intent; - refresh(); + previous = null; + poll(); }; } diff --git a/mengsan/ui/map/renderer.js b/mengsan/ui/map/renderer.js index bd4aa54..e35cdfd 100644 --- a/mengsan/ui/map/renderer.js +++ b/mengsan/ui/map/renderer.js @@ -6,6 +6,7 @@ import { getRelic } from "../../relics/definitions.js"; import { createRelicIcon } from "../relic-icon.js"; import { renderBonds } from "../bonds.js"; import { getSelectableNodes } from "../../progression/state.js"; +import { getDiagnostics } from "../../../diagnostics/index.js"; // Original vector pictograms; no external image/font requests. const iconPaths = { @@ -187,6 +188,8 @@ export const showMap = (run, { saveRun } = {}) => new Promise(resolve => { if (result === "exit") await openModeSelection(); } catch (error) { console.error(error); + getDiagnostics().scope("mengsan.map").error("map.operation.failed", error, + { runId: run.runId, revision: run.revision }); await askMenu("暂时无法返回", "征程未被清除,请重试。", [{ id: "close", name: "关闭提示" }]); } finally { exitButton.disabled = false; } }); @@ -258,7 +261,9 @@ export const showMap = (run, { saveRun } = {}) => new Promise(resolve => { createText("mengsan-map-menu-action-name-shuying", "卡牌库", copy); createText("mengsan-map-menu-action-description-shuying", `共 ${run.player.deck.length} 张 · 查看花色、点数、属性和卡牌详情`, copy); library.appendChild(copy); - library.addEventListener("click", () => { closeCardLibrary = openCardLibrary(run); }); + library.addEventListener("click", () => { closeCardLibrary = openCardLibrary(run, { + onClose(handle) { if (closeCardLibrary === handle) closeCardLibrary = null; }, + }); }); parent.appendChild(library); const appendNames = (title, values, emptyText) => { createText("mengsan-map-inventory-section-title-shuying", title, parent); @@ -308,7 +313,10 @@ export const showMap = (run, { saveRun } = {}) => new Promise(resolve => { if (back) back.disabled = busy; }), ".mengsan-bonds-shuying button") }); createMenuAction({ icon: "book", name: "图鉴", description: "卡牌图鉴 · 查看全部梦三卡牌、效果与费用", - onClick: () => { closeCardLibrary = openCardLibrary(run, { view: "catalog", title: "卡牌图鉴", eyebrow: "梦三 · 图鉴" }); } + onClick: () => { closeCardLibrary = openCardLibrary(run, { + view: "catalog", title: "卡牌图鉴", eyebrow: "梦三 · 图鉴", + onClose(handle) { if (closeCardLibrary === handle) closeCardLibrary = null; }, + }); } }).setAttribute("aria-haspopup", "dialog"); createMenuAction({ icon: "record", name: "征程记录", description: `已通过 ${run.statistics?.completedNodes || 0} 个节点`, onClick: () => showMenuPage("征程记录", "本次征程的阶段统计", parent => { const list = ui.create.div(".mengsan-map-record-list-shuying", parent); @@ -326,6 +334,7 @@ export const showMap = (run, { saveRun } = {}) => new Promise(resolve => { try { await openNonameMenu(); } catch (error) { console.error("梦三打开 Noname 菜单失败:", error); + getDiagnostics().scope("mengsan.map").error("menu.open.failed", error); await askMenu("暂时无法显示菜单", error.message || "请稍后重试。", [{ id: "close", name: "回到行军图" }]); } }, diff --git a/mengsan/ui/navigation.js b/mengsan/ui/navigation.js index dceff32..5aaa875 100644 --- a/mengsan/ui/navigation.js +++ b/mengsan/ui/navigation.js @@ -1,5 +1,6 @@ import { lib, game, ui, _status } from "../../../../noname.js"; import { save } from "../../../../noname/util/config.js"; +import { getDiagnostics } from "../../diagnostics/index.js"; let selectingMode = false; let nonameMenuTask = null; @@ -50,7 +51,10 @@ export const openNonameMenu = async () => { if (initiallyHidden) { try { if (!container.classList.contains("hidden")) ui.click.configMenu(); - } catch (closeError) { console.error("Noname 菜单关闭失败:", closeError); } + } catch (closeError) { + getDiagnostics().scope("mengsan.navigation").error("menu.close.failed", closeError); + console.error("Noname 菜单关闭失败:", closeError); + } if (wasPaused) game.pause2(); else game.resume2(); } @@ -170,6 +174,7 @@ export const mountMenu = (overlay, options = {}) => { if (confirmed === "confirm") await openModeSelection(); } catch (error) { console.error("梦三菜单操作失败:", error); + getDiagnostics().scope("mengsan.navigation").error("menu.operation.failed", error); await askMenu(action === "noname" ? "暂时无法显示菜单" : "暂时无法返回", action === "noname" ? error.message || "请关闭提示后重试。" : "没有清除征程。请关闭提示后重试。", [{ id: "close", name: "回到当前界面" }]); diff --git a/mengsan/ui/virtual-card-grid.js b/mengsan/ui/virtual-card-grid.js index db56e28..268e95c 100644 --- a/mengsan/ui/virtual-card-grid.js +++ b/mengsan/ui/virtual-card-grid.js @@ -1,6 +1,8 @@ // 保留完整滚动高度,只挂载可见行与上下各两行;滚动时不重建仍可见的卡牌。 export function createVirtualCardGrid(viewport, grid, createCard) { const mounted = new Map(); + const cached = new Map(); + const maxCached = 24; let records = [], columns = 1, height = 218, gap = 8, padding = 5, viewportHeight = 0; let frame = 0, disposed = false; function draw() { @@ -14,11 +16,14 @@ export function createVirtualCardGrid(viewport, grid, createCard) { for (const [index, node] of mounted) { if ((index < first || index >= end) && node !== document.activeElement) { node.remove(); mounted.delete(index); + cached.set(index, node); + while (cached.size > maxCached) cached.delete(cached.keys().next().value); } } for (let index = first; index < end; index++) { if (mounted.has(index)) continue; - const node = createCard(records[index], index); + const node = cached.get(index) || createCard(records[index], index); + cached.delete(index); node.dataset.cardIndex = String(index); node.style.gridRow = String(Math.floor(index / columns) + 1); node.style.gridColumn = String(index % columns + 1); @@ -75,7 +80,7 @@ export function createVirtualCardGrid(viewport, grid, createCard) { return { setRecords(value) { // 调用方更新筛选栏后再统一量尺寸,避免用旧高度先生成一批预览。 - records = value; mounted.clear(); grid.replaceChildren(); + records = value; mounted.clear(); cached.clear(); grid.replaceChildren(); }, layout, focus, @@ -84,7 +89,8 @@ export function createVirtualCardGrid(viewport, grid, createCard) { disposed = true; cancelAnimationFrame(frame); viewport.removeEventListener("scroll", schedule); grid.removeEventListener("keydown", keydown); - mounted.clear(); records = []; + mounted.clear(); cached.clear(); records = []; + grid.replaceChildren(); }, }; } diff --git a/menu.js b/menu.js index 62396a5..f62797f 100644 --- a/menu.js +++ b/menu.js @@ -383,6 +383,21 @@ export default function initShuYingMenu({ lib, game, ui, shuYing, updater }) { }, }; + menu.diagnosticLogs = { + name: "诊断日志位置", + clear: true, + async onclick() { + await shuYing.diagnostics?.flush(); + const status = shuYing.diagnostics?.status(); + if (!status?.enabled) { alert("诊断日志尚未初始化。"); return; } + const report = status.latestReport; + alert(`日志位置:${status.location}\n` + + (report ? `最近报告:${report.file}\n保存状态:${report.persisted ? "已保存" : "最新报告尚未保存"}` + + (report.savedStorage ? `\n报告位置:${report.savedStorage.location}` : "") : "本次运行尚无错误报告。") + + (status.unavailable ? "\n持久化失败,后续诊断记录仅保留在当前运行内存。" : "")); + }, + }; + const mengsanLabelId = "shuying_mengsan_module_status"; const mengsanStates = { checking: ["检测中", "请稍候"], @@ -416,6 +431,7 @@ export default function initShuYingMenu({ lib, game, ui, shuYing, updater }) { try { status = await updater.getMengsanModuleStatus(); } catch (error) { console.error("读取梦三安装状态失败:", error); + shuYing.diagnostics?.scope("menu").error("module.status.failed", error); status = "unknown"; } if (request == mengsanStatusRequest) renderMengsanStatus(status); diff --git a/pve/images/青青子衿/simayi_boss_shuying.jpg b/pve/images/青青子衿/simayi_boss_shuying.jpg index 23da0e8..785b6de 100644 Binary files a/pve/images/青青子衿/simayi_boss_shuying.jpg and b/pve/images/青青子衿/simayi_boss_shuying.jpg differ diff --git a/tools/manifest_config.json b/tools/manifest_config.json index 98a3b22..801a1a1 100644 --- a/tools/manifest_config.json +++ b/tools/manifest_config.json @@ -4,6 +4,9 @@ "menu.js", "function.js", "update.js", + "diagnostics/index.js", + "diagnostics/serialize.js", + "diagnostics/storage.js", "tianshu/extension.js", "tianshu/config.js", "pve/boss/index.js", diff --git a/update.js b/update.js index b0604f7..a1f0863 100644 --- a/update.js +++ b/update.js @@ -292,6 +292,8 @@ async function writeLog(shuYing) { function addLog(shuYing, message) { if (!shuYing) return; + try { shuYing.diagnostics?.scope("updater").info("update.message", { message }); } + catch {} if (!Array.isArray(shuYing._updateLogs)) { shuYing._updateLogs = []; @@ -305,6 +307,14 @@ function addLog(shuYing, message) { } } +function recordUpdateError(shuYing, event, error, context = {}) { + try { + shuYing?.diagnostics?.scope("updater").error(event, error, { + channel: getUpdateChannel(), source: getUpdateSource(), ...context, + }); + } catch {} +} + async function flushLog(shuYing) { clearTimeout(shuYing._updateLogTimer); shuYing._updateLogTimer = null; @@ -316,6 +326,7 @@ async function flushLog(shuYing) { clearTimeout(shuYing._updateLogTimer); shuYing._updateLogTimer = null; console.error("写入术樱包日志失败:", error); + recordUpdateError(shuYing, "legacyLog.write.failed", error); }); shuYing._updateLogWrite = operation; await operation; @@ -1226,7 +1237,10 @@ async function installMengsanFiles(shuYing, manifest, files, previousManifest = else if (!previousManifest && !oldFiles.length) recovery = { status: "disabled", files: [], version: "disabled" }; } try { await saveMengsanRecord(recovery); } - catch (saveError) { console.error("安装中断记录仍保持待处理状态:", saveError); } + catch (saveError) { + recordUpdateError(shuYing, "installation.receipt.failed", saveError); + console.error("安装中断记录仍保持待处理状态:", saveError); + } throw error; } } @@ -1377,6 +1391,7 @@ async function updateAllFiles(shuYing, manifest, files, operationRoot = newOpera catch (rollbackError) { failedRollback.push(file); console.error("文件回滚失败:", file, rollbackError); + recordUpdateError(shuYing, "rollback.failed", rollbackError, { file }); } } retainRecovery = !!failedRollback.length || !!error.operationUncertain; @@ -1391,7 +1406,10 @@ async function updateAllFiles(shuYing, manifest, files, operationRoot = newOpera error: getErrorMessage(error), }, null, 2), `${operationRoot}/recovery.json`); } - catch (saveError) { console.error("恢复说明写入失败,旧文件仍保留:", operationRoot, saveError); } + catch (saveError) { + recordUpdateError(shuYing, "recovery.receipt.failed", saveError, { operationRoot }); + console.error("恢复说明写入失败,旧文件仍保留:", operationRoot, saveError); + } await addLog(shuYing, `回滚未完成,恢复文件已保留在:${operationRoot}`); } throw error; @@ -1405,6 +1423,7 @@ async function updateAllFiles(shuYing, manifest, files, operationRoot = newOpera } catch (cleanupError) { console.error("临时文件清理失败,不改变安装结果:", file, cleanupError); + recordUpdateError(shuYing, "temporary.cleanup.failed", cleanupError, { file }); break; // An unavailable backend must not cause one timeout per file. } } @@ -1530,6 +1549,7 @@ async function checkVersion(shuYing, options = {}) { } catch (error) { console.error(error); + recordUpdateError(shuYing, "version.update.failed", error); await addLog(shuYing, `版本更新失败:${getErrorMessage(error)}`); alert("版本检测或下载失败,请检查网络或服务器配置。"); return null; @@ -1611,6 +1631,7 @@ async function repairMissingFiles(shuYing) { } catch (error) { console.error(error); + recordUpdateError(shuYing, "missing.repair.failed", error); await addLog(shuYing, `查漏补缺失败:${getErrorMessage(error)}`); alert("查漏补缺失败,请查看 extension/术樱包/log.txt"); } @@ -1682,6 +1703,7 @@ async function manageMengsanModule(shuYing) { } catch (error) { console.error(error); + recordUpdateError(shuYing, "module.manage.failed", error); await addLog(shuYing, `梦三模块操作失败:${getErrorMessage(error)}`); const status = lib.config[mengsanRecordKey]?.status; const hint = status == "uninstalling" ? "卸载未完成,重启后梦三暂停加载,可再次点击此按钮继续卸载。" @@ -1716,6 +1738,7 @@ async function repairCoreFiles(shuYing) { } catch (error) { console.error(error); + recordUpdateError(shuYing, "core.repair.failed", error); await addLog(shuYing, `核心文件修复失败:${getErrorMessage(error)}`); alert("核心文件下载或校验失败,请检查服务器文件与 manifest.json 是否一致。"); }