Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions static/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
<div id="topPanel">
<div id="shareButton" class="bold button"></div>
<div id="aboutButton" class="bold button">i</div>
<div id="statsButton" class="bold button hiddenExperimental">S</div>
<span id="missionName" class="medium"></span>
</div>
<div id="leftPanel">
Expand Down Expand Up @@ -110,6 +111,14 @@
</div>
</div>

<div id="stats" class="modalDialog closed">
<div class="dialogBase">
<div id="statsHeader" class="dialogHeader">Statistics</div>
<div id="statsBody" class="dialogBody">Body</div>
<div id="statsFooter" class="dialogFooter"></div>
</div>
</div>

<div id="hint" class="hint">Test popup</div>

<script src="scripts/localizable.js"></script>
Expand Down
4 changes: 2 additions & 2 deletions static/scripts/ocap.event.js
Original file line number Diff line number Diff line change
Expand Up @@ -125,10 +125,10 @@ class HitKilledEvent extends GameEvent {
causedBySpan.className = this.causedBy.getSideClass()
switch (this.type) {
case "killed":
causedBySpan.textContent = this.causedBy.getName() + " (" + (causedBy.killCount + 1) + " kills)";
causedBySpan.textContent = `${this.causedBy.getName()} (${causedBy.killCount - (causedBy.teamKillCount*2)} kills)`;
break;
case "hit":
causedBySpan.textContent = this.causedBy.getName() + " (" + (causedBy.killCount) + " kills)";
causedBySpan.textContent = `${this.causedBy.getName()} (${causedBy.killCount - (causedBy.teamKillCount*2)} kills)`;
break;
}
} else {
Expand Down
21 changes: 12 additions & 9 deletions static/scripts/ocap.js
Original file line number Diff line number Diff line change
Expand Up @@ -675,35 +675,38 @@ function processOp (filepath) {
var gameEvent = null;
switch (true) {
case (type == "killed" || type == "hit"):
var causedByInfo = eventJSON[3];
var victim = entities.getById(eventJSON[2]);
var causedBy = entities.getById(causedByInfo[0]); // In older captures, this will return null
var distance = eventJSON[4];
const causedByInfo = eventJSON[3];
const victim = entities.getById(eventJSON[2]);
const causedBy = entities.getById(causedByInfo[0]); // In older captures, this will return null
const distance = eventJSON[4];

//console.log(eventJSON[2]);
//if (victim == null) {return}; // Temp fix until vehicles are handled (victim is null if reference is a vehicle)

// Create event object
var weapon;
let weapon;
if (causedBy instanceof Unit) {
weapon = causedByInfo[1];
} else {
weapon = "N/A";
}
gameEvent = new HitKilledEvent(frameNum, type, causedBy, victim, distance, weapon);

// TODO: Find out why victim/causedBy can sometimes be null
if (causedBy == null || (victim == null)) {
if (causedBy == null || victim == null) {
console.warn("unknown victim/causedBy", victim, causedBy);
}

// Incrememt kill/death count for killer/victim
if (type == "killed" && (causedBy != null)) {
if (causedBy != victim) {
if (type === "killed" && (causedBy != null)) {
if (causedBy !== victim && causedBy._side === victim._side) {
causedBy.teamKillCount++;
}
if (causedBy !== victim) {
causedBy.killCount++;
}
victim.deathCount++;
}
gameEvent = new HitKilledEvent(frameNum, type, causedBy, victim, distance, weapon);

// Add tick to timeline
ui.addTickToTimeline(frameNum);
Expand Down
102 changes: 82 additions & 20 deletions static/scripts/ocap.ui.js
Original file line number Diff line number Diff line change
Expand Up @@ -20,13 +20,17 @@ class UI {
this.modalFilter = null;
this.modalBody = null;
this.modalButtons = null;
this.statsDialog = null;
this.statsDialogBody = null;
this.missionName = null;
//this.loadOpButton = null;
this.playPauseButton = null;
this.playbackSpeedSliderContainer = null;
this.playbackSpeedSlider = null;
this.playbackSpeedVal = null;
this.aboutButton = null;
this.shareButton = null;
this.statsButton = null;
this.toggleFirelinesButton = null;
this.toggleMarkersButton = null;
this.hint = null;
Expand Down Expand Up @@ -71,17 +75,19 @@ class UI {
});
this.loadOpButton = loadOpButton; */

// About button
var aboutButton = document.getElementById("aboutButton");
aboutButton.addEventListener("click", () => {
// Buttons
this.aboutButton = document.getElementById("aboutButton");
this.aboutButton.addEventListener("click", () => {
this.showModalAbout();
});
this.aboutButton = aboutButton;

this.shareButton = document.getElementById("shareButton");
this.shareButton.addEventListener("click", () => {
this.showModalShare();
});
this.statsButton = document.getElementById("statsButton");
this.statsButton.addEventListener("click", () => {
this.showModalStats();
});

// Nickname show/hide vehicle && player
this.toggleNicknameButton = document.getElementById("toggleNickname");
Expand Down Expand Up @@ -253,15 +259,19 @@ class UI {


// Modal
this.setModal(
document.getElementById("modal"),
document.getElementById("modalHeader"),
document.getElementById("modalFilter"),
document.getElementById("modalBody"),
document.getElementById("modalButtons")
);
this.modal = document.getElementById("modal");
this.modalHeader = document.getElementById("modalHeader");
this.modalFilter = document.getElementById("modalFilter");
this.modalBody = document.getElementById("modalBody");
this.modalButtons = document.getElementById("modalButtons");
this.showModalOpSelection();

// Stats
this.statsDialog = document.getElementById("stats");
this.statsDialogHeader = document.getElementById("statsHeader");
this.statsDialogBody = document.getElementById("statsBody");
this.statsDialogFooter = document.getElementById("statsFooter");

// Small popup
this.hint = document.getElementById("hint");

Expand Down Expand Up @@ -453,14 +463,6 @@ class UI {
}
};

setModal(modal, modalHeader, modalFilter, modalBody, modalButtons) {
this.modal = modal;
this.modalHeader = modalHeader;
this.modalFilter = modalFilter;
this.modalBody = modalBody;
this.modalButtons = modalButtons;
};

showModalOpSelection() {
// Set header/body
localizable(this.modalHeader, "select_mission");
Expand Down Expand Up @@ -573,6 +575,62 @@ class UI {
return button;
};

showModalStats() {
// localizable(this.statsDialogHeader, "info");

const units = [];
for (const entity of entities.getAll()) {
if (entity instanceof Unit) {
const unit = units.find((unit) => unit.name === entity._name);
if (unit) {
unit.killCount += entity.killCount;
unit.teamKillCount += entity.teamKillCount;
unit.deathCount += entity.deathCount;
} else {
units.push({
name: entity._name,
killCount: entity.killCount,
teamKillCount: entity.teamKillCount,
deathCount: entity.deathCount,
});
}
}
}
units.sort((a,b) => {
if (a.name < b.name) return -1;
if (a.name > b.name) return 1;
return 0;
});

let content = `
<table class="stats">
<tr>
<th class="name">Name</th>
<th class="kills">Kills</th>
<th class="tkills">TKills</th>
<th class="deaths">Deaths</th>
</tr>
`;
for (const unit of units) {
content += `
<tr>
<td class="name">${unit.name}</td>
<td class="kills">${unit.killCount}</td>
<td class="tkills">${unit.teamKillCount}</td>
<td class="deaths">${unit.deathCount}</td>
</tr>
`;
}
content += `</table>`;

this.statsDialogBody.innerHTML = content;

this.statsDialogFooter.appendChild(this.makeModalButton("Close", () => {
this.statsDialog.classList.add("closed");
}));
this.statsDialog.classList.remove("closed");
};

showModalAbout() {
localizable(this.modalHeader, "info");

Expand Down Expand Up @@ -773,5 +831,9 @@ class UI {
}
});
}

showExperimental() {
this.statsButton.classList.remove("hiddenExperimental");
}
}

1 change: 1 addition & 0 deletions static/scripts/ocap.unit.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ class Unit extends Entity {
}
}
this.killCount = 0;
this.teamKillCount = 0;
this.deathCount = 0;
this._sideClass = "";
this._sideColour = "#FFFFFF";
Expand Down
Loading