# Honourished v0.3.0dev ### В создании принимают участие: Разработчики: * Архипов Иван * Батманов Игорь * Боков Аркадий * Кологерманский Егор Дизайнеры: * Безребрая Анастасия Honourished представляет собой тактическую пошаговую стратегию с элементами rpg. В данный момент идёт разработка первого сценария игры: свободного сражения между двумя игроками. Сражение представляет собой последовательные действия игроков над их юнитами (предварительно выбранными) на поле из шестиугольников. За основу была взята механика боёв игры Heroes of Might & Magic III. Игроку доступны для выбора 2 расы: "Люди" и "Мёртвые", каждая из которых обладает собственным набором юнитов и разветвлённой системой их улучшения. Каждый юнит имеет уникальный набор способностей (умений), характеристик и специфики поведения. # Установка Список доступных версий для установки с их описаниями и ссылками для скачивания доступен по ссылке: http://git.endevir.ru/GooseHouse/game-client/releases ### Windows: * Скачать сборку, упакованную в .zip архив (ссылка на последнюю сборку: http://git.endevir.ru/attachments/2321e6b4-4236-4790-aae6-3b6c8ff6f7fc) * Распаковать всё содержимое архива в любую папку * Для запуска использовать файл game.exe ### Linux Debian-based (Debian ver. >= 8, Ubuntu ver. >= 16.04 LTS, etc.) * Скачать .deb пакет с игрой (ссылка на последнюю сборку: http://git.endevir.ru/attachments/cd200ce0-0b53-430c-aaf0-c56944ba6ebf) * Выполнить команду: ```bash sudo apt-get -f install ./honourished-0.3.0dev-linux.deb ``` * Для запуска использовать консольную команду `honourished` * В случае, если установка через apt-get -f install не удалась, выполните следующие действия вместо этой команды: ```bash sudo apt-get install libqt5core5a libqt5dbus5 libqt5glib-2.0-0 libqt5gstreamer-1.0-0 libqt5gui5 libqt5multimedia5 libqt5network5 libqt5svg5 libqt5widgets5 libqt5multimedia5 libqt5gstreamer-1.0-0 libqt5multimedia5-plugins gstreamer1.0-nice gstreamer1.0-plugins-good ``` ```bash dpkg -i ./goosehouse-game.deb ``` ## Структура директорий проекта: #### Папка *assets* В этой папке содержатся все графические файлы, элементы интерфейса, озвучка и остальные ресурсы, связанные с проектом. Они собираются на этапе сборки проекта в специальные файлы ресурсов, которые программа загружает и использует в процессе выполнения. #### Папка *include* Эта папка содержит в себе все .h файлы приложения - все интерфейсы классов приложения (исключения - .h файлы, связанные с .ui сценами, они хранятся вместе с этими сценами) #### Папка *source* Здесь находятся все файлы реализации классов приложения, кроме тех, что завязаны на .ui файлах (аналогично с .h файлами, последние хранятся вместе с .ui сценами) #### Папка *ui* В папке ui размещены все файлы графических сцен проекта. Каждая сцена состоит из 3-х файлов - .ui, .cpp и .h. Одна логическая сцена (главное меню, к примеру), может состоять из нескольких физических, которые накладываются друг на друга (сцена анимированного фона, сцена меню, расположенного по центру) #### Папка *res* В ней находятся специальные файлы .qrc, содержащие информацию о тех файлах из */аssets*, которые будут собраны в файлы ресурсов (.gtr) #### Файл *client.pro* Это основной файл qmake проекта, именно в нём прописаны скрипты сборки ресурсов, указаны собираемые файлы исходных кодов, подключаемые библиотеки и system-specific указания системе сборки qmake. ## Описание архитектуры проекта: * **Графическая часть:** весь графический интерфейс приложения разделён на несколько *сцен* - групп элементов, одновременно отображающихся в определённый момент времени. Для каждой сцены создаётся её класс + файл графического интерфейса (.ui) для QtCreator, который при сборке преобразуется в заготовку кода, пригодную для компиляции. Каждая сцена наследуется от класса-прототипа Scene, который предоставляет интерфейс для инициализации сцены и передачи в неё аргументов для инициализации (именно посредством передачи аргументов осуществляется взаимодействие между сценами. Напрямую они никак не связаны. Для инициализации и переключения сцен создан класс-синглтон GuiSceneManager. Инициализация игровых ресурсов и графического интерфейса также является сферой ответственности класса GuiSceneManager и выполняется при первом вызове GuiSceneManager::getInstance (происходит в main.cpp). *Ответственный: Архипов Иван* * **Звуковое оформление** реализуется посредством использования внутренних библиотек Qt (Низкоуровневые библиотеки QSound + QPhonon и их высокоуровневая абстракция в виде QMediaPlayer). Для управления звуками созданы 2 класса: класс-синглтон SoundEngine (основной поток звука + весь интерфейс взаимодействия) и класс AsyncSound. Последний представляет собой объект для работы с "мгновенными" звуками (выстрел, звук наведения мыши на элемент и т.п.). Создание асинхронного звука также происходит в классе SoundEngine. Управление объектом AsyncSound разделяется между классом SoundEngine и объектом, вызвавшим звук. После того, как воспроизведение звука заканчивается, SoundEngine сбрасывает с себя владение объектом, и если вызывавший объект также сбросил владение, то объект AsyncSound удаляется. В противном случае время жизни объекта AsyncSound будет равно времени жизни указателя на него у класса, вызвавшего звук. *Ответственный: Архипов Иван* * **Фабрика классов:** Фабрика классов представляет собой гибкий инструмент для создания элементов и управления ими через заданный прототип. Это значительным образом упрощает управление игровыми объектами, коих создаётся множество (пример: юниты, эффекты и умения), т.к. фабрика скрывает процесс инициализации объектов и возвращает сразу готовый к использованию абстрактный интерфейс. *Ответственный: Боков Аркадий* * **Игровая механика:** * **Управление игровым процессом** происходит в классе-синглтоне GameManager. Его задача - инициализация и подготовка игрового процесса, хранение информации о действиях игроков и юнитах, передача хода (класс UnitsQueue) и построение игрового поля (классы Cell) *Ответственные: Боков Аркадий, Кологерманский Егор, Архипов Иван* * **Игрок:** За работу с игроками отвечает синглтон-класс PlayerManager. Он управляет количеством игроков, он же хранит у себя объекты классов Player и возвращает по требованию указатели на них. Класс Player содержит в себе информацию об игроке, указатель на расу игрока и указатели на юнитов. Предоставляет интерфейс для добавления, удаления и/или получения списка юнитов, смены расы или иных параметров игрока. *Ответственный: Архипов Иван* * **Клетки:** Класс Cell является мощной структурой, которая функционирует одновременно как и графический, так и логический элемент. В его ведении находятся отрисовка шестиугольника клетки, доступ к соседним клеткам и алгоритмы подсчёта расстояния до других клеток и поиска препятствий для перемещения или выстрела в другие клетки. Клетки создаются единой матрицей с собственной индексацией в процессе инициализации игры в классе GameManager. *Ответственный: Кологерманский Егор* * **Расы и юниты:** Аналогично связке PlayerManager-Player для работы с расами в игре используется связка классов RaceManager-Race. RaceManager создаёт и хранит у себя единственные (уникальные) объекты рас и передаёт классу Player по требованию указатель на расу. Класс Race отвечает за создание юнитов заданной расы. Его задача - получить список юнитов (из соответв. директории в /assets), инициализировать фабрику юнитов и создавать их по требованию. Объекты каждой расы существуют в единственном экземпляре в классе RaceManager. Класс Unit претерпел серьёзные изменения с момента реализации первого задания. Первоначально предполагалось, что у каждого юнита будет прописана его логика основного взаимодействия с окружающим миром (перемещение, стандартная атака), которые будут варьироваться в зависимости от *механики* юнита (абстрактный пример: перемещение грифонов не учитывает препятствия, т.к. они летают. Атака лучников может производиться на расстоянии >1 клетки от цели). В настоящий момент мы перешли к идее "Всё в мире - это умение *(см. раздел эффекты и умения)*", которая предполагает, что абсолютно все действия юнита - это умения, а все изменения, которые могут происходить с юнитами и клетками - это эффекты. В таком подходе структура класса Unit стала очень легковесной и сводится, по сути, к простому хранению характеристик и наложенных эффектов. *Отвественный: Боков Аркадий* * **Умения и эффекты:** Умения и эффекты предоставляют главный функционал динамического изменения состояния юнитов. Каждое действие юнита (перемещение, атака, fireball, выстрел из лука) - это умение. Структурно умение представляет собой набор накладываемых эффектов и механику их наложения. Именно умение распределяет эффекты по юнитам и клеткам в соответствии с тем, как этого требует концепция умения (например: умение "Армагеддон" накладывает эффекты мгновенного урона, горения, смены анимации на всех юнитов). За создание эффектов и умений отвечает класс SpellManager. Эффектом является любое *фундаментальное* действие, происходящее с юнитом. Изменение характеристики (дебафф/нанесение урона), смена анимации, перемещение (длительная смена координат), создание временного объекта (создание и полёт фаерболла, стрел), наложение другого эффекта и т.п. - всё это находится в ведении эффекта. Эффекты делятся условно на несколько специализаций: моментальные эффекты, длительные, отложенные, эффекты-на-юнитах, эффекты-на-клетках. Длительные эффекты могут обрабатываться после каждого *действия* или *хода*. (В одном ходе юнита может быть несколько действий. Действие == умение: перемещение, атака, кинуть фаерболл). *Ответственный: Батманов Игорь*