### Авторы
- Бахвалов Павел
- Куклина Мария
- Хорошев Артем
# Общие сведения о системе
Данный проект представляет собой компьютерную игру в жанре RogueLike.
Настоящий документ дизайна программного обеспечения представляет конструкции, использованные или предназначенные для использования при реализации проекта. Описанные конструкции соответствуют требованиям, указанным в разделе «Требования к программному обеспечению», подготовленном для проекта.
## Границы системы
Архитектура разработана в контексте наличия только консольной графики. Можно играть в однопользовательском и многопользовательском режиме. В однопользовательском режиме предполагается пошаговая система ходов, в многопользовоском добавляется временной лимит на ход для игроков. В однопользовательском режиме пользователю предоставляется возможность сохранить свой прогресс и в последствии загрузить сохраненное состояние при старте игры.
# Требования к программному обеспечению
Данный раздел представляет и дает краткий обзор дизайна. Архитектура системы - это способ дать общее представление о системе и поместить ее в контекст с внешними системами. Это позволяет читателю и пользователю документа самостоятельно ориентироваться в дизайне и видеть сводку, прежде чем переходить к деталям конструкции.
## Предположения
Пользователь системы владеет базовыми операциями взаимодействия с компьютером. Пользователь также понимает стандартные термины, используемые для работы.
## Ограничения
Данная система построена с использованием Java, поэтому накладывает требования наличия JVM на компьютерах, на которых она будет исполняться. Помимо этого требуется наличие клавиатуры и устройства вывода, способного отобразить консоль размер 100х40.
## Системная среда
Настоящая система предназначен для работы на современных универсальных операционных системах. Система доступна через любой персональный компьютер, на который может быть установлена JVM и библиотеки для отображения представления игры на экран.
## Методология проектирования
Система разработана с гибкостью для дальнейшего развития и/или модификации. Система разделена на управляемые процессы, которые сгруппированы в подмодули и модули которые в свою очередь построены с использованием абстракции.
## Функциональные требования
- игра предоставляет возможность управлять перемещением персонажа игрока с клавиатуры
- загрузка карты из файла или случайная генерация на выбор пользователя
- игровые персонажи атакуют друг друга при попытке занять одну клетку
- 3 разновидности поведение враждебных персонажей (агрессивное, пассивное, трусливое)
- побеждая других персонажей основной герой получает опыт, и может повысить свой уровень; с ростом уровня растут характеристики персонажа
- инвентарь персонажа; предметы можно найти на карте, одеть и снять
- сохранение и загрузка состояния игры в однопользовательском режиме; удаление сохранения при смерти персонажа
- возможность игры по сети; запустить сервер, либо подключиться к уже запущенному
# Роли и случаи использования
## Actors
### Пользователь
Это обычный пользователь, который будет непосредственно использовать систему.
## Варианты использования
### Варианты использования для Пользователя
- просмотреть список доступных игр
- запустить сервер
- подключиться к существующей игре
- создать новую игру
- выйти из игры
## Диаграмма прецедентов

# Архитектура системы
- Игровые объекты (`gameobjects/`)
- `Drawable` -- интерфейс отрисовки объектов. Метод `draw(): T`. Тип `T` визуализирует игровой объект.
- `GameObject` -- общий тип для игровых объектов. Предоставляет общие функции игровых объектов: `getPosition: Point` возвращает положение объекта, `moveToCell(Cell)` перемещение объекта в новую клетку карты.
- `GameObjectType` -- перечисление типов игровых объектов.
- Персонажи (`characters/`)
- `Dummy` -- наследник `GameObject`; основа любого игрового персонажа.
- Мобы (`mobs/`)
- `Hostile` -- наследник `Dummy`; общий класс для вражеских NPC.
- `AggressiveMob` -- NPC с агрессивным поведением.
- `CowardMob` -- NPC с трусливым поведением.
- `PassiveMob` -- NPC с пассивным поведением.
- Поведение (`behavior/`) задаётся паттерном Стратегия.
- `BehaviorStrategy` -- интерфейс поведения NPC.
- `AggressiveBehaviorStrategy` -- агрессивное поведение (NPC преследует игрока)
- `CowardlyBehaviorStrategy` -- трусливое поведение (NPC убегает от игрока)
- `PassiveBehaviorStrategy` -- пассивное поведение (NPC стоит на одном месте)
- Игрок (`player/`)
- `Player` -- наследник `Dummy`; обозначает игрока.
- Показатели (`stats/`)
- `Stat` -- интерфейс, представляющий собой простейший getter/setter
- `CharacterStat` -- наследник `Stat`, описывающий правила установки характеристик для персонажа.
- `StatDiff` -- вспомогательный класс, показывающий изменение конкретного показателя.
- `StatType` -- перечисление показателей.
- Игровые предметы (`items/`)
- `Item` -- общий класс для внутреигровых предметов.
- `HoodItem` -- предмет `Капюшон`. Имеет небольшой возможный разброс характеристик.
- `RingItem` -- предмет `Кольцо`. Имеет большой возможный разброс характеристик.
- Генераторы (`generators/`)
- `TerrainMapGenerator` -- генератор карты-ландшафта
- `ItemGenerator` -- генератор свойств внутреигровых предметов.
- Карта (`map/`)
- Обобщённая карта мира (`terrain/`)
- `Cell` - абстрактный класс, описывающий клетку карты -- минимальную единицу абстракции, из которой состоит вся карта.
- `TerrainMap` - интерфейс для карты мира, которая содержит только ландшафт, без игровых объектов. Имплементация интерфейса `TerrainMapImpl` поддерживает дополнительную функцию считывания из файла.
- `Floor` - наследник `Cell`, определяющий тип клетки "Пол" и позволяющий игровым объектах находиться в этой клетке и передвигаться в эту клетку.
- `Wall` - наследник `Cell`, определяющий тип клетки "Стена" и запрещающий игровым объектам находиться в этой клетке или передвигаться в неё.
- `WorldMap` - класс, представляющий игровой мир; предоставляет публичный метод `step` для обновления состояния мира в соответствии с действиями игрока.
- `WorldMapLayout` - карта, содержащая в себе ландшафт и игровые объекты.
- Игровая логика (`logic/`)
- `GameContext` -- класс, в котором хранится состояние игрового мира: игроки, карта, игровой статус.
- `GameLoop` -- класс, описывающий основной цикл игры.
- Команды (`commands/`)
- `Command` -- интерфейс для пользовательской команды
- `LoadCommand` -- наследник `Command`, позволяющий загружать состояние игры с диска
- `SaveCommand` -- наследник `Command`, позволяющий записывать состояние игры на диск
- Графический интерфейс (`gui/`)
- `GUI` -- абстрактный класс для отображения интерфейса на экране пользователя.
- `ConsoleGUI` -- реализация консольного интерфейса.
- `DisplayConfig` -- класс для задания конфигурации отображений игровых объектов в пользовательском интерфейсе.
- Клиент-сервер (`server/`)
Сетевой режим реализован передачей состояния игры с сервера на клиент, с последующей отображением состояния на клиенте и отправкой клиентом действия, совершенного игроком.
- `RGLClient` -- класс, реализующий клиента, который подключается к игровому серверу посредством gRPC.
- `RGLServer` -- класс, реализующий игровой сервер, к которому подключаются клиенты посредством gRPC.
## Диаграмма компонентов

## Диаграмма классов

## Диаграмма конечных автоматов
