---
# System prepended metadata

title: Общие сведения о системе

---

### Авторы
- Бахвалов Павел
- Куклина Мария
- Хорошев Артем

# Общие сведения о системе

Данный проект представляет собой компьютерную игру в жанре RogueLike.

Настоящий документ дизайна программного обеспечения представляет конструкции, использованные или предназначенные для использования при реализации проекта. Описанные конструкции соответствуют требованиям, указанным в разделе «Требования к программному обеспечению», подготовленном для проекта.

## Границы системы

Архитектура разработана в контексте наличия только консольной графики. Можно играть в однопользовательском и многопользовательском режиме. В однопользовательском режиме предполагается пошаговая система ходов, в многопользовоском добавляется временной лимит на ход для игроков. В однопользовательском режиме пользователю предоставляется возможность сохранить свой прогресс и в последствии загрузить сохраненное состояние при старте игры.

# Требования к программному обеспечению

Данный раздел представляет и дает краткий обзор дизайна. Архитектура системы - это способ дать общее представление о системе и поместить ее в контекст с внешними системами. Это позволяет читателю и пользователю документа самостоятельно ориентироваться в дизайне и видеть сводку, прежде чем переходить к деталям конструкции.

## Предположения

Пользователь системы владеет базовыми операциями взаимодействия с компьютером. Пользователь также понимает стандартные термины, используемые для работы.

## Ограничения

Данная система построена с использованием Java, поэтому накладывает требования наличия JVM на компьютерах, на которых она будет исполняться. Помимо этого требуется наличие клавиатуры и устройства вывода, способного отобразить консоль размер 100х40.

## Системная среда
Настоящая система предназначен для работы на современных универсальных операционных системах. Система доступна через любой персональный компьютер, на который может быть установлена JVM и библиотеки для отображения представления игры на экран. 

## Методология проектирования

Система разработана с гибкостью для дальнейшего развития и/или модификации. Система разделена на управляемые процессы, которые сгруппированы в подмодули и модули которые в свою очередь построены с использованием абстракции.

## Функциональные требования
- игра предоставляет возможность управлять перемещением персонажа игрока с клавиатуры
- загрузка карты из файла или случайная генерация на выбор пользователя
- игровые персонажи атакуют друг друга при попытке занять одну клетку
- 3 разновидности поведение враждебных персонажей (агрессивное, пассивное, трусливое)
- побеждая других персонажей основной герой получает опыт, и может повысить свой уровень; с ростом уровня растут характеристики персонажа
- инвентарь персонажа; предметы можно найти на карте, одеть и снять
- сохранение и загрузка состояния игры в однопользовательском режиме; удаление сохранения при смерти персонажа
- возможность игры по сети; запустить сервер, либо подключиться к уже запущенному

# Роли и случаи использования
## Actors
### Пользователь

Это обычный пользователь, который будет непосредственно использовать систему. 

## Варианты использования
### Варианты использования для Пользователя
- просмотреть список доступных игр
- запустить сервер
- подключиться к существующей игре
- создать новую игру
- выйти из игры

## Диаграмма прецедентов
![](https://i.imgur.com/cRhGLOz.png)


# Архитектура системы

- Игровые объекты (`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.


## Диаграмма компонентов
![](https://i.imgur.com/uMUGApx.png)

## Диаграмма классов
![](https://i.imgur.com/RBWtJbt.jpg)

## Диаграмма конечных автоматов
![](https://i.imgur.com/ITPq0Dm.png)
