MediaWiki:Common.js

From Rise of Agon Wiki
Revision as of 09:11, 25 January 2026 by Admin (talk | contribs) (Clamp map to z6 only and downward-positive CRS)

Note: After publishing, you may have to bypass your browser's cache to see the changes.

  • Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
  • Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
  • Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5.
// Custom Agon World Map with Leaflet (tiled)
(function() {
    if (!document.getElementById('agon-map-container')) return;

    var link = document.createElement('link');
    link.rel = 'stylesheet';
    link.href = 'https://unpkg.com/leaflet@1.9.4/dist/leaflet.css';
    document.head.appendChild(link);

    var script = document.createElement('script');
    script.src = 'https://unpkg.com/leaflet@1.9.4/dist/leaflet.js';
    script.onload = function() { initAgonMap(); };
    document.head.appendChild(script);
})();

function initAgonMap() {
    var mapContainer = document.getElementById('agon-map-container');
    if (!mapContainer) return;

    var imageWidth = 16384;
    var imageHeight = 16384;
    var tileSize = 256;
    var zoomLevel = 6; // use only the most detailed level

    // CRS with downward-positive Y (pixel y grows down)
    var crs = L.extend({}, L.CRS.Simple, {
        transformation: new L.Transformation(1, 0, 1, 0)
    });

    // Bounds in lat/lng derived from pixel bounds at zoomLevel
    var southWest = crs.unproject(L.point(0, imageHeight), zoomLevel);
    var northEast = crs.unproject(L.point(imageWidth, 0), zoomLevel);
    var bounds = new L.LatLngBounds(southWest, northEast);

    var map = L.map('agon-map-container', {
        crs: crs,
        minZoom: zoomLevel,
        maxZoom: zoomLevel,
        center: bounds.getCenter(),
        zoom: zoomLevel,
        maxBounds: bounds,
        maxBoundsViscosity: 1.0
    });

    var tileUrl = mw.config.get('wgScriptPath') + '/resources/assets/tiles/AgonBigMap/{z}/{x}/{y}.jpg';
    L.tileLayer(tileUrl, {
        tileSize: tileSize,
        minZoom: zoomLevel,
        maxZoom: zoomLevel,
        maxNativeZoom: zoomLevel,
        bounds: bounds,
        noWrap: true,
        keepBuffer: 0
    }).addTo(map);

    map.fitBounds(bounds);

    L.control.scale().addTo(map);

    // Click shows pixel coords (Y, X) at full detail
    map.on('click', function(e) {
        var point = map.project(e.latlng, zoomLevel);
        var y = point.y.toFixed(2);
        var x = point.x.toFixed(2);
        var text = 'Coordinates: ' + y + ', ' + x;
        console.log(text);
        L.popup().setLatLng(e.latlng).setContent(text).openOn(map);
    });

    // Markers use stored pixel coords 'Y, X'
    if (window.agonMapMarkers) {
        window.agonMapMarkers.forEach(function(marker) {
            var coords = marker.coordinates.split(',').map(parseFloat); // [Y, X]
            var latlng = map.unproject([coords[1], coords[0]], zoomLevel); // [x, y]
            var icon = L.icon({
                iconUrl: marker.icon || mw.config.get('wgScriptPath') + '/resources/assets/marker-icon.png',
                iconSize: [25, 41],
                iconAnchor: [12, 41],
                popupAnchor: [1, -34]
            });
            L.marker(latlng, { icon: icon })
                .addTo(map)
                .bindPopup('<b>' + marker.name + '</b><br>' + marker.description);
        });
    }
}