} else {
attribute_player_time(player, t, live_since);
}
+ if (player.on_field_since !== null) { // Just a safeguard; out without in should never happen.
+ player.field_time_ms += t - player.on_field_since;
+ }
player.on_field_since = null;
}
'interceptions': 0,
'points_played': 0,
'playing_time_ms': 0,
+ 'field_time_ms': 0,
// For efficiency.
'offensive_points_completed': 0,
let pull_started = null;
let last_pull_was_ours = null; // Effectively whether we're playing an O or D point (not affected by turnovers).
let point_num = 0;
+ let last_goal = null;
for (const [q,p] of Object.entries(players)) {
p.on_field_since = null;
p.last_point_seen = null;
}
if (type === 'goal' || type === 'their_goal') {
++point_num;
+ last_goal = t;
}
// Pull management
console.log("Unknown event:", e);
}
}
+
+ // Add field time for all players still left at match end.
+ for (const [q,p] of Object.entries(players)) {
+ if (p.on_field_since !== null && last_goal !== null) {
+ p.field_time_ms += last_goal - p.on_field_since;
+ }
+ }
}
let chosen_category = get_chosen_category();
rows = make_table_offense(players);
} else if (chosen_category === 'defense') {
rows = make_table_defense(players);
+ } else if (chosen_category === 'playing_time') {
+ rows = make_table_playing_time(players);
}
document.getElementById('stats').replaceChildren(...rows);
}
return 'offense';
} else if (window.location.hash === '#defense') {
return 'defense';
+ } else if (window.location.hash === '#playing_time') {
+ return 'playing_time';
} else {
return 'general';
}
elems.push(a);
}
+ elems.push(document.createTextNode(' | '));
+ if (chosen_category === 'playing_time') {
+ elems.push(document.createTextNode('Playing time'));
+ } else {
+ let a = document.createElement('a');
+ a.appendChild(document.createTextNode('Playing time'));
+ a.setAttribute('href', '#playing_time');
+ elems.push(a);
+ }
+
document.getElementById('mainmenu').replaceChildren(...elems);
}
add_cell(header, 'th', 'O efficiency');
add_cell(header, 'th', 'D efficiency');
add_cell(header, 'th', 'Points played');
- add_cell(header, 'th', 'Time played');
rows.push(header);
}
add_cell(row, 'td', p.offensive_points_completed > 0 ? o_efficiency.toFixed(2) : 'N/A');
add_cell(row, 'td', p.defensive_points_completed > 0 ? d_efficiency.toFixed(2) : 'N/A');
add_cell(row, 'td', p.points_played);
- add_cell(row, 'td', Math.floor(p.playing_time_ms / 60000) + ' min');
rows.push(row);
}
return rows;
}
return rows;
}
+
+function make_table_playing_time(players) {
+ let rows = [];
+ {
+ let header = document.createElement('tr');
+ add_cell(header, 'th', 'Player');
+ add_cell(header, 'th', 'Points played');
+ add_cell(header, 'th', 'Time played');
+ add_cell(header, 'th', 'Time on field');
+ add_cell(header, 'th', 'O points');
+ add_cell(header, 'th', 'D points');
+ rows.push(header);
+ }
+
+ for (const [q,p] of Object.entries(players)) {
+ let row = document.createElement('tr');
+ add_cell(row, 'td', p.name); // TODO: number?
+ add_cell(row, 'td', p.points_played);
+ add_cell(row, 'td', Math.floor(p.playing_time_ms / 60000) + ' min');
+ add_cell(row, 'td', Math.floor(p.field_time_ms / 60000) + ' min');
+ add_cell(row, 'td', p.offensive_points_completed);
+ add_cell(row, 'td', p.defensive_points_completed);
+ rows.push(row);
+ }
+ return rows;
+}