Planets.nu ship templates

Adds saving to and building from ship templates

// ==UserScript==
// @name          Planets.nu ship templates
// @description   Adds saving to and building from ship templates
// @include       http://planets.nu/*
// @version 0.7
// @namespace https://greasyfork.org/users/2874
// ==/UserScript==

/*------------------------------------------------------------------------------
 1. When at the Ship Assembly screen is displayed, if there is a hull selected,
    show a "Save Template" button. When selected, Save the currently ship config
    as a templatte.
 2. If no hull is selected, display the list of available templates. Options to
    build (if mineral/tech requirements met) or delete template. Highlights
    deficiencies if unable to build.
 3. (ver 0.3) Adds planet cash/minerals to display, tweaks formatting.
 4. Modified display/etc to be more compact. 
 5. Added sorting by hulltech and hullid and a clear assembly button for the build screen.
 6. Moved template storage to localStorage by race
 7. Removed nameclash with save/load functions
------------------------------------------------------------------------------*/


function wrapper () { // wrapper for injection
    
    if (vgap.version < 3.0) {
        console.log("vgapShipTemplates plugin requires at least NU version 3.0. Plugin disabled." );
        return;	
    }
    
    var plugin_version = 0.6;
    
    console.log("vgapShipTemplates plugin version: v" + plugin_version );
    
    vgaPlanets.prototype.setupAddOn = function (addOnName) {                
        if (vgaPlanets.prototype.addOns == null) 
            vgaPlanets.prototype.addOns = {};
        
        vgaPlanets.prototype.addOns[addOnName] = {};
        var settings = localStorage.getItem(addOnName + ".settings");
        if (settings != null)
            vgaPlanets.prototype.addOns[addOnName].settings = JSON.parse(settings);
        else
            vgaPlanets.prototype.addOns[addOnName].settings = {};
        
        vgaPlanets.prototype.addOns[addOnName].saveSettings = function () {
            localStorage.setItem(addOnName + ".settings", JSON.stringify(vgaPlanets.prototype.addOns[addOnName].settings));
        }
        
        vgaPlanets.prototype.addOns[addOnName].current = {};
    };
    
    vgaPlanets.prototype.setupAddOn("vgapShipTemplates");
    
    // Set to -USERSCRIPT_ID to try and prevent note type collisions
    vgaPlanets.prototype.addOns.vgapShipTemplates.notetype = 133678; 
    
    vgaPlanets.prototype.addOns.vgapShipTemplates.sortTemplates = function (a, b) {
        var hulla = vgap.getHull(a.buildhullid);
        var hullb = vgap.getHull(b.buildhullid);
        
        if (hulla.techlevel == hullb.techlevel) {
            return a.buildhullid - b.buildhullid;
        }
        
        return hulla.techlevel - hullb.techlevel;
    }
    
    
    vgaPlanets.prototype.addOns.vgapShipTemplates.saveTemplate = function () {
        var src = vgap.starbaseScreen.starbase;
        //console.log(src);
        trg = {};
        trg.buildhullid = src.buildhullid;
        trg.buildengineid = src.buildengineid;
        trg.buildbeamcount = src.buildbeamcount;
        trg.buildbeamid = src.buildbeamid;
        trg.buildtorpcount = src.buildtorpcount;
        trg.buildtorpedoid = src.buildtorpedoid;
        
        var hull = vgap.getHull(trg.buildhullid);
        var engine = vgap.getEngine(trg.buildengineid);
        var beam = vgap.getBeam(trg.buildbeamid);
        var torpedo = vgap.getTorpedo(trg.buildtorpedoid);
        trg.cost = hull.cost + (hull.engines * (engine != null ? engine.cost : 0)) + (trg.buildbeamcount * (beam != null ? beam.cost : 0))+ (trg.buildtorpcount * (torpedo != null ? torpedo.launchercost : 0));
        trg.duranium = hull.duranium + (hull.engines * (engine != null ? engine.duranium : 0)) + (trg.buildbeamcount * (beam != null ? beam.duranium : 0))+ (trg.buildtorpcount * (torpedo != null ? torpedo.duranium : 0));
        trg.tritanium = hull.tritanium + (hull.engines * (engine != null ? engine.tritanium : 0)) + (trg.buildbeamcount * (beam != null ? beam.tritanium : 0))+ (trg.buildtorpcount * (torpedo != null ? torpedo.tritanium : 0));
        trg.molybdenum = hull.molybdenum + (hull.engines * (engine != null ? engine.molybdenum : 0)) + (trg.buildbeamcount * (beam != null ? beam.molybdenum : 0))+ (trg.buildtorpcount * (torpedo != null ? torpedo.molybdenum : 0));
        console.log(trg);
        vgap.addOns.vgapShipTemplates.templates.push(trg);
        vgap.addOns.vgapShipTemplates.saveObjectLocal(vgap.addOns.vgapShipTemplates.templates);
        $("#SaveTemplate").hide();
    };
    
    vgaPlanets.prototype.addOns.vgapShipTemplates.deleteTemplate = function (index) {
        vgap.addOns.vgapShipTemplates.templates.splice(index, 1);   
        vgap.addOns.vgapShipTemplates.saveObjectLocal(vgap.addOns.vgapShipTemplates.templates);
    };
    
    vgaPlanets.prototype.addOns.vgapShipTemplates.buildFromTemplate = function (index) {        
        // console.log("buildFromTemplate");
        
        var template = vgap.addOns.vgapShipTemplates.templates[index];
        var hull = vgap.getHull(template.buildhullid);
        vgap.starbaseScreen.buyHull(1, template.buildhullid);
        if (template.buildengineid > 0)
            vgap.starbaseScreen.buyEngine(hull.engines, template.buildengineid);
        if (template.buildbeamcount > 0)
            vgap.starbaseScreen.buyBeam(template.buildbeamcount, template.buildbeamid);
        if (template.buildtorpcount > 0)
            vgap.starbaseScreen.buyLauncher(template.buildtorpcount, template.buildtorpedoid);
        
        var src = template;
        var trg = vgap.starbaseScreen.starbase;
        trg.buildhullid = src.buildhullid;
        trg.buildengineid = src.buildengineid;
        trg.buildbeamcount = src.buildbeamcount;
        trg.buildbeamid = src.buildbeamid;
        trg.buildtorpcount = src.buildtorpcount;
        trg.buildtorpedoid = src.buildtorpedoid;
        
        vgap.starbaseScreen.showAssembly();
        $("#SaveTemplate").hide();        
    };
    
    vgaPlanets.prototype.addOns.vgapShipTemplates.clearAssembly = function () {
        vgap.starbaseScreen.clearAssembly();
        console.log("Clear Assembly");
    };
    
    vgap.addOns.vgapShipTemplates.saveObjectLocal = function (obj) {        
        localStorage.removeItem("vgapShipTemplates" + vgap.player.raceid);
        localStorage.setItem("vgapShipTemplates" + vgap.player.raceid, JSON.stringify(obj)); 
        //console.log("setTemplates: " + "vgapShipTemplates" + vgap.player.raceid + " : " + localStorage.getItem("vgapShipTemplates" + vgap.player.raceid));
        
    };
    
    
    vgap.addOns.vgapShipTemplates.getObjectLocal = function () {    
        //console.log("getTemplates");
        return JSON.parse(localStorage.getItem("vgapShipTemplates" + vgap.player.raceid));        
    };
    
    
    var old_processLoad = vgaPlanets.prototype.processLoad; 
    vgaPlanets.prototype.processLoad = function (result) {      
        // console.log("processLoad: " + result);
        // console.log("      apply: " + arguments);
        old_processLoad.apply(this, arguments);
        
        if (result.success) {
            var templates = vgap.addOns.vgapShipTemplates.getObjectLocal();
            //console.log("   template: " + templates);
            if (templates == null)
                templates = [];
            this.addOns.vgapShipTemplates.templates = templates;
        }        
    };
    
    var old_showAssembly = vgapStarbaseScreen.prototype.showAssembly;
    vgapStarbaseScreen.prototype.showAssembly = function () {        
        console.log("showAssembly");
        
        old_showAssembly.apply(this, arguments);
        
        var starbase = this.starbase;7
        if (starbase.buildhullid > 0) {
            var html = "<div><table class='CleanTable'>" +
                "<tr><td><div id='SaveTemplate' class='MoreActionButton' onclick='vgap.addOns.vgapShipTemplates.saveTemplate();'>Save Template</div></td></tr>" + 
                "<tr><td><div id='ClearAssembly' class='MoreActionButton' onclick='vgap.addOns.vgapShipTemplates.clearAssembly();'>Clear Assembly</div></td></tr></table></div>";
            $("#AssemblyBack").after(html);
            //console.log("showAssembly - Save");
        }
        else{
            
            //console.log("showAssembly - List");
            
            var templist = "<div id='TemplateList'><table class='CleanTable'>";
            
            
            vgap.addOns.vgapShipTemplates.templates.sort(vgaPlanets.prototype.addOns.vgapShipTemplates.sortTemplates);
            /*var temps = vgap.addOns.vgapShipTemplates.templates;
            if (temps.length > 1) {
                for (i=0; i < temps.length; i++) {                          
                    for (j=0; j < temps.length -1; j++) {
                        if (temps[j].buildhullid > temps[j+1].buildhullid) {
                            var tempTemp = temps[j+1];
                            temps[j+1] = temps[j];
                            temps[j] = tempTemp;
                        }
                    }  
                }
            }*/
            
            for (i=0; i<vgap.addOns.vgapShipTemplates.templates.length; i++) {
                var template = vgap.addOns.vgapShipTemplates.templates[i];
                var hull = vgap.getHull(template.buildhullid);
                var engine = vgap.getEngine(template.buildengineid);
                var beam = vgap.getBeam(template.buildbeamid);
                var torpedo = vgap.getTorpedo(template.buildtorpedoid);
                var planet = vgap.getPlanet(starbase.planetid);           
                var ok_cost = planet.megacredits >= template.cost;
                var ok_duranium = planet.duranium >= template.duranium;
                var ok_tritanium = planet.tritanium >= template.tritanium;
                var ok_molybdenum = planet.molybdenum >= template.molybdenum;
                var ok_techhull = (starbase.hulltechlevel >= hull.techlevel);
                var ok_techengine = (engine == null || starbase.enginetechlevel >= engine.techlevel);
                var ok_techbeam = (beam == null || starbase.beamtechlevel >= beam.techlevel);
                var ok_techtorpedo = (torpedo == null || starbase.torptechlevel >= torpedo.techlevel);
                var ok_all = ok_cost && ok_duranium && ok_tritanium && ok_molybdenum && ok_techhull && ok_techengine && ok_techbeam && ok_techtorpedo;
                
                console.log(hull + engine + beam + torpedo);
                
                templist += "<tr>" + 
                    "<td>" 		  + (ok_all ? "<div class='MoreActionButton' onclick='vgap.addOns.vgapShipTemplates.buildFromTemplate(" + i + ");'>Build </div>" : "<span class='BadText'>Can't Build </span>") + "</td>" +                    
                    "<td colspan=4class='" + (!ok_techhull ?  "BadText" : "") + "'>" + hull.name.toUpperCase() + "</td>" +
                    
                    "</tr>";
                
                templist += "<tr>" +
                    "<td><div class='MoreActionButton' onclick='vgap.addOns.vgapShipTemplates.deleteTemplate(" + i + ");vgap.starbaseScreen.showAssembly();'>Del  </div></td>" + 
                    "<td class='" + (!ok_techengine ? "BadText" : "") + "'>" + (engine != null ? hull.engines + "x " + engine.name : "") + "</td>" +
                    "<td class='" + (!ok_techbeam ? "BadText" : "") + "'>" + (beam != null ? template.buildbeamcount + "x " + beam.name : "") + "</td>" +
                    "<td class='" + (!ok_techtorpedo ? "BadText" : "") + "'>" + (torpedo != null ? template.buildtorpcount + "x " + torpedo.name : (hull.fighterbays>0 ? hull.fighterbays + "x Fighter Bays" : "")) + "</td>" +                    
                    "</tr>";
                
                templist += "<tr>" +
                    "<td></td>" +
                    "<td class='" + (!ok_cost ? "BadText" : "") + "'> M: " + template.cost + "(" + planet.megacredits + ")</td>" + 
                    "<td class='" + (!ok_duranium ? "BadText" : "") + "'> D: " + template.duranium + "(" + planet.duranium + ")</td>" +                    
                    "<td class='" + (!ok_tritanium ? "BadText" : "") + "'> T: " + template.tritanium + "(" + planet.tritanium + ")</td>" +                    
                    "<td class='" + (!ok_molybdenum ? "BadText" : "") + "'> M: " + template.molybdenum + "(" + planet.molybdenum + ")</td>" +
                    "</tr>";
                
                templist += "<tr><td colspan=5><hr></td></tr>";          
            }
            templist += "</table></div>";
            
            $(templist).appendTo("#MoreScreen");
            $("#TemplateList td").attr("style", "padding-right: 10px;");
            $("#TemplateList").height($(window).height() - 100);
            //console.log($("*").queue());
            setTimeout(function () {$("#TemplateList").jScrollPane();}, 500);
        }
        
    };
    
}


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