| @@ -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; } | |||
| @@ -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: [ | |||
| @@ -145,12 +145,12 @@ | |||
| <input type="text" id="character-species" name="species" placeholder="nerd"/> | |||
| </li> | |||
| <li> | |||
| <label for="character-prefs-player-prey">Player can be eaten</label> | |||
| <input type="checkbox" id="character-prefs-player-prey" name="prefs-player-prey" checked=true /> | |||
| <label for="character-prefs-prey">Player can be eaten</label> | |||
| <input type="checkbox" id="character-prefs-prey" name="prefs-prey" checked=true /> | |||
| <li> | |||
| <li> | |||
| <label for="character-prefs-player-scat">Disposal/scat</label> | |||
| <input type="checkbox" id="character-prefs-player-scat" name="prefs-player-scat"/> | |||
| <label for="character-prefs-scat">Disposal/scat</label> | |||
| <input type="checkbox" id="character-prefs-scat" name="prefs-scat"/> | |||
| <li> | |||
| <button type="button" id="start-button">Start</button> | |||
| </li> | |||
| @@ -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; | |||
| @@ -57,7 +57,7 @@ function Toilet() { | |||
| }, | |||
| "conditions": [ | |||
| function(prefs) { | |||
| return prefs.player.scat == true; | |||
| return prefs.scat == true; | |||
| } | |||
| ] | |||
| }); | |||
| @@ -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); | |||