Серия «GeoConquest»

10

Почему в моей GPS-стратегии каждую неделю меняются правила

Серия GeoConquest

Когда я добавил в GeoConquest кланы, у игроков появилась общая территория. Это было важно: я изначально не хотел делить захваченные гексы между участниками.

Но довольно быстро стало понятно, что одной общей территории недостаточно.

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

Тогда я начал добавлять недельные события.

Каждую неделю игра предлагает кланам другую цель. Например:

  • больше двигаться;

  • захватывать нейтральные гексы;

  • отбирать территории у соперников;

  • замыкать большие петли;

  • помогать клану активностью;

  • участвовать в захвате новых мест.

В один период выгодно исследовать незнакомые районы, в другой — защищать уже захваченное, а в третий — искать соперников и отбирать их территорию.

Из-за этого одна и та же карта начинает играться по-разному.

Общая цель, но вклад каждого виден

Мне было важно не превратить событие в соревнование одного самого активного игрока.

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

В игре есть и ежедневные задания: зайти, оставить след, замкнуть петлю, захватить чужую территорию, написать в клановый чат.

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

Сначала я чуть не сломал недельную гонку

У первой версии была очень неприятная проблема.

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

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

Для игрока это выглядело бы так, будто правила поменяли посреди турнира.

Пришлось вынести всю ивентовую систему в постоянное хранилище: текущее событие, результаты участников, дату окончания и награды. Теперь перезапуск сервера не должен менять ход соревнования.

Награды должны влиять на игру

Победа в событии — это не просто цифра в таблице.

Лучшие кланы получают медали и место в истории соревнований, а участники — ресурсы, которые можно использовать дальше. В магазине появились предметы и усиления, поэтому недельная гонка постепенно стала связана с остальными системами игры.

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

Мне нравится, что это позволяет не балансировать одну-единственную стратегию навсегда. Клан не обязан всегда делать одно и то же: сегодня можно идти в дальнюю экспедицию, на следующей неделе — защищать границы, а потом устроить гонку за самые большие петли.

И, кажется, именно этого не хватало общей собственности.

Десять недель — десять способов играть

Сейчас в ротации десять ивентов. Это не десять вариантов одного и того же рейтинга: каждый из них заставляет клан по-другому смотреть на карту.

  1. Неделя захватов
    Нейтральный гекс приносит 1 очко, территория одиночного игрока — 2, территория другого клана — 3. Это универсальный режим, который постепенно подталкивает игроков от спокойной экспансии к конфликту.

  2. Неделя дуэлей
    Очки начисляются за выигранные состязания, а не за размер захваченной территории. Здесь важнее успешно отстоять или отвоевать конкретный участок, чем просто нарисовать огромную петлю.

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

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

  5. Неделя движения
    В зачёт идут подтверждённые переходы между гексами. Это самый прямой режим: клан соревнуется не за конкретную территорию, а за то, кто больше исследует карту ногами.

  6. Неделя усилений
    Очки дают только покупки «Усиления клана» — по 120 за каждую. Захваты и движение в этот момент не помогают рейтингу. Идея в том, чтобы на неделю превратить развитие самого клана в общую задачу.

  7. Неделя вторжений
    Считаются только гексы других игроков и кланов. Нейтральная территория ничего не приносит, поэтому приходится искать чужие границы и идти на прямое столкновение.

  8. Неделя сплочённости
    Каждый участник, который заработал хотя бы одно очко активности за день, приносит клану одно очко ивента. Повторная активность в тот же день уже не добавляет баллы. Так система поощряет не одного сверхактивного игрока, а участие всей команды.

  9. Неделя первооткрывателей
    В зачёт идут только захваты нейтральных гексов. Чужие территории не считаются. Этот режим нужен, чтобы игроки отправлялись в ещё не исследованные места, а новые кланы могли соревноваться не только там, где уже идёт война.

  10. Неделя покупок
    За каждый потраченный в магазине жетон клан получает одно очко. Засчитываются только покупки участников кланов, поэтому это уже не личное соревнование, а попытка всей команды договориться, как использовать общий ресурс.

