| @@ -206,7 +206,7 @@ function grappleAnalVore(attacker) { | |||
| if (success) { | |||
| attacker.changeStamina(-10); | |||
| defender.changeStamina(-25); | |||
| attacker.butt.feed(defender); | |||
| attacker.bowels.feed(defender); | |||
| defender.flags.grappled = false; | |||
| attacker.cash += defender.cash; | |||
| changeMode("explore"); | |||
| @@ -257,9 +257,9 @@ function updateDisplay() { | |||
| document.getElementById("stat-str").innerHTML = "Str: " + player.str; | |||
| document.getElementById("stat-dex").innerHTML = "Dex: " + player.dex; | |||
| document.getElementById("stat-con").innerHTML = "Con: " + player.con; | |||
| document.getElementById("stat-fullness").innerHTML = "Fullness: " + round(player.fullness(),0); | |||
| document.getElementById("stat-fullness").innerHTML = "Stomach: " + round(player.stomach.fullness(),0) + "/" + player.stomach.capacity; | |||
| if (player.prefs.scat) { | |||
| document.getElementById("stat-bowels").innerHTML = "Bowels: " + round(player.bowels.fullness,0); | |||
| document.getElementById("stat-bowels").innerHTML = "Bowels: " + round(player.bowels.fullness(),0) + "/" + player.bowels.capacity; | |||
| } else { | |||
| document.getElementById("stat-bowels").innerHTML = ""; | |||
| } | |||
| @@ -279,7 +279,7 @@ function advanceTime(amount) { | |||
| player.restoreHealth(amount); | |||
| player.restoreStamina(amount); | |||
| update(player.stomach.digest(amount)); | |||
| update(player.butt.digest(amount)); | |||
| update(player.bowels.digest(amount)); | |||
| update(player.balls.digest(amount)); | |||
| update(player.womb.digest(amount)); | |||
| update(player.breasts.digest(amount)); | |||
| @@ -522,7 +522,7 @@ function respawn(respawnRoom) { | |||
| moveTo(respawnRoom,"You drift through space and time..."); | |||
| player.clear(); | |||
| player.stomach.contents = []; | |||
| player.butt.contents = []; | |||
| player.bowels.contents = []; | |||
| player.bowels.digested = []; | |||
| player.bowels.fullness = 0; | |||
| advanceTime(Math.floor(86400 / 2 * (Math.random() * 0.5 - 0.25 + 1))); | |||
| @@ -726,10 +726,10 @@ function status() { | |||
| lines.push(newline); | |||
| } | |||
| if (player.butt.contents.length > 0) { | |||
| if (player.bowels.contents.length > 0) { | |||
| lines.push("Your bowels churn with prey."); | |||
| player.butt.contents.map(function(prey) { | |||
| player.bowels.contents.map(function(prey) { | |||
| let state = ""; | |||
| let healthRatio = prey.health / prey.maxHealth; | |||
| @@ -773,7 +773,7 @@ function status() { | |||
| }); | |||
| lines.push(newline); | |||
| } else { | |||
| if (player.balls.fullness > 0) { | |||
| if (player.balls.waste > 0) { | |||
| lines.push("Your balls are heavy with cum."); | |||
| lines.push(newline); | |||
| } | |||
| @@ -803,7 +803,7 @@ function status() { | |||
| }); | |||
| lines.push(newline); | |||
| } else { | |||
| if (player.womb.fullness > 0) { | |||
| if (player.womb.waste > 0) { | |||
| lines.push("Your slit drips, holding back a tide of femcum."); | |||
| lines.push(newline); | |||
| } | |||
| @@ -833,7 +833,7 @@ function status() { | |||
| }); | |||
| lines.push(newline); | |||
| } else { | |||
| if (player.breasts.fullness > 0) { | |||
| if (player.breasts.waste > 0) { | |||
| lines.push("Your breasts slosh with milk."); | |||
| lines.push(newline); | |||
| } | |||
| @@ -7,7 +7,7 @@ function ForestExplore() { | |||
| let outcome = Math.random(); | |||
| advanceTime(60*30 * (Math.random() * 0.2 + 0.9)); | |||
| if (outcome < 0.25) { | |||
| if (outcome < 0.35) { | |||
| currentRoom.flags.exit = true; | |||
| update(["You find a way back!"]); | |||
| } else if (outcome < 0.5) { | |||
| @@ -59,6 +59,7 @@ function Wolf() { | |||
| this.digests = []; | |||
| this.digests.push(wolfDigest(this)); | |||
| this.digests.push(wolfBelch(this)); | |||
| this.flags.stage = "combat"; | |||
| @@ -106,6 +107,7 @@ function AlphaWolf() { | |||
| this.digests = []; | |||
| this.digests.push(wolfDigest(this)); | |||
| this.digests.push(wolfBelch(this)); | |||
| this.flags.stage = "combat"; | |||
| @@ -272,3 +274,21 @@ function wolfDigest(attacker) { | |||
| gameover: function() { return "Digested by " + attacker.description("a"); } | |||
| }; | |||
| } | |||
| function wolfBelch(attacker) { | |||
| return { | |||
| digest: function(defender){ | |||
| defender.stamina -= 50; | |||
| let damage = attack(attacker, defender, attacker.str * 2); | |||
| return [attacker.description("The") + " lets out a crass <i>BELCH</i>, draining air from its snarling gut and squeezing you even tighter than before."]; | |||
| }, | |||
| requirements: [ | |||
| function(attacker, defender) { | |||
| return attacker.flags.stage == "oral"; | |||
| } | |||
| ], | |||
| priority: 1, | |||
| weight: function(attacker, defender) { return 1; }, | |||
| gameover: function() { return "Reduced to a belch by " + attacker.description("a"); } | |||
| }; | |||
| } | |||
| @@ -30,11 +30,11 @@ function Toilet() { | |||
| lines.push("You sit down on the toilet."); | |||
| if (player.bowels.fullness == 0) { | |||
| if (player.bowels.waste == 0) { | |||
| lines.push("But nothing happens."); | |||
| } else { | |||
| lines.push("You grunt and clench, squeezing out the remains of your former prey."); | |||
| player.bowels.fullness = 0; | |||
| player.bowels.waste = 0; | |||
| } | |||
| if (player.bowels.digested.length > 0) { | |||
| @@ -136,10 +136,6 @@ function Creature(name = "Creature", str = 10, dex = 10, con = 10) { | |||
| function Player(name = "Player") { | |||
| Creature.call(this, name, 15, 15, 15); | |||
| this.fullness = function() { | |||
| return this.stomach.fullness() + this.butt.fullness(); | |||
| }; | |||
| this.attacks.push(punchAttack(this)); | |||
| this.attacks.push(flankAttack(this)); | |||
| @@ -166,9 +162,9 @@ function Player(name = "Player") { | |||
| this.cash = 100; | |||
| this.bowels = new Bowels(); | |||
| this.stomach = new Stomach(this, this.bowels); | |||
| this.butt = new Butt(this, this.bowels, this.stomach); | |||
| this.stomach = new Stomach(this); | |||
| this.bowels = new Bowels(this, this.stomach); | |||
| this.stomach.bowels = this.bowels; | |||
| this.balls = new Balls(this); | |||
| this.womb = new Womb(this); | |||
| this.breasts = new Breasts(this); | |||
| @@ -292,11 +288,17 @@ function Micro() { | |||
| function Container(owner) { | |||
| this.owner = owner; | |||
| this.contents = []; | |||
| this.waste = 0; | |||
| this.digested = []; | |||
| // health/sec | |||
| this.damageRate = 15 * 100 / 86400; | |||
| // health percent/sec | |||
| this.damageRatePercent = 1 / 86400; | |||
| this.capacity = 100; | |||
| // kg/sec | |||
| this.digestRate = 80 / 8640; | |||
| @@ -346,15 +348,22 @@ function Container(owner) { | |||
| }; | |||
| this.fullness = function() { | |||
| return this.contents.reduce((total, prey) => total + prey.mass, 0); | |||
| return this.contents.reduce((total, prey) => total + prey.mass, 0) + this.waste; | |||
| }; | |||
| this.add = function(amount) { | |||
| this.waste += amount; | |||
| }; | |||
| this.finish = function(prey) { | |||
| if (prey.prefs.scat) | |||
| this.digested.push(prey); | |||
| }; | |||
| } | |||
| function Stomach(owner, bowels) { | |||
| function Stomach(owner) { | |||
| Container.call(this, owner); | |||
| this.bowels = bowels; | |||
| this.describeDamage = function(prey) { | |||
| return "Your guts gurgle and churn, slowly wearing down " + prey.description("the") + " trapped within."; | |||
| }; | |||
| @@ -376,29 +385,28 @@ function Stomach(owner, bowels) { | |||
| }; | |||
| } | |||
| function Butt(owner, bowels, stomach) { | |||
| function Bowels(owner, stomach) { | |||
| Container.call(this, owner); | |||
| this.bowels = bowels; | |||
| this.stomach = stomach; | |||
| this.parentDigest = this.digest; | |||
| this.digest = function(time) { | |||
| this.contents.forEach(function(x) { | |||
| x.timeInButt += time; | |||
| x.timeInBowels += time; | |||
| }); | |||
| let lines = this.parentDigest(time); | |||
| let pushed = this.contents.filter(prey => prey.timeInButt >= 60 * 30); | |||
| let pushed = this.contents.filter(prey => prey.timeInBowels >= 60 * 30); | |||
| pushed.forEach(function(x) { | |||
| this.stomach.feed(x); | |||
| lines.push("Your winding guts squeeze " + x.description("the") + " into your stomach."); | |||
| }, this); | |||
| this.contents = this.contents.filter(prey => prey.timeInButt < 60 * 30); | |||
| this.contents = this.contents.filter(prey => prey.timeInBowels < 60 * 30); | |||
| return lines; | |||
| }; | |||
| @@ -418,39 +426,21 @@ function Butt(owner, bowels, stomach) { | |||
| this.parentFeed = this.feed; | |||
| this.feed = function(prey) { | |||
| prey.timeInButt = 0; | |||
| prey.timeInBowels = 0; | |||
| this.parentFeed(prey); | |||
| }; | |||
| this.fill = function(amount) { | |||
| this.bowels.add(amount); | |||
| }; | |||
| this.finish = function(prey) { | |||
| this.bowels.finish(prey); | |||
| }; | |||
| } | |||
| function WasteContainer(name) { | |||
| this.name = name; | |||
| this.fullness = 0; | |||
| this.digested = []; | |||
| this.add = function(amount) { | |||
| this.fullness += amount; | |||
| this.add(amount); | |||
| }; | |||
| this.finish = function(prey) { | |||
| if (prey.prefs.scat) | |||
| this.digested.push(prey); | |||
| this.digested.push(prey); | |||
| }; | |||
| } | |||
| function Balls(owner) { | |||
| Container.call(this, owner); | |||
| WasteContainer.call(this, "Balls"); | |||
| this.describeDamage = function(prey) { | |||
| return "Your balls slosh as they wear down the " + prey.description("the") + " trapped within."; | |||
| @@ -469,14 +459,12 @@ function Balls(owner) { | |||
| }; | |||
| this.finish = function(prey) { | |||
| if (prey.prefs.scat) | |||
| this.digested.push(prey); | |||
| this.digested.push(prey); | |||
| }; | |||
| } | |||
| function Womb(owner) { | |||
| Container.call(this, owner); | |||
| WasteContainer.call(this, "Womb"); | |||
| this.describeDamage = function(prey) { | |||
| return "You shiver as " + prey.description("the") + " squrims within your womb."; | |||
| @@ -495,14 +483,12 @@ function Womb(owner) { | |||
| }; | |||
| this.finish = function(prey) { | |||
| if (prey.prefs.scat) | |||
| this.digested.push(prey); | |||
| this.digested.push(prey); | |||
| }; | |||
| } | |||
| function Breasts(owner) { | |||
| Container.call(this, owner); | |||
| WasteContainer.call(this, "Breasts"); | |||
| this.describeDamage = function(prey) { | |||
| return "Your breasts slosh from side to side, steadily softening " + prey.description("the") + " trapped within."; | |||
| @@ -521,15 +507,10 @@ function Breasts(owner) { | |||
| }; | |||
| this.finish = function(prey) { | |||
| if (prey.prefs.scat) | |||
| this.digested.push(prey); | |||
| this.digested.push(prey); | |||
| }; | |||
| } | |||
| function Bowels() { | |||
| WasteContainer.call(this, "Bowels"); | |||
| } | |||
| // PLAYER PREY | |||
| function plead(predator) { | |||