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

Объявление

Открыт сайт tom2-game.ru.


Последнюю версию платформы можно скачать здесь.

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

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



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

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

1

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

Скоро начну разбираться с категорией mental, но в описании ТОМ-а на вики не нашёл про него никаких подробностей.

2

Напишу тут.

Объекты различных категорий отличаются друг от друга по 2м параметрам:
1. возможное количество объектов
2. поведение объектов при размещении/удалении внутри другого объекта

Количество объектов
unique - всегда 1
location - всегда 1
counting - любое целое число
class и mental - количество для этих категорий не имеет смысла

поведение объектов при размещении/удалении внутри другого объекта

unique - имитирует поведение уникального, неделимого физического тела.
Может быть размещен внутри location или другого unique
Может содержать внутри себя unique, counting, mental
При добавлении в объект автоматически удаляется из объекта, в котором хранился до этого.
При удалении из объекта автоматически попадает в global.

location - имитирует некоторое ограниченное пространство (например комнату).
Не может быть размещен внутри других объектов
Может содержать внутри себя unique, counting, mental

counting - имитирует поведение счетных, неразличимых между собой физических тел.
Может быть размещен внутри location, unique или другого counting
Может содержать внутри себя counting или mental
При добавлении в объект увеличивает внутри него количество себе-подобных объектов
Если извесно, где хранился до этого, вычитает это же количество из предыдущего места хранения.
При удалении из объекта вычитает из него указанное количество себе-подобных объектов.

mental - имитирует поведение нематериальных сущностей - мыслей, символов, объединений, концепций и т.п.
Может быть размещен внутри location, unique, counting или другого mental
Может содержать внутри себя unique, location, counting, mental
mental может быть добавлен в неограниченное количество объектов.
При добавлении в mental других объектов их первоначальное положение не изменяется.

Код:
location Дом {...}
class мысль_о {...}
mental мысль_о_доме
{ cls = мысль_о
  this + Дом
}
unique ГГ {...}
ГГ + мысль_о_доме

class - используется для описания классов объектов
Может быть размещен внутри другого class
Может содержать внутри себя unique, location, counting, mental, class
Добавление объекта в class эквивалентно смене класса объекта.

3

ASBer, про action забыл, но там всё более-менее понятно... по началу, пока не встречаем:

действие сорвать
{ cls = взял // на основе действия "взял"
  title = "сорвал%;; Мр; Мр=; Жр=а"
  this.инфинитив="сорвать"
  шаблон="сорвать=сорви @Что:Еда*Вп"
  шаблон="сорвать=сорви @Что:Еда*РпМч"
  шаблон="сорвать=сорви @Что:Еда*Вп с @Откуда:Куст*Рп"
  шаблон="сорвать=сорви @Что:Еда*РпМч с @Откуда:Куст*Рп"
  шаблон="сорвать=сорви" //шаблон для действия с умолчальным объектом
  Что(Что) //дополнительная проверка предмета
  { if(!Что.pos.Куст)
      return "{Что.lex} тут не растет."
    else
      return cls.Что(Что)
  }
}

Очень удивила "дополнительная проверка". Уже который раз просматриваю исходники "мышек" и каждый раз нахожу там что-нибудь новенькое, такое, что вызывает удивление и заставляет очередной раз поднять планку оценки ТОМа. ТОМ - действительно хорошая платформа, просто мы (программисты) порой на столько привыкли мыслить в стандартном программерском круге ограничений, что трудно догадаться о всём скрытом потенциале платформы. Трудно представить, во что она превратится, если будет развиваться дальше. Цены ей не будет.  :cool:

4

Угу, спасибо  :blush:
Только практика показала что навешивание на парсер всяческих дополнительных проверок - это не тот подход, который требуется...
С помощью таких проверок невозможно добиться хотя-бы 75% попадания ответов парсера в тему. Чаще отвечает невпопад  :'(
Тут требуется другая идея  :idea:

5

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

Тут требуется другая идея

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

