I took a crack at it in Python (I know it's not anydice. Whatever.). Turns out, even if we exclude exploded ones from counting towards the fumble, fumbles are still WAY too common in any reasonably-sized die pool (my test pool of 8d6 still turned up fumbles around half the time). Here's my Python script that excludes exploded ones:
# 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)
Copy-paste it here to see it in action.
6
s add one success for the6
and one for the new die, or just one for the new die? \$\endgroup\$