Vom Skript zum Spiel: Eine kleine Geschichte über Abhängigkeiten

Heute ist astronomisch gesehen der zweite Sommertag im Jahr. Damit kam und verschwand der Frühling, ohne dass selbst eine Alphaversion meines RPG-Editors erschienen wäre, und statt Ausreden zu erfinden, verzichte ich zukünftig auf Zeitangaben. Alles, was ich zu sagen habe, ist: Ich bin feature-mäßig in der Schlussphase, meine gedankliche Todo-Liste ist weitgehend abgearbeitet, nur leider sind die letzten Meter immer die aufwendigsten, weil man viele lose, provisorische Enden zusammenführen muss, die vorher ruhig lose und provisorisch sein durften.

Stattdessen möchte ich heute über eine Herausforderung schreiben, der ich mich in der Vergangenheit wegen der Natur eines Editors (Dinge erstellen und löschen) stellen musste: Abhängigkeiten, Programmierern in einem anderen Zusammenhang auch als Abhängigkeitshölle bekannt.

Abhängigkeiten im RPG-Editor

Alles klar?

Stellt euch für eine Sekunde vor, ihr wolltet ein Spiel erstellen. Ein episches Rollenspiel wie Final Fantasy meinetwegen. Während seines Abenteuers soll der Held tonnenweise Gegenstände finden und mit sich herumschleppen können, darunter Waffen, Rüstung, Medizin, Bücher, Spruchrollen und Schmuck. Natürlich darf für den Anfang das berühmte “rostige Schwert” nicht fehlen. Also werdet ihr im Editor einen entsprechenden Gegenstand anlegen. Weil rostige Schwerter überall in der Spielwelt zu erwarten sind, legt ihr an den verschiedensten Stellen weitere Exemplare des rostigen Schwerts ab und gebt auch vielen Banditen, Strauchdieben und Skelettkriegern eines in die Hand. Genau genommen platziert ihr nicht den Bauplan für das Objekt “Schwert”, sondern hinterlasst lediglich eine einzigartige ID, mit deren Hilfe die Merkmale des Schwerts (Aussehen, Stärke, Gewicht, usw.) schnell in einem Verzeichnis nachgeschlagen werden können. Wie eine Telefonnummer oder eine Internetadresse.

Das rostige Schwert ist eigentlich ziemlich langweilig, also löscht ihr es und … hey, Moment! Die ganzen Low-Level-Gegner und hunderte Kisten besitzen dieses Schwert. Wenn ihr es einfach löscht, befinden sich in deren Inventar IDs für ein Objekt, das gar nicht mehr existiert! Im laufenden Spiel würde das entweder zu einem Absturz oder zu unerwarteten Fehlern führen. Offensichtlich müssen also auch diese IDs in den Inventaren gelöscht oder durch andere IDs ersetzt werden.

Damit dem Held nicht langweilig wird, soll er unterwegs auf neue Waffen stoßen, mit denen er sich durch die Spielwelt kloppt, zum Beispiel ein “Flammenschwert”, das richtig groß ist und im Kampf einen Flammenzauber auslöst! Cool. Denselben Flammenzauber kann man übrigens auch mithilfe einer magischen Spruchrolle oder durch einen Levelanstieg erlernen, oder ein bestimmter Magier schenkt einem den Zauberspruch, wenn man ihm in einer Angelegenheit hilft und man den Zauber nicht sogar schon beherrscht. Andererseits werden diese Flammenzauber langsam alt, also löscht ihr ihn und … Oh. Geht gar nicht. Richtig, der Flammenzauber wird jetzt von einem Gegenstand (Flammenschwert), einem weiteren Gegenstand (Spruchrolle), vom Held selbst (Levelanstieg) und einem Ereignis (Magier-NPC) mittels der ID referenziert, weshalb diese IDs erst gelöscht oder ersetzt werden müssen. Im Falle des Ereignisses kann sie aber gar nicht gelöscht werden, ohne das ganze Ereignisskript funktionsunfähig zu machen. Beispiel in Pseudocode:

