| @@ -397,7 +397,7 @@ let macro = | |||
| }, | |||
| "digest": function(owner,organ) { | |||
| setTimeout(function() { owner.digest(owner,organ); }, 5000); | |||
| setTimeout(function() { owner.digest(owner,organ); }, 100); | |||
| let count = Math.min(organ.contents.length, organ.maxDigest); | |||
| @@ -464,7 +464,7 @@ let macro = | |||
| if (owner.gasEnabled) | |||
| owner.gasStorage.amount += container.sum_property("mass") * this.owner.gasDigestFactor / 1e4; | |||
| if (owner.scatEnabled) { | |||
| owner.scatStorage.amount += container.sum_property("mass") * this.owner.gasDigestFactor / 1e3; | |||
| owner.scatStorage.amount += container.sum_property("mass") * this.owner.scatDigestFactor / 1e3; | |||
| owner.scatStorage.victims = owner.scatStorage.victims.merge(container); | |||
| } | |||
| }, | |||
| @@ -512,7 +512,7 @@ let macro = | |||
| if (owner.gasEnabled) | |||
| owner.gasStorage.amount += container.sum_property("mass") * this.owner.gasDigestFactor / 1e3; | |||
| if (owner.scatEnabled) { | |||
| owner.scatStorage.amount += container.sum_property("mass") * this.owner.gasDigestFactor / 1e3; | |||
| owner.scatStorage.amount += container.sum_property("mass") * this.owner.scatDigestFactor / 1e3; | |||
| owner.scatStorage.victims = owner.scatStorage.victims.merge(container); | |||
| } | |||
| }, | |||
| @@ -658,6 +658,8 @@ let macro = | |||
| "stages" : 2 | |||
| }, | |||
| "pissDigestFactor": 1, | |||
| "bladder": { | |||
| "name" : "bladder", | |||
| "setup": function(owner) { | |||
| @@ -677,7 +679,7 @@ let macro = | |||
| }, | |||
| "fill": function(owner,container) { | |||
| if (macro.lactationEnabled) { | |||
| owner.pissStorage.amount += container.sum_property("mass") / 1e3; | |||
| owner.pissStorage.amount += container.sum_property("mass") * owner.pissDigestFactor / 1e3; | |||
| } | |||
| }, | |||
| get description() { | |||
| @@ -817,6 +819,20 @@ let macro = | |||
| } | |||
| }, | |||
| "paws": { | |||
| "name": "paws", | |||
| "container": new Container(), | |||
| get description() { | |||
| if (this.container.count == 0) | |||
| return "You don't have anyone stuck between your " + this.owner.toeDesc(true); | |||
| else | |||
| return "You have " + this.container.describe(false) + " wedged between your " + this.owner.toeDesc(true); | |||
| }, | |||
| "add": function(victims) { | |||
| this.container = this.container.merge(victims); | |||
| } | |||
| }, | |||
| "init": function() { | |||
| this.stomach.setup(this); | |||
| this.bowels.setup(this); | |||
| @@ -832,6 +848,8 @@ let macro = | |||
| this.pissStorage.owner = this; | |||
| this.scatStorage.owner = this; | |||
| this.paws.owner = this; | |||
| if (this.analVoreToStomach) { | |||
| this.bowels.moves = this.stomach; | |||
| } | |||
| @@ -901,7 +919,7 @@ let macro = | |||
| } else if (self.fartEnabled) { | |||
| fart(amount); | |||
| } | |||
| self.gasStorage.amount = self.gasStorage.limit*3/4; | |||
| } | |||
| setTimeout(function () { self.fillGas(self); }, 100); | |||
| update(); | |||
| @@ -929,6 +947,8 @@ let macro = | |||
| update(); | |||
| }, | |||
| "scatDigestFactor": 1, | |||
| // no actual filling, but it handles updates | |||
| "fillScat": function(self) { | |||
| if (self.scatStorage.amount > self.scatStorage.limit * 2) | |||
| @@ -1145,6 +1165,24 @@ let macro = | |||
| } | |||
| }, | |||
| get totalMass() { | |||
| let base = this.baseMass; | |||
| if (this.hasTail) { | |||
| base += this.tailMass * this.tailCount; | |||
| } | |||
| if (this.maleParts) { | |||
| base += this.dickMass; | |||
| base += this.ballMass * 2; | |||
| } | |||
| if (this.hasBreasts) { | |||
| base += this.breastMass * 2; | |||
| } | |||
| return base; | |||
| }, | |||
| get description() { | |||
| let result = []; | |||
| @@ -1212,6 +1250,11 @@ let macro = | |||
| result.push(line); | |||
| } | |||
| line = "Your two " + macro.footDesc(true) + " shake the earth."; | |||
| result.push(line); | |||
| return result; | |||
| }, | |||
| @@ -1609,11 +1652,55 @@ function stomp() | |||
| macro.arouse(5); | |||
| stomp_wedge(); | |||
| if (macro.stenchEnabled) { | |||
| paw_stench(); | |||
| } | |||
| } | |||
| function stomp_wedge() { | |||
| let area = 0; | |||
| if (!macro.footWear || (!macro.footSockWorn && !macro.footShoeWorn)) | |||
| area = macro.pawArea/10; | |||
| else if (macro.footShoeWorn) | |||
| area = macro.pawArea/25; | |||
| else | |||
| area = 0; | |||
| let prey = getPrey(biome, area, false); | |||
| if (prey.count == 0) | |||
| return; | |||
| let line = describe("stomp-wedge", prey, macro, verbose); | |||
| let linesummary = summarize(prey.sum(), false); | |||
| let people = get_living_prey(prey.sum()); | |||
| let sound = "Thump"; | |||
| if (people < 3) { | |||
| sound = "Thump!"; | |||
| } else if (people < 10) { | |||
| sound = "Squish!"; | |||
| } else if (people < 50) { | |||
| sound = "Crunch!"; | |||
| } else if (people < 500) { | |||
| sound = "CRUNCH!"; | |||
| } else if (people < 5000) { | |||
| sound = "CRRUUUNCH!!"; | |||
| } else { | |||
| sound = "Oh the humanity!"; | |||
| } | |||
| let preyMass = prey.sum_property("mass"); | |||
| add_victim_people("stomped",prey); | |||
| update([sound,line,linesummary,newline]); | |||
| } | |||
| function paw_stench() { | |||
| let area = macro.pawStenchArea; | |||
| @@ -2731,9 +2818,11 @@ function soul_absorb_paw() | |||
| function belch(vol) | |||
| { | |||
| if (vol == undefined) { | |||
| vol = macro.gasStorage.amount; | |||
| vol = Math.min(macro.gasStorage.amount,macro.gasStorage.limit/3); | |||
| } | |||
| macro.gasStorage.amount -= vol; | |||
| let area = Math.pow(vol, 2/3); | |||
| let prey = getPrey(biome, area); | |||
| @@ -2770,8 +2859,11 @@ function belch(vol) | |||
| function fart(vol) | |||
| { | |||
| if (vol == undefined) { | |||
| vol = macro.gasStorage.amount; | |||
| vol = Math.min(macro.gasStorage.amount,macro.gasStorage.limit/2); | |||
| } | |||
| macro.gasStorage.amount -= vol; | |||
| let area = Math.pow(vol, 2/3); | |||
| let prey = getPrey(biome, area); | |||
| @@ -3063,7 +3155,7 @@ function update(lines = []) | |||
| log.scrollTop = log.scrollHeight; | |||
| document.getElementById("height").innerHTML = "Height: " + transformNumbers(length(macro.height, unit)); | |||
| document.getElementById("mass").innerHTML = "Mass: " + transformNumbers(mass(macro.mass, unit)); | |||
| document.getElementById("mass").innerHTML = "Mass: " + transformNumbers(mass(macro.totalMass, unit)); | |||
| document.getElementById("arousal").innerHTML = "Arousal: " + round(macro.arousal,0) + "%"; | |||
| document.getElementById("edge").innerHTML = "Edge: " + round(macro.edge * 100,0) + "%"; | |||
| document.getElementById("cum").innerHTML = "Cum: " + transformNumbers(volume(macro.cumStorage.amount,unit,false)); | |||
| @@ -16,7 +16,7 @@ function getDefault(name) { | |||
| return window[funcName]; | |||
| } | |||
| var actions = ["eat","chew","stomp","kick","anal-vore","ass-crush","tail-slap","tail-vore", | |||
| var actions = ["eat","chew","stomp","stomp-wedge","kick","anal-vore","ass-crush","tail-slap","tail-vore", | |||
| "cleavage-stuff","cleavage-crush","cleavage-drop","cleavage-absorb","breast-crush", | |||
| "breast-vore","breast-milk","unbirth","sheath-stuff","sheath-squeeze","sheath-crush", | |||
| "sheath-absorb","cock-vore","cockslap","ball-smother","male-spurt","male-orgasm","female-spurt", | |||
| @@ -142,6 +142,18 @@ function defaultStomp(container, macro, verbose) { | |||
| return "You step on " + container.describe(verbose) + "."; | |||
| } | |||
| function defaultStompWedge(container, macro, verbose) { | |||
| if (container.count == 1) { | |||
| let line = container.describe(verbose); | |||
| line = line.charAt(0).toUpperCase() + line.slice(1); | |||
| return line + " is wedged between your " + macro.toeDesc(true); | |||
| } else { | |||
| let line = container.describe(verbose); | |||
| line = line.charAt(0).toUpperCase() + line.slice(1); | |||
| return line + " are wedged between your " + macro.toeDesc(true); | |||
| } | |||
| } | |||
| function defaultKick(container, macro, verbose) { | |||
| if (container.count == 0) | |||
| return "You swing your mighty " + macro.footDesc() + "..and hit nothing."; | |||
| @@ -354,7 +354,6 @@ function distribution(min, max, samples) { | |||
| } | |||
| } | |||
| return result; | |||
| } | |||
| @@ -511,7 +510,6 @@ function Person(count = 1) { | |||
| this.count = count; | |||
| this.contents = initContents(this.name,this.count); | |||
| this.describeOne = function (verbose=true) { | |||
| var body = random_desc(["skinny","fat","tall","short","stocky","spindly"], (verbose ? 0.6 : 0)); | |||
| var sex = random_desc(["male", "female"], (verbose ? 1 : 0)); | |||
| @@ -547,7 +545,6 @@ function Human(count = 1) { | |||
| this.count = count; | |||
| this.contents = initContents(this.name,this.count); | |||
| this.describeOne = function (verbose=true) { | |||
| var body = random_desc(["skinny","fat","tall","short","stocky","spindly"], (verbose ? 0.6 : 0)); | |||
| var sex = random_desc(["man", "woman"], 1); | |||
| @@ -581,7 +578,6 @@ function Cow(count = 1) { | |||
| this.count = count; | |||
| this.contents = initContents(this.name,this.count); | |||
| this.describeOne = function (verbose=true) { | |||
| var body = random_desc(["skinny","fat","tall","short","stocky","spindly"], (verbose ? 0.6 : 0)); | |||
| var sex = random_desc(["male", "female"], (verbose ? 1 : 0)); | |||
| @@ -614,9 +610,6 @@ function EmptyCar(count = 1) { | |||
| this.count = count; | |||
| this.contents = initContents(this.name,this.count); | |||
| this.describeOne = function(verbose=true) { | |||
| var color = random_desc(["black","black","gray","gray","blue","red","tan","white","white"]); | |||
| var adjective = random_desc(["rusty","brand-new"],0.3); | |||
| @@ -649,8 +642,6 @@ function Car(count = 1) { | |||
| this.count = count; | |||
| this.contents = initContents(this.name,this.count); | |||
| this.describeOne = function(verbose=true) { | |||
| var color = random_desc(["black","black","gray","gray","blue","red","tan","white","white"], (verbose ? 1 : 0)); | |||
| var adjective = random_desc(["rusty","brand-new"], (verbose ? 0.3 : 0)); | |||
| @@ -683,8 +674,6 @@ function Bus(count = 1) { | |||
| this.count = count; | |||
| this.contents = initContents(this.name,this.count); | |||
| this.describeOne = function(verbose=true) { | |||
| var adjective = random_desc(["rusty","brand-new"], (verbose ? 0.3 : 0)); | |||
| var color = random_desc(["black","tan","gray"], (verbose ? 1 : 0)); | |||
| @@ -717,8 +706,6 @@ function Tram(count = 1) { | |||
| this.count = count; | |||
| this.contents = initContents(this.name,this.count); | |||
| this.describeOne = function(verbose=true) { | |||
| var adjective = random_desc(["rusty","weathered"], (verbose ? 0.3 : 0)); | |||
| var color = random_desc(["blue","brown","gray"], (verbose ? 1 : 0)); | |||
| @@ -742,7 +729,6 @@ function Tram(count = 1) { | |||
| } | |||
| }; | |||
| this.anal_vore = function() { | |||
| return "You slide " + this.describe() + " up your tight ass"; | |||
| }; | |||
| @@ -792,8 +778,6 @@ function TrainCar(count = 1) { | |||
| this.count = count; | |||
| this.contents = initContents(this.name,this.count); | |||
| this.describeOne = function(verbose=true) { | |||
| var adjective = random_desc(["rusty","brand-new"], (verbose ? 0.3 : 0)); | |||
| var color = random_desc(["black","tan","gray"], (verbose ? 1 : 0)); | |||
| @@ -816,9 +800,6 @@ function House(count = 1) { | |||
| this.count = count; | |||
| this.contents = initContents(this.name,this.count); | |||
| this.describeOne = function(verbose=true) { | |||
| var size = random_desc(["little","two-story","large"], (verbose ? 0.5 : 0)); | |||
| var color = random_desc(["blue","white","gray","tan","green"], (verbose ? 0.5 : 0)); | |||
| @@ -849,10 +830,6 @@ function Barn(count = 1) { | |||
| this.count = count; | |||
| this.contents = initContents(this.name,this.count); | |||
| this.describeOne = function(verbose=true) { | |||
| var size = random_desc(["little","big","large"], (verbose ? 0.5 : 0)); | |||
| var color = random_desc(["blue","white","gray","tan","green"], (verbose ? 0.5 : 0)); | |||
| @@ -883,10 +860,6 @@ function SmallSkyscraper(count = 1) { | |||
| this.count = count; | |||
| this.contents = initContents(this.name,this.count); | |||
| this.describeOne = function(verbose=true) { | |||
| var color = random_desc(["blue","white","gray","tan","green"], (verbose ? 0.5 : 0)); | |||
| var name = random_desc(["skyscraper","office tower","office building"], 1); | |||
| @@ -917,10 +890,6 @@ function LargeSkyscraper(count = 1) { | |||
| this.count = count; | |||
| this.contents = initContents(this.name,this.count); | |||
| this.describeOne = function(verbose=true) { | |||
| var color = random_desc(["blue","white","gray","tan","green"], (verbose ? 0.5 : 0)); | |||
| var name = random_desc(["skyscraper","office tower","office building"], 1); | |||
| @@ -950,13 +919,6 @@ function ParkingGarage(count = 1) { | |||
| this.count = count; | |||
| this.contents = initContents(this.name,this.count); | |||
| this.describeOne = function(verbose=true) { | |||
| return "a parking garage"; | |||
| }; | |||
| @@ -976,18 +938,6 @@ function Town(count = 1) { | |||
| this.count = count; | |||
| this.contents = initContents(this.name,this.count); | |||
| this.describe = function(verbose = true) { | |||
| if (verbose) { | |||
| return (this.count == 1 ? "a town" : this.count + " towns") + " with " + describe_all(this.contents, verbose) + " in " + (this.count == 1 ? "it" : "them"); | |||
| @@ -1003,26 +953,6 @@ function City(count = 1) { | |||
| copy_defaults(this,new DefaultEntity()); | |||
| this.count = count; | |||
| this.contents = initContents(this.name,this.count); | |||
| this.describe = function(verbose = true) { | |||
| if (verbose) { | |||
| @@ -1040,18 +970,6 @@ function Continent(count = 1) { | |||
| this.count = count; | |||
| this.contents = initContents(this.name,this.count); | |||
| this.describe = function(verbose = true) { | |||
| if (verbose) { | |||
| return (this.count == 1 ? "a continent" : this.count + " continents") + " with " + describe_all(this.contents, verbose) + " on " + (this.count == 1 ? "it" : "them"); | |||
| @@ -1068,8 +986,6 @@ function Planet(count = 1) { | |||
| this.count = count; | |||
| this.contents = initContents(this.name,this.count); | |||
| this.describe = function(verbose = true) { | |||
| if (verbose) { | |||
| return (this.count == 1 ? "a planet" : this.count + " planets") + " with " + describe_all(this.contents, verbose) + " on " + (this.count == 1 ? "it" : "them"); | |||
| @@ -1098,10 +1014,6 @@ function SolarSystem(count = 1) { | |||
| this.count = count; | |||
| this.contents = initContents(this.name,this.count); | |||
| this.describe = function(verbose = true) { | |||
| if (verbose) { | |||
| return (this.count == 1 ? "a solar system" : this.count + " solar systems") + " made up of " + describe_all(this.contents, verbose); | |||
| @@ -1118,10 +1030,6 @@ function Galaxy(count = 1) { | |||
| this.count = count; | |||
| this.contents = initContents(this.name,this.count); | |||
| this.describe = function(verbose = true) { | |||
| if (verbose) { | |||
| return (this.count == 1 ? "a galaxy" : this.count + " galaxies") + " made up of " + describe_all(this.contents, verbose); | |||
| @@ -1150,8 +1058,6 @@ function Tank(count = 1) { | |||
| this.count = count; | |||
| this.contents = initContents(this.name,this.count); | |||
| this.describe = function(verbose = true) { | |||
| if (verbose) { | |||
| return (this.count == 1 ? "a tank" : this.count + " tanks") + " with " + describe_all(this.contents, verbose) + " trapped inside."; | |||
| @@ -1168,8 +1074,6 @@ function Artillery(count = 1) { | |||
| this.count = count; | |||
| this.contents = initContents(this.name,this.count); | |||
| this.describe = function(verbose = true) { | |||
| if (verbose) { | |||
| return (this.count == 1 ? "an artillery unit" : this.count + " artillery units") + " with " + describe_all(this.contents, verbose) + " trapped inside."; | |||
| @@ -1186,8 +1090,6 @@ function Helicopter(count = 1) { | |||
| this.count = count; | |||
| this.contents = initContents(this.name,this.count); | |||
| this.describe = function(verbose = true) { | |||
| if (verbose) { | |||
| return (this.count == 1 ? "a helicopter" : this.count + " helicopters") + " with " + describe_all(this.contents, verbose) + " riding inside."; | |||
| @@ -681,6 +681,10 @@ | |||
| <label for="urethraStretchiness">Urethra stretchiness</label> | |||
| <input type="number" step="any" id="urethraStretchiness" name="urethraStretchiness" placeholder="5" /> | |||
| </li> | |||
| <li> | |||
| <label for="pissDigestFactor">Piss digestion factor</label> | |||
| <input type="number" step="any" id="pissDigestFactor" name="pissDigestFactor" placeholder="1" /> | |||
| </li> | |||
| </div> | |||
| </ul> | |||
| </div> | |||
| @@ -694,6 +698,10 @@ | |||
| <li> | |||
| <div>note - setting tailhole diameter requires anal vore to be enabled</div> | |||
| </li> | |||
| <li> | |||
| <label for="scatDigestFactor">Scat digestion factor</label> | |||
| <input type="number" step="any" id="scatDigestFactor" name="scatDigestFactor" placeholder="1" /> | |||
| </li> | |||
| </div> | |||
| </div> | |||