Руководство по FSMправить

Материал из ArmaCommandReference Wiki

Содержание

[показать]

[править] Что такое FSM

FSM – расшифровывается, как Finite State Machine и означает «конечный автомат». По определению компании Bohemia Interactive, FSM – это набор состояний игровой логики, переходящих из одного состояния в другое по определенным правилам.
FSM можно использовать для различных ситуаций, вплоть от назначения музыки зависящей от ситуации (например во время боя одна, в спокойное время другая) и до указания ботам, как необходимо вести себя в той или иной ситуации.
Полёт мыслей, может ограничиваться только вашей фантазией.

править Программа FSM Editor

С выходом игры ArmA 2, компания Bohemia Interactive выпустила свой инструментарий для редактирования FSM файлов. Здесь я подробно, постараюсь, рассказать об этой программе.
Скачать программу можно по этим адресам:

[править] Обзор программы

[править] Интерфейс

Открывая первый раз эту программу, очень легко запутаться. Множество непонятных кнопок, настроек, параметров. Сейчас мы эту непонятливость, будем устранять.
Интерфейс
Рассмотрим самую верхнюю панель настроек:
Верхняя панель настроек
Обладая даже начальными знаниями английского языка, суть этих пунктов не окажется очень сложной. Я остановлю своё внимание только на пункте FSM Attributes, о котором поговорим чуть позже.
Следующее меню:
Панель форматирования
Это панель форматирования. Шрифт, цвет, подчёркивание, выравнивание, размер шрифта и пр.

Сейчас добрались до самого интересного. Панелей настройки состояний.
Описание будет сверху-вниз.

Панель настроек
  1. Создание нового состояния (New Box);
  2. Перемещение выбранного состояния (Set mode to design);
  3. Создание переходов от состояния к состоянию (Draw links);
  4. Увеличить масштаб (Zoom);
  5. Вернуть масштаб (Reset Zoom);
  6. Изменить внешний вид блока (Change item to…);
  7. Залить блок цветом (Set fill colour);
  8. Изменить цвет границ (Set line colour);
  9. Установить размер и стиль текста (Set line style and width);
  10. Set transparent fill;
  11. Set transparent line;
  12. Редактировать текст в состоянии (Edit text and font properties);











[править] Описание блоков

Так же идёт сверху-вниз.

Блоки
  1. Начальное состояние. Активируется при запуске fsm;
  2. Блок условие. Проверяет условия перехода от блока к блоку с учётом приоритета;
  3. Блок состояние. В этом блоке пишутся скрипты;
  4. Блок точка. Просто удобная штука, позволяет более грамотно распределять блоки;
  5. Блок завершение. Блок, который завершает fsm файл;














править Настройка FSM

Наш .FSM перед работой необходимо настроить! Потому что если это не сделать, появляется вот такая ошибка при компиляции fsm:
Ошибка при компиляции FSM

Есть несколько программных настроек:

Настройки FSM

Каждая из них нужна для определённой работы. Описания этих настроек будут приведены ниже.

[править] Управляющие настройки

  • FSM Entity – управляющий файл entityFSM.cfg

Такая настройка используется для описания поведения определённых животных (бабочки, пчёлы, стрекозы);

  • FSM Scripted – управляющий файл scriptedFSM.cfg

Настройка, позволяющая использовать скриптовые команды и условия в fsm файлах.

  • Global Switch FSM – управляющий файл globalSwitchFSM.cfg

Compilation to the *.cpp code, using switch to navigate through FSM states. The compile uses many FSM attributes, to define function declaration, precondition codes etc. This FSM was first used in seagull.cpp to code autopilot functionality. So, opening seagull.cpp in FSMEditor.

  • Class Compile FSM – управляющий файл classFSMcompile.cfg

Compilation to the *.cpp, using Fsm class architecture. It creates %(stateName) functions for state initialization and check%(stateName functions for checking conditions. No FSM created by FSMEditor has been compiled and used in engine, but some were coded manually before FSMEditor existence.

Чтобы выбрать интересующую нас настройку, щёлкаем по выделенным пунктам:

Выбор настройки











Откроется меню:

Выбор настройки











Теперь надо выбрать путь, по которому установлена программа FSM Editor.
При правильном выборе должно появиться несколько файлов с расширением .cfg
Это конфигурационные файлы настройки .FSM
Выбираем нужную и начинаем с ней работать.

Настройки FSM












[править] Особенности FSM

  • Кириллица запрещена в описаниях блоков, но разрешена в самих блоках (UTF-8).
  • Передача аргументов в FSM файл не отличается от передачи аргументов в SQF файл.
  • Все локальные переменные, описанные в .FSM файле, будут доступны во всех блоках.
  • FSM не будет выполнятся дальше, пока какое-либо условие не будет выполнено.
  • Команда sleep в FSM запрещена, вместо этого используется метод засечки времени. Чтобы сделать задержку, нужно запомнить время (_wait = time) и поставить условный блок, в котором обозначить условие: (time > (_wait + 10), например для 10 секундного ожидания.

[править] Работа с FSM

Каждый .fsm файл должен начинаться с начального состояния (Start State) и заканчиваться конечным состоянием (End State). Чтобы выбрать тип блока, нужно всего-то щёлкнуть правой кнопкой мыши на интересующем блоке.


Выбор типа блока

















Начальный блок отмечается красным цветом. Конечный – оранжевым. Рабочим полем для нас будет являться закладка initCode

Инициализирующий код











В этом поле мы будем писать наши скрипты.

[править] Примеры работ

Все примеры работы с fsm файлами я буду производить с настройкой - FSM Scripted.

править Пример 1

Ветвление

Пример 1

В миссии я захотел обработать два события. Для этого написал простенький .fsm скрипт.
Блок «начало» (Start State) инициализирует вход в .fsm файл. Затем идёт разветвление на два условия. Первое: Игрок убил человека, второе – игрок сел в машину. Инициализация .fsm происходит в скрипте init.sqf
FSM становится _активным_ и ждёт реакции по событиям. Что из этого получилось, смотрите в примере.
Скачать архив










править Пример 2

Приоритет FSM

Пример 2

Сейчас я вам покажу зависимость выполнения fsm от приоритета.
FSM - скрипт представляет собой блок состояний с разветвлением с учётом приоритета.
Инициализация FSM так же происходит в скрипте init.sqf.
Условие «Убит юнит 1» имеет приоритет 0, условие «Убит юнит 2» имеет приоритет 1.
Следовательно, если будет убит только юнит 1, fsm пойдёт по одной ветке с выводом первой подсказки, описанной в коде. Если будет убит только юнит 2, fsm пойдёт по второму пути, с выводом второй подсказки. Если же оба юнита будут убиты одновременно, fsm пойдёт всё по тому же второму пути (условие: убит юнит 2), так как, оно имеет больший приоритет и выведет третью подсказку.
Можете поиграться с приоритетом, внутри fsm файла.
Скачать архив






править Пример 3

Поиск статических орудий

Пример 2

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











[править] Часто возникающие ошибки

1) Вопрос: При компиляции у меня появляется такая ошибка:
Ошибка при компиляции FSM



Ответ: Эта ошибка вызвана из-за того, что вы не настроили свой fsm файл. Как избежать возникновения данной ошибки, читайте выше, в пункте «Настройка ФСМ»

2) Вопрос: При компиляции возникает след. ошибка:

Ошибка при компиляции FSM



















Ответ: Данная ошибка связана с размещением блоков. Скорей всего вы поставили два одинаковых состояния, о чём программа в логе и сообщила: <There is unspecified condition between two states>.
Выглядит это так:
Ошибка при компиляции FSM