Танчики - другой Battle City

Вспомни детство, но забудь про ограничения! Те самые аутентичные пиксели, оригинальные звуки взрывов и кирпичные стены, которые мы так яростно расстреливали в 90-х, возвращаются в ультимативном формате. Больше никакого одного экрана на двоих — теперь это полноценное сетевое побоище на 10 живых игроков в реальном времени!

Я выбросил в мусорку тяжелые игровые движки и написал этот клон полностью с нуля на «голом» железе. Пока современные игры требуют гигабайты памяти ради пары кадров, этот гибридный сетевой стек на TCP/UDP со сжатием LZ4 упаковывает весь этот ураганный экшен всего в 100-200 Кбайт трафика. Максимальный FPS, нулевой пинг, только чистый скилл и старая добрая тактика защиты орла.

Собирай взвод, заправляй бак и покажи, кто здесь настоящий ас!

Скачать для Windows 10+ (x64)

Одиночная игра

Разархивируйте игру в отдельный каталог и запустите Launcher.exe - загрузчик игры, который позволяет выбирать игровые карты, создавать игровой сервер и приглашать других игроков в игру.

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

Структура каталога файлов игры Танчики / Battle City
Интерфейс лаунчера Launcher.exe для запуска Танчиков / Battle City
Выбор карты уровня в меню игры Танчики / Battle City
Кнопка Начать для старта одиночного боя / Battle City
Стартовый экран загрузки карты в Танчиках / Battle City
Геймплей одиночного режима Танчики / Battle City на ПК

Сетевая игра в режиме мультиплеера

Для сетевой игры необходимо выбрать одного игрока или арбитра, который будет выступать в качестве сервера игры. Если игрок выступает одновременно «как сервер», то у него канал связи с сетевым маршрутизатором должен быть в два раза шире, чем требует игра. Перед началом раунда на игровом сервере необходимо выбрать сетевой маршрутизатор и включить «Режим сервера». После этого у владельца сервера появится ссылка-приглашение, которой необходимо поделиться со всеми игроками и зрителями. Игроки от зрителей отличаются тем, что у игроков есть «имена», а у зрителей их нет. Игроки у себя компьютерах должны указать свои имена и добавить полученную от сервера ссылку-приглашение и нажать кнопку «Присоединиться». Зрители просто добавляют ссылку-приглашение и нажимают кнопку «Присоединиться». Игра начнется автоматически после ее запуска на игровом сервере. В процессе подключения к игре новых игроков их имена будут отображаться в едином списке. Подключенные зрители в списке игроков не появляются.

После подключения к игре всех игроков, владелец сервера должен выбрать игровую карту и нажать кнопку «Начать». Игра запуститься немедленно и вы начнете групповую сетевую игру. Количество активных игроков зависит от настроек игровой карты. По готовности, на стартовом экране необходимо нажать любую клавишу для начала боя в режиме мультиплеера.

Настройка сетевого маршрутизатора в лаунчере игры Танчики / Battle City
Активация серверного режима для мультиплеера игры Танчики / Battle City
Подключение первого сетевого игрока к серверу игры Танчики / Battle City
Подключение второго и последующих сетевых игроков к игре Танчики / Battle City
Выбор карты уровня для кооперативной игры Танчики / Battle City
Старт группового сетевого матча в игру Танчики / Battle City
Стартовый экран сетевой игры Танчики / Battle City
Геймплей мультиплеера Танчиков / BAttle City на несколько игроков

Клавиши управления в игре стандартные: вверх ↑; вниз ↓; влево ←; вправо →; выстрел SPACE.

После запуска игры, а также в ее процессе можно на экран вывести отладочную информацию и телеметрию - кнопка ~.

Сетевая телеметрия и отладочная информация по кнопке тильда игры Танчики / Battle City

Конструирование своих уровней, звуков, графики

Структура ресурсов очень простая - звуки, графика и файл описания текстур (строго файл texture.txt) находятся в единой папке assets/НАЗВАНИЕ_РЕСУРСНОГО_ПАКЕТА - это «ресурсный пакет», который подключается к картам уровня и находится в своей изолированной папке; «карты» находятся также в единой изолированной папке maps и представляют из себя набор текстовых файлов в строго определеном формате (пример - файл template.txt).

Каталог с графическими и звуковыми ресурсами игры Танчики / Battle City
Каталог с игровыми картами игры Танчики / Battle City

Ресурсный пакет состоит из:

  • Звуковых файлов строго в формате .WAV;
  • Файла заставки уровня в формате .BMP (файл строго startup.bmp);
  • Текстурного атласа строго в texture.png с альфа-каналом;
  • Описание текстурного атласа строго в texture.txt по заданному формату;

Примечание: Для создания нового ресурсного пакета при помощи ИИ необходимо перерисовать текстурный атлас строго следуя разметке файла texture.txt - просто закиньте в ИИ этот файл и просите строго следовать разметке.

Кликните, чтобы раскрыть эталонный файл-шаблон описания текстурного атласа, который можно скормить ИИ/AI при перерисовке текстур.
# Ресурсный набор игровых объектов
# ЕСЛИ ЗАХОЧЕШЬ УСТАНОВИТЬ СВОЙ НАБОР ГРАФИКИ, ТО НАДО ОБНОВИТЬ ТЕКСТУРУ И ЭТОТ ФАЙЛ
# ПРОСИ НЕЙРОСЕТЬ (ИИ/AI) ПЕРЕНАСТРОИТЬ КООРДИНАТЫ СПРАЙТОВ ПОД НОВУЮ ТЕКСТУРУ
#
# Текстура со спрайтами должна быть строго в файле texture.png и иметь alpha-канал прозрачности
#
# Здесь описывается размещение всех спрайтов в текстурном атласе 
# NAME		ROTATED(INT)	X(INT)	Y(INT)	W(INT)	H(INT)	CX	CY
###########################################################################
# Боковая плашка со статистикой
STATS;		0;		369; 	 0;	31;    240;	0.0;	0.0
# Пустой блок компьютерного танка на плашке статистики
EMPTY;		0;		369;	 0;	 8;	 8;	0.0;	0.0
# Компьютерный танк на плашке статистики
ENEMY;		0;		320;   192;	 8;      8;	0.0;	0.0
# Цифры от 0 до 9
0;		0;		329;   184;	 7;	 7;	0.0;	0.0
1;		0;		338;   184;	 7;	 7;	0.0;	0.0
2;		0;		345;   184;	 7;	 7;	0.0;	0.0
3;		0;		353;   184;	 7;	 7;	0.0;	0.0
4;		0;		361;   184;	 7;	 7;	0.0;	0.0
5;		0;		329;   192;	 7;	 7;	0.0;	0.0
6;		0;		337;   192;	 7;	 7;	0.0;	0.0
7;		0;		345;   192;	 7;	 7;	0.0;	0.0
8;		0;		353;   192;	 7;	 7;	0.0;	0.0
9;		0;		361;   192;	 7;	 7;	0.0;	0.0
# Иконка игрока на боковой плашке статистики
PLR;		0;		385;   136;	 7;	 7;	0.0;	0.0
TICON;		0;		377;   144;	 7;	 8;	0.0;	0.0
# Флаг на боковой плашке статистики
FLAG;		0;		376;   184;	16;	15;	0.0;	0.0
# Фраза "СТАДИЯ" (STAGE)
STAGE;		0;		328;   176;	40;	 8;	0.0;	0.0
# Конец игры
GOVER;		0;		288;   184;	32;	16;	0.0;	0.0
# Пауза
PAUSE;		0;		288;   176;	40;	 8;	0.0;	0.0
###########################################################################
# Игровые танки разных модификаций, их положение и анимация
# Структура названия спрайта танка
# A - танк; 0..3 - цвет танка; 0..7 - модель танка; N,S,W,E - направление башни; 0..1 - стадия анимации 0 или 1
# Пример A12N1 - серебрянный танк, модели 2, направление башни на север, нечетный кадр анимации
# Золотой танк
A00N0;		0;		  0;	 0;	16;	16;	0.0;	0.0
A00N1;		0;		 16;	 0;	16;	16;	0.0;	0.0
A00W0;		0;		 32;	 0;	16;	16;	0.0;	0.0
A00W1;		0;		 48;	 0;	16;	16;	0.0;	0.0
A00S0;		0;		 64;	 0;	16;	16;	0.0;	0.0
A00S1;		0;		 80;	 0;	16;	16;	0.0;	0.0
A00E0;		0;		 96;	 0;	16;	16;	0.0;	0.0
A00E1;		0;		112;	 0;	16;	16;	0.0;	0.0
#
A01N0;		0;		  0;	16;	16;	16;	0.0;	0.0
A01N1;		0;		 16;	16;	16;	16;	0.0;	0.0
A01W0;		0;		 32;	16;	16;	16;	0.0;	0.0
A01W1;		0;		 48;	16;	16;	16;	0.0;	0.0
A01S0;		0;		 64;	16;	16;	16;	0.0;	0.0
A01S1;		0;		 80;	16;	16;	16;	0.0;	0.0
A01E0;		0;		 96;	16;	16;	16;	0.0;	0.0
A01E1;		0;		112;	16;	16;	16;	0.0;	0.0
#                                                                       
A02N0;		0;		  0;	32;	16;	16;	0.0;	0.0
A02N1;		0;		 16;	32;	16;	16;	0.0;	0.0
A02W0;		0;		 32;	32;	16;	16;	0.0;	0.0
A02W1;		0;		 48;	32;	16;	16;	0.0;	0.0
A02S0;		0;		 64;	32;	16;	16;	0.0;	0.0
A02S1;		0;		 80;	32;	16;	16;	0.0;	0.0
A02E0;		0;		 96;	32;	16;	16;	0.0;	0.0
A02E1;		0;		112;	32;	16;	16;	0.0;	0.0
#
A03N0;		0;		  0;	48;	16;	16;	0.0;	0.0
A03N1;		0;		 16;	48;	16;	16;	0.0;	0.0
A03W0;		0;		 32;	48;	16;	16;	0.0;	0.0
A03W1;		0;		 48;	48;	16;	16;	0.0;	0.0
A03S0;		0;		 64;	48;	16;	16;	0.0;	0.0
A03S1;		0;		 80;	48;	16;	16;	0.0;	0.0
A03E0;		0;		 96;	48;	16;	16;	0.0;	0.0
A03E1;		0;		112;	48;	16;	16;	0.0;	0.0
#
A04N0;		0;		  0;	64;	16;	16;	0.0;	0.0
A04N1;		0;		 16;	64;	16;	16;	0.0;	0.0
A04W0;		0;		 32;	64;	16;	16;	0.0;	0.0
A04W1;		0;		 48;	64;	16;	16;	0.0;	0.0
A04S0;		0;		 64;	64;	16;	16;	0.0;	0.0
A04S1;		0;		 80;	64;	16;	16;	0.0;	0.0
A04E0;		0;		 96;	64;	16;	16;	0.0;	0.0
A04E1;		0;		112;	64;	16;	16;	0.0;	0.0
#
A05N0;		0;		  0;	80;	16;	16;	0.0;	0.0
A05N1;		0;		 16;	80;	16;	16;	0.0;	0.0
A05W0;		0;		 32;	80;	16;	16;	0.0;	0.0
A05W1;		0;		 48;	80;	16;	16;	0.0;	0.0
A05S0;		0;		 64;	80;	16;	16;	0.0;	0.0
A05S1;		0;		 80;	80;	16;	16;	0.0;	0.0
A05E0;		0;		 96;	80;	16;	16;	0.0;	0.0
A05E1;		0;		112;	80;	16;	16;	0.0;	0.0
#
A06N0;		0;		  0;	96;	16;	16;	0.0;	0.0
A06N1;		0;		 16;	96;	16;	16;	0.0;	0.0
A06W0;		0;		 32;	96;	16;	16;	0.0;	0.0
A06W1;		0;		 48;	96;	16;	16;	0.0;	0.0
A06S0;		0;		 64;	96;	16;	16;	0.0;	0.0
A06S1;		0;		 80;	96;	16;	16;	0.0;	0.0
A06E0;		0;		 96;	96;	16;	16;	0.0;	0.0
A06E1;		0;		112;	96;	16;	16;	0.0;	0.0
#
A07N0;		0;		  0;   112;	16;	16;	0.0;	0.0
A07N1;		0;		 16;   112;	16;	16;	0.0;	0.0
A07W0;		0;		 32;   112;	16;	16;	0.0;	0.0
A07W1;		0;		 48;   112;	16;	16;	0.0;	0.0
A07S0;		0;		 64;   112;	16;	16;	0.0;	0.0
A07S1;		0;		 80;   112;	16;	16;	0.0;	0.0
A07E0;		0;		 96;   112;	16;	16;	0.0;	0.0
A07E1;		0;		112;   112;	16;	16;	0.0;	0.0
###########################################################################
# Серебряный танк
A10N0;		0;		128;	 0;	16;	16;	0.0;	0.0
A10N1;		0;		144;	 0;	16;	16;	0.0;	0.0
A10W0;		0;		160;	 0;	16;	16;	0.0;	0.0
A10W1;		0;		176;	 0;	16;	16;	0.0;	0.0
A10S0;		0;		192;	 0;	16;	16;	0.0;	0.0
A10S1;		0;		208;	 0;	16;	16;	0.0;	0.0
A10E0;		0;		224;	 0;	16;	16;	0.0;	0.0
A10E1;		0;		240;	 0;	16;	16;	0.0;	0.0
#
A11N0;		0;		128;	16;	16;	16;	0.0;	0.0
A11N1;		0;		144;	16;	16;	16;	0.0;	0.0
A11W0;		0;		160;	16;	16;	16;	0.0;	0.0
A11W1;		0;		176;	16;	16;	16;	0.0;	0.0
A11S0;		0;		192;	16;	16;	16;	0.0;	0.0
A11S1;		0;		208;	16;	16;	16;	0.0;	0.0
A11E0;		0;		224;	16;	16;	16;	0.0;	0.0
A11E1;		0;		240;	16;	16;	16;	0.0;	0.0
#                                                                       
A12N0;		0;		128;	32;	16;	16;	0.0;	0.0
A12N1;		0;		144;	32;	16;	16;	0.0;	0.0
A12W0;		0;		160;	32;	16;	16;	0.0;	0.0
A12W1;		0;		176;	32;	16;	16;	0.0;	0.0
A12S0;		0;		192;	32;	16;	16;	0.0;	0.0
A12S1;		0;		208;	32;	16;	16;	0.0;	0.0
A12E0;		0;		224;	32;	16;	16;	0.0;	0.0
A12E1;		0;		240;	32;	16;	16;	0.0;	0.0
#
A13N0;		0;		128;	48;	16;	16;	0.0;	0.0
A13N1;		0;		144;	48;	16;	16;	0.0;	0.0
A13W0;		0;		160;	48;	16;	16;	0.0;	0.0
A13W1;		0;		176;	48;	16;	16;	0.0;	0.0
A13S0;		0;		192;	48;	16;	16;	0.0;	0.0
A13S1;		0;		208;	48;	16;	16;	0.0;	0.0
A13E0;		0;		224;	48;	16;	16;	0.0;	0.0
A13E1;		0;		240;	48;	16;	16;	0.0;	0.0
#
A14N0;		0;		128;	64;	16;	16;	0.0;	0.0
A14N1;		0;		144;	64;	16;	16;	0.0;	0.0
A14W0;		0;		160;	64;	16;	16;	0.0;	0.0
A14W1;		0;		176;	64;	16;	16;	0.0;	0.0
A14S0;		0;		192;	64;	16;	16;	0.0;	0.0
A14S1;		0;		208;	64;	16;	16;	0.0;	0.0
A14E0;		0;		224;	64;	16;	16;	0.0;	0.0
A14E1;		0;		240;	64;	16;	16;	0.0;	0.0
#
A15N0;		0;		128;	80;	16;	16;	0.0;	0.0
A15N1;		0;		144;	80;	16;	16;	0.0;	0.0
A15W0;		0;		160;	80;	16;	16;	0.0;	0.0
A15W1;		0;		176;	80;	16;	16;	0.0;	0.0
A15S0;		0;		192;	80;	16;	16;	0.0;	0.0
A15S1;		0;		208;	80;	16;	16;	0.0;	0.0
A15E0;		0;		224;	80;	16;	16;	0.0;	0.0
A15E1;		0;		240;	80;	16;	16;	0.0;	0.0
#
A16N0;		0;		128;	96;	16;	16;	0.0;	0.0
A16N1;		0;		144;	96;	16;	16;	0.0;	0.0
A16W0;		0;		160;	96;	16;	16;	0.0;	0.0
A16W1;		0;		176;	96;	16;	16;	0.0;	0.0
A16S0;		0;		192;	96;	16;	16;	0.0;	0.0
A16S1;		0;		208;	96;	16;	16;	0.0;	0.0
A16E0;		0;		224;	96;	16;	16;	0.0;	0.0
A16E1;		0;		240;	96;	16;	16;	0.0;	0.0
#
A17N0;		0;		128;   112;	16;	16;	0.0;	0.0
A17N1;		0;		144;   112;	16;	16;	0.0;	0.0
A17W0;		0;		160;   112;	16;	16;	0.0;	0.0
A17W1;		0;		176;   112;	16;	16;	0.0;	0.0
A17S0;		0;		192;   112;	16;	16;	0.0;	0.0
A17S1;		0;		208;   112;	16;	16;	0.0;	0.0
A17E0;		0;		224;   112;	16;	16;	0.0;	0.0
A17E1;		0;		240;   112;	16;	16;	0.0;	0.0
###########################################################################
# Зеленый танк
A20N0;		0;		  0;   128;	16;	16;	0.0;	0.0
A20N1;		0;		 16;   128;	16;	16;	0.0;	0.0
A20W0;		0;		 32;   128;	16;	16;	0.0;	0.0
A20W1;		0;		 48;   128;	16;	16;	0.0;	0.0
A20S0;		0;		 64;   128;	16;	16;	0.0;	0.0
A20S1;		0;		 80;   128;	16;	16;	0.0;	0.0
A20E0;		0;		 96;   128;	16;	16;	0.0;	0.0
A20E1;		0;		112;   128;	16;	16;	0.0;	0.0
#
A21N0;		0;		  0;   144;	16;	16;	0.0;	0.0
A21N1;		0;		 16;   144;	16;	16;	0.0;	0.0
A21W0;		0;		 32;   144;	16;	16;	0.0;	0.0
A21W1;		0;		 48;   144;	16;	16;	0.0;	0.0
A21S0;		0;		 64;   144;	16;	16;	0.0;	0.0
A21S1;		0;		 80;   144;	16;	16;	0.0;	0.0
A21E0;		0;		 96;   144;	16;	16;	0.0;	0.0
A21E1;		0;		112;   144;	16;	16;	0.0;	0.0
#                                                                       
A22N0;		0;		  0;   160;	16;	16;	0.0;	0.0
A22N1;		0;		 16;   160;	16;	16;	0.0;	0.0
A22W0;		0;		 32;   160;	16;	16;	0.0;	0.0
A22W1;		0;		 48;   160;	16;	16;	0.0;	0.0
A22S0;		0;		 64;   160;	16;	16;	0.0;	0.0
A22S1;		0;		 80;   160;	16;	16;	0.0;	0.0
A22E0;		0;		 96;   160;	16;	16;	0.0;	0.0
A22E1;		0;		112;   160;	16;	16;	0.0;	0.0
#
A23N0;		0;		  0;   176;	16;	16;	0.0;	0.0
A23N1;		0;		 16;   176;	16;	16;	0.0;	0.0
A23W0;		0;		 32;   176;	16;	16;	0.0;	0.0
A23W1;		0;		 48;   176;	16;	16;	0.0;	0.0
A23S0;		0;		 64;   176;	16;	16;	0.0;	0.0
A23S1;		0;		 80;   176;	16;	16;	0.0;	0.0
A23E0;		0;		 96;   176;	16;	16;	0.0;	0.0
A23E1;		0;		112;   176;	16;	16;	0.0;	0.0
#
A24N0;		0;		  0;   192;	16;	16;	0.0;	0.0
A24N1;		0;		 16;   192;	16;	16;	0.0;	0.0
A24W0;		0;		 32;   192;	16;	16;	0.0;	0.0
A24W1;		0;		 48;   192;	16;	16;	0.0;	0.0
A24S0;		0;		 64;   192;	16;	16;	0.0;	0.0
A24S1;		0;		 80;   192;	16;	16;	0.0;	0.0
A24E0;		0;		 96;   192;	16;	16;	0.0;	0.0
A24E1;		0;		112;   192;	16;	16;	0.0;	0.0
#
A25N0;		0;		  0;   208;	16;	16;	0.0;	0.0
A25N1;		0;		 16;   208;	16;	16;	0.0;	0.0
A25W0;		0;		 32;   208;	16;	16;	0.0;	0.0
A25W1;		0;		 48;   208;	16;	16;	0.0;	0.0
A25S0;		0;		 64;   208;	16;	16;	0.0;	0.0
A25S1;		0;		 80;   208;	16;	16;	0.0;	0.0
A25E0;		0;		 96;   208;	16;	16;	0.0;	0.0
A25E1;		0;		112;   208;	16;	16;	0.0;	0.0
#
A26N0;		0;		  0;   224;	16;	16;	0.0;	0.0
A26N1;		0;		 16;   224;	16;	16;	0.0;	0.0
A26W0;		0;		 32;   224;	16;	16;	0.0;	0.0
A26W1;		0;		 48;   224;	16;	16;	0.0;	0.0
A26S0;		0;		 64;   224;	16;	16;	0.0;	0.0
A26S1;		0;		 80;   224;	16;	16;	0.0;	0.0
A26E0;		0;		 96;   224;	16;	16;	0.0;	0.0
A26E1;		0;		112;   224;	16;	16;	0.0;	0.0
#
A27N0;		0;		  0;   240;	16;	16;	0.0;	0.0
A27N1;		0;		 16;   240;	16;	16;	0.0;	0.0
A27W0;		0;		 32;   240;	16;	16;	0.0;	0.0
A27W1;		0;		 48;   240;	16;	16;	0.0;	0.0
A27S0;		0;		 64;   240;	16;	16;	0.0;	0.0
A27S1;		0;		 80;   240;	16;	16;	0.0;	0.0
A27E0;		0;		 96;   240;	16;	16;	0.0;	0.0
A27E1;		0;		112;   240;	16;	16;	0.0;	0.0
###########################################################################
# Малиновый танк
A30N0;		0;		128;   128;	16;	16;	0.0;	0.0
A30N1;		0;		144;   128;	16;	16;	0.0;	0.0
A30W0;		0;		160;   128;	16;	16;	0.0;	0.0
A30W1;		0;		176;   128;	16;	16;	0.0;	0.0
A30S0;		0;		192;   128;	16;	16;	0.0;	0.0
A30S1;		0;		208;   128;	16;	16;	0.0;	0.0
A30E0;		0;		224;   128;	16;	16;	0.0;	0.0
A30E1;		0;		240;   128;	16;	16;	0.0;	0.0
#
A31N0;		0;		128;   144;	16;	16;	0.0;	0.0
A31N1;		0;		144;   144;	16;	16;	0.0;	0.0
A31W0;		0;		160;   144;	16;	16;	0.0;	0.0
A31W1;		0;		176;   144;	16;	16;	0.0;	0.0
A31S0;		0;		192;   144;	16;	16;	0.0;	0.0
A31S1;		0;		208;   144;	16;	16;	0.0;	0.0
A31E0;		0;		224;   144;	16;	16;	0.0;	0.0
A31E1;		0;		240;   144;	16;	16;	0.0;	0.0
#                                                                       
A32N0;		0;		128;   160;	16;	16;	0.0;	0.0
A32N1;		0;		144;   160;	16;	16;	0.0;	0.0
A32W0;		0;		160;   160;	16;	16;	0.0;	0.0
A32W1;		0;		176;   160;	16;	16;	0.0;	0.0
A32S0;		0;		192;   160;	16;	16;	0.0;	0.0
A32S1;		0;		208;   160;	16;	16;	0.0;	0.0
A32E0;		0;		224;   160;	16;	16;	0.0;	0.0
A32E1;		0;		240;   160;	16;	16;	0.0;	0.0
#
A33N0;		0;		128;   176;	16;	16;	0.0;	0.0
A33N1;		0;		144;   176;	16;	16;	0.0;	0.0
A33W0;		0;		160;   176;	16;	16;	0.0;	0.0
A33W1;		0;		176;   176;	16;	16;	0.0;	0.0
A33S0;		0;		192;   176;	16;	16;	0.0;	0.0
A33S1;		0;		208;   176;	16;	16;	0.0;	0.0
A33E0;		0;		224;   176;	16;	16;	0.0;	0.0
A33E1;		0;		240;   176;	16;	16;	0.0;	0.0
#
A34N0;		0;		128;   192;	16;	16;	0.0;	0.0
A34N1;		0;		144;   192;	16;	16;	0.0;	0.0
A34W0;		0;		160;   192;	16;	16;	0.0;	0.0
A34W1;		0;		176;   192;	16;	16;	0.0;	0.0
A34S0;		0;		192;   192;	16;	16;	0.0;	0.0
A34S1;		0;		208;   192;	16;	16;	0.0;	0.0
A34E0;		0;		224;   192;	16;	16;	0.0;	0.0
A34E1;		0;		240;   192;	16;	16;	0.0;	0.0
#
A35N0;		0;		128;   208;	16;	16;	0.0;	0.0
A35N1;		0;		144;   208;	16;	16;	0.0;	0.0
A35W0;		0;		160;   208;	16;	16;	0.0;	0.0
A35W1;		0;		176;   208;	16;	16;	0.0;	0.0
A35S0;		0;		192;   208;	16;	16;	0.0;	0.0
A35S1;		0;		208;   208;	16;	16;	0.0;	0.0
A35E0;		0;		224;   208;	16;	16;	0.0;	0.0
A35E1;		0;		240;   208;	16;	16;	0.0;	0.0
#
A36N0;		0;		128;   224;	16;	16;	0.0;	0.0
A36N1;		0;		144;   224;	16;	16;	0.0;	0.0
A36W0;		0;		160;   224;	16;	16;	0.0;	0.0
A36W1;		0;		176;   224;	16;	16;	0.0;	0.0
A36S0;		0;		192;   224;	16;	16;	0.0;	0.0
A36S1;		0;		208;   224;	16;	16;	0.0;	0.0
A36E0;		0;		224;   224;	16;	16;	0.0;	0.0
A36E1;		0;		240;   224;	16;	16;	0.0;	0.0
#
A37N0;		0;		128;   240;	16;	16;	0.0;	0.0
A37N1;		0;		144;   240;	16;	16;	0.0;	0.0
A37W0;		0;		160;   240;	16;	16;	0.0;	0.0
A37W1;		0;		176;   240;	16;	16;	0.0;	0.0
A37S0;		0;		192;   240;	16;	16;	0.0;	0.0
A37S1;		0;		208;   240;	16;	16;	0.0;	0.0
A37E0;		0;		224;   240;	16;	16;	0.0;	0.0
A37E1;		0;		240;   240;	16;	16;	0.0;	0.0
###########################################################################
# Броня
H0;		0;		256;	144;	16;	16;	0.0;	0.0
H1;		0;		272;	144;	16;	16;	0.0;	0.0
###########################################################################
# Выстрел
SN;		0;		323;	102;	3;	4;	0.0;	0.0
SW;		0;		330;	102;	4;	3;	0.0;	0.0
SS;		0;		339;	102;	3;	4;	0.0;	0.0
SE;		0;		346;	102;	4;	3;	0.0;	0.0
###########################################################################
# Малый взрыв
NS0;		0;		259;	130;	12;	12;	0.0;	0.0
NS1;		0;		272;	129;	15;	15;	0.0;	0.0
NS2;		0;		288;	129;	16;	16;	0.0;	0.0
# Большой взрыв
NB0;		0;		306;	129;	29;	29;	0.0;	0.0
NB1;		0;		338;	128;	30;	30;	0.0;	0.0
###########################################################################
# Защищаемый и разрушенный флаг
Z;		0;		304;	32;	16;	16;	0.0;    0.0
Z0;		0;		304;	32;	16;	16;	0.0;    0.0
Z1;		0;		320;	32;	16;	16;	0.0;    0.0
###########################################################################
# Очки счета
K100;		0;		290;	164;	14;	7;	0.0;	0.0
K200;		0;		305;	164;	14;	7;	0.0;	0.0
K300;		0;		321;	164;	14;	7;	0.0;	0.0
K400;		0;		337;	164;	14;	7;	0.0;	0.0
K500;		0;		353;	164;	14;	7;	0.0;	0.0
###########################################################################
# Бонусы
# Щит
PSHLD;		0;		256;	112;	16;	16;	0.0;	0.0
# Заморозка
PFREZ;		0;		272;	112;	16;	16;	0.0;    0.0
# Лопата
PLPTA;		0;		288;	112;	16;	16;	0.0;    0.0
# Что-то случайное
PRND;		0;		304;	112;	16;	16;	0.0;    0.0
# Бомба
PBOMB;		0;		320;	112;	16;	16;	0.0;    0.0
# Танк
PTANK;		0;		336;	112;	16;	16;	0.0;    0.0
# Пистолет
PGUN;		0;		352;	112;	16;	16;	0.0;    0.0
###########################################################################
# Респаун
R0              0;		259;	99;	 9;	 9;	0.0;	0.0
R1     		0;		274; 	98;	11;	11;	0.0;	0.0
R2              0;		289;	97;	13;	13;	0.0;	0.0
R3		0;		304;	96;	15;	15;	0.0;	0.0
###########################################################################
# Пусто
.;		0;		336;	 0;	 8;	 8;	0.0;    0.0
###########################################################################
# Кирпичи
B;		0;		256;	 0;	16;	16;	0.0;    0.0
BR;		0;		272;	 0;	16;	16;	0.0;    0.0
BD;		0;		288;	 0;	16;	16;	0.0;    0.0
BL;		0;		304;	 0;	16;	16;	0.0;    0.0
BU;		0;		320;	 0;	16;	16;	0.0;    0.0
b;		0;		256;	64;	 8;	 8;	0.0;    0.0
br;		0;		264;	64;	 8;	 8;	0.0;    0.0
bd;		0;		272;	64;	 8;	 8;	0.0;    0.0
bl;		0;		280;	64;	 8;	 8;	0.0;    0.0
bu;		0;		288;	64;	 8;	 8;	0.0;    0.0
###########################################################################
# Бетон
C;		0;		256;	16;	16;	16;	0.0;    0.0
CR;		0;		272;	16;	16;	16;	0.0;    0.0
CB;		0;		288;	16;	16;	16;	0.0;    0.0
CL;		0;		304;	16;	16;	16;	0.0;    0.0
CT;		0;		320;	16;	16;	16;	0.0;    0.0
c;		0;		256;	72;	 8;	 8;	0.0;    0.0
###########################################################################
# Вода
Q;		0;		256;	32;	16;	16;	0.0;    0.0
#Q0;		0;		256;	32;	16;	16;	0.0;    0.0
#Q1;		0;		256;	48;	16;	16;	0.0;    0.0
#Q2;		0;		272;	48;	16;	16;	0.0;    0.0
q0;		0;		256;	80;	 8;	 8;	0.0;    0.0
q1;		0;		264;	80;	 8;	 8;	0.0;    0.0
q2;		0;		272;	80;	 8;	 8;	0.0;    0.0
###########################################################################
# Лес
F;		0;		272;	32;	16;	16;	0.0;    0.0
f;		0;		264;	72;	 8;	 8;	0.0;    0.0
###########################################################################
# Лед
I;		0;		288;	32;	16;	16;	0.0;    0.0
i;		0;		272;	72;	 8;	 8;	0.0;    0.0
								

Карты уровней и основные замечания:

  • Файл должен быть строго в кодировке UTF-8 BOM;
  • Должны быть заполнены все поля файла без пропусков;
  • Возможное количество сетевых игроков определяется строго описанием в карте уровня (поле !PLAYERS);
  • Игроки и компьютер могут играть в одной команде;
  • Игра считается оконченной если уничтожен орел, уничтожены все игроки или на поле осталась одна команда.

Примечание: Для создания новой карты уровня достаточно загрузить в ИИ файл шаблона template.txt и попросить сгенерировать по этому файлу новый уровень или серию уровней - все подсказки для ИИ уже присутствуют в файле-шаблоне.

Кликните, чтобы раскрыть эталонный файл-шаблон карты уровня, который можно скормить ИИ/AI при создании новых уровней.
# ФАЙЛ ДОЛЖЕН БЫТЬ СТРОГО В КОДИРОВКЕ 65001
# ШАБЛОН УРОВНЯ. ПРОСТО ЗАКИДЫВАЙ В НЕЙРОСЕТЬ (ИИ/AI) И ПРОСИ СГЕНЕРИРОВАТЬ НОВЫЙ УРОВЕНЬ

# __________         __    __  .__           _________ .__  __          
# \______   \_____ _/  |__/  |_|  |   ____   \_   ___ \|__|/  |_ ___.__.
#  |    |  _/\__  \\   __\   __\  | _/ __ \  /    \  \/|  \   __<   |  |
#  |    |   \ / __ \|  |  |  | |  |_\  ___/  \     \___|  ||  |  \___  |
#  |______  /(____  /__|  |__| |____/\___  >  \______  /__||__|  / ____|
#         \/      \/                     \/          \/          \/     
#

