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

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