Skip to content

Метка: Volker

[Dev] Брокер ресурсов

Подробный разбор с Волькером Вертичем

Введение:

В основе экономики Settlers лежит распределение и доставка товаров. По большей части эти процессы автоматизированы, поэтому для принятия верных решений необходима сложная игровая система. Мы называем ее «брокер ресурсов». Начиная с самой первой игры серии, The Settlers, ей отводится важное место. Сегодня мы подробно рассмотрим, как эта система работает.

«Брокер ресурсов» решает, куда и каким образом доставить те или иные продукты. Очень важно, чтобы алгоритм, отвечающий за эти решения, был, во-первых, эффективным, а во-вторых, предсказуемым, ведь игрокам необходимо понимать, что происходит в их поселениях.

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

1. Груды:

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

Груды пополнения:

  • (A) Груды у зданий, производящих ресурсы. Пример: дровосек срубает дерево и относит ствол к своему домику. Как только ствол окажется в груде, его можно забрать.
  • (B) Груды у производственных зданий. Пример: на мельнице собранная пшеница превращается в муку. Как только мука будет готова, ее можно забрать.
  • (C) Перевозимые груды: Ресурсы можно забирать и перенаправлять даже из той груды, которая перемещается в данный момент. Пример: если телега, запряженная ослом, везет на склад пять избыточных единиц камня, но в это время размещено новое здание, для которого требуется камень, телега отправится к этому зданию. Все, что перемещается на склад, можно использовать.

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

  • (D) Груды на земле. Игрок может создать груды на земле по разным причинам, включая указанную выше. Из них также можно забирать ресурсы.

Груды потребления:

  • (E) Производственные здания. Пример: груды у плавильни, которой требуются уголь и руда.
  • (F) Здания набора. Пример: для набора новобранцев стрельбищу требуются луки.
  • (G) Места для строительства. Любому новому зданию нужны ресурсы для строительства.

Груды для пополнения и потребления:

  • (H) Склады одновременно требуют ресурсы, чтобы эффективно использовать дополнительное место, и предлагают то, что хранится в данный момент.

2. Приоритеты

Теперь, когда «брокер ресурсов» знает, где находятся и где требуются ресурсы, а также их количество, в дело вступает приоритет.

Если у вас значительный избыток ресурсов и достаточно свободного транспорта, приоритеты играют важную роль, ведь каждый запрос можно выполнить. Но по мере того, как игрок старается оптимизировать экономику и эффективно распределять ресурсы, появится постоянный недостаток тех или иных продуктов и транспорта. Для того чтобы «брокер ресурсов» принимал верные решения, мы создали несколько уровней приоритета. В каждом уровне, в свою очередь, выделяются подуровни и срочные случаи.

Давайте пройдемся по всем приоритетам от низшего уровня к высшему:

Приоритет 5: К этому уровню относятся все запросы для складов. Это касается излишних ресурсов, которые нужно переместить на склад для хранения, что обычно не очень срочно. Как уже говорилось выше, ресурсы, перевозимые на склад, можно использовать и перенаправлять туда, где они потребовались.

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

Приоритет 3: Это высший автоприоритет. Сюда относятся все текущие запросы ресурсов для строительства или улучшения зданий.

По умолчанию мы считаем, что у строительства приоритет выше, чем у обычных запросов ресурсов приоритета 4. Хотя в некоторых ситуациях такой подход сомнителен, в большинстве случаев он достаточно эффективен, так как новые здания играют ключевую роль в игровом прогрессе. Кроме того, запросы для строительства однократные, в то время как готовым зданиям ресурсы требуются постоянно.

Приоритет 3 подразделяется на два подуровня, от которых зависит дальнейшее назначение приоритета:

  • Первый подуровень определяет, что здания идут прежде укреплений, а укрепления — прежде дорог. Как говорилось выше, этот приоритет предустановлен, что обычно (но не всегда) является правильным выбором.
  • Второй подуровень определяет, что запросы для старых зданий важнее запросов для новых. Благодаря этому приказы игрока не списываются со счетов и через некоторое время результат будет достигнут. Пример: 5 из 10 новых зданий закончены и функционируют, вместо того чтобы 10 зданий стояли наполовину готовыми и в нерабочем состоянии.

