From 2c35b6b1d31b03b3d96e619039a0b554a50be7e3 Mon Sep 17 00:00:00 2001 From: Fen Dweller Date: Wed, 25 Apr 2018 11:33:05 -0400 Subject: [PATCH 1/8] Started Kuro --- alley.js | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 alley.js diff --git a/alley.js b/alley.js new file mode 100644 index 0000000..4d48f8c --- /dev/null +++ b/alley.js @@ -0,0 +1,53 @@ +public KuroLuxray() { + Creature.call(this, "Kuro", 20, 40, 20); + + this.hasName = true; + + this.description = function() { return "Kuro"; }; + + this.attacks.push(kuroPounce(this)); + this.attacks.push(kuroSit(this)); + this.attacks.push(kuroBat(this)); + + this.attacks.push(kuroLick(this)); + this.attacks.push(kuroKnead(this)); + this.attacks.push(kuroSlideSit(this)); + this.attacks.push(kuroOralVore(this)); + + this.attacks.push(kuroSmother(this)); + this.attacks.push(kuroAnalVore(this)); + + this.attacks.push(kuroSwallow(this)); + + this.attacks.push(kuroAnalPull(this)); + this.attacks.push(kuroAnalSqueeze(this)); + this.attacks.push(kuroAnalRest(this)); + + this.attacks.push(kuroDigest(this)); + + this.flags.state = "chase"; + + this.flags.distance = 6; + + this.playerAttacks = []; + + this.playerAttacks.push(pass); + + this.prefs.prey = false; +} + +function kuroBat(attacker) { + return { + attackPlayer: function(defender) { + let line = ["The Luxray leaps towards you and smacks you with his heavy paw.",newline]; + let choice = Math.random(); + + if (choice < 0.4) { + player.changeStamina(-25); + line.push("You're knocked sideways, tossed into the wall! The impact dazes you for a moment.") + } else if (choice < 0.75) { + player.changeStamina(-15); + } + } + } +} From 8dc184ab63723d50a6fcc46160dd03bd78c7c2e2 Mon Sep 17 00:00:00 2001 From: Fen Dweller Date: Wed, 25 Apr 2018 12:13:33 -0400 Subject: [PATCH 2/8] Working on Kuro more --- alley.js | 138 +++++++++++++++++++++++++++++++++++++++++++++++------ feast.html | 1 + world.js | 21 ++++++++ 3 files changed, 146 insertions(+), 14 deletions(-) diff --git a/alley.js b/alley.js index 4d48f8c..5ca6686 100644 --- a/alley.js +++ b/alley.js @@ -1,29 +1,31 @@ -public KuroLuxray() { +function KuroLuxray() { Creature.call(this, "Kuro", 20, 40, 20); this.hasName = true; this.description = function() { return "Kuro"; }; + this.attacks = []; + this.attacks.push(kuroPounce(this)); this.attacks.push(kuroSit(this)); this.attacks.push(kuroBat(this)); this.attacks.push(kuroLick(this)); - this.attacks.push(kuroKnead(this)); - this.attacks.push(kuroSlideSit(this)); - this.attacks.push(kuroOralVore(this)); + //this.attacks.push(kuroKnead(this)); + //this.attacks.push(kuroSlideSit(this)); + //this.attacks.push(kuroOralVore(this)); this.attacks.push(kuroSmother(this)); - this.attacks.push(kuroAnalVore(this)); + //this.attacks.push(kuroAnalVore(this)); - this.attacks.push(kuroSwallow(this)); + //this.attacks.push(kuroSwallow(this)); - this.attacks.push(kuroAnalPull(this)); - this.attacks.push(kuroAnalSqueeze(this)); - this.attacks.push(kuroAnalRest(this)); + //this.attacks.push(kuroAnalPull(this)); + //this.attacks.push(kuroAnalSqueeze(this)); + //this.attacks.push(kuroAnalRest(this)); - this.attacks.push(kuroDigest(this)); + //this.attacks.push(kuroDigest(this)); this.flags.state = "chase"; @@ -39,15 +41,123 @@ public KuroLuxray() { function kuroBat(attacker) { return { attackPlayer: function(defender) { - let line = ["The Luxray leaps towards you and smacks you with his heavy paw.",newline]; + let line = "The Luxray leaps towards you and smacks you with his heavy paw. "; let choice = Math.random(); if (choice < 0.4) { player.changeStamina(-25); - line.push("You're knocked sideways, tossed into the wall! The impact dazes you for a moment.") + line += "You're knocked sideways, tossed into the wall! The impact dazes you for a moment."; } else if (choice < 0.75) { player.changeStamina(-15); + let distance = Math.round(Math.random()*2+1); + attacker.flags.distance += distance; + line += "You tumble backwards, tossed between the lion's legs and thrown backward " + (distance == 1 ? "a foot" : "two feet") + "."; + } else { + player.changeStamina(-15); + attacker.flags.distance -= 1; + line += "He bats you from behind, sending you tumbling a foot forward."; + } + + return [line]; + }, + requirements: [ + function(attacker, defender) { + return attacker.flags.state == "chase"; + } + ], + priority: 1, + weight: function() { return 1; } + }; +} + +function kuroPounce(attacker) { + return { + attackPlayer: function(defender) { + let result = statHealthCheck(attacker, defender, "dex"); + + if (result) { + attacker.flags.state = "paws"; + return ["A scrape of claws on concrete precedes the looming shadow of the lion. You turn and gasp in surprise, trying to dive out of the way as he comes hurtling down towards you - but it's too late. Kuro lands hard on his forepaws, pinning you to the cold, damp pavement and smothering your body in those weighty toes."]; + } else { + return ["You hear the Luxray's claws scrape on the pavement as he pounces. It's just enough of a warning for you to dive out of the way. Heavy paws thump down on the ground, narrowly missing your body as you roll and get back to your feet."]; + } + }, + requirements: [ + function(attacker, defender) { + return attacker.flags.state == "chase"; + } + ], + priority: 1, + weight: function() { return 1; } + }; +} + +function kuroSit(attacker) { + return { + attackPlayer: function(defender) { + let success = statHealthCheck(attacker, defender, "dex"); + + if (success) { + attacker.flags.state = "sit"; + return ["You gasp as the Luxray saunters over you, his regal body blotting out the light from above. It seems like he's just...walking past? You slow and stop, gazing upward as his black-and-yellow body walks by - chest, then belly, then his half-erect shaft, and then...WHUMP. His hind legs bend as his hips slam down on your body, pinning you up against his heavy ass. A hot, musk-tinged pucker grinds over your snout as he lets out a satisfied purr."]; + } else { + return ["You gasp as the Luxray saunters right onto you - tongue lolling from his parted jaws, eyes briefly making contact with yours - before his head becomes obscured by his regal chest and belly. For a brief moment, you think he's just letting you go...and then you realize what's about to happen, lunging to the side a heartbeat before his hips slam down on the ground. A delighted purr is cut short as he looks to the side and sees you stumbling to your feet; the Luxray rises back up and snarls. He really does want you..."]; + } + + }, + requirements: [ + function(attacker, defender) { + return attacker.flags.state == "chase"; } - } - } + ], + priority: 1, + weight: function() { return 1; } + }; +} + +function kuroLick(attacker) { + return { + attackPlayer: function(defender) { + defender.changeStamina(-25); + + return ["The big cat's hot, pink tongue drags over your body as he savors your little squirmy body."]; + }, + requirements: [ + function(attacker, defender) { + return attacker.flags.state == "paws"; + } + ], + priority: 1, + weight: function(attacker, defender) { return defender.staminaPercentage(); } + }; +} + +function kuroSmother(attacker) { + return { + attackPlayer: function(defender) { + defender.changeStamina(-45); + + return ["Kuro's ass grinds over your pinned body, knocking the wind from your lungs"]; + }, + requirements: [ + function(attacker, defender) { + return attacker.flags.state == "sit"; + } + ], + priority: 1, + weight: function(attacker, defender) { return defender.staminaPercentage(); } + }; +} + +function template(attacker) { + return { + attackPlayer: function(defender) { + + }, + requirements: [ + + ], + priority: 1, + weight: function() { return 1; } + }; } diff --git a/feast.html b/feast.html index 39ca360..d50510e 100644 --- a/feast.html +++ b/feast.html @@ -6,6 +6,7 @@ Feast + diff --git a/world.js b/world.js index dde6f44..e4e6985 100644 --- a/world.js +++ b/world.js @@ -130,6 +130,27 @@ let locationsSrc = [ "name": "Seedy Bar", "dir": NORTH, "desc": "You step into the bar." + }, + { + "name": "Dark Alley", + "dir": WEST, + "desc": "You step into the darkness..." + } + ] + }, + { + "name": "Dark Alley", + "desc": "A dark, claustrophobic alley", + "conn": [ + { + "name": "Alley", + "dir": EAST, + "desc": "You emerge from the darkness" + } + ], + "hooks": [ + function() { + startCombat(new KuroLuxray()); } ] }, From 63c26538718482ad1e5d917586bdb99ac76dfc04 Mon Sep 17 00:00:00 2001 From: Fen Dweller Date: Wed, 25 Apr 2018 12:14:08 -0400 Subject: [PATCH 3/8] Adding health/stamina percent functions to master --- vore.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/vore.js b/vore.js index 8395598..ba17dd5 100644 --- a/vore.js +++ b/vore.js @@ -67,6 +67,14 @@ function Creature(name = "Creature", str = 10, dex = 10, con = 10) { this.healthRate = 1 / 86400 * 4; this.staminaRate = 1 / 86400 * 6; + this.healthPercentage = function() { + return this.health / this.maxHealth; + }; + + this.staminaPercentage = function() { + return this.stamina / this.maxStamina; + }; + this.restoreHealth = function(time) { this.health = Math.min(this.maxHealth, this.health + this.maxHealth * time * this.healthRate); }; From 6eb421ed45c4ecc6ad629e451bc54e908d069939 Mon Sep 17 00:00:00 2001 From: Fen Dweller Date: Wed, 25 Apr 2018 12:21:39 -0400 Subject: [PATCH 4/8] Basic oral/anal vore started --- alley.js | 43 +++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 41 insertions(+), 2 deletions(-) diff --git a/alley.js b/alley.js index 5ca6686..455b262 100644 --- a/alley.js +++ b/alley.js @@ -14,10 +14,10 @@ function KuroLuxray() { this.attacks.push(kuroLick(this)); //this.attacks.push(kuroKnead(this)); //this.attacks.push(kuroSlideSit(this)); - //this.attacks.push(kuroOralVore(this)); + this.attacks.push(kuroOralVore(this)); this.attacks.push(kuroSmother(this)); - //this.attacks.push(kuroAnalVore(this)); + this.attacks.push(kuroAnalVore(this)); //this.attacks.push(kuroSwallow(this)); @@ -132,6 +132,25 @@ function kuroLick(attacker) { }; } +function kuroOralVore(attacker) { + return { + attackPlayer: function(defender) { + attacker.flags.state = "oral"; + return ["Pinned and helpless, you can do little but squirm as the big cat's jaws lower to envelop you...hot, slimy tongue curling under your pinned body, cradling you in muscle and easing you into that powerful maw. He suckles on you for a long minute, sloshing you from side to side - savoring your fear, no doubt."]; + }, + requirements: [ + function(attacker, defender) { + return attacker.flags.state == "paws"; + }, + function(attacker, defender) { + return defender.prefs.prey && defender.prefs.vore.oral > 0; + } + ], + priority: 1, + weight: function() { return 1 - defender.staminaPercentage(); } + }; +} + function kuroSmother(attacker) { return { attackPlayer: function(defender) { @@ -149,6 +168,26 @@ function kuroSmother(attacker) { }; } +function kuroAnalVore(attacker) { + return { + attackPlayer: function(defender) { + attacker.flags.state = "anal"; + + return ["The heavy cat's weight shifts and slides...and his soft pucker takes you in. He eases himself down just an inch or two, enough to slide you entirely within...churring and swishing his tail as you're locked into his bitter, musky bowels."]; + }, + requirements: [ + function(attacker, defender) { + return attacker.flags.state == "sit"; + }, + function(attacker, defender) { + return defender.prefs.prey && defender.prefs.vore.anal > 0; + } + ], + priority: 1, + weight: function() { return 1; } + }; +} + function template(attacker) { return { attackPlayer: function(defender) { From 508b86977e6a07c46fb6df5697348979a2e128b3 Mon Sep 17 00:00:00 2001 From: Fen Dweller Date: Wed, 25 Apr 2018 14:15:51 -0400 Subject: [PATCH 5/8] Fleshed out oral and anal vore. Added some digestion --- alley.js | 180 +++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 167 insertions(+), 13 deletions(-) diff --git a/alley.js b/alley.js index 455b262..8933932 100644 --- a/alley.js +++ b/alley.js @@ -16,16 +16,18 @@ function KuroLuxray() { //this.attacks.push(kuroSlideSit(this)); this.attacks.push(kuroOralVore(this)); - this.attacks.push(kuroSmother(this)); + this.attacks.push(kuroAnalSmother(this)); this.attacks.push(kuroAnalVore(this)); - //this.attacks.push(kuroSwallow(this)); + this.attacks.push(kuroOralSuckle(this)); + this.attacks.push(kuroOralSwallow(this)); - //this.attacks.push(kuroAnalPull(this)); - //this.attacks.push(kuroAnalSqueeze(this)); + this.attacks.push(kuroAnalPull(this)); + this.attacks.push(kuroAnalSqueeze(this)); + this.attacks.push(kuroAnalIngest(this)); //this.attacks.push(kuroAnalRest(this)); - //this.attacks.push(kuroDigest(this)); + this.attacks.push(kuroStomachDigest(this)); this.flags.state = "chase"; @@ -36,6 +38,18 @@ function KuroLuxray() { this.playerAttacks.push(pass); this.prefs.prey = false; + + this.startCombat = function(player) { + player.flags.teases = 0; + return ["Vertigo abruptly overwhelms you. Stumbling and grasping for something to steady yourself with, you eventually find yourself lying on the floor...and only a few inches tall. You scramble to your feet, ears perking at the sound of footfalls. Alas, it is not a chance of rescue - rather, it's a massive black-and-yellow cat, skulking from the shadows and licking his lips."]; + }; + + this.finishCombat = function() { + switch(this.flags.state) { + case "stomach": + return ["You pass out in the Luxray's gut, gradually melting away..."]; + } + }; } function kuroBat(attacker) { @@ -66,7 +80,7 @@ function kuroBat(attacker) { } ], priority: 1, - weight: function() { return 1; } + weight: function(attacker, defender) { return 1; } }; } @@ -88,7 +102,7 @@ function kuroPounce(attacker) { } ], priority: 1, - weight: function() { return 1; } + weight: function(attacker, defender) { return 1; } }; } @@ -111,7 +125,7 @@ function kuroSit(attacker) { } ], priority: 1, - weight: function() { return 1; } + weight: function(attacker, defender) { return 1; } }; } @@ -136,6 +150,7 @@ function kuroOralVore(attacker) { return { attackPlayer: function(defender) { attacker.flags.state = "oral"; + attacker.flags.oralstage = 1; return ["Pinned and helpless, you can do little but squirm as the big cat's jaws lower to envelop you...hot, slimy tongue curling under your pinned body, cradling you in muscle and easing you into that powerful maw. He suckles on you for a long minute, sloshing you from side to side - savoring your fear, no doubt."]; }, requirements: [ @@ -147,11 +162,54 @@ function kuroOralVore(attacker) { } ], priority: 1, - weight: function() { return 1 - defender.staminaPercentage(); } + weight: function(attacker, defender) { return 1 - defender.staminaPercentage(); } + }; +} + +function kuroOralSuckle(attacker) { + return { + attackPlayer: function(defender) { + defender.changeStamina(-35); + + return ["Hot, wet flesh grinds over your body as Kuro slurps and sucks on your bite-sized frame."]; + }, + requirements: [ + function(attacker, defender) { + return attacker.flags.state == "oral"; + }, + function(attacker, defender) { + return attacker.flags.oralstage == 1; + } + ], + priority: 1, + weight: function(attacker, defender) { return 1; } + }; +} + + +function kuroOralSwallow(attacker) { + return { + attackPlayer: function(defender) { + attacker.flags.oralstage++; + + if (attacker.flags.oralstage == 2) { + return ["The Luxray flicks back his head, tossing you against the roof of that slimy, humid maw...and then letting you slide right down into his tight throat. A powerful glk of muscle grasps your body and sucks you down deep, your struggles forming faint bulges in the big cat's bared neck."]; + } else if (attacker.flags.oralstage == 3) { + attacker.flags.state = "stomach"; + return ["One final swallow tugs you down into Kuro's tight, sloppy stomach."]; + } + }, + requirements: [ + function(attacker, defender) { + return attacker.flags.state == "oral"; + } + ], + priority: 1, + weight: function(attacker, defender) { return 2/3; } }; } -function kuroSmother(attacker) { +function kuroAnalSmother(attacker) { return { attackPlayer: function(defender) { defender.changeStamina(-45); @@ -172,8 +230,9 @@ function kuroAnalVore(attacker) { return { attackPlayer: function(defender) { attacker.flags.state = "anal"; + attacker.flags.analstage = 1; - return ["The heavy cat's weight shifts and slides...and his soft pucker takes you in. He eases himself down just an inch or two, enough to slide you entirely within...churring and swishing his tail as you're locked into his bitter, musky bowels."]; + return ["The heavy cat's weight shifts and slides...and his soft pucker takes you in. He eases himself down just an inch or two, enough to slide your upper body within...churring and swishing his tail as you're locked into his bitter, musky bowels. He clenches firmly, sealing that donut around your hips and easing you further inside."]; }, requirements: [ function(attacker, defender) { @@ -184,10 +243,105 @@ function kuroAnalVore(attacker) { } ], priority: 1, - weight: function() { return 1; } + weight: function(attacker, defender) { return 1; } }; } +function kuroAnalPull(attacker) { + return { + attackPlayer: function(defender) { + attacker.flags.analstage++; + + if (attacker.flags.analstage == 2) { + return ["A slow, unstoppable squeeze drags you deeper into the Luxray's bowels."]; + } else if (attacker.flags.analstage == 3) { + return ["The fleshy walls grow tighter as you're clenched up against the big cat's small intestine."]; + } else if (attacker.flags.analstage == 4) { + return ["A wet shlllck fills your ears as you're sucked into tighter, mazelike guts, pressed and squeezed on from every direction..."]; + } else if (attacker.flags.analstage == 5) { + return ["You're dragged so very deep, disoriented and lost in a haze of musk and humidity. The walls ripple and clench with a slow, steady rhythm."]; + } else if (attacker.flags.analstage == 6) { + attacker.flags.state = "stomach"; + return ["Kuro's guts clench hard, squeezing you headfirst into his gurgling stomach and smothering you in sloppy flesh."]; + } + }, + requirements: [ + function(attacker, defender) { + return attacker.flags.state == "anal"; + } + ], + priority: 1, + weight: function(attacker, defender) { return 1; } + }; +} + +function kuroAnalSqueeze(attacker) { + return { + attackPlayer: function(defender) { + attack(attacker, defender, 15); + defender.changeStamina(-25); + + return pickRandom([ + ["Muscular walls clench and squeeze your little body, wearing you down."], + ["A long, drawn-out squeeze grips your body, smearing your face against those musky, meaty walls."], + ["Your body is bent and squeezed by unrelenting force."] + ]); + }, + requirements: [ + function(attacker, defender) { + return attacker.flags.state == "anal"; + } + ], + priority: 1, + weight: function(attacker, defender) { return 1; } + }; +} + +function kuroAnalIngest(attacker) { + return { + attackPlayer: function(defender) { + attacker.flags.analstage = 6; + attacker.flags.state = "stomach"; + + return ["Exhauted and beaten, you dimly feel yourself being dragged all the way into the cat's gut...sucked so very deep in one smooth, satisfying clench."]; + }, + requirements: [ + function(attacker, defender) { + return attacker.flags.state == "anal"; + }, + function(attacker, defender) { + return defender.health <= 0 || defender.stamina <= 0; + } + ], + priority: 2, + weight: function(attacker, defender) { return 1; } + }; +} +function kuroStomachDigest(attacker) { + return { + attackPlayer: function(defender) { + attack(attacker, defender, 33); + return pickRandom([ + ["Powerful muscle grinds and squeezes your body, wearing you down in the depths of the Luxray."], + ["You moan and whimper, smothered and squashed in a pit of flesh and frothy slime."], + ["The Luxray's stomach gurgles and bubbles as it melts you down."], + ["Hot flesh clenches all around, grinding your body into the acidic slime."], + ["A soft burp spills from the cat's jaws as he digests you down."], + ["Deep, thrumming purrs and thick, slimy sloshes are all you can hear in the Luxray's deepest depths..."] + ]); + }, + requirements: [ + function(attacker, defender) { + return attacker.flags.state == "stomach"; + } + ], + priority: 1, + weight: function(attacker, defender) { return 1; }, + gameover: function() { return "Shrunk down and digested by Kuro"; } + }; +} + + function template(attacker) { return { attackPlayer: function(defender) { @@ -197,6 +351,6 @@ function template(attacker) { ], priority: 1, - weight: function() { return 1; } + weight: function(attacker, defender) { return 1; } }; } From 75fda364d7f2fcd42b1fa6e0e9969a10c3f8762c Mon Sep 17 00:00:00 2001 From: Fen Dweller Date: Wed, 25 Apr 2018 15:11:12 -0400 Subject: [PATCH 6/8] Player struggles! --- alley.js | 289 ++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 285 insertions(+), 4 deletions(-) diff --git a/alley.js b/alley.js index 8933932..14b0154 100644 --- a/alley.js +++ b/alley.js @@ -1,5 +1,5 @@ function KuroLuxray() { - Creature.call(this, "Kuro", 20, 40, 20); + Creature.call(this, "Kuro", 25, 30, 25); this.hasName = true; @@ -12,7 +12,7 @@ function KuroLuxray() { this.attacks.push(kuroBat(this)); this.attacks.push(kuroLick(this)); - //this.attacks.push(kuroKnead(this)); + this.attacks.push(kuroKnead(this)); //this.attacks.push(kuroSlideSit(this)); this.attacks.push(kuroOralVore(this)); @@ -25,7 +25,6 @@ function KuroLuxray() { this.attacks.push(kuroAnalPull(this)); this.attacks.push(kuroAnalSqueeze(this)); this.attacks.push(kuroAnalIngest(this)); - //this.attacks.push(kuroAnalRest(this)); this.attacks.push(kuroStomachDigest(this)); @@ -35,6 +34,15 @@ function KuroLuxray() { this.playerAttacks = []; + this.playerAttacks.push(kuroPlayerRun); + this.playerAttacks.push(kuroPlayerEscape); + this.playerAttacks.push(kuroPlayerPawStruggle); + this.playerAttacks.push(kuroPlayerAssStruggle); + this.playerAttacks.push(kuroPlayerOralStruggle); + this.playerAttacks.push(kuroPlayerAnalStruggle); + this.playerAttacks.push(kuroPlayerStomachStruggleUp); + this.playerAttacks.push(kuroPlayerStomachStruggleDown); + this.playerAttacks.push(pass); this.prefs.prey = false; @@ -146,6 +154,23 @@ function kuroLick(attacker) { }; } +function kuroKnead(attacker) { + return { + attackPlayer: function(defender) { + defender.changeStamina(-45); + + return ["Heavy paws knead over your body, smothering you against the pavement."]; + }, + requirements: [ + function(attacker, defender) { + return attacker.flags.state == "paws"; + } + ], + priority: 1, + weight: function(attacker, defender) { return defender.staminaPercentage(); } + }; +} + function kuroOralVore(attacker) { return { attackPlayer: function(defender) { @@ -162,7 +187,7 @@ function kuroOralVore(attacker) { } ], priority: 1, - weight: function(attacker, defender) { return 1 - defender.staminaPercentage(); } + weight: function(attacker, defender) { return 2 - 1.5 * defender.staminaPercentage(); } }; } @@ -341,6 +366,262 @@ function kuroStomachDigest(attacker) { }; } +function kuroPlayerRun(attacker) { + return { + name: "Run", + desc: "Run away!", + attack: function(defender) { + defender.flags.distance -= 1; + + let line = pickRandom([ + ["You run towards the entrance of the alley, trying not to think about what'll happen if you trip..."], + ["Your tiny footsteps echo off the canyonlike walls of the alley."], + ["You sprint towards the relative safety of the street, panting and gasping as the cat's heavy footfalls keep pace behind you."] + ]); + + let distance = ""; + + if (defender.flags.distance > 5) { + distance = "You still have a long way to go."; + } else if (defender.flags.distance > 3) { + distance = "You're getting closer to freedom."; + } else if (defender.flags.distance > 1) { + distance = "You're only a dozen feet away now."; + } else if (defender.flags.distance == 1) { + distance = "Just a few more steps and you're free!"; + } else { + distance = "You're out of the alley! Now you just need to turn the corner..."; + } + + return line.concat(newline,distance); + }, + requirements: [ + function(attacker, defender) { + return defender.flags.state == "chase"; + }, + function(attacker, defender) { + return defender.flags.distance > 0; + } + ], + priority: 1, + weight: function(attacker, defender) { return 1; } + }; +} + +function kuroPlayerEscape(attacker) { + return { + name: "Escape", + desc: "Get away from the alley!", + attack: function(defender) { + changeMode("explore"); + moveToByName("North Street",""); + advanceTime(60 * 60 * 6 * (Math.random() + 0.2)); + attacker.health = attacker.maxHealth * 0.2; + attacker.stamina = attacker.maxStamina * 0.2; + return ["You turn the corner and flee, leaving the predatory cat behind. You stumble along for a few minutes before collapsing under a bench and passing out. When you awaken, you're back to normal size - and a little bit woozy feeling."]; + }, + requirements: [ + function(attacker, defender) { + return defender.flags.state == "chase"; + }, + function(attacker, defender) { + return defender.flags.distance <= 0; + } + ], + priority: 1, + weight: function(attacker, defender) { return 1; } + }; +} + +function kuroPlayerPawStruggle(attacker) { + return { + name: "Struggle", + desc: "Squirm under the Luxray's toes", + attack: function(defender) { + let result = statHealthCheck(attacker, defender, "str"); + + if (result) { + defender.flags.state = "chase"; + return ["You squirm out from beneath the Luxray's crushing paws!"]; + } else { + return ["You squirm and writhe...but get nowhere, pinned hard against the pavement."]; + } + }, + requirements: [ + function(attacker, defender) { + return defender.flags.state == "paws"; + }, function(attacker, defender) { + return attacker.health > 0 && attacker.stamina > 0; + } + ], + priority: 1, + weight: function(attacker, defender) { return 1; } + }; +} + +function kuroPlayerAssStruggle(attacker) { + return { + name: "Struggle", + desc: "Squirm under the Luxray's ass", + attack: function(defender) { + let result = statHealthCheck(attacker, defender, "str"); + + if (result) { + defender.flags.state = "chase"; + return ["You push and thrust and squeeze...and free yourself! The cat takes a moment to notice you've escaped, and you're back in a sprint by the time he's raised himself back up."]; + } else { + return ["You push and shove and writhe...and do nothing but pleasure Kuro, smearing your face in his bitter pucker."]; + } + }, + requirements: [ + function(attacker, defender) { + return defender.flags.state == "sit"; + }, function(attacker, defender) { + return attacker.health > 0 && attacker.stamina > 0; + } + ], + priority: 1, + weight: function(attacker, defender) { return 1; } + }; +} + +function kuroPlayerOralStruggle(attacker) { + return { + name: "Struggle", + desc: "Try to escape the Luxray's gullet...", + attack: function(defender) { + let result = statHealthCheck(attacker, defender, "str"); + + if (result) { + defender.flags.oralstage--; + + if (defender.flags.oralstage == 0) { + defender.flags.state = "paws"; + return ["You strain and struggle to push open those massive jaws...and succeed! Your soaking-wet body tumbles to the ground as you force the cat to spit you own.",newline,"The cat promptly stomps on you."]; + } else if (defender.flags.oralstage == 1 ) { + return ["Your struggles bear fruit, and you manage to drag yourself back up the cat's throat, much to his surprise."]; + } + } else { + return ["You struggle and grind against slick flesh...to no avail."]; + } + }, + requirements: [ + function(attacker, defender) { + return defender.flags.state == "oral"; + }, function(attacker, defender) { + return attacker.health > 0 && attacker.stamina > 0; + } + ], + priority: 1, + weight: function(attacker, defender) { return 1; } + }; +} + + +function kuroPlayerAnalStruggle(attacker) { + return { + name: "Struggle", + desc: "Writhe in the Luxray's ass", + attack: function(defender) { + let result = statHealthCheck(attacker, defender, "str"); + + if (result) { + defender.flags.analstage--; + + if (defender.flags.analstage == 0) { + defender.flags.state = "sit"; + return ["You give one last mighty heave, pushing yourself out from Kuro's pucker and falling to the ground.",newline,"A moment later, his ass lands hard on you, pinning you hard."]; + } else if (defender.flags.analstage == 1) { + return ["You're so very close now. You squirm and press, shoving your lower body back out of the Luxray's ass."]; + } else if (defender.flags.analstage == 2) { + return ["You push yourself against arching walls of muscle, workign you way out of the Luxray's bowels bit-by-bit. You pray you're going the right direction..."]; + } else if (defender.flags.analstage == 3) { + return ["You slide from Kuro's small intestine. At least you have more room to breathe now."]; + } else if (defender.flags.analstage == 4) { + return ["The cat's guts are tangled and winding. You blindly squirm and struggle, making slow, steady progress against those waves of peristalsis."]; + } else if (defender.flags.analstage == 5) { + return ["You drag yourself away from the upper half of the cat's small intestine...but there's so very far to go."]; + } + } else { + return ["You struggle and grind against slick muscle...to no avail."]; + } + }, + requirements: [ + function(attacker, defender) { + return defender.flags.state == "anal"; + }, function(attacker, defender) { + return attacker.health > 0 && attacker.stamina > 0; + } + ], + priority: 1, + weight: function(attacker, defender) { return 1; } + }; +} + + +function kuroPlayerStomachStruggleUp(attacker) { + return { + name: "Struggle up!", + desc: "Try to escape before you're digested by pushing into Kuro's throat.", + attack: function(defender) { + let result = statHealthCheck(attacker, defender, "str"); + + if (result) { + defender.flags.state = "oral"; + defender.flags.oralstage = 2; + return ["You grip the tight sphincter at the top of the cat's stomach and pull with all your might...and pry it open! You shove your head and shoulders in, pulling the rest of your body into the cat's ripppling throat as it tries to pack you back down."]; + } else { + return pickRandom([ + ["You shove both hands into the tight ring of muscle locking you in that wretched stomach and pull...and get nowhere."], + ["You're too busy being mashed up by crushing peristalsis to struggle."], + ["You try to find your footing to push into the cat's throat. A lazy roll and belch throws you into the chyme."] + ]); + } + }, + requirements: [ + function(attacker, defender) { + return defender.flags.state == "stomach"; + }, function(attacker, defender) { + return attacker.health > 0 && attacker.stamina > 0; + } + ], + priority: 1, + weight: function(attacker, defender) { return 1; } + }; +} + + +function kuroPlayerStomachStruggleDown(attacker) { + return { + name: "Struggle down!", + desc: "Try to escape before you're digested by pushing into Kuro's bowels.", + attack: function(defender) { + let result = statHealthCheck(attacker, defender, "str"); + + if (result) { + defender.flags.state = "anal"; + defender.flags.analstage = 4; + return ["You grip the tight sphincter at the bottom of the cat's stomach and pull with all your might...and pry it open! Your entire body plunges in in an instant, and you're now sealed into the cat's intestines. Was this really such a good idea...?"]; + } else { + return pickRandom([ + ["You shove both hands into the tight ring of muscle locking you in that wretched stomach and pull...and get nowhere."], + ["You're too busy being mashed up by crushing peristalsis to struggle."], + ["You try to find your footing to push into the cat's guts. A lazy roll and belch throws you into the chyme."] + ]); + } + }, + requirements: [ + function(attacker, defender) { + return defender.flags.state == "stomach"; + }, function(attacker, defender) { + return attacker.health > 0 && attacker.stamina > 0; + } + ], + priority: 1, + weight: function(attacker, defender) { return 1; } + }; +} + function template(attacker) { return { From fd72019909b295ce9eabc086a1770071948e2ca6 Mon Sep 17 00:00:00 2001 From: Fen Dweller Date: Wed, 25 Apr 2018 15:41:39 -0400 Subject: [PATCH 7/8] Player oral/anal prefs better respected now --- alley.js | 37 +++++++++++++++++-------------------- world.js | 3 ++- 2 files changed, 19 insertions(+), 21 deletions(-) diff --git a/alley.js b/alley.js index 14b0154..d555f52 100644 --- a/alley.js +++ b/alley.js @@ -13,7 +13,6 @@ function KuroLuxray() { this.attacks.push(kuroLick(this)); this.attacks.push(kuroKnead(this)); - //this.attacks.push(kuroSlideSit(this)); this.attacks.push(kuroOralVore(this)); this.attacks.push(kuroAnalSmother(this)); @@ -107,6 +106,9 @@ function kuroPounce(attacker) { requirements: [ function(attacker, defender) { return attacker.flags.state == "chase"; + }, + function(attacker, defender) { + return defender.prefs.prey && defender.prefs.vore.oral > 0; } ], priority: 1, @@ -130,6 +132,9 @@ function kuroSit(attacker) { requirements: [ function(attacker, defender) { return attacker.flags.state == "chase"; + }, + function(attacker, defender) { + return defender.prefs.prey && defender.prefs.vore.anal > 0; } ], priority: 1, @@ -187,7 +192,7 @@ function kuroOralVore(attacker) { } ], priority: 1, - weight: function(attacker, defender) { return 2 - 1.5 * defender.staminaPercentage(); } + weight: function(attacker, defender) { return 2 - 1 * defender.staminaPercentage(); } }; } @@ -207,11 +212,10 @@ function kuroOralSuckle(attacker) { } ], priority: 1, - weight: function(attacker, defender) { return 1; } + weight: function(attacker, defender) { return defender.staminaPercentage() * 1.25; } }; } - function kuroOralSwallow(attacker) { return { attackPlayer: function(defender) { @@ -268,7 +272,7 @@ function kuroAnalVore(attacker) { } ], priority: 1, - weight: function(attacker, defender) { return 1; } + weight: function(attacker, defender) { return 2 - defender.staminaPercentage(); } }; } @@ -581,8 +585,12 @@ function kuroPlayerStomachStruggleUp(attacker) { requirements: [ function(attacker, defender) { return defender.flags.state == "stomach"; - }, function(attacker, defender) { + }, + function(attacker, defender) { return attacker.health > 0 && attacker.stamina > 0; + }, + function(attacker, defender) { + return attacker.prefs.vore.oral > 0; } ], priority: 1, @@ -615,23 +623,12 @@ function kuroPlayerStomachStruggleDown(attacker) { return defender.flags.state == "stomach"; }, function(attacker, defender) { return attacker.health > 0 && attacker.stamina > 0; + }, + function(attacker, defender) { + return attacker.prefs.vore.anal > 0; } ], priority: 1, weight: function(attacker, defender) { return 1; } }; } - - -function template(attacker) { - return { - attackPlayer: function(defender) { - - }, - requirements: [ - - ], - priority: 1, - weight: function(attacker, defender) { return 1; } - }; -} diff --git a/world.js b/world.js index e4e6985..d70740d 100644 --- a/world.js +++ b/world.js @@ -150,7 +150,8 @@ let locationsSrc = [ ], "hooks": [ function() { - startCombat(new KuroLuxray()); + if (player.prefs.prey && (player.prefs.vore.oral > 0 || player.prefs.vore.anal > 0)) + startCombat(new KuroLuxray()); } ] }, From 5638ba121c7bf46ef7972fca6452fc866354ce07 Mon Sep 17 00:00:00 2001 From: Fen Dweller Date: Wed, 25 Apr 2018 15:44:00 -0400 Subject: [PATCH 8/8] Fixed overlapping stat thing. v0.2.7 --- feast.css | 2 +- feast.html | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/feast.css b/feast.css index 838eb7c..487afc7 100644 --- a/feast.css +++ b/feast.css @@ -133,7 +133,7 @@ button { } #player-stats { - height: 65%; + height: 75%; } #foe-stats { diff --git a/feast.html b/feast.html index d50510e..fe64485 100644 --- a/feast.html +++ b/feast.html @@ -29,7 +29,7 @@
- Welcome to Feast v0.2.6 + Welcome to Feast v0.2.7
  @@ -168,7 +168,7 @@

- Welcome to Feast v0.2.6 + Welcome to Feast v0.2.7