################################################################################
# ПОДСКАЗКА ДЛЯ РАЗРАБОТЧИКА / ВАЛИДАТОРА КАРТЫ
# 
# 1. РЕСУРСЫ (!DATAPACK, !TEXTURE, !AUDIO): Ресурсы, используемые на уровне. Настриваются отдельно.
# 
# 2. СЕТКА (!WORLD, !MAP): 
#    - Размер задается строго в !WORLD (Ширина; Высота;).
#    - Если строка в !MAP короче Ширины, парсер дополняет её точками ('.').
#    - Символы: . (пусто), Z (флаг), B (кирпич), C (бетон), F (лес), Q (вода), I (лед).
#    - Цифры 0-9 — точки респауна игроков и компьютера.
# 
# 3. РАЗРУШАЕМОСТЬ (!RUIN): Порядок значений строгий: [Прочность B]; [Прочность C];
# 
# 4. МОДЕЛИ ПОВЕДЕНИЯ (AI):
#    - RND  — танк движется к случайной точке карты, затем выбирает новую и т.д.
#    - KILL — танк строго охотится за танком игрока чужой команды.
#    - FLAG — танк целенаправленно движется к флагу 'Z' для его уничтожения.
# 
# 5. КОМАНДЫ (TEAM):
#    - Объекты (и танки компьютера, и игроки) с одинаковым ID команды находятся 
#      в одном союзе. Огонь по своим заблокирован (не могут уничтожить друг друга).
# 
# 6. ТАНКИ ПРОТИВНИКА (!COMPUTER):
#    - Все колонки строго разделены точкой с запятой (;). Пробелы игнорируются.
#    - Текст после последней ';' в строке — это сообщений (не более 64 символов), которое появляется в центре экрана когда танк входит в игру.
#    - Колонки по порядку: 
#      1. HOME (Точки спауна через запятую, например: 2,3,4 - любое количество в соответствии с нумерацией на карте)
#      2. TANK (Модель XY, где X=0..3 серия, Y=0..7 тип)
#      3. DIR (Направление: N, S, E, W)
#      4. AI (Поведение: RND, KILL, FLAG)
#      5. TIMING (Задержка появления)
#      6. HEALTH (Очки жизни)
#      7. SPEED (Макс. скорость)
#      8. ACCEL (Ускорение)
#      9. RELOAD (Перезарядка)
#      10. SHOT (Скорость пули)
#      11. DAMAGE (Урон)
#      12. POINTS (Очки за уничтожение)
#      13. TEAM (ID команды)
# 
# 7. ИГРОКИ (!PLAYERS):
#    - Логика парсинга аналогична !COMPUTER (разделение через ';', игнор пробелов).
#    - На карте поддерживается до 10 игроков (точки респауна в соответствии с нумерацией на карте).
################################################################################

