Модуль Чата (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>
96 lines
6.1 KiB
Markdown
96 lines
6.1 KiB
Markdown
# Круг
|
|
|
|
Объединение игроков: основать свой Круг, вступить в чужой, выйти; роли главы и участника. Это этап 7 плана. Территория Круга — крепость, казна, гарнизон — будет на этапе 8, поверх этого модуля.
|
|
|
|
- **Сборка:** `Bogatyri.Circle` (без Unity — когда появится сервер, список Кругов и состав будут приходить с него).
|
|
- **Папка:** `Assets/Scripts/Modules/Circle`.
|
|
- **Зависит от:** ядра.
|
|
|
|
## Контракт `ICircle`
|
|
|
|
| Член | Что делает |
|
|
| --- | --- |
|
|
| `Current` | Круг игрока (`CircleInfo`: id, название, участники); `null` — игрок не в Круге. |
|
|
| `IsInCircle`, `IsLeader` | В Круге ли игрок и глава ли он. |
|
|
| `MaxMembers` | Мест в Круге — 30. |
|
|
| `GetCircles()` | Все Круги, в которые можно вступить. |
|
|
| `TryCreate(name, out error)` | Основать Круг; создатель становится главой. |
|
|
| `TryJoin(circleId, out error)` | Вступить участником. |
|
|
| `Leave()` | Выйти. |
|
|
|
|
Получить: `GameServices.Get<ICircle>()`. Регистрирует `App/GameModules`.
|
|
|
|
## Правила
|
|
|
|
| Ситуация | Что происходит |
|
|
| --- | --- |
|
|
| Основать или вступить, уже состоя в Круге | Нельзя: сначала нужно выйти. Игрок состоит только в одном Круге. |
|
|
| Название Круга | От 3 до 24 символов, без `\|`, `<`, `>` и переводов строки. Название не должно повторять существующее, регистр не важен. |
|
|
| Круг полон (30 из 30) | Вступить нельзя. |
|
|
| Выходит глава, в Круге есть другие | Главой становится старейший участник. |
|
|
| Выходит единственный участник | Круг распускается. |
|
|
|
|
## События
|
|
|
|
**Публикует:**
|
|
|
|
- `CircleJoinedEvent` — игрок вступил (`Created = false`) или основал Круг (`Created = true`);
|
|
- `CircleLeftEvent` — игрок вышел (`Disbanded = true` — Круг распущен).
|
|
|
|
**Слушает:** ничего.
|
|
|
|
На события Круга подписан модуль Чата: канал «Круг» становится перепиской текущего Круга игрока.
|
|
|
|
## Сохранение
|
|
|
|
Секция `"circle"`. Модуль без Unity, поэтому это не JSON, а простые строки:
|
|
|
|
```
|
|
joined=<id Круга игрока>
|
|
created=<id>|<название>|<роль игрока: Leader или Member>
|
|
```
|
|
|
|
Демо-Круги не сохраняются: они одинаковые при каждом запуске.
|
|
|
|
Сброс сохранений (`ResetState`): игрок ни в каком Круге, его собственные Круги распущены.
|
|
|
|
## Интерфейс (слой приложения)
|
|
|
|
`Assets/Scripts/Social/CircleWindow.cs` — окно на `UIKit`. Открывается кнопкой «Круг» внизу карты мира.
|
|
|
|
**Игрок не в Круге:**
|
|
- пояснение и кнопка «Основать свой Круг» — спрашивает название;
|
|
- список Кругов: герб, название, глава, «участников N / 30», кнопка «Вступить» или «Мест нет».
|
|
|
|
**Игрок в Круге:**
|
|
- название и роль игрока;
|
|
- состав: каждый участник с ролью, сам игрок выделен;
|
|
- кнопка «Покинуть Круг» с подтверждением; в подтверждении сказано, станет ли кто-то главой или Круг будет распущен.
|
|
|
|
## Файлы
|
|
|
|
| Файл | Что это |
|
|
| --- | --- |
|
|
| `Modules/Circle/CircleService.cs` | Реализация `ICircle` и `ISaveParticipant`, демо-Круги. |
|
|
| `Modules/Core/Contracts/ModuleContracts.cs` | `ICircle`, `CircleInfo`, `CircleMember`, `CircleRole`. |
|
|
| `Modules/Core/Events/GameEvents.cs` | `CircleJoinedEvent`, `CircleLeftEvent`. |
|
|
| `Social/CircleWindow.cs` (слой приложения) | Окно Круга. |
|
|
|
|
## Решения и план
|
|
|
|
- **Сейчас других игроков нет.** 10 Кругов из рейтинга заполнены выдуманными участниками (от 6 до 30), один Круг полный — чтобы было видно «Мест нет».
|
|
- **Этап 8 — территория Круга:**
|
|
- совместный штурм крепости;
|
|
- казна и восстановление (500 дерева, 300 камня, 100 металла, 50 золота, 300 еды для T1);
|
|
- гарнизон и рабочие от участников;
|
|
- добыча в казну, уровни крепости, содержание.
|
|
- **Рейтинг Кругов** пока на своих демо-данных (`RatingService`). Его нужно перевести на `ICircle`, чтобы в нём появлялся и Круг игрока.
|
|
- **Роли.** Пока только глава и участник. Заместители, приглашения, исключение участника и заявки на вступление — после сервера.
|
|
- **Сервер (этап 10):** сетевая реализация `ICircle`.
|
|
|
|
## Журнал изменений
|
|
|
|
| Дата | Кто | Что |
|
|
| --- | --- | --- |
|
|
| 19.10.2026 | Claude | Модуль создан: `ICircle` (основать, вступить, выйти, роли), события `CircleJoinedEvent` / `CircleLeftEvent`, секция сохранения `"circle"`, сброс, демо-Круги, окно «Круг» на карте мира, тесты. |
|