// ==UserScript== // @name GLB Canvas Replay Conversion // @namespace pbr/canvas // @include http://goallineblitz.com/game/replay.pl?game_id=*&pbp_id=* // @copyright 2012, pabst // @license (CC) Attribution Share Alike; http://creativecommons.org/licenses/by-sa/3.0/ // @version 12.11.30 // @description sdfsdf // @downloadURL none // ==/UserScript== /* * * pabst did this 12/11/27+ * * */ unsafeWindow.pause(); document.getElementById("offense_container").style.visibility = "hidden"; document.getElementById("defense_container").style.visibility = "hidden"; document.getElementById("offense_container").style.display = "none"; document.getElementById("defense_container").style.display = "none"; var play_data = null; var imageData = []; if (!window.requestAnimationFrame) { requestAnimFrame = (function () { return window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || function(callback, element) { console.log("no request animation frame!!"); window.setTimeout(callback, 1000 / 20); }; }) (); }; window.setTimeout( function() { if (unsafeWindow.defaultFrameSpeed != 100) { console.log("replays must be set to 10fps for this script to work : "+unsafeWindow.defaultFrameSpeed); unsafeWindow.play(); } else { main(); } } , 100); function main() { var container = document.getElementById("replay_container") container.style.height = "500px"; container.style.width = "520px"; var area = document.getElementById("replay_area"); container.removeChild(area); play_data = fixFrames(); fixButtons(); initBackground(); initForeground(); initOffense(); initDefense(); initReplayInfo(); drawFrame(0,0); setTimeout(function() { isPlaying = true; document.getElementById("pause_button").visibility = "visible"; document.getElementById("play_button").visibility = "hidden"; render(); }, 2500); } function initBackground() { var canvas = document.createElement("canvas"); canvas.style.position = 'absolute'; canvas.setAttribute("id","background"); canvas.setAttribute("width","520px"); canvas.setAttribute("height","500px"); var container = document.getElementById("replay_container") container.appendChild(canvas); var context = canvas.getContext("2d"); context.save(); } function initForeground() { var canvas = document.createElement("canvas"); canvas.style.position = 'absolute'; canvas.setAttribute("id","foreground"); canvas.setAttribute("width","520px"); canvas.setAttribute("height","500px"); var container = document.getElementById("replay_container") container.appendChild(canvas); var context = canvas.getContext("2d"); context.save(); } function initOffense() { var canvas = document.createElement("canvas"); canvas.style.position = 'absolute'; canvas.style.top = "20px"; canvas.setAttribute("id","offense"); canvas.setAttribute("width","20px"); canvas.setAttribute("height","460px"); var container = document.getElementById("replay_container") container.appendChild(canvas); canvas.addEventListener("click", offenseClicked, false); } function offenseClicked() { renderOffenseLineup(); } function initDefense() { var canvas = document.createElement("canvas"); canvas.style.position = 'absolute'; canvas.style.left = "500px"; canvas.style.top = "20px"; canvas.setAttribute("id","defense"); canvas.setAttribute("width","20px"); canvas.setAttribute("height","460px"); var container = document.getElementById("replay_container") container.appendChild(canvas); canvas.addEventListener("click", defenseClicked, false); } function defenseClicked() { renderDefenseLineup(); } function initReplayInfo() { var canvas = document.createElement("canvas"); canvas.style.position = 'absolute'; canvas.setAttribute("id","replayInfo"); canvas.setAttribute("width","520px"); canvas.setAttribute("height","20px"); var container = document.getElementById("replay_container") container.appendChild(canvas); var canvas = document.createElement("canvas"); canvas.style.position = 'absolute'; canvas.style.top = "480px"; canvas.setAttribute("id","playResults"); canvas.setAttribute("width","520px"); canvas.setAttribute("height","20px"); var container = document.getElementById("replay_container") container.appendChild(canvas); } function getTeamBColor(id) { var team = unsafeWindow.ptid[id]; var position = unsafeWindow.players[id].position; var fcolor = unsafeWindow.home_color2+"_border_home"; var bcolor = unsafeWindow.home_color1; if (unsafeWindow.home != team) { fcolor = unsafeWindow.away_color2+"_border"; bcolor = unsafeWindow.away_color1; } bcolor = bcolor.replace("mid_","medium"); bcolor = bcolor.replace("_",""); return bcolor; } function getTeamFColor(bcolor) { var canvas = document.createElement("canvas"); var context = canvas.getContext("2d"); context.strokeStyle = bcolor; var color = context.strokeStyle.toString().slice(1); var r = parseInt(color.slice(0,2), 16); var g = parseInt(color.slice(2,4), 16); var b = parseInt(color.slice(4,6), 16); if ((r+g+b)/3 > 128) { return "black"; } else { return "white"; } } function renderReplayInfo() { if (imageData["replayInfo"] == null) { var canvas = document.createElement("canvas"); canvas.setAttribute("width","520px"); canvas.setAttribute("height","20px"); var context = canvas.getContext("2d"); var gradient = context.createLinearGradient(0,0,0,20); gradient.addColorStop(0,"rgb(100,100,100)"); gradient.addColorStop(1,"rgb(40,40,40)"); context.lineWidth = 2; context.fillStyle = gradient; context.fillRect(0,0,520,20); context.font = "bold 18px sans-serif"; context.fillStyle = "#ffcc00"; var info = document.getElementsByTagName("h1")[0].textContent; var length = context.measureText(info.toString()); context.fillText(info.toString(), 260-length.width/2,16); var p = play_data[0][1]; var id = p.id; var bcolor = getTeamBColor(id); var fcolor = getTeamFColor(bcolor); context.lineWidth = 2; context.fillStyle = bcolor; context.strokeStyle = fcolor; context.beginPath(); context.moveTo(0,0); context.lineTo(40, 0); context.lineTo(60,20); context.lineTo(0,20); context.lineTo(0,0); context.closePath(); context.fill(); context.stroke(); context.font="bold 16px sans-serif"; var score = document.getElementById("off_score").textContent; var length = context.measureText(score.toString()); context.fillStyle = fcolor; context.fillText(score.toString(), 20-length.width/2,16); var p = play_data[0][12]; var id = p.id; var bcolor = getTeamBColor(id); var fcolor = getTeamFColor(bcolor); context.lineWidth = 2; context.fillStyle = bcolor; context.strokeStyle = fcolor; context.beginPath(); context.moveTo(520,0); context.lineTo(480, 0); context.lineTo(460,20); context.lineTo(520,20); context.lineTo(520,0); context.closePath(); context.fill(); context.stroke(); context.font="bold 16px sans-serif"; var score = document.getElementById("def_score").textContent; var length = context.measureText(score.toString()); context.fillStyle = fcolor; context.fillText(score.toString(), 500-length.width/2,16); imageData["replayInfo"] = canvas; } var canvas = document.getElementById("replayInfo"); var context = canvas.getContext("2d"); context.drawImage(imageData["replayInfo"],0,0); if (imageData["playResults"] == null) { var canvas = document.createElement("canvas"); canvas.setAttribute("width","520px"); canvas.setAttribute("height","20px"); var context = canvas.getContext("2d"); var gradient = context.createLinearGradient(0,0,0,20); gradient.addColorStop(0,"rgb(100,100,100)"); gradient.addColorStop(1,"rgb(40,40,40)"); context.lineWidth = 2; context.fillStyle = gradient; context.fillRect(0,0,520,20); var size = 14; do { context.font = "bold "+size+"px sans-serif"; context.fillStyle = "#ffcc00"; var info = document.getElementById("outcome_content").textContent; var length = context.measureText(info.toString()); size--; } while (length.width > 520); context.fillText(info.toString(), 260-length.width/2,14); imageData["playResults"] = canvas; } var canvas = document.getElementById("playResults"); var context = canvas.getContext("2d"); context.drawImage(imageData["playResults"],0,0); } function renderOffenseBar(frame, pct, loc) { if (imageData["offenseBar"] == null) { var canvas = document.createElement("canvas"); canvas.setAttribute("width","20px"); canvas.setAttribute("height","480px"); var context = canvas.getContext("2d"); var p = play_data[0][1]; var id = p.id; var bcolor = getTeamBColor(id); var fcolor = getTeamFColor(bcolor); context.lineWidth = 3; context.fillStyle = bcolor; context.strokeStyle = fcolor; context.fillRect(0,0, 20,460); context.strokeRect(0,0, 20,460); var teamName = document.getElementsByClassName("secondary_container")[0].textContent; context.fillStyle = fcolor; context.lineWidth=1; context.font="bold 14px sans-serif"; context.save(); context.rotate(Math.PI/2); context.fillText(teamName, 50,-6); context.restore(); imageData["offenseBar"] = canvas; } var canvas = document.getElementById("offense"); var context = canvas.getContext("2d"); context.drawImage(imageData["offenseBar"],0,0); } var offenseLineupVisible = false; function renderOffenseLineup(frame, pct, loc) { offenseLineupVisible = !offenseLineupVisible; if (offenseLineupVisible == true) { var canvas = document.createElement("canvas"); canvas.setAttribute("id","offenseLineup"); canvas.setAttribute("width","200px"); canvas.setAttribute("height","480px"); canvas.style.position = "absolute"; canvas.style.left = "20px"; var context = canvas.getContext("2d"); var id = unsafeWindow.play_data[0][1].id; var team = unsafeWindow.ptid[id]; var bcolor = getTeamBColor(id); var fcolor = getTeamFColor(bcolor); context.font="14px sans-serif"; context.lineWidth = 2; context.fillStyle = bcolor; context.strokeStyle = fcolor; context.fillRect(0,130, 200,500); context.strokeRect(0,130, 200,500); for (var i=1; i<12; i++) { var id = unsafeWindow.play_data[0][i].id; var position = unsafeWindow.players[id].position; var name = unsafeWindow.players[id].name; var x = i; var y = 216; context.fillStyle = bcolor context.fillRect(0,(x-1)*24+y, 200,x*24+y); context.strokeRect(0,(x-1)*24+y, 200,x*24+y); context.fillStyle = fcolor; context.fillText(name, 25, x*24-10+y+3); context.drawImage(imageData[id], 5, (x-1)*24+y+4); } var image = new Image(); image.src = "http://goallineblitz.com/game/team_pic.pl?team_id="+team; var imgcanvas = document.createElement("canvas"); var imgcontext = imgcanvas.getContext("2d"); imgcontext.scale(75/image.width, 75/image.height); imgcontext.drawImage(image, 0, 0); context.drawImage(imgcanvas, 5,135); context.font = "64px sans-serif"; context.fillColor = fcolor; var score = document.getElementById("off_score").textContent; var length = context.measureText(score.toString()); context.fillText(score.toString(), 138-length.width/2,200); var container = document.getElementById("replay_container"); container.appendChild(canvas); } else { var lineup = document.getElementById("offenseLineup"); lineup.parentNode.removeChild(lineup); } } function renderDefenseBar(frame, pct, loc) { if (imageData["defenseBar"] == null) { var canvas = document.createElement("canvas"); canvas.setAttribute("width","20px"); canvas.setAttribute("height","460px"); var context = canvas.getContext("2d"); var p = play_data[0][12]; var id = p.id; var bcolor = getTeamBColor(id); var fcolor = getTeamFColor(bcolor); context.lineWidth = 3; context.fillStyle = bcolor; context.strokeStyle = fcolor; context.fillRect(0,0, 20,460); context.strokeRect(0,0, 20,460); var teamName = document.getElementsByClassName("secondary_container")[1].textContent; context.fillStyle = fcolor; context.lineWidth=1; context.font="bold 14px sans-serif"; context.save(); context.rotate(Math.PI/2); context.fillText(teamName, 50,-6); context.restore(); imageData["defenseBar"] = canvas; } var canvas = document.getElementById("defense"); var context = canvas.getContext("2d"); context.drawImage(imageData["defenseBar"],0,0); } var defenseLineupVisible = false; function renderDefenseLineup(frame, pct, loc) { defenseLineupVisible = !defenseLineupVisible; if (defenseLineupVisible == true) { var canvas = document.createElement("canvas"); canvas.setAttribute("id","defenseLineup"); canvas.setAttribute("width","200px"); canvas.setAttribute("height","480px"); canvas.style.position = "absolute"; canvas.style.left = "300px"; var context = canvas.getContext("2d"); var id = unsafeWindow.play_data[0][13].id; var team = unsafeWindow.ptid[id]; var bcolor = getTeamBColor(id); var fcolor = getTeamFColor(bcolor); context.font="14px sans-serif"; context.lineWidth = 2; context.fillStyle = bcolor; context.strokeStyle = fcolor; context.fillRect(0,130, 200,460); context.strokeRect(0,130, 200,460); for (var i=12; i<23; i++) { var id = unsafeWindow.play_data[0][i].id; var position = unsafeWindow.players[id].position; var name = unsafeWindow.players[id].name; var x = i-11; var y = 216; context.fillStyle = bcolor; context.fillRect(0,(x-1)*24+y, 200,x*24+y); context.strokeRect(0,(x-1)*24+y, 200,x*24+y); context.fillStyle = fcolor; context.fillText(name, 25, x*24-10+y+3); context.drawImage(imageData[id], 5, (x-1)*24+y+4); } var image = new Image(); image.src = "http://goallineblitz.com/game/team_pic.pl?team_id="+team; var imgcanvas = document.createElement("canvas"); var imgcontext = imgcanvas.getContext("2d"); imgcontext.scale(75/image.width, 75/image.height); imgcontext.drawImage(image, 0, 0); context.drawImage(imgcanvas, 5,135); context.font = "64px sans-serif"; context.fillColor = fcolor; var score = document.getElementById("def_score").textContent; var length = context.measureText(score.toString()); context.fillText(score.toString(), 138-(length.width/2),200); var container = document.getElementById("replay_container"); container.appendChild(canvas); } else { var lineup = document.getElementById("defenseLineup"); lineup.parentNode.removeChild(lineup); } } function drawFrame(frame, pct) { var loc = renderField(frame, pct); var canvas = document.getElementById("foreground"); var context = canvas.getContext("2d"); context.restore(); context.save(); context.clearRect(20, 0, 500, 1160); renderFirstDown(frame, pct, loc); renderVisionCone(frame, pct, loc); renderPlayers(frame, pct, loc); renderBall(frame, pct, loc); renderIcons(frame, pct, loc); renderOffenseBar(frame, pct, loc); renderDefenseBar(frame, pct, loc); renderReplayInfo(); } var initialTime = null; var currentTime = null; var isPlaying = false; var frameMultiplier = 1; function render() { if (isPlaying == false) return; currentTime = new Date(); if (initialTime == null) { initialTime = currentTime; } var diff = currentTime - initialTime; var frame = diff/100 * frameMultiplier; pct = frame - Math.floor(frame); frame = Math.floor(frame) % play_data.length; try { drawFrame(frame, pct); lastTime = currentTime; var scrubber = 480/play_data.length*(frame+pct); document.getElementById("scrubber_handle").style.left = scrubber+"px"; } catch (e) { window.console.log(e); } measureFps(); if (frame >= play_data.length-1) { initialTime = null; setTimeout(function() { drawFrame(0,0); setTimeout(function() { render(); }, 2500); }, 2500); } else { requestAnimFrame(render); } } function renderIcons(frame, pct, loc) { var canvas = document.getElementById("foreground"); var context = canvas.getContext("2d"); for (var p=1; p parseFloat(play_data[0][0].y)) { dy = dy * -1; } context.beginPath(); context.moveTo(20,y-dy); context.lineTo(500,y-dy); context.stroke(); context.lineWidth = 2; context.beginPath(); context.strokeStyle = "rgb(0,0,255)"; context.moveTo(20,y); context.lineTo(500,y); context.stroke(); break; } } } function renderField(frame, pct) { var left = play_data[frame]; var right = play_data[Math.min(frame+1, play_data.length-1)]; var ydiff = right[0].y - left[0].y; var y = left[0].y + ydiff * pct; var location = -1 * y + 250; location = Math.max(location, -660); location = Math.min(location, 0); var canvasbg = document.getElementById("background"); var contextbg = canvasbg.getContext("2d"); contextbg.drawImage(imageData["field"], 20, 0-location, 480, 500, 20, 0, 480, 500); return location; } function renderPlayers(frame, pct, loc) { /* for (var f=0; f 0) { console.log("noooooo greasemonkey, no one would ever want to use worker threads..."); console.log(done); setTimeout(prepareImages, 250); } } function beginPressed() { pausePressed(); initialTime = null; currentTime = null; drawFrame(0,0); } function rwPressed() { if (isPlaying == true) { frameMultiplier = Math.max(frameMultiplier - 0.25, 0); console.log(frameMultiplier); } else { currentTime = currentTime.setMilliseconds(currentTime.getMilliseconds() - 100); currentTime = new Date(currentTime); var diff = currentTime - initialTime; var frame = diff/100 * frameMultiplier; pct = frame - Math.floor(frame); frame = Math.floor(frame) % play_data.length; if (frame < 0) frame += play_data.length; drawFrame(frame, pct); } } function pausePressed() { console.log("pause"); document.getElementById("pause_button").visibility = "hidden"; document.getElementById("play_button").visibility = "visible"; isPlaying = false; } function playPressed() { console.log("play"); document.getElementById("pause_button").visibility = "visible"; document.getElementById("play_button").visibility = "hidden"; isPlaying = true; var t = currentTime; currentTime = new Date(); initialTime = currentTime - (t-initialTime); render(); } function ffPressed() { if (isPlaying == true) { frameMultiplier = frameMultiplier + 0.25; console.log(frameMultiplier); } else { currentTime = currentTime.setMilliseconds(currentTime.getMilliseconds() + 100); currentTime = new Date(currentTime); var diff = currentTime - initialTime; var frame = diff/100 * frameMultiplier; pct = frame - Math.floor(frame); frame = Math.floor(frame) % play_data.length; drawFrame(frame, pct); } } function endPressed() { pausePressed(); initialTime = null; currentTime = null; drawFrame(play_data.length-1,0); } function fixButtons() { var buttons = document.getElementsByClassName("button left"); var begin = buttons[2]; begin.addEventListener("click",beginPressed); var rewind = buttons[3]; rewind.addEventListener("click",rwPressed); var pause = buttons[4]; pause.addEventListener("click",playPressed); var play = buttons[5]; play.addEventListener("click",pausePressed); var ff = buttons[6]; ff.addEventListener("click",ffPressed); var end = buttons[7]; end.addEventListener("click",endPressed); } function fixFrames() { var stime = new Date(); var uwpd = new Array(); for (var i=0; i0; f--) { if (uwpd[f][p].icon != null) { for (var z=f+1; z 300) { var now = new Date(); var delta = now - lastTime; fps.push(frameCounter / delta); frameCounter = 0; lastTime = now; } if (fps.length == 10) { console.log(fps); fps = []; } }