From 30bd05dbaccf719ed9e70abcdb544bf0c354d895 Mon Sep 17 00:00:00 2001 From: Kurt Lourens Date: Tue, 24 Sep 2024 14:25:53 +0200 Subject: [PATCH 1/3] =?UTF-8?q?=E2=9A=A1=EF=B8=8F=20More=20advanced=20lazy?= =?UTF-8?q?=20loading=20of=20images?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ideas.md | 6 + package-lock.json | 577 +++++++++++++++++- package.json | 2 +- src/assets/json/en/monsterForms.json | 141 +++++ src/assets/json/version.json | 2 +- src/components/common/LazyImage.astro | 65 +- src/components/common/SpriteSheetImage.astro | 25 + src/constants/image.ts | 5 + .../image/imageFilePathWithDimensions.ts | 5 + src/contracts/monsterForm.ts | 1 + src/helpers/cssSheetHelper.ts | 77 +++ src/helpers/imageHelper.ts | 33 +- .../monsterForms/monsterFormsModule.ts | 28 +- src/pages/[locale]/map/[world]/[id].astro | 4 +- src/pages/[locale]/monsters/[id].astro | 13 +- src/pages/[locale]/monsters/_id.scss | 11 +- src/pages/[locale]/monsters/index.astro | 8 +- 17 files changed, 958 insertions(+), 45 deletions(-) create mode 100644 src/components/common/SpriteSheetImage.astro create mode 100644 src/contracts/image/imageFilePathWithDimensions.ts create mode 100644 src/helpers/cssSheetHelper.ts diff --git a/ideas.md b/ideas.md index 10ff30460a..7aa95bd94a 100644 --- a/ideas.md +++ b/ideas.md @@ -21,3 +21,9 @@ ## Fun - https://www.emojiblast.dev + +## CSS optimization + +e.g. + + diff --git a/package-lock.json b/package-lock.json index 7f7595218f..001710aacb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -27,6 +27,7 @@ "@zokki/astro-minify": "^1.1.0", "astro-meta-tags": "^0.3.0", "astro-robots-txt": "^1.0.0", + "canvas": "^2.11.2", "dotenv-cli": "^7.4.2", "eslint": "^9.8.0", "eslint-plugin-astro": "^1.2.3", @@ -1662,6 +1663,36 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@mapbox/node-pre-gyp": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", + "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==", + "dependencies": { + "detect-libc": "^2.0.0", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.7", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" + }, + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@microsoft/signalr": { "version": "7.0.14", "resolved": "https://registry.npmjs.org/@microsoft/signalr/-/signalr-7.0.14.tgz", @@ -2806,6 +2837,11 @@ "glob": "^10.3.12" } }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, "node_modules/abort-controller": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", @@ -2838,6 +2874,17 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -2934,6 +2981,24 @@ "node": ">= 8" } }, + "node_modules/aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" + }, + "node_modules/are-we-there-yet": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "deprecated": "This package is no longer supported.", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/arg": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", @@ -3223,8 +3288,7 @@ "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "node_modules/base-64": { "version": "1.0.0", @@ -3306,7 +3370,6 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -3412,6 +3475,20 @@ } ] }, + "node_modules/canvas": { + "version": "2.11.2", + "resolved": "https://registry.npmjs.org/canvas/-/canvas-2.11.2.tgz", + "integrity": "sha512-ItanGBMrmRV7Py2Z+Xhs7cT+FNt5K0vPL4p9EZ/UX/Mu7hFbkxSjKF2KVtPwX7UYWp7dRKnrTvReflgrItJbdw==", + "hasInstallScript": true, + "dependencies": { + "@mapbox/node-pre-gyp": "^1.0.0", + "nan": "^2.17.0", + "simple-get": "^3.0.3" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/ccount": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", @@ -3485,6 +3562,14 @@ "fsevents": "~2.3.2" } }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "engines": { + "node": ">=10" + } + }, "node_modules/ci-info": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.0.0.tgz", @@ -3684,6 +3769,14 @@ "simple-swizzle": "^0.2.2" } }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "bin": { + "color-support": "bin.js" + } + }, "node_modules/color/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -3728,8 +3821,12 @@ "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" }, "node_modules/convert-source-map": { "version": "2.0.0", @@ -3933,6 +4030,17 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/decompress-response": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", + "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", + "dependencies": { + "mimic-response": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -3973,6 +4081,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" + }, "node_modules/dequal": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", @@ -3985,7 +4098,6 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", - "devOptional": true, "engines": { "node": ">=8" } @@ -5029,6 +5141,38 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs-minipass/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", @@ -5078,6 +5222,68 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/gauge": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "deprecated": "This package is no longer supported.", + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/gauge/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/gauge/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/gauge/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "node_modules/gauge/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/gauge/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -5398,6 +5604,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" + }, "node_modules/hasown": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", @@ -5603,6 +5814,18 @@ "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/ignore": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", @@ -5667,11 +5890,20 @@ "node": ">=0.8.19" } }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "node_modules/internal-slot": { "version": "1.0.7", @@ -6563,6 +6795,28 @@ "source-map-js": "^1.2.0" } }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/markdown-table": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.3.tgz", @@ -7375,11 +7629,21 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/mimic-response": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", + "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -7405,6 +7669,45 @@ "node": ">=16 || 14 >=14.17" } }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/mrmime": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz", @@ -7424,6 +7727,11 @@ "integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==", "dev": true }, + "node_modules/nan": { + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.20.0.tgz", + "integrity": "sha512-bk3gXBZDGILuuo/6sKtr0DQmSThYHLtNCdSdXk9YkxD/jK6X2vmCyyXBBxyqZ4XcnzTyYEAThfX3DCEnLf6igw==" + }, "node_modules/nanoid": { "version": "3.3.7", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", @@ -7483,7 +7791,6 @@ "version": "2.7.0", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "dev": true, "dependencies": { "whatwg-url": "^5.0.0" }, @@ -7513,6 +7820,20 @@ "node": ">=6" } }, + "node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/normalize-package-data": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", @@ -7617,6 +7938,18 @@ "which": "bin/which" } }, + "node_modules/npmlog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "deprecated": "This package is no longer supported.", + "dependencies": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + } + }, "node_modules/nth-check": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", @@ -7629,6 +7962,14 @@ "url": "https://github.com/fb55/nth-check?sponsor=1" } }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/object-inspect": { "version": "1.13.2", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", @@ -7668,6 +8009,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, "node_modules/onetime": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", @@ -7886,6 +8235,14 @@ "node": ">=8" } }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", @@ -8199,6 +8556,19 @@ "node": ">=4" } }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -8519,6 +8889,41 @@ "node": ">=0.10.0" } }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/rollup": { "version": "4.20.0", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.20.0.tgz", @@ -8593,6 +8998,25 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/safe-regex-test": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", @@ -8662,6 +9086,11 @@ "semver": "bin/semver" } }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" + }, "node_modules/set-cookie-parser": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.6.0.tgz", @@ -8821,6 +9250,35 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/simple-get": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.1.tgz", + "integrity": "sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==", + "dependencies": { + "decompress-response": "^4.2.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, "node_modules/simple-swizzle": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", @@ -8955,6 +9413,14 @@ "integrity": "sha512-TlnjJ1C0QrmxRNrON00JvaFFlNh5TTG00APw23j74ET7gkQpTASi6/L2fuiav8pzK715HXtUeClpBTw2NPSn6w==", "dev": true }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, "node_modules/string-width": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", @@ -9221,6 +9687,35 @@ "url": "https://opencollective.com/unts" } }, + "node_modules/tar": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/tar/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -9269,8 +9764,7 @@ "node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" }, "node_modules/trim-lines": { "version": "3.0.1", @@ -9718,8 +10212,7 @@ "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, "node_modules/valid-filename": { "version": "4.0.0", @@ -10121,14 +10614,12 @@ "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" }, "node_modules/whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dev": true, "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" @@ -10203,6 +10694,51 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "node_modules/wide-align/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/wide-align/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/wide-align/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wide-align/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/widest-line": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", @@ -10393,6 +10929,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, "node_modules/ws": { "version": "7.5.10", "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", @@ -10694,4 +11235,4 @@ } } } -} +} \ No newline at end of file diff --git a/package.json b/package.json index 322b40af74..82e353e46c 100644 --- a/package.json +++ b/package.json @@ -49,4 +49,4 @@ "typescript": "^5.5.3", "vite": "^5.3.4" } -} +} \ No newline at end of file diff --git a/src/assets/json/en/monsterForms.json b/src/assets/json/en/monsterForms.json index 4313f70d71..1438eaf35e 100644 --- a/src/assets/json/en/monsterForms.json +++ b/src/assets/json/en/monsterForms.json @@ -59,6 +59,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "adeptile", + "imageId": 0, "resource_name": "adeptile", "bestiary_index_with_padding": "123", "name_localised": "Adeptile", @@ -1607,6 +1608,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "aeroboros", + "imageId": 1, "resource_name": "aeroboros", "bestiary_index_with_padding": "010", "name_localised": "Aeroboros", @@ -3335,6 +3337,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "allseer", + "imageId": 2, "resource_name": "allseer", "bestiary_index_with_padding": "052", "name_localised": "Allseer", @@ -5067,6 +5070,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "amphare", + "imageId": 3, "resource_name": "amphare", "bestiary_index_with_padding": "???", "name_localised": "Amphare", @@ -6128,6 +6132,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "anathema", + "imageId": 4, "resource_name": "anathema", "bestiary_index_with_padding": "120", "name_localised": "Anathema", @@ -6902,6 +6907,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "apocrowlypse", + "imageId": 5, "resource_name": "apocrowlypse", "bestiary_index_with_padding": "048", "name_localised": "Apocrowlypse", @@ -8051,6 +8057,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "arkidd", + "imageId": 6, "resource_name": "arkidd", "bestiary_index_with_padding": "113", "name_localised": "Arkidd", @@ -9136,6 +9143,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "artillerex", + "imageId": 7, "resource_name": "artillerex", "bestiary_index_with_padding": "043", "name_localised": "Artillerex", @@ -10664,6 +10672,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "auriclaw", + "imageId": 8, "resource_name": "auriclaw", "bestiary_index_with_padding": "127", "name_localised": "Auriclaw", @@ -12715,6 +12724,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "averevoir", + "imageId": 9, "resource_name": "averevoir", "bestiary_index_with_padding": "117", "name_localised": "Averevoir", @@ -14077,6 +14087,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "bansheep", + "imageId": 10, "resource_name": "bansheep", "bestiary_index_with_padding": "019", "name_localised": "Bansheep", @@ -15160,6 +15171,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "beanstalker", + "imageId": 11, "resource_name": "beanstalker", "bestiary_index_with_padding": "090", "name_localised": "Beanstalker", @@ -17005,6 +17017,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "binterloper", + "imageId": 12, "resource_name": "binterloper", "bestiary_index_with_padding": "083", "name_localised": "Binterloper", @@ -18386,6 +18399,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "binvader", + "imageId": 13, "resource_name": "binvader", "bestiary_index_with_padding": "082", "name_localised": "Binvader", @@ -19383,6 +19397,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "blossomaw", + "imageId": 14, "resource_name": "blossomaw", "bestiary_index_with_padding": "027", "name_localised": "Blossomaw", @@ -21132,6 +21147,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "blunderbusk", + "imageId": 15, "resource_name": "blunderbusk", "bestiary_index_with_padding": "???", "name_localised": "Blunderbusk", @@ -22818,6 +22834,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "boltam", + "imageId": 16, "resource_name": "boltam", "bestiary_index_with_padding": "071", "name_localised": "Boltam", @@ -23908,6 +23925,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "braxsuit", + "imageId": 17, "resource_name": "braxsuit", "bestiary_index_with_padding": "055", "name_localised": "Braxsuit", @@ -25078,6 +25096,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "brushroom", + "imageId": 18, "resource_name": "brushroom", "bestiary_index_with_padding": "069", "name_localised": "Brushroom", @@ -26363,6 +26382,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "bulletino", + "imageId": 19, "resource_name": "bulletino", "bestiary_index_with_padding": "041", "name_localised": "Bulletino", @@ -27473,6 +27493,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "burnace", + "imageId": 20, "resource_name": "burnace", "bestiary_index_with_padding": "096", "name_localised": "Burnace", @@ -28358,6 +28379,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "busheye", + "imageId": 21, "resource_name": "busheye", "bestiary_index_with_padding": "073", "name_localised": "Busheye", @@ -29424,6 +29446,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "candevil", + "imageId": 22, "resource_name": "candevil", "bestiary_index_with_padding": "014", "name_localised": "Candevil", @@ -30479,6 +30502,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "capricorpse", + "imageId": 23, "resource_name": "capricorpse", "bestiary_index_with_padding": "023", "name_localised": "Capricorpse", @@ -31777,6 +31801,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "carniviper", + "imageId": 24, "resource_name": "carniviper", "bestiary_index_with_padding": "006", "name_localised": "Carniviper", @@ -32946,6 +32971,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "cat-5", + "imageId": 25, "resource_name": "cat-5", "bestiary_index_with_padding": "038", "name_localised": "Cat-5", @@ -34585,6 +34611,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "charlequin", + "imageId": 26, "resource_name": "charlequin", "bestiary_index_with_padding": "???", "name_localised": "Charlequin", @@ -35978,6 +36005,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "clocksley", + "imageId": 27, "resource_name": "clocksley", "bestiary_index_with_padding": "049", "name_localised": "Clocksley", @@ -37109,6 +37137,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "cluckabilly", + "imageId": 28, "resource_name": "cluckabilly", "bestiary_index_with_padding": "100", "name_localised": "Cluckabilly", @@ -38019,6 +38048,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "coaldron", + "imageId": 29, "resource_name": "coaldron", "bestiary_index_with_padding": "077", "name_localised": "Coaldron", @@ -39357,6 +39387,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "cryoshear", + "imageId": 30, "resource_name": "cryoshear", "bestiary_index_with_padding": "107", "name_localised": "Cryoshear", @@ -40987,6 +41018,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "dandylion", + "imageId": 31, "resource_name": "dandylion", "bestiary_index_with_padding": "026", "name_localised": "Dandylion", @@ -42232,6 +42264,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "decibelle", + "imageId": 32, "resource_name": "decibelle", "bestiary_index_with_padding": "025", "name_localised": "Decibelle", @@ -43762,6 +43795,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "diveal", + "imageId": 33, "resource_name": "diveal", "bestiary_index_with_padding": "045", "name_localised": "Diveal", @@ -45009,6 +45043,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "diveberg", + "imageId": 34, "resource_name": "diveberg", "bestiary_index_with_padding": "122", "name_localised": "Diveberg", @@ -46208,6 +46243,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "djinn_entonic", + "imageId": 35, "resource_name": "djinn_entonic", "bestiary_index_with_padding": "112", "name_localised": "Djinn Entonic", @@ -47229,6 +47265,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "dominoth", + "imageId": 36, "resource_name": "dominoth", "bestiary_index_with_padding": "030", "name_localised": "Dominoth", @@ -48519,6 +48556,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "draculeaf", + "imageId": 37, "resource_name": "draculeaf", "bestiary_index_with_padding": "091", "name_localised": "Draculeaf", @@ -50846,6 +50884,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "elfless", + "imageId": 38, "resource_name": "elfless", "bestiary_index_with_padding": "066", "name_localised": "Elfless", @@ -52922,6 +52961,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "faerious", + "imageId": 39, "resource_name": "faerious", "bestiary_index_with_padding": "068", "name_localised": "Faerious", @@ -54437,6 +54477,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "faucetear", + "imageId": 40, "resource_name": "faucetear", "bestiary_index_with_padding": "098", "name_localised": "Faucetear", @@ -55395,6 +55436,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "ferriclaw", + "imageId": 41, "resource_name": "ferriclaw", "bestiary_index_with_padding": "126", "name_localised": "Ferriclaw", @@ -56506,6 +56548,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "flapwoods", + "imageId": 42, "resource_name": "flapwoods", "bestiary_index_with_padding": "056", "name_localised": "Flapwoods", @@ -58098,6 +58141,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "folklord", + "imageId": 43, "resource_name": "folklord", "bestiary_index_with_padding": "029", "name_localised": "Folklord", @@ -59414,6 +59458,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "fortiwinx", + "imageId": 44, "resource_name": "fortiwinx", "bestiary_index_with_padding": "058", "name_localised": "Fortiwinx", @@ -60748,6 +60793,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "fountess", + "imageId": 45, "resource_name": "fountess", "bestiary_index_with_padding": "099", "name_localised": "Fountess", @@ -61929,6 +61975,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "fragliacci", + "imageId": 46, "resource_name": "fragliacci", "bestiary_index_with_padding": "???", "name_localised": "Fragliacci", @@ -63589,6 +63636,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "frillypad", + "imageId": 47, "resource_name": "frillypad", "bestiary_index_with_padding": "064", "name_localised": "Frillypad", @@ -64997,6 +65045,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "fungogh", + "imageId": 48, "resource_name": "fungogh", "bestiary_index_with_padding": "070", "name_localised": "Fungogh", @@ -66602,6 +66651,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "galagor", + "imageId": 49, "resource_name": "galagor", "bestiary_index_with_padding": "079", "name_localised": "Galagor", @@ -68686,6 +68736,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "gearyu", + "imageId": 50, "resource_name": "gearyu", "bestiary_index_with_padding": "044", "name_localised": "Gearyu", @@ -70124,6 +70175,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "glaistain", + "imageId": 51, "resource_name": "glaistain", "bestiary_index_with_padding": "118", "name_localised": "Glaistain", @@ -71201,6 +71253,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "grampus", + "imageId": 52, "resource_name": "grampus", "bestiary_index_with_padding": "067", "name_localised": "Grampus", @@ -73053,6 +73106,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "gumbaal", + "imageId": 53, "resource_name": "gumbaal", "bestiary_index_with_padding": "018", "name_localised": "Gumbaal", @@ -74694,6 +74748,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "hauntome", + "imageId": 54, "resource_name": "hauntome", "bestiary_index_with_padding": "???", "name_localised": "Hauntome", @@ -75614,6 +75669,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "hedgeherne", + "imageId": 55, "resource_name": "hedgeherne", "bestiary_index_with_padding": "075", "name_localised": "Hedgeherne", @@ -77514,6 +77570,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "hopskin", + "imageId": 56, "resource_name": "hopskin", "bestiary_index_with_padding": "002", "name_localised": "Hopskin", @@ -78731,6 +78788,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "huntorch", + "imageId": 57, "resource_name": "huntorch", "bestiary_index_with_padding": "074", "name_localised": "Huntorch", @@ -80527,6 +80585,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "icepeck", + "imageId": 58, "resource_name": "icepeck", "bestiary_index_with_padding": "106", "name_localised": "Icepeck", @@ -81906,6 +81965,7 @@ "bestiary_data_requirement": 0, "loot_table": "res://data/loot_tables/battle_jellyton.tres", "id": "jellyton", + "imageId": 59, "resource_name": "jellyton", "bestiary_index_with_padding": "086", "name_localised": "Jellyton", @@ -83073,6 +83133,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "jormungold", + "imageId": 60, "resource_name": "jormungold", "bestiary_index_with_padding": "008", "name_localised": "Jormungold", @@ -84845,6 +84906,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "jumpkin", + "imageId": 61, "resource_name": "jumpkin", "bestiary_index_with_padding": "089", "name_localised": "Jumpkin", @@ -86573,6 +86635,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "khepri", + "imageId": 62, "resource_name": "khepri", "bestiary_index_with_padding": "116", "name_localised": "Khepri", @@ -87687,6 +87750,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "khufo", + "imageId": 63, "resource_name": "khufo", "bestiary_index_with_padding": "053", "name_localised": "Khufo", @@ -89284,6 +89348,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "kingrave", + "imageId": 64, "resource_name": "kingrave", "bestiary_index_with_padding": "094", "name_localised": "Kingrave", @@ -91135,6 +91200,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "kirikuri", + "imageId": 65, "resource_name": "kirikuri", "bestiary_index_with_padding": "085", "name_localised": "Kirikuri", @@ -92856,6 +92922,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "kittelly", + "imageId": 66, "resource_name": "kittelly", "bestiary_index_with_padding": "037", "name_localised": "Kittelly", @@ -93923,6 +93990,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "kuneko", + "imageId": 67, "resource_name": "kuneko", "bestiary_index_with_padding": "110", "name_localised": "Kuneko", @@ -94799,6 +94867,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "lapacitor", + "imageId": 68, "resource_name": "lapacitor", "bestiary_index_with_padding": "???", "name_localised": "Lapacitor", @@ -96171,6 +96240,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "liligator", + "imageId": 69, "resource_name": "liligator", "bestiary_index_with_padding": "065", "name_localised": "Liligator", @@ -97616,6 +97686,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "littlered", + "imageId": 70, "resource_name": "littlered", "bestiary_index_with_padding": "???", "name_localised": "Littlered", @@ -99349,6 +99420,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "lobstacle", + "imageId": 71, "resource_name": "lobstacle", "bestiary_index_with_padding": "013", "name_localised": "Lobstacle", @@ -100627,6 +100699,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "macabra", + "imageId": 72, "resource_name": "macabra", "bestiary_index_with_padding": "028", "name_localised": "Macabra", @@ -101810,6 +101883,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "majortom", + "imageId": 73, "resource_name": "majortom", "bestiary_index_with_padding": "???", "name_localised": "Majortom", @@ -103427,6 +103501,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "malchemy", + "imageId": 74, "resource_name": "malchemy", "bestiary_index_with_padding": "015", "name_localised": "Malchemy", @@ -104902,6 +104977,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "manispear", + "imageId": 75, "resource_name": "manispear", "bestiary_index_with_padding": "035", "name_localised": "Manispear", @@ -106632,6 +106708,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "mardiusa", + "imageId": 76, "resource_name": "mardiusa", "bestiary_index_with_padding": "009", "name_localised": "Mardiusa", @@ -108380,6 +108457,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "mascotorn", + "imageId": 77, "resource_name": "mascotorn", "bestiary_index_with_padding": "081", "name_localised": "Mascotorn", @@ -109926,6 +110004,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "mascotoy", + "imageId": 78, "resource_name": "mascotoy", "bestiary_index_with_padding": "080", "name_localised": "Mascotoy", @@ -111326,6 +111405,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "masquerattle", + "imageId": 79, "resource_name": "masquerattle", "bestiary_index_with_padding": "007", "name_localised": "Masquerattle", @@ -113442,6 +113522,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "miasmodeus", + "imageId": 80, "resource_name": "miasmodeus", "bestiary_index_with_padding": "016", "name_localised": "Miasmodeus", @@ -114781,6 +114862,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "minortom", + "imageId": 81, "resource_name": "minortom", "bestiary_index_with_padding": "???", "name_localised": "Minortom", @@ -115772,6 +115854,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "miss_mimic", + "imageId": 82, "resource_name": "miss_mimic", "bestiary_index_with_padding": "119", "name_localised": "Miss Mimic", @@ -116685,6 +116768,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "mothmanic", + "imageId": 83, "resource_name": "mothmanic", "bestiary_index_with_padding": "032", "name_localised": "Mothmanic", @@ -118259,6 +118343,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "muskrateer", + "imageId": 84, "resource_name": "muskrateer", "bestiary_index_with_padding": "061", "name_localised": "Muskrateer", @@ -119626,6 +119711,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "nevermort", + "imageId": 85, "resource_name": "nevermort", "bestiary_index_with_padding": "047", "name_localised": "Nevermort", @@ -120752,6 +120838,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "padpole", + "imageId": 86, "resource_name": "padpole", "bestiary_index_with_padding": "063", "name_localised": "Padpole", @@ -121717,6 +121804,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "palangolin", + "imageId": 87, "resource_name": "palangolin", "bestiary_index_with_padding": "036", "name_localised": "Palangolin", @@ -123440,6 +123528,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "pawndead", + "imageId": 88, "resource_name": "pawndead", "bestiary_index_with_padding": "092", "name_localised": "Pawndead", @@ -124298,6 +124387,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "picksie", + "imageId": 89, "resource_name": "picksie", "bestiary_index_with_padding": "128", "name_localised": "Picksie", @@ -125562,6 +125652,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "pinbolt", + "imageId": 90, "resource_name": "pinbolt", "bestiary_index_with_padding": "121", "name_localised": "Pinbolt", @@ -126589,6 +126680,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "plasmantler", + "imageId": 91, "resource_name": "plasmantler", "bestiary_index_with_padding": "072", "name_localised": "Plasmantler", @@ -128037,6 +128129,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "pombomb", + "imageId": 92, "resource_name": "pombomb", "bestiary_index_with_padding": "104", "name_localised": "Pombomb", @@ -129060,6 +129153,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "pondwalker", + "imageId": 93, "resource_name": "pondwalker", "bestiary_index_with_padding": "102", "name_localised": "Pondwalker", @@ -130208,6 +130302,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "puppercut", + "imageId": 94, "resource_name": "puppercut", "bestiary_index_with_padding": "039", "name_localised": "Puppercut", @@ -131330,6 +131425,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "pyromeleon", + "imageId": 95, "resource_name": "pyromeleon", "bestiary_index_with_padding": "060", "name_localised": "Pyromeleon", @@ -132801,6 +132897,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "queenyx", + "imageId": 96, "resource_name": "queenyx", "bestiary_index_with_padding": "095", "name_localised": "Queenyx", @@ -134221,6 +134318,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "ramtasm", + "imageId": 97, "resource_name": "ramtasm", "bestiary_index_with_padding": "021", "name_localised": "Ramtasm", @@ -135553,6 +135651,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "ratcousel", + "imageId": 98, "resource_name": "ratcousel", "bestiary_index_with_padding": "062", "name_localised": "Ratcousel", @@ -137338,6 +137437,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "regensea", + "imageId": 99, "resource_name": "regensea", "bestiary_index_with_padding": "088", "name_localised": "Regensea", @@ -138604,6 +138704,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "ripterra", + "imageId": 100, "resource_name": "ripterra", "bestiary_index_with_padding": "003", "name_localised": "Ripterra", @@ -140157,6 +140258,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "robindam", + "imageId": 101, "resource_name": "robindam", "bestiary_index_with_padding": "050", "name_localised": "Robindam", @@ -141446,6 +141548,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "rockertrice", + "imageId": 102, "resource_name": "rockertrice", "bestiary_index_with_padding": "101", "name_localised": "Rockertrice", @@ -142760,6 +142863,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "rosehood", + "imageId": 103, "resource_name": "rosehood", "bestiary_index_with_padding": "???", "name_localised": "Rosehood", @@ -144652,6 +144756,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "salamagus", + "imageId": 104, "resource_name": "salamagus", "bestiary_index_with_padding": "059", "name_localised": "Salamagus", @@ -146168,6 +146273,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "sanzatime", + "imageId": 105, "resource_name": "sanzatime", "bestiary_index_with_padding": "057", "name_localised": "Sanzatime", @@ -147138,6 +147244,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "scampire", + "imageId": 106, "resource_name": "scampire", "bestiary_index_with_padding": "005", "name_localised": "Scampire", @@ -149171,6 +149278,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "scarleteeth", + "imageId": 107, "resource_name": "scarleteeth", "bestiary_index_with_padding": "???", "name_localised": "Scarleteeth", @@ -151114,6 +151222,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "scubalrus", + "imageId": 108, "resource_name": "scubalrus", "bestiary_index_with_padding": "046", "name_localised": "Scubalrus", @@ -152268,6 +152377,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "sharktanker", + "imageId": 109, "resource_name": "sharktanker", "bestiary_index_with_padding": "103", "name_localised": "Sharktanker", @@ -153547,6 +153657,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "shining_kuneko", + "imageId": 110, "resource_name": "shining_kuneko", "bestiary_index_with_padding": "111", "name_localised": "Shining Kuneko", @@ -154876,6 +154987,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "sirenade", + "imageId": 111, "resource_name": "sirenade", "bestiary_index_with_padding": "024", "name_localised": "Sirenade", @@ -156138,6 +156250,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "skelevangelist", + "imageId": 112, "resource_name": "skelevangelist", "bestiary_index_with_padding": "093", "name_localised": "Skelevangelist", @@ -157363,6 +157476,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "smogmagog", + "imageId": 113, "resource_name": "smogmagog", "bestiary_index_with_padding": "097", "name_localised": "Smogmagog", @@ -158555,6 +158669,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "snoopin", + "imageId": 114, "resource_name": "snoopin", "bestiary_index_with_padding": "004", "name_localised": "Snoopin", @@ -160260,6 +160375,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "southpaw", + "imageId": 115, "resource_name": "southpaw", "bestiary_index_with_padding": "040", "name_localised": "Southpaw", @@ -161608,6 +161724,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "sparktan", + "imageId": 116, "resource_name": "sparktan", "bestiary_index_with_padding": "108", "name_localised": "Sparktan", @@ -162627,6 +162744,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "spirouette", + "imageId": 117, "resource_name": "spirouette", "bestiary_index_with_padding": "087", "name_localised": "Spirouette", @@ -163705,6 +163823,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "spitzfyre", + "imageId": 118, "resource_name": "spitzfyre", "bestiary_index_with_padding": "105", "name_localised": "Spitzfyre", @@ -165042,6 +165161,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "spooki-onna", + "imageId": 119, "resource_name": "spooki-onna", "bestiary_index_with_padding": "115", "name_localised": "Spooki-onna", @@ -166114,6 +166234,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "springheel", + "imageId": 120, "resource_name": "springheel", "bestiary_index_with_padding": "001", "name_localised": "Springheel", @@ -167600,6 +167721,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "squirey", + "imageId": 121, "resource_name": "squirey", "bestiary_index_with_padding": "034", "name_localised": "Squirey", @@ -168861,6 +168983,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "stardigrade", + "imageId": 122, "resource_name": "stardigrade", "bestiary_index_with_padding": "078", "name_localised": "Stardigrade", @@ -170628,6 +170751,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "terracooka", + "imageId": 123, "resource_name": "terracooka", "bestiary_index_with_padding": "076", "name_localised": "Terracooka", @@ -171899,6 +172023,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "thwackalope", + "imageId": 124, "resource_name": "thwackalope", "bestiary_index_with_padding": "051", "name_localised": "Thwackalope", @@ -172867,6 +172992,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "tokusect", + "imageId": 125, "resource_name": "tokusect", "bestiary_index_with_padding": "033", "name_localised": "Tokusect", @@ -174133,6 +174259,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "traffikrab", + "imageId": 126, "resource_name": "traffikrab", "bestiary_index_with_padding": "011", "name_localised": "Traffikrab", @@ -175287,6 +175414,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "trapwurm", + "imageId": 127, "resource_name": "trapwurm", "bestiary_index_with_padding": "124", "name_localised": "Trapwurm", @@ -176690,6 +176818,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "triphinx", + "imageId": 128, "resource_name": "triphinx", "bestiary_index_with_padding": "054", "name_localised": "Triphinx", @@ -178272,6 +178401,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "twirligig", + "imageId": 129, "resource_name": "twirligig", "bestiary_index_with_padding": "084", "name_localised": "Twirligig", @@ -179342,6 +179472,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "umbrahella", + "imageId": 130, "resource_name": "umbrahella", "bestiary_index_with_padding": "???", "name_localised": "Umbrahella", @@ -180405,6 +180536,7 @@ "bestiary_data_requirement": 0, "loot_table": "res://data/loot_tables/battle_metal.tres", "id": "undyin", + "imageId": 131, "resource_name": "undyin", "bestiary_index_with_padding": "114", "name_localised": "Undyin", @@ -181424,6 +181556,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "velocirifle", + "imageId": 132, "resource_name": "velocirifle", "bestiary_index_with_padding": "042", "name_localised": "Velocirifle", @@ -183194,6 +183327,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "vendemon", + "imageId": 133, "resource_name": "vendemon", "bestiary_index_with_padding": "017", "name_localised": "Vendemon", @@ -184796,6 +184930,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "weevilite", + "imageId": 134, "resource_name": "weevilite", "bestiary_index_with_padding": "012", "name_localised": "Weevilite", @@ -186349,6 +186484,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "wingloom", + "imageId": 135, "resource_name": "wingloom", "bestiary_index_with_padding": "031", "name_localised": "Wingloom", @@ -187858,6 +187994,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "wooltergeist", + "imageId": 136, "resource_name": "wooltergeist", "bestiary_index_with_padding": "020", "name_localised": "Wooltergeist", @@ -188979,6 +189116,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "wyrmaw", + "imageId": 137, "resource_name": "wyrmaw", "bestiary_index_with_padding": "125", "name_localised": "Wyrmaw", @@ -190649,6 +190787,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "zeustrike", + "imageId": 138, "resource_name": "zeustrike", "bestiary_index_with_padding": "109", "name_localised": "Zeustrike", @@ -192101,6 +192240,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "zombleat", + "imageId": 139, "resource_name": "zombleat", "bestiary_index_with_padding": "022", "name_localised": "Zombleat", @@ -193282,6 +193422,7 @@ "bestiary_data_requirement": 0, "loot_table": "", "id": "magikrab", + "imageId": 140, "resource_name": "magikrab", "bestiary_index_with_padding": "000", "name_localised": "Magikrab", diff --git a/src/assets/json/version.json b/src/assets/json/version.json index 0bc10e2763..b498d2149f 100644 --- a/src/assets/json/version.json +++ b/src/assets/json/version.json @@ -1,5 +1,5 @@ { "commit_tag": "1.6.2", "commit_sha": "103d1183", - "app_version": "2.0.12" + "app_version": "2.0.14" } \ No newline at end of file diff --git a/src/components/common/LazyImage.astro b/src/components/common/LazyImage.astro index d7a76bbfc2..dbbf3667c4 100644 --- a/src/components/common/LazyImage.astro +++ b/src/components/common/LazyImage.astro @@ -13,22 +13,33 @@ interface Props { width?: string; height?: string; loadingImage?: string; - loadingStrat?: 'lazy' | 'defer' | 'eager'; + loadingStrat?: 'lazy' | 'viewport' | 'defer' | 'eager'; draggable?: boolean; } const { src, classes, style, alt, width, height } = Astro.props; -const loadingStrat = Astro.props.loadingStrat ?? 'defer'; +const loadingStrat = Astro.props.loadingStrat ?? 'viewport'; const loadingImage = Astro.props.loadingImage ?? AppImage.cardLoader; const draggable = Astro.props.draggable ?? false; -const imgSource = imgUrl(src); +let imgSource = imgUrl(src); +let imgDataSource: string | undefined; + +if (loadingStrat == 'viewport') { + imgDataSource = imgUrl(src); + imgSource = loadingImage; +} + +if (loadingStrat == 'defer') { + imgDataSource = undefined; + imgSource = loadingImage; +} let imgWidth; let imgHeight; try { if (src != null) { - const imgFullPath = path.join('public', imgSource); + const imgFullPath = path.join('public', imgUrl(src)); const dimensions = imageSize(imgFullPath); imgWidth = dimensions.width; imgHeight = dimensions.height; @@ -43,8 +54,8 @@ if (height != null) imgHeight = height; --- diff --git a/src/components/common/SpriteSheetImage.astro b/src/components/common/SpriteSheetImage.astro new file mode 100644 index 0000000000..3d6d195144 --- /dev/null +++ b/src/components/common/SpriteSheetImage.astro @@ -0,0 +1,25 @@ +--- +import type { IBoxSelection } from 'contracts/boxSelection'; + +interface Props { + src: string; + boxSelection: IBoxSelection; + classes?: string; + draggable?: boolean; +} + +const { src, classes, boxSelection } = Astro.props; +const draggable = Astro.props.draggable ?? false; +--- + +
+
diff --git a/src/constants/image.ts b/src/constants/image.ts index 4bd7365762..9c9dab3ae0 100644 --- a/src/constants/image.ts +++ b/src/constants/image.ts @@ -26,6 +26,11 @@ export const AppImage = { unknown: '/assets/img/passive_quest_icon.png', }; +export const CssSheetImage = { + monsterSticker: 'spriteSheet-monster-sticker.png', + monsterForm: 'spriteSheet-monster-form.png', +}; + export const cutBarkleyPortrait = { top: 0, left: 0, diff --git a/src/contracts/image/imageFilePathWithDimensions.ts b/src/contracts/image/imageFilePathWithDimensions.ts new file mode 100644 index 0000000000..2f65d6477e --- /dev/null +++ b/src/contracts/image/imageFilePathWithDimensions.ts @@ -0,0 +1,5 @@ +interface IImageFilePathWithDimensions { + filePath: string; + height: number; + width: number; +} diff --git a/src/contracts/monsterForm.ts b/src/contracts/monsterForm.ts index a8810ce224..cfea73b3b1 100644 --- a/src/contracts/monsterForm.ts +++ b/src/contracts/monsterForm.ts @@ -52,6 +52,7 @@ export interface IMonsterForm { export interface IMonsterFormEnhanced extends IMonsterForm { id: string; + imageId: number; resource_name: string; name_localised: string; description_localised: string; diff --git a/src/helpers/cssSheetHelper.ts b/src/helpers/cssSheetHelper.ts new file mode 100644 index 0000000000..2bddd5decf --- /dev/null +++ b/src/helpers/cssSheetHelper.ts @@ -0,0 +1,77 @@ +import { createCanvas, loadImage } from 'canvas'; +import fs from 'fs'; +import path from 'path'; +import sharp from 'sharp'; + +import { paths } from 'constants/paths'; +import type { IBoxSelection } from 'contracts/boxSelection'; +import { createFoldersOfDestFilePath } from './fileHelper'; + +interface ICreateSheetFromList { + overwrite: boolean; + destSpriteSheetName: string; + files: Record; +} + +export const createSheetFromFileList = async (props: ICreateSheetFromList) => { + let maxWidth: number = 0; + let maxHeight: number = 0; + const spriteSheetLookup: Record = {}; + + const destFilePath = path.join(paths().generatedImagesFolder, props.destSpriteSheetName); + const destJsonPath = path + .join(paths().intermediateFolder, props.destSpriteSheetName) + .replace('.png', '.json'); + createFoldersOfDestFilePath(destFilePath); + if (fs.existsSync(destFilePath)) { + if (props.overwrite) { + fs.unlinkSync(destFilePath); + } else { + return; + } + } + + for (const file of Object.values(props.files)) { + if (file == null) continue; + if (file.height > maxHeight) maxHeight = file.height; + if (file.width > maxWidth) maxWidth = file.width; + } + + const fileKeys = Object.keys(props.files); + const sqrRoot = Math.sqrt(fileKeys.length); + const numCol = Math.ceil(sqrRoot); + const numRow = Math.ceil(fileKeys.length / numCol); + const canvasWidth = numCol * maxWidth; + const canvasHeight = numRow * maxHeight; + + const canvas = createCanvas(canvasWidth, canvasHeight); + const ctx = canvas.getContext('2d'); + for (const fileKey of fileKeys) { + const file = props.files[+fileKey]; + if (file == null) continue; + if (fs.existsSync(file.filePath) == false) continue; + + const idInt = parseInt(fileKey); + const col = idInt % numCol; + const row = Math.floor(idInt / numCol); + + try { + const buffer = await sharp(file.filePath).png().toBuffer(); + const image = await loadImage(buffer); + const x = col * maxWidth; + const y = row * maxHeight; + ctx.drawImage(image, x, y, file.width, file.height); + spriteSheetLookup[idInt] = { x, y, width: file.width, height: file.height }; + } catch (e) { + console.error(`Unable to create sprite sheet for ${props.destSpriteSheetName}`, e); + } + } + + try { + const canvasBuffer = canvas.toBuffer(); + await sharp(canvasBuffer).toFile(destFilePath); + fs.writeFileSync(destJsonPath, JSON.stringify(spriteSheetLookup, null, 2), 'utf-8'); + } catch (e) { + console.error(`Unable to create sprite sheet for ${props.destSpriteSheetName}`, e); + } +}; diff --git a/src/helpers/imageHelper.ts b/src/helpers/imageHelper.ts index 42bb43316c..e4db416d58 100644 --- a/src/helpers/imageHelper.ts +++ b/src/helpers/imageHelper.ts @@ -52,7 +52,9 @@ interface ICutImageFromSpriteSheetProps { destFileName?: string; boxSelection: IBoxSelection; } -export const cutImageFromSpriteSheet = async (props: ICutImageFromSpriteSheetProps) => { +export const cutImageFromSpriteSheet = async ( + props: ICutImageFromSpriteSheetProps, +): Promise => { const sprite = getExternalResourcesImagePath(props.spriteFilePath); if (sprite == null || sprite.length < 1) return; @@ -64,7 +66,7 @@ export const cutImageFromSpriteSheet = async (props: ICutImageFromSpriteSheetPro destSprite = path.join(destSprite.slice(0, lastSlashIndex), props.destFileName); } - await retryAsync({ + return retryAsync({ attempts: 3, func: async () => { createFoldersOfDestFilePath(destSprite); @@ -72,7 +74,12 @@ export const cutImageFromSpriteSheet = async (props: ICutImageFromSpriteSheetPro if (props.overwrite) { fs.unlinkSync(destSprite); } else { - return; + const existingFileMeta = await sharp(destSprite).metadata(); + return { + filePath: destSprite, + height: existingFileMeta.height!, + width: existingFileMeta.width!, + }; } } @@ -85,6 +92,11 @@ export const cutImageFromSpriteSheet = async (props: ICutImageFromSpriteSheetPro }) .toFile(destSprite); process.stdout.write('✔'); + return { + filePath: destSprite, + width: props.boxSelection.width, + height: props.boxSelection.height, + }; }, onError: (ex) => console.error(ex), }); @@ -116,7 +128,7 @@ export const copyImageToGeneratedFolder = async ( overwrite: boolean, externalResource?: IExternalResource, cutImageWhenCopying: ICutImageWhenCopying | null = null, -) => { +): Promise => { const imagePath = getExternalResourcesImagePath(externalResource?.path); if (imagePath == null || imagePath.length < 1) return; @@ -129,7 +141,12 @@ export const copyImageToGeneratedFolder = async ( if (overwrite) { fs.unlinkSync(destFilePath); } else { - return; + const existingFileMeta = await sharp(destFilePath).metadata(); + return { + filePath: destFilePath, + height: existingFileMeta.height!, + width: existingFileMeta.width!, + }; } } let imageTask = sharp(srcFilePath); @@ -138,6 +155,12 @@ export const copyImageToGeneratedFolder = async ( } await imageTask.png().toFile(destFilePath); process.stdout.write('✔'); + const existingFileMeta = await sharp(destFilePath).metadata(); + return { + filePath: destFilePath, + height: existingFileMeta.height!, + width: existingFileMeta.width!, + }; } catch (ex) { console.error(ex); } diff --git a/src/modules/monsterForms/monsterFormsModule.ts b/src/modules/monsterForms/monsterFormsModule.ts index 2f51ed623f..325c256dd0 100644 --- a/src/modules/monsterForms/monsterFormsModule.ts +++ b/src/modules/monsterForms/monsterFormsModule.ts @@ -100,6 +100,7 @@ export class MonsterFormsModule extends CommonModule= 0 ? pad(detail.bestiary_index, 3) : '???', @@ -294,24 +297,45 @@ export class MonsterFormsModule extends CommonModule>) => { + const stickerFilesCreated: Record = {}; + const spriteFilesCreated: Record = {}; + for (const mapKey of Object.keys(this._itemDetailMap)) { const detailEnhanced: IMonsterFormEnhanced = this._itemDetailMap[mapKey]; - await copyImageToGeneratedFolder(overwrite, detailEnhanced.tape_sticker_texture); + const destSticker = await copyImageToGeneratedFolder( + overwrite, + detailEnhanced.tape_sticker_texture, + ); + stickerFilesCreated[detailEnhanced.imageId] = destSticker; if (detailEnhanced.animations == null || detailEnhanced.animations.length < 1) continue; const firstFrame = detailEnhanced.animations[0].frames[0]; - await cutImageFromSpriteSheet({ + const destFile = await cutImageFromSpriteSheet({ overwrite, spriteFilePath: detailEnhanced.icon_url, boxSelection: firstFrame, }); + spriteFilesCreated[detailEnhanced.imageId] = destFile; + await createWebpFromISpriteAnim({ overwrite, spriteFilePath: detailEnhanced.icon_url, animations: detailEnhanced?.animations ?? [], }); } + + // await createSheetFromFileList({ + // destSpriteSheetName: CssSheetImage.monsterSticker, + // files: stickerFilesCreated, + // overwrite, + // }); + + // await createSheetFromFileList({ + // destSpriteSheetName: CssSheetImage.monsterForm, + // files: spriteFilesCreated, + // overwrite, + // }); }; generateMetaImages = async ( diff --git a/src/pages/[locale]/map/[world]/[id].astro b/src/pages/[locale]/map/[world]/[id].astro index b0f4609f42..b0244ae400 100644 --- a/src/pages/[locale]/map/[world]/[id].astro +++ b/src/pages/[locale]/map/[world]/[id].astro @@ -88,7 +88,7 @@ const backupMonsters = backupMonstersUnordered.sort((a, b) => b.percent - a.perc const hasMonsters = overworldMonsters.length + backupMonsters.length > 0; const meta_image_url = site.images.meta.url; -const description = data.title_localised + ' - ' + data.features_localised.join('. '); +const description = data.title_localised + ' - ' + data.features_localised.map(f => f.title_localised).join('. '); const schemaOverride: IGuideSchema = { name: data.title_localised, headline: data.title_localised, @@ -106,7 +106,7 @@ const schemaOverride: IGuideSchema = { metaImageUrl={meta_image_url} documentTitle={data.title_localised} description={description} - metaImageUrl={schemaOverride.thumbnailUrl} + metaImageUrl={data.meta_image_url} schemaOverride={toSchemaOrgProperty('Guide', schemaOverride)} translationLookup={translationLookup} > diff --git a/src/pages/[locale]/monsters/[id].astro b/src/pages/[locale]/monsters/[id].astro index f4f6f7354f..5cc6c56aa3 100644 --- a/src/pages/[locale]/monsters/[id].astro +++ b/src/pages/[locale]/monsters/[id].astro @@ -432,7 +432,18 @@ const schemaOverride: IGuideSchema = { - {backupLoc.habitat_name_localised} ({backupLoc.id}) + {backupLoc.habitat_coords.length > 0 ? ( + + {backupLoc.habitat_name_localised} ({backupLoc.id}) + + ) : ( + + {backupLoc.habitat_name_localised} ({backupLoc.id}) + + )} {backupLoc.percentStr}% diff --git a/src/pages/[locale]/monsters/_id.scss b/src/pages/[locale]/monsters/_id.scss index 79d40a72fa..9cf90e3c68 100644 --- a/src/pages/[locale]/monsters/_id.scss +++ b/src/pages/[locale]/monsters/_id.scss @@ -108,6 +108,7 @@ img { height: 2rem; + width: auto; } div { @@ -217,8 +218,9 @@ padding: 0; img { - width: 2em; - height: 2em; + max-width: 2em; + max-height: 2em; + width: auto; } } @@ -226,7 +228,7 @@ margin-top: var(--pico-spacing); margin-bottom: 0; - &[open] > summary { + &[open]>summary { margin-bottom: 0; } @@ -261,6 +263,7 @@ // animation delays .monster-detail-card { .monster-detail-card-body { + .id, .descrip, .images { @@ -287,4 +290,4 @@ animation-delay: 500ms; } } -} +} \ No newline at end of file diff --git a/src/pages/[locale]/monsters/index.astro b/src/pages/[locale]/monsters/index.astro index 69294db896..a5356c2072 100644 --- a/src/pages/[locale]/monsters/index.astro +++ b/src/pages/[locale]/monsters/index.astro @@ -129,7 +129,12 @@ const schemaOverride: IGuideSchema = { draggable="false" >
- + {data.animations.map((anim, index) => { if (index != 0) return ''; @@ -137,6 +142,7 @@ const schemaOverride: IGuideSchema = { ); From 950a399700fadb24d10ec4710966a9d234373fcf Mon Sep 17 00:00:00 2001 From: Kurt Lourens Date: Wed, 25 Sep 2024 20:51:07 +0200 Subject: [PATCH 2/3] =?UTF-8?q?=F0=9F=93=B1=20=20Move=20responsive=20css?= =?UTF-8?q?=20to=20separate=20files?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/build-pages.yml | 4 +- package.json | 1 + public/.gitignore | 1 + src/components/meta/DocumentHead.astro | 4 + .../monster/MonsterLocationRow.astro | 39 +++++ src/pages/[locale]/monsters/[id].astro | 48 +----- src/scss/_responsive.scss | 147 ------------------ src/scss/main.scss | 21 ++- src/scss/responsive/_responsive.scss | 3 + src/scss/responsive/screen467.scss | 40 +++++ src/scss/responsive/screen768.scss | 77 +++++++++ src/scss/responsive/screen992.scss | 15 ++ 12 files changed, 206 insertions(+), 194 deletions(-) create mode 100644 src/components/monster/MonsterLocationRow.astro delete mode 100644 src/scss/_responsive.scss create mode 100644 src/scss/responsive/_responsive.scss create mode 100644 src/scss/responsive/screen467.scss create mode 100644 src/scss/responsive/screen768.scss create mode 100644 src/scss/responsive/screen992.scss diff --git a/.github/workflows/build-pages.yml b/.github/workflows/build-pages.yml index 7e89194b2f..256da55884 100644 --- a/.github/workflows/build-pages.yml +++ b/.github/workflows/build-pages.yml @@ -52,7 +52,9 @@ jobs: npm run data - name: Build Pages - run: npm run build + run: | + npm run build:scss + npm run build - name: Generate service worker run: | diff --git a/package.json b/package.json index 82e353e46c..4d2fbf1552 100644 --- a/package.json +++ b/package.json @@ -6,6 +6,7 @@ "dev": "astro dev", "build": "astro check && astro build", "lint": "npx eslint src", + "build:scss": "sass ./src/scss/responsive:./public/assets/css", "data": "dotenv -- tsx --tsconfig ./tsconfig.data.json src/build.ts", "data:dev": "dotenv -- tsx --tsconfig ./tsconfig.data.json src/main.ts", "service-worker": "npx workbox-cli generateSW ./workbox-config.js", diff --git a/public/.gitignore b/public/.gitignore index 4984ac8274..9bb545dd75 100644 --- a/public/.gitignore +++ b/public/.gitignore @@ -2,6 +2,7 @@ /index.html /about.html /CNAME +/assets/css /assets/js /terms_and_conditions.html /privacy_policy.html diff --git a/src/components/meta/DocumentHead.astro b/src/components/meta/DocumentHead.astro index f60985e7dd..1fa56fe132 100644 --- a/src/components/meta/DocumentHead.astro +++ b/src/components/meta/DocumentHead.astro @@ -140,6 +140,10 @@ alternateUrls.push({ )) } + + + +