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>
1 parent 12d2634 commit ed0f6ba9cf49bddb67c0cb3cf24d9b316e90c0c5
@root root authored 1 hour ago
Showing 12 changed files
View
apps/game/src/Game.ts
View
apps/game/src/data/__tests__/migrations.test.ts 0 → 100644
View
apps/game/src/data/__tests__/validate.test.ts
View
apps/game/src/data/ids.ts
View
apps/game/src/data/migrations.ts 0 → 100644
View
apps/game/src/data/npcs.ts
View
apps/game/src/data/quests.ts
View
apps/game/src/scenes/LocationScene.ts
View
docs/engine/assets-audio-save.md
View
docs/engine/core.md
View
packages/engine/src/core/GameState.ts
View
packages/engine/src/core/__tests__/GameState.test.ts