• Herzlich Willkommen!

    Nach der Schließung von inDiablo.de wurden die Inhalte und eure Accounts in dieses Forum konvertiert. Ihr könnt euch hier mit eurem alten Account weiterhin einloggen, müsst euch dafür allerdings über die "Passwort vergessen" Funktion ein neues Passwort setzen lassen.

    Solltet ihr keinen Zugriff mehr auf die mit eurem Account verknüpfte Emailadresse haben, so könnt ihr euch unter Angabe eures Accountnamens, eurer alten Emailadresse sowie eurer gewünschten neuen Emailadresse an einen Administrator wenden.

[FAQ] Bewegungs- und Animationsgeschwindigkeiten Teil 1

Vorwort

Diese FAQ beinhaltet eine Zusammenfassung der wesentlichsten Informationen bezüglich Bewegungs- und Animationsgeschwindigkeiten. Vorrangig gehe ich dabei natürlich auf die Animationsgeschwindigkeit und deren Berechnung ein, doch aus Gründen der Vollständigkeit, habe ich auch allgemeine Informationen über verschiedene Animationen aufgenommen.
Zur Wahrung der Übersichtlichkeit habe ich diese etwas umfangreichere FAQ auf drei Threads aufgeteilt, wobei jeder davon einen bestimmten Bereich enthält:

~ Der erste Teil enthält neben den Einflussfaktoren auch die Berechnung der Bewegungsgeschwindigkeit sowie die Grundlagen der Animationen. Weiters werden darin Schildblock, Treffererholung, Zauber, die Ausweichfertigkeiten der Amazone und der Waffenblocker der Assassine genauer behandelt.
~ Der zweite Teil beschäftigt sich mit den Angriffen, welche aufgrund verschiedener Sonderregelungen weitaus komplexer als die bisherigen Animationen sind. Die Teilbereiche dieses Threads sind neben den Grundlagen und dem Dual-Waffen Modus auch die speziellen Berechnungssysteme von Rollback, Verwandlungen und verschiedensten Fertigkeiten. Zuletzt werden dort auch ein paar Sonderregelungen der Söldner wiederholt.
~ Abschließend enthält der dritte Teil noch eine Sammlung verschiedenster zur Berechnung benötigten Daten, sowie die Ergebnisse der Berechnungen in Form von Breakpoints.


Grundlegendes

Bevor ich nun mit dem eigentlichen Thema beginne, möchte ich zuvor noch kurz auf ein paar Grundlagen eingehen:

Zwei zusammenhängende Begriffe, welche oftmals in dieser FAQ verwendet werden, sind "Frame" und "Tick". Filme und Animationen bestehen aus Einzelbildern, welche so schnell abgespielt werden, dass die Bildfolge aufgrund der Trägheit unserer Augen als Bewegung wahrgenommen wird. Ein solches Einzelbild wird dabei als "Frame" bezeichnet. Die Spielmechanik spielt pro Sekunde 25 solcher Frames ab, um die Illusion einer Bewegung hervorzurufen. Der zeitliche Abstand zwischen der Ausgabe zweier Frames beträgt damit 0,04 Sekunden und auch diese Zeiteinheit wird oftmals als "Frame" bezeichnet, da Blizzard diese Bezeichnung in den Spieldateien verwendet. Diese Benennung ist jedoch äußerst unpraktisch, weil damit für ein Standbild und die Zeiteinheit der selbe Begriff verwendet wird, was bei der detailierten Betrachtung der Animationen zu Komplikationen führen kann. Damit man beide Begriffe nun leichter voneinander unterscheiden kann, hat man für diese Zeiteinheit von 0,04 Sekunden die Bezeichnung "Tick" eingeführt.

~~~

Um Speicherplatz einzusparen, rechnet das Spiel intern ausschließlich mit Integer-Werten. Das bedeutet, dass sämtliche Werte nur ganzzahlig abgespeichert werden können. Die Nachkommastellen werden daher einfach abgeschnitten, was bei positiven Werten einem Abrunden und bei negativen Werten einem Aufrunden gleichkommt. In einer Formel kennzeichnet man die Art der Rundung oftmals durch die Verwendung unterschiedlicher Klammern:

[...] = Wert innerhalb der Klammern wird abgerundet
{...} = Wert innerhalb der Klammern wird aufgerundet

In bestimmten Formeln kann der zu rundende Wert sowohl negative als auch positive Werte annehmen, wodurch die Art der Rundung vom betreffenden Wert abhängig ist. Diese Möglichkeit sollte stets bedacht werden, vom gedankenlosen Anwenden einer Formel ist stets abzuraten.

~~~

Ich beziehe mich des öfteren auf gewisse spielinterne Dateien, zum Beispiel die MonStats.txt. Diese dienen nur als Quellen verschiedenster Informationen und sind zum Verstehen der Abläufe nicht notwendig. Man sollte sich daher nicht von diesen Dateien verwirren lassen, wenn man mit ihnen nicht vertraut ist. Wer selbst einen Blick in diese Dateien werfen möchte, findet eine Anleitung dafür im Modding-Anfängerguide auf der Mainpage.
Bezogen auf die spielinternen Dateien ist noch zu sagen, dass Entfernungen dort nicht in Metern angegeben werden, sondern in Subtiles. Die Subtiles sind gewissermaßen Bodenplatten des Spielfeldes, beispielsweise der Platz den ein Haufen Gold benötigt. Zur Umrechnung in Meter muss man die Entfernung in Subtiles mit dem Faktor 2/3 multiplizieren.
 
Einflussfaktoren

Bevor ich ins Detail gehe und die verschiedensten Formeln erkläre, möchte ich hier noch einen groben Überblick aus spielerischer Sicht geben. Dieser Abschnitt behandelt die Frage, wie die Bewegung und bestimmte Animationen durch den Spieler oder andere Spieleinheiten beeinflusst werden können. Eine große Rolle spielen dabei die verschiedenen Verlangsamungseffekte, auf welche ich genauer eingehen werde.

Bewegungsgeschwindigkeit

Gegenstandsboni

Diverse Gegenstände verfügen über die Eigenschaft "schnelleres Gehen/Rennen", abgekürzt auch als FRW (Faster Run/Walk) bezeichnet. Der Wert dieser Eigenschaft wird spielintern jedoch nicht zur Berechnung herangezogen, denn er wird zuvor in einen Effektivwert umgerechnet - man spricht dann von EFRW. Diese Umrechnung erfolgt über die so genannte "dimishing returns" Formel (EFRW = [150*FRW/(150 + FRW)]), welche einen sinkenden Grenznutzen aufweist. Der Zuwachs an EFRW sinkt daher bei steigendem FRW immer weiter, sodass sich der EFRW asymptotisch dem Wert 150 nähert. Durch die Rundungen des EFRW entstehen so genannte Breakpoints, sprich FRW-Werte ab denen wieder eine Änderung der EFRW auftritt und der Bonus damit steigt. Allerdings sind diese Breakpoints für die Bewegungsgeschwindigkeit sehr nahe beieinander und zudem relativ bedeutungslos, sodass eine gesonderte Anschreibung nicht nötig ist.


Fertigkeitsboni

Die zweite Möglichkeit seine Bewegungsgeschwindigkeit zu erhöhen, ist über diverse Fertigkeiten. Deren Bonus wird als SFRW bezeichnet und durchläuft keine Formel, sodass er zur Gänze wirkt. Die Fertigkeiten mit einem solchen Bonus sind folgende:

Raserei (Barbar)
Erhöhtes Tempo (Barbar)
Barbarenwut (Druide)
Tempoblitz (Assassine)
Gedeihen (Paladin)
Delerium Change


Auch die Fertigkeit "Ansturm" würde die Bewegungsgeschwindigkeit erhöhen, allerdings nicht über einen Bonus zum SFRW. Statdessen benutzt diese Fertigkeit eine seperate Formel, weshalb ich dessen Mechanismus erst später erklären werde.


~~~~~​
Kälteschaden

Um die Bewegungsgeschwindigkeit eines Gegners zu senken, gibt es mehrere Möglichkeiten. Die einfachste davon stellt der Kälteschaden dar, welcher durch eine Kältefertigkeit oder eine physische Attacke (Schlag oder Schuss) übertragen werden muss. Für die Dauer der Kälte erhalten Spieler einen Malus von 50, während der Malus der Monster von der jeweiligen Monsterart und dem Schwierigkeitsgrad abhängig ist (siehe zum Beispiel hier). Die folgenden Monster haben jedoch einen Malus von 0, sodass deren Geschwindigkeit nicht durch Kälte beeinflussbar ist:

ab Normal
    Mumiensarkophage
    Frost-Geißel
    Todes-Fürst
    Talic
    Korlic


ab Alptraum
    Gargoyle-Fallen
    Frost-Kriecher
    Frost-Schrecken


nur in Hölle
    Gespenster
    Irrlichter
    Untote Fetische
    Andariel
    Überandariel


Die Gruppe der Frostgrauen würde in Hölle durch die Kältewirkung sogar beschleunigt werden, da deren Malus negativ ist. Allerdings weisen diese eine sehr hohe Kälteresistenz auf (150% bis 170%) und können daher durch Kälte keinen Schaden nehmen.

Die Dauer der Kälte wird dabei von der Quelle des Kälteschadens (Gegenstände oder Fertigkeiten) bestimmt; jeder Quelle ist eine bestimmte Dauer zugewiesen (selten ist einem Gegenstad auch eine variable Dauer zugeteilt). Wenn wir den Kälteschaden über mehrere Quellen beziehen, so werden diese Dauern addiert. Diese Gesammtdauer wird anschließend durch die Kälteresistenz des Opfers verändert und in Alptraum global halbiert, bzw in Hölle global geviertelt. Über spezielle Gegenstände kann die Kältedauer auch nochmals halbiert (nur einmalig möglich) oder komplett auf Null gesenkt werden.


Gegnerverlangsamung

Weiters gibt es auf bestimmten Gegenständen die Eigenschaft der Gegnerverlangsamung. Diese muss ebenfalls durch eine physische Attacke ausgelöst werden, beeinflusst im Gegensatz zum Kälteschaden allerdings auch Gegner mit Kälteimmunität und jene, die nicht durch Kälte verlangsamt werden können. Die Dauer dieses Effektes liegt bei konstanten 30 Sekunden und kann nicht verändert werden. Eine erneute Auslösung vor Ablauf dieser 30 Sekunden setzt die Wirkzeit allerdings wieder neu.
Auch der Tongolem des Nekromanten überträgt diese Gegnerverlangsamung im Nahkampf, sobald er einen Gegner trifft oder von diesem getroffen wird. Die Wirkungsstärke ist dabei vom Fertigkeitslevel des Golems abhängig. Da immer bloß ein Effekt der Gegnerverlangsamung aktiv sein kann, wirkt auch der Tongolem nicht mit der Gegnerverlangsamung anderer Spieleinheiten zusammen.


Fertigkeitsmali

Die Bewegungsgeschwindigkeit kann auch über negatives SFRW mancher Fertigkeiten gesenkt werden. Die beiden Fertigkeiten, welche solche Mali bewirken und dem Spieler zur Verfügung stehen, sind folgende:

Altern (Nekromant)
Heiliger Frost (Paladin)


Altern gibt dabei einen Malus von konstanten 50, während der Malus durch Heiliger Frost wieder vom Fertigkeitslevel abhängt. Die Aura verursacht zwar Kälteschaden, doch diesem ist keine Kältedauer zugewiesen. Daher werden die Gegner von Heiliger Frost nicht durch die Kälte verlangsamt, sondern nur durch einen Malus auf ihr SFRW, welcher zusammen mit dem Kälteschaden alle zwei Sekunden ausgelöst wird. Die Aura wirkt daher auch auf kälteimmune Gegner, allerdings nicht auf die Aktbosse sowie deren stärkere Versionen. Der Vorteil dieser Wirkung ist natürlich, dass man durch Kälteschaden an eine zweite Verlangsamung kommen kann und die Monster dadurch eventuell noch langsamer werden.


Gegner erstarren lassen

