News (06 Aug 2024): Das Wiki läuft jetzt auf einem neuen Server. Aufgrund eines Upgrades von PHP mussten die Wiki-Software und die DPL-Erweiterung aktualisiert werden. Bitte meldet Fehler auf der Hauptseiten-Diskussion.

Fertigkeitenvorlagencode: Unterschied zwischen den Versionen

Aus GuildWiki
Zur Navigation springenZur Suche springen
 
(17 dazwischenliegende Versionen von 4 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
[[Kategorie:Spielmechanik]]
==allgemeines Format==
==allgemeines Format==
Die Fertigkeitenvorlage ist ein Bitstream in einer Zeile, der nach der [http://www.faqs.org/rfcs/rfc3548.html RFC3548] base64 verschlüsselt ist. Es werden '''+''' und '''/''' als 62. und 63. Zeichen verwendet.
Die Fertigkeitenvorlage ist ein Bitstream in einer Zeile, der nach der [http://www.faqs.org/rfcs/rfc3548.html RFC3548] base64 verschlüsselt ist. Es werden '''+''' und '''/''' als 62. und 63. Zeichen verwendet.
Zeile 8: Zeile 9:


Wenn das Template vor dem Update am 5. April 2007 erstellt wurde:
Wenn das Template vor dem Update am 5. April 2007 erstellt wurde:
*4 bits - immer 0, Versionsnummer
*4 Bits - immer 0, Versionsnummer
Wenn die Vorlage nach dem Update erstellt wurde:
Wenn die Vorlage nach dem Update erstellt wurde:
*4 bits - immer 14, steht für den Vorlagentyp (14 = Fertigkeitenvorlage)
*4 Bits - immer 14, steht für den Vorlagentyp (14 = Fertigkeitenvorlage)
*4 bits - immer 0, Versionsnummer
*4 Bits - immer 0, Versionsnummer


===Klassen===
===Klassen===
Jetzt werden die beiden Klassen beschrieben:
Jetzt werden die beiden Klassen beschrieben:


*2 bits - Anzahl der bits, die für die Verschlüsselung jeder Klassenid verwendet wurde (zurzeit immer 0; also ist jede Klasse mit 4 bits codiert)
*2 Bits - Zusätzliche Bits zu 4 Standardbits, für die Verschlüsselung jeder Klassenid, wobei gilt <code>Code*2 + 4 = Gesamtzahl</code> (zurzeit ist der Code immer 0, also ist jede Klasse mit 4 Bits codiert)
*n + 4 bits - Primärklasse (siehe unten)
*4 (<code>+ 2*n</code>) Bits - Primärklasse (siehe unten)
*n + 4 bits - Sekundärklasse (siehe unten)
*4 (<code>+ 2*n</code>) Bits - Sekundärklasse (siehe unten)


===Attribute===
===Attribute===
Nun folgen die Attribute:
Nun folgen die Attribute:


*4 bits - Anzahl der Attribute, die kodiert werden
*4 Bits - Anzahl der Attribute, die kodiert werden
*4 bits - Anzahl der bits, die für die Verschlüsselung jeder Attributs-ID verwendet wurden
*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:
Danach für jedes Attribut:
*n + 4 bits - Die ID des Attributs (siehe unten)
*4 (+ n) Bits - Die ID des Attributs (siehe unten)
*4 bits - Rang des Attributs
*4 Bits - Rang des Attributs


===Fertigkeiten===
===Fertigkeiten===
Jetzt die acht Fertigkeiten:
Jetzt die acht Fertigkeiten:


*4 bits - Anzahl der bits, mit denen jede Fertigkeitenid verschlüsselt wurde
*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):
Danach für jede Fertigkeit (also acht mal):
*n + 8 bits - ID der Fertigkeit (siehe unten)
*8 (+ n) Bits - ID der Fertigkeit (siehe unten)


==Base64 nach Oktal konvertieren==
==Base64 nach Oktal konvertieren==
Zeile 44: Zeile 45:
{| {{Prettytable}}
{| {{Prettytable}}
|-
|-
|00||A||10||I||20||Q||30||Y||40||g||50||o||60||w||70||4
|00||A||rowspan=8| ||10||I||rowspan=8| ||20||Q||rowspan=8| ||30||Y||rowspan=8| ||40||g||rowspan=8| ||50||o||rowspan=8| ||60||w||rowspan=8| ||70||4
|-
|-
|01||B||11||J||21||R||31||Z||41||h||51||p||61||x||71||5
|01||B||11||J||21||R||31||Z||41||h||51||p||61||x||71||5
Zeile 60: Zeile 61:
|07||H||17||P||27||X||37||f||47||n||57||v||67||3||77||/
|07||H||17||P||27||X||37||f||47||n||57||v||67||3||77||/
|}
|}
{{Hinweis|Der Taschenrechner rechnet mit Big Endian (das menschliche Stellenwertsystem, das mit den höchstwertigen Ziffern beginnt), allerdings nutzt Guild Wars Little Endian (kleinste Stelle zuerst). Du musst also die binären Zahlen vorn mit Nullen auf sechs Stellen auffüllen und sie danach umdrehen.}}
{{Hinweis|Guild Wars verwendet das Little Endian-Format, und zwar sowohl zwischen Zahlenwerten und Binärarray als auch zwischen Binärarray und Base64-Wert. Base64 verwendet offiziell das Big Endian-Format. Dadurch ist es nicht möglich, normal verfügbare Methoden zur Arbeit mit Base64 zu verwenden, wenn Guild Wars-Vorlagencodes erstellt werden sollen.}}


==Beispiel==
==Beispiel==
Folgendes Beispiel zeigt, wie man die Vorlage ''AxNREp8XH/CgJwEBBAAAXmAA'' entschlüsseln kann.
Für ein Komplettbeispiel siehe [[Fertigkeitenvorlagencode/Beispiel|hier]].
Es handelt sich um ein K/A-Build mit leeren Slots:


{| {{Prettytable}}
==Implementierung==
|- align= center
===Lesen===
! Base64 code || colspan = 6 | A || colspan = 6 | x || colspan = 6 | N || colspan = 6 | R || colspan = 6 | E || colspan = 6 | p || colspan = 6 | etc.
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.
|- align= center
 
| Dezimal || colspan = 6 | 0 || colspan = 6 | 49 || colspan = 6 | 13 || colspan = 6 | 17 || colspan = 6 | 4 || colspan = 6 | 41 || colspan = 6 | etc. 
===Schreiben===
|- align= center
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 (2<sup>4+2·3</sup>). Bei den anderen beiden (Attribute und Fertigkeiten) muss man schauen, unter (nicht in!) welcher Zweierpotenz alle jeweiligen Werte liegen.
| rowspan=2 | Binär || 1 || 2 || 4 || 8 || 16 || 32 || 1 || 2 || 4 || 8 || 16 || 32 || 1 || 2 || 4 || 8 || 16 || 32 || 1 || 2 || 4 || 8 || 16 || 32 || 1 || 2 || 4 || 8 || 16 || 32 || 1 || 2 || 4 || 8 || 16 || 32 || etc.
 
|- align= center
Hat man alle Daten in diesen Speicher geschrieben, füllt man ihn auf volle 6 Bits auf und macht Base64-Zeichen draus.
| 0 || 0 || 0 || 0 || 0 || 0 || 1 || 0 || 0 || 0 || 1 || 1 || 1 || 0 || 1 || 1 || 0 || 0 || 1 || 0 || 0 || 0 || 1 || 0 || 0 || 0 || 1 || 0 || 0 || 0 || 1 || 0 || 0 || 1 || 0 || 1 || etc.
 
|- align= center
====Nur Klassen und Fertigkeiten schreiben====
! Inhalt || colspan=6 | Vorlagen<br />Typ || colspan=4 | Primäre<br />Klasse || colspan=4 | Sekundäre<br />Klasse || colspan=4 | Attributs<br />Anzahl || colspan=4 | Attributs<br />Länge || colspan=5 | Attribut 1 || colspan=4 | Attribut 1<br />Rang || colspan=5 | Attribut 2 || etc.
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.
|- align= center
function vorlagencode($primärklasse, $sekundärklasse, $fertigkeiten) {
| Binär || 1 || 2 || 4 || 8 || 16 || 32 || 1 || 2 || 4 || 8 || 1 || 2 || 4 || 8 || 1 || 2 || 4 || 8 || 1 || 2 || 4 || 8 || 1 || 2 || 4 || 8 || 16 || 1 || 2 || 4 || 8 ||1 || 2 || 4 || 8 || 16 ||  etc.
  $schlüssel = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
|- align= center
  $vorlagencode = 'Q' . $schlüssel[$primärklasse] . $schlüssel[$sekundärklasse] . 'AQ';
| Dezimal || colspan=6 | 0 || colspan=4 | 1 || colspan=4 | 7 || colspan=4 | 3 || colspan=4 | 1 || colspan=5 | 17 || colspan=4 | 8 || colspan=5 | 20 || etc.
  for( $i = 0; $i < 8; $i++ ) {
|- align= center
    $vorlagencode .= $schlüssel[$fertigkeiten[$i] % 64] . $schlüssel[floor($fertigkeiten[$i] / 64)];
! Bedeutung || colspan=6 | Fertigkeiten-<br />vorlage || colspan=4 | Krieger || colspan=4 | Assassine || colspan=4 |  3 Attribute || colspan=4 | 1 + 4 = 5 bits || colspan=5 | Stärke || colspan=4 | 8 || colspan=5 | Schwertkunst || etc.
  }
|}
  return $vorlagencode;
}


==Codes==
==Codes==
Zeile 146: Zeile 150:


===Fertigkeiten-Codes===
===Fertigkeiten-Codes===
Achtung:
{| class="versteckte-liste" style="white-space: no-wrap;"
*'''Gesperrte Fertigkeiten''' sind auf normalem Weg nicht im Spiel zu finden. Man muss dazu eine spezielle Vorlage erstellen.
|
*'''Ungültige Fertigkeiten''' sind im Spiel zu finden, können aber genau wie die '''gesperrten Fertigkeiten''' nicht ausrüsten (meistens handelt es sich um Monsterfertigkeiten oder Fertigkeiten, die noch aus den Prophecies-Alpha/-Beta-Versionen stammen).
*0 - [[Bild:Beliebig.jpg|25px|link=]] leer
 
*1 - {{Fertigkeit icon|Siegel der Heilung|nein}}
*0 - (leerer Slot)
*2 - {{Fertigkeit icon|Siegel der Wiederbelebung|nein}}
*1 - [[Siegel der Heilung]]
*3 - {{Fertigkeit icon|Siegel der Erbeutung|nein}}
*2 - [[Siegel der Wiederbelebung]]
*5 - {{Fertigkeit icon|Kraftblock|nein}}
*3 - [[Siegel der Erbeutung]]
*6 - {{Fertigkeit icon|Mantra der Erde|nein}}
*4 - [[BAMPH !]] (gesperrt)
*7 - {{Fertigkeit icon|Mantra des Feuers|nein}}
*5 - [[Kraftblock]]
*8 - {{Fertigkeit icon|Mantra des Frosts|nein}}
*6 - [[Mantra der Erde]]
*9 - {{Fertigkeit icon|Mantra des Blitzes|nein}}
*7 - [[Mantra des Feuers]]
*10 - {{Fertigkeit icon|Gebrochene Verhexung|nein}}
*8 - [[Mantra des Frosts]]
*11 - {{Fertigkeit icon|Verzerrung|nein}}
*9 - [[Mantra des Blitzes]]
*13 - {{Fertigkeit icon|Mantra der Erholung|nein}}
*10 - [[Gebrochene Verhexung]]
*14 - {{Fertigkeit icon|Mantra des Bestehens|nein}}
*11 - [[Verzerrung]]
*15 - {{Fertigkeit icon|Mantra der Inschriften|nein}}
*12 - [[Mantra der Geschwindigkeit]] (gesperrt)
*16 - {{Fertigkeit icon|Mantra der Konzentration|nein}}
*13 - [[Mantra der Erholung]]
*17 - {{Fertigkeit icon|Mantra des Abschlusses|nein}}
*14 - [[Mantra des Bestehens]]
*18 - {{Fertigkeit icon|Mantra der Siegel|nein}}
*15 - [[Mantra der Inschriften]]
*19 - {{Fertigkeit icon|Zerbrechlichkeit|nein}}
*16 - [[Mantra der Konzentration]]
*21 - {{Fertigkeit icon|Inspirierte Verzauberung|nein}}
*17 - [[Mantra des Abschlusses]]
*22 - {{Fertigkeit icon|Inspirierte Verhexung|nein}}
*18 - [[Mantra der Siegel]]
*23 - {{Fertigkeit icon|Kraftdorn|nein}}
*19 - [[Zerbrechlichkeit]]
*24 - {{Fertigkeit icon|Kraftleck|nein}}
*20 - [[Konfusion]] (gesperrt)
*25 - {{Fertigkeit icon|Kraftentzug|nein}}
*21 - [[Inspirierte Verzauberung]]
*26 - {{Fertigkeit icon|Empathie|nein}}
*22 - [[Inspirierte Verhexung]]
*27 - {{Fertigkeit icon|Täuschungen brechen|nein}}
*23 - [[Kraftdorn]]
*28 - {{Fertigkeit icon|Rückschlag|nein}}
*24 - [[Kraftleck]]
*29 - {{Fertigkeit icon|Blackout|nein}}
*25 - [[Kraftentzug]]
*30 - {{Fertigkeit icon|Ablenkung|nein}}
*26 - [[Empathie]]
*31 - {{Fertigkeit icon|Trugbild beschwören|nein}}
*27 - [[Täuschungen brechen]]
*32 - {{Fertigkeit icon|Illusion der Schwäche|nein}}
*28 - [[Rückschlag]]
*33 - {{Fertigkeit icon|Illusion der Waffen|nein}}
*29 - [[Blackout]]
*34 - {{Fertigkeit icon|Sympathisches Gesicht|nein}}
*30 - [[Ablenkung]]
*35 - {{Fertigkeit icon|Ignoranz|nein}}
*31 - [[Trugbild beschwören]]
*36 - {{Fertigkeit icon|Arkanes Rätsel|nein}}
*32 - [[Illusion der Schwäche]]
*37 - {{Fertigkeit icon|Illusion der Eile|nein}}
*33 - [[Illusion der Waffen]]
*38 - {{Fertigkeit icon|Kanalisieren|nein}}
*34 - [[Sympathisches Gesicht]]
*39 - {{Fertigkeit icon|Energiewelle|nein}}
*35 - [[Ignoranz]]
*40 - {{Fertigkeit icon|Ätherschmaus|nein}}
*36 - [[Arkanes Rätsel]]
*41 - {{Fertigkeit icon|Herr über den Äther|nein}}
*37 - [[Illusion der Eile]]
*42 - {{Fertigkeit icon|Energiebrand|nein}}
*38 - [[Kanalisieren]]
*43 - {{Fertigkeit icon|Ungeschick|nein}}
*39 - [[Energiewelle]]
*44 - {{Fertigkeit icon|Phantomschmerz|nein}}
*40 - [[Ätherschmaus]]
*45 - {{Fertigkeit icon|Ätherische Bürde|nein}}
*41 - [[Herr über den Äther]]
*46 - {{Fertigkeit icon|Schuld|nein}}
*42 - [[Energiebrand]]
*47 - {{Fertigkeit icon|Unbeholfenheit|nein}}
*43 - [[Ungeschick]]
*48 - {{Fertigkeit icon|Geist des Versagens|nein}}
*44 - [[Phantomschmerz]]
*49 - {{Fertigkeit icon|Geistiges Wrack|nein}}
*45 - [[Ätherische Bürde]]
*50 - {{Fertigkeit icon|Verschwendung|nein}}
*46 - [[Schuld]]
*51 - {{Fertigkeit icon|Schande|nein}}
*47 - [[Unbeholfenheit]]
*52 - {{Fertigkeit icon|Panik|nein}}
*48 - [[Geist des Versagens]]
*53 - {{Fertigkeit icon|Migräne|nein}}
*49 - [[Geistiges Wrack]]
*54 - {{Fertigkeit icon|Verkrüppelnde Qual|nein}}
*50 - [[Verschwendung]]
*55 - {{Fertigkeit icon|Fieberträume|nein}}
*51 - [[Schande]]
*56 - {{Fertigkeit icon|Beruhigende Bilder|nein}}
*52 - [[Panik]]
*57 - {{Fertigkeit icon|Schrei der Frustration|nein}}
*53 - [[Migräne]]
*58 - {{Fertigkeit icon|Siegel der Mitternacht|nein}}
*54 - [[Verkrüppelnde Qual]]
*59 - {{Fertigkeit icon|Siegel der Müdigkeit|nein}}
*55 - [[Fieberträume]]
*61 - {{Fertigkeit icon|Blutsauger-Siegel|nein}}
*56 - [[Beruhigende Bilder]]
*62 - {{Fertigkeit icon|Siegel der Demut|nein}}
*57 - [[Schrei der Frustration]]
*63 - {{Fertigkeit icon|Schlussstein-Siegel|nein}}
*58 - [[Siegel der Mitternacht]]
*65 - {{Fertigkeit icon|Arkane Mimikry|nein}}
*59 - [[Siegel der Müdigkeit]]
*66 - {{Fertigkeit icon|Geistfesseln|nein}}
*60 - [[Siegel der Illusionen (entfernte Fertigkeit)]]
*67 - {{Fertigkeit icon|Verhexung brechen|nein}}
*61 - [[Blutsauger-Siegel]]
*68 - {{Fertigkeit icon|Verzauberung entziehen|nein}}
*62 - [[Siegel der Demut]]
*69 - {{Fertigkeit icon|Verzauberung brechen|nein}}
*63 - [[Schlussstein-Siegel]]
*72 - {{Fertigkeit icon|Elementarwiderstand|nein}}
*64 - [[Mimikry]] (gesperrt)
*73 - {{Fertigkeit icon|Körperlicher Widerstand|nein}}
*65 - [[Arkane Mimikry]]
*74 - {{Fertigkeit icon|Echo|nein}}
*66 - [[Geistfesseln]]
*75 - {{Fertigkeit icon|Arkanes Echo|nein}}
*67 - [[Verhexung brechen]]
*76 - {{Fertigkeit icon|Eingebildete Bürde|nein}}
*68 - [[Verzauberung entziehen]]
*77 - {{Fertigkeit icon|Chaossturm|nein}}
*69 - [[Verzauberung brechen]]
*78 - {{Fertigkeit icon|Epidemie|nein}}
*70 - [[Verschwinden]] (gesperrt)
*79 - {{Fertigkeit icon|Energieentzug|nein}}
*71 - [[Unnatürliches Siegel (entfernte Fertigkeit)]] (gesperrt)
*80 - {{Fertigkeit icon|Energie abzapfen|nein}}
*72 - [[Elementarwiderstand]]
*81 - {{Fertigkeit icon|Arkaner Diebstahl|nein}}
*73 - [[Körperlicher Widerstand]]
*82 - {{Fertigkeit icon|Mantra der Zurückrufung|nein}}
*74 - [[Echo]]
*83 - {{Fertigkeit icon|Knochenschreck beleben|nein}}
*75 - [[Arkanes Echo]]
*84 - {{Fertigkeit icon|Knochenteufel beleben|nein}}
*76 - [[Eingebildete Bürde]]
*85 - {{Fertigkeit icon|Knochendiener beleben|nein}}
*77 - [[Chaossturm]]
*86 - {{Fertigkeit icon|Grenths Ausgleich|nein}}
*78 - [[Epidemie]]
*87 - {{Fertigkeit icon|Veratas Starren|nein}}
*79 - [[Energieentzug]]
*88 - {{Fertigkeit icon|Veratas Aura|nein}}
*80 - [[Energie abzapfen]]
*89 - {{Fertigkeit icon|Tödliche Kühlung|nein}}
*81 - [[Arkaner Diebstahl]]
*90 - {{Fertigkeit icon|Veratas Opfer|nein}}
*82 - [[Mantra der Zurückrufung]]
*91 - {{Fertigkeit icon|Brunnen der Kraft|nein}}
*83 - [[Knochenschreck beleben]]
*92 - {{Fertigkeit icon|Brunnen des Blutes|nein}}
*84 - [[Knochenteufel beleben]]
*93 - {{Fertigkeit icon|Brunnen
*85 - [[Knochendiener beleben]]
*86 - [[Grenths Ausgleich]]
*87 - [[Veratas Starren]]
*88 - [[Veratas Aura]]
*89 - [[Tödliche Kühlung]]
*90 - [[Veratas Opfer]]
*91 - [[Brunnen der Kraft]]
*92 - [[Brunnen des Blutes]]
*93 - [[Brunnen des Leidens]]
*94 - [[Gottloser Brunnen]]
*95 - [[Explosion der Verwesung]]
*96 - [[Seelenschmaus]]
*97 - [[Nekrotische Verwechslung]]
*98 - [[Kadaver verzehren]]
*99 - [[Parasitäre Fesseln]]
*100 - [[Seelenwiderhaken]]
*101 - [[Widerhaken]]
*102 - [[Schattenschlag]]
*103 - [[Preis des Versagens]]
*104 - [[Todesnova]]
*105 - [[Tödlicher Schwarm]]
*106 - [[Verrottendes Fleisch]]
*107 - [[Ansteckung]]
*108 - [[Leiden]]
*109 - [[Leben abzapfen]]
*110 - [[Unheiliger Schmaus]]
*111 - [[Das Blut erwecken]]
*112 - [[Verzauberungsschändung]]
*113 - [[Verdorbenes Fleisch]]
*114 - [[Aura des Lich]]
*115 - [[Bluterneuerung]]
*116 - [[Dunkle Aura]]
*117 - [[Schwächen]]
*118 - [[Schwächendes Blut]]
*119 - [[Blut ist Kraft]]
*120 - [[Blut des Meisters]]
*121 - [[Boshafter Geist]]
*122 - [[Unheilvoller Eingriff]]
*123 - [[Heimtückischer Parasit]]
*124 - [[Rückenschauer]]
*125 - [[Verwelken]]
*126 - [[Lebensübertragung]]
*127 - [[Zeichen der Subversion]]
*128 - [[Seelenfresser]]
*129 - [[Fleisch schänden]]
*130 - [[Dämonenfleisch]]
*131 - [[Siegel der Widerhaken]]
*132 - [[Pest-Siegel]]
*133 - [[Dunkler Pakt]]
*134 - [[Orden der Schmerzen]]
*135 - [[Mutlosigkeit]]
*136 - [[Schatten der Angst]]
*137 - [[Totenstarre]]
*138 - [[Dunkles Band]]
*139 - [[Zustand einflößen]]
*140 - [[Unwohlsein]]
*141 - [[Verzauberungen entreißen]]
*142 - [[Bleibender Fluch]]
*143 - [[Verzauberung rauben]]
*144 - [[Frostbeulen]]
*145 - [[Siegel der Qual]]
*146 - [[Blutopfer]]
*147 - [[Dunkle Wut]]
*148 - [[Orden des Vampirs]]
*149 - [[Pest aussenden]]
*150 - [[Zeichen des Schmerzes]]
*151 - [[Schmaus der Verdorbenheit]]
*152 - [[Geschmack des Todes]]
*153 - [[Vampir-Starren]]
*154 - [[Pest-Berührung]]
*155 - [[Abscheuliche Berührung]]
*156 - [[Vampir-Berührung]]
*157 - [[Blutritual]]
*158 - [[Berührung der Qual]]
*159 - [[Rüstung schwächen]]
*160 -
{{en|Skill template format}}
{{en|Skill template format}}

Aktuelle Version vom 4. April 2018, 16:00 Uhr

allgemeines Format[Bearbeiten]

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[Bearbeiten]

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[Bearbeiten]

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[Bearbeiten]

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[Bearbeiten]

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[Bearbeiten]

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 /
Messagebox info.png Hinweis: Der Taschenrechner rechnet mit Big Endian (das menschliche Stellenwertsystem, das mit den höchstwertigen Ziffern beginnt), allerdings nutzt Guild Wars Little Endian (kleinste Stelle zuerst). Du musst also die binären Zahlen vorn mit Nullen auf sechs Stellen auffüllen und sie danach umdrehen.
Messagebox info.png Hinweis: Guild Wars verwendet das Little Endian-Format, und zwar sowohl zwischen Zahlenwerten und Binärarray als auch zwischen Binärarray und Base64-Wert. Base64 verwendet offiziell das Big Endian-Format. Dadurch ist es nicht möglich, normal verfügbare Methoden zur Arbeit mit Base64 zu verwenden, wenn Guild Wars-Vorlagencodes erstellt werden sollen.

Beispiel[Bearbeiten]

Für ein Komplettbeispiel siehe hier.

Implementierung[Bearbeiten]

Lesen[Bearbeiten]

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[Bearbeiten]

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[Bearbeiten]

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[Bearbeiten]

Klassen-Codes[Bearbeiten]

Attribut-Codes[Bearbeiten]

Fertigkeiten-Codes[Bearbeiten]

Englische Bezeichnung: Skill template format