PhotonGT's Prodigy Cheat

Prodigy Math cheat menu

// ==UserScript==
// @license MIT
// @name         PhotonGT's Prodigy Cheat
// @namespace    http://tampermonkey.net/
// @version      1.0
// @description  Prodigy Math cheat menu
// @author       PhotonGT
// @match        *://*.prodigygame.com/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=prodigygame.com
// @grant        none
// @run-at       document-end
// ==/UserScript==

(function() {
  'use strict';

  const currentURL = window.location.href;
  if (!currentURL.startsWith("https://math.prodigygame.com/?launcher=true&code=")) return;

  // --- Menu Setup ---
  const menu = document.createElement('div');
  menu.style.position = 'fixed';
  menu.style.top = '10px';
  menu.style.right = '10px';
  menu.style.background = 'rgba(0,0,0,0.8)';
  menu.style.color = '#fff';
  menu.style.padding = '10px';
  menu.style.borderRadius = '8px';
  menu.style.fontFamily = 'monospace';
  menu.style.zIndex = 9999;
  menu.style.width = '280px';
  menu.style.userSelect = 'none';
  menu.style.boxShadow = '0 0 10px #0ff';
  menu.tabIndex = 0; // allow input focus & backspace

  // Title (drag handle)
  const title = document.createElement('div');
  title.textContent = 'Prodigy Cheat Menu';
  title.style.fontWeight = 'bold';
  title.style.marginBottom = '8px';
  title.style.cursor = 'move';
  menu.appendChild(title);

  // --- Gold input ---
  const goldLabel = document.createElement('label');
  goldLabel.textContent = 'Gold Amount: ';
  goldLabel.htmlFor = 'goldInput';
  menu.appendChild(goldLabel);

  const goldInput = document.createElement('input');
  goldInput.type = 'text';
  goldInput.id = 'goldInput';
  goldInput.placeholder = 'e.g. 1000000';
  goldInput.style.width = '100%';
  goldInput.style.margin = '4px 0 10px';
  goldInput.style.padding = '4px';
  goldInput.style.borderRadius = '4px';
  goldInput.style.border = 'none';
  goldInput.style.fontSize = '14px';
  menu.appendChild(goldInput);

  const goldBtn = document.createElement('button');
  goldBtn.textContent = 'Set Gold';
  goldBtn.style.width = '100%';
  goldBtn.style.padding = '6px';
  goldBtn.style.border = 'none';
  goldBtn.style.borderRadius = '4px';
  goldBtn.style.backgroundColor = '#0ff';
  goldBtn.style.color = '#000';
  goldBtn.style.fontWeight = 'bold';
  goldBtn.style.cursor = 'pointer';
  goldBtn.onmouseover = () => goldBtn.style.backgroundColor = '#0cc';
  goldBtn.onmouseout = () => goldBtn.style.backgroundColor = '#0ff';
  menu.appendChild(goldBtn);

  goldBtn.onclick = () => {
    const raw = goldInput.value.replace(/,/g, '').trim();
    const amt = parseInt(raw);
    if (!isNaN(amt) && isFinite(amt)) {
      const gold = Math.min(amt, 10000000);
      if (typeof Boot !== 'undefined' &&
          Boot.prototype.game &&
          Boot.prototype.game._state &&
          Boot.prototype.game._state._current &&
          Boot.prototype.game._state._current.user &&
          Boot.prototype.game._state._current.user.source &&
          Boot.prototype.game._state._current.user.source.data) {
        Boot.prototype.game._state._current.user.source.data.gold = gold;
        Boot.prototype.game._state._current.user.source.addWin();
        alert(`Gold set to ${gold}!`);
      } else {
        alert('Game not ready yet, wait a sec.');
      }
    } else {
      alert('Put a valid number for gold, fam.');
    }
  };

  // --- WalkSpeed input ---
  const speedLabel = document.createElement('label');
  speedLabel.textContent = 'Walk Speed: ';
  speedLabel.htmlFor = 'speedInput';
  speedLabel.style.marginTop = '15px';
  menu.appendChild(speedLabel);

  const speedInput = document.createElement('input');
  speedInput.type = 'text';
  speedInput.id = 'speedInput';
  speedInput.placeholder = 'e.g. 1.5';
  speedInput.style.width = '100%';
  speedInput.style.margin = '4px 0 10px';
  speedInput.style.padding = '4px';
  speedInput.style.borderRadius = '4px';
  speedInput.style.border = 'none';
  speedInput.style.fontSize = '14px';
  menu.appendChild(speedInput);

  const speedBtn = document.createElement('button');
  speedBtn.textContent = 'Set Walk Speed';
  speedBtn.style.width = '100%';
  speedBtn.style.padding = '6px';
  speedBtn.style.border = 'none';
  speedBtn.style.borderRadius = '4px';
  speedBtn.style.backgroundColor = '#0ff';
  speedBtn.style.color = '#000';
  speedBtn.style.fontWeight = 'bold';
  speedBtn.style.cursor = 'pointer';
  speedBtn.onmouseover = () => speedBtn.style.backgroundColor = '#0cc';
  speedBtn.onmouseout = () => speedBtn.style.backgroundColor = '#0ff';
  menu.appendChild(speedBtn);

  speedBtn.onclick = () => {
    const val = parseFloat(speedInput.value.trim());
    if (!isNaN(val) && isFinite(val)) {
      if (typeof Boot !== 'undefined' &&
          Boot.prototype.game &&
          Boot.prototype.game._state &&
          Boot.prototype.game._state._current &&
          Boot.prototype.game._state._current.user) {
        Boot.prototype.game._state._current.user.walkSpeed = val;
        alert(`Walk Speed set to ${val}!`);
      } else {
        alert('Game not ready yet, wait a sec.');
      }
    } else {
      alert('Put a valid number for walk speed, bro.');
    }
  };

  // --- Unlock weapons & currency ---
  function unlockWeapons(currencyAmount = 9999, weaponAmount = 99) {
    function buildUnlockList(items, count = weaponAmount) {
      let e = [];
      items.forEach(i => e.push(`{"N":"${count}","ID":${i.ID}}`));
      return '[' + e.join(',') + ']';
    }

    try {
      const gameData = Boot.prototype.game._state._states.get("Boot")._gameData;
      const backpack = Boot.prototype.game._state._current.user.source.backpack;

      backpack.data.weapon = JSON.parse(buildUnlockList(gameData.weapon));
      backpack.data.item = JSON.parse(buildUnlockList(gameData.item));
      backpack.data.outfit = JSON.parse(buildUnlockList(gameData.outfit));
      backpack.data.relic = JSON.parse(buildUnlockList(gameData.relic));
      backpack.data.boots = JSON.parse(buildUnlockList(gameData.boots));
      backpack.data.hat = JSON.parse(buildUnlockList(gameData.hat));
      backpack.data.currency = JSON.parse(buildUnlockList(gameData.currency, currencyAmount));
      backpack.data.fossil = JSON.parse(buildUnlockList(gameData.fossil));
      backpack.data.follow = JSON.parse(buildUnlockList(gameData.follow));
      backpack.data.mount = JSON.parse(buildUnlockList(gameData.mount));
      backpack.data.key = JSON.parse(buildUnlockList(gameData.key));
      backpack.data.spellRelic = JSON.parse(buildUnlockList(gameData.spellRelic));

      Boot.prototype.game._state._current.user.source.house.data.items = {};
      let fillObj = { A: [], N: weaponAmount };
      gameData.dorm.forEach(dormItem => {
        Boot.prototype.game._state._current.user.source.house.data.items[dormItem.ID] = fillObj;
      });

      alert(`Unlocked all weapons/items to ${weaponAmount} and currency to ${currencyAmount}!`);
    } catch (e) {
      alert('Failed to unlock weapons, try again after game loads fully.');
      console.error(e);
    }
  }

  const unlockLabel = document.createElement('label');
  unlockLabel.textContent = 'Unlock Amount: ';
  unlockLabel.style.marginTop = '15px';
  menu.appendChild(unlockLabel);

  const unlockInput = document.createElement('input');
  unlockInput.type = 'text';
  unlockInput.id = 'unlockInput';
  unlockInput.placeholder = 'Weapons (default 99)';
  unlockInput.style.width = '100%';
  unlockInput.style.margin = '4px 0 5px';
  unlockInput.style.padding = '4px';
  unlockInput.style.borderRadius = '4px';
  unlockInput.style.border = 'none';
  unlockInput.style.fontSize = '14px';
  menu.appendChild(unlockInput);

  const currencyInput = document.createElement('input');
  currencyInput.type = 'text';
  currencyInput.id = 'currencyInput';
  currencyInput.placeholder = 'Currency (default 9999)';
  currencyInput.style.width = '100%';
  currencyInput.style.margin = '0 0 10px';
  currencyInput.style.padding = '4px';
  currencyInput.style.borderRadius = '4px';
  currencyInput.style.border = 'none';
  currencyInput.style.fontSize = '14px';
  menu.appendChild(currencyInput);

  const unlockBtn = document.createElement('button');
  unlockBtn.textContent = 'Unlock Weapons & Currency';
  unlockBtn.style.width = '100%';
  unlockBtn.style.padding = '6px';
  unlockBtn.style.border = 'none';
  unlockBtn.style.borderRadius = '4px';
  unlockBtn.style.backgroundColor = '#0ff';
  unlockBtn.style.color = '#000';
  unlockBtn.style.fontWeight = 'bold';
  unlockBtn.style.cursor = 'pointer';
  unlockBtn.onmouseover = () => unlockBtn.style.backgroundColor = '#0cc';
  unlockBtn.onmouseout = () => unlockBtn.style.backgroundColor = '#0ff';
  menu.appendChild(unlockBtn);

  unlockBtn.onclick = () => {
    let weapons = parseInt(unlockInput.value.trim());
    let currency = parseInt(currencyInput.value.trim());
    if (isNaN(weapons)) weapons = 99;
    if (isNaN(currency)) currency = 9999;
    unlockWeapons(currency, weapons);
  };

  // --- Walk Anywhere hack ---
  let walkAnywhereEnabled = false;
  const walkAnywhereBtn = document.createElement('button');
  walkAnywhereBtn.textContent = 'Toggle Walk Anywhere';
  walkAnywhereBtn.style.width = '100%';
  walkAnywhereBtn.style.padding = '6px';
  walkAnywhereBtn.style.border = 'none';
  walkAnywhereBtn.style.borderRadius = '4px';
  walkAnywhereBtn.style.backgroundColor = '#0ff';
  walkAnywhereBtn.style.color = '#000';
  walkAnywhereBtn.style.fontWeight = 'bold';
  walkAnywhereBtn.style.cursor = 'pointer';
  walkAnywhereBtn.style.marginTop = '10px';

  walkAnywhereBtn.onmouseover = () => walkAnywhereBtn.style.backgroundColor = '#0cc';
  walkAnywhereBtn.onmouseout = () => walkAnywhereBtn.style.backgroundColor = '#0ff';

  menu.appendChild(walkAnywhereBtn);

  walkAnywhereBtn.onclick = () => {
    try {
      const area = Boot.prototype.game._state._current.area;
      if (!walkAnywhereEnabled) {
        for (let i = 0; i < area.length; i++) {
          area[i] = Array(64).fill(1);
        }
        alert('Walk Anywhere ENABLED');
      } else {
        alert('Walk Anywhere DISABLED (reload to reset)');
      }
      walkAnywhereEnabled = !walkAnywhereEnabled;
    } catch (e) {
      alert('Failed to toggle Walk Anywhere, try after game fully loads.');
      console.error(e);
    }
  };

  // --- Pet unlocker ---
  const petUnlockBtn = document.createElement('button');
  petUnlockBtn.textContent = 'Unlock All Pets';
  petUnlockBtn.style.width = '100%';
  petUnlockBtn.style.padding = '6px';
  petUnlockBtn.style.border = 'none';
  petUnlockBtn.style.borderRadius = '4px';
  petUnlockBtn.style.backgroundColor = '#0ff';
  petUnlockBtn.style.color = '#000';
  petUnlockBtn.style.fontWeight = 'bold';
  petUnlockBtn.style.cursor = 'pointer';
  petUnlockBtn.style.marginTop = '10px';

  petUnlockBtn.onmouseover = () => petUnlockBtn.style.backgroundColor = '#0cc';
  petUnlockBtn.onmouseout = () => petUnlockBtn.style.backgroundColor = '#0ff';

  menu.appendChild(petUnlockBtn);

  petUnlockBtn.onclick = async () => {
    const user_id = Boot.prototype.game._state._current.user.source.userID;
    const levelStr = prompt("Made by rxzyx (rzx). Unlocking all pets, what level do you want them to be?");
    const level = parseInt(levelStr);
    if (!level || level <= 0) {
      alert("Unexpected Answer or invalid level");
      return;
    }
    try {
      const response = await fetch(`https://api.prodigygame.com/game-api/v1/character/${user_id}?userID=${user_id}`, {
        method: "GET",
        headers: {
          "Content-Type": "application/json",
          "authorization": sessionStorage.getItem("JWT_TOKEN")
        }
      });
      const charData = await response.json();

      function buildPetsData(includeDetails = true) {
        const petsData = [];
        Boot.prototype.game._state._states.get("Boot")._gameData.pet.forEach(pet => {
          if (includeDetails) {
            petsData.push(JSON.stringify({
              levelCaught: charData.data.level,
              ID: pet.ID,
              stars: 99999,
              catchDate: Date.now(),
              level: level,
              foreignSpells: [61, 67, 55, 58, 70, 81, 75, 78]
            }));
          } else {
            petsData.push(JSON.stringify({
              firstSeenDate: Date.now(),
              ID: pet.ID,
              timesBattled: 1,
              timesRescued: 1
            }));
          }
        });
        return `[${petsData.join(",")}]`;
      }

      charData.pets = JSON.parse(buildPetsData(true));
      charData.encounters.pets = JSON.parse(buildPetsData(false));

      await fetch(`https://api.prodigygame.com/game-api/v3/characters/${user_id}`, {
        method: "POST",
        headers: {
          "Content-Type": "application/json",
          "authorization": sessionStorage.getItem("JWT_TOKEN"),
          "Accept": "application/json"
        },
        body: JSON.stringify({
          data: JSON.stringify(charData),
          userID: user_id
        })
      });

      alert("Pets unlocked! You will need to login again.");
      window.location.reload();

    } catch (e) {
      alert("Failed to unlock pets, try again later.");
      console.error(e);
    }
  };

  // --- Append menu ---
  document.body.appendChild(menu);

  // --- Dragging functionality ---
  let dragging = false, offsetX, offsetY;
  title.addEventListener('mousedown', e => {
    dragging = true;
    offsetX = e.clientX - menu.getBoundingClientRect().left;
    offsetY = e.clientY - menu.getBoundingClientRect().top;
    menu.style.transition = 'none';
  });
  window.addEventListener('mouseup', () => dragging = false);
  window.addEventListener('mousemove', e => {
    if (dragging) {
      menu.style.left = (e.clientX - offsetX) + 'px';
      menu.style.top = (e.clientY - offsetY) + 'px';
      menu.style.right = 'auto';
      menu.style.bottom = 'auto';
    }
  });

})();

QingJ © 2025

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