diff --git a/fx_core.js b/fx_core.js index 26389e4..38730e1 100644 --- a/fx_core.js +++ b/fx_core.js @@ -1,6 +1,6 @@ -const dictionary = {"gIsTeamGame":"hM","playerId":"eU","playerNames":"jm","playerBalances":"eV","playerTerritories":"ez","gHumans":"h1","playerStates":"h3","gLobbyMaxJoin":"px","gIsSingleplayer":"im","uiSizes":"b0","gap":"gap"}; -const fx_version = '0.6.3.3'; // FX Client Version -const fx_update = 'Apr 11'; // FX Client Last Updated +const dictionary = {"gIsTeamGame":"hM","playerId":"eU","playerNames":"jm","playerBalances":"eV","playerTerritories":"ez","gHumans":"h1","playerStates":"h3","gLobbyMaxJoin":"px","gIsSingleplayer":"im","gameState":"rS","uiSizes":"b0","gap":"gap"}; +const fx_version = '0.6.4'; // FX Client Version +const fx_update = 'May 20'; // FX Client Last Updated if (localStorage.getItem("fx_winCount") == undefined || localStorage.getItem("fx_winCount") == null) { var wins_counter = 0; @@ -28,8 +28,9 @@ function KeybindsInput(containerElement) { this.keys = [ "key", "type", "value" ]; this.objectArray = []; this.addObject = function () { - this.objectArray.push({ key: "", type: "absolute", value: 1 }); + this.objectArray.push({ key: "", type: "absolute", value: 0.8 }); this.displayObjects(); + keybindAddButton.scrollIntoView(false); }; this.update = function () { this.objectArray = settings.attackPercentageKeybinds; @@ -55,11 +56,15 @@ function KeybindsInput(containerElement) { inputField.setAttribute("placeholder", "No key set"); inputField.addEventListener("click", this.startKeyInput.bind(this, i, key)); } else { // key === "value" - inputField.type = "number"; - inputField.setAttribute("step", "0.1"); + const isAbsolute = this.objectArray[i].type === "absolute"; + inputField.type = isAbsolute ? "text" : "number"; + if (isAbsolute) inputField.addEventListener("click", this.convertIntoNumberInput.bind(this, i, key), { once: true }); + else inputField.setAttribute("step", "0.1"); inputField.addEventListener("input", this.updateObject.bind(this, i, key)); } - inputField.value = this.objectArray[i][key]; + if (key === "value" && this.objectArray[i].type === "absolute") + inputField.value = this.objectArray[i][key] * 100 + "%"; + else inputField.value = this.objectArray[i][key]; // Append input field to the object div objectDiv.appendChild(inputField); }, this); @@ -84,10 +89,21 @@ function KeybindsInput(containerElement) { //this.displayObjects(); }, { once: true }); }; + /** @param {PointerEvent} event */ + this.convertIntoNumberInput = function (index, property, event) { + event.target.value = event.target.value.slice(0, -1); + event.target.type = "number"; + event.target.addEventListener("blur", () => { + //event.target.value = this.objectArray[index][property]; + this.displayObjects(); + }, { once: true }); + }; this.updateObject = function (index, property, event) { if (index >= this.objectArray.length) return; // Update the corresponding property of the object in the array - const value = property === "value" ? parseFloat(event.target.value) : property === "key" ? event.key : event.target.value; + const value = property === "value" ? ( + this.objectArray[index].type === "absolute" ? parseFloat(event.target.value) / 100 : parseFloat(event.target.value) + ) : property === "key" ? event.key : event.target.value; this.objectArray[index][property] = value; if (property === "key") this.displayObjects(); }; @@ -105,6 +121,7 @@ var settings = { //"showBotDonations": false, "displayWinCounter": true, "useFullscreenMode": false, + "hoveringTooltip": true, //"hideAllLinks": false, "realisticNames": false, "showPlayerDensity": true, @@ -124,6 +141,8 @@ var settingsManager = new (function() { note: "The win counter tracks multiplayer solo wins (not in team games)" }, { for: "useFullscreenMode", type: "checkbox", label: "Use fullscreen mode", note: "Note: fullscreen mode will trigger after you click anywhere on the page due to browser policy restrictions." }, + { for: "hoveringTooltip", type: "checkbox", label: "Hovering tooltip", + note: "Display map territory info constantly (on mouse hover) instead of only when right clicking on the map" }, //{ for: "hideAllLinks", type: "checkbox", label: "Hide Links option also hides app store links" }, { for: "realisticNames", type: "checkbox", label: "Realistic Bot Names" }, { for: "showPlayerDensity", type: "checkbox", label: "Show player density" }, @@ -323,6 +342,106 @@ const playerList = new (function () { canvas.imageSmoothingEnabled = false; } }); + +/** @param {string} name */ +function parseClanFromPlayerName(name) { + const startIndex = name.indexOf("["); + // this is probably how the algorithm works, since a player with + // the name "][a]" will count as not being in a clan in the base game + return startIndex === -1 ? "" : name.slice(startIndex + 1, name.indexOf("]")).toUpperCase(); +} + +const leaderboardFilter = new (function() { + this.playersToInclude = [0,1,8,20,24,30,32,42,50,69,200,400,500,510,511]; // for testing + //this.playersToInclude = []; + this.tabLabels = ["ALL", "CLAN"]; + // these get populated by the modified game code + this.filteredLeaderboard = []; + this.tabBarOffset = 0; + this.windowWidth = 0; + this.verticalClickThreshold = 1000; + this.hoveringOverTabs = false; + this.scrollToTop = () => {}; + this.repaintLeaderboard = () => {}; + + this.selectedTab = 0; + this.tabHovering = -1; + //this.enabled = false; + this.enabled = true; + this.drawTabs = function(canvas, totalWidth, verticalOffset, colorForSelectedTab) { + canvas.textBaseline = "middle"; + canvas.textAlign = "center"; + const tabWidth = totalWidth / this.tabLabels.length; + const textOffsetY = verticalOffset + this.tabBarOffset / 2; + //console.log(verticalOffset, this.tabBarOffset, textOffsetY); + this.tabLabels.forEach((label, index) => { + if (index !== 0) canvas.fillRect(tabWidth * index, verticalOffset, 1, this.tabBarOffset); + if (this.selectedTab === index) { + canvas.fillStyle = colorForSelectedTab; + canvas.fillRect(tabWidth * index, verticalOffset, tabWidth, this.tabBarOffset); + canvas.fillStyle = "rgb(255,255,255)"; + } + if (this.tabHovering === index) { + canvas.fillStyle = "rgba(255,255,255,0.3)"; + canvas.fillRect(tabWidth * index, verticalOffset, tabWidth, this.tabBarOffset); + canvas.fillStyle = "rgb(255,255,255)"; + } + canvas.fillText(label, tabWidth * index + tabWidth / 2, textOffsetY); + }); + } + this.setHovering = (isHovering, xRelative) => { + let repaintNeeded = false; + if (isHovering) { + const tab = Math.floor(xRelative / (this.windowWidth / this.tabLabels.length)); + if (this.tabHovering !== tab) { + this.tabHovering = tab; + repaintNeeded = true; + } + } + if (isHovering !== this.hoveringOverTabs) { + this.hoveringOverTabs = isHovering; + if (isHovering === false) this.tabHovering = -1; + if (!isHovering) repaintNeeded = true; + } + if (repaintNeeded) this.repaintLeaderboard(); + return isHovering; + } + this.handleMouseDown = (xRelative) => { + //console.log("click; x: ", xRelative); + if (this.tabHovering !== this.selectedTab) { + this.selectedTab = this.tabHovering; + if (this.selectedTab === 0) this.clearFilter(); + else if (this.selectedTab === 1) this.filterByOwnClan(); + this.repaintLeaderboard(); + } + return true; + }; + this.filterByOwnClan = () => { + this.playersToInclude = []; + const ownClan = parseClanFromPlayerName(getVar("playerNames")[getVar("playerId")]); + getVar("playerNames").forEach((name, id) => { + if (parseClanFromPlayerName(name) === ownClan) this.playersToInclude.push(id); + }); + this.enabled = true; + this.scrollToTop(); + }; + this.clearFilter = () => { this.enabled = false; } + this.reset = () => { + this.enabled = false; + this.selectedTab = 0; + } +}); + +const hoveringTooltip = new (function() { + this.display = () => {}; // this gets populated by the modified game script + document.getElementById("canvasA").addEventListener("mousemove", e => { + if (!settings.hoveringTooltip || !getVar("gameState")) return; + try { + this.display(e.clientX, e.clientY); + } catch (e) { console.error(e) } + }); +}); + var donationsTracker = new (function(){ this.openedWindowPlayerID = null; this.contentElement = document.querySelector("#donationhistory_content"); diff --git a/game.js b/game.js index 738151b..d81595b 100644 --- a/game.js +++ b/game.js @@ -2005,17 +2005,24 @@ function bU() { }(g8, g9), this.o3(), 2 === g8 && (az.t8 = !0), 0 < g8)) }, this.t6 = function(g8, g9) { this.t8() || (uu = g8, uv = g9, dY = performance.now()) - }, this.click = function(g8, g9, tE) { + }, hoveringTooltip.display = function(mouseX, mouseY) { + var coordX = aj.fU(mouseX), + coordY = aj.fW(mouseY), + coord = aj.fY(coordX, coordY), + point = aj.fa(coord); + k.vQ(point); + } + this.click = function(g8, g9, tE) { var fT = aj.fU(g8), fV = aj.fW(g9), fX = aj.fY(fT, fV), fZ = aj.fa(fX); return !(!aj.fb(fT, fV) || (fT = (b7.cv.fv() ? .025 : .0144) * aK.fw, fV = performance.now(), Math.abs(g8 - uu) > fT) || Math.abs(g9 - uv) > fT || dY + 500 < fV) && (dY = fV, tE ? (function(g8, g9, fZ) { a2.eb(fZ) || -1 === (g8 = ak.ff.vR(g8, g9)) ? k.vQ(fZ) : k.vS(g8) - }(g8, g9, fZ), !1) : j.fM || this.t8() || !aY.fN.fP(eU) || fL ? (this.o3(), !1) : fc ? !!a2.eb(fZ) && (uw = fX, nU[3].t8 = !0, this.vI(g8, g9)) : (ak.ff.fg(fX) || ak.ff.fh(g8, g9) || (2 === rS ? a2.ej(fZ) && 0 < az.vJ && (player = - a2.ek(fZ), a2.vK(player)) && (nU[0].t8 = !0, nU[0].v2 = 1, nU[7].t8 = !0) : a2.fi(fZ) || (uw = fX, ak.ff.fk(eU, fX) && (nU[0].t8 = !0, nU[0].v2 = 1, nU[1].t8 = !0, nU[1].v2 = al.di[2] ? 0 : 2), a2.fj(fZ)) || (a2.el( - fZ) ? (player = ed, fn(eU) ? (nU[0].t8 = !0, nU[0].v2 = 0) : fp(eU, player) && (nU[0].t8 = !0, nU[0].v2 = 3)) : (player = a2.ek(fZ)) === eU ? 0 !== az.vJ && (nU[0].t8 = !0, nU[0].v2 = 1, nU[7].t8 = !0) : (nU[0].v2 = 1, - nU[5].t8 = function(player) { + }(g8, g9, fZ), false) : j.fM || this.t8() || !aY.fN.fP(eU) || fL ? (this.o3(), !1) : fc ? !!a2.eb(fZ) && (uw = fX, nU[3].t8 = !0, this.vI(g8, g9)) : (ak.ff.fg(fX) || ak.ff.fh(g8, g9) || (2 === rS ? a2.ej(fZ) && 0 < az.vJ && ( + player = a2.ek(fZ), a2.vK(player)) && (nU[0].t8 = !0, nU[0].v2 = 1, nU[7].t8 = !0) : a2.fi(fZ) || (uw = fX, ak.ff.fk(eU, fX) && (nU[0].t8 = !0, nU[0].v2 = 1, nU[1].t8 = !0, nU[1].v2 = al.di[2] ? 0 : 2), a2.fj(fZ)) || ( + a2.el(fZ) ? (player = ed, fn(eU) ? (nU[0].t8 = !0, nU[0].v2 = 0) : fp(eU, player) && (nU[0].t8 = !0, nU[0].v2 = 3)) : (player = a2.ek(fZ)) === eU ? 0 !== az.vJ && (nU[0].t8 = !0, nU[0].v2 = 1, nU[7].t8 = !0) : (nU[0] + .v2 = 1, nU[5].t8 = function(player) { return a2.vK(player) && !vD(player) && aS.vE(1, [player], !1) }(player), nU[7].t8 = 1 <= az.vJ && a2.vK(player), fr(player, eU) ? (nU[4].t8 = a2.vK(player) && !a6.vM(player) && aS.vE(0, [player], !1), nU[6].t8 = function(player) { if (0 === m9.length) return !1; @@ -3121,13 +3128,61 @@ function be() { a0V = 1; function a0Y() { - a0A.clearRect(0, 0, a04, y9), a0A.fillStyle = aZ.lE, a0A.fillRect(0, 0, a04, a0F), a0A.fillStyle = aZ.kZ, a0A.fillRect(0, a0F, a04, y9 - a0F), a03[eU] >= position && a0Z(a03[eU] - position, aZ.kw), 0 !== a03[eU] && 0 === position && a0Z(0, aZ - .lJ), -1 !== a0P && a0Z(a0P, aZ.kd), a0A.fillStyle = aZ.gF, a0A.fillRect(0, a0F, a04, 1), a0A.fillRect(0, 0, a04, b0.ur), a0A.fillRect(0, 0, b0.ur, y9), a0A.fillRect(a04 - b0.ur, 0, b0.ur, y9), a0A.fillRect(0, y9 - b0.ur, a04, b0.ur), - a0A.font = a05, aY.g0.textBaseline(a0A, 1), aY.g0.textAlign(a0A, 1), a0A.fillText(aV.nc[65], Math.floor((a04 + a0F - 22) / 2), Math.floor(a0D + a06 / 2)); + a0A.clearRect(0, 0, a04, y9), + a0A.fillStyle = aZ.lE, + a0A.fillRect(0, 0, a04, a0F), + a0A.fillStyle = aZ.kZ, + a0A.fillRect(0, a0F, a04, y9 - a0F); + if (leaderboardFilter.enabled) { + leaderboardFilter.filteredLeaderboard = leaderboardFilter.playersToInclude + .map(id => a03[id]).sort((a, b) => a - b); + } + var playerPos = (leaderboardFilter.enabled ? + leaderboardFilter.filteredLeaderboard.indexOf(a03[eU]) : + a03[eU] + ); + this.playerPos = playerPos; + if (leaderboardFilter.hoveringOverTabs) a0P = -1; + if (leaderboardFilter.enabled && a0P >= leaderboardFilter.filteredLeaderboard.length) a0P = -1; + playerPos >= position && a0Z(playerPos - position, aZ.kw), + 0 !== a03[eU] && 0 === position && a0Z(0, aZ.lJ), + -1 !== a0P && a0Z(a0P, aZ.kd), + a0A.fillStyle = aZ.kZ, + //console.log("drawing", a0P), + a0A.clearRect(0, y9 - leaderboardFilter.tabBarOffset, a04, leaderboardFilter.tabBarOffset); + a0A.fillRect(0, y9 - leaderboardFilter.tabBarOffset, a04, leaderboardFilter.tabBarOffset); + a0A.fillStyle = aZ.gF, + a0A.fillRect(0, a0F, a04, 1), + a0A.fillRect(0, y9 - leaderboardFilter.tabBarOffset, a04, 1), + leaderboardFilter.drawTabs(a0A, a04, y9 - leaderboardFilter.tabBarOffset, aZ.kw), + a0A.fillRect(0, 0, a04, b0.ur), + a0A.fillRect(0, 0, b0.ur, y9), + a0A.fillRect(a04 - b0.ur, 0, b0.ur, y9), + a0A.fillRect(0, y9 - b0.ur, a04, b0.ur), a0A.font = a05, aY.g0.textBaseline(a0A, 1), aY.g0.textAlign(a0A, 1), a0A.fillText(aV.nc[65], Math.floor((a04 + a0F - 22) / 2), Math.floor(a0D + a06 / 2)); playerList.drawButton(a0A, 12, 12, a0F - 22); - var hZ, eh = a03[eU] < position + a08 - 1 ? 1 : 2; - for (a0A.font = a07, aY.g0.textAlign(a0A, 0), hZ = a08 - eh; 0 <= hZ; hZ--) a0a(jG[hZ + position]), a0b(hZ, hZ + position, jG[hZ + position]); - for (aY.g0.textAlign(a0A, 2), hZ = a08 - eh; 0 <= hZ; hZ--) a0a(jG[hZ + position]), a0c(hZ, jG[hZ + position]); + var hZ, eh = playerPos < position + a08 - 1 ? 1 : 2; + + if (leaderboardFilter.enabled) { + let result = leaderboardFilter.filteredLeaderboard; + if (position !== 0 && position >= result.length - a08) + position = (result.length > a08 ? result.length : a08) - a08; + //if (position >= result.length) position = result.length - 1; + for (a0A.font = a07, aY.g0.textAlign(a0A, 0), hZ = a08 - eh; 0 <= hZ; hZ--) { + const pos = result[hZ + position]; + if (pos !== undefined) + a0a(jG[pos]), a0b(hZ, pos, jG[pos]); + } + for (aY.g0.textAlign(a0A, 2), hZ = a08 - eh; 0 <= hZ; hZ--) { + const pos = result[hZ + position]; + if (pos !== undefined) + a0a(jG[pos]), a0c(hZ, jG[pos]); + } + } else { + for (a0A.font = a07, aY.g0.textAlign(a0A, 0), hZ = a08 - eh; 0 <= hZ; hZ--) + a0a(jG[hZ + position]), a0b(hZ, hZ + position, jG[hZ + position]); + for (aY.g0.textAlign(a0A, 2), hZ = a08 - eh; 0 <= hZ; hZ--) + a0a(jG[hZ + position]), a0c(hZ, jG[hZ + position]); + } 2 == eh && (a0a(eU), aY.g0.textAlign(a0A, 0), a0b(a08 - 1, a03[eU], eU), aY.g0.textAlign(a0A, 2), a0c(a08 - 1, eU)), 0 === position && (eh = .7 * a0G / a1.get(4).height, a0A.setTransform(eh, 0, 0, eh, Math.floor(a0H + .58 * a0G + .5 * eh * a1 .get(4).width), Math.floor(a0D + a06 + .4 * a0G)), a0A.imageSmoothingEnabled = !0, a0A.drawImage(a1.get(4), -Math.floor(a1.get(4).width / 2), -Math.floor(a1.get(4).height / 2)), a0A.setTransform(1, 0, 0, 1, 0, 0)) } @@ -3160,69 +3215,82 @@ function be() { return fI >= b0.gap && fI < b0.gap + a04 && fJ >= b0.gap && fJ < b0.gap + y9 } this.cq = function() { - var eD; - for (a0R = !1, a0T = a0S = a0Q = 0, a0P = -1, a08 = b7.cv.fv() ? 6 : 10, a0V = (position = 0) === (a0V = b9.dG.data[11].value) ? 10 : 1 === a0V ? 5 : 1, a0O = !1, a0M = new Uint16Array(a08 + 1), a0N = new Uint32Array(a08 + 1), a0C = ed, - jG = new Uint16Array(a0C), a03 = new Uint16Array(a0C), eD = a0C - 1; 0 <= eD; eD--) jG[eD] = eD, a03[eD] = eD; - this.resize(!0), a0K = new Uint16Array(ed); - var a0W = Math.floor(a04 - a0I - a0H - a0B); - for (a0L = new Array(ed), a0A.font = a07, eD = ed - 1; 0 <= eD; eD--) a0L[eD] = eD + 1 + ".", jm[eD] = aY.qW.tm(a0X[eD], a07, a0W), a0K[eD] = Math.floor(a0A.measureText(jm[eD]).width); - a0Y() - }, this.resize = function(cq) { - if (y9 = b7.cv.fv() ? (a04 = Math.floor(.335 * aK.fw), Math.floor(a08 * a04 / 8)) : (a04 = Math.floor(.27 * aK.fw), Math.floor(a08 * a04 / 10)), a04 = Math.floor(.97 * a04), (a09 = document.createElement("canvas")).width = a04, a09 - .height = y9, a0A = a09.getContext("2d", { - alpha: !0 - }), a0D = .025 * a04, a06 = .16 * a04, a0E = 0 * a04, a0F = Math.floor(.45 * a0D + a06), a0G = (y9 - a06 - 2 * a0D - a0E) / a08, a05 = aY.g0.g1(1, Math.floor(.55 * a06)), a0U = Math.floor((b7.cv.fv() ? .67 : .72) * a0G), a07 = aY.g0 - .g1(0, a0U), a0A.font = a07, a0H = Math.floor(.04 * a04), a0I = Math.floor((b7.cv.fv() ? .195 : .18) * a04), a0B = Math.floor(a0A.measureText("00920600").width), a0A.font = a05, a0J = a04 - a0H, !cq) { - a0A.font = a07; - for (var eD = ed - 1; 0 <= eD; eD--) a0K[eD] = Math.floor(a0A.measureText(jm[eD]).width); + var eD; + for (a0R = !1, a0T = a0S = a0Q = 0, a0P = -1, a08 = b7.cv.fv() ? 6 : 10, a0V = (position = 0) === (a0V = b9.dG.data[11].value) ? 10 : 1 === a0V ? 5 : 1, a0O = !1, a0M = new Uint16Array(a08 + 1), a0N = new Uint32Array(a08 + 1), a0C = ed, + jG = new Uint16Array(a0C), a03 = new Uint16Array(a0C), eD = a0C - 1; 0 <= eD; eD--) jG[eD] = eD, a03[eD] = eD; + this.resize(!0), a0K = new Uint16Array(ed); + var a0W = Math.floor(a04 - a0I - a0H - a0B); + for (a0L = new Array(ed), a0A.font = a07, eD = ed - 1; 0 <= eD; eD--) a0L[eD] = eD + 1 + ".", jm[eD] = aY.qW.tm(a0X[eD], a07, a0W), a0K[eD] = Math.floor(a0A.measureText(jm[eD]).width); a0Y() + }, this.resize = function(cq) { + if (y9 = b7.cv.fv() ? (a04 = Math.floor(.335 * aK.fw), Math.floor(a08 * a04 / 8)) : (a04 = Math.floor(.27 * aK.fw), Math.floor(a08 * a04 / 10)), a04 = Math.floor(.97 * a04), (a09 = document.createElement("canvas")).width = a04, a09 + .height = y9, a0A = a09.getContext("2d", { + alpha: !0 + }), a0D = .025 * a04, a06 = .16 * a04, a0E = 0 * a04, a0F = Math.floor(.45 * a0D + a06), a0G = (y9 - a06 - 2 * a0D - a0E) / a08, + a09.height = y9 += a0G, leaderboardFilter.tabBarOffset = Math.floor(a0G * 1.3), leaderboardFilter.verticalClickThreshold = y9 - leaderboardFilter.tabBarOffset, leaderboardFilter.windowWidth = a04, + a05 = aY.g0.g1(1, Math.floor(.55 * a06)), a0U = Math.floor((b7.cv.fv() ? .67 : .72) * a0G), a07 = aY.g0.g1(0, a0U), a0A.font = a07, a0H = Math.floor(.04 * a04), a0I = Math.floor((b7.cv.fv() ? .195 : .18) * a04), a0B = Math.floor(a0A + .measureText("00920600").width), a0A.font = a05, a0J = a04 - a0H, !cq) { + a0A.font = a07; + for (var eD = ed - 1; 0 <= eD; eD--) a0K[eD] = Math.floor(a0A.measureText(jm[eD]).width); + a0Y() + } + }, this.zz = function() { + return a04 + }, this.j6 = function(wm) { + a0O && (wm || b3.iK() % a0V == 0) && (a0O = !1, a0Y()) + }, this.i6 = function() { + ! function() { + for (var hZ = a0C - 1; 0 <= hZ; hZ--) 0 === h2[jG[hZ]] && ! function(hZ) { + var a0o = jG[hZ]; + a0C--; + for (var eD = hZ; eD < a0C; eD++) jG[eD] = jG[eD + 1], a03[jG[eD]] = eD; + jG[a0C] = a0o, a03[jG[a0C]] = a0C + }(hZ) + }(); + for (var a0m, kM = a0C - 1, hZ = 0; hZ < kM; hZ++) ez[jG[hZ]] < ez[jG[hZ + 1]] && (a0m = jG[hZ], jG[hZ] = jG[hZ + 1], jG[hZ + 1] = a0m, a03[jG[hZ]] = hZ, a03[jG[hZ + 1]] = hZ + 1); + ! function() { + for (var dZ = a0O, eh = (a0O = !0, a03[eU] >= a08 - 1 ? a08 - 2 : a08 - 1), eD = eh; 0 <= eD; eD--) + if (a0M[eD] !== jG[eD] || a0N[eD] !== ez[jG[eD]]) return; + (eh != a08 - 2 || a0M[a08] === a03[eU] && a0N[a08] === ez[eU]) && (a0O = dZ) + }(); + for (var eD = a08 - 1; 0 <= eD; eD--) a0M[eD] = jG[eD], a0N[eD] = ez[jG[eD]]; + a0M[a08] = a03[eU], a0N[a08] = ez[eU] + }, leaderboardFilter.scrollToTop = function() { + position = 0; + }, this.fQ = function(fI, fJ) { + return !!vU(fI, fJ) && ((utils.isPointInRectangle(fI, fJ, b0.gap + 12, b0.gap + 12, a0F - 22, a0F - 22) && playerList.display(jm), true) && + !(fJ - b0.gap > leaderboardFilter.verticalClickThreshold && leaderboardFilter.handleMouseDown(fI - b0.gap)) && (a0Q = b3.dY, a0R = !0, a0S = a0T = a0q(fJ), ag.tQ() && (fI = yr(-1, a0T, a08), a0P !== (fI = fI === a08 ? -1 : fI)) && + (a0P = fI, a0Y(), b3.d1 = !0)), !0) + }, leaderboardFilter.repaintLeaderboard = function() { + a0Y(), b3.d1 = !0; + }, + this.sk = function(fI, fJ) { + if (utils.isPointInRectangle(fI, fJ, b0.gap + 12, b0.gap + 12, a0F - 22, a0F - 22)) { + playerList.hoveringOverButton === false && (playerList.hoveringOverButton = true, a0Y(), b3.d1 = !0); + } else { + playerList.hoveringOverButton === true && (playerList.hoveringOverButton = false, a0Y(), b3.d1 = !0); + } + if (leaderboardFilter.setHovering( + utils.isPointInRectangle(fI, fJ, b0.gap, b0.gap + leaderboardFilter.verticalClickThreshold, leaderboardFilter.windowWidth, leaderboardFilter.tabBarOffset), fI - b0.gap + )) return; + var dZ, a0p = a0q(fJ); + return a0R ? (dZ = position, (position = yr(0, position += a0S - a0p, ed - a08)) !== dZ && (a0p = (a0p = yr(-1, a0S = a0p, a08)) !== a08 && vU(fI, fJ) ? a0p : -1, a0P = a0p, a0Y(), b3.d1 = !0), !0) : (a0p = (a0p = yr(-1, a0p, a08)) === + a08 || !vU(fI, fJ) || ag.tQ() ? -1 : a0p, a0P !== a0p && (a0P = a0p, a0Y(), b3.d1 = !0)) + }, this.tA = function(fI, fJ) { + if (!a0R) return !1; + a0R = !1; + var a0p = a0q(fJ); + var isEmptySpace = false; + return ag.tQ() && -1 !== a0P && (a0P = -1, a0Y(), b3.d1 = !0), b3.dY - a0Q < 350 && a0T === a0p && -1 !== (a0p = (a0p = yr(-1, a0p, a08)) !== a08 && vU(fI, fJ) ? a0p : -1) && (fI = (leaderboardFilter.enabled ? jG[leaderboardFilter + .filteredLeaderboard[a0p + position] ?? (isEmptySpace = true, a03[eU])] : jG[a0p + position]), a0p === a08 - 1 && (leaderboardFilter.enabled ? this.playerPos : a03[eU]) >= + position + a08 - 1 && (fI = eU), !isEmptySpace && hM && donationsTracker.displayHistory(fI, jm, im), 0 !== h2[fI] && !isEmptySpace) && f.k7(fI, 800, !1, 0), !0 + }, this.sn = function(fI, fJ, deltaY) { + var a0r; + return !(a0R || k9 || (a0r = Math.max(Math.floor(Math.abs(deltaY) / 40), 1), !vU(fI, fJ)) || (fI = (fI = yr(-1, a0q(fJ), a08)) === a08 || ag.tQ() ? -1 : fI, 0 < deltaY ? position < ed - a08 && (position += Math.min(ed - a08 - position, + a0r), a0P = fI, a0Y(), b3.d1 = !0) : 0 < position && (position -= Math.min(position, a0r), a0P = fI, a0Y(), b3.d1 = !0), 0)) + }, this.gD = function() { + gE.drawImage(a09, b0.gap, b0.gap) } - }, this.zz = function() { - return a04 - }, this.j6 = function(wm) { - a0O && (wm || b3.iK() % a0V == 0) && (a0O = !1, a0Y()) - }, this.i6 = function() { - ! function() { - for (var hZ = a0C - 1; 0 <= hZ; hZ--) 0 === h2[jG[hZ]] && ! function(hZ) { - var a0o = jG[hZ]; - a0C--; - for (var eD = hZ; eD < a0C; eD++) jG[eD] = jG[eD + 1], a03[jG[eD]] = eD; - jG[a0C] = a0o, a03[jG[a0C]] = a0C - }(hZ) - }(); - for (var a0m, kM = a0C - 1, hZ = 0; hZ < kM; hZ++) ez[jG[hZ]] < ez[jG[hZ + 1]] && (a0m = jG[hZ], jG[hZ] = jG[hZ + 1], jG[hZ + 1] = a0m, a03[jG[hZ]] = hZ, a03[jG[hZ + 1]] = hZ + 1); - ! function() { - for (var dZ = a0O, eh = (a0O = !0, a03[eU] >= a08 - 1 ? a08 - 2 : a08 - 1), eD = eh; 0 <= eD; eD--) - if (a0M[eD] !== jG[eD] || a0N[eD] !== ez[jG[eD]]) return; - (eh != a08 - 2 || a0M[a08] === a03[eU] && a0N[a08] === ez[eU]) && (a0O = dZ) - }(); - for (var eD = a08 - 1; 0 <= eD; eD--) a0M[eD] = jG[eD], a0N[eD] = ez[jG[eD]]; - a0M[a08] = a03[eU], a0N[a08] = ez[eU] - }, this.fQ = function(fI, fJ) { - return !!vU(fI, fJ) && (utils.isPointInRectangle(fI, fJ, b0.gap + 12, b0.gap + 12, a0F - 22, a0F - 22) && playerList.display(jm), true) && (a0Q = b3.dY, a0R = !0, a0S = a0T = a0q(fJ), ag.tQ() && (fI = yr(-1, a0T, a08), a0P !== (fI = - fI === a08 ? -1 : fI)) && (a0P = fI, a0Y(), b3.d1 = !0), !0) - }, this.sk = function(fI, fJ) { - if (utils.isPointInRectangle(fI, fJ, b0.gap + 12, b0.gap + 12, a0F - 22, a0F - 22)) { - playerList.hoveringOverButton === false && (playerList.hoveringOverButton = true, a0Y(), b3.d1 = !0); - } else { - playerList.hoveringOverButton === true && (playerList.hoveringOverButton = false, a0Y(), b3.d1 = !0); - } - var dZ, a0p = a0q(fJ); - return a0R ? (dZ = position, (position = yr(0, position += a0S - a0p, ed - a08)) !== dZ && (a0p = (a0p = yr(-1, a0S = a0p, a08)) !== a08 && vU(fI, fJ) ? a0p : -1, a0P = a0p, a0Y(), b3.d1 = !0), !0) : (a0p = (a0p = yr(-1, a0p, a08)) === - a08 || !vU(fI, fJ) || ag.tQ() ? -1 : a0p, a0P !== a0p && (a0P = a0p, a0Y(), b3.d1 = !0)) - }, this.tA = function(fI, fJ) { - if (!a0R) return !1; - a0R = !1; - var a0p = a0q(fJ); - return ag.tQ() && -1 !== a0P && (a0P = -1, a0Y(), b3.d1 = !0), b3.dY - a0Q < 350 && a0T === a0p && -1 !== (a0p = (a0p = yr(-1, a0p, a08)) !== a08 && vU(fI, fJ) ? a0p : -1) && (fI = jG[a0p + position], a0p === a08 - 1 && a03[eU] >= - position + a08 - 1 && (fI = eU), hM && donationsTracker.displayHistory(fI, jm, im), 0 !== h2[fI]) && f.k7(fI, 800, !1, 0), !0 - }, this.sn = function(fI, fJ, deltaY) { - var a0r; - return !(a0R || k9 || (a0r = Math.max(Math.floor(Math.abs(deltaY) / 40), 1), !vU(fI, fJ)) || (fI = (fI = yr(-1, a0q(fJ), a08)) === a08 || ag.tQ() ? -1 : fI, 0 < deltaY ? position < ed - a08 && (position += Math.min(ed - a08 - position, - a0r), a0P = fI, a0Y(), b3.d1 = !0) : 0 < position && (position -= Math.min(position, a0r), a0P = fI, a0Y(), b3.d1 = !0), 0)) - }, this.gD = function() { - gE.drawImage(a09, b0.gap, b0.gap) - } } function bf() { @@ -5341,7 +5409,7 @@ function cD() { function ug(qf) { jm = new Array(ed), a0X = new Array(ed), h2 = new Uint8Array(ed), hu = new Uint16Array(ed), hx = new Uint16Array(ed), ht = new Uint16Array(ed), hw = new Uint16Array(ed), ez = new Uint32Array(ed), qC = new Uint32Array(ed), eV = new Uint32Array( - ed), donationsTracker.reset(), ea = new Array(ed), er = new Array(ed), es = new Array(ed), ev = new Array(ed), h3 = new Uint8Array(ed); + ed), donationsTracker.reset(), leaderboardFilter.reset(), ea = new Array(ed), er = new Array(ed), es = new Array(ed), ev = new Array(ed), h3 = new Uint8Array(ed); for (let eD = qf.length - 1; 0 <= eD; eD--) jm[eD] = a0X[eD] = qf[eD].name, h3[eD] = qf[eD].a53 } diff --git a/index.html b/index.html index 9804644..3bf6ba9 100644 --- a/index.html +++ b/index.html @@ -34,7 +34,7 @@ - +