import "notyf/notyf.min.css"; import "bulma/css/bulma.css"; import "@fortawesome/fontawesome-free/css/all.css"; import "./style.css"; import { Manager, Timer } from "./utils"; import { CourtManager, PlayerManager } from "./manage"; 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 g = new GameManager();