1 Алгоритм работы Blender Game Engine
1.1 Обзор
Игра разделена на несколько blend-файлов — персонажей, уровней и реквизитов. У уровней и реквизитов алгоритма работы нет, у них есть только назначенные им свойства. Свойства необходимы для того, чтобы персонажи понимали, как с ними взаимодействовать.
Уровни содержат по большей части статичный пейзаж, связи между персонажами, группы реквизитов и эффектов.

Рекомендуется хранить каждого персонажа со своей камерой, анимацией, звуком и логикой в отдельном blend-файле. Это позволяет не только осуществить связь одного персонажа со многими уровнями, но и иметь множество экземпляров персонажа на этом уровне.

1.2 Совместное использование алгоритма (Logic Sharing)

Если имеется алгоритм поведения персонажа «овца», то возможно добавить дополнительных персонажей без переделывания алгоритма. Это стало возможным благодаря тому, что недавно в game engine была добавлена возможность иметь множество экземпляров группы. Это было сделано специально для игры Apricot.

Рисунок 2. Совместное использование алгоритма группы «овца»

Индивидуальные объекты персонажа, такие как каркас (armature), мэш (mesh) и тень, у каждого персонажа наследуются от объекта dummy (ложный объект), который управляет алгоритмом. Все три группы совместно используют алгоритмические блоки, но каждая из них имеет свой уникальный каркас и мэш.
Для того, чтобы все персонажи не вели себя одинаково, запускается скрипт, который определяет свойство «type» у потомка. Скрипт запускается при проявлении самого персонажа. Свойство «type» определяет, может ли персонаж атаковать, получать удар, можно ли его переносить и насколько он агрессивен.

Рисунок 3. Совместное использование алгоритма персонажами Frankie и Momo

Летающая белка Frankie и обезьянка Momo — два персонажа, которыми можно играть, используют общий алгоритм, но у каждого из них свои собственные мэш и каркас (armature).
Необходимости изменять поведение персонажей нет, но они должны использовать различные раскладки клавиш и собственные секции на экране (при разбиении окна на две части). Так же как с овцой, это происходит при появлении персонажа. Сейчас одновременно могут играть только один или два игрока, но очень просто добавить большее количество игроков.

1.3 Состояния (States)

Состояния (States) были добавлены в Blender специально для проекта Apricot. Это позволяет группировать алгоритм в состояния (States), каждое из которых может быть включено или выключено (их можно сравнить со слоями алгоритма). Состояния использовались со всеми сложными игровыми алгоритмами. Например, у Frankie есть такие состояния как «ожидание», «ходьба», «бег», «падение», «планирование», «зависание», «погружение в воду» и «смерть». Каждое состояние имеет ряд сенсоров (sensor) и переключателей (actuators), которые переключают состояния при определенных условиях.

Рисунок 4. Состояние «ожидание» из файла frankie.blend

Ниже приведён пример того, как состояния переключаются в течении игры:
Initial State -> Falling (исходное состояние -> «падение»)
Ground Collision -> Idle State (соприкосновение с землей-> «ожидание»)
UpKey -> Walk State (нажата клавиша «вверх» -> состояние «ходьба»)
No Ground Collision -> Fall State (отсутствие соприкосновения с землей -> «падение»)
Water Collision -> Drown State (соприкосновение с водой -> состояние «смерть в воде»)

2 Элементы алгоритма
2.1 Камера Frankie

Этот файл показывает, как работает камера в Apricot. Хотя реализовать камеру от третьего лица, направленную вперёд, не очень сложно, тем не менее, есть несколько вопросов, которые необходимо решить.
Первоначальная проблема, которая была с Blender-камерой — то, что объекты могут загораживать Frankie, и играть становилось невозможно.
Мы начали с того, что сделали камеру «потомком» от Frankie и использовали инструмент замедления (slow) характеристики наследования, чтобы погасить отдачу камеры от Frankie и избежать дрожания и вибрации картинки при движении. Для того, чтобы в камеру не попадали деревья и стены, от Frankie выходит лучевой сенсор, направленный на камеру. Этот сенсор использует python-скрипт для масштабирования камеры в зависимости от позиции столкновения.

2.1.1 Примечания
- для тестирования движения в файл добавлен «пустой» персонаж (dummy character), для того, чтобы камера могла на что-то ориентироваться;
- сцена с ландшафтом и столбами является встроенной установочной сценой и называется «example_scene»;
- клавиши для передвижения — клавиши со стрелками и клавиша «Пробел» для прыжка. Клавиши 1 и 2 для включения и выключения облёта камеры вокруг.

Объекты и их использование (представленные в файле frankie.blend):
- Frankie — родительский мэш со всеми настройками и свойствами;
- FrankieDummy — мэш, который показывает Frankie; это оснастка [rig] и мэш в frankie.blend;
- Camera_Ray — пустой объект, который следит за камерой из позиции Frankie. Это луч, направленный на камеру, определяющий есть ли что-нибудь на пути обзора;
- Camera_Scaler — является родителем для камеры. При изменении его размера изменяется расстояние камеры до Frankie. Размер управляется python-скриптом, который использует позицию столкновения Camera_Ray для определения масштаба (это единственный скрипт, используемый настройками камеры). Также существует режим облёта камеры (orbit mode), при котором камера осуществляет облёт вокруг предмета. Это используется для того, чтобы Frankie был лучше виден при бездействии или при его смерти;
- SlowVertParent — является потомком камеры, используется для того, чтобы изменения масштаба Frankie и его повороты не применялись к камере немедленно;
- MainCam — основная камера, направленная в соответствии с Camera_Ray.

2.2 Состояния Frankie (упрощённые)

Этот пример основан на алгоритме поведения Frankie и показывает как можно использовать состояния для того, чтобы управлять поведением без настройки каких-либо свойств или запуска python-скриптов.
Для добавления более сложной функциональности необходимо использовать python. Использование состояний помогает делать скрипты небольшого размера.

2.2.1 Клавиши
- вверх (Up), влево (Left), вправо (right) — движение;
- пробел (Space) — прыжок.

2.2.2 Свойства уровней
- земля (ground) — используется для определения поверхности, по которой можно ходить;
- смерть (kill) — изменяет состояние на «смерть».

2.2.3 Состояния
- 1 — состояние «ожидание». Можно прыгать, идти и поворачиваться;
- 2 — состояние «ходьба». Можно прыгать, поворачиваться и ждать;
- 3 — состояние «прыжок». В случае, если это состояние активно даже в течении одного «отсчёта» (logick tick), добавляется направляющая сила и состояние немедленно переключается в «падение». Это происходит потому, что движение из других состояний («ходьба» в этом случае) может смешиваться с силой прыжка;
- 4 — состояние «падение». Из этого состояния допускается приземление. Это состояние включается в самом начале (обратите внимание на чёрную точку над состоянием), а также когда Frankie не соприкасается с объектом, обладающим свойством «земля» («ground»);
- 6 — «основное» состояние для поворота и проверки соприкасается ли Frankie с объектами, обладающими свойством «смерть» («kill»). Это состояние включено всегда, пока Frankie жив. Состояние используется когда необходимо, чтобы персонаж реагировал вне зависимости от своего текущего поведения;
- 15 — «смерть». Это состояние выключает основное состояние, отключает обработку входных устройств пользователя, ждёт 4 секунды и уничтожает объект.

2.3 Порталы уровня (level portals)
Этот набор blend-файлов показывает как один персонаж может быть связан с набором сцен и blend-файлов и легко перемещаться между ними с помощью порталов.

