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);
...