Получается, что одна неделя просит идти дальше, другая — искать соперников, третья — строить большую территорию, а четвёртая — просто убедиться, что клан не состоит из одного активного человека.

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

А какой недельный режим вы бы добавили в такую игру?

Играть можно прямо в телефонном браузере: geo.juju.ru

Версия для Google Play уже находится в internal testing, доступ можно получить здесь.

Патчноуты и история разработки: https://t.me/GeoConquest

Показать полностью 4
11

Почему за одну прогулку в Петербурге моя GPS-стратегия давала больше земли, чем в Москве

Серия GeoConquest

В начале мая я взял раннюю версию GeoConquest с собой в отпуск в Петербург.

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

В Москве я протестировал эту механику и решил, что с сеткой всё в порядке.

Петербург довольно быстро доказал обратное.

Сначала я решил захватить город с теплохода

План казался прекрасным: сесть на прогулочный теплоход, проплыть по рекам и каналам и оставить за собой огромный след через центр Петербурга.

На практике всё закончилось примерно у первых мостов.

Под ними мой телефон начал терять GPS. В маршруте появились разрывы, а вскоре след оборвался окончательно. Надежду захватить половину города, лениво сидя на палубе, пришлось оставить.

попытка захватить Петербург с теплохода

попытка захватить Петербург с теплохода

На скриншоте ещё используется OpenStreetMap. На Яндекс Карты игра переехала значительно позже.

Зато этот кадр точно показывает возраст версии: он сделан 5 мая, примерно за неделю до одной из самых больших переделок всей игры.

Тогда я пошёл захватывать «Газпром»

Следующей целью стал Лахта Центр, где находится центральный офис «Газпрома».

Сначала я почти замкнул маршрут вокруг здания.

А ещё через несколько секунд Лахта Центр уже целиком находился внутри моей территории.

К сожалению, с тех пор перед публичным релизом я делал вайп, так что сейчас территория вновь свободная - your's for the taking! (а вообще в игре вайпов нет)

К сожалению, с тех пор перед публичным релизом я делал вайп, так что сейчас территория вновь свободная - your's for the taking! (а вообще в игре вайпов нет)

После этого я поднялся на экскурсии на 83-й и 86-й этажи. Получилась довольно полная программа посещения: сначала захватить небоскрёб на карте, затем посмотреть с него на город сверху.

Но именно во время петербургских прогулок я начал замечать странность.

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

Я хотел сделать гексы размером 30 метров

Первую географическую сетку я написал самостоятельно.

Внутри игры каждый гекс имел обычные координаты q,r. Я накладывал эту бесконечную сетку на проекцию карты и задавал клеткам фиксированный размер: 30 метров от одной плоской стороны до другой.

Звучит логично. Метр в Москве должен быть таким же метром в Петербурге, Африке или Австралии.

Но карта Земли не является самой Землёй.

Для отображения мира использовалась проекция Меркатора. Чем дальше от экватора, тем сильнее она растягивает поверхность на экране. Моя сетка оставалась одинаковой в координатах проекции, но её реальный размер на земле менялся вместе с широтой.

У экватора условный 30-метровый гекс действительно занимал примерно 30 метров.

В Москве его реальный размер уменьшался примерно до 17 метров.

В Петербурге — уже примерно до 15.

Получалось, что за одно и то же расстояние петербургский игрок мог пересечь примерно на 12% больше гексов, чем московский. А игроку ближе к экватору пришлось бы ходить почти вдвое больше.

География сломала игровой баланс

В GeoConquest количество гексов — не просто визуальная условность.

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

Петербург получал преимущество перед Москвой.

Москва получала огромное преимущество перед Сингапуром.

А на совсем высоких широтах сетка продолжала бы сжиматься ещё сильнее.

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

Нельзя делать всемирную стратегию, в которой сложность зависит от широты города.

