mudlet-map-renderer 0.30.0-konva → 0.32.0-konva
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/Viewport.d.ts +8 -1
- package/dist/index.cjs +3 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.mjs +219 -212
- package/dist/index.mjs.map +1 -1
- package/dist/rendering/MapRenderer.d.ts +6 -1
- package/package.json +1 -1
package/dist/Viewport.d.ts
CHANGED
|
@@ -54,8 +54,15 @@ export declare class Viewport {
|
|
|
54
54
|
panToMapPointAnimated(x: number, y: number, instant: boolean): void;
|
|
55
55
|
/**
|
|
56
56
|
* Fit the viewport to show the given map bounds with padding.
|
|
57
|
+
* Optional `insets` (screen pixels) reserve space at each edge — content
|
|
58
|
+
* is fit and centered within the rect remaining after the insets.
|
|
57
59
|
*/
|
|
58
|
-
fitToMapBounds(minX: number, maxX: number, minY: number, maxY: number
|
|
60
|
+
fitToMapBounds(minX: number, maxX: number, minY: number, maxY: number, insets?: {
|
|
61
|
+
top?: number;
|
|
62
|
+
right?: number;
|
|
63
|
+
bottom?: number;
|
|
64
|
+
left?: number;
|
|
65
|
+
}): void;
|
|
59
66
|
setSize(width: number, height: number): void;
|
|
60
67
|
startDrag(screenX: number, screenY: number): void;
|
|
61
68
|
updateDrag(screenX: number, screenY: number): void;
|
package/dist/index.cjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),s=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},c=(n,r,a)=>(a=n==null?{}:e(i(n)),s(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n));let l=require(`konva`);l=c(l,1);var u=.6,d=.025,f=`rgb(225, 255, 225)`;function p(){return{roomSize:u,lineWidth:d,lineColor:f,backgroundColor:`#000000`,instantMapMove:!1,highlightCurrentRoom:!0,cullingEnabled:!0,cullingMode:`indexed`,cullingBounds:null,labelRenderMode:`image`,transparentLabels:!1,roomShape:`rectangle`,playerMarker:{strokeColor:`#00e5b2`,strokeAlpha:1,fillColor:`#00e5b2`,fillAlpha:0,strokeWidth:.1,sizeFactor:1.7,dash:[.05,.05],dashEnabled:!0,matchRoomShape:!1},gridEnabled:!1,gridSize:1,gridColor:`rgba(200, 200, 200, 0.15)`,gridLineWidth:.03,perfCallback:null,borders:!0,frameMode:!1,coloredMode:!1,emboss:!1,areaName:!0,fontFamily:`sans-serif`,uniformLevelSize:!1,ambientLight:{enabled:!1,color:`#ffcc44`,radius:12,intensity:.7}}}function m(e){let t,n,r,i=e.match(/(\d+)\s*,\s*(\d+)\s*,\s*(\d+)/);if(i)t=parseInt(i[1])/255,n=parseInt(i[2])/255,r=parseInt(i[3])/255;else if(e.startsWith(`#`)&&e.length>=7)t=parseInt(e.slice(1,3),16)/255,n=parseInt(e.slice(3,5),16)/255,r=parseInt(e.slice(5,7),16)/255;else return .5;return(Math.max(t,n,r)+Math.min(t,n,r))/2}function h(e,t){let n,r,i,a=e.match(/(\d+)\s*,\s*(\d+)\s*,\s*(\d+)/);if(a)n=parseInt(a[1]),r=parseInt(a[2]),i=parseInt(a[3]);else if(e.startsWith(`#`)&&e.length>=7)n=parseInt(e.slice(1,3),16),r=parseInt(e.slice(3,5),16),i=parseInt(e.slice(5,7),16);else return e;return n=Math.round(n*(1-t)),r=Math.round(r*(1-t)),i=Math.round(i*(1-t)),`rgb(${n}, ${r}, ${i})`}function g(e,t){let n,r,i,a=e.match(/(\d+)\s*,\s*(\d+)\s*,\s*(\d+)/);if(a)n=parseInt(a[1]),r=parseInt(a[2]),i=parseInt(a[3]);else if(e.startsWith(`#`)&&e.length>=7)n=parseInt(e.slice(1,3),16),r=parseInt(e.slice(3,5),16),i=parseInt(e.slice(5,7),16);else return e;return n=Math.min(255,Math.round(n+(255-n)*t)),r=Math.min(255,Math.round(r+(255-r)*t)),i=Math.min(255,Math.round(i+(255-i)*t)),`rgb(${n}, ${r}, ${i})`}function _(e,t){return`rgba(${parseInt(e.slice(1,3),16)}, ${parseInt(e.slice(3,5),16)}, ${parseInt(e.slice(5,7),16)}, ${t})`}var v=class{constructor(e){this.listeners=new Map,this.container=e}on(e,t){let n=this.listeners.get(e);n||(n=new Set,this.listeners.set(e,n)),n.add(t)}off(e,t){this.listeners.get(e)?.delete(t)}removeAllListeners(){this.listeners.clear()}emit(e,t){this.listeners.get(e)?.forEach(e=>e(t)),this.container&&this.container.dispatchEvent(new CustomEvent(e,{detail:t}))}},y=class{constructor(e,t){this.events=new v,this.highlights=new Map,this.paths=[],this.mapReader=e,this.settings=t}setArea(e,t){let n=this.mapReader.getArea(e);return!n||!n.getPlane(t)?!1:(this.currentArea=e,this.currentAreaInstance=n,this.currentZIndex=t,this.currentAreaVersion=n.getVersion(),this.events.emit(`area`,{area:n,zIndex:t}),!0)}setPosition(e,t=!0){let n=this.mapReader.getRoom(e);if(!n)return!1;let r=this.mapReader.getArea(n.area),i=r?.getVersion(),a=this.currentArea!==n.area||this.currentZIndex!==n.z||i!==void 0&&this.currentAreaVersion!==i||r!==void 0&&this.currentAreaInstance!==r;return a&&this.setArea(n.area,n.z),this.positionRoomId=e,this.events.emit(`position`,{roomId:e,center:t,areaChanged:a}),!0}updatePositionMarker(e){this.positionRoomId=e,this.events.emit(`position`,{roomId:e,center:!1,areaChanged:!1})}refreshPosition(){this.positionRoomId!==void 0&&this.events.emit(`position`,{roomId:this.positionRoomId,center:!1,areaChanged:!1})}clearPosition(){this.positionRoomId=void 0,this.events.emit(`position`,{roomId:void 0,center:!1,areaChanged:!1})}setCenterRoom(e,t){let n=this.mapReader.getRoom(e);if(!n)return!1;let r=this.currentArea!==n.area||this.currentZIndex!==n.z;return(r||this.needsAreaRedraw(n))&&this.setArea(n.area,n.z),this.centerRoomId=e,this.events.emit(`center`,{roomId:e,instant:t??r}),!0}needsAreaRedraw(e){let t=this.mapReader.getArea(e.area),n=t?.getVersion();return n!==void 0&&this.currentAreaVersion!==n||t!==void 0&&this.currentAreaInstance!==t}addHighlight(e,t){let n=this.mapReader.getRoom(e);return n?(this.highlights.set(e,{color:t,area:n.area,z:n.z}),this.events.emit(`highlight`,{roomId:e,color:t}),!0):!1}removeHighlight(e){this.highlights.has(e)&&(this.highlights.delete(e),this.events.emit(`highlight`,{roomId:e,color:void 0}))}hasHighlight(e){return this.highlights.has(e)}clearHighlights(){this.highlights.clear(),this.events.emit(`clear`,void 0)}addPath(e,t=`#66E64D`){this.paths.push({locations:e,color:t}),this.events.emit(`path`,void 0)}clearPaths(){this.paths=[],this.events.emit(`path`,void 0)}getOverlaysForArea(e){let t={...e};if(this.positionRoomId!==void 0){let e=this.mapReader.getRoom(this.positionRoomId);e&&e.area===this.currentArea&&e.z===this.currentZIndex&&(t.position={roomId:this.positionRoomId})}let n=[...e?.highlights??[]];for(let[e,t]of this.highlights)t.area===this.currentArea&&t.z===this.currentZIndex&&n.push({roomId:e,color:t.color});n.length>0&&(t.highlights=n);let r=[...e?.paths??[]];return r.push(...this.paths),r.length>0&&(t.paths=r),t}getEffectiveBounds(e,t){return this.settings.uniformLevelSize?e.getFullBounds():t.getBounds()}computeExportBounds(e,t,n,r){if(n!==void 0){let e=this.mapReader.getRoom(n);if(!e)throw Error(`Room ${n} not found`);return{x:e.x-r,y:e.y-r,w:r*2,h:r*2}}let i=this.getEffectiveBounds(e,t),a=this.settings.areaName?e.getAreaName():void 0,o=a?7:0,s=a?3.5:0,c=i.minX-s,l=i.minY-o,u=a?i.minX-3.5+a.length*2.5*.6:-1/0,d=Math.max(i.maxX,u);return{x:c-r,y:l-r,w:d-c+r*2,h:i.maxY-l+r*2}}},b=(e,t)=>({x:e,y:t}),x=72,S=200,C=120,w=new Map,T=null;function ee(){return T||(T=l.default.Util.createCanvasElement(),T.width=S,T.height=S),T}function te(e,t){let n=`${e}::${t}`,r=w.get(n);if(r!==void 0)return r;let i=ee().getContext(`2d`,{willReadFrequently:!0}),a=`bold ${x}px ${t}`;i.clearRect(0,0,S,S),i.font=a,i.textBaseline=`alphabetic`,i.textAlign=`center`,i.fillStyle=`#ffffff`,i.fillText(e,S/2,C);let{data:o}=i.getImageData(0,0,S,S),s=S,c=-1;for(let e=0;e<S;e++)for(let t=0;t<S;t++)o[(e*S+t)*4+3]>16&&(e<s&&(s=e),e>c&&(c=e));if(c===-1){let e={baselineRatio:.35,konvaCorrectionRatio:0};return w.set(n,e),e}let l=(C-s-Math.max(0,c-C))/2/x,u=i.measureText(`M`),d={baselineRatio:l,konvaCorrectionRatio:((u.fontBoundingBoxAscent??u.actualBoundingBoxAscent??0)-(u.fontBoundingBoxDescent??u.actualBoundingBoxDescent??0))/2/x-l};return w.set(n,d),d}function ne(e,t,n,r){let i=t.getColorValue(e.env),a=n.coloredMode?h(i,.5):n.frameMode?n.backgroundColor:i,o=n.coloredMode?g(i,.1):i;return{fillColor:a,strokeColor:r?n.frameMode||n.coloredMode?o:r:n.frameMode||n.coloredMode?o:n.lineColor,borderWidth:n.borders?n.lineWidth:0,symbolColor:n.frameMode||n.coloredMode?o:t.getSymbolColor(e.env),envColor:i}}function re(e,t){if(!t.emboss)return null;let n=t.roomSize,r=t.borders?t.lineWidth/2:0,i=t.lineWidth,a=g(e,.35),o=h(e,.45);if(t.roomShape===`circle`){let e=n/2,t=n/2,s=n/2-r,c=[];for(let n=0;n<=48;n++){let r=n/48*360*Math.PI/180;c.push(e+Math.cos(r)*s,t+Math.sin(r)*s)}let l=[];for(let n=0;n<=19;n++){let r=(200+n/19*140)*Math.PI/180;l.push(e+Math.cos(r)*s,t+Math.sin(r)*s)}return{shadow:{points:c,stroke:o,strokeWidth:i,lineCap:`round`,lineJoin:`round`},highlight:{points:l,stroke:a,strokeWidth:i,lineCap:`round`,lineJoin:`round`}}}if(t.roomShape===`roundedRectangle`){let e=(n-r*2)*.2,t=r,s=r,c=n-r,l=n-r,u=[];for(let n=0;n<=10/2;n++){let r=(135+n/(10/2)*45)*Math.PI/180;u.push(t+e+Math.cos(r)*e,l-e+Math.sin(r)*e)}for(let n=1;n<=10;n++){let r=(180+n/10*90)*Math.PI/180;u.push(t+e+Math.cos(r)*e,s+e+Math.sin(r)*e)}for(let t=1;t<=10/2;t++){let n=(270+t/(10/2)*45)*Math.PI/180;u.push(c-e+Math.cos(n)*e,s+e+Math.sin(n)*e)}let d=u.slice(),f=[];for(let t=0;t<=10/2;t++){let n=(315+t/(10/2)*45)*Math.PI/180;f.push(c-e+Math.cos(n)*e,s+e+Math.sin(n)*e)}for(let t=1;t<=10;t++){let n=t/10*90*Math.PI/180;f.push(c-e+Math.cos(n)*e,l-e+Math.sin(n)*e)}for(let n=1;n<=10/2;n++){let r=(90+n/(10/2)*45)*Math.PI/180;f.push(t+e+Math.cos(r)*e,l-e+Math.sin(r)*e)}return{highlight:{points:d,stroke:a,strokeWidth:i,lineCap:`round`,lineJoin:`round`},shadow:{points:f,stroke:o,strokeWidth:i,lineCap:`round`,lineJoin:`round`}}}return{highlight:{points:[r,n-r,r,r,n-r,r],stroke:a,strokeWidth:i},shadow:{points:[r,n-r,n-r,n-r,n-r,r],stroke:o,strokeWidth:i}}}var ie=class{constructor(e,t,n){this.mapReader=e,this.settings=t,this.backend=n}createRoomGroup(e,t){let{fillColor:n,strokeColor:r,borderWidth:i,symbolColor:a}=ne(e,this.mapReader,this.settings,t?.strokeOverride),o=this.settings.roomSize,s=this.backend.createGroup(e.x-o/2,e.y-o/2),c=i/2,l=re(n,this.settings),u=l?0:i,d=this.backend.getTransform()===b,f=this.settings.coloredMode&&u>0&&d,p=e=>this.settings.roomShape===`roundedRectangle`?Math.max(0,(o-2*e)*.2):0;if(f){let e=[h(r,.5),r],t=i*2;this.settings.roomShape===`circle`?this.backend.addCircle(s,{cx:o/2,cy:o/2,radius:o/2-t,fill:n}):this.backend.addRect(s,{x:t,y:t,width:o-t*2,height:o-t*2,fill:n,cornerRadius:p(t)});for(let t=0;t<e.length;t++){let n=i/2+t*i;this.settings.roomShape===`circle`?this.backend.addCircle(s,{cx:o/2,cy:o/2,radius:o/2-n,stroke:e[t],strokeWidth:i}):this.backend.addRect(s,{x:n,y:n,width:o-n*2,height:o-n*2,stroke:e[t],strokeWidth:i,cornerRadius:p(n)})}}else this.settings.roomShape===`circle`?this.backend.addCircle(s,{cx:o/2,cy:o/2,radius:o/2-c,fill:n,stroke:u?r:void 0,strokeWidth:u}):this.backend.addRect(s,{x:c,y:c,width:o-i,height:o-i,fill:n,stroke:u?r:void 0,strokeWidth:u,cornerRadius:this.settings.roomShape===`roundedRectangle`?(o-i)*.2:0});if(l&&(this.backend.addLine(s,{points:l.shadow.points,stroke:l.shadow.stroke,strokeWidth:l.shadow.strokeWidth,lineCap:l.shadow.lineCap,lineJoin:l.shadow.lineJoin}),this.backend.addLine(s,{points:l.highlight.points,stroke:l.highlight.stroke,strokeWidth:l.highlight.strokeWidth,lineCap:l.highlight.lineCap,lineJoin:l.shadow.lineJoin})),e.roomChar){let t=o*.75,{baselineRatio:n,konvaCorrectionRatio:r}=te(e.roomChar,this.settings.fontFamily),i=Math.max(o,e.roomChar.length*t*.8),c=(i-o)/2;this.backend.addText(s,{x:-c,y:0,text:e.roomChar,fontSize:t,fontFamily:this.settings.fontFamily,fontStyle:`bold`,fill:a,align:`center`,verticalAlign:`middle`,width:i,height:o,baselineRatio:n,konvaCorrectionRatio:r})}return s}},ae=class{constructor(e,t,n){this.cachedBounds=null,this.inverseTransform=(e,t)=>({x:e,y:t}),this.layer=e,this.settings=t,this.backend=n}setInverseTransform(e){this.inverseTransform=e,this.invalidateCache()}invalidateCache(){this.cachedBounds=null}render(e){if(!this.settings.gridEnabled){this.cachedBounds!==null&&(this.layer.destroyChildren(),this.layer.batchDraw(),this.cachedBounds=null);return}let t=this.inverseTransform,{minX:n,maxX:r,minY:i,maxY:a}=e,o=t(n,i),s=t(r,i),c=t(r,a),l=t(n,a),u=Math.min(o.x,s.x,c.x,l.x),d=Math.max(o.x,s.x,c.x,l.x),f=Math.min(o.y,s.y,c.y,l.y),p=Math.max(o.y,s.y,c.y,l.y),m=this.settings.gridSize*2,h=Math.floor((u-m)/this.settings.gridSize)*this.settings.gridSize,g=Math.ceil((d+m)/this.settings.gridSize)*this.settings.gridSize,_=Math.floor((f-m)/this.settings.gridSize)*this.settings.gridSize,v=Math.ceil((p+m)/this.settings.gridSize)*this.settings.gridSize,y=this.cachedBounds;if(y&&y.left===h&&y.right===g&&y.top===_&&y.bottom===v)return;this.layer.destroyChildren();let b=this.backend.createGroup(0,0);for(let e=h;e<=g;e+=this.settings.gridSize)this.backend.addLine(b,{points:[e,_,e,v],stroke:this.settings.gridColor,strokeWidth:this.settings.gridLineWidth});for(let e=_;e<=v;e+=this.settings.gridSize)this.backend.addLine(b,{points:[h,e,g,e],stroke:this.settings.gridColor,strokeWidth:this.settings.gridLineWidth});this.layer.addNode(b),this.cachedBounds={left:h,right:g,top:_,bottom:v},this.layer.batchDraw()}},E=[`north`,`south`,`east`,`west`,`northeast`,`northwest`,`southeast`,`southwest`],oe={n:`north`,s:`south`,e:`east`,w:`west`,ne:`northeast`,nw:`northwest`,se:`southeast`,sw:`southwest`},D={north:`n`,south:`s`,east:`e`,west:`w`,northeast:`ne`,northwest:`nw`,southeast:`se`,southwest:`sw`,up:`u`,down:`d`,in:`i`,out:`o`},O={north:{x:0,y:-1},south:{x:0,y:1},east:{x:1,y:0},west:{x:-1,y:0},northeast:{x:1,y:-1},northwest:{x:-1,y:-1},southeast:{x:1,y:1},southwest:{x:-1,y:1}},se=[`north`,`south`,`east`,`west`,`northeast`,`northwest`,`southeast`,`southwest`],ce={north:`south`,south:`north`,east:`west`,west:`east`,northeast:`southwest`,northwest:`southeast`,southeast:`northwest`,southwest:`northeast`};function le(e){return e?Object.prototype.hasOwnProperty.call(O,e):!1}function k(e,t,n,r=1){if(!le(n))return{x:e,y:t};let i=O[n];return{x:e+i.x*r,y:t+i.y*r}}function ue(e,t,n,r=1,i=0){if(!le(n))return{x:e,y:t};let a=O[n];if(!(a.x!==0&&a.y!==0)||i<=0)return k(e,t,n,r);let o=r-i+i/Math.SQRT2;return{x:e+a.x*o,y:t+a.y*o}}function de(e,t,n,r=1){if(!le(n))return{x:e,y:t};let i=O[n],a=Math.atan2(i.y,i.x);return{x:e+Math.cos(a)*r,y:t+Math.sin(a)*r}}var A={OPEN_DOOR:`rgb(10, 155, 10)`,CLOSED_DOOR:`rgb(226, 205, 59)`,LOCKED_DOOR:`rgb(155, 10, 10)`,ONE_WAY_FILL:`rgb(155, 10, 10)`};function fe(e){switch(e){case 1:return A.OPEN_DOOR;case 2:return A.CLOSED_DOOR;default:return A.LOCKED_DOOR}}var pe=class{constructor(e,t){this.mapReader=e,this.settings=t}getRoomEdgePoint(e,t,n,r){let i=r-(this.settings.borders?this.settings.lineWidth/2:0);return this.settings.roomShape===`circle`?de(e,t,n,i):this.settings.roomShape===`roundedRectangle`?ue(e,t,n,i,this.settings.roomSize*.2):k(e,t,n,i)}renderData(e,t){return this.renderDataWithColor(e,this.settings.lineColor,t)}renderDataWithColor(e,t,n){let r=e.aDir&&E.includes(e.aDir),i=e.bDir&&E.includes(e.bDir);if(r&&i)return this.renderTwoWayExitData(e,t,n);if(r||i){let n=r?`a`:`b`;return this.renderOneWayExitData(e,t,n)}}renderTwoWayExitData(e,t,n){let r=this.mapReader.getRoom(e.a),i=this.mapReader.getRoom(e.b);if(!r||!i||!e.aDir||!e.bDir||r.customLines[D[e.aDir]]&&i.customLines[D[e.bDir]]||r.z!==i.z&&(n!==i.z&&r.customLines[D[e.aDir]]||n!==r.z&&i.customLines[D[e.bDir]]))return;let a=this.getRoomEdgePoint(r.x,r.y,e.aDir,this.settings.roomSize/2),o=this.getRoomEdgePoint(i.x,i.y,e.bDir,this.settings.roomSize/2),s=[a.x,a.y,o.x,o.y],c=[{points:s,stroke:t,strokeWidth:this.settings.lineWidth}],l=[],u=r.doors[D[e.aDir]]??i.doors[D[e.bDir]];if(u){let e=s[0]+(s[2]-s[0])/2,t=s[1]+(s[3]-s[1])/2;l.push({x:e-this.settings.roomSize/4,y:t-this.settings.roomSize/4,width:this.settings.roomSize/2,height:this.settings.roomSize/2,stroke:fe(u),strokeWidth:this.settings.lineWidth})}let d=Math.min(s[0],s[2]),f=Math.max(s[0],s[2]),p=Math.min(s[1],s[3]),m=Math.max(s[1],s[3]),h=r.z===i.z?void 0:r.z===n?i.id:r.id;return{lines:c,arrows:[],doors:l,bounds:{x:d,y:p,width:f-d,height:m-p},targetRoomId:h}}renderOneWayExitData(e,t,n){let r=n===`a`||!n&&e.aDir,i=r?this.mapReader.getRoom(e.a):this.mapReader.getRoom(e.b),a=r?this.mapReader.getRoom(e.b):this.mapReader.getRoom(e.a),o=r?e.aDir:e.bDir;if(!o||!i||!a||!E.includes(o)||i.customLines[D[o]||o])return;if(i.area!=a.area&&o){let e=this.mapReader.getColorValue(a.env),t=this.getRoomEdgePoint(i.x,i.y,o,this.settings.roomSize/2),n=k(i.x,i.y,o,this.settings.roomSize*1.5),r=e;return{lines:[],arrows:[{points:[t.x,t.y,n.x,n.y],pointerLength:.3,pointerWidth:.3,strokeWidth:this.settings.lineWidth*1.4,stroke:r,fill:r}],doors:[],bounds:{x:Math.min(t.x,n.x),y:Math.min(t.y,n.y),width:Math.abs(n.x-t.x),height:Math.abs(n.y-t.y)},targetRoomId:a.id}}let s=a.area!==i.area||a.z!==i.z,c={x:a.x,y:a.y};s&&(c=k(i.x,i.y,o,this.settings.roomSize/2));let l=k(i.x,i.y,o,.3),u=l.x-(l.x-c.x)/2,d=l.y-(l.y-c.y)/2,f=this.getRoomEdgePoint(i.x,i.y,o,this.settings.roomSize/2),p=[f.x,f.y,c.x,c.y],m=[f.x,c.x,u],h=[f.y,c.y,d],g=Math.min(...m),_=Math.max(...m),v=Math.min(...h),y=Math.max(...h);return{lines:[{points:p,stroke:t,strokeWidth:this.settings.lineWidth,dash:[.1,.05]}],arrows:[{points:[p[0],p[1],u,d],pointerLength:.5,pointerWidth:.35,strokeWidth:this.settings.lineWidth*1.4,stroke:t,fill:A.ONE_WAY_FILL,dash:[.1,.05]}],doors:[],bounds:{x:g,y:v,width:_-g,height:y-v},...s?{targetRoomId:a.id}:{}}}getSpecialExitAreaTargets(e){let t=[];for(let[n,r]of Object.entries(e.customLines)){let i=e.specialExits[n];if(i===void 0){let t=oe[n];t&&(i=e.exits[t]??e.specialExits[t])}if(i===void 0)continue;let a=this.mapReader.getRoom(i);if(!a||a.area===e.area&&a.z===e.z)continue;let o=[e.x,e.y];r.points.reduce((e,t)=>(e.push(t.x,-t.y),e),o);let s=1/0,c=1/0,l=-1/0,u=-1/0;for(let e=0;e<o.length;e+=2)s=Math.min(s,o[e]),l=Math.max(l,o[e]),c=Math.min(c,o[e+1]),u=Math.max(u,o[e+1]);t.push({bounds:{x:s,y:c,width:l-s,height:u-c},targetRoomId:i})}return t}},me={1:`north`,2:`northeast`,3:`northwest`,4:`east`,5:`west`,6:`south`,7:`southeast`,8:`southwest`,9:`up`,10:`down`,11:`in`,12:`out`};function he(e,t,n,r,i){return e.roomShape===`circle`?de(t,n,r,i):e.roomShape===`roundedRectangle`?ue(t,n,r,i,e.roomSize*.2):k(t,n,r,i)}function ge(e,t,n){let r=[];for(let i of e.stubs){let a=me[i];if(!a)continue;let o=he(t,e.x,e.y,a,t.roomSize/2),s=k(e.x,e.y,a,t.roomSize/2+.5);r.push({x1:o.x,y1:o.y,x2:s.x,y2:s.y,stroke:n??t.lineColor,strokeWidth:t.lineWidth})}return r}var _e={1:`rgb(10, 155, 10)`,2:`rgb(226, 205, 59)`,3:`rgb(155, 10, 10)`};function ve(e,t,n){let r=[];for(let[i,a]of Object.entries(e.customLines)){let o=[e.x,e.y];for(let e of a.points)o.push(e.x,-e.y);let s=n??`rgb(${a.attributes.color.r}, ${a.attributes.color.g}, ${a.attributes.color.b})`,c;a.attributes.style===`dot line`?c=[.05,.05]:a.attributes.style===`dash line`&&(c=[.4,.2]);let l={points:o,stroke:s,strokeWidth:t.lineWidth,dash:c},u;if(a.attributes.arrow&&o.length>=4){let e=o.length-2,n=o[e],r=o[e+1],i=o[e-2],a=o[e-1],c=Math.atan2(r-a,n-i),l=.3,d=.1;u={tipX:n,tipY:r,x1:n-l*Math.cos(c-Math.atan2(d,l)),y1:r-l*Math.sin(c-Math.atan2(d,l)),x2:n-l*Math.cos(c+Math.atan2(d,l)),y2:r-l*Math.sin(c+Math.atan2(d,l)),fill:s,stroke:s,strokeWidth:t.lineWidth}}let d,f=e.doors[i];if(f&&o.length>=4){let e=o[0]+(o[2]-o[0])/2,n=o[1]+(o[3]-o[1])/2,r=t.roomSize/2;d={x:e-r/2,y:n-r/2,width:r,height:r,stroke:_e[f]??_e[3],strokeWidth:t.lineWidth}}r.push({line:l,arrow:u,door:d})}return r}var ye=[`up`,`down`,`in`,`out`];function j(e,t,n,r){let i=r*Math.PI/180,a=[];for(let r=0;r<3;r++){let o=2*Math.PI*r/3-Math.PI/2,s=Math.cos(o)*n*1.4,c=Math.sin(o)*n*.8,l=s*Math.cos(i)-c*Math.sin(i),u=s*Math.sin(i)+c*Math.cos(i);a.push(e+l,t+u)}return a}function be(e,t,n){return{symbolColor:n.frameMode||n.coloredMode?t.getColorValue(e.env):t.getSymbolColor(e.env),symbolFill:n.frameMode||n.coloredMode?t.getColorValue(e.env):t.getSymbolColor(e.env,.6)}}var xe={1:`rgb(10, 155, 10)`,2:`rgb(226, 205, 59)`,3:`rgb(155, 10, 10)`};function Se(e,t,n){let r=[],i=n.roomSize,a=i/5,{symbolColor:o,symbolFill:s}=be(e,t,n);for(let t of ye){if(!e.exits[t])continue;let c=e.doors[t],l=c===void 0?o:xe[c]??xe[3];switch(t){case`up`:{let t=k(e.x,e.y,`south`,i/4);r.push({cx:t.x,cy:t.y,vertices:j(t.x,t.y,a,0),fill:s,stroke:l,strokeWidth:n.lineWidth});break}case`down`:{let t=k(e.x,e.y,`north`,i/4);r.push({cx:t.x,cy:t.y,vertices:j(t.x,t.y,a,180),fill:s,stroke:l,strokeWidth:n.lineWidth});break}case`in`:{let t=k(e.x,e.y,`west`,i/4),o=k(e.x,e.y,`east`,i/4);r.push({cx:t.x,cy:t.y,vertices:j(t.x,t.y,a,90),fill:s,stroke:l,strokeWidth:n.lineWidth}),r.push({cx:o.x,cy:o.y,vertices:j(o.x,o.y,a,-90),fill:s,stroke:l,strokeWidth:n.lineWidth});break}case`out`:{let t=k(e.x,e.y,`west`,i/4),o=k(e.x,e.y,`east`,i/4);r.push({cx:t.x,cy:t.y,vertices:j(t.x,t.y,a,-90),fill:s,stroke:l,strokeWidth:n.lineWidth}),r.push({cx:o.x,cy:o.y,vertices:j(o.x,o.y,a,90),fill:s,stroke:l,strokeWidth:n.lineWidth});break}}}return{triangles:r}}function Ce(e){let t=(e?.alpha??255)/255,n=e=>Math.min(255,Math.max(0,e??0));return`rgba(${n(e?.r)}, ${n(e?.g)}, ${n(e?.b)}, ${t})`}var M=class{constructor(e,t,n,r){this.mapReader=e,this.settings=t,this.backend=n,this.gridLayer=r.gridLayer,this.linkLayer=r.linkLayer,this.roomLayer=r.roomLayer,this.roomShapeRenderer=new ie(e,t,n),this.gridRenderer=new ae(r.gridLayer,t,n),this.exitRenderer=new pe(e,t)}buildScene(e,t,n,r){this.gridLayer.destroyChildren(),this.gridRenderer.invalidateCache(),this.linkLayer.destroyChildren(),this.roomLayer.destroyChildren(),r&&this.gridRenderer.render(r),this.renderLabels(t.getLabels());let i=this.renderLinkExits(e.getLinkExits(n),n),a=this.renderRooms(t.getRooms()??[]);return this.renderAreaName(e,t),{roomNodes:a.roomNodes,standaloneExitNodes:i.standaloneExitNodes,areaExitHitZones:[...i.areaExitHitZones,...a.areaExitHitZones]}}getEffectiveBounds(e,t){return this.settings.uniformLevelSize?e.getFullBounds():t.getBounds()}renderRooms(e){let t=new Map,n=[],r=this.settings.roomSize,i=this.backend.getExitDepthOffset();return e.forEach(e=>{let a=this.roomShapeRenderer.createRoomGroup(e);for(let t of ve(e,this.settings)){let e=this.backend.createGroup(i.x,i.y);if(this.backend.addLine(e,{points:t.line.points,stroke:t.line.stroke,strokeWidth:t.line.strokeWidth,dash:t.line.dash}),t.arrow){let n=t.arrow;this.backend.addPolygon(e,{vertices:[n.tipX,n.tipY,n.x1,n.y1,n.x2,n.y2],fill:n.fill,stroke:n.stroke,strokeWidth:n.strokeWidth})}if(t.door){let n=t.door;this.backend.addRect(e,{x:n.x,y:n.y,width:n.width,height:n.height,stroke:n.stroke,strokeWidth:n.strokeWidth})}this.linkLayer.addNode(e)}this.exitRenderer.getSpecialExitAreaTargets(e).forEach(e=>{n.push(e)});let o=e.x-r/2,s=e.y-r/2;for(let t of ge(e,this.settings))this.backend.addLine(a,{points:[t.x1-o,t.y1-s,t.x2-o,t.y2-s],stroke:t.stroke,strokeWidth:t.strokeWidth});let{triangles:c}=Se(e,this.mapReader,this.settings);for(let e of c){let t=[];for(let n=0;n<e.vertices.length;n+=2)t.push(e.vertices[n]-o,e.vertices[n+1]-s);this.backend.addPolygon(a,{vertices:t,fill:e.fill,stroke:e.stroke,strokeWidth:e.strokeWidth})}this.roomLayer.addNode(a),t.set(e.id,{room:e,group:a})}),{roomNodes:t,areaExitHitZones:n}}renderLinkExits(e,t){let n=[],r=[];return e.forEach(e=>{let i=this.exitRenderer.renderData(e,t);if(!i)return;let a=this.renderExitData(i);this.linkLayer.addNode(a),n.push({group:a,bounds:i.bounds,targetRoomId:i.targetRoomId}),i.targetRoomId!==void 0&&r.push({bounds:i.bounds,targetRoomId:i.targetRoomId})}),{standaloneExitNodes:n,areaExitHitZones:r}}renderExitData(e){let t=this.backend.getExitDepthOffset(),n=this.backend.createGroup(t.x,t.y);for(let t of e.lines)this.backend.addLine(n,{points:t.points,stroke:t.stroke,strokeWidth:t.strokeWidth,dash:t.dash});for(let t of e.arrows)this.renderArrow(n,t);for(let t of e.doors)this.backend.addRect(n,{x:t.x,y:t.y,width:t.width,height:t.height,stroke:t.stroke,strokeWidth:t.strokeWidth});return n}renderArrow(e,t){this.backend.addLine(e,{points:t.points,stroke:t.stroke,strokeWidth:t.strokeWidth,dash:t.dash});let n=t.points.length-2,r=t.points[n],i=t.points[n+1],a=t.points[n-2],o=t.points[n-1],s=Math.atan2(i-o,r-a),c=t.pointerLength,l=t.pointerWidth/2,u=r-c*Math.cos(s-Math.atan2(l,c)),d=i-c*Math.sin(s-Math.atan2(l,c)),f=r-c*Math.cos(s+Math.atan2(l,c)),p=i-c*Math.sin(s+Math.atan2(l,c));this.backend.addPolygon(e,{vertices:[r,i,u,d,f,p],fill:t.fill,stroke:t.stroke,strokeWidth:t.strokeWidth})}renderLabels(e){this.settings.labelRenderMode!==`none`&&e.forEach(e=>{let t=e.X,n=-e.Y;if(this.settings.labelRenderMode===`image`&&e.pixMap){let r=this.backend.createGroup(0,0);this.backend.addImage(r,{x:t,y:n,width:e.Width,height:e.Height,src:`data:image/png;base64,${e.pixMap}`}),this.linkLayer.addNode(r);return}let r=this.backend.createGroup(0,0);if((e.BgColor?.alpha??0)>0&&!this.settings.transparentLabels&&this.backend.addRect(r,{x:t,y:n,width:e.Width,height:e.Height,fill:Ce(e.BgColor)}),e.Text){let i=Math.min(.75,e.Width/Math.max(e.Text.length/2,1)),a=Math.max(.1,Math.min(i,Math.max(e.Height*.9,.1)));this.backend.addText(r,{x:t,y:n,width:e.Width,height:e.Height,text:e.Text,fontSize:a,fill:Ce(e.FgColor),align:`center`,verticalAlign:`middle`})}this.linkLayer.addNode(r)})}renderAreaName(e,t){if(!this.settings.areaName)return;let n=e.getAreaName();if(!n)return;let r=this.getEffectiveBounds(e,t),i=this.backend.createGroup(0,0);this.backend.addText(i,{x:r.minX-3.5,y:r.minY-4.5,text:n,fontSize:2.5,fontFamily:this.settings.fontFamily,fill:`white`}),this.roomLayer.addNode(i)}},N=75;function we(e){return e<.5?2*e*e:-1+(4-2*e)*e}var P=class{constructor(e,t){this.zoom=1,this.minZoom=.05,this.position={x:0,y:0},this.centerOnResize=!0,this.dragging=!1,this.dragStart={x:0,y:0},this.positionAtDragStart={x:0,y:0},this.width=e,this.height=t}getScale(){return N*this.zoom}setZoom(e){let t=Math.max(this.minZoom,Math.min(5,e));return this.zoom===t?!1:(this.zoom=t,this.notify(),!0)}zoomToCenter(e){let t=Math.max(this.minZoom,Math.min(5,e));if(this.zoom===t)return!1;let n=this.getScale(),r=this.width/2,i=this.height/2,a={x:(r-this.position.x)/n,y:(i-this.position.y)/n};this.zoom=t;let o=this.getScale();return this.position={x:r-a.x*o,y:i-a.y*o},this.notify(),!0}zoomToPoint(e,t,n){let r=this.getScale(),i={x:(t-this.position.x)/r,y:(n-this.position.y)/r},a=Math.max(this.minZoom,Math.min(5,e));if(this.zoom===a)return!1;this.zoom=a;let o=this.getScale();return this.position={x:t-i.x*o,y:n-i.y*o},this.notify(),!0}getViewportBounds(){let e=this.getScale();return{minX:(0-this.position.x)/e,maxX:(this.width-this.position.x)/e,minY:(0-this.position.y)/e,maxY:(this.height-this.position.y)/e}}clientToMapPoint(e,t,n){let r=e-(n?.left??0),i=t-(n?.top??0),a=this.getScale();return a?{x:(r-this.position.x)/a,y:(i-this.position.y)/a}:null}panToMapPoint(e,t){let n=this.getScale();this.position={x:this.width/2-e*n,y:this.height/2-t*n},this.notify()}panToMapPointAnimated(e,t,n){if(n){this.panToMapPoint(e,t);return}let r={...this.position},i=this.getScale(),a={x:this.width/2-e*i,y:this.height/2-t*i};this.animate(200,e=>{this.position={x:r.x+(a.x-r.x)*e,y:r.y+(a.y-r.y)*e}})}fitToMapBounds(e,t,n,r){let i=t-e,a=r-n;if(i<=0||a<=0)return;let o=this.width/((i+4)*N),s=this.height/((a+4)*N);this.zoom=Math.max(.05,Math.min(5,Math.min(o,s))),this.minZoom=this.zoom;let c=this.getScale(),l=(e+t)/2,u=(n+r)/2;this.position={x:this.width/2-l*c,y:this.height/2-u*c},this.notify()}setSize(e,t){this.width=e,this.height=t,this.notify()}startDrag(e,t){this.cancelAnimation(),this.dragging=!0,this.dragStart={x:e,y:t},this.positionAtDragStart={...this.position}}updateDrag(e,t){this.dragging&&(this.position={x:this.positionAtDragStart.x+(e-this.dragStart.x),y:this.positionAtDragStart.y+(t-this.dragStart.y)},this.notify())}endDrag(){this.dragging=!1}isDragging(){return this.dragging}animate(e,t){this.cancelAnimation();let n=performance.now(),r=typeof requestAnimationFrame<`u`?requestAnimationFrame:e=>setTimeout(()=>e(performance.now()),16),i=a=>{let o=a-n,s=Math.min(o/e,1);t(we(s)),this.notify(),s<1?this.animationId=r(i):this.animationId=void 0};this.animationId=r(i)}cancelAnimation(){this.animationId!==void 0&&((typeof cancelAnimationFrame<`u`?cancelAnimationFrame:e=>clearTimeout(e))(this.animationId),this.animationId=void 0)}isAnimating(){return this.animationId!==void 0}notify(){this.onChange?.()}},Te=class{constructor(e=60){this.samples=[],this.lastCullingTime=0,this.callback=null,this.windowSize=e}setCallback(e){e!==this.callback&&(this.callback=e,this.samples=[])}record(e){this.callback&&(this.samples.push(e),this.samples.length>=this.windowSize&&this.flush())}computeFps(){let e=performance.now(),t=e-this.lastCullingTime;return this.lastCullingTime=e,t>0?1e3/t:0}flush(){let e=this.samples.length;if(e===0)return;let t={cullingMs:0,gridMs:0,visibleRooms:0,totalRooms:0,visibleExits:0,fps:0};for(let e of this.samples)t.cullingMs+=e.cullingMs,t.gridMs+=e.gridMs,t.visibleRooms+=e.visibleRooms,t.totalRooms+=e.totalRooms,t.visibleExits+=e.visibleExits,t.fps+=e.fps;t.cullingMs/=e,t.gridMs/=e,t.visibleRooms=Math.round(t.visibleRooms/e),t.totalRooms=Math.round(t.totalRooms/e),t.visibleExits=Math.round(t.visibleExits/e),t.fps=Math.round(t.fps),this.callback(t),this.samples=[]}},Ee=class{constructor(e,t,n,r){this.roomNodes=new Map,this.standaloneExitNodes=[],this.spatialBucketSize=5,this.roomSpatialIndex=new Map,this.exitSpatialIndex=new Map,this.visibleRooms=new Set,this.visibleStandaloneExitNodes=new Set,this.bufferRoomSet=new Set,this.bufferExitSet=new Set,this.bufferRoomCandidates=new Set,this.bufferExitCandidates=new Set,this.cullingScheduled=!1,this.perfMonitor=new Te,this.coordinateTransform=(e,t)=>({x:e,y:t}),this.stageInfo=e,this.roomLayer=t,this.linkLayer=n,this.settings=r}setCoordinateTransform(e){this.coordinateTransform=e}transformPoint(e,t){return this.coordinateTransform(e,t)}transformBounds(e){let t=this.coordinateTransform,n=t(e.x,e.y),r=t(e.x+e.width,e.y),i=t(e.x+e.width,e.y+e.height),a=t(e.x,e.y+e.height),o=Math.min(n.x,r.x,i.x,a.x),s=Math.max(n.x,r.x,i.x,a.x),c=Math.min(n.y,r.y,i.y,a.y),l=Math.max(n.y,r.y,i.y,a.y);return{x:o,y:c,width:s-o,height:l-c}}computeBucketSize(){this.spatialBucketSize=Math.max(this.settings.roomSize*10,5)}clear(){this.roomNodes.clear(),this.standaloneExitNodes=[],this.standaloneExitBoundsRoomSize=void 0,this.roomSpatialIndex.clear(),this.exitSpatialIndex.clear(),this.visibleRooms.clear(),this.visibleStandaloneExitNodes.clear()}getBucketKey(e,t){return e*1000003+t}forEachBucket(e,t,n,r,i){let a=this.spatialBucketSize,o=Math.min(e,n),s=Math.max(e,n),c=Math.min(t,r),l=Math.max(t,r),u=Math.floor(o/a),d=Math.floor(s/a),f=Math.floor(c/a),p=Math.floor(l/a);for(let e=u;e<=d;e++)for(let t=f;t<=p;t++)i(this.getBucketKey(e,t))}addRoomToSpatialIndex(e){let t=this.settings.roomSize/2,n=this.transformBounds({x:e.room.x-t,y:e.room.y-t,width:this.settings.roomSize,height:this.settings.roomSize});this.forEachBucket(n.x,n.y,n.x+n.width,n.y+n.height,t=>{let n=this.roomSpatialIndex.get(t);n||(n=new Set,this.roomSpatialIndex.set(t,n)),n.add(e)})}addStandaloneExitToSpatialIndex(e){let t=this.transformBounds(e.bounds);this.forEachBucket(t.x,t.y,t.x+t.width,t.y+t.height,t=>{let n=this.exitSpatialIndex.get(t);n||(n=new Set,this.exitSpatialIndex.set(t,n)),n.add(e)})}findRoomAtMapPoint(e,t){let n=this.settings.roomSize,r=this.getBucketKey(Math.floor(e/this.spatialBucketSize),Math.floor(t/this.spatialBucketSize)),i=this.roomSpatialIndex.get(r);if(!i)return null;let a=null,o=1/0;for(let r of i){let i=this.transformPoint(r.room.x,r.room.y),s=e-i.x,c=t-i.y;if(s>=-n&&s<=n&&c>=-n&&c<=n){let e=s*s+c*c;e<o&&(o=e,a=r.room)}}return a}markExitBoundsStale(){this.standaloneExitBoundsRoomSize=void 0}setExitBoundsRoomSize(){this.standaloneExitBoundsRoomSize=this.settings.roomSize}collectRoomCandidates(e,t,n,r){let i=this.bufferRoomCandidates;return i.clear(),this.forEachBucket(e,t,n,r,e=>{this.roomSpatialIndex.get(e)?.forEach(e=>i.add(e))}),i}collectStandaloneExitCandidates(e,t,n,r){let i=this.bufferExitCandidates;return i.clear(),this.forEachBucket(e,t,n,r,e=>{this.exitSpatialIndex.get(e)?.forEach(e=>i.add(e))}),i}refreshStandaloneExitBoundsIfNeeded(){this.standaloneExitBoundsRoomSize!==this.settings.roomSize&&(this.exitSpatialIndex.clear(),this.standaloneExitNodes.forEach(e=>this.addStandaloneExitToSpatialIndex(e)),this.standaloneExitBoundsRoomSize=this.settings.roomSize)}scheduleCulling(){if(this.cullingScheduled)return;this.cullingScheduled=!0;let e=()=>{this.cullingScheduled=!1,this.updateCulling()};typeof requestAnimationFrame<`u`?requestAnimationFrame(e):e()}updateCulling(){if(this.roomNodes.size===0&&this.standaloneExitNodes.length===0)return;let e=this.stageInfo.scaleX();if(!e)return;this.perfMonitor.setCallback(this.settings.perfCallback);let t=this.settings.perfCallback?performance.now():0,n=this.stageInfo.position(),r=this.settings.roomSize/2,i=this.settings.cullingBounds,a=i?i.x:0,o=i?i.x+i.width:this.stageInfo.width(),s=i?i.y:0,c=i?i.y+i.height:this.stageInfo.height(),l=(Math.min(a,o)-n.x)/e,u=(Math.max(a,o)-n.x)/e,d=(Math.min(s,c)-n.y)/e,f=(Math.max(s,c)-n.y)/e,p=!1,m=!1,h=this.settings.cullingEnabled?this.settings.cullingMode??`indexed`:`none`,g=l-r,_=u+r,v=d-r,y=f+r;if(this.refreshStandaloneExitBoundsIfNeeded(),h===`none`){this.roomNodes.forEach(e=>{e.group.isVisible()||(e.group.setVisible(!0),p=!0)}),this.standaloneExitNodes.forEach(e=>{e.group.isVisible()||(e.group.setVisible(!0),m=!0)}),p&&this.roomLayer.batchDraw(),m&&this.linkLayer.batchDraw(),this.visibleRooms.clear(),this.roomNodes.forEach(e=>this.visibleRooms.add(e)),this.visibleStandaloneExitNodes.clear(),this.standaloneExitNodes.forEach(e=>this.visibleStandaloneExitNodes.add(e));return}if(h===`basic`){let e=this.bufferRoomSet;e.clear();let t=this.settings.roomSize;this.roomNodes.forEach(n=>{let i=this.transformBounds({x:n.room.x-r,y:n.room.y-r,width:t,height:t}),a=i.x+i.width>=l&&i.x<=u&&i.y+i.height>=d&&i.y<=f;n.group.isVisible()!==a&&(n.group.setVisible(a),p=!0),a&&e.add(n)}),m=this.cullExits(l,u,d,f).changed,this.bufferRoomSet=this.visibleRooms,this.visibleRooms=e,p&&this.roomLayer.batchDraw(),m&&this.linkLayer.batchDraw();return}let b=this.collectRoomCandidates(g,v,_,y),x=this.bufferRoomSet;x.clear();let S=this.settings.roomSize;if(b.forEach(e=>{let t=this.transformBounds({x:e.room.x-r,y:e.room.y-r,width:S,height:S}),n=t.x+t.width>=l&&t.x<=u&&t.y+t.height>=d&&t.y<=f;e.group.isVisible()!==n&&(e.group.setVisible(n),p=!0),n&&x.add(e)}),this.visibleRooms.forEach(e=>{!b.has(e)&&e.group.isVisible()&&(e.group.setVisible(!1),p=!0)}),this.bufferRoomSet=this.visibleRooms,this.visibleRooms=x,m=this.cullExits(l,u,d,f,!0).changed,p&&this.roomLayer.batchDraw(),m&&this.linkLayer.batchDraw(),this.settings.perfCallback){let e=performance.now()-t;this.perfMonitor.record({cullingMs:e,gridMs:0,visibleRooms:this.visibleRooms.size,totalRooms:this.roomNodes.size,visibleExits:this.visibleStandaloneExitNodes.size,fps:this.perfMonitor.computeFps()})}}cullExits(e,t,n,r,i=!1){let a=i?this.collectStandaloneExitCandidates(e-this.settings.roomSize,n-this.settings.roomSize,t+this.settings.roomSize,r+this.settings.roomSize):this.standaloneExitNodes,o=this.bufferExitSet;o.clear();let s=!1;return a[Symbol.iterator],a.forEach(i=>{let a=this.transformBounds(i.bounds),c=a.x+a.width>=e&&a.x<=t&&a.y+a.height>=n&&a.y<=r;i.group.isVisible()!==c&&(i.group.setVisible(c),s=!0),c&&o.add(i)}),this.visibleStandaloneExitNodes.forEach(e=>{!o.has(e)&&e.group.isVisible()&&(e.group.setVisible(!1),s=!0)}),this.bufferExitSet=this.visibleStandaloneExitNodes,this.visibleStandaloneExitNodes=o,{changed:s}}},De=class{constructor(e,t,n,r,i,a){this.cleanupFns=[],this.destroyed=!1,this.container=e,this.viewport=t,this.state=n,this.settings=r,this.hitTest=i,this.events=a,this.initViewportEvents(),this.initMapEvents()}destroy(){if(!this.destroyed){this.destroyed=!0;for(let e of this.cleanupFns)e();this.cleanupFns.length=0}}listen(e,t,n,r){e.addEventListener(t,n,r),this.cleanupFns.push(()=>e.removeEventListener(t,n,r))}initViewportEvents(){let e=this.container,t=this.viewport,n=1.1,r=()=>{if(t.setSize(e.clientWidth,e.clientHeight),t.centerOnResize&&this.state.positionRoomId){let e=this.state.mapReader.getRoom(this.state.positionRoomId);e&&t.panToMapPoint(e.x,e.y)}};typeof window<`u`&&this.listen(window,`resize`,r),this.listen(e,`resize`,r);let i=!1,a;this.listen(e,`pointerdown`,n=>{if(n.button!==0||n.pointerType===`touch`)return;i=!0,a=n.pointerId,e.setPointerCapture(n.pointerId);let r=e.getBoundingClientRect();t.startDrag(n.clientX-r.left,n.clientY-r.top)}),this.listen(e,`pointermove`,n=>{if(!i||n.pointerId!==a)return;let r=e.getBoundingClientRect();t.updateDrag(n.clientX-r.left,n.clientY-r.top),this.events.emit(`pan`,t.getViewportBounds())}),this.listen(e,`pointerup`,e=>{e.pointerId===a&&(i=!1,a=void 0,t.endDrag(),this.events.emit(`pan`,t.getViewportBounds()))}),this.listen(e,`pointercancel`,e=>{e.pointerId===a&&(i=!1,a=void 0,t.endDrag())});let o;this.listen(e,`touchstart`,n=>{if(n.touches.length===1){let r=n.touches[0];o=r.identifier;let i=e.getBoundingClientRect();t.startDrag(r.clientX-i.left,r.clientY-i.top)}else t.isDragging()&&t.endDrag(),o=void 0},{passive:!0}),this.listen(e,`touchmove`,n=>{let r=n.touches;if(r.length>=2){n.preventDefault(),t.isDragging()&&t.endDrag(),o=void 0;let i=e.getBoundingClientRect(),a={x:r[0].clientX-i.left,y:r[0].clientY-i.top},s={x:r[1].clientX-i.left,y:r[1].clientY-i.top};this.handlePinch(a,s);return}if(r.length===1&&o===r[0].identifier){let n=r[0],i=e.getBoundingClientRect();t.updateDrag(n.clientX-i.left,n.clientY-i.top),this.events.emit(`pan`,t.getViewportBounds())}}),this.listen(e,`touchend`,n=>{if(this.lastPinchDistance=void 0,n.touches.length===0)t.isDragging()&&(t.endDrag(),this.events.emit(`pan`,t.getViewportBounds())),o=void 0;else if(n.touches.length===1){let r=n.touches[0];o=r.identifier;let i=e.getBoundingClientRect();t.startDrag(r.clientX-i.left,r.clientY-i.top)}},{passive:!0}),this.listen(e,`touchcancel`,()=>{this.lastPinchDistance=void 0,t.isDragging()&&t.endDrag(),o=void 0},{passive:!0}),this.listen(e,`wheel`,r=>{r.preventDefault();let i=e.getBoundingClientRect(),a=r.clientX-i.left,o=r.clientY-i.top,s=r.deltaY>0?-1:1;r.ctrlKey&&(s=-s);let c=s>0?t.zoom*n:t.zoom/n;t.zoomToPoint(c,a,o)&&(this.events.emit(`zoom`,{zoom:t.zoom}),this.events.emit(`pan`,t.getViewportBounds()))},{passive:!1})}handlePinch(e,t){let n=Math.hypot(e.x-t.x,e.y-t.y);if(this.lastPinchDistance===void 0||this.lastPinchDistance===0||n===0){this.lastPinchDistance=n;return}let r=(e.x+t.x)/2,i=(e.y+t.y)/2,a=this.viewport.zoom*(n/this.lastPinchDistance);this.viewport.zoomToPoint(a,r,i)&&(this.events.emit(`zoom`,{zoom:this.viewport.zoom}),this.events.emit(`pan`,this.viewport.getViewportBounds())),this.lastPinchDistance=n}initMapEvents(){let e=this.container,t=null;this.listen(e,`mousemove`,n=>{let r=this.findRoomAtClientPoint(n.clientX,n.clientY);if(r!==t&&(t=r,r)){e.style.cursor=`pointer`;return}if(!t){let t=this.findAreaExitAtClientPoint(n.clientX,n.clientY)!==null;e.style.cursor=t?`pointer`:`auto`}}),this.listen(e,`mouseleave`,()=>{t=null,e.style.cursor=`auto`});let n=null;this.listen(e,`mousedown`,e=>{e.button===0&&(n={x:e.clientX,y:e.clientY})}),this.listen(e,`mouseup`,e=>{if(e.button!==0||!n)return;let t=e.clientX-n.x,r=e.clientY-n.y;if(n=null,t*t+r*r>25)return;let i=this.findRoomAtClientPoint(e.clientX,e.clientY);if(i){this.emitRoomClickEvent(i.id,e.clientX,e.clientY);return}let a=this.findAreaExitAtClientPoint(e.clientX,e.clientY);if(a){this.emitAreaExitClickEvent(a.targetRoomId,e.clientX,e.clientY);return}this.emitMapClickEvent()}),this.listen(e,`contextmenu`,e=>{let t=this.findRoomAtClientPoint(e.clientX,e.clientY);t&&(e.preventDefault(),this.emitRoomContextEvent(t.id,e.clientX,e.clientY))});let r,i,a=()=>{r!==void 0&&(window.clearTimeout(r),r=void 0),i=void 0};this.listen(e,`touchstart`,e=>{if(a(),e.touches.length>1)return;let t=e.touches[0];t&&this.findRoomAtClientPoint(t.clientX,t.clientY)&&(i={clientX:t.clientX,clientY:t.clientY},r=window.setTimeout(()=>{if(i){let e=this.findRoomAtClientPoint(i.clientX,i.clientY);e&&this.emitRoomContextEvent(e.id,i.clientX,i.clientY)}a()},500))},{passive:!0}),this.listen(e,`touchend`,()=>a(),{passive:!0}),this.listen(e,`touchcancel`,()=>a(),{passive:!0}),this.listen(e,`touchmove`,e=>{if(!i)return;let t=e.touches[0];if(!t){a();return}let n=t.clientX-i.clientX,r=t.clientY-i.clientY;n*n+r*r>100&&a()},{passive:!0})}findRoomAtClientPoint(e,t){let n=this.hitTest.clientToMapPoint(e,t);return n?this.hitTest.findRoomAtPoint(n.x,n.y):null}findAreaExitAtClientPoint(e,t){let n=this.hitTest.clientToMapPoint(e,t);if(!n)return null;let r=this.settings.roomSize*.5;for(let e of this.hitTest.getAreaExitHitZones()){let t=e.bounds;if(n.x>=t.x-r&&n.x<=t.x+t.width+r&&n.y>=t.y-r&&n.y<=t.y+t.height+r)return e}return null}emitRoomClickEvent(e,t,n){let r=this.container.getBoundingClientRect();this.events.emit(`roomclick`,{roomId:e,position:{x:t-r.left,y:n-r.top}})}emitRoomContextEvent(e,t,n){let r=this.container.getBoundingClientRect();this.events.emit(`roomcontextmenu`,{roomId:e,position:{x:t-r.left,y:n-r.top}})}emitAreaExitClickEvent(e,t,n){let r=this.container.getBoundingClientRect();this.events.emit(`areaexitclick`,{targetRoomId:e,position:{x:t-r.left,y:n-r.top}})}emitMapClickEvent(){this.events.emit(`mapclick`,void 0)}},F=class{constructor(e){this.konvaGroup=e}setVisible(e){this.konvaGroup.visible(e)}isVisible(){return this.konvaGroup.visible()}destroy(){this.konvaGroup.destroy()}setPosition(e,t){this.konvaGroup.position({x:e,y:t})}getPosition(){return this.konvaGroup.position()}moveToTop(){this.konvaGroup.moveToTop()}},I=class{constructor(e){this.konvaLayer=e}addNode(e){e instanceof F&&this.konvaLayer.add(e.konvaGroup)}destroyChildren(){this.konvaLayer.destroyChildren()}batchDraw(){this.konvaLayer.batchDraw()}},Oe=class{createGroup(e,t){return new F(new l.default.Group({x:e,y:t,listening:!1}))}addRect(e,t){e instanceof F&&e.konvaGroup.add(new l.default.Rect({x:t.x,y:t.y,width:t.width,height:t.height,fill:t.fill,stroke:t.stroke,strokeWidth:t.strokeWidth??0,cornerRadius:t.cornerRadius??0,dash:t.dash,dashEnabled:t.dashEnabled??!1,perfectDrawEnabled:!1,listening:!1}))}addCircle(e,t){e instanceof F&&e.konvaGroup.add(new l.default.Circle({x:t.cx,y:t.cy,radius:t.radius,fill:t.fill,stroke:t.stroke,strokeWidth:t.strokeWidth??0,dash:t.dash,dashEnabled:t.dashEnabled??!1,perfectDrawEnabled:!1,listening:!1}))}addLine(e,t){e instanceof F&&e.konvaGroup.add(new l.default.Line({points:t.points,stroke:t.stroke,strokeWidth:t.strokeWidth??0,dash:t.dash,lineCap:t.lineCap,lineJoin:t.lineJoin,opacity:t.alpha,perfectDrawEnabled:!1,listening:!1}))}addPolygon(e,t){e instanceof F&&e.konvaGroup.add(new l.default.Line({points:t.vertices,closed:!0,fill:t.fill,stroke:t.stroke,strokeWidth:t.strokeWidth??0,perfectDrawEnabled:!1,listening:!1}))}addText(e,t){if(!(e instanceof F))return;let n=(t.offsetY??0)+(t.konvaCorrectionRatio??0)*t.fontSize;if(t.transform){let[n,r,i,a,o,s]=t.transform,c=t.width,u=t.height,d=t.text,f=t.fontSize,p=t.fontFamily??`sans-serif`,m=t.fontStyle??`normal`,h=t.fill??`black`;e.konvaGroup.add(new l.default.Shape({listening:!1,perfectDrawEnabled:!1,sceneFunc:e=>{e.save();let t=e._context;t.transform(n,r,i,a,o,s),t.font=`${m} ${f}px ${p}`,t.fillStyle=h,t.textAlign=`center`,t.textBaseline=`middle`,t.fillText(d,(c??0)/2,(u??0)/2),e.restore()}}))}else e.konvaGroup.add(new l.default.Text({x:t.x,y:t.y,text:t.text,fontSize:t.fontSize,fontFamily:t.fontFamily,fontStyle:t.fontStyle,fill:t.fill,align:t.align,verticalAlign:t.verticalAlign,width:t.width,height:t.height,offsetY:n||void 0,perfectDrawEnabled:!1,listening:!1}))}addImage(e,t){if(!(e instanceof F))return;let n=l.default.Util.createImageElement();if(n.src=t.src,t.transform){let[r,i,a,o,s,c]=t.transform,u=t.width,d=t.height;e.konvaGroup.add(new l.default.Shape({listening:!1,perfectDrawEnabled:!1,sceneFunc:(e,t)=>{e.save();let l=e._context;l.transform(r,i,a,o,s,c),l.drawImage(n,0,0,u,d),e.restore()}}))}else e.konvaGroup.add(new l.default.Image({x:t.x,y:t.y,width:t.width,height:t.height,image:n,listening:!1}))}getExitDepthOffset(){return{x:0,y:0}}getTransform(){return b}getInverseTransform(){return b}},L=[`up`,`down`,`in`,`out`];function R(e,t,n,r,i){return e.roomShape===`circle`?de(t,n,r,i):e.roomShape===`roundedRectangle`?ue(t,n,r,i,e.roomSize*.2):k(t,n,r,i)}function ke(e,t,n){for(let[e,r]of Object.entries(t.exits))if(r===n.id){let r=e;if(L.includes(r)){let e=D[r];return{type:`inner`,fromDir:r,customLineKey:t.customLines[e]?e:t.customLines[r]?r:void 0,fromRoom:t,toRoom:n}}let i=D[r];return t.customLines[i]?{type:`special`,fromDir:r,customLineKey:i,fromRoom:t,toRoom:n}:t.customLines[r]?{type:`special`,fromDir:r,customLineKey:r,fromRoom:t,toRoom:n}:{type:`regular`,fromDir:r,toDir:Ae(n,t.id),fromRoom:t,toRoom:n}}for(let[e,r]of Object.entries(t.specialExits))if(r===n.id)return t.customLines[e]?{type:`special`,customLineKey:e,fromRoom:t,toRoom:n}:{type:`inner`,fromRoom:t,toRoom:n};for(let[e,r]of Object.entries(n.exits))if(r===t.id){let r=e;if(L.includes(r)){let e=D[r];return{type:`inner`,toDir:r,customLineKey:n.customLines[e]?e:n.customLines[r]?r:void 0,fromRoom:t,toRoom:n}}let i=D[r];return n.customLines[i]?{type:`special`,toDir:r,customLineKey:i,fromRoom:t,toRoom:n}:n.customLines[r]?{type:`special`,toDir:r,customLineKey:r,fromRoom:t,toRoom:n}:{type:`regular`,toDir:r,fromRoom:t,toRoom:n}}for(let[e,r]of Object.entries(n.specialExits))if(r===t.id)return n.customLines[e]?{type:`special`,customLineKey:e,fromRoom:t,toRoom:n}:{type:`inner`,fromRoom:t,toRoom:n};return{type:`none`,fromRoom:t,toRoom:n}}function Ae(e,t){for(let[n,r]of Object.entries(e.exits))if(r===t)return n}function je(e,t,n){return e?e.area===t&&e.z===n:!1}function Me(e,t){for(let[n,r]of Object.entries(e.exits))if(r===t.id)return{direction:n};for(let[n,r]of Object.entries(e.specialExits))if(r===t.id)return}function Ne(e,t){for(let n of se)if(e.exits[n]===t.id)return n;for(let n of se)if(t.exits[n]===e.id)return ce[n]}function Pe(e,t,n){let{fromRoom:r,toRoom:i,fromDir:a,toDir:o}=t;if(n.length===0&&n.push(r.x,r.y),a&&E.includes(a)){let t=R(e,r.x,r.y,a,e.roomSize/2);n.push(t.x,t.y)}if(o&&E.includes(o)){let t=R(e,i.x,i.y,o,e.roomSize/2);n.push(t.x,t.y)}n.push(i.x,i.y)}function Fe(e,t){let{fromRoom:n,toRoom:r,customLineKey:i}=e,a=n,o;i&&(o=n.customLines[i],o||(o=r.customLines[i],a=r)),t.length===0&&t.push(a.x,a.y),o&&o.points.forEach(e=>{t.push(e.x,-e.y)}),t.push(r.x,r.y)}function Ie(e,t,n,r,i){let a=[],o=[],s=[],c=n.map(t=>e.getRoom(t)).filter(e=>e!==void 0),l=[],u=()=>{l.length>=4&&a.push({points:[...l]}),l=[]},d=e=>{let{fromRoom:t,toRoom:n,fromDir:r,toDir:i,customLineKey:a}=e;if(a){let e=t,r=t.customLines[a];if(r||(r=n.customLines[a],e=n),r){let t=[e.x,e.y];r.points.forEach(e=>{t.push(e.x,-e.y)}),s.push({points:t})}}r&&L.includes(r)&&o.push({room:t,direction:r}),i&&L.includes(i)&&o.push({room:n,direction:i})};for(let n=0;n<c.length-1;n++){let a=c[n],s=c[n+1],f=je(a,r,i),p=je(s,r,i);if(!f&&!p){u();continue}if(f&&p){let n=ke(e,a,s);switch(n.type){case`regular`:Pe(t,n,l);break;case`special`:Fe(n,l);break;case`inner`:u(),d(n);break;case`none`:l.length===0&&l.push(a.x,a.y),l.push(s.x,s.y);break}}else{let e=f?a:s,n=f?s:a,r=Me(e,n);if(r){if(L.includes(r.direction))u(),o.push({room:e,direction:r.direction});else if(E.includes(r.direction)){l.length===0&&l.push(e.x,e.y);let n=R(t,e.x,e.y,r.direction,t.roomSize/2),i=k(e.x,e.y,r.direction,t.roomSize);l.push(n.x,n.y,i.x,i.y),u()}}else{let r=Ne(e,n);if(r){l.length===0&&l.push(e.x,e.y);let n=R(t,e.x,e.y,r,t.roomSize/2),i=k(e.x,e.y,r,t.roomSize);l.push(n.x,n.y,i.x,i.y),u()}}}}return u(),{segments:a,innerMarkers:o,customLines:s}}function z(e,t,n){let r=1.425,i=n.roomSize;return{shape:n.roomShape===`circle`?`circle`:`rect`,cx:e.x,cy:e.y,size:i/2*r,cornerRadius:n.roomShape===`roundedRectangle`?i*r*.2:0,stroke:t,strokeWidth:.1,dash:[.05,.05]}}function Le(e,t){let n=t.playerMarker,r=t.roomSize*n.sizeFactor,i=n.matchRoomShape&&t.roomShape!==`circle`;return{shape:i?`rect`:`circle`,cx:e.x,cy:e.y,size:r/2,cornerRadius:i&&t.roomShape===`roundedRectangle`?r*.2:0,strokeColor:n.strokeColor,strokeWidth:n.strokeWidth,strokeAlpha:n.strokeAlpha,fillColor:n.fillColor,fillAlpha:n.fillAlpha,dash:n.dash,dashEnabled:n.dashEnabled}}function Re(e,t,n,r,i,a){let o=Ie(e,t,n,i,a),s=t.lineWidth,c=t.roomSize/5,l=[];for(let e of o.segments)e.points.length>=4&&l.push({points:e.points});for(let e of o.customLines)e.points.length>=4&&l.push({points:e.points});let u=[];for(let e of o.innerMarkers){let t=e.direction===`up`?0:e.direction===`down`?180:e.direction===`in`?90:-90;u.push({vertices:j(e.room.x,e.room.y,c,t)})}return{segments:l,triangles:u,color:r,outlineWidth:s*8,lineWidth:s*4}}var B,ze,Be=256;function Ve(e,t,n){let r=`${e.toFixed(2)}:${t}:${n.toFixed(3)}`;if(ze===r&&B)return B;let i=Be,a=i/2,o=document.createElement(`canvas`);o.width=i,o.height=i;let s=o.getContext(`2d`);s.fillStyle=`rgba(0, 0, 0, ${e})`,s.fillRect(0,0,i,i),s.globalCompositeOperation=`destination-out`;let c=s.createRadialGradient(a,a,0,a,a,a),l=Math.min(n,.99);c.addColorStop(0,`rgba(0, 0, 0, 1)`),c.addColorStop(l*.25,`rgba(0, 0, 0, 0.97)`),c.addColorStop(l*.5,`rgba(0, 0, 0, 0.82)`),c.addColorStop(l*.7,`rgba(0, 0, 0, 0.50)`),c.addColorStop(l*.85,`rgba(0, 0, 0, 0.22)`),c.addColorStop(l*.95,`rgba(0, 0, 0, 0.06)`),c.addColorStop(l,`rgba(0, 0, 0, 0)`),l<.98&&c.addColorStop(1,`rgba(0, 0, 0, 0)`),s.fillStyle=c,s.beginPath(),s.arc(a,a,a,0,Math.PI*2),s.fill(),s.globalCompositeOperation=`source-over`;let u=parseInt(t.slice(1,3),16),d=parseInt(t.slice(3,5),16),f=parseInt(t.slice(5,7),16),p=s.createRadialGradient(a,a,0,a,a,a*l);return p.addColorStop(0,`rgba(${u}, ${d}, ${f}, 0.05)`),p.addColorStop(1,`rgba(${u}, ${d}, ${f}, 0)`),s.fillStyle=p,s.fillRect(0,0,i,i),B=o.toDataURL(),ze=r,B}function He(e,t,n,r){let{radius:i,intensity:a,color:o}=r.ambientLight,s=n.maxX-n.minX,c=n.maxY-n.minY,l=Math.sqrt(s*s+c*c),u=Math.max(l*2.5,i*4);return{cx:e,cy:t,displaySize:u,src:Ve(a,o,Math.round(i/(u/2)*50)/50)}}function Ue(e,t){let n=e.createGroup(0,0);if(t.shape===`circle`)e.addCircle(n,{cx:t.cx,cy:t.cy,radius:t.size,stroke:t.stroke,strokeWidth:t.strokeWidth,dash:t.dash,dashEnabled:!0});else{let r=t.cx-t.size,i=t.cy-t.size,a=t.cx+t.size,o=t.cy+t.size,s=[[r,i,a,i],[a,i,a,o],[a,o,r,o],[r,o,r,i]];for(let r of s)e.addLine(n,{points:r,stroke:t.stroke,strokeWidth:t.strokeWidth,dash:t.dash,lineCap:`butt`})}return n}function We(e,t){let n=e.createGroup(0,0),r=_(t.strokeColor,t.strokeAlpha),i=t.fillAlpha>0?_(t.fillColor,t.fillAlpha):void 0;return t.shape===`circle`?e.addCircle(n,{cx:t.cx,cy:t.cy,radius:t.size,fill:i,stroke:r,strokeWidth:t.strokeWidth,dash:t.dash,dashEnabled:t.dashEnabled}):e.addRect(n,{x:t.cx-t.size,y:t.cy-t.size,width:t.size*2,height:t.size*2,fill:i,stroke:r,strokeWidth:t.strokeWidth,cornerRadius:t.cornerRadius,dash:t.dash,dashEnabled:t.dashEnabled}),n}function Ge(e,t){let n=e.createGroup(0,0);for(let r of t.segments)e.addLine(n,{points:r.points,stroke:`black`,strokeWidth:t.outlineWidth,lineCap:`round`,lineJoin:`round`,alpha:.8}),e.addLine(n,{points:r.points,stroke:t.color,strokeWidth:t.lineWidth,lineCap:`round`,lineJoin:`round`,alpha:.8});for(let r of t.triangles)e.addPolygon(n,{vertices:r.vertices,fill:t.color,stroke:`black`,strokeWidth:t.outlineWidth/4});return n}function Ke(e,t){let n=e.createGroup(0,0);return e.addLine(n,{points:t.line.points,stroke:t.line.stroke,strokeWidth:t.line.strokeWidth,dash:t.line.dash}),t.arrow&&e.addPolygon(n,{vertices:[t.arrow.tipX,t.arrow.tipY,t.arrow.x1,t.arrow.y1,t.arrow.x2,t.arrow.y2],fill:t.arrow.fill,stroke:t.arrow.stroke,strokeWidth:t.arrow.strokeWidth}),t.door&&e.addRect(n,{x:t.door.x,y:t.door.y,width:t.door.width,height:t.door.height,stroke:t.door.stroke,strokeWidth:t.door.strokeWidth}),n}function qe(e,t){let n=e.createGroup(0,0);for(let r of t)e.addLine(n,{points:[r.x1,r.y1,r.x2,r.y2],stroke:r.stroke,strokeWidth:r.strokeWidth});return n}function Je(e,t){let n=e.createGroup(0,0);for(let r of t)e.addPolygon(n,{vertices:r.vertices,fill:r.fill,stroke:r.stroke,strokeWidth:r.strokeWidth});return n}function Ye(e,t){let n=e.createGroup(0,0);return e.addImage(n,{x:t.cx-t.displaySize/2,y:t.cy-t.displaySize/2,width:t.displaySize,height:t.displaySize,src:t.src}),n}var Xe=class{constructor(e,t){this.rooms=[],this.labels=[],this.rooms=e,this.labels=t,this.bounds=this.createBounds()}getRooms(){return this.rooms}getLabels(){return this.labels}getBounds(){return this.bounds}createBounds(){let e=this.rooms.reduce((e,t)=>({minX:Math.min(e.minX,t.x),maxX:Math.max(e.maxX,t.x),minY:Math.min(e.minY,t.y),maxY:Math.max(e.maxY,t.y)}),{minX:1/0,maxX:-1/0,minY:1/0,maxY:-1/0});for(let t of this.labels){let n=t.X,r=-t.Y;e.minX=Math.min(e.minX,n),e.maxX=Math.max(e.maxX,n+t.Width),e.minY=Math.min(e.minY,r),e.maxY=Math.max(e.maxY,r+t.Height)}return e}},V=class e{constructor(e){this.planes={},this.exits=new Map,this.version=0,this.area=e,this.planes=this.createPlanes(),this.createExits()}getAreaName(){return this.area.areaName}getAreaId(){return parseInt(this.area.areaId)}getVersion(){return this.version}markDirty(){this.version++}getPlane(e){return this.planes[e]}getPlanes(){return Object.values(this.planes)}getZLevels(){return Object.keys(this.planes).map(Number).sort((e,t)=>e-t)}getRooms(){return this.area.rooms}getFullBounds(){return this.getPlanes().reduce((e,t)=>{let n=t.getBounds();return{minX:Math.min(e.minX,n.minX),maxX:Math.max(e.maxX,n.maxX),minY:Math.min(e.minY,n.minY),maxY:Math.max(e.maxY,n.maxY)}},{minX:1/0,maxX:-1/0,minY:1/0,maxY:-1/0})}getLinkExits(e){return Array.from(this.exits.values()).filter(t=>t.zIndex.includes(e))}createPlanes(){let e=this.area.rooms.reduce((e,t)=>(e[t.z]||(e[t.z]=[]),e[t.z].push(t),e),{});return Object.entries(e).reduce((e,[t,n])=>(e[+t]=new Xe(n,this.area.labels.filter(e=>e.Z===+t)),e),{})}static{this.oppositeDir={north:`south`,south:`north`,east:`west`,west:`east`,northeast:`southwest`,southwest:`northeast`,northwest:`southeast`,southeast:`northwest`,up:`down`,down:`up`,in:`out`,out:`in`}}createExits(){let t=new Map;this.area.rooms.forEach(e=>{Object.entries(e.exits).forEach(([n,r])=>{if(e.id===r)return;let i=`${Math.min(e.id,r)}-${Math.max(e.id,r)}`;t.has(i)||t.set(i,[]),t.get(i).push({origin:e.id,target:r,z:e.z,dir:n})})});for(let[n,r]of t){let[t,i]=n.split(`-`),a=parseInt(t),o=parseInt(i),s=r.filter(e=>e.origin===a),c=r.filter(e=>e.origin===o),l=new Set;for(let t of s){let r=-1;for(let n=0;n<c.length;n++)if(!l.has(n)){if(c[n].dir===e.oppositeDir[t.dir]){r=n;break}r===-1&&(r=n)}if(r!==-1){l.add(r);let e=c[r];this.exits.set(`${n}-${t.dir}`,{a,b:o,aDir:t.dir,bDir:e.dir,zIndex:[t.z,e.z]})}else this.exits.set(`${n}-a:${t.dir}`,{a,b:o,aDir:t.dir,zIndex:[t.z]})}for(let e=0;e<c.length;e++)if(!l.has(e)){let t=c[e];this.exits.set(`${n}-b:${t.dir}`,{a,b:o,bDir:t.dir,zIndex:[t.z]})}}}},Ze=class extends Xe{constructor(e,t){super(e.getRooms(),e.getLabels()),this.basePlane=e,this.visitedRooms=t}getRooms(){return this.basePlane.getRooms().filter(e=>this.visitedRooms.has(e.id))}getLabels(){return this.basePlane.getLabels()}getBounds(){let e=this.getRooms();return e.length?e.reduce((e,t)=>({minX:Math.min(e.minX,t.x),maxX:Math.max(e.maxX,t.x),minY:Math.min(e.minY,t.y),maxY:Math.max(e.maxY,t.y)}),{minX:1/0,maxX:-1/0,minY:1/0,maxY:-1/0}):this.basePlane.getBounds()}},H=class extends V{constructor(e,t){super(e),this.planeCache=new WeakMap,this.visitedRooms=t instanceof Set?t:new Set(t??[]),this.areaRoomIds=new Set(e.rooms.map(e=>e.id))}getPlane(e){let t=super.getPlane(e);if(!t)return t;let n=this.planeCache.get(t);return n||(n=new Ze(t,this.visitedRooms),this.planeCache.set(t,n)),n}getPlanes(){return super.getPlanes().map(e=>{let t=this.planeCache.get(e);return t||(t=new Ze(e,this.visitedRooms),this.planeCache.set(e,t)),t})}getLinkExits(e){return super.getLinkExits(e).filter(e=>this.visitedRooms.has(e.a)||this.visitedRooms.has(e.b))}getVisitedRoomCount(){return super.getRooms().reduce((e,t)=>e+ +!!this.visitedRooms.has(t.id),0)}getTotalRoomCount(){return this.areaRoomIds.size}hasVisitedRoom(e){return this.areaRoomIds.has(e)&&this.visitedRooms.has(e)}getVisitedRoomIds(){return super.getRooms().filter(e=>this.visitedRooms.has(e.id)).map(e=>e.id)}addVisitedRoom(e){let t=this.visitedRooms.has(e);this.visitedRooms.add(e);let n=!t&&this.areaRoomIds.has(e);return n&&this.markDirty(),n}addVisitedRooms(e){let t=0;for(let n of e){let e=this.visitedRooms.has(n);this.visitedRooms.add(n),!e&&this.areaRoomIds.has(n)&&t++}return t>0&&this.markDirty(),t}},U=`rgb(120, 72, 0)`,Qe=class{get coordinateTransform(){return this._coordinateTransform}constructor(e,t,n){if(this.highlightShapes=new Map,this.pathShapes=[],this.currentRoomOverlay=[],this.areaExitHitZones=[],this.destroyed=!1,this._coordinateTransform=b,this.coordinateInverse=b,this.overlayPlugins=new Map,this.state=e,this.container=t,t?(this.stage=new l.default.Stage({container:t,width:t.clientWidth,height:t.clientHeight,draggable:!1}),t.style.backgroundColor=e.settings.backgroundColor,this.viewport=new P(t.clientWidth,t.clientHeight)):(this.stage=new l.default.Stage({width:1,height:1}),this.viewport=new P(1,1)),this.gridLayer=new l.default.Layer({listening:!1}),this.stage.add(this.gridLayer),this.linkLayer=new l.default.Layer({listening:!1}),this.stage.add(this.linkLayer),this.roomLayer=new l.default.Layer({listening:!1}),this.stage.add(this.roomLayer),this.positionLayer=new l.default.Layer({listening:!1}),this.stage.add(this.positionLayer),this.overlayLayer=new l.default.Layer({listening:!1}),this.stage.add(this.overlayLayer),this.drawingBackend=n??new Oe,this.positionLayerNode=new I(this.positionLayer),this.overlayLayerNode=new I(this.overlayLayer),this.pipeline=new M(e.mapReader,e.settings,this.drawingBackend,{gridLayer:new I(this.gridLayer),linkLayer:new I(this.linkLayer),roomLayer:new I(this.roomLayer)}),this.events=new v(t),this.culling=new Ee(this.stage,new I(this.roomLayer),new I(this.linkLayer),e.settings),this.viewport.onChange=()=>this.applyViewportToStage(),t){this.origSetSize=this.viewport.setSize.bind(this.viewport);let n=this.origSetSize;this.viewport.setSize=(e,t)=>{n(e,t),this.stage.width(e),this.stage.height(t)},this.interactionHandler=new De(t,this.viewport,e,e.settings,{clientToMapPoint:(e,n)=>this.viewport.clientToMapPoint(e,n,t.getBoundingClientRect()),findRoomAtPoint:(e,t)=>this.culling.findRoomAtMapPoint(e,t),getAreaExitHitZones:()=>this.areaExitHitZones},this.events)}this.applyDrawingBackendTransforms(this.drawingBackend),this.subscribeToState(e)}setDrawingBackend(e){this.drawingBackend=e,this.pipeline=new M(this.state.mapReader,this.state.settings,e,{gridLayer:new I(this.gridLayer),linkLayer:new I(this.linkLayer),roomLayer:new I(this.roomLayer)}),this.applyDrawingBackendTransforms(e)}applyDrawingBackendTransforms(e){let t=e.getTransform(),n=e.getInverseTransform(),r=this.coordinateInverse;this._coordinateTransform=t,this.coordinateInverse=n,this.culling.setCoordinateTransform(t),this.pipeline.gridRenderer.setInverseTransform(n);let i=this.viewport.getScale(),a=this.viewport.width/2,o=this.viewport.height/2,s=r((a-this.viewport.position.x)/i,(o-this.viewport.position.y)/i),c=t(s.x,s.y);this.viewport.position={x:a-c.x*i,y:o-c.y*i},this.applyViewportToStage()}mapPoint(e,t){return this._coordinateTransform(e,t)}get exitRenderer(){return this.pipeline.exitRenderer}get roomShapeRenderer(){return this.pipeline.roomShapeRenderer}get gridRenderer(){return this.pipeline.gridRenderer}destroy(){if(!this.destroyed){this.destroyed=!0,this.state.events.removeAllListeners(),this.interactionHandler?.destroy();for(let e of this.overlayPlugins.values())e.destroy();this.overlayPlugins.clear(),this.viewport.cancelAnimation(),this.origSetSize&&(this.viewport.setSize=this.origSetSize),this.viewport.onChange=void 0,this.clearOverlayShapes(),this.clearCurrentRoomOverlay(),this.positionMarker&&=(this.positionMarker.destroy(),void 0),this.ambientLightNode&&=(this.ambientLightNode.destroy(),void 0),this.stage.destroy(),this.events.removeAllListeners()}}updateBackground(){this.container&&(this.container.style.backgroundColor=this.state.settings.backgroundColor)}exportCanvas(e){if(this.state.currentArea===void 0||this.state.currentZIndex===void 0)return;let t=this.stage.toCanvas({pixelRatio:e?.pixelRatio??1}),n=document.createElement(`canvas`);n.width=t.width,n.height=t.height;let r=n.getContext(`2d`);return r.fillStyle=this.state.settings.backgroundColor,r.fillRect(0,0,n.width,n.height),r.drawImage(t,0,0),n}applyViewportToStage(){let e=this.viewport.getScale();this.stage.scale({x:e,y:e}),this.stage.position(this.viewport.position),this.stage.batchDraw(),this.pipeline.gridRenderer.render(this.viewport.getViewportBounds()),this.culling.scheduleCulling(),this.refreshAmbientLight();let t=this.viewport.getViewportBounds();for(let n of this.overlayPlugins.values())n.updateViewport(t,e,this.coordinateTransform)}toCanvas(e){let{currentArea:t,currentZIndex:n,currentAreaInstance:r}=this.state;if(t===void 0||n===void 0||!r)return;let i=r,a=i.getPlane(n);if(!a)return;let{width:o,height:s}=e,c=e.padding??3,u=this.viewport.width,d=this.viewport.height,f=this.viewport.zoom,p=this.viewport.minZoom,m={...this.viewport.position},h=this.viewport.onChange;this.viewport.onChange=void 0;let g=this.state.computeExportBounds(i,a,e.roomId,c),_=o/g.w,v=s/g.h,y=Math.min(_,v),b=g.w*y,x=g.h*y,S=(o-b)/2,C=(s-x)/2,w={x:S-g.x*y,y:C-g.y*y};this.viewport.width=o,this.viewport.height=s,this.viewport.zoom=y/(this.viewport.getScale()/this.viewport.zoom),this.viewport.position=w,this.stage.width(o),this.stage.height(s),this.stage.scale({x:y,y}),this.stage.position(w),this.pipeline.gridRenderer.render(this.viewport.getViewportBounds()),this.culling.updateCulling();let T=new l.default.Layer({listening:!1});T.scale({x:1/y,y:1/y}),T.position({x:-(S-g.x*y)/y,y:-(C-g.y*y)/y}),T.add(new l.default.Rect({x:0,y:0,width:o,height:s,fill:this.state.settings.backgroundColor})),this.stage.add(T),T.moveToBottom();let ee=this.stage.toCanvas({width:o,height:s});return T.destroy(),this.viewport.width=u,this.viewport.height=d,this.viewport.zoom=f,this.viewport.minZoom=p,this.viewport.position=m,this.viewport.onChange=h,this.stage.width(u),this.stage.height(d),this.applyViewportToStage(),this.culling.updateCulling(),ee}refresh(){let{currentAreaInstance:e,currentZIndex:t,positionRoomId:n}=this.state;if(!e||t===void 0)return;let r=e.getPlane(t);if(!r)return;this.updateBackground();let i=this.buildScene(e,r,t,this.viewport.getViewportBounds());this.onSceneBuilt(i),this.syncHighlights(),this.syncPaths(),n!==void 0&&this.onPositionChanged(n,!1,!1)}addOverlayPlugin(e,t){this.removeOverlayPlugin(e),t.attach(this.overlayLayer),this.overlayPlugins.set(e,t),t.updateViewport(this.viewport.getViewportBounds(),this.viewport.getScale(),this.coordinateTransform)}removeOverlayPlugin(e){let t=this.overlayPlugins.get(e);t&&(t.destroy(),this.overlayPlugins.delete(e))}subscribeToState(e){e.events.on(`area`,()=>{this.refresh()}),e.events.on(`position`,({roomId:e,center:t,areaChanged:n})=>{this.onPositionChanged(e,t,n)}),e.events.on(`center`,({roomId:t,instant:n})=>{let r=e.mapReader.getRoom(t);if(r){let e=this.mapPoint(r.x,r.y);this.viewport.panToMapPointAnimated(e.x,e.y,n||this.state.settings.instantMapMove)}}),e.events.on(`highlight`,({roomId:e,color:t})=>{this.syncHighlight(e,t)}),e.events.on(`path`,()=>{this.syncPaths()}),e.events.on(`clear`,()=>{this.syncHighlights()})}buildScene(e,t,n,r){this.positionLayer.destroyChildren(),this.positionMarker=void 0,this.clearOverlayShapes(),this.currentRoomOverlay=[];let i=this.pipeline.buildScene(e,t,n,r);return this.lastBuildResult=i,i}onSceneBuilt(e){this.culling.clear(),this.areaExitHitZones=[],this.culling.computeBucketSize();let t=this.viewport.getScale();this.stage.scale({x:t,y:t});for(let[,t]of e.roomNodes)this.culling.roomNodes.set(t.room.id,t),this.culling.addRoomToSpatialIndex(t);for(let t of e.standaloneExitNodes)this.culling.standaloneExitNodes.push(t),this.culling.addStandaloneExitToSpatialIndex(t);this.culling.setExitBoundsRoomSize(),this.areaExitHitZones=e.areaExitHitZones,this.culling.updateCulling(),this.stage.batchDraw()}onPositionChanged(e,t,n){if(e===void 0){this.positionMarker&&=(this.positionMarker.destroy(),void 0),this.ambientLightNode&&=(this.ambientLightNode.destroy(),void 0),this.positionLayerNode.batchDraw(),this.clearCurrentRoomOverlay(),this.overlayLayerNode.batchDraw();return}let r=this.state.mapReader.getRoom(e);if(r){if(t){let e=this.mapPoint(r.x,r.y);this.viewport.panToMapPointAnimated(e.x,e.y,n||this.state.settings.instantMapMove)}this.updateCurrentRoomOverlay(r),this.applyAmbientLight(r),this.applyPositionMarker(r)}}applyPositionMarker(e){this.positionMarker&&this.positionMarker.destroy();let t=Le(e,this.state.settings);this.positionMarker=We(this.drawingBackend,t),this.positionLayerNode.addNode(this.positionMarker)}applyAmbientLight(e){if(this.ambientLightNode&&=(this.ambientLightNode.destroy(),void 0),!this.state.settings.ambientLight.enabled)return;let t=this.viewport.getViewportBounds(),n=He(e.x,e.y,t,this.state.settings);this.ambientLightNode=Ye(this.drawingBackend,n),this.overlayLayerNode.addNode(this.ambientLightNode),this.overlayLayerNode.batchDraw()}refreshAmbientLight(){if(!this.state.settings.ambientLight.enabled||this.state.positionRoomId===void 0)return;let e=this.state.mapReader.getRoom(this.state.positionRoomId);e&&this.applyAmbientLight(e)}clearCurrentRoomOverlay(){this.currentRoomOverlay.forEach(e=>e.destroy()),this.currentRoomOverlay=[],this.positionLayerNode.batchDraw()}updateCurrentRoomOverlay(e){if(this.clearCurrentRoomOverlay(),e.area!==this.state.currentArea||e.z!==this.state.currentZIndex){this.positionLayerNode.batchDraw();return}let t=this.state.settings;if(!t.highlightCurrentRoom){this.positionMarker&&this.positionMarker.moveToTop(),this.positionLayerNode.batchDraw();return}let n=new Map;n.set(e.id,e);let r=[],i=this.pipeline.exitRenderer,a=this.state.currentAreaInstance instanceof H?this.state.currentAreaInstance:void 0;this.state.currentAreaInstance&&this.state.currentZIndex!==void 0&&this.state.currentAreaInstance.getLinkExits(this.state.currentZIndex).filter(t=>t.a===e.id||t.b===e.id).forEach(e=>{let t=i.renderDataWithColor(e,U,this.state.currentZIndex);t&&r.push(this.pipeline.renderExitData(t))});for(let n of ve(e,t,U))r.push(Ke(this.drawingBackend,n));let o=ge(e,t,U);o.length>0&&r.push(qe(this.drawingBackend,o)),[...Object.values(e.exits),...Object.values(e.specialExits)].forEach(e=>{let t=this.state.mapReader.getRoom(e),r=!a||a.hasVisitedRoom(e);t&&t.area===this.state.currentArea&&t.z===this.state.currentZIndex&&r&&n.set(e,t)}),r.forEach(e=>{this.positionLayerNode.addNode(e),this.currentRoomOverlay.push(e)}),n.forEach((n,r)=>{let i=r===e.id,a=this.pipeline.roomShapeRenderer.createRoomGroup(n,{strokeOverride:i?U:t.lineColor});this.positionLayerNode.addNode(a),this.currentRoomOverlay.push(a)}),n.forEach(e=>{let{triangles:n}=Se(e,this.state.mapReader,t);if(n.length>0){let e=Je(this.drawingBackend,n);this.positionLayerNode.addNode(e),this.currentRoomOverlay.push(e)}}),this.positionMarker&&this.positionMarker.moveToTop(),this.positionLayerNode.batchDraw()}syncHighlight(e,t){let n=this.highlightShapes.get(e);if(n&&(n.destroy(),this.highlightShapes.delete(e)),t!==void 0){let n=this.state.mapReader.getRoom(e);if(n&&n.area===this.state.currentArea&&n.z===this.state.currentZIndex){let r=z(n,t,this.state.settings),i=Ue(this.drawingBackend,r);this.overlayLayerNode.addNode(i),this.highlightShapes.set(e,i)}}this.overlayLayerNode.batchDraw()}syncHighlights(){for(let e of this.highlightShapes.values())e.destroy();this.highlightShapes.clear();for(let[e,t]of this.state.highlights){if(t.area!==this.state.currentArea||t.z!==this.state.currentZIndex)continue;let n=this.state.mapReader.getRoom(e);if(!n)continue;let r=z(n,t.color,this.state.settings),i=Ue(this.drawingBackend,r);this.overlayLayerNode.addNode(i),this.highlightShapes.set(e,i)}this.overlayLayerNode.batchDraw()}syncPaths(){this.clearPathShapes();let{currentArea:e,currentZIndex:t}=this.state;if(!(e===void 0||t===void 0)){for(let n of this.state.paths){let r=Re(this.state.mapReader,this.state.settings,n.locations,n.color,e,t),i=Ge(this.drawingBackend,r);this.overlayLayerNode.addNode(i),this.pathShapes.push(i)}this.overlayLayerNode.batchDraw()}}clearOverlayShapes(){for(let e of this.highlightShapes.values())e.destroy();this.highlightShapes.clear(),this.clearPathShapes()}clearPathShapes(){for(let e of this.pathShapes)e.destroy();this.pathShapes=[]}};function W(e){return e.replace(/&/g,`&`).replace(/</g,`<`).replace(/>/g,`>`).replace(/"/g,`"`).replace(/'/g,`'`)}function G(e,t){return t===void 0?``:` ${e}="${typeof t==`string`?W(t):t}"`}function $e(e,t){return!e||t===!1?``:` stroke-dasharray="${e.join(` `)}"`}var K=class{constructor(e,t){this.elements=[],this.visible=!0,this.x=e,this.y=t}setVisible(e){this.visible=e}isVisible(){return this.visible}destroy(){this.elements.length=0}setPosition(e,t){}getPosition(){return{x:this.x,y:this.y}}moveToTop(){}toSvg(){return!this.visible||this.elements.length===0?``:this.x===0&&this.y===0?this.elements.join(`
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),s=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},c=(n,r,a)=>(a=n==null?{}:e(i(n)),s(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n));let l=require(`konva`);l=c(l,1);var u=.6,d=.025,f=`rgb(225, 255, 225)`;function p(){return{roomSize:u,lineWidth:d,lineColor:f,backgroundColor:`#000000`,instantMapMove:!1,highlightCurrentRoom:!0,cullingEnabled:!0,cullingMode:`indexed`,cullingBounds:null,labelRenderMode:`image`,transparentLabels:!1,roomShape:`rectangle`,playerMarker:{strokeColor:`#00e5b2`,strokeAlpha:1,fillColor:`#00e5b2`,fillAlpha:0,strokeWidth:.1,sizeFactor:1.7,dash:[.05,.05],dashEnabled:!0,matchRoomShape:!1},gridEnabled:!1,gridSize:1,gridColor:`rgba(200, 200, 200, 0.15)`,gridLineWidth:.03,perfCallback:null,borders:!0,frameMode:!1,coloredMode:!1,emboss:!1,areaName:!0,fontFamily:`sans-serif`,uniformLevelSize:!1,ambientLight:{enabled:!1,color:`#ffcc44`,radius:12,intensity:.7}}}function m(e){let t,n,r,i=e.match(/(\d+)\s*,\s*(\d+)\s*,\s*(\d+)/);if(i)t=parseInt(i[1])/255,n=parseInt(i[2])/255,r=parseInt(i[3])/255;else if(e.startsWith(`#`)&&e.length>=7)t=parseInt(e.slice(1,3),16)/255,n=parseInt(e.slice(3,5),16)/255,r=parseInt(e.slice(5,7),16)/255;else return .5;return(Math.max(t,n,r)+Math.min(t,n,r))/2}function h(e,t){let n,r,i,a=e.match(/(\d+)\s*,\s*(\d+)\s*,\s*(\d+)/);if(a)n=parseInt(a[1]),r=parseInt(a[2]),i=parseInt(a[3]);else if(e.startsWith(`#`)&&e.length>=7)n=parseInt(e.slice(1,3),16),r=parseInt(e.slice(3,5),16),i=parseInt(e.slice(5,7),16);else return e;return n=Math.round(n*(1-t)),r=Math.round(r*(1-t)),i=Math.round(i*(1-t)),`rgb(${n}, ${r}, ${i})`}function g(e,t){let n,r,i,a=e.match(/(\d+)\s*,\s*(\d+)\s*,\s*(\d+)/);if(a)n=parseInt(a[1]),r=parseInt(a[2]),i=parseInt(a[3]);else if(e.startsWith(`#`)&&e.length>=7)n=parseInt(e.slice(1,3),16),r=parseInt(e.slice(3,5),16),i=parseInt(e.slice(5,7),16);else return e;return n=Math.min(255,Math.round(n+(255-n)*t)),r=Math.min(255,Math.round(r+(255-r)*t)),i=Math.min(255,Math.round(i+(255-i)*t)),`rgb(${n}, ${r}, ${i})`}function _(e,t){return`rgba(${parseInt(e.slice(1,3),16)}, ${parseInt(e.slice(3,5),16)}, ${parseInt(e.slice(5,7),16)}, ${t})`}var v=class{constructor(e){this.listeners=new Map,this.container=e}on(e,t){let n=this.listeners.get(e);n||(n=new Set,this.listeners.set(e,n)),n.add(t)}off(e,t){this.listeners.get(e)?.delete(t)}removeAllListeners(){this.listeners.clear()}emit(e,t){this.listeners.get(e)?.forEach(e=>e(t)),this.container&&this.container.dispatchEvent(new CustomEvent(e,{detail:t}))}},y=class{constructor(e,t){this.events=new v,this.highlights=new Map,this.paths=[],this.mapReader=e,this.settings=t}setArea(e,t){let n=this.mapReader.getArea(e);return!n||!n.getPlane(t)?!1:(this.currentArea=e,this.currentAreaInstance=n,this.currentZIndex=t,this.currentAreaVersion=n.getVersion(),this.events.emit(`area`,{area:n,zIndex:t}),!0)}setPosition(e,t=!0){let n=this.mapReader.getRoom(e);if(!n)return!1;let r=this.mapReader.getArea(n.area),i=r?.getVersion(),a=this.currentArea!==n.area||this.currentZIndex!==n.z||i!==void 0&&this.currentAreaVersion!==i||r!==void 0&&this.currentAreaInstance!==r;return a&&this.setArea(n.area,n.z),this.positionRoomId=e,this.events.emit(`position`,{roomId:e,center:t,areaChanged:a}),!0}updatePositionMarker(e){this.positionRoomId=e,this.events.emit(`position`,{roomId:e,center:!1,areaChanged:!1})}refreshPosition(){this.positionRoomId!==void 0&&this.events.emit(`position`,{roomId:this.positionRoomId,center:!1,areaChanged:!1})}clearPosition(){this.positionRoomId=void 0,this.events.emit(`position`,{roomId:void 0,center:!1,areaChanged:!1})}setCenterRoom(e,t){let n=this.mapReader.getRoom(e);if(!n)return!1;let r=this.currentArea!==n.area||this.currentZIndex!==n.z;return(r||this.needsAreaRedraw(n))&&this.setArea(n.area,n.z),this.centerRoomId=e,this.events.emit(`center`,{roomId:e,instant:t??r}),!0}needsAreaRedraw(e){let t=this.mapReader.getArea(e.area),n=t?.getVersion();return n!==void 0&&this.currentAreaVersion!==n||t!==void 0&&this.currentAreaInstance!==t}addHighlight(e,t){let n=this.mapReader.getRoom(e);return n?(this.highlights.set(e,{color:t,area:n.area,z:n.z}),this.events.emit(`highlight`,{roomId:e,color:t}),!0):!1}removeHighlight(e){this.highlights.has(e)&&(this.highlights.delete(e),this.events.emit(`highlight`,{roomId:e,color:void 0}))}hasHighlight(e){return this.highlights.has(e)}clearHighlights(){this.highlights.clear(),this.events.emit(`clear`,void 0)}addPath(e,t=`#66E64D`){this.paths.push({locations:e,color:t}),this.events.emit(`path`,void 0)}clearPaths(){this.paths=[],this.events.emit(`path`,void 0)}getOverlaysForArea(e){let t={...e};if(this.positionRoomId!==void 0){let e=this.mapReader.getRoom(this.positionRoomId);e&&e.area===this.currentArea&&e.z===this.currentZIndex&&(t.position={roomId:this.positionRoomId})}let n=[...e?.highlights??[]];for(let[e,t]of this.highlights)t.area===this.currentArea&&t.z===this.currentZIndex&&n.push({roomId:e,color:t.color});n.length>0&&(t.highlights=n);let r=[...e?.paths??[]];return r.push(...this.paths),r.length>0&&(t.paths=r),t}getEffectiveBounds(e,t){return this.settings.uniformLevelSize?e.getFullBounds():t.getBounds()}computeExportBounds(e,t,n,r){if(n!==void 0){let e=this.mapReader.getRoom(n);if(!e)throw Error(`Room ${n} not found`);return{x:e.x-r,y:e.y-r,w:r*2,h:r*2}}let i=this.getEffectiveBounds(e,t),a=this.settings.areaName?e.getAreaName():void 0,o=a?7:0,s=a?3.5:0,c=i.minX-s,l=i.minY-o,u=a?i.minX-3.5+a.length*2.5*.6:-1/0,d=Math.max(i.maxX,u);return{x:c-r,y:l-r,w:d-c+r*2,h:i.maxY-l+r*2}}},b=(e,t)=>({x:e,y:t}),x=72,S=200,C=120,w=new Map,T=null;function E(){return T||(T=l.default.Util.createCanvasElement(),T.width=S,T.height=S),T}function ee(e,t){let n=`${e}::${t}`,r=w.get(n);if(r!==void 0)return r;let i=E().getContext(`2d`,{willReadFrequently:!0}),a=`bold ${x}px ${t}`;i.clearRect(0,0,S,S),i.font=a,i.textBaseline=`alphabetic`,i.textAlign=`center`,i.fillStyle=`#ffffff`,i.fillText(e,S/2,C);let{data:o}=i.getImageData(0,0,S,S),s=S,c=-1;for(let e=0;e<S;e++)for(let t=0;t<S;t++)o[(e*S+t)*4+3]>16&&(e<s&&(s=e),e>c&&(c=e));if(c===-1){let e={baselineRatio:.35,konvaCorrectionRatio:0};return w.set(n,e),e}let l=(C-s-Math.max(0,c-C))/2/x,u=i.measureText(`M`),d={baselineRatio:l,konvaCorrectionRatio:((u.fontBoundingBoxAscent??u.actualBoundingBoxAscent??0)-(u.fontBoundingBoxDescent??u.actualBoundingBoxDescent??0))/2/x-l};return w.set(n,d),d}function te(e,t,n,r){let i=t.getColorValue(e.env),a=n.coloredMode?h(i,.5):n.frameMode?n.backgroundColor:i,o=n.coloredMode?g(i,.1):i;return{fillColor:a,strokeColor:r?n.frameMode||n.coloredMode?o:r:n.frameMode||n.coloredMode?o:n.lineColor,borderWidth:n.borders?n.lineWidth:0,symbolColor:n.frameMode||n.coloredMode?o:t.getSymbolColor(e.env),envColor:i}}function D(e,t){if(!t.emboss)return null;let n=t.roomSize,r=t.borders?t.lineWidth/2:0,i=t.lineWidth,a=g(e,.35),o=h(e,.45);if(t.roomShape===`circle`){let e=n/2,t=n/2,s=n/2-r,c=[];for(let n=0;n<=48;n++){let r=n/48*360*Math.PI/180;c.push(e+Math.cos(r)*s,t+Math.sin(r)*s)}let l=[];for(let n=0;n<=19;n++){let r=(200+n/19*140)*Math.PI/180;l.push(e+Math.cos(r)*s,t+Math.sin(r)*s)}return{shadow:{points:c,stroke:o,strokeWidth:i,lineCap:`round`,lineJoin:`round`},highlight:{points:l,stroke:a,strokeWidth:i,lineCap:`round`,lineJoin:`round`}}}if(t.roomShape===`roundedRectangle`){let e=(n-r*2)*.2,t=r,s=r,c=n-r,l=n-r,u=[];for(let n=0;n<=10/2;n++){let r=(135+n/(10/2)*45)*Math.PI/180;u.push(t+e+Math.cos(r)*e,l-e+Math.sin(r)*e)}for(let n=1;n<=10;n++){let r=(180+n/10*90)*Math.PI/180;u.push(t+e+Math.cos(r)*e,s+e+Math.sin(r)*e)}for(let t=1;t<=10/2;t++){let n=(270+t/(10/2)*45)*Math.PI/180;u.push(c-e+Math.cos(n)*e,s+e+Math.sin(n)*e)}let d=u.slice(),f=[];for(let t=0;t<=10/2;t++){let n=(315+t/(10/2)*45)*Math.PI/180;f.push(c-e+Math.cos(n)*e,s+e+Math.sin(n)*e)}for(let t=1;t<=10;t++){let n=t/10*90*Math.PI/180;f.push(c-e+Math.cos(n)*e,l-e+Math.sin(n)*e)}for(let n=1;n<=10/2;n++){let r=(90+n/(10/2)*45)*Math.PI/180;f.push(t+e+Math.cos(r)*e,l-e+Math.sin(r)*e)}return{highlight:{points:d,stroke:a,strokeWidth:i,lineCap:`round`,lineJoin:`round`},shadow:{points:f,stroke:o,strokeWidth:i,lineCap:`round`,lineJoin:`round`}}}return{highlight:{points:[r,n-r,r,r,n-r,r],stroke:a,strokeWidth:i},shadow:{points:[r,n-r,n-r,n-r,n-r,r],stroke:o,strokeWidth:i}}}var ne=class{constructor(e,t,n){this.mapReader=e,this.settings=t,this.backend=n}createRoomGroup(e,t){let{fillColor:n,strokeColor:r,borderWidth:i,symbolColor:a}=te(e,this.mapReader,this.settings,t?.strokeOverride),o=this.settings.roomSize,s=this.backend.createGroup(e.x-o/2,e.y-o/2),c=i/2,l=D(n,this.settings),u=l?0:i,d=this.backend.getTransform()===b,f=this.settings.coloredMode&&u>0&&d,p=e=>this.settings.roomShape===`roundedRectangle`?Math.max(0,(o-2*e)*.2):0;if(f){let e=[h(r,.5),r],t=i*2;this.settings.roomShape===`circle`?this.backend.addCircle(s,{cx:o/2,cy:o/2,radius:o/2-t,fill:n}):this.backend.addRect(s,{x:t,y:t,width:o-t*2,height:o-t*2,fill:n,cornerRadius:p(t)});for(let t=0;t<e.length;t++){let n=i/2+t*i;this.settings.roomShape===`circle`?this.backend.addCircle(s,{cx:o/2,cy:o/2,radius:o/2-n,stroke:e[t],strokeWidth:i}):this.backend.addRect(s,{x:n,y:n,width:o-n*2,height:o-n*2,stroke:e[t],strokeWidth:i,cornerRadius:p(n)})}}else this.settings.roomShape===`circle`?this.backend.addCircle(s,{cx:o/2,cy:o/2,radius:o/2-c,fill:n,stroke:u?r:void 0,strokeWidth:u}):this.backend.addRect(s,{x:c,y:c,width:o-i,height:o-i,fill:n,stroke:u?r:void 0,strokeWidth:u,cornerRadius:this.settings.roomShape===`roundedRectangle`?(o-i)*.2:0});if(l&&(this.backend.addLine(s,{points:l.shadow.points,stroke:l.shadow.stroke,strokeWidth:l.shadow.strokeWidth,lineCap:l.shadow.lineCap,lineJoin:l.shadow.lineJoin}),this.backend.addLine(s,{points:l.highlight.points,stroke:l.highlight.stroke,strokeWidth:l.highlight.strokeWidth,lineCap:l.highlight.lineCap,lineJoin:l.shadow.lineJoin})),e.roomChar){let t=o*.75,{baselineRatio:n,konvaCorrectionRatio:r}=ee(e.roomChar,this.settings.fontFamily),i=Math.max(o,e.roomChar.length*t*.8),c=(i-o)/2;this.backend.addText(s,{x:-c,y:0,text:e.roomChar,fontSize:t,fontFamily:this.settings.fontFamily,fontStyle:`bold`,fill:a,align:`center`,verticalAlign:`middle`,width:i,height:o,baselineRatio:n,konvaCorrectionRatio:r})}return s}},re=class{constructor(e,t,n){this.cachedBounds=null,this.inverseTransform=(e,t)=>({x:e,y:t}),this.layer=e,this.settings=t,this.backend=n}setInverseTransform(e){this.inverseTransform=e,this.invalidateCache()}invalidateCache(){this.cachedBounds=null}render(e){if(!this.settings.gridEnabled){this.cachedBounds!==null&&(this.layer.destroyChildren(),this.layer.batchDraw(),this.cachedBounds=null);return}let t=this.inverseTransform,{minX:n,maxX:r,minY:i,maxY:a}=e,o=t(n,i),s=t(r,i),c=t(r,a),l=t(n,a),u=Math.min(o.x,s.x,c.x,l.x),d=Math.max(o.x,s.x,c.x,l.x),f=Math.min(o.y,s.y,c.y,l.y),p=Math.max(o.y,s.y,c.y,l.y),m=this.settings.gridSize*2,h=Math.floor((u-m)/this.settings.gridSize)*this.settings.gridSize,g=Math.ceil((d+m)/this.settings.gridSize)*this.settings.gridSize,_=Math.floor((f-m)/this.settings.gridSize)*this.settings.gridSize,v=Math.ceil((p+m)/this.settings.gridSize)*this.settings.gridSize,y=this.cachedBounds;if(y&&y.left===h&&y.right===g&&y.top===_&&y.bottom===v)return;this.layer.destroyChildren();let b=this.backend.createGroup(0,0);for(let e=h;e<=g;e+=this.settings.gridSize)this.backend.addLine(b,{points:[e,_,e,v],stroke:this.settings.gridColor,strokeWidth:this.settings.gridLineWidth});for(let e=_;e<=v;e+=this.settings.gridSize)this.backend.addLine(b,{points:[h,e,g,e],stroke:this.settings.gridColor,strokeWidth:this.settings.gridLineWidth});this.layer.addNode(b),this.cachedBounds={left:h,right:g,top:_,bottom:v},this.layer.batchDraw()}},O=[`north`,`south`,`east`,`west`,`northeast`,`northwest`,`southeast`,`southwest`],ie={n:`north`,s:`south`,e:`east`,w:`west`,ne:`northeast`,nw:`northwest`,se:`southeast`,sw:`southwest`},k={north:`n`,south:`s`,east:`e`,west:`w`,northeast:`ne`,northwest:`nw`,southeast:`se`,southwest:`sw`,up:`u`,down:`d`,in:`i`,out:`o`},A={north:{x:0,y:-1},south:{x:0,y:1},east:{x:1,y:0},west:{x:-1,y:0},northeast:{x:1,y:-1},northwest:{x:-1,y:-1},southeast:{x:1,y:1},southwest:{x:-1,y:1}},j=[`north`,`south`,`east`,`west`,`northeast`,`northwest`,`southeast`,`southwest`],ae={north:`south`,south:`north`,east:`west`,west:`east`,northeast:`southwest`,northwest:`southeast`,southeast:`northwest`,southwest:`northeast`};function oe(e){return e?Object.prototype.hasOwnProperty.call(A,e):!1}function M(e,t,n,r=1){if(!oe(n))return{x:e,y:t};let i=A[n];return{x:e+i.x*r,y:t+i.y*r}}function se(e,t,n,r=1,i=0){if(!oe(n))return{x:e,y:t};let a=A[n];if(!(a.x!==0&&a.y!==0)||i<=0)return M(e,t,n,r);let o=r-i+i/Math.SQRT2;return{x:e+a.x*o,y:t+a.y*o}}function ce(e,t,n,r=1){if(!oe(n))return{x:e,y:t};let i=A[n],a=Math.atan2(i.y,i.x);return{x:e+Math.cos(a)*r,y:t+Math.sin(a)*r}}var N={OPEN_DOOR:`rgb(10, 155, 10)`,CLOSED_DOOR:`rgb(226, 205, 59)`,LOCKED_DOOR:`rgb(155, 10, 10)`,ONE_WAY_FILL:`rgb(155, 10, 10)`};function le(e){switch(e){case 1:return N.OPEN_DOOR;case 2:return N.CLOSED_DOOR;default:return N.LOCKED_DOOR}}var ue=class{constructor(e,t){this.mapReader=e,this.settings=t}getRoomEdgePoint(e,t,n,r){let i=r-(this.settings.borders?this.settings.lineWidth/2:0);return this.settings.roomShape===`circle`?ce(e,t,n,i):this.settings.roomShape===`roundedRectangle`?se(e,t,n,i,this.settings.roomSize*.2):M(e,t,n,i)}renderData(e,t){return this.renderDataWithColor(e,this.settings.lineColor,t)}renderDataWithColor(e,t,n){let r=e.aDir&&O.includes(e.aDir),i=e.bDir&&O.includes(e.bDir);if(r&&i)return this.renderTwoWayExitData(e,t,n);if(r||i){let n=r?`a`:`b`;return this.renderOneWayExitData(e,t,n)}}renderTwoWayExitData(e,t,n){let r=this.mapReader.getRoom(e.a),i=this.mapReader.getRoom(e.b);if(!r||!i||!e.aDir||!e.bDir||r.customLines[k[e.aDir]]&&i.customLines[k[e.bDir]]||r.z!==i.z&&(n!==i.z&&r.customLines[k[e.aDir]]||n!==r.z&&i.customLines[k[e.bDir]]))return;let a=this.getRoomEdgePoint(r.x,r.y,e.aDir,this.settings.roomSize/2),o=this.getRoomEdgePoint(i.x,i.y,e.bDir,this.settings.roomSize/2),s=[a.x,a.y,o.x,o.y],c=[{points:s,stroke:t,strokeWidth:this.settings.lineWidth}],l=[],u=r.doors[k[e.aDir]]??i.doors[k[e.bDir]];if(u){let e=s[0]+(s[2]-s[0])/2,t=s[1]+(s[3]-s[1])/2;l.push({x:e-this.settings.roomSize/4,y:t-this.settings.roomSize/4,width:this.settings.roomSize/2,height:this.settings.roomSize/2,stroke:le(u),strokeWidth:this.settings.lineWidth})}let d=Math.min(s[0],s[2]),f=Math.max(s[0],s[2]),p=Math.min(s[1],s[3]),m=Math.max(s[1],s[3]),h=r.z===i.z?void 0:r.z===n?i.id:r.id;return{lines:c,arrows:[],doors:l,bounds:{x:d,y:p,width:f-d,height:m-p},targetRoomId:h}}renderOneWayExitData(e,t,n){let r=n===`a`||!n&&e.aDir,i=r?this.mapReader.getRoom(e.a):this.mapReader.getRoom(e.b),a=r?this.mapReader.getRoom(e.b):this.mapReader.getRoom(e.a),o=r?e.aDir:e.bDir;if(!o||!i||!a||!O.includes(o)||i.customLines[k[o]||o])return;if(i.area!=a.area&&o){let e=this.mapReader.getColorValue(a.env),t=this.getRoomEdgePoint(i.x,i.y,o,this.settings.roomSize/2),n=M(i.x,i.y,o,this.settings.roomSize*1.5),r=e;return{lines:[],arrows:[{points:[t.x,t.y,n.x,n.y],pointerLength:.3,pointerWidth:.3,strokeWidth:this.settings.lineWidth*1.4,stroke:r,fill:r}],doors:[],bounds:{x:Math.min(t.x,n.x),y:Math.min(t.y,n.y),width:Math.abs(n.x-t.x),height:Math.abs(n.y-t.y)},targetRoomId:a.id}}let s=a.area!==i.area||a.z!==i.z,c={x:a.x,y:a.y};s&&(c=M(i.x,i.y,o,this.settings.roomSize/2));let l=M(i.x,i.y,o,.3),u=l.x-(l.x-c.x)/2,d=l.y-(l.y-c.y)/2,f=this.getRoomEdgePoint(i.x,i.y,o,this.settings.roomSize/2),p=[f.x,f.y,c.x,c.y],m=[f.x,c.x,u],h=[f.y,c.y,d],g=Math.min(...m),_=Math.max(...m),v=Math.min(...h),y=Math.max(...h);return{lines:[{points:p,stroke:t,strokeWidth:this.settings.lineWidth,dash:[.1,.05]}],arrows:[{points:[p[0],p[1],u,d],pointerLength:.5,pointerWidth:.35,strokeWidth:this.settings.lineWidth*1.4,stroke:t,fill:N.ONE_WAY_FILL,dash:[.1,.05]}],doors:[],bounds:{x:g,y:v,width:_-g,height:y-v},...s?{targetRoomId:a.id}:{}}}getSpecialExitAreaTargets(e){let t=[];for(let[n,r]of Object.entries(e.customLines)){let i=e.specialExits[n];if(i===void 0){let t=ie[n];t&&(i=e.exits[t]??e.specialExits[t])}if(i===void 0)continue;let a=this.mapReader.getRoom(i);if(!a||a.area===e.area&&a.z===e.z)continue;let o=[e.x,e.y];r.points.reduce((e,t)=>(e.push(t.x,-t.y),e),o);let s=1/0,c=1/0,l=-1/0,u=-1/0;for(let e=0;e<o.length;e+=2)s=Math.min(s,o[e]),l=Math.max(l,o[e]),c=Math.min(c,o[e+1]),u=Math.max(u,o[e+1]);t.push({bounds:{x:s,y:c,width:l-s,height:u-c},targetRoomId:i})}return t}},de={1:`north`,2:`northeast`,3:`northwest`,4:`east`,5:`west`,6:`south`,7:`southeast`,8:`southwest`,9:`up`,10:`down`,11:`in`,12:`out`};function fe(e,t,n,r,i){return e.roomShape===`circle`?ce(t,n,r,i):e.roomShape===`roundedRectangle`?se(t,n,r,i,e.roomSize*.2):M(t,n,r,i)}function pe(e,t,n){let r=[];for(let i of e.stubs){let a=de[i];if(!a)continue;let o=fe(t,e.x,e.y,a,t.roomSize/2),s=M(e.x,e.y,a,t.roomSize/2+.5);r.push({x1:o.x,y1:o.y,x2:s.x,y2:s.y,stroke:n??t.lineColor,strokeWidth:t.lineWidth})}return r}var me={1:`rgb(10, 155, 10)`,2:`rgb(226, 205, 59)`,3:`rgb(155, 10, 10)`};function he(e,t,n){let r=[];for(let[i,a]of Object.entries(e.customLines)){let o=[e.x,e.y];for(let e of a.points)o.push(e.x,-e.y);let s=n??`rgb(${a.attributes.color.r}, ${a.attributes.color.g}, ${a.attributes.color.b})`,c;a.attributes.style===`dot line`?c=[.05,.05]:a.attributes.style===`dash line`&&(c=[.4,.2]);let l={points:o,stroke:s,strokeWidth:t.lineWidth,dash:c},u;if(a.attributes.arrow&&o.length>=4){let e=o.length-2,n=o[e],r=o[e+1],i=o[e-2],a=o[e-1],c=Math.atan2(r-a,n-i),l=.3,d=.1;u={tipX:n,tipY:r,x1:n-l*Math.cos(c-Math.atan2(d,l)),y1:r-l*Math.sin(c-Math.atan2(d,l)),x2:n-l*Math.cos(c+Math.atan2(d,l)),y2:r-l*Math.sin(c+Math.atan2(d,l)),fill:s,stroke:s,strokeWidth:t.lineWidth}}let d,f=e.doors[i];if(f&&o.length>=4){let e=o[0]+(o[2]-o[0])/2,n=o[1]+(o[3]-o[1])/2,r=t.roomSize/2;d={x:e-r/2,y:n-r/2,width:r,height:r,stroke:me[f]??me[3],strokeWidth:t.lineWidth}}r.push({line:l,arrow:u,door:d})}return r}var ge=[`up`,`down`,`in`,`out`];function P(e,t,n,r){let i=r*Math.PI/180,a=[];for(let r=0;r<3;r++){let o=2*Math.PI*r/3-Math.PI/2,s=Math.cos(o)*n*1.4,c=Math.sin(o)*n*.8,l=s*Math.cos(i)-c*Math.sin(i),u=s*Math.sin(i)+c*Math.cos(i);a.push(e+l,t+u)}return a}function _e(e,t,n){return{symbolColor:n.frameMode||n.coloredMode?t.getColorValue(e.env):t.getSymbolColor(e.env),symbolFill:n.frameMode||n.coloredMode?t.getColorValue(e.env):t.getSymbolColor(e.env,.6)}}var ve={1:`rgb(10, 155, 10)`,2:`rgb(226, 205, 59)`,3:`rgb(155, 10, 10)`};function ye(e,t,n){let r=[],i=n.roomSize,a=i/5,{symbolColor:o,symbolFill:s}=_e(e,t,n);for(let t of ge){if(!e.exits[t])continue;let c=e.doors[t],l=c===void 0?o:ve[c]??ve[3];switch(t){case`up`:{let t=M(e.x,e.y,`south`,i/4);r.push({cx:t.x,cy:t.y,vertices:P(t.x,t.y,a,0),fill:s,stroke:l,strokeWidth:n.lineWidth});break}case`down`:{let t=M(e.x,e.y,`north`,i/4);r.push({cx:t.x,cy:t.y,vertices:P(t.x,t.y,a,180),fill:s,stroke:l,strokeWidth:n.lineWidth});break}case`in`:{let t=M(e.x,e.y,`west`,i/4),o=M(e.x,e.y,`east`,i/4);r.push({cx:t.x,cy:t.y,vertices:P(t.x,t.y,a,90),fill:s,stroke:l,strokeWidth:n.lineWidth}),r.push({cx:o.x,cy:o.y,vertices:P(o.x,o.y,a,-90),fill:s,stroke:l,strokeWidth:n.lineWidth});break}case`out`:{let t=M(e.x,e.y,`west`,i/4),o=M(e.x,e.y,`east`,i/4);r.push({cx:t.x,cy:t.y,vertices:P(t.x,t.y,a,-90),fill:s,stroke:l,strokeWidth:n.lineWidth}),r.push({cx:o.x,cy:o.y,vertices:P(o.x,o.y,a,90),fill:s,stroke:l,strokeWidth:n.lineWidth});break}}}return{triangles:r}}function be(e){let t=(e?.alpha??255)/255,n=e=>Math.min(255,Math.max(0,e??0));return`rgba(${n(e?.r)}, ${n(e?.g)}, ${n(e?.b)}, ${t})`}var F=class{constructor(e,t,n,r){this.mapReader=e,this.settings=t,this.backend=n,this.gridLayer=r.gridLayer,this.linkLayer=r.linkLayer,this.roomLayer=r.roomLayer,this.roomShapeRenderer=new ne(e,t,n),this.gridRenderer=new re(r.gridLayer,t,n),this.exitRenderer=new ue(e,t)}buildScene(e,t,n,r){this.gridLayer.destroyChildren(),this.gridRenderer.invalidateCache(),this.linkLayer.destroyChildren(),this.roomLayer.destroyChildren(),r&&this.gridRenderer.render(r),this.renderLabels(t.getLabels());let i=this.renderLinkExits(e.getLinkExits(n),n),a=this.renderRooms(t.getRooms()??[]);return this.renderAreaName(e,t),{roomNodes:a.roomNodes,standaloneExitNodes:i.standaloneExitNodes,areaExitHitZones:[...i.areaExitHitZones,...a.areaExitHitZones]}}getEffectiveBounds(e,t){return this.settings.uniformLevelSize?e.getFullBounds():t.getBounds()}renderRooms(e){let t=new Map,n=[],r=this.settings.roomSize,i=this.backend.getExitDepthOffset();return e.forEach(e=>{let a=this.roomShapeRenderer.createRoomGroup(e);for(let t of he(e,this.settings)){let e=this.backend.createGroup(i.x,i.y);if(this.backend.addLine(e,{points:t.line.points,stroke:t.line.stroke,strokeWidth:t.line.strokeWidth,dash:t.line.dash}),t.arrow){let n=t.arrow;this.backend.addPolygon(e,{vertices:[n.tipX,n.tipY,n.x1,n.y1,n.x2,n.y2],fill:n.fill,stroke:n.stroke,strokeWidth:n.strokeWidth})}if(t.door){let n=t.door;this.backend.addRect(e,{x:n.x,y:n.y,width:n.width,height:n.height,stroke:n.stroke,strokeWidth:n.strokeWidth})}this.linkLayer.addNode(e)}this.exitRenderer.getSpecialExitAreaTargets(e).forEach(e=>{n.push(e)});for(let t of pe(e,this.settings)){let e=this.backend.createGroup(i.x,i.y);this.backend.addLine(e,{points:[t.x1,t.y1,t.x2,t.y2],stroke:t.stroke,strokeWidth:t.strokeWidth}),this.linkLayer.addNode(e)}let o=e.x-r/2,s=e.y-r/2,{triangles:c}=ye(e,this.mapReader,this.settings);for(let e of c){let t=[];for(let n=0;n<e.vertices.length;n+=2)t.push(e.vertices[n]-o,e.vertices[n+1]-s);this.backend.addPolygon(a,{vertices:t,fill:e.fill,stroke:e.stroke,strokeWidth:e.strokeWidth})}this.roomLayer.addNode(a),t.set(e.id,{room:e,group:a})}),{roomNodes:t,areaExitHitZones:n}}renderLinkExits(e,t){let n=[],r=[];return e.forEach(e=>{let i=this.exitRenderer.renderData(e,t);if(!i)return;let a=this.renderExitData(i);this.linkLayer.addNode(a),n.push({group:a,bounds:i.bounds,targetRoomId:i.targetRoomId}),i.targetRoomId!==void 0&&r.push({bounds:i.bounds,targetRoomId:i.targetRoomId})}),{standaloneExitNodes:n,areaExitHitZones:r}}renderExitData(e){let t=this.backend.getExitDepthOffset(),n=this.backend.createGroup(t.x,t.y);for(let t of e.lines)this.backend.addLine(n,{points:t.points,stroke:t.stroke,strokeWidth:t.strokeWidth,dash:t.dash});for(let t of e.arrows)this.renderArrow(n,t);for(let t of e.doors)this.backend.addRect(n,{x:t.x,y:t.y,width:t.width,height:t.height,stroke:t.stroke,strokeWidth:t.strokeWidth});return n}renderArrow(e,t){this.backend.addLine(e,{points:t.points,stroke:t.stroke,strokeWidth:t.strokeWidth,dash:t.dash});let n=t.points.length-2,r=t.points[n],i=t.points[n+1],a=t.points[n-2],o=t.points[n-1],s=Math.atan2(i-o,r-a),c=t.pointerLength,l=t.pointerWidth/2,u=r-c*Math.cos(s-Math.atan2(l,c)),d=i-c*Math.sin(s-Math.atan2(l,c)),f=r-c*Math.cos(s+Math.atan2(l,c)),p=i-c*Math.sin(s+Math.atan2(l,c));this.backend.addPolygon(e,{vertices:[r,i,u,d,f,p],fill:t.fill,stroke:t.stroke,strokeWidth:t.strokeWidth})}renderLabels(e){this.settings.labelRenderMode!==`none`&&e.forEach(e=>{let t=e.X,n=-e.Y;if(this.settings.labelRenderMode===`image`&&e.pixMap){let r=this.backend.createGroup(0,0);this.backend.addImage(r,{x:t,y:n,width:e.Width,height:e.Height,src:`data:image/png;base64,${e.pixMap}`}),this.linkLayer.addNode(r);return}let r=this.backend.createGroup(0,0);if((e.BgColor?.alpha??0)>0&&!this.settings.transparentLabels&&this.backend.addRect(r,{x:t,y:n,width:e.Width,height:e.Height,fill:be(e.BgColor)}),e.Text){let i=Math.min(.75,e.Width/Math.max(e.Text.length/2,1)),a=Math.max(.1,Math.min(i,Math.max(e.Height*.9,.1)));this.backend.addText(r,{x:t,y:n,width:e.Width,height:e.Height,text:e.Text,fontSize:a,fill:be(e.FgColor),align:`center`,verticalAlign:`middle`})}this.linkLayer.addNode(r)})}renderAreaName(e,t){if(!this.settings.areaName)return;let n=e.getAreaName();if(!n)return;let r=this.getEffectiveBounds(e,t),i=this.backend.createGroup(0,0);this.backend.addText(i,{x:r.minX-3.5,y:r.minY-4.5,text:n,fontSize:2.5,fontFamily:this.settings.fontFamily,fill:`white`}),this.roomLayer.addNode(i)}},xe=75;function Se(e){return e<.5?2*e*e:-1+(4-2*e)*e}var Ce=class{constructor(e,t){this.zoom=1,this.minZoom=.05,this.position={x:0,y:0},this.centerOnResize=!0,this.dragging=!1,this.dragStart={x:0,y:0},this.positionAtDragStart={x:0,y:0},this.width=e,this.height=t}getScale(){return xe*this.zoom}setZoom(e){let t=Math.max(this.minZoom,Math.min(5,e));return this.zoom===t?!1:(this.zoom=t,this.notify(),!0)}zoomToCenter(e){let t=Math.max(this.minZoom,Math.min(5,e));if(this.zoom===t)return!1;let n=this.getScale(),r=this.width/2,i=this.height/2,a={x:(r-this.position.x)/n,y:(i-this.position.y)/n};this.zoom=t;let o=this.getScale();return this.position={x:r-a.x*o,y:i-a.y*o},this.notify(),!0}zoomToPoint(e,t,n){let r=this.getScale(),i={x:(t-this.position.x)/r,y:(n-this.position.y)/r},a=Math.max(this.minZoom,Math.min(5,e));if(this.zoom===a)return!1;this.zoom=a;let o=this.getScale();return this.position={x:t-i.x*o,y:n-i.y*o},this.notify(),!0}getViewportBounds(){let e=this.getScale();return{minX:(0-this.position.x)/e,maxX:(this.width-this.position.x)/e,minY:(0-this.position.y)/e,maxY:(this.height-this.position.y)/e}}clientToMapPoint(e,t,n){let r=e-(n?.left??0),i=t-(n?.top??0),a=this.getScale();return a?{x:(r-this.position.x)/a,y:(i-this.position.y)/a}:null}panToMapPoint(e,t){let n=this.getScale();this.position={x:this.width/2-e*n,y:this.height/2-t*n},this.notify()}panToMapPointAnimated(e,t,n){if(n){this.panToMapPoint(e,t);return}let r={...this.position},i=this.getScale(),a={x:this.width/2-e*i,y:this.height/2-t*i};this.animate(200,e=>{this.position={x:r.x+(a.x-r.x)*e,y:r.y+(a.y-r.y)*e}})}fitToMapBounds(e,t,n,r,i){let a=t-e,o=r-n;if(a<=0||o<=0)return;let s=i?.top??0,c=i?.right??0,l=i?.bottom??0,u=i?.left??0,d=Math.max(1,this.width-u-c),f=Math.max(1,this.height-s-l),p=d/((a+4)*xe),m=f/((o+4)*xe);this.zoom=Math.max(.05,Math.min(5,Math.min(p,m))),this.minZoom=this.zoom;let h=this.getScale(),g=(e+t)/2,_=(n+r)/2;this.position={x:u+d/2-g*h,y:s+f/2-_*h},this.notify()}setSize(e,t){this.width=e,this.height=t,this.notify()}startDrag(e,t){this.cancelAnimation(),this.dragging=!0,this.dragStart={x:e,y:t},this.positionAtDragStart={...this.position}}updateDrag(e,t){this.dragging&&(this.position={x:this.positionAtDragStart.x+(e-this.dragStart.x),y:this.positionAtDragStart.y+(t-this.dragStart.y)},this.notify())}endDrag(){this.dragging=!1}isDragging(){return this.dragging}animate(e,t){this.cancelAnimation();let n=performance.now(),r=typeof requestAnimationFrame<`u`?requestAnimationFrame:e=>setTimeout(()=>e(performance.now()),16),i=a=>{let o=a-n,s=Math.min(o/e,1);t(Se(s)),this.notify(),s<1?this.animationId=r(i):this.animationId=void 0};this.animationId=r(i)}cancelAnimation(){this.animationId!==void 0&&((typeof cancelAnimationFrame<`u`?cancelAnimationFrame:e=>clearTimeout(e))(this.animationId),this.animationId=void 0)}isAnimating(){return this.animationId!==void 0}notify(){this.onChange?.()}},we=class{constructor(e=60){this.samples=[],this.lastCullingTime=0,this.callback=null,this.windowSize=e}setCallback(e){e!==this.callback&&(this.callback=e,this.samples=[])}record(e){this.callback&&(this.samples.push(e),this.samples.length>=this.windowSize&&this.flush())}computeFps(){let e=performance.now(),t=e-this.lastCullingTime;return this.lastCullingTime=e,t>0?1e3/t:0}flush(){let e=this.samples.length;if(e===0)return;let t={cullingMs:0,gridMs:0,visibleRooms:0,totalRooms:0,visibleExits:0,fps:0};for(let e of this.samples)t.cullingMs+=e.cullingMs,t.gridMs+=e.gridMs,t.visibleRooms+=e.visibleRooms,t.totalRooms+=e.totalRooms,t.visibleExits+=e.visibleExits,t.fps+=e.fps;t.cullingMs/=e,t.gridMs/=e,t.visibleRooms=Math.round(t.visibleRooms/e),t.totalRooms=Math.round(t.totalRooms/e),t.visibleExits=Math.round(t.visibleExits/e),t.fps=Math.round(t.fps),this.callback(t),this.samples=[]}},Te=class{constructor(e,t,n,r){this.roomNodes=new Map,this.standaloneExitNodes=[],this.spatialBucketSize=5,this.roomSpatialIndex=new Map,this.exitSpatialIndex=new Map,this.visibleRooms=new Set,this.visibleStandaloneExitNodes=new Set,this.bufferRoomSet=new Set,this.bufferExitSet=new Set,this.bufferRoomCandidates=new Set,this.bufferExitCandidates=new Set,this.cullingScheduled=!1,this.perfMonitor=new we,this.coordinateTransform=(e,t)=>({x:e,y:t}),this.stageInfo=e,this.roomLayer=t,this.linkLayer=n,this.settings=r}setCoordinateTransform(e){this.coordinateTransform=e}transformPoint(e,t){return this.coordinateTransform(e,t)}transformBounds(e){let t=this.coordinateTransform,n=t(e.x,e.y),r=t(e.x+e.width,e.y),i=t(e.x+e.width,e.y+e.height),a=t(e.x,e.y+e.height),o=Math.min(n.x,r.x,i.x,a.x),s=Math.max(n.x,r.x,i.x,a.x),c=Math.min(n.y,r.y,i.y,a.y),l=Math.max(n.y,r.y,i.y,a.y);return{x:o,y:c,width:s-o,height:l-c}}computeBucketSize(){this.spatialBucketSize=Math.max(this.settings.roomSize*10,5)}clear(){this.roomNodes.clear(),this.standaloneExitNodes=[],this.standaloneExitBoundsRoomSize=void 0,this.roomSpatialIndex.clear(),this.exitSpatialIndex.clear(),this.visibleRooms.clear(),this.visibleStandaloneExitNodes.clear()}getBucketKey(e,t){return e*1000003+t}forEachBucket(e,t,n,r,i){let a=this.spatialBucketSize,o=Math.min(e,n),s=Math.max(e,n),c=Math.min(t,r),l=Math.max(t,r),u=Math.floor(o/a),d=Math.floor(s/a),f=Math.floor(c/a),p=Math.floor(l/a);for(let e=u;e<=d;e++)for(let t=f;t<=p;t++)i(this.getBucketKey(e,t))}addRoomToSpatialIndex(e){let t=this.settings.roomSize/2,n=this.transformBounds({x:e.room.x-t,y:e.room.y-t,width:this.settings.roomSize,height:this.settings.roomSize});this.forEachBucket(n.x,n.y,n.x+n.width,n.y+n.height,t=>{let n=this.roomSpatialIndex.get(t);n||(n=new Set,this.roomSpatialIndex.set(t,n)),n.add(e)})}addStandaloneExitToSpatialIndex(e){let t=this.transformBounds(e.bounds);this.forEachBucket(t.x,t.y,t.x+t.width,t.y+t.height,t=>{let n=this.exitSpatialIndex.get(t);n||(n=new Set,this.exitSpatialIndex.set(t,n)),n.add(e)})}findRoomAtMapPoint(e,t){let n=this.settings.roomSize,r=this.getBucketKey(Math.floor(e/this.spatialBucketSize),Math.floor(t/this.spatialBucketSize)),i=this.roomSpatialIndex.get(r);if(!i)return null;let a=null,o=1/0;for(let r of i){let i=this.transformPoint(r.room.x,r.room.y),s=e-i.x,c=t-i.y;if(s>=-n&&s<=n&&c>=-n&&c<=n){let e=s*s+c*c;e<o&&(o=e,a=r.room)}}return a}markExitBoundsStale(){this.standaloneExitBoundsRoomSize=void 0}setExitBoundsRoomSize(){this.standaloneExitBoundsRoomSize=this.settings.roomSize}collectRoomCandidates(e,t,n,r){let i=this.bufferRoomCandidates;return i.clear(),this.forEachBucket(e,t,n,r,e=>{this.roomSpatialIndex.get(e)?.forEach(e=>i.add(e))}),i}collectStandaloneExitCandidates(e,t,n,r){let i=this.bufferExitCandidates;return i.clear(),this.forEachBucket(e,t,n,r,e=>{this.exitSpatialIndex.get(e)?.forEach(e=>i.add(e))}),i}refreshStandaloneExitBoundsIfNeeded(){this.standaloneExitBoundsRoomSize!==this.settings.roomSize&&(this.exitSpatialIndex.clear(),this.standaloneExitNodes.forEach(e=>this.addStandaloneExitToSpatialIndex(e)),this.standaloneExitBoundsRoomSize=this.settings.roomSize)}scheduleCulling(){if(this.cullingScheduled)return;this.cullingScheduled=!0;let e=()=>{this.cullingScheduled=!1,this.updateCulling()};typeof requestAnimationFrame<`u`?requestAnimationFrame(e):e()}updateCulling(){if(this.roomNodes.size===0&&this.standaloneExitNodes.length===0)return;let e=this.stageInfo.scaleX();if(!e)return;this.perfMonitor.setCallback(this.settings.perfCallback);let t=this.settings.perfCallback?performance.now():0,n=this.stageInfo.position(),r=this.settings.roomSize/2,i=this.settings.cullingBounds,a=i?i.x:0,o=i?i.x+i.width:this.stageInfo.width(),s=i?i.y:0,c=i?i.y+i.height:this.stageInfo.height(),l=(Math.min(a,o)-n.x)/e,u=(Math.max(a,o)-n.x)/e,d=(Math.min(s,c)-n.y)/e,f=(Math.max(s,c)-n.y)/e,p=!1,m=!1,h=this.settings.cullingEnabled?this.settings.cullingMode??`indexed`:`none`,g=l-r,_=u+r,v=d-r,y=f+r;if(this.refreshStandaloneExitBoundsIfNeeded(),h===`none`){this.roomNodes.forEach(e=>{e.group.isVisible()||(e.group.setVisible(!0),p=!0)}),this.standaloneExitNodes.forEach(e=>{e.group.isVisible()||(e.group.setVisible(!0),m=!0)}),p&&this.roomLayer.batchDraw(),m&&this.linkLayer.batchDraw(),this.visibleRooms.clear(),this.roomNodes.forEach(e=>this.visibleRooms.add(e)),this.visibleStandaloneExitNodes.clear(),this.standaloneExitNodes.forEach(e=>this.visibleStandaloneExitNodes.add(e));return}if(h===`basic`){let e=this.bufferRoomSet;e.clear();let t=this.settings.roomSize;this.roomNodes.forEach(n=>{let i=this.transformBounds({x:n.room.x-r,y:n.room.y-r,width:t,height:t}),a=i.x+i.width>=l&&i.x<=u&&i.y+i.height>=d&&i.y<=f;n.group.isVisible()!==a&&(n.group.setVisible(a),p=!0),a&&e.add(n)}),m=this.cullExits(l,u,d,f).changed,this.bufferRoomSet=this.visibleRooms,this.visibleRooms=e,p&&this.roomLayer.batchDraw(),m&&this.linkLayer.batchDraw();return}let b=this.collectRoomCandidates(g,v,_,y),x=this.bufferRoomSet;x.clear();let S=this.settings.roomSize;if(b.forEach(e=>{let t=this.transformBounds({x:e.room.x-r,y:e.room.y-r,width:S,height:S}),n=t.x+t.width>=l&&t.x<=u&&t.y+t.height>=d&&t.y<=f;e.group.isVisible()!==n&&(e.group.setVisible(n),p=!0),n&&x.add(e)}),this.visibleRooms.forEach(e=>{!b.has(e)&&e.group.isVisible()&&(e.group.setVisible(!1),p=!0)}),this.bufferRoomSet=this.visibleRooms,this.visibleRooms=x,m=this.cullExits(l,u,d,f,!0).changed,p&&this.roomLayer.batchDraw(),m&&this.linkLayer.batchDraw(),this.settings.perfCallback){let e=performance.now()-t;this.perfMonitor.record({cullingMs:e,gridMs:0,visibleRooms:this.visibleRooms.size,totalRooms:this.roomNodes.size,visibleExits:this.visibleStandaloneExitNodes.size,fps:this.perfMonitor.computeFps()})}}cullExits(e,t,n,r,i=!1){let a=i?this.collectStandaloneExitCandidates(e-this.settings.roomSize,n-this.settings.roomSize,t+this.settings.roomSize,r+this.settings.roomSize):this.standaloneExitNodes,o=this.bufferExitSet;o.clear();let s=!1;return a[Symbol.iterator],a.forEach(i=>{let a=this.transformBounds(i.bounds),c=a.x+a.width>=e&&a.x<=t&&a.y+a.height>=n&&a.y<=r;i.group.isVisible()!==c&&(i.group.setVisible(c),s=!0),c&&o.add(i)}),this.visibleStandaloneExitNodes.forEach(e=>{!o.has(e)&&e.group.isVisible()&&(e.group.setVisible(!1),s=!0)}),this.bufferExitSet=this.visibleStandaloneExitNodes,this.visibleStandaloneExitNodes=o,{changed:s}}},Ee=class{constructor(e,t,n,r,i,a){this.cleanupFns=[],this.destroyed=!1,this.container=e,this.viewport=t,this.state=n,this.settings=r,this.hitTest=i,this.events=a,this.initViewportEvents(),this.initMapEvents()}destroy(){if(!this.destroyed){this.destroyed=!0;for(let e of this.cleanupFns)e();this.cleanupFns.length=0}}listen(e,t,n,r){e.addEventListener(t,n,r),this.cleanupFns.push(()=>e.removeEventListener(t,n,r))}initViewportEvents(){let e=this.container,t=this.viewport,n=1.1,r=()=>{if(t.setSize(e.clientWidth,e.clientHeight),t.centerOnResize&&this.state.positionRoomId){let e=this.state.mapReader.getRoom(this.state.positionRoomId);e&&t.panToMapPoint(e.x,e.y)}};typeof window<`u`&&this.listen(window,`resize`,r),this.listen(e,`resize`,r);let i=!1,a;this.listen(e,`pointerdown`,n=>{if(n.button!==0||n.pointerType===`touch`)return;i=!0,a=n.pointerId,e.setPointerCapture(n.pointerId);let r=e.getBoundingClientRect();t.startDrag(n.clientX-r.left,n.clientY-r.top)}),this.listen(e,`pointermove`,n=>{if(!i||n.pointerId!==a)return;let r=e.getBoundingClientRect();t.updateDrag(n.clientX-r.left,n.clientY-r.top),this.events.emit(`pan`,t.getViewportBounds())}),this.listen(e,`pointerup`,e=>{e.pointerId===a&&(i=!1,a=void 0,t.endDrag(),this.events.emit(`pan`,t.getViewportBounds()))}),this.listen(e,`pointercancel`,e=>{e.pointerId===a&&(i=!1,a=void 0,t.endDrag())});let o;this.listen(e,`touchstart`,n=>{if(n.touches.length===1){let r=n.touches[0];o=r.identifier;let i=e.getBoundingClientRect();t.startDrag(r.clientX-i.left,r.clientY-i.top)}else t.isDragging()&&t.endDrag(),o=void 0},{passive:!0}),this.listen(e,`touchmove`,n=>{let r=n.touches;if(r.length>=2){n.preventDefault(),t.isDragging()&&t.endDrag(),o=void 0;let i=e.getBoundingClientRect(),a={x:r[0].clientX-i.left,y:r[0].clientY-i.top},s={x:r[1].clientX-i.left,y:r[1].clientY-i.top};this.handlePinch(a,s);return}if(r.length===1&&o===r[0].identifier){let n=r[0],i=e.getBoundingClientRect();t.updateDrag(n.clientX-i.left,n.clientY-i.top),this.events.emit(`pan`,t.getViewportBounds())}}),this.listen(e,`touchend`,n=>{if(this.lastPinchDistance=void 0,n.touches.length===0)t.isDragging()&&(t.endDrag(),this.events.emit(`pan`,t.getViewportBounds())),o=void 0;else if(n.touches.length===1){let r=n.touches[0];o=r.identifier;let i=e.getBoundingClientRect();t.startDrag(r.clientX-i.left,r.clientY-i.top)}},{passive:!0}),this.listen(e,`touchcancel`,()=>{this.lastPinchDistance=void 0,t.isDragging()&&t.endDrag(),o=void 0},{passive:!0}),this.listen(e,`wheel`,r=>{r.preventDefault();let i=e.getBoundingClientRect(),a=r.clientX-i.left,o=r.clientY-i.top,s=r.deltaY>0?-1:1;r.ctrlKey&&(s=-s);let c=s>0?t.zoom*n:t.zoom/n;t.zoomToPoint(c,a,o)&&(this.events.emit(`zoom`,{zoom:t.zoom}),this.events.emit(`pan`,t.getViewportBounds()))},{passive:!1})}handlePinch(e,t){let n=Math.hypot(e.x-t.x,e.y-t.y);if(this.lastPinchDistance===void 0||this.lastPinchDistance===0||n===0){this.lastPinchDistance=n;return}let r=(e.x+t.x)/2,i=(e.y+t.y)/2,a=this.viewport.zoom*(n/this.lastPinchDistance);this.viewport.zoomToPoint(a,r,i)&&(this.events.emit(`zoom`,{zoom:this.viewport.zoom}),this.events.emit(`pan`,this.viewport.getViewportBounds())),this.lastPinchDistance=n}initMapEvents(){let e=this.container,t=null;this.listen(e,`mousemove`,n=>{let r=this.findRoomAtClientPoint(n.clientX,n.clientY);if(r!==t&&(t=r,r)){e.style.cursor=`pointer`;return}if(!t){let t=this.findAreaExitAtClientPoint(n.clientX,n.clientY)!==null;e.style.cursor=t?`pointer`:`auto`}}),this.listen(e,`mouseleave`,()=>{t=null,e.style.cursor=`auto`});let n=null;this.listen(e,`mousedown`,e=>{e.button===0&&(n={x:e.clientX,y:e.clientY})}),this.listen(e,`mouseup`,e=>{if(e.button!==0||!n)return;let t=e.clientX-n.x,r=e.clientY-n.y;if(n=null,t*t+r*r>25)return;let i=this.findRoomAtClientPoint(e.clientX,e.clientY);if(i){this.emitRoomClickEvent(i.id,e.clientX,e.clientY);return}let a=this.findAreaExitAtClientPoint(e.clientX,e.clientY);if(a){this.emitAreaExitClickEvent(a.targetRoomId,e.clientX,e.clientY);return}this.emitMapClickEvent()}),this.listen(e,`contextmenu`,e=>{let t=this.findRoomAtClientPoint(e.clientX,e.clientY);t&&(e.preventDefault(),this.emitRoomContextEvent(t.id,e.clientX,e.clientY))});let r,i,a=()=>{r!==void 0&&(window.clearTimeout(r),r=void 0),i=void 0};this.listen(e,`touchstart`,e=>{if(a(),e.touches.length>1)return;let t=e.touches[0];t&&this.findRoomAtClientPoint(t.clientX,t.clientY)&&(i={clientX:t.clientX,clientY:t.clientY},r=window.setTimeout(()=>{if(i){let e=this.findRoomAtClientPoint(i.clientX,i.clientY);e&&this.emitRoomContextEvent(e.id,i.clientX,i.clientY)}a()},500))},{passive:!0}),this.listen(e,`touchend`,()=>a(),{passive:!0}),this.listen(e,`touchcancel`,()=>a(),{passive:!0}),this.listen(e,`touchmove`,e=>{if(!i)return;let t=e.touches[0];if(!t){a();return}let n=t.clientX-i.clientX,r=t.clientY-i.clientY;n*n+r*r>100&&a()},{passive:!0})}findRoomAtClientPoint(e,t){let n=this.hitTest.clientToMapPoint(e,t);return n?this.hitTest.findRoomAtPoint(n.x,n.y):null}findAreaExitAtClientPoint(e,t){let n=this.hitTest.clientToMapPoint(e,t);if(!n)return null;let r=this.settings.roomSize*.5;for(let e of this.hitTest.getAreaExitHitZones()){let t=e.bounds;if(n.x>=t.x-r&&n.x<=t.x+t.width+r&&n.y>=t.y-r&&n.y<=t.y+t.height+r)return e}return null}emitRoomClickEvent(e,t,n){let r=this.container.getBoundingClientRect();this.events.emit(`roomclick`,{roomId:e,position:{x:t-r.left,y:n-r.top}})}emitRoomContextEvent(e,t,n){let r=this.container.getBoundingClientRect();this.events.emit(`roomcontextmenu`,{roomId:e,position:{x:t-r.left,y:n-r.top}})}emitAreaExitClickEvent(e,t,n){let r=this.container.getBoundingClientRect();this.events.emit(`areaexitclick`,{targetRoomId:e,position:{x:t-r.left,y:n-r.top}})}emitMapClickEvent(){this.events.emit(`mapclick`,void 0)}},I=class{constructor(e){this.konvaGroup=e}setVisible(e){this.konvaGroup.visible(e)}isVisible(){return this.konvaGroup.visible()}destroy(){this.konvaGroup.destroy()}setPosition(e,t){this.konvaGroup.position({x:e,y:t})}getPosition(){return this.konvaGroup.position()}moveToTop(){this.konvaGroup.moveToTop()}},L=class{constructor(e){this.konvaLayer=e}addNode(e){e instanceof I&&this.konvaLayer.add(e.konvaGroup)}destroyChildren(){this.konvaLayer.destroyChildren()}batchDraw(){this.konvaLayer.batchDraw()}},De=class{createGroup(e,t){return new I(new l.default.Group({x:e,y:t,listening:!1}))}addRect(e,t){e instanceof I&&e.konvaGroup.add(new l.default.Rect({x:t.x,y:t.y,width:t.width,height:t.height,fill:t.fill,stroke:t.stroke,strokeWidth:t.strokeWidth??0,cornerRadius:t.cornerRadius??0,dash:t.dash,dashEnabled:t.dashEnabled??!1,perfectDrawEnabled:!1,listening:!1}))}addCircle(e,t){e instanceof I&&e.konvaGroup.add(new l.default.Circle({x:t.cx,y:t.cy,radius:t.radius,fill:t.fill,stroke:t.stroke,strokeWidth:t.strokeWidth??0,dash:t.dash,dashEnabled:t.dashEnabled??!1,perfectDrawEnabled:!1,listening:!1}))}addLine(e,t){e instanceof I&&e.konvaGroup.add(new l.default.Line({points:t.points,stroke:t.stroke,strokeWidth:t.strokeWidth??0,dash:t.dash,lineCap:t.lineCap,lineJoin:t.lineJoin,opacity:t.alpha,perfectDrawEnabled:!1,listening:!1}))}addPolygon(e,t){e instanceof I&&e.konvaGroup.add(new l.default.Line({points:t.vertices,closed:!0,fill:t.fill,stroke:t.stroke,strokeWidth:t.strokeWidth??0,perfectDrawEnabled:!1,listening:!1}))}addText(e,t){if(!(e instanceof I))return;let n=(t.offsetY??0)+(t.konvaCorrectionRatio??0)*t.fontSize;if(t.transform){let[n,r,i,a,o,s]=t.transform,c=t.width,u=t.height,d=t.text,f=t.fontSize,p=t.fontFamily??`sans-serif`,m=t.fontStyle??`normal`,h=t.fill??`black`;e.konvaGroup.add(new l.default.Shape({listening:!1,perfectDrawEnabled:!1,sceneFunc:e=>{e.save();let t=e._context;t.transform(n,r,i,a,o,s),t.font=`${m} ${f}px ${p}`,t.fillStyle=h,t.textAlign=`center`,t.textBaseline=`middle`,t.fillText(d,(c??0)/2,(u??0)/2),e.restore()}}))}else e.konvaGroup.add(new l.default.Text({x:t.x,y:t.y,text:t.text,fontSize:t.fontSize,fontFamily:t.fontFamily,fontStyle:t.fontStyle,fill:t.fill,align:t.align,verticalAlign:t.verticalAlign,width:t.width,height:t.height,offsetY:n||void 0,perfectDrawEnabled:!1,listening:!1}))}addImage(e,t){if(!(e instanceof I))return;let n=l.default.Util.createImageElement();if(n.src=t.src,t.transform){let[r,i,a,o,s,c]=t.transform,u=t.width,d=t.height;e.konvaGroup.add(new l.default.Shape({listening:!1,perfectDrawEnabled:!1,sceneFunc:(e,t)=>{e.save();let l=e._context;l.transform(r,i,a,o,s,c),l.drawImage(n,0,0,u,d),e.restore()}}))}else e.konvaGroup.add(new l.default.Image({x:t.x,y:t.y,width:t.width,height:t.height,image:n,listening:!1}))}getExitDepthOffset(){return{x:0,y:0}}getTransform(){return b}getInverseTransform(){return b}},R=[`up`,`down`,`in`,`out`];function z(e,t,n,r,i){return e.roomShape===`circle`?ce(t,n,r,i):e.roomShape===`roundedRectangle`?se(t,n,r,i,e.roomSize*.2):M(t,n,r,i)}function Oe(e,t,n){for(let[e,r]of Object.entries(t.exits))if(r===n.id){let r=e;if(R.includes(r)){let e=k[r];return{type:`inner`,fromDir:r,customLineKey:t.customLines[e]?e:t.customLines[r]?r:void 0,fromRoom:t,toRoom:n}}let i=k[r];return t.customLines[i]?{type:`special`,fromDir:r,customLineKey:i,fromRoom:t,toRoom:n}:t.customLines[r]?{type:`special`,fromDir:r,customLineKey:r,fromRoom:t,toRoom:n}:{type:`regular`,fromDir:r,toDir:ke(n,t.id),fromRoom:t,toRoom:n}}for(let[e,r]of Object.entries(t.specialExits))if(r===n.id)return t.customLines[e]?{type:`special`,customLineKey:e,fromRoom:t,toRoom:n}:{type:`inner`,fromRoom:t,toRoom:n};for(let[e,r]of Object.entries(n.exits))if(r===t.id){let r=e;if(R.includes(r)){let e=k[r];return{type:`inner`,toDir:r,customLineKey:n.customLines[e]?e:n.customLines[r]?r:void 0,fromRoom:t,toRoom:n}}let i=k[r];return n.customLines[i]?{type:`special`,toDir:r,customLineKey:i,fromRoom:t,toRoom:n}:n.customLines[r]?{type:`special`,toDir:r,customLineKey:r,fromRoom:t,toRoom:n}:{type:`regular`,toDir:r,fromRoom:t,toRoom:n}}for(let[e,r]of Object.entries(n.specialExits))if(r===t.id)return n.customLines[e]?{type:`special`,customLineKey:e,fromRoom:t,toRoom:n}:{type:`inner`,fromRoom:t,toRoom:n};return{type:`none`,fromRoom:t,toRoom:n}}function ke(e,t){for(let[n,r]of Object.entries(e.exits))if(r===t)return n}function Ae(e,t,n){return e?e.area===t&&e.z===n:!1}function je(e,t){for(let[n,r]of Object.entries(e.exits))if(r===t.id)return{direction:n};for(let[n,r]of Object.entries(e.specialExits))if(r===t.id)return}function Me(e,t){for(let n of j)if(e.exits[n]===t.id)return n;for(let n of j)if(t.exits[n]===e.id)return ae[n]}function Ne(e,t,n){let{fromRoom:r,toRoom:i,fromDir:a,toDir:o}=t;if(n.length===0&&n.push(r.x,r.y),a&&O.includes(a)){let t=z(e,r.x,r.y,a,e.roomSize/2);n.push(t.x,t.y)}if(o&&O.includes(o)){let t=z(e,i.x,i.y,o,e.roomSize/2);n.push(t.x,t.y)}n.push(i.x,i.y)}function Pe(e,t){let{fromRoom:n,toRoom:r,customLineKey:i}=e,a=n,o;i&&(o=n.customLines[i],o||(o=r.customLines[i],a=r)),t.length===0&&t.push(a.x,a.y),o&&o.points.forEach(e=>{t.push(e.x,-e.y)}),t.push(r.x,r.y)}function Fe(e,t,n,r,i){let a=[],o=[],s=[],c=n.map(t=>e.getRoom(t)).filter(e=>e!==void 0),l=[],u=()=>{l.length>=4&&a.push({points:[...l]}),l=[]},d=e=>{let{fromRoom:t,toRoom:n,fromDir:r,toDir:i,customLineKey:a}=e;if(a){let e=t,r=t.customLines[a];if(r||(r=n.customLines[a],e=n),r){let t=[e.x,e.y];r.points.forEach(e=>{t.push(e.x,-e.y)}),s.push({points:t})}}r&&R.includes(r)&&o.push({room:t,direction:r}),i&&R.includes(i)&&o.push({room:n,direction:i})};for(let n=0;n<c.length-1;n++){let a=c[n],s=c[n+1],f=Ae(a,r,i),p=Ae(s,r,i);if(!f&&!p){u();continue}if(f&&p){let n=Oe(e,a,s);switch(n.type){case`regular`:Ne(t,n,l);break;case`special`:Pe(n,l);break;case`inner`:u(),d(n);break;case`none`:l.length===0&&l.push(a.x,a.y),l.push(s.x,s.y);break}}else{let e=f?a:s,n=f?s:a,r=je(e,n);if(r){if(R.includes(r.direction))u(),o.push({room:e,direction:r.direction});else if(O.includes(r.direction)){l.length===0&&l.push(e.x,e.y);let n=z(t,e.x,e.y,r.direction,t.roomSize/2),i=M(e.x,e.y,r.direction,t.roomSize);l.push(n.x,n.y,i.x,i.y),u()}}else{let r=Me(e,n);if(r){l.length===0&&l.push(e.x,e.y);let n=z(t,e.x,e.y,r,t.roomSize/2),i=M(e.x,e.y,r,t.roomSize);l.push(n.x,n.y,i.x,i.y),u()}}}}return u(),{segments:a,innerMarkers:o,customLines:s}}function Ie(e,t,n){let r=1.425,i=n.roomSize;return{shape:n.roomShape===`circle`?`circle`:`rect`,cx:e.x,cy:e.y,size:i/2*r,cornerRadius:n.roomShape===`roundedRectangle`?i*r*.2:0,stroke:t,strokeWidth:.1,dash:[.05,.05]}}function Le(e,t){let n=t.playerMarker,r=t.roomSize*n.sizeFactor,i=n.matchRoomShape&&t.roomShape!==`circle`;return{shape:i?`rect`:`circle`,cx:e.x,cy:e.y,size:r/2,cornerRadius:i&&t.roomShape===`roundedRectangle`?r*.2:0,strokeColor:n.strokeColor,strokeWidth:n.strokeWidth,strokeAlpha:n.strokeAlpha,fillColor:n.fillColor,fillAlpha:n.fillAlpha,dash:n.dash,dashEnabled:n.dashEnabled}}function Re(e,t,n,r,i,a){let o=Fe(e,t,n,i,a),s=t.lineWidth,c=t.roomSize/5,l=[];for(let e of o.segments)e.points.length>=4&&l.push({points:e.points});for(let e of o.customLines)e.points.length>=4&&l.push({points:e.points});let u=[];for(let e of o.innerMarkers){let t=e.direction===`up`?0:e.direction===`down`?180:e.direction===`in`?90:-90;u.push({vertices:P(e.room.x,e.room.y,c,t)})}return{segments:l,triangles:u,color:r,outlineWidth:s*8,lineWidth:s*4}}var B,ze,Be=256;function Ve(e,t,n){let r=`${e.toFixed(2)}:${t}:${n.toFixed(3)}`;if(ze===r&&B)return B;let i=Be,a=i/2,o=document.createElement(`canvas`);o.width=i,o.height=i;let s=o.getContext(`2d`);s.fillStyle=`rgba(0, 0, 0, ${e})`,s.fillRect(0,0,i,i),s.globalCompositeOperation=`destination-out`;let c=s.createRadialGradient(a,a,0,a,a,a),l=Math.min(n,.99);c.addColorStop(0,`rgba(0, 0, 0, 1)`),c.addColorStop(l*.25,`rgba(0, 0, 0, 0.97)`),c.addColorStop(l*.5,`rgba(0, 0, 0, 0.82)`),c.addColorStop(l*.7,`rgba(0, 0, 0, 0.50)`),c.addColorStop(l*.85,`rgba(0, 0, 0, 0.22)`),c.addColorStop(l*.95,`rgba(0, 0, 0, 0.06)`),c.addColorStop(l,`rgba(0, 0, 0, 0)`),l<.98&&c.addColorStop(1,`rgba(0, 0, 0, 0)`),s.fillStyle=c,s.beginPath(),s.arc(a,a,a,0,Math.PI*2),s.fill(),s.globalCompositeOperation=`source-over`;let u=parseInt(t.slice(1,3),16),d=parseInt(t.slice(3,5),16),f=parseInt(t.slice(5,7),16),p=s.createRadialGradient(a,a,0,a,a,a*l);return p.addColorStop(0,`rgba(${u}, ${d}, ${f}, 0.05)`),p.addColorStop(1,`rgba(${u}, ${d}, ${f}, 0)`),s.fillStyle=p,s.fillRect(0,0,i,i),B=o.toDataURL(),ze=r,B}function He(e,t,n,r){let{radius:i,intensity:a,color:o}=r.ambientLight,s=n.maxX-n.minX,c=n.maxY-n.minY,l=Math.sqrt(s*s+c*c),u=Math.max(l*2.5,i*4);return{cx:e,cy:t,displaySize:u,src:Ve(a,o,Math.round(i/(u/2)*50)/50)}}function Ue(e,t){let n=e.createGroup(0,0);if(t.shape===`circle`)e.addCircle(n,{cx:t.cx,cy:t.cy,radius:t.size,stroke:t.stroke,strokeWidth:t.strokeWidth,dash:t.dash,dashEnabled:!0});else{let r=t.cx-t.size,i=t.cy-t.size,a=t.cx+t.size,o=t.cy+t.size,s=[[r,i,a,i],[a,i,a,o],[a,o,r,o],[r,o,r,i]];for(let r of s)e.addLine(n,{points:r,stroke:t.stroke,strokeWidth:t.strokeWidth,dash:t.dash,lineCap:`butt`})}return n}function We(e,t){let n=e.createGroup(0,0),r=_(t.strokeColor,t.strokeAlpha),i=t.fillAlpha>0?_(t.fillColor,t.fillAlpha):void 0;return t.shape===`circle`?e.addCircle(n,{cx:t.cx,cy:t.cy,radius:t.size,fill:i,stroke:r,strokeWidth:t.strokeWidth,dash:t.dash,dashEnabled:t.dashEnabled}):e.addRect(n,{x:t.cx-t.size,y:t.cy-t.size,width:t.size*2,height:t.size*2,fill:i,stroke:r,strokeWidth:t.strokeWidth,cornerRadius:t.cornerRadius,dash:t.dash,dashEnabled:t.dashEnabled}),n}function Ge(e,t){let n=e.createGroup(0,0);for(let r of t.segments)e.addLine(n,{points:r.points,stroke:`black`,strokeWidth:t.outlineWidth,lineCap:`round`,lineJoin:`round`,alpha:.8}),e.addLine(n,{points:r.points,stroke:t.color,strokeWidth:t.lineWidth,lineCap:`round`,lineJoin:`round`,alpha:.8});for(let r of t.triangles)e.addPolygon(n,{vertices:r.vertices,fill:t.color,stroke:`black`,strokeWidth:t.outlineWidth/4});return n}function Ke(e,t){let n=e.getExitDepthOffset(),r=e.createGroup(n.x,n.y);return e.addLine(r,{points:t.line.points,stroke:t.line.stroke,strokeWidth:t.line.strokeWidth,dash:t.line.dash}),t.arrow&&e.addPolygon(r,{vertices:[t.arrow.tipX,t.arrow.tipY,t.arrow.x1,t.arrow.y1,t.arrow.x2,t.arrow.y2],fill:t.arrow.fill,stroke:t.arrow.stroke,strokeWidth:t.arrow.strokeWidth}),t.door&&e.addRect(r,{x:t.door.x,y:t.door.y,width:t.door.width,height:t.door.height,stroke:t.door.stroke,strokeWidth:t.door.strokeWidth}),r}function qe(e,t){let n=e.getExitDepthOffset(),r=e.createGroup(n.x,n.y);for(let n of t)e.addLine(r,{points:[n.x1,n.y1,n.x2,n.y2],stroke:n.stroke,strokeWidth:n.strokeWidth});return r}function Je(e,t){let n=e.createGroup(0,0);for(let r of t)e.addPolygon(n,{vertices:r.vertices,fill:r.fill,stroke:r.stroke,strokeWidth:r.strokeWidth});return n}function Ye(e,t){let n=e.createGroup(0,0);return e.addImage(n,{x:t.cx-t.displaySize/2,y:t.cy-t.displaySize/2,width:t.displaySize,height:t.displaySize,src:t.src}),n}var Xe=class{constructor(e,t){this.rooms=[],this.labels=[],this.rooms=e,this.labels=t,this.bounds=this.createBounds()}getRooms(){return this.rooms}getLabels(){return this.labels}getBounds(){return this.bounds}createBounds(){let e=this.rooms.reduce((e,t)=>({minX:Math.min(e.minX,t.x),maxX:Math.max(e.maxX,t.x),minY:Math.min(e.minY,t.y),maxY:Math.max(e.maxY,t.y)}),{minX:1/0,maxX:-1/0,minY:1/0,maxY:-1/0});for(let t of this.labels){let n=t.X,r=-t.Y;e.minX=Math.min(e.minX,n),e.maxX=Math.max(e.maxX,n+t.Width),e.minY=Math.min(e.minY,r),e.maxY=Math.max(e.maxY,r+t.Height)}return e}},V=class e{constructor(e){this.planes={},this.exits=new Map,this.version=0,this.area=e,this.planes=this.createPlanes(),this.createExits()}getAreaName(){return this.area.areaName}getAreaId(){return parseInt(this.area.areaId)}getVersion(){return this.version}markDirty(){this.version++}getPlane(e){return this.planes[e]}getPlanes(){return Object.values(this.planes)}getZLevels(){return Object.keys(this.planes).map(Number).sort((e,t)=>e-t)}getRooms(){return this.area.rooms}getFullBounds(){return this.getPlanes().reduce((e,t)=>{let n=t.getBounds();return{minX:Math.min(e.minX,n.minX),maxX:Math.max(e.maxX,n.maxX),minY:Math.min(e.minY,n.minY),maxY:Math.max(e.maxY,n.maxY)}},{minX:1/0,maxX:-1/0,minY:1/0,maxY:-1/0})}getLinkExits(e){return Array.from(this.exits.values()).filter(t=>t.zIndex.includes(e))}createPlanes(){let e=this.area.rooms.reduce((e,t)=>(e[t.z]||(e[t.z]=[]),e[t.z].push(t),e),{});return Object.entries(e).reduce((e,[t,n])=>(e[+t]=new Xe(n,this.area.labels.filter(e=>e.Z===+t)),e),{})}static{this.oppositeDir={north:`south`,south:`north`,east:`west`,west:`east`,northeast:`southwest`,southwest:`northeast`,northwest:`southeast`,southeast:`northwest`,up:`down`,down:`up`,in:`out`,out:`in`}}createExits(){let t=new Map;this.area.rooms.forEach(e=>{Object.entries(e.exits).forEach(([n,r])=>{if(e.id===r)return;let i=`${Math.min(e.id,r)}-${Math.max(e.id,r)}`;t.has(i)||t.set(i,[]),t.get(i).push({origin:e.id,target:r,z:e.z,dir:n})})});for(let[n,r]of t){let[t,i]=n.split(`-`),a=parseInt(t),o=parseInt(i),s=r.filter(e=>e.origin===a),c=r.filter(e=>e.origin===o),l=new Set;for(let t of s){let r=-1;for(let n=0;n<c.length;n++)if(!l.has(n)){if(c[n].dir===e.oppositeDir[t.dir]){r=n;break}r===-1&&(r=n)}if(r!==-1){l.add(r);let e=c[r];this.exits.set(`${n}-${t.dir}`,{a,b:o,aDir:t.dir,bDir:e.dir,zIndex:[t.z,e.z]})}else this.exits.set(`${n}-a:${t.dir}`,{a,b:o,aDir:t.dir,zIndex:[t.z]})}for(let e=0;e<c.length;e++)if(!l.has(e)){let t=c[e];this.exits.set(`${n}-b:${t.dir}`,{a,b:o,bDir:t.dir,zIndex:[t.z]})}}}},Ze=class extends Xe{constructor(e,t){super(e.getRooms(),e.getLabels()),this.basePlane=e,this.visitedRooms=t}getRooms(){return this.basePlane.getRooms().filter(e=>this.visitedRooms.has(e.id))}getLabels(){return this.basePlane.getLabels()}getBounds(){let e=this.getRooms();return e.length?e.reduce((e,t)=>({minX:Math.min(e.minX,t.x),maxX:Math.max(e.maxX,t.x),minY:Math.min(e.minY,t.y),maxY:Math.max(e.maxY,t.y)}),{minX:1/0,maxX:-1/0,minY:1/0,maxY:-1/0}):this.basePlane.getBounds()}},H=class extends V{constructor(e,t){super(e),this.planeCache=new WeakMap,this.visitedRooms=t instanceof Set?t:new Set(t??[]),this.areaRoomIds=new Set(e.rooms.map(e=>e.id))}getPlane(e){let t=super.getPlane(e);if(!t)return t;let n=this.planeCache.get(t);return n||(n=new Ze(t,this.visitedRooms),this.planeCache.set(t,n)),n}getPlanes(){return super.getPlanes().map(e=>{let t=this.planeCache.get(e);return t||(t=new Ze(e,this.visitedRooms),this.planeCache.set(e,t)),t})}getLinkExits(e){return super.getLinkExits(e).filter(e=>this.visitedRooms.has(e.a)||this.visitedRooms.has(e.b))}getVisitedRoomCount(){return super.getRooms().reduce((e,t)=>e+ +!!this.visitedRooms.has(t.id),0)}getTotalRoomCount(){return this.areaRoomIds.size}hasVisitedRoom(e){return this.areaRoomIds.has(e)&&this.visitedRooms.has(e)}getVisitedRoomIds(){return super.getRooms().filter(e=>this.visitedRooms.has(e.id)).map(e=>e.id)}addVisitedRoom(e){let t=this.visitedRooms.has(e);this.visitedRooms.add(e);let n=!t&&this.areaRoomIds.has(e);return n&&this.markDirty(),n}addVisitedRooms(e){let t=0;for(let n of e){let e=this.visitedRooms.has(n);this.visitedRooms.add(n),!e&&this.areaRoomIds.has(n)&&t++}return t>0&&this.markDirty(),t}},U=`rgb(120, 72, 0)`,Qe=class{get coordinateTransform(){return this._coordinateTransform}constructor(e,t,n){if(this.highlightShapes=new Map,this.pathShapes=[],this.currentRoomOverlay=[],this.areaExitHitZones=[],this.destroyed=!1,this._coordinateTransform=b,this.coordinateInverse=b,this.overlayPlugins=new Map,this.state=e,this.container=t,t?(this.stage=new l.default.Stage({container:t,width:t.clientWidth,height:t.clientHeight,draggable:!1}),t.style.backgroundColor=e.settings.backgroundColor,this.viewport=new Ce(t.clientWidth,t.clientHeight)):(this.stage=new l.default.Stage({width:1,height:1}),this.viewport=new Ce(1,1)),this.gridLayer=new l.default.Layer({listening:!1}),this.stage.add(this.gridLayer),this.linkLayer=new l.default.Layer({listening:!1}),this.stage.add(this.linkLayer),this.roomLayer=new l.default.Layer({listening:!1}),this.stage.add(this.roomLayer),this.positionLayer=new l.default.Layer({listening:!1}),this.stage.add(this.positionLayer),this.overlayLayer=new l.default.Layer({listening:!1}),this.stage.add(this.overlayLayer),this.drawingBackend=n??new De,this.positionLayerNode=new L(this.positionLayer),this.overlayLayerNode=new L(this.overlayLayer),this.pipeline=new F(e.mapReader,e.settings,this.drawingBackend,{gridLayer:new L(this.gridLayer),linkLayer:new L(this.linkLayer),roomLayer:new L(this.roomLayer)}),this.events=new v(t),this.culling=new Te(this.stage,new L(this.roomLayer),new L(this.linkLayer),e.settings),this.viewport.onChange=()=>this.applyViewportToStage(),t){this.origSetSize=this.viewport.setSize.bind(this.viewport);let n=this.origSetSize;this.viewport.setSize=(e,t)=>{n(e,t),this.stage.width(e),this.stage.height(t)},this.interactionHandler=new Ee(t,this.viewport,e,e.settings,{clientToMapPoint:(e,n)=>this.viewport.clientToMapPoint(e,n,t.getBoundingClientRect()),findRoomAtPoint:(e,t)=>this.culling.findRoomAtMapPoint(e,t),getAreaExitHitZones:()=>this.areaExitHitZones},this.events)}this.applyDrawingBackendTransforms(this.drawingBackend),this.subscribeToState(e)}setDrawingBackend(e){this.drawingBackend=e,this.pipeline=new F(this.state.mapReader,this.state.settings,e,{gridLayer:new L(this.gridLayer),linkLayer:new L(this.linkLayer),roomLayer:new L(this.roomLayer)}),this.applyDrawingBackendTransforms(e)}applyDrawingBackendTransforms(e){let t=e.getTransform(),n=e.getInverseTransform(),r=this.coordinateInverse;this._coordinateTransform=t,this.coordinateInverse=n,this.culling.setCoordinateTransform(t),this.pipeline.gridRenderer.setInverseTransform(n);let i=this.viewport.getScale(),a=this.viewport.width/2,o=this.viewport.height/2,s=r((a-this.viewport.position.x)/i,(o-this.viewport.position.y)/i),c=t(s.x,s.y);this.viewport.position={x:a-c.x*i,y:o-c.y*i},this.applyViewportToStage()}mapPoint(e,t){return this._coordinateTransform(e,t)}get exitRenderer(){return this.pipeline.exitRenderer}get roomShapeRenderer(){return this.pipeline.roomShapeRenderer}get gridRenderer(){return this.pipeline.gridRenderer}destroy(){if(!this.destroyed){this.destroyed=!0,this.state.events.removeAllListeners(),this.interactionHandler?.destroy();for(let e of this.overlayPlugins.values())e.destroy();this.overlayPlugins.clear(),this.viewport.cancelAnimation(),this.origSetSize&&(this.viewport.setSize=this.origSetSize),this.viewport.onChange=void 0,this.clearOverlayShapes(),this.clearCurrentRoomOverlay(),this.positionMarker&&=(this.positionMarker.destroy(),void 0),this.ambientLightNode&&=(this.ambientLightNode.destroy(),void 0),this.stage.destroy(),this.events.removeAllListeners()}}updateBackground(){this.container&&(this.container.style.backgroundColor=this.state.settings.backgroundColor)}exportCanvas(e){if(this.state.currentArea===void 0||this.state.currentZIndex===void 0)return;let t=this.stage.toCanvas({pixelRatio:e?.pixelRatio??1}),n=document.createElement(`canvas`);n.width=t.width,n.height=t.height;let r=n.getContext(`2d`);return r.fillStyle=this.state.settings.backgroundColor,r.fillRect(0,0,n.width,n.height),r.drawImage(t,0,0),n}applyViewportToStage(){let e=this.viewport.getScale();this.stage.scale({x:e,y:e}),this.stage.position(this.viewport.position),this.stage.batchDraw(),this.pipeline.gridRenderer.render(this.viewport.getViewportBounds()),this.culling.scheduleCulling(),this.refreshAmbientLight();let t=this.viewport.getViewportBounds();for(let n of this.overlayPlugins.values())n.updateViewport(t,e,this.coordinateTransform)}toCanvas(e){let{currentArea:t,currentZIndex:n,currentAreaInstance:r}=this.state;if(t===void 0||n===void 0||!r)return;let i=r,a=i.getPlane(n);if(!a)return;let{width:o,height:s}=e,c=e.padding??3,u=this.viewport.width,d=this.viewport.height,f=this.viewport.zoom,p=this.viewport.minZoom,m={...this.viewport.position},h=this.viewport.onChange;this.viewport.onChange=void 0;let g=this.state.computeExportBounds(i,a,e.roomId,c),_=this._coordinateTransform,v=_(g.x,g.y),y=_(g.x+g.w,g.y),b=_(g.x+g.w,g.y+g.h),x=_(g.x,g.y+g.h),S=Math.min(v.x,y.x,b.x,x.x),C=Math.max(v.x,y.x,b.x,x.x),w=Math.min(v.y,y.y,b.y,x.y),T=Math.max(v.y,y.y,b.y,x.y),E={x:S,y:w,w:C-S,h:T-w},ee=o/E.w,te=s/E.h,D=Math.min(ee,te),ne=E.w*D,re=E.h*D,O=(o-ne)/2,ie=(s-re)/2,k={x:O-E.x*D,y:ie-E.y*D};this.viewport.width=o,this.viewport.height=s,this.viewport.zoom=D/(this.viewport.getScale()/this.viewport.zoom),this.viewport.position=k,this.stage.width(o),this.stage.height(s),this.stage.scale({x:D,y:D}),this.stage.position(k),this.pipeline.gridRenderer.render(this.viewport.getViewportBounds()),this.culling.updateCulling();let A=new l.default.Layer({listening:!1});A.scale({x:1/D,y:1/D}),A.position({x:-(O-E.x*D)/D,y:-(ie-E.y*D)/D}),A.add(new l.default.Rect({x:0,y:0,width:o,height:s,fill:this.state.settings.backgroundColor})),this.stage.add(A),A.moveToBottom();let j=this.stage.toCanvas({width:o,height:s});return A.destroy(),this.viewport.width=u,this.viewport.height=d,this.viewport.zoom=f,this.viewport.minZoom=p,this.viewport.position=m,this.viewport.onChange=h,this.stage.width(u),this.stage.height(d),this.applyViewportToStage(),this.culling.updateCulling(),j}refresh(){let{currentAreaInstance:e,currentZIndex:t,positionRoomId:n}=this.state;if(!e||t===void 0)return;let r=e.getPlane(t);if(!r)return;this.updateBackground();let i=this.buildScene(e,r,t,this.viewport.getViewportBounds());this.onSceneBuilt(i),this.syncHighlights(),this.syncPaths(),n!==void 0&&this.onPositionChanged(n,!1,!1)}addOverlayPlugin(e,t){this.removeOverlayPlugin(e),t.attach(this.overlayLayer),this.overlayPlugins.set(e,t),t.updateViewport(this.viewport.getViewportBounds(),this.viewport.getScale(),this.coordinateTransform)}removeOverlayPlugin(e){let t=this.overlayPlugins.get(e);t&&(t.destroy(),this.overlayPlugins.delete(e))}subscribeToState(e){e.events.on(`area`,()=>{this.refresh()}),e.events.on(`position`,({roomId:e,center:t,areaChanged:n})=>{this.onPositionChanged(e,t,n)}),e.events.on(`center`,({roomId:t,instant:n})=>{let r=e.mapReader.getRoom(t);if(r){let e=this.mapPoint(r.x,r.y);this.viewport.panToMapPointAnimated(e.x,e.y,n||this.state.settings.instantMapMove)}}),e.events.on(`highlight`,({roomId:e,color:t})=>{this.syncHighlight(e,t)}),e.events.on(`path`,()=>{this.syncPaths()}),e.events.on(`clear`,()=>{this.syncHighlights()})}buildScene(e,t,n,r){this.positionLayer.destroyChildren(),this.positionMarker=void 0,this.clearOverlayShapes(),this.currentRoomOverlay=[];let i=this.pipeline.buildScene(e,t,n,r);return this.lastBuildResult=i,i}onSceneBuilt(e){this.culling.clear(),this.areaExitHitZones=[],this.culling.computeBucketSize();let t=this.viewport.getScale();this.stage.scale({x:t,y:t});for(let[,t]of e.roomNodes)this.culling.roomNodes.set(t.room.id,t),this.culling.addRoomToSpatialIndex(t);for(let t of e.standaloneExitNodes)this.culling.standaloneExitNodes.push(t),this.culling.addStandaloneExitToSpatialIndex(t);this.culling.setExitBoundsRoomSize(),this.areaExitHitZones=e.areaExitHitZones,this.culling.updateCulling(),this.stage.batchDraw()}onPositionChanged(e,t,n){if(e===void 0){this.positionMarker&&=(this.positionMarker.destroy(),void 0),this.ambientLightNode&&=(this.ambientLightNode.destroy(),void 0),this.positionLayerNode.batchDraw(),this.clearCurrentRoomOverlay(),this.overlayLayerNode.batchDraw();return}let r=this.state.mapReader.getRoom(e);if(r){if(t){let e=this.mapPoint(r.x,r.y);this.viewport.panToMapPointAnimated(e.x,e.y,n||this.state.settings.instantMapMove)}this.updateCurrentRoomOverlay(r),this.applyAmbientLight(r),this.applyPositionMarker(r)}}applyPositionMarker(e){this.positionMarker&&this.positionMarker.destroy();let t=Le(e,this.state.settings);this.positionMarker=We(this.drawingBackend,t),this.positionLayerNode.addNode(this.positionMarker)}applyAmbientLight(e){if(this.ambientLightNode&&=(this.ambientLightNode.destroy(),void 0),!this.state.settings.ambientLight.enabled)return;let t=this.viewport.getViewportBounds(),n=He(e.x,e.y,t,this.state.settings);this.ambientLightNode=Ye(this.drawingBackend,n),this.overlayLayerNode.addNode(this.ambientLightNode),this.overlayLayerNode.batchDraw()}refreshAmbientLight(){if(!this.state.settings.ambientLight.enabled||this.state.positionRoomId===void 0)return;let e=this.state.mapReader.getRoom(this.state.positionRoomId);e&&this.applyAmbientLight(e)}clearCurrentRoomOverlay(){this.currentRoomOverlay.forEach(e=>e.destroy()),this.currentRoomOverlay=[],this.positionLayerNode.batchDraw()}updateCurrentRoomOverlay(e){if(this.clearCurrentRoomOverlay(),e.area!==this.state.currentArea||e.z!==this.state.currentZIndex){this.positionLayerNode.batchDraw();return}let t=this.state.settings;if(!t.highlightCurrentRoom){this.positionMarker&&this.positionMarker.moveToTop(),this.positionLayerNode.batchDraw();return}let n=new Map;n.set(e.id,e);let r=[],i=this.pipeline.exitRenderer,a=this.state.currentAreaInstance instanceof H?this.state.currentAreaInstance:void 0;this.state.currentAreaInstance&&this.state.currentZIndex!==void 0&&this.state.currentAreaInstance.getLinkExits(this.state.currentZIndex).filter(t=>t.a===e.id||t.b===e.id).forEach(e=>{let t=i.renderDataWithColor(e,U,this.state.currentZIndex);t&&r.push(this.pipeline.renderExitData(t))});for(let n of he(e,t,U))r.push(Ke(this.drawingBackend,n));let o=pe(e,t,U);o.length>0&&r.push(qe(this.drawingBackend,o)),[...Object.values(e.exits),...Object.values(e.specialExits)].forEach(e=>{let t=this.state.mapReader.getRoom(e),r=!a||a.hasVisitedRoom(e);t&&t.area===this.state.currentArea&&t.z===this.state.currentZIndex&&r&&n.set(e,t)}),r.forEach(e=>{this.positionLayerNode.addNode(e),this.currentRoomOverlay.push(e)}),n.forEach((n,r)=>{let i=r===e.id,a=this.pipeline.roomShapeRenderer.createRoomGroup(n,{strokeOverride:i?U:t.lineColor});this.positionLayerNode.addNode(a),this.currentRoomOverlay.push(a)}),n.forEach(e=>{let{triangles:n}=ye(e,this.state.mapReader,t);if(n.length>0){let e=Je(this.drawingBackend,n);this.positionLayerNode.addNode(e),this.currentRoomOverlay.push(e)}}),this.positionMarker&&this.positionMarker.moveToTop(),this.positionLayerNode.batchDraw()}syncHighlight(e,t){let n=this.highlightShapes.get(e);if(n&&(n.destroy(),this.highlightShapes.delete(e)),t!==void 0){let n=this.state.mapReader.getRoom(e);if(n&&n.area===this.state.currentArea&&n.z===this.state.currentZIndex){let r=Ie(n,t,this.state.settings),i=Ue(this.drawingBackend,r);this.overlayLayerNode.addNode(i),this.highlightShapes.set(e,i)}}this.overlayLayerNode.batchDraw()}syncHighlights(){for(let e of this.highlightShapes.values())e.destroy();this.highlightShapes.clear();for(let[e,t]of this.state.highlights){if(t.area!==this.state.currentArea||t.z!==this.state.currentZIndex)continue;let n=this.state.mapReader.getRoom(e);if(!n)continue;let r=Ie(n,t.color,this.state.settings),i=Ue(this.drawingBackend,r);this.overlayLayerNode.addNode(i),this.highlightShapes.set(e,i)}this.overlayLayerNode.batchDraw()}syncPaths(){this.clearPathShapes();let{currentArea:e,currentZIndex:t}=this.state;if(!(e===void 0||t===void 0)){for(let n of this.state.paths){let r=Re(this.state.mapReader,this.state.settings,n.locations,n.color,e,t),i=Ge(this.drawingBackend,r);this.overlayLayerNode.addNode(i),this.pathShapes.push(i)}this.overlayLayerNode.batchDraw()}}clearOverlayShapes(){for(let e of this.highlightShapes.values())e.destroy();this.highlightShapes.clear(),this.clearPathShapes()}clearPathShapes(){for(let e of this.pathShapes)e.destroy();this.pathShapes=[]}};function W(e){return e.replace(/&/g,`&`).replace(/</g,`<`).replace(/>/g,`>`).replace(/"/g,`"`).replace(/'/g,`'`)}function G(e,t){return t===void 0?``:` ${e}="${typeof t==`string`?W(t):t}"`}function $e(e,t){return!e||t===!1?``:` stroke-dasharray="${e.join(` `)}"`}var K=class{constructor(e,t){this.elements=[],this.visible=!0,this.x=e,this.y=t}setVisible(e){this.visible=e}isVisible(){return this.visible}destroy(){this.elements.length=0}setPosition(e,t){}getPosition(){return{x:this.x,y:this.y}}moveToTop(){}toSvg(){return!this.visible||this.elements.length===0?``:this.x===0&&this.y===0?this.elements.join(`
|
|
2
2
|
`):`<g transform="translate(${this.x},${this.y})">\n${this.elements.join(`
|
|
3
3
|
`)}\n</g>`}},et=class{constructor(){this.groups=[]}addNode(e){e instanceof K&&this.groups.push(e)}destroyChildren(){this.groups=[]}batchDraw(){}toSvg(){return this.groups.filter(e=>e.isVisible()).map(e=>e.toSvg()).filter(e=>e.length>0).join(`
|
|
4
|
-
`)}},tt=class{createGroup(e,t){return new K(e,t)}addRect(e,t){if(!(e instanceof K))return;let n=t.fill??`none`,r=`<rect${G(`x`,t.x)}${G(`y`,t.y)}${G(`width`,t.width)}${G(`height`,t.height)}${G(`fill`,n)}${G(`stroke`,t.stroke)}${G(`stroke-width`,t.strokeWidth)}${t.cornerRadius?`${G(`rx`,t.cornerRadius)}${G(`ry`,t.cornerRadius)}`:``}${$e(t.dash,t.dashEnabled)}/>`;e.elements.push(r)}addCircle(e,t){if(!(e instanceof K))return;let n=t.fill??`none`,r=`<circle${G(`cx`,t.cx)}${G(`cy`,t.cy)}${G(`r`,t.radius)}${G(`fill`,n)}${G(`stroke`,t.stroke)}${G(`stroke-width`,t.strokeWidth)}${$e(t.dash,t.dashEnabled)}/>`;e.elements.push(r)}addLine(e,t){if(!(e instanceof K))return;let n=t.points,r=[];for(let e=0;e<n.length;e+=2)r.push(`${n[e]},${n[e+1]}`);let i=`<polyline points="${r.join(` `)}"${G(`stroke`,t.stroke)}${G(`stroke-width`,t.strokeWidth)}${$e(t.dash)}${G(`stroke-linecap`,t.lineCap)}${G(`stroke-linejoin`,t.lineJoin)}${G(`opacity`,t.alpha)} fill="none"/>`;e.elements.push(i)}addPolygon(e,t){if(!(e instanceof K))return;let n=t.vertices,r=[];for(let e=0;e<n.length;e+=2)r.push(`${n[e]},${n[e+1]}`);let i=`<polygon points="${r.join(` `)}"${G(`fill`,t.fill)}${G(`stroke`,t.stroke)}${G(`stroke-width`,t.strokeWidth)}/>`;e.elements.push(i)}addText(e,t){if(!(e instanceof K))return;let n=t.x,r=t.y,i=`start`,a=`auto`;t.width!==void 0&&(t.align===`center`?(n=t.x+t.width/2,i=`middle`):t.align===`right`&&(n=t.x+t.width,i=`end`)),t.height!==void 0&&t.verticalAlign===`middle`?t.baselineRatio===void 0?(r=t.y+t.height/2,a=`central`):r=t.y+t.height/2+t.baselineRatio*t.fontSize:t.offsetY&&(r-=t.offsetY);let o=t.transform?` transform="matrix(${t.transform.join(`,`)})"`:``,s=`<text${G(`x`,n)}${G(`y`,r)}${G(`font-size`,t.fontSize)}${t.fontFamily?G(`font-family`,t.fontFamily):``}${t.fontStyle===`bold`?` font-weight="bold"`:``}${G(`fill`,t.fill)} text-anchor="${i}" dominant-baseline="${a}"${o}>${W(t.text)}</text>`;e.elements.push(s)}addImage(e,t){if(e instanceof K)if(t.transform){let[n,r,i,a,o,s]=t.transform,c=`<image${G(`width`,t.width)}${G(`height`,t.height)} href="${W(t.src)}" transform="matrix(${n},${r},${i},${a},${o},${s})"/>`;e.elements.push(c)}else{let n=`<image${G(`x`,t.x)}${G(`y`,t.y)}${G(`width`,t.width)}${G(`height`,t.height)} href="${W(t.src)}"/>`;e.elements.push(n)}}getExitDepthOffset(){return{x:0,y:0}}getTransform(){return b}getInverseTransform(){return b}};function nt(e){return e.replace(/&/g,`&`).replace(/</g,`<`).replace(/>/g,`>`).replace(/"/g,`"`).replace(/'/g,`'`)}var rt=class{constructor(e,t){this.state=e,this.drawingBackendFactory=t}exportSvg(e){let{currentArea:t,currentZIndex:n,currentAreaInstance:r}=this.state;if(t===void 0||n===void 0||!r)return;let i=r,a=i.getPlane(n);if(!a)return;let o=this.state.settings,s=e?.padding??3,c=this.state.computeExportBounds(i,a,e?.roomId,s),l=new tt,u=this.drawingBackendFactory?this.drawingBackendFactory(l):l,d=new et,f=new et,p=new et,m=new
|
|
5
|
-
`)}},it=class{get settings(){return this.state.settings}constructor(e,t,n,r,i,a){this.state=new y(e,t??p()),this.svgDrawingBackendFactory=a,this.backend=r?r(this.state):new Qe(this.state,n,i)}destroy(){this.backend.destroy()}drawArea(e,t){this.state.setArea(e,t)}getCurrentArea(){return this.state.currentAreaInstance}setPosition(e,t=!0){this.state.setPosition(e,t)}updatePositionMarker(e){this.state.updatePositionMarker(e)}clearPosition(){this.state.clearPosition()}centerOn(e,t){this.state.setCenterRoom(e,t)}renderHighlight(e,t){this.state.addHighlight(e,t)}removeHighlight(e){this.state.removeHighlight(e)}hasHighlight(e){return this.state.hasHighlight(e)}clearHighlights(){this.state.clearHighlights()}renderPath(e,t){this.state.addPath(e,t)}clearPaths(){this.state.clearPaths()}refreshCurrentRoomOverlay(){this.state.refreshPosition()}setDrawingBackend(e){this.backend.setDrawingBackend(e),this.drawingBackendFactory=void 0}setDrawingBackendFactory(e){this.drawingBackendFactory=e??void 0}updateBackground(){this.backend.updateBackground()}refresh(){this.backend.updateBackground(),this.backend.refresh()}addOverlayPlugin(e,t){this.backend.addOverlayPlugin(e,t)}removeOverlayPlugin(e){this.backend.removeOverlayPlugin(e)}exportSvg(e){let t={...e,overlays:this.state.getOverlaysForArea(e?.overlays)},n=this.drawingBackendFactory??this.svgDrawingBackendFactory;return new rt(this.state,n).exportSvg(t)}exportPng(e){return this.backend.exportCanvas(e)?.toDataURL(`image/png`)}exportPngBlob(e){let t=this.backend.exportCanvas(e);if(t)return new Promise(e=>{t.toBlob(t=>{t&&e(t)},`image/png`)})}renderToCanvas(e){return this.backend.toCanvas(e)}on(e,t){this.backend.events.on(e,t)}off(e,t){this.backend.events.off(e,t)}setZoom(e){return this.backend.viewport.setZoom(e)}zoomToCenter(e){return this.backend.viewport.zoomToCenter(e)}getZoom(){return this.backend.viewport.zoom}getViewportBounds(){return this.backend.viewport.getViewportBounds()}getAreaBounds(){if(!this.state.currentAreaInstance||this.state.currentZIndex===void 0)return null;let e=this.state.currentAreaInstance.getPlane(this.state.currentZIndex);if(!e)return null;let t=this.state.getEffectiveBounds(this.state.currentAreaInstance,e),n=this.state.settings.areaName&&this.state.currentAreaInstance.getAreaName(),r={minX:n?t.minX-4:t.minX,maxX:t.maxX,minY:n?t.minY-7:t.minY,maxY:t.maxY},i=this.backend.coordinateTransform,a=i(r.minX,r.minY),o=i(r.maxX,r.minY),s=i(r.maxX,r.maxY),c=i(r.minX,r.maxY);return{minX:Math.min(a.x,o.x,s.x,c.x),maxX:Math.max(a.x,o.x,s.x,c.x),minY:Math.min(a.y,o.y,s.y,c.y),maxY:Math.max(a.y,o.y,s.y,c.y)}}fitArea(){let e=this.getAreaBounds();e&&this.backend.viewport.fitToMapBounds(e.minX,e.maxX,e.minY,e.maxY)}get centerOnResize(){return this.backend.viewport.centerOnResize}set centerOnResize(e){this.backend.viewport.centerOnResize=e}get minZoom(){return this.backend.viewport.minZoom}set minZoom(e){this.backend.viewport.minZoom=e}setCullingMode(e){this.state.settings.cullingMode=e,this.state.settings.cullingEnabled=e!==`none`,this.backend.culling.scheduleCulling()}getCullingMode(){return this.state.settings.cullingMode}},at=class{get settings(){return this.renderer.settings}constructor(e,t,n){this.renderer=new it(t,n,e)}drawArea(e,t){this.renderer.drawArea(e,t)}getCurrentArea(){return this.renderer.getCurrentArea()}setPosition(e,t=!0){this.renderer.setPosition(e,t)}updatePositionMarker(e){this.renderer.updatePositionMarker(e)}clearPosition(){this.renderer.clearPosition()}centerOn(e,t){this.renderer.centerOn(e,t)}renderHighlight(e,t){this.renderer.renderHighlight(e,t)}removeHighlight(e){this.renderer.removeHighlight(e)}hasHighlight(e){return this.renderer.hasHighlight(e)}clearHighlights(){this.renderer.clearHighlights()}renderPath(e,t){this.renderer.renderPath(e,t)}clearPaths(){this.renderer.clearPaths()}exportSvg(e){return this.renderer.exportSvg(e)}exportPng(e){return this.renderer.exportPng(e)}exportPngBlob(e){return this.renderer.exportPngBlob(e)}setZoom(e){return this.renderer.setZoom(e)}zoomToCenter(e){return this.renderer.zoomToCenter(e)}getZoom(){return this.renderer.getZoom()}getViewportBounds(){return this.renderer.getViewportBounds()}getAreaBounds(){return this.renderer.getAreaBounds()}fitArea(){this.renderer.fitArea()}get centerOnResize(){return this.renderer.centerOnResize}set centerOnResize(e){this.renderer.centerOnResize=e}get minZoom(){return this.renderer.minZoom}set minZoom(e){this.renderer.minZoom=e}on(e,t){this.renderer.on(e,t)}off(e,t){this.renderer.off(e,t)}setCullingMode(e){this.renderer.setCullingMode(e)}getCullingMode(){return this.renderer.getCullingMode()}refreshCurrentRoomOverlay(){this.renderer.refreshCurrentRoomOverlay()}updateBackground(){this.renderer.updateBackground()}refresh(){this.renderer.refresh()}destroy(){this.renderer.destroy()}};function q(e){let t=e|0||1;return()=>(t=t*1664525+1013904223|0,(t>>>0)/4294967296)}function J(...e){let t=2654435769;for(let n of e)t^=(n*1e3|0)+2654435769+(t<<6)+(t>>2);return t}function ot(e,t,n,r,i,a){let o=n-e,s=r-t,c=Math.sqrt(o*o+s*s);if(c<.001)return[e,t,n,r];let l=-s/c,u=o/c,d=Math.max(2,Math.min(6,Math.ceil(c/.15))),f=[e+l*(a()-.5)*i*.3,t+u*(a()-.5)*i*.3];for(let n=1;n<d;n++){let r=n/d,c=e+o*r,p=t+s*r,m=(a()-.5)*2*i;f.push(c+l*m,p+u*m)}return f.push(n+l*(a()-.5)*i*.3,r+u*(a()-.5)*i*.3),f}function st(e,t,n){if(e.length<4)return e;let r=[];for(let i=0;i<e.length-2;i+=2){let a=ot(e[i],e[i+1],e[i+2],e[i+3],t,n);if(i===0)r.push(...a);else for(let e=2;e<a.length;e++)r.push(a[e])}return r}function ct(e,t,n,r,i,a){let o=[e,t,e+n,t,e+n,t+r,e,t+r],s=[];for(let e=0;e<4;e++){let t=o[e*2],n=o[e*2+1],r=(e+1)%4,c=o[r*2],l=o[r*2+1],u=ot(t,n,c,l,i,a);for(let e=0;e<u.length-2;e++)s.push(u[e])}return s}function lt(e,t,n,r,i){let a=[];for(let o=0;o<24;o++){let s=o/24*Math.PI*2,c=n+(i()-.5)*2*r;a.push(e+Math.cos(s)*c,t+Math.sin(s)*c)}return a}function ut(e,t,n){let r=e.length/2;if(r<2)return e;let i=[];for(let a=0;a<r;a++){let o=e[a*2],s=e[a*2+1],c=(a+1)%r,l=e[c*2],u=e[c*2+1],d=ot(o,s,l,u,t,n);for(let e=0;e<d.length-2;e++)i.push(d[e])}return i}var dt=class{constructor(e,t,n){this.inner=e,this.jitter=t,this.pencil=n}createGroup(e,t){return this.inner.createGroup(e,t)}applyPencilWithAlpha(e){if(!e)return this.pencil;let t=e.match(/^rgba\(.+,\s*([\d.]+)\s*\)$/);if(!t)return this.pencil;let n=parseFloat(t[1]);return n>=1?this.pencil:`rgba(${parseInt(this.pencil.slice(1,3),16)}, ${parseInt(this.pencil.slice(3,5),16)}, ${parseInt(this.pencil.slice(5,7),16)}, ${n})`}addRect(e,t){let n=this.jitter,r=this.pencil,i=q(J(t.x,t.y,t.width,t.height)),a=t.fill?`#ffffff`:void 0,o=t.stroke?r:void 0;if(t.cornerRadius&&t.cornerRadius>0){if(a&&this.inner.addRect(e,{...t,fill:a,stroke:void 0,strokeWidth:0}),o&&t.strokeWidth){let r=ct(t.x,t.y,t.width,t.height,n,i);this.inner.addPolygon(e,{vertices:r,stroke:o,strokeWidth:t.strokeWidth})}return}let s=ct(t.x,t.y,t.width,t.height,n,i);this.inner.addPolygon(e,{vertices:s,fill:a,stroke:o,strokeWidth:t.strokeWidth??0})}addCircle(e,t){let n=this.jitter,r=this.pencil,i=q(J(t.cx,t.cy,t.radius)),a=lt(t.cx,t.cy,t.radius,n,i);this.inner.addPolygon(e,{vertices:a,fill:t.fill?`#ffffff`:void 0,stroke:t.stroke?r:void 0,strokeWidth:t.strokeWidth??0})}addLine(e,t){let n=this.jitter,r=q(J(...t.points.slice(0,4))),i=st(t.points,n,r),a=this.applyPencilWithAlpha(t.stroke);this.inner.addLine(e,{...t,points:i,stroke:a})}addPolygon(e,t){let n=this.jitter,r=this.pencil,i=q(J(...t.vertices.slice(0,4))),a=ut(t.vertices,n,i);this.inner.addPolygon(e,{...t,vertices:a,fill:t.fill?r:void 0,stroke:t.stroke?r:void 0})}addText(e,t){this.inner.addText(e,{...t,fill:this.pencil})}addImage(e,t){this.inner.addImage(e,t)}getExitDepthOffset(){return this.inner.getExitDepthOffset()}getTransform(){return this.inner.getTransform()}getInverseTransform(){return this.inner.getInverseTransform()}},ft=`#4a3728`,pt=`#3b2a1a`,mt=139,ht=115,gt=85,_t=244,vt=228,yt=193;function bt(e){let t=e.match(/rgba?\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)(?:\s*,\s*([\d.]+))?\s*\)/);return t?{r:parseInt(t[1]),g:parseInt(t[2]),b:parseInt(t[3]),a:t[4]===void 0?1:parseFloat(t[4])}:e.startsWith(`#`)&&e.length>=7?{r:parseInt(e.slice(1,3),16),g:parseInt(e.slice(3,5),16),b:parseInt(e.slice(5,7),16),a:1}:null}function xt(e){let t=bt(e);if(!t)return`rgb(${_t}, ${vt}, ${yt})`;let n=(.299*t.r+.587*t.g+.114*t.b)/255,r=Math.round(mt+(_t-mt)*n),i=Math.round(ht+(vt-ht)*n),a=Math.round(gt+(yt-gt)*n);return t.a<1?`rgba(${r}, ${i}, ${a}, ${t.a})`:`rgb(${r}, ${i}, ${a})`}function Y(e){let t=bt(e);if(!t||t.a>=1)return ft;let n=bt(ft);return`rgba(${n.r}, ${n.g}, ${n.b}, ${t.a})`}var St=class{constructor(e){this.inner=e}createGroup(e,t){return this.inner.createGroup(e,t)}addRect(e,t){this.inner.addRect(e,{...t,fill:t.fill?xt(t.fill):void 0,stroke:t.stroke?Y(t.stroke):void 0})}addCircle(e,t){this.inner.addCircle(e,{...t,fill:t.fill?xt(t.fill):void 0,stroke:t.stroke?Y(t.stroke):void 0})}addLine(e,t){this.inner.addLine(e,{...t,stroke:t.stroke?Y(t.stroke):void 0})}addPolygon(e,t){this.inner.addPolygon(e,{...t,fill:t.fill?xt(t.fill):void 0,stroke:t.stroke?Y(t.stroke):void 0})}addText(e,t){this.inner.addText(e,{...t,fill:pt})}addImage(e,t){this.inner.addImage(e,t)}getExitDepthOffset(){return this.inner.getExitDepthOffset()}getTransform(){return this.inner.getTransform()}getInverseTransform(){return this.inner.getInverseTransform()}},Ct=`#c0deff`,wt=`#e0f0ff`,Tt=20,Et=40,Dt=80,Ot=60,kt=100,At=160;function jt(e){let t=e.match(/rgba?\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)(?:\s*,\s*([\d.]+))?\s*\)/);return t?{r:parseInt(t[1]),g:parseInt(t[2]),b:parseInt(t[3]),a:t[4]===void 0?1:parseFloat(t[4])}:e.startsWith(`#`)&&e.length>=7?{r:parseInt(e.slice(1,3),16),g:parseInt(e.slice(3,5),16),b:parseInt(e.slice(5,7),16),a:1}:null}function Mt(e){let t=jt(e);if(!t)return`rgb(${Ot}, ${kt}, ${At})`;let n=(.299*t.r+.587*t.g+.114*t.b)/255,r=Math.round(Tt+(Ot-Tt)*n),i=Math.round(Et+(kt-Et)*n),a=Math.round(Dt+(At-Dt)*n);return t.a<1?`rgba(${r}, ${i}, ${a}, ${t.a})`:`rgb(${r}, ${i}, ${a})`}function X(e){let t=jt(e);if(!t||t.a>=1)return Ct;let n=jt(Ct);return`rgba(${n.r}, ${n.g}, ${n.b}, ${t.a})`}var Nt=class{constructor(e){this.inner=e}createGroup(e,t){return this.inner.createGroup(e,t)}addRect(e,t){this.inner.addRect(e,{...t,fill:t.fill?Mt(t.fill):void 0,stroke:t.stroke?X(t.stroke):void 0})}addCircle(e,t){this.inner.addCircle(e,{...t,fill:t.fill?Mt(t.fill):void 0,stroke:t.stroke?X(t.stroke):void 0})}addLine(e,t){this.inner.addLine(e,{...t,stroke:t.stroke?X(t.stroke):void 0})}addPolygon(e,t){this.inner.addPolygon(e,{...t,fill:t.fill?Mt(t.fill):void 0,stroke:t.stroke?X(t.stroke):void 0})}addText(e,t){this.inner.addText(e,{...t,fill:wt})}addImage(e,t){this.inner.addImage(e,t)}getExitDepthOffset(){return this.inner.getExitDepthOffset()}getTransform(){return this.inner.getTransform()}getInverseTransform(){return this.inner.getInverseTransform()}},Pt=`#00ffd0`,Ft=.3,It=3;function Lt(e){let t=e.match(/rgba?\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)(?:\s*,\s*([\d.]+))?\s*\)/);return t?{r:parseInt(t[1]),g:parseInt(t[2]),b:parseInt(t[3]),a:t[4]===void 0?1:parseFloat(t[4])}:e.startsWith(`#`)&&e.length>=7?{r:parseInt(e.slice(1,3),16),g:parseInt(e.slice(3,5),16),b:parseInt(e.slice(5,7),16),a:1}:null}function Rt(e,t,n){e/=255,t/=255,n/=255;let r=Math.max(e,t,n),i=Math.min(e,t,n),a=(r+i)/2;if(r===i)return[0,0,a];let o=r-i,s=a>.5?o/(2-r-i):o/(r+i),c;return c=r===e?((t-n)/o+(t<n?6:0))/6:r===t?((n-e)/o+2)/6:((e-t)/o+4)/6,[c*360,s,a]}function zt(e,t,n,r=1){e=(e%360+360)%360;let i=(1-Math.abs(2*n-1))*t,a=i*(1-Math.abs(e/60%2-1)),o=n-i/2,s,c,l;e<60?(s=i,c=a,l=0):e<120?(s=a,c=i,l=0):e<180?(s=0,c=i,l=a):e<240?(s=0,c=a,l=i):e<300?(s=a,c=0,l=i):(s=i,c=0,l=a);let u=Math.round((s+o)*255),d=Math.round((c+o)*255),f=Math.round((l+o)*255);return r<1?`rgba(${u}, ${d}, ${f}, ${r})`:`rgb(${u}, ${d}, ${f})`}function Bt(e){let t=Lt(e);if(!t)return{neon:`#00ff88`,h:150,s:1,a:1};let[n,,]=Rt(t.r,t.g,t.b);return{neon:zt(n,.95,.65,t.a),h:n,s:.95,a:t.a}}function Vt(e){let t=Lt(e);if(!t)return`rgb(8, 12, 10)`;let[n,,]=Rt(t.r,t.g,t.b);return zt(n,.4,.1,t.a)}function Z(e){let{h:t,a:n}=Bt(e);return zt(t,.95,.65,Math.min(n,Ft))}function Q(e){let{neon:t}=Bt(e);return t}var Ht=class{constructor(e){this.inner=e}createGroup(e,t){return this.inner.createGroup(e,t)}addRect(e,t){if(t.stroke){let n=(t.strokeWidth??1)*It;this.inner.addRect(e,{...t,fill:void 0,stroke:Z(t.stroke),strokeWidth:n})}this.inner.addRect(e,{...t,fill:t.fill?Vt(t.fill):void 0,stroke:t.stroke?Q(t.stroke):void 0})}addCircle(e,t){if(t.stroke){let n=(t.strokeWidth??1)*It;this.inner.addCircle(e,{...t,fill:void 0,stroke:Z(t.stroke),strokeWidth:n})}this.inner.addCircle(e,{...t,fill:t.fill?Vt(t.fill):void 0,stroke:t.stroke?Q(t.stroke):void 0})}addLine(e,t){if(t.stroke){let n=(t.strokeWidth??1)*It;this.inner.addLine(e,{...t,stroke:Z(t.stroke),strokeWidth:n,alpha:Ft})}this.inner.addLine(e,{...t,stroke:t.stroke?Q(t.stroke):void 0})}addPolygon(e,t){this.inner.addPolygon(e,{...t,fill:t.fill?Vt(t.fill):void 0,stroke:t.stroke?Q(t.stroke):void 0})}addText(e,t){this.inner.addText(e,{...t,fill:Pt})}addImage(e,t){this.inner.addImage(e,t)}getExitDepthOffset(){return this.inner.getExitDepthOffset()}getTransform(){return this.inner.getTransform()}getInverseTransform(){return this.inner.getInverseTransform()}};function Ut(e){let t=e*Math.PI/180,n=Math.cos(t),r=Math.sin(t);return(e,t)=>[e*n-t*r,(e*r+t*n)*.5]}function Wt(e){let t=e*Math.PI/180,n=Math.cos(t),r=Math.sin(t);return(e,t)=>[e*n+2*t*r,-e*r+2*t*n]}var $=32,Gt=class{constructor(e,t){if(this.inner=e,typeof t==`number`)this.depth=t,this.iso=Ut(0),this.isoInv=Wt(0);else{let e=t?.rotation??0;this.depth=t?.depth??.18,this.iso=Ut(e),this.isoInv=Wt(e)}}ix(e,t){return this.iso(e,t)[0]}iy(e,t){return this.iso(e,t)[1]}isoFlatPoints(e){let t=Array(e.length);for(let n=0;n<e.length;n+=2){let[r,i]=this.iso(e[n],e[n+1]);t[n]=r,t[n+1]=i}return t}rectToDiamond(e,t,n,r){let i=this.iso,[a,o]=i(e,t),[s,c]=i(e+n,t),[l,u]=i(e+n,t+r),[d,f]=i(e,t+r);return[a,o,s,c,l,u,d,f]}createGroup(e,t){let[n,r]=this.iso(e,t);return this.inner.createGroup(n,r)}addRect(e,t){let{x:n,y:r,width:i,height:a,fill:o,stroke:s,strokeWidth:c}=t,l=this.rectToDiamond(n,r,i,a);if(t.dash||t.dashEnabled){for(let n=0;n<8;n+=2){let r=(n+2)%8;this.inner.addLine(e,{points:[l[n],l[n+1],l[r],l[r+1]],stroke:s,strokeWidth:c,dash:t.dash})}return}if(this.depth>0&&o){let t=this.depth,n=0;for(let e=1;e<4;e++)l[e*2+1]>l[n*2+1]&&(n=e);let r=l[n*2],i=l[n*2+1],a=(n+3)%4,u=l[a*2],d=l[a*2+1],f=(n+1)%4,p=l[f*2],m=l[f*2+1],g=(n+2)%4,_=l[g*2],v=l[g*2+1];if(this.inner.addPolygon(e,{vertices:[u,d,r,i,r,i+t,u,d+t],fill:h(o,.2)}),this.inner.addPolygon(e,{vertices:[r,i,p,m,p,m+t,r,i+t],fill:h(o,.4)}),this.inner.addPolygon(e,{vertices:l,fill:o}),s&&c){let n=c;this.inner.addLine(e,{points:[_,v,u,d],stroke:s,strokeWidth:n}),this.inner.addLine(e,{points:[p,m,_,v],stroke:s,strokeWidth:n}),this.inner.addLine(e,{points:[u,d,u,d+t],stroke:s,strokeWidth:n}),this.inner.addLine(e,{points:[p,m,p,m+t],stroke:s,strokeWidth:n}),this.inner.addLine(e,{points:[u,d+t,r,i+t],stroke:s,strokeWidth:n}),this.inner.addLine(e,{points:[r,i+t,p,m+t],stroke:s,strokeWidth:n})}return}this.inner.addPolygon(e,{vertices:l,fill:o,stroke:s,strokeWidth:c})}addCircle(e,t){let{cx:n,cy:r,radius:i,fill:a,stroke:o,strokeWidth:s}=t,c=Array($*2);for(let e=0;e<$;e++){let t=e/$*Math.PI*2,a=n+Math.cos(t)*i,o=r+Math.sin(t)*i,[s,l]=this.iso(a,o);c[e*2]=s,c[e*2+1]=l}if(t.dash||t.dashEnabled){for(let n=0;n<$;n++){let r=(n+1)%$;this.inner.addLine(e,{points:[c[n*2],c[n*2+1],c[r*2],c[r*2+1]],stroke:o,strokeWidth:s,dash:t.dash})}return}if(this.depth>0&&a){let t=this.depth,n=0,r=0,i=0,l=-1/0,u=1/0,d=-1/0;for(let e=0;e<$;e++)c[e*2]>l&&(l=c[e*2],n=e),c[e*2]<u&&(u=c[e*2],r=e),c[e*2+1]>d&&(d=c[e*2+1],i=e);let f=[],p=n;for(let e=0;e<=$&&(f.push(c[p*2],c[p*2+1]),p!==i);e++)p=(p+1)%$;for(let e=f.length-2;e>=0;e-=2)f.push(f[e],f[e+1]+t);this.inner.addPolygon(e,{vertices:f,fill:h(a,.2),stroke:o,strokeWidth:s?s*.5:void 0});let m=[];p=i;for(let e=0;e<=$&&(m.push(c[p*2],c[p*2+1]),p!==r);e++)p=(p+1)%$;for(let e=m.length-2;e>=0;e-=2)m.push(m[e],m[e+1]+t);this.inner.addPolygon(e,{vertices:m,fill:h(a,.4),stroke:o,strokeWidth:s?s*.5:void 0})}this.inner.addPolygon(e,{vertices:c,fill:a,stroke:o,strokeWidth:s})}addLine(e,t){this.inner.addLine(e,{...t,points:this.isoFlatPoints(t.points)})}addPolygon(e,t){this.inner.addPolygon(e,{...t,vertices:this.isoFlatPoints(t.vertices)})}isoAffine(e,t,n,r){let[i,a]=this.iso(e,t),[o,s]=this.iso(e+n,t),[c,l]=this.iso(e,t+r);return[(o-i)/n,(s-a)/n,(c-i)/r,(l-a)/r,i,a]}addText(e,t){let n=t.width??0,r=t.height??0;if(n>0&&r>0)this.inner.addText(e,{...t,x:0,y:0,transform:this.isoAffine(t.x,t.y,n,r)});else{let[n,r]=this.iso(t.x,t.y);this.inner.addText(e,{...t,x:n,y:r})}}addImage(e,t){this.inner.addImage(e,{...t,x:0,y:0,transform:this.isoAffine(t.x,t.y,t.width,t.height)})}getTransform(){let e=this.iso;return(t,n)=>{let[r,i]=e(t,n);return{x:r,y:i}}}getInverseTransform(){let e=this.isoInv;return(t,n)=>{let[r,i]=e(t,n);return{x:r,y:i}}}getExitDepthOffset(){if(this.depth<=0)return this.inner.getExitDepthOffset();let[e,t]=this.isoInv(0,this.depth),n=this.inner.getExitDepthOffset();return{x:e+n.x,y:t+n.y}}},Kt={rgb:[114,1,0],rgbValue:`rgb(114, 1, 0)`,symbolColor:[225,225,225],symbolColorValue:`rgb(225,225,225)`};function qt(e){let t=e[0]/255,n=e[1]/255,r=e[2]/255;return(Math.max(t,n,r)+Math.min(t,n,r))/2}var Jt=class{constructor(e,t){this.rooms={},this.areas={},this.areaSources={},this.explorationEnabled=!1,this.colors={},e.forEach(e=>{e.rooms.forEach(e=>{e.y=-e.y,this.rooms[e.id]=e});let t=parseInt(e.areaId);this.areas[t]=new V(e),this.areaSources[t]=e}),this.colors=t.reduce((e,t)=>({...e,[t.envId]:{rgb:t.colors,rgbValue:`rgb(${t.colors.join(`,`)})`,symbolColor:qt(t.colors)>.41?[25,25,25]:[225,255,255],symbolColorValue:qt(t.colors)>.41?`rgb(25,25,25)`:`rgb(225,255,255)`}}),{})}getArea(e){return this.areas[e]}getExplorationArea(e){let t=this.areas[e];if(t instanceof H)return t}getAreas(){return Object.values(this.areas)}getRooms(){return Object.values(this.rooms)}getRoom(e){return this.rooms[e]}ensureVisitedRooms(){return this.visitedRooms||=new Set,this.visitedRooms}applyExplorationDecoration(){this.visitedRooms&&Object.entries(this.areaSources).forEach(([e,t])=>{let n=parseInt(e,10);this.areas[n]=new H(t,this.visitedRooms)})}decorateWithExploration(e){return e===void 0?this.ensureVisitedRooms():this.setVisitedRooms(e),this.applyExplorationDecoration(),this.explorationEnabled=!0,this.visitedRooms}getVisitedRooms(){return this.visitedRooms}clearExplorationDecoration(){Object.entries(this.areaSources).forEach(([e,t])=>{let n=parseInt(e,10);this.areas[n]=new V(t)}),this.explorationEnabled=!1}isExplorationEnabled(){return this.explorationEnabled}setVisitedRooms(e){return this.visitedRooms=e instanceof Set?e:new Set(e),this.explorationEnabled&&this.applyExplorationDecoration(),this.visitedRooms}addVisitedRoom(e){if(this.explorationEnabled){let t=this.getRoom(e);if(t){let n=this.getExplorationArea(t.area);if(n)return n.addVisitedRoom(e)}}let t=this.ensureVisitedRooms(),n=t.has(e);return t.add(e),!n}addVisitedRooms(e){let t=this.ensureVisitedRooms(),n=0;for(let r of e){if(this.explorationEnabled){let e=this.getRoom(r);if(e){let t=this.getExplorationArea(e.area);if(t){t.addVisitedRoom(r)&&n++;continue}}}let e=t.has(r);t.add(r),e||n++}return n}hasVisitedRoom(e){return this.visitedRooms?.has(e)??!1}getColorValue(e){return this.colors[e]?.rgbValue??Kt.rgbValue}getSymbolColor(e,t){let n=this.colors[e]?.symbolColor??Kt.symbolColor,r=Math.min(Math.max(t??1,0),1),i=n.join(`,`);return r==1?`rgba(${i})`:`rgba(${i}, ${r})`}},Yt=o(((e,t)=>{t.exports=class{constructor(){this.keys=new Set,this.queue=[]}sort(){this.queue.sort((e,t)=>e.priority-t.priority)}set(e,t){let n=Number(t);if(isNaN(n))throw TypeError(`"priority" must be a number`);return this.keys.has(e)?this.queue.map(t=>(t.key===e&&Object.assign(t,{priority:n}),t)):(this.keys.add(e),this.queue.push({key:e,priority:n})),this.sort(),this.queue.length}next(){let e=this.queue.shift();return this.keys.delete(e.key),e}isEmpty(){return this.queue.length===0}has(e){return this.keys.has(e)}get(e){return this.queue.find(t=>t.key===e)}}})),Xt=o(((e,t)=>{function n(e,t){let r=new Map;for(let[i,a]of e)i!==t&&a instanceof Map?r.set(i,n(a,t)):i!==t&&r.set(i,a);return r}t.exports=n})),Zt=o(((e,t)=>{function n(e){let t=Number(e);return!(isNaN(t)||t<=0)}function r(e){let t=new Map;return Object.keys(e).forEach(i=>{let a=e[i];if(typeof a==`object`&&a&&!Array.isArray(a))return t.set(i,r(a));if(!n(a))throw Error(`Could not add node at key "${i}", make sure it's a valid node`,a);return t.set(i,Number(a))}),t}t.exports=r})),Qt=o(((e,t)=>{function n(e){if(!(e instanceof Map))throw Error(`Invalid graph: Expected Map instead found ${typeof e}`);e.forEach((e,t)=>{if(typeof e==`object`&&e instanceof Map){n(e);return}if(typeof e!=`number`||e<=0)throw Error(`Values must be numbers greater than 0. Found value ${e} at ${t}`)})}t.exports=n})),$t=c(o(((e,t)=>{var n=Yt(),r=Xt(),i=Zt(),a=Qt();t.exports=class{constructor(e){e instanceof Map?(a(e),this.graph=e):e?this.graph=i(e):this.graph=new Map}addNode(e,t){let n;return t instanceof Map?(a(t),n=t):n=i(t),this.graph.set(e,n),this}addVertex(e,t){return this.addNode(e,t)}removeNode(e){return this.graph=r(this.graph,e),this}path(e,t,r={}){if(!this.graph.size)return r.cost?{path:null,cost:0}:null;let i=new Set,a=new n,o=new Map,s=[],c=0,l=[];if(r.avoid&&(l=[].concat(r.avoid)),l.includes(e))throw Error(`Starting node (${e}) cannot be avoided`);if(l.includes(t))throw Error(`Ending node (${t}) cannot be avoided`);for(a.set(e,0);!a.isEmpty();){let e=a.next();if(e.key===t){c=e.priority;let t=e.key;for(;o.has(t);)s.push(t),t=o.get(t);break}i.add(e.key),(this.graph.get(e.key)||new Map).forEach((t,n)=>{if(i.has(n)||l.includes(n))return null;if(!a.has(n))return o.set(n,e.key),a.set(n,e.priority+t);let r=a.get(n).priority,s=e.priority+t;return s<r?(o.set(n,e.key),a.set(n,s)):null})}return s.length?(r.trim?s.shift():s=s.concat([e]),r.reverse||(s=s.reverse()),r.cost?{path:s,cost:c}:s):r.cost?{path:null,cost:0}:null}shortestPath(...e){return this.path(...e)}}}))(),1),en={1:`north`,2:`northeast`,3:`northwest`,4:`east`,5:`west`,6:`south`,7:`southeast`,8:`southwest`,9:`up`,10:`down`,11:`in`,12:`out`},tn={north:`n`,northeast:`ne`,northwest:`nw`,east:`e`,west:`w`,south:`s`,southeast:`se`,southwest:`sw`,up:`up`,down:`down`,in:`in`,out:`out`},nn=class{constructor(e){this.mapReader=e,this.data=this.buildGraph()}getAdj(){return this.data.adj}getGraphDefinition(){return this.data.graphDefinition}getMaxEdgeDistance(){return this.data.maxEdgeDistance}getMinEdgeWeight(){return this.data.minEdgeWeight}getRoom(e){return this.mapReader.getRoom(e)}resolveEdgeWeight(e,t,n){let r=e.exitWeights?.[t];return r!==void 0&&r>0?r:Math.max(n.weight,1)}buildGraph(){let e=new Map,t={},n=1,r=1/0;return this.mapReader.getRooms().forEach(i=>{let a=[],o={},s=new Set((i.exitLocks??[]).map(e=>en[e]).filter(e=>!!e)),c=new Set(i.mSpecialExitLocks??[]);Object.entries(i.exits??{}).forEach(([e,t])=>{if(s.has(e))return;let c=this.mapReader.getRoom(t);if(c){let s=tn[e]??e,l=this.resolveEdgeWeight(i,s,c);a.push({id:t,weight:l}),o[t.toString()]=l,l<r&&(r=l);let u=c.x-i.x,d=c.y-i.y,f=c.z-i.z,p=Math.sqrt(u*u+d*d+f*f);p>n&&(n=p)}}),Object.entries(i.specialExits??{}).forEach(([e,t])=>{if(c.has(t))return;let s=this.mapReader.getRoom(t);if(s){let c=this.resolveEdgeWeight(i,e,s);a.push({id:t,weight:c}),o[t.toString()]=c,c<r&&(r=c);let l=s.x-i.x,u=s.y-i.y,d=s.z-i.z,f=Math.sqrt(l*l+u*u+d*d);f>n&&(n=f)}}),e.set(i.id,a),t[i.id.toString()]=o}),isFinite(r)||(r=1),{adj:e,graphDefinition:t,maxEdgeDistance:n,minEdgeWeight:r}}};function rn(e,t){e.push(t);let n=e.length-1;for(;n>0;){let t=n-1>>1;if(e[t].priority<=e[n].priority)break;[e[t],e[n]]=[e[n],e[t]],n=t}}function an(e){if(e.length===0)return;let t=e[0],n=e.pop();if(e.length>0){e[0]=n;let t=0,r=e.length;for(;;){let n=t,i=2*t+1,a=2*t+2;if(i<r&&e[i].priority<e[n].priority&&(n=i),a<r&&e[a].priority<e[n].priority&&(n=a),n===t)break;[e[t],e[n]]=[e[n],e[t]],t=n}}return t}function on(e,t,n){let r=[n],i=n;for(;i!==t;)i=e.get(i),r.push(i);return r.reverse(),r}function sn(e,t,n){let r=e.path(t.toString(),n.toString()),i=Array.isArray(r)?r:r?.path;return i?i.map(e=>Number(e)):null}function cn(e,t,n,r){let i=r.getRoom(n);if(!i)return null;let a=i.x,o=i.y,s=i.z,c=r.getMaxEdgeDistance(),l=r.getMinEdgeWeight(),u=e=>{let t=r.getRoom(e);if(!t)return 0;let n=t.x-a,i=t.y-o,u=t.z-s;return Math.sqrt(n*n+i*i+u*u)/c*l},d=new Map,f=new Map,p=[];for(d.set(t,0),rn(p,{id:t,priority:u(t)});p.length>0;){let{id:r}=an(p);if(r===n)return on(f,t,n);let i=d.get(r)??1/0,a=e.get(r);if(a)for(let e of a){let t=i+e.weight;t<(d.get(e.id)??1/0)&&(d.set(e.id,t),f.set(e.id,r),rn(p,{id:e.id,priority:t+u(e.id)}))}}return null}var ln=class{constructor(e,t=`dijkstra`){this.cache=new Map,this._algorithm=t,this.mapGraph=new nn(e),this.dijkstraGraph=new $t.default(this.mapGraph.getGraphDefinition())}get algorithm(){return this._algorithm}setAlgorithm(e){e!==this._algorithm&&(this._algorithm=e,this.cache.clear())}findPath(e,t){let n=`${e}->${t}`;if(this.cache.has(n))return this.cache.get(n);if(e===t){let t=this.mapGraph.getRoom(e)?[e]:null;return this.cache.set(n,t),t}if(!this.mapGraph.getRoom(e)||!this.mapGraph.getRoom(t))return this.cache.set(n,null),null;let r;switch(this._algorithm){case`dijkstra`:r=sn(this.dijkstraGraph,e,t);break;case`astar`:r=cn(this.mapGraph.getAdj(),e,t,this.mapGraph);break}return this.cache.set(n,r),r}},un={1:`north`,2:`northeast`,3:`northwest`,4:`east`,5:`west`,6:`south`,7:`southeast`,8:`southwest`,9:`up`,10:`down`,11:`in`,12:`out`};function dn(){return{areaWidth:150,areaHeight:80,areaSpacing:50,fontSize:14,connectionLineWidth:2,areaFillColor:`#2a2a3e`,areaStrokeColor:`#4a4a6e`,textColor:`#e0e0e0`,connectionColor:`#6a6a8e`,highlightColor:`#ff9900`}}var fn=class{constructor(e,t,n){this.areaNodes=new Map,this.connectionGroups=[],this.currentZoom=1,this.domainInfo=new Map,this.domainFilter=`all`,this.dotsMode=!1,this.settings=n??dn(),this.stage=new l.default.Stage({container:e,width:e.clientWidth,height:e.clientHeight,draggable:!0}),this.backgroundLayer=new l.default.Layer({listening:!1}),this.stage.add(this.backgroundLayer),this.connectionLayer=new l.default.Layer({listening:!1}),this.stage.add(this.connectionLayer),this.areaLayer=new l.default.Layer,this.stage.add(this.areaLayer),this.mapReader=t,this.initScaling(),this.initResize(e)}initResize(e){new ResizeObserver(()=>{this.stage.width(e.clientWidth),this.stage.height(e.clientHeight),this.stage.batchDraw()}).observe(e)}initScaling(){let e=1.1;this.stage.on(`wheel`,t=>{t.evt.preventDefault();let n=this.stage.scaleX(),r=this.stage.getPointerPosition();if(!r)return;let i={x:(r.x-this.stage.x())/n,y:(r.y-this.stage.y())/n},a=(t.evt.deltaY>0?-1:1)>0?this.currentZoom*e:this.currentZoom/e;if(this.setZoom(a)){let e=this.stage.scaleX(),t={x:r.x-i.x*e,y:r.y-i.y*e};this.stage.position(t),this.stage.batchDraw()}})}setZoom(e){let t=Math.max(.1,Math.min(5,e));return this.currentZoom===t?!1:(this.currentZoom=t,this.stage.scale({x:this.currentZoom,y:this.currentZoom}),!0)}getZoom(){return this.currentZoom}setDomainInfo(e){this.domainInfo.clear();for(let[t,n]of Object.entries(e))this.domainInfo.set(Number(t),n)}setDomainFilter(e){this.domainFilter=e}getDomainFilter(){return this.domainFilter}setBackgroundImage(e){this.backgroundConfig={url:e.url,x:e.x,y:e.y,width:e.width,height:e.height,opacity:e.opacity??.3}}clearBackgroundImage(){this.backgroundConfig=void 0,this.backgroundImage=void 0,this.backgroundLayer.destroyChildren(),this.backgroundLayer.batchDraw()}redrawBackground(){this.drawBackground()}setDotsMode(e){this.dotsMode=e}getDotsMode(){return this.dotsMode}redraw(){this.drawBackground(),this.drawConnections(),this.drawAreas(),this.stage.batchDraw()}isAreaInDomain(e){let t=this.domainInfo.get(e);if(!t)return this.domainFilter===`interdomain`||this.domainFilter===`all`;switch(this.domainFilter){case`ishtar`:return t.isIshtar;case`empire`:return t.isEmpire;case`interdomain`:return!t.isIshtar&&!t.isEmpire;case`all`:return!0}}areAreasInSameDomain(e,t){let n=this.domainInfo.get(e),r=this.domainInfo.get(t);return!n||!r?!1:n.isIshtar&&r.isIshtar||n.isEmpire&&r.isEmpire?!0:!n.isIshtar&&!n.isEmpire&&!r.isIshtar&&!r.isEmpire}render(){this.analyzeConnections(),this.layoutAreas(),this.drawBackground(),this.drawConnections(),this.drawAreas(),this.centerView(),this.stage.batchDraw()}drawBackground(){if(this.backgroundLayer.destroyChildren(),!this.backgroundConfig)return;let e=new Image;e.crossOrigin=`anonymous`,e.onload=()=>{this.backgroundImage=new l.default.Image({x:this.backgroundConfig.x,y:this.backgroundConfig.y,image:e,width:this.backgroundConfig.width,height:this.backgroundConfig.height,opacity:this.backgroundConfig.opacity,listening:!1}),this.backgroundLayer.add(this.backgroundImage),this.backgroundLayer.batchDraw()},e.onerror=()=>{console.error(`Failed to load background image:`,this.backgroundConfig?.url)},e.src=this.backgroundConfig.url}analyzeConnections(){this.areaNodes.clear(),this.connectionGroups=[];let e=this.mapReader.getRooms(),t=this.mapReader.getAreas(),n=new Map;for(let e of t){let t=e.getAreaId(),r=e.getRooms();if(r.length===0)continue;let i=1/0,a=-1/0,o=1/0,s=-1/0,c=0;for(let e of r)e.z===0&&(c++,i=Math.min(i,e.x),a=Math.max(a,e.x),o=Math.min(o,e.y),s=Math.max(s,e.y));if(c===0)for(let e of r)i=Math.min(i,e.x),a=Math.max(a,e.x),o=Math.min(o,e.y),s=Math.max(s,e.y);let l=(i+a)/2,u=(o+s)/2;n.set(t,{minX:i,maxX:a,minY:o,maxY:s,centerX:l,centerY:u,roomCount:r.length})}let r=1;for(let e of n.values()){let t=e.maxX-e.minX,n=e.maxY-e.minY;r=Math.max(r,t,n)}let i=200/r;for(let e of t){let t=e.getAreaId(),r=n.get(t);if(!r||!this.isAreaInDomain(t))continue;let a=r.maxX-r.minX,o=r.maxY-r.minY,s=Math.max(100,a*i),c=Math.max(100,o*i),l=s/c;l>3?c=s/3:l<1/3&&(s=c/3),this.areaNodes.set(t,{areaId:t,name:e.getAreaName(),x:0,y:0,width:s,height:c,connections:[],roomCount:r.roomCount,realCenterX:r.centerX,realCenterY:r.centerY})}let a=new Map;for(let t of e){let e=t.area;if(!this.areaNodes.has(e))continue;let n=this.getLockedDirections(t),r=new Set(t.mSpecialExitLocks??[]);for(let[r,i]of Object.entries(t.exits??{})){if(n.has(r))continue;let o=this.mapReader.getRoom(i);if(!o||o.area===e||!this.areaNodes.has(o.area)||!this.areAreasInSameDomain(e,o.area))continue;let s=this.createConnection(t,o,r);s&&this.addConnection(a,s)}for(let[n,i]of Object.entries(t.specialExits??{})){if(r.has(i))continue;let o=this.mapReader.getRoom(i);if(!o||o.area===e||!this.areaNodes.has(o.area)||!this.areAreasInSameDomain(e,o.area))continue;let s=this.parseDirection(n),c=this.createConnection(t,o,s);c&&this.addConnection(a,c)}}for(let[e,t]of a){let[n,r]=e.split(`-`).map(Number),i=this.createConnectionGroup(n,r,t);this.connectionGroups.push(i);let a=this.areaNodes.get(n),o=this.areaNodes.get(r);if(a&&a.connections.push(...t),o)for(let e of t)o.connections.push({...e,fromAreaId:e.toAreaId,toAreaId:e.fromAreaId,fromRoomId:e.toRoomId,toRoomId:e.fromRoomId,direction:e.direction?ce[e.direction]:null,fromRoomPosition:e.toRoomPosition,toRoomPosition:e.fromRoomPosition})}}getLockedDirections(e){return new Set((e.exitLocks??[]).map(e=>un[e]).filter(e=>!!e))}createConnection(e,t,n){let r=this.toPlanarDirection(n);return{fromAreaId:e.area,toAreaId:t.area,fromRoomId:e.id,toRoomId:t.id,direction:r,fromRoomPosition:{x:e.x,y:e.y},toRoomPosition:{x:t.x,y:t.y}}}addConnection(e,t){let n=t.fromAreaId<t.toAreaId?`${t.fromAreaId}-${t.toAreaId}`:`${t.toAreaId}-${t.fromAreaId}`;e.has(n)||e.set(n,[]),e.get(n).push(t)}createConnectionGroup(e,t,n){let r=new Map,i=0,a=0;for(let e of n)e.direction&&r.set(e.direction,(r.get(e.direction)??0)+1),i+=e.toRoomPosition.x-e.fromRoomPosition.x,a+=e.toRoomPosition.y-e.fromRoomPosition.y;let o=null,s=0;for(let[e,t]of r)t>s&&(s=t,o=e);return{fromAreaId:e,toAreaId:t,connections:n,primaryDirection:o,averageOffset:{x:i/n.length,y:a/n.length}}}parseDirection(e){return{n:`north`,north:`north`,s:`south`,south:`south`,e:`east`,east:`east`,w:`west`,west:`west`,ne:`northeast`,northeast:`northeast`,nw:`northwest`,northwest:`northwest`,se:`southeast`,southeast:`southeast`,sw:`southwest`,southwest:`southwest`,u:`up`,up:`up`,d:`down`,down:`down`,i:`in`,in:`in`,o:`out`,out:`out`}[e.toLowerCase().trim()]??null}toPlanarDirection(e){return e&&se.includes(e)?e:null}layoutAreas(){if(Array.from(this.areaNodes.values()).length===0)return;let e=this.findConnectedComponents(),t=0,n=this.settings.areaWidth*3;for(let r of e)if(r.length===1){let e=this.areaNodes.get(r[0]);e&&(e.x=t,e.y=0),t+=this.settings.areaWidth+n}else{let e=this.forceDirectedLayout(r);for(let n of r){let r=this.areaNodes.get(n);r&&isFinite(e.minX)&&isFinite(e.minY)&&(r.x-=e.minX,r.x+=t,r.y-=e.minY)}let i=isFinite(e.maxX-e.minX)?e.maxX-e.minX:this.settings.areaWidth;t+=i+n}}findConnectedComponents(){let e=new Set,t=[];for(let[n]of this.areaNodes){if(e.has(n))continue;let r=[],i=[n];for(;i.length>0;){let t=i.shift();if(e.has(t))continue;e.add(t),r.push(t);let n=this.areaNodes.get(t);if(n)for(let t of n.connections)e.has(t.toAreaId)||i.push(t.toAreaId)}t.push(r)}return t}forceDirectedLayout(e){let t=new Map;for(let n of e){let e=this.areaNodes.get(n);if(!e)continue;let r=new Set(e.connections.map(e=>e.toAreaId));t.set(n,r)}let n=new Set,r=new Set;for(let[e,r]of t)r.size>=3&&n.add(e);for(let[e,i]of t){if(n.has(e)||r.has(e)||i.size>2)continue;let a=[e];r.add(e);let o=Array.from(i);for(let i of o){let o=i,s=e;for(;o&&!r.has(o)&&!n.has(o);){let e=t.get(o);if(!e)break;if(e.size>=3){n.add(o);break}a.push(o),r.add(o);let i=!1;for(let t of e)if(t!==s&&!r.has(t)){s=o,o=t,i=!0;break}if(!i)break}}let s=!1;for(let e of a){let r=t.get(e);if(r){for(let e of r)if(n.has(e)){s=!0;break}}if(s)break}if(!s&&a.length>0){let e=a[0],i=t.get(a[0])?.size??0;for(let n of a){let r=t.get(n)?.size??0;r>i&&(i=r,e=n)}n.add(e),r.delete(e)}}for(let r of e){let e=t.get(r);(!e||e.size===0)&&n.add(r)}let i=new Map,a=new Map;for(let e of n)i.set(e,e),a.set(e,[]);let o=new Set(n);for(let e of n){let n=t.get(e)??new Set;for(let r of n){if(o.has(r))continue;let n=[],s=r,c=e;for(;s&&!o.has(s);){n.push(s),i.set(s,e),o.add(s);let r=t.get(s)??new Set,a;for(let e of r)if(e!==c&&!o.has(e)){a=e;break}c=s,s=a}n.length>0&&a.get(e).push(n)}}let s=new Set,c=[],l=n.values().next().value,u=l===void 0?e[0]:l;if(u!==void 0){let e=this.areaNodes.get(u);e&&(e.x=0,e.y=0,s.add(u),c.push(u))}for(;c.length>0;){let e=c.shift(),t=this.areaNodes.get(e),r=new Map;for(let e of t.connections){let t=e.toAreaId;if(s.has(t)||!n.has(t))continue;let i=this.areaNodes.get(t);if(!i)continue;let a=e.direction??`none`;r.has(a)||r.set(a,[]),r.get(a).push({id:t,node:i,conn:e})}for(let[e,n]of r){let r=this.getDirectionOffset(e===`none`?null:e);n.sort((e,t)=>Math.abs(r.x)>Math.abs(r.y)?t.node.realCenterY-e.node.realCenterY:e.node.realCenterX-t.node.realCenterX);let i=this.settings.areaWidth+this.settings.areaSpacing,a=this.settings.areaHeight+this.settings.areaSpacing;n.forEach((e,o)=>{if(e.node.x=t.x+r.x*i,e.node.y=t.y+r.y*a,n.length>1){let t=(o-(n.length-1)/2)*.5;Math.abs(r.x)>Math.abs(r.y)?e.node.y+=t*a:e.node.x+=t*i}s.add(e.id),c.push(e.id)})}}let d=Array.from(n);d.length>1&&this.applyForces(d,80);let f=this.settings.areaWidth+this.settings.areaSpacing+30,p=this.settings.areaHeight+this.settings.areaSpacing+30,m=new Map,h=[`east`,`west`,`north`,`south`,`northeast`,`northwest`,`southeast`,`southwest`];for(let[e,t]of a){let n=this.areaNodes.get(e);if(!n)continue;let r=0,i=new Map;for(let a of t){let t=e,o=n.x,s=n.y,c=null;for(let l of a){let a=this.areaNodes.get(l);if(!a)continue;let u=this.areaNodes.get(t),d=null;if(u){for(let e of u.connections)if(e.toAreaId===l){d=e.direction;break}}!d&&t===e?(c=h[r%h.length],r++,d=c):!d&&c&&(d=c);let g=this.getDirectionOffset(d),_=0;if(t===e&&d){let e=d,t=i.get(e)??0;i.set(e,t+1),_=t}if(a.x=o+g.x*f,a.y=s+g.y*p,_>0){let e=1.2;g.x!==0&&g.y===0?a.y+=_*p*e:g.y!==0&&g.x===0?a.x+=_*f*e:(a.x+=_*f*e,a.y-=_*p*e)}m.set(l,{dx:a.x-n.x,dy:a.y-n.y,hubId:e}),t=l,o=a.x,s=a.y}}}let g=new Map,_=new Map;for(let e of n){let t=this.areaNodes.get(e);if(!t)continue;let n=t.x,r=t.y,i=t.x+t.width,o=t.y+t.height,s=a.get(e)??[];for(let e of s)for(let t of e){let e=this.areaNodes.get(t);e&&(n=Math.min(n,e.x),r=Math.min(r,e.y),i=Math.max(i,e.x+e.width),o=Math.max(o,e.y+e.height))}g.set(e,{minX:n,minY:r,maxX:i,maxY:o}),_.set(e,{dx:n-t.x,dy:r-t.y})}this.applyClusterForces(d,g,_,60);for(let[e,t]of m){let n=this.areaNodes.get(e),r=this.areaNodes.get(t.hubId);!n||!r||(n.x=r.x+t.dx,n.y=r.y+t.dy)}let v=1/0,y=1/0,b=-1/0,x=-1/0;for(let t of e){let e=this.areaNodes.get(t);v=Math.min(v,e.x),y=Math.min(y,e.y),b=Math.max(b,e.x+e.width),x=Math.max(x,e.y+e.height)}return{minX:v,minY:y,maxX:b,maxY:x}}getDirectionOffset(e){let t={north:{x:0,y:-1},south:{x:0,y:1},east:{x:1,y:0},west:{x:-1,y:0},northeast:{x:.75,y:-.75},northwest:{x:-.75,y:-.75},southeast:{x:.75,y:.75},southwest:{x:-.75,y:.75}};return e&&t[e]?t[e]:{x:1,y:0}}applyClusterForces(e,t,n,r){let i=.8,a=new Map;for(let t of e)a.set(t,{vx:0,vy:0});for(let o=0;o<r;o++){for(let r of e){let e=this.areaNodes.get(r),i=t.get(r),a=n.get(r);if(!e||!i||!a)continue;let o=i.maxX-i.minX,s=i.maxY-i.minY;i.minX=e.x+a.dx,i.minY=e.y+a.dy,i.maxX=i.minX+o,i.maxY=i.minY+s}for(let n of e){let r=this.areaNodes.get(n),i=a.get(n),o=t.get(n);if(!(!r||!i||!o)){for(let r of e){if(n===r)continue;let e=t.get(r);if(!e)continue;let a=(o.minX+o.maxX)/2,s=(o.minY+o.maxY)/2,c=(e.minX+e.maxX)/2,l=(e.minY+e.maxY)/2,u=a-c,d=s-l,f=(o.maxX-o.minX)/2,p=(o.maxY-o.minY)/2,m=(e.maxX-e.minX)/2,h=(e.maxY-e.minY)/2,g=f+m+50,_=p+h+50,v=g-Math.abs(u),y=_-Math.abs(d);if(v>0&&y>0)if(v<y){let e=v*(u>=0?1:-1)*.5;i.vx+=e}else{let e=y*(d>=0?1:-1)*.5;i.vy+=e}}for(let t of r.connections){let n=this.areaNodes.get(t.toAreaId);if(!n||!e.includes(t.toAreaId))continue;let a=n.x-r.x,o=n.y-r.y,s=Math.sqrt(a*a+o*o)||1,c=(s-(this.settings.areaWidth+this.settings.areaSpacing+50))*.015;i.vx+=a/s*c,i.vy+=o/s*c}}}for(let t of e){let e=this.areaNodes.get(t),n=a.get(t);!e||!n||(e.x+=n.vx,e.y+=n.vy,n.vx*=i,n.vy*=i)}}}applyForces(e,t){let n=.8,r=this.settings.areaWidth+this.settings.areaSpacing,i=this.settings.areaWidth/2+60,a=new Set(e),o=[],s=new Set;for(let t of e){let e=this.areaNodes.get(t);if(e)for(let n of e.connections){if(!a.has(n.toAreaId))continue;let e=Math.min(t,n.toAreaId)+`-`+Math.max(t,n.toAreaId);s.has(e)||(s.add(e),o.push({from:t,to:n.toAreaId}))}}let c=new Map;for(let t of e)c.set(t,{vx:0,vy:0});for(let s=0;s<t;s++){for(let t of e){let n=this.areaNodes.get(t),s=c.get(t);if(!n||!s)continue;let l=n.x+n.width/2,u=n.y+n.height/2;for(let r of e){if(t===r)continue;let e=this.areaNodes.get(r);if(!e)continue;let i=(n.width+e.width)/2+20,a=(n.height+e.height)/2+20,o=n.x+n.width/2,c=n.y+n.height/2,l=e.x+e.width/2,u=e.y+e.height/2,d=o-l,f=c-u,p=i-Math.abs(d),m=a-Math.abs(f);p>0&&m>0&&(p<m?s.vx+=(d>=0?1:-1)*p*.5:s.vy+=(f>=0?1:-1)*m*.5)}for(let e of o){if(e.from===t||e.to===t)continue;let n=this.areaNodes.get(e.from),r=this.areaNodes.get(e.to);if(!n||!r)continue;let a=n.x+n.width/2,o=n.y+n.height/2,c=r.x+r.width/2,d=r.y+r.height/2,f=this.closestPointOnSegment(l,u,a,o,c,d),p=l-f.x,m=u-f.y,h=Math.sqrt(p*p+m*m)||1;if(h<i){let e=(i-h)*.6;s.vx+=p/h*e,s.vy+=m/h*e}}for(let e of n.connections){if(!a.has(e.toAreaId))continue;let t=this.areaNodes.get(e.toAreaId);if(!t)continue;let i=t.x-n.x,o=t.y-n.y,l=Math.sqrt(i*i+o*o)||1,u=(l-r)*.03;s.vx+=i/l*u,s.vy+=o/l*u;let d=this.getDirectionOffset(e.direction),f=n.x+d.x*r,p=n.y+d.y*r,m=c.get(e.toAreaId);m&&(m.vx+=(f-t.x)*.01,m.vy+=(p-t.y)*.01)}}for(let t of e){let e=this.areaNodes.get(t),r=c.get(t);!e||!r||(e.x+=r.vx,e.y+=r.vy,r.vx*=n,r.vy*=n)}}}closestPointOnSegment(e,t,n,r,i,a){let o=i-n,s=a-r,c=e-n,l=t-r,u=o*o+s*s;if(u===0)return{x:n,y:r};let d=(c*o+l*s)/u;return d=Math.max(0,Math.min(1,d)),{x:n+d*o,y:r+d*s}}edgesIntersect(e,t,n,r,i,a,o,s){let c=(e,t,n,r,i,a)=>(a-t)*(n-e)>(r-t)*(i-e);return c(e,t,i,a,o,s)!==c(n,r,i,a,o,s)&&c(e,t,n,r,i,a)!==c(e,t,n,r,o,s)}drawConnections(){this.connectionLayer.destroyChildren();for(let e of this.connectionGroups){let t=this.areaNodes.get(e.fromAreaId),n=this.areaNodes.get(e.toAreaId);if(!t||!n||!isFinite(t.x)||!isFinite(t.y)||!isFinite(n.x)||!isFinite(n.y))continue;let r={x:t.x+t.width/2,y:t.y+t.height/2},i={x:n.x+n.width/2,y:n.y+n.height/2},a,o;if(this.dotsMode?(a=r,o=i):(a=this.getEdgePoint(t,i),o=this.getEdgePoint(n,r)),!isFinite(a.x)||!isFinite(a.y)||!isFinite(o.x)||!isFinite(o.y))continue;let s=this.dotsMode?`#ffffff`:this.settings.connectionColor,c=this.dotsMode?1:Math.min(this.settings.connectionLineWidth,1+e.connections.length*.5),u=new l.default.Line({points:[a.x,a.y,o.x,o.y],stroke:s,strokeWidth:c,lineCap:`round`,listening:!1});this.connectionLayer.add(u)}}getEdgePoint(e,t){let n=e.x+e.width/2,r=e.y+e.height/2,i=t.x-n,a=t.y-r,o=e.width/2,s=e.height/2;if(i===0&&a===0)return{x:n,y:r};let c=Math.abs(i),l=Math.abs(a),u;return u=c/o>l/s?o/c:s/l,{x:n+i*u,y:r+a*u}}drawAreas(){this.areaLayer.destroyChildren();for(let[,e]of this.areaNodes){if(!isFinite(e.x)||!isFinite(e.y))continue;let t=e.areaId===this.highlightedArea;if(this.dotsMode){let n=e.x+e.width/2,r=e.y+e.height/2,i=new l.default.Group({x:n,y:r,draggable:!0}),a=new l.default.Circle({radius:6,fill:t?this.settings.highlightColor:`#ffffff`,stroke:t?this.settings.highlightColor:`#ffffff`,strokeWidth:1}),o=new l.default.Text({text:e.name,fontSize:10,fill:`#ffffff`,x:10,y:-5});i.add(a),i.add(o),i.on(`click tap`,()=>{this.emitAreaClickEvent(e.areaId)}),i.on(`mouseenter`,()=>{this.stage.container().style.cursor=`pointer`,a.fill(this.settings.highlightColor),a.stroke(this.settings.highlightColor),this.areaLayer.batchDraw()}),i.on(`mouseleave`,()=>{this.stage.container().style.cursor=`auto`,a.fill(t?this.settings.highlightColor:`#ffffff`),a.stroke(t?this.settings.highlightColor:`#ffffff`),this.areaLayer.batchDraw()}),i.on(`dragmove`,()=>{e.x=i.x()-e.width/2,e.y=i.y()-e.height/2,this.drawConnections(),this.connectionLayer.batchDraw()}),i.on(`dragstart`,()=>{this.stage.container().style.cursor=`grabbing`}),i.on(`dragend`,()=>{this.stage.container().style.cursor=`pointer`}),this.areaLayer.add(i)}else{let n=new l.default.Group({x:e.x,y:e.y,draggable:!0}),r=new l.default.Rect({width:e.width,height:e.height,fill:this.settings.areaFillColor,stroke:t?this.settings.highlightColor:this.settings.areaStrokeColor,strokeWidth:t?3:2,cornerRadius:8}),i=new l.default.Text({text:e.name,fontSize:this.settings.fontSize,fill:this.settings.textColor,width:e.width-10,height:e.height-20,x:5,y:10,align:`center`,verticalAlign:`middle`,ellipsis:!0,wrap:`word`}),a=new l.default.Text({text:`${e.roomCount} rooms`,fontSize:10,fill:this.settings.connectionColor,width:e.width-10,x:5,y:e.height-18,align:`center`});n.add(r),n.add(i),n.add(a),n.on(`click tap`,()=>{this.emitAreaClickEvent(e.areaId)}),n.on(`mouseenter`,()=>{this.stage.container().style.cursor=`pointer`,r.stroke(this.settings.highlightColor),this.areaLayer.batchDraw()}),n.on(`mouseleave`,()=>{this.stage.container().style.cursor=`auto`,r.stroke(t?this.settings.highlightColor:this.settings.areaStrokeColor),this.areaLayer.batchDraw()}),n.on(`dragmove`,()=>{e.x=n.x(),e.y=n.y(),this.drawConnections(),this.connectionLayer.batchDraw()}),n.on(`dragstart`,()=>{this.stage.container().style.cursor=`grabbing`}),n.on(`dragend`,()=>{this.stage.container().style.cursor=`pointer`}),this.areaLayer.add(n)}}}centerView(){let e=1/0,t=1/0,n=-1/0,r=-1/0;for(let[,i]of this.areaNodes)e=Math.min(e,i.x),t=Math.min(t,i.y),n=Math.max(n,i.x+i.width),r=Math.max(r,i.y+i.height);if(!isFinite(e))return;let i=n-e,a=r-t,o=e+i/2,s=t+a/2,c=(this.stage.width()-100)/i,l=(this.stage.height()-100)/a,u=Math.min(c,l,1.5);this.setZoom(u);let d=this.stage.scaleX();this.stage.position({x:this.stage.width()/2-o*d,y:this.stage.height()/2-s*d})}highlightArea(e){this.highlightedArea=e,this.drawAreas(),this.stage.batchDraw()}centerOnArea(e){let t=this.areaNodes.get(e);if(!t)return;let n=this.stage.scaleX(),r=t.x+t.width/2,i=t.y+t.height/2;this.stage.position({x:this.stage.width()/2-r*n,y:this.stage.height()/2-i*n}),this.stage.batchDraw()}emitAreaClickEvent(e){let t=new CustomEvent(`areaclick`,{detail:{areaId:e}});this.stage.container().dispatchEvent(t)}getAreaNode(e){return this.areaNodes.get(e)}getConnectionGroups(){return this.connectionGroups}destroy(){this.stage.destroy()}},pn=class{get settings(){return this.renderer.settings}constructor(e,t){this.renderer=new it(e,t)}drawArea(e,t){this.renderer.drawArea(e,t)}getCurrentArea(){return this.renderer.getCurrentArea()}setPosition(e){this.renderer.state.positionRoomId=e}clearPosition(){this.renderer.state.positionRoomId=void 0}renderPath(e,t=`#66E64D`){this.renderer.renderPath(e,t)}clearPaths(){this.renderer.clearPaths()}renderHighlight(e,t){this.renderer.renderHighlight(e,t)}removeHighlight(e){this.renderer.removeHighlight(e)}hasHighlight(e){return this.renderer.hasHighlight(e)}clearHighlights(){this.renderer.clearHighlights()}exportSvg(e){return this.renderer.exportSvg(e)}renderToCanvas(e){return this.renderer.renderToCanvas(e)}destroy(){this.renderer.destroy()}};exports.AreaMapRenderer=fn,exports.BlueprintBackend=Nt,exports.ExplorationArea=H,exports.HeadlessRenderer=pn,exports.IsometricBackend=Gt,exports.KonvaBackend=Oe,exports.KonvaRenderBackend=Qe,exports.MapGraph=nn,exports.MapReader=Jt,exports.MapRenderer=it,exports.MapState=y,exports.NeonBackend=Ht,exports.ParchmentBackend=St,exports.PathFinder=ln,exports.Renderer=at,exports.SketchyBackend=dt,exports.Viewport=P,exports.colorLightness=m,exports.computePathData=Ie,exports.createAreaMapSettings=dn,exports.createSettings=p,exports.darkenColor=h,exports.hexToRgba=_;
|
|
4
|
+
`)}},tt=class{createGroup(e,t){return new K(e,t)}addRect(e,t){if(!(e instanceof K))return;let n=t.fill??`none`,r=`<rect${G(`x`,t.x)}${G(`y`,t.y)}${G(`width`,t.width)}${G(`height`,t.height)}${G(`fill`,n)}${G(`stroke`,t.stroke)}${G(`stroke-width`,t.strokeWidth)}${t.cornerRadius?`${G(`rx`,t.cornerRadius)}${G(`ry`,t.cornerRadius)}`:``}${$e(t.dash,t.dashEnabled)}/>`;e.elements.push(r)}addCircle(e,t){if(!(e instanceof K))return;let n=t.fill??`none`,r=`<circle${G(`cx`,t.cx)}${G(`cy`,t.cy)}${G(`r`,t.radius)}${G(`fill`,n)}${G(`stroke`,t.stroke)}${G(`stroke-width`,t.strokeWidth)}${$e(t.dash,t.dashEnabled)}/>`;e.elements.push(r)}addLine(e,t){if(!(e instanceof K))return;let n=t.points,r=[];for(let e=0;e<n.length;e+=2)r.push(`${n[e]},${n[e+1]}`);let i=`<polyline points="${r.join(` `)}"${G(`stroke`,t.stroke)}${G(`stroke-width`,t.strokeWidth)}${$e(t.dash)}${G(`stroke-linecap`,t.lineCap)}${G(`stroke-linejoin`,t.lineJoin)}${G(`opacity`,t.alpha)} fill="none"/>`;e.elements.push(i)}addPolygon(e,t){if(!(e instanceof K))return;let n=t.vertices,r=[];for(let e=0;e<n.length;e+=2)r.push(`${n[e]},${n[e+1]}`);let i=`<polygon points="${r.join(` `)}"${G(`fill`,t.fill)}${G(`stroke`,t.stroke)}${G(`stroke-width`,t.strokeWidth)}/>`;e.elements.push(i)}addText(e,t){if(!(e instanceof K))return;let n=t.x,r=t.y,i=`start`,a=`auto`;t.width!==void 0&&(t.align===`center`?(n=t.x+t.width/2,i=`middle`):t.align===`right`&&(n=t.x+t.width,i=`end`)),t.height!==void 0&&t.verticalAlign===`middle`?t.baselineRatio===void 0?(r=t.y+t.height/2,a=`central`):r=t.y+t.height/2+t.baselineRatio*t.fontSize:t.offsetY&&(r-=t.offsetY);let o=t.transform?` transform="matrix(${t.transform.join(`,`)})"`:``,s=`<text${G(`x`,n)}${G(`y`,r)}${G(`font-size`,t.fontSize)}${t.fontFamily?G(`font-family`,t.fontFamily):``}${t.fontStyle===`bold`?` font-weight="bold"`:``}${G(`fill`,t.fill)} text-anchor="${i}" dominant-baseline="${a}"${o}>${W(t.text)}</text>`;e.elements.push(s)}addImage(e,t){if(e instanceof K)if(t.transform){let[n,r,i,a,o,s]=t.transform,c=`<image${G(`width`,t.width)}${G(`height`,t.height)} href="${W(t.src)}" transform="matrix(${n},${r},${i},${a},${o},${s})"/>`;e.elements.push(c)}else{let n=`<image${G(`x`,t.x)}${G(`y`,t.y)}${G(`width`,t.width)}${G(`height`,t.height)} href="${W(t.src)}"/>`;e.elements.push(n)}}getExitDepthOffset(){return{x:0,y:0}}getTransform(){return b}getInverseTransform(){return b}};function nt(e){return e.replace(/&/g,`&`).replace(/</g,`<`).replace(/>/g,`>`).replace(/"/g,`"`).replace(/'/g,`'`)}var rt=class{constructor(e,t){this.state=e,this.drawingBackendFactory=t}exportSvg(e){let{currentArea:t,currentZIndex:n,currentAreaInstance:r}=this.state;if(t===void 0||n===void 0||!r)return;let i=r,a=i.getPlane(n);if(!a)return;let o=this.state.settings,s=e?.padding??3,c=this.state.computeExportBounds(i,a,e?.roomId,s),l=new tt,u=this.drawingBackendFactory?this.drawingBackendFactory(l):l,d=new et,f=new et,p=new et,m=new F(this.state.mapReader,o,u,{gridLayer:d,linkLayer:f,roomLayer:p}),h={minX:c.x,maxX:c.x+c.w,minY:c.y,maxY:c.y+c.h};m.buildScene(i,a,n,h);let g=[];g.push(`<svg xmlns="http://www.w3.org/2000/svg" viewBox="${c.x} ${c.y} ${c.w} ${c.h}">`),g.push(`<rect x="${c.x}" y="${c.y}" width="${c.w}" height="${c.h}" fill="${nt(o.backgroundColor)}"/>`);let _=d.toSvg();_&&g.push(_);let v=f.toSvg();v&&g.push(v);let y=p.toSvg();y&&g.push(y);let b=e?.overlays;if(b){if(b.paths)for(let e of b.paths){let r=Ge(u,Re(this.state.mapReader,o,e.locations,e.color,t,n)).toSvg();r&&g.push(r)}if(b.highlights)for(let e of b.highlights){let t=this.state.mapReader.getRoom(e.roomId);if(!t)continue;let n=Ue(u,Ie(t,e.color,o)).toSvg();n&&g.push(n)}if(b.position){if(o.ambientLight.enabled){let e=this.state.mapReader.getRoom(b.position.roomId);if(e){let t=Ye(u,He(e.x,e.y,h,o)).toSvg();t&&g.push(t)}}let e=this.state.mapReader.getRoom(b.position.roomId);if(e){let t=We(u,Le(e,o)).toSvg();t&&g.push(t)}}}return g.push(`</svg>`),g.join(`
|
|
5
|
+
`)}},it=class{get settings(){return this.state.settings}constructor(e,t,n,r,i,a){this.state=new y(e,t??p()),this.svgDrawingBackendFactory=a,this.backend=r?r(this.state):new Qe(this.state,n,i)}destroy(){this.backend.destroy()}drawArea(e,t){this.state.setArea(e,t)}getCurrentArea(){return this.state.currentAreaInstance}setPosition(e,t=!0){this.state.setPosition(e,t)}updatePositionMarker(e){this.state.updatePositionMarker(e)}clearPosition(){this.state.clearPosition()}centerOn(e,t){this.state.setCenterRoom(e,t)}renderHighlight(e,t){this.state.addHighlight(e,t)}removeHighlight(e){this.state.removeHighlight(e)}hasHighlight(e){return this.state.hasHighlight(e)}clearHighlights(){this.state.clearHighlights()}renderPath(e,t){this.state.addPath(e,t)}clearPaths(){this.state.clearPaths()}refreshCurrentRoomOverlay(){this.state.refreshPosition()}setDrawingBackend(e){this.backend.setDrawingBackend(e),this.drawingBackendFactory=void 0}setDrawingBackendFactory(e){this.drawingBackendFactory=e??void 0}updateBackground(){this.backend.updateBackground()}refresh(){this.backend.updateBackground(),this.backend.refresh()}addOverlayPlugin(e,t){this.backend.addOverlayPlugin(e,t)}removeOverlayPlugin(e){this.backend.removeOverlayPlugin(e)}exportSvg(e){let t={...e,overlays:this.state.getOverlaysForArea(e?.overlays)},n=this.drawingBackendFactory??this.svgDrawingBackendFactory;return new rt(this.state,n).exportSvg(t)}exportPng(e){return this.backend.exportCanvas(e)?.toDataURL(`image/png`)}exportPngBlob(e){let t=this.backend.exportCanvas(e);if(t)return new Promise(e=>{t.toBlob(t=>{t&&e(t)},`image/png`)})}renderToCanvas(e){return this.backend.toCanvas(e)}on(e,t){this.backend.events.on(e,t)}off(e,t){this.backend.events.off(e,t)}setZoom(e){return this.backend.viewport.setZoom(e)}zoomToCenter(e){return this.backend.viewport.zoomToCenter(e)}getZoom(){return this.backend.viewport.zoom}getViewportBounds(){return this.backend.viewport.getViewportBounds()}getAreaBounds(){if(!this.state.currentAreaInstance||this.state.currentZIndex===void 0)return null;let e=this.state.currentAreaInstance.getPlane(this.state.currentZIndex);if(!e)return null;let t=this.state.getEffectiveBounds(this.state.currentAreaInstance,e),n=this.state.settings.areaName&&this.state.currentAreaInstance.getAreaName(),r={minX:n?t.minX-4:t.minX,maxX:t.maxX,minY:n?t.minY-7:t.minY,maxY:t.maxY},i=this.backend.coordinateTransform,a=i(r.minX,r.minY),o=i(r.maxX,r.minY),s=i(r.maxX,r.maxY),c=i(r.minX,r.maxY);return{minX:Math.min(a.x,o.x,s.x,c.x),maxX:Math.max(a.x,o.x,s.x,c.x),minY:Math.min(a.y,o.y,s.y,c.y),maxY:Math.max(a.y,o.y,s.y,c.y)}}fitArea(e){let t=this.getAreaBounds();t&&this.backend.viewport.fitToMapBounds(t.minX,t.maxX,t.minY,t.maxY,e)}get centerOnResize(){return this.backend.viewport.centerOnResize}set centerOnResize(e){this.backend.viewport.centerOnResize=e}get minZoom(){return this.backend.viewport.minZoom}set minZoom(e){this.backend.viewport.minZoom=e}setCullingMode(e){this.state.settings.cullingMode=e,this.state.settings.cullingEnabled=e!==`none`,this.backend.culling.scheduleCulling()}getCullingMode(){return this.state.settings.cullingMode}},at=class{get settings(){return this.renderer.settings}constructor(e,t,n){this.renderer=new it(t,n,e)}drawArea(e,t){this.renderer.drawArea(e,t)}getCurrentArea(){return this.renderer.getCurrentArea()}setPosition(e,t=!0){this.renderer.setPosition(e,t)}updatePositionMarker(e){this.renderer.updatePositionMarker(e)}clearPosition(){this.renderer.clearPosition()}centerOn(e,t){this.renderer.centerOn(e,t)}renderHighlight(e,t){this.renderer.renderHighlight(e,t)}removeHighlight(e){this.renderer.removeHighlight(e)}hasHighlight(e){return this.renderer.hasHighlight(e)}clearHighlights(){this.renderer.clearHighlights()}renderPath(e,t){this.renderer.renderPath(e,t)}clearPaths(){this.renderer.clearPaths()}exportSvg(e){return this.renderer.exportSvg(e)}exportPng(e){return this.renderer.exportPng(e)}exportPngBlob(e){return this.renderer.exportPngBlob(e)}setZoom(e){return this.renderer.setZoom(e)}zoomToCenter(e){return this.renderer.zoomToCenter(e)}getZoom(){return this.renderer.getZoom()}getViewportBounds(){return this.renderer.getViewportBounds()}getAreaBounds(){return this.renderer.getAreaBounds()}fitArea(){this.renderer.fitArea()}get centerOnResize(){return this.renderer.centerOnResize}set centerOnResize(e){this.renderer.centerOnResize=e}get minZoom(){return this.renderer.minZoom}set minZoom(e){this.renderer.minZoom=e}on(e,t){this.renderer.on(e,t)}off(e,t){this.renderer.off(e,t)}setCullingMode(e){this.renderer.setCullingMode(e)}getCullingMode(){return this.renderer.getCullingMode()}refreshCurrentRoomOverlay(){this.renderer.refreshCurrentRoomOverlay()}updateBackground(){this.renderer.updateBackground()}refresh(){this.renderer.refresh()}destroy(){this.renderer.destroy()}};function q(e){let t=e|0||1;return()=>(t=t*1664525+1013904223|0,(t>>>0)/4294967296)}function J(...e){let t=2654435769;for(let n of e)t^=(n*1e3|0)+2654435769+(t<<6)+(t>>2);return t}function ot(e,t,n,r,i,a){let o=n-e,s=r-t,c=Math.sqrt(o*o+s*s);if(c<.001)return[e,t,n,r];let l=-s/c,u=o/c,d=Math.max(2,Math.min(6,Math.ceil(c/.15))),f=[e+l*(a()-.5)*i*.3,t+u*(a()-.5)*i*.3];for(let n=1;n<d;n++){let r=n/d,c=e+o*r,p=t+s*r,m=(a()-.5)*2*i;f.push(c+l*m,p+u*m)}return f.push(n+l*(a()-.5)*i*.3,r+u*(a()-.5)*i*.3),f}function st(e,t,n){if(e.length<4)return e;let r=[];for(let i=0;i<e.length-2;i+=2){let a=ot(e[i],e[i+1],e[i+2],e[i+3],t,n);if(i===0)r.push(...a);else for(let e=2;e<a.length;e++)r.push(a[e])}return r}function ct(e,t,n,r,i,a){let o=[e,t,e+n,t,e+n,t+r,e,t+r],s=[];for(let e=0;e<4;e++){let t=o[e*2],n=o[e*2+1],r=(e+1)%4,c=o[r*2],l=o[r*2+1],u=ot(t,n,c,l,i,a);for(let e=0;e<u.length-2;e++)s.push(u[e])}return s}function lt(e,t,n,r,i){let a=[];for(let o=0;o<24;o++){let s=o/24*Math.PI*2,c=n+(i()-.5)*2*r;a.push(e+Math.cos(s)*c,t+Math.sin(s)*c)}return a}function ut(e,t,n){let r=e.length/2;if(r<2)return e;let i=[];for(let a=0;a<r;a++){let o=e[a*2],s=e[a*2+1],c=(a+1)%r,l=e[c*2],u=e[c*2+1],d=ot(o,s,l,u,t,n);for(let e=0;e<d.length-2;e++)i.push(d[e])}return i}var dt=class{constructor(e,t,n){this.inner=e,this.jitter=t,this.pencil=n}createGroup(e,t){return this.inner.createGroup(e,t)}applyPencilWithAlpha(e){if(!e)return this.pencil;let t=e.match(/^rgba\(.+,\s*([\d.]+)\s*\)$/);if(!t)return this.pencil;let n=parseFloat(t[1]);return n>=1?this.pencil:`rgba(${parseInt(this.pencil.slice(1,3),16)}, ${parseInt(this.pencil.slice(3,5),16)}, ${parseInt(this.pencil.slice(5,7),16)}, ${n})`}addRect(e,t){let n=this.jitter,r=this.pencil,i=q(J(t.x,t.y,t.width,t.height)),a=t.fill?`#ffffff`:void 0,o=t.stroke?r:void 0;if(t.cornerRadius&&t.cornerRadius>0){if(a&&this.inner.addRect(e,{...t,fill:a,stroke:void 0,strokeWidth:0}),o&&t.strokeWidth){let r=ct(t.x,t.y,t.width,t.height,n,i);this.inner.addPolygon(e,{vertices:r,stroke:o,strokeWidth:t.strokeWidth})}return}let s=ct(t.x,t.y,t.width,t.height,n,i);this.inner.addPolygon(e,{vertices:s,fill:a,stroke:o,strokeWidth:t.strokeWidth??0})}addCircle(e,t){let n=this.jitter,r=this.pencil,i=q(J(t.cx,t.cy,t.radius)),a=lt(t.cx,t.cy,t.radius,n,i);this.inner.addPolygon(e,{vertices:a,fill:t.fill?`#ffffff`:void 0,stroke:t.stroke?r:void 0,strokeWidth:t.strokeWidth??0})}addLine(e,t){let n=this.jitter,r=q(J(...t.points.slice(0,4))),i=st(t.points,n,r),a=this.applyPencilWithAlpha(t.stroke);this.inner.addLine(e,{...t,points:i,stroke:a})}addPolygon(e,t){let n=this.jitter,r=this.pencil,i=q(J(...t.vertices.slice(0,4))),a=ut(t.vertices,n,i);this.inner.addPolygon(e,{...t,vertices:a,fill:t.fill?r:void 0,stroke:t.stroke?r:void 0})}addText(e,t){this.inner.addText(e,{...t,fill:this.pencil})}addImage(e,t){this.inner.addImage(e,t)}getExitDepthOffset(){return this.inner.getExitDepthOffset()}getTransform(){return this.inner.getTransform()}getInverseTransform(){return this.inner.getInverseTransform()}},ft=`#4a3728`,pt=`#3b2a1a`,mt=139,ht=115,gt=85,_t=244,vt=228,yt=193;function bt(e){let t=e.match(/rgba?\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)(?:\s*,\s*([\d.]+))?\s*\)/);return t?{r:parseInt(t[1]),g:parseInt(t[2]),b:parseInt(t[3]),a:t[4]===void 0?1:parseFloat(t[4])}:e.startsWith(`#`)&&e.length>=7?{r:parseInt(e.slice(1,3),16),g:parseInt(e.slice(3,5),16),b:parseInt(e.slice(5,7),16),a:1}:null}function xt(e){let t=bt(e);if(!t)return`rgb(${_t}, ${vt}, ${yt})`;let n=(.299*t.r+.587*t.g+.114*t.b)/255,r=Math.round(mt+(_t-mt)*n),i=Math.round(ht+(vt-ht)*n),a=Math.round(gt+(yt-gt)*n);return t.a<1?`rgba(${r}, ${i}, ${a}, ${t.a})`:`rgb(${r}, ${i}, ${a})`}function Y(e){let t=bt(e);if(!t||t.a>=1)return ft;let n=bt(ft);return`rgba(${n.r}, ${n.g}, ${n.b}, ${t.a})`}var St=class{constructor(e){this.inner=e}createGroup(e,t){return this.inner.createGroup(e,t)}addRect(e,t){this.inner.addRect(e,{...t,fill:t.fill?xt(t.fill):void 0,stroke:t.stroke?Y(t.stroke):void 0})}addCircle(e,t){this.inner.addCircle(e,{...t,fill:t.fill?xt(t.fill):void 0,stroke:t.stroke?Y(t.stroke):void 0})}addLine(e,t){this.inner.addLine(e,{...t,stroke:t.stroke?Y(t.stroke):void 0})}addPolygon(e,t){this.inner.addPolygon(e,{...t,fill:t.fill?xt(t.fill):void 0,stroke:t.stroke?Y(t.stroke):void 0})}addText(e,t){this.inner.addText(e,{...t,fill:pt})}addImage(e,t){this.inner.addImage(e,t)}getExitDepthOffset(){return this.inner.getExitDepthOffset()}getTransform(){return this.inner.getTransform()}getInverseTransform(){return this.inner.getInverseTransform()}},Ct=`#c0deff`,wt=`#e0f0ff`,Tt=20,Et=40,Dt=80,Ot=60,kt=100,At=160;function jt(e){let t=e.match(/rgba?\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)(?:\s*,\s*([\d.]+))?\s*\)/);return t?{r:parseInt(t[1]),g:parseInt(t[2]),b:parseInt(t[3]),a:t[4]===void 0?1:parseFloat(t[4])}:e.startsWith(`#`)&&e.length>=7?{r:parseInt(e.slice(1,3),16),g:parseInt(e.slice(3,5),16),b:parseInt(e.slice(5,7),16),a:1}:null}function Mt(e){let t=jt(e);if(!t)return`rgb(${Ot}, ${kt}, ${At})`;let n=(.299*t.r+.587*t.g+.114*t.b)/255,r=Math.round(Tt+(Ot-Tt)*n),i=Math.round(Et+(kt-Et)*n),a=Math.round(Dt+(At-Dt)*n);return t.a<1?`rgba(${r}, ${i}, ${a}, ${t.a})`:`rgb(${r}, ${i}, ${a})`}function X(e){let t=jt(e);if(!t||t.a>=1)return Ct;let n=jt(Ct);return`rgba(${n.r}, ${n.g}, ${n.b}, ${t.a})`}var Nt=class{constructor(e){this.inner=e}createGroup(e,t){return this.inner.createGroup(e,t)}addRect(e,t){this.inner.addRect(e,{...t,fill:t.fill?Mt(t.fill):void 0,stroke:t.stroke?X(t.stroke):void 0})}addCircle(e,t){this.inner.addCircle(e,{...t,fill:t.fill?Mt(t.fill):void 0,stroke:t.stroke?X(t.stroke):void 0})}addLine(e,t){this.inner.addLine(e,{...t,stroke:t.stroke?X(t.stroke):void 0})}addPolygon(e,t){this.inner.addPolygon(e,{...t,fill:t.fill?Mt(t.fill):void 0,stroke:t.stroke?X(t.stroke):void 0})}addText(e,t){this.inner.addText(e,{...t,fill:wt})}addImage(e,t){this.inner.addImage(e,t)}getExitDepthOffset(){return this.inner.getExitDepthOffset()}getTransform(){return this.inner.getTransform()}getInverseTransform(){return this.inner.getInverseTransform()}},Pt=`#00ffd0`,Ft=.3,It=3;function Lt(e){let t=e.match(/rgba?\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)(?:\s*,\s*([\d.]+))?\s*\)/);return t?{r:parseInt(t[1]),g:parseInt(t[2]),b:parseInt(t[3]),a:t[4]===void 0?1:parseFloat(t[4])}:e.startsWith(`#`)&&e.length>=7?{r:parseInt(e.slice(1,3),16),g:parseInt(e.slice(3,5),16),b:parseInt(e.slice(5,7),16),a:1}:null}function Rt(e,t,n){e/=255,t/=255,n/=255;let r=Math.max(e,t,n),i=Math.min(e,t,n),a=(r+i)/2;if(r===i)return[0,0,a];let o=r-i,s=a>.5?o/(2-r-i):o/(r+i),c;return c=r===e?((t-n)/o+(t<n?6:0))/6:r===t?((n-e)/o+2)/6:((e-t)/o+4)/6,[c*360,s,a]}function zt(e,t,n,r=1){e=(e%360+360)%360;let i=(1-Math.abs(2*n-1))*t,a=i*(1-Math.abs(e/60%2-1)),o=n-i/2,s,c,l;e<60?(s=i,c=a,l=0):e<120?(s=a,c=i,l=0):e<180?(s=0,c=i,l=a):e<240?(s=0,c=a,l=i):e<300?(s=a,c=0,l=i):(s=i,c=0,l=a);let u=Math.round((s+o)*255),d=Math.round((c+o)*255),f=Math.round((l+o)*255);return r<1?`rgba(${u}, ${d}, ${f}, ${r})`:`rgb(${u}, ${d}, ${f})`}function Bt(e){let t=Lt(e);if(!t)return{neon:`#00ff88`,h:150,s:1,a:1};let[n,,]=Rt(t.r,t.g,t.b);return{neon:zt(n,.95,.65,t.a),h:n,s:.95,a:t.a}}function Vt(e){let t=Lt(e);if(!t)return`rgb(8, 12, 10)`;let[n,,]=Rt(t.r,t.g,t.b);return zt(n,.4,.1,t.a)}function Z(e){let{h:t,a:n}=Bt(e);return zt(t,.95,.65,Math.min(n,Ft))}function Q(e){let{neon:t}=Bt(e);return t}var Ht=class{constructor(e){this.inner=e}createGroup(e,t){return this.inner.createGroup(e,t)}addRect(e,t){if(t.stroke){let n=(t.strokeWidth??1)*It;this.inner.addRect(e,{...t,fill:void 0,stroke:Z(t.stroke),strokeWidth:n})}this.inner.addRect(e,{...t,fill:t.fill?Vt(t.fill):void 0,stroke:t.stroke?Q(t.stroke):void 0})}addCircle(e,t){if(t.stroke){let n=(t.strokeWidth??1)*It;this.inner.addCircle(e,{...t,fill:void 0,stroke:Z(t.stroke),strokeWidth:n})}this.inner.addCircle(e,{...t,fill:t.fill?Vt(t.fill):void 0,stroke:t.stroke?Q(t.stroke):void 0})}addLine(e,t){if(t.stroke){let n=(t.strokeWidth??1)*It;this.inner.addLine(e,{...t,stroke:Z(t.stroke),strokeWidth:n,alpha:Ft})}this.inner.addLine(e,{...t,stroke:t.stroke?Q(t.stroke):void 0})}addPolygon(e,t){this.inner.addPolygon(e,{...t,fill:t.fill?Vt(t.fill):void 0,stroke:t.stroke?Q(t.stroke):void 0})}addText(e,t){this.inner.addText(e,{...t,fill:Pt})}addImage(e,t){this.inner.addImage(e,t)}getExitDepthOffset(){return this.inner.getExitDepthOffset()}getTransform(){return this.inner.getTransform()}getInverseTransform(){return this.inner.getInverseTransform()}};function Ut(e){let t=e*Math.PI/180,n=Math.cos(t),r=Math.sin(t);return(e,t)=>[e*n-t*r,(e*r+t*n)*.5]}function Wt(e){let t=e*Math.PI/180,n=Math.cos(t),r=Math.sin(t);return(e,t)=>[e*n+2*t*r,-e*r+2*t*n]}var $=32,Gt=class{constructor(e,t){if(this.inner=e,typeof t==`number`)this.depth=t,this.iso=Ut(0),this.isoInv=Wt(0);else{let e=t?.rotation??0;this.depth=t?.depth??.18,this.iso=Ut(e),this.isoInv=Wt(e)}}ix(e,t){return this.iso(e,t)[0]}iy(e,t){return this.iso(e,t)[1]}isoFlatPoints(e){let t=Array(e.length);for(let n=0;n<e.length;n+=2){let[r,i]=this.iso(e[n],e[n+1]);t[n]=r,t[n+1]=i}return t}rectToDiamond(e,t,n,r){let i=this.iso,[a,o]=i(e,t),[s,c]=i(e+n,t),[l,u]=i(e+n,t+r),[d,f]=i(e,t+r);return[a,o,s,c,l,u,d,f]}createGroup(e,t){let[n,r]=this.iso(e,t);return this.inner.createGroup(n,r)}addRect(e,t){let{x:n,y:r,width:i,height:a,fill:o,stroke:s,strokeWidth:c}=t,l=this.rectToDiamond(n,r,i,a);if(t.dash||t.dashEnabled){for(let n=0;n<8;n+=2){let r=(n+2)%8;this.inner.addLine(e,{points:[l[n],l[n+1],l[r],l[r+1]],stroke:s,strokeWidth:c,dash:t.dash})}return}if(this.depth>0&&o){let t=this.depth,n=0;for(let e=1;e<4;e++)l[e*2+1]>l[n*2+1]&&(n=e);let r=l[n*2],i=l[n*2+1],a=(n+3)%4,u=l[a*2],d=l[a*2+1],f=(n+1)%4,p=l[f*2],m=l[f*2+1],g=(n+2)%4,_=l[g*2],v=l[g*2+1];if(this.inner.addPolygon(e,{vertices:[u,d,r,i,r,i+t,u,d+t],fill:h(o,.2)}),this.inner.addPolygon(e,{vertices:[r,i,p,m,p,m+t,r,i+t],fill:h(o,.4)}),this.inner.addPolygon(e,{vertices:l,fill:o}),s&&c){let n=c;this.inner.addLine(e,{points:[_,v,u,d],stroke:s,strokeWidth:n}),this.inner.addLine(e,{points:[p,m,_,v],stroke:s,strokeWidth:n}),this.inner.addLine(e,{points:[u,d,u,d+t],stroke:s,strokeWidth:n}),this.inner.addLine(e,{points:[p,m,p,m+t],stroke:s,strokeWidth:n}),this.inner.addLine(e,{points:[u,d+t,r,i+t],stroke:s,strokeWidth:n}),this.inner.addLine(e,{points:[r,i+t,p,m+t],stroke:s,strokeWidth:n})}return}this.inner.addPolygon(e,{vertices:l,fill:o,stroke:s,strokeWidth:c})}addCircle(e,t){let{cx:n,cy:r,radius:i,fill:a,stroke:o,strokeWidth:s}=t,c=Array($*2);for(let e=0;e<$;e++){let t=e/$*Math.PI*2,a=n+Math.cos(t)*i,o=r+Math.sin(t)*i,[s,l]=this.iso(a,o);c[e*2]=s,c[e*2+1]=l}if(t.dash||t.dashEnabled){for(let n=0;n<$;n++){let r=(n+1)%$;this.inner.addLine(e,{points:[c[n*2],c[n*2+1],c[r*2],c[r*2+1]],stroke:o,strokeWidth:s,dash:t.dash})}return}if(this.depth>0&&a){let t=this.depth,n=0,r=0,i=0,l=-1/0,u=1/0,d=-1/0;for(let e=0;e<$;e++)c[e*2]>l&&(l=c[e*2],n=e),c[e*2]<u&&(u=c[e*2],r=e),c[e*2+1]>d&&(d=c[e*2+1],i=e);let f=[],p=n;for(let e=0;e<=$&&(f.push(c[p*2],c[p*2+1]),p!==i);e++)p=(p+1)%$;for(let e=f.length-2;e>=0;e-=2)f.push(f[e],f[e+1]+t);this.inner.addPolygon(e,{vertices:f,fill:h(a,.2),stroke:o,strokeWidth:s?s*.5:void 0});let m=[];p=i;for(let e=0;e<=$&&(m.push(c[p*2],c[p*2+1]),p!==r);e++)p=(p+1)%$;for(let e=m.length-2;e>=0;e-=2)m.push(m[e],m[e+1]+t);this.inner.addPolygon(e,{vertices:m,fill:h(a,.4),stroke:o,strokeWidth:s?s*.5:void 0})}this.inner.addPolygon(e,{vertices:c,fill:a,stroke:o,strokeWidth:s})}addLine(e,t){this.inner.addLine(e,{...t,points:this.isoFlatPoints(t.points)})}addPolygon(e,t){this.inner.addPolygon(e,{...t,vertices:this.isoFlatPoints(t.vertices)})}isoAffine(e,t,n,r){let[i,a]=this.iso(e,t),[o,s]=this.iso(e+n,t),[c,l]=this.iso(e,t+r);return[(o-i)/n,(s-a)/n,(c-i)/r,(l-a)/r,i,a]}addText(e,t){let n=t.width??0,r=t.height??0;if(n>0&&r>0)this.inner.addText(e,{...t,x:0,y:0,transform:this.isoAffine(t.x,t.y,n,r)});else{let[n,r]=this.iso(t.x,t.y);this.inner.addText(e,{...t,x:n,y:r})}}addImage(e,t){this.inner.addImage(e,{...t,x:0,y:0,transform:this.isoAffine(t.x,t.y,t.width,t.height)})}getTransform(){let e=this.iso;return(t,n)=>{let[r,i]=e(t,n);return{x:r,y:i}}}getInverseTransform(){let e=this.isoInv;return(t,n)=>{let[r,i]=e(t,n);return{x:r,y:i}}}getExitDepthOffset(){if(this.depth<=0)return this.inner.getExitDepthOffset();let[e,t]=this.isoInv(0,this.depth),n=this.inner.getExitDepthOffset();return{x:e+n.x,y:t+n.y}}},Kt={rgb:[114,1,0],rgbValue:`rgb(114, 1, 0)`,symbolColor:[225,225,225],symbolColorValue:`rgb(225,225,225)`};function qt(e){let t=e[0]/255,n=e[1]/255,r=e[2]/255;return(Math.max(t,n,r)+Math.min(t,n,r))/2}var Jt=class{constructor(e,t){this.rooms={},this.areas={},this.areaSources={},this.explorationEnabled=!1,this.colors={},e.forEach(e=>{e.rooms.forEach(e=>{e.y=-e.y,this.rooms[e.id]=e});let t=parseInt(e.areaId);this.areas[t]=new V(e),this.areaSources[t]=e}),this.colors=t.reduce((e,t)=>({...e,[t.envId]:{rgb:t.colors,rgbValue:`rgb(${t.colors.join(`,`)})`,symbolColor:qt(t.colors)>.41?[25,25,25]:[225,255,255],symbolColorValue:qt(t.colors)>.41?`rgb(25,25,25)`:`rgb(225,255,255)`}}),{})}getArea(e){return this.areas[e]}getExplorationArea(e){let t=this.areas[e];if(t instanceof H)return t}getAreas(){return Object.values(this.areas)}getRooms(){return Object.values(this.rooms)}getRoom(e){return this.rooms[e]}ensureVisitedRooms(){return this.visitedRooms||=new Set,this.visitedRooms}applyExplorationDecoration(){this.visitedRooms&&Object.entries(this.areaSources).forEach(([e,t])=>{let n=parseInt(e,10);this.areas[n]=new H(t,this.visitedRooms)})}decorateWithExploration(e){return e===void 0?this.ensureVisitedRooms():this.setVisitedRooms(e),this.applyExplorationDecoration(),this.explorationEnabled=!0,this.visitedRooms}getVisitedRooms(){return this.visitedRooms}clearExplorationDecoration(){Object.entries(this.areaSources).forEach(([e,t])=>{let n=parseInt(e,10);this.areas[n]=new V(t)}),this.explorationEnabled=!1}isExplorationEnabled(){return this.explorationEnabled}setVisitedRooms(e){return this.visitedRooms=e instanceof Set?e:new Set(e),this.explorationEnabled&&this.applyExplorationDecoration(),this.visitedRooms}addVisitedRoom(e){if(this.explorationEnabled){let t=this.getRoom(e);if(t){let n=this.getExplorationArea(t.area);if(n)return n.addVisitedRoom(e)}}let t=this.ensureVisitedRooms(),n=t.has(e);return t.add(e),!n}addVisitedRooms(e){let t=this.ensureVisitedRooms(),n=0;for(let r of e){if(this.explorationEnabled){let e=this.getRoom(r);if(e){let t=this.getExplorationArea(e.area);if(t){t.addVisitedRoom(r)&&n++;continue}}}let e=t.has(r);t.add(r),e||n++}return n}hasVisitedRoom(e){return this.visitedRooms?.has(e)??!1}getColorValue(e){return this.colors[e]?.rgbValue??Kt.rgbValue}getSymbolColor(e,t){let n=this.colors[e]?.symbolColor??Kt.symbolColor,r=Math.min(Math.max(t??1,0),1),i=n.join(`,`);return r==1?`rgba(${i})`:`rgba(${i}, ${r})`}},Yt=o(((e,t)=>{t.exports=class{constructor(){this.keys=new Set,this.queue=[]}sort(){this.queue.sort((e,t)=>e.priority-t.priority)}set(e,t){let n=Number(t);if(isNaN(n))throw TypeError(`"priority" must be a number`);return this.keys.has(e)?this.queue.map(t=>(t.key===e&&Object.assign(t,{priority:n}),t)):(this.keys.add(e),this.queue.push({key:e,priority:n})),this.sort(),this.queue.length}next(){let e=this.queue.shift();return this.keys.delete(e.key),e}isEmpty(){return this.queue.length===0}has(e){return this.keys.has(e)}get(e){return this.queue.find(t=>t.key===e)}}})),Xt=o(((e,t)=>{function n(e,t){let r=new Map;for(let[i,a]of e)i!==t&&a instanceof Map?r.set(i,n(a,t)):i!==t&&r.set(i,a);return r}t.exports=n})),Zt=o(((e,t)=>{function n(e){let t=Number(e);return!(isNaN(t)||t<=0)}function r(e){let t=new Map;return Object.keys(e).forEach(i=>{let a=e[i];if(typeof a==`object`&&a&&!Array.isArray(a))return t.set(i,r(a));if(!n(a))throw Error(`Could not add node at key "${i}", make sure it's a valid node`,a);return t.set(i,Number(a))}),t}t.exports=r})),Qt=o(((e,t)=>{function n(e){if(!(e instanceof Map))throw Error(`Invalid graph: Expected Map instead found ${typeof e}`);e.forEach((e,t)=>{if(typeof e==`object`&&e instanceof Map){n(e);return}if(typeof e!=`number`||e<=0)throw Error(`Values must be numbers greater than 0. Found value ${e} at ${t}`)})}t.exports=n})),$t=c(o(((e,t)=>{var n=Yt(),r=Xt(),i=Zt(),a=Qt();t.exports=class{constructor(e){e instanceof Map?(a(e),this.graph=e):e?this.graph=i(e):this.graph=new Map}addNode(e,t){let n;return t instanceof Map?(a(t),n=t):n=i(t),this.graph.set(e,n),this}addVertex(e,t){return this.addNode(e,t)}removeNode(e){return this.graph=r(this.graph,e),this}path(e,t,r={}){if(!this.graph.size)return r.cost?{path:null,cost:0}:null;let i=new Set,a=new n,o=new Map,s=[],c=0,l=[];if(r.avoid&&(l=[].concat(r.avoid)),l.includes(e))throw Error(`Starting node (${e}) cannot be avoided`);if(l.includes(t))throw Error(`Ending node (${t}) cannot be avoided`);for(a.set(e,0);!a.isEmpty();){let e=a.next();if(e.key===t){c=e.priority;let t=e.key;for(;o.has(t);)s.push(t),t=o.get(t);break}i.add(e.key),(this.graph.get(e.key)||new Map).forEach((t,n)=>{if(i.has(n)||l.includes(n))return null;if(!a.has(n))return o.set(n,e.key),a.set(n,e.priority+t);let r=a.get(n).priority,s=e.priority+t;return s<r?(o.set(n,e.key),a.set(n,s)):null})}return s.length?(r.trim?s.shift():s=s.concat([e]),r.reverse||(s=s.reverse()),r.cost?{path:s,cost:c}:s):r.cost?{path:null,cost:0}:null}shortestPath(...e){return this.path(...e)}}}))(),1),en={1:`north`,2:`northeast`,3:`northwest`,4:`east`,5:`west`,6:`south`,7:`southeast`,8:`southwest`,9:`up`,10:`down`,11:`in`,12:`out`},tn={north:`n`,northeast:`ne`,northwest:`nw`,east:`e`,west:`w`,south:`s`,southeast:`se`,southwest:`sw`,up:`up`,down:`down`,in:`in`,out:`out`},nn=class{constructor(e){this.mapReader=e,this.data=this.buildGraph()}getAdj(){return this.data.adj}getGraphDefinition(){return this.data.graphDefinition}getMaxEdgeDistance(){return this.data.maxEdgeDistance}getMinEdgeWeight(){return this.data.minEdgeWeight}getRoom(e){return this.mapReader.getRoom(e)}resolveEdgeWeight(e,t,n){let r=e.exitWeights?.[t];return r!==void 0&&r>0?r:Math.max(n.weight,1)}buildGraph(){let e=new Map,t={},n=1,r=1/0;return this.mapReader.getRooms().forEach(i=>{let a=[],o={},s=new Set((i.exitLocks??[]).map(e=>en[e]).filter(e=>!!e)),c=new Set(i.mSpecialExitLocks??[]);Object.entries(i.exits??{}).forEach(([e,t])=>{if(s.has(e))return;let c=this.mapReader.getRoom(t);if(c){let s=tn[e]??e,l=this.resolveEdgeWeight(i,s,c);a.push({id:t,weight:l}),o[t.toString()]=l,l<r&&(r=l);let u=c.x-i.x,d=c.y-i.y,f=c.z-i.z,p=Math.sqrt(u*u+d*d+f*f);p>n&&(n=p)}}),Object.entries(i.specialExits??{}).forEach(([e,t])=>{if(c.has(t))return;let s=this.mapReader.getRoom(t);if(s){let c=this.resolveEdgeWeight(i,e,s);a.push({id:t,weight:c}),o[t.toString()]=c,c<r&&(r=c);let l=s.x-i.x,u=s.y-i.y,d=s.z-i.z,f=Math.sqrt(l*l+u*u+d*d);f>n&&(n=f)}}),e.set(i.id,a),t[i.id.toString()]=o}),isFinite(r)||(r=1),{adj:e,graphDefinition:t,maxEdgeDistance:n,minEdgeWeight:r}}};function rn(e,t){e.push(t);let n=e.length-1;for(;n>0;){let t=n-1>>1;if(e[t].priority<=e[n].priority)break;[e[t],e[n]]=[e[n],e[t]],n=t}}function an(e){if(e.length===0)return;let t=e[0],n=e.pop();if(e.length>0){e[0]=n;let t=0,r=e.length;for(;;){let n=t,i=2*t+1,a=2*t+2;if(i<r&&e[i].priority<e[n].priority&&(n=i),a<r&&e[a].priority<e[n].priority&&(n=a),n===t)break;[e[t],e[n]]=[e[n],e[t]],t=n}}return t}function on(e,t,n){let r=[n],i=n;for(;i!==t;)i=e.get(i),r.push(i);return r.reverse(),r}function sn(e,t,n){let r=e.path(t.toString(),n.toString()),i=Array.isArray(r)?r:r?.path;return i?i.map(e=>Number(e)):null}function cn(e,t,n,r){let i=r.getRoom(n);if(!i)return null;let a=i.x,o=i.y,s=i.z,c=r.getMaxEdgeDistance(),l=r.getMinEdgeWeight(),u=e=>{let t=r.getRoom(e);if(!t)return 0;let n=t.x-a,i=t.y-o,u=t.z-s;return Math.sqrt(n*n+i*i+u*u)/c*l},d=new Map,f=new Map,p=[];for(d.set(t,0),rn(p,{id:t,priority:u(t)});p.length>0;){let{id:r}=an(p);if(r===n)return on(f,t,n);let i=d.get(r)??1/0,a=e.get(r);if(a)for(let e of a){let t=i+e.weight;t<(d.get(e.id)??1/0)&&(d.set(e.id,t),f.set(e.id,r),rn(p,{id:e.id,priority:t+u(e.id)}))}}return null}var ln=class{constructor(e,t=`dijkstra`){this.cache=new Map,this._algorithm=t,this.mapGraph=new nn(e),this.dijkstraGraph=new $t.default(this.mapGraph.getGraphDefinition())}get algorithm(){return this._algorithm}setAlgorithm(e){e!==this._algorithm&&(this._algorithm=e,this.cache.clear())}findPath(e,t){let n=`${e}->${t}`;if(this.cache.has(n))return this.cache.get(n);if(e===t){let t=this.mapGraph.getRoom(e)?[e]:null;return this.cache.set(n,t),t}if(!this.mapGraph.getRoom(e)||!this.mapGraph.getRoom(t))return this.cache.set(n,null),null;let r;switch(this._algorithm){case`dijkstra`:r=sn(this.dijkstraGraph,e,t);break;case`astar`:r=cn(this.mapGraph.getAdj(),e,t,this.mapGraph);break}return this.cache.set(n,r),r}},un={1:`north`,2:`northeast`,3:`northwest`,4:`east`,5:`west`,6:`south`,7:`southeast`,8:`southwest`,9:`up`,10:`down`,11:`in`,12:`out`};function dn(){return{areaWidth:150,areaHeight:80,areaSpacing:50,fontSize:14,connectionLineWidth:2,areaFillColor:`#2a2a3e`,areaStrokeColor:`#4a4a6e`,textColor:`#e0e0e0`,connectionColor:`#6a6a8e`,highlightColor:`#ff9900`}}var fn=class{constructor(e,t,n){this.areaNodes=new Map,this.connectionGroups=[],this.currentZoom=1,this.domainInfo=new Map,this.domainFilter=`all`,this.dotsMode=!1,this.settings=n??dn(),this.stage=new l.default.Stage({container:e,width:e.clientWidth,height:e.clientHeight,draggable:!0}),this.backgroundLayer=new l.default.Layer({listening:!1}),this.stage.add(this.backgroundLayer),this.connectionLayer=new l.default.Layer({listening:!1}),this.stage.add(this.connectionLayer),this.areaLayer=new l.default.Layer,this.stage.add(this.areaLayer),this.mapReader=t,this.initScaling(),this.initResize(e)}initResize(e){new ResizeObserver(()=>{this.stage.width(e.clientWidth),this.stage.height(e.clientHeight),this.stage.batchDraw()}).observe(e)}initScaling(){let e=1.1;this.stage.on(`wheel`,t=>{t.evt.preventDefault();let n=this.stage.scaleX(),r=this.stage.getPointerPosition();if(!r)return;let i={x:(r.x-this.stage.x())/n,y:(r.y-this.stage.y())/n},a=(t.evt.deltaY>0?-1:1)>0?this.currentZoom*e:this.currentZoom/e;if(this.setZoom(a)){let e=this.stage.scaleX(),t={x:r.x-i.x*e,y:r.y-i.y*e};this.stage.position(t),this.stage.batchDraw()}})}setZoom(e){let t=Math.max(.1,Math.min(5,e));return this.currentZoom===t?!1:(this.currentZoom=t,this.stage.scale({x:this.currentZoom,y:this.currentZoom}),!0)}getZoom(){return this.currentZoom}setDomainInfo(e){this.domainInfo.clear();for(let[t,n]of Object.entries(e))this.domainInfo.set(Number(t),n)}setDomainFilter(e){this.domainFilter=e}getDomainFilter(){return this.domainFilter}setBackgroundImage(e){this.backgroundConfig={url:e.url,x:e.x,y:e.y,width:e.width,height:e.height,opacity:e.opacity??.3}}clearBackgroundImage(){this.backgroundConfig=void 0,this.backgroundImage=void 0,this.backgroundLayer.destroyChildren(),this.backgroundLayer.batchDraw()}redrawBackground(){this.drawBackground()}setDotsMode(e){this.dotsMode=e}getDotsMode(){return this.dotsMode}redraw(){this.drawBackground(),this.drawConnections(),this.drawAreas(),this.stage.batchDraw()}isAreaInDomain(e){let t=this.domainInfo.get(e);if(!t)return this.domainFilter===`interdomain`||this.domainFilter===`all`;switch(this.domainFilter){case`ishtar`:return t.isIshtar;case`empire`:return t.isEmpire;case`interdomain`:return!t.isIshtar&&!t.isEmpire;case`all`:return!0}}areAreasInSameDomain(e,t){let n=this.domainInfo.get(e),r=this.domainInfo.get(t);return!n||!r?!1:n.isIshtar&&r.isIshtar||n.isEmpire&&r.isEmpire?!0:!n.isIshtar&&!n.isEmpire&&!r.isIshtar&&!r.isEmpire}render(){this.analyzeConnections(),this.layoutAreas(),this.drawBackground(),this.drawConnections(),this.drawAreas(),this.centerView(),this.stage.batchDraw()}drawBackground(){if(this.backgroundLayer.destroyChildren(),!this.backgroundConfig)return;let e=new Image;e.crossOrigin=`anonymous`,e.onload=()=>{this.backgroundImage=new l.default.Image({x:this.backgroundConfig.x,y:this.backgroundConfig.y,image:e,width:this.backgroundConfig.width,height:this.backgroundConfig.height,opacity:this.backgroundConfig.opacity,listening:!1}),this.backgroundLayer.add(this.backgroundImage),this.backgroundLayer.batchDraw()},e.onerror=()=>{console.error(`Failed to load background image:`,this.backgroundConfig?.url)},e.src=this.backgroundConfig.url}analyzeConnections(){this.areaNodes.clear(),this.connectionGroups=[];let e=this.mapReader.getRooms(),t=this.mapReader.getAreas(),n=new Map;for(let e of t){let t=e.getAreaId(),r=e.getRooms();if(r.length===0)continue;let i=1/0,a=-1/0,o=1/0,s=-1/0,c=0;for(let e of r)e.z===0&&(c++,i=Math.min(i,e.x),a=Math.max(a,e.x),o=Math.min(o,e.y),s=Math.max(s,e.y));if(c===0)for(let e of r)i=Math.min(i,e.x),a=Math.max(a,e.x),o=Math.min(o,e.y),s=Math.max(s,e.y);let l=(i+a)/2,u=(o+s)/2;n.set(t,{minX:i,maxX:a,minY:o,maxY:s,centerX:l,centerY:u,roomCount:r.length})}let r=1;for(let e of n.values()){let t=e.maxX-e.minX,n=e.maxY-e.minY;r=Math.max(r,t,n)}let i=200/r;for(let e of t){let t=e.getAreaId(),r=n.get(t);if(!r||!this.isAreaInDomain(t))continue;let a=r.maxX-r.minX,o=r.maxY-r.minY,s=Math.max(100,a*i),c=Math.max(100,o*i),l=s/c;l>3?c=s/3:l<1/3&&(s=c/3),this.areaNodes.set(t,{areaId:t,name:e.getAreaName(),x:0,y:0,width:s,height:c,connections:[],roomCount:r.roomCount,realCenterX:r.centerX,realCenterY:r.centerY})}let a=new Map;for(let t of e){let e=t.area;if(!this.areaNodes.has(e))continue;let n=this.getLockedDirections(t),r=new Set(t.mSpecialExitLocks??[]);for(let[r,i]of Object.entries(t.exits??{})){if(n.has(r))continue;let o=this.mapReader.getRoom(i);if(!o||o.area===e||!this.areaNodes.has(o.area)||!this.areAreasInSameDomain(e,o.area))continue;let s=this.createConnection(t,o,r);s&&this.addConnection(a,s)}for(let[n,i]of Object.entries(t.specialExits??{})){if(r.has(i))continue;let o=this.mapReader.getRoom(i);if(!o||o.area===e||!this.areaNodes.has(o.area)||!this.areAreasInSameDomain(e,o.area))continue;let s=this.parseDirection(n),c=this.createConnection(t,o,s);c&&this.addConnection(a,c)}}for(let[e,t]of a){let[n,r]=e.split(`-`).map(Number),i=this.createConnectionGroup(n,r,t);this.connectionGroups.push(i);let a=this.areaNodes.get(n),o=this.areaNodes.get(r);if(a&&a.connections.push(...t),o)for(let e of t)o.connections.push({...e,fromAreaId:e.toAreaId,toAreaId:e.fromAreaId,fromRoomId:e.toRoomId,toRoomId:e.fromRoomId,direction:e.direction?ae[e.direction]:null,fromRoomPosition:e.toRoomPosition,toRoomPosition:e.fromRoomPosition})}}getLockedDirections(e){return new Set((e.exitLocks??[]).map(e=>un[e]).filter(e=>!!e))}createConnection(e,t,n){let r=this.toPlanarDirection(n);return{fromAreaId:e.area,toAreaId:t.area,fromRoomId:e.id,toRoomId:t.id,direction:r,fromRoomPosition:{x:e.x,y:e.y},toRoomPosition:{x:t.x,y:t.y}}}addConnection(e,t){let n=t.fromAreaId<t.toAreaId?`${t.fromAreaId}-${t.toAreaId}`:`${t.toAreaId}-${t.fromAreaId}`;e.has(n)||e.set(n,[]),e.get(n).push(t)}createConnectionGroup(e,t,n){let r=new Map,i=0,a=0;for(let e of n)e.direction&&r.set(e.direction,(r.get(e.direction)??0)+1),i+=e.toRoomPosition.x-e.fromRoomPosition.x,a+=e.toRoomPosition.y-e.fromRoomPosition.y;let o=null,s=0;for(let[e,t]of r)t>s&&(s=t,o=e);return{fromAreaId:e,toAreaId:t,connections:n,primaryDirection:o,averageOffset:{x:i/n.length,y:a/n.length}}}parseDirection(e){return{n:`north`,north:`north`,s:`south`,south:`south`,e:`east`,east:`east`,w:`west`,west:`west`,ne:`northeast`,northeast:`northeast`,nw:`northwest`,northwest:`northwest`,se:`southeast`,southeast:`southeast`,sw:`southwest`,southwest:`southwest`,u:`up`,up:`up`,d:`down`,down:`down`,i:`in`,in:`in`,o:`out`,out:`out`}[e.toLowerCase().trim()]??null}toPlanarDirection(e){return e&&j.includes(e)?e:null}layoutAreas(){if(Array.from(this.areaNodes.values()).length===0)return;let e=this.findConnectedComponents(),t=0,n=this.settings.areaWidth*3;for(let r of e)if(r.length===1){let e=this.areaNodes.get(r[0]);e&&(e.x=t,e.y=0),t+=this.settings.areaWidth+n}else{let e=this.forceDirectedLayout(r);for(let n of r){let r=this.areaNodes.get(n);r&&isFinite(e.minX)&&isFinite(e.minY)&&(r.x-=e.minX,r.x+=t,r.y-=e.minY)}let i=isFinite(e.maxX-e.minX)?e.maxX-e.minX:this.settings.areaWidth;t+=i+n}}findConnectedComponents(){let e=new Set,t=[];for(let[n]of this.areaNodes){if(e.has(n))continue;let r=[],i=[n];for(;i.length>0;){let t=i.shift();if(e.has(t))continue;e.add(t),r.push(t);let n=this.areaNodes.get(t);if(n)for(let t of n.connections)e.has(t.toAreaId)||i.push(t.toAreaId)}t.push(r)}return t}forceDirectedLayout(e){let t=new Map;for(let n of e){let e=this.areaNodes.get(n);if(!e)continue;let r=new Set(e.connections.map(e=>e.toAreaId));t.set(n,r)}let n=new Set,r=new Set;for(let[e,r]of t)r.size>=3&&n.add(e);for(let[e,i]of t){if(n.has(e)||r.has(e)||i.size>2)continue;let a=[e];r.add(e);let o=Array.from(i);for(let i of o){let o=i,s=e;for(;o&&!r.has(o)&&!n.has(o);){let e=t.get(o);if(!e)break;if(e.size>=3){n.add(o);break}a.push(o),r.add(o);let i=!1;for(let t of e)if(t!==s&&!r.has(t)){s=o,o=t,i=!0;break}if(!i)break}}let s=!1;for(let e of a){let r=t.get(e);if(r){for(let e of r)if(n.has(e)){s=!0;break}}if(s)break}if(!s&&a.length>0){let e=a[0],i=t.get(a[0])?.size??0;for(let n of a){let r=t.get(n)?.size??0;r>i&&(i=r,e=n)}n.add(e),r.delete(e)}}for(let r of e){let e=t.get(r);(!e||e.size===0)&&n.add(r)}let i=new Map,a=new Map;for(let e of n)i.set(e,e),a.set(e,[]);let o=new Set(n);for(let e of n){let n=t.get(e)??new Set;for(let r of n){if(o.has(r))continue;let n=[],s=r,c=e;for(;s&&!o.has(s);){n.push(s),i.set(s,e),o.add(s);let r=t.get(s)??new Set,a;for(let e of r)if(e!==c&&!o.has(e)){a=e;break}c=s,s=a}n.length>0&&a.get(e).push(n)}}let s=new Set,c=[],l=n.values().next().value,u=l===void 0?e[0]:l;if(u!==void 0){let e=this.areaNodes.get(u);e&&(e.x=0,e.y=0,s.add(u),c.push(u))}for(;c.length>0;){let e=c.shift(),t=this.areaNodes.get(e),r=new Map;for(let e of t.connections){let t=e.toAreaId;if(s.has(t)||!n.has(t))continue;let i=this.areaNodes.get(t);if(!i)continue;let a=e.direction??`none`;r.has(a)||r.set(a,[]),r.get(a).push({id:t,node:i,conn:e})}for(let[e,n]of r){let r=this.getDirectionOffset(e===`none`?null:e);n.sort((e,t)=>Math.abs(r.x)>Math.abs(r.y)?t.node.realCenterY-e.node.realCenterY:e.node.realCenterX-t.node.realCenterX);let i=this.settings.areaWidth+this.settings.areaSpacing,a=this.settings.areaHeight+this.settings.areaSpacing;n.forEach((e,o)=>{if(e.node.x=t.x+r.x*i,e.node.y=t.y+r.y*a,n.length>1){let t=(o-(n.length-1)/2)*.5;Math.abs(r.x)>Math.abs(r.y)?e.node.y+=t*a:e.node.x+=t*i}s.add(e.id),c.push(e.id)})}}let d=Array.from(n);d.length>1&&this.applyForces(d,80);let f=this.settings.areaWidth+this.settings.areaSpacing+30,p=this.settings.areaHeight+this.settings.areaSpacing+30,m=new Map,h=[`east`,`west`,`north`,`south`,`northeast`,`northwest`,`southeast`,`southwest`];for(let[e,t]of a){let n=this.areaNodes.get(e);if(!n)continue;let r=0,i=new Map;for(let a of t){let t=e,o=n.x,s=n.y,c=null;for(let l of a){let a=this.areaNodes.get(l);if(!a)continue;let u=this.areaNodes.get(t),d=null;if(u){for(let e of u.connections)if(e.toAreaId===l){d=e.direction;break}}!d&&t===e?(c=h[r%h.length],r++,d=c):!d&&c&&(d=c);let g=this.getDirectionOffset(d),_=0;if(t===e&&d){let e=d,t=i.get(e)??0;i.set(e,t+1),_=t}if(a.x=o+g.x*f,a.y=s+g.y*p,_>0){let e=1.2;g.x!==0&&g.y===0?a.y+=_*p*e:g.y!==0&&g.x===0?a.x+=_*f*e:(a.x+=_*f*e,a.y-=_*p*e)}m.set(l,{dx:a.x-n.x,dy:a.y-n.y,hubId:e}),t=l,o=a.x,s=a.y}}}let g=new Map,_=new Map;for(let e of n){let t=this.areaNodes.get(e);if(!t)continue;let n=t.x,r=t.y,i=t.x+t.width,o=t.y+t.height,s=a.get(e)??[];for(let e of s)for(let t of e){let e=this.areaNodes.get(t);e&&(n=Math.min(n,e.x),r=Math.min(r,e.y),i=Math.max(i,e.x+e.width),o=Math.max(o,e.y+e.height))}g.set(e,{minX:n,minY:r,maxX:i,maxY:o}),_.set(e,{dx:n-t.x,dy:r-t.y})}this.applyClusterForces(d,g,_,60);for(let[e,t]of m){let n=this.areaNodes.get(e),r=this.areaNodes.get(t.hubId);!n||!r||(n.x=r.x+t.dx,n.y=r.y+t.dy)}let v=1/0,y=1/0,b=-1/0,x=-1/0;for(let t of e){let e=this.areaNodes.get(t);v=Math.min(v,e.x),y=Math.min(y,e.y),b=Math.max(b,e.x+e.width),x=Math.max(x,e.y+e.height)}return{minX:v,minY:y,maxX:b,maxY:x}}getDirectionOffset(e){let t={north:{x:0,y:-1},south:{x:0,y:1},east:{x:1,y:0},west:{x:-1,y:0},northeast:{x:.75,y:-.75},northwest:{x:-.75,y:-.75},southeast:{x:.75,y:.75},southwest:{x:-.75,y:.75}};return e&&t[e]?t[e]:{x:1,y:0}}applyClusterForces(e,t,n,r){let i=.8,a=new Map;for(let t of e)a.set(t,{vx:0,vy:0});for(let o=0;o<r;o++){for(let r of e){let e=this.areaNodes.get(r),i=t.get(r),a=n.get(r);if(!e||!i||!a)continue;let o=i.maxX-i.minX,s=i.maxY-i.minY;i.minX=e.x+a.dx,i.minY=e.y+a.dy,i.maxX=i.minX+o,i.maxY=i.minY+s}for(let n of e){let r=this.areaNodes.get(n),i=a.get(n),o=t.get(n);if(!(!r||!i||!o)){for(let r of e){if(n===r)continue;let e=t.get(r);if(!e)continue;let a=(o.minX+o.maxX)/2,s=(o.minY+o.maxY)/2,c=(e.minX+e.maxX)/2,l=(e.minY+e.maxY)/2,u=a-c,d=s-l,f=(o.maxX-o.minX)/2,p=(o.maxY-o.minY)/2,m=(e.maxX-e.minX)/2,h=(e.maxY-e.minY)/2,g=f+m+50,_=p+h+50,v=g-Math.abs(u),y=_-Math.abs(d);if(v>0&&y>0)if(v<y){let e=v*(u>=0?1:-1)*.5;i.vx+=e}else{let e=y*(d>=0?1:-1)*.5;i.vy+=e}}for(let t of r.connections){let n=this.areaNodes.get(t.toAreaId);if(!n||!e.includes(t.toAreaId))continue;let a=n.x-r.x,o=n.y-r.y,s=Math.sqrt(a*a+o*o)||1,c=(s-(this.settings.areaWidth+this.settings.areaSpacing+50))*.015;i.vx+=a/s*c,i.vy+=o/s*c}}}for(let t of e){let e=this.areaNodes.get(t),n=a.get(t);!e||!n||(e.x+=n.vx,e.y+=n.vy,n.vx*=i,n.vy*=i)}}}applyForces(e,t){let n=.8,r=this.settings.areaWidth+this.settings.areaSpacing,i=this.settings.areaWidth/2+60,a=new Set(e),o=[],s=new Set;for(let t of e){let e=this.areaNodes.get(t);if(e)for(let n of e.connections){if(!a.has(n.toAreaId))continue;let e=Math.min(t,n.toAreaId)+`-`+Math.max(t,n.toAreaId);s.has(e)||(s.add(e),o.push({from:t,to:n.toAreaId}))}}let c=new Map;for(let t of e)c.set(t,{vx:0,vy:0});for(let s=0;s<t;s++){for(let t of e){let n=this.areaNodes.get(t),s=c.get(t);if(!n||!s)continue;let l=n.x+n.width/2,u=n.y+n.height/2;for(let r of e){if(t===r)continue;let e=this.areaNodes.get(r);if(!e)continue;let i=(n.width+e.width)/2+20,a=(n.height+e.height)/2+20,o=n.x+n.width/2,c=n.y+n.height/2,l=e.x+e.width/2,u=e.y+e.height/2,d=o-l,f=c-u,p=i-Math.abs(d),m=a-Math.abs(f);p>0&&m>0&&(p<m?s.vx+=(d>=0?1:-1)*p*.5:s.vy+=(f>=0?1:-1)*m*.5)}for(let e of o){if(e.from===t||e.to===t)continue;let n=this.areaNodes.get(e.from),r=this.areaNodes.get(e.to);if(!n||!r)continue;let a=n.x+n.width/2,o=n.y+n.height/2,c=r.x+r.width/2,d=r.y+r.height/2,f=this.closestPointOnSegment(l,u,a,o,c,d),p=l-f.x,m=u-f.y,h=Math.sqrt(p*p+m*m)||1;if(h<i){let e=(i-h)*.6;s.vx+=p/h*e,s.vy+=m/h*e}}for(let e of n.connections){if(!a.has(e.toAreaId))continue;let t=this.areaNodes.get(e.toAreaId);if(!t)continue;let i=t.x-n.x,o=t.y-n.y,l=Math.sqrt(i*i+o*o)||1,u=(l-r)*.03;s.vx+=i/l*u,s.vy+=o/l*u;let d=this.getDirectionOffset(e.direction),f=n.x+d.x*r,p=n.y+d.y*r,m=c.get(e.toAreaId);m&&(m.vx+=(f-t.x)*.01,m.vy+=(p-t.y)*.01)}}for(let t of e){let e=this.areaNodes.get(t),r=c.get(t);!e||!r||(e.x+=r.vx,e.y+=r.vy,r.vx*=n,r.vy*=n)}}}closestPointOnSegment(e,t,n,r,i,a){let o=i-n,s=a-r,c=e-n,l=t-r,u=o*o+s*s;if(u===0)return{x:n,y:r};let d=(c*o+l*s)/u;return d=Math.max(0,Math.min(1,d)),{x:n+d*o,y:r+d*s}}edgesIntersect(e,t,n,r,i,a,o,s){let c=(e,t,n,r,i,a)=>(a-t)*(n-e)>(r-t)*(i-e);return c(e,t,i,a,o,s)!==c(n,r,i,a,o,s)&&c(e,t,n,r,i,a)!==c(e,t,n,r,o,s)}drawConnections(){this.connectionLayer.destroyChildren();for(let e of this.connectionGroups){let t=this.areaNodes.get(e.fromAreaId),n=this.areaNodes.get(e.toAreaId);if(!t||!n||!isFinite(t.x)||!isFinite(t.y)||!isFinite(n.x)||!isFinite(n.y))continue;let r={x:t.x+t.width/2,y:t.y+t.height/2},i={x:n.x+n.width/2,y:n.y+n.height/2},a,o;if(this.dotsMode?(a=r,o=i):(a=this.getEdgePoint(t,i),o=this.getEdgePoint(n,r)),!isFinite(a.x)||!isFinite(a.y)||!isFinite(o.x)||!isFinite(o.y))continue;let s=this.dotsMode?`#ffffff`:this.settings.connectionColor,c=this.dotsMode?1:Math.min(this.settings.connectionLineWidth,1+e.connections.length*.5),u=new l.default.Line({points:[a.x,a.y,o.x,o.y],stroke:s,strokeWidth:c,lineCap:`round`,listening:!1});this.connectionLayer.add(u)}}getEdgePoint(e,t){let n=e.x+e.width/2,r=e.y+e.height/2,i=t.x-n,a=t.y-r,o=e.width/2,s=e.height/2;if(i===0&&a===0)return{x:n,y:r};let c=Math.abs(i),l=Math.abs(a),u;return u=c/o>l/s?o/c:s/l,{x:n+i*u,y:r+a*u}}drawAreas(){this.areaLayer.destroyChildren();for(let[,e]of this.areaNodes){if(!isFinite(e.x)||!isFinite(e.y))continue;let t=e.areaId===this.highlightedArea;if(this.dotsMode){let n=e.x+e.width/2,r=e.y+e.height/2,i=new l.default.Group({x:n,y:r,draggable:!0}),a=new l.default.Circle({radius:6,fill:t?this.settings.highlightColor:`#ffffff`,stroke:t?this.settings.highlightColor:`#ffffff`,strokeWidth:1}),o=new l.default.Text({text:e.name,fontSize:10,fill:`#ffffff`,x:10,y:-5});i.add(a),i.add(o),i.on(`click tap`,()=>{this.emitAreaClickEvent(e.areaId)}),i.on(`mouseenter`,()=>{this.stage.container().style.cursor=`pointer`,a.fill(this.settings.highlightColor),a.stroke(this.settings.highlightColor),this.areaLayer.batchDraw()}),i.on(`mouseleave`,()=>{this.stage.container().style.cursor=`auto`,a.fill(t?this.settings.highlightColor:`#ffffff`),a.stroke(t?this.settings.highlightColor:`#ffffff`),this.areaLayer.batchDraw()}),i.on(`dragmove`,()=>{e.x=i.x()-e.width/2,e.y=i.y()-e.height/2,this.drawConnections(),this.connectionLayer.batchDraw()}),i.on(`dragstart`,()=>{this.stage.container().style.cursor=`grabbing`}),i.on(`dragend`,()=>{this.stage.container().style.cursor=`pointer`}),this.areaLayer.add(i)}else{let n=new l.default.Group({x:e.x,y:e.y,draggable:!0}),r=new l.default.Rect({width:e.width,height:e.height,fill:this.settings.areaFillColor,stroke:t?this.settings.highlightColor:this.settings.areaStrokeColor,strokeWidth:t?3:2,cornerRadius:8}),i=new l.default.Text({text:e.name,fontSize:this.settings.fontSize,fill:this.settings.textColor,width:e.width-10,height:e.height-20,x:5,y:10,align:`center`,verticalAlign:`middle`,ellipsis:!0,wrap:`word`}),a=new l.default.Text({text:`${e.roomCount} rooms`,fontSize:10,fill:this.settings.connectionColor,width:e.width-10,x:5,y:e.height-18,align:`center`});n.add(r),n.add(i),n.add(a),n.on(`click tap`,()=>{this.emitAreaClickEvent(e.areaId)}),n.on(`mouseenter`,()=>{this.stage.container().style.cursor=`pointer`,r.stroke(this.settings.highlightColor),this.areaLayer.batchDraw()}),n.on(`mouseleave`,()=>{this.stage.container().style.cursor=`auto`,r.stroke(t?this.settings.highlightColor:this.settings.areaStrokeColor),this.areaLayer.batchDraw()}),n.on(`dragmove`,()=>{e.x=n.x(),e.y=n.y(),this.drawConnections(),this.connectionLayer.batchDraw()}),n.on(`dragstart`,()=>{this.stage.container().style.cursor=`grabbing`}),n.on(`dragend`,()=>{this.stage.container().style.cursor=`pointer`}),this.areaLayer.add(n)}}}centerView(){let e=1/0,t=1/0,n=-1/0,r=-1/0;for(let[,i]of this.areaNodes)e=Math.min(e,i.x),t=Math.min(t,i.y),n=Math.max(n,i.x+i.width),r=Math.max(r,i.y+i.height);if(!isFinite(e))return;let i=n-e,a=r-t,o=e+i/2,s=t+a/2,c=(this.stage.width()-100)/i,l=(this.stage.height()-100)/a,u=Math.min(c,l,1.5);this.setZoom(u);let d=this.stage.scaleX();this.stage.position({x:this.stage.width()/2-o*d,y:this.stage.height()/2-s*d})}highlightArea(e){this.highlightedArea=e,this.drawAreas(),this.stage.batchDraw()}centerOnArea(e){let t=this.areaNodes.get(e);if(!t)return;let n=this.stage.scaleX(),r=t.x+t.width/2,i=t.y+t.height/2;this.stage.position({x:this.stage.width()/2-r*n,y:this.stage.height()/2-i*n}),this.stage.batchDraw()}emitAreaClickEvent(e){let t=new CustomEvent(`areaclick`,{detail:{areaId:e}});this.stage.container().dispatchEvent(t)}getAreaNode(e){return this.areaNodes.get(e)}getConnectionGroups(){return this.connectionGroups}destroy(){this.stage.destroy()}},pn=class{get settings(){return this.renderer.settings}constructor(e,t){this.renderer=new it(e,t)}drawArea(e,t){this.renderer.drawArea(e,t)}getCurrentArea(){return this.renderer.getCurrentArea()}setPosition(e){this.renderer.state.positionRoomId=e}clearPosition(){this.renderer.state.positionRoomId=void 0}renderPath(e,t=`#66E64D`){this.renderer.renderPath(e,t)}clearPaths(){this.renderer.clearPaths()}renderHighlight(e,t){this.renderer.renderHighlight(e,t)}removeHighlight(e){this.renderer.removeHighlight(e)}hasHighlight(e){return this.renderer.hasHighlight(e)}clearHighlights(){this.renderer.clearHighlights()}exportSvg(e){return this.renderer.exportSvg(e)}renderToCanvas(e){return this.renderer.renderToCanvas(e)}destroy(){this.renderer.destroy()}};exports.AreaMapRenderer=fn,exports.BlueprintBackend=Nt,exports.ExplorationArea=H,exports.HeadlessRenderer=pn,exports.IsometricBackend=Gt,exports.KonvaBackend=De,exports.KonvaRenderBackend=Qe,exports.MapGraph=nn,exports.MapReader=Jt,exports.MapRenderer=it,exports.MapState=y,exports.NeonBackend=Ht,exports.ParchmentBackend=St,exports.PathFinder=ln,exports.Renderer=at,exports.SketchyBackend=dt,exports.Viewport=Ce,exports.colorLightness=m,exports.computePathData=Fe,exports.createAreaMapSettings=dn,exports.createSettings=p,exports.darkenColor=h,exports.hexToRgba=_;
|
|
6
6
|
//# sourceMappingURL=index.cjs.map
|