| @@ -281,6 +281,9 @@ let macro = | |||
| get tailMass() { | |||
| return this.tailVolume * this.tailDensity; | |||
| }, | |||
| get tailDesc() { | |||
| return this.tailType + " " + (this.tailCount > 1 ? "tails" : "tail"); | |||
| }, | |||
| "dickType": "canine", | |||
| "baseDickLength": 0.3, | |||
| "baseDickDiameter": 0.08, | |||
| @@ -462,6 +465,57 @@ let macro = | |||
| "stages": 3 | |||
| }, | |||
| "tail": { | |||
| "name" : "tail", | |||
| "setup": function(owner) { | |||
| this.owner = owner; | |||
| for (let i = 0; i < this.stages; i++) | |||
| this.contents.push(new Container()); | |||
| owner.digest(owner, this, owner.tailDigestTime); | |||
| }, | |||
| "feed": function(prey) { | |||
| this.feedFunc(prey,this,this.owner); | |||
| }, | |||
| "feedFunc": function(prey,self,owner) { | |||
| this.contents[0] = this.contents[0].merge(prey); | |||
| }, | |||
| "describeMove" : function(container) { | |||
| return describe("tail-to-stomach",container,this.owner,verbose); | |||
| }, | |||
| "describeDigestion" : function(container) { | |||
| return describe("tail",container,this.owner,verbose); | |||
| }, | |||
| "fill": function(owner,container) { | |||
| if (owner.gasEnabled) | |||
| owner.gasStorage.amount += container.sum_property("mass") * owner.gasDigestFactor / 1e3; | |||
| if (owner.scatEnabled) { | |||
| owner.scatStorage.amount += container.sum_property("mass") * owner.scatDigestFactor / 1e3; | |||
| owner.scatStorage.victims = owner.scatStorage.victims.merge(container); | |||
| } | |||
| }, | |||
| get description() { | |||
| let prey = new Container(); | |||
| this.contents.forEach(function(x) { | |||
| prey = prey.merge(x); | |||
| }); | |||
| if (prey.count == 0) { | |||
| return "Your " + this.owner.tailDesc + " are empty."; | |||
| } else { | |||
| if (this.owner.tailVoreToStomach) { | |||
| return "Your " + this.owner.tailDesc + " " + (this.owner.tailCount > 1 ? "clench and squeeze around " : "clenches and squeezes around ") + prey.describe(false) + ", working them deeper and deeper inside."; | |||
| } | |||
| else if (macro.brutality > 0) { | |||
| return "Your " + this.owner.tailDesc + " " + (this.owner.tailCount > 1 ? "groans" : "groan") + " ominously as " + (this.owner.tailCount > 1 ? "they gurgle" : "it gurgles" ) + " around " + prey.describe(false) + ", slowly absorbing them into your musky depths."; | |||
| } else { | |||
| return "Your " + this.owner.tailDesc + " " + (this.owner.tailCount > 1 ? "bulge" : "bulges") + " with " + prey.describe(false) + "."; | |||
| } | |||
| } | |||
| }, | |||
| "contents" : [], | |||
| "stages": 3 | |||
| }, | |||
| "bowels": { | |||
| "name" : "bowels", | |||
| "setup": function(owner) { | |||
| @@ -911,6 +965,7 @@ let macro = | |||
| "init": function() { | |||
| this.stomach.setup(this); | |||
| this.bowels.setup(this); | |||
| this.tail.setup(this); | |||
| this.womb.setup(this); | |||
| this.balls.setup(this); | |||
| this.breasts.setup(this); | |||
| @@ -930,6 +985,10 @@ let macro = | |||
| this.bowels.moves = this.stomach; | |||
| } | |||
| if (this.tailVoreToStomach) { | |||
| this.tail.moves = this.stomach; | |||
| } | |||
| if (this.maleParts) | |||
| this.fillCum(this); | |||
| if (this.femaleParts) | |||
| @@ -2601,6 +2660,8 @@ function tail_vore(count) | |||
| lines.push(linesummary); | |||
| lines.push(newline); | |||
| let people = get_living_prey(totalPrey.sum()); | |||
| let preyMass = totalPrey.sum_property("mass"); | |||
| @@ -2609,7 +2670,7 @@ function tail_vore(count) | |||
| macro.addGrowthPoints(preyMass); | |||
| macro.stomach.feed(totalPrey); | |||
| macro.tail.feed(totalPrey); | |||
| add_victim_people("tail-vore",totalPrey); | |||
| @@ -5,6 +5,10 @@ | |||
| var rules = {}; | |||
| var defaults = {}; | |||
| function plural(quantity, singular, plural) { | |||
| return quantity > 1 ? plural : singular; | |||
| } | |||
| function getDefault(name) { | |||
| let tokens = name.split("-"); | |||
| for (let i=0; i<tokens.length; i++) { | |||
| @@ -21,7 +25,7 @@ var actions = ["eat","chew","vomit","stomp","stomp-wedge","flex-toes","kick","an | |||
| "breast-vore","breast-milk","unbirth","sheath-stuff","sheath-clench","sheath-crush", | |||
| "sheath-absorb","cock-vore","cockslap","ball-smother","male-spurt","male-orgasm","female-spurt", | |||
| "female-orgasm","grind","pouch-stuff","pouch-rub","pouch-eat","pouch-absorb","soul-vore","soul-absorb-paw", | |||
| "paw-stench","ass-stench","piss-stench","scat-stench","belch","fart","stomach","womb","balls","bowels","bowels-to-stomach","breasts","bladder", | |||
| "paw-stench","ass-stench","piss-stench","scat-stench","belch","fart","stomach","tail","tail-to-stomach","womb","balls","bowels","bowels-to-stomach","breasts","bladder", | |||
| "soul-digest","wear-shoe","remove-shoe","wear-sock","remove-sock","stuff-shoe","dump-shoe","stuff-sock","dump-sock","piss","bladder-vore","scat", | |||
| "sheath-toy","slit-toy","breast-toy","melt","solidify","stomp-goo","goo-digest","ass-goo","goo-stomach-pull","goo-stomach-push", | |||
| "goo-bowels-pull","goo-bowels-push","goo-womb-pull","goo-womb-push","goo-balls-pull","goo-balls-push"]; | |||
| @@ -243,10 +247,10 @@ function defaultTailVore(container, macro, verbose) { | |||
| return "Your drooling tail swings to and fro"; | |||
| else if (isFatal(macro)) | |||
| return "Your tail lunges, maw agape, at " + container.describe(verbose) + | |||
| ". It scarfs down everything in seconds, gulping forcefully to drag your prey into your sloppy guts."; | |||
| ". It scarfs down everything in seconds, gulping forcefully to drag your prey into your sloppy confines."; | |||
| else | |||
| return "Your tail lunges, maw agape, at " + container.describe(verbose) + | |||
| ". It scarfs down everything in a second, gulping forcefully and pulling everything into your belly."; | |||
| ". It scarfs down everything in a second, gulping forcefully and pulling your prey inside."; | |||
| } | |||
| function defaultCleavageStuff(container, macro, verbose) { | |||
| @@ -598,6 +602,24 @@ function defaultStomach(container, macro, verbose) { | |||
| return "Your stomach groans and abosrbs " + container.describe(false) + "."; | |||
| } | |||
| function defaultTail(container, macro, verbose) { | |||
| if (isSadistic(macro)) | |||
| return "Your " + macro.tailDesc + " " + (macro.tailCount > 1 ? "clench" : "clenches") + ", crushing " + container.describe(false) + " into unrecognizable paste."; | |||
| else if (isGory(macro)) | |||
| return "Your fatal " + (macro.tailCount > 1 ? "tails crush " : "tail crushes ") + container.describe(false) + " to a gory pulp."; | |||
| else if (isFatal(macro)) | |||
| return "Your " + (macro.tailCount > 1 ? "tails gurgles as they digest " : "tail gurgles as it digests ") + container.describe(false) + "."; | |||
| else | |||
| return "Your " + (macro.tailCount > 1 ? "tails groan and absorb " : "tail groans and absorbs ") + container.describe(false) + "."; | |||
| } | |||
| function defaultTailToStomach(container, macro, verbose) { | |||
| if (isFatal(macro)) | |||
| return "Your " + (macro.tailCount > 1 ? "tails clench" : "tail clenches") + ", squeezing " + container.describe(false) + " into your gurgling stomach."; | |||
| else | |||
| return "Your " + (macro.tailCount > 1 ? "tails squeeze" : "tail squeezes") + " " + container.describe(false) + " into your belly."; | |||
| } | |||
| function defaultBowels(container, macro, verbose) { | |||
| if (isSadistic(macro)) | |||
| return "Your rancid bowels clench and churn, crushing " + container.describe(false) + " into a paste of gore and rubble - and then swiftly absorbing everything."; | |||
| @@ -620,6 +620,14 @@ | |||
| <label for="tailStretchiness">Tail stretchiness</label> | |||
| <input autocomplete="off" type="number" step="any" name="tailStretchiness" placeholder="1" /> | |||
| </li> | |||
| <li> | |||
| <label for="tailDigestTime">Digestion time (0 for manual)</label> | |||
| <input autocomplete="off" type="number" step="any" id="tailDigestTime" name="tailDigestTime" placeholder="15"> | |||
| </li> | |||
| <li> | |||
| <input autocomplete="off" type="checkbox" checked="true" name="tailVoreToStomach" id="tailVoreToStomach" /> | |||
| <label class="has-tooltip" for="tailVoreToStomach" title="Otherwise, tail(s) will digest/absorb">Tail vore goes to stomach</label> | |||
| </li> | |||
| </div> | |||
| </ul> | |||
| </div> | |||