Приоритет 2: Для того чтобы у игроков оставалась возможность влиять на решения «брокера ресурсов», мы создали для них функцию высокого приоритета для готовых зданий, которая поднимает приоритет с 4-го уровня до 2-го. Другими словами, игрок может назначить отдельным построенным зданиям приоритет выше, чем назначил бы «брокер ресурсов». Это позволяет игроку назначать высший приоритет, например, оружейной, поскольку производство мечей стоит для него на первом месте.

Приоритет 1: Кроме того, функция высокого приоритета работает и для мест для строительства (приоритет повышается с 3-го уровня до 1-го). Подуровни приоритета 3 функционируют точно так же. Таким образом, если игрок назначит высокий приоритет пяти местам для строительства, то их очередность будет зависеть от тех же правил, что описаны выше.

3. Срочность и расстояние

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

Срочность ранжируется от уровня «очень срочно» до «совершенно не срочно» и работает следующим образом:

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

То же самое происходит с грудой потребления у производственного здания или здания набора, если она целиком или почти опустошена и здание не может функционировать без ресурсов. Как только груда наполнится, срочность снизится до нуля.

Груда пополнения у производственного здания или здания, производящего ресурсы, имеет высокую срочность, если она целиком или почти заполнена и здание прекращает работу, так как закончилось место для хранения ресурса.

Грудам на земле присваивается срочность выше среднего, но не очень высокая. Теоретически они могут оставаться на месте вечно, но для лучшего обзора стоит рано или поздно от них избавляться.

С расстояниями все просто: ем дальше друг от друга находятся груды потребления и пополнения, тем менее эффективной становится доставка. Также важно учитывать реальное расстояние пешего пути, а не длину прямой линии между пунктами.

Расстояния и срочность всегда учитываются вместе. Другими словами, «брокер ресурсов» принимает вдвое большее расстояние, если срочность тоже выше в два раза. Уровни срочности балансируются индивидуально, поэтому разработчики могут настроить влияние расстояния.

 Составление пар: Наконец, когда «брокер ресурсов» соединил предложение и запрос, для транспортировки ресурсов будет назначен носильщик… но сейчас мы не будем подробно останавливаться на типах и работе носильщиков — это тема для другой статьи!

4. Подробные примеры.

Давайте теперь проиллюстрируем все эти правила примерами.

Предположим, что у нас есть домик дровосека и две лесопилки: одна в 30 метрах от домика, а другая — в 60 метрах.

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

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

Если бы четыре домика дровосека производили больше стволов, чем могут обработать две лесопилки, рано или поздно заполнятся и груды потребления, и груды пополнения. После этого транспортировка приостановится, чтобы освободилось место. Возможно, мы захотим построить еще одну лесопилку или улучшить существующие… Но вместо этого давайте построим склад для стволов!

Теперь, если у вас достаточно носильщиков, они будут доставлять стволы на склад (не забывайте, что заполнению склада назначается приоритет 5). Благодаря такому расширению, груды пополнения снова будут опустошаться, и дровосеки продолжат работать, пока и на складе не останется места.
Но прежде чем это случится, мы начнем строить пять домов, для чего потребуются стволы. В зависимости от расстояния эти ресурсы будет поставлять на место для строительства либо склад, либо какие-то из лесопилок.

Если носильщиков вдруг окажется недостаточно, эти новые запросы будут обрабатываться в первую очередь, поскольку у мест для строительства приоритет над обычными перевозками типа «домик дровосека => лесопилка». Это значит, что лесопилки будут работать на своих запасах стволов. В худшем случае лесопилки перестанут функционировать, пока носильщики не доставят все ресурсы к домам.
Однако если нам срочно понадобятся доски, можно назначить высокий приоритет одной или обеим лесопилкам и поставить свои нужды вперед решений «брокера ресурсов».

После этого все доступные стволы будут доставляться на лесопилку до тех пор, пока их груды не заполнятся, а к местам для строительства отправится только избыток… Но это может привести к тому, что дома еще долго будут на стадии строительства (хотя приоритет лесопилок можно отключить в любое время).
Представим еще одну ситуацию. Мы послали разведчика в тыл врага, и теперь ждем нападения с минуты на минуту. Для защиты поселения нужно срочно возвести стену. Мы быстро размещаем две башни и стену между ними.

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

Надеемся, вам было интересно почитать про «торгового брокера» и теперь вы сможете с успехом применить эти знания в игре!

2 комментария