Y2K ํ์ดํด ๋ณ์ ์ธํฐ๋ํฐ๋ธ ์น ๊ฒ์
๋๋ โ ํธ์นด โ ์น๊ตฌ๋ฅผ ๋๋ ์กด์ฌ๋ก. ์ ํ์ด 5์ถ ์ฑํฅ ์ ์๋ก ์์ฌ 5์ข
๋ฉํฐ ์๋ฉ์ผ๋ก ์ด์ด์ง๋ค.
๋ฏธ๊ตญ ํ์ดํด ์ํ ๋ฌด๋์ ํ๊ต๋ฅผ ๋ฐฐ๊ฒฝ์ผ๋ก, 4๋ช ์ ๋๋ ์บ๋ฆญํฐ ์ค ํ๋๋ฅผ ๊ณจ๋ผ ๋ง๋ฒ์ผ๋ก ์์ ์ ๋ณํ์ํค๊ณ (Stage 1) ๊ทธ ํ์ผ๋ก ์น๊ตฌ๋ฅผ ๋๋(Stage 2) ์ฌ์ ์ ๋ฐ๋ผ๊ฐ๋ค. ํ์ยท์์งยท์กฐํฉยท๋ณ์ ยท์ ํ์ด ๋ชจ๋ 5๊ฐ ์ฑํฅ ์ถ์ ๋์ ๋์ด, ๋ง์ง๋ง์ ํ๋ ์ด ๋ฐ์ดํฐ๋ฅผ ์ข ํฉํ ์ฑํฅ ์ง๋จ ์นด๋๋ก ๋ง๋ฌด๋ฆฌ๋๋ค.
์์ธ ์คํ์ docs/PRD.md๋ฅผ ๋จ์ผ ์ง์ค ์์ค(SSOT) ๋ก ์ฐธ์กฐํ๋ค.
์์ ๊ฒ์ดํธ(ํญํ์ฌ ์์) โ ์ธํธ๋ก โ ๋ฉ์ธ ๋ฉ๋ด โ ์บ๋ฆญํฐ ์ ํ
โ Stage 1 (4์ฅ์ ์ฌ๋ฃ ์์ง โ ๋ฌผ์ฝ ์ ์ โ ๋ณ์ )
โ Stage 2 (๋ณต๋์์ ์น๊ตฌ ํ1 โ ๊ณ ๋ฏผ ํด๊ฒฐ โ ์ ํ)
โ ์๋ฉ ์ง๊ณ(5์ถ) โ ๊ฒฐ๊ณผ ์นด๋ โ ๊ณต์ / ๋ค์ํ๊ธฐ
![]() ๐ Library ยท ๋ธ๋ ๋งค์ง ๋ถ |
![]() ๐คธ Gym ยท ๋ฆฌ๋ณธ |
![]() ๐ธ Garden ยท ๊ฝ |
![]() ๐ค Auditorium ยท ๋ฐ์ง์ด |
![]() ๋ฃจ๋ ๊ณต๋ถ๋ฒ๋ |
![]() ๋ฏธ์ค ์์ ๊ฐ |
![]() ์ ๋ก ๊ฒ์ ๋ํ |
![]() ์์ ์์ฌ ํจ์ ๋์คํ |
- Phase ์ํ๋จธ์ โ ๋ชจ๋ ํ๋ฉด ์ ํ์
appStore์ phase ์ ์ด๋ก๋ง(์ง์ ๋ผ์ฐํ ์์). - ์ฝํ
์ธ ์ธ๋ถํ โ ๋์ฌยท์ ํ์งยท์ ์ ๊ฐ์ค์น๋ฅผ
src/data/*.json์ผ๋ก ๋ถ๋ฆฌ(๊ธฐํ์๊ฐ ์ฝ๋ ์์ด ์์ ). - 5์ถ ์ ์ ์๋ฉ โ LEADERSHIP / TREND / CREATE / DREAM / SUPPORT ๋์ โ
lib/scoring.ts์์ํจ์๋ก 5์ข ์๋ฉ ์ฐ์ถ(๋์ ์ฐ์ ์์ ๋ฃฐ ํฌํจ, ๋จ์ ํ ์คํธ ๋ณด์ ). - ์ธ์ด๋ธ / ์ด์ดํ๊ธฐ โ ์งํ๋ง๋ค localStorage ์๋ ์ ์ฅ,
schemaVersion๊ฒ์ฆ, ์ฌ๋ฐฉ๋ฌธ ์ ์ ์ฌ๋ผ์ด์ค ๋ณต์. - ์ฐ์ถ(GSAP) โ Split Open ยท ์์ดํ
์์ง fly ยท ๋ณ์ ํํฐํด ยท ๋ฌผ์ฝ ๋ณด๊ธ๊ฑฐ๋ฆผ ยท 5์ถ ๊ฒ์ด์ง ยท ์๋ฉ ์นด๋.
prefers-reduced-motionํด๋ฐฑ. - ์ค๋์ค โ Howler.js BGM, ์์ ๊ฒ์ดํธ ํญ์์ ์๋์ฌ์ ์ฐจ๋จ ์์ด ์์ ยท์ธํธ๋ก ์ฑํฌ.
| ์์ญ | ์ ํ |
|---|---|
| ํ๋ ์์ํฌ | Vite + React 19 + TypeScript (strict) |
| ์ํ๊ด๋ฆฌ | Zustand (์ฌ๋ผ์ด์ค ๋ถ๋ฆฌ) |
| ์คํ์ผ | Tailwind CSS v4 (+ ๋์์ธ ํ ํฐ @theme) |
| ์ฐ์ถ | GSAP (ํ์๋ผ์ธ / ํํฐํด / motion) |
| ์ฌ์ด๋ | Howler.js (๋ก์ดํฐํ๋ฆฌ SFXยทBGM) |
| ์ ์ฅ | localStorage (+ schemaVersion) |
| ๋ฐฐํฌ | Vercel |
์๊ตฌ์ฌํญ: Node 20+ / npm
npm install
npm run dev # ๊ฐ๋ฐ ์๋ฒ (http://localhost:5173)
npm run build # ํ์
์ฒดํฌ(tsc) + ํ๋ก๋์
๋น๋
npm run preview # ๋น๋ ๊ฒฐ๊ณผ ๋ก์ปฌ ๋ฏธ๋ฆฌ๋ณด๊ธฐ
npm test # ๋จ์ ํ
์คํธ (scoring / save)์ ์ SPA๋ผ Vercel์ด Vite๋ฅผ ์๋ ๊ฐ์งํ๋ค(๋ณ๋ ์ค์ ๋ถํ์).
- GitHub ์ ์ฅ์๋ฅผ Vercel์ import
- Framework Preset: Vite (์๋), Build:
npm run build, Output:dist - Deploy โ main ๋ธ๋์น push๋ง๋ค ์๋ ๋ฐฐํฌ
๋ฐฐํฌ ํ
index.html์og:image๋ฅผ ์ค์ ๋๋ฉ์ธ ์ ๋ URL๋ก ๋ฐ๊พธ๋ฉด ๊ณต์ ์นด๋ ๋ฏธ๋ฆฌ๋ณด๊ธฐ๊ฐ ์์ ์ ์ด๋ค(docs/KNOWN_ISSUES.md์ฐธ์กฐ).
src/
state/ # Zustand ์ฌ๋ผ์ด์ค (app/game/quest/inventory/score/ending)
data/ # ์ฝํ
์ธ JSON + ํ์
๋ ๋ก๋ โ ์ฝ๋์ ๋ถ๋ฆฌ
types/ # TS ์ธํฐํ์ด์ค (PRD 10์ฅ)
scenes/ # phase๋ณ ํ๋ฉด + PhaseRouter
components/
ui/ # ๊ณต์ฉ ํ๋ฆฌ๋ฏธํฐ๋ธ (Button/Modal/GameIcon โฆ)
shell/ # 4๋ถํ ์
ธ (Header/CharacterPanel/Inventory)
lib/ # scoring ยท save ยท audio ยท fx(์ฐ์ถ) ยท ํ
styles/ # ๋์์ธ ํ ํฐ(@theme) + ๊ธ๋ก๋ฒ/์ฌ CSS
public/asset/ # ์บ๋ฆญํฐยท์ฌยท์์ด์ฝยท๋ก๊ณ ๋ฑ ์ค์ ์์
docs/PRD.md # ์ ํ ์๊ตฌ์ฌํญ (SSOT)
docs/KNOWN_ISSUES.md # ์ ๊ฒ ๊ฒฐ๊ณผ / ๋จ์ ์ด์ / ์ถ์ ์ QA ์ฒดํฌ๋ฆฌ์คํธ
CLAUDE.md # ์์
๊ท์น
- ํ๋ฉด ์ ํ์ Phase ์ํ๋จธ์ ์ผ๋ก๋ง. ์ง์ ๋ผ์ฐํ ๊ธ์ง.
- ๋ชจ๋ ์ฝํ
์ธ ๋
src/data/*.json์ผ๋ก ์ธ๋ถํ. - ๋์์ธ์ ํ ํฐ์ ํตํด์๋ง(์ปฌ๋ฌ/ํฐํธ ํ๋์ฝ๋ฉ ๊ธ์ง).
- ์๋ฉ ์ฐ์ถ์
lib/scoring.ts์์ํจ์๋ก(ํ ์คํธ ๊ฐ๋ฅ).
๊ฐ๋ฐ ๋ชจ๋์์๋ง ๋์ํ๋ฉฐ ํ๋ก๋์
๋น๋์ ํฌํจ๋์ง ์๋๋ค(import.meta.env.DEV ๊ฒ์ดํธ).
- ํ๋ฉด ํ๋จ Phase ์ ํ ๋ฐ๋ก phase ์ฆ์ ์ ํ.
- ์ฝ์:
__BM__.setPhase('STAGE1')ยท__BM__.seedDemo()ยท__BM__.resetGame()ยท__BM__.getState()
docs/PRD.mdโ ์ ํ ์๊ตฌ์ฌํญ (SSOT)docs/KNOWN_ISSUES.mdโ ์ ๊ฒ ๊ฒฐ๊ณผ ยท ๋จ์ ์ด์ ยท ์ถ์ ์ QACLAUDE.mdโ ์์ ๊ท์น
๋ณธ ๊ฒ์์ Little Mix "Black Magic"์ ๋ฌด๋๋ฅผ ์ฌํด์ํ ์ค๋ฆฌ์ง๋ 2์ฐจ ์ฐฝ์์ด๋ค. ๊ฐ์ฌ ์๋ฌธยท์์ยทMV ์์ยท์ค์ ์ธ๋ฌผ ์ธํ์ ์ฝ๋/์์ ์ ์ฌ์ฉํ์ง ์๋๋ค. ๋ชจ๋ ์บ๋ฆญํฐยท๋ฐฐ๊ฒฝ์ ์ค๋ฆฌ์ง๋ ๋์์ธ์ด๋ฉฐ, ํน์ ์ํฐ์คํธยท๋ ์ด๋ธยท๊ณก๊ณผ ๋ฌด๊ดํ๋ค.








