| @@ -360,7 +360,7 @@ let macro = | |||
| return describe("stomach",container,this.owner,verbose); | |||
| }, | |||
| "fill": function(owner,container) { | |||
| //no-op | |||
| owner.gasStorage.amount += container.sum_property("mass") * this.owner.gasDigestFactor / 1e4; | |||
| }, | |||
| get description() { | |||
| let prey = new Container(); | |||
| @@ -403,7 +403,7 @@ let macro = | |||
| return describe("bowels",container,this.owner,verbose); | |||
| }, | |||
| "fill": function(owner,container) { | |||
| //no-op | |||
| owner.gasStorage.amount += container.sum_property("mass") * this.owner.gasDigestFactor / 1e3; | |||
| }, | |||
| get description() { | |||
| let prey = new Container(); | |||
| @@ -646,10 +646,12 @@ let macro = | |||
| this.cumStorage.owner = this; | |||
| this.femcumStorage.owner = this; | |||
| this.milkStorage.owner = this; | |||
| this.gasStorage.owner = this; | |||
| if (this.analVoreToStomach) { | |||
| this.bowels.moves = this.stomach; | |||
| } | |||
| if (this.maleParts) | |||
| this.fillCum(this); | |||
| if (this.femaleParts) | |||
| @@ -659,6 +661,9 @@ let macro = | |||
| if (this.arousalEnabled) { | |||
| this.quenchExcess(this); | |||
| } | |||
| if (this.gasEnabled) { | |||
| this.fillGas(this); | |||
| } | |||
| }, | |||
| "maleParts": true, | |||
| @@ -693,6 +698,26 @@ let macro = | |||
| update(); | |||
| }, | |||
| "fillGas": function(self) { | |||
| self.gasStorage.amount += self.gasScale * self.gasStorage.limit / 3600; | |||
| let ratio = self.gasStorage.amount / self.gasStorage.limit; | |||
| if (ratio > 1 && Math.random()*100 < ratio || ratio > 2) { | |||
| let amount = self.gasStorage.amount - self.gasStorage.limit*3/4; | |||
| if (self.belchEnabled && self.fartEnabled) { | |||
| Math.random() < 0.5 ? belch(amount) : fart(amount); | |||
| } else if (self.belchEnabled) { | |||
| belch(amount); | |||
| } else if (self.fartEnabled) { | |||
| fart(amount); | |||
| } | |||
| self.gasStorage.amount = self.gasStorage.limit*3/4; | |||
| } | |||
| setTimeout(function () { self.fillGas(self); }, 100); | |||
| update(); | |||
| }, | |||
| "cumStorage": { | |||
| "amount": 0, | |||
| get limit() { | |||
| @@ -714,6 +739,38 @@ let macro = | |||
| } | |||
| }, | |||
| "gasStorage": { | |||
| "amount": 0, | |||
| get limit() { | |||
| return Math.pow(this.owner.scale,3) / 1000; | |||
| } | |||
| }, | |||
| "stenchEnabled": true, | |||
| "basePawStenchArea": 1, | |||
| get pawStenchArea() { | |||
| return this.pawArea * this.basePawStenchArea; | |||
| }, | |||
| "baseAssStenchArea": 1, | |||
| get assStenchArea() { | |||
| return this.assArea * this.baseAssStenchArea; | |||
| }, | |||
| "gasEnabled": true, | |||
| "gasScale": 1, | |||
| "gasFactor": 1, | |||
| "baseGasDigestFactor": 1, | |||
| "gasScaleWithSize": true, | |||
| get gasDigestFactor() { | |||
| if (this.gasScaleWithSize) { | |||
| return this.baseGasDigestFactor * this.scale; | |||
| } else { | |||
| return this.baseGasDigestFactor; | |||
| } | |||
| }, | |||
| "belchEnabled": true, | |||
| "fartEnabled": true, | |||
| "orgasm": false, | |||
| "afterglow": false, | |||
| @@ -1340,6 +1397,32 @@ function stomp() | |||
| update([sound,line,linesummary,newline]); | |||
| macro.arouse(5); | |||
| if (macro.stenchEnabled) { | |||
| paw_stench(); | |||
| } | |||
| } | |||
| function paw_stench() { | |||
| let area = macro.pawStenchArea; | |||
| let prey = getPrey(biome, area); | |||
| let line = describe("paw-stench", prey, macro, verbose); | |||
| let linesummary = summarize(prey.sum(), true); | |||
| let people = get_living_prey(prey.sum()); | |||
| if (prey.sum()["Person"] == undefined) | |||
| return; | |||
| let preyMass = prey.sum_property("mass"); | |||
| macro.addGrowthPoints(preyMass); | |||
| updateVictims("stomped",prey); | |||
| update([line,linesummary,newline]); | |||
| macro.arouse(5); | |||
| } | |||
| function grind() | |||
| @@ -1457,6 +1540,32 @@ function sit() | |||
| update([sound,line,linesummary,newline]); | |||
| macro.arouse(5); | |||
| if (macro.stenchEnabled) { | |||
| ass_stench(); | |||
| } | |||
| } | |||
| function ass_stench() { | |||
| let area = macro.assStenchArea; | |||
| let prey = getPrey(biome, area); | |||
| let line = describe("ass-stench", prey, macro, verbose); | |||
| let linesummary = summarize(prey.sum(), true); | |||
| let people = get_living_prey(prey.sum()); | |||
| if (prey.sum()["Person"] == undefined) | |||
| return; | |||
| let preyMass = prey.sum_property("mass"); | |||
| macro.addGrowthPoints(preyMass); | |||
| updateVictims("stomped",prey); | |||
| update([line,linesummary,newline]); | |||
| macro.arouse(5); | |||
| } | |||
| function cleavage_stuff() | |||
| @@ -2403,6 +2512,74 @@ function soul_absorb_paw() | |||
| macro.arouse(25); | |||
| } | |||
| function belch(vol) | |||
| { | |||
| let area = Math.pow(vol, 2/3); | |||
| let prey = getPrey(biome, area); | |||
| let line = describe("belch", prey, macro, verbose).replace("$VOLUME",volume(vol,unit,false)); | |||
| let linesummary = summarize(prey.sum(), true); | |||
| let people = get_living_prey(prey.sum()); | |||
| let sound = "Urp."; | |||
| if (people < 3) { | |||
| sound = "Burp."; | |||
| } else if (people < 10) { | |||
| sound = "Urph."; | |||
| } else if (people < 50) { | |||
| sound = "Urrrrrph."; | |||
| } else if (people < 500) { | |||
| sound = "UUURRP!"; | |||
| } else if (people < 5000) { | |||
| sound = "BUUUUURRRRRRRRRRPHHH!!"; | |||
| } else { | |||
| sound = "Oh the humanity!"; | |||
| } | |||
| let preyMass = prey.sum_property("mass"); | |||
| macro.addGrowthPoints(preyMass); | |||
| updateVictims("splooged",prey); | |||
| update([sound,line,linesummary,newline]); | |||
| } | |||
| function fart(vol) | |||
| { | |||
| let area = Math.pow(vol, 2/3); | |||
| let prey = getPrey(biome, area); | |||
| let line = describe("fart", prey, macro, verbose).replace("$VOLUME",volume(vol,unit,false)); | |||
| let linesummary = summarize(prey.sum(), true); | |||
| let people = get_living_prey(prey.sum()); | |||
| let sound = "Pft."; | |||
| if (people < 3) { | |||
| sound = "Pft."; | |||
| } else if (people < 10) { | |||
| sound = "Pffft."; | |||
| } else if (people < 50) { | |||
| sound = "Pfffbt."; | |||
| } else if (people < 500) { | |||
| sound = "Pffffffbt."; | |||
| } else if (people < 5000) { | |||
| sound = "PFFFBT."; | |||
| } else { | |||
| sound = "Oh the humanity!"; | |||
| } | |||
| let preyMass = prey.sum_property("mass"); | |||
| macro.addGrowthPoints(preyMass); | |||
| updateVictims("splooged",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); }); | |||
| @@ -2432,6 +2609,8 @@ function update(lines = []) | |||
| 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) + "%"; | |||
| document.getElementById("gas").innerHTML = "Gas: " + transformNumbers(volume(macro.gasStorage.amount,unit,false)); | |||
| document.getElementById("gasPercent").innerHTML = Math.round(macro.gasStorage.amount / macro.gasStorage.limit * 100) + "%"; | |||
| for (let type in victims) { | |||
| if (victims.hasOwnProperty(type)) { | |||
| @@ -2905,6 +3084,9 @@ function startGame(e) { | |||
| } | |||
| if (macro.gasEnabled) { | |||
| enable_stat("gas"); | |||
| } | |||
| if (macro.brutality > 0) { | |||
| enable_button("chew"); | |||
| } | |||
| @@ -20,8 +20,8 @@ var actions = ["eat","chew","stomp","kick","anal-vore","ass-crush","tail-slap"," | |||
| "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", | |||
| "female-orgasm","grind","pouch-stuff","pouch-rub","pouch-eat","pouch-absorb","soul-vore","soul-absorb-paw","stomach","womb", | |||
| "balls","bowels","bowels-to-stomach","breasts","soul-digest"]; | |||
| "female-orgasm","grind","pouch-stuff","pouch-rub","pouch-eat","pouch-absorb","soul-vore","soul-absorb-paw", | |||
| "paw-stench","ass-stench","belch","fart","stomach","womb","balls","bowels","bowels-to-stomach","breasts","soul-digest"]; | |||
| for (let i=0; i<actions.length; i++) { | |||
| rules[actions[i]] = []; | |||
| @@ -426,11 +426,49 @@ function defaultSoulAbsorbPaw(container, macro, verbose) { | |||
| return "Your " + macro.footDesc() + " slams down on " + container.describe(verbose) + ", smashing them to pieces and absorbing " + sum + (sum == 1 ? " soul" : " souls") + " into your pads."; | |||
| } | |||
| function defaultStomach(container, macro, verbose) { | |||
| function defaultPawStench(container, macro, verbose) { | |||
| let sum = container.sum()["Person"]; | |||
| if (isFatal(macro)) | |||
| return "Vile fumes waft from your " + macro.footDesc(true) + " , choking the life from " + (sum > 1 ? sum + " people." : "a person."); | |||
| else | |||
| return "Your stinky " + macro.footDesc(true) + " overwhelm" + (sum > 1 ? sum + " people" : "a person") + " with your scent!"; | |||
| } | |||
| function defaultAssStench(container, macro, verbose) { | |||
| let sum = container.sum()["Person"]; | |||
| if (isFatal(macro)) | |||
| return "Vile miasma from your bitter ass snuffs out " + (sum > 1 ? sum + " people" : "a person") + ", suffocating them in your stench."; | |||
| else | |||
| return "Your stinky ass sicens " + (sum > 1 ? sum + " people" : "a person") + " with your scent!"; | |||
| } | |||
| function defaultBelch(container, macro, verbose) { | |||
| let sum = container.sum()["Person"]; | |||
| if (container.count == 0) | |||
| return "An ominous groan precedes a crass belch."; | |||
| if (isFatal(macro)) | |||
| return "Your stomach gurgles as it digests " + container.describe(false); | |||
| return "A rancid belch flows from your " + macro.jawDesc(verbose) + ", corroding " + container.describe(verbose) + " with your vile fumes."; | |||
| else | |||
| return "You let out a loud burp, blowing over " + container.describe(verbose) + "!"; | |||
| } | |||
| function defaultFart(container, macro, verbose) { | |||
| let sum = container.sum()["Person"]; | |||
| if (container.count == 0) | |||
| return "An ominous groan precedes a loud, pungent fart."; | |||
| if (isFatal(macro)) | |||
| return "An ominous groan precedes a loud, pungent fart, corroding " + container.describe(verbose) + " with truly vile vapors."; | |||
| else | |||
| return "You let out a crass fart, blowing over " + container.describe(verbose) + "!"; | |||
| } | |||
| function defaultStomach(container, macro, verbose) { | |||
| if (isGory(macro)) | |||
| return "Your caustic stomach grinds " + container.describe(false) + " to a gory pulp."; | |||
| else if (isFatal(macro)) | |||
| return "Your stomach gurgles as it digests " + container.describe(false) + "."; | |||
| else | |||
| return "Your stomach groans as it absorbs " + container.describe(false); | |||
| return "Your stomach groans and abosrbs " + container.describe(false) + "."; | |||
| } | |||
| function defaultBowels(container, macro, verbose) { | |||
| @@ -25,6 +25,8 @@ | |||
| <div class="stat-line-hidden" id="femcumPercent"></div> | |||
| <div class="stat-line-hidden" id="milk"></div> | |||
| <div class="stat-line-hidden" id="milkPercent"></div> | |||
| <div class="stat-line-hidden" id="gas"></div> | |||
| <div class="stat-line-hidden" id="gasPercent"></div> | |||
| </div> | |||
| <div class="stat-header-self">Growth</div> | |||
| <table id="grow-panel"> | |||
| @@ -72,7 +74,7 @@ | |||
| </div> | |||
| <div id="log-area"> | |||
| <div id="log"> | |||
| <div>Welcome to Stroll 0.5.13</div> | |||
| <div>Welcome to Stroll 0.5.14</div> | |||
| <div><b>This game features 18+ content</b></div> | |||
| <div><a href="https://chemicalcrux.org/stroll">Changelog</a></div> | |||
| <div><a href="https://t.me/joinchat/BSXHzUZmSqc-CXB1khkuYw">Telegram discussion group</a></div> | |||
| @@ -98,6 +100,7 @@ | |||
| <button class="action-button" id="button-action-sit">Sit</button> | |||
| <button class="action-button" id="button-action-grind">Grind</button> | |||
| </div> | |||
| <div class="action-tab" id="actions-tails"> | |||
| <button class="action-button" id="button-action-tail_slap">Tail Slap</button> | |||
| <button class="action-button" id="button-action-tail_vore_only">Tail Vore</button> | |||
| @@ -105,6 +108,7 @@ | |||
| <button class="action-button" id="button-action-tail_vore_some">Tail Vore (some)</button> | |||
| <button class="action-button" id="button-action-tail_vore_all">Tail Vore (all!)</button> | |||
| </div> | |||
| <div class="action-tab" id="actions-breasts"> | |||
| <button class="action-button" id="button-action-cleavage_stuff">Stuff Cleavage</button> | |||
| <button class="action-button" id="button-action-cleavage_crush">Crush Cleavage</button> | |||
| @@ -114,9 +118,11 @@ | |||
| <button class="action-button" id="button-action-breast_vore">Breast Vore</button> | |||
| <button class="action-button" id="button-action-breast_milk">Milk Breasts</button> | |||
| </div> | |||
| <div class="action-tab" id="actions-vagina"> | |||
| <button class="action-button" id="button-action-unbirth">Unbirth</button> | |||
| </div> | |||
| <div class="action-tab" id="actions-dick"> | |||
| <button class="action-button" id="button-action-sheath_stuff">Stuff Sheath</button> | |||
| <button class="action-button" id="button-action-sheath_squeeze">Squeeze Sheath</button> | |||
| @@ -125,10 +131,12 @@ | |||
| <button class="action-button" id="button-action-cock_vore">Cock Vore</button> | |||
| <button class="action-button" id="button-action-ball_smother">Ball Smother</button> | |||
| </div> | |||
| <div class="action-tab" id="actions-souls"> | |||
| <button class="action-button" id="button-action-soul_vore">Soul Vore</button> | |||
| <button class="action-button" id="button-action-soul_absorb_paw">Paws</button> | |||
| </div> | |||
| <div class="action-tab" id="actions-misc"> | |||
| <button class="action-button" id="button-action-pouch_stuff">Stuff Pouch</button> | |||
| <button class="action-button" id="button-action-pouch_rub">Rub Pouch</button> | |||
| @@ -138,7 +146,7 @@ | |||
| </div> | |||
| </div> | |||
| <div class="character-build"> | |||
| <p>Welcome to Stroll 0.5.13</p> | |||
| <p>Welcome to Stroll 0.5.14</p> | |||
| <p><b>This game features 18+ content</b></p> | |||
| <p><a href="https://chemicalcrux.org/stroll">Changelog</a></p> | |||
| <p><a href="https://t.me/joinchat/BSXHzUZmSqc-CXB1khkuYw">Telegram discussion group</a></p> | |||
| @@ -276,7 +284,7 @@ | |||
| </li> | |||
| <li> | |||
| <label for="soulVoreEnabled">Soul vore</label> | |||
| <input type="checkbox" checked="true" name="soulVoreEnabled"/> | |||
| <input type="checkbox" name="soulVoreEnabled"/> | |||
| </li> | |||
| <li> | |||
| <label for="footType">Foot type</label> | |||
| @@ -482,6 +490,48 @@ | |||
| </li> | |||
| </div> | |||
| </div> | |||
| <div class="custom-category"> | |||
| <input class="custom-header-checkbox" type="checkbox" id="stenchEnabled" name="stenchEnabled"/> | |||
| <label class="custom-header" for="stenchEnabled">Stench</label> | |||
| <div class="reveal-if-active"> | |||
| <li> | |||
| <label class="has-tooltip" for="basePawStenchArea" title="How many times your paw area should be covered in stench">Paw stench area</label> | |||
| <input type="number" id="basePawStenchArea" name="basePawStenchArea" placeholder="1"/> | |||
| </li> | |||
| <li> | |||
| <label class="has-tooltip" for="baseAssStenchArea" title="How many times your ass' area should be covered in stench">Paw stench area</label> | |||
| <input type="number" id="baseAssStenchArea" name="baseAssStenchArea" placeholder="1"/> | |||
| </li> | |||
| </div> | |||
| </div> | |||
| <div class="custom-category"> | |||
| <input class="custom-header-checkbox" type="checkbox" id="gasEnabled" name="gasEnabled"/> | |||
| <label class="custom-header" for="gasEnabled">Gas</label> | |||
| <div class="reveal-if-active"> | |||
| <li> | |||
| <label for="belchEnabled">Belching</label> | |||
| <input type="checkbox" checked="true" name="belchEnabled"/> | |||
| </li> | |||
| <li> | |||
| <label for="fartEnabled">Farting</label> | |||
| <input type="checkbox" name="fartEnabled"/> | |||
| </li> | |||
| <li> | |||
| <label for="gasScale">Gas production factor</label> | |||
| <input type="number" id="gasScale" name="gasScale" placeholder="1"/> | |||
| </li> | |||
| <li> | |||
| <label for="baseGasDigestFactor">Gas digestion factor</label> | |||
| <input type="number" id="baseGasDigestFactor" name="baseGasDigestFactor" placeholder="1"/> | |||
| </li> | |||
| <li> | |||
| <label class="has-tooltip" for="gasScaleWithSize" title="If checked, produces more gas from the same prey as you get larger">Scale gas with size</label> | |||
| <input type="checkbox" id="gasScaleWithSize" name="gasScaleWithSize"/> | |||
| </li> | |||
| </div> | |||
| </div> | |||
| </ul> | |||
| </form> | |||
| </div> | |||