Добавить в корзинуПозвонить
Найти в Дзене
Дмитрий Брунько

Экономика в игре: как три ресурса создают выбор — и почему числа здесь растут до бесконечности

Самый скучный способ сделать экономику в игре — один ресурс на всё. Накопил — купил. Накопил больше — купил больше. Никаких решений, никакого напряжения. Разберём как три ресурса с разными источниками превращают каждую трату в осознанный выбор — и что происходит когда эти числа начинают расти быстрее чем их умеет считать JavaScript. В Last Wall три основных ресурса, и каждый отвечает за свой слой игры. Золото — операционный ресурс. Падает с врагов, генерируется рынками пассивно. Тратится на найм юнитов. Это самый быстрый оборот: пришла волна — получил золото — купил подкрепление. Дерево — стратегический ресурс. Генерируется лесопилками медленно и постоянно. Тратится на постройки. Решение о том сколько лесопилок строить — это инвестиция на несколько волн вперёд, а не реакция на текущую угрозу. XP — ресурс развития. Начисляется за убийства, тратится в дереве навыков. Нельзя накопить быстро, нельзя получить в бою — только через время и через убийства. Три ресурса означают три одновременн
Оглавление

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

Три ресурса — три вопроса

В Last Wall три основных ресурса, и каждый отвечает за свой слой игры.

Золото — операционный ресурс. Падает с врагов, генерируется рынками пассивно. Тратится на найм юнитов. Это самый быстрый оборот: пришла волна — получил золото — купил подкрепление.

Дерево — стратегический ресурс. Генерируется лесопилками медленно и постоянно. Тратится на постройки. Решение о том сколько лесопилок строить — это инвестиция на несколько волн вперёд, а не реакция на текущую угрозу.

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

Три ресурса означают три одновременных вопроса: хватит ли золота на следующую волну, строить ли сейчас лесопилку или алтарь, и в какую ветку навыков вкладывать XP. Хороший экономический дизайн — это когда правильного ответа нет, есть только компромисс.

Четвёртый ресурс — Prestige-очки — постоянный и никогда не сбрасывается. О нём отдельный разговор в следующей статье.

Постройки как экономические решения

Постройки — это способ конвертировать текущие ресурсы в будущие. У каждой своя роль:

  • Лесопилка — производит дерево пассивно. Нужна чтобы строить всё остальное. Это первый приоритет на ранних волнах
  • Рынок — производит золото пассивно и увеличивает оффлайн-доход. Чем больше рынков — тем больше золота ты получаешь пока не играешь
  • Алтарь — не производит ресурсы, а усиливает юнитов на +10% к атаке. Строится за дерево. Это поздняя инвестиция когда ресурсный поток уже налажен

Правильного порядка нет. Игрок с тремя лесопилками и пятью рынками проходит те же волны что игрок с десятью лесопилками и одним алтарём — просто разными путями.

Экономика работает когда каждый выбор имеет цену. Каждая лесопилка — это рынок который ты не построил. Каждый рынок — это алтарь который подождёт ещё несколько волн.

Оффлайн-прогресс: игра пока тебя нет

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

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

Именно поэтому строить рынки выгодно даже когда они кажутся медленными — они работают круглосуточно.

Почему числа растут до 1e+308

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

Решение — библиотека break_infinity.js с типом Decimal. Она хранит числа в экспоненциальном формате и правильно считает с ними арифметику вплоть до 1e+308. Сложение, умножение, сравнение — всё работает корректно на любых масштабах.

Для игрока это незаметно. Он видит «1.38M» вместо «1380000» — специальная функция форматирования переводит Decimal в читаемый вид с суффиксом.

Как хранится стейт

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

Есть одна тонкость: Decimal — это объект, а не примитив. Его нельзя просто сохранить в localStorage как есть. При сохранении он конвертируется в строку, при загрузке — обратно в Decimal. Одна дополнительная операция которая делает сохранение надёжным на любых числах.

Пассивный доход на каждом тике

ResourceManager запускается на каждом кадре игрового цикла. Он смотрит сколько лесопилок и рынков построено, умножает на delta time и добавляет к ресурсам:

доход за тик = количество построек × ставка × delta

Delta — это доли секунды между кадрами. Поэтому доход начисляется плавно, а не скачками раз в секунду.

Что в итоге

Экономика — это не числа. Это система решений. Три ресурса с разными источниками и скоростями создают постоянный выбор между срочным и важным. Оффлайн-прогресс делает каждую сессию приятным возвращением. А Decimal обеспечивает что математика остаётся точной когда числа перестают помещаться на экране.

В следующей статье — дерево навыков: как три ветки и пресреквизиты превращают прокачку в долгосрочную стратегию, и почему все эффекты — это просто чистые функции в одном файле конфига.

#gamedev, #инди-игры, #разработка игр, #геймдизайн, #javascript, #typescript