Advertisement
Guest User

Untitled

a guest
Apr 23rd, 2017
97
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.33 KB | None | 0 0
  1. Array.prototype.addSet = function(a) {
  2. for(var i = 0; i < this.length; i++) {
  3. this[i] += a[i];
  4. }
  5. return this;
  6. };
  7. Array.prototype.mult = function(a) {
  8. return this.map(function(v, i) {
  9. return v *= a[i];
  10. })
  11. };
  12. Array.prototype.div = function(a) {
  13. return this.map(function(v, i) {
  14. return v /= a[i] || Math.abs(v) || 1;
  15. })
  16. };
  17. Array.prototype.sum = function() {
  18. return this.reduce(function(a, b) { return a + b; }, 0);
  19. };
  20.  
  21. function reduceResources(res, reduceBy) {
  22. var sizes = res.slice().sort(function(a, b) { return a - b; });
  23. var sum = 0, n = 0, cap;
  24. while(sizes.length) {
  25. var v = sizes.pop();
  26. if(cap >= v)
  27. break;
  28. sum += v;
  29. n++;
  30. cap = Math.floor((sum - reduceBy) / n);
  31. }
  32. return res.map(function(v) { return Math.min(v, cap); });
  33. }
  34.  
  35. var hub = planetsName.santorini;
  36. var excessValuable = {
  37. iron: 1,
  38. titanium: 1,
  39. plastic: 1,
  40. circuit: 10,
  41. silicon: 10,
  42. nanotubes: 1,
  43. ammunition: 1,
  44. "u-ammunition": 1,
  45. };
  46.  
  47. var totalRes = Array(resNum).fill(0);
  48. var totalProd = Array(resNum).fill(0);
  49. var totalCons = Array(resNum).fill(0);
  50. var neededRes = Array(resNum).fill(0);
  51. var totalResearch = 0;
  52. var planetsNeededRes = Array(planets.length);
  53. var planetsTransportRes = Array(planets.length);
  54. var cp, i, b;
  55. for(cp = 0; cp < game.planets.length; cp++) {
  56. var p = game.planets[cp];
  57. var planet = planets[p];
  58. var planetProd = Array(resNum).fill(0);
  59. for(b = 0; b < buildings.length; b++) {
  60. var building = buildings[b];
  61. var planetBuilding = planet.structure[b];
  62. if(!planetBuilding.number || !planetBuilding.active)
  63. continue;
  64. var prod = building.rawProduction(planet);
  65. totalProd.addSet(prod.map(function(v) { return (v > 0) ? v * planetBuilding.number : 0; }));
  66. totalCons.addSet(prod.map(function(v) { return (v < 0) ? -v * planetBuilding.number : 0; }));
  67. planetProd.addSet(prod.map(function(v) { return v * planetBuilding.number; }));
  68. totalResearch += prod.researchPoint * planetBuilding.number;
  69. }
  70. planetsTransportRes[p] = planetProd.map(function(v, k) { return v * -1 * (totalCons[k] == 0 ? 1.1 : 1); });
  71. totalRes.addSet(planetProd);
  72. }
  73. var resValue = totalProd.map(function(p, k) {
  74. c = totalCons[k];
  75. var valuable = excessValuable[resources[k].name];
  76. if(p == 0) return 1;
  77. else if(valuable) return valuable / Math.max(1, p - c);
  78. else if(p > Math.max(1000, c) * 2) return 0;
  79. else if(p > Math.max(1000, c)) return (2 - p / Math.max(1000, c)) / p;
  80. else return 2 * c / (p * p);
  81. });
  82. for(cp = 0; cp < game.planets.length; cp++) {
  83. var p = game.planets[cp];
  84. var planet = planets[p];
  85. var planetEnergy = Math.pow(1000 + planet.energyProduction(), 2) / (1000 - planet.energyConsumption());
  86. planetsNeededRes[p] = planetNeeds = planetsTransportRes[p].map(function(v, k) { return (v * totalRes[k] > 0) ? v * 0.001 : 0; });
  87. var planetBuildings = [];
  88. for(b = 0; b < buildings.length; b++) {
  89. var building = buildings[b];
  90. var planetBuilding = planet.structure[b];
  91. if(!building.show(planet) || !planetBuilding.active)
  92. continue;
  93. var prod = building.rawProduction(planet);
  94. var cost = resValue.map(function(v, k) { return planetBuilding.cost(k); });
  95. var value = (prod.mult(resValue).sum() + prod.energy / planetEnergy + 10 * prod.researchPoint / totalResearch) / (cost.mult(resValue).sum() + 0.01);
  96. if(value < 0) continue;
  97. planetNeeds.addSet(cost.map(function(v) { return v * value; }));
  98. planetBuildings.push({ name: building.displayName, value: value });
  99. }
  100. neededRes.addSet(planetNeeds);
  101. planetBuildings.sort(function(a, b) { return b.value - a.value; });
  102. console.log(planet.name, planetBuildings.reduce(function(obj, v) { obj[v.name] = v.value; return obj; }, {}));
  103. }
  104. var shipBuildingMats = {
  105. steel: 2e7,
  106. titanium: 1e6,
  107. plastic: 10.5e4,
  108. circuit: 3.5e3,
  109. ammunition: 500
  110. };
  111. var fleetDivisor = 1e3;
  112. var shipBuildingRes = Array(resNum).fill(0);
  113. for(var resName in shipBuildingMats) {
  114. shipBuildingRes[resourcesName[resName].id] += shipBuildingMats[resName] / fleetDivisor;
  115. }
  116. planetsNeededRes[hub].addSet(shipBuildingRes);
  117. neededRes.addSet(shipBuildingRes);
  118. for(cp = 0; cp < game.planets.length; cp++) {
  119. var p = game.planets[cp];
  120. planetsTransportRes[p].addSet(planetsNeededRes[p].div(neededRes).mult(totalRes));
  121. }
  122.  
  123. fleetSchedule.civisFleet(game.id).filter(function(route) {
  124. return route.type == "auto" && (route.origin == hub || route.destination == hub);
  125. }).map(function(route) {
  126. var routeFor = (route.origin == hub) ? route.destination : route.origin;
  127. var fleet = fleetSchedule.fleets[route.fleet];
  128. var travelTime = parseInt(Math.floor(2 * planets[routeFor].shortestPath[hub].distance / (idleBon * fleet.speed())));
  129. var storage = fleet.maxStorage();
  130. var resIn = planetsTransportRes[routeFor].map(function(v) { return v > 0 ? Math.ceil(v * travelTime) : 0 });
  131. var resOut = planetsTransportRes[routeFor].map(function(v) { return v < 0 ? Math.ceil(-v * travelTime) : 0; });
  132. var ratioIn = resIn.sum() / storage; if(ratioIn > 1) resIn = reduceResources(resIn, (ratioIn-1)*storage);
  133. var ratioOut = resOut.sum() / storage; if(ratioOut > 1) resOut = reduceResources(resOut, (ratioOut-1)*storage);
  134. if(Math.max(ratioIn, ratioOut) > 1) console.log(fleet.name+" needs "+(Math.max(ratioIn, ratioOut)-1)*storage+" more storage");
  135. fleet.autoMap[routeFor] = 0;
  136. fleet.autoMap[hub] = 1;
  137. fleet.autoRes[0] = resOut;
  138. fleet.autoRes[1] = resIn;
  139. return route.fleet_name;
  140. });
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement