Gerando descrições de ataques gramaticalmente corretas no estilo MUD

13

Atualmente, estou trabalhando em um jogo baseado em texto, onde o resultado de uma rodada de combate é algo como isto

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

No momento, eu apenas troco% attacker% pelo nome do atacante e% defender% pelo nome do defensor. No entanto, a descrição funciona, mas não é lida corretamente. Como o jogo é apenas todo o texto, não quero recorrer a descrições genéricas (como "Você usa o Attack on Goblin por 5 de dano", o que sem dúvida resolve o problema)

Como faço para gerar descrições corretas para os casos em que% attacker% se refere a

  • "Você", o jogador? "Você inflige ..." está errado
  • "Abelhas", ou outro plural? De alguma forma, preciso saber que devo prefixar o nome com um "The"
  • Se% attacker% for um substantivo genérico, como "Goblin", será estranho o nome de% attacker%. Compare "Goblin inflige ..." vs. "Aldraic Swordbringer inflige ...."

Como os jogos baseados em texto geralmente resolvem esses problemas?

Extrakun
fonte

Respostas:

15

A abordagem do% attacker% pode ser estendida para incluir algumas informações além dos nomes dos objetos:

  1. O verbo pode ser singular ou plural. Isso depende do assunto. "Você ataca X" (sujeito singular da 2ª pessoa) vs. "Extrakun ataca X" (sujeito singular da 3ª pessoa) vs. "Os goblins atacam X" (sujeito plural da 3ª pessoa). A maioria dos verbos só precisa de um -sacréscimo, mas existem algumas exceções.
  2. O substantivo pode ser um nome próprio (" Goblin ataca X") ou um substantivo comum (" Um goblin ataca X"). Substantivos comuns que começam com um som de vogal devem usar "an" em vez de "a". Pode ser um substantivo comum, mas com apenas uma instância no contexto atual (" O goblin ataca X").
  3. O substantivo pode variar em número, de zero ("Você não bate goblins ") a um ("Você bate um goblin ") a muitos ("Você bate três goblins "). Muitos substantivos só precisam de um -sou de um -esacréscimo, mas há muitas exceções.
  4. Sujeitos e objetos podem ser simples (" Um duende ") ou composto (" Um duende e o irmão dela ").
  5. Substantivos comuns no início da frase precisam ser capitalizados, mas se o substantivo tiver um artigo ou se for composto, você deseja colocar apenas a primeira palavra em maiúscula. Substantivos próprios sempre estão em maiúsculas.
  6. A posição do sujeito (" Ela golpeou o duende") e a posição do objeto ("O duende bateu nela ") usam pronomes diferentes.
  7. Possessivos podem ser gerados adicionando 'sse singular (" Machado de um duende "), 'se plural (" Machado de dois duendes "), mas os pronomes têm suas próprias regras (" Seu machado").

Em inglês, escrevi para o Python uma biblioteca de geração de texto derivada de um MUD chamado JaysHouseMOO. Sinta-se livre para estudar ou copiar o código . Não possui uma boa biblioteca de casos excepcionais; você terá que adicionar isso com as palavras usadas no seu jogo. Receio que meu código portado não seja extensivamente testado. Também pode ser necessário adicionar mais casos para jogos (ele foi projetado para um MUD social, não para um MUD de jogos).

Seu exemplo seria escrito como "%1I %1:(inflicts) a serious wound (%2n damage) on %3i". Os números %1, %2, %3contá-la qual o objecto é para ser substituído; I/ idigo para adicionar um artigo indireto ("a", "an"), se necessário; ndiz para exibir o substantivo sem artigos; :(inflicts)diz para conjugar o verbo para esse objeto.

Aqui está o resultado a ser mostrado ao atacante, ao defensor e a todos os outros:

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

Observe que se você o tivesse fornecido, (1, 'point')ele teria impresso "1 ponto" em vez de "1 ponto". Isso é algo que me incomoda no texto do jogo, por isso certifiquei-me de incluir um recurso para facilitar a impressão correta.

Aqui está outro exemplo, com substantivos compostos e "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.")

Esses exemplos estão em inglês e acompanham apenas masculino / feminino, pronomes, verbos / substantivos no singular / plural e substantivos comuns / próprios. O que você precisa acompanhar varia entre os idiomas e o tipo de texto no seu jogo. Em espanhol existem pronomes formais e informais. Várias línguas têm formas masculinas e femininas de verbos. Os pronomes japoneses dependem do status do sujeito em relação ao objeto. Em algumas línguas, a conjugação verbal pode implicitamente incluir o sujeito. Determine todos os tipos de texto que você deseja gerar e os idiomas para os quais deseja traduzir, e isso informará o que você precisa rastrear nos objetos do jogo. Ao criar o conteúdo, você pode incluir as anotações necessárias e casos excepcionais.

