Compare commits
10 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 0d369c4c1e | |||
| ede3ce1f0b | |||
| 5b075f057e | |||
| 8d8ccd8e9d | |||
| 9a3c9c1401 | |||
| 067b1ef385 | |||
| fe33b9a334 | |||
| 255ca528a5 | |||
| b843fa1b26 | |||
| aa07f2827b |
42
CHANGELOG.md
42
CHANGELOG.md
@@ -1,5 +1,47 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
|
## 1.11.3 (2026-11-21)
|
||||||
|
|
||||||
|
- ajout du calculateur de trajet vers un nouvel onglet
|
||||||
|
|
||||||
|
## 1.11.2 (2026-11-28)
|
||||||
|
|
||||||
|
- correction du bug sur les multiples attaques avec comte
|
||||||
|
- correction du bug sur le bouton pour sélectionner toutes les troupes
|
||||||
|
- correction du bug sur l'envoi de ressources vers un village cible
|
||||||
|
- ajout des ids dans la liste des joueurs d'une alliance
|
||||||
|
- ajout de l'id sur le profil d'un joueur
|
||||||
|
|
||||||
|
## 1.11.1 (2026-11-24)
|
||||||
|
|
||||||
|
- ajout de l'id des joueurs dans le classement général et la liste des membres de l'alliance
|
||||||
|
|
||||||
|
## 1.10.1 (2026-11-20)
|
||||||
|
|
||||||
|
- envoi des ressources par milliers sur le marché
|
||||||
|
|
||||||
|
## 1.9.2 (2025-11-18)
|
||||||
|
|
||||||
|
- simplification du code
|
||||||
|
|
||||||
|
## 1.9.1 (2025-11-18)
|
||||||
|
|
||||||
|
- ajout d'un bouton pour sélectionner toutes les troupes
|
||||||
|
|
||||||
|
## 1.8.1 (2025-11-17)
|
||||||
|
|
||||||
|
- remplacement de 'attaques' par 'occurrences'
|
||||||
|
- correction du calcul d'arrivée des unités
|
||||||
|
- ajout des dizièmes de seconde pour envoyer des unités
|
||||||
|
|
||||||
|
## 1.7.4 (2025-11-16)
|
||||||
|
|
||||||
|
- correction bug de calcul des secondes en utilisant search regex
|
||||||
|
|
||||||
|
## 1.7.3 (2025-11-16)
|
||||||
|
|
||||||
|
- correction bug de calcul des secondes en utilisant le temps du serveur
|
||||||
|
|
||||||
## 1.7.2 (2025-11-16)
|
## 1.7.2 (2025-11-16)
|
||||||
|
|
||||||
- correction bug de calcul des secondes sur la page des attaques
|
- correction bug de calcul des secondes sur la page des attaques
|
||||||
|
|||||||
1
images/blank.svg
Normal file
1
images/blank.svg
Normal file
@@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 640"><!--!Font Awesome Free v7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2025 Fonticons, Inc.--><path fill="#000000" d="M416.5 88L416.5 160L352.5 160C273 160 208.5 224.5 208.5 304C208.5 397.4 291.3 438.8 309.1 446.6C311.3 447.6 313.7 448 316.2 448L318.7 448C328.5 448 336.5 440 336.5 430.2C336.5 421.9 330.6 414.7 323.7 409.9C314.8 403.7 304.5 391.7 304.5 369.4C304.5 324.4 341 287.9 386 287.9L416.5 287.9L416.5 359.9C416.5 369.6 422.3 378.4 431.3 382.1C440.3 385.8 450.6 383.8 457.5 376.9L593.5 240.9C602.9 231.5 602.9 216.3 593.5 207L457.5 71C450.6 64.1 440.3 62.1 431.3 65.8C422.3 69.5 416.5 78.3 416.5 88zM144.5 160C100.3 160 64.5 195.8 64.5 240L64.5 496C64.5 540.2 100.3 576 144.5 576L400.5 576C444.7 576 480.5 540.2 480.5 496L480.5 464C480.5 446.3 466.2 432 448.5 432C430.8 432 416.5 446.3 416.5 464L416.5 496C416.5 504.8 409.3 512 400.5 512L144.5 512C135.7 512 128.5 504.8 128.5 496L128.5 240C128.5 231.2 135.7 224 144.5 224L160.5 224C178.2 224 192.5 209.7 192.5 192C192.5 174.3 178.2 160 160.5 160L144.5 160z"/></svg>
|
||||||
|
After Width: | Height: | Size: 1.1 KiB |
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"manifest_version": 3,
|
"manifest_version": 3,
|
||||||
"name": "KAplus",
|
"name": "KAplus",
|
||||||
"version": "1.7.2",
|
"version": "1.11.3",
|
||||||
|
|
||||||
"developer": {
|
"developer": {
|
||||||
"name": "Samuel Campos",
|
"name": "Samuel Campos",
|
||||||
|
|||||||
@@ -5,8 +5,8 @@
|
|||||||
"firefox"
|
"firefox"
|
||||||
],
|
],
|
||||||
"release_notes": {
|
"release_notes": {
|
||||||
"fr": "- correction bug de calcul des secondes sur la page des attaques",
|
"fr": "- ajout du calculateur de trajet vers un nouvel onglet",
|
||||||
"en-US": "- fix bug on seconds in attack page"
|
"en-US": "- add travel calculator in new tab"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
527
src/kaplus.js
527
src/kaplus.js
@@ -1,3 +1,8 @@
|
|||||||
|
let tomorrow = new Date(new Date().getTime() + 24*60*60*1000);
|
||||||
|
tomorrow.setHours(0, 0, 0, 0);
|
||||||
|
let afterTomorrow = new Date(tomorrow.getTime() + 24*60*60*1000);
|
||||||
|
let movingDuration = 0;
|
||||||
|
|
||||||
function num(s) {
|
function num(s) {
|
||||||
return parseInt(s.replace(".", ""));
|
return parseInt(s.replace(".", ""));
|
||||||
}
|
}
|
||||||
@@ -18,25 +23,54 @@ function str(n) {
|
|||||||
return s.replace(/^0+/, "");
|
return s.replace(/^0+/, "");
|
||||||
}
|
}
|
||||||
|
|
||||||
function createRow(key, value) {
|
function createCustomElement(tag, attrs, text, style) {
|
||||||
let keyCell = document.createElement("td");
|
let elt = document.createElement(tag);
|
||||||
keyCell.textContent = key;
|
if (attrs) {
|
||||||
|
for (let [key, value] of Object.entries(attrs)) {
|
||||||
|
if (value !== null) {
|
||||||
|
elt.setAttribute(key, value.toString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (text) {
|
||||||
|
elt.textContent = text.toString();
|
||||||
|
}
|
||||||
|
if (style) {
|
||||||
|
for (let [key, value] of Object.entries(style)) {
|
||||||
|
elt.style[key] = value.toString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return elt;
|
||||||
|
}
|
||||||
|
|
||||||
let valueCell = document.createElement("td");
|
function createCustomInput(type, name, value, attrs, style) {
|
||||||
valueCell.textContent = value;
|
let mergedAttrs = {};
|
||||||
|
if (attrs) {
|
||||||
|
mergedAttrs = attrs;
|
||||||
|
}
|
||||||
|
mergedAttrs["type"] = type;
|
||||||
|
if (name) {
|
||||||
|
mergedAttrs["name"] = name;
|
||||||
|
}
|
||||||
|
if (value) {
|
||||||
|
mergedAttrs["value"] = value;
|
||||||
|
}
|
||||||
|
return createCustomElement("input", mergedAttrs, null, style);
|
||||||
|
}
|
||||||
|
|
||||||
let row = document.createElement("tr");
|
function createKeyValueRow(key, value) {
|
||||||
|
let row = createCustomElement("tr");
|
||||||
|
let keyCell = createCustomElement("td", null, key);
|
||||||
|
let valueCell = createCustomElement("td", null, value);
|
||||||
row.appendChild(keyCell);
|
row.appendChild(keyCell);
|
||||||
row.appendChild(valueCell);
|
row.appendChild(valueCell);
|
||||||
return row;
|
return row;
|
||||||
}
|
}
|
||||||
|
|
||||||
function createInput(type, name, value) {
|
function searchPoint(text) {
|
||||||
let elt = document.createElement("input");
|
let index = text.search(/\d{3}\|\d{3}/);
|
||||||
elt.setAttribute("type", type);
|
let point = text.slice(index, index + 7).split("|");
|
||||||
elt.setAttribute("name", name);
|
return {x: point[0], y: point[1]}
|
||||||
elt.setAttribute("value", value);
|
|
||||||
return elt;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function shortcutElementReplace(elt, img, text) {
|
function shortcutElementReplace(elt, img, text) {
|
||||||
@@ -55,36 +89,22 @@ function shortcutElementReplace(elt, img, text) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let spanImageElement = document.createElement("span");
|
let spanImageElement = createCustomElement("span", {"class": "shortcut_element_image"});
|
||||||
spanImageElement.classList.add("shortcut_element_image");
|
let imgElement = createCustomElement("img", {"src": chrome.runtime.getURL("images/" + img + ".svg")});
|
||||||
|
|
||||||
let imgElement = document.createElement("img");
|
|
||||||
imgElement.setAttribute("src", chrome.runtime.getURL("images/" + img + ".svg"));
|
|
||||||
spanImageElement.appendChild(imgElement);
|
spanImageElement.appendChild(imgElement);
|
||||||
|
|
||||||
aElements[0].textContent = "";
|
aElements[0].textContent = "";
|
||||||
aElements[0].appendChild(spanImageElement);
|
aElements[0].appendChild(spanImageElement);
|
||||||
|
|
||||||
if (text) {
|
if (text) {
|
||||||
let spanDescElement = document.createElement("span");
|
let spanDescElement = createCustomElement("span", {"class": "shortcut_element_desc"}, text);
|
||||||
spanDescElement.classList.add("shortcut_element_desc");
|
|
||||||
spanDescElement.textContent = text;
|
|
||||||
aElements[0].appendChild(spanDescElement);
|
aElements[0].appendChild(spanDescElement);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function main() {
|
function customizeNavbar(layCastleElement) {
|
||||||
/* Exit immediately if not on game page */
|
|
||||||
let layCastleTopElements = document.getElementsByClassName("lay_castle_top");
|
|
||||||
if (layCastleTopElements.length === 0) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Remove iframe banner */
|
|
||||||
document.getElementById("banner_skyscraper").remove();
|
|
||||||
|
|
||||||
/* Improve navbar icons */
|
/* Improve navbar icons */
|
||||||
let shortcutElements = layCastleTopElements[0].getElementsByClassName("shortcut_element");
|
let shortcutElements = layCastleElement.getElementsByClassName("shortcut_element");
|
||||||
shortcutElementReplace(shortcutElements[0], "ranking", shortcutElements[0].textContent.replace(/[^0-9]/g, ""));
|
shortcutElementReplace(shortcutElements[0], "ranking", shortcutElements[0].textContent.replace(/[^0-9]/g, ""));
|
||||||
shortcutElementReplace(shortcutElements[1], "ally", "");
|
shortcutElementReplace(shortcutElements[1], "ally", "");
|
||||||
shortcutElementReplace(shortcutElements[2], "profile", "");
|
shortcutElementReplace(shortcutElements[2], "profile", "");
|
||||||
@@ -94,22 +114,72 @@ function main() {
|
|||||||
shortcutElementReplace(shortcutElements[6], "favorites", "");
|
shortcutElementReplace(shortcutElements[6], "favorites", "");
|
||||||
|
|
||||||
/* Center navbar */
|
/* Center navbar */
|
||||||
let shortcutContainers = layCastleTopElements[0].getElementsByClassName("shortcut_container");
|
let shortcutContainers = layCastleElement.getElementsByClassName("shortcut_container");
|
||||||
shortcutContainers[0].classList.add("shortcut_container_left");
|
shortcutContainers[0].classList.add("shortcut_container_left");
|
||||||
shortcutContainers[2].classList.add("shortcut_container_right");
|
shortcutContainers[2].classList.add("shortcut_container_right");
|
||||||
|
}
|
||||||
|
|
||||||
/* Parse url params and switch case */
|
function countUpMs() {
|
||||||
let urlParams = new URLSearchParams(window.location.search);
|
let arrivalDate = new Date(new Date().getTime() + movingDuration * 1000);
|
||||||
let section = urlParams.get("s");
|
let prefix = "";
|
||||||
let module = urlParams.get("m");
|
if (arrivalDate >= afterTomorrow) {
|
||||||
let sub = urlParams.get("sub");
|
prefix = "le " + arrivalDate.getDate() + "." + arrivalDate.getMonth() + " ";
|
||||||
|
} else if (arrivalDate > tomorrow) {
|
||||||
|
prefix = "demain ";
|
||||||
|
}
|
||||||
|
document.getElementById("countup-time-ms").textContent = prefix
|
||||||
|
+ "à "
|
||||||
|
+ arrivalDate.getHours().toString().padStart(2, "0")
|
||||||
|
+ ":"
|
||||||
|
+ arrivalDate.getMinutes().toString().padStart(2, "0")
|
||||||
|
+ ":"
|
||||||
|
+ arrivalDate.getSeconds().toString().padStart(2, "0")
|
||||||
|
+ ":"
|
||||||
|
+ Math.floor(arrivalDate.getMilliseconds() / 100);
|
||||||
|
}
|
||||||
|
|
||||||
/* Display unit-points on user profile */
|
function removeAdsBanner() {
|
||||||
if (section === "info_player" && (module === "profile" || module === null)) {
|
/* Remove iframe banner */
|
||||||
|
document.getElementById("banner_skyscraper").remove();
|
||||||
|
}
|
||||||
|
|
||||||
|
function showPlayersId() {
|
||||||
|
/* Add a column with player id */
|
||||||
|
let mainContentPane = document.getElementsByClassName("contentpane")[1];
|
||||||
|
let borderListTable = mainContentPane.getElementsByClassName("borderlist")[0];
|
||||||
|
let playerRows = borderListTable.getElementsByTagName("tr");
|
||||||
|
|
||||||
|
let headerCells = playerRows[0].getElementsByTagName("th");
|
||||||
|
let nameCellIndex = -1;
|
||||||
|
for (let i = 0; i < headerCells.length; i ++) {
|
||||||
|
if (headerCells[i].textContent === "Nom") {
|
||||||
|
nameCellIndex = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (nameCellIndex === -1) {
|
||||||
|
/* Name column not found, so return */
|
||||||
|
console.log("Column 'Nom' not found, cannot show player ids :(");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
let idHeaderCell = createCustomElement("th", {"class": headerCells[0].getAttribute("class")}, "Id");
|
||||||
|
for (let i = 1; i < playerRows.length; i ++) {
|
||||||
|
let playerCells = playerRows[i].getElementsByTagName("td");
|
||||||
|
let playerProfileLink = playerCells[nameCellIndex].getElementsByTagName("a")[0].getAttribute("href");
|
||||||
|
let idValue = playerProfileLink.replace(/^.*id=(\d+)$/, "$1");
|
||||||
|
let idCell = createCustomElement("td", {"class": playerCells[0].getAttribute("class")}, idValue);
|
||||||
|
playerRows[i].insertBefore(idCell, playerCells[nameCellIndex]);
|
||||||
|
}
|
||||||
|
playerRows[0].insertBefore(idHeaderCell, headerCells[nameCellIndex]);
|
||||||
|
}
|
||||||
|
|
||||||
|
function showPlayerUnitPointsAndId() {
|
||||||
let mainContentPane = document.getElementsByClassName("contentpane")[1];
|
let mainContentPane = document.getElementsByClassName("contentpane")[1];
|
||||||
let borderLists = mainContentPane.getElementsByClassName("borderlist");
|
let borderLists = mainContentPane.getElementsByClassName("borderlist");
|
||||||
|
|
||||||
let playerPropertiesTable = borderLists[0];
|
let playerPropertiesTable = borderLists[0];
|
||||||
|
let playerPropertiesTbody = playerPropertiesTable.getElementsByTagName("tbody")[0];
|
||||||
let playerPropertiesRows = playerPropertiesTable.getElementsByTagName("tr");
|
let playerPropertiesRows = playerPropertiesTable.getElementsByTagName("tr");
|
||||||
let totalPoints = num(playerPropertiesRows[2].getElementsByTagName("td")[1].textContent);
|
let totalPoints = num(playerPropertiesRows[2].getElementsByTagName("td")[1].textContent);
|
||||||
let villagesCount = num(playerPropertiesRows[4].getElementsByTagName("td")[1].textContent);
|
let villagesCount = num(playerPropertiesRows[4].getElementsByTagName("td")[1].textContent);
|
||||||
@@ -128,13 +198,22 @@ function main() {
|
|||||||
armyPercent = (Math.round(armyPoints / villagesCount) / 100).toString() + " %";
|
armyPercent = (Math.round(armyPoints / villagesCount) / 100).toString() + " %";
|
||||||
}
|
}
|
||||||
|
|
||||||
playerPropertiesTable.appendChild(createRow("Points troupes:", str(armyPoints)));
|
let moduleMenu = mainContentPane.getElementsByTagName("table")[0];
|
||||||
playerPropertiesTable.appendChild(createRow("% points troupes:", armyPercent));
|
let moduleHyperlink = moduleMenu.getElementsByTagName("a")[0];
|
||||||
|
let playerId = moduleHyperlink.getAttribute("href").replace(/^.*[?&]id=(\d+).*$/, "$1");
|
||||||
|
|
||||||
|
playerPropertiesTbody.appendChild(createKeyValueRow("Points troupes:", str(armyPoints)));
|
||||||
|
playerPropertiesTbody.appendChild(createKeyValueRow("% points troupes:", armyPercent));
|
||||||
|
playerPropertiesTbody.insertBefore(createKeyValueRow("Id:", playerId), playerPropertiesRows[2]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Display unit-points on village overview */
|
function showVillageUnitPoints() {
|
||||||
if (section === "overview") {
|
let settlementElt = document.getElementById("settlement");
|
||||||
let settlements = document.getElementById("settlement").textContent.split("|");
|
if (settlementElt === null) {
|
||||||
|
console.log("Settlement element not found => cannot show village points :(");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
let settlements = settlementElt.textContent.split("|");
|
||||||
let noBorderRows = document.getElementsByClassName("noborder");
|
let noBorderRows = document.getElementsByClassName("noborder");
|
||||||
let villagePointsRow = noBorderRows[0];
|
let villagePointsRow = noBorderRows[0];
|
||||||
for (let i = 0; i < noBorderRows.length; i++) {
|
for (let i = 0; i < noBorderRows.length; i++) {
|
||||||
@@ -149,51 +228,168 @@ function main() {
|
|||||||
villagePointsRow.after(unitPointsRow);
|
villagePointsRow.after(unitPointsRow);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Allow multiple attacks */
|
function showBarrackSelectAllUnits() {
|
||||||
if (section === "build_barracks" && module === "command" && sub === "send") {
|
let sendCommandForm = document.getElementById("sendCommandForm");
|
||||||
let table = document.createElement("table");
|
let barracksCommands = sendCommandForm.getElementsByClassName("barracksCommand");
|
||||||
table.classList.add("borderlist");
|
let borderListTables = sendCommandForm.getElementsByClassName("borderlist");
|
||||||
let tbody = document.createElement("tbody");
|
|
||||||
let tr = document.createElement("tr");
|
let unitCountBoxes = [];
|
||||||
let th = document.createElement("th");
|
if (barracksCommands.length === 1) {
|
||||||
th.textContent = "Nombre d'attaques:";
|
unitCountBoxes = barracksCommands[0].getElementsByClassName("box");
|
||||||
|
} else if (borderListTables.length === 1) {
|
||||||
|
unitCountBoxes = borderListTables[0].getElementsByTagName("td");
|
||||||
|
}
|
||||||
|
for (let i = 0; i < unitCountBoxes.length; i ++) {
|
||||||
|
let unitCountInputs = unitCountBoxes[i].getElementsByTagName("input");
|
||||||
|
if (unitCountInputs.length === 0) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
let unitCountInput = unitCountInputs[0];
|
||||||
|
if (unitCountInput.getAttribute("type") === null) {
|
||||||
|
unitCountInput.setAttribute("type", "number");
|
||||||
|
unitCountInput.style.width = "65px";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let sendXInput = document.getElementById("send_x");
|
||||||
|
sendXInput.setAttribute("type", "number");
|
||||||
|
if (sendXInput.value === "0") {
|
||||||
|
sendXInput.value = "";
|
||||||
|
}
|
||||||
|
|
||||||
|
let sendYInput = document.getElementById("send_y");
|
||||||
|
sendYInput.setAttribute("type", "number");
|
||||||
|
if (sendYInput.value === "0") {
|
||||||
|
sendYInput.value = "";
|
||||||
|
}
|
||||||
|
|
||||||
|
let selectAllLabel = createCustomElement("label");
|
||||||
|
let selectAllInput = createCustomElement("input", {"type": "checkbox"});
|
||||||
|
selectAllInput.addEventListener("change", function () {
|
||||||
|
for (let i = 0; i < unitCountBoxes.length; i ++) {
|
||||||
|
let unitCountBox = unitCountBoxes[i];
|
||||||
|
let unitCountClicks = unitCountBox.getElementsByClassName("click");
|
||||||
|
if (unitCountClicks.length === 0) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
let unitCountClick = unitCountClicks[0];
|
||||||
|
if (unitCountClick.classList.contains("all")) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
let unitCountInput = unitCountBox.getElementsByTagName("input")[0];
|
||||||
|
if (this.checked && unitCountClick.textContent !== "(0)") {
|
||||||
|
unitCountInput.value = unitCountClick.textContent.replace(/^\(([^.]*)(\.([^.]*))?\)$/, "$1$3");
|
||||||
|
} else {
|
||||||
|
unitCountInput.value = "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
selectAllLabel.appendChild(selectAllInput);
|
||||||
|
let selectAllSpan = createCustomElement("span", {"class": "click all"}, "(Tout sélectionner)");
|
||||||
|
selectAllLabel.appendChild(selectAllSpan);
|
||||||
|
|
||||||
|
/* Modern style */
|
||||||
|
if (barracksCommands.length === 1) {
|
||||||
|
let boxCell = createCustomElement("div", {"class": "box"});
|
||||||
|
|
||||||
|
let backgroundCell = createCustomElement("div", {"class": "background"});
|
||||||
|
let backgroundImg = createCustomElement(
|
||||||
|
"img", {"src": "//s58-fr.kingsage.gameforge.com/img/modern/card_sendunit.png"}
|
||||||
|
);
|
||||||
|
backgroundCell.appendChild(backgroundImg);
|
||||||
|
boxCell.appendChild(backgroundCell);
|
||||||
|
|
||||||
|
let imageCell = createCustomElement("div", {"class": "image"});
|
||||||
|
let imageImg = createCustomElement(
|
||||||
|
"img", {"src": "//s58-fr.kingsage.gameforge.com/img/shortcut/barracks.png"}, null, {"width": "28px"}
|
||||||
|
);
|
||||||
|
imageCell.appendChild(imageImg);
|
||||||
|
boxCell.appendChild(imageCell);
|
||||||
|
|
||||||
|
let nameCell = createCustomElement("div", {"class": "name"});
|
||||||
|
let nameA = createCustomElement("a", {"href": "help.php?m=units", "target": "_help"});
|
||||||
|
let nameB = createCustomElement("b", null, "Tout");
|
||||||
|
nameA.appendChild(nameB);
|
||||||
|
nameCell.appendChild(nameA);
|
||||||
|
boxCell.appendChild(nameCell);
|
||||||
|
|
||||||
|
let selectAllCell = createCustomElement("div", {"class": "quantity"});
|
||||||
|
selectAllCell.appendChild(selectAllLabel);
|
||||||
|
boxCell.appendChild(selectAllCell);
|
||||||
|
|
||||||
|
let brTag = barracksCommands[0].getElementsByTagName("br")[1];
|
||||||
|
barracksCommands[0].insertBefore(boxCell, brTag);
|
||||||
|
|
||||||
|
/* Classic style */
|
||||||
|
} else if (borderListTables.length === 1) {
|
||||||
|
let borderListRows = borderListTables[0].getElementsByTagName("tr");
|
||||||
|
let selectAllCell = borderListRows[4].getElementsByTagName("td")[3];
|
||||||
|
|
||||||
|
let imageA = createCustomElement("a", {"href": "help.php?m=units", "target": "_help"});
|
||||||
|
let imageImg = createCustomElement(
|
||||||
|
"img", {"src": "//s58-fr.kingsage.gameforge.com/img/shortcut/barracks.png", "title": "Tout"}
|
||||||
|
);
|
||||||
|
imageA.appendChild(imageImg);
|
||||||
|
selectAllCell.appendChild(imageA);
|
||||||
|
|
||||||
|
selectAllCell.appendChild(selectAllLabel);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function showCountupTimeDecimals() {
|
||||||
|
let oldCell = document.getElementById("countup-time");
|
||||||
|
let hms = oldCell.parentElement.previousElementSibling.getElementsByTagName("td")[1].textContent.split(":");
|
||||||
|
movingDuration = parseInt(hms[0]) * 3600 + parseInt(hms[1]) * 60 + parseInt(hms[2]) ;
|
||||||
|
let newRow = createCustomElement("tr");
|
||||||
|
let newLeftCell = createCustomElement("td", null, "Arrivée:");
|
||||||
|
newRow.appendChild(newLeftCell);
|
||||||
|
let newRightCell = createCustomElement("td", {"id": "countup-time-ms"});
|
||||||
|
newRow.appendChild(newRightCell);
|
||||||
|
oldCell.parentElement.parentElement.insertBefore(newRow, oldCell.parentElement);
|
||||||
|
oldCell.parentElement.style.display = "none";
|
||||||
|
setInterval(countUpMs, 100);
|
||||||
|
}
|
||||||
|
|
||||||
|
function showOccurrencesInput() {
|
||||||
|
let table = createCustomElement("table", {"class": "borderlist"});
|
||||||
|
let tbody = createCustomElement("tbody");
|
||||||
|
let tr = createCustomElement("tr");
|
||||||
|
let th = createCustomElement("th", null, "Nombre d'occurrences:");
|
||||||
tr.appendChild(th)
|
tr.appendChild(th)
|
||||||
let td = document.createElement("td");
|
let td = createCustomElement("td");
|
||||||
let input = document.createElement("input");
|
let input = createCustomElement("input", {"type": "number", "name": "occurrences", "value": "1"});
|
||||||
input.setAttribute("type", "number");
|
|
||||||
input.setAttribute("name", "attack_count");
|
|
||||||
input.setAttribute("value", "1");
|
|
||||||
td.appendChild(input);
|
td.appendChild(input);
|
||||||
tr.appendChild(td);
|
tr.appendChild(td);
|
||||||
tbody.appendChild(tr);
|
tbody.appendChild(tr);
|
||||||
table.appendChild(tbody);
|
table.appendChild(tbody);
|
||||||
|
|
||||||
let form = document.getElementsByTagName("form")[0];
|
let form = document.getElementsByTagName("form")[0];
|
||||||
let firstInput = form.getElementsByTagName("input")[0];
|
let firstInput = form.getElementsByTagName("input")[0];
|
||||||
form.insertBefore(table, firstInput);
|
form.insertBefore(table, firstInput);
|
||||||
form.addEventListener("submit", function (event) {
|
form.addEventListener("submit", function (event) {
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
let formData = new FormData(this);
|
let formData = new FormData(this);
|
||||||
let attackCount = parseInt(formData.get("attack_count").toString());
|
let attackCount = parseInt(formData.get("occurrences").toString());
|
||||||
formData.delete("attack_count");
|
formData.delete("occurrences");
|
||||||
|
|
||||||
let sent = 0;
|
let sent = 0;
|
||||||
for (let i = 0; i < attackCount; i ++) {
|
for (let i = 0; i < attackCount; i ++) {
|
||||||
let xhr = new XMLHttpRequest();
|
let xhr = new XMLHttpRequest();
|
||||||
xhr.onload = function () {
|
xhr.addEventListener("readystatechange", function () {
|
||||||
|
if (this.readyState === this.DONE) {
|
||||||
sent ++;
|
sent ++;
|
||||||
|
}
|
||||||
if (sent === attackCount) {
|
if (sent === attackCount) {
|
||||||
window.location.replace(xhr.responseURL);
|
window.location.replace(xhr.responseURL);
|
||||||
}
|
}
|
||||||
}
|
})
|
||||||
xhr.open(this.method, this.action, true);
|
xhr.open(this.method, this.action, true);
|
||||||
xhr.send(formData);
|
xhr.send(formData);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Fix select bug in market */
|
function fixSelectVillageBug() {
|
||||||
if (section === "build_market" && (module === "send" || module === null)) {
|
|
||||||
let select = document.getElementsByName("village_name")[0];
|
let select = document.getElementsByName("village_name")[0];
|
||||||
select.removeAttribute("onchange");
|
select.removeAttribute("onchange");
|
||||||
select.addEventListener("change", function () {
|
select.addEventListener("change", function () {
|
||||||
@@ -210,13 +406,64 @@ function main() {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Improve attacks display */
|
function showThousandInputs() {
|
||||||
if (section === "ally" && module === "attacks") {
|
let sendForm = document.getElementsByTagName("form")[0]
|
||||||
|
sendForm.addEventListener("submit", function () {
|
||||||
|
let inputs = this.getElementsByTagName("input");
|
||||||
|
for (let i = 0; i < inputs.length; i ++) {
|
||||||
|
if (inputs[i].getAttribute("name").endsWith("_k")) {
|
||||||
|
inputs[i].setAttribute("name", "");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
let sendFormTables = sendForm.getElementsByTagName("table");
|
||||||
|
let newTable = sendFormTables[0].cloneNode(true);
|
||||||
|
newTable.getElementsByTagName("th")[0].textContent = "Ressources par milliers";
|
||||||
|
let resCells = newTable.getElementsByTagName("td");
|
||||||
|
for (let i = 0; i < resCells.length; i ++) {
|
||||||
|
let resInput = resCells[i].getElementsByTagName("input")[0];
|
||||||
|
let resName = resInput.getAttribute("name");
|
||||||
|
let resNameK = resInput.getAttribute("name") + "_k";
|
||||||
|
resInput.setAttribute("name", resNameK);
|
||||||
|
resInput.addEventListener("change", function () {
|
||||||
|
document.getElementsByName(resName)[0].value = 1000 * parseInt(this.value);
|
||||||
|
});
|
||||||
|
let spanInput = resCells[i].getElementsByTagName("span")[0];
|
||||||
|
let resMax = spanInput.textContent.replace(/\(/, "").replace("\)", "").replace(/\./, "");
|
||||||
|
let rMax = Math.floor(parseInt(resMax) / 1000);
|
||||||
|
spanInput.setAttribute(
|
||||||
|
"onclick",
|
||||||
|
"insertNum('kingsage', '" + resNameK + "', '" + rMax.toString() + "'); " +
|
||||||
|
"insertNum('kingsage', '" + resName + "', '" + (1000 * rMax).toString() + "');"
|
||||||
|
)
|
||||||
|
spanInput.textContent = "(" + rMax.toString() + "K)";
|
||||||
|
}
|
||||||
|
sendForm.insertBefore(newTable, sendFormTables[0]);
|
||||||
|
sendForm.insertBefore(createCustomElement("br"), sendFormTables[1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
function fixSendResourcesInputsTypes() {
|
||||||
|
let contentPane = document.getElementsByClassName("contentpane")[1]
|
||||||
|
let sendCommandForm = contentPane.getElementsByTagName("form")[0];
|
||||||
|
let sendInputs = sendCommandForm.getElementsByTagName("input");
|
||||||
|
for (let i = 0; i < sendInputs.length; i ++) {
|
||||||
|
if (sendInputs[i].name.startsWith("send_")) {
|
||||||
|
sendInputs[i].setAttribute("type", "number");
|
||||||
|
if (sendInputs[i].value === "0") {
|
||||||
|
sendInputs[i].value = "";
|
||||||
|
}
|
||||||
|
sendInputs[i].style.width = "65px";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function showSecondsAndCalculator() {
|
||||||
|
let serverTime = parseInt(document.getElementById("servertime").getAttribute("time"));
|
||||||
let contentPane = document.getElementsByClassName("contentpane")[1]
|
let contentPane = document.getElementsByClassName("contentpane")[1]
|
||||||
let table = contentPane.getElementsByClassName("borderlist")[0];
|
let table = contentPane.getElementsByClassName("borderlist")[0];
|
||||||
let rows = table.getElementsByTagName("tr");
|
let rows = table.getElementsByTagName("tr");
|
||||||
|
|
||||||
let headCell = document.createElement("th");
|
let headCell = createCustomElement("th", null, "Calcul");
|
||||||
rows[0].appendChild(headCell);
|
rows[0].appendChild(headCell);
|
||||||
|
|
||||||
for (let i = 1; i < rows.length; i ++) {
|
for (let i = 1; i < rows.length; i ++) {
|
||||||
@@ -225,31 +472,141 @@ function main() {
|
|||||||
let arrivalTimeCell = cells[4];
|
let arrivalTimeCell = cells[4];
|
||||||
|
|
||||||
let seconds = parseInt(arrivalTimeCell.getElementsByTagName("span")[0].getAttribute("time"));
|
let seconds = parseInt(arrivalTimeCell.getElementsByTagName("span")[0].getAttribute("time"));
|
||||||
let arrival = new Date(Date.now() + seconds * 1000);
|
let arrival = new Date((serverTime + seconds) * 1000);
|
||||||
let hour = arrival.toLocaleTimeString("fr-FR");
|
let hour = arrival.toLocaleTimeString("fr-FR");
|
||||||
arrivalDateCell.textContent = arrivalDateCell.textContent.replace(/(.*)\d\d:\d\d(.*)/, "$1" + hour + "$2");
|
arrivalDateCell.textContent = arrivalDateCell.textContent.replace(/(.*)\d\d:\d\d(.*)/, "$1" + hour + "$2");
|
||||||
|
|
||||||
let startPoint = cells[2].textContent.replace(/.*(\d{3}\|\d{3}).*/, "$1").split("|");
|
let startPoint = searchPoint(cells[2].textContent);
|
||||||
let targetPoint = cells[1].textContent.replace(/.*(\d{3}\|\d{3}).*/, "$1").split("|");
|
let targetPoint = searchPoint(cells[1].textContent);
|
||||||
let calculatorCell = document.createElement("td");
|
let calculatorCell = createCustomElement("td");
|
||||||
let calculatorForm = document.createElement("form");
|
let calculatorForm = createCustomElement(
|
||||||
calculatorForm.setAttribute("method", "post");
|
"form",
|
||||||
calculatorForm.setAttribute("action", "/?s=tools&m=runtime_calculator&inta=calculate");
|
{
|
||||||
calculatorForm.appendChild(createInput("hidden", "start_x", startPoint[0]));
|
"method": "post",
|
||||||
calculatorForm.appendChild(createInput("hidden", "start_y", startPoint[1]));
|
"action": "/?s=tools&m=runtime_calculator&inta=calculate",
|
||||||
calculatorForm.appendChild(createInput("hidden", "target_x", targetPoint[0]));
|
"title": "Calculateur de trajet",
|
||||||
calculatorForm.appendChild(createInput("hidden", "target_y", targetPoint[1]));
|
},
|
||||||
let calculatorImg = document.createElement("input");
|
null,
|
||||||
calculatorImg.setAttribute("type", "image");
|
{
|
||||||
calculatorImg.setAttribute("src", chrome.runtime.getURL("images/calculator.svg"));
|
"display": "inline-block",
|
||||||
calculatorImg.style.width = "20px";
|
},
|
||||||
calculatorImg.style.height = "20px";
|
);
|
||||||
calculatorImg.style.border = "none";
|
calculatorForm.appendChild(createCustomInput("hidden", "start_x", startPoint.x));
|
||||||
|
calculatorForm.appendChild(createCustomInput("hidden", "start_y", startPoint.y));
|
||||||
|
calculatorForm.appendChild(createCustomInput("hidden", "target_x", targetPoint.x));
|
||||||
|
calculatorForm.appendChild(createCustomInput("hidden", "target_y", targetPoint.y));
|
||||||
|
let calculatorImg = createCustomInput(
|
||||||
|
"image",
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
{"src": chrome.runtime.getURL("images/calculator.svg")},
|
||||||
|
{"width": "20px", "height": "20px", "border": "none"}
|
||||||
|
);
|
||||||
calculatorForm.appendChild(calculatorImg);
|
calculatorForm.appendChild(calculatorImg);
|
||||||
calculatorCell.appendChild(calculatorForm);
|
calculatorCell.appendChild(calculatorForm);
|
||||||
|
|
||||||
|
let calculatorFormBlank = calculatorForm.cloneNode(true);
|
||||||
|
calculatorFormBlank.setAttribute("target", "_blank");
|
||||||
|
calculatorFormBlank.setAttribute("title", "Calculateur de trajet dans nouvel onglet");
|
||||||
|
let calculatorBlankImg = calculatorFormBlank.getElementsByTagName("input")[4]
|
||||||
|
calculatorBlankImg.setAttribute("src", chrome.runtime.getURL("images/blank.svg"));
|
||||||
|
calculatorCell.appendChild(calculatorFormBlank);
|
||||||
|
|
||||||
rows[i].appendChild(calculatorCell);
|
rows[i].appendChild(calculatorCell);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function main() {
|
||||||
|
/* Exit immediately if not on game page */
|
||||||
|
let layCastleTopElements = document.getElementsByClassName("lay_castle_top");
|
||||||
|
if (layCastleTopElements.length === 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Exit immediately if extension has already been loaded */
|
||||||
|
let kaplus = document.getElementById("kaplus-marker");
|
||||||
|
if (kaplus) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Set marker to prevent loading extension several times */
|
||||||
|
document.body.appendChild(createCustomElement("div", {"id": "kaplus-marker"}, null, {"display": "none"}));
|
||||||
|
|
||||||
|
/* Remove ads banner on dom content loaded */
|
||||||
|
window.addEventListener("DOMContentLoaded", removeAdsBanner);
|
||||||
|
|
||||||
|
/* Customize navbar */
|
||||||
|
customizeNavbar(layCastleTopElements[0]); // test: OK
|
||||||
|
|
||||||
|
/* Parse url params and switch case */
|
||||||
|
let urlParams = new URLSearchParams(window.location.search);
|
||||||
|
let section = urlParams.get("s");
|
||||||
|
let module = urlParams.get("m");
|
||||||
|
let sub = urlParams.get("sub");
|
||||||
|
|
||||||
|
/* Choose action according to section, module and sub */
|
||||||
|
switch (section) {
|
||||||
|
case "ranking":
|
||||||
|
switch (module) {
|
||||||
|
case "player": case null:
|
||||||
|
showPlayersId(); // test: OK
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "ally":
|
||||||
|
switch (module) {
|
||||||
|
case "members":
|
||||||
|
showPlayersId(); // test: OK
|
||||||
|
break;
|
||||||
|
case "attacks":
|
||||||
|
showSecondsAndCalculator(); // test: OK
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "overview":
|
||||||
|
showVillageUnitPoints(); // test: FAILED because settlement element has been removed
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "build_barracks":
|
||||||
|
switch (module) {
|
||||||
|
case "command": case null:
|
||||||
|
switch (sub) {
|
||||||
|
case null:
|
||||||
|
showBarrackSelectAllUnits(); // test: OK
|
||||||
|
break;
|
||||||
|
case "send":
|
||||||
|
showCountupTimeDecimals(); // test: OK
|
||||||
|
showOccurrencesInput(); // test: OK
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "build_market":
|
||||||
|
switch (module) {
|
||||||
|
case "send": case null:
|
||||||
|
fixSelectVillageBug(); // test: OK
|
||||||
|
showThousandInputs(); // test: OK
|
||||||
|
fixSendResourcesInputsTypes(); // test: OK
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "info_player":
|
||||||
|
switch (module) {
|
||||||
|
case "profile": case null:
|
||||||
|
showPlayerUnitPointsAndId(); // test: OK
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "info_member":
|
||||||
|
showPlayersId(); // test: OK
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
main();
|
main();
|
||||||
|
|||||||
Reference in New Issue
Block a user