Tipps zur Implementierung der MMO-Questmechanik?

14

Welche Tools, Muster oder Best Practices würden Sie zur Implementierung der unten aufgeführten Questmechaniken empfehlen?

Ich spreche über die Softwarearchitektur (wie allgemein sollten Sie sein) und die Auswahlmöglichkeiten für die Objektverdrahtung, das Ereignisabonnement und die Darstellung von Bedingungen. Erwähnung von Tools / Bibliotheken, die Sie erfolgreich verwendet haben, sind willkommen. Bearbeiten: Wenn Sie Skripte verwenden, welches Setup empfehlen Sie?

Bedarf:

  • einfaches 2D mmo (rpg)
  • Alle Spieldaten, einschließlich Quests, werden in einer relationalen Datenbank gespeichert
  • Jedes Ereignis im Spiel kann eine neue Quest für Spieler oder die Weiterentwicklung bestehender Quests auslösen
  • Eine Quest kann eine beliebige Anzahl von Bedingungen haben, die erfüllt sein müssen, bevor die Quest Spielern zur Verfügung steht
  • Eine Quest kann aus einer beliebigen Anzahl von Unterquests / Schritten mit beliebigen Bedingungen bestehen
  • Quests würden von einfach reichen:

    rede mit A - töte 5 B - rede mit A - erhöhe dauerhaft die Gesundheit

  • zu ziemlich involviert:

    benutze den Gegenstand in Bereich X - gehe zu Bereich Y - ein Bot wird erscheinen - töte den Bot ohne mehr als 10% Schaden zu erleiden - Bot lässt den Gegenstand fallen - nimm den Gegenstand auf - Portal entriegelt - bringe den Gegenstand zu J hinter dem Portal - erhalte Gold und Erfahrung - Portal erneut passieren lassen - Portal für diesen Spieler sperren

  • Level-Instanzen sind eine Möglichkeit (Spieler können bestimmte Quests in Teams oder in Isolation abschließen, wodurch der Level-Standort nur für diese Teilnehmer entsteht).

  • Quests sollte vorzugsweise überschaubar , ein Welt - Editor ohne Scripting oder Programmierkenntnisse ( Edit: nicht gegen Scripting im Allgemeinen obwohl befürworten)
  • Ich gehe von C ++ als Implementierungssprache aus

Ich dachte, wenn ich eine Kette von Ereignissen und Bedingungen kombinieren könnte, könnten wir komplexere und damit möglicherweise spannendere Aufgaben modellieren. Ich habe mit dem Rollen meiner eigenen ECA-Engine (Events-Conditions-Actions) experimentiert, aber das könnte übertrieben sein. Es war besonders schwierig, generische Bedingungen zu modellieren, ohne Skripte zu verwenden.

jmp97
quelle
Gibt es einen bestimmten Grund, warum Sie Skripte übersprungen haben? (wie zB lua / gamemonkey etc).
Simon
Hauptsächlich aufgrund mangelnder Erfahrung und aufgrund (möglicherweise unsauberer) Annahmen, wie sich dies negativ auf die Leistung auswirken könnte. Außerdem wollte ich die weltweite Bearbeitung so einfach wie möglich halten. Ich bin jedoch offen für die Verwendung von Skripten.
jmp97
1
Ich stimme zu, ohne Scripting-Unterstützung wird es schwierig sein, den Quests Abwechslung zu verleihen, ohne die Engine-Programmierer einzubeziehen.
drxzcl
1
Skriptsprachen sind in der Regel schnell genug, sodass dies kein Problem darstellt. Ich würde dringend empfehlen, sie zu verwenden. Das heißt, ein Großteil von WoWs Skripten basiert auf dem Auslösen von Zaubersprüchen und Ereignissen. "Talk to A" würde hinter den Kulissen bewirken, dass A den Spieler "verzaubert", und die Quest würde tatsächlich codiert "dies ist erfolgreich, wenn der Spieler den Zauber # 55728 erhält". Dann brauchst du nur noch eine kleine KI-Kodierung, damit Kreaturen den Spieler verzaubern und du bist bereit.
ZorbaTHut
1
Moderne Skriptsprachen (wie die Lua Vm) sind wahrscheinlich schnell genug für Sie. Sie sind einfach zu verwenden, einfach zu implementieren, Sie können die Skripte in Runtime neu laden, Sie können die Skripte in Runtime debuggen und schrittweise ausführen und Sie können VIEL schneller iterieren, während Sie Inhalte erstellen. Ich empfehle dringend, sich eine Skript-Engine (Beispiele: lua und gamemonkey) anzuschauen, um Quests zu schreiben.
Simon

