1w6 - Ein Würfel System - Einfach saubere, freie Rollenspiel-Regeln

Kampfchancen-Statistik

Bild von Drak

Ich habe ein kleines Skript geschrieben, das die Chancen im Kampf prüft und damit das Balancing von Waffen und Rüstungen erleichtert.

Die PyQt4-Version sieht so aus:

1w6-balance screenshot

Die Quellen der PyQt4-Version gibt es unter https://hg.sr.ht/~arnebab/ews/browse/Skripte/1w6-balance/1w6-balance.py?rev=tip.

GNU/Linux Nutzer können sich die Quellen dort direkt runterladen, PyQt4 installeiren (deine interne Paketverwaltung hat es) und die GUI dann mit

./1w6-balance.py 

Das Befehlszeilen-Skript findest du im Repository des EWS: battle_probability_tree.py

Einsatzgebiet: Kampfchancen berechnen

Es baut dafür einen vollständigen Wahrscheinlichkeitsbaum auf, in dem es die Chancen für die verschiedenen Ausgänge von Nahkämpfen vollständig durchrechnet.

Die Zielsetzung ist es, Aussagen wie "ein legendärer Schwertkämpfer besiegt eine Stadtwache fast immer" überprüfen zu können und auch Zahlenwerte dafür zu haben, um auf stabiler Grundlage arbeiten zu können, wenn wir an Welten oder Ausrüstung basteln.

In der Ausgabe wird für jede Runde die Wahrscheinlichkeit von Sieg (Win) oder Niederlage (Lose) des Ersten über den Zweiten geprüft und außerdem die Wahrscheinlichkeit, dass der Kampf noch nicht beendet ist (Draw).

Sieg oder Niederlage heißt in der vereinfachten Version schlicht: Die Fertigkeit des Verlierers ist unter 3 gesunken oder er hat 5 Wunden oder eine kritische Wunde bekommen. Der Kampf endet also, sobald ein Fortsetzen für den Verlierer nicht mehr sinnvoll wäre.

Beispiel

Die Ausgabe des Befehlszeilen-Skriptes ohne irgendwelche Parameter sieht wie folgt aus:

$ python battle_probability_tree.py Test battle length
Average char (12) vs. average char (12)
Probs after 0 turns: Win: 0 Lose: 0 Draw: 1
Probs after 1 turns: Win: 0.0500257201646 Lose: 0.0500257201646 Draw: 0.899948559671
Probs after 2 turns: Win: 0.0825998323426 Lose: 0.0825998323426 Draw: 0.834800335315
Probs after 3 turns: Win: 0.13314465264 Lose: 0.13314465264 Draw: 0.73371069472
Probs after 4 turns: Win: 0.228099438234 Lose: 0.228099438234 Draw: 0.543801123531
Probs after 5 turns: Win: 0.319366335834 Lose: 0.319366335834 Draw: 0.361267328333
Probs after 6 turns: Win: 0.387555447652 Lose: 0.387555447652 Draw: 0.224889104696

Very good char (15) vs. average char (12)
Probs after 0 turns: Win: 0 Lose: 0 Draw: 1
Probs after 1 turns: Win: 0.10853909465 Lose: 0.0216049382716 Draw: 0.869855967078
Probs after 2 turns: Win: 0.236525491541 Lose: 0.0262768394681 Draw: 0.737197668991
Probs after 3 turns: Win: 0.394982229404 Lose: 0.0330739949555 Draw: 0.571943775641
Probs after 4 turns: Win: 0.583043117362 Lose: 0.0436719898117 Draw: 0.373284892826
Probs after 5 turns: Win: 0.705475323711 Lose: 0.0629808921072 Draw: 0.231543784181
Probs after 6 turns: Win: 0.774199931003 Lose: 0.084538802759 Draw: 0.141261266238

Exceptional char (18) vs. average char (12)
Probs after 0 turns: Win: 0 Lose: 0 Draw: 1
Probs after 1 turns: Win: 0.248671124829 Lose: 0.00835905349794 Draw: 0.742969821674
Probs after 2 turns: Win: 0.489134421201 Lose: 0.00835905349794 Draw: 0.502506525301
Probs after 3 turns: Win: 0.694089138364 Lose: 0.00880498875934 Draw: 0.297105872877
Probs after 4 turns: Win: 0.852631396031 Lose: 0.00953491750495 Draw: 0.137833686464
Probs after 5 turns: Win: 0.922635958899 Lose: 0.0106816159868 Draw: 0.0666824251146
Probs after 6 turns: Win: 0.951628366665 Lose: 0.0127371423598 Draw: 0.0356344909755

