Obsolete - GLB YAC

By pabst Last update Sep 26, 2008 — Installed 19,668 times. Daily Installs: 9, 0, 2, 0, 1, 1, 0, 3, 0, 3, 0, 1, 0, 2, 0, 2, 0, 2, 0, 0, 1, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0

There are 9 previous versions of this script.

// ==UserScript==
// @name           GLB YAC
// @namespace      pbr
// @description    Adds a YAC (yards after catch) stat to replays
// @version        08.09.26
// ==/UserScript==

/*
 *
 * original yac code by randombeast from www.goallineblitz.com
 * pabst modified it 8/18/08+
 *
 */

var longPass = 15;
var mediumPass = 7.5;
var shortPass = 0;

function yac_main(players, play_data) {
	var playerids = new Array();
	for (var i = 1; i < play_data[0].length; i++) {
		var data = play_data[0][i];
		if (data.id != 'ball') {
			playerids.push (data.id);
		}
	}
	
	var playText = document.getElementsByClassName("small_head play");//[1].innerHTML;
    playText = playText[1].innerHTML;
	var receiver = getReceiverName(playText);
	
    if (receiver != null) {
	    var wrid = -1;
	    for (var i = 0; i < playerids.length; i++) {
		    var plyr = players[playerids[i]];
		    if (plyr.name == receiver) {
			    wrid = playerids[i];
			    break;
		    }
	    }
	    if (wrid == -1) return;

	    var min = 99999;
	    var incY = 99999;
	    var catchY = -1;
	    var wridx = -1;
	    for (var i=0; i<unsafeWindow.play_data[1].length; i++) {
		    if (unsafeWindow.play_data[1][i].id == wrid) {
			    wridx = i;
			    break;
		    }
	    }
	
	    for (var j = 0; j < play_data.length; j++) {
		    var balldata = unsafeWindow.play_data[j][0];
		    var snapdata = unsafeWindow.play_data[j][wridx];
		
		    var ydepth = Math.abs(snapdata.y - balldata.y);
		    var xdepth = Math.abs(snapdata.x - balldata.x);
		    var distance = Math.sqrt(ydepth*ydepth + xdepth*xdepth);
		    if (distance < min) {
			    var defmin = 99999;
			    incY = snapdata.y;
			    min = distance;
		    }
		    if (distance == 0) {
			    catchY = balldata.y
			    break;
		    }
	    }

	    var depth = Math.abs((incY - play_data[0][0].y)/3);
	    addDistance(depth);
	    if (catchY != -1) {
		    var endY = play_data[play_data.length-1][0].y;	
		    if (catchY == 0) {
			    catchY = endY;
		    }	
		    var yac = Math.round(((Math.abs(endY - catchY))/3)*2)/2
	
		    if (yac != 0) {
			    addYAC(yac.toFixed(1));
		    }
	    }
    }
	
	try {
		var blockers = findBlocker(unsafeWindow.players, unsafeWindow.play_data);
		if (blockers != null) {
			var max = findMax(blockers);
			var def = unsafeWindow.play_data[0][max];
			//console.log(max+"-"+def.id+"-"+unsafeWindow.players[def.id].position+"-"+unsafeWindow.players[def.id].name);
			addBlocker(unsafeWindow.players[def.id].position+"-"+unsafeWindow.players[def.id].name);
		}
	}
	catch (err) {
		console.log("yac blockers: "+err);
	}

	try {
		var defPlayers = findDefender(unsafeWindow.players, unsafeWindow.play_data);
		if (defPlayers != null) {
			var max = findMax(defPlayers);
			var def = unsafeWindow.play_data[0][max];
			//console.log(max+"-"+def.id+"-"+unsafeWindow.players[def.id].position+"-"+unsafeWindow.players[def.id].name);
			addDefender(unsafeWindow.players[def.id].position+"-"+unsafeWindow.players[def.id].name);
		}
	}
	catch (err) {
		console.log("yac defenders: "+err);
	}
}

