diff --git a/game.js b/game.js index b251e5f..fd1c913 100644 --- a/game.js +++ b/game.js @@ -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); diff --git a/recursive-desc.js b/recursive-desc.js index b0516dd..065d309 100644 --- a/recursive-desc.js +++ b/recursive-desc.js @@ -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 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."; diff --git a/stroll.html b/stroll.html index a2e23a8..288b7fa 100644 --- a/stroll.html +++ b/stroll.html @@ -620,6 +620,14 @@ +
  • + + +
  • +
  • + + +