Створення граматично правильних описів атак у стилі MUD


13

Зараз я працюю над текстовою грою, де результат бойового раунду має щось подібне

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

Зараз я просто поміняю% нападника% на ім'я зловмисника, а% захисника% на ім'я захисника. Однак опис працює, але не читайте правильно. Оскільки гра - це лише весь текст, я не хочу вдаватися до загальних описів (наприклад, "Ви використовуєте Attack on Goblin for 5 damage", що, безсумнівно, вирішує проблему)

Як створити правильні описи для випадків, на які посилається% зловмисник%

  • "Ви", гравець? "Ви завдаєте ..." невірно
  • "Бджоли" чи інший множина? Мені потрібно якось знати, що я повинен префіксувати ім'я знаком "The"
  • Якщо% attacker% - це родовий іменник, наприклад "Goblin", воно буде читатись дивним, на відміну від%% зловмисника. Порівняйте "нав'язує гобліну ..." та "Олдрейк наносить меч ...."

Як текстові ігри зазвичай вирішують подібні проблеми?

Відповіді:


15

Підхід% зловмисника% може бути розширений, щоб включити інформацію, яка не є лише іменами об'єктів:

  1. Дієслово може бути однини або множини. Це залежить від теми. "Ви атакуєте X" (єдиний предмет 2-ї особи) проти "Екстракун атакує Х" (сингулярний предмет 3-ї особи) проти "Гобліни атакують Х" (множина суб'єкта 3-ї особи). Більшість дієслів просто потребує -sдодавання, але є кілька винятків.
  2. Іменник може бути власним іменником (« Гоблін атакує Х») або загальним іменником (« А гоблін атакує Х»). Загальні іменники, що починаються з голосного звуку, повинні вживати "а" замість "а". Це може бути звичайним іменником, але мати лише один екземпляр у поточному контексті (" Гоблін атакує X").
  3. Іменник може змінюватись за кількістю: від нуля ("Ви не б'єте гоблінів ") до одного ("Ти вдарив одного гобліна ") до багатьох ("Ти вдарив трьох гоблінів "). Багато іменників просто потребують -sабо -esдодаються, але є багато винятків.
  4. Предмети та предмети можуть бути простими (" гоблін ") або складними (" Гоблін та її брат ").
  5. Поширені іменники на початку речення потребують великої літери, але якщо у іменника є стаття або якщо вона є складовою, ви хочете використовувати лише великі літери першого слова. Власні іменники завжди з великої літери.
  6. Предметна позиція (" Вона вдарила за гобліном") та об'єктна позиція ("Гоблін ударив її ") використовують різні займенники.
  7. Присвійні може бути отримано шляхом додавання , 'sякщо єдине число ( «A гобліна сокири»), 'якщо множина ( «Два гоблінів вісь"), але займенники мають свої власні правила ( " Ваш сокиру»).

Для англійської мови я написав 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 бал". Це щось, що мене заважає в тексті гри, тому я переконався, що я включив функцію, щоб полегшити її належне друкування.

Ось ще один приклад зі складеними іменниками та "a" vs. "an":

>>> 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.")

Ці приклади є англійською мовою, і відслідковуються лише чоловічі / жіночі, займенники, однини / множини дієслова / іменники та належні / загальні іменники. Те, що вам потрібно відстежувати, залежить від мов та типу тексту у вашій грі. В іспанській мові є офіційні та неофіційні займенники. Кілька мов мають чоловічі та жіночі форми дієслів. Японські займенники залежать від статусу предмета щодо об’єкта. У деяких мовах сполучення дієслів може неявно включати тему. Визначте всі види тексту, які ви бажаєте створити, та мови, які ви хочете перекласти, і це підкаже, що вам потрібно відстежувати в ігрових об'єктах. Створюючи вміст, ви можете включати необхідні примітки та виняткові випадки.


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

Тоді ваша атакова рядок запитує конкретні елементи, як-от так ..

% нападник-займенник% хіт% захисник-специфічний_часть% за% збиток%! % захисник-займенник% справді відчув це!


5

Існує набір модулів для Perl, починаючи з Lingua :: EN :: Inflect, який займається цими питаннями. Навіть якщо ви використовуєте іншу мову, зроблений вибір API може допомогти вам створити ваш власний дизайн.


Вишуканий! У цій бібліотеці також є порт Python: pypi.python.org/pypi/inflect/0.2.1
amitp

3

Мені подобається це через великий набір системності, який, серед іншого, передбачає моделювання повідомлення як структури даних, а не рядка. Значення для нападника та захисника є їхні фактичні об'єкти; дієслово ("нанести" у вашому повідомленні) позначене як таке, і знає об'єкт для особи, яка його виконує, так що рендер повідомлення знає, що його потрібно відображати від першої особи акторові та другій особі всім іншим. Об'єкти також знають, чи є їхні іменники належними чи ні (і, отже, чи "чи" чи "a / an" коли-небудь слід застосовувати до них), є моделі даних, які дозволяють мені вказати, що "the" або "a / an "Зазвичай, можна очікувати, що він буде застосовуватися до неіменного іменника на цій посаді та багато іншого.

Цей потік на Mudconnector дуже схожий на ваше запитання, і я там детально розглядаю деталі моєї системи. В основному, те, як я це роблю, - це те, що ви хотіли б, якщо хочете бути абсолютно не обмеженими основними можливостями системи обміну повідомленнями і готові платити за це криву навчання. (Настільки ж, як vi проти nano.)


0

Я б радив вам KISS (тримайте це по-дурному просто) та використовуйте переваги текстового інтерфейсу.

Спростити, спростити, спростити наскільки це можливо. Видаліть складність, перш ніж ви навіть почнете думати про кодування. Замість одного речення використовуйте два речення для опису події, як це роблять у багатьох іграх. Ви пам’ятаєте ворота Балдура ? Це не текстова гра, але шкода описується текстом;)


Розділіть інформацію між джерелом події та її наслідком.

Наприклад :

  • Мерлін кинула заклинання вогнем.
  • Madmax потрапила в 3 вогневі ушкодження.
  • Забито гобліну з 2 пошкодженнями від вогню.
  • Забито гобліну з 10 пошкодженнями від вогню.
  • тощо ...

Я б також радив завжди вживати третю особу однини, було б це належним або загальним іменником.

Більше того, хоча англійська мова є важливою міжнародною мовою, якщо ви хочете мати більше емоційного впливу та торкнутися більшого ринку, можливо, вам доведеться перевести свою гру на інші мови.

Якщо ви маєте намір це зробити, пам’ятайте, що структура речень може відрізнятися в інших мовах. Згідно з Вікіпедією , 45% доступних мов будують речення у порядку SOV (суб'єкт-об’єкт-дієслово), де 42% (як англійська) будують речення у порядку SVO; як англійська.


Ворота Балдура мають повністю графічний двигун, який повинен працювати разом з ним для показу вихідних даних, але для інтерактивної вигадки текст - це весь інтерфейс і зворотній зв'язок, що знаходиться там. У цьому випадку воно повинно бути відполірованішим, ІМХО.
Екстракун
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.