Исправить одну формулу не получилось

Первой мыслью было просто компенсировать масштаб проекции через широту.

Но тогда начинали расползаться остальные части системы.

Клиент самостоятельно рассчитывал форму каждого гекса. Сервер хранил территории под идентификаторами вроде -7442,332795. По этим же координатам вычислялись соседи, расстояния, маршруты, видимая область и захваты.

Для отдаления карты я уже построил несколько уровней детализации: маленькие клетки объединялись в более крупные, чтобы показать территорию города, страны или континента.

Все эти системы предполагали, что мир является одной идеально регулярной плоской сеткой.

Можно было продолжать чинить её по частям. Добавить поправку на широту, отдельно исправить отрисовку, придумать новые правила для соседей и переделать уровни детализации.

Но чем дальше я смотрел, тем яснее становилось: проблема находилась в самой основе.

Выбор пал на H3

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

Она изначально предназначена для работы с глобальными координатами. Для любой точки можно получить идентификатор ячейки, её границы, соседей и родительскую клетку более крупного уровня.

Самое важное: размеры ячеек остаются сопоставимыми в разных частях планеты. Они не уменьшаются систематически при движении от экватора к полюсам только из-за проекции карты.

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

Заодно H3 уже имела готовую вложенность. Мелкие игровые ячейки можно объединять в более крупные родительские и показывать на разных уровнях масштаба.

Это заменяло значительную часть моей самодельной системы отображения мира.

А потом начался страшный рефакторинг

Перейти на H3 означало не поменять одну библиотеку, а заменить язык, на котором вся игра описывала карту.

У старого гекса были две числовые координаты: q и r.

У нового появился непрозрачный H3-идентификатор. Его границы больше нельзя было самостоятельно восстановить простой формулой на клиенте. Даже форма ячеек могла немного различаться, а среди обычных шестиугольников на планете существуют специальные пятиугольные ячейки.

Пришлось переделать почти всё:

  • преобразование GPS-координат в игровую клетку;

  • хранение территорий и следов;

  • поиск соседних гексов;

  • расчёт расстояния;

  • движение игроков и тестовых ботов;

  • заполнение области внутри маршрута;

  • отрисовку границ на клиенте;

  • загрузку территорий вокруг игрока;

  • уровни детализации на дальнем масштабе;

  • тесты, которые раньше оперировали координатами q,r.

Геометрию я перенёс на сервер. Теперь именно сервер сообщает клиенту центр и настоящие границы каждой ячейки, а клиент только отображает полученные данные.

Старую тестовую карту пришлось очистить: прежние идентификаторы территорий не имели честного взаимно однозначного соответствия новым H3-ячейкам.

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

Гексы стали немного менее красивыми, но игра — честнее

На идеальной плоской сетке каждый шестиугольник выглядит совершенно одинаково.

H3 покрывает не плоскость, а почти сферическую Землю. Поэтому ячейки могут быть слегка вытянутыми, а их форма и площадь не абсолютно идентичны по всей планете.

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

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

Через неделю после прогулки на теплоходе GeoConquest уже работала на H3.

Поэтому старые петербургские скриншоты для меня выглядят немного странно: на них ещё видна первая сетка, которая смогла пережить Москву, но не выдержала поездки в отпуск.

А вам что кажется важнее для игры на реальной карте: идеально одинаковая форма клеток на экране или максимально близкий физический размер по всему миру?


Играть можно прямо в телефонном браузере: https://geo.juju.ru

Версия для Google Play уже находится в internal testing, доступ можно получить здесь.

Патчноуты и история разработки: https://t.me/GeoConquest

Показать полностью 4
20

Я отменил личную собственность внутри кланов своей GPS-стратегии

Серия GeoConquest

В GeoConquest территория захватывается ногами: игрок идёт по настоящей карте, оставляет за собой след и пытается замкнуть его в петлю. Всё, что оказалось внутри, становится его территорией.

Но стоит вступить в клан, и вся эта земля перестаёт быть личной.

