big steppy
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

301 lines
7.3 KiB

  1. var baseHeight = 3.65;
  2. var baseMass = 1360;
  3. var scale = 1;
  4. var strolling = false;
  5. var maxStomachDigest = 10;
  6. var maxBowelsDigest = 10;
  7. var metric = true;
  8. var verbose = true;
  9. victims = {};
  10. function toggle_auto()
  11. {
  12. strolling = !strolling;
  13. document.getElementById("strolling-indicator").innerHTML = strolling ? "Strolling" : "Standing";
  14. if (strolling)
  15. update(["You start walking."]);
  16. else
  17. update(["You stop walking."]);
  18. }
  19. function toggle_units()
  20. {
  21. metric = !metric;
  22. document.getElementById("button-units").innerHTML = metric ? "Metric" : "Customary";
  23. update();
  24. }
  25. function toggle_verbose()
  26. {
  27. verbose = !verbose;
  28. document.getElementById("button-verbose").innerHTML = verbose ? "Verbose" : "Simple";
  29. }
  30. function initVictims()
  31. {
  32. return {
  33. "Person": 0,
  34. "Car": 0,
  35. "Bus": 0,
  36. "Tram": 0,
  37. "Motorcycle": 0,
  38. "House": 0,
  39. "Small Skyscraper": 0,
  40. "Train": 0,
  41. "Train Car": 0,
  42. "Parking Garage": 0,
  43. "Overpass": 0,
  44. };
  45. };
  46. // lists out total people
  47. function summarize(sum, fatal = true)
  48. {
  49. return "(" + sum["Person"] + " " + (fatal ? (sum["Person"] > 1 ? "kills" : "kill") : (sum["Person"] > 1 ? "people" : "person")) + ")";
  50. }
  51. var stomach = []
  52. var bowels = []
  53. function getOnePrey(area)
  54. {
  55. var potential = ["Person", "Car", "Bus", "Tram", "House", "Train", "Parking Garage", "Small Skyscraper"];
  56. var potAreas = []
  57. potential.forEach(function (x) {
  58. potAreas.push([x,areas[x]]);
  59. });
  60. potAreas = potAreas.sort(function (x,y) {
  61. return x[1] < y[1];
  62. });
  63. for (var i=0; i<potAreas.length; i++) {
  64. x = potAreas[i];
  65. if (x[1] < area) {
  66. return new things[x[0]](1);
  67. }
  68. };
  69. return new Person(1);
  70. }
  71. function getPrey(region, area)
  72. {
  73. switch(region)
  74. {
  75. case "suburb": return suburbPrey(area);
  76. }
  77. }
  78. function suburbPrey(area)
  79. {
  80. return fill_area2(area, {"Person": 0.5, "House": 0.5, "Car": 0.2, "Tram": 0.1, "Bus": 0.1, "Small Skyscraper": 0.05, "Parking Garage": 0.02, "Train": 0.05});
  81. }
  82. function updateVictims(type,prey)
  83. {
  84. var sums = prey.sum();
  85. for (var key in sums) {
  86. if (sums.hasOwnProperty(key)) {
  87. victims[type][key] += sums[key];
  88. }
  89. }
  90. }
  91. function scaleAddMass(scale, baseMass, mass)
  92. {
  93. var startMass = Math.pow(scale, 3) * baseMass;
  94. var newMass = startMass + mass;
  95. return Math.pow(newMass / baseMass, 1/3) ;
  96. }
  97. function feed()
  98. {
  99. var prey = getPrey("suburb", 0.5*scale*scale);
  100. var line = prey.eat(verbose) + " " + summarize(prey.sum(), false);
  101. var preyMass = prey.sum_property("mass");
  102. scale = scaleAddMass(scale, baseMass, preyMass);
  103. stomach.push(prey);
  104. if (stomach.length == 1)
  105. setTimeout(function() { doDigest("stomach"); }, 15000);
  106. updateVictims("stomach",prey);
  107. update([line]);
  108. }
  109. function stomp()
  110. {
  111. var prey = getPrey("suburb", 1.5*scale*scale);
  112. var line = prey.stomp(verbose) + " " + summarize(prey.sum(), true);
  113. var preyMass = prey.sum_property("mass");
  114. scale = scaleAddMass(scale, baseMass, preyMass);
  115. updateVictims("stomped",prey);
  116. update([line]);
  117. }
  118. function anal_vore()
  119. {
  120. var prey = getOnePrey(0.25*scale*scale);
  121. var crushed = getPrey("suburb",3*scale*scale);
  122. var line1 = prey.anal_vore(verbose, baseHeight*scale) + " " + summarize(prey.sum(), false);
  123. var line2 = crushed.buttcrush(verbose) + " " + summarize(crushed.sum(), true)
  124. var preyMass = prey.sum_property("mass");
  125. var crushedMass = prey.sum_property("mass");
  126. scale = scaleAddMass(scale, baseMass, preyMass);
  127. scale = scaleAddMass(scale, baseMass, crushedMass);
  128. bowels.push(prey);
  129. if (bowels.length == 1)
  130. setTimeout(function() { doDigest("bowels"); }, 15000);
  131. updateVictims("bowels",prey);
  132. updateVictims("stomped",crushed);
  133. update([line1,line2]);
  134. }
  135. function update(lines = [])
  136. {
  137. var log = document.getElementById("log");
  138. lines.forEach(function (x) {
  139. var line = document.createElement('div');
  140. line.innerHTML = x;
  141. log.appendChild(line);
  142. });
  143. log.scrollTop = log.scrollHeight;
  144. var height = baseHeight * scale;
  145. var mass = baseMass * Math.pow(scale, 3);
  146. document.getElementById("height").innerHTML = "Height: " + (metric ? metricLength(height) : customaryLength(height));
  147. document.getElementById("mass").innerHTML = "Mass: " + (metric ? metricMass(mass) : customaryMass(mass));
  148. for (var type in victims) {
  149. if (victims.hasOwnProperty(type)) {
  150. for (var key in victims[type]){
  151. if (victims[type].hasOwnProperty(key)) {
  152. if (document.getElementById("stats-" + type + "-" + key) == null) {
  153. if (victims[type][key] == 0)
  154. continue;
  155. child = document.createElement('div');
  156. child.id = "stats-" + type + "-" + key;
  157. child.classList.add("stat-line");
  158. document.getElementById("stats-" + type).appendChild(child);
  159. }
  160. document.getElementById("stats-" + type + "-" + key).innerHTML = key + ": " + victims[type][key];
  161. }
  162. }
  163. }
  164. }
  165. }
  166. function pick_move()
  167. {
  168. if (!strolling) {
  169. setTimeout(pick_move, 1500 * Math.sqrt(scale));
  170. return;
  171. }
  172. var choice = Math.random();
  173. if (choice < 0.2) {
  174. anal_vore();
  175. } else if (choice < 0.6) {
  176. stomp();
  177. } else {
  178. feed();
  179. }
  180. setTimeout(pick_move, 1500 * Math.sqrt(scale));
  181. }
  182. function grow()
  183. {
  184. scale *= 1.2;
  185. update();
  186. }
  187. // pop the list and digest that object
  188. function doDigest(containerName)
  189. {
  190. var digestType = containerName == "stomach" ? stomach : bowels;
  191. var count = 0
  192. if (containerName == "stomach") {
  193. count = stomach.length;
  194. count = Math.min(count,maxStomachDigest);
  195. } else if (containerName == "bowels") {
  196. count = bowels.length;
  197. count = Math.min(count,maxBowelsDigest);
  198. }
  199. var container = new Container();
  200. while (count > 0) {
  201. --count;
  202. var toDigest = digestType.shift();
  203. if (toDigest.name != "Container")
  204. toDigest = new Container([toDigest]);
  205. container = container.merge(toDigest);
  206. }
  207. var digested = container.sum();
  208. for (var key in victims[containerName]) {
  209. if (victims[containerName].hasOwnProperty(key) && digested.hasOwnProperty(key) ) {
  210. victims["digested"][key] += digested[key];
  211. victims[containerName][key] -= digested[key];
  212. }
  213. }
  214. if (containerName == "stomach")
  215. update(["Your stomach gurgles as it digests " + container.describe(false) + " " + summarize(container.sum())]);
  216. else if (containerName == "bowels")
  217. update(["Your bowels churn as they absorb " + container.describe(false) + " " + summarize(container.sum())]);
  218. if (digestType.length > 0) {
  219. setTimeout(function() {
  220. doDigest(containerName);
  221. }, 15000);
  222. }
  223. }
  224. window.addEventListener('load', function(event) {
  225. victims["stomped"] = initVictims();
  226. victims["digested"] = initVictims();
  227. victims["stomach"] = initVictims();
  228. victims["bowels"] = initVictims();
  229. document.getElementById("button-grow").addEventListener("click",grow);
  230. document.getElementById("button-feed").addEventListener("click",feed);
  231. document.getElementById("button-stomp").addEventListener("click",stomp);
  232. document.getElementById("button-anal_vore").addEventListener("click",anal_vore);
  233. document.getElementById("button-stroll").addEventListener("click",toggle_auto);
  234. document.getElementById("button-units").addEventListener("click",toggle_units);
  235. document.getElementById("button-verbose").addEventListener("click",toggle_verbose);
  236. setTimeout(pick_move, 2000);
  237. update();
  238. });