Игра

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 нет ни одного свободного гекса, ресурсы будут уничтожены. Свободным гексом является тот, на котором нет ни ресурсов другого типа, ни юнитов

Набег на муравейник

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

За один ход может быть совершена кража только с одного гекса муравейника. Гекс для кражи выбирается рандомно из тех, что с нектаром.

Соперники видят, сколько нектара есть в чужом муравейнике.

Кто победит

Критерии победы в порядке приоритета:

  1. набрать больше всех баллов
  2. набрать больше всех калорий
  3. потерять наименьшее количество юнитов

Все показатели считаются в сумме за все финальные раунды.

Критерии 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/

Описание API

Ограничение РПС — 3 запроса в секунду.

/api/arena

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

{

  "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 — номер текущего хода в раунде

/api/move

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

moves[] — массив команд для муравьёв

ant — UUID юнита, которому задаётся маршрут

path[] — список координат, описывающих путь, по которому должен двигаться юнит (указывается в формате odd-r: q, r)

/api/logs

журнал действий юнитов.

/api/register

API для регистрации на раунд

/api/rounds

по техническим причинам не представлено в 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'