HWHAdvExt

Extension for Hero Wars Helper. Modifies the adventure button to fetch the paths from https://www.solfors.com. You can choose any path listed and it will do it automatically. HeroWarsHelper

K instalaci tototo skriptu si budete muset nainstalovat rozšíření jako Tampermonkey, Greasemonkey nebo Violentmonkey.

You will need to install an extension such as Tampermonkey to install this script.

K instalaci tohoto skriptu si budete muset nainstalovat rozšíření jako Tampermonkey nebo Violentmonkey.

K instalaci tohoto skriptu si budete muset nainstalovat rozšíření jako Tampermonkey nebo Userscripts.

You will need to install an extension such as Tampermonkey to install this script.

K instalaci tohoto skriptu si budete muset nainstalovat manažer uživatelských skriptů.

(Už mám manažer uživatelských skriptů, nechte mě ho nainstalovat!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(Už mám manažer uživatelských stylů, nechte mě ho nainstalovat!)

// ==UserScript==
// @name            HWHAdvExt
// @namespace       HWHAdvExt
// @version         0.0.5
// @license         Copyright ZingerY & orb 
// @description     Extension for Hero Wars Helper. Modifies the adventure button to fetch the paths from https://www.solfors.com. You can choose any path listed and it will do it automatically. HeroWarsHelper
// @author          ZingerY
// @match           https://www.hero-wars.com/*
// @match           https://apps-1701433570146040.apps.fbsbx.com/*
// @match           https://www.solfors.com/*

// @run-at          document-start
// @grant           GM_xmlhttpRequest
// @connect         solfors.com
// ==/UserScript==

(function () {
    if (!this.HWHClasses) {
        console.log('%cHeroWarsHelper not found', 'color: red');
        return;
    }

    console.log('%cHWH Adventure Extension loaded', 'color: green');
    const { addExtentionName, getSaveVal, I18N, popup, setSaveVal } = HWHFuncs;
    addExtentionName(GM_info.script.name, GM_info.script.version, GM_info.script.author);
    
    // Store original getPath method
    const originalGetPath = HWHClasses.executeAdventure.prototype.getPath;
    
    // Override getPath method
    HWHClasses.executeAdventure.prototype.getPath = async function () {
        const oldVal = getSaveVal('adventurePath', '');
        const keyPath = `adventurePath:${this.mapIdent}`;
        
        // Get paths from solfors.com
        const solforsPaths = await this.fetchSolforsPaths();
        
        // Prepare popup buttons
        const popupButtons = [
            {
                msg: I18N('START_ADVENTURE'),
                placeholder: '1,2,3,4,5,6',
                isInput: true,
                default: getSaveVal(keyPath, oldVal)
            },
            {
                msg: I18N('BTN_CANCEL'),
                result: false,
                isCancel: true
            }
        ];
        
        // Add Solfors path buttons if available
        if (solforsPaths) {
            ['blue', 'orange', 'green'].forEach(color => {
                if (solforsPaths[color]) {
                    popupButtons.unshift({
                        msg: `${color === 'blue' ? '🔵' : color === 'orange' ? '🟠' : '🟢'} ${color.charAt(0).toUpperCase() + color.slice(1)}: ${solforsPaths[color]}`,
                        result: solforsPaths[color],
                        isPathButton: true
                    });
                }
            });
        }
        
        const answer = await popup.confirm('SELECT PATH OR ENTER A CUSTOM PATH', popupButtons);
        
        if (!answer) {
            this.terminatеReason = I18N('BTN_CANCELED');
            return false;
        }

        let path = answer.split(',');
        if (path.length < 2) {
            path = answer.split('-');
        }
        if (path.length < 2) {
            this.terminatеReason = I18N('MUST_TWO_POINTS');
            return false;
        }

        for (let p in path) {
            path[p] = +path[p].trim();
            if (Number.isNaN(path[p])) {
                this.terminatеReason = I18N('MUST_ONLY_NUMBERS');
                return false;
            }
        }

        if (!this.checkPath(path)) {
            return false;
        }
        setSaveVal(keyPath, answer);
        return path;
    };
    
    // Method to fetch paths from solfors.com
    HWHClasses.executeAdventure.prototype.fetchSolforsPaths = async function () {
        try {
            // Get adventure ID
            const adventureInfo = await Caller.send('adventure_getInfo');
            const adventureId = adventureInfo.adventureId;
            console.log('Current adventure:', adventureId);
            
            if (!adventureId || adventureId < 1 || adventureId > 12) {
                console.log('Invalid adventure ID');
                return null;
            }
            
            const url = `https://www.solfors.com/adventure/${adventureId}`;
            console.log('Fetching paths from:', url);
            
            // Fetch page content
            const response = await new Promise((resolve) => {
                GM_xmlhttpRequest({
                    method: "GET",
                    url: url,
                    onload: resolve,
                    onerror: () => resolve(null)
                });
            });
            
            if (!response || response.status !== 200) {
                console.log('Failed to fetch Solfors page');
                return null;
            }
            
            // Improved path extraction
            const text = response.responseText.replace(/<[^>]*>/g, ' '); // Remove HTML tags
            const paths = {};
            
            // Regex to capture the full path including optional Boss suffix
            const pathRegex = /(Blue|Orange|Green)\s*:\s*((?:\d+-)*\d+)(?:-Boss(?:\(x\d+\))?)?/gi;
            let match;
            
            while ((match = pathRegex.exec(text)) !== null) {
                const color = match[1].toLowerCase();
                // Clean up the path - this now captures ONLY the numbers part (match[2])
                let pathValue = match[2] // This is the captured numbers part only
                    .trim()
                    .replace(/\s+/g, ''); // Remove all whitespace
                
                paths[color] = pathValue;
                console.log(`Found ${color} path: ${pathValue}`);
            }
            
            if (Object.keys(paths).length === 0) {
                console.log('No paths found in page content');
                console.log('Content sample:', text.substring(0, 500));
                return null;
            }
            
            return paths;
            
        } catch (error) {
            console.error('Error in fetchSolforsPaths:', error);
            return null;
        }
    };

})();