Связь объектов и привычек

Когда мы даем привычкам список настроек в их файле конфигурации, это добавляет большую степень обобщения в систему, но не позволяет динамически манипулировать объектами в реальном времени, реагируя на спорные ситуации. Например, цель привычки «Выстрелить_из_оружия» не может быть известна на момент написания этой привычки, поскольку она варьируется. Каждая привычка должна понимать и принимать решения о спорных игровых объектах в мире, определяемых в реальном времени.
Решение, которое мы использовали в Destroy All Humans 2, было в том, чтобы разрешить передачу параметров от родительских процессов к дочерним в момент их создания, что позволяет этим привычкам принимать и манипулировать объектом, который был передан им как параметр, или передавать его своим собственным дочерним процессам.
Любая привычка, которая должна принять параметр, определяет ячейку для него, которую необходимо заполнить тем, что передаст родительская привычка при активации ее, как дочерней. С этого момента переменная в ячейке может использоваться различными способами: она может быть передана следующей дочерней привычке, послана как событие или сообщение или же, для привычек с поддержкой кода, сделана доступной для кодовой части. «Следовать_пути», например, будет искать объект, переданный в качестве первого параметра, а «сражаться_врукопашную» — бить в направлении первого параметра.
С таким добавлением состояния наша HFSM может по сути передавать объекты вдоль путей передачи (в нашем случае – между родительским и дочерним процессом), включать их в другие привычки, которые их ожидают, и использовать их в качестве целей своего функционирования. Таким образом можно включить определенную скриптоподобную функциональность в более жесткую структуру HFSM, что дает дополнительную гибкость, не принося при этом в жертву организацию.
Между конкретными и абстрактными лежат частично применимые привычки. Способность передавать параметры открывает гораздо больше способов использования привычек, так что различное использование параметров стало довольно обычным в нашей реализации. В помощь нам, чтобы реализовать определенные стандартные способы, которыми можно использовать параметры, было создано несколько частично применимых привычек, которые могли обращаться с определенными стандартными задачами на уровне кода, хотя сами они и не являются полностью привычками с поддержкой кода. Они, скажем так, не могут являться листьями HSFM; они просто помогают работать привычкам, которые остаются абстрактными, пока не получат данные, определяющие их действия.
Наиболее часто используемая частично применимая привычка – «проверять_дистанцию», которая принимает в качестве параметра цель, которую она будет отслеживать и хранить все свое существование, что используется для многочисленных решений выбора.
Поскольку параметры передаются, как только создается привычка – даже до того, как она будет активирована – мы можем использовать их, чтобы определить, нужно ли вообще ее активировать. В случае с «проверять_дистанцию» были доступны дополнительные настройки, чтобы проверять дистанцию до переданной цели (первый параметр) и деактивировать привычку, как только она выйдет за вторую дистанцию. Такая функциональность оказалась полезной в самом широком смысле. Поскольку эта привычка может служить родителем как для привычек, определяемых данными, так и для привычек с поддержкой кода, таких как «следовать_пути» или «сражаться_врукопашную», она может разбивать задачи на отклики в зависимости от свойств объектов в мире и обеспечивать естественную реакцию неуспеха, когда цели слишком далеко. Размещая привычки «проверять_дистанцию» и применяя их к различным объектам в различные моменты времени, мы можем определять комплексные решения о динамических объектах с помощью всего нескольких простых элементов.

Добавить комментарий