Kitten Extrapolation

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

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

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