1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
|
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 "./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 g = new GameManager();
|