February 23, 2025

Баланс билдов.

Техническая часть.

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

Ярко зелёным опорные распределения, мутно зелёным опорные билды при этих распределениях.

Сначала мы чего-то мыкались да пыкались, пробовали да тестили, и всё получалось неустойчиво со всякими сраными побочками. Характеристики уходили в отрицательные значения, небольшое изменение входа приводило к большому изменению выхода и т.д. Из неудачных попыток я помню только линейную регрессию, остальные нерабочие варианты благополучно забыл. В некоторый момент мы с пацанами додумались сделать визуальную модельку такой системы. Увидев это визуально, я воскликнул: «Ебать меня ржавым якорем! Да это же барицентрическая залупа!» И в тот же день задачка была успешно закрыта, реализация заняла несколько часов. Матчасть и вовсе несколько минут, львиная возня произошла с API гугл-табличек.

Чёрным опорные билды, красным искомый билд.

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

  1. Найти ближайшие опоры.
  2. Проинтерполироваться между ними.

Корокто про возню с API гугл-табличек:

Гуманитарная часть.

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

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