Spiel-Cache
| Variablentyp: gamecache | |
|---|---|
| | |
| | |
| |
Der Spiel-Cache oder englisch Gamecache ist ein Zwischenspeicher, in dem im Gegensatz zur Hash-Tabelle nur Variable vom Typ Boolean, Integer, Real, String oder Unit gespeichert werden können. Da er aus dem RAM in Form einer Datei auch auf die Festplatte geschrieben werden kann, bietet er die einzige Möglichkeit, Daten über das Ende einer Karte hinaus zu erhalten. So können beispielsweise Helden in einer Kampagne in die nachfolgende Karte transportiert werden.
Inhaltsverzeichnis |
Aufbau
Man kann sich den Aufbau des Spiel-Caches als Tabelle vorstellen. Die Spalte entspricht dem Begriff missionKey, die Zeile entspricht dem Begriff key . key und missionKey sind jeweils Zeichenketten. Wichtig ist, dass man für einen missionKey und einen key, einen exaktes Wertepaar für einen gespeicherten bzw. geladenen Wert definiert.
Verwendung
Initialisierung

Spiel-Cache - Create a game cache from my_gamecache.w3v
Set my_gamecache = (Last created game cache)
set udg_my_gamecache = InitGameCache( "my_gamecache.w3v" )
Speichern

Spiel-Cache - Store 1337 as label of Category in my_gamecache
Spiel-Cache - Store 1337 as key of missionkey in my_gamecache
call StoreInteger( udg_my_gamecache, "Category", "label", 1337 )
call StoreInteger( udg_my_gamecache, "missionkey", "key", 1337 )
Laden

Set my_integer = (Load label of Category from my_gamecache)
Set my_integer = (Load key of missionkey from my_gamecache)
set udg_my_integer = GetStoredInteger( udg_my_gamecache, "Category", "label" )
set udg_my_integer = GetStoredInteger( udg_my_gamecache, "missionkey", "key" )
Mehrspieler
Obwohl das Übertragen von Daten in eine andere Karte sehr gut funktioniert, wenn man alleine spielt, bleibt diese Möglichkeit den Erstellern von Mehrspielerwelten leider verwehrt. Der Grund dafür ist, dass es nicht gewährleistet ist, dass sich in ein Spiel Spieler mit den exakt gleichen Spiel-Cache-Daten einklinken. Allerdings bedeutet das nicht, dass man den Spiel-Cache nicht in Mehrspielerkarten verwenden kann. Im Gegenteil: Vor dem Patch 1.24 hatte sich dieser Weg, Daten einer Karte zu speichern, im der Erstellung eigener Zauber etabliert und galt gemeinhin als Standard für eigene Zauber, die mit Timern, lokalen Auslösern oder ForGroup-Anweisungen arbeiteten. Hier hatte sich vor allem die Arbeit mit dem Return-Bug durchgesetzt. Inzwischen (seit dem Patch 1.24) wurde der Spiel-Cache in diesem Bereich durch die neu eingeführte Hash-Tabelle ersetzt.
Verwendung mit dem Return-Bug (veraltet)
Wie bereits vorher schon umrissen, werden neben dem eigentlichen Wert auch eine Kategorie und eine Bezeichnung ("label") mitgespeichert, um den Wert anschließend wiederzufinden. Ersteres kann nun zweckentfremdet werden, indem man dort die ID eines Handles mittels Return-Bug speichert. Das hat den Vorteil, dass bei lokalen Triggern, Timern oder sonstigen Handle-Objekten der gespeicherte Wert eindeutig zuzuordnen ist. Damit kann man den Spiel-Cache als eine Mischung aus globaler und lokaler Variable ansehen. Global, weil man den Wert von jeder anderen Funktion abrufen kann, sofern man die benötigte Objekt-ID (z.B. "GetExpiredTimer()" bei Timer-Funktionen oder "GetTriggeringTrigger()" bei lokalen Triggern) hat. Lokal, weil man ohne diesen "Schlüssel" in Form der Handle-ID an den Wert nicht herankommt und gegebenenfalls einen anderen Wert erhält, der aber, das ist der Trick an der Sache, sinnvoller für die ganze Sache ist.
Benötigte Funktionen:
function LocalVars takes nothing returns gamecache return udg_GameCacheVariable endfunction function SetHandleHandle takes handle subject, string name, handle value returns nothing if value==null then call FlushStoredInteger(LocalVars(),I2S(H2I(subject)),name) else call StoreInteger(LocalVars(), I2S(H2I(subject)), name, H2I(value)) endif endfunction function GetHandleHandle takes handle subject, string name returns handle return GetStoredInteger(LocalVars(), I2S(H2I(subject)), name) return null endfunction
Um diese Funktionen für andere Typen tauglich zu machen, kann einfach die letzte Funktion angepasst werden, indem einfach der Return-Typ verändert wird.
Funktionen
- InitGameCache
- FlushGameCache
- FlushStoredBoolean
- FlushStoredInteger
- FlushStoredReal
- FlushStoredString
- FlushStoredUnit
- FlushStoredMission
- GetStoredBoolean
- GetStoredInteger
- GetStoredReal
- GetStoredString
- HaveStoredBoolean
- HaveStoredInteger
- HaveStoredReal
- HaveStoredString
- HaveStoredUnit
- HaveStoredValue
- RestoreUnit
- RestoreUnitLocFacingAngleBJ
- RestoreUnitLocFacingPointBJ
- SaveGameCache
- StoreBoolean
- StoreInteger
- StoreReal
- StoreString
- StoreUnit
- SyncStoredBoolean
- SyncStoredInteger
- SyncStoredReal
- SyncStoredString
- SyncStoredUnit
