GeoGuessr Hide UI

lets you hide ui in singleplayer and duels in several different ways

Från och med 2025-08-11. Se den senaste versionen.

// ==UserScript==
// @name         GeoGuessr Hide UI
// @namespace    https://greasyforks.org/en/users/1501889
// @version      1312161
// @description  lets you hide ui in singleplayer and duels in several different 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';

    const nonMapOverlays = [
        '.game_controls__xgq6p',
        '.game_inGameLogos__T9d3L',
        'img[alt="Google Maps Logo"]',
        'div[style*="position: absolute; right: 0px; bottom: 0px;"] .gmnoprint',
        '.duels-panorama_controls___OEib'
    ];

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

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

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

        document.querySelectorAll(allUIElements.join(', ') + ', ' + scoreAndRoundSelector + ', ' + timerSelector + ', ' + healthbarSelector).forEach(el => {
            el.style.display = 'none';
        });

        const mainStatus = document.querySelector(mainStatusContainerSelector);
        if (mainStatus) {
            mainStatus.style.display = 'none';
        }

        switch (viewMode) {
            case 'default': {
                document.querySelectorAll(allUIElements.join(', ') + ', ' + scoreAndRoundSelector + ', ' + timerSelector).forEach(el => {
                    el.style.display = '';
                });
                break;
            }
            case 'minimal': {
                document.querySelector(mapSelector).style.display = '';
                document.querySelector(compassSelector).style.display = '';
                break;
            }
            case 'focused-timer': {
                document.querySelector(mapSelector).style.display = '';
                document.querySelector(compassSelector).style.display = '';
                if (mainStatus) mainStatus.style.display = '';
                const timer = document.querySelector(timerSelector);
                if (timer) timer.style.display = '';
                const scoreAndRound = document.querySelector(scoreAndRoundSelector);
                if (scoreAndRound) scoreAndRound.style.display = 'none';
                break;
            }
            case 'focused-all-status': {
                document.querySelector(mapSelector).style.display = '';
                document.querySelector(compassSelector).style.display = '';
                if (mainStatus) mainStatus.style.display = '';
                const scoreAndRound = document.querySelector(scoreAndRoundSelector);
                if (scoreAndRound) scoreAndRound.style.display = '';
                const timer = document.querySelector(timerSelector);
                if (timer) timer.style.display = '';
                break;
            }
            case 'all-hidden': {
                break;
            }
            case 'map-only': {
                document.querySelector(mapSelector).style.display = '';
                break;
            }
        }

        if (isMapHidden && (viewMode === 'default' || viewMode === 'minimal' || viewMode === 'focused-timer' || viewMode === 'focused-all-status')) {
            const mapContainer = document.querySelector(mapSelector);
            if (mapContainer) mapContainer.style.display = 'none';
        }

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

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

    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);

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

        if (event.key === 'u') {
            if (currentViewMode === 'all-hidden') {
                const previousMode = localStorage.getItem(localStorageKeyPreviousViewMode);
                saveAndSetViewMode(previousMode || 'default');
            } else {
                saveAndSetViewMode('all-hidden');
            }
        }

        if (event.key === 'h') {
            if (currentViewMode === 'minimal') {
                const previousMode = localStorage.getItem(localStorageKeyPreviousViewMode);
                saveAndSetViewMode(previousMode || 'default');
            } else {
                saveAndSetViewMode('minimal');
            }
        }

        if (event.key === 'j') {
            if (currentViewMode === 'focused-timer') {
                const previousMode = localStorage.getItem(localStorageKeyPreviousViewMode);
                saveAndSetViewMode(previousMode || 'default');
            } else {
                saveAndSetViewMode('focused-timer');
            }
        }

        if (event.key === 'k') {
            if (currentViewMode === 'focused-all-status') {
                const previousMode = localStorage.getItem(localStorageKeyPreviousViewMode);
                saveAndSetViewMode(previousMode || 'default');
            } else {
                saveAndSetViewMode('focused-all-status');
            }
        }

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

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

        const hotkeys = ['z', 'u', 'h', 'j', 'k', 'i', 'o'];
        if (hotkeys.includes(event.key)) {
            event.preventDefault();
        }
    });

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

    applySavedPreference();
})();
长期地址
遇到问题?请前往 GitHub 提 Issues。