1 // Colors assigned to the various weapons
6 "grenadelauncher": "#ff2600",
7 "minelayer": "#bfbf00",
12 "rocketlauncher": "#ffbf33",
14 "minstanex": "#d62728",
23 // Flatten the existing weaponstats JSON requests
25 var flatten = function(weaponData) {
28 // each game is a key entry...
29 weaponData.games.forEach(function(e,i) { flattened[e] = {}; });
31 // ... with indexes by weapon_cd
32 weaponData.weapon_stats.forEach(function(e,i) { flattened[e.game_id][e.weapon_cd] = e; });
37 // Calculate the Y value for a given weapon stat
38 function accuracyValue(gameWeaponStats, weapon) {
39 if (gameWeaponStats[weapon] == undefined) {
42 var ws = gameWeaponStats[weapon];
43 var pct = ws.fired > 0 ? Math.round((ws.hit / ws.fired) * 100) : 0;
48 // Calculate the tooltip text for a given weapon stat
49 function accuracyTooltip(weapon, pct, averages) {
54 var tt = weapon + ": " + pct.toString() + "%";
55 if (averages[weapon] != undefined) {
56 return tt + " (" + averages[weapon].toString() + "% average)";
62 // Draw the accuracy chart in the "accuracyChart" div id
63 function drawAccuracyChart(weaponData) {
65 var data = new google.visualization.DataTable();
66 data.addColumn('string', 'X');
67 data.addColumn('number', 'Shotgun');
68 data.addColumn({type: 'string', role: 'tooltip'});
69 data.addColumn('number', 'Uzi');
70 data.addColumn({type: 'string', role: 'tooltip'});
71 data.addColumn('number', 'Nex');
72 data.addColumn({type: 'string', role: 'tooltip'});
73 data.addColumn('number', 'Minstanex');
74 data.addColumn({type: 'string', role: 'tooltip'});
75 data.addColumn('number', 'Rifle');
76 data.addColumn({type: 'string', role: 'tooltip'});
78 var flattened = flatten(weaponData);
80 for(i in weaponData.games) {
81 var game_id = weaponData.games[i];
82 var sg = accuracyValue(flattened[game_id], "shotgun");
83 var sgTT = accuracyTooltip("shotgun", sg, weaponData.averages);
84 var uzi = accuracyValue(flattened[game_id], "uzi");
85 var uziTT = accuracyTooltip("uzi", uzi, weaponData.averages);
86 var nex = accuracyValue(flattened[game_id], "nex");
87 var nexTT = accuracyTooltip("nex", nex, weaponData.averages);
88 var mn = accuracyValue(flattened[game_id], "minstanex");
89 var mnTT = accuracyTooltip("minstanex", mn, weaponData.averages);
90 var rifle = accuracyValue(flattened[game_id], "rifle");
91 var rifleTT = accuracyTooltip("rifle", rifle, weaponData.averages);
93 data.addRow([game_id.toString(), sg, sgTT, uzi, uziTT, nex,
94 nexTT, mn, mnTT, rifle, rifleTT]);
98 backgroundColor: { fill: 'transparent' },
101 textStyle: { color: "#666" }
105 textPosition: 'none',
106 titleTextStyle: { color: '#666' }
110 titleTextStyle: { color: '#666' },
113 baselineColor: '#333',
114 gridlineColor: '#333',
115 ticks: [20, 40, 60, 80, 100]
118 0: { color: weaponColors["shotgun"] },
119 1: { color: weaponColors["uzi"] },
120 2: { color: weaponColors["nex"] },
121 3: { color: weaponColors["minstanex"] },
122 4: { color: weaponColors["rifle"] }
126 var chart = new google.visualization.LineChart(document.getElementById('accuracyChart'));
128 // a click on a point sends you to that games' page
129 var accuracySelectHandler = function(e) {
130 var selection = chart.getSelection()[0];
131 if (selection != null && selection.row != null) {
132 var game_id = data.getFormattedValue(selection.row, 0);
133 window.location.href = "http://stats.xonotic.org/game/" + game_id.toString();
136 google.visualization.events.addListener(chart, 'select', accuracySelectHandler);
138 chart.draw(data, options);
141 // Calculate the damage Y value for a given weapon stat
142 function damageValue(gameWeaponStats, weapon) {
143 if (gameWeaponStats[weapon] == undefined) {
146 return gameWeaponStats[weapon].actual;
149 // Calculate the damage tooltip text for a given weapon stat
150 function damageTooltip(weapon, dmg) {
154 return weapon + ": " + dmg.toString() + " HP damage";
157 // Draw the damage chart into the "damageChart" div id
158 function drawDamageChart(weaponData) {
160 var data = new google.visualization.DataTable();
161 data.addColumn('string', 'X');
162 data.addColumn('number', 'Shotgun');
163 data.addColumn({type: 'string', role: 'tooltip'});
164 data.addColumn('number', 'Uzi');
165 data.addColumn({type: 'string', role: 'tooltip'});
166 data.addColumn('number', 'Nex');
167 data.addColumn({type: 'string', role: 'tooltip'});
168 data.addColumn('number', 'Rifle');
169 data.addColumn({type: 'string', role: 'tooltip'});
170 data.addColumn('number', 'Mortar');
171 data.addColumn({type: 'string', role: 'tooltip'});
172 data.addColumn('number', 'Electro');
173 data.addColumn({type: 'string', role: 'tooltip'});
174 data.addColumn('number', 'Crylink');
175 data.addColumn({type: 'string', role: 'tooltip'});
176 data.addColumn('number', 'Hagar');
177 data.addColumn({type: 'string', role: 'tooltip'});
178 data.addColumn('number', 'Rocket Launcher');
179 data.addColumn({type: 'string', role: 'tooltip'});
181 var flattened = flatten(weaponData);
183 for(i in weaponData.games) {
184 var game_id = weaponData.games[i];
185 var sg = damageValue(flattened[game_id], "shotgun");
186 var sgTT = damageTooltip("shotgun", sg);
187 var uzi = damageValue(flattened[game_id], "uzi");
188 var uziTT = damageTooltip("uzi", uzi);
189 var nex = damageValue(flattened[game_id], "nex");
190 var nexTT = damageTooltip("nex", nex);
191 var mn = damageValue(flattened[game_id], "minstanex");
192 var mnTT = damageTooltip("minstanex", mn);
193 var rifle = damageValue(flattened[game_id], "rifle");
194 var rifleTT = damageTooltip("rifle", rifle);
195 var mortar = damageValue(flattened[game_id], "grenadelauncher");
196 var mortarTT = damageTooltip("grenadelauncher", mortar);
197 var electro = damageValue(flattened[game_id], "electro");
198 var electroTT = damageTooltip("electro", electro);
199 var crylink = damageValue(flattened[game_id], "crylink");
200 var crylinkTT = damageTooltip("crylink", crylink);
201 var hagar = damageValue(flattened[game_id], "hagar");
202 var hagarTT = damageTooltip("hagar", hagar);
203 var rl = damageValue(flattened[game_id], "rocketlauncher");
204 var rlTT = damageTooltip("rocketlauncher", rl);
221 backgroundColor: { fill: 'transparent' },
225 textStyle: { color: "#666" }
229 titleTextStyle: {color: '#666'},
230 baselineColor: '#333',
231 gridlineColor: '#333',
235 textPosition: 'none',
236 titleTextStyle: { color: '#666' },
240 0: { color: weaponColors["shotgun"] },
241 1: { color: weaponColors["uzi"] },
242 2: { color: weaponColors["nex"] },
243 3: { color: weaponColors["rifle"] },
244 4: { color: weaponColors["grenadelauncher"] },
245 5: { color: weaponColors["electro"] },
246 6: { color: weaponColors["crylink"] },
247 7: { color: weaponColors["hagar"] },
248 8: { color: weaponColors["rocketlauncher"] }
252 var chart = new google.visualization.ColumnChart(document.getElementById('damageChart'));
254 // a click on a point sends you to that game's page
255 var damageSelectHandler = function(e) {
256 var selection = chart.getSelection()[0];
257 if (selection != null && selection.row != null) {
258 var game_id = data.getFormattedValue(selection.row, 0);
259 window.location.href = "http://stats.xonotic.org/game/" + game_id.toString();
262 google.visualization.events.addListener(chart, 'select', damageSelectHandler);
264 chart.draw(data, options);