шаблон="стрелять из @Weapon:Рогатка*Рп в @Цель*Вп"
  шаблон="стрелять в @Цель*Вп из @Weapon:Рогатка*Рп"
  шаблон="стрелять в @Цель*Вп"
  шаблон="стрелять из @Weapon:Рогатка*Рп по @Цель*Дп"
  шаблон="стрелять по @Цель*Дп из @Weapon:Рогатка*Рп"
  шаблон="стрелять по @Цель*Дп"
  шаблон="стрелять @Гр:Горох*Тп из @Weapon:Рогатка*Рп в @Цель*Вп"
  шаблон="стрелять @Гр:Горох*Тп из @Weapon:Рогатка*Рп по @Цель*Дп"
  шаблон="стрелять @Гр:Горох*Тп в @Цель*Вп из @Weapon:Рогатка*Рп"
  шаблон="стрелять @Гр:Горох*Тп по @Цель*Дп из @Weapon:Рогатка*Рп"
  //------------------------------------------------
  "убить"="убей"="застрелить"="застрели"="атаковать"="атаковать" //с предлогом из
  шаблон="убить @Цель*Вп"
  шаблон="убить @Цель*Вп из @Weapon:Рогатка*Рп"
  //------------------------------------------------
  "напасть"="напади" //с предлогом на
  шаблон="напасть на @Цель*Вп"

можно сильно сократить не перебирая все варианты перестановки слов, а закодировать примерно так:

шаблон="стрелять (@Гр:Горох*Тп)[?~] (из @Weapon:Рогатка*Рп)[?~] (в @Цель*Вп|по @Цель*Дп)[?~]"
  //------------------------------------------------
  "убить"="убей"="застрелить"="застрели"="атаковать"="атаковать" //с предлогом из
  шаблон="убить (@Цель*Вп)[?~] (из @Weapon:Рогатка*Рп)[?~]"
  //------------------------------------------------
  "напасть"="напади" //с предлогом на
  шаблон="напасть на @Цель*Вп"

где я для наглядности выделил элементы в круглые скобки. В квадратных скобках указаны доп. параметры для элемента: "?" указывает на то, что этот элемент может присутствовать, а может и отсутствовать в предложении; "~" - на то, что положение элемента в предложении не имеет значения. "|" разделяет различные варианты-синонимы: (в @Цель*Вп|по @Цель*Дп) - означает, что фразы "в филина" и "по филину" равнозначны и в предложении может быть одна любая из них.
Вот примерно так я вижу небольшое улучшение ТОМа по части шаблонов. Если полностью следовать правилам шаблонов, то парсер одним первым шаблоном будет разбирать фразы на-подобии этой: "из рогатки по филину стрелять горохом". Звучит немного коряво, но абсолютно правильно.
Но это не панацея, и в некоторых случаях такой формат шаблонов не сильно помогает делу. Вот пример:

шаблон = "заглянуть=посмотреть в @Obj:Контейнер*ВпЕч"
  шаблон = "заглянуть=посмотреть внутрь=вовнутрь @Obj:Контейнер*РпЕч"
  шаблон = "заглянуть=посмотреть во внутрь @Obj:Контейнер*РпЕч"
  шаблон = "посмотреть что в @Obj:Контейнер*ПпМ2Еч"
  шаблон = "что в @Obj:Контейнер*ПпМ2Еч ?"
  шаблон = "что в @Obj:Контейнер*ПпМ2Еч"
  шаблон = "посмотреть что внутри @Obj:Контейнер*РпЕч"
  шаблон = "что внутри @Obj:Контейнер*РпЕч ?"
  шаблон = "что внутри @Obj:Контейнер*РпЕч"

Попробуй-ка сократи!

6

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

можно сильно сократить не перебирая все варианты перестановки слов, а закодировать примерно так:

Вполне рабочий вариант, может быть воспользуюсь.
Только отсутствие элемента я бы обозначил как один из вариантов: (...|null)
А '~' вообще лишнее - если переменная в скобках, значит ее положение изменчиво.