squad-proto/docs/19-agent.md
z.kirill 4382af2322 Документация: границы движка, работа через модель, дизайн игры до лейтгейма
18-engine.md    границы Tile2D, проекции 2D, формат проекта, второй проект
  19-agent.md     инструменты --tool, скиллы, терминал в редакторе
  20-gdd.md       акты, петли, рост отряда, закон масштаба, бюджет 200 часов
  21-damage.md    семь стихий, статусы, десять реакций, формулы, триггеры
  22-loot.md      редкости, аффиксы, артефакты, зачарования, материалы
  23-endgame.md   Бездна, мутации, лидерборды, 262 ачивки

Плюс правки 01/02/07/15/16/17 под переехавшие пути и новые правила забега.

Дизайнерская часть держится на одном законе: угроза растёт квадратично, сила
отряда — линейно с затуханием, разрыв закрывается ЗНАНИЕМ, а не числами. Из
него выведены и экономика опыта (41 млн против 44 млн дохода), и то, почему
реакции считаются от глубины, а не от урона оружия, и почему в Бездне
множитель HP разрешён, а во всём авторском контенте запрещён.

.claude/commands: скиллы /tile2d, /room, /floor — правила этого движка,
которые нельзя вывести из кода. Главное записано первым: не отчитываться об
успехе без прохода --tool validate.

Числа в этих документах — вход для инструментов, а не украшение. Расхождение
между таблицей и выводом инструмента означает, что неправ документ.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-13 21:07:45 +03:00

