Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Опознавать объект по местоположению #19

Open
fireton opened this issue Dec 1, 2021 · 10 comments
Open

Comments

@fireton
Copy link
Contributor

fireton commented Dec 1, 2021

Просто пожелание на подумать.

Например, в комнате есть два яблока. Одно красное — в инвентаре. И одно зелёное — на столе.
Если написать
> взять яблоко со стола
то ответ будет всё равно
Здесь есть красное яблоко и зелёное яблоко.

Мало того, что «взять» можно только то, что у тебя нет в инвентаре. Так ещё ж и игрок явно написал, что нужное ему яблоко — на столе.

В «Разломе» у меня были два баллона, пустой и полный. И игроки регулярно напарывались на то, что когда пишешь
> снять баллон со скафандра
то игра их не понимает.

Я понимаю, что МП оперирует понятием scope, но может как-то сужать этот scope, когда в строке уже есть какие-то уточнения помимо полного названия предмета?

@hugeping
Copy link
Contributor

hugeping commented Dec 1, 2021

Было бы хорошо, если бы в подобных issue прикладывался готовый маленький пример.

@fireton
Copy link
Contributor Author

fireton commented Dec 1, 2021

image
mp_distinct.zip

@hugeping
Copy link
Contributor

hugeping commented Dec 1, 2021

Пишу, чтобы не забыть.
Посмотрел, сейчас уточнения работают ПОСЛЕ анализа строки. Во время анализа строки неизвестно ничего о самих объектах и их отношениях и в случае, когда парсер видит несколько объектов и знает, что фразу можно уточнить -- он спрашивает.
Если же уточнить нет возможности (например, у нас просто два яблока) -- тогда используется дистранция, уточнения и так далее.

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

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

@fireton
Copy link
Contributor Author

fireton commented Dec 1, 2021

Перенести уточнения уже в слой обработки команд? Типа анализатор опознал два яблока и передал дальше обрабатывать оба объекта. А обработчик команд, владея сценой, может решить, что из них выкинуть из списка, исходя из ситуации...

@hugeping
Copy link
Contributor

hugeping commented Dec 1, 2021

Я тут смешал два вида уточнений.

  1. уточнения, когда парсер переспрашивает
  2. уточняющие hint типа held, inside итд.

1 работает до 2. Например, если ты закомментируешь строки:
1646,1647 в mp.lua

table.insert(multi, 1, { word = found.ob:noun(found.alias), lev = rlev })
--found = false
--break

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

В теории можно пытаться передвинуть детектирование уточнений дальше, но это и означает переписывание.

Так что на данный момент я не вижу способа. Если кто-то его найдёт, конечно, посмотрю.

@hugeping
Copy link
Contributor

hugeping commented Dec 1, 2021

То есть архитектура предполагает слои:

  1. match - в этот момент мы парсим текстовую строку и создаём распаршенный глагол. Уточнения работают внутри, на этапе разбора очередного параметра.
  2. создание события. В этот момент пути уже назад нет. Если выбрано несколько объектов то выберется самый вероятный. Отменить на этом этапе выполнение невозможно (я это ещё проверю, но думаю так).

Так что данная фича в архитектуру не вяжется.

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

@fireton
Copy link
Contributor Author

fireton commented Dec 1, 2021

Ну вот про «выберется самый вероятный», может, и можно подкрутить?

@fireton
Copy link
Contributor Author

fireton commented Dec 1, 2021

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

Например, в случае Take приоритет будет у того объекта, который не находится в инвентаре. А в случае Drop — наоборот.

@hugeping
Copy link
Contributor

hugeping commented Dec 1, 2021

Я ж выше написал. Это УЖЕ есть. Если ты посмотришь реализацию глагола Take с 2мя вариантами, то увидишь, что на контейнере стоит уточнение и оно работает. Если ты удалишь те строки о которых я сказал, то будет работать как тебе нужно. Но только при этом не сработают утчнения. Выше я описал про фазы match и подготовку событий. Почитай внимательней, сверься с кодом.

@hugeping
Copy link
Contributor

hugeping commented Dec 4, 2021

Возможное решение: убрать обработку уточнений из :match и перенести их в конец function mp:input(str). Чтобы не забыть.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants