From 61fbe89986ea1db13ba8c68fd457d7bb8f061d09 Mon Sep 17 00:00:00 2001 From: Idrees Hassan Date: Sat, 21 Mar 2026 14:11:58 -0700 Subject: [PATCH] Prevent flying to the same element and reduce chirp volume --- dist/extension.zip | Bin 156864 -> 156711 bytes dist/extension/birb.js | 46 ++++++++++----------------------- dist/extension/manifest.json | 2 +- dist/obsidian/main.js | 48 ++++++++++------------------------- dist/obsidian/manifest.json | 2 +- dist/userscript/birb.user.js | 48 ++++++++++------------------------- dist/web/birb.embed.js | 46 ++++++++++----------------------- dist/web/birb.js | 46 ++++++++++----------------------- src/application.js | 40 ++++++++--------------------- src/sound.js | 2 +- 10 files changed, 80 insertions(+), 200 deletions(-) diff --git a/dist/extension.zip b/dist/extension.zip index 54b9ebfda644f61ac2f00ebee5db7dc54cc45602..6f15efdf8f8d98de8ccfcb711acc9910e56d1c5f 100644 GIT binary patch delta 29805 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 W>A$>^)j_Ey0AlD2&G*g-_WuAb0uVX? delta 30060 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 `Source Code ${isPetBoostActive() ? " ❤" : ""}`, () => { window.open("https://github.com/IdreesInc/Pocket-Bird"); }), - new MenuItem("2026.3.19", () => { alert("Thank you for using Pocket Bird! You are on version: 2026.3.19"); }, false), + new MenuItem("2026.3.20", () => { alert("Thank you for using Pocket Bird! You are on version: 2026.3.20"); }, false), ]; /** @type {Birb} */ @@ -2615,7 +2615,7 @@ setInterval(update, UPDATE_INTERVAL); - focusOnElement(true); + flyToElement(true); // TODO: Remove insertFieldGuide(); } @@ -2636,11 +2636,11 @@ // Idle for a while, do something if (focusedElement === null) { // Fly to an element - focusOnElement(); + flyToElement(); lastActionTimestamp = Date.now(); } else if (Math.random() < FOCUS_SWITCH_CHANCE) { // Fly to another element if idle for a longer while - focusOnElement(); + flyToElement(); lastActionTimestamp = Date.now(); } } @@ -2676,7 +2676,7 @@ // Update the bird's position if (currentState === States.IDLE) { if (focusedElement && !isWithinHorizontalBounds()) { - flySomewhere(); + flyToElement(); } birdY = getFocusedY(); } else if (currentState === States.FLYING) { @@ -2692,7 +2692,7 @@ startY += targetY - oldTargetY; if (targetY < 0 || targetY > getWindowHeight()) { // Fly to another element or the ground if the focused element moves out of bounds - flySomewhere(); + flyToElement(); } if (birb.draw(SPECIES[currentSpecies], currentHat)) { @@ -3211,26 +3211,6 @@ return getWindowHeight() - focusedBounds.top; } - /** - * Fly to either an element or the ground - */ - function flySomewhere() { - // On mobile, always prefer to focus on an element - // If not mobile, 50% chance to focus on ground - // if ((!isMobile() && coinFlip()) || !focusOnElement()) { - // focusOnGround(); - // } - if (!focusOnElement()) { - focusOnGround(); - } - } - - function focusOnGround() { - focusedElement = null; - updateFocusedElementBounds(); - flyTo(Math.random() * window.innerWidth, 0); - } - /** * @returns {HTMLElement|null} The random element, or null if no valid element was found */ @@ -3262,20 +3242,20 @@ } /** - * Focus on an element within the viewport + * Fly to an element within the viewport * @param {boolean} [teleport] Whether to teleport to the element instead of flying - * @returns Whether an element to focus on was found + * @returns Whether an element to fly to was found (null if flying to the ground) */ - function focusOnElement(teleport = false) { + function flyToElement(teleport = false) { if (frozen) { return false; } + const previousElement = focusedElement; focusedElement = getRandomValidElement(); - log("Focusing on element: ", focusedElement); updateFocusedElementBounds(); if (teleport) { teleportTo(getFocusedElementRandomX(), getFocusedY()); - } else { + } else if (focusedElement !== previousElement) { flyTo(getFocusedElementRandomX(), getFocusedY()); } return focusedElement !== null; diff --git a/dist/extension/manifest.json b/dist/extension/manifest.json index dcf0229..4a0742a 100644 --- a/dist/extension/manifest.json +++ b/dist/extension/manifest.json @@ -2,7 +2,7 @@ "manifest_version": 3, "name": "Pocket Bird", "description": "It's a pet bird in your browser, what more could you want?", - "version": "2026.3.19", + "version": "2026.3.20", "homepage_url": "https://idreesinc.com", "icons": { "48": "images/icons/transparent/48x48x1.png", diff --git a/dist/obsidian/main.js b/dist/obsidian/main.js index f0216dd..dcdb6be 100644 --- a/dist/obsidian/main.js +++ b/dist/obsidian/main.js @@ -1,7 +1,7 @@ const { Plugin, Notice } = require('obsidian'); module.exports = class PocketBird extends Plugin { onload() { - console.log("Loading Pocket Bird version 2026.3.19..."); + console.log("Loading Pocket Bird version 2026.3.20..."); const OBSIDIAN_PLUGIN = this; (function () { 'use strict'; @@ -483,7 +483,7 @@ module.exports = class PocketBird extends Plugin { "face": "#39333e", "wing": "#312c35", "wing-edge": "#171617", - "underbelly": "#ff82ba", + "underbelly": "#ff7eb8", "belly": "#ff6eaf", "foot": "#2e2c2e", "theme-highlight": "#ff82ba" @@ -1364,7 +1364,7 @@ module.exports = class PocketBird extends Plugin { 3500 + Math.random() * 600 * count, 2100 + Math.random() * 200 * count, 1600 + Math.random() * 400 * count]; - const VOLUMES = [0.0001, 0.2, 0.2, 0.0001]; + const VOLUMES = [0.00005, 0.165, 0.165, 0.0001]; const oscillator = this.audioContext.createOscillator(); oscillator.type = "sine"; @@ -2458,7 +2458,7 @@ module.exports = class PocketBird extends Plugin { }), new Separator(), new MenuItem(() => `Source Code ${isPetBoostActive() ? " ❤" : ""}`, () => { window.open("https://github.com/IdreesInc/Pocket-Bird"); }), - new MenuItem("2026.3.19", () => { alert("Thank you for using Pocket Bird! You are on version: 2026.3.19"); }, false), + new MenuItem("2026.3.20", () => { alert("Thank you for using Pocket Bird! You are on version: 2026.3.20"); }, false), ]; /** @type {Birb} */ @@ -2648,7 +2648,7 @@ module.exports = class PocketBird extends Plugin { setInterval(update, UPDATE_INTERVAL); - focusOnElement(true); + flyToElement(true); // TODO: Remove insertFieldGuide(); } @@ -2669,11 +2669,11 @@ module.exports = class PocketBird extends Plugin { // Idle for a while, do something if (focusedElement === null) { // Fly to an element - focusOnElement(); + flyToElement(); lastActionTimestamp = Date.now(); } else if (Math.random() < FOCUS_SWITCH_CHANCE) { // Fly to another element if idle for a longer while - focusOnElement(); + flyToElement(); lastActionTimestamp = Date.now(); } } @@ -2709,7 +2709,7 @@ module.exports = class PocketBird extends Plugin { // Update the bird's position if (currentState === States.IDLE) { if (focusedElement && !isWithinHorizontalBounds()) { - flySomewhere(); + flyToElement(); } birdY = getFocusedY(); } else if (currentState === States.FLYING) { @@ -2725,7 +2725,7 @@ module.exports = class PocketBird extends Plugin { startY += targetY - oldTargetY; if (targetY < 0 || targetY > getWindowHeight()) { // Fly to another element or the ground if the focused element moves out of bounds - flySomewhere(); + flyToElement(); } if (birb.draw(SPECIES[currentSpecies], currentHat)) { @@ -3244,26 +3244,6 @@ module.exports = class PocketBird extends Plugin { return getWindowHeight() - focusedBounds.top; } - /** - * Fly to either an element or the ground - */ - function flySomewhere() { - // On mobile, always prefer to focus on an element - // If not mobile, 50% chance to focus on ground - // if ((!isMobile() && coinFlip()) || !focusOnElement()) { - // focusOnGround(); - // } - if (!focusOnElement()) { - focusOnGround(); - } - } - - function focusOnGround() { - focusedElement = null; - updateFocusedElementBounds(); - flyTo(Math.random() * window.innerWidth, 0); - } - /** * @returns {HTMLElement|null} The random element, or null if no valid element was found */ @@ -3295,20 +3275,20 @@ module.exports = class PocketBird extends Plugin { } /** - * Focus on an element within the viewport + * Fly to an element within the viewport * @param {boolean} [teleport] Whether to teleport to the element instead of flying - * @returns Whether an element to focus on was found + * @returns Whether an element to fly to was found (null if flying to the ground) */ - function focusOnElement(teleport = false) { + function flyToElement(teleport = false) { if (frozen) { return false; } + const previousElement = focusedElement; focusedElement = getRandomValidElement(); - log("Focusing on element: ", focusedElement); updateFocusedElementBounds(); if (teleport) { teleportTo(getFocusedElementRandomX(), getFocusedY()); - } else { + } else if (focusedElement !== previousElement) { flyTo(getFocusedElementRandomX(), getFocusedY()); } return focusedElement !== null; diff --git a/dist/obsidian/manifest.json b/dist/obsidian/manifest.json index c82f80c..9c272df 100644 --- a/dist/obsidian/manifest.json +++ b/dist/obsidian/manifest.json @@ -1,7 +1,7 @@ { "id": "pocket-bird", "name": "Pocket Bird", - "version": "2026.3.19", + "version": "2026.3.20", "minAppVersion": "0.15.0", "description": "Add a pet bird to fly around your notes and keep you company!", "author": "Idrees Hassan", diff --git a/dist/userscript/birb.user.js b/dist/userscript/birb.user.js index da4c2c9..0736d79 100644 --- a/dist/userscript/birb.user.js +++ b/dist/userscript/birb.user.js @@ -1,7 +1,7 @@ // ==UserScript== // @name Pocket Bird // @namespace https://idreesinc.com -// @version 2026.3.19 +// @version 2026.3.20 // @description It's a pet bird in your browser, what more could you want? // @author Idrees // @downloadURL https://github.com/IdreesInc/Pocket-Bird/raw/refs/heads/main/dist/userscript/birb.user.js @@ -492,7 +492,7 @@ "face": "#39333e", "wing": "#312c35", "wing-edge": "#171617", - "underbelly": "#ff82ba", + "underbelly": "#ff7eb8", "belly": "#ff6eaf", "foot": "#2e2c2e", "theme-highlight": "#ff82ba" @@ -1373,7 +1373,7 @@ 3500 + Math.random() * 600 * count, 2100 + Math.random() * 200 * count, 1600 + Math.random() * 400 * count]; - const VOLUMES = [0.0001, 0.2, 0.2, 0.0001]; + const VOLUMES = [0.00005, 0.165, 0.165, 0.0001]; const oscillator = this.audioContext.createOscillator(); oscillator.type = "sine"; @@ -2420,7 +2420,7 @@ }), new Separator(), new MenuItem(() => `Source Code ${isPetBoostActive() ? " ❤" : ""}`, () => { window.open("https://github.com/IdreesInc/Pocket-Bird"); }), - new MenuItem("2026.3.19", () => { alert("Thank you for using Pocket Bird! You are on version: 2026.3.19"); }, false), + new MenuItem("2026.3.20", () => { alert("Thank you for using Pocket Bird! You are on version: 2026.3.20"); }, false), ]; /** @type {Birb} */ @@ -2610,7 +2610,7 @@ setInterval(update, UPDATE_INTERVAL); - focusOnElement(true); + flyToElement(true); // TODO: Remove insertFieldGuide(); } @@ -2631,11 +2631,11 @@ // Idle for a while, do something if (focusedElement === null) { // Fly to an element - focusOnElement(); + flyToElement(); lastActionTimestamp = Date.now(); } else if (Math.random() < FOCUS_SWITCH_CHANCE) { // Fly to another element if idle for a longer while - focusOnElement(); + flyToElement(); lastActionTimestamp = Date.now(); } } @@ -2671,7 +2671,7 @@ // Update the bird's position if (currentState === States.IDLE) { if (focusedElement && !isWithinHorizontalBounds()) { - flySomewhere(); + flyToElement(); } birdY = getFocusedY(); } else if (currentState === States.FLYING) { @@ -2687,7 +2687,7 @@ startY += targetY - oldTargetY; if (targetY < 0 || targetY > getWindowHeight()) { // Fly to another element or the ground if the focused element moves out of bounds - flySomewhere(); + flyToElement(); } if (birb.draw(SPECIES[currentSpecies], currentHat)) { @@ -3206,26 +3206,6 @@ return getWindowHeight() - focusedBounds.top; } - /** - * Fly to either an element or the ground - */ - function flySomewhere() { - // On mobile, always prefer to focus on an element - // If not mobile, 50% chance to focus on ground - // if ((!isMobile() && coinFlip()) || !focusOnElement()) { - // focusOnGround(); - // } - if (!focusOnElement()) { - focusOnGround(); - } - } - - function focusOnGround() { - focusedElement = null; - updateFocusedElementBounds(); - flyTo(Math.random() * window.innerWidth, 0); - } - /** * @returns {HTMLElement|null} The random element, or null if no valid element was found */ @@ -3257,20 +3237,20 @@ } /** - * Focus on an element within the viewport + * Fly to an element within the viewport * @param {boolean} [teleport] Whether to teleport to the element instead of flying - * @returns Whether an element to focus on was found + * @returns Whether an element to fly to was found (null if flying to the ground) */ - function focusOnElement(teleport = false) { + function flyToElement(teleport = false) { if (frozen) { return false; } + const previousElement = focusedElement; focusedElement = getRandomValidElement(); - log("Focusing on element: ", focusedElement); updateFocusedElementBounds(); if (teleport) { teleportTo(getFocusedElementRandomX(), getFocusedY()); - } else { + } else if (focusedElement !== previousElement) { flyTo(getFocusedElementRandomX(), getFocusedY()); } return focusedElement !== null; diff --git a/dist/web/birb.embed.js b/dist/web/birb.embed.js index 21c630e..9e5dc96 100644 --- a/dist/web/birb.embed.js +++ b/dist/web/birb.embed.js @@ -478,7 +478,7 @@ "face": "#39333e", "wing": "#312c35", "wing-edge": "#171617", - "underbelly": "#ff82ba", + "underbelly": "#ff7eb8", "belly": "#ff6eaf", "foot": "#2e2c2e", "theme-highlight": "#ff82ba" @@ -1359,7 +1359,7 @@ 3500 + Math.random() * 600 * count, 2100 + Math.random() * 200 * count, 1600 + Math.random() * 400 * count]; - const VOLUMES = [0.0001, 0.2, 0.2, 0.0001]; + const VOLUMES = [0.00005, 0.165, 0.165, 0.0001]; const oscillator = this.audioContext.createOscillator(); oscillator.type = "sine"; @@ -2400,7 +2400,7 @@ }), new Separator(), new MenuItem(() => `Source Code ${isPetBoostActive() ? " ❤" : ""}`, () => { window.open("https://github.com/IdreesInc/Pocket-Bird"); }), - new MenuItem("2026.3.19", () => { alert("Thank you for using Pocket Bird! You are on version: 2026.3.19"); }, false), + new MenuItem("2026.3.20", () => { alert("Thank you for using Pocket Bird! You are on version: 2026.3.20"); }, false), ]; /** @type {Birb} */ @@ -2590,7 +2590,7 @@ setInterval(update, UPDATE_INTERVAL); - focusOnElement(true); + flyToElement(true); // TODO: Remove insertFieldGuide(); } @@ -2611,11 +2611,11 @@ // Idle for a while, do something if (focusedElement === null) { // Fly to an element - focusOnElement(); + flyToElement(); lastActionTimestamp = Date.now(); } else if (Math.random() < FOCUS_SWITCH_CHANCE) { // Fly to another element if idle for a longer while - focusOnElement(); + flyToElement(); lastActionTimestamp = Date.now(); } } @@ -2651,7 +2651,7 @@ // Update the bird's position if (currentState === States.IDLE) { if (focusedElement && !isWithinHorizontalBounds()) { - flySomewhere(); + flyToElement(); } birdY = getFocusedY(); } else if (currentState === States.FLYING) { @@ -2667,7 +2667,7 @@ startY += targetY - oldTargetY; if (targetY < 0 || targetY > getWindowHeight()) { // Fly to another element or the ground if the focused element moves out of bounds - flySomewhere(); + flyToElement(); } if (birb.draw(SPECIES[currentSpecies], currentHat)) { @@ -3186,26 +3186,6 @@ return getWindowHeight() - focusedBounds.top; } - /** - * Fly to either an element or the ground - */ - function flySomewhere() { - // On mobile, always prefer to focus on an element - // If not mobile, 50% chance to focus on ground - // if ((!isMobile() && coinFlip()) || !focusOnElement()) { - // focusOnGround(); - // } - if (!focusOnElement()) { - focusOnGround(); - } - } - - function focusOnGround() { - focusedElement = null; - updateFocusedElementBounds(); - flyTo(Math.random() * window.innerWidth, 0); - } - /** * @returns {HTMLElement|null} The random element, or null if no valid element was found */ @@ -3237,20 +3217,20 @@ } /** - * Focus on an element within the viewport + * Fly to an element within the viewport * @param {boolean} [teleport] Whether to teleport to the element instead of flying - * @returns Whether an element to focus on was found + * @returns Whether an element to fly to was found (null if flying to the ground) */ - function focusOnElement(teleport = false) { + function flyToElement(teleport = false) { if (frozen) { return false; } + const previousElement = focusedElement; focusedElement = getRandomValidElement(); - log("Focusing on element: ", focusedElement); updateFocusedElementBounds(); if (teleport) { teleportTo(getFocusedElementRandomX(), getFocusedY()); - } else { + } else if (focusedElement !== previousElement) { flyTo(getFocusedElementRandomX(), getFocusedY()); } return focusedElement !== null; diff --git a/dist/web/birb.js b/dist/web/birb.js index 21c630e..9e5dc96 100644 --- a/dist/web/birb.js +++ b/dist/web/birb.js @@ -478,7 +478,7 @@ "face": "#39333e", "wing": "#312c35", "wing-edge": "#171617", - "underbelly": "#ff82ba", + "underbelly": "#ff7eb8", "belly": "#ff6eaf", "foot": "#2e2c2e", "theme-highlight": "#ff82ba" @@ -1359,7 +1359,7 @@ 3500 + Math.random() * 600 * count, 2100 + Math.random() * 200 * count, 1600 + Math.random() * 400 * count]; - const VOLUMES = [0.0001, 0.2, 0.2, 0.0001]; + const VOLUMES = [0.00005, 0.165, 0.165, 0.0001]; const oscillator = this.audioContext.createOscillator(); oscillator.type = "sine"; @@ -2400,7 +2400,7 @@ }), new Separator(), new MenuItem(() => `Source Code ${isPetBoostActive() ? " ❤" : ""}`, () => { window.open("https://github.com/IdreesInc/Pocket-Bird"); }), - new MenuItem("2026.3.19", () => { alert("Thank you for using Pocket Bird! You are on version: 2026.3.19"); }, false), + new MenuItem("2026.3.20", () => { alert("Thank you for using Pocket Bird! You are on version: 2026.3.20"); }, false), ]; /** @type {Birb} */ @@ -2590,7 +2590,7 @@ setInterval(update, UPDATE_INTERVAL); - focusOnElement(true); + flyToElement(true); // TODO: Remove insertFieldGuide(); } @@ -2611,11 +2611,11 @@ // Idle for a while, do something if (focusedElement === null) { // Fly to an element - focusOnElement(); + flyToElement(); lastActionTimestamp = Date.now(); } else if (Math.random() < FOCUS_SWITCH_CHANCE) { // Fly to another element if idle for a longer while - focusOnElement(); + flyToElement(); lastActionTimestamp = Date.now(); } } @@ -2651,7 +2651,7 @@ // Update the bird's position if (currentState === States.IDLE) { if (focusedElement && !isWithinHorizontalBounds()) { - flySomewhere(); + flyToElement(); } birdY = getFocusedY(); } else if (currentState === States.FLYING) { @@ -2667,7 +2667,7 @@ startY += targetY - oldTargetY; if (targetY < 0 || targetY > getWindowHeight()) { // Fly to another element or the ground if the focused element moves out of bounds - flySomewhere(); + flyToElement(); } if (birb.draw(SPECIES[currentSpecies], currentHat)) { @@ -3186,26 +3186,6 @@ return getWindowHeight() - focusedBounds.top; } - /** - * Fly to either an element or the ground - */ - function flySomewhere() { - // On mobile, always prefer to focus on an element - // If not mobile, 50% chance to focus on ground - // if ((!isMobile() && coinFlip()) || !focusOnElement()) { - // focusOnGround(); - // } - if (!focusOnElement()) { - focusOnGround(); - } - } - - function focusOnGround() { - focusedElement = null; - updateFocusedElementBounds(); - flyTo(Math.random() * window.innerWidth, 0); - } - /** * @returns {HTMLElement|null} The random element, or null if no valid element was found */ @@ -3237,20 +3217,20 @@ } /** - * Focus on an element within the viewport + * Fly to an element within the viewport * @param {boolean} [teleport] Whether to teleport to the element instead of flying - * @returns Whether an element to focus on was found + * @returns Whether an element to fly to was found (null if flying to the ground) */ - function focusOnElement(teleport = false) { + function flyToElement(teleport = false) { if (frozen) { return false; } + const previousElement = focusedElement; focusedElement = getRandomValidElement(); - log("Focusing on element: ", focusedElement); updateFocusedElementBounds(); if (teleport) { teleportTo(getFocusedElementRandomX(), getFocusedY()); - } else { + } else if (focusedElement !== previousElement) { flyTo(getFocusedElementRandomX(), getFocusedY()); } return focusedElement !== null; diff --git a/src/application.js b/src/application.js index ae5fc84..4c8736a 100644 --- a/src/application.js +++ b/src/application.js @@ -406,7 +406,7 @@ function startApplication(birbPixels, featherPixels, hatsPixels) { setInterval(update, UPDATE_INTERVAL); - focusOnElement(true); + flyToElement(true); // TODO: Remove insertFieldGuide(); } @@ -427,11 +427,11 @@ function startApplication(birbPixels, featherPixels, hatsPixels) { // Idle for a while, do something if (focusedElement === null) { // Fly to an element - focusOnElement(); + flyToElement(); lastActionTimestamp = Date.now(); } else if (Math.random() < FOCUS_SWITCH_CHANCE) { // Fly to another element if idle for a longer while - focusOnElement(); + flyToElement(); lastActionTimestamp = Date.now(); } } @@ -467,7 +467,7 @@ function startApplication(birbPixels, featherPixels, hatsPixels) { // Update the bird's position if (currentState === States.IDLE) { if (focusedElement && !isWithinHorizontalBounds()) { - flySomewhere(); + flyToElement(); } birdY = getFocusedY(); } else if (currentState === States.FLYING) { @@ -483,7 +483,7 @@ function startApplication(birbPixels, featherPixels, hatsPixels) { startY += targetY - oldTargetY; if (targetY < 0 || targetY > getWindowHeight()) { // Fly to another element or the ground if the focused element moves out of bounds - flySomewhere(); + flyToElement(); } if (birb.draw(SPECIES[currentSpecies], currentHat)) { @@ -1006,26 +1006,6 @@ function startApplication(birbPixels, featherPixels, hatsPixels) { return getWindowHeight() - focusedBounds.top; } - /** - * Fly to either an element or the ground - */ - function flySomewhere() { - // On mobile, always prefer to focus on an element - // If not mobile, 50% chance to focus on ground - // if ((!isMobile() && coinFlip()) || !focusOnElement()) { - // focusOnGround(); - // } - if (!focusOnElement()) { - focusOnGround(); - } - } - - function focusOnGround() { - focusedElement = null; - updateFocusedElementBounds(); - flyTo(Math.random() * window.innerWidth, 0); - } - /** * @returns {HTMLElement|null} The random element, or null if no valid element was found */ @@ -1063,20 +1043,20 @@ function startApplication(birbPixels, featherPixels, hatsPixels) { } /** - * Focus on an element within the viewport + * Fly to an element within the viewport * @param {boolean} [teleport] Whether to teleport to the element instead of flying - * @returns Whether an element to focus on was found + * @returns Whether an element to fly to was found (null if flying to the ground) */ - function focusOnElement(teleport = false) { + function flyToElement(teleport = false) { if (frozen) { return false; } + const previousElement = focusedElement; focusedElement = getRandomValidElement(); - log("Focusing on element: ", focusedElement); updateFocusedElementBounds(); if (teleport) { teleportTo(getFocusedElementRandomX(), getFocusedY()); - } else { + } else if (focusedElement !== previousElement) { flyTo(getFocusedElementRandomX(), getFocusedY()); } return focusedElement !== null; diff --git a/src/sound.js b/src/sound.js index 6c4f488..9e310b0 100644 --- a/src/sound.js +++ b/src/sound.js @@ -20,7 +20,7 @@ export class Birdsong { 3500 + Math.random() * 600 * count, 2100 + Math.random() * 200 * count, 1600 + Math.random() * 400 * count]; - const VOLUMES = [0.0001, 0.2, 0.2, 0.0001]; + const VOLUMES = [0.00005, 0.165, 0.165, 0.0001]; const oscillator = this.audioContext.createOscillator(); oscillator.type = "sine";