diff --git a/game.js b/game.js index 6a3253d..207b985 100644 --- a/game.js +++ b/game.js @@ -134,6 +134,15 @@ var macro = 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, @@ -270,10 +279,14 @@ var macro = this.balls.owner = this; this.cumStorage.owner = this; this.femcumStorage.owner = this; + this.milkStorage.owner = this; + if (this.maleParts) - this.fillCum(this) + this.fillCum(this); if (this.femaleParts) - this.fillFemcum(this) + this.fillFemcum(this); + if (this.hasBreasts) + this.fillBreasts(this); if (this.maleParts || this.femaleParts) { this.quenchExcess(this); } @@ -298,6 +311,14 @@ var macro = 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() { @@ -311,6 +332,14 @@ var macro = return this.owner.vaginaVolume; } }, + + "milkStorage": { + "amount": 0, + get limit() { + return this.owner.breastVolume * 2; + } + }, + "orgasm": false, "afterglow": false, @@ -461,6 +490,8 @@ var macro = 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); } @@ -996,6 +1027,50 @@ function breast_crush() 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() @@ -1370,7 +1445,8 @@ function update(lines = []) 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)) { @@ -1687,15 +1763,26 @@ function startGame(e) { } if (macro.femaleParts) { - victimTypes = victimTypes.concat(["breasts"],["womb"]); + victimTypes = victimTypes.concat(["womb"]); } else { - document.getElementById("button-breast_crush").style.display = 'none'; document.getElementById("button-unbirth").style.display = 'none'; document.getElementById("femcum").style.display = 'none'; - document.querySelector("#part-breasts+label").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'; + } + } else { + document.getElementById("button-breast_milk").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"); } @@ -1765,6 +1852,7 @@ window.addEventListener('load', function(event) { victims["digested"] = initVictims(); victims["stomach"] = initVictims(); victims["breasts"] = initVictims(); + victims["flooded"] = initVictims(); victims["womb"] = initVictims(); victims["cock"] = initVictims(); victims["balls"] = initVictims(); @@ -1779,6 +1867,7 @@ window.addEventListener('load', function(event) { 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); diff --git a/recursive-desc.js b/recursive-desc.js index 7022596..abfde51 100644 --- a/recursive-desc.js +++ b/recursive-desc.js @@ -8,6 +8,7 @@ rules["tail-slap"] = []; rules["tail-vore"] = []; rules["ass-crush"] = []; rules["breast-crush"] = []; +rules["breast-milk"] = []; rules["unbirth"] = []; rules["cock-vore"] = []; rules["cockslap"] = []; @@ -118,6 +119,7 @@ function describeDefault(action, container, macro, verbose=true) { case "tail-slap": return defaultTailSlap(container, macro, verbose); case "tail-vore": return defaultTailVore(container, macro, verbose); case "breast-crush": return defaultBreastCrush(container, macro, verbose); + case "breast-milk": return defaultBreastMilk(container, macro, verbose); case "unbirth": return defaultUnbirth(container, macro, verbose); case "cock-vore": return defaultCockVore(container, macro, verbose); case "cockslap": return defaultCockslap(container, macro, verbose); @@ -186,6 +188,13 @@ function defaultBreastCrush(container, macro, verbose) { return "You smoosh " + container.describe(verbose) + " with your breasts."; } +function defaultBreastMilk(container, macro, verbose) { + if (isFatal(macro)) + return "You squeeze your breasts, coaxing out $VOLUME of warm, creamy milk that floods " + container.describe(verbose) + " in an unstoppable wave of white."; + else + return "You squeeze your breasts, coaxing out $VOLUME of warm, creamy milk that floods " + container.describe(verbose) + "."; +} + function defaultUnbirth(container, macro, verbose) { return "You gasp as you slide " + container.describe(verbose) + " up your slit. "; } diff --git a/stroll.html b/stroll.html index 16d2ba6..52c4d9f 100644 --- a/stroll.html +++ b/stroll.html @@ -23,6 +23,8 @@
+ +