Legend (24, weapon 24, armor 10) vs. Space Marine (15, weapon 36, armor 36, wound threshold 5)
Probs after 0 turns: Win: 0 Lose: 0 Draw: 1
Probs after 1 turns: Win: 0.00437242798354 Lose: 0.0545267489712 Draw: 0.941100823045
Probs after 2 turns: Win: 0.00437242798354 Lose: 0.0777749199817 Draw: 0.917852652035
Probs after 3 turns: Win: 0.00437242798354 Lose: 0.0984399608799 Draw: 0.897187611137
Probs after 4 turns: Win: 0.00517618312757 Lose: 0.116808886123 Draw: 0.87801493075
Probs after 5 turns: Win: 0.010894090607 Lose: 0.133136819672 Draw: 0.855969089721
Probs after 6 turns: Win: 0.0240620171956 Lose: 0.147650538382 Draw: 0.828287444422

Probs after 6 turns:

Very good char (15) vs. average char (12) without critical hits
Win: 0.791038330532 Lose: 0.0631941594366 Draw: 0.145767510032
Very good char (15) vs. average char (12)
Win: 0.774199931003 Lose: 0.084538802759 Draw: 0.141261266238

Exceptional char (18) vs. average char (12)
Win: 0.951628366665 Lose: 0.0127371423598 Draw: 0.0356344909755

Very good char (15) vs. average char in strong armor (12, armor 10)
Win: 0.113604807296 Lose: 0.134066609421 Draw: 0.752328583283

Very good char (15) vs. average char with powerful weapon (12, weapon 14)
Win: 0.548245836441 Lose: 0.448216768079 Draw: 0.00353739548028

Very good char (15) vs. sturdy char (12, wound threshold 10)
Win: 0.127951789127 Lose: 0.129439196773 Draw: 0.7426090141

Exceptional char (18) vs. average char with powerful weapon (12, weapon 14) and strong armor (armor 10)
Win: 0.355243806909 Lose: 0.40117721942 Draw: 0.243578973671

Alternativ zu dieser Standardausgabe kannst du mit dem Skript auch direkt Charaktere gegeneinander antreten lassen und so verschiedene Fertigkeitswerte, Waffen und Rüstungen vergleichen.

Ergebnisse

Das Ergebnis war erstmal: Die Beschreibungen der Fertigkeitswerte passen. "Sehr gut vs. durchschnitt" hat nach 6 Runden eine 77% Chance den Kampf für sich entschieden zu haben (und kritische Treffer erhöhen die Chancen des Schwächeren). Bei "überragend vs. durchschnitt" sind das schon 95%.

Die zweite für mich interessante Frage daran war: "Wann gleichen sich die Werte aus?", also wann stehen die Chancen 50/50.

Damit können wir z.B. herausfinden, wie viel eine Rüstung bringt, und damit können wir die Kosten für Rüstungen und Waffen prüfen, indem wir uns an den Kosten für die Fertigkeitswerte orientieren, mit denen ein Char gleichstark wird (Chance 50/50).

Das Ergebnis davon war, dass seit Version 2.4.0 des 1w6-Systems Waffen und Rüstungen ein Dreieck je 9 Punkte Schaden+Schutz kosten statt ein Dreieck je 18 Punkte und damit die Chancen von sehr starken Waffen oder Rüstungen im Vergleich zu kämpfern, die die gleichen Punkte in ihre Fertigkeit gesteckt haben, wieder ausgeglichen sind.

Die Verwendung sagt dir das Skript über

./battle_probability_tree.py --help

Die erwähnten charfiles sehen so aus: Sskreszta charfile

Viel Spaß beim Testen!

AnhangGröße
v0.1-main-window.png106.19 KB
Dieser Text ist mir was wert: Flattr this ?

Ist dieses Programm auch

Ist dieses Programm auch generalisiert nutzbar, also unabhängig von eurem System? So etwas würde mich nämlich für meine eigenen Bastelarbeiten reizen... ;-)

Ansonsten tolle Idee und gute Arbeit!

Bild von Drak

Danke!

Es ist allerdings definitiv nicht systemunabhängig... die Bedingungen dafür, wann jemand gewonnen hat, etc. sind komplett systemspezifisch, genauso auch die Wundeffekte u.ä..

Aber wenn du willst, kann ich dir gerne helfen, es an dein System anzupassen. Reicht dir ein vereinfachtes System?

