Fertigkeitenvorlagencode: Unterschied zwischen den Versionen

Aus GuildWiki
Wechseln zu:Navigation, Suche
(Attribute Codes)
(Base64 nach Oktal konvertieren)
 
(66 dazwischenliegende Versionen von 17 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
{{Übersetzungs-Stub}}
+
[[Kategorie:Spielmechanik]]
==Overall Format==
+
==allgemeines Format==
The skill template is a single line that is a base64 encoded bit stream as defined in [http://www.faqs.org/rfcs/rfc3548.html rfc3548] using + and / as the 62nd and 63rd characters respectively.
+
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.
  
Numbers of varying number of bits are placed into the bitstream, in the following sequence:
+
Der Bitstream besteht aus folgender Abfolge von verschieden langen Sequenzen:
  
If generated before 4/5/2007 update:
+
===Header===
*4 bits - always 0, assumed to indicate the version and that this is a Skill Template.
+
Zuerst werden die Header (Typ und Version) beschrieben:
If generated after 4/5/2007 update:
 
*4 bits - always 14, indicates version and that this is a Skill Template
 
*4 bits - always 0, could be used for race in upcoming GW:EN
 
  
The rest is the same before and after the update:
+
Wenn das Template vor dem Update am 5. April 2007 erstellt wurde:
*2 bits - always 0, perhaps reserved to indicate size of profession fields
+
*4 Bits - immer 0, Versionsnummer
*4 bits - Primary profession (see table below)
+
Wenn die Vorlage nach dem Update erstellt wurde:
*4 bits - Secondary profession (see table below)
+
*4 Bits - immer 14, steht für den Vorlagentyp (14 = Fertigkeitenvorlage)
*4 bits - The number of attributes specified in the template
+
*4 Bits - immer 0, Versionsnummer
*4 bits - Size of attribute codes. All attribute codes are the same size, and the size (in bits) is equal to 4 plus this number. For example, if the size is 2, each of the attribute codes will be 6 bits.
 
*Sequence of attribute codes and values
 
**(4 + size) bits - attribute code (see table below)
 
**4 bits - value of attribute, this is 1 - 12, and does not take into account runes, headgear, etc.
 
*4 bits - Size of the skill codes. This works in the same way as the attribute size, except that each skill code is (8 + size) bits.
 
*Sequence of exactly 8 skill codes
 
**(8 + size) bits - skill code (see table below)
 
  
===Octal to base 64===
+
===Klassen===
Windows Calculator can convert base 10 to octal (base 8) while in scientific calculator mode, and pairs of octal digits can be easily be converted to base 64 digits using this table.
+
Jetzt werden die beiden Klassen beschrieben:
  
{| {{STDT}}
+
*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)
 +
*4 (<code>+ 2*n</code>) Bits - Primärklasse (siehe unten)
 +
*4 (<code>+ 2*n</code>) 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.
 +
 
 +
{| {{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 46: Zeile 62:
 
|}
 
|}
  
===Example===
+
{{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.}}
The following example shows how to decypher the skill template ''AxNREp8XH/CgJwEBBAAAXmAA'' which is a Warrior / Assassin build:
+
{{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==
 +
Für ein Komplettbeispiel siehe [[Fertigkeitenvorlagencode/Beispiel|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 (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.
 +
 
 +
Hat man alle Daten in diesen Speicher geschrieben, füllt man ihn auf volle 6 Bits auf und macht Base64-Zeichen draus.
  
{| {{STDT}}
+
====Nur Klassen und Fertigkeiten schreiben====
|- align= center
+
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.
! Base64 code || colspan = 6 | A || colspan = 6 | x || colspan = 6 | N || colspan = 6 | R || colspan = 6 | E || colspan = 6 | p || colspan = 6 | etc.
+
function vorlagencode($primärklasse, $sekundärklasse, $fertigkeiten) {
|- align= center
+
  $schlüssel = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
| Decimal || colspan = 6 | 0 || colspan = 6 | 49 || colspan = 6 | 13 || colspan = 6 | 17 || colspan = 6 | 4 || colspan = 6 | 41 || colspan = 6 | etc.  
+
  $vorlagencode = 'Q' . $schlüssel[$primärklasse] . $schlüssel[$sekundärklasse] . 'AQ';
|- align= center
+
  for( $i = 0; $i < 8; $i++ ) {
| rowspan=2 | Binary || 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.
+
    $vorlagencode .= $schlüssel[$fertigkeiten[$i] % 64] . $schlüssel[floor($fertigkeiten[$i] / 64)];
|- align= center
+
  }
| 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.
+
  return $vorlagencode;
|- align= center
+
  }
! Content || colspan=6 | Template<br>type || colspan=4 | Primary<br>Profession || colspan=4 | Secondary<br>Profession || colspan=4 | No. of<br>attributes || colspan=4 | Attribute<br>bit length || colspan=5 | Attribute 1 || colspan=4 | Attribute 1<br>rank || colspan=5 | Attribute 2 || etc.
 
|- align= center
 
| Binary || 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.
 
|- align= center
 
| Decimal || 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.
 
|- align= center
 
! Meaning || colspan=6 | Skill template || colspan=4 | Warrior || colspan=4 | Assassin || colspan=4 | 3 attributes || colspan=4 | 1 + 4 = 5 bit || colspan=5 | Strength || colspan=4 | 8 || colspan=5 | Swordsmanship || etc.
 
|}
 
  
 
==Codes==
 
==Codes==
Zeile 129: Zeile 149:
 
*44 - [[Mystik]]
 
*44 - [[Mystik]]
  
===Skill codes===
+
===Fertigkeiten-Codes===
 
+
{| class="versteckte-liste" style="white-space: no-wrap;"
{{section-stub}}
+
|
 
+
*0 - [[Bild:Beliebig.jpg|25px|link=]] leer
Note:
+
*1 - {{Fertigkeit icon|Siegel der Heilung|nein}}
 
+
*2 - {{Fertigkeit icon|Siegel der Wiederbelebung|nein}}
'''Locked Skills''' cannot be found in game without making special templates.
+
*3 - {{Fertigkeit icon|Siegel der Erbeutung|nein}}
 
+
*5 - {{Fertigkeit icon|Kraftblock|nein}}
'''Invalid skills''' can be found in game, nevertheless, like '''Locked Skills''', you cannot equip them (In most cases, they are monsters skills or skills left over from the prophecies alpha/beta versions of the game).
+
*6 - {{Fertigkeit icon|Mantra der Erde|nein}}
 
+
*7 - {{Fertigkeit icon|Mantra des Feuers|nein}}
 
+
*8 - {{Fertigkeit icon|Mantra des Frosts|nein}}
*0 - (blank)
+
*9 - {{Fertigkeit icon|Mantra des Blitzes|nein}}
*1 - [[Healing Signet]]
+
*10 - {{Fertigkeit icon|Gebrochene Verhexung|nein}}
*2 - [[Resurrection Signet]]
+
*11 - {{Fertigkeit icon|Verzerrung|nein}}
*3 - [[Signet of Capture]]
+
*13 - {{Fertigkeit icon|Mantra der Erholung|nein}}
*4 - [[BAMPH !]] (Locked Skill)
+
*14 - {{Fertigkeit icon|Mantra des Bestehens|nein}}
*5 - [[Power Block]]
+
*15 - {{Fertigkeit icon|Mantra der Inschriften|nein}}
*6 - [[Mantra of Earth]]
+
*16 - {{Fertigkeit icon|Mantra der Konzentration|nein}}
*7 - [[Mantra of Flame]]
+
*17 - {{Fertigkeit icon|Mantra des Abschlusses|nein}}
*8 - [[Mantra of Frost]]
+
*18 - {{Fertigkeit icon|Mantra der Siegel|nein}}
*9 - [[Mantra of Lightning]]
+
*19 - {{Fertigkeit icon|Zerbrechlichkeit|nein}}
*10 - [[Hex Breaker]]
+
*21 - {{Fertigkeit icon|Inspirierte Verzauberung|nein}}
*11 - [[Distortion]]
+
*22 - {{Fertigkeit icon|Inspirierte Verhexung|nein}}
*12 - [[Mantra of Celerity]] (Locked Skill)
+
*23 - {{Fertigkeit icon|Kraftdorn|nein}}
*13 - [[Mantra of Recovery]]
+
*24 - {{Fertigkeit icon|Kraftleck|nein}}
*14 - [[Mantra of Persistence]]
+
*25 - {{Fertigkeit icon|Kraftentzug|nein}}
*15 - [[Mantra of Inscriptions]]
+
*26 - {{Fertigkeit icon|Empathie|nein}}
*16 - [[Mantra of Concentration]]
+
*27 - {{Fertigkeit icon|Täuschungen brechen|nein}}
*17 - [[Mantra of Resolve]]
+
*28 - {{Fertigkeit icon|Rückschlag|nein}}
*18 - [[Mantra of Signets]]
+
*29 - {{Fertigkeit icon|Blackout|nein}}
*19 - [[Fragility]]
+
*30 - {{Fertigkeit icon|Ablenkung|nein}}
*20 - [[Confusion]] (Locked Skill)
+
*31 - {{Fertigkeit icon|Trugbild beschwören|nein}}
*21 - [[Inspired Enchantment]]
+
*32 - {{Fertigkeit icon|Illusion der Schwäche|nein}}
*22 - [[Inspired Hex]]
+
*33 - {{Fertigkeit icon|Illusion der Waffen|nein}}
*23 - [[Power Spike]]
+
*34 - {{Fertigkeit icon|Sympathisches Gesicht|nein}}
*24 - [[Power Leak]]
+
*35 - {{Fertigkeit icon|Ignoranz|nein}}
*25 - [[Power Drain]]
+
*36 - {{Fertigkeit icon|Arkanes Rätsel|nein}}
*26 - [[Empathy]]
+
*37 - {{Fertigkeit icon|Illusion der Eile|nein}}
*27 - [[Shatter Delusions]]
+
*38 - {{Fertigkeit icon|Kanalisieren|nein}}
*28 - [[Backfire]]
+
*39 - {{Fertigkeit icon|Energiewelle|nein}}
*29 - [[Blackout]]
+
*40 - {{Fertigkeit icon|Ätherschmaus|nein}}
*30 - [[Diversion]]
+
*41 - {{Fertigkeit icon|Herr über den Äther|nein}}
*31 - [[Conjure Phantasm]]
+
*42 - {{Fertigkeit icon|Energiebrand|nein}}
*32 - [[Illusion of Weakness]]
+
*43 - {{Fertigkeit icon|Ungeschick|nein}}
*33 - [[Illusionary Weaponry]]
+
*44 - {{Fertigkeit icon|Phantomschmerz|nein}}
*34 - [[Sympathetic Visage]]
+
*45 - {{Fertigkeit icon|Ätherische Bürde|nein}}
*35 - [[Ignorance]]
+
*46 - {{Fertigkeit icon|Schuld|nein}}
*36 - [[Arcane Conundrum]]
+
*47 - {{Fertigkeit icon|Unbeholfenheit|nein}}
*37 - [[Illusion of Haste]]
+
*48 - {{Fertigkeit icon|Geist des Versagens|nein}}
*38 - [[Channeling]]
+
*49 - {{Fertigkeit icon|Geistiges Wrack|nein}}
*39 - [[Energy Surge]]
+
*50 - {{Fertigkeit icon|Verschwendung|nein}}
*40 - [[Ether Feast]]
+
*51 - {{Fertigkeit icon|Schande|nein}}
*41 - [[Ether Lord]]
+
*52 - {{Fertigkeit icon|Panik|nein}}
*42 - [[Energy Burn]]
+
*53 - {{Fertigkeit icon|Migräne|nein}}
*43 - [[Clumsiness]]
+
*54 - {{Fertigkeit icon|Verkrüppelnde Qual|nein}}
*44 - [[Phantom Pain]]
+
*55 - {{Fertigkeit icon|Fieberträume|nein}}
*45 - [[Ethereal Burden]]
+
*56 - {{Fertigkeit icon|Beruhigende Bilder|nein}}
*46 - [[Guilt]]
+
*57 - {{Fertigkeit icon|Schrei der Frustration|nein}}
*47 - [[Ineptitude]]
+
*58 - {{Fertigkeit icon|Siegel der Mitternacht|nein}}
*48 - [[Spirit of Failure]]
+
*59 - {{Fertigkeit icon|Siegel der Müdigkeit|nein}}
*49 - [[Mind Wrack]]
+
*61 - {{Fertigkeit icon|Blutsauger-Siegel|nein}}
*50 - [[Wastrel's Worry]]
+
*62 - {{Fertigkeit icon|Siegel der Demut|nein}}
*51 - [[Shame]]
+
*63 - {{Fertigkeit icon|Schlussstein-Siegel|nein}}
*52 - [[Panic]]
+
*65 - {{Fertigkeit icon|Arkane Mimikry|nein}}
*53 - [[Migraine]]
+
*66 - {{Fertigkeit icon|Geistfesseln|nein}}
*54 - [[Crippling Anguish]]
+
*67 - {{Fertigkeit icon|Verhexung brechen|nein}}
*55 - [[Fevered Dreams]]
+
*68 - {{Fertigkeit icon|Verzauberung entziehen|nein}}
*56 - [[Soothing Images]]
+
*69 - {{Fertigkeit icon|Verzauberung brechen|nein}}
*57 - [[Cry of Frustration]]
+
*72 - {{Fertigkeit icon|Elementarwiderstand|nein}}
*58 - [[Signet of Midnight]]
+
*73 - {{Fertigkeit icon|Körperlicher Widerstand|nein}}
*59 - [[Signet of Weariness]]
+
*74 - {{Fertigkeit icon|Echo|nein}}
*60 - [[Signet of Illusions]]
+
*75 - {{Fertigkeit icon|Arkanes Echo|nein}}
*61 - [[Leech Signet]]
+
*76 - {{Fertigkeit icon|Eingebildete Bürde|nein}}
*62 - [[Signet of Humility]]
+
*77 - {{Fertigkeit icon|Chaossturm|nein}}
*63 - [[Keystone Signet]]
+
*78 - {{Fertigkeit icon|Epidemie|nein}}
*64 - [[Mimic]] (Locked Skill)
+
*79 - {{Fertigkeit icon|Energieentzug|nein}}
*65 - [[Arcane Mimicry]]
+
*80 - {{Fertigkeit icon|Energie abzapfen|nein}}
*66 - [[Spirit Shackles]]
+
*81 - {{Fertigkeit icon|Arkaner Diebstahl|nein}}
*67 - [[Shatter Hex]]
+
*82 - {{Fertigkeit icon|Mantra der Zurückrufung|nein}}
*68 - [[Drain Enchantment]]
+
*83 - {{Fertigkeit icon|Knochenschreck beleben|nein}}
*69 - [[Shatter Enchantment]]
+
*84 - {{Fertigkeit icon|Knochenteufel beleben|nein}}
*70 - [[Disappear]] (Locked Skill)
+
*85 - {{Fertigkeit icon|Knochendiener beleben|nein}}
*71 - [[Unnatural Signet]] (Locked Skill)
+
*86 - {{Fertigkeit icon|Grenths Ausgleich|nein}}
*72 - [[Elemental Resistance]]
+
*87 - {{Fertigkeit icon|Veratas Starren|nein}}
*73 - [[Physical Resistance]]
+
*88 - {{Fertigkeit icon|Veratas Aura|nein}}
*74 - [[Echo]]
+
*89 - {{Fertigkeit icon|Tödliche Kühlung|nein}}
*75 - [[Arcane Echo]]
+
*90 - {{Fertigkeit icon|Veratas Opfer|nein}}
*76 - [[Imagined Burden]]
+
*91 - {{Fertigkeit icon|Brunnen der Kraft|nein}}
*77 - [[Chaos Storm]]
+
*92 - {{Fertigkeit icon|Brunnen des Blutes|nein}}
*78 - [[Epidemic]]
+
*
*79 - [[Energy Drain]]
 
*80 - [[Energy Tap]]
 
*81 - [[Arcane Thievery]]
 
*82 - [[Mantra of Recall]]
 
*83 - [[Animate Bone Horror]]
 
*84 - [[Animate Bone Fiend]]
 
*85 - [[Animate Bone Minions]]
 
*86 - [[Grenth's Balance]]
 
*87 - [[Verata's Gaze]]
 
*88 - [[Verata's Aura]]
 
*89 - [[Deathly Chill]]
 
*90 - [[Verata's Sacrifice]]
 
*91 - [[Well of Power]]
 
*92 - [[Well of Blood]]
 
*93 - [[Well of Suffering]]
 
*94 - [[Well of the Profane]]
 
*95 - [[Putrid Explosion]]
 
*96 - [[Soul Feast]]
 
*97 - [[Necrotic Traversal]]
 
*98 - [[Consume Corpse]]
 
*99 - [[Parasitic Bond]]
 
*100 - [[Soul Barbs]]
 
*101 - [[Barbs]]
 
*102 - [[Shadow Strike]]
 
*103 - [[Price of Failure]]
 
*104 - [[Death Nova]]
 
*105 - [[Deathly Swarm]]
 
 
 

Aktuelle Version vom 4. April 2018, 17: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