big steppy
Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.
 
 
 

2183 wiersze
58 KiB

  1. var strolling = false;
  2. var maxStomachDigest = 10;
  3. var maxBowelsDigest = 10;
  4. var unit = "metric";
  5. var numbers = "full";
  6. var verbose = true;
  7. var biome = "suburb";
  8. var newline = " ";
  9. victims = {};
  10. var humanMode = true;
  11. var macro =
  12. {
  13. "scaling": function(value, scale, factor) { return value * Math.pow(scale,factor); },
  14. "name": "",
  15. "species": "crux",
  16. "color" : "blue",
  17. "baseHeight": 2.26,
  18. get height() { return this.scaling(this.baseHeight, this.scale, 1); },
  19. "baseMass": 135,
  20. get mass () { return this.scaling(this.baseMass, this.scale, 3); },
  21. "basePawArea": 0.1,
  22. get pawArea() { return this.scaling(this.basePawArea, this.scale, 2); },
  23. "baseAnalVoreArea": 0.1,
  24. get analVoreArea() { return this.scaling(this.baseAnalVoreArea, this.scale, 2); },
  25. "baseAssArea": 0.4,
  26. get assArea() { return this.scaling(this.baseAssArea * this.assScale, this.scale, 2); },
  27. "baseHandArea": 0.1,
  28. get handArea() { return this.scaling(this.baseHandArea, this.scale, 2); },
  29. "assScale": 1,
  30. analVore: true,
  31. "hasTail": true,
  32. "tailType": "slinky",
  33. "tailCount": 1,
  34. "baseTailLength": 1,
  35. "baseTailDiameter": 0.1,
  36. "tailDensity": 250,
  37. "tailScale": 1,
  38. "tailMaw": false,
  39. get tailLength() {
  40. return this.scaling(this.baseTailLength * this.tailScale, this.scale, 1);
  41. },
  42. get tailDiameter() {
  43. return this.scaling(this.baseTailDiameter * this.tailScale, this.scale, 1);
  44. },
  45. get tailGirth() {
  46. return Math.pow(this.tailDiameter/2,2) * Math.PI;
  47. },
  48. get tailArea() {
  49. return this.tailLength * this.tailDiameter;
  50. },
  51. get tailVolume() {
  52. return this.tailGirth * this.tailLength;
  53. },
  54. get tailMass() {
  55. return this.tailVolume * this.tailDensity;
  56. },
  57. "dickType": "canine",
  58. "baseDickLength": 0.3,
  59. "baseDickDiameter": 0.08,
  60. "dickDensity": 1000,
  61. "dickScale": 1,
  62. get dickLength() {
  63. factor = 1;
  64. if (!this.arousalEnabled || this.arousal < 25) {
  65. factor = 0.5;
  66. } else if (this.arousal < 75) {
  67. factor = 0.5 + (this.arousal - 25) / 100;
  68. }
  69. return this.scaling(this.baseDickLength * this.dickScale * factor, this.scale, 1);
  70. },
  71. get dickDiameter() {
  72. factor = 1;
  73. if (!this.arousalEnabled || this.arousal < 25) {
  74. factor = 0.5;
  75. } else if (this.arousal < 75) {
  76. factor = 0.5 + (this.arousal - 25) / 100;
  77. }
  78. return this.scaling(this.baseDickDiameter * this.dickScale * factor, this.scale, 1);
  79. },
  80. get dickGirth() {
  81. return Math.pow((this.dickDiameter/ 2),2) * Math.PI;
  82. },
  83. get dickArea() {
  84. return this.dickLength* this.dickDiameter* Math.PI / 2;
  85. },
  86. get dickVolume() {
  87. return this.dickLength* Math.pow(this.dickDiameter2,2) * Math.PI;
  88. },
  89. get dickMass() {
  90. return this.dickVolume* this.dickDensity;
  91. },
  92. "baseBallDiameter": 0.05,
  93. "ballDensity": 1000,
  94. "ballScale": 1,
  95. get ballDiameter() { return this.scaling(this.baseBallDiameter * this.ballScale, this.scale, 1); },
  96. get ballArea() { return 2 * Math.PI * Math.pow(this.ballDiameter/2, 2) },
  97. get ballVolume() {
  98. var radius = this.ballDiameter / 2;
  99. return 4/3 * Math.PI * Math.pow(radius,3);
  100. },
  101. get ballMass() {
  102. var volume = this.ballVolume;
  103. return volume * this.ballDensity;
  104. },
  105. "baseCumRatio": 1,
  106. "cumScale": 1,
  107. get cumVolume() {
  108. return this.dickGirth * this.baseCumRatio * this.cumScale * (1 + this.edge) + Math.max(0,this.cumStorage.amount - this.cumStorage.limit);
  109. },
  110. "baseVaginaLength": 0.1,
  111. "baseVaginaWidth": 0.05,
  112. "vaginaScale": 1,
  113. get vaginaLength() { return this.scaling(this.baseVaginaLength * this.vaginaScale, this.scale, 1); },
  114. get vaginaWidth() { return this.scaling(this.baseVaginaWidth * this.vaginaScale, this.scale, 1); },
  115. get vaginaArea() { return this.vaginaLength * this.vaginaWidth },
  116. get vaginaVolume() { return this.vaginaArea * this.vaginaWidth },
  117. "baseFemcumRatio": 1,
  118. "femcumScale": 1,
  119. get femcumVolume() {
  120. return this.vaginaArea * this.baseFemcumRatio * this.femcumScale * (1 + this.edge) + Math.max(0,this.femcumStorage.amount - this.femcumStorage.limit);
  121. },
  122. hasBreasts: true,
  123. lactationEnabled: true,
  124. lactationScale: 1,
  125. lactationFactor: 0.25,
  126. get lactationVolume() {
  127. return this.milkStorage.limit * this.lactationFactor;
  128. },
  129. "baseBreastDiameter": 0.1,
  130. "breastScale": 1,
  131. "breastDensity": 1000,
  132. get breastDiameter() { return this.scaling(this.baseBreastDiameter * this.breastScale, this.scale, 1); },
  133. get breastArea() {
  134. return 2 * Math.PI * Math.pow(this.breastDiameter/2,2);
  135. },
  136. get breastVolume() {
  137. var radius = this.breastDiameter / 2;
  138. return 4/3 * Math.PI * Math.pow(radius,3);
  139. },
  140. get breastMass() {
  141. var volume = this.breastVolume;
  142. return volume * this.breastDensity;
  143. },
  144. "digest": function(owner,organ) {
  145. var count = Math.min(organ.contents.length, organ.maxDigest);
  146. var container = new Container();
  147. while (count > 0) {
  148. var victim = organ.contents.shift();
  149. if (victim.name != "Container")
  150. victim = new Container([victim]);
  151. container = container.merge(victim);
  152. --count;
  153. }
  154. var digested = container.sum();
  155. for (var key in victims[organ.name]) {
  156. if (victims[organ.name].hasOwnProperty(key) && digested.hasOwnProperty(key) ) {
  157. victims["digested"][key] += digested[key];
  158. victims[organ.name][key] -= digested[key];
  159. }
  160. }
  161. var line = organ.describeDigestion(container);
  162. organ.fill(this,container);
  163. var summary = summarize(container.sum());
  164. if (organ.contents.length > 0) {
  165. setTimeout(function() { owner.digest(owner,organ) }, 15000);
  166. }
  167. update([line,summary,newline]);
  168. },
  169. "stomach": {
  170. "name": "stomach",
  171. "feed": function(prey) {
  172. this.feedFunc(prey,this,this.owner);
  173. },
  174. "feedFunc": function(prey,self,owner) {
  175. if (self.contents.length == 0)
  176. setTimeout(function() { owner.digest(owner,self) }, 15000);
  177. this.contents.push(prey);
  178. },
  179. "describeDigestion": function(container) {
  180. return describe("stomach",container,this.owner,verbose);
  181. },
  182. "fill": function(owner,container) {
  183. //no-op
  184. },
  185. "contents": [],
  186. "maxDigest": 5
  187. },
  188. "bowels": {
  189. "name" : "bowels",
  190. "feed": function(prey) {
  191. this.feedFunc(prey,this,this.owner);
  192. },
  193. "feedFunc": function(prey,self,owner) {
  194. if (self.contents.length == 0)
  195. setTimeout(function() { owner.digest(owner,self) }, 15000);
  196. this.contents.push(prey);
  197. },
  198. "describeDigestion" : function(container) {
  199. return describe("bowels",container,this.owner,verbose);
  200. },
  201. "fill": function(owner,container) {
  202. //no-op
  203. },
  204. "contents" : [],
  205. "maxDigest" : 3
  206. },
  207. "womb": {
  208. "name" : "womb",
  209. "feed": function(prey) {
  210. this.feedFunc(prey,this,this.owner);
  211. },
  212. "feedFunc": function(prey,self,owner) {
  213. if (self.contents.length == 0)
  214. setTimeout(function() { owner.digest(owner,self) }, 15000);
  215. this.contents.push(prey);
  216. },
  217. "describeDigestion" : function(container) {
  218. return describe("womb",container,this.owner,verbose);
  219. },
  220. "fill": function(owner,container) {
  221. owner.femcumStorage.amount += container.sum_property("mass") / 1e3;
  222. },
  223. "contents" : [],
  224. "maxDigest" : 1
  225. },
  226. "balls": {
  227. "name" : "balls",
  228. "feed": function(prey) {
  229. this.feedFunc(prey,this,this.owner);
  230. },
  231. "feedFunc": function(prey,self,owner) {
  232. if (self.contents.length == 0)
  233. setTimeout(function() { owner.digest(owner,self) }, 15000);
  234. this.contents.push(prey);
  235. },
  236. "describeDigestion": function(container) {
  237. return describe("balls",container,this.owner,verbose);
  238. },
  239. "fill": function(owner,container) {
  240. owner.cumStorage.amount += container.sum_property("mass") / 1e3;
  241. },
  242. "contents" : [],
  243. "maxDigest" : 1
  244. },
  245. "breasts": {
  246. "name" : "breasts",
  247. "feed": function(prey) {
  248. this.feedFunc(prey,this,this.owner);
  249. },
  250. "feedFunc": function(prey,self,owner) {
  251. if (self.contents.length == 0)
  252. setTimeout(function() { owner.digest(owner,self) }, 1500);
  253. this.contents.push(prey);
  254. },
  255. "describeDigestion": function(container) {
  256. return describe("breasts",container,this.owner,verbose);
  257. },
  258. "fill": function(owner,container) {
  259. if (macro.lactationEnabled) {
  260. owner.milkStorage.amount += container.sum_property("mass") / 1e3;
  261. }
  262. },
  263. "contents" : [],
  264. "maxDigest" : 1
  265. },
  266. // holding spots
  267. hasPouch: true,
  268. "pouch": {
  269. "name": "pouch",
  270. "container": new Container(),
  271. get description() {
  272. if (this.container.count == 0)
  273. return "Your pouch is empty";
  274. else
  275. return "Your pouch contains " + this.container.describe(false);
  276. },
  277. "add": function(victims) {
  278. this.container = this.container.merge(victims);
  279. }
  280. },
  281. "init": function() {
  282. this.stomach.owner = this;
  283. this.bowels.owner = this;
  284. this.womb.owner = this;
  285. this.balls.owner = this;
  286. this.breasts.owner = this;
  287. this.cumStorage.owner = this;
  288. this.femcumStorage.owner = this;
  289. this.milkStorage.owner = this;
  290. if (this.maleParts)
  291. this.fillCum(this);
  292. if (this.femaleParts)
  293. this.fillFemcum(this);
  294. if (this.lactationEnabled)
  295. this.fillBreasts(this);
  296. if (this.arousalEnabled) {
  297. this.quenchExcess(this);
  298. }
  299. },
  300. "maleParts": true,
  301. "femaleParts": true,
  302. "fillCum": function(self) {
  303. self.cumStorage.amount += self.cumScale * self.ballVolume / 1200;
  304. if (self.cumStorage.amount > self.cumStorage.limit)
  305. self.arouse(1 * (self.cumStorage.amount / self.cumStorage.limit - 1));
  306. setTimeout(function () { self.fillCum(self) }, 100);
  307. update();
  308. },
  309. "fillFemcum": function(self) {
  310. self.femcumStorage.amount += self.femcumScale * self.vaginaVolume / 1200;
  311. if (self.femcumStorage.amount > self.femcumStorage.limit)
  312. self.arouse(1 * (self.femcumStorage.amount / self.femcumStorage.limit - 1));
  313. setTimeout(function () { self.fillFemcum(self) }, 100);
  314. update();
  315. },
  316. "fillBreasts": function(self) {
  317. if (self.milkStorage.amount > self.milkStorage.limit) {
  318. milk_breasts(null, self.milkStorage.amount - self.milkStorage.limit);
  319. }
  320. self.milkStorage.amount += self.lactationScale * self.milkStorage.limit / 1200;
  321. if (self.milkStorage.amount > self.milkStorage.limit) {
  322. self.milkStorage.amount = self.milkStorage.limit;
  323. }
  324. setTimeout(function () { self.fillBreasts(self) }, 100);
  325. update();
  326. },
  327. "cumStorage": {
  328. "amount": 0,
  329. get limit() {
  330. return this.owner.ballVolume;
  331. }
  332. },
  333. "femcumStorage": {
  334. "amount": 0,
  335. get limit() {
  336. return this.owner.vaginaVolume;
  337. }
  338. },
  339. "milkStorage": {
  340. "amount": 0,
  341. get limit() {
  342. return this.owner.breastVolume * 2;
  343. }
  344. },
  345. "orgasm": false,
  346. "afterglow": false,
  347. "arousalEnabled": true,
  348. "arousalFactor": 1,
  349. "arousal": 0,
  350. "edge": 0,
  351. "maleSpurt": 0,
  352. "femaleSpurt": 0,
  353. "arouse": function(amount) {
  354. if (!this.arousalEnabled)
  355. return;
  356. if (this.afterglow)
  357. return;
  358. this.arousal += amount * this.arousalFactor;
  359. if (this.arousal >= 200) {
  360. this.arousal = 200;
  361. if (!this.orgasm) {
  362. this.orgasm = true;
  363. update(["You shudder as ecstasy races up your spine",newline]);
  364. if (this.maleParts) {
  365. this.maleOrgasm(this);
  366. }
  367. if (this.femaleParts) {
  368. this.femaleOrgasm(this);
  369. }
  370. if (!this.maleParts && !this.femaleParts) {
  371. this.nullOrgasm(this);
  372. }
  373. }
  374. }
  375. },
  376. "quench": function(amount) {
  377. if (!this.arousalEnabled)
  378. return;
  379. this.arousal -= amount;
  380. if (this.arousal <= 100) {
  381. if (this.orgasm) {
  382. this.orgasm = false;
  383. this.afterglow = true;
  384. }
  385. }
  386. if (this.arousal < 0) {
  387. this.arousal = 0;
  388. this.afterglow = false;
  389. }
  390. update();
  391. },
  392. "quenchExcess": function(self) {
  393. if (self.arousalEnabled) {
  394. if (self.arousal > 100 && !self.orgasm) {
  395. self.arousal = Math.max(100,self.arousal-1);
  396. self.edge += Math.sqrt((self.arousal - 100)) / 500;
  397. self.edge = Math.min(1,self.edge);
  398. self.edge = Math.max(0,self.edge - 0.002);
  399. if (self.maleParts)
  400. self.maleSpurt += ((self.arousal-100)/100 + Math.random()) / 25 * (self.edge);
  401. if (self.femaleParts)
  402. self.femaleSpurt += ((self.arousal-100)/100 + Math.random()) / 25 * (self.edge);
  403. if (self.maleSpurt > 1) {
  404. male_spurt(macro.cumVolume * (0.1 + Math.random() / 10));
  405. self.maleSpurt = 0;
  406. }
  407. if (self.femaleSpurt > 1) {
  408. female_spurt(macro.femcumVolume * (0.1 + Math.random() / 10));
  409. self.femaleSpurt = 0;
  410. }
  411. update();
  412. } else if (self.afterglow) {
  413. self.quench(0.5);
  414. self.edge = Math.max(0,self.edge - 0.01);
  415. }
  416. }
  417. setTimeout(function() { self.quenchExcess(self); }, 200);
  418. },
  419. "maleOrgasm": function(self) {
  420. if (!this.arousalEnabled)
  421. return;
  422. if (self.orgasm) {
  423. self.quench(10);
  424. var amount = Math.min(this.cumVolume, this.cumStorage.amount);
  425. this.cumStorage.amount -= amount;
  426. male_orgasm(amount);
  427. setTimeout(function() { self.maleOrgasm(self) }, 2000);
  428. }
  429. },
  430. "femaleOrgasm": function(self) {
  431. if (!this.arousalEnabled)
  432. return;
  433. if (this.orgasm) {
  434. this.quench(10);
  435. var amount = Math.min(this.femcumVolume, this.femcumStorage.amount);
  436. this.femcumStorage.amount -= amount;
  437. female_orgasm(amount);
  438. setTimeout(function() { self.femaleOrgasm(self) }, 2000);
  439. }
  440. },
  441. "nullOrgasm": function(self) {
  442. if (!this.arousalEnabled)
  443. return;
  444. if (this.orgasm) {
  445. this.quench(10);
  446. setTimeout(function() { self.nullOrgasm(self) }, 2000);
  447. }
  448. },
  449. get description() {
  450. result = [];
  451. line = "You are " + (macro.name == "" ? "" : macro.name + ", ") + "a " + length(macro.height, unit, true) + " tall " + macro.species + ". You weigh " + mass(macro.mass, unit) + ".";
  452. result.push(line);
  453. if (this.hasTail) {
  454. line = "Your " + macro.describeTail + (macro.tailCount > 1 ? " tails sway as you walk," : "sways as you walk.");
  455. if (this.tailMaw) {
  456. line += (macro.tailCount > 1 ? "Their maws are drooling" : "Its maw is drooling");
  457. }
  458. result.push(line);
  459. }
  460. if (this.arousalEnabled) {
  461. if (this.afterglow) {
  462. result.push("You're basking in the afterglow of a powerful orgasm.");
  463. }
  464. else if (this.orgasm) {
  465. result.push("You're cumming!");
  466. } else if (this.arousal < 25) {
  467. } else if (this.arousal < 75) {
  468. result.push("You're feeling a little aroused.");
  469. } else if (this.arousal < 150) {
  470. result.push("You're feeling aroused.");
  471. } else if (this.arousal < 200) {
  472. result.push("You're on the edge of an orgasm!");
  473. }
  474. }
  475. if (this.maleParts) {
  476. line = "Your " + this.describeDick + " cock hangs from your hips, with two " + mass(macro.ballMass, unit, true) + ", " + length(macro.ballDiameter, unit, true) + "-wide balls hanging beneath.";
  477. result.push(line);
  478. }
  479. if (this.femaleParts) {
  480. line = "Your glistening " + this.describeVagina + " slit peeks out from between your legs."
  481. result.push(line);
  482. }
  483. if (this.hasBreasts) {
  484. line = "You have two " + length(macro.breastDiameter, unit, true) + "-wide breasts that weigh " + mass(macro.breastMass, unit) + " apiece.";
  485. result.push(line);
  486. }
  487. return result;
  488. },
  489. get describeTail() {
  490. return (this.tailCount > 1 ? this.tailCount + " " : "") + length(this.tailLength, unit, true) + "-long " + this.tailType;
  491. },
  492. get describeDick() {
  493. state = "";
  494. if (!this.arousalEnabled) {
  495. state = "limp";
  496. } else if (this.orgasm) {
  497. state = "spurting";
  498. } else {
  499. if (this.arousal < 25) {
  500. state = "limp";
  501. } else if (this.arousal < 75) {
  502. state = "swelling";
  503. } else if (this.arousal < 100) {
  504. state = "erect";
  505. } else if (this.arousal < 150) {
  506. state = "erect, throbbing";
  507. } else if (this.arousal < 200) {
  508. state = "erect, throbbing, pre-soaked";
  509. }
  510. }
  511. return length(this.dickLength, unit, true) + " long " + state + " " + this.dickType;
  512. },
  513. get describeVagina() {
  514. state = "";
  515. if (!this.arousalEnabled) {
  516. state = "unassuming";
  517. } else if (this.orgasm) {
  518. state = "gushing, quivering";
  519. } else {
  520. if (this.arousal < 25) {
  521. state = "unassuming";
  522. } else if (this.arousal < 75) {
  523. state = "moist";
  524. } else if (this.arousal < 100) {
  525. state = "glistening";
  526. } else if (this.arousal < 150) {
  527. state = "dripping";
  528. } else if (this.arousal < 200) {
  529. state = "dripping, quivering";
  530. }
  531. }
  532. return length(this.vaginaLength, unit, true) + " long " + state
  533. },
  534. "growthPoints": 0,
  535. "addGrowthPoints": function(mass) {
  536. this.growthPoints += Math.round(50 * mass / (this.scale*this.scale));
  537. },
  538. // 0 = entirely non-fatal
  539. // 1 = fatal, but not specific
  540. // 2 = gory
  541. "brutality": 1,
  542. "scale": 1,
  543. }
  544. function look()
  545. {
  546. var desc = macro.description;
  547. var line2 = ""
  548. if (macro.height > 1e12)
  549. line2 = "You're pretty much everywhere at once.";
  550. else if (macro.height > 1e6)
  551. line2 = "You're standing...on pretty much everything at once.";
  552. else
  553. switch(biome) {
  554. case "rural": line2 = "You're standing amongst rural farmhouses and expansive ranches. Cattle are milling about at your feet."; break;
  555. case "suburb": line2 = "You're striding through the winding roads of a suburb."; break;
  556. case "city": line2 = "You're terrorizing the streets of a city. Heavy traffic, worsened by your rampage, is everywhere."; break;
  557. case "downtown": line2 = "You're lurking amongst the skyscrapers of downtown. The streets are packed, and the buildings are practically begging you to knock them over.";
  558. }
  559. desc = desc.concat([newline,line2,newline]);
  560. update(desc);
  561. }
  562. function get_living_prey(sum) {
  563. var total = 0;
  564. for (var key in sum) {
  565. if (sum.hasOwnProperty(key)) {
  566. if (key == "Person" || key == "Cow")
  567. total += sum[key];
  568. }
  569. }
  570. return total;
  571. }
  572. function toggle_auto()
  573. {
  574. strolling = !strolling;
  575. document.getElementById("button-stroll").innerHTML = "Status: " + (strolling ? "Strolling" : "Standing");
  576. if (strolling)
  577. update(["You start walking.",newline]);
  578. else
  579. update(["You stop walking.",newline]);
  580. }
  581. function change_location()
  582. {
  583. switch(biome) {
  584. case "suburb": biome = "city"; break;
  585. case "city": biome = "downtown"; break;
  586. case "downtown": biome = "rural"; break;
  587. case "rural": biome = "suburb"; break;
  588. }
  589. document.getElementById("button-location").innerHTML = "Location: " + biome.charAt(0).toUpperCase() + biome.slice(1);
  590. }
  591. function toggle_units()
  592. {
  593. switch(unit) {
  594. case "metric": unit = "customary"; break;
  595. case "customary": unit = "approx"; break;
  596. case "approx": unit = "metric"; break;
  597. }
  598. document.getElementById("button-units").innerHTML = "Units: " + unit.charAt(0).toUpperCase() + unit.slice(1);
  599. update();
  600. }
  601. function toggle_numbers() {
  602. switch(numbers) {
  603. case "full": numbers="prefix"; break;
  604. case "prefix": numbers="words"; break;
  605. case "words": numbers = "scientific"; break;
  606. case "scientific": numbers = "full"; break;
  607. }
  608. document.getElementById("button-numbers").innerHTML = "Numbers: " + numbers.charAt(0).toUpperCase() + numbers.slice(1);
  609. update();
  610. }
  611. function toggle_verbose()
  612. {
  613. verbose = !verbose;
  614. document.getElementById("button-verbose").innerHTML = (verbose ? "Verbose" : "Simple");
  615. }
  616. function toggle_arousal()
  617. {
  618. macro.arousalEnabled = !macro.arousalEnabled;
  619. document.getElementById("button-arousal").innerHTML = (macro.arousalEnabled ? "Arousal On" : "Arousal Off");
  620. if (macro.arousalEnabled) {
  621. document.getElementById("arousal").style.display = "block";
  622. document.getElementById("edge").style.display = "block";
  623. } else {
  624. document.getElementById("arousal").style.display = "none";
  625. document.getElementById("edge").style.display = "none";
  626. }
  627. macro.orgasm = false;
  628. macro.afterglow = false;
  629. }
  630. function initVictims()
  631. {
  632. return {
  633. "Person": 0,
  634. "Cow": 0,
  635. "Car": 0,
  636. "Bus": 0,
  637. "Tram": 0,
  638. "Motorcycle": 0,
  639. "House": 0,
  640. "Barn": 0,
  641. "Small Skyscraper": 0,
  642. "Large Skyscraper": 0,
  643. "Train": 0,
  644. "Train Car": 0,
  645. "Parking Garage": 0,
  646. "Overpass": 0,
  647. "Town": 0,
  648. "City": 0,
  649. "Continent": 0,
  650. "Planet": 0,
  651. "Star": 0,
  652. "Solar System": 0,
  653. "Galaxy": 0
  654. };
  655. };
  656. // lists out total people
  657. function summarize(sum, fatal = true)
  658. {
  659. var word;
  660. var count = get_living_prey(sum);
  661. if (fatal && macro.brutality > 0)
  662. word = count > 1 ? "kills" : "kill";
  663. else if (!fatal && macro.brutality > 0)
  664. word = "prey";
  665. else
  666. word = count > 1 ? "victims" : "victim";
  667. return "<b>(" + count + " " + word + ")</b>";
  668. }
  669. function getOnePrey(biome,area)
  670. {
  671. var potential = ["Person"];
  672. if (macro.height > 1e12)
  673. potential = ["Planet","Star","Solar System","Galaxy"];
  674. else if (macro.height > 1e6)
  675. potential = ["Town","City","Continent","Planet"];
  676. else
  677. switch(biome) {
  678. case "suburb": potential = ["Person", "Car", "Bus", "Train", "House"]; break;
  679. case "city": potential = ["Person", "Car", "Bus", "Train", "Tram", "House", "Parking Garage"]; break;
  680. case "downtown": potential = ["Person", "Car", "Bus", "Tram", "Small Skyscraper", "Large Skyscraper", "Parking Garage"]; break;
  681. case "rural": potential = ["Person", "Barn", "House", "Cow"]; break;
  682. }
  683. var potAreas = []
  684. potential.forEach(function (x) {
  685. potAreas.push([x,areas[x]]);
  686. });
  687. potAreas = potAreas.sort(function (x,y) {
  688. return y[1] - x[1];
  689. });
  690. for (var i=0; i<potAreas.length; i++) {
  691. x = potAreas[i];
  692. if (x[1] < area) {
  693. return new Container([new things[x[0]](1)]);
  694. }
  695. };
  696. return new Container([new Person(1)]);
  697. }
  698. function getPrey(region, area)
  699. {
  700. var weights = {"Person": 1};
  701. if (macro.height > 1e12) {
  702. weights = {
  703. "Planet": 1.47e-10,
  704. "Star": 1.7713746e-12,
  705. "Solar System": 4e-10,
  706. "Galaxy": 0.1,
  707. }
  708. }
  709. else if (macro.height > 1e6) {
  710. weights = {
  711. "Town": 0.1,
  712. "City": 0.05,
  713. "Continent": 0.005,
  714. "Planet": 0.0001
  715. }
  716. }
  717. else {
  718. switch(region)
  719. {
  720. case "rural": weights = {
  721. "Person": 0.05,
  722. "House": 0.01,
  723. "Barn": 0.01,
  724. "Cow": 0.2
  725. }; break;
  726. case "suburb": weights = {
  727. "Person": 0.5,
  728. "House": 0.5,
  729. "Car": 0.2,
  730. "Train": 0.1,
  731. "Bus": 0.1
  732. }; break;
  733. case "city": weights = {
  734. "Person": 0.5,
  735. "House": 0.2,
  736. "Car": 0.2,
  737. "Train": 0.1,
  738. "Bus": 0.1,
  739. "Tram": 0.1,
  740. "Parking Garage": 0.02
  741. }; break;
  742. case "downtown": weights = {
  743. "Person": 0.5,
  744. "Car": 0.3,
  745. "Bus": 0.15,
  746. "Tram": 0.1,
  747. "Parking Garage": 0.02,
  748. "Small Skyscraper": 0.4,
  749. "Large Skyscraper": 0.1
  750. }; break;
  751. }
  752. }
  753. return fill_area(area,weights);
  754. }
  755. function updateVictims(type,prey)
  756. {
  757. var sums = prey.sum();
  758. for (var key in sums) {
  759. if (sums.hasOwnProperty(key)) {
  760. victims[type][key] += sums[key];
  761. }
  762. }
  763. }
  764. function feed()
  765. {
  766. var area = macro.handArea;
  767. var prey = getPrey(biome, area);
  768. var line = describe("eat", prey, macro, verbose)
  769. var linesummary = summarize(prey.sum(), false);
  770. var people = get_living_prey(prey.sum());
  771. var sound = "";
  772. if (people == 0) {
  773. sound = "";
  774. } else if (people < 3) {
  775. sound = "Ulp.";
  776. } else if (people < 10) {
  777. sound = "Gulp.";
  778. } else if (people < 50) {
  779. sound = "Glrrp.";
  780. } else if (people < 500) {
  781. sound = "Glrrrpkh!";
  782. } else if (people < 5000) {
  783. sound = "GLRRKPKH!";
  784. } else {
  785. sound = "Oh the humanity!";
  786. }
  787. var preyMass = prey.sum_property("mass");
  788. macro.addGrowthPoints(preyMass);
  789. macro.stomach.feed(prey);
  790. macro.arouse(5);
  791. updateVictims("stomach",prey);
  792. update([sound,line,linesummary,newline]);
  793. }
  794. function chew()
  795. {
  796. var area = macro.handArea;
  797. var prey = getPrey(biome, area);
  798. var line = describe("chew", prey, macro, verbose)
  799. var linesummary = summarize(prey.sum(), false);
  800. var people = get_living_prey(prey.sum());
  801. var sound = "";
  802. if (people == 0) {
  803. sound = "";
  804. } else if (people < 3) {
  805. sound = "Snap.";
  806. } else if (people < 10) {
  807. sound = "Crunch.";
  808. } else if (people < 50) {
  809. sound = "Crack!";
  810. } else if (people < 500) {
  811. sound = "CRUNCH!";
  812. } else if (people < 5000) {
  813. sound = "CRRRUNCH!";
  814. } else {
  815. sound = "Oh the humanity!";
  816. }
  817. var preyMass = prey.sum_property("mass");
  818. macro.addGrowthPoints(preyMass);
  819. macro.arouse(10);
  820. updateVictims("digested",prey);
  821. update([sound,line,linesummary,newline]);
  822. }
  823. function stomp()
  824. {
  825. var area = macro.pawArea;
  826. var prey = getPrey(biome, area);
  827. var line = describe("stomp", prey, macro, verbose)
  828. var linesummary = summarize(prey.sum(), true);
  829. var people = get_living_prey(prey.sum());
  830. var sound = "Thump";
  831. if (people < 3) {
  832. sound = "Thump!";
  833. } else if (people < 10) {
  834. sound = "Squish!";
  835. } else if (people < 50) {
  836. sound = "Crunch!";
  837. } else if (people < 500) {
  838. sound = "CRUNCH!";
  839. } else if (people < 5000) {
  840. sound = "CRRUUUNCH!!";
  841. } else {
  842. sound = "Oh the humanity!";
  843. }
  844. var preyMass = prey.sum_property("mass");
  845. macro.addGrowthPoints(preyMass);
  846. macro.arouse(5);
  847. updateVictims("stomped",prey);
  848. update([sound,line,linesummary,newline]);
  849. }
  850. function grind()
  851. {
  852. var area = macro.assArea / 2;
  853. if (macro.maleParts)
  854. area += macro.dickArea
  855. if (macro.femalePartS)
  856. area += macro.vaginaArea;
  857. var prey = getPrey(biome,area);
  858. var line = describe("grind", prey, macro, verbose);
  859. var linesummary = summarize(prey.sum(), true);
  860. var people = get_living_prey(prey.sum());
  861. var sound = "";
  862. if (people < 3) {
  863. sound = "Thump.";
  864. } else if (people < 10) {
  865. sound = "Crunch.";
  866. } else if (people < 50) {
  867. sound = "Crrrrunch.";
  868. } else if (people < 500) {
  869. sound = "SMASH!";
  870. } else if (people < 5000) {
  871. sound = "CCCRASH!!";
  872. } else {
  873. sound = "Oh the humanity!";
  874. }
  875. var preyMass = prey.sum_property("mass");
  876. macro.addGrowthPoints(preyMass);
  877. macro.arouse(20);
  878. updateVictims("ground",prey);
  879. update([sound,line,linesummary,newline]);
  880. }
  881. function anal_vore()
  882. {
  883. var area = macro.analVoreArea;
  884. var prey = getOnePrey(biome,area);
  885. var line = describe("anal-vore", prey, macro, verbose);
  886. var linesummary = summarize(prey.sum(), false);
  887. people = get_living_prey(prey.sum());
  888. sound = "Shlp";
  889. if (people < 3) {
  890. sound = "Shlp.";
  891. } else if (people < 10) {
  892. sound = "Squelch.";
  893. } else if (people < 50) {
  894. sound = "Shlurrp.";
  895. } else if (people < 500) {
  896. sound = "SHLRP!";
  897. } else if (people < 5000) {
  898. sound = "SQLCH!!";
  899. } else {
  900. sound = "Oh the humanity!";
  901. }
  902. var preyMass = prey.sum_property("mass");
  903. macro.addGrowthPoints(preyMass);
  904. macro.bowels.feed(prey);
  905. macro.arouse(20);
  906. updateVictims("bowels",prey);
  907. update([sound,line,linesummary,newline]);
  908. }
  909. function sit()
  910. {
  911. if (macro.analVore)
  912. anal_vore();
  913. var area = macro.assArea;
  914. var crushed = getPrey(biome,area);
  915. var line = describe("ass-crush", crushed, macro, verbose);
  916. var linesummary = summarize(crushed.sum(), true);
  917. var people = get_living_prey(crushed.sum());
  918. var sound = "Thump";
  919. if (people < 3) {
  920. sound = "Thump!";
  921. } else if (people < 10) {
  922. sound = "Squish!";
  923. } else if (people < 50) {
  924. sound = "Crunch!";
  925. } else if (people < 500) {
  926. sound = "CRUNCH!";
  927. } else if (people < 5000) {
  928. sound = "CRRUUUNCH!!";
  929. } else {
  930. sound = "Oh the humanity!";
  931. }
  932. var crushedMass = crushed.sum_property("mass");
  933. macro.addGrowthPoints(crushedMass);
  934. macro.arouse(5);
  935. updateVictims("stomped",crushed);
  936. update([sound,line,linesummary,newline]);
  937. }
  938. function breast_crush()
  939. {
  940. var area = macro.breastArea;
  941. var prey = getPrey(biome, area);
  942. var line = describe("breast-crush", prey, macro, verbose);
  943. var linesummary = summarize(prey.sum(), true);
  944. var people = get_living_prey(prey.sum());
  945. var sound = "Thump";
  946. if (people < 3) {
  947. sound = "Thump!";
  948. } else if (people < 10) {
  949. sound = "Squish!";
  950. } else if (people < 50) {
  951. sound = "Crunch!";
  952. } else if (people < 500) {
  953. sound = "CRUNCH!";
  954. } else if (people < 5000) {
  955. sound = "CRRUUUNCH!!";
  956. } else {
  957. sound = "Oh the humanity!";
  958. }
  959. var preyMass = prey.sum_property("mass");
  960. macro.addGrowthPoints(preyMass);
  961. macro.arouse(10);
  962. updateVictims("breasts",prey);
  963. update([sound,line,linesummary,newline]);
  964. if (macro.lactationEnabled && macro.milkStorage.amount / macro.milkStorage.limit > 0.5) {
  965. var amount = Math.min(macro.lactationVolume, (macro.milkStorage.amount / macro.milkStorage.limit - 0.5) * macro.milkStorage.limit);
  966. milk_breasts(null, amount);
  967. }
  968. }
  969. function breast_vore()
  970. {
  971. // todo nipple areas?
  972. var area = macro.breastArea/2;
  973. var prey = getPrey(biome, area);
  974. var line = describe("breast-vore", prey, macro, verbose);
  975. var linesummary = summarize(prey.sum(), false);
  976. var people = get_living_prey(prey.sum());
  977. var sound = "";
  978. if (people < 3) {
  979. sound = "Shlp.";
  980. } else if (people < 10) {
  981. sound = "Slurp.";
  982. } else if (people < 50) {
  983. sound = "Shlrrrrp!";
  984. } else if (people < 500) {
  985. sound = "SHLRP!";
  986. } else if (people < 5000) {
  987. sound = "SHLLLLURP!!";
  988. } else {
  989. sound = "Oh the humanity!";
  990. }
  991. var preyMass = prey.sum_property("mass");
  992. macro.addGrowthPoints(preyMass);
  993. macro.breasts.feed(prey);
  994. macro.arouse(10);
  995. updateVictims("breastvored",prey);
  996. update([sound,line,linesummary,newline]);
  997. if (macro.lactationEnabled && macro.milkStorage.amount / macro.milkStorage.limit > 0.5) {
  998. var amount = Math.min(macro.lactationVolume, (macro.milkStorage.amount / macro.milkStorage.limit - 0.5) * macro.milkStorage.limit);
  999. milk_breasts(null, amount);
  1000. }
  1001. }
  1002. function milk_breasts(e,vol)
  1003. {
  1004. if (vol == undefined) {
  1005. var vol = Math.min(macro.lactationVolume, macro.milkStorage.amount);
  1006. }
  1007. macro.milkStorage.amount -= vol;
  1008. var area = Math.pow(vol, 2/3);
  1009. var prey = getPrey(biome, area);
  1010. var line = describe("breast-milk", prey, macro, verbose).replace("$VOLUME",volume(vol,unit,false))
  1011. var linesummary = summarize(prey.sum(), true);
  1012. var people = get_living_prey(prey.sum());
  1013. var sound = "Dribble.";
  1014. if (people < 3) {
  1015. sound = "Dribble.";
  1016. } else if (people < 10) {
  1017. sound = "Splash.";
  1018. } else if (people < 50) {
  1019. sound = "Splash!";
  1020. } else if (people < 500) {
  1021. sound = "SPLOOSH!";
  1022. } else if (people < 5000) {
  1023. sound = "SPLOOOOOOOOOOSH!!";
  1024. } else {
  1025. sound = "Oh the humanity!";
  1026. }
  1027. var preyMass = prey.sum_property("mass");
  1028. macro.addGrowthPoints(preyMass);
  1029. macro.arouse(20);
  1030. updateVictims("flooded",prey);
  1031. update([sound,line,linesummary,newline]);
  1032. }
  1033. function unbirth()
  1034. {
  1035. var area = macro.vaginaArea;
  1036. var prey = getPrey(biome, area);
  1037. var line = describe("unbirth", prey, macro, verbose)
  1038. var linesummary = summarize(prey.sum(), false);
  1039. var people = get_living_prey(prey.sum());
  1040. var sound = "";
  1041. if (people < 3) {
  1042. sound = "Shlp.";
  1043. } else if (people < 10) {
  1044. sound = "Squelch.";
  1045. } else if (people < 50) {
  1046. sound = "Shlurrp.";
  1047. } else if (people < 500) {
  1048. sound = "SHLRP!";
  1049. } else if (people < 5000) {
  1050. sound = "SQLCH!!";
  1051. } else {
  1052. sound = "Oh the humanity!";
  1053. }
  1054. var preyMass = prey.sum_property("mass");
  1055. macro.addGrowthPoints(preyMass);
  1056. macro.womb.feed(prey);
  1057. macro.arouse(20);
  1058. updateVictims("womb",prey);
  1059. update([sound,line,linesummary,newline]);
  1060. }
  1061. function cockslap()
  1062. {
  1063. var area = macro.dickArea;
  1064. var prey = getPrey(biome, area);
  1065. var line = describe("cockslap", prey, macro, verbose)
  1066. var linesummary = summarize(prey.sum(), true);
  1067. var people = get_living_prey(prey.sum());
  1068. var sound = "Thump";
  1069. if (people < 3) {
  1070. sound = "Thump!";
  1071. } else if (people < 10) {
  1072. sound = "Squish!";
  1073. } else if (people < 50) {
  1074. sound = "Crunch!";
  1075. } else if (people < 500) {
  1076. sound = "CRUNCH!";
  1077. } else if (people < 5000) {
  1078. sound = "CRRUUUNCH!!";
  1079. } else {
  1080. sound = "Oh the humanity!";
  1081. }
  1082. var preyMass = prey.sum_property("mass");
  1083. macro.addGrowthPoints(preyMass);
  1084. macro.arouse(15);
  1085. updateVictims("cock",prey);
  1086. update([sound,line,linesummary,newline]);
  1087. }
  1088. function cock_vore()
  1089. {
  1090. var area = macro.dickGirth;
  1091. var prey = getPrey(biome, area);
  1092. var line = describe("cock-vore", prey, macro, verbose)
  1093. var linesummary = summarize(prey.sum(), false);
  1094. var people = get_living_prey(prey.sum());
  1095. var sound = "lp";
  1096. if (people < 3) {
  1097. sound = "Shlp.";
  1098. } else if (people < 10) {
  1099. sound = "Squelch.";
  1100. } else if (people < 50) {
  1101. sound = "Shlurrp.";
  1102. } else if (people < 500) {
  1103. sound = "SHLRP!";
  1104. } else if (people < 5000) {
  1105. sound = "SQLCH!!";
  1106. } else {
  1107. sound = "Oh the humanity!";
  1108. }
  1109. var preyMass = prey.sum_property("mass");
  1110. macro.addGrowthPoints(preyMass);
  1111. macro.balls.feed(prey);
  1112. macro.arouse(20);
  1113. updateVictims("balls",prey);
  1114. update([sound,line,linesummary,newline]);
  1115. }
  1116. function ball_smother()
  1117. {
  1118. var area = macro.ballArea * 2;
  1119. var prey = getPrey(biome, area);
  1120. var line = describe("ball-smother", prey, macro, verbose)
  1121. var linesummary = summarize(prey.sum(), true);
  1122. var people = get_living_prey(prey.sum());
  1123. var sound = "Thump";
  1124. if (people < 3) {
  1125. sound = "Thump!";
  1126. } else if (people < 10) {
  1127. sound = "Squish!";
  1128. } else if (people < 50) {
  1129. sound = "Smoosh!";
  1130. } else if (people < 500) {
  1131. sound = "SMOOSH!";
  1132. } else if (people < 5000) {
  1133. sound = "SMOOOOOSH!!";
  1134. } else {
  1135. sound = "Oh the humanity!";
  1136. }
  1137. var preyMass = prey.sum_property("mass");
  1138. macro.addGrowthPoints(preyMass);
  1139. macro.arouse(10);
  1140. updateVictims("balls",prey);
  1141. update([sound,line,linesummary,newline]);
  1142. }
  1143. function male_spurt(vol)
  1144. {
  1145. var area = Math.pow(vol, 2/3);
  1146. var prey = getPrey(biome, area);
  1147. var line = describe("male-spurt", prey, macro, verbose).replace("$VOLUME",volume(vol,unit,false))
  1148. var linesummary = summarize(prey.sum(), true);
  1149. var people = get_living_prey(prey.sum());
  1150. var sound = "Spurt!";
  1151. if (people < 3) {
  1152. sound = "Spurt!";
  1153. } else if (people < 10) {
  1154. sound = "Sploosh!";
  1155. } else if (people < 50) {
  1156. sound = "Sploooooosh!";
  1157. } else if (people < 500) {
  1158. sound = "SPLOOSH!";
  1159. } else if (people < 5000) {
  1160. sound = "SPLOOOOOOOOOOSH!!";
  1161. } else {
  1162. sound = "Oh the humanity!";
  1163. }
  1164. var preyMass = prey.sum_property("mass");
  1165. macro.addGrowthPoints(preyMass);
  1166. updateVictims("splooged",prey);
  1167. update([sound,line,linesummary,newline]);
  1168. }
  1169. function male_orgasm(vol)
  1170. {
  1171. var area = Math.pow(vol, 2/3);
  1172. var prey = getPrey(biome, area);
  1173. var line = describe("male-orgasm", prey, macro, verbose).replace("$VOLUME",volume(vol,unit,false))
  1174. var linesummary = summarize(prey.sum(), true);
  1175. var people = get_living_prey(prey.sum());
  1176. var sound = "Spurt!";
  1177. if (people < 3) {
  1178. sound = "Spurt!";
  1179. } else if (people < 10) {
  1180. sound = "Sploosh!";
  1181. } else if (people < 50) {
  1182. sound = "Sploooooosh!";
  1183. } else if (people < 500) {
  1184. sound = "SPLOOSH!";
  1185. } else if (people < 5000) {
  1186. sound = "SPLOOOOOOOOOOSH!!";
  1187. } else {
  1188. sound = "Oh the humanity!";
  1189. }
  1190. var preyMass = prey.sum_property("mass");
  1191. macro.addGrowthPoints(preyMass);
  1192. updateVictims("splooged",prey);
  1193. update([sound,line,linesummary,newline]);
  1194. }
  1195. function female_spurt(vol)
  1196. {
  1197. var area = Math.pow(vol, 2/3);
  1198. var prey = getPrey(biome, area);
  1199. var line = describe("female-spurt", prey, macro, verbose).replace("$VOLUME",volume(vol,unit,false))
  1200. var linesummary = summarize(prey.sum(), true);
  1201. var people = get_living_prey(prey.sum());
  1202. var sound = "Spurt!";
  1203. if (people < 3) {
  1204. sound = "Spurt!";
  1205. } else if (people < 10) {
  1206. sound = "Sploosh!";
  1207. } else if (people < 50) {
  1208. sound = "Sploooooosh!";
  1209. } else if (people < 500) {
  1210. sound = "SPLOOSH!";
  1211. } else if (people < 5000) {
  1212. sound = "SPLOOOOOOOOOOSH!!";
  1213. } else {
  1214. sound = "Oh the humanity!";
  1215. }
  1216. var preyMass = prey.sum_property("mass");
  1217. macro.addGrowthPoints(preyMass);
  1218. updateVictims("splooged",prey);
  1219. update([sound,line,linesummary,newline]);
  1220. }
  1221. function female_orgasm(vol)
  1222. {
  1223. var area = Math.pow(vol, 2/3);
  1224. var prey = getPrey(biome, area);
  1225. var line = describe("female-orgasm", prey, macro, verbose).replace("$VOLUME",volume(vol,unit,false));
  1226. var linesummary = summarize(prey.sum(), true);
  1227. var people = get_living_prey(prey.sum());
  1228. var sound = "Spurt!";
  1229. if (people < 3) {
  1230. sound = "Spurt!";
  1231. } else if (people < 10) {
  1232. sound = "Sploosh!";
  1233. } else if (people < 50) {
  1234. sound = "Sploooooosh!";
  1235. } else if (people < 500) {
  1236. sound = "SPLOOSH!";
  1237. } else if (people < 5000) {
  1238. sound = "SPLOOOOOOOOOOSH!!";
  1239. } else {
  1240. sound = "Oh the humanity!";
  1241. }
  1242. var preyMass = prey.sum_property("mass");
  1243. macro.addGrowthPoints(preyMass);
  1244. updateVictims("splooged",prey);
  1245. update([sound,line,linesummary,newline]);
  1246. }
  1247. function tail_slap()
  1248. {
  1249. var area = macro.tailArea * macro.tailCount;
  1250. var prey = getPrey(biome, area);
  1251. var line = describe("tail-slap", prey, macro, verbose)
  1252. var linesummary = summarize(prey.sum(), true);
  1253. var people = get_living_prey(prey.sum());
  1254. var sound = "Thump";
  1255. if (people < 3) {
  1256. sound = "Thump!";
  1257. } else if (people < 10) {
  1258. sound = "Squish!";
  1259. } else if (people < 50) {
  1260. sound = "Crunch!";
  1261. } else if (people < 500) {
  1262. sound = "CRUNCH!";
  1263. } else if (people < 5000) {
  1264. sound = "CRRUUUNCH!!";
  1265. } else {
  1266. sound = "Oh the humanity!";
  1267. }
  1268. var preyMass = prey.sum_property("mass");
  1269. macro.addGrowthPoints(preyMass);
  1270. macro.arouse(5);
  1271. updateVictims("tailslapped",prey);
  1272. update([sound,line,linesummary,newline]);
  1273. }
  1274. function tail_vore()
  1275. {
  1276. var area = macro.tailGirth * macro.tailCount;
  1277. var prey = getPrey(biome, area);
  1278. var line = describe("tail-vore", prey, macro, verbose)
  1279. var linesummary = summarize(prey.sum(), false);
  1280. var people = get_living_prey(prey.sum());
  1281. var sound = "";
  1282. if (people == 0) {
  1283. sound = "";
  1284. } else if (people < 3) {
  1285. sound = "Ulp.";
  1286. } else if (people < 10) {
  1287. sound = "Gulp.";
  1288. } else if (people < 50) {
  1289. sound = "Glrrp.";
  1290. } else if (people < 500) {
  1291. sound = "Glrrrpkh!";
  1292. } else if (people < 5000) {
  1293. sound = "GLRRKPKH!";
  1294. } else {
  1295. sound = "Oh the humanity!";
  1296. }
  1297. var preyMass = prey.sum_property("mass");
  1298. macro.addGrowthPoints(preyMass);
  1299. macro.arouse(5);
  1300. macro.stomach.feed(prey);
  1301. updateVictims("tailmaw'd",prey);
  1302. update([sound,line,linesummary,newline]);
  1303. }
  1304. function pouch_stuff()
  1305. {
  1306. var area = macro.handArea;
  1307. var prey = getPrey(biome, area);
  1308. var line = describe("pouch-stuff", prey, macro, verbose);
  1309. var linesummary = summarize(prey.sum(), false);
  1310. var people = get_living_prey(prey.sum());
  1311. var sound = "Thump";
  1312. if (people < 3) {
  1313. sound = "Slp.";
  1314. } else if (people < 10) {
  1315. sound = "Squeeze.";
  1316. } else if (people < 50) {
  1317. sound = "Thump!";
  1318. } else if (people < 500) {
  1319. sound = "THOOOMP!";
  1320. } else if (people < 5000) {
  1321. sound = "THOOOOOOOMP!";
  1322. } else {
  1323. sound = "Oh the humanity!";
  1324. }
  1325. macro.arouse(5);
  1326. macro.pouch.add(prey);
  1327. updateVictims("pouched",prey);
  1328. update([sound,line,linesummary,newline]);
  1329. }
  1330. function pouch_eat()
  1331. {
  1332. var prey = macro.pouch.container;
  1333. var line = describe("pouch-eat", prey, macro, verbose)
  1334. var linesummary = summarize(prey.sum(), false);
  1335. var people = get_living_prey(prey.sum());
  1336. var sound = "";
  1337. if (people == 0) {
  1338. sound = "";
  1339. } else if (people < 3) {
  1340. sound = "Ulp.";
  1341. } else if (people < 10) {
  1342. sound = "Gulp.";
  1343. } else if (people < 50) {
  1344. sound = "Glrrp.";
  1345. } else if (people < 500) {
  1346. sound = "Glrrrpkh!";
  1347. } else if (people < 5000) {
  1348. sound = "GLRRKPKH!";
  1349. } else {
  1350. sound = "Oh the humanity!";
  1351. }
  1352. var preyMass = prey.sum_property("mass");
  1353. macro.addGrowthPoints(preyMass);
  1354. macro.stomach.feed(prey);
  1355. macro.arouse(5);
  1356. updateVictims("stomach",prey);
  1357. update([sound,line,linesummary,newline]);
  1358. }
  1359. function transformNumbers(line)
  1360. {
  1361. return line.toString().replace(/[0-9]+(\.[0-9]+)?(e\+[0-9]+)?/g, function(text) { return number(text, numbers); });
  1362. }
  1363. function update(lines = [])
  1364. {
  1365. var log = document.getElementById("log");
  1366. lines.forEach(function (x) {
  1367. var line = document.createElement('div');
  1368. line.innerHTML = transformNumbers(x);
  1369. log.appendChild(line);
  1370. });
  1371. if (lines.length > 0)
  1372. log.scrollTop = log.scrollHeight;
  1373. document.getElementById("height").innerHTML = "Height: " + transformNumbers(length(macro.height, unit));
  1374. document.getElementById("mass").innerHTML = "Mass: " + transformNumbers(mass(macro.mass, unit));
  1375. document.getElementById("growth-points").innerHTML = "Growth Points:" + macro.growthPoints;
  1376. document.getElementById("arousal").innerHTML = "Arousal: " + round(macro.arousal,0) + "%";
  1377. document.getElementById("edge").innerHTML = "Edge: " + round(macro.edge * 100,0) + "%";
  1378. document.getElementById("cum").innerHTML = "Cum: " + transformNumbers(volume(macro.cumStorage.amount,unit,false))
  1379. document.getElementById("cumPercent").innerHTML = Math.round(macro.cumStorage.amount / macro.cumStorage.limit * 100) + "%";
  1380. document.getElementById("femcum").innerHTML = "Femcum: " + transformNumbers(volume(macro.femcumStorage.amount,unit,false));
  1381. document.getElementById("femcumPercent").innerHTML = Math.round(macro.femcumStorage.amount / macro.femcumStorage.limit * 100) + "%";
  1382. document.getElementById("milk").innerHTML = "Milk: " + transformNumbers(volume(macro.milkStorage.amount,unit,false));
  1383. document.getElementById("milkPercent").innerHTML = Math.round(macro.milkStorage.amount / macro.milkStorage.limit * 100) + "%";
  1384. for (var type in victims) {
  1385. if (victims.hasOwnProperty(type)) {
  1386. for (var key in victims[type]){
  1387. if (victims[type].hasOwnProperty(key) && victims[type][key] > 0) {
  1388. document.getElementById("stat-" + key).style.display = "table-row";
  1389. document.getElementById("stat-" + type + "-" + key).innerHTML = number(victims[type][key],numbers);
  1390. }
  1391. }
  1392. }
  1393. }
  1394. }
  1395. function pick_move()
  1396. {
  1397. if (!strolling) {
  1398. setTimeout(pick_move, 1500 * Math.sqrt(macro.scale));
  1399. return;
  1400. }
  1401. var choice = Math.random();
  1402. if (choice < 0.2) {
  1403. sit();
  1404. } else if (choice < 0.6) {
  1405. stomp();
  1406. } else {
  1407. feed();
  1408. }
  1409. setTimeout(pick_move, 1500 * Math.sqrt(macro.scale));
  1410. }
  1411. function grow_pick(times) {
  1412. if (document.getElementById("part-body").checked == true) {
  1413. grow(times);
  1414. }
  1415. else if (document.getElementById("part-ass").checked == true) {
  1416. grow_ass(times);
  1417. }
  1418. else if (document.getElementById("part-dick").checked == true) {
  1419. grow_dick(times);
  1420. }
  1421. else if (document.getElementById("part-balls").checked == true) {
  1422. grow_balls(times);
  1423. }
  1424. else if (document.getElementById("part-breasts").checked == true) {
  1425. grow_breasts(times);
  1426. }
  1427. else if (document.getElementById("part-vagina").checked == true) {
  1428. grow_vagina(times);
  1429. }
  1430. }
  1431. function grow(times=1)
  1432. {
  1433. if (macro.growthPoints < 100 * times) {
  1434. update(["You don't feel like growing right now."]);
  1435. return;
  1436. }
  1437. macro.growthPoints -= 100 * times;
  1438. var oldHeight = macro.height;
  1439. var oldMass = macro.mass;
  1440. macro.scale *= Math.pow(1.02,times);
  1441. var newHeight = macro.height;
  1442. var newMass = macro.mass;
  1443. var heightDelta = newHeight - oldHeight;
  1444. var massDelta = newMass - oldMass;
  1445. var heightStr = length(heightDelta, unit);
  1446. var massStr = mass(massDelta, unit);
  1447. update(["Power surges through you as you grow " + heightStr + " taller and gain " + massStr + " of mass",newline]);
  1448. }
  1449. function grow_dick(times=1)
  1450. {
  1451. if (macro.growthPoints < 10 * times) {
  1452. update(["You don't feel like growing right now."]);
  1453. return;
  1454. }
  1455. macro.growthPoints -= 10 * times;
  1456. var oldLength = macro.dickLength;
  1457. var oldMass = macro.dickMass;
  1458. macro.dickScale = Math.pow(macro.dickScale * macro.dickScale + 1.02*times, 1/2) ;
  1459. var lengthDelta = macro.dickLength - oldLength;
  1460. var massDelta = macro.dickMass - oldMass;
  1461. update(["Power surges through you as your " + macro.dickType + " cock grows " + length(lengthDelta, unit, false) + " longer and gains " + mass(massDelta, unit, false) + " of mass",newline]);
  1462. }
  1463. function grow_balls(times=1)
  1464. {
  1465. if (macro.growthPoints < 10 * times) {
  1466. update(["You don't feel like growing right now."]);
  1467. return;
  1468. }
  1469. macro.growthPoints -= 10 * times;
  1470. var oldDiameter = macro.ballDiameter;
  1471. var oldMass = macro.ballMass;
  1472. macro.ballScale = Math.pow(macro.ballScale * macro.ballScale + 1.02*times, 1/2) ;
  1473. var diameterDelta = macro.ballDiameter - oldDiameter;
  1474. var massDelta = macro.ballMass - oldMass;
  1475. update(["Power surges through you as your balls swell by " + length(diameterDelta, unit, false) + ", gaining " + mass(massDelta, unit, false) + " of mass apiece",newline]);
  1476. }
  1477. function grow_breasts(times=1)
  1478. {
  1479. if (macro.growthPoints < 10 * times) {
  1480. update(["You don't feel like growing right now."]);
  1481. return;
  1482. }
  1483. macro.growthPoints -= 10 * times;
  1484. var oldDiameter = macro.breastDiameter;
  1485. var oldMass = macro.breastMass;
  1486. macro.breastScale = Math.pow(macro.breastScale * macro.breastScale + 1.02*times, 1/2) ;
  1487. var diameterDelta = macro.breastDiameter - oldDiameter;
  1488. var massDelta = macro.breastMass - oldMass;
  1489. update(["Power surges through you as your breasts swell by " + length(diameterDelta, unit, false) + ", gaining " + mass(massDelta, unit, false) + " of mass apiece",newline]);
  1490. }
  1491. function grow_vagina(times=1)
  1492. {
  1493. if (macro.growthPoints < 10 * times) {
  1494. update(["You don't feel like growing right now."]);
  1495. return;
  1496. }
  1497. macro.growthPoints -= 10 * times;
  1498. var oldLength = macro.vaginaLength;
  1499. macro.vaginaScale = Math.pow(macro.vaginaScale * macro.vaginaScale + 1.02*times, 1/2) ;
  1500. var lengthDelta = macro.vaginaLength - oldLength;
  1501. update(["Power surges through you as your moist slit expands by by " + length(lengthDelta, unit, false),newline]);
  1502. }
  1503. function grow_ass(times=1)
  1504. {
  1505. if (macro.growthPoints < 10 * times) {
  1506. update(["You don't feel like growing right now."]);
  1507. return;
  1508. }
  1509. macro.growthPoints -= 10 * times;
  1510. var oldDiameter = Math.pow(macro.assArea,1/2);
  1511. macro.assScale = Math.pow(macro.assScale * macro.assScale + 1.02*times, 1/2) ;
  1512. var diameterDelta = Math.pow(macro.assArea,1/2) - oldDiameter;
  1513. update(["Power surges through you as your ass swells by " + length(diameterDelta, unit, false),newline]);
  1514. }
  1515. function grow_lots()
  1516. {
  1517. var oldHeight = macro.height;
  1518. var oldMass = macro.mass;
  1519. macro.scale *= 100;
  1520. var newHeight = macro.height;
  1521. var newMass = macro.mass;
  1522. var heightDelta = newHeight - oldHeight;
  1523. var massDelta = newMass - oldMass;
  1524. var heightStr = length(heightDelta, unit);
  1525. var massStr = mass(massDelta, unit);
  1526. update(["Power surges through you as you grow " + heightStr + " taller and gain " + massStr + " of mass",newline]);
  1527. }
  1528. function preset(name) {
  1529. switch(name){
  1530. case "Fen":
  1531. macro.species = "crux";
  1532. macro.baseHeight = 2.2606;
  1533. macro.baseMass = 124.738;
  1534. break;
  1535. case "Renard":
  1536. macro.species = "fox";
  1537. macro.baseHeight = 1.549;
  1538. macro.baseMass = 83.9;
  1539. case "Vulpes":
  1540. macro.species = "fox";
  1541. macro.baseHeight = 20000;
  1542. macro.baseMass = 180591661866272;
  1543. }
  1544. }
  1545. function saveSettings() {
  1546. storage = window.localStorage;
  1547. settings = {};
  1548. form = document.forms.namedItem("custom-species-form");
  1549. for (var i=0; i<form.length; i++) {
  1550. if (form[i].value != "") {
  1551. if (form[i].type == "text")
  1552. settings[form[i].name] = form[i].value;
  1553. else if (form[i].type == "number")
  1554. settings[form[i].name] = parseFloat(form[i].value);
  1555. else if (form[i].type == "checkbox") {
  1556. settings[form[i].name] = form[i].checked;
  1557. } else if (form[i].type == "radio") {
  1558. let name = form[i].name.match(/(?:[a-zA-Z]+-)*[a-zA-Z]+/)[0];
  1559. if (form[i].checked)
  1560. settings[name] = form[i].id
  1561. }
  1562. }
  1563. }
  1564. storage.setItem('settings',JSON.stringify(settings));
  1565. }
  1566. function loadSettings() {
  1567. if (window.localStorage.getItem('settings') == null)
  1568. return;
  1569. storage = window.localStorage;
  1570. settings = JSON.parse(storage.getItem('settings'));
  1571. form = document.forms.namedItem("custom-species-form");
  1572. for (var i=0; i<form.length; i++) {
  1573. if (settings[form[i].name] != undefined) {
  1574. if (form[i].type == "text")
  1575. form[i].value = settings[form[i].name];
  1576. else if (form[i].type == "number")
  1577. form[i].value = settings[form[i].name];
  1578. else if (form[i].type == "checkbox") {
  1579. form[i].checked = settings[form[i].name];
  1580. } else if (form[i].type == "radio") {
  1581. let name = form[i].name.match(/(?:[a-zA-Z]+-)*[a-zA-Z]+/)[0];
  1582. form[i].checked = (settings[name] == form[i].id);
  1583. }
  1584. }
  1585. }
  1586. }
  1587. function startGame(e) {
  1588. form = document.forms.namedItem("custom-species-form");
  1589. for (var i=0; i<form.length; i++) {
  1590. if (form[i].value != "") {
  1591. if (form[i].type == "text")
  1592. macro[form[i].name] = form[i].value;
  1593. else if (form[i].type == "number")
  1594. macro[form[i].name] = parseFloat(form[i].value);
  1595. else if (form[i].type == "checkbox") {
  1596. if (form[i].name == "humanMode")
  1597. humanMode = form[i].checked;
  1598. else
  1599. macro[form[i].name] = form[i].checked;
  1600. } else if (form[i].type == "radio") {
  1601. if (form[i].checked) {
  1602. switch(form[i].id) {
  1603. case "brutality-0": macro.brutality = 0; break;
  1604. case "brutality-1": macro.brutality = 1; break;
  1605. case "brutality-2": macro.brutality = 2; break;
  1606. }
  1607. }
  1608. }
  1609. }
  1610. }
  1611. if (!macro.hasTail) {
  1612. macro.tailCount = 0;
  1613. }
  1614. document.getElementById("log-area").style.display = 'inline';
  1615. document.getElementById("option-panel").style.display = 'none';
  1616. document.getElementById("action-panel").style.display = 'flex';
  1617. victimTypes = ["stomped","digested","stomach","ground"];
  1618. if (macro.analVore) {
  1619. victimTypes = victimTypes.concat(["bowels"]);
  1620. }
  1621. if (macro.tailCount > 0) {
  1622. victimTypes = victimTypes.concat(["tailslapped"]);
  1623. if (macro.tailMaw) {
  1624. victimTypes = victimTypes.concat(["tailmaw'd"]);
  1625. } else {
  1626. document.getElementById("button-tail_vore").style.display = 'none';
  1627. }
  1628. } else {
  1629. document.getElementById("action-part-tails").style.display = 'none';
  1630. document.getElementById("button-tail_slap").style.display = 'none';
  1631. document.getElementById("button-tail_vore").style.display = 'none';
  1632. }
  1633. if (macro.maleParts) {
  1634. victimTypes = victimTypes.concat(["cock","balls"]);
  1635. } else {
  1636. document.getElementById("action-part-dick").style.display = 'none';
  1637. document.getElementById("button-cockslap").style.display = 'none';
  1638. document.getElementById("button-cock_vore").style.display = 'none';
  1639. document.getElementById("button-ball_smother").style.display = 'none';
  1640. document.getElementById("cum").style.display = 'none';
  1641. document.getElementById("cumPercent").style.display = 'none';
  1642. document.querySelector("#part-balls+label").style.display = 'none';
  1643. document.querySelector("#part-dick+label").style.display = 'none';
  1644. }
  1645. if (macro.femaleParts) {
  1646. victimTypes = victimTypes.concat(["womb"]);
  1647. } else {
  1648. document.getElementById("action-part-vagina").style.display = 'none';
  1649. document.getElementById("button-unbirth").style.display = 'none';
  1650. document.getElementById("femcum").style.display = 'none';
  1651. document.getElementById("femcumPercent").style.display = 'none';
  1652. document.querySelector("#part-vagina+label").style.display = 'none';
  1653. }
  1654. if (macro.hasBreasts) {
  1655. victimTypes = victimTypes.concat(["breasts"]);
  1656. if (macro.lactationEnabled) {
  1657. victimTypes = victimTypes.concat(["flooded"]);
  1658. } else {
  1659. document.getElementById("button-breast_milk").style.display = 'none';
  1660. document.getElementById("milk").style.display = 'none';
  1661. document.getElementById("milkPercent").style.display = 'none';
  1662. }
  1663. if (macro.breastVore) {
  1664. victimTypes = victimTypes.concat(["breastvored"]);
  1665. } else {
  1666. document.getElementById("button-breast_vore").style.display = 'none';
  1667. }
  1668. } else {
  1669. document.getElementById("action-part-breasts").style.display = 'none';
  1670. document.getElementById("button-breast_vore").style.display = 'none';
  1671. document.getElementById("button-breast_milk").style.display = 'none';
  1672. document.getElementById("milk").style.display = 'none';
  1673. document.getElementById("milkPercent").style.display = 'none';
  1674. document.getElementById("button-breast_crush").style.display = 'none';
  1675. document.querySelector("#part-breasts+label").style.display = 'none';
  1676. }
  1677. if (macro.maleParts || macro.femaleParts) {
  1678. victimTypes.push("splooged");
  1679. }
  1680. if (macro.hasPouch) {
  1681. victimTypes.push("pouched");
  1682. } else {
  1683. document.getElementById("action-part-misc").style.display = 'none';
  1684. document.getElementById("button-pouch_stuff").style.display = 'none';
  1685. document.getElementById("button-pouch_eat").style.display = 'none';
  1686. }
  1687. if (macro.brutality < 1) {
  1688. document.getElementById("button-chew").style.display = 'none';
  1689. }
  1690. var table = document.getElementById("victim-table");
  1691. var tr = document.createElement('tr');
  1692. var th = document.createElement('th');
  1693. th.innerHTML = "Method";
  1694. tr.appendChild(th);
  1695. for (var i = 0; i < victimTypes.length; i++) {
  1696. var th = document.createElement('th');
  1697. th.classList.add("victim-table-cell");
  1698. th.innerHTML = victimTypes[i].charAt(0).toUpperCase() + victimTypes[i].slice(1);
  1699. tr.appendChild(th);
  1700. }
  1701. table.appendChild(tr);
  1702. for (var key in things) {
  1703. if (things.hasOwnProperty(key) && key != "Container") {
  1704. var tr = document.createElement('tr');
  1705. tr.id = "stat-" + key;
  1706. tr.style.display = "none";
  1707. var th = document.createElement('th');
  1708. th.innerHTML = key;
  1709. tr.appendChild(th);
  1710. for (var i = 0; i < victimTypes.length; i++) {
  1711. var th = document.createElement('th');
  1712. th.innerHTML = 0;
  1713. th.id = "stat-" + victimTypes[i] + "-" + key;
  1714. tr.appendChild(th);
  1715. }
  1716. table.appendChild(tr);
  1717. }
  1718. }
  1719. document.getElementById("button-arousal").innerHTML = (macro.arousalEnabled ? "Arousal On" : "Arousal Off");
  1720. if (!macro.arousalEnabled) {
  1721. document.getElementById("arousal").style.display = "none";
  1722. document.getElementById("edge").style.display = "none";
  1723. }
  1724. //var species = document.getElementById("option-species").value;
  1725. //var re = /^[a-zA-Z\- ]+$/;
  1726. // tricksy tricksy players
  1727. //if (re.test(species)) {
  1728. // macro.species = species;
  1729. //}
  1730. macro.init();
  1731. update();
  1732. document.getElementById("actions-body").style.display = 'flex';
  1733. document.getElementById("stat-container").style.display = 'flex';
  1734. }
  1735. function actionTab(e) {
  1736. var name = e.target.id;
  1737. var target = "actions-" + name.replace(/action-part-/,"");
  1738. document.querySelectorAll(".action-part-button.active").forEach(function (element) {
  1739. element.classList.remove("active");
  1740. })
  1741. document.querySelectorAll(".action-tab").forEach(function (element) {
  1742. element.style.display = "none";
  1743. });
  1744. e.target.classList.add("active")
  1745. document.getElementById(target).style.display = "flex";
  1746. }
  1747. window.addEventListener('load', function(event) {
  1748. victims["stomped"] = initVictims();
  1749. victims["tailslapped"] = initVictims();
  1750. victims["tailmaw'd"] = initVictims();
  1751. victims["bowels"] = initVictims();
  1752. victims["digested"] = initVictims();
  1753. victims["stomach"] = initVictims();
  1754. victims["breasts"] = initVictims();
  1755. victims["breastvored"] = initVictims();
  1756. victims["flooded"] = initVictims();
  1757. victims["womb"] = initVictims();
  1758. victims["cock"] = initVictims();
  1759. victims["balls"] = initVictims();
  1760. victims["smothered"] = initVictims();
  1761. victims["splooged"] = initVictims();
  1762. victims["ground"] = initVictims();
  1763. victims["pouched"] = initVictims();
  1764. document.querySelectorAll(".action-part-button").forEach(function (element) {
  1765. element.addEventListener("click",actionTab);
  1766. });
  1767. document.getElementById("button-look").addEventListener("click",look);
  1768. document.getElementById("button-feed").addEventListener("click",feed);
  1769. document.getElementById("button-chew").addEventListener("click",chew);
  1770. document.getElementById("button-stomp").addEventListener("click",stomp);
  1771. document.getElementById("button-sit").addEventListener("click",sit);
  1772. document.getElementById("button-tail_slap").addEventListener("click",tail_slap);
  1773. document.getElementById("button-tail_vore").addEventListener("click",tail_vore);
  1774. document.getElementById("button-breast_crush").addEventListener("click",breast_crush);
  1775. document.getElementById("button-breast_vore").addEventListener("click",breast_vore);
  1776. document.getElementById("button-breast_milk").addEventListener("click",milk_breasts);
  1777. document.getElementById("button-unbirth").addEventListener("click",unbirth);
  1778. document.getElementById("button-cockslap").addEventListener("click",cockslap);
  1779. document.getElementById("button-cock_vore").addEventListener("click",cock_vore);
  1780. document.getElementById("button-ball_smother").addEventListener("click",ball_smother);
  1781. document.getElementById("button-grind").addEventListener("click",grind);
  1782. document.getElementById("button-pouch_stuff").addEventListener("click",pouch_stuff);
  1783. document.getElementById("button-pouch_eat").addEventListener("click",pouch_eat);
  1784. document.getElementById("button-stroll").addEventListener("click",toggle_auto);
  1785. document.getElementById("button-location").addEventListener("click",change_location);
  1786. document.getElementById("button-numbers").addEventListener("click",toggle_numbers);
  1787. document.getElementById("button-units").addEventListener("click",toggle_units);
  1788. document.getElementById("button-verbose").addEventListener("click",toggle_verbose);
  1789. document.getElementById("button-arousal").addEventListener("click",toggle_arousal);
  1790. document.getElementById("button-grow-lots").addEventListener("click",grow_lots);
  1791. document.getElementById("button-amount-1").addEventListener("click",function() { grow_pick(1); });
  1792. document.getElementById("button-amount-5").addEventListener("click",function() { grow_pick(5); });
  1793. document.getElementById("button-amount-10").addEventListener("click",function() { grow_pick(10); });
  1794. document.getElementById("button-amount-20").addEventListener("click",function() { grow_pick(20); });
  1795. document.getElementById("button-amount-50").addEventListener("click",function() { grow_pick(50); });
  1796. document.getElementById("button-amount-100").addEventListener("click",function() { grow_pick(100); });
  1797. document.getElementById("button-load-custom").addEventListener("click",loadSettings);
  1798. document.getElementById("button-save-custom").addEventListener("click",saveSettings);
  1799. document.getElementById("button-start").addEventListener("click",startGame);
  1800. setTimeout(pick_move, 2000);
  1801. });