MapViewer/slave.js

127 lines
3.0 KiB
JavaScript
Raw Normal View History

2025-08-30 22:02:13 +02:00
// slave.js synchronisiert Ansicht mit master.js (mit direkter URL-Übergabe an Leaflet)
const canvas = document.getElementById("mapCanvas");
const ctx = canvas.getContext("2d");
let image = null;
let fogImage = null;
let hexGrid = new Image();
hexGrid.src = "hexgrid.png";
let offsetX = 0, offsetY = 0;
let scale = 1;
let fogEnabled = false;
let hexgridEnabled = false;
let hexgridScale = 1;
let MapX = 0;
let MapY = 0;
let MapZoom = 2;
const channel = new BroadcastChannel("mapsync");
channel.onmessage = (event) => {
const msg = event.data;
if (msg.type === "mapData") {
const img = new Image();
img.onload = () => {
image = img;
draw();
};
img.src = msg.data;
} else if (msg.type === "hexgrid") {
hexgridEnabled = msg.enabled;
draw();
} else if (msg.type === "hexgridScale") {
hexgridScale = msg.scale;
draw();
} else if (msg.type === "viewData") {
offsetX = msg.offsetX;
offsetY = msg.offsetY;
scale = msg.scale;
draw();
} else if (msg.type === "fogData") {
const fog = new Image();
fog.onload = () => {
fogImage = fog;
draw();
};
fog.src = msg.data;
} else if (msg.type === "fogEnabled") {
fogEnabled = msg.enabled;
draw();
} else if (msg.type === "mapMode") {
const iframe = document.getElementById("worldmap-iframe");
const canvas = document.getElementById("mapCanvas");
if (msg.enabled) {
iframe.style.display = "block";
canvas.style.display = "none";
} else {
iframe.style.display = "none";
canvas.style.display = "block";
}
} else if (msg.type === "MapCoord") {
MapX = msg.MapX;
MapY = msg.MapY;
MapZoom = msg.MapZoom;
const iframe = document.getElementById("worldmap-iframe");
if (iframe && iframe.contentWindow) {
iframe.contentWindow.postMessage({
type: "setView",
center: [MapY, MapX],
zoom: MapZoom
}, "*");
}
}
};
function resizeCanvas() {
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;
draw();
}
window.addEventListener("resize", resizeCanvas);
resizeCanvas();
function draw() {
if (!image) return;
ctx.setTransform(scale, 0, 0, scale, offsetX, offsetY);
ctx.clearRect(-offsetX / scale, -offsetY / scale, canvas.width / scale, canvas.height / scale);
ctx.drawImage(image, 0, 0);
if (hexgridEnabled && hexGrid.complete) {
ctx.save();
ctx.setTransform(1, 0, 0, 1, 0, 0);
ctx.globalAlpha = 0.5;
const scaleMod = 0.2;
const gridWidth = hexGrid.width * (hexgridScale * scaleMod);
const gridHeight = hexGrid.height * (hexgridScale * scaleMod);
const dx = (canvas.width - gridWidth) / 2;
const dy = (canvas.height - gridHeight) / 2;
ctx.drawImage(hexGrid, dx, dy, gridWidth, gridHeight);
ctx.restore();
ctx.setTransform(scale, 0, 0, scale, offsetX, offsetY);
}
if (fogEnabled && fogImage) {
ctx.globalAlpha = 1.0;
ctx.drawImage(fogImage, 0, 0);
ctx.globalAlpha = 1.0;
}
}