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

Объявление

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

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

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



vTOM2

Сообщений 31 страница 60 из 90

31

Узлы "act" и "action" как-то отличаются?

32

"act" игнорируй, эти объекты не обрабатываются движком, задел на будущее.

33

Я так понимаю, у слова и предлоги не могут наследоваться? Тогда я выношу их в отдельный список.
Ещё вопрос возник: допустим мы хотим сделать проверку на наличие слова для вновь создаваемого объекта. Пользователь создаёт объект, допустим, с именем "Алиса". Такого слова нет в стандартной библиотеке, т.е. платформа не сможет определять объект по введённым командам типа "осм Алису". Значит, нужно добавить слово в словарь. Редактор должен предупреждать и предлагать пользователю создать слово к объекту. Как ему определить, что для объекта необходимо добавить слово?
Можно было бы просто проводить поиск в словаре по имени созданного объекта, но имя ведь может быть чем-то типа "на_поверхности", "в_башне". Меня это сбивает с толку.

Отредактировано Alexandr (2014-09-20 09:14:29)

34

И ещё вопрос: почему переменные наследуются от классов?

Код:
  <variable>дворянин
    <cls>аристократ</cls>
  </variable>

Как вообще такое возможно? Это же обычная глобальная переменная. Какое может быть наследование? Если заглянуть в старый dic_viewer, то там про дворянина пишется так:

Код:
var дворянин=аристократ

Никакого наследования, просто приравнивание. Я совсем запутался.

Вот ещё нечто необычное:

Код:
  <variable>оглядеться
    <cls>осмотреться</cls>
    <arg>оглядись Акт*Пф!е</arg>
  </variable>

Какие аргументы у переменной???  o.O

Отредактировано Alexandr (2014-09-20 10:58:41)

35

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

Я так понимаю, у слова и предлоги не могут наследоваться? Тогда я выношу их в отдельный список.

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

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

Как ему определить, что для объекта необходимо добавить слово?
Можно было бы просто проводить поиск в словаре по имени созданного объекта, но имя ведь может быть чем-то типа "на_поверхности", "в_башне".

все идентификаторы в коде делятся на 2 типа:
1. называемые словами;
2. не называемые словами.
Все объекты и переменные 1 типа могут упоминаться игроком в командах ЕЯ.
Все служебные и вспомогательные объекты и переменные должны называться именами 2 типа.

К идентификаторам 2-го типа однозначно можно отнести всё, начинающееся со знаков "_" и "@".
Все остальные идентификаторы потенциально могут быть названы словом или словосочетанием.
Составные идентификаторы, образованные с помощью знаков "_" и ":" относятся к 1 типу, если все части идентификатора до первого ":" совпадают c каким-либо словом или любой его словоформой.

Вот такое сложное правило =)

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

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

почему переменные наследуются от классов?

Код:
  <variable>дворянин
    <cls>аристократ</cls>
  </variable>

Как вообще такое возможно? Это же обычная глобальная переменная. Какое может быть наследование? Если заглянуть в старый dic_viewer, то там про дворянина пишется так:

Код:
var дворянин=аристократ

Да, в данном случае "cls" лучше заменить на "value"
Сделаю в следующей выгрузке.

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

Вот ещё нечто необычное:

Код:
  <variable>оглядеться
    <cls>осмотреться</cls>
    <arg>оглядись Акт*Пф!е</arg>
  </variable>

Да, <arg> здесь действительно не нужен, остался в базе от предыдущего варианта как рудимент.
Я сейчас не делаю какого-либо анализа данных при формировании XML, в выгрузку попадает всё что есть в базе.

36

Похоже там бардак какой-то. Элементы <arg> ты сказал игнорировать. Но от элемента

Код:
  <act>перемещение
    <cls>действие</cls>
  </act>

наследуется куча других объектов, например:

Код:
  <action>ползти в локацию
    <cls>перемещение</cls>
    <arg>ползи#Пф!е, location Мст#Ап!е</arg>
    <code>--check--
if(loc==Мст) fail, "ты уже здесь"
pers.может_действовать
Ok
--execute--
//pers._перемещение = word ползти
goto Мст</code>
  </action>

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

37

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

Похоже там бардак какой-то. Элементы <arg> ты сказал игнорировать. Но от элемента

тут <act> видимо, а не <arg>?

Объекты типа <act> игнорируются в том смысле, что от них сейчас не образуется никакого кода, и в файле tom.dic их нет.
А на дереве объектов это вполне себе полноценный узел.

Теги <cls> (<cls>перемещение</cls>) внутри функций, тоже игнорируются в коде, и нужны только для построения дерева.
Иначе все функции были бы в одном плоском списке.
Нет такого понятия как наследование функций.

<act_sin> это отдельный вопрос. Там с тегом <cls> такая же ерунда как у <variable>.
http://se.uploads.ru/sKiq4.png

38

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

Да, в данном случае "cls" лучше заменить на "value"
Сделаю в следующей выгрузке.

Можешь сделать новую выгрузку с такой заменой в variable и act_sin? А так-же убрать arg из переменных, если не сложно.

