tscratch 0.7.0 → 0.7.1

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.
@@ -29,7 +29,7 @@ declare abstract class Sprite {
29
29
  private static collisionCtx;
30
30
  abstract getBoundingBox(): BoundingBox;
31
31
  abstract getPath(): Path2D;
32
- abstract draw(stamping?: boolean): void;
32
+ abstract draw(stamping?: true): void;
33
33
  protected abstract create(options?: SpriteOptions): this;
34
34
  protected refresh(): void;
35
35
  protected invalidatePath(): void;
@@ -86,13 +86,13 @@ declare class Engine {
86
86
  sceneMap: SceneMap;
87
87
  private variableMap;
88
88
  static init(): Engine;
89
- changeScene(scene: string): void;
89
+ setScene(scene: string): void;
90
90
  setLoop(scene: string, loop: GameLoop): void;
91
91
  pauseLoop(): void;
92
92
  resumeLoop(): void;
93
93
  addSprite(sprite: Sprite): void;
94
94
  removeSprite(sprite: Sprite): void;
95
- setMaxFramesPerSecond(maxFPS: number): Promise<void>;
95
+ setMaxFPS(maxFPS: number): Promise<void>;
96
96
  refresh(): void;
97
97
  wait(ms: number): Promise<void>;
98
98
  waitUntil(conditionGetter: () => boolean): Promise<void>;
@@ -154,7 +154,7 @@ declare class Rectangle extends Sprite {
154
154
  outlineWidth: number;
155
155
  getBoundingBox(): BoundingBox;
156
156
  getPath(): Path2D;
157
- draw(stamping?: boolean): void;
157
+ draw(stamping?: true): void;
158
158
  create(options?: RectangleOptions): this;
159
159
  protected getCreateOptions(): {
160
160
  width: number;
@@ -191,7 +191,7 @@ declare class Square extends Sprite {
191
191
  outlineWidth: number;
192
192
  getBoundingBox(): BoundingBox;
193
193
  getPath(): Path2D;
194
- draw(stamping?: boolean): void;
194
+ draw(stamping?: true): void;
195
195
  create(options?: SquareOptions): this;
196
196
  protected getCreateOptions(): {
197
197
  sideLength: number;
@@ -228,7 +228,7 @@ declare class Oval extends Sprite {
228
228
  outlineWidth: number;
229
229
  getBoundingBox(): BoundingBox;
230
230
  getPath(): Path2D;
231
- draw(stamping?: boolean): void;
231
+ draw(stamping?: true): void;
232
232
  create(options?: OvalOptions): this;
233
233
  protected getCreateOptions(): {
234
234
  radX: number;
@@ -265,7 +265,7 @@ declare class Circle extends Sprite {
265
265
  outlineWidth: number;
266
266
  getBoundingBox(): BoundingBox;
267
267
  getPath(): Path2D;
268
- draw(stamping?: boolean): void;
268
+ draw(stamping?: true): void;
269
269
  create(options?: CircleOptions): this;
270
270
  protected getCreateOptions(): {
271
271
  radius: number;
@@ -302,7 +302,7 @@ declare class Arc extends Sprite {
302
302
  outlineWidth: number;
303
303
  getBoundingBox(): BoundingBox;
304
304
  getPath(): Path2D;
305
- draw(stamping?: boolean): void;
305
+ draw(stamping?: true): void;
306
306
  create(options?: ArcOptions): this;
307
307
  protected getCreateOptions(): {
308
308
  radius: number;
@@ -341,7 +341,7 @@ declare class RegularPolygon extends Sprite {
341
341
  outlineWidth: number;
342
342
  getBoundingBox(): BoundingBox;
343
343
  getPath(): Path2D;
344
- draw(stamping?: boolean): void;
344
+ draw(stamping?: true): void;
345
345
  create(options?: RegularPolygonOptions): this;
346
346
  protected getCreateOptions(): {
347
347
  sides: number;
@@ -378,7 +378,7 @@ declare class CustomPolygon extends Sprite {
378
378
  outlineWidth: number;
379
379
  getBoundingBox(): BoundingBox;
380
380
  getPath(): Path2D;
381
- draw(stamping?: boolean): void;
381
+ draw(stamping?: true): void;
382
382
  create(options?: CustomPolygonOptions): this;
383
383
  protected getCreateOptions(): {
384
384
  vertices: Vec2[];
@@ -430,6 +430,7 @@ declare class Pen extends Sprite {
430
430
  stamp(sprite: Sprite): void;
431
431
  eraseAll(): void;
432
432
  dot(): void;
433
+ drawSprite(sprite: Sprite): void;
433
434
  private drawLine;
434
435
  move(steps: number): void;
435
436
  setX(x: number): void;
@@ -460,7 +461,7 @@ declare class Text extends Sprite {
460
461
  private font;
461
462
  getBoundingBox(): BoundingBox;
462
463
  getPath(): Path2D;
463
- draw(stamping?: boolean): void;
464
+ draw(stamping?: true): void;
464
465
  create(options?: TextOptions): this;
465
466
  protected getCreateOptions(): {
466
467
  content: string | number;
@@ -505,7 +506,7 @@ declare class Button extends Sprite {
505
506
  outlineWidth: number;
506
507
  getBoundingBox(): BoundingBox;
507
508
  getPath(): Path2D;
508
- draw(stamping?: boolean): void;
509
+ draw(stamping?: true): void;
509
510
  create(options?: ButtonOptions): this;
510
511
  protected getCreateOptions(): {
511
512
  content: string | number;
@@ -559,7 +560,7 @@ declare class ImageSprite extends Sprite {
559
560
  protected img: HTMLImageElement;
560
561
  getBoundingBox(): BoundingBox;
561
562
  getPath(): Path2D;
562
- draw(stamping?: boolean): void;
563
+ draw(stamping?: true): void;
563
564
  create(options?: ImageSpriteOptions): this;
564
565
  protected getCreateOptions(): {
565
566
  costumes: string[];
@@ -29,7 +29,7 @@ declare abstract class Sprite {
29
29
  private static collisionCtx;
30
30
  abstract getBoundingBox(): BoundingBox;
31
31
  abstract getPath(): Path2D;
32
- abstract draw(stamping?: boolean): void;
32
+ abstract draw(stamping?: true): void;
33
33
  protected abstract create(options?: SpriteOptions): this;
34
34
  protected refresh(): void;
35
35
  protected invalidatePath(): void;
@@ -86,13 +86,13 @@ declare class Engine {
86
86
  sceneMap: SceneMap;
87
87
  private variableMap;
88
88
  static init(): Engine;
89
- changeScene(scene: string): void;
89
+ setScene(scene: string): void;
90
90
  setLoop(scene: string, loop: GameLoop): void;
91
91
  pauseLoop(): void;
92
92
  resumeLoop(): void;
93
93
  addSprite(sprite: Sprite): void;
94
94
  removeSprite(sprite: Sprite): void;
95
- setMaxFramesPerSecond(maxFPS: number): Promise<void>;
95
+ setMaxFPS(maxFPS: number): Promise<void>;
96
96
  refresh(): void;
97
97
  wait(ms: number): Promise<void>;
98
98
  waitUntil(conditionGetter: () => boolean): Promise<void>;
@@ -154,7 +154,7 @@ declare class Rectangle extends Sprite {
154
154
  outlineWidth: number;
155
155
  getBoundingBox(): BoundingBox;
156
156
  getPath(): Path2D;
157
- draw(stamping?: boolean): void;
157
+ draw(stamping?: true): void;
158
158
  create(options?: RectangleOptions): this;
159
159
  protected getCreateOptions(): {
160
160
  width: number;
@@ -191,7 +191,7 @@ declare class Square extends Sprite {
191
191
  outlineWidth: number;
192
192
  getBoundingBox(): BoundingBox;
193
193
  getPath(): Path2D;
194
- draw(stamping?: boolean): void;
194
+ draw(stamping?: true): void;
195
195
  create(options?: SquareOptions): this;
196
196
  protected getCreateOptions(): {
197
197
  sideLength: number;
@@ -228,7 +228,7 @@ declare class Oval extends Sprite {
228
228
  outlineWidth: number;
229
229
  getBoundingBox(): BoundingBox;
230
230
  getPath(): Path2D;
231
- draw(stamping?: boolean): void;
231
+ draw(stamping?: true): void;
232
232
  create(options?: OvalOptions): this;
233
233
  protected getCreateOptions(): {
234
234
  radX: number;
@@ -265,7 +265,7 @@ declare class Circle extends Sprite {
265
265
  outlineWidth: number;
266
266
  getBoundingBox(): BoundingBox;
267
267
  getPath(): Path2D;
268
- draw(stamping?: boolean): void;
268
+ draw(stamping?: true): void;
269
269
  create(options?: CircleOptions): this;
270
270
  protected getCreateOptions(): {
271
271
  radius: number;
@@ -302,7 +302,7 @@ declare class Arc extends Sprite {
302
302
  outlineWidth: number;
303
303
  getBoundingBox(): BoundingBox;
304
304
  getPath(): Path2D;
305
- draw(stamping?: boolean): void;
305
+ draw(stamping?: true): void;
306
306
  create(options?: ArcOptions): this;
307
307
  protected getCreateOptions(): {
308
308
  radius: number;
@@ -341,7 +341,7 @@ declare class RegularPolygon extends Sprite {
341
341
  outlineWidth: number;
342
342
  getBoundingBox(): BoundingBox;
343
343
  getPath(): Path2D;
344
- draw(stamping?: boolean): void;
344
+ draw(stamping?: true): void;
345
345
  create(options?: RegularPolygonOptions): this;
346
346
  protected getCreateOptions(): {
347
347
  sides: number;
@@ -378,7 +378,7 @@ declare class CustomPolygon extends Sprite {
378
378
  outlineWidth: number;
379
379
  getBoundingBox(): BoundingBox;
380
380
  getPath(): Path2D;
381
- draw(stamping?: boolean): void;
381
+ draw(stamping?: true): void;
382
382
  create(options?: CustomPolygonOptions): this;
383
383
  protected getCreateOptions(): {
384
384
  vertices: Vec2[];
@@ -430,6 +430,7 @@ declare class Pen extends Sprite {
430
430
  stamp(sprite: Sprite): void;
431
431
  eraseAll(): void;
432
432
  dot(): void;
433
+ drawSprite(sprite: Sprite): void;
433
434
  private drawLine;
434
435
  move(steps: number): void;
435
436
  setX(x: number): void;
@@ -460,7 +461,7 @@ declare class Text extends Sprite {
460
461
  private font;
461
462
  getBoundingBox(): BoundingBox;
462
463
  getPath(): Path2D;
463
- draw(stamping?: boolean): void;
464
+ draw(stamping?: true): void;
464
465
  create(options?: TextOptions): this;
465
466
  protected getCreateOptions(): {
466
467
  content: string | number;
@@ -505,7 +506,7 @@ declare class Button extends Sprite {
505
506
  outlineWidth: number;
506
507
  getBoundingBox(): BoundingBox;
507
508
  getPath(): Path2D;
508
- draw(stamping?: boolean): void;
509
+ draw(stamping?: true): void;
509
510
  create(options?: ButtonOptions): this;
510
511
  protected getCreateOptions(): {
511
512
  content: string | number;
@@ -559,7 +560,7 @@ declare class ImageSprite extends Sprite {
559
560
  protected img: HTMLImageElement;
560
561
  getBoundingBox(): BoundingBox;
561
562
  getPath(): Path2D;
562
- draw(stamping?: boolean): void;
563
+ draw(stamping?: true): void;
563
564
  create(options?: ImageSpriteOptions): this;
564
565
  protected getCreateOptions(): {
565
566
  costumes: string[];
@@ -1,2 +1,2 @@
1
- var r=document.getElementById("game-window")||document.createElement("canvas"),h=r.getContext("2d"),b=document.createElement("canvas"),a=b.getContext("2d");b.id="pen-canvas";var k=16/9,B;function G(){r.width=k*B,r.height=B,b.width=k*B,b.height=B}function q(o){B=o,G()}function U(o){k=o,G()}r.parentElement?.insertBefore(b,r);q(500);var c=class o{x=0;y=0;dir=0;size=1;scene="main";hidden=!1;layer=0;cachedPath=null;pathDirty=!0;static collisionCanvas=null;static collisionCtx=null;refresh(){u.init().refresh()}invalidatePath(){this.pathDirty=!0,this.cachedPath=null}getCachedPath(){return(this.pathDirty||!this.cachedPath)&&(this.cachedPath=this.getPath(),this.pathDirty=!1),this.cachedPath}constructor(t){Object.assign(this,t),u.init().addSprite(this)}getCreateOptions(){return{x:this.x,y:this.y,dir:this.dir,size:this.size,scene:this.scene,layer:this.layer,hidden:this.hidden}}clone(t){return this.create({...this.getCreateOptions(),...t})}touching(t){if(this.hidden||t.hidden||this.scene!=="*"&&t.scene!=="*"&&this.scene!==t.scene)return!1;let i=this.getBoundingBox(),e=t.getBoundingBox();if(!(Math.abs(i.x-e.x)<(i.width+e.width)/2&&Math.abs(i.y-e.y)<(i.height+e.height)/2))return!1;let n=i.x-i.width/2,l=i.y+i.height/2,p=i.x+i.width/2,d=i.y-i.height/2,m=e.x-e.width/2,g=e.y+e.height/2,C=e.x+e.width/2,f=e.y-e.height/2,O=Math.max(n,m),P=Math.min(d,f),S=Math.min(p,C),x=Math.max(l,g),y=S-O,M=x-P;if(y<=1||M<=1)return!1;o.collisionCanvas||(o.collisionCanvas=document.createElement("canvas"),o.collisionCtx=o.collisionCanvas.getContext("2d",{willReadFrequently:!0}));let w=o.collisionCtx;o.collisionCanvas.width<y&&(o.collisionCanvas.width=y),o.collisionCanvas.height<M&&(o.collisionCanvas.height=M),w.clearRect(0,0,y,M);let $=(v,J)=>{w.save();let K=v.x-O,Q=x-v.y;w.translate(K,Q),w.rotate(v.toRadians(v.dir)),w.fillStyle=J,w.fill(v.getCachedPath()),w.restore()};$(this,"red");let H=w.getImageData(0,0,y,M).data;w.clearRect(0,0,y,M),$(t,"blue");let j=w.getImageData(0,0,y,M).data;for(let v=3;v<H.length;v+=4)if(H[v]>0&&j[v]>0)return!0;return!1}toRadians(t){return t*Math.PI/180}toDegrees(t){return t*180/Math.PI}distanceTo(t,i){return Math.hypot(t-this.x,i-this.y)}move(t){this.x+=t*Math.sin(this.toRadians(this.dir)),this.y+=t*Math.cos(this.toRadians(this.dir)),this.refresh()}turn(t){this.dir+=t,this.refresh()}point(t){this.dir=t,this.refresh()}pointTowards(t,i){this.dir=90-this.toDegrees(Math.atan2(i-this.y,t-this.x)),this.refresh()}setX(t){this.x=t,this.refresh()}setY(t){this.y=t,this.refresh()}goTo(t,i){this.x=t,this.y=i,this.refresh()}changeX(t){this.x+=t,this.refresh()}changeY(t){this.y+=t,this.refresh()}show(){this.hidden=!1,this.refresh()}hide(){this.hidden=!0,this.refresh()}setSize(t){this.size=t>0?t:0,this.invalidatePath(),this.refresh()}changeSize(t){this.size=this.size+t>0?this.size+t:0,this.invalidatePath(),this.refresh()}goToLayer(t){this.layer=t,this.refresh()}changeLayer(t){this.layer+=t,this.refresh()}};var u=class o{static instance;loopRunning=!1;gameLoop=null;maxFPS=24;deltaTime=1/this.maxFPS;lastFrame=performance.now();refreshScheduled=!1;animationFrameId=null;sounds=[];mouseX=0;mouseY=0;mouseDown=!1;mouseClicked=!1;keysPressed=new Set;currentScene="main";sceneMap=new Map;variableMap=new Map;static init(){return this.instance||(this.instance=new o),this.instance}changeScene(t){this.sceneMap.get(t)||this.sceneMap.set(t,{sprites:[],loop:null}),this.loopRunning=!1,this.currentScene=t,this.gameLoop=this.sceneMap.get(t).loop,this.setMaxFramesPerSecond(this.maxFPS)}setLoop(t,i){if(!this.sceneMap.get(t)){this.sceneMap.set(t,{sprites:[],loop:i}),t===this.currentScene&&this.changeScene(t);return}this.sceneMap.get(t).loop=i,t===this.currentScene&&this.changeScene(t)}pauseLoop(){this.loopRunning=!1,this.animationFrameId!==null&&(cancelAnimationFrame(this.animationFrameId),this.animationFrameId=null)}resumeLoop(){this.loopRunning=!0,this.setMaxFramesPerSecond(this.maxFPS)}addSprite(t){let{scene:i,layer:e}=t;if(!this.sceneMap.get(i)){this.sceneMap.set(i,{sprites:[t],loop:null});return}let s=this.sceneMap.get(i).sprites.findIndex(n=>n.layer>e);if(s===-1){this.sceneMap.get(i).sprites.push(t);return}this.sceneMap.get(i).sprites.splice(s,0,t),this.refresh()}removeSprite(t){let{scene:i}=t;this.sceneMap.get(i)&&(this.sceneMap.get(i).sprites=this.sceneMap.get(i).sprites.filter(e=>e!==t),this.refresh())}async setMaxFramesPerSecond(t){this.maxFPS=t;let i=this.gameLoop;if(!i)return;this.animationFrameId!==null&&(cancelAnimationFrame(this.animationFrameId),this.animationFrameId=null),this.loopRunning=!0;let e=1e3/t,s=0,n=async l=>{if(!this.loopRunning)return;let p=l-this.lastFrame;this.lastFrame=l,s+=p,s>=e&&(this.deltaTime=s/1e3,s=s%e,i&&await i()),this.animationFrameId=requestAnimationFrame(n)};this.lastFrame=performance.now(),this.animationFrameId=requestAnimationFrame(n)}refresh(){this.refreshScheduled||(this.refreshScheduled=!0,requestAnimationFrame(()=>{this.refreshScheduled=!1,h.clearRect(0,0,r.width,r.height),[...this.sceneMap.get(this.currentScene).sprites,...this.sceneMap.get("*").sprites].forEach(i=>{i.hidden||i.draw()})}))}async wait(t){return new Promise(i=>setTimeout(i,t))}async waitUntil(t){return new Promise(i=>{let e=()=>{t()?i():setTimeout(e,1e3/this.maxFPS)};e()})}setVariable(t,i){this.variableMap.set(t,i)}getVariable(t){return this.variableMap.get(t)}hovering(t){let{mouseX:i,mouseY:e}=this,s=i+r.width/2,n=r.height/2-e,l=s-(t.x+r.width/2),p=n-(r.height/2-t.y),d=-this.toRadians(t.dir),m=l*Math.cos(d)-p*Math.sin(d),g=l*Math.sin(d)+p*Math.cos(d);return h.isPointInPath(t.getCachedPath(),m,g)}keyPressed(t){switch(t){case"any":return this.keysPressed.size>0;case"up":return this.keysPressed.has("ArrowUp");case"down":return this.keysPressed.has("ArrowDown");case"left":return this.keysPressed.has("ArrowLeft");case"right":return this.keysPressed.has("ArrowRight");case"space":return this.keysPressed.has(" ");default:return this.keysPressed.has(t)}}playSound(t){let i=new Audio(t);return this.sounds.push(i),i.play(),i}stopSound(t){t.pause(),t.currentTime=0,this.sounds=this.sounds.filter(i=>i!==t)}stopAllSounds(){this.sounds.forEach(t=>{t.pause(),t.currentTime=0}),this.sounds=[]}pickRandom(t,i){return t>i&&([t,i]=[i,t]),Math.floor(Math.random()*(i-t+1)+t)}dotProduct(...t){let[i,e]=t;switch(i.length){case 2:return i[0]*e[0]+i[1]*e[1];case 3:return i[0]*e[0]+i[1]*e[1]+i[2]*e[2];case 4:return i[0]*e[0]+i[1]*e[1]+i[2]*e[2]+i[3]*e[3]}}sin(t){return Math.sin(this.toRadians(t))}cos(t){return Math.cos(this.toRadians(t))}tan(t){return Math.tan(this.toRadians(t))}csc(t){return 1/Math.sin(this.toRadians(t))}sec(t){return 1/Math.cos(this.toRadians(t))}cot(t){return 1/Math.tan(this.toRadians(t))}asin(t){return this.toDegrees(Math.asin(t))}acos(t){return this.toDegrees(Math.acos(t))}acsc(t){return this.toDegrees(Math.asin(1/t))}asec(t){return this.toDegrees(Math.acos(1/t))}toRadians(t){return t*Math.PI/180}toDegrees(t){return t*180/Math.PI}constructor(){this.setMaxFramesPerSecond(24),this.sceneMap.set("main",{loop:null,sprites:[]}),this.sceneMap.set("*",{loop:null,sprites:[]}),b.addEventListener("mousemove",t=>{this.mouseX=t.clientX-b.offsetLeft-b.width/2,this.mouseY=-(t.clientY-b.offsetTop-b.height/2)}),b.addEventListener("mousedown",()=>{this.mouseDown=!0}),b.addEventListener("mouseup",()=>{this.mouseDown=!1}),b.addEventListener("click",()=>{this.mouseClicked=!0,setTimeout(()=>this.mouseClicked=!1,0)}),addEventListener("keydown",t=>{t.repeat||this.keysPressed.add(t.key)}),addEventListener("keyup",t=>{this.keysPressed.delete(t.key)})}};import{io as Z}from"socket.io-client";var R=class o{static instance;socket;static connect(t="http://localhost:3000"){return this.instance||(this.instance=new o(t)),this.instance}disconnect(){this.socket.disconnect()}constructor(t){this.socket=Z(t)}broadcast(t,i){this.socket.emit(t,i)}on(t,i){this.socket.on(t,i)}};var T=class o extends c{discriminant="rectangle";tags=new Set(["rectangle"]);width;height;color;outlineColor;outlineWidth;getBoundingBox(){let t=u.init(),i=this.width/2,e=this.height/2,s=t.cos(this.dir),n=t.sin(this.dir),l=2*(Math.abs(i*s)+Math.abs(e*n))*this.size,p=2*(Math.abs(i*n)+Math.abs(e*s))*this.size;return{x:this.x,y:this.y,width:l,height:p}}getPath(){let t=new Path2D;return t.rect(-this.width/2*this.size,-this.height/2*this.size,this.width*this.size,this.height*this.size),t}draw(t){let i=t?a:h;i.save();let e=this.x+r.width/2,s=-this.y+r.height/2;i.translate(e,s),i.rotate(this.toRadians(this.dir));let n=this.getCachedPath();i.fillStyle=this.color,i.strokeStyle=this.outlineColor,i.lineWidth=this.outlineWidth,i.fill(n),this.outlineWidth&&i.stroke(n),i.restore()}create(t){return new o(t)}getCreateOptions(){return{...super.getCreateOptions(),width:this.width,height:this.height,color:this.color,outlineColor:this.outlineColor,outlineWidth:this.outlineWidth}}setWidth(t){this.width=t,this.invalidatePath(),this.refresh()}setHeight(t){this.height=t,this.invalidatePath(),this.refresh()}setColor(t){this.color=t,this.refresh()}constructor(t){super(t),this.width=t?.width??50,this.height=t?.height??50,this.color=t?.color??"black",this.outlineColor=t?.outlineColor??"black",this.outlineWidth=t?.outlineWidth??0,this.draw()}};var Y=class o extends c{discriminant="square";tags=new Set(["square"]);sideLength;color;outlineColor;outlineWidth;getBoundingBox(){let t=u.init(),i=this.sideLength/2,e=t.cos(this.dir),s=t.sin(this.dir),n=2*(Math.abs(i*e)+Math.abs(i*s))*this.size;return{x:this.x,y:this.y,width:n,height:n}}getPath(){let t=new Path2D;return t.rect(-this.sideLength/2*this.size,-this.sideLength/2*this.size,this.sideLength*this.size,this.sideLength*this.size),t}draw(t){let i=t?a:h;i.save();let e=this.x+r.width/2,s=-this.y+r.height/2;i.translate(e,s),i.rotate(this.toRadians(this.dir));let n=this.getCachedPath();i.fillStyle=this.color,i.strokeStyle=this.outlineColor,i.lineWidth=this.outlineWidth,i.fill(n),this.outlineWidth&&i.stroke(n),i.restore()}create(t){return new o(t)}getCreateOptions(){return{...super.getCreateOptions(),sideLength:this.sideLength,color:this.color,outlineColor:this.outlineColor,outlineWidth:this.outlineWidth}}setSideLength(t){this.sideLength=t,this.invalidatePath(),this.refresh()}setColor(t){this.color=t,this.refresh()}constructor(t){super(t),this.sideLength=t?.sideLength??50,this.color=t?.color??"black",this.outlineColor=t?.outlineColor??"black",this.outlineWidth=t?.outlineWidth??0,this.draw()}};var X=class o extends c{discriminant="oval";tags=new Set(["oval"]);radX;radY;color;outlineColor;outlineWidth;getBoundingBox(){let t=u.init(),i=this.radX,e=this.radY,s=t.cos(this.dir),n=t.sin(this.dir),l=2*(Math.abs(i*s)+Math.abs(e*n))*this.size,p=2*(Math.abs(i*n)+Math.abs(e*s))*this.size;return{x:this.x,y:this.y,width:l,height:p}}getPath(){let t=new Path2D;return t.ellipse(0,0,this.radX*this.size,this.radY*this.size,0,0,Math.PI*2),t}draw(t){let i=t?a:h;i.save();let e=this.x+r.width/2,s=-this.y+r.height/2;i.translate(e,s),i.rotate(this.toRadians(this.dir));let n=this.getCachedPath();i.fillStyle=this.color,i.strokeStyle=this.outlineColor,i.lineWidth=this.outlineWidth,i.fill(n),this.outlineWidth&&i.stroke(n),i.restore()}create(t){return new o(t)}getCreateOptions(){return{...super.getCreateOptions(),radX:this.radX,radY:this.radY,color:this.color,outlineColor:this.outlineColor,outlineWidth:this.outlineWidth}}setRadX(t){this.radX=t,this.invalidatePath(),this.refresh()}setRadY(t){this.radY=t,this.invalidatePath(),this.refresh()}setColor(t){this.color=t,this.refresh()}constructor(t){super(t),this.radX=t?.radX??25,this.radY=t?.radY??25,this.color=t?.color??"black",this.outlineColor=t?.outlineColor??"black",this.outlineWidth=t?.outlineWidth??0,this.draw()}};var z=class o extends c{discriminant="circle";tags=new Set(["circle"]);radius;color;outlineColor;outlineWidth;getBoundingBox(){return{x:this.x,y:this.y,width:this.radius*2*this.size,height:this.radius*2*this.size}}getPath(){let t=new Path2D;return t.ellipse(0,0,this.radius*this.size,this.radius*this.size,0,0,Math.PI*2),t}draw(t){let i=t?a:h;i.save();let e=this.x+r.width/2,s=-this.y+r.height/2;i.translate(e,s),i.rotate(this.toRadians(this.dir));let n=this.getCachedPath();i.fillStyle=this.color,i.strokeStyle=this.outlineColor,i.lineWidth=this.outlineWidth,i.fill(n),this.outlineWidth&&i.stroke(n),i.restore()}create(t){return new o(t)}getCreateOptions(){return{...super.getCreateOptions(),radius:this.radius,color:this.color,outlineColor:this.outlineColor,outlineWidth:this.outlineWidth}}setRadius(t){this.radius=t,this.invalidatePath(),this.refresh()}setColor(t){this.color=t,this.refresh()}constructor(t){super(t),this.radius=t?.radius??25,this.color=t?.color??"black",this.outlineColor=t?.outlineColor??"black",this.outlineWidth=t?.outlineWidth??0,this.draw()}};var L=class o extends c{discriminant="arc";tags=new Set(["arc"]);radius;angle;color;outlineColor;outlineWidth;getBoundingBox(){return{x:this.x,y:this.y,width:this.radius*2*this.size,height:this.radius*2*this.size}}getPath(){let t=new Path2D;return t.arc(0,0,this.radius*this.size,this.toRadians(this.angle/2-90),this.toRadians(-this.angle/2-90)),t}draw(t){let i=t?a:h;i.save();let e=this.x+r.width/2,s=-this.y+r.height/2;i.translate(e,s),i.rotate(this.toRadians(this.dir));let n=this.getCachedPath();i.fillStyle=this.color,i.strokeStyle=this.outlineColor,i.lineWidth=this.outlineWidth,i.fill(n),this.outlineWidth&&i.stroke(n),i.restore()}create(t){return new o(t)}getCreateOptions(){return{...super.getCreateOptions(),radius:this.radius,angle:this.angle,color:this.color,outlineColor:this.outlineColor,outlineWidth:this.outlineWidth}}setRadius(t){this.radius=t,this.invalidatePath(),this.refresh()}setAngle(t){this.angle=t,this.invalidatePath(),this.refresh()}setColor(t){this.color=t,this.refresh()}constructor(t){super(t),this.radius=t?.radius??25,this.angle=t?.angle??270,this.color=t?.color??"black",this.outlineColor=t?.outlineColor??"black",this.outlineWidth=t?.outlineWidth??0,this.draw()}};var F=class o extends c{discriminant="regularpolygon";tags=new Set(["regularpolygon"]);sides;radius;color;outlineColor;outlineWidth;getBoundingBox(){return{x:this.x,y:this.y,width:this.radius*2*this.size,height:this.radius*2*this.size}}getPath(){let t=new Path2D,i=2*Math.PI/this.sides;t.moveTo(this.radius*this.size,0);for(let e=1;e<this.sides;e++)t.lineTo(this.radius*Math.cos(i*e)*this.size,this.radius*Math.sin(i*e)*this.size);return t.closePath(),t}draw(t){let i=t?a:h;i.save();let e=this.x+r.width/2,s=-this.y+r.height/2;i.translate(e,s),i.rotate(this.toRadians(this.dir));let n=this.getCachedPath();i.fillStyle=this.color,i.strokeStyle=this.outlineColor,i.lineWidth=this.outlineWidth,i.fill(n),this.outlineWidth&&i.stroke(n),i.restore()}create(t){return new o(t)}getCreateOptions(){return{...super.getCreateOptions(),sides:this.sides,radius:this.radius,color:this.color,outlineColor:this.outlineColor,outlineWidth:this.outlineWidth}}setSides(t){this.sides=t,this.invalidatePath(),this.refresh()}setRadius(t){this.radius=t,this.invalidatePath(),this.refresh()}setColor(t){this.color=t,this.refresh()}constructor(t){super(t),this.sides=t?.sides??5,this.radius=t?.radius??50,this.color=t?.color??"black",this.outlineColor=t?.outlineColor??"black",this.outlineWidth=t?.outlineWidth??0,this.draw()}};var D=class o extends c{discriminant="custompolygon";tags=new Set(["custompolygon"]);vertices;color;outlineColor;outlineWidth;getBoundingBox(){let t=u.init(),i=t.cos(this.dir),e=t.sin(this.dir),s=1/0,n=-1/0,l=1/0,p=-1/0;if(this.vertices.length===0)return{x:this.x,y:this.y,width:0,height:0};for(let f of this.vertices){let O=f[0]*i-f[1]*e,P=f[0]*e+f[1]*i,S=this.x+O,x=this.y+P;S<s&&(s=S),S>n&&(n=S),x<l&&(l=x),x>p&&(p=x)}let d=n-s,m=p-l,g=s+d/2,C=l+m/2;return{x:g*this.size,y:C*this.size,width:d*this.size,height:m*this.size}}getPath(){let t=new Path2D;if(this.vertices.length<2)return t;let i=this.vertices,[e,...s]=i;t.moveTo(e[0]*this.size,-e[1]*this.size);for(let n of s)t.lineTo(n[0]*this.size,-n[1]*this.size);return t.closePath(),t}draw(t){let i=t?a:h;i.save();let e=this.x+r.width/2,s=-this.y+r.height/2;i.translate(e,s),i.rotate(this.toRadians(this.dir));let n=this.getCachedPath();i.fillStyle=this.color,i.strokeStyle=this.outlineColor,i.lineWidth=this.outlineWidth,i.fill(n),this.outlineWidth&&i.stroke(n),i.restore()}create(t){return new o(t)}getCreateOptions(){return{...super.getCreateOptions(),vertices:this.vertices,color:this.color,outlineColor:this.outlineColor,outlineWidth:this.outlineWidth}}setVertices(t){this.vertices=t,this.invalidatePath(),this.refresh()}setColor(t){this.color=t,this.refresh()}constructor(t){super(t),this.vertices=t?.vertices??[],this.color=t?.color??"black",this.outlineColor=t?.outlineColor??"black",this.outlineWidth=t?.outlineWidth??0,this.draw()}};var I=class o extends c{discriminant="pen";tags=new Set(["pen"]);drawing;penSize;color;getBoundingBox(){return{x:this.x,y:this.y,width:this.penSize*this.penSize,height:this.penSize*this.penSize}}getPath(){return new Path2D}draw(){}create(t){return new o(t)}getCreateOptions(){return{...super.getCreateOptions(),drawing:this.drawing,penSize:this.penSize,color:this.color}}up(){this.drawing=!1}down(){this.drawing=!0}stamp(t){t.draw(!0)}eraseAll(){a.clearRect(0,0,r.width,r.height)}dot(){a.fillStyle=this.color,a.fillRect(this.x-this.penSize/2+r.width/2,-this.y-this.penSize/2+r.height/2,this.penSize,this.penSize)}drawLine(t,i){a.beginPath(),a.moveTo(t+r.width/2,-i+r.height/2),a.lineTo(this.x+r.width/2,-this.y+r.height/2),a.lineWidth=this.penSize,a.strokeStyle=this.color,a.stroke()}move(t){let i=this.x,e=this.y;this.x+=t*Math.sin(this.toRadians(this.dir)),this.y+=t*Math.cos(this.toRadians(this.dir)),this.drawing&&this.drawLine(i,e),this.refresh()}setX(t){let i=this.x,e=this.y;this.x=t,this.drawing&&this.drawLine(i,e),this.refresh()}setY(t){let i=this.x,e=this.y;this.y=t,this.drawing&&this.drawLine(i,e),this.refresh()}goTo(t,i){let e=this.x,s=this.y;this.x=t,this.y=i,this.drawing&&this.drawLine(e,s),this.refresh()}changeX(t){let i=this.x,e=this.y;this.x+=t,this.drawing&&this.drawLine(i,e),this.refresh()}changeY(t){let i=this.x,e=this.y;this.y+=t,this.drawing&&this.drawLine(i,e),this.refresh()}constructor(t){super(t),this.drawing=t?.drawing??!1,this.penSize=t?.penSize??5,this.color=t?.color??"black"}};var W=class o extends c{discriminant="text";tags=new Set(["text"]);content;color;fontFamily;fontSize;align;baseline;font;getBoundingBox(){let t=u.init(),i=h.measureText(String(this.content)),e=i.width/2,s=i.actualBoundingBoxAscent+i.actualBoundingBoxDescent/2,n=t.cos(this.dir),l=t.sin(this.dir),p=2*(Math.abs(e*n)+Math.abs(s*l))*this.size,d=2*(Math.abs(e*l)+Math.abs(s*n))*this.size;return{x:this.x,y:this.y,width:p,height:d}}getPath(){let t=new Path2D;h.save(),h.font=this.font;let i=h.measureText(String(this.content)),e=i.width*this.size,s=(i.actualBoundingBoxAscent+i.actualBoundingBoxDescent)*this.size;return h.restore(),t.rect(-e/2,-s/2,e,s),t}draw(t){let i=t?a:h;i.save();let e=this.x+r.width/2,s=-this.y+r.height/2;i.translate(e,s),i.rotate(this.toRadians(this.dir)),i.font=this.font,i.fillStyle=this.color,i.textAlign=this.align,i.textBaseline=this.baseline,i.fillText(String(this.content),0,0),i.restore()}create(t){return new o(t)}getCreateOptions(){return{...super.getCreateOptions,content:this.content,color:this.color,fontFamily:this.fontFamily,fontSize:this.fontSize,align:this.align,baseline:this.baseline}}setContent(t){this.content=t,this.invalidatePath(),this.refresh()}setColor(t){this.color=t,this.refresh()}setFontSize(t){this.fontSize=t,this.font=`${this.fontSize}px ${this.fontFamily}`,this.invalidatePath(),this.refresh()}setFontFamily(t){this.fontFamily=t,this.font=`${this.fontSize}px ${this.fontFamily}`,this.invalidatePath(),this.refresh()}setAlign(t){this.align=t,this.refresh()}setBaseline(t){this.baseline=t,this.refresh()}constructor(t){super(t),this.content=t?.content??"",this.color=t?.color??"black",this.fontFamily=t?.fontFamily??"Arial",this.fontSize=t?.fontSize??16,this.align=t?.align??"center",this.baseline=t?.baseline??"middle",this.font=`${this.fontSize}px ${this.fontFamily}`,this.draw()}};var A=class o extends c{discriminant="button";tags=new Set(["button"]);content;fontColor;fontFamily;fontSize;font;width;height;backgroundColor;outlineColor;outlineWidth;getBoundingBox(){let t=u.init();h.save(),h.font=this.font;let i=h.measureText(String(this.content)),e=Math.max(i.width,this.width)/2,s=Math.max(i.actualBoundingBoxAscent+i.actualBoundingBoxDescent,this.height)/2;h.restore();let n=t.cos(this.dir),l=t.sin(this.dir),p=2*(Math.abs(e*n)+Math.abs(s*l))*this.size,d=2*(Math.abs(e*l)+Math.abs(s*n))*this.size;return{x:this.x,y:this.y,width:p,height:d}}getPath(){let t=new Path2D;return t.rect(-this.width/2*this.size,-this.height/2*this.size,this.width*this.size,this.height*this.size),t}draw(t){let i=t?a:h;i.save();let e=this.x+r.width/2,s=-this.y+r.height/2;i.translate(e,s),i.rotate(this.toRadians(this.dir)),i.fillStyle=this.backgroundColor,i.strokeStyle=this.outlineColor,i.lineWidth=this.outlineWidth;let n=this.getCachedPath();i.fill(n),this.outlineWidth&&i.stroke(n),i.font=this.font,i.fillStyle=this.fontColor,i.textAlign="center",i.textBaseline="middle",i.fillText(String(this.content),0,0),i.restore()}create(t){return new o(t)}getCreateOptions(){return{...super.getCreateOptions(),content:this.content,fontColor:this.fontColor,fontFamily:this.fontFamily,fontSize:this.fontSize,width:this.width,height:this.height,backgroundColor:this.backgroundColor,outlineColor:this.outlineColor,outlineWidth:this.outlineWidth}}setContent(t){this.content=t,this.invalidatePath(),this.refresh()}setBackgroundColor(t){this.backgroundColor=t,this.refresh()}setFontColor(t){this.fontColor=t,this.refresh()}setFontSize(t){this.fontSize=t,this.font=`${this.fontSize}px ${this.fontFamily}`,this.invalidatePath(),this.refresh()}setFontFamily(t){this.fontFamily=t,this.font=`${this.fontSize}px ${this.fontFamily}`,this.invalidatePath(),this.refresh()}constructor(t){super(t),this.content=t?.content??"",this.fontColor=t?.fontColor??"black",this.fontFamily=t?.fontFamily??"Arial",this.fontSize=t?.fontSize??16,this.font=`${this.fontSize}px ${this.fontFamily}`,this.width=t?.width??String(this.content).length*this.fontSize+10,this.height=t?.height??this.fontSize+10,this.backgroundColor=t?.backgroundColor??"rgb(204, 204, 204)",this.outlineColor=t?.outlineColor??"black",this.outlineWidth=t?.outlineWidth??0,this.draw()}};var E=class o extends W{tags=new Set(["text","watermark"]);create(t){return new o(t)}constructor(t){super(t),this.content=t?.content??"Made with TScratch",this.x=t?.x??-r.width/2+5,this.y=t?.y??r.height/2-5,this.align=t?.align??"left",this.baseline=t?.baseline??"top",this.draw()}};var V=class o extends c{discriminant="imagesprite";tags=new Set(["imagesprite"]);costumes;costumeNumber;width;height;outlineColor;outlineWidth;img;getBoundingBox(){let t=u.init(),i=this.width/2,e=this.height/2,s=t.cos(this.dir),n=t.sin(this.dir),l=2*Math.sqrt((i*s)**2+(e*n)**2)*this.size,p=2*Math.sqrt((i*n)**2+(e*s)**2)*this.size;return{x:this.x,y:this.y,width:l,height:p}}getPath(){let t=new Path2D;return t.rect(-this.width/2*this.size,-this.height/2*this.size,this.width*this.size,this.height*this.size),t}draw(t){let i=t?a:h;i.save();let e=this.x+r.width/2,s=-this.y+r.height/2;i.translate(e,s),i.rotate(this.toRadians(this.dir)),i.strokeStyle=this.outlineColor,i.lineWidth=this.outlineWidth,i.drawImage(this.img,0,0,this.img.width,this.img.height,-this.width/2,-this.height/2,this.width,this.height),this.outlineWidth&&i.stroke(this.getCachedPath()),i.restore()}create(t){return new o(t)}getCreateOptions(){return{...super.getCreateOptions(),costumes:this.costumes,costumeNumber:this.costumeNumber,width:this.width,height:this.height,outlineColor:this.outlineColor,outlineWidth:this.outlineWidth}}setCostume(t){this.costumeNumber=t<this.costumes.length&&t>=0?t:0,this.img.src=this.costumes[this.costumeNumber],this.img.onload=this.refresh}nextCostume(){this.costumeNumber=(this.costumeNumber+1)%this.costumes.length,this.img.src=this.costumes[this.costumeNumber],this.img.onload=this.refresh}previousCostume(){this.costumeNumber--,this.costumeNumber<0&&(this.costumeNumber=this.costumes.length-1),this.img.src=this.costumes[this.costumeNumber],this.img.onload=this.refresh}setWidth(t){this.width=t,this.invalidatePath(),this.refresh()}setHeight(t){this.height=t,this.invalidatePath(),this.refresh()}constructor(t){super(t),this.costumes=t?.costumes??[],this.costumeNumber=t?.costumeNumber&&t.costumeNumber<this.costumes.length&&t.costumeNumber>=0?t.costumeNumber:0,this.img=new Image,this.img.src=this.costumes[this.costumeNumber]??"",this.width=t?.width??0,this.height=t?.height??0,this.outlineColor=t?.outlineColor??"black",this.outlineWidth=t?.outlineWidth??0,this.img.onload=()=>{t?.width||(this.width=this.img.width),t?.height||(this.height=this.img.height),this.draw()}}};var N=class extends z{tags=new Set(["circle","rigidbody"]);gravity;vX;vY;drag;bounceLoss;update(){let t=u.init();this.vY+=this.gravity,this.vY*=this.drag,this.vX*=this.drag;let i=this.x+this.vX,e=this.y+this.vY,s=t.sceneMap.get(this.scene).sprites.filter(g=>g.discriminant==="circle"),n=t.sceneMap.get("*").sprites.filter(g=>g.discriminant==="circle"),l=[...s,...n],p=Math.ceil(this.distanceTo(i,e)/(2*this.radius));for(let g=0;g<p;g++)for(let C of l)if(this.distanceTo(C.x,C.y)<this.radius+C.radius){let f=this.x-C.x,O=this.y-C.y,P=Math.sqrt(f*f+O*O);if(P===0)continue;let S=f/P,x=O/P,y=this.vX*S+this.vY*x;this.vX=(this.vX-2*y*S)*this.bounceLoss,this.vY=(this.vY-2*y*x)*this.bounceLoss,this.changeX(this.vX),this.changeY(this.vY);return}this.goTo(i,e);let d=r.width/2,m=r.height/2;this.x-this.radius<-d?(this.setX(-d+this.radius),this.vX=Math.abs(this.vX)*this.bounceLoss):this.x+this.radius>d&&(this.setX(d-this.radius),this.vX=-Math.abs(this.vX)*this.bounceLoss),this.y-this.radius<-m?(this.setY(-m+this.radius),this.vY=Math.abs(this.vY)*this.bounceLoss):this.y+this.radius>m&&(this.setY(m-this.radius),this.vY=-Math.abs(this.vY)*this.bounceLoss)}constructor(t){super(t),this.gravity=t?.gravity??-1.8,this.drag=t?.drag??.96,this.bounceLoss=t?.bounceLoss??.9,this.vX=t?.vX??0,this.vY=t?.vY??0}};var _={Engine:u,Sprite:c,Multiplayer:R,Rectangle:T,Square:Y,Oval:X,Circle:z,Arc:L,RegularPolygon:F,CustomPolygon:D,Pen:I,Text:W,Button:A,Watermark:E,ImageSprite:V,RigidCircle:N,scale:B,aspectRatio:k,setScale:q,setAspectRatio:U,canvas:r,ctx:h},Ci=_;export{L as Arc,A as Button,z as Circle,D as CustomPolygon,u as Engine,V as ImageSprite,R as Multiplayer,X as Oval,I as Pen,T as Rectangle,F as RegularPolygon,N as RigidCircle,c as Sprite,Y as Square,W as Text,E as Watermark,k as aspectRatio,r as canvas,h as ctx,Ci as default,B as scale,U as setAspectRatio,q as setScale};
1
+ var r=document.getElementById("game-window")||document.createElement("canvas"),h=r.getContext("2d"),b=document.createElement("canvas"),a=b.getContext("2d");b.id="pen-canvas";var k=16/9,B;function G(){r.width=k*B,r.height=B,b.width=k*B,b.height=B}function q(o){B=o,G()}function U(o){k=o,G()}r.parentElement?.insertBefore(b,r);q(500);var c=class o{x=0;y=0;dir=0;size=1;scene="main";hidden=!1;layer=0;cachedPath=null;pathDirty=!0;static collisionCanvas=null;static collisionCtx=null;refresh(){u.init().refresh()}invalidatePath(){this.pathDirty=!0,this.cachedPath=null}getCachedPath(){return(this.pathDirty||!this.cachedPath)&&(this.cachedPath=this.getPath(),this.pathDirty=!1),this.cachedPath}constructor(t){Object.assign(this,t),u.init().addSprite(this)}getCreateOptions(){return{x:this.x,y:this.y,dir:this.dir,size:this.size,scene:this.scene,layer:this.layer,hidden:this.hidden}}clone(t){return this.create({...this.getCreateOptions(),...t})}touching(t){if(this.hidden||t.hidden||this.scene!=="*"&&t.scene!=="*"&&this.scene!==t.scene)return!1;let i=this.getBoundingBox(),e=t.getBoundingBox();if(!(Math.abs(i.x-e.x)<(i.width+e.width)/2&&Math.abs(i.y-e.y)<(i.height+e.height)/2))return!1;let n=i.x-i.width/2,l=i.y+i.height/2,p=i.x+i.width/2,d=i.y-i.height/2,m=e.x-e.width/2,g=e.y+e.height/2,C=e.x+e.width/2,f=e.y-e.height/2,O=Math.max(n,m),P=Math.min(d,f),S=Math.min(p,C),x=Math.max(l,g),y=S-O,M=x-P;if(y<=1||M<=1)return!1;o.collisionCanvas||(o.collisionCanvas=document.createElement("canvas"),o.collisionCtx=o.collisionCanvas.getContext("2d",{willReadFrequently:!0}));let w=o.collisionCtx;o.collisionCanvas.width<y&&(o.collisionCanvas.width=y),o.collisionCanvas.height<M&&(o.collisionCanvas.height=M),w.clearRect(0,0,y,M);let $=(v,J)=>{w.save();let K=v.x-O,Q=x-v.y;w.translate(K,Q),w.rotate(v.toRadians(v.dir)),w.fillStyle=J,w.fill(v.getCachedPath()),w.restore()};$(this,"red");let H=w.getImageData(0,0,y,M).data;w.clearRect(0,0,y,M),$(t,"blue");let j=w.getImageData(0,0,y,M).data;for(let v=3;v<H.length;v+=4)if(H[v]>0&&j[v]>0)return!0;return!1}toRadians(t){return t*Math.PI/180}toDegrees(t){return t*180/Math.PI}distanceTo(t,i){return Math.hypot(t-this.x,i-this.y)}move(t){this.x+=t*Math.sin(this.toRadians(this.dir)),this.y+=t*Math.cos(this.toRadians(this.dir)),this.refresh()}turn(t){this.dir+=t,this.refresh()}point(t){this.dir=t,this.refresh()}pointTowards(t,i){this.dir=90-this.toDegrees(Math.atan2(i-this.y,t-this.x)),this.refresh()}setX(t){this.x=t,this.refresh()}setY(t){this.y=t,this.refresh()}goTo(t,i){this.x=t,this.y=i,this.refresh()}changeX(t){this.x+=t,this.refresh()}changeY(t){this.y+=t,this.refresh()}show(){this.hidden=!1,this.refresh()}hide(){this.hidden=!0,this.refresh()}setSize(t){this.size=t>0?t:0,this.invalidatePath(),this.refresh()}changeSize(t){this.size=this.size+t>0?this.size+t:0,this.invalidatePath(),this.refresh()}goToLayer(t){this.layer=t,this.refresh()}changeLayer(t){this.layer+=t,this.refresh()}};var u=class o{static instance;loopRunning=!1;gameLoop=null;maxFPS=24;deltaTime=1/this.maxFPS;lastFrame=performance.now();refreshScheduled=!1;animationFrameId=null;sounds=[];mouseX=0;mouseY=0;mouseDown=!1;mouseClicked=!1;keysPressed=new Set;currentScene="main";sceneMap=new Map;variableMap=new Map;static init(){return this.instance||(this.instance=new o),this.instance}setScene(t){this.sceneMap.get(t)||this.sceneMap.set(t,{sprites:[],loop:null}),this.loopRunning=!1,this.currentScene=t,this.gameLoop=this.sceneMap.get(t).loop,this.setMaxFPS(this.maxFPS)}setLoop(t,i){if(!this.sceneMap.get(t)){this.sceneMap.set(t,{sprites:[],loop:i}),t===this.currentScene&&this.setScene(t);return}this.sceneMap.get(t).loop=i,t===this.currentScene&&this.setScene(t)}pauseLoop(){this.loopRunning=!1,this.animationFrameId!==null&&(cancelAnimationFrame(this.animationFrameId),this.animationFrameId=null)}resumeLoop(){this.loopRunning=!0,this.setMaxFPS(this.maxFPS)}addSprite(t){let{scene:i,layer:e}=t;if(!this.sceneMap.get(i)){this.sceneMap.set(i,{sprites:[t],loop:null});return}let s=this.sceneMap.get(i).sprites.findIndex(n=>n.layer>e);if(s===-1){this.sceneMap.get(i).sprites.push(t);return}this.sceneMap.get(i).sprites.splice(s,0,t),this.refresh()}removeSprite(t){let{scene:i}=t;this.sceneMap.get(i)&&(this.sceneMap.get(i).sprites=this.sceneMap.get(i).sprites.filter(e=>e!==t),this.refresh())}async setMaxFPS(t){this.maxFPS=t;let i=this.gameLoop;if(!i)return;this.animationFrameId!==null&&(cancelAnimationFrame(this.animationFrameId),this.animationFrameId=null),this.loopRunning=!0;let e=1e3/t,s=0,n=async l=>{if(!this.loopRunning)return;let p=l-this.lastFrame;this.lastFrame=l,s+=p,s>=e&&(this.deltaTime=s/1e3,s=s%e,i&&await i()),this.animationFrameId=requestAnimationFrame(n)};this.lastFrame=performance.now(),this.animationFrameId=requestAnimationFrame(n)}refresh(){this.refreshScheduled||(this.refreshScheduled=!0,requestAnimationFrame(()=>{this.refreshScheduled=!1,h.clearRect(0,0,r.width,r.height),[...this.sceneMap.get(this.currentScene).sprites,...this.sceneMap.get("*").sprites].forEach(i=>{i.hidden||i.draw()})}))}async wait(t){return new Promise(i=>setTimeout(i,t))}async waitUntil(t){return new Promise(i=>{let e=()=>{t()?i():setTimeout(e,1e3/this.maxFPS)};e()})}setVariable(t,i){this.variableMap.set(t,i)}getVariable(t){return this.variableMap.get(t)}hovering(t){let{mouseX:i,mouseY:e}=this,s=i+r.width/2,n=r.height/2-e,l=s-(t.x+r.width/2),p=n-(r.height/2-t.y),d=-this.toRadians(t.dir),m=l*Math.cos(d)-p*Math.sin(d),g=l*Math.sin(d)+p*Math.cos(d);return h.isPointInPath(t.getCachedPath(),m,g)}keyPressed(t){switch(t){case"any":return this.keysPressed.size>0;case"up":return this.keysPressed.has("ArrowUp");case"down":return this.keysPressed.has("ArrowDown");case"left":return this.keysPressed.has("ArrowLeft");case"right":return this.keysPressed.has("ArrowRight");case"space":return this.keysPressed.has(" ");default:return this.keysPressed.has(t)}}playSound(t){let i=new Audio(t);return this.sounds.push(i),i.play(),i}stopSound(t){t.pause(),t.currentTime=0,this.sounds=this.sounds.filter(i=>i!==t)}stopAllSounds(){this.sounds.forEach(t=>{t.pause(),t.currentTime=0}),this.sounds=[]}pickRandom(t,i){return t>i&&([t,i]=[i,t]),Math.floor(Math.random()*(i-t+1)+t)}dotProduct(...t){let[i,e]=t;switch(i.length){case 2:return i[0]*e[0]+i[1]*e[1];case 3:return i[0]*e[0]+i[1]*e[1]+i[2]*e[2];case 4:return i[0]*e[0]+i[1]*e[1]+i[2]*e[2]+i[3]*e[3]}}sin(t){return Math.sin(this.toRadians(t))}cos(t){return Math.cos(this.toRadians(t))}tan(t){return Math.tan(this.toRadians(t))}csc(t){return 1/Math.sin(this.toRadians(t))}sec(t){return 1/Math.cos(this.toRadians(t))}cot(t){return 1/Math.tan(this.toRadians(t))}asin(t){return this.toDegrees(Math.asin(t))}acos(t){return this.toDegrees(Math.acos(t))}acsc(t){return this.toDegrees(Math.asin(1/t))}asec(t){return this.toDegrees(Math.acos(1/t))}toRadians(t){return t*Math.PI/180}toDegrees(t){return t*180/Math.PI}constructor(){this.setMaxFPS(24),this.sceneMap.set("main",{loop:null,sprites:[]}),this.sceneMap.set("*",{loop:null,sprites:[]}),b.addEventListener("mousemove",t=>{this.mouseX=t.clientX-b.offsetLeft-b.width/2,this.mouseY=-(t.clientY-b.offsetTop-b.height/2)}),b.addEventListener("mousedown",()=>{this.mouseDown=!0}),b.addEventListener("mouseup",()=>{this.mouseDown=!1}),b.addEventListener("click",()=>{this.mouseClicked=!0,setTimeout(()=>this.mouseClicked=!1,0)}),addEventListener("keydown",t=>{t.repeat||this.keysPressed.add(t.key)}),addEventListener("keyup",t=>{this.keysPressed.delete(t.key)})}};import{io as Z}from"socket.io-client";var R=class o{static instance;socket;static connect(t="http://localhost:3000"){return this.instance||(this.instance=new o(t)),this.instance}disconnect(){this.socket.disconnect()}constructor(t){this.socket=Z(t)}broadcast(t,i){this.socket.emit(t,i)}on(t,i){this.socket.on(t,i)}};var T=class o extends c{discriminant="rectangle";tags=new Set(["rectangle"]);width;height;color;outlineColor;outlineWidth;getBoundingBox(){let t=u.init(),i=this.width/2,e=this.height/2,s=t.cos(this.dir),n=t.sin(this.dir),l=2*(Math.abs(i*s)+Math.abs(e*n))*this.size,p=2*(Math.abs(i*n)+Math.abs(e*s))*this.size;return{x:this.x,y:this.y,width:l,height:p}}getPath(){let t=new Path2D;return t.rect(-this.width/2*this.size,-this.height/2*this.size,this.width*this.size,this.height*this.size),t}draw(t){let i=t?a:h;i.save();let e=this.x+r.width/2,s=-this.y+r.height/2;i.translate(e,s),i.rotate(this.toRadians(this.dir));let n=this.getCachedPath();i.fillStyle=this.color,i.strokeStyle=this.outlineColor,i.lineWidth=this.outlineWidth,i.fill(n),this.outlineWidth&&i.stroke(n),i.restore()}create(t){return new o(t)}getCreateOptions(){return{...super.getCreateOptions(),width:this.width,height:this.height,color:this.color,outlineColor:this.outlineColor,outlineWidth:this.outlineWidth}}setWidth(t){this.width=t,this.invalidatePath(),this.refresh()}setHeight(t){this.height=t,this.invalidatePath(),this.refresh()}setColor(t){this.color=t,this.refresh()}constructor(t){super(t),this.width=t?.width??50,this.height=t?.height??50,this.color=t?.color??"black",this.outlineColor=t?.outlineColor??"black",this.outlineWidth=t?.outlineWidth??0,this.draw()}};var Y=class o extends c{discriminant="square";tags=new Set(["square"]);sideLength;color;outlineColor;outlineWidth;getBoundingBox(){let t=u.init(),i=this.sideLength/2,e=t.cos(this.dir),s=t.sin(this.dir),n=2*(Math.abs(i*e)+Math.abs(i*s))*this.size;return{x:this.x,y:this.y,width:n,height:n}}getPath(){let t=new Path2D;return t.rect(-this.sideLength/2*this.size,-this.sideLength/2*this.size,this.sideLength*this.size,this.sideLength*this.size),t}draw(t){let i=t?a:h;i.save();let e=this.x+r.width/2,s=-this.y+r.height/2;i.translate(e,s),i.rotate(this.toRadians(this.dir));let n=this.getCachedPath();i.fillStyle=this.color,i.strokeStyle=this.outlineColor,i.lineWidth=this.outlineWidth,i.fill(n),this.outlineWidth&&i.stroke(n),i.restore()}create(t){return new o(t)}getCreateOptions(){return{...super.getCreateOptions(),sideLength:this.sideLength,color:this.color,outlineColor:this.outlineColor,outlineWidth:this.outlineWidth}}setSideLength(t){this.sideLength=t,this.invalidatePath(),this.refresh()}setColor(t){this.color=t,this.refresh()}constructor(t){super(t),this.sideLength=t?.sideLength??50,this.color=t?.color??"black",this.outlineColor=t?.outlineColor??"black",this.outlineWidth=t?.outlineWidth??0,this.draw()}};var X=class o extends c{discriminant="oval";tags=new Set(["oval"]);radX;radY;color;outlineColor;outlineWidth;getBoundingBox(){let t=u.init(),i=this.radX,e=this.radY,s=t.cos(this.dir),n=t.sin(this.dir),l=2*(Math.abs(i*s)+Math.abs(e*n))*this.size,p=2*(Math.abs(i*n)+Math.abs(e*s))*this.size;return{x:this.x,y:this.y,width:l,height:p}}getPath(){let t=new Path2D;return t.ellipse(0,0,this.radX*this.size,this.radY*this.size,0,0,Math.PI*2),t}draw(t){let i=t?a:h;i.save();let e=this.x+r.width/2,s=-this.y+r.height/2;i.translate(e,s),i.rotate(this.toRadians(this.dir));let n=this.getCachedPath();i.fillStyle=this.color,i.strokeStyle=this.outlineColor,i.lineWidth=this.outlineWidth,i.fill(n),this.outlineWidth&&i.stroke(n),i.restore()}create(t){return new o(t)}getCreateOptions(){return{...super.getCreateOptions(),radX:this.radX,radY:this.radY,color:this.color,outlineColor:this.outlineColor,outlineWidth:this.outlineWidth}}setRadX(t){this.radX=t,this.invalidatePath(),this.refresh()}setRadY(t){this.radY=t,this.invalidatePath(),this.refresh()}setColor(t){this.color=t,this.refresh()}constructor(t){super(t),this.radX=t?.radX??25,this.radY=t?.radY??25,this.color=t?.color??"black",this.outlineColor=t?.outlineColor??"black",this.outlineWidth=t?.outlineWidth??0,this.draw()}};var z=class o extends c{discriminant="circle";tags=new Set(["circle"]);radius;color;outlineColor;outlineWidth;getBoundingBox(){return{x:this.x,y:this.y,width:this.radius*2*this.size,height:this.radius*2*this.size}}getPath(){let t=new Path2D;return t.ellipse(0,0,this.radius*this.size,this.radius*this.size,0,0,Math.PI*2),t}draw(t){let i=t?a:h;i.save();let e=this.x+r.width/2,s=-this.y+r.height/2;i.translate(e,s),i.rotate(this.toRadians(this.dir));let n=this.getCachedPath();i.fillStyle=this.color,i.strokeStyle=this.outlineColor,i.lineWidth=this.outlineWidth,i.fill(n),this.outlineWidth&&i.stroke(n),i.restore()}create(t){return new o(t)}getCreateOptions(){return{...super.getCreateOptions(),radius:this.radius,color:this.color,outlineColor:this.outlineColor,outlineWidth:this.outlineWidth}}setRadius(t){this.radius=t,this.invalidatePath(),this.refresh()}setColor(t){this.color=t,this.refresh()}constructor(t){super(t),this.radius=t?.radius??25,this.color=t?.color??"black",this.outlineColor=t?.outlineColor??"black",this.outlineWidth=t?.outlineWidth??0,this.draw()}};var L=class o extends c{discriminant="arc";tags=new Set(["arc"]);radius;angle;color;outlineColor;outlineWidth;getBoundingBox(){return{x:this.x,y:this.y,width:this.radius*2*this.size,height:this.radius*2*this.size}}getPath(){let t=new Path2D;return t.arc(0,0,this.radius*this.size,this.toRadians(this.angle/2-90),this.toRadians(-this.angle/2-90)),t}draw(t){let i=t?a:h;i.save();let e=this.x+r.width/2,s=-this.y+r.height/2;i.translate(e,s),i.rotate(this.toRadians(this.dir));let n=this.getCachedPath();i.fillStyle=this.color,i.strokeStyle=this.outlineColor,i.lineWidth=this.outlineWidth,i.fill(n),this.outlineWidth&&i.stroke(n),i.restore()}create(t){return new o(t)}getCreateOptions(){return{...super.getCreateOptions(),radius:this.radius,angle:this.angle,color:this.color,outlineColor:this.outlineColor,outlineWidth:this.outlineWidth}}setRadius(t){this.radius=t,this.invalidatePath(),this.refresh()}setAngle(t){this.angle=t,this.invalidatePath(),this.refresh()}setColor(t){this.color=t,this.refresh()}constructor(t){super(t),this.radius=t?.radius??25,this.angle=t?.angle??270,this.color=t?.color??"black",this.outlineColor=t?.outlineColor??"black",this.outlineWidth=t?.outlineWidth??0,this.draw()}};var F=class o extends c{discriminant="regularpolygon";tags=new Set(["regularpolygon"]);sides;radius;color;outlineColor;outlineWidth;getBoundingBox(){return{x:this.x,y:this.y,width:this.radius*2*this.size,height:this.radius*2*this.size}}getPath(){let t=new Path2D,i=2*Math.PI/this.sides;t.moveTo(this.radius*this.size,0);for(let e=1;e<this.sides;e++)t.lineTo(this.radius*Math.cos(i*e)*this.size,this.radius*Math.sin(i*e)*this.size);return t.closePath(),t}draw(t){let i=t?a:h;i.save();let e=this.x+r.width/2,s=-this.y+r.height/2;i.translate(e,s),i.rotate(this.toRadians(this.dir));let n=this.getCachedPath();i.fillStyle=this.color,i.strokeStyle=this.outlineColor,i.lineWidth=this.outlineWidth,i.fill(n),this.outlineWidth&&i.stroke(n),i.restore()}create(t){return new o(t)}getCreateOptions(){return{...super.getCreateOptions(),sides:this.sides,radius:this.radius,color:this.color,outlineColor:this.outlineColor,outlineWidth:this.outlineWidth}}setSides(t){this.sides=t,this.invalidatePath(),this.refresh()}setRadius(t){this.radius=t,this.invalidatePath(),this.refresh()}setColor(t){this.color=t,this.refresh()}constructor(t){super(t),this.sides=t?.sides??5,this.radius=t?.radius??50,this.color=t?.color??"black",this.outlineColor=t?.outlineColor??"black",this.outlineWidth=t?.outlineWidth??0,this.draw()}};var D=class o extends c{discriminant="custompolygon";tags=new Set(["custompolygon"]);vertices;color;outlineColor;outlineWidth;getBoundingBox(){let t=u.init(),i=t.cos(this.dir),e=t.sin(this.dir),s=1/0,n=-1/0,l=1/0,p=-1/0;if(this.vertices.length===0)return{x:this.x,y:this.y,width:0,height:0};for(let f of this.vertices){let O=f[0]*i-f[1]*e,P=f[0]*e+f[1]*i,S=this.x+O,x=this.y+P;S<s&&(s=S),S>n&&(n=S),x<l&&(l=x),x>p&&(p=x)}let d=n-s,m=p-l,g=s+d/2,C=l+m/2;return{x:g*this.size,y:C*this.size,width:d*this.size,height:m*this.size}}getPath(){let t=new Path2D;if(this.vertices.length<2)return t;let i=this.vertices,[e,...s]=i;t.moveTo(e[0]*this.size,-e[1]*this.size);for(let n of s)t.lineTo(n[0]*this.size,-n[1]*this.size);return t.closePath(),t}draw(t){let i=t?a:h;i.save();let e=this.x+r.width/2,s=-this.y+r.height/2;i.translate(e,s),i.rotate(this.toRadians(this.dir));let n=this.getCachedPath();i.fillStyle=this.color,i.strokeStyle=this.outlineColor,i.lineWidth=this.outlineWidth,i.fill(n),this.outlineWidth&&i.stroke(n),i.restore()}create(t){return new o(t)}getCreateOptions(){return{...super.getCreateOptions(),vertices:this.vertices,color:this.color,outlineColor:this.outlineColor,outlineWidth:this.outlineWidth}}setVertices(t){this.vertices=t,this.invalidatePath(),this.refresh()}setColor(t){this.color=t,this.refresh()}constructor(t){super(t),this.vertices=t?.vertices??[],this.color=t?.color??"black",this.outlineColor=t?.outlineColor??"black",this.outlineWidth=t?.outlineWidth??0,this.draw()}};var I=class o extends c{discriminant="pen";tags=new Set(["pen"]);drawing;penSize;color;getBoundingBox(){return{x:this.x,y:this.y,width:this.penSize*this.size*2,height:this.penSize*this.size*2}}getPath(){return new Path2D}draw(){}create(t){return new o(t)}getCreateOptions(){return{...super.getCreateOptions(),drawing:this.drawing,penSize:this.penSize,color:this.color}}up(){this.drawing=!1}down(){this.drawing=!0}stamp(t){t.draw(!0)}eraseAll(){a.clearRect(0,0,r.width,r.height)}dot(){a.fillStyle=this.color,a.fillRect(this.x-this.penSize/2+r.width/2,-this.y-this.penSize/2+r.height/2,this.penSize,this.penSize)}drawSprite(t){t.draw(!0),u.init().removeSprite(t)}drawLine(t,i){a.beginPath(),a.moveTo(t+r.width/2,-i+r.height/2),a.lineTo(this.x+r.width/2,-this.y+r.height/2),a.lineWidth=this.penSize,a.strokeStyle=this.color,a.stroke()}move(t){let i=this.x,e=this.y;this.x+=t*Math.sin(this.toRadians(this.dir)),this.y+=t*Math.cos(this.toRadians(this.dir)),this.drawing&&this.drawLine(i,e),this.refresh()}setX(t){let i=this.x,e=this.y;this.x=t,this.drawing&&this.drawLine(i,e),this.refresh()}setY(t){let i=this.x,e=this.y;this.y=t,this.drawing&&this.drawLine(i,e),this.refresh()}goTo(t,i){let e=this.x,s=this.y;this.x=t,this.y=i,this.drawing&&this.drawLine(e,s),this.refresh()}changeX(t){let i=this.x,e=this.y;this.x+=t,this.drawing&&this.drawLine(i,e),this.refresh()}changeY(t){let i=this.x,e=this.y;this.y+=t,this.drawing&&this.drawLine(i,e),this.refresh()}constructor(t){super(t),this.drawing=t?.drawing??!1,this.penSize=t?.penSize??5,this.color=t?.color??"black"}};var W=class o extends c{discriminant="text";tags=new Set(["text"]);content;color;fontFamily;fontSize;align;baseline;font;getBoundingBox(){let t=u.init(),i=h.measureText(String(this.content)),e=i.width/2,s=i.actualBoundingBoxAscent+i.actualBoundingBoxDescent/2,n=t.cos(this.dir),l=t.sin(this.dir),p=2*(Math.abs(e*n)+Math.abs(s*l))*this.size,d=2*(Math.abs(e*l)+Math.abs(s*n))*this.size;return{x:this.x,y:this.y,width:p,height:d}}getPath(){let t=new Path2D;h.save(),h.font=this.font;let i=h.measureText(String(this.content)),e=i.width*this.size,s=(i.actualBoundingBoxAscent+i.actualBoundingBoxDescent)*this.size;return h.restore(),t.rect(-e/2,-s/2,e,s),t}draw(t){let i=t?a:h;i.save();let e=this.x+r.width/2,s=-this.y+r.height/2;i.translate(e,s),i.rotate(this.toRadians(this.dir)),i.font=this.font,i.fillStyle=this.color,i.textAlign=this.align,i.textBaseline=this.baseline,i.fillText(String(this.content),0,0),i.restore()}create(t){return new o(t)}getCreateOptions(){return{...super.getCreateOptions,content:this.content,color:this.color,fontFamily:this.fontFamily,fontSize:this.fontSize,align:this.align,baseline:this.baseline}}setContent(t){this.content=t,this.invalidatePath(),this.refresh()}setColor(t){this.color=t,this.refresh()}setFontSize(t){this.fontSize=t,this.font=`${this.fontSize}px ${this.fontFamily}`,this.invalidatePath(),this.refresh()}setFontFamily(t){this.fontFamily=t,this.font=`${this.fontSize}px ${this.fontFamily}`,this.invalidatePath(),this.refresh()}setAlign(t){this.align=t,this.refresh()}setBaseline(t){this.baseline=t,this.refresh()}constructor(t){super(t),this.content=t?.content??"",this.color=t?.color??"black",this.fontFamily=t?.fontFamily??"Arial",this.fontSize=t?.fontSize??16,this.align=t?.align??"center",this.baseline=t?.baseline??"middle",this.font=`${this.fontSize}px ${this.fontFamily}`,this.draw()}};var A=class o extends c{discriminant="button";tags=new Set(["button"]);content;fontColor;fontFamily;fontSize;font;width;height;backgroundColor;outlineColor;outlineWidth;getBoundingBox(){let t=u.init();h.save(),h.font=this.font;let i=h.measureText(String(this.content)),e=Math.max(i.width,this.width)/2,s=Math.max(i.actualBoundingBoxAscent+i.actualBoundingBoxDescent,this.height)/2;h.restore();let n=t.cos(this.dir),l=t.sin(this.dir),p=2*(Math.abs(e*n)+Math.abs(s*l))*this.size,d=2*(Math.abs(e*l)+Math.abs(s*n))*this.size;return{x:this.x,y:this.y,width:p,height:d}}getPath(){let t=new Path2D;return t.rect(-this.width/2*this.size,-this.height/2*this.size,this.width*this.size,this.height*this.size),t}draw(t){let i=t?a:h;i.save();let e=this.x+r.width/2,s=-this.y+r.height/2;i.translate(e,s),i.rotate(this.toRadians(this.dir)),i.fillStyle=this.backgroundColor,i.strokeStyle=this.outlineColor,i.lineWidth=this.outlineWidth;let n=this.getCachedPath();i.fill(n),this.outlineWidth&&i.stroke(n),i.font=this.font,i.fillStyle=this.fontColor,i.textAlign="center",i.textBaseline="middle",i.fillText(String(this.content),0,0),i.restore()}create(t){return new o(t)}getCreateOptions(){return{...super.getCreateOptions(),content:this.content,fontColor:this.fontColor,fontFamily:this.fontFamily,fontSize:this.fontSize,width:this.width,height:this.height,backgroundColor:this.backgroundColor,outlineColor:this.outlineColor,outlineWidth:this.outlineWidth}}setContent(t){this.content=t,this.invalidatePath(),this.refresh()}setBackgroundColor(t){this.backgroundColor=t,this.refresh()}setFontColor(t){this.fontColor=t,this.refresh()}setFontSize(t){this.fontSize=t,this.font=`${this.fontSize}px ${this.fontFamily}`,this.invalidatePath(),this.refresh()}setFontFamily(t){this.fontFamily=t,this.font=`${this.fontSize}px ${this.fontFamily}`,this.invalidatePath(),this.refresh()}constructor(t){super(t),this.content=t?.content??"",this.fontColor=t?.fontColor??"black",this.fontFamily=t?.fontFamily??"Arial",this.fontSize=t?.fontSize??16,this.font=`${this.fontSize}px ${this.fontFamily}`,this.width=t?.width??String(this.content).length*this.fontSize+10,this.height=t?.height??this.fontSize+10,this.backgroundColor=t?.backgroundColor??"rgb(204, 204, 204)",this.outlineColor=t?.outlineColor??"black",this.outlineWidth=t?.outlineWidth??0,this.draw()}};var E=class o extends W{tags=new Set(["text","watermark"]);create(t){return new o(t)}constructor(t){super(t),this.content=t?.content??"Made with TScratch",this.x=t?.x??-r.width/2+5,this.y=t?.y??r.height/2-5,this.align=t?.align??"left",this.baseline=t?.baseline??"top",this.draw()}};var V=class o extends c{discriminant="imagesprite";tags=new Set(["imagesprite"]);costumes;costumeNumber;width;height;outlineColor;outlineWidth;img;getBoundingBox(){let t=u.init(),i=this.width/2,e=this.height/2,s=t.cos(this.dir),n=t.sin(this.dir),l=2*Math.sqrt((i*s)**2+(e*n)**2)*this.size,p=2*Math.sqrt((i*n)**2+(e*s)**2)*this.size;return{x:this.x,y:this.y,width:l,height:p}}getPath(){let t=new Path2D;return t.rect(-this.width/2*this.size,-this.height/2*this.size,this.width*this.size,this.height*this.size),t}draw(t){let i=t?a:h;i.save();let e=this.x+r.width/2,s=-this.y+r.height/2;i.translate(e,s),i.rotate(this.toRadians(this.dir)),i.strokeStyle=this.outlineColor,i.lineWidth=this.outlineWidth,i.drawImage(this.img,0,0,this.img.width,this.img.height,-this.width/2,-this.height/2,this.width,this.height),this.outlineWidth&&i.stroke(this.getCachedPath()),i.restore()}create(t){return new o(t)}getCreateOptions(){return{...super.getCreateOptions(),costumes:this.costumes,costumeNumber:this.costumeNumber,width:this.width,height:this.height,outlineColor:this.outlineColor,outlineWidth:this.outlineWidth}}setCostume(t){this.costumeNumber=t<this.costumes.length&&t>=0?t:0,this.img.src=this.costumes[this.costumeNumber],this.img.onload=this.refresh}nextCostume(){this.costumeNumber=(this.costumeNumber+1)%this.costumes.length,this.img.src=this.costumes[this.costumeNumber],this.img.onload=this.refresh}previousCostume(){this.costumeNumber--,this.costumeNumber<0&&(this.costumeNumber=this.costumes.length-1),this.img.src=this.costumes[this.costumeNumber],this.img.onload=this.refresh}setWidth(t){this.width=t,this.invalidatePath(),this.refresh()}setHeight(t){this.height=t,this.invalidatePath(),this.refresh()}constructor(t){super(t),this.costumes=t?.costumes??[],this.costumeNumber=t?.costumeNumber&&t.costumeNumber<this.costumes.length&&t.costumeNumber>=0?t.costumeNumber:0,this.img=new Image,this.img.src=this.costumes[this.costumeNumber]??"",this.width=t?.width??0,this.height=t?.height??0,this.outlineColor=t?.outlineColor??"black",this.outlineWidth=t?.outlineWidth??0,this.img.onload=()=>{t?.width||(this.width=this.img.width),t?.height||(this.height=this.img.height),this.draw()}}};var N=class extends z{tags=new Set(["circle","rigidbody"]);gravity;vX;vY;drag;bounceLoss;update(){let t=u.init();this.vY+=this.gravity,this.vY*=this.drag,this.vX*=this.drag;let i=this.x+this.vX,e=this.y+this.vY,s=t.sceneMap.get(this.scene).sprites.filter(g=>g.discriminant==="circle"),n=t.sceneMap.get("*").sprites.filter(g=>g.discriminant==="circle"),l=[...s,...n],p=Math.ceil(this.distanceTo(i,e)/(2*this.radius));for(let g=0;g<p;g++)for(let C of l)if(this.distanceTo(C.x,C.y)<this.radius+C.radius){let f=this.x-C.x,O=this.y-C.y,P=Math.sqrt(f*f+O*O);if(P===0)continue;let S=f/P,x=O/P,y=this.vX*S+this.vY*x;this.vX=(this.vX-2*y*S)*this.bounceLoss,this.vY=(this.vY-2*y*x)*this.bounceLoss,this.changeX(this.vX),this.changeY(this.vY);return}this.goTo(i,e);let d=r.width/2,m=r.height/2;this.x-this.radius<-d?(this.setX(-d+this.radius),this.vX=Math.abs(this.vX)*this.bounceLoss):this.x+this.radius>d&&(this.setX(d-this.radius),this.vX=-Math.abs(this.vX)*this.bounceLoss),this.y-this.radius<-m?(this.setY(-m+this.radius),this.vY=Math.abs(this.vY)*this.bounceLoss):this.y+this.radius>m&&(this.setY(m-this.radius),this.vY=-Math.abs(this.vY)*this.bounceLoss)}constructor(t){super(t),this.gravity=t?.gravity??-1.8,this.drag=t?.drag??.96,this.bounceLoss=t?.bounceLoss??.9,this.vX=t?.vX??0,this.vY=t?.vY??0}};var _={Engine:u,Sprite:c,Multiplayer:R,Rectangle:T,Square:Y,Oval:X,Circle:z,Arc:L,RegularPolygon:F,CustomPolygon:D,Pen:I,Text:W,Button:A,Watermark:E,ImageSprite:V,RigidCircle:N,scale:B,aspectRatio:k,setScale:q,setAspectRatio:U,canvas:r,ctx:h},Si=_;export{L as Arc,A as Button,z as Circle,D as CustomPolygon,u as Engine,V as ImageSprite,R as Multiplayer,X as Oval,I as Pen,T as Rectangle,F as RegularPolygon,N as RigidCircle,c as Sprite,Y as Square,W as Text,E as Watermark,k as aspectRatio,r as canvas,h as ctx,Si as default,B as scale,U as setAspectRatio,q as setScale};
2
2
  //# sourceMappingURL=index.js.map