feat: battles - move Regiments back to init position after the battle

This commit is contained in:
Azgaar 2024-09-22 18:20:22 +02:00
parent e25f231697
commit b66874ddda
2 changed files with 56 additions and 70 deletions

View file

@ -36,45 +36,31 @@ class Battle {
modules.Battle = true;
// add listeners
document.getElementById("battleType").addEventListener("click", ev => this.toggleChange(ev));
document
.getElementById("battleType")
.nextElementSibling.addEventListener("click", ev => Battle.prototype.context.changeType(ev));
document
.getElementById("battleNameShow")
.addEventListener("click", () => Battle.prototype.context.showNameSection());
document
.getElementById("battleNamePlace")
.addEventListener("change", ev => (Battle.prototype.context.place = ev.target.value));
document.getElementById("battleNameFull").addEventListener("change", ev => Battle.prototype.context.changeName(ev));
document
.getElementById("battleNameCulture")
.addEventListener("click", () => Battle.prototype.context.generateName("culture"));
document
.getElementById("battleNameRandom")
.addEventListener("click", () => Battle.prototype.context.generateName("random"));
document.getElementById("battleNameHide").addEventListener("click", this.hideNameSection);
document.getElementById("battleAddRegiment").addEventListener("click", this.addSide);
document.getElementById("battleRoll").addEventListener("click", () => Battle.prototype.context.randomize());
document.getElementById("battleRun").addEventListener("click", () => Battle.prototype.context.run());
document.getElementById("battleApply").addEventListener("click", () => Battle.prototype.context.applyResults());
document.getElementById("battleCancel").addEventListener("click", () => Battle.prototype.context.cancelResults());
document.getElementById("battleWiki").addEventListener("click", () => wiki("Battle-Simulator"));
byId("battleType").on("click", ev => this.toggleChange(ev));
byId("battleType").nextElementSibling.on("click", ev => Battle.prototype.context.changeType(ev));
byId("battleNameShow").on("click", () => Battle.prototype.context.showNameSection());
byId("battleNamePlace").on("change", ev => (Battle.prototype.context.place = ev.target.value));
byId("battleNameFull").on("change", ev => Battle.prototype.context.changeName(ev));
byId("battleNameCulture").on("click", () => Battle.prototype.context.generateName("culture"));
byId("battleNameRandom").on("click", () => Battle.prototype.context.generateName("random"));
byId("battleNameHide").on("click", this.hideNameSection);
byId("battleAddRegiment").on("click", this.addSide);
byId("battleRoll").on("click", () => Battle.prototype.context.randomize());
byId("battleRun").on("click", () => Battle.prototype.context.run());
byId("battleApply").on("click", () => Battle.prototype.context.applyResults());
byId("battleCancel").on("click", () => Battle.prototype.context.cancelResults());
byId("battleWiki").on("click", () => wiki("Battle-Simulator"));
document.getElementById("battlePhase_attackers").addEventListener("click", ev => this.toggleChange(ev));
document
.getElementById("battlePhase_attackers")
.nextElementSibling.addEventListener("click", ev => Battle.prototype.context.changePhase(ev, "attackers"));
document.getElementById("battlePhase_defenders").addEventListener("click", ev => this.toggleChange(ev));
document
.getElementById("battlePhase_defenders")
.nextElementSibling.addEventListener("click", ev => Battle.prototype.context.changePhase(ev, "defenders"));
document
.getElementById("battleDie_attackers")
.addEventListener("click", () => Battle.prototype.context.rollDie("attackers"));
document
.getElementById("battleDie_defenders")
.addEventListener("click", () => Battle.prototype.context.rollDie("defenders"));
byId("battlePhase_attackers").on("click", ev => this.toggleChange(ev));
byId("battlePhase_attackers").nextElementSibling.on("click", ev =>
Battle.prototype.context.changePhase(ev, "attackers")
);
byId("battlePhase_defenders").on("click", ev => this.toggleChange(ev));
byId("battlePhase_defenders").nextElementSibling.on("click", ev =>
Battle.prototype.context.changePhase(ev, "defenders")
);
byId("battleDie_attackers").on("click", () => Battle.prototype.context.rollDie("attackers"));
byId("battleDie_defenders").on("click", () => Battle.prototype.context.rollDie("defenders"));
}
defineType() {
@ -97,20 +83,16 @@ class Battle {
}
setType() {
document.getElementById("battleType").className = "icon-button-" + this.type;
byId("battleType").className = "icon-button-" + this.type;
const sideSpecific = document.getElementById("battlePhases_" + this.type + "_attackers");
const attackers = sideSpecific
? sideSpecific.content
: document.getElementById("battlePhases_" + this.type).content;
const defenders = sideSpecific
? document.getElementById("battlePhases_" + this.type + "_defenders").content
: attackers;
const sideSpecific = byId("battlePhases_" + this.type + "_attackers");
const attackers = sideSpecific ? sideSpecific.content : byId("battlePhases_" + this.type).content;
const defenders = sideSpecific ? byId("battlePhases_" + this.type + "_defenders").content : attackers;
document.getElementById("battlePhase_attackers").nextElementSibling.innerHTML = "";
document.getElementById("battlePhase_defenders").nextElementSibling.innerHTML = "";
document.getElementById("battlePhase_attackers").nextElementSibling.append(attackers.cloneNode(true));
document.getElementById("battlePhase_defenders").nextElementSibling.append(defenders.cloneNode(true));
byId("battlePhase_attackers").nextElementSibling.innerHTML = "";
byId("battlePhase_defenders").nextElementSibling.innerHTML = "";
byId("battlePhase_attackers").nextElementSibling.append(attackers.cloneNode(true));
byId("battlePhase_defenders").nextElementSibling.append(defenders.cloneNode(true));
}
definePlace() {
@ -200,7 +182,7 @@ class Battle {
}
addSide() {
const body = document.getElementById("regimentSelectorBody");
const body = byId("regimentSelectorBody");
const context = Battle.prototype.context;
const regiments = pack.states
.filter(s => s.military && !s.removed)
@ -246,7 +228,7 @@ class Battle {
});
applySorting(regimentSelectorHeader);
body.addEventListener("click", selectLine);
body.on("click", selectLine);
function selectLine(ev) {
if (ev.target.className === "inactive") {
@ -289,15 +271,15 @@ class Battle {
showNameSection() {
document.querySelectorAll("#battleBottom > button").forEach(el => (el.style.display = "none"));
document.getElementById("battleNameSection").style.display = "inline-block";
byId("battleNameSection").style.display = "inline-block";
document.getElementById("battleNamePlace").value = this.place;
document.getElementById("battleNameFull").value = this.name;
byId("battleNamePlace").value = this.place;
byId("battleNameFull").value = this.name;
}
hideNameSection() {
document.querySelectorAll("#battleBottom > button").forEach(el => (el.style.display = "inline-block"));
document.getElementById("battleNameSection").style.display = "none";
byId("battleNameSection").style.display = "none";
}
changeName(ev) {
@ -310,8 +292,8 @@ class Battle {
type === "culture"
? Names.getCulture(pack.cells.culture[this.cell], null, null, "")
: Names.getBase(rand(nameBases.length - 1));
document.getElementById("battleNamePlace").value = this.place = place;
document.getElementById("battleNameFull").value = this.name = this.defineName();
byId("battleNamePlace").value = this.place = place;
byId("battleNameFull").value = this.name = this.defineName();
$("#battleScreen").dialog({title: this.name});
}
@ -495,7 +477,7 @@ class Battle {
this[side].power =
d3.sum(options.military.map(u => (forces[u.name] || 0) * u.power * scheme[phase][u.type])) / adjuster;
const UIvalue = this[side].power ? Math.max(this[side].power | 0, 1) : 0;
document.getElementById("battlePower_" + side).innerHTML = UIvalue;
byId("battlePower_" + side).innerHTML = UIvalue;
}
getInitialMorale() {
@ -509,7 +491,7 @@ class Battle {
}
updateMorale(side) {
const morale = document.getElementById("battleMorale_" + side);
const morale = byId("battleMorale_" + side);
morale.dataset.tip = morale.dataset.tip.replace(morale.value, "");
morale.value = this[side].morale | 0;
morale.dataset.tip += morale.value;
@ -524,7 +506,7 @@ class Battle {
}
rollDie(side) {
const el = document.getElementById("battleDie_" + side);
const el = byId("battleDie_" + side);
const prev = +el.innerHTML;
do {
el.innerHTML = rand(1, 6);
@ -672,11 +654,11 @@ class Battle {
this.attackers.phase = phase[0];
this.defenders.phase = phase[1];
const buttonA = document.getElementById("battlePhase_attackers");
const buttonA = byId("battlePhase_attackers");
buttonA.className = "icon-button-" + this.attackers.phase;
buttonA.dataset.tip = buttonA.nextElementSibling.querySelector("[data-phase='" + phase[0] + "']").dataset.tip;
const buttonD = document.getElementById("battlePhase_defenders");
const buttonD = byId("battlePhase_defenders");
buttonD.className = "icon-button-" + this.defenders.phase;
buttonD.dataset.tip = buttonD.nextElementSibling.querySelector("[data-phase='" + phase[1] + "']").dataset.tip;
}
@ -760,7 +742,7 @@ class Battle {
updateTable(side) {
for (const r of this[side].regiments) {
const tbody = document.getElementById("battle" + r.state + "-" + r.i);
const tbody = byId("battle" + r.state + "-" + r.i);
const battleCasualties = tbody.querySelector(".battleCasualties");
const battleSurvivors = tbody.querySelector(".battleSurvivors");
@ -794,7 +776,7 @@ class Battle {
button.style.opacity = 0.5;
div.style.display = "block";
document.getElementsByTagName("body")[0].addEventListener("click", hideSection, {once: true});
document.getElementsByTagName("body")[0].on("click", hideSection, {once: true});
}
changeType(ev) {
@ -811,7 +793,7 @@ class Battle {
changePhase(ev, side) {
if (ev.target.tagName !== "BUTTON") return;
const phase = (this[side].phase = ev.target.dataset.phase);
const button = document.getElementById("battlePhase_" + side);
const button = byId("battlePhase_" + side);
button.className = "icon-button-" + phase;
button.dataset.tip = ev.target.dataset.tip;
this.calculateStrength(side);
@ -873,6 +855,8 @@ class Battle {
r.u = Object.assign({}, r.survivors);
r.a = d3.sum(Object.values(r.u)); // reg total
armies.select(`g#${id} > text`).text(Military.getTotal(r)); // update reg box
moveRegiment(r, r.px, r.py); // move regiment back to initial position
}
const i = last(pack.markers)?.i + 1 || 0;
@ -881,7 +865,7 @@ class Battle {
const marker = {i, x: this.x, y: this.y, cell: this.cell, icon: "⚔️", type: "battlefields", dy: 52};
pack.markers.push(marker);
const markerHTML = drawMarker(marker);
document.getElementById("markers").insertAdjacentHTML("beforeend", markerHTML);
byId("markers").insertAdjacentHTML("beforeend", markerHTML);
}
const getSide = (regs, n) =>
@ -909,7 +893,9 @@ class Battle {
cancelResults() {
// move regiments back to initial positions
this.attackers.regiments.concat(this.defenders.regiments).forEach(r => moveRegiment(r, r.px, r.py));
this.attackers.regiments.forEach(r => moveRegiment(r, r.px, r.py));
this.defenders.regiments.forEach(r => moveRegiment(r, r.px, r.py));
$("#battleScreen").dialog("close");
this.cleanData();
}

View file

@ -12,7 +12,7 @@
*
* Example: 1.102.2 -> Major version 1, Minor version 102, Patch version 2
*/
const VERSION = "1.105.0";
const VERSION = "1.105.1";
if (parseMapVersion(VERSION) !== VERSION) alert("versioning.js: Invalid format or parsing function");
{
@ -38,7 +38,7 @@ if (parseMapVersion(VERSION) !== VERSION) alert("versioning.js: Invalid format o
<strong>Latest changes:</strong>
<li>Azgaar Bot to answer questions and provide help</li>
<li>Labels: ability to set letter spacing</li>
<li>Zones update</li>
<li>Zones performance improvement</li>
<li>Notes Editor: on-demand AI text generation</li>
<li>New style preset: Dark Seas</li>
<li>New routes generation algorithm</li>