AW: Würfelfunktionen
Noch mal ein etwas durchdachterer Vorschlag bzw. in einer vernünftigen Syntax.
Grundlage ist eine Prozedur der Form
[roll][head] ...[/head] ... [/roll].
Sie hat also einen Kopfbereich und einen Bodybereich. Letzterer wird nicht extra markiert. Alles was nicht in HEAD steht, gehört zum Body. Angaben vor HEAD werden komplett ignoriert. Das hat den Vorteil, dass ein Nutzer, der nur schnell was würfeln lassen will, nicht ganz so tief einsteigen muss.
Alles im Bodybereich wird irgendwie ausgegeben. HEAD dient dazu um vorab Variablen zu definieren. Die Sprache kennt nur einen Typ von Variablen: Arrays von hinreichender Länge. In den Einträgen können entweder Zahlen oder Strings stehen. Letztere stehen in Anführungszeichen. Der Ausdruck x[5] steht für den fünften Eintrag von Array x.
3d6 erzeugt also ein Array, dass die Ergebnisse dreier W6 enthält. Die Reihenfolge ist unsortiert.
[roll]3d6[/roll] gibt unsortierte Ergebnisse von 3W6 aus.
[roll][head]x=3d6[/head]x[/roll] belegt zunächst eine Variable x mit einer solchen Belegung und gibt sie dann aus.
Die folgenden Befehle funktionieren nur, wenn das Array aus Zahlen besteht.
sort() - Sortiert das Array von der kleinsten Zahl zur größten
sortdown() - Macht es umgekehrt
sum() - Summiert die Einträge
count(X,[Eigenschaft]) - Zählt wie viele Einträge in X die [Eigenschaft] erfüllen, z.B. count(X,>4)
nhi(X,n) - Behält die n höchsten Einträge aus dem Array und streicht die übrigen.
nlo(X,n) - Behält die n niedrigsten Einträge aus dem Array und streicht die übrigen.
expand(X,[Eigenschaft],Y,repeat=z) - Dieser Befehl prüft die Einträge von X auf die [Eigenschaft]. Für jeden passenden Eintrag, wird hinten Y an das Array angefügt, z.B.
expand(X,=10,d10,repeat=20) , um den Würfelmechanismus der nWoD darzustellen.
Der Eintrag repeat sollte optional sein und eine Default-Belegung haben. Er zeigt an, ob das aus der Expansion erzeugte Array wiederum auf die [Eigenschaft] überprüft werden soll und wie oft das passiert.
explode(X,[Eigenschaft],Y,repeat=z) - Dieser Befehl ist - ganz überraschend - für explodierende Würfel. Er prüft die Einträge von X auf Eigenschaft. An jeder Stelle, welche die Bedingung erfüllt, wird sum(Y) hinzuaddiert.
Folgende Befehle sollten für beliebige Arrays funktionieren.
+ ist ein Konkatenationsoperator. Er hängt zwei Arrays aneinander. Also:
3d6+2d4 produziert ein Array mit fünf Einträgen, in den ersten stehen je ein 1W6, dann kommt zwei mal je ein W4.
3d6+6 erzeugt ein Array, das in den ersten drei Einträgen je 1W6 stehen hat und dann im vierten Eintrag eine 6.
if([Bedingung],[Prozedur],[Sonst]) - Der erklärt sich.
Dann fehlen noch merkwürdige Würfel.
- multipliziert alle Einträge in einem Array mit (-1)
Der m-Operator (Modifikationsoperator) verknüpft zwei Arrays: XmY. Er addiert zu jedem Eintrag von X den Wert sum(Y) hinzu. Also 2d10m2 erzeugt ein Array mit zwei Zahlen zwischen 3 und 12. d3m-2 ist ein Fudge-Würfel. (Dies entspricht einem einfachen explode ohne Bedingung.)
Ein Beispiel für eine Zufallstabelle.
[roll]
[head]
n=2d6;
x=1d3;
if(x=1,g="Räuber");
if(x=2,g="Orks");
if(x=3,g="Goblins"); [/head]
n " " g[/roll]
Damit kann man also schon eine ganze Menge Dinge tun. Man könnte sogar eine Fudge-Leiter implementieren, die um 4dF rauf und runtergeschraubt wird.
Mir fallen nur zwei Spiele ein, die nicht gehen.
Weitere bzw. allgemeine Schleifen bräuchte man für Patzer bei Ars Magica.
Kongruent-Modulo-Abfragen bräuchte man Confrontation.
Weiterhin ein Mechanismus:
Ungebrauchte Würfel zählen.
Natürlich wird das erst richtig nützlich, wenn gängige Verfahren weiter abgekürzt werden.
Es wäre also angenehm nwod(5) zu schreiben statt count(expand(5d10,=10,d10,repeat=20),>=8)
Das ist dann vor allem eine Organisationfrage. Wer schreibt sowas? Und wie kommt es ins System?