Персонаж — группа объектов с игровым алгоритмом и камерой. Эта группа затем связывается со множеством уровней. При этом алгоритм персонажа настраивается в одном месте.
Порталы позволяют осуществлять следующее:
- перемещаться в другое местоположение на уровне;
- перемещаться на другую сцену в blend-файле (или объект, если он задан);
- перемещаться в другой blend-файл (или сцену и объект, если они заданы);
- сохранять свойства персонажа, такие как жизнь и инвентарь между сценами и blend-файлами.
Для того, чтобы сделать портал, необходимо просто добавить объект, с которым можно соприкоснуться, и дать его свойству «portal» значение, например, «SomeObjectName». Когда персонаж дотронется до портала, он будет перенесён к объекту, называемому «SomeObjectName».
Если необходимо переместиться к другой сцене, необходимо добавить свойство «portal_scene», например, со значением «MyOtherScene».
Для того, чтобы переместиться к другому blend-файлу, необходимо добавить свойство «portal_blend», например, со значением «//level_2.blend». Значение — это путь к другому blend-файлу, префикс // означает, что файл находится в том же каталоге, что и текущий blend-файл.
При использовании свойств «portal_scene» или «portal_blend», необходимо наличие свойства «portal». Если не требуется задавать расположение объекта, значение этого свойства должно быть пустой строкой.

2.4 Брызги (Splashing)
Ниже приведён пример, показывающий как создаются брызги для уровней с водой и лавой.

Водным объектам необходимы сенсоры соприкосновений, подсоединённые к элементам управления «splash_logic». В данном случае водных объекта два, но ограничения на их количество нет.
Элемент управления «splash_logic» запускает python-скрипт, называемый «detect_splash» в случае соприкосновения. Скрипт «detect_splash» перемещает «splash_logic» в каждое место соприкосновения и добавляет объект брызги. Это обеспечивает возможность получить большое количество брызг.
В зависимости от того, какой объект попадает в воду, он будет либо плыть, либо тонуть, либо будет удалён. Объекту необходимо только соприкоснуться с водой. В этом примере динамика кубика отключается и он удаляется после 200 «отсчётов» (logic tick).
Сам объект брызги должен быть на отключенном уровне для корректной работы переключателя AddObject. Пример приведён в слое 20.

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

Для этого python-скрипт изначально запускается для каждого персонажа и назначает уникальный идентификатор (ID), используемый для настройки каждого из персонажей отдельно.
После того, как скрипт запущен, состояние изменяется и настраивается соответствующее управление.
Используйте клавиши со стрелками для первого игрока и клавиши WASD для второго игрока.

2.6 Меню
Этот blend-файл содержит упрощённую версию начального меню Yo Frankie.

Меню обладает следующей функциональностью:
- возможно управление с помощью мыши, клавиатуры или джойстика;
- пункты меню могут загружать сцены, blend-файлы или изменять значение ваших собственных переключателей (actuators);
- для настройки параметров могут использоваться кнопки переключения (toggle и radio);
- настройки могут быть записаны в файл и загружены из файла;
- общий алгоритм для всех множественных меню.

2.6.1 Реализация
Основа меню достаточно проста, все объекты, начинающиеся с «item_» сортируются по алфавиту и обрабатываются как пункты меню. Активен может быть только один пункт меню. Он выбирается или клавишами вверх/вниз или наведением на него курсора мыши. Нажатие клавиши мыши или «Enter» выполняет действие пункта меню.
В скрипте «menu_select» настраивается основная часть алгоритма меню. По действию пользователя скрипт запускается для объекта «menu_logic», просматривает сцену в поисках объектов, начинающихся с «item_» и соответствующим образом осуществляет их настройку.
Свойство «active» используется всеми пунктами. Если его значение равно 1, сенсоры пунктов определяют это и проигрывают анимацию. Для Yo Frankie используются невидимые пункты. Благодаря этому возможно подключать анимацию к одному и более объектам, а также это увеличивает область активности мыши.

2.6.2 Типы активации пункта
2.6.2.1 Триггер (trigger)
Эти пункты содержат дополнительное свойство «trigger». Когда пункт меню активируется, значение trigger устанавливается в 1. Алгоритм пункта сам должен проверить значение триггера, чтобы воздействовать на него. После выполнения значение trigger необходимо установить назад в 0. Примеры триггеров — пункты меню «Quit», «Save Config» и «Load Config».

