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