{"version":3,"sources":["../src/engine.ts","../src/assetLoader.ts","../src/components.ts","../src/systems/renderingSystem.ts","../src/input.ts","../src/systems/buttonActionSystem.ts","../src/entityTemplates.ts"],"sourcesContent":["import { AssetResources, EngineOptions, LoadedResources, Vector2 } from \"./types\";\r\nimport { EntityId, EntityManager } from \"entix-ecs\";\r\nimport { AssetLoader } from \"./assetLoader\";\r\nimport { Transform, Sprite, EntityActive, Parent, Scene, Children, Rectangle, Shape } from \"./components\";\r\nimport { renderingSystem } from \"./systems/renderingSystem\";\r\nimport { Input } from \"./input\";\r\nimport { buttonActionSystem } from \"./systems/buttonActionSystem\";\r\nexport class Engine {\r\n    private canvas: HTMLCanvasElement | null = null;\r\n    private ctx: CanvasRenderingContext2D | null = null;\r\n    private canvasWidth: number = 0;\r\n    private canvasHeight: number = 0;\r\n    private canvasDefWidth: number = 680;\r\n    private canvasDefHeight: number = 600;\r\n    private entityManager: EntityManager | null = null;\r\n    private lastFrameTime: number = 0;\r\n    private deltaTime: number = 0;\r\n    private updateFunctions: Function[] = [];\r\n    private resources: AssetResources = {};\r\n    private assetLoader: AssetLoader | null = null;\r\n    private loadedResources: LoadedResources = {};\r\n    private startFunctions: Function[] = [];\r\n    private sceneEntities: EntityId[] = [];\r\n    private currentSceneId: EntityId | null = null;\r\n    private input: Input | null = null;\r\n    constructor(options: EngineOptions) {\r\n        this.init(options);\r\n        this.start().then(() => {\r\n            requestAnimationFrame(this.update.bind(this));\r\n        });\r\n\r\n    };\r\n    init(options: EngineOptions) {// used to init all the important libs / files\r\n        this.canvas = options.canvas ?? null;\r\n        if (!this.canvas) {// create one\r\n            const newCanvas: HTMLCanvasElement = document.createElement('canvas');\r\n            this.canvas = newCanvas;\r\n            document.body.appendChild(this.canvas);\r\n        };\r\n        this.ctx = this.canvas.getContext('2d');\r\n        if (!this.ctx) throw new Error(\"CTX NOT FOUND!\");\r\n        this.canvasWidth = options.canvasWidth ?? 0;\r\n        if (this.canvasWidth === 0) this.canvasWidth = this.canvasDefWidth;\r\n        this.canvasHeight = options.canvasHeight ?? 0;\r\n        if (this.canvasHeight === 0) this.canvasHeight = this.canvasDefHeight;\r\n        this.canvas.width = this.canvasWidth;\r\n        this.canvas.height = this.canvasHeight;\r\n        const dpr = window.devicePixelRatio || 1;\r\n        this.canvas.width = this.canvasWidth * dpr;\r\n        this.canvas.height = this.canvasHeight * dpr;\r\n        this.canvas.style.width = `${this.canvasWidth}px`;\r\n        this.canvas.style.height = `${this.canvasHeight}px`;\r\n        this.ctx.scale(dpr, dpr);\r\n        this.entityManager = new EntityManager();\r\n        if (!this.entityManager) throw new Error(\"ENTITY MANAGER NOT FOUND!\");\r\n        this.resources = options.resources ?? {};\r\n        this.assetLoader = new AssetLoader(this.resources);\r\n        this.input = new Input(this);\r\n        if (!this.input) throw new Error(\"INPUT NOT FOUND!\");\r\n    };\r\n    async start(): Promise<void> {//other game stuff\r\n        try {\r\n            const loadedResources = await this.assetLoader?.loadAll();\r\n            this.loadedResources = loadedResources!;\r\n            console.log(\"RESOURCES LOADED! \", loadedResources);\r\n            this.startFunctions.forEach(fn => fn());\r\n        }\r\n        catch (error) {\r\n            console.error(\"FAILED TO LOAD ASSETS:\", error);\r\n        }\r\n\r\n    };\r\n    update(timeStamp: number) {//gameloop\r\n        this.deltaTime = (timeStamp - this.lastFrameTime) / 1000;\r\n        this.lastFrameTime = timeStamp;\r\n\r\n        this.ctx?.clearRect(0, 0, this.canvasWidth, this.canvasHeight);\r\n\r\n        renderingSystem(this);\r\n        buttonActionSystem(this);\r\n\r\n        this.updateFunctions.forEach((fn) => {\r\n            fn();\r\n        });\r\n\r\n        this.input?.resetStates();\r\n\r\n        requestAnimationFrame(this.update.bind(this));\r\n    };\r\n    //GETTER\r\n    public getCanvas(): HTMLCanvasElement {\r\n        if (!this.canvas) throw new Error(\"CANVAS NOT FOUND!\");\r\n        return this.canvas;\r\n    };\r\n    public getCtx(): CanvasRenderingContext2D {\r\n        if (!this.ctx) throw new Error(\"CTX NOT FOUND\");\r\n        return this.ctx;\r\n    };\r\n    public getEntityManager(): EntityManager {\r\n        if (!this.entityManager) throw new Error(\"ENTITY MANAGER NOT FOUND!\");\r\n        return this.entityManager;\r\n    };\r\n    public getDeltaTime(): number {\r\n        return this.deltaTime;\r\n    };\r\n    public getImage(key: string): HTMLImageElement {\r\n        if (!this.loadedResources?.imagesData || !this.loadedResources.imagesData[key]) {\r\n            throw new Error(\"LOADED IMAGE RESOURCE \" + key + \" NOT FOUND!\");\r\n        }\r\n        return this.loadedResources.imagesData[key];\r\n    };\r\n    public getAudio(key: string): HTMLAudioElement {\r\n        if (!this.loadedResources.audioData || !this.loadedResources.audioData[key]) {\r\n            throw new Error(\"LOADED AUDIO RESOURCE \" + key + \" NOT FOUND!\");\r\n        }\r\n        return this.loadedResources.audioData[key];\r\n    };\r\n    public getJSON<T = any>(key: string): T {\r\n        if (!this.loadedResources.customJsonData || !(key in this.loadedResources.customJsonData))\r\n            throw new Error(\"LOADED JSON RESOURCE \" + key + \" NOT FOUND!\");\r\n        return this.loadedResources.customJsonData[key] as T;\r\n    };\r\n    public getSceneByName(name: string): EntityId | null {\r\n        for (const id of this.sceneEntities) {\r\n            const scene = this.entityManager?.getComponent(id, Scene);\r\n            if (scene && scene.name === name) return id;\r\n        }\r\n        return null;\r\n    };\r\n    getInput(): Input {\r\n        if (!this.input) throw new Error(\"INPUT NOT FOUND!\");\r\n        return this.input;\r\n    }\r\n    //FUNCTIONS\r\n    public addUpdateFunction(fn: Function) {\r\n        this.updateFunctions.push(fn);\r\n    };\r\n    public removeUpdateFunction(fn: Function) {\r\n        const index: number = this.updateFunctions.indexOf(fn);\r\n        if (index > -1) {\r\n            this.updateFunctions.splice(index, 1);\r\n        }\r\n    };\r\n    public addStartFunction(fn: Function) {\r\n        this.startFunctions.push(fn);\r\n    };\r\n    public removeStartFunction(fn: Function) {\r\n        const index: number = this.startFunctions.indexOf(fn);\r\n        if (index > -1) {\r\n            this.startFunctions.splice(index, 1);\r\n        }\r\n    };\r\n    public drawSprite(transform: Transform, sprite: Sprite) {// draws a sprite, runs in spriteRenderingSystem(auto handles sprite loading)\r\n        if (!this.ctx) throw new Error(\"CTX NOT FOUND IN DRAW SPRITE!\");\r\n        const selfRotationInRadians = (Math.PI * sprite.rotation) / 180;\r\n        const transformRotationInRadians = (Math.PI * transform.rotation.value) / 180\r\n        const totalRotationInRadians = selfRotationInRadians + transformRotationInRadians;\r\n        const pos: Vector2 = transform.globalPosition.position;\r\n\r\n        this.ctx.save();\r\n\r\n        this.ctx.translate(pos.x, pos.y);\r\n\r\n        this.ctx.scale(transform.scale.value.x, transform.scale.value.y);\r\n\r\n        this.ctx.globalAlpha = sprite.alpha;\r\n\r\n        this.ctx.rotate(totalRotationInRadians)\r\n\r\n        this.ctx.drawImage(sprite.image, -sprite.width / 2, -sprite.height / 2, sprite.width, sprite.height);\r\n\r\n        this.ctx.restore();\r\n    };\r\n    public isEntityActive(id: EntityId): boolean {//checks whether the entity or it's parent chain is active or not\r\n        let currentEntity: EntityId | null = id;\r\n\r\n        while (currentEntity) {\r\n            const entityActiveComponent: EntityActive | null = this.entityManager?.getComponent(currentEntity, EntityActive) ?? null;\r\n            const parentComponent: Parent | null = this.entityManager?.getComponent(currentEntity, Parent) ?? null;\r\n            if (!entityActiveComponent) throw new Error(\"ENTITY DOES NOT HAVE ENTITYACTIVE COMPONENT IN ISENTITYACTIVE() \" + id);\r\n            if (!parentComponent) throw new Error(\"ENTITY DOES NOT HAVE PARENT COMPONENT IN ISENTITYACTIVE() \" + id);\r\n            if (entityActiveComponent.value !== true) return false;// return false\r\n            currentEntity = parentComponent.value;\r\n        }\r\n        return true;\r\n    };\r\n    public addScene(id: EntityId) {//ads a scene,used upon creating a scene using scene template\r\n        this.sceneEntities.push(id);\r\n    };\r\n    public loadScene(id: EntityId) {//loads a scene\r\n        const sceneComponent = this.entityManager?.getComponent(id, Scene);\r\n        if (!sceneComponent) throw new Error(\"Scene component not found on entity: \" + id);\r\n\r\n        for (const sceneEntity of this.sceneEntities) {// turn of all scenes\r\n            const entityActive = this.entityManager?.getComponent(sceneEntity, EntityActive);\r\n            if (!entityActive) throw new Error\r\n                (\"SCENE DOES NOT HAVE ENTITY ACTIVE COMPONENT! WONT BE ABLE TO SWITCH TO THIS SCENE! \" + sceneEntity);\r\n            entityActive.value = false;\r\n        }\r\n\r\n        if (this.currentSceneId !== null) {\r\n            const oldScene = this.entityManager?.getComponent(this.currentSceneId, Scene);\r\n            oldScene?.onUnload();\r\n        }\r\n\r\n        this.currentSceneId = id;\r\n        const entityActive = this.entityManager?.getComponent(this.currentSceneId, EntityActive);\r\n        if (!entityActive) throw new Error(\"Target scene missing EntityActive component!\");\r\n        entityActive.value = true;\r\n        sceneComponent.onLoad();\r\n    };\r\n    public addParent(id: EntityId, parentId: EntityId) {// adds a parent to a entity\r\n        if (this.entityManager?.getComponent(id, Scene)) throw new Error// scenes dont have parent component!\r\n            (\"CANT ASSIGN PARENT TO A SCENE! \" + id);\r\n        const entityParentComponent = this.entityManager?.getComponent(id, Parent);\r\n        const parentChildrenComponent = this.entityManager?.getComponent(parentId, Children);\r\n        if (!entityParentComponent) throw new Error\r\n            (\"ENTITY DOES NOT HAVE PARENT COMPONENT, AND YOU ARE TRYING TO ASSIGN A VALUE! \" + id);\r\n        if (!parentChildrenComponent) throw new Error\r\n            (\"ENTITY DOES NOT HAVE CHILDREN COMPONENT, AND YOU ARE TRYING TO ASSIGN A VALUE! \" + id);\r\n        if (parentChildrenComponent.value.includes(id)) {\r\n            console.warn\r\n                (\"ENTITY ALREADY HAS THIS PARENT ASSIGNED! ARE YOU ASSIGNING THE SAME PARENT AGAIN ? \" + id);\r\n            return;\r\n        }\r\n        entityParentComponent.value = parentId;\r\n        parentChildrenComponent.value.push(id);\r\n\r\n    };\r\n    isEntityBlockingInput(x: number, y: number, layer: number): boolean {\r\n        const em = this.getEntityManager();\r\n        let blocked = false;\r\n\r\n        // Check all Sprites\r\n        em.query('All', { transform: Transform, sprite: Sprite }, (_, { transform, sprite }) => {\r\n            if (!sprite.active || !sprite.blocksInput) return;\r\n            if (sprite.layer <= layer) return;\r\n\r\n            const pos = transform.globalPosition.position;\r\n            const width = sprite.width * transform.scale.value.x;\r\n            const height = sprite.height * transform.scale.value.y;\r\n            const centeredX = pos.x - width / 2;\r\n            const centeredY = pos.y - height / 2;\r\n\r\n            if (x >= centeredX && x <= centeredX + width && y >= centeredY && y <= centeredY + height) {\r\n                blocked = true;\r\n            }\r\n        });\r\n\r\n        // Check all Shapes\r\n        em.query('All', { transform: Transform, shape: Shape }, (_, { transform, shape }) => {\r\n            if (!shape.active || !shape.blocksInput) return;\r\n            if (shape.layer <= layer) return;\r\n\r\n            const shapeType = shape.shape;\r\n            if (shapeType instanceof Rectangle) {\r\n                const width = shapeType.width * transform.scale.value.x;\r\n                const height = shapeType.height * transform.scale.value.y;\r\n                const pos = transform.globalPosition.position;\r\n                const centeredX = pos.x - width / 2;\r\n                const centeredY = pos.y - height / 2;\r\n\r\n                if (x >= centeredX && x <= centeredX + width && y >= centeredY && y <= centeredY + height) {\r\n                    blocked = true;\r\n                }\r\n            }\r\n            // Add checks for other shape types if needed (e.g., Circle, Polygon)\r\n        });\r\n\r\n        return blocked;\r\n    }\r\n\r\n};","import { AssetResources, LoadedResources } from \"./types\";\r\n\r\nexport class AssetLoader {\r\n    private resources: AssetResources;\r\n    constructor(resources: AssetResources = {}) {\r\n        this.resources = resources;\r\n    };\r\n    private async fetchData(url: string) {\r\n        try {\r\n            const response = await fetch(url);\r\n            if (!response.ok) {\r\n                throw new Error(`HTTP Error: ${response.status} ${response.statusText}`)\r\n            }\r\n            return await response.json();\r\n        }\r\n        catch (error) {\r\n            console.error(`❌ Failed to fetch JSON at: ${url}\\n`, error);\r\n            throw new Error(`FetchDataError\\nURL: ${url}\\nReason: ${(error as Error).message}`);\r\n        }\r\n    };\r\n    private loadImages(): Promise<Record<string, HTMLImageElement>> {\r\n        const imagesUrl: string = this.resources.images_JSON_path ?? '';\r\n        if (imagesUrl === '') {\r\n            console.warn(\"NO IMAGES PASSED TO LOAD\")\r\n            return Promise.resolve({});\r\n        };\r\n        return new Promise((resolve, reject) => {\r\n            this.fetchData(imagesUrl)\r\n                .then((data) => {\r\n                    const keys: string[] = Object.keys(data);\r\n                    const length: number = keys.length;\r\n                    let loadCount: number = 0;\r\n                    let images: Record<string, HTMLImageElement> = {};\r\n\r\n                    keys.forEach((key) => {\r\n                        const image = new Image();\r\n                        image.src = data[key];\r\n                        images[key] = image;\r\n\r\n                        image.onload = () => {\r\n                            loadCount++;\r\n                            if (loadCount === length) {\r\n                                resolve(images);\r\n                            }\r\n                        };\r\n\r\n                        image.onerror = () => {\r\n                            console.error(`❌ Failed to load image: ${data[key]}`);\r\n                            reject(new Error(`ImageLoadError\\nFile: ${data[key]}`));\r\n                        }\r\n                    })\r\n                })\r\n                .catch((error) => {\r\n                    console.error(\"❌ Failed during image JSON loading:\", error);\r\n                    reject(new Error(`ImageLoadingError\\n${(error as Error).message}`));\r\n                })\r\n        })\r\n\r\n    };\r\n    private loadAudio(): Promise<Record<string, HTMLAudioElement>> {\r\n        const audioUrl: string = this.resources.audio_JSON_path ?? '';\r\n        if (audioUrl === '') {\r\n            console.warn(\"⚠️ No audio JSON path provided.\");\r\n            return Promise.resolve({});\r\n        }\r\n\r\n        return new Promise((resolve, reject) => {\r\n            this.fetchData(audioUrl)\r\n                .then((data) => {\r\n                    const keys = Object.keys(data);\r\n                    let loadCount = 0;\r\n                    const audios: Record<string, HTMLAudioElement> = {};\r\n\r\n                    keys.forEach((key) => {\r\n                        const audio = new Audio();\r\n                        audio.src = data[key];\r\n                        audio.preload = 'auto';\r\n                        audios[key] = audio;\r\n\r\n                        // There’s no onload for <audio> reliably — you can use `canplaythrough` instead\r\n                        audio.addEventListener(\"canplaythrough\", () => {\r\n                            loadCount++;\r\n                            if (loadCount === keys.length) {\r\n                                resolve(audios);\r\n                            }\r\n                        });\r\n\r\n                        audio.onerror = () => {\r\n                            console.error(`❌ Failed to load audio: ${data[key]}`);\r\n                            reject(new Error(`AudioLoadError\\nFile: ${data[key]}`));\r\n                        };\r\n                    });\r\n                })\r\n                .catch((error) => {\r\n                    console.error(\"❌ Failed during audio JSON loading:\", error);\r\n                    reject(new Error(`AudioLoadingError\\n${(error as Error).message}`));\r\n                });\r\n        });\r\n    }\r\n\r\n    async loadAll() {\r\n        const imagesPromise = this.loadImages();\r\n        const audioPromise = this.loadAudio();\r\n\r\n        const jsonPromises: Promise<any>[] = [];\r\n        const jsonKeys: string[] = [];\r\n\r\n        if (this.resources.jsons) {\r\n            for (const [key, url] of Object.entries(this.resources.jsons)) {\r\n                jsonKeys.push(key);\r\n                jsonPromises.push(this.fetchData(url));\r\n            }\r\n        }\r\n\r\n        try {\r\n            const [imagesData, audioData, ...customJsons] = await Promise.all([\r\n                imagesPromise,\r\n                audioPromise,\r\n                ...jsonPromises,\r\n            ]);\r\n\r\n            const customJsonData: Record<string, any> = {};\r\n            jsonKeys.forEach((key, i) => {\r\n                customJsonData[key] = customJsons[i];\r\n            });\r\n\r\n            return {\r\n                imagesData,\r\n                audioData,\r\n                customJsonData,\r\n            };\r\n        } catch (error) {\r\n            console.error(\"❌ Failed to load all resources:\", error);\r\n            throw new Error(`LoadAllResourcesError\\n${(error as Error).message}`);\r\n        }\r\n    }\r\n}","import { EntityId } from \"entix-ecs\";\r\nimport type { Vector2, GlobalPosition, TransformOptions, ScaleOptions, SpriteOptions, EntityActiveOptions, ParentOptions, SceneOptions, RectangleOptions, CircleOptions, ShapeType, ShapeOptions, TriangleOptions, TextOptions, ButtonOptions } from \"./types\";\r\nexport class Rotation {\r\n    public value: number = 0;\r\n    constructor(value: number = 0) {\r\n        this.value = value ?? 0;\r\n    }\r\n};\r\nexport class Scale {\r\n    public value: Vector2 = {x:1,y:1};\r\n    constructor(options:ScaleOptions = {}){\r\n        this.value = options.value ?? {x:1,y:1};\r\n    }\r\n};\r\nexport class Transform {\r\n    public globalPosition: GlobalPosition;\r\n    //public localPosition: LocalPosition;\r\n    public rotation: Rotation;\r\n    public scale: Scale;\r\n    constructor(options: TransformOptions = {}) {\r\n        this.globalPosition = {position:options.globalPosition ?? {x:0,y:0}};\r\n        //this.localPosition = {position:options.localPosition ?? {x:0,y:0}};\r\n        this.rotation = new Rotation(options.rotation?.value);\r\n        this.scale = new Scale({value:options.scale?.value});\r\n    }\r\n\r\n};\r\nexport class Sprite{\r\n    public image: HTMLImageElement;\r\n    public width: number;\r\n    public height: number;\r\n    public alpha: number;\r\n    public rotation: number;\r\n    public layer:number;\r\n    public active:boolean;\r\n    public blocksInput:boolean = true;\r\n    constructor(options:SpriteOptions){\r\n        this.image = options.image;\r\n        this.width = options.width;\r\n        this.height = options.height;\r\n        this.alpha = options.alpha ?? 1;\r\n        this.rotation = options.rotation ?? 0;\r\n        this.layer = options.layer ?? 0;\r\n        this.active = options.active ?? true;\r\n        this.blocksInput = options.blocksInput ?? true;\r\n    }\r\n};\r\nexport class EntityActive{\r\n    public value:boolean = true;\r\n    constructor(options:EntityActiveOptions = {}){\r\n        this.value = options.value ?? true;\r\n    }\r\n};\r\nexport class Parent{\r\n    public value:EntityId | null = null;\r\n    constructor(options:ParentOptions = {}){\r\n        this.value = options.value ?? null;\r\n    }\r\n};\r\nexport class Children{// increment through code\r\n    public value:EntityId[] = [];\r\n};\r\nexport class Scene{\r\n    public name:string = '';\r\n    public onLoad:Function;\r\n    public onUnload:Function;\r\n    constructor(options:SceneOptions){\r\n        this.name = options.name;\r\n        this.onLoad = options.onLoad ?? (()=>{});\r\n        this.onUnload = options.onUnload ?? (()=>{});\r\n\r\n    }\r\n};\r\nexport class Shape{\r\n    public shape:ShapeType;\r\n    public color:string = 'green';\r\n    public outlineEnabled:boolean = false;\r\n    public outlineWidth:number = 3;\r\n    public outlineColor:string = 'black';\r\n    public alpha:number = 1;\r\n    public active:boolean = true;\r\n    public layer:number = 0;\r\n    public blocksInput:boolean = true;\r\n    constructor(options:ShapeOptions){\r\n        this.shape =  options.shape;\r\n        this.color = options.color ?? 'green';\r\n        this.outlineEnabled = options.outlineEnabled ?? false;\r\n        this.outlineWidth = options.outlineWidth ?? 3;\r\n        this.outlineColor = options.color ?? 'black';\r\n        this.alpha = options.alpha ?? 1;\r\n        this.active = options.active ?? true;\r\n        this.layer = options.layer ?? 0;\r\n        this.blocksInput = options.blocksInput ?? true;\r\n    }\r\n};   \r\nexport class Rectangle{\r\n    public width:number;\r\n    public height:number;\r\n    public centered:boolean = true;\r\n    public rotation:number = 0;\r\n    public rounded:boolean = false;\r\n    public roundedRadius:number = 5;\r\n    constructor(options:RectangleOptions){\r\n        this.width = options.width ?? 40;\r\n        this.height = options.height ?? 40;\r\n        this.centered = options.centered ?? true;\r\n        this.rotation = options.rotation ?? 0;\r\n        this.rounded = options.rounded ?? false;\r\n        this.roundedRadius = options.roundRadius ?? 5;\r\n    }\r\n};\r\nexport class Circle{\r\n    public radius:number;\r\n    constructor(options:CircleOptions){\r\n        this.radius = options.radius ?? 40;\r\n    }\r\n};\r\nexport class Triangle{\r\n    public p1:Vector2;// side 1\r\n    public p2: Vector2;// side 2\r\n    public p3 : Vector2 // side 3\r\n    public centered:boolean = true;\r\n    public rotation:number = 0;\r\n    constructor(options:TriangleOptions){\r\n        this.p1 = options.p1 ?? {x:30,y:0};\r\n        this.p2 = options.p2 ?? {x:0,y:59};\r\n        this.p3 = options.p3 ?? {x:30,y:59};\r\n        this.centered = options.centered ?? true;\r\n        this.rotation = options.rotation ?? 0;\r\n    }\r\n};\r\nexport class Text{\r\n    public content:string = 'text';\r\n    public size:number = 16;\r\n    public color:string = 'white';\r\n    public outlineEnabled:boolean = false;\r\n    public outlineWidth:number = 2;\r\n    public outlineColor:string = 'black';\r\n    public alpha:number = 1;\r\n    public active:boolean = true;\r\n    public layer:number = 0;\r\n    public rotation:number = 0;\r\n    public style:string = 'sans-serif';\r\n    public maxWidth:number = 200;\r\n    constructor(options:TextOptions){\r\n        this.content = options.content ?? 'text';\r\n        this.size = options.size ?? 16;\r\n        this.color = options.color ?? 'white';\r\n        this.outlineEnabled = options.outlineEnabled ?? false;\r\n        this.outlineWidth = options.outlineWidth ?? 2;\r\n        this.outlineColor = options.outlineColor ?? 'black';\r\n        this.alpha = options.alpha ?? 1;\r\n        this.active = options.active ?? true;\r\n        this.layer = options.layer ?? 0;\r\n        this.rotation = options.rotation ?? 0;\r\n        this.style = options.style ?? 'sans-serif';\r\n        this.maxWidth = options.maxWidth ?? 200;\r\n    }\r\n};\r\nexport class Button{\r\n    public pressArea:Vector2 = {x:100,y:100};\r\n    public onJustPressed:Function = ()=>{};\r\n    public onPress:Function = ()=>{};\r\n    public onJustReleased:Function = ()=>{};\r\n    public onJustHovered:Function = ()=>{};\r\n    public onHovered:Function = ()=>{};\r\n    public onHoveredReleased:Function = ()=>{};\r\n    public showPressArea:boolean = false;\r\n    public pressAreaShowColor:string = 'green';\r\n    public layer:number = 0;\r\n    public active:boolean = true;\r\n    public changeCursorToPointer:boolean = true;\r\n    public isHovered:boolean = false;\r\n    constructor(options:ButtonOptions){\r\n        this.pressArea = options.pressArea ?? {x:100,y:100};\r\n        this.onJustPressed = options.onJustPressed ?? (()=>{});\r\n        this.onPress = options.onPress ?? (()=>{});\r\n        this.onJustReleased = options.onReleased ?? (()=>{});\r\n        this.onJustHovered = options.onJustHovered ?? (()=>{});\r\n        this.onHovered = options.onHovered ?? (()=>{});\r\n        this.onHoveredReleased = options.onHoveredReleased ??(()=>{})\r\n        this.showPressArea = options.showPressArea ?? false;\r\n        this.pressAreaShowColor = options.pressAreaShowColor ?? 'green';\r\n        this.layer = options.layer ?? 0;\r\n        this.active = options.active ?? true;\r\n        this.changeCursorToPointer = options.changeCursorToPointer ?? true;\r\n    }\r\n};\r\n/*\r\nexport class RectButton{\r\n    public button:Button;\r\n    public shape:Shape;\r\n    public text:Text;\r\n    constructor(options:RectButtonOptions){\r\n        this.button = options.button ?? new Button({\r\n\r\n        });\r\n        this.shape = options.shape ?? new Shape({\r\n            shape:new Rectangle({\r\n                \r\n            })\r\n        });\r\n        this.text = options.text ?? new Text({\r\n\r\n        })\r\n    };\r\n};\r\n*/","import { EntityId, EntityManager } from \"entix-ecs\";\r\nimport { Engine } from \"../engine\";\r\nimport { Transform, Sprite, EntityActive, Shape, Rectangle, Circle, Triangle, Text, Button } from \"../components\";\r\nimport { Vector2 } from \"../types\";\r\n\r\n//RENDERING\r\n\r\nexport function renderingSystem(engine: Engine) {// some total of all, uses layer filter\r\n    const em: EntityManager = engine.getEntityManager();\r\n\r\n    const drawCalls: {\r\n        layer: number;\r\n        drawFn: () => void;\r\n    }[] = [];\r\n\r\n    for (const id of em.getAllEntities()) {\r\n        if (!engine.isEntityActive(id)) continue;\r\n        const transform = em.getComponent(id, Transform);\r\n        if (!transform) continue;\r\n\r\n        // Handle Sprite\r\n        const sprite = em.getComponent(id, Sprite);\r\n        if (sprite) {\r\n            if (!sprite.active) continue;\r\n            drawCalls.push({\r\n                layer: sprite.layer ?? 0,\r\n                drawFn: () => spriteRenderingSystem(engine, id)\r\n            });\r\n        };\r\n        //Handle Shapes\r\n        const shape = em.getComponent(id, Shape);\r\n        if (shape) {\r\n            if (!shape.active) continue;\r\n\r\n            const layer: number = shape.layer;\r\n            let drawFn: (() => void) | null = null;\r\n\r\n            if (shape.shape instanceof Rectangle) {\r\n                drawFn = () => rectangleRenderingSystem(engine, id);\r\n            }\r\n            else if (shape.shape instanceof Circle) {\r\n                drawFn = () => circleRenderingSystem(engine, id);\r\n            }\r\n            else if (shape.shape instanceof Triangle) {\r\n                drawFn = () => triangleRenderingSystem(engine, id);\r\n            }\r\n            if (drawFn) {\r\n                drawCalls.push({\r\n                    layer: layer,\r\n                    drawFn: drawFn\r\n                });\r\n            };\r\n        }\r\n        //Handle Text\r\n        const text = em.getComponent(id, Text);\r\n        if (text) {\r\n            if (!text.active) return;\r\n            drawCalls.push({\r\n                layer: text.layer,\r\n                drawFn: () => textRenderingSystem(engine, id)\r\n            })\r\n        }\r\n        //Handle ButtonPressArea\r\n        const button = em.getComponent(id, Button);\r\n        if (button) {\r\n            if (button.showPressArea) {\r\n                drawCalls.push({\r\n                    layer: button.layer,\r\n                    drawFn: () => buttonPressAreaRendering(engine, id)\r\n                })\r\n            }\r\n        }\r\n    };\r\n\r\n    drawCalls.sort((a, b) => a.layer - b.layer);\r\n\r\n    // Execute all draw calls\r\n    for (const draw of drawCalls) {\r\n        draw.drawFn();\r\n    }\r\n};\r\n\r\n//RENDERING SPRITE , SUB SYSTEM!\r\nfunction spriteRenderingSystem(engine: Engine, id: EntityId) {\r\n    const em: EntityManager = engine.getEntityManager();\r\n    const transform = em.getComponent(id, Transform);\r\n    const sprite = em.getComponent(id, Sprite);\r\n    if (!transform) throw new Error(\"TRANSFORM NULL IN SPRITE RENDERING SYSTEM! \" + id);\r\n    if (!sprite) throw new Error(\"SPRITE NULL IN SPRITE RENDERING SYSTEM! \" + id);\r\n    engine.drawSprite(transform, sprite);\r\n};\r\n\r\n//RENDERING RECTANGLES, SUB SYSTEM!\r\nfunction rectangleRenderingSystem(engine: Engine, id: EntityId) {\r\n    const em: EntityManager = engine.getEntityManager();\r\n    const ctx = engine.getCtx();\r\n    const transform = em.getComponent(id, Transform);\r\n    const shape = em.getComponent(id, Shape);\r\n    if (!transform) throw new Error(\"TRANSFORM NULL IN RECTANGLE RENDERING STSTEM !\" + id);\r\n    if (!shape) throw new Error(\"SHAPE NULL IN RECTANGLE RENDERING SYSTEM! \" + id);\r\n    const rectangle = shape.shape;\r\n    if ((rectangle instanceof Rectangle)) {\r\n        const x: number = transform.globalPosition.position.x;\r\n        const y: number = transform.globalPosition.position.y;\r\n        const w: number = rectangle.width;\r\n        const h: number = rectangle.height;\r\n        const selfRotationInRadians = (Math.PI * rectangle.rotation) / 180;\r\n        const transformRotationInRadians = (Math.PI * transform.rotation.value) / 180\r\n        const totalRotationInRadians = selfRotationInRadians + transformRotationInRadians;\r\n        const offset: Vector2 = {\r\n            x: rectangle.centered ? -w / 2 : 0,\r\n            y: rectangle.centered ? -h / 2 : 0\r\n        }\r\n\r\n        ctx.save();\r\n\r\n        //SHAPE\r\n        ctx.fillStyle = shape.color;\r\n        ctx.globalAlpha = shape.alpha;\r\n\r\n        ctx.beginPath();\r\n\r\n        ctx.translate(x, y);\r\n\r\n        ctx.rotate(totalRotationInRadians);\r\n\r\n        ctx.scale(transform.scale.value.x, transform.scale.value.y);\r\n\r\n        if (rectangle.rounded) {\r\n            ctx.roundRect(offset.x, offset.y, w, h, rectangle.roundedRadius);\r\n        }\r\n        else {\r\n            ctx.rect(offset.x, offset.y, w, h);\r\n        }\r\n\r\n\r\n        ctx.fill();\r\n\r\n        ctx.closePath();\r\n\r\n        //OUTLINE\r\n\r\n        if (shape.outlineEnabled) {\r\n            ctx.strokeStyle = shape.outlineColor;\r\n            ctx.lineWidth = shape.outlineWidth;\r\n\r\n            ctx.beginPath();\r\n\r\n            if (rectangle.rounded) {\r\n                ctx.roundRect(offset.x, offset.y, w, h, rectangle.roundedRadius);\r\n            }\r\n            else {\r\n                ctx.rect(offset.x, offset.y, w, h);\r\n            }\r\n\r\n\r\n            ctx.stroke();\r\n\r\n            ctx.closePath();\r\n        };\r\n\r\n        ctx.restore();\r\n    }\r\n    else {\r\n        console.warn(\"SHAPE IS NOT A RECTANGLE BUT IS IN RECTANGLE RENDERING SYSTEM! \" + id);\r\n    }\r\n\r\n};\r\n\r\n//RENDERING CIRCLES, SUB SYSTEM! \r\nfunction circleRenderingSystem(engine: Engine, id: EntityId) {\r\n    const em: EntityManager = engine.getEntityManager();\r\n    const ctx = engine.getCtx();\r\n    const transform = em.getComponent(id, Transform);\r\n    const shape = em.getComponent(id, Shape);\r\n    if (!transform) throw new Error(\"TRANSFORM NULL IN RECTANGLE RENDERING STSTEM !\" + id);\r\n    if (!shape) throw new Error(\"SHAPE NULL IN RECTANGLE RENDERING SYSTEM! \" + id);\r\n    if ((shape.shape instanceof Circle)) {\r\n        const x: number = transform.globalPosition.position.x;\r\n        const y: number = transform.globalPosition.position.y;\r\n        const r: number = shape.shape.radius;\r\n\r\n        ctx.save();\r\n\r\n        //SHAPE\r\n\r\n        ctx.fillStyle = shape.color;\r\n        ctx.globalAlpha = shape.alpha;\r\n\r\n        ctx.beginPath();\r\n\r\n        ctx.translate(x, y);\r\n\r\n        ctx.scale(transform.scale.value.x, transform.scale.value.y);\r\n\r\n        ctx.arc(0, 0, r, 0, Math.PI * 2);\r\n\r\n        ctx.fill();\r\n\r\n        ctx.closePath();\r\n\r\n        //OUTLINE\r\n\r\n        if (shape.outlineEnabled) {\r\n            ctx.strokeStyle = shape.outlineColor;\r\n            ctx.lineWidth = shape.outlineWidth;\r\n\r\n            ctx.beginPath();\r\n\r\n            ctx.arc(0, 0, r, 0, Math.PI * 2);\r\n\r\n            ctx.stroke();\r\n\r\n            ctx.closePath();\r\n        }\r\n\r\n        ctx.restore();\r\n    }\r\n    else {\r\n        console.warn(\"SHAPE IS NOT A CIRCLE BUT IS IN RECTANGLE RENDERING SYSTEM! \" + id);\r\n    }\r\n};\r\n\r\n//RENDERING TRIANGLES, SUB SYSTEM!\r\n\r\nfunction triangleRenderingSystem(engine: Engine, id: EntityId) {\r\n    const em: EntityManager = engine.getEntityManager();\r\n    const ctx = engine.getCtx();\r\n    const transform = em.getComponent(id, Transform);\r\n    const shape = em.getComponent(id, Shape);\r\n    if (!transform) throw new Error(\"TRANSFORM NULL IN TRIANGLE RENDERING SYSTEM !\" + id);\r\n    if (!shape) throw new Error(\"SHAPE NULL IN TRIANGLE RENDERING SYSTEM! \" + id);\r\n    const triangle = shape.shape;\r\n    if (!(triangle instanceof Triangle)) {\r\n        console.warn(\"SHAPE IS NOT A TRIANGLE BUT IS IN TRIANGLE RENDERING SYSTEM! \" + id);\r\n        return;\r\n    }\r\n\r\n    const pos = transform.globalPosition.position;\r\n    const selfRotationInRadians = (Math.PI * triangle.rotation) / 180;\r\n    const transformRotationInRadians = (Math.PI * transform.rotation.value) / 180\r\n    const totalRotationInRadians = selfRotationInRadians + transformRotationInRadians;\r\n\r\n    // Step 1: calculate local triangle points relative to center or p1\r\n    let localP1: Vector2, localP2: Vector2, localP3: Vector2;\r\n\r\n    if (triangle.centered) {\r\n        const centroid = {\r\n            x: (triangle.p1.x + triangle.p2.x + triangle.p3.x) / 3,\r\n            y: (triangle.p1.y + triangle.p2.y + triangle.p3.y) / 3,\r\n        };\r\n\r\n        localP1 = { x: triangle.p1.x - centroid.x, y: triangle.p1.y - centroid.y };\r\n        localP2 = { x: triangle.p2.x - centroid.x, y: triangle.p2.y - centroid.y };\r\n        localP3 = { x: triangle.p3.x - centroid.x, y: triangle.p3.y - centroid.y };\r\n    } else {\r\n        // treat p1 as origin\r\n        localP1 = { x: 0, y: 0 };\r\n        localP2 = { x: triangle.p2.x - triangle.p1.x, y: triangle.p2.y - triangle.p1.y };\r\n        localP3 = { x: triangle.p3.x - triangle.p1.x, y: triangle.p3.y - triangle.p1.y };\r\n    }\r\n\r\n    // Step 2: draw using local coordinates, then translate/rotate\r\n    ctx.save();\r\n\r\n    ctx.fillStyle = shape.color;\r\n    ctx.globalAlpha = shape.alpha;\r\n\r\n    ctx.translate(pos.x, pos.y);\r\n    ctx.rotate(totalRotationInRadians);\r\n    ctx.scale(transform.scale.value.x, transform.scale.value.y);\r\n\r\n    ctx.beginPath();\r\n    ctx.moveTo(localP1.x, localP1.y);\r\n    ctx.lineTo(localP2.x, localP2.y);\r\n    ctx.lineTo(localP3.x, localP3.y);\r\n    ctx.closePath();\r\n    ctx.fill();\r\n\r\n    if (shape.outlineEnabled) {\r\n        ctx.strokeStyle = shape.outlineColor;\r\n        ctx.lineWidth = shape.outlineWidth;\r\n\r\n        ctx.beginPath();\r\n        ctx.moveTo(localP1.x, localP1.y);\r\n        ctx.lineTo(localP2.x, localP2.y);\r\n        ctx.lineTo(localP3.x, localP3.y);\r\n        ctx.closePath();\r\n        ctx.stroke();\r\n    }\r\n\r\n    ctx.restore();\r\n};\r\n\r\n//TEXT RENDERING SYSTEM, SUB SYSTEM!\r\n\r\nfunction textRenderingSystem(engine: Engine, id: EntityId) {\r\n    const em: EntityManager = engine.getEntityManager();\r\n    const ctx: CanvasRenderingContext2D = engine.getCtx();\r\n    const transform = em.getComponent(id, Transform);\r\n    const text = em.getComponent(id, Text);\r\n    if (!transform) throw new Error(\"TRANSFORM NOT FOUND IN TEXT RENDERING SYSTEM! \" + id);\r\n    if (!text) throw new Error(\"TEXT NOT FOUND IN TEXT RENDERING SYSTEM! \" + id);\r\n\r\n    const pos: Vector2 = transform.globalPosition.position;\r\n    const selfRotationInRadians = (Math.PI * text.rotation) / 180;\r\n    const transformRotationInRadians = (Math.PI * transform.rotation.value) / 180\r\n    const totalRotationInRadians = selfRotationInRadians + transformRotationInRadians;\r\n\r\n    ctx.save();\r\n\r\n    ctx.translate(pos.x, pos.y);\r\n    ctx.rotate(totalRotationInRadians);\r\n    ctx.scale(transform.scale.value.x, transform.scale.value.y);\r\n\r\n    //DRAWING TEXT\r\n\r\n    ctx.beginPath();\r\n    ctx.textAlign = 'center';\r\n    ctx.textBaseline = 'middle';\r\n    ctx.fillStyle = text.color;\r\n    ctx.font = `${text.size}px ${text.style}`;\r\n    ctx.fillText(text.content, 0, 0, 50);\r\n    ctx.closePath();\r\n\r\n    //OUTLINE\r\n\r\n    if (text.outlineEnabled) {\r\n        ctx.beginPath();\r\n        ctx.strokeStyle = text.outlineColor;\r\n        ctx.lineWidth = text.outlineWidth;\r\n        ctx.font = `${text.size}px ${text.style}`;\r\n        ctx.strokeText(text.content, 0, 0, 50);\r\n        ctx.closePath();\r\n    }\r\n\r\n    ctx.restore();\r\n};\r\n\r\n//BUTTON PRESSAREA RENDEING, SUB SYSTEM!\r\n\r\nfunction buttonPressAreaRendering(engine: Engine, id: EntityId) {\r\n    const em: EntityManager = engine.getEntityManager();\r\n    const ctx: CanvasRenderingContext2D = engine.getCtx();\r\n    const transform = em.getComponent(id, Transform);\r\n    const button = em.getComponent(id, Button);\r\n    if (!transform) throw new Error(\"TRANSFORM NOT FOUND IN BUTTON PRESSAREA RENDERING SYSTEM! \" + id);\r\n    if (!button) throw new Error(\"BUTTON NOT FOUND IN BUTTON PRESSAREA RENDERING SYSTEM! \" + id);\r\n    const pos: Vector2 = transform?.globalPosition.position;\r\n    const w: number = button.pressArea.x;\r\n    const h: number = button.pressArea.y;\r\n    const rotationInRadians: number = (Math.PI * transform.rotation.value) / 180;\r\n    if (button.showPressArea) {\r\n        ctx.save();\r\n        ctx.translate(pos.x, pos.y);\r\n        ctx.rotate(rotationInRadians);\r\n        ctx.scale(transform.scale.value.x, transform.scale.value.y);\r\n        ctx.beginPath();\r\n        ctx.globalAlpha = 0.25;\r\n        ctx.fillStyle = button.pressAreaShowColor;\r\n        ctx.rect(-w / 2, -h / 2, button.pressArea.x, button.pressArea.y);\r\n        ctx.fill();\r\n        ctx.closePath();\r\n        ctx.restore();\r\n    };\r\n}","import { Engine } from \"./engine\";\r\nimport { Vector2 } from \"./types\";\r\nexport class Input {\r\n    private engine: Engine;\r\n    private position: Vector2 = { x: 0, y: 0 };\r\n    private justPressed: boolean = false;//just pressed, used to detect clicks\r\n    private pressed: boolean = false;// currently pressing\r\n    private justReleased: boolean = false;//just released, used to detect mouse leaves\r\n    constructor(engine: Engine) {\r\n        this.engine = engine;\r\n\r\n        this.start();\r\n    };\r\n    start() {\r\n        this.engine.addUpdateFunction(this.update.bind(this));\r\n        this.addListeners();\r\n    };\r\n    update() {\r\n        //console.log(\"JUST PRESSED:\", this.justPressed);\r\n        //console.log(\"PRESSED:\", this.pressed);\r\n        //console.log(\"JUST RELEASED\", this.justReleased);\r\n        //console.log(\"POS\", this.x, this.y);\r\n\r\n    };\r\n    updatePos(clientX: number, clientY: number) {\r\n        const canvas: HTMLCanvasElement = this.engine.getCanvas();\r\n        const rect: DOMRect = canvas.getBoundingClientRect();\r\n        this.position.x = clientX - rect.left;\r\n        this.position.y = clientY - rect.top;\r\n    };\r\n    addListeners() {\r\n        const pressedListeners = ['mousedown', 'touchstart'];\r\n        const moveListeners = ['mousemove', 'touchmove'];\r\n        const releasedListeners = ['mouseup', 'touchend'];\r\n\r\n        pressedListeners.forEach((event) => {\r\n            this.engine.getCanvas().addEventListener(event, (e: Event) => {\r\n                if (e instanceof MouseEvent) {\r\n                    this.updatePos(e.clientX, e.clientY);\r\n                }\r\n                else if (e instanceof TouchEvent) {\r\n                    this.updatePos(e.touches[0].clientX, e.touches[0].clientY);\r\n                }\r\n                this.justPressed = true;\r\n                this.pressed = true;\r\n            }, { passive: true });\r\n        });\r\n\r\n        moveListeners.forEach((event) => {// dont change press bools\r\n            this.engine.getCanvas().addEventListener(event, (e: Event) => {\r\n                if (e instanceof MouseEvent) {\r\n                    this.updatePos(e.clientX, e.clientY);\r\n                }\r\n                else if (e instanceof TouchEvent) {\r\n                    this.updatePos(e.touches[0].clientX, e.touches[0].clientY);\r\n                }\r\n            }, { passive: true });\r\n        });\r\n\r\n        releasedListeners.forEach((event) => {// dont change press bools\r\n            this.engine.getCanvas().addEventListener(event, () => {\r\n                this.justReleased = true;\r\n                this.pressed = false;\r\n            });\r\n        });\r\n    };\r\n    resetStates() {\r\n        this.justPressed = false;//reset\r\n        this.justReleased = false;//reset\r\n    }\r\n    isOver(x: number, y: number, w: number, h: number) {\r\n        return (\r\n            this.position.x >= x &&\r\n            this.position.x <= x + w &&\r\n            this.position.y >= y &&\r\n            this.position.y <= y + h\r\n        );\r\n    };\r\n    //GETTERS\r\n    getPosition(): Vector2 {\r\n        return this.position;\r\n    }\r\n    getJustPressed(): boolean {\r\n        return this.justPressed;\r\n    };\r\n    getPressed(): boolean {\r\n        return this.pressed;\r\n    };\r\n    getJustReleased(): boolean {\r\n        return this.justReleased;\r\n    };\r\n};","import { EntityManager } from \"entix-ecs\";\r\nimport { Engine } from \"../engine\";\r\nimport { Input } from \"../input\";\r\nimport { Button, Transform } from \"../components\";\r\nimport { Vector2 } from \"../types\";\r\n\r\nexport function buttonActionSystem(engine: Engine) {\r\n    const em: EntityManager = engine.getEntityManager();\r\n    const input: Input = engine.getInput();\r\n    const ctx: CanvasRenderingContext2D = engine.getCtx();\r\n    let anyButtonHovered: boolean = false;\r\n    em.query('All', {\r\n        transform: Transform,\r\n        button: Button\r\n    }, (id, { transform, button }) => {\r\n        if (!engine.isEntityActive(id) || !button.active) {\r\n            if (button.isHovered) {\r\n                button.isHovered = false;\r\n                button.onHoveredReleased();\r\n            }\r\n            return;\r\n        };\r\n\r\n        const pos: Vector2 = transform.globalPosition.position;\r\n        const w: number = button.pressArea.x;\r\n        const h: number = button.pressArea.y;\r\n        const scaledW:number =  w * transform.scale.value.x;\r\n        const scaledH:number = h * transform.scale.value.y;\r\n        const centeredX: number = pos.x - w / 2;\r\n        const centeredY: number = pos.y - h / 2;\r\n        \r\n        const isHovering = input.isOver(centeredX, centeredY, scaledW, scaledH);\r\n\r\n        if (isHovering) {\r\n            if(engine.isEntityBlockingInput(input.getPosition().x, input.getPosition().y, button.layer))return;\r\n            anyButtonHovered = true;\r\n            if (!button.isHovered) {\r\n                button.isHovered = true;\r\n                button.onJustHovered();\r\n            };\r\n            button.onHovered();\r\n            //JUST PRESSED\r\n            if (input.getJustPressed()) {\r\n                button.onJustPressed();\r\n            };\r\n            //PRESSED\r\n            if (input.getPressed()) {\r\n                button.onPress();\r\n            };\r\n            //JUST RELEASED\r\n            if (input.getJustReleased()) {\r\n                button.onJustReleased();\r\n            }\r\n        }\r\n        else {\r\n            if (button.isHovered) {\r\n                button.isHovered = false;\r\n                button.onHoveredReleased();\r\n            }\r\n        }\r\n\r\n        if (button.changeCursorToPointer) {\r\n            const canvas = engine.getCanvas();\r\n            if (anyButtonHovered) {\r\n                canvas.style.cursor = 'pointer';\r\n            } else {\r\n                canvas.style.cursor = 'default';\r\n            }\r\n        }\r\n\r\n    });\r\n};","import { EntityId, EntityManager } from \"entix-ecs\";\r\nimport { Engine } from \"./engine\";\r\nimport { Children, Circle, EntityActive, Parent, Rectangle, Scene, Shape, Sprite, Transform, Triangle, Text, Button } from \"./components\";\r\nimport { Vector2 } from \"./types\";\r\n\r\nexport class EntityTemplates {\r\n    private engine: Engine;\r\n    private em: EntityManager;;\r\n    constructor(engine: Engine) {\r\n        this.engine = engine;\r\n        this.em = engine.getEntityManager();\r\n    };\r\n    createEmptyEntity(parent?: EntityId): EntityId {// creates a entity with basic Transform component\r\n        const id: EntityId = this.em.createEntity();// new entity created\r\n        this.em.addComponent(id, Transform, new Transform({}));\r\n        this.em.addComponent(id, EntityActive, new EntityActive({}));\r\n        this.em.addComponent(id, Parent, new Parent());\r\n        this.em.addComponent(id, Children, new Children());\r\n\r\n        if (parent) {//assign only if a valid parent is passed\r\n            this.engine.addParent(id, parent);\r\n        }\r\n        return id;\r\n    };\r\n    createSpriteEntity(image: HTMLImageElement, width: number, height: number, parent?: EntityId): EntityId {//creates a basic sprite entity\r\n        const id: EntityId = this.createEmptyEntity(parent);\r\n        this.em.addComponent(id, Sprite, new Sprite({\r\n            image: image,\r\n            width: width,\r\n            height: height\r\n        }));\r\n\r\n        return id;\r\n    };\r\n    createSceneEntity(name: string = 'unnamedScene'): EntityId {// creates a scene entity\r\n        const id: EntityId = this.createEmptyEntity();//do not require parent\r\n        this.em.addComponent(id, Scene, new Scene({ name: name }));\r\n        this.em.addComponent(id, Children, new Children());\r\n        this.engine.addScene(id);\r\n        return id;\r\n    };\r\n    createRectangleEntity(width: number, height: number, parent?: EntityId): EntityId {\r\n        const id: EntityId = this.createEmptyEntity(parent);\r\n        this.em.addComponent(id, Shape, new Shape({\r\n            shape: new Rectangle({\r\n                width: width,\r\n                height: height\r\n            })\r\n        }));\r\n        return id;\r\n    };\r\n    createCircleEntity(radius: number, parent?: EntityId) {\r\n        const id: EntityId = this.createEmptyEntity(parent);\r\n        this.em.addComponent(id, Shape, new Shape({\r\n            shape: new Circle({\r\n                radius: radius\r\n            })\r\n        }));\r\n        return id;\r\n    };\r\n    createTriangleEntity(p1: Vector2, p2: Vector2, p3: Vector2, parent?: EntityId): EntityId {\r\n        const id: EntityId = this.createEmptyEntity(parent);\r\n        this.em.addComponent(id, Shape, new Shape({\r\n            shape: new Triangle({\r\n                p1: p1,\r\n                p2: p2,\r\n                p3: p3\r\n            })\r\n        }));\r\n        return id;\r\n    };\r\n    createTextEntity(content: string, parent?: EntityId): EntityId {\r\n        const id: EntityId = this.createEmptyEntity(parent);\r\n        this.em.addComponent(id, Text, new Text({\r\n            content: content\r\n        }));\r\n        return id;\r\n    };\r\n    createRectButtonEntity(width: number, height: number, textContent?: string, parent?: EntityId): EntityId {\r\n        const id: EntityId = this.createEmptyEntity(parent);\r\n        this.em.addComponent(id, Button, new Button(\r\n            {\r\n                pressArea: { x: width, y: height }\r\n            }\r\n        ));\r\n        this.em.addComponent(id, Shape, new Shape({\r\n            shape: new Rectangle({\r\n                width: width,\r\n                height: height\r\n            }),\r\n            blocksInput:false\r\n        }));\r\n        this.em.addComponent(id,Text,new Text({\r\n            content:textContent\r\n        }));\r\n        return id;\r\n    };\r\n    createTexturedButtonEntity(image:HTMLImageElement,width:number,height:number,parent?:EntityId):EntityId{\r\n        const id:EntityId = this.createEmptyEntity(parent);\r\n        this.em.addComponent(id,Button,new Button({\r\n            pressArea:{x:width,y:height}\r\n        }));\r\n        this.em.addComponent(id,Sprite, new Sprite({\r\n            image:image,\r\n            width:width,\r\n            height:height,\r\n            blocksInput:false\r\n        }));\r\n        return id;\r\n    }\r\n};"],"mappings":"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","names":["entityActive"]}