Suggerimenti per l'implementazione delle meccaniche di ricerca MMO?


14

Quali strumenti, schemi o migliori pratiche consiglieresti di implementare le meccaniche di ricerca indicate sotto i requisiti elencati?

Sto parlando dell'architettura del software (quanto generico dovresti essere) e delle scelte per il cablaggio degli oggetti, la sottoscrizione degli eventi e la rappresentazione delle condizioni. Le citazioni su strumenti / librerie utilizzate con successo sono benvenute. Modifica: se si utilizza lo scripting, quale configurazione consigliate?

Requisiti:

  • mmo 2D semplice (rpg)
  • tutti i dati di gioco, comprese le missioni, sono memorizzati in un database relazionale
  • qualsiasi evento nel gioco potrebbe innescare una nuova ricerca per i giocatori o l'avanzamento di missioni esistenti
  • una missione può avere un numero arbitrario di condizioni che devono essere soddisfatte prima che la missione sia disponibile per i giocatori
  • una missione può consistere in un numero arbitrario di missioni secondarie / passaggi con condizioni arbitrarie
  • le missioni vanno dal semplice:

    parla con A - uccidi 5 B - parla con A - aumenta permanentemente la salute

  • abbastanza coinvolto:

    usa l'oggetto nell'area X - vai all'area Y - si genererà un bot - uccidi il bot senza subire più del 10% di danno - il bot rilascia l'oggetto - raccogli l'oggetto - il portale si sblocca - consegna l'oggetto a J dietro il portale - ricevi oro ed esperienza - consenti di passare di nuovo il portale - blocca il portale per questo giocatore

  • le istanze di livello sono una possibilità (i giocatori possono completare determinate missioni in squadre o in isolamento che genereranno la posizione di livello solo per quei partecipanti)

  • Le missioni dovrebbero preferibilmente essere gestibili utilizzando un editor mondiale senza script o conoscenze di programmazione ( Modifica: non difendere contro gli script in generale però)
  • Presumo C ++ come linguaggio di implementazione

Pensavo che se avessi potuto combinare qualsiasi catena di eventi e condizioni potremmo modellare ricerche più complesse e quindi probabilmente più coinvolgenti. Ho sperimentato il lancio del mio motore ECA (Eventi-Condizioni-Azioni) ma potrebbe essere eccessivo. È stato particolarmente difficile modellare le condizioni generiche senza utilizzare alcun tipo di scripting.


C'è un motivo specifico per cui hai scelto di saltare gli script? (come lua / gamemonkey ecc.).
Simon

Principalmente a causa della mancanza di esperienza e a causa di ipotesi (probabilmente non chiare) su come ciò possa influire negativamente sulle prestazioni. Inoltre volevo mantenere l'editing mondiale il più semplice possibile. Tuttavia, sono aperto all'utilizzo degli script.
jmp97

1
Concordo, senza il supporto di scripting sarà difficile aggiungere varietà alle missioni senza coinvolgere i programmatori di motori.
drxzcl,

1
I linguaggi di scripting tendono ad essere abbastanza veloci da non costituire un problema. Consiglio vivamente di usarli. Detto questo, gran parte degli script di WoW si basano sull'innesco di incantesimi ed eventi. "Parla con A", dietro le quinte, indurrebbe A a "lanciare un incantesimo" sul giocatore, e la missione verrebbe effettivamente codificata "questo ha successo quando l'incantesimo # 55728 viene lanciato sul giocatore". Quindi hai solo bisogno di un po 'di codice AI per far sì che le creature lancino incantesimi sul giocatore e sei pronto.
ZorbaTHut

1
I moderni linguaggi di scripting (come Lua Vm) sono probabilmente abbastanza veloci per te. Sono facili da usare, facili da implementare, è possibile ricaricare gli script in fase di esecuzione, è possibile eseguire il debug e eseguire il passaggio degli script in fase di esecuzione e si può iterare MOLTO più velocemente durante la creazione di contenuti. Consiglio vivamente di esaminare un motore di scripting (esempi: lua e gamemonkey) al fine di eseguire script di quest.
Simon,

