ТОМ: язык программирования: различия между версиями

Материал из IFВики
Перейти к навигации Перейти к поиску
м (~, *, :)
м
 
(не показано 209 промежуточных версий 2 участников)
Строка 1: Строка 1:
 
Справочник по языку программирования платформы [[ТОМ]].
 
Справочник по языку программирования платформы [[ТОМ]].
  
страничка в разработке...
+
Страничка заморожена. Все особенности ТОМа, не описанные ниже, являются недокументированными.
  
 
{{Содержание справа}}
 
{{Содержание справа}}
Строка 34: Строка 34:
  
 
=====key=====
 
=====key=====
Лингвистический ключ - строка специального формата. В выражениях может применяться без кавычек.
+
Морфологический ключ - строка [[ТОМ: Морфологический ключ|специального формата]]. В лингвистических операциях может применяться без кавычек.
  
 
=====lexeme=====
 
=====lexeme=====
Лексема - строка специального формата
+
Лексема - строка [[ТОМ: Лексема |специального формата]]
  
 
====null====
 
====null====
 
Пустое значение.
 
Пустое значение.
 
Обращение к несуществующим свойствам, функциям и переменным всегда возвращает null.
 
Обращение к несуществующим свойствам, функциям и переменным всегда возвращает null.
В логических операциях null выполняет роль 3го логического значения "неизвестно".
+
В логических операциях null эквивалентно значению false.
 +
В операциях сравнения null не равен ни одному значению, кроме себя самого.
 
Все остальные операции с null всегда возвращают null.
 
Все остальные операции с null всегда возвращают null.
  
Строка 49: Строка 50:
  
 
====object.form====
 
====object.form====
Объект с указанными аспектом и формой
+
Объект с указанными аспектом и формой. При присвоении преобразуется в строку, содержащую наименование объекта в требуемой форме.
  
 
====object.item====
 
====object.item====
Строка 104: Строка 105:
  
 
=== Логические операции ===
 
=== Логические операции ===
====! / не====
+
Значение null в логических операциях эквивалентно false.
Логическое отрицание
 
  
не true = false
+
====!, not, не (логическое отрицание)====
  
не false = true
+
! true = false
  
не null = null
+
! false = true
  
 +
! null = true
  
====| / or / или====
+
====|, ||, or, или (логическое сложение)====
Логическое сложение
 
  
true или true = true
+
true || true = true
  
true или false = true
+
true || false = true
  
true или null = true
+
false || true = true
  
false или true = true
+
false || false = false
  
false или false = false
+
====&, &&, and, и (логическое умножение)====
  
false или null = null
+
true && true = true
  
null или true = true
+
true && false = false
  
null или false = null
+
false && true = false
  
null или null = null
+
false && false = false
  
 +
===Лингвистические операторы===
 +
Для синтеза текста в выражениях используются операторы:
 +
~, *, :
  
====& / and / и====
+
====Оператор <nowiki>:</nowiki>====
Логическое умножение
+
Оператор аспекта. Используется для указания аспекта объекта. В качестве аспекта может использоваться имя любого текстового свойства этого объекта. По умолчанию используется свойство title.
  
true и true = true
+
Пример:
 +
unique Test //создаем объект и задаем текстовые свойства
 +
{ title = "тестов% объект%; Мр; Ип; Ип=ы,; Рп=ого,а;"
 +
  description = "описание тестового объекта"
 +
  add_property = "дополнительное свойство"
 +
}
  
true и false = false
+
Выводим аспекты объекта:
 +
%{Test:title}
 +
%{Test:description}
 +
%{Test:add_property}
  
true и null = null
+
На экран выводится:
 +
тестовый объект
 +
описание тестового объекта
 +
дополнительное свойство
  
