Generazione di descrizioni di attacchi in stile MUD grammaticalmente corretti


13

Attualmente sto lavorando a un gioco testuale, in cui il risultato di un round di combattimento è simile a questo

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

In questo momento, ho appena scambiato% attaccante% con il nome dell'attaccante e% difensore% con il nome del difensore. Tuttavia, la descrizione funziona, ma non legge correttamente. Dato che il gioco è solo tutto testo, non voglio ricorrere a descrizioni generiche (come "Usi Attack on Goblin per 5 danni", che probabilmente risolvono il problema)

Come faccio a generare descrizioni corrette per i casi in cui% attaccante% si riferisce

  • "Tu", il giocatore? "Tu infliggi ..." è sbagliato
  • "Api" o altro plurale? Ho bisogno di sapere in qualche modo che dovrei aggiungere il prefisso "Il"
  • Se% attaccante% è un nome generico, come "Goblin", leggerà strano invece che% attaccante% sia un nome. Confronta "Goblin inflicts ..." vs. "Aldraic Swordbringer inflicts ...."

In che modo i giochi basati su testo di solito risolvono tali problemi?

Risposte:


15

L'approccio% attacker% può essere esteso per includere alcune informazioni diverse dai soli nomi degli oggetti:

  1. Il verbo può essere singolare o plurale. Questo dipende dall'argomento. " Attacchi X" (soggetto singolare in 2a persona) contro " Attacchi di Extrakun X" (soggetto singolare in 3a persona) contro "I goblin attaccano X" (soggetto plurale in 3a persona). La maggior parte dei verbi necessita solo di -sun'aggiunta, ma ci sono alcune eccezioni.
  2. Il sostantivo può essere un nome proprio ("Il Goblin attacca X") o un nome comune (" Un Goblin attacca X"). I nomi comuni che iniziano con un suono di vocale dovrebbero usare "an" anziché "a". Può essere un nome comune ma con una sola istanza nel contesto attuale (" Il goblin attacca X").
  3. Il nome può variare in numero, da zero ("Colpisci nessun goblin ") a uno ("Colpisci un goblin ") a molti ("Colpisci tre goblin "). Molti nomi hanno solo bisogno di -so -esaggiunti, ma ci sono molte eccezioni.
  4. I soggetti e gli oggetti possono essere semplici (" Un goblin ") o composti (" Un goblin e suo fratello ").
  5. I nomi comuni all'inizio della frase devono essere scritti in maiuscolo, ma se il nome ha un articolo o se è composto, si desidera solo scrivere in maiuscolo la prima parola. I nomi propri sono sempre in maiuscolo.
  6. La posizione del soggetto ( " Lei ha colpito il goblin ') e la posizione dell'oggetto (' Il folletto ha colpito il suo ") utilizzano diversi pronomi.
  7. I possessivi possono essere generati aggiungendo 'sse singolare (" Ascia di un goblin "), 'se plurale (" Asce di due goblin "), ma i pronomi hanno le loro regole ("La tua ascia").

Per l'inglese, ho scritto a Python una libreria di generazione di testi derivata da un MUD chiamato JaysHouseMOO. Sentiti libero di studiare o copiare il codice . Non ha una buona biblioteca di casi eccezionali; dovrai aggiungerlo con le parole usate nel tuo gioco. Temo che il mio codice trasferito non sia stato ampiamente testato. Potrebbe anche essere necessario aggiungere più casi per i giochi (è stato progettato per un MUD sociale, non per un MUD di gioco).

Il tuo esempio sarebbe scritto come "%1I %1:(inflicts) a serious wound (%2n damage) on %3i". I numeri %1, %2, %3dicono che quale oggetto deve essere sostituito; I/ idigli di aggiungere un articolo indiretto ("a", "an") se necessario; ngli dice di mostrare il nome senza articoli; :(inflicts)gli dice di coniugare il verbo per quell'oggetto.

Ecco l'output da mostrare all'attaccante, al difensore e a tutti gli altri:

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

Nota se lo avessi dato (1, 'point')avrebbe stampato "1 punto" invece di "1 punti". È qualcosa che mi infastidisce nel testo del gioco, quindi mi sono assicurato di includere una funzione per semplificare la stampa in modo corretto.

Ecco un altro esempio, con i nomi composti 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.")