Не временно. Не только визуально. И не потому, что мне так было проще запрограммировать.

Я изначально задумывал кланы именно так.

В большинстве игр клан представляет собой группу отдельных игроков: у каждого остаются свои владения, ресурсы и достижения, а сверху добавляются общий тег, чат и бонусы.

В GeoConquest клан устроен скорее как муравьиная колония. На карте он становится единым организмом, а отдельные игроки теряют территориальную индивидуальность.

После вступления происходит несколько вещей:

  • вся ранее захваченная игроком земля переходит клану;

  • новые петли тоже захватывают территорию сразу для клана;

  • территория получает общий цвет и оформление;

  • участники могут начинать маршруты с общей земли;

  • союзники больше не перерезают следы друг друга.

На карте больше не хранится ответ на вопрос: «А какие именно гексы захватил лично я?»

Есть только земля клана.

Почему я не оставил каждому его участки

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

Мне хотелось обратного: чтобы вступление действительно меняло правила игры.

Один участник может расширять территорию на севере города, другой — защищать границу на юге, а третий вообще отправиться в другой регион. Все они работают на одного владельца карты.

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

А что происходит при выходе?

Земля не возвращается.

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

Если распустить сам клан, его территория становится нейтральной.

Это жёсткое правило, но именно поэтому выбор клана должен что-то значить. Вступление — не бесплатный бонус и не цветной значок возле ника. Игрок доверяет группе всё, что успел построить на карте.

Из этого, конечно, возникает неприятный вопрос: справедливо ли, что лидер может принять человека с большой территорией, а затем исключить его?

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

Общий след оказался сложнее общей земли

Передать гексы от игрока клану было относительно просто. Гораздо интереснее стало со следами.

Несколько участников могут одновременно идти в разных районах и даже странах. Формально их маршруты принадлежат одному клану, но перерезание одного маршрута не должно уничтожать все остальные независимые следы на планете.

Поэтому общий клановый след пришлось разделять на связанные части: один территориальный владелец, но несколько независимых активных маршрутов.

Так клан может действовать сразу в разных местах, не превращая любое локальное столкновение в глобальную катастрофу.

А потом появилась экспансия и новый способ жульничать

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

Тут быстро обнаружилась лазейка.

Можно было принять игрока с большой личной территорией и мгновенно получить огромный прирост, вообще не выходя на улицу.

Пришлось отдельно исключить такие передачи из результатов события. Земля всё равно становится клановой, но очки начисляются только за настоящее расширение территории во время соревнования.

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

И теперь мне особенно интересно: вы бы вступили в клан, зная, что вся ваша территория перестанет принадлежать лично вам?

И должно ли исключение из клана отличаться от добровольного выхода?

Играть можно прямо в браузере: https://geo.juju.ru


Патчноуты и история разработки: https://t.me/GeoConquest

Показать полностью 4
16

Пешком, на велосипеде или на машине: что считается честным в моей GPS-стратегии

Серия GeoConquest
Один из ранних скриншотов. Слабый GPS мог оставлять разрывы в маршруте даже у честного игрока.

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

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

Из этого правила довольно быстро возникает очевидный вопрос: а что мешает сесть в машину и за вечер захватить половину города?

Как оказалось, гораздо более сложный вопрос звучит иначе: как ограничить машину, но не сломать игру велосипедистам, самокатчикам и обычным пешеходам с плохим GPS?

2783 гекса за одну телепортацию

4 июня один из игроков внезапно переместился на 45 километров.

Игра решила, что всё это расстояние он действительно прошёл. Маршрут склеился, сервер засчитал 2783 гекса, выдал 5566 опыта, и игрок мгновенно поднялся с первого уровня до двенадцатого.

Опыт я у него отбирать не стал. Посчитал это наградой за обнаружение бага.

А вот выдачу опыта и построение маршрута при таких скачках пришлось срочно исправлять.

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

Первые правила были слишком добрыми

