|
feat(game): квест-стадии на DialogueConditions; чистка флагов знакомств + миграция v2
- QuestStage.ready — данные (DialogueConditions) вместо замыкания; стадия сдачи — whenVars flowers >= 3. questDialogueFor(state, npc, world?) фильтрует через движковый evalConditions. - Двойной учёт знакомств устранён: npcs.flagKey → FLAGS.met_elder/met_mila, графы уже ставят их сами — talkTo перестал ставить флаг вручную; camelCase-ключи metElder/metTrader удалены из ids.ts. - data/migrations.ts: registerStateMigrations + migrateV1toV2 (metElder→met_elder, metTrader→met_mila); Game регистрирует при старте. - Движок: фикс цикла миграций в GameState.load — выход при достижении dataVersion (миграция, забывшая повысить version, не портит данные); контракт задокументирован в core.md, оси версий — в assets-audio-save.md. - Тесты: две миграции по порядку, незабампленная миграция не применяется дважды, старый сейв v1 читается, готовность стадии через whenVars. Co-Authored-By: Claude Code <noreply@anthropic.com> |
|---|
|
|
| apps/game/src/Game.ts |
|---|
| apps/game/src/data/__tests__/migrations.test.ts 0 → 100644 |
|---|
| apps/game/src/data/__tests__/validate.test.ts |
|---|
| apps/game/src/data/ids.ts |
|---|
| apps/game/src/data/migrations.ts 0 → 100644 |
|---|
| apps/game/src/data/npcs.ts |
|---|
| apps/game/src/data/quests.ts |
|---|
| apps/game/src/scenes/LocationScene.ts |
|---|
| docs/engine/assets-audio-save.md |
|---|
| docs/engine/core.md |
|---|
| packages/engine/src/core/GameState.ts |
|---|
| packages/engine/src/core/__tests__/GameState.test.ts |
|---|