refactor: 收口推荐运行态启动意图

This commit is contained in:
2026-06-04 01:11:27 +08:00
parent 7349c6df4f
commit 8d3e14020f
6 changed files with 612 additions and 101 deletions

View File

@@ -361,15 +361,7 @@ import {
selectAdjacentPlatformRecommendEntry,
} from '../rpg-entry/rpgEntryPublicGalleryViewModel';
import {
isBarkBattleGalleryEntry,
isBigFishGalleryEntry,
isEdutainmentGalleryEntry,
isJumpHopGalleryEntry,
isMatch3DGalleryEntry,
isPuzzleGalleryEntry,
isSquareHoleGalleryEntry,
isVisualNovelGalleryEntry,
isWoodenFishGalleryEntry,
mapBabyObjectMatchDraftToPlatformGalleryCard,
mapBarkBattleWorkToPlatformGalleryCard,
mapBigFishWorkToPlatformGalleryCard,
@@ -514,15 +506,12 @@ import {
isSamePlatformPublicGalleryEntry,
mergePlatformPublicGalleryEntries,
type RecommendRuntimeKind,
resolvePlatformRecommendRuntimeStartIntent,
} from './platformPublicGalleryFlow';
import {
mapBarkBattlePublicDetailToWorkSummary,
mapBarkBattleWorkToPublicWorkDetail,
mapBigFishWorkToPublicWorkDetail,
mapJumpHopWorkToPublicWorkDetail,
mapPublicWorkDetailToBigFishWork,
mapPublicWorkDetailToPuzzleWork,
mapPublicWorkDetailToSquareHoleWork,
mapPuzzleWorkToPublicWorkDetail,
mapRpgGalleryCardToPublicWorkDetail,
mapSquareHoleWorkToPublicWorkDetail,
@@ -12762,98 +12751,99 @@ export function PlatformEntryFlowShellImpl({
try {
let started = false;
if (isBigFishGalleryEntry(entry)) {
const work = mapPublicWorkDetailToBigFishWork(entry);
if (!work) {
setBigFishError('当前作品缺少会话信息,暂时无法进入玩法。');
} else {
started = await startBigFishRunFromWork(work, 'platform', {
embedded: true,
const intent = resolvePlatformRecommendRuntimeStartIntent(entry, {
selectedPuzzleDetail,
barkBattleGalleryEntries,
mapMatch3DWork: mapPublicWorkDetailToMatch3DWork,
});
switch (intent.type) {
case 'blocked':
if (intent.errorTarget === 'big-fish') {
setBigFishError(intent.errorMessage);
} else if (intent.errorTarget === 'puzzle') {
setPuzzleError(intent.errorMessage);
} else if (intent.errorTarget === 'match3d') {
setMatch3DError(intent.errorMessage);
} else if (intent.errorTarget === 'square-hole') {
setSquareHoleError(intent.errorMessage);
} else {
setBarkBattleError(intent.errorMessage);
}
break;
case 'start-big-fish':
started = await startBigFishRunFromWork(intent.work, 'platform', {
embedded: intent.embedded,
});
}
} else if (isPuzzleGalleryEntry(entry)) {
const work =
selectedPuzzleDetail?.profileId === entry.profileId
? selectedPuzzleDetail
: mapPublicWorkDetailToPuzzleWork(entry);
if (!work) {
setPuzzleError('当前拼图作品信息不完整,暂时无法进入玩法。');
} else {
break;
case 'start-puzzle':
started = await startPuzzleRunFromProfile(
work.profileId,
'platform',
work,
intent.work.profileId,
intent.returnStage,
intent.work,
false,
null,
{ embedded: true },
{ embedded: intent.embedded },
);
}
} else if (isJumpHopGalleryEntry(entry)) {
started = await startJumpHopRunFromProfile(entry.profileId, {
embedded: true,
returnStage: 'platform',
});
} else if (isWoodenFishGalleryEntry(entry)) {
started = await startWoodenFishRunFromProfile(entry.profileId, {
embedded: true,
returnStage: 'platform',
});
} else if (isMatch3DGalleryEntry(entry)) {
const work = mapPublicWorkDetailToMatch3DWork(entry);
if (!work) {
setMatch3DError('当前抓大鹅作品信息不完整,暂时无法进入玩法。');
} else {
started = await startMatch3DRunFromProfile(
work,
'work-detail',
false,
{ embedded: true },
);
}
} else if (isSquareHoleGalleryEntry(entry)) {
const work = mapPublicWorkDetailToSquareHoleWork(entry);
if (!work) {
setSquareHoleError(
'当前方洞挑战作品信息不完整,暂时无法进入玩法。',
);
} else {
started = await startSquareHoleRunFromProfile(
work,
'platform',
false,
{ embedded: true },
);
}
} else if (isVisualNovelGalleryEntry(entry)) {
started = await startVisualNovelRunFromProfile(
entry.profileId,
'platform',
{ embedded: true },
);
} else if (isBarkBattleGalleryEntry(entry)) {
const work =
barkBattleGalleryEntries.find(
(item) => item.workId === entry.workId,
) ?? mapBarkBattlePublicDetailToWorkSummary(entry);
if (!work) {
setBarkBattleError(
'当前汪汪声浪作品信息不完整,暂时无法进入玩法。',
);
} else {
started = await startBarkBattleRunFromWork(work, 'platform', {
embedded: true,
break;
case 'start-jump-hop':
started = await startJumpHopRunFromProfile(intent.profileId, {
embedded: intent.embedded,
returnStage: intent.returnStage,
});
break;
case 'start-wooden-fish':
started = await startWoodenFishRunFromProfile(intent.profileId, {
embedded: intent.embedded,
returnStage: intent.returnStage,
});
break;
case 'start-match3d':
started = await startMatch3DRunFromProfile(
intent.work,
intent.returnStage,
false,
{ embedded: intent.embedded },
);
break;
case 'start-square-hole':
started = await startSquareHoleRunFromProfile(
intent.work,
intent.returnStage,
false,
{ embedded: intent.embedded },
);
break;
case 'start-visual-novel':
started = await startVisualNovelRunFromProfile(
intent.profileId,
intent.returnStage,
{ embedded: intent.embedded },
);
break;
case 'start-bark-battle':
started = await startBarkBattleRunFromWork(
intent.work,
intent.returnStage,
{ embedded: intent.embedded },
);
break;
case 'start-edutainment':
started = await startBabyObjectMatchRuntimeFromEntry(
intent.entry,
intent.returnStage,
{
embedded: intent.embedded,
},
);
break;
case 'mark-ready':
started = true;
break;
default: {
const exhaustive: never = intent;
return exhaustive;
}
} else if (isEdutainmentGalleryEntry(entry)) {
started = await startBabyObjectMatchRuntimeFromEntry(
entry,
'platform',
{
embedded: true,
},
);
} else {
started = true;
}
if (!isCurrentStartRequest()) {