Generando descripciones de ataques gramaticalmente correctos al estilo MUD

13

Actualmente estoy trabajando en un juego basado en texto, donde el resultado de una ronda de combate es algo como esto

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

En este momento, solo cambio% atacante% con el nombre del atacante y% defensor% por el nombre del defensor. Sin embargo, la descripción funciona, pero no se lee correctamente. Dado que el juego es solo texto, no quiero recurrir a descripciones genéricas (como "Usas Attack on Goblin para 5 daños", que posiblemente resuelva el problema)

¿Cómo genero descripciones correctas para los casos donde% atacante% se refiere

  • "Tú", el jugador? "Inflige ..." está mal
  • "Abejas", u otro plural? Necesito saber de alguna manera que debo anteponer el nombre con un "The"
  • Si% Attacker% es un sustantivo genérico, como "Goblin", se leerá raro en lugar de% Attacker% como nombre. Compare "El duende inflige ..." contra "El espadachín Aldraic inflige ..."

¿Cómo suelen resolver los problemas los juegos basados ​​en texto?

Extrakun
fuente

Respuestas:

15

El enfoque% atacante% se puede ampliar para incluir información que no sea solo los nombres de los objetos:

  1. El verbo puede ser singular o plural. Esto depende del tema. "Usted ataca X" (singular segunda persona sujeta) vs. "Extrakun ataques X" (singular tercera persona sujeta) frente a "Los duendes atacan X" (plural tercera persona sujeta). La mayoría de los verbos solo necesitan un -sagregado, pero hay algunas excepciones.
  2. El sustantivo puede ser un nombre propio (" Goblin ataca X") o un sustantivo común (" Un duende ataca X"). Los sustantivos comunes que comienzan con un sonido vocal deben usar "an" en lugar de "a". Puede ser un nombre común pero tener solo una instancia en el contexto actual (" El duende ataca X").
  3. El nombre puede variar en número, desde cero ("No golpeas a los duendes ") a uno ("Golpea a un duende ") a muchos ("Golpea a tres duendes "). Muchos sustantivos solo necesitan un -so -esagregado, pero hay muchas excepciones.
  4. Los sujetos y los objetos pueden ser simples (" Un duende ") o compuestos (" Un duende y su hermano ").
  5. Los sustantivos comunes al comienzo de la oración deben escribirse en mayúscula, pero si el sustantivo tiene un artículo o si es compuesto, solo desea poner en mayúscula la primera palabra. Los nombres propios siempre están en mayúscula.
  6. La posición del sujeto ( " Ella golpeó el duende ') y la posición del objeto (' El duende golpeó su ") utiliza diferentes pronombres.
  7. Los posesivos pueden generarse agregando 'sif singular (" Axe goblin's axe"), 'if plural ("Two goblins ' axes"), pero los pronombres tienen sus propias reglas (" Your ax").

Para inglés, escribí Python una biblioteca de generación de texto derivada de un MUD llamado JaysHouseMOO. Siéntase libre de estudiar o copiar el código . No tiene una buena biblioteca de casos excepcionales; tendrás que agregar eso con las palabras usadas en tu juego. Me temo que mi código portado no se ha probado exhaustivamente. También podría necesitar más casos agregados para juegos (fue diseñado para un MUD social, no para un MUD de juegos).

Su ejemplo se escribiría como "%1I %1:(inflicts) a serious wound (%2n damage) on %3i". Los números %1, %2,%3 dicen que el objeto que ha de ser sustituido; I/ idígale que agregue un artículo indirecto ("a", "an") si es necesario; nle dice que muestre el sustantivo sin artículos; :(inflicts)le dice que conjugue el verbo para ese objeto.

Aquí está la salida para mostrarle al atacante, al defensor y a todos los demás:

$ 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.')

Tenga en cuenta que si lo hubiera dado, (1, 'point')habría impreso "1 punto" en lugar de "1 punto". Eso es algo que me molesta en el texto del juego, así que me aseguré de incluir una función para facilitar la impresión correcta.

Aquí hay otro ejemplo, con sustantivos compuestos, y "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.")

Estos ejemplos están en inglés y solo rastrean masculinos / femeninos, pronombres, verbos / sustantivos singulares / plurales y sustantivos propios / comunes. Lo que necesitas rastrear variará según los idiomas y el tipo de texto en tu juego. En español hay pronombres formales e informales. Varios idiomas tienen formas de verbos masculinos y femeninos. Los pronombres japoneses dependen del estado del sujeto en relación con el objeto. En algunos idiomas, la conjugación verbal puede incluir implícitamente al sujeto. Determine todos los tipos de texto que desea generar y los idiomas a los que desea traducir, y eso le dirá lo que necesita rastrear en los objetos de su juego. Cuando crea el contenido, puede incluir las anotaciones necesarias y casos excepcionales.