135 lines
9.4 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 19 — Движок и языковая модель
## Из чего это сделано
Три вещи, и порядок между ними важен:
| Что | Где | Зачем |
|---|---|---|
| **инструменты** | `tile2d_editor --tool ...` | обратная связь: во что превращается содержимое |
| **скиллы** | `.claude/commands/*.md` | правила этого движка, которые нельзя вывести из кода |
| **терминал** | панель снизу в редакторе, клавиша `` ` `` | место, где всё это встречается |
Инструменты — главное. Терминал без них был бы просто консолью в чужом окне.
## Почему именно инструменты, а не «API редактора»
Содержимое проекта уже текст: комнаты, каталог сущностей и манифест лежат в git
и правятся руками. Значит, править их умеет кто угодно, включая модель, —
открыл файл, изменил, сохранил. Никакого особого интерфейса для этого не нужно.
Чего у модели нет — **последствий**. Собралась ли комната в этаж, достижима ли
точка спавна от входа, выбрал ли этаж бюджет опасности, во что превращается
набор на двадцать четвёртом этаже: на эти вопросы нельзя ответить, глядя на
текст комнаты. Их знает только генератор.
Поэтому инструменты — это замкнутая петля: **правка делается файлами, а
последствия читаются командой**. И всё выводится текстом, включая карту
собранного этажа, — по той же причине, по которой ассеты проверяются через
`sf ascii`, а не глазами по PNG: картинку нельзя ни продиффать, ни процитировать
в отчёте, ни сравнить с такой же картинкой другого сида.
```
tile2d_editor --tool map 3 42 --project hollow
20 ###.o.......#######.........#########.###.######
21 ###..##.##..#######..##.##..####...........#####
22 ##....@....................................#####
23 ##.....#...............#.........###.......#####
# стена . пол @ старт > спуск < эвакуация m тварь o обстановка $ лут
```
Полный список — `--tool help`. Код возврата 1 означает «не выполнено или найдена
поломка», поэтому на инструменты можно вешать хуки и скрипты, а не читать вывод
глазами.
![инструменты в терминале редактора](editor-terminal-tools.png)
## Терминал
![терминал редактора](editor-terminal.png)
Клавиша `` ` `` открывает панель снизу. Команды выполняются в **корне
репозитория**: работают не только над содержимым — рядом код движка, документация
и git. Каталог с бинарниками добавлен в `PATH`, поэтому `tile2d_editor --tool
validate` пишется без путей.
Строка ввода работает в трёх режимах, Tab переключает:
| режим | что делает с введённой строкой |
|---|---|
| `shell$` | выполняет как команду |
| `claude>` | `claude -p "..."` |
| `codex>` | `codex exec "..."` |
Одно поле, а не три — потому что работа выглядит как чередование: спросил,
посмотрел, проверил инструментом, снова спросил.
Открытый в редакторе проект уходит детям переменной окружения `TILE2D_PROJECT`.
Поэтому `--tool validate` без ключей проверяет именно его — и то же самое видит
агент, запущенный отсюда. Дописывать `--project` в чужие команды строковой
подстановкой было бы способом однажды подставить его не туда.
### Чего терминал НЕ делает
Он не эмулятор терминала. Полный VT100 — альтернативный экран, адресация
курсора, рамки из псевдографики — нужен ровно одному сорту программ:
интерактивным TUI, и `claude` без ключей именно такой.
Строчный вывод здесь не упрощение, а выбор в пользу того, как с моделью работают
из редактора на самом деле: `claude -p` и `codex exec` печатают обычный текст,
инструменты печатают таблицы и карты, git и cmake — тоже текст. Эмулятор не нужен
ни одному из них.
Полный интерактивный CLI открывается кнопкой `EXTERNAL` (или `F12`) во внешнем
окне, в том же рабочем каталоге. Так у каждого способа остаётся то, в чём он
хорош, и ни один не притворяется другим.
Шрифт панели — Consolas с кириллицей, а не встроенный шрифт raylib. Правило
«тексты на экране латиницей» здесь не нарушается: оно про ИГРУ, где текст пишет
разработчик. В терминал текст приходит извне, и выбора языка нет.
## Скиллы
`.claude/commands/`: `/tile2d` — работа над проектом вообще, `/room` — сделать
или починить комнату, `/floor` — править кривую сложности.
В них записано то, чего нет в коде и что модель иначе узнаёт слишком поздно:
- **не отчитываться об успехе без прохода `--tool validate`.** Комната, которая
безупречно читается в диффе, может запечатать карман от собственной двери —
в этом репозитории так случилось дважды (`storage`, потом `maw`);
- **id сущностей — граница игры, а не движка.** Движок поставит любой id из
каталога проекта; `squad_proto` превращает в тварь только те, что перечислены
в `src/sim/spawn_catalog.cpp`;
- глубину нельзя делать труднее множителями HP — это не страшнее, это дольше;
- приёмка меряется в песочнице и проект не подключает.
## Проверки
```bash
tile2d_editor --tool validate --project descent # код 0
tile2d_editor --tool validate --project hollow # код 0
tile2d_editor --tool map 6 1 --project descent # карта этажа текстом
tile2d_editor --term "tile2d_editor --tool floor 8 42" # то же изнутри редактора
```
Ключ `--term "<команда>"` открывает редактор сразу с выполненной командой. Он
нужен не только для картинок в документации: так редактор открывают «с делом» —
открыл, и уже видно, что не сходится.
## Чего ещё нет
- **Инструментов на запись.** Всё, что здесь есть, только читает и считает;
правит модель сами файлы. Это осознанно: запись через инструмент означала бы
второй способ менять комнату, и рано или поздно они разошлись бы.
- **MCP-сервера.** Инструменты доступны как команды, а не как протокол. Для
`claude` и `codex` этого достаточно; для редакторов, которые умеют только MCP,
понадобится обёртка.
- **Своей истории диалога.** Каждый вызов `claude -p` независим; терминал хранит
историю КОМАНД, но не контекст разговора. Длинную работу ведут во внешнем
интерактивном CLI.
- **Правки текущей комнаты из терминала.** Модель работает с файлами на диске, а
редактор держит рабочую копию в памяти: после правки файла нажмите `RELOAD`.