Compare commits

...

3 Commits

Author SHA1 Message Date
peshomir e997f9547e deploy: ad6f0e2f05 2024-05-20 18:24:48 +00:00
peshomir f66059f80a deploy: 9e45327969 2024-05-20 15:39:13 +00:00
peshomir 9d6cc45695 deploy: 0e4ecbb36f 2024-05-20 14:09:46 +00:00
3 changed files with 277 additions and 87 deletions

View File

@ -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.1'; // 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,107 @@ 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
this.canvasPixelScale = 1;
document.getElementById("canvasA").addEventListener("mousemove", e => {
if (!settings.hoveringTooltip || !getVar("gameState")) return;
try {
this.display(this.canvasPixelScale * e.clientX, this.canvasPixelScale * e.clientY);
} catch (e) { console.error(e) }
});
});
var donationsTracker = new (function(){
this.openedWindowPlayerID = null;
this.contentElement = document.querySelector("#donationhistory_content");

112
game.js
View File

@ -2005,17 +2005,25 @@ 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);
if (coordX < 0 || coordY < 0) return;
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 +3129,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))
}
@ -3171,8 +3227,10 @@ function be() {
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) {
}), 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()
@ -3198,15 +3256,24 @@ function be() {
}();
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) && (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) {
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))
@ -3214,8 +3281,10 @@ function be() {
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
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,
@ -5341,7 +5410,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
}
@ -6925,8 +6994,9 @@ function c4() {
var g5, gA, aEr, qb = aEo(document.documentElement.clientWidth),
xM = aEo(window.visualViewport && 2 !== b7.id ? window.visualViewport.height : document.documentElement.clientHeight);
return g5 = qb, gA = xM, aEr = 0 !== b7.id || g5 < gA ? 700 : 1200, aEr = Math.min(aEr / ((g5 + gA) / 2), 1), aEr = 0 === b9.dG.data[1].value ? 2 * aEr / 3 : Math.min(aEr + (b9.dG.data[1].value - 1) * (1 - aEr) / 2, 1), aK.nH = (window
.devicePixelRatio || 1) * aEr, gf && !aEm ? (aEm = !0, document.body.removeChild(sj)) : aEm && (aEm = !1, document.body.appendChild(sj)), g5 = Math.floor(.5 + qb * aK.nH), gA = Math.floor(.5 + xM * aK.nH), !(g5 === aK.g5 && gA === aK
.gA || ag.tR() && y.tG) && (aK.g5 = g5, aK.gA = gA, aK.min = yR(g5, gA), aK.max = wC(g5, gA), aK.fw = eR(g5 + gA, 2), aK.o6 = g5 / gA, sj.width = g5, sj.height = gA, sj.style.width = qb + "px", sj.style.height = xM + "px", 1)
.devicePixelRatio || 1) * aEr, hoveringTooltip.canvasPixelScale = aK.nH, gf && !aEm ? (aEm = !0, document.body.removeChild(sj)) : aEm && (aEm = !1, document.body.appendChild(sj)), g5 = Math.floor(.5 + qb * aK.nH), gA = Math.floor(.5 +
xM * aK.nH), !(g5 === aK.g5 && gA === aK.gA || ag.tR() && y.tG) && (aK.g5 = g5, aK.gA = gA, aK.min = yR(g5, gA), aK.max = wC(g5, gA), aK.fw = eR(g5 + gA, 2), aK.o6 = g5 / gA, sj.width = g5, sj.height = gA, sj.style.width = qb + "px",
sj.style.height = xM + "px", 1)
}
this.g5 = 0, this.gA = 0, this.min = 0, this.max = 0, this.fw = 0, this.o6 = 1, this.nH = 1, this.cr = function() {
this.g5 = aEo(document.documentElement.clientWidth) + 2, this.gA = aEo(document.documentElement.clientHeight) + 2

View File

@ -34,7 +34,7 @@
<meta itemprop="image" content="https://fxclient.github.io/FXclient/assets/logo.png">
<!-- FX Client CSS -->
<link rel="stylesheet" href="main.css?1715596426779">
<link rel="stylesheet" href="main.css?1716229486329">
<!-- Game CSS -->
<style>
html,
@ -121,8 +121,8 @@
<p id="donationhistory_note">Note: donations from bots are not shown here</p>
<table><tbody id="donationhistory_content"></tbody></table>
</div>
<script src="variables.js?1715596426779"></script>
<script src="fx_core.js?1715596426779"></script>
<script src="game.js?1715596426779"></script>
<script src="variables.js?1716229486329"></script>
<script src="fx_core.js?1716229486329"></script>
<script src="game.js?1716229486329"></script>
</body>
</html>