ТОМ - платформа для текстовых игр

Объявление

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

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.



Основы понимания ТОМ II

Сообщений 1 страница 13 из 13

1

Прототип второго ТОМа в последнее время развивается удивительно быстро. Почти каждый день выходит обновление с немалыми изменениями и доработками. У меня уже скопилось 11 версий этого прототипа. Это всё очень хорошо, но если честно, я уже давно потерял нить понимания нового языка. Этой темой я хочу исправить это недоразумение, и надеюсь ASBer мне в этом поможет (иначе, кто же ещё может помочь).

С появлением локаций код на ТОМ2 стал принимать более понятный вид, поэтому начнём с них. Для наглядности возьмём маленькую локацию:

Код:
локация улица //еще одна локация для тестирования goto
{ #enter --------------------------
  %ты вышел на свежий воздух.
  #description ------------------
  %<location>Аптека, улица, фонарь.</location>
  #exit --------------------------
  %ты вернулся в рюмочную.
}

- Итак, что-же представляет из себя это слово "локация"? Это жёстко зашитая в платформу категория или просто класс?
- Секции "enter", "description", "exit" это что-то вроде методов, которые срабатывают при определённых ситуациях? Сколько их всего? Они свои для каждой "категории"? Есть ли аналоги этих секций в русской раскладке?
- <location></location>. Это просто тэг, который выводит текст в определённом месте и ни на что ровным счётом не влияет.

Едем дальше:

Код:
  если рюмка1.не полная
  { если рюмка2.полная то %% две рюмки - полная и пустая.
    если рюмка2.не полная то %% две пустые рюмки. Одна из них всё еще запотевшая.
  }

- "не полная" - это свойство объекта "рюмка1". Почему оно с пробелами? Можно задавать любые свойства с пробелами в любом месте или только с определёнными ключами (как "не")? Точка в этом случае обязательна?
- Конструкция если .. то иногда используется без "то". Её использование придаёт лишь наглядность или в некоторых случаях выражение без "то" может быть неправильно понято парсером?
- Почему текст пишется после двух %% а не одной как раньше? Это вывод текста без переноса строки?

Код:
слово улица
  улица.ключ = ЖрЕчНд
  улица.форма Ип = улица
  улица.форма Рп = улицы
  улица.форма Дп = улице
  улица.форма Вп = улицу
  улица.форма Тп = улицей
  улица.форма Пп = улице

Почему так? Нельзя ли писать так:

Код:
слово улица
{ ключ = ЖрЕчНд
  форма Ип = улица
  форма Рп = улицы
  форма Дп = улице
  форма Вп = улицу
  форма Тп = улицей
  форма Пп = улице
}

Ммм... много ещё вопросов, но пока остановлюсь на этом. Мы же никуда не торопимся :)

2

Угу, тема хорошая, т.к. до написания мануала по ТОМ2 в ближайшее время у меня руки точно не дойдут.

Alexandr написал(а):

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

Ну это всего лишь благодаря скрытой невидимой работе, проделанной в первой половине этого года, когда закладывался базис для 2го ТОМа.

Alexandr написал(а):

Итак, что-же представляет из себя это слово "локация"? Это жёстко зашитая в платформу категория или просто класс?

если набрать >улица.тип то мы увидим что это "объект".
(правда в последней версии пользовательский режим не даст сработать такой конструкции из командной строки)
Само слово "локация" - просто ключевое слово, позволяющее создавать объекты локаций.
От других объектов локация отличается:
1. наличием кода локации в фигурных скобках {} прикреплённого к объекту
2. возможностью переходить из локации в локацию командой goto
Код локации не является ее конструктором, как это было в 1м ТОМе. Секции этого кода выполняются циклически, пока мы находимся внутри локации.

3

Alexandr написал(а):

- Секции "enter", "description", "exit" это что-то вроде методов, которые срабатывают при определённых ситуациях?

Для локации будет 4 секции:
#enter
#description
#execute (сейчас ее еще нет)
#exit
1. Секция #enter прогоняется один раз при входе в локацию.
2. Далее запускается цикл:
2.1. Секция #description выводит текущее описание локации
2.2. запрашивается ввод команды, выполняется.
2.3. Секция #execute обрабатывает произошедшие изменения.
2.4. повторяется с п.2.1
3. Секция #exit прогоняется один раз при выходе из локации командой goto.

