Allow hiding the birb

This commit is contained in:
Idrees Hassan
2024-12-30 23:22:25 -05:00
parent 6c588956de
commit de4c6c72e2

120
birb.js
View File

@@ -49,6 +49,7 @@ const styles = `
--double-border-size: calc(var(--border-size) * 2); --double-border-size: calc(var(--border-size) * 2);
--neg-double-border-size: calc(var(--neg-border-size) * 2); --neg-double-border-size: calc(var(--neg-border-size) * 2);
--border-color: #000000; --border-color: #000000;
--highlight: #ffa3cb;
} }
#birb { #birb {
@@ -100,6 +101,7 @@ const styles = `
#${MENU_ID} { #${MENU_ID} {
transition-duration: 0.2s; transition-duration: 0.2s;
transition-timing-function: ease-out; transition-timing-function: ease-out;
min-width: 140px;
} }
#${MENU_EXIT_ID} { #${MENU_EXIT_ID} {
@@ -127,11 +129,11 @@ const styles = `
padding-bottom: 4px; padding-bottom: 4px;
padding-left: 30px; padding-left: 30px;
padding-right: 30px; padding-right: 30px;
background-color: #ffa3cb; background-color: var(--highlight);
box-shadow: box-shadow:
var(--border-size) 0 #ffa3cb, var(--border-size) 0 var(--highlight),
var(--neg-border-size) 0 #ffa3cb, var(--neg-border-size) 0 var(--highlight),
0 var(--neg-border-size) #ffa3cb, 0 var(--neg-border-size) var(--highlight),
var(--neg-border-size) var(--border-size) var(--border-color), var(--neg-border-size) var(--border-size) var(--border-color),
var(--border-size) var(--border-size) var(--border-color); var(--border-size) var(--border-size) var(--border-color);
color: var(--border-color); color: var(--border-color);
@@ -199,6 +201,19 @@ const styles = `
aspect-ratio: 1; aspect-ratio: 1;
} }
.birb-music-player-content {
background: #ffecda;
box-shadow:
var(--border-size) 0 #ffecda,
var(--neg-border-size) 0 #ffecda,
0 var(--border-size) #ffecda,
0 var(--neg-border-size) var(--border-color),
0 var(--border-size) var(--border-color);
display: flex;
justify-content: center;
overflow: hidden;
padding: 10px;
}
.birb-window-list-item { .birb-window-list-item {
width: 100%; width: 100%;
@@ -277,6 +292,10 @@ const styles = `
filter: contrast(90%); filter: contrast(90%);
} }
.birb-grid-item-selected {
border: var(--border-size) solid var(--highlight);
}
.birb-field-guide-description { .birb-field-guide-description {
box-sizing: border-box; box-sizing: border-box;
width: 100%; width: 100%;
@@ -713,22 +732,31 @@ Promise.all([loadSpritesheetPixels(SPRITE_SHEET_URI), loadSpritesheetPixels(DECO
new MenuItem("Pet Birb", pet), new MenuItem("Pet Birb", pet),
new MenuItem("Field Guide", insertFieldGuide), new MenuItem("Field Guide", insertFieldGuide),
// new MenuItem("Decorations", insertDecoration), // new MenuItem("Decorations", insertDecoration),
new MenuItem("Programs", () => {}), // new MenuItem("Utilities", () => {}),
new MenuItem("Games", () => switchMenuItems(programItems), false), new MenuItem("Applications", () => switchMenuItems(otherItems), false),
new MenuItem("Hide Birb", hideBirb),
new Separator(), new Separator(),
new MenuItem("Settings", () => {}), new MenuItem("Settings", () => {}),
]; ];
const programItems = [ const otherItems = [
new MenuItem("Go Back", () => switchMenuItems(menuItems), false), new MenuItem("Go Back", () => switchMenuItems(menuItems), false),
new Separator(), new Separator(),
// new MenuItem("Utilities", () => {}),
new MenuItem("Video Games", () => switchMenuItems(gameItems), false),
new MenuItem("Music Player", () => insertMusicPlayer(), false),
];
const gameItems = [
new MenuItem("Go Back", () => switchMenuItems(otherItems), false),
new Separator(),
new MenuItem("Pinball", () => insertPico8("Terra Nova Pinball", "terra_nova_pinball")),
new MenuItem("Pico Dino", () => insertPico8("Pico Dino", "picodino")), new MenuItem("Pico Dino", () => insertPico8("Pico Dino", "picodino")),
new MenuItem("Tetraminis", () => insertPico8("Tetraminis", "tetraminisdeffect")),
new MenuItem("Woodworm", () => insertPico8("Woodworm", "woodworm")), new MenuItem("Woodworm", () => insertPico8("Woodworm", "woodworm")),
// new MenuItem("Wobblepaint ", () => insertPico8("Wobblepaint", "wobblepaint")), // new MenuItem("Wobblepaint ", () => insertPico8("Wobblepaint", "wobblepaint")),
new MenuItem("Pinball", () => insertPico8("Terra Nova Pinball", "terra_nova_pinball")),
new MenuItem("Pico and Chill", () => insertPico8("Pico and Chill", "picochill")), new MenuItem("Pico and Chill", () => insertPico8("Pico and Chill", "picochill")),
new MenuItem("Celeste 2", () => insertPico8("Celeste 2", "celeste_classic_2")), new MenuItem("Lani's Trek", () => insertPico8("Celeste 2 Lani's Trek", "celeste_classic_2")),
new MenuItem("Tetraminis", () => insertPico8("Tetraminis", "tetraminisdeffect")),
// new MenuItem("Pool", () => insertPico8("Pool", "mot_pool")), // new MenuItem("Pool", () => insertPico8("Pool", "mot_pool")),
]; ];
@@ -764,8 +792,9 @@ Promise.all([loadSpritesheetPixels(SPRITE_SHEET_URI), loadSpritesheetPixels(DECO
let focusedElement = null; let focusedElement = null;
let timeOfLastAction = Date.now(); let timeOfLastAction = Date.now();
let petStack = []; let petStack = [];
let currentTheme = "tuftedTitmouse"; let currentTheme = "bluebird";
let unlockedThemes = ["tuftedTitmouse"]; let unlockedThemes = ["bluebird"];
let visible = true;
function init() { function init() {
if (window !== window.top) { if (window !== window.top) {
@@ -831,7 +860,7 @@ Promise.all([loadSpritesheetPixels(SPRITE_SHEET_URI), loadSpritesheetPixels(DECO
setState(States.IDLE); setState(States.IDLE);
} }
} }
if (Math.random() < 1 / (60 * 3)) { if (visible && Math.random() < 1 / (60 * 3)) {
activateFeather(); activateFeather();
} }
updateFeather(); updateFeather();
@@ -840,6 +869,10 @@ Promise.all([loadSpritesheetPixels(SPRITE_SHEET_URI), loadSpritesheetPixels(DECO
function draw() { function draw() {
requestAnimationFrame(draw); requestAnimationFrame(draw);
if (!visible) {
return;
}
// Update the bird's position // Update the bird's position
if (currentState === States.IDLE) { if (currentState === States.IDLE) {
if (focusedElement !== null) { if (focusedElement !== null) {
@@ -1010,7 +1043,7 @@ Promise.all([loadSpritesheetPixels(SPRITE_SHEET_URI), loadSpritesheetPixels(DECO
</div> </div>
</div>` </div>`
const modal = makeElement("birb-window"); const modal = makeElement("birb-window");
modal.style.width = "250px"; modal.style.width = "270px";
modal.innerHTML = html; modal.innerHTML = html;
modal.style.left = `${window.innerWidth / 2 - 115}px`; modal.style.left = `${window.innerWidth / 2 - 115}px`;
modal.style.top = `${window.innerHeight / 2 - 115}px`; modal.style.top = `${window.innerHeight / 2 - 115}px`;
@@ -1019,9 +1052,9 @@ Promise.all([loadSpritesheetPixels(SPRITE_SHEET_URI), loadSpritesheetPixels(DECO
const closeButton = modal.querySelector(".birb-window-close"); const closeButton = modal.querySelector(".birb-window-close");
if (closeButton) { if (closeButton) {
makeClosable(closeButton, () => { makeClosable(() => {
modal.remove(); modal.remove();
}); }, closeButton);
} }
} }
@@ -1047,9 +1080,9 @@ Promise.all([loadSpritesheetPixels(SPRITE_SHEET_URI), loadSpritesheetPixels(DECO
const closeButton = fieldGuide.querySelector(".birb-window-close"); const closeButton = fieldGuide.querySelector(".birb-window-close");
if (closeButton) { if (closeButton) {
makeClosable(closeButton, () => { makeClosable(() => {
fieldGuide.remove(); fieldGuide.remove();
}); }, closeButton);
} }
const content = fieldGuide.querySelector(".birb-grid-content"); const content = fieldGuide.querySelector(".birb-grid-content");
@@ -1072,6 +1105,9 @@ Promise.all([loadSpritesheetPixels(SPRITE_SHEET_URI), loadSpritesheetPixels(DECO
for (const [id, theme] of Object.entries(species)) { for (const [id, theme] of Object.entries(species)) {
const unlocked = unlockedThemes.includes(id); const unlocked = unlockedThemes.includes(id);
const themeElement = makeElement("birb-grid-item"); const themeElement = makeElement("birb-grid-item");
if (id === currentTheme) {
themeElement.classList.add("birb-grid-item-selected");
}
const themeCanvas = document.createElement("canvas"); const themeCanvas = document.createElement("canvas");
themeCanvas.width = SPRITE_WIDTH * CANVAS_PIXEL_SIZE; themeCanvas.width = SPRITE_WIDTH * CANVAS_PIXEL_SIZE;
themeCanvas.height = SPRITE_HEIGHT * CANVAS_PIXEL_SIZE; themeCanvas.height = SPRITE_HEIGHT * CANVAS_PIXEL_SIZE;
@@ -1085,7 +1121,10 @@ Promise.all([loadSpritesheetPixels(SPRITE_SHEET_URI), loadSpritesheetPixels(DECO
if (unlocked) { if (unlocked) {
themeElement.addEventListener("click", () => { themeElement.addEventListener("click", () => {
switchTheme(id); switchTheme(id);
fieldGuide.remove(); document.querySelectorAll(".birb-grid-item").forEach((element) => {
element.classList.remove("birb-grid-item-selected");
});
themeElement.classList.add("birb-grid-item-selected");
}); });
} else { } else {
themeElement.classList.add("birb-grid-item-locked"); themeElement.classList.add("birb-grid-item-locked");
@@ -1101,11 +1140,13 @@ Promise.all([loadSpritesheetPixels(SPRITE_SHEET_URI), loadSpritesheetPixels(DECO
} }
/** /**
* @param {Element} closeButton
* @param {() => void} func * @param {() => void} func
* @param {Element} [closeButton]
*/ */
function makeClosable(closeButton, func) { function makeClosable(func, closeButton) {
closeButton.addEventListener("click", func); if (closeButton) {
closeButton.addEventListener("click", func);
}
document.addEventListener("keydown", (e) => { document.addEventListener("keydown", (e) => {
if (e.key === "Escape") { if (e.key === "Escape") {
func(); func();
@@ -1147,9 +1188,32 @@ Promise.all([loadSpritesheetPixels(SPRITE_SHEET_URI), loadSpritesheetPixels(DECO
makeDraggable(pico8.querySelector(".birb-window-header")); makeDraggable(pico8.querySelector(".birb-window-header"));
const close = pico8.querySelector(".birb-window-close"); const close = pico8.querySelector(".birb-window-close");
if (close) { if (close) {
makeClosable(close, () => { makeClosable(() => {
pico8.remove(); pico8.remove();
}); }, close);
}
}
function insertMusicPlayer() {
let html = `
<div class="birb-window-header">
<div class="birb-window-title">Music Player</div>
<div class="birb-window-close">x</div>
</div>
<div class="birb-window-content birb-music-player-content">
<iframe style="border-radius:12px" src="https://open.spotify.com/embed/playlist/31FWVQBp3WQydWLNhO0ACi?utm_source=generator" width="250" height="352" frameBorder="0" allowfullscreen="" allow="autoplay; clipboard-write; encrypted-media; fullscreen; picture-in-picture" loading="lazy"></iframe>
</div>`;
const pico8 = makeElement("birb-window");
pico8.innerHTML = html;
pico8.style.left = `${window.innerWidth / 2 - 115}px`;
pico8.style.top = `${window.innerHeight / 2 - 115}px`;
document.body.appendChild(pico8);
makeDraggable(pico8.querySelector(".birb-window-header"));
const close = pico8.querySelector(".birb-window-close");
if (close) {
makeClosable(() => {
pico8.remove();
}, close);
} }
} }
@@ -1184,6 +1248,7 @@ Promise.all([loadSpritesheetPixels(SPRITE_SHEET_URI), loadSpritesheetPixels(DECO
removeMenu(); removeMenu();
}); });
document.body.appendChild(menuExit); document.body.appendChild(menuExit);
makeClosable(removeMenu);
updateMenuLocation(menu); updateMenuLocation(menu);
} }
@@ -1453,6 +1518,11 @@ Promise.all([loadSpritesheetPixels(SPRITE_SHEET_URI), loadSpritesheetPixels(DECO
} }
} }
function hideBirb() {
canvas.style.display = "none";
visible = false;
}
/** /**
* @param {number} x * @param {number} x
* @param {number} y * @param {number} y