Skip to content

Commit

Permalink
Add new breakdown stats.
Browse files Browse the repository at this point in the history
  • Loading branch information
roncli committed Dec 10, 2022
1 parent f9ac6bc commit 46bfb31
Show file tree
Hide file tree
Showing 3 changed files with 176 additions and 11 deletions.
4 changes: 4 additions & 0 deletions public/css/game.css
Expand Up @@ -104,6 +104,10 @@
display: grid;
}

#damage #grid .table > div {
min-width: 41px;
}

#damage #weapons,
#damage #weapons a,
#damage #weapons a img,
Expand Down
169 changes: 169 additions & 0 deletions public/js/archive.js
Expand Up @@ -89,6 +89,174 @@ class ArchiveJs {
return false;
});

document.querySelectorAll("a.stats").forEach((a) => a.addEventListener("click", (ev) => {
document.getElementById("weapon").innerText = a.innerText;

switch (a.innerText) {
case "Damage":
for (let x = 0; x < ArchiveJs.game.players.length; x++) {
let total = 0;
for (let y = 0; y < ArchiveJs.game.players.length; y++) {
const damage = ArchiveJs.game.damage.filter((d) => d.attacker === ArchiveJs.game.players[x].name && d.defender === ArchiveJs.game.players[y].name).reduce((prev, cur) => prev + cur.damage, 0) || 0,
el = document.getElementById(`damage-${x}-${y}`);

el.innerText = damage === 0 ? "" : damage.toFixed(0);
if (!el.classList.contains("friendly") && !el.classList.contains("self")) {
total += damage;
}
}
document.getElementById(`damage-${x}-total`).innerText = total.toFixed(0);
}

for (let x = 0; x < ArchiveJs.game.players.length; x++) {
let total = 0;
for (let y = 0; y < ArchiveJs.game.players.length; y++) {
const damage = ArchiveJs.game.damage.filter((d) => d.defender === ArchiveJs.game.players[x].name && d.attacker === ArchiveJs.game.players[y].name).reduce((prev, cur) => prev + cur.damage, 0) || 0,
el = document.getElementById(`damage-${y}-${x}`);

if (!el.classList.contains("friendly") && !el.classList.contains("count")) {
total += damage;
}
}
document.getElementById(`damage-total-${x}`).innerText = total.toFixed(0);
}

break;
case "Kills":
for (let x = 0; x < ArchiveJs.game.players.length; x++) {
let total = 0;
for (let y = 0; y < ArchiveJs.game.players.length; y++) {
const kills = ArchiveJs.game.kills.filter((d) => d.attacker === ArchiveJs.game.players[x].name && d.defender === ArchiveJs.game.players[y].name).length || 0,
el = document.getElementById(`damage-${x}-${y}`);

el.innerText = kills === 0 ? "" : kills.toFixed(0);
if (!el.classList.contains("friendly") && !el.classList.contains("self")) {
total += kills;
} else {
total -= kills;
}
}
document.getElementById(`damage-${x}-total`).innerText = total.toFixed(0);
}

for (let x = 0; x < ArchiveJs.game.players.length; x++) {
let total = 0;
for (let y = 0; y < ArchiveJs.game.players.length; y++) {
const kills = ArchiveJs.game.kills.filter((d) => d.defender === ArchiveJs.game.players[x].name && d.attacker === ArchiveJs.game.players[y].name).length || 0,
el = document.getElementById(`damage-${y}-${x}`);

if (!el.classList.contains("friendly") && !el.classList.contains("count")) {
total += kills;
}
}
document.getElementById(`damage-total-${x}`).innerText = total.toFixed(0);
}

break;
case "Assists":
for (let x = 0; x < ArchiveJs.game.players.length; x++) {
let total = 0;
for (let y = 0; y < ArchiveJs.game.players.length; y++) {
const assists = ArchiveJs.game.kills.filter((d) => d.assisted === ArchiveJs.game.players[x].name && d.defender === ArchiveJs.game.players[y].name).length || 0,
el = document.getElementById(`damage-${x}-${y}`);

el.innerText = assists === 0 ? "" : assists.toFixed(0);
if (!el.classList.contains("friendly") && !el.classList.contains("self")) {
total += assists;
} else {
total -= assists;
}
}
document.getElementById(`damage-${x}-total`).innerText = total.toFixed(0);
}

for (let x = 0; x < ArchiveJs.game.players.length; x++) {
let total = 0;
for (let y = 0; y < ArchiveJs.game.players.length; y++) {
const assists = ArchiveJs.game.kills.filter((d) => d.defender === ArchiveJs.game.players[x].name && d.assisted === ArchiveJs.game.players[y].name).length || 0,
el = document.getElementById(`damage-${y}-${x}`);

if (!el.classList.contains("friendly") && !el.classList.contains("count")) {
total += assists;
}
}
document.getElementById(`damage-total-${x}`).innerText = total.toFixed(0);
}

break;
case "Assisted":
for (let x = 0; x < ArchiveJs.game.players.length; x++) {
let total = 0;
for (let y = 0; y < ArchiveJs.game.players.length; y++) {
const assists = ArchiveJs.game.kills.filter((d) => d.assisted === ArchiveJs.game.players[x].name && d.attacker === ArchiveJs.game.players[y].name).length || 0,
el = document.getElementById(`damage-${x}-${y}`);

el.innerText = assists === 0 ? "" : assists.toFixed(0);
if (!el.classList.contains("friendly") && !el.classList.contains("self")) {
total += assists;
} else {
total -= assists;
}
}
document.getElementById(`damage-${x}-total`).innerText = total.toFixed(0);
}

for (let x = 0; x < ArchiveJs.game.players.length; x++) {
let total = 0;
for (let y = 0; y < ArchiveJs.game.players.length; y++) {
const assists = ArchiveJs.game.kills.filter((d) => d.attacker === ArchiveJs.game.players[x].name && d.assisted === ArchiveJs.game.players[y].name).length || 0,
el = document.getElementById(`damage-${y}-${x}`);

if (!el.classList.contains("friendly") && !el.classList.contains("count")) {
total += assists;
}
}
document.getElementById(`damage-total-${x}`).innerText = total.toFixed(0);
}

break;
case "Damage Per Kill":
for (let x = 0; x < ArchiveJs.game.players.length; x++) {
let totalDamage = 0,
totalKills = 0;
for (let y = 0; y < ArchiveJs.game.players.length; y++) {
const damage = ArchiveJs.game.damage.filter((d) => d.attacker === ArchiveJs.game.players[x].name && d.defender === ArchiveJs.game.players[y].name).reduce((prev, cur) => prev + cur.damage, 0) || 0,
kills = ArchiveJs.game.kills.filter((d) => d.attacker === ArchiveJs.game.players[x].name && d.defender === ArchiveJs.game.players[y].name).length || 0,
el = document.getElementById(`damage-${x}-${y}`);

el.innerText = damage / Math.max(kills, 1) === 0 ? "" : (damage / Math.max(kills, 1)).toFixed(2);
if (!el.classList.contains("friendly") && !el.classList.contains("self")) {
totalDamage += damage;
totalKills += kills;
}
}
document.getElementById(`damage-${x}-total`).innerText = (totalDamage / Math.max(totalKills, 1)).toFixed(2);
}

for (let x = 0; x < ArchiveJs.game.players.length; x++) {
let totalDamage = 0,
totalKills = 0;
for (let y = 0; y < ArchiveJs.game.players.length; y++) {
const damage = ArchiveJs.game.damage.filter((d) => d.defender === ArchiveJs.game.players[x].name && d.attacker === ArchiveJs.game.players[y].name).reduce((prev, cur) => prev + cur.damage, 0) || 0,
kills = ArchiveJs.game.kills.filter((d) => d.defender === ArchiveJs.game.players[x].name && d.attacker === ArchiveJs.game.players[y].name).length || 0,
el = document.getElementById(`damage-${y}-${x}`);

if (!el.classList.contains("friendly") && !el.classList.contains("count")) {
totalDamage += damage;
totalKills += kills;
}
}
document.getElementById(`damage-total-${x}`).innerText = (totalDamage / Math.max(totalKills, 1)).toFixed(2);
}

break;
}

ev.preventDefault();
ev.stopPropagation();
return false;
}));

