Files
ark-stronghold-protocol/public/dev/sim-check.js
T

46 lines
2.6 KiB
JavaScript

// The cross-engine check page (docs/SIM.md「Cross-engine check」): this browser runs the golden battle corpus with the
// client's own sim loader (public/js/battle/runner.js loadBrowserSim) and compares every tick with the Node reference
// that `node tools/sim-check.mjs` wrote to /dev/simcheck/data/ — any device on the LAN can open it from the server.
import { mountCheck } from './simcheck/ui.js';
import { strongholdAdapter, scenariosOf } from './simcheck/stronghold.js';
const app = document.getElementById('app');
const get = async (url) => {
const r = await fetch(url, { cache: 'no-cache' });
if (!r.ok) throw Object.assign(new Error(`${r.status} ${url}`), { missing: r.status === 404 });
return r.json();
};
try {
const [doc, reference, { loadBrowserSim }, { APP_VERSION }] = await Promise.all([
get('/dev/simcheck/data/specs.json'), get('/dev/simcheck/data/reference.json'), import('/js/battle/runner.js'), import('/shared/constants.js'),
]);
const { spec, ds } = await loadBrowserSim();
const scenarios = scenariosOf(doc);
const FAMILIES = [['roster', '干员'], ['bonds', '盟约'], ['fields', '首领战场与联防'], ['standins', '补位'], ['diy', '自选']];
const stale = reference.made && reference.made.version && reference.made.version !== APP_VERSION;
mountCheck(app, {
project: 'Stronghold Protocol',
title: '模拟一致性检查',
subtitle: '在这台设备的浏览器里运行黄金结果的整套战斗,逐帧与服务器(Node)的结果比较。浏览器自己模拟战斗、服务器再复算校验,两边必须逐位一致。'
+ (stale ? `<br><b style="color:var(--gold-2)">参考数据由 ${reference.made.version} 生成,这台服务器是 ${APP_VERSION}:请在服务器上重新运行 node tools/sim-check.mjs。</b>` : ''),
adapter: strongholdAdapter({ spec, ds, doc }),
scenarios,
subsets: [
{ id: 'fast', label: '快速(黄金结果的快速子集)', pick: (sc) => sc.fast },
{ id: 'all', label: '全部', pick: () => true },
...FAMILIES.map(([id, label]) => ({ id, label, pick: (sc) => sc.family === id })),
],
reference,
info: [['游戏版本', APP_VERSION]],
});
} catch (e) {
app.innerHTML = '';
const p = document.createElement('p');
p.style.cssText = 'color:var(--text-md);padding:16px;max-width:760px;margin:0 auto;font:14px/1.6 var(--font-cjk)';
p.textContent = e.missing
? '还没有参考数据:请在服务器的目录里运行 node tools/sim-check.mjs(生成 public/dev/simcheck/data/),然后刷新这个页面。'
: `载入失败:${e && e.message || e}`;
app.appendChild(p);
}