amitp
fonte
1
+1, ótimo resumo dos problemas. Uma coisa que vou acrescentar é que os jogadores tendem a perdoar pequenos erros gramaticais em textos gerados como esse, desde que o restante das informações (quantidade de danos, origem, alvo, procs) seja preciso - atinja 95% da gramática correta , porque os últimos 5% são ridiculamente difíceis.
6

Em vez de ter uma única string e tentar substituí-la adequadamente, você pode ter um conjunto inteiro delas. Comece com os objetos. Você sabe, ao criar a multidão, como ela deve se referir. Você pode atribuir a ele uma propriedade específica, separada do nome, para substituir as seqüências de ataque. As armas podem ter várias seqüências de caracteres para variedade e podem ser substituídas com mais detalhes. Em vez de 'atacante', eles podem solicitar especificamente 'pronome do atacante' ou 'nome do proponente do atacante'. Os mobs também podem ter versões plurais desses identificadores, se suas 'abelhas' forem representadas por vários mobs e não apenas por uma multidão que por acaso se chama 'abelhas'.

Então você teria uma multidão como

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

Em seguida, sua sequência de ataques solicita itens específicos como esse.

% attacker-pronoun% atingiu% defender-specific_common% por% dano%! % defensor-pronome% realmente sentiu essa!

Blecki
fonte
5

Há um conjunto de módulos para Perl começando com Lingua :: EN :: Inflect que lida com esses problemas. Mesmo se você estiver usando um idioma diferente, as opções de API feitas podem ajudar a enquadrar seu próprio design.

mghicks
fonte
Bacana! Também há uma porta Python dessa biblioteca: pypi.python.org/pypi/inflect/0.2.1
amitp
3

A maneira como lida com isso é através de um grande conjunto de sistemas que, entre outras coisas, envolve modelar a mensagem como uma estrutura de dados e não como uma string. Os valores para o atacante e o defensor são seus objetos reais; o verbo ("infligir" em sua mensagem) é marcado como tal e conhece o objeto para a pessoa que o executa, para que o representante da mensagem saiba que ele precisa ser exibido em primeira pessoa ao ator e na segunda pessoa a todos os outros. Os objetos também sabem se seus substantivos são adequados ou não (e, portanto, se "o" ou "a / an" deve ser aplicado a eles), existem modelos de dados que permitem especificar que "the" ou "a / an "normalmente seria esperado que fosse aplicado a um substantivo não apropriado nessa posição e muito mais.

Esse tópico no Mudconnector é muito parecido com a sua pergunta, e eu vou detalhadamente para os detalhes do meu sistema. Basicamente, da maneira que eu faço, é o que você gostaria se quisesse ficar completamente sem restrições pelos recursos subjacentes do seu sistema de mensagens e estivesse disposto a pagar um preço na curva de aprendizado por isso. (Muito parecido com vi vs. nano.)

caos
fonte
0

Aconselho você a KISS (mantenha-o estupidamente simples) e explore as vantagens da interface de texto.

Simplifique, simplifique, simplifique o máximo que puder. Remova a complexidade antes mesmo de começar a pensar em codificação. Em vez de uma frase, use duas frases para descrever um evento, como muitos jogos fazem. Você se lembra do portão de Baldur ? Não é um jogo de texto, mas o dano é descrito com texto;)


Divida as informações entre a origem do evento e suas consequências.

Por exemplo :

  • Merlin lançou um feitiço de bola de fogo.
  • Madmax é atingido com 3 danos de fogo.
  • Um duende é atingido com 2 danos de fogo.
  • Um duende é atingido com 10 de dano de fogo.
  • etc ...

Eu também aconselho a sempre usar a terceira pessoa do singular, seja um nome próprio ou comum.

Além disso, embora o inglês seja um idioma internacional importante, se você deseja ter mais impacto emocional e tocar em um mercado maior, pode ser necessário traduzir seu jogo para outros idiomas.

Se você pretende fazer isso, saiba que a estrutura da frase pode ser diferente em outros idiomas. Segundo a Wikipedia , 45% dos idiomas disponíveis constroem a sentença na ordem SOV (sujeito-objeto-verbo), enquanto 42% (como o inglês) constroem a sentença na ordem SVO; como inglês.

Douglas
fonte
O Baldur's Gate possui um mecanismo totalmente gráfico para mostrar a saída, mas para uma ficção interativa, o texto é toda a interface e o feedback. Deveria ser mais polido para esse caso, IMHO.
Extrakun