Advertisement
Guest User

Untitled

a guest
Mar 3rd, 2020
47
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. const playerTable = [
  2.     { role: 'healer', survi: 80 },
  3.     { role: 'tank', survi: 90 },
  4.     { role: 'healer', survi: 90 },
  5.     { role: 'dps', survi: 91 },
  6.     { role: 'dps', survi: 92 },
  7.     { role: 'dps', survi: 93 },
  8.     { role: 'dps', survi: 94 },
  9.     { role: 'healer', survi: 94 },
  10.     { role: 'healer', survi: 95 },
  11.     { role: 'dps', survi: 96 },
  12.     { role: 'dps', survi: 96 },
  13.     { role: 'dps', survi: 96 },
  14.     { role: 'dps', survi: 95 },
  15.     { role: 'dps', survi: 95 },
  16.     { role: 'dps', survi: 95 },
  17.     { role: 'dps', survi: 97 },
  18.     { role: 'dps', survi: 98 },
  19.     { role: 'dps', survi: 98 },
  20.     { role: 'dps', survi: 80 },
  21.     { role: 'tank', survi: 98 },
  22. ];
  23.  
  24. // ideal
  25. const playerTableIdeal = [
  26.     { role: 'tank', survi: 98 },
  27.     { role: 'tank', survi: 98 },
  28.     { role: 'healer', survi: 98 },
  29.     { role: 'healer', survi: 98 },
  30.     { role: 'healer', survi: 98 },
  31.     { role: 'healer', survi: 98 },
  32.     { role: 'dps', survi: 98 },
  33.     { role: 'dps', survi: 98 },
  34.     { role: 'dps', survi: 98 },
  35.     { role: 'dps', survi: 98 },
  36.     { role: 'dps', survi: 98 },
  37.     { role: 'dps', survi: 98 },
  38.     { role: 'dps', survi: 98 },
  39.     { role: 'dps', survi: 98 },
  40.     { role: 'dps', survi: 98 },
  41.     { role: 'dps', survi: 98 },
  42.     { role: 'dps', survi: 98 },
  43.     { role: 'dps', survi: 98 },
  44.     { role: 'dps', survi: 98 },
  45.     { role: 'dps', survi: 98 },
  46. ];
  47.  
  48. const encounters = [
  49.     {
  50.         name: 'Wrathion',
  51.         wipeCutOff: 2,
  52.         dpsPenalty: 10,
  53.         healerPenalty: 10,
  54.         tankPenalty: 40,
  55.         time: 8.5,
  56.     },
  57.     {
  58.         name: 'Maut',
  59.         wipeCutOff: 3,
  60.         dpsPenalty: 10,
  61.         healerPenalty: 20,
  62.         tankPenalty: 50,
  63.         time: 5.5,
  64.     },
  65.     {
  66.         name: 'Skitra',
  67.         wipeCutOff: 3,
  68.         dpsPenalty: 10,
  69.         healerPenalty: 20,
  70.         tankPenalty: 40,
  71.         time: 5,
  72.     },
  73.     {
  74.         name: 'Hivemind',
  75.         wipeCutOff: 3,
  76.         dpsPenalty: 10,
  77.         healerPenalty: 40,
  78.         tankPenalty: 70,
  79.         time: 7,
  80.     },
  81.     {
  82.         name: 'Shadhar',
  83.         wipeCutOff: 3,
  84.         dpsPenalty: 10,
  85.         healerPenalty: 30,
  86.         tankPenalty: 70,
  87.         time: 5,
  88.     },
  89. ];
  90.  
  91. const iterations = 100;
  92. const subIterations = 10;
  93. const trashTime = 10;
  94. const pullCd = 5;
  95.  
  96. function roll() {
  97.     return Math.floor(Math.random() * 101);
  98. }
  99.  
  100. function toHHMM(minutes) {
  101.     const m = Math.floor(minutes % 60);
  102.     const h = Math.floor(minutes / 60);
  103.     return (h < 10 ? '0' + h : h) + ':' + (m < 10 ? '0' + m : m) + 'm';
  104. }
  105.  
  106. function simulateEncounter(encounter, pt) {
  107.     let dpsDeaths = 0;
  108.     let healerDeaths = 0;
  109.     let tankDeaths = 0;
  110.     let deaths = 0;
  111.  
  112.     for (const p of pt) {
  113.         // if one dude die
  114.         let realSurvi = p.survi;
  115.  
  116.         // player died
  117.         if (roll() > realSurvi) {
  118.             // if it was a healer
  119.             switch (p.role) {
  120.                 case 'dps':
  121.                     dpsDeaths++;
  122.                     break;
  123.                 case 'healer':
  124.                     healerDeaths++;
  125.                     break;
  126.                 case 'tank':
  127.                     tankDeaths++;
  128.                     break;
  129.             }
  130.  
  131.             deaths++;
  132.         }
  133.     }
  134.  
  135.     // additional chance of wipe
  136.     const wipeChance = (dpsDeaths * encounter.dpsPenalty)
  137.         + (healerDeaths * encounter.healerPenalty)
  138.         + (tankDeaths * encounter.tankPenalty);
  139.  
  140.     if (roll() <= wipeChance) {
  141.         return false;
  142.     }
  143.  
  144.     return deaths < encounter.wipeCutOff;
  145. }
  146.  
  147. function simulateRun(pt) {
  148.     let time = 0;
  149.     let wipes = 0;
  150.     for (const encounter of encounters) {
  151.         let result;
  152.  
  153.         let subWipes = 0;
  154.         let totalTime = 0;
  155.  
  156.         // simulate the same encounter at least 3 times
  157.         for (let i = 0; i < subIterations; i++) {
  158.             result = false;
  159.             while (!result) {
  160.                 result = simulateEncounter(encounter, pt);
  161.                 if (!result) {
  162.                     subWipes++;
  163.                 }
  164.                 totalTime += encounter.time + pullCd;
  165.             }
  166.         }
  167.         time += totalTime / subIterations;
  168.         wipes += subWipes / subIterations;
  169.         time += trashTime;
  170.     }
  171.  
  172.     // last iteration cut
  173.     time -= trashTime;
  174.  
  175.     return {
  176.         time: time,
  177.         wipes: wipes
  178.     };
  179. }
  180.  
  181. function simulate(pt) {
  182.     let totalWipes = 0;
  183.     let totalRunTime = 0;
  184.     let maxWipes = 0;
  185.     let maxTime = 0;
  186.  
  187.     for (let i = 0; i < iterations; i++) {
  188.         const result = simulateRun(pt);
  189.         totalWipes += result.wipes;
  190.         totalRunTime += result.time;
  191.  
  192.         if (maxWipes < result.wipes) {
  193.             maxWipes = result.wipes;
  194.         }
  195.  
  196.         if (maxTime < result.time) {
  197.             maxTime = result.time;
  198.         }
  199.     }
  200.  
  201.     let averageRunTime = totalRunTime / iterations;
  202.     let averageWipes = totalWipes / iterations;
  203.  
  204.     console.log('Average Run Time: ', toHHMM(averageRunTime));
  205.     console.log('Average Wipes: ', Math.round(averageWipes * 10) / 10);
  206.     console.log('Max Run Time: ', toHHMM(maxTime));
  207.     console.log('Max Wipes: ', Math.round(maxWipes * 10) / 10);
  208. }
  209.  
  210. simulate(playerTable);
  211. console.log('---------- VS Ideal ----------');
  212. simulate(playerTableIdeal);
  213.  
  214. //document.querySelector('#app').innerHTML = averageRunTime;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement