您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Automatically digs for you! Various completion/repeat options available.
// ==UserScript== // @name Flight Rising Archeology // @version 1.0 // @description Automatically digs for you! Various completion/repeat options available. // @author Triggernometry // @match https://www1.flightrising.com/trading/archaeology/dig-site/* // @grant GM_setValue // @grant GM_getValue // @namespace https://greasyfork.org/users/145271 // @license GNU GPLv3 // ==/UserScript== // suppresses DEBUG messages. console.debug("Begin"); // default values are the key name, will be overwritten by user-specific unfo later var user_vars = {'toggleState': 'toggleState', 'workTypeKey': 'workTypeKey', 'ruggedWorkTypeKey': 'ruggedWorkTypeKey', 'preciseWorkTypeKey': 'preciseWorkTypeKey'}; // whole process on or off var toggleState; // on/off button display var toggleDisplay = ["OFF (click to toggle)", "ON (click to toggle)"]; // rugged or precise options var workTypeStatus; // rugged-specific options var ruggedWorkTypeStatus; // precise-specific options var preciseWorkTypeStatus; function setGlobals() { // get last item of page URL, which is the digsite ID var digsite = window.location.href.split("/").pop(); // get last item of the user's clan URL, which is the user ID var user = $('#namespan > a')[0].attributes['href'].value.split("/").pop(); // set new user for (var key in user_vars) { user_vars[key] = `${key}_${user}_${digsite}` } // set global variables by user and digsite toggleState = GM_getValue(user_vars.toggleState, false); workTypeStatus = GM_getValue(user_vars.workTypeKey); ruggedWorkTypeStatus = GM_getValue(user_vars.ruggedWorkTypeKey); preciseWorkTypeStatus = GM_getValue(user_vars.preciseWorkTypeKey); } function buildGUI() { // set up GUI box $('body').prepend("<div id=\"toggleBox\">" + " <div style=\"text-align: center; color: #e8cc9f; font: bold 7.8pt/30px tahoma; background: #731d08; margin: -10px -10px 10px;\">Auto Archeology</div>" + // set toggle display to whatever it was before new page was loaded (or off, if page has never beeen loaded this session) " <button id=\"onOffDisplay\">OFF (click to toggle)</button>" + "</div>" + "<style>" + " #toggleBox label {" + " float: inherit;" + " }" + " #toggleBox {" + " padding: 10px;" + " border: 1px solid #000;" + " position: fixed;" + " top: 0;" + " left: 0;" + " background: #fff;" + " z-index: 1002;" + " }" + " #onOffDisplay {" + " border: 0;" + " background-color: #dcd6c8;" + " padding: 5px 10px;" + " color: #731d08;" + " margin: auto;" + " box-shadow: 0 1px 3px #999;" + " border-radius: 5px;" + " text-shadow: 0 1px 1px #FFF;" + " border-bottom: 1px solid #222;" + " cursor: pointer;" + " display: block;" + " font: bold 11px arial;" + " transition: 0.1s;" + " }" + " #onOffDisplay:hover {" + " background-color: #bfb9ac;" + " color: #731d08;" + " }" + "</style>" ); console.debug("Build"); // set the toggle click behavior $('#onOffDisplay').click(function(){ toggleState = !toggleState; GM_setValue(user_vars.toggleState, toggleState); if(toggleState) { $('#onOffDisplay').html(toggleDisplay[1]); } else { $('#onOffDisplay').html(toggleDisplay[0]); } }); // set selected state of toggle button if(toggleState) { $('#onOffDisplay').html(toggleDisplay[1]); } else { $('#onOffDisplay').html(toggleDisplay[0]); } $('#toggleBox').append("<br>What type of work?" + "<br>" + "<form id=\"workTypeForm\">" + " <input type=\"radio\"" + " id=\"ruggedWork\"" + " name=\"workType\">" + " <label class=\"ruggedWork\">Rugged</label>" + " <br>" + " <input type=\"radio\"" + " id=\"preciseWork\"" + " name=\"workType\">" + " <label class=\"preciseWork\">Precise</label>" + "</form>" ); // set on changed behavior $("#workTypeForm").change(function() { if($('#ruggedWork').is(':checked')) { workTypeStatus = 0; GM_setValue(user_vars.workTypeKey, workTypeStatus); $( "#ruggedOptions" ).show(); $( "#preciseOptions" ).hide(); } else { workTypeStatus = 1; GM_setValue(user_vars.workTypeKey, workTypeStatus); $( "#ruggedOptions" ).hide(); $( "#preciseOptions" ).show(); } }); // set selected radio button if (workTypeStatus == 0) { $( "#ruggedWork" ).prop( "checked", true ); } else { $( "#preciseWork" ).prop( "checked", true ); } buildRuggedGUI(); buildPreciseGUI(); } function getPlots() { // get all displayed dig plots as an array var plots = {}; // iterate thru all plots $(".archaeology-dig-plot-frame > .archaeology-dig-plot").each( function( index, element ){ // get plot's name, if available var plotName = $(this).find(".archaeology-dig-plot-complete > div").attr("data-name"); // if undefined/null/blank/etc, set to temporary label plotName = plotName ? plotName : `Not Completed (${index})` // get plot's work button, if available var plotButton = $(this).find(".archaeology-dig-plot-action-frame > .archaeology-dig-plot-magnifying-glass.common-ui-button"); if (!plotButton || !plotButton.length) { plotButton = $(this).find(".archaeology-dig-plot-action-frame > .archaeology-dig-plot-claim.common-ui-button"); } // save to key-value pair plots[plotName] = plotButton[0].attributes["data-plot-id"].nodeValue; }); return plots; } function buildRuggedGUI() { $('#toggleBox').append("<div id=\"ruggedOptions\">" + " <br>Rugged Work Options:" + " <br>" + " <form id=\"ruggedWorkForm\">" + " <input type=\"radio\"" + " id=\"ruggedLimit\"" + " name=\"ruggedWorkType\">" + " <label class=\"ruggedWork\">Until Pickaxes reach: (Currently: 0)</label>" + " <br>" + " <input type=\"radio\"" + " id=\"ruggedCountDown\"" + " name=\"ruggedWorkType\">" + " <label class=\"preciseWork\">Until Pickaxes used: (Currently: 0)</label>" + " <br>" + " <input type=\"radio\"" + " id=\"ruggedForever\"" + " name=\"ruggedWorkType\">" + " <label class=\"preciseWork\">Forever</label>" + " </form>" + "</div>" ); // set on changed behavior $("#ruggedWorkForm").change(function() { if($('#ruggedLimit').is(':checked')) { GM_setValue(user_vars.ruggedWorkTypeKey, 2); } // currently unnecessary, but left as-is to provide template else if($('#ruggedCountDown').is(':checked')) { GM_setValue(user_vars.ruggedWorkTypeKey, 1); } else { GM_setValue(user_vars.ruggedWorkTypeKey, 0); } }); // set selected radio button // TODO: change this into a dictionary or lookup of some sort if (ruggedWorkTypeStatus == 2) { $( "#ruggedLimit" ).prop( "checked", true ); } else if (ruggedWorkTypeStatus == 1) { $( "#ruggedCountDown" ).prop( "checked", true ); } else { $( "#ruggedForever" ).prop( "checked", true ); } // set whether or not the box is visible if($('#ruggedWork').is(':checked')) { $( "#ruggedOptions" ).show(); } else { $( "#ruggedOptions" ).hide(); } } function buildPreciseGUI() { // indentation is not necessary for parsing, but will make final product more human-readable var templateSeparator = " <br>"; var radioBlock = []; var plots = getPlots(); for(const key in plots) { var block = preciseBlockTemplate(key, plots[key]); radioBlock.push(block); } radioBlock = radioBlock.join(templateSeparator); // add extended Precise Work options $('#toggleBox').append("<div id=\"preciseOptions\">" + " <br>Precise Options" + " <br>" + " <form id=\"preciseWorkTypeForm\">" + radioBlock + " </form>" + "</div>" ); // set on changed behavior $("#preciseWorkTypeForm").change(function(event) { preciseWorkTypeStatus = event.target.id; GM_setValue(user_vars.preciseWorkTypeKey, preciseWorkTypeStatus); }); // set selected radio button // TODO: change this into a dictionary or lookup of some sort if (preciseWorkTypeStatus) { $(`#${preciseWorkTypeStatus}`).prop( "checked", true ) } // set whether or not the box is visible if($('#preciseWork').is(':checked')) { $( "#preciseOptions" ).show(); } else { $( "#preciseOptions" ).hide(); } } function preciseBlockTemplate(plotName, plotID) { var radioTemplate = ` <input type="radio"` + ` id="${plotID}"` + ` name="preciseWorkPlot">` + ` <label class="${plotID}">${plotName}</label>`; return radioTemplate; } async function sleep(ms=1000) { return new Promise(resolve => setTimeout(resolve, ms)); } async function pressConfirmation() { var confButton = null; while (!confButton || confButton.length == 0) { await sleep(); confButton = $('.beigebutton.thingbutton.dialog-submit'); } confButton[0].click(); } async function main() { console.debug("In Main"); // set up global variables for user-specific values await setGlobals(); // set up GUI await buildGUI(); // if on if (toggleState) { // cleanup if needed try { $('#uncover-all-squares')[0].click(); } catch { //pass ; } // claim if needed if ($('.archaeology-dig-plot-claim.common-ui-button').length) { $('.archaeology-dig-plot-claim.common-ui-button').each(async function(index, element) { element.click(); await pressConfirmation(); }); } // if ready to work if ($('#archaeology-dig-timer-text')[0].innerText == "Ready!") { // if rugged if (workTypeStatus == 0) { console.debug("Starting Rugged work..."); // start rugged select $('#archaeology-use-pickaxe')[0].click(); await pressConfirmation(); } // if precise if (workTypeStatus == 1) { // start precise select $('#archaeology-use-magnifying-glass')[0].click(); // start plot $(`.archaeology-dig-plot-magnifying-glass.common-ui-button[data-plot-id*='${preciseWorkTypeStatus}']`)[0].click(); await pressConfirmation(); } else { // nothing yet! ; } } } } console.debug("Call Main"); // wait until page load, then run main $(document).ready(main); console.debug("Return Main");