JSFiddle - React, Tailwind, and code Playground

by Daedalus

HTML

<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular.min.js"></script>
<div ng-app="dc_gen">
    <div ng-controller="dc">Minimum endurance/luck bonus:
        <input type="number" ng-model="model.minEnd" ng-change="averageDCs()" />
        <br />Maximum endurance/luck bonus:
        <input type="number" ng-model="model.maxEnd" ng-change="averageDCs()" />
        <br />Entrants:
        <input type="number" ng-model="model.entrants" ng-change="averageDCs()" />
        <br />Highest roll DC:
        <input type="number" ng-model="model.rollMult" ng-change="averageDCs()" />
        <br />
        <div ng-repeat="average in averages"> <strong>Level:  </strong>{{average.level}}
            <br /> <strong>Average roll:  </strong>d{{average.baseDie}}+{{average.bonus}}
            <br /> <strong>Max roll:  </strong>{{average.maxRoll}}
            <br /> <strong>Objectives: </strong>

            <br />
            <ul>
                <li ng-repeat="obj in average.objs"><strong>Objective {{$index + 1}}: {{obj.dc}}</strong>
                </li>
            </ul>
            <br /> <strong>Cumulative DC: </strong>{{average.dc}}
            <br />
            <br />
            <br />
        </div>
    </div>
</div>

JavaScript

var dc_gen = angular.module('dc_gen', []).controller('dc', ['$scope', function ($scope) {
    var rand = function (min, max) {
        return Math.floor((Math.random() * max) + min);
    }

    var shuffle = function (array) {
        var currentIndex = array.length,
            temporaryValue, randomIndex;

        // While there remain elements to shuffle...
        while (0 !== currentIndex) {

            // Pick a remaining element...
            randomIndex = Math.floor(Math.random() * currentIndex);
            currentIndex -= 1;

            // And swap it with the current element.
            temporaryValue = array[currentIndex];
            array[currentIndex] = array[randomIndex];
            array[randomIndex] = temporaryValue;
        }

        return array;
    }

    var averageDCs = function (minEnd, maxEnd, entrants, rollMult) {
        var minEndLuc = parseInt(minEnd, 10),
            maxEndLuc = parseInt(maxEnd, 10),
            entrants = parseInt(entrants, 10),
            rollMult = parseFloat(rollMult, 10);
        var averages = [];
        for (var level = 5; level <= 50; level = level + 5) {
            var average = 0;

            for (var i = 0; i < entrants; i++) {
                var bonus = rand(minEndLuc, maxEndLuc) + 15 + 5 + level;
                average += bonus;
            }
            var average_bonus = average / entrants,
                baseDie = ((Math.floor((average_bonus / 5)) * 5) * 2 + 10),
                objs = [],
                dc = 0;
            for (var i = 0; i < 5; i++) {
                var mult = 1;
                if (i < 4) {
                    mult = (i + 1);
                } else {
                    mult = (i + .9)
                }
                objs.push({
                    dc: Math.floor(((baseDie + Math.floor(average_bonus)) / 5) * mult)
                });
                dc += Math.floor(((baseDie + Math.floor(average_bonus)) / 5) * mult);
            }
            shuffle(objs);
    ...