document.querySelectorAll("a.weapon").forEach((a) => a.addEventListener("click", (ev) => {
document.getElementById("weapon").innerText = a.title;

Expand Down Expand Up @@ -218,6 +386,7 @@ class ArchiveJs {
ArchiveJs.gameChartObj = ArchiveJs.gameGraphChart(gameChart, "score");
ArchiveJs.weaponChartObj = ArchiveJs.weaponGraphChart(weaponChart, document.querySelector("a.weapon-graph").title);
ArchiveJs.playerChartObj = ArchiveJs.playerGraphChart(playerChart, document.querySelector("a.player-graph").title);
document.querySelectorAll("a.stats")[0].click();
}

// # ### ## # #
Expand Down
14 changes: 3 additions & 11 deletions public/views/archive.js
Expand Up @@ -38,40 +38,32 @@ class ArchiveView {
<div id="damage">
${game.players && /* html */`
<div id="weapons">
Stats: <a class="stats" href="#">Damage</a> | <a class="stats" href="#">Kills</a> | <a class="stats" href="#">Assists</a> | <a class="stats" href="#">Assisted</a> | <a class="stats" href="#">Damage Per Kill</a><br />
Weapon: ${weapons.map((weapon) => /* html */`
<a class="weapon" href="#" title="${weapon}"><img src="/images/${weapon.replace(/ /g, "").toLocaleLowerCase()}.png" width="28" height="41" alt="${weapon}" /></a>
`).join("")}
</div>
<div id="grid">
<div class="table" style="grid-template-columns: repeat(${3 + game.players.length}, max-content)">
<div class="table" style="grid-template-columns: repeat(${2 + game.players.length}, max-content)">
<div id="weapon-container">
<div id="weapon">Select a weapon</div>
<div id="weapon"></div>
</div>
${game.players.sort((a, b) => a.name.localeCompare(b.name)).map((player) => /* html */`
<div class="vertical header">${ArchiveView.Common.htmlEncode(player.name)}</div>
`).join("")}
<div class="vertical header">Total</div>
<div class="vertical header">All Weapons</div>
${game.players.map((player, index) => /* html */`
<div class="header">${ArchiveView.Common.htmlEncode(player.name)}</div>
${game.players.map((opponent, opponentIndex) => /* html */`
<div id="damage-${index}-${opponentIndex}" class="right ${index === opponentIndex ? "self" : player.team && player.team === opponent.team ? `friendly${game.settings && game.settings.friendlyFire ? " count" : ""}` : ""}"></div>
`).join("")}
<div id="damage-${index}-total" class="right"></div>
<div class="right">${game.damage.filter((d) => d.attacker === player.name && d.attacker !== d.defender && (!game.players.find((p) => p.name === d.attacker).team || game.players.find((p) => p.name === d.defender) && game.players.find((p) => p.name === d.attacker).team !== game.players.find((p) => p.name === d.defender).team)).map((d) => d.damage).reduce((a, b) => a + b, 0).toFixed(0)}</div>
`).join("")}
<div class="header">Total</div>
${game.players.map((player, index) => /* html */`
<div id="damage-total-${index}" class="right"></div>
`).join("")}
<div class="empty"></div>
<div class="empty"></div>
<div class="header">All Weapons</div>
${game.players.map((player) => /* html */`
<div class="right">${game.damage.filter((d) => d.defender === player.name && (game.settings && game.settings.friendlyFire || d.attacker === d.defender || !game.players.find((p) => p.name === d.defender).team || game.players.find((p) => p.name === d.attacker) && game.players.find((p) => p.name === d.defender).team !== game.players.find((p) => p.name === d.attacker).team)).map((d) => d.damage).reduce((a, b) => a + b, 0).toFixed(0)}</div>
`).join("")}
<div class="empty"></div>
<div class="empty"></div>
</div>
</div>
` || ""}
Expand Down

0 comments on commit 46bfb31

Please sign in to comment.