wartab

Untitled

Jan 12th, 2022
1,070
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. let {calculate, Pokemon, Move} = require("@smogon/calc");
  2.  
  3. let scratch = new Move(7, "Scratch");
  4. let tackle = new Move(7, "Tackle");
  5. let qa = new Move(7, "Quick Attack");
  6.  
  7. let scratchCrit = new Move(7, "Scratch", {isCrit: true});
  8. let qaCrit = new Move(7, "Quick Attack", {isCrit: true});
  9.  
  10. function randomInt(min, max) {
  11.     return Math.floor(Math.random() * (max - min + 1)) + min;
  12. }
  13.  
  14.  
  15. let chimchar;
  16.  
  17. function simulateBattle(strategy) {
  18.     chimchar.hp = chimchar.pokemon.rawStats.hp;
  19.     chimchar.maxHp = chimchar.pokemon.rawStats.hp;
  20.     chimchar.pokemon.boosts.atk = 0;
  21.  
  22.  
  23.  
  24.     starly.hp = starly.pokemon.rawStats.hp;
  25.     starly.maxHp = starly.pokemon.rawStats.hp;
  26.     starly.pokemon.boosts.def = 0;
  27.  
  28.     let chimcharFaster = chimchar.pokemon.rawStats.spe > starly.pokemon.rawStats.spe;
  29.     let chimcharTied = chimchar.pokemon.rawStats.spe === starly.pokemon.rawStats.spe;
  30.  
  31.     let healRoll = calculate(7, starly.pokemon, chimchar.pokemon, qa).damage[14];
  32.  
  33.     let potionCount = 10;
  34.  
  35.     switch (strategy) {
  36.         case 1: { // Spam Scratch
  37.             for (let turn = 1;; ++turn) {
  38.  
  39.                 let selectedMove = randomInt(0, 2);
  40.  
  41.                 let crit, chimcharRolls, starlyRolls;
  42.  
  43.                 let needPotion = chimchar.hp <= healRoll && potionCount > 0;
  44.  
  45.                 let chimcharGoesFirst = (chimcharFaster || (chimcharTied && randomInt(0, 1) === 0)) && selectedMove !== 0;
  46.  
  47.                 if (selectedMove < 2) {
  48.                     crit = randomInt(0, 23) === 0;
  49.                     starlyRolls = calculate(7, starly.pokemon, chimchar.pokemon, crit ? qaCrit : qa).damage;
  50.                 }
  51.  
  52.                 if (!needPotion) {
  53.                     crit = randomInt(0, 23) === 0;
  54.  
  55.                     // Attack with Scratch
  56.                     chimcharRolls = calculate(7, chimchar.pokemon, starly.pokemon, crit ? scratchCrit : scratch).damage;
  57.                 }
  58.  
  59.                 if (chimcharGoesFirst || needPotion) {
  60.                     if (needPotion) {
  61.                         --potionCount;
  62.                         if (potionCount === 0) {
  63.                             console.log("Ran out of potions!");
  64.                         }
  65.                         chimchar.hp = chimchar.maxHp;
  66.                     } else {
  67.                         starly.hp -= chimcharRolls[randomInt(0, 15)];
  68.  
  69.                         if (starly.hp <= 0) {
  70.                             return {win: true, turn: turn};
  71.                         }
  72.                     }
  73.  
  74.                     if (selectedMove === 2) {
  75.                         chimchar.pokemon.boosts.atk = Math.max(-6, chimchar.pokemon.boosts.atk - 1);
  76.                     } else {
  77.                         chimchar.hp -= starlyRolls[randomInt(0, 15)];
  78.  
  79.                         if (chimchar.hp <= 0) {
  80.                             return {win: false, turn: turn};
  81.                         }
  82.                     }
  83.                 } else {
  84.                     if (selectedMove === 2) {
  85.                         chimchar.pokemon.boosts.atk = Math.max(-6, chimchar.pokemon.boosts.atk - 1);
  86.                     } else {
  87.                         chimchar.hp -= starlyRolls[randomInt(0, 15)];
  88.  
  89.                         if (chimchar.hp <= 0) {
  90.                             return {win: false, turn: turn};
  91.                         }
  92.                     }
  93.                     starly.hp -= chimcharRolls[randomInt(0, 15)];
  94.  
  95.                     if (starly.hp <= 0) {
  96.                         return {win: true, turn: turn};
  97.                     }
  98.                 }
  99.             }
  100.         }
  101.  
  102.         case 2: { // Leer, then spam Scratch
  103.             for (let turn = 1;; ++turn) {
  104.  
  105.                 let selectedMove = randomInt(0, 2);
  106.  
  107.                 let crit, chimcharRolls, starlyRolls;
  108.  
  109.                 let needPotion = chimchar.hp <= healRoll;
  110.  
  111.                 let chimcharGoesFirst = (chimcharFaster || (chimcharTied && randomInt(0, 1) === 0)) && selectedMove !== 0;
  112.  
  113.                 if (selectedMove < 2) {
  114.                     crit = randomInt(0, 23) === 0;
  115.                     starlyRolls = calculate(7, starly.pokemon, chimchar.pokemon, crit ? qaCrit : qa).damage;
  116.                 }
  117.  
  118.                 if (!needPotion) {
  119.                     crit = randomInt(0, 23) === 0;
  120.  
  121.                     // Attack with Scratch
  122.                     chimcharRolls = calculate(7, chimchar.pokemon, starly.pokemon, crit ? scratchCrit : scratch).damage;
  123.                 }
  124.  
  125.                 if (chimcharGoesFirst || needPotion) {
  126.                     if (needPotion) {
  127.                         --potionCount;
  128.                         if (potionCount === 0) {
  129.                             console.log("Ran out of potions!");
  130.                         }
  131.                         chimchar.hp = chimchar.maxHp;
  132.                     } else {
  133.                         if (turn === 1) {
  134.                             starly.pokemon.boosts.def = -1;
  135.                         } else {
  136.                             starly.hp -= chimcharRolls[randomInt(0, 15)];
  137.  
  138.                             if (starly.hp <= 0) {
  139.                                 return {win: true, turn: turn};
  140.                             }
  141.                         }
  142.                     }
  143.  
  144.                     if (selectedMove === 2) {
  145.                         chimchar.pokemon.boosts.atk = Math.max(-6, chimchar.pokemon.boosts.atk - 1);
  146.                     } else {
  147.                         chimchar.hp -= starlyRolls[randomInt(0, 15)];
  148.  
  149.                         if (chimchar.hp <= 0) {
  150.                             return {win: false, turn: turn};
  151.                         }
  152.                     }
  153.                 } else {
  154.                     if (selectedMove === 2) {
  155.                         chimchar.pokemon.boosts.atk = Math.max(-6, chimchar.pokemon.boosts.atk - 1);
  156.                     } else {
  157.                         chimchar.hp -= starlyRolls[randomInt(0, 15)];
  158.  
  159.                         if (chimchar.hp <= 0) {
  160.                             return {win: false, turn: turn};
  161.                         }
  162.                     }
  163.                     if (turn === 1) {
  164.                         starly.pokemon.boosts.def = -1;
  165.                     } else {
  166.                         starly.hp -= chimcharRolls[randomInt(0, 15)];
  167.  
  168.                         if (starly.hp <= 0) {
  169.                             return {win: true, turn: turn};
  170.                         }
  171.                     }
  172.  
  173.                     if (starly.hp <= 0) {
  174.                         return {win: true, turn: turn};
  175.                     }
  176.                 }
  177.             }
  178.         }
  179.  
  180.         case 3: { // Scratch, Leer only if Growl, Scratch spam
  181.  
  182.             let growlUsedTurn1 = false;
  183.  
  184.             for (let turn = 1;; ++turn) {
  185.  
  186.                 let selectedMove = randomInt(0, 2);
  187.  
  188.                 let crit, chimcharRolls, starlyRolls;
  189.  
  190.                 let needPotion = chimchar.hp <= healRoll;
  191.  
  192.                 let chimcharGoesFirst = (chimcharFaster || (chimcharTied && randomInt(0, 1) === 0)) && selectedMove !== 0;
  193.  
  194.                 if (selectedMove < 2) {
  195.                     crit = randomInt(0, 23) === 0;
  196.                     starlyRolls = calculate(7, starly.pokemon, chimchar.pokemon, crit ? qaCrit : qa).damage;
  197.                 }
  198.  
  199.                 if (!needPotion) {
  200.                     crit = randomInt(0, 23) === 0;
  201.  
  202.                     // Attack with Scratch
  203.                     chimcharRolls = calculate(7, chimchar.pokemon, starly.pokemon, crit ? scratchCrit : scratch).damage;
  204.                 }
  205.  
  206.                 if (chimcharGoesFirst || needPotion) {
  207.                     if (needPotion) {
  208.                         --potionCount;
  209.                         if (potionCount === 0) {
  210.                             console.log("Ran out of potions!");
  211.                         }
  212.                         chimchar.hp = chimchar.maxHp;
  213.                     } else {
  214.                         if (turn === 2 && growlUsedTurn1) {
  215.                             starly.pokemon.boosts.def = -1;
  216.                         } else {
  217.                             starly.hp -= chimcharRolls[randomInt(0, 15)];
  218.  
  219.                             if (starly.hp <= 0) {
  220.                                 return {win: true, turn: turn};
  221.                             }
  222.                         }
  223.                     }
  224.  
  225.                     if (selectedMove === 2) {
  226.                         if (turn === 1) {
  227.                             growlUsedTurn1 = true;
  228.                         }
  229.                         chimchar.pokemon.boosts.atk = Math.max(-6, chimchar.pokemon.boosts.atk - 1);
  230.                     } else {
  231.                         chimchar.hp -= starlyRolls[randomInt(0, 15)];
  232.  
  233.                         if (chimchar.hp <= 0) {
  234.                             return {win: false, turn: turn};
  235.                         }
  236.                     }
  237.                 } else {
  238.                     if (selectedMove === 2) {
  239.                         if (turn === 1) {
  240.                             growlUsedTurn1 = true;
  241.                         }
  242.                         chimchar.pokemon.boosts.atk = Math.max(-6, chimchar.pokemon.boosts.atk - 1);
  243.                     } else {
  244.                         chimchar.hp -= starlyRolls[randomInt(0, 15)];
  245.  
  246.                         if (chimchar.hp <= 0) {
  247.                             return {win: false, turn: turn};
  248.                         }
  249.                     }
  250.                     if (turn === 2 && growlUsedTurn1) {
  251.                         starly.pokemon.boosts.def = -1;
  252.                     } else {
  253.                         starly.hp -= chimcharRolls[randomInt(0, 15)];
  254.  
  255.                         if (starly.hp <= 0) {
  256.                             return {win: true, turn: turn};
  257.                         }
  258.                     }
  259.  
  260.                     if (starly.hp <= 0) {
  261.                         return {win: true, turn: turn};
  262.                     }
  263.                 }
  264.             }
  265.         }
  266.     }
  267. }
  268.  
  269.  
  270.  
  271.  
  272. let starly = {
  273.     pokemon: new Pokemon(7, "Starly", {
  274.         ivs: {hp: 0, atk: 0, def: 0, spa: 0, spd: 0, spe: 0},
  275.         evs: {hp: 0, atk: 0, def: 0, spa: 0, spd: 0, spe: 0},
  276.         nature: "Jolly",
  277.         level: 5,
  278.     }),
  279.     hp: 0,
  280.     maxHp: 0,
  281. };
  282.  
  283.  
  284. let it = 0;
  285.  
  286. for (let atk = 10; atk <= 13; ++atk) {
  287.  
  288.     let atkIv;
  289.     let atkEvs;
  290.  
  291.     switch (atk) {
  292.         case 10: atkIv = 0; atkEvs = 0; break;
  293.         case 11: atkIv = 4; atkEvs = 0; break;
  294.         case 12: atkIv = 31; atkEvs = 0; break;
  295.         case 13: atkIv = 31; atkEvs = 52; break;
  296.     }
  297.  
  298.     for (let def = 8; def <= 11; ++def) {
  299.         if (def === 10) {
  300.             continue;
  301.         }
  302.  
  303.         let defIv;
  304.         let defEvs;
  305.  
  306.         switch (def) {
  307.             case 8: defIv = 0; defEvs = 0; break;
  308.             case 9: defIv = 31; defEvs = 0; break;
  309.             case 11: defIv = 31; defEvs = 4; break;
  310.         }
  311.  
  312.         let nature = def === 8 ? "Mild" : "Serious";
  313.  
  314.         for (let spd = 11; spd <= 13; ++spd) {
  315.  
  316.             let spdIv;
  317.             let spdEvs;
  318.  
  319.             switch (spd) {
  320.                 case 11: spdIv = 0; spdEvs = 0; break;
  321.                 case 12: spdIv = 31; spdEvs = 0; break;
  322.                 case 13: spdIv = 31; spdEvs = 36; break;
  323.             }
  324.  
  325.             ++it;
  326.  
  327.             if (it <= 4) {
  328.                 continue;
  329.             }
  330.  
  331.             chimchar = {
  332.                 pokemon: new Pokemon(7, "Chimchar", {
  333.                     ivs: {hp: 31, atk: atkIv, def: defIv, spa: 0, spd: 0, spe: spdIv},
  334.                     evs: {hp: 0, atk: atkEvs, def: defEvs, spa: 0, spd: 0, spe: spdEvs}, // 52 Attack 4 Def 36 Spd
  335.                     nature: nature,
  336.                     level: 5,
  337.                 }),
  338.                 hp: 0,
  339.                 maxHp: 0,
  340.             };
  341.  
  342.             console.log(chimchar.pokemon.rawStats.hp + " " + chimchar.pokemon.rawStats.atk + " " + chimchar.pokemon.rawStats.def + " " + chimchar.pokemon.rawStats.spe);
  343.  
  344.             let wins = 0;
  345.             let totalTurns = 0;
  346.  
  347.             for (let i = 0; i < 100000; ++i) {
  348.                 let outcome = simulateBattle(1);
  349.                 if (outcome.win) {
  350.                     wins++;
  351.  
  352.                     totalTurns += outcome.turn;
  353.                 }
  354.             }
  355.  
  356.             console.log(`Strategy 1: Win Rate: ${(wins / 1000).toFixed(2)}; Averge turns: ${totalTurns / wins}`);
  357.  
  358.  
  359.             wins = 0;
  360.             totalTurns = 0;
  361.  
  362.             for (let i = 0; i < 100000; ++i) {
  363.                 let outcome = simulateBattle(2);
  364.                 if (outcome.win) {
  365.                     wins++;
  366.  
  367.                     totalTurns += outcome.turn;
  368.                 }
  369.             }
  370.  
  371.             console.log(`Strategy 2: Win Rate: ${(wins / 1000).toFixed(2)}; Averge turns: ${totalTurns / wins}`);
  372.  
  373.             wins = 0;
  374.             totalTurns = 0;
  375.  
  376.             for (let i = 0; i < 100000; ++i) {
  377.                 let outcome = simulateBattle(3);
  378.                 if (outcome.win) {
  379.                     wins++;
  380.  
  381.                     totalTurns += outcome.turn;
  382.                 }
  383.             }
  384.  
  385.             console.log(`Strategy 3: Win Rate: ${(wins / 1000).toFixed(2)}; Averge turns: ${totalTurns / wins}`);
  386.  
  387.  
  388.  
  389.         }
  390.     }
  391. }
  392.  
  393.  
Advertisement
Add Comment
Please, Sign In to add comment