tscratch 0.6.4 → 0.6.6

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.
@@ -19,6 +19,7 @@ declare abstract class Sprite {
19
19
  scene: string;
20
20
  hidden: boolean;
21
21
  layer: number;
22
+ abstract discriminant: string;
22
23
  private cachedPath;
23
24
  private pathDirty;
24
25
  private static collisionCanvas;
@@ -63,21 +64,21 @@ type SceneMap = Map<string, {
63
64
  declare class Engine {
64
65
  private static instance;
65
66
  private loopRunning;
66
- gameLoop: GameLoop | null;
67
+ private gameLoop;
67
68
  maxFPS: number;
68
69
  deltaTime: number;
69
70
  private lastFrame;
70
71
  private refreshScheduled;
71
72
  private animationFrameId;
72
- sounds: HTMLAudioElement[];
73
+ private sounds;
73
74
  mouseX: number;
74
75
  mouseY: number;
75
76
  mouseDown: boolean;
76
77
  mouseClicked: boolean;
77
78
  private keysPressed;
78
- currentScene: string;
79
+ private currentScene;
79
80
  sceneMap: SceneMap;
80
- variableMap: Map<string, unknown>;
81
+ private variableMap;
81
82
  static init(): Engine;
82
83
  changeScene(scene: string): void;
83
84
  setLoop(scene: string, loop: GameLoop): void;
@@ -97,7 +98,7 @@ declare class Engine {
97
98
  stopSound(sound: HTMLAudioElement): void;
98
99
  stopAllSounds(): void;
99
100
  pickRandom(min: number, max: number): number;
100
- dotProduct(vectors: [Vec2, Vec2] | [Vec3, Vec3] | [Vec4, Vec4]): number;
101
+ dotProduct(...vectors: [Vec2, Vec2] | [Vec3, Vec3] | [Vec4, Vec4]): number;
101
102
  sin(deg: number): number;
102
103
  cos(deg: number): number;
103
104
  tan(deg: number): number;
@@ -319,7 +320,7 @@ declare class Pen extends Sprite {
319
320
  }
320
321
 
321
322
  interface TextOptions extends SpriteOptions {
322
- content?: string;
323
+ content?: string | number;
323
324
  color?: string;
324
325
  fontFamily?: string;
325
326
  fontSize?: number;
@@ -328,7 +329,7 @@ interface TextOptions extends SpriteOptions {
328
329
  }
329
330
  declare class Text extends Sprite {
330
331
  discriminant: string;
331
- content: string;
332
+ content: string | number;
332
333
  color: string;
333
334
  fontFamily: string;
334
335
  fontSize: number;
@@ -339,7 +340,7 @@ declare class Text extends Sprite {
339
340
  getPath(): Path2D;
340
341
  draw(stamping?: boolean): void;
341
342
  create(options?: TextOptions): this;
342
- setContent(content: string): void;
343
+ setContent(content: string | number): void;
343
344
  setColor(color: string): void;
344
345
  setFontSize(fontSize: number): void;
345
346
  setFontFamily(fontFamily: string): void;
@@ -349,7 +350,7 @@ declare class Text extends Sprite {
349
350
  }
350
351
 
351
352
  interface ButtonOptions extends SpriteOptions {
352
- content?: string;
353
+ content?: string | number;
353
354
  fontColor?: string;
354
355
  fontFamily?: string;
355
356
  fontSize?: number;
@@ -361,7 +362,7 @@ interface ButtonOptions extends SpriteOptions {
361
362
  }
362
363
  declare class Button extends Sprite {
363
364
  discriminant: string;
364
- content: string;
365
+ content: string | number;
365
366
  fontColor: string;
366
367
  fontFamily: string;
367
368
  fontSize: number;
@@ -375,7 +376,7 @@ declare class Button extends Sprite {
375
376
  getPath(): Path2D;
376
377
  draw(stamping?: boolean): void;
377
378
  create(options?: ButtonOptions): this;
378
- setContent(content: string): void;
379
+ setContent(content: string | number): void;
379
380
  setBackgroundColor(color: string): void;
380
381
  setFontColor(color: string): void;
381
382
  setFontSize(fontSize: number): void;
@@ -383,6 +384,11 @@ declare class Button extends Sprite {
383
384
  constructor(options?: ButtonOptions);
384
385
  }
385
386
 
387
+ declare class Watermark extends Text {
388
+ create(options?: TextOptions): this;
389
+ constructor(options?: TextOptions);
390
+ }
391
+
386
392
  interface ImageSpriteOptions extends SpriteOptions {
387
393
  src?: string;
388
394
  width: number;
@@ -408,6 +414,27 @@ declare class ImageSprite extends Sprite {
408
414
  constructor(options?: ImageSpriteOptions);
409
415
  }
410
416
 
417
+ interface RigidBodyOptions {
418
+ gravity: number;
419
+ drag: number;
420
+ bounceLoss: number;
421
+ vX: number;
422
+ vY: number;
423
+ update: () => void;
424
+ }
425
+
426
+ interface RigidCircleOptions extends CircleOptions, Partial<RigidBodyOptions> {
427
+ }
428
+ declare class RigidCircle extends Circle implements RigidBodyOptions {
429
+ gravity: number;
430
+ vX: number;
431
+ vY: number;
432
+ drag: number;
433
+ bounceLoss: number;
434
+ update(): void;
435
+ constructor(options?: RigidCircleOptions);
436
+ }
437
+
411
438
  type Mat2<T = number> = [
412
439
  [
413
440
  T,
@@ -476,7 +503,9 @@ declare const TScratch: {
476
503
  Pen: typeof Pen;
477
504
  Text: typeof Text;
478
505
  Button: typeof Button;
506
+ Watermark: typeof Watermark;
479
507
  ImageSprite: typeof ImageSprite;
508
+ RigidCircle: typeof RigidCircle;
480
509
  scale: number;
481
510
  aspectRatio: number;
482
511
  setScale: typeof setScale;
@@ -485,4 +514,4 @@ declare const TScratch: {
485
514
  ctx: CanvasRenderingContext2D;
486
515
  };
487
516
 
488
- 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, Sprite, type SpriteOptions, Square, type SquareOptions, Text, type TextOptions, type Vec2, type Vec3, type Vec4, aspectRatio, canvas, ctx, TScratch as default, scale, setAspectRatio, setScale };
517
+ 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 };
@@ -19,6 +19,7 @@ declare abstract class Sprite {
19
19
  scene: string;
20
20
  hidden: boolean;
21
21
  layer: number;
22
+ abstract discriminant: string;
22
23
  private cachedPath;
23
24
  private pathDirty;
24
25
  private static collisionCanvas;
@@ -63,21 +64,21 @@ type SceneMap = Map<string, {
63
64
  declare class Engine {
64
65
  private static instance;
65
66
  private loopRunning;
66
- gameLoop: GameLoop | null;
67
+ private gameLoop;
67
68
  maxFPS: number;
68
69
  deltaTime: number;
69
70
  private lastFrame;
70
71
  private refreshScheduled;
71
72
  private animationFrameId;
72
- sounds: HTMLAudioElement[];
73
+ private sounds;
73
74
  mouseX: number;
74
75
  mouseY: number;
75
76
  mouseDown: boolean;
76
77
  mouseClicked: boolean;
77
78
  private keysPressed;
78
- currentScene: string;
79
+ private currentScene;
79
80
  sceneMap: SceneMap;
80
- variableMap: Map<string, unknown>;
81
+ private variableMap;
81
82
  static init(): Engine;
82
83
  changeScene(scene: string): void;
83
84
  setLoop(scene: string, loop: GameLoop): void;
@@ -97,7 +98,7 @@ declare class Engine {
97
98
  stopSound(sound: HTMLAudioElement): void;
98
99
  stopAllSounds(): void;
99
100
  pickRandom(min: number, max: number): number;
100
- dotProduct(vectors: [Vec2, Vec2] | [Vec3, Vec3] | [Vec4, Vec4]): number;
101
+ dotProduct(...vectors: [Vec2, Vec2] | [Vec3, Vec3] | [Vec4, Vec4]): number;
101
102
  sin(deg: number): number;
102
103
  cos(deg: number): number;
103
104
  tan(deg: number): number;
@@ -319,7 +320,7 @@ declare class Pen extends Sprite {
319
320
  }
320
321
 
321
322
  interface TextOptions extends SpriteOptions {
322
- content?: string;
323
+ content?: string | number;
323
324
  color?: string;
324
325
  fontFamily?: string;
325
326
  fontSize?: number;
@@ -328,7 +329,7 @@ interface TextOptions extends SpriteOptions {
328
329
  }
329
330
  declare class Text extends Sprite {
330
331
  discriminant: string;
331
- content: string;
332
+ content: string | number;
332
333
  color: string;
333
334
  fontFamily: string;
334
335
  fontSize: number;
@@ -339,7 +340,7 @@ declare class Text extends Sprite {
339
340
  getPath(): Path2D;
340
341
  draw(stamping?: boolean): void;
341
342
  create(options?: TextOptions): this;
342
- setContent(content: string): void;
343
+ setContent(content: string | number): void;
343
344
  setColor(color: string): void;
344
345
  setFontSize(fontSize: number): void;
345
346
  setFontFamily(fontFamily: string): void;
@@ -349,7 +350,7 @@ declare class Text extends Sprite {
349
350
  }
350
351
 
351
352
  interface ButtonOptions extends SpriteOptions {
352
- content?: string;
353
+ content?: string | number;
353
354
  fontColor?: string;
354
355
  fontFamily?: string;
355
356
  fontSize?: number;
@@ -361,7 +362,7 @@ interface ButtonOptions extends SpriteOptions {
361
362
  }
362
363
  declare class Button extends Sprite {
363
364
  discriminant: string;
364
- content: string;
365
+ content: string | number;
365
366
  fontColor: string;
366
367
  fontFamily: string;
367
368
  fontSize: number;
@@ -375,7 +376,7 @@ declare class Button extends Sprite {
375
376
  getPath(): Path2D;
376
377
  draw(stamping?: boolean): void;
377
378
  create(options?: ButtonOptions): this;
378
- setContent(content: string): void;
379
+ setContent(content: string | number): void;
379
380
  setBackgroundColor(color: string): void;
380
381
  setFontColor(color: string): void;
381
382
  setFontSize(fontSize: number): void;
@@ -383,6 +384,11 @@ declare class Button extends Sprite {
383
384
  constructor(options?: ButtonOptions);
384
385
  }
385
386
 
387
+ declare class Watermark extends Text {
388
+ create(options?: TextOptions): this;
389
+ constructor(options?: TextOptions);
390
+ }
391
+
386
392
  interface ImageSpriteOptions extends SpriteOptions {
387
393
  src?: string;
388
394
  width: number;
@@ -408,6 +414,27 @@ declare class ImageSprite extends Sprite {
408
414
  constructor(options?: ImageSpriteOptions);
409
415
  }
410
416
 
417
+ interface RigidBodyOptions {
418
+ gravity: number;
419
+ drag: number;
420
+ bounceLoss: number;
421
+ vX: number;
422
+ vY: number;
423
+ update: () => void;
424
+ }
425
+
426
+ interface RigidCircleOptions extends CircleOptions, Partial<RigidBodyOptions> {
427
+ }
428
+ declare class RigidCircle extends Circle implements RigidBodyOptions {
429
+ gravity: number;
430
+ vX: number;
431
+ vY: number;
432
+ drag: number;
433
+ bounceLoss: number;
434
+ update(): void;
435
+ constructor(options?: RigidCircleOptions);
436
+ }
437
+
411
438
  type Mat2<T = number> = [
412
439
  [
413
440
  T,
@@ -476,7 +503,9 @@ declare const TScratch: {
476
503
  Pen: typeof Pen;
477
504
  Text: typeof Text;
478
505
  Button: typeof Button;
506
+ Watermark: typeof Watermark;
479
507
  ImageSprite: typeof ImageSprite;
508
+ RigidCircle: typeof RigidCircle;
480
509
  scale: number;
481
510
  aspectRatio: number;
482
511
  setScale: typeof setScale;
@@ -485,4 +514,4 @@ declare const TScratch: {
485
514
  ctx: CanvasRenderingContext2D;
486
515
  };
487
516
 
488
- 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, Sprite, type SpriteOptions, Square, type SquareOptions, Text, type TextOptions, type Vec2, type Vec3, type Vec4, aspectRatio, canvas, ctx, TScratch as default, scale, setAspectRatio, setScale };
517
+ 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 };
@@ -1,2 +1,2 @@
1
- var s=document.getElementById("game-window")||document.createElement("canvas"),o=s.getContext("2d"),u=document.createElement("canvas"),a=u.getContext("2d");u.id="pen-canvas";var y=16/9,m;function I(){s.width=y*m,s.height=m,u.width=y*m,u.height=m}function z(n){m=n,I()}function V(n){y=n,I()}s.parentElement?.insertBefore(u,s);z(500);var l=class n{x=0;y=0;dir=0;scene="main";hidden=!1;layer=0;cachedPath=null;pathDirty=!0;static collisionCanvas=null;static collisionCtx=null;refresh(){d.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),d.init().addSprite(this)}clone(t){return this.create({x:this.x,y:this.y,dir:this.dir,scene:this.scene,layer:this.layer,hidden:this.hidden,...t})}touching(t){if(this.hidden||t.hidden)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 h=i.x-i.width/2,b=i.y+i.height/2,f=i.x+i.width/2,x=i.y-i.height/2,L=e.x-e.width/2,D=e.y+e.height/2,E=e.x+e.width/2,$=e.y-e.height/2,X=Math.max(h,L),Y=Math.min(x,$),q=Math.min(f,E),H=Math.max(b,D),g=q-X,p=H-Y;if(g<=1||p<=1)return!1;n.collisionCanvas||(n.collisionCanvas=document.createElement("canvas"),n.collisionCtx=n.collisionCanvas.getContext("2d",{willReadFrequently:!0})),(n.collisionCanvas.width<g||n.collisionCanvas.height<p)&&(n.collisionCanvas.width=Math.max(g,n.collisionCanvas.width),n.collisionCanvas.height=Math.max(p,n.collisionCanvas.height));let c=n.collisionCtx;c.clearRect(0,0,g,p),c.save(),c.translate(this.x-X,p-this.y+Y),c.rotate(this.toRadians(this.dir)),c.fillStyle="red",c.fill(this.getCachedPath()),c.restore();let A=c.getImageData(0,0,g,p).data;c.clearRect(0,0,g,p),c.save(),c.translate(t.x-X,p-t.y+Y),c.rotate(this.toRadians(t.dir)),c.fillStyle="blue",c.fill(t.getCachedPath()),c.restore();let G=c.getImageData(0,0,g,p).data;for(let T=3;T<A.length;T+=4)if(A[T]>0&&G[T]>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()}goToLayer(t){this.layer=t,this.refresh()}changeLayer(t){this.layer+=t,this.refresh()}};var d=class n{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 n),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 r=this.sceneMap.get(i).sprites.findIndex(h=>h.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 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,r=0,h=async b=>{if(!this.loopRunning)return;let f=b-this.lastFrame;this.lastFrame=b,r+=f,r>=e&&(this.deltaTime=r/1e3,r=r%e,i&&await i()),this.animationFrameId=requestAnimationFrame(h)};this.lastFrame=performance.now(),this.animationFrameId=requestAnimationFrame(h)}refresh(){this.refreshScheduled||(this.refreshScheduled=!0,requestAnimationFrame(()=>{this.refreshScheduled=!1,o.clearRect(0,0,s.width,s.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+s.width/2,h=s.height/2-e,b=r-(t.x+s.width/2),f=h-(s.height/2-t.y),x=-this.toRadians(t.dir),L=b*Math.cos(x)-f*Math.sin(x),D=b*Math.sin(x)+f*Math.cos(x);return o.isPointInPath(t.getCachedPath(),L,D)}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:[]}),u.addEventListener("mousemove",t=>{this.mouseX=t.clientX-u.offsetLeft-u.width/2,this.mouseY=-(t.clientY-u.offsetTop-u.height/2)}),u.addEventListener("mousedown",()=>{this.mouseDown=!0}),u.addEventListener("mouseup",()=>{this.mouseDown=!1}),u.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 U}from"socket.io-client";var w=class n{static instance;socket;static connect(t="http://localhost:3000"){return this.instance||(this.instance=new n(t)),this.instance}disconnect(){this.socket.disconnect()}constructor(t){this.socket=U(t)}broadcast(t,i){this.socket.emit(t,i)}on(t,i){this.socket.on(t,i)}};var v=class n extends l{discriminant="rectangle";width;height;color;outlineColor;outlineWidth;getBoundingBox(){return{x:this.x,y:this.y,width:Math.hypot(this.width,this.height),height:Math.hypot(this.width,this.height)}}getPath(){let t=new Path2D;return t.rect(-this.width/2,-this.height/2,this.width,this.height),t}draw(t){let i=t?a:o;i.save();let e=this.x+s.width/2,r=-this.y+s.height/2;i.translate(e,r),i.rotate(this.toRadians(this.dir));let h=this.getCachedPath();i.fillStyle=this.color,i.strokeStyle=this.outlineColor,i.lineWidth=this.outlineWidth,i.fill(h),this.outlineWidth&&i.stroke(h),i.restore()}create(t){return new n(t)}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 S=class n extends l{discriminant="square";sideLength;color;outlineColor;outlineWidth;getBoundingBox(){return{x:this.x,y:this.y,width:Math.hypot(this.sideLength,this.sideLength),height:Math.hypot(this.sideLength,this.sideLength)}}getPath(){let t=new Path2D;return t.rect(-this.sideLength/2,-this.sideLength/2,this.sideLength,this.sideLength),t}draw(t){let i=t?a:o;i.save();let e=this.x+s.width/2,r=-this.y+s.height/2;i.translate(e,r),i.rotate(this.toRadians(this.dir));let h=this.getCachedPath();i.fillStyle=this.color,i.strokeStyle=this.outlineColor,i.lineWidth=this.outlineWidth,i.fill(h),this.outlineWidth&&i.stroke(h),i.restore()}create(t){return new n(t)}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 C=class n extends l{discriminant="oval";radX;radY;color;outlineColor;outlineWidth;getBoundingBox(){return{x:this.x,y:this.y,width:Math.hypot(this.radX*2,this.radY*2),height:Math.hypot(this.radX*2,this.radY*2)}}getPath(){let t=new Path2D;return t.ellipse(0,0,this.radX,this.radY,0,0,Math.PI*2),t}draw(t){let i=t?a:o;i.save();let e=this.x+s.width/2,r=-this.y+s.height/2;i.translate(e,r),i.rotate(this.toRadians(this.dir));let h=this.getCachedPath();i.fillStyle=this.color,i.strokeStyle=this.outlineColor,i.lineWidth=this.outlineWidth,i.fill(h),this.outlineWidth&&i.stroke(h),i.restore()}create(t){return new n(t)}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 P=class n extends l{discriminant="circle";radius;color;outlineColor;outlineWidth;getBoundingBox(){return{x:this.x,y:this.y,width:this.radius*2,height:this.radius*2}}getPath(){let t=new Path2D;return t.ellipse(0,0,this.radius,this.radius,0,0,Math.PI*2),t}draw(t){let i=t?a:o;i.save();let e=this.x+s.width/2,r=-this.y+s.height/2;i.translate(e,r),i.rotate(this.toRadians(this.dir));let h=this.getCachedPath();i.fillStyle=this.color,i.strokeStyle=this.outlineColor,i.lineWidth=this.outlineWidth,i.fill(h),this.outlineWidth&&i.stroke(h),i.restore()}create(t){return new n(t)}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 B=class n extends l{discriminant="arc";radius;angle;color;outlineColor;outlineWidth;getBoundingBox(){return{x:this.x,y:this.y,width:this.radius*2,height:this.radius*2}}getPath(){let t=new Path2D;return t.arc(0,0,this.radius,this.toRadians(this.angle/2-90),this.toRadians(-this.angle/2-90)),t}draw(t){let i=t?a:o;i.save();let e=this.x+s.width/2,r=-this.y+s.height/2;i.translate(e,r),i.rotate(this.toRadians(this.dir));let h=this.getCachedPath();i.fillStyle=this.color,i.strokeStyle=this.outlineColor,i.lineWidth=this.outlineWidth,i.fill(h),this.outlineWidth&&i.stroke(h),i.restore()}create(t){return new n(t)}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 M=class n extends l{discriminant="regularpolygon";sides;radius;color;outlineColor;outlineWidth;getBoundingBox(){return{x:this.x,y:this.y,width:this.radius*2,height:this.radius*2}}getPath(){let t=new Path2D,i=2*Math.PI/this.sides;t.moveTo(this.radius,0);for(let e=1;e<this.sides;e++)t.lineTo(this.radius*Math.cos(i*e),this.radius*Math.sin(i*e));return t.closePath(),t}draw(t){let i=t?a:o;i.save();let e=this.x+s.width/2,r=-this.y+s.height/2;i.translate(e,r),i.rotate(this.toRadians(this.dir));let h=this.getCachedPath();i.fillStyle=this.color,i.strokeStyle=this.outlineColor,i.lineWidth=this.outlineWidth,i.fill(h),this.outlineWidth&&i.stroke(h),i.restore()}create(t){return new n(t)}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 O=class n extends l{discriminant="custompolygon";vertices;color;outlineColor;outlineWidth;getBoundingBox(){let t=0;for(let i of this.vertices){let e=Math.hypot(i[0],i[1]);e>t&&(t=e)}return{x:this.x,y:this.y,width:t,height:t}}getPath(){let t=new Path2D,i=this.vertices;if(i.length<2)return t;t.moveTo(i[0][0],i[0][1]);for(let e=1;e<i.length;e++)t.lineTo(i[e][0],i[e][1]);return t.closePath(),t}draw(t){let i=t?a:o;i.save();let e=this.x+s.width/2,r=-this.y+s.height/2;i.translate(e,r),i.rotate(this.toRadians(this.dir));let h=this.getCachedPath();i.fillStyle=this.color,i.strokeStyle=this.outlineColor,i.lineWidth=this.outlineWidth,i.fill(h),this.outlineWidth&&i.stroke(h),i.restore()}create(t){return new n(t)}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 n extends l{discriminant="pen";drawing;size;color;getBoundingBox(){return{x:this.x,y:this.y,width:this.size,height:this.size}}getPath(){return new Path2D}draw(){}create(t){return new n(t)}up(){this.drawing=!1}down(){this.drawing=!0}stamp(t){t.draw(!0)}eraseAll(){a.clearRect(0,0,s.width,s.height)}dot(){a.fillStyle=this.color,a.fillRect(this.x-this.size/2+s.width/2,-this.y-this.size/2+s.height/2,this.size,this.size)}drawLine(t,i){a.beginPath(),a.moveTo(t+s.width/2,-i+s.height/2),a.lineTo(this.x+s.width/2,-this.y+s.height/2),a.lineWidth=this.size,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,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.size=t?.size??5,this.color=t?.color??"black"}};var W=class n extends l{discriminant="text";content;color;fontFamily;fontSize;align;baseline;font;getBoundingBox(){let t=o.measureText(this.content),i=t.width,e=t.actualBoundingBoxAscent+t.actualBoundingBoxDescent;return{x:this.x,y:this.y,width:i,height:e}}getPath(){let t=new Path2D;o.save(),o.font=this.font;let i=o.measureText(this.content),e=i.width,r=i.actualBoundingBoxAscent+i.actualBoundingBoxDescent;return o.restore(),t.rect(-e/2,-r/2,e,r),t}draw(t){let i=t?a:o;i.save();let e=this.x+s.width/2,r=-this.y+s.height/2;i.translate(e,r),i.rotate(this.toRadians(this.dir)),i.font=this.font,i.fillStyle=this.color,i.textAlign=this.align,i.textBaseline=this.baseline,i.fillText(this.content,0,0),i.restore()}create(t){return new n(t)}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.invalidatePath(),this.refresh()}setBaseline(t){this.baseline=t,this.invalidatePath(),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 R=class n extends l{discriminant="button";content;fontColor;fontFamily;fontSize;font;width;height;backgroundColor;outlineColor;outlineWidth;getBoundingBox(){o.save(),o.font=this.font;let t=o.measureText(this.content),i=Math.max(t.width,this.width),e=Math.max(t.actualBoundingBoxAscent+t.actualBoundingBoxDescent,this.width);return o.restore(),{x:this.x,y:this.y,width:Math.hypot(i,e),height:Math.hypot(i,e)}}getPath(){let t=new Path2D;return t.rect(-this.width/2,-this.height/2,this.width,this.height),t}draw(t){let i=t?a:o;i.save();let e=this.x+s.width/2,r=-this.y+s.height/2;i.translate(e,r),i.rotate(this.toRadians(this.dir)),i.fillStyle=this.backgroundColor,i.strokeStyle=this.outlineColor,i.lineWidth=this.outlineWidth;let h=this.getCachedPath();i.fill(h),this.outlineWidth&&i.stroke(h),i.font=this.font,i.fillStyle=this.fontColor,i.textAlign="center",i.textBaseline="middle",i.fillText(this.content,0,0),i.restore()}create(t){return new n(t)}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??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 F=class n extends l{discriminant="imagesprite";src;width;height;outlineColor;outlineWidth;img;getBoundingBox(){return{x:this.x,y:this.y,width:this.width,height:this.height}}getPath(){let t=new Path2D;return t.rect(-this.width/2,-this.height/2,this.width,this.height),t}draw(t){let i=t?a:o;i.save();let e=this.x+s.width/2,r=-this.y+s.height/2;i.translate(e,r),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 n(t)}setSrc(t){this.src=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.src=t?.src??"",this.img=new Image,this.img.src=this.src,this.width=t?.width??this.img.width,this.height=t?.height??this.img.height,this.outlineColor=t?.outlineColor??"black",this.outlineWidth=t?.outlineWidth??0,this.draw()}};var j={Engine:d,Sprite:l,Multiplayer:w,Rectangle:v,Square:S,Oval:C,Circle:P,Arc:B,RegularPolygon:M,CustomPolygon:O,Pen:k,Text:W,Button:R,ImageSprite:F,scale:m,aspectRatio:y,setScale:z,setAspectRatio:V,canvas:s,ctx:o},Zt=j;export{B as Arc,R as Button,P as Circle,O as CustomPolygon,d as Engine,F as ImageSprite,w as Multiplayer,C as Oval,k as Pen,v as Rectangle,M as RegularPolygon,l as Sprite,S as Square,W as Text,y as aspectRatio,s as canvas,o as ctx,Zt as default,m as scale,V as setAspectRatio,z as setScale};
1
+ var n=document.getElementById("game-window")||document.createElement("canvas"),h=n.getContext("2d"),m=document.createElement("canvas"),c=m.getContext("2d");m.id="pen-canvas";var O=16/9,P;function G(){n.width=O*P,n.height=P,m.width=O*P,m.height=P}function $(o){P=o,G()}function U(o){O=o,G()}n.parentElement?.insertBefore(m,n);$(500);var l=class o{x=0;y=0;dir=0;scene="main";hidden=!1;layer=0;cachedPath=null;pathDirty=!0;static collisionCanvas=null;static collisionCtx=null;refresh(){d.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),d.init().addSprite(this)}clone(t){return this.create({x:this.x,y:this.y,dir:this.dir,scene:this.scene,layer:this.layer,hidden:this.hidden,...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 r=i.x-i.width/2,a=i.y+i.height/2,p=i.x+i.width/2,u=i.y-i.height/2,g=e.x-e.width/2,f=e.y+e.height/2,x=e.x+e.width/2,y=e.y-e.height/2,S=Math.max(r,g),C=Math.min(u,y),E=Math.min(p,x),V=Math.max(a,f),v=E-S,w=V-C;if(v<=1||w<=1)return!1;o.collisionCanvas||(o.collisionCanvas=document.createElement("canvas"),o.collisionCtx=o.collisionCanvas.getContext("2d",{willReadFrequently:!0})),(o.collisionCanvas.width<v||o.collisionCanvas.height<w)&&(o.collisionCanvas.width=Math.max(v,o.collisionCanvas.width),o.collisionCanvas.height=Math.max(w,o.collisionCanvas.height));let b=o.collisionCtx;b.clearRect(0,0,v,w),b.save(),b.translate(this.x-S,w-this.y+C),b.rotate(this.toRadians(this.dir)),b.fillStyle="red",b.fill(this.getCachedPath()),b.restore();let q=b.getImageData(0,0,v,w).data;b.clearRect(0,0,v,w),b.save(),b.translate(t.x-S,w-t.y+C),b.rotate(this.toRadians(t.dir)),b.fillStyle="blue",b.fill(t.getCachedPath()),b.restore();let j=b.getImageData(0,0,v,w).data;for(let H=3;H<q.length;H+=4)if(q[H]>0&&j[H]>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()}goToLayer(t){this.layer=t,this.refresh()}changeLayer(t){this.layer+=t,this.refresh()}};var d=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(r=>r.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,r=async a=>{if(!this.loopRunning)return;let p=a-this.lastFrame;this.lastFrame=a,s+=p,s>=e&&(this.deltaTime=s/1e3,s=s%e,i&&await i()),this.animationFrameId=requestAnimationFrame(r)};this.lastFrame=performance.now(),this.animationFrameId=requestAnimationFrame(r)}refresh(){this.refreshScheduled||(this.refreshScheduled=!0,requestAnimationFrame(()=>{this.refreshScheduled=!1,h.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,s=i+n.width/2,r=n.height/2-e,a=s-(t.x+n.width/2),p=r-(n.height/2-t.y),u=-this.toRadians(t.dir),g=a*Math.cos(u)-p*Math.sin(u),f=a*Math.sin(u)+p*Math.cos(u);return h.isPointInPath(t.getCachedPath(),g,f)}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:[]}),m.addEventListener("mousemove",t=>{this.mouseX=t.clientX-m.offsetLeft-m.width/2,this.mouseY=-(t.clientY-m.offsetTop-m.height/2)}),m.addEventListener("mousedown",()=>{this.mouseDown=!0}),m.addEventListener("mouseup",()=>{this.mouseDown=!1}),m.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 J}from"socket.io-client";var k=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=J(t)}broadcast(t,i){this.socket.emit(t,i)}on(t,i){this.socket.on(t,i)}};var R=class o extends l{discriminant="rectangle";width;height;color;outlineColor;outlineWidth;getBoundingBox(){let t=d.init(),i=this.width,e=this.height,s=this.dir,r=Math.abs(t.cos(s)),a=Math.abs(t.sin(s)),p=i*r+e*a,u=i*a+e*r;return{x:this.x,y:this.y,width:p,height:u}}getPath(){let t=new Path2D;return t.rect(-this.width/2,-this.height/2,this.width,this.height),t}draw(t){let i=t?c:h;i.save();let e=this.x+n.width/2,s=-this.y+n.height/2;i.translate(e,s),i.rotate(this.toRadians(this.dir));let r=this.getCachedPath();i.fillStyle=this.color,i.strokeStyle=this.outlineColor,i.lineWidth=this.outlineWidth,i.fill(r),this.outlineWidth&&i.stroke(r),i.restore()}create(t){return new o(t)}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 W=class o extends l{discriminant="square";sideLength;color;outlineColor;outlineWidth;getBoundingBox(){let t=d.init(),i=this.sideLength,e=this.dir,s=Math.abs(t.cos(e)),r=Math.abs(t.sin(e)),a=i*s+i*r;return{x:this.x,y:this.y,width:a,height:a}}getPath(){let t=new Path2D;return t.rect(-this.sideLength/2,-this.sideLength/2,this.sideLength,this.sideLength),t}draw(t){let i=t?c:h;i.save();let e=this.x+n.width/2,s=-this.y+n.height/2;i.translate(e,s),i.rotate(this.toRadians(this.dir));let r=this.getCachedPath();i.fillStyle=this.color,i.strokeStyle=this.outlineColor,i.lineWidth=this.outlineWidth,i.fill(r),this.outlineWidth&&i.stroke(r),i.restore()}create(t){return new o(t)}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 l{discriminant="oval";radX;radY;color;outlineColor;outlineWidth;getBoundingBox(){let t=d.init(),i=this.radX,e=this.radY,s=this.dir,r=Math.abs(t.cos(s)),a=Math.abs(t.sin(s)),p=i*r+e*a,u=i*a+e*r;return{x:this.x,y:this.y,width:p,height:u}}getPath(){let t=new Path2D;return t.ellipse(0,0,this.radX,this.radY,0,0,Math.PI*2),t}draw(t){let i=t?c:h;i.save();let e=this.x+n.width/2,s=-this.y+n.height/2;i.translate(e,s),i.rotate(this.toRadians(this.dir));let r=this.getCachedPath();i.fillStyle=this.color,i.strokeStyle=this.outlineColor,i.lineWidth=this.outlineWidth,i.fill(r),this.outlineWidth&&i.stroke(r),i.restore()}create(t){return new o(t)}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 M=class o extends l{discriminant="circle";radius;color;outlineColor;outlineWidth;getBoundingBox(){return{x:this.x,y:this.y,width:this.radius*2,height:this.radius*2}}getPath(){let t=new Path2D;return t.ellipse(0,0,this.radius,this.radius,0,0,Math.PI*2),t}draw(t){let i=t?c:h;i.save();let e=this.x+n.width/2,s=-this.y+n.height/2;i.translate(e,s),i.rotate(this.toRadians(this.dir));let r=this.getCachedPath();i.fillStyle=this.color,i.strokeStyle=this.outlineColor,i.lineWidth=this.outlineWidth,i.fill(r),this.outlineWidth&&i.stroke(r),i.restore()}create(t){return new o(t)}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 Y=class o extends l{discriminant="arc";radius;angle;color;outlineColor;outlineWidth;getBoundingBox(){return{x:this.x,y:this.y,width:this.radius*2,height:this.radius*2}}getPath(){let t=new Path2D;return t.arc(0,0,this.radius,this.toRadians(this.angle/2-90),this.toRadians(-this.angle/2-90)),t}draw(t){let i=t?c:h;i.save();let e=this.x+n.width/2,s=-this.y+n.height/2;i.translate(e,s),i.rotate(this.toRadians(this.dir));let r=this.getCachedPath();i.fillStyle=this.color,i.strokeStyle=this.outlineColor,i.lineWidth=this.outlineWidth,i.fill(r),this.outlineWidth&&i.stroke(r),i.restore()}create(t){return new o(t)}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 L=class o extends l{discriminant="regularpolygon";sides;radius;color;outlineColor;outlineWidth;getBoundingBox(){return{x:this.x,y:this.y,width:this.radius*2,height:this.radius*2}}getPath(){let t=new Path2D,i=2*Math.PI/this.sides;t.moveTo(this.radius,0);for(let e=1;e<this.sides;e++)t.lineTo(this.radius*Math.cos(i*e),this.radius*Math.sin(i*e));return t.closePath(),t}draw(t){let i=t?c:h;i.save();let e=this.x+n.width/2,s=-this.y+n.height/2;i.translate(e,s),i.rotate(this.toRadians(this.dir));let r=this.getCachedPath();i.fillStyle=this.color,i.strokeStyle=this.outlineColor,i.lineWidth=this.outlineWidth,i.fill(r),this.outlineWidth&&i.stroke(r),i.restore()}create(t){return new o(t)}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 X=class o extends l{discriminant="custompolygon";vertices;color;outlineColor;outlineWidth;getBoundingBox(){let t=d.init(),i=t.cos(this.dir),e=t.sin(this.dir),s=1/0,r=-1/0,a=1/0,p=-1/0;for(let u of this.vertices){let g=u[0]*i-u[1]*e,f=u[0]*e+u[1]*i,x=this.x+g,y=this.y+f;x<s&&(s=x),x>r&&(r=x),y<a&&(a=y),y>p&&(p=y)}return{x:s,y:a,width:r-s,height:p-a}}getPath(){let t=new Path2D,i=this.vertices;if(i.length<2)return t;t.moveTo(i[0][0],i[0][1]);for(let e=1;e<i.length;e++)t.lineTo(i[e][0],i[e][1]);return t.closePath(),t}draw(t){let i=t?c:h;i.save();let e=this.x+n.width/2,s=-this.y+n.height/2;i.translate(e,s),i.rotate(this.toRadians(this.dir));let r=this.getCachedPath();i.fillStyle=this.color,i.strokeStyle=this.outlineColor,i.lineWidth=this.outlineWidth,i.fill(r),this.outlineWidth&&i.stroke(r),i.restore()}create(t){return new o(t)}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 F=class o extends l{discriminant="pen";drawing;size;color;getBoundingBox(){return{x:this.x,y:this.y,width:this.size,height:this.size}}getPath(){return new Path2D}draw(){}create(t){return new o(t)}up(){this.drawing=!1}down(){this.drawing=!0}stamp(t){t.draw(!0)}eraseAll(){c.clearRect(0,0,n.width,n.height)}dot(){c.fillStyle=this.color,c.fillRect(this.x-this.size/2+n.width/2,-this.y-this.size/2+n.height/2,this.size,this.size)}drawLine(t,i){c.beginPath(),c.moveTo(t+n.width/2,-i+n.height/2),c.lineTo(this.x+n.width/2,-this.y+n.height/2),c.lineWidth=this.size,c.strokeStyle=this.color,c.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.size=t?.size??5,this.color=t?.color??"black"}};var B=class o extends l{discriminant="text";content;color;fontFamily;fontSize;align;baseline;font;getBoundingBox(){let t=d.init(),i=h.measureText(String(this.content)),e=i.width,s=i.actualBoundingBoxAscent+i.actualBoundingBoxDescent,r=this.dir,a=Math.abs(t.cos(r)),p=Math.abs(t.sin(r)),u=e*a+s*p,g=e*p+s*a;return{x:this.x,y:this.y,width:u,height:g}}getPath(){let t=new Path2D;h.save(),h.font=this.font;let i=h.measureText(String(this.content)),e=i.width,s=i.actualBoundingBoxAscent+i.actualBoundingBoxDescent;return h.restore(),t.rect(-e/2,-s/2,e,s),t}draw(t){let i=t?c:h;i.save();let e=this.x+n.width/2,s=-this.y+n.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)}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.invalidatePath(),this.refresh()}setBaseline(t){this.baseline=t,this.invalidatePath(),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 D=class o extends l{discriminant="button";content;fontColor;fontFamily;fontSize;font;width;height;backgroundColor;outlineColor;outlineWidth;getBoundingBox(){let t=d.init();h.save(),h.font=this.font;let i=h.measureText(String(this.content)),e=Math.max(i.width,this.width),s=Math.max(i.actualBoundingBoxAscent+i.actualBoundingBoxDescent,this.height);h.restore();let r=this.dir,a=Math.abs(t.cos(r)),p=Math.abs(t.sin(r)),u=e*a+s*p,g=e*p+s*a;return{x:this.x,y:this.y,width:u,height:g}}getPath(){let t=new Path2D;return t.rect(-this.width/2,-this.height/2,this.width,this.height),t}draw(t){let i=t?c:h;i.save();let e=this.x+n.width/2,s=-this.y+n.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 r=this.getCachedPath();i.fill(r),this.outlineWidth&&i.stroke(r),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)}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 I=class o extends B{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 z=class o extends l{discriminant="imagesprite";src;width;height;outlineColor;outlineWidth;img;getBoundingBox(){let t=d.init(),i=this.width,e=this.height,s=this.dir,r=Math.abs(t.cos(s)),a=Math.abs(t.sin(s)),p=i*r+e*a,u=i*a+e*r;return{x:this.x,y:this.y,width:p,height:u}}getPath(){let t=new Path2D;return t.rect(-this.width/2,-this.height/2,this.width,this.height),t}draw(t){let i=t?c:h;i.save();let e=this.x+n.width/2,s=-this.y+n.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)}setSrc(t){this.src=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.src=t?.src??"",this.img=new Image,this.img.src=this.src,this.width=t?.width??this.img.width,this.height=t?.height??this.img.height,this.outlineColor=t?.outlineColor??"black",this.outlineWidth=t?.outlineWidth??0,this.draw()}};var A=class extends M{gravity;vX;vY;drag;bounceLoss;update(){let t=d.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(f=>f.discriminant==="circle"),r=t.sceneMap.get("*").sprites.filter(f=>f.discriminant==="circle"),a=[...s,...r],p=Math.ceil(this.distanceTo(i,e)/(2*this.radius));for(let f=0;f<p;f++)for(let x of a)if(this.distanceTo(x.x,x.y)<this.radius+x.radius){let y=this.x-x.x,S=this.y-x.y,C=Math.sqrt(y*y+S*S);if(C===0)continue;let E=y/C,V=S/C,v=this.vX*E+this.vY*V;this.vX=(this.vX-2*v*E)*this.bounceLoss,this.vY=(this.vY-2*v*V)*this.bounceLoss,this.changeX(this.vX),this.changeY(this.vY);return}this.goTo(i,e);let u=n.width/2,g=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<-g?(this.setY(-g+this.radius),this.vY=Math.abs(this.vY)*this.bounceLoss):this.y+this.radius>g&&(this.setY(g-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 K={Engine:d,Sprite:l,Multiplayer:k,Rectangle:R,Square:W,Oval:T,Circle:M,Arc:Y,RegularPolygon:L,CustomPolygon:X,Pen:F,Text:B,Button:D,Watermark:I,ImageSprite:z,RigidCircle:A,scale:P,aspectRatio:O,setScale:$,setAspectRatio:U,canvas:n,ctx:h},vi=K;export{Y as Arc,D as Button,M as Circle,X as CustomPolygon,d as Engine,z as ImageSprite,k as Multiplayer,T as Oval,F as Pen,R as Rectangle,L as RegularPolygon,A as RigidCircle,l as Sprite,W as Square,B as Text,I as Watermark,O as aspectRatio,n as canvas,h as ctx,vi as default,P as scale,U as setAspectRatio,$ as setScale};
2
2
  //# sourceMappingURL=index.js.map