Ein Effekt der zwar nicht ganz zum Thema passt, aber dennoch erwähnt werden sollte, ist das Erstarren eines Gegners. Eine erstarrte Spieleinheit erhält eine blaue Färbung und ist für die Dauer der Erstarrung vollkommen bewegungs- und handlungsunfähig, weshalb der Effekt allerdings bei Spielern und allen speziellen Monstern nicht funktioniert. Die Fertigkeiten, welche Feinde erstarren lassen können, sind folgende:

Eispanzer (Zauberin)
Eisstoß (Zauberin)
Gletschernadel (Zauberin)
Eispfeil (Amazone)
Frostpfeil (Amazone)
Eisklingen 3 (Assassine)
Phönixschlag 3 (Assassine)


Dabei erstarren die Gegner bei jeder erfolgreichen Attacke und die Grunddauer der Erstarrung (wird anschließend noch modifiziert, siehe unten) wird allein von der entsprechenden Fertigkeit bestimmt. Eine Ausnahme davon bilden allerdings der Eispfeil und der Frostpfeil (inklusive Umgebungsschaden), da deren Erstarrungsdauer durch die Kältedauer der Ausrüstung erhöht werden kann.

Daneben gibt es noch einige Gegenstände mit einem Erstarrungsbonus. Wenn man einen solchen auf der Ausrüstung hat, so besteht bei erfolgter physischer Attacke (funktioniert auch nicht durch Umgebungsschaden des Frostpfeiles) die Chance, den Gegner erstarren zu lassen. Die Erstarrungsboni der Gegenstände sind dabei nicht gleichwertig, sondern es gibt Abstufungen, welche sich auch auf die Erstarrungschance auswirken:

Chance_Nahkampf = 30% + 20%*Erstarrungsbonus + 5%*(Angreiferlevel - Verteidigerlevel)
Chance_Fernkampf = (20%*Erstarrungsbonus + 5%*(Angreiferlevel - Verteidigerlevel))/3


Die Zeit der Erstarrung ist dabei teilweise zufallsbedingt, berechnet sich allerdings auch aus der Erstarrungschance:

Erstarrungsdauer = 25 + 2*(Chance - Zufallszahl)

Die maximale Dauer bei 100% Chance auf Erstarrung beträgt damit 9 Sekunden und das globale Minimum liegt bei 1 Sekunde. Je geringer die Chance, desto weiter sinkt das erreichbare Maximum.

Die Erstarrungsdauer (von Fertigkeiten wie von Gegenständen) wird allerdings wie die Kältedauer durch die Kälteresistenz des Gegners beeinflusst und in Alptraum ebenso halbiert, bzw in Hölle geviertelt. Sollte das betreffende Monster nicht durch Kälteschaden zu verlangsamen sein (siehe Auflistung weiter oben), so kann es auch nicht erstarren.


Zusammenwirken und Begrenzungen

Die oben genannten Verlangsamungeffekte (Kälte, Fertigkeitsmali und Tongolem/Gegenstandsmali) wirken stets zusammen, ihre Werte werden zu einem Gesammtmalus addiert. Dieser Malus wird je nach betroffenem Gegner bei einem bestimmten Wert begrenzt:

Spieler, Söldner, Bosse: 50%
normale Monster: 90%


Unabhängig davon, gibt es noch eine weitere Grenze, denn eine Spieleinheit kann nicht langsamer als 25% seiner Gehgeschwindigkeit werden. Dies hat nichts mit den obigen Grenzen zu tun, denn der begrenzte Gesammtmalus kann durch Boni und den RunBonus beim Laufen ausgeglichen werden.


Animationsgeschwindigkeiten

Gegenstandsboni

Die Animationen, mit welchen sich diese FAQ befasst, sind jene für Angriffe, Zauber, Block und Treffererholung. Jede dieser vier Animationen hat zur Beschleunigung eine auf Gegenständen vorkommende Eigenschaft:

schnellere Angriffsgeschwindigkeit - IAS (Increased Attack Speed)
schnellere Zauberrate - FCR (Faster Cast Rate)
schnellere Blockgeschwindigkeit - FBR (Faster Block Rate)
schnellere Erholungsrate - FHR (Faster Health Rate)

Wie schon zuvor bei der Bewegungsgeschwindigkeit, durchlaufen die Werte dieser Eigenschaft nun die "dimishing returns" Formel (EWert = [120*Wert/(120 + Wert)]) und bilden so den jeweiligen Effektivwert. Aufgrund der Beschränkung auf ganzzahlige Werte, gibt es für diese Eigenschaften gewisse Breakpoints, doch mit diesen wird sich diese FAQ später noch eingehend beschäftigen.


Fertigkeitsboni

Bei den Animationsgeschwindigkeiten, beschränken sich die Fertigkeitsboni zum Großteil auf die Angriffsanimationen. Während die Zauberrate und die Erholungsrate nicht über Fertigkeiten gesteigert werden können, gibt es auch zur Erhöhung der Blockrate bloß eine Fertigkeit:

Heiliger Schild (Paladin)

Der Heilige Schild liefert dabei einen Bonus von 50 und verringert damit die Dauer der Blockanimation erheblich.
Zur Steigerung der Angriffsgeschwindigkeit, gibt es allerdings mehrere Fertigkeiten:

Fanatismus (Paladin)
Raserei (Barbar)
Werwolf (Druide)
Tempoblitz (Assassine)
Delerium Change


Die Boni dieser Fertigkeiten sind global, sprich sie wirken auf alle Angriffe. Daneben gäbe es noch ein paar lokale Boni/Mali, welche nur für einzelne Fertigkeiten wirken.


~~~~~​
Animationsmali

Auch die Animationsmali sind stark auf die Angriffsanimation fixiert, denn weder Zauber, noch Block oder Treffererholung können durch Kälte, Gegnerverlangsamung oder Fertigkeitsmali behindert werden.
Sämtliche Verlangsamungseffekte wirken allerdings auch auf die Angriffsanimation. An Fertigkeiten mit einem solchem Malus sind hierbei erneut die Folgenden zu nennen:

Altern (Nekromant)
Heiliger Frost (Paladin)


Zu den Angriffsanimationen zählen in gewisser Hinsicht auch die Ausweichfertigkeiten der Amazone, weshalb diese ebenfalls durch sämtliche Verlangsamungseffekte beeinflussbar sind. Sie profitieren allerdings wie die Angriffe auch von Fertigkeitsboni zur Angriffsgeschwindigkeit.

Auch bei den Animationen werden alle Mali aufsummiert und gegen sämtliche Boni verrechnet. Dieser Endwert wird dann nach oben und unten begrenzt, sodass einerseits eine Geschwindigkeit von 15% der Normalgeschwindigkeit nicht unterschritten werden kann und andererseits die Geschwindigkeit auch nicht beliebig gesteigert werden kann.
 
Fortbewegung

Allgemeines

Bei der Fortbewegung einer Spieleinheit unterscheidet man zwischen den Modi "Gehen" und "Rennen", welche beim Charakter durch Tastendruck (Standart ist Taste "R") umgeschalten werden können.
Die Grundvorraussetzung zum Rennen ist ausreichende Ausdauer, welche während dem Laufen kontinuierlich verbraucht wird. Außerdem durchläuft ein gegnerischer Schlag, welcher uns während des Rennens trifft, nicht die Trefferabfrage und hat somit eine Trefferchance von 100%. Zusätzlich wird auch unsere Blockchance gedrittelt, sodass deren Maximum nur noch bei 25% liegt. Aufgrund dieser Mali kann es vorteilhaft sein, zeitweise zu gehen, weil das Gehen zwar langsamer, aber sicherer ist.
Die Fertigkeiten "Ansturm" und "Wirbelwind" beinhalten ebenfalls eine Bewegung. Beide werden allerdings ausschließlich im Gehen-Modus ausgeführt, sodass die oben genannten Mali entfallen. Wirbelwind bietet keinen Geschwindigkeitsbonus und wird somit mit der normalen Geh-Geschwindigkeit ausgeführt. Ansturm dagegen verwendet eine eigene Formel zur Geschwindigkeitsberechnung, sodass die Bewegung stark beschleunigt wird.

Die Grundwerte der Geschwindigkeitsberechnung sind bei Charakteren "WalkVelocity" und "RunVelocity" aus der CharStats.txt bzw für sonstige Spieleinheiten "Velocity" und "Run" aus der MonStats.txt. Diese Grundwerte sind für alle Charaktere ident und liegen bei 6 (WalkVelocity) und 9 (RunVelocity) Subtiles pro Sekunde. Die Geschwindigkeit berechnet sich nun über diese Grundwerte und eine Reihe von Boni und Mali, welche wir zur Beschleunigung (auf Englisch "acceleration") zusammenfassen:

Acceleration = Baserate + SFRW + EFRW - ArmorSpeed (+ ColdEffekt + RunBonus)

Baserate ...Ohne einen Bonus zum Ausgleich, hätte ein Malus keinen Effekt, weil die Beschleunigung nicht negativ sein kann. Daher verfügt die Beschleunigung über einen Grundwert, welcher den Wert 100 aufweist.
SFRW ... Diverse Fertigkeiten können sich positiv oder negativ auf unsere Geschwindigkeit auswirken und die Summe all dieser Boni und Mali bildet das SFRW. Außerdem wird auch die Gegnerverlangsamung diverser Gegenstände hier verrechnet, welche auch vom Tongolem genutzt wird.
EFRW ... Auch verschiedenste Gegenstände liefern uns einen Bonus zur Bewegungsgeschwindigkeit in Form von FRW, welches intern über die "dimishing returns" Formel in EFRW umgewandelt wird:

EFRW = [150*FRW/(150 + FRW)]

Wie unschwer ersichtlich ist, bringt eine Steigerung des FRW mit steigendem EFRW einen immer kleineren Zusatznutzen. Das EFRW nähert sich asymptotisch dem Maximalwert 150, welcher mit endlichen Werten nicht mehr erreicht werden kann. Ähnlich der Animationsgeschwindigkeit gibt es auch hier bestimmte Breakpoints, ab denen eine Steigerung des FRW einen zusätzlichen Nutzen bietet. Allerdings liegen diese aufgrund der Konstanten 150 in der verwendeten Formel so nah beieinander, dass eine Auflistung unsinnig ist.
ArmorSpeed ... Manche Rüstungen und Schilde verleihen dem Träger einen Malus von 5% (mittelschwere Rüstungsteile) bzw 10% (schwere Rüstungsteile) auf die Bewegungsgeschwindigkeit. Dieser Wert ist in der Armors.txt in der Spalte "Speed" festgehalten, woraus auch diese Bezeichnung resultiert.
ColdEffekt ... Kälteschaden verfügt zumeist über eine gewisse Dauer, in welcher die Bewegungsgeschwindigkeit des Opfers beeinflusst wird. Der Wert dieser Beeinflussung ist dabei von der betroffenen Spieleinheit abhängig. Charaktere verwenden einen konstanten Wert von -50 und für andere Spieleinheiten ist der vom Schwierigkeitsgrad abhängige Wert in der MonStats.txt nachzulesen (siehe zum Beispiel hier). Bei einem Wert von "0", erfolgt keine Beeinflussung durch Kälte und in seltenen Fällen findet man auch positive Werte, welche die betroffenen Monster durch Kälte beschleunigen können.
RunBonus ... Es wäre recht sinnfrei, wenn beide Bewegungsmodi über die selbe Geschwindigkeit verfügten und daher gibt es beim Rennen noch einen Bonus, der wieder durch die Grundwerte errechnet wird:

RunBonus = 100*RunVelocity/WalkVelocity - 100

Für unverwandelte Charaktere würde dieser Runbonus also bei 50 liegen und ist damit immerhin halb so groß wie die Baserate. Viele Monster - darunter auch die Wandelformen "Vampir" und "Untoter Rattenmann" haben jedoch für beide Grundwerte den gleichen Wert eingetragen und profitieren damit nicht vom RunBonus.

Diese Beschleunigung hat keinen Maximalwert, sodass jeder zusätzliche Bonus eine Änderung bewirkt. Allerdings hat sie ein Minimum bei 25, sodass keine Spieleinheit (es sei denn sie ist eingefroren) langsamer als 25% ihrer ursprünglichen Geschwindigkeit werden kann.
Die Geschwindigkeit (auf Englisch "velocity") errechnet sich nun einfach aus dieser Acceleration und einem der Grundwerte:

