@m2c2kit/addons 0.3.25 → 0.3.26

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/index.js CHANGED
@@ -3453,7 +3453,7 @@ M2c2KitHelpers.registerM2NodeClass(
3453
3453
  CountdownTimer
3454
3454
  );
3455
3455
 
3456
- console.log("\u26AA @m2c2kit/addons version 0.3.25 (8bba62e1)");
3456
+ console.log("\u26AA @m2c2kit/addons version 0.3.26 (1ed4ac2a)");
3457
3457
 
3458
3458
  export { Button, CountdownScene, CountdownTimer, Dialog, DialogResult, DrawPad, DrawPadEventType, DrawPadItemEventType, Grid, Instructions, LocalePicker, VirtualKeyboard };
3459
3459
  //# sourceMappingURL=index.js.map
package/dist/index.min.js CHANGED
@@ -1 +1 @@
1
- import{M2c2KitHelpers as f,Composite as x,WebColors as c,Shape as p,EventStoreMode as F,Equal as g,Label as v,CanvasKitHelpers as at,M2EventType as u,Timer as P,MutablePath as ht,Easings as $,Story as lt,Transition as M,TransitionDirection as V,LabelHorizontalAlignmentMode as dt,Scene as q,Dimensions as ct,Sprite as B,Action as S}from"@m2c2kit/core";class O extends x{constructor(t){if(super(t),this.compositeType="Grid",this._rows=0,this._columns=0,this._gridBackgroundColor=[0,0,255,.25],this._gridLineColor=c.Red,this._gridLineWidth=1,this._gridChildren=new Array,this.cellContainers=new Array,t.size)this.size=t.size;else throw new Error("grid size must be specified");if(t.rows)if(t.rows>=1)this.rows=t.rows;else throw new Error("grid rows must be at least 1");else throw new Error("grid rows must be specified");if(t.columns)if(t.columns>=1)this.columns=t.columns;else throw new Error("grid columns must be at least 1");else throw new Error("grid columns must be specified");t.backgroundColor&&(this.gridBackgroundColor=t.backgroundColor),t.gridLineColor&&(this.gridLineColor=t.gridLineColor),t.gridLineWidth&&(this.gridLineWidth=t.gridLineWidth),this.cellWidth=this.size.width/this.columns,this.cellHeight=this.size.height/this.rows,this.saveNodeNewEvent()}get completeNodeOptions(){return{...this.options,...this.getNodeOptions(),...this.getDrawableOptions(),rows:this.rows,columns:this.columns,size:this.size,backgroundColor:this.gridBackgroundColor,gridLineWidth:this.gridLineWidth,gridLineColor:this.gridLineColor}}initialize(){this.descendants.forEach(t=>{t.parent===this?super.removeChild(t):t.parent?.removeChild(t)}),this.gridBackground=new p({name:"__"+this.name+"-gridRectangle",rect:{size:this.size},fillColor:this.gridBackgroundColor,strokeColor:this.gridLineColor,lineWidth:this.gridLineWidth,isUserInteractionEnabled:this.isUserInteractionEnabled,suppressEvents:!0}),super.addChild(this.gridBackground),this.gridBackground.isUserInteractionEnabled=this.isUserInteractionEnabled;for(let t=1;t<this.columns;t++){const e=new p({name:"__"+this.name+"-gridVerticalLine-"+(t-1),rect:{size:{width:this.gridLineWidth,height:this.size.height},origin:{x:-this.size.width/2+this.cellWidth*t,y:0}},fillColor:this.gridLineColor,suppressEvents:!0});this.gridBackground.addChild(e)}for(let t=1;t<this.rows;t++){const e=new p({name:"__"+this.name+"-gridHorizontalLine-"+(t-1),rect:{size:{width:this.size.width,height:this.gridLineWidth},origin:{x:0,y:-this.size.height/2+this.cellHeight*t}},fillColor:this.gridLineColor,suppressEvents:!0});this.gridBackground.addChild(e)}this.cellContainers=new Array(this.rows).fill([]).map(()=>new Array(this.columns));for(let t=0;t<this.rows;t++)for(let e=0;e<this.columns;e++){const i=new p({name:"__"+this.name+"-gridCellContainer-"+t+"-"+e,rect:{size:{width:this.cellWidth,height:this.cellHeight},origin:{x:-this.size.width/2+this.cellWidth*e+this.cellWidth/2,y:-this.size.height/2+this.cellHeight*t+this.cellHeight/2}},fillColor:c.Transparent,lineWidth:0,suppressEvents:!0});this.gridBackground.addChild(i),this.cellContainers[t][e]=i}this.gridChildren.length>0&&this.gridChildren.forEach(t=>{if(!this.cellWidth||!this.cellHeight||!this.gridBackground)throw new Error("cellWidth, cellHeight, or gridBackground undefined or null");if(this.game.eventStore.mode===F.Replay){const e=[...this.game.nodes,...this.game.materializedNodes].find(i=>i.uuid===t.node);if(!e)throw new Error("grid: child node not found");e?.parent?.removeChild(e),this.cellContainers[t.row][t.column].addChild(e)}else t.node.parent?.removeChild(t.node),this.cellContainers[t.row][t.column].addChild(t.node)}),this.needsInitialization=!1}get gridBackground(){if(!this._gridBackground)throw new Error("gridBackground is null or undefined");return this._gridBackground}set gridBackground(t){this._gridBackground=t}get rows(){return this._rows}set rows(t){g.value(this._rows,t)||(this._rows=t,this.needsInitialization=!0)}get columns(){return this._columns}set columns(t){g.value(this._columns,t)||(this._columns=t,this.needsInitialization=!0)}get gridBackgroundColor(){return this._gridBackgroundColor}set gridBackgroundColor(t){g.value(this._gridBackgroundColor,t)||(this._gridBackgroundColor=t,this.needsInitialization=!0)}get gridLineWidth(){return this._gridLineWidth}set gridLineWidth(t){g.value(this._gridLineWidth,t)||(this._gridLineWidth=t,this.needsInitialization=!0)}get gridLineColor(){return this._gridLineColor}set gridLineColor(t){g.value(this._gridLineColor,t)||(this._gridLineColor=t,this.needsInitialization=!0)}dispose(){}duplicate(t){const e=new O({...this.getNodeOptions(),...this.getDrawableOptions(),rows:this.rows,columns:this.columns,size:this.size,backgroundColor:this.gridBackgroundColor,gridLineWidth:this.gridLineWidth,gridLineColor:this.gridLineColor,name:t});return this.children.length>0&&(e.children=this.children.map(i=>{const n=i.duplicate();return n.parent=e,n})),e}update(){super.update()}draw(t){super.drawChildren(t)}warmup(t){this.initialize(),this.children.filter(e=>e.isDrawable).forEach(e=>{e.warmup(t)})}get gridChildren(){return this._gridChildren}set gridChildren(t){this._gridChildren=t,this.needsInitialization=!0,this.savePropertyChangeEvent("gridChildren",this.gridChildren.map(e=>({node:e.node.uuid,row:e.row,column:e.column})))}removeAllGridChildren(){if(this.gridChildren.length!==0){for(;this.gridChildren.length;)this.gridChildren=this.gridChildren.slice(0,-1);this.needsInitialization=!0}}addAtCell(t,e,i){(e<0||e>=this.rows||i<0||i>=this.columns)&&console.warn(`warning: addAtCell() requested to add node at row ${e}, column ${i}. This is outside the bounds of grid ${this.name}, which is size ${this.rows}x${this.columns}. Note that addAtCell() uses zero-based indexing. AddAtCell() will proceed, but may draw nodes outside the grid`),this.gridChildren=[...this.gridChildren,{node:t,row:e,column:i}],this.needsInitialization=!0}removeAllAtCell(t,e){this.gridChildren=this.gridChildren.filter(i=>i.row!==t&&i.column!==e),this.needsInitialization=!0}removeGridChild(t){this.gridChildren=this.gridChildren.filter(e=>e.node!=t),this.needsInitialization=!0}addChild(t){console.warn("Grid.addChild() was called -- did you mean to call addAtCell() instead?"),super.addChild(t)}removeAllChildren(){console.warn("Grid.removeAllChildren() was called -- did you mean to call removeAllGridChildren() instead?"),super.removeAllChildren()}removeChild(t){console.warn("Grid.removeChild() was called -- did you mean to call removeGridChild() instead?"),super.removeChild(t)}removeChildren(t){console.warn("Grid.removeChildren() was called -- did you mean to call removeGridChild() instead?"),super.removeChildren(t)}}f.registerM2NodeClass(O);class z extends x{constructor(t){super(t),this.compositeType="Button",this.isText=!0,this._backgroundColor=c.Black,this._cornerRadius=9,this._fontSize=20,this._text="",this._fontColor=c.White,this._interpolation={},this._localize=!0,t.text&&(this.text=t.text),t.size?this.size=t.size:this.size={width:200,height:50},t.cornerRadius!==void 0&&(this.cornerRadius=t.cornerRadius),t.fontName&&(this.fontName=t.fontName),t.fontNames&&(this.fontNames=t.fontNames),t.fontSize!==void 0&&(this.fontSize=t.fontSize),t.fontColor&&(this.fontColor=t.fontColor),t.backgroundColor&&(this.backgroundColor=t.backgroundColor),t.interpolation&&(this.interpolation=t.interpolation),t.localize!==void 0&&(this.localize=t.localize),this.saveNodeNewEvent()}get completeNodeOptions(){return{...this.options,...this.getNodeOptions(),...this.getDrawableOptions(),...this.getTextOptions(),size:this.size,cornerRadius:this.cornerRadius,backgroundColor:this.backgroundColor,fontNames:this.fontNames}}initialize(){this.removeAllChildren(),this.backgroundPaint=new this.canvasKit.Paint,this.backgroundPaint.setColor(this.canvasKit.Color(this.backgroundColor[0],this.backgroundColor[1],this.backgroundColor[2],this.backgroundColor[3])),this.backgroundPaint.setStyle(this.canvasKit.PaintStyle.Fill);const t=new p({name:"__"+this.name+"-buttonRectangle",rect:{size:this.size},cornerRadius:this.cornerRadius,fillColor:this._backgroundColor,suppressEvents:!0});this.addChild(t);const e=new v({name:"__"+this.name+"-buttonLabel",text:this.text,localize:this.localize,interpolation:this.interpolation,fontName:this.fontName,fontNames:this.fontNames,fontSize:this.fontSize,fontColor:this.fontColor,suppressEvents:!0});t.addChild(e),this.needsInitialization=!1}dispose(){at.Dispose([this.backgroundPaint])}get text(){return this._text}set text(t){g.value(this._text,t)||(this._text=t,this.needsInitialization=!0,this.savePropertyChangeEvent("text",t))}get backgroundColor(){return this._backgroundColor}set backgroundColor(t){g.value(this._backgroundColor,t)||(this._backgroundColor=t,this.needsInitialization=!0,this.savePropertyChangeEvent("backgroundColor",t))}get fontColor(){return this._fontColor}set fontColor(t){g.value(this._fontColor,t)||(this._fontColor=t,this.needsInitialization=!0,this.savePropertyChangeEvent("fontColor",t))}get fontName(){return this._fontName}set fontName(t){this._fontName!==t&&(this._fontName=t,this.needsInitialization=!0,this.savePropertyChangeEvent("fontName",t))}get fontNames(){return this._fontNames}set fontNames(t){g.value(this._fontNames,t)||(this._fontNames=t,this.needsInitialization=!0,this.savePropertyChangeEvent("fontNames",t))}get cornerRadius(){return this._cornerRadius}set cornerRadius(t){g.value(this._cornerRadius,t)||(this._cornerRadius=t,this.needsInitialization=!0,this.savePropertyChangeEvent("cornerRadius",t))}get fontSize(){return this._fontSize}set fontSize(t){g.value(this._fontSize,t)||(this._fontSize=t,this.needsInitialization=!0,this.savePropertyChangeEvent("fontSize",t))}get interpolation(){return this._interpolation}set interpolation(t){g.value(this._interpolation,t)||(this._interpolation=t,Object.freeze(this._interpolation),this.needsInitialization=!0,this.savePropertyChangeEvent("interpolation",t))}get localize(){return this._localize}set localize(t){g.value(this._localize,t)||(this._localize=t,this.needsInitialization=!0,this.savePropertyChangeEvent("localize",t))}duplicate(t){const e=new z({...this.getNodeOptions(),...this.getDrawableOptions(),...this.getTextOptions(),size:this.size,cornerRadius:this.cornerRadius,backgroundColor:this.backgroundColor,fontColor:this.fontColor,name:t,localize:this.localize,interpolation:JSON.parse(JSON.stringify(this.interpolation)),fontName:this.fontName,fontNames:JSON.parse(JSON.stringify(this.fontNames))});return this.children.length>0&&(e.children=this.children.map(i=>{const n=i.duplicate();return n.parent=e,n})),e}update(){super.update()}draw(t){super.drawChildren(t)}warmup(t){this.initialize(),this.children.filter(e=>e.isDrawable).forEach(e=>{e.warmup(t)})}}f.registerM2NodeClass(z);var J=(b=>(b.Dismiss="Dismiss",b.Positive="Positive",b.Negative="Negative",b))(J||{});class ut extends x{constructor(t){super(t),this.compositeType="Dialog",this._backgroundColor=c.White,this.cornerRadius=9,this.overlayAlpha=.5,this.contentText="",this.positiveButtonText="",this.negativeButtonText="",this._fontColor=c.White,this.zPosition=Number.MAX_VALUE,this.hidden=!0,t&&(t.overlayAlpha&&(this.overlayAlpha=t.overlayAlpha),t.messageText&&(this.contentText=t.messageText),t.positiveButtonText&&(this.positiveButtonText=t.positiveButtonText),t.negativeButtonText&&(this.negativeButtonText=t.negativeButtonText),t.size&&(this.size=t.size),t.cornerRadius&&(this.cornerRadius=t.cornerRadius),t.fontColor&&(this.fontColor=t.fontColor),t.backgroundColor&&(this.backgroundColor=t.backgroundColor))}show(){this.hidden=!1}onDialogResult(t,e){const i={type:u.Composite,compositeType:"DialogResult",nodeUuid:this.uuid,callback:t};e?.replaceExisting&&(this.eventListeners=this.eventListeners.filter(n=>!(n.nodeUuid===i.nodeUuid&&n.type===i.type))),this.eventListeners.push(i)}initialize(){this.removeAllChildren();const t=new p({rect:{width:m2c2Globals.canvasCssWidth,height:m2c2Globals.canvasCssHeight,x:m2c2Globals.canvasCssWidth/2,y:m2c2Globals.canvasCssHeight/2},fillColor:[0,0,0,this.overlayAlpha],zPosition:-1,isUserInteractionEnabled:!0});t.onTapDown(o=>{o.handled=!0,this.hidden=!0,this.eventListeners.length>0&&this.eventListeners.filter(s=>s.type===u.Composite).forEach(s=>{const a={type:u.Composite,target:this,handled:!1,dialogResult:"Dismiss",timestamp:P.now(),iso8601Timestamp:new Date().toISOString()};s.callback(a)})}),this.addChild(t);const e=new p({rect:{width:300,height:150,x:m2c2Globals.canvasCssWidth/2,y:m2c2Globals.canvasCssHeight/2},cornerRadius:this.cornerRadius,fillColor:this.backgroundColor,isUserInteractionEnabled:!0});e.onTapDown(o=>{o.handled=!0}),this.addChild(e);const i=new v({text:this.contentText,fontSize:24,position:{x:200,y:360}});this.addChild(i);const n=new z({text:this.negativeButtonText,position:{x:120,y:440},size:{width:100,height:40},isUserInteractionEnabled:!0,zPosition:1});n.onTapDown(o=>{o.handled=!0,this.hidden=!0}),n.onTapDown(o=>{o.handled=!0,this.hidden=!0,this.eventListeners.length>0&&this.eventListeners.filter(s=>s.type===u.Composite).forEach(s=>{const a={type:u.Composite,target:this,handled:!1,dialogResult:"Negative",timestamp:P.now(),iso8601Timestamp:new Date().toISOString()};s.callback(a)})});const r=new z({text:this.positiveButtonText,position:{x:280,y:440},size:{width:100,height:40},isUserInteractionEnabled:!0,zPosition:1});r.onTapDown(o=>{o.handled=!0,this.hidden=!0,this.eventListeners.length>0&&this.eventListeners.filter(s=>s.type===u.Composite).forEach(s=>{const a={type:u.Composite,target:this,handled:!1,dialogResult:"Positive",timestamp:P.now(),iso8601Timestamp:new Date().toISOString()};s.callback(a)})}),this.addChild(n),this.addChild(r),this.needsInitialization=!1}get backgroundColor(){return this._backgroundColor}set backgroundColor(t){this._backgroundColor=t,this.needsInitialization=!0}get fontColor(){return this._fontColor}set fontColor(t){this._fontColor=t,this.needsInitialization=!0}get hidden(){return this._hidden}set hidden(t){this._hidden=t,this.needsInitialization=!0}duplicate(t){throw new Error(`duplicate not implemented. ${t}`)}update(){super.update()}draw(t){super.drawChildren(t)}warmup(t){this.initialize(),this.children.filter(e=>e.isDrawable).forEach(e=>{e.warmup(t)})}}const y={StrokeStart:"StrokeStart",StrokeMove:"StrokeMove",StrokeEnd:"StrokeEnd"},I={StrokeEnter:"StrokeEnter",StrokeLeave:"StrokeLeave"};class j extends x{constructor(t){if(super(t),this.compositeType="DrawPad",this.resumeDrawingOnReturn=!1,this.continuousDrawingOnly=!1,this._backgroundColor=[0,0,0,0],this._borderColor=c.Black,this._borderWidth=1,this._lineColor=c.Red,this._lineWidth=1,this.isDrawingPointerDown=!1,this.pointerIsDownAndPointerLeftDrawAreaWhenDown=!1,this.currentStrokesNotAllowed=!1,this.strokes=new Array,this.originalOptions=JSON.parse(JSON.stringify(t)),t.isUserInteractionEnabled===void 0&&(this.isUserInteractionEnabled=!0),!t.size)throw new Error("DrawPad size must be specified");this.size=t.size,t.lineColor&&(this.lineColor=t.lineColor),t.lineWidth&&(this.lineWidth=t.lineWidth),t.backgroundColor&&(this.backgroundColor=t.backgroundColor),t.borderColor&&(this.borderColor=t.borderColor),t.borderWidth&&(this.borderWidth=t.borderWidth),t.resumeDrawingOnReturn!==void 0&&(this.resumeDrawingOnReturn=t.resumeDrawingOnReturn),t.continuousDrawingOnly!==void 0&&(this.continuousDrawingOnly=t.continuousDrawingOnly),t.continuousDrawingOnlyExceptionDistance!==void 0&&(this.continuousDrawingOnlyExceptionDistance=t.continuousDrawingOnlyExceptionDistance),this.saveNodeNewEvent()}get completeNodeOptions(){return{...this.options,...this.getNodeOptions(),...this.getDrawableOptions(),...this.originalOptions}}initialize(){this.initializeDrawShape(),this.initializeDrawArea(),this.needsInitialization=!1}initializeDrawShape(){if(!this.drawShape){const t=new ht;this.drawShape=new p({path:t,size:this.size}),this.addChild(this.drawShape)}this.drawShape.strokeColor=this.lineColor,this.drawShape.lineWidth=this.lineWidth}initializeDrawArea(){this.drawArea||(this.drawArea=new p({rect:{size:this.size},isUserInteractionEnabled:!0,suppressEvents:!0}),this.addChild(this.drawArea),this.drawArea.onTapDown(t=>{this.handleTapDown(t)}),this.drawArea.onPointerMove(t=>{this.handlePointerMove(t)}),this.drawArea.onTapUpAny(()=>{this.handleTapUpAny()}),this.drawArea.onTapLeave(t=>{this.handleTapLeave(t)})),this.drawArea.fillColor=this.backgroundColor,this.drawArea.strokeColor=this.borderColor,this.drawArea.lineWidth=this.borderWidth}dist(t,e){return Math.sqrt(Math.pow(e.x-t.x,2)+Math.pow(e.y-t.y,2))}handleTapDown(t){if(this.isUserInteractionEnabled){if(!this.drawShape?.path)throw new Error("DrawPad.handleTapDown(): no drawShape.path");const e=this.drawShape.path;if(this.continuousDrawingOnly&&e.subpaths.length!==0){const n=e.subpaths[e.subpaths.length-1][e.subpaths[e.subpaths.length-1].length-1],r=t.point;if(this.continuousDrawingOnlyExceptionDistance===void 0||this.dist(n,r)>this.continuousDrawingOnlyExceptionDistance){this.currentStrokesNotAllowed=!0;return}}this.currentStrokesNotAllowed=!1,this.isDrawingPointerDown=!0,e.move(t.point);const i={type:y.StrokeStart,target:this,handled:!1,position:t.point,...f.createTimestamps()};this.strokes.push([{type:y.StrokeStart,position:t.point,iso8601Timestamp:new Date().toISOString(),interpolated:!1}]),this.raiseDrawPadEvent(i)}}addInterpolatedStrokeMove(t){const e=this.strokes.length,i=this.strokes[e-1].length,n=this.strokes[this.strokes.length-1][i-1].position,r=this.interpolateToDrawPadBorder(t,n,this.size);if(!this.drawShape?.path)throw new Error("DrawPad.addInterpolatedStrokeMove(): no drawShape.path");this.drawShape.path.addLine(r);const s={type:y.StrokeMove,target:this,handled:!1,position:r,...f.createTimestamps()};return this.strokes[e-1].push({type:y.StrokeMove,position:r,iso8601Timestamp:new Date().toISOString(),interpolated:!0}),this.raiseDrawPadEvent(s),r}handleTapLeave(t){if(this.currentStrokesNotAllowed){this.isDrawingPointerDown=!1;return}if(this.resumeDrawingOnReturn===!1){this.isDrawingPointerDown=!1;const e=this.strokes.length,i=this.strokes[e-1].length;let n=!1,r=t.point;this.isPointWithinDrawPad(t.point,this.size)||(r=this.addInterpolatedStrokeMove(t.point),n=!0);const o={type:y.StrokeEnd,position:this.strokes[e-1][i-1].position,target:this,handled:!1,...f.createTimestamps()};this.strokes[e-1].push({type:y.StrokeEnd,position:n?r:this.strokes[e-1][i-1].position,iso8601Timestamp:new Date().toISOString(),interpolated:n}),this.raiseDrawPadEvent(o),this.currentStrokesNotAllowed=!0}else this.pointerIsDownAndPointerLeftDrawAreaWhenDown=!0}handleTapUpAny(){if(this.currentStrokesNotAllowed){this.isDrawingPointerDown=!1;return}if(this.isUserInteractionEnabled){this.isDrawingPointerDown=!1,this.pointerIsDownAndPointerLeftDrawAreaWhenDown=!1;const t=this.strokes.length,e=this.strokes[t-1].length,i={type:y.StrokeEnd,position:this.strokes[t-1][e-1].position,target:this,handled:!1,...f.createTimestamps()};this.strokes[t-1].push({type:y.StrokeEnd,position:this.strokes[t-1][e-1].position,iso8601Timestamp:new Date().toISOString(),interpolated:!1}),this.raiseDrawPadEvent(i)}}handlePointerMove(t){if(this.isUserInteractionEnabled&&this.isDrawingPointerDown){if(!this.drawShape?.path)throw new Error("DrawPad.handlePointerMove(): no drawShape.path");const e=this.drawShape.path;this.isDrawingPointerDown&&!this.pointerIsDownAndPointerLeftDrawAreaWhenDown&&e.addLine(t.point),this.pointerIsDownAndPointerLeftDrawAreaWhenDown&&(this.pointerIsDownAndPointerLeftDrawAreaWhenDown=!1,e.move(t.point));const i={type:y.StrokeMove,target:this,handled:!1,position:t.point,...f.createTimestamps()},n=this.strokes.length;this.strokes[n-1].push({type:y.StrokeMove,position:t.point,iso8601Timestamp:new Date().toISOString(),interpolated:!1}),this.raiseDrawPadEvent(i)}}update(){super.update()}draw(t){super.drawChildren(t)}raiseDrawPadEvent(t){this.eventListeners.length>0&&this.eventListeners.filter(e=>e.type===t.type).forEach(e=>{e.callback(t)})}raiseDrawPadItemEvent(t,e){t.eventListeners.length>0&&t.eventListeners.filter(i=>i.type===e.type).forEach(i=>{i.callback(e)})}clear(){if(!this.drawShape?.path)throw new Error("DrawPad.clear(): no drawShape.path");this.drawShape.path.clear(),this.strokes=new Array}warmup(t){this.initialize(),this.children.filter(e=>e.isDrawable).forEach(e=>{e.warmup(t)})}onStrokeStart(t,e){this.addEventListener(y.StrokeStart,t,e)}onStrokeMove(t,e){this.addEventListener(y.StrokeMove,t,e)}onStrokeEnd(t,e){this.addEventListener(y.StrokeEnd,t,e)}addItem(t){return Object.defineProperty(t,"drawPadPosition",{get:function(){const e=t.parent;return{get x(){return t.position.x+e.size.width/2},set x(i){t.position.x=i-e.size.width/2},get y(){return t.position.y+e.size.height/2},set y(i){t.position.y=i-e.size.height/2}}},set:function(e){const i=t.parent;t.position.x=e.x-i.size.width/2,t.position.y=e.y-i.size.height/2}}),Object.defineProperty(t,"onStrokeEnter",{value:function(e,i){this.addEventListener(I.StrokeEnter,e,i)}}),Object.defineProperty(t,"onStrokeLeave",{value:function(e,i){this.addEventListener(I.StrokeLeave,e,i)}}),Object.defineProperty(t,"isStrokeWithinBounds",{value:!1,writable:!0}),t.onPointerDown(()=>{if(this.isDrawingPointerDown&&t.isStrokeWithinBounds===!1){t.isStrokeWithinBounds=!0;const e={type:I.StrokeEnter,target:t,...f.createTimestamps()};this.raiseDrawPadItemEvent(t,e)}}),t.onPointerMove(()=>{if(this.isDrawingPointerDown&&t.isStrokeWithinBounds===!1){t.isStrokeWithinBounds=!0;const e={type:I.StrokeEnter,target:t,...f.createTimestamps()};this.raiseDrawPadItemEvent(t,e)}}),t.onPointerLeave(()=>{if(this.isDrawingPointerDown&&t.isStrokeWithinBounds===!0){t.isStrokeWithinBounds=!1;const e={type:I.StrokeLeave,target:t,...f.createTimestamps()};this.raiseDrawPadItemEvent(t,e)}}),t.onPointerUp(()=>{if(t.isStrokeWithinBounds===!0){t.isStrokeWithinBounds=!1;const e={type:I.StrokeLeave,target:t,...f.createTimestamps()};this.raiseDrawPadItemEvent(t,e)}}),this.addChild(t),t.zPosition=-1,t.position.x=t.position.x-this.size.width/2,t.position.y=t.position.y-this.size.height/2,t.isUserInteractionEnabled=!0,t}takeScreenshot(){const t=this.drawArea;if(!t)throw new Error("DrawPad.takeScreenshot(): no drawArea");const e=(t.absolutePosition.x-t.size.width/2)*m2c2Globals.canvasScale,i=(t.absolutePosition.y-t.size.height/2)*m2c2Globals.canvasScale,n=t.size.width*m2c2Globals.canvasScale,r=t.size.height*m2c2Globals.canvasScale,o={alphaType:this.game.canvasKit.AlphaType.Unpremul,colorType:this.game.canvasKit.ColorType.RGBA_8888,colorSpace:this.game.canvasKit.ColorSpace.SRGB,width:n,height:r},a=this.game.snapshots[0].readPixels(e,i,o),h=this.game.canvasKit.MakeImage(o,a,a.length/r);if(!h)throw new Error("DrawPad.takeScreenshot(): no croppedImage");const l=h.encodeToBytes();if(!l)throw new Error("DrawPad.takeScreenshot(): croppedImage.encodeToBytes() failed");return h.delete(),this.arrayBufferToBase64String(l)}isPointWithinDrawPad(t,e){return t.x>=0&&t.x<=e.width&&t.y>=0&&t.y<=e.height}interpolateToDrawPadBorder(t,e,i){const n=(t.y-e.y)/(t.x-e.x),r=t.y-n*t.x,o={x:0,y:0};if(!Number.isFinite(n)){if(o.x=t.x,t.y-e.y>0)return o.y=i.height,o;if(t.y-e.y<0)return o.y=0,o}const s=n*0+r,a=n*i.width+r;if(s>=0&&s<=i.height&&t.x-e.x<0)return o.x=0,o.y=s,o;if(a>=0&&a<=i.height&&t.x-e.x>0)return o.x=i.width,o.y=a,o;const h=(0-r)/n,l=(i.height-r)/n;return h>=0&&h<=i.width&&t.y-e.y<0?(o.x=h,o.y=0,o):l>=0&&l<=i.width&&t.y-e.y>0?(o.x=l,o.y=i.height,o):t}arrayBufferToBase64String(t){let e="";const i=new Uint8Array(t);for(let n=0;n<i.byteLength;n++)e+=String.fromCharCode(i[n]);return window.btoa(e)}get backgroundColor(){return this._backgroundColor}set backgroundColor(t){this._backgroundColor=t,this.needsInitialization=!0}get borderColor(){return this._borderColor}set borderColor(t){this._borderColor=t,this.needsInitialization=!0}get borderWidth(){return this._borderWidth}set borderWidth(t){this._borderWidth=t,this.needsInitialization=!0}get lineColor(){return this._lineColor}set lineColor(t){this._lineColor=t,this.needsInitialization=!0}get lineWidth(){return this._lineWidth}set lineWidth(t){this._lineWidth=t,this.needsInitialization=!0}duplicate(t){throw new Error(`DrawPad.duplicate(): Method not implemented. ${t}`)}}f.registerM2NodeClass(j);class Z extends x{constructor(t){super(t),this.compositeType="VirtualKeyboard",this.keyboardRows=new Array,this.shiftActivated=!1,this.keyShapes=new Array,this.keyLabels=new Array,this.originalOptions=JSON.parse(JSON.stringify(t)),t.isUserInteractionEnabled===void 0&&(this._isUserInteractionEnabled=!0),this.size=t.size,this.position=t.position??{x:0,y:0},this.keyboardHorizontalPaddingPercent=t.keyboardHorizontalPaddingPercent??.02,this.keyboardVerticalPaddingPercent=t.keyboardVerticalPaddingPercent??.025,this.keyHorizontalPaddingPercent=t.keyHorizontalPaddingPercent??.1,this.keyVerticalPaddingPercent=t.keyVerticalPaddingPercent??.1,t.rows!==void 0&&(this.keyboardRows=t.rows.map(e=>e.map(n=>{if(n instanceof Object&&!Array.isArray(n)){const r=n;return n.keyIconShapeOptions&&(n.keyIconShapeOptions.suppressEvents=!0,r.keyIcon=new p(n.keyIconShapeOptions),r.keyIconShapeOptions=void 0),r}else return n}))),this.keysPerRow=t.keysPerRow??NaN,this.fontSize=t.fontSize??NaN,this.fontNames=t.fontNames,this.hiddenKeys=t.hiddenKeys??"",this.capitalLettersOnly=t.capitalLettersOnly??!1,this.keyColor=t.keyColor??c.White,this.keyDownColor=t.keyDownColor??c.Transparent,this.specialKeyDownColor=t.specialKeyDownColor??c.LightSteelBlue,this.backgroundColor=t.backgroundColor??[242,240,244,1],this.showKeyDownPreview=t.showKeyDownPreview??!0,this.saveNodeNewEvent()}get completeNodeOptions(){return{...this.options,...this.getNodeOptions(),...this.getDrawableOptions(),...this.originalOptions}}initialize(){this.game.eventStore.mode===F.Replay&&(this._isUserInteractionEnabled=!1),this.keyboardRows.length===0&&(this.keyboardRows=this.createDefaultKeyboardRows(),this.keysPerRow=this.keyboardRows.reduce((a,h)=>Math.max(a,h.length),0),this.fontSize=this.size.height/this.keyboardRows.length/2.5);const t=new p({rect:{size:this.size},fillColor:this.backgroundColor,suppressEvents:!0});this.addChild(t);const e=this.internalKeyboardRowsToInternalKeyboardConfiguration(this.keyboardRows),i={x:-t.size.width/2,y:-t.size.height/2},n=(this.keyboardVerticalPaddingPercent??.025)*this.size.height,r=(this.keyboardHorizontalPaddingPercent??.02)*this.size.width,o=(this.size.height-2*n)/e.length,s=(this.size.width-2*r)/this.keysPerRow;this.keyShapes=[];for(let a=0;a<e.length;a++){const h=e[a],l=h.reduce((E,w)=>E+(w.widthRatio??1),0);let m=0;l<this.keysPerRow&&(m=(this.size.width-2*r-s*l)/2);for(let E=0;E<h.length;E++){const w=h[E];if(this.hiddenKeys?.split(",").map(C=>C===" "?" ":C.trim()).includes(w.code))continue;const A=h.slice(0,E).reduce((C,W)=>C+(W.widthRatio??1),0)*s,_=new p({rect:{size:{width:s*(w.widthRatio??1),height:o}},fillColor:c.Transparent,strokeColor:c.Transparent,lineWidth:1,position:{x:m+i.x+r+A+(w.widthRatio??1)*s/2,y:i.y+n+a*o+o/2},suppressEvents:!0}),R=s*(w.widthRatio??1)-2*this.keyHorizontalPaddingPercent*s,K=o-(w.heightRatio??1)-2*this.keyVerticalPaddingPercent*o,k=new p({rect:{size:{width:R,height:K}},cornerRadius:4,fillColor:this.keyColor,lineWidth:0,isUserInteractionEnabled:this.isUserInteractionEnabled,suppressEvents:!0});k.userData={code:w.code},_.addChild(k),this.keyShapes.push(k);const L=new v({text:w.labelText,fontSize:this.fontSize,fontNames:this.fontNames,suppressEvents:!0});L.userData={code:w.code},_.addChild(L),this.keyLabels.push(L),w.keyIcon&&_.addChild(w.keyIcon),t.addChild(_),k.onTapUp(C=>{this.handleKeyShapeTapUp(w,k,C)}),k.onTapDown(C=>{this.handleKeyShapeTapDown(w,k,C)}),k.onTapLeave(C=>{this.handleKeyShapeTapLeave(w,k,C)})}}this.letterCircle=new p({circleOfRadius:28,fillColor:c.Silver,hidden:!0,suppressEvents:!0}),t.addChild(this.letterCircle),this.letterCircleLabel=new v({text:"",fontSize:this.fontSize,fontNames:this.fontNames,suppressEvents:!0}),this.letterCircle.addChild(this.letterCircleLabel),this.needsInitialization=!1}onKeyDown(t,e){const i={type:u.Composite,compositeEventType:"VirtualKeyboardKeyDown",compositeType:this.compositeType,nodeUuid:this.uuid,callback:t};this.addVirtualKeyboardEventListener(i,e)}onKeyUp(t,e){const i={type:u.Composite,compositeEventType:"VirtualKeyboardKeyUp",compositeType:this.compositeType,nodeUuid:this.uuid,callback:t};this.addVirtualKeyboardEventListener(i,e)}onKeyLeave(t,e){const i={type:u.Composite,compositeEventType:"VirtualKeyboardKeyLeave",compositeType:this.compositeType,nodeUuid:this.uuid,callback:t};this.addVirtualKeyboardEventListener(i,e)}update(){super.update()}draw(t){super.drawChildren(t)}warmup(t){this.initialize(),this.children.filter(e=>e.isDrawable).forEach(e=>{e.warmup(t)})}duplicate(t){throw new Error(`Method not implemented. ${t}`)}handleKeyShapeTapDown(t,e,i){t.isShift&&(this.shiftActivated=!this.shiftActivated);const n=this.getKeyAsString(t),r={type:u.Composite,compositeType:"VirtualKeyboard",compositeEventType:"VirtualKeyboardKeyDown",target:this,handled:!1,key:n,code:t.code,shiftKey:this.shiftActivated,keyTapMetadata:{size:e.size,point:i.point,buttons:i.buttons},...f.createTimestamps()};this.handleCompositeEvent(r),this.saveEvent(r),this.eventListeners.length>0&&this.eventListeners.filter(o=>o.type===u.Composite&&o.compositeType==="VirtualKeyboard"&&o.compositeEventType==="VirtualKeyboardKeyDown").forEach(o=>{o.callback(r)})}handleKeyShapeTapUp(t,e,i){const n=this.getKeyAsString(t),r={type:u.Composite,compositeType:"VirtualKeyboard",compositeEventType:"VirtualKeyboardKeyUp",target:this,handled:!1,key:n,code:t.code,shiftKey:this.shiftActivated,keyTapMetadata:{size:e.size,point:i.point,buttons:i.buttons},...f.createTimestamps()};this.handleCompositeEvent(r),this.saveEvent(r),this.eventListeners.length>0&&this.eventListeners.filter(o=>o.type===u.Composite&&o.compositeType==="VirtualKeyboard"&&o.compositeEventType==="VirtualKeyboardKeyUp").forEach(o=>{o.callback(r)})}handleKeyShapeTapLeave(t,e,i){const n=this.getKeyAsString(t),r={type:u.Composite,compositeType:"VirtualKeyboard",compositeEventType:"VirtualKeyboardKeyLeave",target:this,handled:!1,key:n,code:t.code,shiftKey:this.shiftActivated,keyTapMetadata:{size:e.size,point:i.point,buttons:i.buttons},...f.createTimestamps()};this.handleCompositeEvent(r),this.saveEvent(r),this.eventListeners.length>0&&this.eventListeners.filter(o=>o.type===u.Composite&&o.compositeType==="VirtualKeyboard"&&o.compositeEventType==="VirtualKeyboardKeyLeave").forEach(o=>{o.callback(r)})}getKeyAsString(t){return t.isShift||t.code===" "||t.code==="Backspace"?t.code:this.shiftActivated?t.labelTextShifted??t.code:t.labelText??t.code}internalKeyboardRowsToInternalKeyboardConfiguration(t){return t.map(e=>e.map(i=>{let n=1;const r=1;let o,s,a,h,l=!1;return typeof i=="string"?(o=i,this.capitalLettersOnly?s=o.toUpperCase():s=o,a=o.toUpperCase()):Array.isArray(i)?(o=i[0],s=o,a=i[1]):(o=i.code,s=i.labelText??"",a=i.labelTextShifted??s,n=i.widthRatio??1,h=i.keyIcon,l=i.isShift??!1),{widthRatio:n,heightRatio:r,code:o,labelText:s,labelTextShifted:a,keyIcon:h,isShift:l}}))}handleCompositeEvent(t){const e=this.internalKeyboardRowsToInternalKeyboardConfiguration(this.keyboardRows),i=this.keyShapes.find(n=>n.userData.code===t.code);if(!i)throw new Error("keyShape is not defined");switch(this.shiftActivated=t.shiftKey,t.compositeEventType){case"VirtualKeyboardKeyDown":{this.handleKeyDownEvent(t,e,i);break}case"VirtualKeyboardKeyUp":{this.handleKeyUpEvent(t,e,i);break}case"VirtualKeyboardKeyLeave":{this.handleKeyLeaveEvent(t,e,i);break}default:throw new Error(`Unknown VirtualKeyboardEvent: ${t.compositeEventType}`)}}handleKeyDownEvent(t,e,i){if(t.code.toLowerCase().includes("shift"))t.shiftKey?this.showKeyboardShifted(e):this.showKeyboardNotShifted(e);else if(t.code===" "||t.code==="Backspace")i.fillColor=this.specialKeyDownColor;else if(i.fillColor=this.keyDownColor,this.showKeyDownPreview){if(!this.letterCircle||!this.letterCircleLabel)throw new Error("letterCircle is not defined");this.letterCircle.hidden=!1;const n=i.parent;if(this.letterCircle.position.x=n.position.x,i.rect?.size?.height===void 0)throw new Error("keyShape.rect.height is undefined");this.letterCircle.position.y=n.position.y-i.rect.size.height*1.2;const o=this.internalKeyboardRowsToInternalKeyboardConfiguration(this.keyboardRows).flat().find(s=>s.code===t.code);if(!o)throw new Error("key is not defined");this.shiftActivated?this.letterCircleLabel.text=o.labelTextShifted??o.code:this.letterCircleLabel.text=o.labelText??o.code}}handleKeyUpEvent(t,e,i){if(!(t.code.toLowerCase().includes("shift")&&t.shiftKey)){if(t.code.toLowerCase().includes("shift")&&!t.shiftKey){this.shiftActivated=!1,this.showKeyboardNotShifted(e);return}if(i.fillColor=this.keyColor,!this.letterCircle)throw new Error("letterCircle is not defined");this.letterCircle.hidden=!0,!t.code.toLowerCase().includes("shift")&&t.shiftKey&&(this.shiftActivated=!1,this.showKeyboardNotShifted(e))}}handleKeyLeaveEvent(t,e,i){if(t.code.toLowerCase().includes("shift")){t.shiftKey?(this.showKeyboardNotShifted(e),this.shiftActivated=!1):(this.showKeyboardShifted(e),this.shiftActivated=!0);return}if(i.fillColor=this.keyColor,!this.letterCircle)throw new Error("letterCircle is not defined");this.letterCircle.hidden=!0}showKeyboardShifted(t){this.keyShapes.filter(n=>n.userData.code.toLowerCase().includes("shift")).forEach(n=>{n.fillColor=this.specialKeyDownColor}),t.flat().filter(n=>n.isShift).forEach(n=>{n.keyIcon&&(n.keyIcon.fillColor=c.Black)}),t.flatMap(n=>n).forEach(n=>{const r=this.keyLabels.find(o=>o.userData.code===n.code);if(!r)throw new Error("keyLabel is not defined");r.text!==void 0&&(r.text=n.labelTextShifted??"")})}showKeyboardNotShifted(t){this.keyShapes.filter(n=>n.userData.code.toLowerCase().includes("shift")).forEach(n=>{n.fillColor=this.keyColor}),t.flat().filter(n=>n.isShift).forEach(n=>{n.keyIcon&&(n.keyIcon.fillColor=c.Transparent)}),t.flatMap(n=>n).forEach(n=>{const r=this.keyLabels.find(o=>o.userData.code===n.code);if(!r)throw new Error("keyLabel is not defined");r.text!==void 0&&(r.text=n.labelText??"")})}createDefaultKeyboardRows(){const t=[["1","!"],["2","@"],["3","#"],["4","$"],["5","%"],["6","^"],["7","&"],["8","*"],["9","("],["0",")"]],e=["q","w","e","r","t","y","u","i","o","p"],i=["a","s","d","f","g","h","j","k","l"],n={path:{pathString:"m288-6.6849e-14 -288 288h144v288h288v-288h144l-288-288z",width:24},lineWidth:2,strokeColor:c.Black,fillColor:c.Transparent,suppressEvents:!0},r={path:{pathString:"M10.625 5.09 0 22.09l10.625 17H44.18v-34H10.625zm31.555 32H11.734l-9.375-15 9.375-15H42.18v30zm-23.293-6.293 7.293-7.293 7.293 7.293 1.414-1.414-7.293-7.293 7.293-7.293-1.414-1.414-7.293 7.293-7.293-7.293-1.414 1.414 7.293 7.293-7.293 7.293",width:24},lineWidth:1,strokeColor:c.Black,fillColor:c.Red,suppressEvents:!0},o=[{code:"Shift",isShift:!0,widthRatio:1.5,keyIcon:new p(n)},"z","x","c","v","b","n","m",{code:"Backspace",widthRatio:1.5,keyIcon:new p(r)}];return[t,e,i,o,[{code:" ",labelText:"SPACE",widthRatio:5}]]}addVirtualKeyboardEventListener(t,e){e?.replaceExisting&&(this.eventListeners=this.eventListeners.filter(i=>!(i.nodeUuid===t.nodeUuid&&i.type===t.type&&i.compositeType===t.compositeType))),this.eventListeners.push(t)}get isUserInteractionEnabled(){return this._isUserInteractionEnabled}set isUserInteractionEnabled(t){this._isUserInteractionEnabled=t,this.keyShapes?.forEach(e=>{e.isUserInteractionEnabled=t})}}f.registerM2NodeClass(Z);const X=$.sinusoidalInOut,Y=500;class pt extends lt{static create(t){const e=new Array;return t.instructionScenes.forEach((i,n)=>{const r=i.nextSceneTransition??t.nextSceneTransition??M.slide({direction:V.Left,duration:Y,easing:X}),o=i.backSceneTransition??t.backSceneTransition??M.slide({direction:V.Right,duration:Y,easing:X}),s=i.backButtonText??t.backButtonText??"Back",a=i.backButtonTextInterpolation??t.backButtonTextInterpolation,h=i.nextButtonText??t.nextButtonText??"Next",l=i.nextButtonTextInterpolation??t.nextButtonTextInterpolation,m=i.backButtonWidth??t.backButtonWidth??125,E=i.nextButtonWidth??t.nextButtonWidth??125,w=i.backButtonHeight??t.backButtonHeight??50,A=i.nextButtonHeight??t.nextButtonHeight??50,_=i.backgroundColor??t.backgroundColor,R=i.imageAboveText??!0,K=i.imageMarginTop??0,k=i.imageMarginBottom??0,L=i.textMarginStart??48,C=i.textMarginEnd??48,W=i.textAlignmentMode??dt.Left,tt=i.textFontSize??16,et=i.titleFontSize??16,it=i.titleMarginTop??48,nt=i.backButtonBackgroundColor??t.backButtonBackgroundColor??c.Black,ot=i.backButtonFontColor??t.backButtonFontColor??c.White,st=i.nextButtonBackgroundColor??t.nextButtonBackgroundColor??c.Black,rt=i.nextButtonFontColor??t.nextButtonFontColor??c.White,U=t.sceneNamePrefix??"instructions",d=new q({name:U+"-"+(n+1).toString().padStart(2,"0"),backgroundColor:_});let H;i.title!==void 0&&(H=new v({text:i.title,interpolation:i.titleInterpolation,fontSize:et,layout:{marginTop:it,constraints:{topToTopOf:d,startToStartOf:d,endToEndOf:d}}}),d.addChild(H));let D;if(i.text!==void 0&&(D=new v({text:i.text,interpolation:i.textInterpolation,preferredMaxLayoutWidth:ct.MatchConstraint,horizontalAlignmentMode:W,fontSize:tt,layout:{marginStart:L,marginEnd:C,constraints:{topToTopOf:d,bottomToBottomOf:d,startToStartOf:d,endToEndOf:d,verticalBias:i.textVerticalBias}}}),d.addChild(D)),i.imageName!==void 0){let T;D!==void 0?R?T=new B({imageName:i.imageName,layout:{marginBottom:k,constraints:{bottomToTopOf:D,startToStartOf:d,endToEndOf:d}}}):T=new B({imageName:i.imageName,layout:{marginTop:K,constraints:{topToBottomOf:D,startToStartOf:d,endToEndOf:d}}}):T=new B({imageName:i.imageName,layout:{constraints:{topToTopOf:d,bottomToBottomOf:d,verticalBias:i.imageVerticalBias,startToStartOf:d,endToEndOf:d}}}),d.addChild(T)}if(n>0){const T=new z({name:"backButton",text:s,interpolation:a,fontColor:ot,backgroundColor:nt,size:{width:m,height:w},layout:{marginStart:32,marginBottom:80,constraints:{bottomToBottomOf:d,startToStartOf:d}}});T.isUserInteractionEnabled=!0,T.onTapDown(()=>{d.game.presentScene(U+"-"+(n+1-1).toString().padStart(2,"0"),o)}),d.addChild(T)}const N=new z({name:"nextButton",text:h,interpolation:l,fontColor:rt,backgroundColor:st,size:{width:E,height:A},layout:{marginEnd:32,marginBottom:80,constraints:{bottomToBottomOf:d,endToEndOf:d}}});N.isUserInteractionEnabled=!0,n!==t.instructionScenes.length-1?N.onTapDown(()=>{d.game.presentScene(U+"-"+(n+1+1).toString().padStart(2,"0"),r)}):t.postInstructionsScene!==void 0?N.onTapDown(()=>{d.game.presentScene(t.postInstructionsScene??"",r)}):N.onTapDown(()=>{const T=d.game.scenes.indexOf(d);if(T===-1)console.warn("warning: postInstructionsScene is not defined, and next scene cannot be determined.");else{const G=T+1;G<d.game.scenes.length?d.game.presentScene(d.game.scenes[G],r):console.warn("warning: postInstructionsScene is not defined, and there is no next scene to present.")}}),d.addChild(N),e.push(d)}),e}static Create(t){return this.create(t)}}const ft=$.sinusoidalInOut,gt=500;class mt extends q{constructor(t){if(super(t),t?.transitionDurationMilliseconds!==void 0&&t?.transition)throw new Error("Both transition and transitionDurationMilliseconds options were provided. Only one should be provided. If using a custom transition, then the duration of that transition must be specified within the custom transition.");let e;if(t?.timerShape?.circle===void 0&&t?.timerShape?.rectangle===void 0||t?.timerShape.circle!==void 0)e=new p({circleOfRadius:t?.timerShape?.circle?.radius??100,layout:{constraints:{topToTopOf:this,bottomToBottomOf:this,startToStartOf:this,endToEndOf:this,verticalBias:t?.shapeVerticalBias??.5}},fillColor:t?.timerShape?.fillColor??c.RoyalBlue}),this.addChild(e);else if(t?.timerShape.rectangle!==void 0)e=new p({rect:{width:t?.timerShape?.rectangle?.width??200,height:t?.timerShape?.rectangle?.height??200},cornerRadius:t?.timerShape?.rectangle?.cornerRadius,layout:{constraints:{topToTopOf:this,bottomToBottomOf:this,startToStartOf:this,endToEndOf:this,verticalBias:t.shapeVerticalBias??.5}},fillColor:t?.timerShape?.fillColor??c.RoyalBlue}),this.addChild(e);else throw new Error("Invalid timer shape options.");const i=Math.floor(t.milliseconds/1e3),n=new v({text:"",fontSize:t?.timerNumbersFontSize??50,fontName:t?.timerNumbersFontName,fontColor:t?.timerNumbersFontColor??c.White});e.addChild(n);const r=new v({text:t?.text??"GET READY",fontSize:t?.textFontSize??50,fontName:t?.textFontName,fontColor:t?.textFontColor,layout:{marginTop:t?.textMarginTop??32,constraints:{topToBottomOf:e,startToStartOf:this,endToEndOf:this}}});this.addChild(r);const o=new Array;for(let s=i-1;s>0;s--)o.push(S.wait({duration:1e3})),o.push(S.custom({callback:()=>{n.text=s.toString()}}));o.push(S.wait({duration:1e3})),o.push(S.custom({callback:()=>{n.text=t?.zeroString??"0"}})),t?.zeroDwellMilliseconds!==void 0&&o.push(S.wait({duration:t.zeroDwellMilliseconds})),o.push(S.custom({callback:()=>{const s=this.game;s.scenes.indexOf(this)===s.scenes.length-1&&s.end();const h=s.scenes[s.scenes.indexOf(this)+1];s.presentScene(h,t?.transition??M.slide({direction:V.Left,duration:t?.transitionDurationMilliseconds??gt,easing:ft}))}})),this.onSetup(()=>{n.text=i.toString()}),this.onAppear(()=>{this.run(S.sequence(o))})}}class wt extends x{constructor(t){super(t),this.compositeType="LocalePicker",this.DEFAULT_FONT_SIZE=24,this.automaticallyChangeLocale=!0,this._localeOptions=new Array,this._backgroundColor=c.White,this._fontSize=this.DEFAULT_FONT_SIZE,this._fontColor=c.Black,this._cornerRadius=8,this._overlayAlpha=.5,this._icon={svgString:'<svg xmlns="http://www.w3.org/2000/svg" width="420" height="420" stroke="#000" fill="none"><path stroke-width="26" d="M209 15a195 195 0 1 0 2 0z"/><path stroke-width="18" d="M210 15v390m195-195H15M59 90a260 260 0 0 0 302 0m0 240a260 260 0 0 0-302 0M195 20a250 250 0 0 0 0 382m30 0a250 250 0 0 0 0-382"/></svg>',height:32,width:32},this._iconPosition={x:32,y:32},this.LEFT_SELECTION_INDICATOR="\xAB",this.RIGHT_SELECTION_INDICATOR="\xBB",this.zPosition=Number.MAX_VALUE,t&&(t.localeOptions&&(this.localeOptions=t.localeOptions),t.backgroundColor&&(this.backgroundColor=t.backgroundColor),t.overlayAlpha!==void 0&&(this.overlayAlpha=t.overlayAlpha),t.fontSize!==void 0&&(this.fontSize=t.fontSize),t.fontColor&&(this.fontColor=t.fontColor),t.cornerRadius&&(this.cornerRadius=t.cornerRadius),t.currentLocale!==void 0&&(this.currentLocale=t.currentLocale),t.icon&&(this.icon=t.icon),t.automaticallyChangeLocale!==void 0&&(this.automaticallyChangeLocale=t.automaticallyChangeLocale))}onResult(t,e){const i={type:u.Composite,compositeType:"LocalePickerResult",nodeUuid:this.uuid,callback:t};e?.replaceExisting&&(this.eventListeners=this.eventListeners.filter(n=>!(n.nodeUuid===i.nodeUuid&&n.type==="LocalePickerResult"))),this.eventListeners.push(i)}initialize(){if(this.currentLocale===void 0&&(this.currentLocale=this.game.i18n?.locale),this.localeOptions.length===0&&Object.keys(this.game.i18n?.translation||{}).filter(a=>a!=="configuration").forEach(a=>{this.localeOptions.push({text:this.game.i18n?.translation[a].localeName||a,locale:a,svg:this.game.i18n?.translation[a].localeSvg})}),this.localeOptions.length===0)throw new Error("No locales available for LocalePicker");this.children.filter(s=>s.name!=="localePickerIcon").forEach(s=>this.removeChild(s)),this.game.imageManager.loadImages([{imageName:"__localePickerIcon",svgString:this.icon.svgString,height:this.icon.height,width:this.icon.width}]),this.iconSprite||(this.iconSprite=new B({name:"localePickerIcon",imageName:"__localePickerIcon",position:this.iconPosition,isUserInteractionEnabled:!0}),this.addChild(this.iconSprite),this.iconSprite.onTapDown(s=>{s.handled=!0,this.setDialogVisibility(!0)}),this.iconSprite.onTapUp(s=>{s.handled=!0}),this.iconSprite.onTapUpAny(s=>{s.handled=!0}),this.iconSprite.onPointerUp(s=>{s.handled=!0}),this.iconSprite.onPointerDown(s=>{s.handled=!0}));const t=new p({rect:{width:m2c2Globals.canvasCssWidth,height:m2c2Globals.canvasCssHeight,x:m2c2Globals.canvasCssWidth/2,y:m2c2Globals.canvasCssHeight/2},fillColor:[0,0,0,this.overlayAlpha],zPosition:-1,isUserInteractionEnabled:!0,hidden:!0});t.onTapUp(s=>{s.handled=!0,this.eventListeners.length>0&&this.eventListeners.filter(a=>a.type==="LocalePickerResult").forEach(a=>{const h={type:u.Composite,compositeType:this.compositeType,compositeEventType:"LocalePickerResult",target:this,handled:!1,result:{locale:void 0},timestamp:P.now(),iso8601Timestamp:new Date().toISOString()};a.callback(h)}),this.setDialogVisibility(!1)}),t.onTapUpAny(s=>{s.handled=!0}),t.onTapDown(s=>{s.handled=!0}),t.onPointerUp(s=>{s.handled=!0}),t.onPointerDown(s=>{s.handled=!0}),this.addChild(t);const e=this.fontSize/this.DEFAULT_FONT_SIZE*50,i=this.localeOptions.length*e,n=m2c2Globals.canvasCssWidth/2,r={x:m2c2Globals.canvasCssWidth/2,y:m2c2Globals.canvasCssHeight/2},o=new p({rect:{width:n,height:i,x:r.x,y:r.y},cornerRadius:this.cornerRadius,fillColor:this.backgroundColor,isUserInteractionEnabled:!0,hidden:!0});o.onTapDown(s=>{s.handled=!0}),o.onTapUp(s=>{s.handled=!0}),o.onTapUpAny(s=>{s.handled=!0}),o.onPointerUp(s=>{s.handled=!0}),o.onPointerDown(s=>{s.handled=!0}),this.addChild(o);for(let s=0;s<this.localeOptions.length;s++){const a=this.localeOptions[s];if(a.svg){this.game.imageManager.loadImages([{imageName:a.text,svgString:a.svg.svgString,height:a.svg.height,width:a.svg.width}]);const h=new B({imageName:a.text,position:{x:r.x,y:r.y+s*e-i/2+e/2},isUserInteractionEnabled:!0,zPosition:1,hidden:!0});if(this.addChild(h),this.currentLocale===a.locale){const l=new v({text:this.LEFT_SELECTION_INDICATOR,fontSize:this.fontSize,fontColor:this.fontColor,position:{x:r.x-a.svg.width/2-this.fontSize/2,y:r.y+s*e-i/2+e/2},hidden:!0,localize:!1});this.addChild(l);const m=new v({text:this.RIGHT_SELECTION_INDICATOR,fontSize:this._fontSize,fontColor:this.fontColor,position:{x:r.x+a.svg.width/2+this.fontSize/2,y:r.y+s*e-i/2+e/2},hidden:!0,localize:!1});this.addChild(m)}h.onTapUp(l=>{l.handled=!0,this.handleLocaleSelection(l,a)}),h.onTapUpAny(l=>{l.handled=!0}),h.onTapDown(l=>{l.handled=!0}),h.onPointerUp(l=>{l.handled=!0}),h.onPointerDown(l=>{l.handled=!0})}else{let h=a.text;this.currentLocale===a.locale&&(h=`${this.LEFT_SELECTION_INDICATOR} ${h} ${this.RIGHT_SELECTION_INDICATOR}`);const l=new v({text:h,fontSize:this.fontSize,fontColor:this.fontColor,position:{x:r.x,y:r.y+s*e-i/2+e/2},isUserInteractionEnabled:!0,zPosition:1,hidden:!0,localize:!1});l.onTapUp(m=>{m.handled=!0,this.handleLocaleSelection(m,a)}),l.onTapUpAny(m=>{m.handled=!0}),l.onTapDown(m=>{m.handled=!0}),l.onPointerUp(m=>{m.handled=!0}),l.onPointerDown(m=>{m.handled=!0}),this.addChild(l)}}this.needsInitialization=!1}handleLocaleSelection(t,e){this.eventListeners.length>0&&this.eventListeners.filter(i=>i.type===u.Composite&&i.compositeType==="LocalePickerResult"&&i.nodeUuid==this.uuid).forEach(i=>{const n={type:u.Composite,compositeType:this.compositeType,compositeEventType:"LocalePickerResult",target:this,handled:!1,result:{locale:e.locale},timestamp:P.now(),iso8601Timestamp:new Date().toISOString()};i.callback(n)}),this.setDialogVisibility(!1),this.automaticallyChangeLocale&&(this.game.i18n?.switchToLocale(e.locale),this.currentLocale=e.locale)}setDialogVisibility(t){this.children.filter(e=>e.name!=="localePickerIcon").forEach(e=>{e.hidden=!t})}get backgroundColor(){return this._backgroundColor}set backgroundColor(t){this._backgroundColor=t,this.needsInitialization=!0}get fontSize(){return this._fontSize}set fontSize(t){this._fontSize=t,this.needsInitialization=!0}get fontColor(){return this._fontColor}set fontColor(t){this._fontColor=t,this.needsInitialization=!0}get cornerRadius(){return this._cornerRadius}set cornerRadius(t){this._cornerRadius=t,this.needsInitialization=!0}get overlayAlpha(){return this._overlayAlpha}set overlayAlpha(t){this._overlayAlpha=t,this.needsInitialization=!0}get icon(){const t=this;return{get svgString(){return t._icon.svgString},set svgString(e){t._icon.svgString=e,t.needsInitialization=!0},get imageName(){return t._icon.imageName},set imageName(e){t._icon.imageName=e,t.needsInitialization=!0},get height(){return t._icon.height},set height(e){t._icon.height=e,t.needsInitialization=!0},get width(){return t._icon.width},set width(e){t._icon.width=e,t.needsInitialization=!0}}}set icon(t){this._icon=t,this.needsInitialization=!0}get iconPosition(){const t=this;return{get x(){return t._iconPosition.x},set x(e){t._iconPosition.x=e,t.iconSprite&&(t.iconSprite.position=t._iconPosition),t.needsInitialization=!0},get y(){return t._iconPosition.y},set y(e){t._iconPosition.y=e,t.iconSprite&&(t.iconSprite.position=t._iconPosition),t.needsInitialization=!0}}}set iconPosition(t){this._iconPosition=t,this.iconSprite&&(this.iconSprite.position=t),this.needsInitialization=!0}get localeOptions(){return this._localeOptions}set localeOptions(t){this._localeOptions=t,this.needsInitialization=!0}get currentLocale(){return this._currentLocale}set currentLocale(t){t!==this.currentLocale&&(this._currentLocale=t,this.needsInitialization=!0)}update(){super.update()}draw(t){super.drawChildren(t)}warmup(t){this.initialize(),this.children.filter(e=>e.isDrawable).forEach(e=>{e.warmup(t)})}duplicate(t){throw new Error(`duplicate not implemented. ${t}`)}}class Q extends x{constructor(t){super(t),this.compositeType="CountdownTimer",this._milliseconds=3e3,this._tickIntervalMilliseconds=1e3,this._fontSize=50,this._fontColor=c.White,this._zeroString="0",this._timerShape={circle:{radius:100},fillColor:c.RoyalBlue},this._textVerticalBias=.5,this.countdownSequence=new Array,this._isRunning=!1,this.hasStopped=!1,this.originalOptions=JSON.parse(JSON.stringify(t)),t.milliseconds&&(this.milliseconds=t.milliseconds),t.tickIntervalMilliseconds&&(this.tickIntervalMilliseconds=t.tickIntervalMilliseconds),t.fontName&&(this.fontName=t.fontName),t.fontSize!==void 0&&(this.fontSize=t.fontSize),t.fontColor&&(this.fontColor=t.fontColor),t.zeroString!==void 0&&(this.zeroString=t.zeroString),t.timerShape&&(this.timerShape=t.timerShape),t.textVerticalBias!==void 0&&(this.textVerticalBias=t.textVerticalBias),this.saveNodeNewEvent()}get completeNodeOptions(){return{...this.options,...this.getNodeOptions(),...this.getDrawableOptions(),...this.originalOptions}}initialize(){if(this.removeAllChildren(),this._isRunning=!1,this.hasStopped=!1,this.timerShape?.circle===void 0&&this.timerShape?.rectangle===void 0||this.timerShape?.circle!==void 0)this.timerShapeNode=new p({circleOfRadius:this.timerShape.circle?.radius??100,fillColor:this.timerShape?.fillColor??c.RoyalBlue,suppressEvents:!0}),this.addChild(this.timerShapeNode);else if(this.timerShape?.rectangle!==void 0)this.timerShapeNode=new p({rect:{width:this.timerShape?.rectangle?.width??200,height:this.timerShape?.rectangle?.height??200},cornerRadius:this.timerShape?.rectangle?.cornerRadius,fillColor:this.timerShape?.fillColor??c.RoyalBlue,suppressEvents:!0}),this.addChild(this.timerShapeNode);else throw new Error("Invalid timer shape options.");if(this.size=this.timerShapeNode.size,this.milliseconds%1e3!==0)throw new Error("CountdownTimer milliseconds must be a multiple of 1000.");const t=Math.floor(this.milliseconds/1e3);this.timerNumberLabel=new v({text:t.toString(),fontSize:this.fontSize,fontName:this._fontName,fontColor:this.fontColor,layout:{constraints:{topToTopOf:this.timerShapeNode,bottomToBottomOf:this.timerShapeNode,startToStartOf:this.timerShapeNode,endToEndOf:this.timerShapeNode,verticalBias:this.textVerticalBias}},suppressEvents:!0}),this.timerShapeNode.addChild(this.timerNumberLabel),this.countdownSequence=new Array;for(let e=this.milliseconds;e>this.tickIntervalMilliseconds;e=e-this.tickIntervalMilliseconds)this.countdownSequence.push(S.wait({duration:this.tickIntervalMilliseconds})),this.countdownSequence.push(S.custom({callback:()=>{this.tick(e-this.tickIntervalMilliseconds)}}));this.countdownSequence.push(S.wait({duration:this.tickIntervalMilliseconds})),this.countdownSequence.push(S.custom({callback:()=>{this.tick(0);const e={type:u.Composite,compositeType:this.compositeType,compositeEventType:"CountdownTimerComplete",target:this,handled:!1,millisecondsRemaining:0,...f.createTimestamps()};this.handleCompositeEvent(e),this.saveEvent(e),this.eventListeners.length>0&&this.eventListeners.filter(i=>i.type===u.Composite&&i.compositeType==="CountdownTimer"&&i.compositeEventType==="CountdownTimerComplete").forEach(i=>{i.callback(e)})}})),this.needsInitialization=!1}tick(t){const e={type:u.Composite,compositeType:this.compositeType,compositeEventType:"CountdownTimerTick",target:this,handled:!1,millisecondsRemaining:t,...f.createTimestamps()};this.handleCompositeEvent(e),this.saveEvent(e),this.eventListeners.length>0&&this.eventListeners.filter(i=>i.type===u.Composite&&i.compositeType==="CountdownTimer"&&i.compositeEventType==="CountdownTimerTick").forEach(i=>{i.callback(e)})}start(){if(this.isRunning)throw new Error("CountdownTimer: cannot start. It is already running.");if(this.hasStopped)throw new Error("CountdownTimer: It has stopped. You cannot start a stopped CountdownTimer. Instead, create a new CountdownTimer or call CountdownTimer.reset() before starting.");this.needsInitialization&&this.initialize(),this.run(S.sequence(this.countdownSequence),"__countdownSequenceAction"),this._isRunning=!0}stop(){this.isRunning&&(this.removeAction("__countdownSequenceAction"),this._isRunning=!1,this.hasStopped=!0)}reset(){this.stop(),this.initialize()}get isRunning(){return this._isRunning}handleCompositeEvent(t){if(!this.timerNumberLabel)throw new Error("Timer number label not found.");switch(t.compositeEventType){case"CountdownTimerTick":{this.timerNumberLabel.text=Math.ceil(t.millisecondsRemaining/1e3).toString();break}case"CountdownTimerComplete":{this.timerNumberLabel.text=this.zeroString;break}default:throw new Error(`Invalid TimerCountdown event type: ${t.compositeEventType}`)}}onTick(t,e){const i={type:u.Composite,compositeEventType:"CountdownTimerTick",compositeType:this.compositeType,nodeUuid:this.uuid,callback:t};this.addCountdownTimerEventListener(i,e)}onComplete(t,e){const i={type:u.Composite,compositeEventType:"CountdownTimerComplete",compositeType:this.compositeType,nodeUuid:this.uuid,callback:t};this.addCountdownTimerEventListener(i,e)}addCountdownTimerEventListener(t,e){e?.replaceExisting&&(this.eventListeners=this.eventListeners.filter(i=>!(i.nodeUuid===t.nodeUuid&&i.type===t.type&&i.compositeType===t.compositeType))),this.eventListeners.push(t)}get milliseconds(){return this._milliseconds}set milliseconds(t){g.value(this._milliseconds,t)||(this._milliseconds=t,this.needsInitialization=!0,this.savePropertyChangeEvent("milliseconds",t))}get tickIntervalMilliseconds(){return this._tickIntervalMilliseconds}set tickIntervalMilliseconds(t){g.value(this._tickIntervalMilliseconds,t)||(this._tickIntervalMilliseconds=t,this.needsInitialization=!0,this.savePropertyChangeEvent("tickIntervalMilliseconds",t))}get fontColor(){return this._fontColor}set fontColor(t){g.value(this._fontColor,t)||(this._fontColor=t,this.needsInitialization=!0,this.savePropertyChangeEvent("fontColor",t))}get fontName(){return this._fontName}set fontName(t){this._fontName!==t&&(this._fontName=t,this.needsInitialization=!0,this.savePropertyChangeEvent("fontName",t))}get fontSize(){return this._fontSize}set fontSize(t){g.value(this._fontSize,t)||(this._fontSize=t,this.needsInitialization=!0,this.savePropertyChangeEvent("fontSize",t))}get zeroString(){return this._zeroString}set zeroString(t){this._zeroString!==t&&(this._zeroString=t,this.needsInitialization=!0,this.savePropertyChangeEvent("zeroString",t))}get timerShape(){return this._timerShape}set timerShape(t){g.value(this._timerShape,t)||(this._timerShape=t,this.needsInitialization=!0,this.savePropertyChangeEvent("timerShape",t))}get textVerticalBias(){return this._textVerticalBias}set textVerticalBias(t){g.value(this._textVerticalBias,t)||(this._textVerticalBias=t,this.needsInitialization=!0,this.savePropertyChangeEvent("textVerticalBias",t))}duplicate(t){throw new Error(`Method not implemented. ${t}`)}update(){super.update()}draw(t){super.drawChildren(t)}warmup(t){this.initialize(),this.children.filter(e=>e.isDrawable).forEach(e=>{e.warmup(t)})}}f.registerM2NodeClass(Q),console.log("\u26AA @m2c2kit/addons version 0.3.25 (8bba62e1)");export{z as Button,mt as CountdownScene,Q as CountdownTimer,ut as Dialog,J as DialogResult,j as DrawPad,y as DrawPadEventType,I as DrawPadItemEventType,O as Grid,pt as Instructions,wt as LocalePicker,Z as VirtualKeyboard};
1
+ import{M2c2KitHelpers as f,Composite as x,WebColors as c,Shape as p,EventStoreMode as F,Equal as g,Label as v,CanvasKitHelpers as at,M2EventType as u,Timer as P,MutablePath as ht,Easings as $,Story as lt,Transition as M,TransitionDirection as V,LabelHorizontalAlignmentMode as dt,Scene as q,Dimensions as ct,Sprite as B,Action as S}from"@m2c2kit/core";class O extends x{constructor(t){if(super(t),this.compositeType="Grid",this._rows=0,this._columns=0,this._gridBackgroundColor=[0,0,255,.25],this._gridLineColor=c.Red,this._gridLineWidth=1,this._gridChildren=new Array,this.cellContainers=new Array,t.size)this.size=t.size;else throw new Error("grid size must be specified");if(t.rows)if(t.rows>=1)this.rows=t.rows;else throw new Error("grid rows must be at least 1");else throw new Error("grid rows must be specified");if(t.columns)if(t.columns>=1)this.columns=t.columns;else throw new Error("grid columns must be at least 1");else throw new Error("grid columns must be specified");t.backgroundColor&&(this.gridBackgroundColor=t.backgroundColor),t.gridLineColor&&(this.gridLineColor=t.gridLineColor),t.gridLineWidth&&(this.gridLineWidth=t.gridLineWidth),this.cellWidth=this.size.width/this.columns,this.cellHeight=this.size.height/this.rows,this.saveNodeNewEvent()}get completeNodeOptions(){return{...this.options,...this.getNodeOptions(),...this.getDrawableOptions(),rows:this.rows,columns:this.columns,size:this.size,backgroundColor:this.gridBackgroundColor,gridLineWidth:this.gridLineWidth,gridLineColor:this.gridLineColor}}initialize(){this.descendants.forEach(t=>{t.parent===this?super.removeChild(t):t.parent?.removeChild(t)}),this.gridBackground=new p({name:"__"+this.name+"-gridRectangle",rect:{size:this.size},fillColor:this.gridBackgroundColor,strokeColor:this.gridLineColor,lineWidth:this.gridLineWidth,isUserInteractionEnabled:this.isUserInteractionEnabled,suppressEvents:!0}),super.addChild(this.gridBackground),this.gridBackground.isUserInteractionEnabled=this.isUserInteractionEnabled;for(let t=1;t<this.columns;t++){const e=new p({name:"__"+this.name+"-gridVerticalLine-"+(t-1),rect:{size:{width:this.gridLineWidth,height:this.size.height},origin:{x:-this.size.width/2+this.cellWidth*t,y:0}},fillColor:this.gridLineColor,suppressEvents:!0});this.gridBackground.addChild(e)}for(let t=1;t<this.rows;t++){const e=new p({name:"__"+this.name+"-gridHorizontalLine-"+(t-1),rect:{size:{width:this.size.width,height:this.gridLineWidth},origin:{x:0,y:-this.size.height/2+this.cellHeight*t}},fillColor:this.gridLineColor,suppressEvents:!0});this.gridBackground.addChild(e)}this.cellContainers=new Array(this.rows).fill([]).map(()=>new Array(this.columns));for(let t=0;t<this.rows;t++)for(let e=0;e<this.columns;e++){const i=new p({name:"__"+this.name+"-gridCellContainer-"+t+"-"+e,rect:{size:{width:this.cellWidth,height:this.cellHeight},origin:{x:-this.size.width/2+this.cellWidth*e+this.cellWidth/2,y:-this.size.height/2+this.cellHeight*t+this.cellHeight/2}},fillColor:c.Transparent,lineWidth:0,suppressEvents:!0});this.gridBackground.addChild(i),this.cellContainers[t][e]=i}this.gridChildren.length>0&&this.gridChildren.forEach(t=>{if(!this.cellWidth||!this.cellHeight||!this.gridBackground)throw new Error("cellWidth, cellHeight, or gridBackground undefined or null");if(this.game.eventStore.mode===F.Replay){const e=[...this.game.nodes,...this.game.materializedNodes].find(i=>i.uuid===t.node);if(!e)throw new Error("grid: child node not found");e?.parent?.removeChild(e),this.cellContainers[t.row][t.column].addChild(e)}else t.node.parent?.removeChild(t.node),this.cellContainers[t.row][t.column].addChild(t.node)}),this.needsInitialization=!1}get gridBackground(){if(!this._gridBackground)throw new Error("gridBackground is null or undefined");return this._gridBackground}set gridBackground(t){this._gridBackground=t}get rows(){return this._rows}set rows(t){g.value(this._rows,t)||(this._rows=t,this.needsInitialization=!0)}get columns(){return this._columns}set columns(t){g.value(this._columns,t)||(this._columns=t,this.needsInitialization=!0)}get gridBackgroundColor(){return this._gridBackgroundColor}set gridBackgroundColor(t){g.value(this._gridBackgroundColor,t)||(this._gridBackgroundColor=t,this.needsInitialization=!0)}get gridLineWidth(){return this._gridLineWidth}set gridLineWidth(t){g.value(this._gridLineWidth,t)||(this._gridLineWidth=t,this.needsInitialization=!0)}get gridLineColor(){return this._gridLineColor}set gridLineColor(t){g.value(this._gridLineColor,t)||(this._gridLineColor=t,this.needsInitialization=!0)}dispose(){}duplicate(t){const e=new O({...this.getNodeOptions(),...this.getDrawableOptions(),rows:this.rows,columns:this.columns,size:this.size,backgroundColor:this.gridBackgroundColor,gridLineWidth:this.gridLineWidth,gridLineColor:this.gridLineColor,name:t});return this.children.length>0&&(e.children=this.children.map(i=>{const n=i.duplicate();return n.parent=e,n})),e}update(){super.update()}draw(t){super.drawChildren(t)}warmup(t){this.initialize(),this.children.filter(e=>e.isDrawable).forEach(e=>{e.warmup(t)})}get gridChildren(){return this._gridChildren}set gridChildren(t){this._gridChildren=t,this.needsInitialization=!0,this.savePropertyChangeEvent("gridChildren",this.gridChildren.map(e=>({node:e.node.uuid,row:e.row,column:e.column})))}removeAllGridChildren(){if(this.gridChildren.length!==0){for(;this.gridChildren.length;)this.gridChildren=this.gridChildren.slice(0,-1);this.needsInitialization=!0}}addAtCell(t,e,i){(e<0||e>=this.rows||i<0||i>=this.columns)&&console.warn(`warning: addAtCell() requested to add node at row ${e}, column ${i}. This is outside the bounds of grid ${this.name}, which is size ${this.rows}x${this.columns}. Note that addAtCell() uses zero-based indexing. AddAtCell() will proceed, but may draw nodes outside the grid`),this.gridChildren=[...this.gridChildren,{node:t,row:e,column:i}],this.needsInitialization=!0}removeAllAtCell(t,e){this.gridChildren=this.gridChildren.filter(i=>i.row!==t&&i.column!==e),this.needsInitialization=!0}removeGridChild(t){this.gridChildren=this.gridChildren.filter(e=>e.node!=t),this.needsInitialization=!0}addChild(t){console.warn("Grid.addChild() was called -- did you mean to call addAtCell() instead?"),super.addChild(t)}removeAllChildren(){console.warn("Grid.removeAllChildren() was called -- did you mean to call removeAllGridChildren() instead?"),super.removeAllChildren()}removeChild(t){console.warn("Grid.removeChild() was called -- did you mean to call removeGridChild() instead?"),super.removeChild(t)}removeChildren(t){console.warn("Grid.removeChildren() was called -- did you mean to call removeGridChild() instead?"),super.removeChildren(t)}}f.registerM2NodeClass(O);class z extends x{constructor(t){super(t),this.compositeType="Button",this.isText=!0,this._backgroundColor=c.Black,this._cornerRadius=9,this._fontSize=20,this._text="",this._fontColor=c.White,this._interpolation={},this._localize=!0,t.text&&(this.text=t.text),t.size?this.size=t.size:this.size={width:200,height:50},t.cornerRadius!==void 0&&(this.cornerRadius=t.cornerRadius),t.fontName&&(this.fontName=t.fontName),t.fontNames&&(this.fontNames=t.fontNames),t.fontSize!==void 0&&(this.fontSize=t.fontSize),t.fontColor&&(this.fontColor=t.fontColor),t.backgroundColor&&(this.backgroundColor=t.backgroundColor),t.interpolation&&(this.interpolation=t.interpolation),t.localize!==void 0&&(this.localize=t.localize),this.saveNodeNewEvent()}get completeNodeOptions(){return{...this.options,...this.getNodeOptions(),...this.getDrawableOptions(),...this.getTextOptions(),size:this.size,cornerRadius:this.cornerRadius,backgroundColor:this.backgroundColor,fontNames:this.fontNames}}initialize(){this.removeAllChildren(),this.backgroundPaint=new this.canvasKit.Paint,this.backgroundPaint.setColor(this.canvasKit.Color(this.backgroundColor[0],this.backgroundColor[1],this.backgroundColor[2],this.backgroundColor[3])),this.backgroundPaint.setStyle(this.canvasKit.PaintStyle.Fill);const t=new p({name:"__"+this.name+"-buttonRectangle",rect:{size:this.size},cornerRadius:this.cornerRadius,fillColor:this._backgroundColor,suppressEvents:!0});this.addChild(t);const e=new v({name:"__"+this.name+"-buttonLabel",text:this.text,localize:this.localize,interpolation:this.interpolation,fontName:this.fontName,fontNames:this.fontNames,fontSize:this.fontSize,fontColor:this.fontColor,suppressEvents:!0});t.addChild(e),this.needsInitialization=!1}dispose(){at.Dispose([this.backgroundPaint])}get text(){return this._text}set text(t){g.value(this._text,t)||(this._text=t,this.needsInitialization=!0,this.savePropertyChangeEvent("text",t))}get backgroundColor(){return this._backgroundColor}set backgroundColor(t){g.value(this._backgroundColor,t)||(this._backgroundColor=t,this.needsInitialization=!0,this.savePropertyChangeEvent("backgroundColor",t))}get fontColor(){return this._fontColor}set fontColor(t){g.value(this._fontColor,t)||(this._fontColor=t,this.needsInitialization=!0,this.savePropertyChangeEvent("fontColor",t))}get fontName(){return this._fontName}set fontName(t){this._fontName!==t&&(this._fontName=t,this.needsInitialization=!0,this.savePropertyChangeEvent("fontName",t))}get fontNames(){return this._fontNames}set fontNames(t){g.value(this._fontNames,t)||(this._fontNames=t,this.needsInitialization=!0,this.savePropertyChangeEvent("fontNames",t))}get cornerRadius(){return this._cornerRadius}set cornerRadius(t){g.value(this._cornerRadius,t)||(this._cornerRadius=t,this.needsInitialization=!0,this.savePropertyChangeEvent("cornerRadius",t))}get fontSize(){return this._fontSize}set fontSize(t){g.value(this._fontSize,t)||(this._fontSize=t,this.needsInitialization=!0,this.savePropertyChangeEvent("fontSize",t))}get interpolation(){return this._interpolation}set interpolation(t){g.value(this._interpolation,t)||(this._interpolation=t,Object.freeze(this._interpolation),this.needsInitialization=!0,this.savePropertyChangeEvent("interpolation",t))}get localize(){return this._localize}set localize(t){g.value(this._localize,t)||(this._localize=t,this.needsInitialization=!0,this.savePropertyChangeEvent("localize",t))}duplicate(t){const e=new z({...this.getNodeOptions(),...this.getDrawableOptions(),...this.getTextOptions(),size:this.size,cornerRadius:this.cornerRadius,backgroundColor:this.backgroundColor,fontColor:this.fontColor,name:t,localize:this.localize,interpolation:JSON.parse(JSON.stringify(this.interpolation)),fontName:this.fontName,fontNames:JSON.parse(JSON.stringify(this.fontNames))});return this.children.length>0&&(e.children=this.children.map(i=>{const n=i.duplicate();return n.parent=e,n})),e}update(){super.update()}draw(t){super.drawChildren(t)}warmup(t){this.initialize(),this.children.filter(e=>e.isDrawable).forEach(e=>{e.warmup(t)})}}f.registerM2NodeClass(z);var J=(b=>(b.Dismiss="Dismiss",b.Positive="Positive",b.Negative="Negative",b))(J||{});class ut extends x{constructor(t){super(t),this.compositeType="Dialog",this._backgroundColor=c.White,this.cornerRadius=9,this.overlayAlpha=.5,this.contentText="",this.positiveButtonText="",this.negativeButtonText="",this._fontColor=c.White,this.zPosition=Number.MAX_VALUE,this.hidden=!0,t&&(t.overlayAlpha&&(this.overlayAlpha=t.overlayAlpha),t.messageText&&(this.contentText=t.messageText),t.positiveButtonText&&(this.positiveButtonText=t.positiveButtonText),t.negativeButtonText&&(this.negativeButtonText=t.negativeButtonText),t.size&&(this.size=t.size),t.cornerRadius&&(this.cornerRadius=t.cornerRadius),t.fontColor&&(this.fontColor=t.fontColor),t.backgroundColor&&(this.backgroundColor=t.backgroundColor))}show(){this.hidden=!1}onDialogResult(t,e){const i={type:u.Composite,compositeType:"DialogResult",nodeUuid:this.uuid,callback:t};e?.replaceExisting&&(this.eventListeners=this.eventListeners.filter(n=>!(n.nodeUuid===i.nodeUuid&&n.type===i.type))),this.eventListeners.push(i)}initialize(){this.removeAllChildren();const t=new p({rect:{width:m2c2Globals.canvasCssWidth,height:m2c2Globals.canvasCssHeight,x:m2c2Globals.canvasCssWidth/2,y:m2c2Globals.canvasCssHeight/2},fillColor:[0,0,0,this.overlayAlpha],zPosition:-1,isUserInteractionEnabled:!0});t.onTapDown(o=>{o.handled=!0,this.hidden=!0,this.eventListeners.length>0&&this.eventListeners.filter(s=>s.type===u.Composite).forEach(s=>{const a={type:u.Composite,target:this,handled:!1,dialogResult:"Dismiss",timestamp:P.now(),iso8601Timestamp:new Date().toISOString()};s.callback(a)})}),this.addChild(t);const e=new p({rect:{width:300,height:150,x:m2c2Globals.canvasCssWidth/2,y:m2c2Globals.canvasCssHeight/2},cornerRadius:this.cornerRadius,fillColor:this.backgroundColor,isUserInteractionEnabled:!0});e.onTapDown(o=>{o.handled=!0}),this.addChild(e);const i=new v({text:this.contentText,fontSize:24,position:{x:200,y:360}});this.addChild(i);const n=new z({text:this.negativeButtonText,position:{x:120,y:440},size:{width:100,height:40},isUserInteractionEnabled:!0,zPosition:1});n.onTapDown(o=>{o.handled=!0,this.hidden=!0}),n.onTapDown(o=>{o.handled=!0,this.hidden=!0,this.eventListeners.length>0&&this.eventListeners.filter(s=>s.type===u.Composite).forEach(s=>{const a={type:u.Composite,target:this,handled:!1,dialogResult:"Negative",timestamp:P.now(),iso8601Timestamp:new Date().toISOString()};s.callback(a)})});const r=new z({text:this.positiveButtonText,position:{x:280,y:440},size:{width:100,height:40},isUserInteractionEnabled:!0,zPosition:1});r.onTapDown(o=>{o.handled=!0,this.hidden=!0,this.eventListeners.length>0&&this.eventListeners.filter(s=>s.type===u.Composite).forEach(s=>{const a={type:u.Composite,target:this,handled:!1,dialogResult:"Positive",timestamp:P.now(),iso8601Timestamp:new Date().toISOString()};s.callback(a)})}),this.addChild(n),this.addChild(r),this.needsInitialization=!1}get backgroundColor(){return this._backgroundColor}set backgroundColor(t){this._backgroundColor=t,this.needsInitialization=!0}get fontColor(){return this._fontColor}set fontColor(t){this._fontColor=t,this.needsInitialization=!0}get hidden(){return this._hidden}set hidden(t){this._hidden=t,this.needsInitialization=!0}duplicate(t){throw new Error(`duplicate not implemented. ${t}`)}update(){super.update()}draw(t){super.drawChildren(t)}warmup(t){this.initialize(),this.children.filter(e=>e.isDrawable).forEach(e=>{e.warmup(t)})}}const y={StrokeStart:"StrokeStart",StrokeMove:"StrokeMove",StrokeEnd:"StrokeEnd"},I={StrokeEnter:"StrokeEnter",StrokeLeave:"StrokeLeave"};class j extends x{constructor(t){if(super(t),this.compositeType="DrawPad",this.resumeDrawingOnReturn=!1,this.continuousDrawingOnly=!1,this._backgroundColor=[0,0,0,0],this._borderColor=c.Black,this._borderWidth=1,this._lineColor=c.Red,this._lineWidth=1,this.isDrawingPointerDown=!1,this.pointerIsDownAndPointerLeftDrawAreaWhenDown=!1,this.currentStrokesNotAllowed=!1,this.strokes=new Array,this.originalOptions=JSON.parse(JSON.stringify(t)),t.isUserInteractionEnabled===void 0&&(this.isUserInteractionEnabled=!0),!t.size)throw new Error("DrawPad size must be specified");this.size=t.size,t.lineColor&&(this.lineColor=t.lineColor),t.lineWidth&&(this.lineWidth=t.lineWidth),t.backgroundColor&&(this.backgroundColor=t.backgroundColor),t.borderColor&&(this.borderColor=t.borderColor),t.borderWidth&&(this.borderWidth=t.borderWidth),t.resumeDrawingOnReturn!==void 0&&(this.resumeDrawingOnReturn=t.resumeDrawingOnReturn),t.continuousDrawingOnly!==void 0&&(this.continuousDrawingOnly=t.continuousDrawingOnly),t.continuousDrawingOnlyExceptionDistance!==void 0&&(this.continuousDrawingOnlyExceptionDistance=t.continuousDrawingOnlyExceptionDistance),this.saveNodeNewEvent()}get completeNodeOptions(){return{...this.options,...this.getNodeOptions(),...this.getDrawableOptions(),...this.originalOptions}}initialize(){this.initializeDrawShape(),this.initializeDrawArea(),this.needsInitialization=!1}initializeDrawShape(){if(!this.drawShape){const t=new ht;this.drawShape=new p({path:t,size:this.size}),this.addChild(this.drawShape)}this.drawShape.strokeColor=this.lineColor,this.drawShape.lineWidth=this.lineWidth}initializeDrawArea(){this.drawArea||(this.drawArea=new p({rect:{size:this.size},isUserInteractionEnabled:!0,suppressEvents:!0}),this.addChild(this.drawArea),this.drawArea.onTapDown(t=>{this.handleTapDown(t)}),this.drawArea.onPointerMove(t=>{this.handlePointerMove(t)}),this.drawArea.onTapUpAny(()=>{this.handleTapUpAny()}),this.drawArea.onTapLeave(t=>{this.handleTapLeave(t)})),this.drawArea.fillColor=this.backgroundColor,this.drawArea.strokeColor=this.borderColor,this.drawArea.lineWidth=this.borderWidth}dist(t,e){return Math.sqrt(Math.pow(e.x-t.x,2)+Math.pow(e.y-t.y,2))}handleTapDown(t){if(this.isUserInteractionEnabled){if(!this.drawShape?.path)throw new Error("DrawPad.handleTapDown(): no drawShape.path");const e=this.drawShape.path;if(this.continuousDrawingOnly&&e.subpaths.length!==0){const n=e.subpaths[e.subpaths.length-1][e.subpaths[e.subpaths.length-1].length-1],r=t.point;if(this.continuousDrawingOnlyExceptionDistance===void 0||this.dist(n,r)>this.continuousDrawingOnlyExceptionDistance){this.currentStrokesNotAllowed=!0;return}}this.currentStrokesNotAllowed=!1,this.isDrawingPointerDown=!0,e.move(t.point);const i={type:y.StrokeStart,target:this,handled:!1,position:t.point,...f.createTimestamps()};this.strokes.push([{type:y.StrokeStart,position:t.point,iso8601Timestamp:new Date().toISOString(),interpolated:!1}]),this.raiseDrawPadEvent(i)}}addInterpolatedStrokeMove(t){const e=this.strokes.length,i=this.strokes[e-1].length,n=this.strokes[this.strokes.length-1][i-1].position,r=this.interpolateToDrawPadBorder(t,n,this.size);if(!this.drawShape?.path)throw new Error("DrawPad.addInterpolatedStrokeMove(): no drawShape.path");this.drawShape.path.addLine(r);const s={type:y.StrokeMove,target:this,handled:!1,position:r,...f.createTimestamps()};return this.strokes[e-1].push({type:y.StrokeMove,position:r,iso8601Timestamp:new Date().toISOString(),interpolated:!0}),this.raiseDrawPadEvent(s),r}handleTapLeave(t){if(this.currentStrokesNotAllowed){this.isDrawingPointerDown=!1;return}if(this.resumeDrawingOnReturn===!1){this.isDrawingPointerDown=!1;const e=this.strokes.length,i=this.strokes[e-1].length;let n=!1,r=t.point;this.isPointWithinDrawPad(t.point,this.size)||(r=this.addInterpolatedStrokeMove(t.point),n=!0);const o={type:y.StrokeEnd,position:this.strokes[e-1][i-1].position,target:this,handled:!1,...f.createTimestamps()};this.strokes[e-1].push({type:y.StrokeEnd,position:n?r:this.strokes[e-1][i-1].position,iso8601Timestamp:new Date().toISOString(),interpolated:n}),this.raiseDrawPadEvent(o),this.currentStrokesNotAllowed=!0}else this.pointerIsDownAndPointerLeftDrawAreaWhenDown=!0}handleTapUpAny(){if(this.currentStrokesNotAllowed){this.isDrawingPointerDown=!1;return}if(this.isUserInteractionEnabled){this.isDrawingPointerDown=!1,this.pointerIsDownAndPointerLeftDrawAreaWhenDown=!1;const t=this.strokes.length,e=this.strokes[t-1].length,i={type:y.StrokeEnd,position:this.strokes[t-1][e-1].position,target:this,handled:!1,...f.createTimestamps()};this.strokes[t-1].push({type:y.StrokeEnd,position:this.strokes[t-1][e-1].position,iso8601Timestamp:new Date().toISOString(),interpolated:!1}),this.raiseDrawPadEvent(i)}}handlePointerMove(t){if(this.isUserInteractionEnabled&&this.isDrawingPointerDown){if(!this.drawShape?.path)throw new Error("DrawPad.handlePointerMove(): no drawShape.path");const e=this.drawShape.path;this.isDrawingPointerDown&&!this.pointerIsDownAndPointerLeftDrawAreaWhenDown&&e.addLine(t.point),this.pointerIsDownAndPointerLeftDrawAreaWhenDown&&(this.pointerIsDownAndPointerLeftDrawAreaWhenDown=!1,e.move(t.point));const i={type:y.StrokeMove,target:this,handled:!1,position:t.point,...f.createTimestamps()},n=this.strokes.length;this.strokes[n-1].push({type:y.StrokeMove,position:t.point,iso8601Timestamp:new Date().toISOString(),interpolated:!1}),this.raiseDrawPadEvent(i)}}update(){super.update()}draw(t){super.drawChildren(t)}raiseDrawPadEvent(t){this.eventListeners.length>0&&this.eventListeners.filter(e=>e.type===t.type).forEach(e=>{e.callback(t)})}raiseDrawPadItemEvent(t,e){t.eventListeners.length>0&&t.eventListeners.filter(i=>i.type===e.type).forEach(i=>{i.callback(e)})}clear(){if(!this.drawShape?.path)throw new Error("DrawPad.clear(): no drawShape.path");this.drawShape.path.clear(),this.strokes=new Array}warmup(t){this.initialize(),this.children.filter(e=>e.isDrawable).forEach(e=>{e.warmup(t)})}onStrokeStart(t,e){this.addEventListener(y.StrokeStart,t,e)}onStrokeMove(t,e){this.addEventListener(y.StrokeMove,t,e)}onStrokeEnd(t,e){this.addEventListener(y.StrokeEnd,t,e)}addItem(t){return Object.defineProperty(t,"drawPadPosition",{get:function(){const e=t.parent;return{get x(){return t.position.x+e.size.width/2},set x(i){t.position.x=i-e.size.width/2},get y(){return t.position.y+e.size.height/2},set y(i){t.position.y=i-e.size.height/2}}},set:function(e){const i=t.parent;t.position.x=e.x-i.size.width/2,t.position.y=e.y-i.size.height/2}}),Object.defineProperty(t,"onStrokeEnter",{value:function(e,i){this.addEventListener(I.StrokeEnter,e,i)}}),Object.defineProperty(t,"onStrokeLeave",{value:function(e,i){this.addEventListener(I.StrokeLeave,e,i)}}),Object.defineProperty(t,"isStrokeWithinBounds",{value:!1,writable:!0}),t.onPointerDown(()=>{if(this.isDrawingPointerDown&&t.isStrokeWithinBounds===!1){t.isStrokeWithinBounds=!0;const e={type:I.StrokeEnter,target:t,...f.createTimestamps()};this.raiseDrawPadItemEvent(t,e)}}),t.onPointerMove(()=>{if(this.isDrawingPointerDown&&t.isStrokeWithinBounds===!1){t.isStrokeWithinBounds=!0;const e={type:I.StrokeEnter,target:t,...f.createTimestamps()};this.raiseDrawPadItemEvent(t,e)}}),t.onPointerLeave(()=>{if(this.isDrawingPointerDown&&t.isStrokeWithinBounds===!0){t.isStrokeWithinBounds=!1;const e={type:I.StrokeLeave,target:t,...f.createTimestamps()};this.raiseDrawPadItemEvent(t,e)}}),t.onPointerUp(()=>{if(t.isStrokeWithinBounds===!0){t.isStrokeWithinBounds=!1;const e={type:I.StrokeLeave,target:t,...f.createTimestamps()};this.raiseDrawPadItemEvent(t,e)}}),this.addChild(t),t.zPosition=-1,t.position.x=t.position.x-this.size.width/2,t.position.y=t.position.y-this.size.height/2,t.isUserInteractionEnabled=!0,t}takeScreenshot(){const t=this.drawArea;if(!t)throw new Error("DrawPad.takeScreenshot(): no drawArea");const e=(t.absolutePosition.x-t.size.width/2)*m2c2Globals.canvasScale,i=(t.absolutePosition.y-t.size.height/2)*m2c2Globals.canvasScale,n=t.size.width*m2c2Globals.canvasScale,r=t.size.height*m2c2Globals.canvasScale,o={alphaType:this.game.canvasKit.AlphaType.Unpremul,colorType:this.game.canvasKit.ColorType.RGBA_8888,colorSpace:this.game.canvasKit.ColorSpace.SRGB,width:n,height:r},a=this.game.snapshots[0].readPixels(e,i,o),h=this.game.canvasKit.MakeImage(o,a,a.length/r);if(!h)throw new Error("DrawPad.takeScreenshot(): no croppedImage");const l=h.encodeToBytes();if(!l)throw new Error("DrawPad.takeScreenshot(): croppedImage.encodeToBytes() failed");return h.delete(),this.arrayBufferToBase64String(l)}isPointWithinDrawPad(t,e){return t.x>=0&&t.x<=e.width&&t.y>=0&&t.y<=e.height}interpolateToDrawPadBorder(t,e,i){const n=(t.y-e.y)/(t.x-e.x),r=t.y-n*t.x,o={x:0,y:0};if(!Number.isFinite(n)){if(o.x=t.x,t.y-e.y>0)return o.y=i.height,o;if(t.y-e.y<0)return o.y=0,o}const s=n*0+r,a=n*i.width+r;if(s>=0&&s<=i.height&&t.x-e.x<0)return o.x=0,o.y=s,o;if(a>=0&&a<=i.height&&t.x-e.x>0)return o.x=i.width,o.y=a,o;const h=(0-r)/n,l=(i.height-r)/n;return h>=0&&h<=i.width&&t.y-e.y<0?(o.x=h,o.y=0,o):l>=0&&l<=i.width&&t.y-e.y>0?(o.x=l,o.y=i.height,o):t}arrayBufferToBase64String(t){let e="";const i=new Uint8Array(t);for(let n=0;n<i.byteLength;n++)e+=String.fromCharCode(i[n]);return window.btoa(e)}get backgroundColor(){return this._backgroundColor}set backgroundColor(t){this._backgroundColor=t,this.needsInitialization=!0}get borderColor(){return this._borderColor}set borderColor(t){this._borderColor=t,this.needsInitialization=!0}get borderWidth(){return this._borderWidth}set borderWidth(t){this._borderWidth=t,this.needsInitialization=!0}get lineColor(){return this._lineColor}set lineColor(t){this._lineColor=t,this.needsInitialization=!0}get lineWidth(){return this._lineWidth}set lineWidth(t){this._lineWidth=t,this.needsInitialization=!0}duplicate(t){throw new Error(`DrawPad.duplicate(): Method not implemented. ${t}`)}}f.registerM2NodeClass(j);class Z extends x{constructor(t){super(t),this.compositeType="VirtualKeyboard",this.keyboardRows=new Array,this.shiftActivated=!1,this.keyShapes=new Array,this.keyLabels=new Array,this.originalOptions=JSON.parse(JSON.stringify(t)),t.isUserInteractionEnabled===void 0&&(this._isUserInteractionEnabled=!0),this.size=t.size,this.position=t.position??{x:0,y:0},this.keyboardHorizontalPaddingPercent=t.keyboardHorizontalPaddingPercent??.02,this.keyboardVerticalPaddingPercent=t.keyboardVerticalPaddingPercent??.025,this.keyHorizontalPaddingPercent=t.keyHorizontalPaddingPercent??.1,this.keyVerticalPaddingPercent=t.keyVerticalPaddingPercent??.1,t.rows!==void 0&&(this.keyboardRows=t.rows.map(e=>e.map(n=>{if(n instanceof Object&&!Array.isArray(n)){const r=n;return n.keyIconShapeOptions&&(n.keyIconShapeOptions.suppressEvents=!0,r.keyIcon=new p(n.keyIconShapeOptions),r.keyIconShapeOptions=void 0),r}else return n}))),this.keysPerRow=t.keysPerRow??NaN,this.fontSize=t.fontSize??NaN,this.fontNames=t.fontNames,this.hiddenKeys=t.hiddenKeys??"",this.capitalLettersOnly=t.capitalLettersOnly??!1,this.keyColor=t.keyColor??c.White,this.keyDownColor=t.keyDownColor??c.Transparent,this.specialKeyDownColor=t.specialKeyDownColor??c.LightSteelBlue,this.backgroundColor=t.backgroundColor??[242,240,244,1],this.showKeyDownPreview=t.showKeyDownPreview??!0,this.saveNodeNewEvent()}get completeNodeOptions(){return{...this.options,...this.getNodeOptions(),...this.getDrawableOptions(),...this.originalOptions}}initialize(){this.game.eventStore.mode===F.Replay&&(this._isUserInteractionEnabled=!1),this.keyboardRows.length===0&&(this.keyboardRows=this.createDefaultKeyboardRows(),this.keysPerRow=this.keyboardRows.reduce((a,h)=>Math.max(a,h.length),0),this.fontSize=this.size.height/this.keyboardRows.length/2.5);const t=new p({rect:{size:this.size},fillColor:this.backgroundColor,suppressEvents:!0});this.addChild(t);const e=this.internalKeyboardRowsToInternalKeyboardConfiguration(this.keyboardRows),i={x:-t.size.width/2,y:-t.size.height/2},n=(this.keyboardVerticalPaddingPercent??.025)*this.size.height,r=(this.keyboardHorizontalPaddingPercent??.02)*this.size.width,o=(this.size.height-2*n)/e.length,s=(this.size.width-2*r)/this.keysPerRow;this.keyShapes=[];for(let a=0;a<e.length;a++){const h=e[a],l=h.reduce((E,w)=>E+(w.widthRatio??1),0);let m=0;l<this.keysPerRow&&(m=(this.size.width-2*r-s*l)/2);for(let E=0;E<h.length;E++){const w=h[E];if(this.hiddenKeys?.split(",").map(C=>C===" "?" ":C.trim()).includes(w.code))continue;const A=h.slice(0,E).reduce((C,W)=>C+(W.widthRatio??1),0)*s,_=new p({rect:{size:{width:s*(w.widthRatio??1),height:o}},fillColor:c.Transparent,strokeColor:c.Transparent,lineWidth:1,position:{x:m+i.x+r+A+(w.widthRatio??1)*s/2,y:i.y+n+a*o+o/2},suppressEvents:!0}),R=s*(w.widthRatio??1)-2*this.keyHorizontalPaddingPercent*s,K=o-(w.heightRatio??1)-2*this.keyVerticalPaddingPercent*o,k=new p({rect:{size:{width:R,height:K}},cornerRadius:4,fillColor:this.keyColor,lineWidth:0,isUserInteractionEnabled:this.isUserInteractionEnabled,suppressEvents:!0});k.userData={code:w.code},_.addChild(k),this.keyShapes.push(k);const L=new v({text:w.labelText,fontSize:this.fontSize,fontNames:this.fontNames,suppressEvents:!0});L.userData={code:w.code},_.addChild(L),this.keyLabels.push(L),w.keyIcon&&_.addChild(w.keyIcon),t.addChild(_),k.onTapUp(C=>{this.handleKeyShapeTapUp(w,k,C)}),k.onTapDown(C=>{this.handleKeyShapeTapDown(w,k,C)}),k.onTapLeave(C=>{this.handleKeyShapeTapLeave(w,k,C)})}}this.letterCircle=new p({circleOfRadius:28,fillColor:c.Silver,hidden:!0,suppressEvents:!0}),t.addChild(this.letterCircle),this.letterCircleLabel=new v({text:"",fontSize:this.fontSize,fontNames:this.fontNames,suppressEvents:!0}),this.letterCircle.addChild(this.letterCircleLabel),this.needsInitialization=!1}onKeyDown(t,e){const i={type:u.Composite,compositeEventType:"VirtualKeyboardKeyDown",compositeType:this.compositeType,nodeUuid:this.uuid,callback:t};this.addVirtualKeyboardEventListener(i,e)}onKeyUp(t,e){const i={type:u.Composite,compositeEventType:"VirtualKeyboardKeyUp",compositeType:this.compositeType,nodeUuid:this.uuid,callback:t};this.addVirtualKeyboardEventListener(i,e)}onKeyLeave(t,e){const i={type:u.Composite,compositeEventType:"VirtualKeyboardKeyLeave",compositeType:this.compositeType,nodeUuid:this.uuid,callback:t};this.addVirtualKeyboardEventListener(i,e)}update(){super.update()}draw(t){super.drawChildren(t)}warmup(t){this.initialize(),this.children.filter(e=>e.isDrawable).forEach(e=>{e.warmup(t)})}duplicate(t){throw new Error(`Method not implemented. ${t}`)}handleKeyShapeTapDown(t,e,i){t.isShift&&(this.shiftActivated=!this.shiftActivated);const n=this.getKeyAsString(t),r={type:u.Composite,compositeType:"VirtualKeyboard",compositeEventType:"VirtualKeyboardKeyDown",target:this,handled:!1,key:n,code:t.code,shiftKey:this.shiftActivated,keyTapMetadata:{size:e.size,point:i.point,buttons:i.buttons},...f.createTimestamps()};this.handleCompositeEvent(r),this.saveEvent(r),this.eventListeners.length>0&&this.eventListeners.filter(o=>o.type===u.Composite&&o.compositeType==="VirtualKeyboard"&&o.compositeEventType==="VirtualKeyboardKeyDown").forEach(o=>{o.callback(r)})}handleKeyShapeTapUp(t,e,i){const n=this.getKeyAsString(t),r={type:u.Composite,compositeType:"VirtualKeyboard",compositeEventType:"VirtualKeyboardKeyUp",target:this,handled:!1,key:n,code:t.code,shiftKey:this.shiftActivated,keyTapMetadata:{size:e.size,point:i.point,buttons:i.buttons},...f.createTimestamps()};this.handleCompositeEvent(r),this.saveEvent(r),this.eventListeners.length>0&&this.eventListeners.filter(o=>o.type===u.Composite&&o.compositeType==="VirtualKeyboard"&&o.compositeEventType==="VirtualKeyboardKeyUp").forEach(o=>{o.callback(r)})}handleKeyShapeTapLeave(t,e,i){const n=this.getKeyAsString(t),r={type:u.Composite,compositeType:"VirtualKeyboard",compositeEventType:"VirtualKeyboardKeyLeave",target:this,handled:!1,key:n,code:t.code,shiftKey:this.shiftActivated,keyTapMetadata:{size:e.size,point:i.point,buttons:i.buttons},...f.createTimestamps()};this.handleCompositeEvent(r),this.saveEvent(r),this.eventListeners.length>0&&this.eventListeners.filter(o=>o.type===u.Composite&&o.compositeType==="VirtualKeyboard"&&o.compositeEventType==="VirtualKeyboardKeyLeave").forEach(o=>{o.callback(r)})}getKeyAsString(t){return t.isShift||t.code===" "||t.code==="Backspace"?t.code:this.shiftActivated?t.labelTextShifted??t.code:t.labelText??t.code}internalKeyboardRowsToInternalKeyboardConfiguration(t){return t.map(e=>e.map(i=>{let n=1;const r=1;let o,s,a,h,l=!1;return typeof i=="string"?(o=i,this.capitalLettersOnly?s=o.toUpperCase():s=o,a=o.toUpperCase()):Array.isArray(i)?(o=i[0],s=o,a=i[1]):(o=i.code,s=i.labelText??"",a=i.labelTextShifted??s,n=i.widthRatio??1,h=i.keyIcon,l=i.isShift??!1),{widthRatio:n,heightRatio:r,code:o,labelText:s,labelTextShifted:a,keyIcon:h,isShift:l}}))}handleCompositeEvent(t){const e=this.internalKeyboardRowsToInternalKeyboardConfiguration(this.keyboardRows),i=this.keyShapes.find(n=>n.userData.code===t.code);if(!i)throw new Error("keyShape is not defined");switch(this.shiftActivated=t.shiftKey,t.compositeEventType){case"VirtualKeyboardKeyDown":{this.handleKeyDownEvent(t,e,i);break}case"VirtualKeyboardKeyUp":{this.handleKeyUpEvent(t,e,i);break}case"VirtualKeyboardKeyLeave":{this.handleKeyLeaveEvent(t,e,i);break}default:throw new Error(`Unknown VirtualKeyboardEvent: ${t.compositeEventType}`)}}handleKeyDownEvent(t,e,i){if(t.code.toLowerCase().includes("shift"))t.shiftKey?this.showKeyboardShifted(e):this.showKeyboardNotShifted(e);else if(t.code===" "||t.code==="Backspace")i.fillColor=this.specialKeyDownColor;else if(i.fillColor=this.keyDownColor,this.showKeyDownPreview){if(!this.letterCircle||!this.letterCircleLabel)throw new Error("letterCircle is not defined");this.letterCircle.hidden=!1;const n=i.parent;if(this.letterCircle.position.x=n.position.x,i.rect?.size?.height===void 0)throw new Error("keyShape.rect.height is undefined");this.letterCircle.position.y=n.position.y-i.rect.size.height*1.2;const o=this.internalKeyboardRowsToInternalKeyboardConfiguration(this.keyboardRows).flat().find(s=>s.code===t.code);if(!o)throw new Error("key is not defined");this.shiftActivated?this.letterCircleLabel.text=o.labelTextShifted??o.code:this.letterCircleLabel.text=o.labelText??o.code}}handleKeyUpEvent(t,e,i){if(!(t.code.toLowerCase().includes("shift")&&t.shiftKey)){if(t.code.toLowerCase().includes("shift")&&!t.shiftKey){this.shiftActivated=!1,this.showKeyboardNotShifted(e);return}if(i.fillColor=this.keyColor,!this.letterCircle)throw new Error("letterCircle is not defined");this.letterCircle.hidden=!0,!t.code.toLowerCase().includes("shift")&&t.shiftKey&&(this.shiftActivated=!1,this.showKeyboardNotShifted(e))}}handleKeyLeaveEvent(t,e,i){if(t.code.toLowerCase().includes("shift")){t.shiftKey?(this.showKeyboardNotShifted(e),this.shiftActivated=!1):(this.showKeyboardShifted(e),this.shiftActivated=!0);return}if(i.fillColor=this.keyColor,!this.letterCircle)throw new Error("letterCircle is not defined");this.letterCircle.hidden=!0}showKeyboardShifted(t){this.keyShapes.filter(n=>n.userData.code.toLowerCase().includes("shift")).forEach(n=>{n.fillColor=this.specialKeyDownColor}),t.flat().filter(n=>n.isShift).forEach(n=>{n.keyIcon&&(n.keyIcon.fillColor=c.Black)}),t.flatMap(n=>n).forEach(n=>{const r=this.keyLabels.find(o=>o.userData.code===n.code);if(!r)throw new Error("keyLabel is not defined");r.text!==void 0&&(r.text=n.labelTextShifted??"")})}showKeyboardNotShifted(t){this.keyShapes.filter(n=>n.userData.code.toLowerCase().includes("shift")).forEach(n=>{n.fillColor=this.keyColor}),t.flat().filter(n=>n.isShift).forEach(n=>{n.keyIcon&&(n.keyIcon.fillColor=c.Transparent)}),t.flatMap(n=>n).forEach(n=>{const r=this.keyLabels.find(o=>o.userData.code===n.code);if(!r)throw new Error("keyLabel is not defined");r.text!==void 0&&(r.text=n.labelText??"")})}createDefaultKeyboardRows(){const t=[["1","!"],["2","@"],["3","#"],["4","$"],["5","%"],["6","^"],["7","&"],["8","*"],["9","("],["0",")"]],e=["q","w","e","r","t","y","u","i","o","p"],i=["a","s","d","f","g","h","j","k","l"],n={path:{pathString:"m288-6.6849e-14 -288 288h144v288h288v-288h144l-288-288z",width:24},lineWidth:2,strokeColor:c.Black,fillColor:c.Transparent,suppressEvents:!0},r={path:{pathString:"M10.625 5.09 0 22.09l10.625 17H44.18v-34H10.625zm31.555 32H11.734l-9.375-15 9.375-15H42.18v30zm-23.293-6.293 7.293-7.293 7.293 7.293 1.414-1.414-7.293-7.293 7.293-7.293-1.414-1.414-7.293 7.293-7.293-7.293-1.414 1.414 7.293 7.293-7.293 7.293",width:24},lineWidth:1,strokeColor:c.Black,fillColor:c.Red,suppressEvents:!0},o=[{code:"Shift",isShift:!0,widthRatio:1.5,keyIcon:new p(n)},"z","x","c","v","b","n","m",{code:"Backspace",widthRatio:1.5,keyIcon:new p(r)}];return[t,e,i,o,[{code:" ",labelText:"SPACE",widthRatio:5}]]}addVirtualKeyboardEventListener(t,e){e?.replaceExisting&&(this.eventListeners=this.eventListeners.filter(i=>!(i.nodeUuid===t.nodeUuid&&i.type===t.type&&i.compositeType===t.compositeType))),this.eventListeners.push(t)}get isUserInteractionEnabled(){return this._isUserInteractionEnabled}set isUserInteractionEnabled(t){this._isUserInteractionEnabled=t,this.keyShapes?.forEach(e=>{e.isUserInteractionEnabled=t})}}f.registerM2NodeClass(Z);const X=$.sinusoidalInOut,Y=500;class pt extends lt{static create(t){const e=new Array;return t.instructionScenes.forEach((i,n)=>{const r=i.nextSceneTransition??t.nextSceneTransition??M.slide({direction:V.Left,duration:Y,easing:X}),o=i.backSceneTransition??t.backSceneTransition??M.slide({direction:V.Right,duration:Y,easing:X}),s=i.backButtonText??t.backButtonText??"Back",a=i.backButtonTextInterpolation??t.backButtonTextInterpolation,h=i.nextButtonText??t.nextButtonText??"Next",l=i.nextButtonTextInterpolation??t.nextButtonTextInterpolation,m=i.backButtonWidth??t.backButtonWidth??125,E=i.nextButtonWidth??t.nextButtonWidth??125,w=i.backButtonHeight??t.backButtonHeight??50,A=i.nextButtonHeight??t.nextButtonHeight??50,_=i.backgroundColor??t.backgroundColor,R=i.imageAboveText??!0,K=i.imageMarginTop??0,k=i.imageMarginBottom??0,L=i.textMarginStart??48,C=i.textMarginEnd??48,W=i.textAlignmentMode??dt.Left,tt=i.textFontSize??16,et=i.titleFontSize??16,it=i.titleMarginTop??48,nt=i.backButtonBackgroundColor??t.backButtonBackgroundColor??c.Black,ot=i.backButtonFontColor??t.backButtonFontColor??c.White,st=i.nextButtonBackgroundColor??t.nextButtonBackgroundColor??c.Black,rt=i.nextButtonFontColor??t.nextButtonFontColor??c.White,U=t.sceneNamePrefix??"instructions",d=new q({name:U+"-"+(n+1).toString().padStart(2,"0"),backgroundColor:_});let H;i.title!==void 0&&(H=new v({text:i.title,interpolation:i.titleInterpolation,fontSize:et,layout:{marginTop:it,constraints:{topToTopOf:d,startToStartOf:d,endToEndOf:d}}}),d.addChild(H));let D;if(i.text!==void 0&&(D=new v({text:i.text,interpolation:i.textInterpolation,preferredMaxLayoutWidth:ct.MatchConstraint,horizontalAlignmentMode:W,fontSize:tt,layout:{marginStart:L,marginEnd:C,constraints:{topToTopOf:d,bottomToBottomOf:d,startToStartOf:d,endToEndOf:d,verticalBias:i.textVerticalBias}}}),d.addChild(D)),i.imageName!==void 0){let T;D!==void 0?R?T=new B({imageName:i.imageName,layout:{marginBottom:k,constraints:{bottomToTopOf:D,startToStartOf:d,endToEndOf:d}}}):T=new B({imageName:i.imageName,layout:{marginTop:K,constraints:{topToBottomOf:D,startToStartOf:d,endToEndOf:d}}}):T=new B({imageName:i.imageName,layout:{constraints:{topToTopOf:d,bottomToBottomOf:d,verticalBias:i.imageVerticalBias,startToStartOf:d,endToEndOf:d}}}),d.addChild(T)}if(n>0){const T=new z({name:"backButton",text:s,interpolation:a,fontColor:ot,backgroundColor:nt,size:{width:m,height:w},layout:{marginStart:32,marginBottom:80,constraints:{bottomToBottomOf:d,startToStartOf:d}}});T.isUserInteractionEnabled=!0,T.onTapDown(()=>{d.game.presentScene(U+"-"+(n+1-1).toString().padStart(2,"0"),o)}),d.addChild(T)}const N=new z({name:"nextButton",text:h,interpolation:l,fontColor:rt,backgroundColor:st,size:{width:E,height:A},layout:{marginEnd:32,marginBottom:80,constraints:{bottomToBottomOf:d,endToEndOf:d}}});N.isUserInteractionEnabled=!0,n!==t.instructionScenes.length-1?N.onTapDown(()=>{d.game.presentScene(U+"-"+(n+1+1).toString().padStart(2,"0"),r)}):t.postInstructionsScene!==void 0?N.onTapDown(()=>{d.game.presentScene(t.postInstructionsScene??"",r)}):N.onTapDown(()=>{const T=d.game.scenes.indexOf(d);if(T===-1)console.warn("warning: postInstructionsScene is not defined, and next scene cannot be determined.");else{const G=T+1;G<d.game.scenes.length?d.game.presentScene(d.game.scenes[G],r):console.warn("warning: postInstructionsScene is not defined, and there is no next scene to present.")}}),d.addChild(N),e.push(d)}),e}static Create(t){return this.create(t)}}const ft=$.sinusoidalInOut,gt=500;class mt extends q{constructor(t){if(super(t),t?.transitionDurationMilliseconds!==void 0&&t?.transition)throw new Error("Both transition and transitionDurationMilliseconds options were provided. Only one should be provided. If using a custom transition, then the duration of that transition must be specified within the custom transition.");let e;if(t?.timerShape?.circle===void 0&&t?.timerShape?.rectangle===void 0||t?.timerShape.circle!==void 0)e=new p({circleOfRadius:t?.timerShape?.circle?.radius??100,layout:{constraints:{topToTopOf:this,bottomToBottomOf:this,startToStartOf:this,endToEndOf:this,verticalBias:t?.shapeVerticalBias??.5}},fillColor:t?.timerShape?.fillColor??c.RoyalBlue}),this.addChild(e);else if(t?.timerShape.rectangle!==void 0)e=new p({rect:{width:t?.timerShape?.rectangle?.width??200,height:t?.timerShape?.rectangle?.height??200},cornerRadius:t?.timerShape?.rectangle?.cornerRadius,layout:{constraints:{topToTopOf:this,bottomToBottomOf:this,startToStartOf:this,endToEndOf:this,verticalBias:t.shapeVerticalBias??.5}},fillColor:t?.timerShape?.fillColor??c.RoyalBlue}),this.addChild(e);else throw new Error("Invalid timer shape options.");const i=Math.floor(t.milliseconds/1e3),n=new v({text:"",fontSize:t?.timerNumbersFontSize??50,fontName:t?.timerNumbersFontName,fontColor:t?.timerNumbersFontColor??c.White});e.addChild(n);const r=new v({text:t?.text??"GET READY",fontSize:t?.textFontSize??50,fontName:t?.textFontName,fontColor:t?.textFontColor,layout:{marginTop:t?.textMarginTop??32,constraints:{topToBottomOf:e,startToStartOf:this,endToEndOf:this}}});this.addChild(r);const o=new Array;for(let s=i-1;s>0;s--)o.push(S.wait({duration:1e3})),o.push(S.custom({callback:()=>{n.text=s.toString()}}));o.push(S.wait({duration:1e3})),o.push(S.custom({callback:()=>{n.text=t?.zeroString??"0"}})),t?.zeroDwellMilliseconds!==void 0&&o.push(S.wait({duration:t.zeroDwellMilliseconds})),o.push(S.custom({callback:()=>{const s=this.game;s.scenes.indexOf(this)===s.scenes.length-1&&s.end();const h=s.scenes[s.scenes.indexOf(this)+1];s.presentScene(h,t?.transition??M.slide({direction:V.Left,duration:t?.transitionDurationMilliseconds??gt,easing:ft}))}})),this.onSetup(()=>{n.text=i.toString()}),this.onAppear(()=>{this.run(S.sequence(o))})}}class wt extends x{constructor(t){super(t),this.compositeType="LocalePicker",this.DEFAULT_FONT_SIZE=24,this.automaticallyChangeLocale=!0,this._localeOptions=new Array,this._backgroundColor=c.White,this._fontSize=this.DEFAULT_FONT_SIZE,this._fontColor=c.Black,this._cornerRadius=8,this._overlayAlpha=.5,this._icon={svgString:'<svg xmlns="http://www.w3.org/2000/svg" width="420" height="420" stroke="#000" fill="none"><path stroke-width="26" d="M209 15a195 195 0 1 0 2 0z"/><path stroke-width="18" d="M210 15v390m195-195H15M59 90a260 260 0 0 0 302 0m0 240a260 260 0 0 0-302 0M195 20a250 250 0 0 0 0 382m30 0a250 250 0 0 0 0-382"/></svg>',height:32,width:32},this._iconPosition={x:32,y:32},this.LEFT_SELECTION_INDICATOR="\xAB",this.RIGHT_SELECTION_INDICATOR="\xBB",this.zPosition=Number.MAX_VALUE,t&&(t.localeOptions&&(this.localeOptions=t.localeOptions),t.backgroundColor&&(this.backgroundColor=t.backgroundColor),t.overlayAlpha!==void 0&&(this.overlayAlpha=t.overlayAlpha),t.fontSize!==void 0&&(this.fontSize=t.fontSize),t.fontColor&&(this.fontColor=t.fontColor),t.cornerRadius&&(this.cornerRadius=t.cornerRadius),t.currentLocale!==void 0&&(this.currentLocale=t.currentLocale),t.icon&&(this.icon=t.icon),t.automaticallyChangeLocale!==void 0&&(this.automaticallyChangeLocale=t.automaticallyChangeLocale))}onResult(t,e){const i={type:u.Composite,compositeType:"LocalePickerResult",nodeUuid:this.uuid,callback:t};e?.replaceExisting&&(this.eventListeners=this.eventListeners.filter(n=>!(n.nodeUuid===i.nodeUuid&&n.type==="LocalePickerResult"))),this.eventListeners.push(i)}initialize(){if(this.currentLocale===void 0&&(this.currentLocale=this.game.i18n?.locale),this.localeOptions.length===0&&Object.keys(this.game.i18n?.translation||{}).filter(a=>a!=="configuration").forEach(a=>{this.localeOptions.push({text:this.game.i18n?.translation[a].localeName||a,locale:a,svg:this.game.i18n?.translation[a].localeSvg})}),this.localeOptions.length===0)throw new Error("No locales available for LocalePicker");this.children.filter(s=>s.name!=="localePickerIcon").forEach(s=>this.removeChild(s)),this.game.imageManager.loadImages([{imageName:"__localePickerIcon",svgString:this.icon.svgString,height:this.icon.height,width:this.icon.width}]),this.iconSprite||(this.iconSprite=new B({name:"localePickerIcon",imageName:"__localePickerIcon",position:this.iconPosition,isUserInteractionEnabled:!0}),this.addChild(this.iconSprite),this.iconSprite.onTapDown(s=>{s.handled=!0,this.setDialogVisibility(!0)}),this.iconSprite.onTapUp(s=>{s.handled=!0}),this.iconSprite.onTapUpAny(s=>{s.handled=!0}),this.iconSprite.onPointerUp(s=>{s.handled=!0}),this.iconSprite.onPointerDown(s=>{s.handled=!0}));const t=new p({rect:{width:m2c2Globals.canvasCssWidth,height:m2c2Globals.canvasCssHeight,x:m2c2Globals.canvasCssWidth/2,y:m2c2Globals.canvasCssHeight/2},fillColor:[0,0,0,this.overlayAlpha],zPosition:-1,isUserInteractionEnabled:!0,hidden:!0});t.onTapUp(s=>{s.handled=!0,this.eventListeners.length>0&&this.eventListeners.filter(a=>a.type==="LocalePickerResult").forEach(a=>{const h={type:u.Composite,compositeType:this.compositeType,compositeEventType:"LocalePickerResult",target:this,handled:!1,result:{locale:void 0},timestamp:P.now(),iso8601Timestamp:new Date().toISOString()};a.callback(h)}),this.setDialogVisibility(!1)}),t.onTapUpAny(s=>{s.handled=!0}),t.onTapDown(s=>{s.handled=!0}),t.onPointerUp(s=>{s.handled=!0}),t.onPointerDown(s=>{s.handled=!0}),this.addChild(t);const e=this.fontSize/this.DEFAULT_FONT_SIZE*50,i=this.localeOptions.length*e,n=m2c2Globals.canvasCssWidth/2,r={x:m2c2Globals.canvasCssWidth/2,y:m2c2Globals.canvasCssHeight/2},o=new p({rect:{width:n,height:i,x:r.x,y:r.y},cornerRadius:this.cornerRadius,fillColor:this.backgroundColor,isUserInteractionEnabled:!0,hidden:!0});o.onTapDown(s=>{s.handled=!0}),o.onTapUp(s=>{s.handled=!0}),o.onTapUpAny(s=>{s.handled=!0}),o.onPointerUp(s=>{s.handled=!0}),o.onPointerDown(s=>{s.handled=!0}),this.addChild(o);for(let s=0;s<this.localeOptions.length;s++){const a=this.localeOptions[s];if(a.svg){this.game.imageManager.loadImages([{imageName:a.text,svgString:a.svg.svgString,height:a.svg.height,width:a.svg.width}]);const h=new B({imageName:a.text,position:{x:r.x,y:r.y+s*e-i/2+e/2},isUserInteractionEnabled:!0,zPosition:1,hidden:!0});if(this.addChild(h),this.currentLocale===a.locale){const l=new v({text:this.LEFT_SELECTION_INDICATOR,fontSize:this.fontSize,fontColor:this.fontColor,position:{x:r.x-a.svg.width/2-this.fontSize/2,y:r.y+s*e-i/2+e/2},hidden:!0,localize:!1});this.addChild(l);const m=new v({text:this.RIGHT_SELECTION_INDICATOR,fontSize:this._fontSize,fontColor:this.fontColor,position:{x:r.x+a.svg.width/2+this.fontSize/2,y:r.y+s*e-i/2+e/2},hidden:!0,localize:!1});this.addChild(m)}h.onTapUp(l=>{l.handled=!0,this.handleLocaleSelection(l,a)}),h.onTapUpAny(l=>{l.handled=!0}),h.onTapDown(l=>{l.handled=!0}),h.onPointerUp(l=>{l.handled=!0}),h.onPointerDown(l=>{l.handled=!0})}else{let h=a.text;this.currentLocale===a.locale&&(h=`${this.LEFT_SELECTION_INDICATOR} ${h} ${this.RIGHT_SELECTION_INDICATOR}`);const l=new v({text:h,fontSize:this.fontSize,fontColor:this.fontColor,position:{x:r.x,y:r.y+s*e-i/2+e/2},isUserInteractionEnabled:!0,zPosition:1,hidden:!0,localize:!1});l.onTapUp(m=>{m.handled=!0,this.handleLocaleSelection(m,a)}),l.onTapUpAny(m=>{m.handled=!0}),l.onTapDown(m=>{m.handled=!0}),l.onPointerUp(m=>{m.handled=!0}),l.onPointerDown(m=>{m.handled=!0}),this.addChild(l)}}this.needsInitialization=!1}handleLocaleSelection(t,e){this.eventListeners.length>0&&this.eventListeners.filter(i=>i.type===u.Composite&&i.compositeType==="LocalePickerResult"&&i.nodeUuid==this.uuid).forEach(i=>{const n={type:u.Composite,compositeType:this.compositeType,compositeEventType:"LocalePickerResult",target:this,handled:!1,result:{locale:e.locale},timestamp:P.now(),iso8601Timestamp:new Date().toISOString()};i.callback(n)}),this.setDialogVisibility(!1),this.automaticallyChangeLocale&&(this.game.i18n?.switchToLocale(e.locale),this.currentLocale=e.locale)}setDialogVisibility(t){this.children.filter(e=>e.name!=="localePickerIcon").forEach(e=>{e.hidden=!t})}get backgroundColor(){return this._backgroundColor}set backgroundColor(t){this._backgroundColor=t,this.needsInitialization=!0}get fontSize(){return this._fontSize}set fontSize(t){this._fontSize=t,this.needsInitialization=!0}get fontColor(){return this._fontColor}set fontColor(t){this._fontColor=t,this.needsInitialization=!0}get cornerRadius(){return this._cornerRadius}set cornerRadius(t){this._cornerRadius=t,this.needsInitialization=!0}get overlayAlpha(){return this._overlayAlpha}set overlayAlpha(t){this._overlayAlpha=t,this.needsInitialization=!0}get icon(){const t=this;return{get svgString(){return t._icon.svgString},set svgString(e){t._icon.svgString=e,t.needsInitialization=!0},get imageName(){return t._icon.imageName},set imageName(e){t._icon.imageName=e,t.needsInitialization=!0},get height(){return t._icon.height},set height(e){t._icon.height=e,t.needsInitialization=!0},get width(){return t._icon.width},set width(e){t._icon.width=e,t.needsInitialization=!0}}}set icon(t){this._icon=t,this.needsInitialization=!0}get iconPosition(){const t=this;return{get x(){return t._iconPosition.x},set x(e){t._iconPosition.x=e,t.iconSprite&&(t.iconSprite.position=t._iconPosition),t.needsInitialization=!0},get y(){return t._iconPosition.y},set y(e){t._iconPosition.y=e,t.iconSprite&&(t.iconSprite.position=t._iconPosition),t.needsInitialization=!0}}}set iconPosition(t){this._iconPosition=t,this.iconSprite&&(this.iconSprite.position=t),this.needsInitialization=!0}get localeOptions(){return this._localeOptions}set localeOptions(t){this._localeOptions=t,this.needsInitialization=!0}get currentLocale(){return this._currentLocale}set currentLocale(t){t!==this.currentLocale&&(this._currentLocale=t,this.needsInitialization=!0)}update(){super.update()}draw(t){super.drawChildren(t)}warmup(t){this.initialize(),this.children.filter(e=>e.isDrawable).forEach(e=>{e.warmup(t)})}duplicate(t){throw new Error(`duplicate not implemented. ${t}`)}}class Q extends x{constructor(t){super(t),this.compositeType="CountdownTimer",this._milliseconds=3e3,this._tickIntervalMilliseconds=1e3,this._fontSize=50,this._fontColor=c.White,this._zeroString="0",this._timerShape={circle:{radius:100},fillColor:c.RoyalBlue},this._textVerticalBias=.5,this.countdownSequence=new Array,this._isRunning=!1,this.hasStopped=!1,this.originalOptions=JSON.parse(JSON.stringify(t)),t.milliseconds&&(this.milliseconds=t.milliseconds),t.tickIntervalMilliseconds&&(this.tickIntervalMilliseconds=t.tickIntervalMilliseconds),t.fontName&&(this.fontName=t.fontName),t.fontSize!==void 0&&(this.fontSize=t.fontSize),t.fontColor&&(this.fontColor=t.fontColor),t.zeroString!==void 0&&(this.zeroString=t.zeroString),t.timerShape&&(this.timerShape=t.timerShape),t.textVerticalBias!==void 0&&(this.textVerticalBias=t.textVerticalBias),this.saveNodeNewEvent()}get completeNodeOptions(){return{...this.options,...this.getNodeOptions(),...this.getDrawableOptions(),...this.originalOptions}}initialize(){if(this.removeAllChildren(),this._isRunning=!1,this.hasStopped=!1,this.timerShape?.circle===void 0&&this.timerShape?.rectangle===void 0||this.timerShape?.circle!==void 0)this.timerShapeNode=new p({circleOfRadius:this.timerShape.circle?.radius??100,fillColor:this.timerShape?.fillColor??c.RoyalBlue,suppressEvents:!0}),this.addChild(this.timerShapeNode);else if(this.timerShape?.rectangle!==void 0)this.timerShapeNode=new p({rect:{width:this.timerShape?.rectangle?.width??200,height:this.timerShape?.rectangle?.height??200},cornerRadius:this.timerShape?.rectangle?.cornerRadius,fillColor:this.timerShape?.fillColor??c.RoyalBlue,suppressEvents:!0}),this.addChild(this.timerShapeNode);else throw new Error("Invalid timer shape options.");if(this.size=this.timerShapeNode.size,this.milliseconds%1e3!==0)throw new Error("CountdownTimer milliseconds must be a multiple of 1000.");const t=Math.floor(this.milliseconds/1e3);this.timerNumberLabel=new v({text:t.toString(),fontSize:this.fontSize,fontName:this._fontName,fontColor:this.fontColor,layout:{constraints:{topToTopOf:this.timerShapeNode,bottomToBottomOf:this.timerShapeNode,startToStartOf:this.timerShapeNode,endToEndOf:this.timerShapeNode,verticalBias:this.textVerticalBias}},suppressEvents:!0}),this.timerShapeNode.addChild(this.timerNumberLabel),this.countdownSequence=new Array;for(let e=this.milliseconds;e>this.tickIntervalMilliseconds;e=e-this.tickIntervalMilliseconds)this.countdownSequence.push(S.wait({duration:this.tickIntervalMilliseconds})),this.countdownSequence.push(S.custom({callback:()=>{this.tick(e-this.tickIntervalMilliseconds)}}));this.countdownSequence.push(S.wait({duration:this.tickIntervalMilliseconds})),this.countdownSequence.push(S.custom({callback:()=>{this.tick(0);const e={type:u.Composite,compositeType:this.compositeType,compositeEventType:"CountdownTimerComplete",target:this,handled:!1,millisecondsRemaining:0,...f.createTimestamps()};this.handleCompositeEvent(e),this.saveEvent(e),this.eventListeners.length>0&&this.eventListeners.filter(i=>i.type===u.Composite&&i.compositeType==="CountdownTimer"&&i.compositeEventType==="CountdownTimerComplete").forEach(i=>{i.callback(e)})}})),this.needsInitialization=!1}tick(t){const e={type:u.Composite,compositeType:this.compositeType,compositeEventType:"CountdownTimerTick",target:this,handled:!1,millisecondsRemaining:t,...f.createTimestamps()};this.handleCompositeEvent(e),this.saveEvent(e),this.eventListeners.length>0&&this.eventListeners.filter(i=>i.type===u.Composite&&i.compositeType==="CountdownTimer"&&i.compositeEventType==="CountdownTimerTick").forEach(i=>{i.callback(e)})}start(){if(this.isRunning)throw new Error("CountdownTimer: cannot start. It is already running.");if(this.hasStopped)throw new Error("CountdownTimer: It has stopped. You cannot start a stopped CountdownTimer. Instead, create a new CountdownTimer or call CountdownTimer.reset() before starting.");this.needsInitialization&&this.initialize(),this.run(S.sequence(this.countdownSequence),"__countdownSequenceAction"),this._isRunning=!0}stop(){this.isRunning&&(this.removeAction("__countdownSequenceAction"),this._isRunning=!1,this.hasStopped=!0)}reset(){this.stop(),this.initialize()}get isRunning(){return this._isRunning}handleCompositeEvent(t){if(!this.timerNumberLabel)throw new Error("Timer number label not found.");switch(t.compositeEventType){case"CountdownTimerTick":{this.timerNumberLabel.text=Math.ceil(t.millisecondsRemaining/1e3).toString();break}case"CountdownTimerComplete":{this.timerNumberLabel.text=this.zeroString;break}default:throw new Error(`Invalid TimerCountdown event type: ${t.compositeEventType}`)}}onTick(t,e){const i={type:u.Composite,compositeEventType:"CountdownTimerTick",compositeType:this.compositeType,nodeUuid:this.uuid,callback:t};this.addCountdownTimerEventListener(i,e)}onComplete(t,e){const i={type:u.Composite,compositeEventType:"CountdownTimerComplete",compositeType:this.compositeType,nodeUuid:this.uuid,callback:t};this.addCountdownTimerEventListener(i,e)}addCountdownTimerEventListener(t,e){e?.replaceExisting&&(this.eventListeners=this.eventListeners.filter(i=>!(i.nodeUuid===t.nodeUuid&&i.type===t.type&&i.compositeType===t.compositeType))),this.eventListeners.push(t)}get milliseconds(){return this._milliseconds}set milliseconds(t){g.value(this._milliseconds,t)||(this._milliseconds=t,this.needsInitialization=!0,this.savePropertyChangeEvent("milliseconds",t))}get tickIntervalMilliseconds(){return this._tickIntervalMilliseconds}set tickIntervalMilliseconds(t){g.value(this._tickIntervalMilliseconds,t)||(this._tickIntervalMilliseconds=t,this.needsInitialization=!0,this.savePropertyChangeEvent("tickIntervalMilliseconds",t))}get fontColor(){return this._fontColor}set fontColor(t){g.value(this._fontColor,t)||(this._fontColor=t,this.needsInitialization=!0,this.savePropertyChangeEvent("fontColor",t))}get fontName(){return this._fontName}set fontName(t){this._fontName!==t&&(this._fontName=t,this.needsInitialization=!0,this.savePropertyChangeEvent("fontName",t))}get fontSize(){return this._fontSize}set fontSize(t){g.value(this._fontSize,t)||(this._fontSize=t,this.needsInitialization=!0,this.savePropertyChangeEvent("fontSize",t))}get zeroString(){return this._zeroString}set zeroString(t){this._zeroString!==t&&(this._zeroString=t,this.needsInitialization=!0,this.savePropertyChangeEvent("zeroString",t))}get timerShape(){return this._timerShape}set timerShape(t){g.value(this._timerShape,t)||(this._timerShape=t,this.needsInitialization=!0,this.savePropertyChangeEvent("timerShape",t))}get textVerticalBias(){return this._textVerticalBias}set textVerticalBias(t){g.value(this._textVerticalBias,t)||(this._textVerticalBias=t,this.needsInitialization=!0,this.savePropertyChangeEvent("textVerticalBias",t))}duplicate(t){throw new Error(`Method not implemented. ${t}`)}update(){super.update()}draw(t){super.drawChildren(t)}warmup(t){this.initialize(),this.children.filter(e=>e.isDrawable).forEach(e=>{e.warmup(t)})}}f.registerM2NodeClass(Q),console.log("\u26AA @m2c2kit/addons version 0.3.26 (1ed4ac2a)");export{z as Button,mt as CountdownScene,Q as CountdownTimer,ut as Dialog,J as DialogResult,j as DrawPad,y as DrawPadEventType,I as DrawPadItemEventType,O as Grid,pt as Instructions,wt as LocalePicker,Z as VirtualKeyboard};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@m2c2kit/addons",
3
- "version": "0.3.25",
3
+ "version": "0.3.26",
4
4
  "description": "Additions to m2c2kit core functionality, such as button, grid, and instructions",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.js",
@@ -30,17 +30,17 @@
30
30
  },
31
31
  "homepage": "https://m2c2-project.github.io/m2c2kit",
32
32
  "dependencies": {
33
- "@m2c2kit/core": "0.3.26"
33
+ "@m2c2kit/core": "0.3.27"
34
34
  },
35
35
  "devDependencies": {
36
- "@m2c2kit/build-helpers": "0.3.22",
36
+ "@m2c2kit/build-helpers": "0.3.23",
37
37
  "@rollup/plugin-replace": "6.0.1",
38
38
  "rimraf": "6.0.1",
39
- "rollup": "4.27.3",
39
+ "rollup": "4.28.0",
40
40
  "rollup-plugin-copy": "3.5.0",
41
41
  "rollup-plugin-dts": "6.1.1",
42
42
  "rollup-plugin-esbuild": "6.1.1",
43
- "typescript": "5.6.3"
43
+ "typescript": "5.7.2"
44
44
  },
45
45
  "engines": {
46
46
  "node": ">=18"