В одной из самых ранних версий античита я разрешил скорость до 151 км/ч.

Это не опечатка.

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

Потом ограничение стало жёстче. Но просто выбрать одно число оказалось недостаточно.

GPS может на несколько секунд показать странную скорость, когда человек стоит на месте. Телефон иногда присылает координаты с задержкой. В браузере и Android-приложении скорость могла рассчитываться по-разному. А велосипедист проходит гексы значительно быстрее пешехода, поэтому именно на велосипеде первыми проявляются ошибки, незаметные во время спокойной прогулки.

Телефон не знает, на чём вы едете

В GeoConquest нет отдельных режимов «пешком», «велосипед», «самокат» и «машина».

Сервер получает координаты, время, точность и иногда скорость. Но сам по себе GPS не может надёжно сказать, сидит человек в автомобиле или быстро едет на велосипеде.

При скорости 20 км/ч это может быть:

  • спринтер;

  • велосипедист;

  • электросамокат;

  • машина в пробке;

  • ошибочный скачок GPS.

Можно было запретить всё, что быстрее бега. Тогда игра действительно стала бы почти исключительно пешеходной, но заодно начала бы наказывать велосипедистов и ловить больше ложных срабатываний.

Поэтому я решил разрешить активный транспорт, пока скорость остаётся разумной.

Как ограничение работает сейчас

Текущий порог составляет 8 метров в секунду, то есть примерно 29 км/ч.

После четырёх последовательных качественных замеров на такой скорости сервер приостанавливает игровой зачёт.

При этом маркер не застывает на старом месте и продолжает двигаться по карте. Но игра временно не строит след, не выдаёт опыт, не продвигает задания и события, не засчитывает столкновения и не позволяет захватывать территорию.

Сервер смотрит не только на скорость, которую сообщил телефон. Он также вычисляет её по расстоянию между координатами и времени замеров. "Никогда не доверяй клиенту!"))

Чтобы игра снова включилась, нужно замедлиться примерно до 22 км/ч. Сервер ждёт, пока медленными окажутся как минимум восемь из последних десяти подходящих замеров. Несколько случайных скачков при этом не заставят стоять на месте бесконечно.

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

Значит, на машине играть совсем невозможно?

Не совсем.

Если автомобиль действительно движется со скоростью велосипеда, например ползёт в пробке, GPS не способен доказать, что внутри находится машина. Такой участок может засчитаться.

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

Высокая скорость сама по себе также не считается читерством и не приводит к бану. Игра просто ставит зачёт на паузу.

Велосипедисты нашли другую проблему

Недавно обнаружился ещё один баг, который существовал больше месяца.

Браузер отправлял новую GPS-точку, но иногда ждал не только ответа сервера, а ещё и очередного обновления всего игрового мира. Если обработка затягивалась, следующие координаты успевали потеряться.

Пешеход проходил за это время совсем немного, поэтому проблема почти не бросалась в глаза. А у велосипедиста между двумя принятыми точками уже образовывалась заметная дыра в маршруте.

19 июля я разделил эти процессы. Теперь отправка GPS не ждёт обновления карты, и быстрые последовательные точки не должны теряться из-за медленного запроса.

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

А телефон всё это время лежит в кармане

Для установленной PWA-версии я добавил карманный режим. Он блокирует случайные нажатия, затемняет OLED-экран и позволяет убрать телефон, пока игра продолжает получать GPS.

Сyberpunk тема

Сyberpunk тема

Это особенно полезно во время долгой прогулки или поездки на велосипеде: не нужно постоянно держать карту открытой перед глазами. Чтобы разблокировать экран, кнопку надо удерживать две секунды.

Где провести границу?

Сейчас GeoConquest позволяет спокойно играть пешком, на обычной скорости велосипеда или электросамоката. При более быстром движении карта продолжает следовать за игроком, но территория и награды временно не засчитываются.

Мне интересно, где вы сами провели бы границу.

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

Играть: https://geo.juju.ru
Патчноуты и история разработки: https://t.me/GeoConquest

