您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
script ported over from https://github.com/therealgliz/blooket-hacks
// ==UserScript== // @name Blooket Hacks GUI // @namespace http://tampermonkey.net/ // @version 2024-05-04 // @description script ported over from https://github.com/therealgliz/blooket-hacks // @author You // @match https://*.blooket.com/* // @icon data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw== // @grant none // @license MIT // ==/UserScript== (function() { (() => { let n = document.createElement('iframe'); document.body.append(n); window.alert = n.contentWindow.alert.bind(window); window.prompt = n.contentWindow.prompt.bind(window); window.confirm = n.contentWindow.confirm.bind(window); n.remove(); })(); (() => { let style = document.createElement('style'); style.innerHTML = (`details > summary { cursor: pointer; transition: 0.15s; list-style: none; } details > summary:hover { color: hsl(0, 0%, 50%) } details > summary::-webkit-details-marker { display: none; } details summary ~ * { animation: sweep .5s ease-in-out; } @keyframes sweep { 0% {opacity: 0; transform: translateY(-10px)} 100% {opacity: 1; transform: translateY(0)} } .cheat { border: none; background: hsl(0, 0%, 20%); padding: 5px; margin: 3px; width: 60%; color: hsl(0, 0%, 100%); transition: 0.2s; border-radius: 5px; cursor: pointer; } .cheat:hover { background: hsl(0, 0%, 30%); }`); const GUI = document.createElement('div'); GUI.appendChild(style); GUI.style.width = '400px'; //GUI.style.height = '500px'; GUI.style.background = 'hsl(0, 0%, 10%)'; GUI.style.borderRadius = '10px'; GUI.style.position = 'absolute'; GUI.style.textAlign = 'center'; GUI.style.fontFamily = 'Nunito'; GUI.style.color = 'white'; GUI.style.overflow = 'hidden'; GUI.style.top = '50px'; GUI.style.left = '50px'; var pos1 = 0, pos2 = 0, pos3 = 0, pos4 = 0; GUI.onmousedown = ((e = window.event) => { e.preventDefault(); pos3 = e.clientX; pos4 = e.clientY; document.onmouseup = (() => { document.onmouseup = null; document.onmousemove = null; }); document.onmousemove = ((e) => { e = e || window.event; e.preventDefault(); pos1 = pos3 - e.clientX; pos2 = pos4 - e.clientY; pos3 = e.clientX; pos4 = e.clientY; GUI.style.top = (GUI.offsetTop - pos2) + "px"; GUI.style.left = (GUI.offsetLeft - pos1) + "px"; }); }); let header = document.createElement('div'); GUI.appendChild(header); header.style.width = '100%'; header.style.height = '35px'; header.style.paddingTop = '2px'; header.style.fontSize = '1.5rem'; header.style.textAlign = 'center' header.innerHTML = `Blooket Cheats <span style="font-size: 0.75rem">v4.10.22</span>`; let loop; let close = document.createElement('button'); header.appendChild(close); close.style.background = 'red'; close.style.height = '45px'; close.style.width = '45px'; close.style.border = 'none'; close.style.cursor = 'pointer'; close.style.position = 'absolute'; close.style.top = '-10px'; close.style.right = '-10px'; close.style.fontSize = '1.5rem'; close.style.borderRadius = '10px'; close.style.fontFamily = 'Nunito'; close.style.fontWeight = 'bolder'; close.style.paddingTop = '10px'; close.style.paddingRight = '15px'; close.innerText = 'X'; close.onclick = () => { GUI.remove(); clearInterval(loop); removeEventListener('keypress', toggleHidden) } let minimize = document.createElement('button'); header.appendChild(minimize); minimize.style.background = '#444444'; minimize.style.height = '45px'; minimize.style.width = '45px'; minimize.style.border = 'none'; minimize.style.cursor = 'pointer'; minimize.style.position = 'absolute'; minimize.style.top = '-10px'; minimize.style.left = '-10px'; minimize.style.fontSize = '1.5rem'; minimize.style.borderRadius = '10px'; minimize.style.fontFamily = 'Nunito'; minimize.style.fontWeight = 'bolder'; minimize.style.paddingTop = '10px'; minimize.style.paddingLeft = '15px'; minimize.innerText = '-'; minimize.onclick = () => { bodyDiv.hidden = !bodyDiv.hidden; } let bodyDiv = document.createElement('div'); let body = document.createElement('div'); bodyDiv.appendChild(body); GUI.appendChild(bodyDiv); body.innerHTML = (`<span id="curPageEl">${getSite(true) ? `Current gamemode: ${getSite(true)}` : 'No game detected'}</span><br><span>(Press E to hide)</span><br>`); body.style.display = 'block'; body.style.margin = '10px'; //body.style.background = 'white'; body.style.minHeight = '70px'; let activeCheats = document.createElement('span'); body.appendChild(activeCheats); document.body.append(GUI); let footer = document.createElement('div'); bodyDiv.appendChild(footer); footer.style.fontSize = '0.9rem'; footer.style.paddingBottom = '5px'; footer.innerHTML = (`<span>GUI by OneMinesraft2#5394<br>Cheats by <a style="color: lightblue" href="https://twitter.com/glizuwu">gliz</a></span>`); var getValues = () => new Promise((e, t) => { try { let n = window.webpackJsonp.map(e => Object.keys(e[1]).map(t => e[1][t])).reduce((e, t) => [...e, ...t], []).find(e => /\w{8}-\w{4}-\w{4}-\w{4}-\w{12}/.test(e.toString()) && /\(new TextEncoder\)\.encode\(\"(.+?)\"\)/.test(e.toString())).toString(); e({ blooketBuild: n.match(/\w{8}-\w{4}-\w{4}-\w{4}-\w{12}/)[0], secret: n.match(/\(new TextEncoder\)\.encode\(\"(.+?)\"\)/)[1] }) } catch { t("Could not fetch auth details") } }) var encodeValues = async (e, t) => { let d = window.crypto.getRandomValues(new Uint8Array(12)); return window.btoa(Array.from(d).map(e => String.fromCharCode(e)).join("") + Array.from(new Uint8Array(await window.crypto.subtle.encrypt({ name: "AES-GCM", iv: d }, await window.crypto.subtle.importKey("raw", await window.crypto.subtle.digest("SHA-256", (new TextEncoder).encode(t)), { name: "AES-GCM" }, !1, ["encrypt"]), (new TextEncoder).encode(JSON.stringify(e))))).map(e => String.fromCharCode(e)).join("")) }; function reactHandler() { return Object.values(document.querySelector('#app > div > div'))[1].children[1]._owner; } let autoAnswer, highlightAnswers, choiceESP, autoPassword, chestESP; let cheats = { global: { 'Get Daily Rewards': () => { fetch("https://api.blooket.com/api/users", { credentials: "include" }).then(x => x.json()).then(x => { getValues().then(async e => { fetch("https://api.blooket.com/api/users/add-rewards", { method: "put", credentials: "include", headers: { "content-type": "application/json", "X-Blooket-Build": e.blooketBuild }, body: await encodeValues({ name: x.name, addedTokens: 250, addedXp: 300 }, e.secret) }); fetch("https://api.blooket.com/api/users/add-rewards", { method: "put", credentials: "include", headers: { "content-type": "application/json", "X-Blooket-Build": e.blooketBuild }, body: await encodeValues({ name: x.name, addedTokens: 250, addedXp: 300 }, e.secret) }).then(() => alert('Added daily rewawrds!')).catch(() => alert('There was an error when adding rewards!'));; }).catch(() => alert('There was an error encoding requests!')); }).catch(() => alert('There was an error getting username!')); }, 'Spoof Blooks': () => { if (!window.location.pathname.split('/').includes('lobby')) return alert('You must be in a game lobby! (e.g. https://www.blooket.com/play/lobby)'); reactHandler().stateNode.setState({ lockedBlooks: [], takenBlooks: [] }); }, 'Toggle Auto Answer': () => { autoAnswer = !autoAnswer }, 'Toggle Highlight Answers': () => { highlightAnswers = !highlightAnswers }, 'Spam Open Boxes': () => { let box = prompt(`Which box do you want to open? (e.g. Space)`); let boxes = { safari: 25, aquatic: 20, bot: 20, space: 20, breakfast: 15, medieval: 15, wonderland: 15 } if (!Object.keys(boxes).includes(box.toLowerCase())) return alert('I could not find that box!'); let amount = prompt('How many boxes do you want to open?'); fetch("https://api.blooket.com/api/users", { credentials: "include" }).then(x => x.json()).then(x => { if (x.tokens < boxes[box.toLowerCase()] * amount) amount = Math.floor(x.tokens / boxes[box.toLowerCase()]); if (!amount) return alert('You do not have enough tokens!'); let wait = ms => new Promise(r => setTimeout(r, ms)); getValues().then(async e => { let error = false, blooks = []; for (let i = 0; i < amount; i++) { fetch("https://api.blooket.com/api/users/unlockblook", { method: "put", credentials: "include", headers: { "content-type": "application/json", "X-Blooket-Build": e.blooketBuild }, body: await encodeValues({ name: x.name, box: box.charAt(0).toUpperCase() + box.slice(1).toLowerCase() }, e.secret) }).then(async x => { let blook = await x.json(); blooks.push(blook.unlockedBlook); alert(`${blook.unlockedBlook} (${i + 1}/${amount})`); }).catch(() => { error = true }); await wait(750); if (error) break; } let count = {}; blooks.forEach(blook => { count[blook] = (count[blook] || 0) + 1 }); alert(`Results:\n` + Object.entries(count).map((x) => ` ${x[1]} ${x[0]}`).join(`\n`)); }).catch(() => alert('There was an error encoding requests!')); }).catch(() => alert('There was an error getting username!')); }, 'Auto Sell Dupes': () => { fetch("https://api.blooket.com/api/users", { credentials: "include" }).then(x => x.json()).then(x => { let blooks = Object.entries(x.unlocks).map(x => [x[0], x[1] - 1]).filter(x => x[1] > 0); let wait = ms => new Promise(r => setTimeout(r, ms)); getValues().then(async e => { let error = false; alert('Selling duplicate blooks, please wait'); for (let [blook, numSold] of blooks) { fetch("https://api.blooket.com/api/users/sellblook", { method: "put", credentials: "include", headers: { "content-type": "application/json", "X-Blooket-Build": e.blooketBuild }, body: await encodeValues({ name: x.name, blook, numSold }, e.secret) }).catch(() => { error = true }); await wait(750); if (error) break; } alert(`Results:\n` + blooks.map((x) => ` ${x[1]} ${x[0]}`).join(`\n`)); }).catch(() => alert('There was an error encoding requests!')); }).catch(() => alert('There was an error getting user data!')); } }, cafe: { 'Infinite Food': () => { if (document.location.pathname != "/cafe") return alert("This cheat doesn't work in the shop!"); reactHandler().stateNode.state.foods.forEach(e => e.stock = 99999); reactHandler().stateNode.forceUpdate(); }, 'Max Levels': () => { if (document.location.pathname != "/cafe/shop") return alert("This cheat only works in the shop!"); Object.keys(reactHandler().stateNode.state.items).forEach(x => reactHandler().stateNode.state.items[x] = 5); reactHandler().stateNode.forceUpdate(); }, 'Set Cash': () => { reactHandler().stateNode.setState({ cafeCash: Number(parseFloat(prompt('How much cash would you like?'))) }); }, 'Reset Abilities': () => { Object.keys(reactHandler().stateNode.state.abilities).forEach(x => reactHandler().stateNode.state.abilities[x] = 5); reactHandler().stateNode.forceUpdate(); } }, kingdom: { 'Choice ESP': () => { choiceESP = !choiceESP }, 'Max Stats': () => { reactHandler().stateNode.setState({ materials: 100, people: 100, happiness: 100, gold: 100 }); }, 'Disable Toucan': () => { reactHandler().stateNode.taxCounter = Number.MAX_VALUE; }, 'Set Guests': () => { let guestScore = Number(parseFloat(prompt('How many guests do you want?'))); reactHandler().stateNode.setState({ guestScore }); }, 'Skip Guest': () => { reactHandler().stateNode.nextGuest(); } }, crypto: { 'Auto Hack': () => { autoPassword = !autoPassword }, 'Set Crypto': () => { let amount = Number(parseFloat(prompt('How much crypto do you want?'))); reactHandler().stateNode.setState({ crypto2: amount, crypto: amount }); }, 'Custom Password': () => { let password = Number(parseFloat(prompt('What do you want to set your password to?'))); reactHandler().stateNode.setState({ password }); }, 'Remove Hack': () => { reactHandler().stateNode.setState({ hack: '' }) }, 'Reset Player\'s Crypto': () => { let target = prompt("Name of player"); let e = reactHandler(); !target || e.memoizedProps.firebase.getDatabaseVal(e.memoizedProps.client.hostId, "c", (...o) => { let data = Object.keys(o[0]); if (data.some(e => e == target)) data.forEach(player => { if (player == target) { e.memoizedProps.firebase.setVal({ id: e.memoizedProps.client.hostId, path: "c/" + e.memoizedProps.client.name, val: { p: e.stateNode.state.password, b: e.memoizedProps.client.blook, cr: e.stateNode.state.crypto, tat: player + ":" + (o[0][player].cr || 0) } }); alert('Reset player\'s crypto') }; }); else alert("Player does not exist"); }) } }, factory: { 'All Mega Bot': () => { let blooks = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0].fill({ name: "Mega Bot", color: "#d71f27", class: "🤖", rarity: "Legendary", cash: [80000, 430000, 4200000, 62000000, 1000000000], time: [5, 5, 3, 3, 3], price: [7000000, 120000000, 1900000000, 35000000000], active: false, level: 4, bonus: 5.5 }) reactHandler().stateNode.setState({ blooks }); }, 'Remove Glitches': () => { reactHandler().stateNode.setState({ glitch: "", bites: 0, ads: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], hazards: ["", "", "", "", ""], lol: false, joke: false, slow: false, dance: false, popUpAmount: 0, }); }, 'Max Blooks': () => { reactHandler().stateNode.state.blooks.forEach(blook => { blook.level = 4 }); }, 'Set Cash': () => { let cash = Number(parseFloat(prompt('How much cash do you want?'))); reactHandler().stateNode.setState({ cash }); }, }, fishing: { 'Set Weight': () => { let weight = Number(parseFloat(prompt('How much weight do you want?'))); reactHandler().stateNode.setState({ weight2: weight, weight }); }, 'Set Lure': () => { let lure = Number(parseFloat(prompt('What do you want to set your lure to? (1 - 5)'))) - 1; reactHandler().stateNode.setState({ lure: lure < 0 ? 0 : lure > 4 ? 4 : lure }); } }, gold: { 'Set Gold': () => { let gold = Number(parseFloat(prompt('How much gold do you want?'))); reactHandler().stateNode.setState({ gold2: gold, gold }); }, 'Chest ESP': () => { chestESP = !chestESP }, "Set Player's Gold": () => { let e = reactHandler(), player = prompt("Player to set gold"), amount = Number(parseFloat(prompt("Amount to set gold to"))); e.memoizedProps.firebase.setVal({ id: e.memoizedProps.client.hostId, path: "c/" + e.memoizedProps.client.name, val: { b: e.memoizedProps.client.blook, g: e.stateNode.state.gold, tat: player + ":swap:" + amount } }) } }, racing: { 'Instant Win': () => { reactHandler().stateNode.setState({ progress: reactHandler().stateNode.state.goalAmount }); setTimeout(() => { try { Array.from(document.body.querySelectorAll('div[class*="answerText"]')).filter(t => t.firstChild.innerHTML == reactHandler().memoizedState.question.correctAnswers[0])[0].click(); } catch { try { Array.from(document.body.querySelectorAll('div[class*="answerText"]')).filter(t => t.firstChild.innerHTML == reactHandler().memoizedProps.client.question.correctAnswers[0])[0].click(); } catch { }; }; }, 100); } }, defense: { 'Clear Enemies': () => { reactHandler().stateNode.enemies = []; }, 'Max Towers': () => { reactHandler().stateNode.towers.forEach(tower => { tower.damage = 99999999; tower.range = 99999999; tower.fullCd = 0; }); }, 'Remove Ducks': () => { data = reactHandler().stateNode; data.ducks.forEach(x => { data.tiles[x.y][x.x] = 0; }); data.ducks.length = 0; }, 'Place Towers Anywhere': () => { reactHandler().stateNode.tiles = reactHandler().stateNode.tiles.map(x => x.map(e => e == 2 ? 0 : e)); }, 'Set Damage': () => { let dmg = Number(parseFloat(prompt('How much damage do you want?'))); reactHandler().stateNode.dmg = dmg; }, 'Set Round': () => { let round = Number(parseFloat(prompt('What round do you want to set it to?'))); reactHandler().stateNode.setState({ round }); }, 'Set Tokens': () => { let tokens = Number(parseFloat(prompt('How many tokens do you want?'))); reactHandler().stateNode.setState({ tokens }); } }, doom: { 'Set Coins': () => { try { reactHandler().stateNode.props.setTowerCoins(Number(parseFloat(prompt('How many coins do you want?')))); } catch { } }, 'Lower Enemy Stats': () => { let data = reactHandler().stateNode.state; if (data.phase != 'select') return alert('You must be on the attribute selection page!'); reactHandler().stateNode.setState({ enemyCard: { ...data.enemyCard, strength: 0, charisma: 0, wisdom: 0 } }) }, 'Max Player Stats': () => { let data = reactHandler().stateNode.state; if (data.phase != 'select') return alert('You must be on the attribute selection page!'); reactHandler().stateNode.setState({ myCard: { ...data.myCard, strength: 20, charisma: 20, wisdom: 20 } }) }, 'Heal Player': () => { reactHandler().stateNode.setState({ myLife: 100 }); } }, rush: { 'Set Defense': () => { let e = reactHandler(); e.stateNode.props.firebase.setVal({ id: e.stateNode.props.client.hostId, path: 'c/' + e.stateNode.props.client.name + '/d', val: Number(parseFloat(prompt('How much defense do you want?'))) }); }, 'Set Blooks': () => { let e = reactHandler(); e.stateNode.props.firebase.setVal({ id: e.stateNode.props.client.hostId, path: 'c/' + e.stateNode.props.client.name + '/bs', val: Number(parseFloat(prompt('How many blooks do you want?'))) }); } } }; let global = document.createElement('details'); global.innerHTML = (`<summary style="padding: 10px; font-size: 1.5em; font-weight: bolder">Global</summary>`); for (var i = 0; i < Object.keys(cheats.global).length; i++) { let cheat = createButton(Object.keys(cheats.global)[i]); cheat.onclick = cheats.global[Object.keys(cheats.global)[i]]; global.appendChild(cheat); } global.open = true; global.style.paddingBottom = '10px'; body.appendChild(global); let cheatDiv = document.createElement('div'); body.appendChild(cheatDiv); loop = setInterval(() => { if (curPage != getSite()) { curPage = getSite(); curPageEl.innerText = getSite(true) ? `Current gamemode: ${getSite(true)}` : 'No game detected' Array.from(cheatDiv.children).forEach(x => x.remove()); if (curPage && cheats[curPage]) Object.keys(cheats[curPage]).forEach(cheat => { let button = createButton(cheat); button.onclick = cheats[curPage][cheat]; cheatDiv.appendChild(button); cheatDiv.appendChild(document.createElement('br')); }) }; let activeCheatsText = (`Auto Answer: ${autoAnswer ? 'Enabled' : 'Disabled'}\nHighlight Answers: ${highlightAnswers ? 'Enabled' : 'Disabled'}${curPage == 'kingdom' ? `\nChoice ESP: ${choiceESP ? 'Enabled' : 'Disabled'}` : curPage == 'crypto' ? `\nAuto Hack: ${autoPassword ? 'Enabled' : 'Disabled'}` : curPage == 'gold' ? `\nChest ESP: ${chestESP ? 'Enabled' : 'Disabled'}` : ''}`); activeCheats.innerText != activeCheatsText && (activeCheats.innerText = activeCheatsText); if (autoAnswer) { try { Array.from(document.body.querySelectorAll('div[class*="answerText"]')).filter(t => t.firstChild.innerHTML == reactHandler().memoizedState.question.correctAnswers[0])[0].click(); } catch { try { Array.from(document.body.querySelectorAll('div[class*="answerText"]')).filter(t => t.firstChild.innerHTML == reactHandler().memoizedProps.client.question.correctAnswers[0])[0].click(); } catch { }; }; }; if (highlightAnswers) { try { Array.from(document.querySelector('div[class*="answersHolder"').children).forEach(x => { if (reactHandler().memoizedState.question.correctAnswers.includes(x.innerText) || reactHandler().memoizedProps.client.question.correctAnswers.includes(x.innerText)) x.firstChild.style = 'background-color: rgb(0, 207, 119);'; else x.firstChild.style = 'background-color: rgb(225, 40, 33);'; }); } catch { } }; if (curPage == 'kingdom') { Array.from(document.getElementsByClassName('choiceESP')).forEach(x => x.remove()) if (choiceESP) { try { let elements = { materials: Array.from(document.querySelectorAll('div')).find(x => Array.from(x.children).find(e => e.className.includes('tree'))), people: Array.from(document.querySelectorAll('div')).find(x => Array.from(x.children).find(e => e.className.includes('users') && e.parentElement.className.includes('statContainer'))), happiness: Array.from(document.querySelectorAll('div')).find(x => Array.from(x.children).find(e => e.className.includes('grin'))), gold: Array.from(document.querySelectorAll('div')).find(x => Array.from(x.children).find(e => e.className.includes('coins'))) } let data = reactHandler().stateNode.state.guest; Object.entries(data.yes).forEach(x => { if (x[0] == 'msg') return; let element = document.createElement('div'); element.className = 'choiceESP'; element.style = 'font-size: 24px; color: rgb(75, 194, 46); font-weight: bolder;'; element.innerText = String(x[1]) elements[x[0]].appendChild(element); }) Object.entries(data.no).forEach(x => { if (x[0] == 'msg') return; let element = document.createElement('div'); element.className = 'choiceESP'; element.style = 'font-size: 24px; color: darkred; font-weight: bolder;'; element.innerText = String(x[1]) elements[x[0]].appendChild(element); }) } catch (e) { } }; } if (curPage == 'crypto' && autoPassword) { let { stage, correctPassword } = Object.values(document.querySelector('#app > div > div'))[1].children[1]._owner.stateNode.state; if (stage == "hack") Array.from(document.querySelectorAll('div')).filter(x => x.innerHTML == correctPassword)[0].click(); }; if (curPage == 'gold' && chestESP) { try { if (reactHandler().stateNode.state.stage == 'prize') { let { choices } = reactHandler().stateNode.state; let div = document.querySelector("div[class*='regularBody']").children[1]; if (div) { if (!document.querySelectorAll(".chest-esp").length) choices.forEach((box, i) => { textElement = document.createElement('p'); textElement.className = "chest-esp"; textElement.innerText = box.text; textElement.style = `text-align: center; font-size: 30px; color: white; font-family:Titan One; sans-serif; border-color: black; margin-top: 200px;` try { div.children[i].appendChild(textElement); } catch (e) { console.log(e) } }); else choices.forEach((box, i) => { if (div.children.length == 3 && div.children[i].children[1].innerText != box.text) div.children[i].children[1].innerText = box.text; }) } } } catch (e) { console.log(e) } }; }); let curPage = getSite(); if (curPage && cheats[curPage]) Object.keys(cheats[curPage]).forEach(cheat => { let button = createButton(cheat); button.onclick = cheats[curPage][cheat]; cheatDiv.appendChild(button); cheatDiv.appendChild(document.createElement('br')); }) function createButton(cheat) { let button = document.createElement('button'); button.classList.add('cheat'); button.innerText = cheat; return button } function getSite(capitalize) { switch (window.location.pathname.split('/')[2]) { case 'rush': return capitalize ? 'Blook Rush' : 'rush'; case 'gold': return capitalize ? 'Gold Quest' : 'gold'; case 'fishing': return capitalize ? 'Fishing Frenzy' : 'fishing'; case 'hack': return capitalize ? 'Crypto Hack' : 'crypto'; case 'battle-royale': return capitalize ? 'Battle Royale' : 'royale'; case 'factory': return capitalize ? 'Factory' : 'factory'; case 'racing': return capitalize ? 'Racing' : 'racing'; case 'classic': return capitalize ? 'Classic' : 'classic'; default: switch (window.location.pathname.split('/')[1]) { case 'defense': return capitalize ? 'Tower Defense' : 'defense'; case 'cafe': return capitalize ? 'Café' : 'cafe'; case 'tower': return capitalize ? 'Tower of Doom' : 'doom'; case 'kingdom': return capitalize ? 'Crazy Kingdom' : 'kingdom'; default: return false; } }; }; function toggleHidden(e) { e.code == 'KeyE' && (GUI.hidden = !GUI.hidden) }; addEventListener('keypress', toggleHidden); })() })();