diff --git a/utils/combat-sim/app.js b/utils/combat-sim/app.js new file mode 100644 index 000000000..691a41c96 --- /dev/null +++ b/utils/combat-sim/app.js @@ -0,0 +1,138 @@ +var app = angular.module('app', ['nvd3']); + +app.controller('MainCtrl', function($scope, $interval) { + $scope.options = { + chart: { + type: 'discreteBarChart', + height: 450, + margin: { + top: 20, + right: 20, + bottom: 50, + left: 55 + }, + x: function(d) { + return d.label; + }, + y: function(d) { + return d.value + (1e-10); + }, + showValues: true, + valueFormat: function(d) { + return d3.format(',.2r')(d); + }, + duration: 500, + xAxis: { + axisLabel: 'D1-D20' + }, + yAxis: { + axisLabel: 'Count' + } + } + }; + + $scope.offense = 100; + $scope.defense = 100; + + $scope.data = [{ + key: "Cumulative Return", + values: [] + }]; + + for (var i = 0; i < 20; ++i) { + var value = { + "label": i + 1, + "value": 0 + }; + $scope.data[0].values.push(value); + } + + function addRoll(interval) { + $scope.data[0].values[interval - 1].value += 1; + } + + var stop; + $scope.clearData = function() { + console.log('Clearing data'); + for (var i = 0; i < 20; ++i) { + $scope.data[0].values[i].value = 0; + } + }; + + $scope.start = function() { + if (angular.isDefined(stop)) + return; + + stop = $interval(doCombatRound, 100); + }; + + $scope.stop = function() { + if (angular.isDefined(stop)) { + $interval.cancel(stop); + stop = undefined; + } + }; + + $scope.$on('$destroy', function() { + $scope.stop(); + }); + + function getRandomInt(min, max) { + min = Math.ceil(min); + max = Math.floor(max); + return Math.floor(Math.random() * (max - min)) + min; + } + + function getRandom(min, max) { + return Math.random() * (max - min) + min; + } + + function addChance(bucket, chance, value) { + for (var i = 0; i < chance; ++i) { + bucket.push(value); + } + } + + function doCombatRound() { + var offense = $scope.offense; + var defense = $scope.defense; + defense = defense - ((defense - offense) / 2.0); + var diff = offense - defense; + var mean = 0.0; + var mult1 = 0.0; + var mult2 = 0.0; + + if (offense > 30.0) { + mult1 = offense / 200.0 + 25.75; + if ((defense / offense) < 0.35) { + mult1 = mult1 + 1.0; + } else if ((defense / offense) > 0.65) { + mult1 = mult1 - 1.0; + } + mult2 = offense / 140 + 18.5; + } else { + mult1 = 11.5 + offense / 2.0; + mult2 = 14.0 + offense / 6.0; + } + + if (offense > defense) { + mean = diff / offense * mult1; + } else if (defense > offense) { + mean = diff / defense * mult2; + } + + var stddev = 8.8; + var theta = 2 * Math.PI * getRandom(0.0, 1.0); + var rho = Math.sqrt(-2 * Math.log(1 - getRandom(0.0, 1.0))); + var d = mean + stddev * rho * Math.cos(theta); + + if (d < -9.5) { + d = -9.5; + } else if (d > 9.5) { + d = 9.5; + } + d = d + 11; + addRoll(parseInt(d)); + }; +}); + diff --git a/utils/combat-sim/index.html b/utils/combat-sim/index.html new file mode 100644 index 000000000..783177051 --- /dev/null +++ b/utils/combat-sim/index.html @@ -0,0 +1,30 @@ + + +
+ +