Показать полностью 2
7

Я добавил в игру пять тем и получил десять локализаций

Серия GeoConquest

В первом посте я рассказывал, как делаю GeoConquest — GPS-стратегию про захват реальной карты.

Сегодня расскажу про менее фундаментальную, но неожиданно разросшуюся часть проекта: темы интерфейса.

С самого начала я представлял игру то в духе бандитских районов, то в духе фентези с замками, оно как-то не имела единой темы. И в какой-то момент я подумал - а почему бы не натянуть на одну и ту же механику разные темы? И каждый игрок сам сможет выбирать то, что ему по вкусу!

Потом к оформлению добавилась собственная терминология. А когда игра получила русский и английский языки, получилось пять визуальных миров и десять комбинаций локализации.

Всё началось с попытки оживить интерфейс

Первая версия GeoConquest выглядела как обычная серая веб-страница поверх карты. Она работала, но совсем не ощущалась мобильной игрой.

Я начал перебирать разные направления: светлый современный интерфейс, фантастику, киберпанк, научную фантастику и несколько более экспериментальных вариантов.

Один из ранних дизайн-листов. Не все показанные варианты дошли до работающей игры.

Один из ранних дизайн-листов. Не все показанные варианты дошли до работающей игры.

Некоторое время существовала ещё тема Arcade, но я её удалил: она плохо отличалась от остальных и не давала игре достаточно самостоятельного характера.

В результате осталось четыре темы: Modern, Cyberpunk, Fantasy и Sci-Fi.

Пятая появилась позже. Один из моих первых плейтестеров попросил: "Мне бы хотелось играть в игру чисто семьёй, жену позвать, дочку, без всяких левых людей в клане". И я подумал - "семья? отлично!" И 31 мая сделал тему Mafia «по запросу одного Дона».

Пять вариантов одной игры

Сейчас тему можно в любой момент поменять в настройках. Механика и состояние аккаунта при этом остаются прежними.

Ниже один и тот же актуальный экран во всех пяти вариантах.

Modern, Cyberpunk, Fantasy, Sci-Fi и Mafia. Один экран, одинаковые настройки и разные визуальные правила.

Modern получилась светлой и нейтральной. Cyberpunk использует неоновые акценты и фиолетовые панели. Fantasy — более тёплые цвета и шрифты с засечками. Sci-Fi строится вокруг холодных сине-зелёных оттенков. Mafia получила почти чёрный фон, тонкие золотые линии, красные акценты и собственную типографику.

Но довольно быстро выяснилось, что одной перекраски недостаточно.

Клан, гильдия, альянс, банда и семья

Слово «клан» нормально работает в нейтральном интерфейсе. В Fantasy оно уже звучит не так естественно, а Mafia вообще родилась из другого названия для клана.

Поэтому темы начали менять не только внешний вид, но и язык игры.

В Modern всё называется буквально: клан, лидер, влияние, магазин и жетоны.

В Sci-Fi:

  • клан становится Альянсом;

  • лидер — Командором;

  • влияние — Авторитетом;

  • чат — Связью;

  • магазин — Снабжением;

  • жетоны — кредитами;

  • характеристики превращаются в Огневую мощь, Щиты, Терраформинг, Импульс и Добычу.

В Fantasy:

  • игрок вступает в Гильдию;

  • руководит ей Глава гильдии;

  • влияние становится Славой;

  • чат превращается в Зал гильдии;

  • магазин — в Лавку;

  • жетоны — в кроны;

  • первое обучение называется Первым квестом.

В Cyberpunk:

  • клан становится Бандой;

  • лидер — Боссом;

  • влияние — Репутацией;

  • чат — Закрытым каналом;

  • магазин — Чёрным рынком;

  • жетоны — эдди;

  • характеристики называются Взлом, Фаервол, Экспансия, Оверклок и Кредпоток.

