Учебник по IFML 1.0

Вы также можете обратиться к спецификации IFML или к сборнику вопросов по IFML


© TOY Soft, 2001

Автор: Sonic
ICQ:
120422848
Дата: 15.09.01


Содержание:

Часть I. Основы
1. Введение
2. Общие описания
3. Описания по умолчанию
4. Базовые свойства
5. Скрипт Реакции Объекта (СРО)

Часть II. Операции с объектами
6. Перекрытие свойств



Часть I. Основы

1. Введение

IFML создан специально для описания виртуального мира текстового квеста (VWoA). Поэтому, основной принцип структуры языка - описание. Весь виртуальный мир делится на локации, предметы, игровую среду и игрока. При этом в описание данных объектов входит также описание реакции самых объектов на различные события. События в данном случае представляют собой попытку игрока сделать что-либо с объектом. Попытка представляет собой команду игрока, введённую в интерпретаторе в строке ввода. Она (команда) может выглядеть следущим образом:
1) <действие предмет>, например "зажечь спичку", причём предмет находится в винительном падеже;
2) <действие> или <общее слово>, например "войти" или "восток".
При этом "зажечь" будет именем реакционного события в объекте "спичка" и будет частью его описания, вызывая каждый раз, когда игрок вводит "зажечь спичку"; а "войти" или же "восток" будут вызываться из текущей локации или другого "текущего" объекта. Сама же реакция описывается на специальном языке - Скрипте Реакции Объекта (СРО), который рассмотрен ниже.
Файл, содержащий историю (текстовый квест), по сути является текстовым описанием локаций и предметов, которые входят в игру.

 

2. Общие описания

Всё описание локаций заключено между строками:
    новлок "имя"
и:
    коннов

Описание предмета заключается между строками:
    новпред "имя"
и:
    коннов

Описание локаций и предметов состоит из свойств, событий и базовых свойств (см. 4. Базовые свойства). Свойства описываются так:
    имя=значение
и служат внутренними переменными.

События описываются следующим образом:
    имя={
        команда1
        команда2
        ...
    }

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

Если в внутри файла истории нужно написать какой-то поясняющий текст, то он пишется на отдельной строчке и начинается с 2х символов косой черты (//).

Перед, после и между словами, где синтаксисом предусмотрены промежутки, может быть сколько угодно пробелов и символов табуляции (клавиша Tab).

 

3. Описания по умолчанию

Если нужно в нескольких объектах использовать одни и те же свойства и события, то придётся их описывать каждый раз. Этого можно избежать, используя описания по умолчанию. Описания по умолчанию - это описания, которые входят в каждый объект, идущий после их объявления. Они объявляются следующим образом:
    #умолчсв "имя"=значение
для свойства и:
    #умолчсоб "имя" В<вариант> {
        скрипт-команды
    }

для события. Вариант состоит из любых 2х символов. В версии IFML 1.0 оставлен как заготовка для введения других событий по умолчанию с тем же именем.
Таким образом, после распознавания анализатором "Интерпретатора IFML" следущего кода:
    #умолчсв "описание"=Нет ничего необычного.
    #умолчсоб "исследовать" В00 {
        сказать Вы смотрите на это и видите:
        сказать сам.описание
    }
    новпред "нож"
        острый=да
        резать={
            если сам.острый="да" то сам.острый="нет" иначе сказать "Нож тупой, им ничего не разрежишь."
        }
    коннов
создастся объект предмет с именем "нож" и свойствами: описание, острый; и событиями: исследовать, резать. Если далее будут объявлены другие объекты, свойство "описание" и событие "исследовать" так же войдут в них.

 

 

4. Базовые свойства

Базовые свойства - это свойства, которые присутствуют в каждом объекте IFML. Они создаются автоматически. Таковыми являются, например, имя и УИДО (см. 0.4. Список аббревиатур и сокращений спецификации IFML). Также базовыми являются набор статусов и имя объекта в винительном падеже.
Имя объекта задаётся при его создании (слово в кавычках после ключевого слова новлок) и используется в скрипте. По другому его определить или переопределить нельзя.
УИДО вообще присутствует неявно, он задаётся автоматически при создании объекта и не может меняться, как и имя. Т.к. "Игрок", "Игровая среда"  и "Проигрыватель" тоже являются объектами, они тоже имеют базовые свойства, в том числе и УИДО. У объекта "Игровая среда" УИДО равен 1, у "Проигрывателя" - 2, а у "Игрока" - 3. УИДО, равный 0, указывает на пустой, несуществующий объект. УИДО может использоваться в скрипте как непосредственный указатель на объект.
Другие базовые свойства, которые могут изменяться непосредственно в описании объекта, определяются специальным образом. Чтобы предотвратить смешивание базовых и обычных свойств, в начале базового ставится символ собаки (@), который указывает на базовое свойство.
Таким образом, чтобы изменить винительный падеж или один из статусув объекта, нужно написать внутри описания объекта в любом месте:
    @вп = <значение> - для задания винительного падежа
    @ст <номер> = <значение> - для задания статуса.
Т.к. локации предназначены также для вмещения предметов, то присутствие предмет в локации задаётся базовым свойством @пред:
    @пред = <имя> - предмет должен быть описан ранее