Velocity = WalkVelocity*Acceleration/100

Ohne jegliche Boni und Mali beträgt unsere Geschwindigkeit beim Gehen somit 6 Subtiles pro Sekunde. Ein Subtile entspricht dabei 2/3 Yards und damit auch 2/3 Metern. Unsere Grundgeschwindigkeit beträgt damit 6*2/3 = 4 Meter pro Sekunde. Beim Laufen wird unsere Acceleration über den RunBonus von 50 erhöht, sodass die Laufgeschwindigkeit bei 9 Subtiles pro Sekunde oder umgerechnet bei 6 Metern pro Sekunde liegt. Beim Laufen sind wir somit immer um 2 Meter/Sekunde schneller als beim Gehen.

Es ist klar, dass nach jedem Rechenschritt gerundet wird, da nur ganze Zahlen abgespeichert werden können. Daher könnte man sich fragen, warum meine vorhergehenden Formeln allesammt keine eckigen oder geschwungenen Klammern enthalten, welche ich als Kurzschreibweise zum Runden verwende. Der Grund dafür ist einfach eine fehlende Relevanz. Die Berechnung verwendet ein Hitshift (interner Faktor zur Verringerung der Rundungsfehler, kürzt sich letzten Endes heraus) von 256, wodurch Rundungsfehler minimiert werden. Die Differenz zwischen unseren nicht gerundeten und den tatsächlichen Werten ist so klein, dass eine Berücksichtigung der Rundungen keinen Sinn macht. Wir wären onehin nicht in der Lage zwei Bewegungsgeschwindigkeiten von 8,0 und 8,05 m/s voneinander zu unterscheiden, sodass wir auf Rundungen verzichten um die Formeln kompakter anschreiben zu können.


Ansturm

Die Fertigkeit "Ansturm" verwendet eine Animationssequenz, deren erste Frames die RN-Animation verwenden. Daher laufen wir zuerst auf unseren Gegner zu, bevor wir ihn angreifen. Die Geschwindigkeit muss in diesem Fall klarerweise höher sein (um den Angriff auch wirklich nutzbar zu machen) und wird daher ein wenig anders berechnet:

Acceleration = Baserate + SFRW - ArmorSpeed (+ ColdEffekt)
Velocity = (100 + ChargeBonus)/100*(RunVelocity*Acceleration/100)


ChargeBonus ... Diesen Bonus finden wir in der Skills.txt und er liegt bei konstanten 150%.

Bei Ansturm entfällt der RunBonus, weil diese Bewegung immer im Modus "Gehen" ausgeführt wird. Damit entfallen auch die Mali auf Verteidigung und Blockchance. Eine weitere Besonderheit von Ansturm ist, dass EFRW nicht in der Berechnung mitwirkt. Die Geschwindigkeit beim Anstürmen kann somit nicht durch FRW der Ausrüstung erhöht werden.


Verwandlung

Bisher sind wir stets von unverwandelten Charakteren ausgegangen und haben mit einer WalkVelocity von 6 sowie einer RunVelocity von 9 gerechnet. Sobald wir unser Erscheinungsbild allerdings ändern, übernehmen wir die Werte der entsprechenden Wandelform. Im ungemoddeten Spiel unterscheiden wir vier Verwandlungen, deren Grundwerte folgendermaßen lauten:

Untoter Rattenmann: WalkVelocity = 6, RunVelocity = 6
Vampir: WalkVelocity = 9, RunVelocity = 9
Werbär: WalkVelocity = 6, RunVelocity = 6
Werwolf: WalkVelocity = 6, RunVelocity = 6

Wie für einen Großteil der Monster üblich, haben der Untote Rattenmann und der Vampir zwei identische Grundwerte. Da der RunBonus von der Differenz der beiden Grundwerte abhängig ist, sind die beiden Modi "Gehen" und "Rennen" im verwandelten Zustand gleich schnell und es empfielt sich, dauerhaft im Modus "Gehen" zu bleiben, um die Mali beim Rennen zu umgehen.
Verglichen mit dem unverwandelten Charakter ist der Untote Rattenmann langsamer. Da für diesen gewissermaßen der RunBonus wegfällt, erreicht er nur die Gehgeschwindigkeit eines unverwandelten Charakters. Zum Ausgleich inkludiert die Verwandlung jedoch auch 33 SIAS, sodass auch hier eine gute Geschwindigkeit erreicht wird.
Der Vampir tauscht den RunBonus gegen höhere Grundwerte und erreicht durch diese Werte bei einer Acceleration von 0 selbst gehend die Laufgeschwindigkeit eines unverwandelten Charakters. Aufgrund der höheren Grundwerte wirken sich Veränderungen der Acceleration stärker aus. Eine Verlangsamung wirkt daher stärker als bei unverwandelten Charakteren, aber durch eine Beschleunigung wird der Vampir auch schneller als der Charakter im unverwandelten Zustand.

Die fehlenden Verwandlungsformen Werwolf und Werbär wurden im obigen Absatz ausgelassen, da diese einer Sonderregelung unterliegen. Ihre Grundwerte sind zwar ident, doch auch diese beiden Formen haben einen RunBonus größer Null, da für eben diesen die Grundwerte der unverwandelten Charaktere gelten. Die Gehgeschwindigkeit errechnet sich daher aus den Werten der Werform, der RunBonus jedoch aus den Werten der unverwandelten Form. Dies bedeutet, dass sich die Werformen im unveränderten Spiel mit der Geschwindigkeit eines unverwandelten Charakters bewegen, weil die WalkVelocity-Werte beider Formen ident sind und beide Male der selbe RunBonus angewandt wird.


Zusammenfassung

Gehen/Rennen:

Velocity = ActuallVelocity + WalkVelocity*(SFRW + EFRW - ArmorSpeed (+ ColdEffekt))/100
EFRW = [150*FRW/(150 + FRW)]


Werwolf/Werbär

Velocity = WalkVelocity_Werform*(SFRW + EFRW - ArmorSpeed + 100*ActuallVelocity/WalkVelocity (+ ColdEffekt))/100
EFRW = [150*FRW/(150 + FRW)]


Ansturm:

Velocity = 2,5*RunVelocity*(100 + SFRW - ArmorSpeed (+ ColdEffekt))/100
EFRW = [150*FRW/(150 + FRW)]


Velocity ... Die Endgeschwindigkeit in Subtiles bzw Metern pro Sekunde
WalkVelocity ... Ein Grundwert aus der CharStats.txt bzw der MonStats.txt. Charaktere verwenden 6 Subtiles/Sekunde bzw 4 Meter/Sekunde
RunVelocity ... Der zweite Grundwert aus der CharStats.txt bzw der MonStats.txt. Charaktere verwenden hier 9 Subtiles/Sekunde bzw 6 Meter/Sekunde.
ActuallVelocity ... Die Velocity des aktuellen Modus, sprich "Walkvelocity" beim Gehen und "RunVelocity" beim Laufen.
ArmorSpeed ... Malus von mittelschweren (5%) oder schweren (10%) Rüstungsteilen, auszulesen aus der Armor.txt
SFRW ... Summe aller Boni und Mali von Fertigkeiten, inklusive den Mali, über welche Ausrüstungsgegenstände verfügen können.
 
Animationen

Grundlagen

Interner Ablauf und formale Berechnung

Die Animationen sind für unser Spiel unumgänglich, denn diese laufen permanent ab, egal ob wir gerade angreifen, laufen, stehen oder schon gestorben sind. Das Bild, welches wir von unserem Charakter erhalten, ist bloß die Darstellung verschiedenster aneinander gereihter Animationen. Falls das Spiel aufhörte unsere Animationen anzuzeigen, würde unser Charakter vom Bildschirm verschwinden.
Zu Beginn dieses doch recht umfangreichen Themas möchte ich erklären, wie eine Animation programmintern überhaupt abläuft:

Das Programm ermittelt die Art der nächsten Animation und holt (bzw berechnet) sich alle für die Berechnungen benötigten Werte aus diversen Spieldateien. Anschließend werden der Counter-Endwert und der Counter-Anstiegswert nach folgenden Formeln berechnet:

Counter-Endwert = Hitshift*FramesPerDirection
Counter-Anstiegswert = [AnimationSpeed*Acceleration/100]


Hitshift ... Das Ergebniss eines jeden Rechenschrittes wird als Integer-Wert (ganzzahliger Wert) abgespeichert, weshalb alle Nachkomastellen entfallen (entspricht für positive Werte einem Abrunden). Wir verwenden hier also Divisionen mit ganzen Zahlenwerten und damit werden die möglichen Abstufungen unseres Ergebnisses zu groß (zB 20, 10, 6, ... für die Divisionen 20/1, 20/2, 20/3, ...). Aus diesem Grund verwenden wir diesen Faktor in Dividend und Divisor, welcher für die Berechnung der Animationslängen einen Wert von 256 aufweist. Dadurch werden uns feinere Abstufungen ermöglicht (zB 20, 19, 18, ... für die Divisionen 5120/256, 5120/269, 5120/284, ...). Wie bereits erwähnt, muss das Hitshift auf beiden Seiten des Bruches auftreten, damit es sich anschließend wieder hinauskürzt. Im Divisor (Counter-Anstiegswert) ist das Hitshift auf den ersten Blick nicht erkennbar, weil es bereits in der AnimationSpeed inkludiert ist. Auch hier ist somit eine Feinabstimmung möglich, es gibt nun 255 mögliche Abstufungen mehr als zuvor.
FramesPerDirection ... Dies ist die Anzahl an Frames, aus der eine bestimmte Animation besteht. Der Wert wird somit klarerweise über die verwendete Animation bestimmt, sodass der Spieler keinen Einfluss darauf hat. Je mehr Frames eine bestimmte Animation besitzt, desto mehr Frames müssen abgespielt werden und desto länger dauert die Animation.
AnimationSpeed ... Dies ist der Grundwert der Geschwindigkeit, mit der eine Animation abgespielt wird. Der Standartwert liegt bei einem Frame pro Tick, wobei auch andere Werte möglich sind. Zwischen den Werten "1" und "2" der AnimationSpeed, gibt es eine Änderung von 100% und die Anschreibung als Integer-Wert lässt keine Zwischenstufen zu. Daher ist hier das Hitshift inkludiert, sodass wir zwischen den Werten 1 (=256) und 2 (=512) 256 Abstufungen erhalten und die Animationsdauern besser steuerbar sind.
Acceleration ... Dies ist ein Prozentwert und steuert die (positive wie negative) Beschleunigung der Animation. Dieser Wert ist für den Anwender einer bestimmten Animation die einzige Möglichkeit die Animationsdauer zu beeinflussen, alle anderen Werte sind vorgegeben. Je nach Art der verwendeten Animation fließen hier verschiedenste Werte in diese Berechnung ein. Die Grenzen dieses Wertes liegen bei 15 und 175. Um die Erklärung einfach und allgemein zu halten, werde ich vorerst bei diesem Begriff bleiben und die Zusammensetzung in den jeweiligen Teilbereichen erläutern.

Da das Spiel ausschließlich Integer-Werte speichern kann, wird der Counter-Anstiegswert abgerundet. Dabei ist jedoch zu erwähnen, dass die Multiplikation vor der Division stattfindet, sodass auch nur der endgültige Wert gerundet werden muss und der Rundungsfehler geringer wird.
Um genau zu sein, werden diese Berechnungen nicht nur einmal durchlaufen, sondern in jedem Tick wieder. Es gilt daher nicht ausschließlich der Counter-Anstiegswert zum Start der Animation, sondern immer der momentane Wert. Dies ist für uns jedoch vollkommen nebensächlich, sodass wir einfach von einem gleichbleibendem Wert ausgehen. Da die Berechnungen nun abgeschlossen sind, kommen wir zum nächsten Teil des Animationsablaufes.

Jede Animation besteht aus einer bestimmten Anzahl an Frames und die Summe all dieser bildet den FramesPerDirection-Wert. Welches Frame zu welchem Tick abgespielt wird, entscheidet nun die aktuelle Stellung des Counters. Die Anzahl der möglichen Counterstellungen entspricht natürlich dem Counter-Endwert und so teilen wir diese Zahl durch die Anzahl der Frames unserer Animation. Dies werde ich anhand eines Beispiels verdeutlichen und nehme dafür FramesPerDirection mit 5, AnimationSpeed mit 256 und Acceleration mit 100 an:

Counter-Endwert = Hitshift*FramesPerDirection = 256*5 = 1280
Counter-Anstiegswert = [AnimationSpeed*Acceleration/100] = 256*100/100 = 256

Wir haben somit 1280 verschiedene Counterstellungen (von 0 bis 1279) und teilen diese auf 5 Frames auf. Somit hat jedes Frame genau 1280/5 = 256 Counterstellungen. Diese Zahl entspricht natürlich immer dem Hitshift, denn dessen Aufgabe war es schließlich die Anzahl der möglichen Counter-Stellungen pro Frame zu erhöhen. Dies sortieren wir nun anhand der Stellung des Counters:

Counter = 0000-0255 => Bild 00 wird dargestellt
Counter = 0256-0511 => Bild 01 wird dargestellt
Counter = 0512-0767 => Bild 02 wird dargestellt
Counter = 0768-1023 => Bild 03 wird dargestellt
Counter = 1024-1279 => Bild 04 wird dargestellt


Diese Tabelle könnten wir uns eigentlich auch ersparen, denn das darzustellende Frame lässt sich auch einfacher ermitteln. Wir müssen bloß unseren aktuellen Counter-Wert durch unser Hitshift dividieren und schneiden vom Ergebniss die Nachkomastellen ab. Damit erhalten wir ebenfalls für jeden Counter-Wert das abzuspielende Frame (zb [500/256] = [1,95] = 1 => Frame 01 wird dargestellt).

Da wir bei 0 beginnen, ist die Counterstellung 1280 kein Teil dieser Animation mehr. Sobald der Counter den Wert 1279 überschreitet, endet die aktuelle Animation und die nächste startet noch im selben Tick. Daher dürfen wir das Tick, bei welchem der Counter-Endwert erreicht bzw überschritten wird, nicht mehr zu unserer ersten Animation zählen.

Jetzt starten wir unsere Animation, welche Tick für Tick abläuft. Am Anfang eines jeden Ticks wird der Counter um den errechneten Counter-Anstiegswert erhöht und anschließend abgefragt, ob der Counter-Endwert schon erreicht oder überschritten wurde (selbiges gilt auch für das FrameDataActionFlag, bei dem die Aktion wirklich durchgeführt wird). Ist dies nicht der Fall, wird ein Bild der Animation dargestellt. Sollte der Counter-Endwert jedoch schon erreicht/überschritten sein, endet die Animation. Die neue Animation (es läuft natürlich immer eine Animation nach der anderen ab) beginnt nun in eben jenem Tick.

Die Animationen lassen sich in zwei Gruppen unterteilen. Einerseits können sie eine Art "Strafe" sein, weil sie eigentlich nichts bewirken aber Zeit beanspruchen. Dies ist zum Beispiel beim Blocken der Fall. Indem wir blocken, lösen wir die Blockanimation aus, doch diese bringt uns keinen Nutzen mehr, sondern hindert uns bloß daran weitere Aktionen in dieser Zeit auszuführen. Diese Animationen werden also durch eine Aktion ausgelöst, bewirken selbst allerdings keine.
Andererseits gibt es auch Animationen, die eine Aktion bewirken. Ein Beispiel dafür wäre die Angriffsanimation, denn irgendwann zwischen Animationsstart und Animationsende (zum so genannten "Aktionstick") wird der tatsächliche Angriff ausgeführt, bzw ein Geschoss zum Angriff generiert. Genaueres darüber folgt später noch im entsprechenden Unterkapitel.


Soweit zur Theorie, nun ein kurzes Beispiel zum leichteren Verständniss des Ablaufes:

FramesPerDirection = 3
AnimationSpeed = 256
Acceleration = 60

Counter-Endwert = Hitshift*FramesPerDirection = 256*3 = 768
Counter-Anstiegswert = AnimationSpeed*Acceleration/100 = 256*60/100 = 153

Counter = 000-255 => Bild 00 wird dargestellt
Counter = 256-511 => Bild 01 wird dargestellt
Counter = 512-767 => Bild 02 wird dargestellt


Tick 1:
Counter ist 0
Counter wird erhöht auf 153
Ist der Counter >= 768? Nein => kein Abbruch
[153/256] = 0 => Bild 00 abspielen

Tick 2:
Counter ist 153
Counter wird erhöht auf 306
Ist der Counter >= 768? Nein => kein Abbruch
[306/256] = 1 => Bild 01 abspielen

Tick 3:
Counter ist 306
Counter wird erhöht auf 459
Ist der Counter >= 768? Nein => kein Abbruch
[459/256] = 1 => Bild 01 abspielen

Tick 4:
Counter ist 459
Counter wird erhöht auf 612
Ist der Counter >= 768? Nein => kein Abbruch
[612/256] = 2 => Bild 02 abspielen

Tick 5:
Counter ist 612
Counter wird erhöht auf 765
Ist der Counter >= 768? Nein => kein Abbruch
[765/256] = 2 => Bild 02 abspielen

Tick 6:
Counter ist 765
Counter wird erhöht auf 918
Ist der Counter >= 768? Ja => Animation abbrechen, augenblicklicher Start der nächsten Animation
Dieses Tick zählt somit nicht mehr zu unserer Animation

Da das letzte Tick nicht mehr zur aktuellen Animation zählt, umfasst unsere Animation eine Dauer von 5 Ticks.
Diese Werte gelten für die Blockanimation eines Paladins ohne Heiligem Schild, der über 11 FBR verfügt. Ein Blick in diverse Tabellen bestätigt unser Ergebniss: eine Dauer von 5 Ticks. Außerdem fällt uns noch etwas auf, wenn wir Tick 5 betrachten. Die Differenz zwischen dem aktuellen Counterwert und dem Counter-Endwert beträgt nur "3", sodass auch schon die kleinstmögliche Erhöhung des Counter-Anstiegswertes die Animation weiter verkürzen würde. Wir stehen damit direkt vor einem Breakpoint, welche ich weiter unten noch behandeln werde.

Natürlich ist dieser interne Ablauf für uns nicht alzu relevant, denn die Ermittlung der Animationsdauer beansprucht mit dieser Methode zu viel Zeit. Daher wandeln wir den obigen Ablauf nun in eine Formel um.


Herleitung der Formel

Wie weiter oben schön ersichtlich ist, gibt uns die Dauer in Ticks an, wie oft wir den Counter um den Counter-Anstiegswert erhöhen mussten um den Counter-Endwert zu erreichen bzw zu überschreiten. Damit enspricht das Grundgerüst unserer Formel natürlich einer Division, weil wir zur Ermittlung der Dauer den Counter-Endwert durch den Counter-Anstiegswert dividieren müssen.

FPA = Counter-Endwert/Counter-Anstiegswert

Nun müssen wir beim Ergebniss dieser Division zwischen zwei Möglichkeiten unterschieden. Ist das Ergebniss eine ganze Zahl, so waren Counter-Endwert und Counter-Anstiegswert im letzten Tick ident. Damit zählt das letzte Tick nicht mehr, weil die Animation in diesem Tick abgebrochen wird. Somit müssen wir am Ende der Formel noch ein Tick abziehen.
Ist die Division allerdings nicht ganzzahlig (zB 3,5), so müssen wir den Wert aufrunden, denn nach drei Ticks ist der Counter-Endwert noch nicht erreicht, 3,5 Ticks sind nicht möglich und erst nach dem viertem Tick haben wir den Counter-Endwert überschritten. Auch in diesem Fall zählt das letzte Tick nicht mehr zur aktuellen Animation und wird damit ebenfalls am Ende abgezogen.
Im ersten Fall haben wir bereits eine ganze Zahl, sodass das Aufrunden nichts verändert und wir beide Fälle in einer Formel zusammenfassen können. Dabei setze ich diesmal gleich die Zusammensetzungen für Counter-Endwert und Counter-Anstiegswert ein:

FPA = {(Hitshift*FramesPerDirection)/[AnimationSpeed*Acceleration/100]} - 1

Oftmals bekommt man zu hören, dass das erste Frame einer Animation ident mit dem Letztem sei und deshalb nicht angezeigt werde, woraus das "-1" in der Formel resultiere. Dies stimmt allerdings nicht. Die beiden Frames sind unterschiedlich; wie ich oben veranschaulicht habe werden sie beide angezeigt und den Grund für die "-1" am Formelende habe ich ebenfalls erklärt.


Zum Vergleich der Formel mit dem internem Ablauf rechnen wir das vorherige Beispiel nochmal:

FramesPerDirection = 3
AnimationSpeed = 256
Acceleration = 60

FPA = {(Hitshift*FramesPerDirection)/[AnimationSpeed*Acceleration/100]} - 1
FPA = {(256*3)/[256*60/100]} - 1
FPA = {(768)/[153,6]} - 1
FPA = {(768)/153} - 1
FPA = {5,02} - 1
FPA = 6 - 1
FPA = 5


Auch hier sehen wir wieder, dass wir kurz vor dem nächstem Breakpoint stehen und die Dauer von 5 Ticks deckt sich mit der vorherigen schrittweisen Berechnung, sodass unsere Formel richtig hergeleitet wurde.

Nun müssen wir nur noch die Zusammensetzung des Acceleration-Wertes wissen. Diese hängt allerdings von der verwendeten Animation ab, setzt sich jedoch immer zumindest aus einem Grundwert (ohne Grundwert hätte ein Malus keinen Effekt, sofern kein Bonus vorhanden ist oder dieser bereits negiert wurde) und einem Effektivwert zusammen. Zur Wahrung der Übersichtlichkeit werde ich diesen Teil der Formel in den jeweiligen Teilbereichen behandeln und nun mit der Ermittelung der Breakpoints fortfahren.


Breakpoints

Nun können wir uns für bestimmte Werte unsere Animationsgeschwindigkeit berechnen. Unser Interresse beruht allerdings hauptsächlich auf den Breakpoints, mit der reinen Berechnung mit vordefinierten Werten können wir nur wenig anfangen. Leider können wir hierfür allerdings keine Formel verwenden, da die explizite Anschreibung des Effektivwertes an dem Runden der Werte scheitert. Somit berechnen wir uns (zb in Excel) für jeden möglichen Acceleration-Wert die Animationsdauer und notieren uns, bei welchem Wert wir den Sprung auf die nächstkürzere Animation schaffen. Je nach verwendeter Animation kann man sich dann berechnen, welche Eigenschaften man noch erhöhen kann, um den nächsten Breakpoint zu erreichen. Ein Beispiel für eine solche Berechnung:


So oft anklicken, bis das Bild lesbar wird.

Rechts werden unsere Werte eingegeben und durch schrittweise Berechnung sehen wir, bei welchen Werten sich die Animation verkürzt. Man muss bloß darauf achten den Grundwert (Teil der Acceleration) richtig anzugeben und keine Werte zu verwenden, die das Maximum von 175 überschreiten. Den so ermittelten Effektivwert rechnen wir dann erneut auf den ursprünglichen Wert zurück:

Wert = {120*EWert/(120 - EWert)}


Auslösen einer Aktion

Bisher haben wir die Animationen am Beispiel eines Blockvorganges betrachtet. Dieser beinhaltet keine Aktion, sondern stellt gewissermaßen eine "Strafe" für das Abwenden des geblockten Schadens dar. Eine Angriffsanimation dagegen wird gezielt gestartet und dient dem Zweck, den Gegner zu schädigen. Daher muss es innerhalb dieser Animation einen Zeitpunkt geben, an welchem eine Aktion (in diesem Fall das Treffen des Gegners) ausgeführt wird. Dieser Zeitpunkt wird als Aktionstick (üblich ist auch "kritisches Tick" und andere Benennungen) bezeichnet und kann ebenso berechnet werden.

