| @@ -417,8 +417,8 @@ let macro = | |||||
| let sound = getSound("digest",container.sum_property("mass")); | let sound = getSound("digest",container.sum_property("mass")); | ||||
| let line = organ.describeDigestion(container); | |||||
| organ.fill(this,container); | |||||
| let vol = organ.fill(this,container); | |||||
| let line = organ.describeDigestion(container, vol); | |||||
| let lethal = macro.brutality != 0 && (!macro.soulVoreEnabled || organ.name === "souls"); | let lethal = macro.brutality != 0 && (!macro.soulVoreEnabled || organ.name === "souls"); | ||||
| let summary = summarize(container.sum(),lethal); | let summary = summarize(container.sum(),lethal); | ||||
| @@ -564,11 +564,13 @@ let macro = | |||||
| "feedFunc": function(prey,self,owner) { | "feedFunc": function(prey,self,owner) { | ||||
| this.contents[0] = this.contents[0].merge(prey); | this.contents[0] = this.contents[0].merge(prey); | ||||
| }, | }, | ||||
| "describeDigestion" : function(container) { | |||||
| return describe("womb",container,this.owner,verbose); | |||||
| "describeDigestion": function(container, vol) { | |||||
| return describe("womb",container,this.owner,verbose).replace("$VOLUME",volume(vol,unit,false)); | |||||
| }, | }, | ||||
| "fill": function(owner,container) { | "fill": function(owner,container) { | ||||
| owner.femcumStorage.amount += container.sum_property("mass") * owner.femcumDigestFactor / 1e3; | |||||
| let amount = container.sum_property("mass") * owner.femcumDigestFactor / 1e3; | |||||
| owner.femcumStorage.amount += amount; | |||||
| return amount; | |||||
| }, | }, | ||||
| get description() { | get description() { | ||||
| let prey = new Container(); | let prey = new Container(); | ||||
| @@ -614,11 +616,13 @@ let macro = | |||||
| "feedFunc": function(prey,self,owner) { | "feedFunc": function(prey,self,owner) { | ||||
| this.contents[0] = this.contents[0].merge(prey); | this.contents[0] = this.contents[0].merge(prey); | ||||
| }, | }, | ||||
| "describeDigestion": function(container) { | |||||
| return describe("balls",container,this.owner,verbose); | |||||
| "describeDigestion": function(container, vol) { | |||||
| return describe("balls",container,this.owner,verbose).replace("$VOLUME",volume(vol,unit,false)); | |||||
| }, | }, | ||||
| "fill": function(owner,container) { | "fill": function(owner,container) { | ||||
| owner.cumStorage.amount += container.sum_property("mass") * owner.cumDigestFactor / 1e3; | |||||
| let amount = container.sum_property("mass") * owner.cumDigestFactor / 1e3; | |||||
| owner.cumStorage.amount += amount; | |||||
| return amount; | |||||
| }, | }, | ||||
| get description() { | get description() { | ||||
| let prey = new Container(); | let prey = new Container(); | ||||
| @@ -664,12 +668,14 @@ let macro = | |||||
| "feedFunc": function(prey,self,owner) { | "feedFunc": function(prey,self,owner) { | ||||
| this.contents[0] = this.contents[0].merge(prey); | this.contents[0] = this.contents[0].merge(prey); | ||||
| }, | }, | ||||
| "describeDigestion": function(container) { | |||||
| return describe("breasts",container,this.owner,verbose); | |||||
| "describeDigestion": function(container, vol) { | |||||
| return describe("breasts",container,this.owner,verbose).replace("$VOLUME",volume(vol,unit,false)); | |||||
| }, | }, | ||||
| "fill": function(owner,container) { | "fill": function(owner,container) { | ||||
| if (macro.lactationEnabled) { | if (macro.lactationEnabled) { | ||||
| owner.milkStorage.amount += container.sum_property("mass") * owner.milkDigestFactor / 1e3; | |||||
| let amount = container.sum_property("mass") * owner.milkDigestFactor / 1e3; | |||||
| owner.milkStorage.amount += amount; | |||||
| return amount; | |||||
| } | } | ||||
| }, | }, | ||||
| get description() { | get description() { | ||||
| @@ -716,13 +722,13 @@ let macro = | |||||
| "feedFunc": function(prey,self,owner) { | "feedFunc": function(prey,self,owner) { | ||||
| this.contents[0] = this.contents[0].merge(prey); | this.contents[0] = this.contents[0].merge(prey); | ||||
| }, | }, | ||||
| "describeDigestion": function(container) { | |||||
| return describe("bladder",container,this.owner,verbose); | |||||
| "describeDigestion": function(container, vol) { | |||||
| return describe("bladder",container,this.owner,verbose).replace("$VOLUME",volume(vol,unit,false)); | |||||
| }, | }, | ||||
| "fill": function(owner,container) { | "fill": function(owner,container) { | ||||
| if (macro.lactationEnabled) { | |||||
| owner.pissStorage.amount += container.sum_property("mass") * owner.pissDigestFactor / 1e3; | |||||
| } | |||||
| let amount = container.sum_property("mass") * owner.pissDigestFactor / 1e3; | |||||
| owner.pissStorage.amount += amount; | |||||
| return amount; | |||||
| }, | }, | ||||
| get description() { | get description() { | ||||
| let prey = new Container(); | let prey = new Container(); | ||||
| @@ -758,7 +764,8 @@ let macro = | |||||
| this.feedFunc(prey,this,this.owner); | this.feedFunc(prey,this,this.owner); | ||||
| }, | }, | ||||
| "feedFunc": function(prey,self,owner) { | "feedFunc": function(prey,self,owner) { | ||||
| this.contents[0] = this.contents[0].merge(prey); | |||||
| if (get_living_prey(prey.sum()) > 0) | |||||
| this.contents[0] = this.contents[0].merge(prey); | |||||
| }, | }, | ||||
| "describeDigestion": function(container) { | "describeDigestion": function(container) { | ||||
| return describe("soul-digest",container,this.owner,verbose); | return describe("soul-digest",container,this.owner,verbose); | ||||
| @@ -772,13 +779,15 @@ let macro = | |||||
| prey = prey.merge(x); | prey = prey.merge(x); | ||||
| }); | }); | ||||
| if (prey.count == 0) { | |||||
| let souls = get_living_prey(prey.sum()); | |||||
| if (souls == 0) { | |||||
| return "Your depths hold no souls."; | return "Your depths hold no souls."; | ||||
| } else { | } else { | ||||
| if (macro.brutality > 0) { | if (macro.brutality > 0) { | ||||
| return "Your depths bubble and boil with energy, slowly digesting the " + (prey.count > 1 ? "souls of " : "soul of ") + prey.describe(false); | |||||
| return "Your depths bubble and boil with energy, slowly digesting " + (souls > 1 ? souls + " souls." : "a lonely soul"); | |||||
| } else { | } else { | ||||
| return "You feel " + (prey.count > 1 ? prey.count + " souls " : "a soul ") + "trapped in your depths."; | |||||
| return "You feel " + (souls > 1 ? souls + " souls " : "a soul ") + "trapped in your depths."; | |||||
| } | } | ||||
| } | } | ||||
| }, | }, | ||||
| @@ -2421,7 +2430,7 @@ function male_orgasm(vol,times) | |||||
| let area = Math.pow(vol, 2/3); | let area = Math.pow(vol, 2/3); | ||||
| let prey = getPrey(biome, area); | let prey = getPrey(biome, area); | ||||
| let line = describe("male-orgasm", prey, macro, verbose).replace("$TIMES",times).replace("$VOLUME",volume(vol*times,unit,false)); | |||||
| let line = describe("male-orgasm", prey, macro, verbose).replace("$TIMES",times).replace("$VOLUME",volume(vol*times,unit,true)); | |||||
| let linesummary = summarize(prey.sum(), true); | let linesummary = summarize(prey.sum(), true); | ||||
| let people = get_living_prey(prey.sum()); | let people = get_living_prey(prey.sum()); | ||||
| @@ -2958,6 +2967,21 @@ function gooButtons(molten) { | |||||
| setButton("solidify", molten); | setButton("solidify", molten); | ||||
| setButton("goo_stomach_pull", molten); | setButton("goo_stomach_pull", molten); | ||||
| setButton("goo_stomach_push", molten); | setButton("goo_stomach_push", molten); | ||||
| if (macro.analVore) { | |||||
| setButton("goo_bowels_pull", molten); | |||||
| setButton("goo_bowels_push", molten); | |||||
| } | |||||
| if (macro.femaleParts) { | |||||
| setButton("goo_womb_pull", molten); | |||||
| setButton("goo_womb_push", molten); | |||||
| } | |||||
| if (macro.maleParts) { | |||||
| setButton("goo_balls_pull", molten); | |||||
| setButton("goo_balls_push", molten); | |||||
| } | |||||
| } | } | ||||
| function melt() | function melt() | ||||
| @@ -3030,9 +3054,9 @@ function move_prey(from, to) { | |||||
| return prey; | return prey; | ||||
| } | } | ||||
| function goo_stomach_pull() { | |||||
| let prey = move_prey(macro.stomach, macro.goo); | |||||
| let line = describe("goo-stomach-pull", prey, macro, verbose); | |||||
| function goo_move_prey(from, to, name) { | |||||
| let prey = move_prey(from, to); | |||||
| let line = describe(name, prey, macro, verbose); | |||||
| let linesummary = summarize(prey.sum(), false); | let linesummary = summarize(prey.sum(), false); | ||||
| let preyMass = prey.sum_property("mass"); | let preyMass = prey.sum_property("mass"); | ||||
| let sound = getSound("goo", preyMass); | let sound = getSound("goo", preyMass); | ||||
| @@ -3040,14 +3064,36 @@ function goo_stomach_pull() { | |||||
| update([sound, line, linesummary, newline]); | update([sound, line, linesummary, newline]); | ||||
| } | } | ||||
| function goo_stomach_pull() { | |||||
| return goo_move_prey(macro.stomach, macro.goo, "goo-stomach-pull"); | |||||
| } | |||||
| function goo_stomach_push() { | function goo_stomach_push() { | ||||
| let prey = move_prey(macro.goo, macro.stomach); | |||||
| let line = describe("goo-stomach-push", prey, macro, verbose); | |||||
| let linesummary = summarize(prey.sum(), false); | |||||
| let preyMass = prey.sum_property("mass"); | |||||
| let sound = getSound("goo", preyMass); | |||||
| return goo_move_prey(macro.goo, macro.stomach, "goo-stomach-push"); | |||||
| } | |||||
| update([sound, line, linesummary, newline]); | |||||
| function goo_bowels_pull() { | |||||
| return goo_move_prey(macro.bowels, macro.goo, "goo-bowels-pull"); | |||||
| } | |||||
| function goo_bowels_push() { | |||||
| return goo_move_prey(macro.goo, macro.bowels, "goo-bowels-push"); | |||||
| } | |||||
| function goo_womb_pull() { | |||||
| return goo_move_prey(macro.womb, macro.goo, "goo-womb-pull"); | |||||
| } | |||||
| function goo_womb_push() { | |||||
| return goo_move_prey(macro.goo, macro.womb, "goo-womb-push"); | |||||
| } | |||||
| function goo_balls_pull() { | |||||
| return goo_move_prey(macro.balls, macro.goo, "goo-balls-pull"); | |||||
| } | |||||
| function goo_balls_push() { | |||||
| return goo_move_prey(macro.goo, macro.balls, "goo-balls-push"); | |||||
| } | } | ||||
| function transformNumbers(line) | function transformNumbers(line) | ||||
| @@ -23,7 +23,8 @@ var actions = ["eat","chew","vomit","stomp","stomp-wedge","flex-toes","kick","an | |||||
| "female-orgasm","grind","pouch-stuff","pouch-rub","pouch-eat","pouch-absorb","soul-vore","soul-absorb-paw", | "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","bladder","soul-digest", | "paw-stench","ass-stench","belch","fart","stomach","womb","balls","bowels","bowels-to-stomach","breasts","bladder","soul-digest", | ||||
| "wear-shoe","remove-shoe","wear-sock","remove-sock","stuff-shoe","dump-shoe","stuff-sock","dump-sock","piss","bladder-vore","scat", | "wear-shoe","remove-shoe","wear-sock","remove-sock","stuff-shoe","dump-shoe","stuff-sock","dump-sock","piss","bladder-vore","scat", | ||||
| "sheath-toy","slit-toy","breast-toy","melt","solidify","stomp-goo","goo-digest","ass-goo","goo-stomach-pull","goo-stomach-push"]; | |||||
| "sheath-toy","slit-toy","breast-toy","melt","solidify","stomp-goo","goo-digest","ass-goo","goo-stomach-pull","goo-stomach-push", | |||||
| "goo-bowels-pull","goo-bowels-push","goo-womb-pull","goo-womb-push","goo-balls-pull","goo-balls-push"]; | |||||
| for (let i=0; i<actions.length; i++) { | for (let i=0; i<actions.length; i++) { | ||||
| rules[actions[i]] = []; | rules[actions[i]] = []; | ||||
| @@ -372,7 +373,7 @@ function defaultSheathClench(container, macro, verbose) { | |||||
| if (container.count == 0) | if (container.count == 0) | ||||
| return "You squeeze your sheath."; | return "You squeeze your sheath."; | ||||
| else if (isGory(macro)) | else if (isGory(macro)) | ||||
| return "You squeeze you packed sheath, reducing " + container.describe(false) + " to a gory paste that slickens your throbbing shaft."; | |||||
| return "You squeeze your packed sheath, reducing " + container.describe(false) + " to a gory paste that slickens your throbbing shaft."; | |||||
| else if (isFatal(macro)) | else if (isFatal(macro)) | ||||
| return "Your fingers run over your packed sheath, squeezing on the " + macro.describeDick + " shaft within and smashing " + container.describe(false); | return "Your fingers run over your packed sheath, squeezing on the " + macro.describeDick + " shaft within and smashing " + container.describe(false); | ||||
| else | else | ||||
| @@ -433,7 +434,7 @@ function defaultMaleSpurt(container, macro, verbose) { | |||||
| function defaultMaleOrgasm(container, macro, verbose) { | function defaultMaleOrgasm(container, macro, verbose) { | ||||
| if (container.count == 0) | if (container.count == 0) | ||||
| return "Your " + macro.describeDick + " cock spurts $TIMES times, gushing $VOLUME of seed."; | |||||
| return "Your " + macro.describeDick + " cock spurts $TIMES times, gushing out a $VOLUME glob of cum."; | |||||
| else if (isFatal(macro)) | else if (isFatal(macro)) | ||||
| return "You're cumming! Your " + macro.describeDick + " cock erupts with $TIMES ropes of seed, obliterating " + container.describe(verbose) + " in a $VOLUME-torrent of cum."; | return "You're cumming! Your " + macro.describeDick + " cock erupts with $TIMES ropes of seed, obliterating " + container.describe(verbose) + " in a $VOLUME-torrent of cum."; | ||||
| else | else | ||||
| @@ -595,21 +596,21 @@ function defaultBowelsToStomach(container, macro, verbose) { | |||||
| function defaultWomb(container, macro, verbose) { | function defaultWomb(container, macro, verbose) { | ||||
| if (isFatal(macro)) | if (isFatal(macro)) | ||||
| return "Your womb squeezes and dissolves " + container.describe(false) + ", turning them into slick femcum."; | |||||
| return "Your womb squeezes and dissolves " + container.describe(false) + ", turning them into $VOLUME of slick femcum."; | |||||
| else | else | ||||
| return "Your womb squeezes as it absorbs " + container.describe(false); | return "Your womb squeezes as it absorbs " + container.describe(false); | ||||
| } | } | ||||
| function defaultBalls(container, macro, verbose) { | function defaultBalls(container, macro, verbose) { | ||||
| if (isFatal(macro)) | if (isFatal(macro)) | ||||
| return "Your balls slosh as they digest " + container.describe(false) + " into cum"; | |||||
| return "Your balls slosh as they digest " + container.describe(false) + " into $VOLUME of cum"; | |||||
| else | else | ||||
| return "Your balls slosh as they absorb " + container.describe(false); | return "Your balls slosh as they absorb " + container.describe(false); | ||||
| } | } | ||||
| function defaultBreasts(container, macro, verbose) { | function defaultBreasts(container, macro, verbose) { | ||||
| if (isFatal(macro)) | |||||
| return "Your breasts grrgle as they digest " + container.describe(false) + " into milk"; | |||||
| if (isFatal(macro) && macro.lactationEnabled) | |||||
| return "Your breasts grrgle as they digest " + container.describe(false) + " into $VOLUME of milk"; | |||||
| else | else | ||||
| return "Your breasts slosh as they absorb " + container.describe(false); | return "Your breasts slosh as they absorb " + container.describe(false); | ||||
| } | } | ||||
| @@ -617,13 +618,13 @@ function defaultBreasts(container, macro, verbose) { | |||||
| function defaultBladder(container, macro, verbose) { | function defaultBladder(container, macro, verbose) { | ||||
| if (isSadistic(macro)) { | if (isSadistic(macro)) { | ||||
| let fatalities = get_living_prey(container.sum()); | let fatalities = get_living_prey(container.sum()); | ||||
| let line = "Your bladder swells as " + container.describe(false) + " are dissolved in your acrid piss."; | |||||
| let line = "Your bladder swells as " + container.describe(false) + " are dissolved in your acrid piss, digesting them down to $VOLUME of fresh urine"; | |||||
| if (fatalities > 0) { | if (fatalities > 0) { | ||||
| line += " " + (fatalities > 1 ? fatalities + " lives are" : "a life is") + " snuffed out by the horrific yellow tide, corroded and annihilated amongst the unbearable stench of urine."; | line += " " + (fatalities > 1 ? fatalities + " lives are" : "a life is") + " snuffed out by the horrific yellow tide, corroded and annihilated amongst the unbearable stench of urine."; | ||||
| } | } | ||||
| return line; | return line; | ||||
| } else if (isFatal(macro)) | } else if (isFatal(macro)) | ||||
| return "Your bladder swells as it dissolves " + container.describe(false) + " into acrid piss"; | |||||
| return "Your bladder swells as it dissolves " + container.describe(false) + " into $VOLUME of acrid piss"; | |||||
| else | else | ||||
| return "Your bladder squeezes as it absorbs " + container.describe(false); | return "Your bladder squeezes as it absorbs " + container.describe(false); | ||||
| } | } | ||||
| @@ -738,7 +739,7 @@ function defaultBladderVore(container, macro, verbose) { | |||||
| } | } | ||||
| else { | else { | ||||
| if (macro.maleParts) { | if (macro.maleParts) { | ||||
| return "You snatch up " + container.describe(verbose) + " and stuff them into your " + macro.describeDick + ", grinding them to its base and forcing them into your musky bladder."; | |||||
| return "You snatch up " + container.describe(verbose) + " and stuff them into your " + macro.describeDick + " cock, grinding them to its base and forcing them into your musky bladder."; | |||||
| } else if (macro.femaleParts) { | } else if (macro.femaleParts) { | ||||
| return "You snatch " + container.describe(verbose) + " in your iron grip, grinding them against your " + macro.describeVagina + " slit before stuffing them into your urethra, sealing them away in your musky bladder."; | return "You snatch " + container.describe(verbose) + " in your iron grip, grinding them against your " + macro.describeVagina + " slit before stuffing them into your urethra, sealing them away in your musky bladder."; | ||||
| } else { | } else { | ||||
| @@ -805,7 +806,31 @@ function defaultGooStomachPull(container, macro, verbose) { | |||||
| } | } | ||||
| function defaultGooStomachPush(container, macro, verobse) { | function defaultGooStomachPush(container, macro, verobse) { | ||||
| return "Your churning goo herds " + container.describe(false) + " into your churning stomach."; | |||||
| return "Your churning goo herds " + container.describe(false) + " into your gurgling stomach."; | |||||
| } | |||||
| function defaultGooBowelsPull(container, macro, verbose) { | |||||
| return "Your molten depths squeeze in around the " + container.describe(false) + " imprisoned in your bowels, drawing them into the viscous goo."; | |||||
| } | |||||
| function defaultGooBowelsPush(container, macro, verobse) { | |||||
| return "Your churning goo herds " + container.describe(false) + " into your clenching bowels."; | |||||
| } | |||||
| function defaultGooWombPull(container, macro, verbose) { | |||||
| return "Your molten depths squeeze in around the " + container.describe(false) + " imprisoned in your womb, drawing them into the viscous goo."; | |||||
| } | |||||
| function defaultGooWombPush(container, macro, verobse) { | |||||
| return "Your churning goo herds " + container.describe(false) + " into your slick womb."; | |||||
| } | |||||
| function defaultGooBallsPull(container, macro, verbose) { | |||||
| return "Your molten depths squeeze in around the " + container.describe(false) + " imprisoned in your balls, drawing them into the viscous goo."; | |||||
| } | |||||
| function defaultGooBallsPush(container, macro, verobse) { | |||||
| return "Your churning goo herds " + container.describe(false) + " into your musky balls."; | |||||
| } | } | ||||
| // EATING | // EATING | ||||
| @@ -301,6 +301,12 @@ | |||||
| <button class="action-button" id="button-action-melt">Melt</button> | <button class="action-button" id="button-action-melt">Melt</button> | ||||
| <button class="action-button" id="button-action-goo_stomach_push">Push to Stomach</button> | <button class="action-button" id="button-action-goo_stomach_push">Push to Stomach</button> | ||||
| <button class="action-button" id="button-action-goo_stomach_pull">Pull from Stomach</button> | <button class="action-button" id="button-action-goo_stomach_pull">Pull from Stomach</button> | ||||
| <button class="action-button" id="button-action-goo_bowels_push">Push to Bowels</button> | |||||
| <button class="action-button" id="button-action-goo_bowels_pull">Pull from Bowels</button> | |||||
| <button class="action-button" id="button-action-goo_womb_push">Push to Womb</button> | |||||
| <button class="action-button" id="button-action-goo_womb_pull">Pull from Womb</button> | |||||
| <button class="action-button" id="button-action-goo_balls_push">Push to Balls</button> | |||||
| <button class="action-button" id="button-action-goo_balls_pull">Pull from Balls</button> | |||||
| </div> | </div> | ||||
| <div class="action-tab" id="actions-misc"> | <div class="action-tab" id="actions-misc"> | ||||