Модуль Чата (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>
5.7 KiB
5.7 KiB
Чат
Общий чат мира и чат Круга: история сообщений, отправка от имени игрока, новые сообщения для интерфейса.
- Сборка:
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 напрямую. Добавлены разворот на весь экран и тесты (пустое сообщение, обрезка, событие, предел истории). |