SINGULARITY'S Cross beam

Allows a ship to beam from planet to foreign ship directly

目前為 2017-04-18 提交的版本,檢視 最新版本

// ==UserScript==
// @name			SINGULARITY'S Cross beam
// @description		Allows a ship to beam from planet to foreign ship directly
// @author			Singularity
// @include			http://planets.nu/home
// @include			http://planets.nu/games/*
// @include			http://*.planets.nu/*
// @include			http://planets.nu/*
// @version			0.3.2
// @namespace https://gf.qytechs.cn/users/15085
// ==/UserScript==

//History

//v0.1    Experimental Cross beam app. Works for NDTMSC. Button is buggy.
//v0.2    Fixed bug: Ships in deep space could not open shipscreen.
//v0.3    Fixed bug: Now correctly targets foreign ships, not just highest ID forign ship.
//        Added: Change target warning added & cargo in beam now dropped to surface.
//        Updated: crossBeamTarget() now more consistant with other code
//v0.3.1  Updated: lets you overload target cargo bay to destroy cargo
//v0.3.2  Updated: lets you overload target fuel tank to destroy fuel



//To-do:
//HIGH: Allow safety override to beam more fuel/cargo than the destination can accept
//Stop multiple ships cross beaming to one target? In excess of cargo bay?
//Better button on shipScreen
//optimise transfer() function
//add beam target text
//is it possible to transfer torps and fighters to foreign ships? Or Mcr?


