feat(engine): диалоговые эффекты do[] + onEffect и результат onFinish
- DialogueEffectOp (giveItem/takeItem/sound/toast/custom) — эффекты как
  данные в графе; движок только эмитит через onEffect(op, at), исполнение
  — EffectSink игры. Никаких Inventory в движке.
- DialogueHooks { world, resolve } третьим аргументом конструктора +
  setHooks (заменяет параметр world из D1).
- DialogueResult { lastNodeId, path, picks }: путь показанных узлов и
  выборы игрока; onFinish(graph, result), result читается и после конца.
- Порядок эффектов: setFlags → clearFlags → setVars → do[].
- Тесты: порядок onEffect у узла/выбора, unknown kind не падает,
  path/result/перезапуск; доки ui-and-dialogue.md + practices.md.

Co-Authored-By: Claude Code <noreply@anthropic.com>
1 parent c5fea2f commit d51bcea5c86ee7d4a7b0961542a31aee2db8263f
@root root authored 3 hours ago
Showing 5 changed files
View
docs/engine/practices.md
View
docs/engine/ui-and-dialogue.md
View
packages/engine/src/dialogue/DialogueRunner.ts
View
packages/engine/src/dialogue/__tests__/DialogueRunner.test.ts
View
packages/engine/src/index.ts