From 9b68b50b0ccdc9eacfcc93468ddfd28a171a395d Mon Sep 17 00:00:00 2001 From: Fen Dweller Date: Wed, 14 Mar 2018 17:42:18 -0400 Subject: [PATCH] Geta is edible. Updated preferences so that enemies can have prefs, too. --- combat.js | 52 ++++++++++++++++++++++++++++++++++++++++++++++------ customs.js | 9 +++++++-- feast.html | 8 ++++---- feast.js | 20 +++++++------------- objects.js | 2 +- vore.js | 10 ++++++++++ 6 files changed, 75 insertions(+), 26 deletions(-) diff --git a/combat.js b/combat.js index 94d8f72..5b98cc2 100644 --- a/combat.js +++ b/combat.js @@ -122,9 +122,9 @@ function grappleDevour(attacker) { return attacker.description("The") + " tries to swallow you down, but you manage to resist their hunger."; } }, requirements: [ - function(attacker, defender) { return isNormal(attacker) && isGrappled(defender); } + function(attacker, defender) { return isNormal(attacker) && isGrappled(defender) && defender.flags.shrunk != true; } ], conditions: [ - function(prefs, player=false) { return player || prefs.player.prey; } + function(attacker, defender) { return defender.prefs.prey; } ], priority: 1, }; @@ -145,9 +145,9 @@ function grappleAnalVore(attacker) { return "Your grasp and shove " + defender.description("the") + ", but they manage to avoid becoming " + attacker.species + " chow."; } }, requirements: [ - function(attacker, defender) { return isNormal(attacker) && isGrappled(defender); } + function(attacker, defender) { return isNormal(attacker) && isGrappled(defender) && defender.flags.shrunk != true ; } ], conditions: [ - function(prefs, player=false) { return player || prefs.player.prey; } + function(attacker, defender) { return defender.prefs.prey && defender.prefs.analVore; } ], priority: 1, }; @@ -227,6 +227,46 @@ function grappledReverse(attacker) { }; } +function shrunkGrapple(attacker) { + return { + name: "Grab", + desc: "Grab this fun-sized snack", + attack: function(defender) { + let success = statCheck(attacker, defender, "dex") || statCheck(attacker, defender, "dex"); + if (success) { + defender.flags.grappled = true; + return "You snatch up " + defender.description("the"); + } else { + return "You try to grab " + defender.description("the") + ", but they elude your grasp."; + } + }, + requirements: [ + function(attacker, defender) { + return isNormal(attacker) && defender.flags.grappled != true && defender.flags.shrunk == true; + } + ], + priority: 2 + }; +} + +function shrunkSwallow(attacker) { + return { + name: "Swallow", + desc: "Swallow your prey", + attack: function(defender) { + changeMode("explore"); + attacker.stomach.feed(defender); + return "With a light swallow, " + defender.description("the") + " is dragged down to your sloppy guts."; + }, + requirements: [ + function(attacker, defender) { + return isNormal(attacker) && defender.flags.grappled == true && defender.flags.shrunk == true; + } + ], + priority: 2 + }; +} + function flee(attacker) { return { name: "Flee", @@ -234,7 +274,7 @@ function flee(attacker) { attack: function(defender) { let success = statCheck(attacker, defender, "dex"); if (success) { - attacker.flags.grappled = false; + attacker.clear(); changeMode("explore"); return "You successfully run away."; } else { @@ -265,7 +305,7 @@ function devourPlayer(attacker) { name: "Devours YOU!", desc: "You won't see this", conditions: [ - function(prefs) { return prefs.player.prey; } + function(attacker, defender) { return defender.prefs.prey; } ], requirements: [ function(attacker, defender) { return attacker.leering == true; } diff --git a/customs.js b/customs.js index 2633fae..1f8e585 100644 --- a/customs.js +++ b/customs.js @@ -26,16 +26,21 @@ function Geta() { this.struggles = []; this.struggles.push(new rub(this)); + + this.prefs.analVore = false; } function getaShrink(attacker) { return { attackPlayer: function(defender) { - let success = true; + let success = Math.random() < 0.5; if (success) { defender.flags.shrunk = true; return attacker.description() + " pulls a strange device from his pocket and points it at you. A blinding flash envelops your vision...and as your sight returns, you find yourself shrunken down to no more than two inches tall."; + } else { + attacker.flags.shrunk = true; + return attacker.description() + " pulls a strange device from his pocket and points it at you. A blinding flash envelops your vision...and as your sight returns, you see that he's shrunk himself!"; } }, requirements: [ @@ -55,7 +60,7 @@ function getaGrab(attacker) { }, conditions: [ function(prefs) { - return prefs.player.prey; + return prefs.prey; } ], requirements: [ diff --git a/feast.html b/feast.html index eb5c354..e7e2e5a 100644 --- a/feast.html +++ b/feast.html @@ -145,12 +145,12 @@
  • - - + +
  • - - + +
  • diff --git a/feast.js b/feast.js index 5dfff5c..75b8f30 100644 --- a/feast.js +++ b/feast.js @@ -15,12 +15,6 @@ let playerAttacks = []; let respawnRoom; -let prefs = { - player: { - prey: true - } -}; - function join(things) { if (things.length == 1) { return things[0].description("a"); @@ -58,7 +52,7 @@ function pick(list, attacker, defender) { } function filterValid(options, attacker, defender) { - let filtered = options.filter(option => option.conditions == undefined || option.conditions.reduce((result, test) => result && test(prefs, attacker === player), true)); + let filtered = options.filter(option => option.conditions == undefined || option.conditions.reduce((result, test) => result && test(attacker, defender), true)); return filtered.filter(option => option.requirements == undefined || option.requirements.reduce((result, test) => result && test(attacker, defender), true)); } @@ -82,7 +76,7 @@ function updateExploreCompass() { button.classList.add("inactive-button"); button.innerHTML = ""; } else { - if (currentRoom.exits[i].conditions.reduce((result, test) => result && test(prefs), true)) { + if (currentRoom.exits[i].conditions.reduce((result, test) => result && test(player.prefs), true)) { button.disabled = false; button.classList.add("active-button"); button.innerHTML = currentRoom.exits[i].name; @@ -208,7 +202,7 @@ function updateDisplay() { document.getElementById("stat-health").innerHTML = "Health: " + round(player.health,0) + "/" + round(player.maxHealth,0); document.getElementById("stat-stamina").innerHTML = "Stamina: " + round(player.stamina,0) + "/" + round(player.maxStamina,0); document.getElementById("stat-fullness").innerHTML = "Fullness: " + round(player.fullness(),0); - if (prefs.player.scat) { + if (player.prefs.scat) { document.getElementById("stat-bowels").innerHTML = "Bowels: " + round(player.bowels.fullness,0); } else { document.getElementById("stat-bowels").innerHTML = ""; @@ -252,7 +246,7 @@ function moveTo(room,desc="You go places lol") { currentRoom.objects.forEach(function (object) { object.actions.forEach(function (action) { - if (action.conditions == undefined || action.conditions.reduce((result, cond) => result && cond(prefs), true)) + if (action.conditions == undefined || action.conditions.reduce((result, cond) => result && cond(player.prefs), true)) actions.push(action); }); }); @@ -315,7 +309,7 @@ function applySettings(settings) { if (settings.hasOwnProperty(key)) { if (key.match(/prefs/)) { let tokens = key.split("-"); - let pref = prefs; + let pref = player.prefs; pref = tokens.slice(1,-1).reduce((pref, key) => pref[key], pref); pref[tokens.slice(-1)[0]] = settings[key]; } @@ -396,7 +390,7 @@ function attackClicked(index) { if (player.health <= 0) { update(["You die..."]); - if (prefs.player.prey) { + if (player.prefs.prey) { changeMode("eaten"); } else { respawn(respawnRoom); @@ -419,7 +413,7 @@ function struggleClicked(index) { if (result.escape) { changeMode("explore"); } else { - let digest = pick(filterValid(currentFoe.digests, currentFoe, player), currentFoe, player); + let digest = pick(filterValid(currentFoe.digests, FurrentFoe, player), currentFoe, player); if (digest == null) { digest = currentFoe.backupDigest; diff --git a/objects.js b/objects.js index 7fd06bf..b7d1125 100644 --- a/objects.js +++ b/objects.js @@ -57,7 +57,7 @@ function Toilet() { }, "conditions": [ function(prefs) { - return prefs.player.scat == true; + return prefs.scat == true; } ] }); diff --git a/vore.js b/vore.js index 1ccb953..e70a891 100644 --- a/vore.js +++ b/vore.js @@ -37,6 +37,12 @@ function Creature(name = "Creature", str=10, dex=10, con=10) { this.clear = function() { this.flags = {}; }; + + this.prefs = { + prey: true, + scat: true, + analVore: true + } } function Player(name = "Player") { @@ -56,6 +62,10 @@ function Player(name = "Player") { this.attacks.push(new grappledStruggle(this)); this.attacks.push(new grappledReverse(this)); + + this.attacks.push(new shrunkGrapple(this)); + this.attacks.push(new shrunkSwallow(this)); + this.attacks.push(new flee(this)); this.backupAttack = new pass(this);