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

${this.lossesRedone > 0 ? `` : ``}
Actions undone ${this.actionsUndone}
Actions redone ${this.actionsRedone}
Losses undone ${this.lossesUndone}
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}
`; } }