Extra Info In Play Text

Add extra info to the GLB play description text.

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name           Extra Info In Play Text
// @description    Add extra info to the GLB play description text.
// @namespace      pbr/ei
// @include        http://goallineblitz.com/game/replay.pl?game_id=*&pbp_id=*
// @include        http://glb.warriorgeneral.com/game/replay.pl?game_id=*&pbp_id=*
// @copyright      2009, pabst
// @license        (CC) Attribution Share Alike; http://creativecommons.org/licenses/by-sa/3.0/
// @version        13.12.29
// @require https://greasyfork.org/scripts/1371-libpbr2/code/libpbr2.js?version=3533
// ==/UserScript==


/* 
 * 
 * pabst did this 09/09/01+
 *
 * 
 */

var scriptName = "Extra Info In Play Text";
var scriptVersion = "13.12.29";
var scriptWebpage = "http://userscripts.org/scripts/show/57984";

window.setTimeout(
    function() {
        init(false);
    }
    , 100);

function premodTest() {
    var play_data = unsafeWindow.play_data;
	var minx = play_data[0][0].x;
	var maxx = play_data[0][0].x;
    for (var i = 1; i < unsafeWindow.play_data[0].length; i++) {
		minx = Math.min(minx, play_data[0][i].x);
		maxx = Math.max(maxx, play_data[0][i].x);
	}
	console.log(minx+" --> "+maxx+" : "+((maxx - minx)>100));
	if ((maxx-minx) > 110) return true;
	return false;
}

function activate(e) {
    console.log("activate "+scriptName);
    lock();
	
    if (unsafeWindow.play_data[0]) {
		defender_main();
    }
    else {
		console.log("early exit");
    }
    unlock();
}

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

