Eu dei uma olhada nisso em Python (eu sei que não é qualquer coisa. Tanto faz.) Acontece que, mesmo se excluirmos os explodidos da contagem em direção ao fumble, os fumble ainda são muito comuns em qualquer pool de dados de tamanho razoável (meu pool de testes de 8d6 ainda apareceu em torno de metade do tempo). Aqui está o meu script Python que exclui os explodidos:
# This is exploding D6s.
# Basically, you start with a single roll with x dice.
# A result of 4 or higher is a success.
# A result of 3 or lesser is a failure.
# If a 6 is rolled, you roll another die. It will always be a success.
# If that die is a 6, you roll yet another, and so on. This is the "exploding" part.
# However, if more 1's are rolled than 6's, there's a FUMBLE.
# Exploded dice don't count towards 1's when rolled, but do count toward 6's.
# Let's... rationalize that.
import random
def explodeD6(x, xcount=0, explodes=0, explodecount=0, successes=0, ones=0): #x is the number of dice initially rolled.
if xcount < x: #This means not all the dice in the initial pool have been rolled yet.
roll = random.randint(1,6)
if roll == 1:
ones = ones + 1
elif roll == 2 or roll == 3:
successes = successes #Just demonstrating that nothing happens.
elif roll == 4 or roll == 5:
successes = successes + 1
elif roll == 6:
successes = successes + 1
explodes = explodes + 1
else: #Whoops! The randint wasn't between one and six. That's not right.
print("Oops. Wrong die.")
print(str(roll)) #Report.
xcount = xcount + 1 #Indicate one more die has been rolled.
explodeD6(x,xcount,explodes,explodecount,successes,ones) #And again.
elif xcount == x: #This means all the initial dice have been rolled, but not necessarily the explosions.
if explodecount < explodes: #This is an explosion roll. There are no failures, but it can explode again!.
roll = random.randint(1,6)
if roll == 1 or roll == 2 or roll == 3 or roll == 4 or roll == 5:
explodes = explodes #Again, demonstrating nothing happens.
elif roll == 6:
explodes = explodes + 1
else: #D'oh. randint still not working.
print("Oops. Wrong die.")
successes = successes + 1
explodecount = explodecount + 1
print(str(roll) + "(Explosion)") #Report.
explodeD6(x,xcount,explodes,explodecount,successes,ones)
elif explodecount == explodes: #All dice have been rolled and all manner of bonus dice shall have been rolled.
totalRolls = x + explodes
if ones > explodes: #Fumble.
print("With %s ones, but only %s sixes, the result is a fumble, despite %s successes.") % (ones,explodes,successes)
print("%s rolls total, from a starting pool of %sd6, due to %s explosions.") % (totalRolls,x,explodes)
elif ones <= explodes:
if successes > 0: #Success!
print("There were %s ones, but %s sixes, allowing the %s successes to shine through.") % (ones,explodes,successes)
print("%s rolls total, from a starting pool of %sd6, due to %s explosions.") % (totalRolls,x,explodes)
elif successes == 0: #Miss.
print("There were %s ones, but %s sixes, yet there were %s successes, resulting in a miss.") % (ones,explodes,successes)
print("%s rolls total, from a starting pool of %sd6, due to %s explosions.") % (totalRolls,x,explodes)
else: #Oops. Successes are negative.
print("Something's wrong.")
else:
print("Something's wrong.")
else:
print("Something's wrong.")
#Holy shit. That's really long. Let's test it.
explodeD6(8)