Подход% attacker% можно расширить, включив в него некоторую информацию, кроме имен объектов:
- Глагол может быть единственного или множественного числа. Это зависит от предмета. «Вы нападаете на Х» (особый субъект от 2-го лица) против «Экстракун нападает на Х» (особый субъект от 3-го лица) против «Гоблины нападают на Х» (множественное число от 3-го лица). Большинство глаголов просто нужно
-s
добавить, но есть несколько исключений.
- Существительное может быть собственным (« Гоблин атакует X») или нарицательным (« Гоблин атакует X»). Обыкновенные существительные, начинающиеся с гласного звука, должны использовать «an» вместо «a». Это может быть обычное существительное, но имеющее только один экземпляр в текущем контексте (« Гоблин атакует X»).
- Число существительных может варьироваться от нуля («Вы ударили ни одного гоблина ») до одного («Вы ударили одного гоблина ») до многих («Вы ударили трех гоблинов »). Многие существительные просто нуждаются
-s
или -es
добавлены, но есть много исключений.
- Предметы и объекты могут быть простыми (« Гоблин ») или составными (« Гоблин и ее брат »).
- Обыкновенные существительные в начале предложения должны быть написаны заглавными буквами, но если у существительного есть артикль или если оно составное, вы хотите использовать заглавные буквы только в первом слове. Собственные существительные всегда пишутся с большой буквы.
- Положение субъекта ( « Она попала в гоблин„) и положение объекта (“Гоблин ударил ее ») используют разные местоимения.
- Притяжений можно сгенерировать, добавив в
'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.")
Эти примеры на английском языке, и только отслеживать мужской / женский, местоимения, глаголы единственного / множественного числа / существительные и собственные / общие существительные. То, что вам нужно отслеживать, зависит от языка и типа текста в вашей игре. В испанском есть формальные и неформальные местоимения. Несколько языков имеют мужские и женские формы глаголов. Японские местоимения зависят от статуса субъекта относительно объекта. В некоторых языках спряжение глагола может неявно включать предмет. Определите все виды текста, который вы хотите сгенерировать, и языки, на которые вы хотите перевести, и это скажет вам, что вам нужно отслеживать в игровых объектах. Когда вы создаете контент, вы можете включить необходимые аннотации и исключительные случаи.
Вместо того, чтобы иметь единственную строку и пытаться правильно подставить ее, вы можете иметь целый набор из них. Начните с объектов. Вы знаете, при создании моба, что на это ссылаться. Вы можете дать ему определенное свойство, отдельное от его имени, для подстановки в строки атаки. Оружие может иметь несколько строк для разнообразия и может заменять более подробно. Вместо «злоумышленник» они могут специально задать «местоимение злоумышленника» или «имя-злоумышленника». У мобов также может быть множество версий этих идентификаторов, если ваши «пчелы» представлены несколькими мобами, а не просто одним мобом, которого называют «пчелами».
Таким образом, у вас есть моб, как
Затем ваша строка атаки запрашивает конкретные элементы, например, так ...
% атакующий-местоимение% попадание% defender-specific_common% для% урона%! % defender-pronoun% действительно почувствовал это!
источник
Существует множество модулей для Perl, начинающихся с Lingua :: EN :: Inflect, которые решают эти проблемы. Даже если вы используете другой язык, выбор API может помочь вам создать свой собственный дизайн.
источник
Я справляюсь с этим через большой набор систем, который, помимо прочего, включает моделирование сообщения как структуры данных, а не строки. Значения для атакующего и защитника являются их фактическими объектами; глагол («причинить» в вашем сообщении) помечен как таковой и знает объект для лица, выполняющего его, так что средство визуализации сообщений знает, что оно должно отображаться от первого лица для актера и от второго лица для всех остальных. Объекты также знают, являются ли их существительные правильными или нет (и, следовательно, должны ли к ним когда-либо применяться «или» или «а / ан»), существуют модели данных, которые позволяют мне указывать, что «или» а / ан "обычно ожидается, что он будет применен к ненастоящему существительному в этой позиции, и многое другое.
Эта тема на Mudconnector очень похожа на ваш вопрос, и я подробно расскажу о своей системе. По сути, то, как я это делаю, - это то, что вы хотели бы, если бы вы хотели быть полностью независимыми от базовых возможностей вашей системы обмена сообщениями и готовы заплатить определенную цену за обучение. (Очень похоже на vi против nano.)
источник
Я бы посоветовал вам поцеловать (пусть это будет глупо просто) и использовать преимущества текстового интерфейса.
Упростите, упростите, упростите столько, сколько сможете. Уберите сложность, прежде чем вы начнете думать о кодировании. Вместо одного предложения используйте два предложения для описания события, как это делают многие игры. Ты помнишь ворота Балдура ? Это не текстовая игра, но повреждение описывается текстом;)
Разделите информацию между источником события и его последствиями.
Например :
Я также посоветовал бы всегда использовать третье лицо в единственном числе, будь это правильное или нарицательное.
Более того, хотя английский является важным международным языком, если вы хотите оказать более эмоциональное воздействие и затронуть более крупный рынок, вам, возможно, придется перевести свою игру на другие языки.
Если вы намерены это сделать, имейте в виду, что структура предложений может отличаться на других языках. Согласно Википедии , 45% доступных языков строят предложение в порядке SOV (subject-object-verb), где 42% (как английский) строят предложение в порядке SVO; как английский.
источник