amitp
fuente
1
+1, gran resumen de los problemas. Una cosa que agregaré es que los jugadores tienden a ser bastante indulgentes con los errores gramaticales menores para el texto generado como este, siempre y cuando el resto de la información (cantidad de daño, fuente, objetivo, procesos) sea precisa: dispare con una gramática correcta del 95% , porque el último 5% es ridículamente difícil.
6

En lugar de tener una sola cadena e intentar sustituirla correctamente, podría tener un conjunto completo de ellas. Comience con los objetos. Ya sabes, al crear la mafia, a qué referirse. Puede darle una propiedad específica, separada de su nombre, para sustituirla en cadenas de ataque. Las armas pueden tener múltiples cadenas para la variedad, y pueden sustituir con más detalle. En lugar de 'atacante', pueden pedir específicamente 'atacante-pronombre' o 'atacante-nombre propio'. Las multitudes también pueden tener versiones plurales de estos identificadores, si sus 'abejas' están representadas por múltiples mobs y no solo por una sola mafia que se llama 'abejas'.

Entonces tendrías una mafia como

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

Luego, su cadena de ataque solicita elementos específicos como este ...

¡% atacante-pronombre% golpear% defensor-específico_común% para% daño%! ¡% defender-pronombre% realmente sintió eso!

Blecki
fuente
5

Hay un conjunto de módulos para Perl que comienzan con Lingua :: EN :: Inflect que se ocupa de estos problemas. Incluso si está utilizando un idioma diferente, las opciones de API realizadas pueden ayudarlo a enmarcar su propio diseño.

mghicks
fuente
¡Hábil! También hay un puerto Python de esta biblioteca: pypi.python.org/pypi/inflect/0.2.1
amitp
3

La forma en que manejo esto es a través de un gran conjunto de sistemas que, entre otras cosas, implica modelar el mensaje como una estructura de datos en lugar de una cadena. Los valores para el atacante y el defensor son sus objetos reales; el verbo ("infligir" en su mensaje) está marcado como tal y conoce el objeto para la persona que lo realiza, de modo que el procesador de mensajes sabe que debe mostrarse en primera persona al actor y en segunda persona a todos los demás. Los objetos también saben si sus nombres son propios o no (y, por lo tanto, si "el" o "a / an" se les debe aplicar alguna vez), existen modelos de datos que me permiten especificar que "el" o "a / an "normalmente se esperaría que se aplicara a un nombre no apropiado en esa posición, y mucho más.

Este hilo en Mudconnector es muy similar a su pregunta, y voy a los detalles de mi sistema ampliamente allí. Básicamente, la forma en que lo hago es lo que desearía si desea estar completamente libre de las capacidades subyacentes de su sistema de mensajería y está dispuesto a pagar un precio en la curva de aprendizaje por eso. (Al igual que vi vs. nano.)

caos
fuente
0

Te aconsejaría que BESAS (que sea estúpidamente simple) y que aproveches las ventajas de la interfaz de texto.

Simplifica, simplifica, simplifica tanto como puedas. Elimine la complejidad incluso antes de comenzar a pensar en la codificación. En lugar de una oración, use dos oraciones para describir un evento, como hacen muchos juegos. ¿Recuerdas la puerta de Baldur ? No es un juego de texto, pero el daño se describe con texto;)


Divida la información entre la fuente del evento y su consecuencia.

Por ejemplo :

  • Merlín lanzó un hechizo de bola de fuego.
  • Madmax recibe 3 daños de fuego.
  • Un duende es golpeado con 2 daños de fuego.
  • Un duende es golpeado con 10 daños de fuego.
  • etc ...

También recomendaría usar siempre la tercera persona del singular, ya sea un nombre propio o común.

Además, aunque el inglés es un idioma internacional importante, si quieres tener un mayor impacto emocional y tocar un mercado más grande, es posible que necesites traducir tu juego a otros idiomas.

Si tiene la intención de hacerlo, tenga en cuenta que la estructura de la oración puede ser diferente en otros idiomas. Según Wikipedia , el 45% de los idiomas disponibles construyen la oración en el orden SOV (sujeto-objeto-verbo), donde el 42% (como el inglés) construye la oración en el orden SVO; como Inglés.

Douglas
fuente
Baldur's Gate tiene un motor totalmente gráfico para mostrar la salida, pero para una ficción interactiva, el texto es toda la interfaz y la retroalimentación allí. Debería estar más pulido para ese caso, en mi humilde opinión.
Extrakun