Fertigkeitenvorlagencode
allgemeines Format
Die Fertigkeitenvorlage ist ein Bitstream in einer Zeile, der nach der RFC3548 base64 verschlüsselt ist. Es werden + und / als 62. und 63. Zeichen verwendet.
Der Bitstream besteht aus folgender Abfolge von verschieden langen Sequenzen:
Header
Zuerst werden die Header (Typ und Version) beschrieben:
Wenn das Template vor dem Update am 5. April 2007 erstellt wurde:
- 4 Bits - immer 0, Versionsnummer
Wenn die Vorlage nach dem Update erstellt wurde:
- 4 Bits - immer 14, steht für den Vorlagentyp (14 = Fertigkeitenvorlage)
- 4 Bits - immer 0, Versionsnummer
Klassen
Jetzt werden die beiden Klassen beschrieben:
- 2 Bits - Zusätzliche Bits zu 4 Standardbits, für die Verschlüsselung jeder Klassenid, wobei gilt
Code*2 + 4 = Gesamtzahl
(zurzeit ist der Code immer 0, also ist jede Klasse mit 4 Bits codiert) - 4 (
+ 2*n
) Bits - Primärklasse (siehe unten) - 4 (
+ 2*n
) Bits - Sekundärklasse (siehe unten)
Attribute
Nun folgen die Attribute:
- 4 Bits - Anzahl der Attribute, die kodiert werden
- 4 Bits - Anzahl (n) der Bits, die zusätzlich zu 4 Standardbits für die Verschlüsselung jeder Attributs-ID verwendet wurden
Danach für jedes Attribut:
- 4 (+ n) Bits - Die ID des Attributs (siehe unten)
- 4 Bits - Rang des Attributs
Fertigkeiten
Jetzt die acht Fertigkeiten:
- 4 Bits - Anzahl (n) der Bits, die zusätzlich zu 8 Standardbits für die Verschlüsselung der Fertigkeiten-IDs verwendet wurden
Danach für jede Fertigkeit (also acht mal):
- 8 (+ n) Bits - ID der Fertigkeit (siehe unten)
Base64 nach Oktal konvertieren
Der Windows-Rechner kann im wissenschaftlichen Modus dezimal zu oktal umrechnen. Paare von oktalen Ziffern können mit dieser Tabelle ver- und entschlüsselt werden.
00 | A | 10 | I | 20 | Q | 30 | Y | 40 | g | 50 | o | 60 | w | 70 | 4 | |||||||
01 | B | 11 | J | 21 | R | 31 | Z | 41 | h | 51 | p | 61 | x | 71 | 5 | |||||||
02 | C | 12 | K | 22 | S | 32 | a | 42 | i | 52 | q | 62 | y | 72 | 6 | |||||||
03 | D | 13 | L | 23 | T | 33 | b | 43 | j | 53 | r | 63 | z | 73 | 7 | |||||||
04 | E | 14 | M | 24 | U | 34 | c | 44 | k | 54 | s | 64 | 0 | 74 | 8 | |||||||
05 | F | 15 | N | 25 | V | 35 | d | 45 | l | 55 | t | 65 | 1 | 75 | 9 | |||||||
06 | G | 16 | O | 26 | W | 36 | e | 46 | m | 56 | u | 66 | 2 | 76 | + | |||||||
07 | H | 17 | P | 27 | X | 37 | f | 47 | n | 57 | v | 67 | 3 | 77 | / |
Beispiel
Für ein Komplettbeispiel siehe hier.
Implementierung
Lesen
Um das Guild-Wars-Vorlagenformat zu lesen, sollte man zunächst einmal die Daten in binärer Form irgendwo speichern, um bitgenau darauf zugreifen zu können, zum Beispiel in einem String (aus 1 und 0) oder einem Array. Es sollten 576 Einträge möglich sein, da sich die wichtigen Informationen in Fertigkeitenvorlagencodes nur in den ersten 572 Bits befinden können (die 4 Bit danach füllen das letzte Base64-Zeichen auf). Wenn man diesen Speicher nach dem Einlesen mit Nullen füllt, kann es beim Lesen ungültiger Codes keine Fehler geben, bloß sinnlose Rückgabewerte. Zum Lesen verwendet man dann eine Funktion, der man sagt, ab welcher Bitstelle sie wie viele Bits lesen und entsprechend aufsummieren soll.
Schreiben
Zum Schreiben von Vorlagencodes mit dem vollen Funktionsumfang nimmt man sich am besten wieder einen oben beschriebenen Speicher für die Binärdaten. Den füllt man dann mit den Daten. Der erste Schritt beim Schreiben von Vorlagencodes muss aber sein, dass man die zusätzlich benötigten Bits bestimmt. Bei den Klassen kann man 0 annehmen, da es in Guild Wars weniger als 16 Klassen gibt, was das durch die Grund-Größe definierte Minimum ist. Bei der Entwicklung der Codes ging man übrigens davon aus, dass Guild Wars einmal über 1.000 verschiedene Klassen (nicht Kombinationen) enthalten würde (24+2·3). Bei den anderen beiden (Attribute und Fertigkeiten) muss man schauen, unter (nicht in!) welcher Zweierpotenz alle jeweiligen Werte liegen.
Hat man alle Daten in diesen Speicher geschrieben, füllt man ihn auf volle 6 Bits auf und macht Base64-Zeichen draus.
Nur Klassen und Fertigkeiten schreiben
Wenn man einfach nur Klassen und Fertigkeiten speichern will, gibt es dazu eine sehr banale Möglichkeit. Man kann nämlich die Angaben für die zusätzlich benötigten Bits so wählen, dass jede Klasse genau ein einzelnes Zeichen und jede Fertigkeit genau zwei einzelne Zeichen einnimmt. Dann braucht man diese Zeichen zusammen mit dem Header und den zusätzlich benötigten Bits nur noch hintereinander schreiben und erhält einen gültigen Vorlagencode, auch wenn Codes, die mit Q beginnen, vielleicht etwas ungewöhnlich aussehen.
function vorlagencode($primärklasse, $sekundärklasse, $fertigkeiten) { $schlüssel = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; $vorlagencode = 'Q' . $schlüssel[$primärklasse] . $schlüssel[$sekundärklasse] . 'AQ'; for( $i = 0; $i < 8; $i++ ) { $vorlagencode .= $schlüssel[$fertigkeiten[$i] % 64] . $schlüssel[floor($fertigkeiten[$i] / 64)]; } return $vorlagencode; }
Codes
Klassen-Codes
- 0 - Keine (nur für Sekundär-Klasse)
- 1 - Krieger
- 2 - Waldläufer
- 3 - Mönch
- 4 - Nekromant
- 5 - Mesmer
- 6 - Elementarmagier
- 7 - Assassine
- 8 - Ritualist
- 9 - Paragon
- 10 - Derwisch
Attribut-Codes
- 0 - Schnellwirkung
- 1 - Illusionsmagie
- 2 - Beherrschungsmagie
- 3 - Inspirationsmagie
- 4 - Blutmagie
- 5 - Todesmagie
- 6 - Seelensammlung
- 7 - Flüche
- 8 - Luftmagie
- 9 - Erdmagie
- 10 - Feuermagie
- 11 - Wassermagie
- 12 - Energiespeicherung
- 13 - Heilgebete
- 14 - Peinigungsgebete
- 15 - Schutzgebete
- 16 - Gunst der Götter
- 17 - Stärke
- 18 - Axtbeherrschung
- 19 - Hammerbeherrschung
- 20 - Schwertkunst
- 21 - Taktik
- 22 - Tierbeherrschung
- 23 - Fachkenntnis
- 24 - Überleben in der Wildnis
- 25 - Treffsicherheit
- 26 - ?
- 27 - ?
- 28 - ?
- 29 - Dolchbeherrschung
- 30 - Tödliche Künste
- 31 - Schattenkünste
- 32 - Zwiesprache
- 33 - Wiederherstellungsmagie
- 34 - Kanalisierungsmagie
- 35 - Kritische Stöße
- 36 - Macht des Herbeirufens
- 37 - Speerbeherrschung
- 38 - Befehlsgewalt
- 39 - Motivation
- 40 - Führung
- 41 - Sensenbeherrschung
- 42 - Windgebete
- 43 - Erdgebete
- 44 - Mystik