Aber Vorsicht: Wenn in deinem System Kämpfe viele Runden dauern (also nicht wie im EWS nach durchschnittlich 3 Runden beendet sind), ist das Skript absoluter Overkill für deinen Rechner. Da werden bösartig hashmaps/dictionaries im Baum herumkopiert, so dass das Skript so gar nicht skaliert - was aber auch nicht mein Anspruch war - ich wusste schließlich, dass ich maximal etwa 6 Runden brauche :)

Wenn du lange Kämpfe hast, ist ein Simulator vermutlich sinnvoller, der einfach Zufallswerte nimmt und ein paar hundert kämpfe durchprobiert (der ist auch viel schneller geschrieben :) ). Da kann ich dir auch beim Schreiben helfen.

Das Skript rechnet wirklich alle Möglichkeiten durch und erstellt für jeden Schritt auf dem Weg ein neues Charakterobjekt, so dass bei 4 möglichen, nicht kampfentscheidenden Ergebnissen jede weitere Runde etwa 4-mal so viel Speicher braucht wie die vorige - was so gut wie gar nicht skaliert :)

Ein intelligenterer Algorithmus könnte wahrscheinlich massiv Speicher sparen, aber da ich das nicht brauchte... Optimiere nur, wenn du es brauchst. :)

Hm, also das System beruht

Hm, also das System beruht zunächst einmal auf Aktionen statt Runden (eine Aktion dauert so und so viele Ticks, sobald die abgelaufen sind, kann man was neues machen), wobei das wohl nur sekundär von belang ist (denke ich?). Nein, das ganze hat ein normales Wund- und Rüstungssystem (wobei das gerade überarbeitet wird), dauert also im Normalfall wohl länger als 3 Runden. Das System ist ein kombiniertes Poolsystem, siehe Savage Worls, die Attribute ergeben die Würfelart, die Fähigkeit die Anzahl der Würfel.

Keine Ahnung, ob man da so ohne weiteres was hinbasteln kann.

Bild von Drak

hinbasteln

Da ich hier erstmal nur Zweikämpfe gerechnet habe (vereinfachen...):

Wichtige Frage:

  • Woraus berechnet sich die Chance, dem anderen Schaden zu verursachen?
  • Wie verändern sich die Charakterwerte beim Verlieren/Gewinnen? Verändern sie sich überhaupt?
  • Wie beeinflussen Waffe und Rüstung den Wurf? Wie den Schaden?
  • Wann ist der Kampf zu Ende? Definiertes Kampfende? (das war für mich das größte Problem - theoretisch kann ein Kampf sehr lange gehen: Solange bis einer seinen Wurf auf Weiterleben versaut :) - habe ich vereinfacht)
  • Muss die Aktionsdauer einbezogen werden, oder kann einfach Aktion gegen Aktion gesetzt werden, solange beide immer nur draufhauen?

Die Würfe können einfach gebastelt werden: "Ich bin Faul und lege Fertigkeit einfach als xwy fest" :)

Die Wahrscheinlichkeiten bei Poolsystemen sind etwas komplexer als im EWS, sollte ein Computerprogramm aber problemlos hinkriegen.

Dann wollen wir

Dann wollen wir mal:

  • Aktion kann ruhig gegen Aktion gesetzt werden, das spielt da eigentlich in dem zusammenhang nicht wirklich so die Rolle :-)

  • Das Schadenssystem sieht so aus, das es verschiedene Trefferzonen gibt, wenn nichts anderes angesagt wird, gilt standardmässig der Torso als Trefferzone. Die Trefferzonen weisen unterschiedliche Wundschwellen auf und bei anderen Zonen als dem Torso auch noch eine Treffererschwernis. Es wird zunächst ein Trefferwurf festgelegt der sich durch Entfernung, Trefferschwernis, etc ergibt und mit dem Würfelpool gewürfelt. Waffen geben feste Boni (z.B. +3) au den Wurf. Also gewürfelt z.B. eine 13 +3 = Endergebnis 16 Reicht das, um den Trefferwurf zu überwürfeln wurde getroffen. Jede Augenzahl über dem Trefferwurf = 1 Schaden. Wundschwelle und Rüstung wird von diesem Schaden Abgezogen. Ergibt das keine Wunde, gibt es einen Schock (dieser senkt die Wundschwelle für weitere Treffer). Ich hoffe das war verständlich, falls nicht, kurz nachfragen. :-)

  • Jeder Charakter erhält nach erreichen einer bestimmten Anzahl an Wunden Abzüge.

  • Der Kampf ist aus, bis einer den anderen tötet oder sonstwie ausschaltet (k.o., abgehauen, etc). Zur Berechnung wäre hier also das annehmen von Tot am besten geeignet.