Unter Berücksichtigung des Aktionsticks, können wir eine Animation in drei Abschnitte unterteilen. Von Animationsbeginn bis zum Aktionstick wird zuerst der einleitende Animationsteil abgespielt. Nur in diesem Abschnitt kann die Animation noch durch eine andere Animation unterbrochen werden, sodass die Aktion verhindert wird. Ein Abbruch nach dem eigentlichen Angriff würde bloß den Wegfall eines unnötigen Animationsteiles bedeuten und ist nicht möglich, weil wir davon nur profitieren würden. Daher können die Animationen ab dem Aktionstick nicht mehr abgebrochen werden. Dies gilt auch für Rollback-Angriffe wie "Eifer", weshalb diese nach dem ersten Schlag nicht mehr unterbrochen werden können.
Nach dem einleitenden Animationsteil folgt das Aktionstick, welches unsere Aktion beinhaltet. Hier können wir zwischen zwei Aktionen unterscheiden, nämlich dem Treffen eines Gegners im Nahkampf und dem Erzeugen eines Geschosses für den Fernkampf. Das Aktionstick liegt zumeist recht zentral innerhalb der Animation, sodass der einleitende und der abschließende Animationsteil annähernd gleich lang sind.
Nach dem Aktionstick folgt nur noch der abschließende Animationsteil. Dieser bietet uns keinen Nutzen mehr, sondern verzögert nur den Start der nächsten Animation. Praktisch ist jedoch, dass eine eventuelle Zauberverzögerung schon während diesem abschließenden Abschnitt geringer wird, sodass die Zwangspause nach Abschluss der Animation geringer ist als der Brutto-Wert der Zauberverzögerung.

Zu Beginn haben wir bereits den Begriff des Counter-Endwertes als Multiplikation aller Frames mit den möglichen Counterstellungen derselben eingeführt. Für die Aktion ist nun ein bestimmtes Frame von Interresse, nämlich das FrameDataActionFlag, welches aus der animdata.txt ausgelesen werden kann. Dieses Frame ist in den "FrameDataXXX"-Spalten jener Datei durch eine Ziffer ("1" für das Treffen eines Gegners und "2" für das Erzeugen eines Geschosses) gekennzeichnet. Beim Wert des FrameDataActionFlags ist zu berücksichtigen, dass die Frames bei der Bezeichnung 00 beginnen, sodass beispielsweise das vierte Frame der Animation das Frame mit der Bezeichnung 03 ist.
Wie schon zuvor, multiplizieren wir nun das jeweilige Frame mit den 256 Counterstellungen, um den entsprechenden Counterwert zu erhalten - in diesem Falle den Counter-Aktionswert für die Berechnung einer Aktion:

Counter-Aktionswert = Hitshift*FrameDataActionFlag

Die jeweilige Aktion ist nun nicht an die Darstellung des entsprechenden Frames gebunden, denn bei hohem Counter-Anstiegswert wäre es möglich, das FrameDataActionFlag zu überspringen. Die Auslösung der Animation erfolgt stattdessen sobald der Counter-Aktionswert erstmalig erreicht oder überschritten wird, selbst wenn zu diesem Zeitpunkt nicht das FrameDataActionFlag abgespielt wird. Daher gibt es nach jeder Erhöhung des Counters eine Abfrage, ob der Counter-Aktionswert schon erreicht wurde. Falls dies der Fall ist, wird unsere Aktion in diesem Tick ausgeführt. Auch andere Ereignisse können mit diesem Zeitpunkt zusammenhängen, doch diese werden erst später behandelt.

Nun wird also in jedem Tick der Counter erhöht und unsere Aktion wird beim Erreichen oder Überschreiten des Counter-Aktionswertes durchgeführt. Daraus ergibt sich für unsere Formel erneut die bereits bekannte Division und da es bei der Anzahl der Erhöhungen des Counters wieder nur ganze Zahlen geben kann, müssen wir erneut aufrunden und landen somit bei jenem Frame, bei dem die Aktion durchgeführt wird (entweder das FrameDataActionFlag oder das nachfolgende Frame, falls das FrameDataActionFlag nicht abgespielt wird). Anders als bei der Berechnung der Gesammtdauer wird die Animation nun allerdings nicht abgebrochen, sondern bloß die Aktion durchgeführt. Damit müssen wir das letzte Tick nicht abziehen und erhalten folgende Formel:

AT = {(Hitshift*FrameDataActionFlag)/[AnimationSpeed*Acceleration/100]}


Ablauf der Animation und Anwendung der Formel

Nun wählen wir uns ein paar beliebige Werte aus und gehen den Animationsablauf Schritt für Schritt durch. Im Anschluss werden wir noch überprüfen, ob unsere neue Formel zum gleichen Ergebniss kommt.

FramesPerDirection = 15
FrameDataActionFlag = 07
AnimationSpeed = 256
Acceleration = 175

Counter-Endwert= Hitshift*FramesPerDirection = 256*15 = 3840
Counter-Aktionswert = Hitshift*FrameDataActionFlag = 256*7 = 1792
Counter-Anstiegswert= [AnimationSpeed*Acceleration/100] = [256*175/100] = 448


Tick 1:
Counter ist 0
Counter wird erhöht auf 448
Ist der Counter >= 3840? Nein => kein Abbruch
Ist der Counter >= 1792? Nein => keine Aktion
[448/256] = 1 => Bild 01 abspielen

Tick 2:
Counter ist 448
Counter wird erhöht auf 896
Ist der Counter >= 3840? Nein => kein Abbruch
Ist der Counter >= 1792? Nein => keine Aktion
[896/256] = 3 => Bild 03 abspielen

Tick 3:
Counter ist 896
Counter wird erhöht auf 1344
Ist der Counter >= 3840? Nein => kein Abbruch
Ist der Counter >= 1792? Nein => keine Aktion
[1344/256] = 5 => Bild 05 abspielen

Tick 4:
Counter ist 1344
Counter wird erhöht auf 1792
Ist der Counter >= 3840? Nein => kein Abbruch
Ist der Counter >= 1792? Ja => Aktion wird ausgeführt
[1792/256] = 7 => Bild 07 abspielen

[...]

Tick 9:
Counter ist 3584
Counter wird erhöht auf 4032
Ist der Counter >= 3840? Ja => Animation abbrechen, augenblicklicher Start der nächsten Animation


AT = {(Hitshift*FrameDataActionFlag)/[AnimationSpeed*Acceleration/100]}
AT = {(256*7)/[256*175/100]}
AT = {1792/448}
AT = {4}
AT = 4


Unser Angriff (der normaler Angriff des Paladins mit einhändiger Schwungwaffe) ist also bei maximaler Acceleration bei einer Länge von 8 Ticks. Wie beide Berechnungsmöglichkeiten zeigen, findet unser Angriff im vierten Tick statt.
Im ersten Moment wirkt dies nun nicht sonderlich interressant, ob der Gegner nun ein paar Sekundenbruchteile früher oder später getroffen wird. Allerdings wird dieses System auch für andere Berechnungen benötigt. Ein Beispiel dafür wäre der Angriff Eifer, welcher wie oben zu sehen ist beim Paladin auf bis zu 4 Ticks beschleunigt werden kann.


Animationsarten

Grundsätzlich kann man zwischen zwei Animationsarten unterscheiden. Die gewöhnliche Animation haben wir soeben mitsammt Ablauf und Formel kennengelernt. Diese Animationen können leicht eingesehen werden, weil die grundlegenden Werte softcoded sind. Das bedeutet, dass sie vom Spiel aus bestimmten Dateien ausgelesen werden, welche für den Spieler leicht zugänglich sind und ausreichend Information enthalten. Für jede dieser Animationen gibt es eine Reihe von Frames, wobei der FramesPerDirection-Wert jeweils angibt, wie viele dieser Frames für eine jeweilige Animation wirklich verwendet werden.

Neben den bisher genannte Animationen gibt es auch die Sequenz-Animationen, welche von den bisher bekannten in mehreren Punkten abweichen. Den Sequenzen sind keine eigenen Frames zugewiesen, sondern sie bestehen aus vordefinierten Frames einer oder mehrerer Animationen. Von diesen Sequenzen sind leider nur jene softcoded, die von Monstern verwendet werden. Die Sequenzen der Spieler allerdings sind hardcoded, stecken also irgendwo an unbekannter Stelle in einer dll-Datei. Daher gibt es nur wenige, die diese Sequenzen ebenfalls auslesen können.
Die Formel für Sequenzen ist beinahe mit der bereits bekannten ident. Der einzige Unterschied besteht im Fehlen der "-1" am Formelende:

FPA = {(Hitshift*FramesPerDirection)/[AnimationSpeed*Acceleration/100]}

Sofern es sich bei einer Sequenz um einen Angriff (exklusive Zaubern) handelt, gibt es noch eine weitere Änderung, welche unsere SQ-Animation verlangsamt. Dies werde ich jedoch erst später im entsprechenden Teilbereich behandeln.


Verwandlung

Jede Spieleinheit durchläuft pausenlos eine Animation nach der anderen. Es gibt Animationen für den Angriff, für das Stehen und Laufen, ja sogar für das Sterben. Unsere Leiche ist ebenfalls nichts anderes als eine Animation mit nur einem Frame. Das Bild des Charakters wie wir es sehen, wird uns ausschließlich über unsere verschiedenen Animationen gezeigt. Wir sehen unseren Charakter nur dank unzähliger Frames, welche verschiedensten Animationen entstammen. Würde einen Moment lang keine Animation ablaufen, so wäre unser Charakter verschwunden. Daraus folgt logischerweise, dass die verwendete Animation von unserem aktuellem Erscheinungsbild abhängig ist. Nach einer Verwandlung brauchen wir für unseren Werwolf eigene Animationen, weil die Animation des Druiden eben auch nur einen Druiden abbildet. Daher haben alle Verwandlungsformen eigene Animationen, welche vom ehemaligen Charakter unabhängig sind. Wenn wir uns in einen Werbären verwandeln, spielt es somit keine Rolle ob wir einst ein Druide oder eine Zauberin waren.
Allerdings gibt es auch hier die berühmte Ausnahme der Regelung. Bei einer Verwandlung in einen Werwolf oder Werbären hat Blizzard eine Sonderregelung in Bezug auf die Angriffsgeschwindigkeit hinzugefügt. Dank dieser wird die AnimationSpeed nicht aus einer Spieldatei ausgelesen, sondern eigens berechnet. Diese Berechnung beinhaltet die FramesPerDirection der unverwandelten Spieleinheit, sodass bei diesen beiden Verwandlungen die Angriffsgeschwindigkeit vom unverwandelten Charakter abhängig ist.


Auslesen der gebrauchten Werte

Animdata.txt

Wie bereits angesprochen, werden verschiedenste Werte zu Beginn jeder Animation aus diversen Spieldateien ausgelesen. Dabei handelt es sich unter anderem um die Werte "FramesPerDirection" und "AnimationSpeed". Diese findet man in der animdata.d2, welche man aus der d2data.mpq extrahieren kann. Zum Extrahieren verwendet man das Programm "MPQView", welches im Mod-Starterkit auf der Mainpage enthalten ist. Um die Extrahierte animdata.d2 auslesen und verändern zu können, wandelt man sie mit dem Programm "Animdata_edit" in eine Textdatei um. Besagtes Programm findet man hier im PK in der Kategorie "Animation Editing".

Um sich dies zu ersparen, kann man auch diese Liste verwenden oder sich hier eine fertige und geordnete animdata.txt herunterladen. Außerdem beinhalten die FAQtoids von librarian und ebenso meine FAQ die wesentlichsten Daten der Animationen.

Die Bezeichnungen dieser Animationen setzen sich aus 3 Teilen zusammen und verwenden das Schema CCAAWWW.

CC steht für "class" und gibt an, welche Spieleinheit diese Animation benutzt. Die wesentlichsten Kürzel lauten:

AI ... Assassine
AM ... Amazone
BA ... Barbar
DZ ... Druide
NE ... Nekromant
PA ... Paladin
SO ... Zauberin

40 ... Werwolf
TG ... Werbär
VA ... Vampir
FK ... Untoter Rattenmann

0A ... Barbarensöldner
GU ... Stadtwache
IW ... Eisenwolf
RG ... Rogue

Sollte man noch das Kürzel einer bestimmten Monsterart brauchen, findet man dieses in der MonStats.txt in der Spalte "Code".

