Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

10.01.2013, 00:18

Quest System

Guten Abend.
Ich bin gerade dabei ein kleines Spiel zu planen und würde gerne ein Quest system ins Spiel einbauen.
Während es zu den meinsten Spieleprogrammierproblemen verschiedene Artikel gibt, hab ich zu Quests gar nichts gefunden. Ich habe schon ausführlich gesucht. Deshalb wollte ich mal fragen: Wie wird ein einfaches Quest System implementiert? Mit einfach meine ich einfache Bedingungen wie: geh von A nach B oder Sprich mit C.
Vielen dank schonmal,
Foaly

BurningWave

Alter Hase

Beiträge: 1 106

Wohnort: Filderstadt/Konstanz

Beruf: Student

  • Private Nachricht senden

2

10.01.2013, 00:55

Ein Questsystem sollte vom eigentlichen Programm getrennt sein. D.h. Dialoge usw. sollten nicht direkt in das Spiel einkompiliert sein, um volle Flexibilität bei der Levelgestaltung zu gewährleisten, ohne jedes mal das Spiel neu kompilieren zu müssen. Es bietet sich deshalb an, Quests in Skripte auszulagern und diesen Zugriff auf benötigte, den Spielzustand angehende, Parameter zu bieten. In diesem Zusammenhang wird oft die Skriptsprache Lua genannt.

3

10.01.2013, 10:30