Bisher noch alles sehr kompliziert, aber das Regelwerk ist noch nicht ausgereift und wartet auf den ersten richtigen Spieltest. Da käme eine solche Simulation schon sehr hilfreich. ;-)

Bild von Drak

vereinfachen

Mit Trefferzonensystem kannst du zumindest nicht das einfache Skript verwenden, das ich nutze, weil Trefferzonen noch viel schlechter skalieren als Wunden oder Nichtwunden (je nach Trefferzone andere Werte ändern...).

Das gleiche gilt leider für fließende Trefferpunkte (bei jedem Angriff muss für jeden möglichen Kampfausgang ein Knoten im Baum reserviert werden - aus dem Grund habe ich bei der EWS Rechnung Trefferpunkte rausgelassen).

Soweit ich es verstanden habe, würfelt nur der Angreifer, oder? -> weniger Werte, könnte also noch halbwegs skalieren.

Das Senken der Wundschwelle lässt die Simulation allerdings teuer werden - wie viele Trefferpunkte hat ein Char?

es würfelt nur der

  • es würfelt nur der Angreifer, korrekt

  • die Trefferzonen könnten bei so einer Berechnung wegfallen, da standradmässig ohnehin der Torso als Trefferzone definiert ist, sofern der Spieler nix anderes ansagt

  • das Trefferpunktesystem wird aktuell wie bereits gesagt überarbeitet. Könnte man da mittels Eingabe einer Variablen arbeiten, sollte doch gehen? Grundsätzlich hält jeder Char zur Zeit 5 Wunden aus.

Bild von Drak

Klingt als müsste es

Klingt als müsste es möglich sein.

Kannst du hier nach Dienstag nochmal schreiben? Da muss ich einen Vortrag halten, sollte also vorher nicht programmieren :)

Bild von Drak

Noch da

Habe nächste Woche etwas Zeit... bin ab Montag wieder in Friedrichsfeld.

Ja sicher

Ja klar, warum sollte ich das nicht können. :)

Dann melde ich mich Dienstag abend nochmal hier. :)

Dummer Gedanke..

Ich hab grad mal dein Profil angeschaut, also wenn du immer noch in Edingen wohnst, sind wir sozusagen Nachbarn. Ich wohne nämlich auch da! :D

Bild von Drak

Adresse...

Uh... Vergessen die Adresse zu ändern...

Ich bin letztes Jahr 30 Gehminuten weitergezogen - wohne jetzt in Friedrichsfeld :)

Wann hast du denn normalerweise Zeit? :)

PS: Wenn du unter einem Kommentar auf Antworten drückst, wird deine Antwort direkt bei dem Kommentar einsortiert.

Nuja, Firedrichsfeld ist ja

Nuja, Firedrichsfeld ist ja jetzt nun nicht so weit weg. :) Normalerweise immer so ab 15:30 Uhr. Wochenenden sind aber eher schlecht, da ist meist ausgeplant mit Cons und Spielrunden oder Familienbesuchen. Wobei da auch sicherlich was geht, wenn lang genug vorher bekannt. :P

Bild von Drak

Nun auch mit PyQt4 GUI

Ich habe inzwischen ein kleines PyQt4 GUI für das Script geschrieben.

Aktuell sieht das dann so aus:

1w6-balance screenshot

Die Quellen gibt es unter bitbucket.org/ArneBab/1w6_balance/.

GNU/Linux Nutzer können sich die Quellen dort direkt runterladen, PyQt4 installeiren (deine interne Paketverwaltung hat es) und die GUI dann mit

./1w6-balance.py 

aufrufen.

Viel Spaß beim Testen!

PS: Eine Windows-Version könnte es geben, aber ich konnte die exe bisher nur in wine testen... Wenn du Interesse hast, sie zu testen, melde dich bitte.

Kommentar hinzufügen

Der Inhalt dieses Feldes wird nicht öffentlich zugänglich angezeigt.
CAPTCHA
Bist du ein biologisches Wesen? (5 Zeichen, Groß- und Kleinschreibung zählt!)
Image CAPTCHA
Enter the characters shown in the image.
Inhalt abgleichen
Über 1w6
Downloads
GNU General Public License v3
GNU General Public License v3
Flattr this ?

Benutzeranmeldung

CAPTCHA
Bist du ein biologisches Wesen? (5 Zeichen, Groß- und Kleinschreibung zählt!)
Image CAPTCHA
Enter the characters shown in the image.

Kommentare



“Sorry that I called you a geek, these are beautiful!”
— Die Frau eines guten Freundes, als sie die Flyerbücher gesehen hat ☺
    was Leute sagen…