· 1 мин

Мета-прогрессия в рогалике: как сбалансировать прокачку между забегами

Мета-прогрессия в рогалике - это прокачка, которая сохраняется после смерти: валюта и апгрейды между забегами. Чтобы она не сделала игру лёгкой, цену апгрейдов поднимают на 20-30% за покупку, ставят потолок и дают рычаг сложности с наградой. Проверить кривую можно симуляцией: если на первой победе мета даёт больше ~20% силы, её пора резать.

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

Мета-прогрессия в рогалике: как сбалансировать прокачку между забегами
В статье · 8 разделовразвернуть

Мета-прогрессия в рогалике - это прокачка, которая переживает смерть персонажа: валюта, апгрейды и открытия, накопленные между забегами. Она держит игрока после десятого проигрыша, но легко ломает баланс: если мета растёт быстрее навыка, к 50-му забегу игра проходит себя сама. Проверить это можно до плейтеста, симуляцией на 60 строк Python, которую пишет ИИ-агент.

Я делаю DnD-бота с ИИ-мастером, по сути текстовую RPG, и на нём уже наступал на грабли прогрессии: опыт копился, а уровень не рос, бой против "среднего" противника оказывался вдвое смертельнее смертельного. Поэтому ниже не пересказ чужих разборов, а один сквозной пример - условный рогалик на 10 этажей с боссом в конце, - три схемы прокачки и цифры, которые выдала симуляция.

Что такое мета-прогрессия в рогаликах?

Мета-прогрессия - это система постоянных улучшений, которые сохраняются после смерти и между забегами в roguelite-играх. Игрок приносит из забега валюту (золото, Darkness, клетки) и тратит её на апгрейды: здоровье, урон, новое оружие, новые классы. В отличие от прокачки внутри забега, она не обнуляется и копится весь срок жизни игры.

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

ИграЧто копится между забегамиЧем сдерживают ростИсточник
Rogue Legacy 2золото → апгрейды поместья, новые классыкаждая покупка дорожает все остальные; Харон забирает остаток золота на входе в замокобсуждение в Steam, Prima Games
Hades (релиз 17.09.2020)Darkness → Зеркало НочиПакт наказания: 15 модификаторов, лёгкие дают +1 к Heat, тяжёлые +2; награды следующего уровня жара - только после победы на текущемKotaku, Wikipedia
Dead Cellsклетки → чертежи оружия и мутаций5 Boss Stem Cells: на 4-й фляги в переходах пропадают совсем, зато клетки с врагов идут x3Dead Cells Wiki
Slay the Spireоткрытия карт и реликвий, уровни Ascensionбаланс по метрикам с сервера и еженедельные патчи в раннем доступеGDC 2019
Мой DnD-бот (2026)опыт → уровень персонажауровень не растёт сам: опыт копится, игрок жмёт левелап рукамисвоя документация, QA_43 от 17.06.2026

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

Мета-прогрессия или навык: что должно расти быстрее?

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

В сквозном примере у меня две силы. Навык игрока растёт по кривой обучения: новичок играет на 0,4, опытный приближается к 1,0. Мета добавляет к этому числу фиксированный шаг за каждую покупку. Сложность этажей растёт линейно от 0,545 на первом до 0,95 на десятом. Шанс пройти этаж - логистическая кривая от разницы между силой и сложностью.

Самая частая ошибка - линейная мета на линейной сложности. Каждый забег приносит валюты больше прошлого (ты проходишь дальше), апгрейды почти не дорожают, и в какой-то момент сила персонажа просто перерастает сложность. Ровно это и показала симуляция ниже.

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

Сбалансировать прокачку значит ограничить вклад меты в силу персонажа: поднимать цену каждого следующего апгрейда, ставить потолок на число покупок и давать рычаг сложности с повышенной наградой. Проверочное число простое - сколько процентов силы на момент первой победы дала мета. Выше примерно 20% - игру проходит прокачка, а не игрок.

Рабочие приёмы, которые я бы взял в свой рогалик:

  1. Растущая цена. Каждая покупка дороже прошлой на 20-30%, как в Rogue Legacy 2, где апгрейд брони поднимает цену и здоровья, и атаки.
  2. Потолок. 10-15 уровней на апгрейд силы. Дальше - только открытия "вширь": новое оружие, классы, режимы. Они добавляют разнообразия, но не силы.
  3. Рычаг сложности с наградой. Как Boss Stem Cells в Dead Cells: усложнил - получил x2 или x3 валюты. Опытный игрок сам снимает лишнюю силу.
  4. Сгорающая валюта. Харон в Rogue Legacy 2 забирает всё непотраченное: копить на "один большой апгрейд потом" не выходит, выбор делаешь каждый забег.

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