Wenn HELD[001] nicht den ZAUBER[007] beherrscht:
.... Lehre HELD[001] den ZAUBER[007]

Wenn im Verzeichnis für Zauber die ID 007 aber gar nicht existiert, stürzt dieses Skript ab. Natürlich könnte man sich absichern, indem man die Existenz erst einmal prüft …

Wenn ZAUBER 007 enthält und wenn HELD[001] nicht den ZAUBER[007] beherrscht:
.... Lehre HELD[001] den ZAUBER[007]

… oder indem man Trial-and-Error anwendet …

Versuche einmal:
.... Wenn HELD[001] nicht den ZAUBER[007] beherrscht:
........ Lehre HELD[001] den ZAUBER[007]
Wenn es schief ging:
.... Schade, dann beende halt das Skript

… aber wie man sieht, macht es das ganze Ereignisskript vollkommen sinnlos. An dieser Stelle enthält das Spiel einfach einen ärgerlichen Fehler, egal wie man es dreht und wendet. Man kommt nicht darum herum, IDs in Ereignisskripts entweder zu ersetzen oder das ganze Skript zu löschen. Der alte RPG Maker 2000/2003 arbeitete mit einer festen Zahl von Bauplänen, die man entweder erhöhen oder senken konnte, eine Löschung bewahrte allerdings den Platz des Bauplans und machte ihn zu einem leeren Dummy-Bauplan, der trotzdem noch vom Spiel benutzt werden konnte, obwohl es überhaupt gar keinen Sinn ergab – der Ersteller des Spiels wurde nicht einmal darauf hingewiesen, dass man da gerade ein vielgenutztes Objekt gelöscht hat, und man hatte keine Möglichkeit, herauszufinden, welche Skripte und andere Objekte sich eigentlich darauf beziehen. Ich halte das zwar für eine geräuschlose, aber schlechte Lösung. (Beachtet, dass ich keine Ahnung habe, wie neue Versionen des RPG Makers dieses Problem behandeln.)

Mein Programm registriert deswegen alle Abhängigkeiten in einem eigenen Verzeichnis und verbietet dem Benutzer einfach, Objekte ersatzlos zu löschen, wenn ein Skript sie benutzt. Das ist nicht so geräuschlos wie beim alten RPG Maker, aber meiner Meinung nach sinnvoller, und es ermöglicht eine detaillierte Übersicht über alle Vorkommnisse eines einzelnes Objektes. Die grafische Oberfläche dafür existiert allerdings noch nicht, was mich wieder zum Anfang zurückführt: It’s done when it’s done! ;)

This entry was posted in Programmieren and tagged , , , . Bookmark the permalink.

2 Responses to Vom Skript zum Spiel: Eine kleine Geschichte über Abhängigkeiten

  1. Varis says:

    Wow, ich habe es gelesen, und sogar verstanden o.o *stolz auf mich bin* XD
    Ja, das hört sich relativ nervig an… bis zum schluss dachte ich ja noch “Wozu denn sowas löschen?” aber wenn man im Nachhinein noch etwas verändern will ist das schon bitter, wenn man sich händisch alles raussuchen muss…. (wenn ich das nun recht kapiert habe… egal! XD)

    Ich wünsch dir noch viel Erfolg beim programmieren ^_^v

  2. Twaldigas says:

    Eine klasse Erklärung, welche einen tollen Blick in die Entwicklung eines so komplexen Spiels wie eines RPGs wirft. So etwas ist wirklich extrem kompliziert und viele Sachen sind miteinander verknüpft. Das gilt ja auch für ganz normale Programme, welche in Java, PHP und ähnliches geschrieben werden.
    Auf jeden Fall noch viel Erfolg beim coden und ich bin schon sehr gespannt.

    Gruß Twaldigas

Hinterlasse eine Antwort

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *

Du kannst folgende HTML-Tags benutzen: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">