Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Array.prototype.addSet = function(a) {
- for(var i = 0; i < this.length; i++) {
- this[i] += a[i];
- }
- return this;
- };
- Array.prototype.mult = function(a) {
- return this.map(function(v, i) {
- return v *= a[i];
- })
- };
- Array.prototype.div = function(a) {
- return this.map(function(v, i) {
- return v /= a[i] || Math.abs(v) || 1;
- })
- };
- Array.prototype.sum = function() {
- return this.reduce(function(a, b) { return a + b; }, 0);
- };
- function reduceResources(res, reduceBy) {
- var sizes = res.slice().sort(function(a, b) { return a - b; });
- var sum = 0, n = 0, cap;
- while(sizes.length) {
- var v = sizes.pop();
- if(cap >= v)
- break;
- sum += v;
- n++;
- cap = Math.floor((sum - reduceBy) / n);
- }
- return res.map(function(v) { return Math.min(v, cap); });
- }
- var hub = planetsName.santorini;
- var excessValuable = {
- iron: 1,
- titanium: 1,
- plastic: 1,
- circuit: 10,
- silicon: 10,
- nanotubes: 1,
- ammunition: 1,
- "u-ammunition": 1,
- };
- var totalRes = Array(resNum).fill(0);
- var totalProd = Array(resNum).fill(0);
- var totalCons = Array(resNum).fill(0);
- var neededRes = Array(resNum).fill(0);
- var totalResearch = 0;
- var planetsNeededRes = Array(planets.length);
- var planetsTransportRes = Array(planets.length);
- var cp, i, b;
- for(cp = 0; cp < game.planets.length; cp++) {
- var p = game.planets[cp];
- var planet = planets[p];
- var planetProd = Array(resNum).fill(0);
- for(b = 0; b < buildings.length; b++) {
- var building = buildings[b];
- var planetBuilding = planet.structure[b];
- if(!planetBuilding.number || !planetBuilding.active)
- continue;
- var prod = building.rawProduction(planet);
- totalProd.addSet(prod.map(function(v) { return (v > 0) ? v * planetBuilding.number : 0; }));
- totalCons.addSet(prod.map(function(v) { return (v < 0) ? -v * planetBuilding.number : 0; }));
- planetProd.addSet(prod.map(function(v) { return v * planetBuilding.number; }));
- totalResearch += prod.researchPoint * planetBuilding.number;
- }
- planetsTransportRes[p] = planetProd.map(function(v, k) { return v * -1 * (totalCons[k] == 0 ? 1.1 : 1); });
- totalRes.addSet(planetProd);
- }
- var resValue = totalProd.map(function(p, k) {
- c = totalCons[k];
- var valuable = excessValuable[resources[k].name];
- if(p == 0) return 1;
- else if(valuable) return valuable / Math.max(1, p - c);
- else if(p > Math.max(1000, c) * 2) return 0;
- else if(p > Math.max(1000, c)) return (2 - p / Math.max(1000, c)) / p;
- else return 2 * c / (p * p);
- });
- for(cp = 0; cp < game.planets.length; cp++) {
- var p = game.planets[cp];
- var planet = planets[p];
- var planetEnergy = Math.pow(1000 + planet.energyProduction(), 2) / (1000 - planet.energyConsumption());
- planetsNeededRes[p] = planetNeeds = planetsTransportRes[p].map(function(v, k) { return (v * totalRes[k] > 0) ? v * 0.001 : 0; });
- var planetBuildings = [];
- for(b = 0; b < buildings.length; b++) {
- var building = buildings[b];
- var planetBuilding = planet.structure[b];
- if(!building.show(planet) || !planetBuilding.active)
- continue;
- var prod = building.rawProduction(planet);
- var cost = resValue.map(function(v, k) { return planetBuilding.cost(k); });
- var value = (prod.mult(resValue).sum() + prod.energy / planetEnergy + 10 * prod.researchPoint / totalResearch) / (cost.mult(resValue).sum() + 0.01);
- if(value < 0) continue;
- planetNeeds.addSet(cost.map(function(v) { return v * value; }));
- planetBuildings.push({ name: building.displayName, value: value });
- }
- neededRes.addSet(planetNeeds);
- planetBuildings.sort(function(a, b) { return b.value - a.value; });
- console.log(planet.name, planetBuildings.reduce(function(obj, v) { obj[v.name] = v.value; return obj; }, {}));
- }
- var shipBuildingMats = {
- steel: 2e7,
- titanium: 1e6,
- plastic: 10.5e4,
- circuit: 3.5e3,
- ammunition: 500
- };
- var fleetDivisor = 1e3;
- var shipBuildingRes = Array(resNum).fill(0);
- for(var resName in shipBuildingMats) {
- shipBuildingRes[resourcesName[resName].id] += shipBuildingMats[resName] / fleetDivisor;
- }
- planetsNeededRes[hub].addSet(shipBuildingRes);
- neededRes.addSet(shipBuildingRes);
- for(cp = 0; cp < game.planets.length; cp++) {
- var p = game.planets[cp];
- planetsTransportRes[p].addSet(planetsNeededRes[p].div(neededRes).mult(totalRes));
- }
- fleetSchedule.civisFleet(game.id).filter(function(route) {
- return route.type == "auto" && (route.origin == hub || route.destination == hub);
- }).map(function(route) {
- var routeFor = (route.origin == hub) ? route.destination : route.origin;
- var fleet = fleetSchedule.fleets[route.fleet];
- var travelTime = parseInt(Math.floor(2 * planets[routeFor].shortestPath[hub].distance / (idleBon * fleet.speed())));
- var storage = fleet.maxStorage();
- var resIn = planetsTransportRes[routeFor].map(function(v) { return v > 0 ? Math.ceil(v * travelTime) : 0 });
- var resOut = planetsTransportRes[routeFor].map(function(v) { return v < 0 ? Math.ceil(-v * travelTime) : 0; });
- var ratioIn = resIn.sum() / storage; if(ratioIn > 1) resIn = reduceResources(resIn, (ratioIn-1)*storage);
- var ratioOut = resOut.sum() / storage; if(ratioOut > 1) resOut = reduceResources(resOut, (ratioOut-1)*storage);
- if(Math.max(ratioIn, ratioOut) > 1) console.log(fleet.name+" needs "+(Math.max(ratioIn, ratioOut)-1)*storage+" more storage");
- fleet.autoMap[routeFor] = 0;
- fleet.autoMap[hub] = 1;
- fleet.autoRes[0] = resOut;
- fleet.autoRes[1] = resIn;
- return route.fleet_name;
- });
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement