From 3227167cb52b145e3446830d59b879622d650517 Mon Sep 17 00:00:00 2001 From: Idrees Hassan Date: Mon, 19 Jan 2026 20:31:49 -0500 Subject: [PATCH] Add wardrobe menu --- aseprite/hats.aseprite | Bin 759 -> 756 bytes dist/extension.zip | Bin 151277 -> 152221 bytes dist/extension/birb.js | 144 ++++++++++++++++++++++++++++++++++- dist/obsidian/main.js | 144 ++++++++++++++++++++++++++++++++++- dist/userscript/birb.user.js | 144 ++++++++++++++++++++++++++++++++++- dist/web/birb.embed.js | 144 ++++++++++++++++++++++++++++++++++- dist/web/birb.js | 144 ++++++++++++++++++++++++++++++++++- sprites/hats.png | Bin 386 -> 388 bytes src/application.js | 108 +++++++++++++++++++++++++- src/hats.js | 27 +++++++ src/stylesheet.css | 13 +++- 11 files changed, 856 insertions(+), 12 deletions(-) diff --git a/aseprite/hats.aseprite b/aseprite/hats.aseprite index 7f768e4a7f619df9a77d0e748e499792968b1d53..59d937e195755ce18fbf36f9ec36a3214fd13126 100644 GIT binary patch delta 75 zcmV-R0JQ)21@r|0^sxb(0ufjM008>&0RWHz00031002mntpXh?0E7Q%7%ui%Pw)T# h)BGs%|LyJne^gWZKTSdcMGjdUi&0RWHz00031002vqtpXh_VEE5~i9z81XB(UU kpY`miozV{ABO{yH*j-s)^yJNW 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 delta 28239 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 o6sCe22kM)R$U>!X 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 Xycs>iKvOA*pC*t3!CD6RT%i9CIy`%N diff --git a/dist/extension/birb.js b/dist/extension/birb.js index fa74efa..9ae9445 100644 --- a/dist/extension/birb.js +++ b/dist/extension/birb.js @@ -618,6 +618,33 @@ FEZ: "fez", }; + const HAT_METADATA = { + [HAT.NONE]: { + name: "Invisible Hat", + description: "It's like you're wearing nothing at all!" + }, + [HAT.TOP_HAT]: { + name: "Top Hat", + description: "For that classy, sophisticated look." + }, + [HAT.VIKING_HELMET]: { + name: "Viking Helmet", + description: "Sure, vikings never actually wore this style of helmet, but why let facts get in the way of good fashion?" + }, + [HAT.COWBOY_HAT]: { + name: "Cowboy Hat", + description: "You can't jam with the console cowboys without the appropriate attire." + }, + [HAT.BOWLER_HAT]: { + name: "Bowler Hat", + description: "For that authentic, Victorian look!" + }, + [HAT.FEZ]: { + name: "Fez", + description: "It's a fez. Fezzes are cool." + }, + }; + /** * @param {string[][]} spriteSheet * @returns {{ base: Layer[], down: Layer[] }} @@ -1752,9 +1779,20 @@ width: 322px !important; } +#birb-wardrobe { + width: calc(322px - 64px - 14px) !important; +} + +#birb-field-guide .birb-grid-content { + grid-template-rows: repeat(3, auto); +} + +#birb-wardrobe .birb-grid-content { + grid-template-rows: repeat(2, auto); +} + .birb-grid-content { display: grid; - grid-template-rows: repeat(3, auto); grid-auto-flow: column; gap: 10px; padding-top: 8px; @@ -1881,11 +1919,12 @@ }`; const SPRITE_SHEET = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAUAAAAAgCAYAAABjE6FEAAAAAXNSR0IArs4c6QAABD9JREFUeJztnT9rFEEYh3+TWATE7hDcsxW7CBbmA0Qs0uSuSiloYSBgIRhCPkCQFIKCYNBKK6szjZWpbEyTziLY5k6RAwsjpDGvRXbWubmd3btzd2c293vgyGRvb9/Z25ln39l/BxBCCCGEkOlC+a4ACR8REdd7Sim2IVJb2HhrgE8B6djtZhMA0Ol2B8pV1IEQMqVITCuKpBVFQ+UsORYVvxVF8nl+XmRtbahcdnxCymTGdwVIPu1mExuNBjrt9lC5SvY/fcJGo5GUCak7FGCN8CWgTreLJ/3+wLQn/X4yBCaEkFIwh8Cf5+eTV1VD4LQ6VBmbEBIAkkLVsX0KyKwD5UfIlCEiZwf/jb9Vx/ctIB/yJ6RMLviuQN3Yv3HDS1yllBIR8XnpCS93IWRK0ZmPzv6YBRFSf7hHHwNTesyGqsfe6XAbkP+FDYjUAi0/7TwRqVyAFPCUknYGlENA4gHZ6bYEgLcTQHHsoNs/++no5F4Ibe55zRdy7lEtEgqYAMBOt6WLXk4AKaWSOoSW/dn9wkc/rSOZZ4HNL9NofNDTRMScp5QGYQ99jOkQEQmtIZLyeNB873Vb+xTwKJhdYWW7l0yj/9w4BWiK53DlPvAI2L79Onl/p9seOB5ThoxCEDAhGt8CzkCUUon0zjtXZpV8+yOFbAvnQkREZi5GA9PuPevhw+oMll6eAgCOf34DALxbjwb2MkXIaEjAGBTwraU2HjTf63kLi0tIzRCX+L4e/cLB8+teThiVxZVZJUsvT/FhdQZFSDBTgIgFdP9VegqtBYhYgjBklBpsjI3gW8AkbFa2e/JuPZr27Zwrv1CH66HgHALrOw9c75vyg3XMIY1Jhsmnv3tDAtbys2Pbw3HXOo0am4TDye6izC3vKV0GgLllv/LzLeCV7Z7XA3uu+HEiVJt+llnRWFg42V3E2o+PAIAXl28DAO4evh0pwNejXwAwUSqu46dloLaANToTTVkWQAnWln/i26t8+6ULuPp6mLgEZPa3kkXkzD7rJMGRBWgzt7yHmw8Pce3qpdTPWhtiIgH5FjAhmlDEpznZXRSzD9j9rQIBiav/T4UAYUgwDVt8mCD78i1gQkKmv7Ugaxc6wODIp6r27RQgaiTBXAEiPq5nS+j4yzEAoLG57/rsvyATSse3gAkJnf7WQtLA73x/A5y1fe8SNE9MhtzvciuWJiEtvzQam/uFrbhvARNCchGdhNgi1BIMuf+N9DzAeCXQ31rInK9I+SHjTLQpYLtORdeBEJKJOnh+/azDOUQYMrkC1BLKk2CZ4tGxkSK8qupACHGicDb0HhDhucJ8Gkbn6ePkqRi6XOYDCqwbvVPjl10HQkg+9hNzQu+PY/0splIKnaePk//NMkrMuvRys+Iz8yMkDOKbEYAa9MexfhPEHIra5SrIix/6l03IeadufXDs6/KcC6pgxX3HJ4ScL/4CWsLSrzMo7i0AAAAASUVORK5CYII="; const FEATHER_SPRITE_SHEET = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAARhJREFUWIXtlbENwjAQRf8hSiZIRQ+9WQNRUFIAKzACBSsAA1Ag1mAABqCCBomG3hQQ9OMEx4ZDNH5SikSJ3/fZ5wCJRCKRSPwZ0RzMWmtLAhGvQyUAi9mXP/aFaGjJRQQiguHihMvcFMJUVUYlAMuHixPGy4en1WmVQqgHYHkuZjiEj6a2/LjtYzTY0eiZbgC37Mxh1UN3sn/dr6cCz/LHB/DJj9s+2oMdbtdz6TtfFwQHcMvOInfmQNjsgchNWLXmdfK6gyioAu/6uKrsm1kWLAciKuCuey5nYuXAh234bdmZ6INIUw4E/Ix49xtjCmXfzLL8nY/ktdgnAKwxxgIoXIyqmAOwvIqfiN0ALNd21HYBO9XXGMAdnZTYyHWzWjQAAAAASUVORK5CYII="; - const HATS_SPRITE_SHEET = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAAMCAYAAAA+ht7fAAAAAXNSR0IArs4c6QAAATxJREFUSIljYBgFo2AUjIJRMHgBI7qAgqDqfxj7wfvbWNVAwX8y5P4jsRmR+LjMIRX8xyKGYjYTuQYfPnsJ2YL/yGw0ORSwtzMCbkZ/mDVRlikIqv5Hjgh84LONDcNnPT2G/6f54fYgy7Pg0giNXWLA/5a6dgYGBgaGmqZKohwF8/Sls48JqoV59MWXJwwcrJz/f/z+jj81fPrE8O/HD4bpvpwM/08zMDCafkSRxvDwGml2CINHloGBgYHB5DF2R9148JRh9trtDC8vXmBgYGBgePfpDUNRQTGDpq0Lw40HT9GVwwPi9SGEeZKY8hieISHgMQC6Z1EswJJ3caqFObKmrYeB48dvhnef3sAFucQkGVqqStDV/0dKyigAFsuFq47idM+LL08w9OGIaYJ5mJLCglDyxQggEtXTBAAAgRd0Slay6H4AAAAASUVORK5CYII="; + const HATS_SPRITE_SHEET = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAAMCAYAAAA+ht7fAAAAAXNSR0IArs4c6QAAAT5JREFUSIljYBgFo2AUjIJRMHgBI7qAgqDqfxj7wfvbWNVAwX8y5P4jsRmR+LjMIQf8R+OjmM1ErqGHz15CNvw/MhtNDgXs7YyAm9EfZk2UZQqCqv+RIwKfuxgYGBg+6+kx/D/NjyIGAyy4dEJjlxjwv6WunYGBgYGhpqmSGEfBPX3p7GOCamEeffHlCQMHK+f/H7+/400N/+3tGT49f84w3ZeT4f9pBgZG048o8hgeXiPNDmHwyDIwMDAwmDzG7qgbD54yzF67neHlxQsMDAwMDO8+vWEoKihm0LR1Ybjx4CmGO2CM14cQ5kliymN4hoSAxwDonkWxAEvexakW5siath4Gjh+/Gd59egMX5BKTZGipKkFX/x8pKaMAWCwXrjqK0z0vvjzB0IcjprGlMEacHBIBoeSLEUAkqqcJAAAmBnNJoDeWTQAAAABJRU5ErkJggg=="; // Element IDs const FIELD_GUIDE_ID = "birb-field-guide"; const FEATHER_ID = "birb-feather"; + const WARDROBE_ID = "birb-wardrobe"; const DEFAULT_BIRD = "bluebird"; @@ -1961,6 +2000,7 @@ const menuItems = [ new MenuItem(`Pet ${birdBirb()}`, pet), new MenuItem("Field Guide", insertFieldGuide), + new MenuItem("Wardrobe", insertWardrobe), new ConditionalMenuItem("Sticky Note", () => createNewStickyNote(stickyNotes, save, deleteStickyNote), () => getContext().areStickyNotesEnabled()), new MenuItem(`Hide ${birdBirb()}`, () => birb.setVisible(false)), new DebugMenuItem("Freeze/Unfreeze", () => { @@ -2448,6 +2488,8 @@ if (document.querySelector("#" + FIELD_GUIDE_ID)) { return; } + // Remove wardrobe if open + removeWardrobe(); const contentContainer = document.createElement("div"); const content = makeElement("birb-grid-content"); @@ -2528,6 +2570,96 @@ } } + function insertWardrobe() { + console.log("Inserting wardrobe"); + if (document.querySelector("#" + WARDROBE_ID)) { + return; + } + // Remove field guide if open + removeFieldGuide(); + + const contentContainer = document.createElement("div"); + const content = makeElement("birb-grid-content"); + const description = makeElement("birb-field-guide-description"); + contentContainer.appendChild(content); + contentContainer.appendChild(description); + + const wardrobe = createWindow( + WARDROBE_ID, + "Wardrobe", + contentContainer + ); + + const generateDescription = (/** @type {string} */ hat) => { + const metadata = HAT_METADATA[hat] ?? { name: "Unknown Hat", description: "todo" }; + + const boldName = document.createElement("b"); + boldName.textContent = metadata.name; + + const spacer = document.createElement("div"); + spacer.style.height = "0.3em"; + + const descText = document.createTextNode(metadata.description); + + const fragment = document.createDocumentFragment(); + fragment.appendChild(boldName); + fragment.appendChild(spacer); + fragment.appendChild(descText); + + return fragment; + }; + + description.appendChild(generateDescription(currentHat)); + for (const hat of Object.values(HAT)) { + const hatElement = makeElement("birb-grid-item"); + if (hat === currentHat) { + hatElement.classList.add("birb-grid-item-selected"); + } + const hatCanvas = document.createElement("canvas"); + hatCanvas.width = SPRITE_WIDTH * CANVAS_PIXEL_SIZE; + hatCanvas.height = SPRITE_HEIGHT * CANVAS_PIXEL_SIZE; + const hatCtx = hatCanvas.getContext("2d"); + if (!hatCtx) { + return; + } + console.log(hat); + birb.getFrames().base.draw( + hatCtx, + Directions.RIGHT, + CANVAS_PIXEL_SIZE, + SPECIES[currentSpecies].colors, + [...SPECIES[currentSpecies].tags, hat] + ); + hatElement.appendChild(hatCanvas); + content.appendChild(hatElement); + { + onClick(hatElement, () => { + switchHat(hat); + document.querySelectorAll(".birb-grid-item").forEach((element) => { + element.classList.remove("birb-grid-item-selected"); + }); + hatElement.classList.add("birb-grid-item-selected"); + }); + } + hatElement.addEventListener("mouseover", () => { + description.textContent = ""; + description.appendChild(generateDescription(hat)); + }); + hatElement.addEventListener("mouseout", () => { + description.textContent = ""; + description.appendChild(generateDescription(currentHat)); + }); + } + centerElement(wardrobe); + } + + function removeWardrobe() { + const wardrobe = document.querySelector("#" + WARDROBE_ID); + if (wardrobe) { + wardrobe.remove(); + } + } + /** * @param {string} type */ @@ -2538,6 +2670,14 @@ save(); } + /** + * @param {string} hat + */ + function switchHat(hat) { + currentHat = hat; + save(); + } + /** * Update the birds location from the start to the target location on a parabolic path * @param {number} speed The speed of the bird along the path diff --git a/dist/obsidian/main.js b/dist/obsidian/main.js index fc27476..ed55867 100644 --- a/dist/obsidian/main.js +++ b/dist/obsidian/main.js @@ -623,6 +623,33 @@ module.exports = class PocketBird extends Plugin { FEZ: "fez", }; + const HAT_METADATA = { + [HAT.NONE]: { + name: "Invisible Hat", + description: "It's like you're wearing nothing at all!" + }, + [HAT.TOP_HAT]: { + name: "Top Hat", + description: "For that classy, sophisticated look." + }, + [HAT.VIKING_HELMET]: { + name: "Viking Helmet", + description: "Sure, vikings never actually wore this style of helmet, but why let facts get in the way of good fashion?" + }, + [HAT.COWBOY_HAT]: { + name: "Cowboy Hat", + description: "You can't jam with the console cowboys without the appropriate attire." + }, + [HAT.BOWLER_HAT]: { + name: "Bowler Hat", + description: "For that authentic, Victorian look!" + }, + [HAT.FEZ]: { + name: "Fez", + description: "It's a fez. Fezzes are cool." + }, + }; + /** * @param {string[][]} spriteSheet * @returns {{ base: Layer[], down: Layer[] }} @@ -1795,9 +1822,20 @@ module.exports = class PocketBird extends Plugin { width: 322px !important; } +#birb-wardrobe { + width: calc(322px - 64px - 14px) !important; +} + +#birb-field-guide .birb-grid-content { + grid-template-rows: repeat(3, auto); +} + +#birb-wardrobe .birb-grid-content { + grid-template-rows: repeat(2, auto); +} + .birb-grid-content { display: grid; - grid-template-rows: repeat(3, auto); grid-auto-flow: column; gap: 10px; padding-top: 8px; @@ -1924,11 +1962,12 @@ module.exports = class PocketBird extends Plugin { }`; const SPRITE_SHEET = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAUAAAAAgCAYAAABjE6FEAAAAAXNSR0IArs4c6QAABD9JREFUeJztnT9rFEEYh3+TWATE7hDcsxW7CBbmA0Qs0uSuSiloYSBgIRhCPkCQFIKCYNBKK6szjZWpbEyTziLY5k6RAwsjpDGvRXbWubmd3btzd2c293vgyGRvb9/Z25ln39l/BxBCCCGEkOlC+a4ACR8REdd7Sim2IVJb2HhrgE8B6djtZhMA0Ol2B8pV1IEQMqVITCuKpBVFQ+UsORYVvxVF8nl+XmRtbahcdnxCymTGdwVIPu1mExuNBjrt9lC5SvY/fcJGo5GUCak7FGCN8CWgTreLJ/3+wLQn/X4yBCaEkFIwh8Cf5+eTV1VD4LQ6VBmbEBIAkkLVsX0KyKwD5UfIlCEiZwf/jb9Vx/ctIB/yJ6RMLviuQN3Yv3HDS1yllBIR8XnpCS93IWRK0ZmPzv6YBRFSf7hHHwNTesyGqsfe6XAbkP+FDYjUAi0/7TwRqVyAFPCUknYGlENA4gHZ6bYEgLcTQHHsoNs/++no5F4Ibe55zRdy7lEtEgqYAMBOt6WLXk4AKaWSOoSW/dn9wkc/rSOZZ4HNL9NofNDTRMScp5QGYQ99jOkQEQmtIZLyeNB873Vb+xTwKJhdYWW7l0yj/9w4BWiK53DlPvAI2L79Onl/p9seOB5ThoxCEDAhGt8CzkCUUon0zjtXZpV8+yOFbAvnQkREZi5GA9PuPevhw+oMll6eAgCOf34DALxbjwb2MkXIaEjAGBTwraU2HjTf63kLi0tIzRCX+L4e/cLB8+teThiVxZVZJUsvT/FhdQZFSDBTgIgFdP9VegqtBYhYgjBklBpsjI3gW8AkbFa2e/JuPZr27Zwrv1CH66HgHALrOw9c75vyg3XMIY1Jhsmnv3tDAtbys2Pbw3HXOo0am4TDye6izC3vKV0GgLllv/LzLeCV7Z7XA3uu+HEiVJt+llnRWFg42V3E2o+PAIAXl28DAO4evh0pwNejXwAwUSqu46dloLaANToTTVkWQAnWln/i26t8+6ULuPp6mLgEZPa3kkXkzD7rJMGRBWgzt7yHmw8Pce3qpdTPWhtiIgH5FjAhmlDEpznZXRSzD9j9rQIBiav/T4UAYUgwDVt8mCD78i1gQkKmv7Ugaxc6wODIp6r27RQgaiTBXAEiPq5nS+j4yzEAoLG57/rsvyATSse3gAkJnf7WQtLA73x/A5y1fe8SNE9MhtzvciuWJiEtvzQam/uFrbhvARNCchGdhNgi1BIMuf+N9DzAeCXQ31rInK9I+SHjTLQpYLtORdeBEJKJOnh+/azDOUQYMrkC1BLKk2CZ4tGxkSK8qupACHGicDb0HhDhucJ8Gkbn6ePkqRi6XOYDCqwbvVPjl10HQkg+9hNzQu+PY/0splIKnaePk//NMkrMuvRys+Iz8yMkDOKbEYAa9MexfhPEHIra5SrIix/6l03IeadufXDs6/KcC6pgxX3HJ4ScL/4CWsLSrzMo7i0AAAAASUVORK5CYII="; const FEATHER_SPRITE_SHEET = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAARhJREFUWIXtlbENwjAQRf8hSiZIRQ+9WQNRUFIAKzACBSsAA1Ag1mAABqCCBomG3hQQ9OMEx4ZDNH5SikSJ3/fZ5wCJRCKRSPwZ0RzMWmtLAhGvQyUAi9mXP/aFaGjJRQQiguHihMvcFMJUVUYlAMuHixPGy4en1WmVQqgHYHkuZjiEj6a2/LjtYzTY0eiZbgC37Mxh1UN3sn/dr6cCz/LHB/DJj9s+2oMdbtdz6TtfFwQHcMvOInfmQNjsgchNWLXmdfK6gyioAu/6uKrsm1kWLAciKuCuey5nYuXAh234bdmZ6INIUw4E/Ix49xtjCmXfzLL8nY/ktdgnAKwxxgIoXIyqmAOwvIqfiN0ALNd21HYBO9XXGMAdnZTYyHWzWjQAAAAASUVORK5CYII="; - const HATS_SPRITE_SHEET = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAAMCAYAAAA+ht7fAAAAAXNSR0IArs4c6QAAATxJREFUSIljYBgFo2AUjIJRMHgBI7qAgqDqfxj7wfvbWNVAwX8y5P4jsRmR+LjMIRX8xyKGYjYTuQYfPnsJ2YL/yGw0ORSwtzMCbkZ/mDVRlikIqv5Hjgh84LONDcNnPT2G/6f54fYgy7Pg0giNXWLA/5a6dgYGBgaGmqZKohwF8/Sls48JqoV59MWXJwwcrJz/f/z+jj81fPrE8O/HD4bpvpwM/08zMDCafkSRxvDwGml2CINHloGBgYHB5DF2R9148JRh9trtDC8vXmBgYGBgePfpDUNRQTGDpq0Lw40HT9GVwwPi9SGEeZKY8hieISHgMQC6Z1EswJJ3caqFObKmrYeB48dvhnef3sAFucQkGVqqStDV/0dKyigAFsuFq47idM+LL08w9OGIaYJ5mJLCglDyxQggEtXTBAAAgRd0Slay6H4AAAAASUVORK5CYII="; + const HATS_SPRITE_SHEET = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAAMCAYAAAA+ht7fAAAAAXNSR0IArs4c6QAAAT5JREFUSIljYBgFo2AUjIJRMHgBI7qAgqDqfxj7wfvbWNVAwX8y5P4jsRmR+LjMIQf8R+OjmM1ErqGHz15CNvw/MhtNDgXs7YyAm9EfZk2UZQqCqv+RIwKfuxgYGBg+6+kx/D/NjyIGAyy4dEJjlxjwv6WunYGBgYGhpqmSGEfBPX3p7GOCamEeffHlCQMHK+f/H7+/400N/+3tGT49f84w3ZeT4f9pBgZG048o8hgeXiPNDmHwyDIwMDAwmDzG7qgbD54yzF67neHlxQsMDAwMDO8+vWEoKihm0LR1Ybjx4CmGO2CM14cQ5kliymN4hoSAxwDonkWxAEvexakW5siath4Gjh+/Gd59egMX5BKTZGipKkFX/x8pKaMAWCwXrjqK0z0vvjzB0IcjprGlMEacHBIBoeSLEUAkqqcJAAAmBnNJoDeWTQAAAABJRU5ErkJggg=="; // Element IDs const FIELD_GUIDE_ID = "birb-field-guide"; const FEATHER_ID = "birb-feather"; + const WARDROBE_ID = "birb-wardrobe"; const DEFAULT_BIRD = "bluebird"; @@ -2004,6 +2043,7 @@ module.exports = class PocketBird extends Plugin { const menuItems = [ new MenuItem(`Pet ${birdBirb()}`, pet), new MenuItem("Field Guide", insertFieldGuide), + new MenuItem("Wardrobe", insertWardrobe), new ConditionalMenuItem("Sticky Note", () => createNewStickyNote(stickyNotes, save, deleteStickyNote), () => getContext().areStickyNotesEnabled()), new MenuItem(`Hide ${birdBirb()}`, () => birb.setVisible(false)), new DebugMenuItem("Freeze/Unfreeze", () => { @@ -2491,6 +2531,8 @@ module.exports = class PocketBird extends Plugin { if (document.querySelector("#" + FIELD_GUIDE_ID)) { return; } + // Remove wardrobe if open + removeWardrobe(); const contentContainer = document.createElement("div"); const content = makeElement("birb-grid-content"); @@ -2571,6 +2613,96 @@ module.exports = class PocketBird extends Plugin { } } + function insertWardrobe() { + console.log("Inserting wardrobe"); + if (document.querySelector("#" + WARDROBE_ID)) { + return; + } + // Remove field guide if open + removeFieldGuide(); + + const contentContainer = document.createElement("div"); + const content = makeElement("birb-grid-content"); + const description = makeElement("birb-field-guide-description"); + contentContainer.appendChild(content); + contentContainer.appendChild(description); + + const wardrobe = createWindow( + WARDROBE_ID, + "Wardrobe", + contentContainer + ); + + const generateDescription = (/** @type {string} */ hat) => { + const metadata = HAT_METADATA[hat] ?? { name: "Unknown Hat", description: "todo" }; + + const boldName = document.createElement("b"); + boldName.textContent = metadata.name; + + const spacer = document.createElement("div"); + spacer.style.height = "0.3em"; + + const descText = document.createTextNode(metadata.description); + + const fragment = document.createDocumentFragment(); + fragment.appendChild(boldName); + fragment.appendChild(spacer); + fragment.appendChild(descText); + + return fragment; + }; + + description.appendChild(generateDescription(currentHat)); + for (const hat of Object.values(HAT)) { + const hatElement = makeElement("birb-grid-item"); + if (hat === currentHat) { + hatElement.classList.add("birb-grid-item-selected"); + } + const hatCanvas = document.createElement("canvas"); + hatCanvas.width = SPRITE_WIDTH * CANVAS_PIXEL_SIZE; + hatCanvas.height = SPRITE_HEIGHT * CANVAS_PIXEL_SIZE; + const hatCtx = hatCanvas.getContext("2d"); + if (!hatCtx) { + return; + } + console.log(hat); + birb.getFrames().base.draw( + hatCtx, + Directions.RIGHT, + CANVAS_PIXEL_SIZE, + SPECIES[currentSpecies].colors, + [...SPECIES[currentSpecies].tags, hat] + ); + hatElement.appendChild(hatCanvas); + content.appendChild(hatElement); + { + onClick(hatElement, () => { + switchHat(hat); + document.querySelectorAll(".birb-grid-item").forEach((element) => { + element.classList.remove("birb-grid-item-selected"); + }); + hatElement.classList.add("birb-grid-item-selected"); + }); + } + hatElement.addEventListener("mouseover", () => { + description.textContent = ""; + description.appendChild(generateDescription(hat)); + }); + hatElement.addEventListener("mouseout", () => { + description.textContent = ""; + description.appendChild(generateDescription(currentHat)); + }); + } + centerElement(wardrobe); + } + + function removeWardrobe() { + const wardrobe = document.querySelector("#" + WARDROBE_ID); + if (wardrobe) { + wardrobe.remove(); + } + } + /** * @param {string} type */ @@ -2581,6 +2713,14 @@ module.exports = class PocketBird extends Plugin { save(); } + /** + * @param {string} hat + */ + function switchHat(hat) { + currentHat = hat; + save(); + } + /** * Update the birds location from the start to the target location on a parabolic path * @param {number} speed The speed of the bird along the path diff --git a/dist/userscript/birb.user.js b/dist/userscript/birb.user.js index dfc280a..443e645 100644 --- a/dist/userscript/birb.user.js +++ b/dist/userscript/birb.user.js @@ -632,6 +632,33 @@ FEZ: "fez", }; + const HAT_METADATA = { + [HAT.NONE]: { + name: "Invisible Hat", + description: "It's like you're wearing nothing at all!" + }, + [HAT.TOP_HAT]: { + name: "Top Hat", + description: "For that classy, sophisticated look." + }, + [HAT.VIKING_HELMET]: { + name: "Viking Helmet", + description: "Sure, vikings never actually wore this style of helmet, but why let facts get in the way of good fashion?" + }, + [HAT.COWBOY_HAT]: { + name: "Cowboy Hat", + description: "You can't jam with the console cowboys without the appropriate attire." + }, + [HAT.BOWLER_HAT]: { + name: "Bowler Hat", + description: "For that authentic, Victorian look!" + }, + [HAT.FEZ]: { + name: "Fez", + description: "It's a fez. Fezzes are cool." + }, + }; + /** * @param {string[][]} spriteSheet * @returns {{ base: Layer[], down: Layer[] }} @@ -1757,9 +1784,20 @@ width: 322px !important; } +#birb-wardrobe { + width: calc(322px - 64px - 14px) !important; +} + +#birb-field-guide .birb-grid-content { + grid-template-rows: repeat(3, auto); +} + +#birb-wardrobe .birb-grid-content { + grid-template-rows: repeat(2, auto); +} + .birb-grid-content { display: grid; - grid-template-rows: repeat(3, auto); grid-auto-flow: column; gap: 10px; padding-top: 8px; @@ -1886,11 +1924,12 @@ }`; const SPRITE_SHEET = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAUAAAAAgCAYAAABjE6FEAAAAAXNSR0IArs4c6QAABD9JREFUeJztnT9rFEEYh3+TWATE7hDcsxW7CBbmA0Qs0uSuSiloYSBgIRhCPkCQFIKCYNBKK6szjZWpbEyTziLY5k6RAwsjpDGvRXbWubmd3btzd2c293vgyGRvb9/Z25ln39l/BxBCCCGEkOlC+a4ACR8REdd7Sim2IVJb2HhrgE8B6djtZhMA0Ol2B8pV1IEQMqVITCuKpBVFQ+UsORYVvxVF8nl+XmRtbahcdnxCymTGdwVIPu1mExuNBjrt9lC5SvY/fcJGo5GUCak7FGCN8CWgTreLJ/3+wLQn/X4yBCaEkFIwh8Cf5+eTV1VD4LQ6VBmbEBIAkkLVsX0KyKwD5UfIlCEiZwf/jb9Vx/ctIB/yJ6RMLviuQN3Yv3HDS1yllBIR8XnpCS93IWRK0ZmPzv6YBRFSf7hHHwNTesyGqsfe6XAbkP+FDYjUAi0/7TwRqVyAFPCUknYGlENA4gHZ6bYEgLcTQHHsoNs/++no5F4Ibe55zRdy7lEtEgqYAMBOt6WLXk4AKaWSOoSW/dn9wkc/rSOZZ4HNL9NofNDTRMScp5QGYQ99jOkQEQmtIZLyeNB873Vb+xTwKJhdYWW7l0yj/9w4BWiK53DlPvAI2L79Onl/p9seOB5ThoxCEDAhGt8CzkCUUon0zjtXZpV8+yOFbAvnQkREZi5GA9PuPevhw+oMll6eAgCOf34DALxbjwb2MkXIaEjAGBTwraU2HjTf63kLi0tIzRCX+L4e/cLB8+teThiVxZVZJUsvT/FhdQZFSDBTgIgFdP9VegqtBYhYgjBklBpsjI3gW8AkbFa2e/JuPZr27Zwrv1CH66HgHALrOw9c75vyg3XMIY1Jhsmnv3tDAtbys2Pbw3HXOo0am4TDye6izC3vKV0GgLllv/LzLeCV7Z7XA3uu+HEiVJt+llnRWFg42V3E2o+PAIAXl28DAO4evh0pwNejXwAwUSqu46dloLaANToTTVkWQAnWln/i26t8+6ULuPp6mLgEZPa3kkXkzD7rJMGRBWgzt7yHmw8Pce3qpdTPWhtiIgH5FjAhmlDEpznZXRSzD9j9rQIBiav/T4UAYUgwDVt8mCD78i1gQkKmv7Ugaxc6wODIp6r27RQgaiTBXAEiPq5nS+j4yzEAoLG57/rsvyATSse3gAkJnf7WQtLA73x/A5y1fe8SNE9MhtzvciuWJiEtvzQam/uFrbhvARNCchGdhNgi1BIMuf+N9DzAeCXQ31rInK9I+SHjTLQpYLtORdeBEJKJOnh+/azDOUQYMrkC1BLKk2CZ4tGxkSK8qupACHGicDb0HhDhucJ8Gkbn6ePkqRi6XOYDCqwbvVPjl10HQkg+9hNzQu+PY/0splIKnaePk//NMkrMuvRys+Iz8yMkDOKbEYAa9MexfhPEHIra5SrIix/6l03IeadufXDs6/KcC6pgxX3HJ4ScL/4CWsLSrzMo7i0AAAAASUVORK5CYII="; const FEATHER_SPRITE_SHEET = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAARhJREFUWIXtlbENwjAQRf8hSiZIRQ+9WQNRUFIAKzACBSsAA1Ag1mAABqCCBomG3hQQ9OMEx4ZDNH5SikSJ3/fZ5wCJRCKRSPwZ0RzMWmtLAhGvQyUAi9mXP/aFaGjJRQQiguHihMvcFMJUVUYlAMuHixPGy4en1WmVQqgHYHkuZjiEj6a2/LjtYzTY0eiZbgC37Mxh1UN3sn/dr6cCz/LHB/DJj9s+2oMdbtdz6TtfFwQHcMvOInfmQNjsgchNWLXmdfK6gyioAu/6uKrsm1kWLAciKuCuey5nYuXAh234bdmZ6INIUw4E/Ix49xtjCmXfzLL8nY/ktdgnAKwxxgIoXIyqmAOwvIqfiN0ALNd21HYBO9XXGMAdnZTYyHWzWjQAAAAASUVORK5CYII="; - const HATS_SPRITE_SHEET = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAAMCAYAAAA+ht7fAAAAAXNSR0IArs4c6QAAATxJREFUSIljYBgFo2AUjIJRMHgBI7qAgqDqfxj7wfvbWNVAwX8y5P4jsRmR+LjMIRX8xyKGYjYTuQYfPnsJ2YL/yGw0ORSwtzMCbkZ/mDVRlikIqv5Hjgh84LONDcNnPT2G/6f54fYgy7Pg0giNXWLA/5a6dgYGBgaGmqZKohwF8/Sls48JqoV59MWXJwwcrJz/f/z+jj81fPrE8O/HD4bpvpwM/08zMDCafkSRxvDwGml2CINHloGBgYHB5DF2R9148JRh9trtDC8vXmBgYGBgePfpDUNRQTGDpq0Lw40HT9GVwwPi9SGEeZKY8hieISHgMQC6Z1EswJJ3caqFObKmrYeB48dvhnef3sAFucQkGVqqStDV/0dKyigAFsuFq47idM+LL08w9OGIaYJ5mJLCglDyxQggEtXTBAAAgRd0Slay6H4AAAAASUVORK5CYII="; + const HATS_SPRITE_SHEET = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAAMCAYAAAA+ht7fAAAAAXNSR0IArs4c6QAAAT5JREFUSIljYBgFo2AUjIJRMHgBI7qAgqDqfxj7wfvbWNVAwX8y5P4jsRmR+LjMIQf8R+OjmM1ErqGHz15CNvw/MhtNDgXs7YyAm9EfZk2UZQqCqv+RIwKfuxgYGBg+6+kx/D/NjyIGAyy4dEJjlxjwv6WunYGBgYGhpqmSGEfBPX3p7GOCamEeffHlCQMHK+f/H7+/400N/+3tGT49f84w3ZeT4f9pBgZG048o8hgeXiPNDmHwyDIwMDAwmDzG7qgbD54yzF67neHlxQsMDAwMDO8+vWEoKihm0LR1Ybjx4CmGO2CM14cQ5kliymN4hoSAxwDonkWxAEvexakW5siath4Gjh+/Gd59egMX5BKTZGipKkFX/x8pKaMAWCwXrjqK0z0vvjzB0IcjprGlMEacHBIBoeSLEUAkqqcJAAAmBnNJoDeWTQAAAABJRU5ErkJggg=="; // Element IDs const FIELD_GUIDE_ID = "birb-field-guide"; const FEATHER_ID = "birb-feather"; + const WARDROBE_ID = "birb-wardrobe"; const DEFAULT_BIRD = "bluebird"; @@ -1966,6 +2005,7 @@ const menuItems = [ new MenuItem(`Pet ${birdBirb()}`, pet), new MenuItem("Field Guide", insertFieldGuide), + new MenuItem("Wardrobe", insertWardrobe), new ConditionalMenuItem("Sticky Note", () => createNewStickyNote(stickyNotes, save, deleteStickyNote), () => getContext().areStickyNotesEnabled()), new MenuItem(`Hide ${birdBirb()}`, () => birb.setVisible(false)), new DebugMenuItem("Freeze/Unfreeze", () => { @@ -2453,6 +2493,8 @@ if (document.querySelector("#" + FIELD_GUIDE_ID)) { return; } + // Remove wardrobe if open + removeWardrobe(); const contentContainer = document.createElement("div"); const content = makeElement("birb-grid-content"); @@ -2533,6 +2575,96 @@ } } + function insertWardrobe() { + console.log("Inserting wardrobe"); + if (document.querySelector("#" + WARDROBE_ID)) { + return; + } + // Remove field guide if open + removeFieldGuide(); + + const contentContainer = document.createElement("div"); + const content = makeElement("birb-grid-content"); + const description = makeElement("birb-field-guide-description"); + contentContainer.appendChild(content); + contentContainer.appendChild(description); + + const wardrobe = createWindow( + WARDROBE_ID, + "Wardrobe", + contentContainer + ); + + const generateDescription = (/** @type {string} */ hat) => { + const metadata = HAT_METADATA[hat] ?? { name: "Unknown Hat", description: "todo" }; + + const boldName = document.createElement("b"); + boldName.textContent = metadata.name; + + const spacer = document.createElement("div"); + spacer.style.height = "0.3em"; + + const descText = document.createTextNode(metadata.description); + + const fragment = document.createDocumentFragment(); + fragment.appendChild(boldName); + fragment.appendChild(spacer); + fragment.appendChild(descText); + + return fragment; + }; + + description.appendChild(generateDescription(currentHat)); + for (const hat of Object.values(HAT)) { + const hatElement = makeElement("birb-grid-item"); + if (hat === currentHat) { + hatElement.classList.add("birb-grid-item-selected"); + } + const hatCanvas = document.createElement("canvas"); + hatCanvas.width = SPRITE_WIDTH * CANVAS_PIXEL_SIZE; + hatCanvas.height = SPRITE_HEIGHT * CANVAS_PIXEL_SIZE; + const hatCtx = hatCanvas.getContext("2d"); + if (!hatCtx) { + return; + } + console.log(hat); + birb.getFrames().base.draw( + hatCtx, + Directions.RIGHT, + CANVAS_PIXEL_SIZE, + SPECIES[currentSpecies].colors, + [...SPECIES[currentSpecies].tags, hat] + ); + hatElement.appendChild(hatCanvas); + content.appendChild(hatElement); + { + onClick(hatElement, () => { + switchHat(hat); + document.querySelectorAll(".birb-grid-item").forEach((element) => { + element.classList.remove("birb-grid-item-selected"); + }); + hatElement.classList.add("birb-grid-item-selected"); + }); + } + hatElement.addEventListener("mouseover", () => { + description.textContent = ""; + description.appendChild(generateDescription(hat)); + }); + hatElement.addEventListener("mouseout", () => { + description.textContent = ""; + description.appendChild(generateDescription(currentHat)); + }); + } + centerElement(wardrobe); + } + + function removeWardrobe() { + const wardrobe = document.querySelector("#" + WARDROBE_ID); + if (wardrobe) { + wardrobe.remove(); + } + } + /** * @param {string} type */ @@ -2543,6 +2675,14 @@ save(); } + /** + * @param {string} hat + */ + function switchHat(hat) { + currentHat = hat; + save(); + } + /** * Update the birds location from the start to the target location on a parabolic path * @param {number} speed The speed of the bird along the path diff --git a/dist/web/birb.embed.js b/dist/web/birb.embed.js index 294f737..72b9f6d 100644 --- a/dist/web/birb.embed.js +++ b/dist/web/birb.embed.js @@ -618,6 +618,33 @@ FEZ: "fez", }; + const HAT_METADATA = { + [HAT.NONE]: { + name: "Invisible Hat", + description: "It's like you're wearing nothing at all!" + }, + [HAT.TOP_HAT]: { + name: "Top Hat", + description: "For that classy, sophisticated look." + }, + [HAT.VIKING_HELMET]: { + name: "Viking Helmet", + description: "Sure, vikings never actually wore this style of helmet, but why let facts get in the way of good fashion?" + }, + [HAT.COWBOY_HAT]: { + name: "Cowboy Hat", + description: "You can't jam with the console cowboys without the appropriate attire." + }, + [HAT.BOWLER_HAT]: { + name: "Bowler Hat", + description: "For that authentic, Victorian look!" + }, + [HAT.FEZ]: { + name: "Fez", + description: "It's a fez. Fezzes are cool." + }, + }; + /** * @param {string[][]} spriteSheet * @returns {{ base: Layer[], down: Layer[] }} @@ -1737,9 +1764,20 @@ width: 322px !important; } +#birb-wardrobe { + width: calc(322px - 64px - 14px) !important; +} + +#birb-field-guide .birb-grid-content { + grid-template-rows: repeat(3, auto); +} + +#birb-wardrobe .birb-grid-content { + grid-template-rows: repeat(2, auto); +} + .birb-grid-content { display: grid; - grid-template-rows: repeat(3, auto); grid-auto-flow: column; gap: 10px; padding-top: 8px; @@ -1866,11 +1904,12 @@ }`; const SPRITE_SHEET = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAUAAAAAgCAYAAABjE6FEAAAAAXNSR0IArs4c6QAABD9JREFUeJztnT9rFEEYh3+TWATE7hDcsxW7CBbmA0Qs0uSuSiloYSBgIRhCPkCQFIKCYNBKK6szjZWpbEyTziLY5k6RAwsjpDGvRXbWubmd3btzd2c293vgyGRvb9/Z25ln39l/BxBCCCGEkOlC+a4ACR8REdd7Sim2IVJb2HhrgE8B6djtZhMA0Ol2B8pV1IEQMqVITCuKpBVFQ+UsORYVvxVF8nl+XmRtbahcdnxCymTGdwVIPu1mExuNBjrt9lC5SvY/fcJGo5GUCak7FGCN8CWgTreLJ/3+wLQn/X4yBCaEkFIwh8Cf5+eTV1VD4LQ6VBmbEBIAkkLVsX0KyKwD5UfIlCEiZwf/jb9Vx/ctIB/yJ6RMLviuQN3Yv3HDS1yllBIR8XnpCS93IWRK0ZmPzv6YBRFSf7hHHwNTesyGqsfe6XAbkP+FDYjUAi0/7TwRqVyAFPCUknYGlENA4gHZ6bYEgLcTQHHsoNs/++no5F4Ibe55zRdy7lEtEgqYAMBOt6WLXk4AKaWSOoSW/dn9wkc/rSOZZ4HNL9NofNDTRMScp5QGYQ99jOkQEQmtIZLyeNB873Vb+xTwKJhdYWW7l0yj/9w4BWiK53DlPvAI2L79Onl/p9seOB5ThoxCEDAhGt8CzkCUUon0zjtXZpV8+yOFbAvnQkREZi5GA9PuPevhw+oMll6eAgCOf34DALxbjwb2MkXIaEjAGBTwraU2HjTf63kLi0tIzRCX+L4e/cLB8+teThiVxZVZJUsvT/FhdQZFSDBTgIgFdP9VegqtBYhYgjBklBpsjI3gW8AkbFa2e/JuPZr27Zwrv1CH66HgHALrOw9c75vyg3XMIY1Jhsmnv3tDAtbys2Pbw3HXOo0am4TDye6izC3vKV0GgLllv/LzLeCV7Z7XA3uu+HEiVJt+llnRWFg42V3E2o+PAIAXl28DAO4evh0pwNejXwAwUSqu46dloLaANToTTVkWQAnWln/i26t8+6ULuPp6mLgEZPa3kkXkzD7rJMGRBWgzt7yHmw8Pce3qpdTPWhtiIgH5FjAhmlDEpznZXRSzD9j9rQIBiav/T4UAYUgwDVt8mCD78i1gQkKmv7Ugaxc6wODIp6r27RQgaiTBXAEiPq5nS+j4yzEAoLG57/rsvyATSse3gAkJnf7WQtLA73x/A5y1fe8SNE9MhtzvciuWJiEtvzQam/uFrbhvARNCchGdhNgi1BIMuf+N9DzAeCXQ31rInK9I+SHjTLQpYLtORdeBEJKJOnh+/azDOUQYMrkC1BLKk2CZ4tGxkSK8qupACHGicDb0HhDhucJ8Gkbn6ePkqRi6XOYDCqwbvVPjl10HQkg+9hNzQu+PY/0splIKnaePk//NMkrMuvRys+Iz8yMkDOKbEYAa9MexfhPEHIra5SrIix/6l03IeadufXDs6/KcC6pgxX3HJ4ScL/4CWsLSrzMo7i0AAAAASUVORK5CYII="; const FEATHER_SPRITE_SHEET = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAARhJREFUWIXtlbENwjAQRf8hSiZIRQ+9WQNRUFIAKzACBSsAA1Ag1mAABqCCBomG3hQQ9OMEx4ZDNH5SikSJ3/fZ5wCJRCKRSPwZ0RzMWmtLAhGvQyUAi9mXP/aFaGjJRQQiguHihMvcFMJUVUYlAMuHixPGy4en1WmVQqgHYHkuZjiEj6a2/LjtYzTY0eiZbgC37Mxh1UN3sn/dr6cCz/LHB/DJj9s+2oMdbtdz6TtfFwQHcMvOInfmQNjsgchNWLXmdfK6gyioAu/6uKrsm1kWLAciKuCuey5nYuXAh234bdmZ6INIUw4E/Ix49xtjCmXfzLL8nY/ktdgnAKwxxgIoXIyqmAOwvIqfiN0ALNd21HYBO9XXGMAdnZTYyHWzWjQAAAAASUVORK5CYII="; - const HATS_SPRITE_SHEET = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAAMCAYAAAA+ht7fAAAAAXNSR0IArs4c6QAAATxJREFUSIljYBgFo2AUjIJRMHgBI7qAgqDqfxj7wfvbWNVAwX8y5P4jsRmR+LjMIRX8xyKGYjYTuQYfPnsJ2YL/yGw0ORSwtzMCbkZ/mDVRlikIqv5Hjgh84LONDcNnPT2G/6f54fYgy7Pg0giNXWLA/5a6dgYGBgaGmqZKohwF8/Sls48JqoV59MWXJwwcrJz/f/z+jj81fPrE8O/HD4bpvpwM/08zMDCafkSRxvDwGml2CINHloGBgYHB5DF2R9148JRh9trtDC8vXmBgYGBgePfpDUNRQTGDpq0Lw40HT9GVwwPi9SGEeZKY8hieISHgMQC6Z1EswJJ3caqFObKmrYeB48dvhnef3sAFucQkGVqqStDV/0dKyigAFsuFq47idM+LL08w9OGIaYJ5mJLCglDyxQggEtXTBAAAgRd0Slay6H4AAAAASUVORK5CYII="; + const HATS_SPRITE_SHEET = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAAMCAYAAAA+ht7fAAAAAXNSR0IArs4c6QAAAT5JREFUSIljYBgFo2AUjIJRMHgBI7qAgqDqfxj7wfvbWNVAwX8y5P4jsRmR+LjMIQf8R+OjmM1ErqGHz15CNvw/MhtNDgXs7YyAm9EfZk2UZQqCqv+RIwKfuxgYGBg+6+kx/D/NjyIGAyy4dEJjlxjwv6WunYGBgYGhpqmSGEfBPX3p7GOCamEeffHlCQMHK+f/H7+/400N/+3tGT49f84w3ZeT4f9pBgZG048o8hgeXiPNDmHwyDIwMDAwmDzG7qgbD54yzF67neHlxQsMDAwMDO8+vWEoKihm0LR1Ybjx4CmGO2CM14cQ5kliymN4hoSAxwDonkWxAEvexakW5siath4Gjh+/Gd59egMX5BKTZGipKkFX/x8pKaMAWCwXrjqK0z0vvjzB0IcjprGlMEacHBIBoeSLEUAkqqcJAAAmBnNJoDeWTQAAAABJRU5ErkJggg=="; // Element IDs const FIELD_GUIDE_ID = "birb-field-guide"; const FEATHER_ID = "birb-feather"; + const WARDROBE_ID = "birb-wardrobe"; const DEFAULT_BIRD = "bluebird"; @@ -1946,6 +1985,7 @@ const menuItems = [ new MenuItem(`Pet ${birdBirb()}`, pet), new MenuItem("Field Guide", insertFieldGuide), + new MenuItem("Wardrobe", insertWardrobe), new ConditionalMenuItem("Sticky Note", () => createNewStickyNote(stickyNotes, save, deleteStickyNote), () => getContext().areStickyNotesEnabled()), new MenuItem(`Hide ${birdBirb()}`, () => birb.setVisible(false)), new DebugMenuItem("Freeze/Unfreeze", () => { @@ -2433,6 +2473,8 @@ if (document.querySelector("#" + FIELD_GUIDE_ID)) { return; } + // Remove wardrobe if open + removeWardrobe(); const contentContainer = document.createElement("div"); const content = makeElement("birb-grid-content"); @@ -2513,6 +2555,96 @@ } } + function insertWardrobe() { + console.log("Inserting wardrobe"); + if (document.querySelector("#" + WARDROBE_ID)) { + return; + } + // Remove field guide if open + removeFieldGuide(); + + const contentContainer = document.createElement("div"); + const content = makeElement("birb-grid-content"); + const description = makeElement("birb-field-guide-description"); + contentContainer.appendChild(content); + contentContainer.appendChild(description); + + const wardrobe = createWindow( + WARDROBE_ID, + "Wardrobe", + contentContainer + ); + + const generateDescription = (/** @type {string} */ hat) => { + const metadata = HAT_METADATA[hat] ?? { name: "Unknown Hat", description: "todo" }; + + const boldName = document.createElement("b"); + boldName.textContent = metadata.name; + + const spacer = document.createElement("div"); + spacer.style.height = "0.3em"; + + const descText = document.createTextNode(metadata.description); + + const fragment = document.createDocumentFragment(); + fragment.appendChild(boldName); + fragment.appendChild(spacer); + fragment.appendChild(descText); + + return fragment; + }; + + description.appendChild(generateDescription(currentHat)); + for (const hat of Object.values(HAT)) { + const hatElement = makeElement("birb-grid-item"); + if (hat === currentHat) { + hatElement.classList.add("birb-grid-item-selected"); + } + const hatCanvas = document.createElement("canvas"); + hatCanvas.width = SPRITE_WIDTH * CANVAS_PIXEL_SIZE; + hatCanvas.height = SPRITE_HEIGHT * CANVAS_PIXEL_SIZE; + const hatCtx = hatCanvas.getContext("2d"); + if (!hatCtx) { + return; + } + console.log(hat); + birb.getFrames().base.draw( + hatCtx, + Directions.RIGHT, + CANVAS_PIXEL_SIZE, + SPECIES[currentSpecies].colors, + [...SPECIES[currentSpecies].tags, hat] + ); + hatElement.appendChild(hatCanvas); + content.appendChild(hatElement); + { + onClick(hatElement, () => { + switchHat(hat); + document.querySelectorAll(".birb-grid-item").forEach((element) => { + element.classList.remove("birb-grid-item-selected"); + }); + hatElement.classList.add("birb-grid-item-selected"); + }); + } + hatElement.addEventListener("mouseover", () => { + description.textContent = ""; + description.appendChild(generateDescription(hat)); + }); + hatElement.addEventListener("mouseout", () => { + description.textContent = ""; + description.appendChild(generateDescription(currentHat)); + }); + } + centerElement(wardrobe); + } + + function removeWardrobe() { + const wardrobe = document.querySelector("#" + WARDROBE_ID); + if (wardrobe) { + wardrobe.remove(); + } + } + /** * @param {string} type */ @@ -2523,6 +2655,14 @@ save(); } + /** + * @param {string} hat + */ + function switchHat(hat) { + currentHat = hat; + save(); + } + /** * Update the birds location from the start to the target location on a parabolic path * @param {number} speed The speed of the bird along the path diff --git a/dist/web/birb.js b/dist/web/birb.js index 294f737..72b9f6d 100644 --- a/dist/web/birb.js +++ b/dist/web/birb.js @@ -618,6 +618,33 @@ FEZ: "fez", }; + const HAT_METADATA = { + [HAT.NONE]: { + name: "Invisible Hat", + description: "It's like you're wearing nothing at all!" + }, + [HAT.TOP_HAT]: { + name: "Top Hat", + description: "For that classy, sophisticated look." + }, + [HAT.VIKING_HELMET]: { + name: "Viking Helmet", + description: "Sure, vikings never actually wore this style of helmet, but why let facts get in the way of good fashion?" + }, + [HAT.COWBOY_HAT]: { + name: "Cowboy Hat", + description: "You can't jam with the console cowboys without the appropriate attire." + }, + [HAT.BOWLER_HAT]: { + name: "Bowler Hat", + description: "For that authentic, Victorian look!" + }, + [HAT.FEZ]: { + name: "Fez", + description: "It's a fez. Fezzes are cool." + }, + }; + /** * @param {string[][]} spriteSheet * @returns {{ base: Layer[], down: Layer[] }} @@ -1737,9 +1764,20 @@ width: 322px !important; } +#birb-wardrobe { + width: calc(322px - 64px - 14px) !important; +} + +#birb-field-guide .birb-grid-content { + grid-template-rows: repeat(3, auto); +} + +#birb-wardrobe .birb-grid-content { + grid-template-rows: repeat(2, auto); +} + .birb-grid-content { display: grid; - grid-template-rows: repeat(3, auto); grid-auto-flow: column; gap: 10px; padding-top: 8px; @@ -1866,11 +1904,12 @@ }`; const SPRITE_SHEET = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAUAAAAAgCAYAAABjE6FEAAAAAXNSR0IArs4c6QAABD9JREFUeJztnT9rFEEYh3+TWATE7hDcsxW7CBbmA0Qs0uSuSiloYSBgIRhCPkCQFIKCYNBKK6szjZWpbEyTziLY5k6RAwsjpDGvRXbWubmd3btzd2c293vgyGRvb9/Z25ln39l/BxBCCCGEkOlC+a4ACR8REdd7Sim2IVJb2HhrgE8B6djtZhMA0Ol2B8pV1IEQMqVITCuKpBVFQ+UsORYVvxVF8nl+XmRtbahcdnxCymTGdwVIPu1mExuNBjrt9lC5SvY/fcJGo5GUCak7FGCN8CWgTreLJ/3+wLQn/X4yBCaEkFIwh8Cf5+eTV1VD4LQ6VBmbEBIAkkLVsX0KyKwD5UfIlCEiZwf/jb9Vx/ctIB/yJ6RMLviuQN3Yv3HDS1yllBIR8XnpCS93IWRK0ZmPzv6YBRFSf7hHHwNTesyGqsfe6XAbkP+FDYjUAi0/7TwRqVyAFPCUknYGlENA4gHZ6bYEgLcTQHHsoNs/++no5F4Ibe55zRdy7lEtEgqYAMBOt6WLXk4AKaWSOoSW/dn9wkc/rSOZZ4HNL9NofNDTRMScp5QGYQ99jOkQEQmtIZLyeNB873Vb+xTwKJhdYWW7l0yj/9w4BWiK53DlPvAI2L79Onl/p9seOB5ThoxCEDAhGt8CzkCUUon0zjtXZpV8+yOFbAvnQkREZi5GA9PuPevhw+oMll6eAgCOf34DALxbjwb2MkXIaEjAGBTwraU2HjTf63kLi0tIzRCX+L4e/cLB8+teThiVxZVZJUsvT/FhdQZFSDBTgIgFdP9VegqtBYhYgjBklBpsjI3gW8AkbFa2e/JuPZr27Zwrv1CH66HgHALrOw9c75vyg3XMIY1Jhsmnv3tDAtbys2Pbw3HXOo0am4TDye6izC3vKV0GgLllv/LzLeCV7Z7XA3uu+HEiVJt+llnRWFg42V3E2o+PAIAXl28DAO4evh0pwNejXwAwUSqu46dloLaANToTTVkWQAnWln/i26t8+6ULuPp6mLgEZPa3kkXkzD7rJMGRBWgzt7yHmw8Pce3qpdTPWhtiIgH5FjAhmlDEpznZXRSzD9j9rQIBiav/T4UAYUgwDVt8mCD78i1gQkKmv7Ugaxc6wODIp6r27RQgaiTBXAEiPq5nS+j4yzEAoLG57/rsvyATSse3gAkJnf7WQtLA73x/A5y1fe8SNE9MhtzvciuWJiEtvzQam/uFrbhvARNCchGdhNgi1BIMuf+N9DzAeCXQ31rInK9I+SHjTLQpYLtORdeBEJKJOnh+/azDOUQYMrkC1BLKk2CZ4tGxkSK8qupACHGicDb0HhDhucJ8Gkbn6ePkqRi6XOYDCqwbvVPjl10HQkg+9hNzQu+PY/0splIKnaePk//NMkrMuvRys+Iz8yMkDOKbEYAa9MexfhPEHIra5SrIix/6l03IeadufXDs6/KcC6pgxX3HJ4ScL/4CWsLSrzMo7i0AAAAASUVORK5CYII="; const FEATHER_SPRITE_SHEET = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAARhJREFUWIXtlbENwjAQRf8hSiZIRQ+9WQNRUFIAKzACBSsAA1Ag1mAABqCCBomG3hQQ9OMEx4ZDNH5SikSJ3/fZ5wCJRCKRSPwZ0RzMWmtLAhGvQyUAi9mXP/aFaGjJRQQiguHihMvcFMJUVUYlAMuHixPGy4en1WmVQqgHYHkuZjiEj6a2/LjtYzTY0eiZbgC37Mxh1UN3sn/dr6cCz/LHB/DJj9s+2oMdbtdz6TtfFwQHcMvOInfmQNjsgchNWLXmdfK6gyioAu/6uKrsm1kWLAciKuCuey5nYuXAh234bdmZ6INIUw4E/Ix49xtjCmXfzLL8nY/ktdgnAKwxxgIoXIyqmAOwvIqfiN0ALNd21HYBO9XXGMAdnZTYyHWzWjQAAAAASUVORK5CYII="; - const HATS_SPRITE_SHEET = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAAMCAYAAAA+ht7fAAAAAXNSR0IArs4c6QAAATxJREFUSIljYBgFo2AUjIJRMHgBI7qAgqDqfxj7wfvbWNVAwX8y5P4jsRmR+LjMIRX8xyKGYjYTuQYfPnsJ2YL/yGw0ORSwtzMCbkZ/mDVRlikIqv5Hjgh84LONDcNnPT2G/6f54fYgy7Pg0giNXWLA/5a6dgYGBgaGmqZKohwF8/Sls48JqoV59MWXJwwcrJz/f/z+jj81fPrE8O/HD4bpvpwM/08zMDCafkSRxvDwGml2CINHloGBgYHB5DF2R9148JRh9trtDC8vXmBgYGBgePfpDUNRQTGDpq0Lw40HT9GVwwPi9SGEeZKY8hieISHgMQC6Z1EswJJ3caqFObKmrYeB48dvhnef3sAFucQkGVqqStDV/0dKyigAFsuFq47idM+LL08w9OGIaYJ5mJLCglDyxQggEtXTBAAAgRd0Slay6H4AAAAASUVORK5CYII="; + const HATS_SPRITE_SHEET = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAAMCAYAAAA+ht7fAAAAAXNSR0IArs4c6QAAAT5JREFUSIljYBgFo2AUjIJRMHgBI7qAgqDqfxj7wfvbWNVAwX8y5P4jsRmR+LjMIQf8R+OjmM1ErqGHz15CNvw/MhtNDgXs7YyAm9EfZk2UZQqCqv+RIwKfuxgYGBg+6+kx/D/NjyIGAyy4dEJjlxjwv6WunYGBgYGhpqmSGEfBPX3p7GOCamEeffHlCQMHK+f/H7+/400N/+3tGT49f84w3ZeT4f9pBgZG048o8hgeXiPNDmHwyDIwMDAwmDzG7qgbD54yzF67neHlxQsMDAwMDO8+vWEoKihm0LR1Ybjx4CmGO2CM14cQ5kliymN4hoSAxwDonkWxAEvexakW5siath4Gjh+/Gd59egMX5BKTZGipKkFX/x8pKaMAWCwXrjqK0z0vvjzB0IcjprGlMEacHBIBoeSLEUAkqqcJAAAmBnNJoDeWTQAAAABJRU5ErkJggg=="; // Element IDs const FIELD_GUIDE_ID = "birb-field-guide"; const FEATHER_ID = "birb-feather"; + const WARDROBE_ID = "birb-wardrobe"; const DEFAULT_BIRD = "bluebird"; @@ -1946,6 +1985,7 @@ const menuItems = [ new MenuItem(`Pet ${birdBirb()}`, pet), new MenuItem("Field Guide", insertFieldGuide), + new MenuItem("Wardrobe", insertWardrobe), new ConditionalMenuItem("Sticky Note", () => createNewStickyNote(stickyNotes, save, deleteStickyNote), () => getContext().areStickyNotesEnabled()), new MenuItem(`Hide ${birdBirb()}`, () => birb.setVisible(false)), new DebugMenuItem("Freeze/Unfreeze", () => { @@ -2433,6 +2473,8 @@ if (document.querySelector("#" + FIELD_GUIDE_ID)) { return; } + // Remove wardrobe if open + removeWardrobe(); const contentContainer = document.createElement("div"); const content = makeElement("birb-grid-content"); @@ -2513,6 +2555,96 @@ } } + function insertWardrobe() { + console.log("Inserting wardrobe"); + if (document.querySelector("#" + WARDROBE_ID)) { + return; + } + // Remove field guide if open + removeFieldGuide(); + + const contentContainer = document.createElement("div"); + const content = makeElement("birb-grid-content"); + const description = makeElement("birb-field-guide-description"); + contentContainer.appendChild(content); + contentContainer.appendChild(description); + + const wardrobe = createWindow( + WARDROBE_ID, + "Wardrobe", + contentContainer + ); + + const generateDescription = (/** @type {string} */ hat) => { + const metadata = HAT_METADATA[hat] ?? { name: "Unknown Hat", description: "todo" }; + + const boldName = document.createElement("b"); + boldName.textContent = metadata.name; + + const spacer = document.createElement("div"); + spacer.style.height = "0.3em"; + + const descText = document.createTextNode(metadata.description); + + const fragment = document.createDocumentFragment(); + fragment.appendChild(boldName); + fragment.appendChild(spacer); + fragment.appendChild(descText); + + return fragment; + }; + + description.appendChild(generateDescription(currentHat)); + for (const hat of Object.values(HAT)) { + const hatElement = makeElement("birb-grid-item"); + if (hat === currentHat) { + hatElement.classList.add("birb-grid-item-selected"); + } + const hatCanvas = document.createElement("canvas"); + hatCanvas.width = SPRITE_WIDTH * CANVAS_PIXEL_SIZE; + hatCanvas.height = SPRITE_HEIGHT * CANVAS_PIXEL_SIZE; + const hatCtx = hatCanvas.getContext("2d"); + if (!hatCtx) { + return; + } + console.log(hat); + birb.getFrames().base.draw( + hatCtx, + Directions.RIGHT, + CANVAS_PIXEL_SIZE, + SPECIES[currentSpecies].colors, + [...SPECIES[currentSpecies].tags, hat] + ); + hatElement.appendChild(hatCanvas); + content.appendChild(hatElement); + { + onClick(hatElement, () => { + switchHat(hat); + document.querySelectorAll(".birb-grid-item").forEach((element) => { + element.classList.remove("birb-grid-item-selected"); + }); + hatElement.classList.add("birb-grid-item-selected"); + }); + } + hatElement.addEventListener("mouseover", () => { + description.textContent = ""; + description.appendChild(generateDescription(hat)); + }); + hatElement.addEventListener("mouseout", () => { + description.textContent = ""; + description.appendChild(generateDescription(currentHat)); + }); + } + centerElement(wardrobe); + } + + function removeWardrobe() { + const wardrobe = document.querySelector("#" + WARDROBE_ID); + if (wardrobe) { + wardrobe.remove(); + } + } + /** * @param {string} type */ @@ -2523,6 +2655,14 @@ save(); } + /** + * @param {string} hat + */ + function switchHat(hat) { + currentHat = hat; + save(); + } + /** * Update the birds location from the start to the target location on a parabolic path * @param {number} speed The speed of the bird along the path diff --git a/sprites/hats.png b/sprites/hats.png index e815000394c52f6772f652add973a30692ba60c9..0c4f52b1ba581436788be77059a28f5b5a591721 100644 GIT binary patch delta 305 zcmV-10nYw{1B3&RF#$f2GB1Az{72)Xn9W44p@+|2LN@$AG8;_}1?=sNfSb`DW=)i3 z3WBQtks|`1yBHW47(VOiG5kNxk0J&GEVy(+W0x54zoo97fq{X6p{A*l7)QZ9ed+9D zf@)zNeevZ90|zVT{~y1<<4q0!?d=&pJ%7$H-ItT$|7ivWM$?Zd@)&;}UL(y8VerT@ zFfcGMm^{Yrs2dNSGR$7Po#Exh3k(bl3=Ho+yL0A7DDJi1>SS%N= zI*QXhFTOm%(1#{Kq1OVm1@G1|L3q3E6`G$ZRw@6tK550&Yfsm^D$B zDF~|mM~(=5;IoYl!)HA`hX1Ge;r1ZQv*6MQja_2E|CYLT1_lNOhMJ~Iq8tVD^rf?p z395y8^u?Da3>>VS|9|}cjz2Yg`o!?>#}9_-zMKsIPctwuntnu)#_)ge8fkV2gGZKu zfq{X+c6px@S==z>;@ys)aeSrmcs8 createNewStickyNote(stickyNotes, save, deleteStickyNote), () => getContext().areStickyNotesEnabled()), new MenuItem(`Hide ${birdBirb()}`, () => birb.setVisible(false)), new DebugMenuItem("Freeze/Unfreeze", () => { @@ -650,6 +652,8 @@ function startApplication(birbPixels, featherPixels, hatsPixels) { if (document.querySelector("#" + FIELD_GUIDE_ID)) { return; } + // Remove wardrobe if open + removeWardrobe(); const contentContainer = document.createElement("div"); const content = makeElement("birb-grid-content"); @@ -730,6 +734,100 @@ function startApplication(birbPixels, featherPixels, hatsPixels) { } } + function insertWardrobe() { + console.log("Inserting wardrobe"); + if (document.querySelector("#" + WARDROBE_ID)) { + return; + } + // Remove field guide if open + removeFieldGuide(); + + const contentContainer = document.createElement("div"); + const content = makeElement("birb-grid-content"); + const description = makeElement("birb-field-guide-description"); + contentContainer.appendChild(content); + contentContainer.appendChild(description); + + const wardrobe = createWindow( + WARDROBE_ID, + "Wardrobe", + contentContainer + ); + + const generateDescription = (/** @type {string} */ hat) => { + const metadata = HAT_METADATA[hat] ?? { name: "Unknown Hat", description: "todo" }; + const unlocked = true; + + const boldName = document.createElement("b"); + boldName.textContent = metadata.name; + + const spacer = document.createElement("div"); + spacer.style.height = "0.3em"; + + const descText = document.createTextNode(!unlocked ? "Not yet unlocked" : metadata.description); + + const fragment = document.createDocumentFragment(); + fragment.appendChild(boldName); + fragment.appendChild(spacer); + fragment.appendChild(descText); + + return fragment; + }; + + description.appendChild(generateDescription(currentHat)); + for (const hat of Object.values(HAT)) { + const unlocked = true; + const hatElement = makeElement("birb-grid-item"); + if (hat === currentHat) { + hatElement.classList.add("birb-grid-item-selected"); + } + const hatCanvas = document.createElement("canvas"); + hatCanvas.width = SPRITE_WIDTH * CANVAS_PIXEL_SIZE; + hatCanvas.height = SPRITE_HEIGHT * CANVAS_PIXEL_SIZE; + const hatCtx = hatCanvas.getContext("2d"); + if (!hatCtx) { + return; + } + console.log(hat); + birb.getFrames().base.draw( + hatCtx, + Directions.RIGHT, + CANVAS_PIXEL_SIZE, + SPECIES[currentSpecies].colors, + [...SPECIES[currentSpecies].tags, hat] + ); + hatElement.appendChild(hatCanvas); + content.appendChild(hatElement); + if (unlocked) { + onClick(hatElement, () => { + switchHat(hat); + document.querySelectorAll(".birb-grid-item").forEach((element) => { + element.classList.remove("birb-grid-item-selected"); + }); + hatElement.classList.add("birb-grid-item-selected"); + }); + } else { + hatElement.classList.add("birb-grid-item-locked"); + } + hatElement.addEventListener("mouseover", () => { + description.textContent = ""; + description.appendChild(generateDescription(hat)); + }); + hatElement.addEventListener("mouseout", () => { + description.textContent = ""; + description.appendChild(generateDescription(currentHat)); + }); + } + centerElement(wardrobe); + } + + function removeWardrobe() { + const wardrobe = document.querySelector("#" + WARDROBE_ID); + if (wardrobe) { + wardrobe.remove(); + } + } + /** * @param {string} type */ @@ -740,6 +838,14 @@ function startApplication(birbPixels, featherPixels, hatsPixels) { save(); } + /** + * @param {string} hat + */ + function switchHat(hat) { + currentHat = hat; + save(); + } + /** * Update the birds location from the start to the target location on a parabolic path * @param {number} speed The speed of the bird along the path diff --git a/src/hats.js b/src/hats.js index a088b69..e15bbdc 100644 --- a/src/hats.js +++ b/src/hats.js @@ -13,6 +13,33 @@ export const HAT = { FEZ: "fez", }; +export const HAT_METADATA = { + [HAT.NONE]: { + name: "Invisible Hat", + description: "It's like you're wearing nothing at all!" + }, + [HAT.TOP_HAT]: { + name: "Top Hat", + description: "For that classy, sophisticated look." + }, + [HAT.VIKING_HELMET]: { + name: "Viking Helmet", + description: "Sure, vikings never actually wore this style of helmet, but why let facts get in the way of good fashion?" + }, + [HAT.COWBOY_HAT]: { + name: "Cowboy Hat", + description: "You can't jam with the console cowboys without the appropriate attire." + }, + [HAT.BOWLER_HAT]: { + name: "Bowler Hat", + description: "For that authentic, Victorian look!" + }, + [HAT.FEZ]: { + name: "Fez", + description: "It's a fez. Fezzes are cool." + }, +}; + /** * @param {string[][]} spriteSheet * @returns {{ base: Layer[], down: Layer[] }} diff --git a/src/stylesheet.css b/src/stylesheet.css index 917c0b8..39e2690 100644 --- a/src/stylesheet.css +++ b/src/stylesheet.css @@ -242,9 +242,20 @@ width: 322px !important; } +#birb-wardrobe { + width: calc(322px - 64px - 14px) !important; +} + +#birb-field-guide .birb-grid-content { + grid-template-rows: repeat(3, auto); +} + +#birb-wardrobe .birb-grid-content { + grid-template-rows: repeat(2, auto); +} + .birb-grid-content { display: grid; - grid-template-rows: repeat(3, auto); grid-auto-flow: column; gap: 10px; padding-top: 8px;