function wrapper () { // wrapper for injection

	if (vgap.version < 3) {
		console.log("Cross beam needs Nu version 3 or above");
		return;
	}//if


	var plugin = {
		loadship: function() {

			//check for possible crossbeam
			var ships= vgap.shipScreen.ships;
			var planet= vgap.shipScreen.planet;
			var me= vgap.player.id;


			//are we over one of my planets with other ships?
			if (!defined(planet) || planet.ownerid !== me || ships.length===1)
				return;


			//are any of those ships foreign (except horwasp pods)?
			for (var i = 0; i < ships.length; i+=1) {
				if (ships[i].ownerid !== me  && (ships[i].hullid < 200 || ships[i].hullid > 300)) {

					//add cross beam button
					var html = '<input name="CrossBeamButton" id="CrossBeamButton" type="button" class="SepButton" value="Cross Beam">';
					$('#ShipCargo').append(html);
					$('#CrossBeamButton').click( function(event) { crossBeamTarget(); } );

					return; //add it only once!

				}//if
			}//for

		},//loadship
	};//plugin


	function crossBeamTarget () {

		var viaShip= vgap.shipScreen.ship;
		var ships= vgap.shipScreen.ships;
		var fromPlanet= vgap.shipScreen.planet;
		var me= vgap.player.id;

		vgap.more.empty();

		$("<div id='SelectLocation'><h1>" + nu.t.selecttransfertarget + "</h1></div>").appendTo(vgap.more);
		vgap.transferScreen.onchange = function () {

			vgap.shipScreen.screen.refresh();
			vgap.loadWaypoints();
			vgap.map.draw();
		};


		var count = 0;
		var toShip = null; //keep track of the last foreign ship in case we only have one

		for (var i = 0; i < ships.length; i+=1) {
			if (ships[i].ownerid !== me && (ships[i].hullid < 200 || ships[i].hullid > 300)) {
				count+=1;
				toShip = ships[i];

				var select = function (viaShipID, toShipID, fromPlanetID) {
					return function () {    crossBeam(viaShipID, toShipID, fromPlanetID);    };
				};

				$(shtml.shipTransferView(ships[i])).tclick(select(viaShip.id, toShip.id, fromPlanet.id)).appendTo("#SelectLocation");


			}//if
		}//for

		shtml.moreBack();

		if (count === 1) {
			crossBeam(viaShip.id, toShip.id, fromPlanet.id);
			return;
		}//if


		vgap.showMore(340);
		if ($("#SelectLocation").height() > ($(window).height() - 100))
			$("#SelectLocation").height($(window).height() - 100);
		$("#SelectLocation").jScrollPane();

		vgap.action();
	}//crossBeamTarget




	function crossBeam(viaShipID, toShipID, fromPlanetID) {

		var viaShip= vgap.getShip(viaShipID);
		var toShip= vgap.getShip(toShipID);
		var fromPlanet = vgap.getPlanet(fromPlanetID);

		var hulldata= vgap.getHull(toShip.hullid);
		var rightCargo= hulldata.cargo;
		var rightFueltank= hulldata.fueltank;

		var showFighters= false;
		var showTorps= false;


		//check for warning
		var warning= "";
		var beamInProgress= (sumCargoBeam(viaShip)>0 || viaShip.transferneutronium>0);

		if (beamInProgress && (viaShip.transfertargetid != toShipID || viaShip.transfertargettype != 2)) {

			//give warning
			warning= "<br/>Warning: You have changed transfer target.  You can only transfer to one foreign ship or planet per turn, or jettison. Any jettison or transfer you were doing to another foreign ship or planet has been cancelled.<br/>";

			//cancel old transfer by dropping cargo to the surface
			fromPlanet.neutronium+= viaShip.transferneutronium;
			fromPlanet.duranium+= viaShip.transferduranium;
			fromPlanet.tritanium+= viaShip.transfertritanium;
			fromPlanet.molybdenum+= viaShip.transfermolybdenum;
			fromPlanet.supplies+= viaShip.transfersupplies;
			fromPlanet.clans+= viaShip.transferclans;

			viaShip.transferneutronium= 0;
			viaShip.transferduranium= 0;
			viaShip.transfertritanium= 0;
			viaShip.transfermolybdenum= 0;
			viaShip.transfersupplies= 0;
			viaShip.transferclans= 0;

			//			viaShip.transferammo= 0;

		}//if


		//initiate new transfer
		viaShip.transfertargettype= 2;
		viaShip.transfertargetid= toShip.id;
		viaShip.changed= 1;
		toShip.changed= 1;
		fromPlanet.changed= 1;



		//make screen
		var html = "<div id='TransferScreen'>";
		html += "<h1>Cross beam</h1>";

		html += "<table width='100%' class='TransferTitle'><tr><td>" + fromPlanet.id + ": " + fromPlanet.name + "</td><td style='padding: 0 0 0 20px;text-align:right;'>" + toShip.id + ": " + toShip.name + "</td></tr></table>";
		html += "<table width='100%'>";
		html += "<tr><td>Neutronium: </td><td class='TransferVal'>" + fromPlanet.neutronium + "</td>";
		html += "<td></td>";
		html += "<td><div id='NeutroniumTransfer'></div></td><td class='TransferVal'>" + viaShip.transferneutronium + "</td>";
		html += "<td class='valsup'>/" + rightFueltank + "</td>"; //xxx

		html += "</tr>";
		html += "<tr><td>Duranium: </td><td class='TransferVal'>" + fromPlanet.duranium + "</td><td></td><td><div id='DuraniumTransfer'></div></td><td class='TransferVal'>" + viaShip.transferduranium + "</td><td class='valsup'></td></tr>";
		html += "<tr><td>Tritanium: </td><td class='TransferVal'>" + fromPlanet.tritanium + "</td><td></td><td><div id='TritaniumTransfer'></div></td><td class='TransferVal'>" + viaShip.transfertritanium + "</td><td class='valsup'></td></tr>";
		html += "<tr><td>Molybdenum: </td><td class='TransferVal'>" + fromPlanet.molybdenum + "</td><td></td><td><div id='MolybdenumTransfer'></div></td><td class='TransferVal'>" + viaShip.transfermolybdenum + "</td><td class='valsup'></td></tr>";

		if (vgap.player.raceid != 12)
			html += "<tr><td>Supplies: </td><td class='TransferVal'>" + fromPlanet.supplies + "</td><td></td><td><div id='SuppliesTransfer'></div></td><td class='TransferVal'>" + viaShip.transfersupplies + "</td><td class='valsup'></td></tr>";

		html += "<tr><td>Clans: </td><td class='TransferVal'>" + fromPlanet.clans + "</td><td></td><td><div id='ClansTransfer'></div></td><td class='TransferVal'>" + viaShip.transferclans + "</td><td class='valsup'></td></tr>";

		//		if (showFighters && vgap.player.raceid != 12)
		//			html += "<tr><td>Fighters: </td><td class='TransferVal'>" + fromPlanet.ammo + "</td><td></td><td><div id='FighterTransfer'></div></td><td class='TransferVal'>" + viaShip.transferammo + "</td><td class='valsup'></td></tr>";

		//		if (showTorps && vgap.player.raceid != 12)
		//			html += "<tr><td>Torpedos: </td><td class='TransferVal'>" + fromPlanet.ammo + "</td><td></td><td><div id='TorpedoTransfer'></div></td><td class='TransferVal'>" + viaShip.transferammo + "</td><td class='valsup'></td></tr>";


		html += "<tr><td></td><td></td><td></td>";
		html += "<td class='TransferTotalText'>Total:</td><td class='TransferVal'>" + sumCargoBeam(viaShip) + "</td><td class='valsup'>/" + rightCargo + "</td>";
		html += "</tr>";
		html += "</table>";
		html += "<div class='NeutralText'>" + warning + "</div>";
		html += "</div>";


		vgap.more.empty();
		$(html).appendTo(vgap.more);

		$("<a class='MoreBack'>OK</a>").tclick(function () {
			vgap.loadWaypoints();
			vgap.map.draw();
			vgap.closeMore();
			return false;
		}).appendTo(vgap.more);


		$("#NeutroniumTransfer").leftRight(function (change) { transfer("N", change, viaShip, toShip, fromPlanet); }, 1000);
		$("#DuraniumTransfer").leftRight(function (change) { transfer("D", change, viaShip, toShip, fromPlanet); }, 1000);
		$("#TritaniumTransfer").leftRight(function (change) { transfer("T", change, viaShip, toShip, fromPlanet); }, 1000);
		$("#MolybdenumTransfer").leftRight(function (change) { transfer("M", change, viaShip, toShip, fromPlanet); }, 1000);
		$("#SuppliesTransfer").leftRight(function (change) { transfer("S", change, viaShip, toShip, fromPlanet); }, 1000);
		$("#ClansTransfer").leftRight(function (change) { transfer("C", change, viaShip, toShip, fromPlanet); }, 1000);

		//		$("#FighterTransfer").leftRight(function (change) { vgap.transferScreen.transferFighters(change); }, 1000);
		//		$("#TorpedoTransfer").leftRight(function (change) { vgap.transferScreen.transferTorps(change); }, 1000);


		vgap.showMore(580);
		vgap.save();
	}//crossBeam




	function transfer(type, change, viaShip, toShip, fromPlanet) {

		if (type==="N") {
			//from planet to ship
			if (change > 0 && fromPlanet.neutronium < change)
				change = fromPlanet.neutronium;

			//from toShip to planet
			if (change < 0 && viaShip.transferneutronium < Math.abs(change))
				change = -1 * viaShip.transferneutronium;

			//limit by max fueltank on toShip
			var toShipfueltank= vgap.getHull(toShip.hullid).fueltank;
			//if (change + viaShip.transferneutronium > toShipfueltank)
			//	change= toShipfueltank- viaShip.transferneutronium;

			//make the change
			fromPlanet.neutronium -= change;
			viaShip.transferneutronium += change;
		}//N


		if (type==="D") {
			//from planet to ship
			if (change > 0 && fromPlanet.duranium < change)
				change = fromPlanet.duranium;

			//from toShip to planet
			if (change < 0 && viaShip.transferduranium < Math.abs(change))
				change = -1 * viaShip.transferduranium;

			//limit by max cargo on toShip
			change = checkTotalRight(change, viaShip, toShip);

			//make the change
			fromPlanet.duranium -= change;
			viaShip.transferduranium += change;
		}//D


		if (type==="T") {
			//from planet to ship
			if (change > 0 && fromPlanet.tritanium < change)
				change = fromPlanet.tritanium;

			//from toShip to planet
			if (change < 0 && viaShip.transfertritanium < Math.abs(change))
				change = -1 * viaShip.transfertritanium;

			//limit by max cargo on toShip
			change = checkTotalRight(change, viaShip, toShip);

			//make the change
			fromPlanet.tritanium -= change;
			viaShip.transfertritanium += change;
		}//T


		if (type==="M") {
			//from planet to ship
			if (change > 0 && fromPlanet.molybdenum < change)
				change = fromPlanet.molybdenum;

			//from toShip to planet
			if (change < 0 && viaShip.transfermolybdenum < Math.abs(change))
				change = -1 * viaShip.transfermolybdenum;

			//limit by max cargo on toShip
			change = checkTotalRight(change, viaShip, toShip);

			//make the change
			fromPlanet.molybdenum -= change;
			viaShip.transfermolybdenum += change;
		}//M


		if (type==="S") {
			//from planet to ship
			if (change > 0 && fromPlanet.supplies < change)
				change = fromPlanet.supplies;

			//from toShhip to planet
			if (change < 0 && viaShip.transfersupplies < Math.abs(change))
				change = -1 * viaShip.transfersupplies;

			//limit by max cargo on toShip
			change = checkTotalRight(change, viaShip, toShip);

			//make the change
			fromPlanet.supplies -= change;
			viaShip.transfersupplies += change;
		}//S

		if (type==="C") {
			//from planet to ship
			if (change > 0 && fromPlanet.clans < change)
				change = fromPlanet.clans;

			//from toShhip to planet
			if (change < 0 && viaShip.transferclans < Math.abs(change))
				change = -1 * viaShip.transferclans;

			//limit by max cargo on toShip
			change = checkTotalRight(change, viaShip, toShip);

			//make the change
			fromPlanet.clans -= change;
			viaShip.transferclans += change;
		}//C

		//refresh screen
		crossBeam(viaShip.id, toShip.id, fromPlanet.id);
	}//transfer



	function checkTotalRight (change, viaShip, toShip) {

		var totalCargo= sumCargoBeam(viaShip);
		var cargoSize= vgap.getHull(toShip.hullid).cargo;

		//if ((totalCargo + change) > cargoSize)
		//	change= cargoSize - totalCargo;

		return change;
	}//checkTotalRight



	function sumCargoBeam(ship) {
		//add up cargo in transfer beam

		var total= 0;
		total+= ship.transferduranium;
		total+= ship.transfertritanium;
		total+= ship.transfermolybdenum;
		total+= ship.transfersupplies;
		total+= ship.transferclans;
		total+= ship.transferammo;

		return total;
	}//sumCargoBeam


	function isNull(variable) {
		if(variable === null && typeof variable === "object")
			return true;
		else
			return false;
	}//isNull



	function defined(variable) {
		if (typeof variable !== 'undefined')
			return true;
		else
			return false;
	}//defined



	// register your plugin with NU
	vgap.registerPlugin(plugin, "Cross beam");


} //wrapper for injection

var script = document.createElement("script");
script.type = "application/javascript";
script.textContent = "(" + wrapper + ")();";

document.body.appendChild(script);    

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址