# Ресурсы ##############################################################
# Название ресурсного пакета - название каталога в папке assets
!DATAPACK
template
# Текстура
!TEXTURE
# FILE - файл тектуры
# ATLAS - атлас текстуры
# FILE		ATLAS
texture.png;	texture.txt;
# Звуки
!AUDIO
# START - звук начала стадии
# RUNNING - звук движущихся танков
# SHOT - звук выстрела
# BOOM - звук малого взрыва
# BLAST - звук большого взрыва
# BONUS - звук подборки бонуса
# GAMEOVER - звук неудачного окончания игры
# SUCCESS - звук успешного завершения стадии
# START		RUNNING		SHOT		BOOM		BLAST		BONUS		GAMEOVER	SUCCESS
start.wav;	running0.wav;	shot.wav;	boom.wav;	blast.wav;	bonus.wav;	gameover.wav;	success.wav;
########################################################################
# Название уровня (небольшой текст в одно предложение ~60 символов)
!HEAD
Штурм цитадели
# Описание уровня (многострочный текст; 3-5 вводных предложений; каждая строка ~60 символов)
!NOTICE
Монолитный лабиринт, где твои снаряды бесполезны против стен. 
Вся карта из неуязвимого бетона. Узкие проходы, укрыться негде.
Придется разменивать ХП лицом или выманивать ботов на рикошеты.
Каждая ошибка — минус катка.
!WORLD
# ЗНАЧЕНИЯ ИДУТ СТРОГО В ОДНУ СТРОКУ
# WIDTH	HEIGHT - комфортный диапазон значений (13..20)
13;	14;
!MAP
# Карта мира (оптимально 13x14, но можно незначительно больше)
# . - пустое поле
# 0..9 - точки респауна игроков и компьютера 1 - 10
# Z - флаг (условие победы компьютера)
# B - кирпичный блок (блок имеет несколько стадий разрушения)
# С - бетонный блок (блок имеет повышенную прочность)
# F - лесной массив (лес скрывает танки)
# Q - вода (танки не могут пересекать блоки воды)
# I - лед (танки скользят на льду)
2.....3.....4
..BBBBBBBBB..
..FC..B..CF..
..FB..B..CF..
..FC..B..CF..
..FC..B..BF..
..FCCC.CCCF..
.............
.QQQQQQQQQQQ.
.IIIIIIIIIII.
.............
.............
.....BBB.....
..0..BZB..1..
# Разрушаемость окружения
!RUIN
# B - кирпичный блок (блок имеет несколько стадий разрушения)
# С - бетонный блок (блок имеет повышенную прочность)
# ЗНАЧЕНИЯ ИДУТ СТРОГО В ОДНУ СТРОКУ
# B	C
20;	1000;
# Скорость появления бонусов (в секундах) на карте
!BONUS
# TIMING - интервал появления бонусов на поле (в секундах)
# TIMELIFE - время видимости бонуса (в секундах)
# ЗНАЧЕНИЯ ИДУТ СТРОГО В ОДНУ СТРОКУ
# TIMING	TIMELIFE
10;		8;
# Лимит количества танков противника, находящегося на поле
!LIMIT
5
# Время (в секундах) до начала появления противника
!START
10
# Количество танков противников, их ТТХ и тайминг появления в точках респауна
# HOME - точка респауна
# TANK - модель танка XY, где X=0-3, Y=0-7:
#	Серии танков:
#	X=0 - золотая серия танков
#	X=1 - серебрянная серия танков
#	X=2 - зеленная серия танков
#	X=3 - малиновая серия танков
#	Типы танков:
#	Y=0 - малый танк
#	...
#	Y=7 - большой танк
# DIR - начальное направление движения N, S, E, W
# AI - модель поведения на поле:
#	RND - случаное перемещение по полю
#	KILL - нападение на игрока
#	FLAG - уничтожение флага
# TIMING - время задержки до появления следующего танка на поле (в секундах)
# HEALTH - очки жизни (рекомендуемые значение 1-100)
# SPEED - максимальная скорость (рекомендуемые значение 0.1-10) (точек за кадр)
# ACCEL - ускорение (рекомендуемые значение 0.1-3.0) (точек за кадр)
# RELOAD - скорость перезарядки (в секундах) (рекомендуемые значение 0.1-5)
# SHOT - скорость выстрела (рекомендуемые значение 8-15)
# DAMAGE - очки ущерба жизни противника (рекомендуемые значение 1-100)
# TEAM - команда (значение 0-9) - танки из одной команды не могут друг друга уничтожить
!COMPUTER
# ЗНАЧЕНИЯ ИДУТ СТРОГО В ОДНУ СТРОКУ
# HOME	TANK	DIR	AI	TIMING	HEALTH	SPEED	ACCEL	RELOAD	SHOT	DAMAGE	POINTS	TEAM
2,3,4;	11;	S;	KILL;	0;	100;	3;	0.25;	1.0;	8;	25;	200;	1;	Скоростной танк
2,3,4;	12;	S;	RND;	0;	100;	1;	0.25;	1.0;	8;	25;	200;	2;	Стандартный танк
2,3,4;	13;	S;	RND;	5;	100;	1;	0.25;	1.0;	8;	25;	200;	2;
2,3,4;	14;	S;	RND;	0;	100;	1;	0.25;	1.0;	8;	25;	200;	2;
2,3,4;	15;	S;	RND;	0;	100;	1;	0.25;	1.0;	8;	25;	200;	3;
2,3,4;	16;	S;	RND;	5;	100;	1;	0.25;	1.0;	8;	25;	200;	3;
2,3,4;	17;	S;	RND;	0;	100;	1;	0.25;	1.0;	8;	25;	200;	3;
2,3,4;	20;	S;	KILL;	0;	100;	1;	0.25;	1.0;	8;	25;	300;	4;
2,3,4;	21;	S;	KILL;	5;	100;	1;	0.25;	1.0;	8;	25;	300;	4;
2,3,4;	22;	S;	KILL;	0;	100;	1;	0.25;	1.0;	8;	25;	300;	4;
2,3,4;	23;	S;	KILL;	0;	100;	1;	0.25;	1.0;	8;	25;	300;	4;
2,3,4;	24;	S;	KILL;	5;	100;	1;	0.25;	0.75;	8;	25;	300;	5;
2,3,4;	25;	S;	KILL;	0;	100;	1;	0.25;	0.75;	8;	25;	300;	5;
2,3,4;	26;	S;	KILL;	0;	100;	1;	0.25;	0.75;	8;	25;	300;	5;
2,3,4;	27;	S;	FLAG;	5;	100;	1;	0.25;	0.75;	8;	25;	400;	5;
2,3,4;	30;	S;	FLAG;	0;	100;	1;	0.25;	0.75;	8;	25;	400;	6;
2,3,4;	31;	S;	FLAG;	0;	100;	1;	0.25;	0.5;	8;	25;	400;	6;
2,3,4;	32;	S;	FLAG;	5;	100;	1;	0.25;	0.5;	8;	25;	400;	6;
2,3,4;	33;	S;	FLAG;	0;	100;	1;	0.25;	0.25;	8;	25;	400;	7;
2,3,4;	34;	S;	KILL;	0;	1000;	2;	0.25;	0.20;	8;	100;	400;	7;	БОСС 1!!!
2,3,4;	35;	S;	KILL;	0;	1000;	2;	0.25;	0.15;	8;	100;	400;	8;	БОСС 2!!!
2,3,4;	36;	S;	KILL;	0;	1000;	2;	0.25;	0.10;	8;	100;	500;	8;	БОСС 3!!!
2,3,4;	37;	S;	KILL;	0;	1000;	2;	0.25;	0.05;	8;	100;	500;	9;	БОСС 4!!!
!PLAYERS
# ЗНАЧЕНИЯ ИДУТ СТРОГО В ОДНУ СТРОКУ
# HOME	TANK	DIR	LIVES	HEALTH	SPEED	ACCEL	RELOAD	SHOT	DAMAGE	POINTS	TEAM
0;	00	N;	9;	100;	5;	0.75;	0.5;	15;	30;	500;	0;	Игрок 1
1;	10	N;	9;	100;	5;	0.75;	0.5;	15;	30;	500;	0;	Игрок 2
								