function defender_main() {
    var players = unsafeWindow.players;
    var play_data = unsafeWindow.play_data;

    var playerids = new Array();
    for (var i = 1; i < unsafeWindow.play_data[0].length; i++) {
        var data = play_data[0][i];
        if (data.id != 'ball') {
            playerids.push (data.id);
        }
    }

    var playText = document.getElementById("outcome_content").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<play_data[1].length; i++) {
            if (play_data[1][i].id == wrid) {
                wridx = i;
                break;
            }
        }

        for (var j = 0; j < play_data.length; j++) {
            var balldata = play_data[j][0];
            var snapdata = play_data[j][wridx];

            var ydepth = Math.abs(snapdata.y - balldata.y);
            var xdepth = Math.abs(snapdata.x - balldata.x);
//????            xdepth = xdepth-3;
            var distance = Math.sqrt(ydepth*ydepth + xdepth*xdepth);
            if (distance < min) {
                incY = snapdata.y;
                min = distance;
            }
            if (distance == 0) {
                catchY = balldata.y
                break;
            }
        //console.log(min+" : "+balldata+" : "+snapdata+" : "+xdepth+" : "+ydepth);
        }

        var depth = Math.abs((incY - play_data[0][0].y));
        //console.log(depth+" -- "+catchY);
        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;
            yac = yac;
            if (yac != 0) {
                addYAC(yac.toFixed(1));
            }
        }

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

    
    try {
        var blockers = findBlocker(players, play_data);
        if (blockers != null) {
            var max = findMax(blockers);
//console.log(blockers);
            var def = play_data[0][max];
            console.log(max+"-"+def.id);
			if (def.id == "ball") {
				console.log("here");
				max = findMax(blockers.slice(1));
			}
            var def = play_data[0][max];
            console.log(max+"-"+def.id);
		    console.log(unsafeWindow.players[def.id].position+"-"+unsafeWindow.players[def.id].name);
            addBlocker(players[def.id].position+"-"+players[def.id].name);
        }
    }
    catch (err) {
        console.log("yac blockers: "+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.getElementById("outcome_content").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 null;

    var wridx = -1;
    for (var i=0; i<play_data[1].length; i++) {
        if (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 j;
    for (j = 0; j < play_data.length; j++) {
        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++) {
            try {
                //console.log(wridx+" == "+i+" -- "+unsafeWindow.play_data[j][i]);
                var def = play_data[j][i];
                var defydepth = Math.abs(def.y - play_data[j][wridx].y);
                var defxdepth = Math.abs(def.x - 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;
                }
            //console.log(unsafeWindow.play_data[j][i].id+" : "+defPlayers[i]);
            } 
			catch(e) {
			}
        }
        if (fmin < 12) {
            defPlayers[fidx] += 0.35;
        }
	//console.log(j+" -- "+fmin+" : "+fidx+" -- "+defPlayers);

		try {
	  	    var balldata = play_data[j+5][0];
			var wrdata = play_data[j+5][wridx];
			//console.log(balldata.x+" - "+wrdata.x+" : "+balldata.y+" - "+wrdata.y);
			if ((Math.abs(balldata.x - wrdata.x) < 15) && (Math.abs(balldata.y - wrdata.y) < 15)) {
			    break;
			}
		}
		catch (e) {
			break;
		}
		if ((j == 0) && ((j+10) < (play_data.length-5))) {
		    j += 9;
		}
    }

    //alert("defmin="+defmin);
    if (defmin > 11) {
        console.log("HiZ");
        defPlayers = null;
    }
    return defPlayers;
}

function addDefender(d) {
    var playText = document.getElementById("outcome_content").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');
    }

    if (sn != -1) {
        var str = playText.slice(0,en)+" ("+d+")" + playText.slice(en);
        document.getElementById("outcome_content").innerHTML = str;
    }
}

function findBlocker(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 qbid = 0;
    for (var i = 0; i < playerids.length; i++) {
        var plyr = players[playerids[i]];
        //console.log(i+") "+plyr.position);
        if (plyr.position == "QB") {
            qbid = playerids[i];
            break;
        }
    }

    var qbidx = 0;
    for (var i=0; i<22; i++) {
        if (play_data[0][i].id == qbid) {
            qbidx = i;
            break;
        }
    }

    var lastFrame = play_data.length;
    var last = 32767;
    for (var f=0; f<play_data.length; f++) {
        var balldata = play_data[f][0];
        var qbdata = play_data[f][qbidx];
        var ydepth = Math.abs(qbdata.y - balldata.y);
        var xdepth = Math.abs(qbdata.x - balldata.x);
        var distance = Math.sqrt(ydepth*ydepth + xdepth*xdepth);
        //console.log(f+") "+distance+" --- "+last);
        if (distance > last) {
            lastFrame = f;
            break;
        }
        last = distance;
    }

    //console.log(qbid+" - "+qbidx+" : lf="+lastFrame);
    
    var playText = document.getElementById("outcome_content").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;
            }
        }
    }
    //console.log("rusher="+rusherid+" : "+rusheridx+" : "+players[rusherid].name);
    if (rusherid == -1) return null;

    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 < lastFrame; j++) {
        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++) {
            var off = play_data[j][i];
            var offydist = Math.abs(off.y - play_data[j][rusheridx].y);
            var offxdist = Math.abs(off.x - play_data[j][rusheridx].x);
            var offdistance = Math.sqrt(offydist*offydist + offxdist*offxdist);
            if (offdistance < offmin) {
                offmin = offdistance;
                offidx = i;
            }
            //console.log(rusherid+"/"+rusheridx+" == "+i+" -- "+unsafeWindow.play_data[j][i].id+" = "+offdistance);
            offPlayers[i] = Math.max(0,offPlayers[i]-0.1);
            if (offdistance < 9) {
                //console.log(unsafeWindow.players[off.id].name+" -- "+offdistance+" :: "+off.x+","+off.y);
                offPlayers[i] += 1;
            }
	//console.log(offPlayers);
        }
        if (offmin < 6) {
            offPlayers[offidx] += 0.35;
        }
	if (j == 2) j += 7;
    }
    //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 addYAC(yacnum) {
    var playText = document.getElementById("outcome_content").innerHTML;
    if (playText.indexOf('pass to') != -1){
        var str = playText;
        var idx = str.indexOf(" yd gain)")+" yd gain".length;
        if (idx < 8) {
            idx = str.indexOf(" yd loss)")+" yd loss".length;
        }
        if (idx < 8) return;

		var mod = yacnum;
		if (premodTest() == true) mod = mod/3;
		mod = parseFloat(mod).toFixed(0);
        document.getElementById("outcome_content").innerHTML=str.slice(0,idx)+", "+mod+" YAC"+str.slice(idx);
    }
}

function addDistance(d) {
    var playText = document.getElementById("outcome_content").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.getElementById("outcome_content").innerHTML = playText;
//console.log(d);
    }
}

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