Kitten Extrapolation

A script for outputting information about kitten survival (Other features may come later)

当前为 2015-06-23 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name Kitten Extrapolation
  3. // @namespace https://greasyfork.org/en/scripts/10234-kitten-extrapolation
  4. // @version 0.6.1
  5. // @description A script for outputting information about kitten survival (Other features may come later)
  6. // @author Yuriy
  7. // @match http://bloodrizer.ru/games/kittens/
  8. // @grant none
  9. // ==/UserScript==
  10.  
  11. function initiate_script() {
  12. var data_out = document.createElement('div');
  13. data_out.id = 'data_container';
  14. data_out.style.width = '100%';
  15. data_out.style.bottom = '0px';
  16. data_out.style.verticalAlign = 'bottom';
  17. data_out.innerHTML = '<div style="width: 340px;"> <table id="food_table_season" table-layout: fixed;></table></div></div><div> <p id="food_balance_info"></p> </div>';
  18. right_col = document.getElementById('rightColumn')
  19. right_col.style.width = '360px';
  20. before_child = document.getElementById('clearLog')
  21. right_col.insertBefore(data_out, before_child);
  22. }
  23.  
  24. if (!document.getElementById('data_container')) {
  25. initiate_script();
  26. }
  27.  
  28. function calculate_food_income_data(weather_ratio_val, seconds) {
  29. var total = 0;
  30. var subtotal = 0;
  31. total += gamePage.getEffect("catnip" + "PerTickBase")*5
  32. total *= 1+weather_ratio_val;
  33. var resMapProduction = gamePage.village.getResProduction();
  34. subtotal = resMapProduction['catnip']*5 || 0;
  35. subtotal *= (1 + gamePage.workshop.getEffect('catnip' + "Ratio"))
  36. total += subtotal;
  37. total *= (1 + gamePage.bld.getEffect('catnip' + "Ratio"))
  38. total *= (1 + gamePage.space.getEffect('catnip' + "Ratio"))
  39. total *= (1 + gamePage.religion.getEffect('catnip' + "Ratio"))
  40. var paragonRatio = gamePage.resPool.get("paragon").value * 0.01;
  41. paragonRatio = gamePage.bld.getHyperbolicEffect(paragonRatio, 2);
  42. total *= 1+paragonRatio
  43. if (gamePage.religion.getRU("solarRevolution").researched){
  44. total *= 1+(gamePage.religion.getProductionBonus() / 100)
  45. }
  46. if (gamePage.bld.get("magneto").on > 0){
  47. var steamworks = gamePage.bld.get("steamworks");
  48. var magnetoboost = steamworks.on > 0 ? (1+ steamworks.effects["magnetoBoostRatio"] * steamworks.on) : 1;
  49. total += total * gamePage.bld.getEffect("magnetoRatio") * magnetoboost;
  50. }
  51. //Reactors
  52. total *= (1 + gamePage.bld.getEffect("productionRatio"))
  53. total *= seconds;
  54. return total;
  55. }
  56.  
  57. function calculate_food_consumtion_data(seconds) {
  58. var resMapConsumption = gamePage.village.getResConsumption();
  59. var resConsumption = resMapConsumption['catnip'] || 0;
  60. resConsumption = resConsumption * (1 + gamePage.bld.getEffect('catnip' + "DemandRatio", true));
  61. //to account for biofual
  62. resConsumption += gamePage.getEffect('catnip' + "PerTick");
  63. resConsumption *= 5;
  64. resConsumption *= seconds;
  65. return resConsumption
  66. }
  67.  
  68. function calculate_food_data(weather_ratio_val, seconds) {
  69. var total = calculate_food_income_data(weather_ratio_val, seconds);
  70. var resConsumption = calculate_food_consumtion_data(seconds);
  71. total += resConsumption;
  72. return total
  73. }
  74.  
  75. function val_to_printable(total) {
  76. var total_value = '';
  77. if(!(isFinite(total))){
  78. total_value = total;
  79. }else if(Math.abs(total)>1000000000000){
  80. total = total / 1000000000000;
  81. total = total.toFixed(1);
  82. total_value += total;
  83. total_value += ' T';
  84. }else if(Math.abs(total)>1000000000){
  85. total = total / 1000000000;
  86. total = total.toFixed(1);
  87. total_value += total;
  88. total_value += ' G';
  89. }else if(Math.abs(total)>1000000){
  90. total = total / 1000000;
  91. total = total.toFixed(1);
  92. total_value += total;
  93. total_value += ' M';
  94. }else if(Math.abs(total)>1000){
  95. total = total / 1000;
  96. total = total.toFixed(1);
  97. total_value += total;
  98. total_value += ' k';
  99. }else{
  100. total = total.toFixed(2);
  101. total_value += total;
  102. }
  103. return total_value;
  104. }
  105.  
  106. function generate_food_table(seconds, label) {
  107. var contents = '';
  108. //Define the table colomn widths
  109. contents += '<col width="100">';
  110. contents += '<col width="60">';
  111. contents += '<col width="60">';
  112. contents += '<col width="60">';
  113. contents += '<col width="60">';
  114. //The top of the table, describing what it is showing. Leave once cell blank at the start
  115. contents += '<tr>';
  116. contents += '<td style="text-align:center">'
  117. contents += ' '
  118. contents += '</td>';
  119. contents += '<td style="text-align:center" colspan="4">'
  120. contents += label
  121. contents += '</td>';
  122. contents += '</tr>';
  123. //Second level of the top of the table, describing what it is showing. Leave once cell blank at the start
  124. contents += '<tr>';
  125. contents += '<td style="text-align:center">'
  126. contents += ' '
  127. contents += '</td>';
  128. contents += '<td style="text-align:center">'
  129. contents += 'Winter'
  130. contents += '</td> <td style="text-align:center">'
  131. contents += 'Spring'
  132. contents += '</td> <td style="text-align:center">'
  133. contents += 'Summer'
  134. contents += '</td> <td style="text-align:center">'
  135. contents += 'Autumn'
  136. contents += '</td>';
  137. contents += '</tr>';
  138. //Data for a good season
  139. contents += '<tr>';
  140. contents += '<td style="text-align:center">'
  141. contents += 'Good season'
  142. contents += '</td>';
  143. contents += '<td style="text-align:center">'
  144. contents += val_to_printable(calculate_food_data(-0.60, seconds))
  145. contents += '</td> <td style="text-align:center">'
  146. contents += val_to_printable(calculate_food_data(0.65, seconds))
  147. contents += '</td> <td style="text-align:center">'
  148. contents += val_to_printable(calculate_food_data(0.15, seconds))
  149. contents += '</td> <td style="text-align:center">'
  150. contents += val_to_printable(calculate_food_data(0.15, seconds))
  151. contents += '</td>';
  152. contents += '</tr>';
  153. //Data for an average season
  154. contents += '<tr>';
  155. contents += '<td style="text-align:center">'
  156. contents += 'Avg season'
  157. contents += '</td>';
  158. contents += '<td style="text-align:center">'
  159. contents += val_to_printable(calculate_food_data(-0.75, seconds))
  160. contents += '</td> <td style="text-align:center">'
  161. contents += val_to_printable(calculate_food_data(0.50, seconds))
  162. contents += '</td> <td style="text-align:center">'
  163. contents += val_to_printable(calculate_food_data(0.0, seconds))
  164. contents += '</td> <td style="text-align:center">'
  165. contents += val_to_printable(calculate_food_data(0.0, seconds))
  166. contents += '</td>';
  167. contents += '</tr>';
  168. //Data for a bad season
  169. contents += '<tr>';
  170. contents += '<td style="text-align:center">'
  171. contents += 'Bad season'
  172. contents += '</td>';
  173. contents += '<td style="text-align:center">'
  174. contents += val_to_printable(calculate_food_data(-0.90, seconds))
  175. contents += '</td> <td style="text-align:center">'
  176. contents += val_to_printable(calculate_food_data(0.35, seconds))
  177. contents += '</td> <td style="text-align:center">'
  178. contents += val_to_printable(calculate_food_data(-0.15, seconds))
  179. contents += '</td> <td style="text-align:center">'
  180. contents += val_to_printable(calculate_food_data(-0.15, seconds))
  181. contents += '</td>';
  182. contents += '</tr>';
  183. return contents
  184. }
  185.  
  186. function generate_food_balance_data() {
  187. var contents = '';
  188. contents += "Yearly food produced (avg): ";
  189. contents += val_to_printable(calculate_food_income_data(-0.75, 200)+calculate_food_income_data(0.50, 200)+calculate_food_income_data(0.0, 200)+calculate_food_income_data(0.0, 200))
  190. contents += "<br>";
  191. var resConsumption = calculate_food_consumtion_data(800);
  192. contents += "Yearly food consumed (avg): ";
  193. contents += val_to_printable(-resConsumption);
  194. contents += "<br>";
  195. contents += "Surplus (or deficit): ";
  196. contents += val_to_printable(calculate_food_income_data(-0.75, 200)+calculate_food_income_data(0.50, 200)+calculate_food_income_data(0.0, 200)+calculate_food_income_data(0.0, 200)+resConsumption);
  197. contents += "<br>";
  198. contents += "Surplus/consumed: ";
  199. surpovcons = (calculate_food_income_data(-0.75, 200)+calculate_food_income_data(0.50, 200)+calculate_food_income_data(0.0, 200)+calculate_food_income_data(0.0, 200)+resConsumption)/(-resConsumption)*100
  200. if(isFinite(surpovcons) || resConsumption != 0){
  201. if((calculate_food_income_data(-0.75, 200)+calculate_food_income_data(0.50, 200)+calculate_food_income_data(0.0, 200)+calculate_food_income_data(0.0, 200)+resConsumption)/(-resConsumption)*100 >= 15) {
  202. contents += '<span style="color: green;">'
  203. }else if((calculate_food_income_data(-0.75, 200)+calculate_food_income_data(0.50, 200)+calculate_food_income_data(0.0, 200)+calculate_food_income_data(0.0, 200)+resConsumption)/(-resConsumption)*100 <= 5 && (calculate_food_income_data(-0.75, 200)+calculate_food_income_data(0.50, 200)+calculate_food_income_data(0.0, 200)+calculate_food_income_data(0.0, 200)+resConsumption)/(-resConsumption)*100 >= 0) {
  204. contents += '<span style="color: yellow;">'
  205. }else if((calculate_food_income_data(-0.75, 200)+calculate_food_income_data(0.50, 200)+calculate_food_income_data(0.0, 200)+calculate_food_income_data(0.0, 200)+resConsumption)/(-resConsumption)*100 <= 5 && (calculate_food_income_data(-0.75, 200)+calculate_food_income_data(0.50, 200)+calculate_food_income_data(0.0, 200)+calculate_food_income_data(0.0, 200)+resConsumption)/(-resConsumption)*100 < 0) {
  206. contents += '<span style="color: red;">'
  207. }else{
  208. contents += '<span">'
  209. }
  210. contents += val_to_printable((calculate_food_income_data(-0.75, 200)+calculate_food_income_data(0.50, 200)+calculate_food_income_data(0.0, 200)+calculate_food_income_data(0.0, 200)+resConsumption)/(-resConsumption)*100);
  211. contents += "%";
  212. contents += '</span>'
  213. contents += "<br>";
  214. //Get the current season
  215. day = gamePage.calendar.day;
  216. var season = gamePage.calendar.seasons[gamePage.calendar.season].title;
  217. weatherMod = gamePage.calendar.getWeatherMod();
  218. weatherMod = (gamePage.calendar.getCurSeason().modifiers["catnip"] + weatherMod);
  219. weatherMod -= 1;
  220. if(season == "Winter")
  221. {
  222. contents += "Can I survive the winter? ";
  223. if(gamePage.resPool.get("catnip").value+((100-day)/100)*calculate_food_data(weatherMod, 200)>0){
  224. contents += '<span style="color: green;">'
  225. contents += 'yes';
  226. contents += '</span>'
  227. contents += "<br>";
  228. contents += "A bad year till after next winter? ";
  229. if(gamePage.resPool.get("catnip").value+((100-day)/100)*calculate_food_data(weatherMod, 200)+calculate_food_data(0.35, 200)+calculate_food_data(-0.15, 200)+calculate_food_data(-0.15, 200)+calculate_food_data(-0.90, 200)>0){
  230. contents += '<span style="color: green;">'
  231. contents += 'yes';
  232. contents += '</span>'
  233. }else{
  234. contents += '<span style="color: red;">'
  235. contents += 'no, insufficent catnip.';
  236. contents += '</span>'
  237.  
  238. }
  239. }else{
  240. contents += '<span style="color: red;">'
  241. contents += 'no, insufficent catnip.';
  242. contents += '</span>'
  243.  
  244. }
  245. }else if(season == "Autumn")
  246. {
  247. contents += "Can I survive a bad winter? ";
  248. if(gamePage.resPool.get("catnip").value+((100-day)/100)*calculate_food_data(weatherMod, 200)+calculate_food_data(-0.90, 200)>0){
  249. contents += '<span style="color: green;">'
  250. contents += 'yes';
  251. contents += '</span>'
  252. contents += "<br>";
  253. contents += "A bad year till after next winter? ";
  254. if(gamePage.resPool.get("catnip").value+((100-day)/100)*calculate_food_data(weatherMod, 200)+calculate_food_data(-0.15, 200)+calculate_food_data(-0.15, 200)+calculate_food_data(-0.90, 200)>0){
  255. contents += '<span style="color: green;">'
  256. contents += 'yes';
  257. contents += '</span>'
  258. }else{
  259. contents += '<span style="color: red;">'
  260. contents += 'no, insufficent catnip.';
  261. contents += '</span>'
  262.  
  263. }
  264. }else{
  265. contents += '<span style="color: red;">'
  266. contents += 'no, insufficent catnip.';
  267. contents += '</span>'
  268. }
  269. }else if(season == "Summer")
  270. {
  271. contents += "Can I survive a bad winter? ";
  272. if(gamePage.resPool.get("catnip").value+((100-day)/100)*calculate_food_data(weatherMod, 200)+calculate_food_data(0, 200)+calculate_food_data(-0.90, 200)>0){
  273. contents += '<span style="color: green;">'
  274. contents += 'yes';
  275. contents += '</span>'
  276. contents += "<br>";
  277. contents += "A bad year till after next winter? ";
  278. if(gamePage.resPool.get("catnip").value+((100-day)/100)*calculate_food_data(weatherMod, 200)+calculate_food_data(-0.15, 200)+calculate_food_data(-0.90, 200)>0){
  279. contents += '<span style="color: green;">'
  280. contents += 'yes';
  281. contents += '</span>'
  282. }else{
  283. contents += '<span style="color: red;">'
  284. contents += 'no, insufficent catnip.';
  285. contents += '</span>'
  286.  
  287. }
  288. }else{
  289. contents += '<span style="color: red;">'
  290. contents += 'no, insufficent catnip.';
  291. contents += '</span>'
  292. }
  293. }else if(season == "Spring")
  294. {
  295. contents += "Can I survive a bad winter? ";
  296. if(gamePage.resPool.get("catnip").value+((100-day)/100)*calculate_food_data(weatherMod, 200)+calculate_food_data(0, 200)+calculate_food_data(0, 200)+calculate_food_data(-0.90, 200)>0){
  297. contents += '<span style="color: green;">'
  298. contents += 'yes';
  299. contents += '</span>'
  300. contents += "<br>";
  301. contents += "A bad year till after next winter? ";
  302. if(gamePage.resPool.get("catnip").value+((100-day)/100)*calculate_food_data(weatherMod, 200)+calculate_food_data(-0.90, 200)>0){
  303. contents += '<span style="color: green;">'
  304. contents += 'yes';
  305. contents += '</span>'
  306. }else{
  307. contents += '<span style="color: red;">'
  308. contents += 'no, insufficent catnip.';
  309. contents += '</span>'
  310.  
  311. }
  312. }else{
  313. contents += '<span style="color: red;">'
  314. contents += 'no, insufficent catnip.';
  315. contents += '</span>'
  316. }
  317. }else{
  318. contents += '<span style="color: purple;">'
  319. contents += "Season detection error. Please report with screenshot to:"
  320. contents += "<br>";
  321. contents += "https://greasyfork.org/en/scripts/10234-kittens-game-data-output";
  322. contents += '</span>'
  323. }
  324. contents += "<br>";
  325. }else{
  326. contents += "No catnip consumed<br>"
  327. }
  328. return contents;
  329. }
  330.  
  331. function output_data() {
  332. document.getElementById('food_table_season').innerHTML = generate_food_table(200, 'Food during seasons (/season)');
  333. document.getElementById('food_balance_info').innerHTML = generate_food_balance_data();
  334. }
  335.  
  336. setInterval(output_data, 200);