Вопросы и ответы

Что делать, если игра не запускается после распаковки?

Решение очень простое: скорее всего, в вашей системе не установлены необходимые библиотеки для работы программ, написанных на C++. Вместе с игрой в ZIP-архиве идет файл vc_redist.x64.exe — это официальный распространяемый пакет Microsoft Visual C++ Runtime. Он абсолютно безопасен и необходим для того, чтобы игра могла корректно взаимодействовать с Windows.

  • Что делать: Просто запустите этот файл от имени администратора, пройдите короткий процесс установки и перезапустите игру. Всё заведется с пол-оборота!

Можно ли изменить уровни, текстуры или звуки в игре под себя?

Не просто можно, а нужно! Игра создавалась свободной от тяжелых фреймворков и лишних ограничений. Все ресурсы лежат на виду, поэтому вы вольны делать всё, что захотите: перерисовывайте спрайты танков, меняйте звуки выстрелов на свои аудиоэффекты, переписывайте конфигурации карт. Творите, экспериментируйте, развлекайтесь!

  • Маленький лайфхак: современные нейросети (ChatGPT, Midjourney, Claude, Gemini) прекрасно справляются с генерацией пиксель-арта и написанием кода для конфигов. ИИ просто обожают этот проект — скормите им структуру файлов игры, и они помогут вам создать ваш собственный уникальный мод за пару минут!

