feat # 新增日志功能

This commit is contained in:
2026-10-08 14:40:58 +08:00
parent 3a3d547ccd
commit cba7b5fbcc
19 changed files with 978 additions and 48 deletions
+3
View File
@@ -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);
+9
View File
@@ -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}`);
+4
View File
@@ -5,6 +5,7 @@ import config from "../../config.js";
import { getRelic } from "../../relics/definitions.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 = {
@@ -186,6 +187,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; }
});
@@ -324,6 +327,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: "回到行军图" }]);
}
},
+6 -1
View File
@@ -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: "回到当前界面" }]);