Битва стран · Battle of Nations
Браузерная игра-симуляция: карта из флагов, страны (штаты, регионы) по очереди нападают на соседей, бросают кубики, и победитель забирает землю проигравшего, пока не останется один чемпион.
Играть: https://baseva.github.io/bitva-stran/
Карты
Мир, Европа, Азия, Африка, Америка, штаты США, регионы России. Карта выбирается в панели, язык переключается кнопкой EN/RU.
Правила
- Атакующий выбирается случайно, защитник — сосед: сухопутная граница или реальное морское соседство.
- Каждая сторона бросает 3 кубика. Кубики сортируются и сравниваются попарно, разница идёт в очки тому, у кого кубик больше.
- Очки умножаются на множитель от населения (для мира — ×1.1 от 10 млн до ×1.5 от 1 млрд, для штатов и регионов — по квантилям своей карты). При ничьей защитник устоял.
- Победитель получает землю и половину населения побеждённого. Флаг растягивается на всю его территорию.
- Столицы. ★ отмечает столицы империй. Когда империя падает, с шансом 20% до двух её провинций обретают независимость.
- Восстания. После хода с шансом 4% захваченная страна возвращает свои земли.
- Союзы. Соседи заключают союз на 12 ходов: не нападают друг на друга и дают +1 очко в обороне. Иногда союзник предаёт.
- События (10% перед ходом): чума, бэби-бум, золотая лихорадка (+1 очко), засуха (пропуск атаки), революция.
Режимы
- Игра за страну. Нажмите на страну → «Играть за…». Каждый 3-й ход вы выбираете цель и тактику: 🛡 осторожно (очки ×0.8, при поражении — отступление), 🎲 обычно, 🔥 всё на кон (4 кубика, лучшие 3, +0.2 к множителю).
- Мультиплеер 👥. Создайте комнату и отправьте ссылку: друзья выбирают свои страны и ходят за них. Соединение — WebRTC через PeerJS, хост ведёт игру.
- Ставка 🎯 на победителя эпизода, статистика угаданных ставок.
- Таймлапс и итоги в конце эпизода: расширение империй, топ-5 по пику территории, камбэки, разгромы.
- 9:16 🎬 — вертикальный режим с записью видео прямо из браузера (Chrome/Edge).
- Музыка 🎵 — генерируется на лету, темп растёт к финалу.
- Автосохранение, ссылка с «зерном» эпизода для повтора, статистика по каждой карте.
Рендер серий в MP4
Скрипт прогоняет эпизоды в headless Chrome и собирает вертикальные ролики 1080×1920 с музыкой, звуками, озвучкой диктора и обложкой.
node render/render.mjs --map europe --episodes 3 --speed 3
Параметры: --map world|europe|asia|africa|americas|usa|russia, --lang ru|en, --seed, --ep (номер первого эпизода), --out (папка), --no-voice, --chrome (путь к Chrome), --scale (1.5 = кадр 1080×1920).
Нужны Node 22+, ffmpeg и для голоса py -m pip install edge-tts.
Используемые API и данные
| Что | Источник |
|---|
| Контуры стран и штатов | world-atlas, us-atlas (TopoJSON) |
| Контуры регионов России | click_that_hood, упрощено в data/russia-regions.topo.json |
| Население стран | World Bank API |
| Штаты и регионы: население, названия, флаги | Wikidata SPARQL + Wikimedia Commons |
| Континенты | countries-list |
| Коды ISO 3166 | i18n-iso-countries |
| Флаги стран | flagcdn.com |
| Кубики | random.org, запасной — Web Crypto |
| Справка о стране | Wikipedia REST API |
| Мультиплеер | PeerJS (WebRTC) |
| Названия, звук, голос, запись | Intl.DisplayNames, Web Audio, Web Speech, Screen Capture + MediaRecorder |
Запуск локально
node serve.mjs
Затем откройте http://localhost:5178. Сборка не нужна: игра в одном файле index.html.