Классная игра, но я хочу запустить её на своем личном сервере маршрутизации (не путать с игровым сервером), а не на публичном. Это возможно?

Да, и я с радостью в этом помогу! Если вы хотите поднять приватный сервер для своей локальной сети, друзей или закрытого клуба, вам не нужно ничего взламывать. Напишите мне в личные сообщения (все актуальные контакты и ссылки на соцсети есть в подвале бокового меню моего сайта), и я с удовольствием поделюсь с вами серверной частью. Мне важно, чтобы проект жил и приносил пользу, так что не стесняйтесь — пишите, обсудим!

Планируется ли масштабное обновление, доработка или продолжение игры?

Изначально этот сетевой клон Battle City создавался как технологический полигон (бенчмарк). Мне нужно было сымитировать жесткую боевую нагрузку в реальном времени, чтобы протестировать, отпрофилировать и оптимизировать свой высоконагруженный веб-сервер HiHost и промышленный программно-аппаратный комплекс диспетчерской связи ДСГО.

Поскольку коммерческой цели не ставилось, глобальных планов по развитию игры у меня не было. Но всё зависит от вас! Если я увижу реальный интерес со стороны геймеров и IT-сообщества, мощный фидбек и запросы на новые фичи, я с удовольствием рассмотрю варианты развития проекта или просто выложу исходный код в открытый доступ на GitHub, чтобы мы могли развивать эти «Танчики» вместе.