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