56 lines
No EOL
994 B
JavaScript
56 lines
No EOL
994 B
JavaScript
const app = new Vue({
|
|
el: `#app`,
|
|
data: {
|
|
options: [],
|
|
chosen: null,
|
|
},
|
|
computed: {
|
|
totalWeight() {
|
|
return this.options
|
|
.filter(c => {
|
|
try { parseInt(c.weight) }
|
|
catch (e) { return false };
|
|
return true;
|
|
})
|
|
.reduce(
|
|
(p, c) => p + parseInt(c.weight),
|
|
0
|
|
);
|
|
},
|
|
},
|
|
methods: {
|
|
addOption() {
|
|
this.options.push({
|
|
name: ``,
|
|
weight: ``,
|
|
chance: ``,
|
|
});
|
|
},
|
|
removeOption(i) {
|
|
this.options.splice(i, 1);
|
|
this.updateChanceValues();
|
|
},
|
|
pickAnOption() {
|
|
let choice = Math.floor(Math.random() * this.totalWeight);
|
|
|
|
let min = 0;
|
|
for (const opt of this.options) {
|
|
let max = min + parseInt(opt.weight);
|
|
if (choice < max) {
|
|
this.chosen = opt;
|
|
return;
|
|
};
|
|
min = max;
|
|
};
|
|
},
|
|
updateChanceValues() {
|
|
for (const opt of this.options) {
|
|
if (!opt.weight) {
|
|
opt.chance = ``;
|
|
} else {
|
|
opt.chance = Math.round(opt.weight / this.totalWeight * 100 );
|
|
};
|
|
};
|
|
},
|
|
},
|
|
}) |