diff options
Diffstat (limited to 'src/main.js')
| -rw-r--r-- | src/main.js | 143 |
1 files changed, 140 insertions, 3 deletions
diff --git a/src/main.js b/src/main.js index 0e05e0d..d66ddb6 100644 --- a/src/main.js +++ b/src/main.js @@ -2,8 +2,145 @@ import "notyf/notyf.min.css"; import "bulma/css/bulma.css"; import "@fortawesome/fontawesome-free/css/all.css"; import "./style.css"; -import { GameManager } from "./game.mjs"; -import { Timer } from "./utils.mjs"; +import { Manager, Timer } from "./utils"; +import { CourtManager, PlayerManager } from "./court"; +import { Team, Game } from "./data"; + +export class GameManager extends Manager { + t = new Timer(); + courts = new CourtManager(); + players = new PlayerManager(); + + constructor() { + super("Game", 12); + this.round = Number(localStorage.getItem("round")) || 0; + this.render(); + addGameBehaviour(this); + } + createItem(i, description) { + if (typeof description === "undefined") { + description = "---"; + } + let team = new Team(description, description); + return new Game(i, true, team, team); + } + loadItem(data) { + let id = Number(data.id); + let teamOne = new Team(data.teamOne.playerOne, data.teamOne.playerTwo); + let teamTwo = new Team(data.teamTwo.playerOne, data.teamTwo.playerTwo); + let status = Boolean(data.status); + return new Game(id, status, teamOne, teamTwo); + } + addBehaviour() { + let description = this.isConfirmed() ? "Round " + this.round : "Proposal"; + document.getElementById("Game_description").innerHTML = description; + } + isConfirmed() { + return this.data[0].status; + } + getBlockedGames() { + const inactiveCourts = this.courts.inactive(); + console.log("Total reserved courts are " + inactiveCourts.length + "."); + let games = []; + for (let court of inactiveCourts) { + games.push(this.createItem(court.id, "RESERVED")); + } + return games; + } + inactive(courts) { + let games = []; + for (let court of courts) { + games.push(this.createItem(court.id)); + } + return games; + } + 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, false, team_1, team_2); + game.print(); + games.push(game); + } + return games; + } + propose() { + console.log("Proposing new games!"); + let possibleMatches = getMatchCount( + this.players.data.concat(this.players.g.data), + this.courts.data + ); + console.log("Total possible matches are " + possibleMatches + "."); + this.data = this.getBlockedGames(); + const activeCourts = this.courts.active(); + const unusedCourts = activeCourts.slice(possibleMatches + 1); + this.data = this.data.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.data = this.data.concat(this.active(usedCourts, selectedPlayers)); + this.data.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.data.length; i++) { + this.data[i].status = true; + } + 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; +} + +function addGameBehaviour(g) { + document.getElementById("propose").addEventListener("click", () => { + g.propose(); + }); + document.getElementById("confirm").addEventListener("click", () => { + g.confirm(); + }); + document.getElementById("reset").addEventListener("click", () => { + g.reset(); + }); +} -const t = new Timer(); const g = new GameManager(); |
