- // ==UserScript==
- // @name Replay Rewrite - AI Testing On Replay
- // @namespace pbr/aitor
- // @description Offensive & Defensive AI Buttons On GLB Replay
- // @include http://*goallineblitz.com/game/home.pl
- // @include http://*goallineblitz.com/game/replay.pl?game_id=*&pbp_id=*
- // @include http://glb.warriorgeneral.com/game/home.pl
- // @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 14.01.02
- // @require https://greasyfork.org/scripts/1371-libpbr2/code/libpbr2.js?version=3533
- // @require https://greasyfork.org/scripts/1348-pbr-game-scout/code/pbr%20Game%20Scout.js?version=3544
- // @require https://greasyfork.org/scripts/1373-pbr-game-scout-statslib/code/pbr%20Game%20Scout%20statslib.js?version=3538
- // ==/UserScript==
-
- var scriptName = "AI Testing";
- var scriptVersion = "14.01.02";
- var scriptWebpage = "http://userscripts.org/scripts/show/54927";
- /*
- *
- * pabst did this 09/08/01+
- *
- *
- */
-
- window.setTimeout( function() {
- console.log("AI start: "+GM_getValue("gmlist"));
- if ((window.location+"").indexOf("home.pl") != -1) {
- atHome();
- }
- else {
- pageMod();
-
- init(true);
- }
- }, 100);
-
- function atHome() {
- GM_setValue("gmlist","");
- var gmlist = "";
-
- for (var i=0; i<document.links.length; i++) {
- if (document.links[i].href.match("team_tactics.pl") != null) {
- var id = document.links[i].href.toString();
- id = id.slice(id.indexOf("=")+1);
-
- var str = document.body.innerHTML.split('game/team.pl?team_id='+id+'"')[1].split("</a>")[0];
- if (str.match('class="team_name"') != null) str = str.split(">")[1];
- else str = str.slice(1);
- gmlist += GM_getValue("gmlist")+id+":"+str+"\t";
- }
- }
-
- if (gmlist.length > 0) gmlist = gmlist.slice(0,gmlist.length-1);
- GM_setValue("gmlist",gmlist);
- console.log("gmlist="+gmlist);
- }
-
- function pageMod() {
- var div = document.createElement("div");
- div.setAttribute("id","dai_container");
- div.style.width = "480px";
- div.style.visiblity = "hidden";
- div.style.display = "none";
-
- var el = document.getElementById("footer");
- el.parentNode.insertBefore(div, el);
-
- var oaitest = document.createElement("input");
- oaitest.setAttribute("type","button");
- oaitest.setAttribute("id","oai_button");
- oaitest.setAttribute("value","Test OAI");
- oaitest.disabled = false;
- oaitest.addEventListener("click",testOAI,true);
- oaitest.disabled = true;
- div.appendChild(oaitest);
-
- var select = document.createElement("select");
- select.setAttribute("id","oai_team_select");
- div.appendChild(select);
- select.addEventListener("change", clearOAI, false);
-
- var tms = ["0:Mine"].concat(GM_getValue("gmlist","").split("\t"));
- if (tms[0].length > 0) {
- for (var i=0; i<tms.length; i++) {
- var opt = document.createElement('option');
- opt.text = tms[i].split(":")[1];
- opt.value = tms[i].split(":")[0];
- select.add(opt,null);
- }
- div.style.visibility = "visible";
- div.style.display = "block";
- }
-
- var load = document.createElement("input");
- load.setAttribute("type","button");
- load.setAttribute("value","Load OAI");
- load.addEventListener("click",oaiPageLoad,true);
- div.appendChild(load);
-
- var select2 = document.createElement("select");
- select2.setAttribute("id","oai_select");
- div.appendChild(select2);
-
- var br = document.createElement("br");
- div.appendChild(br);
-
- var daitest = document.createElement("input");
- daitest.setAttribute("type","button");
- daitest.setAttribute("id","dai_button");
- daitest.setAttribute("value","Test DAI");
- daitest.addEventListener("click",testDAI,true);
- daitest.disabled = true;
- div.appendChild(daitest);
-
- var select = document.createElement("select");
- select.setAttribute("id","dai_team_select");
- div.appendChild(select);
- select.addEventListener("change", clearDAI, false);
-
- var tms = ["0:Mine"].concat(GM_getValue("gmlist","").split("\t"));
- if (tms[0].length > 0) {
- for (var i=0; i<tms.length; i++) {
- var opt = document.createElement('option');
- opt.text = tms[i].split(":")[1];
- opt.value = tms[i].split(":")[0];
- select.add(opt,null);
- }
- div.style.visibility = "visible";
- div.style.display = "block";
- }
-
- var load = document.createElement("input");
- load.setAttribute("type","button");
- load.setAttribute("value","Load DAI");
- load.addEventListener("click",daiPageLoad,true);
- div.appendChild(load);
-
- var select2 = document.createElement("select");
- select2.setAttribute("id","dai_select");
- div.appendChild(select2);
-
- var pos = ["HB","FB","QB","TE"];
- var tags = ["Untagged","Speedy","Combo","Power","Rusher","Passer","Receiver","Blocker",
- "Custom Tag 1","Custom Tag 2","Custom Tag 3"];
- var flags = ["none","speedy","combo","power","rusher","passer","receiver","blocker","custom1","custom2","custom3"];
-
- for (var p=0; p<pos.length; p++) {
- if (p%2 == 0) {
- var br = document.createElement("br");
- div.appendChild(br);
- }
-
- var select = document.createElement("select");
- select.setAttribute("id",pos[p]+"_tag_select");
- select.setAttribute("class","tag_select");
- select.disabled = true;
-
- for (var t=0; t<tags.length; t++) {
- var opt = document.createElement('option');
- opt.text = pos[p]+" "+tags[t];
- opt.value = flags[t];
- select.add(opt,null);
- }
-
- div.appendChild(select);
- }
- }
-
- function clearOAI() {
- clearAI("oai");
- }
- function clearDAI() {
- clearAI("dai");
- for (var i=0; i<document.getElementsByClassName("tag_select").length; i++) {
- document.getElementsByClassName("tag_select")[i].disabled = true;
- }
- }
- function clearAI(str) {
- var select = document.getElementById(str+"_select");
- while (select.options.length > 0) {
- select.remove(0);
- }
-
- document.getElementById(str+"_button").disabled = true;
- for (var i=0; i<document.getElementsByClassName("tab_select").length; i++) {
- document.getElementsByClassName("tab_select")[i].disabled = true;
- }
- }
-
- function oaiPageLoad() {
- var teamId = document.getElementById("oai_team_select").value;
- if (teamId == null) return;
-
- var address = "/game/team_ai.pl?team_id="+teamId;
- address += "&ai_type=team";
- getInetPage(address, loadOAI, null);
- }
-
- function loadOAI(address, page) {
- clearOAI();
-
- var select = document.getElementById("oai_select");
- var aiList = page.responseText.split("team_offense_ai.pl?team_id=");
- for (var i=1; i<aiList.length; i++) {
- var str = aiList[i].split("\">")[1].split("</a>")[0];
- var id = aiList[i].split("=")[1].split("\"")[0];
-
- var opt = document.createElement("option");
- opt.text = str;
- opt.value = id;
- select.add(opt,null);
- }
-
- if (select.options.length > 0) document.getElementById("oai_button").disabled = false;
- }
-
- function daiPageLoad() {
- var teamId = document.getElementById("dai_team_select").value;
- if (teamId == null) return;
-
- var address = "/game/team_ai.pl?team_id="+teamId;
- address += "&ai_type=team";
- getInetPage(address, loadDAI, null);
- }
-
- function loadDAI(address, page) {
- clearDAI();
-
- var select = document.getElementById("dai_select");
- var aiList = page.responseText.split("team_defense_ai.pl?team_id=");
- for (var i=1; i<aiList.length; i++) {
- var str = aiList[i].split("\">")[1].split("</a>")[0];
- var id = aiList[i].split("=")[1].split("\"")[0];
-
- var opt = document.createElement("option");
- opt.text = str;
- opt.value = id;
- select.add(opt,null);
- }
-
- if (select.options.length > 0) {
- document.getElementById("dai_button").disabled = false;
- for (var i=0; i<document.getElementsByClassName("tag_select").length; i++) {
- document.getElementsByClassName("tag_select")[i].disabled = false;
- }
- }
- }
-
- function activate(e) {
- console.log("activate AI testing");
- lock();
-
- run();
- }
-
- function run() {
- var pbp = document.getElementById("pbp");
- if (pbp == null) {
- setTimeout(run, 300);
- }
- else if (pbp.childNodes.length == 0) {
- setTimeout(run, 300);
- }
- else {
- var page = new Object();
- page.responseText = pbp.innerHTML;
-
- loadPBPSimple(page);
-
- unlock();
- }
- }
-
- function testDAI() {
- var oteam = document.getElementsByClassName("secondary_container")[0].childNodes[0].innerHTML.split(" ")[0];
- var dteam = document.getElementsByClassName("secondary_container")[1].childNodes[0].innerHTML.split(" ")[0];
-
- var timeytg = document.getElementById("time_ytg");
- var t = timeytg.innerHTML.split(" ")[0];
- var dn = timeytg.innerHTML.split(" ")[1].slice(0,1);
- var ds = timeytg.innerHTML.split(" ")[3];
- var loc = timeytg.innerHTML.split(" on ")[1];
-
- var score = new Array();
- score[oteam] = 0;
- score[dteam] = 0;
-
- try {
- var play = plays[0];
- for (var i=0; i<plays.length; i++) {
- // console.log(t+" -- "+dn+" -- "+ds+" -- "+loc);
- // console.log(plays[i].timeRemaining+" | "+plays[i].down+" | "+plays[i].togo+" | "+plays[i].marker);
- if (plays[i].timeRemaining == t) {
- if (plays[i].down == dn) {
- if (plays[i].togo == ds) {
- if (plays[i].marker == loc) {
- play = plays[i];
- break;
- }
- }
- }
- }
- score[plays[i].team] += plays[i].score;
- }
- }
- catch (e) {
- var dai = document.getElementById("dai");
- if (dai == null) {
- var cont = document.getElementById("dai_container");
- dai = document.createElement("div");
- dai.setAttribute("id","dai");
- dai.style.textAlign = "left";
- dai.innerHTML = "Script not completely loaded yet, try again in a second.";
- cont.appendChild(dai);
- }
- return;
- }
-
- var oscore = score[oteam];
- var dscore = score[dteam];
- if (oscore == "-") oscore = 0;
- if (dscore == "-") dscore = 0;
- var score = Math.abs(dscore - oscore);
- var score_neg_pos = (dscore - oscore) / (score || 1);
-
- var qtr = play.quarter;
- var secs = play.timeRemaining.split(":");
- secs = parseInt(secs[0])*60+parseInt(secs[1]);
- var spotWho = play.marker.split(" ")[0];
- if (spotWho.toLowerCase() == "opp") {
- spotWho = "own";
- }
- else {
- spotWho = "their";
- }
- var spot = play.marker.split(" ")[1];
- var down = play.down;
- var togo = play.togo;
- play.formation = getFormation();
- formation = play.formation;
-
- var receivers = 2;
- if (formation == "Shotgun+5WR") {
- formation = "Shotgun";
- receivers = 5;
- }
- else if (formation == "Shotgun") {
- receivers = 3;
- }
- else if (formation.indexOf("Singleback+Spread") != -1) {
- receivers = 4;
- }
- else if (formation.indexOf("Singleback+Big") != -1) {
- receivers = 2;
- }
- else if (formation.indexOf("Singleback") != -1) {
- receivers = 3;
- }
- else if (formation == "I+Big") {
- receivers = 1;
- }
- else if (formation == "I") {
- receivers = 2;
- }
- else if (formation == "Goal+Line") {
- receivers = 0;
- }
-
- var mytime = play.timeoutsRemaining[1];
- var opptime = play.timeoutsRemaining[0];
- var teamid = document.getElementById("dai_team_select").value;
- var daiId = document.getElementById("dai_select").value;
- var action = "Test";
- var post = "quarter="+qtr;
- post += "&time_remaining="+secs;
- post += "&spot_who="+spotWho;
- post += "&spot="+spot;
- post += "&down="+down;
- post += "&to_go="+togo;
- post += "&score_neg_pos="+score_neg_pos;
- post += "&score="+score;
- post += "&formation="+formation;
- post += "&receivers="+receivers;
- post += "&my_timeouts="+mytime;
- post += "&opponent_timeouts="+opptime;
- post += "&team_id="+teamid;
- post += "&id="+daiId;
-
- var pos = ["HB","FB","QB","TE"];
- for (var i=0; i<pos.length; i++) {
- var value = document.getElementById(pos[i]+"_tag_select").value;
- if (value != "none") {
- post += "&"+pos[i].toLowerCase()+"_flag="+value;
- }
- }
-
- post += "&action="+action;
- console.log("("+post.length+") "+post);
-
- var dai = document.getElementById("dai");
- if (dai == null) {
- var cont = document.getElementById("dai_container");
- dai = document.createElement("div");
- dai.setAttribute("id","dai");
- dai.style.textAlign = "left";
- cont.appendChild(dai);
- }
-
- var address = "/game/team_defense_ai_test.pl";
- var http = new XMLHttpRequest();
- http.open("POST",address,true);
-
- http.setRequestHeader('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9) Gecko/2008052912 Firefox/3.0 Greasemonkey');
- http.setRequestHeader('Accept', 'text/html');
- http.setRequestHeader('Host', 'goallineblitz.com');
- http.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
- http.setRequestHeader('Content-length', post.length);
- http.setRequestHeader('Connection', 'close');
-
- http.onreadystatechange = function() {
- if (this.readyState == 4) {
- if (this.status != 200) {
- alert("pbr gm script: Error "+page.status+" loading "+address);
- }
- else {
- var text = this.responseText;
- var idx = text.indexOf('<div class="medium_head">Matching Input</div>');
- text = text.slice(idx);
- idx = text.indexOf('</div></div>');
- text = text.slice(0,idx+'</div></div>'.length);
- text = "<div>Warning: automatic tagging & running clocks not implemented.<br>"+
- "I have no idea why 'Singleback' is now called 'Singleback Left'.</div>"+text;
-
- dai.innerHTML = "<br><b>Formation:</b> "+formation.replace("+"," ")+" ("+receivers+")<br>"+text;
- }
- }
- }
- http.send(post);
- }
-
- function testOAI() {
- var oteam = document.getElementsByClassName("secondary_container")[0].childNodes[0].innerHTML.split(" ")[0];
- var dteam = document.getElementsByClassName("secondary_container")[1].childNodes[0].innerHTML.split(" ")[0];
-
- var timeytg = document.getElementById("time_ytg");
- var t = timeytg.innerHTML.split(" ")[0];
- var dn = timeytg.innerHTML.split(" ")[1].slice(0,1);
- var ds = timeytg.innerHTML.split(" ")[3];
- var loc = timeytg.innerHTML.split(" on ")[1];
-
- var score = new Array();
- score[oteam] = 0;
- score[dteam] = 0;
-
- try {
- var play = plays[0];
- for (var i=0; i<plays.length; i++) {
- // console.log(t+" -- "+dn+" -- "+ds+" -- "+loc);
- // console.log(plays[i].timeRemaining+" | "+plays[i].down+" | "+plays[i].togo+" | "+plays[i].marker);
- if (plays[i].timeRemaining == t) {
- if (plays[i].down == dn) {
- if (plays[i].togo == ds) {
- if (plays[i].marker == loc) {
- play = plays[i];
- break;
- }
- }
- }
- }
- score[plays[i].team] += plays[i].score;
- }
- } catch (e) {
- var dai = document.getElementById("dai");
- if (dai == null) {
- var cont = document.getElementById("dai_container");
- dai = document.createElement("div");
- dai.setAttribute("id","dai");
- dai.style.textAlign = "left";
- dai.innerHTML = "Script not completely loaded yet, try again in a second.";
- cont.appendChild(dai);
- }
- return;
- }
-
- var oscore = score[oteam];
- var dscore = score[dteam];
- if (oscore == "-") oscore = 0;
- if (dscore == "-") dscore = 0;
-
- var score = Math.abs(oscore - dscore);
- var score_neg_pos = (oscore - dscore) / (score || 1);
-
- var qtr = play.quarter;
- var secs = play.timeRemaining.split(":");
- secs = parseInt(secs[0])*60+parseInt(secs[1]);
-
- var spotWho = play.marker.split(" ")[0];
- if (spotWho.toLowerCase() == "opp") {
- spotWho = "their";
- }
- else {
- spotWho = "own";
- }
- var spot = play.marker.split(" ")[1];
- var down = play.down;
- var togo = play.togo;
-
- var mytime = play.timeoutsRemaining[0];
- var opptime = play.timeoutsRemaining[1];
- var teamid = document.getElementById("oai_team_select").value;
- var oaiId = document.getElementById("oai_select").value;
- var action = "Test";
- var post = "quarter="+qtr;
- post += "&time_remaining="+secs;
- post += "&spot_who="+spotWho;
- post += "&spot="+spot;
- post += "&down="+down;
- post += "&to_go="+togo;
- post += "&score_neg_pos="+score_neg_pos;
- post += "&score="+score;
- post += "&my_timeouts="+mytime;
- post += "&opponent_timeouts="+opptime;
- post += "&team_id="+teamid;
- post += "&id="+oaiId;
- post += "&action="+action;
- console.log(post);
-
- var address = "/game/team_ai_test.pl";
- var http = new XMLHttpRequest();
- http.open("POST",address,true);
-
- http.setRequestHeader('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9) Gecko/2008052912 Firefox/3.0 Greasemonkey');
- http.setRequestHeader('Accept', 'text/html');
- if (window.location.toString().indexOf("goallineblitz") != -1) {
- http.setRequestHeader('Host', 'goallineblitz.com');
- }
- else {
- http.setRequestHeader('Host', 'glb.warriorgeneral.com');
- }
- http.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
- http.setRequestHeader('Content-length', post.length);
- http.setRequestHeader('Connection', 'close');
-
- http.onreadystatechange = function() {
- if (this.readyState == 4) {
- if (this.status != 200) {
- alert("pbr gm script: Error "+page.status+" loading "+address);
- }
- else {
- var text = this.responseText;
- var idx = text.indexOf('<div class="medium_head">Matching Input</div>');
- text = text.slice(idx);
- idx = text.indexOf('<div style="clear');
- text = text.slice(0,idx);
-
- var dai = document.getElementById("dai");
- if (dai == null) {
- var cont = document.getElementById("dai_container");
- dai = document.createElement("div");
- dai.setAttribute("id","dai");
- dai.style.textAlign = "left";
- cont.appendChild(dai);
- }
- text = "<div>Warning: tagging & running clocks not implemented.<br>"+
- "I have no idea why 'Singleback' is now called 'Singleback Left'.</div>"+text;
- dai.innerHTML = text;
- }
- }
- }
- http.send(post);
- }
-
- function getPlayer(pos) {
- var output = new Array();
- var images = document.getElementById("offense_container").getElementsByTagName("img");
- for (var i=0; i<images.length; i++) {
- var str = images[i].src;
- if (str.indexOf("/"+pos+".gif") != -1) {
- while(str.indexOf("/") != -1) {
- str = str.slice(str.indexOf("/")+1);
- }
- var id = images[i].parentNode.id.split("_")[2];
- for (var z=0; z<unsafeWindow.play_data[0].length; z++) {
- var p = unsafeWindow.play_data[0][z];
- if (p.id == id) {
- output.push(p);
- }
- }
- }
- }
- return output;
- }
-
- function premodTest() {
- var xdiff = 115;
- 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("premodTest(): "+minx+" --> "+maxx+" : "+((maxx - minx)>xdiff));
- if ((maxx-minx) > xdiff) return true;
- return false;
- }
-
- function getFormation() {
- var offense = ["QB","HB","FB","TE","LOT","ROT","LG","RG","C","WR1","WR2","WR3","WR4","WR5","K","P"];
- var players = new Array();
-
- for (var i=0; i<offense.length; i++) {
- var p = getPlayer(offense[i]);
- if (p != null) {
- players[offense[i]] = p;
- }
- }
-
- var shotgunDist = 8;
- if (premodTest() == true) shotgunDist = shotgunDist*3;
- console.log(premodTest()+": sgdist="+(diff(players["QB"][0].y, players["C"][0].y)));
-
- var formation = "Unknown";
- try {
- if (players["K"].length != 0) {
- formation = "Kickoff";
- }
- else if (players["P"].length != 0) {
- formation = "Punt";
- }
- else if (players["FB"].length == 2) {
- formation = "Spike";
- }
- else if (players["WR5"].length != 0) {
- formation = "Shotgun+5WR";
- }
- else if (players["WR4"].length != 0) {
- formation = "Singleback+Spread";
- }
- else if (players["TE"].length == 3) {
- formation = "Goal+Line";
- }
- else if (diff(players["QB"][0].y, players["C"][0].y) > shotgunDist) {
- console.log("sgdist="+(diff(players["QB"][0].y, players["C"][0].y)));
- formation = "Shotgun";
- }
- else if ((diff(players["QB"][0].y, players["HB"][0].y) > shotgunDist) &&
- (players["FB"].length == 0)) {
- if (players["TE"].length == 1) {
- var cnt = 0;
- for (var r=0; r<3; r++) {
- if (players["WR"+(r+1)][0].x < players["QB"][0].x) cnt++;
- else cnt--;
- }
- if (Math.abs(cnt) == 3) formation = "Singleback+Trips";
- else formation = "Singleback+Left";
- }
- else {
- formation = "Singleback+Big";
- }
- }
- else if (diff(players["HB"][0].y, players["FB"][0].y) < 3) {
- formation = "Splitbacks+Pro";
- }
- else if (diff(players["HB"][0].x, players["FB"][0].x) < 3) {
- if (players["TE"].length == 2) {
- formation = "I+Big";
- }
- else {
- formation = "I";
- }
- }
- else if ((diff(players["QB"][0].y, players["HB"][0].y) > 8) &&
- (diff(players["WR1"][0].x, players["HB"][0].x) > diff(players["WR1"][0].x, players["FB"][0].x))) {
- formation = "I+Weak";
- }
- else if ((diff(players["QB"][0].y, players["HB"][0].y) > 8) &&
- (diff(players["WR1"][0].x, players["HB"][0].x) < diff(players["WR1"][0].x, players["FB"][0].x))) {
- formation = "I+Strong";
- }
- }
- catch (e) {
- console.log("AI Testing: "+e);
- }
- console.log("Formation = "+formation);
-
- return formation;
- }
-
-
- function diff(x, y) {
- var a = parseFloat(x);
- var b = parseFloat(y);
- return Math.max(a,b) - Math.min(a,b);
- }