@primitiv/core 0.19.0
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/LICENSE.txt +190 -0
- package/README.md +9 -0
- package/dist/index.cjs +4 -0
- package/dist/index.d.ts +2421 -0
- package/dist/index.mjs +4 -0
- package/package.json +64 -0
package/dist/index.mjs
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
var f=255,vt=256;var z=class u{width;height;size;data;constructor(e,t){this.width=e,this.height=t,this.size=e*t,this.data=new Uint32Array(this.size)}clear(){this.data.fill(255<<24|255<<16|0)}fill(e,t,r){let i=r<<24|t<<16|e;this.data.fill(i)}setSafe(e,t,r,i,n){e<0||e>=this.width||t<0||t>=this.height||(this.data[t*this.width+e]=n<<24|i<<16|r)}set(e,t,r,i){this.data[e]=i<<24|r<<16|t}setPacked(e,t){this.data[e]=t}get(e){return this.data[e]}unpack(e){let t=this.data[e];return{char:t&65535,fg:t>>>16&255,bg:t>>>24&255}}clone(){let e=new u(this.width,this.height);return e.data.set(this.data),e}};var ce=class{static pack(e,t,r){return r<<24|t<<16|e}static getChar(e){return e&65535}static getFg(e){return e>>>16&255}static getBg(e){return e>>>24&255}};import{OrderType as M,ShapeType as ie}from"@primitiv/types";var be=class{rasterize(e,t,r){for(let i of t)this.executeOrder(e,i,r)}executeOrder(e,t,r){switch(t.type){case M.Char:this.drawChar(e,t);break;case M.Text:this.drawText(e,t);break;case M.TextMultiline:this.drawTextMultiline(e,t);break;case M.SubFrame:this.drawSubFrame(e,t);break;case M.SubFrameMulti:this.drawSubFrameMulti(e,t);break;case M.FullFrame:this.drawFullFrame(e,t);break;case M.FullFrameMulti:this.drawFullFrameMulti(e,t);break;case M.ColorMap:this.drawColorMap(e,t);break;case M.DotCloud:this.drawDotCloud(e,t);break;case M.DotCloudMulti:this.drawDotCloudMulti(e,t);break;case M.SpriteCloud:this.drawSpriteCloud(e,t,r);break;case M.SpriteCloudMulti:this.drawSpriteCloudMulti(e,t,r);break;case M.SpriteCloudVaried:this.drawSpriteCloudVaried(e,t,r);break;case M.SpriteCloudVariedMulti:this.drawSpriteCloudVariedMulti(e,t,r);break;case M.Bitmask:this.drawBitmask(e,t);break;case M.Bitmask4:this.drawBitmask4(e,t);break;case M.Bitmask16:this.drawBitmask16(e,t);break;case M.Polyline:this.drawPolyline(e,t);break;case M.Fill:this.drawFill(e,t);break;case M.FillChar:this.drawFillChar(e,t);break;case M.FillSprite:this.drawFillSprite(e,t,r);break;case M.FillSpriteMulti:this.drawFillSpriteMulti(e,t,r);break;case M.Sprite:this.drawSprite(e,t,r);break;case M.SpriteMulti:this.drawSpriteMulti(e,t,r);break;case M.Shape:this.drawShape(e,t);break}}drawChar(e,t){let{x:r,y:i,char:n,fg:s,bg:o}=t;e.setSafe(r,i,n,s,o)}drawText(e,t){let{x:r,y:i,text:n,fg:s,bg:o}=t;if(typeof n=="string")for(let d=0;d<n.length;d++){let l=n.charCodeAt(d);e.setSafe(r+d,i,l,s,o)}}drawTextMultiline(e,t){let{x:r,y:i,text:n,fg:s,bg:o}=t;if(typeof n!="string")return;let d=n.split(`
|
|
2
|
+
`);for(let l=0;l<d.length;l++){let a=d[l];for(let c=0;c<a.length;c++){let b=a.charCodeAt(c);e.setSafe(r+c,i+l,b,s,o)}}}drawSubFrame(e,t){let{x:r,y:i,width:n,height:s,frame:o,fg:d,bg:l}=t;for(let a=0;a<s;a++)for(let c=0;c<n;c++){let b=a*n+c;b<o.length&&e.setSafe(r+c,i+a,o[b],d,l)}}drawSubFrameMulti(e,t){let{x:r,y:i,width:n,height:s,frame:o}=t;for(let d=0;d<s;d++)for(let l=0;l<n;l++){let a=d*n+l;if(a<o.length){let c=o[a];e.setSafe(r+l,i+d,c.char,c.fg,c.bg)}}}drawFullFrame(e,t){let{frame:r,fg:i,bg:n}=t,s=e.width,o=e.height,d=0;for(let l=0;l<o;l++)for(let a=0;a<s;a++){if(d>=r.length)return;e.setSafe(a,l,r[d],i,n),d++}}drawFullFrameMulti(e,t){let{frame:r}=t,i=e.width,n=e.height,s=0;for(let o=0;o<n;o++)for(let d=0;d<i;d++){if(s>=r.length)return;let l=r[s];e.setSafe(d,o,l.char,l.fg,l.bg),s++}}drawColorMap(e,t){let{x:r,y:i,width:n,height:s,data:o}=t;for(let d=0;d<s;d++)for(let l=0;l<n;l++){let a=d*n+l;if(a<o.length){let c=o[a];if(r+l>=0&&r+l<e.width&&i+d>=0&&i+d<e.height){let b=(i+d)*e.width+(r+l),m=e.data[b]&65535;e.data[b]=c.bg<<24|c.fg<<16|m}}}}drawFill(e,t){let{char:r,fg:i,bg:n,x:s,y:o,width:d,height:l}=t,a=s??0,c=o??0,b=d??e.width,h=l??e.height;if(a===0&&c===0&&b===e.width&&h===e.height){let m=n<<24|i<<16|r&65535;e.data.fill(m);return}for(let m=c;m<c+h;m++)for(let g=a;g<a+b;g++)e.setSafe(g,m,r,i,n)}drawFillChar(e,t){let{patternWidth:r,patternHeight:i,pattern:n,fg:s,bg:o}=t;if(!(r<=0||i<=0))for(let d=0;d<e.height;d++)for(let l=0;l<e.width;l++){let a=l%r,c=d%i,b=n[c*r+a];e.setSafe(l,d,b,s,o)}}drawFillSprite(e,t,r){if(!r)return;let i=r.getUnicolorSprite(t.spriteId);if(i)for(let n=0;n<e.height;n+=i.height)for(let s=0;s<e.width;s+=i.width)for(let o=0;o<i.height;o++)for(let d=0;d<i.width;d++){let l=i.data[o*i.width+d];e.setSafe(s+d,n+o,l,t.fg,t.bg)}}drawFillSpriteMulti(e,t,r){if(!r)return;let i=r.getMulticolorSprite(t.spriteId);if(i)for(let n=0;n<e.height;n+=i.height)for(let s=0;s<e.width;s+=i.width)for(let o=0;o<i.height;o++)for(let d=0;d<i.width;d++){let l=i.data[o*i.width+d],a=s+d,c=n+o;a>=0&&a<e.width&&c>=0&&c<e.height&&(e.data[c*e.width+a]=l)}}drawSprite(e,t,r){if(!r)return;let{x:i,y:n,spriteId:s,fg:o,bg:d}=t,l=r.getUnicolorSprite(s);if(l)for(let a=0;a<l.height;a++)for(let c=0;c<l.width;c++){let b=l.data[a*l.width+c];e.setSafe(i+c,n+a,b,o,d)}}drawSpriteMulti(e,t,r){if(!r)return;let{x:i,y:n,spriteId:s}=t,o=r.getMulticolorSprite(s);if(o)for(let d=0;d<o.height;d++)for(let l=0;l<o.width;l++){let a=o.data[d*o.width+l],c=i+l,b=n+d;c>=0&&c<e.width&&b>=0&&b<e.height&&(e.data[b*e.width+c]=a)}}drawDotCloud(e,t){let{positions:r,char:i,fg:n,bg:s}=t;for(let o of r)e.setSafe(o.x,o.y,i,n,s)}drawDotCloudMulti(e,t){for(let r of t.dots)e.setSafe(r.x,r.y,r.char,r.fg,r.bg)}drawSpriteCloud(e,t,r){if(!r)return;let i=r.getUnicolorSprite(t.spriteId);if(i)for(let n of t.positions)for(let s=0;s<i.height;s++)for(let o=0;o<i.width;o++){let d=i.data[s*i.width+o];e.setSafe(n.x+o,n.y+s,d,t.fg,t.bg)}}drawSpriteCloudMulti(e,t,r){if(!r)return;let i=r.getMulticolorSprite(t.spriteId);if(i)for(let n of t.positions)for(let s=0;s<i.height;s++)for(let o=0;o<i.width;o++){let d=i.data[s*i.width+o],l=n.x+o,a=n.y+s;l>=0&&l<e.width&&a>=0&&a<e.height&&(e.data[a*e.width+l]=d)}}drawSpriteCloudVaried(e,t,r){if(r)for(let i of t.sprites){let n=r.getUnicolorSprite(i.spriteId);if(n)for(let s=0;s<n.height;s++)for(let o=0;o<n.width;o++){let d=n.data[s*n.width+o];e.setSafe(i.x+o,i.y+s,d,i.fg,i.bg)}}}drawSpriteCloudVariedMulti(e,t,r){if(r)for(let i of t.sprites){let n=r.getMulticolorSprite(i.spriteId);if(n)for(let s=0;s<n.height;s++)for(let o=0;o<n.width;o++){let d=n.data[s*n.width+o],l=i.x+o,a=i.y+s;l>=0&&l<e.width&&a>=0&&a<e.height&&(e.data[a*e.width+l]=d)}}}drawBitmask(e,t){let{x:r,y:i,width:n,height:s,mask:o,char:d,fg:l,bg:a,override:c}=t;for(let b=0;b<s;b++)for(let h=0;h<n;h++){let m=b*n+h,g=m>>3,p=m&7;(o[g]&1<<p)!==0?e.setSafe(r+h,i+b,d,l,a):c&&e.setSafe(r+h,i+b,0,255,255)}}drawBitmask4(e,t){let{x:r,y:i,width:n,height:s,mask:o,variants:d,override:l}=t;for(let a=0;a<s;a++)for(let c=0;c<n;c++){let b=a*n+c,h=b>>2,g=(b&3)*2,p=o[h]>>g&3;if(p>0){let y=d[p-1];y&&e.setSafe(r+c,i+a,y.char,y.fg,y.bg)}else l&&e.setSafe(r+c,i+a,0,255,255)}}drawBitmask16(e,t){let{x:r,y:i,width:n,height:s,mask:o,variants:d,override:l}=t;for(let a=0;a<s;a++)for(let c=0;c<n;c++){let b=a*n+c,h=b>>1,g=(b&1)*4,p=o[h]>>g&15;if(p>0){let y=d[p-1];y&&e.setSafe(r+c,i+a,y.char,y.fg,y.bg)}else l&&e.setSafe(r+c,i+a,0,255,255)}}drawPolyline(e,t){let{points:r,char:i,fg:n,bg:s}=t;if(!(r.length<2))for(let o=0;o<r.length-1;o++){let d=r[o],l=r[o+1];this.drawLineBresenham(e,d.x,d.y,l.x,l.y,i,n,s)}}drawLineBresenham(e,t,r,i,n,s,o,d){let l=Math.abs(i-t),a=Math.abs(n-r),c=t<i?1:-1,b=r<n?1:-1,h=l-a;for(;e.setSafe(t,r,s,o,d),!(t===i&&r===n);){let m=2*h;m>-a&&(h-=a,t+=c),m<l&&(h+=l,r+=b)}}drawShape(e,t){switch(t.shapeType){case ie.Rectangle:this.drawRectangle(e,t);break;case ie.Circle:this.drawCircle(e,t);break;case ie.Line:t.x1!==void 0&&t.y1!==void 0&&t.x2!==void 0&&t.y2!==void 0&&this.drawLineBresenham(e,t.x1,t.y1,t.x2,t.y2,t.char,t.fg,t.bg);break;case ie.Ellipse:this.drawEllipse(e,t);break;case ie.Triangle:this.drawTriangle(e,t);break}}drawRectangle(e,t){let{char:r,fg:i,bg:n,filled:s}=t,o=t.x??0,d=t.y??0,l=t.width??0,a=t.height??0;if(s)for(let c=d;c<d+a;c++)for(let b=o;b<o+l;b++)e.setSafe(b,c,r,i,n);else{for(let c=o;c<o+l;c++)e.setSafe(c,d,r,i,n),e.setSafe(c,d+a-1,r,i,n);for(let c=d+1;c<d+a-1;c++)e.setSafe(o,c,r,i,n),e.setSafe(o+l-1,c,r,i,n)}}drawCircle(e,t){let{char:r,fg:i,bg:n,filled:s}=t,o=t.x??0,d=t.y??0,l=t.radius??0;if(l<=0)return;let a=l,c=0,b=0;for(;a>=c;){if(s){for(let h=o-a;h<=o+a;h++)e.setSafe(h,d+c,r,i,n);for(let h=o-a;h<=o+a;h++)e.setSafe(h,d-c,r,i,n);for(let h=o-c;h<=o+c;h++)e.setSafe(h,d+a,r,i,n);for(let h=o-c;h<=o+c;h++)e.setSafe(h,d-a,r,i,n)}else e.setSafe(o+a,d+c,r,i,n),e.setSafe(o+c,d+a,r,i,n),e.setSafe(o-c,d+a,r,i,n),e.setSafe(o-a,d+c,r,i,n),e.setSafe(o-a,d-c,r,i,n),e.setSafe(o-c,d-a,r,i,n),e.setSafe(o+c,d-a,r,i,n),e.setSafe(o+a,d-c,r,i,n);b<=0&&(c+=1,b+=2*c+1),b>0&&(a-=1,b-=2*a+1)}}drawEllipse(e,t){let{char:r,fg:i,bg:n,filled:s}=t,o=t.x??0,d=t.y??0,l=t.radiusX??t.radius??0,a=t.radiusY??t.radius??0;if(l<=0||a<=0)return;let c=0,b=a,h=a*a-l*l*a+.25*l*l,m=2*a*a*c,g=2*l*l*b;for(;m<g;){if(s)for(let y=o-c;y<=o+c;y++)e.setSafe(y,d+b,r,i,n),e.setSafe(y,d-b,r,i,n);else e.setSafe(o+c,d+b,r,i,n),e.setSafe(o-c,d+b,r,i,n),e.setSafe(o+c,d-b,r,i,n),e.setSafe(o-c,d-b,r,i,n);h<0?(c++,m+=2*a*a,h+=m+a*a):(c++,b--,m+=2*a*a,g-=2*l*l,h+=m-g+a*a)}let p=a*a*((c+.5)*(c+.5))+l*l*((b-1)*(b-1))-l*l*a*a;for(;b>=0;){if(s)for(let y=o-c;y<=o+c;y++)e.setSafe(y,d+b,r,i,n),e.setSafe(y,d-b,r,i,n);else e.setSafe(o+c,d+b,r,i,n),e.setSafe(o-c,d+b,r,i,n),e.setSafe(o+c,d-b,r,i,n),e.setSafe(o-c,d-b,r,i,n);p>0?(b--,g-=2*l*l,p+=l*l-g):(b--,c++,m+=2*a*a,g-=2*l*l,p+=m-g+l*l)}}drawTriangle(e,t){let{char:r,fg:i,bg:n,filled:s}=t,o=t.x1??0,d=t.y1??0,l=t.x2??0,a=t.y2??0,c=t.x3??0,b=t.y3??0;if(!s){this.drawLineBresenham(e,o,d,l,a,r,i,n),this.drawLineBresenham(e,l,a,c,b,r,i,n),this.drawLineBresenham(e,c,b,o,d,r,i,n);return}let h=o,m=d,g=l,p=a,y=c,w=b;if(m>p){let v=h;h=g,g=v,v=m,m=p,p=v}if(m>w){let v=h;h=y,y=v,v=m,m=w,w=v}if(p>w){let v=g;g=y,y=v,v=p,p=w,w=v}let k=w-m;if(k!==0)for(let v=0;v<k;v++){let D=v>p-m||p===m,X=D?w-p:p-m,H=v/k,E=(v-(D?p-m:0))/X,R=Math.floor(h+(y-h)*H),F;if(D?F=Math.floor(g+(y-g)*E):F=Math.floor(h+(g-h)*E),R>F){let L=R;R=F,F=L}for(let L=R;L<=F;L++)e.setSafe(L,m+v,r,i,n)}}};var he=class u{id=0;grid;x=0;y=0;origin;zIndex=0;visible=!0;name;isMacroLayer;width;height;mustBeReliable=!1;spriteRegistry;charCodeMode;is16bit;pendingOrders=[];ordersUpdatedThisTick=!1;enabled=!0;needsCommit=!1;static rasterizer=new be;constructor(e,t,r,i,n){r<1||r>256||i<1||i>256;let s={};typeof n=="boolean"?s={mustBeReliable:n}:n&&(s=n),this.origin=e,this.x=e.x,this.y=e.y,this.zIndex=t,this.name=s.name,this.width=r,this.height=i,this.mustBeReliable=s.mustBeReliable??!1,this.isMacroLayer=s.isMacroLayer??!1,this.charCodeMode=s.charCodeMode??"8bit",this.is16bit=this.charCodeMode==="16bit",this.grid=new z(r,i),this.grid.clear()}setId(e){this.id=e}setSpriteRegistry(e){this.spriteRegistry=e}resize(e,t){this.grid=new z(e,t),this.width=e,this.height=t}getMustBeReliable(){return this.mustBeReliable}getName(){return this.name}getIsMacroLayer(){return this.isMacroLayer}getWidth(){return this.width}getHeight(){return this.height}getOrigin(){return this.origin}setOrigin(e){this.origin=e,this.x=e.x,this.y=e.y,this.needsCommit=!0}setName(e){let t=typeof e=="string"?e.trim():void 0;this.name=t&&t.length>0?t:void 0}setEnabled(e){this.enabled=e,this.visible=e,this.needsCommit=!0}setZIndex(e){this.zIndex=e,this.needsCommit=!0}setMustBeReliable(e){this.mustBeReliable=e}getCellAt(e,t){return e<0||e>=this.width||t<0||t>=this.height?null:this.grid.unpack(t*this.width+e)}setOrders(e){this.pendingOrders=e,this.ordersUpdatedThisTick=!0,this.grid.clear(),u.rasterizer.rasterize(this.grid,e,this.spriteRegistry),this.needsCommit=!0}getPendingOrders(){return this.pendingOrders}clearPendingOrders(){this.pendingOrders.length=0,this.ordersUpdatedThisTick=!1}getOrdersUpdatedThisTick(){return this.ordersUpdatedThisTick}commit(){this.needsCommit=!0}getNeedsCommit(){return this.needsCommit}clearCommit(){this.needsCommit=!1}isEnabled(){return this.enabled}getDebugInfo(){return{id:this.id,name:this.name,zIndex:this.zIndex,origin:{x:this.x,y:this.y},width:this.width,height:this.height,visible:this.visible,enabled:this.enabled,mustBeReliable:this.mustBeReliable,isMacroLayer:this.isMacroLayer,charCodeMode:this.charCodeMode,needsCommit:this.needsCommit,ordersCount:this.pendingOrders.length}}};import{ScalingMode as Ke,Vector2 as qe}from"@primitiv/types";var me=class{id;x=0;y=0;width;height;cellWidth=8;cellHeight=8;pixelWidth=0;pixelHeight=0;postProcess={};scalingMode=Ke.None;activePaletteSlot=0;renderPasses;constructor(e,t,r){this.id=e,this.width=t,this.height=r}teleport(e,t){this.x=e,this.y=t}resize(e,t){this.width=e,this.height=t}setSize(e){this.width=e.x,this.height=e.y}setPixelViewport(e,t){this.pixelWidth=e,this.pixelHeight=t}calculateMaxCells(e,t){if(this.pixelWidth<=0||this.pixelHeight<=0)return null;let r=e??this.cellWidth,i=t??this.cellHeight;return r<=0||i<=0?null:{cols:Math.min(256,Math.max(1,Math.floor(this.pixelWidth/r))),rows:Math.min(256,Math.max(1,Math.floor(this.pixelHeight/i)))}}setCellSize(e,t){this.cellWidth=Math.max(1,Math.min(255,Math.round(e))),this.cellHeight=Math.max(1,Math.min(255,Math.round(t)))}getCellSize(){return{cellWidth:this.cellWidth,cellHeight:this.cellHeight}}setScalingMode(e){this.scalingMode=e}setAmbientEffect(e){this.postProcess.ambientEffect||(this.postProcess.ambientEffect={enabled:!1,blur:30,scale:1.3}),typeof e=="boolean"?this.postProcess.ambientEffect.enabled=e:this.postProcess.ambientEffect={...this.postProcess.ambientEffect,...e,enabled:e.enabled??!0}}setGrid(e){this.postProcess.grid||(this.postProcess.grid={enabled:!1}),typeof e=="boolean"?this.postProcess.grid.enabled=e:this.postProcess.grid={...this.postProcess.grid,...e,enabled:e.enabled??!0}}moveOrigin(e,t){this.x+=e,this.y+=t}setScanlines(e){this.postProcess.scanlines||(this.postProcess.scanlines={enabled:!1,opacity:.15,pattern:"horizontal"}),typeof e=="boolean"?this.postProcess.scanlines.enabled=e:this.postProcess.scanlines={...this.postProcess.scanlines,...e,enabled:e.enabled??!0}}setScanlinesEnabled(e){this.postProcess.scanlines?this.postProcess.scanlines.enabled=e:this.postProcess.scanlines={enabled:e,opacity:.15,pattern:"horizontal"}}setScanlinesOpacity(e){this.postProcess.scanlines?this.postProcess.scanlines.opacity=e:this.postProcess.scanlines={enabled:!0,opacity:e,pattern:"horizontal"}}setGridEnabled(e){this.postProcess.grid?this.postProcess.grid.enabled=e:this.postProcess.grid={enabled:e}}setAmbientEffectEnabled(e){this.postProcess.ambientEffect?this.postProcess.ambientEffect.enabled=e:this.postProcess.ambientEffect={enabled:e,blur:30,scale:1.3}}setPostProcess(e){if(e===null){this.postProcess={};return}this.postProcess={...this.postProcess,...e}}setOrigin(e){this.x=e.x,this.y=e.y}getOrigin(){return new qe(this.x,this.y)}getSize(){return{x:this.width,y:this.height,width:this.width,height:this.height}}switchPalette(e){this.activePaletteSlot=e}setRenderPasses(e){if(!e||e.length===0){this.renderPasses=void 0;return}if(e.length>4)throw new Error(`Display.setRenderPasses: max 4 passes, got ${e.length}`);this.renderPasses=e.map(t=>this.normalizePass(t))}getRenderPasses(){return this.renderPasses}normalizePass(e){let t=Math.max(0,Math.min(255,e.zMin)),r=Math.max(0,Math.min(255,e.zMax));if(t>r){let i=t;t=r,r=i}return{id:e.id,zMin:t,zMax:r,enabled:e.enabled!==!1}}getDebugInfo(){return{id:this.id,origin:{x:this.x,y:this.y},size:{width:this.width,height:this.height},pixelViewport:{pixelWidth:this.pixelWidth,pixelHeight:this.pixelHeight},cellSize:{cellWidth:this.cellWidth,cellHeight:this.cellHeight},scalingMode:this.scalingMode,activePaletteSlot:this.activePaletteSlot,postProcess:this.postProcess,renderPasses:this.renderPasses}}};import{OrderType as A,Vector2 as _e}from"@primitiv/types";var j=class{axes=new Map;buttons=new Map;touchZones=new Map;axisNameToId=new Map;buttonNameToId=new Map;touchZoneNameToId=new Map;version=1;s=null;o=null;d=null;defineAxis(e,t,r=[],i=-1,n=1,s=0){if(e<0||e>255)throw new Error(`Axis bindingId must be between 0 and 255, got ${e}`);if(this.axes.has(e))throw new Error(`Axis bindingId ${e} is already defined`);if(this.axisNameToId.has(t))throw new Error(`Axis name "${t}" is already defined`);let o={bindingId:e,name:t,min:i,max:n,defaultValue:s,sources:r};this.axes.set(e,o),this.axisNameToId.set(t,e),this.s=null,this.version++}defineButton(e,t,r=[],i=!1){if(e<0||e>255)throw new Error(`Button bindingId must be between 0 and 255, got ${e}`);if(this.buttons.has(e))throw new Error(`Button bindingId ${e} is already defined`);if(this.buttonNameToId.has(t))throw new Error(`Button name "${t}" is already defined`);let n={bindingId:e,name:t,defaultValue:i,sources:r};this.buttons.set(e,n),this.buttonNameToId.set(t,e),this.o=null,this.version++}defineTouchZone(e,t,r,i,n,s){if(e<0||e>31)throw new Error(`Touch zone zoneId must be between 0 and 31, got ${e}`);if(this.touchZones.has(e))throw new Error(`Touch zone zoneId ${e} is already defined`);if(this.touchZoneNameToId.has(t))throw new Error(`Touch zone name "${t}" is already defined`);let o={zoneId:e,name:t,x:r,y:i,width:n,height:s};this.touchZones.set(e,o),this.touchZoneNameToId.set(t,e),this.d=null,this.version++}evaluateAxis(e,t){let r=this.axes.get(e);if(!r)return 0;let i=0;for(let n of r.sources){let o=t.get(n.sourceId)??0,d=n.deadzone??0;Math.abs(o)<d?o=0:o=(o>0?1:-1)*((Math.abs(o)-d)/(1-d)),o*=(n.scale??1)*(n.sensitivity??1),n.invert&&(o=-o),i+=o}return Math.max(r.min,Math.min(r.max,i))}evaluateButton(e,t){let r=this.buttons.get(e);if(!r)return!1;for(let i of r.sources)if(t.get(i.sourceId)===!0)return!0;return r.defaultValue}toLoadPacket(){return{type:"input-binding",version:this.version,axes:Array.from(this.axes.values()),buttons:Array.from(this.buttons.values()),touchZones:this.touchZones.size>0?Array.from(this.touchZones.values()):void 0}}loadFromPacket(e){this.clear();for(let t of e.axes)this.defineAxis(t.bindingId,t.name,t.sources,t.min,t.max,t.defaultValue);for(let t of e.buttons)this.defineButton(t.bindingId,t.name,t.sources,t.defaultValue);if(e.touchZones)for(let t of e.touchZones)this.defineTouchZone(t.zoneId,t.name,t.x,t.y,t.width,t.height)}getAllAxes(){return this.s||(this.s=Array.from(this.axes.values()).sort((e,t)=>e.bindingId-t.bindingId)),this.s}getAllButtons(){return this.o||(this.o=Array.from(this.buttons.values()).sort((e,t)=>e.bindingId-t.bindingId)),this.o}getAllTouchZones(){return this.d||(this.d=Array.from(this.touchZones.values()).sort((e,t)=>e.zoneId-t.zoneId)),this.d}getAxisCount(){return this.axes.size}getButtonCount(){return this.buttons.size}getAxisId(e){return this.axisNameToId.get(e)??null}getButtonId(e){return this.buttonNameToId.get(e)??null}clear(){this.axes.clear(),this.buttons.clear(),this.touchZones.clear(),this.axisNameToId.clear(),this.buttonNameToId.clear(),this.touchZoneNameToId.clear(),this.s=null,this.o=null,this.d=null,this.version++}};var pe=class{id;name;data={};bridgeInbox=[];p=new Map;c=new Map;t=new Map;isTabHidden=!1;layers=new Map;displays=new Map;nextLayerId=1;i=null;n=null;spriteRegistry;macroRegistry=null;commandQueue=[];C=[];nextSoundInstanceId=1;axes=new Map;buttons=new Map;justPressed=new Set;justReleased=new Set;mouseX=0;mouseY=0;activeDisplay=0;mouseOver=!1;constructor(e,t){this.id=e,this.name=t}setSpriteRegistry(e){this.spriteRegistry=e;for(let t of this.layers.values())t.setSpriteRegistry(e)}addLayer(e,t){let r=this.nextLayerId++;e.setId(r),this.layers.set(e.id,e),this.i=null,this.spriteRegistry&&e.setSpriteRegistry(this.spriteRegistry)}addDisplay(e){this.displays.set(e.id,e),this.n=null}getMouseDisplayInfo(){return this.mouseOver?{localX:this.mouseX,localY:this.mouseY,displayId:this.activeDisplay}:null}getTouchDisplayInfo(e){return!this.mouseOver||e!==void 0&&this.activeDisplay!==e?null:this.getMouseDisplayInfo()}getDisplayViewport(e){let t=this.displays.get(e);return t?{id:t.id,x:t.x,y:t.y,width:t.width,height:t.height,pixelWidth:t.pixelWidth,pixelHeight:t.pixelHeight,origin:{x:t.x,y:t.y},size:{x:t.width,y:t.height,width:t.width,height:t.height}}:null}calculateMaxCells(e,t,r){let i=this.displays.get(e);return i?i.calculateMaxCells(t,r):null}inputRegistry=new j;getInputBindingRegistry(){return this.inputRegistry}applyInput(e,t){this.mouseX=e.mouseX,this.mouseY=e.mouseY,this.mouseOver=e.mouseOverDisplay,this.activeDisplay=e.displayId;for(let r of t.getAllAxes()){let i=e.axes.get(r.bindingId)??r.defaultValue;this.axes.set(r.name,i)}for(let r of t.getAllButtons()){let i=e.buttons.get(r.bindingId)??r.defaultValue,n=this.buttons.get(r.name)??!1;i&&!n?this.justPressed.add(r.name):!i&&n&&this.justReleased.add(r.name),this.buttons.set(r.name,i)}}poll(){this.justPressed.clear(),this.justReleased.clear(),this.commandQueue.length=0}playSound(e,t){let r=this.nextSoundInstanceId++,i={type:A.Audio,sound:e,instanceId:r,...t};return this.commandQueue.push(i),r}stopSound(e){let t={type:A.Audio,sound:e,stop:!0};this.commandQueue.push(t)}stopAllSounds(){let e={type:A.Audio,sound:"all",stop:!0};this.commandQueue.push(e)}fadeOutSound(e,t){let r={type:A.Audio,sound:e,fadeOut:t};this.commandQueue.push(r)}fadeOutAllSounds(e){let t={type:A.Audio,sound:"all",fadeOut:e};this.commandQueue.push(t)}pauseSound(e){let t={type:A.Audio,sound:e,pause:!0};this.commandQueue.push(t)}pauseAllSounds(){let e={type:A.Audio,sound:"all",pause:!0};this.commandQueue.push(e)}resumeSound(e){let t={type:A.Audio,sound:e,resume:!0};this.commandQueue.push(t)}resumeAllSounds(){let e={type:A.Audio,sound:"all",resume:!0};this.commandQueue.push(e)}setSoundEffects(e,t){let r={type:A.Audio,sound:e,...t};this.commandQueue.push(r)}setListenerPosition(e,t){let r={type:A.Audio,sound:"__listener_position__",x:e,y:t};this.commandQueue.push(r)}configureSpatialAudio(e){let t={type:A.Audio,sound:"__configure_spatial__",...e};this.commandQueue.push(t)}sendSounds(){this.M=!0}M=!1;vibrate(e){let t={type:A.Vibration,pattern:e};this.commandQueue.push(t)}vibrateGamepad(e){let t={type:A.Vibration,target:"gamepad",gamepadIndex:e.gamepadIndex??0,duration:e.duration,strongMagnitude:e.strongMagnitude??1,weakMagnitude:e.weakMagnitude??1,startDelay:e.startDelay??0};this.commandQueue.push(t)}setPostProcess(e,t){let r=this.displays.get(e);r&&r.setPostProcess(t)}setAmbientEffect(e,t){let r=this.displays.get(e);r&&r.setAmbientEffect(t)}setGrid(e,t){let r=this.displays.get(e);r&&r.setGrid(t)}setScalingMode(e,t){let r=this.displays.get(e);r&&r.setScalingMode(t)}switchPalette(e,t){let r=this.displays.get(e);r&&r.switchPalette(t)}setOrigin(e,t){let r=this.displays.get(e);r&&r.setOrigin(t)}flushCommands(){let e=this.commandQueue;return this.commandQueue=this.C,this.C=e,this.commandQueue.length=0,e}getAxis(e){return this.axes.get(e)??0}getButton(e){return this.buttons.get(e)??!1}isJustPressed(e){return this.justPressed.has(e)}isJustReleased(e){return this.justReleased.has(e)}createLayer(e,t,r){if(this.layers.has(e))throw new Error(`Layer ${e} already exists`);let i=new he(new _e(0,0),0,t,r);return i.setId(e),this.layers.set(e,i),this.i=null,i}getLayer(e){return this.layers.get(e)}removeLayer(e){let t=this.layers.delete(e);return t&&(this.i=null),t}getLayers(){return this.i===null&&(this.i=Array.from(this.layers.values())),this.i}createDisplay(e,t,r){if(this.displays.has(e))throw new Error(`Display ${e} already exists`);let i=new me(e,t,r);return this.displays.set(e,i),this.n=null,i}getDisplay(e){return this.displays.get(e)}removeDisplay(e){let t=this.displays.delete(e);return t&&(this.n=null),t}getDisplays(){return this.n===null&&(this.n=Array.from(this.displays.values())),this.n}defineButton(e,t,r,i=!1){this.inputRegistry.defineButton(e,t,r,i)}defineAxis(e,t,r,i=-1,n=1,s=0){this.inputRegistry.defineAxis(e,t,r,i,n,s)}handleAudioAck(e){switch(e.type){case"sound-loaded":this.p.set(e.soundId,{name:e.name,loadedAt:Date.now()}),this.c.delete(e.soundId);break;case"sound-error":this.c.set(e.soundId,{name:e.name,error:e.error,at:Date.now()});break;case"playback-started":this.t.set(e.instanceId,{soundId:e.soundId,startedAt:Date.now()});break;case"playback-ended":this.t.delete(e.instanceId);break;case"playback-error":e.instanceId!=null&&this.t.delete(e.instanceId);break}}isSoundLoaded(e){return this.p.has(e)}getLoadedSounds(){return this.p}getSoundLoadError(e){return this.c.get(e)?.error}getSoundLoadErrors(){return this.c}isSoundPlaying(e){return this.t.has(e)}getPlayingSounds(){return this.t}getPlayingSoundCount(){return this.t.size}setMacroRegistry(e){this.macroRegistry=e}getMacroRegistry(){return this.macroRegistry}loadMacro(e,t){if(!this.macroRegistry)throw new Error("MacroRegistry not set");return this.macroRegistry.registerTemplate(e,t)}createMacroInstance(e){if(!this.macroRegistry)throw new Error("MacroRegistry not set");return this.macroRegistry.createInstance(e)}updateMacroInstance(e,t){this.macroRegistry?.updateInstance(e,t)}removeMacroInstance(e){this.macroRegistry?.removeInstance(e)}pauseMacroInstance(e){this.macroRegistry?.pauseInstance(e)}resumeMacroInstance(e){this.macroRegistry?.resumeInstance(e)}onMacroEvent(e,t,r){this.macroRegistry?.onEvent(e,t,r)}handleMacroFeedback(e){this.macroRegistry?.handleFeedback(e)}};import{OrderType as Be}from"@primitiv/types";import{Logger as et}from"@primitiv/logger";var tt=et.create("core:update-builder"),Re=class{buffer;view;offset=0;textEncoder=new TextEncoder;constructor(e=1024){this.buffer=new Uint8Array(e),this.view=new DataView(this.buffer.buffer)}serialize(e){this.offset=0;let t=e.flushCommands();this.writeUint8(Math.min(t.length,255));for(let r of t)this.writeOrder(r);return this.buffer.slice(0,this.offset)}writeOrder(e){switch(this.writeUint8(e.type),e.type){case Be.Audio:this.writeAudioOrder(e);break;case Be.Vibration:this.writeVibrationOrder(e);break;case Be.PostProcess:this.writePostProcessOrder(e);break;default:tt.warn(`Unsupported order type ${e.type}`);break}}writeAudioOrder(e){typeof e.sound=="number"?(this.writeUint8(0),this.writeUint16(e.sound)):(this.writeUint8(1),this.writeString(e.sound)),this.writeUint16(e.instanceId??0);let t=0;e.stop&&(t|=1),e.pause&&(t|=2),e.resume&&(t|=4),e.loop&&(t|=8),this.writeUint8(t),this.writeUint8(Math.floor((e.volume??1)*255)),this.writeUint8(Math.floor((e.pitch??1)*100)),this.writeInt16(e.x??0),this.writeInt16(e.y??0)}writeVibrationOrder(e){if("target"in e&&e.target==="gamepad"){this.writeUint8(0);return}let t=Array.isArray(e.pattern)?e.pattern:[e.pattern];this.writeUint8(Math.min(t.length,255));for(let r of t)this.writeUint16(r)}writePostProcessOrder(e){this.writeUint8(e.displayId),this.writeUint8(e.enabled?1:0),this.writeUint8(Math.min(255,Math.floor((e.bloom??0)*100))),this.writeUint8(Math.min(255,Math.floor((e.chromaticAberration??0)*100))),this.writeUint8(Math.min(255,Math.floor((e.scanlineOpacity??0)*255)))}ensureCapacity(e){if(this.offset+e>this.buffer.length){let t=Math.max(this.buffer.length*2,this.offset+e),r=new Uint8Array(t);r.set(this.buffer),this.buffer=r,this.view=new DataView(this.buffer.buffer)}}writeUint8(e){this.ensureCapacity(1),this.buffer[this.offset++]=e}writeUint16(e){this.ensureCapacity(2),this.view.setUint16(this.offset,e,!1),this.offset+=2}writeInt16(e){this.ensureCapacity(2),this.view.setInt16(this.offset,e,!1),this.offset+=2}writeString(e){let t=this.textEncoder.encode(e);this.writeUint8(Math.min(t.length,255)),this.ensureCapacity(t.length),this.buffer.set(t,this.offset),this.offset+=t.length}};import{OrderType as Q}from"@primitiv/types";import{Logger as rt}from"@primitiv/logger";var it=rt.create("core:update-parser"),De=class{textDecoder=new TextDecoder;parse(e){let t=new DataView(e.buffer,e.byteOffset,e.byteLength),r=0,i=[];if(r>=e.byteLength)return i;let n=e[r++];for(let s=0;s<n&&!(r>=e.byteLength);s++){let o=this.parseOrder(e,t,r);if(o)i.push(o.order),r=o.newOffset;else break}return i}parseOrder(e,t,r){let i=e[r++];switch(i){case Q.Audio:return this.parseAudioOrder(e,t,r);case Q.Vibration:return this.parseVibrationOrder(e,t,r);case Q.PostProcess:return this.parsePostProcessOrder(e,t,r);default:return it.warn(`Unsupported order type ${i}`),null}}parseAudioOrder(e,t,r){let i=e[r++],n;if(i===0)n=t.getUint16(r,!1),r+=2;else{let y=e[r++];n=this.textDecoder.decode(e.slice(r,r+y)),r+=y}let s=t.getUint16(r,!1);r+=2;let o=e[r++],d=(o&1)!==0,l=(o&2)!==0,a=(o&4)!==0,c=(o&8)!==0,b=e[r++]/255,h=e[r++]/100,m=t.getInt16(r,!1);r+=2;let g=t.getInt16(r,!1);return r+=2,{order:{type:Q.Audio,sound:n,instanceId:s,volume:b,pitch:h,loop:c,stop:d,pause:l,resume:a,x:m,y:g},newOffset:r}}parseVibrationOrder(e,t,r){let i=e[r++],n=[];for(let o=0;o<i;o++)n.push(t.getUint16(r,!1)),r+=2;return{order:{type:Q.Vibration,pattern:n},newOffset:r}}parsePostProcessOrder(e,t,r){let i=e[r++],n=e[r++]!==0,s=e[r++]/100,o=e[r++]/100,d=e[r++]/255;return{order:{type:Q.PostProcess,displayId:i,enabled:n,bloom:s,chromaticAberration:o,scanlineOpacity:d},newOffset:r}}};import{createEmptyCompressedInputPacket as nt,encodeAxisToInt8 as st,decodeInt8ToAxis as ot,getButtonByteCount as Le}from"@primitiv/types";var at=new TextDecoder;function $r(u){let e=Array.from(u.axes.entries()).sort((p,y)=>p[0]-y[0]),t=Array.from(u.buttons.entries()).sort((p,y)=>p[0]-y[0]),r=Le(t.length),i=new TextEncoder,n=u.textInputs.map(p=>i.encode(p)),s=1+n.reduce((p,y)=>p+1+y.length,0),o=1+u.displayViewports.length*5,d=1+u.touchPositions.length*4,l=e.length*3,a=t.length*2+r,c=2+l+a+4+s+o+d,b=new Uint8Array(c),h=new DataView(b.buffer),m=0;b[m++]=e.length&255,b[m++]=t.length&255;for(let[p,y]of e)h.setUint16(m,p,!1),m+=2,b[m++]=st(y)+256&255;for(let[p]of t)h.setUint16(m,p,!1),m+=2;for(let p=0;p<r;p++){let y=0;for(let w=0;w<8;w++){let k=p*8+w;k<t.length&&t[k][1]&&(y|=1<<w)}b[m++]=y}b[m++]=u.displayId&255,b[m++]=u.mouseX&255,b[m++]=u.mouseY&255;let g=0;u.mouseOverDisplay&&(g|=1),u.isTabHidden&&(g|=2),b[m++]=g,b[m++]=Math.min(n.length,255);for(let p of n){let y=Math.min(p.length,255);b[m++]=y,b.set(p.slice(0,y),m),m+=y}b[m++]=Math.min(u.displayViewports.length,255);for(let p of u.displayViewports)b[m++]=p.displayId&255,h.setUint16(m,p.pixelWidth,!1),m+=2,h.setUint16(m,p.pixelHeight,!1),m+=2;b[m++]=Math.min(u.touchPositions.length,255);for(let p of u.touchPositions)b[m++]=p.id&15,b[m++]=p.x&255,b[m++]=p.y&255,b[m++]=p.over?1:0;return b}function Yr(u,e){let t=new DataView(u.buffer,u.byteOffset,u.byteLength),r=0,i=nt(),n=u[r++],s=u[r++],o=Le(s);for(let a=0;a<n;a++){let c=t.getUint16(r,!1);r+=2;let b=u[r++],h=b>127?b-256:b;i.axes.set(c,ot(h))}let d=[];for(let a=0;a<s;a++)d.push(t.getUint16(r,!1)),r+=2;for(let a=0;a<o;a++){let c=u[r++];for(let b=0;b<8;b++){let h=a*8+b;h<s&&i.buttons.set(d[h],(c&1<<b)!==0)}}i.displayId=u[r++],i.mouseX=u[r++],i.mouseY=u[r++];let l=u[r++];if(i.mouseOverDisplay=(l&1)!==0,i.isTabHidden=(l&2)!==0,r<u.length){let a=u[r++];for(let c=0;c<a;c++){let b=u[r++];i.textInputs.push(at.decode(u.subarray(r,r+b))),r+=b}}if(r<u.length){let a=u[r++];for(let c=0;c<a;c++){let b=u[r++],h=t.getUint16(r,!1);r+=2;let m=t.getUint16(r,!1);r+=2,i.displayViewports.push({displayId:b,pixelWidth:h,pixelHeight:m})}}if(r<u.length){let a=u[r++];for(let c=0;c<a;c++){let b=u[r++]&15,h=u[r++],m=u[r++],g=(u[r++]&1)!==0;i.touchPositions.push({id:b,x:h,y:m,over:g})}}return i}var Ve=[[0,0],[9786,1],[9787,2],[9829,3],[9830,4],[9827,5],[9824,6],[8226,7],[9688,8],[9675,9],[9689,10],[9794,11],[9792,12],[9834,13],[9835,14],[9788,15],[9658,16],[9668,17],[8597,18],[8252,19],[182,20],[167,21],[9644,22],[8616,23],[8593,24],[8595,25],[8594,26],[8592,27],[8735,28],[8596,29],[9650,30],[9660,31],[8962,127],[199,128],[252,129],[233,130],[226,131],[228,132],[224,133],[229,134],[231,135],[234,136],[235,137],[232,138],[239,139],[238,140],[236,141],[196,142],[197,143],[201,144],[230,145],[198,146],[244,147],[246,148],[242,149],[251,150],[249,151],[255,152],[214,153],[220,154],[162,155],[163,156],[165,157],[8359,158],[402,159],[225,160],[237,161],[243,162],[250,163],[241,164],[209,165],[170,166],[186,167],[191,168],[8976,169],[172,170],[189,171],[188,172],[161,173],[171,174],[187,175],[9617,176],[9618,177],[9619,178],[9474,179],[9508,180],[9569,181],[9570,182],[9558,183],[9557,184],[9571,185],[9553,186],[9559,187],[9565,188],[9564,189],[9563,190],[9488,191],[9492,192],[9524,193],[9516,194],[9500,195],[9472,196],[9532,197],[9566,198],[9567,199],[9562,200],[9556,201],[9577,202],[9574,203],[9568,204],[9552,205],[9580,206],[9575,207],[9576,208],[9572,209],[9573,210],[9561,211],[9560,212],[9554,213],[9555,214],[9579,215],[9578,216],[9496,217],[9484,218],[9608,219],[9604,220],[9612,221],[9616,222],[9600,223],[945,224],[223,225],[915,226],[960,227],[931,228],[963,229],[181,230],[964,231],[934,232],[920,233],[937,234],[948,235],[8734,236],[966,237],[949,238],[8745,239],[8801,240],[177,241],[8805,242],[8804,243],[8992,244],[8993,245],[247,246],[8776,247],[176,248],[8729,249],[183,250],[8730,251],[8319,252],[178,253],[9632,254],[160,255]],ze=new Map(Ve),dt=new Map(Ve.map(([u,e])=>[e,u]));function V(u){if(u<128)return u;let e=ze.get(u);return e!==void 0?e:u&255}function jr(u){let e=new Uint8Array(u.length);for(let t=0;t<u.length;t++)e[t]=V(u.charCodeAt(t));return e}function lt(u){let e=u&255;return e<128?e:dt.get(e)??e}function Qr(u){return String.fromCharCode(lt(u))}function Jr(u){return u<128?!0:ze.has(u)}function Kr(u){let e="";for(let t=0;t<u.length;t++)e+=String.fromCharCode(V(u.charCodeAt(t)));return e}var fe=class{unicolorSprites=new Map;multicolorSprites=new Map;loadUnicolorSprites(e){for(let t of e){let{spriteId:r,width:i,height:n,data:s}=t,o=new Uint16Array(i*n);if(typeof s=="string"){let l=s.replace(/\n/g,"");for(let a=0;a<Math.min(l.length,i*n);a++)o[a]=V(l.charCodeAt(a))}else if(Array.isArray(s)&&s.length>0&&typeof s[0]=="string"){let l=s;for(let a=0;a<Math.min(l.length,n);a++){let c=l[a];if(c)for(let b=0;b<Math.min(c.length,i);b++)o[a*i+b]=V(c.charCodeAt(b))}}else{let l=s;for(let a=0;a<Math.min(l.length,i*n);a++)o[a]=l[a]}let d={id:r,width:i,height:n,data:o};this.unicolorSprites.set(d.id,d)}}loadMulticolorSprites(e){for(let t of e){let{spriteId:r,width:i,height:n,data:s}=t,o=new Uint32Array(i*n);for(let l=0;l<Math.min(s.length,i*n);l++){let a=s[l],c=0;typeof a.charCode=="string"?c=V(a.charCode.charCodeAt(0)):c=a.charCode||0;let b=a.fgColorId||0,h=a.bgColorId||0;o[l]=ce.pack(c,b,h)}let d={id:r,width:i,height:n,data:o};this.multicolorSprites.set(d.id,d)}}getUnicolorSprite(e){return this.unicolorSprites.get(e)}getMulticolorSprite(e){return this.multicolorSprites.get(e)}hasUnicolorSprite(e){return this.unicolorSprites.has(e)}hasMulticolorSprite(e){return this.multicolorSprites.has(e)}clearAll(){this.unicolorSprites.clear(),this.multicolorSprites.clear()}};var ut=(t=>(t.Bitmap="bitmap",t.Image="image",t))(ut||{});function W(u){return u<=1?1:1<<Math.ceil(Math.log2(u))}function ne(u){let e=W(Math.ceil(Math.sqrt(u))),t=W(Math.ceil(u/e));return{cols:e*16,rows:t*16,blocksPerRow:e,blocksPerCol:t}}function ri(u){return ne(u).cols}function ii(u){return ne(u).rows}function ct(u){return u*256-1}function We(u,e,t){let r=ne(u),i=W(e),n=W(t??e);return{width:r.cols*i,height:r.rows*n}}var ge=class{constructor(e,t){this.fontId=e;this.config=t;let r=ne(t.atlasBlocks);this.atlasColumns=r.cols,this.atlasRows=r.rows,this.maxCharCode=ct(t.atlasBlocks)}atlasColumns;atlasRows;maxCharCode;blocks=new Map;addBlock(e,t){if(e<0||e>=this.config.atlasBlocks)throw new Error(`Invalid block index ${e} for font with ${this.config.atlasBlocks} blocks`);this.blocks.set(e,t)}getBlock(e){return this.blocks.get(e)}getFontId(){return this.fontId}getConfig(){return{glyphWidth:this.config.glyphWidth,glyphHeight:this.config.glyphHeight,cellWidth:this.config.cellWidth,cellHeight:this.config.cellHeight,atlasBlocks:this.config.atlasBlocks}}getGlyphWidth(){return this.config.glyphWidth}getGlyphHeight(){return this.config.glyphHeight}getCellWidth(){return this.config.cellWidth??this.config.glyphWidth}getCellHeight(){return this.config.cellHeight??this.config.glyphHeight}getAtlasBlocks(){return this.config.atlasBlocks}getAtlasColumns(){return this.atlasColumns}getMaxCharCode(){return this.maxCharCode}getAtlasRows(){return this.atlasRows}getAtlasDimensions(){let e=W(this.config.glyphWidth),t=W(this.config.glyphHeight);return{width:this.atlasColumns*e,height:this.atlasRows*t}}getCharUV(e){if(e<0||e>this.maxCharCode)return null;let{blocksPerRow:t}=ne(this.config.atlasBlocks),r=Math.floor(e/256),i=e%256,n=r%t,s=Math.floor(r/t),o=i%16,d=Math.floor(i/16),l=W(this.config.glyphWidth),a=W(this.config.glyphHeight),c=this.atlasColumns*l,b=this.atlasRows*a,h=n*16*l+o*this.config.glyphWidth,m=s*16*a+d*this.config.glyphHeight,g=h/c,p=m/b,y=(h+this.config.glyphWidth)/c,w=(m+this.config.glyphHeight)/b;return{u1:g,v1:p,u2:y,v2:w}}isValidCharCode(e){return e>=0&&e<=this.maxCharCode}};var ye=class{fonts=new Map;nameToId=new Map;nextId=0;allocateId(e){if(this.nextId>255)throw new Error(`Cannot register font "${e}": maximum 256 fonts reached`);return this.nextId++}registerFont(e,t){if(this.nameToId.has(e))throw new Error(`ImageFont with name "${e}" already exists`);let r=this.allocateId(e),i={glyphWidth:t.glyphWidth,glyphHeight:t.glyphHeight,cellWidth:t.cellWidth,cellHeight:t.cellHeight,atlasBlocks:t.atlasBlocks??1},n=new ge(r,i);return this.fonts.set(r,n),this.nameToId.set(e,r),r}unregisterFont(e){let t=this.nameToId.get(e);t!==void 0&&(this.fonts.delete(t),this.nameToId.delete(e))}hasFont(e){return this.nameToId.has(e)}addBlock(e,t,r){let i=this.fonts.get(e);if(!i)throw new Error(`ImageFont with ID ${e} not found`);i.addBlock(t,r)}getFont(e){return this.fonts.get(e)}getFontByName(e){let t=this.nameToId.get(e);if(t!==void 0)return this.fonts.get(t)}getFontId(e){return this.nameToId.get(e)}getAllFonts(){return Array.from(this.fonts.values())}getFontName(e){for(let[t,r]of this.nameToId)if(r===e)return t}};var xe=class{sounds=new Map;nameToId=new Map;nextId=0;registerFile(e,t,r){let i=this.allocateId(e),n={soundId:i,name:e,loadType:"file",format:t,data:r};return this.addEntry(n),i}registerExternal(e,t,r,i,n){let s=this.allocateId(e),o={soundId:s,name:e,loadType:"external",format:t,url:r,size:i,checksum:n};return this.addEntry(o),s}get(e){if(typeof e=="number")return this.sounds.get(e);let t=this.nameToId.get(e);return t!==void 0?this.sounds.get(t):void 0}has(e){return this.get(e)!==void 0}toLoadPackets(){let e=[],t=Array.from(this.sounds.values()),r=t.length,i=t.filter(s=>s.loadType==="file");i.length>0&&e.push({type:"sound",mode:"file",sounds:i.map(s=>({soundId:s.soundId,name:s.name,format:s.format,data:s.data})),totalSounds:r});let n=t.filter(s=>s.loadType==="external");return n.length>0&&e.push({type:"sound",mode:"external",sounds:n.map(s=>({soundId:s.soundId,name:s.name,format:s.format,url:s.url,size:s.size,checksum:s.checksum})),totalSounds:r}),e}allocateId(e){if(this.nameToId.has(e))throw new Error(`Sound with name "${e}" already exists`);for(;this.sounds.has(this.nextId);)if(this.nextId++,this.nextId>255)throw new Error("Maximum number of sounds (256) reached");return this.nextId++}addEntry(e){this.sounds.set(e.soundId,e),this.nameToId.set(e.name,e.soundId)}};import{Logger as bt}from"@primitiv/logger";var Ge=bt.create("core:macro-registry"),Ce=class{templates=new Map;templateNameToId=new Map;nextTemplateId=0;instances=new Map;instanceNameToId=new Map;nextInstanceId=1;pendingDefines=[];pendingOrders=[];feedbackHandlers=new Map;registerTemplate(e,t){if(this.templateNameToId.has(e))return this.templateNameToId.get(e);let r=this.nextTemplateId++;if(r>65535)throw new Error("Max 65535 macro templates");return this.templates.set(r,t),this.templateNameToId.set(e,r),this.pendingDefines.push({templateId:r,template:t}),Ge.debug(`Template registered: "${e}" -> id=${r}`),r}getTemplate(e){if(typeof e=="string"){let t=this.templateNameToId.get(e);return t!==void 0?this.templates.get(t):void 0}return this.templates.get(e)}getTemplateId(e){return this.templateNameToId.get(e)}createInstance(e){let t=this.templateNameToId.get(e.macro);if(t===void 0)throw new Error(`Unknown macro template: "${e.macro}"`);let r=this.nextInstanceId++;if(r>65535)throw new Error("Max 65535 macro instances");let i={instanceId:r,templateId:t,layerId:e.layer,x:e.x,y:e.y,zIndex:e.zIndex??0,params:e.params??{},state:"running"};return this.instances.set(r,i),e.name&&this.instanceNameToId.set(e.name,r),this.pendingOrders.push({cmd:1,instanceId:r,templateId:t,layerId:e.layer,x:e.x,y:e.y,zIndex:e.zIndex??0,params:e.params??{}}),Ge.debug(`Instance created: id=${r} macro="${e.macro}" layer=${e.layer}`),r}updateInstance(e,t){let r=this.resolveInstanceId(e);if(r===void 0)return;let i=this.instances.get(r);i&&(Object.assign(i.params,t),this.pendingOrders.push({cmd:2,instanceId:r,params:t}))}removeInstance(e){let t=this.resolveInstanceId(e);if(t!==void 0){this.instances.delete(t);for(let[r,i]of this.instanceNameToId)if(i===t){this.instanceNameToId.delete(r);break}this.feedbackHandlers.delete(t),this.pendingOrders.push({cmd:3,instanceId:t})}}pauseInstance(e){let t=this.resolveInstanceId(e);if(t===void 0)return;let r=this.instances.get(t);r&&(r.state="paused"),this.pendingOrders.push({cmd:4,instanceId:t})}resumeInstance(e){let t=this.resolveInstanceId(e);if(t===void 0)return;let r=this.instances.get(t);r&&(r.state="running"),this.pendingOrders.push({cmd:5,instanceId:t})}getPendingDefines(){return this.pendingDefines}getPendingOrders(){return this.pendingOrders}clearPendingDefines(){this.pendingDefines.length=0}clearPendingOrders(){this.pendingOrders.length=0}getAllDefines(){let e=[];for(let[t,r]of this.templates)e.push({templateId:t,template:r});return e}getActiveInstanceOrders(){let e=[];for(let t of this.instances.values())e.push({cmd:1,instanceId:t.instanceId,templateId:t.templateId,layerId:t.layerId,x:t.x,y:t.y,zIndex:t.zIndex,params:t.params});return e}onEvent(e,t,r){let i=this.resolveInstanceId(e);if(i===void 0)return;let n=this.feedbackHandlers.get(i);n||(n=new Map,this.feedbackHandlers.set(i,n));let s=n.get(t);s||(s=[],n.set(t,s)),s.push(r)}handleFeedback(e){let t=this.feedbackHandlers.get(e.instanceId);if(!t)return;let r,i;switch(e.cmd){case 1:r="click",i=void 0;break;case 2:r="change",i=e.value;break;case 3:r="submit",i=e.text;break;case 4:r="select",i=e.index;break;case 5:r="custom",i=e.data;break;default:return}let n=t.get(r);if(n)for(let s of n)s(i)}resolveInstanceId(e){return typeof e=="number"?e:this.instanceNameToId.get(e)}};import{OrderType as Ue}from"@primitiv/types";import{OrderType as x,ShapeType as se}from"@primitiv/types";var J=class{buffer;view;offset=0;constructor(e=4096){this.buffer=new Uint8Array(e),this.view=new DataView(this.buffer.buffer)}reset(){this.offset=0}ensure(e){if(this.offset+e>this.buffer.length){let t=this.buffer.length*2;for(;t<this.offset+e;)t*=2;let r=new Uint8Array(t);r.set(this.buffer),this.buffer=r,this.view=new DataView(this.buffer.buffer)}}ensureAndGetBuffer(e){return this.ensure(e),this.buffer}writeU8(e){this.ensure(1),this.buffer[this.offset++]=e&255}writeI8(e){this.ensure(1),this.view.setInt8(this.offset,e),this.offset+=1}writeU16BE(e){this.ensure(2),this.view.setUint16(this.offset,e,!1),this.offset+=2}writeI16BE(e){this.ensure(2),this.view.setInt16(this.offset,e,!1),this.offset+=2}writeU16LE(e){this.ensure(2),this.view.setUint16(this.offset,e,!0),this.offset+=2}writeBytes(e){this.ensure(e.length),this.buffer.set(e,this.offset),this.offset+=e.length}toUint8Array(){return this.buffer.slice(0,this.offset)}getView(){return this.buffer.subarray(0,this.offset)}};var He=new TextEncoder;function O(u,e,t){t?u.writeU16LE(e):u.writeU8(e&255)}var oe=class u{static v=new J(4096);static encode(e,t=!1){let r=u.v;r.reset();for(let i of e)u.encodeOne(r,i,t);return r.toUint8Array()}static encodeInto(e,t,r=!1){for(let i of t)u.encodeOne(e,i,r)}static encodeOne(e,t,r){switch(t.type){case x.Char:u.encodeChar(e,t,r);break;case x.Text:u.encodeText(e,t);break;case x.TextMultiline:u.encodeTextMultiline(e,t);break;case x.SubFrame:u.encodeSubFrame(e,t,r);break;case x.SubFrameMulti:u.encodeSubFrameMulti(e,t,r);break;case x.FullFrame:u.encodeFullFrame(e,t,r);break;case x.FullFrameMulti:u.encodeFullFrameMulti(e,t,r);break;case x.Sprite:u.encodeSprite(e,t);break;case x.SpriteMulti:u.encodeSpriteMulti(e,t);break;case x.ColorMap:u.encodeColorMap(e,t);break;case x.Shape:u.encodeShape(e,t,r);break;case x.Polyline:u.encodePolyline(e,t,r);break;case x.DotCloud:u.encodeDotCloud(e,t,r);break;case x.DotCloudMulti:u.encodeDotCloudMulti(e,t,r);break;case x.SpriteCloud:u.encodeSpriteCloud(e,t);break;case x.SpriteCloudMulti:u.encodeSpriteCloudMulti(e,t);break;case x.SpriteCloudVaried:u.encodeSpriteCloudVaried(e,t);break;case x.SpriteCloudVariedMulti:u.encodeSpriteCloudVariedMulti(e,t);break;case x.Bitmask:u.encodeBitmask(e,t,r);break;case x.Bitmask4:u.encodeBitmask4(e,t,r);break;case x.Bitmask16:u.encodeBitmask16(e,t,r);break;case x.Fill:u.encodeFill(e,t,r);break;case x.FillChar:u.encodeFillChar(e,t,r);break;case x.FillSprite:u.encodeFillSprite(e,t);break;case x.FillSpriteMulti:u.encodeFillSpriteMulti(e,t);break;default:break}}static encodeChar(e,t,r){e.writeU8(x.Char),e.writeU8(t.x),e.writeU8(t.y),O(e,t.char,r),e.writeU8(t.bg),e.writeU8(t.fg)}static encodeText(e,t){e.writeU8(x.Text),e.writeU8(t.x),e.writeU8(t.y);let r=t.text.length*3,i=e.ensureAndGetBuffer(1+r),n=e.offset;e.offset++;let{written:s}=He.encodeInto(t.text,i.subarray(e.offset,e.offset+r));i[n]=s,e.offset+=s,e.writeU8(t.bg),e.writeU8(t.fg)}static encodeTextMultiline(e,t){e.writeU8(x.TextMultiline),e.writeU8(t.x),e.writeU8(t.y);let r=t.text.length*3,i=e.ensureAndGetBuffer(1+r),n=e.offset;e.offset++;let{written:s}=He.encodeInto(t.text,i.subarray(e.offset,e.offset+r));i[n]=s,e.offset+=s,e.writeU8(t.bg),e.writeU8(t.fg)}static encodeSubFrame(e,t,r){e.writeU8(x.SubFrame),e.writeU8(t.x),e.writeU8(t.y),e.writeU8(t.width-1),e.writeU8(t.height-1),e.writeU8(t.bg),e.writeU8(t.fg);for(let i of t.frame)O(e,i,r)}static encodeSubFrameMulti(e,t,r){e.writeU8(x.SubFrameMulti),e.writeU8(t.x),e.writeU8(t.y),e.writeU8(t.width-1),e.writeU8(t.height-1);for(let i of t.frame)O(e,i.char,r),e.writeU8(i.bg),e.writeU8(i.fg)}static encodeFullFrame(e,t,r){e.writeU8(x.FullFrame),e.writeU8(t.bg),e.writeU8(t.fg);for(let i of t.frame)O(e,i,r)}static encodeFullFrameMulti(e,t,r){e.writeU8(x.FullFrameMulti);for(let i of t.frame)O(e,i.char,r),e.writeU8(i.bg),e.writeU8(i.fg)}static encodeSprite(e,t){e.writeU8(x.Sprite),e.writeU8(t.x),e.writeU8(t.y),e.writeU8(t.spriteId),e.writeU8(t.bg),e.writeU8(t.fg)}static encodeSpriteMulti(e,t){e.writeU8(x.SpriteMulti),e.writeU8(t.x),e.writeU8(t.y),e.writeU8(t.spriteId)}static encodeColorMap(e,t){e.writeU8(x.ColorMap),e.writeU8(t.x),e.writeU8(t.y),e.writeU8(t.width-1),e.writeU8(t.height-1);for(let r of t.data)e.writeU8(r.bg),e.writeU8(r.fg)}static encodeShape(e,t,r){switch(e.writeU8(x.Shape),e.writeU8(t.shapeType),t.shapeType){case se.Rectangle:e.writeU8(t.x??0),e.writeU8(t.y??0),e.writeU8((t.width??1)-1),e.writeU8((t.height??1)-1),e.writeU8(t.filled?1:0),O(e,t.char,r),e.writeU8(t.bg),e.writeU8(t.fg);break;case se.Circle:e.writeU8(t.x??0),e.writeU8(t.y??0),e.writeU8((t.radius??1)-1),e.writeU8(t.filled?1:0),O(e,t.char,r),e.writeU8(t.bg),e.writeU8(t.fg);break;case se.Line:e.writeU8(t.x1??0),e.writeU8(t.y1??0),e.writeU8(t.x2??0),e.writeU8(t.y2??0),O(e,t.char,r),e.writeU8(t.bg),e.writeU8(t.fg);break;case se.Ellipse:e.writeU8(t.x??0),e.writeU8(t.y??0),e.writeU8((t.radiusX??1)-1),e.writeU8((t.radiusY??1)-1),e.writeU8(t.filled?1:0),O(e,t.char,r),e.writeU8(t.bg),e.writeU8(t.fg);break;case se.Triangle:e.writeU8(t.x1??0),e.writeU8(t.y1??0),e.writeU8(t.x2??0),e.writeU8(t.y2??0),e.writeU8(t.x3??0),e.writeU8(t.y3??0),e.writeU8(t.filled?1:0),O(e,t.char,r),e.writeU8(t.bg),e.writeU8(t.fg);break}}static encodePolyline(e,t,r){e.writeU8(x.Polyline),O(e,t.char,r),e.writeU8(t.fg),e.writeU8(t.bg),e.writeU8(t.points.length);for(let i of t.points)e.writeU8(i.x),e.writeU8(i.y)}static encodeDotCloud(e,t,r){e.writeU8(x.DotCloud),O(e,t.char,r),e.writeU8(t.bg),e.writeU8(t.fg),e.writeU16BE(t.positions.length);for(let i of t.positions)e.writeU8(i.x),e.writeU8(i.y)}static encodeDotCloudMulti(e,t,r){e.writeU8(x.DotCloudMulti),e.writeU16BE(t.dots.length);for(let i of t.dots)O(e,i.char,r),e.writeU8(i.bg),e.writeU8(i.fg),e.writeU8(i.x),e.writeU8(i.y)}static encodeSpriteCloud(e,t){e.writeU8(x.SpriteCloud),e.writeU8(t.spriteId),e.writeU8(t.bg),e.writeU8(t.fg),e.writeU16BE(t.positions.length);for(let r of t.positions)e.writeU8(r.x),e.writeU8(r.y)}static encodeSpriteCloudMulti(e,t){e.writeU8(x.SpriteCloudMulti),e.writeU8(t.spriteId),e.writeU16BE(t.positions.length);for(let r of t.positions)e.writeU8(r.x),e.writeU8(r.y)}static encodeSpriteCloudVaried(e,t){e.writeU8(x.SpriteCloudVaried),e.writeU16BE(t.sprites.length);for(let r of t.sprites)e.writeU8(r.spriteId),e.writeU8(r.bg),e.writeU8(r.fg),e.writeU8(r.x),e.writeU8(r.y)}static encodeSpriteCloudVariedMulti(e,t){e.writeU8(x.SpriteCloudVariedMulti),e.writeU16BE(t.sprites.length);for(let r of t.sprites)e.writeU8(r.spriteId),e.writeU8(r.x),e.writeU8(r.y)}static encodeBitmask(e,t,r){e.writeU8(x.Bitmask),e.writeU8(t.x),e.writeU8(t.y),e.writeU8(t.width-1),e.writeU8(t.height-1),O(e,t.char,r),e.writeU8(t.bg),e.writeU8(t.fg),e.writeU8(t.override?1:0),e.writeBytes(t.mask)}static encodeBitmask4(e,t,r){e.writeU8(x.Bitmask4),e.writeU8(t.x),e.writeU8(t.y),e.writeU8(t.width-1),e.writeU8(t.height-1),e.writeU8(t.override?1:0);for(let i of t.variants)O(e,i.char,r),e.writeU8(i.bg),e.writeU8(i.fg);e.writeBytes(t.mask)}static encodeBitmask16(e,t,r){e.writeU8(x.Bitmask16),e.writeU8(t.x),e.writeU8(t.y),e.writeU8(t.width-1),e.writeU8(t.height-1),e.writeU8(t.override?1:0),e.writeU8(t.variants.length);for(let i of t.variants)O(e,i.char,r),e.writeU8(i.bg),e.writeU8(i.fg);e.writeBytes(t.mask)}static encodeFill(e,t,r){e.writeU8(x.Fill),O(e,t.char,r),e.writeU8(t.bg),e.writeU8(t.fg)}static encodeFillChar(e,t,r){e.writeU8(x.FillChar),e.writeU8(t.patternWidth-1),e.writeU8(t.patternHeight-1),e.writeU8(t.bg),e.writeU8(t.fg);for(let i of t.pattern)O(e,i,r)}static encodeFillSprite(e,t){e.writeU8(x.FillSprite),e.writeU8(t.spriteId),e.writeU8(t.bg),e.writeU8(t.fg)}static encodeFillSpriteMulti(e,t){e.writeU8(x.FillSpriteMulti),e.writeU8(t.spriteId)}};var K=new TextEncoder,ht=1,mt=16,pt=32,ft=64,ke=[],Ae=[],q=[],_=[],gt=[],yt=[],xt=new J(8192),Fe={reliable:new Uint8Array(0),volatile:new Uint8Array(0)},ee=class u{static encode(e){let t=e.getDisplays(),r=e.getLayers(),i=e.flushCommands();ke.length=0,Ae.length=0;for(let a of r)!a.getNeedsCommit()&&!a.getIsMacroLayer()||(a.getMustBeReliable()?ke.push(a):Ae.push(a));q.length=0,_.length=0;for(let a of i)switch(a.type){case Ue.Audio:q.push(a);break;case Ue.Vibration:_.push(a);break}let n=e.getMacroRegistry(),s=n?.getPendingOrders()??[],o=n?.getPendingDefines()??[],d=u.encodePacket(t,ke,q,_,void 0,s,o,!1),l=u.encodePacket(t,Ae,gt,yt,void 0,void 0,void 0,!1);return n?.clearPendingOrders(),n?.clearPendingDefines(),Fe.reliable=d,Fe.volatile=l,Fe}static encodeFull(e,t){let r=e.getDisplays(),i=e.getLayers(),n=e.flushCommands();q.length=0,_.length=0;for(let c of n)switch(c.type){case Ue.Audio:q.push(c);break;case Ue.Vibration:_.push(c);break}let s;if(t){s=new Map;for(let c of r){let b=c.activePaletteSlot;t.has(b)&&!s.has(b)&&s.set(b,t.get(b))}}let o=e.getMacroRegistry(),d=o?.getAllDefines()??[],l=o?.getActiveInstanceOrders()??[],a=e.getInputBindingRegistry().toLoadPacket();return u.encodePacket(r,i,q,_,s,l,d,!0,a)}static encodePacket(e,t,r,i,n,s,o,d=!1,l){let a=xt;a.reset(),a.writeU8(e.length);for(let h of e){a.writeU8(h.id),a.writeI16BE(h.x),a.writeI16BE(h.y),a.writeU8(h.width-1),a.writeU8(h.height-1),a.writeU8(h.activePaletteSlot),a.writeU8(h.scalingMode),a.writeU8(h.cellWidth),a.writeU8(h.cellHeight);let m=h.renderPasses;if(m&&m.length>0){a.writeU8(m.length);for(let g of m)a.writeU8(g.id),a.writeU8(Math.max(0,Math.min(255,g.zMin))),a.writeU8(Math.max(0,Math.min(255,g.zMax))),a.writeU8(g.enabled!==!1?1:0)}else a.writeU8(0);u.encodePostProcess(a,h.postProcess)}if(n&&n.size>0){a.writeU8(n.size);for(let[h,m]of n){a.writeU8(h);for(let g=0;g<256;g++){let p=m[g];p?(a.writeU8(p.r??0),a.writeU8(p.g??0),a.writeU8(p.b??0),a.writeU8(p.a??0)):(a.writeU8(0),a.writeU8(0),a.writeU8(0),a.writeU8(0))}}}else a.writeU8(0);a.writeU16BE(t.length);for(let h of t){a.writeU16BE(h.id);let m=h.getPendingOrders(),g=Math.min(m.length,255),p=0;(d||h.getOrdersUpdatedThisTick())&&(p|=ht),h.isEnabled()&&(p|=mt),h.getIsMacroLayer()&&(p|=pt);let y=h.is16bit;y&&(p|=ft),a.writeU8(p),a.writeI8(h.zIndex);let w=h.getOrigin();if(a.writeI16BE(w.x),a.writeI16BE(w.y),a.writeU8(h.getWidth()-1),a.writeU8(h.getHeight()-1),m.length>255&&console.warn(`[TickPacketEncoder] Layer ${h.id} has ${m.length} orders, truncating to 255. Consider splitting into multiple layers or reducing draw calls.`),a.writeU8(g),g>0){let k=m.length>255?m.slice(0,255):m;oe.encodeInto(a,k,y)}}a.writeU8(Math.min(r.length,255));for(let h=0;h<Math.min(r.length,255);h++)u.encodeAudioOrder(a,r[h]);a.writeU8(Math.min(i.length,255));for(let h=0;h<Math.min(i.length,255);h++)u.encodeVibrationOrder(a,i[h]);let c=o??[];a.writeU16BE(c.length);for(let h of c)u.encodeMacroDefine(a,h);let b=s??[];a.writeU16BE(b.length);for(let h of b)u.encodeMacroOrder(a,h);if(a.writeU8(0),l){let h=K.encode(JSON.stringify(l));a.writeU16BE(h.length),a.writeBytes(h)}else a.writeU16BE(0);return a.toUint8Array()}static encodeAudioOrder(e,t){if(t.stop){e.writeU8(2),u.encodeSoundTarget(e,t.sound);return}if(t.fadeOut!==void 0){e.writeU8(3),u.encodeSoundTarget(e,t.sound),e.writeU16BE(Math.round(t.fadeOut*1e3));return}if(t.pause){e.writeU8(4),u.encodeSoundTarget(e,t.sound);return}if(t.resume){e.writeU8(5),u.encodeSoundTarget(e,t.sound);return}if(t.sound==="__listener_position__"){e.writeU8(7),e.writeI16BE(t.x??0),e.writeI16BE(t.y??0);return}if(t.sound==="__configure_spatial__"){e.writeU8(8),e.writeU16BE(t.maxDistance??100),e.writeU16BE(t.referenceDistance??1),e.writeU8(t.rolloffFactor??1),e.writeU8(t.panSpread??0);return}if(t.instanceId===void 0&&typeof t.sound=="number"&&(t.lowpass!==void 0||t.highpass!==void 0||t.reverb!==void 0||t.pitch!==void 0||t.volume!==void 0)){e.writeU8(6),e.writeU16BE(t.sound);let i=0;t.lowpass!==void 0&&(i|=1),t.highpass!==void 0&&(i|=2),t.reverb!==void 0&&(i|=4),t.pitch!==void 0&&(i|=8),t.volume!==void 0&&(i|=16),e.writeU8(i),t.lowpass!==void 0&&e.writeU16BE(Math.round(t.lowpass)),t.highpass!==void 0&&e.writeU16BE(Math.round(t.highpass)),t.reverb!==void 0&&e.writeU8(Math.round(t.reverb*255)),t.pitch!==void 0&&e.writeU8(Math.round(t.pitch*100)),t.volume!==void 0&&e.writeU8(Math.round(t.volume*255));return}e.writeU8(1),u.encodeSoundTarget(e,t.sound),e.writeU16BE(t.instanceId??0);let r=0;t.volume!==void 0&&(r|=1),t.pitch!==void 0&&(r|=2),t.fadeIn!==void 0&&(r|=4),t.x!==void 0&&t.y!==void 0&&(r|=8),t.lowpass!==void 0&&(r|=16),t.highpass!==void 0&&(r|=32),t.reverb!==void 0&&(r|=64),t.loop&&(r|=128),e.writeU8(r),t.volume!==void 0&&e.writeU8(Math.round(t.volume*255)),t.pitch!==void 0&&e.writeU8(Math.round(t.pitch*100)),t.fadeIn!==void 0&&e.writeU16BE(Math.round(t.fadeIn*1e3)),t.x!==void 0&&t.y!==void 0&&(e.writeI16BE(t.x),e.writeI16BE(t.y)),t.lowpass!==void 0&&e.writeU16BE(Math.round(t.lowpass)),t.highpass!==void 0&&e.writeU16BE(Math.round(t.highpass)),t.reverb!==void 0&&e.writeU8(Math.round(t.reverb*255))}static encodeSoundTarget(e,t){if(typeof t=="number")e.writeU8(0),e.writeU16BE(t);else if(t==="all")e.writeU8(1);else{e.writeU8(2);let r=K.encode(t);e.writeU8(r.length),e.writeBytes(r)}}static encodeVibrationOrder(e,t){if("target"in t&&t.target==="gamepad")e.writeU8(1),e.writeU8(t.gamepadIndex),e.writeU16BE(t.duration),e.writeU8(Math.round(t.strongMagnitude*255)),e.writeU8(Math.round(t.weakMagnitude*255)),e.writeU16BE(t.startDelay);else{e.writeU8(0);let r=t.pattern;if(typeof r=="number")e.writeU8(1),e.writeU16BE(r);else{e.writeU8(r.length);for(let i of r)e.writeU16BE(i)}}}static encodeMacroDefine(e,t){e.writeU16BE(t.templateId);let r=K.encode(JSON.stringify(t.template));e.writeU16BE(r.length),e.writeBytes(r)}static encodeMacroOrder(e,t){switch(e.writeU8(t.cmd),e.writeU16BE(t.instanceId),t.cmd){case 1:{let r=t;if(e.writeU16BE(r.templateId),e.writeU16BE(r.layerId),e.writeI16BE(r.x),e.writeI16BE(r.y),e.writeU8(r.zIndex),r.params!==void 0){let i=K.encode(JSON.stringify(r.params));e.writeU16BE(i.length),e.writeBytes(i)}else e.writeU16BE(0);break}case 2:{let r=t,i=K.encode(JSON.stringify(r.params));e.writeU16BE(i.length),e.writeBytes(i);break}default:break}}static encodePostProcess(e,t){let r=0;if(t.ambientEffect&&(r|=1),t.scanlines&&(r|=2),t.grid&&(r|=4),e.writeU8(r),t.ambientEffect){let i=t.ambientEffect;e.writeU8(i.enabled?1:0),e.writeU8(Math.min(255,i.blur??30)),e.writeU8(Math.min(255,Math.round((i.scale??1.3)*10))),e.writeU8(Math.min(255,Math.round((i.opacity??.7)*100)))}if(t.scanlines){let i=t.scanlines;e.writeU8(i.enabled?1:0),e.writeU8(Math.min(255,Math.round((i.opacity??.15)*100)));let n={horizontal:0,vertical:1,grid:2};e.writeU8(n[i.pattern??"horizontal"]??0),e.writeU8(Math.min(255,i.spacing??2)),e.writeU8(Math.min(255,i.thickness??1)),e.writeU8(i.color?.r??0),e.writeU8(i.color?.g??0),e.writeU8(i.color?.b??0)}if(t.grid){let i=t.grid;e.writeU8(i.enabled?1:0),e.writeU8(Math.min(255,Math.round((i.lineWidth??1)*10)));let n=K.encode(i.color??"");e.writeU8(Math.min(255,n.length)),e.writeBytes(n.subarray(0,255))}}};var Se=class{samples;head=0;count=0;windowSize;totalTicks=0;U=0;constructor(e=120){this.windowSize=e,this.samples=new Array(e);for(let t=0;t<e;t++)this.samples[t]={durationMs:0,bytes:0,layers:0,orders:0,cells:0,displays:0}}beginTick(){this.U=performance.now()}endTick(e){let t=performance.now()-this.U;this.totalTicks++;let r=this.samples[this.head];r.durationMs=t,r.bytes=e.bytes,r.layers=e.layers,r.orders=e.orders,r.cells=e.cells,r.displays=e.displays,this.head=(this.head+1)%this.windowSize,this.count<this.windowSize&&this.count++}getSnapshot(){if(this.count===0)return{totalTicks:0,lastTickDurationMs:0,avgTickDurationMs:0,peakTickDurationMs:0,lastTickBytes:0,avgTickBytes:0,lastLayerCount:0,lastOrderCount:0,lastCellCount:0,lastDisplayCount:0};let e=(this.head-1+this.windowSize)%this.windowSize,t=this.samples[e],r=0,i=0,n=0,s=this.count<this.windowSize?0:this.head;for(let o=0;o<this.count;o++){let d=this.samples[(s+o)%this.windowSize];r+=d.durationMs,n+=d.bytes,d.durationMs>i&&(i=d.durationMs)}return{totalTicks:this.totalTicks,lastTickDurationMs:t.durationMs,avgTickDurationMs:r/this.count,peakTickDurationMs:i,lastTickBytes:t.bytes,avgTickBytes:n/this.count,lastLayerCount:t.layers,lastOrderCount:t.orders,lastCellCount:t.cells,lastDisplayCount:t.displays}}reset(){this.head=0,this.count=0,this.totalTicks=0;for(let e=0;e<this.windowSize;e++){let t=this.samples[e];t.durationMs=0,t.bytes=0,t.layers=0,t.orders=0,t.cells=0,t.displays=0}}};var Ne=class u{static VGA_COLORS=[{colorId:0,r:0,g:0,b:0,a:255},{colorId:1,r:170,g:0,b:0,a:255},{colorId:2,r:0,g:170,b:0,a:255},{colorId:3,r:170,g:85,b:0,a:255},{colorId:4,r:0,g:0,b:170,a:255},{colorId:5,r:170,g:0,b:170,a:255},{colorId:6,r:0,g:170,b:170,a:255},{colorId:7,r:170,g:170,b:170,a:255},{colorId:8,r:85,g:85,b:85,a:255},{colorId:9,r:255,g:85,b:85,a:255},{colorId:10,r:85,g:255,b:85,a:255},{colorId:11,r:255,g:255,b:85,a:255},{colorId:12,r:85,g:85,b:255,a:255},{colorId:13,r:255,g:85,b:255,a:255},{colorId:14,r:85,g:255,b:255,a:255},{colorId:15,r:255,g:255,b:255,a:255}];static SYSTEM_COLORS=[{colorId:240,r:0,g:0,b:0,a:255},{colorId:241,r:60,g:60,b:75,a:255},{colorId:242,r:160,g:160,b:180,a:255},{colorId:243,r:255,g:255,b:255,a:255},{colorId:244,r:230,g:50,b:80,a:255},{colorId:245,r:255,g:120,b:50,a:255},{colorId:246,r:255,g:210,b:60,a:255},{colorId:247,r:130,g:220,b:50,a:255},{colorId:248,r:35,g:100,b:55,a:255},{colorId:249,r:40,g:200,b:220,a:255},{colorId:250,r:60,g:120,b:240,a:255},{colorId:251,r:35,g:55,b:125,a:255},{colorId:252,r:150,g:70,b:210,a:255},{colorId:253,r:130,g:80,b:50,a:255},{colorId:254,r:240,g:210,b:170,a:255}];mode;sessions=new Map;spriteRegistry=new fe;fontRegistry=new ye;soundRegistry=new xe;inputBindings=new j;macroRegistry=new Ce;stats=new Se;getSpriteRegistry(){return this.spriteRegistry}resourceLoader=null;onFontAllocatedCallback=null;onFontBlockAddedCallback=null;constructor(e){this.mode=e.mode,this.initializeDefaultPalette(),this.loadFont(8,8,1,8,8)}setResourceLoader(e){this.resourceLoader=e}createUser(e,t){let r=String(e),i=t??`Player ${e}`,n=new pe(r,i);return this.spriteRegistry&&n.setSpriteRegistry(this.spriteRegistry),n.setMacroRegistry(this.macroRegistry),this.sessions.set(r,n),n}removeUser(e){return this.sessions.delete(String(e))}getUser(e){return this.sessions.get(String(e))}endTick(e){this.stats.beginTick();let t=ee.encode(e),r=e.getLayers(),i=0,n=0;for(let o of r)n+=o.getWidth()*o.getHeight(),o.getNeedsCommit()&&(i+=o.getPendingOrders().length,o.clearPendingOrders(),o.clearCommit());let s=e.getDisplays();return this.stats.endTick({bytes:t.reliable.byteLength+t.volatile.byteLength,layers:r.length,orders:i,cells:n,displays:s.length}),t}getEngineStats(){return this.stats.getSnapshot()}encodeInitialState(e){return ee.encodeFull(e,this.palettes)}onFontAllocated(e){this.onFontAllocatedCallback=e}onFontBlockAdded(e){this.onFontBlockAddedCallback=e}loadFont(e,t,r,i,n){let{width:o,height:d}=We(r,e,t);if(o>2048||d>2048)throw new Error(`Atlas texture ${o}\xD7${d} exceeds the maximum allowed size of 2048\xD72048. Reduce atlasBlocks (${r}) or glyph size (${e}\xD7${t}).`);let l="__default__";this.fontRegistry.getFontId(l)!==void 0&&this.fontRegistry.unregisterFont(l),this.fontRegistry.registerFont(l,{glyphWidth:e,glyphHeight:t,cellWidth:i,cellHeight:n,atlasBlocks:r}),this.onFontAllocatedCallback&&this.onFontAllocatedCallback()}async loadFontBlock(e,t){let r;if(typeof t=="string"){if(!this.resourceLoader)throw new Error("[Engine] No resource loader set. The runtime must call engine.setResourceLoader() before loading font blocks.");r=await this.resourceLoader.load(t)}else r=t;let i=this.fontRegistry.getFontId("__default__");if(i===void 0)throw new Error("[Engine] No font allocated. Call loadFont() first.");this.fontRegistry.addBlock(i,e,r),this.onFontBlockAddedCallback&&this.onFontBlockAddedCallback(e)}async loadFontBlocks(e){await Promise.all(Object.entries(e).map(([t,r])=>this.loadFontBlock(Number(t),r)))}getFontConfig(){return this.fontRegistry.getFontByName("__default__")?.getConfig()}getFontBlock(e){return this.fontRegistry.getFontByName("__default__")?.getBlock(e)}palettes=new Map;detectSoundFormat(e){let t=e.split(".").pop()?.toLowerCase();return{mp3:"mp3",wav:"wav",ogg:"ogg",webm:"webm",aac:"aac",m4a:"aac"}[t||""]||"mp3"}async loadSound(e,t){if(!this.resourceLoader)throw new Error("[Engine] No resource loader set. The runtime must call engine.setResourceLoader() before loading sounds.");let r=this.detectSoundFormat(t),i=await this.resourceLoader.load(t);return this.soundRegistry.registerFile(e,r,i)}async loadSounds(e){let t=Object.entries(e),r=await Promise.all(t.map(([n,s])=>this.loadSound(n,s))),i={};return t.forEach(([n],s)=>{i[n]=r[s]}),i}initializeDefaultPalette(){let e=new Array(256);for(let t=0;t<256;t++)e[t]={colorId:t,r:0,g:0,b:0,a:0};for(let t of u.VGA_COLORS)e[t.colorId]={...t};for(let t of u.SYSTEM_COLORS)e[t.colorId]={...t};e[255]={colorId:255,r:0,g:0,b:0,a:0},this.palettes.set(0,e)}loadPaletteToSlot(e,t){let r=new Array(256);for(let i=0;i<256;i++)r[i]={colorId:i,r:0,g:0,b:0,a:0};for(let i of t){let n=i.colorId;n>=0&&n<240&&(r[n]={colorId:n,r:i.r??0,g:i.g??0,b:i.b??0,a:i.a??255})}for(let i of u.SYSTEM_COLORS)r[i.colorId]={...i};r[255]={colorId:255,r:0,g:0,b:0,a:0},this.palettes.set(e,r)}getPalette(e){return this.palettes.get(e)}};var Xe=class{h=new Uint8Array(0);e=[];m=[];S=[];f=void 0;ensureMask(e){return this.h.length<e?this.h=new Uint8Array(e):this.h.fill(0,0,e),this.h}ensurePassGrids(e,t,r){for(;this.e.length<e;)this.e.push(new z(t,r)),this.m.push(new Uint8Array(t*r));for(let i=0;i<e;i++){let n=this.e[i];(n.width!==t||n.height!==r)&&(this.e[i]=new z(t,r),this.m[i]=new Uint8Array(t*r)),this.e[i].clear(),this.m[i].fill(0,0,t*r)}}composite(e,t,r){let i=e.renderPasses;if(!i||i.length===0){this.compositeSinglePass(e,t,r),this.f=void 0;return}else{let n=this.compositeMultiPass(e,t,i,r);return this.f=n,n}}getLastPasses(){return this.f}compositeSinglePass(e,t,r){let i=this.S;i.length=0;for(let s=0;s<t.length;s++)i.push(t[s]);i.sort((s,o)=>o.zIndex-s.zIndex),r.clear();let n=this.ensureMask(r.size);for(let s=0;s<i.length;s++){let o=i[s];o.visible&&this.compositeLayer(e,o,r,n)}}compositeMultiPass(e,t,r,i){let n=0;for(let l=0;l<r.length;l++)r[l].enabled!==!1&&n++;if(n===0){this.compositeSinglePass(e,t,i);return}let s=this.S;s.length=0;for(let l=0;l<t.length;l++)t[l].visible&&s.push(t[l]);s.sort((l,a)=>a.zIndex-l.zIndex),this.ensurePassGrids(n,e.width,e.height);let o=[],d=0;for(let l=0;l<r.length;l++){let a=r[l];if(a.enabled===!1)continue;let c=this.e[d],b=this.m[d];for(let h=0;h<s.length;h++){let m=s[h];m.zIndex>=a.zMin&&m.zIndex<=a.zMax&&this.compositeLayer(e,m,c,b)}o.push({id:a.id,zMin:a.zMin,zMax:a.zMax,gridData:c.data}),d++}i.clear();for(let l=0;l<o.length;l++)this.overlayPass(this.e[l],i);return o}overlayPass(e,t){let r=e.size;for(let i=0;i<r;i++){let n=e.data[i],s=n>>>24&255,o=n>>>16&255,d=n&65535;if(s!==255){t.data[i]=n;continue}if(d===0&&o===255)continue;let l=t.data[i],a=l>>>24&255,c=l>>>16&255,b=l&65535;d!==0&&d!==32&&(b=d),o!==255&&(c=o),t.data[i]=a<<24|c<<16|b}}compositeLayer(e,t,r,i){let n=Math.max(e.x,t.x),s=Math.min(e.x+e.width,t.x+t.grid.width),o=Math.max(e.y,t.y),d=Math.min(e.y+e.height,t.y+t.grid.height);if(n>=s||o>=d)return;let l=s-n,a=d-o,c=e.width,b=t.grid.width,h=(o-e.y)*c+(n-e.x),m=(o-t.y)*b+(n-t.x);for(let g=0;g<a;g++){let p=h,y=m;for(let w=0;w<l;w++){if(!i[p]){let k=t.grid.data[y],v=k>>>24&255,D=k>>>16&255,X=k&65535,H=r.data[p],E=H>>>24&255,R=H>>>16&255,F=H&65535;X!==0&&(F===0||F===32)&&(F=X),D!==255&&R===255&&(R=D),v!==255&&(E===255&&(E=v),i[p]=1),r.data[p]=E<<24|R<<16|F}p++,y++}h+=c,m+=b}}};import{OrderType as U,ShapeType as G}from"@primitiv/types";var $e=class u{orders=[];static toCharCode(e){return typeof e=="number"?e&65535:e.length===0?32:V(e.charCodeAt(0))}static dedent(e){let t=e.split(`
|
|
3
|
+
`);t.length>0&&t[0].trim()===""&&t.shift();let r=1/0;for(let i of t){if(i.trim().length===0)continue;let n=i.match(/^(\s*)/);n&&(r=Math.min(r,n[1].length))}return r===1/0?e.trim():t.map(i=>i.slice(r)).join(`
|
|
4
|
+
`).trim()}static encodeString(e){let t="";for(let r=0;r<e.length;r++){let i=e.charCodeAt(r),n=V(i);t+=String.fromCharCode(n)}return t}getOrders(){return this.orders}clear(){return this.orders=[],this}char(e,t,r,i=15,n=255){return this.orders.push(u.char(e,t,r,i,n)),this}static char(e,t,r,i=15,n=255){return{type:U.Char,x:e,y:t,char:u.toCharCode(r),fg:i,bg:n}}text(e,t,r,i=15,n=255){return this.orders.push(u.text(e,t,r,i,n)),this}static text(e,t,r,i=15,n=255){return{type:U.Text,x:e,y:t,text:u.encodeString(r),fg:i,bg:n}}textMultiline(e,t,r,i=15,n=255){return this.orders.push(u.textMultiline(e,t,r,i,n)),this}static textMultiline(e,t,r,i=15,n=255){return{type:U.TextMultiline,x:e,y:t,text:u.encodeString(u.dedent(r)),fg:i,bg:n}}subFrame(e,t,r,i,n,s=15,o=255){let d={type:U.SubFrame,x:e,y:t,width:r,height:i,frame:n.map(l=>u.toCharCode(l)),fg:s,bg:o};return this.orders.push(d),this}static subFrame(e,t,r,i,n,s=15,o=255){return{type:U.SubFrame,x:e,y:t,width:r,height:i,frame:n.map(d=>u.toCharCode(d)),fg:s,bg:o}}subFrameMulti(e,t,r,i,n){return this.orders.push(u.subFrameMulti(e,t,r,i,n)),this}static subFrameMulti(e,t,r,i,n){return{type:U.SubFrameMulti,x:e,y:t,width:r,height:i,frame:n.map(s=>({char:u.toCharCode(s.charCode??s.char??0),fg:s.fgColorCode??s.fgColor??s.fg??15,bg:s.bgColorCode??s.bgColor??s.bg??255}))}}fullFrame(e,t=15,r=255){return this.orders.push(u.fullFrame(e,t,r)),this}static fullFrame(e,t=15,r=255){return{type:U.FullFrame,frame:e.map(i=>u.toCharCode(i)),fg:t,bg:r}}fullFrameMulti(e){return this.orders.push(u.fullFrameMulti(e)),this}static fullFrameMulti(e){return{type:U.FullFrameMulti,frame:e.map(t=>({char:u.toCharCode(t.charCode??t.char??0),fg:t.fgColorCode??t.fgColor??t.fg??15,bg:t.bgColorCode??t.bgColor??t.bg??255}))}}sprite(e,t,r,i=15,n=255){return this.orders.push(u.sprite(e,t,r,i,n)),this}static sprite(e,t,r,i=15,n=255){return{type:U.Sprite,x:e,y:t,spriteId:r,fg:i,bg:n}}spriteMulti(e,t,r){return this.orders.push(u.spriteMulti(e,t,r)),this}static spriteMulti(e,t,r){return{type:U.SpriteMulti,x:e,y:t,spriteId:r}}colorMap(e,t,r,i,n){let s={type:U.ColorMap,x:e,y:t,width:r,height:i,data:n};return this.orders.push(s),this}rect(e,t,r,i,n="\u2588",s=15,o=255,d=!0){return this.orders.push(u.rect(e,t,r,i,n,s,o,d)),this}static rect(e,t,r,i,n="\u2588",s=15,o=255,d=!0){return{type:U.Shape,shapeType:G.Rectangle,x:e,y:t,width:r,height:i,filled:d,char:u.toCharCode(n),fg:s,bg:o}}circle(e,t,r,i,n=15,s=255,o=!0){let d={type:U.Shape,shapeType:G.Circle,x:e,y:t,radius:r,filled:o,char:u.toCharCode(i),fg:n,bg:s};return this.orders.push(d),this}static circle(e,t,r,i="\u2588",n=15,s=255,o=!0){let d,l=n,a=s,c=o;return typeof i=="object"?(d=u.toCharCode(i.charCode??"\u2588"),l=i.fgColor??15,a=i.bgColor??255,c=i.filled??!0):d=u.toCharCode(i),{type:U.Shape,shapeType:G.Circle,x:e,y:t,radius:r,filled:c,char:d,fg:l,bg:a}}line(e,t,r,i,n,s=15,o=255){return this.orders.push(u.line(e,t,r,i,n,s,o)),this}static line(e,t,r,i,n,s=15,o=255){let d,l=s,a=o;return typeof n=="object"?(d=u.toCharCode(n.charCode??"#"),l=n.fgColor??15,a=n.bgColor??255):d=u.toCharCode(n),{type:U.Shape,shapeType:G.Line,x1:e,y1:t,x2:r,y2:i,filled:!1,char:d,fg:l,bg:a}}triangle(e,t,r,i,n,s,o,d=15,l=255,a=!0){let c={type:U.Shape,shapeType:G.Triangle,x1:e,y1:t,x2:r,y2:i,x3:n,y3:s,filled:a,char:u.toCharCode(o),fg:d,bg:l};return this.orders.push(c),this}static triangle(e,t,r,i,n,s,o="\u2588",d=15,l=255,a=!0){let c,b=d,h=l,m=a;return typeof o=="object"?(c=u.toCharCode(o.charCode??"\u2588"),b=o.fgColor??15,h=o.bgColor??255,m=o.filled??!0):c=u.toCharCode(o),{type:U.Shape,shapeType:G.Triangle,x1:e,y1:t,x2:r,y2:i,x3:n,y3:s,filled:m,char:c,fg:b,bg:h}}ellipse(e,t,r,i,n,s=15,o=255,d=!0){let l={type:U.Shape,shapeType:G.Ellipse,x:e,y:t,radiusX:r,radiusY:i,filled:d,char:u.toCharCode(n),fg:s,bg:o};return this.orders.push(l),this}static ellipse(e,t,r,i,n="\u2588",s=15,o=255,d=!0){let l,a=s,c=o,b=d;return typeof n=="object"?(l=u.toCharCode(n.charCode??"\u2588"),a=n.fgColor??15,c=n.bgColor??255,b=n.filled??!0):l=u.toCharCode(n),{type:U.Shape,shapeType:G.Ellipse,x:e,y:t,radiusX:r,radiusY:i,filled:b,char:l,fg:a,bg:c}}polyline(e,t,r=15,i=255){return this.orders.push(u.polyline(e,t,r,i)),this}static polyline(e,t,r=15,i=255){return{type:U.Polyline,points:e,char:u.toCharCode(t),fg:r,bg:i}}polygon(e,t,r=15,i=255){return this.orders.push(u.polygon(e,t,r,i)),this}static polygon(e,t,r=15,i=255){let n=[...e];return n.length>0&&n.push(n[0]),{type:U.Polyline,points:n,char:u.toCharCode(t),fg:r,bg:i}}dotCloud(e,t,r=15,i=255){return this.orders.push(u.dotCloud(e,t,r,i)),this}static dotCloud(e,t,r=15,i=255){return{type:U.DotCloud,positions:e.map(n=>({x:n.posX??n.x??0,y:n.posY??n.y??0})),char:u.toCharCode(t),fg:r,bg:i}}dotCloudMulti(e){let t={type:U.DotCloudMulti,dots:e.map(r=>({...r,char:u.toCharCode(r.char)}))};return this.orders.push(t),this}static dotCloudMulti(e){return{type:U.DotCloudMulti,dots:e.map(t=>({x:t.posX??t.x??0,y:t.posY??t.y??0,char:u.toCharCode(t.charCode??t.char??0),fg:t.fgColorCode??t.fgColor??t.fg??15,bg:t.bgColorCode??t.bgColor??t.bg??255}))}}spriteCloud(e,t,r=15,i=255){let n={type:U.SpriteCloud,positions:e,spriteId:t,fg:r,bg:i};return this.orders.push(n),this}static spriteCloud(e,t,r=15,i=255){return{type:U.SpriteCloud,positions:t.map(n=>({x:n.posX??n.x??0,y:n.posY??n.y??0})),spriteId:e,fg:r,bg:i}}spriteCloudMulti(e,t){let r={type:U.SpriteCloudMulti,positions:e,spriteId:t};return this.orders.push(r),this}static spriteCloudMulti(e,t){return{type:U.SpriteCloudMulti,positions:t.map(r=>({x:r.posX??r.x??0,y:r.posY??r.y??0})),spriteId:e}}spriteCloudVaried(e){let t={type:U.SpriteCloudVaried,sprites:e};return this.orders.push(t),this}static spriteCloudVaried(e){return{type:U.SpriteCloudVaried,sprites:e.map(t=>({x:t.posX??t.x??0,y:t.posY??t.y??0,spriteId:t.spriteIndex??t.spriteId??0,fg:t.fgColorCode??t.fgColor??t.fg??15,bg:t.bgColorCode??t.bgColor??t.bg??255}))}}spriteCloudVariedMulti(e){let t={type:U.SpriteCloudVariedMulti,sprites:e};return this.orders.push(t),this}static spriteCloudVariedMulti(e){return{type:U.SpriteCloudVariedMulti,sprites:e.map(t=>({x:t.posX??t.x??0,y:t.posY??t.y??0,spriteId:t.spriteIndex??t.spriteId??0}))}}bitmask(e,t,r,i,n,s,o=15,d=255,l=!1){let a=r*i,c=Math.ceil(a/8),b=new Uint8Array(c);for(let m=0;m<a;m++)if(n[m]&1){let g=Math.floor(m/8),p=m%8;b[g]|=1<<p}let h={type:U.Bitmask,x:e,y:t,width:r,height:i,mask:b,char:u.toCharCode(s),fg:o,bg:d,override:l};return this.orders.push(h),this}static bitmask(e,t,r,i,n,s,o=15,d=255,l=!1){let a=r*i,c=Math.ceil(a/8),b=new Uint8Array(c);for(let h=0;h<a;h++)if(n[h]){let m=Math.floor(h/8),g=h%8;b[m]|=1<<g}return{type:U.Bitmask,x:e,y:t,width:r,height:i,mask:b,char:u.toCharCode(s),fg:o,bg:d,override:l}}bitmask4(e,t,r,i,n,s,o=!1){return this.orders.push(u.bitmask4(e,t,r,i,n,s,o)),this}static bitmask4(e,t,r,i,n,s,o=!1){if(s.length!==3)throw new Error("Bitmask4 requires exactly 3 variants");let d=r*i,l=Math.ceil(d/4),a=new Uint8Array(l);for(let b=0;b<d;b++){let h=n[b]&3;if(h>0){let m=Math.floor(b/4),p=b%4*2;a[m]|=h<<p}}let c=b=>({char:u.toCharCode(b.charCode??b.char),fg:b.fg??b.fgColor??15,bg:b.bg??b.bgColor??0});return{type:U.Bitmask4,x:e,y:t,width:r,height:i,mask:a,variants:[c(s[0]),c(s[1]),c(s[2])],override:o}}bitmask16(e,t,r,i,n,s,o=!1){if(s.length>15)throw new Error("Bitmask16 supports max 15 variants");let d=r*i,l=Math.ceil(d/2),a=new Uint8Array(l);for(let h=0;h<d;h++){let m=n[h]&15;if(m>0){let g=Math.floor(h/2),y=h%2*4;a[g]|=m<<y}}let c=h=>({char:u.toCharCode(h.charCode??h.char),fg:h.fg??h.fgColor??15,bg:h.bg??h.bgColor??0}),b={type:U.Bitmask16,x:e,y:t,width:r,height:i,mask:a,variants:s.map(c),override:o};return this.orders.push(b),this}static bitmask16(e,t,r,i,n,s,o=!1){if(s.length>15)throw new Error("Bitmask16 supports max 15 variants");let d=r*i,l=Math.ceil(d/2),a=new Uint8Array(l);for(let b=0;b<d;b++){let h=n[b]&15;if(h>0){let m=Math.floor(b/2),p=b%2*4;a[m]|=h<<p}}let c=b=>({char:u.toCharCode(b.charCode??b.char),fg:b.fg??b.fgColor??15,bg:b.bg??b.bgColor??0});return{type:U.Bitmask16,x:e,y:t,width:r,height:i,mask:a,variants:s.map(c),override:o}}fill(e,t=15,r=255){return this.orders.push(u.fill(e,t,r)),this}static fill(e,t=15,r=255){return{type:U.Fill,char:u.toCharCode(e),fg:t,bg:r}}fillChar(e,t,r,i=15,n=255){return this.orders.push(u.fillChar(e,t,r,i,n)),this}static fillChar(e,t,r,i=15,n=255){return{type:U.FillChar,patternWidth:e,patternHeight:t,pattern:r.map(s=>u.toCharCode(s)),fg:i,bg:n}}fillSprite(e,t=15,r=255){return this.orders.push(u.fillSprite(e,t,r)),this}static fillSprite(e,t=15,r=255){return{type:U.FillSprite,spriteId:e,fg:t,bg:r}}fillSpriteMulti(e){return this.orders.push(u.fillSpriteMulti(e)),this}static fillSpriteMulti(e){return{type:U.FillSpriteMulti,spriteId:e}}boxWithBorder(e,t,r,i,n,s){let o=u.boxWithBorder(e,t,r,i,n,s);return this.orders.push(...o),this}static boxWithBorder(e,t,r,i,n={},s={}){return[u.rect(e+1,t+1,r-2,i-2,s.charCode??"\u2588",s.fgColor??8,s.bgColor??0,!0),u.rect(e,t,r,i,n.charCode??"\u2588",n.fgColor??15,n.bgColor??0,!1)]}grid(e,t,r,i,n,s,o="+",d=15,l=255){return this.orders.push(u.grid(e,t,r,i,n,s,o,d,l)),this}static grid(e,t,r,i,n,s,o="+",d=15,l=255){let a=[];for(let c=0;c<=n;c++)for(let b=0;b<=s;b++)a.push({x:e+b*r,y:t+c*i});return u.dotCloud(a,o,d,l)}};var N=class{l;u;offset;constructor(e,t=0){this.l=e,this.u=new DataView(e.buffer,e.byteOffset,e.byteLength),this.offset=t}get remaining(){return this.l.length-this.offset}get rawBuffer(){return this.l}readU8(){return this.l[this.offset++]}readI8(){let e=this.u.getInt8(this.offset);return this.offset+=1,e}readU16BE(){let e=this.u.getUint16(this.offset,!1);return this.offset+=2,e}readI16BE(){let e=this.u.getInt16(this.offset,!1);return this.offset+=2,e}readU16LE(){let e=this.u.getUint16(this.offset,!0);return this.offset+=2,e}readBytes(e){let t=this.l.slice(this.offset,this.offset+e);return this.offset+=e,t}};import{OrderType as C,ShapeType as ae}from"@primitiv/types";var Ye=new TextDecoder;function I(u,e){return e?u.readU16LE():u.readU8()}var de=class u{static decode(e,t=!1,r=0,i=0){let n=new N(e),s=[];for(;n.remaining>0;){let o=n.readU8(),d=u.decodeOne(n,o,t,r,i);d&&s.push(d)}return s}static decodeN(e,t,r,i,n){let s=new Array(t);for(let o=0;o<t;o++){let d=e.readU8(),l=u.decodeOne(e,d,r,i,n);s[o]=l}return s}static decodeOne(e,t,r,i,n){switch(t){case C.Char:return u.decodeChar(e,r);case C.Text:return u.decodeText(e);case C.TextMultiline:return u.decodeTextMultiline(e);case C.SubFrame:return u.decodeSubFrame(e,r);case C.SubFrameMulti:return u.decodeSubFrameMulti(e,r);case C.FullFrame:return u.decodeFullFrame(e,r,i,n);case C.FullFrameMulti:return u.decodeFullFrameMulti(e,r,i,n);case C.Sprite:return u.decodeSprite(e);case C.SpriteMulti:return u.decodeSpriteMulti(e);case C.ColorMap:return u.decodeColorMap(e);case C.Shape:return u.decodeShape(e,r);case C.Polyline:return u.decodePolyline(e,r);case C.DotCloud:return u.decodeDotCloud(e,r);case C.DotCloudMulti:return u.decodeDotCloudMulti(e,r);case C.SpriteCloud:return u.decodeSpriteCloud(e);case C.SpriteCloudMulti:return u.decodeSpriteCloudMulti(e);case C.SpriteCloudVaried:return u.decodeSpriteCloudVaried(e);case C.SpriteCloudVariedMulti:return u.decodeSpriteCloudVariedMulti(e);case C.Bitmask:return u.decodeBitmask(e,r);case C.Bitmask4:return u.decodeBitmask4(e,r);case C.Bitmask16:return u.decodeBitmask16(e,r);case C.Fill:return u.decodeFill(e,r);case C.FillChar:return u.decodeFillChar(e,r);case C.FillSprite:return u.decodeFillSprite(e);case C.FillSpriteMulti:return u.decodeFillSpriteMulti(e);default:return null}}static decodeChar(e,t){let r=e.readU8(),i=e.readU8(),n=I(e,t),s=e.readU8(),o=e.readU8();return{type:C.Char,x:r,y:i,char:n,fg:o,bg:s}}static decodeText(e){let t=e.readU8(),r=e.readU8(),i=e.readU8(),n=e.readBytes(i),s=Ye.decode(n),o=e.readU8(),d=e.readU8();return{type:C.Text,x:t,y:r,text:s,fg:d,bg:o}}static decodeTextMultiline(e){let t=e.readU8(),r=e.readU8(),i=e.readU8(),n=e.readBytes(i),s=Ye.decode(n),o=e.readU8(),d=e.readU8();return{type:C.TextMultiline,x:t,y:r,text:s,fg:d,bg:o}}static decodeSubFrame(e,t){let r=e.readU8(),i=e.readU8(),n=e.readU8()+1,s=e.readU8()+1,o=e.readU8(),d=e.readU8(),l=n*s,a=new Array(l);for(let c=0;c<l;c++)a[c]=I(e,t);return{type:C.SubFrame,x:r,y:i,width:n,height:s,frame:a,fg:d,bg:o}}static decodeSubFrameMulti(e,t){let r=e.readU8(),i=e.readU8(),n=e.readU8()+1,s=e.readU8()+1,o=n*s,d=new Array(o);for(let l=0;l<o;l++){let a=I(e,t),c=e.readU8(),b=e.readU8();d[l]={char:a,fg:b,bg:c}}return{type:C.SubFrameMulti,x:r,y:i,width:n,height:s,frame:d}}static decodeFullFrame(e,t,r,i){let n=e.readU8(),s=e.readU8(),o=r*i,d=new Array(o);for(let l=0;l<o;l++)d[l]=I(e,t);return{type:C.FullFrame,frame:d,fg:s,bg:n}}static decodeFullFrameMulti(e,t,r,i){let n=r*i,s=new Array(n);for(let o=0;o<n;o++){let d=I(e,t),l=e.readU8(),a=e.readU8();s[o]={char:d,fg:a,bg:l}}return{type:C.FullFrameMulti,frame:s}}static decodeSprite(e){let t=e.readU8(),r=e.readU8(),i=e.readU8(),n=e.readU8(),s=e.readU8();return{type:C.Sprite,x:t,y:r,spriteId:i,fg:s,bg:n}}static decodeSpriteMulti(e){let t=e.readU8(),r=e.readU8(),i=e.readU8();return{type:C.SpriteMulti,x:t,y:r,spriteId:i}}static decodeColorMap(e){let t=e.readU8(),r=e.readU8(),i=e.readU8()+1,n=e.readU8()+1,s=i*n,o=new Array(s);for(let d=0;d<s;d++){let l=e.readU8(),a=e.readU8();o[d]={fg:a,bg:l}}return{type:C.ColorMap,x:t,y:r,width:i,height:n,data:o}}static decodeShape(e,t){let r=e.readU8(),i={type:C.Shape,shapeType:r,filled:!1,char:0,fg:0,bg:0};switch(r){case ae.Rectangle:{let n=e.readU8(),s=e.readU8(),o=e.readU8()+1,d=e.readU8()+1,l=e.readU8()!==0,a=I(e,t),c=e.readU8(),b=e.readU8();return{...i,x:n,y:s,width:o,height:d,filled:l,char:a,fg:b,bg:c}}case ae.Circle:{let n=e.readU8(),s=e.readU8(),o=e.readU8()+1,d=e.readU8()!==0,l=I(e,t),a=e.readU8(),c=e.readU8();return{...i,x:n,y:s,radius:o,filled:d,char:l,fg:c,bg:a}}case ae.Line:{let n=e.readU8(),s=e.readU8(),o=e.readU8(),d=e.readU8(),l=I(e,t),a=e.readU8(),c=e.readU8();return{...i,x1:n,y1:s,x2:o,y2:d,filled:!1,char:l,fg:c,bg:a}}case ae.Ellipse:{let n=e.readU8(),s=e.readU8(),o=e.readU8()+1,d=e.readU8()+1,l=e.readU8()!==0,a=I(e,t),c=e.readU8(),b=e.readU8();return{...i,x:n,y:s,radiusX:o,radiusY:d,filled:l,char:a,fg:b,bg:c}}case ae.Triangle:{let n=e.readU8(),s=e.readU8(),o=e.readU8(),d=e.readU8(),l=e.readU8(),a=e.readU8(),c=e.readU8()!==0,b=I(e,t),h=e.readU8(),m=e.readU8();return{...i,x1:n,y1:s,x2:o,y2:d,x3:l,y3:a,filled:c,char:b,fg:m,bg:h}}default:return i}}static decodePolyline(e,t){let r=I(e,t),i=e.readU8(),n=e.readU8(),s=e.readU8(),o=new Array(s);for(let d=0;d<s;d++)o[d]={x:e.readU8(),y:e.readU8()};return{type:C.Polyline,points:o,char:r,fg:i,bg:n}}static decodeDotCloud(e,t){let r=I(e,t),i=e.readU8(),n=e.readU8(),s=e.readU16BE(),o=new Array(s);for(let d=0;d<s;d++)o[d]={x:e.readU8(),y:e.readU8()};return{type:C.DotCloud,positions:o,char:r,fg:n,bg:i}}static decodeDotCloudMulti(e,t){let r=e.readU16BE(),i=new Array(r);for(let n=0;n<r;n++){let s=I(e,t),o=e.readU8(),d=e.readU8(),l=e.readU8(),a=e.readU8();i[n]={x:l,y:a,char:s,fg:d,bg:o}}return{type:C.DotCloudMulti,dots:i}}static decodeSpriteCloud(e){let t=e.readU8(),r=e.readU8(),i=e.readU8(),n=e.readU16BE(),s=new Array(n);for(let o=0;o<n;o++)s[o]={x:e.readU8(),y:e.readU8()};return{type:C.SpriteCloud,positions:s,spriteId:t,fg:i,bg:r}}static decodeSpriteCloudMulti(e){let t=e.readU8(),r=e.readU16BE(),i=new Array(r);for(let n=0;n<r;n++)i[n]={x:e.readU8(),y:e.readU8()};return{type:C.SpriteCloudMulti,positions:i,spriteId:t}}static decodeSpriteCloudVaried(e){let t=e.readU16BE(),r=new Array(t);for(let i=0;i<t;i++){let n=e.readU8(),s=e.readU8(),o=e.readU8(),d=e.readU8(),l=e.readU8();r[i]={x:d,y:l,spriteId:n,fg:o,bg:s}}return{type:C.SpriteCloudVaried,sprites:r}}static decodeSpriteCloudVariedMulti(e){let t=e.readU16BE(),r=new Array(t);for(let i=0;i<t;i++){let n=e.readU8(),s=e.readU8(),o=e.readU8();r[i]={x:s,y:o,spriteId:n}}return{type:C.SpriteCloudVariedMulti,sprites:r}}static decodeBitmask(e,t){let r=e.readU8(),i=e.readU8(),n=e.readU8()+1,s=e.readU8()+1,o=I(e,t),d=e.readU8(),l=e.readU8(),a=e.readU8()!==0,c=Math.ceil(n*s/8),b=e.readBytes(c);return{type:C.Bitmask,x:r,y:i,width:n,height:s,mask:b,char:o,fg:l,bg:d,override:a}}static decodeBitmask4(e,t){let r=e.readU8(),i=e.readU8(),n=e.readU8()+1,s=e.readU8()+1,o=e.readU8()!==0,d=[{char:0,fg:0,bg:0},{char:0,fg:0,bg:0},{char:0,fg:0,bg:0}];for(let c=0;c<3;c++)d[c].char=I(e,t),d[c].bg=e.readU8(),d[c].fg=e.readU8();let l=Math.ceil(n*s*2/8),a=e.readBytes(l);return{type:C.Bitmask4,x:r,y:i,width:n,height:s,mask:a,variants:d,override:o}}static decodeBitmask16(e,t){let r=e.readU8(),i=e.readU8(),n=e.readU8()+1,s=e.readU8()+1,o=e.readU8()!==0,d=e.readU8(),l=new Array(d);for(let b=0;b<d;b++){let h=I(e,t),m=e.readU8(),g=e.readU8();l[b]={char:h,fg:g,bg:m}}let a=Math.ceil(n*s*4/8),c=e.readBytes(a);return{type:C.Bitmask16,x:r,y:i,width:n,height:s,mask:c,variants:l,override:o}}static decodeFill(e,t){let r=I(e,t),i=e.readU8(),n=e.readU8();return{type:C.Fill,char:r,fg:n,bg:i}}static decodeFillChar(e,t){let r=e.readU8()+1,i=e.readU8()+1,n=e.readU8(),s=e.readU8(),o=r*i,d=new Array(o);for(let l=0;l<o;l++)d[l]=I(e,t);return{type:C.FillChar,patternWidth:r,patternHeight:i,pattern:d,fg:s,bg:n}}static decodeFillSprite(e){let t=e.readU8(),r=e.readU8(),i=e.readU8();return{type:C.FillSprite,spriteId:t,fg:i,bg:r}}static decodeFillSpriteMulti(e){let t=e.readU8();return{type:C.FillSpriteMulti,spriteId:t}}};import{OrderType as P}from"@primitiv/types";var Ct=1,Ut=16,St=32,Mt=64,te=new TextDecoder,Pe=class u{static decode(e){let t=new N(e),r=t.offset,i=t.readU8(),n=new Array(i);for(let S=0;S<i;S++){let B=t.readU8(),$=t.readI16BE(),T=t.readI16BE(),Me=t.readU8()+1,ve=t.readU8()+1,we=t.readU8(),le=t.readU8(),Oe=t.readU8(),Ie=t.readU8(),re=t.readU8(),Y;if(re>0){Y=new Array(re);for(let Z=0;Z<re;Z++)Y[Z]={id:t.readU8(),zMin:t.readU8(),zMax:t.readU8(),enabled:(t.readU8()&1)!==0}}let ue=u.decodePostProcess(t);n[S]={id:B,originX:$,originY:T,width:Me,height:ve,paletteSlot:we,scalingMode:le,cellWidth:Oe,cellHeight:Ie,renderPasses:Y,postProcess:ue}}let s=t.offset-r,o=t.offset,d=t.readU8(),l=new Array(d);for(let S=0;S<d;S++){let B=t.readU8(),$=new Array(256);for(let T=0;T<256;T++)$[T]={colorId:T,r:t.readU8(),g:t.readU8(),b:t.readU8(),a:t.readU8()};l[S]={slot:B,colors:$}}let a=t.offset-o,c=t.offset,b=t.readU16BE(),h=new Array(b);for(let S=0;S<b;S++){let B=t.offset,$=t.readU16BE(),T=t.readU8(),Me=(T&Ct)!==0,ve=(T&Ut)!==0,we=(T&St)!==0,le=(T&Mt)!==0,Oe=t.readI8(),Ie=t.readI16BE(),re=t.readI16BE(),Y=t.readU8()+1,ue=t.readU8()+1,Z=t.readU8(),Ee=[];Z>0&&(Ee=u.decodeOrders(t,Z,le,Y,ue));let Je=t.offset-B;h[S]={id:$,enabled:ve,isMacro:we,is16bit:le,hasOrders:Me,zIndex:Oe,originX:Ie,originY:re,width:Y,height:ue,orders:Ee,byteSize:Je}}let m=t.offset-c,g=t.offset,p=t.readU8(),y=new Array(p);for(let S=0;S<p;S++)y[S]=u.decodeAudioOrder(t);let w=t.offset-g,k=t.offset,v=t.readU8(),D=new Array(v);for(let S=0;S<v;S++)D[S]=u.decodeVibrationOrder(t);let X=t.offset-k,H=t.offset,E=[];if(t.remaining>=2){let S=t.readU16BE();E=new Array(S);for(let B=0;B<S;B++)E[B]=u.decodeMacroDefine(t)}let R=t.offset-H,F=t.offset,L=[];if(t.remaining>=2){let S=t.readU16BE();L=new Array(S);for(let B=0;B<S;B++)L[B]=u.decodeMacroOrder(t)}let je=t.offset-F;t.remaining>0&&t.readU8();let Te;if(t.remaining>=2){let S=t.readU16BE();if(S>0){let B=t.readBytes(S);Te=JSON.parse(te.decode(B))}}let Qe={displays:s,palettes:a,layers:m,audio:w,vibration:X,macroDefines:R,macroOrders:je,total:e.byteLength};return{displays:n,palettes:l,layers:h,audioOrders:y,vibrationOrders:D,macroDefines:E,macroOrders:L,inputBindings:Te,sectionSizes:Qe}}static decodeOrders(e,t,r,i,n){return de.decodeN(e,t,r,i,n)}static decodeAudioOrder(e){switch(e.readU8()){case 1:{let r=u.decodeSoundTarget(e),i=e.readU16BE(),n=e.readU8(),s={type:P.Audio,sound:r,instanceId:i};return n&1&&(s.volume=e.readU8()/255),n&2&&(s.pitch=e.readU8()/100),n&4&&(s.fadeIn=e.readU16BE()/1e3),n&8&&(s.x=e.readI16BE(),s.y=e.readI16BE()),n&16&&(s.lowpass=e.readU16BE()),n&32&&(s.highpass=e.readU16BE()),n&64&&(s.reverb=e.readU8()/255),n&128&&(s.loop=!0),s}case 2:{let r=u.decodeSoundTarget(e);return{type:P.Audio,sound:r,stop:!0}}case 3:{let r=u.decodeSoundTarget(e),i=e.readU16BE();return{type:P.Audio,sound:r,fadeOut:i/1e3}}case 4:{let r=u.decodeSoundTarget(e);return{type:P.Audio,sound:r,pause:!0}}case 5:{let r=u.decodeSoundTarget(e);return{type:P.Audio,sound:r,resume:!0}}case 6:{let r=e.readU16BE(),i=e.readU8(),n={type:P.Audio,sound:r};return i&1&&(n.lowpass=e.readU16BE()),i&2&&(n.highpass=e.readU16BE()),i&4&&(n.reverb=e.readU8()/255),i&8&&(n.pitch=e.readU8()/100),i&16&&(n.volume=e.readU8()/255),n}case 7:{let r=e.readI16BE(),i=e.readI16BE();return{type:P.Audio,sound:"__listener_position__",x:r,y:i}}case 8:{let r=e.readU16BE(),i=e.readU16BE(),n=e.readU8(),s=e.readU8();return{type:P.Audio,sound:"__configure_spatial__",maxDistance:r,referenceDistance:i,rolloffFactor:n,panSpread:s}}default:return{type:P.Audio,sound:0}}}static decodeSoundTarget(e){switch(e.readU8()){case 0:return e.readU16BE();case 1:return"all";case 2:{let r=e.readU8(),i=e.readBytes(r);return te.decode(i)}default:return 0}}static decodeVibrationOrder(e){if(e.readU8()===1){let n=e.readU8(),s=e.readU16BE(),o=e.readU8()/255,d=e.readU8()/255,l=e.readU16BE();return{type:P.Vibration,target:"gamepad",gamepadIndex:n,duration:s,strongMagnitude:o,weakMagnitude:d,startDelay:l}}let r=e.readU8();if(r===1)return{type:P.Vibration,pattern:e.readU16BE()};let i=new Array(r);for(let n=0;n<r;n++)i[n]=e.readU16BE();return{type:P.Vibration,pattern:i}}static decodeMacroDefine(e){let t=e.readU16BE(),r=e.readU16BE(),i=e.readBytes(r),n=JSON.parse(te.decode(i));return{templateId:t,template:n}}static decodeMacroOrder(e){let t=e.readU8(),r=e.readU16BE();switch(t){case 1:{let i=e.readU16BE(),n=e.readU16BE(),s=e.readI16BE(),o=e.readI16BE(),d=e.readU8(),l=e.readU16BE(),a;if(l>0){let c=e.readBytes(l);a=JSON.parse(te.decode(c))}return{cmd:t,instanceId:r,templateId:i,layerId:n,x:s,y:o,zIndex:d,params:a??{}}}case 2:{let i=e.readU16BE(),n=e.readBytes(i),s=JSON.parse(te.decode(n));return{cmd:t,instanceId:r,params:s}}case 3:return{cmd:t,instanceId:r};case 4:return{cmd:t,instanceId:r};case 5:return{cmd:t,instanceId:r};default:return{cmd:t,instanceId:r}}}static decodePostProcess(e){let t={},r=e.readU8();if(r&1){let i=e.readU8()!==0,n=e.readU8(),s=e.readU8()/10,o=e.readU8()/100;t.ambientEffect={enabled:i,blur:n,scale:s,opacity:o}}if(r&2){let i=e.readU8()!==0,n=e.readU8()/100,s=e.readU8(),o=e.readU8(),d=e.readU8(),l=e.readU8(),a=e.readU8(),c=e.readU8(),b=["horizontal","vertical","grid"];t.scanlines={enabled:i,opacity:n,pattern:b[s]??"horizontal",spacing:o,thickness:d,color:{r:l,g:a,b:c}}}if(r&4){let i=e.readU8()!==0,n=e.readU8()/10,s=e.readU8(),o=s>0?te.decode(e.readBytes(s)):void 0;t.grid={enabled:i,lineWidth:n,color:o}}return t}};var Ze=class{listeners=new Map;on(e,t){this.listeners.has(e)||this.listeners.set(e,[]),this.listeners.get(e).push(t)}off(e,t){let r=this.listeners.get(e);if(r){let i=r.indexOf(t);i!==-1&&r.splice(i,1)}}emit(e,t){let r=this.listeners.get(e);r&&r.forEach(i=>i(t))}removeAllListeners(){this.listeners.clear()}};export{N as BinaryReader,f as COLOR_SKIP,ce as CellStruct,me as Display,Xe as DisplayCompositor,Ne as Engine,Se as EngineStats,Ze as EventEmitter,ut as FontType,z as Grid,ge as ImageFont,ye as ImageFontRegistry,j as InputBindingRegistry,vt as LAYER_SIZE,he as Layer,be as LayerRasterizer,Ce as MacroRegistry,$e as OrderBuilder,de as OrderDecoder,oe as OrderEncoder,xe as SoundRegistry,fe as SpriteRegistry,Pe as TickPacketDecoder,ee as TickPacketEncoder,ze as UNICODE_TO_CP437,pe as User,Re as UserUpdateBuilder,De as UserUpdateParser,Qr as cp437ToUnicode,lt as cp437ToUnicodeCodepoint,Yr as decodeCompressedInput,$r as encodeCompressedInput,Kr as encodeCp437String,ri as getAtlasColumns,We as getAtlasDimensions,ne as getAtlasLayout,ii as getAtlasRows,ct as getMaxCharCode,Jr as hasCP437Mapping,W as nextPow2,jr as stringToCp437,V as unicodeToCp437};
|
package/package.json
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@primitiv/core",
|
|
3
|
+
"version": "0.19.0",
|
|
4
|
+
"description": "Primitiv core engine",
|
|
5
|
+
"author": "THP Software",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "https://github.com/thp-software/primitiv",
|
|
9
|
+
"directory": "packages/core"
|
|
10
|
+
},
|
|
11
|
+
"homepage": "https://primitivengine.com",
|
|
12
|
+
"bugs": {
|
|
13
|
+
"url": "https://github.com/thp-software/primitiv/issues"
|
|
14
|
+
},
|
|
15
|
+
"license": "Apache-2.0",
|
|
16
|
+
"type": "module",
|
|
17
|
+
"main": "./dist/index.cjs",
|
|
18
|
+
"module": "./dist/index.mjs",
|
|
19
|
+
"types": "./dist/index.d.ts",
|
|
20
|
+
"exports": {
|
|
21
|
+
".": {
|
|
22
|
+
"types": "./dist/index.d.ts",
|
|
23
|
+
"import": "./dist/index.mjs",
|
|
24
|
+
"require": "./dist/index.cjs"
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
"engines": {
|
|
28
|
+
"node": ">=18.0.0"
|
|
29
|
+
},
|
|
30
|
+
"sideEffects": false,
|
|
31
|
+
"files": [
|
|
32
|
+
"dist",
|
|
33
|
+
"README.md",
|
|
34
|
+
"LICENSE.txt"
|
|
35
|
+
],
|
|
36
|
+
"publishConfig": {
|
|
37
|
+
"access": "public"
|
|
38
|
+
},
|
|
39
|
+
"dependencies": {
|
|
40
|
+
"@primitiv/logger": "0.19.0",
|
|
41
|
+
"@primitiv/types": "0.19.0"
|
|
42
|
+
},
|
|
43
|
+
"devDependencies": {
|
|
44
|
+
"tinybench": "^6.0.0",
|
|
45
|
+
"typescript": "^5.6.3",
|
|
46
|
+
"@primitiv/network-common": "0.19.0"
|
|
47
|
+
},
|
|
48
|
+
"scripts": {
|
|
49
|
+
"build": "rimraf dist && node ../../scripts/build-package.mjs packages/core",
|
|
50
|
+
"dev": "tsc --watch",
|
|
51
|
+
"clean": "rimraf dist",
|
|
52
|
+
"lint": "eslint \"src/**/*.ts\" --max-warnings 0",
|
|
53
|
+
"typecheck": "tsc --noEmit",
|
|
54
|
+
"test": "node --test --import tsx src/**/*.test.ts",
|
|
55
|
+
"bench": "node --expose-gc --import tsx benchmarks/index.ts",
|
|
56
|
+
"bench:orders": "node --expose-gc --import tsx benchmarks/index.ts --orders",
|
|
57
|
+
"bench:render": "node --expose-gc --import tsx benchmarks/index.ts --render",
|
|
58
|
+
"bench:pipeline": "node --expose-gc --import tsx benchmarks/index.ts --pipeline",
|
|
59
|
+
"bench:scenarios": "node --expose-gc --import tsx benchmarks/index.ts --scenarios",
|
|
60
|
+
"bench:cached": "node --expose-gc --import tsx benchmarks/index.ts --cached",
|
|
61
|
+
"bench:display": "node --expose-gc --import tsx benchmarks/index.ts --display",
|
|
62
|
+
"bench:network": "node --expose-gc --import tsx benchmarks/index.ts --network"
|
|
63
|
+
}
|
|
64
|
+
}
|