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.
 
 
 

718 lines
31 KiB

  1. 'use strict';
  2. /*jshint browser: true*/
  3. var rules = {};
  4. var defaults= {};
  5. function getDefault(name) {
  6. let tokens = name.split("-");
  7. for (let i=0; i<tokens.length; i++) {
  8. tokens[i] = tokens[i].charAt(0).toUpperCase() + tokens[i].slice(1);
  9. }
  10. let funcName = "default" + tokens.join("");
  11. return window[funcName];
  12. }
  13. var actions = ["eat","chew","stomp","kick","anal-vore","ass-crush","tail-slap","tail-vore",
  14. "cleavage-stuff","cleavage-crush","cleavage-drop","cleavage-absorb","breast-crush",
  15. "breast-vore","breast-milk","unbirth","sheath-stuff","sheath-squeeze","sheath-crush",
  16. "sheath-absorb","cock-vore","cockslap","ball-smother","male-spurt","male-orgasm","female-spurt",
  17. "female-orgasm","grind","pouch-stuff","pouch-rub","pouch-eat","pouch-absorb","soul-vore","soul-absorb-paw",
  18. "paw-stench","ass-stench","belch","fart","stomach","womb","balls","bowels","bowels-to-stomach","breasts","soul-digest"];
  19. for (let i=0; i<actions.length; i++) {
  20. rules[actions[i]] = [];
  21. }
  22. function isNonFatal(macro) {
  23. return macro.brutality == 0;
  24. }
  25. function isFatal(macro) {
  26. return macro.brutality >= 1;
  27. }
  28. function isGory(macro) {
  29. return macro.brutality >= 2;
  30. }
  31. function hasNothing(container, thing, amount) {
  32. for (var key in container.contents) {
  33. if (container.contents.hasOwnProperty(key))
  34. return false;
  35. }
  36. return true;
  37. }
  38. function hasLessThan(container, thing, amount) {
  39. if (container.contents.hasOwnProperty(thing))
  40. if (container.contents[thing].count < amount && container.contents[thing].count > 0)
  41. return true;
  42. return false;
  43. }
  44. function hasExactly(container, thing, amount) {
  45. if (!container.contents.hasOwnProperty(thing) && amount == 0)
  46. return true;
  47. if (container.contents.hasOwnProperty(thing) && container.contents[thing].count == amount)
  48. return true;
  49. return false;
  50. }
  51. function hasOnly(container, things) {
  52. if (!hasNothingElse(container, things))
  53. return false;
  54. for (var i=0; i<things.length; i++) {
  55. if (!container.contents.hasOwnProperty(things[i]))
  56. return false;
  57. }
  58. return true;
  59. }
  60. function hasNothingElse(container, things) {
  61. for (var key in container.contents) {
  62. if (container.contents.hasOwnProperty(key))
  63. if (!things.includes(key))
  64. return false;
  65. }
  66. return true;
  67. }
  68. function nothingLarger(container, thing) {
  69. for (var key in container.contents)
  70. if (container.contents.hasOwnProperty(key))
  71. if (areas[key] > areas[thing])
  72. return false;
  73. return true;
  74. }
  75. function describe(action, container, macro, verbose=true) {
  76. var options = [];
  77. for (var i = 0; i < rules[action].length; i++) {
  78. if(rules[action][i].test(container,macro)) {
  79. options.push(rules[action][i].desc);
  80. }
  81. }
  82. if (options.length > 0 && Math.random() > (1 / (2 + rules[action].length))) {
  83. let choice = Math.floor(Math.random() * options.length);
  84. return options[choice](container, macro, verbose);
  85. }
  86. else {
  87. return getDefault(action)(container, macro, verbose);
  88. }
  89. }
  90. // DEFAULTS
  91. function defaultEat(container, macro, verbose) {
  92. if (container.count == 0)
  93. return "You reach down for a delicious treat and grab - oh, nothing.";
  94. else
  95. return "You scoop up " + container.describe(verbose) + " and swallow " + (container.count > 1 ? "them" : "it") + " whole.";
  96. }
  97. function defaultChew(container, macro, verbose) {
  98. if (container.count == 0)
  99. return "You reach down for a delicious treat and grab - oh, nothing.";
  100. else if (isNonFatal(macro))
  101. return defaultEat(container, macro, verbose);
  102. else {
  103. let pronoun = (container.count > 1 ? "them" : "it");
  104. return "You scoop up " + container.describe(verbose) + " and " + macro.biteDesc() + " " + pronoun + " with your " + macro.jawDesc(true) + ", then swallow them down.";
  105. }
  106. }
  107. function defaultStomp(container, macro, verbose) {
  108. if (container.count == 0)
  109. return "Your " + macro.footDesc() + " thumps the ground.";
  110. else if (isFatal(macro))
  111. return "You crush " + container.describe(verbose) + " underfoot.";
  112. else
  113. return "You step on " + container.describe(verbose) + ".";
  114. }
  115. function defaultKick(container, macro, verbose) {
  116. if (container.count == 0)
  117. return "You swing your mighty " + macro.footDesc() + "..and hit nothing.";
  118. else
  119. return "You punt " + container.describe(verbose) + ", destroying " + (container.count > 1 ? "them" : "it") + ".";
  120. }
  121. function defaultAnalVore(container, macro, verbose) {
  122. if (container.count == 0)
  123. return "You're pretty sure you just sat on a rock.";
  124. else
  125. return "You sit yourself down on " + container.describe(verbose) + ". " + (container.count > 1 ? "They slide" : "It slides") + " inside with ease.";
  126. }
  127. function defaultAssCrush(container, macro, verbose) {
  128. if (container.count == 0)
  129. return "You take a seat. It's good to have a break!";
  130. else if (isFatal(macro))
  131. return "Your heavy ass obliterates " + container.describe(verbose) + ". ";
  132. else
  133. return "You sit on " + container.describe(verbose);
  134. }
  135. function defaultTailSlap(container, macro, verbose) {
  136. if (container.count == 0)
  137. return "Your " + (macro.tailCount > 1 ? "tails swing" : "tail swings") + " to and fro";
  138. else if (isFatal(macro))
  139. return "Your " + macro.describeTail + (macro.tailCount > 1 ? " tails swing" : " tail swings") + " into " + container.describe(verbose) + ", smashing everything in " +
  140. (macro.tailCount > 1 ? "their" : "its") + " path.";
  141. else
  142. return "Your " + macro.describeTail + (macro.tailCount > 1 ? " tails slap" : " tail slaps") + " against " + container.describe(verbose) + ", bowling them over.";
  143. }
  144. function defaultTailVore(container, macro, verbose) {
  145. if (container.count == 0)
  146. return "Your drooling tail swings to and fro";
  147. else if (isFatal(macro))
  148. return "Your tail lunges, maw agape, at " + container.describe(verbose) +
  149. ". It scarfs down everything in seconds, gulping forcefully to drag your prey into your sloppy guts.";
  150. else
  151. return "Your tail lunges, maw agape, at " + container.describe(verbose) +
  152. ". It scarfs down everything in a second, gulping forcefully and pulling everything into your belly.";
  153. }
  154. function defaultCleavageStuff(container, macro, verbose) {
  155. if (container.count == 0)
  156. return "You can't fit anything into your cleavage right now.";
  157. else
  158. return "You snatch up " + container.describe(verbose) + " and stuff " + (container.count > 1 ? "them" : "it") + " into your cleavage.";
  159. }
  160. function defaultCleavageCrush(container, macro, verbose) {
  161. if (container.count == 0)
  162. return "You grasp your breasts and forcefully squeeze them together.";
  163. else if (isGory(macro))
  164. return "You grasp your breasts and forcefully shove them together, crushing the life from " + container.describe(false) + ".";
  165. else if (isFatal(macro))
  166. return "You grasp your breasts and forcefully shove them together, crushing " + container.describe(false) + ".";
  167. else
  168. return "You grasp your breasts and squish them together, smooshing " + container.describe(false) + ".";
  169. }
  170. function defaultCleavageDrop(container, macro, verbose) {
  171. if (container.count == 0)
  172. return "You pull your breasts apart and give them a shake.";
  173. if (isFatal(macro))
  174. return "You pull your breasts apart far enough for the " + container.describe(false) + " trapped within to fall out, tumbling to the ground and smashing to bits.";
  175. else
  176. return "You pull your breasts apart far enough for the " + container.describe(false) + " trapped within to fall out.";
  177. }
  178. function defaultCleavageAbsorb(container, macro, verbose) {
  179. if (container.count == 0)
  180. return defaultCleavageCrush(container, macro, verbose);
  181. else
  182. return "Your squeeze your breasts together, swiftly absorbing " + container.describe(false) + " into your chest.";
  183. }
  184. function defaultBreastCrush(container, macro, verbose) {
  185. if (container.count == 0)
  186. return "Your thump your breasts against the ground.";
  187. else if (isFatal(macro))
  188. return "Your heavy breasts obliterate " + container.describe(verbose) + ". ";
  189. else
  190. return "You smoosh " + container.describe(verbose) + " with your breasts.";
  191. }
  192. function defaultBreastVore(container, macro, verbose) {
  193. if (container.count == 0)
  194. return "It'd be pretty hot to stick someone in your breasts. Shame you can't right now.";
  195. else
  196. return "Your nipples envelop " + container.describe(verbose) + ", pulling them into your breasts. ";
  197. }
  198. function defaultBreastMilk(container, macro, verbose) {
  199. if (container.count == 0)
  200. return "You squeeze your breasts, coaxing out $VOLUME of warm, creamy milk that splatters on the ground.";
  201. else if (isFatal(macro))
  202. return "You squeeze your breasts, coaxing out $VOLUME of warm, creamy milk that floods " + container.describe(verbose) + " in an unstoppable wave of white.";
  203. else
  204. return "You squeeze your breasts, coaxing out $VOLUME of warm, creamy milk that floods " + container.describe(verbose) + ".";
  205. }
  206. function defaultUnbirth(container, macro, verbose) {
  207. if (container.count == 0)
  208. return "You grab " + new Person(1).describe(verbose) + " and grind them against your slit...but they won't fit.";
  209. else
  210. return "You gasp as you slide " + container.describe(verbose) + " up your slit. ";
  211. }
  212. function defaultSheathStuff(container, macro, verbose) {
  213. if (container.count == 0)
  214. return "You grab a " + new Person(1).describe(verbose) + " and grind them against your sheath-slit...but they won't fit.";
  215. else
  216. return "You pluck " + container.describe(verbose) + " from the ground and slip them into your musky sheath.";
  217. }
  218. function defaultSheathSqueeze(container, macro, verbose) {
  219. if (container.count > 0) {
  220. if (macro.orgasm) {
  221. return "You stroke your spurting cock, then reach down to give your sheath a firm <i>squeeze</i>. Anything within has been ground away to nothingness by the force of your orgasm.";
  222. } else if (macro.arousal < 25) {
  223. return "You grip your soft sheath and give it a squeeze, feeling " + container.describe(false) + " within rub against your " + macro.describeDick + " cock.";
  224. } else if (macro.arousal < 75) {
  225. return "You grip your swelling sheath and squeeze, feeling " + container.describe(false) + " within grind against your " + macro.describeDick + " cock.";
  226. } else if (macro.arousal < 150) {
  227. return "You run your fingers down your " + macro.describeDick + " shaft and grip your sheath, squeezing it to feel " + container.describe(false) + " being smothered against the musky walls by your throbbing cock.";
  228. } else {
  229. return "Trembling with your impending orgasm, your fingers play over your sheath, feeling " + container.describe(false) + " within rub against your " + macro.describeDick + " cock.";
  230. }
  231. } else {
  232. if (macro.orgasm) {
  233. return "You stroke your spurting cock, then reach down to give your sheath a firm <i>squeeze</i>. Anything within has been ground away to nothingness by the force of your orgasm.";
  234. } else if (macro.arousal < 25) {
  235. return "You grip your soft sheath and give it a squeeze.";
  236. } else if (macro.arousal < 75) {
  237. return "You grip your swelling sheath and squeeze.";
  238. } else if (macro.arousal < 150) {
  239. return "You run your fingers down your " + macro.describeDick + " shaft and grip your sheath, squeezing it gently.";
  240. } else {
  241. return "Trembling with your impending orgasm, your fingers play over your sheath.";
  242. }
  243. }
  244. }
  245. function defaultSheathCrush(container, macro, verbose) {
  246. if (container.count == 0)
  247. return "Your orgasm causes your " + macro.describeDick + " cock to swell and surge.";
  248. else if (isGory(macro))
  249. return "Your powerful orgasm causes your throbbing " + macro.describeDick + " cock to swell and crush the life from everything in your sheath, reducing " + container.describe(false) + " to a gory paste that slickens your spurting shaft.";
  250. else if (isFatal(macro))
  251. return "Your orgasm causes your " + macro.describeDick + " shaft to throb and swell, smashing " + container.describe(false) + " trapped in your musky sheath.";
  252. else
  253. return "Your orgasm causes your " + macro.describeDick + " cock to swell, squeezing " + container.describe(false) + " out from your sheath.";
  254. }
  255. function defaultSheathAbsorb(container, macro, verbose) {
  256. if (container.count > 0)
  257. return "You grip your sheath and give it a firm <i>squeeze</i>, abruptly absorbing " + container.describe(false) + " into your musky body.";
  258. else
  259. return defaultSheathSqueeze(container, macro, verbose);
  260. }
  261. function defaultCockVore(container, macro, verbose) {
  262. if (container.count == 0)
  263. return "You grab " + new Person(1).describe(verbose) + " and grind them against your cock...but they won't fit.";
  264. else
  265. return "You stuff " + container.describe(verbose) + " into your throbbing shaft, forcing them down to your heavy balls.";
  266. }
  267. function defaultCockslap(container, macro, verbose) {
  268. if (container.count == 0)
  269. return "Your " + macro.describeDick + " swings through the air. Lewd!";
  270. else if (isFatal(macro))
  271. return "Your swaying " + macro.describeDick + " cock crushes " + container.describe(verbose) + ". ";
  272. else
  273. return "You smack " + container.describe(verbose) + " with your " + macro.describeDick + " shaft.";
  274. }
  275. function defaultBallSmother(container, macro, verbose) {
  276. if (container.count == 0)
  277. return "You rest your heavy balls on the ground.";
  278. else if (isFatal(macro))
  279. return "Your weighty balls spread over " + container.describe(verbose) + ", drowning them in musk.";
  280. else
  281. return "Your weighty balls spread over " + container.describe(verbose) + ".";
  282. }
  283. function defaultMaleSpurt(container, macro, verbose) {
  284. if (container.count == 0)
  285. return "Your " + macro.describeDick + " cock spews $VOLUME of bitter precum.";
  286. else if (isFatal(macro))
  287. return "Your " + macro.describeDick + " cock spurts out bitter precum, drowning " + container.describe(verbose) + " in $VOLUME of slick musky fluid.";
  288. else
  289. return "Your " + macro.describeDick + " shaft spurts precum, splooging " + container.describe(verbose) + " in $VOLUME of slick musky fluid.";
  290. }
  291. function defaultMaleOrgasm(container, macro, verbose) {
  292. if (container.count == 0)
  293. return "Your " + macro.describeDick + " cock spurts $TIMES times, gushing $VOLUME of seed.";
  294. else if (isFatal(macro))
  295. return "You're cumming! Your " + macro.describeDick + " cock erupts with $TIMES ropes of seed, obliterating " + container.describe(verbose) + " in a $VOLUME-torrent of cum.";
  296. else
  297. return "You're cumming! Your " + macro.describeDick + " shaft erupts with $TIMES ropes of seed, splooging " + container.describe(verbose) + " in a $VOLUME-torrent of cum.";
  298. }
  299. function defaultFemaleSpurt(container, macro, verbose) {
  300. if (container.count == 0)
  301. return "Your moist slit splatters $VOLUME of slick juices.";
  302. else if (isFatal(macro))
  303. return "Your moist slit splatters $VOLUME of slick juices, drowning " + container.describe(verbose) + " in your building lust.";
  304. else
  305. return "Your moist slit splatters $VOLUME of slick juices, splooging " + container.describe(verbose) + ".";
  306. }
  307. function defaultFemaleOrgasm(container, macro, verbose) {
  308. if (container.count == 0)
  309. return "Your moist slit sprays $TIMES times, gushing out $VOLUME of slick femcum.";
  310. else if (isFatal(macro))
  311. return "Your moist slit sprays $VOLUME of slick femcum, obliterating " + container.describe(verbose) + " in $TIMES consecutive bursts of lust.";
  312. else
  313. return "Your moist slit sprays $VOLUME of slick femcum, splooging " + container.describe(verbose) + " with $TIMES orgasmic spurts.";
  314. }
  315. function defaultGrind(container, macro, verbose) {
  316. var mid = isFatal(macro) ? ", smashing them apart" : ", using them as a toy";
  317. var end = macro.arousalEnabled ? " to fuel your lust." : ".";
  318. var desc = container.count > 0 ? container.describe(verbose) + mid + end : "the ground.";
  319. if (macro.maleParts && macro.femaleParts) {
  320. return "You grind your " + macro.describeDick + " cock and " + macro.describeVagina + " slit against " + desc;
  321. } else if (macro.maleParts && !macro.femaleParts) {
  322. return "You grind your " + macro.describeDick + " shaft against " + desc;
  323. } else if (!macro.maleParts && macro.femaleParts) {
  324. return "You grind your " + macro.describeVagina + " slit against " + desc;
  325. } else {
  326. return "You grind your hips against " + desc;
  327. }
  328. }
  329. function defaultPouchStuff(container, macro, verbose) {
  330. if (container.count == 0)
  331. return "You grab " + new Person(1).describe(verbose) + " and stuff them against your pouch...but they won't fit!";
  332. else
  333. return "You grab " + container.describe(verbose) + " and stuff " + (container.count > 1 ? "them" : "it") + " into your pouch.";
  334. }
  335. function defaultPouchRub(container, macro, verbose) {
  336. if (container.count == 0)
  337. return "You rub your empty pouch.";
  338. else
  339. return "You rub your bulging pouch, feeling at " + container.describe(false) + " trapped within.";
  340. }
  341. function defaultPouchEat(container, macro, verbose) {
  342. if (container.count == 0)
  343. return "There's nothing in your pouch!";
  344. else
  345. return "You snatch " + container.describe(verbose) + " from your pouch and shove " + (container.count > 1 ? "them" : "it") + " down your gullet!";
  346. }
  347. function defaultPouchAbsorb(container, macro, verbose) {
  348. if (container.count == 0)
  349. return "There's nothing in your pouch!";
  350. else
  351. return "Your pouch flattens as it absorbs " + container.describe(false);
  352. }
  353. function defaultSoulVore(container, macro, verbose) {
  354. if (container.count == 0)
  355. return "No souls here.";
  356. else
  357. return "You open your " + macro.jawDesc(true) + " and inhale, ripping the souls from " + container.describe(verbose) + " and dragging them down deep inside.";
  358. }
  359. function defaultSoulAbsorbPaw(container, macro, verbose) {
  360. let sum = container.sum()["Person"];
  361. if (container.count == 0)
  362. return "Your " + macro.footDesc() + " thumps against the ground";
  363. else if (sum == 0)
  364. return "Your " + macro.footDesc() + " slams down on " + container.describe(verbose) + "...but there aren't any souls within!";
  365. else
  366. return "Your " + macro.footDesc() + " slams down on " + container.describe(verbose) + ", smashing them to pieces and absorbing " + sum + (sum == 1 ? " soul" : " souls") + " into your pads.";
  367. }
  368. function defaultPawStench(container, macro, verbose) {
  369. let sum = container.sum()["Person"];
  370. if (isFatal(macro))
  371. return "Vile fumes waft from your " + macro.footDesc(true) + " , choking the life from " + (sum > 1 ? sum + " people." : "a person.");
  372. else
  373. return "Your stinky " + macro.footDesc(true) + " overwhelm" + (sum > 1 ? sum + " people" : "a person") + " with your scent!";
  374. }
  375. function defaultAssStench(container, macro, verbose) {
  376. let sum = container.sum()["Person"];
  377. if (isFatal(macro))
  378. return "Vile miasma from your bitter ass snuffs out " + (sum > 1 ? sum + " people" : "a person") + ", suffocating them in your stench.";
  379. else
  380. return "Your stinky ass sicens " + (sum > 1 ? sum + " people" : "a person") + " with your scent!";
  381. }
  382. function defaultBelch(container, macro, verbose) {
  383. let sum = container.sum()["Person"];
  384. if (container.count == 0)
  385. return "An ominous groan precedes a crass belch.";
  386. if (isFatal(macro))
  387. return "A rancid belch flows from your " + macro.jawDesc(verbose) + ", corroding " + container.describe(verbose) + " with your vile fumes.";
  388. else
  389. return "You let out a loud burp, blowing over " + container.describe(verbose) + "!";
  390. }
  391. function defaultFart(container, macro, verbose) {
  392. let sum = container.sum()["Person"];
  393. if (container.count == 0)
  394. return "An ominous groan precedes a loud, pungent fart.";
  395. if (isFatal(macro))
  396. return "An ominous groan precedes a loud, pungent fart, corroding " + container.describe(verbose) + " with truly vile vapors.";
  397. else
  398. return "You let out a crass fart, blowing over " + container.describe(verbose) + "!";
  399. }
  400. function defaultStomach(container, macro, verbose) {
  401. if (isGory(macro))
  402. return "Your caustic stomach grinds " + container.describe(false) + " to a gory pulp.";
  403. else if (isFatal(macro))
  404. return "Your stomach gurgles as it digests " + container.describe(false) + ".";
  405. else
  406. return "Your stomach groans and abosrbs " + container.describe(false) + ".";
  407. }
  408. function defaultBowels(container, macro, verbose) {
  409. if (isFatal(macro))
  410. return "Your bowels churn as they melt down " + container.describe(false) + " and absorb them into your body";
  411. else
  412. return "Your bowels churn as they absorb " + container.describe(false);
  413. }
  414. function defaultBowelsToStomach(container, macro, verbose) {
  415. if (isFatal(macro))
  416. return "Your bowels clench, forcing " + container.describe(false) + " into your roiling, caustic stomach.";
  417. else
  418. return "Your bowels clench, squeezing " + container.describe(false) + " into your belly.";
  419. }
  420. function defaultWomb(container, macro, verbose) {
  421. if (isFatal(macro))
  422. return "Your womb squeezes and dissolves " + container.describe(false) + ", turning them into slick femcum.";
  423. else
  424. return "Your womb squeezes as it absorbs " + container.describe(false);
  425. }
  426. function defaultBalls(container, macro, verbose) {
  427. if (isFatal(macro))
  428. return "Your balls slosh as they digest " + container.describe(false) + " into cum";
  429. else
  430. return "Your balls slosh as they absorb " + container.describe(false);
  431. }
  432. function defaultBreasts(container, macro, verbose) {
  433. if (isFatal(macro))
  434. return "Your breasts grrgle as they digest " + container.describe(false) + " into milk";
  435. else
  436. return "Your breasts slosh as they absorb " + container.describe(false);
  437. }
  438. function defaultSoulDigest(container, macro, verbose) {
  439. let sum = container.sum()["Person"];
  440. if (isGory(macro))
  441. return "Your depths churn as they annihilate " + (sum == 1 ? "a soul" : sum + " souls") + " forever.";
  442. else if (isFatal(macro))
  443. return "Your depths churn as they claim " + (sum == 1 ? "a soul" : sum + " souls");
  444. else
  445. return "Your depths absorb " + (sum == 1 ? "a soul" : sum + " souls");
  446. }
  447. // EATING
  448. rules["eat"].push({
  449. "test": function(container, macro) {
  450. return hasNothing(container);
  451. },
  452. "desc": function(container, macro, verbose) {
  453. return "You scoop up...nothing. Oh well.";
  454. }
  455. });
  456. rules["eat"].push({
  457. "test": function(container, macro) {
  458. return hasOnly(container, ["Person"]) &&
  459. hasLessThan(container, "Person", 6) &&
  460. macro.height >= 10;
  461. },
  462. "desc": function(container, macro, verbose) {
  463. return "You pluck up the " + container.describe() + " and stuff them into your mouth, swallowing lightly to drag them down to your bubbling guts.";
  464. }
  465. });
  466. rules["eat"].push({
  467. "test": function(container, macro) {
  468. return hasOnly(container, ["Person"]) &&
  469. hasExactly(container, "Person", 1) &&
  470. macro.height < 10;
  471. },
  472. "desc": function(container, macro, verbose) {
  473. return "You grasp " + container.describe() + " and greedily wolf them down, swallowing forcefully to cram them into your bulging stomach. A crass belch escapes your lips as they curl up in your slimy gut.";
  474. }
  475. });
  476. rules["eat"].push({
  477. "test": function(container, macro) {
  478. return hasOnly(container, ["Person","Car"]) &&
  479. hasExactly(container, "Car", 1) &&
  480. hasLessThan(container, "Person", 5);
  481. },
  482. "desc": function(container, macro, verbose) {
  483. return "You crush " + container.contents["Car"].describe() + " with your tight throat, washing it down with " + container.contents["Person"].describe();
  484. }
  485. });
  486. rules["eat"].push({
  487. "test": function(container, macro) {
  488. return hasExactly(container, "Small Skyscraper", 1) &&
  489. nothingLarger(container, "Small Skyscraper") &&
  490. macro.height < 500;
  491. },
  492. "desc": function(container, macro, verbose) {
  493. return "You drop onto your hands and knees, " + macro.jawDesc(true) + " opening wide to envelop the skyscraper. It glides into your throat as your snout touches the ground,\
  494. and you suckle on it for a long moment before twisting your head to snap it loose. The entire building and the " + describe_all(container.contents["Small Skyscraper"].contents, verbose) + "\
  495. within plunge into your roiling guts, along with some delicious treats you slurped up along with it - " + describe_all(container.contents, verbose, ["Small Skyscraper"]) + ".";
  496. }
  497. });
  498. rules["eat"].push({
  499. "test": function(container, macro) {
  500. return hasExactly(container, "Small Skyscraper", 2) &&
  501. nothingLarger(container, "Small Skyscraper") &&
  502. macro.height < 750;
  503. },
  504. "desc": function(container, macro, verbose) {
  505. return "You drop onto your hands and knees, " + macro.jawDesc(true) + " opening wide to envelop the skyscraper. It glides into your throat as your snout touches the ground,\
  506. and you suckle on it for a long moment before twisting your head to snap it loose. Without missing a beat, you rise back up, sloppy tongue slathering over the side \
  507. of the remaining tower, sucking on its tip and roughly shoving it into your maw. It breaks from its foundation, vanishing past your lips as you use two fingers to shove it \
  508. down your sultry throat. Your gut bubbles as " + describe_all(container.contents["Small Skyscraper"].contents, verbose) + " are crunched and crushed within, along with the \
  509. " + describe_all(container.contents, verbose, ["Small Skyscraper"]) + " that were unfortunate enough to be caught up by your slimy tongue.";
  510. }
  511. });
  512. // CHEWING
  513. rules["chew"].push({
  514. "test": function(container, macro) {
  515. return hasOnly(container, ["Person"]) &&
  516. hasExactly(container, "Person", 1) &&
  517. isGory(macro) &&
  518. macro.height < 5;
  519. }, "desc": function(container, macro, verbose) {
  520. return "You tackle a " + container.describe(verbose) + " and dig into your meal, powerful " + macro.jawDesc(true) + " ripping them to shreds in seconds. You wolf down great mouthfuls \
  521. of meat, consuming them in a terrifying frenzy that ends with naught but bones lying on the ground.";
  522. }
  523. });
  524. rules["chew"].push({
  525. "test": function(container, macro) {
  526. return hasOnly(container, ["Person"]) &&
  527. hasExactly(container, "Person", 1) &&
  528. isGory(macro) &&
  529. macro.height >= 5;
  530. }, "desc": function(container, macro, verbose) {
  531. return "You snatch up a " + container.describe(verbose) + ", then stuff their lower body into the guillotine that is your ravenous maw - slicing off their legs with \
  532. a single disgusting <i>crunch</i>, then finishing them off with another ravenous bite that obliterates their torso. Their bleeding head falls from your lips, only to be \
  533. caught between two fingers and popped back in to be crunched between molars and swallowed.";
  534. }
  535. });
  536. rules["chew"].push({
  537. "test": function(container, macro) {
  538. return hasOnly(container, ["Person"]) &&
  539. hasExactly(container, "Person", 2) &&
  540. isGory(macro);
  541. }, "desc": function(container, macro, verbose) {
  542. var prey1 = new Person(1).describe(verbose);
  543. var prey2 = new Person(1).describe(verbose);
  544. return "Powerful " + macro.jawDesc(true) + " obliterate " + prey1 +"'s body. You toss your head back and swallow their gory remains, your free hand slowly crushing " + prey2 + " like a nut \
  545. in a vice. A heartbeat later, their face is jammed into your bloody throat. A squeeze of your " + macro.jawDesc(true) + " snaps their spine with ease, and their limp body plunges down into \
  546. your churning depths to be destroyed.";
  547. }
  548. });
  549. // STOMPING
  550. rules["stomp"].push({
  551. "test": function(container, macro) {
  552. return hasOnly(container, ["Person"]) &&
  553. hasExactly(container, "Person", 1) &&
  554. isFatal(macro);
  555. }, "desc": function(container, macro, verbose) {
  556. return "Your heavy " + macro.footDesc() + " slams down on " + container.describe(verbose) + ", smashing the poor thing like an insect.";
  557. }
  558. });
  559. rules["stomp"].push({
  560. "test": function(container, macro) {
  561. return hasOnly(container, ["Person"]) &&
  562. hasExactly(container, "Person", 1) &&
  563. isGory(macro);
  564. }, "desc": function(container, macro, verbose) {
  565. return "Your " + macro.footDesc() + " thumps " + container.describe(verbose) + ", shoving your victim to the ground and cracking them open like an egg.";
  566. }
  567. });
  568. rules["stomp"].push({
  569. "test": function(container, macro) {
  570. return hasOnly(container, ["Person"]) &&
  571. hasExactly(container, "Person", 1) &&
  572. isGory(macro);
  573. }, "desc": function(container, macro, verbose) {
  574. return "Your shadow falls over " + container.describe(verbose) + ", and your " + macro.footDesc() + " follows, crushing their soft body and reducing them to a heap of broken gore.";
  575. }
  576. });
  577. rules["stomp"].push({
  578. "test": function(container, macro) {
  579. return hasNothingElse(container, ["Person","Cow","Car"]) &&
  580. isNonFatal(macro) &&
  581. macro.footType == "paw";
  582. }, "desc": function(container, macro, verbose) {
  583. return "Your paw smooshes over " + container.describe(verbose) + ". They stick to your toes, carried along for the ride as you take another few steps before finally\
  584. falling off.";
  585. }
  586. });
  587. // ANAL VORE
  588. rules["anal-vore"].push({
  589. "test": function(container, macro) {
  590. return hasExactly(container, "Person", 1) &&
  591. hasOnly(container, ["Person"]);
  592. }, "desc": function(container, macro, verbose) {
  593. let adjective = ["musky","winding","churning"][Math.floor(Math.random()*3)];
  594. return "Your weighty rump slams against the ground. A shock of pleasure runs up your spine as a " + container.describe(verbose) + " slides up your ass," +
  595. (macro.maleParts ? " grinding against your prostate" : "") + ". A powerful clench drags them deeper into your bowels, sealing them away in your " + adjective + " depths.";
  596. }
  597. });
  598. rules["anal-vore"].push({
  599. "test": function(container, macro) {
  600. return hasExactly(container, "Car", 1) &&
  601. hasOnly(container, ["Car"]);
  602. }, "desc": function(container, macro, verbose) {
  603. return "You ram " + container.describe(verbose) + " up your ass, biting your lip as it" + (macro.maleParts ? " rubs along your prostate" : " slides into velvety depths") + ".\
  604. You moan and clench hard, yanking it in with a wet <i>shlrrp</i> and abruplty silencing its blaring horn.";
  605. }
  606. });
  607. rules["anal-vore"].push({
  608. "test": function(container, macro) {
  609. return hasExactly(container, "Bus", 1) &&
  610. hasOnly(container, ["Bus"]);
  611. }, "desc": function(container, macro, verbose) {
  612. return "A speeding bus slams on its brakes as you abruptly sit - but it's too late to stop. A gasp flies from your lips as it penetrates your greedy ass, sinking halfway in and coming to a halt. \
  613. You grunt and squeeze, causing its frame to creak and groan. Two fingers to the back are enough to get it moving again, and it slowly works inside. You shiver and moan, taking it in all the way. \
  614. Your ass claims " + container.describe(verbose) + ".";
  615. }
  616. });
  617. rules["anal-vore"].push({
  618. "test": function(container, macro) {
  619. return hasExactly(container, "Train", 1) &&
  620. hasOnly(container, ["Train"]);
  621. }, "desc": function(container, macro, verbose) {
  622. var cars = container.contents["Train"].contents["Train Car"].count;
  623. return "Your massive fingers wrap around a train, yanking it from the rails with a tremendous screech of metal-on-metal. You squat down low, eyes rolling back in anticipation as you thrust the locomotive towards your massive ass - and then it hits home. A moan of pleasure shakes the earth, your ravenous pucker spread around the engine and sucking it in with a <i>squelch</i>. Powerful muscles squeeze and grab...and " + container.describe(verbose) + " swiftly vanishes into your bowels, every one of the " + cars + " cars a fresh shock of pleasure as they glide into your musky depths.";
  624. }
  625. });