Привет пикабу, пол года назад я писал про игру которую не доделал т.к. надоело и расшарил ее исходники.
(прошу сразу у всех прощения за ошибки я не очень грамотный :С)
Через месяц я понял что делать 1 хер нечего и я решил продолжить ее не доделывать предварительно удалив ⅓ проекта чтобы скучно не жилось :D
В общем решил написать что удалось достичь за полгода работы. Исходный код игры (но уже не весь, и он очень плох :С ) можно посмотреть тут.
Так как рисовать я не умею то все арты, спрайты и тд я заказывал у художника , тоже самое с текстом, а на музыку и звуки денег не хватило Х)
Во первых я полностью отказался от пошаговой стратегии и решил сделать полноценную RTS (нет, но об этом ниже) и из 3х глобальный модулей осталось только 2: База и собственно сама игра. Тем самым я убрал все проблему дуальности параметров, логику совмещения пошаговой игры и глобалки и тд. Однако это породило довольно много других задач которые пришлось решить.
Глобально игра выглядит примерно так:
3 фракции ИИ играют в обычную ртс. Строят юнитов отсылают их воевать, добывают ресурсы, захватывают сектора,строят фортификации ну и тд. Игроки это мини отряды на мировой арене которые действуют в составе фракции по своему разумению, свободные силы как рейнджеры в КР, у них есть тактика которой они придерживаются.
(тут я хотел сделать небольшой геймплейный видос, но я понял что либо я режиссер не очень то ли игра выглядит не презентабельно :С)
Механика оружия
Стрельбу в игре я сделал на основе баллистики по этим формулам. Всего в игре сейчас 3 типа оружия и 7 типов поведения снарядов.
--- Ракеты, для ракет формулы баллистики не работают т.к. для них гравитация = 0
- Летят по прямой, летят по высоте - не преследуют цель
- Летят по прямой, летят по высоте - преследуют цель
--- Баллистическое оружие, полностью работают на баллистике
- прямой наводкой (стреляют в диапазоне градусов от 0 до 45)
- арта (стреляют в диапазоне градусов от 45 до 90)
(к сожалению нет нормального спрайта арты пока)
--- Лазер, имеет только 1 тип поведения, чего взять с луча то), использует тоже формулы баллистики но со скоростью пули 9999.
Но эти типы можно расширять например вот тип прямой баллистики но с большим количеством выпускаемых пуль за такт (6) + перезарядка 150 мс + время между пулями 25 мс или “икрометатель 3000”, в общем можно сделать много интересного имея воображение Х)
Стоит добавить что оружие состоит из 2х частей, собственно оружие и его заряд.
- Оружием отвечает за такие параметры как, точность, скорострельность, влияние на скорость пули, допустимый угол Z(0-90 градусов, на прямую влияет на дальность), количество выпускаемых пуль, дополнительная задержка между каждой пулей и еще я наверно что то забыл.
- Боезапас отвечает за кол-во урона (мин->мах), зону поражения (взрывы), тип атаки (в игре пока не участвует), скорость полета (напрямую влияет на дальность стрельбы), преследует этот снаряд цель или нет.
Полет снаряда
Снаряд в игре это полноценный объект с направлением, скоростью и высотой. Некоторые снаряды например ракет могут еще и преследовать цель, а некоторые можно сбить например ПРО (ракеты особенные ¯\_(ツ)_/¯).
Башня
Башня обычно находится на юните(иногда и на турелях С:), но разместить правильно башню на разных корпусах оказалось непросто, но возможно я просто не очень умный.
Работает это дело примерно так:
У оружия есть точка крепления и на корпусе есть такая же точка которая привязана к слоту оружия или снаряжения. Задача состоит в том чтобы сопоставить эти 2 точки. Точка крепления это координата(пиксель Х:У) на спрайте корпуса-оружия.
Примерно так это выглядит:
(проблема над которой я страдал 2 дня была описана на бумаге за 5 минут >_<)
У оружия еще есть точки вылета пуль, их может быть много если оружие имеет несколько стволов. И перед стрельбой мы должны высчитывать эти точки беря во внимание положение юнита и поворот башни.
(так это выглядит в игре, тут правда турели но принцип одинаковый)
Система обзора
В любой стратегии есть туман войны, ну и мне пришлось. Дальность обзора юнитом я решил в лоб и юнит видит тупо все что находится внутри его радиуса обзора, даже если тот за препятствием, яме или холме. Но я решил что будет круто еще перенести механику радаров которая есть в игре supreme commander. И перенес :D, у мазершипа есть радар и все объекты в зоне радара, но которые игрок не видит, визуально появляются в игре в виде меток (земля, воздух, строение и тд). И некоторые особое правила для строений и объектов на карте. Объекты не пропадают на карте если вышли из визуального контакта а “запоминаются”, если объект умер то игрок продолжает его видеть, а визуальный контакт просто обновляет информацию об объекте.
Реализации игры жизнь
Вообще тут писать особо нечего, я сделал динамические объекты: кусты (пока это только инопланетная капуста), однако это хорошо работает для заполнения игровой карты минимальным количеством спрайтов (сейчас это 1 спрайт капусты С: ).
О самой игре “жизнь” можно почитать тут.
У объектов есть жизненный цикл:
- рождение
- рост
- смерть
(жизненно).
Кусты умирают если их переехать, так же в них врезаются снаряды.
Работа снаряжения
Сейчас в игре есть такие типы снаряжения которые можно установить в корпус, некоторые из них даже имеют визуальное представление и вешаются на корпус так же как и оружие.
Все снаряжение потребляет энергию из генератора корпуса. Энергия в корпусе вырабатывается за счет топлива примерно по такой формуле:
$(количество ячеек топлива в которых оно есть) * $(на выработку топлива за 1 такт работы реактора)
--- Силовые щиты, пропускают снаряды только наружу, аналог суп ком.
--- Генераторы помех пассивный/активный модуль, скрывающий на радарах все что попадет в зону помех
--- ПРО модуль сбивающий вражеские ракеты в области вокруг владельца
--- Ремонтные модули -> ремонтируют юнитов и структуры находящиеся в каком либо радиусе (0 только себя)
--- Модули добычи руды - позволяют добывать руду из точек ресурсов на карте
--- Инженерные модули - позволяет строить сооружения
--- Генераторы - питают энергий здания находящиеся поблизости за счет энергии владельца
Строения
В игре можно строить различные сооружения процесс строительство отличается от обычных РТС так как у меня все таки геймплей немного другой. Чтобы начать строительство требуется установленный инженерный модуль на юните и чертеж того что строить в инвентаре. Для начала строительства не нужны ресурсы, но ресурсы нужны уже в процессе строительства. Это позволит строить строения в несколько игроков или юнитов с ресурсами одновременно С:
Но сами строения довольно стандартные, разве что заводов нет)
-- турели
-- силовые щиты
-- радары
-- генераторы невидимости
-- генераторы энергии
-- про
-- склад
Игровой интеллект
В игру я сделал несильный игровой интеллект основанный на основе проверок и действий, это можно выразить в виде бинарного графа где из правила вытекают 2 других правила, пока не дойдет до последнего. Я хз как это правильно нарисовать но думаю по коду все понятно С:
Например правила поведения майнера который ходит по карте в поисках ресурсов, но если в радиусе обзора есть враг то атакует его или бежит (и атакует :D).
Недостаток такого метода то что боты довольно предсказуемы в своих действиях, ну или писать придется сложные и большие правила.
Еще 1 недостаток это то что такие боты требовательны к производительности т.к. им надо сделать все проверки за 1 такт сервера (1 бот пожирает ресурсов как 5 игроков (но это не точно)).
Игровая карта
Игровая карта претерпела максимальные изменения по функционалу, но с виду почти не изменилась)
(примерно так и выглядит игровая зона, на текущий момент таких зон 9 но 6 из них пустые)
Во первых я полностью отказался от гексовой сети которая была изначально и переделал всю работу на привычные Х:У координаты.
Во вторых объекты на карте стали реальными объектами а не картинкой с наложенной на нее сверху непроходимой стеной :С. Теперь объект имеет свою собственную геодату ( которая делится на 2 типа можно ездить и стрелять, можно только ездить) и высоту. Геодата и высота меняют свой размер вместе с объектом, например капуста которая появляется в размере 1 и растет до размера 10, то геодата и высота растет вместе с капустой. Тоже самое и при повороте объекта
(1 объект под разными углами и разного размера)
На карте теперь есть нормальные высоты которые в основном влияют на полет снаряда, отображение теней и скейла спрайта юнита. Правда в 2д игре визуально высоты очень сложно показать, только тени спасают :С.
Статичные строения на карте
В каждом секторе есть 1 основная база на ней можно собирать фиты, создавать вещи по чертежам.
Помимо базы есть опциональные строения
- Завод полуфабрикатов, позволяет строить детали без чертежей
- Завод переработки позволяет переработать руды в сырье
- Добывающая установка - ничего не делает, просто существует :D
Все строения в секторе объединенные в общую сеть и поэтому подчиняются той фракции которой принадлежит основная база и берут свой налог от основной базы.
В каждом строение для каждого игрока есть свой склад наподобие того который в еве онлайн на станциях.
Если игрок попал в нерабочее (нет владельца) или вражеское строение то он не может получить доступ к сервисам базы. Все что он может сделать это выйти или перенести свое сознание в столицу (без отряда и инвентаря).
Объект базы не зависит от спрайта (что логично), но для примера вот строение переработки. Все строения относятся к объекту "база" только у них разный тип который определяет их функционал.
База имеет точку где она находится - желтая иконка с домиком (на самом деле эта точка ни на что не влияет но я ее на всякий случай указываю вдруг в будущем пригодится).
- Точки входа в базу - иконка со стрелкой, любой кто заедет на эту точку автоматически телепортируется внутрь базы
- Точки выхода с базы - черная стрелочка, все кто выходит из базы появляются на них, эти точки помимо позиции еще имеют направление это направление принимают корпуса при выходе.
Тут конечно сразу можно спрогнозировать проблему когда много игроков не смогут нормально использовать базу. Если на всех точках кто то стоит то из базы нельзя выйти если у базы столпотворение то в нее не войти ¯\_(ツ)_/¯.
Случайные события
Хотел сделать генерацию случайных событий в игре такие как бури, метеориты, червяк из дюны :D. Но остановится на том что сделал только метеориты. Но у метеоритов есть цель они создают ресурсы на карте). А другие события стало делать лень, хотя там нет совершенно ничего сложного и лежит в тудухах)
(к сожаления гифка/картинка не пролезла :С )
Фракционные войны
Каждая фракция имеет столичный сектор который имеет фабрику полуфабрикатов, перерабатывающий завод, верстак для создание корпусов оружия и ресурсы которые падают с небес. Но в столицах максимальный налог на все что только можно и вообще ресурсов не так много как хочется. Поэтому у игроков и ботов (они впрочем и сами неплохо справляются). Есть возможность захватывать сектора ради ресурсов и баз (хотя добывать ресурсы на вражеской территории никто не запрещает).
Правила захвата сектора довольно просты:
- Ворваться в сектор
- Дойти до базы
- Убить всех кто находится в зоне захвата базы
- Дождаться захвата влияния на базе в 100%
- Построить фракционный маяк, который сделает эту базу вашей.
(не очень информативная карта мира, похоже ученые решили захватить мир во славу науки)
Задания (на текущий момент еще в разработке)
Основные базы также являются поставщиком заданий для игроков. Сама структура заданий для меня оказалось сложной и в интернете тоже мало чего про это написано, поэтому я сделал свой велокостылет. Структура данных задания тесно переплетена со структурой диалога. А отслеживанием выполнения условий задания занимается отдельный модуль. Все это выглядит примерно вот так:
Наверно под это надо создавать отдельную статью C:
(структура данных диалогов/заданий)
Для управления всей этой кашей я сделал редакторы диалогов и логики (с чудо дизайном Х))
Проблемы проекта
Но в жизни любого проекта есть свой пул проблем которые вносят свои коррективы (и взрывают мою жопу >_<). На текущий момент из за чего я не могу запустить даже нормальный тестовый сервер я могу выделить такие проблемы:
- Производительность сервера, в основном она уходит на проверку коллизий при поиске пути юнитов еще очень много пожирают боты, но там не самый хороший код и они каждую секунду долбят на проверки всего и вся. На моей рязани 2700х 45 одновременно ходящих ботов это предел на котором начинаются лаги сервера. Но тут есть пути решения, например разделить поиск коллизий и расчет пути на основе того что видит игрок, а не по всем объектам из центрального хранилища карты, хотя неясно помогут они в итоге или нет т.к. ошибка фундаментально в алгоритмах =).
- Производительность клиента, движок не предназначен для такой большой карты и больших спрайтов (и моего говнокода), да и сами алгоритмы на фронте тоже не совсем оптимальны. Добавим сюда кривой CSS (хотя я читал что css обрабатывается в браузерах в отдельном потоке, но на практике он влияет на игру так или иначе) и на моем рабочем (который на работе с встроенной видяхой) компе мы имеем 15 кадров в секунду (на этом движке я ток 1 большую игру видел это "strike tactics" и в общем она выдает примерно такое же количество кадров на том же компе). Тут тоже понятно что делать перейти на другой движок если в браузере то подождать например Phaser4 или если не ждать Phaser3 благо на игровой движок я не завязан и перенести будет просто, однако если переносить из браузера например на юнити то будет много проблем с интерфейсами.
- Поиск пути для перемещения групп. В игре работает алгоритм А* с оптимизацией под прямые линии а не клетки (юнит из клетки идет не в 8 сторон а в любую). И работает он отлично до тех пор пока не настает время перемещать группу юнитов они начинают сталкиваться между собой постоянно пересчитывают пути и сталкиваются дальше, есть много костыльных решений но мне подсказали вот это, но я не уверен что я смогу реализовать такой алгоритм (хотя он кажется не супер сложным, но его надо впилить в уже существующую систему, а мне чет лень :3),
- Из прошлой проблемы вытекает новая, если не решить проблему с поиском путей то придется поменять жанр игры с RTS в обычную рпг с видом сверху и управление как в factorio когда едешь на танке (WASD мышка - оружие) , возможно это даже будет лучше с точки зрения геймплея.
Но зато с таким геймплеем открывается море возможностей: тараны, не статичная скорость, оружие ближнего боя, прыжки с гор или трамплинов, улучшается динамика игры, упрощаются интерфейсы и уменьшается потреблямые ресурсы.
- Общие проблемы по геймдизайну т.к. я не геймдизайнер ¯\_(ツ)_/¯ - баланс, экономика, лвл дизайн, геймплей, мотивация игроков и прочее.
- В игре много недоработок, тонны багов, иногда дедлоки (а это оч сложно дебажить :С), иногда рантайм ошибки. Я все их правлю но мне кажется их бесконечное количество)
- Интерфейсы, они стали лучше но все еще г**но)
В ближайшее время (месяц другой ¯\_(ツ)_/¯) планирую допилить задания и максимально пофиксить самые страшные баги. И возможно удастся запустить тестовый сервер, но он будет работать максимально всрато, но как говорится он хотя бы будет работать :3. На текущий момент попробовать поиграть не получиться, потому что яжадина (сервер совершенно не готов к этому).
К сожаления я не пролез в размер поста, поэтому если что можете спрашивать в комментах я в силу своих знаний попробую чего нить ответить)
Ну вот как то вот так, надеюсь кому то было интересно.