AA steht natürlich für "animation" und bezeichnet die Tätigkeit, bei welcher diese Animation verwendet wird. Die Kürzel lassen sich aus der PlrMode.txt auslesen und lauten:

A1 ... Angriff 1
A2 ... Angriff 2
KK ... Kick
TH ... Werfen
S1 ... Skill 1
S2 ... Skill 2
S3 ... Skill 3
S4 ... Skill 4
SC ... Zaubern
BL ... Blocken
GH ... Treffererholung
TN ... Neutral (in der Stadt stehen)
NU ... Neutral (außerhalb der Stadt stehen)
TW ... Gehen (in der Stadt)
WL ... Gehen (außerhalb der Stadt)
RN ... Rennen
DT ... Sterben
DD ... Leiche
SQ ... Sequenz

Die Sequenz ist dabei nur der Vollständigkeit halber angegeben, da sich diese bekanntlich aus Animationsteilen zusammensetzt und deren Daten somit nicht in der animdata.txt verzeichnet sind. Die Informationen über SQ-Animationen sind in der D2Common.dll verzeichnet, wobei der genaue Offset vom Patch abhängt.

WWW steht für "weapon class" und bezeichnet die verwendete Waffenart. Diese ist in der wWeapons.txt in der Spalte "wclass" bzw "2handedwclass" für jede Waffen-Grundklasse angegeben:

hth ... Faustkampf (keine Waffe)
ht1 ... eine Klaue
ht2 ... zwei Klauen
1hs ... einhändige Schwungwaffen (Schwerter, Äxte, Knüppel, Keulen, Szepter, Hämmer, Wurfäxte)
2hs ... zweihändige Schwerter
1ht ... einhändige Stichwaffen (Dolche, Wurfspieße, Wurfmesser, Wurfelexiere)
2ht ... zweihändige Stichwaffen (Speere)
stf ... Stäbe (Stangenwaffen sowie zweihändige Äxte, Hämmer und Stäbe)
bow ... Bögen
xbw ... Armbrüste
1ss ... zwei Schwungwaffen
1jt ... zwei Stichwaffen
1js ... links Stichwaffe, rechts Schwungwaffe
1st ... links Schwungwaffe, rechts Stichwaffe

Im ungemoddeten Spiel sind die Werte für ht1 und ht2 ident, sodass man hierbei nicht zu unterscheiden braucht.
Die letzten vier Animationen verwendet nur der Barbar, da keine andere Charakterklasse diese Waffen gleichzeitig tragen könnte. Glücklicherweise entfällt auch hier die Unterscheidung, denn die Werte der Animationen 1ss, 1jt, 1js und 1st sind (abgesehen von einer vernachlässigbaren Verschiebung des FrameDataActionFlags) ident.


Skills.txt

Aus den mpq-Archiven lassen sich unter Zuhilfenahme von "MPQView" auch weitere Dateien extrahieren, zu denen unter anderem die Skills.txt zählt, in welcher die Eigenschaften unserer Fertigkeiten festlegt werden. Da unsere Animationen über die Acceleration durch verschiedenste Fertigkeiten beeinflusst werden können, sollten wir uns auch damit kurz auseinandersetzen. Dabei sind nur drei Eigenschaften erwähnenswert, wobei nur eine davon wirklich eine große Rolle spielt.

Eine wichtige Eigenschaft unserer Fertigkeiten ist die attackrate, welche zur Beschleunigung unserer Angriffe dient. Für gewöhnlich wird allerdings die Bezeichnung "SIAS" verwendet und die betroffenen Fertigkeiten mit einem Bonus oder Malus auf diesen Wert sind "Altern", "Heiliger Frost", "Fanatismus", "Raserei", "Werwolf", "Tempoblitz" und "Delirium".

Eher unbedeutend und seltener anzutreffen ist die other_animrate, welche nur von den Fertigkeiten "Heiliger Frost" und "Delerium" beeinflusst wird. Diese wirkt zum Beispiel bei der Standanimation, welche für uns vollkommen uninterressant ist. Nur die Ausweichanimationen machen diese Eigenschaft für uns relevant, denn diese verwenden die other_animrate.

Für die Animationslänge bedeutungslos, aber dennoch interressant, ist die velocitypercent zur Steigerung unserer Bewegungsgeschwindigkeit. Einen Bonus oder Malus liefern uns dabei die Fertigkeiten "Altern", "Heiliger Frost", "Gedeihen", "Raserei", "Mehr Tempo", "Barbarenwut", "Tempoblitz" und "Delirium".
 
Block

Allgemeines

Bei physischen Angriffen haben wir die Möglichkeit durch Einsatz unseres Schildes den Schaden abzuwenden. Die Blockabfrage wird durchlaufen, sofern der Angriff unsere Verteidigung (Chance berechnet sich aus Verteidigung, Verteidigerlevel, gegnerischem Angriffswert und Angreiferlevel) durchdrungen hat. Bei einer negativen Blockabfrage besteht noch die Möglichkeit den Angriff durch eine Fertigkeit (Meiden, Ausweichen, Entrinnen) abzuwehren.
Während dem Blockvorgang sind wir unfähig jegliche Aktion auszuführen und er kann auch nicht unterbrochen werden. Falls man somit beabsichtigt mit Block zu spielen, sollte man eine möglichst kurze Blockdauer anstreben. Dies erreichen wir durch die Eigenschaft FBR, erhältlich von diversen Gegenständen. Dabei sollte man auf das Erreichen der Breakpoints achten, denn im Bereich zwischen ihnen ist der genaue Wert nicht relevant.

Damit eine Spieleinheit überhaupt blocken kann, braucht sie einen Schild (und zwar intern, nicht nur graphisch), eine Blockchance und natürlich eine Blockanimation. Die berühmte Ausname der Regel stellen all jene Monster dar, die in der MonStats.txt einen Eintrag in der Spalte "NoShldBlock" haben. Diese brauchen weder Schild noch Animation, allerdings natürlich ebenfalls eine Blockchance. Davon betroffen sind Große Mumien, die Ritter der Verdammnis und sämtliche Aktbosse.
Die Söldner (wobei hier sowieso nur der Eisenwolf einen Schild trägt) haben keine Blockanimation und können somit nicht blocken.
Die Skellete, welche der Totenbeschwörer beleben kann, gibt es in 2 Ausführungen. Eine Art ist mit einem Rundschild ausgestattet, während die andere einen eckigen Schild trägt. Blocken kann allerdings nur die zweitgenannte Art.

Der Block eines Charakters kann im Charakterfenster abgelesen werden, wenn man den Curser auf die Anzeige der Verteidigung legt. Der am Schild angegebene Wert ist nicht unsere endgültige Blockchance, er fließt nur in die Berechnung mitein. Beim Ablesen des zweitgenannten Wertes sollte man wissen, dass der angegebene Wert ein Maximum von 75% hat. Bietet uns der Schild einen höheren Bonus, müssen wir diesen selbst berechnen. Die Blockchance eines Schildes (normaler Schild, Paladin-Schild, Schrumpfkopf) ist immer gleich, sie hängt jedoch von der verwendeten Charakterklasse ab.

Unsere Blockchance wird durch unser Charakterlevel, unsere Geschicklichkeit, den Schildblock und durch diverse Blockboni von Gegenständen oder der Fertigkeit "Heiliger Schild" beeinflusst. Dabei wirkt sich unser Level allerdings negativ aus. Je höher dieses ist, desto geringer wird unser Block und desto mehr Geschicklichkeit brauchen wir für einen bestimmten Blockwert.

Blockchance = [(Schildblock + Blockbonus)*(Geschicklichkeit - 15)/(Charakterlevel*2)]

Durch Umformen können wir uns für einen bestimmten Charakterlevel die benötigte Geschicklichkeit für eine bestimmte Blockchance berechnen. Da man entweder ohne oder mit maximaler Blockchance spielt, gehe ich einfach von der maximalen Chance aus:

benötigte Geschicklichkeit = 15 + {150*Charakterlevel/(Schildblock + Blockbonus)}

Falls man allerdings läuft, wird nicht nur die eigene Verteidigung ignoriert, sondern auch der Block gedrittelt. Damit könnten wir nur noch eine Blockchance von 25% erreichen.


Animationslänge

FPA = {(256*FramesPerDirection)/[(AnimationSpeed*Acceleration/100)]} - 1

Wie man anhand der Formel erkennen kann, handelt es sich bei der Acceleration um einen Prozentwert. Diese muss daher über einen Grundwert verfügen, der dann durch bestimmte Boni und Mali verändert werden kann. In diesem Fall ist die Zusammensetzung recht simpel, da sich nur eine Eigenschaft auf diese Dauer auswirkt.

Acceleration = Baserate + EFBR

Baserate ... Dies ist der Grundwert der Beschleunigung, welcher von der jweils verwendeten Animation abhängig ist. Beim Block liegt dieser Wert bei 50.
EFBR ... Dieser Wert wird intern aus der FBR berechnet. Dabei wird die so genannte "dimishing returns" Formel angewandt, die einen sinkenden Grenznutzen aufweist. Anders ausgedrückt braucht man mit steigendem Wert immer mehr FBR um noch eine weitere Änderung der EFBR zu bewirken.

EFBR = [120*FBR/(120 + FBR)]

Neben der FBR gibt es noch die Fertigkeit "Heiliger Schild", deren Einsatz uns einen Bonus von 50 zur EFBR liefert, wodurch man sehr leicht geringe Blockzeiten erreicht.

Nun fehlen uns bloß noch die Werte für FramesPerDirection und AnimationSpeed. Wo wir diese finden, habe ich zu Beginn schon erklärt, doch ich werde die wichtigsten Werte hier posten um einem das Suchen zu ersparen.

Werte für FramesPerDirection und AnimationSpeed:

Amazone mit einhändig geführter Schwungwaffe: 3, 88
Amazone mit sonstiger Waffe: 3, 256
Assassine: 3, 256
Barbar: 4, 256
Druide: 6, 256
Nekromant: 6, 256
Paladin: 3, 256
Zauberin: 5, 256

Werbär: 5, 200
Werwolf: 5, 256


Verwandlung

Die zwei Wandelformen "Vampir" (durch das Tragen des vollständigen Trang-Ouls Sets) und "Untoter Rattenmann" (durch den Skill "Delirium" des gleichnamigen Runenwortes) haben keine Blockanimation. Trotzdem kann der verwandelte Charakter blocken. Dies ist möglich, da zum Blocken in beiden Fällen die Treffererholungsanimation verwendet wird. Dies bedeutet, dass man die Blockanimation nicht mit FBR, sondern nur mit FHR beschleunigen kann. Da die selben Werte wie bei der Treffererholungsanimation verwendet werden, gelten auch die selben Breakpoints. Allerdings ist FBR hier nicht vollkommen nutzlos, denn diese Eigenschaft hat noch einen weiteren nützlichen Effekt. In 1.09 gab es den Effekt das "Block-Lock", ein Dauerblocken, dass jegliche Aktion verhindert hat. Um dies zu unterbinden, gibt es seit 1.10 eine Zeitsperre, währenddessen zwar geblockt werden kann, aber die Blockanimation nicht durchlaufen wird. Diese Zeitspanne kann durch FBR - und zwar auch bei den beiden Wandelformen - erhöht werden.

untoter Fetisch: 10, 256
Vampir: 4, 136


Zusammenfassung

FPA = {(256*FramesPerDirection)/[(AnimationSpeed*(50 + EFBR)/100)]} - 1
EFBR = [120*FBR/(120 + FBR)]


FramesPerDirection ... Die Anzahl an Frames, die von einer Animation verwendet werden.
AnimationSpeed ... Der Grundwert des Counter-Anstiegswertes, wird durch die jeweilige Animation vorgegeben.


Breakpoints

Rich (BBCode):
Dauer [Ticks]:       19  18  17  16  15  14  13  12  11  10  09  08  07  06  05  04  03  02  01

Amazone 1hs:                 00  04  06  11  15  23  29  40  56  80 120 200 480
Amazone:                                                                     00  13  32  86 600
Assassine:                                                                   00  13  32  86 600
Barbar:                                                              00  09  20  42  86 280
Druide:                                              00  06  13  20  32  52  86 174 600
Nekromant:                                           00  06  13  20  32  52  86 174 600
Paladin:                                                                     00  13  32  86 600
Paladin mit HS:                                                                          00  86
Zauberin:                                                    00  07  15  27  48  86 200 4680

