var strolling = false; var maxStomachDigest = 10; var maxBowelsDigest = 10; var unit = "metric"; var numbers = "full"; var verbose = true; var biome = "suburb"; var newline = " "; victims = {}; var humanMode = true; var macro = { "scaling": function(value, scale, factor) { return value * Math.pow(scale,factor); }, "name": "", "species": "crux", "color" : "blue", "baseHeight": 2.26, get height() { return this.scaling(this.baseHeight, this.scale, 1); }, "baseMass": 135, get mass () { return this.scaling(this.baseMass, this.scale, 3); }, "basePawArea": 0.1, get pawArea() { return this.scaling(this.basePawArea, this.scale, 2); }, "baseAnalVoreArea": 0.1, get analVoreArea() { return this.scaling(this.baseAnalVoreArea, this.scale, 2); }, "baseAssArea": 0.4, get assArea() { return this.scaling(this.baseAssArea * this.assScale, this.scale, 2); }, "baseHandArea": 0.1, get handArea() { return this.scaling(this.baseHandArea, this.scale, 2); }, "assScale": 1, "hasTail": true, "tailType": "slinky", "tailCount": 1, "baseTailLength": 1, "baseTailDiameter": 0.1, "tailDensity": 250, "tailScale": 1, "tailMaw": false, get tailLength() { return this.scaling(this.baseTailLength * this.tailScale, this.scale, 1); }, get tailDiameter() { return this.scaling(this.baseTailDiameter * this.tailScale, this.scale, 1); }, get tailGirth() { return Math.pow(this.tailDiameter/2,2) * Math.PI; }, get tailArea() { return this.tailLength * this.tailDiameter; }, get tailVolume() { return this.tailGirth * this.tailLength; }, get tailMass() { return this.tailVolume * this.tailDensity; }, "dickType": "canine", "baseDickLength": 0.3, "baseDickDiameter": 0.08, "dickDensity": 1000, "dickScale": 1, get dickLength() { factor = 1; if (!this.arousalEnabled || this.arousal < 25) { factor = 0.5; } else if (this.arousal < 75) { factor = 0.5 + (this.arousal - 25) / 100; } return this.scaling(this.baseDickLength * this.dickScale * factor, this.scale, 1); }, get dickDiameter() { factor = 1; if (!this.arousalEnabled || this.arousal < 25) { factor = 0.5; } else if (this.arousal < 75) { factor = 0.5 + (this.arousal - 25) / 100; } return this.scaling(this.baseDickDiameter * this.dickScale * factor, this.scale, 1); }, get dickGirth() { return Math.pow((this.dickDiameter/ 2),2) * Math.PI; }, get dickArea() { return this.dickLength* this.dickDiameter* Math.PI / 2; }, get dickVolume() { return this.dickLength* Math.pow(this.dickDiameter2,2) * Math.PI; }, get dickMass() { return this.dickVolume* this.dickDensity; }, "baseBallDiameter": 0.05, "ballDensity": 1000, "ballScale": 1, get ballDiameter() { return this.scaling(this.baseBallDiameter * this.ballScale, this.scale, 1); }, get ballArea() { return 2 * Math.PI * Math.pow(this.ballDiameter/2, 2) }, get ballVolume() { var radius = this.ballDiameter / 2; return 4/3 * Math.PI * Math.pow(radius,3); }, get ballMass() { var volume = this.ballVolume; return volume * this.ballDensity; }, "baseCumRatio": 1, "cumScale": 1, get cumVolume() { return this.dickGirth * this.baseCumRatio * this.cumScale * (1 + this.edge) + Math.max(0,this.cumStorage.amount - this.cumStorage.limit); }, "baseVaginaLength": 0.1, "baseVaginaWidth": 0.05, "vaginaScale": 1, get vaginaLength() { return this.scaling(this.baseVaginaLength * this.vaginaScale, this.scale, 1); }, get vaginaWidth() { return this.scaling(this.baseVaginaWidth * this.vaginaScale, this.scale, 1); }, get vaginaArea() { return this.vaginaLength * this.vaginaWidth }, get vaginaVolume() { return this.vaginaArea * this.vaginaWidth }, "baseFemcumRatio": 1, "femcumScale": 1, get femcumVolume() { return this.vaginaArea * this.baseFemcumRatio * this.femcumScale * (1 + this.edge) + Math.max(0,this.femcumStorage.amount - this.femcumStorage.limit); }, hasBreasts: true, lactationEnabled: true, lactationScale: 1, lactationFactor: 0.25, get lactationVolume() { return this.milkStorage.limit * this.lactationFactor; }, "baseBreastDiameter": 0.1, "breastScale": 1, "breastDensity": 1000, get breastDiameter() { return this.scaling(this.baseBreastDiameter * this.breastScale, this.scale, 1); }, get breastArea() { return 2 * Math.PI * Math.pow(this.breastDiameter/2,2); }, get breastVolume() { var radius = this.breastDiameter / 2; return 4/3 * Math.PI * Math.pow(radius,3); }, get breastMass() { var volume = this.breastVolume; return volume * this.breastDensity; }, "digest": function(owner,organ) { var count = Math.min(organ.contents.length, organ.maxDigest); var container = new Container(); while (count > 0) { var victim = organ.contents.shift(); if (victim.name != "Container") victim = new Container([victim]); container = container.merge(victim); --count; } var digested = container.sum(); for (var key in victims[organ.name]) { if (victims[organ.name].hasOwnProperty(key) && digested.hasOwnProperty(key) ) { victims["digested"][key] += digested[key]; victims[organ.name][key] -= digested[key]; } } var line = organ.describeDigestion(container); organ.fill(this,container); var summary = summarize(container.sum()); if (organ.contents.length > 0) { setTimeout(function() { owner.digest(owner,organ) }, 15000); } update([line,summary,newline]); }, "stomach": { "name": "stomach", "feed": function(prey) { this.feedFunc(prey,this,this.owner); }, "feedFunc": function(prey,self,owner) { if (self.contents.length == 0) setTimeout(function() { owner.digest(owner,self) }, 15000); this.contents.push(prey); }, "describeDigestion": function(container) { return describe("stomach",container,this.owner,verbose); }, "fill": function(owner,container) { //no-op }, "contents": [], "maxDigest": 5 }, "bowels": { "name" : "bowels", "feed": function(prey) { this.feedFunc(prey,this,this.owner); }, "feedFunc": function(prey,self,owner) { if (self.contents.length == 0) setTimeout(function() { owner.digest(owner,self) }, 15000); this.contents.push(prey); }, "describeDigestion" : function(container) { return describe("bowels",container,this.owner,verbose); }, "fill": function(owner,container) { //no-op }, "contents" : [], "maxDigest" : 3 }, "womb": { "name" : "womb", "feed": function(prey) { this.feedFunc(prey,this,this.owner); }, "feedFunc": function(prey,self,owner) { if (self.contents.length == 0) setTimeout(function() { owner.digest(owner,self) }, 15000); this.contents.push(prey); }, "describeDigestion" : function(container) { return describe("womb",container,this.owner,verbose); }, "fill": function(owner,container) { owner.femcumStorage.amount += container.sum_property("mass") / 1e3; }, "contents" : [], "maxDigest" : 1 }, "balls": { "name" : "balls", "feed": function(prey) { this.feedFunc(prey,this,this.owner); }, "feedFunc": function(prey,self,owner) { if (self.contents.length == 0) setTimeout(function() { owner.digest(owner,self) }, 15000); this.contents.push(prey); }, "describeDigestion": function(container) { return describe("balls",container,this.owner,verbose); }, "fill": function(owner,container) { owner.cumStorage.amount += container.sum_property("mass") / 1e3; }, "contents" : [], "maxDigest" : 1 }, "init": function() { this.stomach.owner = this; this.bowels.owner = this; this.womb.owner = this; this.balls.owner = this; this.cumStorage.owner = this; this.femcumStorage.owner = this; this.milkStorage.owner = this; if (this.maleParts) this.fillCum(this); if (this.femaleParts) this.fillFemcum(this); if (this.lactationEnabled) this.fillBreasts(this); if (this.arousalEnabled) { this.quenchExcess(this); } }, "maleParts": true, "femaleParts": true, "fillCum": function(self) { self.cumStorage.amount += self.cumScale * self.ballVolume / 1200; if (self.cumStorage.amount > self.cumStorage.limit) self.arouse(1 * (self.cumStorage.amount / self.cumStorage.limit - 1)); setTimeout(function () { self.fillCum(self) }, 100); update(); }, "fillFemcum": function(self) { self.femcumStorage.amount += self.femcumScale * self.vaginaVolume / 1200; if (self.femcumStorage.amount > self.femcumStorage.limit) self.arouse(1 * (self.femcumStorage.amount / self.femcumStorage.limit - 1)); setTimeout(function () { self.fillFemcum(self) }, 100); update(); }, "fillBreasts": function(self) { self.milkStorage.amount += self.lactationScale * self.milkStorage.limit / 1200; if (self.milkStorage.amount > self.milkStorage.limit) self.milkStorage.amount = self.milkStorage.limit; setTimeout(function () { self.fillBreasts(self) }, 100); update(); }, "cumStorage": { "amount": 0, get limit() { return this.owner.ballVolume; } }, "femcumStorage": { "amount": 0, get limit() { return this.owner.vaginaVolume; } }, "milkStorage": { "amount": 0, get limit() { return this.owner.breastVolume * 2; } }, "orgasm": false, "afterglow": false, "arousalEnabled": true, "arousalFactor": 1, "arousal": 0, "edge": 0, "maleSpurt": 0, "femaleSpurt": 0, "arouse": function(amount) { if (!this.arousalEnabled) return; if (this.afterglow) return; this.arousal += amount * this.arousalFactor; if (this.arousal >= 200) { this.arousal = 200; if (!this.orgasm) { this.orgasm = true; update(["You shudder as ecstasy races up your spine",newline]); if (this.maleParts) { this.maleOrgasm(this); } if (this.femaleParts) { this.femaleOrgasm(this); } if (!this.maleParts && !this.femaleParts) { this.nullOrgasm(this); } } } }, "quench": function(amount) { if (!this.arousalEnabled) return; this.arousal -= amount; if (this.arousal <= 100) { if (this.orgasm) { this.orgasm = false; this.afterglow = true; } } if (this.arousal < 0) { this.arousal = 0; this.afterglow = false; } update(); }, "quenchExcess": function(self) { if (self.arousalEnabled) { if (self.arousal > 100 && !self.orgasm) { self.arousal = Math.max(100,self.arousal-1); self.edge += Math.sqrt((self.arousal - 100)) / 500; self.edge = Math.min(1,self.edge); self.edge = Math.max(0,self.edge - 0.002); if (self.maleParts) self.maleSpurt += ((self.arousal-100)/100 + Math.random()) / 25 * (self.edge); if (self.femaleParts) self.femaleSpurt += ((self.arousal-100)/100 + Math.random()) / 25 * (self.edge); if (self.maleSpurt > 1) { male_spurt(macro.cumVolume * (0.1 + Math.random() / 10)); self.maleSpurt = 0; } if (self.femaleSpurt > 1) { female_spurt(macro.femcumVolume * (0.1 + Math.random() / 10)); self.femaleSpurt = 0; } update(); } else if (self.afterglow) { self.quench(0.5); self.edge = Math.max(0,self.edge - 0.01); } } setTimeout(function() { self.quenchExcess(self); }, 200); }, "maleOrgasm": function(self) { if (!this.arousalEnabled) return; if (self.orgasm) { self.quench(10); var amount = Math.min(this.cumVolume, this.cumStorage.amount); this.cumStorage.amount -= amount; male_orgasm(amount); setTimeout(function() { self.maleOrgasm(self) }, 2000); } }, "femaleOrgasm": function(self) { if (!this.arousalEnabled) return; if (this.orgasm) { this.quench(10); var amount = Math.min(this.femcumVolume, this.femcumStorage.amount); this.femcumStorage.amount -= amount; female_orgasm(amount); setTimeout(function() { self.femaleOrgasm(self) }, 2000); } }, "nullOrgasm": function(self) { if (!this.arousalEnabled) return; if (this.orgasm) { this.quench(10); setTimeout(function() { self.nullOrgasm(self) }, 2000); } }, get description() { result = []; line = "You are " + (macro.name == "" ? "" : macro.name + ", ") + "a " + length(macro.height, unit, true) + " tall " + macro.species + ". You weigh " + mass(macro.mass, unit) + "."; result.push(line); if (this.hasTail) { line = "Your " + macro.describeTail + (macro.tailCount > 1 ? " tails sway as you walk," : "sways as you walk."); if (this.tailMaw) { line += (macro.tailCount > 1 ? "Their maws are drooling" : "Its maw is drooling"); } result.push(line); } if (this.arousalEnabled) { if (this.afterglow) { result.push("You're basking in the afterglow of a powerful orgasm."); } else if (this.orgasm) { result.push("You're cumming!"); } else if (this.arousal < 25) { } else if (this.arousal < 75) { result.push("You're feeling a little aroused."); } else if (this.arousal < 150) { result.push("You're feeling aroused."); } else if (this.arousal < 200) { result.push("You're on the edge of an orgasm!"); } } if (this.maleParts) { line = "Your " + this.describeDick + " cock hangs from your hips, with two " + mass(macro.ballMass, unit, true) + ", " + length(macro.ballDiameter, unit, true) + "-wide balls hanging beneath."; result.push(line); } if (this.femaleParts) { line = "Your glistening " + this.describeVagina + " slit peeks out from between your legs." result.push(line); } if (this.hasBreasts) { line = "You have two " + length(macro.breastDiameter, unit, true) + "-wide breasts that weigh " + mass(macro.breastMass, unit) + " apiece."; result.push(line); } return result; }, get describeTail() { return (this.tailCount > 1 ? this.tailCount + " " : "") + length(this.tailLength, unit, true) + "-long " + this.tailType; }, get describeDick() { state = ""; if (!this.arousalEnabled) { state = "limp"; } else if (this.orgasm) { state = "spurting"; } else { if (this.arousal < 25) { state = "limp"; } else if (this.arousal < 75) { state = "swelling"; } else if (this.arousal < 100) { state = "erect"; } else if (this.arousal < 150) { state = "erect, throbbing"; } else if (this.arousal < 200) { state = "erect, throbbing, pre-soaked"; } } return length(this.dickLength, unit, true) + " long " + state + " " + this.dickType; }, get describeVagina() { state = ""; if (!this.arousalEnabled) { state = "unassuming"; } else if (this.orgasm) { state = "gushing, quivering"; } else { if (this.arousal < 25) { state = "unassuming"; } else if (this.arousal < 75) { state = "moist"; } else if (this.arousal < 100) { state = "glistening"; } else if (this.arousal < 150) { state = "dripping"; } else if (this.arousal < 200) { state = "dripping, quivering"; } } return length(this.vaginaLength, unit, true) + " long " + state }, "growthPoints": 0, "addGrowthPoints": function(mass) { this.growthPoints += Math.round(50 * mass / (this.scale*this.scale)); }, // 0 = entirely non-fatal // 1 = fatal, but not specific // 2 = gory "brutality": 1, "scale": 1, } function look() { var desc = macro.description; var line2 = "" if (macro.height > 1e12) line2 = "You're pretty much everywhere at once."; else if (macro.height > 1e6) line2 = "You're standing...on pretty much everything at once."; else switch(biome) { case "rural": line2 = "You're standing amongst rural farmhouses and expansive ranches. Cattle are milling about at your feet."; break; case "suburb": line2 = "You're striding through the winding roads of a suburb."; break; case "city": line2 = "You're terrorizing the streets of a city. Heavy traffic, worsened by your rampage, is everywhere."; break; case "downtown": line2 = "You're lurking amongst the skyscrapers of downtown. The streets are packed, and the buildings are practically begging you to knock them over."; } desc = desc.concat([newline,line2,newline]); update(desc); } function get_living_prey(sum) { var total = 0; for (var key in sum) { if (sum.hasOwnProperty(key)) { if (key == "Person" || key == "Cow") total += sum[key]; } } return total; } function toggle_auto() { strolling = !strolling; document.getElementById("button-stroll").innerHTML = "Status: " + (strolling ? "Strolling" : "Standing"); if (strolling) update(["You start walking.",newline]); else update(["You stop walking.",newline]); } function change_location() { switch(biome) { case "suburb": biome = "city"; break; case "city": biome = "downtown"; break; case "downtown": biome = "rural"; break; case "rural": biome = "suburb"; break; } document.getElementById("button-location").innerHTML = "Location: " + biome.charAt(0).toUpperCase() + biome.slice(1); } function toggle_units() { switch(unit) { case "metric": unit = "customary"; break; case "customary": unit = "approx"; break; case "approx": unit = "metric"; break; } document.getElementById("button-units").innerHTML = "Units: " + unit.charAt(0).toUpperCase() + unit.slice(1); update(); } function toggle_numbers() { switch(numbers) { case "full": numbers="prefix"; break; case "prefix": numbers="words"; break; case "words": numbers = "scientific"; break; case "scientific": numbers = "full"; break; } document.getElementById("button-numbers").innerHTML = "Numbers: " + numbers.charAt(0).toUpperCase() + numbers.slice(1); update(); } function toggle_verbose() { verbose = !verbose; document.getElementById("button-verbose").innerHTML = (verbose ? "Verbose" : "Simple"); } function toggle_arousal() { macro.arousalEnabled = !macro.arousalEnabled; document.getElementById("button-arousal").innerHTML = (macro.arousalEnabled ? "Arousal On" : "Arousal Off"); if (macro.arousalEnabled) { document.getElementById("arousal").style.display = "block"; document.getElementById("edge").style.display = "block"; } else { document.getElementById("arousal").style.display = "none"; document.getElementById("edge").style.display = "none"; } macro.orgasm = false; macro.afterglow = false; } function initVictims() { return { "Person": 0, "Cow": 0, "Car": 0, "Bus": 0, "Tram": 0, "Motorcycle": 0, "House": 0, "Barn": 0, "Small Skyscraper": 0, "Large Skyscraper": 0, "Train": 0, "Train Car": 0, "Parking Garage": 0, "Overpass": 0, "Town": 0, "City": 0, "Continent": 0, "Planet": 0, "Star": 0, "Solar System": 0, "Galaxy": 0 }; }; // lists out total people function summarize(sum, fatal = true) { var word; var count = get_living_prey(sum); if (fatal && macro.brutality > 0) word = count > 1 ? "kills" : "kill"; else if (!fatal && macro.brutality > 0) word = "prey"; else word = count > 1 ? "victims" : "victim"; return "(" + count + " " + word + ")"; } function getOnePrey(biome,area) { var potential = ["Person"]; if (macro.height > 1e12) potential = ["Planet","Star","Solar System","Galaxy"]; else if (macro.height > 1e6) potential = ["Town","City","Continent","Planet"]; else switch(biome) { case "suburb": potential = ["Person", "Car", "Bus", "Train", "House"]; break; case "city": potential = ["Person", "Car", "Bus", "Train", "Tram", "House", "Parking Garage"]; break; case "downtown": potential = ["Person", "Car", "Bus", "Tram", "Small Skyscraper", "Large Skyscraper", "Parking Garage"]; break; case "rural": potential = ["Person", "Barn", "House", "Cow"]; break; } var potAreas = [] potential.forEach(function (x) { potAreas.push([x,areas[x]]); }); potAreas = potAreas.sort(function (x,y) { return y[1] - x[1]; }); for (var i=0; i 1e12) { weights = { "Planet": 1.47e-10, "Star": 1.7713746e-12, "Solar System": 4e-10, "Galaxy": 0.1, } } else if (macro.height > 1e6) { weights = { "Town": 0.1, "City": 0.05, "Continent": 0.005, "Planet": 0.0001 } } else { switch(region) { case "rural": weights = { "Person": 0.05, "House": 0.01, "Barn": 0.01, "Cow": 0.2 }; break; case "suburb": weights = { "Person": 0.5, "House": 0.5, "Car": 0.2, "Train": 0.1, "Bus": 0.1 }; break; case "city": weights = { "Person": 0.5, "House": 0.2, "Car": 0.2, "Train": 0.1, "Bus": 0.1, "Tram": 0.1, "Parking Garage": 0.02 }; break; case "downtown": weights = { "Person": 0.5, "Car": 0.3, "Bus": 0.15, "Tram": 0.1, "Parking Garage": 0.02, "Small Skyscraper": 0.4, "Large Skyscraper": 0.1 }; break; } } return fill_area(area,weights); } function updateVictims(type,prey) { var sums = prey.sum(); for (var key in sums) { if (sums.hasOwnProperty(key)) { victims[type][key] += sums[key]; } } } function feed() { var area = macro.handArea; var prey = getPrey(biome, area); var line = describe("eat", prey, macro, verbose) var linesummary = summarize(prey.sum(), false); var people = get_living_prey(prey.sum()); var sound = ""; if (people == 0) { sound = ""; } else if (people < 3) { sound = "Ulp."; } else if (people < 10) { sound = "Gulp."; } else if (people < 50) { sound = "Glrrp."; } else if (people < 500) { sound = "Glrrrpkh!"; } else if (people < 5000) { sound = "GLRRKPKH!"; } else { sound = "Oh the humanity!"; } var preyMass = prey.sum_property("mass"); macro.addGrowthPoints(preyMass); macro.stomach.feed(prey); macro.arouse(5); updateVictims("stomach",prey); update([sound,line,linesummary,newline]); } function chew() { var area = macro.handArea; var prey = getPrey(biome, area); var line = describe("chew", prey, macro, verbose) var linesummary = summarize(prey.sum(), false); var people = get_living_prey(prey.sum()); var sound = ""; if (people == 0) { sound = ""; } else if (people < 3) { sound = "Snap."; } else if (people < 10) { sound = "Crunch."; } else if (people < 50) { sound = "Crack!"; } else if (people < 500) { sound = "CRUNCH!"; } else if (people < 5000) { sound = "CRRRUNCH!"; } else { sound = "Oh the humanity!"; } var preyMass = prey.sum_property("mass"); macro.addGrowthPoints(preyMass); macro.arouse(10); updateVictims("digested",prey); update([sound,line,linesummary,newline]); } function stomp() { var area = macro.pawArea; var prey = getPrey(biome, area); var line = describe("stomp", prey, macro, verbose) var linesummary = summarize(prey.sum(), true); var people = get_living_prey(prey.sum()); var 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!"; } var preyMass = prey.sum_property("mass"); macro.addGrowthPoints(preyMass); macro.arouse(5); updateVictims("stomped",prey); update([sound,line,linesummary,newline]); } function grind() { var area = macro.assArea / 2; if (macro.maleParts) area += macro.dickArea if (macro.femalePartS) area += macro.vaginaArea; var prey = getPrey(biome,area); var line = describe("grind", prey, macro, verbose); var linesummary = summarize(prey.sum(), true); var people = get_living_prey(prey.sum()); var sound = ""; if (people < 3) { sound = "Thump."; } else if (people < 10) { sound = "Crunch."; } else if (people < 50) { sound = "Crrrrunch."; } else if (people < 500) { sound = "SMASH!"; } else if (people < 5000) { sound = "CCCRASH!!"; } else { sound = "Oh the humanity!"; } var preyMass = prey.sum_property("mass"); macro.addGrowthPoints(preyMass); macro.arouse(20); updateVictims("ground",prey); update([sound,line,linesummary,newline]); } function anal_vore() { var area = macro.analVoreArea; var prey = getOnePrey(biome,area); area = macro.assArea; var crushed = getPrey(biome,area); var line1 = describe("anal-vore", prey, macro, verbose); var line1summary = summarize(prey.sum(), false); var line2 = describe("ass-crush", crushed, macro, verbose); var line2summary = summarize(crushed.sum(), true); var people = get_living_prey(prey.sum()); var sound = "Shlp"; if (people < 3) { sound = "Shlp."; } else if (people < 10) { sound = "Squelch."; } else if (people < 50) { sound = "Shlurrp."; } else if (people < 500) { sound = "SHLRP!"; } else if (people < 5000) { sound = "SQLCH!!"; } else { sound = "Oh the humanity!"; } var people = get_living_prey(crushed.sum()); var sound2 = "Thump"; if (people < 3) { sound2 = "Thump!"; } else if (people < 10) { sound2 = "Squish!"; } else if (people < 50) { sound2 = "Crunch!"; } else if (people < 500) { sound2 = "CRUNCH!"; } else if (people < 5000) { sound2 = "CRRUUUNCH!!"; } else { sound2 = "Oh the humanity!"; } var preyMass = prey.sum_property("mass"); var crushedMass = prey.sum_property("mass"); macro.addGrowthPoints(preyMass); macro.addGrowthPoints(crushedMass); macro.bowels.feed(prey); macro.arouse(10); updateVictims("bowels",prey); updateVictims("stomped",crushed); update([sound,line1,line1summary,newline,sound2,line2,line2summary,newline]); } function breast_crush() { var area = macro.breastArea; var prey = getPrey(biome, area); var line = describe("breast-crush", prey, macro, verbose); var linesummary = summarize(prey.sum(), true); var people = get_living_prey(prey.sum()); var 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!"; } var preyMass = prey.sum_property("mass"); macro.addGrowthPoints(preyMass); macro.arouse(10); updateVictims("breasts",prey); update([sound,line,linesummary,newline]); if (macro.lactationEnabled && macro.milkStorage.amount / macro.milkStorage.limit > 0.5) { var amount = Math.min(macro.lactationVolume, (macro.milkStorage.amount / macro.milkStorage.limit - 0.5) * macro.milkStorage.limit); milk_breasts(null, amount); } } function milk_breasts(e,vol) { if (vol == undefined) { var vol = Math.min(macro.lactationVolume, macro.milkStorage.amount); } macro.milkStorage.amount -= vol; var area = Math.pow(vol, 2/3); var prey = getPrey(biome, area); var line = describe("breast-milk", prey, macro, verbose).replace("$VOLUME",volume(vol,unit,false)) var linesummary = summarize(prey.sum(), true); var people = get_living_prey(prey.sum()); var sound = "Dribble."; if (people < 3) { sound = "Dribble."; } else if (people < 10) { sound = "Splash."; } else if (people < 50) { sound = "Splash!"; } else if (people < 500) { sound = "SPLOOSH!"; } else if (people < 5000) { sound = "SPLOOOOOOOOOOSH!!"; } else { sound = "Oh the humanity!"; } var preyMass = prey.sum_property("mass"); macro.addGrowthPoints(preyMass); updateVictims("flooded",prey); update([sound,line,linesummary,newline]); } function unbirth() { var area = macro.vaginaArea; var prey = getPrey(biome, area); var line = describe("unbirth", prey, macro, verbose) var linesummary = summarize(prey.sum(), false); var people = get_living_prey(prey.sum()); var sound = ""; if (people < 3) { sound = "Shlp."; } else if (people < 10) { sound = "Squelch."; } else if (people < 50) { sound = "Shlurrp."; } else if (people < 500) { sound = "SHLRP!"; } else if (people < 5000) { sound = "SQLCH!!"; } else { sound = "Oh the humanity!"; } var preyMass = prey.sum_property("mass"); macro.addGrowthPoints(preyMass); macro.womb.feed(prey); macro.arouse(20); updateVictims("womb",prey); update([sound,line,linesummary,newline]); } function cockslap() { var area = macro.dickArea; var prey = getPrey(biome, area); var line = describe("cockslap", prey, macro, verbose) var linesummary = summarize(prey.sum(), true); var people = get_living_prey(prey.sum()); var 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!"; } var preyMass = prey.sum_property("mass"); macro.addGrowthPoints(preyMass); macro.arouse(15); updateVictims("cock",prey); update([sound,line,linesummary,newline]); } function cock_vore() { var area = macro.dickGirth; var prey = getPrey(biome, area); var line = describe("cock-vore", prey, macro, verbose) var linesummary = summarize(prey.sum(), false); var people = get_living_prey(prey.sum()); var sound = "lp"; if (people < 3) { sound = "Shlp."; } else if (people < 10) { sound = "Squelch."; } else if (people < 50) { sound = "Shlurrp."; } else if (people < 500) { sound = "SHLRP!"; } else if (people < 5000) { sound = "SQLCH!!"; } else { sound = "Oh the humanity!"; } var preyMass = prey.sum_property("mass"); macro.addGrowthPoints(preyMass); macro.balls.feed(prey); macro.arouse(20); updateVictims("balls",prey); update([sound,line,linesummary,newline]); } function ball_smother() { var area = macro.ballArea * 2; var prey = getPrey(biome, area); var line = describe("ball-smother", prey, macro, verbose) var linesummary = summarize(prey.sum(), true); var people = get_living_prey(prey.sum()); var sound = "Thump"; if (people < 3) { sound = "Thump!"; } else if (people < 10) { sound = "Squish!"; } else if (people < 50) { sound = "Smoosh!"; } else if (people < 500) { sound = "SMOOSH!"; } else if (people < 5000) { sound = "SMOOOOOSH!!"; } else { sound = "Oh the humanity!"; } var preyMass = prey.sum_property("mass"); macro.addGrowthPoints(preyMass); macro.arouse(10); updateVictims("balls",prey); update([sound,line,linesummary,newline]); } function male_spurt(vol) { var area = Math.pow(vol, 2/3); var prey = getPrey(biome, area); var line = describe("male-spurt", prey, macro, verbose).replace("$VOLUME",volume(vol,unit,false)) var linesummary = summarize(prey.sum(), true); var people = get_living_prey(prey.sum()); var sound = "Spurt!"; if (people < 3) { sound = "Spurt!"; } else if (people < 10) { sound = "Sploosh!"; } else if (people < 50) { sound = "Sploooooosh!"; } else if (people < 500) { sound = "SPLOOSH!"; } else if (people < 5000) { sound = "SPLOOOOOOOOOOSH!!"; } else { sound = "Oh the humanity!"; } var preyMass = prey.sum_property("mass"); macro.addGrowthPoints(preyMass); updateVictims("splooged",prey); update([sound,line,linesummary,newline]); } function male_orgasm(vol) { var area = Math.pow(vol, 2/3); var prey = getPrey(biome, area); var line = describe("male-orgasm", prey, macro, verbose).replace("$VOLUME",volume(vol,unit,false)) var linesummary = summarize(prey.sum(), true); var people = get_living_prey(prey.sum()); var sound = "Spurt!"; if (people < 3) { sound = "Spurt!"; } else if (people < 10) { sound = "Sploosh!"; } else if (people < 50) { sound = "Sploooooosh!"; } else if (people < 500) { sound = "SPLOOSH!"; } else if (people < 5000) { sound = "SPLOOOOOOOOOOSH!!"; } else { sound = "Oh the humanity!"; } var preyMass = prey.sum_property("mass"); macro.addGrowthPoints(preyMass); updateVictims("splooged",prey); update([sound,line,linesummary,newline]); } function female_spurt(vol) { var area = Math.pow(vol, 2/3); var prey = getPrey(biome, area); var line = describe("female-spurt", prey, macro, verbose).replace("$VOLUME",volume(vol,unit,false)) var linesummary = summarize(prey.sum(), true); var people = get_living_prey(prey.sum()); var sound = "Spurt!"; if (people < 3) { sound = "Spurt!"; } else if (people < 10) { sound = "Sploosh!"; } else if (people < 50) { sound = "Sploooooosh!"; } else if (people < 500) { sound = "SPLOOSH!"; } else if (people < 5000) { sound = "SPLOOOOOOOOOOSH!!"; } else { sound = "Oh the humanity!"; } var preyMass = prey.sum_property("mass"); macro.addGrowthPoints(preyMass); updateVictims("splooged",prey); update([sound,line,linesummary,newline]); } function female_orgasm(vol) { var area = Math.pow(vol, 2/3); var prey = getPrey(biome, area); var line = describe("female-orgasm", prey, macro, verbose).replace("$VOLUME",volume(vol,unit,false)); var linesummary = summarize(prey.sum(), true); var people = get_living_prey(prey.sum()); var sound = "Spurt!"; if (people < 3) { sound = "Spurt!"; } else if (people < 10) { sound = "Sploosh!"; } else if (people < 50) { sound = "Sploooooosh!"; } else if (people < 500) { sound = "SPLOOSH!"; } else if (people < 5000) { sound = "SPLOOOOOOOOOOSH!!"; } else { sound = "Oh the humanity!"; } var preyMass = prey.sum_property("mass"); macro.addGrowthPoints(preyMass); updateVictims("splooged",prey); update([sound,line,linesummary,newline]); } function tail_slap() { var area = macro.tailArea * macro.tailCount; var prey = getPrey(biome, area); var line = describe("tail-slap", prey, macro, verbose) var linesummary = summarize(prey.sum(), true); var people = get_living_prey(prey.sum()); var 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!"; } var preyMass = prey.sum_property("mass"); macro.addGrowthPoints(preyMass); macro.arouse(5); updateVictims("tailslapped",prey); update([sound,line,linesummary,newline]); } function tail_vore() { var area = macro.tailGirth * macro.tailCount; var prey = getPrey(biome, area); var line = describe("tail-vore", prey, macro, verbose) var linesummary = summarize(prey.sum(), false); var people = get_living_prey(prey.sum()); var sound = ""; if (people == 0) { sound = ""; } else if (people < 3) { sound = "Ulp."; } else if (people < 10) { sound = "Gulp."; } else if (people < 50) { sound = "Glrrp."; } else if (people < 500) { sound = "Glrrrpkh!"; } else if (people < 5000) { sound = "GLRRKPKH!"; } else { sound = "Oh the humanity!"; } var preyMass = prey.sum_property("mass"); macro.addGrowthPoints(preyMass); macro.arouse(5); macro.stomach.feed(prey); updateVictims("tailmaw'd",prey); update([sound,line,linesummary,newline]); } function transformNumbers(line) { return line.toString().replace(/[0-9]+(\.[0-9]+)?(e\+[0-9]+)?/g, function(text) { return number(text, numbers); }); } function update(lines = []) { var log = document.getElementById("log"); lines.forEach(function (x) { var line = document.createElement('div'); line.innerHTML = transformNumbers(x); log.appendChild(line); }); if (lines.length > 0) 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("growth-points").innerHTML = "Growth Points:" + macro.growthPoints; 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)) document.getElementById("cumPercent").innerHTML = Math.round(macro.cumStorage.amount / macro.cumStorage.limit * 100) + "%"; document.getElementById("femcum").innerHTML = "Femcum: " + transformNumbers(volume(macro.femcumStorage.amount,unit,false)); document.getElementById("femcumPercent").innerHTML = Math.round(macro.femcumStorage.amount / macro.femcumStorage.limit * 100) + "%"; document.getElementById("milk").innerHTML = "Milk: " + transformNumbers(volume(macro.milkStorage.amount,unit,false)); document.getElementById("milkPercent").innerHTML = Math.round(macro.milkStorage.amount / macro.milkStorage.limit * 100) + "%"; for (var type in victims) { if (victims.hasOwnProperty(type)) { for (var key in victims[type]){ if (victims[type].hasOwnProperty(key) && victims[type][key] > 0) { document.getElementById("stat-" + key).style.display = "table-row"; document.getElementById("stat-" + type + "-" + key).innerHTML = number(victims[type][key],numbers); } } } } } function pick_move() { if (!strolling) { setTimeout(pick_move, 1500 * Math.sqrt(macro.scale)); return; } var choice = Math.random(); if (choice < 0.2) { anal_vore(); } else if (choice < 0.6) { stomp(); } else { feed(); } setTimeout(pick_move, 1500 * Math.sqrt(macro.scale)); } function grow_pick(times) { if (document.getElementById("part-body").checked == true) { grow(times); } else if (document.getElementById("part-ass").checked == true) { grow_ass(times); } else if (document.getElementById("part-dick").checked == true) { grow_dick(times); } else if (document.getElementById("part-balls").checked == true) { grow_balls(times); } else if (document.getElementById("part-breasts").checked == true) { grow_breasts(times); } else if (document.getElementById("part-vagina").checked == true) { grow_vagina(times); } } function grow(times=1) { if (macro.growthPoints < 100 * times) { update(["You don't feel like growing right now."]); return; } macro.growthPoints -= 100 * times; var oldHeight = macro.height; var oldMass = macro.mass; macro.scale *= Math.pow(1.02,times); var newHeight = macro.height; var newMass = macro.mass; var heightDelta = newHeight - oldHeight; var massDelta = newMass - oldMass; var heightStr = length(heightDelta, unit); var massStr = mass(massDelta, unit); update(["Power surges through you as you grow " + heightStr + " taller and gain " + massStr + " of mass",newline]); } function grow_dick(times=1) { if (macro.growthPoints < 10 * times) { update(["You don't feel like growing right now."]); return; } macro.growthPoints -= 10 * times; var oldLength = macro.dickLength; var oldMass = macro.dickMass; macro.dickScale = Math.pow(macro.dickScale * macro.dickScale + 1.02*times, 1/2) ; var lengthDelta = macro.dickLength - oldLength; var massDelta = macro.dickMass - oldMass; update(["Power surges through you as your " + macro.dickType + " cock grows " + length(lengthDelta, unit, false) + " longer and gains " + mass(massDelta, unit, false) + " of mass",newline]); } function grow_balls(times=1) { if (macro.growthPoints < 10 * times) { update(["You don't feel like growing right now."]); return; } macro.growthPoints -= 10 * times; var oldDiameter = macro.ballDiameter; var oldMass = macro.ballMass; macro.ballScale = Math.pow(macro.ballScale * macro.ballScale + 1.02*times, 1/2) ; var diameterDelta = macro.ballDiameter - oldDiameter; var massDelta = macro.ballMass - oldMass; update(["Power surges through you as your balls swell by " + length(diameterDelta, unit, false) + ", gaining " + mass(massDelta, unit, false) + " of mass apiece",newline]); } function grow_breasts(times=1) { if (macro.growthPoints < 10 * times) { update(["You don't feel like growing right now."]); return; } macro.growthPoints -= 10 * times; var oldDiameter = macro.breastDiameter; var oldMass = macro.breastMass; macro.breastScale = Math.pow(macro.breastScale * macro.breastScale + 1.02*times, 1/2) ; var diameterDelta = macro.breastDiameter - oldDiameter; var massDelta = macro.breastMass - oldMass; update(["Power surges through you as your breasts swell by " + length(diameterDelta, unit, false) + ", gaining " + mass(massDelta, unit, false) + " of mass apiece",newline]); } function grow_vagina(times=1) { if (macro.growthPoints < 10 * times) { update(["You don't feel like growing right now."]); return; } macro.growthPoints -= 10 * times; var oldLength = macro.vaginaLength; macro.vaginaScale = Math.pow(macro.vaginaScale * macro.vaginaScale + 1.02*times, 1/2) ; var lengthDelta = macro.vaginaLength - oldLength; update(["Power surges through you as your moist slit expands by by " + length(lengthDelta, unit, false),newline]); } function grow_ass(times=1) { if (macro.growthPoints < 10 * times) { update(["You don't feel like growing right now."]); return; } macro.growthPoints -= 10 * times; var oldDiameter = Math.pow(macro.assArea,1/2); macro.assScale = Math.pow(macro.assScale * macro.assScale + 1.02*times, 1/2) ; var diameterDelta = Math.pow(macro.assArea,1/2) - oldDiameter; update(["Power surges through you as your ass swells by " + length(diameterDelta, unit, false),newline]); } function grow_lots() { var oldHeight = macro.height; var oldMass = macro.mass; macro.scale *= 100; var newHeight = macro.height; var newMass = macro.mass; var heightDelta = newHeight - oldHeight; var massDelta = newMass - oldMass; var heightStr = length(heightDelta, unit); var massStr = mass(massDelta, unit); update(["Power surges through you as you grow " + heightStr + " taller and gain " + massStr + " of mass",newline]); } function preset(name) { switch(name){ case "Fen": macro.species = "crux"; macro.baseHeight = 2.2606; macro.baseMass = 124.738; break; case "Renard": macro.species = "fox"; macro.baseHeight = 1.549; macro.baseMass = 83.9; case "Vulpes": macro.species = "fox"; macro.baseHeight = 20000; macro.baseMass = 180591661866272; } } function saveSettings() { storage = window.localStorage; settings = {}; form = document.forms.namedItem("custom-species-form"); for (var i=0; i 0) { victimTypes = victimTypes.concat(["tailslapped"]); if (macro.tailMaw) { victimTypes = victimTypes.concat(["tailmaw'd"]); } else { document.getElementById("button-tail_vore").style.display = 'none'; } } else { document.getElementById("button-tail_slap").style.display = 'none'; document.getElementById("button-tail_vore").style.display = 'none'; } if (macro.maleParts) { victimTypes = victimTypes.concat(["cock","balls"]); } else { document.getElementById("button-cockslap").style.display = 'none'; document.getElementById("button-cock_vore").style.display = 'none'; document.getElementById("button-ball_smother").style.display = 'none'; document.getElementById("cum").style.display = 'none'; document.getElementById("cumPercent").style.display = 'none'; document.querySelector("#part-balls+label").style.display = 'none'; document.querySelector("#part-dick+label").style.display = 'none'; } if (macro.femaleParts) { victimTypes = victimTypes.concat(["womb"]); } else { document.getElementById("button-unbirth").style.display = 'none'; document.getElementById("femcum").style.display = 'none'; document.getElementById("femcumPercent").style.display = 'none'; document.querySelector("#part-vagina+label").style.display = 'none'; } if (macro.hasBreasts) { victimTypes = victimTypes.concat(["breasts"]); if (macro.lactationEnabled) { victimTypes = victimTypes.concat(["flooded"]); } else { document.getElementById("button-breast_milk").style.display = 'none'; document.getElementById("milk").style.display = 'none'; document.getElementById("milkPercent").style.display = 'none'; } } else { document.getElementById("button-breast_milk").style.display = 'none'; document.getElementById("milk").style.display = 'none'; document.getElementById("milkPercent").style.display = 'none'; document.getElementById("button-breast_crush").style.display = 'none'; document.querySelector("#part-breasts+label").style.display = 'none'; } if (macro.maleParts || macro.femaleParts) { victimTypes.push("splooged"); } if (macro.brutality < 1) { document.getElementById("button-chew").style.display = 'none'; } var table = document.getElementById("victim-table"); var tr = document.createElement('tr'); var th = document.createElement('th'); th.innerHTML = "Method"; tr.appendChild(th); for (var i = 0; i < victimTypes.length; i++) { var th = document.createElement('th'); th.classList.add("victim-table-cell"); th.innerHTML = victimTypes[i].charAt(0).toUpperCase() + victimTypes[i].slice(1); tr.appendChild(th); } table.appendChild(tr); for (var key in things) { if (things.hasOwnProperty(key) && key != "Container") { var tr = document.createElement('tr'); tr.id = "stat-" + key; tr.style.display = "none"; var th = document.createElement('th'); th.innerHTML = key; tr.appendChild(th); for (var i = 0; i < victimTypes.length; i++) { var th = document.createElement('th'); th.innerHTML = 0; th.id = "stat-" + victimTypes[i] + "-" + key; tr.appendChild(th); } table.appendChild(tr); } } document.getElementById("button-arousal").innerHTML = (macro.arousalEnabled ? "Arousal On" : "Arousal Off"); if (!macro.arousalEnabled) { document.getElementById("arousal").style.display = "none"; document.getElementById("edge").style.display = "none"; } //var species = document.getElementById("option-species").value; //var re = /^[a-zA-Z\- ]+$/; // tricksy tricksy players //if (re.test(species)) { // macro.species = species; //} macro.init(); update(); document.getElementById("stat-container").style.display = 'flex'; } window.addEventListener('load', function(event) { victims["stomped"] = initVictims(); victims["tailslapped"] = initVictims(); victims["tailmaw'd"] = initVictims(); victims["bowels"] = initVictims(); victims["digested"] = initVictims(); victims["stomach"] = initVictims(); victims["breasts"] = initVictims(); victims["flooded"] = initVictims(); victims["womb"] = initVictims(); victims["cock"] = initVictims(); victims["balls"] = initVictims(); victims["smothered"] = initVictims(); victims["splooged"] = initVictims(); victims["ground"] = initVictims(); document.getElementById("button-look").addEventListener("click",look); document.getElementById("button-feed").addEventListener("click",feed); document.getElementById("button-chew").addEventListener("click",chew); document.getElementById("button-stomp").addEventListener("click",stomp); document.getElementById("button-anal_vore").addEventListener("click",anal_vore); document.getElementById("button-tail_slap").addEventListener("click",tail_slap); document.getElementById("button-tail_vore").addEventListener("click",tail_vore); document.getElementById("button-breast_crush").addEventListener("click",breast_crush); document.getElementById("button-breast_milk").addEventListener("click",milk_breasts); document.getElementById("button-unbirth").addEventListener("click",unbirth); document.getElementById("button-cockslap").addEventListener("click",cockslap); document.getElementById("button-cock_vore").addEventListener("click",cock_vore); document.getElementById("button-ball_smother").addEventListener("click",ball_smother); document.getElementById("button-grind").addEventListener("click",grind); document.getElementById("button-stroll").addEventListener("click",toggle_auto); document.getElementById("button-location").addEventListener("click",change_location); document.getElementById("button-numbers").addEventListener("click",toggle_numbers); document.getElementById("button-units").addEventListener("click",toggle_units); document.getElementById("button-verbose").addEventListener("click",toggle_verbose); document.getElementById("button-arousal").addEventListener("click",toggle_arousal); document.getElementById("button-grow-lots").addEventListener("click",grow_lots); document.getElementById("button-amount-1").addEventListener("click",function() { grow_pick(1); }); document.getElementById("button-amount-5").addEventListener("click",function() { grow_pick(5); }); document.getElementById("button-amount-10").addEventListener("click",function() { grow_pick(10); }); document.getElementById("button-amount-20").addEventListener("click",function() { grow_pick(20); }); document.getElementById("button-amount-50").addEventListener("click",function() { grow_pick(50); }); document.getElementById("button-amount-100").addEventListener("click",function() { grow_pick(100); }); document.getElementById("button-load-custom").addEventListener("click",loadSettings); document.getElementById("button-save-custom").addEventListener("click",saveSettings); document.getElementById("button-start").addEventListener("click",startGame); setTimeout(pick_move, 2000); });