Модуль Чата (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>
70 lines
5.7 KiB
Markdown
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` напрямую. Добавлены разворот на весь экран и тесты (пустое сообщение, обрезка, событие, предел истории). |
|