ФЭНДОМ


Что такое FSM?Править

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

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

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

Обзор программы:

ИнтерфейсПравить

Открывая первый раз эту программу, очень легко запутаться. Множество непонятных кнопок, настроек, параметров. Сейчас мы эту непонятность будем устранять.
Interface


Рассмотрим самую верхнюю панель настроек:
Interface 1
Обладая даже начальными знаниями английского языка, суть этих пунктов не окажется очень сложной. Я остановлю своё внимание только на пункте FSM Attributes, о котором поговорим чуть позже.


Следующее меню:
Interface 2
Это панель форматирования. Шрифт, цвет, подчёркивание, выравнивание, размер шрифта и пр.


Interface 3

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

  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);



Interface 4

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

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

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














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

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

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

Int settings

Настройки 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.

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

Int attr











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

Int box










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

Int settings

Настройки FSM













Особенности FSMПравить

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

Работа с FSMПравить

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


Nachalo

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
















Init

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


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



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

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

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

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

Ветвление 
Primer1

Пример 1

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

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

Скачать архив










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

Приоритет FSM

Primer2

Пример 2

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






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

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

Primer3

Пример 3


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











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

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

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


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

Error1

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


















Ответ: Данная ошибка связана с размещением блоков. Скорей всего вы поставили два одинаковых состояния, о чём программа в логе и сообщила:

<There is unspecified condition between two states>.

Выглядит это так:


Error1 1