Génération de descriptions d'attaque de style MUD grammaticalement correctes


13

Je travaille actuellement sur un jeu basé sur du texte, où le résultat d'un round de combat va quelque chose comme ça

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

Pour l'instant, je permute juste% attacker% avec le nom de l'attaquant, et% defender% pour le nom du défenseur. Cependant, la description fonctionne, mais ne lit pas correctement. Étant donné que le jeu est uniquement composé de texte, je ne veux pas recourir à des descriptions génériques (telles que "Vous utilisez Attaque sur Gobelin pour 5 dégâts", ce qui résout sans doute le problème)

Comment générer des descriptions correctes pour les cas où% attaquant% fait référence à

  • "Vous", le joueur? "Tu inflige ..." est faux
  • "Abeilles", ou autre pluriel? J'ai besoin d'une façon ou d'une autre de savoir que je devrais préfixer le nom avec un "The"
  • Si% attacker% est un nom générique, tel que "Goblin", il se lira bizarrement, par opposition à% attacker% étant un nom. Comparer "Gobelin inflige ..." vs. "Aldraic Swordbringer inflige ...."

Comment les jeux textuels résolvent-ils généralement ces problèmes?

Réponses:


15

L'approche% attacker% peut être étendue pour inclure des informations autres que les noms des objets:

  1. Le verbe peut être singulier ou pluriel. Cela dépend du sujet. "Vous attaquez X" (sujet singulier à la 2ème personne) vs "Extrakun attaque X" (sujet singulier à la 3ème personne) vs "Les gobelins attaquent X" (sujet pluriel à la 3ème personne). La plupart des verbes ont juste besoin d'un -sajout, mais il y a quelques exceptions.
  2. Le nom peut être un nom propre ("Le gobelin attaque X") ou un nom commun (" Un gobelin attaque X"). Les noms communs commençant par un son de voyelle doivent utiliser "an" au lieu de "a". Il peut s'agir d'un nom commun mais n'ayant qu'une seule instance dans le contexte actuel (" Le gobelin attaque X").
  3. Le nom peut varier en nombre, de zéro ("Vous frappez pas de gobelins ") à un ("Vous frappez un gobelin ") à plusieurs ("Vous frappez trois gobelins "). De nombreux noms ont juste besoin d'un -sou -esajoutés, mais il existe de nombreuses exceptions.
  4. Les sujets et les objets peuvent être simples (" Un gobelin ") ou composés (" Un gobelin et son frère ").
  5. Les noms communs au début de la phrase doivent être en majuscules, mais si le nom a un article ou s'il est composé, vous ne voulez mettre en majuscule que le premier mot. Les noms propres sont toujours en majuscule.
  6. La position de sujet ( « Elle a frappé le gobelin « ) et la position de l' objet ( » Le gobelin a frappé son ») utilisent différents pronoms.
  7. Les possessifs peuvent être générés en ajoutant 'sif singulier ("Une hache de gobelin "), 'if pluriel ("Deux axes de gobelins "), mais les pronoms ont leurs propres règles (" Votre hache").

Pour l'anglais, j'ai écrit Python une bibliothèque de génération de texte dérivée d'un MUD appelé JaysHouseMOO. N'hésitez pas à étudier ou copier le code . Il n'a pas une bonne bibliothèque de cas exceptionnels; vous devrez ajouter cela avec les mots utilisés dans votre jeu. Je crains que mon code porté ne soit pas largement testé. Il pourrait également avoir besoin de plus de cas ajoutés pour les jeux (il a été conçu pour une MUD sociale, pas une MUD de jeu).

Votre exemple serait écrit comme "%1I %1:(inflicts) a serious wound (%2n damage) on %3i". Les nombres %1, %2, %3disent que ce qui objet doit être substitué; I/ lui idire d'ajouter un article indirect ("a", "an") si nécessaire; nlui indique d'afficher le nom sans articles; :(inflicts)lui dit de conjuguer le verbe de cet objet.

Voici la sortie à montrer à l'attaquant, au défenseur et à tout le monde:

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

Notez que si vous l'aviez donné, (1, 'point')il aurait imprimé "1 point" au lieu de "1 point". C'est quelque chose qui me dérange dans le texte du jeu, donc je me suis assuré d'inclure une fonctionnalité pour le rendre facile à imprimer correctement.

Voici un autre exemple, avec des noms composés, et "un" contre "un":

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