2.6.3 Портал (portal)
Порталы используют одинаковые свойства на всех уровнях. Порталы могут загружать blend-файлы, сцены и объекты (для установки начального положения).
Порталы имеют следующие свойства:
- «active» — описано выше;
- «portal» — имя объекта;
- «portal_scene» — имя сцены;
- «portal_blend» — имя blend-файла.
Примеры порталов — пункты меню «Open Blendfile», «Configure» и «Back».

2.6.4 Конфигурация (Configuration)
Для конфигурирования настройки в меню, можно использовать python-словарь «GameLogic.globalDic», который сохраняется между загрузкой файлов и может быть записан в файл (или загружен из файла) с игровым переключателем (game actuator).
Все настройки игры хранятся в словаре GameLogic.globalDict['conf'].
Существует два типа кнопок, которые при активации автоматически настраивают (adjust) python-словарь. Свойство «conf_key» для обоих типов определяет какие настройки будут изменены.
Типов кнопок немного, но добавить кнопки конфигурации можно без внесения изменений во внутреннюю работу меню.
Пример — скрипт «init_options» и пункты меню в сцене настроек.

2.6.5 Toggle (конфигурация)
Кнопка типа toggle переключает в словаре конфигурации значения «включено» и «выключено».
- «active» — описано выше;
- «toggle» — 0 или 1, пункт меню проверяет значение для отображения большой точки для установленного значения;
- «conf_key» — переключает GameLogic.globalDict['conf'][conf_key] в значения истина (True) или ложь (False).

2.6.6 Radio (конфигурация)
В отличие от toggle, у кнопок типа radio единый conf_key.
- «active» — описано выше;
- «radio» — значение conf_key когда кнопка нажата. Например, если имеются три кнопки низкий/средний/высокий (low/med/high), radio может принимать значения 0, 1, 2;
- «enabled» — из всех кнопок, у которых одинаковый conf_key, одновременно может быть нажата только одна. Это используется для того, чтобы выбранная кнопка выделялась за счёт проигрывания анимации;
- «conf_key» — присваивает GameLogic.globalDict['conf'][conf_key] значение нажатой кнопки radio.
Примечание. Здесь отсутствует описание настройки клавиш, поскольку оно достаточно сложное и характерно для Yo Frankie.

3 Детали алгоритма
3.1 Алгоритм Frankie
3.1.1 Обзор
Поведение Frankie складывается из набора объектов с невидимым родителем, в котором обрабатывается почти весь алгоритм. Алгоритмические блоки (bricks) разделяются на управляемые состояния («ходьба», «бег», «падение», «ожидание» и так далее), и каждое состояние может редактироваться без изменения алгоритма других состояний.
Есть два исключения из этого правила, status (15) и action (16). Благодаря этим состояниям Frankie может совершать действия и состояние его жизни контролируется во время игры.
Алгоритмические блоки сенсоров определяют:
- управление (клавиатура или джойстик);
- соприкосновение со специальными элементами (например, лава, вода, портал);
- изменения свойств здоровья или инвентаря.
Переключатели (actuators) используются для:
- проигрывания анимации и звуков;
- переключения в новые состояния;
- установления свойств здоровья, переносимых вещей и таймеров;
- применения физических сил (например, прыжков и бега);
- ограничения ориентации (например идти — прямо (стоймя), бежать — параллельно земле, парить — ограничение наклона).
Для дополнительной функциональности необходимы скрипты, например:
- парение, когда наклон Frankie влияет на скорость спуска;
- зависание на выступе, когда распространяются лучи для определения высоты уступа, настраивая вертикальную позицию Frankie;
- контекстно-зависимые действия, которые проверяют наличие врагов вокруг, проверяют что несёт Frankie и его инвентарь.

3.1.2 Состояния Frankie

