feat: P15 ending gallery, chapter recap, visited tracking, save system v6

This commit is contained in:
2026-06-09 17:49:07 +08:00
parent 47d6ce50fe
commit 9297117544
14 changed files with 517 additions and 48 deletions

View File

@@ -1,6 +1,6 @@
import { defineStore } from 'pinia'
import { ref, shallowRef } from 'vue'
import type { SceneNode, Choice, QTEDefinition, Hotspot, ChapterInfo, AchievementDef } from '@engine/types'
import type { SceneNode, Choice, QTEDefinition, Hotspot, ChapterInfo, AchievementDef, EndingDef } from '@engine/types'
export interface SlotInfo {
slot: number
@@ -33,6 +33,9 @@ export const useGameStore = defineStore('game', () => {
const achievementDefs = ref<AchievementDef[]>([])
const unlockedAchievementIds = ref<Set<string>>(new Set())
const toastAchievementId = ref('')
const showEndingGallery = ref(false)
const endings = ref<EndingDef[]>([])
const visitedSceneIds = ref<Set<string>>(new Set())
function setScene(scene: SceneNode) {
currentScene.value = scene
@@ -152,6 +155,23 @@ export const useGameStore = defineStore('game', () => {
toastAchievementId.value = ''
}
function setEndings(list: EndingDef[]) {
endings.value = list
}
function setShowEndingGallery(val: boolean) {
showEndingGallery.value = val
}
function setVisitedSceneIds(ids: string[]) {
visitedSceneIds.value = new Set(ids)
}
function addVisitedSceneId(id: string) {
visitedSceneIds.value.add(id)
visitedSceneIds.value = new Set(visitedSceneIds.value)
}
function dump() {
console.group('GameStore')
console.log('currentScene:', currentScene.value?.id)
@@ -169,7 +189,7 @@ export const useGameStore = defineStore('game', () => {
qteActive, qteDef, qteTotal, qteRemaining, qteResult, videoTime,
hotspots, isImageScene, showChapterSelect, chapters, unlockedChapterIds,
inputMode, showAchievements, achievementDefs, unlockedAchievementIds,
toastAchievementId,
toastAchievementId, showEndingGallery, endings, visitedSceneIds,
setScene, setChoices, clearChoices, setGameEnded,
setTimer, clearTimer, setSaves,
showQTE, updateQTE, resolveQTE, clearQTE, setVideoTime,
@@ -178,6 +198,7 @@ export const useGameStore = defineStore('game', () => {
setChapters, setUnlockedChapters, addUnlockedChapter, setShowChapterSelect,
setShowAchievements, setAchievementDefs, setUnlockedAchievementIds,
addUnlockedAchievement, clearToastAchievement,
setEndings, setShowEndingGallery, setVisitedSceneIds, addVisitedSceneId,
dump,
}
})