Как проверить кривую прогрессии симуляцией до плейтеста?

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

Скрипт написал ИИ-агент по моему описанию сквозного примера. Вот он целиком, Python 3.10, без зависимостей:

import math, random, statistics
 
FLOORS = 10          # этажей в забеге, на 10-м босс
RUNS = 60            # забегов на одного игрока
PLAYERS = 2000       # виртуальных игроков
 
def skill(n):        # кривая обучения: новичок 0.4, опытный ~1.0
    return 1.0 - 0.6 * math.exp(-n / 15)
 
def survive(power, floor):   # шанс пройти этаж
    difficulty = 0.5 + 0.045 * floor
    return 1 / (1 + math.exp(-8 * (power - difficulty)))
 
def play(meta, n, rng):
    power = skill(n) + meta
    for f in range(1, FLOORS + 1):
        if rng.random() > survive(power, f):
            return f - 1
    return FLOORS
 
def simulate(step, growth, base=40, cap=None, seed=1):
    rng = random.Random(seed)
    first_wins, early, late, carried = [], [], [], []
    for _ in range(PLAYERS):
        gold, bought, meta, first = 0, 0, 0.0, None
        for n in range(RUNS):
            floors = play(meta, n, rng)
            win = floors == FLOORS
            if n < 10: early.append(win)
            if n >= 50: late.append(win)
            if win and first is None:
                first = n + 1
                carried.append(meta / (skill(n) + meta))  # доля меты в силе
            gold += floors * 10
            while (cap is None or bought < cap) and gold >= base * growth ** bought:
                gold -= base * growth ** bought
                bought += 1
                meta += step
        first_wins.append(first or RUNS + 1)
    return {
        "медиана 1-й победы": statistics.median(first_wins),
        "побед в забегах 1-10, %": round(100 * sum(early) / len(early), 1),
        "побед в забегах 51-60, %": round(100 * sum(late) / len(late), 1),
        "доля меты в силе на 1-й победе, %": round(100 * statistics.mean(carried or [0]), 1),
    }
 
for name, kw in [
    ("без меты", dict(step=0.0, growth=1.0)),
    ("щедрая: +0.03, цена x1.10", dict(step=0.03, growth=1.10)),
    ("сдержанная: +0.02, цена x1.30, кап 12", dict(step=0.02, growth=1.30, cap=12)),
]:
    print(name, simulate(**kw))

Вывод прогона (seed=1, 16.10.2026), свёл в таблицу:

Схема метыМедиана первой победыПобед в забегах 1-10Побед в забегах 51-60Доля меты в силе на первой победе
Без меты38-й забег0%13,0%0%
Щедрая: +0,03 за покупку, цена x1,1020-й забег0%99,3%21,5%
Сдержанная: +0,02, цена x1,30, потолок 1225-й забег0%69,3%12,4%

Что тут видно. Без меты игра жестокая: половина виртуальных игроков ждёт первую победу до 38-го забега, а опытный выигрывает каждый восьмой раз. Живой человек вряд ли столько вытерпит. Щедрая мета вдвое ускоряет первую победу, но к 51-60-му забегу выигрываются 99,3% забегов, и пятая часть силы на первой победе - чистая прокачка. Игра решена, дальше играть незачем. Сдержанная схема даёт первую победу на 25-м забеге и оставляет опытному игроку 69,3% побед: вызов остался, гринд не нужен.

Мой вывод-граница: если на первой победе мета даёт больше ~20% силы, а опытный игрок выигрывает больше 90% забегов, прокачку пора резать. Цифры условные, модель грубая, но порядок расхождения между схемами - в разы, а не в проценты. Такое видно и на грубой модели.

Как я проверял баланс в DnD-боте до живых игроков

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

Сломалось оно на конкретном случае. Тестер с персонажем 5-го уровня встретил четырёх лютоволков (CR 1, по 200 XP). Балансер насчитал скорректированный опыт 1600 и счёл бой просто "смертельным", потому что не учитывал штраф за маленькую группу. С поправкой на соло-игрока множитель вырастает до x2,5, и выходит 4 x 200 x 2,5 = 2000 XP при пороге "смертельно" для соло 5-го уровня в 1100. То есть почти вдвое смертельнее смертельного, почти гарантированный вайп.

Дальше вылезло веселее. Выбор сложности боя был взвешенным рандомом 20/50/25/5 (лёгкий/средний/тяжёлый/смертельный) и вызывался без аргументов. А нарратор-LLM в 2 боях из 3 вообще обходил балансер: сам дописывал в состояние боя врагов с HP 11 и AC 12, которых никто не считал. Канал, через который он это делал (combat_state_update), в итоге выпилили, и все бои пошли через init_combat → balance_encounter.

