// ==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.5
// @namespace https://greasyfork.org/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 foreign ship.
// Added: "Changed Target" warning added. Cargo in old 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
//v0.4 Optimised transfer() code
//v0.5 Horwasp fixes
//To-do:
//Toggle overload beam on/off??
function wrapper () { // wrapper for injection
if (vgap.version < 3) {
console.log("Cross beam needs Nu version 3 or above");
return;
}//if
//Can't beam cargo to Horwasp ships/pods
var horwaspHulls = [115, 117, 118, 119, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211];
var plugin = {
draw: function() {
//check for possible crossbeam
if (vgap.shipScreenOpen && !$("#CrossBeamButton").length) {
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;
//check for valid foreign targets
for (var i = 0; i < ships.length; i+=1) {
var ship= ships[i];
//exclude my ships
if (ship.ownerid === me)
continue;
//exclude Horwasp hulls
var validTarget= true;
for (var wasp=0; wasp<horwaspHulls.length; wasp+=1) {
var waspHull= horwaspHulls[wasp];
if (ship.hullid === waspHull) {
validTarget= false;
break;
}//if
}//for
if (!validTarget)
continue;
//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;
}//for
}//if
},//draw
};//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) {
var ship= ships[i];
//ignore my ships
if (ship.ownerid === me)
continue;
//ignore Horwasp hulls
var validTarget= true;
for (var wasp=0; wasp<horwaspHulls.length; wasp+=1) {
var waspHull= horwaspHulls[wasp];
if (ship.hullid === waspHull) {
validTarget= false;
break;
}//if
}//for
if (!validTarget)
continue;
//add ship to list of possible targets
count+=1;
toShip= ship;
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");
}//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;
//check for warning
var warning= "";
var beamInProgress= (sumCargoBeam(viaShip) || viaShip.transferneutronium);
if (beamInProgress && (viaShip.transfertargetid != toShipID || viaShip.transfertargettype != 2)) {
//give warning
warning = "<br/>Warning: You have changed transfer target. ";
warning += "You can only transfer to one foreign ship or planet per turn, or jettison. ";
warning += "Any jettison or transfer you were doing to another foreign ship or planet has been cancelled.<br/>";
//cancel old beam 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;
}//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>";
html += "<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><td><div id='NeutroniumTransfer'></div></td><td class='TransferVal'>" + viaShip.transferneutronium + "</td>";
html += "<td class='valsup'>/" + rightFueltank + "</td></tr>";
html += "<tr><td>Duranium: </td><td class='TransferVal'>" + fromPlanet.duranium + "</td>";
html += "<td></td><td><div id='DuraniumTransfer'></div></td>";
html += "<td class='TransferVal'>" + viaShip.transferduranium + "</td><td class='valsup'></td></tr>";
html += "<tr><td>Tritanium: </td><td class='TransferVal'>" + fromPlanet.tritanium + "</td>";
html += "<td></td><td><div id='TritaniumTransfer'></div></td>";
html += "<td class='TransferVal'>" + viaShip.transfertritanium + "</td><td class='valsup'></td></tr>";
html += "<tr><td>Molybdenum: </td><td class='TransferVal'>" + fromPlanet.molybdenum + "</td>";
html += "<td></td><td><div id='MolybdenumTransfer'></div></td>";
html += "<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>";
html += "<td></td><td><div id='SuppliesTransfer'></div></td>";
html += "<td class='TransferVal'>" + viaShip.transfersupplies + "</td><td class='valsup'></td></tr>";
}//if
html += "<tr><td>Clans: </td><td class='TransferVal'>" + fromPlanet.clans + "</td>";
html += "<td></td><td><div id='ClansTransfer'></div></td>";
html += "<td class='TransferVal'>" + viaShip.transferclans + "</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>";
html += "<td class='valsup'>/" + rightCargo + "</td></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("neutronium", change, viaShip, toShip, fromPlanet); }, 1000);
$("#DuraniumTransfer").leftRight(function (change) { transfer("duranium", change, viaShip, toShip, fromPlanet); }, 1000);
$("#TritaniumTransfer").leftRight(function (change) { transfer("tritanium", change, viaShip, toShip, fromPlanet); }, 1000);
$("#MolybdenumTransfer").leftRight(function (change) { transfer("molybdenum", change, viaShip, toShip, fromPlanet); }, 1000);
$("#SuppliesTransfer").leftRight(function (change) { transfer("supplies", change, viaShip, toShip, fromPlanet); }, 1000);
$("#ClansTransfer").leftRight(function (change) { transfer("clans", change, viaShip, toShip, fromPlanet); }, 1000);
vgap.showMore(580);
vgap.save();
}//crossBeam
function transfer(type, change, viaShip, toShip, fromPlanet) {
var transferType= "transfer"+type;
//planet to ship: maximum is what is on surface
if (change > 0 && fromPlanet[type] < change)
change = fromPlanet[type];
//ship to planet: maximum is what is on ship
if (change < 0 && viaShip[transferType] < Math.abs(change))
change = -1 * viaShip[transferType];
/*
//dont beam more than receiving ship can hold
if (type==="neutronium") {
var toShipfueltank= vgap.getHull(toShip.hullid).fueltank;
if (change + viaShip[transferType] > toShipfueltank)
change= toShipfueltank- viaShip[transferType];
} else
change = checkTotalRight(change, viaShip, toShip);
*/
//make it so!
fromPlanet[type] -= change;
viaShip[transferType] += change;
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);