{"_id":"punter.js","_rev":"31-31259fc50c41b272ab665b58ea3057ef","name":"punter.js","dist-tags":{"latest":"5.0.0"},"versions":{"1.0.0":{"name":"punter.js","version":"1.0.0","keywords":[],"author":"","license":"ISC","_id":"punter.js@1.0.0","maintainers":[{"name":"john-doherty","email":"contact@johndoherty.info"}],"homepage":"https://github.com/orca-scan/punter.js#readme","bugs":{"url":"https://github.com/orca-scan/punter.js/issues"},"dist":{"shasum":"02204ab95b3c39438cdfebf0a0f1f860699ae0c5","tarball":"https://registry.npmjs.org/punter.js/-/punter.js-1.0.0.tgz","fileCount":21,"integrity":"sha512-GOPgkqjIFECW5KrNTJmT5c/Trp04gee2b4R72MQskXKsAxvoJhkjSSohA+/DtFCjHDTUP6OzNFlzlUYPU/BHhA==","signatures":[{"sig":"MEQCIDhsOvY+/spkww3xOfhWSG5x63Nt6NfK8ZRa4efUjA2pAiAOjsXe4VbqR1WfWhJEi/1qG7TpPlsmx8TVdR6Mi3daoA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":130250},"main":"punter.js","engines":{"node":">=18"},"gitHead":"778c1fcaea39f19edb79ca21803342fc815770ca","scripts":{"test":". \"$NVM_DIR/nvm.sh\" && nvm use && NODE_ENV=test TZ=UTC node_modules/.bin/jasmine --config=tests/jasmine/config.json","start":"npx serve ."},"_npmUser":{"name":"john-doherty","email":"contact@johndoherty.info"},"repository":{"url":"git+https://github.com/orca-scan/punter.js.git","type":"git"},"_npmVersion":"10.9.7","description":"A lightweight, dependency-free JavaScript 2D game engine for the browser. Drop in a script tag and start building.","directories":{"test":"tests"},"_nodeVersion":"22.22.2","_hasShrinkwrap":false,"devDependencies":{"jasmine":"^5.13.0","puppeteer":"^25.3.0","jasmine-xml-reporter":"^1.2.1","jasmine-console-reporter":"^3.1.0"},"_npmOperationalInternal":{"tmp":"tmp/punter.js_1.0.0_1784151314974_0.6067950685234442","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"punter.js","version":"1.0.1","keywords":[],"author":"","license":"ISC","_id":"punter.js@1.0.1","maintainers":[{"name":"john-doherty","email":"contact@johndoherty.info"}],"homepage":"https://github.com/orca-scan/punter.js#readme","bugs":{"url":"https://github.com/orca-scan/punter.js/issues"},"dist":{"shasum":"91952af5bcdb93655a38796738d898e5f2edca66","tarball":"https://registry.npmjs.org/punter.js/-/punter.js-1.0.1.tgz","fileCount":21,"integrity":"sha512-lXavQ15p+xE8M1JGT761jeSyC5UDd8UlJ8cMP6ShwRZMa6wA2F9jUK1a8FJkcJNebdJxSuAp+0dwekW/JCe10A==","signatures":[{"sig":"MEQCIGi6B5yWsBXGsMMPg0bc4g+vgm/Ki/KHnGSkepA7zTgPAiACVrgMWjiEsk4JCv7kzFulni6U1RPlQrTizw3qaDOBFw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":116232},"main":"punter.js","engines":{"node":">=18"},"gitHead":"6fee5abeb6ac291e3b1930a0b1ca06ce61013d05","scripts":{"test":". \"$NVM_DIR/nvm.sh\" && nvm use && NODE_ENV=test TZ=UTC node_modules/.bin/jasmine --config=tests/jasmine/config.json","start":"npx serve ."},"_npmUser":{"name":"john-doherty","email":"contact@johndoherty.info"},"repository":{"url":"git+https://github.com/orca-scan/punter.js.git","type":"git"},"_npmVersion":"10.9.7","description":"A lightweight, dependency-free JavaScript 2D game engine for the browser. Drop in a script tag and start building.","directories":{"test":"tests"},"_nodeVersion":"22.22.2","_hasShrinkwrap":false,"devDependencies":{"jasmine":"^5.13.0","puppeteer":"^25.3.0","jasmine-xml-reporter":"^1.2.1","jasmine-console-reporter":"^3.1.0"},"_npmOperationalInternal":{"tmp":"tmp/punter.js_1.0.1_1784193419572_0.7056164238927884","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"punter.js","version":"1.1.0","keywords":[],"author":"","license":"ISC","_id":"punter.js@1.1.0","maintainers":[{"name":"john-doherty","email":"contact@johndoherty.info"}],"homepage":"https://github.com/orca-scan/punter.js#readme","bugs":{"url":"https://github.com/orca-scan/punter.js/issues"},"dist":{"shasum":"30ca86df4ba9883663905b58331660446f57bcaa","tarball":"https://registry.npmjs.org/punter.js/-/punter.js-1.1.0.tgz","fileCount":21,"integrity":"sha512-sETyDpxGOcut/zTlHzCaAj1d9je8Dw5+EoAP23uj3W7NXbYI/SqyEooog3K8GU2HogrR+57Q/kkLVu+9ipsUSA==","signatures":[{"sig":"MEUCIQDxhQatXqITjv6Kn5wRZN/fOgph8acd+/prm6gsQpmo+gIgXPpwFaZDaanxoQs8kYa51OjYbW/+nrFOjwng6RGICQY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":116388},"main":"punter.js","engines":{"node":">=18"},"gitHead":"5dc113eabebeac59e58db631ad312e839d53df02","scripts":{"test":". \"$NVM_DIR/nvm.sh\" && nvm use && NODE_ENV=test TZ=UTC node_modules/.bin/jasmine --config=tests/jasmine/config.json","start":"npx serve .","start:pong":"npx serve . -l 4000 & npx open-cli http://localhost:4000/games/pong.html"},"_npmUser":{"name":"john-doherty","email":"contact@johndoherty.info"},"repository":{"url":"git+https://github.com/orca-scan/punter.js.git","type":"git"},"_npmVersion":"10.9.7","description":"A simple, dependency-free 2D game engine for the browser. No build step, no frameworks - just one script tag.","directories":{"test":"tests"},"_nodeVersion":"22.22.2","_hasShrinkwrap":false,"devDependencies":{"jasmine":"^5.13.0","puppeteer":"^25.3.0","jasmine-xml-reporter":"^1.2.1","jasmine-console-reporter":"^3.1.0"},"_npmOperationalInternal":{"tmp":"tmp/punter.js_1.1.0_1784201471924_0.8372291946346928","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"punter.js","version":"1.2.0","keywords":[],"author":"","license":"ISC","_id":"punter.js@1.2.0","maintainers":[{"name":"john-doherty","email":"contact@johndoherty.info"}],"homepage":"https://github.com/orca-scan/punter.js#readme","bugs":{"url":"https://github.com/orca-scan/punter.js/issues"},"dist":{"shasum":"8c0fe6d989b9bc8a13afef3fba72908df007704b","tarball":"https://registry.npmjs.org/punter.js/-/punter.js-1.2.0.tgz","fileCount":97,"integrity":"sha512-kMlUpX0TSWHcy6pQihYY0YUtImy/qGGSv/Uqc34JYAn4lqa2GMCwJvqBSHemymkJWQVkOEJ5dIRoQjFXXkOL3A==","signatures":[{"sig":"MEYCIQCh0TfDoNBDvmv8QPNIxBCt319bVbV8MgDW8dNDbuRWtgIhALb+Gg/va5bfvqsu3TLLsPHugrKSuvxtFxGWpDMIbnRi","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3665477},"main":"punter.js","engines":{"node":">=18"},"gitHead":"da6893d6048e6ee4116fd11d69a02a7f0d90756e","scripts":{"test":". \"$NVM_DIR/nvm.sh\" && nvm use && NODE_ENV=test TZ=UTC node_modules/.bin/jasmine --config=tests/jasmine/config.json","start":"npx serve .","start:pong":"npx serve . -l 4000 & npx open-cli http://localhost:4000/games/pong.html"},"_npmUser":{"name":"john-doherty","email":"contact@johndoherty.info"},"repository":{"url":"git+https://github.com/orca-scan/punter.js.git","type":"git"},"_npmVersion":"10.9.7","description":"A simple, dependency-free 2D game engine for the browser. No build step, no frameworks - just one script tag.","directories":{"test":"tests"},"_nodeVersion":"22.22.2","_hasShrinkwrap":false,"devDependencies":{"jasmine":"^5.13.0","puppeteer":"^25.3.0","jasmine-xml-reporter":"^1.2.1","jasmine-console-reporter":"^3.1.0"},"_npmOperationalInternal":{"tmp":"tmp/punter.js_1.2.0_1784245540158_0.5035873590531943","host":"s3://npm-registry-packages-npm-production"}},"1.2.1":{"name":"punter.js","version":"1.2.1","keywords":[],"author":"","license":"ISC","_id":"punter.js@1.2.1","maintainers":[{"name":"john-doherty","email":"contact@johndoherty.info"}],"homepage":"https://github.com/orca-scan/punter.js#readme","bugs":{"url":"https://github.com/orca-scan/punter.js/issues"},"dist":{"shasum":"5957fea4ad9dc86067570597c574c16c4ec74cb7","tarball":"https://registry.npmjs.org/punter.js/-/punter.js-1.2.1.tgz","fileCount":98,"integrity":"sha512-IpL7AJVqB7au8NPh58ABrFwyJhVUWCmb5boXFGAtEp5tIc6xBfOEy/2IYN75EUnijqSMruBVAuQ4IImiqhRfkQ==","signatures":[{"sig":"MEYCIQC987WL80mEA50S9i09Sx1O+O0ZK3iudVM4xFB4lxb/QAIhAJ1btCrc+k9kr8JsuPamjJZR2DfeSCcGtydEZpe0J07P","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3666207},"main":"punter.js","engines":{"node":">=18"},"gitHead":"1eb55bc6e08456f3d24357d9bc3b326b591bb98c","scripts":{"test":"NODE_ENV=test TZ=UTC jasmine --config=tests/jasmine/config.json","start":"npx serve .","start:pong":"npx serve . -l 4000 & npx open-cli http://localhost:4000/games/pong.html"},"_npmUser":{"name":"john-doherty","email":"contact@johndoherty.info"},"repository":{"url":"git+https://github.com/orca-scan/punter.js.git","type":"git"},"_npmVersion":"10.9.7","description":"A simple, dependency-free 2D game engine for the browser. No build step, no frameworks - just one script tag.","directories":{"test":"tests"},"_nodeVersion":"22.22.2","_hasShrinkwrap":false,"devDependencies":{"jasmine":"^5.13.0","puppeteer":"^25.3.0","jasmine-xml-reporter":"^1.2.1","jasmine-console-reporter":"^3.1.0"},"_npmOperationalInternal":{"tmp":"tmp/punter.js_1.2.1_1784246096560_0.7873186015390599","host":"s3://npm-registry-packages-npm-production"}},"1.2.2":{"name":"punter.js","version":"1.2.2","keywords":[],"author":"","license":"ISC","_id":"punter.js@1.2.2","maintainers":[{"name":"john-doherty","email":"contact@johndoherty.info"}],"homepage":"https://github.com/orca-scan/punter.js#readme","bugs":{"url":"https://github.com/orca-scan/punter.js/issues"},"dist":{"shasum":"1815b82dd61b19f9c4e9d111dc7997eaa7c26ebc","tarball":"https://registry.npmjs.org/punter.js/-/punter.js-1.2.2.tgz","fileCount":98,"integrity":"sha512-BwqC9nSNEPUlaBaUEzOvy6+j0mx0JQCtr5zCBz/eecDdLC587VZuu+LtQnDvRcIPfUig0pBsh8Uk9laiiAvCGg==","signatures":[{"sig":"MEYCIQCjP1fbW+hSkf5NfboOf/mYlOXqQrDq2RZ4H2CLmIwEPAIhAJOxs9X5AvO4NQbRQJcmr77HXupYVGtdgwuFpjO+vJqq","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3666207},"main":"punter.js","engines":{"node":">=18"},"gitHead":"54a838b4ac9f22348d61560c034488595b18d720","scripts":{"test":"NODE_ENV=test TZ=UTC jasmine --config=tests/jasmine/config.json","start":"npx serve .","start:pong":"npx serve . -l 4000 & npx open-cli http://localhost:4000/games/pong.html"},"_npmUser":{"name":"john-doherty","email":"contact@johndoherty.info"},"repository":{"url":"git+https://github.com/orca-scan/punter.js.git","type":"git"},"_npmVersion":"10.7.0","description":"A simple, dependency-free 2D game engine for the browser. No build step, no frameworks - just one script tag.","directories":{"test":"tests"},"_nodeVersion":"18.20.4","_hasShrinkwrap":false,"devDependencies":{"jasmine":"^5.13.0","puppeteer":"^25.3.0","jasmine-xml-reporter":"^1.2.1","jasmine-console-reporter":"^3.1.0"},"_npmOperationalInternal":{"tmp":"tmp/punter.js_1.2.2_1784246246415_0.7850826054446378","host":"s3://npm-registry-packages-npm-production"}},"1.2.3":{"name":"punter.js","version":"1.2.3","keywords":[],"author":"","license":"ISC","_id":"punter.js@1.2.3","maintainers":[{"name":"john-doherty","email":"contact@johndoherty.info"}],"homepage":"https://github.com/orca-scan/punter.js#readme","bugs":{"url":"https://github.com/orca-scan/punter.js/issues"},"dist":{"shasum":"9294cc1ca240a841023f9e80682c9b8e2fd81cae","tarball":"https://registry.npmjs.org/punter.js/-/punter.js-1.2.3.tgz","fileCount":117,"integrity":"sha512-FPkEyOn233PhnCa/tT7ipSOz3ZmiOCwIZaS4AL+nG3O7ObxsXxdk0Uc0sKABQx01+Us8QBsZQB3AUww9u/q0/Q==","signatures":[{"sig":"MEYCIQC1O4bUrGOBL+RT8wtCNwH0mwAka28y3f3QHUwkemfM2wIhAJyB4LJalFvDTbJl1RWOo8eEsDUcXggHLzBUAQyCDdZK","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3799321},"main":"src/punter.js","engines":{"node":">=18"},"gitHead":"389a0fa86d681e0dbcc06ca17d2fa0bc0092b1d0","scripts":{"lint":"eslint src/ tests/","test":"NODE_ENV=test TZ=UTC jasmine --config=tests/jasmine/config.json","start":"npx serve .","start:pong":"npx serve . -l 4000 & npx open-cli http://localhost:4000/games/pong.html"},"_npmUser":{"name":"john-doherty","email":"contact@johndoherty.info"},"repository":{"url":"git+https://github.com/orca-scan/punter.js.git","type":"git"},"_npmVersion":"10.7.0","description":"A simple, dependency-free 2D game engine for the browser. No build step, no frameworks - just one script tag.","directories":{"test":"tests"},"_nodeVersion":"18.20.4","_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.57.0","jasmine":"^5.13.0","puppeteer":"^25.3.0","jasmine-xml-reporter":"^1.2.1","jasmine-console-reporter":"^3.1.0"},"_npmOperationalInternal":{"tmp":"tmp/punter.js_1.2.3_1784421270009_0.4024248181538477","host":"s3://npm-registry-packages-npm-production"}},"1.2.4":{"name":"punter.js","version":"1.2.4","keywords":["game-engine","2d-game-engine","canvas","html5-canvas","javascript-game-engine","browser-game","sprite","game-loop","no-dependencies","lightweight","vanilla-javascript"],"author":{"url":"https://orcascan.com","name":"Orca Scan","email":"support@orcascan.com"},"license":"MIT","_id":"punter.js@1.2.4","maintainers":[{"name":"john-doherty","email":"contact@johndoherty.info"}],"homepage":"https://github.com/orca-scan/punter.js#readme","bugs":{"url":"https://github.com/orca-scan/punter.js/issues"},"dist":{"shasum":"3c08801562d74d2bd8c1fd9734f506d46b50ff2a","tarball":"https://registry.npmjs.org/punter.js/-/punter.js-1.2.4.tgz","fileCount":117,"integrity":"sha512-RKE4JkcHbbZ589qqjXbie3c1QeoeatOlnu1wbHUY6QEXFqqspxAcIwCfC5iGZTvPeSrgvor8yhBoXaQYpgKstw==","signatures":[{"sig":"MEUCIQDXGBCeC7Bg/0G3wi7HpkFAHco8CqdkfprnEyUC5SPssAIgYkE/yp8eV0wFE941YkFpgZQTjUB2l9FR+p2+5VaK6ko=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3807715},"main":"src/punter.js","engines":{"node":">=18"},"gitHead":"eca011ffa9b63d034b8ff1fd395e6a6b25ab4b17","scripts":{"lint":"eslint src/ tests/","test":"NODE_ENV=test TZ=UTC jasmine --config=tests/jasmine/config.json","start":"npx serve .","start:pong":"npx serve . -l 4000 & npx open-cli http://localhost:4000/games/pong.html"},"_npmUser":{"name":"john-doherty","email":"contact@johndoherty.info"},"repository":{"url":"git+https://github.com/orca-scan/punter.js.git","type":"git"},"_npmVersion":"10.7.0","description":"A simple, dependency-free 2D game engine for the browser. No build step, no frameworks - just one script tag.","directories":{"test":"tests"},"_nodeVersion":"18.20.4","_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.57.0","jasmine":"^5.13.0","puppeteer":"^25.3.0","jasmine-xml-reporter":"^1.2.1","jasmine-console-reporter":"^3.1.0"},"_npmOperationalInternal":{"tmp":"tmp/punter.js_1.2.4_1784590010739_0.493184573001727","host":"s3://npm-registry-packages-npm-production"}},"1.2.5":{"name":"punter.js","version":"1.2.5","keywords":["game-engine","2d-game-engine","canvas","html5-canvas","javascript-game-engine","browser-game","sprite","game-loop","no-dependencies","lightweight","vanilla-javascript"],"author":{"url":"https://orcascan.com","name":"Orca Scan","email":"support@orcascan.com"},"license":"MIT","_id":"punter.js@1.2.5","maintainers":[{"name":"john-doherty","email":"contact@johndoherty.info"}],"homepage":"https://github.com/orca-scan/punter.js#readme","bugs":{"url":"https://github.com/orca-scan/punter.js/issues"},"dist":{"shasum":"0684f6b782db7febbb0e8355cf05fa661f5787cd","tarball":"https://registry.npmjs.org/punter.js/-/punter.js-1.2.5.tgz","fileCount":117,"integrity":"sha512-UMRcsq7f7lLQgxawAjc2nVQruV3gGAUkWjW559wnzgXC3ReR94azei4e9tz/SukboBnKLoCno4ZgBgjIavvBrQ==","signatures":[{"sig":"MEYCIQCe14YUByOgICVEi+YRuOjOTVhV5Z3A2p4Q/ASPgkzT2wIhALRTmLnF7Czms1Zla66QbAPBJSCvMk2kGbWfQquKKCSW","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3807875},"main":"src/punter.js","engines":{"node":">=18"},"gitHead":"78482644cdb7fcabd927345c13ee4df71b950896","scripts":{"lint":"eslint src/ tests/","test":"NODE_ENV=test TZ=UTC jasmine --config=tests/jasmine/config.json","start":"npx serve .","start:pong":"npx serve . -l 4000 & npx open-cli http://localhost:4000/games/pong.html"},"_npmUser":{"name":"john-doherty","email":"contact@johndoherty.info"},"repository":{"url":"git+https://github.com/orca-scan/punter.js.git","type":"git"},"_npmVersion":"10.7.0","description":"A simple, dependency-free 2D game engine designed to help new developers learn JavaScript by building browser games","directories":{"test":"tests"},"_nodeVersion":"18.20.4","_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.57.0","jasmine":"^5.13.0","puppeteer":"^25.3.0","jasmine-xml-reporter":"^1.2.1","jasmine-console-reporter":"^3.1.0"},"_npmOperationalInternal":{"tmp":"tmp/punter.js_1.2.5_1784666924753_0.9005860003818797","host":"s3://npm-registry-packages-npm-production"}},"1.2.6":{"name":"punter.js","version":"1.2.6","keywords":["game-engine","2d-game-engine","canvas","html5-canvas","javascript-game-engine","browser-game","sprite","game-loop","no-dependencies","lightweight","vanilla-javascript"],"author":{"url":"https://orcascan.com","name":"Orca Scan","email":"support@orcascan.com"},"license":"MIT","_id":"punter.js@1.2.6","maintainers":[{"name":"john-doherty","email":"contact@johndoherty.info"}],"homepage":"https://github.com/orca-scan/punter.js#readme","bugs":{"url":"https://github.com/orca-scan/punter.js/issues"},"dist":{"shasum":"4c834c815a00dad18b28a5a9aa24f7947901daf0","tarball":"https://registry.npmjs.org/punter.js/-/punter.js-1.2.6.tgz","fileCount":117,"integrity":"sha512-5KAqI8RqF9Y6z4elEF8DEbS+NUrWpGcPthfupIVwQEPH2TismUC7pX1xyJMsd/92IyxyCGw6CxrIn9f2eDjWxA==","signatures":[{"sig":"MEYCIQCQAaZZBx5CzjAa5tISY/JOY6jsu/qUicQDWNZC18j0NwIhAI9vfGfJj3kFVIJME3JKrksLzmnjjb/dSi5h0BseSPCU","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3807435},"main":"src/punter.js","engines":{"node":">=18"},"gitHead":"5686062e19622e3f73a3bf62c9b751f08dfb894c","scripts":{"lint":"eslint src/ tests/","test":"NODE_ENV=test TZ=UTC jasmine --config=tests/jasmine/config.json","start":"npx serve .","start:pong":"npx serve . -l 4000 & npx open-cli http://localhost:4000/games/pong.html"},"_npmUser":{"name":"john-doherty","email":"contact@johndoherty.info"},"repository":{"url":"git+https://github.com/orca-scan/punter.js.git","type":"git"},"_npmVersion":"10.7.0","description":"A simple 2D game engine for the web","directories":{"test":"tests"},"_nodeVersion":"18.20.4","_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.57.0","jasmine":"^5.13.0","puppeteer":"^25.3.0","jasmine-xml-reporter":"^1.2.1","jasmine-console-reporter":"^3.1.0"},"_npmOperationalInternal":{"tmp":"tmp/punter.js_1.2.6_1784667598855_0.19075991275023996","host":"s3://npm-registry-packages-npm-production"}},"1.2.7":{"name":"punter.js","version":"1.2.7","keywords":["game-engine","2d-game-engine","canvas","html5-canvas","javascript-game-engine","browser-game","sprite","game-loop","no-dependencies","lightweight","vanilla-javascript"],"author":{"url":"https://orcascan.com","name":"Orca Scan","email":"support@orcascan.com"},"license":"MIT","_id":"punter.js@1.2.7","maintainers":[{"name":"john-doherty","email":"contact@johndoherty.info"}],"homepage":"https://github.com/orca-scan/punter.js#readme","bugs":{"url":"https://github.com/orca-scan/punter.js/issues"},"dist":{"shasum":"121ce6a970cf6ae1200452331d733aaaf7a9c655","tarball":"https://registry.npmjs.org/punter.js/-/punter.js-1.2.7.tgz","fileCount":117,"integrity":"sha512-QIA7Z0zHkmeB90etc4Wf5CPg1dT6Dlp2LvUhI+CdLWoZbhtqirDkWZIZE3f3zeGWftFnRLNQAlSEp8jCVz1o2A==","signatures":[{"sig":"MEYCIQDEylTidWXhbwIL7oeUCgfvw/Ze3464ZDJmpA87ILoahQIhALJGUf+Yy1wOUCXb0oBLin38/Ggyi59smGxjNamzm04g","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3807535},"main":"src/punter.js","engines":{"node":">=18"},"gitHead":"a6fd98f4343d5e2a5f1e44f693eefe54a1b93a91","scripts":{"lint":"eslint src/ tests/","test":"NODE_ENV=test TZ=UTC jasmine --config=tests/jasmine/config.json","start":"http-server . -p 4000 -o"},"_npmUser":{"name":"john-doherty","email":"contact@johndoherty.info"},"repository":{"url":"git+https://github.com/orca-scan/punter.js.git","type":"git"},"_npmVersion":"10.7.0","description":"A simple 2D game engine for the web","directories":{"test":"tests"},"_nodeVersion":"18.20.4","_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.57.0","jasmine":"^5.13.0","puppeteer":"^25.3.0","http-server":"^14.1.1","jasmine-xml-reporter":"^1.2.1","jasmine-console-reporter":"^3.1.0"},"_npmOperationalInternal":{"tmp":"tmp/punter.js_1.2.7_1784668714255_0.9062780322589381","host":"s3://npm-registry-packages-npm-production"}},"1.2.8":{"name":"punter.js","version":"1.2.8","keywords":["game-engine","2d-game-engine","canvas","html5-canvas","javascript-game-engine","browser-game","sprite","game-loop","no-dependencies","lightweight","vanilla-javascript"],"author":{"url":"https://orcascan.com","name":"Orca Scan","email":"support@orcascan.com"},"license":"MIT","_id":"punter.js@1.2.8","maintainers":[{"name":"john-doherty","email":"contact@johndoherty.info"}],"homepage":"https://github.com/orca-scan/punter.js#readme","bugs":{"url":"https://github.com/orca-scan/punter.js/issues"},"dist":{"shasum":"dd448f7695298abcec0375abe22b94d771de67b7","tarball":"https://registry.npmjs.org/punter.js/-/punter.js-1.2.8.tgz","fileCount":117,"integrity":"sha512-R7OztvBYDiMk7RCOQ31lRr6wnc5ODt9or6KJQg7d+GTes0upZVwAPllwYowRqdfuwJSlMTGRJBi9+GWh3Q6ufQ==","signatures":[{"sig":"MEUCIQCRb8U/sztmnlDuxACGAZf9fyeB7tydQ72iuMWk4ejEygIgfTI12r8M5t2qh1UtT7ufOteclBaLSIxPJD8BJaKmlzA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3807528},"main":"src/punter.js","engines":{"node":">=18"},"gitHead":"8b6af11cb27216e4f1d3d0196f2832d3ce46ad11","scripts":{"lint":"eslint src/ tests/","test":"NODE_ENV=test TZ=UTC jasmine --config=tests/jasmine/config.json","start":"http-server . -p 4000 -o"},"_npmUser":{"name":"john-doherty","email":"contact@johndoherty.info"},"repository":{"url":"git+https://github.com/orca-scan/punter.js.git","type":"git"},"_npmVersion":"10.7.0","description":"A simple 2D game engine for the web","directories":{"test":"tests"},"_nodeVersion":"18.20.4","_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.57.0","jasmine":"^5.13.0","puppeteer":"^25.3.0","http-server":"^14.1.1","jasmine-xml-reporter":"^1.2.1","jasmine-console-reporter":"^3.1.0"},"_npmOperationalInternal":{"tmp":"tmp/punter.js_1.2.8_1784668860904_0.31456526942441787","host":"s3://npm-registry-packages-npm-production"}},"1.2.9":{"name":"punter.js","version":"1.2.9","keywords":["game-engine","2d-game-engine","canvas","html5-canvas","javascript-game-engine","browser-game","sprite","game-loop","no-dependencies","lightweight","vanilla-javascript"],"author":{"url":"https://orcascan.com","name":"Orca Scan","email":"support@orcascan.com"},"license":"MIT","_id":"punter.js@1.2.9","maintainers":[{"name":"john-doherty","email":"contact@johndoherty.info"}],"homepage":"https://github.com/orca-scan/punter.js#readme","bugs":{"url":"https://github.com/orca-scan/punter.js/issues"},"dist":{"shasum":"ccd738c0b3ff78fcbc6adcc960be9047217ca4a2","tarball":"https://registry.npmjs.org/punter.js/-/punter.js-1.2.9.tgz","fileCount":121,"integrity":"sha512-SbSOwSzGkhWjwA5uW5bbIygiJIq0LPkB4VpDW78GxlAM+JWUbjk8ucslJgXBW/7+mCxuf+ZqWqms3TZIDQaEOQ==","signatures":[{"sig":"MEQCIGqaUjHKZ5e1H1xGRlrNJjZTL5OsdR3cuq0UTS30hW7LAiAf0eUj8BIxBZlX4jK4ca3DpZ0h7HuHPuCsEM9S1yxJjA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3812901},"main":"src/punter.js","engines":{"node":">=18"},"gitHead":"fd50f24ae65a894584115b93b4495a97af5157eb","scripts":{"lint":"eslint src/ tests/","test":"NODE_ENV=test TZ=UTC jasmine --config=tests/jasmine/config.json","start":"http-server . -p 4000 -o"},"_npmUser":{"name":"john-doherty","email":"contact@johndoherty.info"},"repository":{"url":"git+https://github.com/orca-scan/punter.js.git","type":"git"},"_npmVersion":"10.7.0","description":"A simple 2D game engine for the web","directories":{"test":"tests"},"_nodeVersion":"18.20.4","_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.57.0","jasmine":"^5.13.0","puppeteer":"^25.3.0","http-server":"^14.1.1","jasmine-xml-reporter":"^1.2.1","jasmine-console-reporter":"^3.1.0"},"_npmOperationalInternal":{"tmp":"tmp/punter.js_1.2.9_1784748219854_0.12040071109703798","host":"s3://npm-registry-packages-npm-production"}},"1.3.0":{"name":"punter.js","version":"1.3.0","keywords":["game-engine","2d-game-engine","canvas","html5-canvas","javascript-game-engine","browser-game","sprite","game-loop","no-dependencies","lightweight","vanilla-javascript"],"author":{"url":"https://orcascan.com","name":"Orca Scan","email":"support@orcascan.com"},"license":"MIT","_id":"punter.js@1.3.0","maintainers":[{"name":"john-doherty","email":"contact@johndoherty.info"}],"homepage":"https://github.com/orca-scan/punter.js#readme","bugs":{"url":"https://github.com/orca-scan/punter.js/issues"},"dist":{"shasum":"f22d29061f9b07e3279771e25f2016fa2cc6ec03","tarball":"https://registry.npmjs.org/punter.js/-/punter.js-1.3.0.tgz","fileCount":122,"integrity":"sha512-gWOdr291qDaHh2lkDy5FMR/brDr21GhFOzW3DY+O/uPD1jBGB6uJo4We0Y2hl8yns5HNt0LPSJAaqEGlkFaT3Q==","signatures":[{"sig":"MEUCIQCsuR4nyYt9t3rkPGot0Krgnvn2uN/I+qW4pfyviDv3MQIgekMQ6X2/7LJ4/U2fIMCbOvxpqkK4+nDWzUmXKB+JcAU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3789574},"main":"src/punter.js","engines":{"node":">=18"},"gitHead":"92cceee85762092d45ec76f55851239d8bc6d8c6","scripts":{"lint":"eslint src/ tests/","test":"NODE_ENV=test TZ=UTC jasmine --config=tests/jasmine/config.json","start":"http-server . -p 4000 -o"},"_npmUser":{"name":"john-doherty","email":"contact@johndoherty.info"},"repository":{"url":"git+https://github.com/orca-scan/punter.js.git","type":"git"},"_npmVersion":"10.7.0","description":"A simple 2D game engine for the web","directories":{"test":"tests"},"_nodeVersion":"18.20.4","_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.57.0","jasmine":"^5.13.0","puppeteer":"^25.3.0","http-server":"^14.1.1","jasmine-xml-reporter":"^1.2.1","jasmine-console-reporter":"^3.1.0"},"_npmOperationalInternal":{"tmp":"tmp/punter.js_1.3.0_1784755969501_0.28843526459504387","host":"s3://npm-registry-packages-npm-production"}},"1.3.1":{"name":"punter.js","version":"1.3.1","keywords":["game-engine","2d-game-engine","canvas","html5-canvas","javascript-game-engine","browser-game","sprite","game-loop","no-dependencies","lightweight","vanilla-javascript"],"author":{"url":"https://orcascan.com","name":"Orca Scan","email":"support@orcascan.com"},"license":"MIT","_id":"punter.js@1.3.1","maintainers":[{"name":"john-doherty","email":"contact@johndoherty.info"}],"homepage":"https://github.com/orca-scan/punter.js#readme","bugs":{"url":"https://github.com/orca-scan/punter.js/issues"},"dist":{"shasum":"cb3ba6532c920f14bef7f8d823514fa2ab077433","tarball":"https://registry.npmjs.org/punter.js/-/punter.js-1.3.1.tgz","fileCount":122,"integrity":"sha512-5NPDb48JL+2CWhD/AnqY/73MI8GuKv56Ms6giSis5DHJblU3ltcMZA3bqwAQDFJ3qSvJQ6RZNFbgffyOabpChA==","signatures":[{"sig":"MEYCIQCy51qjR5AIGFc/2+Lsq8elYgQ9WON0ArGlpTKlrY6TCwIhAP7whpebleTnE60Un1MuXZ682CsLnKyH17Mn4grPluWf","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3790413},"main":"src/punter.js","engines":{"node":">=18"},"gitHead":"e82b3cdaebc9579d4f239cbdeb3a780e57578953","scripts":{"lint":"eslint src/ tests/","test":"NODE_ENV=test TZ=UTC jasmine --config=tests/jasmine/config.json","start":"http-server . -p 4000 -o"},"_npmUser":{"name":"john-doherty","email":"contact@johndoherty.info"},"repository":{"url":"git+https://github.com/orca-scan/punter.js.git","type":"git"},"_npmVersion":"10.7.0","description":"A simple 2D game engine for the web","directories":{"test":"tests"},"_nodeVersion":"18.20.4","_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.57.0","jasmine":"^5.13.0","puppeteer":"^25.3.0","http-server":"^14.1.1","jasmine-xml-reporter":"^1.2.1","jasmine-console-reporter":"^3.1.0"},"_npmOperationalInternal":{"tmp":"tmp/punter.js_1.3.1_1784756773889_0.13733854608573837","host":"s3://npm-registry-packages-npm-production"}},"2.0.1":{"name":"punter.js","version":"2.0.1","keywords":["game-engine","2d-game-engine","canvas","html5-canvas","javascript-game-engine","browser-game","sprite","game-loop","no-dependencies","lightweight","vanilla-javascript"],"author":{"url":"https://orcascan.com","name":"Orca Scan","email":"support@orcascan.com"},"license":"MIT","_id":"punter.js@2.0.1","maintainers":[{"name":"john-doherty","email":"contact@johndoherty.info"}],"homepage":"https://github.com/orca-scan/punter.js#readme","bugs":{"url":"https://github.com/orca-scan/punter.js/issues"},"dist":{"shasum":"2b519229242f91b33d38776c37f5a606a48bebde","tarball":"https://registry.npmjs.org/punter.js/-/punter.js-2.0.1.tgz","fileCount":126,"integrity":"sha512-ISz3rBUTiXpWw+fYjnEb2TWF18rQIEedX7ygxsRaJZshcwUiVex3gRUmNWuXnDv5uZCFdUIcVN6qA72xTOUT8Q==","signatures":[{"sig":"MEUCIQCHQbi8XttAs6h+Sw/buahY8isQ8d2QN3HarycFAy+R0QIgfycluTfvC6ztka2ihUVczPKJuVAu6gvYk1lEVwj11yw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3824738},"main":"src/punter.js","engines":{"node":">=18"},"gitHead":"fdc61c8e747d146424e10368be5b2a32acba6ba3","scripts":{"lint":"eslint src/ tests/","test":"NODE_ENV=test TZ=UTC jasmine --config=tests/jasmine/config.json","start":"http-server . -p 4000 -o"},"_npmUser":{"name":"john-doherty","email":"contact@johndoherty.info"},"repository":{"url":"git+https://github.com/orca-scan/punter.js.git","type":"git"},"_npmVersion":"10.7.0","description":"A simple 2D JavaScript game engine built for learning","directories":{"test":"tests"},"_nodeVersion":"18.20.4","_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.57.0","jasmine":"^5.13.0","puppeteer":"^25.3.0","http-server":"^14.1.1","jasmine-xml-reporter":"^1.2.1","jasmine-console-reporter":"^3.1.0"},"_npmOperationalInternal":{"tmp":"tmp/punter.js_2.0.1_1785074341392_0.17207621863779998","host":"s3://npm-registry-packages-npm-production"}},"3.0.0":{"name":"punter.js","version":"3.0.0","keywords":["game-engine","2d-game-engine","canvas","html5-canvas","javascript-game-engine","browser-game","sprite","game-loop","no-dependencies","lightweight","vanilla-javascript"],"author":{"url":"https://orcascan.com","name":"Orca Scan","email":"support@orcascan.com"},"license":"MIT","_id":"punter.js@3.0.0","maintainers":[{"name":"john-doherty","email":"contact@johndoherty.info"}],"homepage":"https://github.com/orca-scan/punter.js#readme","bugs":{"url":"https://github.com/orca-scan/punter.js/issues"},"dist":{"shasum":"3b972b2017b8999dd86a14e97a4943ae1a3364a7","tarball":"https://registry.npmjs.org/punter.js/-/punter.js-3.0.0.tgz","fileCount":126,"integrity":"sha512-NAFEgY8YFtYzkkQhcZHaXe0CJIIQmS8GyyMyWtGZbGet92zzFVv95qn8dRX5Vmk6NzT++QKOyu70Fc4dRi8hmQ==","signatures":[{"sig":"MEUCIQCdiiKTbOGgVOQ5F+6TqGgEqrj9kvDyItvM3BVyNpLTuwIgb2BKfNMBisPbYXiacbZc9jrRrNT3yyKicbmQQHr+grI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3821684},"main":"src/punter.js","engines":{"node":">=18"},"gitHead":"038e2abd2c3ae2301126bde1fee0e8439bc17276","scripts":{"lint":"eslint src/ tests/","test":"NODE_ENV=test TZ=UTC jasmine --config=tests/jasmine/config.json","start":"http-server . -p 4000 -o"},"_npmUser":{"name":"john-doherty","email":"contact@johndoherty.info"},"repository":{"url":"git+https://github.com/orca-scan/punter.js.git","type":"git"},"_npmVersion":"10.7.0","description":"A simple 2D JavaScript game engine built for learning","directories":{"test":"tests"},"_nodeVersion":"18.20.4","_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.57.0","jasmine":"^5.13.0","puppeteer":"^25.3.0","http-server":"^14.1.1","jasmine-xml-reporter":"^1.2.1","jasmine-console-reporter":"^3.1.0"},"_npmOperationalInternal":{"tmp":"tmp/punter.js_3.0.0_1785083297118_0.29616495419740296","host":"s3://npm-registry-packages-npm-production"}},"3.1.0":{"name":"punter.js","version":"3.1.0","keywords":["game-engine","2d-game-engine","canvas","html5-canvas","javascript-game-engine","browser-game","sprite","game-loop","no-dependencies","lightweight","vanilla-javascript"],"author":{"url":"https://orcascan.com","name":"Orca Scan","email":"support@orcascan.com"},"license":"MIT","_id":"punter.js@3.1.0","maintainers":[{"name":"john-doherty","email":"contact@johndoherty.info"}],"homepage":"https://github.com/orca-scan/punter.js#readme","bugs":{"url":"https://github.com/orca-scan/punter.js/issues"},"dist":{"shasum":"6061f95eb4d2d862ae6295f74a46c6fe1ce59aea","tarball":"https://registry.npmjs.org/punter.js/-/punter.js-3.1.0.tgz","fileCount":126,"integrity":"sha512-QK67jsthVx41znjdLyjjs7o9D/3LJX6NEk4Q98AvUQeE6DuiDUcnZ4bojU2gTNu4BhSkXX3ubst3uORQGcwjLQ==","signatures":[{"sig":"MEYCIQCF0fYEtdLHGZUZoKuZHpQnokcllwUSatD0pOWW0JFXsAIhAIm2lfsLiqPr/juBS4UslswDqYrH4hfJEtaby6JgIDEF","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3839717},"main":"src/punter.js","engines":{"node":">=18"},"gitHead":"4f9c8e08dd1dbabfbdda58615ed9a88977896101","scripts":{"lint":"eslint src/ tests/","test":"NODE_ENV=test TZ=UTC jasmine --config=tests/jasmine/config.json","start":"http-server . -p 4000 -o"},"_npmUser":{"name":"john-doherty","email":"contact@johndoherty.info"},"repository":{"url":"git+https://github.com/orca-scan/punter.js.git","type":"git"},"_npmVersion":"10.7.0","description":"A simple 2D JavaScript game engine built for learning","directories":{"test":"tests"},"_nodeVersion":"18.20.4","_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.57.0","jasmine":"^5.13.0","puppeteer":"^25.3.0","http-server":"^14.1.1","jasmine-xml-reporter":"^1.2.1","jasmine-console-reporter":"^3.1.0"},"_npmOperationalInternal":{"tmp":"tmp/punter.js_3.1.0_1785361669017_0.7351964233062427","host":"s3://npm-registry-packages-npm-production"}},"3.1.1":{"name":"punter.js","version":"3.1.1","keywords":["game-engine","2d-game-engine","canvas","html5-canvas","javascript-game-engine","browser-game","sprite","game-loop","no-dependencies","lightweight","vanilla-javascript"],"author":{"url":"https://orcascan.com","name":"Orca Scan","email":"support@orcascan.com"},"license":"MIT","_id":"punter.js@3.1.1","maintainers":[{"name":"john-doherty","email":"contact@johndoherty.info"}],"homepage":"https://github.com/orca-scan/punter.js#readme","bugs":{"url":"https://github.com/orca-scan/punter.js/issues"},"dist":{"shasum":"d54e0a2367172738b66a2a853199d5c0ec3f95f2","tarball":"https://registry.npmjs.org/punter.js/-/punter.js-3.1.1.tgz","fileCount":126,"integrity":"sha512-k+RvzRd6zQh4/U8tep6743OYFResXiwtc1ERGI+CfUmUYKhjkVU4XA6xed++DRBYywIiUI9zY2Ah2Eut14YaAQ==","signatures":[{"sig":"MEUCICjouFr6I4AFZ3inVsn8VsDQ5Hn/VYM2HnK/72VE5WVbAiEAqua61GbAMy5i0GNET62NBUfG5PSH2lQxLEEIo43JhUo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3839515},"main":"src/punter.js","engines":{"node":">=18"},"gitHead":"43a79b0b4a34df752de2cbef7cae9a9065cef9fa","scripts":{"lint":"eslint src/ tests/","test":"NODE_ENV=test TZ=UTC jasmine --config=tests/jasmine/config.json","start":"http-server . -p 4000 -o"},"_npmUser":{"name":"john-doherty","email":"contact@johndoherty.info"},"repository":{"url":"git+https://github.com/orca-scan/punter.js.git","type":"git"},"_npmVersion":"10.7.0","description":"A teaching-focused JavaScript game engine for the browser","directories":{"test":"tests"},"_nodeVersion":"18.20.4","_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.57.0","jasmine":"^5.13.0","puppeteer":"^25.3.0","http-server":"^14.1.1","jasmine-xml-reporter":"^1.2.1","jasmine-console-reporter":"^3.1.0"},"_npmOperationalInternal":{"tmp":"tmp/punter.js_3.1.1_1785363215005_0.35942628168522517","host":"s3://npm-registry-packages-npm-production"}},"3.2.0":{"name":"punter.js","version":"3.2.0","keywords":["game-engine","2d-game-engine","canvas","html5-canvas","javascript-game-engine","browser-game","sprite","game-loop","no-dependencies","lightweight","vanilla-javascript"],"author":{"url":"https://orcascan.com","name":"Orca Scan","email":"support@orcascan.com"},"license":"MIT","_id":"punter.js@3.2.0","maintainers":[{"name":"john-doherty","email":"contact@johndoherty.info"}],"homepage":"https://github.com/orca-scan/punter.js#readme","bugs":{"url":"https://github.com/orca-scan/punter.js/issues"},"dist":{"shasum":"d63f0257a5697f2e09d451b765ed59d30cec95e6","tarball":"https://registry.npmjs.org/punter.js/-/punter.js-3.2.0.tgz","fileCount":134,"integrity":"sha512-ToluKYEwZCCQt6bIn0yNh2iJhDjHboXHvXjsdQPUTxeofF5h21RqrpUR97etaVYu9BXWs3w99dOwmCu/QGBcCw==","signatures":[{"sig":"MEUCIQDp+SY8xnl1MEE7eaz/7XrcK8URyKf8JRjRr+BJlnLE5QIgIDayN7bSKkrCPhrkCtfpJ9OPc6tKrGeCcrkZAjnyMbA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3913363},"main":"src/punter.js","engines":{"node":">=18"},"gitHead":"1b81a35e15ce3117c6bc296d7db3446c5170b0ee","scripts":{"lint":"eslint src/ tests/","test":"NODE_ENV=test TZ=UTC jasmine --config=tests/jasmine/config.json","start":"http-server . -p 4000 -o"},"_npmUser":{"name":"john-doherty","email":"contact@johndoherty.info"},"repository":{"url":"git+https://github.com/orca-scan/punter.js.git","type":"git"},"_npmVersion":"10.7.0","description":"A teaching-focused JavaScript game engine for the browser","directories":{"test":"tests"},"_nodeVersion":"18.20.4","_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.57.0","jasmine":"^5.13.0","puppeteer":"^25.3.0","playwright":"^1.62.0","http-server":"^14.1.1","jasmine-xml-reporter":"^1.2.1","jasmine-console-reporter":"^3.1.0"},"_npmOperationalInternal":{"tmp":"tmp/punter.js_3.2.0_1785454353238_0.0633807848036474","host":"s3://npm-registry-packages-npm-production"}},"3.3.0":{"name":"punter.js","version":"3.3.0","keywords":["game-engine","2d-game-engine","canvas","html5-canvas","javascript-game-engine","browser-game","sprite","game-loop","no-dependencies","lightweight","vanilla-javascript"],"author":{"url":"https://orcascan.com","name":"Orca Scan","email":"support@orcascan.com"},"license":"MIT","_id":"punter.js@3.3.0","maintainers":[{"name":"john-doherty","email":"contact@johndoherty.info"}],"homepage":"https://github.com/orca-scan/punter.js#readme","bugs":{"url":"https://github.com/orca-scan/punter.js/issues"},"dist":{"shasum":"9eb19fe77d018a51f12bc2a70c60f7c051227567","tarball":"https://registry.npmjs.org/punter.js/-/punter.js-3.3.0.tgz","fileCount":134,"integrity":"sha512-ZW5sIL3jwtSnqUw6Ci1UPicrwpEj6H2nzl4xgbYsk75Y8DSLdxG4yvJh4C95JD9m/vV02dBGNu+9OY1qE00Ipw==","signatures":[{"sig":"MEYCIQCIryOns9IlksHbvmfTpEgIb7D9tlEOY4h/RHeJTASFGwIhANpy7ENWjRF1Tn9ENhvGsCNW0b7IxB5ZJ1SPhfZg/5bn","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3923660},"main":"src/punter.js","engines":{"node":">=18"},"gitHead":"a572e79f27b808424595aa062bf4e2f6d350dcc6","scripts":{"lint":"eslint src/ tests/","test":"NODE_ENV=test TZ=UTC jasmine --config=tests/jasmine/config.json","start":"http-server . -p 4000 -o"},"_npmUser":{"name":"john-doherty","email":"contact@johndoherty.info"},"repository":{"url":"git+https://github.com/orca-scan/punter.js.git","type":"git"},"_npmVersion":"10.7.0","description":"A teaching-focused JavaScript game engine for the browser","directories":{"test":"tests"},"_nodeVersion":"18.20.4","_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.57.0","jasmine":"^5.13.0","puppeteer":"^25.3.0","playwright":"^1.62.0","http-server":"^14.1.1","jasmine-xml-reporter":"^1.2.1","jasmine-console-reporter":"^3.1.0"},"_npmOperationalInternal":{"tmp":"tmp/punter.js_3.3.0_1785527059011_0.17753170491266723","host":"s3://npm-registry-packages-npm-production"}},"3.3.1":{"name":"punter.js","version":"3.3.1","keywords":["game-engine","2d-game-engine","canvas","html5-canvas","javascript-game-engine","browser-game","sprite","game-loop","no-dependencies","lightweight","vanilla-javascript"],"author":{"url":"https://orcascan.com","name":"Orca Scan","email":"support@orcascan.com"},"license":"MIT","_id":"punter.js@3.3.1","maintainers":[{"name":"john-doherty","email":"contact@johndoherty.info"}],"homepage":"https://github.com/orca-scan/punter.js#readme","bugs":{"url":"https://github.com/orca-scan/punter.js/issues"},"dist":{"shasum":"1dd93904d6dab16a367578ba5fd10548cf517336","tarball":"https://registry.npmjs.org/punter.js/-/punter.js-3.3.1.tgz","fileCount":164,"integrity":"sha512-7TYTXyD04s5gsXsd6pCDFaKw414JWjAJlWSprb2SVorEJsJJDe9E1S1Zd7yGYRvFz0DWOpg21ro5M6aN8HyTNw==","signatures":[{"sig":"MEUCIQCLFdYIxktHUDnxoWkDzwth/x3QXYYFVnzmzQPeYRIB4wIgUbyvpa25d7hntcL7+1iasn3s1uxKupDRP9K8ol3pGOU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3956162},"main":"src/punter.js","engines":{"node":">=18"},"gitHead":"ca9cf3f6336f78edc00c61b84615bd779a332698","scripts":{"lint":"eslint src/ tests/","test":"NODE_ENV=test TZ=UTC jasmine --config=tests/jasmine/config.json","start":"http-server . -p 4000 -o"},"_npmUser":{"name":"john-doherty","email":"contact@johndoherty.info"},"repository":{"url":"git+https://github.com/orca-scan/punter.js.git","type":"git"},"_npmVersion":"10.7.0","description":"A teaching-focused JavaScript game engine for the browser","directories":{"test":"tests"},"_nodeVersion":"18.20.4","_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.57.0","jasmine":"^5.13.0","puppeteer":"^25.3.0","playwright":"^1.62.0","http-server":"^14.1.1","jasmine-xml-reporter":"^1.2.1","jasmine-console-reporter":"^3.1.0"},"_npmOperationalInternal":{"tmp":"tmp/punter.js_3.3.1_1785723258954_0.6872986117146298","host":"s3://npm-registry-packages-npm-production"}},"3.3.2":{"name":"punter.js","version":"3.3.2","keywords":["game-engine","2d-game-engine","canvas","html5-canvas","javascript-game-engine","browser-game","sprite","game-loop","no-dependencies","lightweight","vanilla-javascript"],"author":{"url":"https://orcascan.com","name":"Orca Scan","email":"support@orcascan.com"},"license":"MIT","_id":"punter.js@3.3.2","maintainers":[{"name":"john-doherty","email":"contact@johndoherty.info"}],"homepage":"https://github.com/orca-scan/punter.js#readme","bugs":{"url":"https://github.com/orca-scan/punter.js/issues"},"dist":{"shasum":"0218044523ccbdad8ce8aced9b9a3ab7cb28982c","tarball":"https://registry.npmjs.org/punter.js/-/punter.js-3.3.2.tgz","fileCount":164,"integrity":"sha512-HGiX8Lp4a/Hp5DjUGu+qwNXMWnM9nVHlhsvM3EDFWXGV8vBu73e34lZr13nVv2DCCIMX51zMO2Q24S5ojF1Caw==","signatures":[{"sig":"MEQCIGAUeFGTL0p5ai6uWfALSmyutf299HoX7V7UMpl3SN5EAiAQUHbchTd8BrV1shX+1N9xFrKLGMfIqTdPM2RgoTZxCQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3956217},"main":"src/punter.js","engines":{"node":">=18"},"gitHead":"d938b6540ba2904f7573f99e808f95a0befc8cf8","scripts":{"lint":"eslint src/ tests/","test":"NODE_ENV=test TZ=UTC jasmine --config=tests/jasmine/config.json","start":"http-server . -p 4000 -o"},"_npmUser":{"name":"john-doherty","email":"contact@johndoherty.info"},"repository":{"url":"git+https://github.com/orca-scan/punter.js.git","type":"git"},"_npmVersion":"10.7.0","description":"A teaching-focused JavaScript game engine for the browser","directories":{"test":"tests"},"_nodeVersion":"18.20.4","_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.57.0","jasmine":"^5.13.0","puppeteer":"^25.3.0","playwright":"^1.62.0","http-server":"^14.1.1","jasmine-xml-reporter":"^1.2.1","jasmine-console-reporter":"^3.1.0"},"_npmOperationalInternal":{"tmp":"tmp/punter.js_3.3.2_1785723358437_0.07942693299660597","host":"s3://npm-registry-packages-npm-production"}},"3.3.3":{"name":"punter.js","version":"3.3.3","keywords":["game-engine","2d-game-engine","canvas","html5-canvas","javascript-game-engine","browser-game","sprite","game-loop","no-dependencies","lightweight","vanilla-javascript"],"author":{"url":"https://orcascan.com","name":"Orca Scan","email":"support@orcascan.com"},"license":"MIT","_id":"punter.js@3.3.3","maintainers":[{"name":"john-doherty","email":"contact@johndoherty.info"}],"homepage":"https://github.com/orca-scan/punter.js#readme","bugs":{"url":"https://github.com/orca-scan/punter.js/issues"},"dist":{"shasum":"d1608dbea8796d644a809fe23f097cd716233e4b","tarball":"https://registry.npmjs.org/punter.js/-/punter.js-3.3.3.tgz","fileCount":164,"integrity":"sha512-gl97hNNE0uqwc2z9xKIZnrlTQEblIIpDI7SWQ3sOPjJn6esMgNdaw8aMjGK9IiCb01SOwuT5CgdRCOQBJlRmJQ==","signatures":[{"sig":"MEYCIQC4ycBfnQWfrsAAxi9dA5a1NMr3S9rzvY7nLlHORvyFvAIhAJiKjQPFb/RFTzQBipAEicdL8nchjtTPgWz1K1RsegcI","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3955742},"main":"src/punter.js","engines":{"node":">=18"},"gitHead":"acb2fc70e46c73179d37b4e4a92f7d4ccc49fd16","scripts":{"lint":"eslint src/ tests/","test":"NODE_ENV=test TZ=UTC jasmine --config=tests/jasmine/config.json","start":"http-server . -p 4000 -o"},"_npmUser":{"name":"john-doherty","email":"contact@johndoherty.info"},"repository":{"url":"git+https://github.com/orca-scan/punter.js.git","type":"git"},"_npmVersion":"10.7.0","description":"A teaching-focused JavaScript game engine for the browser","directories":{"test":"tests"},"_nodeVersion":"18.20.4","_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.57.0","jasmine":"^5.13.0","puppeteer":"^25.3.0","playwright":"^1.62.0","http-server":"^14.1.1","jasmine-xml-reporter":"^1.2.1","jasmine-console-reporter":"^3.1.0"},"_npmOperationalInternal":{"tmp":"tmp/punter.js_3.3.3_1785726994214_0.9530533451155629","host":"s3://npm-registry-packages-npm-production"}},"3.4.0":{"name":"punter.js","version":"3.4.0","keywords":["game-engine","2d-game-engine","canvas","html5-canvas","javascript-game-engine","browser-game","sprite","game-loop","no-dependencies","lightweight","vanilla-javascript"],"author":{"url":"https://orcascan.com","name":"Orca Scan","email":"support@orcascan.com"},"license":"MIT","_id":"punter.js@3.4.0","maintainers":[{"name":"john-doherty","email":"contact@johndoherty.info"}],"homepage":"https://github.com/orca-scan/punter.js#readme","bugs":{"url":"https://github.com/orca-scan/punter.js/issues"},"dist":{"shasum":"b463e2ea2fd78c079a7c555d3543b5e775b42b8c","tarball":"https://registry.npmjs.org/punter.js/-/punter.js-3.4.0.tgz","fileCount":171,"integrity":"sha512-5JEoA4hijphcbWjDqNLoCq/NX522goxe4GnuQPZzxXTkgfc0UyBSRuI5DIGNTG5NDy0S7OU7VYJY3IBellcAyA==","signatures":[{"sig":"MEUCIAl3nFBLqgBQZNwephTvOhHs0rvS0cHUkIEISHaDCdxZAiEAt3w5ZAQCHTwIHraH4S57FRjdq1AStJYvAZ4pBD1tXyc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3987661},"main":"src/punter.js","engines":{"node":">=18"},"gitHead":"9408487ac700aa6bf4f4ba1c83b41f0500d3484d","scripts":{"lint":"eslint src/ tests/","test":"NODE_ENV=test TZ=UTC jasmine --config=tests/jasmine/config.json","start":"http-server . -p 4000 -o"},"_npmUser":{"name":"john-doherty","email":"contact@johndoherty.info"},"repository":{"url":"git+https://github.com/orca-scan/punter.js.git","type":"git"},"_npmVersion":"10.7.0","description":"A teaching-focused JavaScript game engine for the browser","directories":{"test":"tests"},"_nodeVersion":"18.20.4","_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.57.0","jasmine":"^5.13.0","puppeteer":"^25.3.0","playwright":"^1.62.0","http-server":"^14.1.1","jasmine-xml-reporter":"^1.2.1","jasmine-console-reporter":"^3.1.0"},"_npmOperationalInternal":{"tmp":"tmp/punter.js_3.4.0_1785794899471_0.15706599872082605","host":"s3://npm-registry-packages-npm-production"}},"3.5.0":{"name":"punter.js","version":"3.5.0","keywords":["game-engine","2d-game-engine","canvas","html5-canvas","javascript-game-engine","browser-game","sprite","game-loop","no-dependencies","lightweight","vanilla-javascript","javascript-beginners","learn-javascript","teaching","education","coding-for-beginners"],"author":{"url":"https://orcascan.com","name":"Orca Scan","email":"support@orcascan.com"},"license":"MIT","_id":"punter.js@3.5.0","maintainers":[{"name":"john-doherty","email":"contact@johndoherty.info"}],"homepage":"https://punterjs.org","bugs":{"url":"https://github.com/orca-scan/punter.js/issues"},"dist":{"shasum":"dd0a04b3d660b9756c5321d371101d46b67dc79f","tarball":"https://registry.npmjs.org/punter.js/-/punter.js-3.5.0.tgz","fileCount":174,"integrity":"sha512-eoX+QQG6R8pvYqJ0/XdxXc0euOKTHYZ09nGu9n1OjKIztLrKgO8H5PNqjr7Ssn8jfNgrr5h6kLGL66aTnsJf9A==","signatures":[{"sig":"MEUCIATnfB7QdVDabMHAJ5DYopLIqxZtl2yobnWpaKGSEi3dAiEAr70KPyeM/ryZbPdwIVcnaLybgZ/A3Knte53Vg3NA/hM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4001445},"main":"src/punter.js","engines":{"node":">=18"},"gitHead":"dce48e2615304ab223c88ffdaf3375a512e545ca","scripts":{"lint":"eslint src/ tests/","test":"NODE_ENV=test TZ=UTC jasmine --config=tests/jasmine/config.json","start":"http-server . -p 4000 -o"},"_npmUser":{"name":"john-doherty","email":"contact@johndoherty.info"},"repository":{"url":"git+https://github.com/orca-scan/punter.js.git","type":"git"},"_npmVersion":"10.7.0","description":"A teaching-focused JavaScript game engine for the browser","directories":{"test":"tests"},"_nodeVersion":"18.20.4","_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.57.0","jasmine":"^5.13.0","puppeteer":"^25.3.0","playwright":"^1.62.0","http-server":"^14.1.1","jasmine-xml-reporter":"^1.2.1","jasmine-console-reporter":"^3.1.0"},"_npmOperationalInternal":{"tmp":"tmp/punter.js_3.5.0_1785970366812_0.30899132635758364","host":"s3://npm-registry-packages-npm-production"}},"3.5.1":{"name":"punter.js","version":"3.5.1","keywords":["game-engine","2d-game-engine","canvas","html5-canvas","javascript-game-engine","browser-game","sprite","game-loop","no-dependencies","lightweight","vanilla-javascript","javascript-beginners","learn-javascript","teaching","education","coding-for-beginners"],"author":{"url":"https://orcascan.com","name":"Orca Scan","email":"support@orcascan.com"},"license":"MIT","_id":"punter.js@3.5.1","maintainers":[{"name":"john-doherty","email":"contact@johndoherty.info"}],"homepage":"https://punterjs.org","bugs":{"url":"https://github.com/orca-scan/punter.js/issues"},"dist":{"shasum":"a3bdba75dfb677d46b7108b1c9c2169deeab864e","tarball":"https://registry.npmjs.org/punter.js/-/punter.js-3.5.1.tgz","fileCount":174,"integrity":"sha512-1zfayc66Fw0jJ5BOZuucCeRsVJ2oNPl7+3lahIub+a50OHLSsqRLQ7Aqsufle1+xLmZkQ8LGLZRlCUvBgOFr1g==","signatures":[{"sig":"MEYCIQCr5SFkJAJivNwxDBgOyVNCeqc0wKcGPzKOORywggbhCAIhAKhsbTRcqAcIS+WpmHT1zzaS64FEaxguvwsyCo41WZbF","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4006931},"main":"src/punter.js","engines":{"node":">=18"},"gitHead":"e338ae92d8e1b9b6c9222436b5f246b4f5466665","scripts":{"lint":"eslint src/ tests/","test":"NODE_ENV=test TZ=UTC jasmine --config=tests/jasmine/config.json","start":"http-server . -p 4000 -o"},"_npmUser":{"name":"john-doherty","email":"contact@johndoherty.info"},"repository":{"url":"git+https://github.com/orca-scan/punter.js.git","type":"git"},"_npmVersion":"10.7.0","description":"A teaching-focused JavaScript game engine for the browser","directories":{"test":"tests"},"_nodeVersion":"18.20.4","_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.57.0","jasmine":"^5.13.0","puppeteer":"^25.3.0","playwright":"^1.62.0","http-server":"^14.1.1","jasmine-xml-reporter":"^1.2.1","jasmine-console-reporter":"^3.1.0"},"_npmOperationalInternal":{"tmp":"tmp/punter.js_3.5.1_1786038229370_0.4136485031626629","host":"s3://npm-registry-packages-npm-production"}},"4.0.0":{"name":"punter.js","version":"4.0.0","keywords":["game-engine","2d-game-engine","canvas","html5-canvas","javascript-game-engine","browser-game","sprite","game-loop","no-dependencies","lightweight","vanilla-javascript","javascript-beginners","learn-javascript","teaching","education","coding-for-beginners"],"author":{"url":"https://orcascan.com","name":"Orca Scan","email":"support@orcascan.com"},"license":"MIT","_id":"punter.js@4.0.0","maintainers":[{"name":"john-doherty","email":"contact@johndoherty.info"}],"homepage":"https://punterjs.org","bugs":{"url":"https://github.com/orca-scan/punter.js/issues"},"dist":{"shasum":"98acdc6c7ac618fe01da2d7193a2cb433ad74fd9","tarball":"https://registry.npmjs.org/punter.js/-/punter.js-4.0.0.tgz","fileCount":174,"integrity":"sha512-EiQtLuax6aiC3qKXFD0y3zimm39Y3ygcxRbRrDvWH/VJdrIhmtgpd+W3b0iz/aXqdts+P7a2KhG52nWmRTKPoQ==","signatures":[{"sig":"MEUCIHVwalCwVGir8KpncrdNOhnaph+PRUbUud59AKJFe183AiEArKYD0POGWgiqZSRcTiAC0yM6rPulDTMGyNX5CQLWu90=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4003235},"main":"src/punter.js","engines":{"node":">=18"},"gitHead":"a67ae413118e9c2e9dccbe97d5e30d788524a071","scripts":{"lint":"eslint src/ tests/","test":"NODE_ENV=test TZ=UTC jasmine --config=tests/jasmine/config.json","start":"http-server . -p 4000 -o"},"_npmUser":{"name":"john-doherty","email":"contact@johndoherty.info"},"repository":{"url":"git+https://github.com/orca-scan/punter.js.git","type":"git"},"_npmVersion":"10.7.0","description":"A teaching-focused JavaScript game engine for the browser","directories":{"test":"tests"},"_nodeVersion":"18.20.4","_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.57.0","jasmine":"^5.13.0","puppeteer":"^25.3.0","playwright":"^1.62.0","http-server":"^14.1.1","jasmine-xml-reporter":"^1.2.1","jasmine-console-reporter":"^3.1.0"},"_npmOperationalInternal":{"tmp":"tmp/punter.js_4.0.0_1786053218317_0.6047352779795052","host":"s3://npm-registry-packages-npm-production"}},"4.0.1":{"name":"punter.js","version":"4.0.1","keywords":["game-engine","2d-game-engine","canvas","html5-canvas","javascript-game-engine","browser-game","sprite","game-loop","no-dependencies","lightweight","vanilla-javascript","javascript-beginners","learn-javascript","teaching","education","coding-for-beginners"],"author":{"url":"https://orcascan.com","name":"Orca Scan","email":"support@orcascan.com"},"license":"MIT","_id":"punter.js@4.0.1","maintainers":[{"name":"john-doherty","email":"contact@johndoherty.info"}],"homepage":"https://punterjs.org","bugs":{"url":"https://github.com/orca-scan/punter.js/issues"},"dist":{"shasum":"2db6b57d5d0860bcd569617bab7692acce964533","tarball":"https://registry.npmjs.org/punter.js/-/punter.js-4.0.1.tgz","fileCount":175,"integrity":"sha512-CMm0dcvLQK65xj52A0ruYOSs2JQWCRSwPkj/tQTiw2NAM2buhfISK+qIL6MP2psEKQCLbtBf3wthbqbosr//vg==","signatures":[{"sig":"MEQCIECHYsbM3225Dm3BnKv92NQpb9Lsdo9x+m/3sW4QLchEAiBYDtkPBIriesYuh4vJIx4fBFUdonsQur2zIWVS9vhQpA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4010983},"main":"src/punter.js","engines":{"node":">=18"},"gitHead":"c71d6248af57d28d295acb1be9f3bf97f0586e0a","scripts":{"lint":"eslint src/ tests/","test":"NODE_ENV=test TZ=UTC jasmine --config=tests/jasmine/config.json","start":"http-server . -p 4000 -o"},"_npmUser":{"name":"john-doherty","email":"contact@johndoherty.info"},"repository":{"url":"git+https://github.com/orca-scan/punter.js.git","type":"git"},"_npmVersion":"10.7.0","description":"A teaching-focused JavaScript game engine for the browser","directories":{"test":"tests"},"_nodeVersion":"18.20.4","_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.57.0","jasmine":"^5.13.0","puppeteer":"^25.3.0","playwright":"^1.62.0","http-server":"^14.1.1","jasmine-xml-reporter":"^1.2.1","jasmine-console-reporter":"^3.1.0"},"_npmOperationalInternal":{"tmp":"tmp/punter.js_4.0.1_1786104710308_0.8560024457418578","host":"s3://npm-registry-packages-npm-production"}},"4.0.2":{"name":"punter.js","version":"4.0.2","keywords":["game-engine","2d-game-engine","canvas","html5-canvas","javascript-game-engine","browser-game","sprite","game-loop","no-dependencies","lightweight","vanilla-javascript","javascript-beginners","learn-javascript","teaching","education","coding-for-beginners"],"author":{"url":"https://orcascan.com","name":"Orca Scan","email":"support@orcascan.com"},"license":"MIT","_id":"punter.js@4.0.2","maintainers":[{"name":"john-doherty","email":"contact@johndoherty.info"}],"homepage":"https://punterjs.org","bugs":{"url":"https://github.com/orca-scan/punter.js/issues"},"dist":{"shasum":"277823197f08487fe7c3b01e0ef3c266918fe26d","tarball":"https://registry.npmjs.org/punter.js/-/punter.js-4.0.2.tgz","fileCount":175,"integrity":"sha512-ViXhpccpVYcZr+HY1V3bhUa4lESDzaM73/o3RY6V9g4xkpYKGuFD6quedbPnddpcJSeS5csIKYecwh5AyKdoVQ==","signatures":[{"sig":"MEYCIQCyfTd2Hzc0u82YczWhLnHfl7pbVT/gMjo5txlrAPN9hwIhANZl6QcroG/xbyBoCUugQYNDHtMGkS+vg0mzZjf6EpVl","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4015641},"main":"src/punter.js","engines":{"node":">=18"},"gitHead":"745651f7aa21a77be68df7dd369fef01ab290fe4","scripts":{"lint":"eslint src/ tests/","test":"NODE_ENV=test TZ=UTC jasmine --config=tests/jasmine/config.json","start":"http-server . -p 4000 -o"},"_npmUser":{"name":"john-doherty","email":"contact@johndoherty.info"},"repository":{"url":"git+https://github.com/orca-scan/punter.js.git","type":"git"},"_npmVersion":"10.7.0","description":"A teaching-focused JavaScript game engine for the browser","directories":{"test":"tests"},"_nodeVersion":"18.20.4","_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.57.0","jasmine":"^5.13.0","puppeteer":"^25.3.0","playwright":"^1.62.0","http-server":"^14.1.1","jasmine-xml-reporter":"^1.2.1","jasmine-console-reporter":"^3.1.0"},"_npmOperationalInternal":{"tmp":"tmp/punter.js_4.0.2_1786120256712_0.6988503239943133","host":"s3://npm-registry-packages-npm-production"}},"5.0.0":{"name":"punter.js","version":"5.0.0","description":"A teaching-focused JavaScript game engine for the browser","main":"src/punter.js","directories":{"test":"tests"},"scripts":{"start":"http-server . -p 4000 -o","lint":"eslint src/ tests/","test":"NODE_ENV=test TZ=UTC jasmine --config=tests/jasmine/config.json"},"repository":{"type":"git","url":"git+https://github.com/orca-scan/punter.js.git"},"keywords":["game-engine","2d-game-engine","canvas","html5-canvas","javascript-game-engine","browser-game","sprite","game-loop","no-dependencies","lightweight","vanilla-javascript","javascript-beginners","learn-javascript","teaching","education","coding-for-beginners"],"author":{"name":"Orca Scan","email":"hello@orcascan.com","url":"https://orcascan.com"},"license":"MIT","bugs":{"url":"https://github.com/orca-scan/punter.js/issues"},"homepage":"https://punterjs.org","engines":{"node":">=18"},"devDependencies":{"eslint":"^8.57.0","http-server":"^14.1.1","jasmine":"^5.13.0","jasmine-console-reporter":"^3.1.0","jasmine-xml-reporter":"^1.2.1","playwright":"^1.62.0","puppeteer":"^25.3.0"},"_id":"punter.js@5.0.0","gitHead":"860fb0383fbe058c7eec898aeeb4d6f7794321bf","_nodeVersion":"18.20.4","_npmVersion":"10.7.0","dist":{"integrity":"sha512-0Hw16w3HzNEceV2GySv/9GCmub1ZcJxVwW55A1rgGjVhLxUVChc+GGlnF9LY0WZCdC0+oOv9sd1nXRV+vkMcaQ==","shasum":"1ad75c4c67381fe316ec872bbb63814441eab357","tarball":"https://registry.npmjs.org/punter.js/-/punter.js-5.0.0.tgz","fileCount":175,"unpackedSize":3998126,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIAq5kITM/iP7x+QwXfDqcO5hw/XFZUd9+DIs17ngrvAtAiEAtaLhXs9CF9gqahhJ7WZY/j4AvZqfIfbYa9u9weCAlOc="}]},"_npmUser":{"name":"john-doherty","email":"contact@johndoherty.info"},"maintainers":[{"name":"john-doherty","email":"contact@johndoherty.info"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/punter.js_5.0.0_1786280677776_0.7369305863439339"},"_hasShrinkwrap":false}},"time":{"created":"2026-07-15T21:35:14.912Z","modified":"2026-08-09T13:04:38.227Z","1.0.0":"2026-07-15T21:35:15.128Z","1.0.1":"2026-07-16T09:16:59.717Z","1.1.0":"2026-07-16T11:31:12.057Z","1.2.0":"2026-07-16T23:45:40.404Z","1.2.1":"2026-07-16T23:54:56.846Z","1.2.2":"2026-07-16T23:57:26.623Z","1.2.3":"2026-07-19T00:34:30.338Z","1.2.4":"2026-07-20T23:26:51.011Z","1.2.5":"2026-07-21T20:48:44.981Z","1.2.6":"2026-07-21T20:59:59.113Z","1.2.7":"2026-07-21T21:18:34.577Z","1.2.8":"2026-07-21T21:21:01.211Z","1.2.9":"2026-07-22T19:23:40.123Z","1.3.0":"2026-07-22T21:32:49.770Z","1.3.1":"2026-07-22T21:46:14.147Z","2.0.1":"2026-07-26T13:59:01.620Z","3.0.0":"2026-07-26T16:28:17.357Z","3.1.0":"2026-07-29T21:47:49.277Z","3.1.1":"2026-07-29T22:13:35.354Z","3.2.0":"2026-07-30T23:32:33.470Z","3.3.0":"2026-07-31T19:44:19.260Z","3.3.1":"2026-08-03T02:14:19.153Z","3.3.2":"2026-08-03T02:15:58.657Z","3.3.3":"2026-08-03T03:16:34.666Z","3.4.0":"2026-08-03T22:08:19.726Z","3.5.0":"2026-08-05T22:52:47.083Z","3.5.1":"2026-08-06T17:43:49.639Z","4.0.0":"2026-08-06T21:53:38.652Z","4.0.1":"2026-08-07T12:11:50.535Z","4.0.2":"2026-08-07T16:30:56.976Z","5.0.0":"2026-08-09T13:04:38.037Z"},"bugs":{"url":"https://github.com/orca-scan/punter.js/issues"},"author":{"name":"Orca Scan","email":"hello@orcascan.com","url":"https://orcascan.com"},"license":"MIT","homepage":"https://punterjs.org","keywords":["game-engine","2d-game-engine","canvas","html5-canvas","javascript-game-engine","browser-game","sprite","game-loop","no-dependencies","lightweight","vanilla-javascript","javascript-beginners","learn-javascript","teaching","education","coding-for-beginners"],"repository":{"type":"git","url":"git+https://github.com/orca-scan/punter.js.git"},"description":"A teaching-focused JavaScript game engine for the browser","maintainers":[{"name":"john-doherty","email":"contact@johndoherty.info"}],"readme":"# punter.js\n\n[![Tests](https://github.com/orca-scan/punter.js/actions/workflows/ci.yml/badge.svg)](https://github.com/orca-scan/punter.js/actions/workflows/ci.yml)\n[![npm](https://img.shields.io/npm/v/punter.js)](https://www.npmjs.com/package/punter.js)\n[![license](https://img.shields.io/github/license/orca-scan/punter.js)](https://github.com/orca-scan/punter.js/blob/master/LICENSE)\n\n<p align=\"center\"><img src=\"images/punterjs.png\" width=\"290\" height=\"174\" /></p>\n\nA teaching-focused JavaScript game engine for the browser.\n\nCreated by the Orca Scan team, Punter.js powers [OrcaCam](https://orcascan.com/game) and was designed to help students and new developers learn JavaScript by making games. Its deliberately simple design keeps the important parts visible instead of hiding them behind frameworks and abstractions.\n\n## Game programming terms\n- **Canvas** - an HTML element you draw on with JavaScript. Every punter.js game lives inside one `<canvas>`\n- **Sprite** - a game object (player, enemy, coin). It has a position, can move, animate and collide\n- **Scene** - one screen of your game (menu, level, game over). Sprites and logic are set up inside a scene\n- **Game loop** - code that runs 60 times per second to move sprites, check collisions and redraw the screen\n\n## Examples\n\nThis project includes a few example games which you can play and edit in the browser at https://punterjs.org. Or, you can download and run the examples locally using:\n\n```bash\ngit clone https://github.com/orca-scan/punter.js.git\ncd punter.js\nnpm install\nnpm start\n```\n\nThis starts a local server on port 4000 and opens the games index in your browser.\n\n## Quick Start\n\n```html\n<canvas id=\"game\"></canvas>\n<script src=\"punter.js\"></script>\n<script>\n\n  // load assets and bind to a canvas (must be called first)\n  punter.setup({\n    canvas: '#game',\n    debug: false, // set true to see FPS, bounds boxes, sprite labels\n    images: {\n      player: 'images/player.png',\n      enemy: 'images/enemy.svg'\n    },\n    sounds: {\n      jump: 'sounds/jump.mp3'\n    }\n  });\n\n  // define a scene - create sprites and register update/draw handlers inside\n  punter.scene('level1', function () {\n\n    // create a sprite using the 'player' image loaded above\n    var player = punter.createSprite({\n      id: 'player',   // optional - auto-generated if omitted; must be unique if provided\n      image: 'player', // key from config.images\n      x: 50,           // pixels from left edge of canvas\n      y: 50            // pixels from top edge of canvas\n    });\n\n    // runs ~60 times/sec - move things, read input, check collisions\n    punter.on('update', function () {\n      if (punter.isKeyDown('right')) player.moveX(2);\n    });\n\n    // runs once per frame after sprites draw - use for score text, HUD, overlays\n    punter.on('draw', function (ctx) {\n      // ctx is the canvas 2D context\n    });\n  });\n\n  // go() a specific scene - can be called immediately\n  punter.go('level1');\n</script>\n```\n\n## 1. Setup\n\nCall `punter.setup(config)` once at the start. It loads images and sounds ahead of time, sets up the canvas, and fires the `ready` event when everything's finished loading. Config options are:\n\nOption   | Type           | Description\n:--------|:---------------|:--------------------------------------------------------\n`canvas` | string/element | CSS selector or a `<canvas>` element\n`debug`  | boolean        | Shows FPS counter, sprite bounds, and position labels\n`images` | object         | `{ key: imageUrl }` map - preloaded before `ready` fires\n`sounds` | object         | `{ key: soundUrl }` map - decoded before `ready` fires\n\nThe `images` and `sounds` options are just name-to-file lookups - you pick a short name (like `player`) and point it at the actual file (like `images/player.png`), then refer to it by that short name everywhere else in your code.\n\n## 2. Scenes\n\nA scene is a named function that sets up `update`/`draw` handlers and creates sprites - think of it as \"everything that happens on this particular screen of the game.\"\n\n```js\npunter.scene('menu', function () {\n  // set up sprites and handlers here\n});\n\npunter.go('menu'); // destroys sprites from the previous scene, then switches and starts the loop\n```\n\n`scene()` just *registers* a scene under a name - it doesn't run anything yet. `go()` is what actually switches to it and starts things moving. You'll usually have several scenes (a menu, a level, a game-over screen) and use `go()` to jump between them, e.g. `punter.go('gameOver')` when the player loses.\n\n`punter.go()` can be called before `setup()` has finished loading - it queues the scene name and runs it automatically once assets are ready, so you don't need to wait on the `ready` event just to call `go()`. It always tears down every sprite from the current scene and clears input state before running the new scene's handler - scenes don't need to clean up after themselves, the engine does it for you.\n\n## 3. Sprites\n\nA sprite is any game object with a position - the player, an enemy, a coin, a wall. Tell it how to look (an `image`, a `vector` draw function, or both) and where to place it (`x`, `y`). Give it an `id` if you need to look it up later - otherwise the engine generates one for you.\n\n```js\nvar enemy = punter.createSprite({\n  id: 'enemy1',            // optional - auto-generated if omitted; useful when you need punter.getSprite('enemy1') later\n  image: 'enemy',          // matches a key from config.images (or an array of keys for animation)\n  vector: null,            // optional draw function - see \"Vector sprites\" below\n  x: 100, y: 200,          // position (number or '%' string, e.g. '50%')\n  w: 32, h: 32,            // optional size (auto-detected from image if omitted; required for vector-only)\n  preserveAspect: true,    // maintain image aspect ratio (default: true)\n  collidable: true,        // computes bounding box for collisions (default: true)\n  boundsMode: 'pixel',     // 'pixel' = edge-aware collisions from opaque pixels, 'rect' = full sprite w/h\n  repeatX: false,          // tile horizontally across the canvas (default: false)\n  repeatY: false,          // tile vertically across the canvas (default: false)\n  clipHeight: null,        // clip sprite to this height in pixels (null = no clip)\n  clipFrom: 'bottom',      // clip from 'top' or 'bottom' (default: 'bottom')\n  outline: 'red'           // optional debug outline color\n});\n```\n\n`x` and `y` are the sprite's position in pixels, measured from the top-left corner of the canvas - so `x: 0, y: 0` is the top-left, and increasing `x` moves right, increasing `y` moves down. Once created, `enemy` is a normal JavaScript object you keep a reference to and call methods on, like `enemy.moveX(5)`.\n\n### Vector sprites\n\nNot every sprite needs an image file. Pass a `vector` function to draw the sprite with canvas code - useful for simple shapes, procedural graphics, or games that don't use image files at all. The engine calls it each frame with `(ctx, w, h)`, where `ctx` is the canvas context already translated to the sprite's top-left corner.\n\n```js\n// a triangle drawn with code instead of a PNG\nvar ship = punter.createSprite({\n  id: 'ship',\n  x: 100, y: 200,\n  w: 36, h: 36,\n  vector: function (ctx, w, h) {\n    ctx.strokeStyle = '#00ffcc';\n    ctx.lineWidth = 2;\n    ctx.beginPath();\n    ctx.moveTo(w / 2, 0);    // tip\n    ctx.lineTo(w, h);         // bottom-right\n    ctx.lineTo(0, h);         // bottom-left\n    ctx.closePath();\n    ctx.stroke();\n  }\n});\n```\n\nWhen both `image` and `vector` are set, the image draws first and the vector function draws on top - useful for overlays like health bars or damage effects. Vector-only sprites default to `boundsMode: 'rect'` since there is no image to scan.\n\n### sprite methods\n\nMethod                                     | Description\n:------------------------------------------|:----------------------------------------------------------------------------------------------------------------------------------------------\n`sprite.moveX(dx)`                         | Move right (`+dx`) or left (`-dx`) by pixels\n`sprite.moveY(dy)`                         | Move down (`+dy`) or up (`-dy`) by pixels\n`sprite.center(offsetX?, offsetY?)`        | Centre on canvas; use `centerX()` / `centerY()` for one axis\n`sprite.animate(delayMs)`                  | Advance animation frame; requires `image` to be an array\n`sprite.bounce(range, speed)`              | Smooth up-and-down float anchored to creation position\n`sprite.blink(ms?, durationMs?)`           | Flash on/off every `ms` ms (default 130); auto-stops after `durationMs` if given, otherwise blinks indefinitely; call `blink(0)` to stop early\n`sprite.scroll(options)`                   | Scroll and optionally loop (`{ speedX, loop: true }`) or respawn (`{ speedX, respawnAfter: ms, offset: n }`)\n`sprite.rotate(amount)`                    | Add `amount` (radians) to `sprite.angle`; vector functions can read `this.angle` directly\n`sprite.isCollidingWith(other)`            | `true` if collision areas overlap; in `pixel` mode transparent corners are ignored, `other` can be a sprite or a plain `{ x, y, w, h }` rect\n`sprite.destroy()`                         | Remove from engine; further `draw()` calls are silently ignored\n\n### sprite properties\n\nProperty         | Description\n:----------------|:-----------------------------------------------------------------\n`sprite.visible` | `true` if any part of the sprite is within canvas bounds\n`sprite.seen`    | `true` once the sprite has been visible at least once. Read/write\n`sprite.actualW` | Drawn width in pixels, same as `w`\n`sprite.actualH` | Drawn height in pixels, accounting for `clipHeight` if set\n\n## 4. Input\n\nInput is how your game reads the keyboard and mouse/touch. Use `punter.isKeyDown()` inside your `update` handler to check which keys are held, and `punter.pointer` to read mouse/touch position and taps.\n\n```js\npunter.on('update', function () {\n\n  // keyboard - pass one or more key names (true if any are held)\n  if (punter.isKeyDown('left', 'a'))  player.moveX(-3);\n  if (punter.isKeyDown('right', 'd')) player.moveX(3);\n  if (punter.isKeyDown('up', 'w'))    player.moveY(-3);\n  if (punter.isKeyDown('down', 's'))  player.moveY(3);\n  if (punter.isKeyDown('space'))      punter.playSound('jump');\n\n  // use + for combos where all keys must be held at once\n  if (punter.isKeyDown('shift+a'))    player.moveX(-6);\n\n  // mouse/touch - clicked is true for one frame after a tap or click\n  if (punter.pointer.clicked) {\n    player.x = punter.pointer.x;\n    player.y = punter.pointer.y;\n  }\n\n  // swipe detection - fires once on release (good for mobile)\n  if (punter.pointer.swipedLeft)  player.moveX(-5);\n  if (punter.pointer.swipedRight) player.moveX(5);\n});\n```\n\n`isKeyDown()` takes friendly key names like `'left'`, `'space'`, `'a'` etc. Pass multiple names to check if *any* of them are held (OR logic), or join names with `+` for combos that require *all* keys at once (AND logic). The pointer properties work on both desktop (mouse) and mobile (touch) automatically.\n\n### key names\n\nName                               | Key\n:----------------------------------|:------------------------------\n`'left'` `'right'` `'up'` `'down'` | Arrow keys\n`'space'`                          | Spacebar\n`'enter'`                          | Enter\n`'escape'` / `'esc'`               | Escape\n`'tab'`                            | Tab\n`'backspace'`                      | Backspace\n`'shift'` `'ctrl'` `'alt'`         | Modifier keys\n`'a'` – `'z'`                      | Letter keys (case-insensitive)\n\n### keyboard\n\nProperty/Method                 | Description\n:-------------------------------|:------------------------------------------------------------------\n`punter.isKeyDown('left', 'a')` | `true` while any of the given keys is held\n`punter.isKeyDown('shift+a')`   | `true` while all keys in the combo are held\n`punter.clearInput()`           | Resets all key and pointer states (called automatically on `go()`)\n\n### pointer (mouse & touch)\n\nProperty                       | Description\n:------------------------------|:---------------------------------------------------------------\n`punter.isPointerDown(button)` | `true` while a button is held (`'left'`, `'right'`, `'middle'`)\n`punter.pointer.x`             | Current pointer X in canvas pixels\n`punter.pointer.y`             | Current pointer Y in canvas pixels\n`punter.pointer.clicked`       | `true` for one frame after a tap or click (not set by swipes)\n`punter.pointer.down`          | `true` while the primary button or finger is held\n`punter.pointer.swiped`        | `true` for one frame after a swipe\n`punter.pointer.swipedUp`      | `true` if the swipe direction was up\n`punter.pointer.swipedDown`    | `true` if the swipe direction was down\n`punter.pointer.swipedLeft`    | `true` if the swipe direction was left\n`punter.pointer.swipedRight`   | `true` if the swipe direction was right\n`punter.pointer.swipeDistance` | Distance of the swipe in canvas pixels\n\n## 5. Sound\n\n```js\npunter.playSound('jump', { volume: 0.8, loop: false, speed: 1 });\npunter.stopSound('jump');\n```\n\n`playSound` takes the short name you gave a sound in `setup()`'s `sounds` option, plus optional settings - `volume` (0 to 1), `loop` (repeat forever or not), and `speed` (1 is normal, 2 is double speed, etc.).\n\nShort sound effects layer automatically — up to 3 instances of the same sound can overlap at once (useful for rapid-fire collisions). The 4th call evicts the oldest. Sounds played with `{ loop: true }` restart instead of stacking, as does any call with `{ restart: true }`.\n\n## 6. Events\n\n`punter.on(eventName, fn)` Events are how you plug your own code into the engine's game loop - you give it a function, and the engine calls that function at the right moment. Register `update` and `draw` inside a scene function so they're set up fresh each time the scene starts. The `ready`, `resize`, and `go` events can be registered anywhere.\n\nEvent name | When it fires\n:----------|:------------------------------------------------------------------------\n`ready`    | Once, after all assets are loaded. Not needed just to call `go()`\n`update`   | ~60 times/sec (fixed timestep) - put game logic here\n`draw`     | Once per animation frame, after sprites auto-draw - use for HUD/overlays\n`resize`   | Whenever the canvas resizes\n`go`       | Whenever `punter.go()` switches scenes\n\n```js\n// these can be registered anywhere - they are not scene-specific\npunter.on('ready', function () {\n  // all images and sounds are loaded - safe to start\n  punter.go('level1');\n});\n\npunter.on('resize', function () {\n  // canvas resized - reposition any manually-placed elements\n  player.center();\n});\n\npunter.on('go', function (sceneName) {\n  // fires after every scene switch - useful for analytics or shared teardown\n});\n\n// update and draw must go inside a scene\npunter.scene('level1', function () {\n\n  var player = punter.createSprite({ image: 'player', x: 50, y: 50 });\n  var enemy = punter.createSprite({ image: 'enemy', x: 200, y: 100 });\n  var score = 0;\n\n  punter.on('update', function () {\n    // runs ~60 times/sec - move things, read input, check collisions\n    if (punter.isKeyDown('right')) player.moveX(3);\n    if (player.isCollidingWith(enemy)) punter.go('gameOver');\n  });\n\n  punter.on('draw', function (ctx) {\n    // runs after sprites draw - ctx is the canvas 2D context\n    // use for score text, HUD, overlays; sprites draw themselves automatically\n    ctx.fillStyle = 'white';\n    ctx.fillText('Score: ' + score, 10, 20);\n  });\n});\n```\n\n## Gotchas for Beginners\n\n- **Sprite IDs must be unique** - reusing one throws an error\n- **`repeatX` and `repeatY` are mutually exclusive** on a single sprite\n- Percentage strings (`'50%'`) for `x`/`y`/`w`/`h` are resolved relative to canvas size\n- Don't manually resize the canvas - the engine owns that via its own `resize()` handling\n- `punter.setup()` must be called before `createSprite`, `playSound`, `pause` etc\n\n## How the Game Loop Works\n\nOnce you call `punter.go()`, the engine runs a loop 60 times every second. Each loop does this:\n\n1. Runs your `update` code (move things, check collisions)\n2. Clears the screen\n3. Draws all sprites\n4. Runs your `draw` code (score, HUD)\n5. Starts again\n\nEach `update` always moves the game forward by the same amount of time - so your game runs at the same speed on fast and slow devices. Without this, a slow phone would make everything move in slow motion.\n\nUse `punter.pause()` and `punter.resume()` to freeze and unfreeze the loop - good for a pause menu.\n\n`punter.redraw()` redraws the screen without running any game logic - useful when the game is paused.\n\n---\n\n## Technical details\n\nYou do not need to understand this section to build a game. These are some of the details Punter.js handles for you:\n\n- **Content-trimmed + edge-aware collision data.** `getBounds` does a per-pixel alpha scan once per image key, then caches both a tight content box and a compact occupancy mask. Runtime collision still starts with a fast AABB overlap, but `pixel` mode adds a lightweight edge-aware check so transparent corners are less likely to register as hits.\n- **A real fixed-timestep loop.** The loop runs `update` on a 60Hz accumulator, decoupled from `draw`, with a 100ms-per-frame cap to avoid a spiral of death after a tab is backgrounded. Game logic behaves the same on a 60Hz and 144Hz screen - most hand-rolled canvas code skips this and gets frame-rate-dependent movement.\n- **Pointer, touch, and stylus are unified.** One `keys`/`pointer` input model backed by the Pointer Events API (with mouse/touch fallback for older browsers), with coordinate mapping that accounts for canvas CSS scaling (`getBoundingClientRect` + scale factor). Covers mouse, touchscreen, and stylus/pen with no extra game code. Tap vs swipe is classified on release using a distance threshold scaled to canvas width — `pointer.clicked` fires for taps, the `swiped*` properties fire for swipes, and they are mutually exclusive.\n- **DPR-aware canvas buffer.** The canvas backing buffer is sized at `internalResolution × devicePixelRatio` (capped at 2x) so art stays sharp on retina screens. All game coordinates - sprite positions, movement, pointer, and custom canvas drawing - use logical pixels; the engine handles the physical scaling internally.\n\nNone of this is exotic, it's just the stuff that's easy to get wrong when you write it yourself.\n\n## Responsive Canvas\n\nThe canvas always matches the real screen's aspect ratio - landscape screens get a landscape canvas, portrait screens get a portrait canvas. There's no portrait lock and no letterboxing (black bars).\n\nInternally, `resize()` uses a 375×667 reference resolution purely as a starting point for arithmetic: it picks whichever axis (width or height) that reference matches the current orientation on, holds that axis fixed, and computes the other axis from the screen's actual ratio. The result is an internal resolution whose aspect ratio equals the screen's aspect ratio exactly, every time - 375×667 never appears in the final canvas size except by coincidence.\n\nThe backing buffer is additionally scaled by devicePixelRatio (capped at 2x) for crisp rendering on retina displays. Sprites automatically reposition/resize on resize - you don't need to do anything manually.\n\n## Debug Mode\n\nSet `debug: true` in `setup()` (or `punter.debug = true` later) to see:\n\n- FPS, frame count, canvas size, and orientation (bottom-right overlay)\n- Position/size labels under each sprite\n\nTo see collision outlines on a specific sprite, set `outline: 'red'` in its options — this works independently of debug mode and is useful for checking why collisions aren't firing.\n\nThis is genuinely useful while learning - turning it on lets you *see* the invisible collision boxes and frame rate, which makes it much easier to understand why something isn't colliding the way you expect.\n\nDebug mode, device type, and orientation are also reflected as `data-punter-*` attributes on `<html>` (e.g. `data-punter-device`, `data-punter-orientation`, `data-punter-scene`) and as `--punter-vpw` / `--punter-vph` CSS custom properties, if you want to hook into them from your own CSS.\n\n## Other engine properties\n\n`punter` exposes a handful of read-only properties and helpers beyond what's covered above:\n\nProperty               | Description\n:----------------------|:--------------------------------------------------\n`punter.currentScene`  | name of the currently active scene\n`punter.getSprite(id)` | get a sprite by id, `null` if not found\n`punter.width`         | logical pixel width of the canvas\n`punter.height`        | logical pixel height of the canvas\n`punter.frame`         | total frames since the loop started (never resets)\n`punter.canvas`        | the `<canvas>` element\n`punter.paused`        | `true` if the loop is paused\n`punter.isMobile`      | `true` on mobile devices\n`punter.orientation`   | `'portrait'` or `'landscape'`\n\n## License\n\n[MIT License](LICENSE). Built by the [Orca Scan Team](https://orcascan.com/about-us).","readmeFilename":"README.MD"}