aboutsummaryrefslogtreecommitdiff
path: root/src/game.mjs
diff options
context:
space:
mode:
Diffstat (limited to 'src/game.mjs')
-rw-r--r--src/game.mjs186
1 files changed, 186 insertions, 0 deletions
diff --git a/src/game.mjs b/src/game.mjs
new file mode 100644
index 0000000..c8931ac
--- /dev/null
+++ b/src/game.mjs
@@ -0,0 +1,186 @@
+import { Notyf } from 'notyf';
+import { Manager } from "./utils.mjs";
+import { CourtManager } from "./court.mjs";
+import { PlayerManager } from "./player.mjs";
+
+class Team {
+ constructor(playerOne, playerTwo) {
+ this.playerOne = playerOne;
+ this.playerTwo = playerTwo;
+ }
+ print() {
+ console.log(this.playerOne + " and " + this.playerTwo);
+ }
+ render() {
+ let p1 = `<td style="width: 23%; text-align: right;">${this.playerOne}</td>`;
+ let p2 = `<td style="width: 23%; text-align: right;">${this.playerTwo}</td>`;
+ return p1 + p2;
+ }
+}
+
+class Game {
+ constructor(id, teamOne, teamTwo, status) {
+ this.id = id;
+ this.teamOne = teamOne;
+ this.teamTwo = teamTwo;
+ this.status = typeof status !== "undefined" ? status : false;
+ }
+ print() {
+ let teamOne = this.teamOne.playerOne + " and " + this.teamOne.playerTwo;
+ let teamTwo = this.teamTwo.playerOne + " and " + this.teamTwo.playerTwo;
+ console.log(teamOne + " is playing against " + teamTwo);
+ }
+ render() {
+ let blockedState = this.teamOne.playerOne === "RESERVED";
+ let type = blockedState ? `class="is-danger is-dark"` : ``;
+ return `<tr ${type}><td style="width: 8%; text-align: center;">${
+ this.id + 1
+ }</td>${this.teamOne.render()}${this.teamTwo.render()}</tr>`;
+ }
+}
+
+function generateDummyGames(courts, description) {
+ let team = new Team(description, description);
+ let games = [];
+ for (const court of courts) {
+ let game = new Game(court.id, team, team);
+ games.push(game);
+ }
+ return games;
+}
+
+export class GameManager extends Manager {
+ courts = new CourtManager();
+ players = new PlayerManager();
+
+ constructor() {
+ super("game", []);
+ this.round = Number(localStorage.getItem("round")) || 0;
+ console.log("Loading game data.");
+ let data = JSON.parse(localStorage.getItem(this.description));
+ if (data === null || data.length === 0) {
+ console.log("Game data unavailable: " + data);
+ this.generate();
+ return;
+ }
+ for (let i = 0; i < data.length; i++) {
+ let id = Number(data[i].id);
+ let teamOne = new Team(
+ data[i].teamOne.playerOne,
+ data[i].teamOne.playerTwo
+ );
+ let teamTwo = new Team(
+ data[i].teamTwo.playerOne,
+ data[i].teamTwo.playerTwo
+ );
+ let status = Boolean(data[i].status);
+ this.listData.push(new Game(id, teamOne, teamTwo, status));
+ }
+ console.log("Loaded " + this.listData.length + " games.");
+ this.render();
+ }
+ isConfirmed() {
+ return this.listData[0].status;
+ }
+ generate() {
+ console.log("Generating the dummy round.");
+ this.listData = generateDummyGames(this.courts.listData, "---");
+ console.log("Loaded " + this.listData.length + " dummy round.");
+ for (let i = 0; i < this.listData.length; i++) {
+ this.listData[i].status = true;
+ }
+ console.log(this.listData);
+ this.store();
+ this.render();
+ }
+ addBehaviour() {
+ let description = this.isConfirmed() ? "Round " + this.round : "Proposal";
+ document.getElementById("game_description").innerHTML = description;
+ }
+ getBlockedGames() {
+ const inactiveCourts = this.courts.inactive();
+ console.log("Total reserved courts are " + inactiveCourts.length + ".");
+ return generateDummyGames(inactiveCourts, "RESERVED");
+ }
+ inactive(courts) {
+ return generateDummyGames(courts, "---");
+ }
+ active(courts, players) {
+ let games = [];
+ for (let index = 0; index < courts.length; index++) {
+ const startIndex = 4 * index;
+ const endIndex = startIndex + 4;
+ const courtPlayers = players.slice(startIndex, endIndex);
+ const team_1 = new Team(courtPlayers[0].name, courtPlayers[3].name);
+ const team_2 = new Team(courtPlayers[1].name, courtPlayers[2].name);
+ const game = new Game(courts[index].id, team_1, team_2);
+ game.print();
+ games.push(game);
+ }
+ return games;
+ }
+ propose() {
+ console.log("Proposing new games!");
+ let possibleMatches = getMatchCount(
+ this.players.listData,
+ this.courts.listData
+ );
+ console.log("Total possible matches are " + possibleMatches + ".");
+ this.listData = this.getBlockedGames();
+ const activeCourts = this.courts.active();
+ const unusedCourts = activeCourts.slice(possibleMatches + 1);
+ this.listData = this.listData.concat(this.inactive(unusedCourts));
+ const usedCourts = activeCourts.slice(0, possibleMatches);
+ let requiredPlayerCount = possibleMatches * 4;
+ const selectedPlayers = this.players.propose(requiredPlayerCount);
+ console.log("The matches are:");
+ this.listData = this.listData.concat(
+ this.active(usedCourts, selectedPlayers)
+ );
+ this.listData.sort((a, b) => a.id - b.id);
+ this.render();
+ }
+ confirm() {
+ if (this.isConfirmed()) {
+ const notification = new Notyf();
+ notification.error("Create a proposal first!");
+ return;
+ }
+ console.log("Confirm the proposal for round " + this.round + ".");
+ this.round += 1;
+ localStorage.setItem("round", this.round);
+ for (let i = 0; i < this.listData.length; i++) {
+ this.listData[i].status = true;
+ }
+ // Need to update the number of games played here
+ this.store();
+ this.render();
+ document.getElementById("timer-start").click();
+ const notification = new Notyf();
+ notification.success("Round confirmed!");
+ }
+ reset() {
+ localStorage.removeItem("round");
+ localStorage.removeItem(this.description);
+ localStorage.removeItem(this.courts.description);
+ document.getElementById("timer-stop").click();
+ window.location.reload();
+ const notification = new Notyf();
+ notification.error("Session has been reset!");
+ }
+}
+
+function getMatchCount(players, courts) {
+ courts = courts.filter(function (c) {
+ return c.status;
+ });
+ console.log("There are a total of " + courts.length + " courts available.");
+ console.log(players);
+ players = players.filter(function (p) {
+ return p.status;
+ });
+ console.log("There are a total of " + players.length + " players available.");
+ var possibleMatches = Math.floor(players.length / 4);
+ possibleMatches = Math.min(possibleMatches, courts.length);
+ return possibleMatches;
+}