| @@ -554,7 +554,7 @@ var macro = | |||
| result.push(line); | |||
| if (this.hasTail) { | |||
| line = "Your " + macro.describeTail + (macro.tailCount > 1 ? " tails sway as you walk," : "sways as you walk."); | |||
| line = "Your " + macro.describeTail + (macro.tailCount > 1 ? " tails sway as you walk. " : " tail sways as you walk. "); | |||
| if (this.tailMaw) { | |||
| line += (macro.tailCount > 1 ? "Their maws are drooling" : "Its maw is drooling"); | |||
| } | |||
| @@ -577,19 +577,33 @@ var macro = | |||
| } | |||
| } | |||
| if (this.maleParts) { | |||
| if (this.hasSheath && this.arousal < 75) { | |||
| line = "Your " + this.describeDick + " cock is hidden away in your bulging sheath, with two " + mass(macro.ballMass, unit, true) + ", " + length(macro.ballDiameter, unit, true) + "-wide balls hanging beneath."; | |||
| } | |||
| 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) { | |||
| 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."; | |||
| line = "You have two " + length(this.breastDiameter, unit, true) + "-wide breasts that weigh " + mass(macro.breastMass, unit) + " apiece."; | |||
| if (this.cleavage.container.count > 0) | |||
| line += " Between them are " + this.cleavage.container.describe(false) + "."; | |||
| result.push(line); | |||
| } | |||
| if (this.hasPouch) { | |||
| if (this.pouch.container.count == 0) | |||
| result.push("Your belly pouch is flat and empty."); | |||
| else | |||
| result.push("Your belly pouch is bulging, holding " + this.pouch.container.describe(false) + "."); | |||
| } | |||
| return result; | |||
| }, | |||
| @@ -1174,6 +1188,7 @@ function cleavage_stuff() | |||
| function cleavage_crush() | |||
| { | |||
| var prey = macro.cleavage.container; | |||
| macro.cleavage.container = new Container(); | |||
| var line = describe("cleavage-crush", prey, macro, verbose); | |||
| var linesummary = summarize(prey.sum(), true); | |||
| @@ -1238,6 +1253,41 @@ function cleavage_drop() | |||
| update([sound,line,linesummary,newline]); | |||
| } | |||
| function cleavage_absorb() | |||
| { | |||
| var prey = macro.cleavage.container; | |||
| macro.cleavage.container = new Container(); | |||
| var line = describe("cleavage-absorb", prey, macro, verbose); | |||
| var linesummary = summarize(prey.sum(), true); | |||
| var people = get_living_prey(prey.sum()); | |||
| var sound = "Thump"; | |||
| if (people < 3) { | |||
| sound = "Shlp."; | |||
| } else if (people < 10) { | |||
| sound = "Slurp."; | |||
| } else if (people < 50) { | |||
| sound = "Shlrrrrp!"; | |||
| } else if (people < 500) { | |||
| sound = "SHLRP!"; | |||
| } else if (people < 5000) { | |||
| sound = "SHLLLLURP!!"; | |||
| } else { | |||
| sound = "Oh the humanity!"; | |||
| } | |||
| var preyMass = prey.sum_property("mass"); | |||
| macro.addGrowthPoints(preyMass); | |||
| macro.arouse((preyMass > 0 ? 15 : 5)); | |||
| updateVictims("cleavageabsorbed",prey); | |||
| update([sound,line,linesummary,newline]); | |||
| } | |||
| function breast_crush() | |||
| { | |||
| var area = macro.breastArea; | |||
| @@ -1489,6 +1539,37 @@ function sheath_crush() | |||
| update([sound,line,linesummary,newline]); | |||
| } | |||
| function sheath_absorb() | |||
| { | |||
| var prey = macro.sheath.container; | |||
| macro.sheath.container = new Container(); | |||
| var line = describe("sheath-absorb", prey, macro, verbose) | |||
| var linesummary = summarize(prey.sum(), true); | |||
| 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!"; | |||
| } | |||
| macro.arouse(45); | |||
| update([sound,line,linesummary,newline]); | |||
| } | |||
| function cockslap() | |||
| { | |||
| var area = macro.dickArea; | |||
| @@ -2210,7 +2291,13 @@ function startGame(e) { | |||
| } | |||
| if (macro.maleParts) { | |||
| victimTypes = victimTypes.concat(["cock","balls","sheath"]); | |||
| victimTypes = victimTypes.concat(["cock","balls"]); | |||
| if (macro.hasSheath) { | |||
| victimTypes.push("sheath"); | |||
| } else { | |||
| document.getElementById("button-sheath_stuff").style.display = 'none'; | |||
| document.getElementById("button-sheath_squeeze").style.display = 'none'; | |||
| } | |||
| } else { | |||
| document.getElementById("action-part-dick").style.display = 'none'; | |||
| document.getElementById("button-cockslap").style.display = 'none'; | |||
| @@ -2220,6 +2307,9 @@ function startGame(e) { | |||
| document.getElementById("cumPercent").style.display = 'none'; | |||
| document.querySelector("#part-balls+label").style.display = 'none'; | |||
| document.querySelector("#part-dick+label").style.display = 'none'; | |||
| document.getElementById("button-sheath_stuff").style.display = 'none'; | |||
| document.getElementById("button-sheath_squeeze").style.display = 'none'; | |||
| document.getElementById("button-sheath_absorb").style.display = 'none'; | |||
| } | |||
| if (macro.femaleParts) { | |||
| @@ -2233,7 +2323,7 @@ function startGame(e) { | |||
| } | |||
| if (macro.hasBreasts) { | |||
| victimTypes = victimTypes.concat(["breasts","cleavage","cleavagecrushed","cleavagedropped"]); | |||
| victimTypes = victimTypes.concat(["breasts","cleavage","cleavagecrushed","cleavagedropped","cleavageabsorbed"]); | |||
| if (macro.lactationEnabled) { | |||
| victimTypes = victimTypes.concat(["flooded"]); | |||
| } else { | |||
| @@ -2248,6 +2338,10 @@ function startGame(e) { | |||
| } | |||
| } else { | |||
| document.getElementById("action-part-breasts").style.display = 'none'; | |||
| document.getElementById("button-cleavage_stuff").style.display = 'none'; | |||
| document.getElementById("button-cleavage_crush").style.display = 'none'; | |||
| document.getElementById("button-cleavage_drop").style.display = 'none'; | |||
| document.getElementById("button-cleavage_absorb").style.display = 'none'; | |||
| document.getElementById("button-breast_vore").style.display = 'none'; | |||
| document.getElementById("button-breast_milk").style.display = 'none'; | |||
| document.getElementById("milk").style.display = 'none'; | |||
| @@ -2355,12 +2449,14 @@ window.addEventListener('load', function(event) { | |||
| victims["cleavage"] = initVictims(); | |||
| victims["cleavagecrushed"] = initVictims(); | |||
| victims["cleavagedropped"] = initVictims(); | |||
| victims["cleavageabsorbed"] = initVictims(); | |||
| victims["breasts"] = initVictims(); | |||
| victims["breastvored"] = initVictims(); | |||
| victims["flooded"] = initVictims(); | |||
| victims["womb"] = initVictims(); | |||
| victims["sheath"] = initVictims(); | |||
| victims["sheathcrushed"] = initVictims(); | |||
| victims["sheathabsorbed"] = initVictims(); | |||
| victims["cock"] = initVictims(); | |||
| victims["balls"] = initVictims(); | |||
| victims["smothered"] = initVictims(); | |||
| @@ -2382,12 +2478,14 @@ window.addEventListener('load', function(event) { | |||
| document.getElementById("button-cleavage_stuff").addEventListener("click",cleavage_stuff); | |||
| document.getElementById("button-cleavage_crush").addEventListener("click",cleavage_crush); | |||
| document.getElementById("button-cleavage_drop").addEventListener("click",cleavage_drop); | |||
| document.getElementById("button-cleavage_absorb").addEventListener("click",cleavage_absorb); | |||
| document.getElementById("button-breast_crush").addEventListener("click",breast_crush); | |||
| document.getElementById("button-breast_vore").addEventListener("click",breast_vore); | |||
| document.getElementById("button-breast_milk").addEventListener("click",milk_breasts); | |||
| document.getElementById("button-unbirth").addEventListener("click",unbirth); | |||
| document.getElementById("button-sheath_stuff").addEventListener("click",sheath_stuff); | |||
| document.getElementById("button-sheath_squeeze").addEventListener("click",sheath_squeeze); | |||
| document.getElementById("button-sheath_absorb").addEventListener("click",sheath_absorb); | |||
| 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); | |||
| @@ -11,6 +11,7 @@ rules["ass-crush"] = []; | |||
| rules["cleavage-stuff"] = []; | |||
| rules["cleavage-crush"] = []; | |||
| rules["cleavage-drop"] = []; | |||
| rules["cleavage-absorb"] = []; | |||
| rules["breast-crush"] = []; | |||
| rules["breast-vore"] = []; | |||
| rules["breast-milk"] = []; | |||
| @@ -18,6 +19,7 @@ rules["unbirth"] = []; | |||
| rules["sheath-stuff"] = []; | |||
| rules["sheath-squeeze"] = []; | |||
| rules["sheath-crush"] = []; | |||
| rules["sheath-absorb"] = []; | |||
| rules["cock-vore"] = []; | |||
| rules["cockslap"] = []; | |||
| rules["ball-smother"] = []; | |||
| @@ -133,6 +135,7 @@ function describeDefault(action, container, macro, verbose=true) { | |||
| case "cleavage-stuff": return defaultCleavageStuff(container, macro, verbose); | |||
| case "cleavage-crush": return defaultCleavageCrush(container, macro, verbose); | |||
| case "cleavage-drop": return defaultCleavageDrop(container, macro, verbose); | |||
| case "cleavage-absorb": return defaultCleavageAbsorb(container, macro, verbose); | |||
| case "breast-crush": return defaultBreastCrush(container, macro, verbose); | |||
| case "breast-vore": return defaultBreastVore(container, macro, verbose); | |||
| case "breast-milk": return defaultBreastMilk(container, macro, verbose); | |||
| @@ -140,6 +143,7 @@ function describeDefault(action, container, macro, verbose=true) { | |||
| case "sheath-stuff": return defaultSheathStuff(container, macro, verbose); | |||
| case "sheath-squeeze": return defaultSheathSqueeze(container, macro, verbose); | |||
| case "sheath-crush": return defaultSheathCrush(container, macro, verbose); | |||
| case "sheath-absorb": return defaultSheathAbsorb(container, macro, verbose); | |||
| case "cock-vore": return defaultCockVore(container, macro, verbose); | |||
| case "cockslap": return defaultCockslap(container, macro, verbose); | |||
| case "ball-smother": return defaultBallSmother(container, macro, verbose); | |||
| @@ -214,19 +218,30 @@ function defaultCleavageStuff(container, macro, verbose) { | |||
| } | |||
| function defaultCleavageCrush(container, macro, verbose) { | |||
| if (isGory(macro)) | |||
| return "You grasp your breasts and forcefully shove them together, crushing the life from " + container.describe(verbose) + "."; | |||
| if (container.count == 0) | |||
| return "You grasp your breasts and forcefully squeeze them together."; | |||
| else if (isGory(macro)) | |||
| return "You grasp your breasts and forcefully shove them together, crushing the life from " + container.describe(false) + "."; | |||
| else if (isFatal(macro)) | |||
| return "You grasp your breasts and forcefully shove them together, crushing " + container.describe(verbose) + "."; | |||
| return "You grasp your breasts and forcefully shove them together, crushing " + container.describe(false) + "."; | |||
| else | |||
| return "You grasp your breasts and squish them together, smooshing " + container.describe(verbose) + "."; | |||
| return "You grasp your breasts and squish them together, smooshing " + container.describe(false) + "."; | |||
| } | |||
| function defaultCleavageAbsorb(container, macro, verbose) { | |||
| if (container.count == 0) | |||
| return defaultCleavageCrush(container, macro, verbose); | |||
| else | |||
| return "Your squeeze your breasts together, swiftly absorbing " + container.describe(false) + " into your chest."; | |||
| } | |||
| function defaultCleavageDrop(container, macro, verbose) { | |||
| if (container.count == 0) | |||
| return "You pull your breasts apart and give them a shake."; | |||
| if (isFatal(macro)) | |||
| return "You pull your breasts apart far enough for the " + container.describe(verbose) + " trapped within to fall out, tumbling to the ground and smashing to bits."; | |||
| return "You pull your breasts apart far enough for the " + container.describe(false) + " trapped within to fall out, tumbling to the ground and smashing to bits."; | |||
| else | |||
| return "You pull your breasts apart far enough for the " + container.describe(verbose) + " trapped within to fall out."; | |||
| return "You pull your breasts apart far enough for the " + container.describe(false) + " trapped within to fall out."; | |||
| } | |||
| function defaultBreastCrush(container, macro, verbose) { | |||
| @@ -257,16 +272,30 @@ function defaultSheathStuff(container, macro, verbose) { | |||
| } | |||
| function defaultSheathSqueeze(container, macro, verbose) { | |||
| if (macro.orgasm) { | |||
| return "You stroke your spurting cock, then reach down to give your sheath a firm <i>squeeze</i>. Anything within has been ground away to nothingness by the force of your orgasm."; | |||
| } else if (macro.arousal < 25) { | |||
| return "You grip your soft sheath and give it a squeeze, feeling " + container.describe(false) + " within rub against your " + macro.describeDick + " cock."; | |||
| } else if (macro.arousal < 75) { | |||
| return "You grip your swelling sheath and squeeze, feeling " + container.describe(false) + " within grind against your " + macro.describeDick + " cock."; | |||
| } else if (macro.arousal < 150) { | |||
| return "You run your fingers down your " + macro.describeDick + " shaft and grip your sheath, squeezing it to feel " + container.describe(false) + " being smothered against the musky walls by your throbbing cock."; | |||
| if (container.count > 0) { | |||
| if (macro.orgasm) { | |||
| return "You stroke your spurting cock, then reach down to give your sheath a firm <i>squeeze</i>. Anything within has been ground away to nothingness by the force of your orgasm."; | |||
| } else if (macro.arousal < 25) { | |||
| return "You grip your soft sheath and give it a squeeze, feeling " + container.describe(false) + " within rub against your " + macro.describeDick + " cock."; | |||
| } else if (macro.arousal < 75) { | |||
| return "You grip your swelling sheath and squeeze, feeling " + container.describe(false) + " within grind against your " + macro.describeDick + " cock."; | |||
| } else if (macro.arousal < 150) { | |||
| return "You run your fingers down your " + macro.describeDick + " shaft and grip your sheath, squeezing it to feel " + container.describe(false) + " being smothered against the musky walls by your throbbing cock."; | |||
| } else { | |||
| return "Trembling with your impending orgasm, your fingers play over your sheath, feeling " + container.describe(false) + " within rub against your " + macro.describeDick + " cock."; | |||
| } | |||
| } else { | |||
| return "Trembling with your impending orgasm, your fingers play over your sheath, feeling " + container.describe(false) + " within rub against your " + macro.describeDick + " cock."; | |||
| if (macro.orgasm) { | |||
| return "You stroke your spurting cock, then reach down to give your sheath a firm <i>squeeze</i>. Anything within has been ground away to nothingness by the force of your orgasm."; | |||
| } else if (macro.arousal < 25) { | |||
| return "You grip your soft sheath and give it a squeeze."; | |||
| } else if (macro.arousal < 75) { | |||
| return "You grip your swelling sheath and squeeze."; | |||
| } else if (macro.arousal < 150) { | |||
| return "You run your fingers down your " + macro.describeDick + " shaft and grip your sheath, squeezing it gently."; | |||
| } else { | |||
| return "Trembling with your impending orgasm, your fingers play over your sheath."; | |||
| } | |||
| } | |||
| } | |||
| @@ -279,6 +308,13 @@ function defaultSheathCrush(container, macro, verbose) { | |||
| return "Your orgasm causes your " + macro.describeDick + " cock to swell, squeezing " + container.describe(false) + " out from your sheath."; | |||
| } | |||
| function defaultSheathAbsorb(container, macro, verbose) { | |||
| if (container.count > 0) | |||
| return "You grip your sheath and give it a firm <i>squeeze</i>, abruptly absorbing " + container.describe(false) + " into your musky body."; | |||
| else | |||
| return defaultSheathSqueeze(container, macro, verbose); | |||
| } | |||
| function defaultCockVore(container, macro, verbose) { | |||
| return "You stuff " + container.describe(verbose) + " into your throbbing shaft, forcing them down to your heavy balls."; | |||
| } | |||
| @@ -104,6 +104,7 @@ | |||
| <button class=action-button id=button-cleavage_stuff>Stuff Cleavage</button> | |||
| <button class=action-button id=button-cleavage_crush>Crush Cleavage</button> | |||
| <button class=action-button id=button-cleavage_drop>Drop Cleavage</button> | |||
| <button class=action-button id=button-cleavage_absorb>Absorb Cleavage</button> | |||
| <button class=action-button id=button-breast_crush>Breast Crush</button> | |||
| <button class=action-button id=button-breast_vore>Breast Vore</button> | |||
| <button class=action-button id=button-breast_milk>Milk Breasts</button> | |||
| @@ -114,6 +115,7 @@ | |||
| <div class=action-tab id=actions-dick> | |||
| <button class=action-button id=button-sheath_stuff>Stuff Sheath</button> | |||
| <button class=action-button id=button-sheath_squeeze>Squeeze Sheath</button> | |||
| <button class=action-button id=button-sheath_absorb>Absorb Sheath</button> | |||
| <button class=action-button id=button-cockslap>Cockslap</button> | |||
| <button class=action-button id=button-cock_vore>Cock Vore</button> | |||
| <button class=action-button id=button-ball_smother>Ball Smother</button> | |||
| @@ -242,10 +244,19 @@ | |||
| </div> | |||
| </div> | |||
| <br> | |||
| <li> | |||
| <label for="hasPouch">Pouch</label> | |||
| <input type="checkbox" name="hasPouch" checked=true /><br> | |||
| </li> | |||
| <br> | |||
| <div> | |||
| Male genitals:<br> | |||
| <input type="checkbox" checked=true name="maleParts"/><br> | |||
| <div class=reveal-if-active> | |||
| <li> | |||
| <label for="hasSheath">Sheath</label> | |||
| <input type="checkbox" name="hasSheath" checked=true /><br> | |||
| </li> | |||
| <li> | |||
| <label for="dickType">Cock type</label> | |||
| <input type="text" name="dickType" placeholder="canine"/><br> | |||