Kitten Extrapolation

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

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

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