Dev Blog #11 - Customizable Rolls

Dev Blog #11 - Customizable Rolls

Multiverse Team

Hi everyone! It’s Janie, Engineer and Game Designer here at Multiverse. I’ve been spending the past month working on an exciting new feature for Multiverse - customizable dice systems! "What dice system does Multiverse use?" has been one of the most asked questions about the platform. Players want to know if they'll be able to play their favorite TTRPG on Multiverse, and designers want to know if they'll be stuck with a one-size-fits-all solution. With these concerns in mind, I set out to build a system that would be as flexible and customizable as possible!

The New Rolls System

A walkthrough of rolls, from defining the roll type in the game collections, to editing a roll function, to activating the roll in play.

Dice systems now work like this on Multiverse: A game designer can define many different types of rolls for their game. Roll types are totally customizable, from the inputs that will show up on the setup screen, to the mechanics of how the roll works, to the results shown after a roll occurs.

Designers on Multiverse will have full control of the mechanics of their dice systems through defining Roll Functions. Roll Functions are (for now) Javascript functions that take in inputs as arguments, roll dice, and return results.

For example, here is a roll function for a 2d6 Powered by the Apocalypse system like The Sprawl:

var d1 = Rolls.rollDie("d6");
var d2 = Rolls.rollDie("d6");
var resVal = d1 + d2 + stat + adjustment;

if (resVal < 6){
    return results.failure;
}
if (resVal < 10){
    return results.mixed
}
return results.success;

Here's another for a Forged in the Dark system like Beam Saber:

let dice = [];
let resVal = 0;

if (numDice <= 0) {
    dice.push(Rolls.rollDie("d6"));
    dice.push(Rolls.rollDie("d6"));

    resVal = Math.min(...dice);
}
else {
    for (var i = 0; i < numDice; i++) {
        dice.push(Rolls.rollDie("d6"));
    }
    
    resVal = Math.max(...dice);
}

if (resVal <= 3) {
    return results.failure;
}
if (resVal < 6) {
    return results.mixed;
}
return results.success;

And here's a simple one for a custom D20 system

var die = Rolls.rollDie("d20");
if (die + stat + adjustment > difficulty) {
    return results.success;
}
return results.failure;

Every aspect of these functions, from the inputs used ('stat', 'adjustment', 'difficulty'), to the results ('success', 'failure', 'mixed'), can be customized by game designers. By defining roll mechanics as functions, designers are free to make any kind of dice systems they want, even ones that couldn't exist in real life! Oh and you can define custom dice too. Want a trick d6 that always rolls 6s? You got it. A d100 with a built in bell curve? Can do.

What's Next for Rolls

In the future, we're looking to improve rolls to make building games in Multiverse as straightforward as possible.

One step we want to take is to integrate Blockly, a visual programming language, into the roll system editor. It would empower game designers to build roll functions without needing to write any code directly. This will hopefully make roll systems more accessible, and easier to test and debug. We decided to use roll functions to allow for maximum flexibility for designers. Ultimately though, you shouldn't have to know Javascript to make a game on Multiverse. With Blockly, soon you wont.

The only limit on dice systems on Multiverse is your imagination. Complex and crunchy or streamlined and evocative, whatever you make will work seamlessly with the rest of the platform. So keep pushing, and come up with something the world has never seen before!