© BrunoGarridoMacias/Shutterstock.com
Ein Abenteuer voller Monster, Kämpfe und Anwendungsmetriken

Dungeons & Dragons


Was hat das wohl beliebteste Pen-und-Paper-Rollenspiel mit Anwendungsmetriken und Frameworks wie Quarkus oder Micrometer gemein? Dieser epische Artikel nimmt euch mit auf ein Abenteuer voller Monsterkämpfe, Graphen und Metriken. Und jetzt alle einen w20-Wurf auf „Lesen“ machen!

Im Sommer des Jahres 2019 habe ich meine Kinder beim Spielen beobachtet. Egal, ob sie drinnen oder draußen spielten, mit oder ohne Spielsachen – immer haben sie irgendwelche Spiele erfunden. Das tun sie bis heute. Damals haben sie Pokémon-Kämpfe nachgestellt, mit Soundeffekten, speziellen Bewegungen und verrückten Stimmen. Ich habe mich eine Weile intensiv mit der Frage beschäftigt, wie man diesen kreativen Geist ins Teenageralter retten kann. Die Antwort, die ich fand, hieß Dungeons & Dragons.

Ich selbst habe D&D zwei Mal gespielt: einmal im Alter von 11 Jahren mit dem Nachbarsjungen, was sich allerdings als ziemlich ziellose Übung im Erstellen von Charakteren für das Spiel herauskristallisierte, und einmal als Erwachsene. Beim zweiten Mal starb ich aus Peinlichkeit ungefähr 1 000 Tode. Aber für meinen Sohn und seine Freunde war ich bereit, das zu ertragen und so bot ich ihnen an, den Dungeon Master (DM) für sie zu geben. Natürlich machte ich einen typischen Anfängerfehler und hatte ihm kein Limit gesetzt, wie viele seiner Freunde mitspielen könnten. Unser Abenteuer startete mit einer Gruppe aus sechs 10-jährigen Jungs (ab und zu spielte auch ein 6-jähriges Mädchen mit), und ich habe die Arbeit und das Chaos um einiges unterschätzt.

Der ein oder andere wird sich nun fragen „In Ordnung, aber was genau hat das nun mit Metriken zu tun?“ Die Antwort ist: Timing.

Domänenspezifische Anwendungsmetriken sind wichtig. Um zu wissen, was genau die eigene Anwendung tut, reicht es nicht, den HTTP-Datendurchsatz zu messen (was allerdings der Fixpunkt jeder Beschreibung von Anwendungsmetriken zu sein scheint). Ich kann etwa einen fantastischen Datendurchsatz messen, wenn ein Bug in meinem Code etwa dafür sorgt, dass ganze Codepfade übersprungen werden. Ein erfolgreicher Response-Code kann keine Gewissheit darüber geben, ob die Anwendung subtil nicht doch irgendetwas Falsches macht. Dafür ist es einfach zu leicht, Unit-Tests zu schreiben, die keine Bugs aufspüren. Aus diesem Grund habe ich das getan, was Developer Advocates machen: Ich habe einen Abstract für einen Talk eingereicht, der die Wahrheit meiner Behauptung bestätigen sollte, habe aber den ganzen Sommer nicht daran gearbeitet (obwohl es auf der To-do-Liste stand).

Anfang September beschlich mich dann leichte Panik: Ich musste mir einen Haufen Informationen in Bezug auf D&D einverleiben, damit ich meinen Sohn und seine Freunde erfolgreich durch das Spiel führen konnte, und ich musste eine komplett neue Anwendung sowie einen ganzen Vortrag von null an vorbereiten. Aus eigenem Interesse verband ich das Ganze zu einer Aufgabe. Was nun folgt, ist die Geschichte von Monsterkämpfen, einer Anwendung, die klassische D&D-Monster gegeneinander antreten lässt (unter Verwendung der Kampfregeln der 5. Edition von Dungeons & Dragons) und Anwendungsmetriken, um das Geschehen zu analysieren.

Erster Versuch