Сколько их всего? Они свои для каждой "категории"?

Для локаций используется 4 секции, и для функций еще несколько.

Есть ли аналоги этих секций в русской раскладке?

Нет, пока нет.

- <location></location>. Это просто тэг, который выводит текст в определённом месте и ни на что ровным счётом не влияет.

Да.
А еще в этом теге можно изменить границы области вывода и цвет текста параметрами аналогично тэгу <body>

4

ASBer написал(а):

(правда в последней версии пользовательский режим не даст сработать такой конструкции из командной строки)

Проверил в предпоследней версии :)

ASBer написал(а):

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

Если это не класс, то что же? Я понимаю, что сейчас всё в ТОМе - это объекты. Слова, локации, факты - это всё объекты (или факты это не объекты?). Но раз они так сильно отличаются друг от друга и эти различия созданы не классами, то их надо как-то назвать. Можно ведь назвать это категориями? Значение, Факт, Директива, Слово, Локация... что из этого является объектами? И ещё меня смущают эти переменные... это ведь просто наименования объектов? Объекты существуют сами по себе, а переменные лишь указывают на них. Но объявляя переменную мы создаём объект:

Код:
переменная водка
  водка.класс = вещество
  водка.описание = "да, это она, родимая!".
  водка.заложена = нет, "стои`т перед тобой.".
  водка.белая = да, беленькая.

В то же время можно задать одному объекту несколько переменных:

Код:
переменная огненный_вода = водка //составное слово, синоним

При этом не создаётся новый объект, а просто две переменные указывают на один объект.
Теперь вопрос на засыпку: чем отличается создание объекта через "локацию", от создания через "переменную"?

Код:
локация улица
{
}

переменная улица

Оба способа создают объект, но разный. Отличия понятны: {} и goto, но как назвать эти отличия? "Категории", которых нет?
(Эхх... кажется я совсем ничего не понимаю :dontknow: )

5

Alexandr написал(а):

Слова, локации, факты - это всё объекты (или факты это не объекты?). Но раз они так сильно отличаются друг от друга и эти различия созданы не классами, то их надо как-то назвать. Можно ведь назвать это категориями? Значение, Факт, Директива, Слово, Локация... что из этого является объектами?

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

Значение(), Факт(), Директива() - это функции. Они не связаны ни с какими объектами. Отличаются местом и способом вызова в процессе обработки команды.

Локации и объекты - это действительно объекты :)
Код, привязанный к локации, живёт своей собственной независимой жизнью. Это вовсе не метод объекта "локация".
По всем остальным признакам локация - это обычный объект. Введение еще одного типа "локация" только запутало бы дело.

6

Alexandr написал(а):

как назвать эти отличия? "Категории", которых нет?

Это просто разные сущности. Как объект, число или строка.

7

Alexandr написал(а):

Объекты существуют сами по себе, а переменные лишь указывают на них. Но объявляя переменную мы создаём объект:

Да, создавая переменную мы сразу же создаём новый объект с таким-же именем.
вместо

Код:
переменная водка

можно было бы писать:

Код:
переменная водка = new object водка

что было бы тоже самое, но длиннее.
Кроме того конструкцию "new object водка" нельзя было бы нигде применить, кроме как в присвоении переменной, иначе объект потеряется.
Я просто сократил лишний синтаксис.

8

Alexandr написал(а):

Едем дальше:

Код:
  если рюмка1.не полная
  { если рюмка2.полная то %% две рюмки - полная и пустая.
    если рюмка2.не полная то %% две пустые рюмки. Одна из них всё еще запотевшая.
  }

- "не полная" - это свойство объекта "рюмка1". Почему оно с пробелами? Можно задавать любые свойства с пробелами в любом месте или только с определёнными ключами (как "не")? Точка в этом случае обязательна?

