Extra Info In Play Text

Add extra info to the GLB play description text.

  1. // ==UserScript==
  2. // @name Extra Info In Play Text
  3. // @description Add extra info to the GLB play description text.
  4. // @namespace pbr/ei
  5. // @include http://goallineblitz.com/game/replay.pl?game_id=*&pbp_id=*
  6. // @include http://glb.warriorgeneral.com/game/replay.pl?game_id=*&pbp_id=*
  7. // @copyright 2009, pabst
  8. // @license (CC) Attribution Share Alike; http://creativecommons.org/licenses/by-sa/3.0/
  9. // @version 13.12.29
  10. // @require https://greasyfork.org/scripts/1371-libpbr2/code/libpbr2.js?version=3533
  11. // ==/UserScript==
  12.  
  13.  
  14. /*
  15. *
  16. * pabst did this 09/09/01+
  17. *
  18. *
  19. */
  20.  
  21. var scriptName = "Extra Info In Play Text";
  22. var scriptVersion = "13.12.29";
  23. var scriptWebpage = "http://userscripts.org/scripts/show/57984";
  24.  
  25. window.setTimeout(
  26. function() {
  27. init(false);
  28. }
  29. , 100);
  30.  
  31. function premodTest() {
  32. var play_data = unsafeWindow.play_data;
  33. var minx = play_data[0][0].x;
  34. var maxx = play_data[0][0].x;
  35. for (var i = 1; i < unsafeWindow.play_data[0].length; i++) {
  36. minx = Math.min(minx, play_data[0][i].x);
  37. maxx = Math.max(maxx, play_data[0][i].x);
  38. }
  39. console.log(minx+" --> "+maxx+" : "+((maxx - minx)>100));
  40. if ((maxx-minx) > 110) return true;
  41. return false;
  42. }
  43.  
  44. function activate(e) {
  45. console.log("activate "+scriptName);
  46. lock();
  47. if (unsafeWindow.play_data[0]) {
  48. defender_main();
  49. }
  50. else {
  51. console.log("early exit");
  52. }
  53. unlock();
  54. }
  55.  
  56. var longPass = 15 * 3;
  57. var mediumPass = 7.5 * 3;
  58. var shortPass = 0 * 3;
  59.  
  60. function defender_main() {
  61. var players = unsafeWindow.players;
  62. var play_data = unsafeWindow.play_data;
  63.  
  64. var playerids = new Array();
  65. for (var i = 1; i < unsafeWindow.play_data[0].length; i++) {
  66. var data = play_data[0][i];
  67. if (data.id != 'ball') {
  68. playerids.push (data.id);
  69. }
  70. }
  71.  
  72. var playText = document.getElementById("outcome_content").innerHTML;
  73. var receiver = getReceiverName(playText);
  74.  
  75. if (receiver != null) {
  76. var wrid = -1;
  77. for (var i = 0; i < playerids.length; i++) {
  78. var plyr = players[playerids[i]];
  79. if (plyr.name == receiver) {
  80. wrid = playerids[i];
  81. break;
  82. }
  83. }
  84. if (wrid == -1) return;
  85.  
  86. var min = 99999;
  87. var incY = 99999;
  88. var catchY = -1;
  89. var wridx = -1;
  90. for (var i=0; i<play_data[1].length; i++) {
  91. if (play_data[1][i].id == wrid) {
  92. wridx = i;
  93. break;
  94. }
  95. }
  96.  
  97. for (var j = 0; j < play_data.length; j++) {
  98. var balldata = play_data[j][0];
  99. var snapdata = play_data[j][wridx];
  100.  
  101. var ydepth = Math.abs(snapdata.y - balldata.y);
  102. var xdepth = Math.abs(snapdata.x - balldata.x);
  103. //???? xdepth = xdepth-3;
  104. var distance = Math.sqrt(ydepth*ydepth + xdepth*xdepth);
  105. if (distance < min) {
  106. incY = snapdata.y;
  107. min = distance;
  108. }
  109. if (distance == 0) {
  110. catchY = balldata.y
  111. break;
  112. }
  113. //console.log(min+" : "+balldata+" : "+snapdata+" : "+xdepth+" : "+ydepth);
  114. }
  115.  
  116. var depth = Math.abs((incY - play_data[0][0].y));
  117. //console.log(depth+" -- "+catchY);
  118. addDistance(depth);
  119. if (catchY != -1) {
  120. var endY = play_data[play_data.length-1][0].y;
  121. if (catchY == 0) {
  122. catchY = endY;
  123. }
  124. var yac = Math.round(((Math.abs(endY - catchY))/3)*2)/2;
  125. yac = yac;
  126. if (yac != 0) {
  127. addYAC(yac.toFixed(1));
  128. }
  129. }
  130.  
  131. try {
  132. var defPlayers = findDefender(players, play_data);
  133. if (defPlayers != null) {
  134. var max = findMax(defPlayers);
  135. var def = play_data[0][max];
  136. console.log(max+"-"+def.id+"-"+unsafeWindow.players[def.id].position+"-"+unsafeWindow.players[def.id].name);
  137. addDefender(players[def.id].position+"-"+players[def.id].name);
  138. }
  139. }
  140. catch (err) {
  141. console.log("yac defenders: "+err);
  142. }
  143. }
  144.  
  145. try {
  146. var blockers = findBlocker(players, play_data);
  147. if (blockers != null) {
  148. var max = findMax(blockers);
  149. //console.log(blockers);
  150. var def = play_data[0][max];
  151. console.log(max+"-"+def.id);
  152. if (def.id == "ball") {
  153. console.log("here");
  154. max = findMax(blockers.slice(1));
  155. }
  156. var def = play_data[0][max];
  157. console.log(max+"-"+def.id);
  158. console.log(unsafeWindow.players[def.id].position+"-"+unsafeWindow.players[def.id].name);
  159. addBlocker(players[def.id].position+"-"+players[def.id].name);
  160. }
  161. }
  162. catch (err) {
  163. console.log("yac blockers: "+err);
  164. }
  165. }
  166.  
  167. function findDefender(players, play_data) {
  168. var playerids = new Array();
  169. for (var i = 1; i < play_data[0].length; i++) {
  170. var data = play_data[0][i];
  171. if (data.id != 'ball') {
  172. playerids.push (data.id);
  173. }
  174. }
  175.  
  176. var playText = document.getElementById("outcome_content").innerHTML;
  177. var receiver = getReceiverName(playText);
  178.  
  179. var wrid = -1;
  180. for (var i = 0; i < playerids.length; i++) {
  181. var plyr = players[playerids[i]];
  182. if (plyr.name == receiver) {
  183. wrid = playerids[i];
  184. break;
  185. }
  186. }
  187. if (wrid == -1) return null;
  188.  
  189. var wridx = -1;
  190. for (var i=0; i<play_data[1].length; i++) {
  191. if (play_data[1][i].id == wrid) {
  192. wridx = i;
  193. break;
  194. }
  195. }
  196.  
  197. var defmin = 99999;
  198. var defPlayers = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
  199. var j;
  200. for (j = 0; j < play_data.length; j++) {
  201. var k=0;
  202. if (wridx <= 11) {
  203. k=1;
  204. }
  205. var fmin = 99999;
  206. var fidx = -1;
  207. for (var i=(k*11)+1; i<(k*11)+12; i++) {
  208. try {
  209. //console.log(wridx+" == "+i+" -- "+unsafeWindow.play_data[j][i]);
  210. var def = play_data[j][i];
  211. var defydepth = Math.abs(def.y - play_data[j][wridx].y);
  212. var defxdepth = Math.abs(def.x - play_data[j][wridx].x);
  213. var defdistance = Math.sqrt(defydepth*defydepth + defxdepth*defxdepth);
  214. if (defdistance < defmin) {
  215. defmin = defdistance;
  216. }
  217. if (defdistance < fmin) {
  218. fmin = defdistance;
  219. fidx = i;
  220. }
  221. defPlayers[i] = Math.max(0,defPlayers[i]-0.7);
  222. //console.log(unsafeWindow.players[def.id].name);
  223. if ((i != -1) && (defdistance < 18) && (j>5)) {
  224. defPlayers[i] += 1.35;
  225. }
  226. //console.log(unsafeWindow.play_data[j][i].id+" : "+defPlayers[i]);
  227. }
  228. catch(e) {
  229. }
  230. }
  231. if (fmin < 12) {
  232. defPlayers[fidx] += 0.35;
  233. }
  234. //console.log(j+" -- "+fmin+" : "+fidx+" -- "+defPlayers);
  235.  
  236. try {
  237. var balldata = play_data[j+5][0];
  238. var wrdata = play_data[j+5][wridx];
  239. //console.log(balldata.x+" - "+wrdata.x+" : "+balldata.y+" - "+wrdata.y);
  240. if ((Math.abs(balldata.x - wrdata.x) < 15) && (Math.abs(balldata.y - wrdata.y) < 15)) {
  241. break;
  242. }
  243. }
  244. catch (e) {
  245. break;
  246. }
  247. if ((j == 0) && ((j+10) < (play_data.length-5))) {
  248. j += 9;
  249. }
  250. }
  251.  
  252. //alert("defmin="+defmin);
  253. if (defmin > 11) {
  254. console.log("HiZ");
  255. defPlayers = null;
  256. }
  257. return defPlayers;
  258. }
  259.  
  260. function addDefender(d) {
  261. var playText = document.getElementById("outcome_content").innerHTML;
  262. var sn = playText.indexOf('pass to ')+8;
  263. var en = 0;
  264.  
  265. if (playText.indexOf(', hurried by')!=-1) {
  266. en = playText.indexOf(', hurried by');
  267. }
  268. else if (playText.indexOf(' up the')!=-1) {
  269. en = playText.indexOf(' up the');
  270. }
  271. else {
  272. en = playText.indexOf(' over the');
  273. }
  274.  
  275. if (sn != -1) {
  276. var str = playText.slice(0,en)+" ("+d+")" + playText.slice(en);
  277. document.getElementById("outcome_content").innerHTML = str;
  278. }
  279. }
  280.  
  281. function findBlocker(players,play_data) {
  282. var playerids = new Array();
  283. for (var i = 1; i < play_data[0].length; i++) {
  284. var data = play_data[0][i];
  285. if (data.id != 'ball') {
  286. playerids.push (data.id);
  287. }
  288. }
  289.  
  290. var qbid = 0;
  291. for (var i = 0; i < playerids.length; i++) {
  292. var plyr = players[playerids[i]];
  293. //console.log(i+") "+plyr.position);
  294. if (plyr.position == "QB") {
  295. qbid = playerids[i];
  296. break;
  297. }
  298. }
  299.  
  300. var qbidx = 0;
  301. for (var i=0; i<22; i++) {
  302. if (play_data[0][i].id == qbid) {
  303. qbidx = i;
  304. break;
  305. }
  306. }
  307.  
  308. var lastFrame = play_data.length;
  309. var last = 32767;
  310. for (var f=0; f<play_data.length; f++) {
  311. var balldata = play_data[f][0];
  312. var qbdata = play_data[f][qbidx];
  313. var ydepth = Math.abs(qbdata.y - balldata.y);
  314. var xdepth = Math.abs(qbdata.x - balldata.x);
  315. var distance = Math.sqrt(ydepth*ydepth + xdepth*xdepth);
  316. //console.log(f+") "+distance+" --- "+last);
  317. if (distance > last) {
  318. lastFrame = f;
  319. break;
  320. }
  321. last = distance;
  322. }
  323.  
  324. //console.log(qbid+" - "+qbidx+" : lf="+lastFrame);
  325. var playText = document.getElementById("outcome_content").innerHTML;
  326. var rusher;
  327. var idx = playText.indexOf(" sacked by ")+" sacked by ".length;
  328. if (idx != 10) {
  329. rusher = playText.slice(idx,idx+playText.slice(idx).indexOf(" ("));
  330. }
  331. else {
  332. var idx = playText.indexOf(" hurried by ")+" hurried by ".length;
  333. rusher = playText.slice(idx,idx+playText.slice(idx).indexOf(", "));
  334. }
  335.  
  336. var rusheridx = -1;
  337. var rusherid = -1;
  338. for (var i=0; i<play_data[0].length; i++) {
  339. var id = play_data[0][i].id;
  340. if (players[id] != null) {
  341. if (players[id].name == rusher) {
  342. rusherid = id;
  343. rusheridx = i;
  344. break;
  345. }
  346. }
  347. }
  348. //console.log("rusher="+rusherid+" : "+rusheridx+" : "+players[rusherid].name);
  349. if (rusherid == -1) return null;
  350.  
  351. var offmin = 99999;
  352. var offPlayers = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
  353. var offidx = -1;
  354. var j;
  355. for (j = 0; j < lastFrame; j++) {
  356. var k=0;
  357. if (rusherid <= 11) {
  358. k=1;
  359. }
  360. var offmin = 99999;
  361. var offidx = -1;
  362. //console.log(rusher+" - "+unsafeWindow.play_data[j][rusheridx].x+","+unsafeWindow.play_data[j][rusheridx].y);
  363. for (var i=(k*11)+1; i<(k*11)+12; i++) {
  364. var off = play_data[j][i];
  365. var offydist = Math.abs(off.y - play_data[j][rusheridx].y);
  366. var offxdist = Math.abs(off.x - play_data[j][rusheridx].x);
  367. var offdistance = Math.sqrt(offydist*offydist + offxdist*offxdist);
  368. if (offdistance < offmin) {
  369. offmin = offdistance;
  370. offidx = i;
  371. }
  372. //console.log(rusherid+"/"+rusheridx+" == "+i+" -- "+unsafeWindow.play_data[j][i].id+" = "+offdistance);
  373. offPlayers[i] = Math.max(0,offPlayers[i]-0.1);
  374. if (offdistance < 9) {
  375. //console.log(unsafeWindow.players[off.id].name+" -- "+offdistance+" :: "+off.x+","+off.y);
  376. offPlayers[i] += 1;
  377. }
  378. //console.log(offPlayers);
  379. }
  380. if (offmin < 6) {
  381. offPlayers[offidx] += 0.35;
  382. }
  383. if (j == 2) j += 7;
  384. }
  385. //console.log(offidx+"-"+offidx+"-"+offmin+"="+offPlayers);
  386. if (offmin > 15) {
  387. offidx = -1;
  388. offPlayers = null;
  389. }
  390. return offPlayers;
  391. }
  392.  
  393. function findMax(arr) {
  394. if (arr == null) return -1;
  395. if (arr.length < 1) return -1;
  396.  
  397. var idx = 0;
  398. var max = arr[idx];
  399. for (var i=1; i<arr.length; i++) {
  400. if (arr[i] > max) {
  401. idx = i;
  402. max = arr[i];
  403. }
  404. }
  405. return idx;
  406. }
  407.  
  408. function getReceiverName(playText) {
  409. var sn = playText.indexOf('pass to ')+8;
  410. var en = 0;
  411.  
  412. if (playText.indexOf(', hurried by')!=-1) {
  413. en = playText.indexOf(', hurried by');
  414. }
  415. else if (playText.indexOf(' up the')!=-1) {
  416. en = playText.indexOf(' up the');
  417. }
  418. else if (playText.indexOf(' over the')!= -1) {
  419. en = playText.indexOf(' over the');
  420. }
  421. else {
  422. return null;
  423. }
  424.  
  425. var name = playText.slice(sn,en);
  426. return name;
  427. }
  428.  
  429. function addYAC(yacnum) {
  430. var playText = document.getElementById("outcome_content").innerHTML;
  431. if (playText.indexOf('pass to') != -1){
  432. var str = playText;
  433. var idx = str.indexOf(" yd gain)")+" yd gain".length;
  434. if (idx < 8) {
  435. idx = str.indexOf(" yd loss)")+" yd loss".length;
  436. }
  437. if (idx < 8) return;
  438.  
  439. var mod = yacnum;
  440. if (premodTest() == true) mod = mod/3;
  441. mod = parseFloat(mod).toFixed(0);
  442. document.getElementById("outcome_content").innerHTML=str.slice(0,idx)+", "+mod+" YAC"+str.slice(idx);
  443. }
  444. }
  445.  
  446. function addDistance(d) {
  447. var playText = document.getElementById("outcome_content").innerHTML;
  448. if (playText.indexOf(' pass to ') != -1){
  449. var s = " short";
  450. if (d >= mediumPass) s = " medium";
  451. if (d >= longPass) s = " long";
  452.  
  453. var idx = playText.indexOf(" pass to ");
  454. playText = playText.slice(0,idx)+s+playText.slice(idx);
  455. document.getElementById("outcome_content").innerHTML = playText;
  456. //console.log(d);
  457. }
  458. }
  459.  
  460. function addBlocker(d) {
  461. var playText = document.getElementById("outcome_content").innerHTML;
  462. var idx = playText.indexOf(" sacked by ")+11;
  463. var idx2 = -1;
  464. if (idx != 10) {
  465. idx2 = playText.slice(idx).indexOf(" (");
  466. }
  467. else {
  468. idx = playText.indexOf(" hurried by ")+12;
  469. idx2 = playText.slice(idx).indexOf(", ");
  470. }
  471. if (idx > 11) {
  472. playText = playText.slice(0,idx+idx2)+" ("+d+")"+playText.slice(idx+idx2);
  473. document.getElementById("outcome_content").innerHTML = playText;
  474. }
  475. }