Für die SpringOne 2019 erstellte ich eine Spring-Boot-Anwendung mit einigen Anwendungsendpunkten, die für die Ausführung der Kämpfe verantwortlich waren. Micrometer und ein entsprechender Spring-Boot-Aktuator wurden meinerseits in Verbindung mit einem Prometheus-Endpunkt für die Definition und das Aufspüren von Anwendungsmetriken verwendet. Rollenspieltechnisch verwendete ich Game Master 5 (eine Anwendung von Lion’s Den), um meine Kampagne auf dem iPad zu managen. In diese Anwendung ist ein Monsterkompendium integriert, das sich im XML-Format exportieren lässt. Meine Anwendung hat so die Spielwerte von 1 063 Monstern aus diesem Dokument erhalten. Basierend auf diesen Bemühungen erstellte ich schließlich die Game Engine für die Kämpfe, bei denen immer 2 bis 5 Monster gegeneinander kämpfen sollten, bis nur noch eines lebte. Ich maß die Anzahl an Runden und die jeweilige Dauer der Begegnungen, dazu ein paar Statistiken über die Effektivität von Attacken und die tödlichsten bzw. schwächsten Monster. Ich habe den Talk schließlich überstanden, war aber letztendlich nicht zufrieden mit der Anwendung.

Zweiter Versuch

Die Zeit verstrich, und es war Zeit, die Anwendung für die DevNexus 2020 zu überarbeiten, da ich – wie jeder gute Advocate es tut – meinen Talk natürlich erneut eingereicht hatte. Ich hatte mir vorgenommen, ein paar unterschiedliche Metrik-Libraries auszuprobieren und deren Möglichkeiten zu vergleichen. Das reichte mir schließlich auch als Ausrede, einer meiner Lieblingsaufgaben zu frönen: Dem Refactoring meines Codes! Ich traf die Entscheidung, die Definitionen der Monster von weniger aufgeblähten Wiki-Seiten [1] zu importieren und das Ergebnis dann als JSON-Datei zu speichern. Die Game Engine habe ich in eine Core-Bibliothek geschoben und sie so überarbeitet, dass sie mit dieser etwas saubereren Datenquelle arbeiten kann. Auch wenn ich nur noch 215 Monster hatte, war ich mit dieser Lösung deutlich zufriedener.

D&D: eine kurze Übersicht

D&D ist ein Rollenspiel. Der Dungeon Master (DM) erstellt eine Welt und einen Kontext, in dem es Probleme zu lösen bzw. Herausforderungen zu meistern gibt. Er spielt zudem Kreaturen und Personen, mit denen die Spieler interagieren können. Die Spieler selbst erzählen dann ihren Teil der Geschichte und beschreiben, was ihre Charaktere tun. Die Schlüsselmechanik, die die beiden Erzählweisen verbindet, ist das Rollen der Würfel. Durch Würfeln werden Monster erstellt, es wird entschieden, ob die kluge Schurkin (eine Charakterklasse in D&D) eine epische Entdeckung macht oder sich den Zeh stößt und die Treppe hinunterfällt.

Der Kampf machte mir ein wenig Sorgen. Es würde ohnehin nicht so einfach werden, die Aufmerksamkeit von sechs Kindern konstant zu halten. Zwischendurch immer wieder die Regeln konsultieren und die Action stoppen zu müssen, würde nicht helfen. Die Regeln für den Kampf und dessen Ablauf sind relativ geradlinig und unkompliziert. Allerdings war es nicht besonders leicht, die verschiedenen Arten von Angriffen zu verstehen. Das Ganze wird jetzt sehr nerdig, aber ich hoffe, dass die Erklärungen auch für all jene ausreichen, die D&D noch nie gespielt haben, um meinen Abenteuern in der Welt der Metriken zu folgen. Wir starten mit den Charakteristiken und Attributen von Monstern und arbeiten uns dann zu den Angriffsregeln vor.

Jedes Monster im Monsterkompendium hat einen Typ, eine Größe, eine Rüstungsklasse (AC) und Trefferpunkte (HP). Sowohl Typ als auch die Größe sind feste Werte, man könnte hier von Aufzählungstypen (Enums) sprechen. Die Rüstungsklasse ist ein ganzzahliger Wert, der angibt, wie schwer es ist, eine Kreatur zu treffen (also erfolgreich anzugreifen). Kreaturen mit einer niedrigen Rüstungsklasse sind sehr viel einfacher zu treffen als jene, die eine hohe AC haben. Die Trefferpunkte repräsentieren die Lebensenergie eines Monsters. Ein paar Beispiele:

  • Ein Pseudodrache ist ein kleiner Drache mit einer Rüstungsklasse von 13. Er hat durchschnittlich 7 (2w4 + 2) Trefferpunkte. Damit ist gemeint, dass ein Dungeon Master entweder den Durchschnittswert von 7 wählen oder die HP mit zwei vierseitigen Würfeln ermitteln kann, zu deren Wurfergebnis dann zwei Punkte hinzugefügt werden.

  • Eine Deva ist ein mittelgroßes Himmelswesen mit einer AC von 17 und 136 (16w8 + 64) HP.

  • Eine Tarrasque, ein ikonisches Monster der fünften Edition von D&D, ist ein gigantisches Monster mit einer Rüstungsklasse von 25 und 676 (33w20 + 330) Trefferpunkten.

