feat:添加孙中山场景

This commit is contained in:
zhongyidian committed 2026-01-02 23:32:26 +08:00
1 parent bf4a98bf9f
commit cad38e43df
55 files changed
+1704 -44

No files matched your search

+76
View File
@@ -0,0 +1,76 @@
import { create } from "zustand";
import { persist } from "zustand/middleware";
export interface Clue {
id: string; // 格式: "sunzhongshan/reflection/scene1/clue1"
name: string; // 线索名称,如 "线索1"
collected: boolean; // 是否已收集
collectedAt?: number; // 收集时间戳
}
interface ClueStore {
clues: Clue[];
// 收集线索
collectClue: (id: string, name: string) => void;
// 检查线索是否已收集
isClueCollected: (id: string) => boolean;
// 获取指定场景的所有线索
getSceneClues: (sceneId: string) => Clue[];
// 重置指定场景的线索
resetSceneClues: (sceneId: string) => void;
}
export const useClueStore = create<ClueStore>()(
persist(
(set, get) => ({
clues: [],
collectClue: (id: string, name: string) => {
const { clues } = get();
const existingClue = clues.find((c) => c.id === id);
if (!existingClue) {
set({
clues: [
...clues,
{
id,
name,
collected: true,
collectedAt: Date.now(),
},
],
});
} else if (!existingClue.collected) {
set({
clues: clues.map((c) =>
c.id === id
? { ...c, collected: true, collectedAt: Date.now() }
: c
),
});
}
},
isClueCollected: (id: string) => {
const { clues } = get();
return clues.some((c) => c.id === id && c.collected);
},
getSceneClues: (sceneId: string) => {
const { clues } = get();
return clues.filter((c) => c.id.startsWith(sceneId));
},
resetSceneClues: (sceneId: string) => {
const { clues } = get();
set({
clues: clues.filter((c) => !c.id.startsWith(sceneId)),
});
},
}),
{
name: "clue-storage", // localStorage key
}
)
);