Kitten Extrapolation

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

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

  1. // ==UserScript==
  2. // @name Kitten Extrapolation
  3. // @namespace https://greasyfork.org/en/scripts/10234-kitten-extrapolation
  4. // @version 0.4
  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. total *= seconds;
  52. return total;
  53. }
  54.  
  55. function calculate_food_data(weather_ratio_val, seconds) {
  56. var total = calculate_food_income_data(weather_ratio_val, seconds);
  57. var resMapConsumption = gamePage.village.getResConsumption();
  58. var resConsumption = resMapConsumption['catnip'] || 0;
  59. resConsumption = resConsumption * (1 + gamePage.bld.getEffect('catnip' + "DemandRatio", true));
  60. resConsumption *= 5;
  61. resConsumption *= seconds;
  62. total += resConsumption;
  63. return total
  64. }
  65.  
  66. function val_to_printable(total) {
  67. var total_value = '';
  68. if(!(isFinite(total))){
  69. total_value = total;
  70. }else if(Math.abs(total)>1000000000000){
  71. total = total / 1000000000000;
  72. total = total.toFixed(1);
  73. total_value += total;
  74. total_value += ' T';
  75. }else if(Math.abs(total)>1000000000){
  76. total = total / 1000000000;
  77. total = total.toFixed(1);
  78. total_value += total;
  79. total_value += ' G';
  80. }else if(Math.abs(total)>1000000){
  81. total = total / 1000000;
  82. total = total.toFixed(1);
  83. total_value += total;
  84. total_value += ' M';
  85. }else if(Math.abs(total)>1000){
  86. total = total / 1000;
  87. total = total.toFixed(1);
  88. total_value += total;
  89. total_value += ' k';
  90. }else{
  91. total = total.toFixed(2);
  92. total_value += total;
  93. }
  94. return total_value;
  95. }
  96.  
  97. function generate_food_table(seconds, label) {
  98. var contents = '';
  99. //Define the table colomn widths
  100. contents += '<col width="100">';
  101. contents += '<col width="60">';
  102. contents += '<col width="60">';
  103. contents += '<col width="60">';
  104. contents += '<col width="60">';
  105. //The top of the table, describing what it is showing. Leave once cell blank at the start
  106. contents += '<tr>';
  107. contents += '<td style="text-align:center">'
  108. contents += ' '
  109. contents += '</td>';
  110. contents += '<td style="text-align:center" colspan="4">'
  111. contents += label
  112. contents += '</td>';
  113. contents += '</tr>';
  114. //Second level of 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">'
  120. contents += 'Winter'
  121. contents += '</td> <td style="text-align:center">'
  122. contents += 'Spring'
  123. contents += '</td> <td style="text-align:center">'
  124. contents += 'Summer'
  125. contents += '</td> <td style="text-align:center">'
  126. contents += 'Autumn'
  127. contents += '</td>';
  128. contents += '</tr>';
  129. //Data for a good season
  130. contents += '<tr>';
  131. contents += '<td style="text-align:center">'
  132. contents += 'Good season'
  133. contents += '</td>';
  134. contents += '<td style="text-align:center">'
  135. contents += val_to_printable(calculate_food_data(-0.60, seconds))
  136. contents += '</td> <td style="text-align:center">'
  137. contents += val_to_printable(calculate_food_data(0.65, seconds))
  138. contents += '</td> <td style="text-align:center">'
  139. contents += val_to_printable(calculate_food_data(0.15, seconds))
  140. contents += '</td> <td style="text-align:center">'
  141. contents += val_to_printable(calculate_food_data(0.15, seconds))
  142. contents += '</td>';
  143. contents += '</tr>';
  144. //Data for an average season
  145. contents += '<tr>';
  146. contents += '<td style="text-align:center">'
  147. contents += 'Avg season'
  148. contents += '</td>';
  149. contents += '<td style="text-align:center">'
  150. contents += val_to_printable(calculate_food_data(-0.75, seconds))
  151. contents += '</td> <td style="text-align:center">'
  152. contents += val_to_printable(calculate_food_data(0.50, seconds))
  153. contents += '</td> <td style="text-align:center">'
  154. contents += val_to_printable(calculate_food_data(0.0, seconds))
  155. contents += '</td> <td style="text-align:center">'
  156. contents += val_to_printable(calculate_food_data(0.0, seconds))
  157. contents += '</td>';
  158. contents += '</tr>';
  159. //Data for a bad season
  160. contents += '<tr>';
  161. contents += '<td style="text-align:center">'
  162. contents += 'Bad season'
  163. contents += '</td>';
  164. contents += '<td style="text-align:center">'
  165. contents += val_to_printable(calculate_food_data(-0.90, seconds))
  166. contents += '</td> <td style="text-align:center">'
  167. contents += val_to_printable(calculate_food_data(0.35, seconds))
  168. contents += '</td> <td style="text-align:center">'
  169. contents += val_to_printable(calculate_food_data(-0.15, seconds))
  170. contents += '</td> <td style="text-align:center">'
  171. contents += val_to_printable(calculate_food_data(-0.15, seconds))
  172. contents += '</td>';
  173. contents += '</tr>';
  174. return contents
  175. }
  176.  
  177. function generate_food_balance_data() {
  178. var contents = '';
  179. contents += "Yearly food produced (avg): ";
  180. 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))
  181. contents += "<br>";
  182. var resMapConsumption = gamePage.village.getResConsumption();
  183. var resConsumption = resMapConsumption['catnip'] || 0;
  184. resConsumption = resConsumption * (1 + gamePage.bld.getEffect('catnip' + "DemandRatio", true));
  185. resConsumption *= 5;
  186. resConsumption *= 800;
  187. contents += "Yearly food consumed (avg): ";
  188. contents += val_to_printable(-resConsumption);
  189. contents += "<br>";
  190. contents += "Surplus (or deficit): ";
  191. 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);
  192. contents += "<br>";
  193. contents += "Surplus/consumed: ";
  194. 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) {
  195. contents += '<span style="color: green;">'
  196. }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) {
  197. contents += '<span style="color: yellow;">'
  198. }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) {
  199. contents += '<span style="color: red;">'
  200. }else{
  201. contents += '<span">'
  202. }
  203. 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);
  204. contents += "%";
  205. contents += '</span>'
  206. contents += "<br>";
  207. //Get the current season
  208. day = gamePage.calendar.day;
  209. var season = gamePage.calendar.seasons[gamePage.calendar.season].title;
  210. weatherMod = gamePage.calendar.getWeatherMod();
  211. weatherMod = (gamePage.calendar.getCurSeason().modifiers["catnip"] + weatherMod);
  212. weatherMod -= 1;
  213. if(season == "Winter")
  214. {
  215. contents += "Can I survive the winter? ";
  216. if(gamePage.resPool.get("catnip").value+((100-day)/100)*calculate_food_data(weatherMod, 200)>0){
  217. contents += '<span style="color: green;">'
  218. contents += 'yes';
  219. contents += '</span>'
  220. contents += "<br>";
  221. contents += "A bad year till after next winter? ";
  222. 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){
  223. contents += '<span style="color: green;">'
  224. contents += 'yes';
  225. contents += '</span>'
  226. }else{
  227. contents += '<span style="color: red;">'
  228. contents += 'no, insufficent catnip.';
  229. contents += '</span>'
  230.  
  231. }
  232. }else{
  233. contents += '<span style="color: red;">'
  234. contents += 'no, insufficent catnip.';
  235. contents += '</span>'
  236.  
  237. }
  238. }else if(season == "Autumn")
  239. {
  240. contents += "Can I survive a bad winter? ";
  241. if(gamePage.resPool.get("catnip").value+((100-day)/100)*calculate_food_data(weatherMod, 200)+calculate_food_data(-0.90, 200)>0){
  242. contents += '<span style="color: green;">'
  243. contents += 'yes';
  244. contents += '</span>'
  245. contents += "<br>";
  246. contents += "A bad year till after next winter? ";
  247. 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){
  248. contents += '<span style="color: green;">'
  249. contents += 'yes';
  250. contents += '</span>'
  251. }else{
  252. contents += '<span style="color: red;">'
  253. contents += 'no, insufficent catnip.';
  254. contents += '</span>'
  255.  
  256. }
  257. }else{
  258. contents += '<span style="color: red;">'
  259. contents += 'no, insufficent catnip.';
  260. contents += '</span>'
  261. }
  262. }else if(season == "Summer")
  263. {
  264. contents += "Can I survive a bad winter? ";
  265. 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){
  266. contents += '<span style="color: green;">'
  267. contents += 'yes';
  268. contents += '</span>'
  269. contents += "<br>";
  270. contents += "A bad year till after next winter? ";
  271. 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){
  272. contents += '<span style="color: green;">'
  273. contents += 'yes';
  274. contents += '</span>'
  275. }else{
  276. contents += '<span style="color: red;">'
  277. contents += 'no, insufficent catnip.';
  278. contents += '</span>'
  279.  
  280. }
  281. }else{
  282. contents += '<span style="color: red;">'
  283. contents += 'no, insufficent catnip.';
  284. contents += '</span>'
  285. }
  286. }else if(season == "Spring")
  287. {
  288. contents += "Can I survive a bad winter? ";
  289. 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){
  290. contents += '<span style="color: green;">'
  291. contents += 'yes';
  292. contents += '</span>'
  293. contents += "<br>";
  294. contents += "A bad year till after next winter? ";
  295. if(gamePage.resPool.get("catnip").value+((100-day)/100)*calculate_food_data(weatherMod, 200)+calculate_food_data(-0.90, 200)>0){
  296. contents += '<span style="color: green;">'
  297. contents += 'yes';
  298. contents += '</span>'
  299. }else{
  300. contents += '<span style="color: red;">'
  301. contents += 'no, insufficent catnip.';
  302. contents += '</span>'
  303.  
  304. }
  305. }else{
  306. contents += '<span style="color: red;">'
  307. contents += 'no, insufficent catnip.';
  308. contents += '</span>'
  309. }
  310. }else{
  311. contents += '<span style="color: purple;">'
  312. contents += "Season detection error. Please report with screenshot to:"
  313. contents += "<br>";
  314. contents += "https://greasyfork.org/en/scripts/10234-kittens-game-data-output";
  315. contents += '</span>'
  316. }
  317. contents += "<br>";
  318. return contents;
  319. }
  320.  
  321. function output_data() {
  322. document.getElementById('food_table_season').innerHTML = generate_food_table(200, 'Food during seasons (/season)');
  323. document.getElementById('food_balance_info').innerHTML = generate_food_balance_data();
  324. }
  325.  
  326. setInterval(output_data, 200);