tscratch 0.7.1 → 0.7.2

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.
@@ -1,3 +1,7 @@
1
+ type Vec2<T = number> = [T, T];
2
+ type Vec3<T = number> = [T, T, T];
3
+ type Vec4<T = number> = [T, T, T, T];
4
+
1
5
  interface BoundingBox {
2
6
  x: number;
3
7
  y: number;
@@ -9,6 +13,7 @@ interface SpriteOptions {
9
13
  y?: number;
10
14
  dir?: number;
11
15
  size?: number;
16
+ pivot?: Vec2;
12
17
  scene?: string;
13
18
  hidden?: boolean;
14
19
  layer?: number;
@@ -18,6 +23,7 @@ declare abstract class Sprite {
18
23
  y: number;
19
24
  dir: number;
20
25
  size: number;
26
+ pivot: Vec2;
21
27
  scene: string;
22
28
  hidden: boolean;
23
29
  layer: number;
@@ -50,6 +56,7 @@ declare abstract class Sprite {
50
56
  goTo(x: number, y: number): void;
51
57
  changeX(dX: number): void;
52
58
  changeY(dY: number): void;
59
+ setPivot(x: number, y: number): void;
53
60
  show(): void;
54
61
  hide(): void;
55
62
  setSize(size: number): void;
@@ -58,10 +65,6 @@ declare abstract class Sprite {
58
65
  changeLayer(dL: number): void;
59
66
  }
60
67
 
61
- type Vec2<T = number> = [T, T];
62
- type Vec3<T = number> = [T, T, T];
63
- type Vec4<T = number> = [T, T, T, T];
64
-
65
68
  type GameLoop = (() => void) | (() => Promise<void>);
66
69
  type SceneMap = Map<string, {
67
70
  sprites: Sprite[];
@@ -166,6 +169,7 @@ declare class Rectangle extends Sprite {
166
169
  y?: number;
167
170
  dir?: number;
168
171
  size?: number;
172
+ pivot?: Vec2;
169
173
  scene?: string;
170
174
  hidden?: boolean;
171
175
  layer?: number;
@@ -202,6 +206,7 @@ declare class Square extends Sprite {
202
206
  y?: number;
203
207
  dir?: number;
204
208
  size?: number;
209
+ pivot?: Vec2;
205
210
  scene?: string;
206
211
  hidden?: boolean;
207
212
  layer?: number;
@@ -240,6 +245,7 @@ declare class Oval extends Sprite {
240
245
  y?: number;
241
246
  dir?: number;
242
247
  size?: number;
248
+ pivot?: Vec2;
243
249
  scene?: string;
244
250
  hidden?: boolean;
245
251
  layer?: number;
@@ -276,6 +282,7 @@ declare class Circle extends Sprite {
276
282
  y?: number;
277
283
  dir?: number;
278
284
  size?: number;
285
+ pivot?: Vec2;
279
286
  scene?: string;
280
287
  hidden?: boolean;
281
288
  layer?: number;
@@ -314,6 +321,7 @@ declare class Arc extends Sprite {
314
321
  y?: number;
315
322
  dir?: number;
316
323
  size?: number;
324
+ pivot?: Vec2;
317
325
  scene?: string;
318
326
  hidden?: boolean;
319
327
  layer?: number;
@@ -353,6 +361,7 @@ declare class RegularPolygon extends Sprite {
353
361
  y?: number;
354
362
  dir?: number;
355
363
  size?: number;
364
+ pivot?: Vec2;
356
365
  scene?: string;
357
366
  hidden?: boolean;
358
367
  layer?: number;
@@ -389,6 +398,7 @@ declare class CustomPolygon extends Sprite {
389
398
  y?: number;
390
399
  dir?: number;
391
400
  size?: number;
401
+ pivot?: Vec2;
392
402
  scene?: string;
393
403
  hidden?: boolean;
394
404
  layer?: number;
@@ -421,6 +431,7 @@ declare class Pen extends Sprite {
421
431
  y?: number;
422
432
  dir?: number;
423
433
  size?: number;
434
+ pivot?: Vec2;
424
435
  scene?: string;
425
436
  hidden?: boolean;
426
437
  layer?: number;
@@ -522,6 +533,7 @@ declare class Button extends Sprite {
522
533
  y?: number;
523
534
  dir?: number;
524
535
  size?: number;
536
+ pivot?: Vec2;
525
537
  scene?: string;
526
538
  hidden?: boolean;
527
539
  layer?: number;
@@ -557,6 +569,7 @@ declare class ImageSprite extends Sprite {
557
569
  height: number;
558
570
  outlineColor: string;
559
571
  outlineWidth: number;
572
+ private imgBitmap;
560
573
  protected img: HTMLImageElement;
561
574
  getBoundingBox(): BoundingBox;
562
575
  getPath(): Path2D;
@@ -573,6 +586,7 @@ declare class ImageSprite extends Sprite {
573
586
  y?: number;
574
587
  dir?: number;
575
588
  size?: number;
589
+ pivot?: Vec2;
576
590
  scene?: string;
577
591
  hidden?: boolean;
578
592
  layer?: number;
@@ -607,6 +621,65 @@ declare class RigidCircle extends Circle implements RigidBodyOptions {
607
621
  constructor(options?: RigidCircleOptions);
608
622
  }
609
623
 
624
+ interface Object3DOptions {
625
+ vertices: Vec3[];
626
+ faces: [number, number, ...number[]][];
627
+ x?: number;
628
+ y?: number;
629
+ z?: number;
630
+ }
631
+ declare class Object3D {
632
+ x: number;
633
+ y: number;
634
+ z: number;
635
+ rotX: number;
636
+ rotY: number;
637
+ rotZ: number;
638
+ vertices: Vec3[];
639
+ faces: [number, number, ...number[]][];
640
+ constructor(options: Object3DOptions);
641
+ rotateX(deg: number): void;
642
+ rotateY(deg: number): void;
643
+ rotateZ(deg: number): void;
644
+ pointX(deg: number): void;
645
+ pointY(deg: number): void;
646
+ pointZ(deg: number): void;
647
+ }
648
+
649
+ interface WireframeRenderer3DOptions extends PenOptions {
650
+ objects: Object3D[];
651
+ }
652
+ declare class WireframeRenderer3D extends Pen {
653
+ FOV: number;
654
+ ASPECT: number;
655
+ Z_NEAR: number;
656
+ SPEED: number;
657
+ SENSITIVITY: number;
658
+ camX: number;
659
+ camY: number;
660
+ camZ: number;
661
+ camDirX: number;
662
+ camDirY: number;
663
+ camDirZ: number;
664
+ objects: Object3D[];
665
+ constructor(options: WireframeRenderer3DOptions);
666
+ registerControls(): void;
667
+ private project;
668
+ update(): void;
669
+ }
670
+
671
+ declare const cubeVertices: Vec3[];
672
+
673
+ declare const cubeFaces: [number, number, ...number[]][];
674
+
675
+ declare const tetrahedronVertices: Vec3[];
676
+
677
+ declare const tetrahedronFaces: [number, number, ...number[]][];
678
+
679
+ declare const octahedronVerticesVertices: Vec3[];
680
+
681
+ declare const octahedronFaces: [number, number, ...number[]][];
682
+
610
683
  type Mat2<T = number> = [
611
684
  [
612
685
  T,
@@ -678,6 +751,14 @@ declare const TScratch: {
678
751
  Watermark: typeof Watermark;
679
752
  ImageSprite: typeof ImageSprite;
680
753
  RigidCircle: typeof RigidCircle;
754
+ WireframeRenderer3D: typeof WireframeRenderer3D;
755
+ Object3D: typeof Object3D;
756
+ cubeVertices: Vec3[];
757
+ cubeFaces: [number, number, ...number[]][];
758
+ tetrahedronVertices: Vec3[];
759
+ tetrahedronFaces: [number, number, ...number[]][];
760
+ octahedronVertices: Vec3[];
761
+ octahedronFaces: [number, number, ...number[]][];
681
762
  scale: number;
682
763
  aspectRatio: number;
683
764
  setScale: typeof setScale;
@@ -686,4 +767,4 @@ declare const TScratch: {
686
767
  ctx: CanvasRenderingContext2D;
687
768
  };
688
769
 
689
- export { Arc, type ArcOptions, Button, type ButtonOptions, Circle, type CircleOptions, CustomPolygon, type CustomPolygonOptions, Engine, ImageSprite, type ImageSpriteOptions, type Mat2, type Mat3, type Mat4, Multiplayer, Oval, type OvalOptions, Pen, type PenOptions, Rectangle, type RectangleOptions, RegularPolygon, type RegularPolygonOptions, type RigidBodyOptions, RigidCircle, type RigidCircleOptions, Sprite, type SpriteOptions, Square, type SquareOptions, Text, type TextOptions, type Vec2, type Vec3, type Vec4, Watermark, type TextOptions as WatermarkOptions, aspectRatio, canvas, ctx, TScratch as default, scale, setAspectRatio, setScale };
770
+ export { Arc, type ArcOptions, Button, type ButtonOptions, Circle, type CircleOptions, CustomPolygon, type CustomPolygonOptions, Engine, ImageSprite, type ImageSpriteOptions, type Mat2, type Mat3, type Mat4, Multiplayer, Object3D, type Object3DOptions, Oval, type OvalOptions, Pen, type PenOptions, Rectangle, type RectangleOptions, RegularPolygon, type RegularPolygonOptions, type RigidBodyOptions, RigidCircle, type RigidCircleOptions, Sprite, type SpriteOptions, Square, type SquareOptions, Text, type TextOptions, type Vec2, type Vec3, type Vec4, Watermark, type TextOptions as WatermarkOptions, WireframeRenderer3D, type WireframeRenderer3DOptions, aspectRatio, canvas, ctx, cubeFaces, cubeVertices, TScratch as default, octahedronFaces, octahedronVerticesVertices as octahedronVertices, scale, setAspectRatio, setScale, tetrahedronFaces, tetrahedronVertices };
@@ -1,3 +1,7 @@
1
+ type Vec2<T = number> = [T, T];
2
+ type Vec3<T = number> = [T, T, T];
3
+ type Vec4<T = number> = [T, T, T, T];
4
+
1
5
  interface BoundingBox {
2
6
  x: number;
3
7
  y: number;
@@ -9,6 +13,7 @@ interface SpriteOptions {
9
13
  y?: number;
10
14
  dir?: number;
11
15
  size?: number;
16
+ pivot?: Vec2;
12
17
  scene?: string;
13
18
  hidden?: boolean;
14
19
  layer?: number;
@@ -18,6 +23,7 @@ declare abstract class Sprite {
18
23
  y: number;
19
24
  dir: number;
20
25
  size: number;
26
+ pivot: Vec2;
21
27
  scene: string;
22
28
  hidden: boolean;
23
29
  layer: number;
@@ -50,6 +56,7 @@ declare abstract class Sprite {
50
56
  goTo(x: number, y: number): void;
51
57
  changeX(dX: number): void;
52
58
  changeY(dY: number): void;
59
+ setPivot(x: number, y: number): void;
53
60
  show(): void;
54
61
  hide(): void;
55
62
  setSize(size: number): void;
@@ -58,10 +65,6 @@ declare abstract class Sprite {
58
65
  changeLayer(dL: number): void;
59
66
  }
60
67
 
61
- type Vec2<T = number> = [T, T];
62
- type Vec3<T = number> = [T, T, T];
63
- type Vec4<T = number> = [T, T, T, T];
64
-
65
68
  type GameLoop = (() => void) | (() => Promise<void>);
66
69
  type SceneMap = Map<string, {
67
70
  sprites: Sprite[];
@@ -166,6 +169,7 @@ declare class Rectangle extends Sprite {
166
169
  y?: number;
167
170
  dir?: number;
168
171
  size?: number;
172
+ pivot?: Vec2;
169
173
  scene?: string;
170
174
  hidden?: boolean;
171
175
  layer?: number;
@@ -202,6 +206,7 @@ declare class Square extends Sprite {
202
206
  y?: number;
203
207
  dir?: number;
204
208
  size?: number;
209
+ pivot?: Vec2;
205
210
  scene?: string;
206
211
  hidden?: boolean;
207
212
  layer?: number;
@@ -240,6 +245,7 @@ declare class Oval extends Sprite {
240
245
  y?: number;
241
246
  dir?: number;
242
247
  size?: number;
248
+ pivot?: Vec2;
243
249
  scene?: string;
244
250
  hidden?: boolean;
245
251
  layer?: number;
@@ -276,6 +282,7 @@ declare class Circle extends Sprite {
276
282
  y?: number;
277
283
  dir?: number;
278
284
  size?: number;
285
+ pivot?: Vec2;
279
286
  scene?: string;
280
287
  hidden?: boolean;
281
288
  layer?: number;
@@ -314,6 +321,7 @@ declare class Arc extends Sprite {
314
321
  y?: number;
315
322
  dir?: number;
316
323
  size?: number;
324
+ pivot?: Vec2;
317
325
  scene?: string;
318
326
  hidden?: boolean;
319
327
  layer?: number;
@@ -353,6 +361,7 @@ declare class RegularPolygon extends Sprite {
353
361
  y?: number;
354
362
  dir?: number;
355
363
  size?: number;
364
+ pivot?: Vec2;
356
365
  scene?: string;
357
366
  hidden?: boolean;
358
367
  layer?: number;
@@ -389,6 +398,7 @@ declare class CustomPolygon extends Sprite {
389
398
  y?: number;
390
399
  dir?: number;
391
400
  size?: number;
401
+ pivot?: Vec2;
392
402
  scene?: string;
393
403
  hidden?: boolean;
394
404
  layer?: number;
@@ -421,6 +431,7 @@ declare class Pen extends Sprite {
421
431
  y?: number;
422
432
  dir?: number;
423
433
  size?: number;
434
+ pivot?: Vec2;
424
435
  scene?: string;
425
436
  hidden?: boolean;
426
437
  layer?: number;
@@ -522,6 +533,7 @@ declare class Button extends Sprite {
522
533
  y?: number;
523
534
  dir?: number;
524
535
  size?: number;
536
+ pivot?: Vec2;
525
537
  scene?: string;
526
538
  hidden?: boolean;
527
539
  layer?: number;
@@ -557,6 +569,7 @@ declare class ImageSprite extends Sprite {
557
569
  height: number;
558
570
  outlineColor: string;
559
571
  outlineWidth: number;
572
+ private imgBitmap;
560
573
  protected img: HTMLImageElement;
561
574
  getBoundingBox(): BoundingBox;
562
575
  getPath(): Path2D;
@@ -573,6 +586,7 @@ declare class ImageSprite extends Sprite {
573
586
  y?: number;
574
587
  dir?: number;
575
588
  size?: number;
589
+ pivot?: Vec2;
576
590
  scene?: string;
577
591
  hidden?: boolean;
578
592
  layer?: number;
@@ -607,6 +621,65 @@ declare class RigidCircle extends Circle implements RigidBodyOptions {
607
621
  constructor(options?: RigidCircleOptions);
608
622
  }
609
623
 
624
+ interface Object3DOptions {
625
+ vertices: Vec3[];
626
+ faces: [number, number, ...number[]][];
627
+ x?: number;
628
+ y?: number;
629
+ z?: number;
630
+ }
631
+ declare class Object3D {
632
+ x: number;
633
+ y: number;
634
+ z: number;
635
+ rotX: number;
636
+ rotY: number;
637
+ rotZ: number;
638
+ vertices: Vec3[];
639
+ faces: [number, number, ...number[]][];
640
+ constructor(options: Object3DOptions);
641
+ rotateX(deg: number): void;
642
+ rotateY(deg: number): void;
643
+ rotateZ(deg: number): void;
644
+ pointX(deg: number): void;
645
+ pointY(deg: number): void;
646
+ pointZ(deg: number): void;
647
+ }
648
+
649
+ interface WireframeRenderer3DOptions extends PenOptions {
650
+ objects: Object3D[];
651
+ }
652
+ declare class WireframeRenderer3D extends Pen {
653
+ FOV: number;
654
+ ASPECT: number;
655
+ Z_NEAR: number;
656
+ SPEED: number;
657
+ SENSITIVITY: number;
658
+ camX: number;
659
+ camY: number;
660
+ camZ: number;
661
+ camDirX: number;
662
+ camDirY: number;
663
+ camDirZ: number;
664
+ objects: Object3D[];
665
+ constructor(options: WireframeRenderer3DOptions);
666
+ registerControls(): void;
667
+ private project;
668
+ update(): void;
669
+ }
670
+
671
+ declare const cubeVertices: Vec3[];
672
+
673
+ declare const cubeFaces: [number, number, ...number[]][];
674
+
675
+ declare const tetrahedronVertices: Vec3[];
676
+
677
+ declare const tetrahedronFaces: [number, number, ...number[]][];
678
+
679
+ declare const octahedronVerticesVertices: Vec3[];
680
+
681
+ declare const octahedronFaces: [number, number, ...number[]][];
682
+
610
683
  type Mat2<T = number> = [
611
684
  [
612
685
  T,
@@ -678,6 +751,14 @@ declare const TScratch: {
678
751
  Watermark: typeof Watermark;
679
752
  ImageSprite: typeof ImageSprite;
680
753
  RigidCircle: typeof RigidCircle;
754
+ WireframeRenderer3D: typeof WireframeRenderer3D;
755
+ Object3D: typeof Object3D;
756
+ cubeVertices: Vec3[];
757
+ cubeFaces: [number, number, ...number[]][];
758
+ tetrahedronVertices: Vec3[];
759
+ tetrahedronFaces: [number, number, ...number[]][];
760
+ octahedronVertices: Vec3[];
761
+ octahedronFaces: [number, number, ...number[]][];
681
762
  scale: number;
682
763
  aspectRatio: number;
683
764
  setScale: typeof setScale;
@@ -686,4 +767,4 @@ declare const TScratch: {
686
767
  ctx: CanvasRenderingContext2D;
687
768
  };
688
769
 
689
- export { Arc, type ArcOptions, Button, type ButtonOptions, Circle, type CircleOptions, CustomPolygon, type CustomPolygonOptions, Engine, ImageSprite, type ImageSpriteOptions, type Mat2, type Mat3, type Mat4, Multiplayer, Oval, type OvalOptions, Pen, type PenOptions, Rectangle, type RectangleOptions, RegularPolygon, type RegularPolygonOptions, type RigidBodyOptions, RigidCircle, type RigidCircleOptions, Sprite, type SpriteOptions, Square, type SquareOptions, Text, type TextOptions, type Vec2, type Vec3, type Vec4, Watermark, type TextOptions as WatermarkOptions, aspectRatio, canvas, ctx, TScratch as default, scale, setAspectRatio, setScale };
770
+ export { Arc, type ArcOptions, Button, type ButtonOptions, Circle, type CircleOptions, CustomPolygon, type CustomPolygonOptions, Engine, ImageSprite, type ImageSpriteOptions, type Mat2, type Mat3, type Mat4, Multiplayer, Object3D, type Object3DOptions, Oval, type OvalOptions, Pen, type PenOptions, Rectangle, type RectangleOptions, RegularPolygon, type RegularPolygonOptions, type RigidBodyOptions, RigidCircle, type RigidCircleOptions, Sprite, type SpriteOptions, Square, type SquareOptions, Text, type TextOptions, type Vec2, type Vec3, type Vec4, Watermark, type TextOptions as WatermarkOptions, WireframeRenderer3D, type WireframeRenderer3DOptions, aspectRatio, canvas, ctx, cubeFaces, cubeVertices, TScratch as default, octahedronFaces, octahedronVerticesVertices as octahedronVertices, scale, setAspectRatio, setScale, tetrahedronFaces, tetrahedronVertices };
@@ -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}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};
1
+ var n=document.getElementById("game-window")||document.createElement("canvas"),a=n.getContext("2d"),w=document.createElement("canvas"),p=w.getContext("2d"),D=16/9,M;function G(){n.width=D*M,n.height=M,w.width=D*M,w.height=M}function q(o){M=o,G()}function U(o){D=o,G()}n.parentElement?.insertBefore(w,n);q(500);var d=class o{x=0;y=0;dir=0;size=1;pivot=[0,0];scene="main";hidden=!1;layer=0;cachedPath=null;pathDirty=!0;static collisionCanvas=null;static collisionCtx=null;refresh(){l.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),l.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 s=i.x-i.width/2,h=i.y+i.height/2,c=i.x+i.width/2,u=i.y-i.height/2,f=e.x-e.width/2,m=e.y+e.height/2,g=e.x+e.width/2,b=e.y-e.height/2,y=Math.max(s,f),S=Math.min(u,b),x=Math.min(c,g),v=Math.max(h,m),C=x-y,B=v-S;if(C<1||B<1)return!1;o.collisionCanvas||(o.collisionCanvas=new OffscreenCanvas(1,1),o.collisionCtx=o.collisionCanvas.getContext("2d",{willReadFrequently:!0}));let P=o.collisionCtx;o.collisionCanvas.width<C&&(o.collisionCanvas.width=C),o.collisionCanvas.height<B&&(o.collisionCanvas.height=B),P.clearRect(0,0,C,B);let $=(O,st)=>{P.save();let rt=O.x-y,nt=v-O.y;P.translate(rt,nt),P.rotate(O.toRadians(O.dir)),P.fillStyle=st,P.fill(O.getCachedPath()),P.restore()};$(this,"red");let H=P.getImageData(0,0,C,B).data;P.clearRect(0,0,C,B),$(t,"blue");let et=P.getImageData(0,0,C,B).data;for(let O=3;O<H.length;O+=4)if(H[O]>0&&et[O]>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()}setPivot(t,i){this.pivot=[t,i],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 l=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 r=this.sceneMap.get(i).sprites.findIndex(s=>s.layer>e);if(r===-1){this.sceneMap.get(i).sprites.push(t);return}this.sceneMap.get(i).sprites.splice(r,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,r=0,s=async h=>{if(!this.loopRunning)return;let c=h-this.lastFrame;this.lastFrame=h,r+=c,r>=e&&(this.deltaTime=r/1e3,r=r%e,i&&await i()),this.animationFrameId=requestAnimationFrame(s)};this.lastFrame=performance.now(),this.animationFrameId=requestAnimationFrame(s)}refresh(){this.refreshScheduled||(this.refreshScheduled=!0,requestAnimationFrame(()=>{this.refreshScheduled=!1,a.clearRect(0,0,n.width,n.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,r=i+n.width/2,s=n.height/2-e,h=r-(t.x+n.width/2),c=s-(n.height/2-t.y),u=-this.toRadians(t.dir),f=h*Math.cos(u)-c*Math.sin(u),m=h*Math.sin(u)+c*Math.cos(u);return a.isPointInPath(t.getCachedPath(),f,m)}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:[]}),w.addEventListener("mousemove",t=>{this.mouseX=t.clientX-w.offsetLeft-w.width/2,this.mouseY=-(t.clientY-w.offsetTop-w.height/2)}),w.addEventListener("mousedown",()=>{this.mouseDown=!0}),w.addEventListener("mouseup",()=>{this.mouseDown=!1}),w.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 ot}from"socket.io-client";var Y=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=ot(t)}broadcast(t,i){this.socket.emit(t,i)}on(t,i){this.socket.on(t,i)}};var R=class o extends d{discriminant="rectangle";tags=new Set(["rectangle"]);width;height;color;outlineColor;outlineWidth;getBoundingBox(){let t=l.init(),i=this.width/2,e=this.height/2,r=t.cos(this.dir),s=t.sin(this.dir),h=2*(Math.abs(i*r)+Math.abs(e*s))*this.size,c=2*(Math.abs(i*s)+Math.abs(e*r))*this.size;return{x:this.x,y:this.y,width:h,height:c}}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?p:a;i.save();let e=this.x+n.width/2,r=-this.y+n.height/2;i.translate(e,r),i.rotate(this.toRadians(this.dir)),i.translate(-this.pivot[0],this.pivot[1]);let s=this.getCachedPath();i.fillStyle=this.color,i.strokeStyle=this.outlineColor,i.lineWidth=this.outlineWidth,i.fill(s),this.outlineWidth&&i.stroke(s),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 X=class o extends d{discriminant="square";tags=new Set(["square"]);sideLength;color;outlineColor;outlineWidth;getBoundingBox(){let t=l.init(),i=this.sideLength/2,e=t.cos(this.dir),r=t.sin(this.dir),s=2*(Math.abs(i*e)+Math.abs(i*r))*this.size;return{x:this.x,y:this.y,width:s,height:s}}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?p:a;i.save();let e=this.x+n.width/2,r=-this.y+n.height/2;i.translate(e,r),i.rotate(this.toRadians(this.dir)),i.translate(-this.pivot[0],this.pivot[1]);let s=this.getCachedPath();i.fillStyle=this.color,i.strokeStyle=this.outlineColor,i.lineWidth=this.outlineWidth,i.fill(s),this.outlineWidth&&i.stroke(s),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 T=class o extends d{discriminant="oval";tags=new Set(["oval"]);radX;radY;color;outlineColor;outlineWidth;getBoundingBox(){let t=l.init(),i=this.radX,e=this.radY,r=t.cos(this.dir),s=t.sin(this.dir),h=2*(Math.abs(i*r)+Math.abs(e*s))*this.size,c=2*(Math.abs(i*s)+Math.abs(e*r))*this.size;return{x:this.x,y:this.y,width:h,height:c}}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?p:a;i.save();let e=this.x+n.width/2,r=-this.y+n.height/2;i.translate(e,r),i.rotate(this.toRadians(this.dir)),i.translate(-this.pivot[0],this.pivot[1]);let s=this.getCachedPath();i.fillStyle=this.color,i.strokeStyle=this.outlineColor,i.lineWidth=this.outlineWidth,i.fill(s),this.outlineWidth&&i.stroke(s),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 d{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?p:a;i.save();let e=this.x+n.width/2,r=-this.y+n.height/2;i.translate(e,r),i.rotate(this.toRadians(this.dir)),i.translate(-this.pivot[0],this.pivot[1]);let s=this.getCachedPath();i.fillStyle=this.color,i.strokeStyle=this.outlineColor,i.lineWidth=this.outlineWidth,i.fill(s),this.outlineWidth&&i.stroke(s),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 V=class o extends d{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?p:a;i.save();let e=this.x+n.width/2,r=-this.y+n.height/2;i.translate(e,r),i.rotate(this.toRadians(this.dir)),i.translate(-this.pivot[0],this.pivot[1]);let s=this.getCachedPath();i.fillStyle=this.color,i.strokeStyle=this.outlineColor,i.lineWidth=this.outlineWidth,i.fill(s),this.outlineWidth&&i.stroke(s),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 d{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?p:a;i.save();let e=this.x+n.width/2,r=-this.y+n.height/2;i.translate(e,r),i.rotate(this.toRadians(this.dir)),i.translate(-this.pivot[0],this.pivot[1]);let s=this.getCachedPath();i.fillStyle=this.color,i.strokeStyle=this.outlineColor,i.lineWidth=this.outlineWidth,i.fill(s),this.outlineWidth&&i.stroke(s),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 E=class o extends d{discriminant="custompolygon";tags=new Set(["custompolygon"]);vertices;color;outlineColor;outlineWidth;getBoundingBox(){let t=l.init(),i=t.cos(this.dir),e=t.sin(this.dir),r=1/0,s=-1/0,h=1/0,c=-1/0;if(this.vertices.length===0)return{x:this.x,y:this.y,width:0,height:0};for(let b of this.vertices){let y=b[0]*i-b[1]*e,S=b[0]*e+b[1]*i,x=this.x+y,v=this.y+S;x<r&&(r=x),x>s&&(s=x),v<h&&(h=v),v>c&&(c=v)}let u=s-r,f=c-h,m=r+u/2,g=h+f/2;return{x:m*this.size,y:g*this.size,width:u*this.size,height:f*this.size}}getPath(){let t=new Path2D;if(this.vertices.length<2)return t;let i=this.vertices,[e,...r]=i;t.moveTo(e[0]*this.size,-e[1]*this.size);for(let s of r)t.lineTo(s[0]*this.size,-s[1]*this.size);return t.closePath(),t}draw(t){let i=t?p:a;i.save();let e=this.x+n.width/2,r=-this.y+n.height/2;i.translate(e,r),i.rotate(this.toRadians(this.dir)),i.translate(-this.pivot[0],this.pivot[1]);let s=this.getCachedPath();i.fillStyle=this.color,i.strokeStyle=this.outlineColor,i.lineWidth=this.outlineWidth,i.fill(s),this.outlineWidth&&i.stroke(s),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 k=class o extends d{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(){p.clearRect(0,0,n.width,n.height)}dot(){p.fillStyle=this.color,p.fillRect(this.x-this.penSize/2+n.width/2,-this.y-this.penSize/2+n.height/2,this.penSize,this.penSize)}drawSprite(t){t.draw(!0),l.init().removeSprite(t)}drawLine(t,i){p.beginPath(),p.moveTo(t+n.width/2,-i+n.height/2),p.lineTo(this.x+n.width/2,-this.y+n.height/2),p.lineWidth=this.penSize,p.strokeStyle=this.color,p.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,r=this.y;this.x=t,this.y=i,this.drawing&&this.drawLine(e,r),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 d{discriminant="text";tags=new Set(["text"]);content;color;fontFamily;fontSize;align;baseline;font;getBoundingBox(){let t=l.init(),i=a.measureText(String(this.content)),e=i.width/2,r=i.actualBoundingBoxAscent+i.actualBoundingBoxDescent/2,s=t.cos(this.dir),h=t.sin(this.dir),c=2*(Math.abs(e*s)+Math.abs(r*h))*this.size,u=2*(Math.abs(e*h)+Math.abs(r*s))*this.size;return{x:this.x,y:this.y,width:c,height:u}}getPath(){let t=new Path2D;a.save(),a.font=this.font;let i=a.measureText(String(this.content)),e=i.width*this.size,r=(i.actualBoundingBoxAscent+i.actualBoundingBoxDescent)*this.size;return a.restore(),t.rect(-e/2,-r/2,e,r),t}draw(t){let i=t?p:a;i.save();let e=this.x+n.width/2,r=-this.y+n.height/2;i.translate(e,r),i.rotate(this.toRadians(this.dir)),i.translate(-this.pivot[0],this.pivot[1]),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 I=class o extends d{discriminant="button";tags=new Set(["button"]);content;fontColor;fontFamily;fontSize;font;width;height;backgroundColor;outlineColor;outlineWidth;getBoundingBox(){let t=l.init();a.save(),a.font=this.font;let i=a.measureText(String(this.content)),e=Math.max(i.width,this.width)/2,r=Math.max(i.actualBoundingBoxAscent+i.actualBoundingBoxDescent,this.height)/2;a.restore();let s=t.cos(this.dir),h=t.sin(this.dir),c=2*(Math.abs(e*s)+Math.abs(r*h))*this.size,u=2*(Math.abs(e*h)+Math.abs(r*s))*this.size;return{x:this.x,y:this.y,width:c,height:u}}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?p:a;i.save();let e=this.x+n.width/2,r=-this.y+n.height/2;i.translate(e,r),i.rotate(this.toRadians(this.dir)),i.translate(-this.pivot[0],this.pivot[1]),i.fillStyle=this.backgroundColor,i.strokeStyle=this.outlineColor,i.lineWidth=this.outlineWidth;let s=this.getCachedPath();i.fill(s),this.outlineWidth&&i.stroke(s),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 L=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??-n.width/2+5,this.y=t?.y??n.height/2-5,this.align=t?.align??"left",this.baseline=t?.baseline??"top",this.draw()}};var A=class o extends d{discriminant="imagesprite";tags=new Set(["imagesprite"]);costumes;costumeNumber;width;height;outlineColor;outlineWidth;imgBitmap=null;img;getBoundingBox(){let t=l.init(),i=this.width/2,e=this.height/2,r=t.cos(this.dir),s=t.sin(this.dir),h=2*Math.sqrt((i*r)**2+(e*s)**2)*this.size,c=2*Math.sqrt((i*s)**2+(e*r)**2)*this.size;return{x:this.x,y:this.y,width:h,height:c}}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?p:a;i.save();let e=this.x+n.width/2,r=-this.y+n.height/2;i.translate(e,r),i.rotate(this.toRadians(this.dir)),i.translate(-this.pivot[0],this.pivot[1]),i.strokeStyle=this.outlineColor,i.lineWidth=this.outlineWidth,i.drawImage(this.imgBitmap??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=()=>{createImageBitmap(this.img).then(i=>{this.imgBitmap=i}),this.refresh()}}nextCostume(){this.costumeNumber=(this.costumeNumber+1)%this.costumes.length,this.img.src=this.costumes[this.costumeNumber],this.img.onload=()=>{this.imgBitmap=null,createImageBitmap(this.img).then(t=>{this.imgBitmap=t}),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.imgBitmap=null,createImageBitmap(this.img).then(t=>{this.imgBitmap=t}),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),createImageBitmap(this.img).then(i=>{this.imgBitmap=i}),this.draw()}}};var N=class extends z{tags=new Set(["circle","rigidbody"]);gravity;vX;vY;drag;bounceLoss;update(){let t=l.init();this.vY+=this.gravity,this.vY*=this.drag,this.vX*=this.drag;let i=this.x+this.vX,e=this.y+this.vY,r=t.sceneMap.get(this.scene).sprites.filter(m=>m.discriminant==="circle"),s=t.sceneMap.get("*").sprites.filter(m=>m.discriminant==="circle"),h=[...r,...s],c=Math.ceil(this.distanceTo(i,e)/(2*this.radius));for(let m=0;m<c;m++)for(let g of h)if(this.distanceTo(g.x,g.y)<this.radius+g.radius){let b=this.x-g.x,y=this.y-g.y,S=Math.sqrt(b*b+y*y);if(S===0)continue;let x=b/S,v=y/S,C=this.vX*x+this.vY*v;this.vX=(this.vX-2*C*x)*this.bounceLoss,this.vY=(this.vY-2*C*v)*this.bounceLoss,this.changeX(this.vX),this.changeY(this.vY);return}this.goTo(i,e);let u=n.width/2,f=n.height/2;this.x-this.radius<-u?(this.setX(-u+this.radius),this.vX=Math.abs(this.vX)*this.bounceLoss):this.x+this.radius>u&&(this.setX(u-this.radius),this.vX=-Math.abs(this.vX)*this.bounceLoss),this.y-this.radius<-f?(this.setY(-f+this.radius),this.vY=Math.abs(this.vY)*this.bounceLoss):this.y+this.radius>f&&(this.setY(f-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 Z=class extends k{FOV=60;ASPECT=n.width/n.height;Z_NEAR=.01;SPEED=2;SENSITIVITY=300;camX=0;camY=0;camZ=0;camDirX=0;camDirY=0;camDirZ=0;objects;constructor(t){super(t),this.objects=t.objects}registerControls(){let t=l.init(),i=t.deltaTime,e=t.sin(this.camDirY),r=t.cos(this.camDirY);t.keyPressed("w")&&(this.camX+=this.SPEED*e*i,this.camZ+=this.SPEED*r*i),t.keyPressed("a")&&(this.camX-=this.SPEED*r*i,this.camZ+=this.SPEED*e*i),t.keyPressed("s")&&(this.camX-=this.SPEED*e*i,this.camZ-=this.SPEED*r*i),t.keyPressed("d")&&(this.camX+=this.SPEED*r*i,this.camZ-=this.SPEED*e*i),t.keyPressed("e")&&(this.camY+=this.SPEED*i),t.keyPressed("q")&&(this.camY-=this.SPEED*i),t.keyPressed("up")&&(this.camDirX+=this.SENSITIVITY*i),t.keyPressed("down")&&(this.camDirX-=this.SENSITIVITY*i),t.keyPressed("left")&&(this.camDirY-=this.SENSITIVITY*i),t.keyPressed("right")&&(this.camDirY+=this.SENSITIVITY*i)}project(t){let i=1/l.init().tan(this.FOV/2);return t.map(e=>{let r=e[0],s=e[1],h=e[2]<this.Z_NEAR?this.Z_NEAR:e[2],c=n.width/2*(r*i)/(h*this.ASPECT),u=n.height/2*(s*i)/h;return[c,u]})}update(){let t=l.init(),i=t.sin(this.camDirX),e=t.cos(this.camDirX),r=t.sin(this.camDirY),s=t.cos(this.camDirY),h=t.sin(this.camDirZ),c=t.cos(this.camDirZ);for(let u of this.objects){let f=this.project(u.vertices.map(m=>{let g=m[0]+u.x-this.camX,b=m[1]+u.y-this.camY,y=m[2]+u.z-this.camZ,S=g*s-y*r,x=g*r+y*s,v=b*e-x*i,C=b*i+x*e,B=S*c-v*h,P=S*h+v*c;return[B,P,C]}));for(let m of u.faces){let[g,b]=f[m[0]];this.goTo(g,b),this.down();for(let y of m){let[S,x]=f[y];this.goTo(S,x)}this.goTo(g,b),this.up()}}}};var j=class{x=0;y=0;z=0;rotX=0;rotY=0;rotZ=0;vertices;faces;constructor(t){this.vertices=t.vertices,this.faces=t.faces,this.x=t.x??0,this.y=t.y??0,this.z=t.z??2}rotateX(t){let i=l.init(),e=i.cos(t),r=i.sin(t);for(let s=0;s<this.vertices.length;s++){let[h,c,u]=this.vertices[s];this.vertices[s][1]=c*e-u*r,this.vertices[s][2]=c*r+u*e}}rotateY(t){let i=l.init(),e=i.cos(t),r=i.sin(t);for(let s=0;s<this.vertices.length;s++){let[h,c,u]=this.vertices[s];this.vertices[s][0]=h*e+u*r,this.vertices[s][2]=-h*r+u*e}}rotateZ(t){let i=l.init(),e=i.cos(t),r=i.sin(t);for(let s=0;s<this.vertices.length;s++){let[h,c,u]=this.vertices[s];this.vertices[s][0]=h*e-c*r,this.vertices[s][1]=h*r+c*e}}pointX(t){let i=t-this.rotX;this.rotX=t,this.rotateX(i)}pointY(t){let i=t-this.rotY;this.rotY=t,this.rotateY(i)}pointZ(t){let i=t-this.rotZ;this.rotZ=t,this.rotateZ(i)}};var ht=[[-.5,-.5,-.5],[.5,-.5,-.5],[.5,-.5,.5],[-.5,-.5,.5],[-.5,.5,-.5],[.5,.5,-.5],[.5,.5,.5],[-.5,.5,.5]],J=ht;var ct=[[0,1,2,3],[4,5,6,7],[0,4],[1,5],[2,6],[3,7]],K=ct;var at=[[1,1,1],[-1,-1,1],[-1,1,-1],[1,-1,-1]],Q=at;var lt=[[0,1,2],[0,3,1],[0,2,3],[1,3,2]],_=lt;var ut=[[1,0,0],[-1,0,0],[0,1,0],[0,-1,0],[0,0,1],[0,0,-1]],tt=ut;var pt=[[0,2,4],[2,1,4],[1,3,4],[3,0,4],[2,0,5],[1,2,5],[3,1,5],[0,3,5]],it=pt;var dt={Engine:l,Sprite:d,Multiplayer:Y,Rectangle:R,Square:X,Oval:T,Circle:z,Arc:V,RegularPolygon:F,CustomPolygon:E,Pen:k,Text:W,Button:I,Watermark:L,ImageSprite:A,RigidCircle:N,WireframeRenderer3D:Z,Object3D:j,cubeVertices:J,cubeFaces:K,tetrahedronVertices:Q,tetrahedronFaces:_,octahedronVertices:tt,octahedronFaces:it,scale:M,aspectRatio:D,setScale:q,setAspectRatio:U,canvas:n,ctx:a},se=dt;export{V as Arc,I as Button,z as Circle,E as CustomPolygon,l as Engine,A as ImageSprite,Y as Multiplayer,j as Object3D,T as Oval,k as Pen,R as Rectangle,F as RegularPolygon,N as RigidCircle,d as Sprite,X as Square,W as Text,L as Watermark,Z as WireframeRenderer3D,D as aspectRatio,n as canvas,a as ctx,K as cubeFaces,J as cubeVertices,se as default,it as octahedronFaces,tt as octahedronVertices,M as scale,U as setAspectRatio,q as setScale,_ as tetrahedronFaces,Q as tetrahedronVertices};
2
2
  //# sourceMappingURL=index.js.map