Risposte:


6

Prima un avvertimento, poi qualche consiglio.

L'ultima volta che dovevo implementare un sistema come questo non stavo usando un motore originariamente progettato per applicazioni simili a MMO. Il sistema di ricerca con cui è stato spedito è stato progettato per le attività a giocatore singolo e non può essere utilizzato.

Alla fine ho dovuto riempire gli script di tutti gli oggetti coinvolti nelle missioni più o meno a mano, in questo modo (pseudocodice):

Lever004_on_activate() {
    if isOnQuest(player, QUEST_0012) do_something();
    if isOnQuest(player, QUEST_0015) do_something_else();
}

Questo è un incubo completo. Non c'è modo di capire come funziona la missione senza scavare per tutto il gioco. Non farlo.

Consiglierei di creare un sistema in cui l'intera missione (linea) sia rappresentata come una macchina a stati finiti, con eventi per verificare la presenza di transizioni e script per reagire a detta transizione. Ciò rende facile tenere traccia di dove ti trovi in ​​una determinata missione (linea) e mantiene tutto lo stato della missione ben incapsulato.

Se lo desideri, puoi creare una libreria di script / modelli di script nel tuo editor mondiale per le ricorrenze comuni (il giocatore parla con NPC, il giocatore uccide il mob, ecc.)

Non mi preoccuperei troppo delle prestazioni degli script, purché non licenzi troppo spesso gli script degli eventi. Come regola generale, gli script dovrebbero sparare almeno un ordine di grandezza inferiore alla logica di gioco "core" (animazione, fisica, ecc.). Dovrebbero reagire agli eventi, invece di sparare periodicamente per verificare se una condizione è stata soddisfatta.


3
Tuttavia, le macchine a stati tendono ad essere molto contorte molto velocemente se vuoi che i percorsi delle missioni siano influenzati da fattori esterni o se le tue ricerche sono relativamente complesse. Anche più macchine a stati (se possono essere attive più missioni) può essere un incubo. Tuttavia, poiché in sostanza ogni programma è una macchina a stati, può essere fatto. Ma i problemi complessi rimangono complessi, indipendentemente da come li incapsuli. Un buon esempio (imo) è Oblivion in cui alcune mod impediscono il funzionamento di altre mod - le tue pre e postcondizioni per gli stati devono essere piuttosto solide o estremamente tolleranti / tolleranti agli errori.
Kaj,

Sì, Kaj ha ragione. Vai subito ai forum di WoW in questo momento e leggi le persone che si lamentano di ricerche non definibili. Succede sempre, anche nella lega maggiore. È davvero difficile ottenere tutto bene.
drxzcl,

3

Fondamentalmente il nostro sistema prevede l'esecuzione di un'espressione (mini linguaggio di scripting personalizzato ma tcl / lua / python funzionerebbe altrettanto bene o creerebbe qualcosa da soli) ogni frame del server per ogni passaggio della missione. Questo è per "missioni personali" che sono legate a un giocatore specifico. Ogni sottofase fa quindi parte di un FSM (macchina a stati finiti) per la missione stessa (che potrebbe essere solo una sottofase di un'altra missione). Ci sono anche "missioni cartografiche" che hanno un solo FSM e sono legate alla mappa invece che a un giocatore (pensa alle missioni pubbliche di WAR), ma i sottofasi funzionano sostanzialmente allo stesso modo.

Ciò che queste espressioni effettivamente guardano sono eventi trasmessi dal sistema come "NPC morto" o "interazione completa". Ciò significa che puoi in qualche modo disaccoppiare le varie parti, i sistemi di gioco inviano semplicemente gli eventi in base alle necessità, che gli script della missione ascoltano solo gli eventi e non si preoccupano della loro provenienza. Se ti concentri anche su questo, puoi far sì che la missione FSM interagisca con lo stato mondiale (mostra questo contatto solo quando si trova nello stato missione X) puoi ottenere molta potenza dal sistema.

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.