{"_id":"bloody-engine","_rev":"31-7c9922a376a1e339f771760ef84159ce","name":"bloody-engine","dist-tags":{"latest":"1.1.18"},"versions":{"1.0.0":{"name":"bloody-engine","version":"1.0.0","keywords":["webgl","graphics","engine","2.5d","isometric","rendering","game-engine","typescript"],"license":"MIT","_id":"bloody-engine@1.0.0","maintainers":[{"name":"bloodek","email":"pawelmichalak98@gmail.com"}],"homepage":"https://github.com/BLooDek/bloody-engine#readme","bugs":{"url":"https://github.com/BLooDek/bloody-engine/issues"},"dist":{"shasum":"0489049a5e137fd5e32e3eaf585b99446d6303ed","tarball":"https://registry.npmjs.org/bloody-engine/-/bloody-engine-1.0.0.tgz","fileCount":12,"integrity":"sha512-QSsU0ajssO88C4j1f6CjgoVQEziZNiRJXWh1jfyQVzNx3rO0P2FlMw2Qqb/7/Awq85pE/PrdVp8an2YipcHHeg==","signatures":[{"sig":"MEYCIQC7wWH2bit6sWRWDDXIMRu5nTORVdfMUglXH4q6VikhfgIhAJV5L+sj6f8jGXcNpvj9AIzDYRWgah80XX+MlYHoVex3","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":179220},"main":"dist/node/index.js","type":"module","types":"./dist/web/index.d.ts","exports":{".":{"types":"./dist/web/index.d.ts","import":"./dist/web/index.js","require":"./dist/node/index.js"}},"gitHead":"e72c9d5c5d4e687cc7d7542932a83ef9cca671ba","scripts":{"dev":"vite","build":"npm run build:web && npm run build:node","start":"npm run build:node && node dist/node/index-node.js","preview":"vite preview","build:web":"vite build --config vite.config.web.ts","build:node":"vite build --config vite.config.node.ts"},"_npmUser":{"name":"bloodek","email":"pawelmichalak98@gmail.com"},"repository":{"url":"git+https://github.com/BLooDek/bloody-engine.git","type":"git"},"_npmVersion":"11.4.2","description":"A WebGL-based 2.5D graphics engine for isometric rendering","directories":{},"_nodeVersion":"24.12.0","dependencies":{"gl":"^8.1.6","pngjs":"^7.0.0","@kmamal/sdl":"^0.11.13"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.3.0","@types/gl":"^6.0.5","typescript":"^5.3.3","@types/node":"^20.10.6"},"_npmOperationalInternal":{"tmp":"tmp/bloody-engine_1.0.0_1769213180288_0.4722557325666248","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"bloody-engine","version":"1.0.1","keywords":["webgl","graphics","engine","2.5d","isometric","rendering","game-engine","typescript"],"license":"MIT","_id":"bloody-engine@1.0.1","maintainers":[{"name":"bloodek","email":"pawelmichalak98@gmail.com"}],"homepage":"https://github.com/BLooDek/bloody-engine#readme","bugs":{"url":"https://github.com/BLooDek/bloody-engine/issues"},"dist":{"shasum":"9b20302436de17f7fa4d151bae80545088b03546","tarball":"https://registry.npmjs.org/bloody-engine/-/bloody-engine-1.0.1.tgz","fileCount":12,"integrity":"sha512-4lqyJFKATcW7aCCJT6nmwoncg8NjY8kJojsg/UeLbnFKIMv6HmHf9PM/Y8S/fCvNu/yZJP/Xru3RF5IFHeZp1g==","signatures":[{"sig":"MEUCIFVTwIVqeNWd0kommSo2b8wZuJQHlr+6XOAuToeGlTfsAiEAq1eatKfpavax62QOqDL0VqNCRnHTV1m1QjlPzviYvSs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":179275},"main":"dist/node/index.js","type":"module","types":"./dist/web/index.d.ts","exports":{".":{"types":"./dist/web/index.d.ts","import":"./dist/web/index.js","require":"./dist/node/index.js"}},"gitHead":"e2d7be54507ee7c46ed2ce8f449f254d0e0c5d5c","scripts":{"dev":"vite","demo":"npm run build:demo && node dist/demo/index.js","build":"npm run build:web && npm run build:node","preview":"vite preview","build:web":"vite build --config vite.config.web.ts","build:demo":"vite build --config vite.config.demo.ts","build:node":"vite build --config vite.config.node.ts"},"_npmUser":{"name":"bloodek","email":"pawelmichalak98@gmail.com"},"repository":{"url":"git+https://github.com/BLooDek/bloody-engine.git","type":"git"},"_npmVersion":"11.4.2","description":"A WebGL-based 2.5D graphics engine for isometric rendering","directories":{},"_nodeVersion":"24.12.0","dependencies":{"gl":"^8.1.6","pngjs":"^7.0.0","@kmamal/sdl":"^0.11.13"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.3.0","@types/gl":"^6.0.5","typescript":"^5.3.3","@types/node":"^20.10.6"},"_npmOperationalInternal":{"tmp":"tmp/bloody-engine_1.0.1_1769214518310_0.09155490023833335","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"bloody-engine","version":"1.0.2","keywords":["webgl","graphics","engine","2.5d","isometric","rendering","game-engine","typescript"],"license":"MIT","_id":"bloody-engine@1.0.2","maintainers":[{"name":"bloodek","email":"pawelmichalak98@gmail.com"}],"homepage":"https://github.com/BLooDek/bloody-engine#readme","bugs":{"url":"https://github.com/BLooDek/bloody-engine/issues"},"dist":{"shasum":"d147add74ac01dcc287179c14c0cd97ae5ff9ac7","tarball":"https://registry.npmjs.org/bloody-engine/-/bloody-engine-1.0.2.tgz","fileCount":6,"integrity":"sha512-W3qa7LHMAtAsW7YvbOYaY+pNRLF3OFtWBilUH5WQYRGoIxchlwvNx8y0ZlrOhZEtPk3dezcyfIgjGD3buNN5nA==","signatures":[{"sig":"MEYCIQD40X6HX7WtwTWn/+lXnLgXkBgSLnvz4kHYYnpAQzBlqAIhAOYi1XOeyZ9f92e4uhIc2ZPYdp9OJ97SLb1CTuVAPLIY","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":151967},"main":"dist/node/index.js","type":"module","types":"./dist/web/index.d.ts","exports":{".":{"types":"./dist/web/index.d.ts","import":"./dist/web/index.js","require":"./dist/node/index.js"}},"gitHead":"e2d7be54507ee7c46ed2ce8f449f254d0e0c5d5c","scripts":{"dev":"vite","demo":"npm run build:demo && node dist/demo/index.js","build":"npm run build:web && npm run build:node","preview":"vite preview","build:web":"vite build --config vite.config.web.ts","build:demo":"vite build --config vite.config.demo.ts","build:node":"vite build --config vite.config.node.ts"},"_npmUser":{"name":"bloodek","email":"pawelmichalak98@gmail.com"},"repository":{"url":"git+https://github.com/BLooDek/bloody-engine.git","type":"git"},"_npmVersion":"11.4.2","description":"A WebGL-based 2.5D graphics engine for isometric rendering","directories":{},"_nodeVersion":"24.12.0","dependencies":{"gl":"^8.1.6","pngjs":"^7.0.0","@kmamal/sdl":"^0.11.13"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.3.0","@types/gl":"^6.0.5","typescript":"^5.3.3","@types/node":"^20.10.6"},"_npmOperationalInternal":{"tmp":"tmp/bloody-engine_1.0.2_1769214645382_0.38774347438062984","host":"s3://npm-registry-packages-npm-production"}},"1.0.3":{"name":"bloody-engine","version":"1.0.3","keywords":["webgl","graphics","engine","2.5d","isometric","rendering","game-engine","typescript"],"license":"MIT","_id":"bloody-engine@1.0.3","maintainers":[{"name":"bloodek","email":"pawelmichalak98@gmail.com"}],"homepage":"https://github.com/BLooDek/bloody-engine#readme","bugs":{"url":"https://github.com/BLooDek/bloody-engine/issues"},"dist":{"shasum":"03036f3923a3f8d9877d269bbac8fcc57c7fc7ee","tarball":"https://registry.npmjs.org/bloody-engine/-/bloody-engine-1.0.3.tgz","fileCount":6,"integrity":"sha512-gEQyMnP/ko1A4S8LlxErhVMH2kna5cpIe0kIoZXHUP16XVSBINHogtaAja2W3vYQo9ANTigTsjxENiLyMc5pLw==","signatures":[{"sig":"MEYCIQCH02Y2xxLkEQnHmjaXdI8tZJ6O7RgZGrR6R97Yt06xjwIhAOQIFEvSqQIwC7Gxa3YerjvTeSKMUjGdDxK0gKQ8/PTl","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":151665},"main":"dist/node/index.js","type":"module","types":"./dist/web/index.d.ts","exports":{".":{"types":"./dist/web/index.d.ts","import":"./dist/web/index.js","require":"./dist/node/index.js"}},"gitHead":"371257b88fa0f45d0f61f8e00e051031109210fd","scripts":{"dev":"vite","demo":"npm run build:demo && node dist/demo/index.js","build":"npm run build:web && npm run build:node","preview":"vite preview","build:web":"vite build --config vite.config.web.ts","build:demo":"vite build --config vite.config.demo.ts","build:node":"vite build --config vite.config.node.ts"},"_npmUser":{"name":"bloodek","email":"pawelmichalak98@gmail.com"},"repository":{"url":"git+https://github.com/BLooDek/bloody-engine.git","type":"git"},"_npmVersion":"11.4.2","description":"A WebGL-based 2.5D graphics engine for isometric rendering","directories":{},"_nodeVersion":"24.12.0","dependencies":{"gl":"^8.1.6","pngjs":"^7.0.0","@kmamal/sdl":"^0.11.13"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.3.0","@types/gl":"^6.0.5","typescript":"^5.3.3","@types/node":"^20.10.6"},"_npmOperationalInternal":{"tmp":"tmp/bloody-engine_1.0.3_1769214831209_0.517879845228207","host":"s3://npm-registry-packages-npm-production"}},"1.0.4":{"name":"bloody-engine","version":"1.0.4","keywords":["webgl","graphics","engine","2.5d","isometric","rendering","game-engine","typescript"],"license":"MIT","_id":"bloody-engine@1.0.4","maintainers":[{"name":"bloodek","email":"pawelmichalak98@gmail.com"}],"homepage":"https://github.com/BLooDek/bloody-engine#readme","bugs":{"url":"https://github.com/BLooDek/bloody-engine/issues"},"dist":{"shasum":"dcedb207f8d6eb081fb802aca882b71b2960ed9c","tarball":"https://registry.npmjs.org/bloody-engine/-/bloody-engine-1.0.4.tgz","fileCount":68,"integrity":"sha512-Lm/0jFtjcN4ivDtlN3OCnpy9wDmA2Wj213osAHcG8+yupXAiU5XJyhEB95kRda29thadqKKOwQ2hOeSrcJtTeg==","signatures":[{"sig":"MEYCIQDjqum7sgHpN08E2vhSw4KGsbSQQPYgVVRB8aZ3vDh7hQIhAIMYs42zfy8v/ut2HWzufh6fzXBlOkUULqmCv8SGyRu5","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":238656},"main":"dist/node/index.js","type":"module","types":"./dist/web/index.d.ts","exports":{".":{"types":"./dist/web/index.d.ts","import":"./dist/web/index.js","require":"./dist/node/index.js"}},"gitHead":"371257b88fa0f45d0f61f8e00e051031109210fd","scripts":{"dev":"vite","demo":"npm run build:demo && node dist/demo/index.js","build":"npm run build:web && npm run build:node","preview":"vite preview","build:web":"tsc --emitDeclarationOnly --declaration --declarationMap --outDir dist/web && vite build --config vite.config.web.ts","build:demo":"vite build --config vite.config.demo.ts","build:node":"tsc --emitDeclarationOnly --declaration --declarationMap --outDir dist/node && vite build --config vite.config.node.ts"},"_npmUser":{"name":"bloodek","email":"pawelmichalak98@gmail.com"},"repository":{"url":"git+https://github.com/BLooDek/bloody-engine.git","type":"git"},"_npmVersion":"11.4.2","description":"A WebGL-based 2.5D graphics engine for isometric rendering","directories":{},"_nodeVersion":"24.12.0","dependencies":{"gl":"^8.1.6","pngjs":"^7.0.0","@kmamal/sdl":"^0.11.13"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.3.0","@types/gl":"^6.0.5","typescript":"^5.3.3","@types/node":"^20.10.6","vite-plugin-dts":"^4.5.4"},"_npmOperationalInternal":{"tmp":"tmp/bloody-engine_1.0.4_1769215824002_0.7431050679154387","host":"s3://npm-registry-packages-npm-production"}},"1.0.5":{"name":"bloody-engine","version":"1.0.5","keywords":["webgl","graphics","engine","2.5d","isometric","rendering","game-engine","typescript"],"license":"MIT","_id":"bloody-engine@1.0.5","maintainers":[{"name":"bloodek","email":"pawelmichalak98@gmail.com"}],"homepage":"https://github.com/BLooDek/bloody-engine#readme","bugs":{"url":"https://github.com/BLooDek/bloody-engine/issues"},"dist":{"shasum":"bd6d19da4aecb48944d092d9dd4a5a662a5ec446","tarball":"https://registry.npmjs.org/bloody-engine/-/bloody-engine-1.0.5.tgz","fileCount":64,"integrity":"sha512-dfaG+qv9xQbpDLc4mZ+WCnK5CqWoOmXdRfeRAh6cd9J3ln33zl2U+vitL6Wpn1V5GtzSbDCAH4tGTaWsklwKkQ==","signatures":[{"sig":"MEUCIQDphLfSoLfqAnPH6lwrh87/Vp2WHnAHaNYL9GS+Xf0RGAIgHOIBB6Q5sGH3ITxiCCZBny2zp5ChL9RjRg1KXQre+s8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":265363},"main":"dist/node/index.js","type":"module","types":"./dist/web/index.d.ts","exports":{".":{"types":"./dist/web/index.d.ts","import":"./dist/web/index.js","require":"./dist/node/index.js"}},"gitHead":"a2a61e5ce3f2a8a0d8cbbfc0891339187340132e","scripts":{"dev":"vite","demo":"npm run build:demo && node dist/demo/index.js","build":"npm run build:web && npm run build:node","preview":"vite preview","build:web":"tsc --emitDeclarationOnly --declaration --declarationMap --outDir dist/web && vite build --config vite.config.web.ts","build:demo":"vite build --config vite.config.demo.ts","build:node":"tsc --emitDeclarationOnly --declaration --declarationMap --outDir dist/node && vite build --config vite.config.node.ts"},"_npmUser":{"name":"bloodek","email":"pawelmichalak98@gmail.com"},"repository":{"url":"git+https://github.com/BLooDek/bloody-engine.git","type":"git"},"_npmVersion":"11.4.2","description":"A WebGL-based 2.5D graphics engine for isometric rendering","directories":{},"_nodeVersion":"24.12.0","dependencies":{"gl":"^8.1.6","pngjs":"^7.0.0","@kmamal/sdl":"^0.11.13"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.3.0","@types/gl":"^6.0.5","typescript":"^5.3.3","@types/node":"^20.10.6","vite-plugin-dts":"^4.5.4"},"_npmOperationalInternal":{"tmp":"tmp/bloody-engine_1.0.5_1769218403492_0.6480569557458364","host":"s3://npm-registry-packages-npm-production"}},"1.0.6":{"name":"bloody-engine","version":"1.0.6","keywords":["webgl","graphics","engine","2.5d","isometric","rendering","game-engine","typescript","nodejs"],"license":"MIT","_id":"bloody-engine@1.0.6","maintainers":[{"name":"bloodek","email":"pawelmichalak98@gmail.com"}],"homepage":"https://github.com/BLooDek/bloody-engine#readme","bugs":{"url":"https://github.com/BLooDek/bloody-engine/issues"},"dist":{"shasum":"94ba8b4b03ac871a1dab2c6cd0cf6dce4823fa31","tarball":"https://registry.npmjs.org/bloody-engine/-/bloody-engine-1.0.6.tgz","fileCount":58,"integrity":"sha512-or02nTDuvMnPNZcpxFidCcEAR3lHMQPYXCnmO+/rdvKyeOtidOQ3uFsuiO2zY+Sgor4tWTMgyI6kGhu75c8B6A==","signatures":[{"sig":"MEUCID+zUOdstmYQdELvLd2+Ukd9ST81r10tgXdyZp2kd4C9AiEApwHmCafZWJBT3OihKuPHuSycsAAaFs6Ouy+A/UGEnlc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":142852},"main":"dist/node/index.js","type":"module","types":"./dist/node/index.d.ts","exports":{".":{"types":"./dist/node/index.d.ts","import":"./dist/node/index.js","require":"./dist/node/index.js"}},"gitHead":"93bb1d56f0647702fd958d3a4d936976bca2b57c","scripts":{"demo":"npm run build:demo && node dist/demo/index.js","build":"vite build --config vite.config.node.ts","build:demo":"vite build --config vite.config.demo.ts","build:node":"vite build --config vite.config.node.ts"},"_npmUser":{"name":"bloodek","email":"pawelmichalak98@gmail.com"},"repository":{"url":"git+https://github.com/BLooDek/bloody-engine.git","type":"git"},"_npmVersion":"11.4.2","description":"A WebGL-based 2.5D graphics engine for isometric rendering","directories":{},"_nodeVersion":"24.12.0","dependencies":{"gl":"^8.1.6","pngjs":"^7.0.0","@kmamal/sdl":"^0.11.13"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.3.0","@types/gl":"^6.0.5","typescript":"^5.3.3","@types/node":"^20.10.6","vite-plugin-dts":"^4.5.4"},"_npmOperationalInternal":{"tmp":"tmp/bloody-engine_1.0.6_1769258357075_0.27357661192657323","host":"s3://npm-registry-packages-npm-production"}},"1.0.7":{"name":"bloody-engine","version":"1.0.7","keywords":["webgl","graphics","engine","2.5d","isometric","rendering","game-engine","typescript","nodejs"],"license":"MIT","_id":"bloody-engine@1.0.7","maintainers":[{"name":"bloodek","email":"pawelmichalak98@gmail.com"}],"homepage":"https://github.com/BLooDek/bloody-engine#readme","bugs":{"url":"https://github.com/BLooDek/bloody-engine/issues"},"dist":{"shasum":"0a709d4d29a131bc346c654a267ef13b24387b08","tarball":"https://registry.npmjs.org/bloody-engine/-/bloody-engine-1.0.7.tgz","fileCount":94,"integrity":"sha512-BeOCRQmELGmdJAP1WcuqiJmJQIu2qJeIIhJX5mV5QVUmgg6HKLlOoCzIRWIOzg/30EFKsnz+sbWTaKvyww3ZZQ==","signatures":[{"sig":"MEQCIGsA0vCMscCF7rpUVF8y5I+ctySCxDX2zlz7GkLXElk8AiAXrBUk63UMeG5jJTvYdz4614gLn6qsgL1KmMII9vYYcA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":278683},"main":"dist/node/index.js","type":"module","types":"./dist/node/index.d.ts","exports":{".":{"types":"./dist/node/index.d.ts","import":"./dist/node/index.js","require":"./dist/node/index.js"}},"gitHead":"fe60143e5e032c83a9e8a04236244f15b1fd319f","scripts":{"demo":"npm run build:demo && node dist/demo/index.js","build":"vite build --config vite.config.node.ts","build:demo":"vite build --config vite.config.demo.ts","build:node":"vite build --config vite.config.node.ts"},"_npmUser":{"name":"bloodek","email":"pawelmichalak98@gmail.com"},"repository":{"url":"git+https://github.com/BLooDek/bloody-engine.git","type":"git"},"_npmVersion":"11.4.2","description":"A WebGL-based 2.5D graphics engine for isometric rendering","directories":{},"_nodeVersion":"24.12.0","dependencies":{"gl":"^8.1.6","pngjs":"^7.0.0","@kmamal/sdl":"^0.11.13"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.3.0","@types/gl":"^6.0.5","typescript":"^5.3.3","@types/node":"^20.10.6","vite-plugin-dts":"^4.5.4"},"_npmOperationalInternal":{"tmp":"tmp/bloody-engine_1.0.7_1769266079817_0.22402435113868613","host":"s3://npm-registry-packages-npm-production"}},"1.0.8":{"name":"bloody-engine","version":"1.0.8","keywords":["webgl","graphics","engine","2.5d","isometric","rendering","game-engine","typescript","nodejs"],"license":"MIT","_id":"bloody-engine@1.0.8","maintainers":[{"name":"bloodek","email":"pawelmichalak98@gmail.com"}],"homepage":"https://github.com/BLooDek/bloody-engine#readme","bugs":{"url":"https://github.com/BLooDek/bloody-engine/issues"},"dist":{"shasum":"4cfd93507546f8fa4224bd3760c9740f7a18bb3f","tarball":"https://registry.npmjs.org/bloody-engine/-/bloody-engine-1.0.8.tgz","fileCount":122,"integrity":"sha512-GTtu5VfqRXkZ0XYp8jDrx9kNnalVUA9w12LRsbp3vutwQkxe6+GFaDgjkPKqpRpeib57rO3t0ZX/j3tMT5bwfg==","signatures":[{"sig":"MEUCIFLo+E7SF+kCxObR0GKlcPbryDz81cBb4ey9vwHV27wAAiEA5MNM00qIAjbibL4OboDJEkicNSn2PciOhrnDdxhDcZc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":403815},"main":"dist/node/index.js","type":"module","types":"./dist/node/index.d.ts","exports":{".":{"types":"./dist/node/index.d.ts","import":"./dist/node/index.js","require":"./dist/node/index.js"}},"gitHead":"54625ad1d9569c3732e21e6df05f165f19aaf079","scripts":{"demo":"npm run build:demo && node dist/demo/index.js","test":"vitest run","build":"vite build --config vite.config.node.ts","test:ui":"vitest --ui","build:demo":"vite build --config vite.config.demo.ts","build:node":"vite build --config vite.config.node.ts","test:watch":"vitest","test:visual":"node test-visual.js","test:coverage":"vitest run --coverage","test:state-sync":"vitest run src/state-sync.test.ts","test:determinism":"node test-determinism.js"},"_npmUser":{"name":"bloodek","email":"pawelmichalak98@gmail.com"},"repository":{"url":"git+https://github.com/BLooDek/bloody-engine.git","type":"git"},"_npmVersion":"11.4.2","description":"A WebGL-based 2.5D graphics engine for isometric rendering","directories":{},"_nodeVersion":"24.12.0","dependencies":{"gl":"^8.1.6","pngjs":"^7.0.0","@kmamal/sdl":"^0.11.13"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.3.0","vitest":"^4.0.18","@types/gl":"^6.0.5","@vitest/ui":"^4.0.18","typescript":"^5.3.3","@types/node":"^20.10.6","vite-plugin-dts":"^4.5.4"},"_npmOperationalInternal":{"tmp":"tmp/bloody-engine_1.0.8_1769296520258_0.7715929369616206","host":"s3://npm-registry-packages-npm-production"}},"1.0.9":{"name":"bloody-engine","version":"1.0.9","keywords":["webgl","graphics","engine","2.5d","isometric","rendering","game-engine","typescript","nodejs"],"license":"MIT","_id":"bloody-engine@1.0.9","maintainers":[{"name":"bloodek","email":"pawelmichalak98@gmail.com"}],"homepage":"https://github.com/BLooDek/bloody-engine#readme","bugs":{"url":"https://github.com/BLooDek/bloody-engine/issues"},"dist":{"shasum":"64862ec9c62df1d1d4c8b395834ab98379ce1b80","tarball":"https://registry.npmjs.org/bloody-engine/-/bloody-engine-1.0.9.tgz","fileCount":114,"integrity":"sha512-ByZHAvx3rGeUa4rrLU7BjwydQk2yyknJ9G7X6/TkvLHPiQN11WB7bLNSU2fHAwaXBQkSlEsqotWNaH8QT1Mb7A==","signatures":[{"sig":"MEUCIQDmQ1Ub77fALOOfR/YcQ4mIBdl/Ccu4Bm0amzDRewTCGgIgfDjWR0tLa2AJjMx1U7FatTAmwJxS326SlD1TKN0Agxo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":414658},"main":"dist/node/index.js","type":"module","types":"./dist/node/index.d.ts","exports":{".":{"types":"./dist/node/index.d.ts","import":"./dist/node/index.js","require":"./dist/node/index.js"}},"gitHead":"289db9c55eb77ba3a68995952d0c55961cf2a53d","scripts":{"demo":"npm run build:demo && node dist/demo/index.js","test":"vitest run","build":"vite build --config vite.config.node.ts","test:ui":"vitest --ui","build:demo":"vite build --config vite.config.demo.ts","build:node":"vite build --config vite.config.node.ts","test:watch":"vitest","test:visual":"node test-visual.js","test:coverage":"vitest run --coverage","test:state-sync":"vitest run src/state-sync.test.ts","test:determinism":"node test-determinism.js"},"_npmUser":{"name":"bloodek","email":"pawelmichalak98@gmail.com"},"repository":{"url":"git+https://github.com/BLooDek/bloody-engine.git","type":"git"},"_npmVersion":"11.4.2","description":"A WebGL-based 2.5D graphics engine for isometric rendering","directories":{},"_nodeVersion":"24.12.0","dependencies":{"gl":"^8.1.6","pngjs":"^7.0.0","@kmamal/sdl":"^0.11.13"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.3.0","vitest":"^4.0.18","@types/gl":"^6.0.5","@vitest/ui":"^4.0.18","typescript":"^5.3.3","@types/node":"^20.10.6","vite-plugin-dts":"^4.5.4"},"_npmOperationalInternal":{"tmp":"tmp/bloody-engine_1.0.9_1769298716457_0.8058846508340989","host":"s3://npm-registry-packages-npm-production"}},"1.0.10":{"name":"bloody-engine","version":"1.0.10","keywords":["webgl","graphics","engine","2.5d","isometric","rendering","game-engine","typescript","nodejs"],"license":"MIT","_id":"bloody-engine@1.0.10","maintainers":[{"name":"bloodek","email":"pawelmichalak98@gmail.com"}],"homepage":"https://github.com/BLooDek/bloody-engine#readme","bugs":{"url":"https://github.com/BLooDek/bloody-engine/issues"},"dist":{"shasum":"14827ed08b392791deccf394d15a11e4b56bac37","tarball":"https://registry.npmjs.org/bloody-engine/-/bloody-engine-1.0.10.tgz","fileCount":114,"integrity":"sha512-9uDPctR8SZrPFeGd4ejpXMTuJfRgO+7SJf6x9Mqj80dS4Ft/Eqx6KcC/9qovkUHOFcEc77DVKkleut2J9sEOCQ==","signatures":[{"sig":"MEUCICRLQJH886M8BvxgrxF88UbkiBcpR94vEZXFsSNX5McnAiEAzXiPyc8WD06C+VuZnmrHQxoHUYB+EPzAgr8Qmsw+8U0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":414659},"main":"dist/node/index.js","type":"module","types":"./dist/node/index.d.ts","exports":{".":{"types":"./dist/node/index.d.ts","import":"./dist/node/index.js","require":"./dist/node/index.js"}},"gitHead":"289db9c55eb77ba3a68995952d0c55961cf2a53d","scripts":{"demo":"npm run build:demo && node dist/demo/index.js","test":"vitest run","build":"vite build --config vite.config.node.ts","test:ui":"vitest --ui","build:demo":"vite build --config vite.config.demo.ts","build:node":"vite build --config vite.config.node.ts","test:watch":"vitest","test:visual":"node test-visual.js","test:coverage":"vitest run --coverage","test:state-sync":"vitest run src/state-sync.test.ts","test:determinism":"node test-determinism.js"},"_npmUser":{"name":"bloodek","email":"pawelmichalak98@gmail.com"},"repository":{"url":"git+https://github.com/BLooDek/bloody-engine.git","type":"git"},"_npmVersion":"11.4.2","description":"A WebGL-based 2.5D graphics engine for isometric rendering","directories":{},"_nodeVersion":"24.12.0","dependencies":{"gl":"^8.1.6","pngjs":"^7.0.0","@kmamal/sdl":"^0.11.13"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.3.0","vitest":"^4.0.18","@types/gl":"^6.0.5","@vitest/ui":"^4.0.18","typescript":"^5.3.3","@types/node":"^20.10.6","vite-plugin-dts":"^4.5.4"},"_npmOperationalInternal":{"tmp":"tmp/bloody-engine_1.0.10_1769302396149_0.8067095177509684","host":"s3://npm-registry-packages-npm-production"}},"1.0.11":{"name":"bloody-engine","version":"1.0.11","keywords":["webgl","graphics","engine","2.5d","isometric","rendering","game-engine","typescript","nodejs"],"license":"MIT","_id":"bloody-engine@1.0.11","maintainers":[{"name":"bloodek","email":"pawelmichalak98@gmail.com"}],"homepage":"https://github.com/BLooDek/bloody-engine#readme","bugs":{"url":"https://github.com/BLooDek/bloody-engine/issues"},"dist":{"shasum":"22d51fbe269d64eb42b2ab46b8701d659fc697af","tarball":"https://registry.npmjs.org/bloody-engine/-/bloody-engine-1.0.11.tgz","fileCount":114,"integrity":"sha512-4RVMk03Q/ta+K6eKHqPPU0jRw+sd531LRibAU30AbgiHM32epGNCnDBv+Du65ryE6i8EL0bx6aCcvK4eozy3KA==","signatures":[{"sig":"MEUCIQC56AgBmyDyf7KhfxfhZfDwI/kQwEl7ZlIbfHBgs/muFgIgUqgRbKxGJ68/K2wtdr7MZMTo+2PAy1jZm8NU3TTurR8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":419999},"main":"dist/node/index.js","type":"module","types":"./dist/node/index.d.ts","exports":{".":{"types":"./dist/node/index.d.ts","import":"./dist/node/index.js","require":"./dist/node/index.js"}},"gitHead":"289db9c55eb77ba3a68995952d0c55961cf2a53d","scripts":{"demo":"npm run build:demo && node dist/demo/index.js","test":"vitest run","build":"vite build --config vite.config.node.ts","test:ui":"vitest --ui","build:demo":"vite build --config vite.config.demo.ts","build:node":"vite build --config vite.config.node.ts","test:watch":"vitest","test:visual":"node test-visual.js","test:coverage":"vitest run --coverage","test:state-sync":"vitest run src/state-sync.test.ts","demo:coordinates":"npm run build && node dist/node/examples/coordinate-systems-demo.js","test:determinism":"node test-determinism.js"},"_npmUser":{"name":"bloodek","email":"pawelmichalak98@gmail.com"},"repository":{"url":"git+https://github.com/BLooDek/bloody-engine.git","type":"git"},"_npmVersion":"11.4.2","description":"A WebGL-based 2.5D graphics engine for isometric rendering","directories":{},"_nodeVersion":"24.12.0","dependencies":{"gl":"^8.1.6","pngjs":"^7.0.0","@kmamal/sdl":"^0.11.13"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.3.0","vitest":"^4.0.18","@types/gl":"^6.0.5","@vitest/ui":"^4.0.18","typescript":"^5.3.3","@types/node":"^20.10.6","vite-plugin-dts":"^4.5.4"},"_npmOperationalInternal":{"tmp":"tmp/bloody-engine_1.0.11_1769314027283_0.655081414643941","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"bloody-engine","version":"1.1.0","keywords":["webgl","graphics","engine","2.5d","isometric","rendering","game-engine","typescript","nodejs"],"license":"MIT","_id":"bloody-engine@1.1.0","maintainers":[{"name":"bloodek","email":"pawelmichalak98@gmail.com"}],"homepage":"https://github.com/BLooDek/bloody-engine#readme","bugs":{"url":"https://github.com/BLooDek/bloody-engine/issues"},"dist":{"shasum":"9103a273b22bad11f16fa5491bbc2985de95260b","tarball":"https://registry.npmjs.org/bloody-engine/-/bloody-engine-1.1.0.tgz","fileCount":122,"integrity":"sha512-T2Gp6KW5Pw/4wpacEBk43GbcQWK+ze5wCWoueloCYKXdwxkHdbQPs2h38PEcCwkU1CCO0zt+K2Mkr6EU0vjENQ==","signatures":[{"sig":"MEUCIQD5jVuDAfuOY81iHiZ8A+obpGIo3Q1tSTdwhda+hcld5AIge5fcKe2EE8u0DmxWMeVSk4lfy1Y6tEI0Gk/XYZGoFnM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":480272},"main":"dist/node/index.js","type":"module","types":"./dist/node/index.d.ts","exports":{".":{"types":"./dist/node/index.d.ts","import":"./dist/node/index.js","require":"./dist/node/index.js"}},"gitHead":"127a6d2c8a47411873a43db3478ae62b43e5a061","scripts":{"demo":"npm run build:demo && node dist/demo/index.js","test":"vitest run","build":"vite build --config vite.config.node.ts","test:ui":"vitest --ui","build:demo":"vite build --config vite.config.demo.ts","build:node":"vite build --config vite.config.node.ts","test:watch":"vitest","test:visual":"node test-visual.js","test:coverage":"vitest run --coverage","test:state-sync":"vitest run src/state-sync.test.ts","demo:coordinates":"npm run build && node dist/node/examples/coordinate-systems-demo.js","test:determinism":"node test-determinism.js"},"_npmUser":{"name":"bloodek","email":"pawelmichalak98@gmail.com"},"repository":{"url":"git+https://github.com/BLooDek/bloody-engine.git","type":"git"},"_npmVersion":"11.4.2","description":"A WebGL-based 2.5D graphics engine for isometric rendering","directories":{},"_nodeVersion":"24.12.0","dependencies":{"gl":"^8.1.6","pngjs":"^7.0.0","@kmamal/sdl":"^0.11.13"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.3.0","vitest":"^4.0.18","@types/gl":"^6.0.5","@vitest/ui":"^4.0.18","typescript":"^5.3.3","@types/node":"^20.10.6","vite-plugin-dts":"^4.5.4"},"_npmOperationalInternal":{"tmp":"tmp/bloody-engine_1.1.0_1769354002029_0.4555179274903043","host":"s3://npm-registry-packages-npm-production"}},"1.1.1":{"name":"bloody-engine","version":"1.1.1","keywords":["webgl","graphics","engine","2.5d","isometric","rendering","game-engine","typescript","nodejs"],"license":"MIT","_id":"bloody-engine@1.1.1","maintainers":[{"name":"bloodek","email":"pawelmichalak98@gmail.com"}],"homepage":"https://github.com/BLooDek/bloody-engine#readme","bugs":{"url":"https://github.com/BLooDek/bloody-engine/issues"},"dist":{"shasum":"fee15549304ae55666154d0f9dbd3cfd69548dbf","tarball":"https://registry.npmjs.org/bloody-engine/-/bloody-engine-1.1.1.tgz","fileCount":122,"integrity":"sha512-5cEdkNch0RnqTInO205Y4W+lJ3F/IK67tGhwPEUbWT3978aMracTLVBo24Ju9dVTw+50irWD3R3TAO6k3vR8Kg==","signatures":[{"sig":"MEUCIBvhHBjr2pTAOwHSze+iJ9DvZRRTEFtqTpKmnyUfN6JVAiEAwEuFsD47833dM63zRBsMSRaJ9iLD+Dt8FHz/xn5mBXY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":480340},"main":"dist/node/index.js","type":"module","types":"./dist/node/index.d.ts","exports":{".":{"types":"./dist/node/index.d.ts","import":"./dist/node/index.js","require":"./dist/node/index.js"}},"gitHead":"a78a603553a627be01e31da6eaecc7acb539ce23","scripts":{"demo":"npm run build:demo && node dist/demo/index.js","test":"vitest run","build":"vite build --config vite.config.node.ts","test:ui":"vitest --ui","build:demo":"vite build --config vite.config.demo.ts","build:node":"vite build --config vite.config.node.ts","test:watch":"vitest","test:visual":"node test-visual.js","test:coverage":"vitest run --coverage","test:state-sync":"vitest run src/state-sync.test.ts","demo:coordinates":"npm run build && node dist/node/examples/coordinate-systems-demo.js","test:determinism":"node test-determinism.js"},"_npmUser":{"name":"bloodek","email":"pawelmichalak98@gmail.com"},"repository":{"url":"git+https://github.com/BLooDek/bloody-engine.git","type":"git"},"_npmVersion":"11.4.2","description":"A WebGL-based 2.5D graphics engine for isometric rendering","directories":{},"_nodeVersion":"24.12.0","dependencies":{"gl":"^8.1.6","pngjs":"^7.0.0","@kmamal/sdl":"^0.11.13"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.3.0","vitest":"^4.0.18","@types/gl":"^6.0.5","@vitest/ui":"^4.0.18","typescript":"^5.3.3","@types/node":"^20.10.6","vite-plugin-dts":"^4.5.4"},"_npmOperationalInternal":{"tmp":"tmp/bloody-engine_1.1.1_1769366276505_0.4394962469574406","host":"s3://npm-registry-packages-npm-production"}},"1.1.2":{"name":"bloody-engine","version":"1.1.2","keywords":["webgl","graphics","engine","2.5d","isometric","rendering","game-engine","typescript","nodejs"],"license":"MIT","_id":"bloody-engine@1.1.2","maintainers":[{"name":"bloodek","email":"pawelmichalak98@gmail.com"}],"homepage":"https://github.com/BLooDek/bloody-engine#readme","bugs":{"url":"https://github.com/BLooDek/bloody-engine/issues"},"dist":{"shasum":"ae5fc1fd417170a33555561301c1709a12cd5cf3","tarball":"https://registry.npmjs.org/bloody-engine/-/bloody-engine-1.1.2.tgz","fileCount":137,"integrity":"sha512-r3nRAf3zCkIOANlyl9Xz/iZk98tNwvMYJoUR55rc4A9+lzKB6BpViYOoqOom1QLVeU712jWVr5eKi4w8JhBWFA==","signatures":[{"sig":"MEUCIHnaemy3nP6NDN/wKNJpkaPZZuhp31fuDqYyxny2Gf48AiEA7zFFw8sxuMHa5F6r+vnEnnYoZh7YIfAEFvHIvMfaltc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":506371},"main":"dist/node/index.js","type":"module","types":"./dist/node/index.d.ts","exports":{".":{"types":"./dist/node/index.d.ts","import":"./dist/node/index.js","require":"./dist/node/index.js"}},"gitHead":"65c9e6e25c5d83188d9ca12e645f7288cc5fb734","scripts":{"demo":"npm run build:demo && node dist/demo/index.js","test":"vitest run","build":"vite build --config vite.config.node.ts","test:ui":"vitest --ui","build:demo":"vite build --config vite.config.demo.ts","build:node":"vite build --config vite.config.node.ts","test:watch":"vitest","test:visual":"node test-visual.js","test:coverage":"vitest run --coverage","test:state-sync":"vitest run src/state-sync.test.ts","demo:coordinates":"npm run build && node dist/node/examples/coordinate-systems-demo.js","test:determinism":"node test-determinism.js","benchmark:collision":"tsx benchmarks/collision-benchmark.ts"},"_npmUser":{"name":"bloodek","email":"pawelmichalak98@gmail.com"},"repository":{"url":"git+https://github.com/BLooDek/bloody-engine.git","type":"git"},"_npmVersion":"11.4.2","description":"A WebGL-based 2.5D graphics engine for isometric rendering","directories":{},"_nodeVersion":"24.12.0","dependencies":{"gl":"^8.1.6","pngjs":"^7.0.0","@kmamal/sdl":"^0.11.13"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.3.0","vitest":"^4.0.18","@types/gl":"^6.0.5","@vitest/ui":"^4.0.18","typescript":"^5.3.3","@types/node":"^20.10.6","vite-plugin-dts":"^4.5.4"},"_npmOperationalInternal":{"tmp":"tmp/bloody-engine_1.1.2_1769374442109_0.573822892320007","host":"s3://npm-registry-packages-npm-production"}},"1.1.3":{"name":"bloody-engine","version":"1.1.3","keywords":["webgl","graphics","engine","2.5d","isometric","rendering","game-engine","typescript","nodejs"],"license":"MIT","_id":"bloody-engine@1.1.3","maintainers":[{"name":"bloodek","email":"pawelmichalak98@gmail.com"}],"homepage":"https://github.com/BLooDek/bloody-engine#readme","bugs":{"url":"https://github.com/BLooDek/bloody-engine/issues"},"dist":{"shasum":"84eda272c51ba211c589b3734eb1df634d8834d1","tarball":"https://registry.npmjs.org/bloody-engine/-/bloody-engine-1.1.3.tgz","fileCount":137,"integrity":"sha512-ihaM9M+Jdh4wBi7c33KP9bRKNV9w+Rnig6W9gcQRT6SKX6ZcHtVUfHgnfjsxisLsz+XWE/PlfOQNcYxY5vpYkg==","signatures":[{"sig":"MEQCIBC+GBW4/t5XMc0az+ZyzAwHclpDJDraiiZb2Q+MczkpAiA4MA+858g9kXp7beCnEIniTxZzjZqJn2irfXvKl4PASA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":529343},"main":"dist/node/index.js","type":"module","types":"./dist/node/index.d.ts","exports":{".":{"types":"./dist/node/index.d.ts","import":"./dist/node/index.js","require":"./dist/node/index.js"}},"gitHead":"a23d4825152f0e75729c9eba3c5fad52d5234345","scripts":{"demo":"npm run build:demo && node dist/demo/index.js","test":"vitest run","build":"vite build --config vite.config.node.ts","test:ui":"vitest --ui","build:demo":"vite build --config vite.config.demo.ts","build:node":"vite build --config vite.config.node.ts","test:watch":"vitest","test:visual":"node test-visual.js","test:coverage":"vitest run --coverage","test:state-sync":"vitest run src/state-sync.test.ts","demo:coordinates":"npm run build && node dist/node/examples/coordinate-systems-demo.js","test:determinism":"node test-determinism.js","benchmark:collision":"tsx benchmarks/collision-benchmark.ts"},"_npmUser":{"name":"bloodek","email":"pawelmichalak98@gmail.com"},"repository":{"url":"git+https://github.com/BLooDek/bloody-engine.git","type":"git"},"_npmVersion":"11.4.2","description":"A WebGL-based 2.5D graphics engine for isometric rendering","directories":{},"_nodeVersion":"24.12.0","dependencies":{"gl":"^8.1.6","pngjs":"^7.0.0","@kmamal/sdl":"^0.11.13"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.3.0","vitest":"^4.0.18","@types/gl":"^6.0.5","@vitest/ui":"^4.0.18","typescript":"^5.3.3","@types/node":"^20.10.6","vite-plugin-dts":"^4.5.4"},"_npmOperationalInternal":{"tmp":"tmp/bloody-engine_1.1.3_1769375055271_0.5242411021833151","host":"s3://npm-registry-packages-npm-production"}},"1.1.4":{"name":"bloody-engine","version":"1.1.4","keywords":["webgl","graphics","engine","2.5d","isometric","rendering","game-engine","typescript","nodejs"],"license":"MIT","_id":"bloody-engine@1.1.4","maintainers":[{"name":"bloodek","email":"pawelmichalak98@gmail.com"}],"homepage":"https://github.com/BLooDek/bloody-engine#readme","bugs":{"url":"https://github.com/BLooDek/bloody-engine/issues"},"dist":{"shasum":"b3b5a6afa1ea5122aa7491d26ea2626901d93daf","tarball":"https://registry.npmjs.org/bloody-engine/-/bloody-engine-1.1.4.tgz","fileCount":139,"integrity":"sha512-pj7j99k8+4B7j6q9EddltA22c/Zgq1bF8FDrlf7v4Xuw0YhoQN/QH+srS2HD3+EG3qBacb7hI0kSK4ha6jCv0w==","signatures":[{"sig":"MEQCIAXROhmgsHGhyvqC/z8aivszyzAlcQNHGpcl3hhqXHE5AiBMzB2x+4bTSX2+uGwOGXk/akW90cyDPRae6vm0CYomXQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":541740},"main":"dist/node/index.js","type":"module","types":"./dist/node/index.d.ts","exports":{".":{"types":"./dist/node/index.d.ts","import":"./dist/node/index.js","require":"./dist/node/index.js"}},"gitHead":"a23d4825152f0e75729c9eba3c5fad52d5234345","scripts":{"demo":"npm run build:demo && node dist/demo/index.js","test":"vitest run","build":"vite build --config vite.config.node.ts","test:ui":"vitest --ui","build:demo":"vite build --config vite.config.demo.ts","build:node":"vite build --config vite.config.node.ts","test:watch":"vitest","test:visual":"node test-visual.js","test:coverage":"vitest run --coverage","test:state-sync":"vitest run src/state-sync.test.ts","demo:coordinates":"npm run build && node dist/node/examples/coordinate-systems-demo.js","test:determinism":"node test-determinism.js","benchmark:collision":"tsx benchmarks/collision-benchmark.ts"},"_npmUser":{"name":"bloodek","email":"pawelmichalak98@gmail.com"},"repository":{"url":"git+https://github.com/BLooDek/bloody-engine.git","type":"git"},"_npmVersion":"11.4.2","description":"A WebGL-based 2.5D graphics engine for isometric rendering","directories":{},"_nodeVersion":"24.12.0","dependencies":{"gl":"^8.1.6","pngjs":"^7.0.0","@kmamal/sdl":"^0.11.13"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.3.0","vitest":"^4.0.18","@types/gl":"^6.0.5","@vitest/ui":"^4.0.18","typescript":"^5.3.3","@types/node":"^20.10.6","vite-plugin-dts":"^4.5.4"},"_npmOperationalInternal":{"tmp":"tmp/bloody-engine_1.1.4_1769380386181_0.8142264816583755","host":"s3://npm-registry-packages-npm-production"}},"1.1.5":{"name":"bloody-engine","version":"1.1.5","keywords":["webgl","graphics","engine","2.5d","isometric","rendering","game-engine","typescript","nodejs"],"license":"MIT","_id":"bloody-engine@1.1.5","maintainers":[{"name":"bloodek","email":"pawelmichalak98@gmail.com"}],"homepage":"https://github.com/BLooDek/bloody-engine#readme","bugs":{"url":"https://github.com/BLooDek/bloody-engine/issues"},"dist":{"shasum":"e88666314a08aa4bb741f7df341bd71cf7ec4709","tarball":"https://registry.npmjs.org/bloody-engine/-/bloody-engine-1.1.5.tgz","fileCount":145,"integrity":"sha512-DUkhuzhUgvBN+FRM+0rOLONd6q51uYLET3sZKq9dB5u/0Mw6/kE3HJWfgjQAK/zmD9a3YfcH+HELl/osfwdeLQ==","signatures":[{"sig":"MEQCIGMbcR8V0h2wc/ddpDtSWOB+13EbmLTgHyADXhicuiyIAiAgC/scbijcZ57FO2jHI8ib33cOOmDVNOxigbIDN+DE+A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":587331},"main":"dist/node/index.js","type":"module","types":"./dist/node/index.d.ts","exports":{".":{"types":"./dist/node/index.d.ts","import":"./dist/node/index.js","require":"./dist/node/index.js"}},"gitHead":"ddb4489b359e6e106244ff2927381e9331fb0418","scripts":{"demo":"npm run build:demo && node dist/demo/index.js","test":"vitest run","build":"vite build --config vite.config.node.ts","test:ui":"vitest --ui","build:demo":"vite build --config vite.config.demo.ts","build:node":"vite build --config vite.config.node.ts","test:watch":"vitest","test:visual":"node test-visual.js","test:coverage":"vitest run --coverage","test:state-sync":"vitest run src/state-sync.test.ts","demo:coordinates":"npm run build && node dist/node/examples/coordinate-systems-demo.js","test:determinism":"node test-determinism.js","benchmark:collision":"tsx benchmarks/collision-benchmark.ts"},"_npmUser":{"name":"bloodek","email":"pawelmichalak98@gmail.com"},"repository":{"url":"git+https://github.com/BLooDek/bloody-engine.git","type":"git"},"_npmVersion":"11.4.2","description":"A WebGL-based 2.5D graphics engine for isometric rendering","directories":{},"_nodeVersion":"24.12.0","dependencies":{"gl":"^8.1.6","pngjs":"^7.0.0","@kmamal/sdl":"^0.11.13"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.3.0","vitest":"^4.0.18","@types/gl":"^6.0.5","@vitest/ui":"^4.0.18","typescript":"^5.3.3","@types/node":"^20.10.6","vite-plugin-dts":"^4.5.4"},"_npmOperationalInternal":{"tmp":"tmp/bloody-engine_1.1.5_1769386979336_0.5696120337679937","host":"s3://npm-registry-packages-npm-production"}},"1.1.6":{"name":"bloody-engine","version":"1.1.6","keywords":["webgl","graphics","engine","2.5d","isometric","rendering","game-engine","typescript","nodejs"],"license":"MIT","_id":"bloody-engine@1.1.6","maintainers":[{"name":"bloodek","email":"pawelmichalak98@gmail.com"}],"homepage":"https://github.com/BLooDek/bloody-engine#readme","bugs":{"url":"https://github.com/BLooDek/bloody-engine/issues"},"dist":{"shasum":"784593f8fca44c42d546c08b2fb0f2b8e01fd064","tarball":"https://registry.npmjs.org/bloody-engine/-/bloody-engine-1.1.6.tgz","fileCount":145,"integrity":"sha512-ekzwtSfmM3R1V/FjOgyv52NydrRsyNg9HY9cOevUHCeENcENb5XoZp2yfQdb9o5KxFEJrn3qo24ohtmnM78qPA==","signatures":[{"sig":"MEUCIBCZeHRFTTYElRpIAtuaDMuQ18dyT5yqxPk6aEjoeXUzAiEA0x++ACqKq1xVqgcUHS+mDZhjhPQ8Y39kkRkYxl+JcFQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":587633},"main":"dist/node/index.js","type":"module","types":"./dist/node/index.d.ts","exports":{".":{"types":"./dist/node/index.d.ts","import":"./dist/node/index.js","require":"./dist/node/index.js"}},"gitHead":"c75492d315595e769bea7e3e01419575fe366a58","scripts":{"demo":"npm run build:demo && node dist/demo/index.js","test":"vitest run","build":"vite build --config vite.config.node.ts","test:ui":"vitest --ui","build:demo":"vite build --config vite.config.demo.ts","build:node":"vite build --config vite.config.node.ts","test:watch":"vitest","test:visual":"node test-visual.js","test:coverage":"vitest run --coverage","test:state-sync":"vitest run src/state-sync.test.ts","demo:coordinates":"npm run build && node dist/node/examples/coordinate-systems-demo.js","test:determinism":"node test-determinism.js","benchmark:collision":"tsx benchmarks/collision-benchmark.ts"},"_npmUser":{"name":"bloodek","email":"pawelmichalak98@gmail.com"},"repository":{"url":"git+https://github.com/BLooDek/bloody-engine.git","type":"git"},"_npmVersion":"11.4.2","description":"A WebGL-based 2.5D graphics engine for isometric rendering","directories":{},"_nodeVersion":"24.12.0","dependencies":{"gl":"^8.1.6","pngjs":"^7.0.0","@kmamal/sdl":"^0.11.13"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.3.0","vitest":"^4.0.18","@types/gl":"^6.0.5","@vitest/ui":"^4.0.18","typescript":"^5.3.3","@types/node":"^20.10.6","vite-plugin-dts":"^4.5.4"},"_npmOperationalInternal":{"tmp":"tmp/bloody-engine_1.1.6_1769388050654_0.5265489522117353","host":"s3://npm-registry-packages-npm-production"}},"1.1.7":{"name":"bloody-engine","version":"1.1.7","keywords":["webgl","graphics","engine","2.5d","isometric","rendering","game-engine","typescript","nodejs"],"license":"MIT","_id":"bloody-engine@1.1.7","maintainers":[{"name":"bloodek","email":"pawelmichalak98@gmail.com"}],"homepage":"https://github.com/BLooDek/bloody-engine#readme","bugs":{"url":"https://github.com/BLooDek/bloody-engine/issues"},"dist":{"shasum":"8b9d5f28850fedd252c0b550965628c4031e484e","tarball":"https://registry.npmjs.org/bloody-engine/-/bloody-engine-1.1.7.tgz","fileCount":147,"integrity":"sha512-iakoFJU+lds2gb6b9b4zpe9JzAbnuCDJsxBQFtiF98EGBS7f8LwStg4F6g/Ssx4F+AR4iFnohRVw3dxUOckhZA==","signatures":[{"sig":"MEUCIFu7OPpWZiu1J5uWcJ/TWgZQEthvc2TOqdj8lX4Nh60zAiEA1K1Qn52NBr6bvLXu3WcjGcNMnK86xb40TE+lLGttCYU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":591776},"main":"dist/node/index.js","type":"module","types":"./dist/node/index.d.ts","exports":{".":{"types":"./dist/node/index.d.ts","import":"./dist/node/index.js","require":"./dist/node/index.js"}},"gitHead":"c75492d315595e769bea7e3e01419575fe366a58","scripts":{"demo":"npm run build:demo && node dist/demo/index.js","test":"vitest run","build":"vite build --config vite.config.node.ts","test:ui":"vitest --ui","build:demo":"vite build --config vite.config.demo.ts","build:node":"vite build --config vite.config.node.ts","test:watch":"vitest","test:visual":"node test-visual.js","test:coverage":"vitest run --coverage","test:state-sync":"vitest run src/state-sync.test.ts","demo:coordinates":"npm run build && node dist/node/examples/coordinate-systems-demo.js","test:determinism":"node test-determinism.js","benchmark:collision":"tsx benchmarks/collision-benchmark.ts"},"_npmUser":{"name":"bloodek","email":"pawelmichalak98@gmail.com"},"repository":{"url":"git+https://github.com/BLooDek/bloody-engine.git","type":"git"},"_npmVersion":"11.4.2","description":"A WebGL-based 2.5D graphics engine for isometric rendering","directories":{},"_nodeVersion":"24.12.0","dependencies":{"gl":"^8.1.6","pngjs":"^7.0.0","@kmamal/sdl":"^0.11.13"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.3.0","vitest":"^4.0.18","@types/gl":"^6.0.5","@vitest/ui":"^4.0.18","typescript":"^5.3.3","@types/node":"^20.10.6","vite-plugin-dts":"^4.5.4"},"_npmOperationalInternal":{"tmp":"tmp/bloody-engine_1.1.7_1769389349317_0.9551898230730373","host":"s3://npm-registry-packages-npm-production"}},"1.1.8":{"name":"bloody-engine","version":"1.1.8","keywords":["webgl","graphics","engine","2.5d","isometric","rendering","game-engine","typescript","nodejs"],"license":"MIT","_id":"bloody-engine@1.1.8","maintainers":[{"name":"bloodek","email":"pawelmichalak98@gmail.com"}],"homepage":"https://github.com/BLooDek/bloody-engine#readme","bugs":{"url":"https://github.com/BLooDek/bloody-engine/issues"},"dist":{"shasum":"14d7c2cd7ec4f89e98d873dc15beb3545984f325","tarball":"https://registry.npmjs.org/bloody-engine/-/bloody-engine-1.1.8.tgz","fileCount":147,"integrity":"sha512-txdi2Jt38oLQYaRPCaoFUMwidqEussZ8pURu9hZu8SKTtXP0MQDKtkCFZTEgdwm+3C9A8VjlIkWk94dOfw4KsQ==","signatures":[{"sig":"MEUCIQCT5tyTcc5g/Sj03pTNS/dCvE1BgUjrIrPx7cU42TJ5IwIgP/qmSKm8tHsz6ISJgFcv/SYK1Sjuw2P+NSF9tsHTlow=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":593131},"main":"dist/node/index.js","type":"module","types":"./dist/node/index.d.ts","exports":{".":{"types":"./dist/node/index.d.ts","import":"./dist/node/index.js","require":"./dist/node/index.js"}},"gitHead":"c75492d315595e769bea7e3e01419575fe366a58","scripts":{"demo":"npm run build:demo && node dist/demo/index.js","test":"vitest run","build":"vite build --config vite.config.node.ts","test:ui":"vitest --ui","build:demo":"vite build --config vite.config.demo.ts","build:node":"vite build --config vite.config.node.ts","test:watch":"vitest","test:visual":"node test-visual.js","test:coverage":"vitest run --coverage","test:state-sync":"vitest run src/state-sync.test.ts","demo:coordinates":"npm run build && node dist/node/examples/coordinate-systems-demo.js","test:determinism":"node test-determinism.js","benchmark:collision":"tsx benchmarks/collision-benchmark.ts"},"_npmUser":{"name":"bloodek","email":"pawelmichalak98@gmail.com"},"repository":{"url":"git+https://github.com/BLooDek/bloody-engine.git","type":"git"},"_npmVersion":"11.4.2","description":"A WebGL-based 2.5D graphics engine for isometric rendering","directories":{},"_nodeVersion":"24.12.0","dependencies":{"gl":"^8.1.6","pngjs":"^7.0.0","@kmamal/sdl":"^0.11.13"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.3.0","vitest":"^4.0.18","@types/gl":"^6.0.5","@vitest/ui":"^4.0.18","typescript":"^5.3.3","@types/node":"^20.10.6","vite-plugin-dts":"^4.5.4"},"_npmOperationalInternal":{"tmp":"tmp/bloody-engine_1.1.8_1769390732786_0.011067161917722945","host":"s3://npm-registry-packages-npm-production"}},"1.1.9":{"name":"bloody-engine","version":"1.1.9","keywords":["webgl","graphics","engine","2.5d","isometric","rendering","game-engine","typescript","nodejs"],"license":"MIT","_id":"bloody-engine@1.1.9","maintainers":[{"name":"bloodek","email":"pawelmichalak98@gmail.com"}],"homepage":"https://github.com/BLooDek/bloody-engine#readme","bugs":{"url":"https://github.com/BLooDek/bloody-engine/issues"},"dist":{"shasum":"54172d2d19994fc7bb9d865fed3e88121ba242a6","tarball":"https://registry.npmjs.org/bloody-engine/-/bloody-engine-1.1.9.tgz","fileCount":147,"integrity":"sha512-1Utm2Z0SBU9L3Dqcjox0W6r1FTB1I4/hvIFvvgC+eYdKrYms6KHiz6co+6IgNdnabu3Q9sJqmlLdWhFItwFxtA==","signatures":[{"sig":"MEYCIQD39c0E5RX55g+dpOD8uI2ZBnlnANSdIm+R1NLUXjVRdwIhAI1lBh9UbRFU33IlG5NP14A59BjnS8fU1XuHq8A1cZWD","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":593455},"main":"dist/node/index.js","type":"module","types":"./dist/node/index.d.ts","exports":{".":{"types":"./dist/node/index.d.ts","import":"./dist/node/index.js","require":"./dist/node/index.js"}},"gitHead":"c75492d315595e769bea7e3e01419575fe366a58","scripts":{"demo":"npm run build:demo && node dist/demo/index.js","test":"vitest run","build":"vite build --config vite.config.node.ts","test:ui":"vitest --ui","build:demo":"vite build --config vite.config.demo.ts","build:node":"vite build --config vite.config.node.ts","test:watch":"vitest","test:visual":"node test-visual.js","test:coverage":"vitest run --coverage","test:state-sync":"vitest run src/state-sync.test.ts","demo:coordinates":"npm run build && node dist/node/examples/coordinate-systems-demo.js","test:determinism":"node test-determinism.js","benchmark:collision":"tsx benchmarks/collision-benchmark.ts"},"_npmUser":{"name":"bloodek","email":"pawelmichalak98@gmail.com"},"repository":{"url":"git+https://github.com/BLooDek/bloody-engine.git","type":"git"},"_npmVersion":"11.4.2","description":"A WebGL-based 2.5D graphics engine for isometric rendering","directories":{},"_nodeVersion":"24.12.0","dependencies":{"gl":"^8.1.6","pngjs":"^7.0.0","@kmamal/sdl":"^0.11.13"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.3.0","vitest":"^4.0.18","@types/gl":"^6.0.5","@vitest/ui":"^4.0.18","typescript":"^5.3.3","@types/node":"^20.10.6","vite-plugin-dts":"^4.5.4"},"_npmOperationalInternal":{"tmp":"tmp/bloody-engine_1.1.9_1769391596686_0.8656440023828333","host":"s3://npm-registry-packages-npm-production"}},"1.1.10":{"name":"bloody-engine","version":"1.1.10","keywords":["webgl","graphics","engine","2.5d","isometric","rendering","game-engine","typescript","nodejs"],"license":"MIT","_id":"bloody-engine@1.1.10","maintainers":[{"name":"bloodek","email":"pawelmichalak98@gmail.com"}],"homepage":"https://github.com/BLooDek/bloody-engine#readme","bugs":{"url":"https://github.com/BLooDek/bloody-engine/issues"},"dist":{"shasum":"42405862252e7bf782156b47bdfee75e600edd03","tarball":"https://registry.npmjs.org/bloody-engine/-/bloody-engine-1.1.10.tgz","fileCount":147,"integrity":"sha512-I0ojhqdOA5/WWr5Xm2WirsN4iowa6y8ID9Eq9QdGyltEFnE2YAqHIiyumOctTJEIqe1mp43wun1hyYjOtOYvOQ==","signatures":[{"sig":"MEUCIQCkKdx3a6WRiWvdQyN8eiC3duothYcXiK6bQl2n8tvT/wIgWiTcYrAne0Bg1WvrOXYXohAmylBWIjAtD3RFwLrjq+A=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":599008},"main":"dist/node/index.js","type":"module","types":"./dist/node/index.d.ts","exports":{".":{"types":"./dist/node/index.d.ts","import":"./dist/node/index.js","require":"./dist/node/index.js"}},"gitHead":"c75492d315595e769bea7e3e01419575fe366a58","scripts":{"demo":"npm run build:demo && node dist/demo/index.js","test":"vitest run","build":"vite build --config vite.config.node.ts","test:ui":"vitest --ui","build:demo":"vite build --config vite.config.demo.ts","build:node":"vite build --config vite.config.node.ts","test:watch":"vitest","test:visual":"node test-visual.js","test:coverage":"vitest run --coverage","test:state-sync":"vitest run src/state-sync.test.ts","demo:coordinates":"npm run build && node dist/node/examples/coordinate-systems-demo.js","test:determinism":"node test-determinism.js","benchmark:collision":"tsx benchmarks/collision-benchmark.ts"},"_npmUser":{"name":"bloodek","email":"pawelmichalak98@gmail.com"},"repository":{"url":"git+https://github.com/BLooDek/bloody-engine.git","type":"git"},"_npmVersion":"11.4.2","description":"A WebGL-based 2.5D graphics engine for isometric rendering","directories":{},"_nodeVersion":"24.12.0","dependencies":{"gl":"^8.1.6","pngjs":"^7.0.0","@kmamal/sdl":"^0.11.13"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.3.0","vitest":"^4.0.18","@types/gl":"^6.0.5","@vitest/ui":"^4.0.18","typescript":"^5.3.3","@types/node":"^20.10.6","vite-plugin-dts":"^4.5.4"},"_npmOperationalInternal":{"tmp":"tmp/bloody-engine_1.1.10_1769392936204_0.11949562618723841","host":"s3://npm-registry-packages-npm-production"}},"1.1.11":{"name":"bloody-engine","version":"1.1.11","keywords":["webgl","graphics","engine","2.5d","isometric","rendering","game-engine","typescript","nodejs"],"license":"MIT","_id":"bloody-engine@1.1.11","maintainers":[{"name":"bloodek","email":"pawelmichalak98@gmail.com"}],"homepage":"https://github.com/BLooDek/bloody-engine#readme","bugs":{"url":"https://github.com/BLooDek/bloody-engine/issues"},"dist":{"shasum":"2bd0ed07c9fb3cb51b61365340e3d724c58c5909","tarball":"https://registry.npmjs.org/bloody-engine/-/bloody-engine-1.1.11.tgz","fileCount":147,"integrity":"sha512-o3BbZiapLCwerSgMpwtG4fNDROrmU5a9BHdzTF+kszytQFTmlETrLyj8kepb+YGWyujViqGpf6JRIdCpmxG2XA==","signatures":[{"sig":"MEUCIQCFKSw3mcicVp5LcFz4D/WDoPjXrwO5bmfVy/i+x+7q8wIgWHL7pBUlC/RTl/+xiatXHyUXqfboUOhuf0Nl3Kyqwog=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":610958},"main":"dist/node/index.js","type":"module","types":"./dist/node/index.d.ts","exports":{".":{"types":"./dist/node/index.d.ts","import":"./dist/node/index.js","require":"./dist/node/index.js"}},"gitHead":"c75492d315595e769bea7e3e01419575fe366a58","scripts":{"demo":"npm run build:demo && node dist/demo/index.js","test":"vitest run","build":"vite build --config vite.config.node.ts","test:ui":"vitest --ui","build:demo":"vite build --config vite.config.demo.ts","build:node":"vite build --config vite.config.node.ts","test:watch":"vitest","test:visual":"node test-visual.js","test:coverage":"vitest run --coverage","test:state-sync":"vitest run src/state-sync.test.ts","demo:coordinates":"npm run build && node dist/node/examples/coordinate-systems-demo.js","test:determinism":"node test-determinism.js","benchmark:collision":"tsx benchmarks/collision-benchmark.ts"},"_npmUser":{"name":"bloodek","email":"pawelmichalak98@gmail.com"},"repository":{"url":"git+https://github.com/BLooDek/bloody-engine.git","type":"git"},"_npmVersion":"11.4.2","description":"A WebGL-based 2.5D graphics engine for isometric rendering","directories":{},"_nodeVersion":"24.12.0","dependencies":{"gl":"^8.1.6","pngjs":"^7.0.0","@kmamal/sdl":"^0.11.13"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.3.0","vitest":"^4.0.18","@types/gl":"^6.0.5","@vitest/ui":"^4.0.18","typescript":"^5.3.3","@types/node":"^20.10.6","vite-plugin-dts":"^4.5.4"},"_npmOperationalInternal":{"tmp":"tmp/bloody-engine_1.1.11_1769397117146_0.7379814466297037","host":"s3://npm-registry-packages-npm-production"}},"1.1.12":{"name":"bloody-engine","version":"1.1.12","keywords":["webgl","graphics","engine","2.5d","isometric","rendering","game-engine","typescript","nodejs"],"license":"MIT","_id":"bloody-engine@1.1.12","maintainers":[{"name":"bloodek","email":"pawelmichalak98@gmail.com"}],"homepage":"https://github.com/BLooDek/bloody-engine#readme","bugs":{"url":"https://github.com/BLooDek/bloody-engine/issues"},"dist":{"shasum":"050433e0c377162eea8d42ed4b58cf694155f433","tarball":"https://registry.npmjs.org/bloody-engine/-/bloody-engine-1.1.12.tgz","fileCount":147,"integrity":"sha512-+fqckMthvYquOuKTO67KUOsNEm4UPZU+4EMshT5tgL2geQVcN7aIdYEwS5v5mh/ypXpF2d5yRgpMsdykP1DG5Q==","signatures":[{"sig":"MEYCIQD4yCESbFNV5nLhaxXZDficKRh309WapcLwD4WH+6Xu6AIhAI0/L84DQDN2iCtvqCTGe0TzEuOiOTS46h8fq91XeUj2","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":611494},"main":"dist/node/index.js","type":"module","types":"./dist/node/index.d.ts","exports":{".":{"types":"./dist/node/index.d.ts","import":"./dist/node/index.js","require":"./dist/node/index.js"}},"gitHead":"c75492d315595e769bea7e3e01419575fe366a58","scripts":{"demo":"npm run build:demo && node dist/demo/index.js","test":"vitest run","build":"vite build --config vite.config.node.ts","test:ui":"vitest --ui","build:demo":"vite build --config vite.config.demo.ts","build:node":"vite build --config vite.config.node.ts","test:watch":"vitest","test:visual":"node test-visual.js","test:coverage":"vitest run --coverage","test:state-sync":"vitest run src/state-sync.test.ts","demo:coordinates":"npm run build && node dist/node/examples/coordinate-systems-demo.js","test:determinism":"node test-determinism.js","benchmark:collision":"tsx benchmarks/collision-benchmark.ts"},"_npmUser":{"name":"bloodek","email":"pawelmichalak98@gmail.com"},"repository":{"url":"git+https://github.com/BLooDek/bloody-engine.git","type":"git"},"_npmVersion":"11.4.2","description":"A WebGL-based 2.5D graphics engine for isometric rendering","directories":{},"_nodeVersion":"24.12.0","dependencies":{"gl":"^8.1.6","pngjs":"^7.0.0","@kmamal/sdl":"^0.11.13"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.3.0","vitest":"^4.0.18","@types/gl":"^6.0.5","@vitest/ui":"^4.0.18","typescript":"^5.3.3","@types/node":"^20.10.6","vite-plugin-dts":"^4.5.4"},"_npmOperationalInternal":{"tmp":"tmp/bloody-engine_1.1.12_1769397486109_0.4795888699037214","host":"s3://npm-registry-packages-npm-production"}},"1.1.13":{"name":"bloody-engine","version":"1.1.13","keywords":["webgl","graphics","engine","2.5d","isometric","rendering","game-engine","typescript","nodejs"],"license":"MIT","_id":"bloody-engine@1.1.13","maintainers":[{"name":"bloodek","email":"pawelmichalak98@gmail.com"}],"homepage":"https://github.com/BLooDek/bloody-engine#readme","bugs":{"url":"https://github.com/BLooDek/bloody-engine/issues"},"dist":{"shasum":"c324074d51fa94a8dbac3d8037a28ab212fdd601","tarball":"https://registry.npmjs.org/bloody-engine/-/bloody-engine-1.1.13.tgz","fileCount":147,"integrity":"sha512-OK+okcRhN0M27iKLSBa/1iX2xFt3w66pCLTRnLeC3sqyph8gA+9cslQUfwiFaOUhHvI9TX+/a81ERDuXmEVtGw==","signatures":[{"sig":"MEYCIQC4CVY+u4wAcGzIBaSqjKjeudd+183eNSyzwr40SRJZGgIhAKGc9+xIt8PJ84OsX0pHW9A/ukdEprcF2pS1Pn/gmw2x","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":611560},"main":"dist/node/index.js","type":"module","types":"./dist/node/index.d.ts","exports":{".":{"types":"./dist/node/index.d.ts","import":"./dist/node/index.js","require":"./dist/node/index.js"}},"gitHead":"c75492d315595e769bea7e3e01419575fe366a58","scripts":{"demo":"npm run build:demo && node dist/demo/index.js","test":"vitest run","build":"vite build --config vite.config.node.ts","test:ui":"vitest --ui","build:demo":"vite build --config vite.config.demo.ts","build:node":"vite build --config vite.config.node.ts","test:watch":"vitest","test:visual":"node test-visual.js","test:coverage":"vitest run --coverage","test:state-sync":"vitest run src/state-sync.test.ts","demo:coordinates":"npm run build && node dist/node/examples/coordinate-systems-demo.js","test:determinism":"node test-determinism.js","benchmark:collision":"tsx benchmarks/collision-benchmark.ts"},"_npmUser":{"name":"bloodek","email":"pawelmichalak98@gmail.com"},"repository":{"url":"git+https://github.com/BLooDek/bloody-engine.git","type":"git"},"_npmVersion":"11.4.2","description":"A WebGL-based 2.5D graphics engine for isometric rendering","directories":{},"_nodeVersion":"24.12.0","dependencies":{"gl":"^8.1.6","pngjs":"^7.0.0","@kmamal/sdl":"^0.11.13"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.3.0","vitest":"^4.0.18","@types/gl":"^6.0.5","@vitest/ui":"^4.0.18","typescript":"^5.3.3","@types/node":"^20.10.6","vite-plugin-dts":"^4.5.4"},"_npmOperationalInternal":{"tmp":"tmp/bloody-engine_1.1.13_1769397755786_0.11961464352472562","host":"s3://npm-registry-packages-npm-production"}},"1.1.14":{"name":"bloody-engine","version":"1.1.14","keywords":["webgl","graphics","engine","2.5d","isometric","rendering","game-engine","typescript","nodejs"],"license":"MIT","_id":"bloody-engine@1.1.14","maintainers":[{"name":"bloodek","email":"pawelmichalak98@gmail.com"}],"homepage":"https://github.com/BLooDek/bloody-engine#readme","bugs":{"url":"https://github.com/BLooDek/bloody-engine/issues"},"dist":{"shasum":"2c28c4e43799b1172f1ebd1eb6375a7efd13b22f","tarball":"https://registry.npmjs.org/bloody-engine/-/bloody-engine-1.1.14.tgz","fileCount":147,"integrity":"sha512-WvxnJ3zKFhP24qbP9a5vFCmeSq38MKrLNnu+S01c5FwYMbkCcnNAoaoCtIWYjLSFTFc2Qz4vCm/pfPXW1BSUvw==","signatures":[{"sig":"MEUCIHWuuIDX+MDmpd+gR+hp0SpM1k90Q3XYG3Web5xjMoNgAiEAibFpxafNy2Ryobq135xND/RDgwxd3COKvWUoIIVc3f0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":618046},"main":"dist/node/index.js","type":"module","types":"./dist/node/index.d.ts","exports":{".":{"types":"./dist/node/index.d.ts","import":"./dist/node/index.js","require":"./dist/node/index.js"}},"gitHead":"c75492d315595e769bea7e3e01419575fe366a58","scripts":{"demo":"npm run build:demo && node dist/demo/index.js","test":"vitest run","build":"vite build --config vite.config.node.ts","test:ui":"vitest --ui","build:demo":"vite build --config vite.config.demo.ts","build:node":"vite build --config vite.config.node.ts","test:watch":"vitest","test:visual":"node test-visual.js","test:coverage":"vitest run --coverage","test:state-sync":"vitest run src/state-sync.test.ts","demo:coordinates":"npm run build && node dist/node/examples/coordinate-systems-demo.js","test:determinism":"node test-determinism.js","benchmark:collision":"tsx benchmarks/collision-benchmark.ts"},"_npmUser":{"name":"bloodek","email":"pawelmichalak98@gmail.com"},"repository":{"url":"git+https://github.com/BLooDek/bloody-engine.git","type":"git"},"_npmVersion":"11.4.2","description":"A WebGL-based 2.5D graphics engine for isometric rendering","directories":{},"_nodeVersion":"24.12.0","dependencies":{"gl":"^8.1.6","pngjs":"^7.0.0","@kmamal/sdl":"^0.11.13"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.3.0","vitest":"^4.0.18","@types/gl":"^6.0.5","@vitest/ui":"^4.0.18","typescript":"^5.3.3","@types/node":"^20.10.6","vite-plugin-dts":"^4.5.4"},"_npmOperationalInternal":{"tmp":"tmp/bloody-engine_1.1.14_1769426560179_0.7911801877338347","host":"s3://npm-registry-packages-npm-production"}},"1.1.15":{"name":"bloody-engine","version":"1.1.15","keywords":["webgl","graphics","engine","2.5d","isometric","rendering","game-engine","typescript","nodejs"],"license":"MIT","_id":"bloody-engine@1.1.15","maintainers":[{"name":"bloodek","email":"pawelmichalak98@gmail.com"}],"homepage":"https://github.com/BLooDek/bloody-engine#readme","bugs":{"url":"https://github.com/BLooDek/bloody-engine/issues"},"dist":{"shasum":"dccd147a016dd1a19d84691bebe342cad3df951d","tarball":"https://registry.npmjs.org/bloody-engine/-/bloody-engine-1.1.15.tgz","fileCount":147,"integrity":"sha512-QrMDZXqe9fCRo9dLFPRZ8zmnw8y/Zfos5mbmiIhTVvLAKvSa5WIYEDFBdqYHJd02VAPx3kDi0p+1MS/XjqDBwg==","signatures":[{"sig":"MEUCIGWuPH8NL2YU6xR46vIHPHtKNF8vAlNrd/XXjibHwCBnAiEAql/bjLtEwgGmy9RIFegbjLMhtNzP77qPZulrRLEOYnU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":618739},"main":"dist/node/index.js","type":"module","types":"./dist/node/index.d.ts","exports":{".":{"types":"./dist/node/index.d.ts","import":"./dist/node/index.js","require":"./dist/node/index.js"}},"gitHead":"159a445e77272c8348bcf90879bdbfadb91c6fdb","scripts":{"demo":"npm run build:demo && node dist/demo/index.js","test":"vitest run","build":"vite build --config vite.config.node.ts","test:ui":"vitest --ui","build:demo":"vite build --config vite.config.demo.ts","build:node":"vite build --config vite.config.node.ts","test:watch":"vitest","test:visual":"node test-visual.js","test:coverage":"vitest run --coverage","test:state-sync":"vitest run src/state-sync.test.ts","demo:coordinates":"npm run build && node dist/node/examples/coordinate-systems-demo.js","test:determinism":"node test-determinism.js","benchmark:collision":"tsx benchmarks/collision-benchmark.ts"},"_npmUser":{"name":"bloodek","email":"pawelmichalak98@gmail.com"},"repository":{"url":"git+https://github.com/BLooDek/bloody-engine.git","type":"git"},"_npmVersion":"11.4.2","description":"A WebGL-based 2.5D graphics engine for isometric rendering","directories":{},"_nodeVersion":"24.12.0","dependencies":{"gl":"^8.1.6","pngjs":"^7.0.0","@kmamal/sdl":"^0.11.13"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.3.0","vitest":"^4.0.18","@types/gl":"^6.0.5","@vitest/ui":"^4.0.18","typescript":"^5.3.3","@types/node":"^20.10.6","vite-plugin-dts":"^4.5.4"},"_npmOperationalInternal":{"tmp":"tmp/bloody-engine_1.1.15_1769429379247_0.7749124847879416","host":"s3://npm-registry-packages-npm-production"}},"1.1.16":{"name":"bloody-engine","version":"1.1.16","keywords":["webgl","graphics","engine","2.5d","isometric","rendering","game-engine","typescript","nodejs"],"license":"MIT","_id":"bloody-engine@1.1.16","maintainers":[{"name":"bloodek","email":"pawelmichalak98@gmail.com"}],"homepage":"https://github.com/BLooDek/bloody-engine#readme","bugs":{"url":"https://github.com/BLooDek/bloody-engine/issues"},"dist":{"shasum":"a5fe899c79ced0236b4bd3c5459b4c6851fad092","tarball":"https://registry.npmjs.org/bloody-engine/-/bloody-engine-1.1.16.tgz","fileCount":147,"integrity":"sha512-ULQn1jMv1BM+jjctRIlNWE3BlsrkkW3E4g6D1jKeJwHTgoMdP9FCpfQ5b6xrOS/Sy5a1Jh1+nUNkbzbxg+YQHw==","signatures":[{"sig":"MEYCIQC5Qe07vTK+WNwcxSGsusDnL8ZlyMT3dUfhyMP3NkWoFgIhAPwcMnqHIAVMHzAvo7w8QKO1jmpJTeRp8XpeziodDwez","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":619387},"main":"dist/node/index.js","type":"module","types":"./dist/node/index.d.ts","exports":{".":{"types":"./dist/node/index.d.ts","import":"./dist/node/index.js","require":"./dist/node/index.js"}},"gitHead":"d70c15eef6147145b2e282af6347a8d8a071f56e","scripts":{"demo":"npm run build:demo && node dist/demo/index.js","test":"vitest run","build":"vite build --config vite.config.node.ts","test:ui":"vitest --ui","build:demo":"vite build --config vite.config.demo.ts","build:node":"vite build --config vite.config.node.ts","test:watch":"vitest","test:visual":"node test-visual.js","test:coverage":"vitest run --coverage","test:state-sync":"vitest run src/state-sync.test.ts","demo:coordinates":"npm run build && node dist/node/examples/coordinate-systems-demo.js","test:determinism":"node test-determinism.js","benchmark:collision":"tsx benchmarks/collision-benchmark.ts"},"_npmUser":{"name":"bloodek","email":"pawelmichalak98@gmail.com"},"repository":{"url":"git+https://github.com/BLooDek/bloody-engine.git","type":"git"},"_npmVersion":"11.4.2","description":"A WebGL-based 2.5D graphics engine for isometric rendering","directories":{},"_nodeVersion":"24.12.0","dependencies":{"gl":"^8.1.6","pngjs":"^7.0.0","@kmamal/sdl":"^0.11.13"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.3.0","vitest":"^4.0.18","@types/gl":"^6.0.5","@vitest/ui":"^4.0.18","typescript":"^5.3.3","@types/node":"^20.10.6","vite-plugin-dts":"^4.5.4"},"_npmOperationalInternal":{"tmp":"tmp/bloody-engine_1.1.16_1769430584816_0.6325556780033628","host":"s3://npm-registry-packages-npm-production"}},"1.1.17":{"name":"bloody-engine","version":"1.1.17","keywords":["webgl","graphics","engine","2.5d","isometric","rendering","game-engine","typescript","nodejs"],"license":"MIT","_id":"bloody-engine@1.1.17","maintainers":[{"name":"bloodek","email":"pawelmichalak98@gmail.com"}],"homepage":"https://github.com/BLooDek/bloody-engine#readme","bugs":{"url":"https://github.com/BLooDek/bloody-engine/issues"},"dist":{"shasum":"928f99e98c35693d598e201e9757c42358af8602","tarball":"https://registry.npmjs.org/bloody-engine/-/bloody-engine-1.1.17.tgz","fileCount":147,"integrity":"sha512-tUZiayZ776/EiHmWJRX6WldoeTgiNAWiZmf3ojSz6aS3gbItcNjSsnFvDVXDM+3BXgRaasaR8+iXAxpGFEcFwg==","signatures":[{"sig":"MEUCIQCbXb0M32aCIdqlonl8KL0fMmOqF/YQifME/IcfAiRnKgIgGJcQem13nJB8/tbR8u0nNk01bk60a6fY3TBLogVvmRM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":619710},"main":"dist/node/index.js","type":"module","types":"./dist/node/index.d.ts","exports":{".":{"types":"./dist/node/index.d.ts","import":"./dist/node/index.js","require":"./dist/node/index.js"}},"gitHead":"d70c15eef6147145b2e282af6347a8d8a071f56e","scripts":{"demo":"npm run build:demo && node dist/demo/index.js","test":"vitest run","build":"vite build --config vite.config.node.ts","test:ui":"vitest --ui","build:demo":"vite build --config vite.config.demo.ts","build:node":"vite build --config vite.config.node.ts","test:watch":"vitest","test:visual":"node test-visual.js","test:coverage":"vitest run --coverage","test:state-sync":"vitest run src/state-sync.test.ts","demo:coordinates":"npm run build && node dist/node/examples/coordinate-systems-demo.js","test:determinism":"node test-determinism.js","benchmark:collision":"tsx benchmarks/collision-benchmark.ts"},"_npmUser":{"name":"bloodek","email":"pawelmichalak98@gmail.com"},"repository":{"url":"git+https://github.com/BLooDek/bloody-engine.git","type":"git"},"_npmVersion":"11.4.2","description":"A WebGL-based 2.5D graphics engine for isometric rendering","directories":{},"_nodeVersion":"24.12.0","dependencies":{"gl":"^8.1.6","pngjs":"^7.0.0","@kmamal/sdl":"^0.11.13"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.3.0","vitest":"^4.0.18","@types/gl":"^6.0.5","@vitest/ui":"^4.0.18","typescript":"^5.3.3","@types/node":"^20.10.6","vite-plugin-dts":"^4.5.4"},"_npmOperationalInternal":{"tmp":"tmp/bloody-engine_1.1.17_1769433125735_0.19588174904103206","host":"s3://npm-registry-packages-npm-production"}},"1.1.18":{"name":"bloody-engine","version":"1.1.18","description":"A WebGL-based 2.5D graphics engine for isometric rendering","license":"MIT","type":"module","main":"dist/node/index.js","types":"./dist/node/index.d.ts","repository":{"type":"git","url":"git+https://github.com/BLooDek/bloody-engine.git"},"keywords":["webgl","graphics","engine","2.5d","isometric","rendering","game-engine","typescript","nodejs"],"bugs":{"url":"https://github.com/BLooDek/bloody-engine/issues"},"homepage":"https://github.com/BLooDek/bloody-engine#readme","exports":{".":{"types":"./dist/node/index.d.ts","import":"./dist/node/index.js","require":"./dist/node/index.js"}},"scripts":{"build":"vite build --config vite.config.node.ts","build:node":"vite build --config vite.config.node.ts","build:demo":"vite build --config vite.config.demo.ts","demo":"npm run build:demo && node dist/demo/index.js","demo:coordinates":"npm run build && node dist/node/examples/coordinate-systems-demo.js","benchmark:collision":"tsx benchmarks/collision-benchmark.ts","test:visual":"node test-visual.js","test:determinism":"node test-determinism.js","test":"vitest run","test:watch":"vitest","test:ui":"vitest --ui","test:state-sync":"vitest run src/state-sync.test.ts","test:coverage":"vitest run --coverage","lint":"eslint .","lint:fix":"eslint . --fix"},"devDependencies":{"@types/gl":"^6.0.5","@types/node":"^20.10.6","@typescript-eslint/eslint-plugin":"^8.54.0","@typescript-eslint/parser":"^8.54.0","@vitest/coverage-v8":"^4.0.18","@vitest/ui":"^4.0.18","eslint":"^9.39.2","eslint-plugin-vitest":"^0.5.4","globals":"^17.2.0","typescript":"^5.3.3","vite":"^7.3.0","vite-plugin-dts":"^4.5.4","vitest":"^4.0.18"},"dependencies":{"@kmamal/sdl":"^0.11.13","gl":"^8.1.6","pngjs":"^7.0.0"},"_id":"bloody-engine@1.1.18","gitHead":"cd6bec95e3ba28be678dbce3fecf42af5b22c251","_nodeVersion":"24.12.0","_npmVersion":"11.4.2","dist":{"integrity":"sha512-LYUKLkfRT5PcPwHiVVaszvAToZqejMYPvx08YWGdGRIsC/5mh+kTRpYJNDN9gGenXrd2pn55Iz8J9npHY4nQtg==","shasum":"3ed515b905d281df0b6c039813c59af388b79014","tarball":"https://registry.npmjs.org/bloody-engine/-/bloody-engine-1.1.18.tgz","fileCount":147,"unpackedSize":630663,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCjegFNLlgOxV3fKsLccA9EzNUWi+MvgzSj0VLTt9doogIgSoWN4JAHxsYN5QikRpin+SNj4lympwULfYuo+HjghZk="}]},"_npmUser":{"name":"bloodek","email":"pawelmichalak98@gmail.com"},"directories":{},"maintainers":[{"name":"bloodek","email":"pawelmichalak98@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/bloody-engine_1.1.18_1770143957657_0.09610806723369913"},"_hasShrinkwrap":false}},"time":{"created":"2026-01-24T00:06:20.287Z","modified":"2026-02-03T18:39:18.283Z","1.0.0":"2026-01-24T00:06:20.612Z","1.0.1":"2026-01-24T00:28:38.496Z","1.0.2":"2026-01-24T00:30:45.522Z","1.0.3":"2026-01-24T00:33:51.374Z","1.0.4":"2026-01-24T00:50:24.150Z","1.0.5":"2026-01-24T01:33:23.640Z","1.0.6":"2026-01-24T12:39:17.214Z","1.0.7":"2026-01-24T14:48:00.046Z","1.0.8":"2026-01-24T23:15:20.434Z","1.0.9":"2026-01-24T23:51:56.618Z","1.0.10":"2026-01-25T00:53:16.303Z","1.0.11":"2026-01-25T04:07:07.434Z","1.1.0":"2026-01-25T15:13:22.197Z","1.1.1":"2026-01-25T18:37:56.646Z","1.1.2":"2026-01-25T20:54:02.305Z","1.1.3":"2026-01-25T21:04:15.467Z","1.1.4":"2026-01-25T22:33:06.375Z","1.1.5":"2026-01-26T00:22:59.490Z","1.1.6":"2026-01-26T00:40:50.826Z","1.1.7":"2026-01-26T01:02:29.463Z","1.1.8":"2026-01-26T01:25:32.959Z","1.1.9":"2026-01-26T01:39:56.831Z","1.1.10":"2026-01-26T02:02:16.344Z","1.1.11":"2026-01-26T03:11:57.329Z","1.1.12":"2026-01-26T03:18:06.308Z","1.1.13":"2026-01-26T03:22:35.966Z","1.1.14":"2026-01-26T11:22:40.373Z","1.1.15":"2026-01-26T12:09:39.451Z","1.1.16":"2026-01-26T12:29:44.974Z","1.1.17":"2026-01-26T13:12:06.002Z","1.1.18":"2026-02-03T18:39:17.871Z"},"bugs":{"url":"https://github.com/BLooDek/bloody-engine/issues"},"license":"MIT","homepage":"https://github.com/BLooDek/bloody-engine#readme","keywords":["webgl","graphics","engine","2.5d","isometric","rendering","game-engine","typescript","nodejs"],"repository":{"type":"git","url":"git+https://github.com/BLooDek/bloody-engine.git"},"description":"A WebGL-based 2.5D graphics engine for isometric rendering","maintainers":[{"name":"bloodek","email":"pawelmichalak98@gmail.com"}],"readme":"# Bloody Engine\n\n[![npm version](https://badge.fury.io/js/bloody-engine.svg)](https://www.npmjs.com/package/bloody-engine)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n[![TypeScript](https://img.shields.io/badge/TypeScript-5.3-blue)](https://www.typescriptlang.org/)\n[![Node.js](https://img.shields.io/badge/Node.js-18%2B-green)](https://nodejs.org/)\n\n> A high-performance WebGL-based 2.5D graphics engine for isometric rendering on Node.js\n\n**Perfect for:** Isometric games, city builders, multiplayer servers, procedural generation, and headless graphics processing.\n\n## Why Bloody Engine?\n\nTraditional game engines require separate client and server codebases, leading to duplicated logic and synchronization bugs. Bloody Engine solves this with an **isomorphic architecture**:\n\n- **Server-Side Rendering**: Run the exact same rendering code on Node.js using headless WebGL\n- **Zero-Copy GPU Transfers**: Structure of Arrays (SoA) architecture enables direct memory transfers\n- **Deterministic Simulation**: Fixed timestep game loop ensures consistent state across all clients\n- **Authoritative Multiplayer**: Server can render scenes virtually to validate visibility and prevent cheats\n- **Performance**: Render 10,000+ entities at 60 FPS with instanced rendering\n\n## Features\n\n- **Structure of Arrays (SoA)** - Entity storage with typed arrays for zero-copy GPU transfers and cache-friendly access\n- **2.5D Rendering** - Optimized for isometric and dimetric projections with depth sorting\n- **Instanced Rendering** - WebGL2 GPU instancing for rendering thousands of identical meshes in a single draw call\n- **Ring Buffer Streaming** - Triple-buffered GPU streaming for zero-copy dynamic updates\n- **Server-Side Rendering** - Headless WebGL rendering on Node.js using `gl` and `@kmamal/sdl`\n- **Batch Rendering** - Efficient sprite batching with GPU-accelerated transformations\n- **Persistent Buffer Mapping** - WebGL2 zero-copy GPU transfers for maximum performance\n- **Resource Management** - Unified asset loading pipeline for textures and shaders\n- **Input System** - Command queue pattern supporting SDL and network input sources\n- **Collision Detection** - Spatial hashing with O(N) collision detection and configurable responses\n- **Networking** - Client-side prediction, server reconciliation, and state synchronization\n- **Simulation** - Pure game logic simulation system with entity management\n- **Game Loop** - Fixed timestep ticker for deterministic game logic\n- **TypeScript** - Fully typed for excellent developer experience\n- **Object Pooling** - Memory-efficient object reuse patterns\n- **Window Management** - SDL-based window creation for interactive applications\n- **Custom Properties** - Opt-in extensible system for game-specific entity properties\n\n## Prerequisites\n\n- **Node.js** 18+ or 20+\n- **Native dependencies**: Requires compilation of `gl` and `@kmamal/sdl`\n\n### Platform-Specific Requirements\n\n**Linux (Debian/Ubuntu):**\n```bash\nsudo apt-get install build-essential libx11-dev libgl1-mesa-dev libxi-dev\n```\n\n**macOS:**\n```bash\nxcode-select --install\n```\n\n**Windows:**\n- Install [Visual Studio Build Tools](https://visualstudio.microsoft.com/downloads/#build-tools-for-visual-studio-2022)\n- Ensure \"C++ build tools\" workload is selected\n\n## Installation\n\n```bash\nnpm install bloody-engine\n```\n\n## Quick Start (5 Minutes)\n\nLet's create a simple isometric tile renderer from scratch:\n\n### Step 1: Create Your First Scene\n\n```typescript\nimport { GraphicsDevice, HybridRenderer, Camera, SHADERS_V4 } from 'bloody-engine';\n\n// 1. Create graphics device (800x600 window)\nconst device = new GraphicsDevice(800, 600);\nconst gl = device.getWebGL2Context();\n\n// 2. Create isometric shader for instanced rendering\nconst shader = device.createShader(SHADERS_V4.vertex, SHADERS_V4.fragment);\n\n// 3. Create hybrid renderer (auto-detects optimal rendering method)\nconst renderer = new HybridRenderer(gl, shader, shader, {\n  instancingThreshold: 100,\n  maxInstances: 10000,\n  tileSize: { width: 64, height: 32 },\n  zScale: 1.0\n});\n\n// 4. Create camera centered on screen\nconst camera = new Camera(400, 300, 1.0);\n```\n\n### Step 2: Add Some Tiles\n\n```typescript\n// Set a gradient texture (or load your own with TextureAtlas)\nrenderer.setTexture(Texture.createGradient(gl, 256, 256));\n\n// Create a 10x10 isometric grid\nfor (let x = 0; x < 10; x++) {\n  for (let y = 0; y < 10; y++) {\n    renderer.addSprite({\n      gridX: x,      // Grid X position (tile index)\n      gridY: y,      // Grid Y position (tile index)\n      z: 0,          // Height/depth layer\n      width: 64,     // Tile width\n      height: 32,    // Tile height (isometric = width/2)\n      texIndex: 0,\n      color: { r: 1, g: 1, b: 1, a: 1 },\n      rotation: 0\n    });\n  }\n}\n```\n\n### Step 3: Render Loop\n\n```typescript\nfunction render() {\n  // Clear screen with dark background\n  device.clear({ r: 0.1, g: 0.1, b: 0.15, a: 1.0 });\n\n  // Render all tiles with camera\n  const metrics = renderer.render(camera);\n\n  // Display to screen\n  device.present();\n\n  // Log performance\n  console.log(`Drew ${metrics.instancedInstances} sprites in ${metrics.instancedDrawCalls} draw calls`);\n\n  // Request next frame\n  requestAnimationFrame(render);\n}\n\n// Start rendering\nrender();\n```\n\n### Step 4: Add Camera Movement\n\n```typescript\n// Add keyboard controls for camera\nimport { SDLWindow } from 'bloody-engine';\n\nconst window = new SDLWindow(800, 600, 'My Isometric Game');\n\nwindow.onKeyDown = (key) => {\n  const speed = 10;\n  switch(key.toLowerCase()) {\n    case 'w': camera.y -= speed; break;  // Up\n    case 's': camera.y += speed; break;  // Down\n    case 'a': camera.x -= speed; break;  // Left\n    case 'd': camera.x += speed; break;  // Right\n  }\n};\n```\n\n**That's it!** You now have a working isometric renderer with:\n- ✅ 100 tiles rendered efficiently\n- ✅ Camera controls\n- ✅ Performance metrics\n\n**Next steps:**\n- Add sprites with `TextureAtlas` for custom graphics\n- Implement collision detection with `SpatialHash`\n- Add multiplayer with `ClientPredictor` and `ServerReconciler`\n\n## Table of Contents\n\n- [Quick Start](#quick-start-5-minutes)\n- [Coordinate Systems](#understanding-coordinate-systems)\n- [API Overview](#api-overview)\n  - [Core Graphics](#core-graphics)\n  - [Rendering](#rendering)\n  - [Resource Loading](#resource-loading)\n  - [Input System](#input-system)\n  - [Simulation & Networking](#simulation--networking)\n  - [Utilities](#utilities)\n- [Examples](#examples)\n  - [Basic Rendering Setup](#basic-rendering-setup)\n  - [Sprite Batch Rendering](#sprite-batch-rendering-with-camera)\n  - [Instanced Rendering](#instanced-rendering-webgl2)\n  - [Shader System Guide](#shader-system-guide)\n  - [Resource Loading](#resource-loading)\n  - [Game Loop](#game-loop-with-fixed-timestep)\n  - [Entity System](#entity-system-soa-architecture)\n  - [Input System](#input-system-with-command-queue)\n  - [Networking](#networking---client-side-prediction)\n  - [Advanced Examples](#advanced-examples)\n- [Testing](#testing)\n- [Platform Support](#platform-support)\n- [Documentation](#documentation)\n- [Building](#building)\n\n## Understanding Coordinate Systems\n\n**⚠️ IMPORTANT**: Before building your game, understand the coordinate systems to avoid inverted controls!\n\nBloody Engine uses different coordinate systems for different purposes. Mixing these up is the #1 cause of inverted controls.\n\n### Quick Summary\n\n| System | Used For | Y-Axis | Example |\n|--------|----------|--------|---------|\n| **Grid Space** | Game logic, entity positions | Y-UP (↓ Y = North/Up) | `entity.move(0, -1, 0)` moves up on screen |\n| **Screen Space** | Rendering, camera, mouse | Y-DOWN (↓ Y = Down) | `camera.y += 10` moves camera down |\n\n**Golden Rule**: Use grid space for game logic, transform to screen space only for rendering.\n\n### Common Mistake\n\n❌ **Wrong**: `camera.y += 1` for \"up\" movement (moves down on screen!)\n✅ **Right**: Use direction deltas: `entity.move(0, -1, 0)` for North\n\n### WASD Controls\n\n| Key | Direction | Delta | Screen Effect |\n|-----|-----------|-------|---------------|\n| **W** / ↑ | North | `{dx: 0, dy: -1}` | ✅ Up |\n| **S** / ↓ | South | `{dx: 0, dy: 1}` | ✅ Down |\n| **A** / ← | West | `{dx: -1, dy: 0}` | ✅ Left |\n| **D** / → | East | `{dx: 1, dy: 0}` | ✅ Right |\n\n📖 **Full Guide**: [docs/COORDINATE_SYSTEMS.md](docs/COORDINATE_SYSTEMS.md)\n🚀 **Interactive Demo**: Run `npm run demo:coordinates` after building\n\n## API Overview\n\n### Core Graphics\n\n| Class | Description |\n|-------|-------------|\n| [GraphicsDevice](src/core/graphics-device.ts) | Main graphics device with WebGL context management |\n| [Shader](src/core/shader.ts) | Shader program compilation and uniform/attribute management |\n| [Texture](src/core/texture.ts) | Texture creation, binding, and management |\n| [VertexBuffer](src/core/buffer.ts) / [IndexBuffer](src/core/buffer.ts) | GPU buffer management for geometry |\n| [Camera](src/rendering/camera.ts) | 2D camera with position, zoom, and view matrix |\n\n### Rendering\n\n| Class | Description |\n|-------|-------------|\n| [BatchRenderer](src/rendering/batch-renderer.ts) | Generic quad batch rendering |\n| [SpriteBatchRenderer](src/rendering/batch-renderer.ts) | Sprite-specific batch renderer with depth sorting |\n| [InstancedRenderer](src/rendering/instanced-renderer.ts) | WebGL2 GPU instancing for thousands of instances in single draw call |\n| [HybridRenderer](src/rendering/hybrid-renderer.ts) | Automatic detection between instanced and batch rendering |\n| [RingBuffer](src/rendering/ring-buffer.ts) | Triple-buffered GPU ring buffer for zero-copy streaming |\n| [ProjectionConfig](src/rendering/projection.ts) | Isometric/dimetric projection utilities |\n| [SpatialHash](src/rendering/spatial-hash.ts) | Spatial partitioning for efficient queries |\n\n### Resource Loading\n\n| Class | Description |\n|-------|-------------|\n| [NodeResourceLoader](src/platforms/node/node-resource-loader.ts) | File system resource loader for Node.js |\n| [NodeTextureLoader](src/platforms/node/node-texture-loader.ts) | PNG texture loading for Node.js |\n| [ResourcePipeline](src/core/resource-pipeline.ts) | Batch resource loading with caching |\n| [TextureAtlas](src/core/sprite-atlas.ts) | Sprite atlas packing and UV coordinate management |\n\n### Input System\n\n| Class | Description |\n|-------|-------------|\n| [CommandQueue](src/input/command-queue.ts) | Thread-safe command queue for input |\n| [SDLInputSource](src/input/sdl-input-source.ts) | SDL keyboard/mouse input |\n| [NetworkInputSource](src/input/networking-input-source.ts) | Network-based input for multiplayer |\n\n### Simulation & Networking\n\n| Class | Description |\n|-------|-------------|\n| [EntityStorage](src/simulation/entity-storage.ts) | SoA storage with typed arrays for high-performance entity data |\n| [EntityHandle](src/simulation/entity-handle.ts) | Opaque handles for safe entity references |\n| [EntityTypeRegistry](src/simulation/entity-type-registry.ts) | Type string to ID mapping for storage efficiency |\n| [Entity](src/simulation/entity.ts) / [EntityManager](src/simulation/entity-manager.ts) | Entity component system (now uses SoA storage internally) |\n| [SimulationLoop](src/simulation/simulation-loop.ts) | Deterministic game logic simulation |\n| [SoaWebGLRenderer](src/rendering/soa-webgl-renderer.ts) | WebGL2 renderer with persistent buffer mapping |\n| [ClientPredictor](src/networking/client-predictor.ts) | Client-side prediction for lag compensation |\n| [ServerReconciler](src/networking/server-reconciler.ts) | Server-side reconciliation |\n| [StateSnapshot](src/networking/state-snapshot.ts) | World state serialization |\n| [BinarySerializer](src/networking/binary-serializer.ts) | Efficient binary serialization |\n\n### Utilities\n\n| Class | Description |\n|-------|-------------|\n| [ObjectPool](src/core/object-pool.ts) | Generic object pooling for GC optimization |\n| [Matrix4Pool](src/core/matrix-pool.ts) | Matrix4 specific pooling |\n| [lerp](src/core/interpolation.ts), [lerpVec2](src/core/interpolation.ts), [lerpVec3](src/core/interpolation.ts) | Interpolation utilities |\n\n## Examples\n\n### Runnable Demos\n\nBuild the library first, then run any demo:\n\n```bash\nnpm run build           # Build the library\n\n# Run interactive demos\nnpm run demo            # Main demo with various features\nnpm run demo:coordinates # Visualize coordinate systems\n```\n\n### Code Examples by Difficulty\n\n**Beginner:**\n- [Basic Rendering Setup](#basic-rendering-setup) - Create a device and render a quad\n- [Sprite Batch Rendering](#sprite-batch-rendering-with-camera) - Render multiple sprites with camera\n- [Game Loop](#game-loop-with-fixed-timestep) - Implement a fixed timestep loop\n\n**Intermediate:**\n- [Instanced Rendering](#instanced-rendering-webgl2) - Render thousands of tiles efficiently\n- [Shader System Guide](#shader-system-guide) - Choose and use the right shader\n- [Entity System](#entity-system-soa-architecture) - Manage game entities with SoA storage\n\n**Advanced:**\n- [Input System](#input-system-with-command-queue) - Handle keyboard/mouse with command pattern\n- [Networking](#networking---client-side-prediction) - Client-side prediction for multiplayer\n- [Networked Game Architecture](#networked-game-architecture) - Full multiplayer setup\n\n## Code Examples\n\n### Basic Rendering Setup\n\n```typescript\nimport { GraphicsDevice, Shader, Texture, VertexBuffer } from 'bloody-engine';\n\n// Create graphics device (800x600)\nconst device = new GraphicsDevice(800, 600);\nconst gl = device.getGLContext();\n\n// Create a shader\nconst shader = device.createShader(`\n  attribute vec3 aPosition;\n  uniform mat4 uMatrix;\n\n  void main() {\n    gl_Position = uMatrix * vec4(aPosition, 1.0);\n  }\n`, `\n  precision mediump float;\n  uniform vec3 uColor;\n\n  void main() {\n    gl_FragColor = vec4(uColor, 1.0);\n  }\n`);\n\n// Create a gradient texture\nconst texture = Texture.createGradient(gl, 256, 256);\n\n// Create geometry\nconst vertices = new Float32Array([\n  // x, y, z, u, v\n  -0.5, -0.5, 0, 0, 1,\n   0.5, -0.5, 0, 1, 1,\n   0.5,  0.5, 0, 1, 0,\n  -0.5, -0.5, 0, 0, 1,\n   0.5,  0.5, 0, 1, 0,\n  -0.5,  0.5, 0, 0, 0\n]);\nconst buffer = new VertexBuffer(gl, vertices, 20); // 5 floats * 4 bytes\n\n// Setup and render\ndevice.clear({ r: 0.1, g: 0.1, b: 0.1, a: 1.0 });\nshader.use();\nbuffer.bind();\n// ... configure attributes ...\ngl.drawArrays(gl.TRIANGLES, 0, buffer.getVertexCount());\ndevice.present();\n```\n\n### Sprite Batch Rendering with Camera\n\n```typescript\nimport { SpriteBatchRenderer, Camera, Texture, GraphicsDevice } from 'bloody-engine';\n\nconst device = new GraphicsDevice(800, 600);\nconst gl = device.getGLContext();\n\n// Create shader (use built-in V2 shader for sprites)\nconst shader = device.createShader(vertexSource, fragmentSource);\n\n// Create sprite batch renderer (capacity: 1000 sprites)\nconst batchRenderer = new SpriteBatchRenderer(gl, shader, 1000);\nbatchRenderer.setTexture(Texture.createGradient(gl, 256, 256));\n\n// Create camera\nconst camera = new Camera(0, 0, 1.0); // x=0, y=0, zoom=1x\n\n// Add sprites to batch\nbatchRenderer.addQuad({\n  x: 100, y: 100, z: 0,\n  width: 64, height: 64,\n  rotation: 0,\n  color: { r: 1, g: 1, b: 1, a: 1 },\n  texIndex: 0\n});\n\n// Render with camera\ndevice.clear({ r: 0.1, g: 0.1, b: 0.1, a: 1.0 });\nbatchRenderer.render(camera);\ndevice.present();\n```\n\n### Instanced Rendering (WebGL2)\n\nFor rendering thousands of identical meshes (floor tiles, sprites, particles), use the instanced renderer for massive performance gains:\n\n```typescript\nimport {\n  HybridRenderer,\n  InstancedRenderer,\n  GraphicsDevice,\n  Camera\n} from 'bloody-engine';\nimport { SHADERS_V4 } from 'bloody-engine/scene';\n\n// Create graphics device\nconst device = new GraphicsDevice(800, 600);\n\n// Check WebGL2 support\nif (!device.isWebGL2()) {\n  throw new Error('Instanced rendering requires WebGL2');\n}\n\nif (!device.supportsInstancing()) {\n  throw new Error('GPU instancing not supported');\n}\n\n// Get WebGL2 context\nconst gl = device.getWebGL2Context();\n\n// Create shaders\nconst instancedShader = device.createShader(\n  SHADERS_V4.vertex,\n  SHADERS_V4.fragment\n);\n\n// Use existing V3 shader for batch rendering\nconst batchShader = device.createShader(\n  SHADERS_V3.vertex,\n  SHADERS_V3.fragment\n);\n\n// Create hybrid renderer (auto-detects when to use instancing)\nconst renderer = new HybridRenderer(gl, instancedShader, batchShader, {\n  instancingThreshold: 100,  // Use instancing for 100+ instances\n  maxInstances: 10000,\n  tileSize: { width: 64, height: 32 },\n  zScale: 1.0\n});\n\n// Create camera\nconst camera = new Camera(0, 0, 1.0);\n\n// Set texture\nrenderer.setTexture(texture);\n\n// Add thousands of floor tiles\nfor (let x = 0; x < 100; x++) {\n  for (let y = 0; y < 100; y++) {\n    renderer.addSprite({\n      gridX: x,\n      gridY: y,\n      z: 0,\n      width: 32,\n      height: 32,\n      texIndex: 0,\n      color: { r: 1, g: 1, b: 1, a: 1 },\n      rotation: 0\n    });\n  }\n}\n\n// Render (automatically uses instancing for large batches)\ndevice.clear({ r: 0.1, g: 0.1, b: 0.1, a: 1.0 });\nconst metrics = renderer.render(camera);\ndevice.present();\n\n// Check performance metrics\nconsole.log(`Instanced: ${metrics.instancedInstances} instances in ${metrics.instancedDrawCalls} draw calls`);\nconsole.log(`Batched: ${metrics.batchedInstances} instances in ${metrics.batchedDrawCalls} draw calls`);\n\n// Output with 10,000 tiles:\n// Instanced: 10000 instances in 1 draw calls\n// Batched: 0 instances in 0 draw calls\n// (100x performance improvement!)\n```\n\n**Performance Comparison:**\n\n| Instance Count | Batch Renderer | Instanced Renderer | Speedup |\n|----------------|----------------|-------------------|---------|\n| 100 | ~1ms | ~0.5ms | 2x |\n| 1,000 | ~10ms | ~1ms | 10x |\n| 10,000 | ~100ms | ~5ms | 20x |\n\n**When to Use Instanced Rendering:**\n- ✅ Floor tiles, walls, terrain (many identical meshes)\n- ✅ Particles, projectiles (same geometry, different positions)\n- ✅ Sprites with same texture and size\n- ❌ Unique sprites with different textures\n- ❌ Small batches (< 100 instances)\n\nThe `HybridRenderer` automatically detects when to use instancing, so you get the best of both worlds!\n\n## Performance Benchmarks\n\n*Tested on: AMD Ryzen 9 5900X, NVIDIA RTX 3080, Node.js v20*\n\n| Scenario | Entities | FPS | Draw Calls | Frame Time |\n|----------|----------|-----|------------|------------|\n| Batch Renderer | 1,000 | 60 | 1,000 | ~10ms |\n| Instanced Renderer | 10,000 | 60 | 1 | ~5ms |\n| Hybrid Renderer (mixed) | 5,000 | 60 | 50 | ~8ms |\n| Collision Detection (Spatial Hash) | 10,000 | 60 | N/A | ~2ms |\n| Full Game Loop (render + physics) | 5,000 | 60 | 50 | ~12ms |\n\n**Key Performance Insights:**\n- Instanced rendering provides **10-20x speedup** for 1000+ identical entities\n- SoA entity storage reduces memory usage by **60-70%** vs traditional object-based storage\n- Spatial hash collision detection maintains **O(N)** performance even at high entity counts\n\n---\n\n## Shader System Guide\n\nBloody Engine provides **6 built-in shader versions** optimized for different rendering scenarios. Choosing the right shader is critical for performance and correct rendering.\n\n### Quick Reference Table\n\n| Shader | Projection | Features | Best For | Coordinate System |\n|--------|------------|----------|----------|-------------------|\n| **V1** | Flexible (any) | Basic texturing | Simple 2D quads | Screen/world (you control via matrix) |\n| **V2** | Flexible (any) | Color tint, texture atlas | 2D sprites with colors | Screen/world (you control via matrix) |\n| **V3** | **Isometric** | GPU-based transform | Isometric batch rendering | Grid coordinates |\n| **V4** | **Isometric** | Instanced rendering | Isometric tiles (1000+) | Grid coordinates |\n| **V5** | **Top-Down** | Instanced rendering | Top-down tiles (1000+) | World/pixel coordinates |\n| **V6** | **Top-Down** | GPU-based transform | Top-down batch rendering | World/pixel coordinates |\n\n---\n\n### Projection Types Explained\n\n#### Isometric Projection (V3, V4)\n```\n    Y\n    ↑\n    |  Screen coordinates are rotated 45°\n    |  Creates a \"fake 3D\" look\n    └──────→ X\n\nGrid (5,3) → Screen (64, 256)\n```\n- **X axis**: Diagonal (↗) on screen\n- **Y axis**: Diagonal (↘) on screen\n- **Use for**: Isometric games, city builders, RPGs\n\n#### Top-Down Projection (V5, V6)\n```\n    Y\n    ↑\n    |  Standard 2D coordinates\n    |  Y-UP: lower Y = higher on screen\n    └──────→ X\n\nWorld (320, 240) → Screen (320, 240)\n```\n- **X axis**: Horizontal (→) on screen\n- **Y axis**: Vertical (↑) on screen (before camera transform)\n- **Use for**: Top-down shooters, strategy games, platformers\n\n---\n\n### V1 & V2 - Flexible 2D Shaders\n\n**Use these when you need full control over projection.**\n\n```typescript\nimport { SHADERS_V1, SHADERS_V2 } from 'bloody-engine';\n\n// V1: Basic textured quads\nconst shaderV1 = device.createShader(\n  SHADERS_V1.vertex,\n  SHADERS_V1.fragment\n);\n\n// V2: Adds color tint and texture atlas support\nconst shaderV2 = device.createShader(\n  SHADERS_V2.vertex,\n  SHADERS_V2.fragment\n);\n```\n\n**Shader V1 attributes:**\n- `aPosition` (vec3): x, y, z position\n- `aTexCoord` (vec2): u, v texture coordinates\n\n**Shader V2 adds:**\n- `aColor` (vec4): r, g, b, a color tint\n- `aTexIndex` (float): texture atlas index\n\n**Both use:**\n- `uMatrix` (mat4): You control projection (orthographic, perspective, etc.)\n\n**When to use:**\n- ✅ Standard 2D games with custom projections\n- ✅ UI rendering\n- ✅ Non-isometric views\n- ✅ When you need camera matrix flexibility\n\n---\n\n### V3 & V4 - Isometric Shaders\n\n**Use these for isometric games (city builders, isometric RPGs).**\n\n```typescript\nimport { SHADERS_V3, SHADERS_V4 } from 'bloody-engine';\n\n// V3: Batch rendering (CPU-side batching)\nconst shaderV3 = device.createShader(\n  SHADERS_V3.vertex,\n  SHADERS_V3.fragment\n);\n\n// V4: Instanced rendering (GPU-side batching)\nconst shaderV4 = device.createShader(\n  SHADERS_V4.vertex,\n  SHADERS_V4.fragment\n);\n```\n\n**Isometric projection in shader:**\n```glsl\n// Both V3 and V4 use this transform:\nvec2 isoScreen = vec2(\n  (aGridPosition.x - aGridPosition.y) * uTileSize.x * 0.5,\n  (aGridPosition.x + aGridPosition.y) * uTileSize.y * 0.5\n);\n```\n\n**Coordinate system:**\n- Input: **Grid coordinates** (tile indices, not pixels)\n- Example: `gridX: 5, gridY: 3` → 5th tile right, 3rd tile down\n\n**V3 (Batch) uses:**\n- `uCamera` (vec3): x, y position and zoom\n- `uResolution` (vec2): screen width/height for NDC conversion\n- `uTileSize` (vec2): isometric tile dimensions\n- `uZScale` (float): height exaggeration\n\n**V4 (Instanced) uses:**\n- `uMatrix` (mat4): camera transform (more flexible)\n- `uTileSize` (vec2): isometric tile dimensions\n- `uZScale` (float): height exaggeration\n\n**When to use:**\n- ✅ Isometric city builders\n- ✅ Isometric RPGs\n- ✅ Games with diagonal movement\n- ❌ Not suitable for standard 2D views\n\n**Example usage (V3):**\n```typescript\nconst batchRenderer = new GPUBasedSpriteBatchRenderer(\n  gl, shaderV3, 10000,\n  { width: 64, height: 32 },  // Isometric tile size\n  1.0                         // Z scale\n);\n\n// Add sprites in GRID coordinates (tile indices)\nbatchRenderer.addQuad({\n  x: 320, y: 240,  // World pixel position (optional)\n  gridX: 5,         // Grid X tile index ← Actual rendering position\n  gridY: 3,         // Grid Y tile index ← Actual rendering position\n  z: 0,\n  width: 64,\n  height: 32,\n  color: { r: 1, g: 1, b: 1, a: 1 }\n});\n```\n\n---\n\n### V5 & V6 - Top-Down Shaders (NEW!)\n\n**Use these for standard 2D top-down games.**\n\n```typescript\nimport { SHADERS_V5, SHADERS_V6 } from 'bloody-engine';\n\n// V5: Top-down instanced rendering\nconst shaderV5 = device.createShader(\n  SHADERS_V5.vertex,\n  SHADERS_V5.fragment\n);\n\n// V6: Top-down batch rendering\nconst shaderV6 = device.createShader(\n  SHADERS_V6.vertex,\n  SHADERS_V6.fragment\n);\n```\n\n**Direct coordinates (no isometric transform):**\n```glsl\n// Both V5 and V6 use direct coordinates:\nvec2 worldPos = aGridPosition + localPos;  // No transform!\n```\n\n**Coordinate system:**\n- Input: **World/pixel coordinates** (direct screen positions)\n- Example: `gridX: 320, gridY: 240` → position at (320, 240) pixels\n\n**V6 (Batch) uses:**\n- `uCamera` (vec3): x, y position and zoom\n- `uResolution` (vec2): screen width/height for NDC conversion\n- `uZScale` (float): depth scale (for sorting, not visual height)\n\n**V5 (Instanced) uses:**\n- `uMatrix` (mat4): camera transform\n- `uZScale` (float): depth scale\n\n**When to use:**\n- ✅ Top-down shooters\n- ✅ Strategy games\n- ✅ Platformers\n- ✅ Any standard 2D game\n- ❌ Not suitable for isometric views\n\n**Example usage (V6):**\n```typescript\nconst batchRenderer = new GPUBasedSpriteBatchRenderer(\n  gl, shaderV6, 10000,\n  { width: 64, height: 64 },  // Regular tile size (square)\n  1.0                         // Z scale for depth sorting\n);\n\n// Add sprites in WORLD/PIXEL coordinates (direct positions)\nbatchRenderer.addQuad({\n  x: 320,           // Direct pixel X position\n  y: 240,           // Direct pixel Y position\n  gridX: 320,       // Same as x (used for rendering)\n  gridY: 240,       // Same as y (used for rendering)\n  z: 0,             // Depth for sorting (0 = background)\n  width: 64,\n  height: 64,\n  color: { r: 1, g: 0.5, b: 0.2, a: 1 }\n});\n```\n\n---\n\n### Migration Guide: Isometric → Top-Down\n\n**If you're using V3/V4 (isometric) and want to switch to V5/V6 (top-down):**\n\n```typescript\n// BEFORE (Isometric V3/V4):\nrenderer.addQuad({\n  x: 320, y: 240,\n  gridX: Math.floor(x / 64),  // Converting to grid indices\n  gridY: Math.floor(y / 64),\n  z: y / 64,\n  width: 64,\n  height: 32,  // Non-square for isometric\n  ...\n});\n\n// AFTER (Top-Down V5/V6):\nrenderer.addQuad({\n  x: 320, y: 240,\n  gridX: x,     // Direct pixel coordinates\n  gridY: y,     // Direct pixel coordinates\n  z: 0,         // Depth for sorting only\n  width: 64,\n  height: 64,   // Square for top-down\n  ...\n});\n```\n\n**Key changes:**\n1. Remove `Math.floor()` - use coordinates as-is\n2. Use square tiles (width === height) instead of isometric (height = width/2)\n3. `z` is now only for depth sorting, not visual height\n\n---\n\n### Choosing the Right Shader\n\n**Decision tree:**\n\n```\nNeed isometric view?\n├─ Yes → Use V3 (batch) or V4 (instanced)\n│   └─ Coordinate system: Grid indices (0, 1, 2, ...)\n│\n└─ No (standard 2D) → Need custom projection?\n    ├─ Yes → Use V1 or V2 (flexible)\n    │   └─ You control uMatrix for any projection\n    │\n    └─ No (standard top-down) → Use V5 (instanced) or V6 (batch)\n        └─ Coordinate system: Pixel/world coordinates (320, 240, ...)\n```\n\n**Performance recommendations:**\n\n| Entity Count | Recommended Shader | Rationale |\n|--------------|-------------------|-----------|\n| < 100 | Any | Overhead is negligible |\n| 100-1000 | V3, V6 (batch) | Good balance |\n| 1000+ | V4, V5 (instanced) | Best GPU utilization |\n| Mixed | HybridRenderer | Auto-detects optimal method |\n\n---\n\n### Complete Example: Top-Down Game with V6\n\n```typescript\nimport {\n  GraphicsDevice,\n  Camera,\n  GPUBasedSpriteBatchRenderer,\n  SHADERS_V6\n} from 'bloody-engine';\n\n// Setup\nconst device = new GraphicsDevice(800, 600);\nconst gl = device.getGLContext();\n\n// Use top-down batch shader (V6)\nconst shader = device.createShader(\n  SHADERS_V6.vertex,\n  SHADERS_V6.fragment\n);\n\n// Create batch renderer with top-down settings\nconst renderer = new GPUBasedSpriteBatchRenderer(\n  gl,\n  shader,\n  10000,                    // Max sprites\n  { width: 64, height: 64 }, // Square tiles\n  1.0                        // Z scale (depth sorting)\n);\n\n// Create camera\nconst camera = new Camera(400, 300, 1.0); // Center of screen, 1x zoom\n\n// Game loop\nfunction render() {\n  // Clear screen\n  device.clear({ r: 0.1, g: 0.1, b: 0.15, a: 1.0 });\n\n  // Add player at pixel position (300, 200)\n  renderer.addQuad({\n    x: 300,\n    y: 200,\n    gridX: 300,  // Direct pixel position\n    gridY: 200,\n    z: 1,        // Player in front of background\n    width: 64,\n    height: 64,\n    color: { r: 0.2, g: 0.6, b: 1.0, a: 1 },\n    rotation: 0,\n    texIndex: 0\n  });\n\n  // Add enemy at pixel position (500, 350)\n  renderer.addQuad({\n    x: 500,\n    y: 350,\n    gridX: 500,  // Direct pixel position\n    gridY: 350,\n    z: 1,        // Same layer as player\n    width: 48,\n    height: 48,\n    color: { r: 1.0, g: 0.2, b: 0.2, a: 1 },\n    rotation: 0,\n    texIndex: 0\n  });\n\n  // Render with camera\n  renderer.render(camera);\n  device.present();\n}\n```\n\n**Notice:** No coordinate conversion needed! Just pass pixel positions directly.\n\n---\n\n### Resource Loading\n\n```typescript\nimport {\n  ResourceLoaderFactory,\n  createResourcePipeline,\n  NodeTextureLoader\n} from 'bloody-engine';\n\n// Create resource pipeline\nconst pipeline = await createResourcePipeline({\n  concurrency: 5,\n  cache: true,\n  baseDir: process.cwd()\n});\n\n// Load shaders\nconst shaders = await pipeline.loadShaders([\n  { name: 'basic', vertex: 'shaders/basic.vert', fragment: 'shaders/basic.frag' }\n]);\n\n// Batch load resources\nconst { succeeded, failed } = await pipeline.loadMultiple([\n  'textures/sprite1.png',\n  'textures/sprite2.png'\n]);\n\n// Load texture from PNG\nconst textureLoader = new NodeTextureLoader();\nconst texture = await textureLoader.loadTexture(gl, 'textures/sprite.png');\n```\n\n### Game Loop with Fixed Timestep\n\n```typescript\nimport { Ticker, type TickerConfig } from 'bloody-engine';\n\nconst config: TickerConfig = {\n  targetFPS: 60,\n  fixedDeltaTime: 1 / 60, // 60 physics updates per second\n  maxFrameTime: 0.25 // Prevent spiral of death\n};\n\nconst ticker = new Ticker(config);\n\nticker.start({\n  update: (deltaTime) => {\n    // Game logic update (fixed timestep)\n    console.log(`Update: ${deltaTime.toFixed(3)}s`);\n  },\n  render: (interpolation) => {\n    // Render with interpolation factor\n    console.log(`Render: interpolation=${interpolation.toFixed(3)}`);\n  }\n});\n\n// Get performance metrics\nconst metrics = ticker.getMetrics();\nconsole.log(`FPS: ${metrics.fps}, Delta Time: ${metrics.deltaTime}s`);\n```\n\n### Entity System (SoA Architecture)\n\nThe engine now uses Structure of Arrays (SoA) for entity storage, providing:\n- **Zero-copy GPU transfers** - Direct typed array uploads to WebGL buffers\n- **Better cache locality** - Sequential memory access patterns\n- **SIMD-ready** - Data layout enables future vectorization\n- **Extensible properties** - Add custom typed arrays for game-specific data\n\n```typescript\nimport { EntityManager, type EntityState } from 'bloody-engine';\n\n// Create entity manager (uses SoA storage internally)\nconst manager = new EntityManager();\n\n// Create entity with initial state\nconst player = manager.createEntity(\"player\", {\n  gridPos: { xgrid: 10, ygrid: 20, zheight: 5 },\n  velocity: { x: 1, y: 0, z: 0 },\n  speed: 2.5\n});\n\n// All existing methods work unchanged (full backward compatibility)\nplayer.setGridPos(50, 60, 10);\nplayer.move(5, 5, 0);\nplayer.setVelocity(2, 1, 0);\n\n// Query entities\nconst players = manager.getEntitiesByType(\"player\");\nconst nearby = manager.getEntitiesInRange(50, 60, 100);\n\n// Register custom properties (opt-in extension)\nmanager.registerCustomProperty(\"health\", Float32Array);\nmanager.registerCustomProperty(\"stamina\", Uint32Array);\n\n// Access SoA storage directly for advanced use\nconst storage = manager.getStorage();\nconst handle = (player as any).getHandle();\n\n// Set custom property\nstorage.setCustomProperty(handle.index, \"health\", 100);\n```\n\n### Input System with Command Queue\n\n```typescript\nimport {\n  CommandQueue,\n  SDLInputSource,\n  createSDLInputSource,\n  CommandType\n} from 'bloody-engine';\n\n// Create command queue\nconst queue = new CommandQueue();\n\n// Create SDL input source (requires SDL window)\nconst sdlWindow = new SDLWindow(800, 600, 'Game');\nconst inputSource = createSDLInputSource(sdlWindow, {\n  keyMapping: {\n    moveUp: ['w', 'arrowup'],\n    moveDown: ['s', 'arrowdown'],\n    moveLeft: ['a', 'arrowleft'],\n    moveRight: ['d', 'arrowright']\n  }\n});\n\n// Process input in game loop\nwhile (running) {\n  // Collect input commands\n  inputSource.update(queue);\n\n  // Process commands\n  while (queue.hasCommands()) {\n    const command = queue.dequeue();\n    switch (command.type) {\n      case CommandType.Move:\n        handleMove(command);\n        break;\n      case CommandType.Attack:\n        handleAttack(command);\n        break;\n    }\n  }\n}\n```\n\n### Networking - Client-Side Prediction\n\n```typescript\nimport {\n  createClientPredictor,\n  ClientPredictor,\n  type ClientInputMessage\n} from 'bloody-engine';\n\n// Create predictor with config\nconst predictor = createClientPredictor({\n  maxPredictedTicks: 100,\n  reconciliationDelay: 100 // ms\n});\n\n// Client loop: send input\nconst onInput = (input: MoveCommand) => {\n  const tick = currentTick;\n  predictor.addLocalInput(tick, input);\n\n  // Send to server\n  socket.send(JSON.stringify({\n    type: 'client_input',\n    tick,\n    input\n  } as ClientInputMessage));\n};\n\n// Receive server update\nconst onServerUpdate = (message: ServerStateUpdateMessage) => {\n  const result = predictor.reconcile(message);\n\n  if (result.corrected) {\n    console.log(`Reconciled: corrected=${result.corrected}, error=${result.error}`);\n  }\n};\n```\n\n### Object Pooling for Performance\n\n```typescript\nimport { ObjectPool, type ObjectPoolConfig } from 'bloody-engine';\n\n// Create pool for Vector3 objects\nconst pool = new ObjectPool<Vector3>({\n  initialSize: 100,\n  growthFactor: 2,\n  factory: () => ({ x: 0, y: 0, z: 0 }),\n  reset: (obj) => { obj.x = 0; obj.y = 0; obj.z = 0; }\n});\n\n// Acquire from pool\nconst vec = pool.acquire();\nvec.x = 10; vec.y = 20; vec.z = 30;\n\n// Return to pool when done\npool.release(vec);\n\n// Get pool statistics\nconst stats = pool.getStats();\nconsole.log(`Size: ${stats.size}, Active: ${stats.active}, Hits: ${stats.hits}`);\n```\n\n### Isometric Projection\n\n```typescript\nimport { ProjectionConfig, gridToScreen, screenToGrid } from 'bloody-engine';\n\n// Configure isometric projection\nconst config = new ProjectionConfig({\n  tileWidth: 64,\n  tileHeight: 32,\n  angle: Math.PI / 6, // 30 degrees\n  screenWidth: 800,\n  screenHeight: 600\n});\n\n// Convert grid to screen coordinates\nconst gridPos = { xgrid: 5, ygrid: 3, zheight: 0 };\nconst screenPos = gridToScreen(gridPos, config);\nconsole.log(`Screen: x=${screenPos.xscreen}, y=${screenPos.yscreen}`);\n\n// Convert screen to grid coordinates\nconst gridPos2 = screenToGrid(screenPos, config);\n```\n\n### Texture Atlas for Sprite Sheets\n\n```typescript\nimport { TextureAtlas, AtlasLoader } from 'bloody-engine';\n\n// Load sprite atlas\nconst atlas = await AtlasLoader.loadFromJSON(gl, 'atlas.json');\n\n// Get sprite info\nconst sprite = atlas.getSprite('player_idle_01');\n\n// Use UV rect for rendering\nbatchRenderer.addQuad({\n  x: 100, y: 100, z: 0,\n  width: sprite.pixelRect.width,\n  height: sprite.pixelRect.height,\n  uvRect: sprite.uvRect\n});\n```\n\n### SoA Deep Dive: Zero-Copy GPU Rendering\n\nThe Structure of Arrays (SoA) architecture enables direct GPU transfers without intermediate copying:\n\n```typescript\nimport { EntityStorage, SoaWebGLRenderer, Shader } from 'bloody-engine';\n\n// Create SoA storage and populate with entities\nconst storage = new EntityStorage(10000);\n// ... add entities ...\n\n// Create WebGL2 renderer with persistent buffer mapping\nconst gl = device.getGLContext() as WebGL2RenderingContext;\nconst shader = device.createShader(vertexSource, fragmentSource);\nconst renderer = new SoaWebGLRenderer(gl, shader, 10000);\n\n// Initialize persistent buffers (maps GPU memory to CPU arrays)\nrenderer.initialize(storage);\n\n// In your render loop:\nfunction render() {\n  // Zero-copy: Update GPU memory directly\n  renderer.render(storage);\n\n  // GPU sees changes immediately (coherent mapping)\n  device.present();\n}\n```\n\n**Performance Benefits:**\n- **No bufferSubData overhead**: Direct CPU→GPU memory writes\n- **Better cache locality**: Sequential access to entity data\n- **SIMD-ready**: Data layout enables future vectorization\n- **Memory efficient**: Typed arrays use 2-4x less memory than objects\n\n### Custom Properties Extension\n\nAdd game-specific properties without modifying core classes:\n\n```typescript\nimport { EntityManager, Float32Array, Uint32Array } from 'bloody-engine';\n\nconst manager = new EntityManager();\n\n// Register custom properties (opt-in)\nmanager.registerCustomProperty('health', Float32Array);    // Float values\nmanager.registerCustomProperty('mana', Uint32Array);       // Integer values\nmanager.registerCustomProperty('xp', Float32Array);        // Experience points\n\n// Create entity\nconst player = manager.createEntity('player');\n\n// Access storage to set custom properties\nconst storage = manager.getStorage();\nconst handle = (player as any).getHandle();\n\nstorage.setCustomProperty(handle.index, 'health', 100.0);\nstorage.setCustomProperty(handle.index, 'mana', 50);\nstorage.setCustomProperty(handle.index, 'xp', 0);\n\n// Bulk update all entities (cache-efficient)\nconst allHealth = storage.getCustomPropertyArray('health');\nfor (let i = 0; i < storage.getCount(); i++) {\n  allHealth[i] += 10; // Regenerate health for all entities\n}\n```\n\n### SoA Memory Layout\n\nUnderstanding the SoA memory layout helps with performance optimization:\n\n```typescript\n// Entity 0 data at indices 0-2\npositions[0] = entity0.x\npositions[1] = entity0.y\npositions[2] = entity0.z\n\n// Entity 1 data at indices 3-5\npositions[3] = entity1.x\npositions[4] = entity1.y\npositions[5] = entity1.z\n\n// Same pattern for all properties:\n// - velocities: [vx0, vy0, vz0, vx1, vy1, vz1, ...]\n// - colors: [r0, g0, b0, a0, r1, g1, b1, a1, ...]\n// - rotations: [rot0, rot1, rot2, ...]\n// - textureIds: [id0, id1, id2, ...]\n```\n\nThis layout enables:\n- **Zero-copy views**: `positions.subarray(0, entityCount * 3)` → GPU\n- **Bulk updates**: Loop through contiguous memory\n- **Cache efficiency**: Predictable access patterns\n\n### Migration from AoS to SoA\n\nIf you have existing code using the old Array-of-Structures pattern:\n\n**Before (AoS - deprecated):**\n```typescript\n// This no longer works\nconst entity = new Entity(\"player1\", \"player\", {\n  gridPos: { xgrid: 10, ygrid: 20, zheight: 0 }\n});\n```\n\n**After (SoA - current):**\n```typescript\n// Use EntityManager factory\nconst manager = new EntityManager();\nconst entity = manager.createEntity(\"player\", {\n  gridPos: { xgrid: 10, ygrid: 20, zheight: 0 }\n});\n\n// Everything else works the same!\nentity.setGridPos(50, 60, 10);\nentity.move(5, 5, 0);\nentity.setVelocity(1, 0, 0);\n```\n\n**Breaking Changes:**\n- Direct `new Entity()` construction is no longer supported\n- Use `EntityManager.createEntity()` for all entity creation\n- Deserialization: Use `EntityManager.deserializeAll()` instead of `Entity.deserialize()`\n\n## Advanced Examples\n\n### Networked Game Architecture\n\n```typescript\nimport {\n  SimulationLoop,\n  Entity,\n  ClientPredictor,\n  ServerReconciler,\n  StateSnapshot,\n  Ticker\n} from 'bloody-engine';\n\n// Server-side simulation\nconst serverSim = new SimulationLoop({\n  fixedDeltaTime: 1 / 60\n});\n\n// Client-side prediction\nconst clientPredictor = createClientPredictor({\n  maxPredictedTicks: 100\n});\n\n// Server reconciliation\nconst serverReconciler = createServerReconciler({\n  maxRewindTicks: 50\n});\n\n// Game loop on client\nconst ticker = new Ticker({ targetFPS: 60 });\nticker.start({\n  update: (deltaTime) => {\n    // 1. Collect input and send to server\n    const input = collectInput();\n    socket.send({ type: 'input', input, tick: currentTick });\n\n    // 2. Predict locally\n    clientPredictor.addLocalInput(currentTick, input);\n    const predictedState = predictState();\n\n    // 3. Handle server updates\n    onServerUpdate = (update) => {\n      clientPredictor.reconcile(update);\n    };\n  },\n  render: (interpolation) => {\n    renderGame(clientPredictor.getLatestState(), interpolation);\n  }\n});\n```\n\n### Deterministic Simulation Testing\n\n```typescript\nimport { SimulationLoop, Entity } from 'bloody-engine';\n\n// Create two simulations for testing determinism\nconst sim1 = new SimulationLoop({ fixedDeltaTime: 1 / 60, seed: 12345 });\nconst sim2 = new SimulationLoop({ fixedDeltaTime: 1 / 60, seed: 12345 });\n\n// Add identical entities\nsim1.addEntity(new Entity({ id: '1', x: 0, y: 0 }));\nsim2.addEntity(new Entity({ id: '1', x: 0, y: 0 }));\n\n// Run simulations\nfor (let i = 0; i < 1000; i++) {\n  sim1.update(1 / 60);\n  sim2.update(1 / 60);\n}\n\n// Verify determinism\nconst state1 = sim1.getStateSnapshot();\nconst state2 = sim2.getStateSnapshot();\nconsole.log('Deterministic:', JSON.stringify(state1) === JSON.stringify(state2));\n```\n\n## Testing\n\nThe engine includes comprehensive tests for determinism, visual regression, and SoA functionality:\n\n```bash\n# Run all tests\nnpm test\n\n# Run specific test suites\nnpm run test:determinism    # Test simulation determinism\nnpm run test:visual         # Visual regression tests\nnpm run test:state-sync     # State synchronization tests\nnpm run test:coverage       # Generate coverage report\n```\n\n## Dependencies\n\n- **gl** - Headless WebGL for Node.js\n- **@kmamal/sdl** - SDL2 bindings for window and input management\n- **pngjs** - PNG image decoding\n\n## Platform Support\n\n| Platform | Status | Notes |\n|----------|--------|-------|\n| Node.js (Linux) | ✅ Full | Headless rendering + SDL window |\n| Node.js (macOS) | ✅ Full | Headless rendering + SDL window |\n| Node.js (Windows) | ✅ Full | Headless rendering + SDL window |\n| Browser | ⚠️ Planned | WebGL rendering planned |\n\n## Documentation\n\n### Source Code Organization\n\n```\nsrc/\n├── core/              # Core graphics and utilities\n│   ├── graphics-device.ts\n│   ├── shader.ts\n│   ├── texture.ts\n│   ├── buffer.ts\n│   ├── object-pool.ts\n│   └── ticker.ts\n├── rendering/         # Rendering systems\n│   ├── batch-renderer.ts\n│   ├── camera.ts\n│   ├── projection.ts\n│   ├── instanced-renderer.ts      # WebGL2 GPU instancing\n│   ├── hybrid-renderer.ts          # Auto-detection (instanced vs batch)\n│   ├── ring-buffer.ts              # Triple-buffered GPU streaming\n│   ├── soa-webgl-renderer.ts      # WebGL2 zero-copy renderer\n│   └── spatial-hash.ts\n├── input/             # Input system (command queue)\n│   ├── command-queue.ts\n│   ├── sdl-input-source.ts\n│   └── network-input-source.ts\n├── simulation/        # Game logic simulation\n│   ├── entity.ts\n│   ├── entity-manager.ts\n│   ├── entity-storage.ts        # SoA storage with typed arrays\n│   ├── entity-handle.ts          # Handle-based entity references\n│   ├── entity-type-registry.ts   # Type string to ID mapping\n│   └── simulation-loop.ts\n├── networking/        # Networking for multiplayer\n│   ├── client-predictor.ts\n│   ├── server-reconciler.ts\n│   ├── state-snapshot.ts\n│   └── binary-serializer.ts\n└── platforms/\n    └── node/          # Node.js-specific implementations\n        ├── node-context.ts\n        ├── node-resource-loader.ts\n        └── sdl-window.ts\n```\n\n### Key Concepts\n\n- **Separation of Concerns**: Rendering, input, simulation, and networking are completely separate systems\n- **Structure of Arrays (SoA)**: Entity storage uses typed arrays for zero-copy GPU transfers and cache efficiency\n- **Deterministic Simulation**: Game logic runs in fixed timestep for consistency across clients\n- **Command Pattern**: All input goes through a command queue for easy recording/replay\n- **Client-Side Prediction**: Reduces perceived lag in networked games\n- **Object Pooling**: Minimizes garbage collection for smooth performance\n\nFor detailed documentation and architecture, see [docs/README.MD](docs/README.MD).\n\n## Troubleshooting\n\n### Native Module Compilation Fails\n\n**Error:** `gyp ERR! stack Error: not found: make`\n\n**Solution:** Install build tools for your platform:\n- **Linux**: `sudo apt-get install build-essential`\n- **macOS**: `xcode-select --install`\n- **Windows**: Install [Visual Studio Build Tools](https://visualstudio.microsoft.com/downloads/#build-tools-for-visual-studio-2022)\n\n### SDL/OpenGL Driver Issues\n\n**Error:** `Error: SDL could not create window`\n\n**Solution:**\n- On Linux headless servers, use a virtual display:\n  ```bash\n  Xvfb :99 -screen 0 1024x768x24 &\n  export DISPLAY=:99\n  ```\n- On Windows, ensure GPU drivers are up to date\n- On macOS, ensure you're not in a restricted sandbox environment\n\n### Texture Loading Fails\n\n**Error:** `Error: Failed to load texture`\n\n**Solution:**\n- Ensure PNG files are in the correct directory relative to `process.cwd()`\n- Verify `@kmamal/sdl` is installed correctly\n- Check file permissions\n\n### Performance Issues\n\n**Symptoms:** Low FPS, frame drops\n\n**Solutions:**\n1. Use `HybridRenderer` for automatic optimization\n2. Reduce entity count or use spatial partitioning\n3. Enable instanced rendering for 1000+ identical sprites\n4. Check for memory leaks in the entity system\n5. Profile with Chrome DevTools (Node.js inspector)\n\nFor more help, please [open an issue](https://github.com/BLooDek/bloody-engine/issues).\n\n## Contributing\n\nContributions are welcome! Please follow these guidelines:\n\n### Development Setup\n\n```bash\n# Clone the repository\ngit clone https://github.com/BLooDek/bloody-engine.git\ncd bloody-engine\n\n# Install dependencies\nnpm install\n\n# Build the library\nnpm run build\n\n# Run tests in watch mode\nnpm run test:watch\n\n# Run linting\nnpm run lint\n```\n\n### Making Changes\n\n1. Create a feature branch: `git checkout -b feature/my-feature`\n2. Make your changes and add tests\n3. Ensure tests pass: `npm test`\n4. Ensure code is linted: `npm run lint`\n5. Commit with clear messages\n6. Push and create a pull request\n\n### Coding Standards\n\n- **TypeScript**: Use strict mode, provide types for all exports\n- **Tests**: Add unit tests for new features\n- **Documentation**: Update README and code comments as needed\n- **Formatting**: Follow existing code style (enforced by ESLint)\n\n### Reporting Issues\n\nWhen reporting bugs, please include:\n- Node.js version\n- Platform (Linux/macOS/Windows)\n- Minimal reproducible example\n- Expected vs actual behavior\n\n## Building\n\n```bash\nnpm run build\n```\n\nThis will generate the distribution files in `dist/node/`.\n\n## License\n\nMIT License - see [LICENSE](LICENSE) for details.\n\n## Repository\n\n[https://github.com/BLooDek/bloody-engine](https://github.com/BLooDek/bloody-engine)\n\n## Issues\n\nReport bugs and request features at: [https://github.com/BLooDek/bloody-engine/issues](https://github.com/BLooDek/bloody-engine/issues)\n","readmeFilename":"README.md"}