From 7b1df9bc4f90f2d94d37434a1a750cbf159bf928 Mon Sep 17 00:00:00 2001 From: Idrees Hassan Date: Wed, 21 Jan 2026 22:52:53 -0500 Subject: [PATCH] Store unlocked hats --- dist/extension.zip | Bin 154192 -> 154352 bytes dist/extension/birb.js | 62 ++++++++++++++++++++++++----------- dist/obsidian/main.js | 62 ++++++++++++++++++++++++----------- dist/userscript/birb.user.js | 62 ++++++++++++++++++++++++----------- dist/web/birb.embed.js | 62 ++++++++++++++++++++++++----------- dist/web/birb.js | 62 ++++++++++++++++++++++++----------- src/application.js | 52 ++++++++++++++++++++--------- src/stylesheet.css | 6 ++-- 8 files changed, 254 insertions(+), 114 deletions(-) diff --git a/dist/extension.zip b/dist/extension.zip index 8d055b9bb164fcaaa450946d9b736e5753190c5a..72e789a786483892ebbadfa19918875aefbd7579 100644 GIT binary patch delta 31628 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 E0I2~d9{>OV delta 31418 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 settings * @property {SavedStickyNote[]} [stickyNotes] @@ -1676,14 +1677,14 @@ bottom: 0; transform: scale(calc(var(--birb-scale) * 1.5)) !important; transform-origin: bottom; - transition-duration: 0.2s; + transition-duration: 0.15s; z-index: 2147483630 !important; cursor: pointer; } .birb-item:hover { - transform: scale(calc(var(--birb-scale) * 2)) !important; - transition-duration: 0.2s; + transform: scale(calc(var(--birb-scale) * 1.9)) !important; + transition-duration: 0.15s; } .birb-window { @@ -2122,6 +2123,9 @@ for (let type in SPECIES) { unlockBird(type); } + for (let hat in HAT) { + unlockHat(HAT[hat]); + } }), new DebugMenuItem("Add Feather", () => { activateFeather(); @@ -2190,6 +2194,7 @@ let petStack = []; let currentSpecies = DEFAULT_BIRD; let unlockedSpecies = [DEFAULT_BIRD]; + let unlockedHats = [DEFAULT_HAT]; let currentHat = DEFAULT_HAT; // let visible = true; let lastPetTimestamp = 0; @@ -2209,6 +2214,7 @@ userSettings = saveData.settings ?? {}; unlockedSpecies = saveData.unlockedSpecies ?? [DEFAULT_BIRD]; currentSpecies = saveData.currentSpecies ?? DEFAULT_BIRD; + unlockedHats = saveData.unlockedHats ?? [DEFAULT_HAT]; currentHat = saveData.currentHat ?? DEFAULT_HAT; stickyNotes = []; @@ -2230,6 +2236,7 @@ const saveData = { unlockedSpecies: unlockedSpecies, currentSpecies: currentSpecies, + unlockedHats: unlockedHats, currentHat: currentHat, settings: userSettings }; @@ -2532,9 +2539,13 @@ if (document.querySelector("#" + HAT_ID)) { return; } - // Select a random hat - const hats = Object.values(HAT); - const hatId = hats[Math.floor(Math.random() * (hats.length - 1)) + 1]; + // Select a random hat that hasn't been unlocked yet + const availableHats = Object.values(HAT) + .filter(hat => hat !== HAT.NONE && !unlockedHats.includes(hat)); + if (availableHats.length === 0) { + return; + } + const hatId = availableHats[Math.floor(Math.random() * availableHats.length)]; // Find a random valid element to place the hat on const element = getRandomValidElement(); @@ -2553,15 +2564,8 @@ return; } onClick(hatCanvas, () => { - switchHat(hatId); + unlockHat(hatId); hatCanvas.remove(); - const message = makeElement("birb-message-content"); - message.appendChild(document.createTextNode("You've unlocked the ")); - const bold = document.createElement("b"); - bold.textContent = HAT_METADATA[hatId].name; - message.appendChild(bold); - message.appendChild(document.createTextNode("! To see all of your unlocked accessories, click the Wardrobe from the menu.")); - insertModal("New Hat Found!", message); }); // Create hat animation @@ -2583,6 +2587,7 @@ function unlockBird(birdType) { if (!unlockedSpecies.includes(birdType)) { unlockedSpecies.push(birdType); + save(); const message = makeElement("birb-message-content"); message.appendChild(document.createTextNode("You've found a ")); const bold = document.createElement("b"); @@ -2591,7 +2596,24 @@ message.appendChild(document.createTextNode(" feather! Use the Field Guide to switch your bird's species.")); insertModal("New Bird Unlocked!", message); } - save(); + } + + /** + * @param {string} hatId + */ + function unlockHat(hatId) { + if (!unlockedHats.includes(hatId)) { + unlockedHats.push(hatId); + save(); + switchHat(hatId); + const message = makeElement("birb-message-content"); + message.appendChild(document.createTextNode("You've unlocked the ")); + const bold = document.createElement("b"); + bold.textContent = HAT_METADATA[hatId].name; + message.appendChild(bold); + message.appendChild(document.createTextNode("! To see all of your unlocked accessories, click the Wardrobe from the menu.")); + insertModal("New Hat Found!", message); + } } function updateFeather() { @@ -2761,6 +2783,7 @@ const generateDescription = (/** @type {string} */ hat) => { const metadata = HAT_METADATA[hat] ?? { name: "Unknown Hat", description: "todo" }; + const unlocked = unlockedHats.includes(hat); const boldName = document.createElement("b"); boldName.textContent = metadata.name; @@ -2768,7 +2791,7 @@ const spacer = document.createElement("div"); spacer.style.height = "0.3em"; - const descText = document.createTextNode(metadata.description); + const descText = document.createTextNode(!unlocked ? "Not yet unlocked" : metadata.description); const fragment = document.createDocumentFragment(); fragment.appendChild(boldName); @@ -2780,6 +2803,7 @@ description.appendChild(generateDescription(currentHat)); for (const hat of Object.values(HAT)) { + const unlocked = unlockedHats.includes(hat); const hatElement = makeElement("birb-grid-item"); if (hat === currentHat) { hatElement.classList.add("birb-grid-item-selected"); @@ -2791,7 +2815,6 @@ if (!hatCtx) { return; } - console.log(hat); birb.getFrames().base.draw( hatCtx, Directions.RIGHT, @@ -2801,7 +2824,7 @@ ); hatElement.appendChild(hatCanvas); content.appendChild(hatElement); - { + if (unlocked) { onClick(hatElement, () => { switchHat(hat); document.querySelectorAll(".birb-grid-item").forEach((element) => { @@ -2809,6 +2832,8 @@ }); hatElement.classList.add("birb-grid-item-selected"); }); + } else { + hatElement.classList.add("birb-grid-item-locked"); } hatElement.addEventListener("mouseover", () => { description.textContent = ""; @@ -2843,7 +2868,6 @@ * @param {string} hat */ function switchHat(hat) { - log("Switching hat to: " + hat); currentHat = hat; save(); } diff --git a/dist/obsidian/main.js b/dist/obsidian/main.js index 536995d..716ca26 100644 --- a/dist/obsidian/main.js +++ b/dist/obsidian/main.js @@ -1647,6 +1647,7 @@ module.exports = class PocketBird extends Plugin { * @typedef {Object} BirbSaveData * @property {string[]} unlockedSpecies * @property {string} currentSpecies + * @property {string[]} unlockedHats * @property {string} currentHat * @property {Partial} settings * @property {SavedStickyNote[]} [stickyNotes] @@ -1719,14 +1720,14 @@ module.exports = class PocketBird extends Plugin { bottom: 0; transform: scale(calc(var(--birb-scale) * 1.5)) !important; transform-origin: bottom; - transition-duration: 0.2s; + transition-duration: 0.15s; z-index: 2147483630 !important; cursor: pointer; } .birb-item:hover { - transform: scale(calc(var(--birb-scale) * 2)) !important; - transition-duration: 0.2s; + transform: scale(calc(var(--birb-scale) * 1.9)) !important; + transition-duration: 0.15s; } .birb-window { @@ -2165,6 +2166,9 @@ module.exports = class PocketBird extends Plugin { for (let type in SPECIES) { unlockBird(type); } + for (let hat in HAT) { + unlockHat(HAT[hat]); + } }), new DebugMenuItem("Add Feather", () => { activateFeather(); @@ -2233,6 +2237,7 @@ module.exports = class PocketBird extends Plugin { let petStack = []; let currentSpecies = DEFAULT_BIRD; let unlockedSpecies = [DEFAULT_BIRD]; + let unlockedHats = [DEFAULT_HAT]; let currentHat = DEFAULT_HAT; // let visible = true; let lastPetTimestamp = 0; @@ -2252,6 +2257,7 @@ module.exports = class PocketBird extends Plugin { userSettings = saveData.settings ?? {}; unlockedSpecies = saveData.unlockedSpecies ?? [DEFAULT_BIRD]; currentSpecies = saveData.currentSpecies ?? DEFAULT_BIRD; + unlockedHats = saveData.unlockedHats ?? [DEFAULT_HAT]; currentHat = saveData.currentHat ?? DEFAULT_HAT; stickyNotes = []; @@ -2273,6 +2279,7 @@ module.exports = class PocketBird extends Plugin { const saveData = { unlockedSpecies: unlockedSpecies, currentSpecies: currentSpecies, + unlockedHats: unlockedHats, currentHat: currentHat, settings: userSettings }; @@ -2575,9 +2582,13 @@ module.exports = class PocketBird extends Plugin { if (document.querySelector("#" + HAT_ID)) { return; } - // Select a random hat - const hats = Object.values(HAT); - const hatId = hats[Math.floor(Math.random() * (hats.length - 1)) + 1]; + // Select a random hat that hasn't been unlocked yet + const availableHats = Object.values(HAT) + .filter(hat => hat !== HAT.NONE && !unlockedHats.includes(hat)); + if (availableHats.length === 0) { + return; + } + const hatId = availableHats[Math.floor(Math.random() * availableHats.length)]; // Find a random valid element to place the hat on const element = getRandomValidElement(); @@ -2596,15 +2607,8 @@ module.exports = class PocketBird extends Plugin { return; } onClick(hatCanvas, () => { - switchHat(hatId); + unlockHat(hatId); hatCanvas.remove(); - const message = makeElement("birb-message-content"); - message.appendChild(document.createTextNode("You've unlocked the ")); - const bold = document.createElement("b"); - bold.textContent = HAT_METADATA[hatId].name; - message.appendChild(bold); - message.appendChild(document.createTextNode("! To see all of your unlocked accessories, click the Wardrobe from the menu.")); - insertModal("New Hat Found!", message); }); // Create hat animation @@ -2626,6 +2630,7 @@ module.exports = class PocketBird extends Plugin { function unlockBird(birdType) { if (!unlockedSpecies.includes(birdType)) { unlockedSpecies.push(birdType); + save(); const message = makeElement("birb-message-content"); message.appendChild(document.createTextNode("You've found a ")); const bold = document.createElement("b"); @@ -2634,7 +2639,24 @@ module.exports = class PocketBird extends Plugin { message.appendChild(document.createTextNode(" feather! Use the Field Guide to switch your bird's species.")); insertModal("New Bird Unlocked!", message); } - save(); + } + + /** + * @param {string} hatId + */ + function unlockHat(hatId) { + if (!unlockedHats.includes(hatId)) { + unlockedHats.push(hatId); + save(); + switchHat(hatId); + const message = makeElement("birb-message-content"); + message.appendChild(document.createTextNode("You've unlocked the ")); + const bold = document.createElement("b"); + bold.textContent = HAT_METADATA[hatId].name; + message.appendChild(bold); + message.appendChild(document.createTextNode("! To see all of your unlocked accessories, click the Wardrobe from the menu.")); + insertModal("New Hat Found!", message); + } } function updateFeather() { @@ -2804,6 +2826,7 @@ module.exports = class PocketBird extends Plugin { const generateDescription = (/** @type {string} */ hat) => { const metadata = HAT_METADATA[hat] ?? { name: "Unknown Hat", description: "todo" }; + const unlocked = unlockedHats.includes(hat); const boldName = document.createElement("b"); boldName.textContent = metadata.name; @@ -2811,7 +2834,7 @@ module.exports = class PocketBird extends Plugin { const spacer = document.createElement("div"); spacer.style.height = "0.3em"; - const descText = document.createTextNode(metadata.description); + const descText = document.createTextNode(!unlocked ? "Not yet unlocked" : metadata.description); const fragment = document.createDocumentFragment(); fragment.appendChild(boldName); @@ -2823,6 +2846,7 @@ module.exports = class PocketBird extends Plugin { description.appendChild(generateDescription(currentHat)); for (const hat of Object.values(HAT)) { + const unlocked = unlockedHats.includes(hat); const hatElement = makeElement("birb-grid-item"); if (hat === currentHat) { hatElement.classList.add("birb-grid-item-selected"); @@ -2834,7 +2858,6 @@ module.exports = class PocketBird extends Plugin { if (!hatCtx) { return; } - console.log(hat); birb.getFrames().base.draw( hatCtx, Directions.RIGHT, @@ -2844,7 +2867,7 @@ module.exports = class PocketBird extends Plugin { ); hatElement.appendChild(hatCanvas); content.appendChild(hatElement); - { + if (unlocked) { onClick(hatElement, () => { switchHat(hat); document.querySelectorAll(".birb-grid-item").forEach((element) => { @@ -2852,6 +2875,8 @@ module.exports = class PocketBird extends Plugin { }); hatElement.classList.add("birb-grid-item-selected"); }); + } else { + hatElement.classList.add("birb-grid-item-locked"); } hatElement.addEventListener("mouseover", () => { description.textContent = ""; @@ -2886,7 +2911,6 @@ module.exports = class PocketBird extends Plugin { * @param {string} hat */ function switchHat(hat) { - log("Switching hat to: " + hat); currentHat = hat; save(); } diff --git a/dist/userscript/birb.user.js b/dist/userscript/birb.user.js index 21b9da3..83a501f 100644 --- a/dist/userscript/birb.user.js +++ b/dist/userscript/birb.user.js @@ -1609,6 +1609,7 @@ * @typedef {Object} BirbSaveData * @property {string[]} unlockedSpecies * @property {string} currentSpecies + * @property {string[]} unlockedHats * @property {string} currentHat * @property {Partial} settings * @property {SavedStickyNote[]} [stickyNotes] @@ -1681,14 +1682,14 @@ bottom: 0; transform: scale(calc(var(--birb-scale) * 1.5)) !important; transform-origin: bottom; - transition-duration: 0.2s; + transition-duration: 0.15s; z-index: 2147483630 !important; cursor: pointer; } .birb-item:hover { - transform: scale(calc(var(--birb-scale) * 2)) !important; - transition-duration: 0.2s; + transform: scale(calc(var(--birb-scale) * 1.9)) !important; + transition-duration: 0.15s; } .birb-window { @@ -2127,6 +2128,9 @@ for (let type in SPECIES) { unlockBird(type); } + for (let hat in HAT) { + unlockHat(HAT[hat]); + } }), new DebugMenuItem("Add Feather", () => { activateFeather(); @@ -2195,6 +2199,7 @@ let petStack = []; let currentSpecies = DEFAULT_BIRD; let unlockedSpecies = [DEFAULT_BIRD]; + let unlockedHats = [DEFAULT_HAT]; let currentHat = DEFAULT_HAT; // let visible = true; let lastPetTimestamp = 0; @@ -2214,6 +2219,7 @@ userSettings = saveData.settings ?? {}; unlockedSpecies = saveData.unlockedSpecies ?? [DEFAULT_BIRD]; currentSpecies = saveData.currentSpecies ?? DEFAULT_BIRD; + unlockedHats = saveData.unlockedHats ?? [DEFAULT_HAT]; currentHat = saveData.currentHat ?? DEFAULT_HAT; stickyNotes = []; @@ -2235,6 +2241,7 @@ const saveData = { unlockedSpecies: unlockedSpecies, currentSpecies: currentSpecies, + unlockedHats: unlockedHats, currentHat: currentHat, settings: userSettings }; @@ -2537,9 +2544,13 @@ if (document.querySelector("#" + HAT_ID)) { return; } - // Select a random hat - const hats = Object.values(HAT); - const hatId = hats[Math.floor(Math.random() * (hats.length - 1)) + 1]; + // Select a random hat that hasn't been unlocked yet + const availableHats = Object.values(HAT) + .filter(hat => hat !== HAT.NONE && !unlockedHats.includes(hat)); + if (availableHats.length === 0) { + return; + } + const hatId = availableHats[Math.floor(Math.random() * availableHats.length)]; // Find a random valid element to place the hat on const element = getRandomValidElement(); @@ -2558,15 +2569,8 @@ return; } onClick(hatCanvas, () => { - switchHat(hatId); + unlockHat(hatId); hatCanvas.remove(); - const message = makeElement("birb-message-content"); - message.appendChild(document.createTextNode("You've unlocked the ")); - const bold = document.createElement("b"); - bold.textContent = HAT_METADATA[hatId].name; - message.appendChild(bold); - message.appendChild(document.createTextNode("! To see all of your unlocked accessories, click the Wardrobe from the menu.")); - insertModal("New Hat Found!", message); }); // Create hat animation @@ -2588,6 +2592,7 @@ function unlockBird(birdType) { if (!unlockedSpecies.includes(birdType)) { unlockedSpecies.push(birdType); + save(); const message = makeElement("birb-message-content"); message.appendChild(document.createTextNode("You've found a ")); const bold = document.createElement("b"); @@ -2596,7 +2601,24 @@ message.appendChild(document.createTextNode(" feather! Use the Field Guide to switch your bird's species.")); insertModal("New Bird Unlocked!", message); } - save(); + } + + /** + * @param {string} hatId + */ + function unlockHat(hatId) { + if (!unlockedHats.includes(hatId)) { + unlockedHats.push(hatId); + save(); + switchHat(hatId); + const message = makeElement("birb-message-content"); + message.appendChild(document.createTextNode("You've unlocked the ")); + const bold = document.createElement("b"); + bold.textContent = HAT_METADATA[hatId].name; + message.appendChild(bold); + message.appendChild(document.createTextNode("! To see all of your unlocked accessories, click the Wardrobe from the menu.")); + insertModal("New Hat Found!", message); + } } function updateFeather() { @@ -2766,6 +2788,7 @@ const generateDescription = (/** @type {string} */ hat) => { const metadata = HAT_METADATA[hat] ?? { name: "Unknown Hat", description: "todo" }; + const unlocked = unlockedHats.includes(hat); const boldName = document.createElement("b"); boldName.textContent = metadata.name; @@ -2773,7 +2796,7 @@ const spacer = document.createElement("div"); spacer.style.height = "0.3em"; - const descText = document.createTextNode(metadata.description); + const descText = document.createTextNode(!unlocked ? "Not yet unlocked" : metadata.description); const fragment = document.createDocumentFragment(); fragment.appendChild(boldName); @@ -2785,6 +2808,7 @@ description.appendChild(generateDescription(currentHat)); for (const hat of Object.values(HAT)) { + const unlocked = unlockedHats.includes(hat); const hatElement = makeElement("birb-grid-item"); if (hat === currentHat) { hatElement.classList.add("birb-grid-item-selected"); @@ -2796,7 +2820,6 @@ if (!hatCtx) { return; } - console.log(hat); birb.getFrames().base.draw( hatCtx, Directions.RIGHT, @@ -2806,7 +2829,7 @@ ); hatElement.appendChild(hatCanvas); content.appendChild(hatElement); - { + if (unlocked) { onClick(hatElement, () => { switchHat(hat); document.querySelectorAll(".birb-grid-item").forEach((element) => { @@ -2814,6 +2837,8 @@ }); hatElement.classList.add("birb-grid-item-selected"); }); + } else { + hatElement.classList.add("birb-grid-item-locked"); } hatElement.addEventListener("mouseover", () => { description.textContent = ""; @@ -2848,7 +2873,6 @@ * @param {string} hat */ function switchHat(hat) { - log("Switching hat to: " + hat); currentHat = hat; save(); } diff --git a/dist/web/birb.embed.js b/dist/web/birb.embed.js index 43eb0bb..9520421 100644 --- a/dist/web/birb.embed.js +++ b/dist/web/birb.embed.js @@ -1589,6 +1589,7 @@ * @typedef {Object} BirbSaveData * @property {string[]} unlockedSpecies * @property {string} currentSpecies + * @property {string[]} unlockedHats * @property {string} currentHat * @property {Partial} settings * @property {SavedStickyNote[]} [stickyNotes] @@ -1661,14 +1662,14 @@ bottom: 0; transform: scale(calc(var(--birb-scale) * 1.5)) !important; transform-origin: bottom; - transition-duration: 0.2s; + transition-duration: 0.15s; z-index: 2147483630 !important; cursor: pointer; } .birb-item:hover { - transform: scale(calc(var(--birb-scale) * 2)) !important; - transition-duration: 0.2s; + transform: scale(calc(var(--birb-scale) * 1.9)) !important; + transition-duration: 0.15s; } .birb-window { @@ -2107,6 +2108,9 @@ for (let type in SPECIES) { unlockBird(type); } + for (let hat in HAT) { + unlockHat(HAT[hat]); + } }), new DebugMenuItem("Add Feather", () => { activateFeather(); @@ -2175,6 +2179,7 @@ let petStack = []; let currentSpecies = DEFAULT_BIRD; let unlockedSpecies = [DEFAULT_BIRD]; + let unlockedHats = [DEFAULT_HAT]; let currentHat = DEFAULT_HAT; // let visible = true; let lastPetTimestamp = 0; @@ -2194,6 +2199,7 @@ userSettings = saveData.settings ?? {}; unlockedSpecies = saveData.unlockedSpecies ?? [DEFAULT_BIRD]; currentSpecies = saveData.currentSpecies ?? DEFAULT_BIRD; + unlockedHats = saveData.unlockedHats ?? [DEFAULT_HAT]; currentHat = saveData.currentHat ?? DEFAULT_HAT; stickyNotes = []; @@ -2215,6 +2221,7 @@ const saveData = { unlockedSpecies: unlockedSpecies, currentSpecies: currentSpecies, + unlockedHats: unlockedHats, currentHat: currentHat, settings: userSettings }; @@ -2517,9 +2524,13 @@ if (document.querySelector("#" + HAT_ID)) { return; } - // Select a random hat - const hats = Object.values(HAT); - const hatId = hats[Math.floor(Math.random() * (hats.length - 1)) + 1]; + // Select a random hat that hasn't been unlocked yet + const availableHats = Object.values(HAT) + .filter(hat => hat !== HAT.NONE && !unlockedHats.includes(hat)); + if (availableHats.length === 0) { + return; + } + const hatId = availableHats[Math.floor(Math.random() * availableHats.length)]; // Find a random valid element to place the hat on const element = getRandomValidElement(); @@ -2538,15 +2549,8 @@ return; } onClick(hatCanvas, () => { - switchHat(hatId); + unlockHat(hatId); hatCanvas.remove(); - const message = makeElement("birb-message-content"); - message.appendChild(document.createTextNode("You've unlocked the ")); - const bold = document.createElement("b"); - bold.textContent = HAT_METADATA[hatId].name; - message.appendChild(bold); - message.appendChild(document.createTextNode("! To see all of your unlocked accessories, click the Wardrobe from the menu.")); - insertModal("New Hat Found!", message); }); // Create hat animation @@ -2568,6 +2572,7 @@ function unlockBird(birdType) { if (!unlockedSpecies.includes(birdType)) { unlockedSpecies.push(birdType); + save(); const message = makeElement("birb-message-content"); message.appendChild(document.createTextNode("You've found a ")); const bold = document.createElement("b"); @@ -2576,7 +2581,24 @@ message.appendChild(document.createTextNode(" feather! Use the Field Guide to switch your bird's species.")); insertModal("New Bird Unlocked!", message); } - save(); + } + + /** + * @param {string} hatId + */ + function unlockHat(hatId) { + if (!unlockedHats.includes(hatId)) { + unlockedHats.push(hatId); + save(); + switchHat(hatId); + const message = makeElement("birb-message-content"); + message.appendChild(document.createTextNode("You've unlocked the ")); + const bold = document.createElement("b"); + bold.textContent = HAT_METADATA[hatId].name; + message.appendChild(bold); + message.appendChild(document.createTextNode("! To see all of your unlocked accessories, click the Wardrobe from the menu.")); + insertModal("New Hat Found!", message); + } } function updateFeather() { @@ -2746,6 +2768,7 @@ const generateDescription = (/** @type {string} */ hat) => { const metadata = HAT_METADATA[hat] ?? { name: "Unknown Hat", description: "todo" }; + const unlocked = unlockedHats.includes(hat); const boldName = document.createElement("b"); boldName.textContent = metadata.name; @@ -2753,7 +2776,7 @@ const spacer = document.createElement("div"); spacer.style.height = "0.3em"; - const descText = document.createTextNode(metadata.description); + const descText = document.createTextNode(!unlocked ? "Not yet unlocked" : metadata.description); const fragment = document.createDocumentFragment(); fragment.appendChild(boldName); @@ -2765,6 +2788,7 @@ description.appendChild(generateDescription(currentHat)); for (const hat of Object.values(HAT)) { + const unlocked = unlockedHats.includes(hat); const hatElement = makeElement("birb-grid-item"); if (hat === currentHat) { hatElement.classList.add("birb-grid-item-selected"); @@ -2776,7 +2800,6 @@ if (!hatCtx) { return; } - console.log(hat); birb.getFrames().base.draw( hatCtx, Directions.RIGHT, @@ -2786,7 +2809,7 @@ ); hatElement.appendChild(hatCanvas); content.appendChild(hatElement); - { + if (unlocked) { onClick(hatElement, () => { switchHat(hat); document.querySelectorAll(".birb-grid-item").forEach((element) => { @@ -2794,6 +2817,8 @@ }); hatElement.classList.add("birb-grid-item-selected"); }); + } else { + hatElement.classList.add("birb-grid-item-locked"); } hatElement.addEventListener("mouseover", () => { description.textContent = ""; @@ -2828,7 +2853,6 @@ * @param {string} hat */ function switchHat(hat) { - log("Switching hat to: " + hat); currentHat = hat; save(); } diff --git a/dist/web/birb.js b/dist/web/birb.js index 43eb0bb..9520421 100644 --- a/dist/web/birb.js +++ b/dist/web/birb.js @@ -1589,6 +1589,7 @@ * @typedef {Object} BirbSaveData * @property {string[]} unlockedSpecies * @property {string} currentSpecies + * @property {string[]} unlockedHats * @property {string} currentHat * @property {Partial} settings * @property {SavedStickyNote[]} [stickyNotes] @@ -1661,14 +1662,14 @@ bottom: 0; transform: scale(calc(var(--birb-scale) * 1.5)) !important; transform-origin: bottom; - transition-duration: 0.2s; + transition-duration: 0.15s; z-index: 2147483630 !important; cursor: pointer; } .birb-item:hover { - transform: scale(calc(var(--birb-scale) * 2)) !important; - transition-duration: 0.2s; + transform: scale(calc(var(--birb-scale) * 1.9)) !important; + transition-duration: 0.15s; } .birb-window { @@ -2107,6 +2108,9 @@ for (let type in SPECIES) { unlockBird(type); } + for (let hat in HAT) { + unlockHat(HAT[hat]); + } }), new DebugMenuItem("Add Feather", () => { activateFeather(); @@ -2175,6 +2179,7 @@ let petStack = []; let currentSpecies = DEFAULT_BIRD; let unlockedSpecies = [DEFAULT_BIRD]; + let unlockedHats = [DEFAULT_HAT]; let currentHat = DEFAULT_HAT; // let visible = true; let lastPetTimestamp = 0; @@ -2194,6 +2199,7 @@ userSettings = saveData.settings ?? {}; unlockedSpecies = saveData.unlockedSpecies ?? [DEFAULT_BIRD]; currentSpecies = saveData.currentSpecies ?? DEFAULT_BIRD; + unlockedHats = saveData.unlockedHats ?? [DEFAULT_HAT]; currentHat = saveData.currentHat ?? DEFAULT_HAT; stickyNotes = []; @@ -2215,6 +2221,7 @@ const saveData = { unlockedSpecies: unlockedSpecies, currentSpecies: currentSpecies, + unlockedHats: unlockedHats, currentHat: currentHat, settings: userSettings }; @@ -2517,9 +2524,13 @@ if (document.querySelector("#" + HAT_ID)) { return; } - // Select a random hat - const hats = Object.values(HAT); - const hatId = hats[Math.floor(Math.random() * (hats.length - 1)) + 1]; + // Select a random hat that hasn't been unlocked yet + const availableHats = Object.values(HAT) + .filter(hat => hat !== HAT.NONE && !unlockedHats.includes(hat)); + if (availableHats.length === 0) { + return; + } + const hatId = availableHats[Math.floor(Math.random() * availableHats.length)]; // Find a random valid element to place the hat on const element = getRandomValidElement(); @@ -2538,15 +2549,8 @@ return; } onClick(hatCanvas, () => { - switchHat(hatId); + unlockHat(hatId); hatCanvas.remove(); - const message = makeElement("birb-message-content"); - message.appendChild(document.createTextNode("You've unlocked the ")); - const bold = document.createElement("b"); - bold.textContent = HAT_METADATA[hatId].name; - message.appendChild(bold); - message.appendChild(document.createTextNode("! To see all of your unlocked accessories, click the Wardrobe from the menu.")); - insertModal("New Hat Found!", message); }); // Create hat animation @@ -2568,6 +2572,7 @@ function unlockBird(birdType) { if (!unlockedSpecies.includes(birdType)) { unlockedSpecies.push(birdType); + save(); const message = makeElement("birb-message-content"); message.appendChild(document.createTextNode("You've found a ")); const bold = document.createElement("b"); @@ -2576,7 +2581,24 @@ message.appendChild(document.createTextNode(" feather! Use the Field Guide to switch your bird's species.")); insertModal("New Bird Unlocked!", message); } - save(); + } + + /** + * @param {string} hatId + */ + function unlockHat(hatId) { + if (!unlockedHats.includes(hatId)) { + unlockedHats.push(hatId); + save(); + switchHat(hatId); + const message = makeElement("birb-message-content"); + message.appendChild(document.createTextNode("You've unlocked the ")); + const bold = document.createElement("b"); + bold.textContent = HAT_METADATA[hatId].name; + message.appendChild(bold); + message.appendChild(document.createTextNode("! To see all of your unlocked accessories, click the Wardrobe from the menu.")); + insertModal("New Hat Found!", message); + } } function updateFeather() { @@ -2746,6 +2768,7 @@ const generateDescription = (/** @type {string} */ hat) => { const metadata = HAT_METADATA[hat] ?? { name: "Unknown Hat", description: "todo" }; + const unlocked = unlockedHats.includes(hat); const boldName = document.createElement("b"); boldName.textContent = metadata.name; @@ -2753,7 +2776,7 @@ const spacer = document.createElement("div"); spacer.style.height = "0.3em"; - const descText = document.createTextNode(metadata.description); + const descText = document.createTextNode(!unlocked ? "Not yet unlocked" : metadata.description); const fragment = document.createDocumentFragment(); fragment.appendChild(boldName); @@ -2765,6 +2788,7 @@ description.appendChild(generateDescription(currentHat)); for (const hat of Object.values(HAT)) { + const unlocked = unlockedHats.includes(hat); const hatElement = makeElement("birb-grid-item"); if (hat === currentHat) { hatElement.classList.add("birb-grid-item-selected"); @@ -2776,7 +2800,6 @@ if (!hatCtx) { return; } - console.log(hat); birb.getFrames().base.draw( hatCtx, Directions.RIGHT, @@ -2786,7 +2809,7 @@ ); hatElement.appendChild(hatCanvas); content.appendChild(hatElement); - { + if (unlocked) { onClick(hatElement, () => { switchHat(hat); document.querySelectorAll(".birb-grid-item").forEach((element) => { @@ -2794,6 +2817,8 @@ }); hatElement.classList.add("birb-grid-item-selected"); }); + } else { + hatElement.classList.add("birb-grid-item-locked"); } hatElement.addEventListener("mouseover", () => { description.textContent = ""; @@ -2828,7 +2853,6 @@ * @param {string} hat */ function switchHat(hat) { - log("Switching hat to: " + hat); currentHat = hat; save(); } diff --git a/src/application.js b/src/application.js index 6c3273e..d136947 100644 --- a/src/application.js +++ b/src/application.js @@ -54,6 +54,7 @@ import { HAT, HAT_METADATA, createHatItemAnimation } from './hats.js'; * @typedef {Object} BirbSaveData * @property {string[]} unlockedSpecies * @property {string} currentSpecies + * @property {string[]} unlockedHats * @property {string} currentHat * @property {Partial} settings * @property {SavedStickyNote[]} [stickyNotes] @@ -174,6 +175,9 @@ function startApplication(birbPixels, featherPixels, hatsPixels) { for (let type in SPECIES) { unlockBird(type); } + for (let hat in HAT) { + unlockHat(HAT[hat]); + } }), new DebugMenuItem("Add Feather", () => { activateFeather(); @@ -242,6 +246,7 @@ function startApplication(birbPixels, featherPixels, hatsPixels) { let petStack = []; let currentSpecies = DEFAULT_BIRD; let unlockedSpecies = [DEFAULT_BIRD]; + let unlockedHats = [DEFAULT_HAT]; let currentHat = DEFAULT_HAT; // let visible = true; let lastPetTimestamp = 0; @@ -261,6 +266,7 @@ function startApplication(birbPixels, featherPixels, hatsPixels) { userSettings = saveData.settings ?? {}; unlockedSpecies = saveData.unlockedSpecies ?? [DEFAULT_BIRD]; currentSpecies = saveData.currentSpecies ?? DEFAULT_BIRD; + unlockedHats = saveData.unlockedHats ?? [DEFAULT_HAT]; currentHat = saveData.currentHat ?? DEFAULT_HAT; stickyNotes = []; @@ -282,6 +288,7 @@ function startApplication(birbPixels, featherPixels, hatsPixels) { const saveData = { unlockedSpecies: unlockedSpecies, currentSpecies: currentSpecies, + unlockedHats: unlockedHats, currentHat: currentHat, settings: userSettings }; @@ -587,9 +594,13 @@ function startApplication(birbPixels, featherPixels, hatsPixels) { if (document.querySelector("#" + HAT_ID)) { return; } - // Select a random hat - const hats = Object.values(HAT); - const hatId = hats[Math.floor(Math.random() * (hats.length - 1)) + 1]; + // Select a random hat that hasn't been unlocked yet + const availableHats = Object.values(HAT) + .filter(hat => hat !== HAT.NONE && !unlockedHats.includes(hat)); + if (availableHats.length === 0) { + return; + } + const hatId = availableHats[Math.floor(Math.random() * availableHats.length)]; // Find a random valid element to place the hat on const element = getRandomValidElement(); @@ -608,15 +619,8 @@ function startApplication(birbPixels, featherPixels, hatsPixels) { return; } onClick(hatCanvas, () => { - switchHat(hatId); + unlockHat(hatId); hatCanvas.remove(); - const message = makeElement("birb-message-content"); - message.appendChild(document.createTextNode("You've unlocked the ")); - const bold = document.createElement("b"); - bold.textContent = HAT_METADATA[hatId].name; - message.appendChild(bold); - message.appendChild(document.createTextNode("! To see all of your unlocked accessories, click the Wardrobe from the menu.")); - insertModal("New Hat Found!", message); }); // Create hat animation @@ -638,6 +642,7 @@ function startApplication(birbPixels, featherPixels, hatsPixels) { function unlockBird(birdType) { if (!unlockedSpecies.includes(birdType)) { unlockedSpecies.push(birdType); + save(); const message = makeElement("birb-message-content"); message.appendChild(document.createTextNode("You've found a ")); const bold = document.createElement("b"); @@ -646,7 +651,24 @@ function startApplication(birbPixels, featherPixels, hatsPixels) { message.appendChild(document.createTextNode(" feather! Use the Field Guide to switch your bird's species.")); insertModal("New Bird Unlocked!", message); } - save(); + } + + /** + * @param {string} hatId + */ + function unlockHat(hatId) { + if (!unlockedHats.includes(hatId)) { + unlockedHats.push(hatId); + save(); + switchHat(hatId); + const message = makeElement("birb-message-content"); + message.appendChild(document.createTextNode("You've unlocked the ")); + const bold = document.createElement("b"); + bold.textContent = HAT_METADATA[hatId].name; + message.appendChild(bold); + message.appendChild(document.createTextNode("! To see all of your unlocked accessories, click the Wardrobe from the menu.")); + insertModal("New Hat Found!", message); + } } function updateFeather() { @@ -817,7 +839,7 @@ function startApplication(birbPixels, featherPixels, hatsPixels) { const generateDescription = (/** @type {string} */ hat) => { const metadata = HAT_METADATA[hat] ?? { name: "Unknown Hat", description: "todo" }; - const unlocked = true; + const unlocked = unlockedHats.includes(hat); const boldName = document.createElement("b"); boldName.textContent = metadata.name; @@ -837,7 +859,7 @@ function startApplication(birbPixels, featherPixels, hatsPixels) { description.appendChild(generateDescription(currentHat)); for (const hat of Object.values(HAT)) { - const unlocked = true; + const unlocked = unlockedHats.includes(hat); const hatElement = makeElement("birb-grid-item"); if (hat === currentHat) { hatElement.classList.add("birb-grid-item-selected"); @@ -849,7 +871,6 @@ function startApplication(birbPixels, featherPixels, hatsPixels) { if (!hatCtx) { return; } - console.log(hat); birb.getFrames().base.draw( hatCtx, Directions.RIGHT, @@ -903,7 +924,6 @@ function startApplication(birbPixels, featherPixels, hatsPixels) { * @param {string} hat */ function switchHat(hat) { - log("Switching hat to: " + hat); currentHat = hat; save(); } diff --git a/src/stylesheet.css b/src/stylesheet.css index 4ea5aab..8fdc58c 100644 --- a/src/stylesheet.css +++ b/src/stylesheet.css @@ -47,14 +47,14 @@ bottom: 0; transform: scale(calc(var(--birb-scale) * 1.5)) !important; transform-origin: bottom; - transition-duration: 0.2s; + transition-duration: 0.15s; z-index: 2147483630 !important; cursor: pointer; } .birb-item:hover { - transform: scale(calc(var(--birb-scale) * 2)) !important; - transition-duration: 0.2s; + transform: scale(calc(var(--birb-scale) * 1.9)) !important; + transition-duration: 0.15s; } .birb-window {