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

Объявление

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

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

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


Вы здесь » ТОМ - платформа для текстовых игр » ТОМ 2 » Прототип


Прототип

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

31

Обновил прототип интерпретатора.

Новое в платформе:
- добавил игровой режим, теперь для игрока внутри локации большинство системных команд недоступно (надо еще сделать отладочный режим);
- сделал списковый тип данных, теперь любое свойство может стать списком (аналог item[] из 1 ТОМа), еще надо сделать операции над списковыми типами;
- исправил некоторые ошибки, расширил выводимую инфу об ошибках.

Новое в демоигре:
- для проверки локаций добавил директивы "иди в ...", "иди на ..." (goto для игрока теперь недоступна);
- свойство "содержимое" стало списком, работают вопросы:
  >содержимое рюмки?
  >содержимое рюмочной?
- добавил проверки на присутствие объектов в текущей локации - заложить рюмку находясь на улице больше не получится.

32

Обновил прототип интерпретатора.

Хотел расширить операции для списков, но на поверхность вылезло на удивление много ошибок.
Большую часть пофиксил, этот релиз является багфиксом.

Зато стали работать команды:
> осмотри содержимое рюмки
> заложи за воротник содержимое рюмки

Также включил в состав словарь от Александра, работает отлично :flag:

33

Обновил прототип интерпретатора.

Наконец обновил работу с внешними функциями. К сожалению это привело к несовместимости с плагинами от первого ТОМа.
Для однозначного встраивания внешних функций в код игры, парсеру потребовалось знать число аргументов каждой функции.
Кроме того для пользовательских команд, таких как "exit", "save" или "load", введен дополнительный тип внешней функции - FnCommand=4.
Саша, прости, твой словарь пришлось временно заменить - жду версию соответствующую новому интерфейсу.

Теперь снова работают команды, функции которых находятся в интерфейсе или плагинах:
>exit
>включить голос
>выключить голос
и т.п.

34

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

Саша, прости, твой словарь пришлось временно заменить - жду версию соответствующую новому интерфейсу.

Сейчас изучаю систему склонений Зализняка. Возможно получится значительно упростить описание существительных. До того момента не вижу смысла выкладывать исправление. Всё-равно текущая версия плагина почти бесполезна.

Имеются ли какие-нибудь мысли о поддержке ударений во втором ТОМе? Или они играют роль только для голоса?

35

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

Имеются ли какие-нибудь мысли о поддержке ударений во втором ТОМе? Или они играют роль только для голоса?

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

Код:
слово замок1
  замок1.форма Ип = за`мок
  ...

слово замок2
  замок2.форма Ип = замо`к
  ...

36

Обновил прототип интерпретатора.

1. cделал многострочные конструкции if - then - else;
2. для объектов сделал свойство title/наименование;
3. сделал словоизменение и согласование по морфологическим ключам.

37

А вот интересно, как глубоко парсер просчитывает омонимичность выражений?
Для наглядности возьмём гипотетический пример.
Допустим, у нас описаны слова больной (существительное), больной (прилагательное), врач. Так-же есть значения, обрабатывающие именные группы прил-сущ ("большой комод", "больной врач"...) и сущ-сущ*Рп ("ложка Миши", "миска кота", "больной врача"). Так-же допустим, что внутри этих значений нет проверки на принадлежность миски коту, ложки Мише и прочее.
Теперь забиваем команду "осмотри больного врача". Здесь явная омонимичность группы "больного врача". Её можно растолковать как "заболевший врач" и как "больной человек принадлежащий врачу". Парсер примет первое совпавшее значение прил-сущ и остановится или будет держать "в уме" оба варианта толкования, надеясь снять омонимию на более высоком уровне? (например, осмотреть врача нельзя, а больного можно).
Просто хочется знать, как глубоко парсер обрабатывает такие каверзные ситуации, или он старается избавиться от омонимии "на месте" и принимает первое попавшее значение? А пример привёл, что-бы проще было понять о чём речь. Наверняка найдутся случаи и посложнее.

38

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

UPD:
вот слегка подчищенный пример из лога парсера

[осм 2/2] [полную 3/3] [рюмку 5/4] [водки 3/3]

К токенам 2-3 применена функция(свойство сущее)
[осм 2/2] [полную рюмку 2/1] [водки 3/3]

К токенам 2-3 применена функция(предмет вещество*Рп)
[осм 2/2] [полную рюмку водки 2/1]

К токенам 1-2 применена функция(осмотреть сущее*Вп)
[осм полную рюмку водки 1/1]

Цветом выделено количество значений, которые парсер хранит на каждом шаге для каждого токена.

39

Обновил прототип интерпретатора.

