feat: add progression logic for puzzle residences
- Implemented functions to manage puzzle progress including checking if residences are started, complete, and unlocked. - Added utility functions to retrieve piece IDs based on residence and route. - Introduced a new TypeScript file for progression management. - Integrated puzzle data configuration and residence data for seamless progression tracking.
This commit is contained in:
1 parent
5a1c3cc368
commit
284302341c
72 files changed
+1104
-517
No files matched your search
@@ -2,6 +2,8 @@ import { useEffect } from 'react'
|
||||
import { getBackgroundImage, getStaticImage } from '@/lib/utils'
|
||||
import { useNavigate, useParams } from 'react-router-dom'
|
||||
import { Image } from '@/components'
|
||||
import { usePuzzleStore } from '@/store/puzzleStore'
|
||||
import { getResidenceStageUnlocks, isResidenceUnlocked } from '@/config/progression'
|
||||
import { getUserDefine } from '@/lib/utils/api-common'
|
||||
import {
|
||||
useHuangyanpeiStore,
|
||||
@@ -21,6 +23,17 @@ const Huangyanpei = () => {
|
||||
const lastVisitedPlace = useHuangyanpeiStore((state) => state.lastVisitedPlace)
|
||||
const reflectionRoute = useHuangyanpeiStore((state) => state.reflectionRoute)
|
||||
|
||||
const puzzles = usePuzzleStore((state) => state.puzzles)
|
||||
const isLoaded = usePuzzleStore((state) => state.isLoaded)
|
||||
const { dialogueUnlocked, reflectionUnlocked, internalizationUnlocked } =
|
||||
getResidenceStageUnlocks(starName, puzzles)
|
||||
|
||||
useEffect(() => {
|
||||
if (isLoaded && !isResidenceUnlocked(starName, puzzles)) {
|
||||
navigate('/menu', { replace: true })
|
||||
}
|
||||
}, [isLoaded, navigate, puzzles, starName])
|
||||
|
||||
useEffect(() => {
|
||||
;(async () => {
|
||||
try {
|
||||
@@ -72,21 +85,35 @@ const Huangyanpei = () => {
|
||||
<div className="absolute right-20 top-75 flex flex-col space-y-10">
|
||||
{/* 对话 */}
|
||||
<Image
|
||||
button
|
||||
button={dialogueUnlocked}
|
||||
className={dialogueUnlocked ? undefined : 'opacity-50 grayscale cursor-not-allowed'}
|
||||
src={getStaticImage('star/一-解锁')}
|
||||
onClick={() => navigate(`/${moduleName}/${starName}/${lastVisitedPlace || 'place1'}`)}
|
||||
onClick={() => {
|
||||
if (!dialogueUnlocked) return
|
||||
navigate(`/${moduleName}/${starName}/${lastVisitedPlace || 'place1'}`)
|
||||
}}
|
||||
/>
|
||||
{/* 体悟 */}
|
||||
<Image
|
||||
button
|
||||
button={reflectionUnlocked}
|
||||
className={reflectionUnlocked ? undefined : 'opacity-50 grayscale cursor-not-allowed'}
|
||||
src={getStaticImage('star/二-解锁')}
|
||||
onClick={() => navigate(`/${moduleName}/${starName}/${reflectionRoute || 'reflection'}`)}
|
||||
onClick={() => {
|
||||
if (!reflectionUnlocked) return
|
||||
navigate(`/${moduleName}/${starName}/${reflectionRoute || 'reflection'}`)
|
||||
}}
|
||||
/>
|
||||
{/* 内化 */}
|
||||
<Image
|
||||
button
|
||||
button={internalizationUnlocked}
|
||||
className={
|
||||
internalizationUnlocked ? undefined : 'opacity-50 grayscale cursor-not-allowed'
|
||||
}
|
||||
src={getStaticImage('star/三-解锁')}
|
||||
onClick={() => navigate(`/${moduleName}/${starName}/internalization`)}
|
||||
onClick={() => {
|
||||
if (!internalizationUnlocked) return
|
||||
navigate(`/${moduleName}/${starName}/internalization`)
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -163,6 +163,7 @@ const HuangyanpeiReflectionScene2 = () => {
|
||||
visible={showGuideModal}
|
||||
onContinue={() => setShowGuideModal(false)}
|
||||
audioSrc={getPublicPath('audio/huangyanpei/mp3_huangyanpei_24.mp3')}
|
||||
firstLineIndent="2em"
|
||||
>
|
||||
欢迎来到浦东中学!{'\n'}
|
||||
这是近代上海第一所完全中学,黄炎培先生当首任校长,在这里能学到更多实用知识,还能树立成才的理想哦。
|
||||
|
||||
@@ -106,7 +106,7 @@ const HuangyanpeiReflectionScene3 = () => {
|
||||
>
|
||||
终于到中华职业学校啦!这里是中国近代职教的摇篮,“免学费、包分配”,还能学真手艺,快来练就一技之长。
|
||||
{'\n'}
|
||||
你选了学技术,那就来挑战制作中华职校的“明星产品”——台钳吧!当年这台钳还拿过巴拿马万国博览会金奖呢!
|
||||
你选了学技术,那就来挑战制作中华职校的“明星产品”——台钳吧!当年这台钳还拿过巴拿马万国博览会金奖呢!
|
||||
</StudyGuideModal>
|
||||
|
||||
{/* 互动展品光标:组装台钳互动 */}
|
||||
@@ -173,7 +173,7 @@ const HuangyanpeiReflectionScene3 = () => {
|
||||
<SuccessAlert
|
||||
visible={showSuccessAlert}
|
||||
title="满分!"
|
||||
content='黄先生说“手脑并用”,懂了理论,也要动手实践。'
|
||||
content="黄先生说“手脑并用”,懂了理论,也要动手实践。"
|
||||
onContinue={() => {
|
||||
setShowSuccessAlert(false)
|
||||
markReflectionCursorVisited(scene, 2)
|
||||
|
||||
@@ -209,7 +209,7 @@ const HuangyanpeiReflectionScene4 = () => {
|
||||
>
|
||||
终于到中华职业学校啦!这里是中国近代职教的摇篮,“免学费、包分配”,还能学真手艺,快来练就一技之长。
|
||||
{'\n'}
|
||||
现在要完成你的第一个任务:推销中华职校生产的“国货精品”——手工纽扣和纯棉毛巾!当年学生们就是带着这些国货,走街串巷做推销呢!
|
||||
现在要完成你的第一个任务:推销中华职校生产的“国货精品”——手工纽扣和纯棉毛巾!当年学生们就是带着这些国货,走街串巷做推销呢!
|
||||
</StudyGuideModal>
|
||||
|
||||
{showVideo && (
|
||||
|
||||
Reference in new issue
Block a user