Ogame - 1.x - Fleet

Script for OGame with the new graphic interface. Add some fleet features and shortcuts.

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。

您需要先安装用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name           Ogame - 1.x - Fleet
// @author         Sherbrow
// @namespace      Ogame
// @include        http://*.ogame.*/game/index.php?page=fleet*
//
// @version        v0.4.1b
// @description Script for OGame with the new graphic interface. Add some fleet features and shortcuts.
// ==/UserScript==

var DEBUG = true; // set to true if you want to see the errors (alert nagging) --> will be handled by the Config Panel when implemented
var conf_slider = false; // deactivate by default as no longer necessary (and broken)
var OFH = new Object(); // global object (window.OFH)
	OFH.errors = new Array(); // errors are stored there if you want to see / report

try { // Global exception handler, because we never know =)
    
    // Static images
    var img_ship_mov = 'http://gf2.geo.gfsrv.net/cdnd9/f9cb590cdf265f499b0e2e5d91fc75.gif';
    var img_ships = 'http://gf3.geo.gfsrv.net/cdn5e/8210a229031b77ea51100242538347.png';
    var img_ecke = 'http://gf2.geo.gfsrv.net/cdn42/e3d481656bab1b216428a98a2e022e.gif';
    var img_starstreak = 'http://gf1.geo.gfsrv.net/cdnf5/6006050db8c19f1d3734c7f1ee4c89.gif';

var universe,lang,sublang,fleetLocation,fleetLocationActual;

var t_array = /http:\/\/s([0-9]+)-([a-z]+)\.ogame\.gameforge\.com\/game\/index\.php\?page=fleet([0-9]+)/.exec(document.location.href);

universe = t_array[1];
sublang = t_array[2];
lang = t_array[2];
fleetLocation = t_array[3];
fleetLocationActual = /fleet([0-9])/.exec(document.getElementsByTagName("body")[0].getAttribute("id"))[1];

if(!fleetLocationActual) { // who kows ... may be deleted in a future version
	if(fleetLocation=="2" && document.getElementById("allornone")) // Cuz' when you switch from fleet2 to another planet, you don't automatically return to fleet 1 ><
		fleetLocation = "1";
	fleetLocationActual = fleetLocation;
}

if(fleetLocationActual == "1") {

try { // SC/LC buttons
	var fleetIsAvailable = true;
	var AoN; // All or none buttons container (original)
	try {
		AoN = document.getElementById("allornone").firstElementChild.firstElementChild;
	} catch (e) {
		fleetIsAvailable = false;
	}
	if(fleetIsAvailable) {
		var RSB; // Ressources shrorcut buttons
			var LC_available,SC_available,LC_required,SC_required;
		var a,img,div,span,span2,span3,t_class;

		//-- Compute cargos for ressources (not dynamic)
		LC_required = Math.ceil((unsafeWindow.resourceTickerMetal.available+unsafeWindow.resourceTickerCrystal.available+unsafeWindow.resourceTickerDeuterium.available)/25000);
		LC_available = parseInt(document.getElementById("button203").firstElementChild.firstElementChild.firstElementChild.firstElementChild.childNodes[1].nodeValue.replace(/[.,]/,""));
		SC_required = Math.ceil((unsafeWindow.resourceTickerMetal.available+unsafeWindow.resourceTickerCrystal.available+unsafeWindow.resourceTickerDeuterium.available)/5000);
		SC_available = parseInt(document.getElementById("button202").firstElementChild.firstElementChild.firstElementChild.firstElementChild.childNodes[1].nodeValue.replace(/[.,]/,""));

		RSB = document.createElement("DIV");
			RSB.setAttribute("class",AoN.getAttribute("class")+" OFH");
			
			a = document.createElement("A"); // Small Cargos
				a.setAttribute("title","|"+addDotsToInt(SC_required));
				a.setAttribute("href","#SC_ressources");
				t_class = (SC_available>0)?"on":"off";
				(SC_required>SC_available)?a.setAttribute("class","tipsStandard RSB SC less "+t_class):a.setAttribute("class","tipsStandard RSB SC enough "+t_class);
				a.setAttribute("onclick",'shipsChosen.am202.value='+SC_required+'; checkIntInput("ship_202", 0, '+SC_required+'); checkShips("shipsChosen");event.preventDefault();');
				
				span = document.createElement("span");
					span.setAttribute("class","ecke");
				a.appendChild(span);
				
				span = document.createElement("span");
					span.setAttribute("class","number");
					span.appendChild(document.createTextNode(addDotsToInt(SC_required)));
				a.appendChild(span);
			RSB.appendChild(a);
			
			a = document.createElement("A"); // Large Cargos
				a.setAttribute("title","|"+addDotsToInt(LC_required));
				a.setAttribute("href","#LC_ressources");
				t_class = (LC_available>0)?"on":"off";
				(LC_required>LC_available)?a.setAttribute("class","tipsStandard RSB LC less "+t_class):a.setAttribute("class","tipsStandard RSB LC enough "+t_class);
				a.setAttribute("onclick",'shipsChosen.am203.value='+LC_required+'; checkIntInput("ship_203", 0, '+LC_required+'); checkShips("shipsChosen");event.preventDefault();');
				
				span1 = document.createElement("span");
					span1.setAttribute("class","ecke");
				a.appendChild(span1);
				
				span2 = document.createElement("span");
					span2.setAttribute("class","number");
					span2.appendChild(document.createTextNode(addDotsToInt(LC_required)));
				a.appendChild(span2);
			RSB.appendChild(a);

			div = document.createElement("DIV"); // Clear
				div.setAttribute("class","clearfloat");
			RSB.appendChild(div);
			
		AoN.parentNode.insertBefore(RSB,AoN.nextElementSibling);
		
        GM_addStyle(".OFH."+AoN.getAttribute("class").replace(' ','.')+" {width:auto!important;}");
		GM_addStyle(".OFH a.RSB {display:block;position:relative;width:76px;height:32px;cursor:pointer;float:left;margin:0px 1px;}");
			GM_addStyle(".OFH a.RSB.SC.on {background:url(\""+img_ships+"\") no-repeat scroll 0px -36px transparent;}");
			GM_addStyle(".OFH a.RSB.SC.off {background:url(\""+img_ships+"\") no-repeat scroll 0px -196px transparent;}");
			GM_addStyle(".OFH a.RSB.LC.on {background:url(\""+img_ships+"\") no-repeat scroll -80px -23px transparent;}");
			GM_addStyle(".OFH a.RSB.LC.off {background:url(\""+img_ships+"\") no-repeat scroll -80px -183px transparent;}");
			
			GM_addStyle(".OFH a.RSB .ecke {display:block;opacity:0.8;width:100%;height:100%;background:url(\""+img_ecke+"\") no-repeat scroll left bottom transparent;}");
			GM_addStyle(".OFH a.RSB .number {position:absolute;bottom:0px;right:0px;margin-right:2px;}");
				GM_addStyle(".OFH a.RSB.enough .number {color:#FF9600}");
				GM_addStyle(".OFH a.RSB.less .number {color:#FF0000}");
	} // If fleet is available

	
} catch(e){if(DEBUG) alert("OFH Error(LC/SC)\n"+e.toString());OFH.errors.push("OFH Error(LC/SC)\n"+e.toString());}
    
try { // SC/LC buttons
    unsafeWindow.$('.fleetValues').attr('onfocus',''); // Shame on me
    unsafeWindow.toggleMaxShips = function(h,g,f){var e=$(h).find("#ship_"+g);if(parseInt(e.val())!==f){e.val(f)}else{e.val("")}e.get(0).setSelectionRange(0,99);}
} catch(e){if(DEBUG) alert("OFH Error(fixes sel input)\n"+e.toString());OFH.errors.push("OFH Error(fixes sel input)\n"+e.toString());}
	
} // fleet 1
else if(fleetLocationActual == "2") {

try{ // First of all, transform the planet on the right

    
	var planets = document.getElementById("myPlanets").getElementsByClassName("smallplanet");
	for(i=0;i<planets.length;++i) {
        var i,target,planet,moon,koord,name;
		planet = planets[i].firstElementChild;
			koord = planet.children[2].firstChild.nodeValue;
			koord=/\[([0-9]+):([0-9]+):([0-9]+)\]/.exec(koord); // Switch [x:xxx:xx] to array
		target=koord[1]+"#"+koord[2]+"#"+koord[3]+"#1#"; //the 1 is for planet
        try { // Some traduction may have problems, in case, let's just forget the moon =S
            name = /<B>([^\[]+) /.exec(planet.getAttribute("title"))[1];
        } catch (e) {
            // name = planet.children[1].firstChild.nodeValue;
            name = "Shortcut does not work";
        }
		target+=name;
        
        planet.setAttribute('data-sl_target',target);
		
		// planet.setAttribute("onclick","document.getElementById(\"slbox\").value = \""+target+"\";shortLinkChange();updateVariables();event.preventDefault();return false;");
        planet.addEventListener("click",function(e) { e.preventDefault();document.getElementById("slbox").value = this.getAttribute('data-sl_target');shortLinkChange();updateVariables();return false;}, true);
		planet.setAttribute("ondblclick","document.location.href=this.href;"); // A lil' bit ugly, but it works ^-^
		planet.setAttribute("title","Change destination to:<BR /><B>"+name+" "+koord[0]+"</B>");
		planet.setAttribute("onmouseover","this.firstElementChild._src=this.firstElementChild.src;this.firstElementChild.src=\""+img_ship_mov+"\";this.firstElementChild.style.width='16px';this.firstElementChild.width=16;this.firstElementChild.height=16;this.firstElementChild.style.padding='7px';");
		planet.setAttribute("onmouseout","this.firstElementChild.src=this.firstElementChild._src;this.firstElementChild.style.width='30px';this.firstElementChild.width=30;this.firstElementChild.height=30;this.firstElementChild.style.padding='0px';");
		
		moon = planet.nextElementSibling;
		if(moon) { // If there is a sibling (moon or construction)
			if(/moonlink/.test(moon.getAttribute("class"))) {
				target=koord[1]+"#"+koord[2]+"#"+koord[3]+"#3#"; //the 3 is for moon
				try { // Some traduction may have problems, in case, let's just forget the moon =S
					name = /<B>([^\[]+) /.exec(moon.getAttribute("title"))[1];
				} catch (e) {
					name = "Shortcut does not work";
				}
				target+=name;
        
                moon.setAttribute('data-sl_target',target);
				
				// moon.setAttribute("onclick","document.getElementById(\"slbox\").value = \""+target+"\";shortLinkChange();updateVariables();event.preventDefault();return false;");
                moon.addEventListener("click",function(e) { e.preventDefault();document.getElementById("slbox").value = this.getAttribute('data-sl_target');shortLinkChange();updateVariables();return false;}, true);
				moon.setAttribute("ondblclick","document.location.href=this.href;"); // A lil' bit ugly, but it works ^-^
				moon.setAttribute("title","Change destination to:<BR /><B>"+name+" "+koord[0]+" (moon)</B>");
				moon.setAttribute("onmouseover","this.firstElementChild._src=this.firstElementChild.src;this.firstElementChild.src=\""+img_ship_mov+"\"");
				moon.setAttribute("onmouseout","this.firstElementChild.src=this.firstElementChild._src");
			}
		}
	}
	
	GM_addStyle("#myPlanets .planetPic {width:30px;}");
	
} catch(e) {if(DEBUG) alert("OFH Error(planet shortcuts)\n"+e.toString());OFH.errors.push("OFH Error(planet shortcuts)\n"+e.toString());}

try{ // Then speed slider (that sounds awesome !)
    if(conf_slider) {
        OFH.slider = new Object();
        var speedSelect = document.getElementById("speed");

        OFH.slider.updatePosition = function() {
            var speed = speedSelect.value;
            document.getElementById("OFH_speedSlider").style.left = (2+(16*(speed-1)))+"px";
        }
        OFH.slider.updateSpeed = function(e) {
            speedSelect.value = Math.round(((parseInt(document.getElementById("OFH_speedSlider").style.left)-2)/16))+1; // I know, I know ...
            unsafeWindow.updateVariables();
            if(e)
                e.stopPropagation();
        }
        OFH.slider.moveCursor = function(e) {
            var t_object=slider,positionSlider = 0;
            var positionCursor = e.clientX;
            while(t_object.offsetParent) {
                positionSlider += t_object.offsetLeft;
                t_object = t_object.offsetParent;
            }

            speedSelect.value=Math.floor(parseInt((positionCursor-positionSlider)/16))+1;
            OFH.slider.updatePosition();
            unsafeWindow.updateVariables();
            e.preventDefault();
        }
        OFH.slider.startSliding = function(e) {
            document.getElementsByTagName("body")[0].addEventListener("mousemove",OFH.slider.moveCursor,false);
            document.getElementsByTagName("body")[0].addEventListener("mouseup",OFH.slider.stopSliding,false);
            e.preventDefault();
        }
        OFH.slider.stopSliding = function(e) {
            document.getElementsByTagName("body")[0].removeEventListener("mousemove",OFH.slider.moveCursor,false);
            document.getElementsByTagName("body")[0].removeEventListener("mouseup",OFH.slider.stopSliding,false);
            e.preventDefault();
        }

        var speedLine = document.getElementById("fleetBriefingPart1").children[0];
        var i,slider,pointer;

        speedLine.parentNode.parentNode.removeChild(speedLine.parentNode.nextElementSibling.nextElementSibling); // remove the BE clearfloat which mess the view

        speedLine.appendChild(document.createElement("br"));
        slider = document.createElement("span");
        slider.setAttribute("class","OFH slider");
        slider.addEventListener("click",OFH.slider.moveCursor,false);
        slider.addEventListener("mousedown",OFH.slider.startSliding,false)

        pointer = document.createElement("img");
        pointer.setAttribute("class","sliderPointer");
        pointer.setAttribute("id","OFH_speedSlider");
        pointer.setAttribute("alt","|");
        pointer.setAttribute("src",img_ship_mov);
        pointer.addEventListener("click",OFH.slider.updateSpeed,false);
        slider.appendChild(pointer);
        speedLine.appendChild(slider);

        speedSelect.addEventListener("change",OFH.slider.updatePosition,false);
        speedSelect.addEventListener("keyup",OFH.slider.updatePosition,false);

        GM_addStyle(".OFH.slider {display:block;margin-top:1px;height:20px;width:160px;position:relative;border:1px solid #DDD;border-radius:5px;background:url(\""+img_starstreak+"\") no-repeat scroll -108px -11px transparent;}");
        GM_addStyle(".OFH.slider .sliderPointer {position:absolute;top:2px;left:146px;width:11px;transform: rotate(90deg);}");

        try { // In case of a "back" action, we should update at the current speed
            OFH.slider.updatePosition();
            document.getElementsByTagName("body")[0].addEventListener("load",function(e){alert('load');OFH.slider.updatePosition();},false);
        } catch(e) {}
    }
} catch(e) {if(DEBUG) alert("OFH Error(speed slider)\n"+e.toString());OFH.errors.push("OFH Error(speed slider)\n"+e.toString());}

try{ // Then Last target shortcut

	var lastTarCode = GM_getValue("OFH_"+universe+"."+lang+"_lastDestination");
	
	if(lastTarCode) {
		var select = document.getElementById("slbox"), lastTar,tarButtonText,option;
		var lastTarValues = /([^#]+)#([^#]+)#([^#]+)#([^#]+)#([^#]+)/.exec(lastTarCode);
		var fullName = lastTarValues[5]+" ["+lastTarValues[1]+":"+lastTarValues[2]+":"+lastTarValues[3]+"]"+((lastTarValues[4]=="3")?" (moon)":"");
		
		option = document.createElement("option");
			option.setAttribute("value",lastTarCode);
			
			option.appendChild(document.createTextNode(fullName));
		select.appendChild(option);
		
		lastTar = document.createElement("button");
			lastTar.setAttribute("type","button");
			lastTar.setAttribute("class","lastTar OFH tipsStandard");
			lastTar.setAttribute("onclick","event.preventDefault();document.getElementById(\"slbox\").value = \""+lastTarCode+"\";shortLinkChange();updateVariables();");
			lastTar.setAttribute("title","Change destination to:<BR /><B>"+fullName+"</B>");
			
			tarButtonText = document.createElement("span");
				tarButtonText.setAttribute("style","width:100%;display:block;overflow:hidden;");
				
				tarButtonText.appendChild(document.createTextNode(fullName));
			lastTar.appendChild(tarButtonText);
		select.parentNode.appendChild(lastTar);
		
		GM_addStyle(".OFH.lastTar {position:relative;padding: 0 0 2px;font-size:1em;overflow:hidden;border:1px solid #191E23;width:144px;background:black;color:white;cursor:pointer;}");
		GM_addStyle(".OFH.lastTar:hover {background:#000011;color:white;}");
		GM_addStyle(".OFH.lastTar:active {background:#848484;color:white;}");
		
		select.style.display = "none";
	}
	
} catch(e) {if(DEBUG) alert("OFH Error(Last target shortcut)\n"+e.toString());OFH.errors.push("OFH Error(Last target shortcut)\n"+e.toString());}
	
} // fleet 2

else if(fleetLocationActual == "3") {

try { // Last Target Save

	var save,t_res;
	t_res = /\[([0-9]+):([0-9]+):([0-9]+)\] (.*)/.exec(document.getElementById("roundup").firstElementChild.children[1].firstElementChild.textContent);
	save=t_res[1]+"#"; // Galaxy
	save+=t_res[2]+"#"; // System
	save+=t_res[3]+"#"; // Position
	save+=document.getElementsByName("type")[0].value+"#"; // Type
	save+=t_res[4]; // Name
	GM_setValue("OFH_"+universe+"."+lang+"_lastDestination",save);
	
} catch(e) {if(DEBUG) alert("OFH Error(Last target save)\n"+e.toString());OFH.errors.push("OFH Error(Last target save)\n"+e.toString());}

} // fleet 3


} catch(e) { // Global exception handler
	if(DEBUG)
		alert("OFH Error\n"+e.toString());
	OFH.errors.push("OFH Error\n"+e.toString());
}

unsafeWindow.OFH = OFH;

//-- Utils (if anyone want to use this part for a "utils" script, feel free to do so)--//

function addDotsToInt(num) {
	var str = new String(num);
	var res = new String;
	var count = 0;
	for(i=str.length-1;i>=0;--i && ++count) {
		res = str[i].concat(res);
		if(count==2) { count=0;res = String(".").concat(res);}
	}
	return res;
}