Базовый синтаксис свойства выглядит так: [объект1].[объект2]
В этом шаблоне вместо объекта может быть подставлено любое вычисляемое выражение, результат которого равен объекту.
"не полная" это вычисляемое выражение - операция отрицания, примененная к объекту "полная".
Точка в этом случае обязательна.

- Конструкция если .. то иногда используется без "то". Её использование придаёт лишь наглядность

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

или в некоторых случаях выражение без "то" может быть неправильно понято парсером?

Может быть, пока затрудняюсь ответить, надо поднабрать статистики.

- Почему текст пишется после двух %% а не одной как раньше? Это вывод текста без переноса строки?

Да, совершенно верно, % - вывод с новой строки, %% - вывод без переноса строки.

9

Alexandr написал(а):

Почему так? Нельзя ли писать так:

Код:
слово улица
{ ключ = ЖрЕчНд
  форма Ип = улица
  форма Рп = улицы
  форма Дп = улице
  форма Вп = улицу
  форма Тп = улицей
  форма Пп = улице
}

1. Отказавшись от методов объектов надо быть последовательным и отказаться от конструкторов, т.к. конструктор это тоже метод.
2. Всё равно не получится написать

Код:
переменная СвойствоА
переменная ОбъектБ
{
  СвойствоА = 5
}

так как в этом случае мы просто убьём объект "СвойствоА", присвоив переменной "СвойствоА" значение 5.
т.е. писать придется так:

Код:
переменная СвойствоА
переменная ОбъектБ
{
  this.СвойствоА = 5
}

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

Код:
слово улица
  @.ключ = ЖрЕчНд
  @.форма Ип = улица
  @.форма Рп = улицы
  @.форма Дп = улице
  @.форма Вп = улицу
  @.форма Тп = улицей
  @.форма Пп = улице

но это вобщем косметика и пока не самое главное...

10

Alexandr написал(а):

(Эхх... кажется я совсем ничего не понимаю  )

Я пока тоже далеко не всё понимаю  %-) , но это между нами... тссс...  :whistle:

11

Кажется начинаю вникать.

Код:
// именная группа существительное + существительное в Рп
значение(отношение сущее*Рп) //пример: содержимое рюмки, отец  Миши, любовники Эльзы
{ #parsing ----------------------------
  ошибка если отношение.поз != 1
  ошибка если сущее.ключ = "Не"
  #execute ---------------------------
  сущее.отношение
}

Так можно "выпить содержимое рюмки", "поцеловать дочь Миши" и много чего ещё не обращаясь непосредственно к объектам. Прелесть. :crazy: Сколько вкусностей предстаёт перед моими глазами. Я схожу с ума. Уже руки чешутся что-нибудь попробовать.

Можно немножко пояснений по поводу ключа "Не"? ^^

12

Alexandr написал(а):

Можно немножко пояснений по поводу ключа "Не"?

Там, где есть расхождения между синтаксисом ЕЯ и синтаксисом классических языков программирования, я по мере возможности стараюсь придерживаться ЕЯ.
В классических языках отрицание - это операция над булевыми значениями и только.
В русском языке частица "не" используется гораздо шире:
"У тебя там не закрытый, открытый перелом!" (отрицание свойства)
"Это же вам не лезгинка, а твист!" (отрицание класса)
"Не пей, Иванушка, козленочком станешь!" (отрицание действия)

Вобщем, в ТОМе отрицать можно значение любого типа в любом выражении.
В случае с булевыми значениями всё просто - всё что не да, то нет.
Применение "не" к другим типам не так однозначно, поэтому здесь применяется "отложенное" вычисление. К значению просто прибавляется ключ "Не", который передаётся дальше вместе со значением и может быть обработан там где его смысл становится ясным.

В примере выше по ключу "Не" отсекаются бессмысленные словосочетания "дочь не Миши", "содержимое не рюмки" и подобные им.

13

Alexandr написал(а):

- Секции "enter", "description", "exit" это что-то вроде методов, которые срабатывают при определённых ситуациях? Сколько их всего? Они свои для каждой "категории"? Есть ли аналоги этих секций в русской раскладке?

Добавил русские названия для секций:

#enter  = #вход
#description  = #описание
#execute  = #выполнение
#exit  = #выход
#parsing = #парсинг
#check  = #проверка