| @@ -122,9 +122,9 @@ function grappleDevour(attacker) { | |||||
| return attacker.description("The") + " tries to swallow you down, but you manage to resist their hunger."; | return attacker.description("The") + " tries to swallow you down, but you manage to resist their hunger."; | ||||
| } | } | ||||
| }, requirements: [ | }, requirements: [ | ||||
| function(attacker, defender) { return isNormal(attacker) && isGrappled(defender); } | |||||
| function(attacker, defender) { return isNormal(attacker) && isGrappled(defender) && defender.flags.shrunk != true; } | |||||
| ], conditions: [ | ], conditions: [ | ||||
| function(prefs, player=false) { return player || prefs.player.prey; } | |||||
| function(attacker, defender) { return defender.prefs.prey; } | |||||
| ], | ], | ||||
| priority: 1, | 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."; | return "Your grasp and shove " + defender.description("the") + ", but they manage to avoid becoming " + attacker.species + " chow."; | ||||
| } | } | ||||
| }, requirements: [ | }, requirements: [ | ||||
| function(attacker, defender) { return isNormal(attacker) && isGrappled(defender); } | |||||
| function(attacker, defender) { return isNormal(attacker) && isGrappled(defender) && defender.flags.shrunk != true ; } | |||||
| ], conditions: [ | ], conditions: [ | ||||
| function(prefs, player=false) { return player || prefs.player.prey; } | |||||
| function(attacker, defender) { return defender.prefs.prey && defender.prefs.analVore; } | |||||
| ], | ], | ||||
| priority: 1, | 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) { | function flee(attacker) { | ||||
| return { | return { | ||||
| name: "Flee", | name: "Flee", | ||||
| @@ -234,7 +274,7 @@ function flee(attacker) { | |||||
| attack: function(defender) { | attack: function(defender) { | ||||
| let success = statCheck(attacker, defender, "dex"); | let success = statCheck(attacker, defender, "dex"); | ||||
| if (success) { | if (success) { | ||||
| attacker.flags.grappled = false; | |||||
| attacker.clear(); | |||||
| changeMode("explore"); | changeMode("explore"); | ||||
| return "You successfully run away."; | return "You successfully run away."; | ||||
| } else { | } else { | ||||
| @@ -265,7 +305,7 @@ function devourPlayer(attacker) { | |||||
| name: "Devours YOU!", | name: "Devours YOU!", | ||||
| desc: "You won't see this", | desc: "You won't see this", | ||||
| conditions: [ | conditions: [ | ||||
| function(prefs) { return prefs.player.prey; } | |||||
| function(attacker, defender) { return defender.prefs.prey; } | |||||
| ], | ], | ||||
| requirements: [ | requirements: [ | ||||
| function(attacker, defender) { return attacker.leering == true; } | function(attacker, defender) { return attacker.leering == true; } | ||||
| @@ -26,16 +26,21 @@ function Geta() { | |||||
| this.struggles = []; | this.struggles = []; | ||||
| this.struggles.push(new rub(this)); | this.struggles.push(new rub(this)); | ||||
| this.prefs.analVore = false; | |||||
| } | } | ||||
| function getaShrink(attacker) { | function getaShrink(attacker) { | ||||
| return { | return { | ||||
| attackPlayer: function(defender) { | attackPlayer: function(defender) { | ||||
| let success = true; | |||||
| let success = Math.random() < 0.5; | |||||
| if (success) { | if (success) { | ||||
| defender.flags.shrunk = true; | 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."; | 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: [ | requirements: [ | ||||
| @@ -55,7 +60,7 @@ function getaGrab(attacker) { | |||||
| }, | }, | ||||
| conditions: [ | conditions: [ | ||||
| function(prefs) { | function(prefs) { | ||||
| return prefs.player.prey; | |||||
| return prefs.prey; | |||||
| } | } | ||||
| ], | ], | ||||
| requirements: [ | requirements: [ | ||||
| @@ -145,12 +145,12 @@ | |||||
| <input type="text" id="character-species" name="species" placeholder="nerd"/> | <input type="text" id="character-species" name="species" placeholder="nerd"/> | ||||
| </li> | </li> | ||||
| <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> | ||||
| <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> | <li> | ||||
| <button type="button" id="start-button">Start</button> | <button type="button" id="start-button">Start</button> | ||||
| </li> | </li> | ||||
| @@ -15,12 +15,6 @@ let playerAttacks = []; | |||||
| let respawnRoom; | let respawnRoom; | ||||
| let prefs = { | |||||
| player: { | |||||
| prey: true | |||||
| } | |||||
| }; | |||||
| function join(things) { | function join(things) { | ||||
| if (things.length == 1) { | if (things.length == 1) { | ||||
| return things[0].description("a"); | return things[0].description("a"); | ||||
| @@ -58,7 +52,7 @@ function pick(list, attacker, defender) { | |||||
| } | } | ||||
| function filterValid(options, 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)); | 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.classList.add("inactive-button"); | ||||
| button.innerHTML = ""; | button.innerHTML = ""; | ||||
| } else { | } 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.disabled = false; | ||||
| button.classList.add("active-button"); | button.classList.add("active-button"); | ||||
| button.innerHTML = currentRoom.exits[i].name; | 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-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-stamina").innerHTML = "Stamina: " + round(player.stamina,0) + "/" + round(player.maxStamina,0); | ||||
| document.getElementById("stat-fullness").innerHTML = "Fullness: " + round(player.fullness(),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); | document.getElementById("stat-bowels").innerHTML = "Bowels: " + round(player.bowels.fullness,0); | ||||
| } else { | } else { | ||||
| document.getElementById("stat-bowels").innerHTML = ""; | document.getElementById("stat-bowels").innerHTML = ""; | ||||
| @@ -252,7 +246,7 @@ function moveTo(room,desc="You go places lol") { | |||||
| currentRoom.objects.forEach(function (object) { | currentRoom.objects.forEach(function (object) { | ||||
| object.actions.forEach(function (action) { | 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); | actions.push(action); | ||||
| }); | }); | ||||
| }); | }); | ||||
| @@ -315,7 +309,7 @@ function applySettings(settings) { | |||||
| if (settings.hasOwnProperty(key)) { | if (settings.hasOwnProperty(key)) { | ||||
| if (key.match(/prefs/)) { | if (key.match(/prefs/)) { | ||||
| let tokens = key.split("-"); | 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,-1).reduce((pref, key) => pref[key], pref); | ||||
| pref[tokens.slice(-1)[0]] = settings[key]; | pref[tokens.slice(-1)[0]] = settings[key]; | ||||
| } | } | ||||
| @@ -396,7 +390,7 @@ function attackClicked(index) { | |||||
| if (player.health <= 0) { | if (player.health <= 0) { | ||||
| update(["You die..."]); | update(["You die..."]); | ||||
| if (prefs.player.prey) { | |||||
| if (player.prefs.prey) { | |||||
| changeMode("eaten"); | changeMode("eaten"); | ||||
| } else { | } else { | ||||
| respawn(respawnRoom); | respawn(respawnRoom); | ||||
| @@ -419,7 +413,7 @@ function struggleClicked(index) { | |||||
| if (result.escape) { | if (result.escape) { | ||||
| changeMode("explore"); | changeMode("explore"); | ||||
| } else { | } else { | ||||
| let digest = pick(filterValid(currentFoe.digests, currentFoe, player), currentFoe, player); | |||||
| let digest = pick(filterValid(currentFoe.digests, FurrentFoe, player), currentFoe, player); | |||||
| if (digest == null) { | if (digest == null) { | ||||
| digest = currentFoe.backupDigest; | digest = currentFoe.backupDigest; | ||||
| @@ -57,7 +57,7 @@ function Toilet() { | |||||
| }, | }, | ||||
| "conditions": [ | "conditions": [ | ||||
| function(prefs) { | 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.clear = function() { | ||||
| this.flags = {}; | this.flags = {}; | ||||
| }; | }; | ||||
| this.prefs = { | |||||
| prey: true, | |||||
| scat: true, | |||||
| analVore: true | |||||
| } | |||||
| } | } | ||||
| function Player(name = "Player") { | function Player(name = "Player") { | ||||
| @@ -56,6 +62,10 @@ function Player(name = "Player") { | |||||
| this.attacks.push(new grappledStruggle(this)); | this.attacks.push(new grappledStruggle(this)); | ||||
| this.attacks.push(new grappledReverse(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.attacks.push(new flee(this)); | ||||
| this.backupAttack = new pass(this); | this.backupAttack = new pass(this); | ||||