127 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			127 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
|  | // 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; | |||
|  |   } | |||
|  | } | |||
|  | 
 |