41 lines
1.4 KiB
TypeScript
41 lines
1.4 KiB
TypeScript
import type { PuzzleRunSnapshot } from '../../../packages/shared/src/contracts/puzzleRuntimeSession';
|
|
|
|
export function mergePuzzleServiceRuntimeState(
|
|
currentRun: PuzzleRunSnapshot,
|
|
serviceRun: PuzzleRunSnapshot,
|
|
): PuzzleRunSnapshot {
|
|
if (!currentRun.currentLevel || !serviceRun.currentLevel) {
|
|
return currentRun;
|
|
}
|
|
|
|
const serviceLevel = serviceRun.currentLevel;
|
|
const leaderboardEntries =
|
|
serviceLevel.leaderboardEntries.length > 0
|
|
? serviceLevel.leaderboardEntries
|
|
: serviceRun.leaderboardEntries;
|
|
|
|
// 中文注释:拼块布局和通关状态由前端即时裁决;后端快照只合并榜单与下一关 handoff。
|
|
return {
|
|
...currentRun,
|
|
runId: serviceRun.runId,
|
|
entryProfileId: serviceRun.entryProfileId,
|
|
clearedLevelCount: Math.max(
|
|
currentRun.clearedLevelCount,
|
|
serviceRun.clearedLevelCount,
|
|
),
|
|
recommendedNextProfileId: serviceRun.recommendedNextProfileId,
|
|
nextLevelMode: serviceRun.nextLevelMode,
|
|
nextLevelProfileId: serviceRun.nextLevelProfileId,
|
|
nextLevelId: serviceRun.nextLevelId,
|
|
recommendedNextWorks: serviceRun.recommendedNextWorks,
|
|
leaderboardEntries,
|
|
currentLevel: {
|
|
...currentRun.currentLevel,
|
|
leaderboardEntries:
|
|
leaderboardEntries.length > 0
|
|
? leaderboardEntries
|
|
: currentRun.currentLevel.leaderboardEntries,
|
|
},
|
|
};
|
|
}
|