-
Notifications
You must be signed in to change notification settings - Fork 3
/
roster.js
126 lines (115 loc) · 3.81 KB
/
roster.js
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
/**
* Functions to handle roster management
*/
(function(document, window, undefined) {
'use strict';
window.Roster = function( description, slots ) {
var BENCH = "BN"
, BENCH_SLOTS = {"BN":true, "K":true, "DST":true}
, roster = []
, bench = []
, alreadyDrafted = []
, neededEachPosition = {}
, setupRoster = function( description, slots ) {
var rosterList = description.split(/,\s*/)
;
bench = [];
roster = [];
$.each(rosterList, function(i, pos) {
if (BENCH_SLOTS[pos]) {
bench.push(pos);
}
else {
roster.push(pos);
}
neededEachPosition[pos] = window.getTeamDemand(pos, rosterList);
});
if (bench.length + roster.length != slots) {
log("WARNING: possible problem finding roster");
}
log("Needed at each position: " + JSON.stringify(neededEachPosition));
}
/**
* Function to determine whether or not we need to draft another player
* at a position. Looks through the list of already drafted positions and
* compares against the required roster.
*
* Flex (RB/WR) and bench (BN) aware via a special array search function.
*/
, needPosition = function(pos) {
var ownedPositions = alreadyDrafted.slice(0)
, neededRoster = roster.slice(0)
, neededBench = bench.slice(0)
, ownedAtPosition = ownedPositions
.filter(function(p) { return p == pos; }).length
;
// Don't draft backups for bench slots (K, DST)
if (BENCH_SLOTS[pos] && ownedPositions.indexOf(pos) > -1) {
//log("No backup K/DST");
return false;
}
if (ownedAtPosition >= neededEachPosition[pos] * 2) {
//log("Already have enough backups at " + pos);
return false;
}
$.each(ownedPositions, function(i, pos) {
var rosterIndex = flexIndexOf(neededRoster, pos)
, benchIndex = flexIndexOf(neededBench, pos)
;
if (rosterIndex > -1) {
neededRoster[rosterIndex] = null;
}
else if (benchIndex > -1) {
neededBench[benchIndex] = null;
}
});
if (flexIndexOf(neededRoster, pos) > -1) {
//log("Still need " + pos + " on roster");
return true;
}
else if (alreadyDrafted.length >= neededRoster.length &&
flexIndexOf(neededBench, pos) > -1) {
//log("Need " + pos + " to fill out bench ");
return true;
}
//log("Don't need any of " + pos);
return false;
}
/**
* Fuzzy matching replacement for indexOf that knows about flex
* positions and bench positions
*/
, flexIndexOf = function(array, pos) {
var flexMatch = -1
, benchMatch = -1
, i
;
for (i = 0; i < array.length; i++) {
if (array[i] == null) {
// no-op
}
// Real match, return
else if (array[i] === pos) {
return i;
}
// Flex position match ie 'WR' matches WR/RB
else if (array[i].indexOf(pos) > -1) {
flexMatch = i;
}
// Lowest priority: bench slot
else if (array[i] === BENCH && flexMatch === -1) {
benchMatch = i;
}
}
return Math.max(flexMatch, benchMatch);
}
;
setupRoster(description, slots);
return {
resetDrafted: function() { alreadyDrafted = []; }
, draftedPosition: function(pos) { alreadyDrafted.push(pos); }
, needPosition: needPosition
, fullRoster: function() { return roster.concat(bench); }
};
};
})(document, window);