Возможные состояния Frankie:
- idle (1) — «ожидание», состояние по-умолчанию, когда Frankie находится на земле и ничего не делает;
- walk (2) — «ходьба», когда нажата клавиша «вперёд» или «назад»;
- для поддержания постоянной скорости используется вспомогательный переключатель (servo motion actuator);
- run (3) — «бег», когда нажата клавиша «вперёд» и клавиша «действие».
- линейная скорость (linear velocity) используется для передвижения Frankie вперёд;
- переключатель, контролирующий ограничитель расстояния (distance constraint actuator) с возможностью включения поворота используется для удержания Frankie, бегущего параллельно земле (благодаря этому Frankie может бежать по мёртвой петле);
- скорость бега управляется скриптом «frank_run_speed». Он настраивает скорость, основываясь на свойстве «boosted» и наклоне Frankie (для ускорения в мёртвой петле);
- fall (4) — «падение», состояние устанавливается когда Frankie не соприкасается ни с одним из земных объектов и сразу после прыжка;
- благодаря переключателю ограничения ориентации (orientation constraint actuator), при падении Frankie сохраняет вертикальное положение тела;
- из этого состояния Frankie может также подпрыгивать или изменить состояние, приземлившись на игрока, которого можно переносить, повиснуть на уступе или парить при нажатии клавиш «прыжок» во время падения;
- ledge hang (5) — «зависание на выступе», состояние постоянно держит Frankie прикреплённым к краю, где Frankie может раскачиваться из стороны в сторону, падать или карабкаться, если выше выступа есть земля;
- это одно из состояний, когда действия отключены (состояние 16);
- динамика не отключается, python-скрипт держит Frankie прикреплённым к краю;
- carried (6) — «переноска». Когда свойство «carried» у Frankie не равно нулю, устанавливается это состояние, почти вся функциональность отключается и Frankie может только бросать объекты;
- idle animation (8) — «анимация ожидания». Если в течении какого-то времени происходит ожидание, с помощью скрипта «frank_random_anim» добавляется это состояние для проигрывания случайной анимации;
- это состояние отличается от других, поскольку оно добавляется поверх другого состояния. Поскольку это состояние только проигрывает анимацию, оно может прерваться установкой другого состояния, например «ходьба» или «падение»;
- death (11) — «смерть», состояние устанавливается когда здоровье Frankie становится равным нулю. Это состояние немедленно переключается в состояние 12 или 27 если есть соприкосновение с лавой;
- death ground (12) — «смерть на земле», проигрывает анимацию смерти, затем устанавливает состояние 26 рождения заново (respawn). Это состояние устанавливается исключительно, отключая устройства управления игрока;
- status (15) — «статус», обновляет здоровье Frankie, реагируя на удар, соприкосновение с водой, собирание предметов (pickups), активации порталов и посылает сообщение на экран (HUD);
- это состояние выполняется в большинстве случаев, и во всех остальных случаях, когда Frankie может свободно перемещаться (не умер, утонул или перерождается);
- action (16) — «действие», состояние обрабатывает устройства ввода и выполняет действия — комбинацию из проигрывания анимации и выполнения алгоритма действий. Также в этом состоянии выполняется алгоритм проверки находится ли Frankie на земле или нет;
- скрипт «frank_action_all» определяет нажатые клавиши, проверяет можно ли что-нибудь пнуть или бросить, устанавливает значение «action_name» и проигрывает анимацию. Таким образом, скрипт выполняется до тех пор, пока установлено «action_name». Было бы просто запускать алгоритм по нажатию клавиши, но это не очень рационально, так что скрипт для каждого действия после интервала (frame set) анимации движения содержит интервал для выполнения алгоритма. После этого устанавливается свойство «action_done»;
- можно добавить собственные действия, добавляя сенсор клавиш (key sensor), переключатели действия и утверждения в скрипте «frank_action_all»;
- это состояние также запускается наряду с другими состояниями (как с состоянием 15), однако, оно отключается когда Frankie карабкается по выступам;
- jump init (18) — «начало прыжка», состояние проигрывает звук, устанавливает линейную скорость и сбрасывает свойства «jump_timer» и «grounded»;
- после установки свойств немедленно переключается в состояние «падение». Это происходит потому, что если бы все переключатели (actuators) прыжка были бы подсоединены к контроллерам в состояниях «ожидание», «ходьба» и «бег», их было бы трудно поддерживать;
- glide (19) — «планирование», состояние включается если во время падения нажата клавиша «прыжок». Весь алгоритм планирования выполняется в скрипте «frank_glide», который работает с динамикой скорости и наклоном для обеспечения возможности оставаться в воздухе на короткое время;
- ledge climb (20) — «лазанье по склону», состояние используется когда Frankie висит на склоне и нажата клавиша «вперёд». Когда Frankie вылезает на землю по склону, проигрывается анимация.
- специальные переключатели (servo motion actuators) перемещают Frankie вверх и вперёд с фиксированной скоростью;
- переключатели движения (motion actuators) синхронизированы с анимацией с помощью сенсоров задержки;
- stop idle animation (23) — «завершение анимации ожидания», состояние сбрасывает таймер анимации ожидания и выключает облёт камеры, затем отключает состояние анимации и своё собственное состояние;
- respawn (26) — «перерождение», состояние сбрасывает позицию Frankie и присваивает почти всем свойствам их первоначальные значения;
- death lava (27) — «смерть в лаве», состояние аналогично состоянию «смерть на земле», отличается только анимация и проигрываемый звук;
- drown (28) — «смерть в воде», состояние похоже на другие состояния смерти, за исключением того, что вместо «перерождения», скрипт «frank_drown_revive» перемещает Frankie в положение, в котором он последний раз был на земле.

