Дневник разработки #6: баланс сторон
Одна из трёх сторон в моей игре проигрывала другой 43 матча из 48. Я проверил пять причин, которые казались очевидными, и ни одна из них не сдвинула результат больше чем на одну победу. Эта часть про то, как я балансирую стороны с помощью ботов и чем закончилась эта история. Сразу оговорюсь: весь дизайн сторон сейчас черновой, названия, юниты и числа ещё будут меняться, и всё, о чём я рассказываю, это промежуточное состояние.

На концепте три стороны: слева AEGIS, в центре VARDEN, справа PACT.
Чем стороны отличаются
Я не хотел, чтобы стороны различались только ценой и силой юнитов, потому что тогда они играются одинаково. Поэтому у каждой есть свой «глагол». AEGIS видит и бьёт точно: у неё мало юнитов, они дорогие, долго строятся и живучие. PACT расползается и заменяет: у неё много дешёвых юнитов, она быстро строится и давит числом. VARDEN держит и давит: у неё медленная, но поздняя сила. Ещё я развёл стороны по времени матча: PACT силён в начале, AEGIS в середине, VARDEN в конце. Это тоже пока черновая формула, и как раз её я и проверяю на балансе.
Как проверяется баланс
Живых игроков для проверки баланса у меня нет, поэтому я играю ботами. Это те же боты, что я описывал в прошлой части, только в самом простом режиме, где они играют по правилам. Матч идёт без картинки, и пятнадцать минут игры считаются за несколько секунд. Для каждой пары сторон я играю 48 матчей: четыре зерна, шесть карт и обе расстановки. Во время матча игра каждые пять секунд записывает доход, стоимость армии и потери, и по этим записям потом можно разобрать, где именно сторона проигрывает. Матчи детерминированы, поэтому повторный прогон даёт те же числа, и для контроля я каждый раз гоняю пару сторон, которую не менял. Разницу меньше пяти матчей я считаю шумом.

На скриншоте база VARDEN в игре, бот обороняется. Здания и юниты пока заглушки, и такие матчи я смотрю в реплее с панелью мыслей.
Что пошло не так
После того как я перенёс числа юнитов из таблицы в данные игры, VARDEN перестала побеждать AEGIS: 0 побед из 48 и 43 поражения, а до переноса она проигрывала 17 матчей из 48. Против PACT картина была не лучше, 28 поражений из 48. Моя гипотеза была такой: VARDEN по замыслу медленная и поздняя, и её убивают раньше, чем её сила успевает проявиться.
Первое, что я проверил по записям, это не опаздывает ли VARDEN со стройкой. Нет: энергоблок, склад, казарма, завод и первые юниты появляются у неё с разницей в пять-десять секунд от AEGIS. Дело оказалось в окне между третьей и пятой минутой, когда проходят первые бои.

На графике стоимость армий по минутам в проигранных матчах. К третьей минуте у AEGIS армия уже заметно больше, а между четвёртой и пятой VARDEN теряет почти половину своей. Потом разрыв только растёт: к шестой минуте доход AEGIS почти вдвое выше, потому что у неё ресурсы возят четыре вертолёта, до которых юниты VARDEN не дотягиваются, а у VARDEN это два-три грузовика, которые легко убить. Самые дорогие юниты VARDEN до своей смерти не появляются вообще. За все 43 проигранных матча бот ни разу не построил Рубеж и Пресс, а Купол построил один раз: он просто не доживает до момента, когда они понадобятся.
Пять гипотез, которые не сработали
Я проверил пять очевидных объяснений, меняя данные по одному. Удешевил и ускорил энергоблок, вернул грузовику прежние цену и скорость, увеличил здоровье зданий VARDEN на пятьдесят процентов, поставил в список армии бота более тяжёлую машину и, наоборот, ослабил AEGIS. Результат был одинаков: ни одна правка не сдвинула число побед VARDEN над AEGIS больше чем на одну из 48. Некоторые из них сильно помогали против PACT, но с главной проблемой справиться не могли.
Тогда я пошёл другим путём и стал по очереди возвращать числа к исходным. Если вернуть прежние числа AEGIS, ничего не меняется. Если вернуть прежние числа VARDEN, она выигрывает у AEGIS 5 матчей, а у PACT 31. Значит, перекос создали именно числа VARDEN, и причина не в одной цифре, а в сумме. Если одновременно уменьшить время постройки, цену и увеличить урон и здоровье, VARDEN выигрывает у AEGIS 17 матчей, а если из этого набора убрать только урон, то всего 2. Урон оказался главным рычагом.
Умеренная правка
Самым сильным вариантом можно было бы просто сделать VARDEN выигрывающей, но тогда пропал бы замысел «медленная поздняя сила», и сторона стала бы просто ещё одним вариантом сильных юнитов. Поэтому я выбрал умеренную правку: боевым юнитам VARDEN я поднял урон и снизил цену, а здоровье и время постройки не трогал. Это девять юнитов. В первом проходе урон вырос в 1,2 раза, а цена упала до 0,9, во втором в 1,3 и 0,85 раза.

На графике результат. Против AEGIS победы VARDEN выросли с нуля до одной, а потом до шести из 48, против PACT с семи до пятнадцати, а потом до шестнадцати. Медиана времени поражения сдвинулась с 8,3 до 9,0 минут. Армия VARDEN к пятой минуте против AEGIS выросла с семи до двенадцати юнитов. Первый проход против AEGIS почти ничего не дал, ноль побед превратился в одну, и это шум. Второй проход уже заметен, но до равных шансов далеко: AEGIS по-прежнему выигрывает 32 матча из 48.
Что я пока не знаю
Во-первых, это боты на правилах, а не живые игроки и не нейросети, и с ними картина может отличаться. Во-вторых, 48 матчей на пару это немного, разница в пять матчей и меньше это шум. В-третьих, бот не строит Рубеж ни в одном матче, поэтому число для него я поменял, но на результат оно не влияет. И в-четвёртых, главный вопрос не решён: я не знаю, считать ли целью паритет с AEGIS в первые восемь-десять минут. Чтобы его получить, нужен пакет правок, в который входят здоровье и время постройки, и это уже меняет замысел стороны. Пока я остановился на умеренном варианте, а решение отложил до того, как увижу сторону в живых матчах.
Что дальше
Правки пока лежат в отдельной ветке и в основную версию игры не влиты. В следующей части расскажу про то, о чём я уже много раз писал картинками, но ещё не рассказывал: как юниты проходят путь от концепта до модели в игре.
