Files
AlexanderandClaude Opus 5.5 15b06b8f42 Модули Чата и Круга, разворот чата на весь экран, кнопка «Почта» в Safe Area
Модуль Чата (Bogatyri.Chat, без Unity):
- чат вынесен из Social в отдельный модуль; контракт IChat в ядре,
  событие ChatMessageReceivedEvent, LocalPlayer (id и имя игрока)
- панель чата работает только через контракт и события
- разворот чата на весь экран: кнопка «Развернуть/Свернуть» или Esc

Модуль Круга (Bogatyri.Circle, без Unity):
- основать Круг, вступить, выйти; роли главы и участника; 30 мест
- уход главы передаёт главенство, последний участник распускает Круг
- секция сохранения "circle", участвует в сбросе сохранений
- окно «Круг» (кнопка внизу карты мира), демо-Круги до появления сервера
- канал «Круг» в чате — только для участников Круга

Прочее:
- кнопка «Почта» привязана к правому краю нижней панели
  (в безопасной зоне она уезжала за экран)
- тесты Чата и Круга; документы Chat.md, Circle.md, обновлены README, Core, Save

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 19:07:45 +02:00

70 lines
5.7 KiB
Markdown

# Чат
Общий чат мира и чат Круга: история сообщений, отправка от имени игрока, новые сообщения для интерфейса.
- **Сборка:** `Bogatyri.Chat` (без Unity — когда появится сервер, модуль заменится сетевой реализацией того же контракта).
- **Папка:** `Assets/Scripts/Modules/Chat`.
- **Зависит от:** ядра.
## Контракт `IChat`
| Член | Что делает |
| --- | --- |
| `MaxMessageLength` | Максимальная длина сообщения (200 символов). |
| `GetMessages(channel)` | История канала: `ChatChannel.World` или `ChatChannel.Circle`. |
| `CanWrite(channel)` | Можно ли писать в канал: в «Круг» — только состоя в Круге. |
| `Send(channel, text)` | Отправить от имени локального игрока. Пробелы по краям обрезаются, слишком длинный текст укорачивается. Пустое сообщение и сообщение в «Круг» без Круга не отправляются (`false`). |
Получить: `GameServices.Get<IChat>()`. Регистрирует `App/GameModules`.
Типы в ядре:
- `ChatChannel`;
- `ChatMessage` (`channel`, `senderId`, `senderName`, `text`, `timeMs`);
- `LocalPlayer` (`Id`, `Name` — пока одно имя «Богатырь» на устройство).
## События
- **Публикует:** `ChatMessageReceivedEvent` — новое сообщение в любом канале, своё или чужое.
- **Слушает:**
- `CircleJoinedEvent` — лента «Круг» очищается, появляется системное сообщение «Вы вступили в Круг…» или «Вы основали Круг…»;
- `CircleLeftEvent` — лента «Круг» очищается, появляется «Вы покинули Круг…» или «Круг распущен»;
- `GameResetEvent` — лента «Круг» очищается.
## Сохранение
Нет. История живёт, пока открыта игра, и не теряется при переходе город ↔ карта мира. В каждом канале хранятся последние 100 сообщений. Переписку будет хранить сервер.
## Интерфейс (слой приложения)
`Assets/Scripts/Social/ChatPanel.cs` — панель на карте мира:
- **вкладки** «Общий мир» и «Круг»;
- **лента сообщений**: время, имя, текст; у каждого игрока свой цвет имени, своё имя золотое; теги оформления в тексте игрока не срабатывают (`<noparse>`);
- **поле ввода**: отправка кнопкой «>» или клавишей Enter;
- **разворот на весь экран**: кнопка «Развернуть» / «Свернуть» в правом верхнем углу или клавиша Esc.
- В развёрнутом виде окно занимает всю безопасную зону экрана, шрифт крупнее в 1,25 раза, видно 100 последних сообщений (в компактном — 30).
- Если сцена собрана до появления кнопки, панель создаёт её сама.
Панель работает только через `IChat` и `ChatMessageReceivedEvent`.
## Файлы
| Файл | Что это |
| --- | --- |
| `Modules/Chat/ChatService.cs` | Реализация `IChat`: история каналов, отправка, демо-сообщения других игроков. |
| `Modules/Core/LocalPlayer.cs` | Id и имя локального игрока. |
| `Social/ChatPanel.cs` (слой приложения) | Панель чата. |
| `Editor/WorldMapSceneBuilder.cs` | Собирает панель чата в сцене карты мира. |
## Решения и план
- **Сервер (этап 10):** сетевая реализация `IChat`. Входящие сообщения — через `ChatService.Receive` → `ChatMessageReceivedEvent`.
- **Круг:** канал «Круг» привязан к модулю Круга. Если игрок не в Круге, поле ввода выключено, а в ленте подсказка открыть «Круг». Когда появится сервер, переписка Круга будет приходить с него.
- **Демо-сообщения** убрать, когда появятся настоящие игроки.
## Журнал изменений
| Дата | Кто | Что |
| --- | --- | --- |
| 19.10.2026 | Claude | Канал «Круг» привязан к модулю Круга: `IChat.CanWrite`, системные сообщения о вступлении и выходе, подсказка и выключенный ввод без Круга. Демо-сообщения в канале «Круг» убраны. |
| 19.10.2026 | Claude | Чат вынесен в отдельный модуль `Bogatyri.Chat`: контракт `IChat`, событие `ChatMessageReceivedEvent`, `LocalPlayer` в ядре. Панель чата больше не обращается к `MarchManager` и `ChatService` напрямую. Добавлены разворот на весь экран и тесты (пустое сообщение, обрезка, событие, предел истории). |