Colony Helper

Add Farm/Mall/Storage auto-calc buttons if you need to buy them, also prev/next button to fast zipping and some stats

当前为 2018-08-22 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name Colony Helper
  3. // @description Add Farm/Mall/Storage auto-calc buttons if you need to buy them, also prev/next button to fast zipping and some stats
  4. // @namespace bitbucket.org/Odahviing
  5. // @version 3.0
  6. // @include http://www.war-facts.com/view_colony.php*
  7. // @grant GM_getValue
  8. // @grant GM_setValue
  9. // ==/UserScript==
  10.  
  11. // Version history:
  12. // 1.0 Initial Basic Version
  13. // 1.1 Add warning in colony page for lack in malls
  14. // 1.2 Add the ability to buy malls from mail page (inner settings for mall)
  15. // 1.3 Some Bug Fix
  16. // 2.0 Add farm Option / Redesign Script
  17. // 2.1 Add warning if no input has been given
  18. // 2.21 Add buy storage option + Math fix
  19. // 3.0 Update to new UI, remove sync requests, rebuild function
  20.  
  21. var ColonyId = getQueryString(document.URL);
  22.  
  23. /* Global Settings */
  24. var doPrevNext = true;
  25. var checkMall = true;
  26. var checkFarm = true;
  27. var checkStorage = true;
  28. var farmConstant = 0.18; // Don't have any idea what is the right number, but this number seems more or less right
  29. var multi = 1.1; // How much I want more then I need
  30.  
  31. /* Prints Id */
  32. var mallId = 2688;
  33. var peopleMall = 22;
  34. var effMall = 501;
  35. // --- //
  36. var farmId = 3681;
  37. var peopleFarm = 21;
  38. var effFarm = 496;
  39. // --- //
  40. var storageLine = 80; // % of full before adding ability to buy
  41. var storageBuy = 50; // % to get while buying
  42.  
  43. /* Main */
  44.  
  45. var mainDataBlock = document.getElementsByClassName('light padding5 tbborder');
  46. var population = extractValue(mainDataBlock[0], 'Population');
  47. var mallEffective = peopleMall * effMall / 100;
  48. var farmEffective = peopleFarm * effFarm / 100;
  49.  
  50. function main() {
  51. hookFunctions();
  52. addButtons();
  53. addData();
  54. }
  55.  
  56. function addButtons() {
  57. if (doPrevNext == true)
  58. addPrevNext();
  59.  
  60. if (startupTest() == false)
  61. return false;
  62.  
  63. if (checkMall == true)
  64. addMallButton();
  65.  
  66. if (checkFarm == true)
  67. addFarmButton();
  68.  
  69. if (checkStorage == true)
  70. addStorageButton();
  71. }
  72.  
  73. /* End Main */
  74.  
  75. /* Add General Stats */
  76.  
  77. function addData() {
  78. addTopHeaderData();
  79. addColonyPageData();
  80. }
  81.  
  82. function addTopHeaderData() {
  83. let valueRow = document.getElementById('topinfo').getElementsByTagName('a')[8];
  84. let valueHolder = valueRow.innerHTML.substring(valueRow.innerHTML.indexOf('>')+1).trim();
  85. let valueSpllt = valueHolder.split(' ');
  86. let overallPop = parseInt(valueSpllt[0]);
  87. let overallGrowth = valueSpllt[1].replace('(','').replace(')','');
  88. if (overallGrowth[0] == '-')
  89. overallGrowth = -parseInt(overallGrowth.substring(1));
  90. else
  91. overallGrowth = parseInt(overallGrowth.substring(1));
  92. valueRow.innerHTML = valueRow.innerHTML + ` | ${parseFloat(100 * overallGrowth / overallPop).toFixed(3)}%`;
  93. }
  94.  
  95. function addColonyPageData() {
  96. let landValue = extractValue(mainDataBlock[1], 'Size');
  97. let allLines = document.getElementsByClassName('smalltext');
  98. let popGrowth = parseInt(allLines[1].innerHTML.split(' ')[1].replace('(+','').replace(')',''));
  99. let landGrowth = parseFloat(allLines[2].innerHTML.split('(')[1].replace('+','').replace('km²)',''));
  100.  
  101. allLines[1].innerHTML = allLines[1].innerHTML.replace('citizens ' , '') + ` - ${parseFloat(100 * popGrowth / population).toFixed(3)}%`;
  102. allLines[2].innerHTML = allLines[2].innerHTML.replace('km² ' , '') + ` - ${parseFloat(100 * landGrowth / landValue).toFixed(3)}%`;
  103. allLines[3].innerHTML = allLines[3].innerHTML.replace('citizens / km²','') + ` - Growth: ${(popGrowth/landGrowth).toFixed(2)}`;
  104. }
  105.  
  106. /* Finish General Stats */
  107.  
  108. /* Helping Functions */
  109.  
  110. function extractValue(row, text) {
  111. return parseInt(row.innerHTML.substring(row.innerHTML.indexOf(text + ':') + text.length + 1, row.innerHTML.indexOf('<', row.innerHTML.indexOf(text + ':'))).trim());
  112. }
  113.  
  114. function sendAjaxRequest(type, link, async, withResponse, params) {
  115. return new Promise(function (fulfill, reject){
  116. var xhttp = new XMLHttpRequest();
  117. xhttp.open(type, link , true);
  118. xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
  119. xhttp.send(params);
  120.  
  121. xhttp.onreadystatechange = function () {
  122. if(xhttp.readyState === 4 && xhttp.status === 200) {
  123. if (withResponse == true)
  124. fulfill(xhttp.responseText);
  125. else
  126. fulfill();
  127. }
  128. };
  129. });
  130. }
  131.  
  132. function getQueryString(colonyURL) {
  133. var indexPoint = colonyURL.indexOf('?');
  134. if (indexPoint != -1)
  135. colonyURL = colonyURL.substring(indexPoint+1, colonyURL.length);
  136. return colonyURL.replace("colony=", "");
  137. }
  138.  
  139. function hookFunctions() {
  140. originalParseInt = parseInt;
  141. parseInt = function(str){if (!str.replace) return originalParseInt(str); else return originalParseInt(str.replace(/,/g, ""));}
  142. originalParseFloat = parseFloat;
  143. parseFloat = function(str){if (!str.replace) return originalParseFloat(str); else return originalParseFloat(str.replace(/,/g, ""));}
  144. }
  145.  
  146. function startupTest() {
  147. if (atleastOneBuyerisActive() == false) return false;
  148. if (peopleMall * peopleFarm == 0)
  149. {
  150. alert("You didn't update script settings for best blueprints, stopping..");
  151. return false;
  152. }
  153. return true;
  154. }
  155.  
  156. function atleastOneBuyerisActive() {return (checkMall || checkFarm || checkStorage);}
  157.  
  158. /* End Helping Functions */
  159.  
  160. /* Add Prev Button Functions */
  161.  
  162. function getPrevAndNext(currentColonyNumber) {
  163. var allColoniesFrame = document.getElementById("colonylist");
  164. var allColonies = allColoniesFrame.getElementsByClassName("colmenu_name");
  165. if (allColonies.length == 1)
  166. return [-1, -1];
  167.  
  168. for (var index = 0; index < allColonies.length; index ++)
  169. {
  170. var currentValue = getQueryString(allColonies[index].href);
  171. if (currentColonyNumber == currentValue)
  172. {
  173. if (index == 0)
  174. return [-1, getQueryString(allColonies[index+1].href)];
  175.  
  176. if (index == allColonies.length -1)
  177. return [getQueryString(allColonies[index-1].href), -1];
  178.  
  179. return [getQueryString(allColonies[index-1].href), getQueryString(allColonies[index+1].href)];
  180. }
  181. }
  182. }
  183.  
  184. function addPrevNext() {
  185. var prevNextValues = getPrevAndNext(ColonyId);
  186. var colonyText = document.getElementsByClassName("heading bold pagetitle");
  187. if (prevNextValues[1] != -1)
  188. colonyText[0].innerHTML = colonyText[0].innerHTML + "<span><a href='view_colony.php?colony=" + prevNextValues[1] + "'><font color='white'>\x20Next</font></a></span>";
  189. if (prevNextValues[0] != -1)
  190. colonyText[0].innerHTML = "<span><a href='view_colony.php?colony=" + prevNextValues[0] + "'><font color='white'>Prev</font></a></span>" + colonyText[0].innerHTML;
  191. }
  192.  
  193. /* End Prev Button Functions */
  194.  
  195. /* Mall Functions */
  196.  
  197. function addMallButton() {
  198. let mallValue = extractValue(mainDataBlock[5], 'Malled people');
  199.  
  200. if (population * 1.1 > mallValue)
  201. {
  202. mainDataBlock[5].innerHTML = "<font color='red'>" + mainDataBlock[5].innerHTML + "\x20\x20</font><input type='button' id='mallbutton' value='buy'>";
  203. var mainbutton = document.getElementById('mallbutton');
  204. mainbutton.style ="color:red";
  205. mainbutton.addEventListener("click", function(){buyMalls(population * multi, mallValue)}, false);
  206. }
  207. }
  208.  
  209. function buyMalls(people, malled) {
  210. var baseParams = "build=1&type=3&subtype=8";
  211. var missing = people - malled;
  212. var toBuy = Math.ceil(missing / (mallEffective * 40));
  213. baseParams = baseParams + "&buildid=" + mallId + "&colony=" + ColonyId + "&amount=" + toBuy;
  214. sendAjaxRequest("POST", "build_facility.php", true, false, baseParams);
  215.  
  216. location.reload();
  217. }
  218.  
  219. /* End Mall Functions */
  220.  
  221. /* Farm Functions */
  222.  
  223. function addFarmButton() {
  224. var tempHolder = mainDataBlock[17].innerHTML;
  225. let foodValue = parseInt(tempHolder.substring(tempHolder.indexOf('</a>') + 4, tempHolder.indexOf('<span>')).trim());
  226.  
  227. if (population * 1.5 > foodValue * 10)
  228. {
  229. var link = "/extras/colony_res.php?colony=" + ColonyId;
  230. var div = document.createElement('div');
  231.  
  232. sendAjaxRequest("GET", link, true, true, "").then(function (html){
  233. div.innerHTML = html;
  234. var allLines = div.getElementsByTagName('tr');
  235. var LowValue = allLines[11].getElementsByTagName('td')[1].innerHTML;
  236. var HighValue = allLines[11].getElementsByTagName('td')[2].innerHTML;
  237.  
  238. var currentProduction = (parseInt(LowValue) * 0.7 + parseInt(HighValue) * 0.3);
  239. var resourcesGap = Math.ceil((population - currentProduction * 10) / 10);
  240.  
  241. if (resourcesGap > 0)
  242. {
  243. // Just making sure I don't have to much
  244. if (foodValue < (population /10 - currentProduction) * 60)
  245. {
  246. mainDataBlock[17].innerHTML = "<font color='red'>" + mainDataBlock[17].innerHTML + "</font>\x20<input type='button' id='farmbutton' value='buy'>";
  247. var mainbutton = document.getElementById('farmbutton');
  248. mainbutton.style ="color:red";
  249. mainbutton.addEventListener("click", function(){buyFarms(resourcesGap * multi)}, false);
  250. }
  251. }
  252. });
  253. }
  254. }
  255.  
  256. function buyFarms(gap) {
  257. // First taking data from the page
  258. var temp = mainDataBlock[3].innerHTML.split(" ")[1];
  259. var wealth = temp.substring(temp.indexOf('</a>') + 9).trim();
  260. var wages = document.getElementById('wages').value;
  261.  
  262. // Now lets see the %
  263. var farmFert = GM_getValue("farm" + ColonyId);
  264. if (farmFert == undefined)
  265. {
  266. var planetLink = document.getElementById('midcolumn').getElementsByClassName('openextra pointer')[0].title.trim();
  267. var div = document.createElement('div');
  268. div.innerHTML = sendAjaxRequest("GET", planetLink, false, true, "");
  269. var allPlanetValues = div.getElementsByClassName('left tbborder light padding5 overauto box width50')
  270. farmFert = allPlanetValues[10].getElementsByTagName('div')[3].innerHTML.replace("%","");
  271. GM_setValue("farm" + ColonyId, farmFert);
  272. }
  273.  
  274. // Finish Calc
  275. var toBuy = Math.ceil(gap / Math.sqrt(wages/wealth) / Math.sqrt(farmFert * farmConstant) / farmEffective);
  276. var baseParams = "build=1&type=1&subtype=11";
  277. baseParams = baseParams + "&buildid=" + farmId + "&colony=" + ColonyId + "&amount=" + toBuy;
  278. sendAjaxRequest("POST", "build_facility.php", true, false, baseParams);
  279. location.reload();
  280. }
  281.  
  282. /* End Farm Functions */
  283.  
  284. /* Storage Functions */
  285.  
  286. function addStorageButton() {
  287. var storageLeft = document.getElementsByClassName('storagetop')[0].innerHTML.split(' ')[0].replace(',','').replace(',','').replace(',','');
  288. var storageAll = document.getElementsByClassName('storagebottom')[0].innerHTML.split(' ')[0].replace(',','').replace(',','').replace(',','');
  289. var prec = Math.ceil((storageAll - storageLeft) * 100 / storageAll);
  290.  
  291. if (prec > storageLine)
  292. {
  293. var holder = document.getElementsByClassName('darkbutton noleft')[1];
  294. holder.innerHTML = "<font color='red'>" + holder.innerHTML + "</font>";
  295. holder.onclick = "";
  296. holder.addEventListener('click', function(){buyStorage(storageAll,storageLeft);}, false);
  297. }
  298. }
  299.  
  300. function buyStorage(overall, left) {
  301. var x = storageBuy / 100;
  302. var buy = Math.round((x * overall- left) / (1-x));
  303. var baseParams = "colony=" + ColonyId + "&addstorage=" + buy;
  304. sendAjaxRequest('POST', "view_colony.php", true, false, baseParams);
  305. location.reload();
  306. }
  307.  
  308. /* End Storage Functions */