Was sind Speichercodes?
Die Idee mit den Speichercodes stammt von keogarl und ist als erstes in seinem Wherigo paranoia@night realisiert worden. Dort war das Ganze als Defibrillator betittelt und half den Spielern nach Komplettabstürzen wieder an der richtigen Stelle im Spiel weiterzuspielen.
Speichercodes bestehen aus einer mehrstelligen Zahl, enthalten den aktuellen Spielstand und sind auf allen Geräten gleich. Man kann sie nutzen um z.b. ein abgestürztes Gerät wieder auf den selben Stand wie ein anderes zu bekommen. Oder wenn bei einem Gerät der Akku leer geht und man auf einem anderem Gerät weiterspielen will. Im Inventar befindet sich das Speichercode Menü, wo man die Codes abfragen oder eingeben kann. Spielt man mit nur einem Gerät, wählt man das am Anfang aus und man bekommt immer mitgeteilt, wenn sich der Code ändert, sodass man ihn auf Papier mitschreiben kann. Aber auch für Owner oder Wartungsteams sind Speichercodes eine praktische Sache. Man muss nicht den Wherigo immer von Anfang spielen, sondern kann an beliebiger Stelle im Spiel einsteigen, zwischen verschiedenen Abschnitten hin und herspringen oder einzelne Bereiche im Spiel mehrmals spielen.
Im folgenden eine kleine Anleitung zu Einbindung des Speichercode-Systems in Wherigo Cartridges mit Urwigo.
Wie funktioniert das Speichercode-System?
Wenn man so ein System in seinen Wherigo einbauen will, sollte man am besten von Anfang an auf bestimmte Sachen achten. Prinzipiell teilt man seinen Wherigo in mehrere Speichercodeabschnitte/Level ein, wie bei einem Computerspiel. Jedes Level enthält dabei eine andere Zahl, den sogenannten Speichercode. Bei meinen Wherigos sind diese Speichercodes sechsstellig und absolut zufällig generiert. Zwischen den einzelnen Leveln findet allerdings keine Unterbrechung statt. Der Spielfluss geht einfach wie gehabt weiter.
Wichtig für den Programmierer zu wissen ist, welche Zonen, Items und Tasks am Anfang jedes Levels aktiv sind. Jedes mal wenn sich ein Level/Speichercode ändert – egal ob regulär im Spiel oder per manueller Speichercodeeingabe – wird erstmal alles inaktiv gemacht. Dabei wird eine Funktion aufgerufen, welche ein LUA-Skript enthält. Dieses Skript macht nichts anderes, wie alle Zonen, Items und Aufgaben in einer Schleife durchzulaufen und sie auf „inactive“ zu stellen. Das Ergebnis ist ein komplett leerer Wherigoplayer. Das hat denn Sinn, dass alles was vor dem Absturz oder vorherigen Level war jetzt weg ist. Das kann auch Fehler in der Programmierung oder im Player ausbügeln, wenn eine Zone, Item oder Task mal außversehen nicht deaktiviert wurde.
Jetzt wird die wichtigste Funktion aufgerufen. In dieser Funktion wird festgelegt bei welchem Speichercode, welche Zone, welches Item und welcher Task aktiviert wird. Diese Funktion wird sowohl bei einer manuellen Speichercode-Eingabe vom Spieler als auch beim regulären Spielverlauf aufgerufen. Dies hat den Vorteil, dass man nur einmal im Wherigo festlegen muss, welche Dinge am Anfang eines neuen Speichercode Abschnitts aktiv sind.
Ab hier kann man ganz regulär innerhalb der Zonen, Gegenstände usw… weiter programmieren, wie man es sonst auch immer macht. Es können innerhalb der Level natürlich auch neue Zonen, Gegenstände oder Aufgaben aktiviert werden. Wenn es allerdings einen Absturz gibt, landet man natürlich immer am Anfang des Levels/Speichercodeabschnitt. Ich habe immer darauf geachtet, dass immer bei langen physischen Wegen zwischen den Stages ein neues Level beginnt, damit man bei einem Absturz nicht zurücklaufen muss und kein Frust bei den Spielern entsteht. Vorausgesetzt natürlich der aktuelle Speichercode ist bekannt oder wird bei einem anderen Spieler ausgelesen.
Im Prinzip beschränkt sich die Einbindung des Speichercodes-System auf das Erstellen zwei zentraler Funktionen, drei Variablen, einen Input und das Speichercode-Menü Item im Inventar.
Wie binde ich das Speichercode-System ein?
1. Variablen und Funktionen
Als erstes legen wir drei Variablen an:
Speichercode
type: value
value: 0
Diese Variable enthält den aktuellen Speichercode. Sie wird im regulären Spielverlauf an der entscheidenen Stelle bzw beim Beginn eines neuen Levels auf die neue Nummer gesetzt.
SpeichercodeAbfrage
type: value
value: 0
Diese Variable dient als Zwischenspeicher, wenn eine manuelle Speichercodeeingabe im Menü erfolgt. Der aktuelle Speichercode wird in dieser Variable zwischengespeichert und der vom Spieler eingegebene Code durchläuft die changeLevel Funktion. Falls die Nummer vom Spieler falsch ist, wird in der changeLevel Funktion die Speichercode Variable wieder auf die SpeichercodeAbfrage Variable gesetzt. Somit geht bei einer falschen Eingabe der aktuelle gültige Speichercode nicht verloren.
Einzelspieler
type: flag
value: false
Wie schon erwähnt, kann man am Anfang des Spiels auswählen, ob man alleine oder im Team spielt. Diese Einstellung wird in dieser Variable gespeichert. Falls man alleine unterwegs ist, wird dem Spieler immer per Message mitgeteilt, wenn sich der Speichercode ändert. Die Variable wird dann auf true gesetzt.
Jetzt zu den Funktionen:
resetAll
Diese Funktion deaktiviert in erster Linie alle Zone, Items und Tasks über das LUA-Skript. Außerdem beinhaltet sie die Ansage des neuen Speichercodes im Einzelspielermodus. Das bietet sich an, da resetAll immer aufgerufen wird, wenn es eine Leveländerung gibt und der neue Speichercode gültig ist. Sie sieht in etwa so aus:
changeLevel
Wie schon erwähnt ist dies die wichtigste Funktion des Speichercode-Systems. Bei der Programmierung der Cartridge muss diese Funktion natürlich immer erweitert und bearbeitet werden, da sie ja die Speichercodeabschnitte festlegt. Dabei kann man die einzelnen If-Blöcke einfach kopieren und einfügen. Hier ist auch im Else-Block der Fall behandelt, wenn es zu einer falschen Speichercodeeingabe kommt.
2. LUA-Funktion
Es macht überhaupt nichts, wenn man noch nie mit LUA-Skripten im Wherigo gearbeitet hat. Alle LUA-Funktionen werden einmal zentral eingegeben und dann per dem „Lua User code“ aufgerufen. Die LUA-Funktionen findet man im Menü View/Lua user functions:
Es erscheint ein leeres Textfeld über die komplette Seite. Hier muss man folgendes LUA-Skript eingeben:
function DeactivateAll()
for k,v in ipairs(cartridge.AllZObjects) do
if tostring(v) == „a Zone instance“ or tostring(v) == „a ZTask instance“ then
v.Active = false
end;
if tostring(v) == „a ZItem instance“ and v.Name ~= speichercodemenu.Name then
v.Visible = false
end;
end
end
Wie schon erwähnt ist dies der Code, der alle Zonen, Tasks und Items deaktiviert. Er wird in der resetAll Funktion ausgeführt. Eine kurze Erklärung zum Skript: Es werden alle Objekte der Cartridge ausgelesen und nacheinander abgefragt. Handelt es sich um eine Zone oder Task, werden diese deaktiviert (siehe Zeile 3,4 und 5). In Zeile 6,7 und 8 werden alles Items bis auf das Speichercode-Menü versteckt. Das ist natürlich ziemlich wichtig, sonst würde nach dem ersten Level-Wechsel das Speichercode-Menü auch deaktiviert/versteckt werden.
Ganz wichtig ist noch, dass wir die LUA-Identifier für die komplette Cartridge eingeben. Urwigo legt diese Namen normalerweise automatisch fest. Da wir aber im Skript die Wherigo-Cartridge mit cartridge.AllZObjects ansprechen, muss der Identifier der Cartridge mit „cartrige“ festgelegt werden:
Im Anschluss müssen wir dann auch den Identifier für das Speichercode-Menü-Item mit „speichercodemenu“ festlegen.
3. Speichercodemenü
Für das Speichercodemenü brauchen wir natürlich ein so betiteltes Item mit einer kleinen Beschreibung und zwei Commands. Bitte nicht vergessen den Identifier auf „speichercodemenu“ zu setzen.
Die zwei Commands im Speichercodemenü sind denkbar einfach. Für den Command „Speichercode eingeben“ muss natürlich ein Input angelegt werden. Hier die Programmierung für „Speichercode abfragen“:
Unter „Speichercode eingeben“ befindet sich nur der Aufruf des Inputs:
Hier die Einstellungen und die Programmierung für den Input:
Hier findet das Zwischenspeichern des Speichercodes in SpeichercodeAbfrage statt. Anschließend wird die Variable Speichercode auf die Eingabe vom Spieler gesetzt und changeLevel aufgerufen. Das wars auch schon. Der Fehlerfall wird ja in der changeLevel Funktion behandelt.
4. Leveländerung im Spielverlauf
Das Aktivieren eines neuen Levels ist auch denkbar einfach. Speichercode Variable auf den nächsten Code setzen und anschließend changeLevel ausführen.
5. Einzelspieler / Mehrspieler
Hier ein Beispiel für die Auswahl des Spielermodus am beim Starten der Cartridge:
Hier die Democartridge mit allen oben gezeigten Funktionen zum herunterladen: