Сначала один вид, потом пять: как растёт эта игра 🪨
Кто заглянет в наш список версий, найдёт там 29 релизов за добрых пять недель: от 0.1.0 20 июня до 0.9.0 вчера. Как это получается? Уж точно не так, что мы садимся и строим готовую функцию за один грандиозный заход. Мы строим этапами: сначала самая маленькая версия, которая действительно работает, а потом, когда она стабильна и приносит радость, следующий этап. Лучше всего это сейчас показывают астероиды.
Этап 1: они вообще существуют. Когда в игре появились астероиды, значение имел один-единственный вопрос: работают ли посадка, ходьба и добыча на крошечном теле, которое можно обойти за пару минут? Астероид — это не маленькая планета: у него свой класс размера, другая гравитация, другой горизонт. Это и был этап 1, а всё остальное намеренно оставалось в стороне. Поэтому вид был ровно один: тип был прописан жёстко, и, поскольку у него не было списка возможных поверхностей, каждая колонна покрывалась кристаллами. Все астероиды во всей галактике выглядели одинаково. Различались только длина окружности и то, где случайно оказались кратеры.
Этап 2: теперь им можно различаться. Второй этап закончен со вчерашнего дня и попадёт в игру со следующим обновлением. Тогда появятся пять семейств астероидов, и каждая глыба выбирает своё по взвешенному случаю. Каменное — рабочая лошадка, в нём железо, силикат, медь и олово. Металлическое почти целиком из металла: везде титан, глубже кобальт, вольфрам и платина. Ледяное держит −95 °C и несёт вместо металлов летучие вещества: углерод, литий, серу. Углеродное чёрное как сажа, изрыто пещерами и прячет далеко внизу уран и алмаз. А кристаллическое, ровно такое, каким раньше был каждый астероид, теперь редкая находка. Вдобавок у каждого тела свой кратерный рельеф: плотность, ширина котловин, глубина, высота валов и то, насколько холмиста пыль между ними. Раньше это были пять фиксированных чисел на всю вселенную, поэтому все безвоздушные тела выглядели одинаково. Кстати, луны тоже выигрывают, потому что идут через тот же путь в коде.
Настоящая выгода приходит потом. Прелесть чисто построенного второго этапа в третьем: шестое семейство — это уже не работа программиста, а запись в файле данных: название, поверхности, руды, частота, готово. «Кому-то стоит это добавить» превратилось в «можно попробовать за один вечер». Вот почему перестройка того стоит.
Почему мы всегда делаем так. Три причины, и все мы выучили на горьком опыте. Первая: заранее не знаешь, будет ли идея весёлой. Небольшую первую версию можно опробовать с Justus за один вечер, а потом понятно, стоит ли развивать её дальше или идея была на самом деле скучной. Вторая: небольшой шаг можно проверить, протестировать и при необходимости откатить. Гигантскую функцию, которая лезет сразу в пятьдесят мест, можно только заговаривать молитвами. Третья, и самая важная для нас: в эту игру играют дети. Для них недоделанная гигантская функция хуже небольшой, которая надёжно работает.
Один и тот же образец везде. Сначала блоки были кубами; потом появились пандусы, лестницы и сферы, затем окрашивание, затем тонкие фаски на рёбрах, чтобы ничто больше не выглядело как картонная коробка. Планеты начинались как серый камень; потом пришли настоящие моря, пещерные системы, климат в зависимости от высоты и вулканы, затем замёрзшие моря на холодных мирах, а теперь астероиды. В детской безопасности сначала была только команда жалобы в чате, потом баны с причинами и тайм-аутами, а совсем недавно невидимый режим наблюдателя. А наши бандиты, только что выпущенные, сами ещё на этапе 1: они бьют вас через эффект близости, а не настоящими летящими снарядами. Это не недосмотр, а записано в плане: этап 2, когда этап 1 себя докажет.
Чего стоит такой способ работы. Честно, двух вещей. Во-первых, существующие миры меняются: так как тип небесного тела пересчитывается при каждой загрузке и никогда не сохраняется, астероиды в ваших старых мирах получат со следующим обновлением другие семейства и другой рельеф. Построенные вами блоки уцелеют, но могут вдруг повиснуть в воздухе или оказаться замурованными в камне. Поэтому такие вещи всегда попадают в примечания к релизу. Во-вторых, даже первый этап нужно строить так, чтобы второй вообще был возможен. Для астероидов это значит: теперь в коде ровно одно место, которое отвечает на вопрос «это астероид?», и тест, который для каждого сгенерированного семейства проверяет, что оно действительно так классифицируется. Пропусти хоть один вызов, и вернётся неприятная старая ошибка: камень, на котором нельзя добыть ни одного блока.
И снова нас выручили тесты. При создании новых семейств сработала давняя проверка: она убеждается, что в каждом мире с залежами руды можно добраться до рецепта кабеля. У трёх из пяти новых семейств просто не было меди, и игроки застряли бы там в развитии. Никто из людей этого не заметил, а тест, написанный кем-то несколько недель назад, заметил. Теперь во всех семействах есть медь и силикат.
Дальше будет ещё один такой этап, где-то между растениями, животными и бандитами. Какой именно, обычно решает Justus. 🌟
Комментарии