Flight Rising: Predict Morphology - Next Option + Image Code Copy

Adds buttons to select the next/previous options for each dropdown. Automatically predicts, removing excess clicks. Adds option to copy scry image code with settings for auto copy & adult on load.

// ==UserScript==
// @name         Flight Rising: Predict Morphology - Next Option + Image Code Copy
// @description  Adds buttons to select the next/previous options for each dropdown. Automatically predicts, removing excess clicks. Adds option to copy scry image code with settings for auto copy & adult on load.
// @namespace    https://gf.qytechs.cn/en/users/547396
// @author       https://gf.qytechs.cn/en/users/547396
// @match        *://*.flightrising.com/scrying/predict*
// @grant        none
// @version      0.4
// ==/UserScript==

(function() {
    'use strict';

    const container = document.getElementById('predict-morphology'),
          optionsBlock = container.getElementsByClassName('scry-options')[0],
          commonRows = optionsBlock.getElementsByClassName('common-row'),
          predictBtn = document.getElementById('scry-button'),
          loadBtn = document.getElementById('load-morphology'),
          scryLoad = document.getElementsByClassName('scry-load')[0],
          copyBtn = document.createElement('button'),
          copyPasta = document.createElement('input');

    // do it!
    init();

    function init() {
        buildCopy();
        loadScryUrl();
        loadSettings();

        for ( let row of commonRows ) {

            let selector = row.getElementsByTagName('select')[0],
                shuffle = row.getElementsByClassName('scry-shuffle')[0],
                selectName = selector.name,
                col = selector.parentNode;

            selector.style.maxWidth = '75%';
            selector.style.order = 2;
            shuffle.style.right = '-12px';
            col.style.display = 'flex';
            col.style.alignItems = 'center';
            col.style.columnGap = '.2rem';

            appendDownSelect( col, selector, selectName, true );
            appendDownSelect( col, selector, selectName, false );
        }
        predictBtn.addEventListener('click', loadScryUrl);
    }

    // append next button
    function appendDownSelect( col, selector, name, down ) {
        const downAction = document.createElement('button');
        downAction.innerHTML = down ? '↡' : '↟';
        downAction.name = name;
        downAction.style.order = down ? 3 : 1;

        downAction.addEventListener('click', e => {
            changeSelect(selector, down, e);
        });

        col.appendChild(downAction);
    }

    // select next/prev option, ignoring all disabled options
    function changeSelect(selector, dir, e) {
        const select = selector;
        const direction = dir ? 1 : -1;

        const collectionArr = Array
        .from(select.options)
        .reduce((arr, opt, idx) => {
            if (!opt.disabled) arr.push(idx);
            return arr;
        }, []);


        const pos = collectionArr.indexOf(select.selectedIndex);
        const length = collectionArr.length;

        const nextPos = (pos + direction + length) % length;

        select.selectedIndex = collectionArr[nextPos];

        predict();
    }


    // append copy button and field to scry load box
    function buildCopy() {
        scryLoad.style.height = '145px';
        copyBtn.classList.add('beigebutton');
        copyBtn.classList.add('thingbutton');
        copyBtn.style.width = '100%';
        copyBtn.innerText = 'Copy Image BBC Code';
        scryLoad.appendChild(copyPasta);
        scryLoad.appendChild(copyBtn);
        copyBtn.addEventListener('click', copyToClipboard);
    }

    function loadScryUrl() {
        copyPasta.value = 'loading...';

        setTimeout(function(){
            copyPasta.value = '[img]' + getDragonImage() + '[/img]';
        }, 500);
    }

    function getDragonImage() {
        const dImg = document.getElementById('dragon-image'),
              dImgSrc = dImg.getElementsByTagName('img')[0].src;

        return dImgSrc;
    }

    // load settings
    function loadSettings() {
        const settingsContainer = document.createElement('div');

        let autoCopy = createCheck('autoCopy', 'Automatically Copy');
        let growUp = createCheck('growUp', 'Adult On Load');

        container.appendChild(settingsContainer);
        settingsContainer.style.position = 'absolute';
        settingsContainer.style.top = '0';
        settingsContainer.appendChild(autoCopy);
        settingsContainer.appendChild(growUp);
    }

    function copyToClipboard() {
        copyPasta.select();
        copyPasta.setSelectionRange(0, 99999);

        navigator.clipboard.writeText(copyPasta.value);
        document.execCommand('copy');

        appendMessage();
    }

    // post Message
    function appendMessage() {
        const message = document.createElement('div');

        message.innerHTML = 'copied to clipboard';
        scryLoad.appendChild(message);

        message.style.font = 'italic normal 9px Times, serif';
        message.style.margin = '3px 0';

        setTimeout( function() {
            scryLoad.removeChild(message);
        }, 1000 );
    }

    // checkbox el
    function createCheck( name, label ) {
        let itemContainer = document.createElement('div'),
            checkboxInput = document.createElement('input'),
            checkboxLabel = document.createElement('label'),
            getSavedVal = localStorage.getItem( name );

        checkboxInput.type = 'checkbox';
        checkboxInput.id = name;
        checkboxInput.name = name;

        checkboxLabel.innerText = label;
        checkboxLabel.setAttribute('for', name);

        itemContainer.appendChild(checkboxInput);
        itemContainer.appendChild(checkboxLabel);

        itemContainer.style.display = 'flex';
        itemContainer.style.alignItems = 'center';
        itemContainer.style.font = 'normal 10px/15px arial, sans-serif';
        checkboxLabel.style.paddingLeft = '.5rem';

        checkboxInput.checked = (getSavedVal == 'true' ) ? true : false;
        checkboxInput.addEventListener('click', updateSetting);

        applySetting( name, getSavedVal );

        return itemContainer;
    }

    // apply setting logic if true
    function applySetting( name, returnVal ) {
        if ( name == 'growUp' && returnVal == 'true' ) {
            let ageVal = document.getElementsByName('age')[0];

            if ( ageVal.value == 0 ) {
                changeSelect(ageVal);
            }
        }

        if ( name == 'autoCopy' && returnVal == 'true' ) {
            setTimeout(function(){
                copyToClipboard();
            }, 1000);
        }
    }

    function updateSetting( e ) {
        localStorage.setItem( e.target.name, e.target.checked );
    }

    // trigger predict
    function predict() {
        predictBtn.click();
    }

})();

QingJ © 2025

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