И ещё напиши немного про атрибуты <attribute>. Где используются, что могут содержать (наследование <cls>, код <code>...). И в каком виде их лучше отображать?

Отредактировано Alexandr (2014-09-21 13:17:48)

39

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

Можешь сделать новую выгрузку с такой заменой в variable и act_sin? А так-же убрать arg из переменных, если не сложно.

Не сложно, сделаю конечно. Но не раньше понедельника =)

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

И ещё напиши немного про атрибуты <attribute>. Где используются, что могут содержать (наследование <cls>, код <code>...).

Атрибут (признак), это грубо говоря класс для логических свойств.
Объект типа attribute больше всего похож на class, только для класса экземпляром является объект, а для атрибута - логическое свойство объекта.
Если объекту присваивается свойство и имя свойства присутствует в списке атрибутов, это свойство обрабатывается как экземпляр атрибута.
Значение атрибута объекта может быть только логического типа.

Есть несколько операций с атрибутами:
<obj>.attribute //возвращает список истинных признаков объекта <obj>
<list> / <attr> //отбирает из списка <list> объекты с истинным значением признака <attr>

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

Наследоваться attribute может от class или от другого attribute.
Может содержать свойства и методы.

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

И в каком виде их лучше отображать?

Отображать в общем дереве вместе с классами.

40

Мдя. Со стандартной библиотекой придётся повозиться. Уже сейчас сделано 4 списка: Слова, Предлоги, Атрибуты и Элементы - основной список в котором хранятся собственно классы, функции и переменные. Атрибуты пока вынес в отдельный список, т.к. они не выстроены в дерево и попросту засоряют просмотр дерева классов, отображаясь в корне как один длиннющий список. Пока делал поддержку стандартной библиотеки, всплыла куча нюансов с наследованием. Раньше наследование было занесено списком имён, а ссылки просто не заполнялись. Сейчас же понадобились эти ссылки, а там оказался бардак. Нужно немного переделать архитектуру дерева объектов.

41

Свежая выгрузка с исправлениями!
https://cloud.mail.ru/public/790c87d40252/tomdic.xml

42

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

43

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

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

Надо. Из-за совпадения имён элементов в ст. библиотеке у меня уже были небольшие сложности. А если убрать слова из ст.библиотеки, то остальные элементы не будут совпадать именами?

44

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

А если убрать слова из ст.библиотеки, то остальные элементы не будут совпадать именами?

В ТОМе есть 3 пространства имён:
- слова и предлоги
- классы
- все остальные объектные значения

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

45

Аж целых три? Всё больше тайн открывается.

Сейчас в редакторе создано 10 типов элементов. Если сопоставить их с пространствами имён, то получится примерно следующее:
Класс = 2. классы
Слово = 1. слова и предлоги
Предлог = 1. слова и предлоги
Атрибут = ???
Локация = 3. остальные объектные значения
Объект = 3. остальные объектные значения
Функция = ???
Папка = <вне пространств>
Проект = <вне пространств>
Переменная = ???

Необходимо сопоставить все типы с пространствами имён, чтобы во-первых сделать проверку на уникальность имён, а во-вторых чтобы правильно построить дерево наследования.
Сейчас в редакторе наследование поддерживают следующие элементы: Класс, Атрибут, Локация, Объект, Функция, Переменная.
Наследоваться элемент, на сколько я понял, может от любого другого элемента, поддерживающего наследование. Но вот, например, классы и локации находятся в разных пространствах имён. Т.е. когда есть класс "корабль" и локация "корабль", и ещё одна локация создана с "cls = корабль", то от какого элемента она наследована?

И ещё, буквально сейчас заметил в выгрузке XML:

Код:
<fact>наличие признака
    <cls>факт</cls>
    <arg>все:видимое Обж#Ип, attribute Atr</arg>
    <code>...</code>
  </fact>

Но никакого объекта с именем "факт" нет, кроме слова. Так элементы могут наследоваться от слов?

46

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

Сейчас в редакторе создано 10 типов элементов. Если сопоставить их с пространствами имён, то получится примерно следующее:
Класс = 2. классы
Слово = 1. слова и предлоги
Предлог = 1. слова и предлоги
Атрибут = ???
Локация = 3. остальные объектные значения
Объект = 3. остальные объектные значения
Функция = ???
Папка = <вне пространств>
Проект = <вне пространств>
Переменная = ???


Класс = 2. классы
Слово = 1. слова и предлоги
Предлог = 1. слова и предлоги
Атрибут = 3. остальные объектные значения
Локация = 3. остальные объектные значения
Объект = 3. остальные объектные значения
Функция = <вне пространств>
Папка = <вне пространств>
Проект = <вне пространств>
Переменная = <вне пространств>

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

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

47

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

Но никакого объекта с именем "факт" нет, кроме слова. Так элементы могут наследоваться от слов?

Это ошибка выгрузки.
С базе есть объект с именем "факт", выгрузку исправлю.

48

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

