Geoguessr Map Tracker by Eurya

Geoguessr'da gelen konumu otomatik olarak algılayıp panel aracılığıyla oyuncuya gösteren bir araç.

目前為 2025-10-22 提交的版本,檢視 最新版本

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

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

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name         Geoguessr Map Tracker by Eurya
// @namespace    http://tampermonkey.net/
// @version      26.0.1
// @description  Geoguessr'da gelen konumu otomatik olarak algılayıp panel aracılığıyla oyuncuya gösteren bir araç.
// @match        https://www.geoguessr.com/*
// @grant        GM_addStyle
// @run-at       document-start
// @license      CC BY-NC
// ==/UserScript==
/* global google */

(function() {
'use strict';

const PANEL_ID = 'eurya-gmaps-panel';
const MAP_ID = 'eurya-gmaps-map';
const ICON_URL = 'https://i.ibb.co/VY5Jz0nB/icon.png';
const WC25_LOGO = 'https://images.squarespace-cdn.com/content/v1/636e083394b53b69d6c3e3fb/c5706bfb-12d7-4fec-b440-adc2849c5862/GG+WC25+%28Logo%29.png';
const WC25_URL = 'https://www.geoguessr.com/tr';
const GOOGLE_API_KEY = 'YOUR_GOOGLE_API_KEY_HERE';

let map, marker, mapReady = false;
let currentRoundCoordinates = { lat: null, lng: null };
let lastKnownCoordinates = { lat: null, lng: null };

// ✨ Shine stil efekti kodları
GM_addStyle(`
    .shine-panel::before { content: ''; position: absolute; top:0; left:0; width:100%; height:100%; background: linear-gradient(45deg, rgba(224,247,255,0) 25%, rgba(255,255,255,0.4) 50%, rgba(192,232,255,0) 75%); background-size: 400% 400%; animation: shine45 2.5s linear infinite; pointer-events: none; }
    @keyframes shine45 { 0% { background-position: 200% 200%; } 100% { background-position: -200% -200%; } }

    .eurya-shine { font-weight:600; font-size:18px; color: #ffffff; background: linear-gradient(45deg, #e0f7ff 25%, #ffffff 50%, #c0e8ff 75%); background-size: 200% 200%; -webkit-background-clip: text; -webkit-text-fill-color: transparent; animation: shine 2.5s linear infinite; }
    @keyframes shine { 0% { background-position: 200% 0; } 100% { background-position: -200% 0; } }

    #toggle-controls.shine { background: linear-gradient(45deg, #e0f7ff 25%, #ffffff 50%, #c0e8ff 75%); background-size: 200% 200%; color: black; animation: shineBtn 2s linear infinite; }
    @keyframes shineBtn { 0% { background-position: 200% 0; } 100% { background-position: -200% 0; } }

    #country-label { position: absolute; top: 35px; left: 50%; transform: translateX(-50%) scale(1.2); background: linear-gradient(135deg, rgba(255,255,255,0.9), rgba(180,255,255,1)); color: black; font-size: 8px; font-weight: 540; padding: 2px 8px; border-radius: 6px; box-shadow: 0 0 15px rgba(255,255,255,0.9); z-index: 9; pointer-events: none; white-space: nowrap; display:none; transition: all 0.3s ease; }
`);

// XHR hijack
const originalOpen = XMLHttpRequest.prototype.open;
XMLHttpRequest.prototype.open = function(method, url) {
    if (method.toUpperCase() === 'POST' &&
        (url.includes('MapsJsInternalService/GetMetadata') || url.includes('MapsJsInternalService/SingleImageSearch'))) {
        this.addEventListener('load', function () {
            try {
                const pattern = /-?\d+\.\d+,-?\d+\.\d+/g;
                const match = this.responseText.match(pattern);
                if (match && match.length > 0) {
                    const coords = match[0].split(",");
                    currentRoundCoordinates.lat = parseFloat(coords[0]);
                    currentRoundCoordinates.lng = parseFloat(coords[1]);
                    if(currentRoundCoordinates.lat !== lastKnownCoordinates.lat ||
                       currentRoundCoordinates.lng !== lastKnownCoordinates.lng) {
                        updateMapPosition();
                        lastKnownCoordinates = Object.assign({}, currentRoundCoordinates);
                    }
                }
            } catch(e){}
        });
    }
    return originalOpen.apply(this, arguments);
};

// Panel ve draggable
function createPanel() {
    if (document.getElementById(PANEL_ID)) return;
    const panel = document.createElement('div');
    panel.id = PANEL_ID;
    panel.style.display = 'flex';
    panel.dataset.manualToggle = 'true';
    panel.innerHTML = `
        <div id="panel-header" class="shine-panel" style="background-color: black; color:white; padding:8px; height:55px; display:flex; align-items:center; justify-content:flex-start; border-top-left-radius:8px; border-top-right-radius:8px; font-size:22px; position: relative; overflow: hidden;">
            <a href="${WC25_URL}" target="_blank"><img src="${WC25_LOGO}" style="width:60px; height:60px; margin-right:100px; margin-left:0px; margin-top:5px;"></a>
            <div style="margin-left:auto; display:flex; align-items:center;">
                <span style="color: rgba(255,255,255,0.5); font-size:16px; margin-right:3px;">by</span>
                <span class="eurya-shine" style="font-size:16px;">Eurya</span>
            </div>
            <button id="toggle-controls"></button>
            <div id="country-label"></div>
        </div>
        <div id="${MAP_ID}" style="flex-grow:1;height:260px;position:relative;"></div>
    `;
    panel.style.cssText = `position: fixed; top: 10px; right: 10px; z-index: 99999; width: 280px; height: 350px; background: #1a1a1a; border: 2px solid #ffffff; border-radius: 8px; box-shadow: 0 4px 15px rgba(255,255,255,0.3); display: flex; flex-direction: column; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; overflow: hidden;`;
    document.body.appendChild(panel);

    makeDraggable(panel);
    initMapOnce();
    observeRoundChanges();
    observeGameChanges();
    observePanelResize(panel);

    const toggleBtn = document.getElementById('toggle-controls');
    toggleBtn.style.cssText = `position: absolute; top: 0px; left: 50%; width: 20px; height: 20px; font-size: 16px; font-weight: bold; border: none; border-radius: 6px; background: rgba(255,255,255,0.25); color: white; cursor: pointer; transition: all 0.3s ease; transform: translateX(-50%) scale(1); box-shadow: 0 0 5px rgba(255,255,255,0.5); z-index: 10;`;
    toggleBtn.textContent = '≡';

    let controlsVisible = false;
    toggleBtn.addEventListener('click', () => {
        if (!map) return;
        controlsVisible = !controlsVisible;

        map.setOptions({
            zoomControl: false,
            streetViewControl: controlsVisible,
            fullscreenControl: controlsVisible,
            mapTypeControl: controlsVisible
        });

        const countryLabel = document.getElementById('country-label');
        if (controlsVisible) {
            toggleBtn.textContent = '✕';
            toggleBtn.classList.add('shine');
            countryLabel.style.display = 'block';
        } else {
            toggleBtn.textContent = '≡';
            toggleBtn.classList.remove('shine');
            countryLabel.style.display = 'none';
        }
    });
}

// Google Maps Geocoder
function getCountryName(lat, lng, callback) {
    if (!lat || !lng) { callback(""); return; }
    const geocoder = new google.maps.Geocoder();
    geocoder.geocode({ location: {lat, lng} }, (results, status) => {
        if (status === "OK" && results[0]) {
            const countryComponent = results[0].address_components.find(c => c.types.includes("country"));
            if (countryComponent) { callback(countryComponent.long_name); return; }
        }
        callback("");
    });
}

// Map setup
function initMapOnce() {
    if (mapReady) return;
    const mapDiv = document.getElementById(MAP_ID);
    if (!mapDiv) return;
    if (typeof google === 'undefined' || !google.maps) {
        const script = document.createElement('script');
        script.src = `https://maps.googleapis.com/maps/api/js?key=${GOOGLE_API_KEY}`;
        document.head.appendChild(script);
        script.onload = () => { setupMap(); };
    } else { setupMap(); }
}

function setupMap() {
    map = new google.maps.Map(document.getElementById(MAP_ID), {
        center: { lat: 0, lng: 0 },
        zoom: 3,
        mapTypeControl: false,
        streetViewControl: false,
        fullscreenControl: false,
        zoomControl: false,
        gestureHandling: "auto",
        scrollwheel: true
    });

    const normalIcon = { url: ICON_URL, scaledSize: new google.maps.Size(25,25) };
    const hoverIcon = { url: ICON_URL, scaledSize: new google.maps.Size(35,35) };

    marker = new google.maps.Marker({
        position: { lat: 0, lng: 0 },
        map: map,
        icon: normalIcon
    });
    marker.addListener('mouseover', () => marker.setIcon(hoverIcon));
    marker.addListener('mouseout', () => marker.setIcon(normalIcon));

    mapReady = true;
}

// ✨ Konumun bulunduğu ülke adını butona basınca ekranda gösterir
function updateMapPosition() {
    if (!mapReady || !marker) return;
    const { lat, lng } = currentRoundCoordinates;
    if (!lat || !lng) return;

    marker.setPosition(new google.maps.LatLng(lat, lng));
    map.setCenter(new google.maps.LatLng(lat, lng));
    map.setZoom(getZoomLevelForLatLng(lat, lng));

    getCountryName(lat, lng, name => {
        const countryLabel = document.getElementById('country-label');
        if (countryLabel) countryLabel.textContent = name;
    });
}

function getZoomLevelForLatLng(lat,lng){
    if(isCoordInCountry(lat,lng,"Bangladesh")) return 5.7;
    if(isCoordInCountry(lat,lng,"Sri Lanka")) return 6;
    if(isCoordInCountry(lat,lng,"USA")) return 4;
    if(isCoordInCountry(lat,lng,"Uruguay")) return 5.5;
    if(isCoordInCountry(lat,lng,"Gibraltar")) return 12.2;
    if(isCoordInCountry(lat,lng,"India")) return 4;
    if(isCoordInCountry(lat, lng,"Northern Ireland")) return 7;
    if(isCoordInCountry(lat,lng,"Singapore")) return 9.8;
    if(isCoordInCountry(lat,lng,"Liechtenstein")) return 9.7;
    if(isCoordInCountry(lat,lng,"Canary Islands")) return 6;
    if(isCoordInCountry(lat,lng,"Puerto Rico")) return 7.5;
    if(isCoordInCountry(lat,lng,"Guatemala")) return 6.5;
    if(isCoordInCountry(lat,lng,"Christmas Island")) return 10.2;
    if(isCoordInCountry(lat,lng,"Cocos Islands")) return 10.5;
    if(isCoordInCountry(lat,lng,"Macau")) return 9.3;
    if(isCoordInCountry(lat, lng, "Ireland")) return 6;
    if(isCoordInCountry(lat, lng,"Ecuador")) return 6;
    if(isCoordInCountry(lat, lng,"Colombia")) return 5;
    if(isCoordInCountry(lat,lng,"North Macedonia")) return 7;
    if(isCoordInCountry(lat, lng,"Bolivia")) return 4.7;
    if(isCoordInCountry(lat, lng,"Peru")) return 5;
    if(isCoordInCountry(lat,lng,"Malaysia")) return 6;
    if(isCoordInCountry(lat,lng,"Brazil")) return 3.5;
    if(isCoordInCountry(lat,lng,"Kyrgyzstan")) return 5.4;
    if(isCoordInCountry(lat,lng,"Poland")) return 5.1;
    if(isCoordInCountry(lat,lng,"Alaska")) return 3.2;
    if(isCoordInCountry(lat,lng,"Austria")) return 5.9;
    if(isCoordInCountry(lat,lng,"Thailand")) return 5.4;
    if(isCoordInCountry(lat,lng,"Argentina")) return 4.7;
    if(isCoordInCountry(lat,lng,"Chile")) return 3.6;
    if(isCoordInCountry(lat,lng,"Canada")) return 4;
    if(isCoordInCountry(lat,lng,"Albania")) return 6;
    if(isCoordInCountry(lat,lng,"Switzerland")) return 6;
    if(isCoordInCountry(lat,lng,"Slovakia")) return 6;
    if(isCoordInCountry(lat,lng,"Ukraine")) return 5;
    if(isCoordInCountry(lat,lng,"Finland")) return 4.6;
    if(isCoordInCountry(lat,lng,"Israel")) return 6.5;
    if(isCoordInCountry(lat,lng,"UAE")) return 6.5;
    if(isCoordInCountry(lat,lng,"Oman")) return 5.5;
    if(isCoordInCountry(lat,lng,"Tunisia")) return 6;
    if(isCoordInCountry(lat,lng,"Malta")) return 9.4;
    if(isCoordInCountry(lat,lng,"Luxembourg")) return 7;
    if(isCoordInCountry(lat,lng,"Andorra")) return 9.1;
    if(isCoordInCountry(lat,lng,"San Marino")) return 11;
    if(isCoordInCountry(lat,lng,"Philippines")) return 5.5;
    if(isCoordInCountry(lat,lng,"Monaco")) return 13;
    if(isCoordInCountry(lat,lng,"Guam")) return 9.8;
    if(isCoordInCountry(lat,lng,"Bermuda")) return 10.5;
    if(isCoordInCountry(lat,lng,"Dominican Republic")) return 6.3;
    if(isCoordInCountry(lat,lng,"Faroe Islands")) return 6.5;
    if(isCoordInCountry(lat,lng,"Costa Rica")) return 6.5;
    if(isCoordInCountry(lat,lng,"Panama")) return 6.5;
    if(isCoordInCountry(lat,lng,"Greece")) return 6;
    if(isCoordInCountry(lat,lng,"Denmark")) return 6;
    if(isCoordInCountry(lat,lng,"Sweden")) return 4.4;
    if(isCoordInCountry(lat,lng,"Italy")) return 5.7;
    if(isCoordInCountry(lat, lng,"Greenland")) return 3.5;
    if(isCoordInCountry(lat,lng,"Mexico")) return 4.2;
    if(isCoordInCountry(lat,lng,"Taiwan")) return 6.3;
    if(isCoordInCountry(lat,lng,"Hong Kong")) return 9;
    if(isCoordInCountry(lat,lng,"Japan")) return 5;
    if(isMediumEuropeanCountry(lat,lng)) return 6;
    if(isLargeEuropeanCountry(lat,lng)) return 5;
    if(isSmallEuropeanCountry(lat,lng)) return 7;
    if(isLargeCountry(lat,lng)) return 3;
    if(isArchipelagoCountry(lat,lng)) return 4.2;
    if(isSmallCountry(lat,lng)) return 6.5;
    if(isCoordInCountry(lat,lng,"Australia")) return 3.8;
    return 5;
}

// ✨ Koordinat kontrolleri
function isMediumEuropeanCountry(lat,lng){ const m=["Romania","Bulgaria","Hungary","Croatia","Slovenia","Serbia","Bosnia","Moldova","Poland","Lithuania","Latvia","Estonia","Netherlands","Belgium"]; return m.some(c=>isCoordInCountry(lat,lng,c)); }
function isLargeEuropeanCountry(lat,lng){ const l=["Italy","United Kingdom","Greece","Spain","France","Germany"]; return l.some(c=>isCoordInCountry(lat,lng,c)); }
function isSmallEuropeanCountry(lat,lng){ const s=["San Marino","Monaco","Liechtenstein","Andorra"]; return s.some(c=>isCoordInCountry(lat,lng,c)); }
function isLargeCountry(lat,lng){ const l=["Russia"]; return l.some(c => isCoordInCountry(lat,lng,c)); } // Avustralya ve Brezilya artık özel zoom
function isSmallCountry(lat,lng){ return isCoordInCountry(lat,lng,"Singapore","Gibraltar"); }
function isArchipelagoCountry(lat,lng){ const arch=["Indonesia","Philippines","Japan","Norway","New Zealand","Canary Islands"]; return arch.some(c => isCoordInCountry(lat,lng,c)); }

function isCoordInCountry(lat,lng,c){
    switch(c){
        case "Mexico": return lat>14&&lat<33 && lng>-119&&lng<-86;
        case "USA": return lat>24&&lat<49 && lng>-125&&lng<-66;
        case "Russia": return lat>41&&lat<82 && lng>19&&lng<180;
        case "Gibraltar": return lat>36.10 && lat<36.17 && lng>-5.37 && lng<-5.32;
        case "Northern Ireland": return lat>54.0 && lat<55.4 && lng>-8.2 && lng<-5.3;
        case "Christmas Island": return lat>-11.7 && lat<-10.3 && lng>105.4 && lng<106.0;
        case "Cocos Islands": return lat>-12.3 && lat<-11.6 && lng>96.7 && lng<97.3;
        case "Macau": return lat>22.1 && lat<22.25 && lng>113.5 && lng<113.7;
        case "Brazil": return lat>-35&&lat<6 && lng>-74&&lng<-34;
        case "Ecuador": return lat > -5 && lat < 2 && lng > -81 && lng < -75;
        case "Australia": return lat>-44&&lat<-10 && lng>112&&lng<154;
        case "Indonesia": return lat>-11&&lat<6 && lng>95&&lng<141;
        case "Philippines": return lat>4&&lat<21 && lng>116&&lng<127;
        case "Japan": return lat>24&&lat<46 && lng>123&&lng<146;
        case "Norway": return lat>57&&lat<72 && lng>4&&lng<31;
        case "San Marino": return lat>43.9 && lat<44.0 && lng>12.44 && lng<12.48;
        case "New Zealand": return lat>-48&&lat<-33 && lng>165&&lng<180;
        case "Italy": return lat>36&&lat<47 && lng>6&&lng<19;
        case "United Kingdom": return lat>49&&lat<60 && lng>-8&&lng<2;
        case "Greece": return lat>34&&lat<42 && lng>19&&lng<29;
        case "Spain": return lat>36&&lat<44 && lng>-9&&lng<4;
        case "France": return lat>41&&lat<51 && lng>-5&&lng<9;
        case "Germany": return lat>47&&lat<55 && lng>5&&lng<15;
        case "Romania": return lat>43&&lat<48 && lng>20&&lng<29;
        case "Bulgaria": return lat>41&&lat<44 && lng>22&&lng<28;
        case "Hungary": return lat>46&&lat<48 && lng>16&&lng<20;
        case "Croatia": return lat>42&&lat<46 && lng>15&&lng<19;
        case "Slovenia": return lat>45&&lat<47 && lng>13&&lng<16;
        case "Serbia": return lat>43&&lat<46 && lng>19&&lng<22;
        case "Bosnia": return lat>42&&lat<45 && lng>16&&lng<19;
        case "Moldova": return lat>46&&lat<48 && lng>27&&lng<30;
        case "Poland": return lat>49&&lat<55 && lng>14&&lng<24;
        case "Lithuania": return lat>53&&lat<56 && lng>20&&lng<26;
        case "Latvia": return lat>55&&lat<58 && lng>21&&lng<28;
        case "Estonia": return lat>57&&lat<60 && lng>21&&lng<28;
        case "Netherlands": return lat>50.7 && lat<53.6 && lng>3.3 && lng<7.2;
        case "Belgium": return lat>49.5 && lat<51.5 && lng>2.5 && lng<6.4;
        case "Malta": return lat>35.8&&lat<36 && lng>14.2&&lng<14.6;
        case "Monaco": return lat>43.72&&lat<43.75 && lng>7.4&&lng<7.45;
        case "Liechtenstein": return lat>47.05&&lat<47.27 && lng>9.47&&lng<9.63;
        case "Andorra": return lat>42.4&&lat<42.7 && lng>1.4&&lng<1.75;
        case "Singapore": return lat>1.2&&lat<1.5 && lng>103.6&&lng<104;
        case "Taiwan": return lat>21.5&&lat<25.5 && lng>119.5&&lng<122.5;
        case "Hong Kong": return lat>22.1&&lat<22.6 && lng>113.8&&lng<114.3;
        case "Argentina": return lat>-55&&lat<-21 && lng>-73&&lng<-53;
        case "Chile": return lat>-56&&lat<-17 && lng>-75&&lng<-66;
        case "Uruguay": return lat>-35&&lat<-30 && lng>-58&&lng<-53;
        case "India": return lat>6&&lat<37 && lng>68&&lng<97;
        case "Thailand": return lat>5&&lat<21 && lng>97&&lng<106;
        case "Malaysia": return lat>0.5&&lat<7.5 && lng>100&&lng<120;
        case "Kyrgyzstan": return lat>39&&lat<43 && lng>69&&lng<80;
        case "Alaska": return lat>54&&lat<72 && lng>-170&&lng<-129;
        case "Bangladesh": return lat>20.5&&lat<26.5 && lng>88&&lng<92;
        case "Sri Lanka": return lat>5.9&&lat<9.9 && lng>79.7&&lng<81.9;
        case "Austria": return lat>46.5 && lat<49.1 && lng>9.5 && lng<17;
        case "Bangladesh": return lat>20.5 && lat<26.5 && lng>88 && lng<92;
        case "Canada": return lat>41&&lat<84 && lng>-141&&lng<-52;
        case "Albania": return lat > 39 && lat < 42 && lng > 19 && lng < 21;
        case "Switzerland": return lat > 45.8 && lat < 47.8 && lng > 5.9 && lng < 10.5;
        case "Slovakia": return lat > 47.7 && lat < 49.6 && lng > 16.8 && lng < 22.6;
        case "Ukraine": return lat > 44.4 && lat < 52.4 && lng > 22 && lng < 40;
        case "Finland": return lat > 59.9 && lat < 70.1 && lng > 20.5 && lng < 31.6;
        case "Israel": return lat > 29.5 && lat < 33.5 && lng > 34.2 && lng < 35.9;
        case "UAE": return lat > 22.5 && lat < 26 && lng > 51 && lng < 56;
        case "Oman": return lat > 16.5 && lat < 26.5 && lng > 52 && lng < 60;
        case "Tunisia": return lat > 30 && lat < 38 && lng > 7 && lng < 12;
        case "Malta": return lat>35.8 && lat<36 && lng>14.2 && lng<14.6;
        case "Luxembourg": return lat>49.4 && lat<50.2 && lng>5.7 && lng<6.5;
        case "Andorra": return lat>42.4 && lat<42.7 && lng>1.4 && lng<1.75;
        case "Philippines": return lat>4 && lat<21 && lng>116 && lng<127;
        case "Monaco": return lat>43.72 && lat<43.75 && lng>7.4 && lng<7.45;
        case "Liechtenstein": return lat>47.05 && lat<47.27 && lng>9.47 && lng<9.63;
        case "Canary Islands": return lat>27.5 && lat<29.5 && lng>-18 && lng<-13;
        case "Guam": return lat>13 && lat<14 && lng>144 && lng<145;
        case "Bermuda": return lat>32.2 && lat<32.4 && lng>-64.9 && lng<-64.5;
        case "Puerto Rico": return lat>17.9 && lat<18.5 && lng>-67.3 && lng<-65.9;
        case "Dominican Republic": return lat>17.5 && lat<20 && lng>-72.0 && lng<-68.0;
        case "Guatemala": return lat>13.7 && lat<17.0 && lng>-92.0 && lng<-88.0;
        case "Faroe Islands": return lat>61.3 && lat<62.4 && lng>-7.8 && lng<-6.2;
        case "Costa Rica": return lat>8.0 && lat<11.5 && lng>-86.0 && lng<-82.5;
        case "Panama": return lat>7.0 && lat<10.5 && lng>-83.0 && lng<-77.0;
        case "North Macedonia": return lat>40.8 && lat<42.3 && lng>20.4 && lng<22.9;
        case "Denmark": return lat>54.5 && lat<57.8 && lng>8.0 && lng<12.7;
        case "Sweden": return lat>55 && lat<69.5 && lng>11 && lng<24.5;
        case "Greenland": return lat > 58 && lat < 84 && lng > -74 && lng < -11;
        case "Bolivia": return lat > -23 && lat < -9 && lng > -70 && lng < -57;
        case "Peru": return lat > -18 && lat < -0.03 && lng > -81 && lng < -68;
        case "Colombia": return lat > -4 && lat < 13 && lng > -79 && lng < -66;
        case "Ireland": return lat > 51.3 && lat < 55.5 && lng > -10.5 && lng < -5.3;
        default: return false;
    }
}

// ✨ Observerlar
function observeRoundChanges(){ const target=document.getElementById('__next')||document.body; if(!target) return; const observer=new MutationObserver(()=>{ updateMapPosition(); }); observer.observe(target,{childList:true,subtree:true}); }
function observeGameChanges(){ const target = document.getElementById('__next') || document.body; if(!target) return; const observer = new MutationObserver(() => {}); observer.observe(target,{childList:true,subtree:true}); }
function makeDraggable(element){ const header=element.querySelector('#panel-header'); if(!header) return; let pos1=0,pos2=0,pos3=0,pos4=0; header.onmousedown=e=>{ e.preventDefault(); pos3=e.clientX; pos4=e.clientY; document.onmouseup=()=>{document.onmouseup=null;document.onmousemove=null;}; document.onmousemove=e=>{ e.preventDefault(); pos1=pos3-e.clientX; pos2=pos4-e.clientY; pos3=e.clientX; pos4=e.clientY; element.style.top=(element.offsetTop-pos2)+'px'; element.style.left=(element.offsetLeft-pos1)+'px'; }; }; }
function observePanelResize(panel){ const observer=new ResizeObserver(()=>{ if(map) google.maps.event.trigger(map,'resize'); }); observer.observe(panel); }

// ✨ Control ile aç/kapa
let panelVisible = false;
window.addEventListener('keydown', (e) => {
    if (e.key === 'Control') {
        e.preventDefault();
        const panel = document.getElementById(PANEL_ID);
        if (!panel) {
            createPanel();
            panelVisible = true;
        } else {
            panelVisible = !panelVisible;
            panel.style.display = panelVisible ? 'flex' : 'none';
        }
    }
});

})();