Antworten:

6

Erst eine Warnung, dann ein Rat.

Als ich das letzte Mal ein solches System implementieren musste, verwendete ich keine Engine, die ursprünglich für MMO-ähnliche Anwendungen gedacht war. Das Questsystem, mit dem es ausgeliefert wurde, war auf Einzelspieler ausgelegt und konnte nicht verwendet werden.

Es endete damit, dass ich Skripte für alle Objekte, die mit den Quests zu tun haben, mehr oder weniger von Hand schreiben musste (Pseudocode):

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

Dies ist ein absoluter Albtraum. Es gibt keine Möglichkeit herauszufinden, wie die Quest funktioniert, ohne das ganze Spiel über zu spülen. Mach das nicht.

Ich würde empfehlen, ein System zu erstellen, in dem die gesamte Quest (Zeile) als endliche Zustandsmaschine dargestellt wird, mit Ereignissen, die auf Übergänge geprüft werden sollen, und Skripten, die auf diesen Übergang reagieren sollen. Das macht es einfach, den Überblick zu behalten, wo Sie sich in einer bestimmten Quest (Zeile) befinden, und hält den Status aller Quests sauber gekapselt.

Wenn Sie möchten, können Sie in Ihrem World Editor eine Bibliothek mit Skripten / Skriptvorlagen für häufige Vorkommnisse erstellen (der Spieler spricht mit dem NPC, der Spieler tötet den Mob usw.).

Ich würde mich nicht zu sehr um die Skriptleistung kümmern, solange Sie Ihre Ereignisskripte nicht zu oft auslösen. Als Faustregel gilt, dass Skripte mindestens eine Größenordnung unter der "Kern" -Spiellogik (Animation, Physik usw.) abfeuern sollten. Sie sollten auf Ereignisse reagieren, anstatt regelmäßig zu feuern, um zu überprüfen, ob eine Bedingung erfüllt ist.

drxzcl
quelle
3
Seien Sie jedoch gewarnt, Statemachines neigen dazu, sehr schnell verwickelt zu werden, wenn Sie möchten, dass Questpfade durch äußere Faktoren beeinflusst werden, oder wenn Ihre Quests relativ komplex sind. Auch mehrere Quest-Statemaschinen (wenn mehrere Quests aktiv sein können) können ein Albtraum sein. Da es sich bei jedem Programm im Wesentlichen um eine Statemachine handelt, kann dies durchgeführt werden. Komplexe Probleme bleiben jedoch komplex, unabhängig davon, wie Sie sie einschließen. Ein gutes Beispiel (imo) ist Oblivion, wo einige Mods andere Mods daran hindern zu funktionieren - Ihre Vor- und Nachbedingungen für Zustände müssen entweder ziemlich solide oder extrem fehlerverzeihend / fehlertolerant sein.
Kaj
Ja, Kaj ist richtig. Gehen Sie jetzt einfach in die WoW-Foren und lesen Sie, wie sich Leute über unvollendete Quests beschweren. Es passiert die ganze Zeit, auch in der Major League. Es ist wirklich schwer, alles richtig zu machen.
drxzcl
3

In unserem System wird grundsätzlich für jeden Missionsschritt ein Ausdruck ausgeführt (eine benutzerdefinierte Mini-Skriptsprache, aber tcl / lua / python funktioniert genauso gut oder Sie erstellen selbst etwas). Dies gilt für "persönliche Missionen", die an einen bestimmten Spieler gebunden sind. Jeder Unterschritt ist dann Teil einer FSM (Finite State Machine) für die Mission selbst (die möglicherweise nur ein Unterschritt einer anderen Mission ist). Es gibt auch "Kartenmissionen", die eine einzige FSM haben und an die Karte gebunden sind, anstatt an einen Spieler (denken Sie an die öffentlichen Quests von WAR), aber die Unterschritte funktionieren im Grunde gleich.

Was diese Ausdrücke tatsächlich betrachten, sind Ereignisse, die vom System gesendet werden, wie "NPC gestorben" oder "Interaktion abgeschlossen". Dies bedeutet, dass Sie die verschiedenen Teile etwas entkoppeln können. Die Spielsysteme senden Ereignisse nur nach Bedarf aus. Die Missionsskripte hören Ereignisse nur ab und kümmern sich nicht darum, woher sie kommen. Wenn Sie sich auch darauf einlassen, dass die Missions-FSMs mit dem Weltzustand interagieren (diesen Kontakt nur im Missionszustand X anzeigen), können Sie viel Leistung aus dem System herausholen.

coderanger
quelle