Jedes Monster hat sechs Attributswerte: Stärke, Geschicklichkeit, Konstitution, Intelligenz, Weisheit und Charisma. Es kann auch in gewissen Fertigkeiten (Skills) geübt sein. Übergreifend sind Fertigkeiten und Fähigkeiten (Proficiencies) die Basis in Form von Modifikatoren, die es einer Kreatur leichter (oder schwerer) machen, eine bestimmte Art von Attacke durchzuführen.

Die meiste Zeit haben Monster natürliche Waffen oder tragen Waffen, um bei Gegnern unterschiedliche Arten von Schaden anzurichten. Ein Wurf mit dem 20-seitigen Würfel wird für die meisten Abfragen (etwa für den Angriff) verwendet, dabei wird er von verschiedenen Modifikatoren beeinflusst. Das Ergebnis des Angriffswurfs wird dann mit der Rüstungsklasse des Gegners abgeglichen, wenn der Wurf gleich der AC oder höher ist, trifft das Monster mit seiner Attacke. Es gibt allerdings zwei wichtige Sonderfälle: Wird eine 1 gewürfelt, dann ist der Angriff in jedem Fall erfolglos (kritischer Fehlschlag aka. Critical Miss). Wird hingegen eine 20 gewürfelt, trifft die Attacke automatisch (ein kritischer Treffer aka. Critical Hit). Ein kritischer Treffer ist sogar so erfolgreich, dass der Angreifer den Schaden der Waffe doppelt auswürfeln darf.

Es gibt darüber hinaus auch noch andere Arten von Attacken, etwa magische Angriffe oder die Odemwaffe eines Monsters, etwa ein Drache, der Feuer speit. Diese Angriffe „passieren“ einfach, für sie muss kein Angriff gewürfelt werden. Stattdessen hat das Opfer einen Rettungswurf (Saving Throw): Es wirft einen w20 (mit entsprechenden Modifikatoren), um sich zu retten oder dem Angriff zumindest ein wenig auszuweichen. Das Ergebnis des Wurfs wird mit einem feststehenden Schwierigkeitsgrad (DC) abgeglichen. In manchen Fällen hängt der Schwierigkeitsgrad auch von den Fähigkeiten des Angreifers ab.

Der alte grüne Drache kann beispielsweise folgende Attacken durchführen. Er kann ...

  • ... seine Klauen zum Angriff nutzen: Der entsprechende Wurf, um einen Gegner innerhalb von 10 Fuß (drei Metern) zu treffen, ist 1w20 + 15, wobei der Modifikator auf den Fähigkeiten und Fertigkeiten des Drachens basiert. Wenn er trifft, bekommt das Opfer entweder einen durchschnittlichen Hiebschaden von 22 oder 4w6 + 8 Punkte, also 22 (4w6 + 8).

  • ... seine Bissattacke nutzen: Der entsprechende Wurf, um einen Gegner innerhalb von 15 Fuß (4,5 Metern) zu treffen, ist 1w20 + 15. Wenn er trifft, bekommt das Opfer entweder 19 (2w10 + 8) Stichschaden und zusätzlich 10 (3w6) Giftschaden.

  • ... seine Schwanzattacke einsetzen: Der entsprechende Wurf, um einen Gegner innerhalb von 20 Fuß (6 Metern) zu treffen, ist 1w20 + 15. Wenn er trifft, bekommt das Opfer 17 (2w8 + 8) Wuchtschaden.

  • ... seinen Giftodem nutzen, eine spezielle Drachenfähigkeit. Der Erklärungstext folgt dabei dem gleichen Muster wie die meisten Angriffe, die einen Rettungswurf nach sich ziehen: „Der Drache speit g...

Neugierig geworden? Wir haben diese Angebote für dich:

Angebote für Teams

Für Firmen haben wir individuelle Teamlizenzen. Wir erstellen Ihnen gerne ein passendes Angebot.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang