@m2c2kit/addons 0.3.27 → 0.3.28
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +10 -18
- package/README.md +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.js +1 -1
- package/dist/index.min.js +1 -1
- package/package.json +8 -8
package/LICENSE
CHANGED
|
@@ -1,21 +1,13 @@
|
|
|
1
|
-
|
|
1
|
+
Copyright 2023 Scott T. Yabiku
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
you may not use this file except in compliance with the License.
|
|
5
|
+
You may obtain a copy of the License at
|
|
4
6
|
|
|
5
|
-
|
|
6
|
-
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
-
in the Software without restriction, including without limitation the rights
|
|
8
|
-
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
-
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
-
furnished to do so, subject to the following conditions:
|
|
7
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
|
11
8
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
-
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
-
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
-
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
-
SOFTWARE.
|
|
9
|
+
Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
See the License for the specific language governing permissions and
|
|
13
|
+
limitations under the License.
|
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# @m2c2kit/addons
|
|
2
2
|
|
|
3
|
-
[](https://opensource.org/license/apache-2-0)
|
|
4
4
|
[](https://github.com/m2c2-project/m2c2kit/actions/workflows/ci.yml)
|
|
5
5
|
[](https://www.npmjs.com/package/@m2c2kit/addons)
|
|
6
6
|
|
package/dist/index.d.ts
CHANGED
|
@@ -1366,4 +1366,5 @@ declare class Slider extends Composite implements SliderOptions {
|
|
|
1366
1366
|
warmup(canvas: Canvas): void;
|
|
1367
1367
|
}
|
|
1368
1368
|
|
|
1369
|
-
export { Button,
|
|
1369
|
+
export { Button, CountdownScene, CountdownTimer, Dialog, DialogResult, DrawPad, DrawPadEventType, DrawPadItemEventType, Grid, Instructions, LocalePicker, Slider, VirtualKeyboard };
|
|
1370
|
+
export type { ButtonOptions, CountdownSceneOptions, CountdownTimerEvent, CountdownTimerOptions, DialogEvent, DialogOptions, DrawPadEvent, DrawPadItem, DrawPadItemEvent, DrawPadOptions, DrawPadStroke, GridChild, GridOptions, InstructionScene, InstructionsOptions, KeyConfiguration, KeyTapMetadata, LocaleOption, LocalePickerEvent, LocalePickerIcon, LocalePickerOptions, LocalePickerResult, SliderEvent, SliderOptions, StrokeInteraction, TimerShape, VirtualKeyboardEvent, VirtualKeyboardOptions, VirtualKeyboardRow };
|
package/dist/index.js
CHANGED
|
@@ -3745,7 +3745,7 @@ class Slider extends Composite {
|
|
|
3745
3745
|
}
|
|
3746
3746
|
}
|
|
3747
3747
|
|
|
3748
|
-
console.log("\u26AA @m2c2kit/addons version 0.3.
|
|
3748
|
+
console.log("\u26AA @m2c2kit/addons version 0.3.28 (d1ad307f)");
|
|
3749
3749
|
|
|
3750
3750
|
export { Button, CountdownScene, CountdownTimer, Dialog, DialogResult, DrawPad, DrawPadEventType, DrawPadItemEventType, Grid, Instructions, LocalePicker, Slider, VirtualKeyboard };
|
|
3751
3751
|
//# sourceMappingURL=index.js.map
|
package/dist/index.min.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{M2c2KitHelpers as g,Composite as z,WebColors as h,Shape as p,EventStoreMode as F,Equal as f,Label as y,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 b}from"@m2c2kit/core";class O extends z{constructor(t){if(super(t),this.compositeType="Grid",this._rows=0,this._columns=0,this._gridBackgroundColor=[0,0,255,.25],this._gridLineColor=h.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:h.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){f.value(this._rows,t)||(this._rows=t,this.needsInitialization=!0)}get columns(){return this._columns}set columns(t){f.value(this._columns,t)||(this._columns=t,this.needsInitialization=!0)}get gridBackgroundColor(){return this._gridBackgroundColor}set gridBackgroundColor(t){f.value(this._gridBackgroundColor,t)||(this._gridBackgroundColor=t,this.needsInitialization=!0)}get gridLineWidth(){return this._gridLineWidth}set gridLineWidth(t){f.value(this._gridLineWidth,t)||(this._gridLineWidth=t,this.needsInitialization=!0)}get gridLineColor(){return this._gridLineColor}set gridLineColor(t){f.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 s=i.duplicate();return s.parent=e,s})),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)}}g.registerM2NodeClass(O);class x extends z{constructor(t){super(t),this.compositeType="Button",this.isText=!0,this._backgroundColor=h.Black,this._cornerRadius=9,this._fontSize=20,this._text="",this._fontColor=h.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 y({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){f.value(this._text,t)||(this._text=t,this.needsInitialization=!0,this.savePropertyChangeEvent("text",t))}get backgroundColor(){return this._backgroundColor}set backgroundColor(t){f.value(this._backgroundColor,t)||(this._backgroundColor=t,this.needsInitialization=!0,this.savePropertyChangeEvent("backgroundColor",t))}get fontColor(){return this._fontColor}set fontColor(t){f.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){f.value(this._fontNames,t)||(this._fontNames=t,this.needsInitialization=!0,this.savePropertyChangeEvent("fontNames",t))}get cornerRadius(){return this._cornerRadius}set cornerRadius(t){f.value(this._cornerRadius,t)||(this._cornerRadius=t,this.needsInitialization=!0,this.savePropertyChangeEvent("cornerRadius",t))}get fontSize(){return this._fontSize}set fontSize(t){f.value(this._fontSize,t)||(this._fontSize=t,this.needsInitialization=!0,this.savePropertyChangeEvent("fontSize",t))}get interpolation(){return this._interpolation}set interpolation(t){f.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){f.value(this._localize,t)||(this._localize=t,this.needsInitialization=!0,this.savePropertyChangeEvent("localize",t))}duplicate(t){const e=new x({...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 s=i.duplicate();return s.parent=e,s})),e}update(){super.update()}draw(t){super.drawChildren(t)}warmup(t){this.initialize(),this.children.filter(e=>e.isDrawable).forEach(e=>{e.warmup(t)})}}g.registerM2NodeClass(x);var J=(S=>(S.Dismiss="Dismiss",S.Positive="Positive",S.Negative="Negative",S))(J||{});class ut extends z{constructor(t){super(t),this.compositeType="Dialog",this._backgroundColor=h.White,this.cornerRadius=9,this.overlayAlpha=.5,this.contentText="",this.positiveButtonText="",this.negativeButtonText="",this._fontColor=h.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(s=>!(s.nodeUuid===i.nodeUuid&&s.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(n=>n.type===u.Composite).forEach(n=>{const a={type:u.Composite,target:this,handled:!1,dialogResult:"Dismiss",timestamp:P.now(),iso8601Timestamp:new Date().toISOString()};n.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 y({text:this.contentText,fontSize:24,position:{x:200,y:360}});this.addChild(i);const s=new x({text:this.negativeButtonText,position:{x:120,y:440},size:{width:100,height:40},isUserInteractionEnabled:!0,zPosition:1});s.onTapDown(o=>{o.handled=!0,this.hidden=!0}),s.onTapDown(o=>{o.handled=!0,this.hidden=!0,this.eventListeners.length>0&&this.eventListeners.filter(n=>n.type===u.Composite).forEach(n=>{const a={type:u.Composite,target:this,handled:!1,dialogResult:"Negative",timestamp:P.now(),iso8601Timestamp:new Date().toISOString()};n.callback(a)})});const r=new x({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(n=>n.type===u.Composite).forEach(n=>{const a={type:u.Composite,target:this,handled:!1,dialogResult:"Positive",timestamp:P.now(),iso8601Timestamp:new Date().toISOString()};n.callback(a)})}),this.addChild(s),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 C={StrokeStart:"StrokeStart",StrokeMove:"StrokeMove",StrokeEnd:"StrokeEnd"},_={StrokeEnter:"StrokeEnter",StrokeLeave:"StrokeLeave"};class j extends z{constructor(t){if(super(t),this.compositeType="DrawPad",this.resumeDrawingOnReturn=!1,this.continuousDrawingOnly=!1,this._backgroundColor=[0,0,0,0],this._borderColor=h.Black,this._borderWidth=1,this._lineColor=h.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 s=e.subpaths[e.subpaths.length-1][e.subpaths[e.subpaths.length-1].length-1],r=t.point;if(this.continuousDrawingOnlyExceptionDistance===void 0||this.dist(s,r)>this.continuousDrawingOnlyExceptionDistance){this.currentStrokesNotAllowed=!0;return}}this.currentStrokesNotAllowed=!1,this.isDrawingPointerDown=!0,e.move(t.point);const i={type:C.StrokeStart,target:this,handled:!1,position:t.point,...g.createTimestamps()};this.strokes.push([{type:C.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,s=this.strokes[this.strokes.length-1][i-1].position,r=this.interpolateToDrawPadBorder(t,s,this.size);if(!this.drawShape?.path)throw new Error("DrawPad.addInterpolatedStrokeMove(): no drawShape.path");this.drawShape.path.addLine(r);const n={type:C.StrokeMove,target:this,handled:!1,position:r,...g.createTimestamps()};return this.strokes[e-1].push({type:C.StrokeMove,position:r,iso8601Timestamp:new Date().toISOString(),interpolated:!0}),this.raiseDrawPadEvent(n),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 s=!1,r=t.point;this.isPointWithinDrawPad(t.point,this.size)||(r=this.addInterpolatedStrokeMove(t.point),s=!0);const o={type:C.StrokeEnd,position:this.strokes[e-1][i-1].position,target:this,handled:!1,...g.createTimestamps()};this.strokes[e-1].push({type:C.StrokeEnd,position:s?r:this.strokes[e-1][i-1].position,iso8601Timestamp:new Date().toISOString(),interpolated:s}),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:C.StrokeEnd,position:this.strokes[t-1][e-1].position,target:this,handled:!1,...g.createTimestamps()};this.strokes[t-1].push({type:C.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:C.StrokeMove,target:this,handled:!1,position:t.point,...g.createTimestamps()},s=this.strokes.length;this.strokes[s-1].push({type:C.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(C.StrokeStart,t,e)}onStrokeMove(t,e){this.addEventListener(C.StrokeMove,t,e)}onStrokeEnd(t,e){this.addEventListener(C.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(_.StrokeEnter,e,i)}}),Object.defineProperty(t,"onStrokeLeave",{value:function(e,i){this.addEventListener(_.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:_.StrokeEnter,target:t,...g.createTimestamps()};this.raiseDrawPadItemEvent(t,e)}}),t.onPointerMove(()=>{if(this.isDrawingPointerDown&&t.isStrokeWithinBounds===!1){t.isStrokeWithinBounds=!0;const e={type:_.StrokeEnter,target:t,...g.createTimestamps()};this.raiseDrawPadItemEvent(t,e)}}),t.onPointerLeave(()=>{if(this.isDrawingPointerDown&&t.isStrokeWithinBounds===!0){t.isStrokeWithinBounds=!1;const e={type:_.StrokeLeave,target:t,...g.createTimestamps()};this.raiseDrawPadItemEvent(t,e)}}),t.onPointerUp(()=>{if(t.isStrokeWithinBounds===!0){t.isStrokeWithinBounds=!1;const e={type:_.StrokeLeave,target:t,...g.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,s=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:s,height:r},a=this.game.snapshots[0].readPixels(e,i,o),l=this.game.canvasKit.MakeImage(o,a,a.length/r);if(!l)throw new Error("DrawPad.takeScreenshot(): no croppedImage");const d=l.encodeToBytes();if(!d)throw new Error("DrawPad.takeScreenshot(): croppedImage.encodeToBytes() failed");return l.delete(),this.arrayBufferToBase64String(d)}isPointWithinDrawPad(t,e){return t.x>=0&&t.x<=e.width&&t.y>=0&&t.y<=e.height}interpolateToDrawPadBorder(t,e,i){const s=(t.y-e.y)/(t.x-e.x),r=t.y-s*t.x,o={x:0,y:0};if(!Number.isFinite(s)){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 n=s*0+r,a=s*i.width+r;if(n>=0&&n<=i.height&&t.x-e.x<0)return o.x=0,o.y=n,o;if(a>=0&&a<=i.height&&t.x-e.x>0)return o.x=i.width,o.y=a,o;const l=(0-r)/s,d=(i.height-r)/s;return l>=0&&l<=i.width&&t.y-e.y<0?(o.x=l,o.y=0,o):d>=0&&d<=i.width&&t.y-e.y>0?(o.x=d,o.y=i.height,o):t}arrayBufferToBase64String(t){let e="";const i=new Uint8Array(t);for(let s=0;s<i.byteLength;s++)e+=String.fromCharCode(i[s]);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}`)}}g.registerM2NodeClass(j);class Z extends z{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(s=>{if(s instanceof Object&&!Array.isArray(s)){const r=s;return s.keyIconShapeOptions&&(s.keyIconShapeOptions.suppressEvents=!0,r.keyIcon=new p(s.keyIconShapeOptions),r.keyIconShapeOptions=void 0),r}else return s}))),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??h.White,this.keyDownColor=t.keyDownColor??h.Transparent,this.specialKeyDownColor=t.specialKeyDownColor??h.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,l)=>Math.max(a,l.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},s=(this.keyboardVerticalPaddingPercent??.025)*this.size.height,r=(this.keyboardHorizontalPaddingPercent??.02)*this.size.width,o=(this.size.height-2*s)/e.length,n=(this.size.width-2*r)/this.keysPerRow;this.keyShapes=[];for(let a=0;a<e.length;a++){const l=e[a],d=l.reduce((E,w)=>E+(w.widthRatio??1),0);let m=0;d<this.keysPerRow&&(m=(this.size.width-2*r-n*d)/2);for(let E=0;E<l.length;E++){const w=l[E];if(this.hiddenKeys?.split(",").map(v=>v===" "?" ":v.trim()).includes(w.code))continue;const A=l.slice(0,E).reduce((v,W)=>v+(W.widthRatio??1),0)*n,I=new p({rect:{size:{width:n*(w.widthRatio??1),height:o}},fillColor:h.Transparent,strokeColor:h.Transparent,lineWidth:1,position:{x:m+i.x+r+A+(w.widthRatio??1)*n/2,y:i.y+s+a*o+o/2},suppressEvents:!0}),R=n*(w.widthRatio??1)-2*this.keyHorizontalPaddingPercent*n,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},I.addChild(k),this.keyShapes.push(k);const L=new y({text:w.labelText,fontSize:this.fontSize,fontNames:this.fontNames,suppressEvents:!0});L.userData={code:w.code},I.addChild(L),this.keyLabels.push(L),w.keyIcon&&I.addChild(w.keyIcon),t.addChild(I),k.onTapUp(v=>{this.handleKeyShapeTapUp(w,k,v)}),k.onTapDown(v=>{this.handleKeyShapeTapDown(w,k,v)}),k.onTapLeave(v=>{this.handleKeyShapeTapLeave(w,k,v)})}}this.letterCircle=new p({circleOfRadius:28,fillColor:h.Silver,hidden:!0,suppressEvents:!0}),t.addChild(this.letterCircle),this.letterCircleLabel=new y({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 s=this.getKeyAsString(t),r={type:u.Composite,compositeType:"VirtualKeyboard",compositeEventType:"VirtualKeyboardKeyDown",target:this,handled:!1,key:s,code:t.code,shiftKey:this.shiftActivated,keyTapMetadata:{size:e.size,point:i.point,buttons:i.buttons},...g.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 s=this.getKeyAsString(t),r={type:u.Composite,compositeType:"VirtualKeyboard",compositeEventType:"VirtualKeyboardKeyUp",target:this,handled:!1,key:s,code:t.code,shiftKey:this.shiftActivated,keyTapMetadata:{size:e.size,point:i.point,buttons:i.buttons},...g.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 s=this.getKeyAsString(t),r={type:u.Composite,compositeType:"VirtualKeyboard",compositeEventType:"VirtualKeyboardKeyLeave",target:this,handled:!1,key:s,code:t.code,shiftKey:this.shiftActivated,keyTapMetadata:{size:e.size,point:i.point,buttons:i.buttons},...g.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 s=1;const r=1;let o,n,a,l,d=!1;return typeof i=="string"?(o=i,this.capitalLettersOnly?n=o.toUpperCase():n=o,a=o.toUpperCase()):Array.isArray(i)?(o=i[0],n=o,a=i[1]):(o=i.code,n=i.labelText??"",a=i.labelTextShifted??n,s=i.widthRatio??1,l=i.keyIcon,d=i.isShift??!1),{widthRatio:s,heightRatio:r,code:o,labelText:n,labelTextShifted:a,keyIcon:l,isShift:d}}))}handleCompositeEvent(t){const e=this.internalKeyboardRowsToInternalKeyboardConfiguration(this.keyboardRows),i=this.keyShapes.find(s=>s.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 s=i.parent;if(this.letterCircle.position.x=s.position.x,i.rect?.size?.height===void 0)throw new Error("keyShape.rect.height is undefined");this.letterCircle.position.y=s.position.y-i.rect.size.height*1.2;const o=this.internalKeyboardRowsToInternalKeyboardConfiguration(this.keyboardRows).flat().find(n=>n.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(s=>s.userData.code.toLowerCase().includes("shift")).forEach(s=>{s.fillColor=this.specialKeyDownColor}),t.flat().filter(s=>s.isShift).forEach(s=>{s.keyIcon&&(s.keyIcon.fillColor=h.Black)}),t.flatMap(s=>s).forEach(s=>{const r=this.keyLabels.find(o=>o.userData.code===s.code);if(!r)throw new Error("keyLabel is not defined");r.text!==void 0&&(r.text=s.labelTextShifted??"")})}showKeyboardNotShifted(t){this.keyShapes.filter(s=>s.userData.code.toLowerCase().includes("shift")).forEach(s=>{s.fillColor=this.keyColor}),t.flat().filter(s=>s.isShift).forEach(s=>{s.keyIcon&&(s.keyIcon.fillColor=h.Transparent)}),t.flatMap(s=>s).forEach(s=>{const r=this.keyLabels.find(o=>o.userData.code===s.code);if(!r)throw new Error("keyLabel is not defined");r.text!==void 0&&(r.text=s.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"],s={path:{pathString:"m288-6.6849e-14 -288 288h144v288h288v-288h144l-288-288z",width:24},lineWidth:2,strokeColor:h.Black,fillColor:h.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:h.Black,fillColor:h.Red,suppressEvents:!0},o=[{code:"Shift",isShift:!0,widthRatio:1.5,keyIcon:new p(s)},"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})}}g.registerM2NodeClass(Z);const X=$.sinusoidalInOut,Y=500;class pt extends lt{static create(t){const e=new Array;return t.instructionScenes.forEach((i,s)=>{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}),n=i.backButtonText??t.backButtonText??"Back",a=i.backButtonTextInterpolation??t.backButtonTextInterpolation,l=i.nextButtonText??t.nextButtonText??"Next",d=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=i.backgroundColor??t.backgroundColor,R=i.imageAboveText??!0,K=i.imageMarginTop??0,k=i.imageMarginBottom??0,L=i.textMarginStart??48,v=i.textMarginEnd??48,W=i.textAlignmentMode??dt.Left,tt=i.textFontSize??16,et=i.titleFontSize??16,it=i.titleMarginTop??48,st=i.backButtonBackgroundColor??t.backButtonBackgroundColor??h.Black,ot=i.backButtonFontColor??t.backButtonFontColor??h.White,nt=i.nextButtonBackgroundColor??t.nextButtonBackgroundColor??h.Black,rt=i.nextButtonFontColor??t.nextButtonFontColor??h.White,U=t.sceneNamePrefix??"instructions",c=new q({name:U+"-"+(s+1).toString().padStart(2,"0"),backgroundColor:I});let H;i.title!==void 0&&(H=new y({text:i.title,interpolation:i.titleInterpolation,fontSize:et,layout:{marginTop:it,constraints:{topToTopOf:c,startToStartOf:c,endToEndOf:c}}}),c.addChild(H));let D;if(i.text!==void 0&&(D=new y({text:i.text,interpolation:i.textInterpolation,preferredMaxLayoutWidth:ct.MatchConstraint,horizontalAlignmentMode:W,fontSize:tt,layout:{marginStart:L,marginEnd:v,constraints:{topToTopOf:c,bottomToBottomOf:c,startToStartOf:c,endToEndOf:c,verticalBias:i.textVerticalBias}}}),c.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:c,endToEndOf:c}}}):T=new B({imageName:i.imageName,layout:{marginTop:K,constraints:{topToBottomOf:D,startToStartOf:c,endToEndOf:c}}}):T=new B({imageName:i.imageName,layout:{constraints:{topToTopOf:c,bottomToBottomOf:c,verticalBias:i.imageVerticalBias,startToStartOf:c,endToEndOf:c}}}),c.addChild(T)}if(s>0){const T=new x({name:"backButton",text:n,interpolation:a,fontColor:ot,backgroundColor:st,size:{width:m,height:w},layout:{marginStart:32,marginBottom:80,constraints:{bottomToBottomOf:c,startToStartOf:c}}});T.isUserInteractionEnabled=!0,T.onTapDown(()=>{c.game.presentScene(U+"-"+(s+1-1).toString().padStart(2,"0"),o)}),c.addChild(T)}const N=new x({name:"nextButton",text:l,interpolation:d,fontColor:rt,backgroundColor:nt,size:{width:E,height:A},layout:{marginEnd:32,marginBottom:80,constraints:{bottomToBottomOf:c,endToEndOf:c}}});N.isUserInteractionEnabled=!0,s!==t.instructionScenes.length-1?N.onTapDown(()=>{c.game.presentScene(U+"-"+(s+1+1).toString().padStart(2,"0"),r)}):t.postInstructionsScene!==void 0?N.onTapDown(()=>{c.game.presentScene(t.postInstructionsScene??"",r)}):N.onTapDown(()=>{const T=c.game.scenes.indexOf(c);if(T===-1)console.warn("warning: postInstructionsScene is not defined, and next scene cannot be determined.");else{const G=T+1;G<c.game.scenes.length?c.game.presentScene(c.game.scenes[G],r):console.warn("warning: postInstructionsScene is not defined, and there is no next scene to present.")}}),c.addChild(N),e.push(c)}),e}static Create(t){return this.create(t)}}const gt=$.sinusoidalInOut,ft=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??h.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??h.RoyalBlue}),this.addChild(e);else throw new Error("Invalid timer shape options.");const i=Math.floor(t.milliseconds/1e3),s=new y({text:"",fontSize:t?.timerNumbersFontSize??50,fontName:t?.timerNumbersFontName,fontColor:t?.timerNumbersFontColor??h.White});e.addChild(s);const r=new y({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 n=i-1;n>0;n--)o.push(b.wait({duration:1e3})),o.push(b.custom({callback:()=>{s.text=n.toString()}}));o.push(b.wait({duration:1e3})),o.push(b.custom({callback:()=>{s.text=t?.zeroString??"0"}})),t?.zeroDwellMilliseconds!==void 0&&o.push(b.wait({duration:t.zeroDwellMilliseconds})),o.push(b.custom({callback:()=>{const n=this.game;n.scenes.indexOf(this)===n.scenes.length-1&&n.end();const l=n.scenes[n.scenes.indexOf(this)+1];n.presentScene(l,t?.transition??M.slide({direction:V.Left,duration:t?.transitionDurationMilliseconds??ft,easing:gt}))}})),this.onSetup(()=>{s.text=i.toString()}),this.onAppear(()=>{this.run(b.sequence(o))})}}class wt extends z{constructor(t){super(t),this.compositeType="LocalePicker",this.DEFAULT_FONT_SIZE=24,this.automaticallyChangeLocale=!0,this._localeOptions=new Array,this._backgroundColor=h.White,this._fontSize=this.DEFAULT_FONT_SIZE,this._fontColor=h.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(s=>!(s.nodeUuid===i.nodeUuid&&s.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 B({name:"localePickerIcon",imageName:"__localePickerIcon",position:this.iconPosition,isUserInteractionEnabled:!0}),this.addChild(this.iconSprite),this.iconSprite.onTapDown(n=>{n.handled=!0,this.setDialogVisibility(!0)}),this.iconSprite.onTapUp(n=>{n.handled=!0}),this.iconSprite.onTapUpAny(n=>{n.handled=!0}),this.iconSprite.onPointerUp(n=>{n.handled=!0}),this.iconSprite.onPointerDown(n=>{n.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(n=>{n.handled=!0,this.eventListeners.length>0&&this.eventListeners.filter(a=>a.type==="LocalePickerResult").forEach(a=>{const l={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(l)}),this.setDialogVisibility(!1)}),t.onTapUpAny(n=>{n.handled=!0}),t.onTapDown(n=>{n.handled=!0}),t.onPointerUp(n=>{n.handled=!0}),t.onPointerDown(n=>{n.handled=!0}),this.addChild(t);const e=this.fontSize/this.DEFAULT_FONT_SIZE*50,i=this.localeOptions.length*e,s=m2c2Globals.canvasCssWidth/2,r={x:m2c2Globals.canvasCssWidth/2,y:m2c2Globals.canvasCssHeight/2},o=new p({rect:{width:s,height:i,x:r.x,y:r.y},cornerRadius:this.cornerRadius,fillColor:this.backgroundColor,isUserInteractionEnabled:!0,hidden:!0});o.onTapDown(n=>{n.handled=!0}),o.onTapUp(n=>{n.handled=!0}),o.onTapUpAny(n=>{n.handled=!0}),o.onPointerUp(n=>{n.handled=!0}),o.onPointerDown(n=>{n.handled=!0}),this.addChild(o);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 l=new B({imageName:a.text,position:{x:r.x,y:r.y+n*e-i/2+e/2},isUserInteractionEnabled:!0,zPosition:1,hidden:!0});if(this.addChild(l),this.currentLocale===a.locale){const d=new y({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+n*e-i/2+e/2},hidden:!0,localize:!1});this.addChild(d);const m=new y({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+n*e-i/2+e/2},hidden:!0,localize:!1});this.addChild(m)}l.onTapUp(d=>{d.handled=!0,this.handleLocaleSelection(d,a)}),l.onTapUpAny(d=>{d.handled=!0}),l.onTapDown(d=>{d.handled=!0}),l.onPointerUp(d=>{d.handled=!0}),l.onPointerDown(d=>{d.handled=!0})}else{let l=a.text;this.currentLocale===a.locale&&(l=`${this.LEFT_SELECTION_INDICATOR} ${l} ${this.RIGHT_SELECTION_INDICATOR}`);const d=new y({text:l,fontSize:this.fontSize,fontColor:this.fontColor,position:{x:r.x,y:r.y+n*e-i/2+e/2},isUserInteractionEnabled:!0,zPosition:1,hidden:!0,localize:!1});d.onTapUp(m=>{m.handled=!0,this.handleLocaleSelection(m,a)}),d.onTapUpAny(m=>{m.handled=!0}),d.onTapDown(m=>{m.handled=!0}),d.onPointerUp(m=>{m.handled=!0}),d.onPointerDown(m=>{m.handled=!0}),this.addChild(d)}}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 s={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(s)}),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 z{constructor(t){super(t),this.compositeType="CountdownTimer",this._milliseconds=3e3,this._tickIntervalMilliseconds=1e3,this._fontSize=50,this._fontColor=h.White,this._zeroString="0",this._timerShape={circle:{radius:100},fillColor:h.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??h.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??h.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 y({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(b.wait({duration:this.tickIntervalMilliseconds})),this.countdownSequence.push(b.custom({callback:()=>{this.tick(e-this.tickIntervalMilliseconds)}}));this.countdownSequence.push(b.wait({duration:this.tickIntervalMilliseconds})),this.countdownSequence.push(b.custom({callback:()=>{this.tick(0);const e={type:u.Composite,compositeType:this.compositeType,compositeEventType:"CountdownTimerComplete",target:this,handled:!1,millisecondsRemaining:0,...g.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,...g.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(b.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){f.value(this._milliseconds,t)||(this._milliseconds=t,this.needsInitialization=!0,this.savePropertyChangeEvent("milliseconds",t))}get tickIntervalMilliseconds(){return this._tickIntervalMilliseconds}set tickIntervalMilliseconds(t){f.value(this._tickIntervalMilliseconds,t)||(this._tickIntervalMilliseconds=t,this.needsInitialization=!0,this.savePropertyChangeEvent("tickIntervalMilliseconds",t))}get fontColor(){return this._fontColor}set fontColor(t){f.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){f.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){f.value(this._timerShape,t)||(this._timerShape=t,this.needsInitialization=!0,this.savePropertyChangeEvent("timerShape",t))}get textVerticalBias(){return this._textVerticalBias}set textVerticalBias(t){f.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)})}}g.registerM2NodeClass(Q);class Ct extends z{constructor(t){super(t),this.compositeType="Slider",this._trackSize={width:250,height:10},this._trackColor=h.Black,this._thumbSize={width:20,height:40},this._thumbColor=h.DarkGray,this._min=0,this._max=100,this._value=(this.max-this.min)/2,this.originalOptions=JSON.parse(JSON.stringify(t)),t.trackSize&&(this.trackSize=t.trackSize),t.trackColor&&(this.trackColor=t.trackColor),t.thumbSize&&(this.thumbSize=t.thumbSize),t.thumbColor&&(this.thumbColor=t.thumbColor),t.min!==void 0&&(this.min=t.min),t.max!==void 0&&(this.max=t.max),t.value!==void 0&&(this.value=t.value),this.saveNodeNewEvent()}get thumbShape(){if(this._thumbShape===void 0)throw new Error("thumbShape is not defined.");return this._thumbShape}set thumbShape(t){this._thumbShape=t}get completeNodeOptions(){return{...this.options,...this.getNodeOptions(),...this.getDrawableOptions(),...this.originalOptions}}initialize(){this.removeAllChildren();const t=new p({rect:{width:this.trackSize.width,height:this.trackSize.height},cornerRadius:8,fillColor:this.trackColor});this.addChild(t),this.thumbShape=new p({rect:{width:this.thumbSize.width,height:this.thumbSize.height},cornerRadius:8,fillColor:this.thumbColor,isUserInteractionEnabled:!0,draggable:!0,zPosition:1,position:{x:this.value*this.trackSize.width/(this.max-this.min)-this.trackSize.width/2,y:0}}),t.addChild(this.thumbShape);const e=new p({rect:{width:this.trackSize.width,height:this.thumbSize.height},alpha:0,isUserInteractionEnabled:!0,zPosition:0});t.addChild(e),e.onTapDown(s=>{this.thumbShape.position.x=s.point.x-t.size.width/2,this.updateThumbLabel()});const i=new p({rect:{width:this.trackSize.width,height:this.parentSceneAsNode.size.height*2},alpha:0,isUserInteractionEnabled:!0});this.addChild(i),i.onPointerMove(()=>{this.thumbShape.draggable=!0}),i.onPointerLeave(()=>{this.thumbShape.draggable=!1}),this.thumbShape.onTapDown(s=>{s.handled=!0,s.point.y!==0&&(this.thumbShape.position.y=0),s.point.x<-this.trackSize.width/2&&(this.thumbShape.position.x=-this.trackSize.width/2),s.point.x>this.trackSize.width/2&&(this.thumbShape.position.x=this.trackSize.width/2),this.updateThumbLabel()}),this.thumbShape.onDrag(s=>{s.position.y!==0&&(this.thumbShape.position.y=0),s.position.x<-this.trackSize.width/2&&(this.thumbShape.position.x=-this.trackSize.width/2),s.position.x>this.trackSize.width/2&&(this.thumbShape.position.x=this.trackSize.width/2),this.updateThumbLabel()}),this.thumbShape.onDragEnd(()=>{const s=Math.round((this.thumbShape.position.x+this.trackSize.width/2)/this.trackSize.width*(this.max-this.min));this.thumbShape.position.x=s/(this.max-this.min)*this.trackSize.width-this.trackSize.width/2,this.updateThumbLabel()}),this.needsInitialization=!1}updateThumbLabel(){const t=(this.thumbShape.position.x+this.trackSize.width/2)/this.trackSize.width*(this.max-this.min);this.thumbLabel||(this.thumbLabel=new y({text:t.toString()}),this.addChild(this.thumbLabel)),this.thumbLabel.text=Math.round(t).toString(),this.thumbLabel.position={x:this.thumbShape.position.x,y:this.thumbShape.position.y-30},this.thumbLabel&&(this.thumbLabel.position={x:this.thumbShape.position.x,y:this.thumbShape.position.y-30});const e={type:u.Composite,compositeType:"Slider",compositeEventType:"SliderValueChanged",target:this,value:t,...g.createTimestamps()};this.handleCompositeEvent(e),this.saveEvent(e),this.eventListeners.length>0&&this.eventListeners.filter(i=>i.type===u.Composite&&i.compositeType===this.compositeType&&i.compositeEventType==="SliderValueChanged").forEach(i=>{i.callback(e)})}onValueChanged(t,e){const i={type:u.Composite,compositeEventType:"SliderValueChanged",compositeType:this.compositeType,nodeUuid:this.uuid,callback:t};this.addSliderEventListener(i,e)}addSliderEventListener(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 trackSize(){return this._trackSize}set trackSize(t){this._trackSize=t}get trackColor(){return this._trackColor}set trackColor(t){this._trackColor=t}get thumbSize(){return this._thumbSize}set thumbSize(t){this._thumbSize=t}get thumbColor(){return this._thumbColor}set thumbColor(t){this._thumbColor=t}get value(){return this._value}set value(t){this._value=t}get min(){return this._min}set min(t){this._min=t}get max(){return this._max}set max(t){this._max=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)})}}console.log("\u26AA @m2c2kit/addons version 0.3.27 (622f7241)");export{x as Button,mt as CountdownScene,Q as CountdownTimer,ut as Dialog,J as DialogResult,j as DrawPad,C as DrawPadEventType,_ as DrawPadItemEventType,O as Grid,pt as Instructions,wt as LocalePicker,Ct as Slider,Z as VirtualKeyboard};
|
|
1
|
+
import{M2c2KitHelpers as g,Composite as z,WebColors as h,Shape as p,EventStoreMode as F,Equal as f,Label as y,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 b}from"@m2c2kit/core";class O extends z{constructor(t){if(super(t),this.compositeType="Grid",this._rows=0,this._columns=0,this._gridBackgroundColor=[0,0,255,.25],this._gridLineColor=h.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:h.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){f.value(this._rows,t)||(this._rows=t,this.needsInitialization=!0)}get columns(){return this._columns}set columns(t){f.value(this._columns,t)||(this._columns=t,this.needsInitialization=!0)}get gridBackgroundColor(){return this._gridBackgroundColor}set gridBackgroundColor(t){f.value(this._gridBackgroundColor,t)||(this._gridBackgroundColor=t,this.needsInitialization=!0)}get gridLineWidth(){return this._gridLineWidth}set gridLineWidth(t){f.value(this._gridLineWidth,t)||(this._gridLineWidth=t,this.needsInitialization=!0)}get gridLineColor(){return this._gridLineColor}set gridLineColor(t){f.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 s=i.duplicate();return s.parent=e,s})),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)}}g.registerM2NodeClass(O);class x extends z{constructor(t){super(t),this.compositeType="Button",this.isText=!0,this._backgroundColor=h.Black,this._cornerRadius=9,this._fontSize=20,this._text="",this._fontColor=h.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 y({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){f.value(this._text,t)||(this._text=t,this.needsInitialization=!0,this.savePropertyChangeEvent("text",t))}get backgroundColor(){return this._backgroundColor}set backgroundColor(t){f.value(this._backgroundColor,t)||(this._backgroundColor=t,this.needsInitialization=!0,this.savePropertyChangeEvent("backgroundColor",t))}get fontColor(){return this._fontColor}set fontColor(t){f.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){f.value(this._fontNames,t)||(this._fontNames=t,this.needsInitialization=!0,this.savePropertyChangeEvent("fontNames",t))}get cornerRadius(){return this._cornerRadius}set cornerRadius(t){f.value(this._cornerRadius,t)||(this._cornerRadius=t,this.needsInitialization=!0,this.savePropertyChangeEvent("cornerRadius",t))}get fontSize(){return this._fontSize}set fontSize(t){f.value(this._fontSize,t)||(this._fontSize=t,this.needsInitialization=!0,this.savePropertyChangeEvent("fontSize",t))}get interpolation(){return this._interpolation}set interpolation(t){f.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){f.value(this._localize,t)||(this._localize=t,this.needsInitialization=!0,this.savePropertyChangeEvent("localize",t))}duplicate(t){const e=new x({...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 s=i.duplicate();return s.parent=e,s})),e}update(){super.update()}draw(t){super.drawChildren(t)}warmup(t){this.initialize(),this.children.filter(e=>e.isDrawable).forEach(e=>{e.warmup(t)})}}g.registerM2NodeClass(x);var J=(S=>(S.Dismiss="Dismiss",S.Positive="Positive",S.Negative="Negative",S))(J||{});class ut extends z{constructor(t){super(t),this.compositeType="Dialog",this._backgroundColor=h.White,this.cornerRadius=9,this.overlayAlpha=.5,this.contentText="",this.positiveButtonText="",this.negativeButtonText="",this._fontColor=h.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(s=>!(s.nodeUuid===i.nodeUuid&&s.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(n=>n.type===u.Composite).forEach(n=>{const a={type:u.Composite,target:this,handled:!1,dialogResult:"Dismiss",timestamp:P.now(),iso8601Timestamp:new Date().toISOString()};n.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 y({text:this.contentText,fontSize:24,position:{x:200,y:360}});this.addChild(i);const s=new x({text:this.negativeButtonText,position:{x:120,y:440},size:{width:100,height:40},isUserInteractionEnabled:!0,zPosition:1});s.onTapDown(o=>{o.handled=!0,this.hidden=!0}),s.onTapDown(o=>{o.handled=!0,this.hidden=!0,this.eventListeners.length>0&&this.eventListeners.filter(n=>n.type===u.Composite).forEach(n=>{const a={type:u.Composite,target:this,handled:!1,dialogResult:"Negative",timestamp:P.now(),iso8601Timestamp:new Date().toISOString()};n.callback(a)})});const r=new x({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(n=>n.type===u.Composite).forEach(n=>{const a={type:u.Composite,target:this,handled:!1,dialogResult:"Positive",timestamp:P.now(),iso8601Timestamp:new Date().toISOString()};n.callback(a)})}),this.addChild(s),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 C={StrokeStart:"StrokeStart",StrokeMove:"StrokeMove",StrokeEnd:"StrokeEnd"},_={StrokeEnter:"StrokeEnter",StrokeLeave:"StrokeLeave"};class j extends z{constructor(t){if(super(t),this.compositeType="DrawPad",this.resumeDrawingOnReturn=!1,this.continuousDrawingOnly=!1,this._backgroundColor=[0,0,0,0],this._borderColor=h.Black,this._borderWidth=1,this._lineColor=h.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 s=e.subpaths[e.subpaths.length-1][e.subpaths[e.subpaths.length-1].length-1],r=t.point;if(this.continuousDrawingOnlyExceptionDistance===void 0||this.dist(s,r)>this.continuousDrawingOnlyExceptionDistance){this.currentStrokesNotAllowed=!0;return}}this.currentStrokesNotAllowed=!1,this.isDrawingPointerDown=!0,e.move(t.point);const i={type:C.StrokeStart,target:this,handled:!1,position:t.point,...g.createTimestamps()};this.strokes.push([{type:C.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,s=this.strokes[this.strokes.length-1][i-1].position,r=this.interpolateToDrawPadBorder(t,s,this.size);if(!this.drawShape?.path)throw new Error("DrawPad.addInterpolatedStrokeMove(): no drawShape.path");this.drawShape.path.addLine(r);const n={type:C.StrokeMove,target:this,handled:!1,position:r,...g.createTimestamps()};return this.strokes[e-1].push({type:C.StrokeMove,position:r,iso8601Timestamp:new Date().toISOString(),interpolated:!0}),this.raiseDrawPadEvent(n),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 s=!1,r=t.point;this.isPointWithinDrawPad(t.point,this.size)||(r=this.addInterpolatedStrokeMove(t.point),s=!0);const o={type:C.StrokeEnd,position:this.strokes[e-1][i-1].position,target:this,handled:!1,...g.createTimestamps()};this.strokes[e-1].push({type:C.StrokeEnd,position:s?r:this.strokes[e-1][i-1].position,iso8601Timestamp:new Date().toISOString(),interpolated:s}),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:C.StrokeEnd,position:this.strokes[t-1][e-1].position,target:this,handled:!1,...g.createTimestamps()};this.strokes[t-1].push({type:C.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:C.StrokeMove,target:this,handled:!1,position:t.point,...g.createTimestamps()},s=this.strokes.length;this.strokes[s-1].push({type:C.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(C.StrokeStart,t,e)}onStrokeMove(t,e){this.addEventListener(C.StrokeMove,t,e)}onStrokeEnd(t,e){this.addEventListener(C.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(_.StrokeEnter,e,i)}}),Object.defineProperty(t,"onStrokeLeave",{value:function(e,i){this.addEventListener(_.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:_.StrokeEnter,target:t,...g.createTimestamps()};this.raiseDrawPadItemEvent(t,e)}}),t.onPointerMove(()=>{if(this.isDrawingPointerDown&&t.isStrokeWithinBounds===!1){t.isStrokeWithinBounds=!0;const e={type:_.StrokeEnter,target:t,...g.createTimestamps()};this.raiseDrawPadItemEvent(t,e)}}),t.onPointerLeave(()=>{if(this.isDrawingPointerDown&&t.isStrokeWithinBounds===!0){t.isStrokeWithinBounds=!1;const e={type:_.StrokeLeave,target:t,...g.createTimestamps()};this.raiseDrawPadItemEvent(t,e)}}),t.onPointerUp(()=>{if(t.isStrokeWithinBounds===!0){t.isStrokeWithinBounds=!1;const e={type:_.StrokeLeave,target:t,...g.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,s=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:s,height:r},a=this.game.snapshots[0].readPixels(e,i,o),l=this.game.canvasKit.MakeImage(o,a,a.length/r);if(!l)throw new Error("DrawPad.takeScreenshot(): no croppedImage");const d=l.encodeToBytes();if(!d)throw new Error("DrawPad.takeScreenshot(): croppedImage.encodeToBytes() failed");return l.delete(),this.arrayBufferToBase64String(d)}isPointWithinDrawPad(t,e){return t.x>=0&&t.x<=e.width&&t.y>=0&&t.y<=e.height}interpolateToDrawPadBorder(t,e,i){const s=(t.y-e.y)/(t.x-e.x),r=t.y-s*t.x,o={x:0,y:0};if(!Number.isFinite(s)){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 n=s*0+r,a=s*i.width+r;if(n>=0&&n<=i.height&&t.x-e.x<0)return o.x=0,o.y=n,o;if(a>=0&&a<=i.height&&t.x-e.x>0)return o.x=i.width,o.y=a,o;const l=(0-r)/s,d=(i.height-r)/s;return l>=0&&l<=i.width&&t.y-e.y<0?(o.x=l,o.y=0,o):d>=0&&d<=i.width&&t.y-e.y>0?(o.x=d,o.y=i.height,o):t}arrayBufferToBase64String(t){let e="";const i=new Uint8Array(t);for(let s=0;s<i.byteLength;s++)e+=String.fromCharCode(i[s]);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}`)}}g.registerM2NodeClass(j);class Z extends z{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(s=>{if(s instanceof Object&&!Array.isArray(s)){const r=s;return s.keyIconShapeOptions&&(s.keyIconShapeOptions.suppressEvents=!0,r.keyIcon=new p(s.keyIconShapeOptions),r.keyIconShapeOptions=void 0),r}else return s}))),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??h.White,this.keyDownColor=t.keyDownColor??h.Transparent,this.specialKeyDownColor=t.specialKeyDownColor??h.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,l)=>Math.max(a,l.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},s=(this.keyboardVerticalPaddingPercent??.025)*this.size.height,r=(this.keyboardHorizontalPaddingPercent??.02)*this.size.width,o=(this.size.height-2*s)/e.length,n=(this.size.width-2*r)/this.keysPerRow;this.keyShapes=[];for(let a=0;a<e.length;a++){const l=e[a],d=l.reduce((E,w)=>E+(w.widthRatio??1),0);let m=0;d<this.keysPerRow&&(m=(this.size.width-2*r-n*d)/2);for(let E=0;E<l.length;E++){const w=l[E];if(this.hiddenKeys?.split(",").map(v=>v===" "?" ":v.trim()).includes(w.code))continue;const A=l.slice(0,E).reduce((v,W)=>v+(W.widthRatio??1),0)*n,I=new p({rect:{size:{width:n*(w.widthRatio??1),height:o}},fillColor:h.Transparent,strokeColor:h.Transparent,lineWidth:1,position:{x:m+i.x+r+A+(w.widthRatio??1)*n/2,y:i.y+s+a*o+o/2},suppressEvents:!0}),R=n*(w.widthRatio??1)-2*this.keyHorizontalPaddingPercent*n,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},I.addChild(k),this.keyShapes.push(k);const L=new y({text:w.labelText,fontSize:this.fontSize,fontNames:this.fontNames,suppressEvents:!0});L.userData={code:w.code},I.addChild(L),this.keyLabels.push(L),w.keyIcon&&I.addChild(w.keyIcon),t.addChild(I),k.onTapUp(v=>{this.handleKeyShapeTapUp(w,k,v)}),k.onTapDown(v=>{this.handleKeyShapeTapDown(w,k,v)}),k.onTapLeave(v=>{this.handleKeyShapeTapLeave(w,k,v)})}}this.letterCircle=new p({circleOfRadius:28,fillColor:h.Silver,hidden:!0,suppressEvents:!0}),t.addChild(this.letterCircle),this.letterCircleLabel=new y({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 s=this.getKeyAsString(t),r={type:u.Composite,compositeType:"VirtualKeyboard",compositeEventType:"VirtualKeyboardKeyDown",target:this,handled:!1,key:s,code:t.code,shiftKey:this.shiftActivated,keyTapMetadata:{size:e.size,point:i.point,buttons:i.buttons},...g.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 s=this.getKeyAsString(t),r={type:u.Composite,compositeType:"VirtualKeyboard",compositeEventType:"VirtualKeyboardKeyUp",target:this,handled:!1,key:s,code:t.code,shiftKey:this.shiftActivated,keyTapMetadata:{size:e.size,point:i.point,buttons:i.buttons},...g.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 s=this.getKeyAsString(t),r={type:u.Composite,compositeType:"VirtualKeyboard",compositeEventType:"VirtualKeyboardKeyLeave",target:this,handled:!1,key:s,code:t.code,shiftKey:this.shiftActivated,keyTapMetadata:{size:e.size,point:i.point,buttons:i.buttons},...g.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 s=1;const r=1;let o,n,a,l,d=!1;return typeof i=="string"?(o=i,this.capitalLettersOnly?n=o.toUpperCase():n=o,a=o.toUpperCase()):Array.isArray(i)?(o=i[0],n=o,a=i[1]):(o=i.code,n=i.labelText??"",a=i.labelTextShifted??n,s=i.widthRatio??1,l=i.keyIcon,d=i.isShift??!1),{widthRatio:s,heightRatio:r,code:o,labelText:n,labelTextShifted:a,keyIcon:l,isShift:d}}))}handleCompositeEvent(t){const e=this.internalKeyboardRowsToInternalKeyboardConfiguration(this.keyboardRows),i=this.keyShapes.find(s=>s.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 s=i.parent;if(this.letterCircle.position.x=s.position.x,i.rect?.size?.height===void 0)throw new Error("keyShape.rect.height is undefined");this.letterCircle.position.y=s.position.y-i.rect.size.height*1.2;const o=this.internalKeyboardRowsToInternalKeyboardConfiguration(this.keyboardRows).flat().find(n=>n.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(s=>s.userData.code.toLowerCase().includes("shift")).forEach(s=>{s.fillColor=this.specialKeyDownColor}),t.flat().filter(s=>s.isShift).forEach(s=>{s.keyIcon&&(s.keyIcon.fillColor=h.Black)}),t.flatMap(s=>s).forEach(s=>{const r=this.keyLabels.find(o=>o.userData.code===s.code);if(!r)throw new Error("keyLabel is not defined");r.text!==void 0&&(r.text=s.labelTextShifted??"")})}showKeyboardNotShifted(t){this.keyShapes.filter(s=>s.userData.code.toLowerCase().includes("shift")).forEach(s=>{s.fillColor=this.keyColor}),t.flat().filter(s=>s.isShift).forEach(s=>{s.keyIcon&&(s.keyIcon.fillColor=h.Transparent)}),t.flatMap(s=>s).forEach(s=>{const r=this.keyLabels.find(o=>o.userData.code===s.code);if(!r)throw new Error("keyLabel is not defined");r.text!==void 0&&(r.text=s.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"],s={path:{pathString:"m288-6.6849e-14 -288 288h144v288h288v-288h144l-288-288z",width:24},lineWidth:2,strokeColor:h.Black,fillColor:h.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:h.Black,fillColor:h.Red,suppressEvents:!0},o=[{code:"Shift",isShift:!0,widthRatio:1.5,keyIcon:new p(s)},"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})}}g.registerM2NodeClass(Z);const X=$.sinusoidalInOut,Y=500;class pt extends lt{static create(t){const e=new Array;return t.instructionScenes.forEach((i,s)=>{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}),n=i.backButtonText??t.backButtonText??"Back",a=i.backButtonTextInterpolation??t.backButtonTextInterpolation,l=i.nextButtonText??t.nextButtonText??"Next",d=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=i.backgroundColor??t.backgroundColor,R=i.imageAboveText??!0,K=i.imageMarginTop??0,k=i.imageMarginBottom??0,L=i.textMarginStart??48,v=i.textMarginEnd??48,W=i.textAlignmentMode??dt.Left,tt=i.textFontSize??16,et=i.titleFontSize??16,it=i.titleMarginTop??48,st=i.backButtonBackgroundColor??t.backButtonBackgroundColor??h.Black,ot=i.backButtonFontColor??t.backButtonFontColor??h.White,nt=i.nextButtonBackgroundColor??t.nextButtonBackgroundColor??h.Black,rt=i.nextButtonFontColor??t.nextButtonFontColor??h.White,U=t.sceneNamePrefix??"instructions",c=new q({name:U+"-"+(s+1).toString().padStart(2,"0"),backgroundColor:I});let H;i.title!==void 0&&(H=new y({text:i.title,interpolation:i.titleInterpolation,fontSize:et,layout:{marginTop:it,constraints:{topToTopOf:c,startToStartOf:c,endToEndOf:c}}}),c.addChild(H));let D;if(i.text!==void 0&&(D=new y({text:i.text,interpolation:i.textInterpolation,preferredMaxLayoutWidth:ct.MatchConstraint,horizontalAlignmentMode:W,fontSize:tt,layout:{marginStart:L,marginEnd:v,constraints:{topToTopOf:c,bottomToBottomOf:c,startToStartOf:c,endToEndOf:c,verticalBias:i.textVerticalBias}}}),c.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:c,endToEndOf:c}}}):T=new B({imageName:i.imageName,layout:{marginTop:K,constraints:{topToBottomOf:D,startToStartOf:c,endToEndOf:c}}}):T=new B({imageName:i.imageName,layout:{constraints:{topToTopOf:c,bottomToBottomOf:c,verticalBias:i.imageVerticalBias,startToStartOf:c,endToEndOf:c}}}),c.addChild(T)}if(s>0){const T=new x({name:"backButton",text:n,interpolation:a,fontColor:ot,backgroundColor:st,size:{width:m,height:w},layout:{marginStart:32,marginBottom:80,constraints:{bottomToBottomOf:c,startToStartOf:c}}});T.isUserInteractionEnabled=!0,T.onTapDown(()=>{c.game.presentScene(U+"-"+(s+1-1).toString().padStart(2,"0"),o)}),c.addChild(T)}const N=new x({name:"nextButton",text:l,interpolation:d,fontColor:rt,backgroundColor:nt,size:{width:E,height:A},layout:{marginEnd:32,marginBottom:80,constraints:{bottomToBottomOf:c,endToEndOf:c}}});N.isUserInteractionEnabled=!0,s!==t.instructionScenes.length-1?N.onTapDown(()=>{c.game.presentScene(U+"-"+(s+1+1).toString().padStart(2,"0"),r)}):t.postInstructionsScene!==void 0?N.onTapDown(()=>{c.game.presentScene(t.postInstructionsScene??"",r)}):N.onTapDown(()=>{const T=c.game.scenes.indexOf(c);if(T===-1)console.warn("warning: postInstructionsScene is not defined, and next scene cannot be determined.");else{const G=T+1;G<c.game.scenes.length?c.game.presentScene(c.game.scenes[G],r):console.warn("warning: postInstructionsScene is not defined, and there is no next scene to present.")}}),c.addChild(N),e.push(c)}),e}static Create(t){return this.create(t)}}const gt=$.sinusoidalInOut,ft=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??h.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??h.RoyalBlue}),this.addChild(e);else throw new Error("Invalid timer shape options.");const i=Math.floor(t.milliseconds/1e3),s=new y({text:"",fontSize:t?.timerNumbersFontSize??50,fontName:t?.timerNumbersFontName,fontColor:t?.timerNumbersFontColor??h.White});e.addChild(s);const r=new y({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 n=i-1;n>0;n--)o.push(b.wait({duration:1e3})),o.push(b.custom({callback:()=>{s.text=n.toString()}}));o.push(b.wait({duration:1e3})),o.push(b.custom({callback:()=>{s.text=t?.zeroString??"0"}})),t?.zeroDwellMilliseconds!==void 0&&o.push(b.wait({duration:t.zeroDwellMilliseconds})),o.push(b.custom({callback:()=>{const n=this.game;n.scenes.indexOf(this)===n.scenes.length-1&&n.end();const l=n.scenes[n.scenes.indexOf(this)+1];n.presentScene(l,t?.transition??M.slide({direction:V.Left,duration:t?.transitionDurationMilliseconds??ft,easing:gt}))}})),this.onSetup(()=>{s.text=i.toString()}),this.onAppear(()=>{this.run(b.sequence(o))})}}class wt extends z{constructor(t){super(t),this.compositeType="LocalePicker",this.DEFAULT_FONT_SIZE=24,this.automaticallyChangeLocale=!0,this._localeOptions=new Array,this._backgroundColor=h.White,this._fontSize=this.DEFAULT_FONT_SIZE,this._fontColor=h.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(s=>!(s.nodeUuid===i.nodeUuid&&s.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 B({name:"localePickerIcon",imageName:"__localePickerIcon",position:this.iconPosition,isUserInteractionEnabled:!0}),this.addChild(this.iconSprite),this.iconSprite.onTapDown(n=>{n.handled=!0,this.setDialogVisibility(!0)}),this.iconSprite.onTapUp(n=>{n.handled=!0}),this.iconSprite.onTapUpAny(n=>{n.handled=!0}),this.iconSprite.onPointerUp(n=>{n.handled=!0}),this.iconSprite.onPointerDown(n=>{n.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(n=>{n.handled=!0,this.eventListeners.length>0&&this.eventListeners.filter(a=>a.type==="LocalePickerResult").forEach(a=>{const l={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(l)}),this.setDialogVisibility(!1)}),t.onTapUpAny(n=>{n.handled=!0}),t.onTapDown(n=>{n.handled=!0}),t.onPointerUp(n=>{n.handled=!0}),t.onPointerDown(n=>{n.handled=!0}),this.addChild(t);const e=this.fontSize/this.DEFAULT_FONT_SIZE*50,i=this.localeOptions.length*e,s=m2c2Globals.canvasCssWidth/2,r={x:m2c2Globals.canvasCssWidth/2,y:m2c2Globals.canvasCssHeight/2},o=new p({rect:{width:s,height:i,x:r.x,y:r.y},cornerRadius:this.cornerRadius,fillColor:this.backgroundColor,isUserInteractionEnabled:!0,hidden:!0});o.onTapDown(n=>{n.handled=!0}),o.onTapUp(n=>{n.handled=!0}),o.onTapUpAny(n=>{n.handled=!0}),o.onPointerUp(n=>{n.handled=!0}),o.onPointerDown(n=>{n.handled=!0}),this.addChild(o);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 l=new B({imageName:a.text,position:{x:r.x,y:r.y+n*e-i/2+e/2},isUserInteractionEnabled:!0,zPosition:1,hidden:!0});if(this.addChild(l),this.currentLocale===a.locale){const d=new y({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+n*e-i/2+e/2},hidden:!0,localize:!1});this.addChild(d);const m=new y({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+n*e-i/2+e/2},hidden:!0,localize:!1});this.addChild(m)}l.onTapUp(d=>{d.handled=!0,this.handleLocaleSelection(d,a)}),l.onTapUpAny(d=>{d.handled=!0}),l.onTapDown(d=>{d.handled=!0}),l.onPointerUp(d=>{d.handled=!0}),l.onPointerDown(d=>{d.handled=!0})}else{let l=a.text;this.currentLocale===a.locale&&(l=`${this.LEFT_SELECTION_INDICATOR} ${l} ${this.RIGHT_SELECTION_INDICATOR}`);const d=new y({text:l,fontSize:this.fontSize,fontColor:this.fontColor,position:{x:r.x,y:r.y+n*e-i/2+e/2},isUserInteractionEnabled:!0,zPosition:1,hidden:!0,localize:!1});d.onTapUp(m=>{m.handled=!0,this.handleLocaleSelection(m,a)}),d.onTapUpAny(m=>{m.handled=!0}),d.onTapDown(m=>{m.handled=!0}),d.onPointerUp(m=>{m.handled=!0}),d.onPointerDown(m=>{m.handled=!0}),this.addChild(d)}}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 s={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(s)}),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 z{constructor(t){super(t),this.compositeType="CountdownTimer",this._milliseconds=3e3,this._tickIntervalMilliseconds=1e3,this._fontSize=50,this._fontColor=h.White,this._zeroString="0",this._timerShape={circle:{radius:100},fillColor:h.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??h.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??h.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 y({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(b.wait({duration:this.tickIntervalMilliseconds})),this.countdownSequence.push(b.custom({callback:()=>{this.tick(e-this.tickIntervalMilliseconds)}}));this.countdownSequence.push(b.wait({duration:this.tickIntervalMilliseconds})),this.countdownSequence.push(b.custom({callback:()=>{this.tick(0);const e={type:u.Composite,compositeType:this.compositeType,compositeEventType:"CountdownTimerComplete",target:this,handled:!1,millisecondsRemaining:0,...g.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,...g.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(b.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){f.value(this._milliseconds,t)||(this._milliseconds=t,this.needsInitialization=!0,this.savePropertyChangeEvent("milliseconds",t))}get tickIntervalMilliseconds(){return this._tickIntervalMilliseconds}set tickIntervalMilliseconds(t){f.value(this._tickIntervalMilliseconds,t)||(this._tickIntervalMilliseconds=t,this.needsInitialization=!0,this.savePropertyChangeEvent("tickIntervalMilliseconds",t))}get fontColor(){return this._fontColor}set fontColor(t){f.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){f.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){f.value(this._timerShape,t)||(this._timerShape=t,this.needsInitialization=!0,this.savePropertyChangeEvent("timerShape",t))}get textVerticalBias(){return this._textVerticalBias}set textVerticalBias(t){f.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)})}}g.registerM2NodeClass(Q);class Ct extends z{constructor(t){super(t),this.compositeType="Slider",this._trackSize={width:250,height:10},this._trackColor=h.Black,this._thumbSize={width:20,height:40},this._thumbColor=h.DarkGray,this._min=0,this._max=100,this._value=(this.max-this.min)/2,this.originalOptions=JSON.parse(JSON.stringify(t)),t.trackSize&&(this.trackSize=t.trackSize),t.trackColor&&(this.trackColor=t.trackColor),t.thumbSize&&(this.thumbSize=t.thumbSize),t.thumbColor&&(this.thumbColor=t.thumbColor),t.min!==void 0&&(this.min=t.min),t.max!==void 0&&(this.max=t.max),t.value!==void 0&&(this.value=t.value),this.saveNodeNewEvent()}get thumbShape(){if(this._thumbShape===void 0)throw new Error("thumbShape is not defined.");return this._thumbShape}set thumbShape(t){this._thumbShape=t}get completeNodeOptions(){return{...this.options,...this.getNodeOptions(),...this.getDrawableOptions(),...this.originalOptions}}initialize(){this.removeAllChildren();const t=new p({rect:{width:this.trackSize.width,height:this.trackSize.height},cornerRadius:8,fillColor:this.trackColor});this.addChild(t),this.thumbShape=new p({rect:{width:this.thumbSize.width,height:this.thumbSize.height},cornerRadius:8,fillColor:this.thumbColor,isUserInteractionEnabled:!0,draggable:!0,zPosition:1,position:{x:this.value*this.trackSize.width/(this.max-this.min)-this.trackSize.width/2,y:0}}),t.addChild(this.thumbShape);const e=new p({rect:{width:this.trackSize.width,height:this.thumbSize.height},alpha:0,isUserInteractionEnabled:!0,zPosition:0});t.addChild(e),e.onTapDown(s=>{this.thumbShape.position.x=s.point.x-t.size.width/2,this.updateThumbLabel()});const i=new p({rect:{width:this.trackSize.width,height:this.parentSceneAsNode.size.height*2},alpha:0,isUserInteractionEnabled:!0});this.addChild(i),i.onPointerMove(()=>{this.thumbShape.draggable=!0}),i.onPointerLeave(()=>{this.thumbShape.draggable=!1}),this.thumbShape.onTapDown(s=>{s.handled=!0,s.point.y!==0&&(this.thumbShape.position.y=0),s.point.x<-this.trackSize.width/2&&(this.thumbShape.position.x=-this.trackSize.width/2),s.point.x>this.trackSize.width/2&&(this.thumbShape.position.x=this.trackSize.width/2),this.updateThumbLabel()}),this.thumbShape.onDrag(s=>{s.position.y!==0&&(this.thumbShape.position.y=0),s.position.x<-this.trackSize.width/2&&(this.thumbShape.position.x=-this.trackSize.width/2),s.position.x>this.trackSize.width/2&&(this.thumbShape.position.x=this.trackSize.width/2),this.updateThumbLabel()}),this.thumbShape.onDragEnd(()=>{const s=Math.round((this.thumbShape.position.x+this.trackSize.width/2)/this.trackSize.width*(this.max-this.min));this.thumbShape.position.x=s/(this.max-this.min)*this.trackSize.width-this.trackSize.width/2,this.updateThumbLabel()}),this.needsInitialization=!1}updateThumbLabel(){const t=(this.thumbShape.position.x+this.trackSize.width/2)/this.trackSize.width*(this.max-this.min);this.thumbLabel||(this.thumbLabel=new y({text:t.toString()}),this.addChild(this.thumbLabel)),this.thumbLabel.text=Math.round(t).toString(),this.thumbLabel.position={x:this.thumbShape.position.x,y:this.thumbShape.position.y-30},this.thumbLabel&&(this.thumbLabel.position={x:this.thumbShape.position.x,y:this.thumbShape.position.y-30});const e={type:u.Composite,compositeType:"Slider",compositeEventType:"SliderValueChanged",target:this,value:t,...g.createTimestamps()};this.handleCompositeEvent(e),this.saveEvent(e),this.eventListeners.length>0&&this.eventListeners.filter(i=>i.type===u.Composite&&i.compositeType===this.compositeType&&i.compositeEventType==="SliderValueChanged").forEach(i=>{i.callback(e)})}onValueChanged(t,e){const i={type:u.Composite,compositeEventType:"SliderValueChanged",compositeType:this.compositeType,nodeUuid:this.uuid,callback:t};this.addSliderEventListener(i,e)}addSliderEventListener(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 trackSize(){return this._trackSize}set trackSize(t){this._trackSize=t}get trackColor(){return this._trackColor}set trackColor(t){this._trackColor=t}get thumbSize(){return this._thumbSize}set thumbSize(t){this._thumbSize=t}get thumbColor(){return this._thumbColor}set thumbColor(t){this._thumbColor=t}get value(){return this._value}set value(t){this._value=t}get min(){return this._min}set min(t){this._min=t}get max(){return this._max}set max(t){this._max=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)})}}console.log("\u26AA @m2c2kit/addons version 0.3.28 (d1ad307f)");export{x as Button,mt as CountdownScene,Q as CountdownTimer,ut as Dialog,J as DialogResult,j as DrawPad,C as DrawPadEventType,_ as DrawPadItemEventType,O as Grid,pt as Instructions,wt as LocalePicker,Ct as Slider,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.28",
|
|
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",
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
"clean": "rimraf build dist .rollup.cache tsconfig.tsbuildinfo",
|
|
19
19
|
"test": "echo \"Error: no test specified\" && exit 1"
|
|
20
20
|
},
|
|
21
|
-
"license": "
|
|
21
|
+
"license": "Apache-2.0",
|
|
22
22
|
"author": {
|
|
23
23
|
"name": "Scott T. Yabiku",
|
|
24
24
|
"email": "syabiku@gmail.com"
|
|
@@ -30,16 +30,16 @@
|
|
|
30
30
|
},
|
|
31
31
|
"homepage": "https://m2c2-project.github.io/m2c2kit",
|
|
32
32
|
"dependencies": {
|
|
33
|
-
"@m2c2kit/core": "0.3.
|
|
33
|
+
"@m2c2kit/core": "0.3.29"
|
|
34
34
|
},
|
|
35
35
|
"devDependencies": {
|
|
36
|
-
"@m2c2kit/build-helpers": "0.3.
|
|
36
|
+
"@m2c2kit/build-helpers": "0.3.25",
|
|
37
37
|
"rimraf": "6.0.1",
|
|
38
|
-
"rollup": "4.
|
|
38
|
+
"rollup": "4.37.0",
|
|
39
39
|
"rollup-plugin-copy": "3.5.0",
|
|
40
|
-
"rollup-plugin-dts": "6.
|
|
41
|
-
"rollup-plugin-esbuild": "6.2.
|
|
42
|
-
"typescript": "5.
|
|
40
|
+
"rollup-plugin-dts": "6.2.1",
|
|
41
|
+
"rollup-plugin-esbuild": "6.2.1",
|
|
42
|
+
"typescript": "5.8.2"
|
|
43
43
|
},
|
|
44
44
|
"engines": {
|
|
45
45
|
"node": ">=18"
|