GeoGuessr Hide UI

lets you hide ui in several ways

安裝腳本?
作者推薦腳本

您可能也會喜歡 Geoguessr Singleplayer Interface Cleaner

安裝腳本
// ==UserScript==
// @name         GeoGuessr Hide UI
// @namespace    https://greasyfork.org/en/users/1501889
// @version      1312161.1312
// @description  lets you hide ui in several ways
// @author       Clemens
// @match        https://www.geoguessr.com/*
// @icon         https://www.google.com/s2/favicons?domain=geoguessr.com
// @run-at       document-idle
// @license      MIT
// ==/UserScript==

(function() {
    'use strict';

    const localStorageKeyViewMode = 'geoguessr_view_mode_v3';
    const localStorageKeyPreviousViewMode = 'geoguessr_previous_view_mode_v3';
    const localStorageKeyMapHidden = 'geoguessr_map_hidden_v3';
    const localStorageKeyHealthbarsHidden = 'geoguessr_healthbars_hidden_v3';

    const mapSelector = 'div[data-qa="guess-map"]';
    const compassSelector = '.panorama-compass_compassContainer__VAYam';
    const timerSelector = '#timernode';
    const scoreAndRoundSelector = '.game_status___YFni .status_inner__eAJp4:not(#timernode)';
    const mainStatusContainerSelector = '.game_status___YFni';
    const healthbarSelector = '.hud-2_healthbar__ut7QO, .health-bar_container__04NhD, .hud_healthbar__dpSHY';
    const bullseyeControlsSelector = '.game-panorama_controls__Bi3lQ';
    const bullseyeOverviewSelector = '.game-panorama_gameOverviewItems__Xf2qP';
    const liveChallengeControlsSelector = 'aside.game-panorama_controls__QiTp0';
    const liveChallengeOverviewSelector1 = 'div.map-status_status__I5Z6p';
    const liveChallengeOverviewSelector2 = 'div.guess-status_guessStatus__AGJUD';
    const gameLogoSelector = 'div.game_logos__XclXP';
    const clockSelector = 'div.clock_clock__pnvie';
    const partyGameDuelsControlsSelector = 'aside.duels-panorama_controls___OEib';
    const keyboardShortcutsSelector = 'div[style*="display: inline-flex; position: absolute; right: 0px; bottom: 0px;"]';

    const nonMapOverlays = [
        '.game_controls__xgq6p',
        '.game_inGameLogos__T9d3L',
        'img[alt="Google Maps Logo"]',
        bullseyeControlsSelector,
        bullseyeOverviewSelector,
        liveChallengeControlsSelector,
        liveChallengeOverviewSelector1,
        liveChallengeOverviewSelector2,
        gameLogoSelector,
        partyGameDuelsControlsSelector,
        scoreAndRoundSelector,
        timerSelector,
        clockSelector,
        keyboardShortcutsSelector
    ];

    const allUIElements = nonMapOverlays.concat([
        mapSelector,
        compassSelector,
        mainStatusContainerSelector
    ]);

    const setViewMode = (mode) => {
        const currentMode = localStorage.getItem(localStorageKeyViewMode) || 'default';
        if (currentMode !== mode) {
            localStorage.setItem(localStorageKeyPreviousViewMode, currentMode);
        }
        localStorage.setItem(localStorageKeyViewMode, mode);
        applySavedPreference();
    };

    const resetToDefault = () => {
        localStorage.setItem(localStorageKeyViewMode, 'default');
        localStorage.setItem(localStorageKeyMapHidden, 'false');
        localStorage.setItem(localStorageKeyHealthbarsHidden, 'false');
        applySavedPreference();
    };

    const applySavedPreference = () => {
        const viewMode = localStorage.getItem(localStorageKeyViewMode) || 'default';
        const isMapHidden = localStorage.getItem(localStorageKeyMapHidden) === 'true';
        const isHealthbarsHidden = localStorage.getItem(localStorageKeyHealthbarsHidden) === 'true';

        const elements = {};
        allUIElements.forEach(selector => {
            const el = document.querySelector(selector);
            if (el) {
                elements[selector] = el;
            }
        });

        Object.values(elements).forEach(el => { el.style.display = 'none'; });
        document.querySelectorAll(healthbarSelector).forEach(el => { el.style.display = 'none'; });

        const selectorsToShow = new Set();
        switch (viewMode) {
            case 'default':
                allUIElements.forEach(selector => selectorsToShow.add(selector));
                break;
            case 'minimal':
                selectorsToShow.add(mapSelector);
                selectorsToShow.add(compassSelector);
                selectorsToShow.add(clockSelector);
                break;
            case 'focused-timer':
                selectorsToShow.add(mapSelector);
                selectorsToShow.add(compassSelector);
                selectorsToShow.add(mainStatusContainerSelector);
                selectorsToShow.add(timerSelector);
                selectorsToShow.add(clockSelector);
                break;
            case 'focused-all-status':
                selectorsToShow.add(mapSelector);
                selectorsToShow.add(compassSelector);
                selectorsToShow.add(mainStatusContainerSelector);
                selectorsToShow.add(scoreAndRoundSelector);
                selectorsToShow.add(timerSelector);
                selectorsToShow.add(bullseyeOverviewSelector);
                selectorsToShow.add(liveChallengeOverviewSelector1);
                selectorsToShow.add(liveChallengeOverviewSelector2);
                selectorsToShow.add(clockSelector);
                break;
            case 'map-only':
                selectorsToShow.add(mapSelector);
                break;
            case 'all-hidden':
                break;
        }

        allUIElements.forEach(selector => {
            if (elements[selector]) {
                elements[selector].style.display = selectorsToShow.has(selector) ? '' : 'none';
            }
        });

        if (isMapHidden && elements[mapSelector]) {
            elements[mapSelector].style.display = 'none';
        }

        if (!isHealthbarsHidden) {
            document.querySelectorAll(healthbarSelector).forEach(el => { el.style.display = ''; });
        }
    };

    const observer = new MutationObserver((mutationsList) => {
        for (const mutation of mutationsList) {
            if (mutation.type === 'childList' && document.querySelector(mapSelector)) {
                applySavedPreference();
                break;
            }
        }
    });

    document.addEventListener('keydown', (event) => {
        const target = event.target;
        const isEditable = target.isContentEditable ||
                           target.tagName === 'INPUT' ||
                           target.tagName === 'TEXTAREA' ||
                           target.tagName === 'SELECT' ||
                           (target.hasAttribute('role') && target.getAttribute('role') === 'textbox');

        if (isEditable) {
            return;
        }

        const currentViewMode = localStorage.getItem(localStorageKeyViewMode);
        const hotkeys = ['z', 'u', 'h', 'j', 'k', 'i', 'o'];

        if (hotkeys.includes(event.key)) {
            event.preventDefault();
        }

        if (event.key === 'z') {
            if (currentViewMode === 'all-hidden') {
                setViewMode('map-only');
            } else if (currentViewMode === 'map-only') {
                setViewMode('all-hidden');
            } else {
                const isMapHidden = localStorage.getItem(localStorageKeyMapHidden) === 'true';
                localStorage.setItem(localStorageKeyMapHidden, (!isMapHidden).toString());
                applySavedPreference();
            }
        }

        if (event.key === 'u') {
            setViewMode('all-hidden');
        }

        if (event.key === 'h') {
            localStorage.setItem(localStorageKeyMapHidden, 'false');
            if (currentViewMode === 'minimal') {
                setViewMode(localStorage.getItem(localStorageKeyPreviousViewMode) || 'default');
            } else {
                setViewMode('minimal');
            }
        }

        if (event.key === 'j') {
            localStorage.setItem(localStorageKeyMapHidden, 'false');
            if (currentViewMode === 'focused-timer') {
                setViewMode(localStorage.getItem(localStorageKeyPreviousViewMode) || 'default');
            } else {
                setViewMode('focused-timer');
            }
        }

        if (event.key === 'k') {
            localStorage.setItem(localStorageKeyMapHidden, 'false');
            if (currentViewMode === 'focused-all-status') {
                setViewMode(localStorage.getItem(localStorageKeyPreviousViewMode) || 'default');
            } else {
                setViewMode('focused-all-status');
            }
        }

        if (event.key === 'o') {
            const isHealthbarsHidden = localStorage.getItem(localStorageKeyHealthbarsHidden) === 'true';
            localStorage.setItem(localStorageKeyHealthbarsHidden, (!isHealthbarsHidden).toString());
            applySavedPreference();
        }

        if (event.key === 'i') {
            resetToDefault();
        }
    });

    observer.observe(document.body, { childList: true, subtree: true });

    applySavedPreference();
})();