tscratch 0.6.7 → 0.6.8

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,2 +1,2 @@
1
- "use strict";var q=Object.defineProperty;var N=Object.getOwnPropertyDescriptor;var Q=Object.getOwnPropertyNames;var Z=Object.prototype.hasOwnProperty;var _=(o,t)=>{for(var i in t)q(o,i,{get:t[i],enumerable:!0})},tt=(o,t,i,e)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of Q(t))!Z.call(o,s)&&s!==i&&q(o,s,{get:()=>t[s],enumerable:!(e=N(t,s))||e.enumerable});return o};var it=o=>tt(q({},"__esModule",{value:!0}),o);var nt={};_(nt,{Arc:()=>Y,Button:()=>D,Circle:()=>C,CustomPolygon:()=>X,Engine:()=>p,ImageSprite:()=>z,Multiplayer:()=>k,Oval:()=>T,Pen:()=>F,Rectangle:()=>R,RegularPolygon:()=>L,RigidCircle:()=>A,Sprite:()=>l,Square:()=>W,Text:()=>P,Watermark:()=>I,aspectRatio:()=>O,canvas:()=>n,ctx:()=>h,default:()=>st,scale:()=>S,setAspectRatio:()=>G,setScale:()=>$});module.exports=it(nt);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,S;function j(){n.width=O*S,n.height=S,m.width=O*S,m.height=S}function $(o){S=o,j()}function G(o){O=o,j()}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(){p.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),p.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,d=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,M=Math.max(r,g),B=Math.min(u,y),E=Math.min(d,x),V=Math.max(a,f),v=E-M,w=V-B;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-M,w-this.y+B),b.rotate(this.toRadians(this.dir)),b.fillStyle="red",b.fill(this.getCachedPath()),b.restore();let U=b.getImageData(0,0,v,w).data;b.clearRect(0,0,v,w),b.save(),b.translate(t.x-M,w-t.y+B),b.rotate(this.toRadians(t.dir)),b.fillStyle="blue",b.fill(t.getCachedPath()),b.restore();let K=b.getImageData(0,0,v,w).data;for(let H=3;H<U.length;H+=4)if(U[H]>0&&K[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 p=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 d=a-this.lastFrame;this.lastFrame=a,s+=d,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),d=r-(n.height/2-t.y),u=-this.toRadians(t.dir),g=a*Math.cos(u)-d*Math.sin(u),f=a*Math.sin(u)+d*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)})}};var J=require("socket.io-client"),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=(0,J.io)(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=p.init(),i=this.width,e=this.height,s=this.dir,r=Math.abs(t.cos(s)),a=Math.abs(t.sin(s)),d=i*r+e*a,u=i*a+e*r;return{x:this.x,y:this.y,width:d,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=p.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=p.init(),i=this.radX,e=this.radY,s=this.dir,r=Math.abs(t.cos(s)),a=Math.abs(t.sin(s)),d=i*r+e*a,u=i*a+e*r;return{x:this.x,y:this.y,width:d,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 C=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=p.init(),i=t.cos(this.dir),e=t.sin(this.dir),s=1/0,r=-1/0,a=1/0,d=-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>d&&(d=y)}return{x:s,y:a,width:r-s,height:d-a}}getPath(){let t=new Path2D,i=this.vertices;if(i.length<2)return t;t.moveTo(i[0][0]+n.width/2,n.height/2-i[0][1]);for(let e=1;e<i.length;e++)t.lineTo(i[e][0]+n.width/2,n.height/2-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 P=class o extends l{discriminant="text";content;color;fontFamily;fontSize;align;baseline;font;getBoundingBox(){let t=p.init(),i=h.measureText(String(this.content)),e=i.width,s=i.actualBoundingBoxAscent+i.actualBoundingBoxDescent,r=this.dir,a=Math.abs(t.cos(r)),d=Math.abs(t.sin(r)),u=e*a+s*d,g=e*d+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=p.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)),d=Math.abs(t.sin(r)),u=e*a+s*d,g=e*d+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 P{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=p.init(),i=this.width,e=this.height,s=this.dir,r=Math.abs(t.cos(s)),a=Math.abs(t.sin(s)),d=i*r+e*a,u=i*a+e*r;return{x:this.x,y:this.y,width:d,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.img.onload=()=>this.draw()}};var A=class extends C{gravity;vX;vY;drag;bounceLoss;update(){let t=p.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],d=Math.ceil(this.distanceTo(i,e)/(2*this.radius));for(let f=0;f<d;f++)for(let x of a)if(this.distanceTo(x.x,x.y)<this.radius+x.radius){let y=this.x-x.x,M=this.y-x.y,B=Math.sqrt(y*y+M*M);if(B===0)continue;let E=y/B,V=M/B,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 et={Engine:p,Sprite:l,Multiplayer:k,Rectangle:R,Square:W,Oval:T,Circle:C,Arc:Y,RegularPolygon:L,CustomPolygon:X,Pen:F,Text:P,Button:D,Watermark:I,ImageSprite:z,RigidCircle:A,scale:S,aspectRatio:O,setScale:$,setAspectRatio:G,canvas:n,ctx:h},st=et;0&&(module.exports={Arc,Button,Circle,CustomPolygon,Engine,ImageSprite,Multiplayer,Oval,Pen,Rectangle,RegularPolygon,RigidCircle,Sprite,Square,Text,Watermark,aspectRatio,canvas,ctx,scale,setAspectRatio,setScale});
1
+ "use strict";var H=Object.defineProperty;var tt=Object.getOwnPropertyDescriptor;var it=Object.getOwnPropertyNames;var et=Object.prototype.hasOwnProperty;var st=(o,t)=>{for(var i in t)H(o,i,{get:t[i],enumerable:!0})},nt=(o,t,i,e)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of it(t))!et.call(o,s)&&s!==i&&H(o,s,{get:()=>t[s],enumerable:!(e=tt(t,s))||e.enumerable});return o};var rt=o=>nt(H({},"__esModule",{value:!0}),o);var at={};st(at,{Arc:()=>F,Button:()=>A,Circle:()=>M,CustomPolygon:()=>I,Engine:()=>u,ImageSprite:()=>V,Multiplayer:()=>T,Oval:()=>L,Pen:()=>z,Rectangle:()=>Y,RegularPolygon:()=>D,RigidCircle:()=>q,Sprite:()=>c,Square:()=>X,Text:()=>O,Watermark:()=>E,aspectRatio:()=>W,canvas:()=>r,ctx:()=>h,default:()=>ht,scale:()=>B,setAspectRatio:()=>G,setScale:()=>$});module.exports=rt(at);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 W=16/9,B;function J(){r.width=W*B,r.height=B,b.width=W*B,b.height=B}function $(o){B=o,J()}function G(o){W=o,J()}r.parentElement?.insertBefore(b,r);$(500);var c=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(){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)}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 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,S=e.x+e.width/2,f=e.y-e.height/2,P=Math.max(n,m),k=Math.min(d,f),C=Math.min(p,S),x=Math.max(l,g),y=C-P,R=x-k;if(y<=1||R<=1)return!1;o.collisionCanvas||(o.collisionCanvas=document.createElement("canvas"),o.collisionCtx=o.collisionCanvas.getContext("2d",{willReadFrequently:!0}));let v=o.collisionCtx;o.collisionCanvas.width<y&&(o.collisionCanvas.width=y),o.collisionCanvas.height<R&&(o.collisionCanvas.height=R),v.clearRect(0,0,y,R);let U=(w,Q)=>{v.save();let Z=w.x-P,_=x-w.y;v.translate(Z,_),v.rotate(w.toRadians(w.dir)),v.fillStyle=Q,v.fill(w.getCachedPath()),v.restore()};U(this,"red");let j=v.getImageData(0,0,y,R).data;v.clearRect(0,0,y,R),U(t,"blue");let N=v.getImageData(0,0,y,R).data;for(let w=3;w<j.length;w+=4)if(j[w]>0&&N[w]>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 u=class o{static instance;loopRunning=!1;gameLoop=null;maxFPS=24;deltaTime=1/this.maxFPS;lastFrame=performance.now();refreshScheduled=!1;animationFrameId=null;sounds=[];mouseX=0;mouseY=0;mouseDown=!1;mouseClicked=!1;keysPressed=new Set;currentScene="main";sceneMap=new Map;variableMap=new Map;static init(){return this.instance||(this.instance=new o),this.instance}changeScene(t){this.sceneMap.get(t)||this.sceneMap.set(t,{sprites:[],loop:null}),this.loopRunning=!1,this.currentScene=t,this.gameLoop=this.sceneMap.get(t).loop,this.setMaxFramesPerSecond(this.maxFPS)}setLoop(t,i){if(!this.sceneMap.get(t)){this.sceneMap.set(t,{sprites:[],loop:i}),t===this.currentScene&&this.changeScene(t);return}this.sceneMap.get(t).loop=i,t===this.currentScene&&this.changeScene(t)}pauseLoop(){this.loopRunning=!1,this.animationFrameId!==null&&(cancelAnimationFrame(this.animationFrameId),this.animationFrameId=null)}resumeLoop(){this.loopRunning=!0,this.setMaxFramesPerSecond(this.maxFPS)}addSprite(t){let{scene:i,layer:e}=t;if(!this.sceneMap.get(i)){this.sceneMap.set(i,{sprites:[t],loop:null});return}let s=this.sceneMap.get(i).sprites.findIndex(n=>n.layer>e);if(s===-1){this.sceneMap.get(i).sprites.push(t);return}this.sceneMap.get(i).sprites.splice(s,0,t),this.refresh()}removeSprite(t){let{scene:i}=t;this.sceneMap.get(i)&&(this.sceneMap.get(i).sprites=this.sceneMap.get(i).sprites.filter(e=>e!==t),this.refresh())}async setMaxFramesPerSecond(t){this.maxFPS=t;let i=this.gameLoop;if(!i)return;this.animationFrameId!==null&&(cancelAnimationFrame(this.animationFrameId),this.animationFrameId=null),this.loopRunning=!0;let e=1e3/t,s=0,n=async l=>{if(!this.loopRunning)return;let p=l-this.lastFrame;this.lastFrame=l,s+=p,s>=e&&(this.deltaTime=s/1e3,s=s%e,i&&await i()),this.animationFrameId=requestAnimationFrame(n)};this.lastFrame=performance.now(),this.animationFrameId=requestAnimationFrame(n)}refresh(){this.refreshScheduled||(this.refreshScheduled=!0,requestAnimationFrame(()=>{this.refreshScheduled=!1,h.clearRect(0,0,r.width,r.height),[...this.sceneMap.get(this.currentScene).sprites,...this.sceneMap.get("*").sprites].forEach(i=>{i.hidden||i.draw()})}))}async wait(t){return new Promise(i=>setTimeout(i,t))}async waitUntil(t){return new Promise(i=>{let e=()=>{t()?i():setTimeout(e,1e3/this.maxFPS)};e()})}setVariable(t,i){this.variableMap.set(t,i)}getVariable(t){return this.variableMap.get(t)}hovering(t){let{mouseX:i,mouseY:e}=this,s=i+r.width/2,n=r.height/2-e,l=s-(t.x+r.width/2),p=n-(r.height/2-t.y),d=-this.toRadians(t.dir),m=l*Math.cos(d)-p*Math.sin(d),g=l*Math.sin(d)+p*Math.cos(d);return h.isPointInPath(t.getCachedPath(),m,g)}keyPressed(t){switch(t){case"any":return this.keysPressed.size>0;case"up":return this.keysPressed.has("ArrowUp");case"down":return this.keysPressed.has("ArrowDown");case"left":return this.keysPressed.has("ArrowLeft");case"right":return this.keysPressed.has("ArrowRight");case"space":return this.keysPressed.has(" ");default:return this.keysPressed.has(t)}}playSound(t){let i=new Audio(t);return this.sounds.push(i),i.play(),i}stopSound(t){t.pause(),t.currentTime=0,this.sounds=this.sounds.filter(i=>i!==t)}stopAllSounds(){this.sounds.forEach(t=>{t.pause(),t.currentTime=0}),this.sounds=[]}pickRandom(t,i){return t>i&&([t,i]=[i,t]),Math.floor(Math.random()*(i-t+1)+t)}dotProduct(...t){let[i,e]=t;switch(i.length){case 2:return i[0]*e[0]+i[1]*e[1];case 3:return i[0]*e[0]+i[1]*e[1]+i[2]*e[2];case 4:return i[0]*e[0]+i[1]*e[1]+i[2]*e[2]+i[3]*e[3]}}sin(t){return Math.sin(this.toRadians(t))}cos(t){return Math.cos(this.toRadians(t))}tan(t){return Math.tan(this.toRadians(t))}csc(t){return 1/Math.sin(this.toRadians(t))}sec(t){return 1/Math.cos(this.toRadians(t))}cot(t){return 1/Math.tan(this.toRadians(t))}asin(t){return this.toDegrees(Math.asin(t))}acos(t){return this.toDegrees(Math.acos(t))}acsc(t){return this.toDegrees(Math.asin(1/t))}asec(t){return this.toDegrees(Math.acos(1/t))}toRadians(t){return t*Math.PI/180}toDegrees(t){return t*180/Math.PI}constructor(){this.setMaxFramesPerSecond(24),this.sceneMap.set("main",{loop:null,sprites:[]}),this.sceneMap.set("*",{loop:null,sprites:[]}),b.addEventListener("mousemove",t=>{this.mouseX=t.clientX-b.offsetLeft-b.width/2,this.mouseY=-(t.clientY-b.offsetTop-b.height/2)}),b.addEventListener("mousedown",()=>{this.mouseDown=!0}),b.addEventListener("mouseup",()=>{this.mouseDown=!1}),b.addEventListener("click",()=>{this.mouseClicked=!0,setTimeout(()=>this.mouseClicked=!1,0)}),addEventListener("keydown",t=>{t.repeat||this.keysPressed.add(t.key)}),addEventListener("keyup",t=>{this.keysPressed.delete(t.key)})}};var K=require("socket.io-client"),T=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=(0,K.io)(t)}broadcast(t,i){this.socket.emit(t,i)}on(t,i){this.socket.on(t,i)}};var Y=class o extends c{discriminant="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.sqrt((i*s)**2+(e*n)**2),p=2*Math.sqrt((i*n)**2+(e*s)**2);return{x:this.x,y:this.y,width:l,height:p}}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: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)}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 c{discriminant="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.sqrt((i*e)**2+(i*s)**2);return{x:this.x,y:this.y,width:n,height:n}}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: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)}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 L=class o extends c{discriminant="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.sqrt(i*i*s*s+e*e*n*n),p=2*Math.sqrt(i*i*n*n+e*e*s*s);return{x:this.x,y:this.y,width:l,height:p}}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: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)}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 c{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: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)}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 F=class o extends c{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: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)}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 D=class o extends c{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: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)}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 I=class o extends c{discriminant="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 P=f[0]*i-f[1]*e,k=f[0]*e+f[1]*i,C=this.x+P,x=this.y+k;C<s&&(s=C),C>n&&(n=C),x<l&&(l=x),x>p&&(p=x)}let d=n-s,m=p-l,g=s+d/2,S=l+m/2;return{x:g,y:S,width:d,height:m}}getPath(){let t=new Path2D;if(this.vertices.length<2)return t;let i=this.vertices,[e,...s]=i;t.moveTo(e[0],-e[1]);for(let n of s)t.lineTo(n[0],-n[1]);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)}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 z=class o extends c{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(){a.clearRect(0,0,r.width,r.height)}dot(){a.fillStyle=this.color,a.fillRect(this.x-this.size/2+r.width/2,-this.y-this.size/2+r.height/2,this.size,this.size)}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.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,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 O=class o extends c{discriminant="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.sqrt((e*n)**2+(s*l)**2),d=2*Math.sqrt((e*l)**2+(s*n)**2);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,s=i.actualBoundingBoxAscent+i.actualBoundingBoxDescent;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)}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";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.sqrt((e*n)**2+(s*l)**2),d=2*Math.sqrt((e*l)**2+(s*n)**2);return{x:this.x,y:this.y,width:p,height:d}}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: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)}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 O{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";src;width;height;outlineColor;outlineWidth;img;getBoundingBox(){let t=u.init(),i=this.width,e=this.height,s=this.dir,n=Math.abs(t.cos(s)),l=Math.abs(t.sin(s)),p=i*n+e*l,d=i*l+e*n;return{x:this.x,y:this.y,width:p,height:d}}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: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)}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.img.onload=()=>this.draw()}};var q=class extends M{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 S of l)if(this.distanceTo(S.x,S.y)<this.radius+S.radius){let f=this.x-S.x,P=this.y-S.y,k=Math.sqrt(f*f+P*P);if(k===0)continue;let C=f/k,x=P/k,y=this.vX*C+this.vY*x;this.vX=(this.vX-2*y*C)*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 ot={Engine:u,Sprite:c,Multiplayer:T,Rectangle:Y,Square:X,Oval:L,Circle:M,Arc:F,RegularPolygon:D,CustomPolygon:I,Pen:z,Text:O,Button:A,Watermark:E,ImageSprite:V,RigidCircle:q,scale:B,aspectRatio:W,setScale:$,setAspectRatio:G,canvas:r,ctx:h},ht=ot;0&&(module.exports={Arc,Button,Circle,CustomPolygon,Engine,ImageSprite,Multiplayer,Oval,Pen,Rectangle,RegularPolygon,RigidCircle,Sprite,Square,Text,Watermark,aspectRatio,canvas,ctx,scale,setAspectRatio,setScale});
2
2
  //# sourceMappingURL=index.cjs.map