С прогрессией тоже было. На первом плейтесте у 5 из 7 тестеров опыт был выше порога уровня, а уровень не менялся: у одного персонажа 6700 XP при 1-м уровне, хотя по таблице положен 5-й и выше. Потом автоматический левелап убрали совсем: опыт копится, игрок жмёт повышение сам. Проверка 17.06.2026: фикстура на 1-м уровне с 300 XP, после хода level=1 и pending_level_up=true.

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

Пошагово: как проверить баланс мета-прогрессии с ИИ-агентом

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

  1. Опиши сквозной пример числами: сколько этажей, как растёт сложность, сколько валюты даёт этаж.
  2. Задай кривую навыка игрока. Если данных нет, бери экспоненту обучения, как в скрипте выше, и честно помечай, что это допущение.
  3. Опиши 2-3 схемы меты: шаг силы, рост цены, потолок.
  4. Попроси агента посчитать три метрики: медиану первой победы, процент побед опытного игрока, долю меты в силе на первой победе.
  5. Прогони, поменяй один параметр, прогони снова. Фиксируй seed, иначе будешь сравнивать шум.
  6. Выбери схему и только потом зови живых тестеров: они проверят то, что модель не умеет, - интересно ли вообще играть.

Промпт, с которого я бы начал:

ПромптСимуляция мета-прогрессии
Напиши на Python без зависимостей Монте-Карло симуляцию рогалика.
Забег: [N] этажей, сложность этажа растёт [как]. Шанс пройти этаж -
логистическая функция от (сила игрока - сложность этажа).
Сила игрока = навык (растёт с номером забега по кривой обучения) + мета.
Валюта за забег: [X] за каждый пройденный этаж.
Схемы меты для сравнения: [шаг силы, рост цены, потолок] x 3.
Прогони 2000 игроков по 60 забегов, seed фиксированный.
Выведи для каждой схемы: медиану первой победы, % побед в забегах 1-10
и 51-60, среднюю долю меты в силе на момент первой победы.
подставь числа своей игры

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

Читайте такжеGame feel в инди-игре: какие мелочи делают управление приятнымGame feel простыми словами: отклик быстрее 100 мс, coyote time, буфер прыжка, hitstop, тряска экрана. Как я делал это на кубиках и что отдать ИИ-агенту.

Где симуляция баланса врёт и когда она не нужна

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

Есть и обнадёживающие данные. В исследовании Чан Сяо и Бренды Янг (arXiv, октябрь 2024) GPT-4 с пошаговым рассуждением играл боссов Slay the Spire, и его результаты коррелировали со сложностью для людей на 0,871 в первом акте и 0,710 во втором (arXiv:2410.02829). Играет модель хуже человека, но где тяжело ей, там тяжело и людям. То есть LLM-агента можно сажать не только писать симуляцию, но и играть в прототип вместо первого тестера. Если формулы громоздкие, есть визуальный вариант - Machinations, браузерный редактор игровых экономик с Монте-Карло прогонами, его в 2018 году основал исследователь Йорис Дорманс (обзор Zeroqode).

Когда симуляция не нужна:

  • Меты нет или она только "вширь". Если между забегами открываются новые карты и классы, но не растут характеристики, считать долю меты в силе нечего.
  • Забегов мало. Если игра рассчитана на 5-10 попыток до финала, проще и честнее посадить трёх друзей, чем строить модель.
  • Сложность меняет сам игрок. Если есть рычаг вроде Heat в Hades или Boss Stem Cells в Dead Cells, перекос меты частично лечится игроком, и ошибка в формуле стоит дешевле.

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

Частые вопросы

Чем roguelike отличается от roguelite?

В классическом roguelike после смерти всё обнуляется, растёт только навык игрока. В roguelite есть мета-прогрессия: часть валюты, апгрейдов или открытий сохраняется между забегами, как Зеркало Ночи в Hades или поместье в Rogue Legacy 2.

Может ли нейросеть заменить плейтестеров?

Частично. В исследовании 2024 года результаты GPT-4 на боссах Slay the Spire коррелировали со сложностью для людей на 0,87 в первом акте. Модель хорошо показывает, где тяжело, но не скажет, интересно ли играть, так что живой плейтест всё равно нужен.

Чем мета вширь отличается от меты вглубь?

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

Как готовился материал: черновик собран моим AI-конвейером по темам и заметкам из практики, факты сверены с первоисточниками, финальный текст я прочитал, поправил и утвердил перед публикацией. Обложку к статье тоже рисует нейросеть. Про сам конвейер — в разделе обо мне.

Влад Новиков
Пишу про AI-разработку без глянца. Новые разборы — сначала в канале.
Подписаться