import {formatTime} from "./Common";
// @ts-ignore
const {Storage, LocalStorage} = window.fwdekker.storage;
/**
* Stores game statistics in the browser's localstorage.
*/
export class Statistics implements Statistics {
private readonly storage: Storage;
/**
* Constructs a new statistics container.
*
* @param storage the underlying object to store statistics in
*/
constructor(storage: Storage = new LocalStorage("/tools/minesweeper//statistics")) {
this.storage = storage;
}
/**
* Clears all statistics.
*/
clear(): void {
this.storage.clear();
}
get actionsUndone(): number {
return this.storage.getNumber("actionsUndone", 0);
}
set actionsUndone(value: number) {
this.storage.setNumber("actionsUndone", value);
}
get actionsRedone(): number {
return this.storage.getNumber("actionsRedone", 0);
}
set actionsRedone(value: number) {
this.storage.setNumber("actionsRedone", value);
}
get lossesUndone(): number {
return this.storage.getNumber("lossesUndone", 0);
}
set lossesUndone(value: number) {
this.storage.setNumber("lossesUndone", value);
}
get lossesRedone(): number {
return this.storage.getNumber("lossesRedone", 0);
}
set lossesRedone(value: number) {
this.storage.setNumber("lossesRedone", value);
}
get timeSpent(): number {
return this.storage.getNumber("timeSpent", 0);
}
set timeSpent(value: number) {
this.storage.setNumber("timeSpent", value);
}
get gamesStarted(): number {
return this.storage.getNumber("gamesStarted", 0);
}
set gamesStarted(value: number) {
this.storage.setNumber("gamesStarted", value);
}
get gamesWon(): number {
return this.storage.getNumber("gamesWon", 0);
}
set gamesWon(value: number) {
this.storage.setNumber("gamesWon", value);
}
get gamesWonWithoutLosing(): number {
return this.storage.getNumber("gamesWonWithoutLosing", 0);
}
set gamesWonWithoutLosing(value: number) {
this.storage.setNumber("gamesWonWithoutLosing", value);
}
get squaresChorded(): number {
return this.storage.getNumber("squaresChorded", 0);
}
set squaresChorded(value: number) {
this.storage.setNumber("squaresChorded", value);
}
get squaresChordedLeadingToLoss(): number {
return this.storage.getNumber("squaresChordedLeadingToLoss", 0);
}
set squaresChordedLeadingToLoss(value: number) {
this.storage.setNumber("squaresChordedLeadingToLoss", value);
}
get squaresFlagged(): number {
return this.storage.getNumber("squaresFlagged", 0);
}
set squaresFlagged(value: number) {
this.storage.setNumber("squaresFlagged", value);
}
get squaresMarked(): number {
return this.storage.getNumber("squaresMarked", 0);
}
set squaresMarked(value: number) {
this.storage.setNumber("squaresMarked", value);
}
get squaresUncovered(): number {
return this.storage.getNumber("squaresUncovered", 0);
}
set squaresUncovered(value: number) {
this.storage.setNumber("squaresUncovered", value);
}
get minesUncovered(): number {
return this.storage.getNumber("minesUncovered", 0);
}
set minesUncovered(value: number) {
this.storage.setNumber("minesUncovered", value);
}
get hintsRequested(): number {
return this.storage.getNumber("hintsRequested", 0);
}
set hintsRequested(value: number) {
this.storage.setNumber("hintsRequested", value);
}
get solverUsages(): number {
return this.storage.getNumber("solverUsages", 0);
}
set solverUsages(value: number) {
this.storage.setNumber("solverUsages", value);
}
/**
* Generates an HTML report of the current statistics.
*/
generateHtmlReport(): string {
return "" +
`
Time and history
Actions undone |
${this.actionsUndone} |
Actions redone |
${this.actionsRedone} |
Losses undone |
${this.lossesUndone} |
${this.lossesRedone > 0 ? `Losses redone | ${this.lossesRedone} |
` : ``}
Time spent |
${formatTime(Math.floor(this.timeSpent / 1000), true, true)} |
Wins and losses
Games started |
${this.gamesStarted} |
Games completed |
${this.gamesWon}${this.gamesStarted > 0 ? ` (${Math.round(100 * this.gamesWon / this.gamesStarted)}%)` : ``}
|
Games completed without losing |
${this.gamesWonWithoutLosing}${this.gamesStarted > 0 ? ` (${Math.round(100 * this.gamesWonWithoutLosing / this.gamesStarted)}%)` : ``}
|
Steps taken
Squares chorded |
${this.squaresChorded} |
Squares chorded leading to loss |
${this.squaresChordedLeadingToLoss} |
Squares flagged |
${this.squaresFlagged} |
Squares marked |
${this.squaresMarked} |
Squares uncovered |
${this.squaresUncovered} |
Mines uncovered |
${this.minesUncovered} |
Solver usage
Hints requested |
${this.hintsRequested} |
Solver usages |
${this.solverUsages} |
`;
}
}