aboutsummaryrefslogtreecommitdiff
path: root/src/player.mjs
blob: 06b1abdc8c83d6868a6052cfa8aacafe1b79bab1 (plain) (blame)
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
import { GuestManager } from "./guest.mjs";
import { shuffle, Manager, randomLevel, randomStatus } from "./utils.mjs";
import { Player } from "./data";


function parseLineToPlayer(data) {
  var info = data.split(",");
  var id = Number(info[0].trim());
  var name = info[1].trim() + " " + info[2].trim();
  var level = Number(info[3].trim());
  return new Player(id, true, level, 0, name);
}

export class PlayerManager extends Manager {
  g = new GuestManager();

  constructor() {
    super();
    console.log("Loading player data.");
    let tempPlayer = new Player();
    let data = JSON.parse(localStorage.getItem(tempPlayer.description));
    if (data === null || data.length === 0) {
      console.log("Player data unavailable: " + data);
      this.generate();
      return;
    }
    for (let i = 0; i < data.length; i++) {
      let id = Number(data[i].id);
      let name = data[i].name;
      let level = Number(data[i].level);
      let status = Boolean(Number(data[i].status));
      let games = Number(data[i].games);
      this.data.push(new Player(id, status, level, games, name));
    }
    console.log("Loaded " + this.data.length + " players.");
    this.render();
    this.addBehaviour();
    addLoadBehaviour(this);
  }
  generate() {
    console.log("Generating player data.");
    let maxPlayerCount = 71;
    for (let i = 0; i < maxPlayerCount; i++) {
      let p = new Player(i, randomStatus(), randomLevel());
      console.log(p);
      this.data.push(p);
    }
    console.log("Generated data for " + this.data.length + " players");
    this.store();
    this.render();
  }
  import(data) {
    var lines = data.split("\n");
    var players = [];
    for (var i = 1; i < lines.length; i++) {
      if (lines[i] == undefined || lines[i].trim() == "") {
        continue;
      }
      players.push(parseLineToPlayer(lines[i]));
    }
    console.log("Loaded " + players.length + " Players");
    for (var i = 0; i < players.length; i++) {
      players[i].print();
    }
    this.data = players;
    this.store();
    this.render();
  }
  active(factor) {
    factor = typeof factor !== "undefined" ? factor : 1;
    let data = super.active();
    console.log("Normalize skill by a factor of " + factor + ".");
    let players = data.map(function (p) {
      p.skill = Math.ceil(p.skill / factor);
      return p;
    });
    return players;
  }
  propose(count) {
    console.log("Required players are " + count);
    let factor = Number(document.getElementById("skill").value);
    console.log("Skill normalized by a factor of " + factor + ".");
    let activePlayers = this.active(factor);
    const activeGuests = this.g.active(factor);
    activePlayers = activePlayers.concat(activeGuests);
    console.log("Active players are:");
    console.log(
      activePlayers
        .map((i) => {
          return i.name;
        })
        .join(",")
    );
    const shuffledPlayers = shuffle(activePlayers);
    shuffledPlayers.sort((a, b) => a.totalPlayed - b.totalPlayed);
    const selectedPlayers = shuffledPlayers.slice(0, count);
    selectedPlayers.sort((a, b) => a.level - b.level);
    console.log("Selected players are:");
    console.log(
      selectedPlayers
        .map((i) => {
          return i.name;
        })
        .join(",")
    );
    return selectedPlayers;
  }
}

function addLoadBehaviour(p) {
  const f = document.querySelector("#player-load input[type=file]");
  f.addEventListener("change", () => {
    const file = f.files[0];
    let importData;
    console.log("Loading data from " + file.name);
    const reader = new FileReader();
    reader.onload = function (e) {
      importData = reader.result;
      p.import(importData);
    };
    reader.readAsText(file);
  });
}