Auto gym switch

Automatically switches your gym before training

当前为 2023-11-17 提交的版本,查看 最新版本

// ==UserScript==
// @name         Auto gym switch
// @namespace    https://gitgud.com/stephenlynx
// @version      1.1.2
// @description  Automatically switches your gym before training
// @author       Stephen Lynx
// @license      MIT
// @match        https://www.torn.com/gym.php
// @icon         https://www.google.com/s2/favicons?sz=64&domain=torn.com
// @run-at       document-start
// @grant        none
// ==/UserScript==
var lynx = {};

lynx.gymInfo = {
  1 : {
    'str': 2,
    'spe': 2,
    'def': 2,
    'dex': 2
  },
  2 : {
    'str': 2.4,
    'spe': 2.4,
    'def': 2.7,
    'dex': 2.4
  },
  3 : {
    'str': 2.7,
    'spe': 3.2,
    'def': 3.0,
    'dex': 2.7
  },
  4 : {
    'str': 3.2,
    'spe': 3.2,
    'def': 3.2,
    'dex': 0
  },
  5 : {
    'str': 3.4,
    'spe': 3.6,
    'def': 3.4,
    'dex': 3.2
  },
  6 : {
    'str': 3.4,
    'spe': 3.6,
    'def': 3.6,
    'dex': 3.8
  },
  7 : {
    'str': 3.7,
    'spe': 0,
    'def': 3.7,
    'dex': 3.7
  },
  8 : {
    'str': 4,
    'spe': 4,
    'def': 4,
    'dex': 4
  },
  9 : {
    'str': 4.8,
    'spe': 4.4,
    'def': 4,
    'dex': 4.2
  },
  10 : {
    'str': 4.4,
    'spe': 4.6,
    'def': 4.8,
    'dex': 4.4
  },
  11 : {
    'str': 5,
    'spe': 4.6,
    'def': 5.2,
    'dex': 4.6
  },
  12 : {
    'str': 5,
    'spe': 5.2,
    'def': 5,
    'dex': 5
  },
  13 : {
    'str': 5,
    'spe': 5.4,
    'def': 4.8,
    'dex': 5.2
  },
  14 : {
    'str': 5.5,
    'spe': 5.7,
    'def': 5.5,
    'dex': 5.2
  },
  15 : {
    'str': 0,
    'spe': 5.5,
    'def': 5.5,
    'dex': 5.7
  },
  16 : {
    'str': 6,
    'spe': 6,
    'def': 6,
    'dex': 6
  },
  17 : {
    'str': 6,
    'spe': 6.2,
    'def': 6.4,
    'dex': 6.2
  },
  18 : {
    'str': 6.5,
    'spe': 6.4,
    'def': 6.2,
    'dex': 6.2
  },
  19 : {
    'str': 6.4,
    'spe': 6.5,
    'def': 6.4,
    'dex': 6.8
  },
  20 : {
    'str': 6.4,
    'spe': 6.4,
    'def': 6.8,
    'dex': 7
  },
  21 : {
    'str': 7,
    'spe': 6.4,
    'def': 6.4,
    'dex': 6.5
  },
  22 : {
    'str': 6.8,
    'spe': 6.5,
    'def': 7,
    'dex': 6.5
  },
  23 : {
    'str': 6.8,
    'spe': 7,
    'def': 7,
    'dex': 6.8
  },
  24 : {
    'str': 7.3,
    'spe': 7.3,
    'def': 7.3,
    'dex': 7.3
  },
  25 : {
    'str': 0,
    'spe': 0,
    'def': 7.5,
    'dex': 7.5
  },
  26 : {
    'str': 7.5,
    'spe': 7.5,
    'def': 0,
    'dex': 0
  },
  27 : {
    'str': 8,
    'spe': 0,
    'def': 0,
    'dex': 0
  },
  28 : {
    'str': 0,
    'spe': 0,
    'def': 8,
    'dex': 0
  },
  29 : {
    'str': 0,
    'spe': 8,
    'def': 0,
    'dex': 0
  },
  30 : {
    'str': 0,
    'spe': 0,
    'def': 0,
    'dex': 8
  },
  31 : {
    'str': 9,
    'spe': 9,
    'def': 9,
    'dex': 9
  },
  32 : {
    'str': 10,
    'spe': 10,
    'def': 10,
    'dex': 10
  },
  33 : {
    'str': 3.4,
    'spe': 3.4,
    'def': 4.6,
    'dex': 0
  }
};

