@utsp/core 0.17.0-nightly.20260128161430.00e511d → 0.17.0-nightly.20260128165134.1dad36f
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/benchmark.cjs +1 -1
- package/dist/benchmark.d.ts +2 -1
- package/dist/benchmark.mjs +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.mjs +1 -1
- package/package.json +2 -2
package/dist/benchmark.cjs
CHANGED
|
@@ -12,4 +12,4 @@ Orders breakdown: ${this.getOrdersBreakdown()}`),this.orders=this.orders.slice(0
|
|
|
12
12
|
`,this.buttons.forEach(t=>{e+=` [${t.bindingId}] ${t.name}: `,e+=`(default: ${t.defaultValue})
|
|
13
13
|
`}),e+=`Touch Zones (${this.touchZones.size}):
|
|
14
14
|
`,this.touchZones.forEach(t=>{e+=` [${t.zoneId}] ${t.name}: `,e+=`(${t.x}, ${t.y}) ${t.width}x${t.height}
|
|
15
|
-
`}),e}};y($t,"InputBindingRegistry");var Fe=$t;function mn(b=0n){return{tick:b,axes:new Map,buttons:new Map,displayId:0,mouseX:0,mouseY:0,mouseOverDisplay:!1,textInputs:[],macroEvents:[],displayViewports:[],touchPositions:[]}}y(mn,"createEmptyCompressedInputPacket");function hn(b){return b/127}y(hn,"decodeInt8ToAxis");function bn(b){return b===0?0:Math.ceil(b/8)}y(bn,"getButtonByteCount");T();function gn(b,e){let t=e.getAllAxes().length,r=e.getAllButtons().length,n=bn(r),o=8+t+n+4;if(b.length<o)throw new Error(`Invalid compressed input packet: expected at least ${o} bytes (${t} axes + ${r} buttons), got ${b.length}`);let i=new DataView(b.buffer,b.byteOffset,b.byteLength),s=0,a=mn();a.tick=i.getBigUint64(s,!0),s+=8;for(let l=0;l<t;l++){let c=b[s],u=c>127?c-256:c,p=hn(u);a.axes.set(l,p),s+=1}for(let l=0;l<n;l++){let c=b[s];for(let u=0;u<8;u++){let p=l*8+u;if(p<r){let m=(c&1<<u)!==0;a.buttons.set(p,m)}}s+=1}a.displayId=b[s],s+=1,a.mouseX=b[s],s+=1,a.mouseY=b[s],s+=1;let d=b[s];if(a.mouseOverDisplay=(d&1)!==0,s+=1,s<b.length){let l=b[s];s+=1;let c=new TextDecoder;a.textInputs=[];for(let u=0;u<l&&s<b.length;u++){let p=b[s];if(s+=1,s+p<=b.length){let m=b.slice(s,s+p),g=c.decode(m);a.textInputs.push(g),s+=p}}}if(s<b.length){let l=b[s];s+=1;let c=new se,u=[],p=f.from(b);for(let m=0;m<l&&s<b.length;m++){let g=c.decode(p,s);u.push(g.event),s+=g.bytesRead}a.macroEvents=u}if(s<b.length){let l=b[s];s+=1;for(let c=0;c<l&&s+5<=b.length;c++){let u=b[s];s+=1;let p=i.getUint16(s,!1);s+=2;let m=i.getUint16(s,!1);s+=2,a.displayViewports.push({displayId:u,pixelWidth:p,pixelHeight:m})}}if(s<b.length){let l=Math.min(b[s],10);s+=1;for(let c=0;c<l&&s+4<=b.length;c++){let u=b[s]&15;s+=1;let p=b[s];s+=1;let m=b[s];s+=1;let C=(b[s]&1)!==0;s+=1,a.touchPositions.push({id:u,x:p,y:m,over:C})}}return a}y(gn,"decodeCompressedInput");var R=require("@utsp/types");var Zt=class Zt{constructor(e,t){h(this,"enabled",!1);h(this,"currentStats",null);h(this,"_userId");h(this,"_userName");this._userId=e,this._userName=t}setEnabled(e){this.enabled=e,e||(this.currentStats=null)}isEnabled(){return this.enabled}get userId(){return this.currentStats?.userId??this._userId}get userName(){return this.currentStats?.userName??this._userName}get tick(){return this.currentStats?.tick??0}get timestamp(){return this.currentStats?.timestamp??0}get displayCount(){return this.currentStats?.displayCount??0}get totalDisplayArea(){return this.currentStats?.totalDisplayArea??0}get totalLayers(){return this.currentStats?.totalLayers??0}get visibleLayers(){return this.currentStats?.visibleLayers??0}get staticLayers(){return this.currentStats?.staticLayers??0}get dynamicLayers(){return this.currentStats?.dynamicLayers??0}get totalOrders(){return this.currentStats?.totalOrders??0}get ordersByLayer(){return this.currentStats?.ordersByLayer??new Map}get staticPacketSize(){return this.currentStats?.staticPacketSize??0}get dynamicPacketSize(){return this.currentStats?.dynamicPacketSize??0}get totalPacketSize(){return this.currentStats?.totalPacketSize??0}get compressedPacketSize(){return Math.round(this.totalPacketSize*.25)}get hasInput(){return this.currentStats?.hasInput??!1}get axisCount(){return this.currentStats?.axisCount??0}get buttonCount(){return this.currentStats?.buttonCount??0}startTick(e){this.enabled&&(this.currentStats={userId:this._userId,userName:this._userName,tick:e,timestamp:Date.now(),displayCount:0,totalDisplayArea:0,totalLayers:0,visibleLayers:0,staticLayers:0,dynamicLayers:0,totalOrders:0,ordersByLayer:new Map,staticPacketSize:0,dynamicPacketSize:0,totalPacketSize:0,hasInput:!1,axisCount:0,buttonCount:0})}recordDisplays(e,t){!this.enabled||!this.currentStats||(this.currentStats.displayCount=e,this.currentStats.totalDisplayArea=t)}recordLayers(e,t,r,n){!this.enabled||!this.currentStats||(this.currentStats.totalLayers=e,this.currentStats.visibleLayers=t,this.currentStats.staticLayers=r,this.currentStats.dynamicLayers=n)}recordLayerOrders(e,t){!this.enabled||!this.currentStats||(this.currentStats.totalOrders+=t,this.currentStats.ordersByLayer.set(e,t))}recordPacketSizes(e,t){!this.enabled||!this.currentStats||(this.currentStats.staticPacketSize=e,this.currentStats.dynamicPacketSize=t,this.currentStats.totalPacketSize=e+t)}recordInput(e,t,r){!this.enabled||!this.currentStats||(this.currentStats.hasInput=e,this.currentStats.axisCount=t,this.currentStats.buttonCount=r)}endTick(){}reset(){this.currentStats=null}};y(Zt,"UserStats");var De=Zt;var Wt=class Wt{constructor(e,t,r){this.id=e;this.name=t;h(this,"displays",[]);h(this,"layers",[]);h(this,"spriteRegistry");h(this,"mode");h(this,"axes",new Map);h(this,"buttons",new Map);h(this,"textInputs",[]);h(this,"mouseX",0);h(this,"mouseY",0);h(this,"mouseOver",!1);h(this,"mouseDisplayId",0);h(this,"touchPositions",new Map);h(this,"activeTouchId",null);h(this,"inputBindings",new Fe);h(this,"stats");h(this,"soundCommands",[]);h(this,"nextSoundInstanceId",1);h(this,"audioConfigCommands",[]);h(this,"lastListenerX",-1);h(this,"lastListenerY",-1);h(this,"pendingSendSounds",!1);h(this,"audioProcessor");h(this,"loadedSounds",new Map);h(this,"soundLoadErrors",new Map);h(this,"playingSounds",new Map);h(this,"mobileVibrationCommands",[]);h(this,"mobileVibrationProcessor");h(this,"gamepadVibrationCommands",[]);h(this,"gamepadVibrationProcessor");h(this,"macroRegistry",new ke);h(this,"macroEngine",new Le);h(this,"macroEventHandlers",new Map);h(this,"postProcessCommands",[]);h(this,"currentPostProcessConfig",null);h(this,"bridgeMessages",[]);h(this,"totalBytesSent",0);h(this,"totalBytesReceived",0);h(this,"bytesSentPerTick",[]);h(this,"bytesReceivedPerTick",[]);h(this,"bytesTickIndex",0);h(this,"bytesTickRate",20);h(this,"currentTickBytesSent",0);h(this,"currentTickBytesReceived",0);h(this,"availableViewports",new Map);h(this,"displayCommandSink",{setPostProcess:(e,t)=>this.setPostProcess(e,t),setScanlinesEnabled:(e,t)=>this.setScanlinesEnabled(e,t),setScanlinesOpacity:(e,t)=>this.setScanlinesOpacity(e,t),setScanlinesPattern:(e,t)=>this.setScanlinesPattern(e,t),setAmbientEffect:(e,t)=>this.setAmbientEffect(e,t),setAmbientEffectEnabled:(e,t)=>this.setAmbientEffectEnabled(e,t),setAmbientEffectBlur:(e,t)=>this.setAmbientEffectBlur(e,t),setAmbientEffectScale:(e,t)=>this.setAmbientEffectScale(e,t),isAmbientEffectEnabled:()=>this.isAmbientEffectEnabled(),getAmbientEffectConfig:()=>this.getAmbientEffectConfig(),getPostProcessConfig:()=>this.getPostProcessConfig(),setScalingMode:(e,t)=>this.setScalingMode(e,t),getScalingMode:e=>this.getScalingMode(e),setCellSize:(e,t,r)=>this.setCellSize(e,t,r),getCellSize:e=>this.getCellSize(e),setGrid:(e,t)=>this.setGrid(e,t),setGridEnabled:(e,t)=>this.setGridEnabled(e,t),isGridEnabled:e=>this.isGridEnabled(e),getGridConfig:e=>this.getGridConfig(e),switchPalette:(e,t)=>this.switchPalette(e,t),getCurrentPaletteSlotId:e=>this.getCurrentPaletteSlotId(e)});h(this,"data");h(this,"currentScalingModes",new Map);h(this,"currentCellSizes",new Map);h(this,"currentGridConfigs",new Map);h(this,"currentPaletteSlotIds",new Map);this.mode=r,this.stats=new De(e,t),this.data={}}setSpriteRegistry(e){this.spriteRegistry=e;for(let t of this.layers)t.setSpriteRegistry(e);this.macroEngine.setSpriteRegistry(e)}getDisplays(){return this.displays}addDisplay(e){e.setCommandSink(this.displayCommandSink),this.displays.push(e)}removeDisplay(e){let t=this.displays.indexOf(e);return t!==-1?(this.displays.splice(t,1),!0):!1}clearDisplays(){this.displays=[]}setDisplayViewport(e,t,r){this.availableViewports.set(e,{pixelWidth:t,pixelHeight:r})}getDisplayViewport(e){return this.availableViewports.get(e)??null}getAllDisplayViewports(){return this.availableViewports}calculateMaxCells(e,t,r){let n=this.availableViewports.get(e);return n?{cols:Math.floor(n.pixelWidth/t),rows:Math.floor(n.pixelHeight/r)}:null}getLayers(){return this.layers}getLayerById(e){return this.layers.find(t=>t.getId()===e)}addLayer(e,t){e.setMode(this.mode);let r=this.layers.length+1;ue(e,r),this.layers.push(e),this.spriteRegistry&&e.setSpriteRegistry(this.spriteRegistry),t&&this.macroRegistry.setLayerMapping(t,e.getId())}removeLayer(e){let t=this.layers.indexOf(e);return t!==-1?(this.layers.splice(t,1),!0):!1}clearLayers(){this.layers=[]}setMousePosition(e,t,r=!0){this.mouseX=Math.max(0,Math.min(255,e)),this.mouseY=Math.max(0,Math.min(255,t)),this.mouseOver=r}setTouchPosition(e,t,r,n=!0,o=0){if(e<0||e>9){console.warn(`Invalid touchId ${e}, must be 0-9`);return}n?(this.touchPositions.set(e,{x:Math.max(0,Math.min(255,t)),y:Math.max(0,Math.min(255,r)),over:!0,displayId:o}),this.activeTouchId=e):(this.touchPositions.delete(e),this.activeTouchId===e&&(this.activeTouchId=null))}setAxis(e,t){let r=Math.max(-1,Math.min(1,t));this.axes.set(e,r)}getAxis(e){return this.axes.get(e)??0}setButton(e,t){this.buttons.set(e,t)}getButton(e){return this.buttons.get(e)??!1}getButtonJustPressed(e){let t=`${e}_justPressed`;return this.buttons.get(t)??!1}getButtonJustReleased(e){let t=`${e}_justReleased`;return this.buttons.get(t)??!1}setTextInputs(e){this.textInputs=e}getTextInputs(){return this.textInputs}clearTextInputs(){this.textInputs=[]}getAxisNames(){return Array.from(this.axes.keys())}getButtonNames(){return Array.from(this.buttons.keys())}clearAxes(){this.axes.clear()}clearButtons(){this.buttons.clear()}getMouseDisplayInfo(){if(!this.mouseOver||this.displays.length===0)return null;let e=this.displays[0],t=0,r=this.mouseX,n=this.mouseY,o=e.getOrigin(),i=o.x+r,s=o.y+n;return{displayId:t,localX:r,localY:n,worldX:i,worldY:s}}getTouchDisplayInfo(e=0){if(e<0||e>9)return console.warn(`Invalid touchId ${e}, must be 0-9`),null;let t=this.touchPositions.get(e);if(!t||!t.over||this.displays.length===0)return null;let r=this.displays[0],n=t.displayId,o=t.x,i=t.y,s=r.getOrigin(),a=s.x+o,d=s.y+i;return{displayId:n,localX:o,localY:i,worldX:a,worldY:d}}getIsMouseOnADisplay(){return this.mouseOver}getMouseDisplayHover(){let e=this.getMouseDisplayInfo();return e?e.displayId:null}findLayerById(e){return this.layers.find(t=>t.getId()===e)??null}applyUpdate(e){if(this.updateDisplaysFromPacket(e.displays),this.updateLayersFromPacket(e.layers),e.macroOrders&&e.macroOrders.length>0)for(let t of e.macroOrders)this.macroEngine.applyOrder(t)}updateDisplaysFromPacket(e){for(let t of e){let r=this.displays[t.id];if(!r){for(r=new Pe(t.id,t.sizeX,t.sizeY);this.displays.length<=t.id;)this.displays.push(null);this.displays[t.id]=r}r.setCommandSink(this.displayCommandSink),r.setOrigin(new R.Vector2(t.originX,t.originY)),r.setSize(new R.Vector2(t.sizeX,t.sizeY)),r.setRenderPasses(t.renderPasses)}}updateLayersFromPacket(e){for(let t of e){let r=this.findLayerById(t.id);r||(r=new ce(new R.Vector2(t.originX,t.originY),t.zIndex,t.width,t.height,{mustBeReliable:!1,isMacroLayer:t.isMacroLayer,charCodeMode:t.is16bit?"16bit":"8bit"}),ue(r,t.id),r.setMode(this.mode),this.spriteRegistry&&r.setSpriteRegistry(this.spriteRegistry),this.addLayer(r)),t.updateFlags&1&&r.setOrigin(new R.Vector2(t.originX,t.originY)),t.updateFlags&2&&r.setZOrder(t.zIndex),t.updateFlags&4&&r.setOrders(t.orders)}}defineAxisBinding(e,t,r=[],n=-1,o=1,i=0){this.inputBindings.defineAxis(e,t,r,n,o,i)}defineButtonBinding(e,t,r=[],n=!1){this.inputBindings.defineButton(e,t,r,n)}defineAxisBindings(e){e.forEach(({bindingId:t,name:r,sources:n,min:o,max:i,defaultValue:s})=>{this.defineAxisBinding(t,r,n??[],o,i,s)})}defineButtonBindings(e){e.forEach(({bindingId:t,name:r,sources:n,defaultValue:o})=>{this.defineButtonBinding(t,r,n??[],o)})}getInputBindingsLoadPacket(){return this.inputBindings.toLoadPacket()}applyInputBindingsLoadPacket(e){try{let t=JSON.parse(e);if(t.type!=="input-binding")throw new Error(`Invalid packet type: ${t.type}`);this.inputBindings.clear();for(let r of t.axes)this.defineAxisBinding(r.bindingId,r.name,r.sources||[],r.min,r.max,r.defaultValue);for(let r of t.buttons)this.defineButtonBinding(r.bindingId,r.name,r.sources||[],r.defaultValue)}catch(t){throw console.error("[User] Failed to apply input bindings:",t),t}}getInputBindingRegistry(){return this.inputBindings}getStats(){return this.stats}getTotalBytesSent(){return this.totalBytesSent}getTotalBytesReceived(){return this.totalBytesReceived}recordBytesSent(e){this.totalBytesSent+=e,this.currentTickBytesSent+=e}recordBytesReceived(e){this.totalBytesReceived+=e,this.currentTickBytesReceived+=e}resetByteCounters(){this.totalBytesSent=0,this.totalBytesReceived=0}setBytesTickRate(e){e<=0||(this.bytesTickRate=e,this.bytesSentPerTick=new Array(e).fill(0),this.bytesReceivedPerTick=new Array(e).fill(0),this.bytesTickIndex=0)}endTickBytes(){this.bytesSentPerTick.length!==this.bytesTickRate&&(this.bytesSentPerTick=new Array(this.bytesTickRate).fill(0),this.bytesReceivedPerTick=new Array(this.bytesTickRate).fill(0)),this.bytesSentPerTick[this.bytesTickIndex]=this.currentTickBytesSent,this.bytesReceivedPerTick[this.bytesTickIndex]=this.currentTickBytesReceived,this.bytesTickIndex=(this.bytesTickIndex+1)%this.bytesTickRate,this.currentTickBytesSent=0,this.currentTickBytesReceived=0}getBytesSentPerSecond(){return this.bytesSentPerTick.reduce((e,t)=>e+t,0)}getBytesReceivedPerSecond(){return this.bytesReceivedPerTick.reduce((e,t)=>e+t,0)}getAxisBindingId(e){return this.inputBindings.getAxisBindingId(e)}getButtonBindingId(e){return this.inputBindings.getButtonBindingId(e)}decodeAndApplyCompressedInput(e){let t=gn(e,this.inputBindings),r=this.inputBindings.getAllAxes(),n=this.inputBindings.getAllButtons(),o=r.sort((s,a)=>s.bindingId-a.bindingId),i=n.sort((s,a)=>s.bindingId-a.bindingId);for(let[s,a]of t.axes)if(s<o.length){let d=o[s];this.setAxis(d.name,a)}for(let[s,a]of t.buttons)if(s<i.length){let d=i[s],l=this.getButton(d.name);this.setButton(d.name,a);let c=a&&!l,u=!a&&l;this.setButton(`${d.name}_justPressed`,c),this.setButton(`${d.name}_justReleased`,u)}this.mouseX=t.mouseX,this.mouseY=t.mouseY,this.mouseOver=t.mouseOverDisplay,this.mouseDisplayId=t.displayId;for(let s of t.touchPositions)this.setTouchPosition(s.id,s.x,s.y,s.over);for(let s of t.displayViewports)this.setDisplayViewport(s.displayId,s.pixelWidth,s.pixelHeight)}playSound(e,t){let r=this.nextSoundInstanceId++,n={sound:e,instanceId:r,volume:t?.volume,pitch:t?.pitch,loop:t?.loop,fadeIn:t?.fadeIn,x:t?.x,y:t?.y,lowpass:t?.lowpass,highpass:t?.highpass,reverb:t?.reverb};return this.soundCommands.push(n),r}stopSound(e){let t={sound:e};this.soundCommands.push(t)}fadeOutSound(e,t){let r={fadeOut:!0,sound:e,duration:t};this.soundCommands.push(r)}fadeOutAllSounds(e){let t={fadeOut:!0,sound:"all",duration:e};this.soundCommands.push(t)}stopAllSounds(){let e={sound:"all"};this.soundCommands.push(e)}pauseSound(e){let t={pause:!0,sound:e};this.soundCommands.push(t)}pauseAllSounds(){let e={pause:!0,sound:"all"};this.soundCommands.push(e)}resumeSound(e){let t={resume:!0,sound:e};this.soundCommands.push(t)}resumeAllSounds(){let e={resume:!0,sound:"all"};this.soundCommands.push(e)}setSoundEffects(e,t){let r={setEffects:!0,instanceId:e,lowpass:t.lowpass,highpass:t.highpass,reverb:t.reverb};this.soundCommands.push(r)}setListenerPosition(e,t){e===this.lastListenerX&&t===this.lastListenerY||(this.lastListenerX=e,this.lastListenerY=t,this.audioConfigCommands.push({type:"set-listener-position",x:e,y:t}))}configureSpatialAudio(e){this.audioConfigCommands.push({type:"configure-spatial",...e})}flushAudioConfigCommands(){let e=this.audioConfigCommands;return this.audioConfigCommands=[],e}hasAudioConfigCommands(){return this.audioConfigCommands.length>0}flushSoundCommands(){let e=this.soundCommands;return this.soundCommands=[],e}hasSoundCommands(){return this.soundCommands.length>0}sendSounds(){this.pendingSendSounds=!0}needsSendSounds(){return this.pendingSendSounds}clearSendSounds(){this.pendingSendSounds=!1}setAudioProcessor(e){this.audioProcessor=e,this.macroEngine.setAudioCallback(t=>{e.play(t)})}getAudioProcessor(){return this.audioProcessor}applyAudioCommands(e){if(this.audioProcessor&&this.mode!=="server")for(let t of e){if("setEffects"in t&&t.setEffects===!0){let n=t;this.audioProcessor.setEffects(n.instanceId,n.lowpass,n.highpass,n.reverb);continue}if("fadeOut"in t&&t.fadeOut===!0){let n=t;this.audioProcessor.fadeOut(n.sound,n.duration);continue}if("pause"in t&&t.pause===!0){let n=t;this.audioProcessor.pause(n.sound);continue}if("resume"in t&&t.resume===!0){let n=t;this.audioProcessor.resume(n.sound);continue}if("instanceId"in t||"volume"in t||"pitch"in t||"loop"in t||"fadeIn"in t||"x"in t||"y"in t||"lowpass"in t||"highpass"in t||"reverb"in t){let n=t,o=n.x!==void 0&&n.y!==void 0?{x:n.x,y:n.y}:void 0;this.audioProcessor.play(n.sound,{volume:n.volume,pitch:n.pitch,loop:n.loop,fadeIn:n.fadeIn,position:o,instanceId:n.instanceId,lowpass:n.lowpass,highpass:n.highpass,reverb:n.reverb})}else{let n=t;n.sound==="all"?this.audioProcessor.stopAll():this.audioProcessor.stop(n.sound)}}}applyAudioConfigCommands(e){if(this.audioProcessor&&this.mode!=="server")for(let t of e)t.type==="set-listener-position"?this.audioProcessor.setListenerPosition(t.x,t.y):t.type==="configure-spatial"&&this.audioProcessor.configureSpatial({maxDistance:t.maxDistance,referenceDistance:t.referenceDistance,rolloffFactor:t.rolloffFactor,panSpread:t.panSpread})}vibrate(e){let t={pattern:e};this.mobileVibrationCommands.push(t)}cancelVibration(){let e={cancel:!0};this.mobileVibrationCommands.push(e)}vibrateTap(){this.vibrate(10)}vibrateMediumTap(){this.vibrate(25)}vibrateHeavyTap(){this.vibrate(50)}vibrateSuccess(){this.vibrate([30,50,30])}vibrateError(){this.vibrate([50,30,50,30,50])}vibrateWarning(){this.vibrate([100])}vibrateSelection(){this.vibrate(5)}vibrateImpact(e="medium"){let t={light:15,medium:30,heavy:50};this.vibrate(t[e])}vibrateNotification(){this.vibrate([100,100,100,100,100])}vibrateGamepad(e,t){let r={gamepadIndex:e,options:t};this.gamepadVibrationCommands.push(r)}stopGamepadVibration(e="all"){let t={gamepadIndex:e,cancel:!0};this.gamepadVibrationCommands.push(t)}gamepadTap(e=0){this.vibrateGamepad(e,{duration:50,strongMagnitude:.3,weakMagnitude:.5})}gamepadImpact(e=0){this.vibrateGamepad(e,{duration:100,strongMagnitude:.7,weakMagnitude:.3})}gamepadHeavy(e=0){this.vibrateGamepad(e,{duration:200,strongMagnitude:1,weakMagnitude:.2})}gamepadExplosion(e=0){this.vibrateGamepad(e,{duration:400,strongMagnitude:1,weakMagnitude:.8})}gamepadSuccess(e=0){this.vibrateGamepad(e,{duration:150,strongMagnitude:.4,weakMagnitude:.6})}gamepadError(e=0){this.vibrateGamepad(e,{duration:300,strongMagnitude:.8,weakMagnitude:.4})}hasGamepadVibrationCommands(){return this.gamepadVibrationCommands.length>0}flushGamepadVibrationCommands(){let e=this.gamepadVibrationCommands;return this.gamepadVibrationCommands=[],e}setGamepadVibrationProcessor(e){this.gamepadVibrationProcessor=e}applyGamepadVibrationCommands(e){if(this.gamepadVibrationProcessor&&this.mode!=="server"){for(let t of e)if("cancel"in t&&t.cancel===!0)t.gamepadIndex==="all"?this.gamepadVibrationProcessor.stopAllVibrations():this.gamepadVibrationProcessor.stopVibration(t.gamepadIndex);else if("options"in t){let r=t;if(r.gamepadIndex==="all")for(let n=0;n<4;n++)this.gamepadVibrationProcessor.vibrate(n,r.options);else this.gamepadVibrationProcessor.vibrate(r.gamepadIndex,r.options)}}}hasMobileVibrationCommands(){return this.mobileVibrationCommands.length>0}flushMobileVibrationCommands(){let e=this.mobileVibrationCommands;return this.mobileVibrationCommands=[],e}setMobileVibrationProcessor(e){this.mobileVibrationProcessor=e}getMobileVibrationProcessor(){return this.mobileVibrationProcessor}applyMobileVibrationCommands(e){if(this.mobileVibrationProcessor&&this.mode!=="server")for(let t of e)"cancel"in t&&t.cancel===!0?this.mobileVibrationProcessor.cancel():"pattern"in t&&this.mobileVibrationProcessor.vibrate(t.pattern)}applyVibrationOrders(e){if(this.mode==="server")return;let{VibrationOrderType:t}=(tn(),$(en)),{MobileVibrateFlags:r,GamepadVibrateFlags:n}=(Kr(),$(qr));for(let o of e)switch(o.type){case t.MobileVibrate:{if(!this.mobileVibrationProcessor)break;let i=o,s=i.pattern;i.flags&r.HasIntensity&&i.intensity!==void 0&&(s=s.map(a=>Math.round(a*i.intensity))),this.mobileVibrationProcessor.vibrate(s);break}case t.MobileCancel:{if(!this.mobileVibrationProcessor)break;this.mobileVibrationProcessor.cancel();break}case t.GamepadVibrate:{if(!this.gamepadVibrationProcessor)break;let i=o,s={duration:i.duration,strongMagnitude:i.strongMagnitude/255,weakMagnitude:i.weakMagnitude/255,startDelay:i.startDelay};if(i.flags&n.AllGamepads)for(let a=0;a<4;a++)this.gamepadVibrationProcessor.vibrate(a,s);else this.gamepadVibrationProcessor.vibrate(i.gamepadIndex,s);break}case t.GamepadCancel:{if(!this.gamepadVibrationProcessor)break;let i=o;i.flags&n.AllGamepads?this.gamepadVibrationProcessor.stopAllVibrations():this.gamepadVibrationProcessor.stopVibration(i.gamepadIndex);break}}}applyAudioOrders(e){if(!this.audioProcessor||this.mode==="server")return;let{AudioOrderType:t,AudioTargetType:r}=(Wr(),$(Zr)),{PlaySoundFlags:n}=(Xr(),$(Hr));for(let o of e)switch(o.type){case t.PlaySound:case t.PlayGlobalSound:{let i=o,s=i.volume!==void 0?i.volume/255:void 0,a=i.pitch!==void 0?.25*Math.pow(2,i.pitch/64):void 0,d=i.fadeIn!==void 0?i.fadeIn/10:void 0,l=(i.flags&n.Loop)!==0,c=i.posX!==void 0&&i.posY!==void 0?{x:i.posX,y:i.posY}:void 0;this.audioProcessor.play(i.soundId,{volume:s,pitch:a,loop:l,fadeIn:d,position:c,instanceId:i.instanceId,lowpass:i.lowpass,highpass:i.highpass,reverb:i.reverb});break}case t.StopSound:{let i=o;i.targetType===r.All?this.audioProcessor.stopAll():i.targetType===r.InstanceId?this.audioProcessor.stop(i.target):this.audioProcessor.stop(i.target);break}case t.FadeOutSound:{let i=o,s=i.duration/10;i.targetType===r.All?this.audioProcessor.fadeOut("all",s):this.audioProcessor.fadeOut(i.target,s);break}case t.PauseSound:{let i=o;i.targetType===r.All?this.audioProcessor.pause("all"):this.audioProcessor.pause(i.target);break}case t.ResumeSound:{let i=o;i.targetType===r.All?this.audioProcessor.resume("all"):this.audioProcessor.resume(i.target);break}case t.SetListenerPosition:{let i=o;this.audioProcessor.setListenerPosition(i.x,i.y);break}case t.ConfigureSpatial:{let i=o;this.audioProcessor.configureSpatial({maxDistance:i.maxDistance*100,referenceDistance:i.referenceDistance*100,rolloffFactor:i.rolloffFactor/100,panSpread:i.panSpread/255});break}case t.SetSoundEffects:{let i=o;this.audioProcessor.setEffects(i.instanceId,i.lowpass,i.highpass,i.reverb);break}}}handleAudioAck(e){switch(e.type){case"sound-loaded":this.loadedSounds.set(e.soundId,{name:e.name,loadedAt:Date.now()}),this.soundLoadErrors.delete(e.soundId);break;case"sound-error":this.soundLoadErrors.set(e.soundId,{name:e.name,error:e.error,at:Date.now()});break;case"playback-started":this.playingSounds.set(e.instanceId,{soundId:e.soundId,startedAt:Date.now()});break;case"playback-ended":this.playingSounds.delete(e.instanceId);break;case"playback-error":e.instanceId!==void 0&&this.playingSounds.delete(e.instanceId);break}}isSoundLoaded(e){return this.loadedSounds.has(e)}getSoundLoadError(e){return this.soundLoadErrors.get(e)?.error}getLoadedSounds(){return this.loadedSounds}getSoundLoadErrors(){return this.soundLoadErrors}isSoundPlaying(e){return this.playingSounds.has(e)}getPlayingSounds(){return this.playingSounds}getPlayingSoundCount(){return this.playingSounds.size}getAudioLoadingState(e){let t=this.loadedSounds.size,r=this.soundLoadErrors.size,n=e>0&&t>=e,o=Array.from(this.soundLoadErrors.values()).map(i=>i.name);return{loadedCount:t,totalExpected:e,errorCount:r,isComplete:n,errors:o}}loadMacro(e,t){let r={...t,id:e},n=this.macroRegistry.registerMacro(r);return this.mode==="client"&&this.macroEngine.loadTemplate(n,r),n}createInstance(e){return this.updateLayerMappings(),this.macroRegistry.createInstance(e)}updateInstance(e,t){return this.macroRegistry.updateInstance(e,t)}removeInstance(e){return this.macroEventHandlers.delete(e),this.macroRegistry.removeInstance(e)}onMacroEvent(e,t,r){this.macroEventHandlers.has(e)||this.macroEventHandlers.set(e,new Map),this.macroEventHandlers.get(e).set(t,r)}offMacroEvent(e,t){t?this.macroEventHandlers.get(e)?.delete(t):this.macroEventHandlers.delete(e)}handleMacroEvent(e){let t=this.macroRegistry.getInstanceName(e.instanceId);if(!t){console.warn(`MacroEvent: Unknown instance ID ${e.instanceId}`);return}let r=this.macroEventHandlers.get(t);if(!r)return;let n,o;switch(e.type){case 1:n="click",o=void 0;break;case 2:n="change",o=e.value;break;case 3:n="submit",o=e.text;break;case 4:n="select",o=e.index;break;default:return}let i=r.get(n);i&&i(o)}flushMacroOrders(){return this.macroRegistry.flushPendingOrders()}hasPendingMacroOrders(){return this.macroRegistry.hasPendingOrders()}applyMacroOrders(e){for(let t of e)this.macroEngine.applyOrder(t)}getMacroRegistry(){return this.macroRegistry}getMacroLoads(){return this.macroRegistry.toAllMacroLoads()}updateLayerMappings(){for(let e of this.layers){let t=e.getName();t&&this.macroRegistry.setLayerMapping(t,e.getId())}}registerLayerName(e,t){this.macroRegistry.setLayerMapping(e,t.getId())}loadMacroTemplate(e,t){this.macroEngine.loadTemplate(e,t)}updateMacros(){return this.macroEngine.update()}processMacroEvents(e){for(let t of e.events){let r=this.macroRegistry.getInstanceName(t.instanceId);if(!r)continue;let n=this.macroEventHandlers.get(r);if(!n)continue;let o=n.get(t.event);o&&o(t.data)}}updateMacroMouse(e,t,r){let n=this.displays.find(o=>o.getId()===this.mouseDisplayId);if(!n&&this.displays.length>0&&(n=this.displays[0]),n){let o=n.getOrigin(),i=e+o.x,s=t+o.y;this.macroEngine.updateMouse(i,s,r)}else this.macroEngine.updateMouse(e,t,r)}getMacroRenderOrders(){let e=this.macroEngine.getOrdersByLayer(),t=this.displays[0];if(!t)return e;let r=t.getOrigin();if(r.x===0&&r.y===0)return e;let n=new Map;for(let[o,i]of e){let s=i.map(a=>{let d={...a};return"posX"in d&&typeof d.posX=="number"&&(d.posX=d.posX-r.x),"posY"in d&&typeof d.posY=="number"&&(d.posY=d.posY-r.y),d});n.set(o,s)}return n}getMacroEffectOffset(){return this.macroEngine.getEffectOffset()}getMacroEngine(){return this.macroEngine}macroFocusNext(){this.macroEngine.focusNext()}macroFocusPrevious(){this.macroEngine.focusPrevious()}macroActivateFocused(){this.macroEngine.activateFocused()}setPostProcess(e,t){let r=JSON.stringify(t),n=JSON.stringify(this.currentPostProcessConfig);r!==n&&(this.currentPostProcessConfig=t,this.postProcessCommands.push({type:"set-config",displayId:e,config:t??void 0}))}setScanlinesEnabled(e,t){if(t){let r=this.currentPostProcessConfig?.scanlines;this.setPostProcess(e,{scanlines:{enabled:!0,opacity:r?.opacity??R.POST_PROCESS_DEFAULTS.scanlines.opacity,pattern:r?.pattern??R.POST_PROCESS_DEFAULTS.scanlines.pattern,color:r?.color??R.POST_PROCESS_DEFAULTS.scanlines.color}})}else this.setPostProcess(e,{scanlines:{enabled:!1}})}setScanlinesOpacity(e,t){let r=Math.max(0,Math.min(1,t)),n=this.currentPostProcessConfig?.scanlines;this.setPostProcess(e,{scanlines:{enabled:!0,opacity:r,pattern:n?.pattern??"horizontal",color:n?.color??{r:0,g:0,b:0}}})}setScanlinesPattern(e,t){let r=this.currentPostProcessConfig?.scanlines;this.setPostProcess(e,{scanlines:{enabled:r?.enabled??!0,opacity:r?.opacity??R.POST_PROCESS_DEFAULTS.scanlines.opacity,pattern:t,color:r?.color??{r:0,g:0,b:0}}})}setAmbientEffect(e,t){let r=this.currentPostProcessConfig?.ambientEffect;typeof t=="boolean"?this.setPostProcess(e,{...this.currentPostProcessConfig,ambientEffect:{enabled:t,blur:r?.blur??R.POST_PROCESS_DEFAULTS.ambientEffect.blur,scale:r?.scale??R.POST_PROCESS_DEFAULTS.ambientEffect.scale}}):this.setPostProcess(e,{...this.currentPostProcessConfig,ambientEffect:{enabled:!0,blur:t.blur??r?.blur??R.POST_PROCESS_DEFAULTS.ambientEffect.blur,scale:t.scale??r?.scale??R.POST_PROCESS_DEFAULTS.ambientEffect.scale}})}setAmbientEffectEnabled(e,t){this.setAmbientEffect(e,t)}setAmbientEffectBlur(e,t){let r=this.currentPostProcessConfig?.ambientEffect;this.setPostProcess(e,{...this.currentPostProcessConfig,ambientEffect:{enabled:r?.enabled??!0,blur:Math.max(0,t),scale:r?.scale??R.POST_PROCESS_DEFAULTS.ambientEffect.scale}})}setAmbientEffectScale(e,t){let r=this.currentPostProcessConfig?.ambientEffect;this.setPostProcess(e,{...this.currentPostProcessConfig,ambientEffect:{enabled:r?.enabled??!0,blur:r?.blur??R.POST_PROCESS_DEFAULTS.ambientEffect.blur,scale:Math.max(1,t)}})}isAmbientEffectEnabled(){return this.currentPostProcessConfig?.ambientEffect?.enabled??!1}getAmbientEffectConfig(){let e=this.currentPostProcessConfig?.ambientEffect;return e?{enabled:e.enabled,blur:e.blur??R.POST_PROCESS_DEFAULTS.ambientEffect.blur,scale:e.scale??R.POST_PROCESS_DEFAULTS.ambientEffect.scale}:null}getPostProcessConfig(){return this.currentPostProcessConfig}hasPostProcessCommands(){return this.postProcessCommands.length>0}flushPostProcessCommands(){let e=this.postProcessCommands;return this.postProcessCommands=[],e}setScalingMode(e,t){this.currentScalingModes.get(e)!==t&&(this.currentScalingModes.set(e,t),this.postProcessCommands.push({type:"set-scaling-mode",displayId:e,scalingMode:t}))}getScalingMode(e){return this.currentScalingModes.get(e)??null}setCellSize(e,t,r){let n=Math.max(1,Math.min(255,Math.round(t))),o=Math.max(1,Math.min(255,Math.round(r))),i=this.currentCellSizes.get(e);i&&i.width===n&&i.height===o||(this.currentCellSizes.set(e,{width:n,height:o}),this.postProcessCommands.push({type:"set-cell-size",displayId:e,cellWidth:n,cellHeight:o}))}getCellSize(e){let t=this.currentCellSizes.get(e);return{cellWidth:t?.width??8,cellHeight:t?.height??8}}setGrid(e,t){let r;typeof t=="boolean"?r={enabled:t,color:R.GRID_DEFAULTS.color,lineWidth:R.GRID_DEFAULTS.lineWidth}:r={enabled:t.enabled,color:t.color??R.GRID_DEFAULTS.color,lineWidth:t.lineWidth??R.GRID_DEFAULTS.lineWidth},this.currentGridConfigs.set(e,r),this.postProcessCommands.push({type:"set-grid",displayId:e,gridConfig:r})}setGridEnabled(e,t){this.setGrid(e,t)}isGridEnabled(e){return this.currentGridConfigs.get(e)?.enabled??!1}getGridConfig(e){return this.currentGridConfigs.get(e)??null}switchPalette(e,t){if(t<0||t>255)throw new Error(`Palette slot ID must be between 0 and 255, got ${t}`);this.currentPaletteSlotIds.get(e)!==t&&(this.currentPaletteSlotIds.set(e,t),this.postProcessCommands.push({type:"switch-palette",displayId:e,paletteSlotId:t}))}getCurrentPaletteSlotId(e){return this.currentPaletteSlotIds.get(e)??null}sendBridge(e,t){this.bridgeMessages.push({channel:e,data:t})}getBridgeMessages(){let e=this.bridgeMessages;return this.bridgeMessages=[],e}hasBridgeMessages(){return this.bridgeMessages.length>0}getDebugInfo(){let e=Array.from(this.availableViewports.entries()).map(([t,r])=>({displayId:t,pixelWidth:r.pixelWidth,pixelHeight:r.pixelHeight}));return{id:this.id,name:this.name,bytesSentTotal:this.totalBytesSent,bytesSentTick:this.currentTickBytesSent,availableViewports:e,layers:this.layers.map(t=>t.getDebugInfo()),displays:this.displays.map(t=>t.getDebugInfo())}}};y(Wt,"User");var Ve=Wt;var jt=class jt{constructor(){h(this,"enabled",!1);h(this,"currentStats",null)}setEnabled(e){this.enabled=e,e||(this.currentStats=null)}isEnabled(){return this.enabled}get tick(){return this.currentStats?.tick??0}get timestamp(){return this.currentStats?.timestamp??0}get totalOrders(){return this.currentStats?.totalOrders??0}get ordersByLayer(){return this.currentStats?.ordersByLayer??new Map}get ordersByType(){return this.currentStats?.ordersByType??new Map}get totalLayers(){return this.currentStats?.totalLayers??0}get visibleLayers(){return this.currentStats?.visibleLayers??0}get layersPerDisplay(){return this.currentStats?.layersPerDisplay??new Map}get displayCompositeLayerIds(){return this.currentStats?.displayCompositeLayerIds??new Map}get updatePacketSize(){return this.currentStats?.updatePacketSize??0}get displayHeaderSize(){return this.currentStats?.displayHeaderSize??0}get layerHeaderSize(){return this.currentStats?.layerHeaderSize??0}get orderDataSize(){return this.currentStats?.orderDataSize??0}get compressionRatio(){return this.currentStats?.compressionRatio??0}get compressedPacketSize(){return Math.round(this.updatePacketSize*this.compressionRatio)}get totalCells(){return this.currentStats?.totalCells??0}get nonEmptyCells(){return this.currentStats?.nonEmptyCells??0}get cellsWithBackground(){return this.currentStats?.cellsWithBackground??0}get rasterizationTimeMs(){return this.currentStats?.rasterizationTimeMs??0}get encodingTimeMs(){return this.currentStats?.encodingTimeMs??0}get packetSplit(){return this.currentStats?.packetSplit}get layerDetails(){return this.currentStats?.layerDetails}startTick(e){this.enabled&&(this.currentStats={tick:e,timestamp:Date.now(),totalOrders:0,ordersByLayer:new Map,ordersByType:new Map,totalLayers:0,visibleLayers:0,layersPerDisplay:new Map,updatePacketSize:0,displayHeaderSize:0,layerHeaderSize:0,orderDataSize:0,compressionRatio:0,totalCells:0,nonEmptyCells:0,cellsWithBackground:0,rasterizationTimeMs:0,encodingTimeMs:0,displayCompositeLayerIds:new Map})}recordDisplayComposite(e,t){!this.enabled||!this.currentStats||(this.currentStats.displayCompositeLayerIds||(this.currentStats.displayCompositeLayerIds=new Map),this.currentStats.displayCompositeLayerIds.set(e,[...t]))}recordLayerOrders(e,t){if(!(!this.enabled||!this.currentStats)){this.currentStats.totalOrders+=t.length,this.currentStats.ordersByLayer.set(e,t.length);for(let r of t){let n=this.currentStats.ordersByType.get(r.type)||0;this.currentStats.ordersByType.set(r.type,n+1)}}}recordLayers(e,t){!this.enabled||!this.currentStats||(this.currentStats.totalLayers=e,this.currentStats.visibleLayers=t)}recordDisplayLayers(e,t){!this.enabled||!this.currentStats||this.currentStats.layersPerDisplay.set(e,t)}recordUpdatePacketSize(e,t,r,n){!this.enabled||!this.currentStats||(this.currentStats.updatePacketSize=e,this.currentStats.displayHeaderSize=t,this.currentStats.layerHeaderSize=r,this.currentStats.orderDataSize=n,this.currentStats.compressionRatio=.25)}recordPacketSplit(e,t,r,n){!this.enabled||!this.currentStats||(this.currentStats.packetSplit={userId:e,displayCount:t,staticLayerCount:r,dynamicLayerCount:n})}recordLayerInfo(e,t,r,n){!this.enabled||!this.currentStats||(this.currentStats.layerDetails||(this.currentStats.layerDetails=[]),this.currentStats.layerDetails.push({layerId:e,mustBeReliable:t,orderCount:r,updateFlags:n}))}recordRenderStats(e,t,r){!this.enabled||!this.currentStats||(this.currentStats.totalCells=e,this.currentStats.nonEmptyCells=t,this.currentStats.cellsWithBackground=r)}recordRasterizationTime(e){!this.enabled||!this.currentStats||(this.currentStats.rasterizationTimeMs=e)}recordEncodingTime(e){!this.enabled||!this.currentStats||(this.currentStats.encodingTimeMs=e)}endTick(){}reset(){this.currentStats=null}};y(jt,"CoreStats");var _e=jt;function Fn(b){return Math.sqrt(b)*16}y(Fn,"getAtlasColumns");function Dn(b){return b*256-1}y(Dn,"getMaxCharCode");var Jt=class Jt{constructor(e,t){this.fontId=e;this.config=t;h(this,"atlasColumns");h(this,"maxCharCode");h(this,"blocks",new Map);this.atlasColumns=Fn(t.atlasBlocks),this.maxCharCode=Dn(t.atlasBlocks)}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}getAtlasDimensions(){return{width:this.atlasColumns*this.config.glyphWidth,height:this.atlasColumns*this.config.glyphHeight}}getCharUV(e){if(e<0||e>this.maxCharCode)return null;let t=e%this.atlasColumns,r=Math.floor(e/this.atlasColumns),n=t/this.atlasColumns,o=r/this.atlasColumns,i=(t+1)/this.atlasColumns,s=(r+1)/this.atlasColumns;return{u1:n,v1:o,u2:i,v2:s}}isValidCharCode(e){return e>=0&&e<=this.maxCharCode}};y(Jt,"ImageFont");var Se=Jt;var qt=class qt{constructor(){h(this,"fonts",new Map);h(this,"nameToId",new Map);h(this,"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),n={glyphWidth:t.glyphWidth,glyphHeight:t.glyphHeight,cellWidth:t.cellWidth,cellHeight:t.cellHeight,atlasBlocks:t.atlasBlocks??1},o=new Se(r,n);return this.fonts.set(r,o),this.nameToId.set(e,r),r}addBlock(e,t,r){let n=this.fonts.get(e);if(!n)throw new Error(`ImageFont with ID ${e} not found`);n.addBlock(t,r)}loadFont(e,t){if(this.fonts.has(e))throw new Error(`ImageFont with ID ${e} already exists`);let r=new Se(e,t);this.fonts.set(e,r),e>=this.nextId&&(this.nextId=e+1)}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)}getFontName(e){for(let[t,r]of this.nameToId.entries())if(r===e)return t}hasFont(e){return this.fonts.has(e)}hasFontByName(e){return this.nameToId.has(e)}unloadFont(e){if(!this.fonts.get(e))return!1;for(let[r,n]of this.nameToId.entries())if(n===e){this.nameToId.delete(r);break}return this.fonts.delete(e)}unloadFontByName(e){let t=this.nameToId.get(e);return t===void 0?!1:(this.nameToId.delete(e),this.fonts.delete(t))}clearFonts(){this.fonts.clear(),this.nameToId.clear(),this.nextId=0}getFontIds(){return Array.from(this.fonts.keys()).sort((e,t)=>e-t)}getFontNames(){return Array.from(this.nameToId.keys())}getAllFonts(){return Array.from(this.fonts.entries()).sort((e,t)=>e[0]-t[0]).map(e=>e[1])}getFontCount(){return this.fonts.size}};y(qt,"ImageFontRegistry");var Ne=qt;var Kt=class Kt{constructor(){h(this,"sounds",new Map);h(this,"nameToId",new Map);h(this,"nextId",0)}registerFile(e,t,r){let n=this.allocateId(e),o={soundId:n,name:e,loadType:"file",format:t,data:r};return this.sounds.set(n,o),this.nameToId.set(e,n),n}registerFileWithId(e,t,r,n){this.validateId(e),this.checkIdAvailable(e,t);let o={soundId:e,name:t,loadType:"file",format:r,data:n};this.sounds.set(e,o),this.nameToId.set(t,e)}registerExternal(e,t,r,n,o){let i=this.allocateId(e),s={soundId:i,name:e,loadType:"external",format:t,url:r,size:n,checksum:o};return this.sounds.set(i,s),this.nameToId.set(e,i),i}registerExternalWithId(e,t,r,n,o,i){this.validateId(e),this.checkIdAvailable(e,t);let s={soundId:e,name:t,loadType:"external",format:r,url:n,size:o,checksum:i};this.sounds.set(e,s),this.nameToId.set(t,e)}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}getAll(){return Array.from(this.sounds.values())}getFileSounds(){return this.getAll().filter(e=>e.loadType==="file")}getExternalSounds(){return this.getAll().filter(e=>e.loadType==="external")}getNames(){return Array.from(this.nameToId.keys())}getId(e){return this.nameToId.get(e)}toLoadPackets(){let e=[],t=this.sounds.size,r=this.getFileSounds();if(r.length>0){let o=r.map(i=>({soundId:i.soundId,name:i.name,format:i.format,data:i.data}));e.push({type:"sound",mode:"file",sounds:o,totalSounds:t})}let n=this.getExternalSounds();if(n.length>0){let o=n.map(i=>({soundId:i.soundId,name:i.name,format:i.format,url:i.url,size:i.size,checksum:i.checksum}));e.push({type:"sound",mode:"external",sounds:o,totalSounds:t})}return e}toLoadPacket(e){let t=this.get(e);return t?t.loadType==="file"?{type:"sound",mode:"file",sounds:[{soundId:t.soundId,name:t.name,format:t.format,data:t.data}]}:{type:"sound",mode:"external",sounds:[{soundId:t.soundId,name:t.name,format:t.format,url:t.url,size:t.size,checksum:t.checksum}]}:null}unregister(e){let t=this.get(e);return t?(this.sounds.delete(t.soundId),this.nameToId.delete(t.name),!0):!1}clear(){this.sounds.clear(),this.nameToId.clear(),this.nextId=0}get size(){return this.sounds.size}getStats(){let e=this.getAll(),t=e.filter(n=>n.loadType==="file"),r=t.reduce((n,o)=>n+(o.data?.length??0),0);return{total:e.length,file:t.length,external:e.length-t.length,totalFileSize:r}}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++}validateId(e){if(!Number.isInteger(e)||e<0||e>255)throw new Error(`Invalid sound ID: ${e}. Must be an integer between 0 and 255.`)}checkIdAvailable(e,t){if(this.sounds.has(e)){let r=this.sounds.get(e);throw new Error(`Sound ID ${e} is already used by "${r.name}". Cannot register "${t}".`)}if(this.nameToId.has(t))throw new Error(`Sound with name "${t}" already exists`)}};y(Kt,"SoundRegistry");var Ye=Kt;var Qt=class Qt{constructor(e){this.soundRegistry=e}collectFromUser(e){let t=[],r=e.flushSoundCommands();for(let o of r){let i=this.convertSoundCommand(o);i&&t.push(i)}let n=e.flushAudioConfigCommands();for(let o of n){let i=this.convertConfigCommand(o);i&&t.push(i)}return t}convertSoundCommand(e){return"setEffects"in e&&e.setEffects===!0?this.convertSetEffectsCommand(e):"fadeOut"in e&&e.fadeOut===!0?this.convertFadeOutCommand(e):"pause"in e&&e.pause===!0?this.convertPauseCommand(e):"resume"in e&&e.resume===!0?this.convertResumeCommand(e):"instanceId"in e||"volume"in e||"pitch"in e||"loop"in e||"fadeIn"in e||"x"in e||"y"in e||"lowpass"in e||"highpass"in e||"reverb"in e?this.convertPlayCommand(e):this.convertStopCommand(e)}convertPlayCommand(e){let t=this.resolveSoundId(e.sound);if(t===null)return console.warn(`[AudioOrderCollector] Unknown sound: ${e.sound}`),null;let r=0;e.loop&&(r|=1),e.volume!==void 0&&(r|=2),e.pitch!==void 0&&(r|=4),e.fadeIn!==void 0&&(r|=8),e.lowpass!==void 0&&e.lowpass>0&&(r|=32),e.highpass!==void 0&&e.highpass>0&&(r|=64),e.reverb!==void 0&&e.reverb>0&&(r|=128);let n=e.x!==void 0&&e.y!==void 0;return n&&(r|=16),n?{type:1,soundId:t,instanceId:e.instanceId??0,flags:r,volume:e.volume!==void 0?this.encodeVolume(e.volume):void 0,pitch:e.pitch!==void 0?this.encodePitch(e.pitch):void 0,fadeIn:e.fadeIn!==void 0?this.encodeFadeTime(e.fadeIn):void 0,posX:this.encodePosition(e.x),posY:this.encodePosition(e.y),lowpass:e.lowpass!==void 0&&e.lowpass>0?this.encodeFilterFreq(e.lowpass):void 0,highpass:e.highpass!==void 0&&e.highpass>0?this.encodeFilterFreq(e.highpass):void 0,reverb:e.reverb!==void 0&&e.reverb>0?this.encodeReverb(e.reverb):void 0}:{type:2,soundId:t,instanceId:e.instanceId??0,flags:r&-17,volume:e.volume!==void 0?this.encodeVolume(e.volume):void 0,pitch:e.pitch!==void 0?this.encodePitch(e.pitch):void 0,fadeIn:e.fadeIn!==void 0?this.encodeFadeTime(e.fadeIn):void 0,lowpass:e.lowpass!==void 0&&e.lowpass>0?this.encodeFilterFreq(e.lowpass):void 0,highpass:e.highpass!==void 0&&e.highpass>0?this.encodeFilterFreq(e.highpass):void 0,reverb:e.reverb!==void 0&&e.reverb>0?this.encodeReverb(e.reverb):void 0}}convertStopCommand(e){let{targetType:t,target:r}=this.resolveTarget(e.sound);return{type:3,targetType:t,target:r}}convertFadeOutCommand(e){let{targetType:t,target:r}=this.resolveTarget(e.sound);return{type:4,targetType:t,duration:this.encodeFadeTime(e.duration),target:r}}convertPauseCommand(e){let{targetType:t,target:r}=this.resolveTarget(e.sound);return{type:5,targetType:t,target:r}}convertResumeCommand(e){let{targetType:t,target:r}=this.resolveTarget(e.sound);return{type:6,targetType:t,target:r}}convertSetEffectsCommand(e){let t=0;return e.lowpass!==void 0&&(t|=1),e.highpass!==void 0&&(t|=2),e.reverb!==void 0&&(t|=4),{type:9,instanceId:e.instanceId,flags:t,lowpass:e.lowpass!==void 0?this.encodeFilterFreq(e.lowpass):void 0,highpass:e.highpass!==void 0?this.encodeFilterFreq(e.highpass):void 0,reverb:e.reverb!==void 0?this.encodeReverb(e.reverb):void 0}}convertConfigCommand(e){return e.type==="set-listener-position"?{type:7,x:this.encodePosition(e.x),y:this.encodePosition(e.y)}:e.type==="configure-spatial"?{type:8,maxDistance:this.encodeDistance(e.maxDistance??1e3),referenceDistance:this.encodeDistance(e.referenceDistance??100),rolloffFactor:this.encodeRolloff(e.rolloffFactor??1),panSpread:this.encodePanSpread(e.panSpread??.5)}:null}resolveSoundId(e){if(typeof e=="number")return e>=0&&e<=255?e:null;let t=this.soundRegistry.getId(e);return t!==void 0?t:null}resolveTarget(e){if(e==="all")return{targetType:2,target:void 0};if(typeof e=="number")return{targetType:0,target:e};let t=this.soundRegistry.getId(e);return t!==void 0?{targetType:1,target:t}:(console.warn(`[AudioOrderCollector] Unknown sound name: ${e}, treating as 'all'`),{targetType:2,target:void 0})}encodeVolume(e){return Math.round(Math.max(0,Math.min(1,e))*255)}encodePitch(e){let t=Math.max(.25,Math.min(4,e)),r=64*Math.log2(t/.25);return Math.round(Math.max(0,Math.min(255,r)))}encodeFadeTime(e){return Math.round(Math.max(0,Math.min(25.5,e))*10)}encodeDistance(e){return Math.round(Math.max(0,Math.min(25500,e))/100)}encodeRolloff(e){return Math.round(Math.max(0,Math.min(2.55,e))*100)}encodePanSpread(e){return Math.round(Math.max(0,Math.min(1,e))*255)}encodePosition(e){return Math.round(Math.max(0,Math.min(65535,e)))}encodeFilterFreq(e){return e<=0?0:Math.round(Math.max(1,Math.min(255,e/100)))}encodeReverb(e){return Math.round(Math.max(0,Math.min(1,e))*255)}};y(Qt,"AudioOrderCollector");var He=Qt;var er=class er{collectFromUser(e){let t=[];if(e.hasMobileVibrationCommands()){let r=e.flushMobileVibrationCommands();for(let n of r){let o=this.convertMobileCommand(n);o&&t.push(o)}}if(e.hasGamepadVibrationCommands()){let r=e.flushGamepadVibrationCommands();for(let n of r){let o=this.convertGamepadCommand(n);o&&t.push(o)}}return t}convertMobileCommand(e){return"cancel"in e&&e.cancel===!0?this.convertMobileCancelCommand():"pattern"in e?this.convertMobileVibrateCommand(e):null}convertMobileVibrateCommand(e){let t=0;e.intensity!==void 0&&e.intensity!==1&&(t|=1);let r=e.pattern,n=Array.isArray(r)?[...r]:[r],o={type:1,flags:t,pattern:n.map(i=>Math.round(i))};return t&1&&(o.intensity=Math.round(Math.min(1,Math.max(0,e.intensity))*255)/255),o}convertMobileCancelCommand(){return{type:2}}convertGamepadCommand(e){if("cancel"in e&&e.cancel===!0){let t=e.gamepadIndex??"all";return this.convertGamepadCancelCommand({gamepadIndex:t})}if("options"in e&&e.options){let t=e.gamepadIndex??0;return this.convertGamepadVibrateCommand({gamepadIndex:t,options:e.options})}return null}convertGamepadVibrateCommand(e){let{gamepadIndex:t,options:r}=e,n=0;r.startDelay!==void 0&&r.startDelay>0&&(n|=1);let o=t==="all"?255:t;t==="all"&&(n|=2);let i={type:16,flags:n,gamepadIndex:o,duration:Math.round(r.duration),strongMagnitude:Math.round(Math.min(1,Math.max(0,r.strongMagnitude??1))*255),weakMagnitude:Math.round(Math.min(1,Math.max(0,r.weakMagnitude??.5))*255)};return r.startDelay!==void 0&&r.startDelay>0&&(i.startDelay=Math.round(r.startDelay)),i}convertGamepadCancelCommand(e){let{gamepadIndex:t}=e,r=0,n=t==="all"?255:t;return t==="all"&&(r|=2),{type:17,flags:r,gamepadIndex:n}}};y(er,"VibrationOrderCollector");var Xe=er;var F=require("@utsp/types");var tr=class tr{collectFromUser(e){let t=e.flushPostProcessCommands();return this.convertCommands(t)}convertCommands(e){let t=[];for(let r of e){let n=this.convertCommand(r);n&&t.push(n)}return t}convertCommand(e){let t=e.displayId;switch(e.type){case"set-config":return this.convertSetConfig(e);case"set-scanlines-enabled":return this.createSetScanlinesOrder(t,e.enabled??!1,e.opacity);case"set-scanlines-opacity":return this.createSetScanlinesOrder(t,!0,e.opacity??F.POST_PROCESS_DEFAULTS.scanlines.opacity);case"set-ambient-effect-enabled":return this.createSetAmbientEffectOrder(t,e.enabled??!1);case"set-ambient-effect-blur":return this.createSetAmbientEffectOrder(t,!0,e.blur);case"set-ambient-effect-scale":return this.createSetAmbientEffectOrder(t,!0,void 0,e.scale);case"set-scaling-mode":return this.createSetScalingModeOrder(t,e.scalingMode);case"set-grid":return this.createSetGridOrder(t,e.gridConfig);case"switch-palette":return this.createSwitchPaletteOrder(t,e.paletteSlotId);case"set-cell-size":return this.createSetCellSizeOrder(t,e.cellWidth,e.cellHeight);default:return console.warn(`[PostProcessOrderCollector] Unknown command type: ${e.type}`),null}}convertSetConfig(e){let t=e.displayId;if(!e.config)return{type:1,displayId:t,flags:3,scanlines:{enabled:!1,opacity:0,pattern:0,colorR:0,colorG:0,colorB:0},ambientEffect:{enabled:!1,blur:0,scale:1,opacity:0}};let r=0,n={type:1,displayId:t,flags:0};if(e.config.scanlines){r|=1;let o=e.config.scanlines;n.scanlines={enabled:o.enabled,opacity:o.opacity??F.POST_PROCESS_DEFAULTS.scanlines.opacity,pattern:this.patternToType(o.pattern??"horizontal"),colorR:o.color?.r??0,colorG:o.color?.g??0,colorB:o.color?.b??0}}if(e.config.ambientEffect){r|=2;let o=e.config.ambientEffect;n.ambientEffect={enabled:o.enabled,blur:o.blur??F.POST_PROCESS_DEFAULTS.ambientEffect.blur,scale:o.scale??F.POST_PROCESS_DEFAULTS.ambientEffect.scale,opacity:o.opacity??F.POST_PROCESS_DEFAULTS.ambientEffect.opacity}}return n.flags=r,n}createSetScanlinesOrder(e,t,r){return{type:2,displayId:e,enabled:t,opacity:r??F.POST_PROCESS_DEFAULTS.scanlines.opacity,pattern:0,colorR:0,colorG:0,colorB:0}}createSetAmbientEffectOrder(e,t,r,n){return{type:3,displayId:e,enabled:t,blur:r??F.POST_PROCESS_DEFAULTS.ambientEffect.blur,scale:n??F.POST_PROCESS_DEFAULTS.ambientEffect.scale,opacity:F.POST_PROCESS_DEFAULTS.ambientEffect.opacity}}patternToType(e){switch(e){case"horizontal":return 0;case"vertical":return 1;case"grid":return 2;default:return 0}}createSetScalingModeOrder(e,t){return{type:4,displayId:e,mode:(0,F.scalingModeToValue)(t)}}createSetGridOrder(e,t){let{r,g:n,b:o,a:i}=this.parseColor(t.color??F.GRID_DEFAULTS.color);return{type:5,displayId:e,enabled:t.enabled,colorR:r,colorG:n,colorB:o,colorA:i,lineWidth:t.lineWidth??F.GRID_DEFAULTS.lineWidth}}createSwitchPaletteOrder(e,t){return{type:6,displayId:e,slotId:t}}createSetCellSizeOrder(e,t,r){return{type:7,displayId:e,cellWidth:t,cellHeight:r}}parseColor(e){let t=e.match(/rgba?\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(?:,\s*([\d.]+))?\s*\)/);if(t)return{r:parseInt(t[1],10),g:parseInt(t[2],10),b:parseInt(t[3],10),a:t[4]?Math.round(parseFloat(t[4])*255):255};let r=e.match(/^#([0-9a-fA-F]{6}|[0-9a-fA-F]{3})$/);if(r){let n=r[1];return n.length===3?{r:parseInt(n[0]+n[0],16),g:parseInt(n[1]+n[1],16),b:parseInt(n[2]+n[2],16),a:255}:{r:parseInt(n.slice(0,2),16),g:parseInt(n.slice(2,4),16),b:parseInt(n.slice(4,6),16),a:255}}return{r:144,g:24,b:24,a:255}}};y(tr,"PostProcessOrderCollector");var Ge=tr;var me=class me{constructor(e={}){h(this,"_inputReliability","reliable");h(this,"mode");h(this,"maxUsers");h(this,"strictMode",!1);h(this,"currentTick",0);h(this,"stats",new _e);h(this,"spriteRegistry",new le);h(this,"imageFontRegistry",new Ne);h(this,"soundRegistry",new Ye);h(this,"audioOrderCollector",new He(this.soundRegistry));h(this,"vibrationOrderCollector",new Xe);h(this,"postProcessOrderCollector",new Ge);h(this,"encoder",new K);h(this,"users",new Map);h(this,"colorPalette",new Map);h(this,"paletteSlots",new Map);h(this,"displayRasterizer",new de(this));h(this,"_renderCallCount",0);h(this,"onPaletteChangedCallback");h(this,"onFontAllocatedCallback");h(this,"onFontBlockAddedCallback");h(this,"onImageFontChangedCallback");this.mode=e.mode??"standalone",this.maxUsers=e.maxUsers??(this.mode==="client"?1:100),this.initializeDefaultPalette(),this.loadFont(8,8,1,8,8)}initializeDefaultPalette(){[{r:0,g:0,b:0},{r:170,g:0,b:0},{r:0,g:170,b:0},{r:170,g:85,b:0},{r:0,g:0,b:170},{r:170,g:0,b:170},{r:0,g:170,b:170},{r:170,g:170,b:170},{r:85,g:85,b:85},{r:255,g:85,b:85},{r:85,g:255,b:85},{r:255,g:255,b:85},{r:85,g:85,b:255},{r:255,g:85,b:255},{r:85,g:255,b:255},{r:255,g:255,b:255}].forEach((t,r)=>this.colorPalette.set(r,{...t,a:255,e:0})),me.ANSI_VGA_COLORS.forEach(t=>this.colorPalette.set(t.colorId,t)),this.colorPalette.set(255,{r:0,g:0,b:0,a:0,e:0})}isServer(){return this.mode==="server"}isClient(){return this.mode==="client"}isStandalone(){return this.mode==="standalone"}setInputReliability(e){this._inputReliability=e}getInputReliability(){return this._inputReliability}createUser(e,t){if(this.users.has(e))throw new Error(`User with ID ${e} already exists`);if(this.mode==="server"&&this.users.size>=this.maxUsers)throw new Error(`Maximum number of users reached (${this.maxUsers}). Cannot create user ${e}`);if(this.mode==="client"&&this.users.size>=1)throw new Error(`Client mode only allows one user. Cannot create user ${e}`);let r=new Ve(e,t,this.mode);return r.setSpriteRegistry(this.spriteRegistry),this.users.set(e,r),r}getUser(e){return this.users.get(e)??null}getUsers(){return Array.from(this.users.values())}hasUser(e){return this.users.has(e)}removeUser(e){return this.users.delete(e)}getUserCount(){return this.users.size}clearAllUsers(){this.users.clear()}setColor(e,t,r,n,o=255,i=0){if(e<0||e>255)throw new Error(`Color ID must be between 0 and 255, got ${e}`);if(e>=240)throw new Error("Color IDs 240-255 are reserved (240-254: UI palette, 255: skip color). Use IDs 0-239 for custom colors.");if(t<0||t>255||r<0||r>255||n<0||n>255||o<0||o>255||i<0||i>255)throw new Error("Color components must be between 0 and 255");this.colorPalette.set(e,{r:t,g:r,b:n,a:o,e:i}),this.onPaletteChangedCallback&&this.onPaletteChangedCallback(this.colorPalette)}onPaletteChanged(e){this.onPaletteChangedCallback=e}getColor(e){return this.colorPalette.get(e)??null}getPalette(){return new Map(this.colorPalette)}resetPalette(){this.colorPalette.clear(),this.initializeDefaultPalette(),this.onPaletteChangedCallback&&this.onPaletteChangedCallback(this.colorPalette)}loadPaletteToSlot(e,t){if(e<0||e>255)throw new Error(`Palette slot ID must be between 0 and 255, got ${e}`);let r=new Map;for(let n of t)n.colorId<0||n.colorId>255||r.set(n.colorId,{r:n.r,g:n.g,b:n.b,a:n.a,e:n.e??0});me.ANSI_VGA_COLORS.forEach(n=>{r.set(n.colorId,{r:n.r,g:n.g,b:n.b,a:n.a,e:n.e})}),r.set(255,{r:0,g:0,b:0,a:0,e:0}),this.paletteSlots.set(e,r)}getPaletteFromSlot(e){return this.paletteSlots.get(e)??null}hasPaletteSlot(e){return this.paletteSlots.has(e)}clearPaletteSlot(e){this.paletteSlots.delete(e)}clearAllPaletteSlots(){this.paletteSlots.clear()}getColorCSS(e){let t=this.getColor(e);if(!t)return null;let r=t.a/255;return`rgba(${t.r}, ${t.g}, ${t.b}, ${r})`}getUserIds(){return Array.from(this.users.keys())}forEachUser(e){this.users.forEach(e)}filterUsers(e){return this.getUsers().filter(e)}findUser(e){return this.getUsers().find(e)}getCurrentTick(){return this.currentTick}getStats(){return this.stats}endTick(){this.stats.isEnabled()&&this.stats.startTick(this.currentTick);let e=new Map,t=0,r=0;return this.users.forEach((n,o)=>{let i=n.getLayers(),s=n.getDisplays();t+=i.length,n.getStats().isEnabled()&&n.getStats().startTick(this.currentTick);let a=s.map(S=>{let x=S.getOrigin(),I=S.getSize();return{id:S.getId(),originX:x.x,originY:x.y,sizeX:I.x,sizeY:I.y,renderPasses:S.getRenderPasses()}});s.forEach(S=>S.resetChangeTracking());let d=[],l=[];i.forEach((S,x)=>{if(!S.getNeedsCommit())return;let I=S.getOrigin(),v=S.getOrders(),w=S.getMustBeReliable(),A=S.calculateUpdateFlags();S.resetChangeTracking(),S.resetCommit(),S.getId()===0&&ue(S,x);let E={id:S.getId(),updateFlags:A,zIndex:S.getZOrder(),originX:I.x,originY:I.y,width:S.getWidth(),height:S.getHeight(),isMacroLayer:S.getIsMacroLayer(),is16bit:S.getCharCodeMode()==="16bit",orderCount:v.length,orders:v};v.length>0&&this.stats.isEnabled()&&this.stats.recordLayerInfo(S.getId(),w,v.length,A),w?d.push(E):l.push(E)}),r+=d.length+l.length;let c=this.audioOrderCollector.collectFromUser(n),u=this.vibrationOrderCollector.collectFromUser(n),p=this.postProcessOrderCollector.collectFromUser(n),m=n.flushMacroOrders(),g=null,C=null;if(this.stats.isEnabled()&&this.stats.recordPacketSplit(o,a.length,d.length,l.length),(d.length>0||c.length>0||m.length>0)&&(g=this.encoder.encode({tick:this.currentTick,displayCount:a.length,displays:a,layerCount:d.length,layers:d,audioOrderCount:c.length,audioOrders:c,vibrationOrderCount:0,vibrationOrders:[],macroOrderCount:m.length,macroOrders:m,postProcessOrderCount:0,postProcessOrders:[]})),C=this.encoder.encode({tick:this.currentTick,displayCount:a.length,displays:a,layerCount:l.length,layers:l,audioOrderCount:0,audioOrders:[],vibrationOrderCount:u.length,vibrationOrders:u,macroOrderCount:0,macroOrders:[],postProcessOrderCount:p.length,postProcessOrders:p}),e.set(o,{static:g,dynamic:C}),n.getStats().isEnabled()){let S=s.reduce((w,A)=>{let E=A.getSize();return w+E.x*E.y},0);n.getStats().recordDisplays(s.length,S),n.getStats().recordLayers(i.length,d.length+l.length,d.length,l.length),[...d,...l].forEach(w=>{n.getStats().recordLayerOrders(w.id,w.orders.length)});let x=g?.length||0,I=C?.length||0;n.getStats().recordPacketSizes(x,I);let v=n.getInputBindingRegistry();n.getStats().recordInput(!1,v.getAxisCount(),v.getButtonCount()),n.getStats().endTick()}if(n.endTickBytes(),this.stats.isEnabled()){let S=[...d,...l];S.forEach((A,E)=>{this.stats.recordLayerOrders(E,A.orders)}),s.forEach((A,E)=>{this.stats.recordDisplayLayers(E,S.length)});let x=(g?.length||0)+(C?.length||0),I=a.reduce((A,E)=>{let U=Math.min(E.renderPasses?.length??0,4);return A+8+U*4},0),v=S.length*20,w=x-I-v;this.stats.recordUpdatePacketSize(x,I,v,w>0?w:0)}}),this.stats.isEnabled()&&(this.stats.recordLayers(t,r),this.stats.endTick()),this.currentTick++,e}getSnapshot(e){let t=this.getUser(e);if(!t)return null;let r=t.getDisplays(),n=t.getLayers(),o=r.map((s,a)=>{let d=s.getOrigin(),l=s.getSize();return{id:a,originX:d.x,originY:d.y,sizeX:l.x,sizeY:l.y,renderPasses:s.getRenderPasses()}}),i=n.map((s,a)=>{let d=s.getOrigin(),l=s.getOrders(),c=7;return s.getId()===0&&ue(s,a),{id:s.getId(),updateFlags:c,zIndex:s.getZOrder(),originX:d.x,originY:d.y,width:s.getWidth(),height:s.getHeight(),isMacroLayer:s.getIsMacroLayer(),is16bit:s.getCharCodeMode()==="16bit",orderCount:l.length,orders:l}});return this.encoder.encode({tick:this.currentTick,displayCount:o.length,displays:o,layerCount:i.length,layers:i,audioOrderCount:0,audioOrders:[],vibrationOrderCount:0,vibrationOrders:[],macroOrderCount:0,macroOrders:[],postProcessOrderCount:0,postProcessOrders:[]})}resetTick(){this.currentTick=0}applyUpdatePacket(e,t){let r=this.getUser(e);if(!r){if(this.strictMode)throw new Error(`Cannot apply update packet: user ${e} does not exist`);return!1}return r.applyUpdate(t),t.audioOrders&&t.audioOrders.length>0&&r.applyAudioOrders(t.audioOrders),t.vibrationOrders&&t.vibrationOrders.length>0&&r.applyVibrationOrders(t.vibrationOrders),!0}applyUpdatePacketBuffer(e,t){let{UpdatePacketDecoder:r}=(Mt(),$(dn)),o=new r().decode(t);return this.applyUpdatePacket(e,o)?o:null}applyLoadPacket(e){try{let n=new ie().decode(e).load;switch(n.loadType){case 1:n.slotId!==void 0?this.loadPaletteToSlot(n.slotId,n.colors):(console.warn("[Core] ColorPalette load without slotId is deprecated. Loading into slot 0."),this.loadPaletteToSlot(0,n.colors));break;case 2:this.spriteRegistry.loadUnicolorSprites(n);break;case 3:this.spriteRegistry.loadMulticolorSprites(n);break;case 5:console.warn("[Core] Sound loading not yet implemented");break;case 8:this.loadFont(n.glyphWidth,n.glyphHeight,n.atlasBlocks,n.cellWidth,n.cellHeight);break;case 9:this.loadFontBlock(n.blockIndex,n.imageData);break;case 7:{for(let o of this.users.values())o.loadMacroTemplate(n.macroId,n.template);break}default:return console.error(`[Core] Unknown LoadType: ${n.loadType}`),!1}return!0}catch(t){return console.error("[Core] Failed to apply LoadPacket:",t),!1}}generatePaletteSlotLoadPacket(e){let t=this.getPaletteFromSlot(e);if(!t||t.size===0)return null;let r=new Y,n=[];return t.forEach((o,i)=>{i!==255&&n.push({colorId:i,r:o.r,g:o.g,b:o.b,a:o.a,e:o.e})}),r.encode({loadType:1,slotId:e,colors:n})}generateAllPaletteSlotLoadPackets(){let e=[];return this.paletteSlots.forEach((t,r)=>{let n=this.generatePaletteSlotLoadPacket(r);n&&e.push(n)}),e}generateUnicolorSpritesLoadPacket(){let e=this.getSpriteRegistry(),t=[];for(let n=0;n<=255;n++){let o=e.getUnicolorSprite(n);if(o){let i=[];for(let s=0;s<o.sizeX*o.sizeY;s++)i.push(o.data.get(s));t.push({spriteId:o.id,sizeX:o.sizeX,sizeY:o.sizeY,data:i})}}return t.length===0?null:new Y().encode({loadType:2,sprites:t})}generateMulticolorSpritesLoadPacket(){let e=this.getSpriteRegistry(),t=[];for(let n=0;n<=255;n++){let o=e.getMulticolorSprite(n);if(o){let i=[];for(let s=0;s<o.sizeX*o.sizeY;s++){let a=o.data.get(s);i.push({charCode:a.charCode,fgColorId:a.fgColorCode,bgColorId:a.bgColorCode})}t.push({spriteId:o.id,sizeX:o.sizeX,sizeY:o.sizeY,data:i})}}return t.length===0?null:new Y().encode({loadType:3,sprites:t})}generateAllLoadPackets(){let e=[],t=this.generateAllPaletteSlotLoadPackets();e.push(...t);let r=this.generateUnicolorSpritesLoadPacket();r&&e.push(r);let n=this.generateMulticolorSpritesLoadPacket();return n&&e.push(n),e}generateMacroLoadPackets(e){let t=this.getUser(e);if(!t)return[];let r=t.getMacroLoads();if(r.length===0)return[];let n=new Q;return r.map(o=>n.encode(o))}generateInitialUpdatePacket(e){let t=this.getUser(e);if(!t||!t.hasPostProcessCommands())return null;let r=this.postProcessOrderCollector.collectFromUser(t);if(r.length===0)return null;let o=t.getDisplays().map(s=>{let a=s.getSize();return{id:s.getId(),originX:0,originY:0,sizeX:a.x,sizeY:a.y}});return this.encoder.encode({tick:0,displayCount:o.length,displays:o,layerCount:0,layers:[],audioOrderCount:0,audioOrders:[],vibrationOrderCount:0,vibrationOrders:[],macroOrderCount:0,macroOrders:[],postProcessOrderCount:r.length,postProcessOrders:r})}applyInputBindingsLoadPacket(e,t){let r=this.getUser(e);if(!r){if(this.strictMode)throw new Error(`Cannot apply input bindings: user ${e} does not exist`);return!1}try{return r.applyInputBindingsLoadPacket(t),!0}catch(n){return console.error(`[Core] Failed to apply input bindings for user ${e}:`,n),!1}}getRenderState(e,t){let r=this.getUser(e);if(!r)return null;let n=r.getDisplays(),o=t?r.getLayers().filter(t):r.getLayers(),i=performance.now(),s=[];for(let d of n){if(!d)continue;let l=d.getOrigin(),c=d.getSize();if(s.push(this.displayRasterizer.rasterize({id:d.getId(),x:l.x,y:l.y,width:c.x,height:c.y},o,d.getRenderPasses())),this.stats.isEnabled()){let u=d.getId();this.stats.recordDisplayComposite(u,this.displayRasterizer.getLastVisibleLayerIds())}}let a=performance.now()-i;return this._renderCallCount||(this._renderCallCount=0),this._renderCallCount++,{userId:r.id,userName:r.name,tick:this.currentTick,displays:s}}getAllRenderStates(){let e=new Map;return this.users.forEach((t,r)=>{let n=this.getRenderState(r);n&&e.set(r,n)}),e}enableStats(e){this.stats.setEnabled(e)}getStatsInstance(){return this.stats}resetStats(){this.stats.reset()}loadUnicolorSprites(e){this.spriteRegistry.loadUnicolorSprites(e)}loadMulticolorSprites(e){this.spriteRegistry.loadMulticolorSprites(e)}loadFont(e,t,r,n,o){let i={glyphWidth:e,glyphHeight:t,cellWidth:n,cellHeight:o,atlasBlocks:r};this.imageFontRegistry.hasFont(0)&&this.imageFontRegistry.unloadFont(0),this.imageFontRegistry.loadFont(0,i),this.onFontAllocatedCallback&&this.onFontAllocatedCallback()}loadFontBlock(e,t){if(typeof t=="string")return this.readResource(t).then(r=>{this.imageFontRegistry.addBlock(0,e,r),this.onFontBlockAddedCallback&&this.onFontBlockAddedCallback(e),e===0&&this.onImageFontChangedCallback&&this.onImageFontChangedCallback(0)});this.imageFontRegistry.addBlock(0,e,t),this.onFontBlockAddedCallback&&this.onFontBlockAddedCallback(e),e===0&&this.onImageFontChangedCallback&&this.onImageFontChangedCallback(0)}unloadUnicolorSprite(e){return this.spriteRegistry.unloadUnicolorSprite(e)}unloadMulticolorSprite(e){return this.spriteRegistry.unloadMulticolorSprite(e)}clearUnicolorSprites(){this.spriteRegistry.clearUnicolorSprites()}clearMulticolorSprites(){this.spriteRegistry.clearMulticolorSprites()}clearAllSprites(){this.spriteRegistry.clearAll()}getUnicolorSpriteCount(){return this.spriteRegistry.getUnicolorSpriteCount()}getMulticolorSpriteCount(){return this.spriteRegistry.getMulticolorSpriteCount()}getTotalSpriteCount(){return this.spriteRegistry.getTotalSpriteCount()}hasUnicolorSprite(e){return this.spriteRegistry.hasUnicolorSprite(e)}hasMulticolorSprite(e){return this.spriteRegistry.hasMulticolorSprite(e)}getSpriteRegistry(){return this.spriteRegistry}getSoundRegistry(){return this.soundRegistry}async loadSound(e,t){let r=this.detectSoundFormat(t),n=await this.readResource(t);return this.soundRegistry.registerFile(e,r,n)}async loadSounds(e){let t={},n=Object.entries(e).map(async([o,i])=>{let s=await this.loadSound(o,i);t[o]=s});return await Promise.all(n),t}detectSoundFormat(e){let t=e.split(".").pop()?.toLowerCase()??"",r={mp3:"mp3",wav:"wav",ogg:"ogg",webm:"webm",aac:"aac",m4a:"aac"},n=r[t];if(!n)throw new Error(`Unsupported audio format: .${t}. Supported: ${Object.keys(r).join(", ")}`);return n}async readResource(e){let t=globalThis,r=typeof t.window<"u"||typeof t.document<"u",n=typeof t.fetch=="function",o=/^https?:\/\//i.test(e),i=e.startsWith("file:");if(r)try{let p=await fetch(e);if(!p.ok)throw new Error(`HTTP ${p.status}: ${p.statusText}`);let m=await p.arrayBuffer();return new Uint8Array(m)}catch(p){let m=p instanceof Error?p.message:String(p);throw new Error(`Failed to load resource "${e}": ${m}`)}if((o||i)&&n)try{let p=await fetch(e);if(!p.ok)throw new Error(`HTTP ${p.status}: ${p.statusText}`);let m=await p.arrayBuffer();return new Uint8Array(m)}catch(p){let m=p instanceof Error?p.message:String(p);throw new Error(`Failed to load resource "${e}": ${m}`)}let s=typeof require<"u"?require:null;if(!s)throw new Error("Node.js require is not available");let a="fs",d=s("path"),l=s(a),c=d.resolve(e),u=l.readFileSync(c);return new Uint8Array(u)}registerSound(e,t,r){return this.soundRegistry.registerFile(e,t,r)}registerExternalSound(e,t,r,n){return this.soundRegistry.registerExternal(e,t,r,n)}hasSound(e){return this.soundRegistry.has(e)}generateSoundLoadPackets(){return this.soundRegistry.toLoadPackets()}async loadImageFont(e,t,r){let n=await this.loadImageData(t),o=this.imageFontRegistry.registerFont(e,r);return this.imageFontRegistry.addBlock(0,0,n),this.onFontAllocatedCallback&&this.onFontAllocatedCallback(),this.onFontBlockAddedCallback&&this.onFontBlockAddedCallback(0),this.onImageFontChangedCallback&&this.onImageFontChangedCallback(0),o}async loadImageFonts(e){let t={},n=Object.entries(e).map(async([o,{path:i,options:s}])=>{let a=await this.loadImageFont(o,i,s);t[o]=a});return await Promise.all(n),t}async loadImageData(e){let t=globalThis;if(typeof t.document<"u"||typeof t.window<"u"||typeof t.fetch=="function")try{let n=await fetch(e);if(!n.ok)throw new Error(`HTTP ${n.status}: ${n.statusText}`);let o=await n.arrayBuffer();return new Uint8Array(o)}catch(n){let o=n instanceof Error?n.message:String(n);throw new Error(`Failed to load image font "${e}": ${o}`)}else{let n=typeof require<"u"?require:null;if(!n)throw new Error("Node.js require is not available");let s=n("fs").readFileSync(e);return new Uint8Array(s)}}getImageFontId(e){return this.imageFontRegistry.getFontId(e)}getImageFontByName(e){return this.imageFontRegistry.getFontByName(e)??null}onFontAllocated(e){this.onFontAllocatedCallback=e}onFontBlockAdded(e){this.onFontBlockAddedCallback=e}onImageFontChanged(e){this.onImageFontChangedCallback=e}getImageFontRegistry(){return this.imageFontRegistry}loadImageFontById(e,t){this.imageFontRegistry.loadFont(e,t),this.onImageFontChangedCallback&&this.onImageFontChangedCallback(e)}getImageFont(e){return this.imageFontRegistry.getFont(e)??null}hasImageFont(e){return this.imageFontRegistry.hasFont(e)}hasImageFontByName(e){return this.imageFontRegistry.hasFontByName(e)}unloadImageFont(e){return this.imageFontRegistry.unloadFont(e)}unloadImageFontByName(e){return this.imageFontRegistry.unloadFontByName(e)}clearImageFonts(){this.imageFontRegistry.clearFonts()}getImageFontCount(){return this.imageFontRegistry.getFontCount()}getImageFontIds(){return this.imageFontRegistry.getFontIds()}getImageFontNames(){return this.imageFontRegistry.getFontNames()}};y(me,"Core"),h(me,"ANSI_VGA_COLORS",[{colorId:240,r:0,g:0,b:0,a:255,e:0},{colorId:241,r:170,g:0,b:0,a:255,e:0},{colorId:242,r:0,g:170,b:0,a:255,e:0},{colorId:243,r:170,g:85,b:0,a:255,e:0},{colorId:244,r:0,g:0,b:170,a:255,e:0},{colorId:245,r:170,g:0,b:170,a:255,e:0},{colorId:246,r:0,g:170,b:170,a:255,e:0},{colorId:247,r:170,g:170,b:170,a:255,e:0},{colorId:248,r:85,g:85,b:85,a:255,e:0},{colorId:249,r:255,g:85,b:85,a:255,e:0},{colorId:250,r:85,g:255,b:85,a:255,e:0},{colorId:251,r:255,g:255,b:85,a:255,e:0},{colorId:252,r:85,g:85,b:255,a:255,e:0},{colorId:253,r:255,g:85,b:255,a:255,e:0},{colorId:254,r:85,g:255,b:255,a:255,e:0}]);var $e=me;var yn=require("@utsp/types");
|
|
15
|
+
`}),e}};y($t,"InputBindingRegistry");var Fe=$t;function mn(b=0n){return{tick:b,axes:new Map,buttons:new Map,displayId:0,mouseX:0,mouseY:0,mouseOverDisplay:!1,textInputs:[],macroEvents:[],displayViewports:[],touchPositions:[]}}y(mn,"createEmptyCompressedInputPacket");function hn(b){return b/127}y(hn,"decodeInt8ToAxis");function bn(b){return b===0?0:Math.ceil(b/8)}y(bn,"getButtonByteCount");T();function gn(b,e){let t=e.getAllAxes().length,r=e.getAllButtons().length,n=bn(r),o=8+t+n+4;if(b.length<o)throw new Error(`Invalid compressed input packet: expected at least ${o} bytes (${t} axes + ${r} buttons), got ${b.length}`);let i=new DataView(b.buffer,b.byteOffset,b.byteLength),s=0,a=mn();a.tick=i.getBigUint64(s,!0),s+=8;for(let l=0;l<t;l++){let c=b[s],u=c>127?c-256:c,p=hn(u);a.axes.set(l,p),s+=1}for(let l=0;l<n;l++){let c=b[s];for(let u=0;u<8;u++){let p=l*8+u;if(p<r){let m=(c&1<<u)!==0;a.buttons.set(p,m)}}s+=1}a.displayId=b[s],s+=1,a.mouseX=b[s],s+=1,a.mouseY=b[s],s+=1;let d=b[s];if(a.mouseOverDisplay=(d&1)!==0,s+=1,s<b.length){let l=b[s];s+=1;let c=new TextDecoder;a.textInputs=[];for(let u=0;u<l&&s<b.length;u++){let p=b[s];if(s+=1,s+p<=b.length){let m=b.slice(s,s+p),g=c.decode(m);a.textInputs.push(g),s+=p}}}if(s<b.length){let l=b[s];s+=1;let c=new se,u=[],p=f.from(b);for(let m=0;m<l&&s<b.length;m++){let g=c.decode(p,s);u.push(g.event),s+=g.bytesRead}a.macroEvents=u}if(s<b.length){let l=b[s];s+=1;for(let c=0;c<l&&s+5<=b.length;c++){let u=b[s];s+=1;let p=i.getUint16(s,!1);s+=2;let m=i.getUint16(s,!1);s+=2,a.displayViewports.push({displayId:u,pixelWidth:p,pixelHeight:m})}}if(s<b.length){let l=Math.min(b[s],10);s+=1;for(let c=0;c<l&&s+4<=b.length;c++){let u=b[s]&15;s+=1;let p=b[s];s+=1;let m=b[s];s+=1;let C=(b[s]&1)!==0;s+=1,a.touchPositions.push({id:u,x:p,y:m,over:C})}}return a}y(gn,"decodeCompressedInput");var R=require("@utsp/types");var Zt=class Zt{constructor(e,t){h(this,"enabled",!1);h(this,"currentStats",null);h(this,"_userId");h(this,"_userName");this._userId=e,this._userName=t}setEnabled(e){this.enabled=e,e||(this.currentStats=null)}isEnabled(){return this.enabled}get userId(){return this.currentStats?.userId??this._userId}get userName(){return this.currentStats?.userName??this._userName}get tick(){return this.currentStats?.tick??0}get timestamp(){return this.currentStats?.timestamp??0}get displayCount(){return this.currentStats?.displayCount??0}get totalDisplayArea(){return this.currentStats?.totalDisplayArea??0}get totalLayers(){return this.currentStats?.totalLayers??0}get visibleLayers(){return this.currentStats?.visibleLayers??0}get staticLayers(){return this.currentStats?.staticLayers??0}get dynamicLayers(){return this.currentStats?.dynamicLayers??0}get totalOrders(){return this.currentStats?.totalOrders??0}get ordersByLayer(){return this.currentStats?.ordersByLayer??new Map}get staticPacketSize(){return this.currentStats?.staticPacketSize??0}get dynamicPacketSize(){return this.currentStats?.dynamicPacketSize??0}get totalPacketSize(){return this.currentStats?.totalPacketSize??0}get compressedPacketSize(){return Math.round(this.totalPacketSize*.25)}get hasInput(){return this.currentStats?.hasInput??!1}get axisCount(){return this.currentStats?.axisCount??0}get buttonCount(){return this.currentStats?.buttonCount??0}startTick(e){this.enabled&&(this.currentStats={userId:this._userId,userName:this._userName,tick:e,timestamp:Date.now(),displayCount:0,totalDisplayArea:0,totalLayers:0,visibleLayers:0,staticLayers:0,dynamicLayers:0,totalOrders:0,ordersByLayer:new Map,staticPacketSize:0,dynamicPacketSize:0,totalPacketSize:0,hasInput:!1,axisCount:0,buttonCount:0})}recordDisplays(e,t){!this.enabled||!this.currentStats||(this.currentStats.displayCount=e,this.currentStats.totalDisplayArea=t)}recordLayers(e,t,r,n){!this.enabled||!this.currentStats||(this.currentStats.totalLayers=e,this.currentStats.visibleLayers=t,this.currentStats.staticLayers=r,this.currentStats.dynamicLayers=n)}recordLayerOrders(e,t){!this.enabled||!this.currentStats||(this.currentStats.totalOrders+=t,this.currentStats.ordersByLayer.set(e,t))}recordPacketSizes(e,t){!this.enabled||!this.currentStats||(this.currentStats.staticPacketSize=e,this.currentStats.dynamicPacketSize=t,this.currentStats.totalPacketSize=e+t)}recordInput(e,t,r){!this.enabled||!this.currentStats||(this.currentStats.hasInput=e,this.currentStats.axisCount=t,this.currentStats.buttonCount=r)}endTick(){}reset(){this.currentStats=null}};y(Zt,"UserStats");var De=Zt;var Wt=class Wt{constructor(e,t,r){this.id=e;this.name=t;h(this,"displays",[]);h(this,"layers",[]);h(this,"spriteRegistry");h(this,"mode");h(this,"axes",new Map);h(this,"buttons",new Map);h(this,"textInputs",[]);h(this,"mouseX",0);h(this,"mouseY",0);h(this,"mouseOver",!1);h(this,"mouseDisplayId",0);h(this,"touchPositions",new Map);h(this,"activeTouchId",null);h(this,"inputBindings",new Fe);h(this,"stats");h(this,"soundCommands",[]);h(this,"nextSoundInstanceId",1);h(this,"audioConfigCommands",[]);h(this,"lastListenerX",-1);h(this,"lastListenerY",-1);h(this,"pendingSendSounds",!1);h(this,"audioProcessor");h(this,"loadedSounds",new Map);h(this,"soundLoadErrors",new Map);h(this,"playingSounds",new Map);h(this,"mobileVibrationCommands",[]);h(this,"mobileVibrationProcessor");h(this,"gamepadVibrationCommands",[]);h(this,"gamepadVibrationProcessor");h(this,"macroRegistry",new ke);h(this,"macroEngine",new Le);h(this,"macroEventHandlers",new Map);h(this,"postProcessCommands",[]);h(this,"currentPostProcessConfig",null);h(this,"bridgeMessages",[]);h(this,"totalBytesSent",0);h(this,"totalBytesReceived",0);h(this,"bytesSentPerTick",[]);h(this,"bytesReceivedPerTick",[]);h(this,"bytesTickIndex",0);h(this,"bytesTickRate",20);h(this,"currentTickBytesSent",0);h(this,"currentTickBytesReceived",0);h(this,"lastInputTick",-1n);h(this,"availableViewports",new Map);h(this,"displayCommandSink",{setPostProcess:(e,t)=>this.setPostProcess(e,t),setScanlinesEnabled:(e,t)=>this.setScanlinesEnabled(e,t),setScanlinesOpacity:(e,t)=>this.setScanlinesOpacity(e,t),setScanlinesPattern:(e,t)=>this.setScanlinesPattern(e,t),setAmbientEffect:(e,t)=>this.setAmbientEffect(e,t),setAmbientEffectEnabled:(e,t)=>this.setAmbientEffectEnabled(e,t),setAmbientEffectBlur:(e,t)=>this.setAmbientEffectBlur(e,t),setAmbientEffectScale:(e,t)=>this.setAmbientEffectScale(e,t),isAmbientEffectEnabled:()=>this.isAmbientEffectEnabled(),getAmbientEffectConfig:()=>this.getAmbientEffectConfig(),getPostProcessConfig:()=>this.getPostProcessConfig(),setScalingMode:(e,t)=>this.setScalingMode(e,t),getScalingMode:e=>this.getScalingMode(e),setCellSize:(e,t,r)=>this.setCellSize(e,t,r),getCellSize:e=>this.getCellSize(e),setGrid:(e,t)=>this.setGrid(e,t),setGridEnabled:(e,t)=>this.setGridEnabled(e,t),isGridEnabled:e=>this.isGridEnabled(e),getGridConfig:e=>this.getGridConfig(e),switchPalette:(e,t)=>this.switchPalette(e,t),getCurrentPaletteSlotId:e=>this.getCurrentPaletteSlotId(e)});h(this,"data");h(this,"currentScalingModes",new Map);h(this,"currentCellSizes",new Map);h(this,"currentGridConfigs",new Map);h(this,"currentPaletteSlotIds",new Map);this.mode=r,this.stats=new De(e,t),this.data={}}setSpriteRegistry(e){this.spriteRegistry=e;for(let t of this.layers)t.setSpriteRegistry(e);this.macroEngine.setSpriteRegistry(e)}getDisplays(){return this.displays}addDisplay(e){e.setCommandSink(this.displayCommandSink),this.displays.push(e)}removeDisplay(e){let t=this.displays.indexOf(e);return t!==-1?(this.displays.splice(t,1),!0):!1}clearDisplays(){this.displays=[]}setDisplayViewport(e,t,r){this.availableViewports.set(e,{pixelWidth:t,pixelHeight:r})}getDisplayViewport(e){return this.availableViewports.get(e)??null}getAllDisplayViewports(){return this.availableViewports}calculateMaxCells(e,t,r){let n=this.availableViewports.get(e);return n?{cols:Math.floor(n.pixelWidth/t),rows:Math.floor(n.pixelHeight/r)}:null}getLayers(){return this.layers}getLayerById(e){return this.layers.find(t=>t.getId()===e)}addLayer(e,t){e.setMode(this.mode);let r=this.layers.length+1;ue(e,r),this.layers.push(e),this.spriteRegistry&&e.setSpriteRegistry(this.spriteRegistry),t&&this.macroRegistry.setLayerMapping(t,e.getId())}removeLayer(e){let t=this.layers.indexOf(e);return t!==-1?(this.layers.splice(t,1),!0):!1}clearLayers(){this.layers=[]}setMousePosition(e,t,r=!0){this.mouseX=Math.max(0,Math.min(255,e)),this.mouseY=Math.max(0,Math.min(255,t)),this.mouseOver=r}setTouchPosition(e,t,r,n=!0,o=0){if(e<0||e>9){console.warn(`Invalid touchId ${e}, must be 0-9`);return}n?(this.touchPositions.set(e,{x:Math.max(0,Math.min(255,t)),y:Math.max(0,Math.min(255,r)),over:!0,displayId:o}),this.activeTouchId=e):(this.touchPositions.delete(e),this.activeTouchId===e&&(this.activeTouchId=null))}setAxis(e,t){let r=Math.max(-1,Math.min(1,t));this.axes.set(e,r)}getAxis(e){return this.axes.get(e)??0}setButton(e,t){this.buttons.set(e,t)}getButton(e){return this.buttons.get(e)??!1}getButtonJustPressed(e){let t=`${e}_justPressed`;return this.buttons.get(t)??!1}getButtonJustReleased(e){let t=`${e}_justReleased`;return this.buttons.get(t)??!1}setTextInputs(e){this.textInputs=e}getTextInputs(){return this.textInputs}clearTextInputs(){this.textInputs=[]}getAxisNames(){return Array.from(this.axes.keys())}getButtonNames(){return Array.from(this.buttons.keys())}clearAxes(){this.axes.clear()}clearButtons(){this.buttons.clear()}getMouseDisplayInfo(){if(!this.mouseOver||this.displays.length===0)return null;let e=this.displays[0],t=0,r=this.mouseX,n=this.mouseY,o=e.getOrigin(),i=o.x+r,s=o.y+n;return{displayId:t,localX:r,localY:n,worldX:i,worldY:s}}getTouchDisplayInfo(e=0){if(e<0||e>9)return console.warn(`Invalid touchId ${e}, must be 0-9`),null;let t=this.touchPositions.get(e);if(!t||!t.over||this.displays.length===0)return null;let r=this.displays[0],n=t.displayId,o=t.x,i=t.y,s=r.getOrigin(),a=s.x+o,d=s.y+i;return{displayId:n,localX:o,localY:i,worldX:a,worldY:d}}getIsMouseOnADisplay(){return this.mouseOver}getMouseDisplayHover(){let e=this.getMouseDisplayInfo();return e?e.displayId:null}findLayerById(e){return this.layers.find(t=>t.getId()===e)??null}applyUpdate(e){if(this.updateDisplaysFromPacket(e.displays),this.updateLayersFromPacket(e.layers),e.macroOrders&&e.macroOrders.length>0)for(let t of e.macroOrders)this.macroEngine.applyOrder(t)}updateDisplaysFromPacket(e){for(let t of e){let r=this.displays[t.id];if(!r){for(r=new Pe(t.id,t.sizeX,t.sizeY);this.displays.length<=t.id;)this.displays.push(null);this.displays[t.id]=r}r.setCommandSink(this.displayCommandSink),r.setOrigin(new R.Vector2(t.originX,t.originY)),r.setSize(new R.Vector2(t.sizeX,t.sizeY)),r.setRenderPasses(t.renderPasses)}}updateLayersFromPacket(e){for(let t of e){let r=this.findLayerById(t.id);r||(r=new ce(new R.Vector2(t.originX,t.originY),t.zIndex,t.width,t.height,{mustBeReliable:!1,isMacroLayer:t.isMacroLayer,charCodeMode:t.is16bit?"16bit":"8bit"}),ue(r,t.id),r.setMode(this.mode),this.spriteRegistry&&r.setSpriteRegistry(this.spriteRegistry),this.addLayer(r)),t.updateFlags&1&&r.setOrigin(new R.Vector2(t.originX,t.originY)),t.updateFlags&2&&r.setZOrder(t.zIndex),t.updateFlags&4&&r.setOrders(t.orders)}}defineAxisBinding(e,t,r=[],n=-1,o=1,i=0){this.inputBindings.defineAxis(e,t,r,n,o,i)}defineButtonBinding(e,t,r=[],n=!1){this.inputBindings.defineButton(e,t,r,n)}defineAxisBindings(e){e.forEach(({bindingId:t,name:r,sources:n,min:o,max:i,defaultValue:s})=>{this.defineAxisBinding(t,r,n??[],o,i,s)})}defineButtonBindings(e){e.forEach(({bindingId:t,name:r,sources:n,defaultValue:o})=>{this.defineButtonBinding(t,r,n??[],o)})}getInputBindingsLoadPacket(){return this.inputBindings.toLoadPacket()}applyInputBindingsLoadPacket(e){try{let t=JSON.parse(e);if(t.type!=="input-binding")throw new Error(`Invalid packet type: ${t.type}`);this.inputBindings.clear();for(let r of t.axes)this.defineAxisBinding(r.bindingId,r.name,r.sources||[],r.min,r.max,r.defaultValue);for(let r of t.buttons)this.defineButtonBinding(r.bindingId,r.name,r.sources||[],r.defaultValue)}catch(t){throw console.error("[User] Failed to apply input bindings:",t),t}}getInputBindingRegistry(){return this.inputBindings}getStats(){return this.stats}getTotalBytesSent(){return this.totalBytesSent}getTotalBytesReceived(){return this.totalBytesReceived}recordBytesSent(e){this.totalBytesSent+=e,this.currentTickBytesSent+=e}recordBytesReceived(e){this.totalBytesReceived+=e,this.currentTickBytesReceived+=e}resetByteCounters(){this.totalBytesSent=0,this.totalBytesReceived=0}setBytesTickRate(e){e<=0||(this.bytesTickRate=e,this.bytesSentPerTick=new Array(e).fill(0),this.bytesReceivedPerTick=new Array(e).fill(0),this.bytesTickIndex=0)}endTickBytes(){this.bytesSentPerTick.length!==this.bytesTickRate&&(this.bytesSentPerTick=new Array(this.bytesTickRate).fill(0),this.bytesReceivedPerTick=new Array(this.bytesTickRate).fill(0)),this.bytesSentPerTick[this.bytesTickIndex]=this.currentTickBytesSent,this.bytesReceivedPerTick[this.bytesTickIndex]=this.currentTickBytesReceived,this.bytesTickIndex=(this.bytesTickIndex+1)%this.bytesTickRate,this.currentTickBytesSent=0,this.currentTickBytesReceived=0}getBytesSentPerSecond(){return this.bytesSentPerTick.reduce((e,t)=>e+t,0)}getBytesReceivedPerSecond(){return this.bytesReceivedPerTick.reduce((e,t)=>e+t,0)}getAxisBindingId(e){return this.inputBindings.getAxisBindingId(e)}getButtonBindingId(e){return this.inputBindings.getButtonBindingId(e)}decodeAndApplyCompressedInput(e,t="reliable"){let r=gn(e,this.inputBindings);if(t==="volatile"){if(r.tick<=this.lastInputTick)return;this.lastInputTick=r.tick}let n=this.inputBindings.getAllAxes(),o=this.inputBindings.getAllButtons(),i=n.sort((a,d)=>a.bindingId-d.bindingId),s=o.sort((a,d)=>a.bindingId-d.bindingId);for(let[a,d]of r.axes)if(a<i.length){let l=i[a];this.setAxis(l.name,d)}for(let[a,d]of r.buttons)if(a<s.length){let l=s[a],c=this.getButton(l.name);this.setButton(l.name,d);let u=d&&!c,p=!d&&c;this.setButton(`${l.name}_justPressed`,u),this.setButton(`${l.name}_justReleased`,p)}this.mouseX=r.mouseX,this.mouseY=r.mouseY,this.mouseOver=r.mouseOverDisplay,this.mouseDisplayId=r.displayId;for(let a of r.touchPositions)this.setTouchPosition(a.id,a.x,a.y,a.over);for(let a of r.displayViewports)this.setDisplayViewport(a.displayId,a.pixelWidth,a.pixelHeight)}playSound(e,t){let r=this.nextSoundInstanceId++,n={sound:e,instanceId:r,volume:t?.volume,pitch:t?.pitch,loop:t?.loop,fadeIn:t?.fadeIn,x:t?.x,y:t?.y,lowpass:t?.lowpass,highpass:t?.highpass,reverb:t?.reverb};return this.soundCommands.push(n),r}stopSound(e){let t={sound:e};this.soundCommands.push(t)}fadeOutSound(e,t){let r={fadeOut:!0,sound:e,duration:t};this.soundCommands.push(r)}fadeOutAllSounds(e){let t={fadeOut:!0,sound:"all",duration:e};this.soundCommands.push(t)}stopAllSounds(){let e={sound:"all"};this.soundCommands.push(e)}pauseSound(e){let t={pause:!0,sound:e};this.soundCommands.push(t)}pauseAllSounds(){let e={pause:!0,sound:"all"};this.soundCommands.push(e)}resumeSound(e){let t={resume:!0,sound:e};this.soundCommands.push(t)}resumeAllSounds(){let e={resume:!0,sound:"all"};this.soundCommands.push(e)}setSoundEffects(e,t){let r={setEffects:!0,instanceId:e,lowpass:t.lowpass,highpass:t.highpass,reverb:t.reverb};this.soundCommands.push(r)}setListenerPosition(e,t){e===this.lastListenerX&&t===this.lastListenerY||(this.lastListenerX=e,this.lastListenerY=t,this.audioConfigCommands.push({type:"set-listener-position",x:e,y:t}))}configureSpatialAudio(e){this.audioConfigCommands.push({type:"configure-spatial",...e})}flushAudioConfigCommands(){let e=this.audioConfigCommands;return this.audioConfigCommands=[],e}hasAudioConfigCommands(){return this.audioConfigCommands.length>0}flushSoundCommands(){let e=this.soundCommands;return this.soundCommands=[],e}hasSoundCommands(){return this.soundCommands.length>0}sendSounds(){this.pendingSendSounds=!0}needsSendSounds(){return this.pendingSendSounds}clearSendSounds(){this.pendingSendSounds=!1}setAudioProcessor(e){this.audioProcessor=e,this.macroEngine.setAudioCallback(t=>{e.play(t)})}getAudioProcessor(){return this.audioProcessor}applyAudioCommands(e){if(this.audioProcessor&&this.mode!=="server")for(let t of e){if("setEffects"in t&&t.setEffects===!0){let n=t;this.audioProcessor.setEffects(n.instanceId,n.lowpass,n.highpass,n.reverb);continue}if("fadeOut"in t&&t.fadeOut===!0){let n=t;this.audioProcessor.fadeOut(n.sound,n.duration);continue}if("pause"in t&&t.pause===!0){let n=t;this.audioProcessor.pause(n.sound);continue}if("resume"in t&&t.resume===!0){let n=t;this.audioProcessor.resume(n.sound);continue}if("instanceId"in t||"volume"in t||"pitch"in t||"loop"in t||"fadeIn"in t||"x"in t||"y"in t||"lowpass"in t||"highpass"in t||"reverb"in t){let n=t,o=n.x!==void 0&&n.y!==void 0?{x:n.x,y:n.y}:void 0;this.audioProcessor.play(n.sound,{volume:n.volume,pitch:n.pitch,loop:n.loop,fadeIn:n.fadeIn,position:o,instanceId:n.instanceId,lowpass:n.lowpass,highpass:n.highpass,reverb:n.reverb})}else{let n=t;n.sound==="all"?this.audioProcessor.stopAll():this.audioProcessor.stop(n.sound)}}}applyAudioConfigCommands(e){if(this.audioProcessor&&this.mode!=="server")for(let t of e)t.type==="set-listener-position"?this.audioProcessor.setListenerPosition(t.x,t.y):t.type==="configure-spatial"&&this.audioProcessor.configureSpatial({maxDistance:t.maxDistance,referenceDistance:t.referenceDistance,rolloffFactor:t.rolloffFactor,panSpread:t.panSpread})}vibrate(e){let t={pattern:e};this.mobileVibrationCommands.push(t)}cancelVibration(){let e={cancel:!0};this.mobileVibrationCommands.push(e)}vibrateTap(){this.vibrate(10)}vibrateMediumTap(){this.vibrate(25)}vibrateHeavyTap(){this.vibrate(50)}vibrateSuccess(){this.vibrate([30,50,30])}vibrateError(){this.vibrate([50,30,50,30,50])}vibrateWarning(){this.vibrate([100])}vibrateSelection(){this.vibrate(5)}vibrateImpact(e="medium"){let t={light:15,medium:30,heavy:50};this.vibrate(t[e])}vibrateNotification(){this.vibrate([100,100,100,100,100])}vibrateGamepad(e,t){let r={gamepadIndex:e,options:t};this.gamepadVibrationCommands.push(r)}stopGamepadVibration(e="all"){let t={gamepadIndex:e,cancel:!0};this.gamepadVibrationCommands.push(t)}gamepadTap(e=0){this.vibrateGamepad(e,{duration:50,strongMagnitude:.3,weakMagnitude:.5})}gamepadImpact(e=0){this.vibrateGamepad(e,{duration:100,strongMagnitude:.7,weakMagnitude:.3})}gamepadHeavy(e=0){this.vibrateGamepad(e,{duration:200,strongMagnitude:1,weakMagnitude:.2})}gamepadExplosion(e=0){this.vibrateGamepad(e,{duration:400,strongMagnitude:1,weakMagnitude:.8})}gamepadSuccess(e=0){this.vibrateGamepad(e,{duration:150,strongMagnitude:.4,weakMagnitude:.6})}gamepadError(e=0){this.vibrateGamepad(e,{duration:300,strongMagnitude:.8,weakMagnitude:.4})}hasGamepadVibrationCommands(){return this.gamepadVibrationCommands.length>0}flushGamepadVibrationCommands(){let e=this.gamepadVibrationCommands;return this.gamepadVibrationCommands=[],e}setGamepadVibrationProcessor(e){this.gamepadVibrationProcessor=e}applyGamepadVibrationCommands(e){if(this.gamepadVibrationProcessor&&this.mode!=="server"){for(let t of e)if("cancel"in t&&t.cancel===!0)t.gamepadIndex==="all"?this.gamepadVibrationProcessor.stopAllVibrations():this.gamepadVibrationProcessor.stopVibration(t.gamepadIndex);else if("options"in t){let r=t;if(r.gamepadIndex==="all")for(let n=0;n<4;n++)this.gamepadVibrationProcessor.vibrate(n,r.options);else this.gamepadVibrationProcessor.vibrate(r.gamepadIndex,r.options)}}}hasMobileVibrationCommands(){return this.mobileVibrationCommands.length>0}flushMobileVibrationCommands(){let e=this.mobileVibrationCommands;return this.mobileVibrationCommands=[],e}setMobileVibrationProcessor(e){this.mobileVibrationProcessor=e}getMobileVibrationProcessor(){return this.mobileVibrationProcessor}applyMobileVibrationCommands(e){if(this.mobileVibrationProcessor&&this.mode!=="server")for(let t of e)"cancel"in t&&t.cancel===!0?this.mobileVibrationProcessor.cancel():"pattern"in t&&this.mobileVibrationProcessor.vibrate(t.pattern)}applyVibrationOrders(e){if(this.mode==="server")return;let{VibrationOrderType:t}=(tn(),$(en)),{MobileVibrateFlags:r,GamepadVibrateFlags:n}=(Kr(),$(qr));for(let o of e)switch(o.type){case t.MobileVibrate:{if(!this.mobileVibrationProcessor)break;let i=o,s=i.pattern;i.flags&r.HasIntensity&&i.intensity!==void 0&&(s=s.map(a=>Math.round(a*i.intensity))),this.mobileVibrationProcessor.vibrate(s);break}case t.MobileCancel:{if(!this.mobileVibrationProcessor)break;this.mobileVibrationProcessor.cancel();break}case t.GamepadVibrate:{if(!this.gamepadVibrationProcessor)break;let i=o,s={duration:i.duration,strongMagnitude:i.strongMagnitude/255,weakMagnitude:i.weakMagnitude/255,startDelay:i.startDelay};if(i.flags&n.AllGamepads)for(let a=0;a<4;a++)this.gamepadVibrationProcessor.vibrate(a,s);else this.gamepadVibrationProcessor.vibrate(i.gamepadIndex,s);break}case t.GamepadCancel:{if(!this.gamepadVibrationProcessor)break;let i=o;i.flags&n.AllGamepads?this.gamepadVibrationProcessor.stopAllVibrations():this.gamepadVibrationProcessor.stopVibration(i.gamepadIndex);break}}}applyAudioOrders(e){if(!this.audioProcessor||this.mode==="server")return;let{AudioOrderType:t,AudioTargetType:r}=(Wr(),$(Zr)),{PlaySoundFlags:n}=(Xr(),$(Hr));for(let o of e)switch(o.type){case t.PlaySound:case t.PlayGlobalSound:{let i=o,s=i.volume!==void 0?i.volume/255:void 0,a=i.pitch!==void 0?.25*Math.pow(2,i.pitch/64):void 0,d=i.fadeIn!==void 0?i.fadeIn/10:void 0,l=(i.flags&n.Loop)!==0,c=i.posX!==void 0&&i.posY!==void 0?{x:i.posX,y:i.posY}:void 0;this.audioProcessor.play(i.soundId,{volume:s,pitch:a,loop:l,fadeIn:d,position:c,instanceId:i.instanceId,lowpass:i.lowpass,highpass:i.highpass,reverb:i.reverb});break}case t.StopSound:{let i=o;i.targetType===r.All?this.audioProcessor.stopAll():i.targetType===r.InstanceId?this.audioProcessor.stop(i.target):this.audioProcessor.stop(i.target);break}case t.FadeOutSound:{let i=o,s=i.duration/10;i.targetType===r.All?this.audioProcessor.fadeOut("all",s):this.audioProcessor.fadeOut(i.target,s);break}case t.PauseSound:{let i=o;i.targetType===r.All?this.audioProcessor.pause("all"):this.audioProcessor.pause(i.target);break}case t.ResumeSound:{let i=o;i.targetType===r.All?this.audioProcessor.resume("all"):this.audioProcessor.resume(i.target);break}case t.SetListenerPosition:{let i=o;this.audioProcessor.setListenerPosition(i.x,i.y);break}case t.ConfigureSpatial:{let i=o;this.audioProcessor.configureSpatial({maxDistance:i.maxDistance*100,referenceDistance:i.referenceDistance*100,rolloffFactor:i.rolloffFactor/100,panSpread:i.panSpread/255});break}case t.SetSoundEffects:{let i=o;this.audioProcessor.setEffects(i.instanceId,i.lowpass,i.highpass,i.reverb);break}}}handleAudioAck(e){switch(e.type){case"sound-loaded":this.loadedSounds.set(e.soundId,{name:e.name,loadedAt:Date.now()}),this.soundLoadErrors.delete(e.soundId);break;case"sound-error":this.soundLoadErrors.set(e.soundId,{name:e.name,error:e.error,at:Date.now()});break;case"playback-started":this.playingSounds.set(e.instanceId,{soundId:e.soundId,startedAt:Date.now()});break;case"playback-ended":this.playingSounds.delete(e.instanceId);break;case"playback-error":e.instanceId!==void 0&&this.playingSounds.delete(e.instanceId);break}}isSoundLoaded(e){return this.loadedSounds.has(e)}getSoundLoadError(e){return this.soundLoadErrors.get(e)?.error}getLoadedSounds(){return this.loadedSounds}getSoundLoadErrors(){return this.soundLoadErrors}isSoundPlaying(e){return this.playingSounds.has(e)}getPlayingSounds(){return this.playingSounds}getPlayingSoundCount(){return this.playingSounds.size}getAudioLoadingState(e){let t=this.loadedSounds.size,r=this.soundLoadErrors.size,n=e>0&&t>=e,o=Array.from(this.soundLoadErrors.values()).map(i=>i.name);return{loadedCount:t,totalExpected:e,errorCount:r,isComplete:n,errors:o}}loadMacro(e,t){let r={...t,id:e},n=this.macroRegistry.registerMacro(r);return this.mode==="client"&&this.macroEngine.loadTemplate(n,r),n}createInstance(e){return this.updateLayerMappings(),this.macroRegistry.createInstance(e)}updateInstance(e,t){return this.macroRegistry.updateInstance(e,t)}removeInstance(e){return this.macroEventHandlers.delete(e),this.macroRegistry.removeInstance(e)}onMacroEvent(e,t,r){this.macroEventHandlers.has(e)||this.macroEventHandlers.set(e,new Map),this.macroEventHandlers.get(e).set(t,r)}offMacroEvent(e,t){t?this.macroEventHandlers.get(e)?.delete(t):this.macroEventHandlers.delete(e)}handleMacroEvent(e){let t=this.macroRegistry.getInstanceName(e.instanceId);if(!t){console.warn(`MacroEvent: Unknown instance ID ${e.instanceId}`);return}let r=this.macroEventHandlers.get(t);if(!r)return;let n,o;switch(e.type){case 1:n="click",o=void 0;break;case 2:n="change",o=e.value;break;case 3:n="submit",o=e.text;break;case 4:n="select",o=e.index;break;default:return}let i=r.get(n);i&&i(o)}flushMacroOrders(){return this.macroRegistry.flushPendingOrders()}hasPendingMacroOrders(){return this.macroRegistry.hasPendingOrders()}applyMacroOrders(e){for(let t of e)this.macroEngine.applyOrder(t)}getMacroRegistry(){return this.macroRegistry}getMacroLoads(){return this.macroRegistry.toAllMacroLoads()}updateLayerMappings(){for(let e of this.layers){let t=e.getName();t&&this.macroRegistry.setLayerMapping(t,e.getId())}}registerLayerName(e,t){this.macroRegistry.setLayerMapping(e,t.getId())}loadMacroTemplate(e,t){this.macroEngine.loadTemplate(e,t)}updateMacros(){return this.macroEngine.update()}processMacroEvents(e){for(let t of e.events){let r=this.macroRegistry.getInstanceName(t.instanceId);if(!r)continue;let n=this.macroEventHandlers.get(r);if(!n)continue;let o=n.get(t.event);o&&o(t.data)}}updateMacroMouse(e,t,r){let n=this.displays.find(o=>o.getId()===this.mouseDisplayId);if(!n&&this.displays.length>0&&(n=this.displays[0]),n){let o=n.getOrigin(),i=e+o.x,s=t+o.y;this.macroEngine.updateMouse(i,s,r)}else this.macroEngine.updateMouse(e,t,r)}getMacroRenderOrders(){let e=this.macroEngine.getOrdersByLayer(),t=this.displays[0];if(!t)return e;let r=t.getOrigin();if(r.x===0&&r.y===0)return e;let n=new Map;for(let[o,i]of e){let s=i.map(a=>{let d={...a};return"posX"in d&&typeof d.posX=="number"&&(d.posX=d.posX-r.x),"posY"in d&&typeof d.posY=="number"&&(d.posY=d.posY-r.y),d});n.set(o,s)}return n}getMacroEffectOffset(){return this.macroEngine.getEffectOffset()}getMacroEngine(){return this.macroEngine}macroFocusNext(){this.macroEngine.focusNext()}macroFocusPrevious(){this.macroEngine.focusPrevious()}macroActivateFocused(){this.macroEngine.activateFocused()}setPostProcess(e,t){let r=JSON.stringify(t),n=JSON.stringify(this.currentPostProcessConfig);r!==n&&(this.currentPostProcessConfig=t,this.postProcessCommands.push({type:"set-config",displayId:e,config:t??void 0}))}setScanlinesEnabled(e,t){if(t){let r=this.currentPostProcessConfig?.scanlines;this.setPostProcess(e,{scanlines:{enabled:!0,opacity:r?.opacity??R.POST_PROCESS_DEFAULTS.scanlines.opacity,pattern:r?.pattern??R.POST_PROCESS_DEFAULTS.scanlines.pattern,color:r?.color??R.POST_PROCESS_DEFAULTS.scanlines.color}})}else this.setPostProcess(e,{scanlines:{enabled:!1}})}setScanlinesOpacity(e,t){let r=Math.max(0,Math.min(1,t)),n=this.currentPostProcessConfig?.scanlines;this.setPostProcess(e,{scanlines:{enabled:!0,opacity:r,pattern:n?.pattern??"horizontal",color:n?.color??{r:0,g:0,b:0}}})}setScanlinesPattern(e,t){let r=this.currentPostProcessConfig?.scanlines;this.setPostProcess(e,{scanlines:{enabled:r?.enabled??!0,opacity:r?.opacity??R.POST_PROCESS_DEFAULTS.scanlines.opacity,pattern:t,color:r?.color??{r:0,g:0,b:0}}})}setAmbientEffect(e,t){let r=this.currentPostProcessConfig?.ambientEffect;typeof t=="boolean"?this.setPostProcess(e,{...this.currentPostProcessConfig,ambientEffect:{enabled:t,blur:r?.blur??R.POST_PROCESS_DEFAULTS.ambientEffect.blur,scale:r?.scale??R.POST_PROCESS_DEFAULTS.ambientEffect.scale}}):this.setPostProcess(e,{...this.currentPostProcessConfig,ambientEffect:{enabled:!0,blur:t.blur??r?.blur??R.POST_PROCESS_DEFAULTS.ambientEffect.blur,scale:t.scale??r?.scale??R.POST_PROCESS_DEFAULTS.ambientEffect.scale}})}setAmbientEffectEnabled(e,t){this.setAmbientEffect(e,t)}setAmbientEffectBlur(e,t){let r=this.currentPostProcessConfig?.ambientEffect;this.setPostProcess(e,{...this.currentPostProcessConfig,ambientEffect:{enabled:r?.enabled??!0,blur:Math.max(0,t),scale:r?.scale??R.POST_PROCESS_DEFAULTS.ambientEffect.scale}})}setAmbientEffectScale(e,t){let r=this.currentPostProcessConfig?.ambientEffect;this.setPostProcess(e,{...this.currentPostProcessConfig,ambientEffect:{enabled:r?.enabled??!0,blur:r?.blur??R.POST_PROCESS_DEFAULTS.ambientEffect.blur,scale:Math.max(1,t)}})}isAmbientEffectEnabled(){return this.currentPostProcessConfig?.ambientEffect?.enabled??!1}getAmbientEffectConfig(){let e=this.currentPostProcessConfig?.ambientEffect;return e?{enabled:e.enabled,blur:e.blur??R.POST_PROCESS_DEFAULTS.ambientEffect.blur,scale:e.scale??R.POST_PROCESS_DEFAULTS.ambientEffect.scale}:null}getPostProcessConfig(){return this.currentPostProcessConfig}hasPostProcessCommands(){return this.postProcessCommands.length>0}flushPostProcessCommands(){let e=this.postProcessCommands;return this.postProcessCommands=[],e}setScalingMode(e,t){this.currentScalingModes.get(e)!==t&&(this.currentScalingModes.set(e,t),this.postProcessCommands.push({type:"set-scaling-mode",displayId:e,scalingMode:t}))}getScalingMode(e){return this.currentScalingModes.get(e)??null}setCellSize(e,t,r){let n=Math.max(1,Math.min(255,Math.round(t))),o=Math.max(1,Math.min(255,Math.round(r))),i=this.currentCellSizes.get(e);i&&i.width===n&&i.height===o||(this.currentCellSizes.set(e,{width:n,height:o}),this.postProcessCommands.push({type:"set-cell-size",displayId:e,cellWidth:n,cellHeight:o}))}getCellSize(e){let t=this.currentCellSizes.get(e);return{cellWidth:t?.width??8,cellHeight:t?.height??8}}setGrid(e,t){let r;typeof t=="boolean"?r={enabled:t,color:R.GRID_DEFAULTS.color,lineWidth:R.GRID_DEFAULTS.lineWidth}:r={enabled:t.enabled,color:t.color??R.GRID_DEFAULTS.color,lineWidth:t.lineWidth??R.GRID_DEFAULTS.lineWidth},this.currentGridConfigs.set(e,r),this.postProcessCommands.push({type:"set-grid",displayId:e,gridConfig:r})}setGridEnabled(e,t){this.setGrid(e,t)}isGridEnabled(e){return this.currentGridConfigs.get(e)?.enabled??!1}getGridConfig(e){return this.currentGridConfigs.get(e)??null}switchPalette(e,t){if(t<0||t>255)throw new Error(`Palette slot ID must be between 0 and 255, got ${t}`);this.currentPaletteSlotIds.get(e)!==t&&(this.currentPaletteSlotIds.set(e,t),this.postProcessCommands.push({type:"switch-palette",displayId:e,paletteSlotId:t}))}getCurrentPaletteSlotId(e){return this.currentPaletteSlotIds.get(e)??null}sendBridge(e,t){this.bridgeMessages.push({channel:e,data:t})}getBridgeMessages(){let e=this.bridgeMessages;return this.bridgeMessages=[],e}hasBridgeMessages(){return this.bridgeMessages.length>0}getDebugInfo(){let e=Array.from(this.availableViewports.entries()).map(([t,r])=>({displayId:t,pixelWidth:r.pixelWidth,pixelHeight:r.pixelHeight}));return{id:this.id,name:this.name,bytesSentTotal:this.totalBytesSent,bytesSentTick:this.currentTickBytesSent,availableViewports:e,layers:this.layers.map(t=>t.getDebugInfo()),displays:this.displays.map(t=>t.getDebugInfo())}}};y(Wt,"User");var Ve=Wt;var jt=class jt{constructor(){h(this,"enabled",!1);h(this,"currentStats",null)}setEnabled(e){this.enabled=e,e||(this.currentStats=null)}isEnabled(){return this.enabled}get tick(){return this.currentStats?.tick??0}get timestamp(){return this.currentStats?.timestamp??0}get totalOrders(){return this.currentStats?.totalOrders??0}get ordersByLayer(){return this.currentStats?.ordersByLayer??new Map}get ordersByType(){return this.currentStats?.ordersByType??new Map}get totalLayers(){return this.currentStats?.totalLayers??0}get visibleLayers(){return this.currentStats?.visibleLayers??0}get layersPerDisplay(){return this.currentStats?.layersPerDisplay??new Map}get displayCompositeLayerIds(){return this.currentStats?.displayCompositeLayerIds??new Map}get updatePacketSize(){return this.currentStats?.updatePacketSize??0}get displayHeaderSize(){return this.currentStats?.displayHeaderSize??0}get layerHeaderSize(){return this.currentStats?.layerHeaderSize??0}get orderDataSize(){return this.currentStats?.orderDataSize??0}get compressionRatio(){return this.currentStats?.compressionRatio??0}get compressedPacketSize(){return Math.round(this.updatePacketSize*this.compressionRatio)}get totalCells(){return this.currentStats?.totalCells??0}get nonEmptyCells(){return this.currentStats?.nonEmptyCells??0}get cellsWithBackground(){return this.currentStats?.cellsWithBackground??0}get rasterizationTimeMs(){return this.currentStats?.rasterizationTimeMs??0}get encodingTimeMs(){return this.currentStats?.encodingTimeMs??0}get packetSplit(){return this.currentStats?.packetSplit}get layerDetails(){return this.currentStats?.layerDetails}startTick(e){this.enabled&&(this.currentStats={tick:e,timestamp:Date.now(),totalOrders:0,ordersByLayer:new Map,ordersByType:new Map,totalLayers:0,visibleLayers:0,layersPerDisplay:new Map,updatePacketSize:0,displayHeaderSize:0,layerHeaderSize:0,orderDataSize:0,compressionRatio:0,totalCells:0,nonEmptyCells:0,cellsWithBackground:0,rasterizationTimeMs:0,encodingTimeMs:0,displayCompositeLayerIds:new Map})}recordDisplayComposite(e,t){!this.enabled||!this.currentStats||(this.currentStats.displayCompositeLayerIds||(this.currentStats.displayCompositeLayerIds=new Map),this.currentStats.displayCompositeLayerIds.set(e,[...t]))}recordLayerOrders(e,t){if(!(!this.enabled||!this.currentStats)){this.currentStats.totalOrders+=t.length,this.currentStats.ordersByLayer.set(e,t.length);for(let r of t){let n=this.currentStats.ordersByType.get(r.type)||0;this.currentStats.ordersByType.set(r.type,n+1)}}}recordLayers(e,t){!this.enabled||!this.currentStats||(this.currentStats.totalLayers=e,this.currentStats.visibleLayers=t)}recordDisplayLayers(e,t){!this.enabled||!this.currentStats||this.currentStats.layersPerDisplay.set(e,t)}recordUpdatePacketSize(e,t,r,n){!this.enabled||!this.currentStats||(this.currentStats.updatePacketSize=e,this.currentStats.displayHeaderSize=t,this.currentStats.layerHeaderSize=r,this.currentStats.orderDataSize=n,this.currentStats.compressionRatio=.25)}recordPacketSplit(e,t,r,n){!this.enabled||!this.currentStats||(this.currentStats.packetSplit={userId:e,displayCount:t,staticLayerCount:r,dynamicLayerCount:n})}recordLayerInfo(e,t,r,n){!this.enabled||!this.currentStats||(this.currentStats.layerDetails||(this.currentStats.layerDetails=[]),this.currentStats.layerDetails.push({layerId:e,mustBeReliable:t,orderCount:r,updateFlags:n}))}recordRenderStats(e,t,r){!this.enabled||!this.currentStats||(this.currentStats.totalCells=e,this.currentStats.nonEmptyCells=t,this.currentStats.cellsWithBackground=r)}recordRasterizationTime(e){!this.enabled||!this.currentStats||(this.currentStats.rasterizationTimeMs=e)}recordEncodingTime(e){!this.enabled||!this.currentStats||(this.currentStats.encodingTimeMs=e)}endTick(){}reset(){this.currentStats=null}};y(jt,"CoreStats");var _e=jt;function Fn(b){return Math.sqrt(b)*16}y(Fn,"getAtlasColumns");function Dn(b){return b*256-1}y(Dn,"getMaxCharCode");var Jt=class Jt{constructor(e,t){this.fontId=e;this.config=t;h(this,"atlasColumns");h(this,"maxCharCode");h(this,"blocks",new Map);this.atlasColumns=Fn(t.atlasBlocks),this.maxCharCode=Dn(t.atlasBlocks)}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}getAtlasDimensions(){return{width:this.atlasColumns*this.config.glyphWidth,height:this.atlasColumns*this.config.glyphHeight}}getCharUV(e){if(e<0||e>this.maxCharCode)return null;let t=e%this.atlasColumns,r=Math.floor(e/this.atlasColumns),n=t/this.atlasColumns,o=r/this.atlasColumns,i=(t+1)/this.atlasColumns,s=(r+1)/this.atlasColumns;return{u1:n,v1:o,u2:i,v2:s}}isValidCharCode(e){return e>=0&&e<=this.maxCharCode}};y(Jt,"ImageFont");var Se=Jt;var qt=class qt{constructor(){h(this,"fonts",new Map);h(this,"nameToId",new Map);h(this,"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),n={glyphWidth:t.glyphWidth,glyphHeight:t.glyphHeight,cellWidth:t.cellWidth,cellHeight:t.cellHeight,atlasBlocks:t.atlasBlocks??1},o=new Se(r,n);return this.fonts.set(r,o),this.nameToId.set(e,r),r}addBlock(e,t,r){let n=this.fonts.get(e);if(!n)throw new Error(`ImageFont with ID ${e} not found`);n.addBlock(t,r)}loadFont(e,t){if(this.fonts.has(e))throw new Error(`ImageFont with ID ${e} already exists`);let r=new Se(e,t);this.fonts.set(e,r),e>=this.nextId&&(this.nextId=e+1)}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)}getFontName(e){for(let[t,r]of this.nameToId.entries())if(r===e)return t}hasFont(e){return this.fonts.has(e)}hasFontByName(e){return this.nameToId.has(e)}unloadFont(e){if(!this.fonts.get(e))return!1;for(let[r,n]of this.nameToId.entries())if(n===e){this.nameToId.delete(r);break}return this.fonts.delete(e)}unloadFontByName(e){let t=this.nameToId.get(e);return t===void 0?!1:(this.nameToId.delete(e),this.fonts.delete(t))}clearFonts(){this.fonts.clear(),this.nameToId.clear(),this.nextId=0}getFontIds(){return Array.from(this.fonts.keys()).sort((e,t)=>e-t)}getFontNames(){return Array.from(this.nameToId.keys())}getAllFonts(){return Array.from(this.fonts.entries()).sort((e,t)=>e[0]-t[0]).map(e=>e[1])}getFontCount(){return this.fonts.size}};y(qt,"ImageFontRegistry");var Ne=qt;var Kt=class Kt{constructor(){h(this,"sounds",new Map);h(this,"nameToId",new Map);h(this,"nextId",0)}registerFile(e,t,r){let n=this.allocateId(e),o={soundId:n,name:e,loadType:"file",format:t,data:r};return this.sounds.set(n,o),this.nameToId.set(e,n),n}registerFileWithId(e,t,r,n){this.validateId(e),this.checkIdAvailable(e,t);let o={soundId:e,name:t,loadType:"file",format:r,data:n};this.sounds.set(e,o),this.nameToId.set(t,e)}registerExternal(e,t,r,n,o){let i=this.allocateId(e),s={soundId:i,name:e,loadType:"external",format:t,url:r,size:n,checksum:o};return this.sounds.set(i,s),this.nameToId.set(e,i),i}registerExternalWithId(e,t,r,n,o,i){this.validateId(e),this.checkIdAvailable(e,t);let s={soundId:e,name:t,loadType:"external",format:r,url:n,size:o,checksum:i};this.sounds.set(e,s),this.nameToId.set(t,e)}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}getAll(){return Array.from(this.sounds.values())}getFileSounds(){return this.getAll().filter(e=>e.loadType==="file")}getExternalSounds(){return this.getAll().filter(e=>e.loadType==="external")}getNames(){return Array.from(this.nameToId.keys())}getId(e){return this.nameToId.get(e)}toLoadPackets(){let e=[],t=this.sounds.size,r=this.getFileSounds();if(r.length>0){let o=r.map(i=>({soundId:i.soundId,name:i.name,format:i.format,data:i.data}));e.push({type:"sound",mode:"file",sounds:o,totalSounds:t})}let n=this.getExternalSounds();if(n.length>0){let o=n.map(i=>({soundId:i.soundId,name:i.name,format:i.format,url:i.url,size:i.size,checksum:i.checksum}));e.push({type:"sound",mode:"external",sounds:o,totalSounds:t})}return e}toLoadPacket(e){let t=this.get(e);return t?t.loadType==="file"?{type:"sound",mode:"file",sounds:[{soundId:t.soundId,name:t.name,format:t.format,data:t.data}]}:{type:"sound",mode:"external",sounds:[{soundId:t.soundId,name:t.name,format:t.format,url:t.url,size:t.size,checksum:t.checksum}]}:null}unregister(e){let t=this.get(e);return t?(this.sounds.delete(t.soundId),this.nameToId.delete(t.name),!0):!1}clear(){this.sounds.clear(),this.nameToId.clear(),this.nextId=0}get size(){return this.sounds.size}getStats(){let e=this.getAll(),t=e.filter(n=>n.loadType==="file"),r=t.reduce((n,o)=>n+(o.data?.length??0),0);return{total:e.length,file:t.length,external:e.length-t.length,totalFileSize:r}}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++}validateId(e){if(!Number.isInteger(e)||e<0||e>255)throw new Error(`Invalid sound ID: ${e}. Must be an integer between 0 and 255.`)}checkIdAvailable(e,t){if(this.sounds.has(e)){let r=this.sounds.get(e);throw new Error(`Sound ID ${e} is already used by "${r.name}". Cannot register "${t}".`)}if(this.nameToId.has(t))throw new Error(`Sound with name "${t}" already exists`)}};y(Kt,"SoundRegistry");var Ye=Kt;var Qt=class Qt{constructor(e){this.soundRegistry=e}collectFromUser(e){let t=[],r=e.flushSoundCommands();for(let o of r){let i=this.convertSoundCommand(o);i&&t.push(i)}let n=e.flushAudioConfigCommands();for(let o of n){let i=this.convertConfigCommand(o);i&&t.push(i)}return t}convertSoundCommand(e){return"setEffects"in e&&e.setEffects===!0?this.convertSetEffectsCommand(e):"fadeOut"in e&&e.fadeOut===!0?this.convertFadeOutCommand(e):"pause"in e&&e.pause===!0?this.convertPauseCommand(e):"resume"in e&&e.resume===!0?this.convertResumeCommand(e):"instanceId"in e||"volume"in e||"pitch"in e||"loop"in e||"fadeIn"in e||"x"in e||"y"in e||"lowpass"in e||"highpass"in e||"reverb"in e?this.convertPlayCommand(e):this.convertStopCommand(e)}convertPlayCommand(e){let t=this.resolveSoundId(e.sound);if(t===null)return console.warn(`[AudioOrderCollector] Unknown sound: ${e.sound}`),null;let r=0;e.loop&&(r|=1),e.volume!==void 0&&(r|=2),e.pitch!==void 0&&(r|=4),e.fadeIn!==void 0&&(r|=8),e.lowpass!==void 0&&e.lowpass>0&&(r|=32),e.highpass!==void 0&&e.highpass>0&&(r|=64),e.reverb!==void 0&&e.reverb>0&&(r|=128);let n=e.x!==void 0&&e.y!==void 0;return n&&(r|=16),n?{type:1,soundId:t,instanceId:e.instanceId??0,flags:r,volume:e.volume!==void 0?this.encodeVolume(e.volume):void 0,pitch:e.pitch!==void 0?this.encodePitch(e.pitch):void 0,fadeIn:e.fadeIn!==void 0?this.encodeFadeTime(e.fadeIn):void 0,posX:this.encodePosition(e.x),posY:this.encodePosition(e.y),lowpass:e.lowpass!==void 0&&e.lowpass>0?this.encodeFilterFreq(e.lowpass):void 0,highpass:e.highpass!==void 0&&e.highpass>0?this.encodeFilterFreq(e.highpass):void 0,reverb:e.reverb!==void 0&&e.reverb>0?this.encodeReverb(e.reverb):void 0}:{type:2,soundId:t,instanceId:e.instanceId??0,flags:r&-17,volume:e.volume!==void 0?this.encodeVolume(e.volume):void 0,pitch:e.pitch!==void 0?this.encodePitch(e.pitch):void 0,fadeIn:e.fadeIn!==void 0?this.encodeFadeTime(e.fadeIn):void 0,lowpass:e.lowpass!==void 0&&e.lowpass>0?this.encodeFilterFreq(e.lowpass):void 0,highpass:e.highpass!==void 0&&e.highpass>0?this.encodeFilterFreq(e.highpass):void 0,reverb:e.reverb!==void 0&&e.reverb>0?this.encodeReverb(e.reverb):void 0}}convertStopCommand(e){let{targetType:t,target:r}=this.resolveTarget(e.sound);return{type:3,targetType:t,target:r}}convertFadeOutCommand(e){let{targetType:t,target:r}=this.resolveTarget(e.sound);return{type:4,targetType:t,duration:this.encodeFadeTime(e.duration),target:r}}convertPauseCommand(e){let{targetType:t,target:r}=this.resolveTarget(e.sound);return{type:5,targetType:t,target:r}}convertResumeCommand(e){let{targetType:t,target:r}=this.resolveTarget(e.sound);return{type:6,targetType:t,target:r}}convertSetEffectsCommand(e){let t=0;return e.lowpass!==void 0&&(t|=1),e.highpass!==void 0&&(t|=2),e.reverb!==void 0&&(t|=4),{type:9,instanceId:e.instanceId,flags:t,lowpass:e.lowpass!==void 0?this.encodeFilterFreq(e.lowpass):void 0,highpass:e.highpass!==void 0?this.encodeFilterFreq(e.highpass):void 0,reverb:e.reverb!==void 0?this.encodeReverb(e.reverb):void 0}}convertConfigCommand(e){return e.type==="set-listener-position"?{type:7,x:this.encodePosition(e.x),y:this.encodePosition(e.y)}:e.type==="configure-spatial"?{type:8,maxDistance:this.encodeDistance(e.maxDistance??1e3),referenceDistance:this.encodeDistance(e.referenceDistance??100),rolloffFactor:this.encodeRolloff(e.rolloffFactor??1),panSpread:this.encodePanSpread(e.panSpread??.5)}:null}resolveSoundId(e){if(typeof e=="number")return e>=0&&e<=255?e:null;let t=this.soundRegistry.getId(e);return t!==void 0?t:null}resolveTarget(e){if(e==="all")return{targetType:2,target:void 0};if(typeof e=="number")return{targetType:0,target:e};let t=this.soundRegistry.getId(e);return t!==void 0?{targetType:1,target:t}:(console.warn(`[AudioOrderCollector] Unknown sound name: ${e}, treating as 'all'`),{targetType:2,target:void 0})}encodeVolume(e){return Math.round(Math.max(0,Math.min(1,e))*255)}encodePitch(e){let t=Math.max(.25,Math.min(4,e)),r=64*Math.log2(t/.25);return Math.round(Math.max(0,Math.min(255,r)))}encodeFadeTime(e){return Math.round(Math.max(0,Math.min(25.5,e))*10)}encodeDistance(e){return Math.round(Math.max(0,Math.min(25500,e))/100)}encodeRolloff(e){return Math.round(Math.max(0,Math.min(2.55,e))*100)}encodePanSpread(e){return Math.round(Math.max(0,Math.min(1,e))*255)}encodePosition(e){return Math.round(Math.max(0,Math.min(65535,e)))}encodeFilterFreq(e){return e<=0?0:Math.round(Math.max(1,Math.min(255,e/100)))}encodeReverb(e){return Math.round(Math.max(0,Math.min(1,e))*255)}};y(Qt,"AudioOrderCollector");var He=Qt;var er=class er{collectFromUser(e){let t=[];if(e.hasMobileVibrationCommands()){let r=e.flushMobileVibrationCommands();for(let n of r){let o=this.convertMobileCommand(n);o&&t.push(o)}}if(e.hasGamepadVibrationCommands()){let r=e.flushGamepadVibrationCommands();for(let n of r){let o=this.convertGamepadCommand(n);o&&t.push(o)}}return t}convertMobileCommand(e){return"cancel"in e&&e.cancel===!0?this.convertMobileCancelCommand():"pattern"in e?this.convertMobileVibrateCommand(e):null}convertMobileVibrateCommand(e){let t=0;e.intensity!==void 0&&e.intensity!==1&&(t|=1);let r=e.pattern,n=Array.isArray(r)?[...r]:[r],o={type:1,flags:t,pattern:n.map(i=>Math.round(i))};return t&1&&(o.intensity=Math.round(Math.min(1,Math.max(0,e.intensity))*255)/255),o}convertMobileCancelCommand(){return{type:2}}convertGamepadCommand(e){if("cancel"in e&&e.cancel===!0){let t=e.gamepadIndex??"all";return this.convertGamepadCancelCommand({gamepadIndex:t})}if("options"in e&&e.options){let t=e.gamepadIndex??0;return this.convertGamepadVibrateCommand({gamepadIndex:t,options:e.options})}return null}convertGamepadVibrateCommand(e){let{gamepadIndex:t,options:r}=e,n=0;r.startDelay!==void 0&&r.startDelay>0&&(n|=1);let o=t==="all"?255:t;t==="all"&&(n|=2);let i={type:16,flags:n,gamepadIndex:o,duration:Math.round(r.duration),strongMagnitude:Math.round(Math.min(1,Math.max(0,r.strongMagnitude??1))*255),weakMagnitude:Math.round(Math.min(1,Math.max(0,r.weakMagnitude??.5))*255)};return r.startDelay!==void 0&&r.startDelay>0&&(i.startDelay=Math.round(r.startDelay)),i}convertGamepadCancelCommand(e){let{gamepadIndex:t}=e,r=0,n=t==="all"?255:t;return t==="all"&&(r|=2),{type:17,flags:r,gamepadIndex:n}}};y(er,"VibrationOrderCollector");var Xe=er;var F=require("@utsp/types");var tr=class tr{collectFromUser(e){let t=e.flushPostProcessCommands();return this.convertCommands(t)}convertCommands(e){let t=[];for(let r of e){let n=this.convertCommand(r);n&&t.push(n)}return t}convertCommand(e){let t=e.displayId;switch(e.type){case"set-config":return this.convertSetConfig(e);case"set-scanlines-enabled":return this.createSetScanlinesOrder(t,e.enabled??!1,e.opacity);case"set-scanlines-opacity":return this.createSetScanlinesOrder(t,!0,e.opacity??F.POST_PROCESS_DEFAULTS.scanlines.opacity);case"set-ambient-effect-enabled":return this.createSetAmbientEffectOrder(t,e.enabled??!1);case"set-ambient-effect-blur":return this.createSetAmbientEffectOrder(t,!0,e.blur);case"set-ambient-effect-scale":return this.createSetAmbientEffectOrder(t,!0,void 0,e.scale);case"set-scaling-mode":return this.createSetScalingModeOrder(t,e.scalingMode);case"set-grid":return this.createSetGridOrder(t,e.gridConfig);case"switch-palette":return this.createSwitchPaletteOrder(t,e.paletteSlotId);case"set-cell-size":return this.createSetCellSizeOrder(t,e.cellWidth,e.cellHeight);default:return console.warn(`[PostProcessOrderCollector] Unknown command type: ${e.type}`),null}}convertSetConfig(e){let t=e.displayId;if(!e.config)return{type:1,displayId:t,flags:3,scanlines:{enabled:!1,opacity:0,pattern:0,colorR:0,colorG:0,colorB:0},ambientEffect:{enabled:!1,blur:0,scale:1,opacity:0}};let r=0,n={type:1,displayId:t,flags:0};if(e.config.scanlines){r|=1;let o=e.config.scanlines;n.scanlines={enabled:o.enabled,opacity:o.opacity??F.POST_PROCESS_DEFAULTS.scanlines.opacity,pattern:this.patternToType(o.pattern??"horizontal"),colorR:o.color?.r??0,colorG:o.color?.g??0,colorB:o.color?.b??0}}if(e.config.ambientEffect){r|=2;let o=e.config.ambientEffect;n.ambientEffect={enabled:o.enabled,blur:o.blur??F.POST_PROCESS_DEFAULTS.ambientEffect.blur,scale:o.scale??F.POST_PROCESS_DEFAULTS.ambientEffect.scale,opacity:o.opacity??F.POST_PROCESS_DEFAULTS.ambientEffect.opacity}}return n.flags=r,n}createSetScanlinesOrder(e,t,r){return{type:2,displayId:e,enabled:t,opacity:r??F.POST_PROCESS_DEFAULTS.scanlines.opacity,pattern:0,colorR:0,colorG:0,colorB:0}}createSetAmbientEffectOrder(e,t,r,n){return{type:3,displayId:e,enabled:t,blur:r??F.POST_PROCESS_DEFAULTS.ambientEffect.blur,scale:n??F.POST_PROCESS_DEFAULTS.ambientEffect.scale,opacity:F.POST_PROCESS_DEFAULTS.ambientEffect.opacity}}patternToType(e){switch(e){case"horizontal":return 0;case"vertical":return 1;case"grid":return 2;default:return 0}}createSetScalingModeOrder(e,t){return{type:4,displayId:e,mode:(0,F.scalingModeToValue)(t)}}createSetGridOrder(e,t){let{r,g:n,b:o,a:i}=this.parseColor(t.color??F.GRID_DEFAULTS.color);return{type:5,displayId:e,enabled:t.enabled,colorR:r,colorG:n,colorB:o,colorA:i,lineWidth:t.lineWidth??F.GRID_DEFAULTS.lineWidth}}createSwitchPaletteOrder(e,t){return{type:6,displayId:e,slotId:t}}createSetCellSizeOrder(e,t,r){return{type:7,displayId:e,cellWidth:t,cellHeight:r}}parseColor(e){let t=e.match(/rgba?\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(?:,\s*([\d.]+))?\s*\)/);if(t)return{r:parseInt(t[1],10),g:parseInt(t[2],10),b:parseInt(t[3],10),a:t[4]?Math.round(parseFloat(t[4])*255):255};let r=e.match(/^#([0-9a-fA-F]{6}|[0-9a-fA-F]{3})$/);if(r){let n=r[1];return n.length===3?{r:parseInt(n[0]+n[0],16),g:parseInt(n[1]+n[1],16),b:parseInt(n[2]+n[2],16),a:255}:{r:parseInt(n.slice(0,2),16),g:parseInt(n.slice(2,4),16),b:parseInt(n.slice(4,6),16),a:255}}return{r:144,g:24,b:24,a:255}}};y(tr,"PostProcessOrderCollector");var Ge=tr;var me=class me{constructor(e={}){h(this,"_inputReliability","reliable");h(this,"mode");h(this,"maxUsers");h(this,"strictMode",!1);h(this,"currentTick",0);h(this,"stats",new _e);h(this,"spriteRegistry",new le);h(this,"imageFontRegistry",new Ne);h(this,"soundRegistry",new Ye);h(this,"audioOrderCollector",new He(this.soundRegistry));h(this,"vibrationOrderCollector",new Xe);h(this,"postProcessOrderCollector",new Ge);h(this,"encoder",new K);h(this,"users",new Map);h(this,"colorPalette",new Map);h(this,"paletteSlots",new Map);h(this,"displayRasterizer",new de(this));h(this,"_renderCallCount",0);h(this,"onPaletteChangedCallback");h(this,"onFontAllocatedCallback");h(this,"onFontBlockAddedCallback");h(this,"onImageFontChangedCallback");this.mode=e.mode??"standalone",this.maxUsers=e.maxUsers??(this.mode==="client"?1:100),this.initializeDefaultPalette(),this.loadFont(8,8,1,8,8)}initializeDefaultPalette(){[{r:0,g:0,b:0},{r:170,g:0,b:0},{r:0,g:170,b:0},{r:170,g:85,b:0},{r:0,g:0,b:170},{r:170,g:0,b:170},{r:0,g:170,b:170},{r:170,g:170,b:170},{r:85,g:85,b:85},{r:255,g:85,b:85},{r:85,g:255,b:85},{r:255,g:255,b:85},{r:85,g:85,b:255},{r:255,g:85,b:255},{r:85,g:255,b:255},{r:255,g:255,b:255}].forEach((t,r)=>this.colorPalette.set(r,{...t,a:255,e:0})),me.ANSI_VGA_COLORS.forEach(t=>this.colorPalette.set(t.colorId,t)),this.colorPalette.set(255,{r:0,g:0,b:0,a:0,e:0})}isServer(){return this.mode==="server"}isClient(){return this.mode==="client"}isStandalone(){return this.mode==="standalone"}setInputReliability(e){this._inputReliability=e}getInputReliability(){return this._inputReliability}createUser(e,t){if(this.users.has(e))throw new Error(`User with ID ${e} already exists`);if(this.mode==="server"&&this.users.size>=this.maxUsers)throw new Error(`Maximum number of users reached (${this.maxUsers}). Cannot create user ${e}`);if(this.mode==="client"&&this.users.size>=1)throw new Error(`Client mode only allows one user. Cannot create user ${e}`);let r=new Ve(e,t,this.mode);return r.setSpriteRegistry(this.spriteRegistry),this.users.set(e,r),r}getUser(e){return this.users.get(e)??null}getUsers(){return Array.from(this.users.values())}hasUser(e){return this.users.has(e)}removeUser(e){return this.users.delete(e)}getUserCount(){return this.users.size}clearAllUsers(){this.users.clear()}setColor(e,t,r,n,o=255,i=0){if(e<0||e>255)throw new Error(`Color ID must be between 0 and 255, got ${e}`);if(e>=240)throw new Error("Color IDs 240-255 are reserved (240-254: UI palette, 255: skip color). Use IDs 0-239 for custom colors.");if(t<0||t>255||r<0||r>255||n<0||n>255||o<0||o>255||i<0||i>255)throw new Error("Color components must be between 0 and 255");this.colorPalette.set(e,{r:t,g:r,b:n,a:o,e:i}),this.onPaletteChangedCallback&&this.onPaletteChangedCallback(this.colorPalette)}onPaletteChanged(e){this.onPaletteChangedCallback=e}getColor(e){return this.colorPalette.get(e)??null}getPalette(){return new Map(this.colorPalette)}resetPalette(){this.colorPalette.clear(),this.initializeDefaultPalette(),this.onPaletteChangedCallback&&this.onPaletteChangedCallback(this.colorPalette)}loadPaletteToSlot(e,t){if(e<0||e>255)throw new Error(`Palette slot ID must be between 0 and 255, got ${e}`);let r=new Map;for(let n of t)n.colorId<0||n.colorId>255||r.set(n.colorId,{r:n.r,g:n.g,b:n.b,a:n.a,e:n.e??0});me.ANSI_VGA_COLORS.forEach(n=>{r.set(n.colorId,{r:n.r,g:n.g,b:n.b,a:n.a,e:n.e})}),r.set(255,{r:0,g:0,b:0,a:0,e:0}),this.paletteSlots.set(e,r)}getPaletteFromSlot(e){return this.paletteSlots.get(e)??null}hasPaletteSlot(e){return this.paletteSlots.has(e)}clearPaletteSlot(e){this.paletteSlots.delete(e)}clearAllPaletteSlots(){this.paletteSlots.clear()}getColorCSS(e){let t=this.getColor(e);if(!t)return null;let r=t.a/255;return`rgba(${t.r}, ${t.g}, ${t.b}, ${r})`}getUserIds(){return Array.from(this.users.keys())}forEachUser(e){this.users.forEach(e)}filterUsers(e){return this.getUsers().filter(e)}findUser(e){return this.getUsers().find(e)}getCurrentTick(){return this.currentTick}getStats(){return this.stats}endTick(){this.stats.isEnabled()&&this.stats.startTick(this.currentTick);let e=new Map,t=0,r=0;return this.users.forEach((n,o)=>{let i=n.getLayers(),s=n.getDisplays();t+=i.length,n.getStats().isEnabled()&&n.getStats().startTick(this.currentTick);let a=s.map(S=>{let x=S.getOrigin(),I=S.getSize();return{id:S.getId(),originX:x.x,originY:x.y,sizeX:I.x,sizeY:I.y,renderPasses:S.getRenderPasses()}});s.forEach(S=>S.resetChangeTracking());let d=[],l=[];i.forEach((S,x)=>{if(!S.getNeedsCommit())return;let I=S.getOrigin(),v=S.getOrders(),w=S.getMustBeReliable(),A=S.calculateUpdateFlags();S.resetChangeTracking(),S.resetCommit(),S.getId()===0&&ue(S,x);let E={id:S.getId(),updateFlags:A,zIndex:S.getZOrder(),originX:I.x,originY:I.y,width:S.getWidth(),height:S.getHeight(),isMacroLayer:S.getIsMacroLayer(),is16bit:S.getCharCodeMode()==="16bit",orderCount:v.length,orders:v};v.length>0&&this.stats.isEnabled()&&this.stats.recordLayerInfo(S.getId(),w,v.length,A),w?d.push(E):l.push(E)}),r+=d.length+l.length;let c=this.audioOrderCollector.collectFromUser(n),u=this.vibrationOrderCollector.collectFromUser(n),p=this.postProcessOrderCollector.collectFromUser(n),m=n.flushMacroOrders(),g=null,C=null;if(this.stats.isEnabled()&&this.stats.recordPacketSplit(o,a.length,d.length,l.length),(d.length>0||c.length>0||m.length>0)&&(g=this.encoder.encode({tick:this.currentTick,displayCount:a.length,displays:a,layerCount:d.length,layers:d,audioOrderCount:c.length,audioOrders:c,vibrationOrderCount:0,vibrationOrders:[],macroOrderCount:m.length,macroOrders:m,postProcessOrderCount:0,postProcessOrders:[]})),C=this.encoder.encode({tick:this.currentTick,displayCount:a.length,displays:a,layerCount:l.length,layers:l,audioOrderCount:0,audioOrders:[],vibrationOrderCount:u.length,vibrationOrders:u,macroOrderCount:0,macroOrders:[],postProcessOrderCount:p.length,postProcessOrders:p}),e.set(o,{static:g,dynamic:C}),n.getStats().isEnabled()){let S=s.reduce((w,A)=>{let E=A.getSize();return w+E.x*E.y},0);n.getStats().recordDisplays(s.length,S),n.getStats().recordLayers(i.length,d.length+l.length,d.length,l.length),[...d,...l].forEach(w=>{n.getStats().recordLayerOrders(w.id,w.orders.length)});let x=g?.length||0,I=C?.length||0;n.getStats().recordPacketSizes(x,I);let v=n.getInputBindingRegistry();n.getStats().recordInput(!1,v.getAxisCount(),v.getButtonCount()),n.getStats().endTick()}if(n.endTickBytes(),this.stats.isEnabled()){let S=[...d,...l];S.forEach((A,E)=>{this.stats.recordLayerOrders(E,A.orders)}),s.forEach((A,E)=>{this.stats.recordDisplayLayers(E,S.length)});let x=(g?.length||0)+(C?.length||0),I=a.reduce((A,E)=>{let U=Math.min(E.renderPasses?.length??0,4);return A+8+U*4},0),v=S.length*20,w=x-I-v;this.stats.recordUpdatePacketSize(x,I,v,w>0?w:0)}}),this.stats.isEnabled()&&(this.stats.recordLayers(t,r),this.stats.endTick()),this.currentTick++,e}getSnapshot(e){let t=this.getUser(e);if(!t)return null;let r=t.getDisplays(),n=t.getLayers(),o=r.map((s,a)=>{let d=s.getOrigin(),l=s.getSize();return{id:a,originX:d.x,originY:d.y,sizeX:l.x,sizeY:l.y,renderPasses:s.getRenderPasses()}}),i=n.map((s,a)=>{let d=s.getOrigin(),l=s.getOrders(),c=7;return s.getId()===0&&ue(s,a),{id:s.getId(),updateFlags:c,zIndex:s.getZOrder(),originX:d.x,originY:d.y,width:s.getWidth(),height:s.getHeight(),isMacroLayer:s.getIsMacroLayer(),is16bit:s.getCharCodeMode()==="16bit",orderCount:l.length,orders:l}});return this.encoder.encode({tick:this.currentTick,displayCount:o.length,displays:o,layerCount:i.length,layers:i,audioOrderCount:0,audioOrders:[],vibrationOrderCount:0,vibrationOrders:[],macroOrderCount:0,macroOrders:[],postProcessOrderCount:0,postProcessOrders:[]})}resetTick(){this.currentTick=0}applyUpdatePacket(e,t){let r=this.getUser(e);if(!r){if(this.strictMode)throw new Error(`Cannot apply update packet: user ${e} does not exist`);return!1}return r.applyUpdate(t),t.audioOrders&&t.audioOrders.length>0&&r.applyAudioOrders(t.audioOrders),t.vibrationOrders&&t.vibrationOrders.length>0&&r.applyVibrationOrders(t.vibrationOrders),!0}applyUpdatePacketBuffer(e,t){let{UpdatePacketDecoder:r}=(Mt(),$(dn)),o=new r().decode(t);return this.applyUpdatePacket(e,o)?o:null}applyLoadPacket(e){try{let n=new ie().decode(e).load;switch(n.loadType){case 1:n.slotId!==void 0?this.loadPaletteToSlot(n.slotId,n.colors):(console.warn("[Core] ColorPalette load without slotId is deprecated. Loading into slot 0."),this.loadPaletteToSlot(0,n.colors));break;case 2:this.spriteRegistry.loadUnicolorSprites(n);break;case 3:this.spriteRegistry.loadMulticolorSprites(n);break;case 5:console.warn("[Core] Sound loading not yet implemented");break;case 8:this.loadFont(n.glyphWidth,n.glyphHeight,n.atlasBlocks,n.cellWidth,n.cellHeight);break;case 9:this.loadFontBlock(n.blockIndex,n.imageData);break;case 7:{for(let o of this.users.values())o.loadMacroTemplate(n.macroId,n.template);break}default:return console.error(`[Core] Unknown LoadType: ${n.loadType}`),!1}return!0}catch(t){return console.error("[Core] Failed to apply LoadPacket:",t),!1}}generatePaletteSlotLoadPacket(e){let t=this.getPaletteFromSlot(e);if(!t||t.size===0)return null;let r=new Y,n=[];return t.forEach((o,i)=>{i!==255&&n.push({colorId:i,r:o.r,g:o.g,b:o.b,a:o.a,e:o.e})}),r.encode({loadType:1,slotId:e,colors:n})}generateAllPaletteSlotLoadPackets(){let e=[];return this.paletteSlots.forEach((t,r)=>{let n=this.generatePaletteSlotLoadPacket(r);n&&e.push(n)}),e}generateUnicolorSpritesLoadPacket(){let e=this.getSpriteRegistry(),t=[];for(let n=0;n<=255;n++){let o=e.getUnicolorSprite(n);if(o){let i=[];for(let s=0;s<o.sizeX*o.sizeY;s++)i.push(o.data.get(s));t.push({spriteId:o.id,sizeX:o.sizeX,sizeY:o.sizeY,data:i})}}return t.length===0?null:new Y().encode({loadType:2,sprites:t})}generateMulticolorSpritesLoadPacket(){let e=this.getSpriteRegistry(),t=[];for(let n=0;n<=255;n++){let o=e.getMulticolorSprite(n);if(o){let i=[];for(let s=0;s<o.sizeX*o.sizeY;s++){let a=o.data.get(s);i.push({charCode:a.charCode,fgColorId:a.fgColorCode,bgColorId:a.bgColorCode})}t.push({spriteId:o.id,sizeX:o.sizeX,sizeY:o.sizeY,data:i})}}return t.length===0?null:new Y().encode({loadType:3,sprites:t})}generateAllLoadPackets(){let e=[],t=this.generateAllPaletteSlotLoadPackets();e.push(...t);let r=this.generateUnicolorSpritesLoadPacket();r&&e.push(r);let n=this.generateMulticolorSpritesLoadPacket();return n&&e.push(n),e}generateMacroLoadPackets(e){let t=this.getUser(e);if(!t)return[];let r=t.getMacroLoads();if(r.length===0)return[];let n=new Q;return r.map(o=>n.encode(o))}generateInitialUpdatePacket(e){let t=this.getUser(e);if(!t||!t.hasPostProcessCommands())return null;let r=this.postProcessOrderCollector.collectFromUser(t);if(r.length===0)return null;let o=t.getDisplays().map(s=>{let a=s.getSize();return{id:s.getId(),originX:0,originY:0,sizeX:a.x,sizeY:a.y}});return this.encoder.encode({tick:0,displayCount:o.length,displays:o,layerCount:0,layers:[],audioOrderCount:0,audioOrders:[],vibrationOrderCount:0,vibrationOrders:[],macroOrderCount:0,macroOrders:[],postProcessOrderCount:r.length,postProcessOrders:r})}applyInputBindingsLoadPacket(e,t){let r=this.getUser(e);if(!r){if(this.strictMode)throw new Error(`Cannot apply input bindings: user ${e} does not exist`);return!1}try{return r.applyInputBindingsLoadPacket(t),!0}catch(n){return console.error(`[Core] Failed to apply input bindings for user ${e}:`,n),!1}}getRenderState(e,t){let r=this.getUser(e);if(!r)return null;let n=r.getDisplays(),o=t?r.getLayers().filter(t):r.getLayers(),i=performance.now(),s=[];for(let d of n){if(!d)continue;let l=d.getOrigin(),c=d.getSize();if(s.push(this.displayRasterizer.rasterize({id:d.getId(),x:l.x,y:l.y,width:c.x,height:c.y},o,d.getRenderPasses())),this.stats.isEnabled()){let u=d.getId();this.stats.recordDisplayComposite(u,this.displayRasterizer.getLastVisibleLayerIds())}}let a=performance.now()-i;return this._renderCallCount||(this._renderCallCount=0),this._renderCallCount++,{userId:r.id,userName:r.name,tick:this.currentTick,displays:s}}getAllRenderStates(){let e=new Map;return this.users.forEach((t,r)=>{let n=this.getRenderState(r);n&&e.set(r,n)}),e}enableStats(e){this.stats.setEnabled(e)}getStatsInstance(){return this.stats}resetStats(){this.stats.reset()}loadUnicolorSprites(e){this.spriteRegistry.loadUnicolorSprites(e)}loadMulticolorSprites(e){this.spriteRegistry.loadMulticolorSprites(e)}loadFont(e,t,r,n,o){let i={glyphWidth:e,glyphHeight:t,cellWidth:n,cellHeight:o,atlasBlocks:r};this.imageFontRegistry.hasFont(0)&&this.imageFontRegistry.unloadFont(0),this.imageFontRegistry.loadFont(0,i),this.onFontAllocatedCallback&&this.onFontAllocatedCallback()}loadFontBlock(e,t){if(typeof t=="string")return this.readResource(t).then(r=>{this.imageFontRegistry.addBlock(0,e,r),this.onFontBlockAddedCallback&&this.onFontBlockAddedCallback(e),e===0&&this.onImageFontChangedCallback&&this.onImageFontChangedCallback(0)});this.imageFontRegistry.addBlock(0,e,t),this.onFontBlockAddedCallback&&this.onFontBlockAddedCallback(e),e===0&&this.onImageFontChangedCallback&&this.onImageFontChangedCallback(0)}unloadUnicolorSprite(e){return this.spriteRegistry.unloadUnicolorSprite(e)}unloadMulticolorSprite(e){return this.spriteRegistry.unloadMulticolorSprite(e)}clearUnicolorSprites(){this.spriteRegistry.clearUnicolorSprites()}clearMulticolorSprites(){this.spriteRegistry.clearMulticolorSprites()}clearAllSprites(){this.spriteRegistry.clearAll()}getUnicolorSpriteCount(){return this.spriteRegistry.getUnicolorSpriteCount()}getMulticolorSpriteCount(){return this.spriteRegistry.getMulticolorSpriteCount()}getTotalSpriteCount(){return this.spriteRegistry.getTotalSpriteCount()}hasUnicolorSprite(e){return this.spriteRegistry.hasUnicolorSprite(e)}hasMulticolorSprite(e){return this.spriteRegistry.hasMulticolorSprite(e)}getSpriteRegistry(){return this.spriteRegistry}getSoundRegistry(){return this.soundRegistry}async loadSound(e,t){let r=this.detectSoundFormat(t),n=await this.readResource(t);return this.soundRegistry.registerFile(e,r,n)}async loadSounds(e){let t={},n=Object.entries(e).map(async([o,i])=>{let s=await this.loadSound(o,i);t[o]=s});return await Promise.all(n),t}detectSoundFormat(e){let t=e.split(".").pop()?.toLowerCase()??"",r={mp3:"mp3",wav:"wav",ogg:"ogg",webm:"webm",aac:"aac",m4a:"aac"},n=r[t];if(!n)throw new Error(`Unsupported audio format: .${t}. Supported: ${Object.keys(r).join(", ")}`);return n}async readResource(e){let t=globalThis,r=typeof t.window<"u"||typeof t.document<"u",n=typeof t.fetch=="function",o=/^https?:\/\//i.test(e),i=e.startsWith("file:");if(r)try{let p=await fetch(e);if(!p.ok)throw new Error(`HTTP ${p.status}: ${p.statusText}`);let m=await p.arrayBuffer();return new Uint8Array(m)}catch(p){let m=p instanceof Error?p.message:String(p);throw new Error(`Failed to load resource "${e}": ${m}`)}if((o||i)&&n)try{let p=await fetch(e);if(!p.ok)throw new Error(`HTTP ${p.status}: ${p.statusText}`);let m=await p.arrayBuffer();return new Uint8Array(m)}catch(p){let m=p instanceof Error?p.message:String(p);throw new Error(`Failed to load resource "${e}": ${m}`)}let s=typeof require<"u"?require:null;if(!s)throw new Error("Node.js require is not available");let a="fs",d=s("path"),l=s(a),c=d.resolve(e),u=l.readFileSync(c);return new Uint8Array(u)}registerSound(e,t,r){return this.soundRegistry.registerFile(e,t,r)}registerExternalSound(e,t,r,n){return this.soundRegistry.registerExternal(e,t,r,n)}hasSound(e){return this.soundRegistry.has(e)}generateSoundLoadPackets(){return this.soundRegistry.toLoadPackets()}async loadImageFont(e,t,r){let n=await this.loadImageData(t),o=this.imageFontRegistry.registerFont(e,r);return this.imageFontRegistry.addBlock(0,0,n),this.onFontAllocatedCallback&&this.onFontAllocatedCallback(),this.onFontBlockAddedCallback&&this.onFontBlockAddedCallback(0),this.onImageFontChangedCallback&&this.onImageFontChangedCallback(0),o}async loadImageFonts(e){let t={},n=Object.entries(e).map(async([o,{path:i,options:s}])=>{let a=await this.loadImageFont(o,i,s);t[o]=a});return await Promise.all(n),t}async loadImageData(e){let t=globalThis;if(typeof t.document<"u"||typeof t.window<"u"||typeof t.fetch=="function")try{let n=await fetch(e);if(!n.ok)throw new Error(`HTTP ${n.status}: ${n.statusText}`);let o=await n.arrayBuffer();return new Uint8Array(o)}catch(n){let o=n instanceof Error?n.message:String(n);throw new Error(`Failed to load image font "${e}": ${o}`)}else{let n=typeof require<"u"?require:null;if(!n)throw new Error("Node.js require is not available");let s=n("fs").readFileSync(e);return new Uint8Array(s)}}getImageFontId(e){return this.imageFontRegistry.getFontId(e)}getImageFontByName(e){return this.imageFontRegistry.getFontByName(e)??null}onFontAllocated(e){this.onFontAllocatedCallback=e}onFontBlockAdded(e){this.onFontBlockAddedCallback=e}onImageFontChanged(e){this.onImageFontChangedCallback=e}getImageFontRegistry(){return this.imageFontRegistry}loadImageFontById(e,t){this.imageFontRegistry.loadFont(e,t),this.onImageFontChangedCallback&&this.onImageFontChangedCallback(e)}getImageFont(e){return this.imageFontRegistry.getFont(e)??null}hasImageFont(e){return this.imageFontRegistry.hasFont(e)}hasImageFontByName(e){return this.imageFontRegistry.hasFontByName(e)}unloadImageFont(e){return this.imageFontRegistry.unloadFont(e)}unloadImageFontByName(e){return this.imageFontRegistry.unloadFontByName(e)}clearImageFonts(){this.imageFontRegistry.clearFonts()}getImageFontCount(){return this.imageFontRegistry.getFontCount()}getImageFontIds(){return this.imageFontRegistry.getFontIds()}getImageFontNames(){return this.imageFontRegistry.getFontNames()}};y(me,"Core"),h(me,"ANSI_VGA_COLORS",[{colorId:240,r:0,g:0,b:0,a:255,e:0},{colorId:241,r:170,g:0,b:0,a:255,e:0},{colorId:242,r:0,g:170,b:0,a:255,e:0},{colorId:243,r:170,g:85,b:0,a:255,e:0},{colorId:244,r:0,g:0,b:170,a:255,e:0},{colorId:245,r:170,g:0,b:170,a:255,e:0},{colorId:246,r:0,g:170,b:170,a:255,e:0},{colorId:247,r:170,g:170,b:170,a:255,e:0},{colorId:248,r:85,g:85,b:85,a:255,e:0},{colorId:249,r:255,g:85,b:85,a:255,e:0},{colorId:250,r:85,g:255,b:85,a:255,e:0},{colorId:251,r:255,g:255,b:85,a:255,e:0},{colorId:252,r:85,g:85,b:255,a:255,e:0},{colorId:253,r:255,g:85,b:255,a:255,e:0},{colorId:254,r:85,g:255,b:255,a:255,e:0}]);var $e=me;var yn=require("@utsp/types");
|
package/dist/benchmark.d.ts
CHANGED
|
@@ -4850,6 +4850,7 @@ declare class User<TData = Record<string, any>> {
|
|
|
4850
4850
|
private bytesTickRate;
|
|
4851
4851
|
private currentTickBytesSent;
|
|
4852
4852
|
private currentTickBytesReceived;
|
|
4853
|
+
private lastInputTick;
|
|
4853
4854
|
private availableViewports;
|
|
4854
4855
|
/**
|
|
4855
4856
|
* Display command sink (used by Display to enqueue network commands)
|
|
@@ -5736,7 +5737,7 @@ declare class User<TData = Record<string, any>> {
|
|
|
5736
5737
|
* });
|
|
5737
5738
|
* ```
|
|
5738
5739
|
*/
|
|
5739
|
-
decodeAndApplyCompressedInput(buffer: Uint8Array): void;
|
|
5740
|
+
decodeAndApplyCompressedInput(buffer: Uint8Array, reliability?: 'reliable' | 'volatile'): void;
|
|
5740
5741
|
/**
|
|
5741
5742
|
* Play a sound for this user
|
|
5742
5743
|
*
|