1. Прикрутил предлоги, работают аналогично ТОМу 1, но в ТОМе 2 они ещё и являются значениями с типом "предлог".
2. Добавил вес булевым значениям. Актуально для генерации "вменяемых" сообщений об ошибках, но может где еще пригодится.
3. Доработал функции, теперь они выдают более осмысленные сообщения если что-то не так. Например:

> осмотри белую рюмку
Здесь нет белой рюмки.

40

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

Здесь явная омонимичность группы "больного врача". Её можно растолковать как "заболевший врач" и как "больной человек принадлежащий врачу". Парсер примет первое совпавшее значение прил-сущ и остановится или будет держать "в уме" оба варианта толкования, надеясь снять омонимию на более высоком уровне? (например, осмотреть врача нельзя, а больного можно).

Погоняв в уме это пример решил к нему вернуться еще раз.
В текущей реализации будет так:
К словосочетанию "больного врача" парсер попытается применить 2 функции - при-сущ (больной человек) и сущ-сущ*Рп (нечто принадлежащее врачу) - обе функции подходят по классам и ключам.
Далее вызывается секция parsig этих функций. У обеих функций эта секция не вызовет ошибок, т.к. с семантикой тут всё в порядке.
Сейчас на этом этапе всё и закончится с ошибкой "это непонятно, неоднозначный вызов функции".
Но, если бы разбор прошел бы дальше, неоднозначность выявилась бы в секции execute - для одной функции могла бы выскочить ошибка, тогда бы прошло значение другой функции.
Или, если бы у врача был больной пациент и врач при этом сам болен, дальше прошли бы оба значения, которые могли бы подойти или не подойти на следующих уровнях разбора.

Вобщем, пока есть над чем работать, это вполне реализуемо.

41

Обновил прототип интерпретатора.

Много всяких мелких исправлений и доделок.
В демо-примере добавил картинку для улицы, стало красиво :)

42

Обновил прототип интерпретатора.

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

43

Ещё добавилась собачка:

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

Только она опять на английской раскладке :(
Сколько уже таких символов? {}#@<> и продолжают расти. При этом используются они в непосредственной близости с русскими словами:

Код:
@.наименование = слово водка
#описание ------------------

Какой смысл тогда в этой поддержке естественного русского языка, если все специальные символы на англ. раскладке? Это угнетает :'(

44

Да, я всерьёз думал о знаке "№" :)
Вся беда в том что русская раскладка очень бедна знаками. А заменять знаки на на что-то другое мне очень не хочется...

Помоему это выглядит убого:

Код:
ПРМ.наименование = слово водка
СЕК описание ------------------

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

UPD:
Пока еще двоеточие нигде не задействовано. Как такой вариант?

Код:
:.наименование = слово водка
::описание ------------------

45

А звёздочка * уже где-то задействована?
Для секций можно придумать подобие "умного комментария". Например, начинается с двух знаков дефиса:

Код:
--------- описание -----------

Т.е. любая строка, начинающаяся с двух знаков дефиса считается "умным комментарием", который парсер обрабатывает уже по другим законам. Во-первых все дефисы в этой строке убираются, затем строка тримируется (trim), а оставшееся обрабатывается по ситуации. Если это зарезервированное слово (например, имя секции), то выполнять. А если ничего не подходит, то считать это просто комментарием.
Да и выглядит, мне кажется, неплохо. И за комментарием // не придётся тянуться до цифровой части клавиатуры.
А на счёт собачки, даже не знаю... если возможно, то звёздочкой, а если нельзя, то можно и двоеточием. Только нельзя ли считать двоеточие комбинацией "@.", что-бы точку после двоеточия не ставить. Ведь так выглядит лучше:

Код:
:наименование = слово
---------- описание ----------

P.S. Люблю звёздочку, уж не знаю почему. :)

46

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

А звёздочка * уже где-то задействована?

Да, уже задействована в 2 операциях: умножение и согласование.

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

Для секций можно придумать подобие "умного комментария". Например, начинается с двух знаков дефиса:

Принято. Будет выглядеть очень стильно. Кстати так можно и многострочные комментарии делать:

Код:
--------------
комментарий
комментарий
комментарий
--выполнение--
Alexandr написал(а):

Только нельзя ли считать двоеточие комбинацией "@.", что-бы точку после двоеточия не ставить.

Это ограничит использование этого знака только работой со свойствами.
Сейчас же это полноценная замена переменной:

Код:
переменная нужное_нам_для_очень_важного_дела_число
@ = 5

переменная ВасяПетров
@ это хулиган

47

Как это всё обсуждение напомнило мне мою молодость. :)

48

Да, 2 года назад мы тоже были моложе на 2 года )))


Вы здесь » ТОМ - платформа для текстовых игр » ТОМ 2 » Прототип