@vnejs/docs 0.2.37 → 0.2.39
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +37 -0
- package/package.json +1 -1
- package/plugins/ai/ai.md +75 -0
- package/plugins/ai/checkers.md +58 -0
- package/plugins/common/grid.md +39 -0
- package/plugins/common/turn.md +33 -0
- package/plugins/game/checkers.md +70 -0
- package/plugins/views.screens/checkers.md +36 -85
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,43 @@
|
|
|
2
2
|
|
|
3
3
|
Краткая история изменений движка (плагины, helpers, packages, CLI и прочий runtime) и внешнего API. Версии — релизы пакета `@vnejs/docs`.
|
|
4
4
|
|
|
5
|
+
## 0.2.39
|
|
6
|
+
|
|
7
|
+
- `game/checkers` — пресеты `FLIPPED` (белые сверху / чёрные снизу, все дамки) и `RANDOM` (12+12 на случайных тёмных клетках; на каждый `SHOW` новый расклад). API: `PARAMS.CHECKERS.PRESETS.FLIPPED` / `RANDOM`, `createFlippedPreset`, `createRandomPreset`.
|
|
8
|
+
- `games/checkers` — `% choose` «Партия»: 6 вариантов (COMMON / FLIPPED / RANDOM × первые ходят белые / чёрные) → `$ checkers show` с args.
|
|
9
|
+
- `game/checkers` — `$ checkers show` берёт `initialOwner` / `initialPreset` из indent-args (`initialOwner: black`, `initialPreset: COMMON`), не из позиционных токенов.
|
|
10
|
+
- `game/checkers` — `PARAMS.CHECKERS.PRESETS` (`COMMON` = стандартный старт); `SHOW.initialPreset` → cells из пресета (нет / неизвестный → `COMMON`). API: `PARAMS.CHECKERS.PRESETS`, `CheckersShowPayload.initialPreset`, `createCommonPreset`.
|
|
11
|
+
- `game/checkers` — `EVENTS.CHECKERS.SHOW` payload `CheckersShowPayload` `{ initialOwner?, initialPreset? }`; без / невалидный `initialOwner` → белые. API: `CheckersShowPayload`.
|
|
12
|
+
- `game/checkers` — `EVENTS.CHECKERS.SET` / `UNSET` (`vne:checkers:set` / `unset`): `{ cells, owner }` → `GRID.SET` + `TURNS.SET` (id / rows / columns из `GRID_ID` / `TURN_ID` / `PARAMS`); `UNSET` → `GRID.UNSET` + `TURNS.UNSET`. Модуль `checkers.set`. Call-sites: `SHOW` / `MOVE_PLAY` → `SET`, `HIDE` → `UNSET`.
|
|
13
|
+
- `common/grid` — плагин квадратной сетки `@vnejs/plugins.common.grid` (`PLUGIN_NAME` `GRID`). API: `EVENTS.GRID.SET` / `GET` / `UNSET` / `CHANGED` / `PUT` / `MOVE` / `REMOVE` (`vne:grid:*`); элемент — объект с `id`; state — map `id → { rows, columns, cells }` (плотная `(item \| null)[][]`). `STATE.SET` / `CLEAR` диффят через `SET` / `UNSET`.
|
|
14
|
+
- `game/checkers` — доска через `GRID.*` вместо `BOARD_CHANGE` / `BOARD_CHANGED` / `BOARD_GET`; модуль `checkers.board` удалён. API: `CONST.CHECKERS.GRID_ID` (`"checkers"`); `SHOW` → `GRID.SET` + `TURNS.SET`; `HIDE` → `GRID.UNSET` + `TURNS.UNSET`; `MOVE_PLAY` читает `GRID.GET`, пишет `GRID.SET`.
|
|
15
|
+
- `views.screens/checkers` / `ai/checkers` — `board` с `GRID.CHANGED` / `UNSET` (`cells`, фильтр `GRID_ID`).
|
|
16
|
+
- `bundles/checkers` — импорт `@vnejs/plugins.common.grid`.
|
|
17
|
+
- `common/turn` — плагин хода `@vnejs/plugins.common.turn` (`PLUGIN_NAME` `TURNS`). API: `EVENTS.TURNS.SET` / `GET` / `UNSET` / `CHANGED` (`vne:turns:*`); payload `{ id, owner }` (`UNSET` — `{ id }`); state — map `id → owner` (параллельные партии). `STATE.SET` / `CLEAR` диффят map через `SET` / `UNSET`.
|
|
18
|
+
- `game/checkers` — `turn` / `winner` убраны из state и `BOARD_CHANGE` / `BOARD_CHANGED` / `BOARD_GET`; ход через `TURNS.*`; победа через `FINISH` `{ winner }` (`CheckersFinishPayload`). API: `CONST.CHECKERS.TURN_ID` (`"checkers"`); `CONST.CHECKERS.COLORS` / `COLOR_VALUES` (бывшие `AI_COLORS` / `AI_COLOR_VALUES`); тип `CheckersColor` (бывший `CheckersAiColor`).
|
|
19
|
+
- `views.screens/checkers` / `ai/checkers` — `turn` с `TURNS.CHANGED` / `UNSET`; `winner` с `CHECKERS.FINISH` / сброс на `SHOW`; `BOARD_CHANGED` / `STATE_UPDATE` только `board`. View: `checkers_view.status` (status text).
|
|
20
|
+
- `bundles/checkers` — импорт `@vnejs/plugins.common.turn`.
|
|
21
|
+
|
|
22
|
+
## 0.2.38
|
|
23
|
+
|
|
24
|
+
- `ai/checkers` — ключи алгоритмов с префиксом домена: `CONST.CHECKERS_AI.AI_TYPES` → `checkers:sacrifice` / `checkers:random` / `checkers:strong` (вместо `sacrifice` / `random` / `strong`). `$ checkers.ai set <color> checkers:strong`.
|
|
25
|
+
- `ai/checkers` — дефолтные алгоритмы `checkers:sacrifice` / `checkers:random` / `checkers:strong` регистрируются в `PARAMS.AI.ALGORITHMS` при загрузке контракта (side-effect, как `SCALE_MANA` → `PARAMS.SCALES.TYPES`). Больше не задаются в `games/checkers` scripts. API: экспорт `CheckersAiArgs`, `sacrifice` / `random` / `strong`.
|
|
26
|
+
- `ai/checkers` — AI-оркестрация шашек вынесена из `game/checkers` в `@vnejs/plugins.ai.checkers` (`PLUGIN_NAME` `CHECKERS_AI`). API: `EVENTS.CHECKERS_AI.INTERACT` / `SET` / `UNSET` (`vne:checkers_ai:*`); `CONST.CHECKERS_AI.SOURCE` (`"checkers.ai.interact"`); `CONST.CHECKERS_AI.EXEC_ACTIONS` / `AI_TYPES`; `PARAMS.CHECKERS_AI.AI_DELAY`; `shared.checkersAi`; модули `checkers.ai` / `checkers.ai.start` / `checkers.ai.interact` / `checkers.ai.move.played`. Вместо `EVENTS.CHECKERS.AI_INTERACT` / `AI_SET` / `AI_UNSET`, `PARAMS.CHECKERS.AI_DELAY`, `CONST.CHECKERS.AI_EXEC_ACTIONS` / `AI_TYPES`, модулей `checkers.ai.show` / `checkers.move.played`. `$ checkers.ai` без изменения синтаксиса. Бандл: `@vnejs/plugins.ai.checkers`.
|
|
27
|
+
- `game/checkers` — только правила / доска / ходы / `$ checkers`; цвета `AI_COLORS` / `AI_COLOR_VALUES` и `shared.checkersInteractDisableSources` остаются здесь.
|
|
28
|
+
- `game/checkers` — `BOARD_CHANGE` / `BOARD_CHANGED` / `BOARD_GET` без `ai`; конфиг сторон только в `shared.checkersAi` (`AI_SET` / `AI_UNSET`).
|
|
29
|
+
- `views.screens/checkers` — ACCEPT больше не эмитит `CHECKERS.FINISH` (только выбор клетки).
|
|
30
|
+
- `game/checkers` — `PARAMS.CHECKERS.FINISH_DELAY` вместо `TRANSITION` для паузы на `FINISH`.
|
|
31
|
+
- `views.screens/checkers` — `EVENTS.CHECKERS_VIEW.PLAYER_SELECT` / `CheckersPlayerSelectPayload`; модуль `checkers_view.player.select` (бывший `patchSelection`).
|
|
32
|
+
- `game/checkers` — `MOVE_PLAY` сам эмитит `MOVE_PLAYED` `{ move, … }` или при победе `FINISH`; call-sites больше не шлют `MOVE_PLAYED` вручную. API: `CheckersMovePlayPayload` = `CheckersMovePlayedPayload` + `move`.
|
|
33
|
+
- `views.screens/checkers` — `statusText` только во view (из `turn`/`winner` на `BOARD_CHANGED`); game модель без `statusText`.
|
|
34
|
+
- `game/checkers` / `views.screens/checkers` — `selected` / `legalMoves` только во view (`CHECKERS_VIEW.STATE_UPDATE`); `BOARD_CHANGE` / `BOARD_CHANGED` без них.
|
|
35
|
+
- `game/checkers` — правила / AI / `$ checkers` выделены из `views.screens/checkers` в `@vnejs/plugins.game.checkers` (`PLUGIN_NAME` `CHECKERS`). API: `EVENTS.CHECKERS.BOARD_CHANGED` / `BOARD_GET`; `PARAMS.CHECKERS.TRANSITION` (settle на `FINISH`); init доски на `SHOW` (`checkers.show`) → `START`. `PLAYER_INTERACT` убран из game.
|
|
36
|
+
- `views.screens/checkers` — только UI: `PLUGIN_NAME` `CHECKERS_VIEW`; события `vne:checkers_view:*`; `EVENTS.CHECKERS_VIEW.PLAYER_INTERACT` / `CLICK` / grid; bridge SHOW/HIDE; зеркало `BOARD_CHANGED` → grid. `player.interact` ходит в game через `MOVES_GET` / `MOVE_PLAY` / `BOARD_CHANGE`.
|
|
37
|
+
- `bundles/checkers` — импорт `@vnejs/plugins.game.checkers` + `@vnejs/plugins.views.screens.checkers`.
|
|
38
|
+
- `ai/ai` — диспетчер: `emitOne(EVENTS.AI.EMIT, { type, args })` → `PARAMS.AI.ALGORITHMS[type](args, module)`. Дефолт `PARAMS.AI.ALGORITHMS` — `{}`. API: `EVENTS.AI.EMIT`, `PARAMS.AI.ALGORITHMS`, `CONST.AI.PLAYER_TYPE` (`"player"`), типы `AiAlgorithm` / `AiAlgorithmContext` / `AiEmitPayload` (`type` вместо `id`).
|
|
39
|
+
- `views.screens/checkers` — (до сплита) `EVENTS.CHECKERS.MOVES_GET` / `MOVE_PLAY` / `MOVE_PLAYED` / `BOARD_CHANGE` / `PLAYER_INTERACT` / `AI_SET` / `AI_UNSET` / `AI_INTERACT` / `START`; `CONST.CHECKERS.AI_COLOR_VALUES` / `AI_EXEC_ACTIONS` / `EXEC_ACTIONS` (`show` / `hide`); модули `checkers.board`, `checkers.moves`, `checkers.move.play`, `checkers.move.played`, `checkers.player.interact`, `checkers.ai`, `checkers.ai.interact`, `checkers.ai.show`, `checkers.click`, `checkers.finish`, `checkers.controller.accept`. Алгоритмы в `games/checkers`. `$ checkers.ai set|unset` вместо `$ checkers ai`; `$ checkers show` без `emitNext` (сценарий ждёт `FINISH`); `$ checkers hide` → `HIDE` + `emitNext`. `FINISH` без `HIDE`. Удалён локальный `utils/ai` / `pickMove`. API: `EVENTS.CHECKERS.PLAYER_INTERACT`, `CheckersPlayerInteractPayload`; `EVENTS.CHECKERS.CLICK` вместо `CELL_CLICK` (`vne:checkers:click`) → `GRID_CLEAR` + `PLAYER_INTERACT`; `EVENTS.CHECKERS.AI_SET` / `CheckersAiSetPayload`; `EVENTS.CHECKERS.AI_UNSET` / `CheckersAiUnsetPayload` (`color`); `$ checkers.ai unset <color>` → сторона в `CONST.AI.PLAYER_TYPE`; `CONST.CHECKERS.AI_EXEC_ACTIONS` (`set` / `unset`); `CONST.AI.PLAYER_TYPE` вместо `CONST.CHECKERS.AI_TYPES.PLAYER`; `EVENTS.CHECKERS.START` (`afterShow`) → `AI_INTERACT` (`checkers.ai.show`); `EVENTS.CHECKERS.AI_INTERACT` вместо `AI_TURN`; `EVENTS.CHECKERS.MOVE_PLAYED` / `CheckersMovePlayedPayload` (`controllerType`); после хода `MOVE_PLAY` / `AI.EMIT` → `MOVE_PLAYED` → `AI_INTERACT` (`checkers.move.played`); `shared.checkersInteractDisableSources` (`SourcesSet`) вместо `checkersAiBusy` (source = `this.name` у `checkers.ai.interact`); вызов `AI.EMIT` с `{ type, args }`.
|
|
40
|
+
- `bundles/checkers` — подключает `@vnejs/plugins.ai`.
|
|
41
|
+
|
|
5
42
|
## 0.2.36
|
|
6
43
|
|
|
7
44
|
- `views.screens/checkers` — экран русских шашек: `$ checkers show`, сетка на `@vnejs/module.controller.arrows.grid`. API: `EVENTS.CHECKERS.*` (`SHOW` / `HIDE` / `ACCEPT` / `CELL_CLICK` / `FINISH` / `AI_TURN` / grid), `PARAMS.CHECKERS.ROWS` / `COLUMNS`, `CONST.CHECKERS.EXEC_ACTIONS`.
|
package/package.json
CHANGED
package/plugins/ai/ai.md
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
# plugins/ai/ai/
|
|
2
|
+
|
|
3
|
+
Пакет: `@vnejs/plugins.ai` · namespace: `AI`
|
|
4
|
+
|
|
5
|
+
Универсальный диспетчер AI-алгоритмов: `emitOne(EVENTS.AI.EMIT, { type, args })` вызывает `PARAMS.AI.ALGORITHMS[type](args, module)`. Доменные стратегии подключают свои контракты (side-effect на `PARAMS.AI.ALGORITHMS`), как [`ai/checkers`](./checkers.md).
|
|
6
|
+
|
|
7
|
+
## События
|
|
8
|
+
|
|
9
|
+
| Ключ | Строка | Смысл |
|
|
10
|
+
| ------ | ------------- | ------------------------------------------------------- |
|
|
11
|
+
| `EMIT` | `vne:ai:emit` | Request/response (`emitOne`): payload `{ type, args }`. |
|
|
12
|
+
|
|
13
|
+
```ts
|
|
14
|
+
emitOne(EVENTS.AI.EMIT, { type, args });
|
|
15
|
+
// → PARAMS.AI.ALGORITHMS[type](args, module) ?? null
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
| Поле | Тип | Смысл |
|
|
19
|
+
| ------ | --------- | ---------------------------------------------- |
|
|
20
|
+
| `type` | `string` | Ключ в `PARAMS.AI.ALGORITHMS`. |
|
|
21
|
+
| `args` | `unknown` | Произвольный payload для выбранного алгоритма. |
|
|
22
|
+
|
|
23
|
+
Второй аргумент алгоритма — модуль AI (`emit` / `emitOne` / `emitReal`), как у settings ACTIONS.
|
|
24
|
+
|
|
25
|
+
Результат: значение из алгоритма или `null` (нет `type` / нет функции / алгоритм вернул `null`). Поддерживается `async`.
|
|
26
|
+
|
|
27
|
+
## Константы
|
|
28
|
+
|
|
29
|
+
| Ключ | Тип / значение | Смысл |
|
|
30
|
+
| ------------- | -------------- | ------------------------------------------------------------------ |
|
|
31
|
+
| `PLAYER_TYPE` | `"player"` | Тип контроллера «человек» (не алгоритм из `PARAMS.AI.ALGORITHMS`). |
|
|
32
|
+
|
|
33
|
+
## Параметры
|
|
34
|
+
|
|
35
|
+
| Ключ | Тип / дефолт | Смысл |
|
|
36
|
+
| ------------ | ------------------------------------ | -------------------------------------------------------------------- |
|
|
37
|
+
| `ALGORITHMS` | `Record<string, AiAlgorithm>` → `{}` | Карта type → `(args, module) => result \| null`. Пусто по умолчанию. |
|
|
38
|
+
|
|
39
|
+
```ts
|
|
40
|
+
type AiAlgorithmContext = Pick<Module, "emit" | "emitOne" | "emitReal">;
|
|
41
|
+
type AiAlgorithm<TArgs = unknown, TResult = unknown> = (args: TArgs, module: AiAlgorithmContext) => TResult | null | Promise<TResult | null>;
|
|
42
|
+
type AiEmitPayload<TArgs = unknown> = { type?: string; args?: TArgs };
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
## Модули
|
|
46
|
+
|
|
47
|
+
| Модуль | Зона ответственности |
|
|
48
|
+
| --------- | ------------------------------------------------------------------ |
|
|
49
|
+
| `ai.emit` | `on(EVENTS.AI.EMIT)` → `PARAMS.AI.ALGORITHMS[type]?.(args, this)`. |
|
|
50
|
+
|
|
51
|
+
## Регистрация алгоритмов
|
|
52
|
+
|
|
53
|
+
Доменный контракт мутирует `PARAMS.AI.ALGORITHMS` при загрузке (как `SCALE_MANA` → `PARAMS.SCALES.TYPES`):
|
|
54
|
+
|
|
55
|
+
```ts
|
|
56
|
+
import { PARAMS as AI_PARAMS } from "@vnejs/contracts.ai";
|
|
57
|
+
|
|
58
|
+
AI_PARAMS.ALGORITHMS["checkers:sacrifice"] = sacrifice;
|
|
59
|
+
AI_PARAMS.ALGORITHMS["checkers:random"] = random;
|
|
60
|
+
AI_PARAMS.ALGORITHMS["checkers:strong"] = strong;
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
Шашечные `checkers:sacrifice` / `checkers:random` / `checkers:strong` — в [`ai/checkers`](./checkers.md). Игра может добавить свои ключи тем же способом или в скриптах.
|
|
64
|
+
|
|
65
|
+
Вызывающая сторона (например `ai/checkers`):
|
|
66
|
+
|
|
67
|
+
```ts
|
|
68
|
+
await this.emitOne(this.EVENTS.AI.EMIT, { type, args: { board, turn, controllerType: type } });
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
## Близкие плагины
|
|
72
|
+
|
|
73
|
+
- [ai/checkers.md](./checkers.md) — оркестрация шашек: `CHECKERS_AI.INTERACT` → `AI.EMIT`.
|
|
74
|
+
- [game/checkers.md](../game/checkers.md) — правила: `MOVES_GET` / `MOVE_PLAY`.
|
|
75
|
+
- [views.screens/checkers.md](../views.screens/checkers.md) — экран `CHECKERS_VIEW`.
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# plugins/ai/checkers/
|
|
2
|
+
|
|
3
|
+
Пакет: `@vnejs/plugins.ai.checkers` · namespace: `CHECKERS_AI`
|
|
4
|
+
|
|
5
|
+
AI-оркестрация русских шашек: конфиг сторон, цикл хода через `AI.EMIT`, `$ checkers.ai`, дефолтные алгоритмы `checkers:sacrifice` / `checkers:random` / `checkers:strong`. Правила доски — в [`game/checkers`](../game/checkers.md); UI — в [`views.screens/checkers`](../views.screens/checkers.md); диспетчер — в [`ai/ai`](./ai.md).
|
|
6
|
+
|
|
7
|
+
## События
|
|
8
|
+
|
|
9
|
+
| Ключ | Строка | Смысл |
|
|
10
|
+
| ---------- | -------------------------- | --------------------------------------- |
|
|
11
|
+
| `INTERACT` | `vne:checkers_ai:interact` | Ход AI (если сторона не `player`). |
|
|
12
|
+
| `SET` | `vne:checkers_ai:set` | `$ checkers.ai set`: `{ color, type }`. |
|
|
13
|
+
| `UNSET` | `vne:checkers_ai:unset` | `$ checkers.ai unset <color>`. |
|
|
14
|
+
|
|
15
|
+
Слушает `CHECKERS.START` → `INTERACT`; `CHECKERS.MOVE_PLAYED` → unlock + `INTERACT`. Сторона хода — с `TURNS.CHANGED` / `TURNS.UNSET`; победитель — с `CHECKERS.FINISH` / сброс на `SHOW`; `board` — с `GRID.CHANGED` / `GRID.UNSET` (`cells`, фильтр `CONST.CHECKERS.GRID_ID`).
|
|
16
|
+
|
|
17
|
+
## Константы / Shared / Params
|
|
18
|
+
|
|
19
|
+
| Ключ | Смысл |
|
|
20
|
+
| --------------------------------------------- | ----------------------------------------------------------------------- |
|
|
21
|
+
| `CONST.CHECKERS_AI.SOURCE` | `"checkers.ai.interact"` — ключ в `SourcesSet` |
|
|
22
|
+
| `CONST.CHECKERS_AI.EXEC_ACTIONS` / `AI_TYPES` | set/unset; `checkers:sacrifice` / `checkers:random` / `checkers:strong` |
|
|
23
|
+
| `shared.checkersAi` | `{ white, black }` → оба `player` по умолчанию |
|
|
24
|
+
| `PARAMS.CHECKERS_AI.AI_DELAY` | пауза перед ходом AI (мс, `1000`) |
|
|
25
|
+
|
|
26
|
+
Busy-флаг пишется в `shared.checkersInteractDisableSources` (владелец — `CHECKERS`).
|
|
27
|
+
|
|
28
|
+
Цвета сторон (`CONST.CHECKERS.COLORS`) — в контракте game.
|
|
29
|
+
|
|
30
|
+
При загрузке контракта в `PARAMS.AI.ALGORITHMS` регистрируются `checkers:sacrifice` / `checkers:random` / `checkers:strong` (мутация как у `SCALE_MANA` → `PARAMS.SCALES.TYPES`).
|
|
31
|
+
|
|
32
|
+
## Модули
|
|
33
|
+
|
|
34
|
+
| Модуль | Зона |
|
|
35
|
+
| ------------------------- | -------------------------------------------------- |
|
|
36
|
+
| `checkers.ai` | `$ checkers.ai set/unset` → `SET` / `UNSET` |
|
|
37
|
+
| `checkers.ai.start` | `CHECKERS.START` → `INTERACT` |
|
|
38
|
+
| `checkers.ai.interact` | `INTERACT` → delay → `AI.EMIT` (source = `SOURCE`) |
|
|
39
|
+
| `checkers.ai.move.played` | `CHECKERS.MOVE_PLAYED` → `rm(SOURCE)` → `INTERACT` |
|
|
40
|
+
|
|
41
|
+
## Сценарий
|
|
42
|
+
|
|
43
|
+
```vne
|
|
44
|
+
$ checkers.ai set white checkers:strong
|
|
45
|
+
$ checkers.ai set black player
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## Бандл
|
|
49
|
+
|
|
50
|
+
`@vnejs/bundles.checkers` — `plugins.common.grid` + `plugins.common.turn` + `plugins.ai` + `plugins.ai.checkers` + `plugins.game.checkers` + `plugins.views.screens.checkers`.
|
|
51
|
+
|
|
52
|
+
## Близкие плагины
|
|
53
|
+
|
|
54
|
+
- [common/grid.md](../common/grid.md) — `GRID` (доска)
|
|
55
|
+
- [common/turn.md](../common/turn.md) — `TURNS` (`id` / `owner`)
|
|
56
|
+
- [ai/ai.md](./ai.md) — `EVENTS.AI.EMIT` / `PARAMS.AI.ALGORITHMS`
|
|
57
|
+
- [game/checkers.md](../game/checkers.md) — правила, `START` / `MOVE_PLAYED`
|
|
58
|
+
- [views.screens/checkers.md](../views.screens/checkers.md) — UI, gate по `SourcesSet`
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# plugins/common/grid/
|
|
2
|
+
|
|
3
|
+
Пакет: `@vnejs/plugins.common.grid` · namespace: `GRID`
|
|
4
|
+
|
|
5
|
+
Хранит квадратные сетки по строковому `id` (несколько параллельных досок). Элемент клетки — любой объект с обязательным `id: string`; в одной сетке `id` уникален. Пустая клетка — `null`. Матрица — плотная `(item | null)[][]`.
|
|
6
|
+
|
|
7
|
+
Не путать с UI-навигацией `*.GRID_*` из `@vnejs/module.controller.arrows.grid` (фокус стрелками на экране).
|
|
8
|
+
|
|
9
|
+
## События
|
|
10
|
+
|
|
11
|
+
| Ключ | Строка | Смысл |
|
|
12
|
+
| --------- | ------------------ | ------------------------------------------------------------------------------------------------- |
|
|
13
|
+
| `SET` | `vne:grid:set` | Создать/заменить `{ id, rows, columns, cells? }`. Без `cells` — пустая матрица. Затем `CHANGED`. |
|
|
14
|
+
| `GET` | `vne:grid:get` | `emitOne({ id })` → `{ id, rows, columns, cells } \| undefined`. |
|
|
15
|
+
| `UNSET` | `vne:grid:unset` | Удалить по `{ id }`. Без `CHANGED`. |
|
|
16
|
+
| `CHANGED` | `vne:grid:changed` | Полный снимок после `SET` / `PUT` / `MOVE` / `REMOVE`. |
|
|
17
|
+
| `PUT` | `vne:grid:put` | `{ id, row, column, item }` — положить item; тот же `item.id` сначала снимается со старой клетки. |
|
|
18
|
+
| `MOVE` | `vne:grid:move` | `{ id, from, to }` — перенос; занятый `to` — замена. |
|
|
19
|
+
| `REMOVE` | `vne:grid:remove` | `{ id, row?, column?, itemId? }` — очистить по позиции или по `itemId`. |
|
|
20
|
+
|
|
21
|
+
State: map `id → { rows, columns, cells }`.
|
|
22
|
+
|
|
23
|
+
`STATE.SET` / `STATE.CLEAR` не пишут map напрямую: отсутствующие id — `UNSET`, присутствующие — `SET`.
|
|
24
|
+
|
|
25
|
+
## Константы / Params / Settings
|
|
26
|
+
|
|
27
|
+
Нет.
|
|
28
|
+
|
|
29
|
+
## Модули
|
|
30
|
+
|
|
31
|
+
| Модуль | Зона ответственности |
|
|
32
|
+
| ------ | ---------------------------------------------------------------- |
|
|
33
|
+
| `grid` | `SET` / `GET` / `UNSET` / `CHANGED` / `PUT` / `MOVE` / `REMOVE`. |
|
|
34
|
+
|
|
35
|
+
## Близкие плагины
|
|
36
|
+
|
|
37
|
+
- [game/checkers.md](../game/checkers.md) — пишет `GRID.SET` с `CONST.CHECKERS.GRID_ID`, читает через `GET`
|
|
38
|
+
- [views.screens/checkers.md](../views.screens/checkers.md) / [ai/checkers.md](../ai/checkers.md) — зеркало через `CHANGED` / `UNSET`
|
|
39
|
+
- [common/turn.md](./turn.md) — ход стороны (отдельный map)
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# plugins/common/turn/
|
|
2
|
+
|
|
3
|
+
Пакет: `@vnejs/plugins.common.turn` · namespace: `TURNS`
|
|
4
|
+
|
|
5
|
+
Хранит текущий ход по строковому `id` (несколько параллельных партий) и `owner` (кто ходит — произвольная строка).
|
|
6
|
+
|
|
7
|
+
## События
|
|
8
|
+
|
|
9
|
+
| Ключ | Строка | Смысл |
|
|
10
|
+
| --------- | ------------------- | ----------------------------------------------------------- |
|
|
11
|
+
| `SET` | `vne:turns:set` | Записать `{ id, owner }`. Без `id` или без `owner` — no-op. |
|
|
12
|
+
| `GET` | `vne:turns:get` | `emitOne({ id })` → `owner` (`string \| undefined`). |
|
|
13
|
+
| `UNSET` | `vne:turns:unset` | Удалить запись по `{ id }`. |
|
|
14
|
+
| `CHANGED` | `vne:turns:changed` | После успешного `SET`: `{ id, owner }`. |
|
|
15
|
+
|
|
16
|
+
State: map `id → owner`.
|
|
17
|
+
|
|
18
|
+
`STATE.SET` / `STATE.CLEAR` не пишут map напрямую: для новых и изменённых id — `TURNS.SET`, для удалённых — `TURNS.UNSET`.
|
|
19
|
+
|
|
20
|
+
## Константы / Params / Settings
|
|
21
|
+
|
|
22
|
+
Нет.
|
|
23
|
+
|
|
24
|
+
## Модули
|
|
25
|
+
|
|
26
|
+
| Модуль | Зона ответственности |
|
|
27
|
+
| ------- | ------------------------------------ |
|
|
28
|
+
| `turns` | `SET` / `GET` / `UNSET` / `CHANGED`. |
|
|
29
|
+
|
|
30
|
+
## Близкие плагины
|
|
31
|
+
|
|
32
|
+
- [game/checkers.md](../game/checkers.md) — пишет `TURNS.SET` с `CONST.CHECKERS.TURN_ID`, читает через `GET`; доска — через [`common/grid`](./grid.md)
|
|
33
|
+
- [views.screens/checkers.md](../views.screens/checkers.md) / [ai/checkers.md](../ai/checkers.md) — зеркало через `CHANGED` / `UNSET`
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
# plugins/game/checkers/
|
|
2
|
+
|
|
3
|
+
Пакет: `@vnejs/plugins.game.checkers` · namespace: `CHECKERS`
|
|
4
|
+
|
|
5
|
+
Правила русских шашек и сценарные команды `$ checkers`. AI-оркестрация — в [`ai/checkers`](../ai/checkers.md) (`CHECKERS_AI`). UI — в [`views.screens/checkers`](../views.screens/checkers.md) (`CHECKERS_VIEW`). Доска — в [`common/grid`](../common/grid.md) (`GRID`). Ход стороны — в [`common/turn`](../common/turn.md) (`TURNS`).
|
|
6
|
+
|
|
7
|
+
## События
|
|
8
|
+
|
|
9
|
+
| Ключ | Строка | Смысл |
|
|
10
|
+
| -------------- | --------------------------- | -------------------------------------------------------------------------------------------------- |
|
|
11
|
+
| `SHOW` | `vne:checkers:show` | Старт: `SET` (`cells` + `owner`) → `START`. Payload: `{ initialOwner?, initialPreset? }`. |
|
|
12
|
+
| `HIDE` | `vne:checkers:hide` | `UNSET` + сброс busy sources. |
|
|
13
|
+
| `START` | `vne:checkers:start` | Партия готова (слушает `CHECKERS_AI` → `INTERACT`). |
|
|
14
|
+
| `SET` | `vne:checkers:set` | `{ cells, owner }` → `GRID.SET` + `TURNS.SET` (id / rows / columns из констант). |
|
|
15
|
+
| `UNSET` | `vne:checkers:unset` | `GRID.UNSET` + `TURNS.UNSET` по `GRID_ID` / `TURN_ID`. |
|
|
16
|
+
| `STATE_UPDATE` | `vne:checkers:state_update` | Патч game-стейта (без board). |
|
|
17
|
+
| `FINISH` | `vne:checkers:finish` | Конец партии: `{ winner }` → delay → `sources.clear()` + `emitNext`. |
|
|
18
|
+
| `MOVES_GET` | `vne:checkers:moves_get` | `emitOne`: `{ board, turn }` → `{ moves, hanging, safe }`. |
|
|
19
|
+
| `MOVE_PLAY` | `vne:checkers:move_play` | `emitOne`: `{ move, controllerType? }` → `boolean`; успех → `MOVE_PLAYED` или при победе `FINISH`. |
|
|
20
|
+
| `MOVE_PLAYED` | `vne:checkers:move_played` | После хода (из `MOVE_PLAY`); цикл AI — в `CHECKERS_AI`. |
|
|
21
|
+
|
|
22
|
+
`MOVE_PLAY` читает доску через `GRID.GET` и сторону через `TURNS.GET`; после хода пишет `CHECKERS.SET`. Победа — только через `FINISH` (`CheckersFinishPayload`).
|
|
23
|
+
|
|
24
|
+
## Константы / Shared / Params
|
|
25
|
+
|
|
26
|
+
| Ключ | Смысл |
|
|
27
|
+
| ------------------------------------------ | -------------------------------------------------------------------------- |
|
|
28
|
+
| `EXEC_ACTIONS` / `COLORS` / `COLOR_VALUES` | show/hide; white/black |
|
|
29
|
+
| `CONST.CHECKERS.TURN_ID` | `"checkers"` — id в `TURNS` |
|
|
30
|
+
| `CONST.CHECKERS.GRID_ID` | `"checkers"` — id в `GRID` |
|
|
31
|
+
| `shared.checkersInteractDisableSources` | `SourcesSet` — блок интерактива на ход AI |
|
|
32
|
+
| `PARAMS.CHECKERS.FINISH_DELAY` | пауза перед `emitNext` на `FINISH` (мс, `300`) |
|
|
33
|
+
| `PARAMS.CHECKERS.ROWS` / `COLUMNS` | `8` — размер для `GRID.SET` (внутри `SET`) |
|
|
34
|
+
| `PARAMS.CHECKERS.PRESETS` | пресеты доски: `COMMON`, `FLIPPED`, `RANDOM` (RANDOM каждый `SHOW` заново) |
|
|
35
|
+
|
|
36
|
+
## Модули
|
|
37
|
+
|
|
38
|
+
| Модуль | Зона |
|
|
39
|
+
| --------------------------------------- | ------------------------------------------------------ |
|
|
40
|
+
| `checkers` | `$ checkers show/hide` |
|
|
41
|
+
| `checkers.show` | SHOW → `SET` + START; HIDE → `UNSET` |
|
|
42
|
+
| `checkers.set` | `SET` → `GRID`/`TURNS`; `UNSET` → `GRID`/`TURNS` UNSET |
|
|
43
|
+
| `checkers.moves` / `checkers.move.play` | ходы; `move.play` → `SET` / `FINISH` |
|
|
44
|
+
| `checkers.finish` | FINISH → delay + `emitNext` |
|
|
45
|
+
|
|
46
|
+
## Сценарий
|
|
47
|
+
|
|
48
|
+
```vne
|
|
49
|
+
$ checkers show
|
|
50
|
+
$ checkers show
|
|
51
|
+
initialOwner: black
|
|
52
|
+
initialPreset: COMMON
|
|
53
|
+
$ checkers hide
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
Args под `show`: `initialOwner` (`white` / `black`, иначе белые); `initialPreset` (ключ из `PARAMS.CHECKERS.PRESETS`, дефолт `COMMON`).
|
|
57
|
+
|
|
58
|
+
`$ checkers.ai` — см. [`ai/checkers`](../ai/checkers.md).
|
|
59
|
+
|
|
60
|
+
## Бандл
|
|
61
|
+
|
|
62
|
+
`@vnejs/bundles.checkers` — `plugins.common.grid` + `plugins.common.turn` + `plugins.game.checkers` + `plugins.ai.checkers` + `plugins.views.screens.checkers` + `plugins.ai`.
|
|
63
|
+
|
|
64
|
+
## Близкие плагины
|
|
65
|
+
|
|
66
|
+
- [common/grid.md](../common/grid.md) — `GRID` (доска)
|
|
67
|
+
- [common/turn.md](../common/turn.md) — `TURNS` (`id` / `owner`)
|
|
68
|
+
- [ai/checkers.md](../ai/checkers.md) — `CHECKERS_AI`
|
|
69
|
+
- [views.screens/checkers.md](../views.screens/checkers.md) — `CHECKERS_VIEW`
|
|
70
|
+
- [ai/ai.md](../ai/ai.md) — диспетчер `AI.EMIT`
|
|
@@ -1,102 +1,53 @@
|
|
|
1
1
|
# plugins/views.screens/checkers/
|
|
2
2
|
|
|
3
|
-
Пакет: `@vnejs/plugins.views.screens.checkers` · namespace: `
|
|
3
|
+
Пакет: `@vnejs/plugins.views.screens.checkers` · namespace: `CHECKERS_VIEW`
|
|
4
4
|
|
|
5
|
-
Экран русских шашек: доска 8×8,
|
|
5
|
+
Экран русских шашек: доска 8×8, сетка, клик / ACCEPT. Правила — в [`game/checkers`](../game/checkers.md) (`CHECKERS`); AI — в [`ai/checkers`](../ai/checkers.md) (`CHECKERS_AI`).
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
| Ключ | Строка | Смысл |
|
|
10
|
-
| ------------------- | -------------------------------- | ------------------------------------------- |
|
|
11
|
-
| `SHOW` | `vne:checkers:show` | Показать экран и начать партию. |
|
|
12
|
-
| `HIDE` | `vne:checkers:hide` | Скрыть экран. |
|
|
13
|
-
| `UPDATE` | `vne:checkers:update` | Обновить React-view. |
|
|
14
|
-
| `UPDATE_FAST` | `vne:checkers:update_fast` | Быстрый апдейт view (фокус сетки). |
|
|
15
|
-
| `ACCEPT` | `vne:checkers:accept` | Выбор фигуры / клетки / закрытие после win. |
|
|
16
|
-
| `STATE_UPDATE` | `vne:checkers:state_update` | Патч стейта (доска, ход, сетка). |
|
|
17
|
-
| `GRID_NEXT` | `vne:checkers:grid_next` | Край сетки (отключён флагами). |
|
|
18
|
-
| `GRID_PREV` | `vne:checkers:grid_prev` | Край сетки (отключён флагами). |
|
|
19
|
-
| `GRID_CLEAR` | `vne:checkers:grid_clear` | Сброс `gridRow` / `gridColumn`. |
|
|
20
|
-
| `GRID_UPDATE_ITEMS` | `vne:checkers:grid_update_items` | Пересобрать `gridItems` (64 клетки). |
|
|
21
|
-
| `CELL_CLICK` | `vne:checkers:cell_click` | Клик по клетке → фокус + ACCEPT. |
|
|
22
|
-
| `FINISH` | `vne:checkers:finish` | Конец партии → HIDE + `emitNext`. |
|
|
23
|
-
| `AI_TURN` | `vne:checkers:ai_turn` | Ход AI (после SHOW / хода человека). |
|
|
24
|
-
|
|
25
|
-
## Константы
|
|
26
|
-
|
|
27
|
-
| Ключ | Смысл |
|
|
28
|
-
| -------------- | --------------------------------------------- |
|
|
29
|
-
| `EXEC_ACTIONS` | `SHOW` → `"show"`, `AI` → `"ai"`. |
|
|
30
|
-
| `AI_COLORS` | `WHITE` / `BLACK` → `"white"` / `"black"`. |
|
|
31
|
-
| `AI_TYPES` | `PLAYER` / `SACRIFICE` / `RANDOM` / `STRONG`. |
|
|
7
|
+
Bridge: `CHECKERS.SHOW/HIDE` → `CHECKERS_VIEW.SHOW/HIDE`. Модель доски зеркалится с `GRID.CHANGED` / `GRID.UNSET` (`cells` → `board`, фильтр `CONST.CHECKERS.GRID_ID`); сторона хода — с `TURNS.CHANGED` / `TURNS.UNSET`; победитель — с `CHECKERS.FINISH` `{ winner }` (сброс на `SHOW`).
|
|
32
8
|
|
|
33
|
-
##
|
|
9
|
+
## События
|
|
34
10
|
|
|
35
|
-
| Ключ
|
|
36
|
-
|
|
|
37
|
-
| `
|
|
38
|
-
| `
|
|
11
|
+
| Ключ | Строка | Смысл |
|
|
12
|
+
| ------------------------ | ------------------------------------ | ------------------------------------------------------------------------ |
|
|
13
|
+
| `SHOW` / `HIDE` | `vne:checkers_view:show` / `…:hide` | Показ / скрытие экрана. |
|
|
14
|
+
| `UPDATE` / `UPDATE_FAST` | `vne:checkers_view:update` / `_fast` | React-view. |
|
|
15
|
+
| `ACCEPT` | `vne:checkers_view:accept` | Выбор клетки → `GRID_CLEAR` + `PLAYER_INTERACT`. |
|
|
16
|
+
| `STATE_UPDATE` | `vne:checkers_view:state_update` | Патч view-стейта (grid + зеркало доски). |
|
|
17
|
+
| `GRID_*` | `vne:checkers_view:grid_*` | Навигация сетки. |
|
|
18
|
+
| `CLICK` | `vne:checkers_view:click` | Клик → `GRID_CLEAR` + `PLAYER_INTERACT`. |
|
|
19
|
+
| `PLAYER_INTERACT` | `vne:checkers_view:player_interact` | UX выбора фигуры / клетки → `MOVES_GET` / `MOVE_PLAY` / `PLAYER_SELECT`. |
|
|
20
|
+
| `PLAYER_SELECT` | `vne:checkers_view:player_select` | Патч `selected` / `legalMoves` → `gridItems` + `UPDATE_FAST`. |
|
|
39
21
|
|
|
40
22
|
## Параметры
|
|
41
23
|
|
|
42
|
-
| Ключ
|
|
43
|
-
|
|
|
44
|
-
| `TRANSITION`
|
|
45
|
-
| `
|
|
46
|
-
| `
|
|
47
|
-
| `
|
|
48
|
-
| `
|
|
49
|
-
| `CELL_SIZE` | `number` | Размер клетки в design-единицах (`getVneLength`). |
|
|
50
|
-
| `CELL_GAP` | `number` | Зазор между клетками. |
|
|
51
|
-
| `GRAVEYARD_GAP` | `number` | Отступ между доской и «кладбищем» взятых фигур. |
|
|
52
|
-
| `VIEW_PROPS` | `object` | Layout screen / status / flex. Доска — CSS grid 8×8 в view. |
|
|
24
|
+
| Ключ | Смысл |
|
|
25
|
+
| ------------------------------------------ | ------------------------------------ |
|
|
26
|
+
| `TRANSITION` | анимации экрана / клеток (мс, `300`) |
|
|
27
|
+
| `ZINDEX` | z-index экрана |
|
|
28
|
+
| `ROWS` / `COLUMNS` | `8` |
|
|
29
|
+
| `CELL_SIZE` / `CELL_GAP` / `GRAVEYARD_GAP` | layout доски |
|
|
30
|
+
| `VIEW_PROPS` | layout screen / status / flex |
|
|
53
31
|
|
|
54
32
|
## Модули
|
|
55
33
|
|
|
56
|
-
| Модуль
|
|
57
|
-
|
|
|
58
|
-
| `
|
|
59
|
-
| `
|
|
60
|
-
| `
|
|
61
|
-
| `
|
|
62
|
-
| `
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
| Ключ | Поведение |
|
|
67
|
-
| ----------- | -------------------------------------------------------------------------- |
|
|
68
|
-
| `player` | ход человеком |
|
|
69
|
-
| `sacrifice` | среди ходов, после которых у противника есть взятие; иначе любой легальный |
|
|
70
|
-
| `random` | любой легальный ход |
|
|
71
|
-
| `strong` | среди ходов без ответа-взятия; если таких нет — среди «подставляющих» |
|
|
34
|
+
| Модуль | Зона |
|
|
35
|
+
| ------------------------------------------------ | ------------------------------------------------------ |
|
|
36
|
+
| `checkers_view.bridge` | SHOW/HIDE bridge |
|
|
37
|
+
| `checkers_view.controller` / `.grid` / `.accept` | экран, сетка, ACCEPT |
|
|
38
|
+
| `checkers_view.click` / `.player.interact` | клик и выбор (game: `MOVES_GET` / `MOVE_PLAY`) |
|
|
39
|
+
| `checkers_view.player.select` | `PLAYER_SELECT` → selection + grid |
|
|
40
|
+
| `checkers_view.board` | `GRID.CHANGED` / `UNSET` → `gridItems` + `UPDATE_FAST` |
|
|
41
|
+
| `checkers_view.status` | `TURNS` / `FINISH` / `SHOW` → status text |
|
|
42
|
+
| `checkers_view.view` | React |
|
|
72
43
|
|
|
73
44
|
## Сценарий
|
|
74
45
|
|
|
75
|
-
|
|
76
|
-
% choose
|
|
77
|
-
title: "Кто управляет белыми?"
|
|
78
|
-
% choose.option "Игрок"
|
|
79
|
-
$ checkers ai white player
|
|
80
|
-
% choose.option "Слабый ИИ"
|
|
81
|
-
$ checkers ai white sacrifice
|
|
82
|
-
% choose.option "Средний ИИ"
|
|
83
|
-
$ checkers ai white random
|
|
84
|
-
% choose.option "Сильный ИИ"
|
|
85
|
-
$ checkers ai white strong
|
|
86
|
-
% choose
|
|
87
|
-
title: "Кто управляет чёрными?"
|
|
88
|
-
% choose.option "Игрок"
|
|
89
|
-
$ checkers ai black player
|
|
90
|
-
% choose.option "Слабый ИИ"
|
|
91
|
-
$ checkers ai black sacrifice
|
|
92
|
-
% choose.option "Средний ИИ"
|
|
93
|
-
$ checkers ai black random
|
|
94
|
-
% choose.option "Сильный ИИ"
|
|
95
|
-
$ checkers ai black strong
|
|
96
|
-
$ checkers show
|
|
97
|
-
```
|
|
46
|
+
`$ checkers` — [`game/checkers`](../game/checkers.md); `$ checkers.ai` — [`ai/checkers`](../ai/checkers.md).
|
|
98
47
|
|
|
99
|
-
##
|
|
48
|
+
## Близкие плагины
|
|
100
49
|
|
|
101
|
-
-
|
|
102
|
-
-
|
|
50
|
+
- [common/grid.md](../common/grid.md) — `GRID` (доска)
|
|
51
|
+
- [common/turn.md](../common/turn.md) — `TURNS` (`id` / `owner`)
|
|
52
|
+
- [game/checkers.md](../game/checkers.md) — правила
|
|
53
|
+
- [ai/checkers.md](../ai/checkers.md) — AI
|