Vielen Dank erstmal für die schnelle Antwort!
Ich hatte mir schon gedacht, das ein Scriptsprache am besten wäre. Allerdings bin ich mir nicht so ganz im klaren, wie ich das ganze konkret implementieren könnte. Ich weiß natürlich, dass das ganze stark vom Spiel abhängt, aber ich würde gerne wissen ob mein Ansatz vernünftig klingt oder man das ganze an besten total anders machen. Angenommen beim ersten Gamestart wird das erste Script aufgerufen. Dieses beinhaltet den ersten Quest. Sagen wir "gehe zum Berg". Das Script sähe dann so aus (Pseudocode)

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
bool quest_main()
{
    if(is_near(player, berg)
    {
         add_to_inventory(gold, 20);
         start_quest(2);
         return true;
    }
    return false;
}
So nun habe ich eine QuestManager klasse mit einer update() function, die einmal pro loop ausgeführt wird. In der update() function wird nun die quest_main() function von jedem aktiven Script ausführt. Wenn sie true zurückgibt, dann ist dieser quest beendet. Einmal gestartet, ist das System praktisch ein Selbstläufer, weil ein Script selbst neue Quests (also Scripte) starten kann. Das System ermöglicht auch mehrere Quests unabhängig von einander zu haben.

Ich habe zwar schon mit scriptsprachen gearbeitet, aber habe trotzdem noch nicht so viel erfahrung damit. Mach der Ansatz so wie er da oben steht sinn oder hat jemand Verbesserungsvorschläge oder einen besseren Ansatz?
Vielen Dank,
Foaly

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

4

10.01.2013, 10:37

Halte ich für keine gute Idee. Ich würde möglichst versuchen das Event-basiert zu halten. Erstens weil es weniger Performance fordert als bei jedem Update alle Quests zu fragen und zweitens weil die Quest-Scripte dann mit viel weniger State-Checks auskommen. Kandidaten für Events für die sich Quests registrieren könnten sind z.B.: Gegenstand erhalten oder verloren, Monster besiegt, Position erreicht, mit NPC gesprochen, etc, etc.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

5

10.01.2013, 11:13

Das war eben das was ich mir dachte, das ziemlich viel Rechenzeit draufgeht, wenn man andauert checkt, ob eine bestimmte Bedingung eingetroffen ist. Wie genau kann ich mir ein Event-basierendes System vorstellen? Könntest du das etwas genauer beschreiben?

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

6

10.01.2013, 15:51

wenn ich ihn richtig verstanden habe, dann könnte das wie folgt gelöst werden:
du hast deinen Manager für die Quests, bei dem die Quests sich für ihr aktuell notwendiges Event registrieren
ein solches Event könnte das Töten eines bestimmten Monster oder das Einsammeln eines bestimmten Gegenstands sein
alle Aktionen, die für eine Quest interessant sein können, wie beispielsweise das Einsammeln eines Gegenstands, das Töten eines Gegners, das Führen eines Dialogs oder das Betreten eines bestimmten Gebiets, lösen ein Event aus
damit ist gemeint, dass dem Questmanager bescheid gegeben wird, dass beispielsweise gerade ein Monster getötet wurde
dieser schaut dann allen Quests Bescheid, dass gerade dieses Event eingetreten ist, die vorher sich für dieses registriert haben

die Quest könnte nun schauen, ob alle anderen, so nicht direkt oder etwas umständlicher erfassbaren Bedingungen erfüllt sind, wie beispielsweise, dass genug Monster dieser Art getötet wurden oder dass man beim Betreten eines Gebiets einen ganz bestimmten Gegenstand ausgerüstet hat


da ich schonmal am Antworten bin, möchte ich auch ein wenig etwas über Aspekte des Game Designs in Bezug auf Quests und Questsysteme schreiben:
in vielen Spielen ist es so, dass das Questsystem sehr generisch umgesetzt wird und nicht ideal an das Game Design angepasst wird
so hat man dann beispielsweise jedes Mal, wenn eine Quest gestartet wird, den Hinweis "willst du diese Quest annehmen", wo man auch gleich die Belohnung und die Aufgabe an sich sieht
genauso hat man bei "Zwischenzielen" (man hat gerade die 10 Monster besiegt und soll danach wieder zurück zum Questgeber) immer die Hinweise "du bist in der Quest weiter gekommen, du muss jetzt das Ziel Xyz erfüllen"
abgesehen davon, dass es nicht unbedingt einfach ist, zu definieren, was genau eine einzelne Quest ist und dass es da (beispielsweise seitens des Spielers) zu sehr abweichenden Auffassungen kommen könnte, könnte der Beginn einer Quest so einfach völlig unnötigerweise nochmal durch eine bereits erwähnte Meldung verdeutlicht werden, obwohl es evtl. aus einem Dialog heraus klar geworden ist
um es an einem Beispiel aus dem realen Leben zu verdeutlichen: grundsätzlich jedem dürfte es egal sein, dass beim Kaufen einer Tüte Chips oder einer Flasche Cola im Supermarkt des Vertrauens automatisch ein Kaufvertrag abgeschlossen wird und ich denke die meisten würden es eher als störend ansehen, wenn sie von der Kassierein oder dem Kassierer nach dem Bezahlen nochmals darauf hingewiesen werden

durch das Questsystem ist es relativ einfach möglich, dem Spieler mitzuteilen, was er gerade zu erledigen hat
viele Spiele machen das, indem sie transparent alle Quests mit ihrem Status in einem separaten Menü/Untermenü anzeigen, was allerdings wiedereinmal eine sehr generische Lösung ist
ein Gegenbeispiel dazu ist Zelda (auf jeden Fall mehrere Teile der Reihe, allerdings nicht unbedingt alle), wo man sich bei einem Wahrsager einen Hinweis bekommen konnte, was man als nächstes machen muss oder wo man seinen Begleiter befragen konnte (bspw. Navy, Saly oder Midna)

je nach Umsetzung kann ein Questsystem auch verhindern, dass man ein paar Rätsel einbauen kann, wie das ständige Tauschen von Gegenständen der verschiedenen Zelda-Teile, bis man zum Schluss einen sehr guten Gegenstand bekommt
ein Beispiel dafür wäre Ocarina of Time, wo man beispielsweise alle Masken an die richtigen Personen bringen musste, um zum Schluss 3 weitere Masken zur Verfügung zu haben oder der Tauschhandel der nötig war, um an das Biggoron-Schwert zu kommen (größer als das Master-Schwert und unzerstörbar im Gegensatz zu einem anderen Schwert eines anderen Schmieds der Goronen)

abschließen möchte ich sagen: ein Questsystem ist an und für sich kein Problem, allerdings verleitet es dazu, sich weniger Gedanken über eine gute Integrierung in das Spiel zu machen
letztendlich sollte es auch nur ein "Implementierungsdetail" sein
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

7

10.01.2013, 21:39

Wow!! Vielen Dank für den ausführlichen Post!
Ich werde genau darüber nachdenken, wie ich mein Questsystem so in das Spiel einbauen kann, dass es die Erzählung der Geschichte fördert, anstatt diese zu behindern.

Nun zum Programmieren des Questsystems. Ich wiederhole nochmal um zu gucken, ob ich den Ansatz mit Events richtig verstanden hab. Ich habe einen Questmanager mit einem Vector für Events. Jedes mal wenn ein Aktion (Spieler betritt Bereich, Monster stirbt...) im Spiel geschieht, wird ein entsprechende Event in den vector gepushed. Die Quests können sich beim QuestManager für Events registrieren. Dieser geht dann in seiner update() Funktion den vector durch und überprüft, ob für das Event ein Quest registriert ist. Falls ja wird eine Scriptfunktion des Quests aufgerufen. Falls nein wird das Event einfach ignoriert.
Die Quests können entweder vom Spiel selbst gestartet werden (z.b.: zu Beginn) oder von anderen Quests.
Ist das so gemeint? Oder hab ich noch was falsch verstanden?

Das Wort Problem hab ich überigens nur in Ermangelung eines besseren Wortes genommen. Aufgabe passt besser, da es ja nicht wirklich ein Problem ist :)

Vielen dank nochmal für all die Hilfe bis hierher und die ausführlichen Erklärungen!
Foaly

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

8

10.01.2013, 21:56

Ich würde den Vektor komplett weglassen und direkt die registrierten Quests bei einem Event aufrufen. Beim Quest-Manager würde ich meine Scripte auch nicht registrieren, sondern direkt bei den NPCs, dem Player, der World oder whatever. Je nachdem von wem ich was brauche.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

9

10.01.2013, 22:12

mit "registrieren" ist übrigens gemeint, dass der jeweiligen Stelle für ein bestimmtes Ereignis eine Callback-Methode oder -Funktion übergeben wird, die dann automatisch beim Eintreten des Events aufgerufen wird

@BlueCobold:
das kommt auch ein wenig darauf an, wie sein Spiel bisher aufgebaut ist, aber grundsätzlich wäre es natürlich besser, einen direkten Weg zu gehen ;)
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

10

10.01.2013, 22:18

Joar. Deswegen sagte ich ja auch, dass ich es so machen würde, nicht dass das generell mehr Sinn macht.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Werbeanzeige