function findDefender(players, play_data) {
	var playerids = new Array();
	for (var i = 1; i < play_data[0].length; i++) {
		var data = play_data[0][i];
		if (data.id != 'ball') {
			playerids.push (data.id);
		}
	}
	
	var playText = document.getElementsByClassName("small_head play")[1].innerHTML;
	var receiver = getReceiverName(playText);
	
	var wrid = -1;
	for (var i = 0; i < playerids.length; i++) {
		var plyr = players[playerids[i]];
		if (plyr.name == receiver) {
			wrid = playerids[i];
			break;
		}
	}
	if (wrid == -1) return;

	var catchY = -1;
	var wridx = -1;
	for (var i=0; i<unsafeWindow.play_data[1].length; i++) {
		if (unsafeWindow.play_data[1][i].id == wrid) {
			wridx = i;
			break;
		}
	}

	var defmin = 99999;
	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];
	var defidx = -1;
	var j;
	for (j = 0; j < play_data.length; j++) {
		var add = -1;
		var k=0;
		if (wridx <= 11) {
			k=1;
		}
		var fmin = 99999;
		var fidx = -1;
		for (var i=(k*11)+1; i<(k*11)+12; i++) {
			//console.log(wridx+" == "+i+" -- "+unsafeWindow.play_data[j][i]);
			var def = unsafeWindow.play_data[j][i];
			var defydepth = Math.abs(def.y - unsafeWindow.play_data[j][wridx].y);
			var defxdepth = Math.abs(def.x - unsafeWindow.play_data[j][wridx].x);
			var defdistance = Math.sqrt(defydepth*defydepth + defxdepth*defxdepth);
			if (defdistance < defmin) {
				defmin = defdistance;
			}
			if (defdistance < fmin) {
				fmin = defdistance;
				fidx = i;
			}
			defPlayers[i] = Math.max(0,defPlayers[i]-0.7);
			//console.log(unsafeWindow.players[def.id].name);
			if ((i != -1) && (defdistance < 18) && (j>5)) {
				defPlayers[i] += 1.35;
			}
		}
		if (fmin < 12) {
			defPlayers[fidx] += 0.35;
		}
		
		var balldata = unsafeWindow.play_data[j][0];
		var wrdata = unsafeWindow.play_data[j][wridx];
		if ((balldata.x == wrdata.x) && (balldata.y == wrdata.y)) {
			break;
		}
	}
	//console.log(fidx+"-"+defidx+"-"+defmin+"="+defPlayers);
	if (defmin > 15) {
		//console.log("HiZ");
		defidx = -1;
		defPlayers = null;
	}
	return defPlayers;
}

function findBlocker(players,play_data) {
	var playText = document.getElementsByClassName("small_head play")[1].innerHTML;
	var rusher;
	var idx = playText.indexOf(" sacked by ")+" sacked by ".length;
	if (idx != 10) {
		rusher = playText.slice(idx,idx+playText.slice(idx).indexOf(" ("));
	}
	else {
		var idx = playText.indexOf(" hurried by ")+" hurried by ".length;
		rusher = playText.slice(idx,idx+playText.slice(idx).indexOf(", "));
	}
	
	var rusheridx = -1;
	var rusherid = -1;
	for (var i=0; i<play_data[0].length; i++) {
		var id = play_data[0][i].id;
		if (players[id] != null) {
			if (players[id].name == rusher) {
				rusherid = id;
				rusheridx = i;
				break;
			}
		}
	}
	if (rusherid == -1) return;
	
	var offmin = 99999;
	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];
	var offidx = -1;
	var j;
	for (j = 0; j < play_data.length; j++) {
		var add = -1;
		var k=0;
		if (rusherid <= 11) {
			k=1;
		}
		var offmin = 99999;
		var offidx = -1;
		//console.log(rusher+" - "+unsafeWindow.play_data[j][rusheridx].x+","+unsafeWindow.play_data[j][rusheridx].y);
		for (var i=(k*11)+1; i<(k*11)+12; i++) {
			//console.log(rusherid+"/"+rusheridx+" == "+i+" -- "+unsafeWindow.play_data[j][i].id);
			var off = unsafeWindow.play_data[j][i];
			var offydist = Math.abs(off.y - unsafeWindow.play_data[j][rusheridx].y);
			var offxdist = Math.abs(off.x - unsafeWindow.play_data[j][rusheridx].x);
			var offdistance = Math.sqrt(offydist*offydist + offxdist*offxdist);
			if (offdistance < offmin) {
				offmin = offdistance;
				offidx = i;
			}
			offPlayers[i] = Math.max(0,offPlayers[i]-0.1);
			if (offdistance < 6) {
				//console.log(unsafeWindow.players[off.id].name+" -- "+offdistance+" :: "+off.x+","+off.y);
				offPlayers[i] += 1;
			}
		}
		if (offmin < 3) {
			offPlayers[offidx] += 0.35;
		}
	}
	//console.log(offidx+"-"+offidx+"-"+offmin+"="+offPlayers);
	if (offmin > 15) {
		offidx = -1;
		offPlayers = null;
	}
	return offPlayers;
}

