Willkommen zu meinem Tutorial, das in seinen Grundzügen für alle Maker geeignet ist und anhand eines Beispiels mit dem MV abläuft.
Voraussetzung: Kenntnis im Mapping, Grundlagen Eventtechnik, notwendige Englischkenntnisse für Bedienung des Makers/Übersetzungsfähigkeit
Ziel im Maker/Spiel | Ziel des Tutorials |
Eine simple Sammel-Quest:
Finde 5 Äpfel und bringe sie zum Bauern |
Erklärung, Verwendungsbeispiel und Einführung in den Umgang mit:
Variablen Condition/Conditional Branch/Bedingungen Switches /Schalter anhand eines komplexeren Eventaufbaus |
Immer wieder kommen neue hoffnungsvolle Spielemacher der Maker-Szene hinzu und sie alle fangen klein an. Zu den mehr oder minder schwierigen Anfängen gehört vor allem das Verstehen, der Umgang und das Einsetzten von Variabeln (variables) und Bedingungen (conditional branch) im Bereich Eventscripting. Dieses Tutorial soll etwas Licht in die Sache bringen und die wichtigsten Grundlagen, sowie ein paar weitere kleine Tipps und Tricks für den Umgang liefern.
Ich bediene mich dabei eines Beispiels aus einem rm2k-Tuts für Variabeln, dass ich vor Jahren mal gelesen habe und das so einfach war, dass es hängen geblieben ist.
Was ist eine Quest?
Dem passionierten Rollenspieler bekannt, dem Neuling ein Fremdwort.
Wikipedia schrieb:Das Wort Quest (weiblich; deutsch „Suche, Suchmission“, englisch quest, eingedeutschter Plural „Quests“, aus dem altfranzösischen queste, aus dem lateinischen quaestio „Forschung, Frage“ bzw. quaerere „fragen, suchen“) bezeichnet ursprünglich in der Artusepik die Heldenreise oder Âventiure eines Ritters oder Helden, in deren Verlauf er verschiedene Aufgaben löst, Abenteuer besteht, Feinde besiegt, Objekte findet, Schwierigkeiten überwindet und dadurch Ruhm und Erfahrung erntet oder sein angestrebtes Ziel erreicht (zum Beispiel den heiligen Gral). Sinn der Quest ist im Allgemeinen die Erfüllung ehrenvoller Pflichten, aber auch die innere Reifung und Reinigung eines Helden.
Kurz: Eine zu erfüllende Aufgabe für den Spieler
Quest fürs Tutorial
So soll die Quest aussehen:
Du sollst dem Bauern helfen, in dem du für ihn Äpfel auf seinem Grundstück sammelst. Hast du die passende Anzahl aufgelesen, bedankt sich der Bauer für die Hilfe und überreicht dir eine Entlohnung.
Eigentlich sehr simpel. Wir wollen das ganze noch etwas ausreizen, um mehr Funktionsbeispiele nutzen zu können. Dies sind dann Extras, die nicht zwingend erforderlich sind, um die Quest zu bauen, das ganze aber durchaus sinnvoll ausbauen.
Extras:
- Quest-Ansage (Verschiedene Text-Optionen)
- Die Äpfel sollen als verbrauchbares Item verfügbar sein (Items im Inventar in Variablen verwenden)
- Verschiedene Handlungsmöglichkeiten per Wahlverfahren (Show Choice)
- Äpfel sollen wahlweise abgegeben werden können, was verschiedene Stände der Erledigung der Quest zur Folge hat (Input Number)
- Äpfel sollen in einen Korb gelegt werden, statt dem Bauern selbst zu übergeben (Verschiedene Events miteinander verbinden)
Vorbereitung - Map und Events
Öffnet ein Projekt in eurem Maker und sucht euch eine leere Map. Für dieses Beispiel-Event reicht eine einfache Map in Minimalgröße, die ihr so gestalten könnt, wie ihr möchtet.
Wichtig hierbei ist nur, dass ihr beachtet, dass der Held hier Platz genug hat, um Äpfel aufzusammeln (Apfelbäume auf der Map wären natürlich auch sinngemäß) und dass der Bauer passend platziert wird.
Auf dieser Map ist alles drauf, was für die Quest benötigt wird. Soweit müsst ihr noch nicht gleich vorarbeiten. Das kommt nach und nach zusammen.
Nun müssen die wichtigsten Events ihre Grundlagen erhalten. In diesem Fall sind das der Bauer ( Extra: +der Korb) und die einzusammelnden Äpfel.
1) Der Bauer
Der Bauer ist in diesem Fall ein NPC (NonPlayerCharacter) und unser Questgeber. Ihn anzusprechen, soll die Quest in Gang bringen.
Ihr könnt einen beliebigen Charakter dafür wählen. Ich habe einen alten Mann genommen, um einen Grund für die Aufgabenstellung zu gewährleisten. Dem armen Alten werden die Knochen weh tun und deshalb braucht er Hilfe. Es ist immer schöner, wenn eure Quests im Spiel nicht einfach nur da sind, weil man dem Spieler ja was zu tun geben muss, sondern sich in die Spielwelt einfügen und Sinn ergeben.
2) Der Korb
Er kann optional hinzugefügt werden, um das Event etwas komplexer zu gestalten (und weil es Sinn macht, dass man die Äpfel dem armen Mann nicht einfach in die Arme drückt).
Ich habe zusätzlich ein paar verschiedene Versionen gemacht, in denen der Korb mal voll und mal leer ist und werde dies als kleines Extra mit einbauen. Ihr könnt den Korb als Charakter-Grafik anwählen, wenn ihr mein Tileset-AddOn verwendet, oder ein anderen Tile- oder Charset habt, auf dem ein passender Korb ist.
3) Die Äpfel
Der Held soll herunter gefallene Äpfel aufheben, die auf der ganzen Map verteilt sind. Um diese sichtbar zu gestalten, ist in meinem AddOn ebenfalls eine passende Grafik zu finden.
Beim Aufheben dieser Äpfel, soll eine Variable hoch gezählt werden, um so die Quest-Bedingungen ab einer Anzahl von 5 zu erfüllen.
Als Extra kann man die Äpfel anstatt als Variable auch als Item anlegen und sogar verbrauchbar machen. Somit spielt dann nicht die Anzahl der Äpfel, die man vom Boden aufgelesen hat, eine Rolle, sondern wie viele Äpfel sich noch im Inventar befinden.
Die Äpfel sollen von der Map verschwinden, wenn man sie aufgehoben hat und es ist sinnvoll, dem Spieler über das Abspielen eines kurzen Sounds oder einer Textnachricht zu signalisieren, dass er einen wichtigen Gegenstand aufgehoben hat.
4) Ressourcen
Kleines Extra: Hier ein Tileset, das ihr auf D einfügen könnt, welches Apfelbäume, Äpfel, einen leeren, einen halbvollen und einen vollen Korb Äpfel beinhaltet.
Außerdem ein Charset für den Bauern.
Diese Grafiken lassen sich dann auch für die Events auswählen, als Char-Grafiken.
Was ist ein Schalter/Switch?
Wie der Name schon andeutet, kann man sie sich z.B. wie einen Lichtschalter vorstellen, der zwei Positionen hat: AN/AUS > ON/OFF
Und genauso, wie wenn ihr einfach nur einen Lichtschalter im Baumarkt kauft, in den Händen haltet und er ist nirgendwo eingebaut, macht die Veränderung der Position erst mal für sich gesehen: gar nichts. Erst wenn ihr den Schalter in einen Event-Ablauf einbaut und jeder Position zuweist was dann passieren soll, kann auch ein Licht an gehen.
Sowohl Schalter, als auch Variablen haben eine ID (Identifikationsnummer), wenn ihr sie auswählt. Das ist die kleine Nummer ganz vorne, vor dem von euch einstellbaren Namen (beginnt bei 001).
Ebenso wie der Lichtschalter in der Küche nicht das Licht im Schlafzimmer bedient, kann ein Schalter nur da wirken, wo er auch direkt angewählt ist.
Ausnahme sind die Eigenschalter/Self Switch, die mit den Buchstaben A bis D gekennzeichnet sind. Sie haben keine ID und sie funktionieren im Gegensatz zu normalen Schaltern und Variablen nicht übergreifend. Damit ist gemeint, dass sie nur innerhalb des gleichen Events im Code funktionieren und nicht durch andere Events auf der selben oder anderen Maps beeinflusst werden können.
Schalte ich also in einem Event wie z.B. dem Bauern den Eigenschalter A auf ON, kann ich nicht in einem anderen Event, wie dem Korb abfragen, ob dieser Schalter ON ist, weil dort nur nach dem eignen Schalter A geprüft wird. Voreingestellt sind alle Self switch OFF.
Was ist eine Variable?
(variables) Wortverwandschaft: variabel = veränderbar; variieren = verändern
Praktisch immer, wenn du dir ein Event überlegst, in dem Zahlen vorkommen, von denen du weißt, ihr Wert verändert sich im Laufe des Spiels und du diese Zahlen unter einem Begriff zusammenfassen könntest, hast du eine Variable vor der Nase.
Beispiel: Helden-HP, Rubine oder in unserem Beispiel-Game Anzahl der Äpfel.
Wie sieht das also im Spiel aus?
Bleiben wir mal bei der Anzahl der Äpfel, wie wir sie für unsere Beispielquest benötigen. Die Variable sähe so aus: [x] Äpfel
- Der Spieler startet das Spiel und hat 0 Äpfel bei sich.
- Er wird vom Bauern aufgefordert, ihm 5 Äpfel zu bringen. Die Quest kann also nur erfüllt werden, wenn sich die Anzahl der Äpfel im Besitz des Helden von 0 auf 5 erhöht.
- Jedes mal, wenn der Spieler einen Apfel aufhebt, erhöht sich die Anzahl der Äpfel um 1. Also hat der Spieler erst 1 Apfel, dann 2, 3, 4...
- Jedes mal, wenn der Spieler einen Apfel isst, verringert er sich wieder um 1.
Der Wert mit dem Namen "Äpfel" verändert sich also.
Ebenso kann man mit vielen anderen variierenden Werten rechnen und arbeiten. Ein weiteres Beispiel wäre die Helden-HP, die sich verringert, wenn man angegriffen wird, die sich erhöht, wenn man geheilt wird und von deren Höhe man z.B. Statuswerte wie "angeschlagen", "kampfunfähig" oder eben "fit" definieren könnte. Ihr seht, Variablen sind vor allem unerlässlich, wenn man ein eigenes Menü oder Kampfsystem im Maker über Events programmieren möchte.
Was ist eine Bedingung?
(conditional branch) Wortverwandschaft: bedingt = auf Grund von; Konditionen = Voraussetzungen
Eine Bedingung, ist eine Funktion, die man meist treffend mit wenn [...], dann [...] beschreibt. Wenn etwas erfüllt ist, dann soll dies und dies geschehen. Man kann sie in Verbindung mit Variabeln, Schaltern und vielem mehr verwenden und so komplexe Events aufbauen.
Beispiel: Wenn ein bestimmter Held in der Gruppe ist, dann darf man eine sonst versperrte Tür passieren.
Oder ganz einfach, wenn ein Schalter gedrückt wurde, dann öffnet sich ein Geheimgang.
In unserem Beispiel-Game bekommt der Held, wenn er 5 Äpfel eingesammelt hat, eine Belohnung.
Wie sieht das also im Spiel aus?
In unserem Beispiel arbeiten wir mit einer Variable ([x]Äpfel), also einem sich veränderndem Zahlenwert, der ab einer bestimmten Höhe (5) etwas ausrichten soll.
Damit wird also nur der Rahmen festgelegt, welche Bedingungen erfüllt sein müssen, damit das sonst weiter normal programmierte Event abgespielt wird.
Mit Conditions und Conditional Branches könnt ihr also Events machen, die nicht jederzeit und überall ablaufen, sondern die erst bestimmte Voraussetzungen, wie z.B. eine Variablenhöhe oder einen aktivierten Schalter, benötigen.
Um hier wieder die Verbindungen zu den Variabeln zu zeigen, so könnte man in einem eigenen HUD (Hp/Mp-Anzeige) den Zustand eines Helden z.B. als "fit" anzeigen lassen, wenn erfüllt ist, dass die Helden-HP seinem Maximun (Held-MaxHP) entspricht.
Der Event-Aufbau
Wir starten also mit dem Bauer-Event, der uns die Quest geben soll. Nach ein bisschen erklärendem Text und einem Sound und einer Nachricht, dass wir eine Quest angenommen haben, soll das nicht jedes mal wiederholt werden, wenn man den Bauern erneut anspricht.
Dazu setzten wir einen Self Switch A am Ende des Gesprächs und nach dem Schalter, der durch den Quest eingeschaltet wird. Und verpacken die ganzen voran gegangenen Codes in eine Conditional Branch, die abfragt, ob der Self Switch A auf ON ist. So kann der Bauer im Falle, dass dies gegeben ist, noch mal an den Quest erinnern, anstatt ihn neu aufzugeben.
Nun eröffnen wir eine zweite Event-Seite. Diese soll erst aktiv werden, wenn die Quest-Bedingungen erfüllt sind.
Abgesehen von der Conditinal Branch gibt es noch die Conditions des Events, die oben links eingerahmt im Event über der Grafik zu finden sind.
Hier sollen nun zwei Bedingungen erfüllt sein:
- Der Spieler soll überhaupt die Quest haben, Äpfel zu sammeln > Schalter [ID] Äpfel is ON
(falls man die Variante mit den Items hat und der Spieler zuvor an einer anderen Stelle bereits Äpfel sammeln konnte, soll nicht übergangen werden, dass der Bauer überhaupt um Hilfe gebeten hat)
- Der Spieler soll mindestens 5 Äpfel eingesammelt haben > Variable [ID] Äpfel is 5 or aboveIm Event wird immer die oberste Seite, also die mit der höchsten Zahl, als aktive Befehlsliste akzeptiert, deren Bedingungen erfüllt sind.
Also wird Seite 2 erst abgespielt, wenn sowohl der passende Schalter an ist, als auch der passende Wert in der ausgesuchten Variable stimmt.
Auch hier wollen wir wieder, dass der Bauer einem nicht jedes Mal zur bestandenen Quest gratuliert und einem bei jedem Ansprechen eine Belohnung gibt, weshalb wir die Event-Befehle in eine Conditional Branch mit abgefragtem Self Switch packen. Wichtig dabei ist, dass es ein anderer Self-Switch als auf der ersten Seite sein muss. Naheliegend ist daher der Buchstabe B zu wählen.
Nun können wir auch unseren Quest abschließen.
Doch der Quest kann nicht erledigt werden, ohne dass man überhaupt Äpfel hat, die man einsammeln kann. Auch diese werden per Event gemacht.
Die Äpfel sollen erst erscheinen, wenn die Quest angenommen wurde, auch das ist als Condition oben links im Event einzutragen, in dem man den Schalter als Bedingung setzt. Dass der Apfel aufgehoben wird, wird durch Sound und Nachricht klar gemacht. Und nicht zu vergessen: Die Variable, welche die Äpfel zählt, um 1 erhöhen. Danach soll der Apfel von der Map verschwinden.Eine einfache Variante ist der Befehl Erase Event, doch damit verschwindet das Event nur solange man sich auf der gleichen Map befindet! Nach einem Mapwechsel, beginnt das Event wieder von vorne.
Das kann man nutzen, um z.B. Monster respawnen zu lassen.
Eine andere Variante, damit der Apfel dauerhaft weg ist, ist ein Self Switch, den wir auch auf eine zweite leere Seite im Event als Condition fest legen.
Als Zwischenschritt, bevor man die Quest jedoch abschließen kann, soll der Spieler die eingesammelten Äpfel im Korb neben dem Bauern platzieren.
Dabei soll überprüft werden, ob die Quest aktiviert wurde, ob der Spieler überhaupt Äpfel dabei hat, wenn ja, wie viele und dem Spieler wird die Möglichkeit gegeben, selbst zu bestimmen, wie viele er davon in den Korb legt. Des weiteren bekommt der Spieler noch eine Anzeige, wie viele Äpfel bereits im Korb sind. Ist die gewünschte Anzahl erreicht, gilt der Korb als voll. Das alles wird über Conditions/Bedingungen geregelt.
Als kleine Spielerei soll der Korb voller werden, je mehr Äpfel der Spieler abgegeben hat. Dazu kopieren wir diese erste Eventseite und fügen sie als zweite Eventseite ein, verändern aber die Grafik (halbvoller Korb) und setzten als Condition/Bedingung der Seite, dass min. 3 Äpfel im Korb sein sollen.
Ab einer Condition/Bedingung mit der Anzahl von 5 Äpfeln oder höher soll die Quest erledigt sein und der Korb voll. Dafür benötigen wir dann noch eine dritte Eventseite, mit der passenden Grafik für den Korb und der passenden Condition.
Gratulation! Damit ist die Quest endgültig fertig, bereit für den Test und das Tutorial abgeschlossen.
Ich hoffe, ich konnte alles verständlich und in leichten Schritten erklären. Sollten dennoch Fragen auftauchen, könnt ihr sie hier gerne posten. Sind euch Fehler aufgefallen, oder etwas stimmt nicht so, wie es in diesem Tutorial beschrieben wurde, bitte ich euch, mir dies per PM mitzuteilen, damit ich es nachträglich ausbessern kann. Vielen Dank.