Mafia ушла в тематическую лексику дальше остальных:

  • клан — Семья;

  • лидер — Дон;

  • влияние — Уважение;

  • участники — подручные;

  • чат — Задняя комната;

  • магазин — Подполье;

  • жетоны — наличка;

  • характеристики — Нажим, Омерта, Захват, Хватка и Жила;

  • стартовое обучение — Первое дело.

Даже сообщение о плохом GPS зависит от выбранного мира. Обычная игра временно останавливает движение, Sci-Fi — операцию, Fantasy — поход, Cyberpunk — рейд, а Mafia — дело.

Один экран недостаточно просто перекрасить

Некоторые интерфейсы содержат много текста, таблицы, награды, таймеры и длинные названия. Для них тема влияет не только на атмосферу, но и на читаемость.

Один и тот же клановый рейтинг в Modern и Cyberpunk.

Один и тот же клановый рейтинг в Modern и Cyberpunk.

Один и тот же клановый рейтинг в Modern и Cyberpunk.

Один и тот же клановый рейтинг в Modern и Cyberpunk.

Приходилось отдельно проверять контраст, активные вкладки, таблицы, медали, выделение собственного клана и состояние кнопок.

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

Поэтому новая функция теперь проверяется не только на русском и английском, но и на тематических словарях.

Технически я не храню десять полных независимых переводов. Есть базовая русская и английская локализация, а каждая тема переопределяет только нужные ей термины. Если специального варианта нет, игра берёт нейтральный текст.

Иначе любое исправление опечатки пришлось бы повторять десять раз.

Mafia началась с шутки, а стала отдельным миром

Когда я добавлял Mafia, быстро стало понятно, что заменить слово «клан» на «семью» недостаточно.

Появились Дон, Советник, Капо и Подручный. Профиль клана превратился в досье, внутреннее сообщение — в слово для своих, а системные события стали делами семьи.

Клановый чат в Mafia называется Задней комнатой.

Клановый чат в Mafia называется Задней комнатой.

Магазин тоже пришлось переписать. Усиление атаки стало Нажимом, защита — Омертой, дополнительный шанс при нападении — Своим человеком, защита от него — Алиби, а косметическое украшение ника — Визиткой.

Подполье с тематическими названиями предметов.

Подполье с тематическими названиями предметов.

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

А тёмная карта — это ещё одна настройка

Позже игроки попросили тёмную карту. Я не стал делать её отдельной шестой темой.

Карта и интерфейс переключаются независимо: можно оставить Modern и затемнить саму карту или включить светлые тайлы вместе с Cyberpunk, Sci-Fi либо Mafia.

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

Что получилось

Темы не дают игровых преимуществ и не меняют механику. Это пять способов воспринимать один и тот же мир.

Кому-то ближе нейтральная стратегия. Кто-то хочет командовать Альянсом, собирать Гильдию, возглавлять Банду или стать Доном Семьи.

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

Какая тема выглядит лучше всего? И какой сеттинг сюда ещё мог бы подойти, не дублируя существующие?

Впереди тёплые выходные без дождей, наконец-то! Присоединяйтесь к захвату территорий ;)

Играть: https://geo.juju.ru

Патчноуты и заметки разработки: https://t.me/GeoConquest

Показать полностью 10
83

Я сделал игру, в которой можно захватить собственный двор1

Серия GeoConquest

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

Именно такую игру я начал делать в апреле.

Она называется GeoConquest. В ней реальная карта становится одним большим игровым полем, а вместо виртуальных армий по нему ходят сами игроки.

Так сейчас выглядит часть общей карты: территории принадлежат разным игрокам и кланам.

Так сейчас выглядит часть общей карты: территории принадлежат разным игрокам и кланам.

Начиналось всё несколько скромнее

11 апреля я впервые открыл работающую версию игры в браузере.

Выглядела она тогда так:

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

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

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

Если вернуться на свою территорию и замкнуть маршрут, след превращается в постоянную границу. Всё, что оказалось внутри петли, можно захватить.

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