function findMax(arr) {
	if (arr == null) return -1;
	if (arr.length < 1) return -1;
	
	var idx = 0;
	var max = arr[idx];
	for (var i=1; i<arr.length; i++) {
		if (arr[i] > max) {
			idx = i;
			max = arr[i];
		}
	}
	return idx;
}

function getReceiverName(playText) {
	var sn = playText.indexOf('pass to ')+8;
	var en = 0;	

	if (playText.indexOf(', hurried by')!=-1) {
		en = playText.indexOf(', hurried by');
	} 
	else if (playText.indexOf(' up the')!=-1) {
		en = playText.indexOf(' up the');
	} 
	else if (playText.indexOf(' over the')!= -1) {
		en = playText.indexOf(' over the');
	}
    else {
        return null;
    }

	var name = playText.slice(sn,en);
	return name;
}

function addDefender(d) {
	var plays = document.getElementsByClassName('small_head play');
	var playText = plays[1].innerHTML;
	var sn = playText.indexOf('pass to ')+8;
	var en = 0;	

	if (playText.indexOf(', hurried by')!=-1) {
		en = playText.indexOf(', hurried by');
	} 
	else if (playText.indexOf(' up the')!=-1) {
		en = playText.indexOf(' up the');
	} 
	else {
		en = playText.indexOf(' over the');
	}
	
	plays[1].innerHTML = playText.slice(0,en)+" ("+d+") "+playText.slice(en);	
}

function addYAC(yacnum) {
	var plays = document.getElementsByClassName('small_head play');
	for (var i=0; i < plays.length; i++) {
		if (plays[i].innerHTML.indexOf('pass to')!=-1){
			var str = plays[i].innerHTML;
			var idx = str.indexOf(" yd gain)")+" yd gain".length;
			if (idx < 8) {
				idx = str.indexOf(" yd loss)")+" yd loss".length;
			}
			if (idx < 8) return;
			plays[i].innerHTML = str.slice(0,idx)+", "+yacnum+" YAC"+str.slice(idx);	
		}
	}
}

function addDistance(d) {
	/*
	var plays = document.getElementsByClassName('small_head play');
	for (var i=0; i < plays.length; i++) {
		if (plays[i].innerHTML.indexOf(' pass to ')!=-1){			
			var s = " short";
			if (d >= mediumPass) s = " medium";
			if (d >= longPass) s = " long";
			
			var str = plays[i].innerHTML;
			var idx = str.indexOf(" pass to ");
			plays[i].innerHTML = str.slice(0,idx)+s+str.slice(idx);
			break;
		}
	}
	*/
	var playText = document.getElementsByClassName("small_head play")[1].innerHTML;
	if (playText.indexOf(' pass to ') != -1){			
		var s = " short";
		if (d >= mediumPass) s = " medium";
		if (d >= longPass) s = " long";
		
		var idx = playText.indexOf(" pass to ");
		playText = playText.slice(0,idx)+s+playText.slice(idx);
		document.getElementsByClassName("small_head play")[1].innerHTML = playText;
	}
}

function addBlocker(d) {
	var playText = document.getElementsByClassName("small_head play")[1].innerHTML;
	var idx = playText.indexOf(" sacked by ")+11;
	var idx2 = -1;
	if (idx != 10) {
		idx2 = playText.slice(idx).indexOf(" (");
	}
	else {
		var idx = playText.indexOf(" hurried by ")+12;
		idx2 = playText.slice(idx).indexOf(", ");
	}
	playText = playText.slice(0,idx+idx2)+" ("+d+")"+playText.slice(idx+idx2);
	document.getElementsByClassName("small_head play")[1].innerHTML = playText;
}