Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- const playerTable = [
- { role: 'healer', survi: 80 },
- { role: 'tank', survi: 90 },
- { role: 'healer', survi: 90 },
- { role: 'dps', survi: 91 },
- { role: 'dps', survi: 92 },
- { role: 'dps', survi: 93 },
- { role: 'dps', survi: 94 },
- { role: 'healer', survi: 94 },
- { role: 'healer', survi: 95 },
- { role: 'dps', survi: 96 },
- { role: 'dps', survi: 96 },
- { role: 'dps', survi: 96 },
- { role: 'dps', survi: 95 },
- { role: 'dps', survi: 95 },
- { role: 'dps', survi: 95 },
- { role: 'dps', survi: 97 },
- { role: 'dps', survi: 98 },
- { role: 'dps', survi: 98 },
- { role: 'dps', survi: 80 },
- { role: 'tank', survi: 98 },
- ];
- // ideal
- const playerTableIdeal = [
- { role: 'tank', survi: 98 },
- { role: 'tank', survi: 98 },
- { role: 'healer', survi: 98 },
- { role: 'healer', survi: 98 },
- { role: 'healer', survi: 98 },
- { role: 'healer', survi: 98 },
- { role: 'dps', survi: 98 },
- { role: 'dps', survi: 98 },
- { role: 'dps', survi: 98 },
- { role: 'dps', survi: 98 },
- { role: 'dps', survi: 98 },
- { role: 'dps', survi: 98 },
- { role: 'dps', survi: 98 },
- { role: 'dps', survi: 98 },
- { role: 'dps', survi: 98 },
- { role: 'dps', survi: 98 },
- { role: 'dps', survi: 98 },
- { role: 'dps', survi: 98 },
- { role: 'dps', survi: 98 },
- { role: 'dps', survi: 98 },
- ];
- const encounters = [
- {
- name: 'Wrathion',
- wipeCutOff: 2,
- dpsPenalty: 10,
- healerPenalty: 10,
- tankPenalty: 40,
- time: 8.5,
- },
- {
- name: 'Maut',
- wipeCutOff: 3,
- dpsPenalty: 10,
- healerPenalty: 20,
- tankPenalty: 50,
- time: 5.5,
- },
- {
- name: 'Skitra',
- wipeCutOff: 3,
- dpsPenalty: 10,
- healerPenalty: 20,
- tankPenalty: 40,
- time: 5,
- },
- {
- name: 'Hivemind',
- wipeCutOff: 3,
- dpsPenalty: 10,
- healerPenalty: 40,
- tankPenalty: 70,
- time: 7,
- },
- {
- name: 'Shadhar',
- wipeCutOff: 3,
- dpsPenalty: 10,
- healerPenalty: 30,
- tankPenalty: 70,
- time: 5,
- },
- ];
- const iterations = 100;
- const subIterations = 10;
- const trashTime = 10;
- const pullCd = 5;
- function roll() {
- return Math.floor(Math.random() * 101);
- }
- function toHHMM(minutes) {
- const m = Math.floor(minutes % 60);
- const h = Math.floor(minutes / 60);
- return (h < 10 ? '0' + h : h) + ':' + (m < 10 ? '0' + m : m) + 'm';
- }
- function simulateEncounter(encounter, pt) {
- let dpsDeaths = 0;
- let healerDeaths = 0;
- let tankDeaths = 0;
- let deaths = 0;
- for (const p of pt) {
- // if one dude die
- let realSurvi = p.survi;
- // player died
- if (roll() > realSurvi) {
- // if it was a healer
- switch (p.role) {
- case 'dps':
- dpsDeaths++;
- break;
- case 'healer':
- healerDeaths++;
- break;
- case 'tank':
- tankDeaths++;
- break;
- }
- deaths++;
- }
- }
- // additional chance of wipe
- const wipeChance = (dpsDeaths * encounter.dpsPenalty)
- + (healerDeaths * encounter.healerPenalty)
- + (tankDeaths * encounter.tankPenalty);
- if (roll() <= wipeChance) {
- return false;
- }
- return deaths < encounter.wipeCutOff;
- }
- function simulateRun(pt) {
- let time = 0;
- let wipes = 0;
- for (const encounter of encounters) {
- let result;
- let subWipes = 0;
- let totalTime = 0;
- // simulate the same encounter at least 3 times
- for (let i = 0; i < subIterations; i++) {
- result = false;
- while (!result) {
- result = simulateEncounter(encounter, pt);
- if (!result) {
- subWipes++;
- }
- totalTime += encounter.time + pullCd;
- }
- }
- time += totalTime / subIterations;
- wipes += subWipes / subIterations;
- time += trashTime;
- }
- // last iteration cut
- time -= trashTime;
- return {
- time: time,
- wipes: wipes
- };
- }
- function simulate(pt) {
- let totalWipes = 0;
- let totalRunTime = 0;
- let maxWipes = 0;
- let maxTime = 0;
- for (let i = 0; i < iterations; i++) {
- const result = simulateRun(pt);
- totalWipes += result.wipes;
- totalRunTime += result.time;
- if (maxWipes < result.wipes) {
- maxWipes = result.wipes;
- }
- if (maxTime < result.time) {
- maxTime = result.time;
- }
- }
- let averageRunTime = totalRunTime / iterations;
- let averageWipes = totalWipes / iterations;
- console.log('Average Run Time: ', toHHMM(averageRunTime));
- console.log('Average Wipes: ', Math.round(averageWipes * 10) / 10);
- console.log('Max Run Time: ', toHHMM(maxTime));
- console.log('Max Wipes: ', Math.round(maxWipes * 10) / 10);
- }
- simulate(playerTable);
- console.log('---------- VS Ideal ----------');
- simulate(playerTableIdeal);
- //document.querySelector('#app').innerHTML = averageRunTime;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement