Игра
DatsPulse — это пошаговая стратегия с управлением колонией муравьев на гексагональной 2D-карте. Игрокам предстоит командовать своими отрядами, исследовать карту, собирать ресурсы, сражаться за территорию и совершать набеги. И всё это — в условиях частичной видимости и конкурентной гонки.
swagger (тестовый и боевой сервера выбираются в селекте)
https://games.datsteam.dev/static/datspulse/openapi/#/
ленд
https://gamethon.datsteam.dev/datspulse
статистика
https://gamethon.datsteam.dev/datspulse/mystats
В процессе тестовых раундов могут вноситься корректировки в константы игры.
Ход — минимальный временной промежуток игрового мира (2* секунды).
Переходовка — фаза обработки всех действий игроков между ходами.
Раунд — последовательность ходов. Бывают тестовые и финальные.
Балл — единица очков, определяющая место команды в финальном зачёте.
Гекс — базовая клетка карты шестиугольной формы.
* значение может быть изменено.
Игровое поле — это гексагональная 2D-карта. Размер карты масштабируется автоматически, в зависимости от количества участвующих команд.
Области вне радиуса обзора ваших юнитов скрыты.
Карта генерируется одним из трёх генераторов (на финале меняются каждый раунд).
Генераторы могут создавать как симметричные стартовые условия, так и уникальные зоны для каждой команды.
Существуют следующие типы: пустой, грязь, камень, кислота, муравейник (см. таблица 4).
Такие эффекты гексов как стоимость ОП, урон применяются в момент попадания на гекс.
пример 1:
В ходе #1 юнит передвигается на гекс с кислотой и останавливается на нём. В момент попадания на гекс он получает урон.
В ходе #2 юнит передвигается на обычный (безопасный) гекс — в этом случае он не получает урона, так как кислотный эффект действует только на тех, кто находится на гексе с кислотой в конце фазы передвижения.
пример 2:
В ходе #1 юнит передвигается на гекс с кислотой и останавливается на нём. В момент попадания на гекс он получает урон.
В ходе #2 юнит остается на гексе - юнит получает урон.
В игре есть два типа раундов:
Тестовые — доступны постоянно, предназначены для отладки и тренировок.
Финальные — проводятся в строго заданное время и влияют на финальный рейтинг.
Каждый раунд работает на отдельном сервере — не забудьте переключить URL в финале. Расписание раундов можно получить в соответствующем API.Тестовые раунды продолжать работать и после завершения игры, примерно неделю.
Чтобы участвовать в раунде, команда должна зарегистрироваться через соответствующее API.
Игра состоит из трёх повторяющихся этапов:
1. Регистрация на раунд (5* минут)
2. Раунд (10* минут)**
3. Технический перерыв (5* минут)**
* значение может быть изменено.
** для тестовых раундов перерыв будет сокращен до 1 минуты. Время раунда станет 14 минут
1. Атака муравейников — автоатака по вражеским юнитам в зоне действия.
2. Рандомизация хода команд — строится очередь команд для последующих действий.
3. Атака юнитов — по порядку из п.2 все юниты производят атаку.
4. Остальные действия юнитов — по порядку из п.2 все юниты совершают передвижение, грабёж вражеских муравейников, сбор ресурсов
5. Создание новых юнитов — появляется один муравей в муравейнике.
6. Генерация ресурсов — появляются случайным образом на карте.
Точка появления на карте выбирается рандомно. Состоит из трёх прилегающих друг к другу гексов.
Все муравейники располагаются равноудаленно друг от друга (с некоторой погрешностью).
На гексы муравейника не могут попасть чужие юниты.
Гексы муравейника делятся на два типа: вспомогательные и основной.
Свойства всех гексов:
1. дают бонус к атаке (см. таблица 2)
2. генерируют и хранят нектар. Каждый гекс имеет раздельное хранение.
3. каждый вражеский юнит получает 20 урона каждый ход в радиусе 2-х гексов. Один юнит может получить урон только от одного гекса за один ход.
Свойства основного гекса:
1. каждый ход создаёт одного юнита.
2. имеет радиус обзора 2 гекса.
Все три координаты гексов муравейника указаны в поле “home”. Какая из них является основной можно понять по полю “spot”.
Существует три типа юнитов, каждый имеет свои характеристики (таблица 1).
Описание характеристик:
скорость — количество очков передвижения (ОП).
грузоподъемность — количество единиц ресурсов, которое может нести муравей.
обзор — радиус обзора муравья.
HP — количество единиц здоровья юнита.
атака — урон, наносимый юнитом.
Каждый ход юниты создаются в основном гексе муравейника. Тип юнита выбирается рандомно (см. таблица 1).
Есть глобальный лимит юнитов - 100.
Внимание:
При создании юнита система случайно выбирает его тип. Если на основном гексе муравейника уже находится юнит такого же типа, генерация будет пропущена, и новый юнит не появится в этот ход.
Все юниты обладают радиусом обзора, измеряемым в количестве гексов от их текущей позиции. Игрок видит только те гексы, которые находятся в пределах обзора его юнитов.
Кроме того, в течение одного хода отображаются все гексы, которые попадали в радиус обзора юнита во время его передвижения.
Пример:
Юнит на момент хода #1 находится на гексе 1,1 и получает команду движения к гексу 5,5.
В момент переходовки будет совершено передвижение юнита.
В момент хода #2 игрок сможет увидеть данные не только вокруг гекса 5,5, но и вокруг всех гексов, которые были на пути следования этого юнита.
В ход #2 игрок не отдавал приказ о передвижении юнита.
На момент хода #3 игрок будет иметь данные только вокруг гекса, где находится юнит.
Каждый юнит имеет определенное количество очков передвижения (ОП), они тратятся при передвижении юнита с гекса на гекс. Количество ОП, необходимых для перемещения на гекс, зависят от типа этого гекса.
Ограничения:
1. Нельзя зайти на гекс, где есть чужой юнит.
2. Нельзя зайти на гекс, где есть дружественный юнит того же типа.
Ограничения 1, 2 актуальны и в момент перемещения юнитов.
Пример 1:
Игрок перемещается на гекс, стоимость передвижения по которому равна 1 — будет потрачено 1 очко передвижения.
Игрок перемещается на гекс, стоимость передвижения по которому равна 2 — будет потрачено 2 очка передвижения.
Пример 2:
Игрок перемещается к указанному целевому гексу. На пути у него стоит и не двигается вражеский юнит (или дружеский, но того же типа).
В итоге юнит не сможет завершить свой путь и остановится на гексе, который расположен перед занятым гексом.
Пример 3:
Игрок 1 задал путь к указанному целевому гексу А.
Игрок 2 задал путь к указанному целевому гексу В.
Гекс В расположен по пути, указанному игроком 1.
В результате рандомного выбора игрок 2 получил приоритет передвижения в этом ходе.
В итоге юнит игрока 2 переместится на гекс В, в то время как юнит игрока 1 остановится перед гексом В не достигнув целевого гекса А.
Валидация делится на 2 типа:
1) В момент отправки API запроса
Осуществляются простые проверки:
- существования координат
- превышения очков движения (нельзя указать свыше значения указанного в свойства юнита)
- порядка гексов (все гексы являются примыкающими друг к другу).
2) В момент переходовки
Это действие уже происходит вне вызова API. Юнит поочередно совершает движение с гекса на гекс и, если по какой-либо причине не сможет переместиться на следующий в очереди гекс, останется на текущем, и в лог событий будут добавлены соответствующие записи.
Если на примыкающих гексах по завершению хода находятся юниты разных команд, они атакуют друг друга.
Цель выбирается рандомно.
Урон наносится один раз каждым муравьём. То есть, в один ход один муравей может нанести урон только одному противнику.
Приоритет атаки юнитов выбирается рандомно (то есть, возможна ситуация, когда второй не сможет нанести урон в ответ, так как будет уничтожен).
Юниты могут получать различные бонусы к атаке (см. таблица 2).
На карте каждый ход с определённой вероятностью на рандомном гексе появляются ресурсы, которые муравьям необходимо собирать, чтобы пополнять запасы муравейника.
Есть несколько видов ресурсов (см. таблица 3). На одном гексе могут находиться только ресурсы одного типа.
Не появляются под юнитами.
Сбор ресурсов
Чтобы собрать ресурс, юнит должен завершить предыдущий ход на гексе с ресурсом.
Во время переходовки сначала выполняется передвижение, затем — сбор.
Если после перемещения юнит оказывается на гексе с ресурсом, он автоматически собирает его в объёме, не превышающем его грузоподъёмность (1 единица ресурса = 1 единице грузоподъёмности).
Ограничения сбора
Юнит не может переносить несколько типов ресурсов одновременно.
В один ход юнит может только либо украсть ресурсы, либо поднять с гекса.
Сдача ресурсов
Для того, чтобы сдать ресурсы в свой муравейник, необходимо на момент завершения хода находиться на его гексе. В муравейник юнит сдаёт все ресурсы за один раз.
Потеря ресурсов
Если юнит был уничтожен, все переносимые им ресурсы будут сброшены на гекс, на котором он находился.
Если на этом гексе уже находится ресурс другого типа, ресурсы будут сброшены на ближайший свободный гекс.
Если в радиусе 1 нет ни одного свободного гекса, ресурсы будут уничтожены. Свободным гексом является тот, на котором нет ни ресурсов другого типа, ни юнитов
Игрок может совершить набег на чужой муравейник, чтобы украсть ресурсы, находящиеся в нём. Для этого необходимо на момент завершения хода находиться на гексе, примыкающем к муравейнику.
За один ход может быть совершена кража только с одного гекса муравейника. Гекс для кражи выбирается рандомно из тех, что с нектаром.
Соперники видят, сколько нектара есть в чужом муравейнике.
Критерии победы в порядке приоритета:
Все показатели считаются в сумме за все финальные раунды.
Критерии 2 и 3 вступают в силу по очереди, если несколько команд набрали равное количество очков в предыдущем пункте.
Команда, набравшая хотя бы 1 единицу калорийности в половине финальных раундов.
За победу в раунде команде начисляются баллы в зависимости от занятого места.
Места в раунде определяются по количеству набранной суммарной калорийности ресурсов. Первое место получает команда(ы), которая наберёт больше всех. На одном месте может быть несколько команд, если они набрали равное количество калорийности.
Гарантируется минимум 1 балл если в конце раунда команда имеет больше 0 калорийности.
Количество баллов, получаемых за место, приведено в таблице 5.
Все достижения работают только на финальных раундах.
Счастливчик
Занять 77-е место в 4 раунде.
В случае, если на 77-м месте окажется несколько команд, достижение отдается одной путём рандомного выбора.
Литературное описание: “Говорят, чтобы получить приз, нужно приложить усилия. Но иногда это правило дает сбой.”
Дорогая Королева, всё под контролем
По итогу 5 раунда потерять наибольшее количество юнитов.
В случае одинакового результата приоритет отдаётся команде, набравшей больше калорий.
Литературное описание: “Несмотря на тысячи павших, командир уверен — план работает. Просто он очень... дальновидный.”
Профсоюз
В 6 раунде уничтожить юнит соперника в один ход атакой сразу 3-х юнитов, находящихся на одном гексе. Атака последнего должна стать фатальной для оппонента.
Достижение получает первая команда, выполнившая его условия.
“Совещание на клетке прошло результативно. Особенно для окружающих.”
ТОП 10
по итогу всех раундов.
ТОП 20
по итогу всех раундов получают те, кто имеет место от 11 и до 20 включительно.
Таблица 1. Характеристики юнитов
Разведчик | Боец | Рабочий | |
Очки здоровья (HP) | 80 | 180 | 130 |
Атака | 20 | 70 | 30 |
Грузоподъёмность | 2 | 2 | 8 |
Обзор | 4 | 1 | 1 |
ОП | 7 | 4 | 5 |
Вероятность появления | 10% | 30% | 60% |
Константа в API | 2 | 1 | 0 |
Таблица 2. Бонус урона
название | процент | условия |
Бонус поддержки | 50% | если рядом с юнитом и его целью находится другой союзный юнит |
Бонус муравейника | 25% | если юнит находится на клетках муравейника или в радиусе двух клеток от него |
Бонусы поддержки и муравейника могут складываться.
Бонус поддержки можно получить только от одного союзного юнита.
Таблица 3. Типы ресурсы
название | Константа в API | калорийность | условия появления |
яблоко | 1 | 10 | случайно на карте |
хлеб | 2 | 20 | случайно на карте |
нектар | 3 | 60 | генерируется в момент сдачи ресурсов в муравейник путём конвертирования принесённых ресурсов |
Таблица 4. Типы гексов
название | Константа в API | стоимость ОП | свойства |
муравейник | 1 | 1 | описано в разделе “муравейник” |
пустой | 2 | 1 | - |
грязь | 3 | 2 | стоимость ОП увеличена |
кислота | 4 | 1 | наносит 20 урона |
камни | 5 | ∞ | непроходимый гекс |
Таблица 5. Баллы за место
№ | баллы | № | баллы |
1 | 170 | 27 | 24 |
2 | 114 | 28 | 23 |
3 | 86 | 29 | 22 |
4 | 69 | 30 | 21 |
5 | 58 | 31 | 20 |
6 | 50 | 32 | 19 |
7 | 44 | 33 | 18 |
8 | 43 | 34 | 17 |
9 | 42 | 35 | 16 |
10 | 41 | 36 | 15 |
11 | 40 | 37 | 14 |
12 | 39 | 38 | 13 |
13 | 38 | 39 | 12 |
14 | 37 | 40 | 11 |
15 | 36 | 41 | 10 |
16 | 35 | 42 | 9 |
17 | 34 | 43 | 8 |
18 | 33 | 44 | 7 |
19 | 32 | 45 | 6 |
20 | 31 | 46 | 5 |
21 | 30 | 47 | 4 |
22 | 29 | 48 | 3 |
23 | 28 | 49 | 2 |
24 | 27 | 50 | 1 |
25 | 26 | 51 | 1 |
26 | 25 | … | 1 |
Сетка координат
Столбцы - q. Строки - r
Детальнее можно прочитать в статье https://www.redblobgames.com/grids/hexagons/
Ограничение РПС — 3 запроса в секунду.
Этот эндпоинт возвращает текущее состояние арены для вашей команды. Ответ включает информацию о ваших юнитах, видимых врагах, ресурсах, карте, а также мета-данные раунда.
{
"ants": [...], // Список ваших юнитов
"enemies": [...], // Видимые враги
"food": [...], // Видимые ресурсы
"home": [...], // Координаты вашего муравейника
"map": [...], // Видимые гексы карты
"nextTurnIn": 0.0, // Количество секунд до следующего хода
"score": 0, // Текущий счёт команды
"spot": { ... }, // Координаты основного гекса муравейника
"turnNo": 0 // Номер текущего хода
}
ants[] — список ваших муравьёв
Каждый объект содержит информацию о текущем состоянии юнита:
id — уникальный идентификатор муравья
type — тип муравья
q, r — координаты гекса
health — текущее количество жизней
food — ресурс, который несёт муравей (amount, type)
lastMove[] — маршрут, по которому юнит передвигался в предыдущий ход
move[] — маршрут, заданный на текущий ход
lastAttack — координаты, по которым была совершена последняя атака
lastEnemyAnt — ID вражеского муравья, по которому нанесён урон
enemies[] — видимые вражеские муравьи
Каждый объект содержит:
type, q, r, health, food, attack — известная информация о противнике, если он попал в обзор
food[] — ресурсы на карте
q, r — координаты гекса
type — тип ресурса
amount — количество ресурса на клетке
home[] — координаты всех трёх гексов муравейника вашей команды
map[] — видимые гексы карты
Каждый объект:
q, r — координаты гекса
type — тип гекса
cost — стоимость перемещения на гекс
spot — координаты основного (центрального) гекса муравейника
nextTurnIn — сколько секунд осталось до следующего хода
turnNo — номер текущего хода в раунде
Этот эндпоинт используется для задания путей передвижения ваших юнитов на следующий ход. Отправленные команды будут обработаны сервером во время следующей переходовки.
moves[] — массив команд для муравьёв
ant — UUID юнита, которому задаётся маршрут
path[] — список координат, описывающих путь, по которому должен двигаться юнит (указывается в формате odd-r: q, r)
журнал действий юнитов.
API для регистрации на раунд
по техническим причинам не представлено в swagger
для тестовых раундов
curl --location 'https://games-test.datsteam.dev/api/rounds' --header 'X-Auth-Token: XXX'
для финальных раундов
curl --location 'https://games.datsteam.dev/api/rounds' --header 'X-Auth-Token: XXX'