3.1.3 Свойства Frankie

Свойства Frankie:
- id — уникальное целое число игрока (ID), 0 или 1 для игроков 1 и 2. Используется при инициализации игрока для установки раскладки клавиатуры и разделения экрана на две части. Когда игрок бросает объект, свойству «projectile_id» присваивается «id» игрока, благодаря чему можно определить, кто последним бросил объект. Начальное значение равно -1, инициализируется в скрипте «frank_init»;
- grounded — используется во многих блоках алгоритма и скриптах для определения находится ли Frankie на земле. Это значение управляется скриптом «frank_ground_test» (состояние 16). Скрипт с помощью определения соприкосновения с землёй и луча, направленного по оси Z, определяет изменилось ли состояние. Свойство можно удалить и заменить его на расположенные повсюду сенсоры соприкосновения с землёй, однако сенсоры соприкосновения могут дрожать на неровной поверхности. Так что комбинация земли и луча даёт лучшие результаты;
- predator — используется в алгоритме овцы, барана и крысы для определения того, что Frankie — враг и его надо либо атаковать, либо бежать от него;
- kickable — используется когда играют два человека. Определяет можно ли наносить удары ногой друг другу. Это свойство есть также у овец и крыс;
- hit — устанавливается алгоритмами других объектов, когда Frankie получает повреждения (от крыс, баранов или от второго игрока). Если значение hit не равно нулю, это значение вычитается из жизни Frankie, и значение hit обнуляется. Скрипт «frank_health» отвечает за ненулевые значения hit. Использование этого метода делает очень простым добавление новых врагов, поскольку им нужно только установить значение «hit», то есть размер повреждений, которые они наносят объекту атаки;
- orig_pos — хранит начальное положение Frankie входа на уровень. Если Frankie умирает, эта позиция используется для перерождения. Значение orig_pos инициируется в скрипте «frank_init». Оно используется в скриптах «frank_respawn» и «frank_revive»;
- ground_pos и ground_pos_old — свойства обновляются каждую секунду, сохраняя положение Frankie на земле. Сейчас это используется только для восстановления позиции после смерти в воде. В этом случае Frankie появляется в точке, в которой последний раз касался земли. ground_pos_old — предыдущее положение перед ground_pos. Это необходимо для того, чтобы Frankie не появился слишком близко к воде. Эти значения устанавливаются в frank_ground_pos;
- water_touch_time — если бы Frankie умирал сразу, как только коснётся воды, это было бы неинтересно. Этот таймер используется для того, чтобы определить, что Frankie находится в воде какое-то время, после чего переключается в состояние «тонет» (смотри сенсоры и элементы управления water_time в состоянии 15);
- camera_orbit — целое число, используемое для того, чтобы камера облетала вокруг Frankie когда он бездействует, утонул или упал в лаву. У объекта «Camera_Scaler» есть сенсор, который проверяет это свойство, запускает движение, когда свойство не равно нулю и проигрывает ipo когда оно ложно чтобы остановить вращение. Пример — в элементах управления orbit_on и orbit_off в «Camera_scaler»;
- idle_anim_trigger — этот таймер используется для проигрывания анимации когда Frankie бездействует какое-то время. Ему присваивается отрицательное число, камера начинает совершать облёт вокруг, затем добавляется состояние анимации бездействия около 0.0. Пример — алгоритмические блоки в состоянии 1 с префиксом idle_anim;
- carrying — целое число, устанавливается в 1 когда Frankie несёт что-нибудь. Многие скрипты проверяют это значение для определения может ли Frankie совершать какие-либо действия — собирать предметы, щёлкать хвостом, делать двойной прыжок и бежать. Основной алгоритм, устанавливающий это значение, располагается в скрипте «frank_carry», который запускается каждый раз когда Frankie дотрагивается до объекта со свойством «carried». Пример — элемент управления frank_carry в состоянии 16;
- carried — определяет, что этот объект можно нести (например, первый игрок может нести второго). Значение используется скриптами и алгоритмическими блоками для того, чтобы определить — несут ли вас в текущий момент. Когда значение не равно нулю, установлено состояние 6, где динамика отключена и действия Frankie очень ограниченны (он может только бросить то, что он уже несёт);
- force_walk — таймер используется когда необходимо чтобы Frankie с бега перешёл на шаг. Когда значение таймера меньше нуля, состояние «бег» немедленно переключается в состояние «ходьба». Отрицательное значение всегда устанавливается, когда Frankie несёт объект. Также Frankie вынужден какое-то время идти если его ударили, или он кинул предмет, или щёлкнул хвостом;
- action_name — используется когда Frankie выполняет действие — в этом случае значение будет равно «throw_carry», «throw», «kick» или «tailwhip». Это позволяет определить текущее выполняемое действие и не позволяет совершать сразу несколько действий одновременно. После того, как действие выполнено, значение становится равным пустой строке. Пример — состояние 16, в котором скрипт «frankie_action_all» используется для управления всеми действиями;
- action_done — используется скриптом «frank_action_all» для проверки запущена ли функция, ассоциированная с действием. Без этого действие не могло бы быть исполнено в середине анимации. Пример — состояние 16;
- throw_item — хранит объект, который Frankie будет бросать следующим. Если у игрока есть предметы различного типа, это может быть использовано для их циклического просматривания. Пример — скрипт «frank_sense_pickup» в состоянии 15, где последний подобранный предмет устанавливает «throw_item», и «frank_action_all» в состоянии 16, где «throw_item» определяет предмет, который будет брошен следующим;
- life — хранит текущее здоровье Frankie и обновляет его значение на экране. Пример — скрипт «frank_health» в состоянии 15;
- life_max — максимальное значение жизни, которое может быть у Frankie. Пример — «frankie_sene_pickup» в состоянии 15;
- revive_time — устанавливается в ноль, когда Frankie получает урон. Следующий удар не будет уменьшать здоровье Frankie пока «revive_time» больше 1.0. Пример — скрипт «frank_healh» в состоянии 15;
- jump_time — таймер устанавливается в 0.0 во время прыжка. Используется для того, чтобы игнорировать любые соприкосновения с землёй на короткое время и для определения не поздно ли для двойного прыжка. Также jump_time используется для определения длительности парения. Пример — «frank_ground_test» в состоянии 16 и состоянии 18, где задаются значения прыжка;
- double_jump — используется для проверки выполнил ли Frankie двойной прыжок (поскольку можно делать только один двойной прыжок). Пример — скрипт «frank_fall» в состоянии 4;
- glide_z_init — устанавливается в значение координаты Z текущего положения Frankie. Используется для того, чтобы Frankie не смог взлететь выше положения, из которого началось парение. Пример — скрипт «frank_glide» в состоянии 19;
- run_wall_timer — используется таким образом, что Frankie может осуществить прыжок через голову, оттолкнувшись от стены. Это возможно когда Frankie бежит по стене со свойством «slip». Пример — скрипт «frank_wall_run» в состоянии 3;
- boosted — устанавливается когда Frankie ловит бабочку (дотрагивается до предмета со свойством «boost»). В этом случае Frankie начинает сверкать и может бежать гораздо быстрее. Пример — скрипт «frank_run_speed» в состоянии 3, «frank_sense_pickup», где устанавливается значение увеличения скорости;
- can_climb — устанавливается если выше Frankie есть земля, на которую можно вскарабкаться (когда он висит на уступе). Наличие земли определяется с помощью луча, который исходит от Frankie вверх. Если значение can_climb не равно нулю, нажатие клавиши «вверх» когда Frankie висит, заставит его вылезти на землю. Пример — скрипт «frank_ledge_hang» в состоянии 5;
- ledge_regrip_timer — используется при соскакивании с выступа (при нажатии клавиши «вниз» когда Frankie висит) для того, чтобы Frankie перестал цепляться за выступ сразу после соскакивания. Пример — скрипт «frank_ledge_collide» в состоянии 4.

