tscratch 0.7.0 → 0.7.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/client/index.ts","../../src/client/canvas.ts","../../src/client/Sprite.ts","../../src/client/Engine.ts","../../src/client/Multiplayer.ts","../../src/client/sprites/Rectangle.ts","../../src/client/sprites/Square.ts","../../src/client/sprites/Oval.ts","../../src/client/sprites/Circle.ts","../../src/client/sprites/Arc.ts","../../src/client/sprites/RegularPolygon.ts","../../src/client/sprites/CustomPolygon.ts","../../src/client/sprites/Pen.ts","../../src/client/sprites/Text.ts","../../src/client/sprites/Button.ts","../../src/client/sprites/Watermark.ts","../../src/client/sprites/ImageSprite.ts","../../src/client/sprites/physics/RigidCircle.ts"],"sourcesContent":["// Main\r\nimport Engine from './Engine.ts';\r\nimport Sprite, { type SpriteOptions } from './Sprite.ts';\r\nimport { scale, aspectRatio, setScale, setAspectRatio, canvas, ctx } from './canvas.ts';\r\n\r\n// Multiplayer\r\nimport Multiplayer from './Multiplayer.ts';\r\n\r\n// Sprites\r\nimport Rectangle, { type RectangleOptions } from './sprites/Rectangle.ts';\r\nimport Square, { type SquareOptions } from './sprites/Square.ts';\r\nimport Oval, { type OvalOptions } from './sprites/Oval.ts';\r\nimport Circle, { type CircleOptions } from './sprites/Circle.ts';\r\nimport Arc, { type ArcOptions } from './sprites/Arc.ts';\r\nimport RegularPolygon, { type RegularPolygonOptions } from './sprites/RegularPolygon.ts';\r\nimport CustomPolygon, { type CustomPolygonOptions } from './sprites/CustomPolygon.ts';\r\nimport Pen, { type PenOptions } from './sprites/Pen.ts';\r\nimport Text, { type TextOptions } from './sprites/Text.ts';\r\nimport Button, { type ButtonOptions } from './sprites/Button.ts';\r\nimport Watermark from './sprites/Watermark.ts';\r\nimport ImageSprite, { type ImageSpriteOptions } from './sprites/ImageSprite.ts';\r\n\r\nimport RigidCircle, { type RigidCircleOptions } from './sprites/physics/RigidCircle.ts';\r\n\r\n// Types\r\nimport type { Vec2, Vec3, Vec4 } from './types/Vectors.ts';\r\nimport type { Mat2, Mat3, Mat4 } from './types/Matricies.ts';\r\nimport { type RigidBodyOptions } from './sprites/physics/RigidBodyOptions.ts';\r\n\r\nconst TScratch = {\r\n // Main\r\n Engine,\r\n Sprite,\r\n\r\n // Multiplayer\r\n Multiplayer,\r\n\r\n // Sprites\r\n Rectangle,\r\n Square,\r\n Oval,\r\n Circle,\r\n Arc,\r\n RegularPolygon,\r\n CustomPolygon,\r\n Pen,\r\n Text,\r\n Button,\r\n Watermark,\r\n ImageSprite,\r\n\r\n RigidCircle,\r\n\r\n // Canvas\r\n scale,\r\n aspectRatio,\r\n setScale,\r\n setAspectRatio,\r\n canvas,\r\n ctx\r\n};\r\n\r\nexport default TScratch;\r\nexport {\r\n // Main\r\n Engine,\r\n Sprite,\r\n\r\n // Multiplayer\r\n Multiplayer,\r\n\r\n // Sprites\r\n Rectangle,\r\n Square,\r\n Oval,\r\n Circle,\r\n Arc,\r\n RegularPolygon,\r\n CustomPolygon,\r\n Pen,\r\n Text,\r\n Button,\r\n Watermark,\r\n ImageSprite,\r\n\r\n RigidCircle,\r\n\r\n // Options\r\n type SpriteOptions,\r\n type RectangleOptions,\r\n type SquareOptions,\r\n type OvalOptions,\r\n type CircleOptions,\r\n type ArcOptions,\r\n type RegularPolygonOptions,\r\n type CustomPolygonOptions,\r\n type PenOptions,\r\n type TextOptions,\r\n type ButtonOptions,\r\n type TextOptions as WatermarkOptions,\r\n type ImageSpriteOptions,\r\n\r\n type RigidBodyOptions,\r\n type RigidCircleOptions,\r\n\r\n // Other types\r\n type Vec2,\r\n type Vec3,\r\n type Vec4,\r\n type Mat2,\r\n type Mat3,\r\n type Mat4,\r\n \r\n // Canvas\r\n scale,\r\n aspectRatio,\r\n setScale,\r\n setAspectRatio,\r\n canvas,\r\n ctx\r\n};","export const canvas = document.getElementById('game-window') as HTMLCanvasElement || document.createElement('canvas'); // For testing\r\nexport const ctx = canvas.getContext('2d')!;\r\n\r\nexport const penCanvas = document.createElement('canvas');\r\nexport const penCtx = penCanvas.getContext('2d')!;\r\npenCanvas.id = 'pen-canvas';\r\n\r\nexport let aspectRatio: number = 16 / 9;\r\nexport let scale: number;\r\n\r\nfunction updateSize() {\r\n canvas.width = aspectRatio * scale;\r\n canvas.height = scale;\r\n\r\n penCanvas.width = aspectRatio * scale;\r\n penCanvas.height = scale;\r\n}\r\n\r\nexport function setScale(newScale: number) {\r\n scale = newScale;\r\n updateSize();\r\n}\r\n\r\nexport function setAspectRatio(newAspectRatio: number) {\r\n aspectRatio = newAspectRatio;\r\n updateSize();\r\n}\r\n\r\ncanvas.parentElement?.insertBefore(penCanvas, canvas);\r\n\r\nsetScale(500);","import Engine from './Engine.ts';\r\n\r\nexport interface BoundingBox {\r\n x: number;\r\n y: number;\r\n width: number;\r\n height: number;\r\n}\r\n\r\nexport interface SpriteOptions {\r\n x?: number;\r\n y?: number;\r\n dir?: number;\r\n size?: number;\r\n scene?: string;\r\n hidden?: boolean;\r\n layer?: number;\r\n}\r\n\r\nexport default abstract class Sprite {\r\n\r\n public x: number = 0;\r\n public y: number = 0;\r\n public dir: number = 0;\r\n public size: number = 1;\r\n public scene: string = 'main';\r\n public hidden: boolean = false;\r\n public layer: number = 0;\r\n\r\n public abstract discriminant: string;\r\n public abstract tags: Set<string>;\r\n\r\n private cachedPath: Path2D | null = null;\r\n private pathDirty: boolean = true;\r\n\r\n // Reusable collision detection canvas\r\n private static collisionCanvas: HTMLCanvasElement | null = null;\r\n private static collisionCtx: CanvasRenderingContext2D | null = null;\r\n\r\n // Rendering\r\n\r\n public abstract getBoundingBox(): BoundingBox;\r\n public abstract getPath(): Path2D;\r\n public abstract draw(stamping?: boolean): void;\r\n protected abstract create(options?: SpriteOptions): this;\r\n\r\n protected refresh() {\r\n Engine.init().refresh();\r\n }\r\n\r\n protected invalidatePath() {\r\n this.pathDirty = true;\r\n this.cachedPath = null;\r\n }\r\n\r\n public getCachedPath(): Path2D {\r\n if (this.pathDirty || !this.cachedPath) {\r\n this.cachedPath = this.getPath();\r\n this.pathDirty = false;\r\n }\r\n return this.cachedPath;\r\n }\r\n\r\n constructor(options?: SpriteOptions) {\r\n Object.assign(this, options);\r\n Engine.init().addSprite(this);\r\n }\r\n\r\n protected getCreateOptions(): SpriteOptions & Record<string, any> {\r\n return {\r\n x: this.x,\r\n y: this.y,\r\n dir: this.dir,\r\n size: this.size,\r\n scene: this.scene,\r\n layer: this.layer,\r\n hidden: this.hidden\r\n };\r\n }\r\n\r\n public clone(options?: SpriteOptions): this {\r\n return this.create({\r\n ...this.getCreateOptions(),\r\n ...options\r\n });\r\n }\r\n\r\n // Sensing\r\n\r\n public touching(sprite: Sprite): boolean {\r\n\r\n // Return if hidden or if the scenes differ\r\n if (this.hidden || sprite.hidden || (this.scene !== '*' && sprite.scene !== '*' && this.scene !== sprite.scene)) return false;\r\n\r\n // AABB (bounding boxes)\r\n const bBox1 = this.getBoundingBox();\r\n const bBox2 = sprite.getBoundingBox();\r\n\r\n const aabbOverlap =\r\n Math.abs(bBox1.x - bBox2.x) < (bBox1.width + bBox2.width) / 2 &&\r\n Math.abs(bBox1.y - bBox2.y) < (bBox1.height + bBox2.height) / 2;\r\n\r\n if (!aabbOverlap) return false;\r\n\r\n // Image data (pixel perfect)\r\n\r\n // Compute intersection bounding box\r\n const b1Left = bBox1.x - bBox1.width / 2;\r\n const b1Top = bBox1.y + bBox1.height / 2;\r\n const b1Right = bBox1.x + bBox1.width / 2;\r\n const b1Bottom = bBox1.y - bBox1.height / 2;\r\n\r\n const b2Left = bBox2.x - bBox2.width / 2;\r\n const b2Top = bBox2.y + bBox2.height / 2;\r\n const b2Right = bBox2.x + bBox2.width / 2;\r\n const b2Bottom = bBox2.y - bBox2.height / 2;\r\n\r\n const xMin = Math.max(b1Left, b2Left);\r\n const yMin = Math.min(b1Bottom, b2Bottom);\r\n const xMax = Math.min(b1Right, b2Right);\r\n const yMax = Math.max(b1Top, b2Top);\r\n\r\n const width = xMax - xMin;\r\n const height = yMax - yMin;\r\n\r\n if (width <= 1 || height <= 1) return false;\r\n\r\n // Reuse or create offscreen canvas for collision detection\r\n if (!Sprite.collisionCanvas) {\r\n Sprite.collisionCanvas = document.createElement('canvas');\r\n Sprite.collisionCtx = Sprite.collisionCanvas.getContext('2d', { willReadFrequently: true })!;\r\n }\r\n\r\n // Prepare canvas\r\n const ctx = Sprite.collisionCtx!;\r\n if (Sprite.collisionCanvas.width < width) Sprite.collisionCanvas.width = width;\r\n if (Sprite.collisionCanvas.height < height) Sprite.collisionCanvas.height = height;\r\n ctx.clearRect(0, 0, width, height);\r\n\r\n // Helper to draw a sprite into collision canvas\r\n const drawSprite = (sprite: Sprite, color: string) => {\r\n ctx.save();\r\n\r\n // Translate to intersection box coordinates (centered)\r\n const dx = sprite.x - xMin;\r\n const dy = yMax - sprite.y; // flip Y to match draw()\r\n\r\n ctx.translate(dx, dy);\r\n ctx.rotate(sprite.toRadians(sprite.dir));\r\n\r\n ctx.fillStyle = color;\r\n ctx.fill(sprite.getCachedPath());\r\n\r\n ctx.restore();\r\n };\r\n\r\n // Draw sprite 1 in red\r\n drawSprite(this, 'red');\r\n const img1 = ctx.getImageData(0, 0, width, height).data;\r\n\r\n // Draw sprite 2 in blue\r\n ctx.clearRect(0, 0, width, height);\r\n drawSprite(sprite, 'blue');\r\n const img2 = ctx.getImageData(0, 0, width, height).data;\r\n\r\n // Check for overlapping non-transparent pixels\r\n for (let i = 3; i < img1.length; i += 4) // alpha channel\r\n if (img1[i]! > 0 && img2[i]! > 0) return true;\r\n\r\n return false;\r\n }\r\n\r\n // Helpers\r\n\r\n protected toRadians(deg: number) {\r\n return deg * Math.PI / 180;\r\n }\r\n\r\n protected toDegrees(rad: number) {\r\n return rad * 180 / Math.PI;\r\n }\r\n\r\n public distanceTo(x: number, y: number) {\r\n return Math.hypot(x - this.x, y - this.y);\r\n }\r\n\r\n // Methods\r\n\r\n // Motion\r\n public move(steps: number) {\r\n this.x += steps * Math.sin(this.toRadians(this.dir));\r\n this.y += steps * Math.cos(this.toRadians(this.dir));\r\n this.refresh();\r\n }\r\n\r\n public turn(deg: number) {\r\n this.dir += deg;\r\n this.refresh();\r\n }\r\n\r\n public point(dir: number) {\r\n this.dir = dir;\r\n this.refresh();\r\n }\r\n\r\n public pointTowards(x: number, y: number) {\r\n this.dir = 90 - this.toDegrees(Math.atan2(y - this.y, x - this.x));\r\n this.refresh();\r\n }\r\n\r\n public setX(x: number) {\r\n this.x = x;\r\n this.refresh();\r\n }\r\n\r\n public setY(y: number) {\r\n this.y = y;\r\n this.refresh();\r\n }\r\n\r\n public goTo(x: number, y: number) {\r\n this.x = x;\r\n this.y = y;\r\n this.refresh();\r\n }\r\n\r\n public changeX(dX: number) {\r\n this.x += dX;\r\n this.refresh();\r\n }\r\n\r\n public changeY(dY: number) {\r\n this.y += dY;\r\n this.refresh();\r\n }\r\n\r\n // Looks\r\n\r\n public show() {\r\n this.hidden = false;\r\n this.refresh();\r\n }\r\n\r\n public hide() {\r\n this.hidden = true;\r\n this.refresh();\r\n }\r\n\r\n public setSize(size: number) {\r\n this.size = size > 0 ? size : 0;\r\n this.invalidatePath();\r\n this.refresh();\r\n }\r\n\r\n public changeSize(dS: number) {\r\n this.size = this.size + dS > 0 ? this.size + dS : 0;\r\n this.invalidatePath();\r\n this.refresh();\r\n }\r\n\r\n public goToLayer(layer: number) {\r\n this.layer = layer;\r\n this.refresh();\r\n }\r\n\r\n public changeLayer(dL: number) {\r\n this.layer += dL;\r\n this.refresh();\r\n }\r\n}","import { canvas, ctx, penCanvas } from './canvas.ts';\r\nimport Sprite from './Sprite.ts';\r\nimport type { Vec2, Vec3, Vec4 } from './types/Vectors.ts';\r\n\r\ntype GameLoop = (() => void) | (() => Promise<void>);\r\n\r\ntype SceneMap = Map<string, {\r\n sprites: Sprite[];\r\n loop: GameLoop | null;\r\n}>\r\n\r\nexport default class Engine {\r\n\r\n private static instance: Engine;\r\n\r\n private loopRunning: boolean = false;\r\n private gameLoop: GameLoop | null = null;\r\n\r\n public maxFPS: number = 24;\r\n public deltaTime: number = 1 / this.maxFPS;\r\n private lastFrame: number = performance.now();\r\n private refreshScheduled: boolean = false;\r\n private animationFrameId: number | null = null;\r\n\r\n private sounds: HTMLAudioElement[] = [];\r\n\r\n public mouseX: number = 0;\r\n public mouseY: number = 0;\r\n\r\n public mouseDown: boolean = false;\r\n public mouseClicked: boolean = false;\r\n\r\n private keysPressed: Set<string> = new Set<string>();\r\n\r\n private currentScene: string = 'main';\r\n public sceneMap: SceneMap = new Map();\r\n\r\n private variableMap: Map<string, unknown> = new Map();\r\n\r\n // Singleton initialization\r\n\r\n public static init() {\r\n if (!this.instance)\r\n this.instance = new Engine();\r\n\r\n return this.instance;\r\n }\r\n\r\n // Change the scene\r\n\r\n public changeScene(scene: string) {\r\n if (!this.sceneMap.get(scene))\r\n this.sceneMap.set(scene, { sprites: [], loop: null });\r\n\r\n this.loopRunning = false;\r\n this.currentScene = scene;\r\n this.gameLoop = this.sceneMap.get(scene)!.loop;\r\n this.setMaxFramesPerSecond(this.maxFPS); // Update the interval function\r\n }\r\n\r\n // Loops\r\n\r\n public setLoop(scene: string, loop: GameLoop) {\r\n if (!this.sceneMap.get(scene)) {\r\n this.sceneMap.set(scene, { sprites: [], loop });\r\n if (scene === this.currentScene)\r\n this.changeScene(scene);\r\n return;\r\n }\r\n\r\n this.sceneMap.get(scene)!.loop = loop;\r\n if (scene === this.currentScene)\r\n this.changeScene(scene);\r\n }\r\n\r\n public pauseLoop() {\r\n this.loopRunning = false;\r\n if (this.animationFrameId !== null) {\r\n cancelAnimationFrame(this.animationFrameId);\r\n this.animationFrameId = null;\r\n }\r\n }\r\n\r\n public resumeLoop() {\r\n this.loopRunning = true;\r\n void this.setMaxFramesPerSecond(this.maxFPS);\r\n }\r\n\r\n // Internal\r\n\r\n public addSprite(sprite: Sprite) {\r\n const { scene, layer } = sprite;\r\n\r\n if (!this.sceneMap.get(scene)) {\r\n this.sceneMap.set(scene, { sprites: [sprite], loop: null });\r\n return;\r\n }\r\n\r\n let targetIndex = this.sceneMap.get(scene)!.sprites.findIndex(s => s.layer > layer);\r\n if (targetIndex === -1) {\r\n this.sceneMap.get(scene)!.sprites.push(sprite);\r\n return;\r\n }\r\n\r\n this.sceneMap.get(scene)!.sprites.splice(targetIndex, 0, sprite);\r\n this.refresh();\r\n }\r\n\r\n public removeSprite(sprite: Sprite) {\r\n const { scene } = sprite;\r\n\r\n if (!this.sceneMap.get(scene)) return;\r\n\r\n this.sceneMap.get(scene)!.sprites = this.sceneMap.get(scene)!.sprites.filter(s => s !== sprite);\r\n this.refresh();\r\n }\r\n\r\n public async setMaxFramesPerSecond(maxFPS: number) {\r\n this.maxFPS = maxFPS;\r\n\r\n let loop = this.gameLoop;\r\n if (!loop) return;\r\n\r\n // Cancel existing animation frame if any\r\n if (this.animationFrameId !== null) {\r\n cancelAnimationFrame(this.animationFrameId);\r\n this.animationFrameId = null;\r\n }\r\n\r\n this.loopRunning = true;\r\n const frameInterval = 1000 / maxFPS;\r\n let accumulator = 0;\r\n\r\n const tick = async (currentTime: number) => {\r\n if (!this.loopRunning) return;\r\n\r\n const deltaTime = currentTime - this.lastFrame;\r\n this.lastFrame = currentTime;\r\n accumulator += deltaTime;\r\n\r\n // Fixed timestep: only run loop when enough time has passed\r\n if (accumulator >= frameInterval) {\r\n this.deltaTime = accumulator / 1000;\r\n accumulator = accumulator % frameInterval;\r\n\r\n if (loop) await loop();\r\n }\r\n\r\n this.animationFrameId = requestAnimationFrame(tick);\r\n };\r\n\r\n this.lastFrame = performance.now();\r\n this.animationFrameId = requestAnimationFrame(tick);\r\n }\r\n\r\n public refresh() {\r\n if (this.refreshScheduled) return;\r\n this.refreshScheduled = true;\r\n\r\n requestAnimationFrame(() => {\r\n this.refreshScheduled = false;\r\n ctx.clearRect(0, 0, canvas.width, canvas.height);\r\n const sprites = [\r\n ...this.sceneMap.get(this.currentScene)!.sprites,\r\n ...this.sceneMap.get('*')!.sprites\r\n ];\r\n sprites.forEach(sprite => {\r\n if (!sprite.hidden)\r\n sprite.draw();\r\n });\r\n });\r\n }\r\n\r\n // Wait functions\r\n\r\n public async wait(ms: number): Promise<void> {\r\n return new Promise(resolve => setTimeout(resolve, ms));\r\n }\r\n\r\n public async waitUntil(conditionGetter: () => boolean): Promise<void> {\r\n return new Promise(resolve => {\r\n const check = () => {\r\n if (conditionGetter()) resolve();\r\n else setTimeout(check, 1000 / this.maxFPS);\r\n }\r\n check();\r\n });\r\n }\r\n\r\n // Global variables\r\n\r\n public setVariable<T = any>(key: string, value: T) {\r\n this.variableMap.set(key, value);\r\n }\r\n\r\n public getVariable<T = unknown>(key: string) {\r\n return this.variableMap.get(key) as T;\r\n }\r\n\r\n // Events\r\n\r\n public hovering(sprite: Sprite) {\r\n const { mouseX, mouseY } = this;\r\n\r\n const canvasMouseX = mouseX + canvas.width / 2;\r\n const canvasMouseY = canvas.height / 2 - mouseY;\r\n\r\n // Mouse relative to sprite center\r\n const localX = canvasMouseX - (sprite.x + canvas.width / 2);\r\n const localY = canvasMouseY - (canvas.height / 2 - sprite.y);\r\n\r\n // Rotate mouse point by -dir to align with the path's local coordinates\r\n const angle = -this.toRadians(sprite.dir);\r\n const rotatedX = localX * Math.cos(angle) - localY * Math.sin(angle);\r\n const rotatedY = localX * Math.sin(angle) + localY * Math.cos(angle);\r\n\r\n return ctx.isPointInPath(sprite.getCachedPath(), rotatedX, rotatedY);\r\n }\r\n\r\n public keyPressed(key: string) {\r\n switch (key) {\r\n case 'any': return this.keysPressed.size > 0;\r\n\r\n case 'up': return this.keysPressed.has('ArrowUp');\r\n case 'down': return this.keysPressed.has('ArrowDown');\r\n case 'left': return this.keysPressed.has('ArrowLeft');\r\n case 'right': return this.keysPressed.has('ArrowRight');\r\n\r\n case 'space': return this.keysPressed.has(' ');\r\n\r\n default: return this.keysPressed.has(key);\r\n }\r\n }\r\n\r\n // Sound\r\n\r\n public playSound(src: string) {\r\n const audio = new Audio(src);\r\n this.sounds.push(audio);\r\n\r\n audio.play();\r\n\r\n return audio;\r\n }\r\n\r\n public stopSound(sound: HTMLAudioElement) {\r\n sound.pause();\r\n sound.currentTime = 0;\r\n this.sounds = this.sounds.filter(s => s !== sound);\r\n }\r\n\r\n public stopAllSounds() {\r\n this.sounds.forEach(sound => {\r\n sound.pause();\r\n sound.currentTime = 0;\r\n });\r\n this.sounds = [];\r\n }\r\n\r\n // Math\r\n\r\n public pickRandom(min: number, max: number) {\r\n if (min > max)\r\n [min, max] = [max, min];\r\n return Math.floor(Math.random() * (max - min + 1) + min);\r\n }\r\n\r\n public dotProduct(...vectors: [Vec2, Vec2] | [Vec3, Vec3] | [Vec4, Vec4]) {\r\n const [a, b] = vectors;\r\n\r\n switch (a.length) {\r\n case 2: return a[0] * b[0] + a[1] * b[1];\r\n case 3: return a[0] * b[0] + a[1] * b[1] + a[2] * b[2]!;\r\n case 4: return a[0] * b[0] + a[1] * b[1] + a[2] * b[2]! + a[3] * b[3]!; // TypeScript doesn't narrow down the types on b\r\n }\r\n }\r\n\r\n // Trigonometric functions\r\n public sin(deg: number) {\r\n return Math.sin(this.toRadians(deg));\r\n }\r\n\r\n public cos(deg: number) {\r\n return Math.cos(this.toRadians(deg));\r\n }\r\n\r\n public tan(deg: number) {\r\n return Math.tan(this.toRadians(deg));\r\n }\r\n\r\n public csc(deg: number) {\r\n return 1 / Math.sin(this.toRadians(deg));\r\n }\r\n\r\n public sec(deg: number) {\r\n return 1 / Math.cos(this.toRadians(deg));\r\n }\r\n\r\n public cot(deg: number) {\r\n return 1 / Math.tan(this.toRadians(deg));\r\n }\r\n\r\n // Inverse Trigonometric functions\r\n public asin(val: number) {\r\n return this.toDegrees(Math.asin(val));\r\n }\r\n\r\n public acos(val: number) {\r\n return this.toDegrees(Math.acos(val));\r\n }\r\n\r\n public acsc(val: number) {\r\n return this.toDegrees(Math.asin(1 / val));\r\n }\r\n\r\n public asec(val: number) {\r\n return this.toDegrees(Math.acos(1 / val));\r\n }\r\n\r\n // Helpers\r\n\r\n public toRadians(deg: number) {\r\n return deg * Math.PI / 180;\r\n }\r\n\r\n public toDegrees(rad: number) {\r\n return rad * 180 / Math.PI;\r\n }\r\n\r\n // Private constructor\r\n\r\n private constructor() {\r\n void this.setMaxFramesPerSecond(24);\r\n this.sceneMap.set('main', { loop: null, sprites: [] });\r\n this.sceneMap.set('*', { loop: null, sprites: [] });\r\n\r\n // Events\r\n\r\n // Mouse\r\n penCanvas.addEventListener('mousemove', e => {\r\n this.mouseX = e.clientX - penCanvas.offsetLeft - penCanvas.width / 2;\r\n this.mouseY = -(e.clientY - penCanvas.offsetTop - penCanvas.height / 2);\r\n });\r\n penCanvas.addEventListener('mousedown', () => {\r\n this.mouseDown = true;\r\n });\r\n penCanvas.addEventListener('mouseup', () => {\r\n this.mouseDown = false;\r\n });\r\n penCanvas.addEventListener('click', () => {\r\n this.mouseClicked = true;\r\n setTimeout(() => this.mouseClicked = false, 0);\r\n });\r\n\r\n // Keys\r\n addEventListener('keydown', e => {\r\n if (e.repeat) return;\r\n this.keysPressed.add(e.key);\r\n });\r\n\r\n addEventListener('keyup', e => {\r\n this.keysPressed.delete(e.key);\r\n });\r\n }\r\n}","import { io, Socket } from 'socket.io-client';\r\n\r\nexport default class Multiplayer {\r\n\r\n private static instance: Multiplayer;\r\n private socket: Socket;\r\n\r\n public static connect(serverURL: string = 'http://localhost:3000') {\r\n if (!this.instance)\r\n this.instance = new Multiplayer(serverURL);\r\n\r\n return this.instance;\r\n }\r\n\r\n public disconnect() {\r\n this.socket.disconnect();\r\n }\r\n\r\n private constructor(serverURL: string) {\r\n this.socket = io(serverURL);\r\n }\r\n\r\n // Methods\r\n\r\n public broadcast<T = unknown>(eventName: string, data: T) {\r\n this.socket.emit(eventName, data);\r\n }\r\n\r\n public on<T = unknown>(eventName: string, callback: (data: T) => void) {\r\n this.socket.on(eventName, callback);\r\n }\r\n}","import Engine from '../Engine.ts';\r\nimport Sprite, { type BoundingBox, type SpriteOptions } from '../Sprite.ts';\r\nimport { ctx, canvas, penCtx } from '../canvas.ts';\r\n\r\nexport interface RectangleOptions extends SpriteOptions {\r\n width?: number;\r\n height?: number;\r\n color?: string;\r\n outlineColor?: string;\r\n outlineWidth?: number;\r\n};\r\n\r\nexport default class Rectangle extends Sprite {\r\n\r\n public discriminant = 'rectangle';\r\n public tags = new Set(['rectangle']);\r\n\r\n public width: number;\r\n public height: number;\r\n public color: string;\r\n public outlineColor: string;\r\n public outlineWidth: number;\r\n\r\n public getBoundingBox(): BoundingBox {\r\n\r\n const engine = Engine.init();\r\n\r\n const w = this.width / 2; // half-width\r\n const h = this.height / 2; // half-height\r\n\r\n const cos = engine.cos(this.dir);\r\n const sin = engine.sin(this.dir);\r\n\r\n const width = 2 * (Math.abs(w * cos) + Math.abs(h * sin)) * this.size;\r\n const height = 2 * (Math.abs(w * sin) + Math.abs(h * cos)) * this.size;\r\n\r\n return {\r\n x: this.x,\r\n y: this.y,\r\n width, height\r\n };\r\n }\r\n\r\n public getPath(): Path2D {\r\n const path = new Path2D();\r\n\r\n path.rect(\r\n -this.width / 2 * this.size,\r\n -this.height / 2 * this.size,\r\n this.width * this.size,\r\n this.height * this.size\r\n );\r\n\r\n return path;\r\n }\r\n\r\n public draw(stamping?: boolean): void {\r\n const c = stamping ? penCtx : ctx;\r\n\r\n c.save();\r\n\r\n const cX = this.x + canvas.width / 2;\r\n const cY = -this.y + canvas.height / 2;\r\n c.translate(cX, cY);\r\n\r\n c.rotate(this.toRadians(this.dir));\r\n\r\n const path = this.getCachedPath();\r\n\r\n c.fillStyle = this.color;\r\n c.strokeStyle = this.outlineColor;\r\n c.lineWidth = this.outlineWidth;\r\n c.fill(path)\r\n if (this.outlineWidth)\r\n c.stroke(path);\r\n\r\n c.restore();\r\n }\r\n\r\n public create(options?: RectangleOptions): this {\r\n return new Rectangle(options) as this;\r\n }\r\n\r\n protected getCreateOptions() {\r\n return {\r\n ...super.getCreateOptions(),\r\n width: this.width,\r\n height: this.height,\r\n color: this.color,\r\n outlineColor: this.outlineColor,\r\n outlineWidth: this.outlineWidth\r\n };\r\n }\r\n\r\n public setWidth(width: number) {\r\n this.width = width;\r\n this.invalidatePath();\r\n this.refresh();\r\n }\r\n\r\n public setHeight(height: number) {\r\n this.height = height;\r\n this.invalidatePath();\r\n this.refresh();\r\n }\r\n\r\n public setColor(color: string) {\r\n this.color = color;\r\n this.refresh();\r\n }\r\n\r\n constructor(options?: RectangleOptions) {\r\n super(options);\r\n\r\n this.width = options?.width ?? 50;\r\n this.height = options?.height ?? 50;\r\n this.color = options?.color ?? 'black';\r\n this.outlineColor = options?.outlineColor ?? 'black';\r\n this.outlineWidth = options?.outlineWidth ?? 0;\r\n \r\n this.draw();\r\n }\r\n\r\n}","import Engine from '../Engine.ts';\r\nimport Sprite, { type BoundingBox, type SpriteOptions } from '../Sprite.ts';\r\nimport { ctx, canvas, penCtx } from '../canvas.ts';\r\n\r\nexport interface SquareOptions extends SpriteOptions {\r\n sideLength?: number;\r\n color?: string;\r\n outlineColor?: string;\r\n outlineWidth?: number;\r\n};\r\n\r\nexport default class Square extends Sprite {\r\n\r\n public discriminant = 'square';\r\n public tags = new Set(['square']);\r\n\r\n public sideLength: number;\r\n public color: string;\r\n public outlineColor: string;\r\n public outlineWidth: number;\r\n\r\n public getBoundingBox(): BoundingBox {\r\n\r\n const engine = Engine.init();\r\n\r\n const s = this.sideLength / 2;\r\n\r\n const cos = engine.cos(this.dir);\r\n const sin = engine.sin(this.dir);\r\n\r\n const size = 2 * (Math.abs(s * cos) + Math.abs(s * sin)) * this.size;\r\n\r\n return {\r\n x: this.x,\r\n y: this.y,\r\n width: size,\r\n height: size\r\n };\r\n }\r\n\r\n public getPath(): Path2D {\r\n const path = new Path2D();\r\n\r\n path.rect(\r\n -this.sideLength / 2 * this.size,\r\n -this.sideLength / 2 * this.size,\r\n this.sideLength * this.size,\r\n this.sideLength * this.size\r\n );\r\n\r\n return path;\r\n }\r\n\r\n public draw(stamping?: boolean): void {\r\n const c = stamping ? penCtx : ctx;\r\n\r\n c.save();\r\n\r\n const cX = this.x + canvas.width / 2;\r\n const cY = -this.y + canvas.height / 2;\r\n c.translate(cX, cY);\r\n\r\n c.rotate(this.toRadians(this.dir));\r\n\r\n const path = this.getCachedPath();\r\n\r\n c.fillStyle = this.color;\r\n c.strokeStyle = this.outlineColor;\r\n c.lineWidth = this.outlineWidth;\r\n c.fill(path)\r\n if (this.outlineWidth)\r\n c.stroke(path);\r\n\r\n c.restore();\r\n }\r\n\r\n public create(options?: SquareOptions): this {\r\n return new Square(options) as this;\r\n }\r\n\r\n protected getCreateOptions() {\r\n return {\r\n ...super.getCreateOptions(),\r\n sideLength: this.sideLength,\r\n color: this.color,\r\n outlineColor: this.outlineColor,\r\n outlineWidth: this.outlineWidth\r\n };\r\n }\r\n\r\n public setSideLength(sideLength: number) {\r\n this.sideLength = sideLength;\r\n this.invalidatePath();\r\n this.refresh();\r\n }\r\n\r\n public setColor(color: string) {\r\n this.color = color;\r\n this.refresh();\r\n }\r\n\r\n constructor(options?: SquareOptions) {\r\n super(options);\r\n this.sideLength = options?.sideLength ?? 50;\r\n this.color = options?.color ?? 'black';\r\n this.outlineColor = options?.outlineColor ?? 'black';\r\n this.outlineWidth = options?.outlineWidth ?? 0;\r\n this.draw();\r\n }\r\n\r\n}","import Engine from '../Engine.ts';\r\nimport Sprite, { type BoundingBox, type SpriteOptions } from '../Sprite.ts';\r\nimport { canvas, ctx, penCtx } from '../canvas.ts';\r\n\r\nexport interface OvalOptions extends SpriteOptions {\r\n radX?: number;\r\n radY?: number;\r\n color?: string;\r\n outlineColor?: string;\r\n outlineWidth?: number;\r\n};\r\n\r\nexport default class Oval extends Sprite {\r\n\r\n public discriminant = 'oval';\r\n public tags = new Set(['oval']);\r\n\r\n public radX: number;\r\n public radY: number;\r\n public color: string;\r\n public outlineColor: string;\r\n public outlineWidth: number;\r\n\r\n public getBoundingBox(): BoundingBox {\r\n\r\n const engine = Engine.init();\r\n\r\n const rX = this.radX;\r\n const rY = this.radY;\r\n\r\n const cos = engine.cos(this.dir);\r\n const sin = engine.sin(this.dir);\r\n\r\n const width = 2 * (Math.abs(rX * cos) + Math.abs(rY * sin)) * this.size;\r\n const height = 2 * (Math.abs(rX * sin) + Math.abs(rY * cos)) * this.size;\r\n\r\n return {\r\n x: this.x,\r\n y: this.y,\r\n width, height\r\n };\r\n }\r\n\r\n public getPath(): Path2D {\r\n const path = new Path2D();\r\n\r\n path.ellipse(\r\n 0, 0,\r\n this.radX * this.size,\r\n this.radY * this.size,\r\n 0, 0,\r\n Math.PI * 2\r\n );\r\n\r\n return path;\r\n }\r\n\r\n public draw(stamping?: boolean): void {\r\n const c = stamping ? penCtx : ctx;\r\n\r\n c.save();\r\n\r\n const cX = this.x + canvas.width / 2;\r\n const cY = -this.y + canvas.height / 2;\r\n c.translate(cX, cY);\r\n\r\n c.rotate(this.toRadians(this.dir));\r\n\r\n const path = this.getCachedPath();\r\n\r\n c.fillStyle = this.color;\r\n c.strokeStyle = this.outlineColor;\r\n c.lineWidth = this.outlineWidth;\r\n c.fill(path)\r\n if (this.outlineWidth)\r\n c.stroke(path);\r\n\r\n c.restore();\r\n }\r\n\r\n public create(options?: OvalOptions): this {\r\n return new Oval(options) as this;\r\n }\r\n\r\n protected getCreateOptions() {\r\n return {\r\n ...super.getCreateOptions(),\r\n radX: this.radX,\r\n radY: this.radY,\r\n color: this.color,\r\n outlineColor: this.outlineColor,\r\n outlineWidth: this.outlineWidth\r\n };\r\n }\r\n\r\n public setRadX(radX: number) {\r\n this.radX = radX;\r\n this.invalidatePath();\r\n this.refresh();\r\n }\r\n\r\n public setRadY(radY: number) {\r\n this.radY = radY;\r\n this.invalidatePath();\r\n this.refresh();\r\n }\r\n\r\n public setColor(color: string) {\r\n this.color = color;\r\n this.refresh();\r\n }\r\n\r\n constructor(options?: OvalOptions) {\r\n super(options);\r\n\r\n this.radX = options?.radX ?? 25;\r\n this.radY = options?.radY ?? 25;\r\n this.color = options?.color ?? 'black';\r\n this.outlineColor = options?.outlineColor ?? 'black';\r\n this.outlineWidth = options?.outlineWidth ?? 0;\r\n \r\n this.draw();\r\n }\r\n\r\n}","import Engine from '../Engine.ts';\r\nimport Sprite, { type BoundingBox, type SpriteOptions } from '../Sprite.ts';\r\nimport { canvas, ctx, penCtx } from '../canvas.ts';\r\n\r\nexport interface CircleOptions extends SpriteOptions {\r\n radius?: number;\r\n color?: string;\r\n outlineColor?: string;\r\n outlineWidth?: number;\r\n};\r\n\r\nexport default class Circle extends Sprite {\r\n\r\n public discriminant = 'circle';\r\n public tags = new Set(['circle']);\r\n\r\n public radius: number;\r\n public color: string;\r\n public outlineColor: string;\r\n public outlineWidth: number;\r\n\r\n public getBoundingBox(): BoundingBox {\r\n return {\r\n x: this.x,\r\n y: this.y,\r\n width: this.radius * 2 * this.size,\r\n height: this.radius * 2 * this.size\r\n };\r\n }\r\n\r\n public getPath(): Path2D {\r\n const path = new Path2D();\r\n\r\n path.ellipse(\r\n 0, 0,\r\n this.radius * this.size,\r\n this.radius * this.size,\r\n 0, 0,\r\n Math.PI * 2\r\n );\r\n\r\n return path;\r\n }\r\n\r\n public draw(stamping?: boolean): void {\r\n const c = stamping ? penCtx : ctx;\r\n\r\n c.save();\r\n\r\n const cX = this.x + canvas.width / 2;\r\n const cY = -this.y + canvas.height / 2;\r\n c.translate(cX, cY);\r\n\r\n c.rotate(this.toRadians(this.dir));\r\n\r\n const path = this.getCachedPath();\r\n\r\n c.fillStyle = this.color;\r\n c.strokeStyle = this.outlineColor;\r\n c.lineWidth = this.outlineWidth;\r\n c.fill(path)\r\n if (this.outlineWidth)\r\n c.stroke(path);\r\n\r\n c.restore();\r\n }\r\n\r\n public create(options?: CircleOptions): this {\r\n return new Circle(options) as this;\r\n }\r\n\r\n protected getCreateOptions() {\r\n return {\r\n ...super.getCreateOptions(),\r\n radius: this.radius,\r\n color: this.color,\r\n outlineColor: this.outlineColor,\r\n outlineWidth: this.outlineWidth\r\n };\r\n }\r\n\r\n public setRadius(radius: number) {\r\n this.radius = radius;\r\n this.invalidatePath();\r\n this.refresh();\r\n }\r\n\r\n public setColor(color: string) {\r\n this.color = color;\r\n this.refresh();\r\n }\r\n\r\n constructor(options?: CircleOptions) {\r\n super(options);\r\n\r\n this.radius = options?.radius ?? 25;\r\n this.color = options?.color ?? 'black';\r\n this.outlineColor = options?.outlineColor ?? 'black';\r\n this.outlineWidth = options?.outlineWidth ?? 0;\r\n \r\n this.draw();\r\n }\r\n\r\n}","import Sprite, { type BoundingBox, type SpriteOptions } from '../Sprite.ts';\r\nimport { canvas, ctx, penCtx } from '../canvas.ts';\r\n\r\nexport interface ArcOptions extends SpriteOptions {\r\n radius?: number;\r\n angle?: number;\r\n color?: string;\r\n outlineColor?: string;\r\n outlineWidth?: number;\r\n};\r\n\r\nexport default class Arc extends Sprite {\r\n\r\n public discriminant = 'arc';\r\n public tags = new Set(['arc']);\r\n\r\n public radius: number;\r\n public angle: number;\r\n public color: string;\r\n public outlineColor: string;\r\n public outlineWidth: number;\r\n\r\n public getBoundingBox(): BoundingBox {\r\n return {\r\n x: this.x,\r\n y: this.y,\r\n width: this.radius * 2 * this.size,\r\n height: this.radius * 2 * this.size\r\n };\r\n }\r\n\r\n public getPath(): Path2D {\r\n const path = new Path2D();\r\n\r\n path.arc(\r\n 0, 0,\r\n this.radius * this.size,\r\n this.toRadians(this.angle / 2 - 90),\r\n this.toRadians(-this.angle / 2 - 90)\r\n );\r\n\r\n return path;\r\n }\r\n\r\n public draw(stamping?: boolean): void {\r\n const c = stamping ? penCtx : ctx;\r\n\r\n c.save();\r\n\r\n const cX = this.x + canvas.width / 2;\r\n const cY = -this.y + canvas.height / 2;\r\n c.translate(cX, cY);\r\n\r\n c.rotate(this.toRadians(this.dir));\r\n\r\n const path = this.getCachedPath();\r\n\r\n c.fillStyle = this.color;\r\n c.strokeStyle = this.outlineColor;\r\n c.lineWidth = this.outlineWidth;\r\n c.fill(path)\r\n if (this.outlineWidth)\r\n c.stroke(path);\r\n\r\n c.restore();\r\n }\r\n\r\n public create(options?: ArcOptions): this {\r\n return new Arc(options) as this;\r\n }\r\n\r\n protected getCreateOptions() {\r\n return {\r\n ...super.getCreateOptions(),\r\n radius: this.radius,\r\n angle: this.angle,\r\n color: this.color,\r\n outlineColor: this.outlineColor,\r\n outlineWidth: this.outlineWidth\r\n };\r\n }\r\n\r\n public setRadius(radius: number) {\r\n this.radius = radius;\r\n this.invalidatePath();\r\n this.refresh();\r\n }\r\n\r\n public setAngle(angle: number) {\r\n this.angle = angle;\r\n this.invalidatePath();\r\n this.refresh();\r\n }\r\n\r\n public setColor(color: string) {\r\n this.color = color;\r\n this.refresh();\r\n }\r\n\r\n constructor(options?: ArcOptions) {\r\n super(options);\r\n\r\n this.radius = options?.radius ?? 25;\r\n this.angle = options?.angle ?? 270;\r\n this.color = options?.color ?? 'black';\r\n this.outlineColor = options?.outlineColor ?? 'black';\r\n this.outlineWidth = options?.outlineWidth ?? 0;\r\n\r\n this.draw();\r\n }\r\n\r\n}","import { canvas, ctx, penCtx } from '../canvas.ts';\r\nimport Sprite, { type BoundingBox, type SpriteOptions } from '../Sprite.ts';\r\n\r\nexport interface RegularPolygonOptions extends SpriteOptions {\r\n sides?: number;\r\n radius?: number;\r\n color?: string;\r\n outlineColor?: string;\r\n outlineWidth?: number;\r\n}\r\n\r\nexport default class RegularPolygon extends Sprite {\r\n\r\n public discriminant = 'regularpolygon';\r\n public tags = new Set(['regularpolygon']);\r\n\r\n public sides: number;\r\n public radius: number;\r\n public color: string;\r\n public outlineColor: string;\r\n public outlineWidth: number;\r\n\r\n public getBoundingBox(): BoundingBox {\r\n return {\r\n x: this.x,\r\n y: this.y,\r\n width: this.radius * 2 * this.size,\r\n height: this.radius * 2 * this.size\r\n };\r\n }\r\n\r\n public getPath(): Path2D {\r\n const path = new Path2D();\r\n \r\n const step = (2 * Math.PI) / this.sides;\r\n\r\n path.moveTo(this.radius * this.size, 0);\r\n for (let i = 1; i < this.sides; i++)\r\n path.lineTo(\r\n this.radius * Math.cos(step * i) * this.size,\r\n this.radius * Math.sin(step * i) * this.size\r\n );\r\n \r\n path.closePath();\r\n return path;\r\n }\r\n\r\n public draw(stamping?: boolean) {\r\n const c = stamping ? penCtx : ctx;\r\n\r\n c.save();\r\n\r\n const cX = this.x + canvas.width / 2;\r\n const cY = -this.y + canvas.height / 2;\r\n\r\n c.translate(cX, cY);\r\n c.rotate(this.toRadians(this.dir));\r\n\r\n const path = this.getCachedPath();\r\n\r\n c.fillStyle = this.color;\r\n c.strokeStyle = this.outlineColor;\r\n c.lineWidth = this.outlineWidth;\r\n c.fill(path)\r\n if (this.outlineWidth)\r\n c.stroke(path);\r\n\r\n c.restore();\r\n }\r\n\r\n public create(options?: RegularPolygonOptions): this {\r\n return new RegularPolygon(options) as this;\r\n }\r\n\r\n protected getCreateOptions() {\r\n return {\r\n ...super.getCreateOptions(),\r\n sides: this.sides,\r\n radius: this.radius,\r\n color: this.color,\r\n outlineColor: this.outlineColor,\r\n outlineWidth: this.outlineWidth\r\n };\r\n }\r\n\r\n public setSides(sides: number) {\r\n this.sides = sides;\r\n this.invalidatePath();\r\n this.refresh();\r\n }\r\n\r\n public setRadius(radius: number) {\r\n this.radius = radius;\r\n this.invalidatePath();\r\n this.refresh();\r\n }\r\n\r\n public setColor(color: string) {\r\n this.color = color;\r\n this.refresh();\r\n }\r\n\r\n constructor(options?: RegularPolygonOptions) {\r\n super(options);\r\n\r\n this.sides = options?.sides ?? 5;\r\n this.radius = options?.radius ?? 50;\r\n this.color = options?.color ?? 'black';\r\n this.outlineColor = options?.outlineColor ?? 'black';\r\n this.outlineWidth = options?.outlineWidth ?? 0;\r\n \r\n this.draw();\r\n }\r\n\r\n}","import Engine from '../Engine.ts';\r\nimport Sprite, { type BoundingBox, type SpriteOptions } from '../Sprite.ts';\r\nimport { canvas, ctx, penCtx } from '../canvas.ts';\r\nimport type { Vec2 } from '../types/Vectors.ts';\r\n\r\nexport interface CustomPolygonOptions extends SpriteOptions {\r\n vertices?: Vec2[];\r\n color?: string;\r\n outlineColor?: string;\r\n outlineWidth?: number;\r\n};\r\n\r\nexport default class CustomPolygon extends Sprite {\r\n\r\n public discriminant = 'custompolygon';\r\n public tags = new Set(['custompolygon']);\r\n\r\n public vertices: Vec2[];\r\n public color: string;\r\n public outlineColor: string;\r\n public outlineWidth: number;\r\n\r\n public getBoundingBox(): BoundingBox {\r\n\r\n const engine = Engine.init();\r\n\r\n const cos = engine.cos(this.dir);\r\n const sin = engine.sin(this.dir);\r\n\r\n let minX = Infinity;\r\n let maxX = -Infinity;\r\n let minY = Infinity;\r\n let maxY = -Infinity;\r\n\r\n if (this.vertices.length === 0) {\r\n return {\r\n x: this.x,\r\n y: this.y,\r\n width: 0,\r\n height: 0\r\n };\r\n }\r\n\r\n for (const v of this.vertices) {\r\n\r\n // Rotate\r\n const rx = v[0] * cos - v[1] * sin;\r\n const ry = v[0] * sin + v[1] * cos;\r\n\r\n // Translate\r\n const fx = this.x + rx;\r\n const fy = this.y + ry;\r\n\r\n if (fx < minX) minX = fx;\r\n if (fx > maxX) maxX = fx;\r\n if (fy < minY) minY = fy;\r\n if (fy > maxY) maxY = fy;\r\n }\r\n\r\n const width = maxX - minX;\r\n const height = maxY - minY;\r\n const x = minX + width / 2;\r\n const y = minY + height / 2;\r\n\r\n return {\r\n x: x * this.size,\r\n y: y * this.size,\r\n width: width * this.size,\r\n height: height * this.size\r\n };\r\n }\r\n\r\n public getPath(): Path2D {\r\n const path = new Path2D();\r\n \r\n if (this.vertices.length < 2) return path;\r\n\r\n const vertices = this.vertices as [Vec2, Vec2, ...Vec2[]];\r\n const [first, ...rest] = vertices;\r\n\r\n path.moveTo(first[0] * this.size, -first[1] * this.size);\r\n for (const v of rest) path.lineTo(v[0] * this.size, -v[1] * this.size);\r\n\r\n path.closePath();\r\n\r\n return path;\r\n }\r\n\r\n public draw(stamping?: boolean): void {\r\n const c = stamping ? penCtx : ctx;\r\n\r\n c.save();\r\n\r\n const cX = this.x + canvas.width / 2;\r\n const cY = -this.y + canvas.height / 2;\r\n\r\n c.translate(cX, cY);\r\n c.rotate(this.toRadians(this.dir));\r\n\r\n const path = this.getCachedPath();\r\n\r\n c.fillStyle = this.color;\r\n c.strokeStyle = this.outlineColor;\r\n c.lineWidth = this.outlineWidth;\r\n c.fill(path)\r\n if (this.outlineWidth)\r\n c.stroke(path);\r\n\r\n c.restore();\r\n }\r\n\r\n public create(options?: CustomPolygonOptions): this {\r\n return new CustomPolygon(options) as this;\r\n }\r\n\r\n protected getCreateOptions() {\r\n return {\r\n ...super.getCreateOptions(),\r\n vertices: this.vertices,\r\n color: this.color,\r\n outlineColor: this.outlineColor,\r\n outlineWidth: this.outlineWidth\r\n };\r\n }\r\n\r\n public setVertices(vertices: Vec2[]) {\r\n this.vertices = vertices;\r\n this.invalidatePath();\r\n this.refresh();\r\n }\r\n\r\n public setColor(color: string) {\r\n this.color = color;\r\n this.refresh();\r\n }\r\n\r\n constructor(options?: CustomPolygonOptions) {\r\n super(options);\r\n\r\n this.vertices = options?.vertices ?? [];\r\n this.color = options?.color ?? 'black';\r\n this.outlineColor = options?.outlineColor ?? 'black';\r\n this.outlineWidth = options?.outlineWidth ?? 0;\r\n\r\n this.draw();\r\n }\r\n\r\n}","import { canvas, penCtx } from '../canvas.ts';\r\nimport Sprite, { type BoundingBox, type SpriteOptions } from '../Sprite.ts';\r\n\r\nexport interface PenOptions extends SpriteOptions {\r\n drawing?: boolean;\r\n penSize?: number;\r\n color?: string;\r\n}\r\n\r\nexport default class Pen extends Sprite {\r\n\r\n public discriminant = 'pen';\r\n public tags = new Set(['pen']);\r\n\r\n public drawing: boolean;\r\n public penSize: number;\r\n public color: string;\r\n\r\n public getBoundingBox(): BoundingBox {\r\n return {\r\n x: this.x,\r\n y: this.y,\r\n width: this.penSize * this.penSize,\r\n height: this.penSize * this.penSize\r\n };\r\n }\r\n\r\n public getPath(): Path2D {\r\n return new Path2D();\r\n }\r\n public draw() {}\r\n\r\n public create(options?: PenOptions): this {\r\n return new Pen(options) as this;\r\n }\r\n\r\n protected getCreateOptions() {\r\n return {\r\n ...super.getCreateOptions(),\r\n drawing: this.drawing,\r\n penSize: this.penSize,\r\n color: this.color\r\n };\r\n }\r\n\r\n public up() {\r\n this.drawing = false;\r\n }\r\n\r\n public down() {\r\n this.drawing = true;\r\n }\r\n\r\n public stamp(sprite: Sprite) {\r\n sprite.draw(true);\r\n }\r\n\r\n public eraseAll() {\r\n penCtx.clearRect(0, 0, canvas.width, canvas.height);\r\n }\r\n\r\n public dot() {\r\n penCtx.fillStyle = this.color;\r\n penCtx.fillRect(\r\n this.x - this.penSize / 2 + canvas.width / 2,\r\n -this.y - this.penSize / 2 + canvas.height / 2,\r\n this.penSize,\r\n this.penSize\r\n );\r\n }\r\n\r\n private drawLine(lastX: number, lastY: number) {\r\n penCtx.beginPath();\r\n\r\n penCtx.moveTo(lastX + canvas.width / 2, -lastY + canvas.height / 2);\r\n penCtx.lineTo(this.x + canvas.width / 2, -this.y + canvas.height / 2);\r\n\r\n penCtx.lineWidth = this.penSize;\r\n penCtx.strokeStyle = this.color;\r\n penCtx.stroke();\r\n }\r\n\r\n // Overriding methods to include drawing\r\n\r\n public override move(steps: number) {\r\n const lastX = this.x;\r\n const lastY = this.y;\r\n\r\n this.x += steps * Math.sin(this.toRadians(this.dir));\r\n this.y += steps * Math.cos(this.toRadians(this.dir));\r\n if (this.drawing)\r\n this.drawLine(lastX, lastY);\r\n this.refresh();\r\n }\r\n\r\n public override setX(x: number) {\r\n const lastX = this.x;\r\n const lastY = this.y;\r\n\r\n this.x = x;\r\n if (this.drawing)\r\n this.drawLine(lastX, lastY);\r\n this.refresh();\r\n }\r\n\r\n public override setY(y: number) {\r\n const lastX = this.x;\r\n const lastY = this.y;\r\n\r\n this.y = y;\r\n if (this.drawing)\r\n this.drawLine(lastX, lastY);\r\n this.refresh();\r\n }\r\n\r\n public override goTo(x: number, y: number) {\r\n const lastX = this.x;\r\n const lastY = this.y;\r\n\r\n this.x = x;\r\n this.y = y;\r\n if (this.drawing)\r\n this.drawLine(lastX, lastY);\r\n this.refresh();\r\n }\r\n\r\n public override changeX(dX: number) {\r\n const lastX = this.x;\r\n const lastY = this.y;\r\n\r\n this.x += dX;\r\n if (this.drawing)\r\n this.drawLine(lastX, lastY);\r\n this.refresh();\r\n }\r\n\r\n public override changeY(dY: number) {\r\n const lastX = this.x;\r\n const lastY = this.y;\r\n\r\n this.y += dY;\r\n if (this.drawing)\r\n this.drawLine(lastX, lastY);\r\n this.refresh();\r\n }\r\n\r\n // Constructor\r\n\r\n constructor(options?: PenOptions) {\r\n super(options);\r\n \r\n this.drawing = options?.drawing ?? false;\r\n this.penSize = options?.penSize ?? 5;\r\n this.color = options?.color ?? 'black';\r\n }\r\n\r\n}","import { canvas, ctx, penCtx } from '../canvas.ts';\r\nimport Engine from '../Engine.ts';\r\nimport Sprite, { type BoundingBox, type SpriteOptions } from '../Sprite.ts';\r\n\r\nexport interface TextOptions extends SpriteOptions {\r\n content?: string | number;\r\n color?: string;\r\n fontFamily?: string;\r\n fontSize?: number;\r\n align?: CanvasTextAlign;\r\n baseline?: CanvasTextBaseline;\r\n}\r\n\r\nexport default class Text extends Sprite {\r\n\r\n public discriminant = 'text';\r\n public tags = new Set(['text']);\r\n\r\n public content: string | number;\r\n public color: string;\r\n public fontFamily: string;\r\n public fontSize: number;\r\n public align: CanvasTextAlign;\r\n public baseline: CanvasTextBaseline;\r\n\r\n private font: string;\r\n\r\n public getBoundingBox(): BoundingBox {\r\n\r\n const engine = Engine.init();\r\n\r\n const metrics = ctx.measureText(String(this.content));\r\n const w = metrics.width / 2; // half-width\r\n const h = metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent / 2; // half-height\r\n\r\n const cos = engine.cos(this.dir);\r\n const sin = engine.sin(this.dir);\r\n\r\n const width = 2 * (Math.abs(w * cos) + Math.abs(h * sin)) * this.size;\r\n const height = 2 * (Math.abs(w * sin) + Math.abs(h * cos)) * this.size;\r\n\r\n return {\r\n x: this.x,\r\n y: this.y,\r\n width, height\r\n };\r\n }\r\n\r\n public getPath(): Path2D {\r\n const path = new Path2D();\r\n\r\n ctx.save();\r\n \r\n ctx.font = this.font;\r\n\r\n const metrics = ctx.measureText(String(this.content));\r\n const width = metrics.width * this.size;\r\n const height = (metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent) * this.size;\r\n\r\n ctx.restore();\r\n\r\n path.rect(-width / 2, -height / 2, width, height);\r\n\r\n return path\r\n }\r\n\r\n public draw(stamping?: boolean) {\r\n const c = stamping ? penCtx : ctx;\r\n\r\n c.save();\r\n\r\n const cX = this.x + canvas.width / 2;\r\n const cY = -this.y + canvas.height / 2;\r\n c.translate(cX, cY);\r\n\r\n c.rotate(this.toRadians(this.dir));\r\n\r\n c.font = this.font;\r\n c.fillStyle = this.color;\r\n c.textAlign = this.align;\r\n c.textBaseline = this.baseline;\r\n\r\n c.fillText(String(this.content), 0, 0);\r\n\r\n c.restore();\r\n }\r\n\r\n public create(options?: TextOptions): this {\r\n return new Text(options) as this;\r\n }\r\n\r\n protected getCreateOptions() {\r\n return {\r\n ...super.getCreateOptions,\r\n content: this.content,\r\n color: this.color,\r\n fontFamily: this.fontFamily,\r\n fontSize: this.fontSize,\r\n align: this.align,\r\n baseline: this.baseline\r\n };\r\n }\r\n\r\n // Methods\r\n\r\n public setContent(content: string | number) {\r\n this.content = content;\r\n this.invalidatePath();\r\n this.refresh();\r\n }\r\n\r\n public setColor(color: string) {\r\n this.color = color;\r\n this.refresh();\r\n }\r\n\r\n public setFontSize(fontSize: number) {\r\n this.fontSize = fontSize;\r\n this.font = `${this.fontSize}px ${this.fontFamily}`;\r\n this.invalidatePath();\r\n this.refresh();\r\n }\r\n\r\n public setFontFamily(fontFamily: string) {\r\n this.fontFamily = fontFamily;\r\n this.font = `${this.fontSize}px ${this.fontFamily}`;\r\n this.invalidatePath();\r\n this.refresh();\r\n }\r\n\r\n public setAlign(align: CanvasTextAlign) {\r\n this.align = align;\r\n this.refresh();\r\n }\r\n\r\n public setBaseline(baseline: CanvasTextBaseline) {\r\n this.baseline = baseline;\r\n this.refresh();\r\n }\r\n\r\n // Constructor\r\n\r\n constructor(options?: TextOptions) {\r\n super(options);\r\n\r\n this.content = options?.content ?? '';\r\n this.color = options?.color ?? 'black';\r\n this.fontFamily = options?.fontFamily ?? 'Arial';\r\n this.fontSize = options?.fontSize ?? 16;\r\n this.align = options?.align ?? 'center';\r\n this.baseline = options?.baseline ?? 'middle';\r\n\r\n this.font = `${this.fontSize}px ${this.fontFamily}`;\r\n\r\n this.draw();\r\n }\r\n}","import { canvas, ctx, penCtx } from '../canvas.ts';\r\nimport Engine from '../Engine.ts';\r\nimport Sprite, { type BoundingBox, type SpriteOptions } from '../Sprite.ts';\r\n\r\nexport interface ButtonOptions extends SpriteOptions {\r\n content?: string | number;\r\n fontColor?: string;\r\n fontFamily?: string;\r\n fontSize?: number;\r\n\r\n width?: number;\r\n height?: number;\r\n backgroundColor?: string;\r\n\r\n outlineColor?: string;\r\n outlineWidth?: number;\r\n}\r\n\r\nexport default class Button extends Sprite {\r\n\r\n public discriminant = 'button';\r\n public tags = new Set(['button']);\r\n\r\n public content: string | number;\r\n public fontColor: string;\r\n public fontFamily: string;\r\n public fontSize: number;\r\n\r\n private font: string;\r\n\r\n public width: number;\r\n public height: number;\r\n public backgroundColor: string;\r\n\r\n public outlineColor: string;\r\n public outlineWidth: number;\r\n\r\n public getBoundingBox(): BoundingBox {\r\n\r\n const engine = Engine.init();\r\n\r\n ctx.save();\r\n \r\n ctx.font = this.font;\r\n\r\n const metrics = ctx.measureText(String(this.content));\r\n const w = Math.max(metrics.width, this.width) / 2; // half-width\r\n const h = Math.max(metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent, this.height) / 2; // half-height\r\n\r\n ctx.restore();\r\n\r\n const cos = engine.cos(this.dir);\r\n const sin = engine.sin(this.dir);\r\n\r\n const width = 2 * (Math.abs(w * cos) + Math.abs(h * sin)) * this.size;\r\n const height = 2 * (Math.abs(w * sin) + Math.abs(h * cos)) * this.size;\r\n\r\n return {\r\n x: this.x,\r\n y: this.y,\r\n width, height\r\n };\r\n }\r\n\r\n public getPath(): Path2D {\r\n const path = new Path2D();\r\n\r\n path.rect(\r\n -this.width / 2 * this.size,\r\n -this.height / 2 * this.size,\r\n this.width * this.size,\r\n this.height * this.size\r\n );\r\n\r\n return path\r\n }\r\n\r\n public draw(stamping?: boolean) {\r\n const c = stamping ? penCtx : ctx;\r\n\r\n c.save();\r\n\r\n const cX = this.x + canvas.width / 2;\r\n const cY = -this.y + canvas.height / 2;\r\n \r\n c.translate(cX, cY);\r\n c.rotate(this.toRadians(this.dir));\r\n\r\n c.fillStyle = this.backgroundColor;\r\n c.strokeStyle = this.outlineColor;\r\n c.lineWidth = this.outlineWidth;\r\n\r\n const path = this.getCachedPath();\r\n \r\n c.fill(path);\r\n if (this.outlineWidth) c.stroke(path);\r\n\r\n c.font = this.font;\r\n c.fillStyle = this.fontColor;\r\n c.textAlign = 'center';\r\n c.textBaseline = 'middle';\r\n\r\n c.fillText(String(this.content), 0, 0);\r\n\r\n c.restore();\r\n }\r\n\r\n public create(options?: ButtonOptions): this {\r\n return new Button(options) as this;\r\n }\r\n\r\n protected getCreateOptions() {\r\n return {\r\n ...super.getCreateOptions(),\r\n content: this.content,\r\n fontColor: this.fontColor,\r\n fontFamily: this.fontFamily,\r\n fontSize: this.fontSize,\r\n width: this.width,\r\n height: this.height,\r\n backgroundColor: this.backgroundColor,\r\n outlineColor: this.outlineColor,\r\n outlineWidth: this.outlineWidth\r\n };\r\n }\r\n\r\n // Methods\r\n\r\n public setContent(content: string | number) {\r\n this.content = content;\r\n this.invalidatePath();\r\n this.refresh();\r\n }\r\n\r\n public setBackgroundColor(color: string) {\r\n this.backgroundColor = color;\r\n this.refresh();\r\n }\r\n\r\n public setFontColor(color: string) {\r\n this.fontColor = color;\r\n this.refresh();\r\n }\r\n\r\n public setFontSize(fontSize: number) {\r\n this.fontSize = fontSize;\r\n this.font = `${this.fontSize}px ${this.fontFamily}`;\r\n this.invalidatePath();\r\n this.refresh();\r\n }\r\n\r\n public setFontFamily(fontFamily: string) {\r\n this.fontFamily = fontFamily;\r\n this.font = `${this.fontSize}px ${this.fontFamily}`;\r\n this.invalidatePath();\r\n this.refresh();\r\n }\r\n\r\n // Constructor\r\n\r\n constructor(options?: ButtonOptions) {\r\n super(options);\r\n\r\n this.content = options?.content ?? '';\r\n this.fontColor = options?.fontColor ?? 'black';\r\n this.fontFamily = options?.fontFamily ?? 'Arial';\r\n this.fontSize = options?.fontSize ?? 16;\r\n\r\n this.font = `${this.fontSize}px ${this.fontFamily}`;\r\n\r\n this.width = options?.width ?? String(this.content).length * this.fontSize + 10;\r\n this.height = options?.height ?? this.fontSize + 10;\r\n this.backgroundColor = options?.backgroundColor ?? 'rgb(204, 204, 204)';\r\n\r\n this.outlineColor = options?.outlineColor ?? 'black';\r\n this.outlineWidth = options?.outlineWidth ?? 0;\r\n\r\n this.draw();\r\n }\r\n}","import { canvas } from '../canvas.ts';\r\nimport Text, { type TextOptions } from './Text.ts';\r\n\r\nexport default class Watermark extends Text {\r\n\r\n public override tags = new Set(['text', 'watermark']);\r\n\r\n public override create(options?: TextOptions): this {\r\n return new Watermark(options) as this;\r\n }\r\n\r\n constructor(options?: TextOptions) {\r\n super(options);\r\n\r\n this.content = options?.content ?? 'Made with TScratch';\r\n this.x = options?.x ?? -canvas.width / 2 + 5,\r\n this.y = options?.y ?? canvas.height / 2 - 5,\r\n this.align = options?.align ?? 'left',\r\n this.baseline = options?.baseline ?? 'top'\r\n\r\n this.draw();\r\n }\r\n}","import { canvas, ctx, penCtx } from '../canvas.ts';\r\nimport Engine from '../Engine.ts';\r\nimport Sprite, { type BoundingBox, type SpriteOptions } from '../Sprite.ts';\r\n\r\nexport interface ImageSpriteOptions extends SpriteOptions {\r\n costumes?: string[];\r\n costumeNumber?: number;\r\n width?: number;\r\n height?: number;\r\n outlineColor?: string;\r\n outlineWidth?: number;\r\n};\r\n\r\nexport default class ImageSprite extends Sprite {\r\n\r\n public discriminant = 'imagesprite';\r\n public tags = new Set(['imagesprite']);\r\n\r\n public costumes: string[];\r\n public costumeNumber: number;\r\n public width: number;\r\n public height: number;\r\n public outlineColor: string;\r\n public outlineWidth: number;\r\n\r\n protected img: HTMLImageElement;\r\n\r\n public getBoundingBox(): BoundingBox {\r\n\r\n const engine = Engine.init();\r\n\r\n const w = this.width / 2; // half-width\r\n const h = this.height / 2; // half-height\r\n\r\n const cos = engine.cos(this.dir);\r\n const sin = engine.sin(this.dir);\r\n\r\n const width = 2 * Math.sqrt((w * cos)**2 + (h * sin)**2) * this.size;\r\n const height = 2 * Math.sqrt((w * sin)**2 + (h * cos)**2) * this.size;\r\n\r\n return {\r\n x: this.x,\r\n y: this.y,\r\n width, height\r\n };\r\n }\r\n\r\n public getPath(): Path2D {\r\n const path = new Path2D();\r\n\r\n path.rect(\r\n -this.width / 2 * this.size,\r\n -this.height / 2 * this.size,\r\n this.width * this.size,\r\n this.height * this.size\r\n );\r\n\r\n return path;\r\n }\r\n\r\n public override draw(stamping?: boolean) {\r\n const c = stamping ? penCtx : ctx;\r\n\r\n c.save();\r\n\r\n const cX = this.x + canvas.width / 2;\r\n const cY = -this.y + canvas.height / 2;\r\n c.translate(cX, cY);\r\n\r\n c.rotate(this.toRadians(this.dir));\r\n\r\n c.strokeStyle = this.outlineColor;\r\n c.lineWidth = this.outlineWidth;\r\n c.drawImage(\r\n this.img,\r\n 0, 0,\r\n this.img.width,\r\n this.img.height,\r\n -this.width / 2,\r\n -this.height / 2,\r\n this.width, this.height\r\n );\r\n if (this.outlineWidth)\r\n c.stroke(this.getCachedPath());\r\n\r\n c.restore();\r\n }\r\n\r\n public create(options?: ImageSpriteOptions): this {\r\n return new ImageSprite(options) as this;\r\n }\r\n\r\n protected getCreateOptions() {\r\n return {\r\n ...super.getCreateOptions(),\r\n costumes: this.costumes,\r\n costumeNumber: this.costumeNumber,\r\n width: this.width,\r\n height: this.height,\r\n outlineColor: this.outlineColor,\r\n outlineWidth: this.outlineWidth\r\n };\r\n }\r\n\r\n // Methods\r\n\r\n public setCostume(costumeNumber: number) {\r\n this.costumeNumber = costumeNumber < this.costumes.length && costumeNumber >= 0\r\n ? costumeNumber\r\n : 0;\r\n this.img.src = this.costumes[this.costumeNumber]!;\r\n this.img.onload = this.refresh;\r\n }\r\n\r\n public nextCostume() {\r\n this.costumeNumber = (this.costumeNumber + 1) % this.costumes.length;\r\n this.img.src = this.costumes[this.costumeNumber]!;\r\n this.img.onload = this.refresh;\r\n }\r\n\r\n public previousCostume() {\r\n this.costumeNumber--;\r\n if (this.costumeNumber < 0) this.costumeNumber = this.costumes.length - 1;\r\n\r\n this.img.src = this.costumes[this.costumeNumber]!;\r\n this.img.onload = this.refresh;\r\n }\r\n\r\n public setWidth(width: number) {\r\n this.width = width;\r\n this.invalidatePath();\r\n this.refresh();\r\n }\r\n\r\n public setHeight(height: number) {\r\n this.height = height;\r\n this.invalidatePath();\r\n this.refresh();\r\n }\r\n\r\n // Constructor\r\n\r\n constructor(options?: ImageSpriteOptions) {\r\n super(options);\r\n\r\n this.costumes = options?.costumes ?? [];\r\n this.costumeNumber = options?.costumeNumber && options.costumeNumber < this.costumes.length && options.costumeNumber >= 0\r\n ? options.costumeNumber\r\n : 0;\r\n\r\n this.img = new Image();\r\n this.img.src = this.costumes[this.costumeNumber] ?? '';\r\n\r\n this.width = options?.width ?? 0;\r\n this.height = options?.height ?? 0;\r\n\r\n this.outlineColor = options?.outlineColor ?? 'black';\r\n this.outlineWidth = options?.outlineWidth ?? 0;\r\n \r\n this.img.onload = () => {\r\n if (!options?.width) this.width = this.img.width;\r\n if (!options?.height) this.height = this.img.height;\r\n this.draw();\r\n };\r\n }\r\n}","import { canvas } from '../../canvas.ts';\r\nimport Engine from '../../Engine.ts';\r\nimport Circle, { type CircleOptions } from '../Circle.ts';\r\nimport type { RigidBodyOptions } from './RigidBodyOptions.ts';\r\n\r\nexport interface RigidCircleOptions extends CircleOptions, Partial<RigidBodyOptions> {}\r\n\r\nexport default class RigidCircle extends Circle implements RigidBodyOptions {\r\n\r\n public tags = new Set(['circle', 'rigidbody']);\r\n\r\n public gravity: number;\r\n public vX: number;\r\n public vY: number;\r\n public drag: number;\r\n public bounceLoss: number;\r\n\r\n public update() {\r\n\r\n const engine = Engine.init();\r\n\r\n this.vY += this.gravity;\r\n this.vY *= this.drag;\r\n this.vX *= this.drag;\r\n\r\n const x = this.x + this.vX;\r\n const y = this.y + this.vY;\r\n\r\n const localCircles = engine.sceneMap.get(this.scene)!.sprites.filter(s => s.discriminant === 'circle');\r\n const globalCircles = engine.sceneMap.get('*')!.sprites.filter(s => s.discriminant === 'circle');\r\n const circles = [...localCircles, ...globalCircles] as Circle[];\r\n\r\n const steps = Math.ceil(this.distanceTo(x, y) / (2 * this.radius));\r\n\r\n for (let i = 0; i < steps; i++) {\r\n for (const circle of circles) {\r\n if (this.distanceTo(circle.x, circle.y) < this.radius + circle.radius) {\r\n\r\n const nx = this.x - circle.x;\r\n const ny = this.y - circle.y;\r\n const dist = Math.sqrt(nx * nx + ny * ny);\r\n\r\n // Avoid division by zero\r\n if (dist === 0) continue;\r\n\r\n const nxn = nx / dist;\r\n const nyn = ny / dist;\r\n\r\n // Dot product of velocity and normal\r\n const dot = this.vX * nxn + this.vY * nyn;\r\n\r\n // Reflect velocity along normal and apply bounceLoss\r\n this.vX = (this.vX - 2 * dot * nxn) * this.bounceLoss;\r\n this.vY = (this.vY - 2 * dot * nyn) * this.bounceLoss;\r\n\r\n this.changeX(this.vX);\r\n this.changeY(this.vY);\r\n\r\n return;\r\n }\r\n }\r\n }\r\n\r\n this.goTo(x, y);\r\n\r\n // Bounce off canvas edges\r\n const cX = canvas.width / 2;\r\n const cY = canvas.height / 2;\r\n\r\n if (this.x - this.radius < -cX) {\r\n this.setX(-cX + this.radius);\r\n this.vX = Math.abs(this.vX) * this.bounceLoss;\r\n } else if (this.x + this.radius > cX) {\r\n this.setX(cX - this.radius);\r\n this.vX = -Math.abs(this.vX) * this.bounceLoss;\r\n }\r\n\r\n if (this.y - this.radius < -cY) {\r\n this.setY(-cY + this.radius);\r\n this.vY = Math.abs(this.vY) * this.bounceLoss;\r\n } else if (this.y + this.radius > cY) {\r\n this.setY(cY - this.radius);\r\n this.vY = -Math.abs(this.vY) * this.bounceLoss;\r\n }\r\n }\r\n\r\n constructor(options?: RigidCircleOptions) {\r\n super(options);\r\n\r\n this.gravity = options?.gravity ?? -1.8;\r\n this.drag = options?.drag ?? 0.96;\r\n this.bounceLoss = options?.bounceLoss ?? 0.9;\r\n this.vX = options?.vX ?? 0;\r\n this.vY = options?.vY ?? 0;\r\n }\r\n}"],"mappings":"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","names":["client_exports","__export","Arc","Button","Circle","CustomPolygon","Engine","ImageSprite","Multiplayer","Oval","Pen","Rectangle","RegularPolygon","RigidCircle","Sprite","Square","Text","Watermark","aspectRatio","canvas","ctx","client_default","scale","setAspectRatio","setScale","__toCommonJS","canvas","ctx","penCanvas","penCtx","aspectRatio","scale","updateSize","setScale","newScale","setAspectRatio","newAspectRatio","Sprite","_Sprite","Engine","options","sprite","bBox1","bBox2","b1Left","b1Top","b1Right","b1Bottom","b2Left","b2Top","b2Right","b2Bottom","xMin","yMin","xMax","yMax","width","height","ctx","drawSprite","color","dx","dy","img1","img2","i","deg","rad","x","y","steps","dir","dX","dY","size","dS","layer","dL","Engine","_Engine","scene","loop","sprite","layer","targetIndex","s","maxFPS","frameInterval","accumulator","tick","currentTime","deltaTime","ctx","canvas","ms","resolve","conditionGetter","check","key","value","mouseX","mouseY","canvasMouseX","canvasMouseY","localX","localY","angle","rotatedX","rotatedY","src","audio","sound","min","max","vectors","a","b","deg","val","rad","penCanvas","e","import_socket","Multiplayer","_Multiplayer","serverURL","eventName","data","callback","Rectangle","_Rectangle","Sprite","engine","Engine","w","h","cos","sin","width","height","path","stamping","c","penCtx","ctx","cX","canvas","cY","options","color","Square","_Square","Sprite","engine","Engine","s","cos","sin","size","path","stamping","c","penCtx","ctx","cX","canvas","cY","options","sideLength","color","Oval","_Oval","Sprite","engine","Engine","rX","rY","cos","sin","width","height","path","stamping","c","penCtx","ctx","cX","canvas","cY","options","radX","radY","color","Circle","_Circle","Sprite","path","stamping","c","penCtx","ctx","cX","canvas","cY","options","radius","color","Arc","_Arc","Sprite","path","stamping","c","penCtx","ctx","cX","canvas","cY","options","radius","angle","color","RegularPolygon","_RegularPolygon","Sprite","path","step","i","stamping","c","penCtx","ctx","cX","canvas","cY","options","sides","radius","color","CustomPolygon","_CustomPolygon","Sprite","engine","Engine","cos","sin","minX","maxX","minY","maxY","v","rx","ry","fx","fy","width","height","x","y","path","vertices","first","rest","stamping","c","penCtx","ctx","cX","canvas","cY","options","color","Pen","_Pen","Sprite","options","sprite","penCtx","canvas","lastX","lastY","steps","x","y","dX","dY","Text","_Text","Sprite","engine","Engine","metrics","ctx","w","h","cos","sin","width","height","path","stamping","c","penCtx","cX","canvas","cY","options","content","color","fontSize","fontFamily","align","baseline","Button","_Button","Sprite","engine","Engine","ctx","metrics","w","h","cos","sin","width","height","path","stamping","c","penCtx","cX","canvas","cY","options","content","color","fontSize","fontFamily","Watermark","_Watermark","Text","options","canvas","ImageSprite","_ImageSprite","Sprite","engine","Engine","w","h","cos","sin","width","height","path","stamping","c","penCtx","ctx","cX","canvas","cY","options","costumeNumber","RigidCircle","Circle","engine","Engine","x","y","localCircles","s","globalCircles","circles","steps","i","circle","nx","ny","dist","nxn","nyn","dot","cX","canvas","cY","options","TScratch","Engine","Sprite","Multiplayer","Rectangle","Square","Oval","Circle","Arc","RegularPolygon","CustomPolygon","Pen","Text","Button","Watermark","ImageSprite","RigidCircle","scale","aspectRatio","setScale","setAspectRatio","canvas","ctx","client_default"]}
1
+ {"version":3,"sources":["../../src/client/index.ts","../../src/client/canvas.ts","../../src/client/Sprite.ts","../../src/client/Engine.ts","../../src/client/Multiplayer.ts","../../src/client/sprites/Rectangle.ts","../../src/client/sprites/Square.ts","../../src/client/sprites/Oval.ts","../../src/client/sprites/Circle.ts","../../src/client/sprites/Arc.ts","../../src/client/sprites/RegularPolygon.ts","../../src/client/sprites/CustomPolygon.ts","../../src/client/sprites/Pen.ts","../../src/client/sprites/Text.ts","../../src/client/sprites/Button.ts","../../src/client/sprites/Watermark.ts","../../src/client/sprites/ImageSprite.ts","../../src/client/sprites/physics/RigidCircle.ts","../../src/client/sprites/3d/WireframeRenderer3D.ts","../../src/client/sprites/3d/Object3D.ts","../../src/client/sprites/3d/vertices/cube.ts","../../src/client/sprites/3d/faces/cube.ts","../../src/client/sprites/3d/vertices/tetrahedron.ts","../../src/client/sprites/3d/faces/tetrahedron.ts","../../src/client/sprites/3d/vertices/octahedron.ts","../../src/client/sprites/3d/faces/octahedron.ts"],"sourcesContent":["// Main\r\nimport Engine from './Engine.ts';\r\nimport Sprite, { type SpriteOptions } from './Sprite.ts';\r\nimport { scale, aspectRatio, setScale, setAspectRatio, canvas, ctx } from './canvas.ts';\r\n\r\n// Multiplayer\r\nimport Multiplayer from './Multiplayer.ts';\r\n\r\n// Sprites\r\nimport Rectangle, { type RectangleOptions } from './sprites/Rectangle.ts';\r\nimport Square, { type SquareOptions } from './sprites/Square.ts';\r\nimport Oval, { type OvalOptions } from './sprites/Oval.ts';\r\nimport Circle, { type CircleOptions } from './sprites/Circle.ts';\r\nimport Arc, { type ArcOptions } from './sprites/Arc.ts';\r\nimport RegularPolygon, { type RegularPolygonOptions } from './sprites/RegularPolygon.ts';\r\nimport CustomPolygon, { type CustomPolygonOptions } from './sprites/CustomPolygon.ts';\r\nimport Pen, { type PenOptions } from './sprites/Pen.ts';\r\nimport Text, { type TextOptions } from './sprites/Text.ts';\r\nimport Button, { type ButtonOptions } from './sprites/Button.ts';\r\nimport Watermark from './sprites/Watermark.ts';\r\nimport ImageSprite, { type ImageSpriteOptions } from './sprites/ImageSprite.ts';\r\n\r\nimport RigidCircle, { type RigidCircleOptions } from './sprites/physics/RigidCircle.ts';\r\n\r\n// 3D\r\nimport WireframeRenderer3D, { type WireframeRenderer3DOptions } from './sprites/3d/WireframeRenderer3D.ts';\r\nimport Object3D, { type Object3DOptions } from './sprites/3d/Object3D.ts';\r\n\r\nimport cubeVertices from './sprites/3d/vertices/cube.ts';\r\nimport cubeFaces from './sprites/3d/faces/cube.ts';\r\nimport tetrahedronVertices from './sprites/3d/vertices/tetrahedron.ts';\r\nimport tetrahedronFaces from './sprites/3d/faces/tetrahedron.ts';\r\nimport octahedronVertices from './sprites/3d/vertices/octahedron.ts';\r\nimport octahedronFaces from './sprites/3d/faces/octahedron.ts';\r\n\r\n// Types\r\nimport type { Vec2, Vec3, Vec4 } from './types/Vectors.ts';\r\nimport type { Mat2, Mat3, Mat4 } from './types/Matricies.ts';\r\nimport { type RigidBodyOptions } from './sprites/physics/RigidBodyOptions.ts';\r\n\r\nconst TScratch = {\r\n // Main\r\n Engine,\r\n Sprite,\r\n\r\n // Multiplayer\r\n Multiplayer,\r\n\r\n // Sprites\r\n Rectangle,\r\n Square,\r\n Oval,\r\n Circle,\r\n Arc,\r\n RegularPolygon,\r\n CustomPolygon,\r\n Pen,\r\n Text,\r\n Button,\r\n Watermark,\r\n ImageSprite,\r\n\r\n RigidCircle,\r\n\r\n // 3D\r\n WireframeRenderer3D,\r\n Object3D,\r\n\r\n cubeVertices,\r\n cubeFaces,\r\n tetrahedronVertices,\r\n tetrahedronFaces,\r\n octahedronVertices,\r\n octahedronFaces,\r\n\r\n // Canvas\r\n scale,\r\n aspectRatio,\r\n setScale,\r\n setAspectRatio,\r\n canvas,\r\n ctx\r\n};\r\n\r\nexport default TScratch;\r\nexport {\r\n // Main\r\n Engine,\r\n Sprite,\r\n\r\n // Multiplayer\r\n Multiplayer,\r\n\r\n // Sprites\r\n Rectangle,\r\n Square,\r\n Oval,\r\n Circle,\r\n Arc,\r\n RegularPolygon,\r\n CustomPolygon,\r\n Pen,\r\n Text,\r\n Button,\r\n Watermark,\r\n ImageSprite,\r\n\r\n RigidCircle,\r\n\r\n // 3D\r\n WireframeRenderer3D,\r\n Object3D,\r\n\r\n cubeVertices,\r\n cubeFaces,\r\n tetrahedronVertices,\r\n tetrahedronFaces,\r\n octahedronVertices,\r\n octahedronFaces,\r\n\r\n // Options\r\n type SpriteOptions,\r\n type RectangleOptions,\r\n type SquareOptions,\r\n type OvalOptions,\r\n type CircleOptions,\r\n type ArcOptions,\r\n type RegularPolygonOptions,\r\n type CustomPolygonOptions,\r\n type PenOptions,\r\n type TextOptions,\r\n type ButtonOptions,\r\n type TextOptions as WatermarkOptions,\r\n type ImageSpriteOptions,\r\n\r\n type RigidBodyOptions,\r\n type RigidCircleOptions,\r\n type WireframeRenderer3DOptions,\r\n type Object3DOptions,\r\n\r\n // Other types\r\n type Vec2,\r\n type Vec3,\r\n type Vec4,\r\n type Mat2,\r\n type Mat3,\r\n type Mat4,\r\n \r\n // Canvas\r\n scale,\r\n aspectRatio,\r\n setScale,\r\n setAspectRatio,\r\n canvas,\r\n ctx\r\n};","export const canvas = document.getElementById('game-window') as HTMLCanvasElement || document.createElement('canvas'); // For testing\r\nexport const ctx = canvas.getContext('2d')!;\r\n\r\nexport const penCanvas = document.createElement('canvas');\r\nexport const penCtx = penCanvas.getContext('2d')!;\r\n\r\nexport let aspectRatio: number = 16 / 9;\r\nexport let scale: number;\r\n\r\nfunction updateSize() {\r\n canvas.width = aspectRatio * scale;\r\n canvas.height = scale;\r\n\r\n penCanvas.width = aspectRatio * scale;\r\n penCanvas.height = scale;\r\n}\r\n\r\nexport function setScale(newScale: number) {\r\n scale = newScale;\r\n updateSize();\r\n}\r\n\r\nexport function setAspectRatio(newAspectRatio: number) {\r\n aspectRatio = newAspectRatio;\r\n updateSize();\r\n}\r\n\r\ncanvas.parentElement?.insertBefore(penCanvas, canvas);\r\n\r\nsetScale(500);","import Engine from './Engine.ts';\r\nimport type { Vec2 } from './types/Vectors.ts';\r\n\r\nexport interface BoundingBox {\r\n x: number;\r\n y: number;\r\n width: number;\r\n height: number;\r\n}\r\n\r\nexport interface SpriteOptions {\r\n x?: number;\r\n y?: number;\r\n dir?: number;\r\n size?: number;\r\n pivot?: Vec2;\r\n scene?: string;\r\n hidden?: boolean;\r\n layer?: number;\r\n}\r\n\r\nexport default abstract class Sprite {\r\n\r\n public x: number = 0;\r\n public y: number = 0;\r\n public dir: number = 0;\r\n public size: number = 1;\r\n public pivot: Vec2 = [0, 0];\r\n public scene: string = 'main';\r\n public hidden: boolean = false;\r\n public layer: number = 0;\r\n\r\n public abstract discriminant: string;\r\n public abstract tags: Set<string>;\r\n\r\n private cachedPath: Path2D | null = null;\r\n private pathDirty: boolean = true;\r\n\r\n // Reusable collision detection canvas\r\n private static collisionCanvas: OffscreenCanvas | null = null;\r\n private static collisionCtx: OffscreenCanvasRenderingContext2D | null = null;\r\n\r\n // Rendering\r\n\r\n public abstract getBoundingBox(): BoundingBox;\r\n public abstract getPath(): Path2D;\r\n public abstract draw(stamping?: true): void;\r\n protected abstract create(options?: SpriteOptions): this;\r\n\r\n protected refresh() {\r\n Engine.init().refresh();\r\n }\r\n\r\n protected invalidatePath() {\r\n this.pathDirty = true;\r\n this.cachedPath = null;\r\n }\r\n\r\n public getCachedPath(): Path2D {\r\n if (this.pathDirty || !this.cachedPath) {\r\n this.cachedPath = this.getPath();\r\n this.pathDirty = false;\r\n }\r\n return this.cachedPath;\r\n }\r\n\r\n constructor(options?: SpriteOptions) {\r\n Object.assign(this, options);\r\n Engine.init().addSprite(this);\r\n }\r\n\r\n protected getCreateOptions(): SpriteOptions & Record<string, any> {\r\n return {\r\n x: this.x,\r\n y: this.y,\r\n dir: this.dir,\r\n size: this.size,\r\n scene: this.scene,\r\n layer: this.layer,\r\n hidden: this.hidden\r\n };\r\n }\r\n\r\n public clone(options?: SpriteOptions): this {\r\n return this.create({\r\n ...this.getCreateOptions(),\r\n ...options\r\n });\r\n }\r\n\r\n // Sensing\r\n\r\n public touching(sprite: Sprite): boolean {\r\n\r\n // Return if hidden or if the scenes differ\r\n if (this.hidden || sprite.hidden || (this.scene !== '*' && sprite.scene !== '*' && this.scene !== sprite.scene)) return false;\r\n\r\n // AABB (bounding boxes)\r\n const bBox1 = this.getBoundingBox();\r\n const bBox2 = sprite.getBoundingBox();\r\n\r\n const aabbOverlap =\r\n Math.abs(bBox1.x - bBox2.x) < (bBox1.width + bBox2.width) / 2 &&\r\n Math.abs(bBox1.y - bBox2.y) < (bBox1.height + bBox2.height) / 2;\r\n\r\n if (!aabbOverlap) return false;\r\n\r\n // Image data (pixel perfect)\r\n\r\n // Compute intersection bounding box\r\n const b1Left = bBox1.x - bBox1.width / 2;\r\n const b1Top = bBox1.y + bBox1.height / 2;\r\n const b1Right = bBox1.x + bBox1.width / 2;\r\n const b1Bottom = bBox1.y - bBox1.height / 2;\r\n\r\n const b2Left = bBox2.x - bBox2.width / 2;\r\n const b2Top = bBox2.y + bBox2.height / 2;\r\n const b2Right = bBox2.x + bBox2.width / 2;\r\n const b2Bottom = bBox2.y - bBox2.height / 2;\r\n\r\n const xMin = Math.max(b1Left, b2Left);\r\n const yMin = Math.min(b1Bottom, b2Bottom);\r\n const xMax = Math.min(b1Right, b2Right);\r\n const yMax = Math.max(b1Top, b2Top);\r\n\r\n const width = xMax - xMin;\r\n const height = yMax - yMin;\r\n\r\n if (width < 1 || height < 1) return false;\r\n\r\n // Reuse or create offscreen canvas for collision detection\r\n if (!Sprite.collisionCanvas) {\r\n Sprite.collisionCanvas = new OffscreenCanvas(1, 1);\r\n Sprite.collisionCtx = Sprite.collisionCanvas.getContext('2d', { willReadFrequently: true })!;\r\n }\r\n\r\n // Prepare canvas\r\n const ctx = Sprite.collisionCtx!;\r\n if (Sprite.collisionCanvas.width < width) Sprite.collisionCanvas.width = width;\r\n if (Sprite.collisionCanvas.height < height) Sprite.collisionCanvas.height = height;\r\n ctx.clearRect(0, 0, width, height);\r\n\r\n // Helper to draw a sprite into collision canvas\r\n const drawSprite = (sprite: Sprite, color: string) => {\r\n ctx.save();\r\n\r\n // Translate to intersection box coordinates (centered)\r\n const dx = sprite.x - xMin;\r\n const dy = yMax - sprite.y; // flip Y to match draw()\r\n\r\n ctx.translate(dx, dy);\r\n ctx.rotate(sprite.toRadians(sprite.dir));\r\n\r\n ctx.fillStyle = color;\r\n ctx.fill(sprite.getCachedPath());\r\n\r\n ctx.restore();\r\n };\r\n\r\n // Draw sprite 1 in red\r\n drawSprite(this, 'red');\r\n const img1 = ctx.getImageData(0, 0, width, height).data;\r\n\r\n // Draw sprite 2 in blue\r\n ctx.clearRect(0, 0, width, height);\r\n drawSprite(sprite, 'blue');\r\n const img2 = ctx.getImageData(0, 0, width, height).data;\r\n\r\n // Check for overlapping non-transparent pixels\r\n for (let i = 3; i < img1.length; i += 4) // alpha channel\r\n if (img1[i]! > 0 && img2[i]! > 0) return true;\r\n\r\n return false;\r\n }\r\n\r\n // Helpers\r\n\r\n protected toRadians(deg: number) {\r\n return deg * Math.PI / 180;\r\n }\r\n\r\n protected toDegrees(rad: number) {\r\n return rad * 180 / Math.PI;\r\n }\r\n\r\n public distanceTo(x: number, y: number) {\r\n return Math.hypot(x - this.x, y - this.y);\r\n }\r\n\r\n // Methods\r\n\r\n // Motion\r\n public move(steps: number) {\r\n this.x += steps * Math.sin(this.toRadians(this.dir));\r\n this.y += steps * Math.cos(this.toRadians(this.dir));\r\n this.refresh();\r\n }\r\n\r\n public turn(deg: number) {\r\n this.dir += deg;\r\n this.refresh();\r\n }\r\n\r\n public point(dir: number) {\r\n this.dir = dir;\r\n this.refresh();\r\n }\r\n\r\n public pointTowards(x: number, y: number) {\r\n this.dir = 90 - this.toDegrees(Math.atan2(y - this.y, x - this.x));\r\n this.refresh();\r\n }\r\n\r\n public setX(x: number) {\r\n this.x = x;\r\n this.refresh();\r\n }\r\n\r\n public setY(y: number) {\r\n this.y = y;\r\n this.refresh();\r\n }\r\n\r\n public goTo(x: number, y: number) {\r\n this.x = x;\r\n this.y = y;\r\n this.refresh();\r\n }\r\n\r\n public changeX(dX: number) {\r\n this.x += dX;\r\n this.refresh();\r\n }\r\n\r\n public changeY(dY: number) {\r\n this.y += dY;\r\n this.refresh();\r\n }\r\n\r\n public setPivot(x: number, y: number) {\r\n this.pivot = [x, y];\r\n this.refresh();\r\n }\r\n\r\n // Looks\r\n\r\n public show() {\r\n this.hidden = false;\r\n this.refresh();\r\n }\r\n\r\n public hide() {\r\n this.hidden = true;\r\n this.refresh();\r\n }\r\n\r\n public setSize(size: number) {\r\n this.size = size > 0 ? size : 0;\r\n this.invalidatePath();\r\n this.refresh();\r\n }\r\n\r\n public changeSize(dS: number) {\r\n this.size = this.size + dS > 0 ? this.size + dS : 0;\r\n this.invalidatePath();\r\n this.refresh();\r\n }\r\n\r\n public goToLayer(layer: number) {\r\n this.layer = layer;\r\n this.refresh();\r\n }\r\n\r\n public changeLayer(dL: number) {\r\n this.layer += dL;\r\n this.refresh();\r\n }\r\n}","import { canvas, ctx, penCanvas } from './canvas.ts';\r\nimport Sprite from './Sprite.ts';\r\nimport type { Vec2, Vec3, Vec4 } from './types/Vectors.ts';\r\n\r\ntype GameLoop = (() => void) | (() => Promise<void>);\r\n\r\ntype SceneMap = Map<string, {\r\n sprites: Sprite[];\r\n loop: GameLoop | null;\r\n}>\r\n\r\nexport default class Engine {\r\n\r\n private static instance: Engine;\r\n\r\n private loopRunning: boolean = false;\r\n private gameLoop: GameLoop | null = null;\r\n\r\n public maxFPS: number = 24;\r\n public deltaTime: number = 1 / this.maxFPS;\r\n private lastFrame: number = performance.now();\r\n private refreshScheduled: boolean = false;\r\n private animationFrameId: number | null = null;\r\n\r\n private sounds: HTMLAudioElement[] = [];\r\n\r\n public mouseX: number = 0;\r\n public mouseY: number = 0;\r\n\r\n public mouseDown: boolean = false;\r\n public mouseClicked: boolean = false;\r\n\r\n private keysPressed: Set<string> = new Set<string>();\r\n\r\n private currentScene: string = 'main';\r\n public sceneMap: SceneMap = new Map();\r\n\r\n private variableMap: Map<string, unknown> = new Map();\r\n\r\n // Singleton initialization\r\n\r\n public static init() {\r\n if (!this.instance)\r\n this.instance = new Engine();\r\n\r\n return this.instance;\r\n }\r\n\r\n // Change the scene\r\n\r\n public setScene(scene: string) {\r\n if (!this.sceneMap.get(scene))\r\n this.sceneMap.set(scene, { sprites: [], loop: null });\r\n\r\n this.loopRunning = false;\r\n this.currentScene = scene;\r\n this.gameLoop = this.sceneMap.get(scene)!.loop;\r\n this.setMaxFPS(this.maxFPS); // Update the interval function\r\n }\r\n\r\n // Loops\r\n\r\n public setLoop(scene: string, loop: GameLoop) {\r\n if (!this.sceneMap.get(scene)) {\r\n this.sceneMap.set(scene, { sprites: [], loop });\r\n if (scene === this.currentScene)\r\n this.setScene(scene);\r\n return;\r\n }\r\n\r\n this.sceneMap.get(scene)!.loop = loop;\r\n if (scene === this.currentScene)\r\n this.setScene(scene);\r\n }\r\n\r\n public pauseLoop() {\r\n this.loopRunning = false;\r\n if (this.animationFrameId !== null) {\r\n cancelAnimationFrame(this.animationFrameId);\r\n this.animationFrameId = null;\r\n }\r\n }\r\n\r\n public resumeLoop() {\r\n this.loopRunning = true;\r\n void this.setMaxFPS(this.maxFPS);\r\n }\r\n\r\n // Internal\r\n\r\n public addSprite(sprite: Sprite) {\r\n const { scene, layer } = sprite;\r\n\r\n if (!this.sceneMap.get(scene)) {\r\n this.sceneMap.set(scene, { sprites: [sprite], loop: null });\r\n return;\r\n }\r\n\r\n let targetIndex = this.sceneMap.get(scene)!.sprites.findIndex(s => s.layer > layer);\r\n if (targetIndex === -1) {\r\n this.sceneMap.get(scene)!.sprites.push(sprite);\r\n return;\r\n }\r\n\r\n this.sceneMap.get(scene)!.sprites.splice(targetIndex, 0, sprite);\r\n this.refresh();\r\n }\r\n\r\n public removeSprite(sprite: Sprite) {\r\n const { scene } = sprite;\r\n\r\n if (!this.sceneMap.get(scene)) return;\r\n\r\n this.sceneMap.get(scene)!.sprites = this.sceneMap.get(scene)!.sprites.filter(s => s !== sprite);\r\n this.refresh();\r\n }\r\n\r\n public async setMaxFPS(maxFPS: number) {\r\n this.maxFPS = maxFPS;\r\n\r\n let loop = this.gameLoop;\r\n if (!loop) return;\r\n\r\n // Cancel existing animation frame if any\r\n if (this.animationFrameId !== null) {\r\n cancelAnimationFrame(this.animationFrameId);\r\n this.animationFrameId = null;\r\n }\r\n\r\n this.loopRunning = true;\r\n const frameInterval = 1000 / maxFPS;\r\n let accumulator = 0;\r\n\r\n const tick = async (currentTime: number) => {\r\n if (!this.loopRunning) return;\r\n\r\n const deltaTime = currentTime - this.lastFrame;\r\n this.lastFrame = currentTime;\r\n accumulator += deltaTime;\r\n\r\n // Fixed timestep: only run loop when enough time has passed\r\n if (accumulator >= frameInterval) {\r\n this.deltaTime = accumulator / 1000;\r\n accumulator = accumulator % frameInterval;\r\n\r\n if (loop) await loop();\r\n }\r\n\r\n this.animationFrameId = requestAnimationFrame(tick);\r\n };\r\n\r\n this.lastFrame = performance.now();\r\n this.animationFrameId = requestAnimationFrame(tick);\r\n }\r\n\r\n public refresh() {\r\n if (this.refreshScheduled) return;\r\n this.refreshScheduled = true;\r\n\r\n requestAnimationFrame(() => {\r\n this.refreshScheduled = false;\r\n ctx.clearRect(0, 0, canvas.width, canvas.height);\r\n const sprites = [\r\n ...this.sceneMap.get(this.currentScene)!.sprites,\r\n ...this.sceneMap.get('*')!.sprites\r\n ];\r\n sprites.forEach(sprite => {\r\n if (!sprite.hidden)\r\n sprite.draw();\r\n });\r\n });\r\n }\r\n\r\n // Wait functions\r\n\r\n public async wait(ms: number): Promise<void> {\r\n return new Promise(resolve => setTimeout(resolve, ms));\r\n }\r\n\r\n public async waitUntil(conditionGetter: () => boolean): Promise<void> {\r\n return new Promise(resolve => {\r\n const check = () => {\r\n if (conditionGetter()) resolve();\r\n else setTimeout(check, 1000 / this.maxFPS);\r\n }\r\n check();\r\n });\r\n }\r\n\r\n // Global variables\r\n\r\n public setVariable<T = any>(key: string, value: T) {\r\n this.variableMap.set(key, value);\r\n }\r\n\r\n public getVariable<T = unknown>(key: string) {\r\n return this.variableMap.get(key) as T;\r\n }\r\n\r\n // Events\r\n\r\n public hovering(sprite: Sprite) {\r\n const { mouseX, mouseY } = this;\r\n\r\n const canvasMouseX = mouseX + canvas.width / 2;\r\n const canvasMouseY = canvas.height / 2 - mouseY;\r\n\r\n // Mouse relative to sprite center\r\n const localX = canvasMouseX - (sprite.x + canvas.width / 2);\r\n const localY = canvasMouseY - (canvas.height / 2 - sprite.y);\r\n\r\n // Rotate mouse point by -dir to align with the path's local coordinates\r\n const angle = -this.toRadians(sprite.dir);\r\n const rotatedX = localX * Math.cos(angle) - localY * Math.sin(angle);\r\n const rotatedY = localX * Math.sin(angle) + localY * Math.cos(angle);\r\n\r\n return ctx.isPointInPath(sprite.getCachedPath(), rotatedX, rotatedY);\r\n }\r\n\r\n public keyPressed(key: string) {\r\n switch (key) {\r\n case 'any': return this.keysPressed.size > 0;\r\n\r\n case 'up': return this.keysPressed.has('ArrowUp');\r\n case 'down': return this.keysPressed.has('ArrowDown');\r\n case 'left': return this.keysPressed.has('ArrowLeft');\r\n case 'right': return this.keysPressed.has('ArrowRight');\r\n\r\n case 'space': return this.keysPressed.has(' ');\r\n\r\n default: return this.keysPressed.has(key);\r\n }\r\n }\r\n\r\n // Sound\r\n\r\n public playSound(src: string) {\r\n const audio = new Audio(src);\r\n this.sounds.push(audio);\r\n\r\n audio.play();\r\n\r\n return audio;\r\n }\r\n\r\n public stopSound(sound: HTMLAudioElement) {\r\n sound.pause();\r\n sound.currentTime = 0;\r\n this.sounds = this.sounds.filter(s => s !== sound);\r\n }\r\n\r\n public stopAllSounds() {\r\n this.sounds.forEach(sound => {\r\n sound.pause();\r\n sound.currentTime = 0;\r\n });\r\n this.sounds = [];\r\n }\r\n\r\n // Math\r\n\r\n public pickRandom(min: number, max: number) {\r\n if (min > max)\r\n [min, max] = [max, min];\r\n return Math.floor(Math.random() * (max - min + 1) + min);\r\n }\r\n\r\n public dotProduct(...vectors: [Vec2, Vec2] | [Vec3, Vec3] | [Vec4, Vec4]) {\r\n const [a, b] = vectors;\r\n\r\n switch (a.length) {\r\n case 2: return a[0] * b[0] + a[1] * b[1];\r\n case 3: return a[0] * b[0] + a[1] * b[1] + a[2] * b[2]!;\r\n case 4: return a[0] * b[0] + a[1] * b[1] + a[2] * b[2]! + a[3] * b[3]!; // TypeScript doesn't narrow down the types on b\r\n }\r\n }\r\n\r\n // Trigonometric functions\r\n public sin(deg: number) {\r\n return Math.sin(this.toRadians(deg));\r\n }\r\n\r\n public cos(deg: number) {\r\n return Math.cos(this.toRadians(deg));\r\n }\r\n\r\n public tan(deg: number) {\r\n return Math.tan(this.toRadians(deg));\r\n }\r\n\r\n public csc(deg: number) {\r\n return 1 / Math.sin(this.toRadians(deg));\r\n }\r\n\r\n public sec(deg: number) {\r\n return 1 / Math.cos(this.toRadians(deg));\r\n }\r\n\r\n public cot(deg: number) {\r\n return 1 / Math.tan(this.toRadians(deg));\r\n }\r\n\r\n // Inverse Trigonometric functions\r\n public asin(val: number) {\r\n return this.toDegrees(Math.asin(val));\r\n }\r\n\r\n public acos(val: number) {\r\n return this.toDegrees(Math.acos(val));\r\n }\r\n\r\n public acsc(val: number) {\r\n return this.toDegrees(Math.asin(1 / val));\r\n }\r\n\r\n public asec(val: number) {\r\n return this.toDegrees(Math.acos(1 / val));\r\n }\r\n\r\n // Helpers\r\n\r\n public toRadians(deg: number) {\r\n return deg * Math.PI / 180;\r\n }\r\n\r\n public toDegrees(rad: number) {\r\n return rad * 180 / Math.PI;\r\n }\r\n\r\n // Private constructor\r\n\r\n private constructor() {\r\n void this.setMaxFPS(24);\r\n this.sceneMap.set('main', { loop: null, sprites: [] });\r\n this.sceneMap.set('*', { loop: null, sprites: [] });\r\n\r\n // Events\r\n\r\n // Mouse\r\n penCanvas.addEventListener('mousemove', e => {\r\n this.mouseX = e.clientX - penCanvas.offsetLeft - penCanvas.width / 2;\r\n this.mouseY = -(e.clientY - penCanvas.offsetTop - penCanvas.height / 2);\r\n });\r\n penCanvas.addEventListener('mousedown', () => {\r\n this.mouseDown = true;\r\n });\r\n penCanvas.addEventListener('mouseup', () => {\r\n this.mouseDown = false;\r\n });\r\n penCanvas.addEventListener('click', () => {\r\n this.mouseClicked = true;\r\n setTimeout(() => this.mouseClicked = false, 0);\r\n });\r\n\r\n // Keys\r\n addEventListener('keydown', e => {\r\n if (e.repeat) return;\r\n this.keysPressed.add(e.key);\r\n });\r\n\r\n addEventListener('keyup', e => {\r\n this.keysPressed.delete(e.key);\r\n });\r\n }\r\n}","import { io, Socket } from 'socket.io-client';\r\n\r\nexport default class Multiplayer {\r\n\r\n private static instance: Multiplayer;\r\n private socket: Socket;\r\n\r\n public static connect(serverURL: string = 'http://localhost:3000') {\r\n if (!this.instance)\r\n this.instance = new Multiplayer(serverURL);\r\n\r\n return this.instance;\r\n }\r\n\r\n public disconnect() {\r\n this.socket.disconnect();\r\n }\r\n\r\n private constructor(serverURL: string) {\r\n this.socket = io(serverURL);\r\n }\r\n\r\n // Methods\r\n\r\n public broadcast<T = unknown>(eventName: string, data: T) {\r\n this.socket.emit(eventName, data);\r\n }\r\n\r\n public on<T = unknown>(eventName: string, callback: (data: T) => void) {\r\n this.socket.on(eventName, callback);\r\n }\r\n}","import Engine from '../Engine.ts';\r\nimport Sprite, { type BoundingBox, type SpriteOptions } from '../Sprite.ts';\r\nimport { ctx, canvas, penCtx } from '../canvas.ts';\r\n\r\nexport interface RectangleOptions extends SpriteOptions {\r\n width?: number;\r\n height?: number;\r\n color?: string;\r\n outlineColor?: string;\r\n outlineWidth?: number;\r\n};\r\n\r\nexport default class Rectangle extends Sprite {\r\n\r\n public discriminant = 'rectangle';\r\n public tags = new Set(['rectangle']);\r\n\r\n public width: number;\r\n public height: number;\r\n public color: string;\r\n public outlineColor: string;\r\n public outlineWidth: number;\r\n\r\n public getBoundingBox(): BoundingBox {\r\n\r\n const engine = Engine.init();\r\n\r\n const w = this.width / 2; // half-width\r\n const h = this.height / 2; // half-height\r\n\r\n const cos = engine.cos(this.dir);\r\n const sin = engine.sin(this.dir);\r\n\r\n const width = 2 * (Math.abs(w * cos) + Math.abs(h * sin)) * this.size;\r\n const height = 2 * (Math.abs(w * sin) + Math.abs(h * cos)) * this.size;\r\n\r\n return {\r\n x: this.x,\r\n y: this.y,\r\n width, height\r\n };\r\n }\r\n\r\n public getPath(): Path2D {\r\n const path = new Path2D();\r\n\r\n path.rect(\r\n -this.width / 2 * this.size,\r\n -this.height / 2 * this.size,\r\n this.width * this.size,\r\n this.height * this.size\r\n );\r\n\r\n return path;\r\n }\r\n\r\n public draw(stamping?: true): void {\r\n const c = stamping ? penCtx : ctx;\r\n\r\n c.save();\r\n\r\n const cX = this.x + canvas.width / 2;\r\n const cY = -this.y + canvas.height / 2;\r\n c.translate(cX, cY);\r\n c.rotate(this.toRadians(this.dir));\r\n c.translate(-this.pivot[0], this.pivot[1]);\r\n\r\n const path = this.getCachedPath();\r\n\r\n c.fillStyle = this.color;\r\n c.strokeStyle = this.outlineColor;\r\n c.lineWidth = this.outlineWidth;\r\n c.fill(path)\r\n if (this.outlineWidth)\r\n c.stroke(path);\r\n\r\n c.restore();\r\n }\r\n\r\n public create(options?: RectangleOptions): this {\r\n return new Rectangle(options) as this;\r\n }\r\n\r\n protected getCreateOptions() {\r\n return {\r\n ...super.getCreateOptions(),\r\n width: this.width,\r\n height: this.height,\r\n color: this.color,\r\n outlineColor: this.outlineColor,\r\n outlineWidth: this.outlineWidth\r\n };\r\n }\r\n\r\n public setWidth(width: number) {\r\n this.width = width;\r\n this.invalidatePath();\r\n this.refresh();\r\n }\r\n\r\n public setHeight(height: number) {\r\n this.height = height;\r\n this.invalidatePath();\r\n this.refresh();\r\n }\r\n\r\n public setColor(color: string) {\r\n this.color = color;\r\n this.refresh();\r\n }\r\n\r\n constructor(options?: RectangleOptions) {\r\n super(options);\r\n\r\n this.width = options?.width ?? 50;\r\n this.height = options?.height ?? 50;\r\n this.color = options?.color ?? 'black';\r\n this.outlineColor = options?.outlineColor ?? 'black';\r\n this.outlineWidth = options?.outlineWidth ?? 0;\r\n \r\n this.draw();\r\n }\r\n\r\n}","import Engine from '../Engine.ts';\r\nimport Sprite, { type BoundingBox, type SpriteOptions } from '../Sprite.ts';\r\nimport { ctx, canvas, penCtx } from '../canvas.ts';\r\n\r\nexport interface SquareOptions extends SpriteOptions {\r\n sideLength?: number;\r\n color?: string;\r\n outlineColor?: string;\r\n outlineWidth?: number;\r\n};\r\n\r\nexport default class Square extends Sprite {\r\n\r\n public discriminant = 'square';\r\n public tags = new Set(['square']);\r\n\r\n public sideLength: number;\r\n public color: string;\r\n public outlineColor: string;\r\n public outlineWidth: number;\r\n\r\n public getBoundingBox(): BoundingBox {\r\n\r\n const engine = Engine.init();\r\n\r\n const s = this.sideLength / 2;\r\n\r\n const cos = engine.cos(this.dir);\r\n const sin = engine.sin(this.dir);\r\n\r\n const size = 2 * (Math.abs(s * cos) + Math.abs(s * sin)) * this.size;\r\n\r\n return {\r\n x: this.x,\r\n y: this.y,\r\n width: size,\r\n height: size\r\n };\r\n }\r\n\r\n public getPath(): Path2D {\r\n const path = new Path2D();\r\n\r\n path.rect(\r\n -this.sideLength / 2 * this.size,\r\n -this.sideLength / 2 * this.size,\r\n this.sideLength * this.size,\r\n this.sideLength * this.size\r\n );\r\n\r\n return path;\r\n }\r\n\r\n public draw(stamping?: true): void {\r\n const c = stamping ? penCtx : ctx;\r\n\r\n c.save();\r\n\r\n const cX = this.x + canvas.width / 2;\r\n const cY = -this.y + canvas.height / 2;\r\n c.translate(cX, cY);\r\n c.rotate(this.toRadians(this.dir));\r\n c.translate(-this.pivot[0], this.pivot[1]);\r\n\r\n const path = this.getCachedPath();\r\n\r\n c.fillStyle = this.color;\r\n c.strokeStyle = this.outlineColor;\r\n c.lineWidth = this.outlineWidth;\r\n c.fill(path)\r\n if (this.outlineWidth)\r\n c.stroke(path);\r\n\r\n c.restore();\r\n }\r\n\r\n public create(options?: SquareOptions): this {\r\n return new Square(options) as this;\r\n }\r\n\r\n protected getCreateOptions() {\r\n return {\r\n ...super.getCreateOptions(),\r\n sideLength: this.sideLength,\r\n color: this.color,\r\n outlineColor: this.outlineColor,\r\n outlineWidth: this.outlineWidth\r\n };\r\n }\r\n\r\n public setSideLength(sideLength: number) {\r\n this.sideLength = sideLength;\r\n this.invalidatePath();\r\n this.refresh();\r\n }\r\n\r\n public setColor(color: string) {\r\n this.color = color;\r\n this.refresh();\r\n }\r\n\r\n constructor(options?: SquareOptions) {\r\n super(options);\r\n this.sideLength = options?.sideLength ?? 50;\r\n this.color = options?.color ?? 'black';\r\n this.outlineColor = options?.outlineColor ?? 'black';\r\n this.outlineWidth = options?.outlineWidth ?? 0;\r\n this.draw();\r\n }\r\n\r\n}","import Engine from '../Engine.ts';\r\nimport Sprite, { type BoundingBox, type SpriteOptions } from '../Sprite.ts';\r\nimport { canvas, ctx, penCtx } from '../canvas.ts';\r\n\r\nexport interface OvalOptions extends SpriteOptions {\r\n radX?: number;\r\n radY?: number;\r\n color?: string;\r\n outlineColor?: string;\r\n outlineWidth?: number;\r\n};\r\n\r\nexport default class Oval extends Sprite {\r\n\r\n public discriminant = 'oval';\r\n public tags = new Set(['oval']);\r\n\r\n public radX: number;\r\n public radY: number;\r\n public color: string;\r\n public outlineColor: string;\r\n public outlineWidth: number;\r\n\r\n public getBoundingBox(): BoundingBox {\r\n\r\n const engine = Engine.init();\r\n\r\n const rX = this.radX;\r\n const rY = this.radY;\r\n\r\n const cos = engine.cos(this.dir);\r\n const sin = engine.sin(this.dir);\r\n\r\n const width = 2 * (Math.abs(rX * cos) + Math.abs(rY * sin)) * this.size;\r\n const height = 2 * (Math.abs(rX * sin) + Math.abs(rY * cos)) * this.size;\r\n\r\n return {\r\n x: this.x,\r\n y: this.y,\r\n width, height\r\n };\r\n }\r\n\r\n public getPath(): Path2D {\r\n const path = new Path2D();\r\n\r\n path.ellipse(\r\n 0, 0,\r\n this.radX * this.size,\r\n this.radY * this.size,\r\n 0, 0,\r\n Math.PI * 2\r\n );\r\n\r\n return path;\r\n }\r\n\r\n public draw(stamping?: true): void {\r\n const c = stamping ? penCtx : ctx;\r\n\r\n c.save();\r\n\r\n const cX = this.x + canvas.width / 2;\r\n const cY = -this.y + canvas.height / 2;\r\n c.translate(cX, cY);\r\n c.rotate(this.toRadians(this.dir));\r\n c.translate(-this.pivot[0], this.pivot[1]);\r\n\r\n const path = this.getCachedPath();\r\n\r\n c.fillStyle = this.color;\r\n c.strokeStyle = this.outlineColor;\r\n c.lineWidth = this.outlineWidth;\r\n c.fill(path)\r\n if (this.outlineWidth)\r\n c.stroke(path);\r\n\r\n c.restore();\r\n }\r\n\r\n public create(options?: OvalOptions): this {\r\n return new Oval(options) as this;\r\n }\r\n\r\n protected getCreateOptions() {\r\n return {\r\n ...super.getCreateOptions(),\r\n radX: this.radX,\r\n radY: this.radY,\r\n color: this.color,\r\n outlineColor: this.outlineColor,\r\n outlineWidth: this.outlineWidth\r\n };\r\n }\r\n\r\n public setRadX(radX: number) {\r\n this.radX = radX;\r\n this.invalidatePath();\r\n this.refresh();\r\n }\r\n\r\n public setRadY(radY: number) {\r\n this.radY = radY;\r\n this.invalidatePath();\r\n this.refresh();\r\n }\r\n\r\n public setColor(color: string) {\r\n this.color = color;\r\n this.refresh();\r\n }\r\n\r\n constructor(options?: OvalOptions) {\r\n super(options);\r\n\r\n this.radX = options?.radX ?? 25;\r\n this.radY = options?.radY ?? 25;\r\n this.color = options?.color ?? 'black';\r\n this.outlineColor = options?.outlineColor ?? 'black';\r\n this.outlineWidth = options?.outlineWidth ?? 0;\r\n \r\n this.draw();\r\n }\r\n\r\n}","import Engine from '../Engine.ts';\r\nimport Sprite, { type BoundingBox, type SpriteOptions } from '../Sprite.ts';\r\nimport { canvas, ctx, penCtx } from '../canvas.ts';\r\n\r\nexport interface CircleOptions extends SpriteOptions {\r\n radius?: number;\r\n color?: string;\r\n outlineColor?: string;\r\n outlineWidth?: number;\r\n};\r\n\r\nexport default class Circle extends Sprite {\r\n\r\n public discriminant = 'circle';\r\n public tags = new Set(['circle']);\r\n\r\n public radius: number;\r\n public color: string;\r\n public outlineColor: string;\r\n public outlineWidth: number;\r\n\r\n public getBoundingBox(): BoundingBox {\r\n return {\r\n x: this.x,\r\n y: this.y,\r\n width: this.radius * 2 * this.size,\r\n height: this.radius * 2 * this.size\r\n };\r\n }\r\n\r\n public getPath(): Path2D {\r\n const path = new Path2D();\r\n\r\n path.ellipse(\r\n 0, 0,\r\n this.radius * this.size,\r\n this.radius * this.size,\r\n 0, 0,\r\n Math.PI * 2\r\n );\r\n\r\n return path;\r\n }\r\n\r\n public draw(stamping?: true): void {\r\n const c = stamping ? penCtx : ctx;\r\n\r\n c.save();\r\n\r\n const cX = this.x + canvas.width / 2;\r\n const cY = -this.y + canvas.height / 2;\r\n c.translate(cX, cY);\r\n c.rotate(this.toRadians(this.dir));\r\n c.translate(-this.pivot[0], this.pivot[1]);\r\n\r\n const path = this.getCachedPath();\r\n\r\n c.fillStyle = this.color;\r\n c.strokeStyle = this.outlineColor;\r\n c.lineWidth = this.outlineWidth;\r\n c.fill(path)\r\n if (this.outlineWidth)\r\n c.stroke(path);\r\n\r\n c.restore();\r\n }\r\n\r\n public create(options?: CircleOptions): this {\r\n return new Circle(options) as this;\r\n }\r\n\r\n protected getCreateOptions() {\r\n return {\r\n ...super.getCreateOptions(),\r\n radius: this.radius,\r\n color: this.color,\r\n outlineColor: this.outlineColor,\r\n outlineWidth: this.outlineWidth\r\n };\r\n }\r\n\r\n public setRadius(radius: number) {\r\n this.radius = radius;\r\n this.invalidatePath();\r\n this.refresh();\r\n }\r\n\r\n public setColor(color: string) {\r\n this.color = color;\r\n this.refresh();\r\n }\r\n\r\n constructor(options?: CircleOptions) {\r\n super(options);\r\n\r\n this.radius = options?.radius ?? 25;\r\n this.color = options?.color ?? 'black';\r\n this.outlineColor = options?.outlineColor ?? 'black';\r\n this.outlineWidth = options?.outlineWidth ?? 0;\r\n \r\n this.draw();\r\n }\r\n\r\n}","import Sprite, { type BoundingBox, type SpriteOptions } from '../Sprite.ts';\r\nimport { canvas, ctx, penCtx } from '../canvas.ts';\r\n\r\nexport interface ArcOptions extends SpriteOptions {\r\n radius?: number;\r\n angle?: number;\r\n color?: string;\r\n outlineColor?: string;\r\n outlineWidth?: number;\r\n};\r\n\r\nexport default class Arc extends Sprite {\r\n\r\n public discriminant = 'arc';\r\n public tags = new Set(['arc']);\r\n\r\n public radius: number;\r\n public angle: number;\r\n public color: string;\r\n public outlineColor: string;\r\n public outlineWidth: number;\r\n\r\n public getBoundingBox(): BoundingBox {\r\n return {\r\n x: this.x,\r\n y: this.y,\r\n width: this.radius * 2 * this.size,\r\n height: this.radius * 2 * this.size\r\n };\r\n }\r\n\r\n public getPath(): Path2D {\r\n const path = new Path2D();\r\n\r\n path.arc(\r\n 0, 0,\r\n this.radius * this.size,\r\n this.toRadians(this.angle / 2 - 90),\r\n this.toRadians(-this.angle / 2 - 90)\r\n );\r\n\r\n return path;\r\n }\r\n\r\n public draw(stamping?: true): void {\r\n const c = stamping ? penCtx : ctx;\r\n\r\n c.save();\r\n\r\n const cX = this.x + canvas.width / 2;\r\n const cY = -this.y + canvas.height / 2;\r\n c.translate(cX, cY);\r\n c.rotate(this.toRadians(this.dir));\r\n c.translate(-this.pivot[0], this.pivot[1]);\r\n\r\n const path = this.getCachedPath();\r\n\r\n c.fillStyle = this.color;\r\n c.strokeStyle = this.outlineColor;\r\n c.lineWidth = this.outlineWidth;\r\n c.fill(path)\r\n if (this.outlineWidth)\r\n c.stroke(path);\r\n\r\n c.restore();\r\n }\r\n\r\n public create(options?: ArcOptions): this {\r\n return new Arc(options) as this;\r\n }\r\n\r\n protected getCreateOptions() {\r\n return {\r\n ...super.getCreateOptions(),\r\n radius: this.radius,\r\n angle: this.angle,\r\n color: this.color,\r\n outlineColor: this.outlineColor,\r\n outlineWidth: this.outlineWidth\r\n };\r\n }\r\n\r\n public setRadius(radius: number) {\r\n this.radius = radius;\r\n this.invalidatePath();\r\n this.refresh();\r\n }\r\n\r\n public setAngle(angle: number) {\r\n this.angle = angle;\r\n this.invalidatePath();\r\n this.refresh();\r\n }\r\n\r\n public setColor(color: string) {\r\n this.color = color;\r\n this.refresh();\r\n }\r\n\r\n constructor(options?: ArcOptions) {\r\n super(options);\r\n\r\n this.radius = options?.radius ?? 25;\r\n this.angle = options?.angle ?? 270;\r\n this.color = options?.color ?? 'black';\r\n this.outlineColor = options?.outlineColor ?? 'black';\r\n this.outlineWidth = options?.outlineWidth ?? 0;\r\n\r\n this.draw();\r\n }\r\n\r\n}","import { canvas, ctx, penCtx } from '../canvas.ts';\r\nimport Sprite, { type BoundingBox, type SpriteOptions } from '../Sprite.ts';\r\n\r\nexport interface RegularPolygonOptions extends SpriteOptions {\r\n sides?: number;\r\n radius?: number;\r\n color?: string;\r\n outlineColor?: string;\r\n outlineWidth?: number;\r\n}\r\n\r\nexport default class RegularPolygon extends Sprite {\r\n\r\n public discriminant = 'regularpolygon';\r\n public tags = new Set(['regularpolygon']);\r\n\r\n public sides: number;\r\n public radius: number;\r\n public color: string;\r\n public outlineColor: string;\r\n public outlineWidth: number;\r\n\r\n public getBoundingBox(): BoundingBox {\r\n return {\r\n x: this.x,\r\n y: this.y,\r\n width: this.radius * 2 * this.size,\r\n height: this.radius * 2 * this.size\r\n };\r\n }\r\n\r\n public getPath(): Path2D {\r\n const path = new Path2D();\r\n \r\n const step = (2 * Math.PI) / this.sides;\r\n\r\n path.moveTo(this.radius * this.size, 0);\r\n for (let i = 1; i < this.sides; i++)\r\n path.lineTo(\r\n this.radius * Math.cos(step * i) * this.size,\r\n this.radius * Math.sin(step * i) * this.size\r\n );\r\n \r\n path.closePath();\r\n return path;\r\n }\r\n\r\n public draw(stamping?: true) {\r\n const c = stamping ? penCtx : ctx;\r\n\r\n c.save();\r\n\r\n const cX = this.x + canvas.width / 2;\r\n const cY = -this.y + canvas.height / 2;\r\n c.translate(cX, cY);\r\n c.rotate(this.toRadians(this.dir));\r\n c.translate(-this.pivot[0], this.pivot[1]);\r\n\r\n const path = this.getCachedPath();\r\n\r\n c.fillStyle = this.color;\r\n c.strokeStyle = this.outlineColor;\r\n c.lineWidth = this.outlineWidth;\r\n c.fill(path)\r\n if (this.outlineWidth)\r\n c.stroke(path);\r\n\r\n c.restore();\r\n }\r\n\r\n public create(options?: RegularPolygonOptions): this {\r\n return new RegularPolygon(options) as this;\r\n }\r\n\r\n protected getCreateOptions() {\r\n return {\r\n ...super.getCreateOptions(),\r\n sides: this.sides,\r\n radius: this.radius,\r\n color: this.color,\r\n outlineColor: this.outlineColor,\r\n outlineWidth: this.outlineWidth\r\n };\r\n }\r\n\r\n public setSides(sides: number) {\r\n this.sides = sides;\r\n this.invalidatePath();\r\n this.refresh();\r\n }\r\n\r\n public setRadius(radius: number) {\r\n this.radius = radius;\r\n this.invalidatePath();\r\n this.refresh();\r\n }\r\n\r\n public setColor(color: string) {\r\n this.color = color;\r\n this.refresh();\r\n }\r\n\r\n constructor(options?: RegularPolygonOptions) {\r\n super(options);\r\n\r\n this.sides = options?.sides ?? 5;\r\n this.radius = options?.radius ?? 50;\r\n this.color = options?.color ?? 'black';\r\n this.outlineColor = options?.outlineColor ?? 'black';\r\n this.outlineWidth = options?.outlineWidth ?? 0;\r\n \r\n this.draw();\r\n }\r\n\r\n}","import Engine from '../Engine.ts';\r\nimport Sprite, { type BoundingBox, type SpriteOptions } from '../Sprite.ts';\r\nimport { canvas, ctx, penCtx } from '../canvas.ts';\r\nimport type { Vec2 } from '../types/Vectors.ts';\r\n\r\nexport interface CustomPolygonOptions extends SpriteOptions {\r\n vertices?: Vec2[];\r\n color?: string;\r\n outlineColor?: string;\r\n outlineWidth?: number;\r\n};\r\n\r\nexport default class CustomPolygon extends Sprite {\r\n\r\n public discriminant = 'custompolygon';\r\n public tags = new Set(['custompolygon']);\r\n\r\n public vertices: Vec2[];\r\n public color: string;\r\n public outlineColor: string;\r\n public outlineWidth: number;\r\n\r\n public getBoundingBox(): BoundingBox {\r\n\r\n const engine = Engine.init();\r\n\r\n const cos = engine.cos(this.dir);\r\n const sin = engine.sin(this.dir);\r\n\r\n let minX = Infinity;\r\n let maxX = -Infinity;\r\n let minY = Infinity;\r\n let maxY = -Infinity;\r\n\r\n if (this.vertices.length === 0) {\r\n return {\r\n x: this.x,\r\n y: this.y,\r\n width: 0,\r\n height: 0\r\n };\r\n }\r\n\r\n for (const v of this.vertices) {\r\n\r\n // Rotate\r\n const rx = v[0] * cos - v[1] * sin;\r\n const ry = v[0] * sin + v[1] * cos;\r\n\r\n // Translate\r\n const fx = this.x + rx;\r\n const fy = this.y + ry;\r\n\r\n if (fx < minX) minX = fx;\r\n if (fx > maxX) maxX = fx;\r\n if (fy < minY) minY = fy;\r\n if (fy > maxY) maxY = fy;\r\n }\r\n\r\n const width = maxX - minX;\r\n const height = maxY - minY;\r\n const x = minX + width / 2;\r\n const y = minY + height / 2;\r\n\r\n return {\r\n x: x * this.size,\r\n y: y * this.size,\r\n width: width * this.size,\r\n height: height * this.size\r\n };\r\n }\r\n\r\n public getPath(): Path2D {\r\n const path = new Path2D();\r\n \r\n if (this.vertices.length < 2) return path;\r\n\r\n const vertices = this.vertices as [Vec2, Vec2, ...Vec2[]];\r\n const [first, ...rest] = vertices;\r\n\r\n path.moveTo(first[0] * this.size, -first[1] * this.size);\r\n for (const v of rest) path.lineTo(v[0] * this.size, -v[1] * this.size);\r\n\r\n path.closePath();\r\n\r\n return path;\r\n }\r\n\r\n public draw(stamping?: true): void {\r\n const c = stamping ? penCtx : ctx;\r\n\r\n c.save();\r\n\r\n const cX = this.x + canvas.width / 2;\r\n const cY = -this.y + canvas.height / 2;\r\n c.translate(cX, cY);\r\n c.rotate(this.toRadians(this.dir));\r\n c.translate(-this.pivot[0], this.pivot[1]);\r\n\r\n const path = this.getCachedPath();\r\n\r\n c.fillStyle = this.color;\r\n c.strokeStyle = this.outlineColor;\r\n c.lineWidth = this.outlineWidth;\r\n c.fill(path)\r\n if (this.outlineWidth)\r\n c.stroke(path);\r\n\r\n c.restore();\r\n }\r\n\r\n public create(options?: CustomPolygonOptions): this {\r\n return new CustomPolygon(options) as this;\r\n }\r\n\r\n protected getCreateOptions() {\r\n return {\r\n ...super.getCreateOptions(),\r\n vertices: this.vertices,\r\n color: this.color,\r\n outlineColor: this.outlineColor,\r\n outlineWidth: this.outlineWidth\r\n };\r\n }\r\n\r\n public setVertices(vertices: Vec2[]) {\r\n this.vertices = vertices;\r\n this.invalidatePath();\r\n this.refresh();\r\n }\r\n\r\n public setColor(color: string) {\r\n this.color = color;\r\n this.refresh();\r\n }\r\n\r\n constructor(options?: CustomPolygonOptions) {\r\n super(options);\r\n\r\n this.vertices = options?.vertices ?? [];\r\n this.color = options?.color ?? 'black';\r\n this.outlineColor = options?.outlineColor ?? 'black';\r\n this.outlineWidth = options?.outlineWidth ?? 0;\r\n\r\n this.draw();\r\n }\r\n\r\n}","import { canvas, penCtx } from '../canvas.ts';\r\nimport Engine from '../Engine.ts';\r\nimport Sprite, { type BoundingBox, type SpriteOptions } from '../Sprite.ts';\r\n\r\nexport interface PenOptions extends SpriteOptions {\r\n drawing?: boolean;\r\n penSize?: number;\r\n color?: string;\r\n}\r\n\r\nexport default class Pen extends Sprite {\r\n\r\n public discriminant = 'pen';\r\n public tags = new Set(['pen']);\r\n\r\n public drawing: boolean;\r\n public penSize: number;\r\n public color: string;\r\n\r\n public getBoundingBox(): BoundingBox {\r\n return {\r\n x: this.x,\r\n y: this.y,\r\n width: this.penSize * this.size * 2,\r\n height: this.penSize * this.size * 2\r\n };\r\n }\r\n\r\n public getPath(): Path2D {\r\n return new Path2D();\r\n }\r\n public draw() {}\r\n\r\n public create(options?: PenOptions): this {\r\n return new Pen(options) as this;\r\n }\r\n\r\n protected getCreateOptions() {\r\n return {\r\n ...super.getCreateOptions(),\r\n drawing: this.drawing,\r\n penSize: this.penSize,\r\n color: this.color\r\n };\r\n }\r\n\r\n public up() {\r\n this.drawing = false;\r\n }\r\n\r\n public down() {\r\n this.drawing = true;\r\n }\r\n\r\n public stamp(sprite: Sprite) {\r\n sprite.draw(true);\r\n }\r\n\r\n public eraseAll() {\r\n penCtx.clearRect(0, 0, canvas.width, canvas.height);\r\n }\r\n\r\n public dot() {\r\n penCtx.fillStyle = this.color;\r\n penCtx.fillRect(\r\n this.x - this.penSize / 2 + canvas.width / 2,\r\n -this.y - this.penSize / 2 + canvas.height / 2,\r\n this.penSize,\r\n this.penSize\r\n );\r\n }\r\n\r\n public drawSprite(sprite: Sprite) {\r\n sprite.draw(true);\r\n Engine.init().removeSprite(sprite);\r\n }\r\n\r\n private drawLine(lastX: number, lastY: number) {\r\n penCtx.beginPath();\r\n\r\n penCtx.moveTo(lastX + canvas.width / 2, -lastY + canvas.height / 2);\r\n penCtx.lineTo(this.x + canvas.width / 2, -this.y + canvas.height / 2);\r\n\r\n penCtx.lineWidth = this.penSize;\r\n penCtx.strokeStyle = this.color;\r\n penCtx.stroke();\r\n }\r\n\r\n // Overriding methods to include drawing\r\n\r\n public override move(steps: number) {\r\n const lastX = this.x;\r\n const lastY = this.y;\r\n\r\n this.x += steps * Math.sin(this.toRadians(this.dir));\r\n this.y += steps * Math.cos(this.toRadians(this.dir));\r\n if (this.drawing)\r\n this.drawLine(lastX, lastY);\r\n this.refresh();\r\n }\r\n\r\n public override setX(x: number) {\r\n const lastX = this.x;\r\n const lastY = this.y;\r\n\r\n this.x = x;\r\n if (this.drawing)\r\n this.drawLine(lastX, lastY);\r\n this.refresh();\r\n }\r\n\r\n public override setY(y: number) {\r\n const lastX = this.x;\r\n const lastY = this.y;\r\n\r\n this.y = y;\r\n if (this.drawing)\r\n this.drawLine(lastX, lastY);\r\n this.refresh();\r\n }\r\n\r\n public override goTo(x: number, y: number) {\r\n const lastX = this.x;\r\n const lastY = this.y;\r\n\r\n this.x = x;\r\n this.y = y;\r\n if (this.drawing)\r\n this.drawLine(lastX, lastY);\r\n this.refresh();\r\n }\r\n\r\n public override changeX(dX: number) {\r\n const lastX = this.x;\r\n const lastY = this.y;\r\n\r\n this.x += dX;\r\n if (this.drawing)\r\n this.drawLine(lastX, lastY);\r\n this.refresh();\r\n }\r\n\r\n public override changeY(dY: number) {\r\n const lastX = this.x;\r\n const lastY = this.y;\r\n\r\n this.y += dY;\r\n if (this.drawing)\r\n this.drawLine(lastX, lastY);\r\n this.refresh();\r\n }\r\n\r\n // Constructor\r\n\r\n constructor(options?: PenOptions) {\r\n super(options);\r\n \r\n this.drawing = options?.drawing ?? false;\r\n this.penSize = options?.penSize ?? 5;\r\n this.color = options?.color ?? 'black';\r\n }\r\n\r\n}","import { canvas, ctx, penCtx } from '../canvas.ts';\r\nimport Engine from '../Engine.ts';\r\nimport Sprite, { type BoundingBox, type SpriteOptions } from '../Sprite.ts';\r\n\r\nexport interface TextOptions extends SpriteOptions {\r\n content?: string | number;\r\n color?: string;\r\n fontFamily?: string;\r\n fontSize?: number;\r\n align?: CanvasTextAlign;\r\n baseline?: CanvasTextBaseline;\r\n}\r\n\r\nexport default class Text extends Sprite {\r\n\r\n public discriminant = 'text';\r\n public tags = new Set(['text']);\r\n\r\n public content: string | number;\r\n public color: string;\r\n public fontFamily: string;\r\n public fontSize: number;\r\n public align: CanvasTextAlign;\r\n public baseline: CanvasTextBaseline;\r\n\r\n private font: string;\r\n\r\n public getBoundingBox(): BoundingBox {\r\n\r\n const engine = Engine.init();\r\n\r\n const metrics = ctx.measureText(String(this.content));\r\n const w = metrics.width / 2; // half-width\r\n const h = metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent / 2; // half-height\r\n\r\n const cos = engine.cos(this.dir);\r\n const sin = engine.sin(this.dir);\r\n\r\n const width = 2 * (Math.abs(w * cos) + Math.abs(h * sin)) * this.size;\r\n const height = 2 * (Math.abs(w * sin) + Math.abs(h * cos)) * this.size;\r\n\r\n return {\r\n x: this.x,\r\n y: this.y,\r\n width, height\r\n };\r\n }\r\n\r\n public getPath(): Path2D {\r\n const path = new Path2D();\r\n\r\n ctx.save();\r\n \r\n ctx.font = this.font;\r\n\r\n const metrics = ctx.measureText(String(this.content));\r\n const width = metrics.width * this.size;\r\n const height = (metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent) * this.size;\r\n\r\n ctx.restore();\r\n\r\n path.rect(-width / 2, -height / 2, width, height);\r\n\r\n return path\r\n }\r\n\r\n public draw(stamping?: true) {\r\n const c = stamping ? penCtx : ctx;\r\n\r\n c.save();\r\n\r\n const cX = this.x + canvas.width / 2;\r\n const cY = -this.y + canvas.height / 2;\r\n c.translate(cX, cY);\r\n c.rotate(this.toRadians(this.dir));\r\n c.translate(-this.pivot[0], this.pivot[1]);\r\n\r\n c.font = this.font;\r\n c.fillStyle = this.color;\r\n c.textAlign = this.align;\r\n c.textBaseline = this.baseline;\r\n\r\n c.fillText(String(this.content), 0, 0);\r\n\r\n c.restore();\r\n }\r\n\r\n public create(options?: TextOptions): this {\r\n return new Text(options) as this;\r\n }\r\n\r\n protected getCreateOptions() {\r\n return {\r\n ...super.getCreateOptions,\r\n content: this.content,\r\n color: this.color,\r\n fontFamily: this.fontFamily,\r\n fontSize: this.fontSize,\r\n align: this.align,\r\n baseline: this.baseline\r\n };\r\n }\r\n\r\n // Methods\r\n\r\n public setContent(content: string | number) {\r\n this.content = content;\r\n this.invalidatePath();\r\n this.refresh();\r\n }\r\n\r\n public setColor(color: string) {\r\n this.color = color;\r\n this.refresh();\r\n }\r\n\r\n public setFontSize(fontSize: number) {\r\n this.fontSize = fontSize;\r\n this.font = `${this.fontSize}px ${this.fontFamily}`;\r\n this.invalidatePath();\r\n this.refresh();\r\n }\r\n\r\n public setFontFamily(fontFamily: string) {\r\n this.fontFamily = fontFamily;\r\n this.font = `${this.fontSize}px ${this.fontFamily}`;\r\n this.invalidatePath();\r\n this.refresh();\r\n }\r\n\r\n public setAlign(align: CanvasTextAlign) {\r\n this.align = align;\r\n this.refresh();\r\n }\r\n\r\n public setBaseline(baseline: CanvasTextBaseline) {\r\n this.baseline = baseline;\r\n this.refresh();\r\n }\r\n\r\n // Constructor\r\n\r\n constructor(options?: TextOptions) {\r\n super(options);\r\n\r\n this.content = options?.content ?? '';\r\n this.color = options?.color ?? 'black';\r\n this.fontFamily = options?.fontFamily ?? 'Arial';\r\n this.fontSize = options?.fontSize ?? 16;\r\n this.align = options?.align ?? 'center';\r\n this.baseline = options?.baseline ?? 'middle';\r\n\r\n this.font = `${this.fontSize}px ${this.fontFamily}`;\r\n\r\n this.draw();\r\n }\r\n}","import { canvas, ctx, penCtx } from '../canvas.ts';\r\nimport Engine from '../Engine.ts';\r\nimport Sprite, { type BoundingBox, type SpriteOptions } from '../Sprite.ts';\r\n\r\nexport interface ButtonOptions extends SpriteOptions {\r\n content?: string | number;\r\n fontColor?: string;\r\n fontFamily?: string;\r\n fontSize?: number;\r\n\r\n width?: number;\r\n height?: number;\r\n backgroundColor?: string;\r\n\r\n outlineColor?: string;\r\n outlineWidth?: number;\r\n}\r\n\r\nexport default class Button extends Sprite {\r\n\r\n public discriminant = 'button';\r\n public tags = new Set(['button']);\r\n\r\n public content: string | number;\r\n public fontColor: string;\r\n public fontFamily: string;\r\n public fontSize: number;\r\n\r\n private font: string;\r\n\r\n public width: number;\r\n public height: number;\r\n public backgroundColor: string;\r\n\r\n public outlineColor: string;\r\n public outlineWidth: number;\r\n\r\n public getBoundingBox(): BoundingBox {\r\n\r\n const engine = Engine.init();\r\n\r\n ctx.save();\r\n \r\n ctx.font = this.font;\r\n\r\n const metrics = ctx.measureText(String(this.content));\r\n const w = Math.max(metrics.width, this.width) / 2; // half-width\r\n const h = Math.max(metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent, this.height) / 2; // half-height\r\n\r\n ctx.restore();\r\n\r\n const cos = engine.cos(this.dir);\r\n const sin = engine.sin(this.dir);\r\n\r\n const width = 2 * (Math.abs(w * cos) + Math.abs(h * sin)) * this.size;\r\n const height = 2 * (Math.abs(w * sin) + Math.abs(h * cos)) * this.size;\r\n\r\n return {\r\n x: this.x,\r\n y: this.y,\r\n width, height\r\n };\r\n }\r\n\r\n public getPath(): Path2D {\r\n const path = new Path2D();\r\n\r\n path.rect(\r\n -this.width / 2 * this.size,\r\n -this.height / 2 * this.size,\r\n this.width * this.size,\r\n this.height * this.size\r\n );\r\n\r\n return path\r\n }\r\n\r\n public draw(stamping?: true) {\r\n const c = stamping ? penCtx : ctx;\r\n\r\n c.save();\r\n\r\n const cX = this.x + canvas.width / 2;\r\n const cY = -this.y + canvas.height / 2;\r\n c.translate(cX, cY);\r\n c.rotate(this.toRadians(this.dir));\r\n c.translate(-this.pivot[0], this.pivot[1]);\r\n\r\n c.fillStyle = this.backgroundColor;\r\n c.strokeStyle = this.outlineColor;\r\n c.lineWidth = this.outlineWidth;\r\n\r\n const path = this.getCachedPath();\r\n \r\n c.fill(path);\r\n if (this.outlineWidth) c.stroke(path);\r\n\r\n c.font = this.font;\r\n c.fillStyle = this.fontColor;\r\n c.textAlign = 'center';\r\n c.textBaseline = 'middle';\r\n\r\n c.fillText(String(this.content), 0, 0);\r\n\r\n c.restore();\r\n }\r\n\r\n public create(options?: ButtonOptions): this {\r\n return new Button(options) as this;\r\n }\r\n\r\n protected getCreateOptions() {\r\n return {\r\n ...super.getCreateOptions(),\r\n content: this.content,\r\n fontColor: this.fontColor,\r\n fontFamily: this.fontFamily,\r\n fontSize: this.fontSize,\r\n width: this.width,\r\n height: this.height,\r\n backgroundColor: this.backgroundColor,\r\n outlineColor: this.outlineColor,\r\n outlineWidth: this.outlineWidth\r\n };\r\n }\r\n\r\n // Methods\r\n\r\n public setContent(content: string | number) {\r\n this.content = content;\r\n this.invalidatePath();\r\n this.refresh();\r\n }\r\n\r\n public setBackgroundColor(color: string) {\r\n this.backgroundColor = color;\r\n this.refresh();\r\n }\r\n\r\n public setFontColor(color: string) {\r\n this.fontColor = color;\r\n this.refresh();\r\n }\r\n\r\n public setFontSize(fontSize: number) {\r\n this.fontSize = fontSize;\r\n this.font = `${this.fontSize}px ${this.fontFamily}`;\r\n this.invalidatePath();\r\n this.refresh();\r\n }\r\n\r\n public setFontFamily(fontFamily: string) {\r\n this.fontFamily = fontFamily;\r\n this.font = `${this.fontSize}px ${this.fontFamily}`;\r\n this.invalidatePath();\r\n this.refresh();\r\n }\r\n\r\n // Constructor\r\n\r\n constructor(options?: ButtonOptions) {\r\n super(options);\r\n\r\n this.content = options?.content ?? '';\r\n this.fontColor = options?.fontColor ?? 'black';\r\n this.fontFamily = options?.fontFamily ?? 'Arial';\r\n this.fontSize = options?.fontSize ?? 16;\r\n\r\n this.font = `${this.fontSize}px ${this.fontFamily}`;\r\n\r\n this.width = options?.width ?? String(this.content).length * this.fontSize + 10;\r\n this.height = options?.height ?? this.fontSize + 10;\r\n this.backgroundColor = options?.backgroundColor ?? 'rgb(204, 204, 204)';\r\n\r\n this.outlineColor = options?.outlineColor ?? 'black';\r\n this.outlineWidth = options?.outlineWidth ?? 0;\r\n\r\n this.draw();\r\n }\r\n}","import { canvas } from '../canvas.ts';\r\nimport Text, { type TextOptions } from './Text.ts';\r\n\r\nexport default class Watermark extends Text {\r\n\r\n public override tags = new Set(['text', 'watermark']);\r\n\r\n public override create(options?: TextOptions): this {\r\n return new Watermark(options) as this;\r\n }\r\n\r\n constructor(options?: TextOptions) {\r\n super(options);\r\n\r\n this.content = options?.content ?? 'Made with TScratch';\r\n this.x = options?.x ?? -canvas.width / 2 + 5,\r\n this.y = options?.y ?? canvas.height / 2 - 5,\r\n this.align = options?.align ?? 'left',\r\n this.baseline = options?.baseline ?? 'top'\r\n\r\n this.draw();\r\n }\r\n}","import { canvas, ctx, penCtx } from '../canvas.ts';\r\nimport Engine from '../Engine.ts';\r\nimport Sprite, { type BoundingBox, type SpriteOptions } from '../Sprite.ts';\r\n\r\nexport interface ImageSpriteOptions extends SpriteOptions {\r\n costumes?: string[];\r\n costumeNumber?: number;\r\n width?: number;\r\n height?: number;\r\n outlineColor?: string;\r\n outlineWidth?: number;\r\n};\r\n\r\nexport default class ImageSprite extends Sprite {\r\n\r\n public discriminant = 'imagesprite';\r\n public tags = new Set(['imagesprite']);\r\n\r\n public costumes: string[];\r\n public costumeNumber: number;\r\n public width: number;\r\n public height: number;\r\n public outlineColor: string;\r\n public outlineWidth: number;\r\n\r\n private imgBitmap: ImageBitmap | null = null;\r\n protected img: HTMLImageElement;\r\n\r\n public getBoundingBox(): BoundingBox {\r\n\r\n const engine = Engine.init();\r\n\r\n const w = this.width / 2; // half-width\r\n const h = this.height / 2; // half-height\r\n\r\n const cos = engine.cos(this.dir);\r\n const sin = engine.sin(this.dir);\r\n\r\n const width = 2 * Math.sqrt((w * cos)**2 + (h * sin)**2) * this.size;\r\n const height = 2 * Math.sqrt((w * sin)**2 + (h * cos)**2) * this.size;\r\n\r\n return {\r\n x: this.x,\r\n y: this.y,\r\n width, height\r\n };\r\n }\r\n\r\n public getPath(): Path2D {\r\n const path = new Path2D();\r\n\r\n path.rect(\r\n -this.width / 2 * this.size,\r\n -this.height / 2 * this.size,\r\n this.width * this.size,\r\n this.height * this.size\r\n );\r\n\r\n return path;\r\n }\r\n\r\n public draw(stamping?: true) {\r\n const c = stamping ? penCtx : ctx;\r\n\r\n c.save();\r\n\r\n const cX = this.x + canvas.width / 2;\r\n const cY = -this.y + canvas.height / 2;\r\n c.translate(cX, cY);\r\n c.rotate(this.toRadians(this.dir));\r\n c.translate(-this.pivot[0], this.pivot[1]);\r\n\r\n c.strokeStyle = this.outlineColor;\r\n c.lineWidth = this.outlineWidth;\r\n c.drawImage(\r\n this.imgBitmap ?? this.img,\r\n 0, 0,\r\n this.img.width,\r\n this.img.height,\r\n -this.width / 2,\r\n -this.height / 2,\r\n this.width, this.height\r\n );\r\n if (this.outlineWidth)\r\n c.stroke(this.getCachedPath());\r\n\r\n c.restore();\r\n }\r\n\r\n public create(options?: ImageSpriteOptions): this {\r\n return new ImageSprite(options) as this;\r\n }\r\n\r\n protected getCreateOptions() {\r\n return {\r\n ...super.getCreateOptions(),\r\n costumes: this.costumes,\r\n costumeNumber: this.costumeNumber,\r\n width: this.width,\r\n height: this.height,\r\n outlineColor: this.outlineColor,\r\n outlineWidth: this.outlineWidth\r\n };\r\n }\r\n\r\n // Methods\r\n\r\n public setCostume(costumeNumber: number) {\r\n this.costumeNumber = costumeNumber < this.costumes.length && costumeNumber >= 0\r\n ? costumeNumber\r\n : 0;\r\n this.img.src = this.costumes[this.costumeNumber]!;\r\n this.img.onload = () => {\r\n createImageBitmap(this.img).then(bitmap => {\r\n this.imgBitmap = bitmap;\r\n });\r\n this.refresh()\r\n };\r\n }\r\n\r\n public nextCostume() {\r\n this.costumeNumber = (this.costumeNumber + 1) % this.costumes.length;\r\n this.img.src = this.costumes[this.costumeNumber]!;\r\n this.img.onload = () => {\r\n this.imgBitmap = null;\r\n createImageBitmap(this.img).then(bitmap => {\r\n this.imgBitmap = bitmap;\r\n });\r\n this.refresh()\r\n };\r\n }\r\n\r\n public previousCostume() {\r\n this.costumeNumber--;\r\n if (this.costumeNumber < 0) this.costumeNumber = this.costumes.length - 1;\r\n\r\n this.img.src = this.costumes[this.costumeNumber]!;\r\n this.img.onload = () => {\r\n this.imgBitmap = null;\r\n createImageBitmap(this.img).then(bitmap => {\r\n this.imgBitmap = bitmap;\r\n });\r\n this.refresh()\r\n };\r\n }\r\n\r\n public setWidth(width: number) {\r\n this.width = width;\r\n this.invalidatePath();\r\n this.refresh();\r\n }\r\n\r\n public setHeight(height: number) {\r\n this.height = height;\r\n this.invalidatePath();\r\n this.refresh();\r\n }\r\n\r\n // Constructor\r\n\r\n constructor(options?: ImageSpriteOptions) {\r\n super(options);\r\n\r\n this.costumes = options?.costumes ?? [];\r\n this.costumeNumber = options?.costumeNumber && options.costumeNumber < this.costumes.length && options.costumeNumber >= 0\r\n ? options.costumeNumber\r\n : 0;\r\n\r\n this.img = new Image();\r\n this.img.src = this.costumes[this.costumeNumber] ?? '';\r\n\r\n this.width = options?.width ?? 0;\r\n this.height = options?.height ?? 0;\r\n\r\n this.outlineColor = options?.outlineColor ?? 'black';\r\n this.outlineWidth = options?.outlineWidth ?? 0;\r\n \r\n this.img.onload = () => {\r\n if (!options?.width) this.width = this.img.width;\r\n if (!options?.height) this.height = this.img.height;\r\n createImageBitmap(this.img).then(bitmap => {\r\n this.imgBitmap = bitmap;\r\n });\r\n this.draw();\r\n };\r\n }\r\n}","import { canvas } from '../../canvas.ts';\r\nimport Engine from '../../Engine.ts';\r\nimport Circle, { type CircleOptions } from '../Circle.ts';\r\nimport type { RigidBodyOptions } from './RigidBodyOptions.ts';\r\n\r\nexport interface RigidCircleOptions extends CircleOptions, Partial<RigidBodyOptions> {}\r\n\r\nexport default class RigidCircle extends Circle implements RigidBodyOptions {\r\n\r\n public tags = new Set(['circle', 'rigidbody']);\r\n\r\n public gravity: number;\r\n public vX: number;\r\n public vY: number;\r\n public drag: number;\r\n public bounceLoss: number;\r\n\r\n public update() {\r\n\r\n const engine = Engine.init();\r\n\r\n this.vY += this.gravity;\r\n this.vY *= this.drag;\r\n this.vX *= this.drag;\r\n\r\n const x = this.x + this.vX;\r\n const y = this.y + this.vY;\r\n\r\n const localCircles = engine.sceneMap.get(this.scene)!.sprites.filter(s => s.discriminant === 'circle');\r\n const globalCircles = engine.sceneMap.get('*')!.sprites.filter(s => s.discriminant === 'circle');\r\n const circles = [...localCircles, ...globalCircles] as Circle[];\r\n\r\n const steps = Math.ceil(this.distanceTo(x, y) / (2 * this.radius));\r\n\r\n for (let i = 0; i < steps; i++) {\r\n for (const circle of circles) {\r\n if (this.distanceTo(circle.x, circle.y) < this.radius + circle.radius) {\r\n\r\n const nx = this.x - circle.x;\r\n const ny = this.y - circle.y;\r\n const dist = Math.sqrt(nx * nx + ny * ny);\r\n\r\n // Avoid division by zero\r\n if (dist === 0) continue;\r\n\r\n const nxn = nx / dist;\r\n const nyn = ny / dist;\r\n\r\n // Dot product of velocity and normal\r\n const dot = this.vX * nxn + this.vY * nyn;\r\n\r\n // Reflect velocity along normal and apply bounceLoss\r\n this.vX = (this.vX - 2 * dot * nxn) * this.bounceLoss;\r\n this.vY = (this.vY - 2 * dot * nyn) * this.bounceLoss;\r\n\r\n this.changeX(this.vX);\r\n this.changeY(this.vY);\r\n\r\n return;\r\n }\r\n }\r\n }\r\n\r\n this.goTo(x, y);\r\n\r\n // Bounce off canvas edges\r\n const cX = canvas.width / 2;\r\n const cY = canvas.height / 2;\r\n\r\n if (this.x - this.radius < -cX) {\r\n this.setX(-cX + this.radius);\r\n this.vX = Math.abs(this.vX) * this.bounceLoss;\r\n } else if (this.x + this.radius > cX) {\r\n this.setX(cX - this.radius);\r\n this.vX = -Math.abs(this.vX) * this.bounceLoss;\r\n }\r\n\r\n if (this.y - this.radius < -cY) {\r\n this.setY(-cY + this.radius);\r\n this.vY = Math.abs(this.vY) * this.bounceLoss;\r\n } else if (this.y + this.radius > cY) {\r\n this.setY(cY - this.radius);\r\n this.vY = -Math.abs(this.vY) * this.bounceLoss;\r\n }\r\n }\r\n\r\n constructor(options?: RigidCircleOptions) {\r\n super(options);\r\n\r\n this.gravity = options?.gravity ?? -1.8;\r\n this.drag = options?.drag ?? 0.96;\r\n this.bounceLoss = options?.bounceLoss ?? 0.9;\r\n this.vX = options?.vX ?? 0;\r\n this.vY = options?.vY ?? 0;\r\n }\r\n}","import { canvas } from '../../canvas.ts';\r\nimport Pen, { type PenOptions } from '../Pen.ts';\r\nimport Engine from '../../Engine.ts';\r\nimport type Object3D from './Object3D.ts';\r\nimport type { Vec2, Vec3 } from '../../types/Vectors.ts';\r\n\r\nexport interface WireframeRenderer3DOptions extends PenOptions {\r\n objects: Object3D[];\r\n}\r\n\r\nexport default class WireframeRenderer3D extends Pen {\r\n\r\n public FOV = 60;\r\n public ASPECT = canvas.width / canvas.height;\r\n public Z_NEAR = 0.01;\r\n\r\n public SPEED = 2;\r\n public SENSITIVITY = 300;\r\n\r\n public camX = 0;\r\n public camY = 0;\r\n public camZ = 0;\r\n public camDirX = 0;\r\n public camDirY = 0;\r\n public camDirZ = 0;\r\n\r\n public objects: Object3D[];\r\n\r\n constructor(options: WireframeRenderer3DOptions) {\r\n super(options);\r\n this.objects = options.objects;\r\n }\r\n\r\n // Controls\r\n public registerControls() {\r\n const engine = Engine.init();\r\n\r\n const dt = engine.deltaTime;\r\n\r\n const sinY = engine.sin(this.camDirY);\r\n const cosY = engine.cos(this.camDirY);\r\n\r\n if (engine.keyPressed('w')) {\r\n this.camX += this.SPEED * sinY * dt;\r\n this.camZ += this.SPEED * cosY * dt;\r\n }\r\n if (engine.keyPressed('a')) {\r\n this.camX -= this.SPEED * cosY * dt;\r\n this.camZ += this.SPEED * sinY * dt;\r\n }\r\n if (engine.keyPressed('s')) {\r\n this.camX -= this.SPEED * sinY * dt;\r\n this.camZ -= this.SPEED * cosY * dt;\r\n }\r\n if (engine.keyPressed('d')) {\r\n this.camX += this.SPEED * cosY * dt;\r\n this.camZ -= this.SPEED * sinY * dt;\r\n }\r\n\r\n if (engine.keyPressed('e'))\r\n this.camY += this.SPEED * dt;\r\n if (engine.keyPressed('q'))\r\n this.camY -= this.SPEED * dt;\r\n\r\n if (engine.keyPressed('up'))\r\n this.camDirX += this.SENSITIVITY * dt;\r\n if (engine.keyPressed('down'))\r\n this.camDirX -= this.SENSITIVITY * dt;\r\n if (engine.keyPressed('left'))\r\n this.camDirY -= this.SENSITIVITY * dt;\r\n if (engine.keyPressed('right'))\r\n this.camDirY += this.SENSITIVITY * dt;\r\n }\r\n\r\n // Perspective projection\r\n private project(vertices: Vec3[]): Vec2[] {\r\n\r\n const f = 1 / Engine.init().tan(this.FOV / 2);\r\n\r\n return vertices.map(v => {\r\n const x = v[0];\r\n const y = v[1];\r\n const z = v[2] < this.Z_NEAR ? this.Z_NEAR : v[2];\r\n\r\n // Perspective divide for x and y\r\n const xp = canvas.width / 2 * (x * f) / (z * this.ASPECT);\r\n const yp = canvas.height / 2 * (y * f) / z;\r\n\r\n return [xp, yp];\r\n });\r\n }\r\n\r\n // Render update (run every frame)\r\n public update() {\r\n const engine = Engine.init();\r\n\r\n const sinX = engine.sin(this.camDirX);\r\n const cosX = engine.cos(this.camDirX);\r\n const sinY = engine.sin(this.camDirY);\r\n const cosY = engine.cos(this.camDirY);\r\n const sinZ = engine.sin(this.camDirZ);\r\n const cosZ = engine.cos(this.camDirZ);\r\n\r\n for (const obj of this.objects) {\r\n\r\n const projected = this.project(\r\n obj.vertices.map(v => {\r\n let x = v[0] + obj.x - this.camX;\r\n let y = v[1] + obj.y - this.camY;\r\n let z = v[2] + obj.z - this.camZ;\r\n\r\n // Y (yaw)\r\n let x1 = x * cosY - z * sinY;\r\n let z1 = x * sinY + z * cosY;\r\n\r\n // X (pitch)\r\n let y2 = y * cosX - z1 * sinX;\r\n let z2 = y * sinX + z1 * cosX;\r\n\r\n // Z (roll)\r\n let x3 = x1 * cosZ - y2 * sinZ;\r\n let y3 = x1 * sinZ + y2 * cosZ;\r\n\r\n return [x3, y3, z2] as Vec3;\r\n })\r\n );\r\n \r\n for (const f of obj.faces) {\r\n \r\n const [x, y] = projected[f[0]]!;\r\n this.goTo(x, y);\r\n this.down();\r\n \r\n for (const vIndex of f) {\r\n const [x, y] = projected[vIndex]!;\r\n this.goTo(x, y);\r\n }\r\n \r\n this.goTo(x, y);\r\n this.up();\r\n }\r\n }\r\n }\r\n}","import Engine from '../../Engine.ts';\r\nimport type { Vec3 } from '../../types/Vectors.ts';\r\n\r\nexport interface Object3DOptions {\r\n vertices: Vec3[];\r\n faces: [number, number, ...number[]][];\r\n\r\n x?: number;\r\n y?: number;\r\n z?: number;\r\n}\r\n\r\nexport default class Object3D {\r\n\r\n public x = 0;\r\n public y = 0;\r\n public z = 0;\r\n\r\n public rotX = 0;\r\n public rotY = 0;\r\n public rotZ = 0;\r\n\r\n public vertices: Vec3[];\r\n public faces: [number, number, ...number[]][];\r\n\r\n constructor(options: Object3DOptions) {\r\n this.vertices = options.vertices;\r\n this.faces = options.faces;\r\n\r\n this.x = options.x ?? 0;\r\n this.y = options.y ?? 0;\r\n this.z = options.z ?? 2;\r\n }\r\n\r\n public rotateX(deg: number) {\r\n\r\n const engine = Engine.init();\r\n\r\n const cos = engine.cos(deg);\r\n const sin = engine.sin(deg);\r\n\r\n for (let i = 0; i < this.vertices.length; i++) {\r\n const [_, y, z] = this.vertices[i]!;\r\n\r\n this.vertices[i]![1] = y * cos - z * sin;\r\n this.vertices[i]![2] = y * sin + z * cos;\r\n }\r\n }\r\n\r\n public rotateY(deg: number) {\r\n\r\n const engine = Engine.init();\r\n\r\n const cos = engine.cos(deg);\r\n const sin = engine.sin(deg);\r\n\r\n for (let i = 0; i < this.vertices.length; i++) {\r\n const [x, _, z] = this.vertices[i]!;\r\n\r\n this.vertices[i]![0] = x * cos + z * sin;\r\n this.vertices[i]![2] = -x * sin + z * cos;\r\n }\r\n }\r\n\r\n public rotateZ(deg: number) {\r\n\r\n const engine = Engine.init();\r\n\r\n const cos = engine.cos(deg);\r\n const sin = engine.sin(deg);\r\n\r\n for (let i = 0; i < this.vertices.length; i++) {\r\n const [x, y, _] = this.vertices[i]!;\r\n\r\n this.vertices[i]![0] = x * cos - y * sin;\r\n this.vertices[i]![1] = x * sin + y * cos;\r\n }\r\n }\r\n\r\n public pointX(deg: number) {\r\n const delta = deg - this.rotX;\r\n this.rotX = deg;\r\n this.rotateX(delta);\r\n }\r\n\r\n public pointY(deg: number) {\r\n const delta = deg - this.rotY;\r\n this.rotY = deg;\r\n this.rotateY(delta);\r\n }\r\n\r\n public pointZ(deg: number) {\r\n const delta = deg - this.rotZ;\r\n this.rotZ = deg;\r\n this.rotateZ(delta);\r\n }\r\n}","import type { Vec3 } from '../../../types/Vectors.ts';\r\n\r\nconst cubeVertices: Vec3[] = [\r\n // Bottom\r\n [-0.5, -0.5, -0.5],\r\n [0.5, -0.5, -0.5],\r\n [0.5, -0.5, 0.5],\r\n [-0.5, -0.5, 0.5],\r\n // Top\r\n [-0.5, 0.5, -0.5],\r\n [0.5, 0.5, -0.5],\r\n [0.5, 0.5, 0.5],\r\n [-0.5, 0.5, 0.5]\r\n];\r\n\r\nexport default cubeVertices;","const cubeFaces: [number, number, ...number[]][] = [\r\n [0, 1, 2, 3],\r\n [4, 5, 6, 7],\r\n [0, 4],\r\n [1, 5],\r\n [2, 6],\r\n [3, 7]\r\n];\r\n\r\nexport default cubeFaces;","import type { Vec3 } from '../../../types/Vectors.ts';\r\n\r\nexport const tetrahedronVertices: Vec3[] = [\r\n [ 1, 1, 1],\r\n [-1, -1, 1],\r\n [-1, 1, -1],\r\n [ 1, -1, -1]\r\n];\r\n\r\nexport default tetrahedronVertices;","export const tetrahedronFaces: [number, number, ...number[]][] = [\r\n [0, 1, 2],\r\n [0, 3, 1],\r\n [0, 2, 3],\r\n [1, 3, 2]\r\n];\r\n\r\nexport default tetrahedronFaces;","import type { Vec3 } from '../../../types/Vectors.ts';\r\n\r\nexport const octahedronVerticesVertices: Vec3[] = [\r\n [ 1, 0, 0],\r\n [-1, 0, 0],\r\n [ 0, 1, 0],\r\n [ 0, -1, 0],\r\n [ 0, 0, 1],\r\n [ 0, 0, -1]\r\n];\r\n\r\nexport default octahedronVerticesVertices;","export const octahedronFaces: [number, number, ...number[]][] = [\r\n [0, 2, 4],\r\n [2, 1, 4],\r\n [1, 3, 4],\r\n [3, 0, 4],\r\n\r\n [2, 0, 5],\r\n [1, 2, 5],\r\n [3, 1, 5],\r\n [0, 3, 5]\r\n];\r\n\r\nexport default octahedronFaces;"],"mappings":"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","names":["client_exports","__export","Arc","Button","Circle","CustomPolygon","Engine","ImageSprite","Multiplayer","Object3D","Oval","Pen","Rectangle","RegularPolygon","RigidCircle","Sprite","Square","Text","Watermark","WireframeRenderer3D","aspectRatio","canvas","ctx","cube_default","client_default","octahedron_default","scale","setAspectRatio","setScale","tetrahedron_default","__toCommonJS","canvas","ctx","penCanvas","penCtx","aspectRatio","scale","updateSize","setScale","newScale","setAspectRatio","newAspectRatio","Sprite","_Sprite","Engine","options","sprite","bBox1","bBox2","b1Left","b1Top","b1Right","b1Bottom","b2Left","b2Top","b2Right","b2Bottom","xMin","yMin","xMax","yMax","width","height","ctx","drawSprite","color","dx","dy","img1","img2","i","deg","rad","x","y","steps","dir","dX","dY","size","dS","layer","dL","Engine","_Engine","scene","loop","sprite","layer","targetIndex","s","maxFPS","frameInterval","accumulator","tick","currentTime","deltaTime","ctx","canvas","ms","resolve","conditionGetter","check","key","value","mouseX","mouseY","canvasMouseX","canvasMouseY","localX","localY","angle","rotatedX","rotatedY","src","audio","sound","min","max","vectors","a","b","deg","val","rad","penCanvas","e","import_socket","Multiplayer","_Multiplayer","serverURL","eventName","data","callback","Rectangle","_Rectangle","Sprite","engine","Engine","w","h","cos","sin","width","height","path","stamping","c","penCtx","ctx","cX","canvas","cY","options","color","Square","_Square","Sprite","engine","Engine","s","cos","sin","size","path","stamping","c","penCtx","ctx","cX","canvas","cY","options","sideLength","color","Oval","_Oval","Sprite","engine","Engine","rX","rY","cos","sin","width","height","path","stamping","c","penCtx","ctx","cX","canvas","cY","options","radX","radY","color","Circle","_Circle","Sprite","path","stamping","c","penCtx","ctx","cX","canvas","cY","options","radius","color","Arc","_Arc","Sprite","path","stamping","c","penCtx","ctx","cX","canvas","cY","options","radius","angle","color","RegularPolygon","_RegularPolygon","Sprite","path","step","i","stamping","c","penCtx","ctx","cX","canvas","cY","options","sides","radius","color","CustomPolygon","_CustomPolygon","Sprite","engine","Engine","cos","sin","minX","maxX","minY","maxY","v","rx","ry","fx","fy","width","height","x","y","path","vertices","first","rest","stamping","c","penCtx","ctx","cX","canvas","cY","options","color","Pen","_Pen","Sprite","options","sprite","penCtx","canvas","Engine","lastX","lastY","steps","x","y","dX","dY","Text","_Text","Sprite","engine","Engine","metrics","ctx","w","h","cos","sin","width","height","path","stamping","c","penCtx","cX","canvas","cY","options","content","color","fontSize","fontFamily","align","baseline","Button","_Button","Sprite","engine","Engine","ctx","metrics","w","h","cos","sin","width","height","path","stamping","c","penCtx","cX","canvas","cY","options","content","color","fontSize","fontFamily","Watermark","_Watermark","Text","options","canvas","ImageSprite","_ImageSprite","Sprite","engine","Engine","w","h","cos","sin","width","height","path","stamping","c","penCtx","ctx","cX","canvas","cY","options","costumeNumber","bitmap","RigidCircle","Circle","engine","Engine","x","y","localCircles","s","globalCircles","circles","steps","i","circle","nx","ny","dist","nxn","nyn","dot","cX","canvas","cY","options","WireframeRenderer3D","Pen","canvas","options","engine","Engine","dt","sinY","cosY","vertices","f","v","x","y","z","xp","yp","sinX","cosX","sinZ","cosZ","obj","projected","x1","z1","y2","z2","x3","y3","vIndex","Object3D","options","deg","engine","Engine","cos","sin","i","_","y","z","x","delta","cubeVertices","cube_default","cubeFaces","cube_default","tetrahedronVertices","tetrahedron_default","tetrahedronFaces","tetrahedron_default","octahedronVerticesVertices","octahedron_default","octahedronFaces","octahedron_default","TScratch","Engine","Sprite","Multiplayer","Rectangle","Square","Oval","Circle","Arc","RegularPolygon","CustomPolygon","Pen","Text","Button","Watermark","ImageSprite","RigidCircle","WireframeRenderer3D","Object3D","cube_default","tetrahedron_default","octahedron_default","scale","aspectRatio","setScale","setAspectRatio","canvas","ctx","client_default"]}