Т.е. когда есть класс "корабль" и локация "корабль", и ещё одна локация создана с "cls = корабль", то от какого элемента она наследована?

От класса.
Попытка наследовать от локации вызовет ошибку интерпретатора.

A is B //B тут всегда класс (или attribute, если A тоже attribute)

49

Свежая выгрузка с исправлениями:
https://cloud.mail.ru/public/790c87d40252/tomdic.xml

Добавил привязку к словам, вернул факт на место.

50

Код:
<class>человек
    <cls>@раса</cls>
    <cls>@раса</cls>
    <word>человек</word>
    <code>...</code>
  </class>

Тоже нехорошая подлянка.
http://se.uploads.ru/0YZ95.png

51

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

Тоже нехорошая подлянка.

Угу, завтра поправлю.

52

Что-то никак не хватает мощности текущего редактора свойств чтобы сделать их красивое наследование. Пожалуй тоже уйду в рефакторинг и перепишу его немного по другому. Надеюсь, на пол года не затянется :P

53

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

Пожалуй тоже уйду в рефакторинг и перепишу его немного по другому. Надеюсь, на пол года не затянется

:D  :D  :D  удачи! рефакторинг, он такой - затягивает  :D  :D  :D
Не знаю, заметил ли ты, или еще нет: Свойства могут наследоваться от методов(секций), и наоборот. Пространство имён и синтаксис вызова у них одинаков.

54

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

Не знаю, заметил ли ты, или еще нет: Свойства могут наследоваться от методов(секций), и наоборот.

Под свойствами я подразумеваю переменные, описанные внутри объекта. Аналог в языках программирования - property. Либо я неправильно понял, либо именно они (переменные) могут наследоваться. Но как? Можно примерчик?

Что я действительно заметил, так это описание действий прям внутри конструктора классов:

Код:
  <class>предмет
    <cls>@материальное</cls>
    <word>предмет</word>
    <code>var _вес = 0

action(_взятие, предмет Обж)
{ --execute--
  Обж inside pers 
  %ты взял {Обж*#Вп}.
}

var можно_выбросить = да
action(_выбрасывание, предмет Обж)
{ --execute--
  Обж inside loc
  %{pers} {выбросить*pers*#Пв} {Обж*#Вп}.
}

-- можно_взять --
this.проверка_видимости
this.можно_потрогать
if(this.pos==pers) fail, "{this} и так уже у тебя"
if(this.pos is существо) fail, "{this.pos} не даст тебе {this*#Вп}"
if(this part this.pos) fail, "{this} можно взять только вместе с {this.pos*#Тп}"
if(this._вес &gt; pers._макс_вес) fail, "слишком тяжело"
Ok

</code>

С секциями всё понятно, но функции то как там оказались?

55

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

Под свойствами я подразумеваю переменные, описанные внутри объекта. Аналог в языках программирования - property. Либо я неправильно понял, либо именно они (переменные) могут наследоваться. Но как? Можно примерчик?

перегружаться, а не наследоваться - так правильно =)

Код:
class A1{ var P = 5 } //тут P - свойство

class A2
{ is A1 
  -- P -- //тут P - метод
  10 + 5
}

class A3
{ is A2 
  var P = 66 //тут P - опять свойство
}

A3 B{} //объект B

%{B.P} //а тут нам безразлично, P свойство или P метод.

56

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

%{B.P} //а тут нам безразлично, P свойство или P метод.

Безразлично до тех пор, пока мы свойству/методу не попытаемся присвоить значение.

Код:
B.P = 65;  // Если свойство - хорошо. А если метод?

А зачем их перегружать? Это ведь сильно усложняет дело. У меня сейчас мозг сломался, когда я мысленно попытался натянуть новую информацию на то, что уже сделано в редакторе.

Отредактировано Alexandr (2014-09-25 21:00:52)

57

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

Что я действительно заметил, так это описание действий прям внутри конструктора классов:


Код:
class предмет
{ ...
  action(_взятие, предмет Обж)
  {
     ...
  }
  ...
}

абсолютно эквивалентно

Код:
class предмет
{
  ...
}

action(_взятие, предмет Обж)
{
  ...
}

И да, такое вложение функций больше не будет нужно, т.к. появивись нормальные методы/секции.
Стандартную библиотеку я от них почищу.

58

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

Безразлично до тех пор, пока мы свойству/методу не попытаемся присвоить значение.

тоже безразлично:

Код:
B.P = 100500 //создаётся свойство P в объекте B со значением 100500

При операциях с объектами классы не изменяются!

Код:
A2.P = 100500 //метод P класса A2 замещается свойством P со значением 100500

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

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

А зачем их перегружать? Это ведь сильно усложняет дело.

ООП, как же без этого?

59

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

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

мб, секция объекта это просто новый тип свойства?

60

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

мб, секция объекта это просто новый тип свойства?

Не думаю, что это сработает. Метод это не просто какое-то там значение. Это целая горсть кода.
Что-нибудь придумаю, чтобы это распутать. Просто область рефакторинга расширилась полностью на редактор объектов.