@m2c2kit/addons 0.3.15 → 0.3.16
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.d.ts +267 -48
- package/dist/index.js +869 -412
- package/dist/index.js.map +1 -1
- package/dist/index.min.js +1 -1
- package/package.json +6 -6
package/dist/index.min.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{Composite as _,WebColors as c,Shape as p,Label as x,CanvasKitHelpers as Y,M2EventType as C,MutablePath as Q,Easings as $,Story as tt,Transition as K,TransitionDirection as H,LabelHorizontalAlignmentMode as et,Scene as j,Dimensions as it,Sprite as W,Action as L}from"@m2c2kit/core";class F extends _{constructor(t){if(super(t),this.compositeType="grid",this.rows=0,this.columns=0,this.gridBackgroundColor=[0,0,233,.25],this.gridLineColor=c.Red,this.gridLineWidth=1,this.gridChildren=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("rows must be at least 1");else throw new Error("rows must be specified");if(t.columns)if(t.columns>=1)this.columns=t.columns;else throw new Error("columns must be at least 1");else throw new Error("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}initialize(){super.removeAllChildren(),this.gridBackground=new p({name:"_"+this.name+"-gridBackground",rect:{size:this.size},fillColor:this.gridBackgroundColor,strokeColor:this.gridLineColor,lineWidth:this.gridLineWidth,isUserInteractionEnabled:this.isUserInteractionEnabled}),this.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,rect:{size:{width:this.gridLineWidth,height:this.size.height},origin:{x:-this.size.width/2+this.cellWidth*t,y:0}},fillColor:this.gridLineColor});this.gridBackground.addChild(e)}for(let t=1;t<this.rows;t++){const e=new p({name:"_"+this.name+"-gridHorizontalLine-"+t,rect:{size:{width:this.size.width,height:this.gridLineWidth},origin:{x:0,y:-this.size.height/2+this.cellHeight*t}},fillColor:this.gridLineColor});this.gridBackground.addChild(e)}this.gridChildren&&this.gridChildren.forEach(t=>{if(!this.cellWidth||!this.cellHeight||!this.gridBackground)throw new Error("cellWidth, cellHeight, or gridBackground undefined or null");const e=-this.size.width/2+this.cellWidth/2+t.column*this.cellWidth,i=-this.size.height/2+this.cellHeight/2+t.row*this.cellHeight;t.node.position={x:e+t.node.position.x,y:i+t.node.position.y},this.gridBackground.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}dispose(){}duplicate(t){const e=new F({...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 o=i.duplicate();return o.parent=e,o})),e}update(){super.update()}draw(t){super.drawChildren(t)}warmup(t){this.initialize(),this.children.filter(e=>e.isDrawable).forEach(e=>{e.warmup(t)})}removeAllChildren(){if(this.gridChildren.length!==0){for(;this.gridChildren.length;){const t=this.gridChildren.pop();t&&this.gridBackground.removeChild(t.node)}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.push({node:t,row:e,column:i}),this.needsInitialization=!0}removeAllAtCell(t,e){const i=this.gridChildren.filter(o=>o.row===t&&o.column===e);i.length!==0&&(this.gridBackground.removeChildren(i.map(o=>o.node)),this.gridChildren=this.gridChildren.filter(o=>o.row!==t&&o.column!==e),this.needsInitialization=!0)}removeChild(t){this.gridBackground.removeChild(t),this.gridChildren=this.gridChildren.filter(e=>e.node!=t),this.needsInitialization=!0}}class B extends _{constructor(t){super(t),this.compositeType="button",this._backgroundColor=c.Black,this.size={width:200,height:50},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),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)}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({rect:{size:this.size},cornerRadius:this.cornerRadius,fillColor:this._backgroundColor});this.addChild(t);const e=new x({text:this.text,localize:this.localize,interpolation:this.interpolation,fontName:this.fontName,fontNames:this.fontNames,fontSize:this.fontSize,fontColor:this.fontColor});t.addChild(e),this.needsInitialization=!1}dispose(){Y.Dispose([this.backgroundPaint])}get text(){return this._text}set text(t){this._text=t,this.needsInitialization=!0}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 fontName(){return this._fontName}set fontName(t){this._fontName=t,this.needsInitialization=!0}get fontNames(){return this._fontNames}set fontNames(t){this._fontNames=t,this.needsInitialization=!0}get interpolation(){return this._interpolation}set interpolation(t){this._interpolation=t,Object.freeze(this._interpolation),this.needsInitialization=!0}get localize(){return this._localize}set localize(t){this._localize=t,this.needsInitialization=!0}duplicate(t){const e=new B({...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 o=i.duplicate();return o.parent=e,o})),e}update(){super.update()}draw(t){super.drawChildren(t)}warmup(t){this.initialize(),this.children.filter(e=>e.isDrawable).forEach(e=>{e.warmup(t)})}}var q=(T=>(T.Dismiss="Dismiss",T.Positive="Positive",T.Negative="Negative",T))(q||{});class ot extends _{constructor(t){super(t),this.compositeType="Dialog",this._backgroundColor=c.White,this.cornerRadius=9,this.overlayAlpha=.5,this.contentText="",this.positiveButtonText="",this.negativeButtonText="",this.zPosition=Number.MAX_VALUE,this.hidden=!0,this._fontColor=c.White,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:C.CompositeCustom,compositeType:"DialogResult",nodeUuid:this.uuid,callback:t};e?.replaceExisting&&(this.eventListeners=this.eventListeners.filter(o=>!(o.nodeUuid===i.nodeUuid&&o.type===i.type))),this.eventListeners.push(i)}initialize(){this.removeAllChildren();const t=new p({rect:{width:Globals.canvasCssWidth,height:Globals.canvasCssHeight,x:Globals.canvasCssWidth/2,y:Globals.canvasCssHeight/2},fillColor:[0,0,0,this.overlayAlpha],zPosition:-1,isUserInteractionEnabled:!0});t.onTapDown(r=>{r.handled=!0,this.hidden=!0,this.eventListeners.length>0&&this.eventListeners.filter(n=>n.type===C.CompositeCustom).forEach(n=>{const a={type:C.CompositeCustom,target:this,handled:!1,dialogResult:"Dismiss"};n.callback(a)})}),this.addChild(t);const e=new p({rect:{width:300,height:150,x:Globals.canvasCssWidth/2,y:Globals.canvasCssHeight/2},cornerRadius:this.cornerRadius,fillColor:this.backgroundColor,isUserInteractionEnabled:!0});e.onTapDown(r=>{r.handled=!0}),this.addChild(e);const i=new x({text:this.contentText,fontSize:24,position:{x:200,y:360}});this.addChild(i);const o=new B({text:this.negativeButtonText,position:{x:120,y:440},size:{width:100,height:40},isUserInteractionEnabled:!0,zPosition:1});o.onTapDown(r=>{r.handled=!0,this.hidden=!0}),o.onTapDown(r=>{r.handled=!0,this.hidden=!0,this.eventListeners.length>0&&this.eventListeners.filter(n=>n.type===C.CompositeCustom).forEach(n=>{const a={type:C.CompositeCustom,target:this,handled:!1,dialogResult:"Negative"};n.callback(a)})});const h=new B({text:this.positiveButtonText,position:{x:280,y:440},size:{width:100,height:40},isUserInteractionEnabled:!0,zPosition:1});h.onTapDown(r=>{r.handled=!0,this.hidden=!0,this.eventListeners.length>0&&this.eventListeners.filter(n=>n.type===C.CompositeCustom).forEach(n=>{const a={type:C.CompositeCustom,target:this,handled:!1,dialogResult:"Positive"};n.callback(a)})}),this.addChild(o),this.addChild(h),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}duplicate(t){throw new Error("duplicate not implemented")}update(){super.update()}draw(t){super.drawChildren(t)}warmup(t){this.initialize(),this.children.filter(e=>e.isDrawable).forEach(e=>{e.warmup(t)})}}const k={StrokeStart:"StrokeStart",StrokeMove:"StrokeMove",StrokeEnd:"StrokeEnd"},P={StrokeEnter:"StrokeEnter",StrokeLeave:"StrokeLeave"};class nt extends _{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,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)}initialize(){this.initializeDrawShape(),this.initializeDrawArea(),this.needsInitialization=!1}initializeDrawShape(){if(!this.drawShape){const t=new Q;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}),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 o=e.subpaths[e.subpaths.length-1][e.subpaths[e.subpaths.length-1].length-1],h=t.point;if(this.continuousDrawingOnlyExceptionDistance===void 0||this.dist(o,h)>this.continuousDrawingOnlyExceptionDistance){this.currentStrokesNotAllowed=!0;return}}this.currentStrokesNotAllowed=!1,this.isDrawingPointerDown=!0,e.move(t.point);const i={type:k.StrokeStart,target:this,handled:!1,position:t.point};this.strokes.push([{type:k.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,o=this.strokes[this.strokes.length-1][i-1].position,h=this.interpolateToDrawPadBorder(t,o,this.size);if(!this.drawShape?.path)throw new Error("DrawPad.addInterpolatedStrokeMove(): no drawShape.path");this.drawShape.path.addLine(h);const n={type:k.StrokeMove,target:this,handled:!1,position:h};return this.strokes[e-1].push({type:k.StrokeMove,position:h,iso8601Timestamp:new Date().toISOString(),interpolated:!0}),this.raiseDrawPadEvent(n),h}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 o=!1,h=t.point;this.isPointWithinDrawPad(t.point,this.size)||(h=this.addInterpolatedStrokeMove(t.point),o=!0);const r={type:k.StrokeEnd,position:this.strokes[e-1][i-1].position,target:this,handled:!1};this.strokes[e-1].push({type:k.StrokeEnd,position:o?h:this.strokes[e-1][i-1].position,iso8601Timestamp:new Date().toISOString(),interpolated:o}),this.raiseDrawPadEvent(r),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:k.StrokeEnd,position:this.strokes[t-1][e-1].position,target:this,handled:!1};this.strokes[t-1].push({type:k.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:k.StrokeMove,target:this,handled:!1,position:t.point},o=this.strokes.length;this.strokes[o-1].push({type:k.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(k.StrokeStart,t,e)}onStrokeMove(t,e){this.addEventListener(k.StrokeMove,t,e)}onStrokeEnd(t,e){this.addEventListener(k.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(P.StrokeEnter,e,i)}}),Object.defineProperty(t,"onStrokeLeave",{value:function(e,i){this.addEventListener(P.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:P.StrokeEnter,target:t};this.raiseDrawPadItemEvent(t,e)}}),t.onPointerMove(()=>{if(this.isDrawingPointerDown&&t.isStrokeWithinBounds===!1){t.isStrokeWithinBounds=!0;const e={type:P.StrokeEnter,target:t};this.raiseDrawPadItemEvent(t,e)}}),t.onPointerLeave(()=>{if(this.isDrawingPointerDown&&t.isStrokeWithinBounds===!0){t.isStrokeWithinBounds=!1;const e={type:P.StrokeLeave,target:t};this.raiseDrawPadItemEvent(t,e)}}),t.onPointerUp(()=>{if(t.isStrokeWithinBounds===!0){t.isStrokeWithinBounds=!1;const e={type:P.StrokeLeave,target:t};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)*Globals.canvasScale,i=(t.absolutePosition.y-t.size.height/2)*Globals.canvasScale,o=t.size.width*Globals.canvasScale,h=t.size.height*Globals.canvasScale,r={alphaType:this.game.canvasKit.AlphaType.Unpremul,colorType:this.game.canvasKit.ColorType.RGBA_8888,colorSpace:this.game.canvasKit.ColorSpace.SRGB,width:o,height:h},a=this.game.snapshots[0].readPixels(e,i,r),u=this.game.canvasKit.MakeImage(r,a,a.length/h);if(!u)throw new Error("DrawPad.takeScreenshot(): no croppedImage");const g=u.encodeToBytes();if(!g)throw new Error("DrawPad.takeScreenshot(): croppedImage.encodeToBytes() failed");return u.delete(),this.arrayBufferToBase64String(g)}isPointWithinDrawPad(t,e){return t.x>=0&&t.x<=e.width&&t.y>=0&&t.y<=e.height}interpolateToDrawPadBorder(t,e,i){const o=(t.y-e.y)/(t.x-e.x),h=t.y-o*t.x,r={x:0,y:0};if(!Number.isFinite(o)){if(r.x=t.x,t.y-e.y>0)return r.y=i.height,r;if(t.y-e.y<0)return r.y=0,r}const n=o*0+h,a=o*i.width+h;if(n>=0&&n<=i.height&&t.x-e.x<0)return r.x=0,r.y=n,r;if(a>=0&&a<=i.height&&t.x-e.x>0)return r.x=i.width,r.y=a,r;const u=(0-h)/o,g=(i.height-h)/o;return u>=0&&u<=i.width&&t.y-e.y<0?(r.x=u,r.y=0,r):g>=0&&g<=i.width&&t.y-e.y>0?(r.x=g,r.y=i.height,r):t}arrayBufferToBase64String(t){let e="";const i=new Uint8Array(t);for(let o=0;o<i.byteLength;o++)e+=String.fromCharCode(i[o]);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.")}}class st extends _{constructor(t){super(t),this.compositeType="VirtualKeyboard",this.rowsConfiguration=new Array,this.shiftActivated=!1,this.keyShapes=new Array,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.rowsConfiguration=t.rows.map(e=>e.map(o=>{if(o instanceof Object&&!Array.isArray(o)){const h=o;return o.keyIconShapeOptions&&(h.keyIcon=new p(o.keyIconShapeOptions),h.keyIconShapeOptions=void 0),h}else return o}))),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}initialize(){if(this.rowsConfiguration.length===0){const g=[["1","!"],["2","@"],["3","#"],["4","$"],["5","%"],["6","^"],["7","&"],["8","*"],["9","("],["0",")"]],f=["q","w","e","r","t","y","u","i","o","p"],z=["a","s","d","f","g","h","j","k","l"],I={path:{pathString:"m288-6.6849e-14 -288 288h144v288h288v-288h144l-288-288z",width:24},lineWidth:2,strokeColor:c.Black,fillColor:c.Transparent},w={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},s=[{code:"Shift",isShift:!0,widthRatio:1.5,keyIcon:new p(I)},"z","x","c","v","b","n","m",{code:"Backspace",widthRatio:1.5,keyIcon:new p(w)}],b=[g,f,z,s,[{code:" ",labelText:"SPACE",widthRatio:5}]];this.rowsConfiguration=b,this.keysPerRow=this.rowsConfiguration.reduce((D,A)=>Math.max(D,A.length),0),this.fontSize=this.size.height/this.rowsConfiguration.length/2.5}const t=new p({rect:{size:this.size},fillColor:this.backgroundColor});this.addChild(t);const e=this.rowsConfiguration.map(g=>g.map(f=>{let z=1;const I=1;let w,s,E,b,D=!1;return typeof f=="string"?(w=f,this.capitalLettersOnly?s=w.toUpperCase():s=w,E=w.toUpperCase()):Array.isArray(f)?(w=f[0],s=w,E=f[1]):(w=f.code,s=f.labelText??"",E=f.labelTextShifted??s,z=f.widthRatio??1,b=f.keyIcon,D=f.isShift??!1),{widthRatio:z,heightRatio:I,code:w,labelText:s,labelTextShifted:E,keyIcon:b,isShift:D}})),i={x:-t.size.width/2,y:-t.size.height/2},o=(this.keyboardVerticalPaddingPercent??.025)*this.size.height,h=(this.keyboardHorizontalPaddingPercent??.02)*this.size.width,r=(this.size.height-2*o)/e.length,n=(this.size.width-2*h)/this.keysPerRow;this.keyShapes=[];for(let g=0;g<e.length;g++){const f=e[g],z=f.reduce((w,s)=>w+(s.widthRatio??1),0);let I=0;z<this.keysPerRow&&(I=(this.size.width-2*h-n*z)/2);for(let w=0;w<f.length;w++){const s=f[w];if(this.hiddenKeys?.split(",").map(S=>S.trim()).includes(s.code))continue;const E=f.slice(0,w).reduce((S,y)=>S+(y.widthRatio??1),0)*n,b=new p({rect:{size:{width:n*(s.widthRatio??1),height:r}},fillColor:c.Transparent,strokeColor:c.Transparent,lineWidth:1,position:{x:I+i.x+h+E+(s.widthRatio??1)*n/2,y:i.y+o+g*r+r/2}}),D=n*(s.widthRatio??1)-2*this.keyHorizontalPaddingPercent*n,A=r-(s.heightRatio??1)-2*this.keyVerticalPaddingPercent*r,m=new p({rect:{size:{width:D,height:A}},cornerRadius:4,fillColor:this.keyColor,lineWidth:0,isUserInteractionEnabled:this.isUserInteractionEnabled});b.addChild(m),this.keyShapes.push(m),m.onTapUp(S=>{let y="";s.isShift?(this.shiftActivated?m.fillColor=this.specialKeyDownColor:m.fillColor=this.keyColor,y=s.code):(this.shiftActivated?(this.shiftActivated=!1,this.shiftKeyShape&&(this.shiftKeyShape.fillColor=this.keyColor,s.keyIcon&&(s.keyIcon.fillColor=c.Transparent)),e.flatMap(d=>d).forEach(d=>{d.keyLabel?.text!==void 0&&(d.keyLabel.text=d.labelText??"")}),y=s.labelTextShifted??s.code):y=s.labelText??s.code,(s.code===" "||s.code==="Backspace")&&(y=s.code),m.fillColor=this.keyColor),a.hidden=!0,this.eventListeners.length>0&&this.eventListeners.filter(d=>d.type===C.CompositeCustom&&d.compositeType==="VirtualKeyboardKeyUp").forEach(d=>{const O={type:C.CompositeCustom,target:this,handled:!1,key:y,code:s.code,shiftKey:this.shiftActivated,keyTapMetadata:{size:m.size,point:S.point,buttons:S.buttons}};d.callback(O)})}),m.onTapDown(S=>{s.isShift&&(this.shiftActivated=!this.shiftActivated,this.shiftActivated?(m.fillColor=this.specialKeyDownColor,s.keyIcon&&(s.keyIcon.fillColor=c.Black),e.flatMap(d=>d).forEach(d=>{d.keyLabel?.text!==void 0&&(d.keyLabel.text=d.labelTextShifted??d.labelText??"")})):(m.fillColor=this.keyColor,s.keyIcon&&(s.keyIcon.fillColor=c.Transparent),e.flatMap(d=>d).forEach(d=>{d.keyLabel?.text!==void 0&&(d.keyLabel.text=d.labelText??"")})));let y="";s.isShift||s.code===" "||s.code==="Backspace"?(m.fillColor=this.specialKeyDownColor,y=s.code):(m.fillColor=this.keyDownColor,this.showKeyDownPreview&&(a.hidden=!1,a.position.x=b.position.x,a.position.y=b.position.y-A*1.2,this.shiftActivated?u.text=s.labelTextShifted??s.code:u.text=s.labelText??s.code),this.shiftActivated?y=s.labelTextShifted??s.code:y=s.labelText??s.code),this.eventListeners.length>0&&this.eventListeners.filter(d=>d.type===C.CompositeCustom&&d.compositeType==="VirtualKeyboardKeyDown").forEach(d=>{const O={type:C.CompositeCustom,target:this,handled:!1,key:y,code:s.code,shiftKey:this.shiftActivated,keyTapMetadata:{size:m.size,point:S.point,buttons:S.buttons}};d.callback(O)})}),m.onTapLeave(()=>{m.fillColor=this.keyColor,a.hidden=!0});const M=new x({text:s.labelText,fontSize:this.fontSize,fontNames:this.fontNames});b.addChild(M),s.keyLabel=M,s.isShift&&(this.shiftKeyShape=m),s.keyIcon&&b.addChild(s.keyIcon),t.addChild(b)}}const a=new p({circleOfRadius:28,fillColor:c.Silver,hidden:!0});t.addChild(a);const u=new x({text:"",fontSize:this.fontSize,fontNames:this.fontNames});a.addChild(u),this.needsInitialization=!1}onKeyDown(t,e){const i={type:C.CompositeCustom,compositeType:"VirtualKeyboardKeyDown",nodeUuid:this.uuid,callback:t};this.addVirtualKeyboardEventListener(i,e)}onKeyUp(t,e){const i={type:C.CompositeCustom,compositeType:"VirtualKeyboardKeyUp",nodeUuid:this.uuid,callback:t};this.addVirtualKeyboardEventListener(i,e)}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})}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}`)}}const J=$.sinusoidalInOut,Z=500;class rt extends tt{static create(t){const e=new Array;return t.instructionScenes.forEach((i,o)=>{const h=i.nextSceneTransition??t.nextSceneTransition??K.slide({direction:H.Left,duration:Z,easing:J}),r=i.backSceneTransition??t.backSceneTransition??K.slide({direction:H.Right,duration:Z,easing:J}),n=i.backButtonText??t.backButtonText??"Back",a=i.nextButtonText??t.nextButtonText??"Next",u=i.backButtonWidth??t.backButtonWidth??125,g=i.nextButtonWidth??t.nextButtonWidth??125,f=i.backButtonHeight??t.backButtonHeight??50,z=i.nextButtonHeight??t.nextButtonHeight??50,I=i.backgroundColor??t.backgroundColor,w=i.imageAboveText??!0,s=i.imageMarginTop??0,E=i.imageMarginBottom??0,b=i.textMarginStart??48,D=i.textMarginEnd??48,A=i.textAlignmentMode??et.Left,m=i.textFontSize??16,M=i.titleFontSize??16,S=i.titleMarginTop??48,y=i.backButtonBackgroundColor??t.backButtonBackgroundColor??c.Black,d=i.backButtonFontColor??t.backButtonFontColor??c.White,O=i.nextButtonBackgroundColor??t.nextButtonBackgroundColor??c.Black,X=i.nextButtonFontColor??t.nextButtonFontColor??c.White,U=t.sceneNamePrefix??"instructions",l=new j({name:U+"-"+(o+1).toString().padStart(2,"0"),backgroundColor:I});let G;i.title!==void 0&&(G=new x({text:i.title,fontSize:M,layout:{marginTop:S,constraints:{topToTopOf:l,startToStartOf:l,endToEndOf:l}}}),l.addChild(G));let N;if(i.text!==void 0&&(N=new x({text:i.text,preferredMaxLayoutWidth:it.MatchConstraint,horizontalAlignmentMode:A,fontSize:m,layout:{marginStart:b,marginEnd:D,constraints:{topToTopOf:l,bottomToBottomOf:l,startToStartOf:l,endToEndOf:l,verticalBias:i.textVerticalBias}}}),l.addChild(N)),i.imageName!==void 0){let v;N!==void 0?w?v=new W({imageName:i.imageName,layout:{marginBottom:E,constraints:{bottomToTopOf:N,startToStartOf:l,endToEndOf:l}}}):v=new W({imageName:i.imageName,layout:{marginTop:s,constraints:{topToBottomOf:N,startToStartOf:l,endToEndOf:l}}}):v=new W({imageName:i.imageName,layout:{constraints:{topToTopOf:l,bottomToBottomOf:l,verticalBias:i.imageVerticalBias,startToStartOf:l,endToEndOf:l}}}),l.addChild(v)}if(o>0){const v=new B({text:n,fontColor:d,backgroundColor:y,size:{width:u,height:f},layout:{marginStart:32,marginBottom:80,constraints:{bottomToBottomOf:l,startToStartOf:l}}});v.isUserInteractionEnabled=!0,v.onTapDown(()=>{l.game.presentScene(U+"-"+(o+1-1).toString().padStart(2,"0"),r)}),l.addChild(v)}const R=new B({name:"nextButton",text:a,fontColor:X,backgroundColor:O,size:{width:g,height:z},layout:{marginEnd:32,marginBottom:80,constraints:{bottomToBottomOf:l,endToEndOf:l}}});R.isUserInteractionEnabled=!0,o!==t.instructionScenes.length-1?R.onTapDown(()=>{l.game.presentScene(U+"-"+(o+1+1).toString().padStart(2,"0"),h)}):t.postInstructionsScene!==void 0?R.onTapDown(()=>{l.game.presentScene(t.postInstructionsScene??"",h)}):R.onTapDown(()=>{const v=l.game.scenes.indexOf(l);if(v===-1)console.warn("warning: postInstructionsScene is not defined, and next scene cannot be determined.");else{const V=v+1;V<l.game.scenes.length?l.game.presentScene(l.game.scenes[V],h):console.warn("warning: postInstructionsScene is not defined, and there is no next scene to present.")}}),l.addChild(R),e.push(l)}),e}static Create(t){return this.create(t)}}const at=$.sinusoidalInOut,ht=500;class lt extends j{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?.timerShape?.verticalBias??.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?.timerShape?.verticalBias??.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),o=new x({text:"",fontSize:t?.timerNumbersFontSize??50,fontName:t?.timerNumbersFontName,fontColor:t?.timerNumbersFontColor??c.White});e.addChild(o);const h=new x({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(h);const r=new Array;for(let n=i-1;n>0;n--)r.push(L.wait({duration:1e3})),r.push(L.custom({callback:()=>{o.text=n.toString()}}));r.push(L.wait({duration:1e3})),r.push(L.custom({callback:()=>{o.text=t?.timerZeroString??"0"}})),t?.zeroDwellMilliseconds!==void 0&&r.push(L.wait({duration:t.zeroDwellMilliseconds})),r.push(L.custom({callback:()=>{const n=this.game;n.scenes.indexOf(this)===n.scenes.length-1&&n.end();const u=n.scenes[n.scenes.indexOf(this)+1];n.presentScene(u,t?.transition??K.slide({direction:H.Left,duration:t?.transitionDurationMilliseconds??ht,easing:at}))}})),this.onSetup(()=>{o.text=i.toString()}),this.onAppear(()=>{this.run(L.sequence(r))})}}class dt extends _{constructor(t){super(t),this.compositeType="LocalePicker",this.zPosition=Number.MAX_VALUE,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",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:C.CompositeCustom,compositeType:"LocalePickerResult",nodeUuid:this.uuid,callback:t};e?.replaceExisting&&(this.eventListeners=this.eventListeners.filter(o=>!(o.nodeUuid===i.nodeUuid&&o.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(n=>n.name!=="localePickerIcon").forEach(n=>this.removeChild(n)),this.game.imageManager.loadImages([{imageName:"__localePickerIcon",svgString:this.icon.svgString,height:this.icon.height,width:this.icon.width}]),this.iconSprite||(this.iconSprite=new W({name:"localePickerIcon",imageName:"__localePickerIcon",position:this.iconPosition,isUserInteractionEnabled:!0}),this.addChild(this.iconSprite),this.iconSprite.onTapDown(()=>{this.setDialogVisibility(!0)}));const t=new p({rect:{width:Globals.canvasCssWidth,height:Globals.canvasCssHeight,x:Globals.canvasCssWidth/2,y:Globals.canvasCssHeight/2},fillColor:[0,0,0,this.overlayAlpha],zPosition:-1,isUserInteractionEnabled:!0,hidden:!0});t.onTapDown(n=>{n.handled=!0,this.eventListeners.length>0&&this.eventListeners.filter(a=>a.type==="LocalePickerResult").forEach(a=>{const u={type:"LocalePickerResult",target:this,handled:!1,result:{locale:void 0}};a.callback(u)}),this.setDialogVisibility(!1)}),this.addChild(t);const e=this.fontSize/this.DEFAULT_FONT_SIZE*50,i=this.localeOptions.length*e,o=Globals.canvasCssWidth/2,h={x:Globals.canvasCssWidth/2,y:Globals.canvasCssHeight/2},r=new p({rect:{width:o,height:i,x:h.x,y:h.y},cornerRadius:this.cornerRadius,fillColor:this.backgroundColor,isUserInteractionEnabled:!0,hidden:!0});r.onTapDown(n=>{n.handled=!0}),this.addChild(r);for(let n=0;n<this.localeOptions.length;n++){const a=this.localeOptions[n];if(a.svg){this.game.imageManager.loadImages([{imageName:a.text,svgString:a.svg.svgString,height:a.svg.height,width:a.svg.width}]);const u=new W({imageName:a.text,position:{x:h.x,y:h.y+n*e-i/2+e/2},isUserInteractionEnabled:!0,zPosition:1,hidden:!0});if(this.addChild(u),this.currentLocale===a.locale){const g=new x({text:this.LEFT_SELECTION_INDICATOR,fontSize:this.fontSize,fontColor:this.fontColor,position:{x:h.x-a.svg.width/2,y:h.y+n*e-i/2+e/2},hidden:!0,localize:!1});this.addChild(g);const f=new x({text:this.RIGHT_SELECTION_INDICATOR,fontSize:this._fontSize,fontColor:this.fontColor,position:{x:h.x+a.svg.width/2,y:h.y+n*e-i/2+e/2},hidden:!0,localize:!1});this.addChild(f)}u.onTapDown(g=>{this.handleLocaleSelection(g,a)})}else{let u=a.text;this.currentLocale===a.locale&&(u=`${this.LEFT_SELECTION_INDICATOR} ${u} ${this.RIGHT_SELECTION_INDICATOR}`);const g=new x({text:u,fontSize:this.fontSize,fontColor:this.fontColor,position:{x:h.x,y:h.y+n*e-i/2+e/2},isUserInteractionEnabled:!0,zPosition:1,hidden:!0,localize:!1});g.onTapDown(f=>{this.handleLocaleSelection(f,a)}),this.addChild(g)}}this.needsInitialization=!1}handleLocaleSelection(t,e){t.handled=!0,this.eventListeners.length>0&&this.eventListeners.filter(i=>i.type===C.CompositeCustom&&i.compositeType==="LocalePickerResult"&&i.nodeUuid==this.uuid).forEach(i=>{const o={type:C.CompositeCustom,compositeType:"LocalePickerResult",target:this,handled:!1,result:{locale:e.locale}};i.callback(o)}),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}`)}}console.log("\u26AA @m2c2kit/addons version 0.3.15 (b3a70752)");export{B as Button,lt as CountdownScene,ot as Dialog,q as DialogResult,nt as DrawPad,k as DrawPadEventType,P as DrawPadItemEventType,F as Grid,rt as Instructions,dt as LocalePicker,st as VirtualKeyboard};
|
|
1
|
+
import{M2c2KitHelpers as p,Composite as D,WebColors as d,Shape as u,EventStoreMode as U,Equal as m,Label as b,CanvasKitHelpers as st,M2EventType as g,Timer as O,MutablePath as nt,Easings as $,Story as rt,Transition as H,TransitionDirection as V,LabelHorizontalAlignmentMode as at,Scene as j,Dimensions as ht,Sprite as N,Action as z}from"@m2c2kit/core";class B extends D{constructor(t){if(super(t),this.compositeType="Grid",this._rows=0,this._columns=0,this._gridBackgroundColor=[0,0,255,.25],this._gridLineColor=d.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 u({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 u({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 u({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 u({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:d.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===U.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){m.value(this._rows,t)||(this._rows=t,this.needsInitialization=!0)}get columns(){return this._columns}set columns(t){m.value(this._columns,t)||(this._columns=t,this.needsInitialization=!0)}get gridBackgroundColor(){return this._gridBackgroundColor}set gridBackgroundColor(t){m.value(this._gridBackgroundColor,t)||(this._gridBackgroundColor=t,this.needsInitialization=!0)}get gridLineWidth(){return this._gridLineWidth}set gridLineWidth(t){m.value(this._gridLineWidth,t)||(this._gridLineWidth=t,this.needsInitialization=!0)}get gridLineColor(){return this._gridLineColor}set gridLineColor(t){m.value(this._gridLineColor,t)||(this._gridLineColor=t,this.needsInitialization=!0)}dispose(){}duplicate(t){const e=new B({...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 o=i.duplicate();return o.parent=e,o})),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.game.eventStore.mode===U.Record&&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)}}p.registerM2NodeClass(B);class T extends D{constructor(t){super(t),this.compositeType="Button",this.isText=!0,this._backgroundColor=d.Black,this._cornerRadius=9,this._fontSize=20,this._text="",this._fontColor=d.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 u({name:"__"+this.name+"-buttonRectangle",rect:{size:this.size},cornerRadius:this.cornerRadius,fillColor:this._backgroundColor,suppressEvents:!0});this.addChild(t);const e=new b({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(){st.Dispose([this.backgroundPaint])}get text(){return this._text}set text(t){m.value(this._text,t)||(this._text=t,this.needsInitialization=!0,this.savePropertyChangeEvent("text",t))}get backgroundColor(){return this._backgroundColor}set backgroundColor(t){m.value(this._backgroundColor,t)||(this._backgroundColor=t,this.needsInitialization=!0,this.savePropertyChangeEvent("backgroundColor",t))}get fontColor(){return this._fontColor}set fontColor(t){m.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){m.value(this._fontNames,t)||(this._fontNames=t,this.needsInitialization=!0,this.savePropertyChangeEvent("fontNames",t))}get cornerRadius(){return this._cornerRadius}set cornerRadius(t){m.value(this._cornerRadius,t)||(this._cornerRadius=t,this.needsInitialization=!0,this.savePropertyChangeEvent("cornerRadius",t))}get fontSize(){return this._fontSize}set fontSize(t){m.value(this._fontSize,t)||(this._fontSize=t,this.needsInitialization=!0,this.savePropertyChangeEvent("fontSize",t))}get interpolation(){return this._interpolation}set interpolation(t){m.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){m.value(this._localize,t)||(this._localize=t,this.needsInitialization=!0,this.savePropertyChangeEvent("localize",t))}duplicate(t){const e=new T({...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 o=i.duplicate();return o.parent=e,o})),e}update(){super.update()}draw(t){super.drawChildren(t)}warmup(t){this.initialize(),this.children.filter(e=>e.isDrawable).forEach(e=>{e.warmup(t)})}}p.registerM2NodeClass(T);var J=(S=>(S.Dismiss="Dismiss",S.Positive="Positive",S.Negative="Negative",S))(J||{});class lt extends D{constructor(t){super(t),this.compositeType="Dialog",this._backgroundColor=d.White,this.cornerRadius=9,this.overlayAlpha=.5,this.contentText="",this.positiveButtonText="",this.negativeButtonText="",this._fontColor=d.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:g.Composite,compositeType:"DialogResult",nodeUuid:this.uuid,callback:t};e?.replaceExisting&&(this.eventListeners=this.eventListeners.filter(o=>!(o.nodeUuid===i.nodeUuid&&o.type===i.type))),this.eventListeners.push(i)}initialize(){this.removeAllChildren();const t=new u({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(s=>{s.handled=!0,this.hidden=!0,this.eventListeners.length>0&&this.eventListeners.filter(r=>r.type===g.Composite).forEach(r=>{const a={type:g.Composite,target:this,handled:!1,dialogResult:"Dismiss",timestamp:O.now(),iso8601Timestamp:new Date().toISOString()};r.callback(a)})}),this.addChild(t);const e=new u({rect:{width:300,height:150,x:m2c2Globals.canvasCssWidth/2,y:m2c2Globals.canvasCssHeight/2},cornerRadius:this.cornerRadius,fillColor:this.backgroundColor,isUserInteractionEnabled:!0});e.onTapDown(s=>{s.handled=!0}),this.addChild(e);const i=new b({text:this.contentText,fontSize:24,position:{x:200,y:360}});this.addChild(i);const o=new T({text:this.negativeButtonText,position:{x:120,y:440},size:{width:100,height:40},isUserInteractionEnabled:!0,zPosition:1});o.onTapDown(s=>{s.handled=!0,this.hidden=!0}),o.onTapDown(s=>{s.handled=!0,this.hidden=!0,this.eventListeners.length>0&&this.eventListeners.filter(r=>r.type===g.Composite).forEach(r=>{const a={type:g.Composite,target:this,handled:!1,dialogResult:"Negative",timestamp:O.now(),iso8601Timestamp:new Date().toISOString()};r.callback(a)})});const n=new T({text:this.positiveButtonText,position:{x:280,y:440},size:{width:100,height:40},isUserInteractionEnabled:!0,zPosition:1});n.onTapDown(s=>{s.handled=!0,this.hidden=!0,this.eventListeners.length>0&&this.eventListeners.filter(r=>r.type===g.Composite).forEach(r=>{const a={type:g.Composite,target:this,handled:!1,dialogResult:"Positive",timestamp:O.now(),iso8601Timestamp:new Date().toISOString()};r.callback(a)})}),this.addChild(o),this.addChild(n),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}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 w={StrokeStart:"StrokeStart",StrokeMove:"StrokeMove",StrokeEnd:"StrokeEnd"},x={StrokeEnter:"StrokeEnter",StrokeLeave:"StrokeLeave"};class q extends D{constructor(t){if(super(t),this.compositeType="DrawPad",this.resumeDrawingOnReturn=!1,this.continuousDrawingOnly=!1,this._backgroundColor=[0,0,0,0],this._borderColor=d.Black,this._borderWidth=1,this._lineColor=d.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 nt;this.drawShape=new u({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 u({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 o=e.subpaths[e.subpaths.length-1][e.subpaths[e.subpaths.length-1].length-1],n=t.point;if(this.continuousDrawingOnlyExceptionDistance===void 0||this.dist(o,n)>this.continuousDrawingOnlyExceptionDistance){this.currentStrokesNotAllowed=!0;return}}this.currentStrokesNotAllowed=!1,this.isDrawingPointerDown=!0,e.move(t.point);const i={type:w.StrokeStart,target:this,handled:!1,position:t.point,...p.createTimestamps()};this.strokes.push([{type:w.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,o=this.strokes[this.strokes.length-1][i-1].position,n=this.interpolateToDrawPadBorder(t,o,this.size);if(!this.drawShape?.path)throw new Error("DrawPad.addInterpolatedStrokeMove(): no drawShape.path");this.drawShape.path.addLine(n);const r={type:w.StrokeMove,target:this,handled:!1,position:n,...p.createTimestamps()};return this.strokes[e-1].push({type:w.StrokeMove,position:n,iso8601Timestamp:new Date().toISOString(),interpolated:!0}),this.raiseDrawPadEvent(r),n}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 o=!1,n=t.point;this.isPointWithinDrawPad(t.point,this.size)||(n=this.addInterpolatedStrokeMove(t.point),o=!0);const s={type:w.StrokeEnd,position:this.strokes[e-1][i-1].position,target:this,handled:!1,...p.createTimestamps()};this.strokes[e-1].push({type:w.StrokeEnd,position:o?n:this.strokes[e-1][i-1].position,iso8601Timestamp:new Date().toISOString(),interpolated:o}),this.raiseDrawPadEvent(s),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:w.StrokeEnd,position:this.strokes[t-1][e-1].position,target:this,handled:!1,...p.createTimestamps()};this.strokes[t-1].push({type:w.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:w.StrokeMove,target:this,handled:!1,position:t.point,...p.createTimestamps()},o=this.strokes.length;this.strokes[o-1].push({type:w.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(w.StrokeStart,t,e)}onStrokeMove(t,e){this.addEventListener(w.StrokeMove,t,e)}onStrokeEnd(t,e){this.addEventListener(w.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(x.StrokeEnter,e,i)}}),Object.defineProperty(t,"onStrokeLeave",{value:function(e,i){this.addEventListener(x.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:x.StrokeEnter,target:t,...p.createTimestamps()};this.raiseDrawPadItemEvent(t,e)}}),t.onPointerMove(()=>{if(this.isDrawingPointerDown&&t.isStrokeWithinBounds===!1){t.isStrokeWithinBounds=!0;const e={type:x.StrokeEnter,target:t,...p.createTimestamps()};this.raiseDrawPadItemEvent(t,e)}}),t.onPointerLeave(()=>{if(this.isDrawingPointerDown&&t.isStrokeWithinBounds===!0){t.isStrokeWithinBounds=!1;const e={type:x.StrokeLeave,target:t,...p.createTimestamps()};this.raiseDrawPadItemEvent(t,e)}}),t.onPointerUp(()=>{if(t.isStrokeWithinBounds===!0){t.isStrokeWithinBounds=!1;const e={type:x.StrokeLeave,target:t,...p.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,o=t.size.width*m2c2Globals.canvasScale,n=t.size.height*m2c2Globals.canvasScale,s={alphaType:this.game.canvasKit.AlphaType.Unpremul,colorType:this.game.canvasKit.ColorType.RGBA_8888,colorSpace:this.game.canvasKit.ColorSpace.SRGB,width:o,height:n},a=this.game.snapshots[0].readPixels(e,i,s),l=this.game.canvasKit.MakeImage(s,a,a.length/n);if(!l)throw new Error("DrawPad.takeScreenshot(): no croppedImage");const c=l.encodeToBytes();if(!c)throw new Error("DrawPad.takeScreenshot(): croppedImage.encodeToBytes() failed");return l.delete(),this.arrayBufferToBase64String(c)}isPointWithinDrawPad(t,e){return t.x>=0&&t.x<=e.width&&t.y>=0&&t.y<=e.height}interpolateToDrawPadBorder(t,e,i){const o=(t.y-e.y)/(t.x-e.x),n=t.y-o*t.x,s={x:0,y:0};if(!Number.isFinite(o)){if(s.x=t.x,t.y-e.y>0)return s.y=i.height,s;if(t.y-e.y<0)return s.y=0,s}const r=o*0+n,a=o*i.width+n;if(r>=0&&r<=i.height&&t.x-e.x<0)return s.x=0,s.y=r,s;if(a>=0&&a<=i.height&&t.x-e.x>0)return s.x=i.width,s.y=a,s;const l=(0-n)/o,c=(i.height-n)/o;return l>=0&&l<=i.width&&t.y-e.y<0?(s.x=l,s.y=0,s):c>=0&&c<=i.width&&t.y-e.y>0?(s.x=c,s.y=i.height,s):t}arrayBufferToBase64String(t){let e="";const i=new Uint8Array(t);for(let o=0;o<i.byteLength;o++)e+=String.fromCharCode(i[o]);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}`)}}p.registerM2NodeClass(q);class Z extends D{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(o=>{if(o instanceof Object&&!Array.isArray(o)){const n=o;return o.keyIconShapeOptions&&(o.keyIconShapeOptions.suppressEvents=!0,n.keyIcon=new u(o.keyIconShapeOptions),n.keyIconShapeOptions=void 0),n}else return o}))),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??d.White,this.keyDownColor=t.keyDownColor??d.Transparent,this.specialKeyDownColor=t.specialKeyDownColor??d.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===U.Replay&&(this._isUserInteractionEnabled=!1),this.keyboardRows.length===0&&(this.keyboardRows=this.createDefaultKeyboardRows(),this.keysPerRow=this.keyboardRows.reduce((a,l)=>Math.max(a,l.length),0),this.fontSize=this.size.height/this.keyboardRows.length/2.5);const t=new u({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},o=(this.keyboardVerticalPaddingPercent??.025)*this.size.height,n=(this.keyboardHorizontalPaddingPercent??.02)*this.size.width,s=(this.size.height-2*o)/e.length,r=(this.size.width-2*n)/this.keysPerRow;this.keyShapes=[];for(let a=0;a<e.length;a++){const l=e[a],c=l.reduce((E,f)=>E+(f.widthRatio??1),0);let k=0;c<this.keysPerRow&&(k=(this.size.width-2*n-r*c)/2);for(let E=0;E<l.length;E++){const f=l[E];if(this.hiddenKeys?.split(",").map(y=>y===" "?" ":y.trim()).includes(f.code))continue;const A=l.slice(0,E).reduce((y,W)=>y+(W.widthRatio??1),0)*r,I=new u({rect:{size:{width:r*(f.widthRatio??1),height:s}},fillColor:d.Transparent,strokeColor:d.Transparent,lineWidth:1,position:{x:k+i.x+n+A+(f.widthRatio??1)*r/2,y:i.y+o+a*s+s/2},suppressEvents:!0}),R=r*(f.widthRatio??1)-2*this.keyHorizontalPaddingPercent*r,K=s-(f.heightRatio??1)-2*this.keyVerticalPaddingPercent*s,C=new u({rect:{size:{width:R,height:K}},cornerRadius:4,fillColor:this.keyColor,lineWidth:0,isUserInteractionEnabled:this.isUserInteractionEnabled,suppressEvents:!0});C.userData={code:f.code},I.addChild(C),this.keyShapes.push(C);const L=new b({text:f.labelText,fontSize:this.fontSize,fontNames:this.fontNames,suppressEvents:!0});L.userData={code:f.code},I.addChild(L),this.keyLabels.push(L),f.keyIcon&&I.addChild(f.keyIcon),t.addChild(I),C.onTapUp(y=>{this.handleKeyShapeTapUp(f,C,y)}),C.onTapDown(y=>{this.handleKeyShapeTapDown(f,C,y)}),C.onTapLeave(y=>{this.handleKeyShapeTapLeave(f,C,y)})}}this.letterCircle=new u({circleOfRadius:28,fillColor:d.Silver,hidden:!0,suppressEvents:!0}),t.addChild(this.letterCircle),this.letterCircleLabel=new b({text:"",fontSize:this.fontSize,fontNames:this.fontNames,suppressEvents:!0}),this.letterCircle.addChild(this.letterCircleLabel),this.needsInitialization=!1}onKeyDown(t,e){const i={type:g.Composite,compositeEventType:"VirtualKeyboardKeyDown",compositeType:this.compositeType,nodeUuid:this.uuid,callback:t};this.addVirtualKeyboardEventListener(i,e)}onKeyUp(t,e){const i={type:g.Composite,compositeEventType:"VirtualKeyboardKeyUp",compositeType:this.compositeType,nodeUuid:this.uuid,callback:t};this.addVirtualKeyboardEventListener(i,e)}onKeyLeave(t,e){const i={type:g.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 o=this.getKeyAsString(t),n={type:g.Composite,compositeType:"VirtualKeyboard",compositeEventType:"VirtualKeyboardKeyDown",target:this,handled:!1,key:o,code:t.code,shiftKey:this.shiftActivated,keyTapMetadata:{size:e.size,point:i.point,buttons:i.buttons},...p.createTimestamps()};this.handleCompositeEvent(n),this.saveEvent(n),this.eventListeners.length>0&&this.eventListeners.filter(s=>s.type===g.Composite&&s.compositeType==="VirtualKeyboard"&&s.compositeEventType==="VirtualKeyboardKeyDown").forEach(s=>{s.callback(n)})}handleKeyShapeTapUp(t,e,i){const o=this.getKeyAsString(t),n={type:g.Composite,compositeType:"VirtualKeyboard",compositeEventType:"VirtualKeyboardKeyUp",target:this,handled:!1,key:o,code:t.code,shiftKey:this.shiftActivated,keyTapMetadata:{size:e.size,point:i.point,buttons:i.buttons},...p.createTimestamps()};this.handleCompositeEvent(n),this.saveEvent(n),this.eventListeners.length>0&&this.eventListeners.filter(s=>s.type===g.Composite&&s.compositeType==="VirtualKeyboard"&&s.compositeEventType==="VirtualKeyboardKeyUp").forEach(s=>{s.callback(n)})}handleKeyShapeTapLeave(t,e,i){const o=this.getKeyAsString(t),n={type:g.Composite,compositeType:"VirtualKeyboard",compositeEventType:"VirtualKeyboardKeyLeave",target:this,handled:!1,key:o,code:t.code,shiftKey:this.shiftActivated,keyTapMetadata:{size:e.size,point:i.point,buttons:i.buttons},...p.createTimestamps()};this.handleCompositeEvent(n),this.saveEvent(n),this.eventListeners.length>0&&this.eventListeners.filter(s=>s.type===g.Composite&&s.compositeType==="VirtualKeyboard"&&s.compositeEventType==="VirtualKeyboardKeyLeave").forEach(s=>{s.callback(n)})}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 o=1;const n=1;let s,r,a,l,c=!1;return typeof i=="string"?(s=i,this.capitalLettersOnly?r=s.toUpperCase():r=s,a=s.toUpperCase()):Array.isArray(i)?(s=i[0],r=s,a=i[1]):(s=i.code,r=i.labelText??"",a=i.labelTextShifted??r,o=i.widthRatio??1,l=i.keyIcon,c=i.isShift??!1),{widthRatio:o,heightRatio:n,code:s,labelText:r,labelTextShifted:a,keyIcon:l,isShift:c}}))}handleCompositeEvent(t){const e=this.internalKeyboardRowsToInternalKeyboardConfiguration(this.keyboardRows),i=this.keyShapes.find(o=>o.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 o=i.parent;if(this.letterCircle.position.x=o.position.x,i.rect?.size?.height===void 0)throw new Error("keyShape.rect.height is undefined");this.letterCircle.position.y=o.position.y-i.rect.size.height*1.2;const s=this.internalKeyboardRowsToInternalKeyboardConfiguration(this.keyboardRows).flat().find(r=>r.code===t.code);if(!s)throw new Error("key is not defined");this.shiftActivated?this.letterCircleLabel.text=s.labelTextShifted??s.code:this.letterCircleLabel.text=s.labelText??s.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(o=>o.userData.code.toLowerCase().includes("shift")).forEach(o=>{o.fillColor=this.specialKeyDownColor}),t.flat().filter(o=>o.isShift).forEach(o=>{o.keyIcon&&(o.keyIcon.fillColor=d.Black)}),t.flatMap(o=>o).forEach(o=>{const n=this.keyLabels.find(s=>s.userData.code===o.code);if(!n)throw new Error("keyLabel is not defined");n.text!==void 0&&(n.text=o.labelTextShifted??"")})}showKeyboardNotShifted(t){this.keyShapes.filter(o=>o.userData.code.toLowerCase().includes("shift")).forEach(o=>{o.fillColor=this.keyColor}),t.flat().filter(o=>o.isShift).forEach(o=>{o.keyIcon&&(o.keyIcon.fillColor=d.Transparent)}),t.flatMap(o=>o).forEach(o=>{const n=this.keyLabels.find(s=>s.userData.code===o.code);if(!n)throw new Error("keyLabel is not defined");n.text!==void 0&&(n.text=o.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"],o={path:{pathString:"m288-6.6849e-14 -288 288h144v288h288v-288h144l-288-288z",width:24},lineWidth:2,strokeColor:d.Black,fillColor:d.Transparent,suppressEvents:!0},n={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:d.Black,fillColor:d.Red,suppressEvents:!0},s=[{code:"Shift",isShift:!0,widthRatio:1.5,keyIcon:new u(o)},"z","x","c","v","b","n","m",{code:"Backspace",widthRatio:1.5,keyIcon:new u(n)}];return[t,e,i,s,[{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})}}p.registerM2NodeClass(Z);const X=$.sinusoidalInOut,Y=500;class dt extends rt{static create(t){const e=new Array;return t.instructionScenes.forEach((i,o)=>{const n=i.nextSceneTransition??t.nextSceneTransition??H.slide({direction:V.Left,duration:Y,easing:X}),s=i.backSceneTransition??t.backSceneTransition??H.slide({direction:V.Right,duration:Y,easing:X}),r=i.backButtonText??t.backButtonText??"Back",a=i.nextButtonText??t.nextButtonText??"Next",l=i.backButtonWidth??t.backButtonWidth??125,c=i.nextButtonWidth??t.nextButtonWidth??125,k=i.backButtonHeight??t.backButtonHeight??50,E=i.nextButtonHeight??t.nextButtonHeight??50,f=i.backgroundColor??t.backgroundColor,A=i.imageAboveText??!0,I=i.imageMarginTop??0,R=i.imageMarginBottom??0,K=i.textMarginStart??48,C=i.textMarginEnd??48,L=i.textAlignmentMode??at.Left,y=i.textFontSize??16,W=i.titleFontSize??16,Q=i.titleMarginTop??48,tt=i.backButtonBackgroundColor??t.backButtonBackgroundColor??d.Black,et=i.backButtonFontColor??t.backButtonFontColor??d.White,it=i.nextButtonBackgroundColor??t.nextButtonBackgroundColor??d.Black,ot=i.nextButtonFontColor??t.nextButtonFontColor??d.White,M=t.sceneNamePrefix??"instructions",h=new j({name:M+"-"+(o+1).toString().padStart(2,"0"),backgroundColor:f});let G;i.title!==void 0&&(G=new b({text:i.title,fontSize:W,layout:{marginTop:Q,constraints:{topToTopOf:h,startToStartOf:h,endToEndOf:h}}}),h.addChild(G));let _;if(i.text!==void 0&&(_=new b({text:i.text,preferredMaxLayoutWidth:ht.MatchConstraint,horizontalAlignmentMode:L,fontSize:y,layout:{marginStart:K,marginEnd:C,constraints:{topToTopOf:h,bottomToBottomOf:h,startToStartOf:h,endToEndOf:h,verticalBias:i.textVerticalBias}}}),h.addChild(_)),i.imageName!==void 0){let v;_!==void 0?A?v=new N({imageName:i.imageName,layout:{marginBottom:R,constraints:{bottomToTopOf:_,startToStartOf:h,endToEndOf:h}}}):v=new N({imageName:i.imageName,layout:{marginTop:I,constraints:{topToBottomOf:_,startToStartOf:h,endToEndOf:h}}}):v=new N({imageName:i.imageName,layout:{constraints:{topToTopOf:h,bottomToBottomOf:h,verticalBias:i.imageVerticalBias,startToStartOf:h,endToEndOf:h}}}),h.addChild(v)}if(o>0){const v=new T({text:r,fontColor:et,backgroundColor:tt,size:{width:l,height:k},layout:{marginStart:32,marginBottom:80,constraints:{bottomToBottomOf:h,startToStartOf:h}}});v.isUserInteractionEnabled=!0,v.onTapDown(()=>{h.game.presentScene(M+"-"+(o+1-1).toString().padStart(2,"0"),s)}),h.addChild(v)}const P=new T({name:"nextButton",text:a,fontColor:ot,backgroundColor:it,size:{width:c,height:E},layout:{marginEnd:32,marginBottom:80,constraints:{bottomToBottomOf:h,endToEndOf:h}}});P.isUserInteractionEnabled=!0,o!==t.instructionScenes.length-1?P.onTapDown(()=>{h.game.presentScene(M+"-"+(o+1+1).toString().padStart(2,"0"),n)}):t.postInstructionsScene!==void 0?P.onTapDown(()=>{h.game.presentScene(t.postInstructionsScene??"",n)}):P.onTapDown(()=>{const v=h.game.scenes.indexOf(h);if(v===-1)console.warn("warning: postInstructionsScene is not defined, and next scene cannot be determined.");else{const F=v+1;F<h.game.scenes.length?h.game.presentScene(h.game.scenes[F],n):console.warn("warning: postInstructionsScene is not defined, and there is no next scene to present.")}}),h.addChild(P),e.push(h)}),e}static Create(t){return this.create(t)}}const ct=$.sinusoidalInOut,ut=500;class gt extends j{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 u({circleOfRadius:t?.timerShape?.circle?.radius??100,layout:{constraints:{topToTopOf:this,bottomToBottomOf:this,startToStartOf:this,endToEndOf:this,verticalBias:t?.timerShape?.verticalBias??.5}},fillColor:t?.timerShape?.fillColor??d.RoyalBlue}),this.addChild(e);else if(t?.timerShape.rectangle!==void 0)e=new u({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?.timerShape?.verticalBias??.5}},fillColor:t?.timerShape?.fillColor??d.RoyalBlue}),this.addChild(e);else throw new Error("Invalid timer shape options.");const i=Math.floor(t.milliseconds/1e3),o=new b({text:"",fontSize:t?.timerNumbersFontSize??50,fontName:t?.timerNumbersFontName,fontColor:t?.timerNumbersFontColor??d.White});e.addChild(o);const n=new b({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(n);const s=new Array;for(let r=i-1;r>0;r--)s.push(z.wait({duration:1e3})),s.push(z.custom({callback:()=>{o.text=r.toString()}}));s.push(z.wait({duration:1e3})),s.push(z.custom({callback:()=>{o.text=t?.timerZeroString??"0"}})),t?.zeroDwellMilliseconds!==void 0&&s.push(z.wait({duration:t.zeroDwellMilliseconds})),s.push(z.custom({callback:()=>{const r=this.game;r.scenes.indexOf(this)===r.scenes.length-1&&r.end();const l=r.scenes[r.scenes.indexOf(this)+1];r.presentScene(l,t?.transition??H.slide({direction:V.Left,duration:t?.transitionDurationMilliseconds??ut,easing:ct}))}})),this.onSetup(()=>{o.text=i.toString()}),this.onAppear(()=>{this.run(z.sequence(s))})}}class ft extends D{constructor(t){super(t),this.compositeType="LocalePicker",this.DEFAULT_FONT_SIZE=24,this.automaticallyChangeLocale=!0,this._localeOptions=new Array,this._backgroundColor=d.White,this._fontSize=this.DEFAULT_FONT_SIZE,this._fontColor=d.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:g.Composite,compositeType:"LocalePickerResult",nodeUuid:this.uuid,callback:t};e?.replaceExisting&&(this.eventListeners=this.eventListeners.filter(o=>!(o.nodeUuid===i.nodeUuid&&o.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(r=>r.name!=="localePickerIcon").forEach(r=>this.removeChild(r)),this.game.imageManager.loadImages([{imageName:"__localePickerIcon",svgString:this.icon.svgString,height:this.icon.height,width:this.icon.width}]),this.iconSprite||(this.iconSprite=new N({name:"localePickerIcon",imageName:"__localePickerIcon",position:this.iconPosition,isUserInteractionEnabled:!0}),this.addChild(this.iconSprite),this.iconSprite.onTapDown(()=>{this.setDialogVisibility(!0)}));const t=new u({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.onTapDown(r=>{r.handled=!0,this.eventListeners.length>0&&this.eventListeners.filter(a=>a.type==="LocalePickerResult").forEach(a=>{const l={type:g.Composite,compositeType:this.compositeType,compositeEventType:"LocalePickerResult",target:this,handled:!1,result:{locale:void 0},timestamp:O.now(),iso8601Timestamp:new Date().toISOString()};a.callback(l)}),this.setDialogVisibility(!1)}),this.addChild(t);const e=this.fontSize/this.DEFAULT_FONT_SIZE*50,i=this.localeOptions.length*e,o=m2c2Globals.canvasCssWidth/2,n={x:m2c2Globals.canvasCssWidth/2,y:m2c2Globals.canvasCssHeight/2},s=new u({rect:{width:o,height:i,x:n.x,y:n.y},cornerRadius:this.cornerRadius,fillColor:this.backgroundColor,isUserInteractionEnabled:!0,hidden:!0});s.onTapDown(r=>{r.handled=!0}),this.addChild(s);for(let r=0;r<this.localeOptions.length;r++){const a=this.localeOptions[r];if(a.svg){this.game.imageManager.loadImages([{imageName:a.text,svgString:a.svg.svgString,height:a.svg.height,width:a.svg.width}]);const l=new N({imageName:a.text,position:{x:n.x,y:n.y+r*e-i/2+e/2},isUserInteractionEnabled:!0,zPosition:1,hidden:!0});if(this.addChild(l),this.currentLocale===a.locale){const c=new b({text:this.LEFT_SELECTION_INDICATOR,fontSize:this.fontSize,fontColor:this.fontColor,position:{x:n.x-a.svg.width/2,y:n.y+r*e-i/2+e/2},hidden:!0,localize:!1});this.addChild(c);const k=new b({text:this.RIGHT_SELECTION_INDICATOR,fontSize:this._fontSize,fontColor:this.fontColor,position:{x:n.x+a.svg.width/2,y:n.y+r*e-i/2+e/2},hidden:!0,localize:!1});this.addChild(k)}l.onTapDown(c=>{this.handleLocaleSelection(c,a)})}else{let l=a.text;this.currentLocale===a.locale&&(l=`${this.LEFT_SELECTION_INDICATOR} ${l} ${this.RIGHT_SELECTION_INDICATOR}`);const c=new b({text:l,fontSize:this.fontSize,fontColor:this.fontColor,position:{x:n.x,y:n.y+r*e-i/2+e/2},isUserInteractionEnabled:!0,zPosition:1,hidden:!0,localize:!1});c.onTapDown(k=>{this.handleLocaleSelection(k,a)}),this.addChild(c)}}this.needsInitialization=!1}handleLocaleSelection(t,e){t.handled=!0,this.eventListeners.length>0&&this.eventListeners.filter(i=>i.type===g.Composite&&i.compositeType==="LocalePickerResult"&&i.nodeUuid==this.uuid).forEach(i=>{const o={type:g.Composite,compositeType:this.compositeType,compositeEventType:"LocalePickerResult",target:this,handled:!1,result:{locale:e.locale},timestamp:O.now(),iso8601Timestamp:new Date().toISOString()};i.callback(o)}),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}`)}}console.log("\u26AA @m2c2kit/addons version 0.3.16 (0679492d)");export{T as Button,gt as CountdownScene,lt as Dialog,J as DialogResult,q as DrawPad,w as DrawPadEventType,x as DrawPadItemEventType,B as Grid,dt as Instructions,ft as LocalePicker,Z as VirtualKeyboard};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@m2c2kit/addons",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.16",
|
|
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",
|
|
@@ -31,17 +31,17 @@
|
|
|
31
31
|
},
|
|
32
32
|
"homepage": "https://m2c2-project.github.io/m2c2kit",
|
|
33
33
|
"dependencies": {
|
|
34
|
-
"@m2c2kit/core": "
|
|
34
|
+
"@m2c2kit/core": "0.3.19"
|
|
35
35
|
},
|
|
36
36
|
"devDependencies": {
|
|
37
|
-
"@m2c2kit/build-helpers": "
|
|
37
|
+
"@m2c2kit/build-helpers": "0.3.16",
|
|
38
38
|
"@rollup/plugin-replace": "5.0.7",
|
|
39
|
-
"rimraf": "
|
|
40
|
-
"rollup": "4.18.
|
|
39
|
+
"rimraf": "6.0.1",
|
|
40
|
+
"rollup": "4.18.1",
|
|
41
41
|
"rollup-plugin-copy": "3.5.0",
|
|
42
42
|
"rollup-plugin-dts": "6.1.1",
|
|
43
43
|
"rollup-plugin-esbuild": "6.1.1",
|
|
44
|
-
"typescript": "5.
|
|
44
|
+
"typescript": "5.5.3"
|
|
45
45
|
},
|
|
46
46
|
"engines": {
|
|
47
47
|
"node": ">=18"
|