Ces exemples sont en anglais et ne suivent que les noms masculins / féminins, les pronoms, les verbes / noms singuliers / pluriels et les noms propres / communs. Ce que vous devez suivre variera selon les langues et le type de texte dans votre jeu. En espagnol, il existe des pronoms formels et informels. Plusieurs langues ont des verbes masculins et féminins. Les pronoms japonais dépendent du statut du sujet par rapport à l'objet. Dans certaines langues, la conjugaison des verbes peut implicitement inclure le sujet. Déterminez tous les types de texte que vous souhaitez générer et les langues que vous souhaitez traduire, et cela vous dira ce dont vous avez besoin pour suivre dans vos objets de jeu. Lorsque vous créez le contenu, vous pouvez inclure les annotations nécessaires et les cas exceptionnels.


1
+1, excellent résumé des problèmes. Une chose que j'ajouterai est que les joueurs ont tendance à être assez indulgents envers les erreurs grammaticales mineures pour le texte généré comme celui-ci tant que le reste des informations (montant des dommages, source, cible, procs) est précis - tirez pour une grammaire correcte à 95% , car les 5% restants sont ridiculement durs.

6

Au lieu d'avoir une seule chaîne et d'essayer de la remplacer correctement, vous pouvez en avoir un ensemble complet. Commencez par les objets. Vous savez, lors de la création de la foule, à quoi l'appeler. Vous pouvez lui donner une propriété spécifique, distincte de son nom, pour la remplacer par des chaînes d'attaque. Les armes peuvent avoir plusieurs chaînes pour la variété et peuvent se substituer plus en détail. Au lieu de «attaquant», ils peuvent demander spécifiquement «attaquant-pronom» ou «attaquant-propername». Les mobs peuvent également avoir plusieurs versions de ces identifiants, si vos «abeilles» sont représentées par plusieurs mobs et pas seulement une seule mob qui se trouve être appelée «abeilles».

Vous auriez donc une foule comme

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

Ensuite, votre chaîne d'attaque demande des éléments spécifiques comme ça ..

% attaquant-pronom% a frappé% defender-specific_common% pour% damage%! % defender-pronom% l'a vraiment ressenti!



3

La façon dont je gère cela est à travers un large ensemble de systèmes qui, entre autres, implique la modélisation du message comme une structure de données plutôt que comme une chaîne. Les valeurs pour l'attaquant et le défenseur sont leurs objets réels; le verbe ("infliger" dans votre message) est marqué comme tel et connaît l'objet pour la personne qui l'exécute, de sorte que le rendu du message sache qu'il doit être affiché à la première personne pour l'acteur et à la deuxième personne pour tout le monde. Les objets savent également si leurs noms sont corrects ou non (et donc, si "le" ou "a / an" doit leur être appliqué), il existe des modèles de données qui me permettent de spécifier que "le" ou "a / an" "devrait normalement être appliqué à un nom non approprié dans cette position, et bien plus encore.

Ce fil sur Mudconnector est très similaire à votre question, et j'entre dans les détails de mon système là-bas. Fondamentalement, la façon dont je le fais est ce que vous voudriez si vous voulez être complètement libre des capacités sous-jacentes de votre système de messagerie et êtes prêt à payer un prix dans la courbe d'apprentissage pour cela. (Tout comme vi vs nano.)


0

Je vous conseillerais de KISS (garder les choses stupidement simples), et d'exploiter les avantages de l'interface texte.

Simplifiez, simplifiez, simplifiez autant que vous le pouvez. Supprimez la complexité avant même de commencer à penser au codage. Au lieu d'une phrase, utilisez deux phrases pour décrire un événement, comme le font de nombreux jeux. Vous souvenez-vous de la porte de Baldur ? Ce n'est pas un jeu de texte, mais les dégâts sont décrits avec du texte;)


Répartissez les informations entre la source de l'événement et ses conséquences.

Par exemple :

  • Merlin lança un sort de boule de feu.
  • Madmax est touché avec 3 dégâts de feu.
  • Un gobelin est touché avec 2 dégâts de feu.
  • Un gobelin subit 10 dégâts de feu.
  • etc...

Je conseillerais également de toujours utiliser la troisième personne du singulier, que ce soit un nom propre ou commun.

De plus, bien que l'anglais soit une langue internationale importante, si vous voulez avoir plus d'impact émotionnel et toucher un plus grand marché, vous devrez peut-être traduire votre jeu dans d'autres langues.

Si vous avez l'intention de le faire, sachez que la structure des phrases peut être différente dans d'autres langues. Selon Wikipedia , 45% des langues disponibles construisent la phrase dans l'ordre SOV (sujet-objet-verbe), où 42% (comme l'anglais) construisent la phrase dans l'ordre SVO; Comme l'anglais.


Baldur's Gate a un moteur entièrement graphique pour l'accompagner pour afficher la sortie, mais pour une fiction interactive, le texte est toute l'interface et les commentaires là-bas. Il devrait être plus raffiné pour ce cas, à mon humble avis.
Extrakun
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.