Существуют также базовые свойства самой игровой среды. Но так как среда не описывается, эти свойства задаются прямо между описаниями объектов. Вот их список:

Свойство Описание
@титул заголовок окна интерпретатора
@шимя имя шрифта Windows на экране
@шраз размер шрифта
@шцвет цвет шрифта
цвет определяется кодовым словом, приведённым в таблице ниже
@цвет цвет экрана
@пом строка помощи, справочной информации, всплывающей при щелчке на пункте меню "Справка -> Об этой истории..."; если отсутсвует, интерпретатор выводит строку: "Автор ничего не сообщил..."

 

Таблица цветов

Кодовое слово Значение
Aqua  
Black  
Blue  
Fuchsia  
Gray  
Green  
Lime  
Maroon  
Navy  
Olive  
Purple  
Red  
Silver  
Teal  
White  
Yellow  
InactiveCaptionText Текущий цвет текста заголовка неактивного окна
BtnHighlight Текущий цвет подсвечивания на кнопке
3DDkShadow Только в Windows 95 или NT4.0: Тёмная тень 3х-мерных элементов отображения
3DLight Только в Windows 95 или NT4.0: Светлый цвет 3х-мерных элементов отображения (для граней, стоящих лицом к источнику света)
InfoText Только в Windows 95 или NT4.0: Цвет текста всплывающей подсказки
InfoBk Только в Windows 95 или NT4.0: Цвет фона всплывающей подсказки
Background Текущий цвет рабочего стола Windows
ActiveCaption Текущий цвет заголовка активного окна
InactiveCaption Текущий цвет заголовка неактивного окна
Menu Текущий цвет меню
Window Текущий цвет окон
WindowFrame Текущий цвет кадров окна
MenuText Текущий цвет текта меню
WindowText Текущий цвет текста в окне
CaptionText Текущий цвет заголовка активного окна
ActiveBorder Текущий цвет границы активного окна
InactiveBorder Текущий цвет границы неактивного окна
AppWorkSpace Текущий цвет рабочего пространства приложения
HighLight Текущий цвет фона выбранного текста
HighLightText Текущий цвет выбранного текста
BtnFace Текущий цвет лица кнопки
BtnShadow Текущий цвет тени от кнопки
GrayText Текущий цвет затуманненого текста
BtnText Текущий цвет текста кнопки

 

5. Скрипт Реакции Объекта (СРО)

Скрипт Реакции Объекта (СРО), или просто скрипт, состоит из языковых команд. Каждая из них должна быть на отдельной строке. Приведу их в виде списка:

Команда Описание
очистить полностью очищает экран
сказать <выражение> выводит сообщение на экран
<выражение> состоит из текста, заключённого в двойные кавычки, целых чисел, ссылок на свойства объектов, специальных символов и математических операций между ними (сложение (+), вычитание (-), умножение (*) и целочисленное деление(/)), которые (кроме сложения) действуют только на числа. Указание на свойство объекта состоит из имени объекта, точки и имени свойства. См. также следующую таблицу.

Спец. символы:
$ - перенос строки
тлок <название> устанавливает текущую локацию
конец завершает работу скрипта
идти <номер> переходит к строке скрипта, первая строка скрипта имеет номер 1
если <условие> то <команда1> [иначе <команда2>] проверяет, выполняется ли <условие>, тогда запускает <команду1>, иначе - <команду2>
<условие> состоит из двух выражений, между которыми находится знак логического сравнения (=,<,>,<=,>=,<>).
<объект.свойство> = <выражение> присваивает свойству объекта значание, полученное после вычисления выражения

Также в скрипте используются псевдо-имена, т.е. имена, которые только обозначают какой-то объект. Вот их список:

Псевдо-имя Тип Описание
сам объект обозначает объект, в котором находится данный скрипт
теклок объект обозначает объект - текущую локацию
@имя свойство указывает на имя объекта

 

Часть II. Операции с объектами

6. Перекрытие свойств

Иногда может возникнуть ситуация, когда необходимо присутствующее свойство заменить другим. Например, Вы используете свойство по умолчанию "описание", которое хотите внедрит в каждый объект, но в нескольких объектах Вам нужно его изменить. Для этого используется перекрытие свойств. Т.е. новое свойство перекрывает, закрывает собой предыдущее. Для перекрытия нужно просто описать новое свойство с точно таким же именем.
Приведу пример:
    #умолчсв "описание"=Нет ничего необычного
    #умолчсоб "исследовать" В00 {
        сказать "Вы смотрите на это и видите:"
        сказать сам.описание
    }
    новпред "нож"
        описание=Ржавый нож с насечкой на рукоятке
    коннов
Здесь свойство "описание" будет перекрывать старое с точно таким же именем. Поэтому при вводе игроком строки "исследовать нож" будет выведена строка "Ржавый нож с насечкой на рукоятке", а не "Нет ничего необычного".
"Для чего же это нужно", - спросите Вы, - "перекрывать свойство по умолчанию, ведь оно и было создано для использования?". Всё дело в том, что свойство по умолчанию вставляется в каждый следующий объект. Например, для большинства объектов Вам надо свойство с одним и тем же значением, а для нескольких - уникальные, вот только их и придётся перекрыть, а остальные будут пользоваться описаниями по умолчанию.