Hello everyone! Just thought I'd stick this here to help anyone else who has or does come across this bug. This workaround is for 7th Sea, which uses d10s. If the game you are using does not use d10s, then replace all "d10" with the correct number of sides(i.e. If the game uses d6s, then replace d10 with d6). Also, for the .forEach() function where it has value == 10 and total_number_of_explosions++, make sure to replace the "10" with the correct number of sides(i.e. If the game uses d6s, then replace 10 with 6): const checkForReroll = /(ro\<|r\<)(\d+)/i; const totalKeptExpression = /(kh|kl|k)(\d+)/i; const totalFlatModifierExpression = /^\d+k\d+(\+\d+|\-\d+|)$/i; //convertedRoll IS THE THE ACTUAL ROLL/ ROLL EXPRESSION SENT TO THE CUSTOM ROLL PARSER FUNCTION //convertedRollDisplay IS A SIMPLIFIED VERSION OF THE convertedRoll FOR MY ROLLTEMPLATE //AND WHAT PLAYERS SEE ON THEIR CHARACTER SHEETS. YOU DON'T HAVE TO HAVE THIS TO USE THIS WORKAROUND //HOWEVER YOU WILL NEED TO REPLACE THIS: //var total_flat_modifier = convertedRollDisplay.match(totalFlatModifierExpression)[1]; //WITH THIS: //var total_flat_modifier = convertedRoll.replace(/^\d+d\d+/,"").replace(totalKeptExpression,"").replace(checkForReroll,""); //OR SOME OTHER WAY TO EXTRACT THE FLAT MODIFIER AMOUNT var convertedRoll = "9d10!!kh2r<1+5"; convertedRoll = convertedRoll.replace(/\!/g,""); var convertedRollDisplay = "9k2+5"; var keepHighOrLow = convertedRoll.match(totalKeptExpression)[1]; var total_number_dice_to_keep = convertedRoll.match(totalKeptExpression)[2]; var total_flat_modifier = convertedRollDisplay.match(totalFlatModifierExpression)[1]; //IF YOU NEED TO CHECK IF THE ROLL HAS THE REROLL MODIFIER //var hasRerollModifier = checkForReroll.test(convertedRoll); //var reroll_if_equal_to_or_less = 0; //if(hasRerollModifier){ // reroll_if_equal_to_or_less = parseInt(convertedRoll.match(checkForReroll)[2],10)||0; //} //else{} //ONCE FINISHED, YOU CAN USE reroll_if_equal_to_or_less WITH IF/ELSE OR SOME OTHER MEANS TO //SWITCH BETWEEN WHAT YOUR CODE DOES var reroll_if_equal_to_or_less = parseInt(convertedRoll.match(checkForReroll)[2],10)||0; var hiddenRoll = `@{whisper}&{template:hidden} {{character_name=@{character_name}}} {{roll=[[${convertedRoll}]]}}`; startRoll(hiddenRoll, function(hiddenResults) { finishRoll(hiddenResults.rollId, {}); var total_number_of_explosions = 0; var unaltered_hidden_roll_array = Array.from(hiddenResults.results.roll.dice); var hidden_roll_array = []; unaltered_hidden_roll_array.forEach(function(value,i,arr) { value = parseInt(value,10)||0; if(value == 10){ total_number_of_explosions++; } else{ hidden_roll_array.push(value); } }); var totalRolledExplosionsRoll = `${total_number_of_explosions}d10!!`; var hiddenExplosionRoll = `@{whisper}&{template:hidden} {{character_name=@{character_name}}} {{roll=[[${totalRolledExplosionsRoll}]]}}`; startRoll(hiddenExplosionRoll, function(hiddenExplosionResults) { finishRoll(hiddenExplosionResults.rollId, {}); var unaltered_hidden_explosion_roll_array = Array.from(hiddenExplosionResults.results.roll.dice); var hidden_explosion_roll_array = Array.from(hiddenExplosionResults.results.roll.dice); var hidden_explosion_roll_array_has_value = isItEmpty(hidden_explosion_roll_array); if(!hidden_explosion_roll_array_has_value){ hidden_explosion_roll_array.forEach(function(value,i,arr) { value = parseInt(value,10)||0; var true_value = Math.round(value + 10); hidden_explosion_roll_array[i] = true_value; }); } else{} var unsorted_dice = hidden_roll_array.concat(hidden_explosion_roll_array); var unsorted_dice_joined = unsorted_dice.join(","); unsorted_dice_joined = `{${unsorted_dice_joined}}`; //THIS METHOD SIMPLY REBUILDS THE convertRoll INTO A GROUPED ROLL MODIFIER, ALLOWING IT TO "ROLL" //LIKE NORMAL. ALSO, YOU CAN ACCESS THE RESULTS OBJECT LIKE ANY OTHER ROLL AND ALLOWS FOR VIEWING //THE ROLL WHEN HOVERED, THOUGH IT ISN'T 100% PERFECT. var newConvertedRoll = `${unsorted_dice_joined}${keepHighOrLow}${total_number_dice_to_keep}${total_flat_modifier}`; //REPLACE "template:damage" WITH "template:" PLUS THE NAME OF YOUR ROLLTEMPLATE var theRoll = `@{whisper}&{template:damage} {{character_name=@{character_name}}} {{name=${name_value}}} {{roll_info=${convertedRollDisplay}}} {{called_raises=[[${raises_total_value}]]}} {{called_shot_raises=[[${raises_called_shots_total_value}]]}} {{roll=[[${newConvertedRoll}]]}}`; startRoll(theRoll, function(theResults) { finishRoll(theResults.rollId, {}); }); }); });