您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Copy your spire build
// ==UserScript== // @name Elethor Spire Build Copy // @namespace http://tampermonkey.net/ // @version 1.0 // @description Copy your spire build // @author Eugene // @match https://elethor.com/fight/spire // @grant GM_xmlhttpRequest // @grant GM_setClipboard // @license GPL-3.0-or-later // ==/UserScript== /* * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <https://www.gnu.org/licenses/>. */ (function() { 'use strict'; let modifiers = null; let choices = null; let btn = null; function init() { if (!window.location.href.includes('elethor.com/fight/spire')) { if (btn) btn.remove(); return; } if (document.getElementById('build-copy-btn')) return; btn = document.createElement('button'); btn.id = 'build-copy-btn'; btn.innerHTML = 'Copy Build'; Object.assign(btn.style, { position: 'fixed', bottom: '20px', right: '20px', zIndex: '9999', padding: '12px 16px', background: '#2563eb', color: '#fff', border: 'none', borderRadius: '6px', cursor: 'pointer', fontSize: '14px', fontWeight: '500' }); btn.addEventListener('click', handleCopy); document.body.appendChild(btn); loadData(); } function loadData() { GM_xmlhttpRequest({ method: 'GET', url: 'https://elethor.com/game/neo-spire/modifiers', onload: r => { modifiers = JSON.parse(r.responseText); tryFormat(); } }); GM_xmlhttpRequest({ method: 'GET', url: 'https://elethor.com/game/views/neo-spire', onload: r => { choices = JSON.parse(r.responseText); tryFormat(); } }); } function tryFormat() { if (modifiers && choices && btn) { btn.disabled = false; } } function getBuildString() { const prog = choices.progress.modifiers; const off = []; const def = []; for (let i = 1; i <= 20; i++) { const lvl = `A${i}`; if (prog.Offense?.[lvl]) { const pick = prog.Offense[lvl]; const opts = modifiers.modifiers.Offense[lvl]; const idx = opts.findIndex(m => m.id === pick.id) + 1; off.push(idx); } if (prog.Defense?.[lvl]) { const pick = prog.Defense[lvl]; const opts = modifiers.modifiers.Defense[lvl]; const idx = opts.findIndex(m => m.id === pick.id) + 1; def.push(idx); } } return `Offensive: ${off.join('-')}\nDefensive: ${def.join('-')}`; } function handleCopy() { const build = getBuildString(); GM_setClipboard(build); const orig = btn.innerHTML; btn.innerHTML = 'Copied!'; btn.style.background = '#059669'; setTimeout(() => { btn.innerHTML = orig; btn.style.background = '#2563eb'; }, 1500); } init(); let currentUrl = location.href; new MutationObserver(() => { if (location.href !== currentUrl) { currentUrl = location.href; init(); } }).observe(document, {subtree: true, childList: true}); })();