false и true = false
+
Применение аспекта имеет смысл для свойств с типом [[TOM: язык программирования#lexeme|лексема]].
 +
Для обычных строковых свойств оператор ":" эквивалентен оператору "."
  
false и false = false
+
Для сравнения:
 +
%{Test:title} //лексема
 +
%{Test.title}
 +
%
 +
%{Test:description} //строка
 +
%{Test.description}
  
false и null = false
+
На экран выводится:
 +
тестовый объект
 +
тестов% объект%; Мр; Ип; Ип=ы,; Рп=ого,а;
 +
 +
описание тестового объекта
 +
описание тестового объекта
  
null и true = null
+
====Оператор <nowiki>*</nowiki>====
 +
Оператор используется для согласования формы объекта с [[ТОМ: Лингвистический ключ|лингвистическим ключом]] или другим объектом.
  
null и false = false
+
====Оператор ~====
 +
Оператор используется для выделения части лингвистического ключа.
  
null и null = null
+
===Парсерные операторы===
 +
Парсерные операторы позволяют передать объекту произвольную строку, которая далее анализируется парсером и обрабатывается подобно команде, введенной игроком.
  
===Лингвистические операторы===
+
Все парсерные операторы имеют одинаковый синтаксис:
Для синтеза текста в выражениях используются операторы ~, *, :
+
Obj x Str
 +
где:
 +
*Obj - значение с типом объект,
 +
*Str - значение с типом строка,
 +
*x - один из следующих парсерных операторов:
 +
==== > фраза диалога====
 +
Оператор ">" используется для вставки в диалог фразы Str от имени Obj.
 +
При этом фраза обрабатывается подобно фразе введенной игроком.
 +
Т.е. другие персонажи могут отреагировать на произнесенную фразу запрограммированным для них образом.
  
<nowiki>:</nowiki> - оператор используется для указания аспекта объекта. В качестве аспекта может использоваться имя любого текстового свойства этого объекта. По умолчанию используется свойство title.
+
==== < действие====
 +
Оператор "<" предписывает объекту Obj выполнить команду Str.
 +
Строка Str может содержать любую понятную (или не понятную) парсеру команду.
 +
Команда будет обработана парсером аналогично команде, введенной игроком.
 +
По умолчанию, если Obj не управляется игроком, сообщения парсера на экран не выводятся.
  
<nowiki>*</nowiki> - оператор используется для согласования формы объекта с лингвистическим ключом или другим объектом.
 
  
~ - оператор используется для выделения части лингвистического ключа.
 
  
 
==Конструкции языка==
 
==Конструкции языка==
Строка 177: Строка 215:
  
 
==Команды языка==
 
==Команды языка==
 +
===%===
 +
Вывод текста на экран. Текстом считается вся строка после знака %.
 +
%Тест //на экран будет выведен текст "Тест"
 +
 
===debug / отладка===
 
===debug / отладка===
 
*debug on / отладка вкл - включает режим отладки;
 
*debug on / отладка вкл - включает режим отладки;
Строка 184: Строка 226:
 
===run / запустить===
 
===run / запустить===
 
*run "file name" / запустить "имя файла" - запускает на исполнение указанный файл.
 
*run "file name" / запустить "имя файла" - запускает на исполнение указанный файл.
 +
run "help.txt" //очистка данных, выполнение модуля help.txt
  
 
При этом происходит потеря всех текущих данных.
 
При этом происходит потеря всех текущих данных.
Строка 189: Строка 232:
 
===include / загрузить===
 
===include / загрузить===
 
*include "file name" / загрузить "имя файла" - загружает и выполняет указанный файл.  
 
*include "file name" / загрузить "имя файла" - загружает и выполняет указанный файл.  
 +
include "help.txt" //выполнение модуля help.txt поверх существующих данных
  
Используется при модульной организации кода.
+
Используется для модульной организации кода.
  
 
===return / возврат===
 
===return / возврат===
Строка 214: Строка 258:
  
 
Результат: создана и инициализирована переменная X.
 
Результат: создана и инициализирована переменная X.
 +
 +
===Глобальные переменные===
 +
Глобальные переменные на самом деле являются свойствами объекта global.
 +
После объявления свойства global как:
 +
global.X = 5
 +
доступ к этому свойству возможен как к обычной переменной:
 +
X = 55
 +
var Y = X
 +
В отличии от локальных переменных, глобальные переменные могут иметь относительные значения также как свойства объектов.
 +
 +
 +
 +
====global.secret====
 +
Переменная предназначенна для передачи "секретного" сообщения между модулями игры.
 +
Это единственная переменная, которая сохраняет свое значение при рестарте, при загрузке новой игры или при загрузке модуля игры.
 +
 +
  
 
==Константы==
 
==Константы==
 
===null / пусто===
 
===null / пусто===
*Используется в выражениях. Задает пустое значение.
+
*Константа используется в выражениях. Задает пустое значение.
  
 
===true, yes / истина, да===
 
===true, yes / истина, да===
*Используется в выражениях. Задает истинное логическое значение.
+
*Константа используется в выражениях. Задает истинное логическое значение.
  
 
===false, no / ложь, нет===
 
===false, no / ложь, нет===
*Используется в выражениях. Задает ложное логическое значение.
+
*Константа используется в выражениях. Задает ложное логическое значение.
 +
 
 +
===frontend===
 +
*Константа используется в выражениях. Возвращает строку с именем используемого интерфейса (исполняемого файла). Например "constom.exe" или "Milena.exe".
 +
 
 +
==Специальные контекстные значения==
 +
===this===
 +
''(только для чтения)''
 +
 
 +
Во время выполнения метода this указывает на объект, которому принадлежит выполняемый метод.
 +
 
 +
===act===
 +
===actor===
 +
===talker===
 +
===addressee===
 +
===told===
 +
===addressed===
  
 
==Объекты==
 
==Объекты==
*Свойства объектов
+
Под объектом подразумевается некоторая сущность, обладающая [[TOM: язык программирования#.name / .имя|именем]], свойствами и поведением.
*Элементы объектов
+
 
*Методы объектов
+
Каждый объект принадлежит к одной из [[TOM: язык программирования#Категории объектов|категорий]] и может принадлежать некоторому [[TOM: язык программирования#class / класс|классу]].
 +
Категория и класс объекта в свою очередь частично (или полностью) определяют поведение объекта.
 +
 
 +
Основное отличие категорий от классов заключается в том, что поведение класса объекта программируется разработчиком игры, в то время как поведение категории жестко определено разработчиком платформы.
 +
 
 +
===Свойства объектов===
 +
Свойство объекта - это переменная, связанная с объектом. Все данные объекта хранятся в его свойствах. Доступ к свойствам осуществляется по их имени.
 +
Синтаксис:
 +
obj.prop = х //присваивает свойству 'prop' значение 'x'
 +
var x = obj.prop //читает значение свойства 'prop'
 +
 
 +
Где:
 +
*obj - любой объект
 +
*prop - имя свойства объекта
 +
 
 +
====Относительные значения свойств====
 +
Помимо основного значения свойства объектов могут содержать относительные значения.
 +
 
 +
Синтаксис:
 +
obj.prop = х //присваивает 'x' как основное значение свойства 'prop'
 +
                    //все относительные значения свойства уничтожаются
 +
obj.prop[] = х //присваивает 'x' как основное значение свойства 'prop'
 +
                      //все относительные значения свойства сохраняются
 +
obj.prop[i] = х //присваивает 'x' как относительное значение свойства 'prop' для 'i'
 +
 +
obj.prop = null //уничтожает основное и все относительные значения свойства 'prop'
 +
obj.prop[] = null //уничтожает основное значениe свойства 'prop'
 +
obj.prop[i] = null //уничтожает относительное значениe свойства 'prop' для 'i'
 +
 +
var x = obj.prop //читает значение свойства 'prop' для актера. Эквивалентно x = obj.prop[actor]
 +
var x = obj.prop[] //читает основное значение свойства 'prop' независимо от actor
 +
var x = obj.prop[i] //читает относительное значение свойства 'prop' для 'i'
 +
 
 +
Где:
 +
*obj - любой объект
 +
*prop - имя свойства объекта
 +
*i - числовоe или строковое значение, либо объект
 +
 
 +
 
 +
Основные отличия от массивов:
 +
*нет такого понятия как размер массива;
 +
*могут быть "дыры" в заполнении. Например, если значение .prop[3] не задано, то x = obj.prop[3] вернет основное значение obj.prop;
 +
*индекс i может быть не только числом, но и строкой, а также объектом;
 +
*если значение задано относительно класса, оно будет действовать для всех его элементов.
 +
 
 +
 
 +
Пример использования:
 +
class гном
 +
{ ... }
 +
unique великан
 +
{ ... }
 +
unique вход_в_шахту
 +
{ //описание
 +
  описание = "Круглая дыра в скале"
 +
  описание[гном] = "Вход в шахту. Сделан гномами и для гномов" //действует для всех гномов
 +
  описание[великан] = "Маленькая мерзкая дыра в скале. Тебе туда не залезть. Пахнет гномами."
 +
  //флаги
 +
  можно_пройти[гном] = да //действует для всех гномов
 +
  можно_пройти[великан] = нет
 +
}
 +
 
 +
===Элементы объекта===
 +
Объект может содержать в себе множество вложенных объектов.
 +
Смысловая интерпретация вложения одного объекта в другой может быть различной и зависит как от [[TOM: язык программирования#Категории объектов|категорий объектов]] так и от замысла [[Автор|автора]] игры.
 +
Обращение к вложенным объектам осуществляется через специальное свойство [[TOM: язык программирования#.item / .элемент|.item / .элемент]]
 +
Корзинка.item //возвращает все объекты внутри корзинки
 +
 
 +
Корзинка.item.num //возвращает количество объектов внутри корзинки
 +
 
 +
Корзинка.item[3] //возвращает 3й объект в корзинке
 +
 
 +
Для вложенных объектов предусмотрен фильтр [[TOM: язык программирования#Оператор :|по аспекту]]
 +
Корзинка.item:пирожок //возвращает все объекты, для которых определено свойство .пирожок
 +
 
 +
Корзинка.item:пирожок.num //возвращает количество пирожков внутри корзинки
 +
 
 +
Корзинка.item:пирожок[1] //возвращает 1й пирожок из корзинки
 +
 
 +
Также возможно согласование вложенных объектов:
 +
Корзинка.item*Пп //возвращает перечень предметов из корзинки в предложном падеже.
 +
 
 +
===Методы объектов===
 +
Метод - это функция, принадлежащая объекту.
 +
 
 +
Как и процедура в процедурном программировании, метод состоит из некоторого количества операторов для выполнения какого-то действия, имеет набор входных аргументов и возвращаемое значение.
  
 
==Категории объектов==
 
==Категории объектов==
 
Все объекты в системе делятся на несколько предопределенных категорий. Каждая категория выполняет свою роль. Различия в поведении объектов разных категорий заложены на уровне платформы. Одни и те же операции для различных категорий выполняются по-разному.
 
Все объекты в системе делятся на несколько предопределенных категорий. Каждая категория выполняет свою роль. Различия в поведении объектов разных категорий заложены на уровне платформы. Одни и те же операции для различных категорий выполняются по-разному.
 +
 +
Узнать категорию объекта можно с помощью специального свойства [[TOM: язык программирования#.ctg / .категория|.ctg]]
 +
 +
 
===location / локация===
 
===location / локация===
 
Объекты категории location используются для организации пространства игры.
 
Объекты категории location используются для организации пространства игры.
При входе персонажа в локацию автоматически отображается наименование (.title) и описание (.description) локации.
+
При входе [[TOM: язык программирования#pers / перс|персонажа]] в локацию автоматически отображается наименование (.title) и описание (.description) локации.
  
 
Пример:
 
Пример:
 
  location комната //создаем новую локацию
 
  location комната //создаем новую локацию
  .title = "маленькая комната" //задаем наименование
+
  { title = "маленькая комната" //задаем наименование
.description = "это светлое и уютное помещение." //задаем описание
+
  description = "это светлое и уютное помещение." //задаем описание
 +
}
 
или
 
или
 
  локация комната //создаем новую локацию
 
  локация комната //создаем новую локацию
  .наименование = "маленькая комната" //задаем наименование
+
  { наименование = "маленькая комната" //задаем наименование
.описание = "это светлое и уютное помещение." //задаем описание
+
  описание = "это светлое и уютное помещение." //задаем описание
 +
}
 +
Локация может содержать в себе другие локации, уникальные и счетные объекты, мыслимые объекты. Для [[TOM: язык программирования#Элементы объекта|элементов локации]] подразумевается что они находятся в этой локации.
  
 
===unique / уникальное===
 
===unique / уникальное===
 +
unique - категория уникальных объектов, существующих в единственном экземпляре.
 +
 +
Пример:
 +
unique кувшин //создаем уникальный объект
 +
комната + кувшин //помещаем объект в локацию
 +
или
 +
уникальное кувшин //создаем уникальный объект
 +
комната + кувшин //помещаем объект в локацию
 +
 +
Положение уникального объекта всегда однозначно определено и может быть получено через специальное свойство [[TOM: язык программирования#.pos / .поз|.pos]], а локация через свойство [[TOM: язык программирования#.loc / .лок|.loc]]
 +
 +
Уникальный объект может содержать в себе локации, другие уникальные объекты, счетные и мыслимые объекты. Для [[TOM: язык программирования#Элементы объекта|элементов уникального объекта]] подразумевается что они или находятся внутри этого объекта, или являются его частью, или собственностью .
 +
 
===class / класс===
 
===class / класс===
 +
Под классом подразумевается объект, который задает некоторое общее поведение для других объектов. Таким образом, любой объект может принадлежать или не принадлежать определенному классу, то есть обладать или не обладать поведением, которое данный класс подразумевает.
 +
 
===counting / счетное===
 
===counting / счетное===
 +
counting - категория счетных, неразличимых объектов.
 +
 
===mental / мыслимое===
 
===mental / мыслимое===
 +
mental - категория мыслимых, не существующих физически объектов.
 +
 
===action / действие===
 
===action / действие===
 
action - специальная категория объектов, предназначенная для описания команд, распознаваемых парсером.
 
action - специальная категория объектов, предназначенная для описания команд, распознаваемых парсером.
Строка 256: Строка 443:
 
=====Переменные в шаблоне=====
 
=====Переменные в шаблоне=====
 
Шаблон может включать в себя переменные различных типов.
 
Шаблон может включать в себя переменные различных типов.
Переменная задается специальным знаком и именем после знака. После имени переменной может быть указан аспект и лингвистический ключ.
+
Переменная задается специальным знаком и именем роли после знака. После имени роли переменной может быть указан аспект и лингвистический ключ.
 
Например:
 
Например:
  .шаблон = "осмотреть @Объект:Предмет*ВпЕч"
+
  шаблон = "осмотреть @Объект:Предмет*ВпЕч"
 
где:
 
где:
 
*@ - символ, указывающий тип переменной;
 
*@ - символ, указывающий тип переменной;
*Объект - имя переменной;
+
*Объект - имя роли переменной;
 
*Предмет - аспект объекта;
 
*Предмет - аспект объекта;
 
*ВпЕч - лингвистический ключ.
 
*ВпЕч - лингвистический ключ.
Строка 273: Строка 460:
 
*$ - строковая переменная.
 
*$ - строковая переменная.
  
=====перегрузка системных команд=====
+
=====Перехват системных команд=====
 +
Если шаблон совпадает с одной из [[TOM: язык программирования#Системные команды|системных команд]] и действие будет выполнено без ошибки - стандартная обработка команды выполняться не будет.
 +
 
 +
Пример:
 +
action NoSave
 +
{ шаблон = "save=сохранить"
 +
}
 +
 +
Мышонок.NoSave( ){ %сохранение запрещено! }
  
 
====проверки====
 
====проверки====
Строка 286: Строка 481:
 
*Все проверки работают в общем контексте. Т.e. переменная, созданная при выполнении проверки, доступна во всех проверках, выполняемых позже.
 
*Все проверки работают в общем контексте. Т.e. переменная, созданная при выполнении проверки, доступна во всех проверках, выполняемых позже.
  
*При наследовании объекта action от класса, методы класса также используются в качестве проверок. При перегрузке метода класса в наследнике, в качестве проверки последовательно выполняются и метод наследника и метод класса.
+
*При наследовании объекта action от класса, методы класса также используются в качестве проверок. При перегрузке метода класса в наследнике, в качестве проверки выполняется метод наследника.
 
=====Проверки переменных=====
 
=====Проверки переменных=====
 
Метод объекта action, имя которого совпадает с именем переменной в шаблоне, и который имеет один аргумент, совпадающий с этой же переменной, является проверкой для значений этой переменной.
 
Метод объекта action, имя которого совпадает с именем переменной в шаблоне, и который имеет один аргумент, совпадающий с этой же переменной, является проверкой для значений этой переменной.
 
  action Осмотреть //создаем действие осмотреть
 
  action Осмотреть //создаем действие осмотреть
  .pat = "осмотреть @Предмет" //добавляем шаблон с переменной "Предмет"
+
  { pat = "осмотреть @Предмет" //добавляем шаблон с переменной "Предмет"
.Предмет(Предмет) //добавляем проверку для переменной "Предмет"
+
  Предмет(Предмет) //добавляем проверку для переменной "Предмет"
{ if(Предмет==pers)
+
  {
    return "ты не можешь себя увидеть!" //сообщение об ошибке
+
    if (Предмет == pers)
 +
      return "ты не можешь себя осмотреть!" //сообщение об ошибке
 +
  }
 
  }
 
  }
  
 
=====комбинационные проверки=====
 
=====комбинационные проверки=====
 
=====порядок выполнения проверок=====
 
=====порядок выполнения проверок=====
 +
 +
===phrase / фраза===
 +
phrase - специальная категория, предназначенная для описания диалоговых фраз, распознаваемых парсером.
 +
 +
  
 
==Предопределенные объекты==
 
==Предопределенные объекты==
Строка 316: Строка 518:
 
Персонажем может быть только уникальный объект.
 
Персонажем может быть только уникальный объект.
  
При старте системы pers == global
+
При старте системы значением переменной pers является объект global.
 +
 
 +
====Смена персонажа====
 +
unique главный_герой //создаем уникальный объект
 +
{
 +
    //... описание главного героя
 +
}
 +
pers = главный_герой //передаем управление на новый объект
 +
 
 +
Если смена персонажа приводит к изменению текущей локации, для новой локации вызывается обработчик события OnEnter().
 +
 
 +
==Предопределенные свойства==
 +
[[Изображение:TOM_prop.gif]]
 +
==Специальные поля значений==
 +
Для любого [[TOM: язык программирования#Типы данных|типа данных]] возможен доступ к дополнительным полям.
 +
 
 +
(Но не для всех типов данных эти поля имеют смысл).
 +
 
 +
===typ / тип===
 +
''(только для чтения)''
 +
 
 +
Возвращает строковое значение соответстующее [[TOM: язык программирования#Типы данных|типу значения]].
 +
 
 +
Работает для всех типов данных.
  
 +
===str / строка===
 +
''(только для чтения)''
  
Управление персонажем:
+
Для строки возвращает ту же строку.
  
unique GG //создаем уникальный объект
+
Для объекта, полученного из парсера, возвращает слово, которым объект назван в команде.
  
pers = GG //передаем управление на объект GG
+
Для объекта, полученного функцией set( ), возвращает строку, использованную в функции.
  
pers.title = "главный герой" //меняем свойство GG
+
Для прочих типов возвращает пустую строку.
  
===this / это===
 
Во время выполнения метода, this указывает на объект, которому принадлежит выполняемый метод.
 
  
===actor / актер===
+
===num / число===
actor указывает на объект, от имени которого выполняется действие.
+
''(только для чтения)''
actor не изменяется при вызове методов других объектов.
 
По умолчанию значения всех относительных свойств возвращаются относительно объекта actor.
 
  
===act / акт===
+
Для числа возвращает то же число.
act указывает на объект категории action и соответствует действию, выполняемому в данный момент.
 
act имеет смысл в методах, вызываемых парсером и после парсера. Во всех остальных случаях значение act равно null.
 
  
==Свойства объектов==
+
Для объекта возвращает количество объектов.
===Относительные свойства объектов===
+
 
===Предопределенные свойства объектов===
+
Для прочих типов возвращает 0.
====.name / имя====
+
 
 +
 
 +
===obj / объект===
 +
''(только для чтения)''
 +
 
 +
Возвращает "чистый" объект без примеси количества и положения.
 +
 
 +
===key / ключ===
 +
''(только для чтения)''
 +
 
 +
 
 +
===pos / поз===
 +
''(только для чтения)''
 +
 
 +
Физическое месторасположение объекта, его позиция.
 +
 
 +
Имеет смысл только для объектов категории Unique, Counting и Location.
 +
* для уникальных объектов .pos всегда возвращает объект на|в котором уникальный объект находится. Для уникального объекта его позиция всегда однозначно определена.
 +
* для локации .pos работает только если локация вставлена в другую локацию или объект (например сцена в зрительном зале или салон автобуса в автобусе). Иначе .pos возвращает null.
 +
* для счетных объектов .pos имеет значение только если объект получен из парсера или из другого объекта через .item
 +
 
 +
Для прочих значений .pos возвращает null.
 +
 
 +
==Специальные свойства объектов==
 +
===name / имя===
 
Возвращает программное имя объекта.
 
Возвращает программное имя объекта.
  
 
''(только для чтения)''
 
''(только для чтения)''
  
====.loc / .лок====
+
===loc / лок===
 
Возвращает локацию, в которой находится объект.
 
Возвращает локацию, в которой находится объект.
  
Строка 355: Строка 600:
 
''(только для чтения)''
 
''(только для чтения)''
  
====.pos / .поз====
 
''(только для чтения)''
 
  
====.cls / .класс====
+
===cls / класс===
 
Синтаксис: O.cls
 
Синтаксис: O.cls
  
Строка 373: Строка 616:
 
Где: C - объект категории class.
 
Где: C - объект категории class.
  
====.typ / .тип====
+
===ctg / категория===
Синтаксис: X.typ
+
Синтаксис: O.ctg
 +
 
 +
Где: O - любой объект.
  
Где: X - любое значение.
+
Возвращает строковое значение соответстующее категории объекта O.
  
Возвращает строковое значение соответстующее типу значение X.
+
''(только для чтения)''
  
 +
===lex / лексема===
 
''(только для чтения)''
 
''(только для чтения)''
  
====.ctg / .категория====
+
===pat / шаблон===
Синтаксис: O.ctg
+
Cвойство используется для установки [[TOM: язык программирования#Шаблоны|парсерных шаблонов]] для объектов категорий action, phrase и event.
 +
Количество шаблонов для одного объекта не ограничено.
 +
 
 +
''(только для записи)''
 +
 
 +
Пример
 +
action осмотреть //создаем действие "осмотреть"
 +
{ pat = "осмотреть" //задаем 1й шаблон
 +
  pat = "осмотреть @объект" //задаем 2й шаблон
 +
  pat = "осмотреть @какой @объект" //задаем 3й шаблон
 +
}
 +
 
 +
===item / элемент===
 +
Свойство item предоставляет доступ к [[TOM: язык программирования#Элементы объекта|вложенным объектам]].
  
Где: O - любой объект.
+
===title / наименование===
  
Возвращает строковое значение соответстующее категории объекта O.
+
===menu_name / заголовок_меню===
  
''(только для чтения)''
+
==Сообщения парсера==
 +
Сообщения парсера хранятся в предопределенных глобальных переменных.
 +
ТОМ инициализирует их при старте, затем они могут быть переопределены в любое время. Более того, свойства с этими же именами могут быть прописаны для актера, для действия или фразы, а также для объекта.
 +
При возникновении ошибки парсер ищет необходимое сообщение для объекта относительно действия, если не найдено - для действия относительно актера, если не найдено - для актера, и затем в объекте global.
  
====.str / .строка====
+
Для парсерных сообщений зарезервированы следующие имена:
''(только для чтения)''
+
===is_not_recognized===
 +
*Это сообщение парсер выводит когда введенную команду не удалось сопоставить ни с одним шаблоном действий или фраз.
 +
> подумай о сыре
 +
Это предложение непонятно!
  
====.num / .число====
+
===number_is_expected===
''(только для чтения)''
+
*Это сообщение выводится когда в шаблоне команды указана числовая переменная, а игрок ввел слово. Например, ''первый'' вместо 1, или ''пара'' вместо 2.
 +
> возьми несколько горошин
 +
Необходимо указать число.
  
====.obj / .объект====
+
===unknown_word===
''(только для чтения)''
+
*Это сообщение выводится когда в команде использовано слово, не соответствующие ни одному объекту в игре, или написанное с ошибками.
 +
> возьми горохи из мешка
 +
Слово <горохи> мне неизвестно.
  
====.key / .ключ====
+
===incorrect_form===
''(только для чтения)''
+
*Это сообщение выводится когда слово в команде стоит в форме, не соответствующей форме, заданной в шаблоне команды.
 +
> возьми горохом из мешка
 +
"горохом" - слово в неверной форме.
  
====.syn / .синоним====
+
===object_not_found===
''(только для чтения)''
+
*Это сообщение выводится когда найденный парсером объект находится вне текущей локации, при том что в шаблоне команды указано его обязательное присутствие.
 +
> осмотри филина
 +
Филин отсутствует.
  
====.lex / .лексема====
+
===unusable_object===
''(только для записи)''
+
* Это сообщение выводится когда найденный парсером объект не обладает свойством, указанном в шаблоне, или не принадлежит к классу, указанному в шаблоне.
 +
> брось крота
 +
Дядюшка-крот не годится для этого действия.
  
====.pat / .шаблон====
+
===too_difficult_statement===
Cвойство используется для установки парсерных шаблонов для объекта категории action.
+
*Это сообщение выводится в случае, если парсинг команды требует перебора вариантов, количество которых превышает разумные пределы.
Количество шаблонов для одного действия не ограничено.
 
  
''(только для записи)''
+
===object_select===
 +
*Это сообщение выводится при устранении неопределенности перед списком неоднозначно распознанных объектов:
 +
> взять еду
 +
Непонятно, что имелось в виду: малина в траве,
 +
стручок гороха на грядке, стручок гороха в траве, 
 +
сушеные горошины в траве или малина на кустах;
  
Пример
+
===сan_not_execute===
action осмотреть //создаем действие "осмотреть"
+
*Это сообщение выводится когда введенная команда распознана, но для актера не задан метод для ее выполнения.
.pat = "осмотреть" //задаем 1й шаблон
+
  > Крот, осмотри мешок
  .pat = "осмотреть @объект" //задаем 2й шаблон
+
  Побойтесь бога! Крот слеп от рождения!
  .pat = "осмотреть @какой @объект" //задаем 3й шаблон
 
  
====.item / .элемент====
+
===no_reply===
 +
*Это сообщение выводится когда введенная строка распознана как фраза, но никто из присутствующих в локации на неё не ответил.
 +
> расскажите мне про лес!
 +
Мышонку никто не ответил...
  
====.title / .наименование====
+
==Предопределенные методы объектов==
====.description / .описание====
 
====.menu_name / .заголовок_меню====
 
  
==Обработка событий==
 
 
Для каждого объекта можно задать реакцию на события, которые с ним происходят.
 
Для каждого объекта можно задать реакцию на события, которые с ним происходят.
  
 
Нижеописанные методы выполняют обработку событий:
 
Нижеописанные методы выполняют обработку событий:
  
===.ChkMoveObj( ) / .ПроверкаПеремещенияОбъекта( )===
+
===menu() / меню()===
 +
 
 +
===ChkMoveObj( ) / ПроверкаПеремещенияОбъекта( )===
 
Метод вызывается перед попыткой перемещения объекта.
 
Метод вызывается перед попыткой перемещения объекта.
 
В этом методе можно разместить проверки на возможность перемещения.
 
В этом методе можно разместить проверки на возможность перемещения.
 
Если метод возвратит true - перемещение выполняется, если false - отменяется.
 
Если метод возвратит true - перемещение выполняется, если false - отменяется.
  
===.BefMoveObj( ) / .ПередПеремещениемОбъекта( )===
+
===BefMoveObj( ) / ПередПеремещениемОбъекта( )===
 
Метод вызывается перед перемещением объекта.
 
Метод вызывается перед перемещением объекта.
  
===.AftMoveObj( ) / .ПослеПеремещенияОбъекта( )===
+
===OnEnter( ) / НаВход( )===
 +
Обработчик события вызывается в случае когда персонаж, управляемый игроком, входит в локацию.
 +
Вызов происходит после перемещения персонажа в локацию, но до события AftMoveObj( ).
 +
 
 +
Также этот обработчик вызывается при переключении управления на другого персонажа, если персонажи находятся в различных локациях.
 +
 
 +
Метод OnEnter( ) должен быть определен для локации, но вызывается от имени управляемого персонажа.
 +
 
 +
===AftMoveObj( ) / ПослеПеремещенияОбъекта( )===
 
Метод вызывается после перемещения объекта.
 
Метод вызывается после перемещения объекта.
  
===.background( ) / ФоновыеДействия( )===
+
===background( ) / ФоновыеДействия( )===
 
Метод используется для описания фоновых действий.
 
Метод используется для описания фоновых действий.
  
 
После каждого хода вызывается для объекта global, локации, в которой находится pers, и для всех объектов, находящихся в той же локации что и pers, за исключением самого объекта pers.
 
После каждого хода вызывается для объекта global, локации, в которой находится pers, и для всех объектов, находящихся в той же локации что и pers, за исключением самого объекта pers.
  
===.persbackground( ) / ФоновыеДействияПерсонажа( )===
+
===persbackground( ) / ФоновыеДействияПерсонажа( )===
 
Метод используется для описания фоновых действий объекта pers.
 
Метод используется для описания фоновых действий объекта pers.
  
Строка 454: Строка 742:
  
 
==Функции==
 
==Функции==
===rnd() / шанс()===
+
===Преобразование типов===
===menu() / меню()===
+
===Работа со строками===
===set() / сет()===
+
===Прочие функции===
 +
====rnd() / шанс()====
 +
Синтаксис: rnd( )
 +
* Функция возвращает логическое значение ''да'' или ''нет'' с вероятностью 50/50.
 +
 
 +
 
 +
Синтаксис: rnd(X)
 +
- где X - число больше нуля.
 +
* Функция возвращает случайное число в диапазоне от 1 до X включительно.
 +
 
 +
====set() / сет()====
 +
====input() / ввод()====
 +
====media() / медиа()====
  
 
==Теги==
 
==Теги==
Строка 468: Строка 768:
 
Ниже описаны теги, автоматически вставляемые ТОМом в выводимый текст в специальных случаях:
 
Ниже описаны теги, автоматически вставляемые ТОМом в выводимый текст в специальных случаях:
  
====<location></location>====
 
При входе персонажа в локацию автоматически отображается название локации и её описание.
 
Название локации при этом заключается в тег:
 
<location>Название локации</location>
 
Опираясь на этот тег, название локации в интерфейсной оболочке может быть выделено цветом или помещено в специальное поле.
 
  
====<menu></menu>, <menu_item></menu_item>====
+
'''<menu></menu>, <menu_item></menu_item>'''
 +
 
 
Для локаций автоматически генерируется строка меню.  
 
Для локаций автоматически генерируется строка меню.  
 
Строка меню включает специальные теги и имет следующий формат:
 
Строка меню включает специальные теги и имет следующий формат:
Строка 483: Строка 779:
 
Используя эти теги, интерфейсная оболочка может формировать меню в виде набора кнопок, списком или другим образом.
 
Используя эти теги, интерфейсная оболочка может формировать меню в виде набора кнопок, списком или другим образом.
  
===Теги оболочки ConTOM===  
+
===Теги оболочки Constom===  
 
Интерфейсная оболочка ConTOM обрабатывает теги:
 
Интерфейсная оболочка ConTOM обрабатывает теги:
 
*<location></location> - выделяет наименование локации цветом.
 
*<location></location> - выделяет наименование локации цветом.
 
*<menu></menu> - выделяет строку меню цветом.
 
*<menu></menu> - выделяет строку меню цветом.
 
*<pause> - приостанавливает вывод текста до нажатия любой кнопки.
 
*<pause> - приостанавливает вывод текста до нажатия любой кнопки.
 +
*<clear> - очищает экран.
 
*<nowiki><font color=Color></nowiki> - изменяет цвет шрифта. Color должен быть из списка: black, navy, green, teal, maroon, purple, olive, silver, gray, blue, lime, aqua, red, fuchsia, yellow или white.
 
*<nowiki><font color=Color></nowiki> - изменяет цвет шрифта. Color должен быть из списка: black, navy, green, teal, maroon, purple, olive, silver, gray, blue, lime, aqua, red, fuchsia, yellow или white.
 
*<nowiki></font></nowiki> - возвращает серый цвет шрифта.
 
*<nowiki></font></nowiki> - возвращает серый цвет шрифта.
Строка 493: Строка 790:
  
 
==Системные команды==
 
==Системные команды==
 +
В данном разделе описаны команды вводимые игроком, реакция на которые предопределена на уровне платформы.
 +
 +
Автору игры не нужно делать никаких дополнительных усилий для обработки этих команд, но при необходимости есть возможность [[TOM: язык программирования#Перехват системных команд|перехвата системных команд]] в коде игры.
 +
 
===help, помощь, ?===
 
===help, помощь, ?===
===run, start, запустить, загрузить===
+
Команда help запускает на исполнение файл help.txt из каталога игры.
 +
Авторам рекомендуется размещать в этом файле помощь по прохождению игры.
 +
 
 +
===run, start, запустить===
 +
Команда позволяет выбрать и запустить новую игру из файла с расширением .tom, .txt или .tgs
 +
 
 +
При выборе файла с расширением .tgs загрузка происходит аналогично команде load.
 +
 
 
===save, сохранить===
 
===save, сохранить===
===load, восстановить===
+
Команда save позволяет сохранить текущее состояние игры в файл с расширением .tgs
 +
 
 +
Сохранять файлы необходимо в каталог игры.
 +
 
 +
Файлы сохраненной игры имеет обычный текстовый формат.
 +
 
 +
===load, загрузить===
 +
Команда load восстанавливает состояние игры из файла .tgs, сохраненного ранее командой save.
 +
 
 
===undo, отмена===
 
===undo, отмена===
 +
В текущей версии ТОМа команда не реализована.
 +
 
===restart, заново===
 
===restart, заново===
 +
Команда restart запускает игру с начала, либо загружает последнее сохранение, сохраненное командой save или загруженное командой load.
 +
 +
===exit, quit, выход===
 +
Команда закрывает приложение без сохранения данных.
 +
 +
[[Категория:Документация ТОМ]]

Текущая версия на 14:43, 5 декабря 2011

Справочник по языку программирования платформы ТОМ.

Страничка заморожена. Все особенности ТОМа, не описанные ниже, являются недокументированными.

Содержание

Типы данных

Основные типы

Значения основных типов данных могут участвовать в выражениях и присваиваться переменным и свойствам объектов.

number

Число. Числовым типом может быть представлено любое целое число. Над данными числового типа действуют основные арифметические операции.

bool

Логический тип данных. Может принимать значение "да" (true) или "нет" (false). Над данными логического типа действуют операции булевой алгебры.

object

Объект. Объектным типом может быть представлен любой существующий объект. Значения этого типа предоставляют доступ к свойствам и методам объекта.

Помимо ссылки на объект, объектный тип данных несет дополнительную информацию о количестве объектов (.num) и о положении объекта (.pos).

Объектные переменные возвращаемые парсером, дополнительно несут информацию о том каким словом был назван объект в команде (.str) и в какой форме находится это слово (.key).

string

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

key

Морфологический ключ - строка специального формата. В лингвистических операциях может применяться без кавычек.

lexeme

Лексема - строка специального формата

null

Пустое значение. Обращение к несуществующим свойствам, функциям и переменным всегда возвращает null. В логических операциях null эквивалентно значению false. В операциях сравнения null не равен ни одному значению, кроме себя самого. Все остальные операции с null всегда возвращают null.

Производные типы

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

object.form

Объект с указанными аспектом и формой. При присвоении преобразуется в строку, содержащую наименование объекта в требуемой форме.

object.item

Группа объектов, принадлежащих другому объекту, с указанными аспектом и формой

Преобразование типов

При использовании в операции данных различных типов, интерпретатор пытается привести правый операнд к типу левого операнда.


Например:

5 + "5" == 5 + 5 == 10

"5" + 5 == "5" + "5" == "55"

Операторы

=

Оператор "=" используется:


  • Для присвоения значений:

Синтаксис: A = Б

где: A - переменная или свойство, Б - значение или вычисляемое выражение

результат: переменной (свойству) А присваивается значение Б.


  • Для определения строчных синонимов:

Синтаксис: "А" = "Б" = "В"

где: А, Б, В - строки, не содержащие пробелов

результат: при парсинге строки Б и В подменяются строкой А


  • Для определения объектов-синонимов:

Синтаксис: A = Б

где: А и Б - объекты

результат: объект Б становится синонимом объекта А.

+, -, *, /

Математические операторы


==, !=-<>, >, <, >=, <=

Операторы сравнения значений


Логические операции

Значение null в логических операциях эквивалентно false.

!, not, не (логическое отрицание)

! true = false

! false = true

! null = true

|, ||, or, или (логическое сложение)

true || true = true

true || false = true

false || true = true

false || false = false

&, &&, and, и (логическое умножение)

true && true = true

true && false = false

false && true = false

false && false = false

Лингвистические операторы

Для синтеза текста в выражениях используются операторы:

~, *, :

Оператор :

Оператор аспекта. Используется для указания аспекта объекта. В качестве аспекта может использоваться имя любого текстового свойства этого объекта. По умолчанию используется свойство title.

Пример:

unique Test //создаем объект и задаем текстовые свойства
{ title = "тестов% объект%; Мр; Ип; Ип=ы,; Рп=ого,а;"
  description = "описание тестового объекта"
  add_property = "дополнительное свойство"
}

Выводим аспекты объекта:

%{Test:title} 
%{Test:description}
%{Test:add_property}

На экран выводится:

тестовый объект
описание тестового объекта
дополнительное свойство

Применение аспекта имеет смысл для свойств с типом лексема. Для обычных строковых свойств оператор ":" эквивалентен оператору "."

Для сравнения:

%{Test:title} //лексема
%{Test.title} 
%
%{Test:description} //строка
%{Test.description}

На экран выводится:

тестовый объект
тестов% объект%; Мр; Ип; Ип=ы,; Рп=ого,а;

описание тестового объекта
описание тестового объекта

Оператор *

Оператор используется для согласования формы объекта с лингвистическим ключом или другим объектом.

Оператор ~

Оператор используется для выделения части лингвистического ключа.

Парсерные операторы

Парсерные операторы позволяют передать объекту произвольную строку, которая далее анализируется парсером и обрабатывается подобно команде, введенной игроком.

Все парсерные операторы имеют одинаковый синтаксис:

Obj x Str

где:

  • Obj - значение с типом объект,
  • Str - значение с типом строка,
  • x - один из следующих парсерных операторов:

> фраза диалога

Оператор ">" используется для вставки в диалог фразы Str от имени Obj. При этом фраза обрабатывается подобно фразе введенной игроком. Т.е. другие персонажи могут отреагировать на произнесенную фразу запрограммированным для них образом.

< действие

Оператор "<" предписывает объекту Obj выполнить команду Str. Строка Str может содержать любую понятную (или не понятную) парсеру команду. Команда будет обработана парсером аналогично команде, введенной игроком. По умолчанию, если Obj не управляется игроком, сообщения парсера на экран не выводятся.


Конструкции языка

if-else / если-иначе

for / цикл

break / прервать

continue / продолжить

while / пока

break / прервать

continue / продолжить

switch-case / выбор-случай

Команды языка

%

Вывод текста на экран. Текстом считается вся строка после знака %.

%Тест //на экран будет выведен текст "Тест"

debug / отладка

  • debug on / отладка вкл - включает режим отладки;
  • debug off / отладка выкл - выключает режим отладки;
  • debug "message" / отладка "сообщение" - в режиме отладки выводит сообщение на экран.

run / запустить

  • run "file name" / запустить "имя файла" - запускает на исполнение указанный файл.
run "help.txt" //очистка данных, выполнение модуля help.txt

При этом происходит потеря всех текущих данных.

include / загрузить

  • include "file name" / загрузить "имя файла" - загружает и выполняет указанный файл.
include "help.txt" //выполнение модуля help.txt поверх существующих данных

Используется для модульной организации кода.

return / возврат

Переменные

Интерпретатор использует не типизированные переменные. Любой переменной можно присвоить значения любого типа.

Переменная, определенная в методе объекта, существует до конца выполнения метода.

Неинициализированная переменная имеет значение null.

var / переменная

Синтаксис: var X

Синтаксис: переменная X

Результат: создана переменная X, значение переменное равно null.


Синтаксис: var X = 0

Синтаксис: переменная X = 0

Результат: создана и инициализирована переменная X.

Глобальные переменные

Глобальные переменные на самом деле являются свойствами объекта global. После объявления свойства global как:

global.X = 5

доступ к этому свойству возможен как к обычной переменной:

X = 55
var Y = X

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


global.secret

Переменная предназначенна для передачи "секретного" сообщения между модулями игры. Это единственная переменная, которая сохраняет свое значение при рестарте, при загрузке новой игры или при загрузке модуля игры.


Константы

null / пусто

  • Константа используется в выражениях. Задает пустое значение.

true, yes / истина, да

  • Константа используется в выражениях. Задает истинное логическое значение.

false, no / ложь, нет

  • Константа используется в выражениях. Задает ложное логическое значение.

frontend

  • Константа используется в выражениях. Возвращает строку с именем используемого интерфейса (исполняемого файла). Например "constom.exe" или "Milena.exe".

Специальные контекстные значения

this

(только для чтения)

Во время выполнения метода this указывает на объект, которому принадлежит выполняемый метод.

act

actor

talker

addressee

told

addressed

Объекты

Под объектом подразумевается некоторая сущность, обладающая именем, свойствами и поведением.

Каждый объект принадлежит к одной из категорий и может принадлежать некоторому классу. Категория и класс объекта в свою очередь частично (или полностью) определяют поведение объекта.

Основное отличие категорий от классов заключается в том, что поведение класса объекта программируется разработчиком игры, в то время как поведение категории жестко определено разработчиком платформы.

Свойства объектов

Свойство объекта - это переменная, связанная с объектом. Все данные объекта хранятся в его свойствах. Доступ к свойствам осуществляется по их имени. Синтаксис:

obj.prop = х //присваивает свойству 'prop' значение 'x'
var x = obj.prop //читает значение свойства 'prop'

Где:

  • obj - любой объект
  • prop - имя свойства объекта

Относительные значения свойств

Помимо основного значения свойства объектов могут содержать относительные значения.

Синтаксис:

obj.prop = х //присваивает 'x' как основное значение свойства 'prop'
                    //все относительные значения свойства уничтожаются
obj.prop[] = х //присваивает 'x' как основное значение свойства 'prop'
                      //все относительные значения свойства сохраняются
obj.prop[i] = х //присваивает 'x' как относительное значение свойства 'prop' для 'i'

obj.prop = null //уничтожает основное и все относительные значения свойства 'prop'
obj.prop[] = null //уничтожает основное значениe свойства 'prop'
obj.prop[i] = null //уничтожает относительное значениe свойства 'prop' для 'i'

var x = obj.prop //читает значение свойства 'prop' для актера. Эквивалентно x = obj.prop[actor]
var x = obj.prop[] //читает основное значение свойства 'prop' независимо от actor
var x = obj.prop[i] //читает относительное значение свойства 'prop' для 'i'

Где:

  • obj - любой объект
  • prop - имя свойства объекта
  • i - числовоe или строковое значение, либо объект


Основные отличия от массивов:

  • нет такого понятия как размер массива;
  • могут быть "дыры" в заполнении. Например, если значение .prop[3] не задано, то x = obj.prop[3] вернет основное значение obj.prop;
  • индекс i может быть не только числом, но и строкой, а также объектом;
  • если значение задано относительно класса, оно будет действовать для всех его элементов.


Пример использования:

class гном
{ ... }
unique великан
{ ... }
unique вход_в_шахту
{ //описание
  описание = "Круглая дыра в скале"
  описание[гном] = "Вход в шахту. Сделан гномами и для гномов" //действует для всех гномов
  описание[великан] = "Маленькая мерзкая дыра в скале. Тебе туда не залезть. Пахнет гномами."
  //флаги
  можно_пройти[гном] = да //действует для всех гномов
  можно_пройти[великан] = нет
}

Элементы объекта

Объект может содержать в себе множество вложенных объектов. Смысловая интерпретация вложения одного объекта в другой может быть различной и зависит как от категорий объектов так и от замысла автора игры. Обращение к вложенным объектам осуществляется через специальное свойство .item / .элемент

Корзинка.item //возвращает все объекты внутри корзинки
Корзинка.item.num //возвращает количество объектов внутри корзинки
Корзинка.item[3] //возвращает 3й объект в корзинке

Для вложенных объектов предусмотрен фильтр по аспекту

Корзинка.item:пирожок //возвращает все объекты, для которых определено свойство .пирожок
Корзинка.item:пирожок.num //возвращает количество пирожков внутри корзинки
Корзинка.item:пирожок[1] //возвращает 1й пирожок из корзинки

Также возможно согласование вложенных объектов:

Корзинка.item*Пп //возвращает перечень предметов из корзинки в предложном падеже.

Методы объектов

Метод - это функция, принадлежащая объекту.

Как и процедура в процедурном программировании, метод состоит из некоторого количества операторов для выполнения какого-то действия, имеет набор входных аргументов и возвращаемое значение.

Категории объектов

Все объекты в системе делятся на несколько предопределенных категорий. Каждая категория выполняет свою роль. Различия в поведении объектов разных категорий заложены на уровне платформы. Одни и те же операции для различных категорий выполняются по-разному.

Узнать категорию объекта можно с помощью специального свойства .ctg


location / локация

Объекты категории location используются для организации пространства игры. При входе персонажа в локацию автоматически отображается наименование (.title) и описание (.description) локации.

Пример:

location комната //создаем новую локацию
{ title = "маленькая комната" //задаем наименование
  description = "это светлое и уютное помещение." //задаем описание
}

или

локация комната //создаем новую локацию
{ наименование = "маленькая комната" //задаем наименование
  описание = "это светлое и уютное помещение." //задаем описание
}

Локация может содержать в себе другие локации, уникальные и счетные объекты, мыслимые объекты. Для элементов локации подразумевается что они находятся в этой локации.

unique / уникальное

unique - категория уникальных объектов, существующих в единственном экземпляре.

Пример:

unique кувшин //создаем уникальный объект
комната + кувшин //помещаем объект в локацию

или

уникальное кувшин //создаем уникальный объект
комната + кувшин //помещаем объект в локацию

Положение уникального объекта всегда однозначно определено и может быть получено через специальное свойство .pos, а локация через свойство .loc

Уникальный объект может содержать в себе локации, другие уникальные объекты, счетные и мыслимые объекты. Для элементов уникального объекта подразумевается что они или находятся внутри этого объекта, или являются его частью, или собственностью .

class / класс

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

counting / счетное

counting - категория счетных, неразличимых объектов.

mental / мыслимое

mental - категория мыслимых, не существующих физически объектов.

action / действие

action - специальная категория объектов, предназначенная для описания команд, распознаваемых парсером.

Шаблоны

Синонимы в шаблоне
Переменные в шаблоне

Шаблон может включать в себя переменные различных типов. Переменная задается специальным знаком и именем роли после знака. После имени роли переменной может быть указан аспект и лингвистический ключ. Например:

шаблон = "осмотреть @Объект:Предмет*ВпЕч"

где:

  • @ - символ, указывающий тип переменной;
  • Объект - имя роли переменной;
  • Предмет - аспект объекта;
  • ВпЕч - лингвистический ключ.


В шаблоне возможно использование следующих типов переменных:

  • @ - объекты, присутствующие в текущей локации;
  • ~ - объекты, присутствующие в локации и подходящие для действия, но не упомянутые в команде напрямую;
  • & - объекты, независимо от их местонахождения;
  • # - числовая переменная;
  • $ - строковая переменная.
Перехват системных команд

Если шаблон совпадает с одной из системных команд и действие будет выполнено без ошибки - стандартная обработка команды выполняться не будет.

Пример:

action NoSave
{ шаблон = "save=сохранить"
}

Мышонок.NoSave( ){ %сохранение запрещено! }

проверки

Методы объектов action используются в качестве проверок и вызываются парсером в процессе обработки анализируемой команды.

Проверка считается проваленной, если возвращает непустое строковое значение. Парсер выводит эту строку как сообщение об ошибке.

Использование методов в качестве проверок имеет некоторые принципиальные отличия:

  • Все переменные, определенные в проверяемом шаблоне, доступны во время выполнения проверки, независимо от того, указаны ли они в аргументах метода.
  • Все проверки работают в общем контексте. Т.e. переменная, созданная при выполнении проверки, доступна во всех проверках, выполняемых позже.
  • При наследовании объекта action от класса, методы класса также используются в качестве проверок. При перегрузке метода класса в наследнике, в качестве проверки выполняется метод наследника.
Проверки переменных

Метод объекта action, имя которого совпадает с именем переменной в шаблоне, и который имеет один аргумент, совпадающий с этой же переменной, является проверкой для значений этой переменной.

action Осмотреть //создаем действие осмотреть
{ pat = "осмотреть @Предмет" //добавляем шаблон с переменной "Предмет"
  Предмет(Предмет) //добавляем проверку для переменной "Предмет"
  {
    if (Предмет == pers)
      return "ты не можешь себя осмотреть!" //сообщение об ошибке
  }
}
комбинационные проверки
порядок выполнения проверок

phrase / фраза

phrase - специальная категория, предназначенная для описания диалоговых фраз, распознаваемых парсером.


Предопределенные объекты

global / глобал

global - системный объект. Используется для хранения глобальных переменных и функций. Создается при старте системы.

global.title содержит наименование системы "ТОМ"

global.description - номер версии и прочую информацию.

Свойства и методы global доступны в контексте других объектов как глобальные функции и переменные.

pers / перс

pers - системная переменная, указывающая на объект, управляемый игроком.

Персонажем может быть только уникальный объект.

При старте системы значением переменной pers является объект global.

Смена персонажа

unique главный_герой //создаем уникальный объект
{
   //... описание главного героя
}
pers = главный_герой //передаем управление на новый объект

Если смена персонажа приводит к изменению текущей локации, для новой локации вызывается обработчик события OnEnter().

Предопределенные свойства

TOM prop.gif

Специальные поля значений

Для любого типа данных возможен доступ к дополнительным полям.

(Но не для всех типов данных эти поля имеют смысл).

typ / тип

(только для чтения)

Возвращает строковое значение соответстующее типу значения.

Работает для всех типов данных.

str / строка

(только для чтения)

Для строки возвращает ту же строку.

Для объекта, полученного из парсера, возвращает слово, которым объект назван в команде.

Для объекта, полученного функцией set( ), возвращает строку, использованную в функции.

Для прочих типов возвращает пустую строку.


num / число

(только для чтения)

Для числа возвращает то же число.

Для объекта возвращает количество объектов.

Для прочих типов возвращает 0.


obj / объект

(только для чтения)

Возвращает "чистый" объект без примеси количества и положения.

key / ключ

(только для чтения)


pos / поз

(только для чтения)

Физическое месторасположение объекта, его позиция.

Имеет смысл только для объектов категории Unique, Counting и Location.

  • для уникальных объектов .pos всегда возвращает объект на|в котором уникальный объект находится. Для уникального объекта его позиция всегда однозначно определена.
  • для локации .pos работает только если локация вставлена в другую локацию или объект (например сцена в зрительном зале или салон автобуса в автобусе). Иначе .pos возвращает null.
  • для счетных объектов .pos имеет значение только если объект получен из парсера или из другого объекта через .item

Для прочих значений .pos возвращает null.

Специальные свойства объектов

name / имя

Возвращает программное имя объекта.

(только для чтения)

loc / лок

Возвращает локацию, в которой находится объект.

Для уникальных объектов локация всегда определена. Для прочих категорий - зависит от обстоятельств.

(только для чтения)


cls / класс

Синтаксис: O.cls

Где: O - любой объект.

Возвращает объект, являющийся классом для объекта O.

Если класс не задан, O.cls возвращает null.

Для смены класса, свойству объекта .cls необходимо присвоить новое значение:

O.cls = С

Где: C - объект категории class.

ctg / категория

Синтаксис: O.ctg

Где: O - любой объект.

Возвращает строковое значение соответстующее категории объекта O.

(только для чтения)

lex / лексема

(только для чтения)

pat / шаблон

Cвойство используется для установки парсерных шаблонов для объектов категорий action, phrase и event. Количество шаблонов для одного объекта не ограничено.

(только для записи)

Пример

action осмотреть //создаем действие "осмотреть"
{ pat = "осмотреть" //задаем 1й шаблон
  pat = "осмотреть @объект" //задаем 2й шаблон
  pat = "осмотреть @какой @объект" //задаем 3й шаблон
}

item / элемент

Свойство item предоставляет доступ к вложенным объектам.

title / наименование

menu_name / заголовок_меню

Сообщения парсера

Сообщения парсера хранятся в предопределенных глобальных переменных. ТОМ инициализирует их при старте, затем они могут быть переопределены в любое время. Более того, свойства с этими же именами могут быть прописаны для актера, для действия или фразы, а также для объекта. При возникновении ошибки парсер ищет необходимое сообщение для объекта относительно действия, если не найдено - для действия относительно актера, если не найдено - для актера, и затем в объекте global.

Для парсерных сообщений зарезервированы следующие имена:

is_not_recognized

  • Это сообщение парсер выводит когда введенную команду не удалось сопоставить ни с одним шаблоном действий или фраз.
> подумай о сыре
Это предложение непонятно!

number_is_expected

  • Это сообщение выводится когда в шаблоне команды указана числовая переменная, а игрок ввел слово. Например, первый вместо 1, или пара вместо 2.
> возьми несколько горошин
Необходимо указать число.

unknown_word

  • Это сообщение выводится когда в команде использовано слово, не соответствующие ни одному объекту в игре, или написанное с ошибками.
> возьми горохи из мешка
Слово <горохи> мне неизвестно.

incorrect_form

  • Это сообщение выводится когда слово в команде стоит в форме, не соответствующей форме, заданной в шаблоне команды.
> возьми горохом из мешка
"горохом" - слово в неверной форме.

object_not_found

  • Это сообщение выводится когда найденный парсером объект находится вне текущей локации, при том что в шаблоне команды указано его обязательное присутствие.
> осмотри филина
Филин отсутствует.

unusable_object

  • Это сообщение выводится когда найденный парсером объект не обладает свойством, указанном в шаблоне, или не принадлежит к классу, указанному в шаблоне.
> брось крота
Дядюшка-крот не годится для этого действия.

too_difficult_statement

  • Это сообщение выводится в случае, если парсинг команды требует перебора вариантов, количество которых превышает разумные пределы.

object_select

  • Это сообщение выводится при устранении неопределенности перед списком неоднозначно распознанных объектов:
> взять еду
Непонятно, что имелось в виду: малина в траве, 
стручок гороха на грядке, стручок гороха в траве,  
сушеные горошины в траве или малина на кустах;

сan_not_execute

  • Это сообщение выводится когда введенная команда распознана, но для актера не задан метод для ее выполнения.
> Крот, осмотри мешок
Побойтесь бога! Крот слеп от рождения!

no_reply

  • Это сообщение выводится когда введенная строка распознана как фраза, но никто из присутствующих в локации на неё не ответил.
> расскажите мне про лес!
Мышонку никто не ответил...

Предопределенные методы объектов

Для каждого объекта можно задать реакцию на события, которые с ним происходят.

Нижеописанные методы выполняют обработку событий:

menu() / меню()

ChkMoveObj( ) / ПроверкаПеремещенияОбъекта( )

Метод вызывается перед попыткой перемещения объекта. В этом методе можно разместить проверки на возможность перемещения. Если метод возвратит true - перемещение выполняется, если false - отменяется.

BefMoveObj( ) / ПередПеремещениемОбъекта( )

Метод вызывается перед перемещением объекта.

OnEnter( ) / НаВход( )

Обработчик события вызывается в случае когда персонаж, управляемый игроком, входит в локацию. Вызов происходит после перемещения персонажа в локацию, но до события AftMoveObj( ).

Также этот обработчик вызывается при переключении управления на другого персонажа, если персонажи находятся в различных локациях.

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

AftMoveObj( ) / ПослеПеремещенияОбъекта( )

Метод вызывается после перемещения объекта.

background( ) / ФоновыеДействия( )

Метод используется для описания фоновых действий.

После каждого хода вызывается для объекта global, локации, в которой находится pers, и для всех объектов, находящихся в той же локации что и pers, за исключением самого объекта pers.

persbackground( ) / ФоновыеДействияПерсонажа( )

Метод используется для описания фоновых действий объекта pers.

После каждого хода вызывается только для объекта pers.

Функции

Преобразование типов

Работа со строками

Прочие функции

rnd() / шанс()

Синтаксис: rnd( )

  • Функция возвращает логическое значение да или нет с вероятностью 50/50.


Синтаксис: rnd(X) - где X - число больше нуля.

  • Функция возвращает случайное число в диапазоне от 1 до X включительно.

set() / сет()

input() / ввод()

media() / медиа()

Теги

ТОМ поддерживает вставку управляющих тегов в выводимый текст. Теги обрабатываются на стороне интерфейсной оболочки. Различные оболочки могут поддерживать различные наборы тегов. Для механизмов ядра ТОМа теги абсолютно прозрачны и ни как не влияют на его работу. Также есть несколько служебных тегов вставляемых в текст автоматически.

Теги TOMа

Ниже описаны теги, автоматически вставляемые ТОМом в выводимый текст в специальных случаях:


<menu></menu>, <menu_item></menu_item>

Для локаций автоматически генерируется строка меню. Строка меню включает специальные теги и имет следующий формат:

<menu>Заголовок меню: 
<menu_item>1 элемент меню</menu_item>, 
<menu_item>2 элемент меню</menu_item>,
<menu_item>3 элемент меню</menu_item></menu>

Используя эти теги, интерфейсная оболочка может формировать меню в виде набора кнопок, списком или другим образом.

Теги оболочки Constom

Интерфейсная оболочка ConTOM обрабатывает теги:

  • <location></location> - выделяет наименование локации цветом.
  • <menu></menu> - выделяет строку меню цветом.
  • <pause> - приостанавливает вывод текста до нажатия любой кнопки.
  • <clear> - очищает экран.
  • <font color=Color> - изменяет цвет шрифта. Color должен быть из списка: black, navy, green, teal, maroon, purple, olive, silver, gray, blue, lime, aqua, red, fuchsia, yellow или white.
  • </font> - возвращает серый цвет шрифта.

Все прочие теги консольной оболочкой игнорируются и не влияют на ее работу.

Системные команды

В данном разделе описаны команды вводимые игроком, реакция на которые предопределена на уровне платформы.

Автору игры не нужно делать никаких дополнительных усилий для обработки этих команд, но при необходимости есть возможность перехвата системных команд в коде игры.

help, помощь, ?

Команда help запускает на исполнение файл help.txt из каталога игры. Авторам рекомендуется размещать в этом файле помощь по прохождению игры.

run, start, запустить

Команда позволяет выбрать и запустить новую игру из файла с расширением .tom, .txt или .tgs

При выборе файла с расширением .tgs загрузка происходит аналогично команде load.

save, сохранить

Команда save позволяет сохранить текущее состояние игры в файл с расширением .tgs

Сохранять файлы необходимо в каталог игры.

Файлы сохраненной игры имеет обычный текстовый формат.

load, загрузить

Команда load восстанавливает состояние игры из файла .tgs, сохраненного ранее командой save.

undo, отмена

В текущей версии ТОМа команда не реализована.

restart, заново

Команда restart запускает игру с начала, либо загружает последнее сохранение, сохраненное командой save или загруженное командой load.

exit, quit, выход

Команда закрывает приложение без сохранения данных.