big steppy
25개 이상의 토픽을 선택하실 수 없습니다. Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

1332 lines
63 KiB

  1. 'use strict';
  2. /*jshint browser: true*/
  3. var rules = {};
  4. var defaults = {};
  5. function plural(quantity, singular, plural) {
  6. return quantity > 1 ? plural : singular;
  7. }
  8. function getDefault(name) {
  9. let tokens = name.split("-");
  10. for (let i=0; i<tokens.length; i++) {
  11. tokens[i] = tokens[i].charAt(0).toUpperCase() + tokens[i].slice(1);
  12. }
  13. let funcName = "default" + tokens.join("");
  14. return window[funcName];
  15. }
  16. var actions = ["eat","chew","vomit","stomp","stomp-wedge","flex-toes","kick","anal-vore","ass-crush","tail-slap","tail-vore","tails-vore",
  17. "cleavage-stuff","cleavage-crush","cleavage-drop","cleavage-absorb","breast-crush",
  18. "breast-vore","breast-milk","unbirth","sheath-stuff","sheath-clench","sheath-crush",
  19. "sheath-absorb","cock-vore","cockslap","ball-smother","male-spurt","male-orgasm","female-spurt",
  20. "female-orgasm","grind","pouch-stuff","pouch-rub","pouch-eat","pouch-absorb","soul-vore","soul-absorb-paw",
  21. "paw-stench","ass-stench","piss-stench","scat-stench","male-orgasm-musk","female-orgasm-musk","male-spurt-musk","female-spurt-musk",
  22. "belch","fart","stomach","tail","tail-to-stomach","womb","balls","bowels","bowels-to-stomach","breasts","bladder",
  23. "soul-digest","wear-shoe","remove-shoe","wear-sock","remove-sock","stuff-shoe","dump-shoe","stuff-sock","dump-sock","piss","bladder-vore","scat",
  24. "sheath-toy","slit-toy","breast-toy","melt","solidify","flood","stomp-goo","goo-digest","ass-goo","goo-stomach-pull","goo-stomach-push",
  25. "goo-bowels-pull","goo-bowels-push","goo-womb-pull","goo-womb-push","goo-balls-pull","goo-balls-push","goo-breasts-pull","goo-breasts-push",
  26. "goo-tail-pull","goo-tail-push","goo-paws-pull","goo-paws-push","paw-vore","paw-vore-toes","paws","crop-swallow","crop-transfer",
  27. "breath-fire","breath-ice","breath-electric","breath-smoke","breath-radiation","breath-foul","drool"];
  28. for (let i=0; i<actions.length; i++) {
  29. rules[actions[i]] = [];
  30. }
  31. function isNonFatal(macro) {
  32. return macro.brutality == 0;
  33. }
  34. function isFatal(macro) {
  35. return macro.brutality >= 1;
  36. }
  37. function isGory(macro) {
  38. return macro.brutality >= 2;
  39. }
  40. function isSadistic(macro) {
  41. return macro.brutality >= 3;
  42. }
  43. function hasNothing(container, thing, amount) {
  44. for (var key in container.contents) {
  45. if (container.contents.hasOwnProperty(key))
  46. return false;
  47. }
  48. return true;
  49. }
  50. function hasLessThan(container, thing, amount) {
  51. if (container.contents.hasOwnProperty(thing))
  52. if (container.contents[thing].count < amount && container.contents[thing].count > 0)
  53. return true;
  54. return false;
  55. }
  56. function hasExactly(container, thing, amount) {
  57. if (!container.contents.hasOwnProperty(thing) && amount == 0)
  58. return true;
  59. if (container.contents.hasOwnProperty(thing) && container.contents[thing].count == amount)
  60. return true;
  61. return false;
  62. }
  63. function hasOnly(container, things) {
  64. if (!hasNothingElse(container, things))
  65. return false;
  66. for (var i=0; i<things.length; i++) {
  67. if (!container.contents.hasOwnProperty(things[i]))
  68. return false;
  69. }
  70. return true;
  71. }
  72. function hasNothingElse(container, things) {
  73. for (var key in container.contents) {
  74. if (container.contents.hasOwnProperty(key))
  75. if (!things.includes(key))
  76. return false;
  77. }
  78. return true;
  79. }
  80. function nothingLarger(container, thing) {
  81. for (var key in container.contents)
  82. if (container.contents.hasOwnProperty(key))
  83. if (areas[key] > areas[thing])
  84. return false;
  85. return true;
  86. }
  87. function describe(action, container, macro, verbose=true) {
  88. var options = [];
  89. for (var i = 0; i < rules[action].length; i++) {
  90. if(rules[action][i].test(container,macro)) {
  91. options.push(rules[action][i].desc);
  92. }
  93. }
  94. if (options.length > 0 && Math.random() > (1 / (2 + rules[action].length))) {
  95. let choice = Math.floor(Math.random() * options.length);
  96. return options[choice](container, macro, verbose);
  97. }
  98. else {
  99. return getDefault(action)(container, macro, verbose);
  100. }
  101. }
  102. // DEFAULTS
  103. function defaultEat(container, macro, verbose) {
  104. if (container.count == 0)
  105. return "You reach down for a delicious treat and grab - oh, nothing.";
  106. else
  107. return "You scoop up " + container.describe(verbose) + " and swallow " + (container.count > 1 ? "them" : "it") + " whole.";
  108. }
  109. function defaultChew(container, macro, verbose) {
  110. let pronoun = (container.count > 1 ? "them" : "it");
  111. if (container.count == 0)
  112. return "You reach down for a delicious treat and grab - oh, nothing.";
  113. else if (isSadistic(macro))
  114. return "Your greedy fingers gather up " + container.describe(verbose) + ", stuffing " + pronoun + " into your " + macro.jawDesc(true) + ". A slow, lazy bite " + macro.biteDesc(true) + " " + pronoun + ", rending flesh, snapping bone, and crushing everything between your savage " + macro.jawDesc(true) + ". You tip back your head and swallow...consigning the gory remains to your roiling gut.";
  115. else if (isNonFatal(macro))
  116. return defaultEat(container, macro, verbose);
  117. else {
  118. return "You scoop up " + container.describe(verbose) + " and " + macro.biteDesc() + " " + pronoun + " with your " + macro.jawDesc(true) + ", then swallow them down.";
  119. }
  120. }
  121. function defaultVomit(container, macro, verbose) {
  122. if (container.count == 0) {
  123. return "You retch, but nothing happens.";
  124. } else if (isSadistic(macro)) {
  125. return "You gag and lean over, vomiting up " + container.describe(false) + ". A thick, hissing slurry of molten meat and acid drenches your still-writhing prey, searing flesh and ensuring their wretched, rancid deaths.";
  126. } else if (isGory(macro)) {
  127. return "You retch and vomit up " + container.describe(false) + ", spewing them out amidst a thick slurry of chyme and leaving them to melt.";
  128. } else if (isFatal(macro)) {
  129. return "You vomit up " + container.describe(false) + ", leaving them to stew in your stomach juices.";
  130. } else {
  131. return "You hack up " + container.describe(false) + ".";
  132. }
  133. }
  134. function defaultStomp(container, macro, verbose) {
  135. if (container.count == 0)
  136. return "Your " + macro.footDesc() + " thumps the ground.";
  137. else if (isSadistic(macro))
  138. return "Your " + macro.footDesc(false) + " comes down on " + container.describe(verbose) + ", crushing your prey into gore and rubble with ease as your " + macro.toeDesc(true) + " shear bone and snap metal.";
  139. else if (isFatal(macro))
  140. return "You crush " + container.describe(verbose) + " under" + macro.footDesc(false,false,true) + ".";
  141. else
  142. return "You step on " + container.describe(verbose) + ".";
  143. }
  144. function defaultStompWedge(container, macro, verbose) {
  145. if (container.count == 1) {
  146. let line = container.describe(verbose);
  147. line = line.charAt(0).toUpperCase() + line.slice(1);
  148. return line + " is wedged between your " + macro.toeDesc(true);
  149. } else {
  150. let line = container.describe(verbose);
  151. line = line.charAt(0).toUpperCase() + line.slice(1);
  152. return line + " are wedged between your " + macro.toeDesc(true);
  153. }
  154. }
  155. function defaultFlexToes(container, macro, verbose) {
  156. if (container.count == 0) {
  157. if (macro.footShoeWorn) {
  158. return "You flex your " + macro.toeNoShoeDesc(true) + " inside your " + macro.footDesc(true) + ".";
  159. } else {
  160. return "You flex your " + macro.toeDesc(true) + ".";
  161. }
  162. } else {
  163. if (macro.footShoeWorn || macro.footSockWorn) {
  164. if (macro.brutality == 0) {
  165. return "You clench your " + macro.toeNoShoeDesc(true) + ", grinding them against the " + container.describe(false) + " trapped between your " + macro.footDesc(true) + " and your " + macro.toeOnlyDesc(true) + ".";
  166. } else {
  167. return "You clench your " + macro.toeNoShoeDesc(true) + ", crushing " + container.describe(false) + " between your " + macro.footDesc(true) + " and your " + macro.toeOnlyDesc(true) + ".";
  168. }
  169. } else {
  170. if (macro.brutality == 0) {
  171. return "You flex your " + macro.toeNoShoeDesc(true) + ", causing " + container.describe(false) + " to tumble out and fall to the ground.";
  172. } else {
  173. return "You flex and squeeze your " + macro.toeNoShoeDesc(true) + ", crushing " + container.describe(false) + " between them.";
  174. }
  175. }
  176. }
  177. }
  178. function defaultKick(container, macro, verbose) {
  179. if (container.count == 0)
  180. return "You swing your mighty " + macro.footDesc() + "..and hit nothing.";
  181. else
  182. return "You punt " + container.describe(verbose) + ", destroying " + (container.count > 1 ? "them" : "it") + ".";
  183. }
  184. function defaultAnalVore(container, macro, verbose) {
  185. if (container.count == 0)
  186. return "You're pretty sure you just sat on a rock.";
  187. else
  188. return "You sit yourself down on " + container.describe(verbose) + ". " + (container.count > 1 ? "They slide" : "It slides") + " inside with ease.";
  189. }
  190. function defaultAssCrush(container, macro, verbose) {
  191. let count = get_living_prey(container.sum());
  192. if (container.count == 0)
  193. return "You take a seat. It's good to have a break!";
  194. else if (isSadistic(macro))
  195. return "You lower your heavy ass to the ground, biting you lip as you feel " + container.describe(verbose) + " collapse beneath your massive cheeks. " + (count > 1 ? count + " lives are" : "A life is") + " snuffed out as you settle down, grinding your ass into the remains before slowly rising back up.";
  196. else if (isFatal(macro))
  197. return "Your heavy ass obliterates " + container.describe(verbose) + ". ";
  198. else
  199. return "You sit on " + container.describe(verbose);
  200. }
  201. function defaultTailSlap(container, macro, verbose) {
  202. if (container.count == 0)
  203. return "Your " + (macro.tailCount > 1 ? "tails swing" : "tail swings") + " to and fro";
  204. else if (isFatal(macro))
  205. return "Your " + macro.describeTail + (macro.tailCount > 1 ? " tails swing" : " tail swings") + " into " + container.describe(verbose) + ", smashing everything in " +
  206. (macro.tailCount > 1 ? "their" : "its") + " path.";
  207. else
  208. return "Your " + macro.describeTail + (macro.tailCount > 1 ? " tails slap" : " tail slaps") + " against " + container.describe(verbose) + ", bowling them over.";
  209. }
  210. function defaultTailVore(container, macro, verbose) {
  211. if (container.count == 0)
  212. return "Your drooling tail swings to and fro";
  213. else if (isFatal(macro))
  214. return "Your tail lunges, maw agape, at " + container.describe(verbose) +
  215. ". It scarfs down everything in seconds, gulping forcefully to drag your prey into your sloppy confines.";
  216. else
  217. return "Your tail lunges, maw agape, at " + container.describe(verbose) +
  218. ". It scarfs down everything in a second, gulping forcefully and pulling your prey inside.";
  219. }
  220. function defaultTailsVore(container, macro, verbose) {
  221. if (container.count == 0)
  222. return "Your drooling tails swing to and fro";
  223. else if (isFatal(macro))
  224. return "Your $COUNT tails lunge, maws agape, at " + container.describe(verbose) +
  225. ". They scarf down everything in seconds, gulping forcefully to drag your prey into your sloppy confines.";
  226. else
  227. return "Your $COUNT tails lunge, maws agape, at " + container.describe(verbose) +
  228. ". They scarf down your prey, gulping forcefully and pulling them deep inside.";
  229. }
  230. function defaultCleavageStuff(container, macro, verbose) {
  231. if (container.count == 0)
  232. return "You can't fit anything into your cleavage right now.";
  233. else
  234. return "You snatch up " + container.describe(verbose) + " and stuff " + (container.count > 1 ? "them" : "it") + " into your cleavage.";
  235. }
  236. function defaultCleavageCrush(container, macro, verbose) {
  237. if (container.count == 0)
  238. return "You grasp your breasts and forcefully squeeze them together.";
  239. else if (isSadistic(macro))
  240. return "You grasp your breasts and slowly bring them together, steadily crushing the life from " + container.describe(false) + " trapped in between - savoring every last <i>pop</i> and <i>crunch</i> as you exterminate your prey.";
  241. else if (isGory(macro))
  242. return "You grasp your breasts and forcefully shove them together, crushing the life from " + container.describe(false) + ".";
  243. else if (isFatal(macro))
  244. return "You grasp your breasts and forcefully shove them together, crushing " + container.describe(false) + ".";
  245. else
  246. return "You grasp your breasts and squish them together, smooshing " + container.describe(false) + ".";
  247. }
  248. function defaultCleavageDrop(container, macro, verbose) {
  249. if (container.count == 0)
  250. return "You pull your breasts apart and give them a shake.";
  251. if (isFatal(macro))
  252. 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.";
  253. else
  254. return "You pull your breasts apart far enough for the " + container.describe(false) + " trapped within to fall out.";
  255. }
  256. function defaultCleavageAbsorb(container, macro, verbose) {
  257. if (container.count == 0)
  258. return defaultCleavageCrush(container, macro, verbose);
  259. else
  260. return "Your squeeze your breasts together, swiftly absorbing " + container.describe(false) + " into your chest.";
  261. }
  262. function defaultBreastCrush(container, macro, verbose) {
  263. if (container.count == 0)
  264. return "Your thump your breasts against the ground.";
  265. else if (isFatal(macro))
  266. return "Your heavy breasts obliterate " + container.describe(verbose) + ". ";
  267. else
  268. return "You smoosh " + container.describe(verbose) + " with your breasts.";
  269. }
  270. function defaultBreastVore(container, macro, verbose) {
  271. if (container.count == 0)
  272. return "It'd be pretty hot to stick someone in your breasts. Shame you can't right now.";
  273. else
  274. return "Your nipples envelop " + container.describe(verbose) + ", pulling them into your breasts. ";
  275. }
  276. function defaultBreastMilk(container, macro, verbose) {
  277. if (container.count == 0)
  278. return "You squeeze your breasts, coaxing out $VOLUME of warm, creamy milk that splatters on the ground.";
  279. else if (isFatal(macro))
  280. return "You squeeze your breasts, coaxing out $VOLUME of warm, creamy milk that floods " + container.describe(verbose) + " in an unstoppable wave of white.";
  281. else
  282. return "You squeeze your breasts, coaxing out $VOLUME of warm, creamy milk that floods " + container.describe(verbose) + ".";
  283. }
  284. function defaultUnbirth(container, macro, verbose) {
  285. if (container.count == 0)
  286. return "You grab " + (macro.victimsHuman ? new Human(1).describe(verbose) : new Person(1).describe(verbose)) + " and grind them against your slit...but they won't fit.";
  287. else
  288. return "You gasp as you slide " + container.describe(verbose) + " up your slit. ";
  289. }
  290. function defaultSheathStuff(container, macro, verbose) {
  291. if (container.count == 0)
  292. return "You grab a " + (macro.victimsHuman ? new Human(1).describe(verbose) : new Person(1).describe(verbose)) + " and grind them against your sheath-slit...but they won't fit.";
  293. else
  294. return "You pluck " + container.describe(verbose) + " from the ground and slip them into your musky sheath.";
  295. }
  296. function defaultBreastToy(container, macro, verbose) {
  297. if (container.count > 0) {
  298. return "You smush your breasts together, squeezing " + container.describe(false) + " between the heavy mounds.";
  299. } else {
  300. return "You smush your breasts together.";
  301. }
  302. }
  303. function defaultSlitToy(container, macro, verbose) {
  304. if (container.count > 0) {
  305. return "You slip your fingers into your snatch, teasing yourself and pushing the " + container.describe(false) + " within a little deeper.";
  306. } else {
  307. return "Your slp your fingers into your snatch and tease yourself.";
  308. }
  309. }
  310. function defaultSheathToy(container, macro, verbose) {
  311. if (container.count > 0) {
  312. if (macro.orgasm) {
  313. 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.";
  314. } else if (macro.arousal < 25) {
  315. return "You grip your soft sheath and give it a squeeze, feeling " + container.describe(false) + " within rub against your " + macro.describeDick + " cock.";
  316. } else if (macro.arousal < 75) {
  317. return "You grip your swelling sheath and squeeze, feeling " + container.describe(false) + " within grind against your " + macro.describeDick + " cock.";
  318. } else if (macro.arousal < 150) {
  319. 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.";
  320. } else {
  321. return "Trembling with your impending orgasm, your fingers play over your sheath, feeling " + container.describe(false) + " within rub against your " + macro.describeDick + " cock.";
  322. }
  323. } else {
  324. if (macro.orgasm) {
  325. 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.";
  326. } else if (macro.arousal < 25) {
  327. return "You grip your soft sheath and give it a squeeze.";
  328. } else if (macro.arousal < 75) {
  329. return "You grip your swelling sheath and squeeze.";
  330. } else if (macro.arousal < 150) {
  331. return "You run your fingers down your " + macro.describeDick + " shaft and grip your sheath, squeezing it gently.";
  332. } else {
  333. return "Trembling with your impending orgasm, your fingers play over your sheath.";
  334. }
  335. }
  336. }
  337. function defaultSheathClench(container, macro, verbose) {
  338. if (container.count == 0)
  339. return "You squeeze your sheath.";
  340. else if (isGory(macro))
  341. return "You squeeze your packed sheath, reducing " + container.describe(false) + " to a gory paste that slickens your throbbing shaft.";
  342. else if (isFatal(macro))
  343. return "Your fingers run over your packed sheath, squeezing on the " + macro.describeDick + " shaft within and smashing " + container.describe(false);
  344. else
  345. return "Your squeeze your sheath, pushing " + container.describe(false) + " out of your sheath.";
  346. }
  347. function defaultSheathCrush(container, macro, verbose) {
  348. if (container.count == 0)
  349. return "Your orgasm causes your " + macro.describeDick + " cock to swell and surge.";
  350. else if (isGory(macro))
  351. 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.";
  352. else if (isFatal(macro))
  353. return "Your orgasm causes your " + macro.describeDick + " shaft to throb and swell, smashing " + container.describe(false) + " trapped in your musky sheath.";
  354. else
  355. return "Your orgasm causes your " + macro.describeDick + " cock to swell, squeezing " + container.describe(false) + " out from your sheath.";
  356. }
  357. function defaultSheathAbsorb(container, macro, verbose) {
  358. if (container.count > 0)
  359. return "You grip your sheath and give it a firm <i>squeeze</i>, abruptly absorbing " + container.describe(false) + " into your musky body.";
  360. else
  361. return defaultSheathToy(container, macro, verbose);
  362. }
  363. function defaultCockVore(container, macro, verbose) {
  364. if (container.count == 0)
  365. return "You grab " + (macro.victimsHuman ? new Human(1).describe(verbose) : new Person(1).describe(verbose)) + " and grind them against your cock...but they won't fit.";
  366. else
  367. return "You stuff " + container.describe(verbose) + " into your throbbing shaft, forcing them down to your heavy balls.";
  368. }
  369. function defaultCockslap(container, macro, verbose) {
  370. if (container.count == 0)
  371. return "Your " + macro.describeDick + " swings through the air. Lewd!";
  372. else if (isFatal(macro))
  373. return "Your swaying " + macro.describeDick + " cock crushes " + container.describe(verbose) + ". ";
  374. else
  375. return "You smack " + container.describe(verbose) + " with your " + macro.describeDick + " shaft.";
  376. }
  377. function defaultBallSmother(container, macro, verbose) {
  378. if (container.count == 0)
  379. return "You rest your heavy balls on the ground.";
  380. else if (isFatal(macro))
  381. return "Your weighty balls spread over " + container.describe(verbose) + ", drowning them in musk.";
  382. else
  383. return "Your weighty balls spread over " + container.describe(verbose) + ".";
  384. }
  385. function defaultMaleSpurt(container, macro, verbose) {
  386. if (container.count == 0)
  387. return "Your " + macro.describeDick + " cock spews $VOLUME of bitter precum.";
  388. else if (isFatal(macro))
  389. return "Your " + macro.describeDick + " cock spurts out bitter precum, drowning " + container.describe(verbose) + " in $VOLUME of slick musky fluid.";
  390. else
  391. return "Your " + macro.describeDick + " shaft spurts precum, splooging " + container.describe(verbose) + " in $VOLUME of slick musky fluid.";
  392. }
  393. function defaultMaleOrgasm(container, macro, verbose) {
  394. if (container.count == 0)
  395. return "Your " + macro.describeDick + " cock spurts $TIMES times, gushing out a $VOLUME glob of cum.";
  396. else if (isFatal(macro))
  397. return "You're cumming! Your " + macro.describeDick + " cock erupts with $TIMES ropes of seed, obliterating " + container.describe(verbose) + " in a $VOLUME-torrent of cum.";
  398. else
  399. return "You're cumming! Your " + macro.describeDick + " shaft erupts with $TIMES ropes of seed, splooging " + container.describe(verbose) + " in a $VOLUME-torrent of cum.";
  400. }
  401. function defaultFemaleSpurt(container, macro, verbose) {
  402. if (container.count == 0)
  403. return "Your moist slit splatters $VOLUME of slick juices.";
  404. else if (isSadistic(macro))
  405. return "Your dripping slit splatters $VOLUME of your intoxicating juices, dissolving " + container.describe(verbose) + ".";
  406. else if (isFatal(macro))
  407. return "Your moist slit splatters $VOLUME of slick juices, drowning " + container.describe(verbose) + " in your building lust.";
  408. else
  409. return "Your moist slit splatters $VOLUME of slick juices, splooging " + container.describe(verbose) + ".";
  410. }
  411. function defaultFemaleOrgasm(container, macro, verbose) {
  412. if (container.count == 0)
  413. return "Your moist slit sprays $TIMES times, gushing out $VOLUME of slick femcum.";
  414. else if (isSadistic(macro))
  415. return "Your quivering slit sprays $VOLUME of your intoxicating femcum, dissolving " + container.describe(verbose) + " in an unstoppable torrent of deadly lust.";
  416. else if (isFatal(macro))
  417. return "Your moist slit sprays $VOLUME of slick femcum, obliterating " + container.describe(verbose) + " in $TIMES consecutive bursts of lust.";
  418. else
  419. return "Your moist slit sprays $VOLUME of slick femcum, splooging " + container.describe(verbose) + " with $TIMES orgasmic spurts.";
  420. }
  421. function defaultGrind(container, macro, verbose) {
  422. var mid = isFatal(macro) ? ", smashing them apart" : ", using them as a toy";
  423. var end = macro.arousalEnabled ? " to fuel your lust." : ".";
  424. var desc = container.count > 0 ? container.describe(verbose) + mid + end : "the ground.";
  425. if (macro.maleParts && macro.femaleParts) {
  426. return "You grind your " + macro.describeDick + " cock and " + macro.describeVagina + " slit against " + desc;
  427. } else if (macro.maleParts && !macro.femaleParts) {
  428. return "You grind your " + macro.describeDick + " shaft against " + desc;
  429. } else if (!macro.maleParts && macro.femaleParts) {
  430. return "You grind your " + macro.describeVagina + " slit against " + desc;
  431. } else {
  432. return "You grind your hips against " + desc;
  433. }
  434. }
  435. function defaultPouchStuff(container, macro, verbose) {
  436. if (container.count == 0)
  437. return "You grab " + (macro.victimsHuman ? new Human(1).describe(verbose) : new Person(1).describe(verbose)) + " and stuff them against your pouch...but they won't fit!";
  438. else
  439. return "You grab " + container.describe(verbose) + " and stuff " + (container.count > 1 ? "them" : "it") + " into your pouch.";
  440. }
  441. function defaultPouchRub(container, macro, verbose) {
  442. if (container.count == 0)
  443. return "You rub your empty pouch.";
  444. else
  445. return "You rub your bulging pouch, feeling at " + container.describe(false) + " trapped within.";
  446. }
  447. function defaultPouchEat(container, macro, verbose) {
  448. if (container.count == 0)
  449. return "There's nothing in your pouch!";
  450. else
  451. return "You snatch " + container.describe(verbose) + " from your pouch and shove " + (container.count > 1 ? "them" : "it") + " down your gullet!";
  452. }
  453. function defaultPouchAbsorb(container, macro, verbose) {
  454. if (container.count == 0)
  455. return "There's nothing in your pouch!";
  456. else
  457. return "Your pouch flattens as it absorbs " + container.describe(false);
  458. }
  459. function defaultSoulVore(container, macro, verbose) {
  460. if (container.count == 0)
  461. return "No souls here.";
  462. else
  463. return "You open your " + macro.jawDesc(true) + " and inhale, ripping the souls from " + container.describe(verbose) + " and dragging them down deep inside.";
  464. }
  465. function defaultSoulAbsorbPaw(container, macro, verbose) {
  466. let sum = get_living_prey(container.sum());
  467. if (container.count == 0)
  468. return "Your " + macro.footDesc() + " thumps against the ground";
  469. else if (sum == 0)
  470. return "Your " + macro.footDesc() + " slams down on " + container.describe(verbose) + "...but there aren't any souls within!";
  471. else
  472. return "Your " + macro.footDesc() + " slams down on " + container.describe(verbose) + ", smashing them to pieces and absorbing " + sum + (sum == 1 ? " soul" : " souls") + " into your pads.";
  473. }
  474. function defaultPawStench(container, macro, verbose) {
  475. let sum = get_living_prey(container.sum());
  476. if (isSadistic(macro))
  477. return "Horrific miasma flows from your " + macro.footDesc(true)+ ", the corrsoive fumes reducing " + (sum > 1 ? sum + " people" : "a person") + " to charred flesh as they wash over " + container.describe(false) + ".";
  478. if (isFatal(macro))
  479. return "Vile fumes waft from your " + macro.footDesc(true) + " , choking the life from " + (sum > 1 ? sum + " people." : "a person.");
  480. else
  481. return "Your stinky " + macro.footDesc(true) + " overwhelms " + (sum > 1 ? sum + " people" : "a person") + " with your scent!";
  482. }
  483. function defaultAssStench(container, macro, verbose) {
  484. let sum = get_living_prey(container.sum());
  485. if (isSadistic(macro))
  486. return "Rancid fumes from your ass sear the flesh of " + (sum > 1 ? sum + " people" : "a person") + " as they wash over " + container.describe(false) + ", corroding everything in their path.";
  487. if (isFatal(macro))
  488. return "Vile miasma from your bitter ass snuffs out " + (sum > 1 ? sum + " people" : "a person") + ", suffocating them in your stench.";
  489. else
  490. return "Your stinky butt sickens " + (sum > 1 ? sum + " people" : "a person") + " with your scent!";
  491. }
  492. function defaultPissStench(container, macro, verbose) {
  493. let sum = get_living_prey(container.sum());
  494. if (isSadistic(macro))
  495. return "Waves of corrosive fumes waft from your piss, the toxic cloud liquefying the flesh of " + (sum > 1 ? numberRough(sum,"of") + " people" : "a person") + " as it dissolves " + container.describe(false) + ".";
  496. if (isFatal(macro))
  497. return "Vile fumes waft from your piss, choking the life from " + (sum > 1 ? sum + " people." : "a person.");
  498. else
  499. return "Your stinky piss overwhelms " + (sum > 1 ? sum + " people" : "a person") + " with your scent!";
  500. }
  501. function defaultScatStench(container, macro, verbose) {
  502. let sum = get_living_prey(container.sum());
  503. if (isSadistic(macro))
  504. return "A rancid miasma spews from your shit - a thick, choking avalanche of toxic vapors that reduce " + (sum > 1 ? numberRough(sum,"of") + " people" : "a person") + " to nothing but bones as it melts " + container.describe(false) + ".";
  505. if (isFatal(macro))
  506. return "Vile fumes waft from your scat, choking the life from " + (sum > 1 ? sum + " people." : "a person.");
  507. else
  508. return "Your stinky scat overwhelms " + (sum > 1 ? sum + " people" : "a person") + " with your scent!";
  509. }
  510. function defaultMaleSpurtMusk(container, macro, verbose) {
  511. let sum = get_living_prey(container.sum());
  512. if (isSadistic(macro))
  513. return "Waves of corrosive musk waft from your precum, the bitter cloud liquefying the flesh of " + (sum > 1 ? numberRough(sum,"of") + " people" : "a person") + " as it dissolves " + container.describe(false) + ".";
  514. if (isFatal(macro))
  515. return "Powerful musk wafts from your precum, choking the life from " + (sum > 1 ? sum + " people." : "a person.");
  516. else
  517. return "Your musky precum overwhelms " + (sum > 1 ? sum + " people" : "a person") + " with your scent!";
  518. }
  519. function defaultFemaleSpurtMusk(container, macro, verbose) {
  520. let sum = get_living_prey(container.sum());
  521. if (isSadistic(macro))
  522. return "Waves of corrosive musk waft from your precum, the bitter cloud liquefying the flesh of " + (sum > 1 ? numberRough(sum,"of") + " people" : "a person") + " as it dissolves " + container.describe(false) + ".";
  523. if (isFatal(macro))
  524. return "Powerful musk wafts from your precum, choking the life from " + (sum > 1 ? sum + " people." : "a person.");
  525. else
  526. return "Your musky precum overwhelms " + (sum > 1 ? sum + " people" : "a person") + " with your scent!";
  527. }
  528. function defaultMaleOrgasmMusk(container, macro, verbose) {
  529. let sum = get_living_prey(container.sum());
  530. if (isSadistic(macro))
  531. return "Waves of corrosive musk waft from your cum, the bitter cloud liquefying the flesh of " + (sum > 1 ? numberRough(sum,"of") + " people" : "a person") + " as it dissolves " + container.describe(false) + ".";
  532. if (isFatal(macro))
  533. return "Powerful musk wafts from your cum, choking the life from " + (sum > 1 ? sum + " people." : "a person.");
  534. else
  535. return "Your musky cum overwhelms " + (sum > 1 ? sum + " people" : "a person") + " with your scent!";
  536. }
  537. function defaultFemaleOrgasmMusk(container, macro, verbose) {
  538. let sum = get_living_prey(container.sum());
  539. if (isSadistic(macro))
  540. return "Waves of corrosive musk waft from your cum, the bitter cloud liquefying the flesh of " + (sum > 1 ? numberRough(sum,"of") + " people" : "a person") + " as it dissolves " + container.describe(false) + ".";
  541. if (isFatal(macro))
  542. return "Powerful musk wafts from your cum, choking the life from " + (sum > 1 ? sum + " people." : "a person.");
  543. else
  544. return "Your musky cum overwhelms " + (sum > 1 ? sum + " people" : "a person") + " with your scent!";
  545. }
  546. function defaultBelch(container, macro, verbose) {
  547. let sum = get_living_prey(container.sum());
  548. if (container.count == 0)
  549. return "An ominous groan precedes a crass belch.";
  550. if (isSadistic(macro))
  551. return "A disgusting torrent of gas erupts from your rancid stomach, the vile green gale stopping hearts and burning flesh as it annihilates " + container.describe(verbose) + ".";
  552. if (isFatal(macro))
  553. return "A rancid belch flows from your " + macro.jawDesc(verbose) + ", corroding " + container.describe(verbose) + " with your vile fumes.";
  554. else
  555. return "You let out a loud burp, blowing over " + container.describe(verbose) + "!";
  556. }
  557. function defaultFart(container, macro, verbose) {
  558. let sum = get_living_prey(container.sum());
  559. if (container.count == 0)
  560. return "An ominous groan precedes a loud, pungent fart.";
  561. if (isSadistic(macro))
  562. return "Your intestines snarl and lurch, expelling a powerful jet of utterly rancid stench from your bitter ass. The plume gushes over " + container.describe(verbose) + ", ending " + (sum > 1 ? sum + " lives" : "a life") + " and annihilating everything in its path.";
  563. if (isFatal(macro))
  564. return "An ominous groan precedes a loud, pungent fart, corroding " + container.describe(verbose) + " with truly vile vapors.";
  565. else
  566. return "You let out a crass fart, blowing over " + container.describe(verbose) + "!";
  567. }
  568. function defaultStomach(container, macro, verbose) {
  569. if (isSadistic(macro))
  570. return "Your churning guts crushes your prey into a gory paste, annihilating " + container.describe(false) + " and reducing everything to rancid chyme.";
  571. else if (isGory(macro))
  572. return "Your caustic stomach grinds " + container.describe(false) + " to a gory pulp.";
  573. else if (isFatal(macro))
  574. return "Your stomach gurgles as it digests " + container.describe(false) + ".";
  575. else
  576. return "Your stomach groans and abosrbs " + container.describe(false) + ".";
  577. }
  578. function defaultTail(container, macro, verbose) {
  579. if (isSadistic(macro))
  580. return "Your " + macro.tailDesc + " " + (macro.tailCount > 1 ? "clench" : "clenches") + ", crushing " + container.describe(false) + " into unrecognizable paste.";
  581. else if (isGory(macro))
  582. return "Your fatal " + (macro.tailCount > 1 ? "tails crush " : "tail crushes ") + container.describe(false) + " to a gory pulp.";
  583. else if (isFatal(macro))
  584. return "Your " + (macro.tailCount > 1 ? "tails gurgles as they digest " : "tail gurgles as it digests ") + container.describe(false) + ".";
  585. else
  586. return "Your " + (macro.tailCount > 1 ? "tails groan and absorb " : "tail groans and absorbs ") + container.describe(false) + ".";
  587. }
  588. function defaultTailToStomach(container, macro, verbose) {
  589. if (isFatal(macro))
  590. return "Your " + (macro.tailCount > 1 ? "tails clench" : "tail clenches") + ", squeezing " + container.describe(false) + " into your gurgling stomach.";
  591. else
  592. return "Your " + (macro.tailCount > 1 ? "tails squeeze" : "tail squeezes") + " " + container.describe(false) + " into your belly.";
  593. }
  594. function defaultBowels(container, macro, verbose) {
  595. if (isSadistic(macro))
  596. return "Your rancid bowels clench and churn, crushing " + container.describe(false) + " into a paste of gore and rubble - and then swiftly absorbing everything.";
  597. if (isFatal(macro))
  598. return "Your bowels churn as they melt down " + container.describe(false) + " and absorb them into your body";
  599. else
  600. return "Your bowels churn as they absorb " + container.describe(false);
  601. }
  602. function defaultBowelsToStomach(container, macro, verbose) {
  603. if (isFatal(macro))
  604. return "Your bowels clench, forcing " + container.describe(false) + " into your roiling, caustic stomach.";
  605. else
  606. return "Your bowels clench, squeezing " + container.describe(false) + " into your belly.";
  607. }
  608. function defaultWomb(container, macro, verbose) {
  609. if (isFatal(macro))
  610. return "Your womb squeezes and dissolves " + container.describe(false) + ", turning them into $VOLUME of slick femcum.";
  611. else
  612. return "Your womb squeezes as it absorbs " + container.describe(false);
  613. }
  614. function defaultBalls(container, macro, verbose) {
  615. if (isFatal(macro))
  616. return "Your balls slosh as they digest " + container.describe(false) + " into $VOLUME of cum";
  617. else
  618. return "Your balls slosh as they absorb " + container.describe(false);
  619. }
  620. function defaultBreasts(container, macro, verbose) {
  621. if (isFatal(macro) && macro.lactationEnabled)
  622. return "Your breasts grrgle as they digest " + container.describe(false) + " into $VOLUME of milk";
  623. else
  624. return "Your breasts slosh as they absorb " + container.describe(false);
  625. }
  626. function defaultBladder(container, macro, verbose) {
  627. if (isSadistic(macro)) {
  628. let fatalities = get_living_prey(container.sum());
  629. let line = "Your bladder swells as " + container.describe(false) + " are dissolved in your acrid piss, digesting them down to $VOLUME of fresh urine";
  630. if (fatalities > 0) {
  631. line += " " + (fatalities > 1 ? fatalities + " lives are" : "a life is") + " snuffed out by the horrific yellow tide, corroded and annihilated amongst the unbearable stench of urine.";
  632. }
  633. return line;
  634. } else if (isFatal(macro))
  635. return "Your bladder swells as it dissolves " + container.describe(false) + " into $VOLUME of acrid piss";
  636. else
  637. return "Your bladder squeezes as it absorbs " + container.describe(false);
  638. }
  639. function defaultSoulDigest(container, macro, verbose) {
  640. let sum = get_living_prey(container.sum());
  641. switch(macro.soulVoreType) {
  642. case "release":
  643. return (sum > 1 ? sum + " souls escape" : "A soul escapes") + " your depths.";
  644. case "body":
  645. return "Your body claims " + (sum > 1 ? sum + " souls" : "a soul") + ", imprisoning " + (sum > 1 ? "them" : "it") + " in your body for good.";
  646. case "oblivion":
  647. return "Energy washes through your depths as you annihilate " + (sum > 1 ? sum + " souls" : "a soul") + ", crushing " + (sum > 1 ? "them" : "it") + " into nothingness.";
  648. }
  649. }
  650. function defaultWearShoe(container, macro, verbose) {
  651. if (container.count == 0) {
  652. return "You slip on your " + macro.shoeDesc(true,false) + ".";
  653. } else {
  654. return "You slip on your " + macro.shoeDesc(true,false) + ", " + macro.toeDesc(true) + " wriggling against " + container.describe(false) + " trapped within!";
  655. }
  656. }
  657. function defaultRemoveShoe(container, macro, verbose) {
  658. if (container.count == 0) {
  659. return "You pull off your " + macro.shoeDesc(true,false) + ".";
  660. } else {
  661. return "You pull off your " + macro.shoeDesc(true,false) + ", " + macro.toeDesc(true) + " rubbing against " + container.describe(false) + " on the way out.";
  662. }
  663. }
  664. function defaultWearSock(container, macro, verbose) {
  665. if (container.count == 0) {
  666. return "You slip on your " + macro.sockDesc(true,false) + ".";
  667. } else {
  668. return "You slip on your " + macro.sockDesc(true,false) + ", " + macro.toeDesc(true) + " grinding against " + container.describe(false) + " trapped in the cotton tube!";
  669. }
  670. }
  671. function defaultRemoveSock(container, macro, verbose) {
  672. if (container.count == 0) {
  673. return "You pull off your " + macro.sockDesc(true,false) + ". Cool air washes over your " + macro.toeOnlyDesc(true);
  674. } else {
  675. return "You pull off your " + macro.sockDesc(true,false) + ", leaving " + container.describe(false) + " trapped at the bottom.";
  676. }
  677. }
  678. function defaultStuffShoe(container, macro, verbose) {
  679. if (container.count == 0) {
  680. return "You don't have anything to stuff into your " + macro.shoeDesc(true) + ".";
  681. } else {
  682. return "You grab " + container.describe(verbose) + " and stuff " + (container.count > 1 ? "them" : "it") + " into your " + macro.shoeDesc(true) + "!";
  683. }
  684. }
  685. function defaultStuffSock(container, macro, verbose) {
  686. if (container.count == 0) {
  687. return "You don't have anything to stuff into your " + macro.sockDesc(true) + ".";
  688. } else {
  689. return "You grab " + container.describe(verbose) + " and stuff " + (container.count > 1 ? "them" : "it") + " into your " + macro.sockDesc(true) + "!";
  690. }
  691. }
  692. function defaultDumpShoe(container, macro, verbose) {
  693. if (container.count == 0) {
  694. return "Your " + macro.shoeDesc(true) + " are empty, silly.";
  695. } else {
  696. return "You shake out your " + macro.shoeDesc(true) + ", dumping " + container.describe(false) + " onto the ground.";
  697. }
  698. }
  699. function defaultDumpSock(container, macro, verbose) {
  700. if (container.count == 0) {
  701. return "You don't have anything to stuff into your " + macro.sockDesc(true) + ".";
  702. } else {
  703. return "You turn your " + macro.shoeDesc(true) + " inside-out, dumping " + container.describe(false) + " onto the ground.";
  704. }
  705. }
  706. function defaultPiss(container, macro, verbose) {
  707. if (macro.maleParts) {
  708. if (container.count == 0) {
  709. return "You sigh with relief as $VOLUME of piss erupts from your " + macro.describeDick + " cock.";
  710. } else if (isSadistic(macro)) {
  711. return "You sigh with relief as $VOLUME of hot, rancid piss erupts from your " + macro.describeDick + " cock, inundating " + container.describe(verbose) + " in a disgusting tide of yellow death."
  712. } else {
  713. return "You sigh with relief as $VOLUME of piss erupts from your " + macro.describeDick + " cock, spraying down " + container.describe(verbose) + " in a shower of golden, musky fluid.";
  714. }
  715. } else if (macro.femaleParts) {
  716. if (container.count == 0) {
  717. return "You sigh with relief as $VOLUME of piss erupts from your " + macro.describeVagina + " slit.";
  718. } else if (isSadistic(macro)) {
  719. return "You sigh with relief as $VOLUME of hot, rancid piss erupts from your " + macro.describeVagina + " slit, inundating " + container.describe(verbose) + " in a disgusting tide of yellow death."
  720. } else {
  721. return "You sigh with relief as $VOLUME of piss erupts from your " + macro.describeVagina + " slit, spraying down " + container.describe(verbose) + " in a shower of golden, musky fluid.";
  722. }
  723. } else {
  724. if (container.count == 0) {
  725. return "You sigh with relief as $VOLUME of piss erupts from between your legs.";
  726. } else if (isSadistic(macro)) {
  727. return "You sigh with relief as $VOLUME of hot, rancid piss erupts from between your legs, inundating " + container.describe(verbose) + " in a disgusting tide of yellow death."
  728. } else {
  729. return "You sigh with relief as $VOLUME of piss erupts from between your legs, spraying down " + container.describe(verbose) + " in a shower of golden, musky fluid.";
  730. }
  731. }
  732. }
  733. function defaultBladderVore(container, macro, verbose) {
  734. if (container.count == 0) {
  735. return "You don't have anything to shove into your bladder!";
  736. }
  737. else {
  738. if (macro.maleParts) {
  739. return "You snatch up " + container.describe(verbose) + " and stuff them into your " + macro.describeDick + " cock, grinding them to its base and forcing them into your musky bladder.";
  740. } else if (macro.femaleParts) {
  741. return "You snatch " + container.describe(verbose) + " in your iron grip, grinding them against your " + macro.describeVagina + " slit before stuffing them into your urethra, sealing them away in your musky bladder.";
  742. } else {
  743. return "You grab " + container.describe(verbose) + " and grind them between your legs, slipping them into your urethra and imprisoning them in your bladder.";
  744. }
  745. }
  746. }
  747. function defaultScat(container, macro, verbose) {
  748. let sum = get_living_prey(container.sum());
  749. if (macro.scatStorage.amount == 0) {
  750. return "Your bowels are empty.";
  751. } else if (container.count == 0) {
  752. return "You squat down and let out a $MASS log of shit.";
  753. } else if (isSadistic(macro)) {
  754. let line = "You squat down, letting out a grunt as your rancid bowels force out a $MASS, $LENGTH-long heap of shit. The fatally-pungent scat buries " + container.describe(verbose) + ", ending " + numberRough(sum,"of") + " lives and entombing them in your shit.";
  755. if (macro.scatStorage.victims.count > 0) {
  756. line += " Embedded in the vomit-inducing heap are the mangled, crushed remains of " + listSum(macro.scatStorage.victims.sum()) + ", " + numberRough(get_living_prey(macro.scatStorage.victims.sum()), "of") + " living creatures converted to noxious scat by your disgusting depths.";
  757. }
  758. return line;
  759. } else if (macro.brutality > 0 && macro.scatStorage.victims.count > 0) {
  760. return "You squat down, grunting as your lower guts squeeze out a $MASS, $LENGTH-long log of scat that smothers " + container.describe(verbose) + ". Embedded in the thick, chunky waste are the remains of " + listSum(macro.scatStorage.victims.sum()) + ", now little more than bones and wreckage in your shit.";
  761. } else {
  762. return "You squat down, grunting as your lower guts squeeze out a $MASS, $LENGTH-long log of scat that smothers " + container.describe(verbose);
  763. }
  764. }
  765. function defaultMelt(container, macro, verbose) {
  766. if (container.count == 0) {
  767. return "Your body turns gooey.";
  768. } else {
  769. return "Your body turns gooey, sucking " + container.describe(false) + " into your molten self.";
  770. }
  771. }
  772. function defaultSolidify(container, macro, verbose) {
  773. if (container.count == 0) {
  774. return "Your body turns solid.";
  775. } else if (macro.gooDigest > 0) {
  776. return "Your body turns solid, pushing out " + container.describe(verbose) + ".";
  777. } else {
  778. return "Your body turns solid, swiftly absorbing " + container.describe(verbose) + ".";
  779. }
  780. }
  781. function defaultFlood(container, macro, verbose) {
  782. if (container.count == 0) {
  783. return "Your gooey body melts and floods outward..but doesn't catch anything.";
  784. } else {
  785. return "Your gooey body melts and floods outward, burying " + container.describe(verbose) + " in your thick, slimy self. You slowly reform, grinning as you feel " + numberRough(get_living_prey(container.sum()), "of") + " prey sloshing about within.";
  786. }
  787. }
  788. function defaultStompGoo(container, macro, verbose) {
  789. if (container.count == 0) {
  790. return "Your gooey paw hits the ground.";
  791. } else {
  792. return "Your gooey paws falls over " + container.describe(verbose) + ", smothering them in goo and pulling them into your body.";
  793. }
  794. }
  795. function defaultAssGoo(container, macro, verbose) {
  796. if (container.count == 0) {
  797. return "Your gooey ass sits down on the ground.";
  798. } else {
  799. return "You sit your gooey ass down on " + container.describe(verbose) + ", pulling them right into your body.";
  800. }
  801. }
  802. function defaultGooDigest(container, macro, verbose) {
  803. return "Your goopy depths dissolve " + container.describe(false) + ".";
  804. }
  805. function defaultGooStomachPull(container, macro, verbose) {
  806. return "Your molten depths squeeze in around the " + container.describe(false) + " imprisoned in your stomach, drawing them into the viscous goo.";
  807. }
  808. function defaultGooStomachPush(container, macro, verobse) {
  809. return "Your churning goo herds " + container.describe(false) + " into your gurgling stomach.";
  810. }
  811. function defaultGooBowelsPull(container, macro, verbose) {
  812. return "Your molten depths squeeze in around the " + container.describe(false) + " imprisoned in your bowels, drawing them into the viscous goo.";
  813. }
  814. function defaultGooBowelsPush(container, macro, verobse) {
  815. return "Your churning goo herds " + container.describe(false) + " into your clenching bowels.";
  816. }
  817. function defaultGooWombPull(container, macro, verbose) {
  818. return "Your molten depths squeeze in around the " + container.describe(false) + " imprisoned in your womb, drawing them into the viscous goo.";
  819. }
  820. function defaultGooWombPush(container, macro, verobse) {
  821. return "Your churning goo herds " + container.describe(false) + " into your slick womb.";
  822. }
  823. function defaultGooBallsPull(container, macro, verbose) {
  824. return "Your molten depths squeeze in around the " + container.describe(false) + " imprisoned in your balls, drawing them into the viscous goo.";
  825. }
  826. function defaultGooBallsPush(container, macro, verobse) {
  827. return "Your churning goo herds " + container.describe(false) + " into your musky balls.";
  828. }
  829. function defaultGooBreastsPull(container, macro, verbose) {
  830. return "Your molten depths squeeze in around the " + container.describe(false) + " imprisoned in your breasts, drawing them into the viscous goo.";
  831. }
  832. function defaultGooBreastsPush(container, macro, verobse) {
  833. return "Your churning goo herds " + container.describe(false) + " into your breasts.";
  834. }
  835. function defaultGooTailPull(container, macro, verbose) {
  836. return "Your molten depths squeeze in around the " + container.describe(false) + " imprisoned in your " + macro.tailDesc + ", drawing them into the viscous goo.";
  837. }
  838. function defaultGooTailPush(container, macro, verobse) {
  839. return "Your churning goo herds " + container.describe(false) + " into your " + macro.tailDesc;
  840. }
  841. function defaultGooPawsPull(container, macro, verbose) {
  842. return "Your molten depths squeeze in around the " + container.describe(false) + " imprisoned in your " + macro.footOnlyDesc(true) + ", drawing them into the viscous goo.";
  843. }
  844. function defaultGooPawsPush(container, macro, verobse) {
  845. return "Your churning goo herds " + container.describe(false) + " into your " + macro.footOnlyDesc(true) + ".";
  846. }
  847. function defaultPawVore(container, macro, verbose) {
  848. return "Your " + macro.footOnlyDesc(true) + " smother over " + container.describe(false) + ", absorbing them into your soles!";
  849. }
  850. function defaultPawVoreToes(container, macro, verbose) {
  851. return "The " + container.describe(false) + " trapped between your toes " + (container.count > 1 ? "are" : "is") + " sucked inside.";
  852. }
  853. function defaultPaws(container, macro, verbose) {
  854. return "Your " + macro.footOnlyDesc(true) + " fully absorb " + container.describe(false) + ".";
  855. }
  856. function defaultCropSwallow(container, macro, verbose) {
  857. if (container.count == 0)
  858. return "You reach down for a delicious treat and grab - oh, nothing.";
  859. else
  860. return "You scoop up " + container.describe(verbose) + " and swallow " + (container.count > 1 ? "them" : "it") + " whole, pulling your prey into your crop.";
  861. }
  862. function defaultCropTransfer(container, macro, verbose) {
  863. if (container.count == 0)
  864. return "You have nothing in your crop";
  865. else
  866. return "Your throat squeezes, forcing " + container.describe(verbose) + " out of your crop and in to your stomach.";
  867. }
  868. function nonFatalBreath(container, macro, verbose, type, verb) {
  869. if (macro.breathStyle == "line") {
  870. return "You exhale a narrow gout of " + type + ", " + verb + " " + container.describe(verbose) + ".";
  871. } else if (macro.breathStyle == "cone") {
  872. return "You exhale a broad cone of " + type + ", " + verb + " " + container.describe(verbose) + ".";
  873. }
  874. }
  875. function defaultBreathFire(container, macro, verbose) {
  876. if (isNonFatal(macro)) {
  877. return nonFatalBreath(container, macro, verbose, "fire", "blasting");
  878. }
  879. if (isFatal(macro)) {
  880. if (macro.breathStyle == "line") {
  881. return "A withering spear of fire gouts from your maw, spearing through " + container.describe(verbose) + " and incinerating it in a torrid display of power.";
  882. } else if (macro.breathStyle == "cone") {
  883. return "You exhale a broad cone of powerful fire, burning " + container.describe(verbose) + " to a crisp in an inescapable tide of flames.";
  884. }
  885. }
  886. return "FIRE" + container.describe(verbose);
  887. }
  888. function defaultBreathIce(container, macro, verbose) {
  889. if (isNonFatal(macro)) {
  890. return nonFatalBreath(container, macro, verbose, "cold", "freezing");
  891. }
  892. if (isFatal(macro)) {
  893. if (macro.breathStyle == "line") {
  894. return "You heave a lance of frigid cold from your gullet, freezing " + container.describe(verbose) + " to the core.";
  895. } else if (macro.breathStyle == "cone") {
  896. return "A blizzard erupts from your maw, flash-freezing " + container.describe(verbose) + ". " + (container.count > 1 ? "They" : "It") + " shatters a heartbeat later, reduced to dust by your power.";
  897. }
  898. }
  899. return "ICE" + container.describe(verbose);
  900. }
  901. function defaultBreathElectric(container, macro, verbose) {
  902. if (isNonFatal(macro)) {
  903. return nonFatalBreath(container, macro, verbose, "electricity", "shocking");
  904. }
  905. if (isFatal(macro)) {
  906. if (macro.breathStyle == "line") {
  907. return "A blinding lance of lightning blasts from your spread " + macro.jawDesc(true) + ", cooking " + container.describe(verbose) + " from the inside out.";
  908. } else if (macro.breathStyle == "cone") {
  909. return "You exhale a brilliant, forking spray of lightning. The flickering bolts arc through " + container.describe(verbose) + ", cooking everything to a crisp.";
  910. }
  911. }
  912. return "ELECTRIC" + container.describe(verbose);
  913. }
  914. function defaultBreathSmoke(container, macro, verbose) {
  915. if (isNonFatal(macro)) {
  916. return nonFatalBreath(container, macro, verbose, "smoke", "smothering");
  917. }
  918. if (isFatal(macro)) {
  919. if (macro.breathStyle == "line") {
  920. return "You part your " + macro.jawDesc(true) + " a touch and blow, casting a thin gout of smoke that envelops " + container.describe(verbose) + ". Your prey is snuffed out like a candle.";
  921. } else if (macro.breathStyle == "cone") {
  922. return "You open wide and exhale. A rolling storm of smoke pours forth, smothering " + container.describe(verbose) + " in a pyroclastic flow.";
  923. }
  924. }
  925. return "SMOKE" + container.describe(verbose);
  926. }
  927. function defaultBreathRadiation(container, macro, verbose) {
  928. if (isNonFatal(macro)) {
  929. return nonFatalBreath(container, macro, verbose, "radiation", "frying");
  930. }
  931. if (isFatal(macro)) {
  932. if (macro.breathStyle == "line") {
  933. return "Your depths pour out a narrow beam of crackling green energy, striking " + container.describe(verbose) + " and frying it to a crisp, turning your prey to dust in the wind.";
  934. } else if (macro.breathStyle == "cone") {
  935. return "You part your " + macro.jawDesc(true) + ", roaring as a massive tide of radiation spews forth. It rolls over " + container.describe(verbose) + ", evaporating " + (container.count > 1 ? "them" : "it") + " in seconds.";
  936. }
  937. }
  938. return "RADIATION" + container.describe(verbose);
  939. }
  940. function defaultBreathFoul(container, macro, verbose) {
  941. if (isNonFatal(macro)) {
  942. return nonFatalBreath(container, macro, verbose, "foul air", "withering");
  943. }
  944. if (isFatal(macro)) {
  945. if (macro.breathStyle == "line") {
  946. return "You blow a narrow stream of breath, withering " + container.describe(verbose) + " in a focused torrent of foul, humid fumes.";
  947. } else if (macro.breathStyle == "cone") {
  948. return "You yawn wide and sigh, snuffing out " + container.describe(verbose) + " under a tide of hot, humid breath.";
  949. }
  950. }
  951. return "FOUL" + container.describe(verbose);
  952. }
  953. function defaultDrool(container, macro, verbose) {
  954. if (container.count == 0)
  955. return "$VOLUME of hot drool oozes from your " + macro.jawDesc(true) + ".";
  956. else if (isFatal(macro))
  957. return "A rain of slobber falls from your maw, inundating " + container.describe(verbose) + " in $VOLUME of slimy drool.";
  958. else
  959. return "$VOLUME of your drool rains down from your " + macro.jawDesc(true) + ", washing over " + container.describe(verbose) + ".";
  960. }
  961. // EATING
  962. rules["eat"].push({
  963. "test": function(container, macro) {
  964. return hasNothing(container);
  965. },
  966. "desc": function(container, macro, verbose) {
  967. return "You scoop up...nothing. Oh well.";
  968. }
  969. });
  970. rules["eat"].push({
  971. "test": function(container, macro) {
  972. return hasOnly(container, ["Person"]) &&
  973. hasLessThan(container, "Person", 6) &&
  974. macro.height >= 10;
  975. },
  976. "desc": function(container, macro, verbose) {
  977. return "You pluck up " + container.describe() + " and stuff them into your mouth, swallowing lightly to drag them down to your bubbling guts.";
  978. }
  979. });
  980. rules["eat"].push({
  981. "test": function(container, macro) {
  982. return hasOnly(container, ["Person"]) &&
  983. hasExactly(container, "Person", 1) &&
  984. macro.height < 10;
  985. },
  986. "desc": function(container, macro, verbose) {
  987. 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.";
  988. }
  989. });
  990. rules["eat"].push({
  991. "test": function(container, macro) {
  992. return hasOnly(container, ["Person","Car"]) &&
  993. hasExactly(container, "Car", 1) &&
  994. hasLessThan(container, "Person", 5);
  995. },
  996. "desc": function(container, macro, verbose) {
  997. return "You crush " + container.contents["Car"].describe() + " with your tight throat, washing it down with " + container.contents["Person"].describe();
  998. }
  999. });
  1000. rules["eat"].push({
  1001. "test": function(container, macro) {
  1002. return hasExactly(container, "Small Skyscraper", 1) &&
  1003. nothingLarger(container, "Small Skyscraper") &&
  1004. macro.height < 500;
  1005. },
  1006. "desc": function(container, macro, verbose) {
  1007. 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,\
  1008. and you suckle on it for a long moment before twisting your head to snap it loose. The entire building, along with " + describe_all(container.contents["Small Skyscraper"].contents, verbose) + "\
  1009. within, plunge into your roiling guts. You wash it down with some delicious treats you slurped up along with it - " + describe_all(container.contents, verbose, ["Small Skyscraper"]) + ".";
  1010. }
  1011. });
  1012. rules["eat"].push({
  1013. "test": function(container, macro) {
  1014. return hasExactly(container, "Small Skyscraper", 2) &&
  1015. nothingLarger(container, "Small Skyscraper") &&
  1016. macro.height < 750;
  1017. },
  1018. "desc": function(container, macro, verbose) {
  1019. 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,\
  1020. 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 \
  1021. 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 \
  1022. down your sultry throat. Your gut bubbles as " + describe_all(container.contents["Small Skyscraper"].contents, verbose) + " are crunched and crushed within, along with the \
  1023. " + describe_all(container.contents, verbose, ["Small Skyscraper"]) + " that were unfortunate enough to be caught up by your slimy tongue.";
  1024. }
  1025. });
  1026. // CHEWING
  1027. rules["chew"].push({
  1028. "test": function(container, macro) {
  1029. return hasOnly(container, ["Person"]) &&
  1030. hasExactly(container, "Person", 1) &&
  1031. isGory(macro) &&
  1032. macro.height < 5;
  1033. }, "desc": function(container, macro, verbose) {
  1034. 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 \
  1035. of meat, consuming them in a terrifying frenzy that ends with naught but bones lying on the ground.";
  1036. }
  1037. });
  1038. rules["chew"].push({
  1039. "test": function(container, macro) {
  1040. return hasOnly(container, ["Person"]) &&
  1041. hasExactly(container, "Person", 1) &&
  1042. isGory(macro) &&
  1043. macro.height >= 5;
  1044. }, "desc": function(container, macro, verbose) {
  1045. 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 \
  1046. 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 \
  1047. caught between two fingers and popped back in to be crunched between molars and swallowed.";
  1048. }
  1049. });
  1050. // STOMPING
  1051. rules["stomp"].push({
  1052. "test": function(container, macro) {
  1053. return hasOnly(container, ["Person"]) &&
  1054. hasExactly(container, "Person", 1) &&
  1055. isFatal(macro);
  1056. }, "desc": function(container, macro, verbose) {
  1057. return "Your heavy " + macro.footDesc() + " slams down on " + container.describe(verbose) + ", smashing the poor thing like an insect.";
  1058. }
  1059. });
  1060. rules["stomp"].push({
  1061. "test": function(container, macro) {
  1062. return hasOnly(container, ["Person"]) &&
  1063. hasExactly(container, "Person", 1) &&
  1064. isGory(macro);
  1065. }, "desc": function(container, macro, verbose) {
  1066. return "Your " + macro.footDesc() + " thumps " + container.describe(verbose) + ", shoving your victim to the ground and cracking them open like an egg.";
  1067. }
  1068. });
  1069. rules["stomp"].push({
  1070. "test": function(container, macro) {
  1071. return hasOnly(container, ["Person"]) &&
  1072. hasExactly(container, "Person", 1) &&
  1073. isGory(macro);
  1074. }, "desc": function(container, macro, verbose) {
  1075. 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.";
  1076. }
  1077. });
  1078. rules["stomp"].push({
  1079. "test": function(container, macro) {
  1080. return hasNothingElse(container, ["Person","Cow","Car"]) &&
  1081. isNonFatal(macro);
  1082. }, "desc": function(container, macro, verbose) {
  1083. return "Your " + macro.footDesc() + " smooshes over " + container.describe(verbose) + ". They stick to your " + macro.toeDesc(true) + ", carried along for the ride as you take another few steps before finally\
  1084. falling off.";
  1085. }
  1086. });
  1087. rules["stomp"].push({
  1088. "test": function(container, macro) {
  1089. return hasOnly(container, ["Person"]) &&
  1090. hasExactly(container, "Person", 1) &&
  1091. isFatal(macro);
  1092. }, "desc": function(container, macro, verbose) {
  1093. return "Your heavy " + macro.footDesc() + " slams down on " + container.describe(verbose) + ", smashing the poor thing like an insect.";
  1094. }
  1095. });
  1096. rules["stomp"].push({
  1097. "test": function(container, macro) {
  1098. return hasOnly(container, ["Bus"]) &&
  1099. hasExactly(container, "Bus", 1) &&
  1100. isFatal(macro);
  1101. }, "desc": function(container, macro, verbose) {
  1102. return "Your heavy " + macro.footDesc() + " slams down on " + container.describe(verbose) + ", smashing the poor thing like an insect.";
  1103. }
  1104. });
  1105. rules["stomp"].push({
  1106. "test": function(container, macro) {
  1107. return hasOnly(container, ["Person","Car", "Bus"]) &&
  1108. hasExactly(container, "Bus", 1) &&
  1109. hasLessThan(container, "Car", 10);
  1110. }, "desc": function(container, macro, verbose) {
  1111. return "You punt a " + container.contents["Bus"].describe(verbose) + ", sending it tumbling down the road into a " + describe_all(container.contents, verbose, ["Bus"]);
  1112. }
  1113. });
  1114. // ANAL VORE
  1115. rules["anal-vore"].push({
  1116. "test": function(container, macro) {
  1117. return hasExactly(container, "Person", 1) &&
  1118. hasOnly(container, ["Person"]);
  1119. }, "desc": function(container, macro, verbose) {
  1120. let adjective = ["musky","winding","churning"][Math.floor(Math.random()*3)];
  1121. 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," +
  1122. (macro.maleParts ? " grinding against your prostate" : "") + ". A powerful clench drags them deeper into your bowels, sealing them away in your " + adjective + " depths.";
  1123. }
  1124. });
  1125. rules["anal-vore"].push({
  1126. "test": function(container, macro) {
  1127. return hasExactly(container, "Car", 1) &&
  1128. hasOnly(container, ["Car"]);
  1129. }, "desc": function(container, macro, verbose) {
  1130. return "You ram " + container.describe(verbose) + " up your ass, biting your lip as it" + (macro.maleParts ? " rubs along your prostate" : " slides into velvety depths") + ".\
  1131. You moan and clench hard, yanking it in with a wet <i>shlrrp</i> and abruplty silencing its blaring horn.";
  1132. }
  1133. });
  1134. rules["anal-vore"].push({
  1135. "test": function(container, macro) {
  1136. return hasExactly(container, "Bus", 1) &&
  1137. hasOnly(container, ["Bus"]);
  1138. }, "desc": function(container, macro, verbose) {
  1139. 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. \
  1140. 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. \
  1141. Your ass claims " + container.describe(verbose) + ".";
  1142. }
  1143. });
  1144. rules["anal-vore"].push({
  1145. "test": function(container, macro) {
  1146. return hasExactly(container, "Train", 1) &&
  1147. hasOnly(container, ["Train"]);
  1148. }, "desc": function(container, macro, verbose) {
  1149. var cars = container.contents["Train"].contents["Train Car"].count;
  1150. 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.";
  1151. }
  1152. });
  1153. rules["anal-vore"].push({
  1154. "test": function(container, macro) {
  1155. return hasExactly(container, "Planet", 1) &&
  1156. hasOnly(container, ["Planet"]);
  1157. }, "desc": function(container, macro, verbose) {
  1158. return "Your enormous hands guide a planet towards your cheeks - pressing it firmly into your pucker with a dull, muffled <i>shlph</i>...and " + container.describe(verbose) + " sinks into your bowels, sealed away from the universe...";
  1159. }
  1160. });