styg. Puppe:         00  04  07  10  15  20  27  35  48  65  86 129 200 414 4680
Vampir:                              00  02  06  10  16  24  34  48  72 117 208 638
Werbär:                                          00  05  10  16  27  40  65 109 223 1320
Werwolf:                                                     00  07  15  27  48  86 200 4680
Wenn wir uns im verwandelten Zustand befinden, brauchen wir natürlich jene Animation, die unserem aktuellem Äußerem entspricht. Daher spielt es keine Rolle welcher Charakter sich verwandelt, es gelten immer die Werte der jeweiligen Wandelform.
 
Treffererholung

Allgemeines

Diese Animation ist eine Art "Strafe", denn sie hat für uns keinen Nutzen und unterbricht bzw verhindert während ihrer Dauer jegliche gewünschte Aktionen. Die Treffererholungsanimation kann selbst jedoch nicht unterbrochen werden. Wenn wir also gegen Ende der Animation nochmals in die Treffererholung verfallen würden, oder einfach einen Angriff blocken, wird keine weitere Animation abgespielt. Durch die Eigenschaft FHR (erhältlich von bestimmten Gegenständen) kann die Dauer der Animation verringert werden. Dabei gibt es bestimmte Breakpoints, also Werte bei denen eine Änderung eintritt. Im Bereich zwischen zwei Breakpoints ist der genaue Wert bedeutungslos.

Die Treffererholung wird ausgelöst, wenn man mit einem Angriff mehr als ein Zwölftel seiner maximalen Lebenspunkte verliert oder man Opfer einer Lähmattacke (Drescher, Duriel oder Schneeyetis) wird. Weiters gibt es noch den Effekt der Lähmung, auch "stun" genannt. Wird ein Spieler gelähmt, so durchläuft er die Treffererholung und besitzt dann den Status "stunned". Solange er sich in diesem Status befindet, führt jeder weitere Treffer unabhängig vom Schaden zum erneuten Durchlaufen der Treffererholungsanimation. Wird eine Nichtspielereinheit gelähmt, wird ebenfalls die Treffererholung durchlaufen und das Opfer ist für die Dauer der Lähmung handlungsunfähig. Diese Eigenschaft bekommt man nicht über Gegenstände, sondern nur durch die Fertigkeiten Niederstrecken, Gedankenschlag, Kriegsschrei, Lähmen, Schockwelle und Holzhammer.

Für Nichtspielereinheiten zieht auch Knockback/Zurückstoßung eine Treffererholungsanimation nach sich. Spieler dagegen werden dadurch nicht in die Animation gezwungen, selbst wenn sie zeitgleich ein Zwölftel ihres Lebens verlieren oder gelähmt sind.
Knockback kann man einerseits von verschiedensten Gegenständen erhalten und andererseits bewirken auch manche Fertigkeiten (Ansturm, Niederstrecken und weitere) diesen Effekt. Wird Knockback über eine Fertigkeit ausgelöst, so wird der Gegner immer zurückgestoßen. Bezieht man Knockback dagegen von Gegenständen, so erfolgt eine Unterscheidung in der Größe des attackierten Monsters. Während kleine Gegner zu 100% zurückgestoßen werden, wirkt Knockback bei mittelgroßen Gegnern nur noch in 50% aller Fälle. Große Gegner (dazu zählen ebenso fliegende Spieleinheiten) werden nur noch zu 25% zurückgestoßen. Diese Chancen können durch mehrmaliges Knockback auf den Gegenständen nicht erhöht werden. Aktbosse sowie unbewegliche Objekte können nicht zurückgestoßen werden.


Animationslänge

FPA = {(256*FramesPerDirection)/[(AnimationSpeed*Acceleration/100)]} - 1

Wie man anhand der Formel erkennen kann, handelt es sich bei der Acceleration um einen Prozentwert. Dieser muss daher über einen Grundwert verfügen, der dann durch bestimmte Boni und Mali erweitert werden kann. In diesem Fall ist die Zusammensetzung recht simpel, da sich nur eine Eigenschaft auf die Dauer der Treffererholung auswirkt.

Acceleration = Baserate + EFHR

Baserate ... Dies ist der Grundwert, der von der verwendeten Animation abhängig ist. Bei der Treffererholung liegt dieser Wert bei 50.
EFHR ... Dieser Wert wird intern aus der FHR berechnet. Dabei wird die so genannte "dimishing returns" Formel angewandt, die einen sinkenden Grenznutzen aufweist. Anders ausgedrückt braucht man mit steigendem Wert immer mehr FHR um noch eine weitere Änderung der EFHR zu bewirken.

EFHR = [120*FHR/(120 + FHR)]

Nun fehlen uns bloß noch die Werte für FramesPerDirection und AnimationSpeed. Wo diese zu finden sind, habe ich zu Beginn schon erklärt, doch ich werde die wichtigsten Werte hier posten um einem das Suchen zu ersparen.

Werte für FramesPerDirection und AnimationSpeed:

Amazone: 6, 256
Assassine: 5, 256
Barbar: 5, 256
Druide mit einhändig geführter Schwungwaffe: 7, 248
Druide mit sonstiger Waffen: 7, 256
Nekromant: 7, 256
Paladin mit zweihändig geführter Waffe, ausgenommen Schwertern: 5, 192
Paladin mit sonstiger Waffe: 5, 256
Zauberin: 8, 256

Stygische Puppe: 10, 256
Vampir: 4, 136
Werbär: 5, 184
Werwolf: 4, 256

Barbarensöldner: 5, 256
Eisenwolf: 9, 256
Rogue: 6, 256
Stadtwache: 8, 256


Zusammenfassung

FPA = {(256*FramesPerDirection)/[(AnimationSpeed*(50+EFHR)/100)]}-1
EFHR = [120*FHR/(120+FHR)]


FramesPerDirection ... Die Anzahl einzelner Frames einer bestimmten Animation.
AnimationSpeed ... Animationsabhängiger Grundwert des Counter-Anstiegswertes.


Breakpoints

Rich (BBCode):
Dauer [Ticks]:       19  18  17  16  15  14  13  12  11  10  09  08  07  06  05  04  03  02

Amazone:                                             00  06  13  20  32  52  86 174 600
Assassine:                                                   00  07  15  27  48  86 200 4680
Barbar:                                                      00  07  15  27  48  86 200 4680
Druide:                                      00  05  10  16  26  39  56  86 152 377
Druide 1hs:                              00  03  07  13  19  29  42  63  99 174 456
Nekromant:                                   00  05  10  16  26  39  56  86 152 377
Paladin:                                                     00  07  15  27  48  86 200 4680
Paladin stf, 2ht:                            00  03  07  13  20  32  48  75 129 280 4680
Zauberin:                            00  05  09  14  20  30  42  60  86 142 280 1480

untoter Fetisch:     00  04  07  10  15  20  27  35  48  65  86 129 200 414 4680
Vampir:                              00  02  06  10  16  24  34  48  72 117 208 638
Werbär:                                      00  05  10  16  24  37  54  86 152 360
Werwolf:                                                             00  09  20  42  86 280

Barbarensöldner:                                             00  07  15  27  48  86 200 4680
Eisenwolf:                   00  05  08  13  18  24  32  46  63  86 133 232 600
Rogue:                                               00  06  13  20  32  52  86 174 600
Stadtwache:                          00  05  09  14  20  30  42  60  86 142 280 1480
Wenn wir uns im verwandelten Zustand befinden, brauchen wir natürlich jene Animation, die unserem aktuellem Äußerem entspricht. Daher spielt es keine Rolle welcher Charakter sich verwandelt, es gelten immer die Werte der jeweiligen Wandelform.
 
Zauber

Allgemeines

Die Animationen von Zaubern und Angriffen unterscheiden sich von jenen, die wir bisher behandelt haben, denn weder der Block noch die Treffererholung beinhalten eine wirkliche Aktion. In beiden Fällen wird einfach durch ein bestimmtes Ereigniss eine Graphik abgespielt. Der einzige Sinn dieser Animationen bestät darin, den Charakter durch Handlungsunfähigkeit zu behindern.
Im Gegensatz dazu haben Zauber und Angriffe den Zweck, die Gegner zu schädigen/beeinflussen. Diese Animationen beinhalten eine Aktion, nämlich das Treffen des Gegners oder das Erzeugen eines Geschosses. Der Zeitpunkt dieser Animation hat dabei nichts mit der graphischen Ausgabe zu tun. Wir schaden dem Gegner nicht, sobald er laut der abgespielten Animation von uns getroffen wird, sondern nur sobald der Counter-Aktionswert erreicht wird.


Animationslänge

FPA = {(Hitshift*FramesPerDirection)/[(AnimationSpeed*Acceleration/100)]} - 1

Wie man anhand der Formel erkennen kann, handelt es sich bei der Acceleration um einen Prozentwert. Dieser muss daher über einen Grundwert verfügen, der dann durch bestimmte Boni und Mali verändert werden kann. In diesem Fall ist die Zusammensetzung recht simpel, da sich nur eine Eigenschaft auf diese Dauer auswirkt.

Acceleration = Baserate + EFCR

Baserate ... Der Grundwert der Beschleunigung, welcher von der verwendeten Animation abhängt. Für Zauber beträgt dieser Wert 100.
EFCR ... Diese wird intern aus der FCR berechnet. Dabei wird die so genannte "dimishing returns" Formel angewandt, die einen sinkenden Grenznutzen aufweist. Anders ausgedrückt braucht man mit steigendem Wert immer mehr FCR um noch eine weitere Änderung der EFCR zu bewirken.

EFCR = [120*FCR/(120 + FCR)]

Nun fehlen uns bloß noch die Werte für FramesPerDirection und AnimationSpeed. Wo wir diese finden, habe ich zu Beginn bereits erklärt. Die für uns relevanten Werte, liste ich auch hier wieder auf:

Werte für FramesPerDirection und AnimationSpeed:

Amazone: 20, 256
Assassine: 17, 256
Barbar: 14, 256
Druide: 15, 208
Nekromant: 16, 256
Paladin: 16, 256
Zauberin: 14, 256

Vampir: 15, 160
Werbär: 10, 152
Werwolf: 11, 168

Eisenwolf: 18, 256


Sequenzen

Die Fertigkeiten "Arktiswind", "Inferno", "Kettenblitz" und "Blitzschlag" verwenden nicht die SC-Animation, sondern eine bestimmte Abfolge verschiedener Frames einer Animation. "Arktiswind" und "Inferno" haben jedoch keine fixe Dauer, sodass jegliche Berechnung recht unsinnig wäre. Somit bleiben noch die Zauber "Blitzschlag" und "Kettenblitz", welche die selbe Animation benutzen:

Zauberin L/CL: 19, 256


Zusammenfassung

FPA = {(256*FramesPerDirection)/[(AnimationSpeed*(100 + EFCR)/100)]} - 1
EFCR = [120*FCR/(120 + FCR)]


Für Sequenzen:

FPA = {(256*FramesPerDirection)/[(AnimationSpeed*(100 + EFCR)/100)]}
EFCR = [120*FCR/(120 + FCR)]


FramesPerDirection ... Die Anzahl an Frames, die von einer Animation verwendet werden.
AnimationSpeed ... Der Grundwert des Counter-Anstiegswertes, welcher durch die jeweilige Animation bestimmt wird.


Breakpoints

Rich (BBCode):
Dauer [Ticks]:     23  22  21  20  19  18  17  16  15  14  13  12  11  10  09  08  07

Amazone:                           00  07  14  22  32  48  68  99 152
Assassine:                                     00  08  16  27  42  65 102 174
Barbar:                                                    00  09  20  37  63 105 200
Druide:                                00  04  10  19  30  46  68  99 163
Nekromant:                                         00  09  18  30  48  75 125
Paladin:                                           00  09  18  30  48  75 125
Zauberin:                                                  00  09  20  37  63 105 200
Zauberin C/CL:                     00  07  15  23  35  52  78 117 194

