diff --git a/dist/birb.js b/dist/birb.js index bfe76a4..31cef6e 100644 --- a/dist/birb.js +++ b/dist/birb.js @@ -807,7 +807,7 @@ birbMode: false }; - + // Rendering constants const SPRITE_WIDTH = 32; const SPRITE_HEIGHT = 32; const FEATHER_SPRITE_WIDTH = 32; @@ -816,6 +816,7 @@ const CANVAS_PIXEL_SIZE = 1; const WINDOW_PIXEL_SIZE = CANVAS_PIXEL_SIZE * BIRB_CSS_SCALE; + // Build-time assets const STYLESHEET = `:root { --birb-border-size: 2px; --birb-neg-border-size: calc(var(--birb-border-size) * -1); @@ -1163,32 +1164,36 @@ const SPRITE_SHEET = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAUAAAAAgCAYAAABjE6FEAAAAAXNSR0IArs4c6QAABD5JREFUeJztnTFrFEEYht9JLAJidwju2YpdBAvzAyIWaXJXpRS0MBCwEBTJDwghhaAgGLTSyupMY2UqG9PYWQRb7yJyYJEIacxnkZ11bm5n9+7Y3Zm9ex8Imezd7Te7O9+zM7N7G4AQQgghhBBCCJkJlO8KkPAREXG9ppRiGyK1hY23BvgUkI7dbjYBAJ1ud6BcRR0IITOKxLSiSFpRNFTOkmNR8VtRJF8WF0U2NobKZccnpEzmfFeA5NNuNvG00UCn3R4qV8nB58942mgkZULqDgVYI3wJqNPtYrvfH1i23e8nQ2BCCCkFcwj8ZXEx+alqCJxWhypjE0ICQFKoOrZPAZl1oPwImTFE5Hzy3/hddXzfAvIhf0LK5ILvCtSNgxs3vMRVSikREZ+3nvB2F0JmFN3z0b0/9oKqx9cUBJleeEYfAzPp2BuqFr3v9W4XkcqPgS1dtoEZIe0CAM/AxAOy220JAG/zn3HsoNs/83R0cu8DNM+85g9yvqJVJBQwAYDdbksXvcx/KqWSOoTW+7Pzwkee1pHMiyDmzjQaH/QyETHfU0qDsIc+xnKIiITWEEl5PGh+8HqsfQp4FMxUWNvpJcvoPzdOAZriOVy7DzwCdm6/SV7f7bYH5mPKkFEIAiZE41vAGYhSKpHetHNlXsnRXynkWDhXIiIydzEaWHbveQ8f1+ew8uoMAHDy+wgA8P5JNHCWKUJGQwLGoIBvrbTxoPlBv7ewuITUDHGJ7/uPY3x9cd3LBaOyuDKvZOXVGT6uz6EICWYKELGA7r9O70JrASKWIAwZpQYb4yD4FjAJm7Wdnrx/Es36cc6VX6jD9VBwDoH1jbeu1035wZpzSGOSYfLZn96QgLX87Nj2cNy1TaPGJuFwurcsC6v7SpcBYGHVr/x8C3htp+d1Ys8VP+4I1SbPMisaCwune8vY+PUJAPDy8m0AwN3DdyMF+P7jGAAm6orr+Gk9UFvAGt0TTVkXQAnWlv/i26/8+KULuPp6mLgEZOZbySJy9j7rJMGRBWizsLqPmw8Pce3qpdTPWgdiIgH5FjAhmlDEpzndWxYzB+x8q0BA4sr/mRAgDAmmYYsPE/S+fAuYkJDpby3JxoUOMDjyqap9OwWIGkkwV4CI5/VsCZ18OwEANDYPXJ/9H2RC6fgWMCGh099aShr4nZ9vgfO2712C5oXJkPMut2JpEtLyS6OxeVDYhvsWMCEkF9GdEFuEWoIh599Ij8OKNwL9raXM9xUpP2RciTYFbNep6DoQQjJRX19cP084hwhDJleAWkJ5EixTPDo2UoRXVR0IIU4UzofeAyKcKsynYXSePU6eiqHLZT6gwPqid2r8sutACMnHfmJO6Pk41n+FU0qh8+xx8rdZRom9Lr3erPjs+RESBvGXEYAa5ONYj8Q3h6J2uQry4oe+swmZduqWg2Pfl+dcUQUb7js+IWS6+Ac8zd6eLzTjoQAAAABJRU5ErkJggg=="; const FEATHER_SPRITE_SHEET = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAARhJREFUWIXtlbENwjAQRf8hSiZIRQ+9WQNRUFIAKzACBSsAA1Ag1mAABqCCBomG3hQQ9OMEx4ZDNH5SikSJ3/fZ5wCJRCKRSPwZ0RzMWmtLAhGvQyUAi9mXP/aFaGjJRQQiguHihMvcFMJUVUYlAMuHixPGy4en1WmVQqgHYHkuZjiEj6a2/LjtYzTY0eiZbgC37Mxh1UN3sn/dr6cCz/LHB/DJj9s+2oMdbtdz6TtfFwQHcMvOInfmQNjsgchNWLXmdfK6gyioAu/6uKrsm1kWLAciKuCuey5nYuXAh234bdmZ6INIUw4E/Ix49xtjCmXfzLL8nY/ktdgnAKwxxgIoXIyqmAOwvIqfiN0ALNd21HYBO9XXGMAdnZTYyHWzWjQAAAAASUVORK5CYII="; + // Element IDs const FIELD_GUIDE_ID = "birb-field-guide"; const FEATHER_ID = "birb-feather"; const DEFAULT_BIRD = "bluebird"; + + // Birb movement const HOP_SPEED = 0.07; const FLY_SPEED = isMobile() ? 0.125 : 0.25; const HOP_DISTANCE = 45; - /** Speed at which the feather falls per tick */ - const FEATHER_FALL_SPEED = 1; - /** Time in milliseconds until the user is considered AFK */ - const AFK_TIME = isDebug() ? 0 : 1000 * 30; + + // Timing constants (in milliseconds) const UPDATE_INTERVAL = 1000 / 60; // 60 FPS - // Per-frame chances - const HOP_CHANCE = 1 / (60 * 3); // 3 seconds - const FOCUS_SWITCH_CHANCE = 1 / (60 * 20); // 20 seconds - const FEATHER_CHANCE = 1 / (60 * 60 * 60 * 2); // 2 hours - /** Multiplier after petting that increases the feather drop chance */ - const PET_FEATHER_BOOST = 2; - /** How long the pet boost lasts in milliseconds */ + const AFK_TIME = isDebug() ? 0 : 1000 * 30; const PET_BOOST_DURATION = 1000 * 60 * 5; + const PET_MENU_COOLDOWN = 1000; + const URL_CHECK_INTERVAL = 500; + + // Random event chances per tick + const HOP_CHANCE = 1 / (60 * 3); // Every 3 seconds + const FOCUS_SWITCH_CHANCE = 1 / (60 * 20); // Every 20 seconds + const FEATHER_CHANCE = 1 / (60 * 60 * 60 * 2); // Every 2 hours + + // Feathers + const FEATHER_FALL_SPEED = 1; + const PET_FEATHER_BOOST = 2; + + // Focus element constraints const MIN_FOCUS_ELEMENT_WIDTH = 100; const MIN_FOCUS_ELEMENT_TOP = 80; - /** Time between checking whether the URL has changed */ - const URL_CHECK_INTERVAL = 500; - /** Time after petting before the menu can be opened */ - const PET_MENU_COOLDOWN = 1000; /** @type {Partial} */ let userSettings = {}; diff --git a/dist/birb.user.js b/dist/birb.user.js index b29e5ad..206e0d9 100644 --- a/dist/birb.user.js +++ b/dist/birb.user.js @@ -1,7 +1,7 @@ // ==UserScript== // @name Pocket Bird // @namespace https://idreesinc.com -// @version 2025.10.26.221 +// @version 2025.10.26.227 // @description birb // @author Idrees // @downloadURL https://github.com/IdreesInc/Pocket-Bird/raw/refs/heads/main/dist/birb.user.js @@ -821,7 +821,7 @@ birbMode: false }; - + // Rendering constants const SPRITE_WIDTH = 32; const SPRITE_HEIGHT = 32; const FEATHER_SPRITE_WIDTH = 32; @@ -830,6 +830,7 @@ const CANVAS_PIXEL_SIZE = 1; const WINDOW_PIXEL_SIZE = CANVAS_PIXEL_SIZE * BIRB_CSS_SCALE; + // Build-time assets const STYLESHEET = `:root { --birb-border-size: 2px; --birb-neg-border-size: calc(var(--birb-border-size) * -1); @@ -1177,32 +1178,36 @@ const SPRITE_SHEET = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAUAAAAAgCAYAAABjE6FEAAAAAXNSR0IArs4c6QAABD5JREFUeJztnTFrFEEYht9JLAJidwju2YpdBAvzAyIWaXJXpRS0MBCwEBTJDwghhaAgGLTSyupMY2UqG9PYWQRb7yJyYJEIacxnkZ11bm5n9+7Y3Zm9ex8Imezd7Te7O9+zM7N7G4AQQgghhBBCCJkJlO8KkPAREXG9ppRiGyK1hY23BvgUkI7dbjYBAJ1ud6BcRR0IITOKxLSiSFpRNFTOkmNR8VtRJF8WF0U2NobKZccnpEzmfFeA5NNuNvG00UCn3R4qV8nB58942mgkZULqDgVYI3wJqNPtYrvfH1i23e8nQ2BCCCkFcwj8ZXEx+alqCJxWhypjE0ICQFKoOrZPAZl1oPwImTFE5Hzy3/hddXzfAvIhf0LK5ILvCtSNgxs3vMRVSikREZ+3nvB2F0JmFN3z0b0/9oKqx9cUBJleeEYfAzPp2BuqFr3v9W4XkcqPgS1dtoEZIe0CAM/AxAOy220JAG/zn3HsoNs/83R0cu8DNM+85g9yvqJVJBQwAYDdbksXvcx/KqWSOoTW+7Pzwkee1pHMiyDmzjQaH/QyETHfU0qDsIc+xnKIiITWEEl5PGh+8HqsfQp4FMxUWNvpJcvoPzdOAZriOVy7DzwCdm6/SV7f7bYH5mPKkFEIAiZE41vAGYhSKpHetHNlXsnRXynkWDhXIiIydzEaWHbveQ8f1+ew8uoMAHDy+wgA8P5JNHCWKUJGQwLGoIBvrbTxoPlBv7ewuITUDHGJ7/uPY3x9cd3LBaOyuDKvZOXVGT6uz6EICWYKELGA7r9O70JrASKWIAwZpQYb4yD4FjAJm7Wdnrx/Es36cc6VX6jD9VBwDoH1jbeu1035wZpzSGOSYfLZn96QgLX87Nj2cNy1TaPGJuFwurcsC6v7SpcBYGHVr/x8C3htp+d1Ys8VP+4I1SbPMisaCwune8vY+PUJAPDy8m0AwN3DdyMF+P7jGAAm6orr+Gk9UFvAGt0TTVkXQAnWlv/i26/8+KULuPp6mLgEZOZbySJy9j7rJMGRBWizsLqPmw8Pce3qpdTPWgdiIgH5FjAhmlDEpzndWxYzB+x8q0BA4sr/mRAgDAmmYYsPE/S+fAuYkJDpby3JxoUOMDjyqap9OwWIGkkwV4CI5/VsCZ18OwEANDYPXJ/9H2RC6fgWMCGh099aShr4nZ9vgfO2712C5oXJkPMut2JpEtLyS6OxeVDYhvsWMCEkF9GdEFuEWoIh599Ij8OKNwL9raXM9xUpP2RciTYFbNep6DoQQjJRX19cP084hwhDJleAWkJ5EixTPDo2UoRXVR0IIU4UzofeAyKcKsynYXSePU6eiqHLZT6gwPqid2r8sutACMnHfmJO6Pk41n+FU0qh8+xx8rdZRom9Lr3erPjs+RESBvGXEYAa5ONYj8Q3h6J2uQry4oe+swmZduqWg2Pfl+dcUQUb7js+IWS6+Ac8zd6eLzTjoQAAAABJRU5ErkJggg=="; const FEATHER_SPRITE_SHEET = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAARhJREFUWIXtlbENwjAQRf8hSiZIRQ+9WQNRUFIAKzACBSsAA1Ag1mAABqCCBomG3hQQ9OMEx4ZDNH5SikSJ3/fZ5wCJRCKRSPwZ0RzMWmtLAhGvQyUAi9mXP/aFaGjJRQQiguHihMvcFMJUVUYlAMuHixPGy4en1WmVQqgHYHkuZjiEj6a2/LjtYzTY0eiZbgC37Mxh1UN3sn/dr6cCz/LHB/DJj9s+2oMdbtdz6TtfFwQHcMvOInfmQNjsgchNWLXmdfK6gyioAu/6uKrsm1kWLAciKuCuey5nYuXAh234bdmZ6INIUw4E/Ix49xtjCmXfzLL8nY/ktdgnAKwxxgIoXIyqmAOwvIqfiN0ALNd21HYBO9XXGMAdnZTYyHWzWjQAAAAASUVORK5CYII="; + // Element IDs const FIELD_GUIDE_ID = "birb-field-guide"; const FEATHER_ID = "birb-feather"; const DEFAULT_BIRD = "bluebird"; + + // Birb movement const HOP_SPEED = 0.07; const FLY_SPEED = isMobile() ? 0.125 : 0.25; const HOP_DISTANCE = 45; - /** Speed at which the feather falls per tick */ - const FEATHER_FALL_SPEED = 1; - /** Time in milliseconds until the user is considered AFK */ - const AFK_TIME = isDebug() ? 0 : 1000 * 30; + + // Timing constants (in milliseconds) const UPDATE_INTERVAL = 1000 / 60; // 60 FPS - // Per-frame chances - const HOP_CHANCE = 1 / (60 * 3); // 3 seconds - const FOCUS_SWITCH_CHANCE = 1 / (60 * 20); // 20 seconds - const FEATHER_CHANCE = 1 / (60 * 60 * 60 * 2); // 2 hours - /** Multiplier after petting that increases the feather drop chance */ - const PET_FEATHER_BOOST = 2; - /** How long the pet boost lasts in milliseconds */ + const AFK_TIME = isDebug() ? 0 : 1000 * 30; const PET_BOOST_DURATION = 1000 * 60 * 5; + const PET_MENU_COOLDOWN = 1000; + const URL_CHECK_INTERVAL = 500; + + // Random event chances per tick + const HOP_CHANCE = 1 / (60 * 3); // Every 3 seconds + const FOCUS_SWITCH_CHANCE = 1 / (60 * 20); // Every 20 seconds + const FEATHER_CHANCE = 1 / (60 * 60 * 60 * 2); // Every 2 hours + + // Feathers + const FEATHER_FALL_SPEED = 1; + const PET_FEATHER_BOOST = 2; + + // Focus element constraints const MIN_FOCUS_ELEMENT_WIDTH = 100; const MIN_FOCUS_ELEMENT_TOP = 80; - /** Time between checking whether the URL has changed */ - const URL_CHECK_INTERVAL = 500; - /** Time after petting before the menu can be opened */ - const PET_MENU_COOLDOWN = 1000; /** @type {Partial} */ let userSettings = {}; diff --git a/manifest.json b/manifest.json index 03c371b..a370218 100644 --- a/manifest.json +++ b/manifest.json @@ -2,7 +2,7 @@ "manifest_version": 3, "name": "Pocket Bird", "description": "It's a bird, in your browser. What more could you want?", - "version": "2025.10.26.221", + "version": "2025.10.26.227", "homepage_url": "https://idreesinc.com", "content_scripts": [ { diff --git a/src/birb.js b/src/birb.js index ce5c97d..283bfb3 100644 --- a/src/birb.js +++ b/src/birb.js @@ -55,7 +55,7 @@ const DEFAULT_SETTINGS = { birbMode: false }; - +// Rendering constants const SPRITE_WIDTH = 32; const SPRITE_HEIGHT = 32; const FEATHER_SPRITE_WIDTH = 32; @@ -64,36 +64,41 @@ const UI_CSS_SCALE = isMobile() ? 0.9 : 1; const CANVAS_PIXEL_SIZE = 1; const WINDOW_PIXEL_SIZE = CANVAS_PIXEL_SIZE * BIRB_CSS_SCALE; +// Build-time assets const STYLESHEET = `___STYLESHEET___`; const SPRITE_SHEET = "__SPRITE_SHEET__"; const FEATHER_SPRITE_SHEET = "__FEATHER_SPRITE_SHEET__"; +// Element IDs const FIELD_GUIDE_ID = "birb-field-guide"; const FEATHER_ID = "birb-feather"; const DEFAULT_BIRD = "bluebird"; + +// Birb movement const HOP_SPEED = 0.07; const FLY_SPEED = isMobile() ? 0.125 : 0.25; const HOP_DISTANCE = 45; -/** Speed at which the feather falls per tick */ -const FEATHER_FALL_SPEED = 1; -/** Time in milliseconds until the user is considered AFK */ -const AFK_TIME = isDebug() ? 0 : 1000 * 30; + +// Timing constants (in milliseconds) const UPDATE_INTERVAL = 1000 / 60; // 60 FPS -// Per-frame chances -const HOP_CHANCE = 1 / (60 * 3); // 3 seconds -const FOCUS_SWITCH_CHANCE = 1 / (60 * 20); // 20 seconds -const FEATHER_CHANCE = 1 / (60 * 60 * 60 * 2); // 2 hours -/** Multiplier after petting that increases the feather drop chance */ -const PET_FEATHER_BOOST = 2; -/** How long the pet boost lasts in milliseconds */ +const AFK_TIME = isDebug() ? 0 : 1000 * 30; const PET_BOOST_DURATION = 1000 * 60 * 5; +const PET_MENU_COOLDOWN = 1000; +const URL_CHECK_INTERVAL = 500; + +// Random event chances per tick +const HOP_CHANCE = 1 / (60 * 3); // Every 3 seconds +const FOCUS_SWITCH_CHANCE = 1 / (60 * 20); // Every 20 seconds +const FEATHER_CHANCE = 1 / (60 * 60 * 60 * 2); // Every 2 hours + +// Feathers +const FEATHER_FALL_SPEED = 1; +const PET_FEATHER_BOOST = 2; + +// Focus element constraints const MIN_FOCUS_ELEMENT_WIDTH = 100; const MIN_FOCUS_ELEMENT_TOP = 80; -/** Time between checking whether the URL has changed */ -const URL_CHECK_INTERVAL = 500; -/** Time after petting before the menu can be opened */ -const PET_MENU_COOLDOWN = 1000; /** @type {Partial} */ let userSettings = {}; @@ -853,10 +858,6 @@ Promise.all([ } } - function isSafari() { - return /^((?!chrome|android).)*safari/i.test(navigator.userAgent); - } - /** * @param {string} type */