3.2 Физический/Логический дизайн уровня
Настроить уровень для работы с алгоритмом Frankie очень просто. Достаточно убедиться что вся область, где Frankie может стоять, имеет свойство «ground».
После этого уровень может быть использован для игры. Если будут замечены какие-то проблемы, это решается точной настройкой уровня (ниже приведены советы).

3.2.1 Физические объекты
Текущий метод определения земли и препятствий ограничен, он требует чтобы для земли и препятствий были заданы разные объекты.
Для уровней игры Yo Frankie было проще удалить со сцены конфликтные ситуации и добавить невидимые физические объекты.
Физика для сцены может быть отключена в кнопках алгоритма игры (game logic buttons). Для объектов в их контурах (outliner) может быть отключена функция рендеринга, в этом случае они инициализируются невидимыми (объект сохраняется добавлением UV и использованием настройки невидимости).

3.2.2 Материалы

Стены и другие объекты, по которым нельзя бегать, должны иметь материал без трения (смотри кнопку материала DYN).

3.2.3 Свойства

Следующие свойства проверяются в алгоритме Frankie и в алгоритмах других элементов, чтобы персонажи корректно взаимодействовали с уровнем.
- ground — свойство используется для определения всего, на чём может стоять Frankie. Эти поверхности не обязательно должны быть плоскими (мёртвая петля, например, имеет свойство «ground»). Однако, необходимо убедиться, что это свойство не задано для стен и препятствий. Необходимо отметить, что платформы, на которые можно запрыгивать, должны быть окружены препятствием, у которого нет свойства «ground». Верх должен быть выше примерно на 0.05, чтобы у персонажа не было одновременного соприкосновения с землёй и препятствием;
- slip — свойство стен, которое позволяет осуществлять прыжок через голову если бежать прямо на стену. Если Frankie набегает на стену под углом, то дальше он продолжает бег параллельно стене. Это не обязательно для игры, но позволяет сделать передвижение по уровню более ровным. Значение этого свойства не используется.
- ledge — свойство используется для определения областей, на которых Frankie может висеть. Значение этого свойства не используется.
- это должны быть вертикальные полосы глубиной 0.45;
- настройка столкновений с невидимыми объектами (ghost collision) может быть использована если персонажу разрешено падать сквозь геометрию, имеющую ячейки (например, сквозь ветви);
- bounce — объект, обладающий этим свойством, при приземлении на него, заставляет Frankie подпрыгивать в воздух. Значение этого свойства не используется;
- kill — свойство заставляет Frankie потерять заданное количество жизней. Число должно быть целое;
- water — свойство должно применяться к поверхности реки. Если Frankie дотрагивается до объекта с этим свойством, через короткий промежуток времени он начинает тонуть. Необходимо отметить, что этот объект должен быть невидимым (ghost). Значение свойства не используется;
- lava — аналогично воде, просто проигрывается другая анимация для Frankie;
- liquid — это свойство должно применяться к объектам вода или лава, чтобы при столкновении с ними объекты, которые можно подбирать, исчезали. Значение свойства не используется.