Vampir:            00  06  11  18  24  35  48  65  86 120 180
Werbär:                                        00  07  15  26  40  63  99 163
Werwolf:                                       00  06  14  26  40  60  95 157

Eisenwolf:                                 00  08  15  26  39  58  86 138
Wenn wir uns im verwandelten Zustand befinden, brauchen wir natürlich jene Animation, die unserem aktuellem Äußerem entspricht. Daher spielt es keine Rolle welcher Charakter sich verwandelt, es gelten immer die Werte der jeweiligen Wandelform.


das Aktionstick

AT = {(Hitshift*FrameDataActionFlag)/[AnimationSpeed*Acceleration/100]}

Die Zusammensetzung der Acceleration wurde soeben besprochen und hat natürlich auch hier Gültigkeit. Auch die AnimationSpeed ist in beiden Fällen ident, wird hier allerdings nochmals mit den FramDataActionFlags angegeben um bei Verwendung der Werte nicht unnötig suchen zu müssen.

Werte für FrameDataActionFlag und AnimationSpeed:

Amazone mit Stichwaffe oder zweihändig geführter Waffe exklusive Schwert: 13, 256
Amazone mit Armbrust, Zweihandschwert oder einhändiger Schwungwaffe: 12, 256
Amazone ohne Waffe: 11, 256
Amazone mit Bogen: 10, 256
Assassine: 09, 256
Barbar: 09, 256
Druide: 08, 208
Nekromant: 08, 256
Paladin: 09, 256
Zauberin: 07, 256
Zauberin C/CL: 07, 256

Vampir: 03, 160
Werbär: 05, 152
Werwolf: 05, 168

Eisenwolf: 07, 256


Zusammenfassung

AT = {(256*FrameDataActionFlag)/[(AnimationSpeed*(100 + EFCR)/100)]}
EFCR = [120*FCR/(120 + FCR)]


FrameDataActionFlag ... Jenes Frame, welches die Ausführung einer enthaltenen Aktion steuert.
AnimationSpeed ... Der Grundwert des Counter-Anstiegswertes, welcher durch die jeweilige Animation bestimmt wird.


Breakpoints

Rich (BBCode):
Dauer [Ticks]:          13  12  11  10  09  08  07  06  05  04


Amazone xht, stf:       00  10  23  42  72 133
Amazone xbw, xhs:           00  11  26  48  86 180
Amazone hth:                    00  13  29  56 113
Amazone bow:                        00  14  32  68 152
Assassine:                              00  15  39  86
Barbar:                                 00  15  39  86
Druide:                             00  11  30  63 142
Nekromant:                                  00  18  48 125
Paladin:                                00  15  39  86
Zauberin:                                       00  20  63 200
Die unterstrichenen Breakpoints sind jene, die nicht mit einem Breakpoint zur Verringeren der Gesammtdauer des Zaubers zusammenfallen.


Zauberverzögerung

Diverse Fertigkeiten (sowohl Zauber als auch Angriffe) wurden mit einer Zauberverzögerung - zumeist als Cast Delay bezeichnet - versehen. Diese verhindert für gewisse Zeit das erneute Ausführen der selben oder auch einer anderen Fertigkeit. Die Dauer dieser Verzögerung wird durch die jeweilige Fertigkeit in der Skills.txt bestimmt und kann (anders als jene der Animation selbst) nicht gesenkt werden:

Rich (BBCode):
Amazone                Assassine               Druide             Paladin             Zauberin

Giftwurfspieß    15    Drachenflug       25    Feuersturm   15    Himmelsfaust  25    Feuerwand    35
Pestwurfspieß   100    Klingenwächter    50    Felsenfeuer  50                        Meteor       30
Feuerbrandpfeil  25    Schattenkrieger  150    Riss         50                        Hydra        50
Walküre         150    Schattenmeister  150    Vulkan      100                        Blizzard     45
                       Schocknetz        15    Armageddon  150                        Frostsphäre  25
                                               Hurrikan    150
                                               Werwolf      25
                                               Werbär       25

Um nun die Verzögerung zwischen zwei Zaubern zu ermitteln, können wir die obigen Zahlen allerdings nicht 1 zu 1 übernehmen. Dies würde nämlich vorraussetzen, dass der Timer des Cast Delays mit dem Ende des ersten Zaubers beginnt, was jedoch nicht der Fall ist. Stattdessen startet der Timer bereits nach dem Aktionstick, sodass er schon während dem Endteil unserer Animation läuft und die effektive Verzögerung damit geringer wird:

CD_eff = CD - {(256*FramesPerDirection)/Counter-Anstiegswert} + 1 + {(256*FramesDataActionFlag)/Counter-Anstiegswert}

Fertigkeiten die selbst über ein Cast Delay verfügen, sind von dieser Verzögerung stärker betroffen als jene, denen kein Cast Delay zugewiesen ist. Beide Fälle verwenden jedoch die obige Formel, die Unterscheidung liegt nur in der CD-Variablen. Wollen wir erneut einen Zauber mit Cast Delay aussprechen, so setzen wir für das CD die Zahlen laut obiger Tabelle ein. Ist dem zweiten Zauber jedoch kein Cast Delay zugeordnet, so wird das ursprüngliche CD auf maximal 12 begrenzt. Da das Cast Delay aller Fertigkeiten länger als 12 Ticks andauert, können wir uns damit eine Unterscheidung ersparen und immer mit einem CD von 12 rechnen.


Beispiel:

Wir spielen eine bi-elementare Zauberin mit Blizzard und Feuerball. Da wir 65% FCR von der Ausrüstung beziehen, schießen wir mit einer Geschwindigkeit von 9 FPA. Wir suchen nun die effektive Verzögerung zwischen zwei Blizzard, bzw zwischen einem Blizzard und einem nachfolgenden Feuerball.

FramesPerDirection = 14
FrameDataActionFlag = 07
AnimationSpeed = 256
CD = 45

Acceleration = 100 + [120*65/(120 + 65)] = 142
Counter-Anstiegswert = [256*142/100] = 363

CD_eff = CD - {(256*FramesPerDirection)/Counter-Anstiegswert} + 1 + {(256*FramesDataActionFlag)/Counter-Anstiegswert}
CD_eff = 45 - 10 + 1 + 5 = 41 Ticks
CD_eff = 12 - 10 + 1 + 5 = 8 Ticks


Einen Blizzard können wir demnach erst nach 41 Ticks erneut setzen, während sich Feuerbälle schon 8 Ticks nach Beendigung des ersten Zaubers abfeuern lassen.
 
Ausweichfertigkeiten und Waffenblocker

Allgemeines

Dieses Kapitel dreht sich um die Fertigkeiten "Waffenblocker" der Assassine und die Gruppe der Ausweichfertigkeiten ("Meiden", "Ausweichen" und "Entrinnen"). Eigentlich bilden diese Fertigkeiten keine eigene Gruppe, sondern sind vielmehr Teile von anderen übergeordneten Gruppen. Da sie in diese allerdings nicht wirklich hineinpassen, fasse ich diese Fertigkeiten in diesem Kapitel zusammen.

Ausweichfertigkeiten

Die Fertigkeiten "Meiden", "Ausweichen" und "Entrinnen" verwenden die S1 Animation und würden in meiner Einteilung somit unter Angriffe fallen. Da diese Einteilung jedoch recht sinnfrei ist und diese Animationen auch keine Aktion beinhalten, behandle ich sie gesondert.

Sobald ein Angriff unsere Verteidigung und Blockchance überwunden hat, besteht die Möglichkeit ihn noch durch die passiven Ausweichfertigkeiten abzuwehren. Bei erfolgtem Ausweichen wird die Animation gestartet, welche leider auch andere Animationen wie Angriffe unterbrechen kann. Besonders unangenehm macht sich dieser Effekt bei Rollbackangriffen wie "Widersetzen" bemerkbar, weil dort bei einem Abbruch alle Schläge wirkungslos sind (und dennoch angezeigt werden, da Rollbackattacken graphisch nicht abgebrochen werden können).

Die Berechnung der Animationslänge erfolgt auch hier über die bekannte Formel:

FPA = {(Hitshift*FramesPerDirection)/[AnimationSpeed*Acceleration/100]} - 1

FramesPerDirection ... In diesem Fall haben wir nur einen Charakter, da nur die Amazone über diese Fertigkeiten verfügt. Dabei spielt auch die Waffe keine Rolle, da die Werte bei allen Möglichkeiten der Bewaffnung ident sind. Diese Animation nutzt daher immer 9 Frames.
AnimationSpeed ... Die AnimationSpeed ist ebenso konstant und liegt für diese Animationen wie so oft bei 256.
Acceleration ... Die Beschleunigung setzt sich wie üblich aus einem Grundwert und beinflussenden Faktoren zusammen. In diesem Fall wirken sich jedoch weder die Geschwindigkeit der Waffe noch Geschwindigkeitsboni der Ausrüstung aus. Nur Fertigkeiten, welche die Angriffsgeschwindigkeit erhöhen, können die Animationen dieser Fertigkeit beschleunigen.

Acceleration = Baserate + SIAS (+ ColdEffekt)

Baserate ... Der Grundwert dieser Animation liegt hier erneut bei 100.
SIAS ... Neben den Boni diverser Fertigkeiten (zb Fanatismus) werden hier auch Mali verrechnet (zb Altern). Außerdem wirkt sich hier auch die Verlangsamung diverser Gegenstände aus.
ColdEffekt ... Wenn unser Charakter eingefroren wird, erhalten wir auch auf diese Animation einen Malus von 50 zur Acceleration.

In diesem Fall stimmt die obige Formel eigentlich nicht mit dem tatsächlichem Ablauf überein, kommt aber auf das selbe hinaus und wurde daher kurzerhand vereinfacht. Meine Formel beinhaltet nur das SIAS, sprich die Eigenschaft "attackrate". Allerdings wirkt sich bei den Ausweichanimationen auch die Eigenschaft "other_animrate" (von "Heiliger Frost" und "Delerium") aus. Da diese beiden Fertigkeiten sich auch auf die attackrate auswirken, gibt es hier eine Sonderregelung, dank welcher bei einer Fertigkeit mit other_animrate die attackrate für die Ausweichanimationen ignoriert wird. Die beiden oben genannten Fertigkeiten geben auf attackrate und other_animrate den selben Bonus/Malus, sodass man die other_animrate einfach als attackrate und damit als SIAS werten kann. Dies habe ich in meiner Anschreibung der Formel auch getan, doch beim modden könnte diese grundlegende Mechanik von Interresse sein, weshalb ich hier noch kurz darauf eingegangen bin.


Zusammenfassung

FPA = {(256*9)/[256*(100 + SIAS (- 50))/100]} - 1

Ohne jegliche Boni und Mali haben die Ausweichskills also eine Länge von 8 Ticks. Die nächsten beiden Breakpoints würden bei 13 und 29 liegen, doch eine Tabelle aller Breakpoints erspare ich mir diesmal, weil diese einfach nicht relevant sind.


Waffenblocker

Der Waffenblocker der Assassine ist eine passive Fertigkeit zur Abwehr von Schlägen und Geschossen. Diese müssen allerdings nicht physischer Natur sein um abgeblockt werden zu können, doch dafür wirkt der Waffenblocker nur im Stehen. Er wird nach der Verteidigung abgefragt und ersetzt den Schildblock, da der Waffenblocker die Benutzung zweier Klauen vorraussetzt.

Der Waffenblocker fällt eigentlich in die Gruppe der Block-Animationen, doch da er durch eine Fertigkeit ermöglicht wird, behandle ich ihn hier gesondert. Der Waffenblocker verwendet die Werte der Blockanimation, welche für die Assassine folgermaßen lauten:

FramesPerDirection = 3
AnimationSpeed = 256
Baserate = 50

Wie auch beim Schildblock kann die Animation durch Boni auf die Blockgeschwindigkeit erhöht werden, während Kälte und andere Mali keinen Einfluss haben. Die erneute Anschreibung der Formel erspare ich mir in diesem Fall, da die Animationsdauer sowie die Breakpoints des Klauenblockes mit jenen des Schildblockes übereinstimmen:

Rich (BBCode):
Dauer [Ticks]:    05   04   03   02   01
Assassine:        00   13   32   86  600
 
Zurück
Oben