В плане механики захвата я изначально рефался на paper.io, хотя дальше система претерпела множество изменений.

Базовый захват: игрок выходит со своей земли, прокладывает след и возвращается обратно. Отрезанная область становится территорией.

Базовый захват: игрок выходит со своей земли, прокладывает след и возвращается обратно. Отрезанная область становится территорией.

Но сначала нужно было выйти на улицу

Поначалу я проверял перемещение кнопками разработчика.

Это удобно: сидишь за компьютером, передвигаешь игрока по карте и смотришь, правильно ли создаётся след и закрашивается территория.

Но игра про ходьбу, которую тестируют кнопками, всё-таки остаётся немного теоретической.

26 апреля я наконец нормально запустил её на телефоне и пошёл гулять. Вышел со стартовой территории, прошёл небольшой круг и вернулся обратно. Маршрут замкнулся, а участок действительно закрасился.

Технически на экране появилось всего несколько маленьких многоугольников. Но впервые они возникли не из-за отладочных кнопок, а потому, что я физически прошёл этот маршрут.

Игра внезапно стала настоящей.

Так выглядел один из ранних экранов с результатами захвата. Саму первую прогулку я, увы, нормальным скриншотом не задокументировал.

Так выглядел один из ранних экранов с результатами захвата. Саму первую прогулку я, увы, нормальным скриншотом не задокументировал.

Как неправильно поделить Землю

Вся карта GeoConquest состоит из шестиугольных ячеек — гексов. Но нынешняя система появилась не сразу.

Первую сетку я сделал самостоятельно. В Москве всё выглядело нормально, пока я не поехал в отпуск в Петербург и не обнаружил, что там играть становится проще и выгоднее.

Из-за широты размер ячеек менялся. Чем севернее находился игрок, тем меньше становились гексы (метров на диаметр). За одно и то же пройденное расстояние в Петербурге можно было захватить больше гексов, чем в Москве.

География неожиданно вмешалась в игровой баланс. Я же изначально задумывал worldwide-игру!

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

В итоге мучения закончились одним из самых больших и страшных рефакторингов проекта. Я перевёл игру на географическую систему H3 и фактически заново поделил на гексы весь игровой мир.

Внешне поменялись только шестиугольники (они стали... едва заметно искривлёнными). Внутри пришлось переделывать координаты, движение, маршруты, захваты, хранение территорий и отображение карты на разных масштабах.

После перехода я включил тестовых ботов. Машка и Alex долго ходили по карте, захватывали территории и пересекались, а я наблюдал, как новая сетка ведёт себя без ручного передвижения каждого игрока.

Машка и Alex — тестовые боты. Я оставлял их ходить по карте и смотрел, как они захватывают землю и взаимодействуют друг с другом.

Машка и Alex — тестовые боты. Я оставлял их ходить по карте и смотрел, как они захватывают землю и взаимодействуют друг с другом.

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

Когда появились живые игроки

Постепенно в игре появились уровни и характеристики, задания, колонии, столкновения, недельные события и кланы.

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

Самое интересное началось именно с появлением настоящих людей.

Один игрок захватил столько земли, что пришлось менять экономику опыта. Клан построил настолько длинную и тонкую территорию, что один из алгоритмов мог подвесить весь сервер больше чем на 20 секунд.

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

Простое правило «обошёл участок и замкнул петлю» осталось простым только для игрока. Серверу приходится разбираться в разветвлённых маршрутах, внутренних карманах, атаках, GPS-скачках и коллективной собственности.

Об этих историях я тоже постепенно расскажу.

GeoConquest уже работает в браузере и устанавливается на телефон как PWA:

Играть: https://geo.juju.ru

Патчноуты и короткие заметки разработки:

Telegram: https://t.me/GeoConquest

Буду рад посмотреть, какие территории построят пикабушники. Особенно те, к которым мой сервер пока морально не готов.

Показать полностью 5
Отличная работа, все прочитано!

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества

Недвижимость и ремонт

Теги

Популярные авторы

Сообщества