ecs-observable/examples/three-monks/stats.ts

95 lines
2.6 KiB
TypeScript
Raw Normal View History

import type { ToolKind } from "./components";
import { TOOL_LABELS } from "./logging";
export interface ToolEffectDelta {
playerWaterDelta?: number;
ownToolWaterDelta?: number;
otherToolWaterDelta?: number;
centralWaterDelta?: number;
}
export interface ToolEffectRecord extends Required<ToolEffectDelta> {
tool: ToolKind;
phase: string;
description?: string;
}
export interface ToolEffectSummary extends Required<ToolEffectDelta> {
tool: ToolKind;
activations: number;
}
export interface ToolEffectRecorder {
record(tool: ToolKind, phase: string, delta?: ToolEffectDelta, description?: string): void;
}
export class ToolEffectStats implements ToolEffectRecorder {
private readonly summaries = new Map<ToolKind, ToolEffectSummary>();
private readonly records: ToolEffectRecord[] = [];
record(
tool: ToolKind,
phase: string,
delta: ToolEffectDelta = {},
description?: string,
): void {
const record: ToolEffectRecord = {
tool,
phase,
description,
playerWaterDelta: delta.playerWaterDelta ?? 0,
ownToolWaterDelta: delta.ownToolWaterDelta ?? 0,
otherToolWaterDelta: delta.otherToolWaterDelta ?? 0,
centralWaterDelta: delta.centralWaterDelta ?? 0,
};
this.records.push(record);
const summary = this.summaries.get(tool) ?? {
tool,
activations: 0,
playerWaterDelta: 0,
ownToolWaterDelta: 0,
otherToolWaterDelta: 0,
centralWaterDelta: 0,
};
summary.activations++;
summary.playerWaterDelta += record.playerWaterDelta;
summary.ownToolWaterDelta += record.ownToolWaterDelta;
summary.otherToolWaterDelta += record.otherToolWaterDelta;
summary.centralWaterDelta += record.centralWaterDelta;
this.summaries.set(tool, summary);
}
getRecords(): readonly ToolEffectRecord[] {
return this.records;
}
getSummaries(): ToolEffectSummary[] {
return [...this.summaries.values()].sort((a, b) =>
TOOL_LABELS[a.tool].localeCompare(TOOL_LABELS[b.tool], "zh-Hans-CN"),
);
}
}
export function formatToolEffectSummaries(stats: ToolEffectStats): string[] {
const summaries = stats.getSummaries();
if (summaries.length === 0) return ["无道具效果记录"];
return [
"道具 | 触发次数 | 玩家水变化 | 自身道具水变化 | 其他道具水变化 | 中央水变化",
"--- | ---: | ---: | ---: | ---: | ---:",
...summaries.map((summary) =>
[
TOOL_LABELS[summary.tool],
summary.activations,
summary.playerWaterDelta,
summary.ownToolWaterDelta,
summary.otherToolWaterDelta,
summary.centralWaterDelta,
].join(" | "),
),
];
}