Ce que vous pourriez chercher est le tour du dé vide pour rejeter les résultats "impossibles" (c'est-à-dire les résultats pour lesquels vous relancerez toujours jusqu'à ce qu'ils ne se produisent pas).
Par exemple, voici comment modéliser un mécanisme où vous lancez 3d12 et les relancez tous s'ils dépassent 12:
function: test ROLL:s si le total est MAX:n ou moins {
SOMME: 0 + ROLL
if SOMME > MAX { result: d{} } \ ignorer les lancés qui donnent un total supérieur à MAX! \
\ faites maintenant quelque chose avec ROLL (et/ou SOMME) ici... \
result: SOMME
}
output [test 3d12 si le total est de 12 ou moins]
La magie se produit à la ligne if SOMME > MAX { result: d{} }
; si cette condition est vraie, la fonction s'arrête et renvoie le "dé vide" d{}
, que AnyDice ignorera complètement lors de la collecte des résultats. Le résultat final est exactement comme si vous deviez relancer les lancés qui correspondent à la condition jusqu'à ce qu'ils ne le fassent plus.
Dans le reste de la fonction, vous pouvez alors calculer n'importe quel résultat que vous souhaitez en fonction de l'entrée ROLL
et le renvoyer. Notez que la valeur de retour doit être un nombre (ou un dé); si on essayait de renvoyer une séquence (comme ROLL
lui-même), AnyDice la sommerait automatiquement. Dans le programme d'exemple ci-dessus, je renvoie simplement la somme, mais une alternative possible (si vous souhaitiez examiner les valeurs des dés individuels) serait d'encoder la séquence ROLL
en un nombre base-10 ou base-100, par exemple comme ceci:
result: 10000 * 1@ROLL + 100 * 2@ROLL + 3@ROLL
(Voici une fonction d'aide plus générique pour cela si vous en voulez une.)
J'ai utilisé un dé d12 normal pour l'exemple ci-dessus, mais vous pourriez bien sûr également utiliser un dé biaisé personnalisé si vous le souhaitez. Et vous pourriez également implémenter quelque chose comme un mécanisme où vous "lancez un dé à la fois et relancez le dernier s'il dépasse 12", mais cela serait simplement plus compliqué et/ou fastidieux.
En gros, vous auriez besoin d'une série de fonctions qui s'appellent mutuellement ou d'une seule fonction qui s'appelle récursivement pour modéliser le lancer étape par étape, quelque chose comme ça:
function: test BASE:n plus ROLL:n plus N:n fois DIE:d max MAX:n {
if BASE + ROLL + N > MAX { result: d{} }
if N = 0 { result: BASE + ROLL }
result: [test BASE + ROLL plus DIE plus N-1 fois DIE max MAX]
}
output [test 0 plus d12 plus 2 fois d12 max 12]
Remarquez que, dans cet exemple, je relance le dé le plus récent si le lancer plus le total de base jusqu'à présent plus le nombre de dés restants à lancer dépasse le maximum. C'est parce que nous savons que les dés restants rouleront toujours au moins un chacun de toute façon. Ainsi, par exemple, si nous avons obtenu un 11 sur le premier d12 des trois lorsque le maximum était de 12, nous le relancerions car nous saurions que les deux lancers suivants devraient chacun augmenter le total d'au moins 1, le faisant atteindre au moins 11 + 1 + 1 = 13.