Генерация грамматически правильных описаний атак в стиле MUD

13

В настоящее время я работаю над текстовой игрой, где исход боевого раунда выглядит примерно так

%attacker% inflicts a serious wound (12 points damage) on %defender%

Прямо сейчас я просто заменяю% attacker% на имя атакующего и% defender% на имя защитника. Тем не менее, описание работает, но не читается правильно. Поскольку в игре есть только текст, я не хочу прибегать к общим описаниям (таким как «Вы используете Атаку на Гоблина для 5 урона», что, возможно, решает проблему)

Как создать правильное описание для случаев, когда% атакующий% ссылается на

  • «Вы», игрок? «Вы наносите ...» неправильно
  • «Пчелы» или другое множественное число? Мне нужно как-то знать, что я должен префикс имени с "The"
  • Если% attacker% является родовым существительным, таким как «Гоблин», оно будет выглядеть странно, в отличие от% attacker%, являющегося именем. Сравните «Гоблин наносит ...» против «Алдрейк Меченосец наносит ....»

Как текстовые игры обычно решают такие проблемы?

Extrakun
источник

Ответы:

15

Подход% attacker% можно расширить, включив в него некоторую информацию, кроме имен объектов:

  1. Глагол может быть единственного или множественного числа. Это зависит от предмета. «Вы нападаете на Х» (особый субъект от 2-го лица) против «Экстракун нападает на Х» (особый субъект от 3-го лица) против «Гоблины нападают на Х» (множественное число от 3-го лица). Большинство глаголов просто нужно -sдобавить, но есть несколько исключений.
  2. Существительное может быть собственным (« Гоблин атакует X») или нарицательным (« Гоблин атакует X»). Обыкновенные существительные, начинающиеся с гласного звука, должны использовать «an» вместо «a». Это может быть обычное существительное, но имеющее только один экземпляр в текущем контексте (« Гоблин атакует X»).
  3. Число существительных может варьироваться от нуля («Вы ударили ни одного гоблина ») до одного («Вы ударили одного гоблина ») до многих («Вы ударили трех гоблинов »). Многие существительные просто нуждаются -sили -esдобавлены, но есть много исключений.
  4. Предметы и объекты могут быть простыми (« Гоблин ») или составными (« Гоблин и ее брат »).
  5. Обыкновенные существительные в начале предложения должны быть написаны заглавными буквами, но если у существительного есть артикль или если оно составное, вы хотите использовать заглавные буквы только в первом слове. Собственные существительные всегда пишутся с большой буквы.
  6. Положение субъекта ( « Она попала в гоблин„) и положение объекта (“Гоблин ударил ее ») используют разные местоимения.
  7. Притяжений можно сгенерировать, добавив в 'sединственном числе (« топор гоблина »), во 'множественном числе (« топоры двух гоблинов »), но местоимения имеют свои собственные правила (« Ваш топор»).

Для английского я написал Python библиотеку генерации текста, полученную из MUD под названием JaysHouseMOO. Не стесняйтесь изучать или копировать код . У него нет хорошей библиотеки исключительных случаев; Вы должны будете добавить это со словами, используемыми в вашей игре. Боюсь, мой перенесенный код не был тщательно протестирован. Также может потребоваться добавление дополнительных случаев для игр (он был разработан для социальной MUD, а не игровой MUD).

Ваш пример будет написан как "%1I %1:(inflicts) a serious wound (%2n damage) on %3i". Числа %1, %2, %3сказать ему , какой объект должен быть замещен; I/ iскажи ему добавить косвенную статью ("a", "an") при необходимости; nговорит ему отображать существительное без артиклей; :(inflicts)говорит ему спрягать глагол для этого объекта.

Вот вывод, который нужно показать атакующему, защитнику и всем остальным:

$ python
>>> import msg
>>> m = "%1I %1:(inflicts) a serious wound (%2n damage) on %3i."
>>> attacker = msg.GenderedObject('Amit', 'm', 'proper')
>>> defender = msg.GenderedObject('goblin', 'm', 'unique')
>>> points = (12, 'point')
>>> msg.Msg().sub_parties({1: attacker, 2: points, 3: defender}, 
                          m, [attacker, defender])
(['You inflict a serious wound (12 points damage) on the goblin.', 
  'Amit inflicts a serious wound (12 points damage) on you.'], 
 'Amit inflicts a serious wound (12 points damage) on the goblin.')

Обратите внимание, если бы вы дали его, (1, 'point')он напечатал бы «1 балл» вместо «1 балл». Это то, что мешает мне в игровом тексте, поэтому я постарался включить функцию, которая облегчит его правильную печать.

Вот еще один пример с составными существительными и «а» против «ан»:

>>> m = "%1I %1:(hits) %2'n %2'(head)."
>>> a1 = msg.GenderedObject('goblin', 'm', 'normal')
>>> a2 = msg.GenderedObject('orc', 'm', 'normal')
>>> d1 = msg.GenderedObject('Amit', 'm', 'proper')
>>> d2 = msg.GenderedObject('Extrakun', 'm', 'proper')
>>> msg.Msg().sub_parties({1: [a1, a2], 2: [d1, d2]}, m, [d1, d2])
(["A goblin and an orc hit your and Extrakun's heads.", 
  "A goblin and an orc hit Amit's and your heads."], 
 "A goblin and an orc hit Amit's and Extrakun's heads.")

Эти примеры на английском языке, и только отслеживать мужской / женский, местоимения, глаголы единственного / множественного числа / существительные и собственные / общие существительные. То, что вам нужно отслеживать, зависит от языка и типа текста в вашей игре. В испанском есть формальные и неформальные местоимения. Несколько языков имеют мужские и женские формы глаголов. Японские местоимения зависят от статуса субъекта относительно объекта. В некоторых языках спряжение глагола может неявно включать предмет. Определите все виды текста, который вы хотите сгенерировать, и языки, на которые вы хотите перевести, и это скажет вам, что вам нужно отслеживать в игровых объектах. Когда вы создаете контент, вы можете включить необходимые аннотации и исключительные случаи.

amitp
источник
1
+1, отличное изложение вопросов. Одна вещь, которую я добавлю, состоит в том, что игроки склонны прощать мелкие грамматические ошибки в сгенерированном тексте, как это, если остальная информация (количество урона, источник, цель, проки) точна - стреляйте на 95% правильной грамматики потому что последние 5% смехотворно сложны.
6

Вместо того, чтобы иметь единственную строку и пытаться правильно подставить ее, вы можете иметь целый набор из них. Начните с объектов. Вы знаете, при создании моба, что на это ссылаться. Вы можете дать ему определенное свойство, отдельное от его имени, для подстановки в строки атаки. Оружие может иметь несколько строк для разнообразия и может заменять более подробно. Вместо «злоумышленник» они могут специально задать «местоимение злоумышленника» или «имя-злоумышленника». У мобов также может быть множество версий этих идентификаторов, если ваши «пчелы» представлены несколькими мобами, а не просто одним мобом, которого называют «пчелами».

Таким образом, у вас есть моб, как

name = goblin
pronoun = he
plural = goblins
proper = goblin
common = a goblin
specific_common = the goblin
possessive = the goblin's
possessive_pronoun = his

Затем ваша строка атаки запрашивает конкретные элементы, например, так ...

% атакующий-местоимение% попадание% defender-specific_common% для% урона%! % defender-pronoun% действительно почувствовал это!

Blecki
источник
5

Существует множество модулей для Perl, начинающихся с Lingua :: EN :: Inflect, которые решают эти проблемы. Даже если вы используете другой язык, выбор API может помочь вам создать свой собственный дизайн.

mghicks
источник
Острота! Также есть порт Python для этой библиотеки: pypi.python.org/pypi/inflect/0.2.1
amitp
3

Я справляюсь с этим через большой набор систем, который, помимо прочего, включает моделирование сообщения как структуры данных, а не строки. Значения для атакующего и защитника являются их фактическими объектами; глагол («причинить» в вашем сообщении) помечен как таковой и знает объект для лица, выполняющего его, так что средство визуализации сообщений знает, что оно должно отображаться от первого лица для актера и от второго лица для всех остальных. Объекты также знают, являются ли их существительные правильными или нет (и, следовательно, должны ли к ним когда-либо применяться «или» или «а / ан»), существуют модели данных, которые позволяют мне указывать, что «или» а / ан "обычно ожидается, что он будет применен к ненастоящему существительному в этой позиции, и многое другое.

Эта тема на Mudconnector очень похожа на ваш вопрос, и я подробно расскажу о своей системе. По сути, то, как я это делаю, - это то, что вы хотели бы, если бы вы хотели быть полностью независимыми от базовых возможностей вашей системы обмена сообщениями и готовы заплатить определенную цену за обучение. (Очень похоже на vi против nano.)

хаос
источник
0

Я бы посоветовал вам поцеловать (пусть это будет глупо просто) и использовать преимущества текстового интерфейса.

Упростите, упростите, упростите столько, сколько сможете. Уберите сложность, прежде чем вы начнете думать о кодировании. Вместо одного предложения используйте два предложения для описания события, как это делают многие игры. Ты помнишь ворота Балдура ? Это не текстовая игра, но повреждение описывается текстом;)


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

Например :

  • Мерлин наложил заклинание огненного шара.
  • Madmax получает 3 повреждения от огня.
  • Гоблин получает 2 повреждения от огня.
  • Гоблин получает 10 урона от огня.
  • и т.д...

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

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

Если вы намерены это сделать, имейте в виду, что структура предложений может отличаться на других языках. Согласно Википедии , 45% доступных языков строят предложение в порядке SOV (subject-object-verb), где 42% (как английский) строят предложение в порядке SVO; как английский.

Дуглас
источник
В Baldur's Gate есть полностью графический движок, позволяющий отображать вывод, но для интерактивного вымысла текст - это весь интерфейс и обратная связь. Это должно быть более отполированным для этого случая, ИМХО.
Экстракун