3 Commits

Author SHA1 Message Date
fe33b9a334 Add button to select all units
All checks were successful
Continuous Deployment / lint (push) Successful in 27s
Continuous Deployment / deploy-chrome (push) Successful in 33s
Continuous Deployment / deploy-firefox (push) Successful in 3m42s
2025-11-18 10:50:35 +01:00
255ca528a5 Add tenth of seconds in attack sending page
All checks were successful
Continuous Deployment / lint (push) Successful in 26s
Continuous Deployment / deploy-chrome (push) Successful in 30s
Continuous Deployment / deploy-firefox (push) Successful in 5m27s
2025-11-17 19:22:39 +01:00
b843fa1b26 fix bug with search regex
All checks were successful
Continuous Deployment / lint (push) Successful in 27s
Continuous Deployment / deploy-chrome (push) Successful in 34s
Continuous Deployment / deploy-firefox (push) Successful in 5m42s
2025-11-16 12:53:44 +01:00
4 changed files with 159 additions and 17 deletions

View File

@@ -1,5 +1,19 @@
# Changelog
## 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

View File

@@ -1,7 +1,7 @@
{
"manifest_version": 3,
"name": "KAplus",
"version": "1.7.3",
"version": "1.9.1",
"developer": {
"name": "Samuel Campos",

View File

@@ -5,8 +5,8 @@
"firefox"
],
"release_notes": {
"fr": "- correction bug de calcul des secondes en utilisant le temps du serveur",
"en-US": "- fix bug on seconds by using server time"
"fr": "- ajout d'un bouton pour sélectionner toutes les troupes",
"en-US": " - add button to select all units"
}
}
}

View File