Questi esempi sono in inglese e tracciano solo maschio / femmina, pronomi, verbi / sostantivi singolari / plurali e nomi propri / comuni. Ciò che devi monitorare varierà in base alle lingue e al tipo di testo nel tuo gioco. In spagnolo ci sono pronomi formali e informali. Diverse lingue hanno forme maschili e femminili di verbi. I pronomi giapponesi dipendono dallo stato del soggetto rispetto all'oggetto. In alcune lingue la coniugazione del verbo può implicitamente includere l'argomento. Determina tutti i tipi di testo che vuoi generare e le lingue in cui vuoi tradurre, e questo ti dirà cosa devi tracciare nei tuoi oggetti di gioco. Quando si crea il contenuto, è possibile includere le annotazioni necessarie e casi eccezionali.


1
+1, ottimo riassunto dei problemi. Una cosa che aggiungerò è che i giocatori tendono a perdonare abbastanza piccoli errori grammaticali per il testo generato come questo fintanto che il resto delle informazioni (importo del danno, fonte, bersaglio, proc) è accurato - spara per una grammatica corretta al 95% , perché l'ultimo 5% è ridicolmente difficile.

6

Invece di avere una singola stringa e provare a sostituirla correttamente, potresti averne un'intera serie. Inizia con gli oggetti. Sai, quando crei il mob, a cosa fare riferimento. Puoi assegnargli una proprietà specifica, separata dal suo nome, per la sostituzione in stringhe di attacco. Le armi possono avere più stringhe per varietà e possono sostituire più in dettaglio. Invece di "attaccante", possono chiedere specificamente "pronome-attaccante" o "nome-attaccante". I mob possono avere anche versioni plurali di questi identificatori, se le tue "api" sono rappresentate da più mob e non solo un singolo mob che sembra essere chiamato "api".

Quindi avresti un mob come

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

Quindi la tua stringa di attacco richiede elementi specifici come questo ...

% pronome attaccante% hit% defender-specific_common% per% danno%! % difensore-pronome% l'ha davvero sentito!



3

Il modo in cui lo gestisco è attraverso un ampio set di sistematica che, tra le altre cose, implica la modellazione del messaggio come una struttura di dati piuttosto che una stringa. I valori per l'attaccante e il difensore sono i loro oggetti reali; il verbo ("inflict" nel tuo messaggio) è contrassegnato come tale e conosce l'oggetto per la persona che lo esegue, in modo che il renderizzatore di messaggi sappia che deve essere mostrato in prima persona all'attore e in seconda persona a tutti gli altri. Gli oggetti sanno anche se i loro nomi sono propri o meno (e quindi, se "the" o "a / an" debbano mai essere applicati a loro), ci sono modelli di dati che mi permettono di specificare che "the" o "a / an "normalmente ci si aspetterebbe di essere applicato a un nome non proprio in quella posizione, e molto altro.

Questo thread su Mudconnector è molto simile alla tua domanda, e vado ampiamente nei dettagli del mio sistema. Fondamentalmente, il modo in cui lo faccio è quello che vorresti se vuoi essere completamente libero dalle capacità di base del tuo sistema di messaggistica e sei disposto a pagare un prezzo nella curva di apprendimento per questo. (Proprio come vi vs. nano.)


0

Ti consiglierei di KISS (mantenerlo stupidamente semplice) e sfruttare i vantaggi dell'interfaccia di testo.

Semplifica, semplifica, semplifica il più possibile. Rimuovi la complessità prima ancora di iniziare a pensare alla programmazione. Invece di una frase, usa due frasi per descrivere un evento, come fanno molti giochi. Ricordi la porta di Baldur ? Non è un gioco di testo, ma il danno è descritto con il testo;)


Dividi le informazioni tra la fonte dell'evento e le sue conseguenze.

Per esempio :

  • Merlino lanciò un incantesimo di palla di fuoco.
  • Madmax viene colpito con 3 danni da fuoco.
  • Un folletto viene colpito con 2 danni da fuoco.
  • Un folletto viene colpito con 10 danni da fuoco.
  • eccetera...

Vorrei anche consigliare di usare sempre la terza persona singolare, sarebbe un nome proprio o comune.

Inoltre, sebbene l'inglese sia un'importante lingua internazionale, se vuoi avere un maggiore impatto emotivo e toccare un mercato più ampio, potresti dover tradurre il tuo gioco in altre lingue.

Se si intende farlo, tenere presente che la struttura della frase potrebbe essere diversa in altre lingue. Secondo Wikipedia , il 45% delle lingue disponibili costruisce la frase nell'ordine SOV (soggetto-oggetto-verbo), dove il 42% (come l'inglese) costruisce la frase nell'ordine SVO; come l'inglese.


Baldur's Gate ha un motore completamente grafico per accompagnarlo per mostrare l'output, ma per una fiction interattiva, il testo è tutta l'interfaccia e il feedback lì. Dovrebbe essere più raffinato per quel caso, IMHO.
Extrakun,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.