Files
MVP1/Docs/Modules/Circle.md
T
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

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"`, сброс, демо-Круги, окно «Круг» на карте мира, тесты. |