@@ -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) {
return parseInt(s.replace(".", ""));
}
@@ -39,6 +44,12 @@ function createInput(type, name, value) {
return elt;
}
function searchPoint(text) {
let index = text.search(/\d{3}\|\d{3}/);
let point = text.slice(index, index + 7).split("|");
return {x: point[0], y: point[1]}
}
function shortcutElementReplace(elt, img, text) {
// If more than one hyperlink element found,
// then keep the last one but with href of the first one.
@@ -73,6 +84,25 @@ function shortcutElementReplace(elt, img, text) {
}
}
function countUpMs() {
let arrivalDate = new Date(new Date().getTime() + movingDuration * 1000);
let prefix = "";
if (arrivalDate >= afterTomorrow) {
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);
}
function main() {
/* Exit immediately if not on game page */
let layCastleTopElements = document.getElementsByClassName("lay_castle_top");
@@ -103,6 +133,7 @@ function main() {
let section = urlParams.get("s");
let module = urlParams.get("m");
let sub = urlParams.get("sub");
let sendCommandForm = document.getElementById("sendCommandForm");
/* Display unit-points on user profile */
if (section === "info_player" && (module === "profile" || module === null)) {
@@ -149,34 +180,131 @@ function main() {
villagePointsRow.after(unitPointsRow);
}
/* Allow multiple attacks */
if (section === "build_barracks" && module === "command" && sub === "send") {
/* Units order page */
if (section === "build_barracks" && (module === null || module === "command") && sendCommandForm !== null) {
let barracksCommands = sendCommandForm.getElementsByClassName("barracksCommand");
let borderListTables = sendCommandForm.getElementsByClassName("borderlist");
let quantityLabel = document.createElement("label");
let quantityInput = document.createElement("input");
quantityInput.setAttribute("type", "checkbox");
quantityInput.addEventListener("change", function () {
let clickSpans = [];
if (barracksCommands.length === 1) {
clickSpans = barracksCommands[0].getElementsByClassName("click");
} else if (borderListTables.length === 1) {
clickSpans = borderListTables[0].getElementsByClassName("click");
}
for (let i = 0; i < 12; i++) {
if (clickSpans[i].classList.contains("all")) {
continue;
}
clickSpans[i].click();
}
})
quantityLabel.appendChild(quantityInput);
let quantitySpan = document.createElement("span");
quantitySpan.classList.add("click", "all");
quantitySpan.textContent = "(Tout sélectionner)";
quantityLabel.appendChild(quantitySpan);
if (barracksCommands.length === 1) {
let boxCell = document.createElement("div");
boxCell.classList.add("box");
let backgroundCell = document.createElement("div");
backgroundCell.classList.add("background");
let backgroundImg = document.createElement("img");
backgroundImg.setAttribute("src", "//s58-fr.kingsage.gameforge.com/img/modern/card_sendunit.png");
backgroundCell.appendChild(backgroundImg);
boxCell.appendChild(backgroundCell);
let imageCell = document.createElement("div");
imageCell.classList.add("image");
let imageImg = document.createElement("img");
imageImg.setAttribute("src", "//s58-fr.kingsage.gameforge.com/img/shortcut/barracks.png");
imageImg.style.width = "28px";
imageCell.appendChild(imageImg);
boxCell.appendChild(imageCell);
let nameCell = document.createElement("div");
nameCell.classList.add("name");
let nameA = document.createElement("a");
nameA.setAttribute("href", "help.php?m=units");
nameA.setAttribute("target", "_help");
let nameB = document.createElement("b");
nameB.textContent = "Tout";
nameA.appendChild(nameB);
nameCell.appendChild(nameA);
boxCell.appendChild(nameCell);
let quantityCell = document.createElement("div");
quantityCell.classList.add("quantity");
quantityCell.appendChild(quantityLabel);
boxCell.appendChild(quantityCell);
let brTag = barracksCommands[0].getElementsByTagName("br")[1];
barracksCommands[0].insertBefore(boxCell, brTag);
} else if (borderListTables.length === 1) {
let borderListRows = borderListTables[0].getElementsByTagName("tr");
let selectAllCell = borderListRows[1].getElementsByTagName("td")[3];
let imageA = document.createElement("a");
imageA.setAttribute("href", "help.php?m=units");
imageA.setAttribute("target", "_help");
let imageImg = document.createElement("img");
imageImg.setAttribute("src", "//s58-fr.kingsage.gameforge.com/img/shortcut/barracks.png")
imageImg.setAttribute("title", "Tout");
imageA.appendChild(imageImg);
selectAllCell.appendChild(imageA);
selectAllCell.appendChild(quantityLabel);
}
}
/* Units sending page */
if (section === "build_barracks" && module === "command" && sub === "send" && sendCommandForm === null) {
/* Improve countup time cell */
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 = document.createElement("tr");
let newLeftCell = document.createElement("td");
newLeftCell.textContent = "Arrivée:";
newRow.appendChild(newLeftCell);
let newRightCell = document.createElement("td");
newRightCell.setAttribute("id", "countup-time-ms");
newRow.appendChild(newRightCell);
oldCell.parentElement.parentElement.insertBefore(newRow, oldCell.parentElement);
oldCell.parentElement.style.display = "none";
setInterval(countUpMs, 100);
/* Allow multiple occurrences of send */
let table = document.createElement("table");
table.classList.add("borderlist");
let tbody = document.createElement("tbody");
let tr = document.createElement("tr");
let th = document.createElement("th");
th.textContent = "Nombre d'attaques:";
th.textContent = "Nombre d'occurrences:";
tr.appendChild(th)
let td = document.createElement("td");
let input = document.createElement("input");
input.setAttribute("type", "number");
input.setAttribute("name", "attack_count");
input.setAttribute("name", "occurrences");
input.setAttribute("value", "1");
td.appendChild(input);
tr.appendChild(td);
tbody.appendChild(tr);
table.appendChild(tbody);
let form = document.getElementsByTagName("form")[0];
let firstInput = form.getElementsByTagName("input")[0];
form.insertBefore(table, firstInput);
form.addEventListener("submit", function (event) {
event.preventDefault();
let formData = new FormData(this);
let attackCount = parseInt(formData.get("attack_count").toString());
formData.delete("attack_count");
let attackCount = parseInt(formData.get("occurrences").toString());
formData.delete("occurrences");
let sent = 0;
for (let i = 0; i < attackCount; i++) {
let xhr = new XMLHttpRequest();
@@ -230,16 +358,16 @@ function main() {
let hour = arrival.toLocaleTimeString("fr-FR");
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 targetPoint = cells[1].textContent.replace(/.*(\d{3}\|\d{3}).*/, "$1").split("|");
let startPoint = searchPoint(cells[2].textContent);
let targetPoint = searchPoint(cells[1].textContent);
let calculatorCell = document.createElement("td");
let calculatorForm = document.createElement("form");
calculatorForm.setAttribute("method", "post");
calculatorForm.setAttribute("action", "/?s=tools&m=runtime_calculator&inta=calculate");
calculatorForm.appendChild(createInput("hidden", "start_x", startPoint[0]));
calculatorForm.appendChild(createInput("hidden", "start_y", startPoint[1]));
calculatorForm.appendChild(createInput("hidden", "target_x", targetPoint[0]));
calculatorForm.appendChild(createInput("hidden", "target_y", targetPoint[1]));
calculatorForm.appendChild(createInput("hidden", "start_x", startPoint.x));
calculatorForm.appendChild(createInput("hidden", "start_y", startPoint.y));
calculatorForm.appendChild(createInput("hidden", "target_x", targetPoint.x));
calculatorForm.appendChild(createInput("hidden", "target_y", targetPoint.y));
let calculatorImg = document.createElement("input");
calculatorImg.setAttribute("type", "image");
calculatorImg.setAttribute("src", chrome.runtime.getURL("images/calculator.svg"));