//lynx.currentGym is used to store the current gym being used
lynx.classList = ['specialist', 'heavyweight', 'middleweight', 'lightweight', 'jail'];

lynx.picks = {};

lynx.stats = ['str', 'def', 'spe', 'dex'];

lynx.checkGym = function(gymId) {

  lynx.gymInfo[gymId].checked = true;
  var gymStats = lynx.gymInfo[gymId];

  for (var i = 0; i < lynx.stats.length; i++) {

    var stat = lynx.stats[i];
    var pick = lynx.picks[stat]; //avoid unnecessary swaps when the gain is the same by using the more advanced gym
    if (gymStats[stat] && (!pick || pick.gain < gymStats[stat] || (pick.gain === gymStats[stat] && pick.id < gymId))) {
      lynx.picks[stat] = {
        id: gymId,
        gain: gymStats[stat]
      };
    }

  }

};

lynx.pickGyms = function(gymStatus) {

  for (var i = 0; i < lynx.classList.length; i++) {
    var gymClass = gymStatus[lynx.classList[i]];

    for (var j = 0; j < gymClass.length; j++) {
      var gym = gymClass[j];

      lynx.gymInfo[gym.id].name = gym.name;
      lynx.gymInfo[gym.id].cost = gym.energyCost;

      if (gym.status === 'locked' || gym.status === 'inProgress') {
        continue;
      }

      if (gym.status === 'active') {
        lynx.currentGym = gym.id;
      }

      lynx.checkGym(gym.id);

    }
  }

};

(function() {
  'use strict';

  var originalFetch = window.fetch;

  window.fetch = async function(...args) {

    if (!args[0].indexOf('/gym.php?step=train')) {

      var stat = JSON.parse(args[1].body).stat.substring(0, 3);

      var gymToUse = lynx.picks[stat].id;

      if (gymToUse !== lynx.currentGym) {

        var changeResult = await getAction({
          type: 'post',
          action: 'gym.php',
          data: {
            step: 'changeGym',
            gymID: gymToUse
          }
        });

        if (changeResult.success) {

          lynx.currentGym = gymToUse;

          try {
            var logo = document.getElementsByClassName('logo___iY1NL')[0];

            var newSrc = logo.src.split('/');
            newSrc[newSrc.length - 1] = gymToUse + '.png';
            logo.src = newSrc.join('/');

            var labelName = document.getElementsByClassName('notificationText___jArOy')[0].getElementsByTagName('b')[0];
            labelName.innerHTML = lynx.gymInfo[gymToUse].name;

            var listLabelEnergy = document.getElementsByClassName('description___h40Cs');
            for (var i = 0; i < listLabelEnergy.length; i++) {
              var label = listLabelEnergy[i].getElementsByTagName('p')[1];
              label.innerHTML = lynx.gymInfo[gymToUse].cost + ' energy per train';
            }

            document.getElementsByClassName('active___dgNyD')[0].classList.remove('active___dgNyD');
            document.getElementById('gym-' + gymToUse).classList.add("active___dgNyD");
          } catch (error) {
            console.log(error);
            return new Response(JSON.stringify({
              message: 'Gym changed but failed to update visual elements. Wait for patch.'
            }));
          }

        }

        return new Response(JSON.stringify({
          message: changeResult.message
        }));
      }

    }

    var result = await originalFetch(...args);

    if (!lynx.booted && !args[0].indexOf('/gym.php?step=getInitialGymInfo')) {

      lynx.booted = true;

      var jsonData = await result.clone().json();

      lynx.pickGyms(jsonData.gyms);

    } else if (!args[0].indexOf('/gym.php?step=changeGym')) {
      lynx.currentGym = JSON.parse(args[1].body).gymID;

      if (!lynx.gymInfo[lynx.currentGym].checked) {
        lynx.checkGym(lynx.currentGym);
      }
    }

    return result;
  };

})();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址