您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Library of functions for NU bot library
此脚本不应直接安装,它是供其他脚本使用的外部库。如果您需要使用该库,请在脚本元属性加入:// @require https://update.greasyfork.icu/scripts/47367/762362/VGA%20Bot-Core.js
// ==UserScript== // @name VGA Bot-Core // @namespace daunting/bot // @version 0.1 // @date 2018-04-01 // @author Daunting // @description Library of functions for NU bot library // @include http://planets.nu/* // @include http://play.planets.nu/* // @include http://test.planets.nu/* // @include userscript // @resource userscript https://greasyfork.org/en/scripts/35354-planets-nu-build-plan-plugin // @homepage http://planets.nu // ==/UserScript== function wrapper () { // wrapper for injection if (vgap.version < 3.0) { console.log("VGABot-Core plugin requires at least NU version 3.0. Plugin disabled." ); return; } var plugin_version = 0.1; console.log("VGABot-Core plugin version: v" + plugin_version ); /** * Specify your plugin * You need to have all those methods defined or errors will be thrown. * I inserted the print-outs in order to demonstrate when each method is * being called. Just comment them out once you know your way around. * * For any access to plugin class variables and methods, * "vgap.plugins["vgaBot"].my_variable" has to be used * instead of "this.my_variable". */ var vgaBotCore = { /** * processload: executed whenever a turn is loaded: either the current turn or * an older turn through time machine */ processload: function() { console.log("ProcessLoad: plugin called."); }, /** * loaddashboard: executed to rebuild the dashboard content after a turn is loaded */ loaddashboard: function() { console.log("LoadDashboard: plugin called."); }, /** * showdashboard: executed when switching from starmap to dashboard */ showdashboard: function() { console.log("ShowDashboard: plugin called."); }, /** * showsummary: executed when returning to the main screen of the dashboard */ showsummary: function() { console.log("ShowSummary: plugin called."); }, /** * loadmap: executed after the first turn has been loaded to create the map * as far as I can tell not executed again when using time machine */ loadmap: function() { console.log("LoadMap: plugin called."); }, /** * showmap: executed when switching from dashboard to starmap */ showmap: function() { console.log("ShowMap: plugin called."); }, /** * draw: executed on any click or drag on the starmap */ draw: function() { console.log("Draw: plugin called."); }, /** * loadplanet: executed a planet is selected on dashboard or starmap */ loadplanet: function() { console.log("LoadPlanet: plugin called."); }, /** * loadstarbase: executed a planet is selected on dashboard or starmap */ loadstarbase: function() { console.log("LoadStarbase: plugin called."); }, /** * loadship: executed a planet is selected on dashboard or starmap */ loadship: function() { console.log("LoadShip: plugin called."); }, /*************************************************************************************** * Custom plugin variables ***************************************************************************************/ missionEnum: { EXPLORATION: 0, HISS: 8, CLOAK: 9, BEAMFUEL: 10, BEAMDUR: 11, BEAMTRIT: 12, BEAMMOLY: 13, BEAMSUP: 14 }, /***************************** * Unload freighters ******************************/ unloadToPlanet: function(ship, planet) { vgap.plugins["vgaBotCore"].transferClans(ship, planet, ship.clans); vgap.plugins["vgaBotCore"].transferSupplies(ship, planet, ship.supplies); vgap.plugins["vgaBotCore"].transferDur(ship, planet, ship.duranium); vgap.plugins["vgaBotCore"].transferTrit(ship, planet, ship.tritanium); vgap.plugins["vgaBotCore"].transferMoly(ship, planet, ship.molybdenum); vgap.plugins["vgaBotCore"].transferCredits(ship, planet, ship.megacredits); }, transferClans: function(src, dest, nClans) { if (src.clans >= nClans) { if (dest.ownerid == src.ownerid) { dest.clans += nClans; dest.changed = 1; } else { src.transferclans += nClans; vgap.plugins["vgaBotCore"].setTransferTarget(src, dest); } src.clans -= nClans; src.changed = 1; } }, transferSupplies: function(src, dest, nSupplies) { if (src.supplies >= nSupplies) { if (dest.ownerid == src.ownerid) { dest.supplies += nSupplies; dest.changed = 1; } else { src.transfersupplies += nSupplies; vgap.plugins["vgaBotCore"].setTransferTarget(src, dest); } src.supplies -= nSupplies; src.changed = 1; } }, transferDur: function(src, dest, nDur) { if (src.duranium >= nDur) { if (dest.ownerid == src.ownerid) { dest.duranium += nDur; dest.changed = 1; } else { src.transferduranium += nDur; vgap.plugins["vgaBotCore"].setTransferTarget(src, dest); } src.duranium -= nDur; src.changed = 1; } }, transferTrit: function(src, dest, nTrit) { if (src.tritanium >= nTrit) { if (dest.ownerid == src.ownerid) { dest.tritanium += nTrit; dest.changed = 1; } else { src.transfertritanium += nTrit; vgap.plugins["vgaBotCore"].setTransferTarget(src, dest); } src.tritanium -= nTrit; src.changed = 1; } }, transferMoly: function(src, dest, nMoly) { if (src.molybdenum >= nMoly) { if (dest.ownerid == src.ownerid) { dest.molybdenum += nMoly; dest.changed = 1; } else { src.transfermolybdenum += nMoly; vgap.plugins["vgaBotCore"].setTransferTarget(src, dest); } src.molybdenum -= nMoly; src.changed = 1; } }, transferCredits: function(src, dest, nCredits) { if (src.megacredits >= nCredits && dest.ownerid == src.ownerid) { dest.megacredits += nCredits; src.megacredits -= nCredits; src.changed = 1; dest.changed = 1; } }, setTransferTarget: function(src, dest) { src.transfertargetid = dest.id; if (dest.isPlanet) src.transfertargettype = 1; else if (dest.isShip) src.transfertargettype = 0; }, /***************************** * Move Ships ******************************/ findNearestStarbase: function(target) { var min = 100000; var ret = null; for (var i=0; i<vgap.planets.length; i++) { var planet = vgap.planets[i]; if ( planet.ownerid == vgap.player.id && planet.isbase) { var distance = vgap.plugins["vgaBotCore"].calcDistance(planet, target); if (distance < min) { min = distance; ret = planet; } } } return ret; }, orbittingPlanet: function(ship) { for (var i=0; i<vgap.planets.length; i++) { var planet = vgap.planets[i]; if ( (ship.x == planet.x && ship.y == planet.y) ) return planet; } return null; }, /** * TODO: Need to make sure ships don't go to the same planet. */ findNearestUnownedPlanet: function(thing) { var min = 100000; var ret = null; for (var i=0; i<vgap.planets.length; i++) { var planet = vgap.planets[i]; if ( (thing.x != planet.x || thing.y != planet.y) && planet.ownerid == 0) { var distance = vgap.plugins["vgaBotCore"].calcDistance(planet, thing); if (distance < min) { min = distance; ret = planet; } } } return ret; }, findNearestEnemyPlanet: function(thing) { var min = 100000; var ret = null; for (var i=0; i<vgap.planets.length; i++) { var planet = vgap.planets[i]; if ( (thing.x != planet.x || thing.y != planet.y) && planet.ownerid != 0 && planet.ownerid != vgap.player.id) { var distance = vgap.plugins["vgaBotCore"].calcDistance(planet, thing); if (distance < min) { min = distance; ret = planet; } } } return ret; }, calcDistance: function(a, b) { return Math.sqrt(Math.pow(a.x-b.x,2) + Math.pow(a.y-b.y,2)); }, createWaypoint: function(ship, dest) { var waypoint = {id:ship.id, x1:ship.x, y1:ship.y, x2:dest.x, y2:dest.y, color:"#009900", dasharray:null}; ship.lastwaypoint=waypoint; //vgap.waypoints.push(waypoint); ship.targetx = dest.x; ship.targety = dest.y; ship.target = dest; ship.warp = ship.engineid; ship.changed = 1; }, clearWaypoint: function(ship) { ship.lastwaypoint=null; ship.targetx = ship.x; ship.targety = ship.y; ship.target = null; ship.changed = 1; }, loadFuel: function(ship) { var fuelAvailable = vgap.plugins["vgaBotCore"].getFuelAvailable(ship); var planet = vgap.plugins["vgaBotCore"].orbittingPlanet(ship); var sbPlanet = vgap.plugins["vgaBotCore"].findNearestStarbase(ship.target); var returnFuel = vgap.plugins["vgaBotCore"].calcFuelConsumption(ship, ship.target, sbPlanet, false); var needed = vgap.plugins["vgaBotCore"].calcFuelConsumption(ship, ship, ship.target, true) + returnFuel; var added = 0; console.log("Ship " + ship.id + ": Needed: " + needed + " Ship: " + ship.neutronium + " Available: " + fuelAvailable + " Return: " + returnFuel); while (needed > ship.neutronium && needed < fuelAvailable) { if (needed > ship.neutronium) { if (planet != null && planet.ownerid == vgap.player.id) { var adding = needed - ship.neutronium; added += adding; planet.neutronium -= adding; ship.neutronium += adding; } } needed = vgap.plugins["vgaBotCore"].calcFuelConsumption(ship, ship, ship.target, true) + returnFuel; } if (ship.neutronium < needed && added > 0) { ship.neutronium -= added; planet.neutronium += added; } else if (planet != null && planet.neutronium > 0 && planet.ownerid == vgap.player.id) { planet.neutronium -= 1; ship.neutronium += 1; } console.log("Added fuel: " + added); return ship.neutronium >= needed; }, calcFuelConsumption: function(ship, start, dest, includeCargo) { var fuelFactor = vgap.plugins["vgaBotCore"].getFuelFactor(ship); var mass = vgap.plugins["vgaBotCore"].getMass(ship, includeCargo); var distance = vgap.plugins["vgaBotCore"].calcDistance(start, dest); var cloakFuel = 0; if (ship.mission == vgap.plugins["vgaBotCore"].missionEnum.CLOAK) { var turns = Math.ceil(distance / Math.pow(ship.engineid,2)); var hull = vgap.getHull(ship.hullid); cloakFuel = Math.ceil(hull.mass / 20) * turns; } console.log("mass: " + mass + " cloakFuel: " + cloakFuel + " distance: " + distance + " factor: " + fuelFactor); return Math.truncate(fuelFactor * Math.truncate(mass / 10) * Math.truncate(distance / Math.pow(ship.engineid,2)) / 10000) + cloakFuel; }, getFuelFactor: function(ship) { var engine = vgap.getEngine(ship.engineid); return engine.warps[ship.engineid-1]; }, getMass: function(ship, includeCargo) { var mass = 0; var hull = vgap.getHull(ship.hullid); mass += hull.mass; if (ship.torpedoid != 0) { var torps = vgap.getTorpedo(ship.torpedoid); mass += torps.mass * ship.torps; } if (ship.beamid != 0) { var beam = vgap.getBeam(ship.beamid); mass += beam.mass * ship.beams; } //Will still have ammo mass += ship.ammo; if (includeCargo) { mass += ship.duranium + ship.tritanium + ship.molybdenum + ship.supplies + ship.clans + ship.neutronium; } return mass; }, getFuelAvailable: function(ship) { var planet = vgap.plugins["vgaBotCore"].orbittingPlanet(ship); var fuel = ship.neutronium; if (planet != null && planet.ownerid == ship.ownerid) fuel += planet.neutronium; return fuel; }, /**************************** * Intel *****************************/ hasOrbitingShip: function(planet) { var ret = false; for (var i=0; i<vgap.myships.length; i++) { var ship = vgap.myships[i]; if (ship.x == planet.x && ship.y == planet.y) ret = true; } return ret; }, shouldCloak: function(ship) { var cloak = true; var hull = vgap.getHull(ship.hullid); //Can it cloak? if (!hull.cancloak) cloak = false; //Is it moving (currently only cloaking when moving ...)? //TODO: Put in tactical decision to cloak on friendly planets or in space. if (cloak) { if (ship.target == null) cloak = false; } //Target a friendly planet? if (cloak) { if (ship.target.isPlanet && ship.target.ownerid == ship.ownerid) cloak = false; } return cloak; }, /**************************** * Build Ships *****************************/ calcShipCredits: function(shipAssembly, base) { console.log("Ship hull name: " + shipAssembly.hull.name); var credits = shipAssembly.hull.cost + shipAssembly.hull.engines * shipAssembly.engine.cost; if (shipAssembly.hull.launchers != 0 && shipAssembly.torp != null) credits += shipAssembly.hull.launchers * shipAssembly.torp.launchercost; if (shipAssembly.hull.beams != 0 && shipAssembly.beam != null) credits += shipAssembly.hull.beams * shipAssembly.beam.cost; credits += vgap.plugins["vgaBotCore"].calcTechCost(base.hulltechlevel, shipAssembly.hull.techlevel); credits += vgap.plugins["vgaBotCore"].calcTechCost(base.enginetechlevel, shipAssembly.engine.techlevel); credits += vgap.plugins["vgaBotCore"].calcTechCost(base.torptechlevel, shipAssembly.torp.techlevel); credits += vgap.plugins["vgaBotCore"].calcTechCost(base.beamtechlevel, shipAssembly.beam.techlevel); return credits; }, calcTechCost: function(baseTech, shipTech) { var cost = 0; if (baseTech < shipTech) { for (i=baseTech; i<shipTech; i++) cost += i*100; } //Have we upgraded to level 9 (i.e. 10) if (shipTech == 9 && cost > 0) cost += 900; if (cost > 0) { console.log("Tech Cost: " + cost); console.log("Upgrade from " + baseTech + " to " + shipTech); } return cost; }, calcShipDur: function(shipAssembly) { var dur = shipAssembly.hull.duranium + shipAssembly.hull.engines * shipAssembly.engine.duranium; if (shipAssembly.hull.launchers != 0 && shipAssembly.torp != null) dur += shipAssembly.hull.launchers * shipAssembly.torp.duranium; if (shipAssembly.hull.beams != 0 && shipAssembly.beam != null) dur += shipAssembly.hull.beams * shipAssembly.beam.duranium; return dur; }, calcShipTrit: function(shipAssembly) { var trit = shipAssembly.hull.tritanium + shipAssembly.hull.engines * shipAssembly.engine.tritanium; if (shipAssembly.hull.launchers != 0 && shipAssembly.torp != null) trit += shipAssembly.hull.launchers * shipAssembly.torp.tritanium; if (shipAssembly.hull.beams != 0 && shipAssembly.beam != null) trit += shipAssembly.hull.beams * shipAssembly.beam.tritanium; return trit; }, calcShipMoly: function(shipAssembly) { var moly = shipAssembly.hull.molybdenum + shipAssembly.hull.engines * shipAssembly.engine.molybdenum; if (shipAssembly.hull.launchers != 0 && shipAssembly.torp != null) moly += shipAssembly.hull.launchers * shipAssembly.torp.molybdenum; if (shipAssembly.hull.beams != 0 && shipAssembly.beam != null) moly += shipAssembly.hull.beams * shipAssembly.beam.molybdenum; return moly; }, findHullNamed: function(hullName) { var ret = null; for (var i=0; i<vgap.hulls.length; i++) { if (vgap.hulls[i].name == hullName) ret = vgap.hulls[i]; } return ret; }, assembleShip: function(base, shipAssembly) { var planet = vgap.getPlanet(base.planetid); //Pay for the ship var credits = vgap.plugins["vgaBotCore"].calcShipCredits(shipAssembly, base); var dur = vgap.plugins["vgaBotCore"].calcShipDur(shipAssembly); var trit = vgap.plugins["vgaBotCore"].calcShipTrit(shipAssembly); var moly = vgap.plugins["vgaBotCore"].calcShipMoly(shipAssembly); planet.duranium -= dur; planet.tritanium -= trit; planet.molybdenum -= moly; vgap.plugins["vgaBotCore"].payForStructure(planet, 0, credits); //Upgrade all tech needed if (base.beamtechlevel < shipAssembly.beam.techlevel) { base.beamtechup = shipAssembly.beam.techlevel - base.beamtechlevel; base.beamtechlevel = shipAssembly.beam.techlevel; } if (base.hulltechlevel < shipAssembly.hull.techlevel) { base.hulltechup = shipAssembly.hull.techlevel - base.hulltechlevel; base.hulltechlevel = shipAssembly.hull.techlevel; } if (base.enginetechlevel < shipAssembly.engine.techlevel) { base.enginetechup = shipAssembly.engine.techlevel - base.enginetechlevel; base.enginetechlevel = shipAssembly.engine.techlevel; } if (base.torptechlevel < shipAssembly.torp.techlevel) { base.torptechup = shipAssembly.torp.techlevel - base.torptechlevel; base.torptechlevel = shipAssembly.torp.techlevel; } //Assemble the ship base.buildbeamcount = shipAssembly.hull.beams; base.buildbeamid = shipAssembly.beam.id; var stockitem = vgap.getStock(base.id, 3, shipAssembly.beam.id); stockitem.builtamount += shipAssembly.hull.beams; stockitem.amount += shipAssembly.hull.beams; stockitem.changed = 1; base.buildengineid = shipAssembly.engine.id; stockitem = vgap.getStock(base.id, 2, shipAssembly.engine.id); stockitem.builtamount += shipAssembly.hull.engines; stockitem.amount += shipAssembly.hull.engines; stockitem.changed = 1; base.buildhullid = shipAssembly.hull.id; stockitem = vgap.getStock(base.id, 1, shipAssembly.hull.id); stockitem.builtamount += 1; stockitem.amount += 1; stockitem.changed = 1; base.buildtorpcount = shipAssembly.hull.launchers; base.buildtorpedoid = shipAssembly.torp.id; stockitem = vgap.getStock(base.id, 4, shipAssembly.torp.id); stockitem.builtamount += shipAssembly.hull.launchers; stockitem.amount += shipAssembly.hull.launchers; stockitem.changed = 1; base.isbuilding = true; base.changed = 1; planet.changed = 1; }, /***************************** * Build Structures ******************************/ calcMaxFactories: function(planet) { var nFactories; if (planet.clans <= 100) nFactories = planet.clans; else nFactories = Math.truncate(100 + Math.sqrt( planet.clans - 100)); return nFactories; }, calcMaxMines: function(planet) { var nMines; if (planet.clans <= 200) nMines = planet.clans; else nMines = Math.truncate(200 + Math.sqrt( planet.clans - 200)); return nMines; }, calcMaxDefense: function(planet) { var nDefense; if (planet.clans <= 50) nDefense = planet.clans; else nDefense = Math.truncate(50 + Math.sqrt( planet.clans - 50)); return nDefense; }, calcDesiredDefense: function(planet) { return Math.min(20, vgap.plugins["vgaBotCore"].calcMaxDefense(planet)); }, buildFactories: function(planet, max) { while(planet.factories < max && vgap.plugins["vgaBotCore"].payForStructure(planet, 1, 3)) { planet.factories += 1; planet.builtfactories += 1; } return planet.factories >= max; }, buildMines: function(planet, max) { while(planet.mines < max && vgap.plugins["vgaBotCore"].payForStructure(planet, 1, 4)) { planet.mines += 1; planet.builtmines += 1; } return planet.mines >= max; }, buildDefense: function(planet, max) { while(planet.defense < max && vgap.plugins["vgaBotCore"].payForStructure(planet, 1, 10)) { planet.defense += 1; planet.builtdefense += 1; } return planet.defense >= max; }, payForStructure: function(planet, nSupplies, nCredits) { var bought = false; //Check if we can afford this if (planet.supplies >= nSupplies && ((planet.supplies + planet.megacredits) > (nSupplies + nCredits)) ) { bought = true; planet.supplies -= nSupplies; var nCreditsSpend = Math.min(planet.megacredits, nCredits); planet.megacredits -= nCreditsSpend; nCredits -= nCreditsSpend; if (nCredits > 0) { vgap.plugins["vgaBotCore"].sellSupplies(planet, nCredits); planet.megacredits -= nCredits; } } return bought; }, sellSupplies: function(planet, nSupplies) { planet.suppliessold += nSupplies; planet.supplies -= nSupplies; planet.megacredits += nSupplies; }, /***************************** * Tax ******************************/ }; //End plugin // register your plugin with NU vgap.registerPlugin(vgaBot, "vgaBotCore"); } //wrapper for injection var script = document.createElement("script"); script.type = "application/javascript"; script.textContent = "(" + wrapper + ")();"; document.body.appendChild(script); document.body.removeChild(script);